From 2b0dcf8a65283764adce35de2f0f97911df1d736 Mon Sep 17 00:00:00 2001 From: carolineBda Date: Thu, 26 Sep 2024 11:12:52 +0200 Subject: [PATCH] fix --- README.md | 2 +- shared/types/src/hasura/contributions.ts | 1 + .../filterContributionToPublish.test.ts | 118 ------------ .../fetchContributionDocumentsToPublish.ts | 28 +-- .../src/services/export.ts | 41 ++-- .../__mocks__/@codegouvfr/react-dsfr/index.ts | 1 + .../mapContributionToDocument.test.ts | 11 +- .../src/modules/contribution/api/mutation.ts | 9 + .../src/modules/contribution/api/query.ts | 1 + .../modules/contribution/api/repository.ts | 16 +- .../api/__tests__/documents.service.test.ts | 178 ++++++++++++++++++ .../documents/api/documents.service.ts | 7 + .../src/modules/export/document.query.ts | 6 +- .../down.sql | 7 + .../up.sql | 5 + 15 files changed, 254 insertions(+), 177 deletions(-) delete mode 100644 targets/export-elasticsearch/src/ingester/contributions/__tests__/filterContributionToPublish.test.ts create mode 100644 targets/frontend/src/modules/contribution/api/mutation.ts create mode 100644 targets/frontend/src/modules/documents/api/__tests__/documents.service.test.ts create mode 100644 targets/hasura/migrations/default/1727341598645_alter_table_contribution_set_cdtn_id/down.sql create mode 100644 targets/hasura/migrations/default/1727341598645_alter_table_contribution_set_cdtn_id/up.sql diff --git a/README.md b/README.md index e7ccbe88b..cf6009ede 100644 --- a/README.md +++ b/README.md @@ -149,7 +149,7 @@ docker-compose up -d hasura minio elasticsearch createbuckets #### 5. Run ingester in development mode ```sh -DISABLE_LIMIT_EXPORT=true DISABLE_AGREEMENTS=true DISABLE_SITEMAP=true HASURA_GRAPHQL_ENDPOINT="http://localhost:8080/v1/graphql" HASURA_GRAPHQL_ADMIN_SECRET="admin1" ELASTICSEARCH_URL_PREPROD="http://localhost:9200" ELASTICSEARCH_URL_PROD="http://localhost:9200" SITEMAP_DESTINATION_FOLDER="sitemap" SITEMAP_NAME="sitemap.xml" SITEMAP_ENDPOINT="http://localhost:3001/api/sitemap" AGREEMENTS_DESTINATION_FOLDER="agreements" AGREEMENTS_DESTINATION_NAME="index.json" BUCKET_DEFAULT_FOLDER="default" BUCKET_DRAFT_FOLDER="draft" BUCKET_PUBLISHED_FOLDER= BUCKET_PREVIEW_FOLDER="preview" BUCKET_ACCESS_KEY="MINIO_ACCESS_KEY" BUCKET_ENDPOINT=http://localhost:9000 BUCKET_NAME="cdtn" BUCKET_SECRET_KEY="MINIO_SECRET_KEY" BUCKET_REGION="us-east-1" CDTN_ADMIN_ENDPOINT="http://localhost:8080/v1/graphql" ELASTICSEARCH_INDEX_PREPROD="cdtn-v2" ELASTICSEARCH_INDEX_PROD="cdtn-v2" FETCH_PAGE_SIZE=1000 FETCH_JOB_CONCURRENCY=5 yarn workspace export-elasticsearch dev +DISABLE_LIMIT_EXPORT=true DISABLE_AGREEMENTS=true DISABLE_SITEMAP=true DISABLE_COPY=true HASURA_GRAPHQL_ENDPOINT="http://localhost:8080/v1/graphql" HASURA_GRAPHQL_ADMIN_SECRET="admin1" ELASTICSEARCH_URL_PREPROD="http://localhost:9200" ELASTICSEARCH_URL_PROD="http://localhost:9200" SITEMAP_DESTINATION_FOLDER="sitemap" SITEMAP_NAME="sitemap.xml" SITEMAP_ENDPOINT="http://localhost:3001/api/sitemap" AGREEMENTS_DESTINATION_FOLDER="agreements" AGREEMENTS_DESTINATION_NAME="index.json" BUCKET_DEFAULT_FOLDER="default" BUCKET_DRAFT_FOLDER="draft" BUCKET_PUBLISHED_FOLDER= BUCKET_PREVIEW_FOLDER="preview" BUCKET_ACCESS_KEY="MINIO_ACCESS_KEY" BUCKET_ENDPOINT=http://localhost:9000 BUCKET_NAME="cdtn" BUCKET_SECRET_KEY="MINIO_SECRET_KEY" BUCKET_REGION="us-east-1" CDTN_ADMIN_ENDPOINT="http://localhost:8080/v1/graphql" ELASTICSEARCH_INDEX_PREPROD="cdtn-v2" ELASTICSEARCH_INDEX_PROD="cdtn-v2" FETCH_PAGE_SIZE=1000 FETCH_JOB_CONCURRENCY=5 yarn workspace export-elasticsearch dev ``` - `DISABLE_LIMIT_EXPORT` is used to disable the limit to run two export in less than one hour diff --git a/shared/types/src/hasura/contributions.ts b/shared/types/src/hasura/contributions.ts index d3a08091a..bd08ecaf5 100644 --- a/shared/types/src/hasura/contributions.ts +++ b/shared/types/src/hasura/contributions.ts @@ -8,6 +8,7 @@ export type ContributionStatus = { export type ContributionsAnswers = { id: string; + cdtnId: string | null; content: string | null; description: string | null; content_type: ContributionContentType; diff --git a/targets/export-elasticsearch/src/ingester/contributions/__tests__/filterContributionToPublish.test.ts b/targets/export-elasticsearch/src/ingester/contributions/__tests__/filterContributionToPublish.test.ts deleted file mode 100644 index 162bc2c7a..000000000 --- a/targets/export-elasticsearch/src/ingester/contributions/__tests__/filterContributionToPublish.test.ts +++ /dev/null @@ -1,118 +0,0 @@ -import { - ContributionDocumentJson, - ContributionsAnswers, - DocumentElasticWithSource, -} from "@socialgouv/cdtn-types"; -import { filterContributionDocumentsToPublish } from "../fetchContributionDocumentsToPublish"; - -const contributionMock: ContributionsAnswers = { - id: "d61a3e21-9bf1-4199-b9d7-944c2382750c", - updatedAt: "2024-03-25T17:25:33.002376+00:00", - agreement: { - id: "id", - kali_id: "", - name: "", - }, - cdtn_references: [], - content: "", - content_fiche_sp: { - initial_id: "", - document: { - date: "", - description: "", - raw: "", - referencedTexts: [], - url: "", - }, - }, - content_type: "ANSWER", - description: "", - kali_references: [], - legi_references: [], - message_block_generic_no_CDT: "", - other_references: [], - question: { - content: "", - id: "", - order: 1, - }, - statuses: [], - display_date: "2024-03-25", -}; - -const doc: DocumentElasticWithSource = { - date: "", - id: "", - title: "", - excludeFromSearch: true, - slug: "", - source: "contributions", - text: "", - isPublished: true, - metaDescription: "", - references: [], - linkedContent: [], - questionIndex: 1, - questionName: "", - questionId: "", - genericAnswerId: "", - type: "cdt", - idcc: "", - refs: [], - breadcrumbs: [], - cdtnId: "", - contentType: "ANSWER", - description: "", - contribution: contributionMock, -}; - -describe("filterContributionDocumentsToPublish", () => { - it("should send the list of contributions which have been updated after last export", () => { - const result = filterContributionDocumentsToPublish( - { - id: "id", - created_at: new Date("2024-06-03T08:10:03.697249+00:00"), - }, - [ - { - ...doc, - cdtnId: "388f8d7860", - contribution: { - ...contributionMock, - statuses: [ - { - status: "TO_PUBLISH", - createdAt: "2024-03-27T14:26:28.387898+00:00", - }, - ], - }, - }, - ] - ); - expect(result?.length).toBe(0); - }); - it("should send the list of contributions which have been updated after last export2", () => { - const result = filterContributionDocumentsToPublish( - { - id: "id", - created_at: new Date("2024-06-03T08:10:03.697249+00:00"), - }, - [ - { - ...doc, - cdtnId: "388f8d7860", - contribution: { - ...contributionMock, - statuses: [ - { - status: "TO_PUBLISH", - createdAt: "2024-06-27T14:26:28.387898+00:00", - }, - ], - }, - }, - ] - ); - expect(result?.length).toBe(1); - }); -}); diff --git a/targets/export-elasticsearch/src/ingester/contributions/fetchContributionDocumentsToPublish.ts b/targets/export-elasticsearch/src/ingester/contributions/fetchContributionDocumentsToPublish.ts index e0c0d98b4..b3dfd8078 100644 --- a/targets/export-elasticsearch/src/ingester/contributions/fetchContributionDocumentsToPublish.ts +++ b/targets/export-elasticsearch/src/ingester/contributions/fetchContributionDocumentsToPublish.ts @@ -1,7 +1,6 @@ import { ContributionDocumentJson, DocumentElasticWithSource, - ExportEsStatus, } from "@socialgouv/cdtn-types"; import { context } from "../context"; import { gqlClient } from "@shared/utils"; @@ -17,10 +16,6 @@ query fetchContributionsInDocuments($updated_at: timestamptz!) { cdtnId: cdtn_id contribution { id - statuses(where:{status: {_eq: "TO_PUBLISH"}}, order_by: {created_at: desc}, limit: 1) { - status - createdAt: created_at - } } } } @@ -30,24 +25,6 @@ interface HasuraReturn { documents: [DocumentElasticWithSource] | undefined; } -export function filterContributionDocumentsToPublish( - latestExportEs: Partial | undefined, - contributionDocs: - | DocumentElasticWithSource[] - | undefined -): DocumentElasticWithSource[] | undefined { - return contributionDocs?.filter((doc) => { - const exportDate = latestExportEs?.created_at - ? new Date(latestExportEs.created_at).getTime() - : 0; - const statusDate = doc.contribution?.statuses?.length - ? new Date(doc.contribution.statuses[0].createdAt).getTime() - : 0; - - return statusDate > exportDate; - }); -} - export async function fetchContributionDocumentToPublish( isProd: boolean ): Promise[] | undefined> { @@ -75,8 +52,5 @@ export async function fetchContributionDocumentToPublish( throw res.error; } - return filterContributionDocumentsToPublish( - lastCompletedExportEsStatus, - res.data?.documents - ); + return res.data?.documents; } diff --git a/targets/export-elasticsearch/src/services/export.ts b/targets/export-elasticsearch/src/services/export.ts index a22a174fe..cce1a26dd 100644 --- a/targets/export-elasticsearch/src/services/export.ts +++ b/targets/export-elasticsearch/src/services/export.ts @@ -40,19 +40,21 @@ export class ExportService { environment, Status.running ); + const envName = + environment === Environment.preproduction + ? "Préproduction" + : "Production"; try { if (!process.env.DISABLE_INGESTER) { + const startMessage = `**${envName}:** mise à jour lancée par *${exportEs.user?.name}* 🚀`; + await sendMattermostMessage( + startMessage, + process.env.MATTERMOST_CHANNEL_EXPORT + ); + logger.info(startMessage); if (environment === Environment.preproduction) { - await sendMattermostMessage( - `**Préproduction:** mise à jour lancée par *${exportEs.user?.name}* 😎`, - process.env.MATTERMOST_CHANNEL_EXPORT - ); await runWorkerIngesterPreproduction(); } else { - await sendMattermostMessage( - `**Production:** mise à jour lancée par *${exportEs.user?.name}* 🚀`, - process.env.MATTERMOST_CHANNEL_EXPORT - ); await runWorkerIngesterProduction(); } } @@ -66,17 +68,14 @@ export class ExportService { await this.copyContainerService.runCopy(environment); } const exportEsDone = await this.exportRepository.getOne(id); - if (environment === Environment.preproduction) { - await sendMattermostMessage( - `**Préproduction:** mise à jour terminée (${exportEsDone.documentsCount?.total} documents) 😁`, - process.env.MATTERMOST_CHANNEL_EXPORT - ); - } else { - await sendMattermostMessage( - `**Production:** mise à jour terminée (${exportEsDone.documentsCount?.total} documents) 🎉`, - process.env.MATTERMOST_CHANNEL_EXPORT - ); - } + + const message = `**${envName}:** mise à jour terminée (${exportEsDone.documentsCount?.total} documents) 🎉`; + logger.info(message); + await sendMattermostMessage( + message, + process.env.MATTERMOST_CHANNEL_EXPORT + ); + return await this.exportRepository.updateOne( id, Status.completed, @@ -84,9 +83,7 @@ export class ExportService { ); } catch (e: any) { await sendMattermostMessage( - environment === Environment.preproduction - ? " La mise à jour de la préproduction a échouée. 😢" - : "La mise à jour de la production a échouée. 😭", + `⚠️ **${envName}:** La mise à jour a échouée. ⚠️`, process.env.MATTERMOST_CHANNEL_EXPORT ); return await this.exportRepository.updateOne( diff --git a/targets/frontend/__mocks__/@codegouvfr/react-dsfr/index.ts b/targets/frontend/__mocks__/@codegouvfr/react-dsfr/index.ts index 5cf9f6d58..2c7bf15a2 100644 --- a/targets/frontend/__mocks__/@codegouvfr/react-dsfr/index.ts +++ b/targets/frontend/__mocks__/@codegouvfr/react-dsfr/index.ts @@ -26,5 +26,6 @@ module.exports = { }, }, }, + spacing: jest.fn() }, }; diff --git a/targets/frontend/src/modules/contribution/__tests__/mapContributionToDocument.test.ts b/targets/frontend/src/modules/contribution/__tests__/mapContributionToDocument.test.ts index ae09af23e..dd5c5256c 100644 --- a/targets/frontend/src/modules/contribution/__tests__/mapContributionToDocument.test.ts +++ b/targets/frontend/src/modules/contribution/__tests__/mapContributionToDocument.test.ts @@ -32,6 +32,7 @@ describe("mapContributionToDocument", () => { updatedAt: "2024-07-11T13:18:08.000Z", display_date: "2024-07-11T13:18:08.000Z", id: "effee3b9-84fb-4667-944b-4b1e1fd14eb5", + cdtnId: "1234", content: "

