Checkpoint: Coloration des valeurs dans Factures BAP (automatique vs manuelle)
Nouvelle fonctionnalité visuelle : ✅ Valeurs remplies automatiquement par les règles : affichées en VERT ✅ Valeurs saisies manuellement : affichées en BLEU ✅ Traçage intelligent de l'origine des valeurs (automatique ou manuelle) ✅ Mise à jour automatique de la couleur lors d'une modification manuelle Architecture technique : - drizzle/schema.ts : Ajout du champ autoFilledFields (JSON) pour tracer l'origine - server/automationEngine.ts : Enregistrement des champs remplis automatiquement - server/routers.ts : Ajout de autoFilledFields dans le schéma d'update - client/src/pages/InvoicesBAP.tsx : Fonction getFieldColor() pour déterminer la couleur - Migration 0010_late_thor_girl.sql appliquée avec succès Fonctionnement : 1. **Import de facture** : Les règles d'automatisme s'appliquent et marquent les champs remplis dans autoFilledFields 2. **Affichage** : La fonction getFieldColor() analyse autoFilledFields pour déterminer la couleur : - Champ dans autoFilledFields → VERT (rempli automatiquement) - Champ avec valeur mais pas dans autoFilledFields → BLEU (rempli manuellement) - Champ vide → Pas de couleur 3. **Modification manuelle** : Lors d'une édition, le champ est retiré de autoFilledFields et passe en BLEU Bénéfices utilisateur : - Visibilité immédiate sur l'origine des données - Confiance accrue dans les automatismes (vert = validé par règle) - Identification rapide des saisies manuelles nécessitant vérification - Traçabilité complète du remplissage des champs métier Cette fonctionnalité améliore considérablement la transparence du système d'automatisation et facilite le contrôle qualité des données.
This commit is contained in:
@@ -77,6 +77,7 @@ export async function applyAutomationRules(
|
||||
): Promise<Partial<Invoice>> {
|
||||
const rules = await getAutomationRulesByUser(userId);
|
||||
const updates: Partial<Invoice> = {};
|
||||
const autoFilledFieldsList: string[] = [];
|
||||
|
||||
// Process rules in priority order (already sorted by priority in getAutomationRulesByUser)
|
||||
for (const rule of rules) {
|
||||
@@ -100,12 +101,15 @@ export async function applyAutomationRules(
|
||||
// Apply actions (only if the field is not already set by a higher priority rule)
|
||||
if (actions.typeAchat && !updates.typeAchat) {
|
||||
updates.typeAchat = actions.typeAchat as "CAPEX" | "OPEX";
|
||||
autoFilledFieldsList.push("typeAchat");
|
||||
}
|
||||
if (actions.serviceConcerne && !updates.serviceConcerne) {
|
||||
updates.serviceConcerne = actions.serviceConcerne;
|
||||
autoFilledFieldsList.push("serviceConcerne");
|
||||
}
|
||||
if (actions.ventilationComptable && !updates.ventilationComptable) {
|
||||
updates.ventilationComptable = actions.ventilationComptable;
|
||||
autoFilledFieldsList.push("ventilationComptable");
|
||||
}
|
||||
}
|
||||
} catch (error) {
|
||||
@@ -114,6 +118,11 @@ export async function applyAutomationRules(
|
||||
}
|
||||
}
|
||||
|
||||
// Add the list of auto-filled fields to the updates
|
||||
if (autoFilledFieldsList.length > 0) {
|
||||
updates.autoFilledFields = JSON.stringify(autoFilledFieldsList);
|
||||
}
|
||||
|
||||
return updates;
|
||||
}
|
||||
|
||||
|
||||
@@ -330,6 +330,7 @@ export const appRouter = router({
|
||||
typeAchat: z.enum(["CAPEX", "OPEX"]).optional(),
|
||||
ventilationComptable: z.string().optional(),
|
||||
isSubscription: z.number().min(0).max(1).optional(),
|
||||
autoFilledFields: z.string().nullable().optional(),
|
||||
}),
|
||||
}))
|
||||
.mutation(async ({ input, ctx }) => {
|
||||
|
||||
Reference in New Issue
Block a user