This commit is contained in:
aditya.siregar 2025-06-29 13:07:12 +07:00
parent 46b30277ef
commit 1bceae010b
4 changed files with 34 additions and 24 deletions

View File

@ -68,7 +68,7 @@ func (o *InquiryRequest) GetPaymentProvider() string {
type OrderItemRequest struct { type OrderItemRequest struct {
ProductID int64 `json:"product_id" validate:"required"` ProductID int64 `json:"product_id" validate:"required"`
Quantity int `json:"quantity" validate:"required,min=1"` Quantity int `json:"quantity"`
Notes string `json:"notes"` Notes string `json:"notes"`
} }

View File

@ -22,6 +22,7 @@ type OrderRepository interface {
CreateOrder(ctx mycontext.Context, order *entity.Order, tx *gorm.DB) (*entity.Order, error) 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 CreateOrderItems(ctx mycontext.Context, orderID int64, items []entity.OrderItem, tx *gorm.DB) error
CreateOrderItem(ctx mycontext.Context, orderID int64, item *entity.OrderItem) 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) 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) GetOrderPaymentMethodBreakdown(ctx mycontext.Context, partnerID int64, req entity.SearchRequest) ([]entity.PaymentMethodBreakdown, error)
GetRevenueOverview(ctx mycontext.Context, req entity.RevenueOverviewRequest) ([]entity.RevenueOverviewItem, 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 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 { func (r *orderRepository) UpdateOrderTotals(ctx mycontext.Context, orderID int64, amount, tax, total float64) error {
now := time.Now() now := time.Now()

View File

@ -114,20 +114,18 @@ func (s *orderSvc) VoidOrderRequest(ctx mycontext.Context, partnerID, orderID in
} }
if voidType == "ALL" { if voidType == "ALL" {
// Void all items - create new VOIDED items for all existing items
for _, orderItem := range order.OrderItems { for _, orderItem := range order.OrderItems {
if orderItem.Status == "ACTIVE" && orderItem.Quantity > 0 { if orderItem.Status == "ACTIVE" && orderItem.Quantity > 0 {
// Create new VOIDED order item with the voided quantity
voidedItem := &entity.OrderItem{ voidedItem := &entity.OrderItem{
OrderID: orderID, OrderID: orderID,
ItemID: orderItem.ItemID, ItemID: orderItem.ItemID,
ItemType: orderItem.ItemType, ItemType: orderItem.ItemType,
Price: orderItem.Price, Price: orderItem.Price,
Quantity: orderItem.Quantity, // Void the full quantity Quantity: orderItem.Quantity,
Status: "VOIDED", Status: "VOIDED",
CreatedBy: orderItem.CreatedBy, CreatedBy: orderItem.CreatedBy,
ItemName: orderItem.ItemName, ItemName: orderItem.ItemName,
Notes: reason, // Use the reason as notes for tracking Notes: reason,
} }
err = s.repo.CreateOrderItem(ctx, orderID, voidedItem) 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)) logger.ContextLogger(ctx).Error("failed to create voided order item", zap.Error(err))
return 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) err = s.repo.UpdateOrder(ctx, orderID, "VOIDED", reason)
if err != nil { if err != nil {
logger.ContextLogger(ctx).Error("failed to void order", zap.Error(err)) logger.ContextLogger(ctx).Error("failed to void order", zap.Error(err))
return err return err
} }
// Recalculate order totals (should be 0 for voided order)
err = s.repo.UpdateOrderTotals(ctx, orderID, 0, 0, 0) err = s.repo.UpdateOrderTotals(ctx, orderID, 0, 0, 0)
if err != nil { if err != nil {
logger.ContextLogger(ctx).Error("failed to update order totals", zap.Error(err)) 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" { } else if voidType == "ITEM" {
// Void specific items
orderItemMap := make(map[int64]*entity.OrderItem) orderItemMap := make(map[int64]*entity.OrderItem)
for i := range order.OrderItems { for i := range order.OrderItems {
orderItemMap[order.OrderItems[i].ID] = &order.OrderItems[i] 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 { for _, voidItem := range items {
orderItem := orderItemMap[voidItem.OrderItemID] orderItem := orderItemMap[voidItem.OrderItemID]
// Create new VOIDED order item with the voided quantity
voidedItem := &entity.OrderItem{ voidedItem := &entity.OrderItem{
OrderID: orderID, OrderID: orderID,
ItemID: orderItem.ItemID, ItemID: orderItem.ItemID,
ItemType: orderItem.ItemType, ItemType: orderItem.ItemType,
Price: orderItem.Price, Price: orderItem.Price,
Quantity: voidItem.Quantity, // Void the requested quantity Quantity: voidItem.Quantity,
Status: "VOIDED", Status: "VOIDED",
CreatedBy: orderItem.CreatedBy, CreatedBy: orderItem.CreatedBy,
ItemName: orderItem.ItemName, ItemName: orderItem.ItemName,
Notes: reason, // Use the reason as notes for tracking Notes: reason,
} }
err = s.repo.CreateOrderItem(ctx, orderID, voidedItem) 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)) logger.ContextLogger(ctx).Error("failed to create voided order item", zap.Error(err))
return err return err
} }
// Update original item quantity
newQuantity := orderItem.Quantity - voidItem.Quantity newQuantity := orderItem.Quantity - voidItem.Quantity
err = s.repo.UpdateOrderItem(ctx, voidItem.OrderItemID, newQuantity)
if err != nil { if newQuantity > 0 {
logger.ContextLogger(ctx).Error("failed to update order item", zap.Error(err)) err = s.repo.UpdateOrderItem(ctx, voidItem.OrderItemID, newQuantity)
return err 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
}
} }
} }

View File

@ -24,6 +24,7 @@ type Repository interface {
GetOrderHistoryByUserID(ctx mycontext.Context, userID int64, req entity.SearchRequest) ([]*entity.Order, int64, error) GetOrderHistoryByUserID(ctx mycontext.Context, userID int64, req entity.SearchRequest) ([]*entity.Order, int64, error)
FindByIDAndPartnerID(ctx mycontext.Context, id int64, partnerID int64) (*entity.Order, error) FindByIDAndPartnerID(ctx mycontext.Context, id int64, partnerID int64) (*entity.Order, error)
FindByIDAndCustomerID(ctx mycontext.Context, id int64, customerID 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 { type ProductService interface {