Quand une femme tombe enceinte et décide de partir en congé maternité, cette dernière a droit à des indemnités journalières de sécurité sociale venant indemniser la période durant laquelle elle ne peut plus travailler. Certaines conventions collectives prévoient également un maintien de salaire versé par l’employeur. Si le maintien est à 100%, dans ce cas, les deux mécanismes ne sont pas cumulables. Si le maintien est inférieur à 100%, le pourcentage de rémunération restant est indemnisé par les indemnités de Sécurité sociale. 

Maintien de salaire

Les salariées ayant au moins une année de présence continue dans l'entreprise à la date de l'accouchement ont droit à un maintien de salaire, après déduction des indemnités de Sécurité sociale, qui leur assure leur salaire habituel, et ce pendant une durée de 36 jours (en principe 18 jours avant l’accouchement, 18 jours après).

Pour les salariées cadres âgées de moins de 25 ans et les autres salariées âgées de moins de 22 ans à la date de l'accouchement, la période de 36 jours est augmentée de 2 jours par enfant à charge. L'indemnité complémentaire ne pourra pas être versée plus de 46 jours. Est considéré comme enfant à charge tout enfant à charge de la salariée au sens de la législation des prestations familiales et âgé de moins de 15 ans à la date de l'accouchement.

A noter : Les périodes de suspension du contrat de travail (maladie, etc.) sont prises en compte pour l'ancienneté.

