fix: checkout issues - hidden fields, coupons, shipping in order totals

1. Hidden fields now properly hidden in SPA
   - Added billing_postcode and shipping_postcode to isFieldHidden checks
   - Fields with type='hidden' from PHP now conditionally rendered

2. Coupons now applied to order total
   - Added coupons array to order submission payload
   - CartController now calls calculate_totals() before reading discounts
   - Returns per-coupon discount amounts {code, discount, type}

3. Shipping now applied to order total
   - Already handled in submit() via find_shipping_rate_for_order
   - Frontend now sends shipping_method in payload

4. Order details now include shipping/tracking info
   - checkout/order/{id} API includes shipping_lines, tracking_number, tracking_url
   - account/orders/{id} API includes same shipping/tracking fields
   - Tracking info read from multiple plugin meta keys

5. Thank you/OrderDetails page shows shipping method and AWB
   - Shipping Method section with courier name and cost
   - AWB tracking for processing/completed orders with Track Shipment button
This commit is contained in:
Dwindi Ramadhana
2026-01-08 23:04:31 +07:00
parent e8c60b3a09
commit 0e561d9e8c
4 changed files with 98 additions and 20 deletions

View File

@@ -532,6 +532,7 @@ export default function Checkout() {
},
payment_method: paymentMethod,
shipping_method: selectedShippingRate || undefined, // Selected shipping rate ID
coupons: appliedCoupons.map(c => c.code), // Send applied coupon codes
customer_note: orderNotes,
// Include all custom field data for backend processing
custom_fields: customFieldData,
@@ -771,16 +772,19 @@ export default function Checkout() {
)}
</div>
)}
<div>
<label className="block text-sm font-medium mb-2">Postcode / ZIP *</label>
<input
type="text"
required
value={billingData.postcode}
onChange={(e) => setBillingData({ ...billingData, postcode: e.target.value })}
className="w-full border rounded-lg px-4 py-2"
/>
</div>
{/* Postcode field - hidden if PHP sets type to 'hidden' */}
{!isFieldHidden('billing_postcode') && (
<div>
<label className="block text-sm font-medium mb-2">Postcode / ZIP *</label>
<input
type="text"
required
value={billingData.postcode}
onChange={(e) => setBillingData({ ...billingData, postcode: e.target.value })}
className="w-full border rounded-lg px-4 py-2"
/>
</div>
)}
{/* Custom billing fields from plugins */}
{billingCustomFields.map(field => (
@@ -962,16 +966,19 @@ export default function Checkout() {
)}
</div>
)}
<div>
<label className="block text-sm font-medium mb-2">Postcode / ZIP *</label>
<input
type="text"
required
value={shippingData.postcode}
onChange={(e) => setShippingData({ ...shippingData, postcode: e.target.value })}
className="w-full border rounded-lg px-4 py-2"
/>
</div>
{/* Postcode field - hidden if PHP sets type to 'hidden' */}
{!isFieldHidden('shipping_postcode') && (
<div>
<label className="block text-sm font-medium mb-2">Postcode / ZIP *</label>
<input
type="text"
required
value={shippingData.postcode}
onChange={(e) => setShippingData({ ...shippingData, postcode: e.target.value })}
className="w-full border rounded-lg px-4 py-2"
/>
</div>
)}
{/* Custom shipping fields from plugins */}
{shippingCustomFields.map(field => (