105 lines
2.9 KiB
TypeScript
105 lines
2.9 KiB
TypeScript
import { writeFileSync } from 'fs'
|
|
import { join } from 'path'
|
|
import { fileURLToPath } from 'url'
|
|
|
|
import { Data as RawApeData } from '../données-NAF-CPF-APE/convert-pdf.js'
|
|
import rawApeData from '../données-NAF-CPF-APE/output.json' assert { type: 'json' }
|
|
import { Out as EtablissementsData } from '../nombre-etablissements-par-code-ape-et-departement/convert-json.js'
|
|
import rawEtablissementsData from '../nombre-etablissements-par-code-ape-et-departement/output.json' assert { type: 'json' }
|
|
|
|
const __dirname = fileURLToPath(new URL('.', import.meta.url))
|
|
|
|
const OUTPUT_JSON_PATH = join(__dirname, './output.json')
|
|
const OUTPUT_MIN_JSON_PATH = join(__dirname, './output.min.json')
|
|
|
|
const apeData = rawApeData as RawApeData[]
|
|
const etablissementsData = rawEtablissementsData as EtablissementsData
|
|
|
|
interface ApeData {
|
|
codeApe: string
|
|
title: string
|
|
data: string[]
|
|
contenuCentral: string[]
|
|
contenuAnnexe: string[]
|
|
contenuExclu: string[]
|
|
}
|
|
|
|
type NbEtablissement2021Index = number
|
|
|
|
export interface Output {
|
|
/**
|
|
* Données textuel pour chaque code APE
|
|
*/
|
|
apeData: ApeData[]
|
|
|
|
/**
|
|
* Nombre d'établissement par département et par code APE,
|
|
* l'index de ce tableau correspond au index dans indexByCodeApe et indexByCodeDepartement.
|
|
* Cela permet de trouver le nombre d'établissement en 2021 avec un couple code APE + code d'un département.
|
|
*/
|
|
nbEtablissements2021: number[]
|
|
indexByCodeApe: { [codeAPE: string]: NbEtablissement2021Index[] }
|
|
indexByCodeDepartement: {
|
|
[codeDepartement: string]: NbEtablissement2021Index[]
|
|
}
|
|
}
|
|
|
|
const sousClasses = apeData.filter(({ type }) => type === 'sousClasse')
|
|
|
|
const index: Record<string, number> = sousClasses.reduce(
|
|
(obj, val, i) => ({ ...obj, [val.code]: i }),
|
|
{}
|
|
)
|
|
|
|
const addContenuExcluToContenuCentral: number[][] = []
|
|
const output: Output = {
|
|
apeData: sousClasses.map(
|
|
(
|
|
{
|
|
code: codeApe,
|
|
title,
|
|
data,
|
|
contenuCentral,
|
|
contenuAnnexe,
|
|
contenuExclu,
|
|
},
|
|
i
|
|
) => {
|
|
contenuExclu.forEach((exclu, j) => {
|
|
const match = exclu.match(/\(cf\. (?:([0-9A-Z.]+)(?:, )?)+\)/)
|
|
if (match) {
|
|
const codes = [...match]
|
|
codes.shift()
|
|
codes
|
|
.map((k) => index?.[k])
|
|
.filter((x) => typeof x !== 'undefined')
|
|
.forEach((index) => {
|
|
addContenuExcluToContenuCentral.push([i, j, index])
|
|
})
|
|
}
|
|
})
|
|
|
|
return {
|
|
codeApe,
|
|
title,
|
|
data,
|
|
contenuCentral,
|
|
contenuAnnexe,
|
|
contenuExclu,
|
|
}
|
|
}
|
|
),
|
|
nbEtablissements2021: etablissementsData.data.map(
|
|
({ nombre_d_etablissements_2021: nbEtablissements }) => nbEtablissements
|
|
),
|
|
indexByCodeApe: etablissementsData.indexByCodeApe,
|
|
indexByCodeDepartement: etablissementsData.indexByCodeDepartement,
|
|
}
|
|
|
|
addContenuExcluToContenuCentral.forEach(([i, j, index]) => {
|
|
output.apeData[index].contenuCentral.push(output.apeData[i].contenuExclu[j])
|
|
})
|
|
|
|
writeFileSync(OUTPUT_JSON_PATH, JSON.stringify(output, null, 2))
|
|
writeFileSync(OUTPUT_MIN_JSON_PATH, JSON.stringify(output))
|