Utilisation de l'API GEO pour chercher le nom de commune

pull/76/head
mama 2017-10-02 21:29:07 +02:00
parent 8191379e9f
commit d4d0f2c1b3
8 changed files with 70 additions and 33 deletions

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,22 @@
/* Petit script de transformation du fichier de taux du versement transport, un object indexé sur le code commune, vers
* une liste contenant le code commune en clef d'objet
*/
let taux = require('./taux.json')
let R = require('ramda')
let fs = require('fs')
let result = R.pipe(
R.toPairs,
R.map(([k,v]) => R.assoc('codeCommune', k, v)),
)(taux)
let json = JSON.stringify(result)
fs.writeFile("./liste-taux.json", json, function(err) {
if(err) {
return console.log(err);
}
console.log("C'est tout bon !");
});

View File

@ -20,8 +20,8 @@
formule:
sélection:
données: taux versement transport
cherche: commune
dans: nomLaposte
cherche: code commune
dans: codeCommune
composantes:
- nom: aot
renvoie: aot

View File

@ -1,19 +1,29 @@
- espace: établissement
nom: code postal
titre: Code postal de l'établissement
question: Quel est le code postal de la commune où est implanté l'établissement ?
question: Quel est le code postal de la commune de l'établissement ?
description: |
Lorsqu'une entreprise dispose de plusieurs établissements, certaines cotisations sont
calculées à l'échelle de l'établissement et sont fonction de règlementations locales.
format: nombre
suggestions: utilisation d'une API
- espace: établissement
nom: code commune
titre: Code commune de l'établissement
question: Dans quelle commune l'établissement est-il implanté ?
description: |
Lorsqu'une entreprise dispose de plusieurs établissements, certaines cotisations sont
calculées à l'échelle de l'établissement et sont fonction de règlementations locales.
format: nombre
suggestions: utilisation d'une API
- espace: établissement
nom: commune
titre: Commune de l'établissement
question: Quel est la commune où est implanté l'établissement ?
question: Dans quelle commune l'établissement est-il implanté ?
description: |
Lorsqu'une entreprise dispose de plusieurs établissements, certaines cotisations sont
calculées à l'échelle de l'établissement et sont fonction de règlementations locales.
# format: objet
format: texte
suggestions: communes

View File

