Skip to content

Commit

Permalink
Refonte de la modification de dossier
Browse files Browse the repository at this point in the history
  • Loading branch information
DavidBruant committed Jan 22, 2025
1 parent 7f3e6f6 commit e8945b1
Show file tree
Hide file tree
Showing 8 changed files with 159 additions and 58 deletions.
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é
}
33 changes: 14 additions & 19 deletions scripts/front-end/actions/dossier.js
Original file line number Diff line number Diff line change
Expand Up @@ -10,35 +10,30 @@ import store from "../store"
/** @import {default as Message} from '../../types/database/public/Message.ts' */

/**
* @param {Dossier['id']} id
* @param {Partial<DossierComplet> & {phase: DossierPhase}} 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.dossiersComplets.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.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.setDossierComplet(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 Down
30 changes: 26 additions & 4 deletions scripts/front-end/components/screens/Dossier.svelte
Original file line number Diff line number Diff line change
Expand Up @@ -18,13 +18,17 @@
const {number_demarches_simplifiées: numdos} = dossier
$: phase = dossier.évènementsPhase[0].phase;
$: phaseActuelle = dossier.évènementsPhase[0].phase;
/** @type {Pick<DossierComplet, 'prochaine_action_attendue_par'> & {phase: DossierPhase}} */
let dossierParams = {
phase: dossier.évènementsPhase[0].phase,
phase: phaseActuelle,
prochaine_action_attendue_par: dossier.prochaine_action_attendue_par,
}
$: dossierParams.phase = phaseActuelle
let messageErreur = ""
let afficherMessageSucces = false
Expand All @@ -35,7 +39,25 @@
const mettreAJourDossier = (e) => {
e.preventDefault()
modifierDossier(dossier.id, dossierParams)
/** @type {Partial<DossierComplet>} */
const modifs = {}
if(phaseActuelle !== dossierParams.phase){
modifs.évènementsPhase = [
{
dossier: dossier.id,
horodatage: new Date(),
phase: dossierParams.phase,
cause_personne: null
}
]
}
if(dossier.prochaine_action_attendue_par !== dossierParams.prochaine_action_attendue_par){
modifs.prochaine_action_attendue_par = dossierParams.prochaine_action_attendue_par
}
modifierDossier(dossier, modifs)
.then(() => afficherMessageSucces = true)
.catch((error) => {
console.info(error)
Expand All @@ -54,7 +76,7 @@
<div class="fr-col">
<h1 class="fr-mb-4w">
Dossier {dossier.nom || "sans nom"}
<TagPhase {phase}></TagPhase>
<TagPhase phase={phaseActuelle}></TagPhase>
</h1>

<nav class="dossier-nav fr-mb-4w">
Expand Down
34 changes: 16 additions & 18 deletions scripts/front-end/routes/Accueil.js
Original file line number Diff line number Diff line change
Expand Up @@ -54,23 +54,21 @@ export default async () => {
// Si on n'en a pas, afficher la page de connexion
// Si on en a, charger des dossiers (s'il n'y a pas de dossiers dans le store)

if(store.state.capabilities && store.state.capabilities.listerDossiers){
if(store.state.dossiersRésumés.size === 0){
await chargerDossiers()
.catch(err => {
console.error('Problème de chargement des dossiers', err)
if(err.message.includes('403')){
logoutEtAfficherLoginParEmail({
message: `Erreur de connexion - Votre lien de connexion n'est plus valide, vous pouvez en recevoir par email ci-dessous`
})
}
else{
logoutEtAfficherLoginParEmail({
message: `Erreur de chargement des dossiers - Il s'agit d'un problème technique. Vous pouvez en informer l'équipe Pitchou`
})
}
})
}
if(store.state.capabilities.listerDossiers){
await chargerDossiers()
.catch(err => {
console.error('Problème de chargement des dossiers', err)
if(err.message.includes('403')){
logoutEtAfficherLoginParEmail({
message: `Erreur de connexion - Votre lien de connexion n'est plus valide, vous pouvez en recevoir par email ci-dessous`
})
}
else{
logoutEtAfficherLoginParEmail({
message: `Erreur de chargement des dossiers - Il s'agit d'un problème technique. Vous pouvez en informer l'équipe Pitchou`
})
}
})

/**
*
Expand All @@ -97,7 +95,7 @@ export default async () => {

}
else{
if(store.state.capabilities && !store.state.capabilities.listerDossiers){
if(!store.state.capabilities.listerDossiers){
store.mutations.ajouterErreur({
message: `Il semblerait que vous ne fassiez partie d'aucun groupe instructeurs sur la procédure Démarche Simplifiée de Pitchou. Vous pouvez prendre contact avec vos collègues ou l'équipe Pitchou pour être ajouté.e à un groupe d'instructeurs`
})
Expand Down
4 changes: 4 additions & 0 deletions scripts/front-end/store.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,8 @@

import Store from 'baredux'

import {DossierCompletToDossierRésumé} from '../commun/outils-dossiers.js'

/**
* Un store baredux a pour vocation de refléter notamment le modèle mental de la
* personne face à notre application. Le store stocke donc principalement des données (et parfois des singletons)
Expand Down Expand Up @@ -79,6 +81,8 @@ const mutations = {
*/
setDossierComplet(state, nouveauDossierComplet) {
state.dossiersComplets.set(nouveauDossierComplet.id, nouveauDossierComplet)
const dossierRésumé = DossierCompletToDossierRésumé(nouveauDossierComplet)
state.dossiersRésumés.set(nouveauDossierComplet.id, dossierRésumé)
},
/**
* @param {PitchouState} state
Expand Down
21 changes: 9 additions & 12 deletions scripts/server/database/dossier.js
Original file line number Diff line number Diff line change
Expand Up @@ -680,26 +680,23 @@ export function deleteDossierByDSNumber(numbers){
/**
*
* @param {Dossier['id']} id
* @param {Partial<DossierComplet> & {phase: string}} dossierParams
* @param {Partial<Dossier & {évènementsPhase: ÉvènementPhaseDossier[]}>} dossierParams
* @param {Personne['id']} causePersonne
* @param {knex.Knex.Transaction | knex.Knex} [databaseConnection]
* @returns {Promise<any>}
*/
export function updateDossier(id, dossierParams, causePersonne, databaseConnection = directDatabaseConnection) {
let phaseAjoutée = Promise.resolve()
if(dossierParams.phase){
const phase = dossierParams.phase
//@ts-ignore
delete dossierParams.phase

if(dossierParams.évènementsPhase){
for(const ev of dossierParams.évènementsPhase){
ev.cause_personne = causePersonne
}

phaseAjoutée = databaseConnection('évènement_phase_dossier')
.insert({
phase,
horodatage: new Date(),
dossier: id,
cause_personne: causePersonne
})
.insert(dossierParams.évènementsPhase)

delete dossierParams.évènementsPhase
}

let dossierÀJour = Promise.resolve()
Expand Down
6 changes: 2 additions & 4 deletions scripts/server/main.js
Original file line number Diff line number Diff line change
Expand Up @@ -211,15 +211,13 @@ fastify.get('/dossiers', async function (request, reply) {
// Cette fonction ne peut pas être async parce que ça donne l'impression à fastify
// qu'elle répond 2 fois
fastify.get('/dossier/:dossierId', function(request, reply) {
console.log(`fastify.get('/dossier/:dossierId'`)
// console.log(`fastify.get('/dossier/:dossierId'`)
const accept = request.headers.accept

if(accept !== 'application/json'){
console.log('html')
sendIndexHTMLFile(request, reply)
}
else{
console.log('json')
// accept === 'application/json'
// @ts-ignore
const { cap } = request.query
Expand Down Expand Up @@ -291,7 +289,7 @@ fastify.post('/dossier/:dossierId', async function(request, reply) {

const capPersonne = await getPersonneByDossierCap(cap)

/** @type {Partial<DossierComplet> & {phase: string}} */
/** @type {Partial<DossierComplet>} */
// @ts-ignore
const dossierParams = request.body

Expand Down
2 changes: 1 addition & 1 deletion scripts/types/API_Pitchou.ts
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ export type DossierProchaineActionAttenduePar = "Instructeur" | "CNPN/CSRPN" | "

type DossierPhaseEtProchaineAction = {
phase: DossierPhase;
prochaine_action_attendue_par: DossierProchaineActionAttenduePar;
prochaine_action_attendue_par: DossierProchaineActionAttenduePar | null;
}

/**
Expand Down

0 comments on commit e8945b1

Please sign in to comment.