mirror of
https://gitlab.com/mbugroup/lti-api.git
synced 2026-05-25 07:45:44 +00:00
fix edit receipt purchase
This commit is contained in:
@@ -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
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user