fix edit receipt purchase

This commit is contained in:
giovanni
2026-04-08 16:18:55 +07:00
parent 079ae01b94
commit a6995f8e18
3 changed files with 108 additions and 6 deletions
@@ -183,15 +183,102 @@ func (b *expenseBridge) markExpensesUpdated(ctx context.Context, expenseIDs map[
return nil
}
func (b *expenseBridge) clearExpenseLinksForItems(ctx context.Context, itemIDs []uint) error {
if len(itemIDs) == 0 {
return nil
}
unique := make(map[uint]struct{}, len(itemIDs))
normalized := make([]uint, 0, len(itemIDs))
for _, id := range itemIDs {
if id == 0 {
continue
}
if _, exists := unique[id]; exists {
continue
}
unique[id] = struct{}{}
normalized = append(normalized, id)
}
if len(normalized) == 0 {
return nil
}
rows := make([]struct {
ItemID uint
ExpenseNonstockID *uint64
ExpenseID *uint64
}, 0, len(normalized))
if err := b.db.WithContext(ctx).
Table("purchase_items pi").
Select("pi.id as item_id, pi.expense_nonstock_id, en.expense_id").
Joins("LEFT JOIN expense_nonstocks en ON en.id = pi.expense_nonstock_id").
Where("pi.id IN ?", normalized).
Scan(&rows).Error; err != nil {
return err
}
expenseNonstockIDs := make([]uint64, 0, len(rows))
expenseIDs := make(map[uint64]struct{})
for _, row := range rows {
if row.ExpenseNonstockID != nil && *row.ExpenseNonstockID != 0 {
expenseNonstockIDs = append(expenseNonstockIDs, *row.ExpenseNonstockID)
}
if row.ExpenseID != nil && *row.ExpenseID != 0 {
expenseIDs[*row.ExpenseID] = struct{}{}
}
}
return b.db.WithContext(ctx).Transaction(func(tx *gorm.DB) error {
if err := tx.Model(&entity.PurchaseItem{}).
Where("id IN ?", normalized).
Update("expense_nonstock_id", gorm.Expr("NULL")).Error; err != nil {
return err
}
if len(expenseNonstockIDs) > 0 {
if err := tx.Where("id IN ?", expenseNonstockIDs).Delete(&entity.ExpenseNonstock{}).Error; err != nil {
return err
}
}
approvalRepoTx := commonRepo.NewApprovalRepository(tx)
for expenseID := range expenseIDs {
var count int64
if err := tx.Model(&entity.ExpenseNonstock{}).
Where("expense_id = ?", expenseID).
Count(&count).Error; err != nil {
return err
}
if count > 0 {
continue
}
if err := approvalRepoTx.DeleteByTarget(ctx, utils.ApprovalWorkflowExpense.String(), uint(expenseID)); err != nil {
return err
}
if err := tx.Delete(&entity.Expense{}, expenseID).Error; err != nil {
return err
}
}
return nil
})
}
func (b *expenseBridge) OnItemsReceived(c *fiber.Ctx, purchaseID uint, updates []ExpenseReceivingPayload) error {
if purchaseID == 0 || len(updates) == 0 {
return nil
}
ctx := c.Context()
clearExpenseLinks := make([]uint, 0, len(updates))
filtered := make([]ExpenseReceivingPayload, 0, len(updates))
for _, upd := range updates {
if upd.PurchaseItemID == 0 {
continue
}
if upd.SupplierID == 0 {
clearExpenseLinks = append(clearExpenseLinks, upd.PurchaseItemID)
continue
}
if upd.TransportPerItem == nil || *upd.TransportPerItem <= 0 {
@@ -202,6 +289,11 @@ func (b *expenseBridge) OnItemsReceived(c *fiber.Ctx, purchaseID uint, updates [
}
filtered = append(filtered, upd)
}
if len(clearExpenseLinks) > 0 {
if err := b.clearExpenseLinksForItems(ctx, clearExpenseLinks); err != nil {
return err
}
}
if len(filtered) == 0 {
return nil
}