diff --git a/packages/applications/legacy/package.json b/packages/applications/legacy/package.json index bb0bfac0329..e0cd3a92a8d 100644 --- a/packages/applications/legacy/package.json +++ b/packages/applications/legacy/package.json @@ -7,7 +7,7 @@ "type:check": "tsc --noEmit", "start": "node ./dist/src/index.js", "build": "npm run build:front && npm run build:css && npm run build:back", - "build:back": "npx --node-options=\"--max-old-space-size=8192\" tsc --build tsconfig.build.json && cp -R src/public dist/src && cp -R src/views/template dist/src/views && cp -R src/views/maintenance.html dist/src/views", + "build:back": "npx --node-options=\"--max-old-space-size=8192\" tsc --build tsconfig.build.json && cp -R src/public dist/src && cp -R src/views/maintenance.html dist/src/views", "build:css": "tailwindcss -i ./src/views/index.css -o ./src/public/css/index.css", "build:front": "webpack --config=webpack.config.js", "lint": "eslint ./src --ext .ts,.tsx", diff --git a/packages/applications/legacy/src/controllers/helpers/sendFile.ts b/packages/applications/legacy/src/controllers/helpers/sendFile.ts deleted file mode 100644 index a95752b3022..00000000000 --- a/packages/applications/legacy/src/controllers/helpers/sendFile.ts +++ /dev/null @@ -1,41 +0,0 @@ -import { extension } from 'mime-types'; -import type core from 'express-serve-static-core'; -import { logger } from '../../core/utils'; - -type SendFileOptions = { - fileName: string; - mimeType: string; - content: ReadableStream; -}; - -export const sendFile = async ( - response: core.Response, - { content, fileName, mimeType }: SendFileOptions, -) => { - const extensionFichier = extension(mimeType); - - try { - const reader = content.getReader(); - - response.type(mimeType); - response.setHeader( - 'Content-Disposition', - `attachment; filename=${fileName}.${extensionFichier}`, - ); - - const readFile = async () => { - const result = await reader.read(); - if (result.done) { - reader.releaseLock(); - response.status(200).end(); - } else { - response.write(result.value); - return await readFile(); - } - }; - await readFile(); - } catch (e) { - logger.error(e); - response.status(500).end(); - } -}; diff --git a/packages/applications/legacy/src/controllers/project/getProjectPage/_utils/cahierDesCharges/getCahierDesCharges.ts b/packages/applications/legacy/src/controllers/project/getProjectPage/_utils/cahierDesCharges/getCahierDesCharges.ts deleted file mode 100644 index 272de6f341f..00000000000 --- a/packages/applications/legacy/src/controllers/project/getProjectPage/_utils/cahierDesCharges/getCahierDesCharges.ts +++ /dev/null @@ -1,21 +0,0 @@ -import { mediator } from 'mediateur'; - -import { IdentifiantProjet, Lauréat } from '@potentiel-domain/projet'; -import { Option } from '@potentiel-libraries/monads'; - -// duplicata de packages/applications/ssr/src/app/_helpers -// sera supprimé après la migration de la page projet -export const getCahierDesCharges = async (identifiantProjet: IdentifiantProjet.ValueType) => { - const cahierDesCharges = await mediator.send({ - type: 'Lauréat.CahierDesCharges.Query.ConsulterCahierDesCharges', - data: { - identifiantProjetValue: identifiantProjet.formatter(), - }, - }); - - if (Option.isNone(cahierDesCharges)) { - return undefined; - } - - return cahierDesCharges; -}; diff --git "a/packages/applications/legacy/src/controllers/project/getProjectPage/_utils/checkLaur\303\251at/checkAutorisationChangement.ts" "b/packages/applications/legacy/src/controllers/project/getProjectPage/_utils/checkLaur\303\251at/checkAutorisationChangement.ts" deleted file mode 100644 index 77a9c8130cd..00000000000 --- "a/packages/applications/legacy/src/controllers/project/getProjectPage/_utils/checkLaur\303\251at/checkAutorisationChangement.ts" +++ /dev/null @@ -1,48 +0,0 @@ -import { Role } from '@potentiel-domain/utilisateur'; -import { AppelOffre } from '@potentiel-domain/appel-offre'; - -type Props = { - rôle: Role.ValueType; - règlesChangementPourAppelOffres: AppelOffre.RèglesDemandesChangement[TDomain]; - nécessiteInstruction?: boolean; - domain: TDomain; - aUnAbandonEnCours: boolean; - estAbandonné: boolean; - estAchevé: boolean; -}; - -export const checkAutorisationChangement = async < - TDomain extends keyof AppelOffre.RèglesDemandesChangement, ->({ - rôle, - règlesChangementPourAppelOffres, - nécessiteInstruction, - domain, - aUnAbandonEnCours, - estAbandonné, - estAchevé, -}: Props) => { - const peutModifier = rôle.aLaPermission(`${domain}.modifier` as Role.Policy); - - const peutFaireUneDemandeDeChangement = - nécessiteInstruction !== false && - rôle.aLaPermission(`${domain}.demanderChangement` as Role.Policy) && - !aUnAbandonEnCours && - !estAbandonné && - !estAchevé && - règlesChangementPourAppelOffres.demande; - - const peutEnregistrerChangement = - nécessiteInstruction !== true && - rôle.aLaPermission(`${domain}.enregistrerChangement` as Role.Policy) && - !aUnAbandonEnCours && - !estAbandonné && - !estAchevé && - règlesChangementPourAppelOffres.informationEnregistrée; - - return { - peutModifier, - peutFaireUneDemandeDeChangement, - peutEnregistrerChangement, - }; -}; diff --git a/packages/applications/legacy/src/controllers/project/getProjectPage/_utils/getAbandon.ts b/packages/applications/legacy/src/controllers/project/getProjectPage/_utils/getAbandon.ts deleted file mode 100644 index d75420be51d..00000000000 --- a/packages/applications/legacy/src/controllers/project/getProjectPage/_utils/getAbandon.ts +++ /dev/null @@ -1,26 +0,0 @@ -import { mediator } from 'mediateur'; -import { IdentifiantProjet } from '@potentiel-domain/projet'; - -import { Option } from '@potentiel-libraries/monads'; -import { getLogger } from '@potentiel-libraries/monitoring'; -import { Lauréat } from '@potentiel-domain/projet'; - -export type GetAbandon = ( - identifiantProjet: IdentifiantProjet.ValueType, -) => Promise; - -export const getAbandon: GetAbandon = async (identifiantProjet: IdentifiantProjet.ValueType) => { - try { - const abandon = await mediator.send({ - type: 'Lauréat.Abandon.Query.ConsulterAbandon', - data: { identifiantProjetValue: identifiantProjet.formatter() }, - }); - - return Option.isSome(abandon) ? abandon : undefined; - } catch (error) { - getLogger('Legacy|getProjectPage|getAbandonStatut').error(`Impossible de consulter l'abandon`, { - identifiantProjet: identifiantProjet.formatter(), - }); - return undefined; - } -}; diff --git a/packages/applications/legacy/src/controllers/project/getProjectPage/_utils/getActionnaire.ts b/packages/applications/legacy/src/controllers/project/getProjectPage/_utils/getActionnaire.ts deleted file mode 100644 index 71067f16d3d..00000000000 --- a/packages/applications/legacy/src/controllers/project/getProjectPage/_utils/getActionnaire.ts +++ /dev/null @@ -1,115 +0,0 @@ -import { mediator } from 'mediateur'; - -import { Option } from '@potentiel-libraries/monads'; -import { Lauréat } from '@potentiel-domain/projet'; -import { Routes } from '@potentiel-applications/routes'; -import { Role } from '@potentiel-domain/utilisateur'; -import { getLogger } from '@potentiel-libraries/monitoring'; -import { IdentifiantProjet } from '@potentiel-domain/projet'; -import { AppelOffre } from '@potentiel-domain/appel-offre'; -import { checkAutorisationChangement } from './checkLauréat/checkAutorisationChangement'; - -type GetActionnaireAffichageForProjectPage = { - label: string; - labelActions?: string; - url: string; -}; -export type GetActionnaireForProjectPage = { - nom: string; - affichage?: GetActionnaireAffichageForProjectPage; -}; - -type Props = { - identifiantProjet: IdentifiantProjet.ValueType; - rôle: string; - nécessiteInstruction: boolean; - règlesChangementPourAppelOffres: AppelOffre.RèglesDemandesChangement['actionnaire']; - aUnAbandonEnCours: boolean; - estAbandonné: boolean; - estAchevé: boolean; -}; - -export const getActionnaire = async ({ - identifiantProjet, - rôle, - nécessiteInstruction, - règlesChangementPourAppelOffres, - aUnAbandonEnCours, - estAbandonné, - estAchevé, -}: Props): Promise => { - try { - const role = Role.convertirEnValueType(rôle); - - const actionnaire = await mediator.send({ - type: 'Lauréat.Actionnaire.Query.ConsulterActionnaire', - data: { identifiantProjet: identifiantProjet.formatter() }, - }); - - if (Option.isSome(actionnaire)) { - const { actionnaire: nom, dateDemandeEnCours } = actionnaire; - - if (dateDemandeEnCours) { - return { - nom, - affichage: role.aLaPermission('actionnaire.consulterChangement') - ? { - url: Routes.Actionnaire.changement.détails( - identifiantProjet.formatter(), - dateDemandeEnCours.formatter(), - ), - label: 'Voir la demande de modification', - labelActions: 'Demande de modification d’actionnaire(s)', - } - : undefined, - }; - } - - const { peutModifier, peutFaireUneDemandeDeChangement, peutEnregistrerChangement } = - await checkAutorisationChangement<'actionnaire'>({ - rôle: Role.convertirEnValueType(rôle), - règlesChangementPourAppelOffres, - nécessiteInstruction, - domain: 'actionnaire', - aUnAbandonEnCours, - estAbandonné, - estAchevé, - }); - - // règle spécifique à AOS, à rapatrier dans les règles métier présentes dans les AO si besoin - const estPetitPV = identifiantProjet.appelOffre === 'PPE2 - Petit PV Bâtiment'; - - const affichage = estPetitPV - ? undefined - : peutModifier - ? { - url: Routes.Actionnaire.modifier(identifiantProjet.formatter()), - label: 'Modifier', - labelActions: 'Modifier l’actionnaire(s)', - } - : peutEnregistrerChangement - ? { - url: Routes.Actionnaire.changement.enregistrer(identifiantProjet.formatter()), - label: 'Faire un changement', - labelActions: "Changer d'actionnaire(s)", - } - : peutFaireUneDemandeDeChangement - ? { - url: Routes.Actionnaire.changement.demander(identifiantProjet.formatter()), - label: 'Faire une demande de changement', - labelActions: 'Demander un changement d’actionnaire(s)', - } - : undefined; - - return { - nom, - affichage, - }; - } - - return undefined; - } catch (error) { - getLogger().error(error); - return undefined; - } -}; diff --git a/packages/applications/legacy/src/controllers/project/getProjectPage/_utils/getAlertesRaccordement.ts b/packages/applications/legacy/src/controllers/project/getProjectPage/_utils/getAlertesRaccordement.ts deleted file mode 100644 index dd3110b9c55..00000000000 --- a/packages/applications/legacy/src/controllers/project/getProjectPage/_utils/getAlertesRaccordement.ts +++ /dev/null @@ -1,41 +0,0 @@ -import { IdentifiantProjet } from '@potentiel-domain/projet'; -import { Option } from '@potentiel-libraries/monads'; - -import { AlerteRaccordement } from '../../../../views/pages'; -import { getLogger } from '@potentiel-libraries/monitoring'; -import { GetRaccordementForProjectPage } from './getRaccordement'; - -export const getAlertesRaccordement = async ({ - identifiantProjet, - CDC2022Choisi, - raccordement, -}: { - identifiantProjet: IdentifiantProjet.ValueType; - CDC2022Choisi: boolean; - raccordement: GetRaccordementForProjectPage['raccordement']; -}) => { - try { - const alertes: Array = []; - - if (Option.isNone(raccordement) || raccordement.dossiers.length === 0) { - alertes.push('demandeComplèteRaccordementManquante'); - if (CDC2022Choisi) { - alertes.push('référenceDossierManquantePourDélaiCDC2022'); - } - } else { - if (!raccordement.dossiers[0].demandeComplèteRaccordement.accuséRéception) { - alertes.push('demandeComplèteRaccordementManquante'); - } - } - - return alertes; - } catch (error) { - getLogger('Legacy|getProjectPage|getAlertesRaccordement').error( - `Impossible de consulter le raccordement`, - { - identifiantProjet: identifiantProjet.formatter(), - }, - ); - return []; - } -}; diff --git "a/packages/applications/legacy/src/controllers/project/getProjectPage/_utils/getAttestationDeConformit\303\251.ts" "b/packages/applications/legacy/src/controllers/project/getProjectPage/_utils/getAttestationDeConformit\303\251.ts" deleted file mode 100644 index 9bfdfc1d1ed..00000000000 --- "a/packages/applications/legacy/src/controllers/project/getProjectPage/_utils/getAttestationDeConformit\303\251.ts" +++ /dev/null @@ -1,52 +0,0 @@ -import { mediator } from 'mediateur'; -import { IdentifiantProjet } from '@potentiel-domain/projet'; -import { Lauréat, DocumentProjet } from '@potentiel-domain/projet'; - -import { Option } from '@potentiel-libraries/monads'; -import { getLogger } from '@potentiel-libraries/monitoring'; -import { Role } from '@potentiel-domain/utilisateur'; - -export type GetAttestationDeConformitéForProjectPage = { - date: number; - attestation: DocumentProjet.RawType; - preuveTransmissionAuCocontractant?: DocumentProjet.RawType; - identifiantProjet: IdentifiantProjet.RawType; - permissionModifier: boolean; -}; - -export const getAttestationDeConformité = async ( - identifiantProjet: IdentifiantProjet.ValueType, - rôle: string, -): Promise => { - try { - const utilisateur = Role.convertirEnValueType(rôle); - - const achèvement = await mediator.send({ - type: 'Lauréat.Achèvement.Query.ConsulterAchèvement', - data: { identifiantProjetValue: identifiantProjet.formatter() }, - }); - - return Option.isSome(achèvement) && achèvement.estAchevé - ? { - date: achèvement.dateAchèvementRéel.date.getTime(), - attestation: achèvement.attestation.formatter(), - preuveTransmissionAuCocontractant: Option.isSome( - achèvement.preuveTransmissionAuCocontractant, - ) - ? achèvement.preuveTransmissionAuCocontractant.formatter() - : undefined, - identifiantProjet: identifiantProjet.formatter(), - permissionModifier: utilisateur.aLaPermission('achèvement.modifier'), - } - : undefined; - } catch (error) { - getLogger('Legacy|getProjectPage|getAttestationDeConformité').error( - `Impossible de consulter l'attestation de conformité`, - { - identifiantProjet: identifiantProjet.formatter(), - }, - ); - - return undefined; - } -}; diff --git "a/packages/applications/legacy/src/controllers/project/getProjectPage/_utils/getDateAch\303\250vementPr\303\251visionnel.ts" "b/packages/applications/legacy/src/controllers/project/getProjectPage/_utils/getDateAch\303\250vementPr\303\251visionnel.ts" deleted file mode 100644 index b4d8bcab5c1..00000000000 --- "a/packages/applications/legacy/src/controllers/project/getProjectPage/_utils/getDateAch\303\250vementPr\303\251visionnel.ts" +++ /dev/null @@ -1,17 +0,0 @@ -import { mediator } from 'mediateur'; -import { IdentifiantProjet, Lauréat } from '@potentiel-domain/projet'; - -import { Option } from '@potentiel-libraries/monads'; - -export const getDateAchèvementPrévisionnel = async ( - identifiantProjet: IdentifiantProjet.ValueType, -) => { - const achèvement = await mediator.send({ - type: 'Lauréat.Achèvement.Query.ConsulterAchèvement', - data: { identifiantProjetValue: identifiantProjet.formatter() }, - }); - - return Option.match(achèvement) - .some((achèvement) => achèvement.dateAchèvementPrévisionnel.dateTime.date.getTime()) - .none(); -}; diff --git "a/packages/applications/legacy/src/controllers/project/getProjectPage/_utils/getD\303\251lai.ts" "b/packages/applications/legacy/src/controllers/project/getProjectPage/_utils/getD\303\251lai.ts" deleted file mode 100644 index e42214e0e01..00000000000 --- "a/packages/applications/legacy/src/controllers/project/getProjectPage/_utils/getD\303\251lai.ts" +++ /dev/null @@ -1,88 +0,0 @@ -import { IdentifiantProjet, Lauréat } from '@potentiel-domain/projet'; -import { Role } from '@potentiel-domain/utilisateur'; -import { Routes } from '@potentiel-applications/routes'; - -import { getLogger } from '@potentiel-libraries/monitoring'; -import { mediator } from 'mediateur'; -import { checkAutorisationChangement } from './checkLauréat/checkAutorisationChangement'; -import { AppelOffre } from '@potentiel-domain/appel-offre'; - -export type GetDélaiForProjectPage = { - affichage?: { - label?: string; - labelActions: string; - url: string; - }; -}; - -type GetDélai = (args: { - identifiantProjet: IdentifiantProjet.ValueType; - identifiantUtilisateur: string; - rôle: string; - règlesChangementPourAppelOffres: AppelOffre.RèglesDemandesChangement['délai']; - aUnAbandonEnCours: boolean; - estAbandonné: boolean; - estAchevé: boolean; -}) => Promise; - -export const getDélai: GetDélai = async ({ - identifiantProjet, - identifiantUtilisateur, - rôle, - règlesChangementPourAppelOffres, - aUnAbandonEnCours, - estAbandonné, - estAchevé, -}) => { - try { - const role = Role.convertirEnValueType(rôle); - - const demandeEnCours = ( - await mediator.send({ - type: 'Lauréat.Délai.Query.ListerDemandeDélai', - data: { - identifiantProjet: identifiantProjet.formatter(), - range: { startPosition: 0, endPosition: 1 }, - utilisateur: identifiantUtilisateur, - statuts: Lauréat.Délai.StatutDemandeDélai.statutsEnCours, - }, - }) - ).items[0]; - - if (demandeEnCours && role.aLaPermission('délai.consulterDemande')) { - return { - affichage: { - label: 'Voir la demande de délai', - labelActions: 'Demander un délai', - url: Routes.Délai.détail( - identifiantProjet.formatter(), - demandeEnCours.demandéLe.formatter(), - ), - }, - }; - } - - const { peutFaireUneDemandeDeChangement } = await checkAutorisationChangement<'délai'>({ - rôle: Role.convertirEnValueType(rôle), - aUnAbandonEnCours, - estAbandonné, - estAchevé, - règlesChangementPourAppelOffres, - domain: 'délai', - }); - - const affichage = peutFaireUneDemandeDeChangement - ? { - labelActions: 'Demander un délai', - url: Routes.Délai.demander(identifiantProjet.formatter()), - } - : undefined; - - return { - affichage, - }; - } catch (error) { - getLogger().error(error); - return {}; - } -}; diff --git a/packages/applications/legacy/src/controllers/project/getProjectPage/_utils/getFournisseur.ts b/packages/applications/legacy/src/controllers/project/getProjectPage/_utils/getFournisseur.ts deleted file mode 100644 index 1aa3058d161..00000000000 --- a/packages/applications/legacy/src/controllers/project/getProjectPage/_utils/getFournisseur.ts +++ /dev/null @@ -1,90 +0,0 @@ -import { Lauréat } from '@potentiel-domain/projet'; - -import { Option } from '@potentiel-libraries/monads'; -import { IdentifiantProjet } from '@potentiel-domain/projet'; -import { Routes } from '@potentiel-applications/routes'; -import { Role } from '@potentiel-domain/utilisateur'; -import { getLogger } from '@potentiel-libraries/monitoring'; -import { mediator } from 'mediateur'; -import { AppelOffre } from '@potentiel-domain/appel-offre'; -import { checkAutorisationChangement } from './checkLauréat/checkAutorisationChangement'; - -export type GetFournisseurForProjectPage = Pick< - Lauréat.Fournisseur.ConsulterFournisseurReadModel, - 'fournisseurs' | 'évaluationCarboneSimplifiée' -> & { - affichage?: { - labelActions?: string; - label: string; - url: string; - }; -}; - -type Props = { - identifiantProjet: IdentifiantProjet.ValueType; - rôle: string; - règlesChangementPourAppelOffres: AppelOffre.RèglesDemandesChangement['fournisseur']; - aUnAbandonEnCours: boolean; - estAbandonné: boolean; - estAchevé: boolean; -}; - -export const getFournisseur = async ({ - identifiantProjet, - rôle, - règlesChangementPourAppelOffres, - aUnAbandonEnCours, - estAbandonné, - estAchevé, -}: Props): Promise => { - try { - const fournisseur = await mediator.send({ - type: 'Lauréat.Fournisseur.Query.ConsulterFournisseur', - data: { identifiantProjet: identifiantProjet.formatter() }, - }); - - if (Option.isSome(fournisseur)) { - const { fournisseurs, évaluationCarboneSimplifiée } = fournisseur; - - const { peutModifier, peutEnregistrerChangement } = - await checkAutorisationChangement<'fournisseur'>({ - rôle: Role.convertirEnValueType(rôle), - aUnAbandonEnCours, - estAbandonné, - estAchevé, - règlesChangementPourAppelOffres, - domain: 'fournisseur', - }); - - // règle spécifique à AOS, à rapatrier dans les règles métier présentes dans les AO si besoin - const estPetitPV = identifiantProjet.appelOffre === 'PPE2 - Petit PV Bâtiment'; - - const affichage = estPetitPV - ? undefined - : peutModifier - ? { - url: Routes.Fournisseur.modifier(identifiantProjet.formatter()), - label: 'Modifier', - labelActions: 'Modifier le fournisseur', - } - : peutEnregistrerChangement - ? { - url: Routes.Fournisseur.changement.enregistrer(identifiantProjet.formatter()), - label: 'Changer de fournisseur', - labelActions: 'Changer de fournisseur', - } - : undefined; - - return { - fournisseurs, - évaluationCarboneSimplifiée, - affichage, - }; - } - - return undefined; - } catch (error) { - getLogger().error(error); - return undefined; - } -}; diff --git "a/packages/applications/legacy/src/controllers/project/getProjectPage/_utils/getGarantiesFinanci\303\250res.ts" "b/packages/applications/legacy/src/controllers/project/getProjectPage/_utils/getGarantiesFinanci\303\250res.ts" deleted file mode 100644 index 452a0e346a5..00000000000 --- "a/packages/applications/legacy/src/controllers/project/getProjectPage/_utils/getGarantiesFinanci\303\250res.ts" +++ /dev/null @@ -1,79 +0,0 @@ -import { mediator } from 'mediateur'; -import { IdentifiantProjet, Lauréat } from '@potentiel-domain/projet'; - -import { Option } from '@potentiel-libraries/monads'; -import { getLogger } from '@potentiel-libraries/monitoring'; -import { Role } from '@potentiel-domain/utilisateur'; -import { GarantiesFinancièresProjetProps } from '../../../../views/pages/projectDetailsPage/sections'; - -const getMotifGfEnAttente = async ( - identifiantProjet: IdentifiantProjet.ValueType, - role: Role.ValueType, -) => { - if (!role.aLaPermission('garantiesFinancières.enAttente.consulter')) { - return undefined; - } - - const gfEnAttente = - await mediator.send({ - type: 'Lauréat.GarantiesFinancières.Query.ConsulterGarantiesFinancièresEnAttente', - data: { identifiantProjetValue: identifiantProjet.formatter() }, - }); - - return Option.isSome(gfEnAttente) ? gfEnAttente.motif.motif : undefined; -}; - -export const getGarantiesFinancières = async ( - identifiantProjet: IdentifiantProjet.ValueType, - role: Role.ValueType, - isSoumisAuxGF: boolean, -): Promise => { - try { - if (!isSoumisAuxGF || !role.aLaPermission('garantiesFinancières.dépôt.consulter')) { - return undefined; - } - - const garantiesFinancièresActuelles = - await mediator.send({ - type: 'Lauréat.GarantiesFinancières.Query.ConsulterGarantiesFinancières', - data: { identifiantProjetValue: identifiantProjet.formatter() }, - }); - - const dépôtEnCoursGarantiesFinancières = - await mediator.send({ - type: 'Lauréat.GarantiesFinancières.Query.ConsulterDépôtGarantiesFinancières', - data: { identifiantProjetValue: identifiantProjet.formatter() }, - }); - - const motifGfEnAttente = await getMotifGfEnAttente(identifiantProjet, role); - - const actuelles = Option.isSome(garantiesFinancièresActuelles) - ? { - ...garantiesFinancièresActuelles.garantiesFinancières.formatter(), - attestation: garantiesFinancièresActuelles.document?.formatter(), - } - : undefined; - - const dépôtÀTraiter = Option.isSome(dépôtEnCoursGarantiesFinancières) - ? { - ...dépôtEnCoursGarantiesFinancières.garantiesFinancières.formatter(), - dateConstitution: - dépôtEnCoursGarantiesFinancières.garantiesFinancières.constitution!.date.formatter(), - } - : undefined; - - return { - actuelles, - dépôtÀTraiter, - motifGfEnAttente, - }; - } catch (error) { - getLogger('Legacy|getProjectPage|getGarantiesFinancières').error( - `Impossible de consulter les garanties financières`, - { - identifiantProjet: identifiantProjet.formatter(), - }, - ); - return undefined; - } -}; diff --git a/packages/applications/legacy/src/controllers/project/getProjectPage/_utils/getInstallation.ts b/packages/applications/legacy/src/controllers/project/getProjectPage/_utils/getInstallation.ts deleted file mode 100644 index bc632732ca8..00000000000 --- a/packages/applications/legacy/src/controllers/project/getProjectPage/_utils/getInstallation.ts +++ /dev/null @@ -1,146 +0,0 @@ -import { Candidature, Lauréat } from '@potentiel-domain/projet'; - -import { Option } from '@potentiel-libraries/monads'; -import { Routes } from '@potentiel-applications/routes'; -import { Role } from '@potentiel-domain/utilisateur'; -import { getLogger } from '@potentiel-libraries/monitoring'; -import { IdentifiantProjet } from '@potentiel-domain/projet'; -import { mediator } from 'mediateur'; -import { AppelOffre } from '@potentiel-domain/appel-offre'; - -export type GetInstallationForProjectPage = { - installateur?: { - value: string; - affichage?: { - labelActions?: string; - label: string; - url: string; - }; - }; - typologieInstallation?: { - value: Candidature.TypologieInstallation.RawType[]; - affichage?: { - labelActions?: string; - label: string; - url: string; - }; - }; - dispositifDeStockage?: { - value?: Lauréat.Installation.DispositifDeStockage.RawType; - affichage?: { - labelActions?: string; - label: string; - url: string; - }; - }; -}; - -type Props = { - identifiantProjet: IdentifiantProjet.ValueType; - rôle: string; - champsSupplémentairesCahierDesCharges: AppelOffre.ChampsSupplémentairesCandidature; - règlesChangementInstallateur: AppelOffre.RèglesDemandesChangement['installateur']; - aUnAbandonEnCours: boolean; - estAbandonné: boolean; - estAchevé: boolean; -}; - -export const getInstallation = async ({ - identifiantProjet, - rôle, - champsSupplémentairesCahierDesCharges, - règlesChangementInstallateur, - aUnAbandonEnCours, - estAbandonné, - estAchevé, -}: Props): Promise => { - try { - const role = Role.convertirEnValueType(rôle); - - const installationProjection = - await mediator.send({ - type: 'Lauréat.Installation.Query.ConsulterInstallation', - data: { identifiantProjet: identifiantProjet.formatter() }, - }); - - if (Option.isSome(installationProjection)) { - const { installateur, typologieInstallation, dispositifDeStockage } = installationProjection; - const { - installateur: champSupplémentaireInstallateur, - dispositifDeStockage: champSupplémentaireDispositifDeStockage, - typologieInstallation: champSupplémentaireTypologieInstallation, - } = champsSupplémentairesCahierDesCharges; - - const data: GetInstallationForProjectPage = {}; - - // TYPOLOGIE INSTALLATION - if (champSupplémentaireTypologieInstallation) { - data.typologieInstallation = { - value: typologieInstallation.map((typologie) => typologie.formatter()), - }; - if (role.aLaPermission('installation.typologieInstallation.modifier')) { - data.typologieInstallation.affichage = { - url: Routes.Installation.modifierTypologie(identifiantProjet.formatter()), - label: 'Modifier', - labelActions: 'Modifier la typologie du projet', - }; - } - } - - // DISPOSITIF DE STOCKAGE - if (champSupplémentaireDispositifDeStockage) { - data.dispositifDeStockage = { - value: dispositifDeStockage ? dispositifDeStockage.formatter() : undefined, - }; - if (role.aLaPermission('installation.dispositifDeStockage.modifier')) { - data.dispositifDeStockage.affichage = { - url: Routes.Installation.modifierDispositifDeStockage(identifiantProjet.formatter()), - label: 'Modifier', - labelActions: 'Modifier le dispositif de stockage', - }; - } else if (role.aLaPermission('installation.dispositifDeStockage.enregistrerChangement')) { - data.dispositifDeStockage.affichage = { - url: Routes.Installation.changement.dispositifDeStockage.enregistrer( - identifiantProjet.formatter(), - ), - label: 'Changer le dispositif de stockage', - labelActions: 'Changer le dispositif de stockage', - }; - } - } - - //INSTALLATEUR - if (champSupplémentaireInstallateur) { - data.installateur = { value: installateur }; - if (role.aLaPermission('installation.installateur.modifier')) { - data.installateur.affichage = { - url: Routes.Installation.modifierInstallateur(identifiantProjet.formatter()), - label: 'Modifier', - labelActions: "Modifier l'installateur", - }; - } else if ( - role.aLaPermission('installation.installateur.enregistrerChangement') && - !aUnAbandonEnCours && - !estAbandonné && - !estAchevé && - règlesChangementInstallateur.informationEnregistrée - ) { - data.installateur.affichage = { - url: Routes.Installation.changement.installateur.enregistrer( - identifiantProjet.formatter(), - ), - label: "Changer l'installateur", - labelActions: "Changer l'installateur", - }; - } - } - - return data; - } - - return undefined; - } catch (error) { - getLogger().error(error); - return undefined; - } -}; diff --git a/packages/applications/legacy/src/controllers/project/getProjectPage/_utils/getNatureDeLExploitation.ts b/packages/applications/legacy/src/controllers/project/getProjectPage/_utils/getNatureDeLExploitation.ts deleted file mode 100644 index e8ceeb3402d..00000000000 --- a/packages/applications/legacy/src/controllers/project/getProjectPage/_utils/getNatureDeLExploitation.ts +++ /dev/null @@ -1,91 +0,0 @@ -import { Lauréat } from '@potentiel-domain/projet'; - -import { Option } from '@potentiel-libraries/monads'; -import { Routes } from '@potentiel-applications/routes'; -import { Role } from '@potentiel-domain/utilisateur'; -import { getLogger } from '@potentiel-libraries/monitoring'; -import { IdentifiantProjet } from '@potentiel-domain/projet'; -import { mediator } from 'mediateur'; -import { AppelOffre } from '@potentiel-domain/appel-offre'; -import { checkAutorisationChangement } from './checkLauréat/checkAutorisationChangement'; - -export type GetNatureDeLExploitationForProjectPage = { - natureDeLExploitation: { - type: Lauréat.NatureDeLExploitation.TypeDeNatureDeLExploitation.RawType; - taux?: number; - }; - affichage?: { - labelActions?: string; - label: string; - url: string; - }; -}; - -type Props = { - identifiantProjet: IdentifiantProjet.ValueType; - rôle: string; - règlesChangementPourAppelOffres: AppelOffre.RèglesDemandesChangement['natureDeLExploitation']; - aUnAbandonEnCours: boolean; - estAbandonné: boolean; - estAchevé: boolean; -}; - -export const getNatureDeLExploitation = async ({ - identifiantProjet, - rôle, - règlesChangementPourAppelOffres, - aUnAbandonEnCours, - estAbandonné, - estAchevé, -}: Props): Promise => { - try { - const projection = - await mediator.send({ - type: 'Lauréat.NatureDeLExploitation.Query.ConsulterNatureDeLExploitation', - data: { identifiantProjet: identifiantProjet.formatter() }, - }); - - if (Option.isSome(projection)) { - const natureDeLExploitation = { - type: projection.natureDeLExploitation.typeNatureDeLExploitation.formatter(), - taux: projection.natureDeLExploitation.tauxPrévisionnelACI, - }; - - const { peutModifier, peutEnregistrerChangement } = - await checkAutorisationChangement<'natureDeLExploitation'>({ - rôle: Role.convertirEnValueType(rôle), - aUnAbandonEnCours, - estAbandonné, - estAchevé, - règlesChangementPourAppelOffres, - domain: 'natureDeLExploitation', - }); - - const affichage = peutModifier - ? { - url: Routes.NatureDeLExploitation.modifier(identifiantProjet.formatter()), - label: 'Modifier', - labelActions: "Modifier la nature de l'exploitation", - } - : peutEnregistrerChangement - ? { - url: Routes.NatureDeLExploitation.changement.enregistrer( - identifiantProjet.formatter(), - ), - label: "Changer la nature de l'exploitation", - labelActions: "Changer la nature de l'exploitation", - } - : undefined; - - return { - natureDeLExploitation, - affichage, - }; - } - - return undefined; - } catch (error) { - getLogger().error(error); - return undefined; - } -}; diff --git a/packages/applications/legacy/src/controllers/project/getProjectPage/_utils/getNomProjet.ts b/packages/applications/legacy/src/controllers/project/getProjectPage/_utils/getNomProjet.ts deleted file mode 100644 index 4b61492b7c8..00000000000 --- a/packages/applications/legacy/src/controllers/project/getProjectPage/_utils/getNomProjet.ts +++ /dev/null @@ -1,65 +0,0 @@ -import { Routes } from '@potentiel-applications/routes'; -import { IdentifiantProjet } from '@potentiel-domain/projet'; -import { Role } from '@potentiel-domain/utilisateur'; -import { ProjectDataForProjectPage } from '../../../../modules/project'; -import { checkAutorisationChangement } from './checkLauréat/checkAutorisationChangement'; -import { AppelOffre } from '@potentiel-domain/appel-offre'; - -export type GetNomProjetForProjectPage = { - nom: string; - affichage?: { - labelActions: string; - label: string; - url: string; - }; -}; - -type Props = { - identifiantProjet: IdentifiantProjet.ValueType; - rôle: Role.ValueType; - project: ProjectDataForProjectPage; - règlesChangementPourAppelOffres: AppelOffre.RèglesDemandesChangement['nomProjet']; - aUnAbandonEnCours: boolean; - estAbandonné: boolean; - estAchevé: boolean; -}; - -export const getNomProjet = async ({ - identifiantProjet, - rôle, - project, - règlesChangementPourAppelOffres, - aUnAbandonEnCours, - estAbandonné, - estAchevé, -}: Props): Promise => { - const { peutEnregistrerChangement, peutModifier } = await checkAutorisationChangement({ - rôle, - aUnAbandonEnCours, - estAbandonné, - estAchevé, - règlesChangementPourAppelOffres, - domain: 'nomProjet', - }); - - // règle spécifique à AOS, à rapatrier dans les règles métier présentes dans les AO - const estPetitPV = identifiantProjet.appelOffre === 'PPE2 - Petit PV Bâtiment'; - - return { - nom: project.nomProjet, - affichage: - estPetitPV && peutModifier - ? { - url: Routes.Lauréat.modifierNomProjet(identifiantProjet.formatter()), - label: 'Modifier', - labelActions: 'Modifier le nom du projet', - } - : peutEnregistrerChangement - ? { - url: Routes.Lauréat.changement.nomProjet.enregistrer(identifiantProjet.formatter()), - label: 'Changer le nom du projet', - labelActions: 'Changer le nom du projet', - } - : undefined, - }; -}; diff --git a/packages/applications/legacy/src/controllers/project/getProjectPage/_utils/getProducteur.ts b/packages/applications/legacy/src/controllers/project/getProjectPage/_utils/getProducteur.ts deleted file mode 100644 index db47da4fd6a..00000000000 --- a/packages/applications/legacy/src/controllers/project/getProjectPage/_utils/getProducteur.ts +++ /dev/null @@ -1,82 +0,0 @@ -import { Lauréat } from '@potentiel-domain/projet'; - -import { Option } from '@potentiel-libraries/monads'; -import { Routes } from '@potentiel-applications/routes'; -import { Role } from '@potentiel-domain/utilisateur'; -import { getLogger } from '@potentiel-libraries/monitoring'; -import { IdentifiantProjet } from '@potentiel-domain/projet'; -import { mediator } from 'mediateur'; -import { checkAutorisationChangement } from './checkLauréat/checkAutorisationChangement'; -import { AppelOffre } from '@potentiel-domain/appel-offre'; - -export type GetProducteurForProjectPage = { - producteur: string; - affichage?: { - labelActions?: string; - label: string; - url: string; - }; -}; - -type Props = { - identifiantProjet: IdentifiantProjet.ValueType; - rôle: string; - règlesChangementPourAppelOffres: AppelOffre.RèglesDemandesChangement['producteur']; - aUnAbandonEnCours: boolean; - estAbandonné: boolean; - estAchevé: boolean; -}; - -export const getProducteur = async ({ - identifiantProjet, - rôle, - règlesChangementPourAppelOffres, - aUnAbandonEnCours, - estAbandonné, - estAchevé, -}: Props): Promise => { - try { - const producteurProjection = await mediator.send({ - type: 'Lauréat.Producteur.Query.ConsulterProducteur', - data: { identifiantProjet: identifiantProjet.formatter() }, - }); - - if (Option.isSome(producteurProjection)) { - const { producteur } = producteurProjection; - - const { peutModifier, peutEnregistrerChangement } = - await checkAutorisationChangement<'producteur'>({ - rôle: Role.convertirEnValueType(rôle), - aUnAbandonEnCours, - estAbandonné, - estAchevé, - règlesChangementPourAppelOffres, - domain: 'producteur', - }); - - const affichage = peutModifier - ? { - url: Routes.Producteur.modifier(identifiantProjet.formatter()), - label: 'Modifier', - labelActions: 'Modifier le producteur', - } - : peutEnregistrerChangement - ? { - url: Routes.Producteur.changement.enregistrer(identifiantProjet.formatter()), - label: 'Changer de producteur', - labelActions: 'Changer de producteur', - } - : undefined; - - return { - producteur, - affichage, - }; - } - - return undefined; - } catch (error) { - getLogger().error(error); - return undefined; - } -}; diff --git a/packages/applications/legacy/src/controllers/project/getProjectPage/_utils/getPuissance.ts b/packages/applications/legacy/src/controllers/project/getProjectPage/_utils/getPuissance.ts deleted file mode 100644 index 9a9f97849ce..00000000000 --- a/packages/applications/legacy/src/controllers/project/getProjectPage/_utils/getPuissance.ts +++ /dev/null @@ -1,103 +0,0 @@ -import { Lauréat } from '@potentiel-domain/projet'; - -import { Option } from '@potentiel-libraries/monads'; -import { Routes } from '@potentiel-applications/routes'; -import { Role } from '@potentiel-domain/utilisateur'; -import { getLogger } from '@potentiel-libraries/monitoring'; -import { IdentifiantProjet } from '@potentiel-domain/projet'; -import { mediator } from 'mediateur'; -import { AppelOffre } from '@potentiel-domain/appel-offre'; -import { checkAutorisationChangement } from './checkLauréat/checkAutorisationChangement'; - -export type GetPuissanceForProjectPage = { - puissance: number; - puissanceDeSite?: number; - affichage?: { - labelActions?: string; - label: string; - url: string; - }; -}; - -type Props = { - identifiantProjet: IdentifiantProjet.ValueType; - rôle: string; - règlesChangementPourAppelOffres: AppelOffre.RèglesDemandesChangement['puissance']; - aUnAbandonEnCours: boolean; - estAbandonné: boolean; - estAchevé: boolean; -}; - -export const getPuissance = async ({ - identifiantProjet, - rôle, - règlesChangementPourAppelOffres, - aUnAbandonEnCours, - estAbandonné, - estAchevé, -}: Props): Promise => { - try { - const role = Role.convertirEnValueType(rôle); - - const puissanceProjection = await mediator.send({ - type: 'Lauréat.Puissance.Query.ConsulterPuissance', - data: { identifiantProjet: identifiantProjet.formatter() }, - }); - - if (Option.isSome(puissanceProjection)) { - const { puissance, dateDemandeEnCours, puissanceDeSite } = puissanceProjection; - - if (dateDemandeEnCours) { - return { - puissance, - puissanceDeSite, - affichage: role.aLaPermission('puissance.consulterChangement') - ? { - url: Routes.Puissance.changement.détails( - identifiantProjet.formatter(), - dateDemandeEnCours.formatter(), - ), - label: 'Voir la demande de modification', - labelActions: 'Demande de modification de puissance', - } - : undefined, - }; - } - - const { peutModifier, peutFaireUneDemandeDeChangement } = - await checkAutorisationChangement<'puissance'>({ - rôle: Role.convertirEnValueType(rôle), - aUnAbandonEnCours, - estAbandonné, - estAchevé, - règlesChangementPourAppelOffres, - domain: 'puissance', - }); - - const affichage = peutModifier - ? { - url: Routes.Puissance.modifier(identifiantProjet.formatter()), - label: 'Modifier', - labelActions: 'Modifier la puissance', - } - : peutFaireUneDemandeDeChangement - ? { - url: Routes.Puissance.changement.demander(identifiantProjet.formatter()), - label: 'Changer de puissance', - labelActions: 'Changer de puissance', - } - : undefined; - - return { - puissance, - puissanceDeSite, - affichage, - }; - } - - return undefined; - } catch (error) { - getLogger().error(error); - return undefined; - } -}; diff --git a/packages/applications/legacy/src/controllers/project/getProjectPage/_utils/getRaccordement.ts b/packages/applications/legacy/src/controllers/project/getProjectPage/_utils/getRaccordement.ts deleted file mode 100644 index 00ce3f92134..00000000000 --- a/packages/applications/legacy/src/controllers/project/getProjectPage/_utils/getRaccordement.ts +++ /dev/null @@ -1,79 +0,0 @@ -import { mediator } from 'mediateur'; - -import { IdentifiantProjet } from '@potentiel-domain/projet'; -import { Option } from '@potentiel-libraries/monads'; - -import { Role } from '@potentiel-domain/utilisateur'; -import { Routes } from '@potentiel-applications/routes'; -import { mapToPlainObject, PlainType } from '@potentiel-domain/core'; -import { Lauréat } from '@potentiel-domain/projet'; - -type GetRaccordementProps = { - role: Role.ValueType; - identifiantProjet: IdentifiantProjet.ValueType; - estAbandonné: boolean; - aUnAbandonEnCours: boolean; -}; - -export type GetRaccordementForProjectPage = { - raccordement: Option.Type>; - affichage?: { - label: string; - url?: string; - }; -}; - -export const getRaccordement = async ({ - role, - identifiantProjet, - aUnAbandonEnCours, - estAbandonné, -}: GetRaccordementProps): Promise => { - if (!role.aLaPermission('raccordement.consulter')) { - return { - raccordement: Option.none, - }; - } - - const raccordement = await mediator.send({ - type: 'Lauréat.Raccordement.Query.ConsulterRaccordement', - data: { identifiantProjetValue: identifiantProjet.formatter() }, - }); - - if ( - Option.isNone(raccordement) || - raccordement.dossiers.length === 0 || - raccordement.dossiers[0].référence.estÉgaleÀ( - Lauréat.Raccordement.RéférenceDossierRaccordement.référenceNonTransmise, - ) - ) { - return { - raccordement: Option.none, - affichage: estAbandonné - ? { - label: 'Aucun raccordement pour ce projet', - } - : aUnAbandonEnCours - ? { - label: - "Impossible de renseigner ce raccordement car une demande d'abandon est en cours", - } - : role.aLaPermission('raccordement.demande-complète-raccordement.transmettre') - ? { - label: 'Renseigner les données de raccordement', - url: Routes.Raccordement.détail(identifiantProjet.formatter()), - } - : undefined, - }; - } - - return { - raccordement: mapToPlainObject(raccordement), - affichage: { - label: role.aLaPermission('raccordement.gestionnaire.modifier') - ? 'Consulter ou modifier les documents' - : 'Consulter les documents', - url: Routes.Raccordement.détail(identifiantProjet.formatter()), - }, - }; -}; diff --git a/packages/applications/legacy/src/controllers/project/getProjectPage/_utils/getRecours.ts b/packages/applications/legacy/src/controllers/project/getProjectPage/_utils/getRecours.ts deleted file mode 100644 index 5c040bbc216..00000000000 --- a/packages/applications/legacy/src/controllers/project/getProjectPage/_utils/getRecours.ts +++ /dev/null @@ -1,30 +0,0 @@ -import { mediator } from 'mediateur'; -import { IdentifiantProjet } from '@potentiel-domain/projet'; -import { Éliminé } from '@potentiel-domain/projet'; - -import { Option } from '@potentiel-libraries/monads'; -import { getLogger } from '@potentiel-libraries/monitoring'; - -export const getRecours = async ( - identifiantProjet: IdentifiantProjet.ValueType, -): Promise<Éliminé.Recours.ConsulterRecoursReadModel | undefined> => { - try { - const recours = await mediator.send<Éliminé.Recours.ConsulterRecoursQuery>({ - type: 'Éliminé.Recours.Query.ConsulterRecours', - data: { - identifiantProjetValue: identifiantProjet.formatter(), - }, - }); - - if (Option.isNone(recours)) { - return undefined; - } - - return recours; - } catch (error) { - getLogger('Legacy|getProjectPage|getRecours').error(`Impossible de consulter le recours`, { - identifiantProjet: identifiantProjet.formatter(), - }); - return undefined; - } -}; diff --git "a/packages/applications/legacy/src/controllers/project/getProjectPage/_utils/getRepr\303\251sentantL\303\251gal.ts" "b/packages/applications/legacy/src/controllers/project/getProjectPage/_utils/getRepr\303\251sentantL\303\251gal.ts" deleted file mode 100644 index e8d68e1a95e..00000000000 --- "a/packages/applications/legacy/src/controllers/project/getProjectPage/_utils/getRepr\303\251sentantL\303\251gal.ts" +++ /dev/null @@ -1,111 +0,0 @@ -import { mediator } from 'mediateur'; -import { IdentifiantProjet } from '@potentiel-domain/projet'; - -import { Option } from '@potentiel-libraries/monads'; -import { Lauréat } from '@potentiel-domain/projet'; -import { Routes } from '@potentiel-applications/routes'; -import { Role } from '@potentiel-domain/utilisateur'; -import { getLogger } from '@potentiel-libraries/monitoring'; -import { AppelOffre } from '@potentiel-domain/appel-offre'; -import { checkAutorisationChangement } from './checkLauréat/checkAutorisationChangement'; - -export type GetReprésentantLégalForProjectPage = { - nom: string; - affichage?: { - labelActions?: string; - label: string; - url: string; - }; -}; - -type Props = { - identifiantProjet: IdentifiantProjet.ValueType; - rôle: string; - règlesChangementPourAppelOffres: AppelOffre.RèglesDemandesChangement['représentantLégal']; - aUnAbandonEnCours: boolean; - estAbandonné: boolean; - estAchevé: boolean; -}; - -export const getReprésentantLégal = async ({ - identifiantProjet, - rôle, - règlesChangementPourAppelOffres, - aUnAbandonEnCours, - estAbandonné, - estAchevé, -}: Props): Promise => { - try { - const utilisateur = Role.convertirEnValueType(rôle); - - const représentantLégal = - await mediator.send({ - type: 'Lauréat.ReprésentantLégal.Query.ConsulterReprésentantLégal', - data: { identifiantProjet: identifiantProjet.formatter() }, - }); - - if (Option.isSome(représentantLégal)) { - const demandeEnCours = - await mediator.send( - { - type: 'Lauréat.ReprésentantLégal.Query.ConsulterChangementReprésentantLégalEnCours', - data: { - identifiantProjet: identifiantProjet.formatter(), - }, - }, - ); - - if (Option.isSome(demandeEnCours)) { - return { - nom: représentantLégal.nomReprésentantLégal, - affichage: utilisateur.aLaPermission('représentantLégal.consulterChangement') - ? { - url: Routes.ReprésentantLégal.changement.détails( - identifiantProjet.formatter(), - demandeEnCours.demandéLe.formatter(), - ), - label: 'Voir la demande de modification', - labelActions: 'Demande de modification de représentant légal', - } - : undefined, - }; - } - - const { peutModifier, peutFaireUneDemandeDeChangement, peutEnregistrerChangement } = - await checkAutorisationChangement<'représentantLégal'>({ - rôle: Role.convertirEnValueType(rôle), - aUnAbandonEnCours, - estAbandonné, - estAchevé, - règlesChangementPourAppelOffres, - domain: 'représentantLégal', - }); - - const affichage = peutModifier - ? { - url: Routes.ReprésentantLégal.modifier(identifiantProjet.formatter()), - label: 'Modifier', - labelActions: 'Modifier le représentant légal', - } - : peutFaireUneDemandeDeChangement || peutEnregistrerChangement - ? { - url: peutFaireUneDemandeDeChangement - ? Routes.ReprésentantLégal.changement.demander(identifiantProjet.formatter()) - : Routes.ReprésentantLégal.changement.enregistrer(identifiantProjet.formatter()), - label: 'Changer de représentant légal', - labelActions: 'Changer de représentant légal', - } - : undefined; - - return { - nom: représentantLégal.nomReprésentantLégal, - affichage, - }; - } - - return undefined; - } catch (error) { - getLogger('Legacy|getProjectPage|getReprésentantLégal').error(error); - return undefined; - } -}; diff --git a/packages/applications/legacy/src/controllers/project/getProjectPage/_utils/getSiteDeProduction.ts b/packages/applications/legacy/src/controllers/project/getProjectPage/_utils/getSiteDeProduction.ts deleted file mode 100644 index d784ec9d49e..00000000000 --- a/packages/applications/legacy/src/controllers/project/getProjectPage/_utils/getSiteDeProduction.ts +++ /dev/null @@ -1,42 +0,0 @@ -import { Project } from '../../../../entities'; -import { Routes } from '@potentiel-applications/routes'; -import { Candidature, IdentifiantProjet } from '@potentiel-domain/projet'; -import { Role } from '@potentiel-domain/utilisateur'; -import { ProjectDataForProjectPage } from '../../../../modules/project'; - -export type GetSiteDeProductionForProjectPage = { - localité: Candidature.Localité.RawType; - affichage?: { - labelActions: string; - label: string; - url: string; - }; -}; - -type Props = { - identifiantProjet: IdentifiantProjet.ValueType; - rôle: Role.ValueType; - project: ProjectDataForProjectPage; -}; - -export const getSiteDeProduction = ({ - identifiantProjet, - rôle, - project, -}: Props): GetSiteDeProductionForProjectPage => ({ - localité: { - adresse1: project.adresseProjet.split('\n')[0] || '', - adresse2: project.adresseProjet.split('\n')[1], - codePostal: project.codePostalProjet, - commune: project.communeProjet, - département: project.departementProjet, - région: project.regionProjet, - }, - affichage: rôle.aLaPermission('lauréat.modifierSiteDeProduction') - ? { - url: Routes.Lauréat.modifierSiteDeProduction(identifiantProjet.formatter()), - label: 'Modifier', - labelActions: 'Modifier le site de production', - } - : undefined, -}); diff --git a/packages/applications/legacy/src/controllers/project/getProjectPage/_utils/index.ts b/packages/applications/legacy/src/controllers/project/getProjectPage/_utils/index.ts deleted file mode 100644 index 2188c313f45..00000000000 --- a/packages/applications/legacy/src/controllers/project/getProjectPage/_utils/index.ts +++ /dev/null @@ -1,14 +0,0 @@ -export * from './getAbandon'; -export * from './getAlertesRaccordement'; -export * from './getAttestationDeConformité'; -export * from './getDateAchèvementPrévisionnel'; -export * from './getGarantiesFinancières'; -export * from './getReprésentantLégal'; -export * from './getActionnaire'; -export * from './getRecours'; -export * from './getRaccordement'; -export * from './getProducteur'; -export * from './getFournisseur'; -export * from './getInstallation'; -export * from './getNatureDeLExploitation'; -export * from './getSiteDeProduction'; diff --git a/packages/applications/legacy/src/controllers/project/getProjectPage/index.ts b/packages/applications/legacy/src/controllers/project/getProjectPage/index.ts deleted file mode 100644 index 6223edf2633..00000000000 --- a/packages/applications/legacy/src/controllers/project/getProjectPage/index.ts +++ /dev/null @@ -1,370 +0,0 @@ -import * as yup from 'yup'; -import { getProjectDataForProjectPage } from '../../../config/queries.config'; -import { shouldUserAccessProject } from '../../../config/useCases.config'; -import { Project } from '../../../infra/sequelize'; -import { PermissionConsulterProjet } from '../../../modules/project'; -import routes from '../../../routes'; -import { ProjectDetailsPage } from '../../../views'; -import { - miseAJourStatistiquesUtilisation, - notFoundResponse, - unauthorizedResponse, - vérifierPermissionUtilisateur, -} from '../../helpers'; -import safeAsyncHandler from '../../helpers/safeAsyncHandler'; -import { v1Router } from '../../v1Router'; - -import { logger } from '../../../core/utils'; -import { addQueryParams } from '../../../helpers/addQueryParams'; - -import { - getAbandon, - getAlertesRaccordement, - getAttestationDeConformité, - getGarantiesFinancières, - getReprésentantLégal, - getRecours, - getRaccordement, - getActionnaire, - getDateAchèvementPrévisionnel, - getNatureDeLExploitation, - getSiteDeProduction, -} from './_utils'; -import { Role } from '@potentiel-domain/utilisateur'; -import { getPuissance } from './_utils/getPuissance'; -import { getProducteur } from './_utils/getProducteur'; -import { getFournisseur } from './_utils/getFournisseur'; -import { Candidature, IdentifiantProjet, Lauréat } from '@potentiel-domain/projet'; -import { Routes } from '@potentiel-applications/routes'; -import { mediator } from 'mediateur'; -import { mapToPlainObject } from '@potentiel-domain/core'; -import { Option } from '@potentiel-libraries/monads'; -import { getDélai } from './_utils/getDélai'; -import { getInstallation } from './_utils/getInstallation'; -import { getNomProjet } from './_utils/getNomProjet'; - -const schema = yup.object({ - params: yup.object({ projectId: yup.string().required() }), -}); - -export const estUnIdentifiantProjet = (value: string): value is IdentifiantProjet.RawType => { - const [appelOffre, période, famille, numéroCRE] = decodeURIComponent(value).split('#'); - - return ( - typeof appelOffre === 'string' && - typeof numéroCRE === 'string' && - typeof période === 'string' && - typeof famille === 'string' - ); -}; - -const getIdentifiantProjet = async (identifiantProjet: IdentifiantProjet.RawType) => { - const identifiantProjetValueType = IdentifiantProjet.convertirEnValueType( - decodeURIComponent(identifiantProjet), - ); - const projetLegacy = await Project.findOne({ - where: { - appelOffreId: identifiantProjetValueType.appelOffre, - periodeId: identifiantProjetValueType.période, - familleId: identifiantProjetValueType.famille ?? '', - numeroCRE: identifiantProjetValueType.numéroCRE, - }, - attributes: ['id'], - }); - - return projetLegacy?.id; -}; - -v1Router.get( - routes.PROJECT_DETAILS(), - vérifierPermissionUtilisateur(PermissionConsulterProjet), - safeAsyncHandler( - { - schema, - onError: ({ request, response, error }) => { - logger.warning(`Error in project details handler`, { - errorName: error?.name, - errorMessage: error?.message, - errorStackTrace: error?.stack, - }); - return notFoundResponse({ request, response, ressourceTitle: 'Projet' }); - }, - }, - async (request, response) => { - const { user, query } = request; - const role = Role.convertirEnValueType(user.role); - - const projectId = request.params.projectId; - - if (!projectId) { - return notFoundResponse({ request, response, ressourceTitle: 'Projet' }); - } - - if (estUnIdentifiantProjet(projectId)) { - const legacyId = await getIdentifiantProjet(projectId); - - if (!legacyId) { - return notFoundResponse({ request, response, ressourceTitle: 'Projet' }); - } - - return response.redirect(addQueryParams(routes.PROJECT_DETAILS(legacyId), query)); - } - - const userHasRightsToProject = await shouldUserAccessProject.check({ - user, - projectId, - }); - - if (!userHasRightsToProject) { - return unauthorizedResponse({ - request, - response, - customMessage: `Votre compte ne vous permet pas d'accéder à ce projet.`, - }); - } - - const rawProjet = await getProjectDataForProjectPage({ projectId, user }); - - if (rawProjet.isErr()) { - logger.warning(`Error in getProjectDataForProjectPage`, { - errorName: rawProjet.error?.name, - errorMessage: rawProjet.error?.message, - errorStackTrace: rawProjet.error?.stack, - }); - return notFoundResponse({ request, response, ressourceTitle: 'Projet' }); - } - - const project = rawProjet.value; - - const identifiantProjetValueType = IdentifiantProjet.convertirEnValueType( - `${project.appelOffreId}#${project.periodeId}#${project.familleId}#${project.numeroCRE}`, - ); - - /** - * Redirection vers la page de candidature si le projet n'est pas désigné - */ - if (!project.notifiedOn) { - if (role.aLaPermission('candidature.consulter')) { - return response.redirect( - Routes.Candidature.détails(identifiantProjetValueType.formatter()), - ); - } - - return notFoundResponse({ request, response, ressourceTitle: 'Projet' }); - } - - /** - * Redirection vers la page éliminé dans la nouvelle application - */ - if (!project.isClasse) { - return response.redirect(Routes.Éliminé.détails(identifiantProjetValueType.formatter())); - } - - const lauréat = await mediator.send({ - type: 'Lauréat.Query.ConsulterLauréat', - data: { identifiantProjet: identifiantProjetValueType.formatter() }, - }); - - const cahierDesCharges = await mediator.send({ - type: 'Lauréat.CahierDesCharges.Query.ConsulterCahierDesCharges', - data: { - identifiantProjetValue: identifiantProjetValueType.formatter(), - }, - }); - - if (Option.isNone(lauréat) || Option.isNone(cahierDesCharges)) { - return notFoundResponse({ request, response, ressourceTitle: 'Projet' }); - } - - const achèvement = await mediator.send({ - type: 'Lauréat.Achèvement.Query.ConsulterAchèvement', - data: { identifiantProjetValue: identifiantProjetValueType.formatter() }, - }); - - if (Option.isNone(achèvement)) { - return notFoundResponse({ request, response, ressourceTitle: 'Projet' }); - } - - const achèvementRéel = achèvement.estAchevé - ? { - date: achèvement.dateAchèvementRéel.date.getTime(), - attestationConformité: achèvement.attestation.formatter(), - preuveTransmissionAuCocontractant: Option.isSome( - achèvement.preuveTransmissionAuCocontractant, - ) - ? achèvement.preuveTransmissionAuCocontractant.formatter() - : undefined, - } - : undefined; - - const dateAchèvementPrévisionnel = - achèvement.dateAchèvementPrévisionnel.dateTime.date.getTime(); - - const abandon = await getAbandon(identifiantProjetValueType); - const aUnAbandonEnCours = !!abandon?.demandeEnCours; - const estAbandonné = !!abandon?.estAbandonné; - - const raccordement = await getRaccordement({ - role, - identifiantProjet: identifiantProjetValueType, - aUnAbandonEnCours, - estAbandonné, - }); - - const alertesRaccordement = - project.notifiedOn && project.isClasse && !project.isAbandoned && role.estPorteur() - ? await getAlertesRaccordement({ - raccordement: raccordement.raccordement, - identifiantProjet: identifiantProjetValueType, - CDC2022Choisi: - project.cahierDesChargesActuel.type === 'modifié' && - project.cahierDesChargesActuel.paruLe === '30/08/2022', - }) - : []; - - miseAJourStatistiquesUtilisation({ - type: 'projetConsulté', - données: { - utilisateur: { role: user.role }, - projet: { - appelOffreId: project.appelOffreId, - periodeId: project.periodeId, - ...(project.familleId && { familleId: project.familleId }), - numéroCRE: project.numeroCRE, - }, - }, - }); - - const garantiesFinancières = await getGarantiesFinancières( - identifiantProjetValueType, - role, - cahierDesCharges.estSoumisAuxGarantiesFinancières(), - ); - - const instructionChangementActionnaire = - Lauréat.Actionnaire.InstructionChangementActionnaire.bind({ - aDesGarantiesFinancièresConstituées: !!garantiesFinancières?.actuelles, - aUnDépotEnCours: !!garantiesFinancières?.dépôtÀTraiter, - typeActionnariat: project.isFinancementParticipatif - ? Candidature.TypeActionnariat.financementParticipatif - : project.isInvestissementParticipatif - ? Candidature.TypeActionnariat.investissementParticipatif - : undefined, - }); - - const nécessiteInstructionPourActionnaire = !!( - role.estPorteur() && - cahierDesCharges.getRèglesChangements('actionnaire').demande && - instructionChangementActionnaire.estRequise() - ); - - const recours = await getRecours(identifiantProjetValueType); - - return response.send( - ProjectDetailsPage({ - request, - project, - raccordement, - alertesRaccordement, - abandon: abandon && mapToPlainObject(abandon), - garantiesFinancières, - représentantLégal: await getReprésentantLégal({ - identifiantProjet: identifiantProjetValueType, - rôle: user.role, - règlesChangementPourAppelOffres: - cahierDesCharges.getRèglesChangements('représentantLégal'), - aUnAbandonEnCours, - estAbandonné, - estAchevé: !!achèvementRéel, - }), - demandeRecours: recours && mapToPlainObject(recours), - actionnaire: await getActionnaire({ - identifiantProjet: identifiantProjetValueType, - rôle: user.role, - nécessiteInstruction: nécessiteInstructionPourActionnaire, - règlesChangementPourAppelOffres: cahierDesCharges.getRèglesChangements('actionnaire'), - aUnAbandonEnCours, - estAbandonné, - estAchevé: !!achèvementRéel, - }), - puissance: await getPuissance({ - identifiantProjet: identifiantProjetValueType, - rôle: user.role, - règlesChangementPourAppelOffres: cahierDesCharges.getRèglesChangements('puissance'), - aUnAbandonEnCours, - estAbandonné, - estAchevé: !!achèvementRéel, - }), - producteur: await getProducteur({ - identifiantProjet: identifiantProjetValueType, - rôle: user.role, - règlesChangementPourAppelOffres: cahierDesCharges.getRèglesChangements('producteur'), - aUnAbandonEnCours, - estAbandonné, - estAchevé: !!achèvementRéel, - }), - emailContact: lauréat.emailContact.formatter(), - achèvementRéel, - dateAchèvementPrévisionnel, - modificationsNonPermisesParLeCDCActuel: - cahierDesCharges.doitChoisirUnCahierDesChargesModificatif(), - coefficientKChoisi: lauréat.coefficientKChoisi, - fournisseur: await getFournisseur({ - identifiantProjet: identifiantProjetValueType, - rôle: user.role, - règlesChangementPourAppelOffres: cahierDesCharges.getRèglesChangements('fournisseur'), - aUnAbandonEnCours, - estAbandonné, - estAchevé: !!achèvementRéel, - }), - délai: await getDélai({ - identifiantProjet: identifiantProjetValueType, - identifiantUtilisateur: user.email, - rôle: user.role, - règlesChangementPourAppelOffres: cahierDesCharges.getRèglesChangements('délai'), - aUnAbandonEnCours, - estAbandonné, - estAchevé: !!achèvementRéel, - }), - autorisationDUrbanisme: - cahierDesCharges.getChampsSupplémentaires().autorisationDUrbanisme && - lauréat.autorisationDUrbanisme, - installation: await getInstallation({ - identifiantProjet: identifiantProjetValueType, - rôle: user.role, - champsSupplémentairesCahierDesCharges: cahierDesCharges.getChampsSupplémentaires(), - règlesChangementInstallateur: cahierDesCharges.getRèglesChangements('installateur'), - aUnAbandonEnCours, - estAbandonné, - estAchevé: !!achèvementRéel, - }), - natureDeLExploitation: await getNatureDeLExploitation({ - identifiantProjet: identifiantProjetValueType, - rôle: user.role, - règlesChangementPourAppelOffres: - cahierDesCharges.getRèglesChangements('natureDeLExploitation'), - aUnAbandonEnCours, - estAbandonné, - estAchevé: !!achèvementRéel, - }), - statutLauréat: lauréat.statut.statut, - siteDeProduction: getSiteDeProduction({ - identifiantProjet: identifiantProjetValueType, - rôle: role, - project, - }), - nomProjet: await getNomProjet({ - identifiantProjet: identifiantProjetValueType, - rôle: role, - project, - règlesChangementPourAppelOffres: cahierDesCharges.getRèglesChangements('nomProjet'), - aUnAbandonEnCours, - estAbandonné, - estAchevé: !!achèvementRéel, - }), - doitAfficherAttestationDésignation: !!lauréat.attestationDésignation, - }), - ); - }, - ), -); diff --git a/packages/applications/legacy/src/controllers/project/index.ts b/packages/applications/legacy/src/controllers/project/index.ts index 8354f5a95e4..fb154d5fa4d 100644 --- a/packages/applications/legacy/src/controllers/project/index.ts +++ b/packages/applications/legacy/src/controllers/project/index.ts @@ -1,2 +1 @@ export * from './getExportProjets'; -export * from './getProjectPage'; diff --git a/packages/applications/legacy/src/infra/sequelize/queries/project/consulter/getProjectDataForProjectPage.ts b/packages/applications/legacy/src/infra/sequelize/queries/project/consulter/getProjectDataForProjectPage.ts deleted file mode 100644 index 35043877a95..00000000000 --- a/packages/applications/legacy/src/infra/sequelize/queries/project/consulter/getProjectDataForProjectPage.ts +++ /dev/null @@ -1,253 +0,0 @@ -import { errAsync, okAsync, ResultAsync, wrapInfra } from '../../../../../core/utils'; -import { getProjectAppelOffre } from '../../../../../config/queryProjectAO.config'; -import { - ProjectDataForProjectPage, - GetProjectDataForProjectPage, -} from '../../../../../modules/project'; -import { EntityNotFoundError } from '../../../../../modules/shared'; -import { Project, File } from '../../../projectionsNext'; -import { parseCahierDesChargesRéférence, ProjectAppelOffre, User } from '../../../../../entities'; -import { AppelOffre } from '@potentiel-domain/appel-offre'; -import { userIs, userIsNot } from '../../../../../modules/users'; -import { Role } from '@potentiel-domain/utilisateur'; -import { Candidature } from '@potentiel-domain/projet'; - -export const getProjectDataForProjectPage: GetProjectDataForProjectPage = ({ projectId, user }) => { - const chargerProjet = wrapInfra( - Project.findByPk(projectId, { - include: [ - { - model: File, - as: 'certificateFile', - attributes: ['id', 'filename'], - }, - ], - }), - ); - - const vérifierAccèsProjet = ( - project: Project | null, - ): ResultAsync => { - if (!project || (!project.notifiedOn && userIsNot(['admin', 'dgec-validateur', 'cre'])(user))) { - return errAsync(new EntityNotFoundError()); - } - - return okAsync(project); - }; - - const récupérerAppelOffre = ( - project: Project, - ): ResultAsync<{ project: any; appelOffre: ProjectAppelOffre }, EntityNotFoundError> => { - const { appelOffreId, periodeId, familleId } = project; - const appelOffre = getProjectAppelOffre({ appelOffreId, periodeId, familleId }); - - if (!appelOffre) { - return errAsync(new EntityNotFoundError()); - } - - return okAsync({ project, appelOffre }); - }; - - const récupérerCahierDesCharges = ({ - appelOffre, - project, - }: { - project: Project; - appelOffre: ProjectAppelOffre; - }): ResultAsync< - { - appelOffre: ProjectAppelOffre; - // TODO: retirer le any ici et résoudre les problèmes de typage pour cahierDesChargesActuel - project: any; - cahierDesCharges: - | AppelOffre.Periode['cahierDesCharges'] - | { type: string; url: string; paruLe?: undefined; alternatif?: undefined } - | { - type: string; - url: string | undefined; - paruLe: '30/07/2021' | '30/08/2022' | '07/02/2023'; - alternatif: true | undefined; - }; - }, - never - > => { - const { cahierDesChargesActuel: cahierDesChargesActuelRaw } = project; - - const cahierDesChargesActuel = parseCahierDesChargesRéférence(cahierDesChargesActuelRaw); - - const cahierDesCharges = - cahierDesChargesActuel.type === 'initial' - ? { - type: 'initial', - url: appelOffre.cahiersDesChargesUrl, - } - : { - type: 'modifié', - url: appelOffre.cahiersDesChargesUrl, - paruLe: cahierDesChargesActuel.paruLe, - alternatif: cahierDesChargesActuel.alternatif, - }; - - return okAsync({ appelOffre, project, cahierDesCharges }); - }; - - return chargerProjet - .andThen(vérifierAccèsProjet) - .andThen(récupérerAppelOffre) - .andThen(récupérerCahierDesCharges) - .andThen( - ({ - appelOffre, - cahierDesCharges: cahierDesChargesActuel, - project: { - id, - appelOffreId, - periodeId, - familleId, - numeroCRE, - puissance, - prixReference, - engagementFournitureDePuissanceAlaPointe, - isFinancementParticipatif, - isInvestissementParticipatif, - actionnariat, - adresseProjet, - codePostalProjet, - communeProjet, - departementProjet, - regionProjet, - territoireProjet, - nomProjet, - nomCandidat, - email, - fournisseur, - evaluationCarbone, - note, - details, - notifiedOn, - abandonedOn, - certificateFile, - classe, - motifsElimination, - users, - completionDueOn, - updatedAt, - potentielIdentifier, - dcrDueOn, - désignationCatégorie, - technologie, - }, - }): ResultAsync => - okAsync({ - id, - potentielIdentifier, - appelOffreId, - periodeId, - familleId, - appelOffre, - numeroCRE, - puissance, - engagementFournitureDePuissanceAlaPointe, - isFinancementParticipatif, - isInvestissementParticipatif, - actionnariat, - adresseProjet, - codePostalProjet, - communeProjet, - departementProjet, - regionProjet, - territoireProjet, - nomProjet, - nomCandidat, - email, - note, - details, - notifiedOn, - completionDueOn, - isClasse: classe === 'Classé', - isAbandoned: abandonedOn !== 0, - isLegacy: appelOffre.periode.type === 'legacy', - motifsElimination, - dcrDueOn, - désignationCatégorie, - updatedAt, - unitePuissance: Candidature.UnitéPuissance.déterminer({ - appelOffres: appelOffre, - période: periodeId, - technologie: technologie ?? 'N/A', - }).formatter(), - cahierDesChargesActuel, - ...(userIs([ - 'admin', - 'porteur-projet', - 'dreal', - 'cocontractant', - 'ademe', - 'dgec-validateur', - 'cre', - ])(user) && { fournisseur, evaluationCarbone }), - ...(Role.convertirEnValueType(user.role).aLaPermission('projet.accèsDonnées.prix') && { - prixReference, - }), - ...(userIs([ - 'admin', - 'porteur-projet', - 'dreal', - 'cocontractant', - 'dgec-validateur', - 'cre', - ])(user) && { - ...(notifiedOn && { certificateFile }), - }), - }), - ) - .andThen((dto) => - dto.appelOffre.typeAppelOffre === 'innovation' - ? ajouterNotesInnovation({ dto, user }) - : okAsync(dto), - ); -}; - -const ajouterNotesInnovation = ({ - dto, - user, -}: { - dto: ProjectDataForProjectPage; - user: User; -}): ResultAsync => { - const formater = (note: string | null) => { - if (note) { - const noteParsée = parseFloat(note.replace(',', '.')); - - if (!Number.isNaN(noteParsée)) { - return (Math.round(noteParsée * 100) / 100).toString(); - } - } - return 'N/A'; - }; - - return userIs(['admin', 'dgec-validateur', 'ademe', 'cre', 'porteur-projet'])(user) - ? okAsync({ - ...dto, - notePrix: formater(dto.details['Note prix']), - notesInnovation: { - note: formater(dto.details['Note innovation\n(AO innovation)']), - degréInnovation: formater( - dto.details['Note degré d’innovation (/20pt)\n(AO innovation)'], - ), - positionnement: formater( - dto.details['Note positionnement sur le marché (/10pt)\n(AO innovation)'], - ), - qualitéTechnique: formater(dto.details['Note qualité technique (/5pt)\n(AO innovation)']), - adéquationAmbitionsIndustrielles: formater( - dto.details[ - 'Note adéquation du projet avec les ambitions industrielles (/5pt)\n(AO innovation)' - ], - ), - aspectsEnvironnementauxEtSociaux: formater( - dto.details['Note aspects environnementaux et sociaux (/5pt)\n(AO innovation)'], - ), - }, - }) - : okAsync(dto); -}; diff --git a/packages/applications/legacy/src/infra/sequelize/queries/project/consulter/index.ts b/packages/applications/legacy/src/infra/sequelize/queries/project/consulter/index.ts deleted file mode 100644 index cefe694fe26..00000000000 --- a/packages/applications/legacy/src/infra/sequelize/queries/project/consulter/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from './getProjectDataForProjectPage'; diff --git a/packages/applications/legacy/src/infra/sequelize/queries/project/index.ts b/packages/applications/legacy/src/infra/sequelize/queries/project/index.ts index 7acf5a240b8..485ccf68024 100644 --- a/packages/applications/legacy/src/infra/sequelize/queries/project/index.ts +++ b/packages/applications/legacy/src/infra/sequelize/queries/project/index.ts @@ -1,4 +1,3 @@ -export * from './consulter'; export * from './exporter'; export * from './helpers'; export * from './findProjectByIdentifiers'; diff --git a/packages/applications/legacy/src/modules/authN/Permission.ts b/packages/applications/legacy/src/modules/authN/Permission.ts index 929dc5fd74e..0de96e3d05c 100644 --- a/packages/applications/legacy/src/modules/authN/Permission.ts +++ b/packages/applications/legacy/src/modules/authN/Permission.ts @@ -1,9 +1,5 @@ import { UserRole } from '../users'; -import { - PermissionConsulterProjet, - PermissionListerProjets, - PermissionExporterProjets, -} from '../project'; +import { PermissionExporterProjets } from '../project'; import { match, P } from 'ts-pattern'; export type Permission = { @@ -24,7 +20,7 @@ export const getPermissions = ({ role }: { role: UserRole }): Array 'cre', 'ademe', ), - () => [PermissionListerProjets, PermissionConsulterProjet, PermissionExporterProjets], + () => [PermissionExporterProjets], ) .with('grd', () => []) .exhaustive(); diff --git "a/packages/applications/legacy/src/modules/project/queries/GetD\303\251laiCdc2022Applicable.ts" "b/packages/applications/legacy/src/modules/project/queries/GetD\303\251laiCdc2022Applicable.ts" deleted file mode 100644 index 9a85a61e2b3..00000000000 --- "a/packages/applications/legacy/src/modules/project/queries/GetD\303\251laiCdc2022Applicable.ts" +++ /dev/null @@ -1,8 +0,0 @@ -import { CahierDesChargesRéférenceParsed } from '../../../entities'; - -export type GetDélaiCDC2022Applicable = (args: { - cahierDesChargesParsed: CahierDesChargesRéférenceParsed; - appelOffreId: string; - periodeId: string; - familleId: string; -}) => number | undefined; diff --git a/packages/applications/legacy/src/modules/project/queries/GetProjectDataForProjectPage.ts b/packages/applications/legacy/src/modules/project/queries/GetProjectDataForProjectPage.ts deleted file mode 100644 index 8aa53a75ae0..00000000000 --- a/packages/applications/legacy/src/modules/project/queries/GetProjectDataForProjectPage.ts +++ /dev/null @@ -1,105 +0,0 @@ -import { ResultAsync } from '../../../core/utils'; -import { ProjectAppelOffre, User } from '../../../entities'; -import { Permission } from '../../authN'; -import { InfraNotAvailableError, EntityNotFoundError } from '../../shared'; -import { Actionnariat, DésignationCatégorie } from '../types'; -import { Éliminé } from '@potentiel-domain/projet'; - -export const PermissionConsulterProjet: Permission = { - nom: 'consulter-projet', - description: 'Consulter un projet', -}; - -export type GetProjectDataForProjectPage = (args: { - projectId: string; - user: User; -}) => ResultAsync; - -export type ProjectDataForProjectPage = { - dcrDueOn: number; - id: string; - potentielIdentifier: string; - - appelOffre: ProjectAppelOffre; - unitePuissance: string; - - appelOffreId: string; - periodeId: string; - familleId: string; - numeroCRE: string; - cahierDesChargesActuel: { - url: string; - } & ( - | { - type: 'initial'; - } - | { - type: 'modifié'; - paruLe: string; - alternatif?: true; - } - ); - - isLegacy: boolean; - - puissance: number; - prixReference?: number; - - engagementFournitureDePuissanceAlaPointe: boolean; - isFinancementParticipatif: boolean; - isInvestissementParticipatif: boolean; - actionnariat?: Actionnariat; - - adresseProjet: string; - codePostalProjet: string; - communeProjet: string; - departementProjet: string; - regionProjet: string; - territoireProjet?: string; - - nomCandidat: string; - nomProjet: string; - nomRepresentantLegal: string; - email: string; - note: number; - notesInnovation?: NotesInnovation; - notePrix?: string; - - désignationCatégorie?: DésignationCatégorie; - - details: Record; - - updatedAt?: Date; - demandeRecours?: { - statut: Éliminé.Recours.StatutRecours.RawType; - }; - - notifiedOn: number; - completionDueOn: number; -} & (IsClasse | IsElimine | IsAbandoned); - -type IsClasse = { - isClasse: true; - isAbandoned: false; -}; - -type IsElimine = { - isClasse: false; - isAbandoned: false; - motifsElimination: string; -}; - -type IsAbandoned = { - isAbandoned: true; - isClasse: false; - recoursEnCours: false; -}; - -type NotesInnovation = { - note: string; - degréInnovation: string; - positionnement: string; - qualitéTechnique: string; - adéquationAmbitionsIndustrielles: string; - aspectsEnvironnementauxEtSociaux: string; -}; diff --git a/packages/applications/legacy/src/modules/project/queries/GetProjectIdsForPeriode.ts b/packages/applications/legacy/src/modules/project/queries/GetProjectIdsForPeriode.ts deleted file mode 100644 index d3abb21228e..00000000000 --- a/packages/applications/legacy/src/modules/project/queries/GetProjectIdsForPeriode.ts +++ /dev/null @@ -1,9 +0,0 @@ -import { AppelOffre } from '@potentiel-domain/appel-offre'; -import { ResultAsync } from '../../../core/utils'; -import { InfraNotAvailableError } from '../../shared'; - -export type GetProjectIdsForPeriode = (args: { - appelOffreId: AppelOffre.AppelOffreReadModel['id']; - periodeId: AppelOffre.Periode['id']; - familleId?: string; -}) => ResultAsync; diff --git a/packages/applications/legacy/src/modules/project/queries/GetProjectsByContactEmail.ts b/packages/applications/legacy/src/modules/project/queries/GetProjectsByContactEmail.ts deleted file mode 100644 index efddb775f55..00000000000 --- a/packages/applications/legacy/src/modules/project/queries/GetProjectsByContactEmail.ts +++ /dev/null @@ -1,6 +0,0 @@ -import { ResultAsync } from '../../../core/utils'; -import { InfraNotAvailableError } from '../../shared'; - -export type GetNonLegacyProjectsByContactEmail = ( - email: string, -) => ResultAsync; diff --git a/packages/applications/legacy/src/modules/project/queries/GetUnnotifiedProjectsForPeriode.ts b/packages/applications/legacy/src/modules/project/queries/GetUnnotifiedProjectsForPeriode.ts deleted file mode 100644 index 5c556123b00..00000000000 --- a/packages/applications/legacy/src/modules/project/queries/GetUnnotifiedProjectsForPeriode.ts +++ /dev/null @@ -1,16 +0,0 @@ -import { ResultAsync } from '../../../core/utils'; -import { Project } from '../../../entities'; -import { AppelOffre } from '@potentiel-domain/appel-offre'; -import { InfraNotAvailableError } from '../../shared'; - -export interface UnnotifiedProjectDTO { - projectId: Project['id']; - familleId: Project['familleId']; - candidateEmail: Project['email']; - candidateName: Project['nomRepresentantLegal']; -} - -export type GetUnnotifiedProjectsForPeriode = ( - appelOffreId: AppelOffre.AppelOffreReadModel['id'], - periodeId: AppelOffre.Periode['id'], -) => ResultAsync; diff --git "a/packages/applications/legacy/src/modules/project/queries/HasDemandeDeM\303\252meTypeOuverte.ts" "b/packages/applications/legacy/src/modules/project/queries/HasDemandeDeM\303\252meTypeOuverte.ts" deleted file mode 100644 index 9ee38fc7ac5..00000000000 --- "a/packages/applications/legacy/src/modules/project/queries/HasDemandeDeM\303\252meTypeOuverte.ts" +++ /dev/null @@ -1,7 +0,0 @@ -import { EntityNotFoundError, InfraNotAvailableError } from '../../shared'; -import { ResultAsync } from 'neverthrow'; - -export type HasDemandeDeMêmeTypeOuverte = (args: { - projetId: string; - type: 'recours' | 'delai'; -}) => ResultAsync; diff --git "a/packages/applications/legacy/src/modules/project/queries/R\303\251cup\303\251rerD\303\251tailDossiersRaccordements.ts" "b/packages/applications/legacy/src/modules/project/queries/R\303\251cup\303\251rerD\303\251tailDossiersRaccordements.ts" deleted file mode 100644 index a672b29be6e..00000000000 --- "a/packages/applications/legacy/src/modules/project/queries/R\303\251cup\303\251rerD\303\251tailDossiersRaccordements.ts" +++ /dev/null @@ -1,6 +0,0 @@ -import { IdentifiantProjet } from '@potentiel-domain/projet'; -import { Lauréat } from '@potentiel-domain/projet'; - -export type RécupérerDétailDossiersRaccordements = ( - identifiantProjet: IdentifiantProjet.ValueType, -) => Promise; diff --git "a/packages/applications/legacy/src/modules/project/queries/R\303\251sum\303\251Projet.ts" "b/packages/applications/legacy/src/modules/project/queries/R\303\251sum\303\251Projet.ts" deleted file mode 100644 index 9c342c14344..00000000000 --- "a/packages/applications/legacy/src/modules/project/queries/R\303\251sum\303\251Projet.ts" +++ /dev/null @@ -1,19 +0,0 @@ -import { ResultAsync } from '../../../core/utils'; -import { InfraNotAvailableError, EntityNotFoundError } from '../../shared'; - -export type RésuméProjetReadModel = { - id: string; - nomProjet: string; - nomCandidat: string; - communeProjet: string; - regionProjet: string; - departementProjet: string; - periodeId: string; - familleId: string; - notifiedOn: number; - appelOffreId: string; - identifiantGestionnaire?: string; - gestionnaireRéseau?: { codeEIC: string; raisonSociale: string }; - puissance: number; - unitePuissance: string; -}; diff --git "a/packages/applications/legacy/src/modules/project/queries/TrouverProjetsParIdentifiantGestionnaireR\303\251seau.ts" "b/packages/applications/legacy/src/modules/project/queries/TrouverProjetsParIdentifiantGestionnaireR\303\251seau.ts" deleted file mode 100644 index b9ffc97e87d..00000000000 --- "a/packages/applications/legacy/src/modules/project/queries/TrouverProjetsParIdentifiantGestionnaireR\303\251seau.ts" +++ /dev/null @@ -1,6 +0,0 @@ -import { ResultAsync } from '../../../core/utils'; -import { InfraNotAvailableError } from '../../shared'; - -export type TrouverProjetsParIdentifiantGestionnaireRéseau = ( - identifiantGestionnaireRéseau: string, -) => ResultAsync, InfraNotAvailableError>; diff --git a/packages/applications/legacy/src/modules/project/queries/index.ts b/packages/applications/legacy/src/modules/project/queries/index.ts index 763339a70c1..d5879d74c68 100644 --- a/packages/applications/legacy/src/modules/project/queries/index.ts +++ b/packages/applications/legacy/src/modules/project/queries/index.ts @@ -2,13 +2,3 @@ export * from './exporterProjets'; export * from './listerProjets'; export * from './BuildProjectIdentifier'; export * from './FindProjectByIdentifiers'; -export * from './GetDélaiCdc2022Applicable'; -export * from './GetProjectDataForProjectPage'; -export * from './GetProjectIdsForPeriode'; -export * from './GetProjectsByContactEmail'; -export * from './GetUnnotifiedProjectsForPeriode'; -export * from './HasDemandeDeMêmeTypeOuverte'; -export * from './RésuméProjet'; -export * from './TrouverProjetsParIdentifiantGestionnaireRéseau'; -export * from './récupérerDonnéesPorteursParProjet'; -export * from './RécupérerDétailDossiersRaccordements'; diff --git "a/packages/applications/legacy/src/modules/project/queries/r\303\251cup\303\251rerDonn\303\251esPorteursParProjet.ts" "b/packages/applications/legacy/src/modules/project/queries/r\303\251cup\303\251rerDonn\303\251esPorteursParProjet.ts" deleted file mode 100644 index 600dd8dec93..00000000000 --- "a/packages/applications/legacy/src/modules/project/queries/r\303\251cup\303\251rerDonn\303\251esPorteursParProjet.ts" +++ /dev/null @@ -1,9 +0,0 @@ -import { User } from '../../../entities'; - -type RécupérerDonnéesPorteursParProjetQuery = { projetId: string }; - -type RécupérerDonnéesPorteursParProjetReadModel = Array; - -export type RécupérerDonnéesPorteursParProjetQueryHandler = ( - query: RécupérerDonnéesPorteursParProjetQuery, -) => Promise; diff --git a/packages/applications/legacy/src/views/components/DownloadIcon.tsx b/packages/applications/legacy/src/views/components/DownloadIcon.tsx deleted file mode 100644 index 4c292f5f5ec..00000000000 --- a/packages/applications/legacy/src/views/components/DownloadIcon.tsx +++ /dev/null @@ -1,21 +0,0 @@ -import React from 'react'; - -export const DownloadIcon = ({ color = 'currentColor' }) => { - return ( - - - - ); -}; diff --git a/packages/applications/legacy/src/views/components/ProjectInfo.tsx b/packages/applications/legacy/src/views/components/ProjectInfo.tsx deleted file mode 100644 index e58a5e0c34b..00000000000 --- a/packages/applications/legacy/src/views/components/ProjectInfo.tsx +++ /dev/null @@ -1,81 +0,0 @@ -import React from 'react'; -import routes from '../../routes'; -import { Link } from '.'; -import { afficherDate } from '../helpers/afficherDate'; - -export type ProjectProps = { - id: string; - nomProjet: string; - nomCandidat: string; - communeProjet: string; - regionProjet: string; - departementProjet: string; - periodeId: string; - familleId: string | undefined; - notifiedOn: number; - appelOffreId: string; - identifiantGestionnaire?: string; - gestionnaireRéseau?: { codeEIC: string; raisonSociale: string }; - puissance?: number; - unitePuissance?: string; - cahiersDesChargesUrl?: string; -}; - -type ProjectInfoProps = { - project: ProjectProps; - children?: React.ReactNode; - className?: string; -}; - -export const ProjectInfo = ({ project, children, className = '' }: ProjectInfoProps) => { - const { - id, - nomProjet, - nomCandidat, - communeProjet, - regionProjet, - departementProjet, - periodeId, - familleId, - notifiedOn, - appelOffreId, - identifiantGestionnaire, - gestionnaireRéseau, - puissance, - unitePuissance, - } = project; - - return ( -
-
- {nomProjet} -
-
- {nomCandidat} -
- {communeProjet}, {departementProjet}, {regionProjet} -
-
- {puissance} {unitePuissance} -
-

