diff --git a/packages/invoice-dashboard/src/lib/dashboard/invoice-view.svelte b/packages/invoice-dashboard/src/lib/dashboard/invoice-view.svelte index 76419657..fadca9ae 100644 --- a/packages/invoice-dashboard/src/lib/dashboard/invoice-view.svelte +++ b/packages/invoice-dashboard/src/lib/dashboard/invoice-view.svelte @@ -23,6 +23,7 @@ import Download from "@requestnetwork/shared-icons/download.svelte"; // Utils import { formatDate } from "@requestnetwork/shared-utils/formatDate"; + import { checkStatus } from "@requestnetwork/shared-utils/checkStatus"; import { calculateItemTotal } from "@requestnetwork/shared-utils/invoiceTotals"; import { exportToPDF } from "@requestnetwork/shared-utils/generateInvoice"; import { getCurrencyFromManager } from "@requestnetwork/shared-utils/getCurrency"; @@ -73,6 +74,8 @@ | Types.Extension.IPaymentNetworkState | undefined; + let status = checkStatus(requestData || request); + const generateDetailParagraphs = (info: any) => { const fullName = [info?.firstName, info?.lastName] .filter(Boolean) @@ -186,7 +189,8 @@ } else { approved = true; } - isPaid = requestData?.balance?.balance! >= requestData?.expectedAmount; + + status = checkStatus(requestData || request); } catch (err: any) { console.error("Error while checking invoice: ", err); if (String(err).includes("Unsupported payment")) { @@ -368,7 +372,7 @@

Invoice #{request?.contentData?.invoiceNumber || "-"}

- {isPaid ? "Paid" : "Created"} + {status}

{ activeRequest = undefined; }; - - const checkStatus = (request: any) => { - switch (request?.balance?.balance > 0) { - case true: - return request?.balance?.balance >= request?.expectedAmount - ? "Paid" - : "Partially Paid"; - default: - return capitalize(request?.state); - } - };
+ (str && str[0].toUpperCase() + str.slice(1)) || ""; diff --git a/shared/utils/checkStatus.ts b/shared/utils/checkStatus.ts new file mode 100644 index 00000000..69464897 --- /dev/null +++ b/shared/utils/checkStatus.ts @@ -0,0 +1,51 @@ +import { capitalize } from "./capitalize"; +import { Types } from "@requestnetwork/request-client.js"; + +export const checkStatus = (request: Types.IRequestDataWithEvents | null) => { + const balance = BigInt(request?.balance?.balance ?? 0); + const expectedAmount = BigInt(request?.expectedAmount ?? 0); + const today = new Date(); + let dueDate: Date | null = null; + const isPaid = balance >= expectedAmount ? "Paid" : "Partially Paid"; + + try { + const rawDueDate = request?.contentData?.paymentTerms?.dueDate; + if (rawDueDate) { + dueDate = new Date(rawDueDate); + if (isNaN(dueDate.getTime())) { + console.warn("Invalid due date format"); + dueDate = null; + } + } + } catch (e) { + console.error("Error parsing due date:", e); + dueDate = null; + } + + const eventStatus = { + reject: "Rejected", + cancel: "Canceled", + }; + + for (const [event, status] of Object.entries(eventStatus)) { + if ( + request?.events?.some( + (e: { name?: string }) => e?.name?.toLowerCase() === event.toLowerCase() + ) + ) { + return capitalize(status); + } + } + + if (dueDate && dueDate < today) { + if (balance === BigInt(0)) { + return "Overdue"; + } + return isPaid; + } else { + if (balance === BigInt(0)) { + return "Awaiting Payment"; + } + return isPaid; + } +};