diff --git a/src/backend/infrastructure/controllers/rechercheAvanceeEndpoint.ts b/src/backend/infrastructure/controllers/rechercheAvanceeEndpoint.ts index 33ddc584b..16229dcb1 100644 --- a/src/backend/infrastructure/controllers/rechercheAvanceeEndpoint.ts +++ b/src/backend/infrastructure/controllers/rechercheAvanceeEndpoint.ts @@ -10,6 +10,7 @@ export async function rechercheAvanceeParmiLesEntitésEtÉtablissementsEndpoint( dependencies: Dependencies, terme: string, zone: string, + zoneD: string, typeZone: string, type: string, statutJuridique: string[], @@ -21,7 +22,7 @@ export async function rechercheAvanceeParmiLesEntitésEtÉtablissementsEndpoint( try { const rechercheAvanceeParmiLesEntitésEtÉtablissementsUseCase = new RechercheAvanceeParmiLesEntitésEtÉtablissementsUseCase(dependencies.rechercheLoader); - return await rechercheAvanceeParmiLesEntitésEtÉtablissementsUseCase.exécute(terme, zone, typeZone, type, statutJuridique, capaciteSMS, orderBy, order, page); + return await rechercheAvanceeParmiLesEntitésEtÉtablissementsUseCase.exécute(terme, zone, zoneD, typeZone, type, statutJuridique, capaciteSMS, orderBy, order, page); } catch (error) { dependencies.logger.error(error); throw error; diff --git a/src/backend/infrastructure/gateways/recherche-loader/TypeOrmRechercheAvanceeLoader.test.ts b/src/backend/infrastructure/gateways/recherche-loader/TypeOrmRechercheAvanceeLoader.test.ts index 1003bc5a5..603e590d3 100644 --- a/src/backend/infrastructure/gateways/recherche-loader/TypeOrmRechercheAvanceeLoader.test.ts +++ b/src/backend/infrastructure/gateways/recherche-loader/TypeOrmRechercheAvanceeLoader.test.ts @@ -102,7 +102,8 @@ describe("La recherche avancée d’entités et d’établissements", () => { const typeOrmRechercheLoader = new TypeOrmRechercheLoader(orm); // WHEN - const rechercheAvancee = await typeOrmRechercheLoader.rechercheAvancee(termeRecherche, communeRecherche, "C", "", [], [], "", "ASC", premièrePage); + const rechercheAvancee = await typeOrmRechercheLoader.rechercheAvancee(termeRecherche, communeRecherche, departementRecherche, "C", "", [], [], "", "ASC", premièrePage); + //THEN expect(rechercheAvancee.nombreDeRésultats).toBe("4"); @@ -113,7 +114,8 @@ describe("La recherche avancée d’entités et d’établissements", () => { const typeOrmRechercheLoader = new TypeOrmRechercheLoader(orm); // WHEN - const rechercheAvancee = await typeOrmRechercheLoader.rechercheAvancee(termeRecherche, departementRecherche, "D", "", [], [], "", "ASC", premièrePage); + const rechercheAvancee = await typeOrmRechercheLoader.rechercheAvancee(termeRecherche, departementRecherche, "", "D", "", [], [], "", "ASC", premièrePage); + //THEN expect(rechercheAvancee.nombreDeRésultats).toBe("4"); @@ -124,7 +126,8 @@ describe("La recherche avancée d’entités et d’établissements", () => { const typeOrmRechercheLoader = new TypeOrmRechercheLoader(orm); // WHEN - const rechercheAvancee = await typeOrmRechercheLoader.rechercheAvancee(termeRecherche, regionRecherche, "R", "", [], [], "", "ASC", premièrePage); + const rechercheAvancee = await typeOrmRechercheLoader.rechercheAvancee(termeRecherche, regionRecherche, "", "R", "", [], [], "", "ASC", premièrePage); + //THEN expect(rechercheAvancee.nombreDeRésultats).toBe("3"); @@ -138,6 +141,7 @@ describe("La recherche avancée d’entités et d’établissements", () => { const rechercheAvancee = await typeOrmRechercheLoader.rechercheAvancee( termeRecherche, communeRecherche, + departementRecherche, "C", "Médico-social", [], @@ -156,7 +160,7 @@ describe("La recherche avancée d’entités et d’établissements", () => { const typeOrmRechercheLoader = new TypeOrmRechercheLoader(orm); // WHEN - const rechercheAvancee = await typeOrmRechercheLoader.rechercheAvancee("", communeRecherche, "", "Médico-social", [], [], "", "ASC", premièrePage); + const rechercheAvancee = await typeOrmRechercheLoader.rechercheAvancee("", communeRecherche, departementRecherche, "C", "Médico-social", [], [], "", "ASC", premièrePage); //THEN expect(rechercheAvancee.nombreDeRésultats).toBe("2"); @@ -170,6 +174,7 @@ describe("La recherche avancée d’entités et d’établissements", () => { const rechercheAvancee = await typeOrmRechercheLoader.rechercheAvancee( termeRecherche, communeRecherche, + departementRecherche, "C", "Entité juridique", ["prive_lucratif"], @@ -192,6 +197,7 @@ describe("La recherche avancée d’entités et d’établissements", () => { termeRecherche, "", "", + "", "Entité juridique", ["prive_lucratif"], [], @@ -230,7 +236,8 @@ describe("La recherche avancée d’entités et d’établissements", () => { const rechercheAvancee = await typeOrmRechercheLoader.rechercheAvancee( "", communeRecherche, - "", + departementRecherche, + "C", "", [], [ @@ -254,7 +261,8 @@ describe("La recherche avancée d’entités et d’établissements", () => { const rechercheAvancee = await typeOrmRechercheLoader.rechercheAvancee( termeRecherche, communeRecherche, - "", + departementRecherche, + "C", "", [], [ diff --git a/src/backend/infrastructure/gateways/recherche-loader/TypeOrmRechercheLoader.ts b/src/backend/infrastructure/gateways/recherche-loader/TypeOrmRechercheLoader.ts index c5212fe75..41d61a08b 100644 --- a/src/backend/infrastructure/gateways/recherche-loader/TypeOrmRechercheLoader.ts +++ b/src/backend/infrastructure/gateways/recherche-loader/TypeOrmRechercheLoader.ts @@ -55,6 +55,7 @@ export class TypeOrmRechercheLoader implements RechercheLoader { async rechercheAvancee( terme: string, zone: string, + zoneD: string, typeZone: string, type: string, statutJuridique: string[], @@ -63,6 +64,7 @@ export class TypeOrmRechercheLoader implements RechercheLoader { order: OrderDir, page: number ): Promise { + const termeSansEspaces = terme.replaceAll(/\s/g, ""); const termeSansTirets = terme.replaceAll(/-/g, " "); const zoneParam = zone @@ -74,6 +76,11 @@ export class TypeOrmRechercheLoader implements RechercheLoader { .replace(/\b(?:-|')\b/gi, " ") .toLocaleUpperCase() : ""; + const zoneDParam = typeZone === 'C' ? zoneD.normalize("NFD") + .replace(/[\u0300-\u036f]/g, "") + .replace(/\b(?:-|')\b/gi, " ") + .toLocaleUpperCase() : ''; + const conditions = []; let parameters: any = {}; @@ -112,7 +119,8 @@ export class TypeOrmRechercheLoader implements RechercheLoader { parameters = { ...parameters, commune: `%${zoneParam}%ARRONDISSEMENT%` }; } else { conditions.push("recherche.commune = :commune"); - parameters = { ...parameters, commune: zoneParam }; + conditions.push("recherche.departement = :departement"); + parameters = { ...parameters, commune: zoneParam, departement: zoneDParam }; } } if (typeZone === "D") { diff --git "a/src/backend/m\303\251tier/gateways/RechercheLoader.ts" "b/src/backend/m\303\251tier/gateways/RechercheLoader.ts" index 0865e976d..c8821a2f3 100644 --- "a/src/backend/m\303\251tier/gateways/RechercheLoader.ts" +++ "b/src/backend/m\303\251tier/gateways/RechercheLoader.ts" @@ -6,6 +6,7 @@ export interface RechercheLoader { rechercheAvancee( terme: string, zone: string, + zoneD: string, typeZone: string, type: string, statutJuridique: string[], diff --git "a/src/backend/m\303\251tier/use-cases/RechercheAvanceeParmiLesEntit\303\251sEt\303\211tablissementsUseCase.ts" "b/src/backend/m\303\251tier/use-cases/RechercheAvanceeParmiLesEntit\303\251sEt\303\211tablissementsUseCase.ts" index 4e5adcb3f..aa988e415 100644 --- "a/src/backend/m\303\251tier/use-cases/RechercheAvanceeParmiLesEntit\303\251sEt\303\211tablissementsUseCase.ts" +++ "b/src/backend/m\303\251tier/use-cases/RechercheAvanceeParmiLesEntit\303\251sEt\303\211tablissementsUseCase.ts" @@ -13,6 +13,7 @@ export class RechercheAvanceeParmiLesEntitésEtÉtablissementsUseCase { async exécute( terme: string, zone: string, + zoneD: string, typeZone: string, type: string, statutJuridique: string[], @@ -21,6 +22,6 @@ export class RechercheAvanceeParmiLesEntitésEtÉtablissementsUseCase { order: OrderDir, page: number ): Promise { - return await this.rechercheLoader.rechercheAvancee(terme, zone, typeZone, type, statutJuridique, capaciteSMS, orderBy, order, page); + return await this.rechercheLoader.rechercheAvancee(terme, zone, zoneD, typeZone, type, statutJuridique, capaciteSMS, orderBy, order, page); } } diff --git a/src/frontend/ui/commun/contexts/RechercheAvanceeContext.tsx b/src/frontend/ui/commun/contexts/RechercheAvanceeContext.tsx index 41ac25e75..df3db7e5d 100644 --- a/src/frontend/ui/commun/contexts/RechercheAvanceeContext.tsx +++ b/src/frontend/ui/commun/contexts/RechercheAvanceeContext.tsx @@ -5,6 +5,7 @@ export interface RechercheAvanceeContextValue { termeFixe: string; page: number; zoneGeo: string; + zoneGeoD: string; zoneGeoType: string; zoneGeoLabel: string; typeStructure: string; @@ -18,6 +19,7 @@ export interface RechercheAvanceeContextValue { setTermeFixe: (terme: string) => void; setPage: (page: number, shallow?: boolean) => void; setZoneGeo: (zoneGeo: string) => void; + setZoneGeoD: (zoneGeoD: string) => void; setZoneGeoType: (zoneGeo: string) => void; setZoneGeoLabel: (zoneGeo: string) => void; setTypeStructure: (typeStructure: string) => void; diff --git a/src/frontend/ui/commun/contexts/RechercheAvanceeContextProvider.tsx b/src/frontend/ui/commun/contexts/RechercheAvanceeContextProvider.tsx index 1312f3b45..a920eb692 100644 --- a/src/frontend/ui/commun/contexts/RechercheAvanceeContextProvider.tsx +++ b/src/frontend/ui/commun/contexts/RechercheAvanceeContextProvider.tsx @@ -11,6 +11,7 @@ interface SearchParams { terme?: string; page?: number; zoneGeo?: string; + zoneGeoD?: string; zoneGeoType?: string; zoneGeoLabel?: string; typeStructure?: string; @@ -31,6 +32,7 @@ export const RechecheAvanceeContextProvider = ({ children }: RechercheAvanceePro terme: parseAsString.withDefault(""), page: parseAsInteger.withDefault(1), zoneGeo: parseAsString.withDefault(""), + zoneGeoD: parseAsString.withDefault(""), zoneGeoType: parseAsString.withDefault(""), zoneGeoLabel: parseAsString.withDefault(""), typeStructure: parseAsString.withDefault(""), @@ -44,6 +46,7 @@ export const RechecheAvanceeContextProvider = ({ children }: RechercheAvanceePro { urlKeys: { zoneGeo: "zone", + zoneGeoD: "zoneD", zoneGeoType: "typeZone", zoneGeoLabel: 'zoneLabel', typeStructure: "type", @@ -69,6 +72,7 @@ export const RechecheAvanceeContextProvider = ({ children }: RechercheAvanceePro ...searchParams, termeFixe, setZoneGeo: (value) => updateSearchParams({ zoneGeo: value, page: initialPage }), + setZoneGeoD: (value) => updateSearchParams({ zoneGeoD: value, page: initialPage }), setZoneGeoType: (value) => updateSearchParams({ zoneGeoType: value, page: initialPage }), setZoneGeoLabel: (value) => updateSearchParams({ zoneGeoLabel: value, page: initialPage }), setTypeStructure: (value) => updateSearchParams({ typeStructure: value, page: initialPage }), diff --git a/src/frontend/ui/recherche-avancee/FiltreZoneGeographique.tsx b/src/frontend/ui/recherche-avancee/FiltreZoneGeographique.tsx index cfc7f12f9..fe1da9cac 100644 --- a/src/frontend/ui/recherche-avancee/FiltreZoneGeographique.tsx +++ b/src/frontend/ui/recherche-avancee/FiltreZoneGeographique.tsx @@ -7,6 +7,10 @@ import styles from "./RechercheAvanceeFormulaire.module.css"; type ZoneGeo = Readonly<{ type: string; nom: string; + departement: { + code: string; + nom: string; + }, code: string; codeRegion: string; codesPostaux: string[]; @@ -23,6 +27,10 @@ export const FiltreZoneGeographique = () => { const [zoneGeoSelected, setZoneGeoSelected] = useState({ type: "", nom: "", + departement: { + code: "", + nom: "" + }, code: "", codeRegion: "", codesPostaux: [], @@ -155,6 +163,7 @@ export const FiltreZoneGeographique = () => { }; const applyZoneGeoValue = () => { + rechercheAvanceeContext?.setZoneGeoD(zoneGeoType === "C" ? zoneGeoSelected?.departement.nom : ''); rechercheAvanceeContext?.setZoneGeo(zoneGeoType === "R" ? zoneGeoSelected?.codeRegion : zoneGeoValue); rechercheAvanceeContext?.setZoneGeoType(zoneGeoType); rechercheAvanceeContext?.setZoneGeoLabel(zoneGeoSelected.codeNum ? `${zoneGeoSelected.nom} (${zoneGeoSelected.codeNum})` : zoneGeoSelected.nom); diff --git a/src/pages/api/recherche-avancee.ts b/src/pages/api/recherche-avancee.ts index 54fbb24b4..6834fc74b 100644 --- a/src/pages/api/recherche-avancee.ts +++ b/src/pages/api/recherche-avancee.ts @@ -9,7 +9,7 @@ export default async function handler(request: NextApiRequest, response: NextApi } - const { terme, zone, typeZone, type, statutJuridique, capaciteSMS, orderBy, order, page } = request.body; - const recherche = await rechercheAvanceeParmiLesEntitésEtÉtablissementsEndpoint(dependencies, terme, zone, typeZone, type, statutJuridique, capaciteSMS, order, orderBy, page); + const { terme, zone, zoneD, typeZone, type, statutJuridique, capaciteSMS, orderBy, order, page } = request.body; + const recherche = await rechercheAvanceeParmiLesEntitésEtÉtablissementsEndpoint(dependencies, terme, zone, zoneD, typeZone, type, statutJuridique, capaciteSMS, order, orderBy, page); response.status(200).json(recherche); } diff --git a/src/pages/recherche-avancee.tsx b/src/pages/recherche-avancee.tsx index 40c54727c..bb38e4c03 100644 --- a/src/pages/recherche-avancee.tsx +++ b/src/pages/recherche-avancee.tsx @@ -64,6 +64,7 @@ export async function getServerSideProps(context: GetServerSidePropsContext): Pr query: { terme = "", zone = "", + zoneD = "", typeZone = "", page = 1, statuts = [], @@ -78,6 +79,7 @@ export async function getServerSideProps(context: GetServerSidePropsContext): Pr const pageParam = Number(page); const termeParam = String(terme); const zoneParam = String(zone); + const zoneDParam = String(zoneD); const typeZoneParam = String(typeZone); const typeParam = String(type); const orderParam = String(order) as OrderDir; @@ -108,6 +110,7 @@ export async function getServerSideProps(context: GetServerSidePropsContext): Pr dependencies, termeParam, zoneParam, + zoneDParam, typeZoneParam, typeParam, statutJuridiqueParam,