From c2a6dce3bfe049a15b7b4e141ed0261d90943031 Mon Sep 17 00:00:00 2001 From: Johan Girod Date: Wed, 17 Jun 2020 10:34:38 +0200 Subject: [PATCH] :sparkles: Ajoute la recherche par code postal pour les communes --- .../components/conversation/RuleInput.tsx | 8 +++--- .../select/{SelectGeo.js => SelectCommune.js} | 26 +++++++++++++------ mon-entreprise/source/locales/rules-en.yaml | 10 +++---- .../rules/entreprise-établissement.yaml | 2 +- .../Gérer/DétachementIndépendant/FormPDF.tsx | 19 ++++++++++++-- .../formulaire-détachement.yaml | 23 +++++++++++++--- .../Gérer/DétachementIndépendant/index.tsx | 2 +- publicodes/docs/mecanisms.yaml | 2 +- 8 files changed, 67 insertions(+), 25 deletions(-) rename mon-entreprise/source/components/conversation/select/{SelectGeo.js => SelectCommune.js} (81%) diff --git a/mon-entreprise/source/components/conversation/RuleInput.tsx b/mon-entreprise/source/components/conversation/RuleInput.tsx index f4f17e961..dcd119335 100644 --- a/mon-entreprise/source/components/conversation/RuleInput.tsx +++ b/mon-entreprise/source/components/conversation/RuleInput.tsx @@ -1,6 +1,6 @@ import Input from 'Components/conversation/Input' import Question from 'Components/conversation/Question' -import SelectGéo from 'Components/conversation/select/SelectGeo' +import SelectCommune from 'Components/conversation/select/SelectCommune' import SelectAtmp from 'Components/conversation/select/SelectTauxRisque' import CurrencyInput from 'Components/CurrencyInput/CurrencyInput' import PercentageField from 'Components/PercentageField' @@ -66,9 +66,9 @@ export default function RuleInput({ /> ) } - if (rule.API && rule.API === 'géo') - return - if (rule.API) throw new Error("Le seul API implémenté est l'API géo") + if (rule.API && rule.API === 'commune') + return + if (rule.API) throw new Error("Les seules API implémentées sont 'commune'") if (rule.dottedName == 'contrat salarié . ATMP . taux collectif ATMP') return diff --git a/mon-entreprise/source/components/conversation/select/SelectGeo.js b/mon-entreprise/source/components/conversation/select/SelectCommune.js similarity index 81% rename from mon-entreprise/source/components/conversation/select/SelectGeo.js rename to mon-entreprise/source/components/conversation/select/SelectCommune.js index 62425dc38..2455c73b6 100644 --- a/mon-entreprise/source/components/conversation/select/SelectGeo.js +++ b/mon-entreprise/source/components/conversation/select/SelectCommune.js @@ -14,20 +14,30 @@ async function tauxVersementTransport(codeCommune) { const json = await response.json() return json } - +function formatCommune(value) { + return value && `${value.nom} (${value.codePostal})` +} async function searchCommunes(input) { + const number = input.match(/[\d]+/)?.join('') ?? '' + const text = input.match(/[^\d]+/)?.join(' ') ?? '' const response = await fetch( - `https://geo.api.gouv.fr/communes?nom=${input}&fields=nom,code,departement,region&boost=population` + `https://geo.api.gouv.fr/communes?fields=nom,code,departement,region,codesPostaux${ + text ? `&nom=${text}` : '' + }${number.match(/[\d]{5}/) ? `&codePostal=${number}` : ''}&boost=population` ) if (!response.ok) { return null } const json = await response.json() - return json + return json.flatMap(({ codesPostaux, ...commune }) => + codesPostaux + .map(codePostal => ({ ...commune, codePostal })) + .filter(({ codePostal }) => codePostal.includes(number)) + ) } export default function Select({ onChange, onSubmit, value }) { - const [name, setName] = useState(value?.nom) + const [name, setName] = useState(formatCommune(value)) const [searchResults, setSearchResults] = useState() const [isLoading, setLoadingState] = useState(false) @@ -67,7 +77,7 @@ export default function Select({ onChange, onSubmit, value }) { .finally(() => { onSubmit() // eslint-disable-line no-console setSearchResults(null) - setName(option.nom) + setName(formatCommune(option)) }) } const noResult = !isLoading && searchResults && searchResults.length === 0 @@ -105,11 +115,11 @@ export default function Select({ onChange, onSubmit, value }) { {searchResults && searchResults.map(result => { - const { nom, departement } = result + const nom = formatCommune(result) return ( ) })} diff --git a/mon-entreprise/source/locales/rules-en.yaml b/mon-entreprise/source/locales/rules-en.yaml index 5fe6d094d..8dccba54c 100644 --- a/mon-entreprise/source/locales/rules-en.yaml +++ b/mon-entreprise/source/locales/rules-en.yaml @@ -2233,7 +2233,7 @@ contrat salarié . lodeom . secteurs d'activité: titre.fr: secteurs d'activité contrat salarié . lodeom . zone un: titre.en: Geographical area 1 (Guadeloupe, Martinique, Reunion Island, French Guiana) - titre.fr: Zone géographique 1 (Guadeloupe, Martinique, La Réunion, Guyane) + titre.fr: Zone communegraphique 1 (Guadeloupe, Martinique, La Réunion, Guyane) contrat salarié . lodeom . écart au plafond de l'assiette: titre.en: deviation from the base ceiling titre.fr: écart au plafond de l'assiette @@ -4808,10 +4808,10 @@ entreprise . rattachée à la CIPAV: Les auto-entrepreneurs exerçant une activité de profession libérale règlementée sont affiliés pour leur assurance retraite à la Cipav. Ces professions libérales règlementées sont : architectes, architectes - d’intérieur, économistes de la construction, géomètres, ingénieurs-conseils, - maîtres d’oeuvre, psychologues, psychothérapeutes, ostéopathes, - ergothérapeutes, chiropracteurs, diététiciens, artistes autres que les - artistes-auteurs, experts devant les tribunaux, experts automobiles, + d’intérieur, économistes de la construction, communemètres, + ingénieurs-conseils, maîtres d’oeuvre, psychologues, psychothérapeutes, + ostéopathes, ergothérapeutes, chiropracteurs, diététiciens, artistes autres + que les artistes-auteurs, experts devant les tribunaux, experts automobiles, mandataires judiciaires à la protection des majeurs, courtiers en valeur, guides-conférenciers, guides de haute montagne, accompagnateurs de moyenne montagne et moniteurs de ski. diff --git a/mon-entreprise/source/rules/entreprise-établissement.yaml b/mon-entreprise/source/rules/entreprise-établissement.yaml index 082510015..f0c03c556 100644 --- a/mon-entreprise/source/rules/entreprise-établissement.yaml +++ b/mon-entreprise/source/rules/entreprise-établissement.yaml @@ -481,7 +481,7 @@ entreprise . auto entreprise impossible: Lorsqu'une entreprise dispose de plusieurs établissements, certaines cotisations sont calculées à l'échelle de l'établissement et sont fonction de règlementations locales. question: Dans quelle commune l'établissement est-il implanté ? - API: géo + API: commune par défaut: code: 29019 nom: Non renseignée diff --git a/mon-entreprise/source/sites/mon-entreprise.fr/pages/Gérer/DétachementIndépendant/FormPDF.tsx b/mon-entreprise/source/sites/mon-entreprise.fr/pages/Gérer/DétachementIndépendant/FormPDF.tsx index 7b3c025fd..26382d370 100644 --- a/mon-entreprise/source/sites/mon-entreprise.fr/pages/Gérer/DétachementIndépendant/FormPDF.tsx +++ b/mon-entreprise/source/sites/mon-entreprise.fr/pages/Gérer/DétachementIndépendant/FormPDF.tsx @@ -75,10 +75,22 @@ function FormPDF({ fields, title, description }) { {fields.map(field => ( {field.type === 'groupe' ? ( - {field.title} + <> + + {field.title}{' '} + {field.note && ( + ({field.note}) + )} + + ) : ( <> - {field.question ?? field.title} + + {field.question ?? field.title}{' '} + {field.note && ( + ({field.note}) + )} + {field.nodeValue != null && ( {formatValue(field)} )} @@ -108,6 +120,9 @@ const styles = StyleSheet.create({ paddingBottom: 65, paddingHorizontal: 35 }, + fieldNumber: { + opacity: 0.7 + }, title: { fontSize: 20, marginBottom: 20, diff --git a/mon-entreprise/source/sites/mon-entreprise.fr/pages/Gérer/DétachementIndépendant/formulaire-détachement.yaml b/mon-entreprise/source/sites/mon-entreprise.fr/pages/Gérer/DétachementIndépendant/formulaire-détachement.yaml index 4979052af..971685a8d 100644 --- a/mon-entreprise/source/sites/mon-entreprise.fr/pages/Gérer/DétachementIndépendant/formulaire-détachement.yaml +++ b/mon-entreprise/source/sites/mon-entreprise.fr/pages/Gérer/DétachementIndépendant/formulaire-détachement.yaml @@ -2,18 +2,25 @@ coordonnées assuré: titre: Vos coordonnées type: groupe formule: oui + note: 1 coordonnées assuré . nom: type: texte + note: 1.2 coordonnées assuré . prénoms: type: texte + note: 1.3 coordonnées assuré . nationalité: type: texte + note: 1.6 coordonnées assuré . date de naissance: type: date + note: 1.5 coordonnées assuré . commune de naissance: - API: géo + API: commune + note: 1.7 coordonnées assuré . numéro de sécurité sociale: type: texte + note: 1.1 coordonnées assuré . organisme urssaf: type: texte description: > @@ -22,24 +29,32 @@ coordonnées assuré . organisme urssaf: coordonnées assuré . domicile personnel: type: groupe formule: oui + note: 1.8 coordonnées assuré . domicile personnel . adresse: type: texte + note: 1.9.1 coordonnées assuré . domicile personnel . commune: - API: géo + API: commune + note: 1.9.2 / 1.9.3 activité france: + note: 4 / 4.1.2 type: groupe formule: oui titre: Votre activité indépendante en France activité france . SIREN: + note: 4.2 type: texte activité france . nom: + note: 4.3 titre: Nom de l'entreprise type: texte activité france . adresse: + note: 4.4.1 type: texte activité france . commune: - API: géo + API: commune + note:: 4.4.3 / 4.4.4 demande: question: Quelle demande souhaitez-vous effectuer ? @@ -51,6 +66,7 @@ demande: - activité transfrontalière simultanée demande . détachement: + note: 3.3 type: groupe formule: oui applicable si: demande = 'détachement' @@ -100,6 +116,7 @@ demande . détachement . période . date de fin: type: date demande . activité transfrontalière simultanée: + note: 3.4 applicable si: demande = 'activité transfrontalière simultanée' type: groupe formule: oui diff --git a/mon-entreprise/source/sites/mon-entreprise.fr/pages/Gérer/DétachementIndépendant/index.tsx b/mon-entreprise/source/sites/mon-entreprise.fr/pages/Gérer/DétachementIndépendant/index.tsx index 8cd2f124a..7e0c1eb77 100644 --- a/mon-entreprise/source/sites/mon-entreprise.fr/pages/Gérer/DétachementIndépendant/index.tsx +++ b/mon-entreprise/source/sites/mon-entreprise.fr/pages/Gérer/DétachementIndépendant/index.tsx @@ -37,7 +37,7 @@ const useFields = (engine: Engine, fieldNames: Array) => { return fields } -const VERSION = hash(JSON.stringify(Object.keys(formulaire))) +const VERSION = hash(JSON.stringify(formulaire)) function FormulairePublicodes({ engine }) { const [situation, setSituation] = usePersistingState( `formulaire-détachement:${VERSION}`, diff --git a/publicodes/docs/mecanisms.yaml b/publicodes/docs/mecanisms.yaml index c06533ad0..1509a7ee6 100644 --- a/publicodes/docs/mecanisms.yaml +++ b/publicodes/docs/mecanisms.yaml @@ -488,7 +488,7 @@ synchronisation: description: Pour éviter trop de saisies à l'utilisateur, certaines informations sont récupérées à partir de ce que l'on appelle des API. Ce sont des services auxquels ont fait appel pour obtenir des informations sur un sujet précis. - Par exemple, l'État français fournit gratuitement l'API géo, qui permet à + Par exemple, l'État français fournit gratuitement l'API commune, qui permet à partir du nom d'une ville, d'obtenir son code postal, son département, la population etc.