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

Export registre transporté #4011

Open
wants to merge 6 commits into
base: dev
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all 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
1 change: 1 addition & 0 deletions Changelog.md
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ et le projet suit un schéma de versionning inspiré de [Calendar Versioning](ht

- Permet l'ajout du volume et des numéros d'identification sur le BSDD partout où le formulaire de conditionnement apparait (création, modification, bordereau suite, signature émetteur/transporteur, révision) & Passage du formulaire conditionnement au DSFR [PR 3936](https://github.com/MTES-MCT/trackdechets/pull/3936).
- Ajout de l'export du registre sortant V2 [PR 3976](https://github.com/MTES-MCT/trackdechets/pull/3976)
- Ajout de l'export du registre transporté V2 [PR 4011](https://github.com/MTES-MCT/trackdechets/pull/4011)
- Ajout d'un paramètre pour les établissements souhaitant pousser automatiquement leurs BSDND dans leurs déclarations [PR3988](https://github.com/MTES-MCT/trackdechets/pull/3988)

#### :nail_care: Breaking Change
Expand Down
304 changes: 300 additions & 4 deletions back/src/bsda/registryV2.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,8 @@
import { IncomingWasteV2, OutgoingWasteV2 } from "@td/codegen-back";
import {
IncomingWasteV2,
OutgoingWasteV2,
TransportedWasteV2
} from "@td/codegen-back";
import {
PrismaClient,
RegistryExportType,
Expand All @@ -11,6 +15,7 @@ import { getTransporterCompanyOrgId } from "@td/constants";
import {
emptyIncomingWasteV2,
emptyOutgoingWasteV2,
emptyTransportedWasteV2,
RegistryV2Bsda
} from "../registryV2/types";
import { splitAddress } from "../common/addresses";
Expand Down Expand Up @@ -223,15 +228,17 @@ export const toIncomingWasteV2 = (
weight: bsda.weightValue
? bsda.weightValue.dividedBy(1000).toDecimalPlaces(6).toNumber()
: null,
quantity: null,
wasteContainsElectricOrHybridVehicles: null,
initialEmitterCompanyName,
initialEmitterCompanySiret,
initialEmitterCompanyAddress,
initialEmitterCompanyPostalCode,
initialEmitterCompanyCity,
initialEmitterCompanyCountry,
initialEmitterMunicipalitiesNames: null,
initialEmitterMunicipalitiesInseeCodes: null,
emitterCompanyIrregularSituation: null,
emitterCompanyType: null,
emitterCompanyName: bsda.emitterCompanyName,
emitterCompanyGivenName: null,
emitterCompanySiret: bsda.emitterCompanySiret,
Expand Down Expand Up @@ -490,6 +497,8 @@ export const toOutgoingWasteV2 = (
wasteCodeBale: null,
wastePop: bsda.wastePop,
wasteIsDangerous: true,
quantity: null,
wasteContainsElectricOrHybridVehicles: null,
weight: bsda.weightValue
? bsda.weightValue.dividedBy(1000).toDecimalPlaces(6).toNumber()
: null,
Expand All @@ -501,9 +510,9 @@ export const toOutgoingWasteV2 = (
initialEmitterCompanyPostalCode,
initialEmitterCompanyCity,
initialEmitterCompanyCountry,
initialEmitterMunicipalitiesNames: null,
initialEmitterMunicipalitiesInseeCodes: null,
emitterCompanyIrregularSituation: null,
emitterCompanyType: null,
emitterCompanySiret: bsda.emitterCompanySiret,
emitterCompanyName: bsda.emitterCompanyName,
emitterCompanyGivenName: null,
Expand Down Expand Up @@ -659,7 +668,263 @@ export const toOutgoingWasteV2 = (
};
};

// TODO toOutgoingWaste mapping
export const toTransportedWasteV2 = (
bsda: RegistryV2Bsda,
targetSiret: string
): Omit<Required<TransportedWasteV2>, "__typename"> | null => {
const transporters = getTransportersSync(bsda);

const [transporter, transporter2, transporter3, transporter4, transporter5] =
transporters;
const targetTransporter = transporters.find(
t => getTransporterCompanyOrgId(t) === targetSiret
);
const transporterTakenOverAt =
targetTransporter?.transporterTransportTakenOverAt ??
targetTransporter?.transporterTransportSignatureDate ?? // in case takenOverAt is null, failover to signature date
transporter?.transporterTransportTakenOverAt ?? // in case we don't find the target transporter, failover to the first transporter
transporter?.transporterTransportSignatureDate;

// there should always be a transporter on this type of export, but since
// the type doesn't know it, and we could get a weird DB state, we check that we have a date
if (!transporterTakenOverAt) {
return null;
}
const {
street: transporter1CompanyAddress,
postalCode: transporter1CompanyPostalCode,
city: transporter1CompanyCity,
country: transporter1CompanyCountry
} = splitAddress(
transporter?.transporterCompanyAddress,
transporter?.transporterCompanyVatNumber
);

const {
street: transporter2CompanyAddress,
postalCode: transporter2CompanyPostalCode,
city: transporter2CompanyCity,
country: transporter2CompanyCountry
} = splitAddress(
transporter2?.transporterCompanyAddress,
transporter2?.transporterCompanyVatNumber
);

const {
street: transporter3CompanyAddress,
postalCode: transporter3CompanyPostalCode,
city: transporter3CompanyCity,
country: transporter3CompanyCountry
} = splitAddress(
transporter3?.transporterCompanyAddress,
transporter3?.transporterCompanyVatNumber
);

const {
street: transporter4CompanyAddress,
postalCode: transporter4CompanyPostalCode,
city: transporter4CompanyCity,
country: transporter4CompanyCountry
} = splitAddress(
transporter4?.transporterCompanyAddress,
transporter4?.transporterCompanyVatNumber
);

const {
street: transporter5CompanyAddress,
postalCode: transporter5CompanyPostalCode,
city: transporter5CompanyCity,
country: transporter5CompanyCountry
} = splitAddress(
transporter5?.transporterCompanyAddress,
transporter5?.transporterCompanyVatNumber
);
const {
street: workerCompanyAddress,
postalCode: workerCompanyPostalCode,
city: workerCompanyCity,
country: workerCompanyCountry
} = splitAddress(bsda.workerCompanyAddress);
const {
street: emitterCompanyAddress,
postalCode: emitterCompanyPostalCode,
city: emitterCompanyCity,
country: emitterCompanyCountry
} = splitAddress(bsda.emitterCompanyAddress);

const {
street: destinationCompanyAddress,
postalCode: destinationCompanyPostalCode,
city: destinationCompanyCity,
country: destinationCompanyCountry
} = splitAddress(bsda.destinationCompanyAddress);

return {
...emptyTransportedWasteV2,
id: bsda.id,
source: "BSD",
publicId: null,
bsdId: bsda.id,
reportAsSiret: null,
createdAt: bsda.createdAt,
updatedAt: bsda.updatedAt,
transporterTakenOverAt,
unloadingDate: null,
destinationReceptionDate: bsda.destinationReceptionDate,
bsdType: "BSDA",
bsdSubType: getBsdaSubType(bsda),
customId: null,
status: bsda.status,
wasteDescription: bsda.wasteMaterialName,
wasteCode: bsda.wasteCode,
wasteCodeBale: null,
wastePop: bsda.wastePop,
wasteIsDangerous: true,
weight: bsda.weightValue
? bsda.weightValue.dividedBy(1000).toDecimalPlaces(6).toNumber()
: null,
quantity: null,
wasteContainsElectricOrHybridVehicles: null,
weightIsEstimate: bsda.weightIsEstimate,
volume: null,

emitterCompanyIrregularSituation: null,
emitterCompanySiret: bsda.emitterCompanySiret,
emitterCompanyName: bsda.emitterCompanyName,
emitterCompanyGivenName: null,
emitterCompanyAddress,
emitterCompanyPostalCode,
emitterCompanyCity,
emitterCompanyCountry,
emitterCompanyMail: bsda.emitterCompanyMail,

emitterPickupsiteName: bsda.emitterPickupSiteName,
emitterPickupsiteAddress: bsda.emitterPickupSiteAddress,
emitterPickupsitePostalCode: bsda.emitterPickupSitePostalCode,
emitterPickupsiteCity: bsda.emitterPickupSiteCity,
emitterPickupsiteCountry: bsda.emitterPickupSiteAddress ? "FR" : null,

workerCompanyName: bsda.workerCompanyName,
workerCompanySiret: bsda.workerCompanySiret,
workerCompanyAddress,
workerCompanyPostalCode,
workerCompanyCity,
workerCompanyCountry,

ecoOrganismeName: bsda.ecoOrganismeName,
ecoOrganismeSiret: bsda.ecoOrganismeSiret,

brokerCompanyName: bsda.brokerCompanyName,
brokerCompanySiret: bsda.brokerCompanySiret,
brokerRecepisseNumber: bsda.brokerRecepisseNumber,
brokerCompanyMail: bsda.brokerCompanyMail,

traderCompanyName: null,
traderCompanySiret: null,
traderRecepisseNumber: null,
traderCompanyMail: null,

transporter1CompanySiret: getTransporterCompanyOrgId(transporter),
transporter1CompanyName: transporter?.transporterCompanyName ?? null,
transporter1CompanyGivenName: null,
transporter1CompanyAddress,
transporter1CompanyPostalCode,
transporter1CompanyCity,
transporter1CompanyCountry,
transporter1RecepisseIsExempted:
transporter?.transporterRecepisseIsExempted,
transporter1RecepisseNumber: transporter?.transporterRecepisseNumber,
transporter1TransportMode: transporter?.transporterTransportMode,
transporter1CompanyMail: transporter?.transporterCompanyMail,
transporter1TransportPlates: transporter?.transporterTransportPlates,
transporter2CompanySiret: getTransporterCompanyOrgId(transporter2),
transporter2CompanyName: transporter2?.transporterCompanyName,
transporter2CompanyGivenName: null,
transporter2CompanyAddress,
transporter2CompanyPostalCode,
transporter2CompanyCity,
transporter2CompanyCountry,
transporter2RecepisseIsExempted:
transporter2?.transporterRecepisseIsExempted,
transporter2RecepisseNumber: transporter2?.transporterRecepisseNumber,
transporter2TransportMode: transporter2?.transporterTransportMode,
transporter2CompanyMail: transporter2?.transporterCompanyMail,
transporter2TransportPlates: transporter2?.transporterTransportPlates,
transporter3CompanySiret: getTransporterCompanyOrgId(transporter3),
transporter3CompanyName: transporter3?.transporterCompanyName,
transporter3CompanyGivenName: null,
transporter3CompanyAddress,
transporter3CompanyPostalCode,
transporter3CompanyCity,
transporter3CompanyCountry,
transporter3RecepisseIsExempted:
transporter3?.transporterRecepisseIsExempted,
transporter3RecepisseNumber: transporter3?.transporterRecepisseNumber,
transporter3TransportMode: transporter3?.transporterTransportMode,
transporter3CompanyMail: transporter3?.transporterCompanyMail,
transporter3TransportPlates: transporter3?.transporterTransportPlates,
transporter4CompanySiret: getTransporterCompanyOrgId(transporter4),
transporter4CompanyName: transporter4?.transporterCompanyName,
transporter4CompanyGivenName: null,
transporter4CompanyAddress,
transporter4CompanyPostalCode,
transporter4CompanyCity,
transporter4CompanyCountry,
transporter4RecepisseIsExempted:
transporter4?.transporterRecepisseIsExempted,
transporter4RecepisseNumber: transporter4?.transporterRecepisseNumber,
transporter4TransportMode: transporter4?.transporterTransportMode,
transporter4CompanyMail: transporter4?.transporterCompanyMail,
transporter4TransportPlates: transporter4?.transporterTransportPlates,
transporter5CompanySiret: getTransporterCompanyOrgId(transporter5),
transporter5CompanyName: transporter5?.transporterCompanyName,
transporter5CompanyGivenName: null,
transporter5CompanyAddress,
transporter5CompanyPostalCode,
transporter5CompanyCity,
transporter5CompanyCountry,
transporter5RecepisseIsExempted:
transporter5?.transporterRecepisseIsExempted,
transporter5RecepisseNumber: transporter5?.transporterRecepisseNumber,
transporter5TransportMode: transporter5?.transporterTransportMode,
transporter5CompanyMail: transporter5?.transporterCompanyMail,
transporter5TransportPlates: transporter5?.transporterTransportPlates,

wasteAdr: bsda.wasteAdr,
nonRoadRegulationMention: null,
destinationCap: bsda.destinationCap,

destinationCompanySiret: bsda.destinationCompanySiret,
destinationCompanyName: bsda.destinationCompanyName,
destinationCompanyGivenName: null,
destinationCompanyAddress,
destinationCompanyPostalCode,
destinationCompanyCity,
destinationCompanyCountry,
destinationCompanyMail: bsda.destinationCompanyMail,

destinationDropSiteAddress: null,
destinationDropSitePostalCode: null,
destinationDropSiteCity: null,
destinationDropSiteCountryCode: null,

destinationReceptionAcceptationStatus:
bsda.destinationReceptionAcceptationStatus,
destinationReceptionWeight: bsda.destinationReceptionWeight
? bsda.destinationReceptionWeight
.dividedBy(1000)
.toDecimalPlaces(6)
.toNumber()
: null,
destinationReceptionAcceptedWeight: null,
destinationReceptionRefusedWeight: null,
destinationHasCiterneBeenWashedOut: null,

declarationNumber: null,
movementNumber: null,
notificationNumber: null
};
};

const minimalBsdaForLookupSelect = {
id: true,
Expand All @@ -673,6 +938,9 @@ const minimalBsdaForLookupSelect = {
select: {
id: true,
number: true,
transporterCompanySiret: true,
transporterCompanyVatNumber: true,
transporterTransportTakenOverAt: true,
transporterTransportSignatureDate: true
}
}
Expand Down Expand Up @@ -724,6 +992,34 @@ const bsdaToLookupCreateInputs = (
});
});
}
const transporterSirets = {};
bsda.transporters?.forEach(transporter => {
const transporterSiret = getTransporterCompanyOrgId(transporter);
if (!transporter.transporterTransportSignatureDate || !transporterSiret) {
return;
}
// we don't want to add the same transporter twice, the lookup index would have a conflict
// + it's not really supposed to happen on real use cases
// + the mapping would show the takenOver date of the first one anyways
if (transporterSirets[transporterSiret]) {
return;
}
transporterSirets[transporterSiret] = true;
res.push({
id: bsda.id,
readableId: bsda.id,
siret: transporterSiret,
exportRegistryType: RegistryExportType.TRANSPORTED,
declarationType: RegistryExportDeclarationType.BSD,
wasteType: RegistryExportWasteType.DD,
wasteCode: bsda.wasteCode,
...generateDateInfos(
transporter.transporterTransportTakenOverAt ??
transporter.transporterTransportSignatureDate!
),
bsdaId: bsda.id
});
});
return res;
};

Expand Down
Loading
Loading