From 6648bd6f2966218793c5c8035ed1787b8a53ca7a Mon Sep 17 00:00:00 2001 From: Jalil Arfaoui Date: Sat, 10 Feb 2024 23:14:54 +0100 Subject: [PATCH] =?UTF-8?q?refactor:=20introduit=20des=20types=20du=20doma?= =?UTF-8?q?in=20pour=20d=C3=A9coupler=20notre=20code=20de=20celui=20de=20l?= =?UTF-8?q?'API=20Fabrique=20Social?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- site/source/api/fabrique-social.ts | 56 ++++++++++++++--- .../components/company/SearchDetails.tsx | 62 ++++++------------- .../source/components/company/SearchField.tsx | 26 ++++---- site/source/domain/Adresse.ts | 5 ++ site/source/domain/Brand.ts | 1 + site/source/domain/CodeActivite.ts | 6 ++ site/source/domain/CodeCatégorieJuridique.ts | 6 ++ site/source/domain/Date.spec.ts | 17 +++++ site/source/domain/Date.ts | 10 +++ site/source/domain/Entreprise.ts | 24 +++++++ site/source/domain/Siren.ts | 7 +++ site/source/domain/Établissement.ts | 9 +++ site/source/hooks/useSearchCompany.ts | 13 ++-- site/source/hooks/useSetEntreprise.ts | 21 +++---- site/source/pages/_landing/SearchOrCreate.tsx | 12 ++-- .../assistants/pour-mon-entreprise/index.tsx | 10 +-- site/source/store/actions/companyActions.ts | 4 +- .../store/reducers/companySituationReducer.ts | 32 ++++------ site/test/fabrique-social.test.ts | 42 ++++++++++--- 19 files changed, 233 insertions(+), 130 deletions(-) create mode 100644 site/source/domain/Adresse.ts create mode 100644 site/source/domain/Brand.ts create mode 100644 site/source/domain/CodeActivite.ts create mode 100644 site/source/domain/CodeCatégorieJuridique.ts create mode 100644 site/source/domain/Date.spec.ts create mode 100644 site/source/domain/Date.ts create mode 100644 site/source/domain/Entreprise.ts create mode 100644 site/source/domain/Siren.ts create mode 100644 site/source/domain/Établissement.ts diff --git a/site/source/api/fabrique-social.ts b/site/source/api/fabrique-social.ts index 4c50b2893..e8f91d2a5 100644 --- a/site/source/api/fabrique-social.ts +++ b/site/source/api/fabrique-social.ts @@ -1,9 +1,49 @@ -import { Company } from '@/store/reducers/companySituationReducer' +import { codeActivité } from '@/domain/CodeActivite' +import { codeCatégorieJuridique } from '@/domain/CodeCatégorieJuridique' +import { Entreprise } from '@/domain/Entreprise' +import { Établissement } from '@/domain/Établissement' +import { siren, siret } from '@/domain/Siren' -export async function searchDenominationOrSiren(value: string) { - return searchFullText(value) +export async function searchDenominationOrSiren( + searchTerm: string +): Promise | null> { + return searchFullText(searchTerm).then( + (entreprises) => entreprises?.map(fabriqueSocialEntrepriseAdapter) || null + ) } +export const fabriqueSocialEntrepriseAdapter = ( + entreprise: FabriqueSocialEntreprise +): Entreprise => { + const siège = entreprise && getSiege(entreprise) + + return { + nom: entreprise.label, + siren: siren(entreprise.siren), + dateDeCréation: new Date(entreprise.dateCreationUniteLegale), + codeCatégorieJuridique: codeCatégorieJuridique( + entreprise.categorieJuridiqueUniteLegale + ), + activitéPrincipale: codeActivité(entreprise.activitePrincipale), + siège: siège && établissementAdapter(siège), + établissement: établissementAdapter(entreprise.firstMatchingEtablissement), + } +} + +const établissementAdapter = ( + fabriqueSocialEtablissement: FabriqueSocialEtablissement +): Établissement => ({ + siret: siret(fabriqueSocialEtablissement.siret), + activitéPrincipale: codeActivité( + fabriqueSocialEtablissement.activitePrincipaleEtablissement + ), + adresse: { + complète: fabriqueSocialEtablissement.address, + codePostal: fabriqueSocialEtablissement.codePostalEtablissement, + codeCommune: fabriqueSocialEtablissement.codeCommuneEtablissement, + }, +}) + /* * Fields are documented in https://www.sirene.fr/static-resources/doc/Description%20fichier%20StockUniteLegaleHistorique.pdf?version=1.33.1 */ @@ -67,10 +107,10 @@ async function searchFullText( return json.entreprises } -export function getSiegeOrFirstEtablissement( - entreprise: FabriqueSocialEntreprise | Company -): FabriqueSocialEtablissement { - return (entreprise.allMatchingEtablissements.find( +function getSiege( + entreprise: FabriqueSocialEntreprise +): FabriqueSocialEtablissement | undefined { + return entreprise.allMatchingEtablissements.find( (etablissement) => etablissement.etablissementSiege - ) || entreprise.firstMatchingEtablissement)! + ) } diff --git a/site/source/components/company/SearchDetails.tsx b/site/source/components/company/SearchDetails.tsx index 7cce79828..d5ef25ab1 100644 --- a/site/source/components/company/SearchDetails.tsx +++ b/site/source/components/company/SearchDetails.tsx @@ -1,23 +1,23 @@ -import { Fragment, useMemo } from 'react' +import { useMemo } from 'react' import { Trans, useTranslation } from 'react-i18next' import { styled } from 'styled-components' -import { - FabriqueSocialEntreprise, - getSiegeOrFirstEtablissement, -} from '@/api/fabrique-social' import { Spacing } from '@/design-system/layout' import { Strong } from '@/design-system/typography' import { H4 } from '@/design-system/typography/heading' +import { + Entreprise, + établissementEstDifférentDuSiège, +} from '@/domain/Entreprise' -export default function CompanySearchDetails({ +export default function EntrepriseSearchDetails({ entreprise, }: { - entreprise: FabriqueSocialEntreprise + entreprise: Entreprise }) { const { i18n } = useTranslation() - const { siren, label, dateCreationUniteLegale } = entreprise + const { nom, siren, siège, établissement, dateDeCréation } = entreprise const DateFormatter = useMemo( () => @@ -29,8 +29,6 @@ export default function CompanySearchDetails({ [i18n.language] ) - const siegeOrFirstEtablissement = getSiegeOrFirstEtablissement(entreprise) - return (

