import { describe, expect, it } from "vitest"; import { buildAnnualInvoiceSummary, buildSupplierBudgetSummary } from "@shared/invoiceAnalytics"; const invoices = [ { invoiceDate: "2026-05-15", createdAt: "2026-05-16", status: "completed", isSubscription: 0, supplierName: "SFR", totalAmount: "100" }, { invoiceDate: "2026-05-20", createdAt: "2026-05-21", status: "completed", isSubscription: 1, supplierName: "SFR", totalAmount: "20" }, { invoiceDate: "2025-03-10", createdAt: "2025-03-11", status: "completed", isSubscription: 1, supplierName: "Microsoft", totalAmount: "50" }, { invoiceDate: "2026-05-01", createdAt: "2026-05-01", status: "error", isSubscription: 0, supplierName: "Ignorée", totalAmount: "999" }, ]; describe("agrégats de facturation", () => { it("calcule les volumes et montants BAP et abonnements par année", () => { expect(buildAnnualInvoiceSummary(invoices)).toEqual([ { year: 2026, bapCount: 1, bapAmount: 100, subscriptionCount: 1, subscriptionAmount: 20, totalAmount: 120 }, { year: 2025, bapCount: 0, bapAmount: 0, subscriptionCount: 1, subscriptionAmount: 50, totalAmount: 50 }, ]); }); it("filtre le budget par période et ventile chaque fournisseur par type", () => { expect(buildSupplierBudgetSummary(invoices, "2026", "05")).toEqual([ { supplierName: "SFR", subscriptionCount: 1, subscriptionAmount: 20, nonSubscriptionCount: 1, nonSubscriptionAmount: 100, totalAmount: 120 }, ]); }); it("classe le budget du fournisseur le plus facturé au moins facturé", () => { const rows = buildSupplierBudgetSummary([ ...invoices, { invoiceDate: "2026-05-22", createdAt: "2026-05-22", status: "completed", isSubscription: 0, supplierName: "Orange", totalAmount: "300" }, ], "2026", "05"); expect(rows.map((row) => row.supplierName)).toEqual(["Orange", "SFR"]); }); });