Si la salariée ne respecte pas la condition d’ancienneté, elle n’a pas droit au maintien de salaire versé par l’employeur mais aura potentiellement droit aux indemnités journalières de Sécurité sociale si elle respecte ses conditions d’octroi. 

Indemnités de Sécurité sociale

Conditions d’ouverture des droits aux indemnités journalières de Sécurité sociale

Pour être indemnisée, la salariée doit remplir les conditions suivantes :

  • Etre affiliée à la Sécurité sociale depuis au moins 10 mois à la date présumée de l'accouchement ;

  • cesser son activité professionnelle pendant au moins 8 semaines ;

  • avoir : 

    • soit travaillé au moins 150 heures au cours des 3 mois civils ou des 90 jours précédant l'arrêt, 

    • soit travaillé au moins 600 heures au cours des 12 mois précédant l’arrêt de travail, 

    • soit cotisé, au cours des 6 mois civils précédant l'arrêt, sur la base d'une rémunération au moins égale à 1 015 fois le montant du Smic horaire fixé au début de cette période, 

    • soit cotisé au cours des 12 mois civils précédant l’arrêt, sur la base d'une rémunération au moins égale à 2030 fois le montant du Smic horaire fixé en début de période.

Exemple : le congé a débuté le 1er juillet 2023 pour une date présumée d'accouchement au 1er septembre 2023.

