feat(billing): add PAYMENT_PROCESSING invoice status on payment success redirect (all except CBE bill)

This commit is contained in:
Marshal
2026-08-05 12:59:37 +00:00
parent 26837d5a7d
commit b7dcc1bf0a
20 changed files with 160 additions and 3 deletions

View File

@@ -249,6 +249,7 @@ const INVOICE_STATUS_COLOR: Record<Freight.InvoiceStatus, string> = {
DRAFT: "gray",
ISSUED: "cyan",
PENDING: "yellow",
PAYMENT_PROCESSING: "indigo",
PARTIALLY_PAID: "orange",
PAID: "edr-green",
OVERDUE: "red",

View File

@@ -14,6 +14,7 @@ import { openPdfBlob } from './pdf';
const INVOICE_STATUS_COLOR: Record<WarehouseInvoiceStatus, string> = {
DRAFT: 'gray',
ISSUED: 'orange',
PAYMENT_PROCESSING: 'indigo',
PARTIALLY_PAID: 'yellow',
PAID: 'edr-green',
CANCELLED: 'gray',

View File

@@ -183,6 +183,7 @@ export default function InvoicesPage() {
data={[
{ label: "All", value: "all" },
{ label: "Pending", value: "PENDING" },
{ label: "Payment processing", value: "PAYMENT_PROCESSING" },
{ label: "Paid", value: "PAID" },
{ label: "Overdue", value: "OVERDUE" },
]}

View File

@@ -79,6 +79,7 @@ const INVOICE_STATUS_META: Record<string, { label: string; color: string }> = {
PAID: { label: "Paid", color: "green" },
PARTIALLY_PAID: { label: "Partially Paid", color: "teal" },
PENDING: { label: "Pending", color: "yellow" },
PAYMENT_PROCESSING: { label: "Payment Processing", color: "indigo" },
UNPAID: { label: "Unpaid", color: "yellow" },
OPEN: { label: "Open", color: "yellow" },
ISSUED: { label: "Issued", color: "blue" },

View File

@@ -86,6 +86,7 @@ const INVOICE_STATUS_META: Record<string, { label: string; color: string }> = {
PAID: { label: "Paid", color: "green" },
PARTIALLY_PAID: { label: "Partially Paid", color: "teal" },
PENDING: { label: "Pending", color: "yellow" },
PAYMENT_PROCESSING: { label: "Payment Processing", color: "indigo" },
UNPAID: { label: "Unpaid", color: "yellow" },
OPEN: { label: "Open", color: "yellow" },
ISSUED: { label: "Issued", color: "blue" },

View File

@@ -75,6 +75,7 @@ const CONTRACT_STATUSES = [
const INVOICE_STATUSES = [
"ISSUED",
"PENDING",
"PAYMENT_PROCESSING",
"PARTIALLY_PAID",
"PAID",
"OVERDUE",

View File

@@ -42,6 +42,7 @@ import { extractErrorMessage } from '@/components/warehouses/options';
const STATUS_COLOR: Record<WarehouseInvoiceStatus, string> = {
DRAFT: 'gray',
ISSUED: 'orange',
PAYMENT_PROCESSING: 'indigo',
PARTIALLY_PAID: 'yellow',
PAID: 'edr-green',
CANCELLED: 'gray',

View File

@@ -907,6 +907,7 @@ export interface AllocationCriteria {
export const WAREHOUSE_INVOICE_STATUSES = [
'DRAFT',
'ISSUED',
'PAYMENT_PROCESSING',
'PARTIALLY_PAID',
'PAID',
'CANCELLED',

View File

@@ -194,6 +194,8 @@ export const URL_CONSTANTS = {
PAYMENTS: {
INITIATE: "/api/payments/initiate",
INTENT: (bookingId: string) => `/api/payments/intents/${bookingId}`,
REDIRECT_SUCCESS: (bookingId: string) =>
`/api/payments/redirect-success/${bookingId}`,
CHECKOUT: "/api/payments/checkout",
},

View File

@@ -21,6 +21,7 @@ const STATUS_STYLE: Record<
[Freight.InvoiceStatus.Draft]: { label: "Draft", bg: "#EEF2F6", fg: "#64748B" },
[Freight.InvoiceStatus.Issued]: { label: "Due", bg: "#FEF3E2", fg: "#B45309" },
[Freight.InvoiceStatus.Pending]: { label: "Due", bg: "#FEF3E2", fg: "#B45309" },
[Freight.InvoiceStatus.PaymentProcessing]: { label: "Payment processing", bg: "#EAF1FB", fg: "#2563EB" },
[Freight.InvoiceStatus.PartiallyPaid]: { label: "Partially paid", bg: "#FEF9E7", fg: "#A16207" },
[Freight.InvoiceStatus.Paid]: { label: "Paid", bg: "#E6F7EF", fg: "#0A6F4D" },
[Freight.InvoiceStatus.Overdue]: { label: "Overdue", bg: "#FDECEC", fg: "#C0392B" },

View File

@@ -41,6 +41,7 @@ const INVOICE_STATUS_LABELS: Record<string, string> = {
DRAFT: "Draft",
ISSUED: "Issued",
PENDING: "Due",
PAYMENT_PROCESSING: "Payment processing",
PARTIALLY_PAID: "Partially paid",
PAID: "Paid",
OVERDUE: "Overdue",

View File

@@ -120,6 +120,7 @@ const PAYMENT_COLORS: Record<string, string> = {
// Backend emits the long form on some flows; keep the short alias too.
VERIFICATION_IN_PROGRESS: "yellow",
PAYMENT_VERIFICATION_IN_PROGRESS: "yellow",
PAYMENT_PROCESSING: "yellow",
OVERDUE: "red",
REFUNDED: "blue",
CANCELLED: "gray",
@@ -132,6 +133,7 @@ const PAYMENT_LABELS: Record<string, string> = {
PNR_GENERATED: "PNR generated",
VERIFICATION_IN_PROGRESS: "Verifying",
PAYMENT_VERIFICATION_IN_PROGRESS: "Verifying",
PAYMENT_PROCESSING: "Payment processing",
OVERDUE: "Overdue",
REFUNDED: "Refunded",
CANCELLED: "Cancelled",

View File

@@ -8,10 +8,22 @@ import {
ThemeIcon,
} from "@mantine/core";
import { CheckCircle2, FileText, Home } from "lucide-react";
import { useNavigate } from "react-router-dom";
import { useEffect } from "react";
import { useNavigate, useSearchParams } from "react-router-dom";
import { paymentsService } from "@/services/payments.service";
export default function PaymentSuccessPage() {
const navigate = useNavigate();
const [searchParams] = useSearchParams();
const bookingId = searchParams.get("bookingId");
// Fire-and-forget ack: payment → processing, invoice → PAYMENT_PROCESSING.
// The provider webhook remains the source of truth for the final PAID state.
useEffect(() => {
if (bookingId) {
paymentsService.acknowledgeSuccessRedirect(bookingId).catch(() => {});
}
}, [bookingId]);
return (
<Box

View File

@@ -107,6 +107,11 @@ export const paymentsService = {
return data.data ?? data;
},
/** Success-redirect ack: payment → processing, invoice → PAYMENT_PROCESSING. */
acknowledgeSuccessRedirect: async (bookingId: string): Promise<void> => {
await client.post(P.REDIRECT_SUCCESS(bookingId));
},
checkoutUrl: buildCheckoutUrl,
checkoutUrlForInvoice: buildCheckoutUrlForInvoice,
};