Update Commercial order shipping Address

The updateCommercialOrderShippingAddress function updates the shipping address for an existing commercial order. This function is essential for order management workflows where customers need to change delivery addresses before shipment or when address corrections are required. It enables flexible order management while maintaining proper audit trails and validation.

This function is typically used during order processing phases before the order transitions to fulfillment stages, ensuring that products are delivered to the correct address as specified by the customer.

Process Flow

sequenceDiagram
    participant User as User
    participant Component as Vue Component
    participant UCO as useCommercialOrder
    participant Auth as Authentication
    participant API as Order API
    participant Validation as Address Validation
    participant DB as Database

    User->>Component: Update Shipping Address
    Component->>UCO: updateCommercialOrderShippingAddress(params)
    UCO->>Auth: ensureAuthenticated()

    alt Authentication Valid
        Auth-->>UCO: Authenticated
        UCO->>API: PUT /api/commercial-orders/{orderId}/shipping-address
        API->>Validation: Validate Address ID
        Validation-->>API: Address Valid
        API->>DB: Update Order Shipping Address
        DB-->>API: Update Successful
        API-->>UCO: Update Response
        UCO-->>Component: Success Response
        Component-->>User: Confirmation Message
    else Authentication Failed
        Auth-->>UCO: Authentication Error
        UCO-->>Component: Error Response
        Component-->>User: Redirect to Login
    else Invalid Address
        Validation-->>API: Invalid Address ID
        API-->>UCO: 400 Error
        UCO-->>Component: Validation Error
        Component-->>User: Show Validation Message
    else Order Not Modifiable
        API-->>UCO: 412 Error
        UCO-->>Component: Precondition Failed
        Component-->>User: Show Order Status Message
    end

Call Parameters

Request Interface

interface UpdateCommercialOrderShippingAddressRequest {
  orderId: string;
  shippingAddressId: string;
}

Parameters Detail

ParameterTypeRequiredDefaultExampleBusiness Impact
orderIdstring-"co-123456"Identifies the order to update
shippingAddressIdstring-"addr-789012"New shipping address to assign to the order

Example Call

const { updateCommercialOrderShippingAddress } = useCommercialOrder();

// Update shipping address for an order
const updateResult = await updateCommercialOrderShippingAddress({
  orderId: "co-123456",
  shippingAddressId: "addr-789012",
});

console.log("Shipping address updated:", updateResult.success);

Composable Returns

Response Interface

interface UpdateCommercialOrderShippingAddressResponse {
  success: boolean;
  order: CommercialOrder;
  message: string;
}

Response Structure

{
  "success": true,
  "order": {
    "id": "co-123456",
    "reference": "CO-2024-001",
    "status": "CREATED",
    "totalPrice": 1250.99,
    "totalPriceWithoutTax": 1042.49,
    "totalTaxAmount": 208.5,
    "totalShippingFees": 18.0,
    "currency": "EUR",
    "createdAt": "2024-01-15T10:30:00Z",
    "updatedAt": "2024-01-16T15:45:00Z",
    "shippingInformation": {
      "type": "standard",
      "addressId": "addr-789012",
      "address": {
        "id": "addr-789012",
        "name": "John Doe",
        "company": "Acme Corp",
        "street": "456 New Business Avenue",
        "city": "Lyon",
        "postalCode": "69001",
        "country": "France",
        "phone": "+33 1 23 45 67 89",
        "email": "[email protected]"
      },
      "estimatedDeliveryDate": "2024-01-20T00:00:00Z",
      "carrier": "Colissimo",
      "notes": "Updated shipping address"
    },
    "customFields": [
      {
        "externalId": "address-change-reason",
        "value": "Customer requested address change",
        "type": "text",
        "label": "Address Change Reason"
      }
    ]
  },
  "message": "Shipping address updated successfully"
}

Error Handling

HTTP Error Codes

CodeCauseSystem ActionUser MessageRecovery Action
401Invalid/expired tokenAutomatic token refresh attempt"Session expired, please log in again"Redirect to login
400Invalid address ID or order IDLog validation error"Invalid address or order identifier"Verify address and order IDs
403Insufficient permissionsLog access attempt"You don't have permission to modify this order"Contact administrator
404Order or address not foundLog search attempt"Order or address not found"Verify order and address exist
409Address already assignedLog conflict"This address is already assigned to the order"Check current order address
412Order not modifiableLog status check"Order cannot be modified in current status"Check order status
422Address validation failedLog validation failure"Address validation failed"Check address format and completeness
429Rate limit exceededImplement retry logic"Too many requests, please wait"Implement exponential backoff
500Server errorLog error, fallback"Server error, please try again later"Retry with exponential backoff

Error Handling Implementation

