Skip to content
22 changes: 15 additions & 7 deletions src/controllers/fichas-tombos-controller.js
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,13 @@ function formataDataSaida(data) {

export default function fichaTomboController(request, response, next) {
const { tombo_id: tomboId } = request.params;
const { qtd } = request.query;
const { qtd, code } = request.query;

if (qtd < 1) {
Promise.reject(new Error('Quantidade inválida'));
} else if (qtd > 3) {
Promise.reject(new Error('Quantidade máxima de 3 itens excedida'));
}

Promise.resolve()
.then(() => {
Expand Down Expand Up @@ -97,7 +103,7 @@ export default function fichaTomboController(request, response, next) {
model: LocalColeta,
include: [
{
required: true,
required: false,
model: Cidade,
include: {
required: true,
Expand All @@ -123,10 +129,11 @@ export default function fichaTomboController(request, response, next) {

const where = {
ativo: true,
hcf: tomboId,
hcf: parseInt(tomboId),
};

return Tombo.findOne({ include, where });
const tombo = Tombo.findOne({ include, where });
return tombo;
})
.then(tombo => {
if (!tombo) {
Expand Down Expand Up @@ -197,9 +204,9 @@ export default function fichaTomboController(request, response, next) {
const coletores = `${tombo.coletore.nome}${tombo.coletor_complementar ? tombo.coletor_complementar.complementares : ''}`;

const localColeta = tombo.local_coleta;
const { cidade } = localColeta;
const { estado } = cidade;
const { pais } = estado;
const cidade = localColeta.cidade || '';
const estado = cidade?.estado || '';
const pais = estado?.pais || '';

const romanos = ['I', 'II', 'III', 'IV', 'V', 'VI', 'VII', 'VIII', 'IX', 'X', 'XI', 'XII'];
const dataTombo = new Date(tombo.data_tombo);
Expand Down Expand Up @@ -252,6 +259,7 @@ export default function fichaTomboController(request, response, next) {
romano_data_identificacao: romanoDataIdentificacao,
romano_data_coleta: romanoDataColeta,
numero_copias: qtd || 1,
codigo_barras_selecionado: code,
};

const caminhoArquivoHtml = path.resolve(__dirname, '../views/ficha-tombo.ejs');
Expand Down
158 changes: 157 additions & 1 deletion src/controllers/locais-coleta-controller.js
Original file line number Diff line number Diff line change
@@ -1,9 +1,11 @@
import pick from '~/helpers/pick';

import BadRequestExeption from '../errors/bad-request-exception';
import models from '../models';
import codigos from '../resources/codigos-http';

const {
Relevo, Solo, Vegetacao, sequelize,
Relevo, Solo, Vegetacao, LocalColeta, Cidade, FaseSucessional, Estado, Pais, sequelize,
} = models;

export const cadastrarSolo = (request, response, next) => {
Expand Down Expand Up @@ -120,4 +122,158 @@ export const buscarVegetacoes = (request, response, next) => {
.catch(next);
};

export const cadastrarLocalColeta = async (request, response, next) => {
try {
const dados = pick(request.body, ['descricao', 'complemento', 'cidade_id', 'fase_sucessional_id']);
const localColeta = await LocalColeta.create(dados);
response.status(201).json(localColeta);
} catch (error) {
next(error);
}
};

export const buscarLocaisColeta = async (request, response, next) => {
try {
const { cidade_id: cidadeId } = request.query;
const { limite, pagina, offset } = request.paginacao;

const where = {};
if (cidadeId) {
where.cidade_id = cidadeId;
}

const { count, rows } = await LocalColeta.findAndCountAll({
where,
include: [
{ model: Cidade,
include: [
{ model: Estado,
include: [
Pais,
],
},
],
},
{ model: FaseSucessional },
],
limit: limite,
offset,
});

response.status(200).json({
metadados: {
total: count,
pagina,
limite,
},
resultado: rows,
});
} catch (error) {
next(error);
}
};

export const buscarLocalColetaPorId = async (request, response, next) => {
try {
const { id } = request.params;

const localColeta = await LocalColeta.findOne({
where: { id },
include: [
{ model: Cidade,
include: [
{ model: Estado,
include: [
Pais,
],
},
],
},
{ model: FaseSucessional },
],
});

if (!localColeta) {
response.status(404).json({
mensagem: 'Local de coleta não encontrado.',
});
return;
}

response.status(200).json(localColeta);
} catch (error) {
next(error);
}
};

export const atualizarLocalColeta = async (request, response, next) => {
try {
const { id } = request.params;
const dados = pick(request.body, ['descricao', 'complemento', 'cidade_id', 'fase_sucessional_id']);

const [updated] = await LocalColeta.update(dados, {
where: { id },
});

if (updated === 0) {
response.status(404).json({
mensagem: 'Local de coleta não encontrado.',
});
return;
}

const localColetaAtualizado = await LocalColeta.findOne({
where: { id },
include: [
{ model: Cidade },
{ model: FaseSucessional },
],
});

response.status(200).json(localColetaAtualizado);
} catch (error) {
next(error);
}
};

export const deletarLocalColeta = async (request, response, next) => {
try {
const { id } = request.params;

const localColeta = await LocalColeta.findOne({
where: { id },
});

if (!localColeta) {
response.status(404).json({
mensagem: 'Local de coleta não encontrado.',
});
return;
}

const { Tombo } = models;
const tombosAssociados = await Tombo.count({
where: {
local_coleta_id: id,
ativo: true,
},
});

if (tombosAssociados > 0) {
response.status(400).json({
mensagem: `Não é possível excluir o local de coleta. Existem ${tombosAssociados} tombo(s) associado(s) a este local.`,
});
return;
}

await LocalColeta.destroy({
where: { id },
});

response.status(204).send();

} catch (error) {
next(error);
}
};
export default {};
Loading