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..ae0d5ef 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,16 @@ 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 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 } + */ + .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 +}