Merge remote-tracking branch 'origin/master'
This commit is contained in:
@@ -533,6 +533,50 @@ func loadVariantDim1SetTx(tx *sql.Tx, item, color, dim2 string) (map[string]stru
|
|||||||
return set, nil
|
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
|
// AKSBIR DETECTION
|
||||||
// =======================================================
|
// =======================================================
|
||||||
@@ -641,43 +685,8 @@ func ValidateOrderVariants(db *sql.DB, lines []models.OrderDetail) ([]models.Inv
|
|||||||
return s
|
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)
|
invalid := make([]models.InvalidVariant, 0)
|
||||||
|
cache := make(map[string]map[string]struct{})
|
||||||
|
|
||||||
for i, ln := range lines {
|
for i, ln := range lines {
|
||||||
qty := qtyValue(ln.Qty1)
|
qty := qtyValue(ln.Qty1)
|
||||||
@@ -708,12 +717,20 @@ func ValidateOrderVariants(db *sql.DB, lines []models.OrderDetail) ([]models.Inv
|
|||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
|
||||||
var exists int
|
key := variantCacheKey(item, color, dim2)
|
||||||
if err := stmt.QueryRow(item, color, dim1Norm, dim2, dim1Numeric).Scan(&exists); err != nil {
|
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)
|
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{
|
invalid = append(invalid, models.InvalidVariant{
|
||||||
Index: i,
|
Index: i,
|
||||||
ClientKey: safeNS(ln.ClientKey),
|
ClientKey: safeNS(ln.ClientKey),
|
||||||
|
|||||||
@@ -271,9 +271,24 @@ func buildOrderPDFBytesForMail(db *sql.DB, pgDB *sql.DB, orderID string) ([]byte
|
|||||||
return nil, nil, err
|
return nil, nil, err
|
||||||
}
|
}
|
||||||
rows := normalizeOrderLinesForPdf(lines, sizeMatchData)
|
rows := normalizeOrderLinesForPdf(lines, sizeMatchData)
|
||||||
for _, rr := range rows {
|
for i := range rows {
|
||||||
if strings.TrimSpace(rr.Category) == "" {
|
if strings.TrimSpace(rows[i].Category) != "" {
|
||||||
return nil, nil, fmt.Errorf("product-size-match unmapped row: %s/%s/%s", rr.Model, rr.GroupMain, rr.GroupSub)
|
continue
|
||||||
|
}
|
||||||
|
bedenList := make([]string, 0, len(rows[i].SizeQty))
|
||||||
|
for s := range rows[i].SizeQty {
|
||||||
|
bedenList = append(bedenList, s)
|
||||||
|
}
|
||||||
|
rows[i].Category = detectBedenGroupGo(
|
||||||
|
sizeMatchData,
|
||||||
|
bedenList,
|
||||||
|
rows[i].GroupMain,
|
||||||
|
rows[i].GroupSub,
|
||||||
|
rows[i].YetiskinGarson,
|
||||||
|
rows[i].YetiskinGarson,
|
||||||
|
)
|
||||||
|
if strings.TrimSpace(rows[i].Category) == "" {
|
||||||
|
rows[i].Category = catTak
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -464,9 +464,6 @@ func detectBedenGroupGo(
|
|||||||
if ruleBased != "" {
|
if ruleBased != "" {
|
||||||
return ruleBased
|
return ruleBased
|
||||||
}
|
}
|
||||||
if matchData != nil && len(matchData.Rules) > 0 {
|
|
||||||
return ""
|
|
||||||
}
|
|
||||||
|
|
||||||
ana = normalizeTextForMatchGo(ana)
|
ana = normalizeTextForMatchGo(ana)
|
||||||
alt = normalizeTextForMatchGo(alt)
|
alt = normalizeTextForMatchGo(alt)
|
||||||
@@ -1793,15 +1790,31 @@ func OrderPDFHandler(db *sql.DB, pgDB *sql.DB) http.Handler {
|
|||||||
}
|
}
|
||||||
rows := normalizeOrderLinesForPdf(lines, sizeMatchData)
|
rows := normalizeOrderLinesForPdf(lines, sizeMatchData)
|
||||||
unmapped := make([]string, 0)
|
unmapped := make([]string, 0)
|
||||||
for _, rr := range rows {
|
for i := range rows {
|
||||||
if strings.TrimSpace(rr.Category) == "" {
|
if strings.TrimSpace(rows[i].Category) != "" {
|
||||||
unmapped = append(unmapped, fmt.Sprintf("%s/%s/%s", rr.Model, rr.GroupMain, rr.GroupSub))
|
continue
|
||||||
|
}
|
||||||
|
bedenList := make([]string, 0, len(rows[i].SizeQty))
|
||||||
|
for s := range rows[i].SizeQty {
|
||||||
|
bedenList = append(bedenList, s)
|
||||||
|
}
|
||||||
|
rows[i].Category = detectBedenGroupGo(
|
||||||
|
sizeMatchData,
|
||||||
|
bedenList,
|
||||||
|
rows[i].GroupMain,
|
||||||
|
rows[i].GroupSub,
|
||||||
|
rows[i].YetiskinGarson,
|
||||||
|
rows[i].YetiskinGarson,
|
||||||
|
)
|
||||||
|
if strings.TrimSpace(rows[i].Category) == "" {
|
||||||
|
rows[i].Category = catTak
|
||||||
|
}
|
||||||
|
if strings.TrimSpace(rows[i].Category) == "" {
|
||||||
|
unmapped = append(unmapped, fmt.Sprintf("%s/%s/%s", rows[i].Model, rows[i].GroupMain, rows[i].GroupSub))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if len(unmapped) > 0 {
|
if len(unmapped) > 0 {
|
||||||
log.Printf("❌ OrderPDF product-size-match unmapped orderID=%s rows=%v", orderID, unmapped)
|
log.Printf("⚠️ OrderPDF unmapped rows fallback failed orderID=%s rows=%v", orderID, unmapped)
|
||||||
http.Error(w, "product-size-match unmapped rows", http.StatusInternalServerError)
|
|
||||||
return
|
|
||||||
}
|
}
|
||||||
log.Printf("📄 OrderPDF normalized rows orderID=%s rowCount=%d", orderID, len(rows))
|
log.Printf("📄 OrderPDF normalized rows orderID=%s rowCount=%d", orderID, len(rows))
|
||||||
for i, rr := range rows {
|
for i, rr := range rows {
|
||||||
|
|||||||
Reference in New Issue
Block a user