Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Refacto dossier résumé #153

Open
wants to merge 37 commits into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
37 commits
Select commit Hold shift + click to select a range
dd78e99
Remplacement de dossier.nom_dossier par dossier.nom
DavidBruant Jan 13, 2025
34efd96
Début définition DossierRésumé
DavidBruant Jan 14, 2025
efb70cd
Ajustement DossierComplet
DavidBruant Jan 14, 2025
4916fa4
DossierComplet
DavidBruant Jan 14, 2025
c030af3
Application du type DossierRésumé au composant SuiviInstruction
DavidBruant Jan 14, 2025
2143771
Configuration de Kanel - Ajout de Buffer pour pg_catalog.bytea
DavidBruant Jan 14, 2025
e1ef3ff
début Dossier.svelte
DavidBruant Jan 14, 2025
c840c7d
Buffer pour le contenu de fichier
DavidBruant Jan 14, 2025
add0cfa
VNementPhaseDossier.phase devient de type DossierPhase
DavidBruant Jan 14, 2025
eb44c99
Applique DossierComplet à Dossier.svelte
DavidBruant Jan 14, 2025
4315540
Application du type DossierComplet à DossierDescription
DavidBruant Jan 14, 2025
92a4d79
Application de DossierComplet à DossierMessagerie
DavidBruant Jan 14, 2025
e39666b
Application du type DossierComplet à DossierProcédure
DavidBruant Jan 14, 2025
47f4796
fixes
DavidBruant Jan 14, 2025
8b2d824
typage de phase dans les actions dossier
DavidBruant Jan 14, 2025
f66e888
Utiliser le fichier des espèces protégées directement dans RédactionA…
DavidBruant Jan 14, 2025
ddcfae9
Exporter type DossierProchaineActionAttenduePar
DavidBruant Jan 14, 2025
c60faf2
Ajustement du store autour de DossierRésumé/Complet
DavidBruant Jan 14, 2025
229b83d
Corrige erreurs types action/main.js
DavidBruant Jan 15, 2025
59df598
ajustements type actions/dossier.js
DavidBruant Jan 15, 2025
5797d83
Charger uniquement un DossierComplet dans la route Dossier.js
DavidBruant Jan 15, 2025
b54947f
Charger un unique dossier dans les routes qui concernent un dossier u…
DavidBruant Jan 15, 2025
3fb24eb
Ajustement de types pour TmpStats
DavidBruant Jan 15, 2025
9e5589f
Changement de signature de PitchouInstructeurCapabilities.listerDossi…
DavidBruant Jan 15, 2025
1fc843e
On arrive à ré-afficher le tableau de suivi à partir des DossierRésumés
DavidBruant Jan 15, 2025
da01472
Consolider le type PitchouInstructeurCapabilities
DavidBruant Jan 16, 2025
6803923
Créer cap recupérerDossierComplet
DavidBruant Jan 16, 2025
53e56ba
mini-refacto dossiersAccessibleViaCap
DavidBruant Jan 17, 2025
47bdc25
fix type appel store.mutations.setCapabilities
DavidBruant Jan 17, 2025
70044e2
Le dossier complet est envoyé côté client
DavidBruant Jan 17, 2025
f99da42
Ajusement de la cap getDossierComplet pour qu'elle fournisse un Array…
DavidBruant Jan 17, 2025
415da1a
Réécriture du typeguard isDossierRésumé
DavidBruant Jan 17, 2025
f1e17bc
c'est bon côté client pour les espèces impactées
DavidBruant Jan 17, 2025
6fde478
typo
DavidBruant Jan 17, 2025
336c7b1
pleasing svelte-check
DavidBruant Jan 17, 2025
7f3e6f6
🎶 Le froid est pour moi le prix de la liberté ❄️
DavidBruant Jan 22, 2025
e8945b1
Refonte de la modification de dossier
DavidBruant Jan 22, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
43 changes: 43 additions & 0 deletions .kanelrc.cjs
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@

function ÉvènementPhaseDossier_phase_typeDossierPhase(output){
const ÉvènementPhaseDossierKey = 'scripts/types/database/public/ÉvènementPhaseDossier'

const {declarations} = output[ÉvènementPhaseDossierKey]

const int0 = declarations[0]
const prop0 = int0.properties[0]
//console.log('prop0', prop0)

for(const {properties} of declarations){
for(const prop of properties){
if(prop.name === 'phase'){
prop.typeImports = [
{
name: 'DossierPhase',
path: 'scripts/types/API_Pitchou.ts',
isAbsolute: false,
isDefault: false,
importAsType: true
}
]
prop.typeName = 'DossierPhase'
}
}

//console.log('properties', intface.properties)
}

return output
}