const updateCommercialOrderShippingAddress = async (
  params: UpdateCommercialOrderShippingAddressRequest
) => {
  try {
    await ensureAuthenticated();

    const { data, error } =
      await useFetch<UpdateCommercialOrderShippingAddressResponse>(
        `/api/commercial-orders/${params.orderId}/shipping-address`,
        {
          method: "PUT",
          body: { shippingAddressId: params.shippingAddressId },
          retry: 2,
          retryDelay: 1000,
          timeout: 10000,
        }
      );

    if (error.value) {
      throw new Error(
        `Failed to update shipping address: ${error.value.statusMessage}`
      );
    }

    return data.value as UpdateCommercialOrderShippingAddressResponse;
  } catch (error) {
    const toast = useToast();

    if (error.statusCode === 401) {
      const { logout } = useDjustAuth();
      await logout();
      await navigateTo("/auth/login");
    } else if (error.statusCode === 412) {
      toast.add({
        title: "Cannot Modify Order",
        description: "This order cannot be modified in its current status",
        color: "warning",
      });
    } else if (error.statusCode === 404) {
      toast.add({
        title: "Not Found",
        description: "Order or address not found",
        color: "warning",
      });
    } else if (error.statusCode === 422) {
      toast.add({
        title: "Address Validation Failed",
        description: "Please check the address information and try again",
        color: "warning",
      });
    } else {
      toast.add({
        title: "Update Failed",
        description: "Failed to update shipping address. Please try again.",
        color: "error",
      });
    }

    throw error;
  }
};

Use Cases

1. Customer Address Change Request

Allow customers to update shipping addresses before shipment:

  • Validate new address against customer's address book
  • Check order status to ensure modification is allowed
  • Update delivery estimates based on new location
  • Send confirmation to customer about address change

2. Address Correction Workflow

Enable address corrections for delivery optimization:

  • Verify address validity and deliverability
  • Update shipping costs based on new location
  • Adjust delivery timeframes for new destination
  • Maintain audit trail of address changes

3. Business Relocation Handling

Manage address updates for business customers:

  • Support multiple delivery locations for business accounts
  • Handle address validation for commercial properties
  • Update default shipping preferences if requested
  • Coordinate with logistics partners for delivery changes

4. Emergency Address Changes

Handle urgent address modification requests:

  • Validate time constraints for address changes
  • Check order fulfillment status before allowing changes
  • Expedite processing for time-sensitive deliveries
  • Notify relevant parties of address modifications

Key Performance Points

Performance Optimization

  • Validation Caching: Cache address validation results to reduce API calls
  • Batch Updates: Support multiple address changes in single transaction
  • Async Processing: Process address validation asynchronously when possible
  • Delivery Estimation: Update shipping costs and delivery dates efficiently

Security Considerations

  • Authentication Validation: Always verify user authentication before address updates
  • Permission Checking: Validate user permissions for order modifications
  • Address Validation: Ensure address belongs to customer or is valid business address
  • Audit Logging: Log all address changes for security and compliance tracking

Flexibility Features

  • Multiple Address Types: Support different address types (shipping, billing, pickup)
  • Address Book Integration: Seamless integration with customer address management
  • Validation Rules: Configurable address validation rules by region
  • Status Checking: Intelligent order status validation before allowing changes

Integration Capabilities

  • Store Integration: Update Order Store state after successful address changes
  • Component Integration: Reactive UI updates for address displays
  • Shipping Integration: Automatic recalculation of shipping costs and times
  • Notification Integration: Trigger notifications to relevant parties

Technical Implementation

Complete Function Code

/**
 * Update the shipping address of a commercial order
 * @param params - Request parameters including order ID and new address ID
 * @param config - Optional configuration for API call
 * @returns Promise resolving to updated order with new shipping address
 */
const updateCommercialOrderShippingAddress = async (
  params: UpdateCommercialOrderShippingAddressRequest,
  config?: Partial<DjustConfig>
): Promise<UpdateCommercialOrderShippingAddressResponse> => {
  try {
    // Ensure user is authenticated before proceeding
    await ensureAuthenticated();

    const { orderId, shippingAddressId } = params;

    if (!orderId) {
      throw new Error('The "orderId" parameter is required.');
    }
    if (!shippingAddressId) {
      throw new Error('The "shippingAddressId" parameter is required.');
    }

    // Update shipping address via API
    const { data, error } =
      await useFetch<UpdateCommercialOrderShippingAddressResponse>(
        `/api/commercial-orders/${orderId}/shipping-address`,
        {
          method: "PUT",
          query: config,
          body: { shippingAddressId },
          // Performance optimizations
          key: `update-shipping-address-${orderId}-${Date.now()}`,
          server: false,
        }
      );

    if (error.value) {
      throw new Error("Failed to update shipping address.");
    }

    console.log("Shipping address updated successfully");
    return data.value as UpdateCommercialOrderShippingAddressResponse;
  } catch (error) {
    console.error("Failed to update shipping address:", error);
    throw new Error(
      "Failed to update shipping address. Please try again later."
    );
  }
};

Execution Flow

Step-by-Step Process

  1. Authentication Verification

    await ensureAuthenticated();
  2. Parameter Validation

    if (!orderId) throw new Error('The "orderId" parameter is required.');
    if (!shippingAddressId)
      throw new Error('The "shippingAddressId" parameter is required.');
  3. API Call Execution

    const { data, error } = await useFetch(
      `/api/commercial-orders/${orderId}/shipping-address`,
      {
        method: "PUT",
        body: { shippingAddressId },
      }
    );
  4. Error Handling

    if (error.value) throw new Error("Failed to update shipping address.");
  5. Success Response

    return data.value as UpdateCommercialOrderShippingAddressResponse;
  6. Post-Update Actions (in calling component)

    // Update local state
    const orderStore = useOrderStore();
    orderStore.updateOrder(response.order);
    
    // Show success notification
    toast.add({
      title: "Address Updated",
      description: "Shipping address has been updated successfully",
      color: "success",
    });
    
    // Recalculate shipping costs if needed
    await recalculateShippingCosts(response.order.id);

This comprehensive function provides robust address update capabilities with proper validation, error handling, and integration with the broader order management system.