118 lines
6.0 KiB
Go
118 lines
6.0 KiB
Go
package contract
|
|
|
|
import (
|
|
"time"
|
|
|
|
"github.com/google/uuid"
|
|
)
|
|
|
|
type CreatePurchaseOrderRequest struct {
|
|
VendorID uuid.UUID `json:"vendor_id" validate:"required"`
|
|
PONumber string `json:"po_number" validate:"required,min=1,max=50"`
|
|
TransactionDate string `json:"transaction_date" validate:"required"` // Format: YYYY-MM-DD
|
|
DueDate string `json:"due_date" validate:"required"` // Format: YYYY-MM-DD
|
|
Reference *string `json:"reference,omitempty" validate:"omitempty,max=100"`
|
|
Status *string `json:"status,omitempty" validate:"omitempty,oneof=draft sent approved received cancelled"`
|
|
Message *string `json:"message,omitempty" validate:"omitempty"`
|
|
Items []CreatePurchaseOrderItemRequest `json:"items" validate:"required,min=1,dive"`
|
|
AttachmentFileIDs []uuid.UUID `json:"attachment_file_ids,omitempty"`
|
|
}
|
|
|
|
type CreatePurchaseOrderItemRequest struct {
|
|
IngredientID uuid.UUID `json:"ingredient_id" validate:"required"`
|
|
Description *string `json:"description,omitempty" validate:"omitempty"`
|
|
Quantity float64 `json:"quantity" validate:"required,gt=0"`
|
|
UnitID uuid.UUID `json:"unit_id" validate:"required"`
|
|
Amount float64 `json:"amount" validate:"required,gte=0"`
|
|
}
|
|
|
|
type UpdatePurchaseOrderRequest struct {
|
|
VendorID *uuid.UUID `json:"vendor_id,omitempty" validate:"omitempty"`
|
|
PONumber *string `json:"po_number,omitempty" validate:"omitempty,min=1,max=50"`
|
|
TransactionDate *string `json:"transaction_date,omitempty" validate:"omitempty"` // Format: YYYY-MM-DD
|
|
DueDate *string `json:"due_date,omitempty" validate:"omitempty"` // Format: YYYY-MM-DD
|
|
Reference *string `json:"reference,omitempty" validate:"omitempty,max=100"`
|
|
Status *string `json:"status,omitempty" validate:"omitempty,oneof=draft sent approved received cancelled"`
|
|
Message *string `json:"message,omitempty" validate:"omitempty"`
|
|
Items []UpdatePurchaseOrderItemRequest `json:"items,omitempty" validate:"omitempty,dive"`
|
|
AttachmentFileIDs []uuid.UUID `json:"attachment_file_ids,omitempty"`
|
|
}
|
|
|
|
type UpdatePurchaseOrderItemRequest struct {
|
|
ID *uuid.UUID `json:"id,omitempty"` // For existing items
|
|
IngredientID *uuid.UUID `json:"ingredient_id,omitempty" validate:"omitempty"`
|
|
Description *string `json:"description,omitempty" validate:"omitempty"`
|
|
Quantity *float64 `json:"quantity,omitempty" validate:"omitempty,gt=0"`
|
|
UnitID *uuid.UUID `json:"unit_id,omitempty" validate:"omitempty"`
|
|
Amount *float64 `json:"amount,omitempty" validate:"omitempty,gte=0"`
|
|
}
|
|
|
|
type PurchaseOrderResponse struct {
|
|
ID uuid.UUID `json:"id"`
|
|
OrganizationID uuid.UUID `json:"organization_id"`
|
|
VendorID uuid.UUID `json:"vendor_id"`
|
|
PONumber string `json:"po_number"`
|
|
TransactionDate time.Time `json:"transaction_date"`
|
|
DueDate time.Time `json:"due_date"`
|
|
Reference *string `json:"reference"`
|
|
Status string `json:"status"`
|
|
Message *string `json:"message"`
|
|
TotalAmount float64 `json:"total_amount"`
|
|
CreatedAt time.Time `json:"created_at"`
|
|
UpdatedAt time.Time `json:"updated_at"`
|
|
Vendor *VendorResponse `json:"vendor,omitempty"`
|
|
Items []PurchaseOrderItemResponse `json:"items,omitempty"`
|
|
Attachments []PurchaseOrderAttachmentResponse `json:"attachments,omitempty"`
|
|
}
|
|
|
|
type PurchaseOrderItemResponse struct {
|
|
ID uuid.UUID `json:"id"`
|
|
PurchaseOrderID uuid.UUID `json:"purchase_order_id"`
|
|
IngredientID uuid.UUID `json:"ingredient_id"`
|
|
Description *string `json:"description"`
|
|
Quantity float64 `json:"quantity"`
|
|
UnitID uuid.UUID `json:"unit_id"`
|
|
Amount float64 `json:"amount"`
|
|
CreatedAt time.Time `json:"created_at"`
|
|
UpdatedAt time.Time `json:"updated_at"`
|
|
Ingredient *IngredientResponse `json:"ingredient,omitempty"`
|
|
Unit *UnitResponse `json:"unit,omitempty"`
|
|
}
|
|
|
|
type PurchaseOrderAttachmentResponse struct {
|
|
ID uuid.UUID `json:"id"`
|
|
PurchaseOrderID uuid.UUID `json:"purchase_order_id"`
|
|
FileID uuid.UUID `json:"file_id"`
|
|
CreatedAt time.Time `json:"created_at"`
|
|
File *FileResponse `json:"file,omitempty"`
|
|
}
|
|
|
|
type ListPurchaseOrdersRequest struct {
|
|
Page int `json:"page" validate:"min=1"`
|
|
Limit int `json:"limit" validate:"min=1,max=100"`
|
|
Search string `json:"search,omitempty"`
|
|
Status string `json:"status,omitempty" validate:"omitempty,oneof=draft sent approved received cancelled"`
|
|
VendorID *uuid.UUID `json:"vendor_id,omitempty"`
|
|
StartDate *time.Time `json:"start_date,omitempty"`
|
|
EndDate *time.Time `json:"end_date,omitempty"`
|
|
}
|
|
|
|
type ListPurchaseOrdersResponse struct {
|
|
PurchaseOrders []PurchaseOrderResponse `json:"purchase_orders"`
|
|
TotalCount int `json:"total_count"`
|
|
Page int `json:"page"`
|
|
Limit int `json:"limit"`
|
|
TotalPages int `json:"total_pages"`
|
|
}
|
|
|
|
// Helper types for ingredient and unit responses
|
|
type IngredientResponse struct {
|
|
ID uuid.UUID `json:"id"`
|
|
Name string `json:"name"`
|
|
}
|
|
|
|
type UnitResponse struct {
|
|
ID uuid.UUID `json:"id"`
|
|
Name string `json:"name"`
|
|
}
|