package validation type PurchaseItemPayload struct { WarehouseID uint `json:"warehouse_id" validate:"required,gt=0"` ProductID uint `json:"product_id" validate:"required,gt=0"` Quantity float64 `json:"qty" validate:"required,gt=0"` } type CreatePurchaseRequest struct { SupplierID uint `json:"supplier_id" validate:"required,gt=0"` CreditTerm int `json:"credit_term" validate:"required,gte=0"` Notes *string `json:"notes" validate:"omitempty,max=500"` Items []PurchaseItemPayload `json:"items" validate:"required,min=1,dive"` } type StaffPurchaseApprovalItem struct { PurchaseItemID uint `json:"purchase_item_id,omitempty" validate:"omitempty,gt=0"` // For new items (no purchase_item_id), product_id is required. ProductID uint `json:"product_id,omitempty" validate:"required_without=PurchaseItemID,omitempty,gt=0"` WarehouseID uint `json:"warehouse_id,omitempty" validate:"required_without=PurchaseItemID,omitempty,gt=0"` Qty *float64 `json:"qty,omitempty" validate:"required_without=PurchaseItemID,omitempty,gt=0"` Price float64 `json:"price" validate:"required,gt=0"` TotalPrice float64 `json:"total_price" validate:"required,gt=0"` } type ApproveStaffPurchaseRequest struct { Action string `json:"action" validate:"required,oneof=APPROVED REJECTED"` Items []StaffPurchaseApprovalItem `json:"items,omitempty" validate:"omitempty,min=1,dive"` Notes *string `json:"notes,omitempty" validate:"omitempty,max=500"` } type ApproveManagerPurchaseRequest struct { Action string `json:"action" validate:"required,oneof=APPROVED REJECTED"` Notes *string `json:"notes,omitempty" validate:"omitempty,max=500"` } type ReceivePurchaseItemRequest struct { PurchaseItemID uint `json:"purchase_item_id" validate:"required,gt=0"` WarehouseID *uint `json:"warehouse_id" validate:"omitempty,gt=0"` ReceivedDate string `json:"received_date" validate:"required,datetime=2006-01-02"` TravelNumber *string `json:"travel_number" validate:"omitempty,max=100"` TravelDocumentPath *string `json:"travel_document_path" validate:"omitempty,max=255"` VehicleNumber *string `json:"vehicle_number" validate:"omitempty,max=100"` ReceivedQty *float64 `json:"received_qty" validate:"omitempty,gte=0"` } type ReceivePurchaseRequest struct { Action string `json:"action" validate:"required,oneof=APPROVED REJECTED"` Items []ReceivePurchaseItemRequest `json:"items,omitempty" validate:"omitempty,min=1,dive"` Notes *string `json:"notes,omitempty" validate:"omitempty,max=500"` } type DeletePurchaseItemsRequest struct { ItemIDs []uint `json:"item_ids" validate:"required,min=1,dive,gt=0"` } type Query struct { Page int `query:"page" validate:"omitempty,number,min=1"` Limit int `query:"limit" validate:"omitempty,number,min=1,max=100"` SupplierID uint `query:"supplier_id" validate:"omitempty,gt=0"` AreaID uint `query:"area_id" validate:"omitempty,gt=0"` LocationID uint `query:"location_id" validate:"omitempty,gt=0"` ProductCategoryID uint `query:"product_category_id" validate:"omitempty,gt=0"` Search string `query:"search" validate:"omitempty,max=100"` CreatedFrom string `query:"created_from" validate:"omitempty,datetime=2006-01-02"` CreatedTo string `query:"created_to" validate:"omitempty,datetime=2006-01-02"` }