Adds GET /customer/orders and GET /customer/orders/:id for the customer app: the orders linked to the logged-in customer across their organization's outlets, newest first, paginated (limit 1-100, default 20). The list shows the order number, outlet, type, status, total, item count, void/refund flags and the EnakPoint and EnakCoin it earned. The detail adds the amounts, the items with product and variant names, weight and unit for weighed lines, modifiers and notes, and the payments with the method and, for EnakPoint, the points used. Costs, cashier and other internal fields are left out. Another customer's order answers 404 like one that does not exist. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
75 lines
2.7 KiB
Go
75 lines
2.7 KiB
Go
package models
|
|
|
|
import (
|
|
"time"
|
|
|
|
"github.com/google/uuid"
|
|
)
|
|
|
|
// CustomerOrderSummary is one order in GET /customer/orders.
|
|
type CustomerOrderSummary struct {
|
|
ID uuid.UUID `json:"id"`
|
|
OrderNumber string `json:"order_number"`
|
|
OutletID uuid.UUID `json:"outlet_id"`
|
|
OutletName string `json:"outlet_name"`
|
|
OrderType string `json:"order_type"`
|
|
Status string `json:"status"`
|
|
PaymentStatus string `json:"payment_status"`
|
|
TotalAmount float64 `json:"total_amount"`
|
|
ItemCount int64 `json:"item_count"`
|
|
IsVoid bool `json:"is_void"`
|
|
IsRefund bool `json:"is_refund"`
|
|
// EnakPoint and EnakCoin the order earned; 0 when it earned nothing.
|
|
PointsEarned int64 `json:"points_earned"`
|
|
CoinsEarned int64 `json:"coins_earned"`
|
|
CreatedAt time.Time `json:"created_at"`
|
|
}
|
|
|
|
// CustomerOrderDetail is GET /customer/orders/:id.
|
|
type CustomerOrderDetail struct {
|
|
CustomerOrderSummary
|
|
TableNumber *string `json:"table_number"`
|
|
Subtotal float64 `json:"subtotal"`
|
|
DiscountAmount float64 `json:"discount_amount"`
|
|
TaxAmount float64 `json:"tax_amount"`
|
|
RefundAmount float64 `json:"refund_amount"`
|
|
Items []CustomerOrderItem `json:"items"`
|
|
Payments []CustomerOrderPayment `json:"payments"`
|
|
}
|
|
|
|
type CustomerOrderItem struct {
|
|
ID uuid.UUID `json:"id"`
|
|
ProductID uuid.UUID `json:"product_id"`
|
|
ProductName string `json:"product_name"`
|
|
VariantName *string `json:"variant_name"`
|
|
Quantity int `json:"quantity"`
|
|
// Set for products sold by weight, in UnitName.
|
|
Weight *float64 `json:"weight,omitempty"`
|
|
UnitName *string `json:"unit_name,omitempty"`
|
|
UnitPrice float64 `json:"unit_price"`
|
|
TotalPrice float64 `json:"total_price"`
|
|
RefundQuantity int `json:"refund_quantity"`
|
|
Modifiers []map[string]interface{} `json:"modifiers"`
|
|
Notes *string `json:"notes,omitempty"`
|
|
Status string `json:"status"`
|
|
}
|
|
|
|
type CustomerOrderPayment struct {
|
|
ID uuid.UUID `json:"id"`
|
|
MethodName string `json:"method_name"`
|
|
MethodType string `json:"method_type"`
|
|
Amount float64 `json:"amount"`
|
|
Status string `json:"status"`
|
|
RefundAmount float64 `json:"refund_amount"`
|
|
// Set for a payment with EnakPoint.
|
|
PointsUsed *int64 `json:"points_used,omitempty"`
|
|
PointValue *float64 `json:"point_value,omitempty"`
|
|
CreatedAt time.Time `json:"created_at"`
|
|
}
|
|
|
|
// ListCustomerOrdersQuery is GET /customer/orders.
|
|
type ListCustomerOrdersQuery struct {
|
|
Page int `form:"page"`
|
|
Limit int `form:"limit"`
|
|
}
|