From 5a9977356c0049aacd4fdbef8d2b1400989efe76 Mon Sep 17 00:00:00 2001 From: Rafael do Amaral Costa Date: Sun, 7 Sep 2025 20:51:39 -0300 Subject: [PATCH 1/2] feat: report colection point full --- .../controllers/collectionPointController.ts | 15 +++++++++++++ ...3028_add_isFullDate_to_collection_point.ts | 16 ++++++++++++++ backend/src/erros/CollectionPointErros.ts | 2 ++ backend/src/routes/collectionPointRoutes.ts | 13 +++++++++++- .../src/services/collectionPointService.ts | 21 +++++++++++++++++++ backend/src/services/depositService.ts | 9 +++++++- backend/src/types/collectionPoint.ts | 2 +- 7 files changed, 75 insertions(+), 3 deletions(-) create mode 100644 backend/src/database/migrations/20250907223028_add_isFullDate_to_collection_point.ts diff --git a/backend/src/controllers/collectionPointController.ts b/backend/src/controllers/collectionPointController.ts index 9a2aac3..3231ec8 100644 --- a/backend/src/controllers/collectionPointController.ts +++ b/backend/src/controllers/collectionPointController.ts @@ -92,4 +92,19 @@ export default class CollectionPointController { next(e) } } + + /* Reports*/ + + public static async reportGetFullDate(req: Request, res: Response, next: NextFunction) { + try { + const { id } = req.params; + + const ReportData = await CollectionPointService.reportGetFullDate(id); + res.status(HttpCode.OK).json(ReportData); + + } catch (e: any) { + next(e); + } + } + } \ No newline at end of file diff --git a/backend/src/database/migrations/20250907223028_add_isFullDate_to_collection_point.ts b/backend/src/database/migrations/20250907223028_add_isFullDate_to_collection_point.ts new file mode 100644 index 0000000..ef98cde --- /dev/null +++ b/backend/src/database/migrations/20250907223028_add_isFullDate_to_collection_point.ts @@ -0,0 +1,16 @@ +import type { Knex } from "knex"; + + +export async function up(knex: Knex): Promise { + return knex.schema.alterTable("Collection_Point", (table) => { + table.datetime("isFullDate").nullable() + }); +} + + +export async function down(knex: Knex): Promise { + return knex.schema.alterTable("Collection_Point", (table) => { + table.dropColumn("isFullDate"); + }) +} + diff --git a/backend/src/erros/CollectionPointErros.ts b/backend/src/erros/CollectionPointErros.ts index 79288c0..7c6fca4 100644 --- a/backend/src/erros/CollectionPointErros.ts +++ b/backend/src/erros/CollectionPointErros.ts @@ -27,3 +27,5 @@ export class GeocodeError extends HttpError { super({ status: HttpCode.BAD_REQUEST, message }); } } + + diff --git a/backend/src/routes/collectionPointRoutes.ts b/backend/src/routes/collectionPointRoutes.ts index a9187fe..a80b01f 100644 --- a/backend/src/routes/collectionPointRoutes.ts +++ b/backend/src/routes/collectionPointRoutes.ts @@ -28,6 +28,9 @@ collectionPointRouter */ .get("/collectionPoint/:id", AuthMiddleware.ensureAuthenticated, CollectionPointController.getOneCollectionPoint) + + + /** * @route POST /collectionPoint * @description Cria um novo ponto de coleta @@ -51,7 +54,15 @@ collectionPointRouter * @param {Number} id - ID do ponto de coleta * @returns { void } */ - .delete("/collectionPoint/delete/:id", AuthMiddleware.ensureAdmin, CollectionPointController.deleteCollectionPoint); + .delete("/collectionPoint/delete/:id", AuthMiddleware.ensureAdmin, CollectionPointController.deleteCollectionPoint) + /** + * @route GET /report/fullDate/:id + * @description Retorna a ultima data de coleta e a data de quando o ponto ficou + * @param {Number} id - ID do ponto de coleta + * @returns { isFullDate: dateTime , lastCollectionDate:dateTime } + */ + .get("/report/fullDate/:id", AuthMiddleware.ensureAdmin, CollectionPointController.reportGetFullDate) + export default collectionPointRouter; \ No newline at end of file diff --git a/backend/src/services/collectionPointService.ts b/backend/src/services/collectionPointService.ts index 927c00c..c27f1da 100644 --- a/backend/src/services/collectionPointService.ts +++ b/backend/src/services/collectionPointService.ts @@ -129,6 +129,7 @@ export default class CollectionPointService { return `Ponto de Coleta ${collectionPoint.name} atualizado com sucesso.`; } + /** * @method deleteCollectionPoint * @description Remove um ponto de coleta específico pelo ID, se não houver depósitos associados @@ -244,4 +245,24 @@ export default class CollectionPointService { return scheduledTasks; } + + // Reports + + /** + * @description Retorna o campo isFullDate e lastCollectionDate + * + * @returns {Promise >} Retorna o objeto contendo todas as tarefas agendadas + */ + + public static async reportGetFullDate(id: string): Promise { + + const ReportData = await knex("Collection_Point").select("isFullDate,lastCollectionDate").where({id}).first(); + + if(!ReportData) { + throw new CollectionPointNotFound(); + } + + return ReportData; + } + } \ No newline at end of file diff --git a/backend/src/services/depositService.ts b/backend/src/services/depositService.ts index 8bb9418..4a9b9a1 100644 --- a/backend/src/services/depositService.ts +++ b/backend/src/services/depositService.ts @@ -6,6 +6,7 @@ import { CollectionPointNotFound } from '../erros/CollectionPointErros'; import { DepositNotAllowed, DepositNotFoundError, UnauthorizedDepositAccessError } from '../erros/DepositErrors'; import CollectionPointService from './collectionPointService'; import Mailer from './Mailer'; +import { UpdateCollectionPoint } from '../types/collectionPoint'; const knex = DatabaseConnection.getInstance(); @@ -144,16 +145,22 @@ export default class DepositService{ const possibleAmount = collectionPoint.amountSponges + (Number(sumPendentes[0].total) || 0) + + var today = new Date; + if (possibleAmount + amountSponges > collectionPoint.capacitySponges){ // Enviar email pros administradores avisando que alguem tentou registrar o deposito mas nn conseguiu //const mail = new Mailer() //mail.sendMail() + + //atualiza o isFullDate ao sinalizar que o deposito está cheio para um depósito + await knex("Collection_Point").where({ id: collectionPointId }).update({isFullDate : today}); + throw new DepositNotAllowed( `Limite excedido. Tente novamente após a coleta. Espaço disponível: ${collectionPoint.capacitySponges - possibleAmount}`); } - var today = new Date; const deposit: Partial = { id: depositId, collectionPointId, diff --git a/backend/src/types/collectionPoint.ts b/backend/src/types/collectionPoint.ts index b717043..44ab565 100644 --- a/backend/src/types/collectionPoint.ts +++ b/backend/src/types/collectionPoint.ts @@ -18,4 +18,4 @@ export type UpdateCollectionPoint = { lastCollectionDate?: Date; nextCollectionDate?: Date; isInactive?: boolean; -} \ No newline at end of file +} From 32626287b6cde85e58a7d21df15990769c498afb Mon Sep 17 00:00:00 2001 From: Rafael do Amaral Costa Date: Wed, 10 Sep 2025 14:00:54 -0300 Subject: [PATCH 2/2] fix: Comment in GET /report/fullDate/ --- backend/src/routes/collectionPointRoutes.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/backend/src/routes/collectionPointRoutes.ts b/backend/src/routes/collectionPointRoutes.ts index a80b01f..ae0d5ef 100644 --- a/backend/src/routes/collectionPointRoutes.ts +++ b/backend/src/routes/collectionPointRoutes.ts @@ -58,7 +58,8 @@ collectionPointRouter /** * @route GET /report/fullDate/:id - * @description Retorna a ultima data de coleta e a data de quando o ponto ficou + * @description Retorna a ultima data de coleta e a data de quando o ponto ficou cheio. + * @description se isFullDate for null ou menor que o lastcollectionDate significa que o ponto de coleta não ficou cheio * @param {Number} id - ID do ponto de coleta * @returns { isFullDate: dateTime , lastCollectionDate:dateTime } */