- Désigné le {afficherDate(notifiedOn)} pour la période{' '} - - {appelOffreId} {periodeId} - {' '} - {familleId && famille {familleId}} -

- {identifiantGestionnaire && ( -
Identifiant dossier de raccordement : {identifiantGestionnaire}
- )} - {gestionnaireRéseau && ( -
- Gestionnaire de réseau: {gestionnaireRéseau.raisonSociale} ({gestionnaireRéseau.codeEIC}) -
- )} - {children} -
- ); -}; diff --git a/packages/applications/legacy/src/views/components/UI/README.md b/packages/applications/legacy/src/views/components/UI/README.md deleted file mode 100644 index 2c3d874a28c..00000000000 --- a/packages/applications/legacy/src/views/components/UI/README.md +++ /dev/null @@ -1,38 +0,0 @@ -# Gestion des interfaces utilisateurs -## Qu'est-ce que l'atomic design - -L'atomic design est une philosophie qui permet un découpage modulaire d'une interface. - -Dans l'optique de concevoir des applications qui puissent garder une cohérence graphique et un comportement quel que soit le device qui l'utilise, l'idée est de repenser la manière dont on va découper une page. -Le principe d'atomic design repose sur le fait de découper les élements qui composent l'interface du plus petit (atom) au plus gros (page). - -On peut donc envisager un découpage qui suit cette logique : -1. Les **Atomes** : éléments graphiques de base d'une l'interface. - *Exemple : boutons, typographie, couleurs, icons...* - -2. Les **Molécules** : Composées essentiellement d'atomes, elles forment les premiers éléments d'interface. - *Exemple : Un bouton avec une couleur primaire et un libellé forment un bouton d’action* - -3. Les **Organismes** : Composés essentiellement de molécules et potentiellement d'atomes. - *Exemple : un champ de saisie et un bouton d’action forment l’organisme de publication de message.* - -4. Les **Templates** : Ce sont des modèles de page, qui ne contiennent pas de contenu (*lorem ipsum*) ni d'assets. Leur intérêt repose sur le fait de pouvoir tester le comportement des interfaces d'un point de vue responsive. - -5. Les **Pages** : Basé sur un template, il s'agit d'une interface qui va s'inscrire dans un parcours utilisateur - -Références : -- https://blog-ux.com/quest-ce-que-latomic-design/ -- https://vimeo.com/109130093?embedded=true&source=vimeo_logo&owner=7270851 - -## Utilisation dans Potentiel - -Pour Potentiel, nous appliquons le design atomic dans le dossier `UI` organisés entre les dossiers atoms et molecules. - -Afin de pouvoir bien construire chacun de nos composants, nous utilisons certaines conventions : -- Tout nos composants doivent être construit dans une logique [mobile-first](https://www.anthedesign.fr/webdesign-2/mobile-first/) qui garanti une bonne utilisation du composant quelque soit le device. -- Nous adoptons une approche de classe utilitaire à l'aide du framework [tailwindcss](https://tailwindcss.com/). En supplément, nous conseillons d'installer leur [extension](https://tailwindcss.com/docs/editor-setup) sur votre éditeur de code favori. - -## Lien avec le design-system de l'état (DSFR) - -L'état dispose d'un [système de design](https://www.systeme-de-design.gouv.fr/) (dsfr) visant à homogénéiser ses services d'état. Bien que nous n'utilisions pas directement le DSFR, nous nous efforçons de respecter les règles et design définis dans la [documentation](https://gouvfr.atlassian.net/wiki/spaces/DB/overview?homepageId=145359476) - diff --git a/packages/applications/legacy/src/views/components/UI/atoms/Badge.tsx b/packages/applications/legacy/src/views/components/UI/atoms/Badge.tsx deleted file mode 100644 index 122dd2d2939..00000000000 --- a/packages/applications/legacy/src/views/components/UI/atoms/Badge.tsx +++ /dev/null @@ -1,54 +0,0 @@ -import React, { FC } from 'react'; - -export type BadgeType = 'success' | 'error' | 'info' | 'warning' | 'new'; - -type BadgeProps = { - className?: string; - type: BadgeType; -}; - -const badgeColorsByType: Record< - BadgeType, - { backgroundColor: string; borderColor: string; textColor: string } -> = { - success: { - backgroundColor: 'bg-success-950-base', - borderColor: 'border-success-950-base', - textColor: 'text-success-425-base', - }, - error: { - backgroundColor: 'bg-error-950-base', - borderColor: 'border-error-950-base', - textColor: 'text-error-425-base', - }, - info: { - backgroundColor: 'bg-info-950-base', - borderColor: 'border-info-950-base', - textColor: 'text-info-425-base', - }, - warning: { - backgroundColor: 'bg-warning-950-base', - borderColor: 'border-warning-950-base', - textColor: 'text-warning-425-base', - }, - new: { - backgroundColor: 'bg-new-950-base', - borderColor: 'border-new-950-base', - textColor: 'text-new-425-base', - }, -}; - -export const Badge: FC = ({ - type, - className = '', - children, -}) => { - const { backgroundColor, textColor, borderColor } = badgeColorsByType[type]; - return ( - - {children} - - ); -}; diff --git a/packages/applications/legacy/src/views/components/UI/atoms/Button.tsx b/packages/applications/legacy/src/views/components/UI/atoms/Button.tsx deleted file mode 100644 index da216e04e24..00000000000 --- a/packages/applications/legacy/src/views/components/UI/atoms/Button.tsx +++ /dev/null @@ -1,33 +0,0 @@ -import React, { ComponentProps, FC, useRef } from 'react'; -import { ConfirmationProp, demanderConfirmation } from '../../../helpers'; - -export type ButtonProps = ComponentProps<'button'> & ConfirmationProp; - -export const Button: FC = ({ - children, - className = '', - confirmation = undefined, - ...props -}) => { - const buttonRef = useRef(null); - - const handleKeyDown = (event: React.KeyboardEvent) => { - if (event.key === ' ' || event.key === 'Enter') { - event.preventDefault(); - confirmation && demanderConfirmation(event, confirmation); - buttonRef.current?.click(); - } - }; - - return ( - - ); -}; diff --git a/packages/applications/legacy/src/views/components/UI/atoms/Callout.tsx b/packages/applications/legacy/src/views/components/UI/atoms/Callout.tsx deleted file mode 100644 index c3861586bd1..00000000000 --- a/packages/applications/legacy/src/views/components/UI/atoms/Callout.tsx +++ /dev/null @@ -1,15 +0,0 @@ -import React, { ComponentProps } from 'react'; - -export type CalloutProps = ComponentProps<'div'>; - -export const Callout = ({ children, className = '', ...props }: CalloutProps) => { - return ( -
- {children} -
- ); -}; diff --git a/packages/applications/legacy/src/views/components/UI/atoms/Dialog.tsx b/packages/applications/legacy/src/views/components/UI/atoms/Dialog.tsx deleted file mode 100644 index a1e83237b19..00000000000 --- a/packages/applications/legacy/src/views/components/UI/atoms/Dialog.tsx +++ /dev/null @@ -1,14 +0,0 @@ -import React, { ComponentProps } from 'react'; - -export const Dialog = ({ open, children }: ComponentProps<'dialog'>) => ( - -
-
{children}
-
-
-); diff --git a/packages/applications/legacy/src/views/components/UI/atoms/Fieldset.tsx b/packages/applications/legacy/src/views/components/UI/atoms/Fieldset.tsx deleted file mode 100644 index 8f2c1a9911e..00000000000 --- a/packages/applications/legacy/src/views/components/UI/atoms/Fieldset.tsx +++ /dev/null @@ -1,11 +0,0 @@ -import React, { ComponentProps } from 'react'; - -export type FieldsetProps = ComponentProps<'fieldset'>; - -export const Fieldset = ({ children, className = '', ...props }: FieldsetProps) => { - return ( -
- {children} -
- ); -}; diff --git a/packages/applications/legacy/src/views/components/UI/atoms/Form.tsx b/packages/applications/legacy/src/views/components/UI/atoms/Form.tsx deleted file mode 100644 index 47ee7d99544..00000000000 --- a/packages/applications/legacy/src/views/components/UI/atoms/Form.tsx +++ /dev/null @@ -1,9 +0,0 @@ -import React, { ComponentProps } from 'react'; - -type FormProps = ComponentProps<'form'>; - -export const Form = ({ children, className = '', ...props }: FormProps) => ( -
- {children} -
-); diff --git a/packages/applications/legacy/src/views/components/UI/atoms/Input.tsx b/packages/applications/legacy/src/views/components/UI/atoms/Input.tsx deleted file mode 100644 index 8dcaa66be19..00000000000 --- a/packages/applications/legacy/src/views/components/UI/atoms/Input.tsx +++ /dev/null @@ -1,35 +0,0 @@ -import React, { ComponentProps, useState } from 'react'; -import { ErrorIcon } from './icons'; - -type InputProps = ComponentProps<'input'> & { - error?: string; -}; - -export const Input = ({ className = '', error = '', onChange, ...props }: InputProps) => { - const [valueHasChanged, valueChanged] = useState(false); - const isOnError = error !== '' && !valueHasChanged; - - return ( - <> - { - valueChanged(true); - onChange && onChange(e); - }} - /> - {isOnError && ( -

- - {error} -

- )} - - ); -}; diff --git a/packages/applications/legacy/src/views/components/UI/atoms/SecondaryLinkButton.tsx b/packages/applications/legacy/src/views/components/UI/atoms/SecondaryLinkButton.tsx deleted file mode 100644 index bca564d0d8c..00000000000 --- a/packages/applications/legacy/src/views/components/UI/atoms/SecondaryLinkButton.tsx +++ /dev/null @@ -1,25 +0,0 @@ -import { ConfirmationProp, demanderConfirmation } from '../../../helpers'; -import React, { ComponentProps, FC } from 'react'; - -type LinkButtonProps = ComponentProps<'a'> & ConfirmationProp & { disabled?: true }; - -export const SecondaryLinkButton: FC = ({ - children, - className = '', - confirmation = undefined, - disabled = undefined, - ...props -}) => ( - demanderConfirmation(event, confirmation) : undefined} - aria-disabled={disabled} - {...props} - > - {children} - -); diff --git a/packages/applications/legacy/src/views/components/UI/atoms/Select.tsx b/packages/applications/legacy/src/views/components/UI/atoms/Select.tsx deleted file mode 100644 index a24e995ae67..00000000000 --- a/packages/applications/legacy/src/views/components/UI/atoms/Select.tsx +++ /dev/null @@ -1,53 +0,0 @@ -import React, { ComponentProps, useState } from 'react'; -import { ArrowDownIcon, ErrorIcon } from '../..'; - -type SelectProps = ComponentProps<'select'> & { - error?: string; -}; - -export const Select = ({ - className = '', - error = '', - onChange, - children, - ...props -}: SelectProps) => { - const { id, disabled } = props; - - const [valueHasChanged, valueChanged] = useState(false); - const isOnError = error !== '' && !valueHasChanged; - - return ( - <> -
- - -
- {isOnError && ( -

- - {error} -

- )} - - ); -}; diff --git a/packages/applications/legacy/src/views/components/UI/atoms/Spinner.tsx b/packages/applications/legacy/src/views/components/UI/atoms/Spinner.tsx deleted file mode 100644 index e893423d02d..00000000000 --- a/packages/applications/legacy/src/views/components/UI/atoms/Spinner.tsx +++ /dev/null @@ -1,14 +0,0 @@ -import React, { ComponentProps } from 'react'; - -export const Spinner = ({ className = '' }: ComponentProps<'div'>) => ( -
-
- - Loading... - -
-
-); diff --git a/packages/applications/legacy/src/views/components/UI/atoms/Tile.tsx b/packages/applications/legacy/src/views/components/UI/atoms/Tile.tsx deleted file mode 100644 index a2e630eaf16..00000000000 --- a/packages/applications/legacy/src/views/components/UI/atoms/Tile.tsx +++ /dev/null @@ -1,12 +0,0 @@ -import React, { FC } from 'react'; - -export const Tile: FC<{ className?: string; children: React.ReactNode }> = ({ - children, - className = '', -}) => ( -
- {children} -
-); diff --git a/packages/applications/legacy/src/views/components/UI/atoms/index.ts b/packages/applications/legacy/src/views/components/UI/atoms/index.ts index 08d423e4496..c35973b97c3 100644 --- a/packages/applications/legacy/src/views/components/UI/atoms/index.ts +++ b/packages/applications/legacy/src/views/components/UI/atoms/index.ts @@ -1,18 +1,6 @@ -export * from './Badge'; -export * from './Callout'; -export * from './Dialog'; export * from './headings'; -export * from './Dialog'; -export * from './Input'; export * from './Label'; export * from './LabelDescription'; export * from './Link'; export * from './LinkButton'; -export * from './SecondaryLinkButton'; -export * from './Tile'; export * from './icons'; -export * from './Select'; -export * from './Fieldset'; -export * from './table'; -export * from './Form'; -export * from './Spinner'; diff --git a/packages/applications/legacy/src/views/components/UI/atoms/table/Table.tsx b/packages/applications/legacy/src/views/components/UI/atoms/table/Table.tsx deleted file mode 100644 index d1bd4f910b7..00000000000 --- a/packages/applications/legacy/src/views/components/UI/atoms/table/Table.tsx +++ /dev/null @@ -1,12 +0,0 @@ -import React, { ComponentProps } from 'react'; - -type TdProps = ComponentProps<'table'>; - -export const Table = ({ children, className = '', ...props }: TdProps) => ( - - {children} -
-); diff --git a/packages/applications/legacy/src/views/components/UI/atoms/table/Td.tsx b/packages/applications/legacy/src/views/components/UI/atoms/table/Td.tsx deleted file mode 100644 index 62cc5da0564..00000000000 --- a/packages/applications/legacy/src/views/components/UI/atoms/table/Td.tsx +++ /dev/null @@ -1,12 +0,0 @@ -import React, { ComponentProps } from 'react'; - -type TdProps = ComponentProps<'td'>; - -export const Td = ({ children, className = '', ...props }: TdProps) => ( - - {children} - -); diff --git a/packages/applications/legacy/src/views/components/UI/atoms/table/Th.tsx b/packages/applications/legacy/src/views/components/UI/atoms/table/Th.tsx deleted file mode 100644 index ecf60540800..00000000000 --- a/packages/applications/legacy/src/views/components/UI/atoms/table/Th.tsx +++ /dev/null @@ -1,9 +0,0 @@ -import React, { ComponentProps } from 'react'; - -type TdProps = ComponentProps<'th'>; - -export const Th = ({ children, className = '', ...props }: TdProps) => ( - - {children} - -); diff --git a/packages/applications/legacy/src/views/components/UI/atoms/table/index.ts b/packages/applications/legacy/src/views/components/UI/atoms/table/index.ts deleted file mode 100644 index ab5909cde4f..00000000000 --- a/packages/applications/legacy/src/views/components/UI/atoms/table/index.ts +++ /dev/null @@ -1,3 +0,0 @@ -export * from './Table'; -export * from './Td'; -export * from './Th'; diff --git a/packages/applications/legacy/src/views/components/UI/index.ts b/packages/applications/legacy/src/views/components/UI/index.ts index df5bfaf3aee..ea595514870 100644 --- a/packages/applications/legacy/src/views/components/UI/index.ts +++ b/packages/applications/legacy/src/views/components/UI/index.ts @@ -1,4 +1,3 @@ export * from './atoms'; export * from './molecules'; export * from './organisms'; -export * from './templates'; diff --git a/packages/applications/legacy/src/views/components/UI/molecules/Accordeon.tsx b/packages/applications/legacy/src/views/components/UI/molecules/Accordeon.tsx deleted file mode 100644 index 5ffffe4d6b7..00000000000 --- a/packages/applications/legacy/src/views/components/UI/molecules/Accordeon.tsx +++ /dev/null @@ -1,65 +0,0 @@ -import React, { ComponentProps, FC, ReactNode, useEffect, useRef, useState } from 'react'; -import { AddIcon, SubtractIcon } from '../atoms/icons'; - -type AccordeonProps = ComponentProps<'div'> & { - title: ReactNode; - defaultOpen?: boolean; - children: ReactNode; - changeVisibleState?: (visible: boolean) => void; -}; - -export const Accordeon: FC = ({ - title, - defaultOpen = false, - changeVisibleState, - children, - className, - ...props -}: AccordeonProps) => { - const [visible, setVisible] = useState(defaultOpen); - - const handleChangeVisibility = (state: boolean) => { - setVisible(state); - changeVisibleState && changeVisibleState(state); - }; - - useEffect(() => { - handleChangeVisibility(defaultOpen); - }, [defaultOpen]); - - const ref = useRef(null); - - const handleKeyDown = (event: React.KeyboardEvent) => { - if (event.key === 'Enter' || event.key === ' ') { - event.preventDefault(); - handleChangeVisibility(!visible); - } - }; - - return ( -
-
handleChangeVisibility(!visible)} - onKeyDown={(event) => handleKeyDown(event)} - tabIndex={0} - aria-haspopup="true" - > - {title} - {visible ? ( - - ) : ( - - )} -
- {visible &&
{children}
} -
- ); -}; diff --git a/packages/applications/legacy/src/views/components/UI/molecules/Alertes/AlertBox.tsx b/packages/applications/legacy/src/views/components/UI/molecules/Alertes/AlertBox.tsx deleted file mode 100644 index 72b5cab3a6d..00000000000 --- a/packages/applications/legacy/src/views/components/UI/molecules/Alertes/AlertBox.tsx +++ /dev/null @@ -1,11 +0,0 @@ -import React, { ComponentProps, FC } from 'react'; -import { Alerte } from './Alerte'; - -type AlertBoxProps = ComponentProps<'div'> & { title?: string }; - -export const AlertBox: FC = ({ - title, - children, - className = '', - ...props -}: AlertBoxProps) => ; diff --git a/packages/applications/legacy/src/views/components/UI/molecules/Alertes/Alerte.tsx b/packages/applications/legacy/src/views/components/UI/molecules/Alertes/Alerte.tsx deleted file mode 100644 index a447df2f6c3..00000000000 --- a/packages/applications/legacy/src/views/components/UI/molecules/Alertes/Alerte.tsx +++ /dev/null @@ -1,73 +0,0 @@ -import React, { ComponentProps, FC } from 'react'; -import { ErrorIcon, InfoIcon, SuccessIcon, WarningIcon } from '../../atoms'; - -type TypesAlerte = 'Erreur' | 'Succès' | 'Information' | 'Attention'; - -type AlerteProps = ComponentProps<'div'> & { - type: TypesAlerte; - title?: string; -}; - -type PictoAlerteProps = ComponentProps<'svg'> & { - type: TypesAlerte; -}; - -const PictoAlerte: FC = ({ type, className = '' }) => { - switch (type) { - case 'Erreur': - return ; - case 'Succès': - return ; - case 'Information': - return ; - case 'Attention': - return ; - } -}; - -const couleurs: Record = { - Attention: { - backgroundColor: 'bg-warning-425-base', - borderColor: 'border-warning-425-base', - }, - Erreur: { - backgroundColor: 'bg-error-425-base', - borderColor: 'border-error-425-base', - }, - Information: { - backgroundColor: 'bg-info-425-base', - borderColor: 'border-info-425-base', - }, - Succès: { - backgroundColor: 'bg-success-425-base', - borderColor: 'border-success-425-base', - }, -}; - -export const Alerte: FC = ({ - type, - title, - children, - className = '', - ...props -}: AlerteProps) => { - const { backgroundColor, borderColor } = couleurs[type]; - const petiteAlerte = !title; - - return ( -
-
-
- -
-
- {title &&
{title}
} - {children} -
-
-
- ); -}; diff --git a/packages/applications/legacy/src/views/components/UI/molecules/Alertes/ErrorBox.tsx b/packages/applications/legacy/src/views/components/UI/molecules/Alertes/ErrorBox.tsx deleted file mode 100644 index a966161f93d..00000000000 --- a/packages/applications/legacy/src/views/components/UI/molecules/Alertes/ErrorBox.tsx +++ /dev/null @@ -1,11 +0,0 @@ -import React, { ComponentProps, FC } from 'react'; -import { Alerte } from './Alerte'; - -type AlertBoxProps = ComponentProps<'div'> & { title?: string }; - -export const ErrorBox: FC = ({ - title, - children, - className = '', - ...props -}: AlertBoxProps) => ; diff --git a/packages/applications/legacy/src/views/components/UI/molecules/Alertes/InfoBox.tsx b/packages/applications/legacy/src/views/components/UI/molecules/Alertes/InfoBox.tsx deleted file mode 100644 index f962ad98654..00000000000 --- a/packages/applications/legacy/src/views/components/UI/molecules/Alertes/InfoBox.tsx +++ /dev/null @@ -1,8 +0,0 @@ -import React, { ComponentProps } from 'react'; -import { Alerte } from './Alerte'; - -export type InfoBoxProps = ComponentProps<'div'> & { title?: string }; - -export const InfoBox = ({ title, children, className = '', ...props }: InfoBoxProps) => ( - -); diff --git a/packages/applications/legacy/src/views/components/UI/molecules/Alertes/SuccessBox.tsx b/packages/applications/legacy/src/views/components/UI/molecules/Alertes/SuccessBox.tsx deleted file mode 100644 index d792e380330..00000000000 --- a/packages/applications/legacy/src/views/components/UI/molecules/Alertes/SuccessBox.tsx +++ /dev/null @@ -1,20 +0,0 @@ -import React, { ComponentProps, FC, useEffect } from 'react'; -import { Alerte } from './Alerte'; - -type AlertBoxProps = ComponentProps<'div'> & { title?: string }; - -export const SuccessBox: FC = ({ - title, - children, - className = '', - ...props -}: AlertBoxProps) => { - useEffect(() => { - window.scrollTo({ - top: 0, - left: 0, - }); - }, []); - - return ; -}; diff --git a/packages/applications/legacy/src/views/components/UI/molecules/Alertes/index.ts b/packages/applications/legacy/src/views/components/UI/molecules/Alertes/index.ts deleted file mode 100644 index 25f614e5f19..00000000000 --- a/packages/applications/legacy/src/views/components/UI/molecules/Alertes/index.ts +++ /dev/null @@ -1,4 +0,0 @@ -export * from './AlertBox'; -export * from './ErrorBox'; -export * from './InfoBox'; -export * from './SuccessBox'; diff --git a/packages/applications/legacy/src/views/components/UI/molecules/Buttons/PrimaryButton.tsx b/packages/applications/legacy/src/views/components/UI/molecules/Buttons/PrimaryButton.tsx deleted file mode 100644 index 093992d4676..00000000000 --- a/packages/applications/legacy/src/views/components/UI/molecules/Buttons/PrimaryButton.tsx +++ /dev/null @@ -1,22 +0,0 @@ -import React, { ComponentProps, FC } from 'react'; -import { ConfirmationProp } from '../../../../helpers'; -import { Button } from '../../atoms/Button'; - -export type PrimaryButtonProps = ComponentProps<'button'> & ConfirmationProp; - -export const PrimaryButton: FC = ({ - children, - className = '', - confirmation = undefined, - ...props -}) => ( - -); diff --git a/packages/applications/legacy/src/views/components/UI/molecules/Buttons/SecondaryButton.tsx b/packages/applications/legacy/src/views/components/UI/molecules/Buttons/SecondaryButton.tsx deleted file mode 100644 index 1edf89b5320..00000000000 --- a/packages/applications/legacy/src/views/components/UI/molecules/Buttons/SecondaryButton.tsx +++ /dev/null @@ -1,21 +0,0 @@ -import { ConfirmationProp } from '../../../../helpers'; -import React, { ComponentProps, FC } from 'react'; -import { Button } from '../../atoms/Button'; - -export type SecondaryButtonProps = Omit, 'disabled'> & ConfirmationProp; - -export const SecondaryButton: FC = ({ - children, - className = '', - confirmation = undefined, - ...props -}) => ( - -); diff --git a/packages/applications/legacy/src/views/components/UI/molecules/Buttons/index.ts b/packages/applications/legacy/src/views/components/UI/molecules/Buttons/index.ts deleted file mode 100644 index eda77e5839a..00000000000 --- a/packages/applications/legacy/src/views/components/UI/molecules/Buttons/index.ts +++ /dev/null @@ -1,2 +0,0 @@ -export * from './PrimaryButton'; -export * from './SecondaryButton'; diff --git a/packages/applications/legacy/src/views/components/UI/molecules/DownloadLink.tsx b/packages/applications/legacy/src/views/components/UI/molecules/DownloadLink.tsx deleted file mode 100644 index 7212f0d7d30..00000000000 --- a/packages/applications/legacy/src/views/components/UI/molecules/DownloadLink.tsx +++ /dev/null @@ -1,14 +0,0 @@ -import React, { ComponentProps, FC } from 'react'; -import { Link, FileDownloadIcon } from '../atoms'; - -type DownloadLinkProps = ComponentProps<'a'> & { - className?: string; - fileUrl: string; -}; - -export const DownloadLink: FC = ({ children, className, fileUrl, ...props }) => ( - - - {children} - -); diff --git a/packages/applications/legacy/src/views/components/UI/molecules/DownloadLinkButton.tsx b/packages/applications/legacy/src/views/components/UI/molecules/DownloadLinkButton.tsx deleted file mode 100644 index 813c4368e75..00000000000 --- a/packages/applications/legacy/src/views/components/UI/molecules/DownloadLinkButton.tsx +++ /dev/null @@ -1,19 +0,0 @@ -import React, { FC } from 'react'; -import { LinkButton, FileDownloadIcon } from '../atoms'; - -type DownloadLinkButtonProps = { - className?: string; - fileUrl: string; - children: React.ReactNode; -}; - -export const DownloadLinkButton: FC = ({ - children, - className, - fileUrl, -}) => ( - - - {children} - -); diff --git a/packages/applications/legacy/src/views/components/UI/molecules/InputFile.tsx b/packages/applications/legacy/src/views/components/UI/molecules/InputFile.tsx deleted file mode 100644 index 21b30ca0208..00000000000 --- a/packages/applications/legacy/src/views/components/UI/molecules/InputFile.tsx +++ /dev/null @@ -1,37 +0,0 @@ -import React from 'react'; -import { Input, LabelDescription } from '../atoms'; - -const FILE_SIZE_LIMIT_IN_MB = 25; - -type InputFileProps = { - id?: string; - name?: string; - required?: boolean; - disabled?: boolean; - className?: string; -}; - -export const InputFile = ({ - id = 'file', - name = 'file', - required = true, - disabled, - className, -}: InputFileProps) => { - return ( -
- - - Taille maximale du fichier : {FILE_SIZE_LIMIT_IN_MB} Mo - -
- ); -}; diff --git a/packages/applications/legacy/src/views/components/UI/molecules/PreviewLinkButton.tsx b/packages/applications/legacy/src/views/components/UI/molecules/PreviewLinkButton.tsx deleted file mode 100644 index 14e76da9e60..00000000000 --- a/packages/applications/legacy/src/views/components/UI/molecules/PreviewLinkButton.tsx +++ /dev/null @@ -1,15 +0,0 @@ -import React, { FC } from 'react'; -import { LinkButton, FilePreviewIcon } from '../atoms'; - -type PreviewLinkButtonProps = { - className?: string; - fileUrl: string; - children: React.ReactNode; -}; - -export const PreviewLinkButton: FC = ({ children, className, fileUrl }) => ( - - - {children} - -); diff --git a/packages/applications/legacy/src/views/components/UI/molecules/Radio.tsx b/packages/applications/legacy/src/views/components/UI/molecules/Radio.tsx deleted file mode 100644 index 50b05b9a099..00000000000 --- a/packages/applications/legacy/src/views/components/UI/molecules/Radio.tsx +++ /dev/null @@ -1,40 +0,0 @@ -import React, { ComponentProps } from 'react'; -import { Label } from '../atoms/Label'; - -type RadioProps = Omit, 'type'> & { id: string }; - -export const Radio: React.FC = ({ children, className = '', ...props }) => ( - <> - - - -); diff --git a/packages/applications/legacy/src/views/components/UI/molecules/Section.tsx b/packages/applications/legacy/src/views/components/UI/molecules/Section.tsx deleted file mode 100644 index da141f52fda..00000000000 --- a/packages/applications/legacy/src/views/components/UI/molecules/Section.tsx +++ /dev/null @@ -1,25 +0,0 @@ -import { Heading2 } from '../..'; -import React, { ComponentProps } from 'react'; - -type SectionProps = ComponentProps<'div'> & { - title: string; - icon?: React.ReactNode; - children: React.ReactNode; -}; - -export const Section = ({ title, children, icon, className = '', ...props }: SectionProps) => ( -
- - {icon && ( - - {icon} - - )} - {title} - - {children} -
-); diff --git a/packages/applications/legacy/src/views/components/UI/molecules/index.ts b/packages/applications/legacy/src/views/components/UI/molecules/index.ts index 3d3ddf01715..9e3f97cde27 100644 --- a/packages/applications/legacy/src/views/components/UI/molecules/index.ts +++ b/packages/applications/legacy/src/views/components/UI/molecules/index.ts @@ -1,12 +1,3 @@ -export * from './Alertes'; -export * from './DownloadLink'; -export * from './DownloadLinkButton'; export * from './dropdowns'; export * from './ExternalLink'; -export * from './InputFile'; -export * from './Section'; -export * from './Buttons'; -export * from './Radio'; export * from './Checkbox'; -export * from './Accordeon'; -export * from './PreviewLinkButton'; diff --git a/packages/applications/legacy/src/views/components/UI/organisms/Footer.tsx b/packages/applications/legacy/src/views/components/UI/organisms/Footer.tsx index 38e58e5940a..51696c57658 100644 --- a/packages/applications/legacy/src/views/components/UI/organisms/Footer.tsx +++ b/packages/applications/legacy/src/views/components/UI/organisms/Footer.tsx @@ -1,5 +1,4 @@ import React from 'react'; -import routes from '../../../../routes'; import { ExternalLinkIcon, Link } from '../..'; diff --git a/packages/applications/legacy/src/views/components/UI/organisms/MetabaseStats.tsx b/packages/applications/legacy/src/views/components/UI/organisms/MetabaseStats.tsx deleted file mode 100644 index 5dba4f15746..00000000000 --- a/packages/applications/legacy/src/views/components/UI/organisms/MetabaseStats.tsx +++ /dev/null @@ -1,26 +0,0 @@ -import React from 'react'; - -type MetabaseStatsProps = { - iframeUrl: string; -}; - -export const MetabaseStats: React.FC = ({ iframeUrl }) => { - const iframeRef = React.useRef(null); - - React.useEffect(() => { - if (!iframeRef.current) return; - const onLoad = function () { - (window as any).iFrameResize({}, this); - }; - iframeRef.current.addEventListener('load', onLoad); - return () => { - iframeRef.current?.removeEventListener('load', onLoad); - }; - }, []); - - return ( -
-