mirror of
https://github.com/R0m1k3/CollectFlow.git
synced 2026-10-16 19:59:30 +02:00
feat(commandes-auto): cadencier d'alertes de commande par fournisseur et magasin
Ajoute un onglet "Cadencier / Alertes" dans la page Commandes auto. Depuis la liste des fournisseurs, on active un fournisseur en alerte de commande sur un magasin (292/579) avec une fréquence en X semaines, gérée indépendamment par magasin. L'échéance est calculée à partir de la dernière réception réelle (mvtart, genremvt 1/2, fournisseur principal artfou1.preference=1) + X semaines. Statut: à commander / bientôt / OK, avec temps restant. - Table commande_cadences (schema + db-init) - pgGetDerniereReceptionParFournisseur (mvtart par fournisseur/site) - Server actions CRUD (list/upsert/toggle/remove) - UI à onglets + cadencier (ajout, édition intervalle, activer/supprimer)
This commit is contained in:
7 files changed
+668
-4
No files matched your search
+28
-1
@@ -1,4 +1,4 @@
|
||||
import { pgTable, serial, varchar, numeric, smallint, timestamp, uniqueIndex, index, text, jsonb, integer } from "drizzle-orm/pg-core";
|
||||
import { pgTable, serial, varchar, numeric, smallint, timestamp, uniqueIndex, index, text, jsonb, integer, boolean } from "drizzle-orm/pg-core";
|
||||
|
||||
export const ventesProduits = pgTable("ventes_produits", {
|
||||
id: serial("id").primaryKey(),
|
||||
@@ -77,6 +77,33 @@ export const sessionSnapshots = pgTable("session_snapshots", {
|
||||
createdAt: timestamp("created_at").defaultNow(),
|
||||
});
|
||||
|
||||
/**
|
||||
* Cadencier / alertes de commande par fournisseur ET par magasin.
|
||||
* Un fournisseur peut être cadencé indépendamment sur chaque site (292/579)
|
||||
* avec un intervalle propre (toutes les X semaines). L'échéance est calculée
|
||||
* à partir de la dernière commande réelle (FF Nancy) + intervalle.
|
||||
*/
|
||||
export const commandeCadences = pgTable("commande_cadences", {
|
||||
id: serial("id").primaryKey(),
|
||||
/** Code fournisseur (fouident.code) */
|
||||
codeFournisseur: varchar("code_fournisseur", { length: 20 }).notNull(),
|
||||
/** Nom fournisseur dénormalisé pour l'affichage */
|
||||
nomFournisseur: varchar("nom_fournisseur", { length: 255 }),
|
||||
/** Site / magasin : "292" | "579" */
|
||||
site: varchar("site", { length: 20 }).notNull(),
|
||||
/** Fréquence de commande, en semaines */
|
||||
intervalleSemaines: integer("intervalle_semaines").notNull(),
|
||||
/** Cadence active ou non */
|
||||
actif: boolean("actif").default(true).notNull(),
|
||||
createdAt: timestamp("created_at").defaultNow(),
|
||||
updatedAt: timestamp("updated_at").defaultNow(),
|
||||
}, (table) => {
|
||||
return [
|
||||
uniqueIndex("uq_cadence_fou_site").on(table.codeFournisseur, table.site),
|
||||
index("idx_cadence_site").on(table.site),
|
||||
];
|
||||
});
|
||||
|
||||
/** AI Context rules per supplier (Epic: AI Context) */
|
||||
export const aiSupplierContext = pgTable("ai_supplier_context", {
|
||||
/** Supplier code serving as the primary key */
|
||||
|
||||
Reference in new issue
Block a user