219 lines
11 KiB
Go
219 lines
11 KiB
Go
package contract
|
|
|
|
import (
|
|
"time"
|
|
|
|
"github.com/google/uuid"
|
|
)
|
|
|
|
type CreateOrderRequest struct {
|
|
OutletID uuid.UUID `json:"outlet_id" validate:"required"`
|
|
UserID uuid.UUID `json:"user_id" validate:"required"`
|
|
CustomerID *uuid.UUID `json:"customer_id"`
|
|
TableNumber *string `json:"table_number,omitempty" validate:"omitempty,max=50"`
|
|
OrderType string `json:"order_type" validate:"required,oneof=dine_in takeaway delivery"`
|
|
Notes *string `json:"notes,omitempty" validate:"omitempty,max=1000"`
|
|
OrderItems []CreateOrderItemRequest `json:"order_items" validate:"required,min=1,dive"`
|
|
CustomerName *string `json:"customer_name,omitempty" validate:"omitempty,max=255"`
|
|
}
|
|
|
|
type AddToOrderRequest struct {
|
|
OrderItems []CreateOrderItemRequest `json:"order_items" validate:"required,min=1,dive"`
|
|
Notes *string `json:"notes,omitempty" validate:"omitempty,max=1000"`
|
|
Metadata map[string]interface{} `json:"metadata,omitempty"`
|
|
}
|
|
|
|
type AddToOrderResponse struct {
|
|
OrderID uuid.UUID `json:"order_id"`
|
|
OrderNumber string `json:"order_number"`
|
|
AddedItems []OrderItemResponse `json:"added_items"`
|
|
UpdatedOrder OrderResponse `json:"updated_order"`
|
|
}
|
|
|
|
type UpdateOrderRequest struct {
|
|
TableNumber *string `json:"table_number,omitempty" validate:"omitempty,max=50"`
|
|
Status *string `json:"status,omitempty" validate:"omitempty,oneof=pending preparing ready completed cancelled"`
|
|
DiscountAmount *float64 `json:"discount_amount,omitempty" validate:"omitempty,min=0"`
|
|
Notes *string `json:"notes,omitempty" validate:"omitempty,max=1000"`
|
|
Metadata map[string]interface{} `json:"metadata,omitempty"`
|
|
}
|
|
|
|
type CreateOrderItemRequest struct {
|
|
ProductID uuid.UUID `json:"product_id" validate:"required"`
|
|
ProductVariantID *uuid.UUID `json:"product_variant_id,omitempty"`
|
|
Quantity int `json:"quantity" validate:"required,min=1"`
|
|
UnitPrice *float64 `json:"unit_price,omitempty" validate:"omitempty,min=0"` // Optional, will use database price if not provided
|
|
Modifiers []map[string]interface{} `json:"modifiers,omitempty"`
|
|
Notes *string `json:"notes,omitempty" validate:"omitempty,max=500"`
|
|
Metadata map[string]interface{} `json:"metadata,omitempty"`
|
|
}
|
|
|
|
type UpdateOrderItemRequest struct {
|
|
Quantity *int `json:"quantity,omitempty" validate:"omitempty,min=1"`
|
|
UnitPrice *float64 `json:"unit_price,omitempty" validate:"omitempty,min=0"`
|
|
Modifiers []map[string]interface{} `json:"modifiers,omitempty"`
|
|
Status *string `json:"status,omitempty" validate:"omitempty,oneof=pending preparing completed cancelled"`
|
|
}
|
|
|
|
type OrderResponse struct {
|
|
ID uuid.UUID `json:"id"`
|
|
OrderNumber string `json:"order_number"`
|
|
OutletID uuid.UUID `json:"outlet_id"`
|
|
UserID uuid.UUID `json:"user_id"`
|
|
TableNumber *string `json:"table_number"`
|
|
OrderType string `json:"order_type"`
|
|
Status string `json:"status"`
|
|
Subtotal float64 `json:"subtotal"`
|
|
TaxAmount float64 `json:"tax_amount"`
|
|
DiscountAmount float64 `json:"discount_amount"`
|
|
TotalAmount float64 `json:"total_amount"`
|
|
Notes *string `json:"notes"`
|
|
Metadata map[string]interface{} `json:"metadata,omitempty"`
|
|
CreatedAt time.Time `json:"created_at"`
|
|
UpdatedAt time.Time `json:"updated_at"`
|
|
OrderItems []OrderItemResponse `json:"order_items,omitempty"`
|
|
IsRefund bool `json:"is_refund"`
|
|
}
|
|
|
|
type OrderItemResponse struct {
|
|
ID uuid.UUID `json:"id"`
|
|
OrderID uuid.UUID `json:"order_id"`
|
|
ProductID uuid.UUID `json:"product_id"`
|
|
ProductName string `json:"product_name"`
|
|
ProductVariantID *uuid.UUID `json:"product_variant_id"`
|
|
ProductVariantName *string `json:"product_variant_name,omitempty"`
|
|
Quantity int `json:"quantity"`
|
|
UnitPrice float64 `json:"unit_price"`
|
|
TotalPrice float64 `json:"total_price"`
|
|
Modifiers []map[string]interface{} `json:"modifiers"`
|
|
Notes *string `json:"notes,omitempty"`
|
|
Metadata map[string]interface{} `json:"metadata,omitempty"`
|
|
Status string `json:"status"`
|
|
CreatedAt time.Time `json:"created_at"`
|
|
UpdatedAt time.Time `json:"updated_at"`
|
|
PrinterType string `json:"printer_type"`
|
|
}
|
|
|
|
type ListOrdersQuery struct {
|
|
OrganizationID string `form:"organization_id"`
|
|
OutletID string `form:"outlet_id"`
|
|
UserID string `form:"user_id"`
|
|
CustomerID string `form:"customer_id"`
|
|
OrderType string `form:"order_type"`
|
|
Status string `form:"status"`
|
|
PaymentStatus string `form:"payment_status"`
|
|
IsVoid string `form:"is_void"`
|
|
IsRefund string `form:"is_refund"`
|
|
DateFrom string `form:"date_from"`
|
|
DateTo string `form:"date_to"`
|
|
Search string `form:"search"`
|
|
Page int `form:"page,default=1"`
|
|
Limit int `form:"limit,default=10"`
|
|
}
|
|
|
|
type ListOrdersRequest struct {
|
|
Page int `json:"page" validate:"min=1"`
|
|
Limit int `json:"limit" validate:"min=1,max=100"`
|
|
OutletID *uuid.UUID `json:"outlet_id,omitempty"`
|
|
UserID *uuid.UUID `json:"user_id,omitempty"`
|
|
Status *string `json:"status,omitempty" validate:"omitempty,oneof=pending preparing ready completed cancelled"`
|
|
OrderType *string `json:"order_type,omitempty" validate:"omitempty,oneof=dine_in takeaway delivery"`
|
|
DateFrom *time.Time `json:"date_from,omitempty"`
|
|
DateTo *time.Time `json:"date_to,omitempty"`
|
|
}
|
|
|
|
type ListOrdersResponse struct {
|
|
Orders []OrderResponse `json:"orders"`
|
|
TotalCount int `json:"total_count"`
|
|
Page int `json:"page"`
|
|
Limit int `json:"limit"`
|
|
TotalPages int `json:"total_pages"`
|
|
}
|
|
|
|
type VoidOrderRequest struct {
|
|
OrderID uuid.UUID `json:"order_id" validate:"required"`
|
|
Reason string `json:"reason" validate:"required"`
|
|
Type string `json:"type" validate:"required,oneof=ALL ITEM"`
|
|
Items []VoidItemRequest `json:"items,omitempty" validate:"required_if=Type ITEM,dive"`
|
|
}
|
|
|
|
type VoidItemRequest struct {
|
|
OrderItemID uuid.UUID `json:"order_item_id" validate:"required"`
|
|
Quantity int `json:"quantity" validate:"required,min=1"`
|
|
}
|
|
|
|
type SetOrderCustomerRequest struct {
|
|
CustomerID uuid.UUID `json:"customer_id" validate:"required"`
|
|
}
|
|
|
|
type SetOrderCustomerResponse struct {
|
|
OrderID uuid.UUID `json:"order_id"`
|
|
CustomerID uuid.UUID `json:"customer_id"`
|
|
Message string `json:"message"`
|
|
}
|
|
|
|
// Payment-related contracts
|
|
type CreatePaymentRequest struct {
|
|
OrderID uuid.UUID `json:"order_id" validate:"required"`
|
|
PaymentMethodID uuid.UUID `json:"payment_method_id" validate:"required"`
|
|
Amount float64 `json:"amount" validate:"required,min=0"`
|
|
TransactionID *string `json:"transaction_id,omitempty" validate:"omitempty"`
|
|
SplitNumber int `json:"split_number,omitempty" validate:"omitempty,min=1"`
|
|
SplitTotal int `json:"split_total,omitempty" validate:"omitempty,min=1"`
|
|
SplitDescription *string `json:"split_description,omitempty" validate:"omitempty,max=255"`
|
|
PaymentOrderItems []CreatePaymentOrderItemRequest `json:"payment_order_items,omitempty" validate:"omitempty,dive"`
|
|
Metadata map[string]interface{} `json:"metadata,omitempty"`
|
|
}
|
|
|
|
type CreatePaymentOrderItemRequest struct {
|
|
OrderItemID uuid.UUID `json:"order_item_id" validate:"required"`
|
|
Amount float64 `json:"amount" validate:"required,min=0"`
|
|
}
|
|
|
|
type PaymentResponse struct {
|
|
ID uuid.UUID `json:"id"`
|
|
OrderID uuid.UUID `json:"order_id"`
|
|
PaymentMethodID uuid.UUID `json:"payment_method_id"`
|
|
Amount float64 `json:"amount"`
|
|
Status string `json:"status"`
|
|
TransactionID *string `json:"transaction_id,omitempty"`
|
|
SplitNumber int `json:"split_number"`
|
|
SplitTotal int `json:"split_total"`
|
|
SplitDescription *string `json:"split_description,omitempty"`
|
|
RefundAmount float64 `json:"refund_amount"`
|
|
RefundReason *string `json:"refund_reason,omitempty"`
|
|
RefundedAt *time.Time `json:"refunded_at,omitempty"`
|
|
RefundedBy *uuid.UUID `json:"refunded_by,omitempty"`
|
|
Metadata map[string]interface{} `json:"metadata,omitempty"`
|
|
CreatedAt time.Time `json:"created_at"`
|
|
UpdatedAt time.Time `json:"updated_at"`
|
|
PaymentOrderItems []PaymentOrderItemResponse `json:"payment_order_items,omitempty"`
|
|
}
|
|
|
|
type PaymentOrderItemResponse struct {
|
|
ID uuid.UUID `json:"id"`
|
|
PaymentID uuid.UUID `json:"payment_id"`
|
|
OrderItemID uuid.UUID `json:"order_item_id"`
|
|
Amount float64 `json:"amount"`
|
|
CreatedAt time.Time `json:"created_at"`
|
|
UpdatedAt time.Time `json:"updated_at"`
|
|
}
|
|
|
|
type RefundOrderRequest struct {
|
|
Reason *string `json:"reason,omitempty" validate:"omitempty,max=255"`
|
|
RefundAmount *float64 `json:"refund_amount,omitempty" validate:"omitempty,min=0"`
|
|
OrderItems []RefundOrderItemRequest `json:"order_items,omitempty" validate:"omitempty,dive"`
|
|
}
|
|
|
|
type RefundOrderItemRequest struct {
|
|
OrderItemID uuid.UUID `json:"order_item_id" validate:"required"`
|
|
RefundQuantity int `json:"refund_quantity,omitempty" validate:"omitempty,min=1"`
|
|
RefundAmount *float64 `json:"refund_amount,omitempty" validate:"omitempty,min=0"`
|
|
Reason *string `json:"reason,omitempty" validate:"omitempty,max=255"`
|
|
}
|
|
|
|
type RefundPaymentRequest struct {
|
|
RefundAmount float64 `json:"refund_amount" validate:"required,min=0"`
|
|
Reason string `json:"reason" validate:"omitempty,max=255"`
|
|
}
|