Le droit aux indemnités journalières est ouvert si :

  • La salariée était déjà affiliée à la Sécurité sociale avant novembre 2022 ;

  • et a travaillé soit au moins 150 heures entre le 1er avril 2023 et le 30 juin 2023, soit au moins 600 heures entre le 1er juillet 2022 et le 30 juin 2023, soit a cotisé entre le 1er janvier 2023 et le 30 juin 2023 sur la base d'une rémunération au moins égale à 11 439,05 €, soit a cotisé entre le 1er juillet 2022 et le 30 juin 2023 sur la base d’une rémunération au moins égale à 22 878,1 €.

Montant

La CPAM verse des indemnités journalières, dont le montant est fixé selon les étapes de calcul suivantes :

  • Calcul du salaire journalier de base : somme des 3 derniers salaires bruts perçus avant la date d'interruption du travail, divisé par 91,25.

  • Montant maximal du salaire journalier de base : le salaire pris en compte ne peut pas dépasser le plafond mensuel de la sécurité sociale en vigueur lors du dernier jour du mois qui précède l'arrêt (soit 3 666 € par mois en 2023, ou 3 428 € en 2022).

  • Taux forfaitaire appliqué par la CPAM : la CPAM retire à ce salaire journalier de base un taux forfaitaire de 21 %.

  • Montant minimal et montant maximal des indemnités journalières : le montant ne peut pas être inférieur à 10,24 € ni supérieur à 95,22 € par jour.

