diff --git a/packages/app/.env.development b/packages/app/.env.development index 6376af555..6838b1c02 100644 --- a/packages/app/.env.development +++ b/packages/app/.env.development @@ -81,5 +81,4 @@ SECURITY_CHARON_URL="https://egapro-charon.dev.fabrique.social.gouv.fr" # old EGAPRO_SENTRY_DSN SENTRY_DSN="" # old EGAPRO_FLAVOUR -SENTRY_ENVIRONMENT="development" SENTRY_AUTH_TOKEN=3b4a6e7f1e2346cebd6ad7fa390d66c800dfce8331fc4982a12aafefed1cc47f diff --git a/packages/app/.env.production b/packages/app/.env.production index b37e433f1..a389acd60 100644 --- a/packages/app/.env.production +++ b/packages/app/.env.production @@ -75,5 +75,4 @@ SECURITY_CHARON_URL="https://egapro-charon.dev.fabrique.social.gouv.fr" # old EGAPRO_SENTRY_DSN SENTRY_DSN="" # old EGAPRO_FLAVOUR -SENTRY_ENVIRONMENT="prod" SENTRY_AUTH_TOKEN=3b4a6e7f1e2346cebd6ad7fa390d66c800dfce8331fc4982a12aafefed1cc47f diff --git a/packages/app/.env.test b/packages/app/.env.test index ef588225d..ccfc2b349 100644 --- a/packages/app/.env.test +++ b/packages/app/.env.test @@ -66,5 +66,3 @@ SECURITY_ALLOWED_IPS="" # old EGAPRO_SENTRY_DSN SENTRY_DSN="" # old EGAPRO_FLAVOUR -SENTRY_ENVIRONMENT="test" - diff --git a/packages/app/sentry.client.config.ts b/packages/app/sentry.client.config.ts index cb63b2645..8231d43c9 100644 --- a/packages/app/sentry.client.config.ts +++ b/packages/app/sentry.client.config.ts @@ -6,7 +6,7 @@ import * as Sentry from "@sentry/nextjs"; Sentry.init({ dsn: "https://28b6186c058a49fc94ee665667e44612@sentry.fabrique.social.gouv.fr/99", - environment: process.env.SENTRY_ENVIRONMENT, + environment: process.env.EGAPRO_ENV || "dev", // Adjust this value in production, or use tracesSampler for greater control tracesSampleRate: 1, diff --git a/packages/app/sentry.edge.config.ts b/packages/app/sentry.edge.config.ts index d82002bd3..c2237ebf2 100644 --- a/packages/app/sentry.edge.config.ts +++ b/packages/app/sentry.edge.config.ts @@ -7,7 +7,7 @@ import * as Sentry from "@sentry/nextjs"; Sentry.init({ dsn: "https://28b6186c058a49fc94ee665667e44612@sentry.fabrique.social.gouv.fr/99", - environment: process.env.SENTRY_ENVIRONMENT, + environment: process.env.EGAPRO_ENV || "dev", // Adjust this value in production, or use tracesSampler for greater control tracesSampleRate: 1, diff --git a/packages/app/sentry.server.config.ts b/packages/app/sentry.server.config.ts index 76e48ae34..b95a4b618 100644 --- a/packages/app/sentry.server.config.ts +++ b/packages/app/sentry.server.config.ts @@ -6,7 +6,7 @@ import * as Sentry from "@sentry/nextjs"; Sentry.init({ dsn: "https://28b6186c058a49fc94ee665667e44612@sentry.fabrique.social.gouv.fr/99", - environment: process.env.SENTRY_ENVIRONMENT, + environment: process.env.EGAPRO_ENV || "dev", // Adjust this value in production, or use tracesSampler for greater control tracesSampleRate: 1, diff --git a/packages/app/src/app/(default)/load-test/IndexList.tsx b/packages/app/src/app/(default)/load-test/IndexList.tsx new file mode 100644 index 000000000..bd9644467 --- /dev/null +++ b/packages/app/src/app/(default)/load-test/IndexList.tsx @@ -0,0 +1,138 @@ +"use client"; + +import Table from "@codegouvfr/react-dsfr/Table"; +import { CompanyWorkforceRange } from "@common/core-domain/domain/valueObjects/declaration/CompanyWorkforceRange"; +import { type DeclarationDTO } from "@common/core-domain/dtos/DeclarationDTO"; +import { type DeclarationOpmcDTO } from "@common/core-domain/dtos/DeclarationOpmcDTO"; +import { formatIsoToFr } from "@common/utils/date"; +import { Heading, Link } from "@design-system"; +import { isBefore, sub } from "date-fns"; +import { capitalize, upperCase } from "lodash"; + +import { buildHelpersObjectifsMesures } from "../index-egapro/objectifs-mesures/[siren]/[year]/ObjectifsMesuresForm"; + +//Note: For 2022, first year of OPMC, we consider that the duration to be frozen is 2 years, but for next years, it will be 1 year like isFrozenDeclaration. +const OPMC_FROZEN_DURATION = { years: 2 }; + +const isFrozenDeclarationForOPMC = (declaration: DeclarationOpmcDTO) => + declaration?.["declaration-existante"]?.date + ? isBefore(new Date(declaration?.["declaration-existante"]?.date), sub(new Date(), OPMC_FROZEN_DURATION)) + : false; + +enum declarationOpmcStatus { + ALREADY_FILLED = "Déjà renseignés", + COMPLETED = "Renseignés", + INDEX_OVER_85 = "Index supérieur à 85", + NOT_APPLICABLE = "Non applicable", + NOT_MODIFIABLE = "Déclaration non modifiable", + NOT_MODIFIABLE_CORRECT = "Déclaration non modifiable sur données correctes", + NOT_MODIFIABLE_INCORRECT = "Déclaration non modifiable sur données incorrectes", + TO_COMPLETE = "À renseigner", + YEAR_NOT_APPLICABLE = "Année non applicable", +} + +const getDeclarationOpmcStatus = (declaration?: DeclarationOpmcDTO) => { + if (!declaration) return declarationOpmcStatus.NOT_APPLICABLE; + const { after2021, index, initialValuesObjectifsMesures, objectifsMesuresSchema } = + buildHelpersObjectifsMesures(declaration); + + if (!declaration["resultat-global"] || index === undefined) return declarationOpmcStatus.NOT_APPLICABLE; + if (!after2021) return declarationOpmcStatus.YEAR_NOT_APPLICABLE; + if (index >= 85) return declarationOpmcStatus.INDEX_OVER_85; + + try { + objectifsMesuresSchema.parse(initialValuesObjectifsMesures); + if (isFrozenDeclarationForOPMC(declaration)) return declarationOpmcStatus.NOT_MODIFIABLE_CORRECT; + } catch (e) { + if (isFrozenDeclarationForOPMC(declaration)) return declarationOpmcStatus.NOT_MODIFIABLE_INCORRECT; + return declarationOpmcStatus.TO_COMPLETE; + } + return declarationOpmcStatus.COMPLETED; +}; + +const formatDeclarationOpmcStatus = (status: declarationOpmcStatus, siren: string, year: number) => { + const withLink = (text: string) => ( + + {text} + + ); + + switch (status) { + case declarationOpmcStatus.COMPLETED: + return withLink(declarationOpmcStatus.COMPLETED); + case declarationOpmcStatus.INDEX_OVER_85: + return declarationOpmcStatus.INDEX_OVER_85; + case declarationOpmcStatus.NOT_APPLICABLE: + return declarationOpmcStatus.NOT_APPLICABLE; + case declarationOpmcStatus.NOT_MODIFIABLE_CORRECT: + return withLink(declarationOpmcStatus.ALREADY_FILLED); + case declarationOpmcStatus.NOT_MODIFIABLE_INCORRECT: + return withLink(declarationOpmcStatus.NOT_MODIFIABLE); + case declarationOpmcStatus.TO_COMPLETE: + return withLink(declarationOpmcStatus.TO_COMPLETE); + case declarationOpmcStatus.YEAR_NOT_APPLICABLE: + return declarationOpmcStatus.YEAR_NOT_APPLICABLE; + default: + return declarationOpmcStatus.NOT_APPLICABLE; + } +}; + +const formatTableData = (declarations: DeclarationDTO[], declarationOpmcList: DeclarationOpmcDTO[]) => + declarations.map(declaration => { + const rowYear = declaration.commencer?.annéeIndicateurs; + const rowSiren = declaration.commencer?.siren; + return [ + + {declaration.commencer?.siren} + , + rowYear, + declaration.entreprise?.type === "ues" + ? upperCase(declaration.entreprise?.type) + : capitalize(declaration.entreprise?.type), + declaration.entreprise?.tranche ? CompanyWorkforceRange.Label[declaration.entreprise.tranche] : undefined, + formatIsoToFr(declaration["declaration-existante"].date || ""), + declaration["resultat-global"]?.index || NC, + formatDeclarationOpmcStatus( + getDeclarationOpmcStatus( + declarationOpmcList.find(declarationOpmc => declarationOpmc.commencer?.annéeIndicateurs === rowYear), + ), + rowSiren || "", + rowYear || 0, + ), + + Télécharger + , + ]; + }); + +export const IndexList = ({ + declarations, + declarationOpmcList, +}: { + declarationOpmcList: DeclarationOpmcDTO[]; + declarations: DeclarationDTO[]; +}) => { + const headers = [ + "SIREN", + "ANNÉE INDICATEUR", + "STRUCTURE", + "TRANCHE D'EFFECTIF", + "DATE DE DÉCLARATION", + "INDEX", + "OBJECTIFS ET MESURES", + "RÉCAPITULATIF", + ]; + + return ( +
Aucune déclaration transmise.
} +Aucune déclaration transmise.
} ++ Dans ce menu, vous avez accès à la liste des déclarations de l’index de l’égalité professionnelle et, si vous êtes + assujetti, de la représentation équilibrée qui ont été transmises à l’administration, en sélectionnant au + préalable dans la liste déroulante le numéro Siren de l'entreprise (ou de l’entreprise ayant déclaré l'index pour + le compte de l’unité économique et sociale) concernée si vous gérez plusieurs entreprises. +
++ Vous pouvez ainsi télécharger le récapitulatif de la déclaration à la colonne « RÉCAPITULATIF », et en + cliquant sur le Siren, vous accédez à la déclaration transmise. A la colonne « OBJECTIFS ET MESURES », vous + avez accès à la déclaration des mesures de correction lorsque l’index est inférieur à 75 points et des objectifs + de progression lorsque l’index est inférieur à 85 points. +
+ > +); + +const LoadTestPage = async ({ searchParams }: NextServerPageProps