From 27528cf38c0a97cf72007ce09ab7c1ffd63d997e Mon Sep 17 00:00:00 2001 From: Alan Le Ruyet Date: Thu, 16 Jan 2025 16:21:17 +0100 Subject: [PATCH] =?UTF-8?q?feat(lba-706):=20mise=20=C3=A0=20jour=20des=20t?= =?UTF-8?q?emplates=20RDVA=20(#1759)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * feat: template delegations * fix: mongo query error * feat: origin lba uniquement en attendant mieux * feat: template accusé réception candidat prdv ok * feat: template mail prdv ok * feat: réponse à candidat ok * feat: draft new * feat: modèle hardbounce cfa * feat: cleaning cannoli pour rf et lba * feat: mapping job origin * fix: path * fix: lien recherche emploi prdv * fix: ajout images manquantes * feat: normalisation pj Rf * feat: normalisation rf et utm training links * feat: cleaning --- .talismanrc | 10 + .../appointmentRequest.controller.ts | 4 + .../unsubscribeRecruteurLba.controller.ts | 2 +- server/src/services/application.service.ts | 2 +- server/src/services/appointment.service.ts | 64 ++++- server/src/services/formulaire.service.ts | 26 +- server/src/services/trainingLinks.service.ts | 23 +- .../mail-candidat-confirmation-rdv.mjml.ejs | 265 +++++++++++++----- .../mail-candidat-entretien.mjml.ejs | 2 +- .../mail-candidat-offre-emploi-lba.mjml.ejs | 16 +- .../mail-candidat-recruteur-lba.mjml.ejs | 12 +- .../templates/mail-candidat-refus.mjml.ejs | 2 +- .../mail-candidature-spontanee.mjml.ejs | 2 +- .../templates/mail-candidature.mjml.ejs | 2 +- .../templates/mail-cfa-delegation.mjml.ejs | 258 ++++++++++++----- .../mail-cfa-demande-de-contact.mjml.ejs | 264 ++++++++++------- ...l-cfa-notification-hardbounce-cfa.mjml.ejs | 202 +++++++++++++ .../mail-desinscription-algo.mjml.ejs | 2 +- .../mail-echec-envoi-candidature.mjml.ejs | 2 +- .../templates/mail-reponse-cfa.mjml.ejs | 212 ++++++++++---- shared/constants/appointment.ts | 1 + shared/constants/recruteur.ts | 13 + ui/public/images/emails/icone_idee.png | Bin 0 -> 10414 bytes 23 files changed, 1036 insertions(+), 350 deletions(-) create mode 100644 server/static/templates/mail-cfa-notification-hardbounce-cfa.mjml.ejs create mode 100644 ui/public/images/emails/icone_idee.png diff --git a/.talismanrc b/.talismanrc index 922a04eca3..5041e3ce01 100644 --- a/.talismanrc +++ b/.talismanrc @@ -111,6 +111,8 @@ fileignoreconfig: checksum: 5fbdf21310d8dfaf259eb39a5ca1e72a53b15493cf3a59ed42c4cb5c8f3a62ab - filename: server/static/templates/mail-bienvenue.mjml.ejs checksum: 34eb30b463153df565aa89f8e42f08eb77633b6bfa4673f4d6ef5f40633c6101 +- filename: server/static/templates/mail-candidat-confirmation-rdv.mjml.ejs + checksum: 23f500afe4d0984a4680e387e6e67223bdbdc5d954e984f400451b26bac248ce - filename: server/static/templates/mail-candidat-entretien.mjml.ejs checksum: 53067858567e2878f5f65da06be9efc6902a691b36299167d54343ab30162e49 - filename: server/static/templates/mail-candidat-nsp.mjml.ejs @@ -121,8 +123,16 @@ fileignoreconfig: checksum: 0b806bca197dba97415902339e84f924cb45dae766cf8d3cfc47d80d2bdd203c - filename: server/static/templates/mail-candidat-refus.mjml.ejs checksum: 3fcfa9586df3283a3f50cf6751b735b646d3f3ac64e8e4a8453999e9e5aea881 +- filename: server/static/templates/mail-cfa-delegation.mjml.ejs + checksum: 569e084a81ffdfbd3b427a60c0712ec2f1af2031fe120572e55235691e84dc5b +- filename: server/static/templates/mail-cfa-demande-de-contact.mjml.ejs + checksum: 6e15fdba953753e2d4f249c3a289615dea942ac18c0a95241309ab15ad7f60a2 +- filename: server/static/templates/mail-cfa-notification-hardbounce-cfa.mjml.ejs + checksum: ad25d72b5287060499c4e44bfe93eacd8dbfb7b40122b912eb9c3cf657f6aed7 - filename: server/static/templates/mail-echec-envoi-candidature.mjml.ejs checksum: 9055c5495ced85a674770e7fb8a81b3bd84949f9ff8f6e6450989aa3b7cda326 +- filename: server/static/templates/mail-reponse-cfa.mjml.ejs + checksum: a5a36d078b7c75e6da58c06c032b52d0f57d89bf5913065bb1aaab098f3e80af - filename: server/tests/fixture/connectedUser.fixture.ts checksum: bfbb2f218580ce302d3bfcd9ba7494a46ff0a05ba02ca0f38a801ea8c6bf9be2 - filename: server/tests/integration/http/formationV1.test.ts diff --git a/server/src/http/controllers/appointmentRequest.controller.ts b/server/src/http/controllers/appointmentRequest.controller.ts index b16b387a44..250ce07908 100644 --- a/server/src/http/controllers/appointmentRequest.controller.ts +++ b/server/src/http/controllers/appointmentRequest.controller.ts @@ -288,6 +288,10 @@ export default (server: Server) => { nom_cfa: eligibleTrainingsForAppointment?.etablissement_formateur_raison_sociale, cfa_email: eligibleTrainingsForAppointment?.lieu_formation_email, cfa_phone: formationCatalogue?.num_tel, + images: { + logoLba: `${config.publicUrl}/images/emails/logo_LBA.png?raw=true`, + logoRf: `${config.publicUrl}/images/emails/logo_rf.png?raw=true`, + }, }, }) } diff --git a/server/src/http/controllers/unsubscribeRecruteurLba.controller.ts b/server/src/http/controllers/unsubscribeRecruteurLba.controller.ts index 6f74c63937..7f6e5fd5cc 100644 --- a/server/src/http/controllers/unsubscribeRecruteurLba.controller.ts +++ b/server/src/http/controllers/unsubscribeRecruteurLba.controller.ts @@ -95,7 +95,7 @@ export default function (server: Server) { data: { images: { logoLba: `${imagePath}logo_LBA.png`, - logoRF: `${imagePath}logo_rf.png`, + logoRf: `${imagePath}logo_rf.png`, }, }, }) diff --git a/server/src/services/application.service.ts b/server/src/services/application.service.ts index 7ac397bbdf..b8999b83f2 100644 --- a/server/src/services/application.service.ts +++ b/server/src/services/application.service.ts @@ -69,7 +69,7 @@ const PARTNER_NAMES = { const images: object = { images: { logoLba: `${imagePath}logo_LBA.png`, - logoRF: `${imagePath}logo_rf.png`, + logoRf: `${imagePath}logo_rf.png`, logoGrimp: `${imagePath}logo_grimp.png`, icoInfo: `${imagePath}icone_info.png`, icoCandidat: `${imagePath}icone_candidat.png`, diff --git a/server/src/services/appointment.service.ts b/server/src/services/appointment.service.ts index 528f678628..5147e58379 100644 --- a/server/src/services/appointment.service.ts +++ b/server/src/services/appointment.service.ts @@ -5,12 +5,15 @@ import { mailType } from "shared/constants/appointment" import { ReferrerObject } from "shared/constants/referers" import { getStaticFilePath } from "@/common/utils/getStaticFilePath" +import { sentryCaptureException } from "@/common/utils/sentryUtils" import config from "@/config" import { getDbCollection } from "../common/utils/mongodbUtils" import { createRdvaAppointmentIdPageLink } from "./appLinks.service" import mailer, { sanitizeForEmail } from "./mailer.service" +import { getReferrerByKeyName } from "./referrers.service" +import { getLBALink } from "./trainingLinks.service" const createAppointment = async (params: Omit) => { const appointment: IAppointment = { ...params, _id: new ObjectId(), created_at: new Date() } @@ -28,7 +31,12 @@ const findOneAndUpdate = (conditions: Filter, values) => getDbColl export { createAppointment, find, findById, findOne, findOneAndUpdate } -const getMailData = (candidate: IUser, appointment: IAppointment, eligibleTrainingsForAppointment: IEligibleTrainingsForAppointment, referrerObj: ReferrerObject) => { +const getMailData = async (candidate: IUser, appointment: IAppointment, eligibleTrainingsForAppointment: IEligibleTrainingsForAppointment, referrerObj: ReferrerObject) => { + const lbaLink = await getLBALink({ + id: "0", + cle_ministere_educatif: appointment.cle_ministere_educatif, + utm_data: { utm_source: "lba-brevo-transactionnel", utm_medium: "email", utm_campaign: "lba_candidat-rdva-accuse-envoi_promo-emplois" }, + }) const mailData = { appointmentId: appointment._id, user: { @@ -47,16 +55,20 @@ const getMailData = (candidate: IUser, appointment: IAppointment, eligibleTraini }, formation: { intitule: eligibleTrainingsForAppointment.training_intitule_long, + searchLink: lbaLink, }, appointment: { reasons: appointment.applicant_reasons, referrerLink: referrerObj.url, appointment_origin: sanitizeForEmail(referrerObj.full_name), + created_at: appointment.created_at, }, images: { logoLba: `${config.publicUrl}/images/emails/logo_LBA.png?raw=true`, + logoRf: `${config.publicUrl}/images/emails/logo_rf.png?raw=true`, logoFooter: `${config.publicUrl}/assets/logo-republique-francaise.webp?raw=true`, peopleLaptop: `${config.publicUrl}/assets/people-laptop.webp?raw=true`, + idee: `${config.publicUrl}/images/emails/icone_idee.png?raw=true`, }, } return mailData @@ -73,7 +85,7 @@ export const sendCandidateAppointmentEmail = async ( to: candidate.email, subject: `${subjectPrefix ?? ""}Votre demande de RDV auprès de ${eligibleTrainingsForAppointment.etablissement_formateur_raison_sociale}`, template: getStaticFilePath("./templates/mail-candidat-confirmation-rdv.mjml.ejs"), - data: getMailData(candidate, appointment, eligibleTrainingsForAppointment, referrerObj), + data: await getMailData(candidate, appointment, eligibleTrainingsForAppointment, referrerObj), }) await findOneAndUpdate( { _id: appointment._id }, @@ -107,7 +119,7 @@ export const sendFormateurAppointmentEmail = async ( subject: `${subjectPrefix ?? ""} ${referrerObj.full_name} - un candidat a un message pour vous`, template: getStaticFilePath("./templates/mail-cfa-demande-de-contact.mjml.ejs"), data: { - ...getMailData(candidate, appointment, eligibleTrainingsForAppointment, referrerObj), + ...(await getMailData(candidate, appointment, eligibleTrainingsForAppointment, referrerObj)), link: createRdvaAppointmentIdPageLink(appointment.cfa_recipient_email, etablissement.formateur_siret, etablissement._id.toString(), appointment._id.toString()), }, }) @@ -198,11 +210,57 @@ export const isHardbounceEventFromAppointmentApplicant = async (payload) => { } return false } + +export const sendCandidateAppointmentHardbounceEmail = async (appointment: IAppointment) => { + const { cle_ministere_educatif, applicant_id } = appointment + const training = await getDbCollection("eligible_trainings_for_appointments").findOne({ cle_ministere_educatif }) + + if (!training) { + sentryCaptureException(new Error("Elligible training not found while processing appointment hardbounce"), { extra: { cle_ministere_educatif, applicant_id } }) + return + } + + const formation = await getDbCollection("formationcatalogues").findOne({ cle_ministere_educatif }) + if (!formation) { + sentryCaptureException(new Error("Catalogue formation not found while processing appointment hardbounce"), { extra: { cle_ministere_educatif, applicant_id } }) + return + } + + const user = await getDbCollection("users").findOne({ _id: applicant_id }) + if (!user) { + sentryCaptureException(new Error("Applicant not found while processing appointment hardbounce"), { extra: { cle_ministere_educatif, applicant_id } }) + return + } + + const email = await mailer.sendEmail({ + to: user.email, + subject: `Le centre de formation ${training?.etablissement_formateur_raison_sociale} n’a pas reçu votre demande`, + template: getStaticFilePath("./templates/mail-cfa-notification-hardbounce-cfa.mjml.ejs"), + data: { phone: formation.num_tel, ...(await getMailData(user, appointment, training, getReferrerByKeyName(appointment.appointment_origin))) }, + }) + + await findOneAndUpdate( + { _id: appointment._id }, + { + $push: { + to_applicant_mails: { + campaign: mailType.CFA_HARDBOUNCE, + status: null, + message_id: email.messageId, + email_sent_at: dayjs().toDate(), + }, + }, + } + ) +} + export const isHardbounceEventFromAppointmentCfa = async (payload) => { const messageId = payload["message-id"] const appointment = await findOne({ "to_cfa_mails.message_id": messageId }) + if (appointment) { + await sendCandidateAppointmentHardbounceEmail(appointment) return true } return false diff --git a/server/src/services/formulaire.service.ts b/server/src/services/formulaire.service.ts index d7bf049f2a..223bc34f1d 100644 --- a/server/src/services/formulaire.service.ts +++ b/server/src/services/formulaire.service.ts @@ -5,7 +5,7 @@ import equal from "fast-deep-equal" import { Filter, ObjectId, UpdateFilter } from "mongodb" import { IDelegation, IJob, IJobCreate, IJobWithRomeDetail, IRecruiter, IRecruiterWithApplicationCount, IUserRecruteur, JOB_STATUS, removeAccents } from "shared" import { getDirectJobPath } from "shared/constants/lbaitem" -import { OPCOS_LABEL, RECRUITER_STATUS } from "shared/constants/recruteur" +import { OPCOS_LABEL, RECRUITER_STATUS, RECRUITER_USER_ORIGIN } from "shared/constants/recruteur" import { EntrepriseStatus, IEntreprise } from "shared/models/entreprise.model" import { AccessEntityType, AccessStatus } from "shared/models/roleManagement.model" import { IUserWithAccount } from "shared/models/userWithAccount.model" @@ -18,7 +18,7 @@ import { getDbCollection } from "../common/utils/mongodbUtils" import config from "../config" import { getUser2ManagingOffer } from "./application.service" -import { createCfaUnsubscribeToken, createViewDelegationLink } from "./appLinks.service" +import { createViewDelegationLink } from "./appLinks.service" import { getCatalogueFormations } from "./catalogue.service" import dayjs from "./dayjs.service" import { sendEmailConfirmationEntreprise } from "./etablissement.service" @@ -598,7 +598,7 @@ export const patchJobDelegation = async (id: IJob["_id"], delegations: IJob["del await getDbCollection("recruiters").findOneAndUpdate( { "jobs._id": id }, { - $set: { delegations, "jobs.$.job_update_date": new Date(), updatedAt: new Date() }, + $set: { "jobs.$.delegations": delegations, "jobs.$.job_update_date": new Date(), updatedAt: new Date() }, }, { returnDocument: "after" } ) @@ -762,13 +762,20 @@ export const getJobWithRomeDetail = async (id: string | ObjectId): Promise { + const userWithAccount = await getDbCollection("userswithaccounts").findOne({ _id: new ObjectId(recruiter.managed_by!) }) + return (userWithAccount && userWithAccount.origin && RECRUITER_USER_ORIGIN[userWithAccount.origin]) ?? "La bonne alternance" +} + /** * @description Sends the mail informing the CFA that a company wants the CFA to handle the offer. */ export async function sendDelegationMailToCFA(email: string, offre: IJob, recruiter: IRecruiter, siret_code: string) { const unsubscribeOF = await getDbCollection("unsubscribedofs").findOne({ establishment_siret: siret_code }) if (unsubscribeOF) return - const unsubscribeToken = createCfaUnsubscribeToken(email, siret_code) + + const jobOrigin = await getJobOrigin(recruiter) + await mailer.sendEmail({ to: email, subject: `Une entreprise recrute dans votre domaine`, @@ -776,6 +783,7 @@ export async function sendDelegationMailToCFA(email: string, offre: IJob, recrui data: { images: { logoLba: `${config.publicUrl}/images/emails/logo_LBA.png?raw=true`, + logoRf: `${config.publicUrl}/images/emails/logo_rf.png?raw=true`, }, enterpriseName: recruiter.establishment_raison_sociale, jobName: offre.rome_appellation_label, @@ -783,10 +791,12 @@ export async function sendDelegationMailToCFA(email: string, offre: IJob, recrui trainingLevel: offre.job_level_label, startDate: dayjs(offre.job_start_date).format("DD/MM/YYYY"), duration: offre.job_duration, - rhythm: offre.job_rythm, - offerButton: createViewDelegationLink(email, recruiter.establishment_id, offre._id.toString(), siret_code), - createAccountButton: `${config.publicUrl}/espace-pro/creation/cfa`, - unsubscribeUrl: `${config.publicUrl}/espace-pro/proposition/formulaire/${recruiter.establishment_id}/offre/${offre._id}/siret/${siret_code}/unsubscribe?token=${unsubscribeToken}`, + jobOrigin, + offerButton: + createViewDelegationLink(email, recruiter.establishment_id, offre._id.toString(), siret_code) + + "&utm_source=lba-brevo-transactionnel&utm_medium=email&utm_campaign=lba_cfa-mer-entreprise_consulter-coord-entreprise", + createAccountButton: `${config.publicUrl}/organisme-de-formation?utm_source=lba-brevo-transactionnel&utm_medium=email&utm_campaign=lba_cfa-mer-entreprise_creer-compte`, + policyUrl: `${config.publicUrl}/politique-de-confidentialite?utm_source=lba-brevo-transactionnel&utm_medium=email&utm_campaign=lba_cfa-mer-entreprise_politique-confidentialite`, }, }) } diff --git a/server/src/services/trainingLinks.service.ts b/server/src/services/trainingLinks.service.ts index 0ab86b86e1..dc7246bb15 100644 --- a/server/src/services/trainingLinks.service.ts +++ b/server/src/services/trainingLinks.service.ts @@ -25,6 +25,11 @@ interface IWish { uai_formateur?: string | null uai_formateur_responsable?: string | null code_insee?: string | null + utm_data?: { + utm_source: string + utm_medium: string + utm_campaign: string + } } interface ILinks { @@ -33,7 +38,7 @@ interface ILinks { lien_lba: string } -const utmData = { utm_source: "lba", utm_medium: "email", utm_campaign: "promotion-emploi-jeunes-voeux" } +const defaultUtmData = { utm_source: "lba", utm_medium: "email", utm_campaign: "promotion-emploi-jeunes-voeux" } const buildEmploiUrl = ({ baseUrl = `${config.publicUrl}/recherche-emploi`, params }: { baseUrl?: string; params: Record }) => { const url = new URL(baseUrl) @@ -148,6 +153,8 @@ const getPrdvLink = async (wish: IWish): Promise => { return "" } + const utmParams = wish.utm_data ? wish.utm_data : defaultUtmData + const elligibleFormation = await getDbCollection("eligible_trainings_for_appointments").findOne( { cle_ministere_educatif: wish.cle_ministere_educatif, @@ -163,22 +170,24 @@ const getPrdvLink = async (wish: IWish): Promise => { if (elligibleFormation) { return buildEmploiUrl({ baseUrl: `${config.publicUrl}/espace-pro/form`, - params: { referrer: "lba", cleMinistereEducatif: wish.cle_ministere_educatif, ...utmData }, + params: { referrer: "lba", cleMinistereEducatif: wish.cle_ministere_educatif, ...utmParams }, }) } return "" } -const getLBALink = async (wish: IWish): Promise => { +export const getLBALink = async (wish: IWish): Promise => { // Try getting formations first const formations = await getTrainingsFromParameters(wish) + const utmParams = wish.utm_data ? wish.utm_data : defaultUtmData + // Handle single formation case if (formations?.length === 1) { const { rome_codes, lieu_formation_geo_coordonnees } = formations[0] const [latitude, longitude] = lieu_formation_geo_coordonnees!.split(",") - return buildEmploiUrl({ params: { romes: rome_codes as string[], lat: latitude, lon: longitude, radius: "60", ...utmData } }) + return buildEmploiUrl({ params: { romes: rome_codes as string[], lat: latitude, lon: longitude, radius: "60", ...utmParams } }) } // Extract postcode and get coordinates if available @@ -226,13 +235,13 @@ const getLBALink = async (wish: IWish): Promise => { lat = formation.lieu_formation_geo_coordonnees?.split(",")[0] || wLat lon = formation.lieu_formation_geo_coordonnees?.split(",")[1] || wLon } - return buildEmploiUrl({ params: { ...(romes.length ? { romes } : {}), lat, lon, radius: "60", ...utmData } }) + return buildEmploiUrl({ params: { ...(romes.length ? { romes } : {}), lat, lon, radius: "60", ...utmParams } }) } else { // No formations found, use user coordinates if available if (romes.length) { - return buildEmploiUrl({ params: { romes, lat: wLat ?? undefined, lon: wLon ?? undefined, radius: "60", ...utmData } }) + return buildEmploiUrl({ params: { romes, lat: wLat ?? undefined, lon: wLon ?? undefined, radius: "60", ...utmParams } }) } else { - return buildEmploiUrl({ baseUrl: config.publicUrl, params: { ...utmData } }) + return buildEmploiUrl({ baseUrl: config.publicUrl, params: { ...utmParams } }) } } } diff --git a/server/static/templates/mail-candidat-confirmation-rdv.mjml.ejs b/server/static/templates/mail-candidat-confirmation-rdv.mjml.ejs index 4c908a32aa..d5887b00b6 100644 --- a/server/static/templates/mail-candidat-confirmation-rdv.mjml.ejs +++ b/server/static/templates/mail-candidat-confirmation-rdv.mjml.ejs @@ -1,84 +1,195 @@ - Le centre de formation a bien reçu votre demande de contact ! - - - .grey {color: #1E1E1E;} - + + - - + + + @media only screen and (max-width: 799px) { + .text > div { + text-align: inherit !important; + } + + .wrapper > table > tbody > tr > td { + padding-left: 0px !important; + padding-right: 0px !important; + } + + .section > table > tbody > tr > td { + padding-left: 20px !important; + padding-right: 20px !important; + } + + .column > table > tbody > tr > td { + padding-left: 0px !important; + padding-right: 0px !important; + } + + .padB40 { + padding-bottom: 40px !important; + } + + .image { + padding-left: 0px !important; + padding-right: 0px !important; + } + + .image > table { + text-align: center !important; + margin: 0 auto !important; + } + + .divider { + padding-left: 0px !important; + padding-right: 0px !important; + } + + .button > table { + width: 100% !important; + } + + .button > table > tbody > tr > td > a { + width: 80% !important; + } + } + + + .column > table { border-collapse: separate; } + + + - - - - - - - - - - Bonjour <%= data.user.firstname %> <%= data.user.lastname %>, - - - Merci de votre intérêt pour la formation <%= data.formation.intitule %> : - - -
    -
  • dispensée par : <%= data.etablissement.name %>
  • -
  • localisée au : <%= data.etablissement.formateur_address %>, <%= data.etablissement.formateur_zip_code %> <%= data.etablissement.formateur_city %>
  • -
-
- L'établissement prendra contact avec vous très prochainement au <%= data.user.phone %> ou sur <%= data.user.email %> -
-
- - - - Vous avez fait cette demande sur le site <%= data.appointment.appointment_origin %>.
Vous souhaitez modifier ou annuler votre demande ?
Envoyez un email à - <%= data.etablissement.email %> - -
-
-
- - - - Cordialement,
- L'équipe La bonne alternance,
- Mission interministérielle pour l'apprentissage -
-
-
- - - - « La bonne alternance » est un site développé par la Mission interministérielle pour l'apprentissage, au sein de l'Etat, - conformément aux missions d'intérêt public du ministère du Travail. - - - Nous souhaitons vous mettre en relation avec un centre de formation d'apprentis. Par ailleurs, nous ne faisons aucune utilisation commerciale de votre - donnée. - - - Conformément à l'article L.34-5 du code des postes et communications électroniques, vous bénéficiez d'un droit - d'opposition que vous pouvez utiliser à tout moment via l'adresse labonnealternance@apprentissage.beta.gouv.fr. Votre - adresse e-mail sera dès lors supprimée de notre base de données et vous ne serez plus contacté. - - - Si vous pensez que vos droits ne sont pas respectés, vous pouvez à tout moment introduire une réclamation auprès de la CNIL. - - - Pour plus d'informations sur le traitement de vos données, vous pouvez vous rendre sur la politique de confidentialité de La bonne - alternance. - - - - - - - - + + + + + + + + + + + + + + + + + + + Bonjour <%= data.user.firstname %> <%= data.user.lastname %>, +
+
+
+ + + Merci de votre intérêt pour la formation <%= data.formation.intitule %> : +
+
+
+ + + dispensée par : +
+
+ + <%= data.etablissement.name %> +
+
+
+ + + localisée au : +
+
+ + <%= data.etablissement.formateur_address %>, <%= data.etablissement.formateur_zip_code %> <%= data.etablissement.formateur_city %> +
+
+
+ + + L’établissement prendra contact avec vous au + <%= data.user.phone %> ou sur <%= data.user.email %> +
+
+
+
+
+ + + + + + Trouvez facilement une entreprise pour votre alternance. +
+
+ + Cherchez dès maintenant une entreprise pour votre alternance en <%= data.formation.intitule %> et augmentez vos chances d’être accepté·e en formation. Nous avons sélectionné pour vous des entreprises correspondant à votre projet. +
+
+ + Découvrir les entreprises + +
+
+
+ + + + + + + + + La bonne alternance vous propose un ensemble d’outils et de liens pour vous aider dans vos démarches de recherche de formation et d’emploi en alternance. +
+
+
+ + + Découvrir les ressources + + +
+
+ + + + + + Ce courriel est généré automatiquement, vous ne pouvez pas y répondre. Pour contacter le centre de formation, veuillez utiliser les coordonnées de contact ci-dessous. +
+
+ + Vous avez fait cette demande sur le site <%= data.appointment.appointment_origin %>. +
+ Vous souhaitez modifier ou annuler votre demande ? +
+ Envoyez un email à <%= data.etablissement.email %> +
+
+
+
+
+ + + + + + La bonne alternance est un site développé par la Mission interministérielle pour l'apprentissage, au sein de l’État, conformément aux missions d’intérêt public du ministère du Travail, du Plein emploi et de l’Insertion. +
+
Nous vous contactons car vous avez contacté un centre de formation. +
+
Nous ne faisons aucune utilisation commerciale de vos adresses e-mail. Vous bénéficiez d’un droit d’opposition que vous pouvez utiliser à tout moment via l’adresse labonnealternance@apprentissage.beta.gouv.fr +
+
Si vos droits ne sont pas respectés, vous pouvez à tout moment introduire une réclamation auprès de la CNIL. Pour plus d’informations sur le traitement de vos données, vous pouvez vous rendre sur la politique de confidentialité de La bonne alternance. +
+
+
+
+
+
diff --git a/server/static/templates/mail-candidat-entretien.mjml.ejs b/server/static/templates/mail-candidat-entretien.mjml.ejs index 4496f697c2..17936a268c 100644 --- a/server/static/templates/mail-candidat-entretien.mjml.ejs +++ b/server/static/templates/mail-candidat-entretien.mjml.ejs @@ -57,7 +57,7 @@ - + diff --git a/server/static/templates/mail-candidat-offre-emploi-lba.mjml.ejs b/server/static/templates/mail-candidat-offre-emploi-lba.mjml.ejs index e4976910f8..b6e6bfab48 100644 --- a/server/static/templates/mail-candidat-offre-emploi-lba.mjml.ejs +++ b/server/static/templates/mail-candidat-offre-emploi-lba.mjml.ejs @@ -65,23 +65,15 @@ - - - + - - - - - - + + - - - + diff --git a/server/static/templates/mail-candidat-recruteur-lba.mjml.ejs b/server/static/templates/mail-candidat-recruteur-lba.mjml.ejs index d62c24c1ed..7ff38081d5 100644 --- a/server/static/templates/mail-candidat-recruteur-lba.mjml.ejs +++ b/server/static/templates/mail-candidat-recruteur-lba.mjml.ejs @@ -65,18 +65,12 @@ - - - + - - - - - - + + diff --git a/server/static/templates/mail-candidat-refus.mjml.ejs b/server/static/templates/mail-candidat-refus.mjml.ejs index 2d85cc2000..918755e36c 100644 --- a/server/static/templates/mail-candidat-refus.mjml.ejs +++ b/server/static/templates/mail-candidat-refus.mjml.ejs @@ -57,7 +57,7 @@ - + diff --git a/server/static/templates/mail-candidature-spontanee.mjml.ejs b/server/static/templates/mail-candidature-spontanee.mjml.ejs index c35591c5a6..3ac0f2422e 100644 --- a/server/static/templates/mail-candidature-spontanee.mjml.ejs +++ b/server/static/templates/mail-candidature-spontanee.mjml.ejs @@ -65,7 +65,7 @@ - + diff --git a/server/static/templates/mail-candidature.mjml.ejs b/server/static/templates/mail-candidature.mjml.ejs index de312368f1..c9110e9948 100644 --- a/server/static/templates/mail-candidature.mjml.ejs +++ b/server/static/templates/mail-candidature.mjml.ejs @@ -64,7 +64,7 @@ - + diff --git a/server/static/templates/mail-cfa-delegation.mjml.ejs b/server/static/templates/mail-cfa-delegation.mjml.ejs index a61651007b..11ec6e217c 100644 --- a/server/static/templates/mail-cfa-delegation.mjml.ejs +++ b/server/static/templates/mail-cfa-delegation.mjml.ejs @@ -1,79 +1,205 @@ - Une entreprise souhaite être accompagnée dans son recrutement - - - .grey {color: #1E1E1E;} - - - - - + + + + + + + @media only screen and (max-width: 799px) { + .text > div { + text-align: inherit !important; + } + + .wrapper > table > tbody > tr > td { + padding-left: 0px !important; + padding-right: 0px !important; + } + + .section > table > tbody > tr > td { + padding-left: 20px !important; + padding-right: 20px !important; + } + + .column > table > tbody > tr > td { + padding-left: 0px !important; + padding-right: 0px !important; + } + + .padB40 { + padding-bottom: 40px !important; + } + + .image { + padding-left: 0px !important; + padding-right: 0px !important; + } + + .image > table { + text-align: center !important; + margin: 0 auto !important; + } + + .divider { + padding-left: 0px !important; + padding-right: 0px !important; + } + + .button > table { + width: 100% !important; + } + + .button > table > tbody > tr > td > a { + width: 80% !important; + } + } + + + .column > table { border-collapse: separate; } + + - - - - + + + + + + - - - - - Bonjour, - - - L’entreprise <%= data.enterpriseName %>, localisée à proximité de votre CFA, a exprimé un besoin en alternance. Contactez-la pour l’accompagner dans sa recherche et lui présenter vos apprentis. - - - Métier : <%= data.jobName %>
- Type de contrat : <%= data.contractType %>
- Niveau de formation : <%= data.trainingLevel %>
- Date de début : <%= data.startDate %>
- Durée : <%= data.duration %> mois
- Rythme : <%= data.rhythm %>
-
- - Voir les coordonnées de l’entreprise - + + + +
- - - - Vous n’avez pas encore de compte ? - - - Avec La bonne alternance, déposez et gérez les offres de vos entreprises partenaires, et attirez de nouveaux jeunes vers vos formations. -

+ + - La bonne alternance est un service construit par la mission interministérielle pour l’apprentissage en lien avec les acteurs de l’apprentissage. -

- Créez votre compte en cliquant sur ce lien : -
- - Créer mon compte - - - - L'équipe La bonne alternance,
- Mission interministérielle pour l'apprentissage -
+ + + + + Bonjour, +
+
+ + L’entreprise <%= data.enterpriseName %>, localisée à proximité de votre CFA, recrute un alternant et a souhaité vous partager son offre. +
+
Pour l'accompagner dans sa recherche d'alternant, contactez l'établissement en lui précisant que cela fait suite à son dépôt d’offre sur le site <%= data.jobOrigin %>. +
+
+ + Voir les coordonnées de l’entreprise + + + Ce courriel est généré automatiquement, vous ne pouvez pas y répondre. Pour contacter l’entreprise, veuillez utiliser les coordonnées de contact accessibles via le lien ci-dessus. +
+
+
- - - - Désinscription - - - Je ne souhaite plus recevoir de mails de mise en relation avec des entreprises - + + + + + + + + Présentation de l’offre +
+
+
+ + + Métier : +
+
+ + <%= data.jobName %> +
+
+
+ + + Type de contrat : +
+
+ + <%= data.contractType %> +
+
+
+ + + Niveau de formation : +
+
+ + <%= data.trainingLevel %> +
+
+
+ + + Date de début du contrat : +
+
+ + <%= data.startDate %> +
+
+
+ + + Durée : +
+
+ + <%= data.duration %> mois +
+
+
+
+
+ + + + + + + + Vous n’avez pas encore de compte ? +
+
+ + Avec La bonne alternance, déposez et gérez les offres de vos entreprises partenaires afin d'attirer de nouveaux jeunes vers vos formations. +
+
+ + Créer mon compte + +
+
+
+ + + + + + + + La bonne alternance est un site développé par la Mission interministérielle pour l'apprentissage, au sein de l’État, conformément aux missions d’intérêt public du ministère du Travail, du Plein emploi et de l’Insertion. +
+
Nous vous contactons car nous souhaitons vous présenter des entreprises susceptibles de recruter en alternance. +
+
Nous ne faisons aucune utilisation commerciale de vos adresses e-mail. Vous bénéficiez d’un droit d’opposition que vous pouvez utiliser à tout moment via l’adresse labonnealternance@apprentissage.beta.gouv.fr +
+
Si vos droits ne sont pas respectés, vous pouvez à tout moment introduire une réclamation auprès de la CNIL. Pour plus d’informations sur le traitement de vos données, vous pouvez vous rendre sur la politique de confidentialité de La bonne alternance. +
+
+
- - - - - + diff --git a/server/static/templates/mail-cfa-demande-de-contact.mjml.ejs b/server/static/templates/mail-cfa-demande-de-contact.mjml.ejs index 2192aa6b40..2ce7ffb234 100644 --- a/server/static/templates/mail-cfa-demande-de-contact.mjml.ejs +++ b/server/static/templates/mail-cfa-demande-de-contact.mjml.ejs @@ -1,120 +1,184 @@ - <%= data.user.firstname %> <%= data.user.lastname %> souhaite des renseignements sur votre formation. - - .grey {color: #1E1E1E;} - - - - - + + + + + + + @media only screen and (max-width: 799px) { + .text > div { + text-align: inherit !important; + } + + .wrapper > table > tbody > tr > td { + padding-left: 0px !important; + padding-right: 0px !important; + } + + .section > table > tbody > tr > td { + padding-left: 20px !important; + padding-right: 20px !important; + } + + .column > table > tbody > tr > td { + padding-left: 0px !important; + padding-right: 0px !important; + } + + .padB40 { + padding-bottom: 40px !important; + } + + .image { + padding-left: 0px !important; + padding-right: 0px !important; + } + + .image > table { + text-align: center !important; + margin: 0 auto !important; + } + + .divider { + padding-left: 0px !important; + padding-right: 0px !important; + } + + .button > table { + width: 100% !important; + } + + .button > table > tbody > tr > td > a { + width: 80% !important; + } + } + + + .column > table { border-collapse: separate; } + + + - - - - + + + + + + + + + + + - - - - Bonjour, + + + + + + Bonjour, +
- - <%= data.user.firstname %> <%= data.user.lastname %> souhaite des renseignements sur votre formation. + + <%= data.user.firstname %> <%= data.user.lastname %> souhaite des renseignements sur votre formation. +
- - Voir les coordonnées du contact + + Voir les coordonnées du contact - - Il ou elle souhaite aborder avec vous le(s) sujet(s) suivant(s) : -
    + + + + Il ou elle souhaite aborder avec vous les sujets(s) suivant(s) : +
    +
    + +
      <% data.appointment.reasons.forEach((reason) => { %> -
    • - - <% if (reason == 'modalite') { %> - Modalités d'inscription - <% } else if (reason == 'place') { %> - Places disponibles - <% } else if (reason == 'accompagnement') { %> - Accompagnement dans la recherche d'entreprise - <% } else if (reason == 'frais') { %> - Frais d'inscription - <% } else if (reason == 'contenu') { %> - Contenu de la formation - <% } else if (reason == 'horaire') { %> - Horaires / rythme de la formation - <% } else if (reason == 'debouche') { %> - Situation des élèves en sortie de formation - <% } else if (reason == 'plus') { %> - En savoir plus sur l'alternance - <% } else if (reason == 'suivi') { %> - Suivi de ma candidature - <% } else if (reason == 'lieu') { %> - Lieu de la formation - <% } else if (reason == 'porte') { %> - Portes ouvertes - <% } else if (reason == 'autre') { %> - Autre : - <% } %> - -
    • - <% }); %> -
    - <% if(data.user.applicant_message_to_cfa){ %> -

    - <%= data.user.applicant_message_to_cfa %> -

    - <% } else { %> -
    - <% } %> -

    - à propos de la formation : - <%= data.formation.intitule %> - -

    -

    - dispensée par : - <%= data.etablissement.name %>, - <%= data.etablissement.formateur_address %>, - <%= data.etablissement.formateur_zip_code %> - <%= data.etablissement.formateur_city %> - -

    +
  • + <% if (reason == 'modalite') { %> + Modalités d'inscription + <% } else if (reason == 'place') { %> + Places disponibles + <% } else if (reason == 'accompagnement') { %> + Accompagnement dans la recherche d'entreprise + <% } else if (reason == 'frais') { %> + Frais d'inscription + <% } else if (reason == 'contenu') { %> + Contenu de la formation + <% } else if (reason == 'horaire') { %> + Horaires / rythme de la formation + <% } else if (reason == 'debouche') { %> + Situation des élèves en sortie de formation + <% } else if (reason == 'plus') { %> + En savoir plus sur l'alternance + <% } else if (reason == 'suivi') { %> + Suivi de ma candidature + <% } else if (reason == 'lieu') { %> + Lieu de la formation + <% } else if (reason == 'porte') { %> + Portes ouvertes + <% } else if (reason == 'autre') { %> + Autre : + + <%= data.user.applicant_message_to_cfa %> + + <% } %> +
  • + <% }); %> +
-
- - - - Cordialement,
- L'équipe La bonne - alternance,
- Mission interministérielle - pour l'apprentissage + + + à propos de la formation : +
+
+ + <%= data.formation.intitule %> +
-
- - - + + + dispensée par : +
+
+ + <%= data.etablissement.name %>, + <%= data.etablissement.formateur_address %>, + <%= data.etablissement.formateur_zip_code %> + <%= data.etablissement.formateur_city %> +
+
- - - Si vous avez des questions ou si vous souhaitez vous désinscrire du service, envoyez un email à labonnealternance@apprentissage.beta.gouv.fr. + + + Ce courriel est généré automatiquement, vous ne pouvez pas y répondre. Pour contacter le candidat, veuillez utiliser les coordonnées de contact accessibles via le lien ci-dessus. +
- - Cette demande a été réalisée sur le site - <%= data.appointment.referrer %> - . +
+
+
+ + + + + + La bonne alternance est un site développé par la Mission interministérielle pour l'apprentissage, au sein de l’État, conformément aux missions d’intérêt public du ministère du Travail, du Plein emploi et de l’Insertion. +
+
Nous vous contactons car un candidat à l'alternance souhaite des renseignements sur votre formation. +
+
Nous ne faisons aucune utilisation commerciale de vos adresses e-mail. Vous bénéficiez d’un droit d’opposition que vous pouvez utiliser à tout moment via l’adresse labonnealternance@apprentissage.beta.gouv.fr +
+
Si vos droits ne sont pas respectés, vous pouvez à tout moment introduire une réclamation auprès de la CNIL. Pour plus d’informations sur le traitement de vos données, vous pouvez vous rendre sur la politique de confidentialité de La bonne alternance. +
+
+ diff --git a/server/static/templates/mail-cfa-notification-hardbounce-cfa.mjml.ejs b/server/static/templates/mail-cfa-notification-hardbounce-cfa.mjml.ejs new file mode 100644 index 0000000000..d1766d1f6e --- /dev/null +++ b/server/static/templates/mail-cfa-notification-hardbounce-cfa.mjml.ejs @@ -0,0 +1,202 @@ + + + + + + + + + @media only screen and (max-width: 799px) { + .text > div { + text-align: inherit !important; + } + + .wrapper > table > tbody > tr > td { + padding-left: 0px !important; + padding-right: 0px !important; + } + + .section > table > tbody > tr > td { + padding-left: 20px !important; + padding-right: 20px !important; + } + + .column > table > tbody > tr > td { + padding-left: 0px !important; + padding-right: 0px !important; + } + + .padB40 { + padding-bottom: 40px !important; + } + + .image { + padding-left: 0px !important; + padding-right: 0px !important; + } + + .image > table { + text-align: center !important; + margin: 0 auto !important; + } + + .divider { + padding-left: 0px !important; + padding-right: 0px !important; + } + + .button > table { + width: 100% !important; + } + + .button > table > tbody > tr > td > a { + width: 80% !important; + } + } + + + .column > table { border-collapse: separate; } + + + + + + + + + + + + + + + + + + + + + + + Le centre de formation n’a pas reçu votre demande +
+
+
+ + + Bonjour <%= data.user.firstname %> <%= data.user.lastname %>, +
+
+
+ + + Vous avez demandé un rendez-vous avec l'établissement <%= data.etablissement.name %>. +
+ Malheureusement, nous n'avons pas pu transmettre votre demande pour la raison suivante : +
+
+
+ + + Les coordonnées de contact dont nous disposons pour cet établissement ne sont plus valides. +
+
+
+ <% if(data.phone) { %> + + + Nous vous prions de nous excuser pour la gêne occasionnée et vous invitons à contacter l'établissement directement par téléphone au numéro suivant : +
+
+
+ + + <%= data.phone %> +
+
+ <% } %> +
+
+
+ + + + + + Rappel de votre demande +
+
+
+ + + Date d’envoi : +
+
+ + <%= data.appointment.created_at %> +
+
+
+ + + Formation dispensée par : +
+
+ + <%= data.etablissement.name %> +
+
+
+ + + Adresse : +
+
+ + <%= data.etablissement.formateur_address %>, <%= data.etablissement.formateur_zip_code %> <%= data.etablissement.formateur_city %> +
+
+
+ + + Motif : +
+
+ + <%= data.appointment.reasons %> +
+
+
+
+
+ + + + + + Ce courriel est généré automatiquement, vous ne pouvez pas y répondre. +
Pour toute question, consultez notre FAQ ou écrivez-nous à labonnealternance@apprentissage.beta.gouv.fr +
+
+
+
+
+ + + + + + La bonne alternance est un site développé par la Mission interministérielle pour l'apprentissage, au sein de l’État, conformément aux missions d’intérêt public du ministère du Travail, du Plein emploi et de l’Insertion. +
+
Nous vous contactons car vous avez contacté un centre de formation. +
Nous ne faisons aucune utilisation commerciale de vos adresses e-mail. Vous bénéficiez d’un droit d’opposition que vous pouvez utiliser à tout moment via l’adresse labonnealternance@apprentissage.beta.gouv.fr +
+
Si vos droits ne sont pas respectés, vous pouvez à tout moment introduire une réclamation auprès de la CNIL. Pour plus d’informations sur le traitement de vos données, vous pouvez vous rendre sur la politique de confidentialité de La bonne alternance. +
+
+
+
+
+
+
+
diff --git a/server/static/templates/mail-desinscription-algo.mjml.ejs b/server/static/templates/mail-desinscription-algo.mjml.ejs index 8ff9b3dddf..b0f8c25adb 100644 --- a/server/static/templates/mail-desinscription-algo.mjml.ejs +++ b/server/static/templates/mail-desinscription-algo.mjml.ejs @@ -65,7 +65,7 @@ - + diff --git a/server/static/templates/mail-echec-envoi-candidature.mjml.ejs b/server/static/templates/mail-echec-envoi-candidature.mjml.ejs index 136c678cf7..5be096928a 100644 --- a/server/static/templates/mail-echec-envoi-candidature.mjml.ejs +++ b/server/static/templates/mail-echec-envoi-candidature.mjml.ejs @@ -64,7 +64,7 @@ - + diff --git a/server/static/templates/mail-reponse-cfa.mjml.ejs b/server/static/templates/mail-reponse-cfa.mjml.ejs index cc6a0e0531..871acc4442 100644 --- a/server/static/templates/mail-reponse-cfa.mjml.ejs +++ b/server/static/templates/mail-reponse-cfa.mjml.ejs @@ -1,70 +1,162 @@ - La bonne alternance - Le centre de formation vous répond - - .grey {color: #1E1E1E;} + + - - + - - - - - - - - - - - Bonjour <%= data.prenom %> <%= data.nom %>, - <% if (!data.nom_cfa && !data.nom_formation) { %> - - Voici la réponse du centre de formation : - - <% } %> - <% if (data.nom_cfa && data.nom_formation) { %> - - Voici la réponse du centre de formation <%= data.nom_cfa %> à propos de la formation <%= data.nom_formation %> : - - <% } %> - - - <%= data.message %> - - - <% if (data.cfa_email) { %> - Vous souhaitez répondre ? - Email : <%= data.cfa_email %> - <% } %> - <% if (data.cfa_phone) { %> - Téléphone : <%= data.cfa_phone %> - <% } %> - Si vous recontactez le centre de formation, pensez à vous présenter et à redonner le contexte de vos échanges dans votre message afin que le destinataire puisse vous répondre au mieux. - - - + + @media only screen and (max-width: 799px) { + .text > div { + text-align: inherit !important; + } + + .wrapper > table > tbody > tr > td { + padding-left: 0px !important; + padding-right: 0px !important; + } + + .section > table > tbody > tr > td { + padding-left: 20px !important; + padding-right: 20px !important; + } + + .column > table > tbody > tr > td { + padding-left: 0px !important; + padding-right: 0px !important; + } + + .padB40 { + padding-bottom: 40px !important; + } + + .image { + padding-left: 0px !important; + padding-right: 0px !important; + } - + .image > table { + text-align: center !important; + margin: 0 auto !important; + } - - - - Cordialement, - - L'équipe La bonne alternance, - - - Mission interministérielle pour l'apprentissage - - + .divider { + padding-left: 0px !important; + padding-right: 0px !important; + } + + .button > table { + width: 100% !important; + } + + .button > table > tbody > tr > td > a { + width: 80% !important; + } + } + + + .column > table { border-collapse: separate; } + + + + + + + + + + + + + + + + + + + + + + + Le centre de formation vous répond +
+
+ + Bonjour <%= data.prenom %> <%= data.nom %>, +
+
+ + Voici la réponse du centre de formation (CFA) <%= data.nom_cfa %> à propos de la formation <%= data.nom_formation %> : +
+
+ + <%- data.message %> +
+
+ + Ce courriel est généré automatiquement, vous ne pouvez pas y répondre. Pour répondre au CFA, veuillez utiliser les coordonnées de contact ci-dessous. +
+
+
+
+
+ + + + + + Vous souhaitez répondre ? +
+
+ + Voici les coordonnées de l’organisme de formation : +
+
+
+ + + Email +
+
+ + <%= data.cfa_email %> +
+
+
+ + + Téléphone +
+
+ + <%= data.cfa_phone %> +
+
+
+ + + Pensez à vous présenter et à redonner le contexte de vos échanges dans votre message afin que le destinataire puisse vous répondre au mieux. +
+
+
+
+
+ + + + + + La bonne alternance est un site développé par la Mission interministérielle pour l'apprentissage, au sein de l’État, conformément aux missions d’intérêt public du ministère du Travail, du Plein emploi et de l’Insertion. +
+
Nous vous contactons car vous avez contacté un centre de formation. +
Nous ne faisons aucune utilisation commerciale de vos adresses e-mail. Vous bénéficiez d’un droit d’opposition que vous pouvez utiliser à tout moment via l’adresse labonnealternance@apprentissage.beta.gouv.fr +
+
Si vos droits ne sont pas respectés, vous pouvez à tout moment introduire une réclamation auprès de la CNIL. Pour plus d’informations sur le traitement de vos données, vous pouvez vous rendre sur la politique de confidentialité de La bonne alternance. +
+
+
+
- - - - - -
diff --git a/shared/constants/appointment.ts b/shared/constants/appointment.ts index 9fef4c7b43..0a9295c01c 100644 --- a/shared/constants/appointment.ts +++ b/shared/constants/appointment.ts @@ -7,4 +7,5 @@ export enum mailType { CANDIDAT_HAVE_YOU_BEEN_CONTACTED = "CANDIDAT_HAVE_YOU_BEEN_CONTACTED", CFA_REMINDER_RESEND_APPOINTMENT = "CFA_REMINDER_RESEND_APPOINTMENT", CANDIDAT_APPOINTMENT = "CANDIDAT_APPOINTMENT", + CFA_HARDBOUNCE = "CFA_HARDBOUNCE", } diff --git a/shared/constants/recruteur.ts b/shared/constants/recruteur.ts index a589bc2f8d..e745c98c4f 100644 --- a/shared/constants/recruteur.ts +++ b/shared/constants/recruteur.ts @@ -118,3 +118,16 @@ export enum TRAINING_REMOTE_TYPE { remote = "remote", hybrid = "hybrid", } + +export const RECRUITER_USER_ORIGIN = { + sante: "Opco Santé", + atlas: "Opco Atlas", + opco2i: "Opco 2i", + constructys: "Opco Constructys", + "opcoep-CRM": "Opco EP", + akto: "Opco Akto", + "lesentreprises-sengagent": "Les entreprises s'engagent", + "opcoep-HUBE": "Opco EP", + portailalternance: "Portail de l'alternance", + "1J1S": "1 jeune 1 solution", +} diff --git a/ui/public/images/emails/icone_idee.png b/ui/public/images/emails/icone_idee.png new file mode 100644 index 0000000000000000000000000000000000000000..901a46fc176188559c4b808a7e2ada6bc54a2c39 GIT binary patch literal 10414 zcmV;fC{fpmP)PyA07*naRCodHoeO*uRrdHRy1M%R?Jhs0ohhQCvaYnrgr_f7gx&S$a}{-~>ne)C zwwX!G``Kou!?R6hrY)r@RC$O9Xn8j&h=70!C@4Na5K!I%@_xTsdj6c77Sc9tGHKGh zCZA8*WHOI?@A=M|bMHOp+?W{crL}<80$K}bE#PbcNK3l~Y~ufbC^pgBL~DVtZUIot znIH>0z$!i!))mnTAKfhgxnfgLgt;K|6`%+y(cKza?ZdhSG?>F$d|KgMTR?-^wKcTQ zVch~6%wa7)t?;fbpuz0g8rtWuZUGJEuojYSfCh6|i!Xc%4;HZn zWDmP5kR=WV%#fXV7g$AFn{f=JWJBoO05La!!Y=`ZUk;M+LZFJ)*f7I{5f6aE+d&pq zBh-Pamv-I|Y5@Xsj<5j~0YDMfgDgDJ(BcsvjJ(Xdz+!F#68{KTgl=FlzXS^Zne#eg zHsoYzcuGIkQLz)$ihLe3~kxaI%&s;NejS)jEMk|0)lTlp-Ih3}o$;1^W?EyE0wkOEfzF~|~I z5oe_Q{9C*!L(P2%$T|E9avfRt8FGbZK@@MQxu5nuLR)}9nJcz+nj69;Q25OVL0#2_ z0RwIY%g`2J5j%oaco`&qU^O^vf_&{eKb<`GB|f*#{bgPN3*Q$k=I)Tiw*zr-TwUd; zxgB!F_Miw~fh?4PENp^2;Ykq1n``c;eUI=KKrkd$;I3zV;53du-YXH~K&}z2Jd^$+{8(_)kh}yqC5kPKwd&uEef+AcYAS*(W26BBZ z7U91UpvPxC3bOERrOB}YDuIR^u^C9_t^{I5sBK25fmH3jR(>c*{J+7P-X3h+|I`!% z0a@V}0NTik@bgtu2|@mS&Hc3RQPu(k=p6oW0<;s3uR-B^fh@cga7|nvZ zmW4r(%XbDP<59@rmx3%@07clPb@u9$YLxy)Y-5~Akw|37?n*oKAjtg0kO0~V_c&05 zA1X&JHdTVGg=0l2vu>+RK+fS4K^8fXGe?3XOadI@!tq+kJUMh=&Xh=*6k!MCh#VA& zx4Es5wlO+ezzMS08f2a$TG^=qM^ys-9>{!F$iOUTjwYs$%ol-`?+HrAod9q{bV^RE zb+s07f;_x6NJ8(ccCz3XXl334vM?27p%`Sr0Sdnqa`Cne0&bDZWFE_C24Bvxm_qL9NEuT7W#FCG!xU zK(g{^S7(DFOoklcdr%0p=;z_f8>iEcTpeCp4GKRVBmqqvbvG3bA&Q#)d`-B~^uakb zozX)zG)~CIfFu-xEPUQTh--r{3;RG8NHVkMen8ntzWtl{^9%o|n1 zEN8x3X;Prg>j}t)|1Jx^f}FX)>yDx#WP&UjG3X#_g&R#3C%zWh{41ciao4QRPL%~K zDE#gKYUA4QV-_SCZE1cHSb6V8K4jhu*%^P;rnaMiYT}7T9C*}pu*gKkRx%^l7#i92 z8U$z@9pUGKl^^ZZ(?k{qKwdf(1>%g}DuO7+5!cH4G;r z0b|qSBUGHxT`giOTT~6jjdD(ckO`1b0J*XZ{0|@rq(Vt-VoJ-kF?4Y9}MCV=OxTmAqNy;Pl(vbwQnY;f5#`4uB!ES1})})XG8S)gOoxYk=>U=rKne#l?&DU7X3T9c5K@q|Y=A|B^Q8bt%;||bZM)OJ2%n?De zDwxq5O$jwGxtexzt?vsx+RPfv5y5f{ScbOox&uf$fh3njm~;Sfxd(oZ7clq145E=C z(I~D3$QgHoBzT`21EWf=PfCO~)G~h@Bz}fRm=(S!;!`~eyb1`+$9x?Ybx`My1eiYqVD(af<#vE+ z6KWrC%K}(93t-j90G})Zm?YKS$J^`6{C9vOFjZxD_aD;_ z^QS)dFwMDt>L^oR18uYz;<#ygikq*ex#fDAT}j>)w~V3Lc?OCtVkkCON3kOe6!&Vo z<|!Q$|Jb`(Aj^p728-}ky#lWe0p>r(WfjyxmNyDu=>mXbhXF2L062RZVCQy#_gsJ; zKN{ex&j3!J1h{Y>;OrTIU$y}hTGU+&%Z7{bD8h1&KFye1(aJv_=r#_k^LLHudJ}?Y zX#U^(89L=n9mP#%;@OQ%Jhz{r*<%KZJH^o4IfmjcGZb6S&};=mbKrcl70zv@OM05U zz|hwhn=DBW@2AA7OJ|hU#+uEO0Kyx25G<&ipXpQ`R9o|qaS~M)XC0H|F zQ=y$lfy~dYTmZ*A(9kyCvDFFZ=~Dpb&N{)pe937epE}{RrE%+}O8{q1IkhsH9e5*n z4Kq3y;Sz6NCMu6+dpRMNYpaXnrt4|;SR+GQpXqYgKyedvacTGYs-+>DH>iLar+_j0 z{YH>^jE43MTdoN3UID!z)=uyu7Uf= z!cnq3MfFbWbrY%Pc3EuhYnz4fapFyF;!IC46!!z^$X)Ba`OhA1*v(-&%h0B|Obhle zzBDq79UD)U^Q|fDdcX72K@kpl4O&j7(-y|zHq^HG+O-2<_PYS@$N*ojacA57atLk-2 z&|laWPrBKYo#49b0B+u>4qzw56`*8(19GOtt0xR*105$mpthaDdjFO!lWx^h#^DUb zo^P1uY*Y>YWkRg6o!W+nEU^_>ROe+LLo(#cB$JT$5c(J9E0BX3^~nlTxco%jW<}L+ z*7P@{YU$y7|2O$hdWsvMr@4z^1Tt#u3Whe>6JmSPYJhfXXIuvx7h3lMi0k`|16lZ3 z)ntmlV9pURJO2)l$s#`9t#yJad$ak(s4+1*v`D^97nfpWXzrIV1DTi~dKxEb*dc0Q z#(g1oY&=-`UMgY64&hjkg*9Gh1oaQhS3njvfh4@+y`3zGpqQTrQT(IYwh7DqaUw() zZ|cF&>>fSMT?t2+8JfGIr%mhI#igmrr3S@GH-a<**E8|nlkS>^Hd{d=*^Y3@v-(XA zzrZYR1c_HXPFY_oA3kmPfsiHM8#O7p^v&5048?vC#vnU8hwQ) zdp5;4I`*g)T+RL4HA_oiD0W4dYU5fX9D0gd_?PCXsw0m<6q|v>_w^BIX9r9cJ^)2H z;Z{rg26GuGnHxYB@|`PNsj}-uunMn2T3YZyZW)twD?0J$<5C{c)2T@~>t&$1K@4ro zG|+4|zL|KgA48?R#>A&Q)uy?rJwx?~s|l;8?}@Z=C_}TCA_ZoK;=a{2H+J<@Z+E|= z0}iOksZpf?UH{AcBDX_#s$u4x%cZGb|Ic}2S;byBTH~&sjk2w4jCfN!Iwe6*rT#}x zaajh6TcD@8udj|Upa)tlEri<)G0W_-u4m>9dl+Up^;FM*{EjxT zF5cLK%w(ZoZyg%ghwXT-tqjGEXiHots~6uu_kNI}xqUvI*Xn)GZYgnK_aDTyVWYT%i8R-#Lx<$wVX;wLGqiCILvdxH0-?XkVW8LpiE$}!Hc&h< z=q3r4^uL4ZH3CUmFALO6xTsDupHb&L#GAotHbFM8Z}f=~9EH%wvB{088TAyqi=j+? za1;c?lk}A7M}GknV&~auh)a2?p)gk+e|0s~b|CTn)oDp{wsTQ4>C&0yXC$3(%A441E5Oe9Q{WS6QNkwt%umfBLqd)!=ji>Ovt}ced zdk1x6!EDYTe%ThWr9bMa@*K&((^1A=IMWtHZMIAAjJ5M0K)!+(fa5TD_Wl;he)ZV} zh`E8RgJLy5=iShq8C26`C6VU31yYdc;{e6t%^-^pfFz{2H#^+G?8$ed`tNmUX8sN0wwj-ROVE5R zaA-^)#|{k5h>egQGgb@qr->~G1U&CX)y)FM#WzB(crREpUajmTW`JbQ1j!FD%e)ON z<`G~u_k-;8XJNGYo~r8x^}jAYwd2)*&`2FUPzzk3_CKSixc>%A&>)I5jN?0lCFAug z7W1GpW#O;CRNg5$hD4L091=BWX;UY+`ZFYmWI_4_S}N&TCjisZl3B*bzwLvx!nm;-9g zR4`OZKmSRsVQ2bhi{#t>dbi2!yUb08nON?rhLs`!M<>v1Qbc*Bg zd_J8LU3D3n8ys;k>uC0U-zybRZ5AmeMg{s})aOv;6Oj!#C}LsOQ>I`}kVFcwb=9Mc zq1boPlxqNcem}Hz%+t4EV6g8>ECkIAoVxbCLYh|g)OLEB+mINS+S%_kHu!{M6ZC^& ze0SqLq-&n)Q-DE(i(c0Wm^=Ek^du1Ncb{+CgNAr6B_W~Vp<{K)uOZuYH2Z7=9LY9^ z!pKau`fD)z3~F6wMdfx9<|T!idEqMjHZ4>B%urm3FUrb5vr}Eq6%wB{m;(i~X>#vR?s^82|A(cJTgT@OKeEvJHo??Fvxkqpv zShQ~T`XBX_aZ=^#0A94c>8vi!_mHnTis8S_dWu`)%cDj+#?1{7&+Sj7*ysHxoxq>z zkw5ls#?b8adfjeG#1H#RTbdghs(k>`QVhk8)xdNEruxa3UAj2d*t&HHBaFD198;T}PW(jQB~U*gpDrQi zkXyA9fA2r3XlL@V1;i%0Sko&EN!H@CK)vWZMBuq`B`b>UuYv3%dVx5sP4nb7j< zm_JhWh7T3tThbf!alIbV)9m+w)o@{F%3Ne9F3-^1bU$W74PWs_e96To_up>3Lq~D1 z>S)u)#BPqj9B)3~oD_FPM;XW9qVh2@AriP5@l2|!px6Y3gGsL$nw=MB%aHjz0-*|M zvVc6hgrU+N4ph<>RU*@NuH6E-{8(aK>XUkk&1Wd~xGDkHwj&z{tj4`AW**(Fr`eIA z6t`Dfl2N@yY=Sl;o_;rfE?Ts_7914nnF8kbP6yzcfsZ5WFE zP#b!y<7T9|b^2H?RTr1+^WyEHEdPip8$%iY#!%e4NKD?{P%}x78Bbeqz1zi`?iORj zCJ`g_$g7ChL?3JF!cbb0mn!JnwM>P-J}?*_zHb09G+S<<*crG=K;+3jqG}{IX+s%x zdWv1fP;6A&#|ZG_x}osOKgNMM?LAn$U<1hFyeeCIi*qS6ZP+bj@o#-cT1!36P4PY? zrVd-OaYquW0Bi97_AOK4$&MM&^MxD`2hD`}GuOb*9fzR2tQ_#Qean96k}wp|^fJV; zBN?j4{|i}RMsvY%mZ~jnGBNSd5#MKs=K$Y-V}=9!S^?3z2=CfeTVU_5!%%j)i~#KV z=gg_|FfP5g@}^<8>Ec)>nwbgNx?{uxLv!n@?8IRHZ+Ay3y!E^S8EMnujprnI=-vSY zJYUOH1#XAC`oeRMWCHiP4f4h;gp%TQu=)Evuy6MfICP&u(V_&3}dIl>rY$ZwI?kwIC(NGn)4;u=k&?* zU@_0F(#~Ioa-NG2#H?|Oq^H@%zG}We9fyy9)S8X)La>+FH^R%^#)2U}724m~7aqE| zKY61qjddJ3WELDfd>Yn&;ndCy%~j~)Q;dxxA?+$&wLphIBsXU$T(3H`I&>ZGOoQ1| zS2YI9aP07DV%9wR=YjC*6Iqaz@ezDDZ54d<-f9>(;v?wB41)*n=?{5h7XWJKfxX`W ze1b3(yB+iIdDYO`PJwR$hD!NosDWHno;ROY8U<#whreFCo!mSd)^3N(E*-%0=PtqY zNz1`%o&#Tf@e?V}^up!v*aL%6V^`?nxc>{hl(Z{&)dGe%j<13z)c$w8yB}P*aJf-{ zuJ0lj&R-%LxoVVS_s@smKTlbRcGgqu0?ql}E7StNlQU8zv`h@wo9esuztqRswcl_A z;`os>@cD`#Ve6)S*R}`Z18VY#aw$CW=Yhb`rhU3N?$N+YO1px`7SPe`Y*%F`ooVQRw8xq4QuCq;g6j!dNxCzdr;lhPW{${t<`S$KQ0xv#38lHVP6AEPq8OwIv>Egx9FgbrI zbiBJSPH*ot+-`hO%a;*EpxZX>--@BRZJ`7)mIdwNpw0kR0F=&KUpYDAEYI8-U%0YN zKCk~`8@%}V7}U-c3~gj_F`FQYGrBL0jc=fg!x@@A7fL{z`@LTaoIq{3bg3Mcmu`g8 z`Rn1*rR(MdPRMj=GlZBC=vxifqTW(^K3h5B%ZH+oPMPAlIIuj5>y9 z?V$uSMt}I@g^u=~UfZ_(3U9xd11~%_51or}PyqV1r!9W*u~@S3Ye;!DA4-b9 ztk=dq^4m#xyL%3_ZDAt+aooDh z>_W)TT68q^wFxhWf-JQ%#Ka)bw1H+7rV)YerXLPPxl7>W@pJV8r{+hT@W2s>XCCBX z^srfQ`c(br#v5SW>aEbd%V=V5V3as|;9a>=0f!HrAa?v`%Qt~z?t1v}z12jM<1D4? zyCBqXeNp1Py?$s`ySYL41WB64;(&pvX+*0 zcRa$2qZ62t>(ToMk#H*eoG;b5(}$BFCyt*bCWK@D zdUz*yG10u417{E)5S%Q*@n>b^{CYLAE8GRyB`1`Tb4G-iD7E5X3*aaRE?myg?8&MQ zRYU&ch{20pMv>t%9LEjD3(W~k$Mw}`Kf(N2Yv7%{kE_8tA-jYml<9a^UufSl4f-UF z$Ie}~eOv){{aj!vxsp3}!L$KMIk##Ag;)!;XpwxIK9)5x6s}y~umD(u11BI>FZ+RX zt{NL;gcxH4KV9-2%$&RuCe>pDE2HMaKRb(Lcn{+XF;kK&v~_*9S?vh^3USb^2SQAg z(OsN`7Rh%p6q~N6*aJ92_EOi;keoCgI<@M1Z4B32z%kz&=AGEKWj|agubm<*P+;Sf zHs+Muv~f2qE%^p!6n*Lyln5*OPovK=*1da|Q6LF(y*k!racs^Xy+F&W5h}M2f?T<9 z{| z@IlcEcsK83k|v-ojp}YYYT4wZJW@wYz=%&3G(p_$>$=UBZ75nq^qKxsbX;ipi`@U@K~E6B;8ed z+I!c8|G_&e$!LK$&ObG;;NVMy|1 zc;+FVfQ%VMG4~wiaLyU!MQ70Js3?#YSqBU#*6ikB-$}aW=y=4PLdSEAwX5m+SOwQN zU+y5Cxo)~)@Kh%={O4&4^zS(l#*bU*79z~yhDj08+sxmu%a_YZ?l_#en>~4@YAuXV zoBK{D)8O6o!-#2tH|j(8^@o478$q&zW}D}@t(WT!K|Wg@6?tP9&dlsP{jOlkGODki z*s^ysJii#}XOoP4Uz*^vL( z*&9E05lL)bV6m&Ji~H-A?k$uY&qh5^!E6BL4)$S$`Tsg(z>)>|#tOtM=SM+u!P_m}qef62+A_MLkr(Y5cJqQ+YXS2T zd;7weI&`B{3sF(7E6^3hkNCF(Ct&rmO(eUg+Vcf{e+}kfAzbacH?+T1l?K6M_pe7^@4%w9{j1szP6AvdqfVs%v5EQ`cq zvH0d{t*d=$+!kovI_(xioUsQ6xMGsR+%XHQJ^t$=8_j~_=^qeW^{dUx_-PiDoVxkd#!cWd{uky>2e*60yCWq3c{Xu$-Z|gG@ZP+7NHd zN{sE@8c&5i`GTy4FWMx>fkHA=)o5e9KAAZFz2QpBCPwoQ9B)ivYpY)czk;kzB37VBv}yvbs5vqITX)L1a%g7294<&`J0$WjrF zbzRr%*d)h}0?U%W*WaGnuVL8&IXNFUE0paUT?HPf&sJd$$xPJlj#PN*@zEd-`oN>v zA!W{m)E+jk_VudVR>x~%wsT^s6u8BiQC>MrvJ#=q>;)IXC;ZkV0 zjeTtb@t$i)`D|AEIh$ zu>{tK?;A*#Zonv-M_LbrCp%<7(%;9Cq>Z@3)dY*@7(Y+fwpktD7UnE|-1}D1_6*w= zn3%Pol}&QYD3BUwLIwSkt(kK{9QXkYW2eHP|GrD!!`Z1Ya>z_Td%3{s41qvib z|3a%{S2zQ0lk8gyE%xpaBNVM7zO}%#+yzYu&~kVJjUd~sB|SBFPv7JpaYyBbDbN!o z2LTz&A8|s_D&%_$AP|L4lOyzPXms(E9BXaXMNerO*>{;o{E-FLlJ+*MV?&5K_Ty0E z!2;QlKRHM1>_t3`{;1%DadRKASxa(A$I9xs5bVw&1{m0^j)OL-v}Ant!bkm4N9`O@ z)B@-WjgN7gR64#;a%>8cPjs1cq{1x==~Q(BG9Vp?-oF)CuZ5Z+ANC(6-uRZ zC*m+z;I;J;o8qFid3V6k_XWz7T5-*S!m^W~167e8Kd=n5^4=WSAHW}!r;#2fB~ zM`HFI2Mgs=d!bZ1q#(Pr3;K|tr(e`Jy4C=JZ2=4vEfVdw6^xsIdtP?QT?N@CuM}GC zqYEW_iA}O^^Wel(W|QqZZPwCNldO&+o7LWLlDw!3o(Ii{oSe0{;&gjpYoMLoUoG(e Y0VMBV=k(O1@&Et;07*qoM6N<$g5S;#hyVZp literal 0 HcmV?d00001