Merge remote-tracking branch 'origin/master'

This commit is contained in:
M_Kececi
2026-03-31 15:25:20 +03:00
parent b6772332cd
commit 92f677ae3e
3 changed files with 97 additions and 52 deletions

View File

@@ -533,6 +533,50 @@ func loadVariantDim1SetTx(tx *sql.Tx, item, color, dim2 string) (map[string]stru
return set, nil
}
func loadVariantDim1SetDB(conn *sql.DB, item, color, dim2 string) (map[string]struct{}, error) {
rows, err := conn.Query(`
SELECT ISNULL(LTRIM(RTRIM(V.ItemDim1Code)),'') AS ItemDim1Code
FROM BAGGI_V3.dbo.prItemVariant V WITH (NOLOCK)
WHERE ISNULL(LTRIM(RTRIM(V.ItemCode)),'') = @p1
AND (
(
ISNULL(LTRIM(RTRIM(V.ColorCode)),'') = @p2
AND (
ISNULL(LTRIM(RTRIM(@p3)),'') = ''
OR ISNULL(LTRIM(RTRIM(V.ItemDim2Code)),'') = @p3
)
)
OR (
ISNULL(LTRIM(RTRIM(@p3)),'') = ''
AND ISNULL(LTRIM(RTRIM(V.ItemDim2Code)),'') = @p2
)
)
`, item, color, dim2)
if err != nil {
return nil, fmt.Errorf("variant set query hatası: %w", err)
}
defer rows.Close()
set := make(map[string]struct{})
for rows.Next() {
var raw string
if err := rows.Scan(&raw); err != nil {
return nil, fmt.Errorf("variant set scan hatası: %w", err)
}
norm := normalizeDim1Token(raw)
if norm != "" {
set[norm] = struct{}{}
}
if num := normalizeNumericToken(norm); num != "" {
set["#NUM:"+num] = struct{}{}
}
}
if err := rows.Err(); err != nil {
return nil, fmt.Errorf("variant set rows hatası: %w", err)
}
return set, nil
}
// =======================================================
// AKSBIR DETECTION
// =======================================================
@@ -641,43 +685,8 @@ func ValidateOrderVariants(db *sql.DB, lines []models.OrderDetail) ([]models.Inv
return s
}
stmt, err := db.Prepare(`
SELECT CASE WHEN EXISTS (
SELECT 1
FROM BAGGI_V3.dbo.prItemVariant V WITH (NOLOCK)
CROSS APPLY (
SELECT UPPER(REPLACE(REPLACE(REPLACE(ISNULL(LTRIM(RTRIM(V.ItemDim1Code)),'') ,' ', ''), 'YAS', ''), 'Y', '')) AS Dim1Norm
) X
WHERE ISNULL(LTRIM(RTRIM(V.ItemCode)),'') = @p1
AND (
(
ISNULL(LTRIM(RTRIM(V.ColorCode)),'') = @p2
AND (
ISNULL(LTRIM(RTRIM(@p4)),'') = ''
OR ISNULL(LTRIM(RTRIM(V.ItemDim2Code)),'') = @p4
)
)
OR (
ISNULL(LTRIM(RTRIM(@p4)),'') = ''
AND ISNULL(LTRIM(RTRIM(V.ItemDim2Code)),'') = @p2
)
)
AND (
X.Dim1Norm = @p3
OR (
ISNULL(LTRIM(RTRIM(@p5)),'') <> ''
AND X.Dim1Norm NOT LIKE '%[^0-9]%'
AND SUBSTRING(X.Dim1Norm, PATINDEX('%[^0]%', X.Dim1Norm + '0'), LEN(X.Dim1Norm)) = @p5
)
)
) THEN 1 ELSE 0 END
`)
if err != nil {
return nil, fmt.Errorf("validate prepare hatası: %w", err)
}
defer stmt.Close()
invalid := make([]models.InvalidVariant, 0)
cache := make(map[string]map[string]struct{})
for i, ln := range lines {
qty := qtyValue(ln.Qty1)
@@ -708,12 +717,20 @@ func ValidateOrderVariants(db *sql.DB, lines []models.OrderDetail) ([]models.Inv
continue
}
var exists int
if err := stmt.QueryRow(item, color, dim1Norm, dim2, dim1Numeric).Scan(&exists); err != nil {
return nil, fmt.Errorf("validate query hatası (i=%d): %w", i, err)
key := variantCacheKey(item, color, dim2)
set := cache[key]
if set == nil {
var err error
set, err = loadVariantDim1SetDB(db, item, color, dim2)
if err != nil {
return nil, fmt.Errorf("validate query hatası (i=%d): %w", i, err)
}
cache[key] = set
}
if exists != 1 {
_, okNorm := set[dim1Norm]
_, okNum := set["#NUM:"+dim1Numeric]
if !(okNorm || (dim1Numeric != "" && okNum)) {
invalid = append(invalid, models.InvalidVariant{
Index: i,
ClientKey: safeNS(ln.ClientKey),