<> - {'highlightLabel' in entreprise - ? highlightLabelToJSX(entreprise.highlightLabel) - : label}{' '} - ({siren}) + {nom} ({siren})

Crée le :{' '} - {DateFormatter.format(new Date(dateCreationUniteLegale))} + {DateFormatter.format(dateDeCréation)} + {établissementEstDifférentDuSiège(entreprise) && ( + <> +
+ Siège : {siège?.adresse.complète} + + )}
- Domiciliée à l'adresse :{' '} - {siegeOrFirstEtablissement.address} + Établissement recherché:{' '} + {établissement?.adresse.complète}
) } -function highlightLabelToJSX(highlightLabel: string) { - const highlightRE = /(.*?)(.+?)<\/u><\/b>/gm - let parsedLength = 0 - const result = [] - let matches: RegExpExecArray | null = null - while ((matches = highlightRE.exec(highlightLabel)) !== null) { - parsedLength += matches[0].length - result.push( - - {matches[1]} - {matches[2]} - - ) - } - result.push(highlightLabel.slice(parsedLength)) - - return result -} - -const Highlight = styled.strong` - background-color: ${({ theme }) => - theme.darkMode - ? theme.colors.bases.secondary[600] - : theme.colors.bases.secondary[100]}; - color: inherit; -` - const CompanyContainer = styled.div` text-align: left; ` diff --git a/site/source/components/company/SearchField.tsx b/site/source/components/company/SearchField.tsx index cb645f269..f1bdb0f54 100644 --- a/site/source/components/company/SearchField.tsx +++ b/site/source/components/company/SearchField.tsx @@ -3,7 +3,6 @@ import { ReactNode, useEffect, useRef } from 'react' import { Trans, useTranslation } from 'react-i18next' import { styled } from 'styled-components' -import { FabriqueSocialEntreprise } from '@/api/fabrique-social' import { ForceThemeProvider } from '@/components/utils/DarkModeContext' import { Message } from '@/design-system' import { Card } from '@/design-system/card' @@ -15,10 +14,11 @@ import { Strong } from '@/design-system/typography' import { StyledLink } from '@/design-system/typography/link' import { Li, Ul } from '@/design-system/typography/list' import { Body } from '@/design-system/typography/paragraphs' +import { Entreprise } from '@/domain/Entreprise' import useSearchCompany from '@/hooks/useSearchCompany' import { Appear, FromTop } from '../ui/animate' -import CompanySearchDetails from './SearchDetails' +import EntrepriseSearchDetails from './SearchDetails' const StyledCard = styled(Card)` flex-direction: row; // for Safari <= 13 @@ -28,14 +28,14 @@ const StyledCard = styled(Card)` } ` -export function CompanySearchField(props: { +export function EntrepriseSearchField(props: { label?: ReactNode onValue?: () => void onClear?: () => void - onSubmit?: (search: FabriqueSocialEntreprise | null) => void + onSubmit?: (search: Entreprise | null) => void }) { const { t } = useTranslation() - const refResults = useRef(null) + const refResults = useRef(null) const searchFieldProps = { ...props, @@ -102,8 +102,8 @@ function Results({ results, onSubmit, }: { - results: Array - onSubmit?: (établissement: FabriqueSocialEntreprise) => void + results: Array + onSubmit?: (entreprise: Entreprise) => void }) { const { t } = useTranslation() @@ -152,14 +152,14 @@ function Results({
    - {results.map((etablissement) => ( -
  • + {results.map((entreprise) => ( +
  • onSubmit?.(etablissement)} - onClick={() => onSubmit?.(etablissement)} + onPress={() => onSubmit?.(entreprise)} + onClick={() => onSubmit?.(entreprise)} compact bodyAs="div" - aria-label={`${etablissement.label}, Selectionner cette entreprise`} + aria-label={`${entreprise.nom}, Selectionner cette entreprise`} ctaLabel={ } > - +
  • ))} diff --git a/site/source/domain/Adresse.ts b/site/source/domain/Adresse.ts new file mode 100644 index 000000000..e728b1208 --- /dev/null +++ b/site/source/domain/Adresse.ts @@ -0,0 +1,5 @@ +export interface Adresse { + complète?: string + codePostal: string + codeCommune: string +} diff --git a/site/source/domain/Brand.ts b/site/source/domain/Brand.ts new file mode 100644 index 000000000..5153dc6dd --- /dev/null +++ b/site/source/domain/Brand.ts @@ -0,0 +1 @@ +export type Brand = T & { __tag: U } diff --git a/site/source/domain/CodeActivite.ts b/site/source/domain/CodeActivite.ts new file mode 100644 index 000000000..53da8a322 --- /dev/null +++ b/site/source/domain/CodeActivite.ts @@ -0,0 +1,6 @@ +import { Brand } from '@/domain/Brand' + +export type CodeActivite = Brand +// Pourrait être inféré des données de fetchBénéfice + +export const codeActivité = (code: string) => code as CodeActivite diff --git a/site/source/domain/CodeCatégorieJuridique.ts b/site/source/domain/CodeCatégorieJuridique.ts new file mode 100644 index 000000000..4f4c949ee --- /dev/null +++ b/site/source/domain/CodeCatégorieJuridique.ts @@ -0,0 +1,6 @@ +import { Brand } from '@/domain/Brand' + +export type CodeCatégorieJuridique = Brand + +export const codeCatégorieJuridique = (code: string) => + code as CodeCatégorieJuridique diff --git a/site/source/domain/Date.spec.ts b/site/source/domain/Date.spec.ts new file mode 100644 index 000000000..9aae1337b --- /dev/null +++ b/site/source/domain/Date.spec.ts @@ -0,0 +1,17 @@ +import { describe, expect, it } from 'vitest' + +import { formatDate, parsePublicodesDateString } from '@/domain/Date' + +describe('parsePublicodesDateString', () => { + it('comprend 24-12-2024 comme le 24 décembre 2024', () => { + expect(parsePublicodesDateString('24/12/2024')).toEqual( + new Date(2024, 11, 24) + ) + }) +}) + +describe('formatDate', () => { + it("écrit le 15 août 1980 comme '15/08/1980' (format Publicodes)", () => { + expect(formatDate(new Date('1980-08-15'))).toEqual('15/08/1980') + }) +}) diff --git a/site/source/domain/Date.ts b/site/source/domain/Date.ts new file mode 100644 index 000000000..bb5306484 --- /dev/null +++ b/site/source/domain/Date.ts @@ -0,0 +1,10 @@ +import { format, parse } from 'date-fns/fp' + +export const publicodesStandardDateFormat = 'dd/MM/yyyy' + +export const formatDate = format(publicodesStandardDateFormat) + +export const parsePublicodesDateString = parse( + new Date(), + publicodesStandardDateFormat +) diff --git a/site/source/domain/Entreprise.ts b/site/source/domain/Entreprise.ts new file mode 100644 index 000000000..c2ce5eb62 --- /dev/null +++ b/site/source/domain/Entreprise.ts @@ -0,0 +1,24 @@ +import { CodeActivite } from '@/domain/CodeActivite' +import { CodeCatégorieJuridique } from '@/domain/CodeCatégorieJuridique' +import { Établissement } from '@/domain/Établissement' +import { Siren } from '@/domain/Siren' + +export interface Entreprise { + nom: string + siren: Siren + dateDeCréation: Date + codeCatégorieJuridique: CodeCatégorieJuridique + activitéPrincipale: CodeActivite + siège?: Établissement + établissement: Établissement +} + +export const établissementEstLeSiège = (entreprise: Entreprise): boolean => + !!entreprise.siège && + !!entreprise.siège.adresse.complète && + entreprise.siège.adresse.complète === + entreprise.établissement.adresse.complète + +export const établissementEstDifférentDuSiège = ( + entreprise: Entreprise +): boolean => !établissementEstLeSiège(entreprise) diff --git a/site/source/domain/Siren.ts b/site/source/domain/Siren.ts new file mode 100644 index 000000000..eb1dea02a --- /dev/null +++ b/site/source/domain/Siren.ts @@ -0,0 +1,7 @@ +import { Brand } from '@/domain/Brand' + +export type Siren = Brand +export const siren = (value: string): Siren => value as Siren + +export type Siret = Brand +export const siret = (value: string): Siret => value as Siret diff --git a/site/source/domain/Établissement.ts b/site/source/domain/Établissement.ts new file mode 100644 index 000000000..891bd53ce --- /dev/null +++ b/site/source/domain/Établissement.ts @@ -0,0 +1,9 @@ +import { Adresse } from '@/domain/Adresse' +import { CodeActivite } from '@/domain/CodeActivite' +import { Siret } from '@/domain/Siren' + +export interface Établissement { + siret: Siret + adresse: Adresse + activitéPrincipale: CodeActivite +} diff --git a/site/source/hooks/useSearchCompany.ts b/site/source/hooks/useSearchCompany.ts index 99f520e9e..14aa482a7 100644 --- a/site/source/hooks/useSearchCompany.ts +++ b/site/source/hooks/useSearchCompany.ts @@ -1,22 +1,19 @@ import { useEffect, useState } from 'react' -import { - FabriqueSocialEntreprise, - searchDenominationOrSiren, -} from '@/api/fabrique-social' +import { searchDenominationOrSiren } from '@/api/fabrique-social' +import { Entreprise } from '@/domain/Entreprise' import { useDebounce } from './useDebounce' export default function useSearchCompany( value: string -): [boolean, Array] { - const [result, setResult] = useState>([]) +): [boolean, Array] { + const [result, setResult] = useState>([]) const [searchPending, setSearchPending] = useState(Boolean(value)) const debouncedValue = useDebounce(value, 300) useEffect(() => { setSearchPending(Boolean(value)) - if (!value) { setResult([]) } @@ -28,7 +25,7 @@ export default function useSearchCompany( } searchDenominationOrSiren(debouncedValue) - .then((entreprise: Array | null) => { + .then((entreprise: Array | null) => { setResult(entreprise || []) setSearchPending(false) }) diff --git a/site/source/hooks/useSetEntreprise.ts b/site/source/hooks/useSetEntreprise.ts index c58ddb611..e45cfdca6 100644 --- a/site/source/hooks/useSetEntreprise.ts +++ b/site/source/hooks/useSetEntreprise.ts @@ -2,10 +2,7 @@ import { useDispatch } from 'react-redux' import fetchBénéfice from '@/api/activité-vers-bénéfice' import { fetchCommuneDetails } from '@/api/commune' -import { - FabriqueSocialEntreprise, - getSiegeOrFirstEtablissement, -} from '@/api/fabrique-social' +import { Entreprise } from '@/domain/Entreprise' import { addCommuneDetails, setBénéficeType, @@ -15,24 +12,20 @@ import { export function useSetEntreprise() { const dispatch = useDispatch() - return (entreprise: FabriqueSocialEntreprise | null) => { - if (entreprise === null) { + return (entreprise: Entreprise | null) => { + if (entreprise === null || !entreprise.établissement.adresse) { return } dispatch(setCompany(entreprise)) - const siegeOrFirstEtablissement = getSiegeOrFirstEtablissement(entreprise) - - void fetchCommuneDetails( - siegeOrFirstEtablissement.codeCommuneEtablissement - ).then( + void fetchCommuneDetails(entreprise.établissement.adresse.codeCommune).then( (communeDetails) => communeDetails && dispatch(addCommuneDetails(communeDetails)) ) - void fetchBénéfice( - siegeOrFirstEtablissement.activitePrincipaleEtablissement - ).then((bénéfice) => bénéfice && dispatch(setBénéficeType(bénéfice))) + void fetchBénéfice(entreprise.établissement.activitéPrincipale).then( + (bénéfice) => bénéfice && dispatch(setBénéficeType(bénéfice)) + ) } } diff --git a/site/source/pages/_landing/SearchOrCreate.tsx b/site/source/pages/_landing/SearchOrCreate.tsx index f7e0965bd..b1868ee52 100644 --- a/site/source/pages/_landing/SearchOrCreate.tsx +++ b/site/source/pages/_landing/SearchOrCreate.tsx @@ -3,12 +3,9 @@ import { Trans, useTranslation } from 'react-i18next' import { useDispatch } from 'react-redux' import { generatePath, useNavigate } from 'react-router-dom' -import { - FabriqueSocialEntreprise, - searchDenominationOrSiren, -} from '@/api/fabrique-social' +import { searchDenominationOrSiren } from '@/api/fabrique-social' import { CompanyDetails } from '@/components/company/Details' -import { CompanySearchField } from '@/components/company/SearchField' +import { EntrepriseSearchField } from '@/components/company/SearchField' import { useEngine } from '@/components/utils/EngineContext' import AnswerGroup from '@/design-system/answer-group' import { Button } from '@/design-system/buttons' @@ -16,6 +13,7 @@ import { Grid, Spacing } from '@/design-system/layout' import PopoverConfirm from '@/design-system/popover/PopoverConfirm' import { H3 } from '@/design-system/typography/heading' import { Body } from '@/design-system/typography/paragraphs' +import { Entreprise } from '@/domain/Entreprise' import { useSetEntreprise } from '@/hooks/useSetEntreprise' import { useSitePaths } from '@/sitePaths' import { getCookieValue } from '@/storage/readCookie' @@ -85,7 +83,7 @@ export default function SearchOrCreate() { activité - + )} @@ -100,7 +98,7 @@ function useHandleCompanySubmit() { const setEntreprise = useSetEntreprise() const handleCompanySubmit = useCallback( - (établissement: FabriqueSocialEntreprise | null) => { + (établissement: Entreprise | null) => { if (!établissement) { return } diff --git a/site/source/pages/assistants/pour-mon-entreprise/index.tsx b/site/source/pages/assistants/pour-mon-entreprise/index.tsx index ce971404e..ca13621cb 100644 --- a/site/source/pages/assistants/pour-mon-entreprise/index.tsx +++ b/site/source/pages/assistants/pour-mon-entreprise/index.tsx @@ -14,10 +14,7 @@ import { } from 'react-router-dom' import { styled } from 'styled-components' -import { - FabriqueSocialEntreprise, - searchDenominationOrSiren, -} from '@/api/fabrique-social' +import { searchDenominationOrSiren } from '@/api/fabrique-social' import { TrackPage } from '@/components/ATInternetTracking' import { CompanyDetails } from '@/components/company/Details' import RuleInput from '@/components/conversation/RuleInput' @@ -36,6 +33,7 @@ import { Container, Grid, Spacing } from '@/design-system/layout' import { Strong } from '@/design-system/typography' import { H2, H3 } from '@/design-system/typography/heading' import { Body, Intro } from '@/design-system/typography/paragraphs' +import { Entreprise } from '@/domain/Entreprise' import { useQuestionList } from '@/hooks/useQuestionList' import { useSetEntreprise } from '@/hooks/useSetEntreprise' import useSimulationConfig from '@/hooks/useSimulationConfig' @@ -399,9 +397,7 @@ const usePourMonEntreprisePath = () => { const useSirenFromParams = (overwrite: boolean) => { const { entreprise: param } = useParams<{ entreprise?: string }>() - const [entreprise, setEntreprise] = useState( - null - ) + const [entreprise, setEntreprise] = useState(null) const [entreprisePending, setEntreprisePending] = useState(false) const [entrepriseNotFound, setEntrepriseNotFound] = useState(false) diff --git a/site/source/store/actions/companyActions.ts b/site/source/store/actions/companyActions.ts index 1ca6a5495..99a7929e2 100644 --- a/site/source/store/actions/companyActions.ts +++ b/site/source/store/actions/companyActions.ts @@ -1,6 +1,6 @@ import { Bénéfice } from '@/api/activité-vers-bénéfice' import { Commune } from '@/api/commune' -import { FabriqueSocialEntreprise } from '@/api/fabrique-social' +import { Entreprise } from '@/domain/Entreprise' export type CompanyActions = ReturnType< | typeof resetCompany @@ -26,7 +26,7 @@ export const setBénéficeType = (bénéfice: NonNullable) => bénéfice, }) as const -export const setCompany = (entreprise: FabriqueSocialEntreprise) => { +export const setCompany = (entreprise: Entreprise) => { return { type: 'COMPANY::SET_EXISTING_COMPANY', entreprise, diff --git a/site/source/store/reducers/companySituationReducer.ts b/site/source/store/reducers/companySituationReducer.ts index b2c5b8e60..34d3fde1d 100644 --- a/site/source/store/reducers/companySituationReducer.ts +++ b/site/source/store/reducers/companySituationReducer.ts @@ -1,9 +1,8 @@ import { DottedName } from 'modele-social' -import { - FabriqueSocialEntreprise, - getSiegeOrFirstEtablissement, -} from '@/api/fabrique-social' +import { CodeCatégorieJuridique } from '@/domain/CodeCatégorieJuridique' +import { formatDate } from '@/domain/Date' +import { Entreprise } from '@/domain/Entreprise' import { Action } from '@/store/actions/actions' import { buildSituationFromObject, omit } from '@/utils' @@ -38,8 +37,6 @@ export function isCompanyDottedName(dottedName: DottedName) { return SAVED_NAMESPACES.some((namespace) => dottedName.startsWith(namespace)) } -export type Company = Omit - export function companySituation(state: Situation = {}, action: Action) { switch (action.type) { case 'UPDATE_SITUATION': @@ -86,27 +83,24 @@ export function companySituation(state: Situation = {}, action: Action) { return state } -export function getCompanySituation(company: Company): Situation { - const siegeOrFirstEtablissement = getSiegeOrFirstEtablissement(company) - +export function getCompanySituation(entreprise: Entreprise): Situation { return { - 'entreprise . date de création': company.dateCreationUniteLegale.replace( - /(.*)-(.*)-(.*)/, - '$3/$2/$1' - ), + 'entreprise . date de création': formatDate(entreprise.dateDeCréation), 'entreprise . catégorie juridique': `'${getCatégorieFromCode( - company.categorieJuridiqueUniteLegale + entreprise.codeCatégorieJuridique )}'`, - 'entreprise . SIREN': `'${company.siren}'`, - 'entreprise . nom': `'${company.label}'`, - 'établissement . SIRET': `'${siegeOrFirstEtablissement.siret}'`, - 'entreprise . activité': `'${company.activitePrincipale}'`, + 'entreprise . SIREN': `'${entreprise.siren}'`, + 'entreprise . nom': `'${entreprise.nom}'`, + 'établissement . SIRET': `'${entreprise.établissement.siret}'`, + 'entreprise . activité': `'${entreprise.activitéPrincipale}'`, } } type CatégorieJuridique = 'EI' | 'SARL' | 'SAS' | 'SELARL' | 'SELAS' | 'autre' -const getCatégorieFromCode = (code: string): CatégorieJuridique => { +const getCatégorieFromCode = ( + code: CodeCatégorieJuridique +): CatégorieJuridique => { /* Nous utilisons le code entreprise pour connaitre le statut juridique (voir https://www.insee.fr/fr/information/2028129) diff --git a/site/test/fabrique-social.test.ts b/site/test/fabrique-social.test.ts index d33031ea5..c0cba7dc5 100644 --- a/site/test/fabrique-social.test.ts +++ b/site/test/fabrique-social.test.ts @@ -1,6 +1,6 @@ import { describe, expect, it } from 'vitest' -import { getSiegeOrFirstEtablissement } from '@/api/fabrique-social' +import { fabriqueSocialEntrepriseAdapter } from '@/api/fabrique-social' import { fabriqueSocialWithoutSiege, @@ -8,14 +8,40 @@ import { } from './fabrique-social.fixtures' describe('Fabrique Social', () => { - describe('getSiegeOrFirstEtablissement Function', () => { - it('should return siege', () => { - const siege = getSiegeOrFirstEtablissement(fabriqueSocialWithSiege) - expect(siege.address).toBe('23 RUE DE MOGADOR 75009 PARIS 9') + describe('fabriqueSocialEntrepriseAdapter', () => { + describe('Si l’entreprise est retournée avec un siège différent de la recherche', () => { + const entreprise = fabriqueSocialEntrepriseAdapter( + fabriqueSocialWithSiege + ) + + it('retourne le siren', () => { + expect(entreprise.siren).to.equal('849074190') + }) + + it("a l'établissement demandé dans 'établissement'", () => { + expect(entreprise.siège?.adresse.complète).to.equal( + '23 RUE DE MOGADOR 75009 PARIS 9' + ) + }) + it("a le siège dans 'siège'", () => { + expect(entreprise.établissement.adresse.complète).to.equal( + '4 RUE VOLTAIRE 44000 NANTES' + ) + }) }) - it('should return FirstEtablissement', () => { - const siege = getSiegeOrFirstEtablissement(fabriqueSocialWithoutSiege) - expect(siege.address).toBe('4 RUE VOLTAIRE 44000 NANTES') + describe("Si l'entreprise est retournée sans siège", () => { + const entreprise = fabriqueSocialEntrepriseAdapter( + fabriqueSocialWithoutSiege + ) + + it("n'a pas de siège", () => { + expect(entreprise.siège?.adresse.complète).to.equal(undefined) + }) + it('a l’établissement demandé', () => { + expect(entreprise.établissement.adresse.complète).to.equal( + '4 RUE VOLTAIRE 44000 NANTES' + ) + }) }) }) })