mirror of
https://github.com/R0m1k3/CollectFlow.git
synced 2026-10-21 22:18:08 +02:00
- API /api/v1 : PUT /products/:codein/gamme et POST /gammes déposent une proposition (table gammes_a_valider) au lieu d'enregistrer. La Grille la charge comme modification non enregistrée (badge « API ») : Enregistrer la valide, Annuler la rejette. Lecture : champ gammeAValider, statut a_valider dans la réponse ; OpenAPI mise à jour. - Meilleures ventes, Ventes par mois, Publicités : plus de largeur max centrée, les pages occupent toute la largeur. - Meilleures ventes : colonne Référence (référence fournisseur), recherche et export Excel compris. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01FaniLFvegAZNXFrFFSStqa
52 lines
1.8 KiB
TypeScript
52 lines
1.8 KiB
TypeScript
"use server";
|
|
|
|
import { z } from "zod";
|
|
import { verifierSession } from "@/lib/authz";
|
|
import { enregistrerGammes } from "./enregistrer-gammes";
|
|
import { supprimerGammesAValider } from "@/lib/gammes-a-valider";
|
|
|
|
const SaveDraftsSchema = z.object({
|
|
codeFournisseur: z.string(),
|
|
nomFournisseur: z.string().optional(),
|
|
magasin: z.string(),
|
|
changes: z.array(
|
|
z.object({
|
|
codein: z.string(),
|
|
codeGammeBefore: z.string().nullable(),
|
|
codeGamme: z.string(),
|
|
})
|
|
),
|
|
/**
|
|
* Propositions de l'API examinées dans la Grille : validées (présentes dans
|
|
* `changes`) ou écartées. Elles quittent la file « à valider ».
|
|
*/
|
|
gammesAValiderTraitees: z.array(z.string()).optional(),
|
|
});
|
|
|
|
export async function saveDraftChanges(
|
|
raw: unknown
|
|
): Promise<{ success: boolean; saved: number; error?: string }> {
|
|
const acces = await verifierSession();
|
|
if (!acces.ok) return { success: false, saved: 0, error: acces.message };
|
|
|
|
const parsed = SaveDraftsSchema.safeParse(raw);
|
|
if (!parsed.success) {
|
|
return { success: false, saved: 0, error: "Validation failed: " + parsed.error.message };
|
|
}
|
|
|
|
const { codeFournisseur, nomFournisseur, magasin, changes, gammesAValiderTraitees = [] } = parsed.data;
|
|
|
|
const rawUserId = acces.utilisateur.id;
|
|
const userId = rawUserId ? parseInt(rawUserId, 10) : null;
|
|
const finalUserId = userId && !isNaN(userId) ? userId : null;
|
|
|
|
try {
|
|
const saved = await enregistrerGammes({ codeFournisseur, nomFournisseur, magasin, changes, userId: finalUserId });
|
|
await supprimerGammesAValider(codeFournisseur, gammesAValiderTraitees);
|
|
return { success: true, saved };
|
|
} catch (err) {
|
|
const msg = err instanceof Error ? err.message : "Unknown error";
|
|
return { success: false, saved: 0, error: msg };
|
|
}
|
|
}
|