add notes description

This commit is contained in:
aditya.siregar 2025-06-21 17:19:40 +07:00
parent ebb33186b8
commit 53014d90ab
2 changed files with 49 additions and 10 deletions

View File

@ -48,8 +48,9 @@ type AddItemOrderRequest struct {
} }
type InProgressOrderItemRequest struct { type InProgressOrderItemRequest 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" validate:"required,min=1"`
Notes string `json:"notes"`
} }
type UpdateInProgressOrderRequest struct { type UpdateInProgressOrderRequest struct {
@ -83,6 +84,7 @@ func (h *InProgressOrderHandler) Save(c *gin.Context) {
orderItems[i] = entity.OrderItemRequest{ orderItems[i] = entity.OrderItemRequest{
ProductID: item.ProductID, ProductID: item.ProductID,
Quantity: item.Quantity, Quantity: item.Quantity,
Notes: item.Notes,
} }
} }
@ -98,7 +100,7 @@ func (h *InProgressOrderHandler) Save(c *gin.Context) {
Source: "POS", Source: "POS",
} }
_, err := h.service.Save(ctx, order) resp, err := h.service.Save(ctx, order)
if err != nil { if err != nil {
response.ErrorWrapper(c, err) response.ErrorWrapper(c, err)
return return
@ -107,6 +109,9 @@ func (h *InProgressOrderHandler) Save(c *gin.Context) {
c.JSON(http.StatusCreated, response.BaseResponse{ c.JSON(http.StatusCreated, response.BaseResponse{
Success: true, Success: true,
Status: http.StatusCreated, Status: http.StatusCreated,
Data: response.MapToOrderResponse(&entity.OrderResponse{
Order: resp,
}),
}) })
} }
@ -130,10 +135,11 @@ func (h *InProgressOrderHandler) Add(c *gin.Context) {
orderItems[i] = entity.OrderItemRequest{ orderItems[i] = entity.OrderItemRequest{
ProductID: item.ProductID, ProductID: item.ProductID,
Quantity: item.Quantity, Quantity: item.Quantity,
Notes: item.Notes,
} }
} }
_, err := h.service.AddItems(ctx, req.InProgressOrderID, orderItems) order, err := h.service.AddItems(ctx, req.InProgressOrderID, orderItems)
if err != nil { if err != nil {
response.ErrorWrapper(c, err) response.ErrorWrapper(c, err)
return return
@ -142,6 +148,9 @@ func (h *InProgressOrderHandler) Add(c *gin.Context) {
c.JSON(http.StatusCreated, response.BaseResponse{ c.JSON(http.StatusCreated, response.BaseResponse{
Success: true, Success: true,
Status: http.StatusCreated, Status: http.StatusCreated,
Data: response.MapToOrderResponse(&entity.OrderResponse{
Order: order,
}),
}) })
} }

View File

@ -82,6 +82,7 @@ func (s *inProgressOrderSvc) Save(ctx mycontext.Context, req *entity.OrderReques
Price: product.Price, Price: product.Price,
ItemType: product.Type, ItemType: product.Type,
Description: product.Description, Description: product.Description,
Notes: item.Notes,
} }
} }
@ -132,29 +133,43 @@ func (s *inProgressOrderSvc) AddItems(ctx mycontext.Context, orderID int64, newI
return nil, errors.Wrapf(err, "failed to fetch order %d", orderID) return nil, errors.Wrapf(err, "failed to fetch order %d", orderID)
} }
itemMap := make(map[int64]entity.OrderItemRequest, len(existingOrder.OrderItems)+len(newItems)) type itemKey struct {
ProductID int64
Notes string
}
itemMap := make(map[itemKey]entity.OrderItemRequest)
existingKeys := make(map[itemKey]struct{})
// Collect existing items
for _, oi := range existingOrder.OrderItems { for _, oi := range existingOrder.OrderItems {
itemMap[oi.ItemID] = entity.OrderItemRequest{ key := itemKey{ProductID: oi.ItemID, Notes: oi.Notes}
existingKeys[key] = struct{}{}
itemMap[key] = entity.OrderItemRequest{
ProductID: oi.ItemID, ProductID: oi.ItemID,
Quantity: oi.Quantity, Quantity: oi.Quantity,
Notes: oi.Notes,
} }
} }
// Merge new items into map
for _, ni := range newItems { for _, ni := range newItems {
if existing, found := itemMap[ni.ProductID]; found { key := itemKey{ProductID: ni.ProductID, Notes: ni.Notes}
if existing, found := itemMap[key]; found {
existing.Quantity += ni.Quantity existing.Quantity += ni.Quantity
itemMap[ni.ProductID] = existing itemMap[key] = existing
} else { } else {
itemMap[ni.ProductID] = ni itemMap[key] = ni
} }
} }
// Prepare merged items
mergedItems := make([]entity.OrderItemRequest, 0, len(itemMap)) mergedItems := make([]entity.OrderItemRequest, 0, len(itemMap))
for _, item := range itemMap { for _, item := range itemMap {
mergedItems = append(mergedItems, item) mergedItems = append(mergedItems, item)
} }
// Save updated order
req := &entity.OrderRequest{ req := &entity.OrderRequest{
ID: existingOrder.ID, ID: existingOrder.ID,
PartnerID: existingOrder.PartnerID, PartnerID: existingOrder.PartnerID,
@ -167,7 +182,22 @@ func (s *inProgressOrderSvc) AddItems(ctx mycontext.Context, orderID int64, newI
OrderItems: mergedItems, OrderItems: mergedItems,
} }
return s.Save(ctx, req) savedOrder, err := s.Save(ctx, req)
if err != nil {
return nil, err
}
newlyAdded := make([]entity.OrderItem, 0)
for _, item := range savedOrder.OrderItems {
key := itemKey{ProductID: item.ItemID, Notes: item.Notes}
if _, exists := existingKeys[key]; !exists {
newlyAdded = append(newlyAdded, item)
}
}
savedOrder.OrderItems = newlyAdded
return savedOrder, nil
} }
func (s *inProgressOrderSvc) GetOrderByOrderAndPartnerID(ctx mycontext.Context, partnerID int64, orderID int64) (*entity.Order, error) { func (s *inProgressOrderSvc) GetOrderByOrderAndPartnerID(ctx mycontext.Context, partnerID int64, orderID int64) (*entity.Order, error) {