[FIX/BE-US] purchase edit qty approval staf

This commit is contained in:
ragilap
2026-01-20 14:19:02 +07:00
parent 8ff97cb647
commit fc06b3e4db
@@ -751,6 +751,9 @@ func (s *purchaseService) ReceiveProducts(c *fiber.Ctx, id uint, req *validation
if receivedQty > item.SubQty { if receivedQty > item.SubQty {
return nil, utils.BadRequest(fmt.Sprintf("Received quantity for item %d cannot exceed ordered quantity (%.3f)", payload.PurchaseItemID, item.SubQty)) return nil, utils.BadRequest(fmt.Sprintf("Received quantity for item %d cannot exceed ordered quantity (%.3f)", payload.PurchaseItemID, item.SubQty))
} }
if receivedQty < item.TotalUsed {
return nil, utils.BadRequest(fmt.Sprintf("Received quantity for item %d cannot be lower than used amount (%.3f)", payload.PurchaseItemID, item.TotalUsed))
}
if _, dup := visitedItems[payload.PurchaseItemID]; dup { if _, dup := visitedItems[payload.PurchaseItemID]; dup {
return nil, utils.BadRequest(fmt.Sprintf("Duplicate receiving data for item %d", payload.PurchaseItemID)) return nil, utils.BadRequest(fmt.Sprintf("Duplicate receiving data for item %d", payload.PurchaseItemID))
@@ -835,6 +838,7 @@ func (s *purchaseService) ReceiveProducts(c *fiber.Ctx, id uint, req *validation
affected := make(map[uint]struct{}) affected := make(map[uint]struct{})
updates := make([]rPurchase.PurchaseReceivingUpdate, 0, len(prepared)) updates := make([]rPurchase.PurchaseReceivingUpdate, 0, len(prepared))
priceUpdates := make([]rPurchase.PurchasePricingUpdate, 0, len(prepared)) priceUpdates := make([]rPurchase.PurchasePricingUpdate, 0, len(prepared))
totalQtyDeltas := make(map[uint]float64)
fifoAdds := make([]struct { fifoAdds := make([]struct {
itemID uint itemID uint
pwID uint pwID uint
@@ -862,14 +866,20 @@ func (s *purchaseService) ReceiveProducts(c *fiber.Ctx, id uint, req *validation
deltaQty := prep.receivedQty - item.TotalQty deltaQty := prep.receivedQty - item.TotalQty
switch { switch {
case deltaQty > 0 && newPWID != nil: case deltaQty > 0 && newPWID != nil:
fifoAdds = append(fifoAdds, struct { if s.FifoSvc != nil {
itemID uint fifoAdds = append(fifoAdds, struct {
pwID uint itemID uint
qty float64 pwID uint
}{itemID: item.Id, pwID: *newPWID, qty: deltaQty}) qty float64
}{itemID: item.Id, pwID: *newPWID, qty: deltaQty})
} else {
deltas[*newPWID] += deltaQty
totalQtyDeltas[item.Id] += deltaQty
}
case deltaQty < 0 && newPWID != nil: case deltaQty < 0 && newPWID != nil:
deltas[*newPWID] += deltaQty // negative deltas[*newPWID] += deltaQty // negative
affected[*newPWID] = struct{}{} affected[*newPWID] = struct{}{}
totalQtyDeltas[item.Id] += deltaQty
} }
dateCopy := prep.receivedDate dateCopy := prep.receivedDate
@@ -892,7 +902,7 @@ func (s *purchaseService) ReceiveProducts(c *fiber.Ctx, id uint, req *validation
updates = append(updates, update) updates = append(updates, update)
if item.Price > 0 && prep.receivedQty >= 0 { if prep.receivedQty >= 0 {
priceUpdates = append(priceUpdates, rPurchase.PurchasePricingUpdate{ priceUpdates = append(priceUpdates, rPurchase.PurchasePricingUpdate{
ItemID: item.Id, ItemID: item.Id,
Price: item.Price, Price: item.Price,
@@ -919,6 +929,19 @@ func (s *purchaseService) ReceiveProducts(c *fiber.Ctx, id uint, req *validation
} }
} }
if len(totalQtyDeltas) > 0 {
for itemID, delta := range totalQtyDeltas {
if delta == 0 {
continue
}
if err := tx.Model(&entity.PurchaseItem{}).
Where("purchase_id = ? AND id = ?", purchase.Id, itemID).
Update("total_qty", gorm.Expr("COALESCE(total_qty,0) + ?", delta)).Error; err != nil {
return err
}
}
}
// Update due_date based on earliest received date when receiving approved. // Update due_date based on earliest received date when receiving approved.
if earliestReceived != nil { if earliestReceived != nil {
due := earliestReceived.AddDate(0, 0, purchase.CreditTerm) due := earliestReceived.AddDate(0, 0, purchase.CreditTerm)
@@ -1371,10 +1394,6 @@ func (s *purchaseService) buildStaffAdjustmentPayload(
qtyCopy := effectiveQty qtyCopy := effectiveQty
update.Quantity = &qtyCopy update.Quantity = &qtyCopy
} }
if syncReceiving {
qtyCopy := effectiveQty
update.TotalQty = &qtyCopy
}
updates = append(updates, update) updates = append(updates, update)
delete(requestItems, item.Id) delete(requestItems, item.Id)