Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: split justificatif into /documents and /entreprise and /annonces #1192

Merged
merged 21 commits into from
Sep 17, 2024
Merged
Show file tree
Hide file tree
Changes from 11 commits
Commits
Show all changes
21 commits
Select commit Hold shift + click to select a range
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 2 additions & 3 deletions app/(header-default)/a-propos/donnees-extrait-kbis/page.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -52,8 +52,7 @@ export default function ExtraitKbis() {
de l’entreprise concernée.
</p>
<p>
Une fois sur la page de l’entreprise, consultez l’onglet{' '}
<strong>justificatifs</strong> et retrouvez-y les données
Une fois sur la page de l’entreprise, retrouvez les données
d’immatriculations issues du Registre National des Entreprises (RNE)
tenu par l’
<INPI />.
Expand Down Expand Up @@ -81,7 +80,7 @@ export default function ExtraitKbis() {
<strong>NB :</strong> le lien se construit ainsi :
</p>
<code>
https://annuaire-entreprises.data.gouv.fr/justificatif/
https://annuaire-entreprises.data.gouv.fr/entreprise/
<i>{'{insérer_le_numéro_siren}'}</i>
</code>
<h2>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@ const AnnoncesBodacc: React.FC<{

return (
<AsyncDataSectionClient
id="annonces-bodacc"
title="Annonces BODACC"
sources={[EAdministration.DILA]}
data={bodacc}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ const AnnoncesJOAFESection: React.FC<{
const annoncesAssociation = useFetchJOAFE(uniteLegale);
return (
<AsyncDataSectionClient
id="annonces-joafe"
title="Annonces Journal Officiel des Associations"
sources={[EAdministration.DILA]}
data={annoncesAssociation}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
'use client';

import InpiPartiallyDownWarning from '#components-ui/alerts-with-explanations/inpi-partially-down';
import { Tag } from '#components-ui/tag';
import { AsyncDataSectionClient } from '#components/section/data-section/client';
import { FullTable } from '#components/table/full';
import { EAdministration } from '#models/administrations/EAdministration';
import { IUniteLegale } from '#models/core/types';
import { ISession } from '#models/user/session';
import { useAPIRouteData } from 'hooks/fetch/use-API-route-data';

export const ObservationsRNE: React.FC<{
uniteLegale: IUniteLegale;
session: ISession | null;
}> = ({ uniteLegale, session }) => {
const observations = useAPIRouteData(
'observations',
uniteLegale.siren,
session
);

return (
<AsyncDataSectionClient
id="observations-rne"
title="Observations au RNE"
sources={[EAdministration.INPI]}
data={observations}
notFoundInfo={
<>
Cette structure ne possède pas de fiche d’immatriculation au{' '}
<strong>Registre National des Entreprises (RNE)</strong>.
</>
}
>
{({ data, metadata }) =>
data.length > 0 ? (
<>
{metadata.isFallback && <InpiPartiallyDownWarning />}
<p>
Cette structure possède {data.length} observation(s) au{' '}
<strong>RNE</strong>
&nbsp;:
</p>
<FullTable
head={['Date d’ajout', 'Numéro d’observation', 'Description']}
body={data.map((o) => [
o.dateAjout,
o.numObservation ? <Tag>{o.numObservation}</Tag> : '',
o.description,
])}
/>
</>
) : (
<>
Cette structure ne possède pas d’observations au{' '}
<strong>Registre National des Entreprises (RNE)</strong>.
</>
)
}
</AsyncDataSectionClient>
);
};
33 changes: 27 additions & 6 deletions app/(header-default)/annonces/[slug]/page.tsx
Original file line number Diff line number Diff line change
@@ -1,6 +1,4 @@
import { Metadata } from 'next';
import AnnoncesBodacc from '#components/annonces-section/annonces/bodacc';
import AnnoncesJOAFESection from '#components/annonces-section/annonces/joafe';
import { DonneesPriveesSection } from '#components/donnees-privees-section';
import Title from '#components/title-section';
import { FICHE } from '#components/title-section/tabs';
Expand All @@ -16,6 +14,9 @@ import extractParamsAppRouter, {
AppRouterProps,
} from '#utils/server-side-helper/app/extract-params';
import getSession from '#utils/server-side-helper/app/get-session';
import AnnoncesBodacc from 'app/(header-default)/annonces/[slug]/_components/bodacc';
import AnnoncesJOAFESection from 'app/(header-default)/annonces/[slug]/_components/joafe';
import { ObservationsRNE } from './_components/observations-rne';

export const generateMetadata = async (
props: AppRouterProps
Expand Down Expand Up @@ -50,13 +51,33 @@ const AnnoncesPage = async (props: AppRouterProps) => {
/>
{estDiffusible(uniteLegale) ||
hasRights(session, EScope.nonDiffusible) ? (
<AnnoncesBodacc uniteLegale={uniteLegale} />
<>
<ul>
<li>
<a href="#annonces-bodacc">Annonces au BODACC</a>
</li>
{uniteLegale.dateMiseAJourInpi && (
<li>
<a href="#observations-rne">Observations au RNE</a>
</li>
)}
{isAssociation(uniteLegale) && (
<li>
<a href="#annonces-joafe">Annonces au JOAFE</a>
</li>
)}
</ul>
<AnnoncesBodacc uniteLegale={uniteLegale} />
{uniteLegale.dateMiseAJourInpi && (
<ObservationsRNE uniteLegale={uniteLegale} session={session} />
)}
{isAssociation(uniteLegale) && (
<AnnoncesJOAFESection uniteLegale={uniteLegale} />
)}
</>
) : (
<DonneesPriveesSection />
)}
{isAssociation(uniteLegale) && (
<AnnoncesJOAFESection uniteLegale={uniteLegale} />
)}
</div>
</>
);
Expand Down
Original file line number Diff line number Diff line change
@@ -1,133 +1,46 @@
'use client';

import React from 'react';
import routes from '#clients/routes';
import { Warning } from '#components-ui/alerts';
import InpiPartiallyDownWarning from '#components-ui/alerts-with-explanations/inpi-partially-down';
import { HorizontalSeparator } from '#components-ui/horizontal-separator';
import { INPI } from '#components/administrations';
import { AsyncDataSectionClient } from '#components/section/data-section/client';
import { FullTable } from '#components/table/full';
import { UniteLegalePageLink } from '#components/unite-legale-page-link';
import { DataSection } from '#components/section/data-section';
import { EAdministration } from '#models/administrations/EAdministration';
import { IAPINotRespondingError } from '#models/api-not-responding';
import { IUniteLegale } from '#models/core/types';
import { IDataFetchingState } from '#models/data-fetching';
import { IBeneficiaire, IImmatriculationRNE } from '#models/immatriculation';
import { formatDatePartial } from '#utils/helpers';

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

function hasSeveralBeneficiaires(immatriculationRNE: IImmatriculationRNE) {
return immatriculationRNE.beneficiaires.length > 1;
}

/**
* Dirigeants section
* @param param0
* @returns
*/
const BeneficiairesSection: React.FC<IProps> = ({
immatriculationRNE,
uniteLegale,
}) => {
const BeneficiairesSection: React.FC<IProps> = ({ uniteLegale }) => {
return (
<>
<HorizontalSeparator />
<AsyncDataSectionClient
<DataSection
id="beneficiaires"
title="Bénéficiaire(s) effectif(s)"
sources={[EAdministration.INPI]}
notFoundInfo={
<>
Cette structure n’est pas enregistrée au{' '}
<strong>Registre National des Entreprises (RNE)</strong>
</>
}
data={immatriculationRNE}
data={uniteLegale}
>
{(immatriculationRNE) => (
<BénéficiairesContent
immatriculationRNE={immatriculationRNE}
uniteLegale={uniteLegale}
/>
)}
</AsyncDataSectionClient>
{(uniteLegale) =>
uniteLegale.dateMiseAJourInpi ? (
<WarningRBE />
) : (
<>
Cette structure n’est pas enregistrée au{' '}
<strong>Registre National des Entreprises (RNE)</strong>
</>
)
}
</DataSection>
</>
);
};
export default BeneficiairesSection;

type IBeneficiairesContentProps = {
immatriculationRNE: IImmatriculationRNE;
uniteLegale: IUniteLegale;
};
function BénéficiairesContent({
immatriculationRNE,
uniteLegale,
}: IBeneficiairesContentProps) {
const { beneficiaires } = immatriculationRNE;

const formtInfos = (beneficiaire: IBeneficiaire) => [
beneficiaire.nationalite,
<>
{beneficiaire.prenoms}
{beneficiaire.prenoms && ' '}
{(beneficiaire.nom || '').toUpperCase()}, né(e) en{' '}
{formatDatePartial(beneficiaire.dateNaissancePartial)}
</>,
];

const plural = hasSeveralBeneficiaires(immatriculationRNE) ? 's' : '';

return (
<>
<WarningRBE />
{immatriculationRNE.beneficiaires.length === 0 ? null : (
<>
{immatriculationRNE.metadata.isFallback && (
<InpiPartiallyDownWarning />
)}
<p>
Cette entreprise possède {beneficiaires.length}{' '}
<a
rel="noreferrer noopener"
target="_blank"
href="https://www.inpi.fr/fr/faq/qu-est-ce-qu-un-beneficiaire-effectif"
>
bénéficiaire{plural} effectif{plural}
</a>{' '}
enregistré{plural} au{' '}
<strong>Registre National des Entreprises (RNE)</strong> tenu par l’
<INPI />. Retrouvez le détail des modalités de contrôle sur{' '}
<UniteLegalePageLink
uniteLegale={uniteLegale}
href={`${routes.rne.portail.entreprise}${uniteLegale.siren}`}
siteName="le site de l’INPI"
/>
&nbsp;:
</p>
<FullTable
head={['Nationalité', 'Détails']}
body={beneficiaires.map((beneficiaire) => formtInfos(beneficiaire))}
/>
</>
)}
<style global jsx>{`
table > tbody > tr > td:first-of-type {
width: 30%;
}
`}</style>
</>
);
}

const WarningRBE = () => (
<Warning>
À compter du 31 juillet 2024, le registre des bénéficiaires effectifs{' '}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,15 +1,11 @@
import { FullTable } from '#components/table/full';
import { IUniteLegale } from '#models/core/types';
import {
IDirigeant,
IEtatCivil,
IPersonneMorale,
} from '#models/immatriculation';
import { IDirigeants, IEtatCivil, IPersonneMorale } from '#models/rne/types';
import { formatDateLong, formatDatePartial, formatIntFr } from '#utils/helpers';
import { isPersonneMorale } from '../is-personne-morale';

type IDirigeantContentProps = {
dirigeants: IDirigeant[];
dirigeants: IDirigeants;
uniteLegale: IUniteLegale;
};

Expand Down Expand Up @@ -83,7 +79,7 @@ export function DirigeantContent({
<>
<FullTable
head={['Role', 'Details', 'Action']}
body={dirigeants.map((dirigeant) => formatDirigeant(dirigeant))}
body={dirigeants.data.map((dirigeant) => formatDirigeant(dirigeant))}
/>
</>
);
Expand Down
Loading
Loading