Skip to content
advanced Phase 104 · Commerce Design Advanced

Order Management System Design

45m
1 problems
Topic Progress 0%

Order Management Overview

Order Lifecycle

Order States:
├── new (pending payment)
├── pending_payment (waiting for payment)
├── processing (payment received, fulfillment started)
├── complete (shipped/delivered)
├── closed (post-delivery period ended)
├── canceled (canceled by customer/admin)
├── holded (admin hold)
└── review (fraud review)

Order Statuses:
├── pending
├── processing
│   ├── shipped
│   ├── delivered
│   └── canceled
├── complete
└── closed

Order Data Model

-- Order table
CREATE TABLE sales_order (
    entity_id INT AUTO_INCREMENT PRIMARY KEY,
    increment_id VARCHAR(50) UNIQUE,
    store_id INT,
    customer_id INT,
    customer_email VARCHAR(255),
    customer_firstname VARCHAR(255),
    customer_lastname VARCHAR(255),
    status VARCHAR(32),
    state VARCHAR(32),
    subtotal DECIMAL(12,4),
    discount_amount DECIMAL(12,4),
    shipping_amount DECIMAL(12,4),
    tax_amount DECIMAL(12,4),
    grand_total DECIMAL(12,4),
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);

-- Order item table
CREATE TABLE sales_order_item (
    item_id INT AUTO_INCREMENT PRIMARY KEY,
    order_id INT,
    parent_item_id INT NULL,
    product_id INT,
    sku VARCHAR(255),
    name VARCHAR(255),
    qty_ordered DECIMAL(12,4),
    qty_shipped DECIMAL(12,4) DEFAULT 0,
    qty_canceled DECIMAL(12,4) DEFAULT 0,
    qty_refunded DECIMAL(12,4) DEFAULT 0,
    price DECIMAL(12,4),
    discount_amount DECIMAL(12,4),
    row_total DECIMAL(12,4)
);

-- Order status history
CREATE TABLE sales_order_status_history (
    entity_id INT AUTO_INCREMENT PRIMARY KEY,
    order_id INT,
    comment TEXT,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    customer_notified TINYINT(1) DEFAULT 0,
    status VARCHAR(32)
);

Order Lifecycle Management

State Transitions

// Order state machine
$transitions = [
    'new' => ['pending_payment', 'processing', 'canceled'],
    'pending_payment' => ['processing', 'canceled'],
    'processing' => ['complete', 'canceled', 'holded'],
    'complete' => ['closed'],
    'holded' => ['processing', 'canceled'],
    'review' => ['processing', 'canceled'],
];

// State transition validation
public function canTransition($from, $to)
{
    $allowed = $transitions[$from] ?? [];
    return in_array($to, $allowed);
}

// Update order state
public function setState($order, $newState, $comment = '')
{
    if (!$this->canTransition($order->getState(), $newState)) {
        throw new \Exception('Invalid state transition');
    }
    
    $order->setState($newState);
    $order->setStatus($newState);
    
    if ($comment) {
        $order->addStatusHistoryComment($comment);
    }
    
    $order->save();
    
    // Trigger state change event
    $this->eventManager->dispatch('sales_order_state_change', [
        'order' => $order,
        'old_state' => $oldState,
        'new_state' => $newState
    ]);
}

Order Processing

// Process order after payment
public function processOrder($order)
{
    // 1. Update order status to processing
    $this->setState($order, 'processing', 'Payment received');
    
    // 2. Create invoice (if auto-invoice enabled)
    if ($this->config->isAutoInvoice()) {
        $this->invoiceService->create($order);
    }
    
    // 3. Notify warehouse
    $this->warehouseService->notifyNewOrder($order);
    
    // 4. Send order confirmation email
    $this->emailService->sendOrderConfirmation($order);
    
    // 5. Update inventory
    $this->inventoryService->deductStock($order);
}

Order Completion

// Complete order after delivery
public function completeOrder($order)
{
    // 1. Verify all items shipped
    $allShipped = true;
    foreach ($order->getItems() as $item) {
        if ($item->getQtyShipped() < $item->getQtyOrdered()) {
            $allShipped = false;
            break;
        }
    }
    
    if (!$allShipped) {
        throw new \Exception('Not all items shipped');
    }
    
    // 2. Update order status
    $this->setState($order, 'complete', 'Order delivered');
    
    // 3. Send thank you email
    $this->emailService->sendThankYou($order);
    
    // 4. Update customer lifetime value
    $this->customerService->updateLtv($order);
    
    // 5. Request review
    $this->reviewService->requestReview($order);
}

Fulfillment Process

Fulfillment Workflow

1. Order received
   ├── Validate order data
   ├── Check inventory availability
   └── Assign to fulfillment center

2. Pick and pack
   ├── Generate pick list
   ├── Pick items from warehouse
   ├── Pack items
   └── Print shipping label

3. Ship
   ├── Hand to carrier
   ├── Update tracking info
   ├── Send shipping notification
   └── Update order status

4. Deliver
   ├── Track shipment
   ├── Confirm delivery
   └── Complete order

Shipment Management

