diff --git a/web/pay-ui/app/components/RoutingSlip/TransactionDataTable.vue b/web/pay-ui/app/components/RoutingSlip/TransactionDataTable.vue index d05c36e3..8db33029 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,65 @@ 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 isRefundable(invoiceRow: Invoice): boolean { + 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)) +} + +function showViewDetails(invoiceRow: Invoice) { + const isCancelled = isAlreadyCancelled(invoiceRow.statusCode) + const isRefund = invoiceRow.latestRefundStatus + && ![RefundApprovalStatus.DECLINED] + .includes(invoiceRow.latestRefundStatus as RefundApprovalStatus) + + return isCancelled || isRefund +}