Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[TRA-15631] La révision du BSDA permet de modifier le CAP de l'exutoire #3932

Merged
merged 6 commits into from
Jan 30, 2025
Merged
Show file tree
Hide file tree
Changes from 5 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
16 changes: 15 additions & 1 deletion back/src/bsda/repository/revisionRequest/accept.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import {
Bsda,
BsdaRevisionRequest,
BsdaRevisionRequestApproval,
BsdaStatus,
Expand Down Expand Up @@ -144,6 +145,7 @@ export function buildAcceptRevisionRequestApproval(
}

async function getUpdateFromRevisionRequest(
bsdaBeforeRevision: Bsda,
revisionRequest: BsdaRevisionRequest,
prisma: PrismaTransaction
) {
Expand All @@ -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:
Expand Down Expand Up @@ -254,6 +267,7 @@ export async function approveAndApplyRevisionRequest(
where: { id: updatedRevisionRequest.bsdaId }
});
const updateData = await getUpdateFromRevisionRequest(
bsdaBeforeRevision,
updatedRevisionRequest,
prisma
);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,14 +3,18 @@ import type {
Mutation,
MutationCreateBsdaRevisionRequestArgs
} from "@td/codegen-back";
import { userWithCompanyFactory } from "../../../../../__tests__/factories";
import {
companyFactory,
userWithCompanyFactory
} from "../../../../../__tests__/factories";
import makeClient from "../../../../../__tests__/testClient";
import { bsdaFactory } from "../../../../__tests__/factories";
import {
CANCELLABLE_BSDA_STATUSES,
NON_CANCELLABLE_BSDA_STATUSES
} from "../createRevisionRequest";
import { BsdaStatus } from "@prisma/client";
import { prisma } from "@td/prisma";

const CREATE_BSDA_REVISION_REQUEST = `
mutation CreateBsdaRevisionRequest($input: CreateBsdaRevisionRequestInput!) {
Expand All @@ -21,6 +25,7 @@ const CREATE_BSDA_REVISION_REQUEST = `
}
content {
waste { code }
destination { cap }
}
authoringCompany {
siret
Expand Down Expand Up @@ -349,6 +354,7 @@ describe("Mutation.createBsdaRevisionRequest", () => {
});

expect(data.createBsdaRevisionRequest.content).toEqual({
destination: null,
waste: { code: "16 01 11*" }
});
});
Expand Down Expand Up @@ -795,4 +801,92 @@ describe("Mutation.createBsdaRevisionRequest", () => {
"Vous devez saisir la description du conditionnement quand le type de conditionnement est 'Autre'"
);
});

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<Mutation, "createBsdaRevisionRequest">,
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<Mutation, "createBsdaRevisionRequest">,
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");
});
});
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
import { resetDatabase } from "../../../../../../integration-tests/helper";
import {
companyAssociatedToExistingUserFactory,
companyFactory,
userWithCompanyFactory
} from "../../../../../__tests__/factories";
import makeClient from "../../../../../__tests__/testClient";
Expand Down Expand Up @@ -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<Mutation, "submitBsdaRevisionRequestApproval">,
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<Mutation, "submitBsdaRevisionRequestApproval">,
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"
);
});
});
Original file line number Diff line number Diff line change
Expand Up @@ -315,7 +315,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:
Expand Down
2 changes: 1 addition & 1 deletion back/src/bsda/typeDefs/bsda.inputs.graphql
Original file line number Diff line number Diff line change
Expand Up @@ -427,7 +427,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"
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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)",
Expand Down Expand Up @@ -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
},
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -255,8 +255,11 @@ export function BsdaRequestRevision({ bsda }: Props) {
</RhfReviewableField>

<RhfReviewableField
title="CAP"
value={bsda.destination?.cap}
title="CAP de l'exutoire"
value={
bsda.destination?.operation?.nextDestination?.cap ??
bsda.destination?.cap
}
path="destination.cap"
defaultValue={initialBsdaReview.destination.cap}
>
Expand Down
1 change: 1 addition & 0 deletions libs/back/prisma/src/schema/schema.prisma
Original file line number Diff line number Diff line change
Expand Up @@ -1819,6 +1819,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?
Expand Down
Loading