// Create shipment
public function createShipment($order, $items, $trackNumber)
{
    $shipment = $this->shipmentFactory->create();
    $shipment->setOrder($order);
    
    // Add items
    foreach ($items as $item) {
        $shipmentItem = $this->shipmentItemFactory->create();
        $shipmentItem->setOrderItem($item->getOrderItem());
        $shipmentItem->setQty($item->getQty());
        $shipment->addItem($shipmentItem);
    }
    
    // Add tracking
    $track = $this->trackFactory->create();
    $track->setNumber($trackNumber);
    $track->setCarrierCode('custom');
    $track->setTitle('Custom Carrier');
    $shipment->addTrack($track);
    
    // Save shipment
    $shipment->save();
    
    // Send shipping notification
    $this->emailService->sendShippingNotification($order, $shipment);
    
    return $shipment;
}

// Partial shipment
public function createPartialShipment($order, $items)
{
    // Create shipment for available items
    $shipment = $this->createShipment($order, $items);
    
    // Update order status
    $shippedCount = $this->getTotalShippedCount($order);
    $orderedCount = $this->getTotalOrderedCount($order);
    
    if ($shippedCount < $orderedCount) {
        $order->setState('processing', 'Partial shipment created');
    }
    
    return $shipment;
}

Returns and Refunds

Return Process

1. Return request
   ├── Customer submits return
   ├── Admin reviews request
   └── Approve/reject

2. Return received
   ├── Receive returned items
   ├── Inspect items
   └── Update return status

3. Refund processing
   ├── Calculate refund amount
   ├── Process refund
   ├── Update order status
   └── Send refund confirmation

Return Management

// Create return
class ReturnService
{
    public function createReturn($orderId, $items, $reason)
    {
        $order = $this->orderRepository->get($orderId);
        
        $return = $this->returnFactory->create();
        $return->setOrderId($orderId);
        $return->setStatus('pending');
        $return->setReason($reason);
        
        foreach ($items as $item) {
            $returnItem = $this->returnItemFactory->create();
            $returnItem->setOrderItemId($item['item_id']);
            $returnItem->setQty($item['qty']);
            $returnItem->setReason($item['reason']);
            $return->addItem($returnItem);
        }
        
        $return->save();
        
        // Notify admin
        $this->emailService->sendReturnRequest($return);
        
        return $return;
    }
    
    public function processRefund($returnId)
    {
        $return = $this->returnRepository->get($returnId);
        $order = $return->getOrder();
        
        // Calculate refund amount
        $refundAmount = $this->calculateRefundAmount($return);
        
        // Process refund through payment gateway
        $refund = $this->paymentService->refund($order, $refundAmount);
        
        // Update order status
        $order->addStatusHistoryComment(
            'Refund processed: ' . $refundAmount
        );
        $order->save();
        
        // Update return status
        $return->setStatus('refunded');
        $return->setRefundId($refund->getId());
        $return->save();
        
        // Send refund confirmation
        $this->emailService->sendRefundConfirmation($return);
        
        return $refund;
    }
}

Refund Calculation

// Calculate refund amount
public function calculateRefundAmount($return)
{
    $order = $return->getOrder();
    $refundAmount = 0;
    
    foreach ($return->getItems() as $returnItem) {
        $orderItem = $returnItem->getOrderItem();
        
        // Product price refund
        $itemRefund = $orderItem->getPrice() * $returnItem->getQty();
        
        // Discount proportional refund
        if ($orderItem->getDiscountAmount() > 0) {
            $discountRefund = ($orderItem->getDiscountAmount() / $orderItem->getQtyOrdered()) * $returnItem->getQty();
            $itemRefund -= $discountRefund;
        }
        
        $refundAmount += $itemRefund;
    }
    
    // Shipping refund (optional)
    if ($this->shouldRefundShipping($return)) {
        $refundAmount += $order->getShippingAmount();
    }
    
    // Tax refund
    $taxRefund = $this->calculateTaxRefund($return);
    $refundAmount += $taxRefund;
    
    return $refundAmount;
}

Practice Problems

0 / 1 solved
Order Management System

Design order management with multiple fulfillment centers, partial shipments, and returns.

Solution
// System:
// 1. Fulfillment: Route to nearest center
// 2. Partial: Ship available, backorder rest
// 3. Returns: RMA workflow, inspection
// 4. Refunds: Proportional calculation
// 5. Notifications: Email at each stage
// 6. Reporting: Order metrics, fulfillment times

Quiz

1. What are the main order states?

Question 1 options

2. What is partial shipment?

Question 2 options

3. What is the difference between refund and credit memo?

Question 3 options

4. How should returns be handled?

Question 4 options

Flashcards

Question

Order states?

Answer

new → pending_payment → processing → complete → closed

Question

Fulfillment steps?

Answer

Pick → Pack → Ship → Deliver

Question

Partial shipment?

Answer

Ship available items, backorder remaining

Question

Return process?

Answer

Request → Review → Receive → Inspect → Refund

Question

Refund calculation?

Answer

Item price × qty - proportional discount + tax

Revision Notes

Key Takeaways

  • 1. Order states: new → pending_payment → processing → complete → closed
  • 2. Fulfillment: Pick → Pack → Ship → Deliver
  • 3. Partial shipment: Ship available, backorder rest
  • 4. Return: Request → Review → Receive → Refund
  • 5. Refund: Item price × qty - discount + tax

Interview Tips

  • Explain order state transitions
  • Discuss fulfillment workflow
  • Know return/refund process
  • Understand partial shipment logic

Cheat Sheet

Order System

  • States: new→pending→processing→complete→closed
  • Fulfillment: Pick→Pack→Ship→Deliver
  • Partial: Ship available, backorder rest
  • Return: Request→Review→Receive→Refund
  • Refund: Price×qty - discount + tax