Checkpoint: Ajout de l'onglet "Paramétrage" dans la page Ventilation FreePro :

- Table DB freeproSettings (URL portail, credentials, fréquence, date antériorité, statut dernière récupération)
- Service freeproAutoImport.ts : connexion HTTP au portail FreePro, téléchargement CSV, pipeline d'import
- Procédures tRPC : getSettings, saveSettings, testConnection, forceImport
- Job périodique en mémoire (daily/weekly/monthly) via setInterval
- Frontend : wrapper Tabs (onglet 1 = Import & Historique, onglet 2 = Paramétrage)
- Onglet Paramétrage : credentials, fréquence, date antériorité, bouton "Forcer récupération", statut
- Tests unitaires : 8 tests passés
This commit is contained in:
Manus
2026-06-08 09:24:05 -04:00
parent 51830b88be
commit e32d540bc9
10 changed files with 3615 additions and 295 deletions

View File

@@ -464,3 +464,34 @@ export const freeproVentilationLines = mysqlTable("freeproVentilationLines", {
});
export type FreeproVentilationLine = typeof freeproVentilationLines.$inferSelect;
export type InsertFreeproVentilationLine = typeof freeproVentilationLines.$inferInsert;
/**
* FreePro settings — paramètres de connexion automatique au portail FreePro
* et de récupération périodique des factures CSV
*/
export const freeproSettings = mysqlTable("freeproSettings", {
id: int("id").autoincrement().primaryKey(),
userId: int("userId").notNull().unique(), // Un paramétrage par utilisateur
/** URL du portail FreePro (ex: https://pro.free.fr) */
portalUrl: varchar("portalUrl", { length: 255 }).default("https://pro.free.fr").notNull(),
/** Email de connexion au portail FreePro */
loginEmail: varchar("loginEmail", { length: 320 }),
/** Mot de passe de connexion au portail FreePro */
loginPassword: text("loginPassword"),
/** Fréquence de récupération automatique */
frequency: mysqlEnum("frequency", ["manual", "daily", "weekly", "monthly"]).default("manual").notNull(),
/** Date d'antériorité max (timestamp Unix ms) — ne pas récupérer les factures antérieures à cette date */
maxAnteriority: int("maxAnteriority"), // Timestamp Unix en secondes
/** Activation de la récupération automatique */
autoEnabled: int("autoEnabled").default(0).notNull(), // 0 = désactivé, 1 = activé
/** Date de la dernière récupération réussie */
lastSuccessAt: timestamp("lastSuccessAt"),
/** Message de statut de la dernière récupération */
lastStatus: text("lastStatus"),
/** Nombre de factures récupérées lors du dernier run */
lastImportCount: int("lastImportCount").default(0),
createdAt: timestamp("createdAt").defaultNow().notNull(),
updatedAt: timestamp("updatedAt").defaultNow().onUpdateNow().notNull(),
});
export type FreeproSettings = typeof freeproSettings.$inferSelect;
export type InsertFreeproSettings = typeof freeproSettings.$inferInsert;