Versement

Les indemnités journalières sont versées tous les 14 jours.

", description: @@ -366,6 +367,7 @@ describe("mapContributionToDocument", () => { updatedAt: "2024-07-11T13:18:08.000Z", display_date: "2024-07-11T13:18:08.000Z", id: "effee3b9-84fb-4667-944b-4b1e1fd14eb5", + cdtnId: "1234", content: null, description: null, content_type: "GENERIC_NO_CDT", @@ -424,6 +426,7 @@ describe("mapContributionToDocument", () => { const inputContribution: ContributionsAnswers = { updatedAt: "", id: "effee3b9-84fb-4667-944b-4b1e1fd14eb5", + cdtnId: "1234", content: null, description: null, content_type: type, @@ -467,6 +470,7 @@ describe("mapContributionToDocument", () => { it("devrait être à false pour une réponse personnalisée", async () => { const inputContribution: ContributionsAnswers = { id: "effee3b9-84fb-4667-944b-4b1e1fd14eb5", + cdtnId: "1234", updatedAt: "2024-07-11T13:18:08.000Z", display_date: "2024-07-11T13:18:08.000Z", content: "

Texte de la réponse

", @@ -517,9 +521,9 @@ describe("mapContributionToDocument", () => { }); it("devrait être à true pour une réponse générique", async () => { - const inputContribution: ContributionsAnswers = { id: "effee3b9-84fb-4667-944b-4b1e1fd14eb5", + cdtnId: "1234", updatedAt: "2024-07-11T13:18:08.000Z", display_date: "2024-07-11T13:18:08.000Z", content: "

Texte de la réponse

", @@ -553,9 +557,9 @@ describe("mapContributionToDocument", () => { }); it("devrait garder la même valeur du document pour une réponse générique", async () => { - const inputContribution: ContributionsAnswers = { id: "effee3b9-84fb-4667-944b-4b1e1fd14eb5", + cdtnId: "1234", updatedAt: "2024-07-11T13:18:08.000Z", display_date: "2024-07-11T13:18:08.000Z", content: "

Texte de la réponse

", @@ -606,9 +610,9 @@ describe("mapContributionToDocument", () => { }); it("2 contribs de la même question doivent générer des cdtn_id différent si elle n'existe pas", async () => { - const inputContribution: ContributionsAnswers = { id: "effee3b9-84fb-4667-944b-4b1e1fd14eb5", + cdtnId: "1234", updatedAt: "2024-07-11T13:18:08.000Z", display_date: "2024-07-11T13:18:08.000Z", content: "

Texte de la réponse

", @@ -642,6 +646,7 @@ describe("mapContributionToDocument", () => { const inputContribution2: ContributionsAnswers = { id: "effee3b9-84fb-4667-944b-4b1e1fd14eb6", + cdtnId: "1234", updatedAt: "2024-07-11T13:18:08.000Z", display_date: "2024-07-11T13:18:08.000Z", content: "

Texte de la réponse