@ -1,24 +1,30 @@
import React, { Component } from 'react'
import {FormDecorator} from '../FormDecorator'
import VirtualizedSelect from 'react-virtualized-select'
import createFilterOptions from 'react-select-fast-filter-options'
import ReactSelect from 'react-select'
import 'react-select/dist/react-select.css'
import './Select.css'
let getOptions = input =>
input.length < 3 ?
Promise.resolve({options: []}) :
fetch(`https://geo.api.gouv.fr/communes?nom=${input}`)
.then(response => {
if (!response.ok)
return [ {nom: 'Aucune commune trouvée', disabled: true} ]
return response.json()
})
.then(json => ({options: json}))
.catch(function(error) {
console.log('Erreur dans la recherche de communes à partir du code postal', error) // eslint-disable-line no-console
return {options: []}
})
@FormDecorator('select')
export default class Select extends Component {
state = {
data: null
}
componentDidMount(){
import(/* webpackChunkName: "communescsv" */ 'Règles/communes.csv')
.then(module => this.setState({
data: module,
}))
.catch(error => 'An error occurred while loading the component')
}
render() {
let {
input: {
@ -28,23 +34,21 @@ export default class Select extends Component {
} = this.props,
submitOnChange =
option => {
onChange(option.Nom_commune)
onChange(option.code)
submit()
}
if (!this.state.data)
return <div>Nous reçevons les données... </div>
return (
<div className="select-answer commune">
<VirtualizedSelect
options={this.state.data}
<ReactSelect.Async
onChange={submitOnChange}
ignoreAccents={false}
labelKey="Nom_commune"
valueKey="Nom_commune"
labelKey="nom"
optionRenderer={({nom, codeDepartement}) => nom + ` (${codeDepartement})`}
placeholder="Entrez le nom de commune"
noResultsText="Nous n'avons trouvé aucune commune"
searchPromptText={null}
loadingPlaceholder="Recherche en cours..."
loadOptions={getOptions}
/>
</div>
)

View File

@ -7,7 +7,7 @@ import {findRuleByName} from './rules'
import 'react-virtualized/styles.css'
import {Table, Column} from 'react-virtualized'
import taux_versement_transport from 'Règles/rémunération-travail/cotisations/ok/taux.json'
import taux_versement_transport from 'Règles/rémunération-travail/cotisations/ok/liste-taux.json'
let constantNode = constant => ({nodeValue: constant, jsx: nodeValue => <span className="value">{nodeValue}</span>})
@ -641,7 +641,7 @@ export let mecanismSelection = (recurse,k,v) => {
return rewriteNode(node,nodeValue,explanation,collectMissing)
}
let indexOf = explanation => explanation.nodeValue ? R.findIndex(x => x['nomLaposte'] == explanation.nodeValue, R.values(taux_versement_transport)) : 0
let indexOf = explanation => explanation.nodeValue ? R.findIndex(x => x['nomLaposte'] == explanation.nodeValue, taux_versement_transport) : 0
let indexOffset = 8
let jsx = (nodeValue, explanation) =>
@ -655,7 +655,7 @@ export let mecanismSelection = (recurse,k,v) => {
height={300}
headerHeight={20}
rowHeight={30}
rowCount={R.values(taux_versement_transport).length}
rowCount={taux_versement_transport.length}
scrollToIndex={indexOf(explanation)+indexOffset}
rowStyle={
({ index }) => index == indexOf(explanation) ? { fontWeight: "bold" } : {}
@ -663,7 +663,7 @@ export let mecanismSelection = (recurse,k,v) => {
rowGetter={
({ index }) => {
// transformation de données un peu crade du fichier taux.json qui gagnerait à être un CSV
let line = R.values(taux_versement_transport)[index],
let line = taux_versement_transport[index],
getLastTaux = dataTargetName => {
let lastTaux = R.values(R.path([dataTargetName, 'taux'], line))
return (lastTaux && lastTaux.length && lastTaux[0]) || 0

View File

@ -6,7 +6,7 @@ import possibleVariableTypes from './possibleVariableTypes.yaml'
import marked from './marked'
// TODO - should be in UI, not engine
import taux_versement_transport from '../../règles/rémunération-travail/cotisations/ok/taux.json'
import taux_versement_transport from '../../règles/rémunération-travail/cotisations/ok/liste-taux.json'
// console.log('rawRules', rawRules.map(({espace, nom}) => espace + nom))
/***********************************

View File

@ -242,7 +242,7 @@ describe('analyseSituation with mecanisms', function() {
it('should handle selection', function() {
let stateSelector = (name) => ({"top . code postal":"2"})[name]
let data = {taux_versement_transport: {xyz: {codePostal:1, aot: {taux: {"2019":"1.0"}}}, abc: {codePostal:2, smt: {taux: {"2019":"2.0"}}}}}
let data = {taux_versement_transport: [{codePostal:1, aot: {taux: {"2019":"1.0"}}}, {codePostal:2, smt: {taux: {"2019":"2.0"}}}]}
let rawRules = [
{ espace: "top",
nom: "startHere",
@ -260,7 +260,7 @@ describe('analyseSituation with mecanisms', function() {
it('should handle failed selections', function() {
let stateSelector = (name) => ({"top . code postal":"3"})[name]
let data = {taux_versement_transport: {xyz: {codePostal:1, aot: {taux: {"2019":"1.0"}}}, abc: {codePostal:2, smt: {taux: {"2019":"2.0"}}}}}
let data = {taux_versement_transport: [{codePostal:1, aot: {taux: {"2019":"1.0"}}}, {codePostal:2, smt: {taux: {"2019":"2.0"}}}]}
let rawRules = [
{ espace: "top",
nom: "startHere",