mirror of
https://github.com/R0m1k3/CollectFlow.git
synced 2026-10-17 12:19:50 +02:00
chore: retire la section Score des Paramètres et supprime la page Chat IA
- Section « Score Produit » retirée : elle ne faisait que décrire une formule, sans rien paramétrer. - Page /admin/ai-chat et sa route /api/admin/ai-chat supprimées, ainsi que l'entrée de menu et la section « Admin AI Chat — Fournisseur » des Paramètres, qui n'existait que pour la configurer. - Nettoyage de l'état devenu mort dans la page Paramètres : la liste des modèles Google et son chargement n'avaient plus d'interface. Effet de bord notable : tsc passe de 23 à 4 erreurs préexistantes — la page de chat en portait 19 à elle seule (flags de regex exigeant une cible es2018). Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Y26nRZxTR57K7h8yqsF675
This commit is contained in:
6 files changed
+78
-1144
No files matched your search
@@ -220,6 +220,56 @@ export const apiKeys = pgTable("api_keys", {
|
||||
revokedAt: timestamp("revoked_at"),
|
||||
});
|
||||
|
||||
/**
|
||||
* Paramétrage et suivi de la synchronisation nocturne, un enregistrement par
|
||||
* fournisseur.
|
||||
*
|
||||
* Deux sources aux coûts très différents, donc deux cadences distinctes :
|
||||
* l'instantané SQL prend une minute au pire, l'extraction Qlik jusqu'à huit —
|
||||
* et le serveur Qlik abandonne quand on le sollicite trop. D'où `actifSql` et
|
||||
* `actifQlik` séparés, et deux dates de dernier passage.
|
||||
*
|
||||
* L'ordre de passage se déduit de `dernier*At` (le plus ancien d'abord) : la
|
||||
* nuit suivante reprend donc naturellement là où la précédente s'est arrêtée,
|
||||
* et repart d'elle-même pour un nouveau tour quand tout a été traité. Aucun
|
||||
* curseur ni compteur de tour à maintenir.
|
||||
*/
|
||||
export const syncFournisseurs = pgTable("sync_fournisseurs", {
|
||||
codeFournisseur: varchar("code_fournisseur", { length: 20 }).primaryKey(),
|
||||
nomFournisseur: varchar("nom_fournisseur", { length: 255 }),
|
||||
/** Inclus dans la rotation de l'instantané SQL. */
|
||||
actifSql: boolean("actif_sql").default(true).notNull(),
|
||||
/** Inclus dans la rotation Qlik (beaucoup plus coûteuse). */
|
||||
actifQlik: boolean("actif_qlik").default(true).notNull(),
|
||||
/**
|
||||
* Renseigné quand le planificateur a désactivé le fournisseur de lui-même —
|
||||
* typiquement « aucun article ». Évite de réessayer chaque nuit un
|
||||
* fournisseur vide, tout en gardant la raison visible pour le réactiver.
|
||||
*/
|
||||
desactiveMotif: text("desactive_motif"),
|
||||
|
||||
dernierSqlAt: timestamp("dernier_sql_at"),
|
||||
/** 'succes' | 'echec' | 'vide' */
|
||||
dernierSqlStatut: varchar("dernier_sql_statut", { length: 20 }),
|
||||
dernierSqlLignes: integer("dernier_sql_lignes"),
|
||||
dernierSqlErreur: text("dernier_sql_erreur"),
|
||||
dernierSqlMs: integer("dernier_sql_ms"),
|
||||
|
||||
dernierQlikAt: timestamp("dernier_qlik_at"),
|
||||
dernierQlikStatut: varchar("dernier_qlik_statut", { length: 20 }),
|
||||
dernierQlikCodes: integer("dernier_qlik_codes"),
|
||||
dernierQlikErreur: text("dernier_qlik_erreur"),
|
||||
dernierQlikMs: integer("dernier_qlik_ms"),
|
||||
|
||||
updatedAt: timestamp("updated_at").defaultNow(),
|
||||
}, (table) => {
|
||||
return [
|
||||
// Index de file d'attente : « le plus ancien d'abord », par source.
|
||||
index("idx_sync_fou_sql").on(table.actifSql, table.dernierSqlAt),
|
||||
index("idx_sync_fou_qlik").on(table.actifQlik, table.dernierQlikAt),
|
||||
];
|
||||
});
|
||||
|
||||
/** 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