Skip to content

Commit

Permalink
refacto : create a helpers file for emptypackaging and cleanPackaging…
Browse files Browse the repository at this point in the history
…s function
  • Loading branch information
benoitguigal committed Feb 10, 2025
1 parent 29ec5b9 commit a23133a
Show file tree
Hide file tree
Showing 10 changed files with 104 additions and 44 deletions.
14 changes: 14 additions & 0 deletions back/src/forms/__tests__/validation.integration.ts
Original file line number Diff line number Diff line change
Expand Up @@ -1702,6 +1702,20 @@ describe("draftFormSchema", () => {
);
});

it.each([-1, 0])(
"should not validate when packaging volume is %p (not strictly positive)",
async volume => {
const validateFn = () =>
draftFormSchema.validate({
wasteDetailsPackagingInfos: [{ type: "FUT", weight: 1, volume }]
});

await expect(validateFn()).rejects.toThrow(
"Le volume doit être un nombre positif"
);
}
);

it("should not be valid when passing eco-organisme as emitter", async () => {
const ecoOrganisme = await ecoOrganismeFactory({
siret: siretify(),
Expand Down
8 changes: 7 additions & 1 deletion back/src/forms/validation.ts
Original file line number Diff line number Diff line change
Expand Up @@ -688,7 +688,13 @@ export const packagingInfoFn = ({
"Le nombre de benne ou de citerne ne peut être supérieur à 2."
)
: schema
)
),
volume: yup
.number()
.optional()
.nullable()
.moreThan(0, "Le volume doit être un nombre positif"),
identificationNumbers: yup.array(yup.string()).optional().notRequired()
});

const parcelCommonInfos = yup
Expand Down
2 changes: 1 addition & 1 deletion front/src/Apps/common/utils/packagingsBsddSummary.ts
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,7 @@ export function getPackagingInfosSummary(packagingInfos: PackagingInfo[]) {
summary += ` de ${packagingInfo.volume} ${volumeUnit}`;
}

if (packagingInfo.identificationNumbers) {
if (packagingInfo.identificationNumbers?.length) {
summary += ` (n° ${packagingInfo.identificationNumbers.join(", ")})`;
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@ import { useEffect } from "react";
import { getTransportModeLabel } from "../../../../constants";
import { getFormWasteDetailsADRMention } from "@td/constants";
import PackagingList from "../../../../../form/bsdd/components/packagings/PackagingList";
import { emptyPackaging } from "../../../../../form/bsdd/components/packagings/helpers";

interface FormWasteTransportSummaryProps {
form: Form;
Expand Down Expand Up @@ -202,7 +203,15 @@ export function FormWasteTransportSummary({
{form.emitter?.type === EmitterType.Appendix1Producer && (
<button
type="button"
onClick={() => addField("packagingInfos")}
onClick={() => {
addField("packagingInfos");
setFieldValue(
"update.packagingInfos",
form.wasteDetails?.packagingInfos?.length
? form.wasteDetails?.packagingInfos
: [emptyPackaging]
);
}}
className="tw-ml-2"
>
<IconPaperWrite color="blue" />
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,10 @@ import SignatureCodeInput from "../../../../../form/common/components/custom-inp
import DateInput from "../../../../../form/common/components/custom-inputs/DateInput";
import { subMonths } from "date-fns";
import { GET_FORM } from "../../../../../Apps/common/queries/bsdd/queries";
import {
cleanPackagings,
emptyPackaging
} from "../../../../../form/bsdd/components/packagings/helpers";

interface SignEmissionFormModalProps {
title: string;
Expand Down Expand Up @@ -114,23 +118,12 @@ function SignEmissionFormModalContent({
emittedByType: EmitterType.Emitter,
securityCode: "",
emitter: { type: form?.emitter?.type },
...(form.status === FormStatus.Resealed
? {
packagingInfos:
form.temporaryStorageDetail?.wasteDetails?.packagingInfos,
quantity: form.temporaryStorageDetail?.wasteDetails?.quantity ?? 0,
onuCode: form.temporaryStorageDetail?.wasteDetails?.onuCode ?? "",
transporterNumberPlate:
form.temporaryStorageDetail?.transporter?.numberPlate ?? ""
}
: {
packagingInfos: form.wasteDetails?.packagingInfos?.length
? form.wasteDetails?.packagingInfos
: [{ type: "", quantity: "", volume: "" }],
quantity: form.wasteDetails?.quantity ?? 0,
onuCode: form.wasteDetails?.onuCode ?? "",
transporterNumberPlate: form.transporter?.numberPlate ?? ""
})
packagingInfos: form.wasteDetails?.packagingInfos?.length
? form.wasteDetails?.packagingInfos
: [emptyPackaging],
quantity: form.wasteDetails?.quantity ?? 0,
onuCode: form.wasteDetails?.onuCode ?? "",
transporterNumberPlate: form.transporter?.numberPlate ?? ""
};

const handlesubmit = async values => {
Expand All @@ -141,7 +134,7 @@ function SignEmissionFormModalContent({
input: {
quantity: values.quantity,
onuCode: values.onuCode,
packagingInfos: values.packagingInfos,
packagingInfos: cleanPackagings(values.packagingInfos),
transporterNumberPlate: values.transporterNumberPlate,
emittedAt: values.emittedAt,
emittedBy: values.emittedBy,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,10 @@ import {
GET_FORM,
UPDATE_FORM
} from "../../../../../Apps/common/queries/bsdd/queries";
import {
cleanPackagings,
emptyPackaging
} from "../../../../../form/bsdd/components/packagings/helpers";

const validationSchema = yup.object({
takenOverAt: yup.date().required("La date de prise en charge est requise"),
Expand Down Expand Up @@ -141,19 +145,18 @@ export default function SignTransportFormModalContent({
update: {
quantity: form.wasteDetails?.quantity ?? 0,
sampleNumber: form.wasteDetails?.sampleNumber ?? "",
packagingInfos: form.wasteDetails?.packagingInfos?.length
? form.wasteDetails?.packagingInfos
: [{ type: "", quantity: "", volume: "" } as any]
packagingInfos: form.wasteDetails?.packagingInfos ?? []
}
}}
validationSchema={validationSchema}
onSubmit={async values => {
try {
const { update } = values;
const packagingsInfoUpdate = cleanPackagings(update.packagingInfos);
if (
update.sampleNumber ||
(form.emitter?.type === EmitterType.Appendix1Producer &&
(update.quantity || update.packagingInfos.length > 0))
(update.quantity || packagingsInfoUpdate.length > 0))
) {
await updateForm({
variables: {
Expand All @@ -165,7 +168,7 @@ export default function SignTransportFormModalContent({
sampleNumber: update.sampleNumber
}),
...(update.packagingInfos.length > 0 && {
packagingInfos: update.packagingInfos
packagingInfos: packagingsInfoUpdate
})
}
}
Expand Down
15 changes: 2 additions & 13 deletions front/src/form/bsdd/StepList.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,7 @@ import {
GET_FORM,
UPDATE_FORM
} from "../../Apps/common/queries/bsdd/queries";
import { cleanPackagings } from "./components/packagings/helpers";
const GenericStepList = lazy(() => import("../common/stepper/GenericStepList"));
interface Props {
children: (form: Form | undefined) => ReactElement;
Expand Down Expand Up @@ -187,19 +188,7 @@ export default function StepsList(props: Props) {
return;
}

const packagingInfos = (wasteDetails?.packagingInfos ?? [])
.filter(
// Supprime le conditionnement vide par défaut ajouté dans l'état intitial
// Formik si celui-ci n'a pas été complété.
p => !!p.type
)
.map(p => ({
...p,
// Convertit "" vers 0 dans le cas où l'input est laissé vide
quantity: (p.quantity as any) === "" ? Number(p.quantity) : p.quantity,
// Convertit "" vers null dans le cas où l'input est laissé vide
volume: (p.volume as any) === "" ? null : p.volume
}));
const packagingInfos = cleanPackagings(wasteDetails?.packagingInfos ?? []);

const formInput: FormInput = {
...rest,
Expand Down
3 changes: 2 additions & 1 deletion front/src/form/bsdd/WasteInfo.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@ import Alert from "@codegouvfr/react-dsfr/Alert";
import { FormFormikValues } from "./utils/initial-state";
import PackagingList from "./components/packagings/PackagingList";
import { Packagings } from "@td/codegen-ui";
import { emptyPackaging } from "./components/packagings/helpers";

const SOIL_CODES = [
"17 05 03*",
Expand Down Expand Up @@ -190,7 +191,7 @@ export default function WasteInfo({ disabled }) {
onChange={checked => {
const updatedPackagings = checked
? [{ type: Packagings.Pipeline, quantity: 1 }]
: [{ type: "", quantity: "", volume: "" }];
: [emptyPackaging];
setFieldValue("wasteDetails.packagingInfos", updatedPackagings);
}}
/>
Expand Down
47 changes: 47 additions & 0 deletions front/src/form/bsdd/components/packagings/helpers.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
import { PackagingInfoInput, Packagings } from "@td/codegen-ui";

export const emptyPackaging: PackagingInfoInput = {
// On force le typage ici pour pouvoir afficher un champ
// de formulaire vide tout en étant compatible avec l'input
// PackagingInfoInput sur lequel `type` et `quantity` sont des champs requis.
// Il faudra en revanche bien s'assurer d'utiliser la fonction
// `cleanPackagings` ci-dessous avant d'envoyer les données à l'API
// pour éviter des erreurs GraphQL.
type: "" as Packagings,
quantity: "" as any as number
};

/**
* On souhaite que le formulaire de conditionnement s'affiche par défaut
* avec un seul conditionnement dont tous les inputs sont vides. Pour ce faire
* il suffit d'initialiser l'état du formulaire avec la valeur `[emptyPackaging]`.
* Le problème est que si l'utilisateur essaye d'enregistrer le formulaire sans
* avoir modifier les conditionnements on prend les erreurs suivantes :
*
* Variable "$input" got invalid value "" at "input.packagingInfos[0].type"; Value
* "" does not exist in "Packagings" enum.
*
* Variable "$input" got invalid value "" at "input.packagingInfos[0].quantity";
* Int cannot represent non-integer value: ""
*
* Variable "$updateFormInput" got invalid value "" at "input.packagingInfos[0].volume";
* Float cannot represent non numeric value: ""
*
* Il est donc nécessaire de nettoyer les données avant de les envoyer au serveur
*/
export function cleanPackagings(packagings: PackagingInfoInput[]) {
return packagings
.filter(
// Supprime le conditionnement vide par défaut ajouté dans l'état initial
// si celui-ci n'a pas été complété.
p => !!p.type
)
.map(p => ({
...p,
// Convertit "" vers 0 dans le cas où l'input est laissé vide
// car le champ `quantity` est requis sur PackagingInfoInput
quantity: Number(p.quantity),
// Convertit "" vers null dans le cas où l'input est laissé vide
volume: (p.volume as any) === "" ? null : p.volume
}));
}
6 changes: 2 additions & 4 deletions front/src/form/bsdd/utils/initial-state.ts
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ import {
TransportMode
} from "@td/codegen-ui";
import { getInitialCompany } from "../../../Apps/common/data/initialState";
import { emptyPackaging } from "../components/packagings/helpers";

/**
* Computes initial values for trader fields in Formik's form
Expand Down Expand Up @@ -189,10 +190,7 @@ export function getInitialState(f?: Form | null): FormFormikValues {
f?.wasteDetails?.nonRoadRegulationMention ?? null,
packagingInfos: f?.wasteDetails?.packagingInfos?.length
? f.wasteDetails.packagingInfos
: [
// affiche un formulaire de conditionnement vide par défaut
{ type: "", quantity: "", volume: "" } as any
],
: [emptyPackaging],
quantity: f?.wasteDetails?.quantity ?? null,
quantityType: f?.wasteDetails?.quantityType ?? QuantityType.Estimated,
consistence: f?.wasteDetails?.consistence ?? Consistence.Solid,
Expand Down

0 comments on commit a23133a

Please sign in to comment.