UNPKG

@gouvfr-anct/lieux-de-mediation-numerique

Version:

📚 Bibliothèque pour la modélisation des lieux de médiation numérique respectant le standard du schéma de données des lieux de médiation numériques

51 lines (50 loc) • 4.17 kB
import { Id, Nom, Pivot } from '../../../models'; import { MandatorySiretOrRnaError } from './errors/mandatory-siret-or-rna.error'; import { accessibiliteFromDataInclusion, adresseFromDataInclusion, conditionsAccesFromDataInclusion, contactFromDataInclusion, horairesFromDataInclusion, labelsFromDataInclusion, localisationFromDataInclusion, mergeFrais, mergeModesAccueil, mergeModesOrientationAccompagnateur, mergeModesOrientationBeneficiaire, mergePriseRdv, mergeProfils, mergeThematiques, mergeTypes, modalitesAccesFromDataInclusion, modalitesAccompagnementFromDataInclusion, presentationFromDataInclusion, priseEnChargeSpecifiqueFromDataInclusion, priseRdvFromDataInclusion, publicSpecifiquementAdresseFromDataInclusion, servicesFromDataInclusion, sourceFromDataInclusion, structureParenteFromDataInclusion, TYPOLOGIES_MAP, typologiesFromDataInclusion } from './from-schema-data-inclusion-fields'; const toSingleService = (mergedService, service) => ({ ...mergedService, ...mergeThematiques(mergedService.thematiques, service.thematiques), ...mergeFrais(mergedService.frais, service.frais), ...mergeProfils(mergedService.profils, service.profils), ...mergeTypes(mergedService.types, service.types), ...mergeModesAccueil(mergedService.modes_accueil, service.modes_accueil), ...mergePriseRdv(mergedService.prise_rdv, service.prise_rdv), ...mergeModesOrientationBeneficiaire(mergedService.modes_orientation_beneficiaire, service.modes_orientation_beneficiaire), ...mergeModesOrientationAccompagnateur(mergedService.modes_orientation_accompagnateur, service.modes_orientation_accompagnateur) }); export const mergeServices = (services, structure) => services.reduce(toSingleService, { id: `${structure.id}-mediation-numerique`, nom: 'Médiation numérique', source: structure.source ?? '', structure_id: structure.id, thematiques: [] }); const throwMandatorySiretOrRnaError = () => { throw new MandatorySiretOrRnaError(); }; const ifAnyPublicSpecifiquementAdresseInArray = (publicSpecifiquementAdresse) => ((publicSpecifiquementAdresse.publics_specifiquement_adresses?.length ?? 0) > 0 ? publicSpecifiquementAdresse : {}); const ifAnyPriseEnChargeSpecifiqueInArray = (priseEnChargeSpecifique) => ((priseEnChargeSpecifique.prise_en_charge_specifique?.length ?? 0) > 0 ? priseEnChargeSpecifique : {}); const fromSchemaDataInclusionItem = (structure, service) => ({ id: Id(structure.id), nom: Nom(structure.nom), pivot: Pivot(structure.siret ?? structure.rna ?? throwMandatorySiretOrRnaError()), ...adresseFromDataInclusion(structure), ...localisationFromDataInclusion(structure.latitude, structure.longitude), ...servicesFromDataInclusion(service.thematiques), date_maj: new Date(structure.date_maj), ...contactFromDataInclusion(structure.courriel, structure.telephone, structure.site_web), ...sourceFromDataInclusion(structure.source), ...accessibiliteFromDataInclusion(structure.accessibilite), ...conditionsAccesFromDataInclusion(service.frais), ...horairesFromDataInclusion(structure.horaires_ouverture), ...labelsFromDataInclusion(structure.labels_nationaux, structure.labels_autres), ...modalitesAccompagnementFromDataInclusion(service.types, service.modes_accueil), ...modalitesAccesFromDataInclusion([...(service.modes_orientation_beneficiaire ?? []), ...(service.modes_orientation_accompagnateur ?? [])], priseRdvFromDataInclusion(service.prise_rdv)), ...presentationFromDataInclusion(structure.presentation_detail, structure.presentation_resume), ...priseRdvFromDataInclusion(service.prise_rdv), ...ifAnyPublicSpecifiquementAdresseInArray(publicSpecifiquementAdresseFromDataInclusion(service.profils)), ...ifAnyPriseEnChargeSpecifiqueInArray(priseEnChargeSpecifiqueFromDataInclusion(service.profils)), ...structureParenteFromDataInclusion(structure.structure_parente), ...(structure.typologie == null ? {} : typologiesFromDataInclusion(TYPOLOGIES_MAP.get(structure.typologie))) }); export const fromSchemaDataInclusion = (services, structure) => fromSchemaDataInclusionItem(structure, mergeServices(services, structure));