Ajoute la recherche par code postal pour les communes

pull/1075/head
Johan Girod 2020-06-17 10:34:38 +02:00
parent 168e4105cb
commit c2a6dce3bf
8 changed files with 67 additions and 25 deletions

View File

@ -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 <SelectGéo {...commonProps} onSubmit={onSubmit} />
if (rule.API) throw new Error("Le seul API implémenté est l'API géo")
if (rule.API && rule.API === 'commune')
return <SelectCommune {...commonProps} onSubmit={onSubmit} />
if (rule.API) throw new Error("Les seules API implémentées sont 'commune'")
if (rule.dottedName == 'contrat salarié . ATMP . taux collectif ATMP')
return <SelectAtmp {...commonProps} onSubmit={onSubmit} />

View File

@ -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 }) {
<Animate.fromTop>
{searchResults &&
searchResults.map(result => {
const { nom, departement } = result
const nom = formatCommune(result)
return (
<button
onClick={() => submitOnChange(result)}
key={nom + departement?.nom}
key={nom}
css={`
text-align: left;
display: block;
@ -130,7 +140,7 @@ export default function Select({ onChange, onSubmit, value }) {
padding: 0.6rem;
`}
>
{nom + ` (${departement?.nom})`}
{nom}
</button>
)
})}

View File

@ -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
dintérieur, économistes de la construction, géomètres, ingénieurs-conseils,
maîtres doeuvre, psychologues, psychothérapeutes, ostéopathes,
ergothérapeutes, chiropracteurs, diététiciens, artistes autres que les
artistes-auteurs, experts devant les tribunaux, experts automobiles,
dintérieur, économistes de la construction, communemètres,
ingénieurs-conseils, maîtres doeuvre, 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.

View File

@ -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

View File

@ -75,10 +75,22 @@ function FormPDF({ fields, title, description }) {
{fields.map(field => (
<View style={styles.field} key={field.dottedName} wrap={false}>
{field.type === 'groupe' ? (
<Text style={styles.subtitle}>{field.title}</Text>
<>
<Text style={styles.subtitle}>
{field.title}{' '}
{field.note && (
<Text style={styles.fieldNumber}>({field.note})</Text>
)}
</Text>
</>
) : (
<>
<Text style={styles.name}>{field.question ?? field.title}</Text>
<Text style={styles.name}>
{field.question ?? field.title}{' '}
{field.note && (
<Text style={styles.fieldNumber}>({field.note})</Text>
)}
</Text>
{field.nodeValue != null && (
<Text style={styles.value}>{formatValue(field)}</Text>
)}
@ -108,6 +120,9 @@ const styles = StyleSheet.create({
paddingBottom: 65,
paddingHorizontal: 35
},
fieldNumber: {
opacity: 0.7
},
title: {
fontSize: 20,
marginBottom: 20,

View File

@ -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

View File

@ -37,7 +37,7 @@ const useFields = (engine: Engine<string>, fieldNames: Array<string>) => {
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}`,

View File

@ -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.