module.exports = {
customTypeMap: {
'pg_catalog.bytea': 'Buffer'
},

preRenderHooks: [
ÉvènementPhaseDossier_phase_typeDossierPhase
]
}
Empty file.
2 changes: 1 addition & 1 deletion outils/archive/annotations-onagre.js
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@ const tableauSuiviPath = join(import.meta.filename, '../../data/Tableaux de suiv
*/
function trouverDossierEnBDDCorrespondant(dossiersStockésEnBaseDeDonnées, dossierPartiel88444DepuisTableauSuivi){
const nomProjetDossierCandidat = dossierPartiel88444DepuisTableauSuivi['Nom du projet']
const dossiersAvecCeNom = dossiersStockésEnBaseDeDonnées.filter(d => d.nom_dossier === nomProjetDossierCandidat)
const dossiersAvecCeNom = dossiersStockésEnBaseDeDonnées.filter(d => d.nom === nomProjetDossierCandidat)
if(dossiersAvecCeNom.length === 0)
return undefined

Expand Down
87 changes: 87 additions & 0 deletions scripts/commun/outils-dossiers.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,87 @@

//@ts-expect-error https://github.com/microsoft/TypeScript/issues/60908
/** @import {DossierComplet, DossierRésumé} from '../types/API_Pitchou.ts' */

/**
* @param {DossierComplet} dossierComplet
* @returns {DossierRésumé}
*/
export function DossierCompletToDossierRésumé(dossierComplet) {
const {
// Propriétés directement copiées
id,
number_demarches_simplifiées,
nom,
activité_principale,
enjeu_politique,
enjeu_écologique,
rattaché_au_régime_ae,
historique_identifiant_demande_onagre,
historique_date_réception_ddep,
date_dépôt,
historique_date_signature_arrêté_préfectoral,

// Localisation (déjà au bon format)
communes,
départements,
régions,

// Personnes impliquées
déposant_nom,
déposant_prénoms,
demandeur_personne_physique_nom,
demandeur_personne_physique_prénoms,
demandeur_personne_morale_raison_sociale,
demandeur_personne_morale_siret,

// Prochaine action
prochaine_action_attendue_par,

// Évènements pour extraire la phase
évènementsPhase,
} = dossierComplet;

// Trouver la phase la plus récente
// PPP à corriger
const phaseActuelle = évènementsPhase[0].phase

/** @type {DossierRésumé} */
const dossierRésumé = {
// Propriétés simples
id,
number_demarches_simplifiées,
nom,
activité_principale,
enjeu_politique,
enjeu_écologique,
rattaché_au_régime_ae,
historique_identifiant_demande_onagre,

// Statistiques
historique_date_réception_ddep,
date_dépôt,
historique_date_signature_arrêté_préfectoral,

// Localisation
communes,
départements,
régions,

// Personnes impliquées
déposant_nom,
déposant_prénoms,
demandeur_personne_physique_nom,
demandeur_personne_physique_prénoms,
demandeur_personne_morale_raison_sociale,
demandeur_personne_morale_siret,

// Phase et prochaine action
phase: phaseActuelle,
// @ts-ignore
prochaine_action_attendue_par
}

Object.freeze(dossierRésumé);

return dossierRésumé
}
70 changes: 61 additions & 9 deletions scripts/front-end/actions/créerObjetCapDepuisURLs.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,14 +2,18 @@

import {json} from 'd3-fetch'

//@ts-expect-error TS ne comprend pas que c'est utilisé
/** @import {StringValues} from '../../types.js' */
//@ts-expect-error TS ne comprend pas que c'est utilisé
/** @import {IdentitéInstructeurPitchou, PitchouInstructeurCapabilities} from '../../types/capabilities.ts' */
//@ts-expect-error TS ne comprend pas que c'est utilisé
/** @import {default as Dossier} from '../../types/database/public/Dossier.ts' */
//@ts-expect-error TS ne comprend pas que c'est utilisé
/** @import {default as Message} from '../../types/database/public/Message.ts' */
/** @import {DossierComplet} from '../../types/API_Pitchou.ts' */


const commonHeaders = {
'Accept': 'application/json'
}

const commonRequestInit = {headers: commonHeaders}

/**
*
Expand All @@ -20,7 +24,7 @@ function wrapGETUrl(url){
if(!url)
return undefined

return () => json(url)
return () => json(url, commonRequestInit)
}

/**
Expand Down Expand Up @@ -98,22 +102,70 @@ function wrapListerMessages(url){
*/
return function listerMessages(dossierId){
// @ts-ignore
return json(url.replace(dossierIdURLParam, dossierId))
return json(url.replace(dossierIdURLParam, dossierId), commonRequestInit)
}
}

/**
*
* @param {string | undefined} url
* @returns {((dossierId: Dossier['id']) => Promise<DossierComplet>) | undefined}
*/
function wrapRecupérerDossierComplet(url){
if(!url)
return undefined

if(!url.includes(dossierIdURLParam)){
throw new Error(`La capability listerMessages ne contient pas '${dossierIdURLParam}'`)
}

/**
*
* @param {Dossier['id']} dossierId
* @returns {Promise<DossierComplet>}
*/
return async function getDossierComplet(dossierId){
/** @type {Awaited<ReturnType<getDossierComplet>> | undefined} */
const ret = await json(
// @ts-ignore
url.replace(dossierIdURLParam, dossierId),
commonRequestInit
)

if(!ret){
throw new TypeError(`Aucun dossier trouvé avec id '${dossierId}'`)
}

// Le contenu du fichier espèces impactées est disponible sous forme de string base64 dans le JSON
// le retransformer en ArrayBuffer pour utilisation côté front-end
if(ret.espècesImpactées){
// @ts-ignore
ret.espècesImpactées.contenu = Uint8Array.from(atob(ret.espècesImpactées.contenu), c => c.charCodeAt(0)).buffer
}

Object.freeze(ret)
if(ret.espècesImpactées){
Object.freeze(ret.espècesImpactées)
}
if(ret.évènementsPhase){
Object.freeze(ret.évènementsPhase)
}

return ret;
}
}

/**
*
* @param {StringValues<PitchouInstructeurCapabilities> & {identité: IdentitéInstructeurPitchou}} capURLs
* @returns {PitchouInstructeurCapabilities & {identité: IdentitéInstructeurPitchou}}
* @returns {Partial<PitchouInstructeurCapabilities> & {identité: IdentitéInstructeurPitchou}}
*/
export default function(capURLs){

return {
listerDossiers: wrapGETUrl(capURLs.listerDossiers),
//@ts-ignore
recupérerDossierComplet: wrapRecupérerDossierComplet(capURLs.recupérerDossierComplet),
listerRelationSuivi: wrapGETUrl(capURLs.listerRelationSuivi),
// @ts-ignore
listerÉvènementsPhaseDossier: wrapGETUrl(capURLs.listerÉvènementsPhaseDossier),
listerMessages: wrapListerMessages(capURLs.listerMessages),
modifierDossier: wrapModifierDossier(capURLs.modifierDossier),
Expand Down
59 changes: 38 additions & 21 deletions scripts/front-end/actions/dossier.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,42 +2,38 @@

import store from "../store"

/** @import {DossierComplet} from '../../types/API_Pitchou.d.ts' */
//@ts-expect-error TS ne comprends pas que le type est utilisé dans le jsdoc
/** @import {DossierComplet, DossierPhase} from '../../types/API_Pitchou.d.ts' */
//@ts-expect-error TS ne comprends pas que le type est utilisé dans le jsdoc
/** @import {default as Dossier} from '../../types/database/public/Dossier.ts' */
//@ts-ignore
/** @import {default as Message} from '../../types/database/public/Message.ts' */

/**
* @param {DossierComplet['id']} id
* @param {Partial<DossierComplet> & {phase: string}} dossierParams
* @param {DossierComplet} dossier
* @param {Partial<DossierComplet>} modifs
* @returns {Promise<void>}
*/
export function modifierDossier(id, dossierParams) {
if(!store.state.capabilities?.modifierDossier)
export function modifierDossier(dossier, modifs) {
if(!store.state.capabilities.modifierDossier)
throw new TypeError(`Capability modifierDossier manquante`)

const dossierAvantModification = store.state.dossiers.get(id)
const copieDossierAvantModification = Object.assign({}, dossierAvantModification)
copieDossierAvantModification.évènementsPhase = [...copieDossierAvantModification.évènementsPhase]

// modifier le dossier dans le store de manière optimiste
const dossierModifié = Object.assign({}, dossierAvantModification, dossierParams)
if(dossierParams.phase){
dossierModifié.évènementsPhase.unshift({
dossier: id,
horodatage: new Date(),
phase: dossierParams.phase,
cause_personne: null // PPP : ça serait mieux avec la personne actuelle 🤷
})
/** @type {DossierComplet} */
const dossierModifié = Object.assign({}, dossier, modifs)
if(modifs.évènementsPhase){
dossierModifié.évènementsPhase = [
...modifs.évènementsPhase,
...dossier.évènementsPhase
]
}

store.mutations.setDossier(dossierModifié)
store.mutations.setDossierComplet(dossierModifié)

return store.state.capabilities?.modifierDossier(id, dossierParams)
return store.state.capabilities.modifierDossier(dossier.id, modifs)
.catch(err => {
// en cas d'erreur, remettre le dossier dans le store comme avant la copie
store.mutations.setDossier(copieDossierAvantModification)
// en cas d'erreur, remettre le dossier précédent dans le store comme avant la copie
store.mutations.setDossierComplet(dossier)
throw err
})
}
Expand All @@ -57,4 +53,25 @@ export async function chargerMessagesDossier(id){
})

return store.state.messagesParDossierId.get(id) || messagesP
}


/**
* @param {DossierComplet['id']} id
* @returns {Promise<DossierComplet>}
*/
export async function getDossierComplet(id){
const dossierCompletInStore = store.state.dossiersComplets.get(id)

if(dossierCompletInStore){
return dossierCompletInStore
}

if(!store.state.capabilities.recupérerDossierComplet)
throw new TypeError(`Capability recupérerDossierComplet manquante`)

const dossierComplet = await store.state.capabilities.recupérerDossierComplet(id)
store.mutations.setDossierComplet(dossierComplet)

return dossierComplet
}
Loading
Loading