diff --git a/back/src/bsda/repository/revisionRequest/accept.ts b/back/src/bsda/repository/revisionRequest/accept.ts index de7b112d9f..4d2b194a63 100644 --- a/back/src/bsda/repository/revisionRequest/accept.ts +++ b/back/src/bsda/repository/revisionRequest/accept.ts @@ -1,4 +1,5 @@ import { + Bsda, BsdaRevisionRequest, BsdaRevisionRequestApproval, BsdaStatus, @@ -144,6 +145,7 @@ export function buildAcceptRevisionRequestApproval( } async function getUpdateFromRevisionRequest( + bsdaBeforeRevision: Bsda, revisionRequest: BsdaRevisionRequest, prisma: PrismaTransaction ) { @@ -157,13 +159,24 @@ async function getUpdateFromRevisionRequest( revisionRequest.isCanceled ); + const hasTTR = Boolean( + bsdaBeforeRevision.destinationOperationNextDestinationCompanySiret + ); + const result = removeEmpty({ wasteCode: revisionRequest.wasteCode, wastePop: revisionRequest.wastePop, packagings: revisionRequest.packagings, wasteSealNumbers: revisionRequest.wasteSealNumbers, wasteMaterialName: revisionRequest.wasteMaterialName, - destinationCap: revisionRequest.destinationCap, + // Attention, quand on a ajoute un TTR à un bsda il se retrouve dans destinationXXX, + // et l'exutoire est bougé dans destinationOperationNextDestinationXXX + // Les révisions n'autorisent que la modification du CAP de l'exutoire, qui est + // systématiquement dans le champ destinationCAP + destinationCap: hasTTR ? null : revisionRequest.destinationCap, + destinationOperationNextDestinationCap: hasTTR + ? revisionRequest.destinationCap + : null, destinationReceptionWeight: revisionRequest.destinationReceptionWeight, destinationOperationCode: revisionRequest.destinationOperationCode, destinationOperationDescription: @@ -254,6 +267,7 @@ export async function approveAndApplyRevisionRequest( where: { id: updatedRevisionRequest.bsdaId } }); const updateData = await getUpdateFromRevisionRequest( + bsdaBeforeRevision, updatedRevisionRequest, prisma ); diff --git a/back/src/bsda/resolvers/mutations/revisionRequest/__tests__/createRevisionRequest.integration.ts b/back/src/bsda/resolvers/mutations/revisionRequest/__tests__/createRevisionRequest.integration.ts index 92e33f4985..06c419f30a 100644 --- a/back/src/bsda/resolvers/mutations/revisionRequest/__tests__/createRevisionRequest.integration.ts +++ b/back/src/bsda/resolvers/mutations/revisionRequest/__tests__/createRevisionRequest.integration.ts @@ -25,6 +25,7 @@ const CREATE_BSDA_REVISION_REQUEST = ` } content { waste { code } + destination { cap } } authoringCompany { siret @@ -353,6 +354,7 @@ describe("Mutation.createBsdaRevisionRequest", () => { }); expect(data.createBsdaRevisionRequest.content).toEqual({ + destination: null, waste: { code: "16 01 11*" } }); }); @@ -862,7 +864,7 @@ describe("Mutation.createBsdaRevisionRequest", () => { }); const { mutate } = makeClient(user); - const { data, errors } = await mutate< + const { errors, data } = await mutate< Pick, MutationCreateBsdaRevisionRequestArgs >(CREATE_BSDA_REVISION_REQUEST, { @@ -886,7 +888,6 @@ describe("Mutation.createBsdaRevisionRequest", () => { } } }); - expect(errors).toBeUndefined(); const revisionRequest = await prisma.bsdaRevisionRequest.findUniqueOrThrow({ @@ -955,4 +956,91 @@ describe("Mutation.createBsdaRevisionRequest", () => { }) ]); }); + + it("creating revision on CAP without TTR > should target exutoire's CAP", async () => { + // Given + const { user, company } = await userWithCompanyFactory("ADMIN"); + const exutoire = await companyFactory(); + const bsda = await bsdaFactory({ + opt: { + emitterCompanySiret: company.siret, + status: "SENT", + // Exutoire + destinationCompanySiret: exutoire.siret, + destinationCap: "EXUTOIRE-CAP" + } + }); + + // When + const { mutate } = makeClient(user); + const { errors, data } = await mutate< + Pick, + MutationCreateBsdaRevisionRequestArgs + >(CREATE_BSDA_REVISION_REQUEST, { + variables: { + input: { + bsdaId: bsda.id, + content: { destination: { cap: "NEW-EXUTOIRE-CAP" } }, + comment: "A comment", + authoringCompanySiret: company.siret! + } + } + }); + + // Then + expect(errors).toBeUndefined(); + expect(data.createBsdaRevisionRequest?.content?.destination?.cap).toBe( + "NEW-EXUTOIRE-CAP" + ); + + const revision = await prisma.bsdaRevisionRequest.findUniqueOrThrow({ + where: { id: data.createBsdaRevisionRequest.id } + }); + expect(revision.initialDestinationCap).toBe("EXUTOIRE-CAP"); + }); + + it("creating revision on CAP with TTR > should target exutoire's CAP", async () => { + // Given + const { user, company } = await userWithCompanyFactory("ADMIN"); + const exutoire = await companyFactory(); + const ttr = await companyFactory(); + const bsda = await bsdaFactory({ + opt: { + emitterCompanySiret: company.siret, + status: "SENT", + // TTR + destinationCompanySiret: ttr.siret, + destinationCap: "TTR-CAP", + // Exutoire + destinationOperationNextDestinationCompanySiret: exutoire.siret, + destinationOperationNextDestinationCap: "EXUTOIRE-CAP" + } + }); + + // When + const { mutate } = makeClient(user); + const { errors, data } = await mutate< + Pick, + MutationCreateBsdaRevisionRequestArgs + >(CREATE_BSDA_REVISION_REQUEST, { + variables: { + input: { + bsdaId: bsda.id, + content: { destination: { cap: "NEW-EXUTOIRE-CAP" } }, + comment: "A comment", + authoringCompanySiret: company.siret! + } + } + }); + // Then + expect(errors).toBeUndefined(); + expect(data.createBsdaRevisionRequest?.content?.destination?.cap).toBe( + "NEW-EXUTOIRE-CAP" + ); + + const revision = await prisma.bsdaRevisionRequest.findUniqueOrThrow({ + where: { id: data.createBsdaRevisionRequest.id } + }); + expect(revision.initialDestinationCap).toBe("EXUTOIRE-CAP"); + }); }); diff --git a/back/src/bsda/resolvers/mutations/revisionRequest/__tests__/submitRevisionRequestApproval.integration.ts b/back/src/bsda/resolvers/mutations/revisionRequest/__tests__/submitRevisionRequestApproval.integration.ts index ab2423a19e..c697d6ca2b 100644 --- a/back/src/bsda/resolvers/mutations/revisionRequest/__tests__/submitRevisionRequestApproval.integration.ts +++ b/back/src/bsda/resolvers/mutations/revisionRequest/__tests__/submitRevisionRequestApproval.integration.ts @@ -1,6 +1,7 @@ import { resetDatabase } from "../../../../../../integration-tests/helper"; import { companyAssociatedToExistingUserFactory, + companyFactory, userWithCompanyFactory } from "../../../../../__tests__/factories"; import makeClient from "../../../../../__tests__/testClient"; @@ -1076,4 +1077,104 @@ describe("Mutation.submitBsdaRevisionRequestApproval", () => { expect(updatedInitialBsda.finalOperations).toHaveLength(1); } ); + + it("should be able to update the exutoire's CAP (no TTR)", async () => { + // Given + const { company: companyOfSomeoneElse } = await userWithCompanyFactory( + "ADMIN" + ); + const { user, company } = await userWithCompanyFactory("ADMIN"); + const exutoire = await companyFactory(); + + const bsda = await bsdaFactory({ + opt: { + emitterCompanySiret: companyOfSomeoneElse.siret, + // Exutoire" + destinationCompanySiret: exutoire.siret, + destinationCap: "EXUTOIRE-CAP" + } + }); + + const revisionRequest = await prisma.bsdaRevisionRequest.create({ + data: { + bsdaId: bsda.id, + authoringCompanyId: companyOfSomeoneElse.id, + approvals: { create: { approverSiret: company.siret! } }, + destinationCap: "NEW-EXUTOIRE-CAP", + comment: "" + } + }); + + // When + const { mutate } = makeClient(user); + await mutate< + Pick, + MutationSubmitBsdaRevisionRequestApprovalArgs + >(SUBMIT_BSDA_REVISION_REQUEST_APPROVAL, { + variables: { + id: revisionRequest.id, + isApproved: true + } + }); + + // Then + const updatedBsda = await prisma.bsda.findUniqueOrThrow({ + where: { id: bsda.id } + }); + + expect(updatedBsda.destinationCap).toBe("NEW-EXUTOIRE-CAP"); + }); + + it("should be able to update the exutoire's CAP (TTR involved)", async () => { + // Given + const { company: companyOfSomeoneElse } = await userWithCompanyFactory( + "ADMIN" + ); + const { user, company } = await userWithCompanyFactory("ADMIN"); + const exutoire = await companyFactory(); + const ttr = await companyFactory(); + + const bsda = await bsdaFactory({ + opt: { + emitterCompanySiret: companyOfSomeoneElse.siret, + // TTR + destinationCompanySiret: ttr.siret, + destinationCap: "TTR-CAP", + // Exutoire + destinationOperationNextDestinationCompanySiret: exutoire.siret, + destinationOperationNextDestinationCap: "EXUTOIRE-CAP" + } + }); + + const revisionRequest = await prisma.bsdaRevisionRequest.create({ + data: { + bsdaId: bsda.id, + authoringCompanyId: companyOfSomeoneElse.id, + approvals: { create: { approverSiret: company.siret! } }, + destinationCap: "NEW-EXUTOIRE-CAP", + comment: "" + } + }); + + // When + const { mutate } = makeClient(user); + await mutate< + Pick, + MutationSubmitBsdaRevisionRequestApprovalArgs + >(SUBMIT_BSDA_REVISION_REQUEST_APPROVAL, { + variables: { + id: revisionRequest.id, + isApproved: true + } + }); + + // Then + const updatedBsda = await prisma.bsda.findUniqueOrThrow({ + where: { id: bsda.id } + }); + + expect(updatedBsda.destinationOperationNextDestinationCap).toBe( + "NEW-EXUTOIRE-CAP" + ); + }); }); diff --git a/back/src/bsda/resolvers/mutations/revisionRequest/createRevisionRequest.ts b/back/src/bsda/resolvers/mutations/revisionRequest/createRevisionRequest.ts index a106eb51d9..cab2d80038 100644 --- a/back/src/bsda/resolvers/mutations/revisionRequest/createRevisionRequest.ts +++ b/back/src/bsda/resolvers/mutations/revisionRequest/createRevisionRequest.ts @@ -335,7 +335,9 @@ function getBsdaHistory(bsda: Bsda) { initialPackagings: bsda.packagings, initialWasteSealNumbers: bsda.wasteSealNumbers, initialWasteMaterialName: bsda.wasteMaterialName, - initialDestinationCap: bsda.destinationCap, + // Attention: on révise le CAP de l'exutoire, jamais du TTR + initialDestinationCap: + bsda.destinationOperationNextDestinationCap ?? bsda.destinationCap, initialDestinationReceptionWeight: bsda.destinationReceptionWeight, initialDestinationOperationCode: bsda.destinationOperationCode, initialDestinationOperationDescription: diff --git a/back/src/bsda/typeDefs/bsda.inputs.graphql b/back/src/bsda/typeDefs/bsda.inputs.graphql index 4f37d23df2..6128b3dd20 100644 --- a/back/src/bsda/typeDefs/bsda.inputs.graphql +++ b/back/src/bsda/typeDefs/bsda.inputs.graphql @@ -433,7 +433,7 @@ input BsdaRevisionRequestEmitterInput { } input BsdaRevisionRequestDestinationInput { - "N° de CAP (le cas échéant)" + "N° de CAP (le cas échéant). Modifie le CAP de l'exutoire même en cas de TTR" cap: String "Expédition reçue à l'installation de destination" diff --git a/front/src/Apps/Dashboard/Components/Revision/revisionMapper.ts b/front/src/Apps/Dashboard/Components/Revision/revisionMapper.ts index e668202ce9..9a1d2ea843 100644 --- a/front/src/Apps/Dashboard/Components/Revision/revisionMapper.ts +++ b/front/src/Apps/Dashboard/Components/Revision/revisionMapper.ts @@ -43,6 +43,7 @@ export enum DataNameEnum { POLLUANTS_ORG = "Présence de polluants organiques persistants", CAP_FINAL_DEST = "CAP (destination finale)", CAP = "CAP", + CAP_EXUTOIRE = "CAP de l'exutoire", SAMPLE_NUMBER = "Numéro d'échantillon", CAP_TEMP_STORAGE = "CAP (entreposage provisoire ou reconditionnement)", QTY_ESTIMATED = "Poids estimé (en tonnes)", @@ -264,7 +265,7 @@ export const mapRevision = ( dataNewValue: review?.content?.temporaryStorageDetail?.destination?.cap }, { - dataName: DataNameEnum.CAP, + dataName: DataNameEnum.CAP_EXUTOIRE, dataOldValue: review?.[bsdName]?.destination?.cap, dataNewValue: review?.content?.destination?.cap }, diff --git a/front/src/Apps/Dashboard/Components/RevisionRequestList/bsda/request/BsdaRequestRevision.tsx b/front/src/Apps/Dashboard/Components/RevisionRequestList/bsda/request/BsdaRequestRevision.tsx index 17ce752f24..f3e05956fa 100644 --- a/front/src/Apps/Dashboard/Components/RevisionRequestList/bsda/request/BsdaRequestRevision.tsx +++ b/front/src/Apps/Dashboard/Components/RevisionRequestList/bsda/request/BsdaRequestRevision.tsx @@ -215,8 +215,11 @@ export function BsdaRequestRevision({ bsda }: Props) { diff --git a/libs/back/prisma/src/schema/schema.prisma b/libs/back/prisma/src/schema/schema.prisma index 91ece788eb..fa262816b7 100644 --- a/libs/back/prisma/src/schema/schema.prisma +++ b/libs/back/prisma/src/schema/schema.prisma @@ -1822,6 +1822,7 @@ model BsdaRevisionRequest { packagings Json? wasteSealNumbers String[] wasteMaterialName String? + // Nouveau CAP de *l'exutoire* (même si le bordereau a un TTR) destinationCap String? destinationReceptionWeight Float? destinationOperationCode String?