Skip to content

Commit

Permalink
feat: merge RCS and RNE for agents (#1092)
Browse files Browse the repository at this point in the history
* feat: merge RCS and RNE for agents

* refactor: use API routes for protected labels and certifs

* refactor: carte FNTP

* fix: build

* refactor: usa client data section for conformite

* test: update 401 and 403 tests on data-fetching

* chore: remigration of dirigeants and justificatif to plain old boring async API calls

* fix: typo in rcs route
  • Loading branch information
XavierJp committed Jun 4, 2024
1 parent 617e9d2 commit dc1a68f
Show file tree
Hide file tree
Showing 62 changed files with 1,013 additions and 577 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
'use client';

import BreakPageForPrint from '#components-ui/print-break-page';
import { IUniteLegale } from '#models/core/types';
import { EScope, hasRights } from '#models/user/rights';
import { ISession } from '#models/user/session';
import useFetchRNEImmatriculation from 'hooks/fetch/RNE-immatriculation copy';
import BeneficiairesSection from './beneficiaires';
import DirigeantsProtectedSection from './protected-dirigeants';
import DirigeantsSection from './rne-dirigeants';
import DirigeantSummary from './summary';

export function DirigeantInformation({
uniteLegale,
session,
}: {
uniteLegale: IUniteLegale;
session: ISession | null;
}) {
const immatriculationRNE = useFetchRNEImmatriculation(uniteLegale);

return (
<>
<DirigeantSummary
uniteLegale={uniteLegale}
immatriculationRNE={immatriculationRNE}
/>
{!hasRights(session, EScope.mandatairesRCS) ? (
<DirigeantsSection
uniteLegale={uniteLegale}
immatriculationRNE={immatriculationRNE}
/>
) : (
<DirigeantsProtectedSection
uniteLegale={uniteLegale}
immatriculationRNE={immatriculationRNE}
/>
)}

<BreakPageForPrint />
<BeneficiairesSection
immatriculationRNE={immatriculationRNE}
uniteLegale={uniteLegale}
/>
</>
);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,136 @@
import routes from '#clients/routes';
import { Info, Warning } from '#components-ui/alerts';
import { INPI } from '#components/administrations';
import { DataSectionClient } from '#components/section/data-section';
import { EAdministration } from '#models/administrations/EAdministration';
import { IAPILoading, isAPILoading } from '#models/api-loading';
import {
IAPINotRespondingError,
isAPI404,
isAPINotResponding,
} from '#models/api-not-responding';
import { IUniteLegale } from '#models/core/types';
import { IDirigeant, IImmatriculationRNE } from '#models/immatriculation';
import useFetchRCSMandataires from 'hooks/fetch/RCS-mandataires';
import { DirigeantContent } from './dirigeant-content';
import DirigeantsSection from './rne-dirigeants';

type IProps = {
immatriculationRNE:
| IImmatriculationRNE
| IAPINotRespondingError
| IAPILoading;
uniteLegale: IUniteLegale;
};

function RCSDiffersFromRNE({
mandatairesRCS,
immatriculationRNE,
uniteLegale,
}: {
mandatairesRCS: Array<IDirigeant>;
immatriculationRNE:
| IImmatriculationRNE
| IAPINotRespondingError
| IAPILoading;
uniteLegale: IUniteLegale;
}) {
if (
isAPILoading(immatriculationRNE) ||
isAPINotResponding(immatriculationRNE)
) {
return null;
}

if (immatriculationRNE.dirigeants.length === mandatairesRCS.length) {
return null;
}

return (
<Warning>
Les données d’Infogreffe sont issues du RNE mais il y a une différence
entre le nombre de dirigeant(s) retourné(s) par l’
<INPI />({immatriculationRNE.dirigeants.length}) et par Infogreffe (
{mandatairesRCS.length}). Pour comparer, vous pouvez consulter la page de
cette entreprise sur{' '}
<a
rel="noopener"
target="_blank"
href={`${routes.rne.portail.entreprise}${uniteLegale.siren}`}
aria-label="Consulter la liste des dirigeants sur le site de l’INPI, nouvelle fenêtre"
>
data.inpi.fr
</a>
.
</Warning>
);
}

/**
* Dirigeants for agents : either from Infogreffe or from RNE
*/
function DirigeantsProtectedSection({
uniteLegale,
immatriculationRNE,
}: IProps) {
const mandatairesRCS = useFetchRCSMandataires(uniteLegale);

if (!isAPILoading(mandatairesRCS)) {
if (
isAPI404(mandatairesRCS) ||
(!isAPINotResponding(mandatairesRCS) && mandatairesRCS.length === 0)
) {
return (
<DirigeantsSection
uniteLegale={uniteLegale}
immatriculationRNE={immatriculationRNE}
/>
);
}
}

return (
<DataSectionClient
id="rne-dirigeants"
title="Dirigeant(s)"
isProtected
// @ts-ignore
notFoundInfo={null}
sources={[EAdministration.INPI, EAdministration.INFOGREFFE]}
data={mandatairesRCS}
>
{(mandatairesRCS) => (
<>
<Info>
Ces informations proviennent d’
<a
rel="noopener"
target="_blank"
href={`${routes.infogreffe.portail.home}`}
aria-label="Visiter le site d’Infogreffe, nouvelle fenêtre"
>
Infogreffe
</a>{' '}
et incluent la date de naissance des dirigeant(e)s.
</Info>
<RCSDiffersFromRNE
mandatairesRCS={mandatairesRCS}
immatriculationRNE={immatriculationRNE}
uniteLegale={uniteLegale}
/>
<p>
Cette entreprise possède {mandatairesRCS.length} dirigeant(s)
enregistré(s) au RNE :
</p>
<DirigeantContent
dirigeants={mandatairesRCS}
isFallback={false}
uniteLegale={uniteLegale}
/>
</>
)}
</DataSectionClient>
);
}

export default DirigeantsProtectedSection;
Original file line number Diff line number Diff line change
@@ -1,25 +1,29 @@
import routes from '#clients/routes';
import InpiPartiallyDownWarning from '#components-ui/alerts-with-explanations/inpi-partially-down';
import { INPI } from '#components/administrations';
import { DataSection } from '#components/section/data-section';
import { AsyncDataSectionClient } from '#components/section/data-section/client';
import { UniteLegalePageLink } from '#components/unite-legale-page-link';
import { EAdministration } from '#models/administrations/EAdministration';
import { IAPILoading } from '#models/api-loading';
import { IAPINotRespondingError } from '#models/api-not-responding';
import { IUniteLegale } from '#models/core/types';
import { IImmatriculationRNE } from '#models/immatriculation';
import { DirigeantContent } from './dirigeant-content';

type IProps = {
immatriculationRNE: IImmatriculationRNE | IAPINotRespondingError;
immatriculationRNE:
| IImmatriculationRNE
| IAPINotRespondingError
| IAPILoading;
uniteLegale: IUniteLegale;
};

/**
* Dirigeants section
*/
async function DirigeantsSection({ uniteLegale, immatriculationRNE }: IProps) {
function DirigeantsSection({ uniteLegale, immatriculationRNE }: IProps) {
return (
<DataSection
<AsyncDataSectionClient
id="rne-dirigeants"
title="Dirigeant(s)"
sources={[EAdministration.INPI]}
Expand Down Expand Up @@ -72,7 +76,7 @@ async function DirigeantsSection({ uniteLegale, immatriculationRNE }: IProps) {
</>
);
}}
</DataSection>
</AsyncDataSectionClient>
);
}

Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import { HttpNotFound } from '#clients/exceptions';
import { Loader } from '#components-ui/loader';
import { INPI, INSEE, MI } from '#components/administrations';
import { isAPILoading } from '#models/api-loading';
import { IAPILoading, isAPILoading } from '#models/api-loading';
import {
IAPINotRespondingError,
isAPINotResponding,
Expand Down Expand Up @@ -41,40 +41,46 @@ const NoDirigeantDefault = () => (
);

type IDirigeantSummaryProps = {
immatriculationRNE: IImmatriculationRNE | IAPINotRespondingError;
immatriculationRNE:
| IImmatriculationRNE
| IAPINotRespondingError
| IAPILoading;
uniteLegale: IUniteLegale;
};

const DirigeantSummary: React.FC<IDirigeantSummaryProps> = async ({
const DirigeantSummary: React.FC<IDirigeantSummaryProps> = ({
uniteLegale,
immatriculationRNE,
}) => {
const summaries = [];

if (!isAPINotResponding(immatriculationRNE)) {
const dirigeantsCount = (immatriculationRNE?.dirigeants || []).length;
summaries.push(
<a href="#rne-dirigeants">
{dirigeantsCount} dirigeants inscrits au Registre National des
Entreprises (RNE)
</a>
);

const beneficiairesCount = (immatriculationRNE?.beneficiaires || []).length;
summaries.push(
<a href="#beneficiaires">
{beneficiairesCount} bénéficiaires inscrits à Référentiel des
Bénéficiaires Effectifs
</a>
);
}
if (isAPILoading(immatriculationRNE)) {
summaries.push(
<span>
chargement des données des dirigeants en cours <Loader />
</span>
);
} else {
if (!isAPINotResponding(immatriculationRNE)) {
const dirigeantsCount = (immatriculationRNE?.dirigeants || []).length;
summaries.push(
<a href="#rne-dirigeants">
{dirigeantsCount} dirigeants inscrits au Registre National des
Entreprises (RNE)
</a>
);

const beneficiairesCount = (immatriculationRNE?.beneficiaires || [])
.length;
summaries.push(
<a href="#beneficiaires">
{beneficiairesCount} bénéficiaires inscrits à Référentiel des
Bénéficiaires Effectifs
</a>
);
}
}

const hasNoDirigeant = summaries.length === 0;
if (hasNoDirigeant) {
if (uniteLegale.association.idAssociation) {
Expand Down
23 changes: 10 additions & 13 deletions app/(header-default)/dirigeants/[slug]/page.tsx
Original file line number Diff line number Diff line change
@@ -1,9 +1,10 @@
import { Metadata } from 'next';
import { Suspense } from 'react';
import { PageLoader } from '#components/page-loader';
import { DonneesPriveesSection } from '#components/donnees-privees-section';
import Title from '#components/title-section';
import { FICHE } from '#components/title-section/tabs';
import { estDiffusible } from '#models/core/statut-diffusion';
import { getServicePublicByUniteLegale } from '#models/service-public';
import { EScope, hasRights } from '#models/user/rights';
import {
uniteLegalePageDescription,
uniteLegalePageTitle,
Expand All @@ -13,9 +14,9 @@ import extractParamsAppRouter, {
AppRouterProps,
} from '#utils/server-side-helper/app/extract-params';
import getSession from '#utils/server-side-helper/app/get-session';
import ResponsableSection from 'app/(header-default)/dirigeants/_component/sections/service-public-responsables';
import { DirigeantInformation } from '../_component/sections';
import SubServicesSection from '../_component/sections/service-public-subservices';
import ResponsableSection from 'app/(header-default)/dirigeants/[slug]/_component/sections/service-public-responsables';
import { DirigeantInformation } from './_component/sections';
import SubServicesSection from './_component/sections/service-public-subservices';

export const generateMetadata = async (
props: AppRouterProps
Expand Down Expand Up @@ -64,15 +65,11 @@ const DirigeantsPage = async (props: AppRouterProps) => {
uniteLegale={uniteLegale}
/>
</>
) : !estDiffusible(uniteLegale) &&
!hasRights(session, EScope.nonDiffusible) ? (
<DonneesPriveesSection />
) : (
!isBot && (
<Suspense fallback={<PageLoader />}>
<DirigeantInformation
uniteLegale={uniteLegale}
session={session}
/>
</Suspense>
)
<DirigeantInformation uniteLegale={uniteLegale} session={session} />
)}
</div>
</>
Expand Down
Loading

0 comments on commit dc1a68f

Please sign in to comment.