feat(r3.4): corrections de recette (8 écarts) + recherche globale ⌘K

Arbitrage du référent sur la revue pixel : tout corriger, activer la
recherche.

- Stock : filtre fournisseur, sous-seuil en tête, « Entrée de stock »
  depuis la liste ; fiche pièce : fournisseur → lien Tiers.
- Statistiques : période 3/6/12 mois (paramètre months au contrat).
- Tiers : rattachements syndic→site (migration r3_recette_fixes,
  Location.partnerId gardé CLIENT), éditable sur la fiche site, seedé.
- Bibliothèque : filtre « Rattaché à » + glisser-déposer (modale
  préremplie, rattachement toujours requis).
- Recherche globale : GET /search (73 opérations) — familles OT/
  ascenseurs/sites filtrées par la matrice, « voir autre » respecté ;
  topbar ⌘K, debounce, résultats groupés, navigation clavier.

74 tests API (8 nouveaux sur le scoping de la recherche), 14/14
Playwright dont un parcours « recette corrigée », 18/18 contrôles en
navigateur réel, zéro erreur console.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
pr-daaif
2026-07-17 02:14:43 +01:00
parent c46a97ed08
commit 460ef4a80e
38 changed files with 1318 additions and 65 deletions

View File

@@ -441,6 +441,23 @@ export interface paths {
patch?: never;
trace?: never;
};
"/search": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
/** Recherche globale (OT, ascenseurs, sites) — chaque famille filtrée par la matrice */
get: operations["globalSearch"];
put?: never;
post?: never;
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/partners": {
parameters: {
query?: never;
@@ -1101,6 +1118,8 @@ export interface components {
guardianPhone: string | null;
latitude: number | null;
longitude: number | null;
partnerId: string | null;
partnerName: string | null;
assetCount: number;
}[];
};
@@ -1115,6 +1134,8 @@ export interface components {
guardianPhone: string | null;
latitude: number | null;
longitude: number | null;
partnerId: string | null;
partnerName: string | null;
assetCount: number;
};
LocationCreate: {
@@ -1127,6 +1148,7 @@ export interface components {
guardianPhone?: string;
latitude?: number;
longitude?: number;
partnerId?: string | null;
};
LocationUpdate: {
name?: string;
@@ -1138,6 +1160,7 @@ export interface components {
guardianPhone?: string;
latitude?: number;
longitude?: number;
partnerId?: string | null;
};
AssetsResponse: {
assets: {
@@ -1397,9 +1420,10 @@ export interface components {
createdAt: string;
};
AnalyticsSummary: {
months: number;
monthCost: number;
previousMonthCost: number;
closed12m: {
closed: {
total: number;
preventive: number;
};
@@ -1422,6 +1446,30 @@ export interface components {
total: number;
}[];
};
SearchResponse: {
workOrders: {
/** Format: uuid */
id: string;
reference: string;
title: string;
/** @enum {string} */
status: "OPEN" | "IN_PROGRESS" | "ON_HOLD" | "DONE" | "CANCELLED";
}[];
assets: {
/** Format: uuid */
id: string;
reference: string;
brand: string;
model: string | null;
siteName: string;
}[];
sites: {
/** Format: uuid */
id: string;
name: string;
city: string | null;
}[];
};
PartnersResponse: {
partners: {
/** Format: uuid */
@@ -1435,6 +1483,7 @@ export interface components {
city: string | null;
isActive: boolean;
openOrders: number;
siteNames: string[];
}[];
};
Partner: {
@@ -1449,6 +1498,7 @@ export interface components {
city: string | null;
isActive: boolean;
openOrders: number;
siteNames: string[];
};
PartnerCreate: {
name: string;
@@ -2889,7 +2939,9 @@ export interface operations {
};
getAnalyticsSummary: {
parameters: {
query?: never;
query?: {
months?: string;
};
header?: never;
path?: never;
cookie?: never;
@@ -2907,6 +2959,28 @@ export interface operations {
};
};
};
globalSearch: {
parameters: {
query: {
q: string;
};
header?: never;
path?: never;
cookie?: never;
};
requestBody?: never;
responses: {
/** @description Résultats (5 max par famille) */
200: {
headers: {
[name: string]: unknown;
};
content: {
"application/json": components["schemas"]["SearchResponse"];
};
};
};
};
listPartners: {
parameters: {
query?: never;