/* @flow */ import { isNil } from 'ramda' import type { SaveExistingCompanyDetailsAction } from 'Types/companyTypes' import type { LegalStatus } from 'Selectors/companyStatusSelectors' const getCommuneByCodeInsee = function(codeInsee: string) { return fetch( `https://geo.api.gouv.fr/communes/${codeInsee}?fields=departement,region` ).then(response => { return response.json() }) } const getCommuneByCodePostal = function(codePostal: string) { return fetch( `https://geo.api.gouv.fr/communes?codePostal=${codePostal}&fields=departement,region` ) .then(response => { return response.json() }) .then(communes => { if (!communes || communes.length === 0) { throw new Error( `Pas de commune associée à ce code postal : ${codePostal}` ) } if (communes.length > 1) { throw new Error( `Trop de communes associées à ce code postal : ${codePostal}` ) } return communes[0] }) } const getLegalStatus = ( { nature_juridique_entreprise: codeNatureJuridique }, isAutoEntrepreneur ): ?LegalStatus => { /* Nous utilisons le code entreprise pour connaitre le statut juridique (voir https://www.insee.fr/fr/information/2028129) En revanche, impossible de différencier EI et auto-entreprise https://www.sirene.fr/sirene/public/question.action?idQuestion=2933 */ if (!codeNatureJuridique) { return isAutoEntrepreneur ? 'auto-entrepreneur' : 'EI' } if (codeNatureJuridique === '5498') { return 'EURL' } if (codeNatureJuridique.match(/^54..$/)) { return 'SARL' } if (codeNatureJuridique.match(/^55..$/)) { return 'SA' } if (codeNatureJuridique === '5720') { return 'SASU' } if (codeNatureJuridique.match(/^57..$/)) { return 'SAS' } return null } export const saveExistingCompanyDetails = ( details: { [string]: string }, isAutoEntrepreneur?: boolean ) => ( dispatch: SaveExistingCompanyDetailsAction => void, _: any, { history, sitePaths }: any ) => { let effectif = Number.parseInt( details.tranche_effectif_salarie_entreprise_centaine_pret, 10 ) effectif = isNaN(effectif) ? null : effectif const legalStatus = getLegalStatus(details, isAutoEntrepreneur) dispatch({ type: 'SAVE_EXISTING_COMPANY_DETAILS', details: { siret: details.siret, ...(!isNil(effectif) ? { effectif } : null), ...(legalStatus ? { legalStatus } : null), apiDetails: details } }) history.push(sitePaths.sécuritéSociale.index) getCommuneByCodeInsee(details.departement + details.commune) .catch(err => { console.warn(err) return getCommuneByCodePostal(details.code_postal) }) .catch(err => { console.warn(err) return null }) .then(commune => dispatch({ type: 'SAVE_EXISTING_COMPANY_DETAILS', details: { siret: details.siret, ...(!isNil(effectif) ? { effectif } : null), ...(commune ? { localisation: commune } : null), ...(legalStatus ? { legalStatus } : null), apiDetails: details } }) ) }