forked from BaseAdresseNationale/codes-postaux
-
Notifications
You must be signed in to change notification settings - Fork 0
/
full.js
92 lines (73 loc) · 3.13 KB
/
full.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
const {groupBy, pick} = require('lodash')
const codesPostaux = require('./codes-postaux-full.json')
const voiesIndex = groupBy(codesPostaux, item => buildIdVoie(item.codeAncienneCommune || item.codeCommune, item.codeVoie))
function buildIdVoie(codeCommune, codeVoie) {
return `${codeCommune}-${codeVoie}`
}
function parseIdVoie(idVoie) {
if (!idVoie) {
return {codeVoie: 'XXXX'}
}
if (idVoie.length === 4) {
return {codeVoie: idVoie}
}
return {codeAncienneCommune: idVoie.substr(0, 5), codeVoie: idVoie.substr(6, 4)}
}
function superieurBorneInf(numero, repetition, borneInferieure) {
if (numero === borneInferieure.numero) {
if (!repetition && !borneInferieure.repetition) return true
if (!repetition && borneInferieure.repetition) return false
if (repetition && !borneInferieure.repetition) return true
return repetition >= borneInferieure.repetition
}
if (numero > borneInferieure.numero) return true
if (numero < borneInferieure.numero) return false
}
function inferieurBorneSup(numero, repetition, borneSuperieure) {
if (numero === borneSuperieure.numero) {
if (!repetition && !borneSuperieure.repetition) return true
if (!repetition && borneSuperieure.repetition) return true
if (repetition && !borneSuperieure.repetition) return false
return repetition <= borneSuperieure.repetition
}
if (numero > borneSuperieure.numero) return false
if (numero < borneSuperieure.numero) return true
}
function pariteOK(numero, codeParite) {
const modulo = numero % 2
return (modulo === 0 && codeParite === '0') || (modulo === 1 && codeParite === '1')
}
function formatResult(entry) {
return pick(entry, 'codePostal', 'libelleAcheminement', 'codeCommune', 'nomCommune', 'codeAncienneCommune')
}
function findCodePostal(codeCommune, idVoie, numero, repetition) {
if (!codeCommune) {
throw new Error('codeCommune is required')
}
if (idVoie && idVoie.length !== 10 && idVoie.length !== 4) {
throw new Error('codeVoie doit être de la forme XXXX ou YYYYY-XXXX')
}
const {codeVoie, codeAncienneCommune} = parseIdVoie(idVoie)
const codeCommuneVoie = codeAncienneCommune || codeCommune
const idVoieMatch = buildIdVoie(codeCommuneVoie, codeVoie)
if (idVoieMatch in voiesIndex) {
const entries = voiesIndex[idVoieMatch]
if (entries.length === 1) return formatResult(entries[0])
const parsedNumero = Number.parseInt(numero, 10)
const candidate = entries.find(entry => {
return pariteOK(parsedNumero, entry.codeParite) &&
superieurBorneInf(parsedNumero, repetition, entry.borneInferieure) &&
inferieurBorneSup(parsedNumero, repetition, entry.borneSuperieure)
})
if (candidate) return formatResult(candidate)
}
// Si on ne trouve pas on réessaie dans l'ancienne commune mais sans précision de codeVoie
if (!idVoieMatch.endsWith('XXXX') && codeAncienneCommune) {
return findCodePostal(codeCommune, buildIdVoie(codeAncienneCommune, 'XXXX'))
}
// Si on ne trouve toujours pas on essaye sur la commune parente
if (idVoieMatch !== buildIdVoie(codeCommune, 'XXXX')) {
return findCodePostal(codeCommune)
}
}
module.exports = {findCodePostal}