Skip to content

Commit b1585e6

Browse files
committed
feat: 1103 confirmation demande agrement (retours revue)
1 parent 12967c5 commit b1585e6

File tree

7 files changed

+60
-55
lines changed

7 files changed

+60
-55
lines changed

packages/backend/src/__tests__/usagers/agrements.test.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,10 @@ jest.mock("../../middlewares/common/checkJWT", () => {
2626
beforeAll(async () => await createTestContainer());
2727
afterAll(async () => await removeTestContainer());
2828

29+
beforeEach(() => {
30+
jest.clearAllMocks();
31+
});
32+
2933
describe("GET /agrements/organisme/:organismeId", () => {
3034
it("devrait retourner un agrément par ID de l'organisme avec succès", async () => {
3135
authUser = await createUsagersUser();

packages/backend/src/usagers/agrements/agrements.controller.ts

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -63,11 +63,7 @@ export const AgrementController = {
6363
) {
6464
log.i("PATCH statut IN");
6565

66-
if (!req.decoded) {
67-
throw new AppError("Utilisateur non authentifié", { statusCode: 401 });
68-
}
69-
const { id: usagerUserId } = req.decoded;
70-
66+
const { id: usagerUserId } = req.decoded!;
7167
const agrementId = Number(req.validatedParams!.agrementId);
7268
const { statut } = req.validatedBody!;
7369
try {

packages/backend/src/usagers/agrements/agrements.repository.ts

Lines changed: 27 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -253,6 +253,33 @@ export const AgrementsRepository = {
253253
return result.rows;
254254
},
255255

256+
/**
257+
* Récupère un agrément par son ID. Retourne agrement enrichi avec l'email du user responsable.
258+
*/
259+
async getById(
260+
agrementId: number,
261+
): Promise<AgrementEntity & { user_mail: string | null }> {
262+
const client = await getPool().connect();
263+
try {
264+
const result = await client.query(
265+
`SELECT a.*, u.mail AS user_mail
266+
FROM front.agrements a
267+
JOIN front.organismes o ON a.organisme_id = o.id
268+
JOIN front.user_organisme uo ON uo.org_id = o.id
269+
JOIN front.users u ON uo.use_id = u.id
270+
WHERE a.id = $1
271+
LIMIT 1;`,
272+
[agrementId],
273+
);
274+
if (result.rows.length === 0) {
275+
throw new Error("Aucun agrément trouvé avec cet ID");
276+
}
277+
return result.rows[0] as AgrementEntity & { user_mail: string | null };
278+
} finally {
279+
client.release();
280+
}
281+
},
282+
256283
/**
257284
* Récupère un agrément par organisme ID (avec ou sans détails liés)
258285
*/
@@ -416,31 +443,6 @@ export const AgrementsRepository = {
416443
}
417444
},
418445

419-
/**
420-
* Récupère l'email du user lié à un agrément id
421-
*/
422-
async getUserMailByAgrementId(agrementId: number): Promise<string | null> {
423-
const client = await getPool().connect();
424-
try {
425-
const query = `
426-
SELECT u.mail
427-
FROM front.agrements a
428-
JOIN front.organismes o ON a.organisme_id = o.id
429-
JOIN front.user_organisme uo ON uo.org_id = o.id
430-
JOIN front.users u ON uo.use_id = u.id
431-
WHERE a.id = $1
432-
LIMIT 1;
433-
`;
434-
const result = await client.query(query, [agrementId]);
435-
if (result.rows.length > 0) {
436-
return result.rows[0].mail;
437-
}
438-
return null;
439-
} finally {
440-
client.release();
441-
}
442-
},
443-
444446
async insertHistoryEvent({
445447
source,
446448
agrementId,

packages/backend/src/usagers/agrements/agrements.service.ts

Lines changed: 21 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import {
1010
import { getById } from "../../services/adresse";
1111
import { getFileMetaData } from "../../services/Document";
1212
import { mailService } from "../../services/mail";
13+
import AppError from "../../utils/error";
1314
import logger from "../../utils/logger";
1415
import MailUtils from "../../utils/mail";
1516
import { AgrementsRepository } from "./agrements.repository";
@@ -97,11 +98,23 @@ export const AgrementService = {
9798
statut: AGREMENT_STATUT;
9899
usagerUserId: string;
99100
}): Promise<boolean> {
101+
let agrement;
102+
try {
103+
agrement = await AgrementsRepository.getById(agrementId);
104+
} catch (err) {
105+
log.w("Erreur lors de la récupération de l'agrément", err);
106+
throw new AppError("Agrement non trouvé", { statusCode: 404 });
107+
}
108+
100109
const updated = await AgrementsRepository.updateStatut({
101110
agrementId,
102111
statut,
103112
});
104-
if (!updated) return false;
113+
if (!updated) {
114+
throw new AppError("Échec de la mise à jour du statut", {
115+
statusCode: 500,
116+
});
117+
}
105118

106119
await AgrementService.trackEvent({
107120
agrementId,
@@ -111,20 +124,18 @@ export const AgrementService = {
111124
usagerUserId: Number(usagerUserId),
112125
});
113126

114-
// Envoi d'email si le statut devient TRANSMIS
115127
if (statut === AGREMENT_STATUT.TRANSMIS) {
116-
try {
117-
const email =
118-
await AgrementsRepository.getUserMailByAgrementId(agrementId);
119-
if (email) {
128+
const email = agrement.user_mail;
129+
if (email) {
130+
try {
120131
await mailService.send(
121132
MailUtils.usagers.agrement.sendStatutTransmisMail({ email }),
122133
);
123-
} else {
124-
log.w("Aucun email trouvé pour l'agrément", agrementId);
134+
} catch (e) {
135+
log.w("Erreur lors de l'envoi de l'email de transmission", e);
125136
}
126-
} catch (e) {
127-
log.w("Erreur lors de l'envoi de l'email de transmission", e);
137+
} else {
138+
log.w("Aucun email trouvé pour l'agrément", agrementId);
128139
}
129140
}
130141
return true;

packages/frontend-usagers/src/components/agrement/personne-morale.vue

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -116,17 +116,13 @@ const validationSchema = yup.object({
116116
yup.string().email("Format d'email invalide").nullable(),
117117
),
118118
adresse: requiredUnlessBrouillon(yup.string().nullable()),
119-
// prenom: requiredUnlessBrouillon(yup.string().nullable()),
120-
// nom: requiredUnlessBrouillon(yup.string().nullable()),
121119
});
122120
123121
const initialValues = {
124122
statut: props.initAgrement.statut || AGREMENT_STATUT.BROUILLON,
125123
telephone: props.initOrganisme?.personneMorale?.telephone || "",
126124
email: props.initOrganisme?.personneMorale?.email || "",
127125
adresse: props.initOrganisme?.personneMorale?.adresse || "",
128-
// prenom: props.initOrganisme?.personneMorale?.prenom || "",
129-
// nom: props.initOrganisme?.personneMorale?.nom || "",
130126
};
131127
132128
const { handleSubmit, setValues } = useForm({

packages/frontend-usagers/src/components/agrement/synthese.vue

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -108,7 +108,7 @@
108108
</div>
109109
</template>
110110

111-
<script setup>
111+
<script setup lang="ts">
112112
import { storeToRefs } from "pinia";
113113
import { AGREMENT_STATUT } from "@vao/shared-bridge";
114114
import { useToaster } from "@vao/shared-ui";
@@ -120,11 +120,11 @@ const props = defineProps({
120120
cdnUrl: { type: String, required: true },
121121
});
122122
123-
const expandedIndex = ref(-1);
124-
const coordonneesValid = ref(false);
125-
const dossierValid = ref(false);
126-
const bilanValid = ref(false);
127-
const projetValid = ref(false);
123+
const expandedIndex = ref<number>(-1);
124+
const coordonneesValid = ref<boolean>(false);
125+
const dossierValid = ref<boolean>(false);
126+
const bilanValid = ref<boolean>(false);
127+
const projetValid = ref<boolean>(false);
128128
129129
const agrementStore = useAgrementStore();
130130
const { agrementCourant } = storeToRefs(agrementStore);

packages/frontend-usagers/src/stores/agrement.ts

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -147,11 +147,7 @@ export const useAgrementStore = defineStore("agrement", {
147147
agrementId,
148148
statut,
149149
);
150-
if (
151-
success &&
152-
this.agrementCourant &&
153-
this.agrementCourant.id === agrementId
154-
) {
150+
if (success && this.agrementCourant?.id === agrementId) {
155151
this.agrementCourant.statut = statut;
156152
}
157153
log.i("changeStatutAgrement - DONE", { success });

0 commit comments

Comments
 (0)