Checkpoint: Ajout de la configuration des champs obligatoires pour le score LLM
Nouvelle fonctionnalité permettant de configurer quels champs sont obligatoires ou optionnels pour atteindre un score de reconnaissance de 100%. Modifications: - Nouvelle table llmFieldsConfig dans la base de données - Routes tRPC pour gérer la configuration (getAll, updateField) - Interface utilisateur dans la page Paramètres avec tableau et cases à cocher - Modification du code d'extraction pour générer dynamiquement l'instruction de score - Initialisation automatique des champs par défaut (supplierName, invoiceNumber, invoiceDate, totalAmount obligatoires) - Tests unitaires pour valider la fonctionnalité L'utilisateur peut maintenant personnaliser quels champs doivent être détectés pour qu'une facture atteigne 100% de score.
This commit is contained in:
78
server/llmFieldsConfig.test.ts
Normal file
78
server/llmFieldsConfig.test.ts
Normal file
@@ -0,0 +1,78 @@
|
||||
import { describe, it, expect, beforeAll } from "vitest";
|
||||
import {
|
||||
getLlmFieldsConfigByUser,
|
||||
upsertLlmFieldConfig,
|
||||
initializeDefaultLlmFields
|
||||
} from "./db";
|
||||
|
||||
describe("LLM Fields Configuration", () => {
|
||||
const testUserId = 99999; // Use a high ID to avoid conflicts
|
||||
|
||||
beforeAll(async () => {
|
||||
// Initialize default fields for test user
|
||||
await initializeDefaultLlmFields(testUserId);
|
||||
});
|
||||
|
||||
it("should initialize default fields for a new user", async () => {
|
||||
const fields = await getLlmFieldsConfigByUser(testUserId);
|
||||
|
||||
expect(fields).toBeDefined();
|
||||
expect(fields.length).toBeGreaterThan(0);
|
||||
|
||||
// Check that default required fields exist
|
||||
const supplierName = fields.find(f => f.fieldName === "supplierName");
|
||||
const invoiceNumber = fields.find(f => f.fieldName === "invoiceNumber");
|
||||
const invoiceDate = fields.find(f => f.fieldName === "invoiceDate");
|
||||
const totalAmount = fields.find(f => f.fieldName === "totalAmount");
|
||||
|
||||
expect(supplierName).toBeDefined();
|
||||
expect(supplierName?.isRequired).toBe(1);
|
||||
expect(invoiceNumber).toBeDefined();
|
||||
expect(invoiceNumber?.isRequired).toBe(1);
|
||||
expect(invoiceDate).toBeDefined();
|
||||
expect(invoiceDate?.isRequired).toBe(1);
|
||||
expect(totalAmount).toBeDefined();
|
||||
expect(totalAmount?.isRequired).toBe(1);
|
||||
});
|
||||
|
||||
it("should update field configuration", async () => {
|
||||
// Make deliveryNoteNumber required
|
||||
await upsertLlmFieldConfig({
|
||||
userId: testUserId,
|
||||
fieldName: "deliveryNoteNumber",
|
||||
displayName: "Numéro de bon de livraison",
|
||||
isRequired: 1,
|
||||
displayOrder: 5,
|
||||
});
|
||||
|
||||
const fields = await getLlmFieldsConfigByUser(testUserId);
|
||||
const deliveryNote = fields.find(f => f.fieldName === "deliveryNoteNumber");
|
||||
|
||||
expect(deliveryNote).toBeDefined();
|
||||
expect(deliveryNote?.isRequired).toBe(1);
|
||||
|
||||
// Make it optional again
|
||||
await upsertLlmFieldConfig({
|
||||
userId: testUserId,
|
||||
fieldName: "deliveryNoteNumber",
|
||||
displayName: "Numéro de bon de livraison",
|
||||
isRequired: 0,
|
||||
displayOrder: 5,
|
||||
});
|
||||
|
||||
const fieldsAfter = await getLlmFieldsConfigByUser(testUserId);
|
||||
const deliveryNoteAfter = fieldsAfter.find(f => f.fieldName === "deliveryNoteNumber");
|
||||
|
||||
expect(deliveryNoteAfter).toBeDefined();
|
||||
expect(deliveryNoteAfter?.isRequired).toBe(0);
|
||||
});
|
||||
|
||||
it("should return fields in correct display order", async () => {
|
||||
const fields = await getLlmFieldsConfigByUser(testUserId);
|
||||
|
||||
// Check that fields are sorted by displayOrder
|
||||
for (let i = 1; i < fields.length; i++) {
|
||||
expect(fields[i].displayOrder).toBeGreaterThanOrEqual(fields[i - 1].displayOrder);
|
||||
}
|
||||
});
|
||||
});
|
||||
Reference in New Issue
Block a user