diff --git a/backend/src/core/components/emails/stagiaires/avisRejectedAlerteEmail.js b/backend/src/core/components/emails/stagiaires/avisRejectedAlerteEmail.js index 51c9a84d1..382894000 100644 --- a/backend/src/core/components/emails/stagiaires/avisRejectedAlerteEmail.js +++ b/backend/src/core/components/emails/stagiaires/avisRejectedAlerteEmail.js @@ -1,3 +1,5 @@ +const BadDataError = require('./../../../errors'); + module.exports = (db, regions, mailer) => { const templateName = 'avisRejectedAlerteEmail'; @@ -13,6 +15,10 @@ module.exports = (db, regions, mailer) => { templateName, render, send: async stagiaire => { + if (!stagiaire.individu || !stagiaire.individu.email) { + throw new BadDataError(`Le courriel de l'individu a été supprimé pour raison de RGPD. `); + } + let region = regions.findRegionByCodeRegion(stagiaire.codeRegion); return mailer.createRegionalMailer(region).sendEmail( diff --git a/backend/src/core/components/emails/stagiaires/avisRejectedInjureEmail.js b/backend/src/core/components/emails/stagiaires/avisRejectedInjureEmail.js index 6d652a591..2ba5b4140 100644 --- a/backend/src/core/components/emails/stagiaires/avisRejectedInjureEmail.js +++ b/backend/src/core/components/emails/stagiaires/avisRejectedInjureEmail.js @@ -1,3 +1,5 @@ +const BadDataError = require('./../../../errors'); + module.exports = (db, regions, mailer) => { const templateName = 'avisRejectedInjureEmail'; @@ -13,6 +15,9 @@ module.exports = (db, regions, mailer) => { templateName, render, send: async stagiaire => { + if (!stagiaire.individu || !stagiaire.individu.email) { + throw new BadDataError(`Le courriel de l'individu a été supprimé pour raison de RGPD. `); + } let formation = stagiaire.formation; let region = regions.findRegionByCodeRegion(stagiaire.codeRegion); diff --git a/backend/src/core/components/emails/stagiaires/avisStagiaireEmail.js b/backend/src/core/components/emails/stagiaires/avisStagiaireEmail.js index 92db3ab65..f3b22cb0c 100644 --- a/backend/src/core/components/emails/stagiaires/avisStagiaireEmail.js +++ b/backend/src/core/components/emails/stagiaires/avisStagiaireEmail.js @@ -1,3 +1,5 @@ +const BadDataError = require('./../../../errors'); + module.exports = (db, regions, mailer) => { const templateName = 'avisStagiaireEmail'; @@ -16,6 +18,9 @@ module.exports = (db, regions, mailer) => { templateName, render, send: async stagiaire => { + if (!stagiaire.individu || !stagiaire.individu.email) { + throw new BadDataError(`Le courriel de l'individu a été supprimé pour raison de RGPD. `); + } let onSuccess = () => { return db.collection('stagiaires').updateOne({ '_id': stagiaire._id }, { diff --git a/backend/src/core/components/emails/stagiaires/questionnaire6MoisEmail.js b/backend/src/core/components/emails/stagiaires/questionnaire6MoisEmail.js index 1cdec49d8..4c219899d 100644 --- a/backend/src/core/components/emails/stagiaires/questionnaire6MoisEmail.js +++ b/backend/src/core/components/emails/stagiaires/questionnaire6MoisEmail.js @@ -1,3 +1,5 @@ +const BadDataError = require('./../../../errors'); + module.exports = (db, regions, mailer) => { const templateName = 'questionnaire6MoisEmail'; @@ -14,6 +16,9 @@ module.exports = (db, regions, mailer) => { templateName, render, send: async stagiaire => { + if (!stagiaire.individu || !stagiaire.individu.email) { + throw new BadDataError(`Le courriel de l'individu a été supprimé pour raison de RGPD. `); + } let onSuccess = () => { return db.collection('stagiaires').updateOne({ '_id': stagiaire._id }, { $set: { diff --git a/backend/src/core/components/workflow.js b/backend/src/core/components/workflow.js index 06541c738..ddc14fd14 100644 --- a/backend/src/core/components/workflow.js +++ b/backend/src/core/components/workflow.js @@ -1,6 +1,7 @@ const ObjectID = require('mongodb').ObjectID; const _ = require('lodash'); const { IdNotFoundError, ForbiddenError } = require('./../errors'); +const Boom = require('boom'); module.exports = (db, logger, emails) => { @@ -109,9 +110,11 @@ module.exports = (db, logger, emails) => { } if ((qualification === 'injure' || qualification === 'alerte')) { + let stagiaire = await db.collection('stagiaires').findOne({ token: original.token }); + if (!stagiaire.individu || !stagiaire.individu.email) { + throw Boom.badRequest(`Avis rejeté, cependant le stagiaire n'a pas pu être notifié. `); + } sendEmail(async () => { - let stagiaire = await db.collection('stagiaires').findOne({ token: original.token }); - let message = emails.getEmailMessageByTemplateName(`avisRejected${_.capitalize(qualification)}Email`); return message.send(stagiaire); }); @@ -187,8 +190,11 @@ module.exports = (db, logger, emails) => { }); if (options.sendEmail) { + let stagiaire = await db.collection('stagiaires').findOne({ token: previous.token }); + if (!stagiaire.individu || !stagiaire.individu.email) { + throw Boom.badRequest(`Avis supprimé, cependant le courriel n'a pas pu être renvoyé. `); + } sendEmail(async () => { - let stagiaire = await db.collection('stagiaires').findOne({ token: previous.token }); let message = emails.getEmailMessageByTemplateName('avisStagiaireEmail'); return message.send(stagiaire); }); diff --git a/backend/src/jobs/mailing/stagiaires/avis/tasks/actions/ResendAction.js b/backend/src/jobs/mailing/stagiaires/avis/tasks/actions/ResendAction.js index 35994c360..03a8083d1 100644 --- a/backend/src/jobs/mailing/stagiaires/avis/tasks/actions/ResendAction.js +++ b/backend/src/jobs/mailing/stagiaires/avis/tasks/actions/ResendAction.js @@ -25,6 +25,7 @@ class ResendAction { { mailRetry: { $lt: parseInt(avisMaxRelaunch) } } ], 'formation.action.session.nbStagiairesFormes': { $gte: 5 }, + 'individu.email': { $exists: true }, }; } } diff --git a/backend/src/jobs/mailing/stagiaires/avis/tasks/actions/RetryAction.js b/backend/src/jobs/mailing/stagiaires/avis/tasks/actions/RetryAction.js index 6916214c7..27f87dfb7 100644 --- a/backend/src/jobs/mailing/stagiaires/avis/tasks/actions/RetryAction.js +++ b/backend/src/jobs/mailing/stagiaires/avis/tasks/actions/RetryAction.js @@ -20,6 +20,7 @@ class RetryAction { mailRetry: { $lt: parseInt(this.configuration.smtp.stagiaires.avisMaxRelaunch) } } ], + 'individu.email': { $exists: true }, }; } } diff --git a/backend/src/jobs/mailing/stagiaires/avis/tasks/actions/SendAction.js b/backend/src/jobs/mailing/stagiaires/avis/tasks/actions/SendAction.js index c43f2137b..265fad622 100644 --- a/backend/src/jobs/mailing/stagiaires/avis/tasks/actions/SendAction.js +++ b/backend/src/jobs/mailing/stagiaires/avis/tasks/actions/SendAction.js @@ -16,6 +16,7 @@ class SendAction { ...(this.filters.codeRegions ? { 'codeRegion': { $in: this.filters.codeRegions } } : {}), ...(this.filters.campaign ? { 'campaign': this.filters.campaign } : {}), 'formation.action.session.nbStagiairesFormes': { $gte: 5 }, + 'individu.email': { $exists: true }, }; } } diff --git a/ui/src/backoffice/components/common/avis/buttons/EditButton.jsx b/ui/src/backoffice/components/common/avis/buttons/EditButton.jsx index d7e80d69f..6b77cc175 100644 --- a/ui/src/backoffice/components/common/avis/buttons/EditButton.jsx +++ b/ui/src/backoffice/components/common/avis/buttons/EditButton.jsx @@ -41,6 +41,7 @@ export default class EditButton extends React.Component { await this.props.onChange(this.props.avis, { message: { type: 'local', + color: 'red', text: 'L\'avis a été supprimé.', }, }); @@ -59,7 +60,18 @@ export default class EditButton extends React.Component { } onClose={this.handleCancel} onConfirmed={async () => { - await deleteAvis(this.props.avis._id, { sendEmail: true }); + try { + await deleteAvis(this.props.avis._id, { sendEmail: true }); + } catch(e) { + const messageJson = (await e.json).message; + await this.props.onChange(this.props.avis, { + message: { + text: !messageJson ? e.message : messageJson, + color: 'red', + type: 'local', + } + }); + } await this.props.onChange(this.props.avis, { message: { text: 'Le questionnaire a bien été envoyé au stagiaire.', diff --git a/ui/src/backoffice/components/common/avis/buttons/RejectButton.jsx b/ui/src/backoffice/components/common/avis/buttons/RejectButton.jsx index d55768a27..1f0183ce3 100644 --- a/ui/src/backoffice/components/common/avis/buttons/RejectButton.jsx +++ b/ui/src/backoffice/components/common/avis/buttons/RejectButton.jsx @@ -49,7 +49,20 @@ export default class RejectButton extends React.Component { } onClose={this.handleCancel} - onConfirmed={() => this.reject(this.props.avis, this.state.qualification)} /> + onConfirmed={async () => { + try { + await this.reject(this.props.avis, this.state.qualification); + } catch(e) { + const messageJson = (await e.json).message; + await this.props.onChange(this.props.avis, { + message: { + text: !messageJson ? e.message : messageJson, + color: 'red', + type: 'local', + } + }); + } + }} /> ); };