diff --git a/svc/queries/orderproduction_items.go b/svc/queries/orderproduction_items.go index 656b23a..6ff46d0 100644 --- a/svc/queries/orderproduction_items.go +++ b/svc/queries/orderproduction_items.go @@ -2,8 +2,11 @@ package queries import ( "database/sql" + "fmt" + "log" "strconv" "strings" + "time" "bssapp-backend/models" ) @@ -54,11 +57,11 @@ func InsertMissingProductionVariants(mssql *sql.DB, orderHeaderID string, userna FROM dbo.trOrderLine l LEFT JOIN dbo.prItemVariant pv ON pv.ItemTypeCode = l.ItemTypeCode - AND pv.ItemCode = l.ItemCode - AND pv.ColorCode = l.ColorCode - AND ISNULL(pv.ItemDim1Code,'') = ISNULL(l.ItemDim1Code,'') - AND ISNULL(pv.ItemDim2Code,'') = ISNULL(l.ItemDim2Code,'') - AND ISNULL(pv.ItemDim3Code,'') = ISNULL(l.ItemDim3Code,'') + AND ISNULL(LTRIM(RTRIM(pv.ItemCode)),'') = ISNULL(LTRIM(RTRIM(l.ItemCode)),'') + AND ISNULL(LTRIM(RTRIM(pv.ColorCode)),'') = ISNULL(LTRIM(RTRIM(l.ColorCode)),'') + AND ISNULL(LTRIM(RTRIM(pv.ItemDim1Code)),'') = ISNULL(LTRIM(RTRIM(l.ItemDim1Code)),'') + AND ISNULL(LTRIM(RTRIM(pv.ItemDim2Code)),'') = ISNULL(LTRIM(RTRIM(l.ItemDim2Code)),'') + AND ISNULL(LTRIM(RTRIM(pv.ItemDim3Code)),'') = ISNULL(LTRIM(RTRIM(l.ItemDim3Code)),'') WHERE l.OrderHeaderID = @p1 AND ISNULL(l.ItemCode,'') LIKE 'U%' AND pv.ItemCode IS NULL @@ -143,11 +146,11 @@ func VariantExists(mssql *sql.DB, itemTypeCode int16, itemCode string, colorCode SELECT TOP 1 1 FROM dbo.prItemVariant WHERE ItemTypeCode = @p1 - AND ItemCode = @p2 - AND ColorCode = @p3 - AND ISNULL(ItemDim1Code,'') = ISNULL(@p4,'') - AND ISNULL(ItemDim2Code,'') = ISNULL(@p5,'') - AND ISNULL(ItemDim3Code,'') = ISNULL(@p6,'') + AND ISNULL(LTRIM(RTRIM(ItemCode)),'') = ISNULL(LTRIM(RTRIM(@p2)),'') + AND ISNULL(LTRIM(RTRIM(ColorCode)),'') = ISNULL(LTRIM(RTRIM(@p3)),'') + AND ISNULL(LTRIM(RTRIM(ItemDim1Code)),'') = ISNULL(LTRIM(RTRIM(@p4)),'') + AND ISNULL(LTRIM(RTRIM(ItemDim2Code)),'') = ISNULL(LTRIM(RTRIM(@p5)),'') + AND ISNULL(LTRIM(RTRIM(ItemDim3Code)),'') = ISNULL(LTRIM(RTRIM(@p6)),'') `, itemTypeCode, itemCode, colorCode, dim1, dim2, dim3).Scan(&exists) if err == sql.ErrNoRows { return false, nil @@ -202,11 +205,11 @@ IF NOT EXISTS ( SELECT 1 FROM dbo.prItemVariant WHERE ItemTypeCode = @p1 - AND ItemCode = @p2 - AND ColorCode = @p3 - AND ISNULL(ItemDim1Code,'') = ISNULL(@p4,'') - AND ISNULL(ItemDim2Code,'') = ISNULL(@p5,'') - AND ISNULL(ItemDim3Code,'') = ISNULL(@p6,'') + AND ISNULL(LTRIM(RTRIM(ItemCode)),'') = ISNULL(LTRIM(RTRIM(@p2)),'') + AND ISNULL(LTRIM(RTRIM(ColorCode)),'') = ISNULL(LTRIM(RTRIM(@p3)),'') + AND ISNULL(LTRIM(RTRIM(ItemDim1Code)),'') = ISNULL(LTRIM(RTRIM(@p4)),'') + AND ISNULL(LTRIM(RTRIM(ItemDim2Code)),'') = ISNULL(LTRIM(RTRIM(@p5)),'') + AND ISNULL(LTRIM(RTRIM(ItemDim3Code)),'') = ISNULL(LTRIM(RTRIM(@p6)),'') ) INSERT INTO dbo.prItemVariant ( ItemTypeCode, @@ -496,10 +499,11 @@ func GetOrderProductionLookupOptions(mssql *sql.DB) (models.OrderProductionCdIte out := models.OrderProductionCdItemLookups{} queryPairs := []struct { + Name string Query string Target *[]models.OrderProductionLookupOption }{ - {`SELECT + {"ItemDimTypeCodes", `SELECT CAST(t.ItemDimTypeCode AS NVARCHAR(50)) AS Code, ISNULL(d.ItemDimTypeDescription, CAST(t.ItemDimTypeCode AS NVARCHAR(50))) AS [Description] FROM dbo.bsItemDimType t WITH(NOLOCK) @@ -508,8 +512,8 @@ func GetOrderProductionLookupOptions(mssql *sql.DB) (models.OrderProductionCdIte AND d.LangCode = 'TR' WHERE ISNULL(t.IsBlocked, 0) = 0 ORDER BY t.ItemDimTypeCode`, &out.ItemDimTypeCodes}, - {`SELECT DISTINCT CAST(ProductTypeCode AS NVARCHAR(50)) AS Code, CAST(ProductTypeCode AS NVARCHAR(50)) AS [Description] FROM dbo.cdItem WITH(NOLOCK) WHERE ProductTypeCode IS NOT NULL ORDER BY Code`, &out.ProductTypeCodes}, - {`SELECT + {"ProductTypeCodes", `SELECT DISTINCT CAST(ProductTypeCode AS NVARCHAR(50)) AS Code, CAST(ProductTypeCode AS NVARCHAR(50)) AS [Description] FROM dbo.cdItem WITH(NOLOCK) WHERE ProductTypeCode IS NOT NULL ORDER BY Code`, &out.ProductTypeCodes}, + {"ProductHierarchyIDs", `SELECT CAST(h.ProductHierarchyID AS NVARCHAR(50)) AS Code, LTRIM(RTRIM( CONCAT( @@ -525,26 +529,28 @@ func GetOrderProductionLookupOptions(mssql *sql.DB) (models.OrderProductionCdIte ON d.ProductHierarchyLevelCode = h.ProductHierarchyLevelCode01 AND d.LangCode = 'TR' ORDER BY h.ProductHierarchyID`, &out.ProductHierarchyIDs}, - {`SELECT DISTINCT CAST(UnitOfMeasureCode1 AS NVARCHAR(50)) AS Code, CAST(UnitOfMeasureCode1 AS NVARCHAR(200)) AS [Description] FROM dbo.cdItem WITH(NOLOCK) WHERE ISNULL(UnitOfMeasureCode1,'') <> '' ORDER BY Code`, &out.UnitOfMeasureCode1List}, - {`SELECT DISTINCT CAST(ItemAccountGrCode AS NVARCHAR(50)) AS Code, CAST(ItemAccountGrCode AS NVARCHAR(200)) AS [Description] FROM dbo.cdItem WITH(NOLOCK) WHERE ISNULL(ItemAccountGrCode,'') <> '' ORDER BY Code`, &out.ItemAccountGrCodes}, - {`SELECT DISTINCT CAST(ItemTaxGrCode AS NVARCHAR(50)) AS Code, CAST(ItemTaxGrCode AS NVARCHAR(200)) AS [Description] FROM dbo.cdItem WITH(NOLOCK) WHERE ISNULL(ItemTaxGrCode,'') <> '' ORDER BY Code`, &out.ItemTaxGrCodes}, - {`SELECT DISTINCT CAST(ItemPaymentPlanGrCode AS NVARCHAR(50)) AS Code, CAST(ItemPaymentPlanGrCode AS NVARCHAR(200)) AS [Description] FROM dbo.cdItem WITH(NOLOCK) WHERE ISNULL(ItemPaymentPlanGrCode,'') <> '' ORDER BY Code`, &out.ItemPaymentPlanGrCodes}, - {`SELECT DISTINCT CAST(ItemDiscountGrCode AS NVARCHAR(50)) AS Code, CAST(ItemDiscountGrCode AS NVARCHAR(200)) AS [Description] FROM dbo.cdItem WITH(NOLOCK) WHERE ISNULL(ItemDiscountGrCode,'') <> '' ORDER BY Code`, &out.ItemDiscountGrCodes}, - {`SELECT DISTINCT CAST(ItemVendorGrCode AS NVARCHAR(50)) AS Code, CAST(ItemVendorGrCode AS NVARCHAR(200)) AS [Description] FROM dbo.cdItem WITH(NOLOCK) WHERE ISNULL(ItemVendorGrCode,'') <> '' ORDER BY Code`, &out.ItemVendorGrCodes}, - {`SELECT DISTINCT CAST(PromotionGroupCode AS NVARCHAR(50)) AS Code, CAST(PromotionGroupCode AS NVARCHAR(200)) AS [Description] FROM dbo.cdItem WITH(NOLOCK) WHERE ISNULL(PromotionGroupCode,'') <> '' ORDER BY Code`, &out.PromotionGroupCodes}, - {`SELECT DISTINCT CAST(ProductCollectionGrCode AS NVARCHAR(50)) AS Code, CAST(ProductCollectionGrCode AS NVARCHAR(200)) AS [Description] FROM dbo.cdItem WITH(NOLOCK) WHERE ISNULL(ProductCollectionGrCode,'') <> '' ORDER BY Code`, &out.ProductCollectionGrCodes}, - {`SELECT DISTINCT CAST(StorePriceLevelCode AS NVARCHAR(50)) AS Code, CAST(StorePriceLevelCode AS NVARCHAR(200)) AS [Description] FROM dbo.cdItem WITH(NOLOCK) WHERE ISNULL(StorePriceLevelCode,'') <> '' ORDER BY Code`, &out.StorePriceLevelCodes}, - {`SELECT DISTINCT CAST(PerceptionOfFashionCode AS NVARCHAR(50)) AS Code, CAST(PerceptionOfFashionCode AS NVARCHAR(200)) AS [Description] FROM dbo.cdItem WITH(NOLOCK) WHERE ISNULL(PerceptionOfFashionCode,'') <> '' ORDER BY Code`, &out.PerceptionOfFashionCodes}, - {`SELECT DISTINCT CAST(CommercialRoleCode AS NVARCHAR(50)) AS Code, CAST(CommercialRoleCode AS NVARCHAR(200)) AS [Description] FROM dbo.cdItem WITH(NOLOCK) WHERE ISNULL(CommercialRoleCode,'') <> '' ORDER BY Code`, &out.CommercialRoleCodes}, - {`SELECT DISTINCT CAST(StoreCapacityLevelCode AS NVARCHAR(50)) AS Code, CAST(StoreCapacityLevelCode AS NVARCHAR(200)) AS [Description] FROM dbo.cdItem WITH(NOLOCK) WHERE ISNULL(StoreCapacityLevelCode,'') <> '' ORDER BY Code`, &out.StoreCapacityLevelCodes}, - {`SELECT DISTINCT CAST(CustomsTariffNumberCode AS NVARCHAR(50)) AS Code, CAST(CustomsTariffNumberCode AS NVARCHAR(200)) AS [Description] FROM dbo.cdItem WITH(NOLOCK) WHERE ISNULL(CustomsTariffNumberCode,'') <> '' ORDER BY Code`, &out.CustomsTariffNumbers}, - {`SELECT DISTINCT CAST(CompanyCode AS NVARCHAR(50)) AS Code, CAST(CompanyCode AS NVARCHAR(200)) AS [Description] FROM dbo.cdItem WITH(NOLOCK) WHERE ISNULL(CompanyCode,'') <> '' ORDER BY Code`, &out.CompanyCodes}, + {"UnitOfMeasureCode1List", `SELECT DISTINCT CAST(UnitOfMeasureCode1 AS NVARCHAR(50)) AS Code, CAST(UnitOfMeasureCode1 AS NVARCHAR(200)) AS [Description] FROM dbo.cdItem WITH(NOLOCK) WHERE NULLIF(LTRIM(RTRIM(CAST(UnitOfMeasureCode1 AS NVARCHAR(200)))), '') IS NOT NULL ORDER BY Code`, &out.UnitOfMeasureCode1List}, + {"ItemAccountGrCodes", `SELECT DISTINCT CAST(ItemAccountGrCode AS NVARCHAR(50)) AS Code, CAST(ItemAccountGrCode AS NVARCHAR(200)) AS [Description] FROM dbo.cdItem WITH(NOLOCK) WHERE NULLIF(LTRIM(RTRIM(CAST(ItemAccountGrCode AS NVARCHAR(200)))), '') IS NOT NULL ORDER BY Code`, &out.ItemAccountGrCodes}, + {"ItemTaxGrCodes", `SELECT DISTINCT CAST(ItemTaxGrCode AS NVARCHAR(50)) AS Code, CAST(ItemTaxGrCode AS NVARCHAR(200)) AS [Description] FROM dbo.cdItem WITH(NOLOCK) WHERE NULLIF(LTRIM(RTRIM(CAST(ItemTaxGrCode AS NVARCHAR(200)))), '') IS NOT NULL ORDER BY Code`, &out.ItemTaxGrCodes}, + {"ItemPaymentPlanGrCodes", `SELECT DISTINCT CAST(ItemPaymentPlanGrCode AS NVARCHAR(50)) AS Code, CAST(ItemPaymentPlanGrCode AS NVARCHAR(200)) AS [Description] FROM dbo.cdItem WITH(NOLOCK) WHERE NULLIF(LTRIM(RTRIM(CAST(ItemPaymentPlanGrCode AS NVARCHAR(200)))), '') IS NOT NULL ORDER BY Code`, &out.ItemPaymentPlanGrCodes}, + {"ItemDiscountGrCodes", `SELECT DISTINCT CAST(ItemDiscountGrCode AS NVARCHAR(50)) AS Code, CAST(ItemDiscountGrCode AS NVARCHAR(200)) AS [Description] FROM dbo.cdItem WITH(NOLOCK) WHERE NULLIF(LTRIM(RTRIM(CAST(ItemDiscountGrCode AS NVARCHAR(200)))), '') IS NOT NULL ORDER BY Code`, &out.ItemDiscountGrCodes}, + {"ItemVendorGrCodes", `SELECT DISTINCT CAST(ItemVendorGrCode AS NVARCHAR(50)) AS Code, CAST(ItemVendorGrCode AS NVARCHAR(200)) AS [Description] FROM dbo.cdItem WITH(NOLOCK) WHERE NULLIF(LTRIM(RTRIM(CAST(ItemVendorGrCode AS NVARCHAR(200)))), '') IS NOT NULL ORDER BY Code`, &out.ItemVendorGrCodes}, + {"PromotionGroupCodes", `SELECT DISTINCT CAST(PromotionGroupCode AS NVARCHAR(50)) AS Code, CAST(PromotionGroupCode AS NVARCHAR(200)) AS [Description] FROM dbo.cdItem WITH(NOLOCK) WHERE NULLIF(LTRIM(RTRIM(CAST(PromotionGroupCode AS NVARCHAR(200)))), '') IS NOT NULL ORDER BY Code`, &out.PromotionGroupCodes}, + {"ProductCollectionGrCodes", `SELECT DISTINCT CAST(ProductCollectionGrCode AS NVARCHAR(50)) AS Code, CAST(ProductCollectionGrCode AS NVARCHAR(200)) AS [Description] FROM dbo.cdItem WITH(NOLOCK) WHERE NULLIF(LTRIM(RTRIM(CAST(ProductCollectionGrCode AS NVARCHAR(200)))), '') IS NOT NULL ORDER BY Code`, &out.ProductCollectionGrCodes}, + {"StorePriceLevelCodes", `SELECT DISTINCT CAST(StorePriceLevelCode AS NVARCHAR(50)) AS Code, CAST(StorePriceLevelCode AS NVARCHAR(200)) AS [Description] FROM dbo.cdItem WITH(NOLOCK) WHERE NULLIF(LTRIM(RTRIM(CAST(StorePriceLevelCode AS NVARCHAR(200)))), '') IS NOT NULL ORDER BY Code`, &out.StorePriceLevelCodes}, + {"PerceptionOfFashionCodes", `SELECT DISTINCT CAST(PerceptionOfFashionCode AS NVARCHAR(50)) AS Code, CAST(PerceptionOfFashionCode AS NVARCHAR(200)) AS [Description] FROM dbo.cdItem WITH(NOLOCK) WHERE NULLIF(LTRIM(RTRIM(CAST(PerceptionOfFashionCode AS NVARCHAR(200)))), '') IS NOT NULL ORDER BY Code`, &out.PerceptionOfFashionCodes}, + {"CommercialRoleCodes", `SELECT DISTINCT CAST(CommercialRoleCode AS NVARCHAR(50)) AS Code, CAST(CommercialRoleCode AS NVARCHAR(200)) AS [Description] FROM dbo.cdItem WITH(NOLOCK) WHERE NULLIF(LTRIM(RTRIM(CAST(CommercialRoleCode AS NVARCHAR(200)))), '') IS NOT NULL ORDER BY Code`, &out.CommercialRoleCodes}, + {"StoreCapacityLevelCodes", `SELECT DISTINCT CAST(StoreCapacityLevelCode AS NVARCHAR(50)) AS Code, CAST(StoreCapacityLevelCode AS NVARCHAR(200)) AS [Description] FROM dbo.cdItem WITH(NOLOCK) WHERE NULLIF(LTRIM(RTRIM(CAST(StoreCapacityLevelCode AS NVARCHAR(200)))), '') IS NOT NULL ORDER BY Code`, &out.StoreCapacityLevelCodes}, + {"CustomsTariffNumbers", `SELECT DISTINCT CAST(CustomsTariffNumberCode AS NVARCHAR(50)) AS Code, CAST(CustomsTariffNumberCode AS NVARCHAR(200)) AS [Description] FROM dbo.cdItem WITH(NOLOCK) WHERE NULLIF(LTRIM(RTRIM(CAST(CustomsTariffNumberCode AS NVARCHAR(200)))), '') IS NOT NULL ORDER BY Code`, &out.CustomsTariffNumbers}, + {"CompanyCodes", `SELECT DISTINCT CAST(CompanyCode AS NVARCHAR(50)) AS Code, CAST(CompanyCode AS NVARCHAR(200)) AS [Description] FROM dbo.cdItem WITH(NOLOCK) WHERE NULLIF(LTRIM(RTRIM(CAST(CompanyCode AS NVARCHAR(200)))), '') IS NOT NULL ORDER BY Code`, &out.CompanyCodes}, } for _, pair := range queryPairs { + start := time.Now() + log.Printf("[GetOrderProductionLookupOptions] executing [%s]", pair.Name) rows, err := mssql.Query(pair.Query) if err != nil { - return out, err + return out, fmt.Errorf("lookup query failed [%s]: %w", pair.Name, err) } list := make([]models.OrderProductionLookupOption, 0, 64) @@ -552,7 +558,7 @@ func GetOrderProductionLookupOptions(mssql *sql.DB) (models.OrderProductionCdIte var item models.OrderProductionLookupOption if err := rows.Scan(&item.Code, &item.Description); err != nil { rows.Close() - return out, err + return out, fmt.Errorf("lookup scan failed [%s]: %w", pair.Name, err) } item.Code = strings.TrimSpace(item.Code) item.Description = strings.TrimSpace(item.Description) @@ -560,9 +566,10 @@ func GetOrderProductionLookupOptions(mssql *sql.DB) (models.OrderProductionCdIte } if err := rows.Err(); err != nil { rows.Close() - return out, err + return out, fmt.Errorf("lookup rows failed [%s]: %w", pair.Name, err) } rows.Close() + log.Printf("[GetOrderProductionLookupOptions] ok [%s] count=%d duration=%s", pair.Name, len(list), time.Since(start)) *pair.Target = list } diff --git a/svc/queries/product.go b/svc/queries/product.go index 73953db..c7c1e2c 100644 --- a/svc/queries/product.go +++ b/svc/queries/product.go @@ -9,12 +9,12 @@ import ( func GetProductList() ([]models.Product, error) { rows, err := db.MssqlDB.Query(` SELECT - ProductCode + LTRIM(RTRIM(ProductCode)) AS ProductCode FROM ProductFilterWithDescription('TR') WHERE ProductAtt42 IN ('SERI', 'AKSESUAR') AND IsBlocked = 0 - AND LEN(ProductCode) = 13 -- 🔹 yalnızca 13 karakterlik kodlar + AND LEN(LTRIM(RTRIM(ProductCode))) = 13 ORDER BY ProductCode; `) if err != nil { diff --git a/svc/queries/productattributes.go b/svc/queries/productattributes.go index 9938be2..78b8f27 100644 --- a/svc/queries/productattributes.go +++ b/svc/queries/productattributes.go @@ -1,14 +1,19 @@ package queries const GetProductAttributes = ` -;WITH TypeDesc AS ( +;WITH RequiredTypes AS ( SELECT t.ItemTypeCode, t.AttributeTypeCode, - ISNULL(t.AttributeTypeDescription, CAST(t.AttributeTypeCode AS NVARCHAR(30))) AS AttributeTypeDescription - FROM dbo.cdItemAttributeTypeDesc AS t WITH(NOLOCK) + ISNULL(NULLIF(td.AttributeTypeDescription, ''), CAST(t.AttributeTypeCode AS NVARCHAR(30))) AS AttributeTypeDescription + FROM dbo.cdItemAttributeType AS t WITH(NOLOCK) + LEFT JOIN dbo.cdItemAttributeTypeDesc AS td WITH(NOLOCK) + ON td.ItemTypeCode = t.ItemTypeCode + AND td.AttributeTypeCode = t.AttributeTypeCode + AND td.LangCode = 'TR' WHERE t.ItemTypeCode = @p1 - AND t.LangCode = 'TR' + AND ISNULL(t.IsBlocked, 0) = 0 + AND ISNULL(t.IsRequired, 0) = 1 ), Attr AS ( SELECT @@ -24,19 +29,21 @@ Attr AS ( AND d.LangCode = 'TR' WHERE a.ItemTypeCode = @p1 AND ISNULL(a.IsBlocked, 0) = 0 -), + AND ISNULL(a.AttributeCode, '') <> '' +) SELECT - a.ItemTypeCode, - a.AttributeTypeCode, - ISNULL(NULLIF(td.AttributeTypeDescription, ''), CAST(a.AttributeTypeCode AS NVARCHAR(30))) AS AttributeTypeDescription, + rt.ItemTypeCode, + rt.AttributeTypeCode, + rt.AttributeTypeDescription, a.AttributeCode, a.AttributeDescription -FROM Attr a -LEFT JOIN TypeDesc td - ON td.ItemTypeCode = a.ItemTypeCode - AND td.AttributeTypeCode = a.AttributeTypeCode +FROM RequiredTypes AS rt +LEFT JOIN Attr AS a + ON a.ItemTypeCode = rt.ItemTypeCode + AND a.AttributeTypeCode = rt.AttributeTypeCode +WHERE ISNULL(a.AttributeCode, '') <> '' ORDER BY - a.AttributeTypeCode, - CASE WHEN a.AttributeCode = '-' THEN 0 ELSE 1 END, + rt.AttributeTypeCode, + CASE WHEN a.AttributeCode IN ('-', '.') THEN 0 ELSE 1 END, a.AttributeCode; ` diff --git a/svc/queries/productcolor.go b/svc/queries/productcolor.go index 04eca75..f438fe5 100644 --- a/svc/queries/productcolor.go +++ b/svc/queries/productcolor.go @@ -3,27 +3,18 @@ package queries const GetProductColors = ` DECLARE @ProductCode VARCHAR(30) = @p1; -WITH NormalizedColors AS ( - SELECT - p.ProductCode, - CASE - WHEN ISNULL(v.ColorCode, '') = '000' THEN '001' - ELSE ISNULL(v.ColorCode, '') - END AS ColorCode - FROM ProductFilterWithDescription('TR') AS p - INNER JOIN prItemVariant AS v WITH(NOLOCK) - ON v.ItemCode = p.ProductCode - WHERE - p.ProductCode = @ProductCode - AND ISNULL(v.ColorCode, '') <> '' -) SELECT DISTINCT - n.ProductCode, - n.ColorCode, - ISNULL(cd.ColorDescription, CASE WHEN n.ColorCode = '001' THEN 'SIYAH' ELSE '' END) AS ColorDescription -FROM NormalizedColors AS n + p.ProductCode, + v.ColorCode, + ISNULL(cd.ColorDescription, '') AS ColorDescription +FROM ProductFilterWithDescription('TR') AS p +INNER JOIN prItemVariant AS v WITH(NOLOCK) + ON v.ItemCode = p.ProductCode LEFT JOIN cdColorDesc AS cd WITH(NOLOCK) - ON cd.ColorCode = n.ColorCode + ON cd.ColorCode = v.ColorCode AND cd.LangCode = 'TR' -ORDER BY n.ColorCode; +WHERE + p.ProductCode = @ProductCode + AND ISNULL(v.ColorCode, '') <> '' +ORDER BY v.ColorCode; ` diff --git a/svc/queries/productsecondcolor.go b/svc/queries/productsecondcolor.go index 5ec3b88..124b625 100644 --- a/svc/queries/productsecondcolor.go +++ b/svc/queries/productsecondcolor.go @@ -1,40 +1,24 @@ package queries const GetProductSecondColors = ` -WITH NormalizedVariants AS ( - SELECT - Product.ProductCode, - CASE - WHEN ISNULL(prItemVariant.ColorCode, '') = '000' THEN '001' - ELSE ISNULL(prItemVariant.ColorCode, '') - END AS ColorCode, - CASE - WHEN ISNULL(prItemVariant.ItemDim2Code, '') = '000' THEN '001' - ELSE ISNULL(prItemVariant.ItemDim2Code, '') - END AS ItemDim2Code - FROM prItemVariant WITH(NOLOCK) - INNER JOIN ProductFilterWithDescription('TR') AS Product - ON prItemVariant.ItemCode = Product.ProductCode - WHERE Product.ProductCode = @ProductCode -) SELECT - Variant.ProductCode, - Variant.ColorCode, - Variant.ItemDim2Code, - ISNULL(ColorDesc.ColorDescription, CASE WHEN Variant.ItemDim2Code = '001' THEN 'SIYAH' ELSE '' END) AS ColorDescription -FROM NormalizedVariants AS Variant + Product.ProductCode, + ISNULL(prItemVariant.ColorCode, '') AS ColorCode, + ISNULL(prItemVariant.ItemDim2Code, '') AS ItemDim2Code, + ISNULL(ColorDesc.ColorDescription, '') AS ColorDescription +FROM prItemVariant WITH(NOLOCK) + INNER JOIN ProductFilterWithDescription('TR') AS Product + ON prItemVariant.ItemCode = Product.ProductCode LEFT JOIN cdColorDesc AS ColorDesc WITH(NOLOCK) - ON ColorDesc.ColorCode = Variant.ItemDim2Code + ON ColorDesc.ColorCode = prItemVariant.ItemDim2Code AND ColorDesc.LangCode = 'TR' -WHERE Variant.ColorCode = CASE - WHEN ISNULL(@ColorCode, '') = '000' THEN '001' - ELSE ISNULL(@ColorCode, '') - END - AND Variant.ItemDim2Code <> '' +WHERE Product.ProductCode = @ProductCode + AND prItemVariant.ColorCode = @ColorCode + AND ISNULL(prItemVariant.ItemDim2Code, '') <> '' GROUP BY - Variant.ProductCode, - Variant.ItemDim2Code, - Variant.ColorCode, + Product.ProductCode, + prItemVariant.ItemDim2Code, + prItemVariant.ColorCode, ColorDesc.ColorDescription -ORDER BY Variant.ItemDim2Code +ORDER BY ItemDim2Code ` diff --git a/svc/routes/orderproductionitems.go b/svc/routes/orderproductionitems.go index d2d8fe9..97a46a8 100644 --- a/svc/routes/orderproductionitems.go +++ b/svc/routes/orderproductionitems.go @@ -7,10 +7,12 @@ import ( "database/sql" "encoding/json" "errors" + "fmt" "log" "net/http" "regexp" "strings" + "time" "github.com/gorilla/mux" mssql "github.com/microsoft/go-mssqldb" @@ -79,16 +81,26 @@ func OrderProductionItemsRoute(mssql *sql.DB) http.Handler { func OrderProductionCdItemLookupsRoute(mssql *sql.DB) http.Handler { return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { w.Header().Set("Content-Type", "application/json; charset=utf-8") + rid := fmt.Sprintf("opl-%d", time.Now().UnixNano()) + w.Header().Set("X-Debug-Request-Id", rid) + log.Printf("[OrderProductionCdItemLookupsRoute] rid=%s started", rid) lookups, err := queries.GetOrderProductionLookupOptions(mssql) if err != nil { - log.Printf("[OrderProductionCdItemLookupsRoute] lookup error: %v", err) - http.Error(w, "Veritabani hatasi", http.StatusInternalServerError) + log.Printf("[OrderProductionCdItemLookupsRoute] rid=%s lookup error: %v", rid, err) + w.WriteHeader(http.StatusInternalServerError) + _ = json.NewEncoder(w).Encode(map[string]any{ + "message": "Veritabani hatasi", + "step": "cditem-lookups", + "detail": err.Error(), + "requestId": rid, + }) return } + log.Printf("[OrderProductionCdItemLookupsRoute] rid=%s success", rid) if err := json.NewEncoder(w).Encode(lookups); err != nil { - log.Printf("[OrderProductionCdItemLookupsRoute] encode error: %v", err) + log.Printf("[OrderProductionCdItemLookupsRoute] rid=%s encode error: %v", rid, err) } }) } diff --git a/ui/.quasar/prod-spa/app.js b/ui/.quasar/prod-spa/app.js deleted file mode 100644 index caeaac1..0000000 --- a/ui/.quasar/prod-spa/app.js +++ /dev/null @@ -1,75 +0,0 @@ -/* eslint-disable */ -/** - * THIS FILE IS GENERATED AUTOMATICALLY. - * DO NOT EDIT. - * - * You are probably looking on adding startup/initialization code. - * Use "quasar new boot " and add it there. - * One boot file per concern. Then reference the file(s) in quasar.config file > boot: - * boot: ['file', ...] // do not add ".js" extension to it. - * - * Boot files are your "main.js" - **/ - - - - - -import { Quasar } from 'quasar' -import { markRaw } from 'vue' -import RootComponent from 'app/src/App.vue' - -import createStore from 'app/src/stores/index' -import createRouter from 'app/src/router/index' - - - - - -export default async function (createAppFn, quasarUserOptions) { - - - // Create the app instance. - // Here we inject into it the Quasar UI, the router & possibly the store. - const app = createAppFn(RootComponent) - - - - app.use(Quasar, quasarUserOptions) - - - - - const store = typeof createStore === 'function' - ? await createStore({}) - : createStore - - - app.use(store) - - - - - - const router = markRaw( - typeof createRouter === 'function' - ? await createRouter({store}) - : createRouter - ) - - - // make router instance available in store - - store.use(({ store }) => { store.router = router }) - - - - // Expose the app, the router and the store. - // Note that we are not mounting the app here, since bootstrapping will be - // different depending on whether we are in a browser or on the server. - return { - app, - store, - router - } -} diff --git a/ui/.quasar/prod-spa/client-entry.js b/ui/.quasar/prod-spa/client-entry.js deleted file mode 100644 index 5de66d0..0000000 --- a/ui/.quasar/prod-spa/client-entry.js +++ /dev/null @@ -1,154 +0,0 @@ -/* eslint-disable */ -/** - * THIS FILE IS GENERATED AUTOMATICALLY. - * DO NOT EDIT. - * - * You are probably looking on adding startup/initialization code. - * Use "quasar new boot " and add it there. - * One boot file per concern. Then reference the file(s) in quasar.config file > boot: - * boot: ['file', ...] // do not add ".js" extension to it. - * - * Boot files are your "main.js" - **/ - - -import { createApp } from 'vue' - - - - - - - -import '@quasar/extras/roboto-font/roboto-font.css' - -import '@quasar/extras/material-icons/material-icons.css' - - - - -// We load Quasar stylesheet file -import 'quasar/dist/quasar.sass' - - - - -import 'src/css/app.css' - - -import createQuasarApp from './app.js' -import quasarUserOptions from './quasar-user-options.js' - - - - - - - - -const publicPath = `/` - - -async function start ({ - app, - router - , store -}, bootFiles) { - - let hasRedirected = false - const getRedirectUrl = url => { - try { return router.resolve(url).href } - catch (err) {} - - return Object(url) === url - ? null - : url - } - const redirect = url => { - hasRedirected = true - - if (typeof url === 'string' && /^https?:\/\//.test(url)) { - window.location.href = url - return - } - - const href = getRedirectUrl(url) - - // continue if we didn't fail to resolve the url - if (href !== null) { - window.location.href = href - window.location.reload() - } - } - - const urlPath = window.location.href.replace(window.location.origin, '') - - for (let i = 0; hasRedirected === false && i < bootFiles.length; i++) { - try { - await bootFiles[i]({ - app, - router, - store, - ssrContext: null, - redirect, - urlPath, - publicPath - }) - } - catch (err) { - if (err && err.url) { - redirect(err.url) - return - } - - console.error('[Quasar] boot error:', err) - return - } - } - - if (hasRedirected === true) return - - - app.use(router) - - - - - - - app.mount('#q-app') - - - -} - -createQuasarApp(createApp, quasarUserOptions) - - .then(app => { - // eventually remove this when Cordova/Capacitor/Electron support becomes old - const [ method, mapFn ] = Promise.allSettled !== void 0 - ? [ - 'allSettled', - bootFiles => bootFiles.map(result => { - if (result.status === 'rejected') { - console.error('[Quasar] boot error:', result.reason) - return - } - return result.value.default - }) - ] - : [ - 'all', - bootFiles => bootFiles.map(entry => entry.default) - ] - - return Promise[ method ]([ - - import(/* webpackMode: "eager" */ 'boot/dayjs') - - ]).then(bootFiles => { - const boot = mapFn(bootFiles).filter(entry => typeof entry === 'function') - start(app, boot) - }) - }) - diff --git a/ui/.quasar/prod-spa/client-prefetch.js b/ui/.quasar/prod-spa/client-prefetch.js deleted file mode 100644 index 9bbe3c5..0000000 --- a/ui/.quasar/prod-spa/client-prefetch.js +++ /dev/null @@ -1,116 +0,0 @@ -/* eslint-disable */ -/** - * THIS FILE IS GENERATED AUTOMATICALLY. - * DO NOT EDIT. - * - * You are probably looking on adding startup/initialization code. - * Use "quasar new boot " and add it there. - * One boot file per concern. Then reference the file(s) in quasar.config file > boot: - * boot: ['file', ...] // do not add ".js" extension to it. - * - * Boot files are your "main.js" - **/ - - - -import App from 'app/src/App.vue' -let appPrefetch = typeof App.preFetch === 'function' - ? App.preFetch - : ( - // Class components return the component options (and the preFetch hook) inside __c property - App.__c !== void 0 && typeof App.__c.preFetch === 'function' - ? App.__c.preFetch - : false - ) - - -function getMatchedComponents (to, router) { - const route = to - ? (to.matched ? to : router.resolve(to).route) - : router.currentRoute.value - - if (!route) { return [] } - - const matched = route.matched.filter(m => m.components !== void 0) - - if (matched.length === 0) { return [] } - - return Array.prototype.concat.apply([], matched.map(m => { - return Object.keys(m.components).map(key => { - const comp = m.components[key] - return { - path: m.path, - c: comp - } - }) - })) -} - -export function addPreFetchHooks ({ router, store, publicPath }) { - // Add router hook for handling preFetch. - // Doing it after initial route is resolved so that we don't double-fetch - // the data that we already have. Using router.beforeResolve() so that all - // async components are resolved. - router.beforeResolve((to, from, next) => { - const - urlPath = window.location.href.replace(window.location.origin, ''), - matched = getMatchedComponents(to, router), - prevMatched = getMatchedComponents(from, router) - - let diffed = false - const preFetchList = matched - .filter((m, i) => { - return diffed || (diffed = ( - !prevMatched[i] || - prevMatched[i].c !== m.c || - m.path.indexOf('/:') > -1 // does it has params? - )) - }) - .filter(m => m.c !== void 0 && ( - typeof m.c.preFetch === 'function' - // Class components return the component options (and the preFetch hook) inside __c property - || (m.c.__c !== void 0 && typeof m.c.__c.preFetch === 'function') - )) - .map(m => m.c.__c !== void 0 ? m.c.__c.preFetch : m.c.preFetch) - - - if (appPrefetch !== false) { - preFetchList.unshift(appPrefetch) - appPrefetch = false - } - - - if (preFetchList.length === 0) { - return next() - } - - let hasRedirected = false - const redirect = url => { - hasRedirected = true - next(url) - } - const proceed = () => { - - if (hasRedirected === false) { next() } - } - - - - preFetchList.reduce( - (promise, preFetch) => promise.then(() => hasRedirected === false && preFetch({ - store, - currentRoute: to, - previousRoute: from, - redirect, - urlPath, - publicPath - })), - Promise.resolve() - ) - .then(proceed) - .catch(e => { - console.error(e) - proceed() - }) - }) -} diff --git a/ui/.quasar/prod-spa/quasar-user-options.js b/ui/.quasar/prod-spa/quasar-user-options.js deleted file mode 100644 index ac1dae3..0000000 --- a/ui/.quasar/prod-spa/quasar-user-options.js +++ /dev/null @@ -1,23 +0,0 @@ -/* eslint-disable */ -/** - * THIS FILE IS GENERATED AUTOMATICALLY. - * DO NOT EDIT. - * - * You are probably looking on adding startup/initialization code. - * Use "quasar new boot " and add it there. - * One boot file per concern. Then reference the file(s) in quasar.config file > boot: - * boot: ['file', ...] // do not add ".js" extension to it. - * - * Boot files are your "main.js" - **/ - -import lang from 'quasar/lang/tr.js' - - - -import {Loading,Dialog,Notify} from 'quasar' - - - -export default { config: {"notify":{"position":"top","timeout":2500}},lang,plugins: {Loading,Dialog,Notify} } - diff --git a/ui/quasar.config.js.temporary.compiled.1774811975940.mjs b/ui/quasar.config.js.temporary.compiled.1775121813494.mjs similarity index 100% rename from ui/quasar.config.js.temporary.compiled.1774811975940.mjs rename to ui/quasar.config.js.temporary.compiled.1775121813494.mjs diff --git a/ui/src/pages/OrderEntry.vue b/ui/src/pages/OrderEntry.vue index 76969c8..745a3d2 100644 --- a/ui/src/pages/OrderEntry.vue +++ b/ui/src/pages/OrderEntry.vue @@ -1,4 +1,4 @@ -