Skip to content

Commit

Permalink
[TRA 14644] - Ajout d'Eco-organisme sur BSVHU (#3619)
Browse files Browse the repository at this point in the history
* feat(BSVHU): add support for eco organisme on BSVHU

* fix(BSVHU/BSDA/BSDD/BSDASRI): add/fix ecoorganisme sirenification

* test(BSVHU): add tests for eco-organisme, remove changes on sirenify that where getting infos from EcoOrganisme table (useless)

* fix(BSVHU): refine paths on refinements

* fix(Refinements): make not dormant refinement explicitly for emitters

* feat(Libs): add object creation script

* fix(BSVHU/BSDASRI): fix tests

* fix(BSDs): fix test, make sirenify not overwrite eco organisme name if the company doesn't exist

* fix(BSVHU): fix tests

* fix(Object-creator): change object creator to compile

* docs(Changelog): update Changelog
  • Loading branch information
silto authored Oct 8, 2024
1 parent e4912fd commit 789ef69
Show file tree
Hide file tree
Showing 46 changed files with 727 additions and 153 deletions.
6 changes: 6 additions & 0 deletions CONTRIBUTING.md
Original file line number Diff line number Diff line change
Expand Up @@ -740,6 +740,12 @@ Pour palier à ce problème, il est possible de nourrir la base de donnée Prism
3.2 Dans le container `td-api`: `npx prisma db push --preview-feature` pour recréer les tables
4. Dans le container `td-api`: `npx prisma db seed --preview-feature` pour nourrir la base de données.
### Ajouter un objet spécifique dans la base de données
Au cas où il serait nécessaire d'ajouter un objet à la base de données, vous pouvez utiliser le script "object-creator". Pour celà, modifiez le fichier `libs/back/object-creator/src/objects.ts` en ajoutant des objets en respectant le format démontré en exemple.
Vous pouvez ensuite utiliser `npx nx run object-creator:run` et si tout se passe bien, les objets seront créés dans la base de donnée spécifiée dans la variable d'environnement "DATABASE_URL".
### Ajouter une nouvelle icône
Les icônes utilisées dans l'application front viennent de https://streamlineicons.com/.
Expand Down
4 changes: 4 additions & 0 deletions Changelog.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,10 @@ et le projet suit un schéma de versionning inspiré de [Calendar Versioning](ht

# [2024.10.1] 22/10/2024

#### :rocket: Nouvelles fonctionnalités

- Ajout d'Eco-organisme sur BSVHU [PR 3619](https://github.com/MTES-MCT/trackdechets/pull/3619)

#### :bug: Corrections de bugs

- Documentation API Developers : Page Not Found, si on n'y accède pas via l'arborescence [PR 3621](https://github.com/MTES-MCT/trackdechets/pull/3621)
Expand Down
24 changes: 20 additions & 4 deletions back/src/__tests__/factories.ts
Original file line number Diff line number Diff line change
Expand Up @@ -521,20 +521,36 @@ export const applicationFactory = async (openIdEnabled?: boolean) => {

export const ecoOrganismeFactory = async ({
siret,
handleBsdasri = false
handle,
createAssociatedCompany
}: {
siret?: string;
handleBsdasri?: boolean;
handle?: {
handleBsdasri?: boolean;
handleBsda?: boolean;
handleBsvhu?: boolean;
};
createAssociatedCompany?: boolean;
}) => {
const { handleBsdasri, handleBsda, handleBsvhu } = handle ?? {};
const ecoOrganismeIndex = (await prisma.ecoOrganisme.count()) + 1;
const ecoOrganisme = await prisma.ecoOrganisme.create({
data: {
address: "",
name: `Eco-Organisme ${ecoOrganismeIndex}`,
siret: siret ?? siretify(ecoOrganismeIndex),
handleBsdasri
siret: siret ?? siretify(),
handleBsdasri,
handleBsda,
handleBsvhu
}
});
if (createAssociatedCompany) {
// create the related company so sirenify works as expected
await companyFactory({
siret: ecoOrganisme.siret,
name: `Eco-Organisme ${ecoOrganismeIndex}`
});
}

return ecoOrganisme;
};
Expand Down
5 changes: 4 additions & 1 deletion back/src/__tests__/testWorkflow.ts
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,10 @@ async function testWorkflow(workflow: Workflow) {
});
if (workflowCompany.companyTypes.includes("ECO_ORGANISME")) {
// create ecoOrganisme to allow its user to perform api calls
await ecoOrganismeFactory({ siret: company.siret!, handleBsdasri: true });
await ecoOrganismeFactory({
siret: company.siret!,
handle: { handleBsdasri: true }
});
}
if (
workflowCompany.companyTypes.includes("TRANSPORTER") &&
Expand Down
42 changes: 9 additions & 33 deletions back/src/bsda/validation/refinements.ts
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ import {
Bsda,
BsdaStatus,
BsdaType,
BsdType,
Company,
CompanyType
} from "@prisma/client";
Expand All @@ -26,7 +27,8 @@ import { prisma } from "@td/prisma";
import { isWorker } from "../../companies/validation";
import {
isDestinationRefinement,
isNotDormantRefinement,
isEcoOrganismeRefinement,
isEmitterNotDormantRefinement,
isRegisteredVatNumberRefinement,
isTransporterRefinement,
refineSiretAndGetCompany
Expand Down Expand Up @@ -259,36 +261,6 @@ export const checkRequiredFields: (
};
};

async function refineAndGetEcoOrganisme(siret: string | null | undefined, ctx) {
if (!siret) return null;
const ecoOrganisme = await prisma.ecoOrganisme.findUnique({
where: { siret }
});

if (ecoOrganisme === null) {
ctx.addIssue({
code: z.ZodIssueCode.custom,
message: `L'éco-organisme avec le SIRET ${siret} n'est pas référencé sur Trackdéchets`
});
}

return ecoOrganisme;
}

async function isBsdaEcoOrganismeRefinement(
siret: string | null | undefined,
ctx: RefinementCtx
) {
const ecoOrganisme = await refineAndGetEcoOrganisme(siret, ctx);

if (ecoOrganisme && !ecoOrganisme?.handleBsda) {
ctx.addIssue({
code: z.ZodIssueCode.custom,
message: `L'éco-organisme avec le SIRET ${siret} n'est pas autorisé à apparaitre sur un BSDA`
});
}
}

async function checkEmitterIsNotEcoOrganisme(
siret: string | null | undefined,
ctx: RefinementCtx
Expand Down Expand Up @@ -327,7 +299,7 @@ export const checkCompanies: Refinement<ParsedZodBsda> = async (
);
};

await isNotDormantRefinement(bsda.emitterCompanySiret, zodContext);
await isEmitterNotDormantRefinement(bsda.emitterCompanySiret, zodContext);
await isDestinationRefinement(
bsda.destinationCompanySiret,
zodContext,
Expand Down Expand Up @@ -355,7 +327,11 @@ export const checkCompanies: Refinement<ParsedZodBsda> = async (
);
}
await isWorkerRefinement(bsda.workerCompanySiret, zodContext);
await isBsdaEcoOrganismeRefinement(bsda.ecoOrganismeSiret, zodContext);
await isEcoOrganismeRefinement(
bsda.ecoOrganismeSiret,
BsdType.BSDA,
zodContext
);
await checkEmitterIsNotEcoOrganisme(bsda.emitterCompanySiret, zodContext);
};

Expand Down
74 changes: 50 additions & 24 deletions back/src/bsda/validation/sirenify.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,9 @@
import { ParsedZodBsda, ParsedZodBsdaTransporter } from "./schema";
import { CompanyInput } from "../../generated/graphql/types";
import { nextBuildSirenify } from "../../companies/sirenify";
import {
nextBuildSirenify,
NextCompanyInputAccessor
} from "../../companies/sirenify";
import { getSealedFields } from "./rules";
import {
BsdaValidationContext,
Expand All @@ -11,58 +14,81 @@ import {
const sirenifyBsdaAccessors = (
bsda: ParsedZodBsda,
sealedFields: string[] // Tranformations should not be run on sealed fields
) => [
): NextCompanyInputAccessor<ParsedZodBsda>[] => [
{
siret: bsda?.emitterCompanySiret,
skip: sealedFields.includes("emitterCompanySiret"),
setter: (input, companyInput: CompanyInput) => {
setter: (input, companyInput) => {
input.emitterCompanyName = companyInput.name;
input.emitterCompanyAddress = companyInput.address;
}
},
{
siret: bsda?.destinationCompanySiret,
skip: sealedFields.includes("destinationCompanySiret"),
setter: (input, companyInput: CompanyInput) => {
setter: (input, companyInput) => {
input.destinationCompanyName = companyInput.name;
input.destinationCompanyAddress = companyInput.address;
}
},
{
siret: bsda?.workerCompanySiret,
skip: sealedFields.includes("workerCompanySiret"),
setter: (input, companyInput: CompanyInput) => {
setter: (input, companyInput) => {
input.workerCompanyName = companyInput.name;
input.workerCompanyAddress = companyInput.address;
}
},
{
siret: bsda?.brokerCompanySiret,
skip: sealedFields.includes("brokerCompanySiret"),
setter: (input, companyInput: CompanyInput) => {
setter: (input, companyInput) => {
input.brokerCompanyName = companyInput.name;
input.brokerCompanyAddress = companyInput.address;
}
},
...(bsda.intermediaries ?? []).map((_, idx) => ({
siret: bsda.intermediaries![idx].siret,
skip: sealedFields.includes("intermediaries"),
setter: (input, companyInput: CompanyInput) => {
const intermediary = input.intermediaries[idx];
intermediary.name = companyInput.name;
intermediary.address = companyInput.address;
}
})),
...(bsda.transporters ?? []).map((_, idx) => ({
siret: bsda.transporters![idx].transporterCompanySiret,
// FIXME skip conditionnaly based on transporter signatures
skip: false,
setter: (input, companyInput: CompanyInput) => {
const transporter = input.transporters[idx];
transporter.transporterCompanyName = companyInput.name;
transporter.transporterCompanyAddress = companyInput.address;
{
siret: bsda?.ecoOrganismeSiret,
skip: sealedFields.includes("ecoOrganismeSiret"),
setter: (input, companyInput) => {
if (companyInput.name) {
input.ecoOrganismeName = companyInput.name;
}
}
}))
},
...(bsda.intermediaries ?? []).map(
(_, idx) =>
({
siret: bsda.intermediaries![idx].siret,
skip: sealedFields.includes("intermediaries"),
setter: (input, companyInput) => {
const intermediary = input.intermediaries![idx];
if (companyInput.name) {
intermediary!.name = companyInput.name;
}
if (companyInput.address) {
intermediary!.address = companyInput.address;
}
}
} as NextCompanyInputAccessor<ParsedZodBsda>)
),
...(bsda.transporters ?? []).map(
(_, idx) =>
({
siret: bsda.transporters![idx].transporterCompanySiret,
// FIXME skip conditionnaly based on transporter signatures
skip: false,
setter: (input, companyInput) => {
const transporter = input.transporters![idx];
if (companyInput.name) {
transporter!.transporterCompanyName = companyInput.name;
}
if (companyInput.address) {
transporter!.transporterCompanyAddress = companyInput.address;
}
}
} as NextCompanyInputAccessor<ParsedZodBsda>)
)
];

export const sirenifyBsda: (
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -129,7 +129,9 @@ describe("Mutation.createDasri", () => {
]);
});
it("create a dasri with an eco-organisme (eco-org user)", async () => {
const ecoOrg = await ecoOrganismeFactory({ handleBsdasri: true });
const ecoOrg = await ecoOrganismeFactory({
handle: { handleBsdasri: true }
});
const { user } = await userWithCompanyFactory("MEMBER", {
siret: ecoOrg.siret
});
Expand Down Expand Up @@ -178,7 +180,9 @@ describe("Mutation.createDasri", () => {
expect(data.createBsdasri.ecoOrganisme?.siret).toEqual(ecoOrg.siret);
});
it("create a dasri with an eco-organisme and an unregistered emitter(eco-org user)", async () => {
const ecoOrg = await ecoOrganismeFactory({ handleBsdasri: true });
const ecoOrg = await ecoOrganismeFactory({
handle: { handleBsdasri: true }
});
const { user } = await userWithCompanyFactory("MEMBER", {
siret: ecoOrg.siret
});
Expand Down Expand Up @@ -229,7 +233,9 @@ describe("Mutation.createDasri", () => {
expect(data.createBsdasri.emitter?.company?.siret).toEqual(siret);
});
it("create a dasri with an eco-organism (emitter user)", async () => {
const ecoOrg = await ecoOrganismeFactory({ handleBsdasri: true });
const ecoOrg = await ecoOrganismeFactory({
handle: { handleBsdasri: true }
});
const { company: ecoOrgCompany } = await userWithCompanyFactory("MEMBER", {
siret: ecoOrg.siret
});
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -323,7 +323,9 @@ describe("Mutation.updateBsdasri", () => {

it("should allow eco organisme fields update for INITIAL bsdasris", async () => {
const { user, company } = await userWithCompanyFactory("MEMBER");
const ecoOrg = await ecoOrganismeFactory({ handleBsdasri: true });
const ecoOrg = await ecoOrganismeFactory({
handle: { handleBsdasri: true }
});
const { company: ecoOrgCompany } = await userWithCompanyFactory("MEMBER", {
siret: ecoOrg.siret
});
Expand Down Expand Up @@ -355,7 +357,9 @@ describe("Mutation.updateBsdasri", () => {

it("should allow eco organisme fields nulling for INITIAL bsdasris", async () => {
const { user, company } = await userWithCompanyFactory("MEMBER");
const ecoOrg = await ecoOrganismeFactory({ handleBsdasri: true });
const ecoOrg = await ecoOrganismeFactory({
handle: { handleBsdasri: true }
});
const { company: ecoOrgCompany } = await userWithCompanyFactory("MEMBER", {
siret: ecoOrg.siret
});
Expand Down Expand Up @@ -430,7 +434,9 @@ describe("Mutation.updateBsdasri", () => {
});
it("should disallow eco organisme fields update after emission signature", async () => {
const { user, company } = await userWithCompanyFactory("MEMBER");
const ecoOrg = await ecoOrganismeFactory({ handleBsdasri: true });
const ecoOrg = await ecoOrganismeFactory({
handle: { handleBsdasri: true }
});
const destination = await userWithCompanyFactory("MEMBER");

await userWithCompanyFactory("MEMBER", {
Expand Down
22 changes: 17 additions & 5 deletions back/src/bsdasris/sirenify.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,8 @@
import { Prisma } from "@prisma/client";
import buildSirenify, { nextBuildSirenify } from "../companies/sirenify";
import buildSirenify, {
nextBuildSirenify,
NextCompanyInputAccessor
} from "../companies/sirenify";
import { BsdasriInput, CompanyInput } from "../generated/graphql/types";

const accessors = (input: BsdasriInput) => [
Expand Down Expand Up @@ -31,30 +34,39 @@ export const sirenify = buildSirenify(accessors);
const bsdasriCreateInputAccessors = (
input: Prisma.BsdasriCreateInput,
sealedFields: string[] = [] // Tranformations should not be run on sealed fields
) => [
): NextCompanyInputAccessor<Prisma.BsdasriCreateInput>[] => [
{
siret: input?.emitterCompanySiret,
skip: sealedFields.includes("emitterCompanySiret"),
setter: (input: Prisma.BsdasriCreateInput, companyInput: CompanyInput) => {
setter: (input, companyInput) => {
input.emitterCompanyName = companyInput.name;
input.emitterCompanyAddress = companyInput.address;
}
},
{
siret: input?.transporterCompanySiret,
skip: sealedFields.includes("transporterCompanySiret"),
setter: (input: Prisma.BsdasriCreateInput, companyInput: CompanyInput) => {
setter: (input, companyInput) => {
input.transporterCompanyName = companyInput.name;
input.transporterCompanyAddress = companyInput.address;
}
},
{
siret: input?.destinationCompanySiret,
skip: sealedFields.includes("destinationCompanySiret"),
setter: (input: Prisma.BsdasriCreateInput, companyInput: CompanyInput) => {
setter: (input, companyInput) => {
input.destinationCompanyName = companyInput.name;
input.destinationCompanyAddress = companyInput.address;
}
},
{
siret: input?.ecoOrganismeSiret,
skip: sealedFields.includes("ecoOrganismeSiret"),
setter: (input, companyInput) => {
if (companyInput.name) {
input.ecoOrganismeName = companyInput.name;
}
}
}
];

Expand Down
Loading

0 comments on commit 789ef69

Please sign in to comment.