Skip to content

Commit

Permalink
feat: remove status col, add isProtected, create component, add agent…
Browse files Browse the repository at this point in the history
… wall
  • Loading branch information
rmonnier9 committed Oct 11, 2024
1 parent 8aa9f72 commit a06ccf8
Show file tree
Hide file tree
Showing 3 changed files with 81 additions and 33 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
import { IUniteLegale } from '#models/core/types';
import { PropsWithChildren } from 'react';
import AgentWall from '.';

const AgentWallSubventionsAssociation: React.FC<
PropsWithChildren<{
title: string;
id: string;
uniteLegale: IUniteLegale;
}>
> = ({ uniteLegale, id, title }) => <AgentWall id={id} title={title} />;

export default AgentWallSubventionsAssociation;
99 changes: 67 additions & 32 deletions components/subventions-association-section/index.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -2,13 +2,51 @@

import { Tag } from '#components-ui/tag';
import { DataSubvention } from '#components/administrations';
import AgentWallSubventionsAssociation from '#components/espace-agent-components/agent-wall/subventions-association';
import { DataSectionClient } from '#components/section/data-section';
import { FullTable } from '#components/table/full';
import { EAdministration } from '#models/administrations/EAdministration';
import { IAssociation } from '#models/core/types';
import { ISubventions } from '#models/subventions/association';
import { AppScope, hasRights } from '#models/user/rights';
import { ISession } from '#models/user/session';
import { formatCurrency } from '#utils/helpers';
import { useAPIRouteData } from 'hooks/fetch/use-API-route-data';
import { useMemo } from 'react';

const SubventionDetails: React.FC<{ subventions: ISubventions }> = ({
subventions,
}) => {
const subventionStats = useMemo(() => {
const totalSubventions = subventions.length;
const mostRecentYear = subventions[totalSubventions - 1]?.year;
const approvedSubventions = subventions.filter(
(subvention) => subvention.label === 'Accordé'
);
const totalApproved = approvedSubventions.length;
const totalAmount = approvedSubventions.reduce(
(acc, subvention) => acc + subvention.amount,
0
);

return {
totalSubventions,
mostRecentYear,
totalApproved,
totalAmount,
};
}, [subventions]);

return (
<p>
Cette association a demandé {subventionStats.totalSubventions}{' '}
subvention(s) depuis {subventionStats.mostRecentYear} dont{' '}
<b>{subventionStats.totalApproved} accordée(s)</b> pour un total de{' '}
<b>{formatCurrency(subventionStats.totalAmount)}</b>. Ces données sont
collectées par <DataSubvention />.
</p>
);
};

export const SubventionsAssociationSection: React.FC<{
uniteLegale: IAssociation;
Expand All @@ -19,56 +57,53 @@ export const SubventionsAssociationSection: React.FC<{
uniteLegale.siren,
session
);
if (!subventions) return null;

if (!hasRights(session, AppScope.none)) {
return (
<AgentWallSubventionsAssociation
title="Détail des subventions"
id="detail-des-subventions"
uniteLegale={uniteLegale}
/>
);
}

return (
<DataSectionClient
notFoundInfo="Aucune demande de subvention n’a été trouvée pour cette association."
id="detail-des-subventions"
title="Détail des subventions"
sources={[EAdministration.DATA_SUBVENTION]}
notFoundInfo="Aucune demande de subvention n’a été trouvée pour cette association."
data={subventions}
isProtected
>
{(subventions) =>
subventions.length === 0 ? (
!subventions || subventions?.length === 0 ? (
<>
Aucune demande de subvention n’a été trouvée pour cette association.
</>
) : (
<>
<p>
Voici le détail des subventions demandées par l’association. Ces
données sont collectées par <DataSubvention />.
</p>
<SubventionDetails subventions={subventions} />
<FullTable
head={['Année', 'Dispositif', 'Montant', 'Status', 'Label']}
head={['Année', 'Dispositif', 'Montant', 'Label']}
body={subventions.map((subvention) => [
<strong>{subvention.year}</strong>,
<strong>{subvention.description}</strong>,
formatCurrency(subvention.amount),
// TODO Component
<Tag
color={
subvention.status === 'Accordé'
? 'success'
: subvention.status === 'Refusé'
? 'error'
: 'new'
}
>
{subvention.status}
</Tag>,
// TODO Component
<Tag
color={
subvention.status === 'Accordé'
? 'success'
: subvention.status === 'Refusé'
? 'error'
: 'new'
}
>
{subvention.label}
</Tag>,
subvention.label && (
<Tag
color={
subvention.label === 'Accordé'
? 'success'
: subvention.label === 'Refusé'
? 'error'
: 'new'
}
>
{subvention.label}
</Tag>
),
])}
/>
</>
Expand Down
2 changes: 1 addition & 1 deletion models/subventions/association/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ export interface ISubvention {

export const getSubventionsAssociationFromSlug = async (
slug: string
): Promise<ISubventions | IAPINotRespondingError | null> => {
): Promise<ISubventions | IAPINotRespondingError> => {
const uniteLegale = await getUniteLegaleFromSlug(slug, {
isBot: false,
});
Expand Down

0 comments on commit a06ccf8

Please sign in to comment.