diff --git a/back/src/registryDelegation/resolvers/mutations/__tests__/createRegistryDelegation.integration.ts b/back/src/registryDelegation/resolvers/mutations/__tests__/createRegistryDelegation.integration.ts index 26130c8bb6..267d98d450 100644 --- a/back/src/registryDelegation/resolvers/mutations/__tests__/createRegistryDelegation.integration.ts +++ b/back/src/registryDelegation/resolvers/mutations/__tests__/createRegistryDelegation.integration.ts @@ -251,6 +251,80 @@ describe("mutation createRegistryDelegation", () => { }); }); + it("testing email content - no end date", async () => { + // Given + const delegate = await companyFactory({ givenName: "Some given name" }); + const { user: delegatorAdmin, company: delegator } = + await userWithCompanyFactory(); + + // Email + jest.mock("../../../../mailer/mailing"); + (sendMail as jest.Mock).mockImplementation(() => Promise.resolve()); + + // When + const { errors, delegation } = await createDelegation(delegatorAdmin, { + delegateOrgId: delegate.orgId, + delegatorOrgId: delegator.orgId + }); + + // Then + expect(errors).toBeUndefined(); + expect(sendMail as jest.Mock).toHaveBeenCalledTimes(1); + expect(delegation).not.toBeUndefined(); + + if (!delegation) return; + + const formattedStartDate = toddMMYYYY(delegation.startDate).replace( + /\//g, + "/" + ); + expect(sendMail as jest.Mock).toHaveBeenCalledWith( + expect.objectContaining({ + body: expect.stringContaining(`effective à partir du ${formattedStartDate} + pour une durée illimitée.`), + subject: `Émission d'une demande de délégation de l'établissement ${delegator.name} (${delegator.siret})` + }) + ); + }); + + it("testing email content - with end date", async () => { + // Given + const delegate = await companyFactory({ givenName: "Some given name" }); + const { user: delegatorAdmin, company: delegator } = + await userWithCompanyFactory(); + const endDate = new Date("2050-10-10"); + + // Email + jest.mock("../../../../mailer/mailing"); + (sendMail as jest.Mock).mockImplementation(() => Promise.resolve()); + + // When + const { errors, delegation } = await createDelegation(delegatorAdmin, { + delegateOrgId: delegate.orgId, + delegatorOrgId: delegator.orgId, + endDate: endDate.toISOString() as any + }); + + // Then + expect(errors).toBeUndefined(); + expect(sendMail as jest.Mock).toHaveBeenCalledTimes(1); + + if (!delegation) return; + + const formattedStartDate = toddMMYYYY(delegation.startDate).replace( + /\//g, + "/" + ); + const formattedEndDate = toddMMYYYY(endDate).replace(/\//g, "/"); + expect(sendMail as jest.Mock).toHaveBeenCalledWith( + expect.objectContaining({ + body: expect.stringContaining(`effective à partir du ${formattedStartDate} + et jusqu'au ${formattedEndDate}.`), + subject: `Émission d'une demande de délégation de l'établissement ${delegator.name} (${delegator.siret})` + }) + ); + }); + describe("authentication & roles", () => { it("user must be authenticated", async () => { // Given diff --git a/back/src/registryDelegation/resolvers/mutations/utils/createRegistryDelegation.utils.ts b/back/src/registryDelegation/resolvers/mutations/utils/createRegistryDelegation.utils.ts index 696234d1ee..4360a09be1 100644 --- a/back/src/registryDelegation/resolvers/mutations/utils/createRegistryDelegation.utils.ts +++ b/back/src/registryDelegation/resolvers/mutations/utils/createRegistryDelegation.utils.ts @@ -92,6 +92,7 @@ export const sendRegistryDelegationCreationEmail = async ( const payload = renderMail(registryDelegationCreation, { variables: { startDate: toddMMYYYY(delegation.startDate), + endDate: delegation.endDate ? toddMMYYYY(delegation.endDate) : undefined, delegator, delegate }, diff --git a/back/src/registryDelegation/resolvers/subResolvers/status.ts b/back/src/registryDelegation/resolvers/subResolvers/status.ts index bef9b81fed..810dec5e0d 100644 --- a/back/src/registryDelegation/resolvers/subResolvers/status.ts +++ b/back/src/registryDelegation/resolvers/subResolvers/status.ts @@ -1,26 +1,14 @@ import { RegistryDelegation, - RegistryDelegationResolvers, - RegistryDelegationStatus + RegistryDelegationResolvers } from "../../../generated/graphql/types"; +import { getDelegationStatus } from "../utils"; /** * For frontend's convenience, we compute the status here */ -const getStatus = (delegation: RegistryDelegation) => { - const NOW = new Date(); - - const { isRevoked, startDate, endDate } = delegation; - - if (isRevoked) return "CLOSED" as RegistryDelegationStatus; - - if (startDate > NOW) return "INCOMING" as RegistryDelegationStatus; - - if (startDate <= NOW && (!endDate || endDate > NOW)) - return "ONGOING" as RegistryDelegationStatus; - - return "CLOSED" as RegistryDelegationStatus; -}; +const getStatus = (delegation: RegistryDelegation) => + getDelegationStatus(delegation); export const statusResolver: RegistryDelegationResolvers["status"] = delegation => getStatus(delegation); diff --git a/back/src/registryDelegation/resolvers/utils.ts b/back/src/registryDelegation/resolvers/utils.ts index 639f9f8d6c..13ea6a4e2d 100644 --- a/back/src/registryDelegation/resolvers/utils.ts +++ b/back/src/registryDelegation/resolvers/utils.ts @@ -2,6 +2,10 @@ import { prisma } from "@td/prisma"; import { UserInputError } from "../../common/errors"; import { getRegistryDelegationRepository } from "../repository"; import { Company, Prisma } from "@prisma/client"; +import { + RegistryDelegation, + RegistryDelegationStatus +} from "../../generated/graphql/types"; export const findDelegateAndDelegatorOrThrow = async ( delegateOrgId: string, @@ -74,3 +78,18 @@ export const findDelegateOrDelegatorOrThrow = async ( return { delegator, delegate }; }; + +export const getDelegationStatus = (delegation: RegistryDelegation) => { + const NOW = new Date(); + + const { isRevoked, startDate, endDate } = delegation; + + if (isRevoked) return "CLOSED" as RegistryDelegationStatus; + + if (startDate > NOW) return "INCOMING" as RegistryDelegationStatus; + + if (startDate <= NOW && (!endDate || endDate > NOW)) + return "ONGOING" as RegistryDelegationStatus; + + return "CLOSED" as RegistryDelegationStatus; +}; diff --git a/libs/back/mail/src/templates/index.ts b/libs/back/mail/src/templates/index.ts index 2476f0b9d7..6430a6bd8c 100644 --- a/libs/back/mail/src/templates/index.ts +++ b/libs/back/mail/src/templates/index.ts @@ -254,6 +254,7 @@ export const registryDelegationCreation: MailTemplate<{ startDate: string; delegator: Company; delegate: Company; + endDate?: string; }> = { subject: ({ delegator }) => `Émission d'une demande de délégation de l'établissement ${delegator.name} (${delegator.siret})`, diff --git a/libs/back/mail/src/templates/mustache/registry-delegation-creation.html b/libs/back/mail/src/templates/mustache/registry-delegation-creation.html index ebe6b0c3c2..62c6abfda7 100644 --- a/libs/back/mail/src/templates/mustache/registry-delegation-creation.html +++ b/libs/back/mail/src/templates/mustache/registry-delegation-creation.html @@ -1,8 +1,12 @@

La plateforme Trackdéchets vous informe qu'une délégation a été accordée par l'établissement {{delegator.name}} ({{delegator.siret}}) à l'établissement - {{delegate.name}} ({{delegate.siret}}), effective à partir du {{startDate}}. - Cette délégation permet à l'établissement {{delegate.name}} + {{delegate.name}} ({{delegate.siret}}), effective à partir du {{startDate}} + {{#endDate}} + et jusqu'au {{endDate}}. + {{/endDate}} {{^endDate}} + pour une durée illimitée. + {{/endDate}} Cette délégation permet à l'établissement {{delegate.name}} ({{delegate.siret}}) de déclarer des registres de déchets règlementaires au nom de l'établissement {{delegator.name}} ({{delegator.siret}}).