", diff --git a/targets/frontend/src/modules/contribution/api/mutation.ts b/targets/frontend/src/modules/contribution/api/mutation.ts new file mode 100644 index 000000000..c916b15d7 --- /dev/null +++ b/targets/frontend/src/modules/contribution/api/mutation.ts @@ -0,0 +1,9 @@ +import { gql } from "urql"; + +export const updatePublicationMutation = gql` +mutation contribution_answer($id: uuid!, $cdtnId: String!) { + update_contribution_answers_by_pk(pk_columns: {id: $id}, _set: {cdtnId: $cdtnId}) { + id + } +} +`; diff --git a/targets/frontend/src/modules/contribution/api/query.ts b/targets/frontend/src/modules/contribution/api/query.ts index 5d6968b05..90a6707f7 100644 --- a/targets/frontend/src/modules/contribution/api/query.ts +++ b/targets/frontend/src/modules/contribution/api/query.ts @@ -9,6 +9,7 @@ export const getContributionAnswerById = gql` content_type updatedAt: updated_at display_date + cdtnId agreement { id name diff --git a/targets/frontend/src/modules/contribution/api/repository.ts b/targets/frontend/src/modules/contribution/api/repository.ts index 7be37e60b..37a37bef7 100644 --- a/targets/frontend/src/modules/contribution/api/repository.ts +++ b/targets/frontend/src/modules/contribution/api/repository.ts @@ -1,10 +1,11 @@ import { ApiClient } from "src/lib/api"; import { + getAllContributionsByQuestionId, getContributionAnswerById, getGenericAnswerByQuestionId, - getAllContributionsByQuestionId, } from "./query"; import { ContributionsAnswers } from "@socialgouv/cdtn-types"; +import { updatePublicationMutation } from "./mutation"; interface FetchContribPkData { contribution_answers_by_pk: ContributionsAnswers; @@ -81,4 +82,17 @@ export class ContributionRepository { contrib.statuses && contrib.statuses[0].status === "TO_PUBLISH" ); } + + async updateCdtnId(id: string, cdtnId: string): Promise { + const { error } = await this.client.mutation( + updatePublicationMutation, + { + id, + cdtnId, + } + ); + if (error) { + throw error; + } + } } diff --git a/targets/frontend/src/modules/documents/api/__tests__/documents.service.test.ts b/targets/frontend/src/modules/documents/api/__tests__/documents.service.test.ts new file mode 100644 index 000000000..66ad608c8 --- /dev/null +++ b/targets/frontend/src/modules/documents/api/__tests__/documents.service.test.ts @@ -0,0 +1,178 @@ +import { ContributionsAnswers } from "@socialgouv/cdtn-types"; +import { ApiClient } from "../../../../lib/api"; +import { DocumentsService } from "../documents.service"; +import { InformationsRepository } from "../../../informations"; +import { DocumentsRepository } from "../documents.repository"; +import { ContributionRepository } from "../../../contribution"; +import { ModelRepository } from "../../../models/api"; +import { AgreementRepository } from "../../../agreements/api"; +import { GqlClient } from "@shared/utils"; + +jest.mock("../../../common/getGlossaryContent.ts", () => { + return { + getGlossaryContent: jest.fn(() => "mocked-glossary-content"), + }; +}); + +describe("document service", () => { + const inputContribution: ContributionsAnswers = { + updatedAt: "2024-07-11T13:18:08.000Z", + display_date: "2024-07-11T13:18:08.000Z", + id: "effee3b9-84fb-4667-944b-4b1e1fd14eb5", + cdtnId: null, + content: + "

Quand une femme tombe enceinte et décide de partir en congé maternité, cette dernière a droit à des indemnités journalières de sécurité sociale venant indemniser la période durant laquelle elle ne peut plus travailler. Certaines conventions collectives prévoient également un maintien de salaire versé par l’employeur. Si le maintien est à 100%, dans ce cas, les deux mécanismes ne sont pas cumulables. Si le maintien est inférieur à 100%, le pourcentage de rémunération restant est indemnisé par les indemnités de Sécurité sociale. 

Maintien de salaire

Les salariées ayant au moins une année de présence continue dans l'entreprise à la date de l'accouchement ont droit à un maintien de salaire, après déduction des indemnités de Sécurité sociale, qui leur assure leur salaire habituel, et ce pendant une durée de 36 jours (en principe 18 jours avant l’accouchement, 18 jours après).

Pour les salariées cadres âgées de moins de 25 ans et les autres salariées âgées de moins de 22 ans à la date de l'accouchement, la période de 36 jours est augmentée de 2 jours par enfant à charge. L'indemnité complémentaire ne pourra pas être versée plus de 46 jours. Est considéré comme enfant à charge tout enfant à charge de la salariée au sens de la législation des prestations familiales et âgé de moins de 15 ans à la date de l'accouchement.

A noter : Les périodes de suspension du contrat de travail (maladie, etc.) sont prises en compte pour l'ancienneté.

Si la salariée ne respecte pas la condition d’ancienneté, elle n’a pas droit au maintien de salaire versé par l’employeur mais aura potentiellement droit aux indemnités journalières de Sécurité sociale si elle respecte ses conditions d’octroi. 

Indemnités de Sécurité sociale

Conditions d’ouverture des droits aux indemnités journalières de Sécurité sociale

Pour être indemnisée, la salariée doit remplir les conditions suivantes :

  • Etre affiliée à la Sécurité sociale depuis au moins 10 mois à la date présumée de l'accouchement ;

  • cesser son activité professionnelle pendant au moins 8 semaines ;

  • avoir : 

    • soit travaillé au moins 150 heures au cours des 3 mois civils ou des 90 jours précédant l'arrêt, 

    • soit travaillé au moins 600 heures au cours des 12 mois précédant l’arrêt de travail, 

    • soit cotisé, au cours des 6 mois civils précédant l'arrêt, sur la base d'une rémunération au moins égale à 1 015 fois le montant du Smic horaire fixé au début de cette période, 

    • soit cotisé au cours des 12 mois civils précédant l’arrêt, sur la base d'une rémunération au moins égale à 2030 fois le montant du Smic horaire fixé en début de période.

Exemple : le congé a débuté le 1er juillet 2023 pour une date présumée d'accouchement au 1er septembre 2023.

