From 1d67532fca3fe07659e683227304d9450e8b779d Mon Sep 17 00:00:00 2001 From: sstefdev Date: Thu, 21 Nov 2024 16:11:08 +0100 Subject: [PATCH 1/6] feat: added overdue, rejected and canceled status --- .../src/lib/dashboard/invoice-view.svelte | 33 +++++++++++++++++-- .../src/lib/view-requests.svelte | 29 ++++++++++++---- 2 files changed, 53 insertions(+), 9 deletions(-) diff --git a/packages/invoice-dashboard/src/lib/dashboard/invoice-view.svelte b/packages/invoice-dashboard/src/lib/dashboard/invoice-view.svelte index 76419657..3d5cff85 100644 --- a/packages/invoice-dashboard/src/lib/dashboard/invoice-view.svelte +++ b/packages/invoice-dashboard/src/lib/dashboard/invoice-view.svelte @@ -73,6 +73,34 @@ | Types.Extension.IPaymentNetworkState | undefined; + const checkStatus = (request: any) => { + if (Number(request?.balance?.balance)! > 0) { + return request?.balance?.balance! >= request.expectedAmount + ? "Paid" + : "Partially Paid"; + } + + const eventStatus = { + create: "Created", + reject: "Rejected", + overdue: "Overdue", + cancel: "Canceled", + }; + + for (const [event, reqStatus] of Object.entries(eventStatus)) { + console.log(event, reqStatus); + if ( + request?.events?.some( + (e: { name?: string }) => e?.name?.toLowerCase() === event + ) + ) { + return reqStatus; + } + } + }; + + let status = checkStatus(requestData || request); + const generateDetailParagraphs = (info: any) => { const fullName = [info?.firstName, info?.lastName] .filter(Boolean) @@ -186,7 +214,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 +397,7 @@

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

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

{ - switch (request?.balance?.balance > 0) { - case true: - return request?.balance?.balance >= request?.expectedAmount - ? "Paid" - : "Partially Paid"; - default: - return capitalize(request?.state); + if (request?.balance?.balance > 0) { + return request.balance.balance >= request.expectedAmount + ? "Paid" + : "Partially Paid"; } + + const eventStatus = { + reject: "Rejected", + overdue: "Overdue", + cancel: "Canceled", + }; + + for (const [event, status] of Object.entries(eventStatus)) { + if ( + request?.events?.some( + (e: { name?: string }) => e?.name?.toLowerCase() === event + ) + ) { + return status; + } + } + + return capitalize(request?.state); }; From 8a60e3ae977ace0110da282eb8e6d6ae901d681e Mon Sep 17 00:00:00 2001 From: sstefdev Date: Thu, 21 Nov 2024 17:26:02 +0100 Subject: [PATCH 2/6] fix: better type for argument on checkStatus, null checks --- .../src/lib/dashboard/invoice-view.svelte | 7 ++++--- packages/invoice-dashboard/src/lib/view-requests.svelte | 8 ++++---- 2 files changed, 8 insertions(+), 7 deletions(-) diff --git a/packages/invoice-dashboard/src/lib/dashboard/invoice-view.svelte b/packages/invoice-dashboard/src/lib/dashboard/invoice-view.svelte index 3d5cff85..0f6bb2fb 100644 --- a/packages/invoice-dashboard/src/lib/dashboard/invoice-view.svelte +++ b/packages/invoice-dashboard/src/lib/dashboard/invoice-view.svelte @@ -73,9 +73,9 @@ | Types.Extension.IPaymentNetworkState | undefined; - const checkStatus = (request: any) => { + const checkStatus = (request: Types.IRequestDataWithEvents | null) => { if (Number(request?.balance?.balance)! > 0) { - return request?.balance?.balance! >= request.expectedAmount + return request?.balance?.balance! >= request?.expectedAmount! ? "Paid" : "Partially Paid"; } @@ -88,7 +88,6 @@ }; for (const [event, reqStatus] of Object.entries(eventStatus)) { - console.log(event, reqStatus); if ( request?.events?.some( (e: { name?: string }) => e?.name?.toLowerCase() === event @@ -97,6 +96,8 @@ return reqStatus; } } + + return "Created"; }; let status = checkStatus(requestData || request); diff --git a/packages/invoice-dashboard/src/lib/view-requests.svelte b/packages/invoice-dashboard/src/lib/view-requests.svelte index 1c5c1108..ebff65ca 100644 --- a/packages/invoice-dashboard/src/lib/view-requests.svelte +++ b/packages/invoice-dashboard/src/lib/view-requests.svelte @@ -382,9 +382,9 @@ activeRequest = undefined; }; - const checkStatus = (request: any) => { - if (request?.balance?.balance > 0) { - return request.balance.balance >= request.expectedAmount + const checkStatus = (request: Types.IRequestDataWithEvents | null) => { + if (Number(request?.balance?.balance)! > 0) { + return request?.balance?.balance! >= request?.expectedAmount! ? "Paid" : "Partially Paid"; } @@ -405,7 +405,7 @@ } } - return capitalize(request?.state); + return capitalize(request?.state as string); }; From ca68be7e3bbe72c15542f6defd5772f1ff54dfe8 Mon Sep 17 00:00:00 2001 From: sstefdev Date: Fri, 22 Nov 2024 16:12:35 +0100 Subject: [PATCH 3/6] fix: abstract the checkStatus function, overdue added --- .../src/lib/dashboard/invoice-view.svelte | 28 +--------------- .../src/lib/view-requests.svelte | 29 ++-------------- shared/utils/capitalize.ts | 2 ++ shared/utils/checkStatus.ts | 33 +++++++++++++++++++ 4 files changed, 38 insertions(+), 54 deletions(-) create mode 100644 shared/utils/capitalize.ts create mode 100644 shared/utils/checkStatus.ts diff --git a/packages/invoice-dashboard/src/lib/dashboard/invoice-view.svelte b/packages/invoice-dashboard/src/lib/dashboard/invoice-view.svelte index 0f6bb2fb..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,33 +74,6 @@ | Types.Extension.IPaymentNetworkState | undefined; - const checkStatus = (request: Types.IRequestDataWithEvents | null) => { - if (Number(request?.balance?.balance)! > 0) { - return request?.balance?.balance! >= request?.expectedAmount! - ? "Paid" - : "Partially Paid"; - } - - const eventStatus = { - create: "Created", - reject: "Rejected", - overdue: "Overdue", - cancel: "Canceled", - }; - - for (const [event, reqStatus] of Object.entries(eventStatus)) { - if ( - request?.events?.some( - (e: { name?: string }) => e?.name?.toLowerCase() === event - ) - ) { - return reqStatus; - } - } - - return "Created"; - }; - let status = checkStatus(requestData || request); const generateDetailParagraphs = (info: any) => { diff --git a/packages/invoice-dashboard/src/lib/view-requests.svelte b/packages/invoice-dashboard/src/lib/view-requests.svelte index 69e32075..a3f64a14 100644 --- a/packages/invoice-dashboard/src/lib/view-requests.svelte +++ b/packages/invoice-dashboard/src/lib/view-requests.svelte @@ -31,6 +31,7 @@ import type { IConfig } from "@requestnetwork/shared-types"; import type { RequestNetwork } from "@requestnetwork/request-client.js"; // Utils + import { checkStatus } from "@requestnetwork/shared-utils/checkStatus"; import { config as defaultConfig } from "@requestnetwork/shared-utils/config"; import { initializeCurrencyManager } from "@requestnetwork/shared-utils/initCurrencyManager"; import { exportToPDF } from "@requestnetwork/shared-utils/generateInvoice"; @@ -38,7 +39,7 @@ import { CurrencyManager } from "@requestnetwork/currency"; import { onDestroy, onMount, tick } from "svelte"; import { formatUnits } from "viem"; - import { capitalize, debounce, formatAddress } from "../utils"; + import { debounce, formatAddress } from "../utils"; import { Drawer, InvoiceView } from "./dashboard"; import { getPaymentNetworkExtension } from "@requestnetwork/payment-detection"; import { CurrencyTypes } from "@requestnetwork/types"; @@ -381,32 +382,6 @@ const handleRemoveSelectedRequest = () => { activeRequest = undefined; }; - - const checkStatus = (request: Types.IRequestDataWithEvents | null) => { - if (Number(request?.balance?.balance)! > 0) { - return request?.balance?.balance! >= request?.expectedAmount! - ? "Paid" - : "Partially Paid"; - } - - const eventStatus = { - reject: "Rejected", - overdue: "Overdue", - cancel: "Canceled", - }; - - for (const [event, status] of Object.entries(eventStatus)) { - if ( - request?.events?.some( - (e: { name?: string }) => e?.name?.toLowerCase() === event - ) - ) { - return status; - } - } - - return capitalize(request?.state as string); - };
+ (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..24f7e543 --- /dev/null +++ b/shared/utils/checkStatus.ts @@ -0,0 +1,33 @@ +import { capitalize } from "./capitalize"; +import { Types } from "@requestnetwork/request-client.js"; + +export const checkStatus = (request: Types.IRequestDataWithEvents | null) => { + const balance = Number(request?.balance?.balance ?? 0); + const expectedAmount = Number(request?.expectedAmount ?? 0); + + if (balance > 0) { + return balance >= expectedAmount ? "Paid" : "Partially Paid"; + } + + const eventStatus = { + reject: "Rejected", + cancel: "Canceled", + }; + + const dueDate = request?.contentData?.paymentTerms?.dueDate; + if (dueDate && new Date(dueDate) < new Date()) { + return "Overdue"; + } + + for (const [event, status] of Object.entries(eventStatus)) { + if ( + request?.events?.some( + (e: { name?: string }) => e?.name?.toLowerCase() === event.toLowerCase() + ) + ) { + return status; + } + } + + return capitalize(request?.state as string); +}; From 4775206d3a8fce86a970d6aeb4f70deec44d1b61 Mon Sep 17 00:00:00 2001 From: sstefdev Date: Fri, 22 Nov 2024 23:46:17 +0100 Subject: [PATCH 4/6] fix: overdue and partialy paid fix --- shared/utils/checkStatus.ts | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/shared/utils/checkStatus.ts b/shared/utils/checkStatus.ts index 24f7e543..c052fff9 100644 --- a/shared/utils/checkStatus.ts +++ b/shared/utils/checkStatus.ts @@ -4,18 +4,19 @@ import { Types } from "@requestnetwork/request-client.js"; export const checkStatus = (request: Types.IRequestDataWithEvents | null) => { const balance = Number(request?.balance?.balance ?? 0); const expectedAmount = Number(request?.expectedAmount ?? 0); - - if (balance > 0) { - return balance >= expectedAmount ? "Paid" : "Partially Paid"; - } + const today = new Date(); + const dueDate = new Date(request?.contentData?.paymentTerms?.dueDate); const eventStatus = { reject: "Rejected", cancel: "Canceled", }; - const dueDate = request?.contentData?.paymentTerms?.dueDate; - if (dueDate && new Date(dueDate) < new Date()) { + if (balance > 0) { + return balance >= expectedAmount ? "Paid" : "Partially Paid"; + } + + if (dueDate < today && balance === 0) { return "Overdue"; } From 8e984dee269c22a32418c4afe8e3a0784950c1c7 Mon Sep 17 00:00:00 2001 From: sstefdev Date: Sun, 24 Nov 2024 09:02:40 +0100 Subject: [PATCH 5/6] fix: updated checkStatus function --- shared/utils/checkStatus.ts | 27 +++++++++++++++------------ 1 file changed, 15 insertions(+), 12 deletions(-) diff --git a/shared/utils/checkStatus.ts b/shared/utils/checkStatus.ts index c052fff9..2bba38e9 100644 --- a/shared/utils/checkStatus.ts +++ b/shared/utils/checkStatus.ts @@ -2,33 +2,36 @@ import { capitalize } from "./capitalize"; import { Types } from "@requestnetwork/request-client.js"; export const checkStatus = (request: Types.IRequestDataWithEvents | null) => { - const balance = Number(request?.balance?.balance ?? 0); - const expectedAmount = Number(request?.expectedAmount ?? 0); + const balance = BigInt(request?.balance?.balance ?? 0); + const expectedAmount = BigInt(request?.expectedAmount ?? 0); const today = new Date(); const dueDate = new Date(request?.contentData?.paymentTerms?.dueDate); + const isPaid = balance >= expectedAmount ? "Paid" : "Partially Paid"; const eventStatus = { reject: "Rejected", cancel: "Canceled", }; - if (balance > 0) { - return balance >= expectedAmount ? "Paid" : "Partially Paid"; - } - - if (dueDate < today && balance === 0) { - return "Overdue"; - } - for (const [event, status] of Object.entries(eventStatus)) { if ( request?.events?.some( (e: { name?: string }) => e?.name?.toLowerCase() === event.toLowerCase() ) ) { - return status; + return capitalize(status); } } - return capitalize(request?.state as string); + if (dueDate < today) { + if (balance === BigInt(0)) { + return "Overdue"; + } + return isPaid; + } else { + if (balance === BigInt(0)) { + return "Awaiting Payment"; + } + return isPaid; + } }; From 543bee16873f8ff7fc0b9ffc4edbb05ea23d5bfe Mon Sep 17 00:00:00 2001 From: sstefdev Date: Tue, 26 Nov 2024 13:12:27 +0100 Subject: [PATCH 6/6] fix: coderabbit comments fix --- shared/utils/checkStatus.ts | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/shared/utils/checkStatus.ts b/shared/utils/checkStatus.ts index 2bba38e9..69464897 100644 --- a/shared/utils/checkStatus.ts +++ b/shared/utils/checkStatus.ts @@ -5,9 +5,23 @@ export const checkStatus = (request: Types.IRequestDataWithEvents | null) => { const balance = BigInt(request?.balance?.balance ?? 0); const expectedAmount = BigInt(request?.expectedAmount ?? 0); const today = new Date(); - const dueDate = new Date(request?.contentData?.paymentTerms?.dueDate); + 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", @@ -23,7 +37,7 @@ export const checkStatus = (request: Types.IRequestDataWithEvents | null) => { } } - if (dueDate < today) { + if (dueDate && dueDate < today) { if (balance === BigInt(0)) { return "Overdue"; }