From 1bceae010b8376dd784cf9f4152ce6e9a2b8b3fa Mon Sep 17 00:00:00 2001 From: "aditya.siregar" Date: Sun, 29 Jun 2025 13:07:12 +0700 Subject: [PATCH] update --- internal/handlers/http/order.go | 2 +- internal/repository/orde_repo.go | 15 +++++++ .../v2/order/advanced_order_management.go | 40 ++++++++----------- internal/services/v2/order/order.go | 1 + 4 files changed, 34 insertions(+), 24 deletions(-) diff --git a/internal/handlers/http/order.go b/internal/handlers/http/order.go index 2d32e70..aaa38b2 100644 --- a/internal/handlers/http/order.go +++ b/internal/handlers/http/order.go @@ -68,7 +68,7 @@ func (o *InquiryRequest) GetPaymentProvider() string { type OrderItemRequest struct { ProductID int64 `json:"product_id" validate:"required"` - Quantity int `json:"quantity" validate:"required,min=1"` + Quantity int `json:"quantity"` Notes string `json:"notes"` } diff --git a/internal/repository/orde_repo.go b/internal/repository/orde_repo.go index 1e827d7..54187f2 100644 --- a/internal/repository/orde_repo.go +++ b/internal/repository/orde_repo.go @@ -22,6 +22,7 @@ type OrderRepository interface { CreateOrder(ctx mycontext.Context, order *entity.Order, tx *gorm.DB) (*entity.Order, error) CreateOrderItems(ctx mycontext.Context, orderID int64, items []entity.OrderItem, tx *gorm.DB) error CreateOrderItem(ctx mycontext.Context, orderID int64, item *entity.OrderItem) error + DeleteOrderItem(ctx mycontext.Context, orderItemID int64) error GetListByPartnerID(ctx mycontext.Context, partnerID int64, limit, offset int, status string) ([]*entity.Order, error) GetOrderPaymentMethodBreakdown(ctx mycontext.Context, partnerID int64, req entity.SearchRequest) ([]entity.PaymentMethodBreakdown, error) GetRevenueOverview(ctx mycontext.Context, req entity.RevenueOverviewRequest) ([]entity.RevenueOverviewItem, error) @@ -994,6 +995,20 @@ func (r *orderRepository) UpdateOrderItem(ctx mycontext.Context, orderItemID int return nil } +func (r *orderRepository) DeleteOrderItem(ctx mycontext.Context, orderItemID int64) error { + result := r.db.Where("order_item_id = ?", orderItemID).Delete(&models.OrderItemDB{}) + + if result.Error != nil { + return errors.Wrap(result.Error, "failed to delete order item") + } + + if result.RowsAffected == 0 { + logger.ContextLogger(ctx).Warn("no order item deleted") + } + + return nil +} + func (r *orderRepository) UpdateOrderTotals(ctx mycontext.Context, orderID int64, amount, tax, total float64) error { now := time.Now() diff --git a/internal/services/v2/order/advanced_order_management.go b/internal/services/v2/order/advanced_order_management.go index f3ba9c9..6557a4a 100644 --- a/internal/services/v2/order/advanced_order_management.go +++ b/internal/services/v2/order/advanced_order_management.go @@ -114,20 +114,18 @@ func (s *orderSvc) VoidOrderRequest(ctx mycontext.Context, partnerID, orderID in } if voidType == "ALL" { - // Void all items - create new VOIDED items for all existing items for _, orderItem := range order.OrderItems { if orderItem.Status == "ACTIVE" && orderItem.Quantity > 0 { - // Create new VOIDED order item with the voided quantity voidedItem := &entity.OrderItem{ OrderID: orderID, ItemID: orderItem.ItemID, ItemType: orderItem.ItemType, Price: orderItem.Price, - Quantity: orderItem.Quantity, // Void the full quantity + Quantity: orderItem.Quantity, Status: "VOIDED", CreatedBy: orderItem.CreatedBy, ItemName: orderItem.ItemName, - Notes: reason, // Use the reason as notes for tracking + Notes: reason, } err = s.repo.CreateOrderItem(ctx, orderID, voidedItem) @@ -135,24 +133,15 @@ func (s *orderSvc) VoidOrderRequest(ctx mycontext.Context, partnerID, orderID in logger.ContextLogger(ctx).Error("failed to create voided order item", zap.Error(err)) return err } - - // Update original item quantity to 0 - err = s.repo.UpdateOrderItem(ctx, orderItem.ID, 0) - if err != nil { - logger.ContextLogger(ctx).Error("failed to update original order item", zap.Error(err)) - return err - } } } - // Update order status to VOIDED err = s.repo.UpdateOrder(ctx, orderID, "VOIDED", reason) if err != nil { logger.ContextLogger(ctx).Error("failed to void order", zap.Error(err)) return err } - // Recalculate order totals (should be 0 for voided order) err = s.repo.UpdateOrderTotals(ctx, orderID, 0, 0, 0) if err != nil { logger.ContextLogger(ctx).Error("failed to update order totals", zap.Error(err)) @@ -160,7 +149,6 @@ func (s *orderSvc) VoidOrderRequest(ctx mycontext.Context, partnerID, orderID in } } else if voidType == "ITEM" { - // Void specific items orderItemMap := make(map[int64]*entity.OrderItem) for i := range order.OrderItems { orderItemMap[order.OrderItems[i].ID] = &order.OrderItems[i] @@ -185,17 +173,16 @@ func (s *orderSvc) VoidOrderRequest(ctx mycontext.Context, partnerID, orderID in for _, voidItem := range items { orderItem := orderItemMap[voidItem.OrderItemID] - // Create new VOIDED order item with the voided quantity voidedItem := &entity.OrderItem{ OrderID: orderID, ItemID: orderItem.ItemID, ItemType: orderItem.ItemType, Price: orderItem.Price, - Quantity: voidItem.Quantity, // Void the requested quantity + Quantity: voidItem.Quantity, Status: "VOIDED", CreatedBy: orderItem.CreatedBy, ItemName: orderItem.ItemName, - Notes: reason, // Use the reason as notes for tracking + Notes: reason, } err = s.repo.CreateOrderItem(ctx, orderID, voidedItem) @@ -203,13 +190,20 @@ func (s *orderSvc) VoidOrderRequest(ctx mycontext.Context, partnerID, orderID in logger.ContextLogger(ctx).Error("failed to create voided order item", zap.Error(err)) return err } - - // Update original item quantity newQuantity := orderItem.Quantity - voidItem.Quantity - err = s.repo.UpdateOrderItem(ctx, voidItem.OrderItemID, newQuantity) - if err != nil { - logger.ContextLogger(ctx).Error("failed to update order item", zap.Error(err)) - return err + + if newQuantity > 0 { + err = s.repo.UpdateOrderItem(ctx, voidItem.OrderItemID, newQuantity) + if err != nil { + logger.ContextLogger(ctx).Error("failed to update order item", zap.Error(err)) + return err + } + } else { + err = s.repo.DeleteOrderItem(ctx, voidItem.OrderItemID) + if err != nil { + logger.ContextLogger(ctx).Error("failed to delete order item", zap.Error(err)) + return err + } } } diff --git a/internal/services/v2/order/order.go b/internal/services/v2/order/order.go index e98320d..8db5f27 100644 --- a/internal/services/v2/order/order.go +++ b/internal/services/v2/order/order.go @@ -24,6 +24,7 @@ type Repository interface { GetOrderHistoryByUserID(ctx mycontext.Context, userID int64, req entity.SearchRequest) ([]*entity.Order, int64, error) FindByIDAndPartnerID(ctx mycontext.Context, id int64, partnerID int64) (*entity.Order, error) FindByIDAndCustomerID(ctx mycontext.Context, id int64, customerID int64) (*entity.Order, error) + DeleteOrderItem(ctx mycontext.Context, orderItemID int64) error } type ProductService interface {