Le droit aux indemnités journalières est ouvert si :

  • La salariée était déjà affiliée à la Sécurité sociale avant novembre 2022 ;

  • et a travaillé soit au moins 150 heures entre le 1er avril 2023 et le 30 juin 2023, soit au moins 600 heures entre le 1er juillet 2022 et le 30 juin 2023, soit a cotisé entre le 1er janvier 2023 et le 30 juin 2023 sur la base d'une rémunération au moins égale à 11 439,05 €, soit a cotisé entre le 1er juillet 2022 et le 30 juin 2023 sur la base d’une rémunération au moins égale à 22 878,1 €.

Montant

La CPAM verse des indemnités journalières, dont le montant est fixé selon les étapes de calcul suivantes :

  • Calcul du salaire journalier de base : somme des 3 derniers salaires bruts perçus avant la date d'interruption du travail, divisé par 91,25.

  • Montant maximal du salaire journalier de base : le salaire pris en compte ne peut pas dépasser le plafond mensuel de la sécurité sociale en vigueur lors du dernier jour du mois qui précède l'arrêt (soit 3 666 € par mois en 2023, ou 3 428 € en 2022).

  • Taux forfaitaire appliqué par la CPAM : la CPAM retire à ce salaire journalier de base un taux forfaitaire de 21 %.

  • Montant minimal et montant maximal des indemnités journalières : le montant ne peut pas être inférieur à 10,24 € ni supérieur à 95,22 € par jour.

Versement

Les indemnités journalières sont versées tous les 14 jours.

