update
This commit is contained in:
parent
46b30277ef
commit
1bceae010b
@ -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"`
|
||||
}
|
||||
|
||||
|
||||
@ -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()
|
||||
|
||||
|
||||
@ -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,14 +190,21 @@ 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
|
||||
|
||||
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
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
updatedOrder, err := s.repo.FindByIDAndPartnerID(ctx, orderID, partnerID)
|
||||
|
||||
@ -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 {
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user