From 46f3ee8fe7e6e4ff8881c1ec72c492b3b1563994 Mon Sep 17 00:00:00 2001 From: xavier jouppe Date: Mon, 19 Aug 2024 19:48:13 +0200 Subject: [PATCH] feat: etat des inscriptions - merge with justificatifs links --- .../annonces/[slug]/_components/bodacc.tsx | 3 +- .../annonces/[slug]/_components/joafe.tsx | 3 +- .../[slug]/_components/observations-rne.tsx | 6 +- app/(header-default)/annonces/[slug]/page.tsx | 21 ++- .../[slug]/_components/justificatifs/rne.tsx | 87 ++--------- .../_components/immatriculation-section.tsx | 61 +++++++- .../[slug]/_components/inscriptions.tsx | 145 ++++++++++++++++++ .../[slug]/_components/style.module.css | 14 ++ .../[slug]/_components/summary-section.tsx | 137 ++++------------- .../entreprise/[slug]/page.tsx | 14 +- .../[slug]/page.tsx | 6 +- clients/recherche-entreprise/index.ts | 2 +- components-ui/badge/frequent.tsx | 3 +- components/association-section/index.tsx | 1 + .../justificatifs/data-inpi-link/index.tsx | 73 +++++++++ .../justificatifs/extrait-rne-link/index.tsx | 7 +- components/section/style.module.css | 1 + components/title-section/index.tsx | 2 +- models/core/types.ts | 2 +- redirects.json | 5 + 20 files changed, 381 insertions(+), 212 deletions(-) rename components/unite-legale-immatriculation-section/index.tsx => app/(header-default)/entreprise/[slug]/_components/immatriculation-section.tsx (51%) create mode 100644 app/(header-default)/entreprise/[slug]/_components/inscriptions.tsx create mode 100644 app/(header-default)/entreprise/[slug]/_components/style.module.css rename components/unite-legale-section/index.tsx => app/(header-default)/entreprise/[slug]/_components/summary-section.tsx (60%) create mode 100644 components/justificatifs/data-inpi-link/index.tsx diff --git a/app/(header-default)/annonces/[slug]/_components/bodacc.tsx b/app/(header-default)/annonces/[slug]/_components/bodacc.tsx index ccbaf890b..24d121032 100644 --- a/app/(header-default)/annonces/[slug]/_components/bodacc.tsx +++ b/app/(header-default)/annonces/[slug]/_components/bodacc.tsx @@ -1,6 +1,5 @@ 'use client'; -import React from 'react'; import routes from '#clients/routes'; import { Info } from '#components-ui/alerts'; import ButtonLink from '#components-ui/button'; @@ -12,6 +11,7 @@ import { EAdministration } from '#models/administrations/EAdministration'; import { IUniteLegale } from '#models/core/types'; import { formatDate } from '#utils/helpers'; import { useFetchBODACC } from 'hooks'; +import React from 'react'; const AnnoncesBodacc: React.FC<{ uniteLegale: IUniteLegale; @@ -20,6 +20,7 @@ const AnnoncesBodacc: React.FC<{ return ( Cette structure ne possède pas de fiche d’immatriculation au{' '} - Registre National des Entreprises (RNE) + Registre National des Entreprises (RNE). } > @@ -50,7 +50,7 @@ export const ObservationsRNE: React.FC<{ ) : ( <> Cette structure ne possède pas d’observations au{' '} - Registre National des Entreprises (RNE) + Registre National des Entreprises (RNE). ) } diff --git a/app/(header-default)/annonces/[slug]/page.tsx b/app/(header-default)/annonces/[slug]/page.tsx index be39795d2..a21526544 100644 --- a/app/(header-default)/annonces/[slug]/page.tsx +++ b/app/(header-default)/annonces/[slug]/page.tsx @@ -52,17 +52,32 @@ const AnnoncesPage = async (props: AppRouterProps) => { {estDiffusible(uniteLegale) || hasRights(session, EScope.nonDiffusible) ? ( <> + {uniteLegale.dateMiseAJourInpi && ( )} + {isAssociation(uniteLegale) && ( + + )} ) : ( )} - {isAssociation(uniteLegale) && ( - - )} ); diff --git a/app/(header-default)/documents/[slug]/_components/justificatifs/rne.tsx b/app/(header-default)/documents/[slug]/_components/justificatifs/rne.tsx index 9fef93856..e2dbad3c1 100644 --- a/app/(header-default)/documents/[slug]/_components/justificatifs/rne.tsx +++ b/app/(header-default)/documents/[slug]/_components/justificatifs/rne.tsx @@ -1,13 +1,7 @@ -import routes from '#clients/routes'; -import ButtonLink from '#components-ui/button'; -import { Icon } from '#components-ui/icon/wrapper'; -import { PrintNever } from '#components-ui/print-visibility'; -import { INPI } from '#components/administrations'; +import { DataInpiLinkWithExplanations } from '#components/justificatifs/data-inpi-link'; import { Section } from '#components/section'; import { EAdministration } from '#models/administrations/EAdministration'; -import { estDiffusible } from '#models/core/diffusion'; import { IUniteLegale } from '#models/core/types'; -import { EScope, hasRights } from '#models/user/rights'; import { ISession } from '#models/user/session'; export const JustificatifImmatriculationRNE = ({ @@ -16,73 +10,12 @@ export const JustificatifImmatriculationRNE = ({ }: { uniteLegale: IUniteLegale; session: ISession | null; -}) => { - const siteLink = `${routes.rne.portail.entreprise}${uniteLegale.siren}`; - - if ( - !estDiffusible(uniteLegale) && - !hasRights(session, EScope.nonDiffusible) - ) { - return ( -
- Le(s) dirigeant(s) se sont opposés à la diffusion de leurs données - personnelles. Pour télécharger l’extrait d’immatriculation de cette - entreprise, rendez-vous sur le site{' '} - data.inpi.fr. -
- ); - } - return ( -
- -

- Pour accéder aux données contenues dans un extrait d’immatriculation - (équivalent de{' '} - - l’extrait KBIS ou D1 - - ), vous pouvez soit télécharger le{' '} - - justificatif d’immatriculation au Registre National des Entreprises - (RNE) - - , soit consulter la fiche complète sur le site de l’ - -  : -

-
    -
  • - - - Télécharger le justificatif d’immatriculation - - -
  • -
  • - - ⇢ Voir la fiche sur le site de l’INPI - -
  • -
-
-
- ); -}; +}) => ( +
+ +
+); diff --git a/components/unite-legale-immatriculation-section/index.tsx b/app/(header-default)/entreprise/[slug]/_components/immatriculation-section.tsx similarity index 51% rename from components/unite-legale-immatriculation-section/index.tsx rename to app/(header-default)/entreprise/[slug]/_components/immatriculation-section.tsx index c29ae969d..4a4efff40 100644 --- a/components/unite-legale-immatriculation-section/index.tsx +++ b/app/(header-default)/entreprise/[slug]/_components/immatriculation-section.tsx @@ -1,14 +1,46 @@ +import FAQLink from '#components-ui/faq-link'; import { INPI } from '#components/administrations'; +import { DataInpiLinkWithExplanations } from '#components/justificatifs/data-inpi-link'; import { DataSection } from '#components/section/data-section'; import { TwoColumnTable } from '#components/table/simple'; import { EAdministration } from '#models/administrations/EAdministration'; import { IUniteLegale } from '#models/core/types'; +import { ISession } from '#models/user/session'; import { formatDate } from '#utils/helpers'; +const formatCapitalSocial = ( + immatriculation: IUniteLegale['immatriculation'] +) => { + if (immatriculation?.capital) { + try { + return `${new Intl.NumberFormat('fr-FR', { + style: 'currency', + currency: immatriculation?.deviseCapital ?? 'EUR', + }).format(immatriculation?.capital)} ${ + immatriculation.estCapitalVariable ? 'variable' : 'fixe' + }`; + } catch { + return `${immatriculation?.capital} ${immatriculation?.deviseCapital} ${ + immatriculation.estCapitalVariable ? 'variable' : 'fixe' + }`; + } + } + return ''; +}; + +const formatDateCloture = (DDMM: string) => { + if (DDMM && DDMM.length === 4) { + return `${DDMM.slice(0, 2)}/${DDMM.slice(2)}`; + } + return DDMM; +}; + export const UniteLegaleImmatriculationSection = ({ uniteLegale, + session, }: { uniteLegale: IUniteLegale; + session: ISession | null; }) => { const immatriculation = uniteLegale.immatriculation; return ( @@ -41,18 +73,35 @@ export const UniteLegaleImmatriculationSection = ({ ], [ 'Nature de l’entreprise', - immatriculation?.natureEntreprise, + (immatriculation?.natureEntreprise || []).join(', '), ], ...(immatriculation?.isPersonneMorale ? [ - ['Capital social', immatriculation?.capital], + [ + + Le capital social d’une société est constitué des + apports (en argent ou en nature) de ses + actionnaires. +
+ Il peut être fixe ou variable. La modification + d’un capital fixe nécessite une modification des + statuts tandis que le capital variable peut varier + dans certaines limites sans modification des + statuts. +
, + formatCapitalSocial(immatriculation), + ], [ 'Clôture de l’exercice comptable', - immatriculation?.dateCloture, + formatDateCloture(immatriculation?.dateCloture), ], + ] + : []), + ...(immatriculation?.duree + ? [ [ 'Durée de la personne morale', - immatriculation?.duree, + `${immatriculation?.duree} ans`, ], ] : []), @@ -68,6 +117,10 @@ export const UniteLegaleImmatriculationSection = ({ : []), ]} /> + )} diff --git a/app/(header-default)/entreprise/[slug]/_components/inscriptions.tsx b/app/(header-default)/entreprise/[slug]/_components/inscriptions.tsx new file mode 100644 index 000000000..43c5ed031 --- /dev/null +++ b/app/(header-default)/entreprise/[slug]/_components/inscriptions.tsx @@ -0,0 +1,145 @@ +import { OpenClosedTag } from '#components-ui/badge/frequent'; +import { Icon } from '#components-ui/icon/wrapper'; +import InformationTooltip from '#components-ui/information-tooltip'; +import AvisSituationLink from '#components/justificatifs/avis-situation-link'; +import ExtraitRNELink from '#components/justificatifs/extrait-rne-link'; +import { estActif } from '#models/core/etat-administratif'; +import { IUniteLegale } from '#models/core/types'; +import { ISession } from '#models/user/session'; +import { formatDate } from '#utils/helpers'; +import React, { PropsWithChildren } from 'react'; +import styles from './style.module.css'; + +const Wrapper: React.FC> = ({ + children, + link, +}) => ( +
+
{children}
+
{link}
+
+); + +export const UniteLegaleInscriptionSirene = ({ + uniteLegale, + session, +}: { + uniteLegale: IUniteLegale; + session: ISession | null; +}) => ( + + + + } + > + + {estActif(uniteLegale) ? ( + + {uniteLegale.dateCreation && ( + <>le {formatDate(uniteLegale.dateCreation)} + )} + + ) : ( + + {uniteLegale.dateCreation && ( + <>le {formatDate(uniteLegale.dateFermeture)} + )} + + )} + + +); + +export const UniteLegaleInscriptionRNE = ({ + uniteLegale, + session, +}: { + uniteLegale: IUniteLegale; + session: ISession | null; +}) => ( + + {' '} + (équivalent KBIS/D1) + + } + > + + + {uniteLegale.immatriculation?.dateRadiation ? ( + + le {formatDate(uniteLegale.immatriculation?.dateRadiation)} + + ) : ( + + {uniteLegale.immatriculation?.dateImmatriculation && ( + <> + le{' '} + {formatDate(uniteLegale.immatriculation?.dateImmatriculation)} + + )} + + )} + + + +); + +export const UniteLegaleInscriptionRNA = ({ + uniteLegale, +}: { + uniteLegale: IUniteLegale; +}) => ( + + Annonce de création au JOAFE + + } + > + + + + le {formatDate(uniteLegale.immatriculation?.dateImmatriculation)} + + + + +); diff --git a/app/(header-default)/entreprise/[slug]/_components/style.module.css b/app/(header-default)/entreprise/[slug]/_components/style.module.css new file mode 100644 index 000000000..35fa86304 --- /dev/null +++ b/app/(header-default)/entreprise/[slug]/_components/style.module.css @@ -0,0 +1,14 @@ +.inscriptions-wrapper { + display: flex; + align-items: center; + justify-content: space-between; + flex-wrap: wrap; + column-gap: 20px; +} +.inscriptions-wrapper > div { + flex-grow: 1; +} + +.inscriptions-wrapper > div:last-of-type { + margin: 5px 0; +} diff --git a/components/unite-legale-section/index.tsx b/app/(header-default)/entreprise/[slug]/_components/summary-section.tsx similarity index 60% rename from components/unite-legale-section/index.tsx rename to app/(header-default)/entreprise/[slug]/_components/summary-section.tsx index c90e7aefa..7ba7b38e5 100644 --- a/components/unite-legale-section/index.tsx +++ b/app/(header-default)/entreprise/[slug]/_components/summary-section.tsx @@ -1,11 +1,7 @@ -import { OpenClosedTag } from '#components-ui/badge/frequent'; import FAQLink from '#components-ui/faq-link'; -import InformationTooltip from '#components-ui/information-tooltip'; import { ConventionCollectivesBadgesSection } from '#components/badges-section/convention-collectives'; import { ProtectedCertificatesBadgesSection } from '#components/badges-section/labels-and-certificates/protected-certificats'; import EORICell from '#components/eori-cell'; -import AvisSituationLink from '#components/justificatifs/avis-situation-link'; -import ExtraitRNELink from '#components/justificatifs/extrait-rne-link'; import { Section } from '#components/section'; import { TwoColumnTable } from '#components/table/simple'; import TVACell from '#components/tva-cell'; @@ -27,9 +23,14 @@ import { checkHasLabelsAndCertificates, checkHasQuality, labelsAndCertificatesSources, -} from '../badges-section/labels-and-certificates'; +} from '../../../../../components/badges-section/labels-and-certificates'; +import { + UniteLegaleInscriptionRNA, + UniteLegaleInscriptionRNE, + UniteLegaleInscriptionSirene, +} from './inscriptions'; -const UniteLegaleSection: React.FC<{ +const UniteLegaleSummarySection: React.FC<{ uniteLegale: IUniteLegale; session: ISession | null; }> = ({ uniteLegale, session }) => { @@ -37,6 +38,27 @@ const UniteLegaleSection: React.FC<{ const conventionsCollectives = uniteLegale.listeIdcc; const data = [ + [ + 'État des inscriptions', + <> + {uniteLegale.dateMiseAJourInsee && ( + + )} + {uniteLegale.dateMiseAJourInpi && ( + + )} + {uniteLegale.association.idAssociation && ( + + )} + , + ], + ['',
], ['Dénomination', uniteLegale.nomComplet], ['SIREN', formatIntFr(uniteLegale.siren)], [ @@ -90,52 +112,6 @@ const UniteLegaleSection: React.FC<{ ? [['Date de fermeture', formatDate(uniteLegale.dateFermeture)]] : []), ['',
], - [ - 'Inscription aux registres', - <> - {uniteLegale.dateMiseAJourInsee && ( - - - - )} - {uniteLegale.dateMiseAJourInpi && ( - <> -
{' '} - - - - - - - )} - , - ], - ['',
], [ 'Convention(s) collective(s)', ], - [ - 'Justificatif(s) d’existence', -
    - {isAssociation(uniteLegale) && ( -
  • - Annonce de création au JOAFE :{' '} - - télécharger - -
  • - )} - {uniteLegale.dateMiseAJourInpi && ( -
  • - Extrait RNE (équivalent KBIS/D1) :{' '} - -
  • - )} - {uniteLegale.dateMiseAJourInsee && ( -
  • - Avis de situation Insee :{' '} - -
  • - )} -
, - ], - ['',
], - [ - 'Dirigeant(s)', - - → voir les dirigeants - , - ], - [ - 'Siège social', - - → voir le détail du siège social - , - ], - [ - 'Liste des établissements', - - → voir les {uniteLegale.etablissements.nombreEtablissements}{' '} - établissement - {uniteLegale.etablissements.nombreEtablissements > 0 ? 's' : ''} - , - ], ]; return ( @@ -250,4 +171,4 @@ const UniteLegaleSection: React.FC<{ ); }; -export default UniteLegaleSection; +export default UniteLegaleSummarySection; diff --git a/app/(header-default)/entreprise/[slug]/page.tsx b/app/(header-default)/entreprise/[slug]/page.tsx index c6d861938..de23ecd9c 100644 --- a/app/(header-default)/entreprise/[slug]/page.tsx +++ b/app/(header-default)/entreprise/[slug]/page.tsx @@ -10,8 +10,6 @@ import ServicePublicSection from '#components/service-public-section'; import StructuredDataBreadcrumb from '#components/structured-data/breadcrumb'; import Title from '#components/title-section'; import { FICHE } from '#components/title-section/tabs'; -import { UniteLegaleImmatriculationSection } from '#components/unite-legale-immatriculation-section'; -import UniteLegaleSection from '#components/unite-legale-section'; import { estNonDiffusibleStrict } from '#models/core/diffusion'; import { isAssociation, @@ -29,6 +27,8 @@ import extractParamsAppRouter, { AppRouterProps, } from '#utils/server-side-helper/app/extract-params'; import getSession from '#utils/server-side-helper/app/get-session'; +import { UniteLegaleImmatriculationSection } from 'app/(header-default)/entreprise/[slug]/_components/immatriculation-section'; +import UniteLegaleSummarySection from 'app/(header-default)/entreprise/[slug]/_components/summary-section'; import { Metadata } from 'next'; export const generateMetadata = async ( @@ -69,7 +69,10 @@ export default async function UniteLegalePage(props: AppRouterProps) { ) : ( <> - + {hasRights(session, EScope.isAgent) && ( )} {uniteLegale.immatriculation && ( - + )} {isCollectiviteTerritoriale(uniteLegale) && ( diff --git a/app/(header-default)/justificatif-immatriculation-pdf/[slug]/page.tsx b/app/(header-default)/justificatif-immatriculation-pdf/[slug]/page.tsx index 9af6ffb86..1559d419e 100644 --- a/app/(header-default)/justificatif-immatriculation-pdf/[slug]/page.tsx +++ b/app/(header-default)/justificatif-immatriculation-pdf/[slug]/page.tsx @@ -1,4 +1,3 @@ -import { Metadata } from 'next'; import { Info } from '#components-ui/alerts'; import { INPI } from '#components/administrations'; import { Section } from '#components/section'; @@ -8,6 +7,7 @@ import { formatIntFr } from '#utils/helpers'; import extractParamsAppRouter, { AppRouterProps, } from '#utils/server-side-helper/app/extract-params'; +import { Metadata } from 'next'; import { InpiPDFDownloader } from './_components/inpi-pdf-downloader'; export const generateMetadata = async ( @@ -30,9 +30,7 @@ const InpiPDF = (props: AppRouterProps) => { return ( <>
- - ← Retour à la page justificatif d’immatriculation - + ← Retour à la fiche resumée

Téléchargement du justificatif d’immatriculation

diff --git a/clients/recherche-entreprise/index.ts b/clients/recherche-entreprise/index.ts index ff8af58d5..b7b101254 100644 --- a/clients/recherche-entreprise/index.ts +++ b/clients/recherche-entreprise/index.ts @@ -279,7 +279,7 @@ const mapToUniteLegale = (result: IResult, pageEtablissements: number) => { isPersonneMorale: !!capital_social, capital: capital_social, estCapitalVariable: capital_variable, - devisCapital: devise_capital, + deviseCapital: devise_capital, }, association: { idAssociation: identifiant_association, diff --git a/components-ui/badge/frequent.tsx b/components-ui/badge/frequent.tsx index bf55304c4..4c74e8d3c 100644 --- a/components-ui/badge/frequent.tsx +++ b/components-ui/badge/frequent.tsx @@ -100,7 +100,7 @@ export const DefaultStructureBadge = ({ export const OpenClosedTag: React.FC< PropsWithChildren<{ isVerified?: boolean; label: string }> -> = ({ label = '', isVerified = true }) => ( +> = ({ label = '', isVerified = true, children }) => (
+ {children}
); diff --git a/components/association-section/index.tsx b/components/association-section/index.tsx index e1536444e..0a5bcc173 100644 --- a/components/association-section/index.tsx +++ b/components/association-section/index.tsx @@ -155,6 +155,7 @@ const AssociationSection = ({ } > diff --git a/components/justificatifs/data-inpi-link/index.tsx b/components/justificatifs/data-inpi-link/index.tsx new file mode 100644 index 000000000..68f46677a --- /dev/null +++ b/components/justificatifs/data-inpi-link/index.tsx @@ -0,0 +1,73 @@ +import routes from '#clients/routes'; +import ButtonLink from '#components-ui/button'; +import { Icon } from '#components-ui/icon/wrapper'; +import { PrintNever } from '#components-ui/print-visibility'; +import { INPI } from '#components/administrations'; +import { estDiffusible } from '#models/core/diffusion'; +import { IUniteLegale } from '#models/core/types'; +import { EScope, hasRights } from '#models/user/rights'; +import { ISession } from '#models/user/session'; + +type IProps = { uniteLegale: IUniteLegale; session: ISession | null }; + +export const DataInpiLinkWithExplanations = ({ + uniteLegale, + session, +}: IProps) => { + const siteLink = `${routes.rne.portail.entreprise}${uniteLegale.siren}`; + + if ( + !estDiffusible(uniteLegale) && + !hasRights(session, EScope.nonDiffusible) + ) { + return ( + <> + Le(s) dirigeant(s) se sont opposés à la diffusion de leurs données + personnelles. Pour télécharger l’extrait d’immatriculation de cette + entreprise, rendez-vous sur le site{' '} + data.inpi.fr. + + ); + } + return ( + +

+ Pour accéder aux données contenues dans un extrait d’immatriculation + (équivalent de{' '} + + l’extrait KBIS ou D1 + + ), vous pouvez soit télécharger l’{' '} + + extrait des inscriptions au Registre National des Entreprises (RNE) + + , soit consulter la fiche complète sur le site de l’ + +  : +

+
    +
  • + + + Télécharger le justificatif d’immatriculation + + +
  • +
  • + + ⇢ Voir la fiche sur le site de l’INPI + +
  • +
+
+ ); +}; diff --git a/components/justificatifs/extrait-rne-link/index.tsx b/components/justificatifs/extrait-rne-link/index.tsx index d7a366822..0708f1bc2 100644 --- a/components/justificatifs/extrait-rne-link/index.tsx +++ b/components/justificatifs/extrait-rne-link/index.tsx @@ -1,4 +1,3 @@ -import React from 'react'; import { estDiffusible, nonDiffusibleDataFormatter, @@ -6,11 +5,13 @@ import { import { IUniteLegale } from '#models/core/types'; import { EScope, hasRights } from '#models/user/rights'; import { ISession } from '#models/user/session'; +import React from 'react'; const ExtraitRNELink: React.FC<{ uniteLegale: IUniteLegale; + label: string; session: ISession | null; -}> = ({ uniteLegale, session }) => { +}> = ({ uniteLegale, label, session }) => { return estDiffusible(uniteLegale) || hasRights(session, EScope.nonDiffusible) ? ( - télécharger + {label || 'télécharger'} ) : ( diff --git a/components/section/style.module.css b/components/section/style.module.css index 449f5702a..4f260ec4d 100644 --- a/components/section/style.module.css +++ b/components/section/style.module.css @@ -10,6 +10,7 @@ .section-header { display: flex; justify-content: space-between; + align-items: flex-start; flex-wrap: wrap; margin-bottom: 25px; } diff --git a/components/title-section/index.tsx b/components/title-section/index.tsx index fe5e379cc..93a351e69 100644 --- a/components/title-section/index.tsx +++ b/components/title-section/index.tsx @@ -1,4 +1,3 @@ -import React from 'react'; import IsActiveTag from '#components-ui/is-active-tag'; import SocialMedia from '#components-ui/social-media'; import { Tag } from '#components-ui/tag'; @@ -10,6 +9,7 @@ import { estDiffusible, estNonDiffusibleStrict } from '#models/core/diffusion'; import { IUniteLegale } from '#models/core/types'; import { ISession } from '#models/user/session'; import { formatIntFr } from '#utils/helpers'; +import React from 'react'; import TitleAlerts from './alerts'; import styles from './styles.module.css'; import { FICHE, Tabs } from './tabs'; diff --git a/models/core/types.ts b/models/core/types.ts index 39bc0e7c3..89193d516 100644 --- a/models/core/types.ts +++ b/models/core/types.ts @@ -169,7 +169,7 @@ export interface IUniteLegaleImmatriculation { isPersonneMorale: boolean; capital: number; estCapitalVariable: boolean; - devisCapital: string; + deviseCapital: string; } export interface IUniteLegaleComplements { diff --git a/redirects.json b/redirects.json index ce11a1c58..d5caf96cf 100644 --- a/redirects.json +++ b/redirects.json @@ -1,4 +1,9 @@ [ + { + "source": "/justificatif/:slug", + "destination": "/documents/:slug", + "permanent": true + }, { "source": "/api/qr/:slug", "destination": "/api/share/qr/:slug",