|
1 |
| -export const TOTAL_SCORE_COMPLETION: number = 41; |
| 1 | +import { LieuMediationNumeriqueDetailsPresentation } from '../../../presenters'; |
2 | 2 |
|
3 |
| -export type ScoreDetail = { |
4 |
| - score: number; |
5 |
| - name: string; |
6 |
| -}; |
7 |
| - |
8 |
| -export type ScorePresence = { |
9 |
| - name: string; |
10 |
| - presence: boolean; |
11 |
| -}; |
| 3 | +type Join<K, P> = K extends string | number ? (P extends string | number ? `${K}.${P}` : never) : never; |
12 | 4 |
|
13 |
| -type ScoreCompletion = { |
14 |
| - [key: string]: ScoreDetail | ScoreContact | ScorePresentation | ScoreLocalisation; |
15 |
| -}; |
| 5 | +type Paths<T> = T extends object |
| 6 | + ? { |
| 7 | + [K in keyof T]-?: K extends string | number ? `${K}` | Join<K, Paths<T[K]>> : never; |
| 8 | + }[keyof T] |
| 9 | + : never; |
16 | 10 |
|
17 |
| -type ScoreContact = { |
18 |
| - telephone: ScoreDetail; |
19 |
| - courriel: ScoreDetail; |
20 |
| - site_web: ScoreDetail; |
| 11 | +export type ScoreCoefficientField = { |
| 12 | + coefficient: number; |
| 13 | + name: string; |
| 14 | + field: Paths<LieuMediationNumeriqueDetailsPresentation>; |
21 | 15 | };
|
22 | 16 |
|
23 |
| -type ScorePresentation = { |
24 |
| - presentation_detail: ScoreDetail; |
25 |
| - presentation_resume: ScoreDetail; |
26 |
| -}; |
| 17 | +export type ScorePresenceField = { presence: boolean; name: string; field: Paths<LieuMediationNumeriqueDetailsPresentation> }; |
27 | 18 |
|
28 |
| -type ScoreLocalisation = { |
29 |
| - latitude: ScoreDetail; |
30 |
| - longitude: ScoreDetail; |
31 |
| -}; |
| 19 | +export const SCORE_FIELDS: ScoreCoefficientField[] = [ |
| 20 | + { coefficient: 2, name: 'Nom', field: 'adresse' }, |
| 21 | + { coefficient: 2, name: 'Adresse', field: 'adresse' }, |
| 22 | + { coefficient: 2, name: 'Commune', field: 'commune' }, |
| 23 | + { coefficient: 2, name: 'Code postal', field: 'code_postal' }, |
| 24 | + { coefficient: 2, name: 'Services', field: 'services' }, |
| 25 | + { coefficient: 2, name: 'Horaires', field: 'horaires' }, |
| 26 | + { coefficient: 2, name: 'Typologie', field: 'typologies' }, |
| 27 | + { coefficient: 2, name: 'Téléphone', field: 'contact.telephone' }, |
| 28 | + { coefficient: 2, name: 'Courriel', field: 'contact.courriel' }, |
| 29 | + { coefficient: 2, name: 'Site web', field: 'contact.site_web' }, |
| 30 | + { coefficient: 2, name: 'Présentation détaillée', field: 'presentation.detail' }, |
| 31 | + { coefficient: 2, name: 'Présentation résumée', field: 'presentation.resume' }, |
| 32 | + { coefficient: 2, name: 'Date de mise à jour', field: 'date_maj' }, |
| 33 | + { coefficient: 2, name: 'Publics accueillis', field: 'publics_accueillis' }, |
| 34 | + { coefficient: 2, name: 'Conditions d’accès', field: 'conditions_acces' }, |
| 35 | + { coefficient: 2, name: 'Label nationaux', field: 'labels_nationaux' }, |
| 36 | + { coefficient: 2, name: 'Autres labels', field: 'labels_autres' }, |
| 37 | + { coefficient: 2, name: 'Modalités d’accompagnement', field: 'modalites_accompagnement' }, |
| 38 | + { coefficient: 1, name: 'Accessibilité', field: 'accessibilite' }, |
| 39 | + { coefficient: 1, name: 'Latitude', field: 'localisation.latitude' }, |
| 40 | + { coefficient: 1, name: 'Longitude', field: 'localisation.longitude' }, |
| 41 | + { coefficient: 1, name: 'Prise de RDV', field: 'prise_rdv' }, |
| 42 | + { coefficient: 1, name: 'Source', field: 'source' } |
| 43 | + // todo: ajouter le pivot |
| 44 | +]; |
32 | 45 |
|
33 |
| -export const scoreCompletionTable: ScoreCompletion = { |
34 |
| - nom: { score: 2, name: 'Nom' }, |
35 |
| - adresse: { score: 2, name: 'Adresse' }, |
36 |
| - commune: { score: 2, name: 'Commune' }, |
37 |
| - code_postal: { score: 2, name: 'Code postal' }, |
38 |
| - services: { score: 2, name: 'Services' }, |
39 |
| - horaires: { score: 2, name: 'Horaires' }, |
40 |
| - typologies: { score: 2, name: 'Typologie' }, |
41 |
| - contact: { |
42 |
| - telephone: { score: 2, name: 'Téléphone' }, |
43 |
| - courriel: { score: 2, name: 'Courriel' }, |
44 |
| - site_web: { score: 2, name: 'Site web' } |
45 |
| - }, |
46 |
| - presentation: { |
47 |
| - presentation_detail: { score: 2, name: 'Présentation détaillée' }, |
48 |
| - presentation_resume: { score: 2, name: 'Présentation résumée' } |
49 |
| - }, |
50 |
| - date_maj: { score: 2, name: 'Date de mise à jour' }, |
51 |
| - publics_accueillis: { score: 2, name: 'Publics accueillis' }, |
52 |
| - conditions_acces: { score: 2, name: 'Conditions d’accès' }, |
53 |
| - labels_nationaux: { score: 2, name: 'Label nationaux' }, |
54 |
| - autres_labels: { score: 2, name: 'Autres labels' }, |
55 |
| - modalites_accompagnement: { score: 2, name: 'Modalités d’accompagnement' }, |
56 |
| - accessibilite: { score: 1, name: 'Accessibilité' }, |
57 |
| - localisation: { |
58 |
| - latitude: { score: 1, name: 'Latitude' }, |
59 |
| - longitude: { score: 1, name: 'Longitude' } |
60 |
| - }, |
61 |
| - prise_rdv: { score: 1, name: 'Prise de RDV' }, |
62 |
| - source: { score: 1, name: 'Source' }, |
63 |
| - pivot: { score: 2, name: 'Pivot' } |
64 |
| -}; |
| 46 | +export const TOTAL_SCORE_COEFFICIENTS: number = SCORE_FIELDS.reduce( |
| 47 | + (totalCoefficients: number, { coefficient }: ScoreCoefficientField) => totalCoefficients + coefficient, |
| 48 | + 0 |
| 49 | +); |
0 commit comments