diff --git a/internal/entity/order.go b/internal/entity/order.go index b92112a..6e20bf3 100644 --- a/internal/entity/order.go +++ b/internal/entity/order.go @@ -10,6 +10,7 @@ type Order struct { PartnerID int64 `gorm:"type:int;column:partner_id"` Status string `gorm:"type:varchar;column:status"` Amount float64 `gorm:"type:numeric;not null;column:amount"` + SiteID *int64 `gorm:"type:numeric;not null;column:site_id"` CreatedAt time.Time `gorm:"autoCreateTime;column:created_at"` UpdatedAt time.Time `gorm:"autoUpdateTime;column:updated_at"` CreatedBy int64 `gorm:"type:int;column:created_by"` @@ -117,10 +118,14 @@ type HistoryOrderDB struct { type OrderSearch struct { PartnerID *int64 + SiteID *int64 IsAdmin bool PaymentType string + Status string Limit int Offset int + StartDate string + EndDate string } type HistoryOrderList []*HistoryOrderDB diff --git a/internal/handlers/request/order.go b/internal/handlers/request/order.go index 326d521..cdc66a6 100644 --- a/internal/handlers/request/order.go +++ b/internal/handlers/request/order.go @@ -14,17 +14,24 @@ type Order struct { type OrderParam struct { PaymentType string `form:"payment_type" json:"payment_type" example:"CASH"` + StartDate string `form:"start_date" json:"start_date"` + EndDate string `form:"end_date" json:"end_date"` + Status string `form:"status" json:"status"` Limit int `form:"limit" json:"limit" example:"10"` Offset int `form:"offset" json:"offset" example:"0"` } func (o *OrderParam) ToOrderEntity(ctx mycontext.Context) entity.OrderSearch { return entity.OrderSearch{ - PartnerID: ctx.GetPartnerID(), - IsAdmin: ctx.IsAdmin(), + PartnerID: ctx.GetPartnerID(), + SiteID: ctx.GetSiteID(), + IsAdmin: ctx.IsAdmin(), PaymentType: o.PaymentType, - Limit: o.Limit, - Offset: o.Offset, + Limit: o.Limit, + Offset: o.Offset, + StartDate: o.StartDate, + EndDate: o.EndDate, + Status: o.Status, } } diff --git a/internal/repository/orders/order.go b/internal/repository/orders/order.go index ce92f00..ac48c9b 100644 --- a/internal/repository/orders/order.go +++ b/internal/repository/orders/order.go @@ -93,15 +93,40 @@ func (b *OrderRepository) GetAllHystoryOrders(ctx context.Context, req entity.Or Select("orders.id as id, users.name as employee, sites.name as site, orders.created_at as timestamp, orders.created_at as booking_time, STRING_AGG(ticket_summary.name || ' x' || ticket_summary.total_qty, ', ') AS tickets, orders.payment_type as payment_type, orders.status as status, orders.amount as amount"). Joins("left join (SELECT items.order_id, products.name, SUM(items.qty) AS total_qty FROM order_items items LEFT JOIN products ON items.item_id = products.id GROUP BY items.order_id, products.name) AS ticket_summary ON orders.id = ticket_summary.order_id"). Joins("left join users on orders.created_by = users.id"). - Joins("left join partners on orders.partner_id = partners.id"). - Joins("left join sites on partners.id = sites.partner_id") + Joins("left join sites on orders.site_id = sites.id") + + if req.PaymentType != "" { + query = query.Where("orders.payment_type = ?", req.PaymentType) + } + + if req.Status != "" { + query = query.Where("orders.status = ?", req.Status) + } if !req.IsAdmin { query = query.Where("orders.partner_id = ?", req.PartnerID) } + if req.StartDate != "" && req.EndDate != "" { + // Assuming req.Date and req.EndDate are in string format "YYYY-MM-DD" + startDate := req.StartDate + endDate := req.EndDate + + if endDate == "" { + endDate = time.Now().Format("2006-01-02") + } + + query = query.Where("orders.created_at BETWEEN ? AND ?", startDate, endDate) + } + + if req.SiteID != nil { + query = query.Where("orders.site_id = ?", req.SiteID) + } + query = query.Group("orders.id, users.name, sites.name, orders.created_at, orders.payment_type, orders.status") + query = query.Order("orders.created_at DESC") + if err := query.Count(&total).Error; err != nil { logger.ContextLogger(ctx).Error("error when count history orders", zap.Error(err)) return nil, 0, err diff --git a/internal/services/order/order.go b/internal/services/order/order.go index c85f440..3728f25 100644 --- a/internal/services/order/order.go +++ b/internal/services/order/order.go @@ -45,7 +45,7 @@ func NewOrderService( } } -func (s *OrderService) CreateOrder(ctx context.Context, req *entity.OrderRequest) (*entity.OrderResponse, error) { +func (s *OrderService) CreateOrder(ctx mycontext.Context, req *entity.OrderRequest) (*entity.OrderResponse, error) { productIDs := make([]int64, len(req.OrderItems)) for i, item := range req.OrderItems { productIDs[i] = item.ProductID @@ -78,6 +78,7 @@ func (s *OrderService) CreateOrder(ctx context.Context, req *entity.OrderRequest Status: order2.New.String(), Amount: totalAmount, PaymentType: req.PaymentMethod, + SiteID: ctx.GetSiteID(), CreatedBy: req.CreatedBy, OrderItems: []entity.OrderItem{}, } @@ -334,4 +335,4 @@ func (s OrderService) SumAmount(ctx mycontext.Context, req entity.OrderSearch) ( data := amount.ToSumAmount() return data, nil -} \ No newline at end of file +} diff --git a/internal/services/service.go b/internal/services/service.go index f300887..37eb5dc 100644 --- a/internal/services/service.go +++ b/internal/services/service.go @@ -102,7 +102,7 @@ type Product interface { } type Order interface { - CreateOrder(ctx context.Context, req *entity.OrderRequest) (*entity.OrderResponse, error) + CreateOrder(ctx mycontext.Context, req *entity.OrderRequest) (*entity.OrderResponse, error) Execute(ctx context.Context, req *entity.OrderExecuteRequest) (*entity.ExecuteOrderResponse, error) ProcessCallback(ctx context.Context, req *entity.CallbackRequest) error GetAllHistoryOrders(ctx mycontext.Context, req entity.OrderSearch) ([]*entity.HistoryOrder, int, error)