Checkpoint: Bouton Relancer corrigé (automatismes uniquement, sans LLM). Système d'apprentissage complet : table invoiceLearnings, routes tRPC, déclenchement depuis InvoiceDetail, application lors des imports, page LearningSettings dans Configuration > Apprentissages IA.

This commit is contained in:
Manus
2026-04-12 14:54:29 -04:00
parent 120f56bb23
commit 3ae1e47ca6
10 changed files with 2187 additions and 74 deletions

View File

@@ -54,6 +54,8 @@ export default function InvoiceDetail() {
}
}, [invoice]);
const upsertLearningMutation = trpc.learnings.upsert.useMutation();
const updateMutation = trpc.invoices.update.useMutation({
onSuccess: () => {
toast.success("Facture mise à jour avec succès");
@@ -80,6 +82,42 @@ export default function InvoiceDetail() {
const newQualityScore = Math.round((filledFields / totalFields) * 100);
// Apprentissage : enregistrer les corrections manuelles sur les champs clés
// On compare les valeurs actuelles (invoice) avec les nouvelles valeurs (formData)
if (invoice && formData.supplierName) {
const supplierName = formData.supplierName || invoice.supplierName || "";
if (!supplierName) return;
// isSubscription : géré séparément via le toggle dans InvoicesBAP
// typeAchat
if (formData.typeAchat !== (invoice.typeAchat || "")) {
upsertLearningMutation.mutate({
supplierName,
fieldName: "typeAchat",
originalValue: invoice.typeAchat || undefined,
correctedValue: formData.typeAchat,
});
}
// serviceConcerne
if (formData.serviceConcerne !== (invoice.serviceConcerne || "")) {
upsertLearningMutation.mutate({
supplierName,
fieldName: "serviceConcerne",
originalValue: invoice.serviceConcerne || undefined,
correctedValue: formData.serviceConcerne,
});
}
// ventilationComptable
if (formData.ventilationComptable !== (invoice.ventilationComptable || "")) {
upsertLearningMutation.mutate({
supplierName,
fieldName: "ventilationComptable",
originalValue: invoice.ventilationComptable || undefined,
correctedValue: formData.ventilationComptable,
});
}
}
updateMutation.mutate({
id: invoiceId,
data: {