", + description: + "Quand une femme tombe enceinte et décide de partir en congé maternité, cette dernière a droit à des indemnités journalières de sécurité sociale venant indemniser la période durant laquelle elle ne peut plus travailler.", + content_type: "ANSWER", + agreement: { + id: "0016", + name: "Convention collective nationale des transports routiers et activités auxiliaires du transport", + kali_id: "KALICONT000005635624", + }, + question: { + id: "3384f257-e319-46d1-a4cb-8e8294da337b", + content: + "Quelles sont les conditions d’indemnisation pendant le congé de maternité ?", + order: 43, + seo_title: "Titre SEO", + }, + kali_references: [ + { + label: + "Accord du 30 mars 1951 relatif aux techniciens et agents de maîtrise Annexe III, article 22", + kali_article: { + id: "KALIARTI000005849277", + path: "Textes Attachés » Accord du 30 mars 1951 relatif aux techniciens et agents de maîtrise Annexe III » Maternité » Article 22", + cid: "KALIARTI000005849277", + label: "Article 22", + }, + }, + { + label: + "Accord du 16 juin 1961 relatifs aux ouvriers - annexe I , article 9", + kali_article: { + id: "KALIARTI000005849388", + path: "Textes Attachés » Accord du 16 juin 1961 relatif aux ouvriers - annexe I » Chapitre Ier : Dispositions communes aux différents groupes d'ouvriers » Maternité » Article 9", + cid: "KALIARTI000005849387", + label: "Article 9", + }, + }, + { + label: + "Accord du 27 février 1951 relatif aux employés Annexe II, article 18", + kali_article: { + id: "KALIARTI000005849528", + path: "Textes Attachés » Accord du 27 février 1951 relatif aux employés Annexe II » Maternité » Article 18", + cid: "KALIARTI000005849527", + label: "Article 18", + }, + }, + { + label: + "Accord du 30 octobre 1951 relatif aux ingénieurs et cadres - Annexe IV, article 22", + kali_article: { + id: "KALIARTI000005849582", + path: "Textes Attachés » Accord du 30 octobre 1951 relatif aux ingénieurs et cadres - Annexe IV » Maternité » Article 22", + cid: "KALIARTI000005849582", + label: "Article 22", + }, + }, + ], + legi_references: [], + other_references: [ + { + label: + "Sous-section 3 : Autorisations d'absence et congé de maternité. (Articles L1225-16 à L1225-28)", + url: "https://www.legifrance.gouv.fr/codes/id/LEGISCTA000006195592/", + }, + { + label: + "Chapitre 3 : Droit aux prestations (maladie, maternité, invalidité, décès) (Articles L313-1 à L313-6) ", + url: "https://www.legifrance.gouv.fr/codes/section_lc/LEGITEXT000006073189/LEGISCTA000006156079/", + }, + { + label: "Section 3 : Prestations en espèces (Articles L331-3 à L331-7)", + url: "https://www.legifrance.gouv.fr/codes/id/LEGISCTA000006172598", + }, + { + label: + "Chapitre 3 : Droit aux prestations (maladie, maternité, congé de paternité, invalidité, décès). (Articles R313-1 à R313-17)", + url: "https://www.legifrance.gouv.fr/codes/id/LEGISCTA000006156797/", + }, + { + label: "Section 3 : Prestations en espèces. (Articles R331-5 à R331-7)", + url: "https://www.legifrance.gouv.fr/codes/id/LEGISCTA000006173387", + }, + ], + cdtn_references: [ + { + cdtn_id: "abcdef", + }, + { + cdtn_id: "ijhgt", + }, + { + cdtn_id: "klmnop", + }, + { + cdtn_id: "ijhgt", + }, + ], + content_fiche_sp: null, + message_block_generic_no_CDT: null, + }; + let savedArgs: any; + const client: ApiClient = new ApiClient( + { + query: jest + .fn() + .mockReturnValueOnce({ + toPromise: () => + Promise.resolve({ + data: { documents: [] }, + }), + }) + .mockReturnValueOnce({ + toPromise: () => + Promise.resolve({ + data: { contribution_answers_by_pk: inputContribution }, + }), + }) + .mockReturnValueOnce({ + toPromise: () => Promise.resolve({}), + }), + mutation: jest + .fn() + .mockImplementationOnce((arg, arg2) => { + savedArgs = arg2 + return { + toPromise: () => Promise.resolve({ data: {} }), + }; + }) + .mockReturnValueOnce({ + toPromise: () => + Promise.resolve({ + data: { insert_documents_one: { cdtn_id: "1234" } }, + }), + }), + } as unknown as GqlClient, + {} + ); + it("publish sauvegarde le cdtnId s'il n'existait pas dans la contribution answer", async () => { + const service = new DocumentsService( + new InformationsRepository(client), + new DocumentsRepository(client), + new ContributionRepository(client), + new ModelRepository(client), + new AgreementRepository(client) + ); + + await service.publish("1234", "contributions"); + expect(client.client.mutation).toHaveBeenCalledTimes(2); + expect(savedArgs).toEqual({ + "cdtnId": "b3bc78aed5", + "id": "effee3b9-84fb-4667-944b-4b1e1fd14eb5" + }); + }); +}); diff --git a/targets/frontend/src/modules/documents/api/documents.service.ts b/targets/frontend/src/modules/documents/api/documents.service.ts index 702e72a26..35a4fec43 100644 --- a/targets/frontend/src/modules/documents/api/documents.service.ts +++ b/targets/frontend/src/modules/documents/api/documents.service.ts @@ -88,6 +88,13 @@ export class DocumentsService { ); } ); + + if (!contribution.cdtnId && document?.cdtn_id) { + this.contributionRepository.updateCdtnId( + contribution.id, + document.cdtn_id + ); + } break; case "modeles_de_courriers": diff --git a/targets/frontend/src/modules/export/document.query.ts b/targets/frontend/src/modules/export/document.query.ts index 8ceab5810..41baab14a 100644 --- a/targets/frontend/src/modules/export/document.query.ts +++ b/targets/frontend/src/modules/export/document.query.ts @@ -63,12 +63,8 @@ export const useDocumentsQuery = ({ if (!result.data) { return new Map(); } - // Le filtre est temporaire tant que l'ancien outil de contrib est la : exclure les anciennes contribs qui ont une updated date toujours mise à jour - const filtered = result.data.documents.filter( - (doc) => doc.source !== SOURCES.CONTRIBUTIONS || !!doc.document?.contentType - ); - const grouped = groupBy(filtered, (data) => data.source); + const grouped = groupBy(result.data.documents, (data) => data.source); grouped.forEach((array, key) => { grouped.set(key, array.slice().sort(compareTitles)); }); diff --git a/targets/hasura/migrations/default/1727341598645_alter_table_contribution_set_cdtn_id/down.sql b/targets/hasura/migrations/default/1727341598645_alter_table_contribution_set_cdtn_id/down.sql new file mode 100644 index 000000000..490824cd5 --- /dev/null +++ b/targets/hasura/migrations/default/1727341598645_alter_table_contribution_set_cdtn_id/down.sql @@ -0,0 +1,7 @@ +-- Could not auto-generate a down migration. +-- Please write an appropriate down migration for the SQL below: +-- UPDATE contribution.answers c +-- SET cdtn_id = d.cdtn_id +-- FROM public.documents d +-- WHERE c.cdtn_id IS NULL +-- AND c.id::text = d.initial_id; diff --git a/targets/hasura/migrations/default/1727341598645_alter_table_contribution_set_cdtn_id/up.sql b/targets/hasura/migrations/default/1727341598645_alter_table_contribution_set_cdtn_id/up.sql new file mode 100644 index 000000000..7fb98bd9d --- /dev/null +++ b/targets/hasura/migrations/default/1727341598645_alter_table_contribution_set_cdtn_id/up.sql @@ -0,0 +1,5 @@ +UPDATE contribution.answers c +SET cdtn_id = d.cdtn_id +FROM public.documents d +WHERE c.cdtn_id IS NULL + AND c.id::text = d.initial_id;