From f079ee80da8d1fc7479c8a4e13a261334c465a18 Mon Sep 17 00:00:00 2001 From: MEHMETKECECI Date: Sat, 14 Feb 2026 15:49:40 +0300 Subject: [PATCH] Merge remote-tracking branch 'origin/master' --- svc/queries/order_write.go | 54 ++++++++++++++++++++++++++++++-------- 1 file changed, 43 insertions(+), 11 deletions(-) diff --git a/svc/queries/order_write.go b/svc/queries/order_write.go index 1e2b71e..b3a1021 100644 --- a/svc/queries/order_write.go +++ b/svc/queries/order_write.go @@ -1103,6 +1103,38 @@ func UpdateOrder(header models.OrderHeader, lines []models.OrderDetail, user *mo now := time.Now() v3User := buildV3AuditUser(user) + // Hard delete bazen FK nedeniyle patlayabiliyor. + // Bu durumda satırı soft-close ederek akışı güvenli şekilde tamamlarız. + deleteOrSoftCloseLine := func(lineID string) error { + if _, err := tx.Exec(`DELETE FROM BAGGI_V3.dbo.trOrderLineCurrency WHERE OrderLineID=@p1`, lineID); err != nil { + return fmt.Errorf("line currency delete failed line_id=%s: %w", lineID, err) + } + + if _, err := tx.Exec(` +DELETE FROM BAGGI_V3.dbo.trOrderLine +WHERE OrderHeaderID=@p1 AND OrderLineID=@p2 AND ISNULL(IsClosed,0)=0 +`, header.OrderHeaderID, lineID); err != nil { + fmt.Printf("[ORDER_UPDATE] hard delete failed, trying soft-close line_id=%s err=%v\n", lineID, err) + + if _, err2 := tx.Exec(` +UPDATE BAGGI_V3.dbo.trOrderLine +SET + Qty1 = 0, + Qty2 = 0, + CancelQty1 = 0, + CancelQty2 = 0, + IsClosed = 1, + LastUpdatedUserName = @p1, + LastUpdatedDate = @p2 +WHERE OrderHeaderID=@p3 AND OrderLineID=@p4 AND ISNULL(IsClosed,0)=0 +`, v3User, now, header.OrderHeaderID, lineID); err2 != nil { + return fmt.Errorf("line delete failed line_id=%s: %v; soft-close failed: %w", lineID, err, err2) + } + } + + return nil + } + // Döviz kuru (Header ExchangeRate fallback) exRate := 1.0 if header.DocCurrencyCode.Valid && header.DocCurrencyCode.String != "TRY" { @@ -1329,13 +1361,7 @@ WHERE OrderLineID=@p42 AND ISNULL(IsClosed,0)=0`) Dim2: strings.TrimSpace(safeNS(ln.ItemDim2Code)), } } - if _, err := tx.Exec(`DELETE FROM BAGGI_V3.dbo.trOrderLineCurrency WHERE OrderLineID=@p1`, ln.OrderLineID); err != nil { - return nil, err - } - if _, err := tx.Exec(` -DELETE FROM BAGGI_V3.dbo.trOrderLine -WHERE OrderHeaderID=@p1 AND OrderLineID=@p2 AND ISNULL(IsClosed,0)=0 -`, header.OrderHeaderID, ln.OrderLineID); err != nil { + if err := deleteOrSoftCloseLine(ln.OrderLineID); err != nil { return nil, err } @@ -1356,6 +1382,15 @@ WHERE OrderHeaderID=@p1 AND OrderLineID=@p2 AND ISNULL(IsClosed,0)=0 } } + // Edit akışında bazen stale OrderLineID gelebiliyor (silinmiş/eski satır ID'si). + // Böyle bir ID ile UPDATE denemek yerine yeni satır olarak ele al. + if !isNew && ln.OrderLineID != "" { + if _, stillOpen := existingOpen[ln.OrderLineID]; !stillOpen { + ln.OrderLineID = uuid.New().String() + isNew = true + } + } + // Variant guard if qtyValue(ln.Qty1) > 0 { if err := ValidateItemVariant(tx, ln); err != nil { @@ -1482,10 +1517,7 @@ WHERE OrderHeaderID=@p1 AND OrderLineID=@p2 AND ISNULL(IsClosed,0)=0 id, meta.item, meta.color, meta.dim1, meta.dim2) continue } - if _, err := tx.Exec(`DELETE FROM BAGGI_V3.dbo.trOrderLineCurrency WHERE OrderLineID=@p1`, id); err != nil { - return nil, err - } - if _, err := tx.Exec(`DELETE FROM BAGGI_V3.dbo.trOrderLine WHERE OrderLineID=@p1 AND ISNULL(IsClosed,0)=0`, id); err != nil { + if err := deleteOrSoftCloseLine(id); err != nil { return nil, err } }