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.
79 lines
2.6 KiB
TypeScript
79 lines
2.6 KiB
TypeScript
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);
|
|
}
|
|
});
|
|
});
|