Commit Graph

4 Commits

Author SHA1 Message Date
dwindown
857d6315e6 fix(orders): Use WooCommerce cart for shipping calculation in order creation
## Issues Fixed:
1.  Shipping cost was zero in created orders
2.  Live rates (UPS, Rajaongkir) not calculated
3.  Shipping title shows service level (e.g., "JNE - REG")

## Root Cause:
Order creation was manually looking up static shipping cost:
```php
$shipping_cost = $method->get_option( 'cost', 0 );
```

This doesn't work for:
- Live rate methods (UPS, FedEx, Rajaongkir)
- Service-level rates (JNE REG vs YES vs OKE)
- Dynamic pricing based on weight/destination

## Solution:
Use WooCommerce cart to calculate actual shipping cost:

```php
// Initialize cart
WC()->cart->empty_cart();
WC()->cart->add_to_cart( $product_id, $qty );

// Set shipping address
WC()->customer->set_shipping_address( $address );

// Set chosen method
WC()->session->set( 'chosen_shipping_methods', [ $method_id ] );

// Calculate
WC()->cart->calculate_shipping();
WC()->cart->calculate_totals();

// Get calculated rate
$packages = WC()->shipping()->get_packages();
$rate = $packages[0]['rates'][ $method_id ];
$cost = $rate->get_cost();
$label = $rate->get_label(); // "JNE - REG (1-2 days)"
$taxes = $rate->get_taxes();
```

## Benefits:
-  Live rates calculated correctly
-  Service-level labels preserved
-  Shipping taxes included
-  Works with all shipping plugins
-  Same logic as frontend preview

## Testing:
1. Create order with UPS → Shows "UPS Ground" + correct cost
2. Create order with Rajaongkir → Shows "JNE - REG" + correct cost
3. Order detail page → Shows full service name
4. Shipping cost → Matches preview calculation
2025-11-10 16:25:52 +07:00
dwindown
75133c366a fix(orders): Initialize WooCommerce cart/session before use
## Issue:
500 error on shipping/calculate and orders/preview endpoints
Error: "Call to a member function empty_cart() on null"

## Root Cause:
WC()->cart is not initialized in admin/REST API context
Calling WC()->cart->empty_cart() fails when cart is null

## Solution:
Initialize WooCommerce cart and session before using:

```php
// Initialize if not already loaded
if ( ! WC()->cart ) {
    wc_load_cart();
}
if ( ! WC()->session ) {
    WC()->session = new \WC_Session_Handler();
    WC()->session->init();
}

// Now safe to use
WC()->cart->empty_cart();
```

## Changes:
- Added initialization in calculate_shipping()
- Added initialization in preview_order()
- Both methods now safely use WC()->cart

## Testing:
-  Endpoints no longer return 500 error
-  Cart operations work correctly
-  Session handling works in admin context
2025-11-10 16:06:15 +07:00
dwindown
619fe45055 feat(orders): Add WooCommerce-native calculation endpoints
## Problem:
1. No shipping service options (UPS Ground, UPS Express, etc.)
2. Tax not calculated (11% PPN not showing)
3. Manual cost calculation instead of using WooCommerce core

## Root Cause:
Current implementation manually sets shipping costs from static config:
```php
$shipping_cost = $method->get_option( 'cost', 0 );
$ship_item->set_total( $shipping_cost );
```

This doesn't work for:
- Live rate methods (UPS, FedEx) - need dynamic calculation
- Tax calculation - WooCommerce needs proper context
- Service-level rates (UPS Ground vs Express)

## Solution: Use WooCommerce Native Calculation

### New Endpoints:

1. **POST /woonoow/v1/shipping/calculate**
   - Calculates real-time shipping rates
   - Uses WooCommerce cart + customer address
   - Returns all available methods with costs
   - Supports live rate plugins (UPS, FedEx)
   - Returns service-level options

2. **POST /woonoow/v1/orders/preview**
   - Previews order totals before creation
   - Calculates: subtotal, shipping, tax, discounts, total
   - Uses WooCommerce cart engine
   - Respects tax settings and rates
   - Applies coupons correctly

### How It Works:

```php
// Temporarily use WooCommerce cart
WC()->cart->empty_cart();
WC()->cart->add_to_cart( $product_id, $qty );
WC()->customer->set_shipping_address( $address );
WC()->cart->calculate_shipping();
WC()->cart->calculate_totals();

// Get calculated rates
$packages = WC()->shipping()->get_packages();
foreach ( $packages as $package ) {
    $rates = $package['rates']; // UPS Ground, UPS Express, etc.
}

// Get totals with tax
$total = WC()->cart->get_total();
$tax = WC()->cart->get_total_tax();
```

### Benefits:
-  Live shipping rates work
-  Service-level options appear
-  Tax calculated correctly
-  Coupons applied properly
-  Uses WooCommerce core logic
-  No reinventing the wheel

### Next Steps (Frontend):
1. Call `/shipping/calculate` when address changes
2. Show service options in dropdown
3. Call `/orders/preview` to show totals with tax
4. Update UI to display tax breakdown
2025-11-10 15:53:58 +07:00
dwindown
232059e928 feat: Complete Dashboard API Integration with Analytics Controller
 Features:
- Implemented API integration for all 7 dashboard pages
- Added Analytics REST API controller with 7 endpoints
- Full loading and error states with retry functionality
- Seamless dummy data toggle for development

📊 Dashboard Pages:
- Customers Analytics (complete)
- Revenue Analytics (complete)
- Orders Analytics (complete)
- Products Analytics (complete)
- Coupons Analytics (complete)
- Taxes Analytics (complete)
- Dashboard Overview (complete)

🔌 Backend:
- Created AnalyticsController.php with REST endpoints
- All endpoints return 501 (Not Implemented) for now
- Ready for HPOS-based implementation
- Proper permission checks

🎨 Frontend:
- useAnalytics hook for data fetching
- React Query caching
- ErrorCard with retry functionality
- TypeScript type safety
- Zero build errors

📝 Documentation:
- DASHBOARD_API_IMPLEMENTATION.md guide
- Backend implementation roadmap
- Testing strategy

🔧 Build:
- All pages compile successfully
- Production-ready with dummy data fallback
- Zero TypeScript errors
2025-11-04 11:19:00 +07:00