From b80958daba44adafafcc8e8c4716568c84c1cec9 Mon Sep 17 00:00:00 2001 From: Odysseus Chiu Date: Fri, 27 Feb 2026 08:53:42 -0800 Subject: [PATCH 1/2] 32148 - initial FAS refund approval flow updates --- .../RoutingSlip/TransactionDataTable.vue | 91 ++++++++++++++++++- .../components/refund/RefundRequestsTable.vue | 2 +- web/pay-ui/app/composables/pay-api.ts | 9 ++ web/pay-ui/app/composables/useRoutingSlip.ts | 15 +++ .../useTransactionDataTable.ts | 10 +- web/pay-ui/app/interfaces/invoice.ts | 6 ++ .../[id]/InvoiceRefundHistory.vue | 8 +- .../transaction-view/[id]/[...details].vue | 32 +++++-- .../app/pages/view-routing-slip/[slipId].vue | 10 +- web/pay-ui/app/utils/constants.ts | 10 +- 10 files changed, 174 insertions(+), 19 deletions(-) diff --git a/web/pay-ui/app/components/RoutingSlip/TransactionDataTable.vue b/web/pay-ui/app/components/RoutingSlip/TransactionDataTable.vue index d05c36e3..48ec8f38 100644 --- a/web/pay-ui/app/components/RoutingSlip/TransactionDataTable.vue +++ b/web/pay-ui/app/components/RoutingSlip/TransactionDataTable.vue @@ -2,6 +2,12 @@ import type { Invoice } from '@/interfaces/invoice' import useTransactionDataTable from '@/composables/viewRoutingSlip/useTransactionDataTable' import commonUtil from '@/utils/common-util' +import { RefundApprovalStatus, RefundApprovalStatusDisplay } from '~/utils' +import { RolePattern } from '~/enums' +import CommonUtils from '~/utils/common-util' + +const route = useRoute() +const { getFeatureFlag } = useConnectLaunchDarkly() interface Props { invoices?: Invoice[] @@ -20,8 +26,56 @@ const { isAlreadyCancelled } = useTransactionDataTable(toRef(props, 'invoices')) +const enableRefundRequestFlow = await getFeatureFlag(LDFlags.EnableFasRefundRequestFlow, false, 'await') + const formatDisplayDate = commonUtil.formatDisplayDate const appendCurrencySymbol = commonUtil.appendCurrencySymbol + +async function cancelTransaction(id: number) { + if (enableRefundRequestFlow) { + navigateTo({ + path: `/transaction-view/${id}/initiateRefund`, + query: { + returnTo: route.path, + returnType: 'viewRoutingSlip', + returnToId: route.params.slipId + } + }) + } else { + cancel(id) + } +} + +async function viewRefundDetail(invoiceId: number, refundId: number) { + navigateTo({ + path: `/transaction-view/${invoiceId}/refund-request/${refundId}`, + query: { + returnTo: route.path, + returnType: 'viewRoutingSlip', + returnToId: route.params.slipId + } + }) +} + +function showInitiateRefundButton(invoiceRow: Invoice) { + if ( + !invoiceRow.latestRefundStatus + || RefundApprovalStatus.DECLINED === invoiceRow.latestRefundStatus + ) { + const productRole = (invoiceRow.product?.toLowerCase() ?? '') + + RolePattern.ProductRefundRequester + return (!!invoiceRow.partialRefundable || !!invoiceRow.fullRefundable) + && invoiceRow.total > 0 + && CommonUtils.canInitiateProductRefund(productRole) + } + return false +} + +function showRefundRequestBadge(invoiceRow: Invoice) { + return !!(invoiceRow.latestRefundStatus + && [RefundApprovalStatus.DECLINED, RefundApprovalStatus.PENDING_APPROVAL] + .includes(invoiceRow.latestRefundStatus as RefundApprovalStatus)) +}