Skip to content
Snippets Groups Projects
Unverified Commit 310c30f5 authored by BITARD Michaël's avatar BITARD Michaël Committed by GitHub
Browse files

feat(stats): ajoute le sel aux statistiques de la métropole (#207)

parent 80afc151
Branches
Tags
No related merge requests found
......@@ -246,12 +246,6 @@ entity "**forets_postgis**" {
""geometry"": //geometry(MultiPolygon,4326) //
}
entity "**globales**" {
+ ""id"": //character varying(255) [PK]//
--
*""valeur"": //boolean //
}
entity "**journaux**" {
+ ""id"": //character varying(255) [PK]//
--
......
This diff is collapsed.
......@@ -8,7 +8,7 @@ import { TitreTypeId } from 'camino-common/src/static/titresTypes'
import {
StatistiquesDGTM,
StatistiquesMinerauxMetauxMetropole,
StatistiquesMinerauxMetauxMetropoleSubstances
StatistiquesMinerauxMetauxMetropoleSels
} from 'camino-common/src/statistiques'
import {
CaminoDate,
......@@ -24,10 +24,16 @@ import { SDOMZoneId, SDOMZoneIds } from 'camino-common/src/static/sdom'
import { userSuper } from '../../database/user-super'
import { titresGet } from '../../database/queries/titres'
import { TitresStatutIds } from 'camino-common/src/static/titresStatuts'
import { isNotNullNorUndefined } from 'camino-common/src/typescript-tools'
import { Regions } from 'camino-common/src/static/region'
import { Departements } from 'camino-common/src/static/departement'
import { SubstancesFiscale } from 'camino-common/src/static/substancesFiscales'
import {
SubstancesFiscale,
SUBSTANCES_FISCALES_IDS
} from 'camino-common/src/static/substancesFiscales'
import {
CodePostal,
Departements,
toDepartementId
} from 'camino-common/src/static/departement'
import { REGION_IDS } from 'camino-common/src/static/region'
const anneeDepartStats = 2015
......@@ -383,7 +389,7 @@ const statistiquesMinerauxMetauxMetropoleInstantBuild = (
instructionExploitation: 0,
valCxm: 0
},
substances: { aloh: {} }
substances: { aloh: {}, nacc: {}, naca: {}, nacb: {} }
}
)
......@@ -397,6 +403,12 @@ const statistiquesMinerauxMetauxMetropoleInstantBuild = (
return statsInstant
}
const sels = [
SUBSTANCES_FISCALES_IDS.sel_ChlorureDeSodiumContenu_,
SUBSTANCES_FISCALES_IDS.sel_ChlorureDeSodium_extraitEnDissolutionParSondage,
SUBSTANCES_FISCALES_IDS.sel_ChlorureDeSodium_extraitParAbattage
] as const
type Sels = typeof sels[number]
export const getMinerauxMetauxMetropolesStats = async (
_req: express.Request,
res: CustomResponse<StatistiquesMinerauxMetauxMetropole>
......@@ -409,10 +421,11 @@ export const getMinerauxMetauxMetropolesStats = async (
}
try {
const titres = await titresGet(
const titresMetropole = await titresGet(
{
domainesIds: ['m'],
typesIds: ['ar', 'ap', 'pr', 'ax', 'px', 'cx']
typesIds: ['ar', 'ap', 'pr', 'ax', 'px', 'cx'],
territoires: 'FR'
},
{
fields: {
......@@ -427,57 +440,214 @@ export const getMinerauxMetauxMetropolesStats = async (
},
userSuper
)
const titresMetropole = titres.filter(titre => {
if (!titre.communes) {
throw new Error('les communes ne sont pas chargées')
}
return titre.communes
.map(({ departementId }) => departementId)
.filter(isNotNullNorUndefined)
.some(
departementId =>
Regions[Departements[departementId].regionId].paysId === 'FR'
)
})
const result =
statistiquesMinerauxMetauxMetropoleInstantBuild(titresMetropole)
for (const substance of Object.keys(
result.substances
) as StatistiquesMinerauxMetauxMetropoleSubstances[]) {
const resultSubstances: { date: CaminoDate; substance: number }[] =
await knex
.select(
'date',
knex.raw(
"titres_activites.contenu->'substancesFiscales'-> ? as substance",
substance
)
)
.from('titres_activites')
.whereRaw(
"titres_activites.contenu -> 'substancesFiscales' \\? ?",
substance
const bauxite = SUBSTANCES_FISCALES_IDS.bauxite
const resultSubstances: { annee: CaminoAnnee; substance: number }[] =
await knex
.select(
'annee',
knex.raw(
"titres_activites.contenu->'substancesFiscales'-> ? as substance",
bauxite
)
)
.from('titres_activites')
.whereRaw(
`titres_activites.contenu -> 'substancesFiscales' \\? '${bauxite}'`
)
const substanceResult = resultSubstances.reduce<
Record<CaminoAnnee, number>
>((acc, dateSubstance) => {
const annee = getAnnee(dateSubstance.date)
if (!acc[annee]) {
acc[annee] = 0
}
acc[annee] += fromUniteFiscaleToUnite(
SubstancesFiscale[substance].uniteId,
dateSubstance.substance
const substanceResult = resultSubstances.reduce<
Record<CaminoAnnee, number>
>((acc, dateSubstance) => {
const annee = dateSubstance.annee
if (!acc[annee]) {
acc[annee] = 0
}
acc[annee] += fromUniteFiscaleToUnite(
SubstancesFiscale[bauxite].uniteId,
dateSubstance.substance
)
return acc
}, {})
// 2022-09-30 Valeurs fournies par Laure dans mattermost : https://mattermost.incubateur.net/camino/pl/3n4y958n6idwbrr4me5rkma1oy
substanceResult[valideAnnee('2009')] = 178.7
substanceResult[valideAnnee('2010')] = 132.302
substanceResult[valideAnnee('2011')] = 117.7
substanceResult[valideAnnee('2012')] = 65.336
substanceResult[valideAnnee('2013')] = 109.602
substanceResult[valideAnnee('2014')] = 71.07
substanceResult[valideAnnee('2015')] = 80.578
substanceResult[valideAnnee('2016')] = 112.445
substanceResult[valideAnnee('2017')] = 131.012
substanceResult[valideAnnee('2018')] = 138.8
substanceResult[valideAnnee('2019')] = 120.76
result.substances[bauxite] = substanceResult
// TODO 2022-10-03 Problème de type postgres (jsonb ou numeric trop gros?), même avec du cast, on obtient des string
const resultSel: {
annee: CaminoAnnee
communeId: CodePostal
nacc: string
naca: string
nacb: string
}[] = await knex
.select(
'titres_activites.annee',
'tc.commune_id',
knex.raw(
"titres_activites.contenu->'substancesFiscales'->'nacc' as nacc"
),
knex.raw(
"titres_activites.contenu->'substancesFiscales'->'naca' as naca"
),
knex.raw(
"titres_activites.contenu->'substancesFiscales'->'nacb' as nacb"
)
)
.distinctOn('titres.slug', 'titres_activites.annee')
.from('titres_activites')
.leftJoin('titres', 'titres.id', 'titres_activites.titre_id')
.joinRaw(
"left join titres_communes tc on tc.titre_etape_id = titres.props_titre_etapes_ids ->> 'points'"
)
.whereRaw("titres_activites.contenu -> 'substancesFiscales' \\? 'nacc'")
.orWhereRaw("titres_activites.contenu -> 'substancesFiscales' \\? 'nacb'")
.orWhereRaw("titres_activites.contenu -> 'substancesFiscales' \\? 'naca'")
.orderBy('titres.slug')
const selsStats = resultSel.reduce<{
[key in Sels]: StatistiquesMinerauxMetauxMetropoleSels
}>(
(acc, stat) => {
const annee = stat.annee
const regionId = Departements[toDepartementId(stat.communeId)].regionId
for (const substance of sels) {
if (typeof stat[substance] !== 'number') {
console.warn(`WTF ${typeof stat[substance]} ${stat[substance]}`)
}
if (!acc[substance][annee]) {
acc[substance][annee] = {}
}
let statSel = acc[substance][annee][regionId]
const valeur = fromUniteFiscaleToUnite(
SubstancesFiscale[substance].uniteId,
parseInt(stat[substance], 10)
)
if (statSel === undefined) {
acc[substance][annee][regionId] = valeur
} else {
statSel += valeur
}
}
return acc
}, {})
},
{
[SUBSTANCES_FISCALES_IDS.sel_ChlorureDeSodiumContenu_]: {},
[SUBSTANCES_FISCALES_IDS.sel_ChlorureDeSodium_extraitEnDissolutionParSondage]:
{},
[SUBSTANCES_FISCALES_IDS.sel_ChlorureDeSodium_extraitParAbattage]: {}
}
)
result.substances[substance] = substanceResult
// Valeurs fournies par Laure : https://trello.com/c/d6YDa4Ao/341-cas-france-relance-dashboard-grand-public-compl%C3%A8te-les-statistiques-v3-sel
selsStats.naca[valideAnnee(2009)] = {
[REGION_IDS['Auvergne-Rhône-Alpes']]: 635.592,
[REGION_IDS['Bourgogne-Franche-Comté']]: 7.684,
[REGION_IDS['Grand Est']]: 2692.7,
[REGION_IDS['Nouvelle-Aquitaine']]: 48.724,
[REGION_IDS["Provence-Alpes-Côte d'Azur"]]: 274.732,
[REGION_IDS.Occitanie]: 867.001
}
selsStats.naca[valideAnnee(2010)] = {
[REGION_IDS['Auvergne-Rhône-Alpes']]: 579.385,
[REGION_IDS['Bourgogne-Franche-Comté']]: 11.645,
[REGION_IDS['Grand Est']]: 2995.599,
[REGION_IDS['Nouvelle-Aquitaine']]: 37.23,
[REGION_IDS["Provence-Alpes-Côte d'Azur"]]: 500.564,
[REGION_IDS.Occitanie]: 990.091
}
selsStats.naca[valideAnnee(2011)] = {
[REGION_IDS['Auvergne-Rhône-Alpes']]: 959.442,
[REGION_IDS['Bourgogne-Franche-Comté']]: 0,
[REGION_IDS['Grand Est']]: 2959.7,
[REGION_IDS['Nouvelle-Aquitaine']]: 32.425,
[REGION_IDS["Provence-Alpes-Côte d'Azur"]]: 421.48,
[REGION_IDS.Occitanie]: 958.849
}
selsStats.naca[valideAnnee(2012)] = {
[REGION_IDS['Auvergne-Rhône-Alpes']]: 936.78,
[REGION_IDS['Bourgogne-Franche-Comté']]: 0,
[REGION_IDS['Grand Est']]: 2426.62,
[REGION_IDS['Nouvelle-Aquitaine']]: 35.97,
[REGION_IDS["Provence-Alpes-Côte d'Azur"]]: 1042.67,
[REGION_IDS.Occitanie]: 797.099
}
selsStats.naca[valideAnnee(2013)] = {
[REGION_IDS['Auvergne-Rhône-Alpes']]: 907.994,
[REGION_IDS['Bourgogne-Franche-Comté']]: 0,
[REGION_IDS['Grand Est']]: 2703.049,
[REGION_IDS['Nouvelle-Aquitaine']]: 37.79,
[REGION_IDS["Provence-Alpes-Côte d'Azur"]]: 1300.854,
[REGION_IDS.Occitanie]: 1010.892
}
selsStats.naca[valideAnnee(2014)] = {
[REGION_IDS['Auvergne-Rhône-Alpes']]: 763.55,
[REGION_IDS['Bourgogne-Franche-Comté']]: 0,
[REGION_IDS['Grand Est']]: 1552.197,
[REGION_IDS['Nouvelle-Aquitaine']]: 34.285,
[REGION_IDS["Provence-Alpes-Côte d'Azur"]]: 843.83,
[REGION_IDS.Occitanie]: 1062.216
}
selsStats.naca[valideAnnee(2015)] = {
[REGION_IDS['Auvergne-Rhône-Alpes']]: 799.949,
[REGION_IDS['Bourgogne-Franche-Comté']]: 0,
[REGION_IDS['Grand Est']]: 2444.74,
[REGION_IDS['Nouvelle-Aquitaine']]: 37.303,
[REGION_IDS["Provence-Alpes-Côte d'Azur"]]: 135.02,
[REGION_IDS.Occitanie]: 1007.542
}
selsStats.naca[valideAnnee(2016)] = {
[REGION_IDS['Auvergne-Rhône-Alpes']]: 830.577,
[REGION_IDS['Bourgogne-Franche-Comté']]: 0,
[REGION_IDS['Grand Est']]: 2377.175,
[REGION_IDS['Nouvelle-Aquitaine']]: 35.841,
[REGION_IDS["Provence-Alpes-Côte d'Azur"]]: 95.859,
[REGION_IDS.Occitanie]: 926.388
}
selsStats.naca[valideAnnee(2017)] = {
[REGION_IDS['Auvergne-Rhône-Alpes']]: 869.676,
[REGION_IDS['Bourgogne-Franche-Comté']]: 0,
[REGION_IDS['Grand Est']]: 2585.934,
[REGION_IDS['Nouvelle-Aquitaine']]: 34.219,
[REGION_IDS["Provence-Alpes-Côte d'Azur"]]: 91.718,
[REGION_IDS.Occitanie]: 1082.021
}
selsStats.naca[valideAnnee(2018)] = {
[REGION_IDS['Auvergne-Rhône-Alpes']]: 870.718,
[REGION_IDS['Bourgogne-Franche-Comté']]: 0,
[REGION_IDS['Grand Est']]: 2481.271,
[REGION_IDS['Nouvelle-Aquitaine']]: 31.71,
[REGION_IDS["Provence-Alpes-Côte d'Azur"]]: 150.524,
[REGION_IDS.Occitanie]: 997.862
}
selsStats.naca[valideAnnee(2019)] = {
[REGION_IDS['Auvergne-Rhône-Alpes']]: 792.394,
[REGION_IDS['Bourgogne-Franche-Comté']]: 0,
[REGION_IDS['Grand Est']]: 2537.412,
[REGION_IDS['Nouvelle-Aquitaine']]: 36.357,
[REGION_IDS["Provence-Alpes-Côte d'Azur"]]: 196.828,
[REGION_IDS.Occitanie]: 997.862
}
result.substances = { ...result.substances, ...selsStats }
res.json(result)
} catch (e) {
......
......@@ -230,28 +230,29 @@ export const titresFiltersQueryModify = (
.map(({ id }) => id)
)
)
}
result.push(
...regions
.filter(({ nom }) =>
nom.toLowerCase().includes(territoire.toLowerCase())
)
.flatMap(({ id }) =>
departements
.filter(({ regionId }) => id === regionId)
.map(({ id }) => id)
)
)
} else {
result.push(
...regions
.filter(({ nom }) =>
nom.toLowerCase().includes(territoire.toLowerCase())
)
.flatMap(({ id }) =>
departements
.filter(({ regionId }) => id === regionId)
.map(({ id }) => id)
)
)
result.push(
...departements
.filter(
({ nom, id }) =>
nom.toLowerCase().includes(territoire.toLowerCase()) ||
id === territoire
)
.map(({ id }) => id)
)
result.push(
...departements
.filter(
({ nom, id }) =>
nom.toLowerCase().includes(territoire.toLowerCase()) ||
id === territoire
)
.map(({ id }) => id)
)
}
return result
}
......
import { isRegionId } from './region'
test('isRegionId', () => {
expect(isRegionId('wolf')).toBe(false)
expect(isRegionId('28')).toBe(true)
})
......@@ -29,6 +29,12 @@ export interface Region<T = RegionId> {
export type RegionId = typeof REGION_IDS[keyof typeof REGION_IDS]
export const regionsIds = Object.values(REGION_IDS)
export const isRegionId = (regionId: string): regionId is RegionId => {
return regionsIds.includes(regionId)
}
export const Regions: { [key in RegionId]: Region<key> } = {
'01': { id: '01', nom: 'Guadeloupe', paysId: 'GP' },
'02': { id: '02', nom: 'Martinique', paysId: 'MQ' },
......
......@@ -27,9 +27,9 @@ export const SUBSTANCES_FISCALES_IDS = {
'oxyde de lithium': 'lith',
manganèse: 'mang',
molybdène: 'moly',
'sel (chlorure de sodium) extrait par abattage': 'naca',
'sel (chlorure de sodium) extrait en dissolution par sondage': 'nacb',
'sel (chlorure de sodium contenu)': 'nacc',
sel_ChlorureDeSodium_extraitParAbattage: 'naca',
sel_ChlorureDeSodium_extraitEnDissolutionParSondage: 'nacb',
sel_ChlorureDeSodiumContenu_: 'nacc',
plomb: 'plom',
soufre: 'souf',
uranium: 'uran',
......
import { CaminoAnnee } from './date'
import { AdministrationTypeId } from './static/administrations'
import { RegionId } from './static/region'
import { SDOMZoneIds } from './static/sdom'
import { SubstanceFiscaleId } from './static/substancesFiscales'
import { SUBSTANCES_FISCALES_IDS } from './static/substancesFiscales'
export interface QuantiteParMois {
mois: string
......@@ -51,7 +52,8 @@ export interface StatistiquesDGTM {
delais: Record<CaminoAnnee, { delaiInstructionEnJours: number[]; delaiCommissionDepartementaleEnJours: number[] }>
}
export type StatistiquesMinerauxMetauxMetropoleSubstances = Extract<SubstanceFiscaleId, 'aloh'>
export type StatistiquesMinerauxMetauxMetropoleSels = { [key in CaminoAnnee]: { [key in RegionId]?: number } }
export interface StatistiquesMinerauxMetauxMetropole {
surfaceExploration: number
surfaceExploitation: number
......@@ -62,6 +64,9 @@ export interface StatistiquesMinerauxMetauxMetropole {
valCxm: number
}
substances: {
[key in StatistiquesMinerauxMetauxMetropoleSubstances]: Record<CaminoAnnee, number>
[SUBSTANCES_FISCALES_IDS.bauxite]: Record<CaminoAnnee, number>
[SUBSTANCES_FISCALES_IDS.sel_ChlorureDeSodiumContenu_]: StatistiquesMinerauxMetauxMetropoleSels
[SUBSTANCES_FISCALES_IDS.sel_ChlorureDeSodium_extraitEnDissolutionParSondage]: StatistiquesMinerauxMetauxMetropoleSels
[SUBSTANCES_FISCALES_IDS.sel_ChlorureDeSodium_extraitParAbattage]: StatistiquesMinerauxMetauxMetropoleSels
}
}
import PureMinerauxMetauxMetropole from './pure-mineraux-metaux-metropole.vue'
import { Meta, Story } from '@storybook/vue3'
import { StatistiquesMinerauxMetauxMetropole } from 'camino-common/src/statistiques'
import { valideAnnee } from 'camino-common/src/date'
const meta: Meta = {
title: 'Components/NoStoryshots/Statistiques/MinerauxMetauxMetropole',
......@@ -24,15 +25,167 @@ export const Default = Template.bind({})
Default.args = {
getStats: () =>
Promise.resolve({
surfaceExploitation: 21314,
substances: {
aloh: {
[valideAnnee('2009')]: 178.7,
[valideAnnee('2010')]: 132.302,
[valideAnnee('2011')]: 117.7,
[valideAnnee('2012')]: 65.336,
[valideAnnee('2013')]: 109.602,
[valideAnnee('2014')]: 71.07,
[valideAnnee('2015')]: 80.578,
[valideAnnee('2016')]: 112.445,
[valideAnnee('2017')]: 131.012,
[valideAnnee('2018')]: 138.8,
[valideAnnee('2019')]: 120.76,
[valideAnnee('2020')]: 123.49600000000001,
[valideAnnee('2021')]: 142.764
},
naca: {
[valideAnnee('2009')]: {
'27': 7.684,
'44': 2692.7,
'75': 48.724,
'76': 867.001,
'84': 635.592,
'93': 274.732
},
[valideAnnee('2010')]: {
'27': 11.645,
'44': 2995.599,
'75': 37.23,
'76': 990.091,
'84': 579.385,
'93': 500.564
},
[valideAnnee('2011')]: {
'27': 0,
'44': 2959.7,
'75': 32.425,
'76': 958.849,
'84': 959.442,
'93': 421.48
},
[valideAnnee('2012')]: {
'27': 0,
'44': 2426.62,
'75': 35.97,
'76': 797.099,
'84': 936.78,
'93': 1042.67
},
[valideAnnee('2013')]: {
'27': 0,
'44': 2703.049,
'75': 37.79,
'76': 1010.892,
'84': 907.994,
'93': 1300.854
},
[valideAnnee('2014')]: {
'27': 0,
'44': 1552.197,
'75': 34.285,
'76': 1062.216,
'84': 763.55,
'93': 843.83
},
[valideAnnee('2015')]: {
'27': 0,
'44': 2444.74,
'75': 37.303,
'76': 1007.542,
'84': 799.949,
'93': 135.02
},
[valideAnnee('2016')]: {
'27': 0,
'44': 2377.175,
'75': 35.841,
'76': 926.388,
'84': 830.577,
'93': 95.859
},
[valideAnnee('2017')]: {
'27': 0,
'44': 2585.934,
'75': 34.219,
'76': 1082.021,
'84': 869.676,
'93': 91.718
},
[valideAnnee('2018')]: {
'27': 0,
'44': 2481.271,
'75': 31.71,
'76': 997.862,
'84': 870.718,
'93': 150.524
},
[valideAnnee('2019')]: {
'27': 0,
'44': 2537.412,
'75': 36.357,
'76': 997.862,
'84': 792.394,
'93': 196.828
},
[valideAnnee('2020')]: {
'44': 0,
'75': 0,
'76': 0,
'84': 0,
'93': 0
},
[valideAnnee('2021')]: {
'44': 0,
'75': 0,
'76': 0,
'84': 0,
'93': 0
}
},
nacb: {
[valideAnnee('2020')]: {
'44': 0,
'75': 1.0224,
'76': 1089.707,
'84': 0,
'93': 0
},
[valideAnnee('2021')]: {
'44': 0,
'75': 1.8883,
'76': 0,
'84': 0,
'93': 0
}
},
nacc: {
[valideAnnee('2020')]: {
'44': 0,
'75': 0,
'76': 0,
'84': 470.054,
'93': 215.397
},
[valideAnnee('2021')]: {
'44': 0,
'75': 0,
'76': 1212.682,
'84': 430.545,
'93': 194.664
}
}
},
surfaceExploitation: 21050,
surfaceExploration: 297966,
titres: {
instructionExploitation: 1,
instructionExploitation: 2,
instructionExploration: 11,
valCxm: 20,
valCxm: 19,
valPrm: 3
},
substances: { aloh: { 2021: 123496000, 2022: 142764000 } }
}
})
}
......
......@@ -190,6 +190,9 @@
<LoadingElement v-slot="{ item }" :data="data">
<BarChart :chartConfiguration="bauxiteChartConfiguration(item)" />
</LoadingElement>
<LoadingElement v-slot="{ item }" :data="data">
<BarChart :chartConfiguration="selsChartConfiguration(item)" />
</LoadingElement>
</div>
</template>
......@@ -202,9 +205,12 @@ import { numberFormat } from '@/utils/number-format'
import { CaminoAnnee, isAnnee } from 'camino-common/src/date'
import { StatistiquesMinerauxMetauxMetropole } from 'camino-common/src/statistiques'
import { ref, onMounted } from 'vue'
import { ChartConfiguration, ChartData } from 'chart.js'
import { ChartConfiguration, ChartData, ChartDataset } from 'chart.js'
import { SubstancesFiscale } from 'camino-common/src/static/substancesFiscales'
import { Unites } from 'camino-common/src/static/unites'
import { onlyUnique } from 'camino-common/src/typescript-tools'
import { RegionId, isRegionId, Regions } from 'camino-common/src/static/region'
import { nextColor } from '../_charts/utils'
const data = ref<AsyncData<StatistiquesMinerauxMetauxMetropole>>({
status: 'LOADING'
})
......@@ -248,6 +254,69 @@ const bauxiteChartConfiguration = (
}
}
const selsChartConfiguration = (
data: StatistiquesMinerauxMetauxMetropole
): ChartConfiguration => {
const annees: CaminoAnnee[] = [
...Object.keys(data.substances.naca),
...Object.keys(data.substances.nacb),
...Object.keys(data.substances.nacc)
]
.filter(isAnnee)
.filter(onlyUnique)
const regionsIds: RegionId[] = annees
.flatMap(annee => [
...Object.keys(data.substances?.naca[annee] ?? {}),
...Object.keys(data.substances?.nacb[annee] ?? {}),
...Object.keys(data.substances?.nacc[annee] ?? {})
])
.filter(isRegionId)
.filter(onlyUnique)
const datasetByRegion: ChartDataset[] = regionsIds.map((regionId, index) => {
const label = Regions[regionId].nom
const sum = (annee: CaminoAnnee) =>
(data.substances.naca[annee]?.[regionId] ?? 0) +
(data.substances.nacb[annee]?.[regionId] ?? 0) +
(data.substances.nacc[annee]?.[regionId] ?? 0)
return {
type: 'bar',
label: label[0].toUpperCase() + label.substring(1),
data: annees.map(sum),
backgroundColor: nextColor(index)
}
})
const chartData: ChartData = {
labels: annees,
datasets: datasetByRegion
}
return {
type: 'bar',
data: chartData,
options: {
locale: 'fr-FR',
responsive: true,
plugins: {
title: {
display: true,
text: 'Production Sels'
}
},
interaction: {
mode: 'index',
intersect: false
},
scales: {
x: {
stacked: true
},
y: { stacked: true }
}
}
}
}
onMounted(async () => {
try {
const stats = await props.getStats()
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment