From d1779b10b3e9a22ecb3aa1bbaffbdb0c455569ed Mon Sep 17 00:00:00 2001 From: Benjamin Bohec Date: Thu, 30 Jan 2025 16:09:56 +0100 Subject: [PATCH] fix numberEmployeesRange for AnnuaireDesEntreprisesSiretGateway --- ...eDesEntreprisesSiretGateway.manual.test.ts | 6 +-- .../AnnuaireDesEntreprisesSiretGateway.ts | 51 ++---------------- ...ireDesEntreprisesSiretGateway.unit.test.ts | 2 +- .../core/sirene/adapters/InseeSiretGateway.ts | 52 ++----------------- .../sirene/adapters/SiretGateway.common.ts | 49 +++++++++++++++++ 5 files changed, 61 insertions(+), 99 deletions(-) create mode 100644 back/src/domains/core/sirene/adapters/SiretGateway.common.ts diff --git a/back/src/domains/core/sirene/adapters/AnnuaireDesEntreprisesSiretGateway.manual.test.ts b/back/src/domains/core/sirene/adapters/AnnuaireDesEntreprisesSiretGateway.manual.test.ts index 32d701c550..5361dbb6dd 100644 --- a/back/src/domains/core/sirene/adapters/AnnuaireDesEntreprisesSiretGateway.manual.test.ts +++ b/back/src/domains/core/sirene/adapters/AnnuaireDesEntreprisesSiretGateway.manual.test.ts @@ -65,7 +65,7 @@ describe("AnnuaireDesEntreprisesSiretGateway", () => { code: "9103Z", nomenclature: "NAFRev2", }, - numberEmployeesRange: "50-99", + numberEmployeesRange: "2000-4999", siret: "18004623700012", }); }); @@ -156,7 +156,7 @@ describe("AnnuaireDesEntreprisesSiretGateway", () => { expect(establishment?.businessName).toBe( "MUTUELLE ASSURANCE INSTITUTEUR FRANCE (MAIF)", ); - expect(establishment).toEqual({ + expectToEqual(establishment, { businessAddress: "200 AVENUE SALVADOR ALLENDE 79000 NIORT", businessName: "MUTUELLE ASSURANCE INSTITUTEUR FRANCE (MAIF)", isOpen: true, @@ -164,7 +164,7 @@ describe("AnnuaireDesEntreprisesSiretGateway", () => { code: "6512Z", nomenclature: "NAFRev2", }, - numberEmployeesRange: "50-99", + numberEmployeesRange: "5000-9999", siret: "77570970201646", }); }); diff --git a/back/src/domains/core/sirene/adapters/AnnuaireDesEntreprisesSiretGateway.ts b/back/src/domains/core/sirene/adapters/AnnuaireDesEntreprisesSiretGateway.ts index 12345d46b1..84759ad5bd 100644 --- a/back/src/domains/core/sirene/adapters/AnnuaireDesEntreprisesSiretGateway.ts +++ b/back/src/domains/core/sirene/adapters/AnnuaireDesEntreprisesSiretGateway.ts @@ -1,11 +1,12 @@ import Bottleneck from "bottleneck"; import { SiretDto, SiretEstablishmentDto } from "shared"; import { HttpClient } from "shared-routes"; -import { SiretGateway } from "../ports/SirenGateway"; +import { SiretGateway } from "../ports/SiretGateway"; import { AnnuaireDesEntreprisesSiretEstablishment, type AnnuaireDesEntreprisesSiretRoutes, } from "./AnnuaireDesEntreprisesSiretGateway.routes"; +import { getNumberEmployeesRangeByTefenCode } from "./SiretGateway.common"; const adeMaxQueryPerSeconds = 7; export const nonDiffusibleEstablishmentName = "NON-DIFFUSIBLE"; @@ -92,53 +93,9 @@ export const convertAdeEstablishmentToSirenEstablishmentDto = ( ).replace(".", ""), nomenclature: "NAFRev2", }, - numberEmployeesRange: getNumberEmployeesRange( - adeEstablishment.tranche_effectif_salarie - ? parseInt(adeEstablishment.tranche_effectif_salarie) - : null, + numberEmployeesRange: getNumberEmployeesRangeByTefenCode( + adeEstablishment.tranche_effectif_salarie ?? undefined, ), isOpen: adeEstablishment.matching_etablissements[0].etat_administratif === "A", }); - -const numberEmployeesRanges = [ - "", - "0", - "1-2", - "3-5", - "6-9", - "10-19", - "20-49", - "50-99", - "100-199", - "200-249", - "250-499", - "500-999", - "1000-1999", - "2000-4999", - "5000-9999", - "+10000", -] as const; -type NumberEmployeesRange = (typeof numberEmployeesRanges)[number]; - -const getNumberEmployeesRange = ( - numberEmployees: number | null, -): NumberEmployeesRange => { - if (numberEmployees === null) return ""; - if (numberEmployees === 0) return "0"; - if (numberEmployees === 1 || numberEmployees === 2) return "1-2"; - if (numberEmployees >= 3 && numberEmployees <= 5) return "3-5"; - if (numberEmployees >= 6 && numberEmployees <= 9) return "6-9"; - if (numberEmployees >= 10 && numberEmployees <= 19) return "10-19"; - if (numberEmployees >= 20 && numberEmployees <= 49) return "20-49"; - if (numberEmployees >= 50 && numberEmployees <= 99) return "50-99"; - if (numberEmployees >= 100 && numberEmployees <= 199) return "100-199"; - if (numberEmployees >= 200 && numberEmployees <= 249) return "200-249"; - if (numberEmployees >= 250 && numberEmployees <= 499) return "250-499"; - if (numberEmployees >= 500 && numberEmployees <= 999) return "500-999"; - if (numberEmployees >= 1000 && numberEmployees <= 1999) return "1000-1999"; - if (numberEmployees >= 2000 && numberEmployees <= 4999) return "2000-4999"; - if (numberEmployees >= 5000 && numberEmployees <= 9999) return "5000-9999"; - if (numberEmployees >= 10000) return "+10000"; - return ""; -}; diff --git a/back/src/domains/core/sirene/adapters/AnnuaireDesEntreprisesSiretGateway.unit.test.ts b/back/src/domains/core/sirene/adapters/AnnuaireDesEntreprisesSiretGateway.unit.test.ts index e89a270b5b..e2c868c341 100644 --- a/back/src/domains/core/sirene/adapters/AnnuaireDesEntreprisesSiretGateway.unit.test.ts +++ b/back/src/domains/core/sirene/adapters/AnnuaireDesEntreprisesSiretGateway.unit.test.ts @@ -13,7 +13,7 @@ const validEstablishment: AnnuaireDesEntreprisesSiretEstablishment = { etat_administratif: "A", }, ], - tranche_effectif_salarie: "1", + tranche_effectif_salarie: "01", siege: { activite_principale: "78.3Z", }, diff --git a/back/src/domains/core/sirene/adapters/InseeSiretGateway.ts b/back/src/domains/core/sirene/adapters/InseeSiretGateway.ts index 6b65212925..5a6d61f6a4 100644 --- a/back/src/domains/core/sirene/adapters/InseeSiretGateway.ts +++ b/back/src/domains/core/sirene/adapters/InseeSiretGateway.ts @@ -2,7 +2,6 @@ import Bottleneck from "bottleneck"; import { format, formatISO } from "date-fns"; import { NafDto, - NumberEmployeesRange, OmitFromExistingKeys, SiretDto, SiretEstablishmentDto, @@ -22,6 +21,7 @@ import { RetryStrategy } from "../../retry-strategy/ports/RetryStrategy"; import { TimeGateway } from "../../time-gateway/ports/TimeGateway"; import { SiretGateway } from "../ports/SiretGateway"; import { InseeExternalRoutes } from "./InseeSiretGateway.routes"; +import { getNumberEmployeesRangeByTefenCode } from "./SiretGateway.common"; const logger = createLogger(__filename); @@ -305,7 +305,9 @@ export const convertSirenRawEstablishmentToSirenEstablishmentDto = ( businessName: getBusinessName(siretEstablishment), businessAddress: getFormattedAddress(siretEstablishment), nafDto: getNafAndNomenclature(siretEstablishment), - numberEmployeesRange: getNumberEmployeesRange(siretEstablishment), + numberEmployeesRange: getNumberEmployeesRangeByTefenCode( + siretEstablishment.uniteLegale.trancheEffectifsUniteLegale, + ), isOpen: getIsActive(siretEstablishment), }); @@ -363,49 +365,3 @@ const getIsActive = ({ lastPeriod.etatAdministratifEtablissement === "A" ); }; - -const getNumberEmployeesRange = ({ - uniteLegale, -}: InseeApiRawEstablishment): NumberEmployeesRange => { - const tefenCode = uniteLegale.trancheEffectifsUniteLegale; - if (!tefenCode || tefenCode === "NN") return ""; - return employeeRangeByTefenCode[+tefenCode]; -}; - -// tefenCode is a French standard code for the number of employees in a company. -type TefenCode = - | -1 - | 0 - | 1 - | 2 - | 3 - | 11 - | 12 - | 21 - | 22 - | 31 - | 32 - | 41 - | 42 - | 51 - | 52 - | 53; - -const employeeRangeByTefenCode: Record = { - [-1]: "", - [0]: "0", - [1]: "1-2", - [2]: "3-5", - [3]: "6-9", - [11]: "10-19", - [12]: "20-49", - [21]: "50-99", - [22]: "100-199", - [31]: "200-249", - [32]: "250-499", - [41]: "500-999", - [42]: "1000-1999", - [51]: "2000-4999", - [52]: "5000-9999", - [53]: "+10000", -}; diff --git a/back/src/domains/core/sirene/adapters/SiretGateway.common.ts b/back/src/domains/core/sirene/adapters/SiretGateway.common.ts new file mode 100644 index 0000000000..306d6d4c1d --- /dev/null +++ b/back/src/domains/core/sirene/adapters/SiretGateway.common.ts @@ -0,0 +1,49 @@ +import { NumberEmployeesRange } from "shared"; + +export const getNumberEmployeesRangeByTefenCode = ( + tefenCode?: string, +): NumberEmployeesRange => + tefenCode && isTefenCode(tefenCode) + ? employeeRangeByTefenCode[tefenCode] + : ""; + +const isTefenCode = (numberEmployees: string): numberEmployees is TefenCode => + numberEmployees in employeeRangeByTefenCode; + +// tefenCode is a French standard code for the number of employees in a company. +type TefenCode = + | "NN" + | "00" + | "01" + | "02" + | "03" + | "11" + | "12" + | "21" + | "22" + | "31" + | "32" + | "41" + | "42" + | "51" + | "52" + | "53"; + +const employeeRangeByTefenCode: Record = { + NN: "", + "00": "0", + "01": "1-2", + "02": "3-5", + "03": "6-9", + "11": "10-19", + "12": "20-49", + "21": "50-99", + "22": "100-199", + "31": "200-249", + "32": "250-499", + "41": "500-999", + "42": "1000-1999", + "51": "2000-4999", + "52": "5000-9999", + "53": "+10000", +};