diff --git a/templates/transaction-process/view/index.php b/templates/transaction-process/view/index.php index 80f07c4..16564c3 100644 --- a/templates/transaction-process/view/index.php +++ b/templates/transaction-process/view/index.php @@ -382,7 +382,7 @@ $kiriof_wcDiscountTotal = 0.0; $kiriof_wcShippingDiscount = 0.0; $kiriof_wcCouponCodes = []; - $kiriof_wcTotal = $kiriof_shippingFee; // fallback + $kiriof_wcTotal = $kiriof_wcOrder ? (float) $kiriof_wcOrder->get_total() : $kiriof_shippingFee; if ($kiriof_isDeficitRow && ! empty($kiriof_row->wc_order_id)) { $kiriof_wcOrderForDeficit = wc_get_order((int) $kiriof_row->wc_order_id); if ($kiriof_wcOrderForDeficit) { @@ -397,13 +397,17 @@ $kiriof_adjItemCoupon = $kiriof_adjCouponScopes['item'][0] ?? ''; $kiriof_adjShipCoupon = $kiriof_adjCouponScopes['shipping'][0] ?? ''; + $kiriof_effectiveShippingCost = max(0.0, $kiriof_shippingCost - $kiriof_wcShippingDiscount); + $kiriof_effectiveCodPayout = $kiriof_wcTotal - $kiriof_effectiveShippingCost - $kiriof_insuranceCost - $kiriof_codFee; + $kiriof_canRequestPickup = $kiriof_isProcessable && (! $kiriof_isDeficitRow || $kiriof_effectiveCodPayout >= 0); + $kiriof_isProcessedFilter = ('processed' === $kiriof_status_filter); $kiriof_isAllFilter = ('all' === $kiriof_status_filter); $kiriof_canPrintRow = (($kiriof_isProcessedFilter || $kiriof_isAllFilter) && ! empty($kiriof_awb) && 'request_pickup' === $kiriof_row->status); $kiriof_checkboxDisabled = ($kiriof_isProcessedFilter || $kiriof_isAllFilter) - ? (! $kiriof_canPrintRow && ($kiriof_isDeficitRow || ! $kiriof_isProcessable)) - : ($kiriof_isDeficitRow || ! $kiriof_isProcessable); - $kiriof_checkboxTitle = $kiriof_isDeficitRow + ? (! $kiriof_canPrintRow && ! $kiriof_canRequestPickup) + : (! $kiriof_canRequestPickup); + $kiriof_checkboxTitle = $kiriof_isDeficitRow && $kiriof_effectiveCodPayout < 0 ? __('Resolve the COD deficit before proceeding.', 'kiriminaja-official') : (($kiriof_isProcessedFilter || ($kiriof_isAllFilter && ! $kiriof_isProcessable)) ? ($kiriof_canPrintRow ? '' : __('Order must have an AWB and request pickup status before it can be printed.', 'kiriminaja-official')) @@ -415,7 +419,7 @@ echo ' - + #' . esc_html($kiriof_row->wc_order_id) . ' diff --git a/tests/RequestPickupPaymentFlowTest.php b/tests/RequestPickupPaymentFlowTest.php index 42c4753..211cbe9 100644 --- a/tests/RequestPickupPaymentFlowTest.php +++ b/tests/RequestPickupPaymentFlowTest.php @@ -378,4 +378,34 @@ public function platform_shipping_discount_label_distinguishes_from_user_coupon( 'Admin order metabox should label platform-covered shipping discount as "Shipping Discount (from KiriminAja)"' ); } + + #[Test] + public function deficit_rows_with_non_negative_effective_cod_payout_remain_pickup_processable(): void + { + $transactionProcessView = file_get_contents(PLUGIN_DIR . '/templates/transaction-process/view/index.php'); + + $this->assertStringContainsString( + '$kiriof_effectiveShippingCost = max(0.0, $kiriof_shippingCost - $kiriof_wcShippingDiscount);', + $transactionProcessView, + 'Request pickup eligibility must use discounted shipping when evaluating COD payout' + ); + + $this->assertStringContainsString( + '$kiriof_effectiveCodPayout = $kiriof_wcTotal - $kiriof_effectiveShippingCost - $kiriof_insuranceCost - $kiriof_codFee;', + $transactionProcessView, + 'Request pickup eligibility must evaluate the effective COD payout' + ); + + $this->assertStringContainsString( + '$kiriof_canRequestPickup = $kiriof_isProcessable && (! $kiriof_isDeficitRow || $kiriof_effectiveCodPayout >= 0);', + $transactionProcessView, + 'Deficit rows should remain pickup-processable when the effective COD payout is non-negative' + ); + + $this->assertStringContainsString( + 'data-can-pickup="\' . ($kiriof_canRequestPickup ? \'1\' : \'0\')', + $transactionProcessView, + 'Request pickup checkbox must use effective processability instead of the raw deficit flag' + ); + } }