# Task 06: Checkout & Payment

## Goal
Place order. For each physical item, call `StockService::recordSale()` instead of
decrementing `products.stock_quantity` directly.

## Files
- `app/Services/Ecommerce/CheckoutService.php`
- `app/Services/Ecommerce/StockService.php`  ← used here
- `app/Http/Controllers/Api/CheckoutController.php`
- `app/Http/Requests/Ecommerce/CheckoutRequest.php`
- `app/Http/Resources/Ecommerce/OrderResource.php`
- `resources/views/checkout/index.blade.php`

## Steps
1. `CheckoutService::placeOrder()` inside `DB::transaction()`:
   - Step 1: Load cart items
   - Step 2: For each physical item → call `product->isAvailableToOrder()` → abort if false
   - Step 3: Calculate total
   - Step 4: Create Order
   - Step 5: Create OrderItems (snapshot all price fields)
   - Step 6: For each physical OrderItem → call `StockService::recordSale($product, $qty, $order)`
     - This writes: `movement_type = 'sale'`, `quantity`, `order_id` to `product_stock_logs`
     - Does NOT touch `products.stock_quantity`
   - Step 7: Clear cart
   - Step 8: Fire `OrderPlaced` event
2. Register routes
