package queries import ( "bssapp-backend/utils" "context" "database/sql" "fmt" "strconv" "strings" "unicode" ) func GetProductAnaAltGrupByUrunKodu(ctx context.Context, mssqlDB *sql.DB, urunKodu string) (urunAnaGrubu string, urunAltGrubu string, err error) { urunKodu = strings.TrimSpace(urunKodu) if mssqlDB == nil || urunKodu == "" { return "", "", nil } // Nebim V3: ProductFilterWithDescription exposes ProductAtt01Desc (ana grup) and ProductAtt02Desc (alt grup). sqlText := ` SELECT TOP 1 ISNULL(ProductAtt01Desc, '') AS UrunAnaGrubu, ISNULL(ProductAtt02Desc, '') AS UrunAltGrubu FROM ProductFilterWithDescription('TR') WHERE IsBlocked = 0 AND LTRIM(RTRIM(ProductCode)) = @p1 ORDER BY ProductCode; ` row := mssqlDB.QueryRowContext(ctx, sqlText, urunKodu) if err := row.Scan(&urunAnaGrubu, &urunAltGrubu); err != nil { if err == sql.ErrNoRows { return "", "", nil } return "", "", err } return urunAnaGrubu, urunAltGrubu, nil } func GetProductionProductCostingAnaGrupOptions(ctx context.Context, mssqlDB *sql.DB, search string, limit int) (*sql.Rows, error) { search = strings.TrimSpace(search) if limit <= 0 { limit = 50 } searchLike := "%" + search + "%" sqlText := ` SELECT TOP (@p2) ISNULL(NULLIF(LTRIM(RTRIM(P.ProductAtt01Desc)), ''), '') AS UrunAnaGrubu FROM ProductFilterWithDescription('TR') AS P WHERE P.IsBlocked = 0 AND NULLIF(LTRIM(RTRIM(P.ProductAtt01Desc)), '') IS NOT NULL AND (@p1 = '' OR P.ProductAtt01Desc LIKE @p3) GROUP BY P.ProductAtt01Desc ORDER BY P.ProductAtt01Desc ` return mssqlDB.QueryContext(ctx, sqlText, search, limit, searchLike) } func GetProductionProductCostingAltGrupOptions(ctx context.Context, mssqlDB *sql.DB, urunAnaGrubu string, search string, limit int) (*sql.Rows, error) { urunAnaGrubu = strings.TrimSpace(urunAnaGrubu) search = strings.TrimSpace(search) if limit <= 0 { limit = 50 } searchLike := "%" + search + "%" sqlText := ` SELECT TOP (@p3) ISNULL(NULLIF(LTRIM(RTRIM(P.ProductAtt02Desc)), ''), '') AS UrunAltGrubu FROM ProductFilterWithDescription('TR') AS P WHERE P.IsBlocked = 0 AND NULLIF(LTRIM(RTRIM(P.ProductAtt02Desc)), '') IS NOT NULL AND (@p1 = '' OR LTRIM(RTRIM(P.ProductAtt01Desc)) = @p1) AND (@p2 = '' OR P.ProductAtt02Desc LIKE @p4) GROUP BY P.ProductAtt02Desc ORDER BY P.ProductAtt02Desc ` return mssqlDB.QueryContext(ctx, sqlText, urunAnaGrubu, search, limit, searchLike) } func GetProductionProductCostingAnaAltComboRows(ctx context.Context, mssqlDB *sql.DB, search string, limit int) (*sql.Rows, error) { search = strings.TrimSpace(search) if limit <= 0 { limit = 500 } if limit > 5000 { limit = 5000 } // For very short searches, avoid leading-wildcard LIKE which can be extremely expensive on MSSQL side. // Example: "ce" should match "CEKET%" cheaply vs "%ce%" scanning everything. searchLike := "%" + search + "%" if len([]rune(search)) > 0 && len([]rune(search)) < 3 { searchLike = search + "%" } sqlText := ` SELECT TOP (@p2) ISNULL(NULLIF(LTRIM(RTRIM(CONVERT(NVARCHAR(200), P.ProductAtt42Desc))), ''), '') AS UrunIlkGrubu, ISNULL(NULLIF(LTRIM(RTRIM(CONVERT(NVARCHAR(200), P.ProductAtt01Desc))), ''), '') AS UrunAnaGrubu, ISNULL(NULLIF(LTRIM(RTRIM(CONVERT(NVARCHAR(200), P.ProductAtt02Desc))), ''), '') AS UrunAltGrubu FROM ProductFilterWithDescription('TR') AS P WHERE P.IsBlocked = 0 AND NULLIF(LTRIM(RTRIM(CONVERT(NVARCHAR(200), P.ProductAtt42Desc))), '') IS NOT NULL AND NULLIF(LTRIM(RTRIM(CONVERT(NVARCHAR(200), P.ProductAtt01Desc))), '') IS NOT NULL AND NULLIF(LTRIM(RTRIM(CONVERT(NVARCHAR(200), P.ProductAtt02Desc))), '') IS NOT NULL AND ( @p1 = '' OR CONVERT(NVARCHAR(200), P.ProductAtt42Desc) LIKE @p3 OR CONVERT(NVARCHAR(200), P.ProductAtt01Desc) LIKE @p3 OR CONVERT(NVARCHAR(200), P.ProductAtt02Desc) LIKE @p3 ) GROUP BY CONVERT(NVARCHAR(200), P.ProductAtt42Desc), CONVERT(NVARCHAR(200), P.ProductAtt01Desc), CONVERT(NVARCHAR(200), P.ProductAtt02Desc) ORDER BY CONVERT(NVARCHAR(200), P.ProductAtt42Desc), CONVERT(NVARCHAR(200), P.ProductAtt02Desc), CONVERT(NVARCHAR(200), P.ProductAtt01Desc) ` return mssqlDB.QueryContext(ctx, sqlText, search, limit, searchLike) } func GetProductionProductCostingMTBolumOptions(ctx context.Context, uretimDB *sql.DB, search string, limit int) (*sql.Rows, error) { search = strings.TrimSpace(search) if limit <= 0 { limit = 50 } searchLike := "%" + search + "%" sqlText := ` SELECT TOP (@p2) ISNULL(B.nUrtMTBolumID, 0) AS nUrtMTBolumID, ISNULL(B.sAdi, '') AS sAdi FROM dbo.spUrtMTBolum B WITH (NOLOCK) WHERE ISNULL(B.bAktif, 0) = 1 AND (@p1 = '' OR ISNULL(B.sAdi, '') LIKE @p3 OR CONVERT(VARCHAR(32), ISNULL(B.nUrtMTBolumID, 0)) LIKE @p3) ORDER BY B.nUrtMTBolumID ` return uretimDB.QueryContext(ctx, sqlText, search, limit, searchLike) } // ============================================================ // Maliyet Parca Eslestirme (URETIM DB) // ============================================================ func ListProductionProductCostingParcaMappings(ctx context.Context, uretimDB *sql.DB, urunIlkGrubu string, urunAnaGrubu string, urunAltGrubu string, nUrtMTBolumID int, onlyActive *bool) (*sql.Rows, error) { urunIlkGrubu = strings.TrimSpace(urunIlkGrubu) urunAnaGrubu = strings.TrimSpace(urunAnaGrubu) urunAltGrubu = strings.TrimSpace(urunAltGrubu) sqlText := ` SELECT M.id, ISNULL(M.UrunIlkGrubu, '') AS UrunIlkGrubu, ISNULL(M.UrunAnaGrubu, '') AS UrunAnaGrubu, ISNULL(M.UrunAltGrubu, '') AS UrunAltGrubu, ISNULL(M.nUrtMTBolumID, 0) AS nUrtMTBolumID, ISNULL(B.sAdi, '') AS MTBolumAdi, ISNULL(H.HammaddeTurleri, '') AS HammaddeTurleri, CAST(CASE WHEN ISNULL(M.bAktif, 0) = 1 THEN 1 ELSE 0 END AS bit) AS bAktif, CONVERT(VARCHAR(16), M.dteIslemTarihi, 120) AS dteIslemTarihi, ISNULL(M.sKullaniciAdi, '') AS sKullaniciAdi FROM dbo.mk_MaliyetParcaEslestirme M WITH (NOLOCK) LEFT JOIN dbo.spUrtMTBolum B WITH (NOLOCK) ON B.nUrtMTBolumID = M.nUrtMTBolumID OUTER APPLY ( SELECT STUFF(( SELECT ',' + LTRIM(RTRIM(CONVERT(VARCHAR(32), X.nHammaddeTuruNo))) FROM dbo.mk_MaliyetParcaEslestirme_HammaddeTuru X WITH (NOLOCK) WHERE X.mapping_id = M.id ORDER BY X.nHammaddeTuruNo FOR XML PATH(''), TYPE ).value('.', 'NVARCHAR(MAX)'), 1, 1, '') AS HammaddeTurleri ) H WHERE (@p1 = '' OR LTRIM(RTRIM(M.UrunIlkGrubu)) = @p1) AND (@p2 = '' OR LTRIM(RTRIM(M.UrunAnaGrubu)) = @p2) AND (@p3 = '' OR LTRIM(RTRIM(M.UrunAltGrubu)) = @p3) AND (@p4 <= 0 OR M.nUrtMTBolumID = @p4) AND (@p5 IS NULL OR ISNULL(M.bAktif, 0) = @p5) ORDER BY M.UrunAltGrubu, M.UrunAnaGrubu, M.nUrtMTBolumID ` var activeParam any = nil if onlyActive != nil { if *onlyActive { activeParam = 1 } else { activeParam = 0 } } return uretimDB.QueryContext(ctx, sqlText, urunIlkGrubu, urunAnaGrubu, urunAltGrubu, nUrtMTBolumID, activeParam) } func UpsertProductionProductCostingParcaMapping(ctx context.Context, uretimDB *sql.DB, urunIlkGrubu string, urunAnaGrubu string, urunAltGrubu string, nUrtMTBolumID int, nHammaddeTurleri []int, bAktif bool, user string) (mappingID int, err error) { urunIlkGrubu = strings.TrimSpace(urunIlkGrubu) urunAnaGrubu = strings.TrimSpace(urunAnaGrubu) urunAltGrubu = strings.TrimSpace(urunAltGrubu) user = strings.TrimSpace(user) activeVal := 0 if bAktif { activeVal = 1 } tx, err := uretimDB.BeginTx(ctx, nil) if err != nil { return 0, err } defer func() { if err != nil { _ = tx.Rollback() } }() // 1) Upsert header row and get mapping id sqlText := ` DECLARE @id INT; SELECT TOP 1 @id = id FROM dbo.mk_MaliyetParcaEslestirme WITH (UPDLOCK, HOLDLOCK) WHERE LTRIM(RTRIM(UrunIlkGrubu)) = @p1 AND LTRIM(RTRIM(UrunAnaGrubu)) = @p2 AND LTRIM(RTRIM(UrunAltGrubu)) = @p3 AND nUrtMTBolumID = @p4; IF @id IS NULL BEGIN INSERT INTO dbo.mk_MaliyetParcaEslestirme (UrunIlkGrubu, UrunAnaGrubu, UrunAltGrubu, nUrtMTBolumID, bAktif, sKullaniciAdi, dteIslemTarihi) VALUES (@p1, @p2, @p3, @p4, @p5, NULLIF(@p6, ''), GETDATE()); SET @id = SCOPE_IDENTITY(); END ELSE BEGIN UPDATE dbo.mk_MaliyetParcaEslestirme SET bAktif = @p5, sKullaniciAdiDeg = NULLIF(@p6, ''), dteIslemTarihiDeg = GETDATE() WHERE id = @id; END SELECT @id; ` if err = tx.QueryRowContext(ctx, sqlText, urunIlkGrubu, urunAnaGrubu, urunAltGrubu, nUrtMTBolumID, activeVal, user).Scan(&mappingID); err != nil { return 0, err } // 2) Replace child rows if _, err = tx.ExecContext(ctx, `DELETE FROM dbo.mk_MaliyetParcaEslestirme_HammaddeTuru WHERE mapping_id = @p1;`, mappingID); err != nil { return 0, err } insertChild := `INSERT INTO dbo.mk_MaliyetParcaEslestirme_HammaddeTuru (mapping_id, nHammaddeTuruNo) VALUES (@p1, @p2);` seen := make(map[int]bool, len(nHammaddeTurleri)) for _, n := range nHammaddeTurleri { if n <= 0 { continue } if seen[n] { continue } seen[n] = true if _, err = tx.ExecContext(ctx, insertChild, mappingID, n); err != nil { return 0, err } } if err = tx.Commit(); err != nil { return 0, err } return mappingID, nil } func SetProductionProductCostingParcaMappingActive(ctx context.Context, uretimDB *sql.DB, id int, bAktif bool, user string) error { user = strings.TrimSpace(user) activeVal := 0 if bAktif { activeVal = 1 } sqlText := ` UPDATE dbo.mk_MaliyetParcaEslestirme SET bAktif = @p2, sKullaniciAdiDeg = NULLIF(@p3, ''), dteIslemTarihiDeg = GETDATE() WHERE id = @p1; ` _, err := uretimDB.ExecContext(ctx, sqlText, id, activeVal, user) return err } func DeleteProductionProductCostingParcaMapping(ctx context.Context, uretimDB *sql.DB, id int) error { tx, err := uretimDB.BeginTx(ctx, nil) if err != nil { return err } defer func() { if err != nil { _ = tx.Rollback() } }() if _, err = tx.ExecContext(ctx, `DELETE FROM dbo.mk_MaliyetParcaEslestirme_HammaddeTuru WHERE mapping_id = @p1;`, id); err != nil { return err } if _, err = tx.ExecContext(ctx, `DELETE FROM dbo.mk_MaliyetParcaEslestirme WHERE id = @p1;`, id); err != nil { return err } return tx.Commit() } func GetProductionNoCostProducts( ctx context.Context, uretimDB *sql.DB, fromDate string, search string, ) (*sql.Rows, error) { fromDate = strings.TrimSpace(fromDate) if fromDate == "" { fromDate = "2025-06-01" } search = strings.TrimSpace(search) sqlText := ` SELECT CASE WHEN LEFT(LTRIM(RTRIM(R.sMModelKodu)), 1) IN ('N','X','S','O','I','K') THEN N'BAGGI URUN TARAFINDAN URETIME VERILEN' WHEN LEFT(LTRIM(RTRIM(R.sMModelKodu)), 1) IN ('P','F','M') THEN N'FASON ICIN URETILEN' ELSE N'Tanimsiz' END AS UretimSekli, RTRIM(CONVERT(VARCHAR(32), ISNULL(SonIsEmri.nUrtSiparisNo, 0))) AS nUrtSiparisNo, CONVERT(VARCHAR(10), SonIsEmri.dteIslemTarihi, 23) AS dteIslemTarihi, ISNULL(SonIsEmri.FirmaKodu, '') AS FirmaKodu, ISNULL(SonIsEmri.FirmaAdi, '') AS FirmaAdi, ISNULL(SonIsEmri.sVeren, '') AS SonIsEmriVeren, ISNULL(SonIsEmri.lMMiktar_G, 0) AS lMMiktar_G, LTRIM(RTRIM(R.sMModelKodu)) AS sMModelKodu, ISNULL(R.sKodu, '') AS sKodu, ISNULL(R.sAdi, '') AS sAdi, ISNULL(R.sKullaniciAdi, '') AS sKullaniciAdi, ISNULL(R.sKullaniciAdiGunc, '') AS sKullaniciAdiGunc FROM dbo.spUrtRecete R OUTER APPLY ( SELECT TOP 1 SD.nUrtSiparisID, SM.nUrtSiparisNo, SD.dteIslemTarihi, SD.lMMiktar_G, SM.sVeren, F.nFirmaID, F.sKodu AS FirmaKodu, F.sAciklama AS FirmaAdi FROM dbo.spUrtSiparisDet SD INNER JOIN dbo.spUrtSiparis SM ON SM.nUrtSiparisID = SD.nUrtSiparisID LEFT JOIN dbo.tbFirma F ON F.nFirmaID = SM.nFirmaID WHERE SD.nUrtReceteID = R.nUrtReceteID ORDER BY SD.dteIslemTarihi DESC, SD.nUrtSiparisID DESC ) SonIsEmri WHERE LTRIM(RTRIM(R.sMModelKodu)) <> '' AND LEN(LTRIM(RTRIM(R.sMModelKodu))) = 13 AND R.dteIslemTarihi > @p1 AND ( @p2 = '' OR LTRIM(RTRIM(R.sMModelKodu)) LIKE '%' + @p2 + '%' OR ISNULL(SonIsEmri.FirmaKodu, '') LIKE '%' + @p2 + '%' OR ISNULL(SonIsEmri.FirmaAdi, '') LIKE '%' + @p2 + '%' OR ISNULL(SonIsEmri.sVeren, '') LIKE '%' + @p2 + '%' ) AND NOT EXISTS ( SELECT 1 FROM dbo.spUrtOnMLMas M WHERE LTRIM(RTRIM(M.UrunKodu)) = LTRIM(RTRIM(R.sMModelKodu)) ) ORDER BY SonIsEmri.dteIslemTarihi DESC, LTRIM(RTRIM(R.sMModelKodu)) ASC ` return uretimDB.QueryContext(ctx, sqlText, fromDate, search) } func GetProductionHasCostProducts( ctx context.Context, uretimDB *sql.DB, search string, offset int, limit int, ) (*sql.Rows, error) { search = strings.TrimSpace(search) sqlText := ` WITH SonOnMaliyet AS ( SELECT M.*, ROW_NUMBER() OVER ( PARTITION BY LTRIM(RTRIM(M.UrunKodu)) ORDER BY M.Tarihi DESC, M.dteGuncellemeTarihi DESC, M.nOnMLNo DESC ) AS rn FROM dbo.spUrtOnMLMas M WHERE LTRIM(RTRIM(M.UrunKodu)) <> '' ), SonSiparis AS ( SELECT LTRIM(RTRIM(sMModelKodu)) AS UrunKodu, MAX(dteIslemTarihi) AS SonSiparisTarihi FROM dbo.spUrtSiparisDet GROUP BY LTRIM(RTRIM(sMModelKodu)) ) SELECT CASE WHEN LEFT(LTRIM(RTRIM(OM.UrunKodu)), 1) IN ('N','X','S','O','I','K') THEN N'BAGGI URUN TARAFINDAN URETIME VERILEN' WHEN LEFT(LTRIM(RTRIM(OM.UrunKodu)), 1) IN ('P','F','M') THEN N'FASON ICIN URETILEN' ELSE N'Tanimsiz' END AS UretimSekli, RTRIM(CONVERT(VARCHAR(32), ISNULL(OM.nOnMLNo, 0))) AS nOnMLNo, LTRIM(RTRIM(ISNULL(OM.UrunKodu, ''))) AS UrunKodu, ISNULL(OM.UrunAdi, '') AS UrunAdi, CONVERT(VARCHAR(10), OM.Tarihi, 23) AS Tarihi, CONVERT(VARCHAR(10), OM.dteKayitTarihi, 23) AS dteKayitTarihi, ISNULL(OM.sKullaniciAdi, '') AS sKullaniciAdi, ISNULL(OM.lTutarTL, 0) AS lTutarTL, ISNULL(OM.lTutarUSD, 0) AS lTutarUSD, ISNULL(OM.lTutarEURO, 0) AS lTutarEURO, CONVERT(VARCHAR(10), OM.dteGuncellemeTarihi, 23) AS dteGuncellemeTarihi, ISNULL(OM.sGuncellemeKullaniciAdi, '') AS sGuncellemeKullaniciAdi, RTRIM(CONVERT(VARCHAR(32), ISNULL(OM.nUrtReceteID, 0))) AS nUrtReceteID, ISNULL(OM.sAciklama, '') AS sAciklama, ISNULL(CONVERT(VARCHAR(10), SS.SonSiparisTarihi, 23), '') AS SonSiparisTarihi, CASE WHEN ISNULL(OM.lTutarUSD, 0) = 0 THEN N'GUNCELLEME GEREKIYOR' WHEN SS.SonSiparisTarihi IS NULL THEN N'SIPARIS YOK' WHEN SS.SonSiparisTarihi > OM.Tarihi THEN N'GUNCELLEME GEREKIYOR' ELSE N'GUNCEL' END AS MaliyetDurumu FROM SonOnMaliyet OM LEFT JOIN SonSiparis SS ON SS.UrunKodu = LTRIM(RTRIM(OM.UrunKodu)) WHERE OM.rn = 1 AND ( @p1 = '' OR RTRIM(CONVERT(VARCHAR(32), ISNULL(OM.nOnMLNo, 0))) LIKE '%' + @p1 + '%' OR LTRIM(RTRIM(OM.UrunKodu)) LIKE '%' + @p1 + '%' OR ISNULL(OM.UrunAdi, '') LIKE '%' + @p1 + '%' OR ISNULL(OM.sAciklama, '') LIKE '%' + @p1 + '%' ) ORDER BY SS.SonSiparisTarihi DESC, OM.nOnMLNo DESC OFFSET @p2 ROWS FETCH NEXT @p3 ROWS ONLY ` return uretimDB.QueryContext(ctx, sqlText, search, offset, limit) } func GetProductionHasCostHistoryByProductCode( ctx context.Context, uretimDB *sql.DB, productCode string, ) (*sql.Rows, error) { productCode = strings.TrimSpace(productCode) sqlText := ` SELECT RTRIM(CONVERT(VARCHAR(32), ISNULL(M.nOnMLNo, 0))) AS nOnMLNo, LTRIM(RTRIM(ISNULL(M.UrunKodu, ''))) AS UrunKodu, ISNULL(M.UrunAdi, '') AS UrunAdi, CONVERT(VARCHAR(16), M.Tarihi, 120) AS Tarihi, ISNULL(M.sKullaniciAdi, '') AS sKullaniciAdi, ISNULL(M.lTutarUSD, 0) AS lTutarUSD, ISNULL(M.lTutarTL, 0) AS lTutarTL, ISNULL(M.lTutarEURO, 0) AS lTutarEURO, ISNULL(M.sDovizCinsi, '') AS sDovizCinsi, ISNULL(M.lTutarDoviz, 0) AS lTutarDoviz, CONVERT(VARCHAR(16), M.dteGuncellemeTarihi, 120) AS dteGuncellemeTarihi, ISNULL(M.sGuncellemeKullaniciAdi, '') AS sGuncellemeKullaniciAdi, RTRIM(CONVERT(VARCHAR(32), ISNULL(M.nUrtReceteID, 0))) AS nUrtReceteID, ISNULL(M.sAciklama, '') AS sAciklama FROM dbo.spUrtOnMLMas M WHERE LTRIM(RTRIM(M.UrunKodu)) = @p1 ORDER BY M.Tarihi DESC, M.dteGuncellemeTarihi DESC, M.nOnMLNo DESC ` return uretimDB.QueryContext(ctx, sqlText, productCode) } func GetProductionHasCostDetailRowsByOnMLNo( ctx context.Context, uretimDB *sql.DB, nOnMLNo int, ) (*sql.Rows, error) { sqlText := ` SELECT ISNULL(NULLIF(LTRIM(RTRIM(T.sAciklama3)), ''), N'TANIMSIZ') AS sAciklama3, SUM(ISNULL(D.lTutar, 0)) OVER ( PARTITION BY ISNULL(NULLIF(LTRIM(RTRIM(T.sAciklama3)), ''), N'TANIMSIZ') ) AS GroupTotalTutar, SUM(ISNULL(D.lMiktar, 0) * ISNULL(D.lDovizFiyati, 0)) OVER ( PARTITION BY ISNULL(NULLIF(LTRIM(RTRIM(T.sAciklama3)), ''), N'TANIMSIZ') ) AS GroupTotalUSDTutar, RTRIM(CONVERT(VARCHAR(32), ISNULL(D.nOnMLNo, 0))) AS nOnMLNo, RTRIM(CONVERT(VARCHAR(32), ISNULL(D.nOnMLDetNo, 0))) AS nOnMLDetNo, RTRIM(CONVERT(VARCHAR(32), ISNULL(D.nHammaddeTuruNo, 0))) AS nHammaddeTuruNo, ISNULL(D.sKodu, '') AS sKodu, ISNULL(D.sAciklama, '') AS sAciklama, ISNULL(D.sRenk, '') AS sRenk, ISNULL(D.sBeden, '') AS sBeden, ISNULL(D.sAciklama2, '') AS sAciklama2, ISNULL(D.lMiktar, 0) AS lMiktar, ISNULL(D.lFiyat, 0) AS lFiyat, ISNULL(D.lTutar, 0) AS lTutar, ISNULL(D.sFiyatTipi, '') AS sFiyatTipi, ISNULL(D.sDovizCinsi, '') AS sDovizCinsi, ISNULL(D.lDovizKuru, 0) AS lDovizKuru, ISNULL(D.lDovizFiyati, 0) AS lDovizFiyati, D.fiyat_girilen AS fiyat_girilen, D.fiyat_doviz AS fiyat_doviz, CAST(CASE WHEN ISNULL(D.Maliyete_dahil, 0) = 1 THEN 1 ELSE 0 END AS bit) AS maliyete_dahil, D.cm_price_type_id AS cm_price_type_id, ISNULL(D.lMiktar, 0) * ISNULL(D.lDovizFiyati, 0) AS usdTutar, 0.0 AS eurTutar, 0.0 AS gbpTutar, ISNULL(D.sBirim, '') AS sBirim, ISNULL(T.sAciklama, '') AS sHammaddeTuruAdi, ISNULL(B.sAdi, '') AS sParcaAdi FROM dbo.spUrtOnMLMasDet D LEFT JOIN dbo.spUrtOnMLHammaddeTuru T ON T.nHammaddeTuruNo = D.nHammaddeTuruNo LEFT JOIN dbo.spUrtMTBolum B ON B.nUrtMTBolumID = D.nUrtMTBolumID WHERE D.nOnMLNo = @p1 ORDER BY GroupTotalTutar DESC, sAciklama3 ASC, ISNULL(D.lTutar, 0) DESC, D.nOnMLDetNo ASC ` return uretimDB.QueryContext(ctx, sqlText, nOnMLNo) } func GetProductionHasCostDetailHeaderByOnMLNo( ctx context.Context, uretimDB *sql.DB, nOnMLNo int, ) (*sql.Row, error) { sqlText := ` SELECT TOP 1 ISNULL(UF.UretimiYapanFirma, '') AS UretimiYapanFirma, ISNULL(UF.SonIsEmriVeren, '') AS SonIsEmriVeren, RTRIM(CONVERT(VARCHAR(32), ISNULL(M.nOnMLNo, 0))) AS nOnMLNo, LTRIM(RTRIM(ISNULL(M.UrunKodu, ''))) AS UrunKodu, ISNULL(M.UrunAdi, '') AS UrunAdi, RTRIM(CONVERT(VARCHAR(32), ISNULL(M.uretim_sekli_id, 0))) AS uretim_sekli_id, ISNULL(US.aciklama, '') AS uretim_sekli, CONVERT(VARCHAR(16), M.dteKayitTarihi, 120) AS dteKayitTarihi, ISNULL(M.sKullaniciAdi, '') AS sKullaniciAdi, ISNULL(M.lTutarTL, 0) AS lTutarTL, ISNULL(M.lTutarUSD, 0) AS lTutarUSD, ISNULL(M.lTutarEURO, 0) AS lTutarEURO, 0.0 AS lTutarGBP, ISNULL(M.sDovizCinsi, '') AS sDovizCinsi, ISNULL(M.lTutarDoviz, 0) AS lTutarDoviz, CONVERT(VARCHAR(16), M.dteGuncellemeTarihi, 120) AS dteGuncellemeTarihi, ISNULL(M.sGuncellemeKullaniciAdi, '') AS sGuncellemeKullaniciAdi, RTRIM(CONVERT(VARCHAR(32), ISNULL(M.nUrtReceteID, 0))) AS nUrtReceteID FROM dbo.spUrtOnMLMas M LEFT JOIN dbo.mk_uretim_sekli US ON US.id = M.uretim_sekli_id OUTER APPLY ( SELECT TOP 1 ISNULL(F.sAciklama, '') AS UretimiYapanFirma, ISNULL(SM.sVeren, '') AS SonIsEmriVeren FROM dbo.spUrtSiparisDet SD INNER JOIN dbo.spUrtSiparis SM ON SM.nUrtSiparisID = SD.nUrtSiparisID LEFT JOIN dbo.tbFirma F ON F.nFirmaID = SM.nFirmaID WHERE LTRIM(RTRIM(SD.sMModelKodu)) = LTRIM(RTRIM(M.UrunKodu)) ORDER BY SD.dteIslemTarihi DESC, SD.nUrtSiparisID DESC ) UF WHERE M.nOnMLNo = @p1 ORDER BY M.nOnMLNo DESC ` return uretimDB.QueryRowContext(ctx, sqlText, nOnMLNo), nil } func GetProductionNoCostDetailHeaderByRecipeCode( ctx context.Context, uretimDB *sql.DB, recipeCode string, productCode string, ) (*sql.Row, error) { recipeCode = strings.TrimSpace(recipeCode) productCode = strings.TrimSpace(productCode) utils.SlogFromContext(ctx).With( "query", "production-product-costing.no-cost-detail-header", "recete_kodu", recipeCode, "urun_kodu", productCode, ).Info("query dispatch") sqlText := ` WITH RecipeMatch AS ( SELECT TOP 1 R.nUrtReceteID, LTRIM(RTRIM(ISNULL(R.sMModelKodu, ''))) AS UrunKodu, ISNULL(R.sAdi, '') AS UrunAdi, CONVERT(VARCHAR(16), R.dteIslemTarihi, 120) AS dteKayitTarihi, ISNULL(R.sKullaniciAdi, '') AS sKullaniciAdi, ISNULL(R.sKullaniciAdiGunc, '') AS sGuncellemeKullaniciAdi, CASE WHEN LEFT(LTRIM(RTRIM(R.sMModelKodu)), 1) IN ('N','X','S','O','I','K') THEN N'BAGGI URUN TARAFINDAN URETIME VERILEN' WHEN LEFT(LTRIM(RTRIM(R.sMModelKodu)), 1) IN ('P','F','M') THEN N'FASON ICIN URETILEN' ELSE N'Tanimsiz' END AS UretimSekli FROM dbo.spUrtRecete R WHERE LTRIM(RTRIM(ISNULL(R.sKodu, ''))) = @p1 AND (@p2 = '' OR LTRIM(RTRIM(ISNULL(R.sMModelKodu, ''))) = @p2) ORDER BY R.dteIslemTarihi DESC, R.nUrtReceteID DESC ) SELECT TOP 1 ISNULL(SonIsEmri.FirmaAdi, '') AS UretimiYapanFirma, ISNULL(SonIsEmri.SonIsEmriVeren, '') AS SonIsEmriVeren, '' AS nOnMLNo, RM.UrunKodu, RM.UrunAdi, '' AS UretimSekliID, RM.UretimSekli, ISNULL(SonIsEmri.dteIslemTarihi, RM.dteKayitTarihi) AS dteKayitTarihi, RM.sKullaniciAdi, 0.0 AS lTutarTL, 0.0 AS lTutarUSD, 0.0 AS lTutarEURO, 0.0 AS lTutarGBP, 'USD' AS sDovizCinsi, 0.0 AS lTutarDoviz, '' AS dteGuncellemeTarihi, RM.sGuncellemeKullaniciAdi, RTRIM(CONVERT(VARCHAR(32), ISNULL(RM.nUrtReceteID, 0))) AS nUrtReceteID FROM RecipeMatch RM OUTER APPLY ( SELECT TOP 1 ISNULL(F.sAciklama, '') AS FirmaAdi, ISNULL(SM.sVeren, '') AS SonIsEmriVeren, CONVERT(VARCHAR(16), SD.dteIslemTarihi, 120) AS dteIslemTarihi FROM dbo.spUrtSiparisDet SD INNER JOIN dbo.spUrtSiparis SM ON SM.nUrtSiparisID = SD.nUrtSiparisID LEFT JOIN dbo.tbFirma F ON F.nFirmaID = SM.nFirmaID WHERE SD.nUrtReceteID = RM.nUrtReceteID ORDER BY SD.dteIslemTarihi DESC, SD.nUrtSiparisID DESC ) SonIsEmri ` return uretimDB.QueryRowContext(ctx, sqlText, recipeCode, productCode), nil } func GetProductionNoCostDetailRowsByRecipeCode( ctx context.Context, uretimDB *sql.DB, recipeCode string, productCode string, ) (*sql.Rows, error) { recipeCode = strings.TrimSpace(recipeCode) productCode = strings.TrimSpace(productCode) logger := utils.SlogFromContext(ctx).With( "query", "production-product-costing.no-cost-detail-rows", "recete_kodu", recipeCode, "urun_kodu", productCode, ) logger.Info("query dispatch") sqlText := ` WITH RecipeMatch AS ( SELECT TOP 1 R.nUrtReceteID FROM dbo.spUrtRecete R WHERE LTRIM(RTRIM(ISNULL(R.sKodu, ''))) = @p1 AND (@p2 = '' OR LTRIM(RTRIM(ISNULL(R.sMModelKodu, ''))) = @p2) ORDER BY R.dteIslemTarihi DESC, R.nUrtReceteID DESC ), HammaddeTekil AS ( SELECT ISNULL(NULLIF(LTRIM(RTRIM(HT.sAciklama3)), ''), ISNULL(NULLIF(LTRIM(RTRIM(HT.sAciklama)), ''), N'TANIMSIZ')) AS sAciklama3, ISNULL(HT.nHammaddeTuruNo, 0) AS nHammaddeTuruNoSort, RTRIM(CONVERT(VARCHAR(32), ISNULL(HT.nHammaddeTuruNo, 0))) AS nHammaddeTuruNo, -- Match URETIM's sp_pUrtOnMaliyetRecetedenKop behavior: use model code + color code instead of variant stock code. ISNULL(S.sModel, ISNULL(S.sKodu, '')) AS sKodu, ISNULL(S.sAciklama, '') AS sAciklama, ISNULL(S.sRenk, '') AS sRenk, ISNULL(HT.sAciklama, '') AS sHammaddeTuruAdi, ISNULL(S.sBirimCinsi1, '') AS sBirim, ISNULL(RMik.lHMiktar, 0) AS lMiktar, ROW_NUMBER() OVER ( PARTITION BY HT.nHammaddeTuruNo ORDER BY ISNULL(S.sModel, ISNULL(S.sKodu, '')) ) AS rn, ROW_NUMBER() OVER ( ORDER BY HT.nHammaddeTuruNo, ISNULL(S.sModel, ISNULL(S.sKodu, '')) ) AS rowNo FROM RecipeMatch R INNER JOIN dbo.spUrtRecMBolumMik RMik ON RMik.nUrtReceteID = R.nUrtReceteID LEFT JOIN dbo.tbStok S ON S.nStokID = RMik.nHStokID OUTER APPLY ( SELECT TOP 1 H.nHammaddeTuruNo, H.sAciklama, H.sAciklama3 FROM dbo.spUrtOnMLHammaddeTuru H WHERE H.nUrtMBolumID = RMik.nUrtMBolumID ORDER BY CASE WHEN H.nUrtMTBolumID = RMik.nUrtMTBolumID THEN 0 ELSE 1 END, H.nHammaddeTuruNo ) HT WHERE HT.nHammaddeTuruNo IS NOT NULL ) SELECT HT.sAciklama3, 0.0 AS GroupTotalTutar, 0.0 AS GroupTotalUSDTutar, '' AS nOnMLNo, RTRIM(CONVERT(VARCHAR(32), ISNULL(HT.rowNo, 0))) AS nOnMLDetNo, HT.nHammaddeTuruNo, HT.sKodu, HT.sAciklama, HT.sRenk AS sRenk, '' AS sBeden, '' AS sAciklama2, HT.lMiktar, 0.0 AS lFiyat, 0.0 AS lTutar, '' AS sFiyatTipi, 'USD' AS sDovizCinsi, 0.0 AS lDovizKuru, 0.0 AS lDovizFiyati, NULL AS fiyat_girilen, '' AS fiyat_doviz, CAST(1 AS bit) AS maliyete_dahil, NULL AS cm_price_type_id, 0.0 AS usdTutar, 0.0 AS eurTutar, 0.0 AS gbpTutar, HT.sBirim, HT.sHammaddeTuruAdi, HT.sHammaddeTuruAdi AS sParcaAdi FROM HammaddeTekil HT WHERE HT.rn = 1 ORDER BY HT.nHammaddeTuruNoSort, HT.sKodu ` rows, err := uretimDB.QueryContext(ctx, sqlText, recipeCode, productCode) if err != nil { logger.Error("query error", "err", err) return nil, err } return rows, nil } func GetProductionTypes(ctx context.Context, uretimDB *sql.DB) (*sql.Rows, error) { sqlText := `SELECT id, aciklama FROM dbo.mk_uretim_sekli ORDER BY id` return uretimDB.QueryContext(ctx, sqlText) } func GetProductionHasCostDetailHammaddeTypeOptions( ctx context.Context, uretimDB *sql.DB, search string, limit int, ) (*sql.Rows, error) { search = strings.TrimSpace(search) if limit <= 0 { limit = 50 } searchLike := "%" + search + "%" sqlText := ` SELECT TOP (@p2) RTRIM(CONVERT(VARCHAR(32), ISNULL(T.nHammaddeTuruNo, 0))) AS nHammaddeTuruNo, ISNULL(T.sAciklama, '') AS sHammaddeTuruAdi, ISNULL(NULLIF(LTRIM(RTRIM(T.sAciklama3)), ''), N'TANIMSIZ') AS sAciklama3 FROM dbo.spUrtOnMLHammaddeTuru T WHERE ISNULL(T.bAktif, 0) = 1 AND ( @p1 = '' OR RTRIM(CONVERT(VARCHAR(32), ISNULL(T.nHammaddeTuruNo, 0))) LIKE @p3 OR ISNULL(T.sAciklama, '') LIKE @p3 OR ISNULL(T.sAciklama3, '') LIKE @p3 ) ORDER BY CASE WHEN @p1 <> '' AND RTRIM(CONVERT(VARCHAR(32), ISNULL(T.nHammaddeTuruNo, 0))) = @p1 THEN 0 WHEN @p1 <> '' AND ISNULL(T.sAciklama, '') = @p1 THEN 1 ELSE 2 END, T.nHammaddeTuruNo ` return uretimDB.QueryContext(ctx, sqlText, search, limit, searchLike) } func buildSQLServerFullTextPrefixQuery(search string) string { terms := strings.Fields(strings.TrimSpace(search)) parts := make([]string, 0, len(terms)) for _, term := range terms { cleaned := strings.Map(func(r rune) rune { if unicode.IsLetter(r) || unicode.IsDigit(r) { return r } return -1 }, term) if len([]rune(cleaned)) < 2 { continue } parts = append(parts, fmt.Sprintf("\"%s*\"", cleaned)) } return strings.Join(parts, " AND ") } func hasProductionHasCostDetailItemFullTextIndex( ctx context.Context, uretimDB *sql.DB, ) bool { var exists int err := uretimDB.QueryRowContext(ctx, ` SELECT CASE WHEN EXISTS ( SELECT 1 FROM sys.fulltext_indexes fi INNER JOIN sys.fulltext_index_columns fic ON fic.object_id = fi.object_id INNER JOIN sys.columns c ON c.object_id = fic.object_id AND c.column_id = fic.column_id WHERE fi.object_id = OBJECT_ID('dbo.tbStok') AND c.name = 'sAciklama' ) THEN 1 ELSE 0 END`).Scan(&exists) return err == nil && exists == 1 } func GetProductionHasCostDetailItemOptions( ctx context.Context, uretimDB *sql.DB, search string, limit int, ) (*sql.Rows, error) { search = strings.TrimSpace(search) if limit <= 0 { limit = 50 } if search == "" { return uretimDB.QueryContext(ctx, ` SELECT TOP (0) RTRIM(CONVERT(VARCHAR(32), ISNULL(S.nStokID, 0))) AS nStokID, LTRIM(RTRIM(CONVERT(NVARCHAR(255), ISNULL(S.sKodu, '')))) AS sKodu, LTRIM(RTRIM(CONVERT(NVARCHAR(255), ISNULL(S.sAciklama, '')))) AS sAciklama, LTRIM(RTRIM(CONVERT(NVARCHAR(255), ISNULL(S.sModel, '')))) AS sModel, LTRIM(RTRIM(CONVERT(NVARCHAR(64), ISNULL(S.sBirimCinsi1, '')))) AS sBirim FROM dbo.tbStok S`) } searchExact := search searchPrefix := search + "%" searchLike := "%" + search + "%" searchLen := len([]rune(search)) numericStokID, numericErr := strconv.Atoi(search) hasNumericStokID := numericErr == nil fullTextSearch := buildSQLServerFullTextPrefixQuery(search) useFullText := searchLen >= 3 && fullTextSearch != "" && hasProductionHasCostDetailItemFullTextIndex(ctx, uretimDB) baseSelect := ` SELECT TOP (@p2) RTRIM(CONVERT(VARCHAR(32), ISNULL(S.nStokID, 0))) AS nStokID, LTRIM(RTRIM(CONVERT(NVARCHAR(255), ISNULL(S.sKodu, '')))) AS sKodu, LTRIM(RTRIM(CONVERT(NVARCHAR(255), ISNULL(S.sAciklama, '')))) AS sAciklama, LTRIM(RTRIM(CONVERT(NVARCHAR(255), ISNULL(S.sModel, '')))) AS sModel, LTRIM(RTRIM(CONVERT(NVARCHAR(64), ISNULL(S.sBirimCinsi1, '')))) AS sBirim FROM dbo.tbStok S WHERE (ISNULL(S.IsBlocked, 0) = 0) AND S.sModel LIKE '_.%%' AND ( (@p5 = 1 AND S.nStokID = @p6) OR S.sKodu = @p1 OR S.sKodu LIKE @p3 OR %s ) ORDER BY CASE WHEN S.sKodu = @p1 THEN 0 WHEN (@p5 = 1 AND S.nStokID = @p6) THEN 1 WHEN S.sKodu LIKE @p3 THEN 2 ELSE 3 END, S.sKodu OPTION (RECOMPILE) ` if useFullText { sqlText := fmt.Sprintf(baseSelect, `CONTAINS(S.sAciklama, @p4)`) return uretimDB.QueryContext(ctx, sqlText, searchExact, limit, searchPrefix, fullTextSearch, hasNumericStokID, numericStokID) } sqlText := fmt.Sprintf(baseSelect, `(@p4 >= 3 AND S.sAciklama LIKE @p7)`) return uretimDB.QueryContext(ctx, sqlText, searchExact, limit, searchPrefix, searchLen, hasNumericStokID, numericStokID, searchLike) } func GetProductionHasCostDetailColorOptions( ctx context.Context, mssqlDB *sql.DB, modelCode string, search string, limit int, ) (*sql.Rows, error) { modelCode = strings.TrimSpace(modelCode) search = strings.TrimSpace(search) if limit <= 0 { limit = 50 } searchLike := "%" + search + "%" sqlText := ` WITH ColorSource AS ( SELECT DISTINCT LTRIM(RTRIM(CONVERT(NVARCHAR(64), ISNULL(T.sRenk, '')))) AS ColorCode FROM dbo.tbStok T WHERE ISNULL(T.IsBlocked, 0) = 0 AND LTRIM(RTRIM(CONVERT(NVARCHAR(255), ISNULL(T.sModel, '')))) = @p1 AND LTRIM(RTRIM(CONVERT(NVARCHAR(64), ISNULL(T.sRenk, '')))) <> '' ) SELECT TOP (@p2) LTRIM(RTRIM(ISNULL(S.ColorCode, ''))) AS colorCode, ISNULL(C.ColorDescription, '') AS colorDescription FROM ( SELECT ColorCode FROM ColorSource ) S OUTER APPLY ( SELECT TOP 1 ColorDescription FROM dbo.cdColorDesc CD WHERE CD.LangCode = 'TR' AND LTRIM(RTRIM(ISNULL(CD.ColorCode, ''))) = S.ColorCode ) C WHERE @p1 <> '' AND ( @p3 = '' OR LTRIM(RTRIM(ISNULL(S.ColorCode, ''))) LIKE @p4 OR ISNULL(C.ColorDescription, '') LIKE @p4 ) ORDER BY CASE WHEN @p3 <> '' AND LTRIM(RTRIM(ISNULL(S.ColorCode, ''))) = @p3 THEN 0 WHEN @p3 <> '' AND ISNULL(C.ColorDescription, '') = @p3 THEN 1 ELSE 2 END, LTRIM(RTRIM(ISNULL(S.ColorCode, ''))) ` return mssqlDB.QueryContext(ctx, sqlText, modelCode, limit, search, searchLike) } func GetProductionHasCostDetailExchangeRatesByDate( ctx context.Context, mssqlDB *sql.DB, costDate string, ) (*sql.Row, error) { costDate = strings.TrimSpace(costDate) sqlText := ` DECLARE @targetDate date = ISNULL(CONVERT(date, NULLIF(@p1, ''), 23), CONVERT(date, GETDATE())) SELECT CONVERT(VARCHAR(10), @targetDate, 23) AS rateDate, ISNULL(( SELECT TOP 1 Rate FROM dbo.AllExchangeRates WHERE CurrencyCode = 'USD' AND RelationCurrencyCode = 'TRY' AND ExchangeTypeCode = 6 AND Rate > 0 AND CONVERT(date, [Date]) <= @targetDate ORDER BY CASE WHEN CONVERT(date, [Date]) = @targetDate THEN 0 ELSE 1 END, [Date] DESC ), 0) AS usdRate, ISNULL(( SELECT TOP 1 Rate FROM dbo.AllExchangeRates WHERE CurrencyCode = 'EUR' AND RelationCurrencyCode = 'TRY' AND ExchangeTypeCode = 6 AND Rate > 0 AND CONVERT(date, [Date]) <= @targetDate ORDER BY CASE WHEN CONVERT(date, [Date]) = @targetDate THEN 0 ELSE 1 END, [Date] DESC ), 0) AS eurRate, ISNULL(( SELECT TOP 1 Rate FROM dbo.AllExchangeRates WHERE CurrencyCode = 'GBP' AND RelationCurrencyCode = 'TRY' AND ExchangeTypeCode = 6 AND Rate > 0 AND CONVERT(date, [Date]) <= @targetDate ORDER BY CASE WHEN CONVERT(date, [Date]) = @targetDate THEN 0 ELSE 1 END, [Date] DESC ), 0) AS gbpRate ` return mssqlDB.QueryRowContext(ctx, sqlText, costDate), nil } func GetProductionHasCostLatestPurchasePriceForItem( ctx context.Context, mssqlDB *sql.DB, sKodu string, colorCode string, itemDim1Code string, costDate string, ) (*sql.Row, error) { sKodu = strings.TrimSpace(sKodu) colorCode = strings.TrimSpace(colorCode) itemDim1Code = strings.TrimSpace(itemDim1Code) costDate = strings.TrimSpace(costDate) sqlText := ` WITH BASE AS ( SELECT A.InvoiceDate, A.InvoiceNumber, A.ProcessCode, A.CurrAccTypeCode, A.CurrAccCode, A.ItemTypeCode, A.ItemCode, A.ColorCode, A.ItemDim1Code, A.Qty1, A.Doc_Price, A.Doc_Amount, A.Doc_CurrencyCode FROM AllInvoicesWithAttributes A WHERE A.ProcessCode IN ('BP') AND A.ATAtt01 IN (1, 2) AND A.CompanyCode IN (1, 2, 5) AND A.IsCompleted = 1 AND YEAR(A.InvoiceDate) >= 2022 AND LTRIM(RTRIM(A.ItemCode)) = @p1 AND (NULLIF(@p2, '') IS NULL OR CONVERT(date, A.InvoiceDate) < CONVERT(date, NULLIF(@p2, ''), 23)) ) SELECT TOP 1 'MAN' AS priceType, CONVERT(VARCHAR(16), B.InvoiceDate, 120) AS Tarih, ISNULL(B.InvoiceNumber, '') AS FaturaKodu, LTRIM(RTRIM(ISNULL(B.ItemCode, ''))) AS MasrafKodu, ISNULL(ID.ItemDescription, '') AS MasrafDetay, ISNULL(B.ColorCode, '') AS ColorCode, ISNULL(COL.ColorDescription, '') AS ColorDescription, ISNULL(B.ItemDim1Code, '') AS ItemDim1Code, ISNULL(DIM1.ItemDim1Description, '') AS ItemDim1Description, ISNULL(B.Doc_Price, 0) AS EvrakFiyat, ISNULL(B.Doc_CurrencyCode, '') AS EvrakDoviz FROM BASE B LEFT JOIN cdItem CI ON CI.ItemTypeCode = B.ItemTypeCode AND CI.ItemCode = B.ItemCode OUTER APPLY ( SELECT TOP 1 ItemDescription FROM cdItemDesc WHERE ItemTypeCode = B.ItemTypeCode AND ItemCode = B.ItemCode AND LangCode = 'TR' ) ID OUTER APPLY ( SELECT TOP 1 ItemDim1Description FROM cdItemDim1Desc WHERE ItemDim1Code = B.ItemDim1Code AND LangCode = 'TR' ) DIM1 OUTER APPLY ( SELECT TOP 1 ColorDescription FROM cdColorDesc WHERE ColorCode = B.ColorCode AND LangCode = 'TR' ) COL ORDER BY CASE WHEN @p3 <> '' AND LTRIM(RTRIM(ISNULL(B.ColorCode, ''))) = @p3 THEN 0 WHEN @p3 = '' THEN 0 ELSE 1 END, CASE WHEN @p4 <> '' AND LTRIM(RTRIM(ISNULL(B.ItemDim1Code, ''))) = @p4 THEN 0 WHEN @p4 = '' THEN 0 ELSE 1 END, B.InvoiceDate DESC, B.InvoiceNumber DESC ` return mssqlDB.QueryRowContext(ctx, sqlText, sKodu, costDate, colorCode, itemDim1Code), nil } func GetProductionHasCostPurchaseHistoryByExpenseCode( ctx context.Context, mssqlDB *sql.DB, sKodu string, costDate string, limit int, ) (*sql.Rows, error) { sKodu = strings.TrimSpace(sKodu) costDate = strings.TrimSpace(costDate) if limit <= 0 { limit = 250 } sqlText := ` WITH BASE AS ( SELECT A.InvoiceDate, A.InvoiceNumber, A.ProcessCode, A.CurrAccTypeCode, A.CurrAccCode, A.ItemTypeCode, A.ItemCode, A.ColorCode, A.ItemDim1Code, A.Qty1, A.Doc_Price, A.Doc_Amount, A.Doc_CurrencyCode FROM AllInvoicesWithAttributes A WHERE A.ProcessCode IN ('BP') AND A.ATAtt01 IN (1, 2) AND A.CompanyCode IN (1, 2, 5) AND A.IsCompleted = 1 AND YEAR(A.InvoiceDate) >= 2022 AND LTRIM(RTRIM(A.ItemCode)) = @p1 AND (ISNULL(A.Doc_Price, 0) > 0 OR ISNULL(A.Doc_Amount, 0) > 0) AND (NULLIF(@p2, '') IS NULL OR CONVERT(date, A.InvoiceDate) < CONVERT(date, NULLIF(@p2, ''), 23)) ) SELECT TOP (@p3) 'purchase' AS sourceType, 'MAN' AS priceType, CONVERT(VARCHAR(16), B.InvoiceDate, 120) AS Tarih, ISNULL(B.InvoiceNumber, '') AS FaturaKodu, ISNULL(B.CurrAccCode, '') AS FirmaKodu, ISNULL(CAD.CurrAccDescription, '') AS FirmaAciklama, LTRIM(RTRIM(ISNULL(B.ItemCode, ''))) AS MasrafKodu, ISNULL(ID.ItemDescription, '') AS MasrafDetay, ISNULL(B.ColorCode, '') AS ColorCode, ISNULL(COL.ColorDescription, '') AS ColorDescription, ISNULL(B.ItemDim1Code, '') AS ItemDim1Code, ISNULL(DIM1.ItemDim1Description, '') AS ItemDim1Description, ISNULL(B.Qty1, 0) AS Miktar, CASE WHEN B.ProcessCode = 'EP' THEN '' ELSE ISNULL(CI.UnitOfMeasureCode1, '') END AS BIRIM, ISNULL(B.Doc_Price, 0) AS EvrakFiyat, ISNULL(B.Doc_Amount, 0) AS EvrakTutar, ISNULL(B.Doc_CurrencyCode, '') AS EvrakDoviz FROM BASE B LEFT JOIN cdItem CI ON CI.ItemTypeCode = B.ItemTypeCode AND CI.ItemCode = B.ItemCode OUTER APPLY ( SELECT TOP 1 ItemDescription FROM cdItemDesc WHERE ItemTypeCode = B.ItemTypeCode AND ItemCode = B.ItemCode AND LangCode = 'TR' ) ID OUTER APPLY ( SELECT TOP 1 ItemDim1Description FROM cdItemDim1Desc WHERE ItemDim1Code = B.ItemDim1Code AND LangCode = 'TR' ) DIM1 OUTER APPLY ( SELECT TOP 1 ColorDescription FROM cdColorDesc WHERE ColorCode = B.ColorCode AND LangCode = 'TR' ) COL OUTER APPLY ( SELECT TOP 1 CurrAccDescription FROM cdCurrAccDesc WHERE CurrAccTypeCode = B.CurrAccTypeCode AND CurrAccCode = B.CurrAccCode AND LangCode = 'TR' ) CAD ORDER BY B.InvoiceDate DESC, B.InvoiceNumber DESC ` return mssqlDB.QueryContext(ctx, sqlText, sKodu, costDate, limit) } func GetProductionHasCostRecipeHistoryByExpenseCode( ctx context.Context, uretimDB *sql.DB, currentOnMLNo int, sKodu string, colorCode string, costDate string, limit int, ) (*sql.Rows, error) { sKodu = strings.TrimSpace(sKodu) colorCode = strings.TrimSpace(colorCode) costDate = strings.TrimSpace(costDate) if limit <= 0 { limit = 250 } sqlText := ` SELECT TOP (@p5) 'recipe' AS sourceType, ISNULL(NULLIF(LTRIM(RTRIM(D.sFiyatTipi)), ''), 'SAF') AS priceType, CONVERT(VARCHAR(16), COALESCE(D.dteIslemTarihiDeg, D.dteIslemTarihi, M.Tarihi, M.dteKayitTarihi), 120) AS dteIslemTarihi, RTRIM(CONVERT(VARCHAR(32), ISNULL(D.nOnMLNo, 0))) AS nOnMLNo, ISNULL(UF.FirmaKodu, '') AS FirmaKodu, ISNULL(UF.FirmaAciklama, '') AS FirmaAciklama, ISNULL(D.sKodu, '') AS sKodu, ISNULL(D.sAciklama, '') AS sAciklama, ISNULL(D.sRenk, '') AS sRenk, ISNULL(D.lMiktar, 0) AS lMiktar, ISNULL(D.sBirim, '') AS sBirim, CASE WHEN ISNULL(D.fiyat_girilen, 0) > 0 THEN ISNULL(D.fiyat_girilen, 0) ELSE ISNULL(D.lDovizFiyati, 0) END AS lDovizFiyati, CASE WHEN ISNULL(D.lDovizTutari, 0) > 0 THEN ISNULL(D.lDovizTutari, 0) WHEN ISNULL(D.fiyat_girilen, 0) > 0 THEN ISNULL(D.fiyat_girilen, 0) * ISNULL(D.lMiktar, 0) ELSE ISNULL(D.lDovizFiyati, 0) * ISNULL(D.lMiktar, 0) END AS lDovizTutari, CASE WHEN LTRIM(RTRIM(ISNULL(D.fiyat_doviz, ''))) <> '' THEN LTRIM(RTRIM(D.fiyat_doviz)) WHEN LTRIM(RTRIM(ISNULL(D.sDovizCinsi, ''))) <> '' THEN LTRIM(RTRIM(D.sDovizCinsi)) WHEN LTRIM(RTRIM(ISNULL(M.sDovizCinsi, ''))) <> '' THEN LTRIM(RTRIM(M.sDovizCinsi)) ELSE 'USD' END AS USD, ISNULL(NULLIF(LTRIM(RTRIM(T.sAciklama3)), ''), N'DUMMY') AS DUMMY FROM dbo.spUrtOnMLMasDet D INNER JOIN dbo.spUrtOnMLMas M ON M.nOnMLNo = D.nOnMLNo LEFT JOIN dbo.spUrtOnMLHammaddeTuru T ON T.nHammaddeTuruNo = D.nHammaddeTuruNo OUTER APPLY ( SELECT TOP 1 ISNULL(F.sKodu, '') AS FirmaKodu, ISNULL(F.sAciklama, '') AS FirmaAciklama FROM dbo.spUrtSiparisDet SD INNER JOIN dbo.spUrtSiparis SM ON SM.nUrtSiparisID = SD.nUrtSiparisID LEFT JOIN dbo.tbFirma F ON F.nFirmaID = SM.nFirmaID WHERE ( (ISNULL(M.nUrtReceteID, 0) > 0 AND SD.nUrtReceteID = M.nUrtReceteID) OR (ISNULL(M.nUrtReceteID, 0) <= 0 AND LTRIM(RTRIM(ISNULL(SD.sMModelKodu, ''))) = LTRIM(RTRIM(ISNULL(M.UrunKodu, '')))) ) AND SD.dteIslemTarihi <= COALESCE(D.dteIslemTarihiDeg, D.dteIslemTarihi, M.Tarihi, M.dteKayitTarihi) ORDER BY SD.dteIslemTarihi DESC, SD.nUrtSiparisID DESC ) UF WHERE LTRIM(RTRIM(D.sKodu)) = @p1 AND (@p2 <= 0 OR D.nOnMLNo <> @p2) AND ( ISNULL(D.fiyat_girilen, 0) > 0 OR ISNULL(D.lDovizFiyati, 0) > 0 OR ISNULL(D.lDovizTutari, 0) > 0 ) AND ( NULLIF(@p3, '') IS NULL OR CONVERT(date, COALESCE(D.dteIslemTarihiDeg, D.dteIslemTarihi, M.Tarihi, M.dteKayitTarihi)) < CONVERT(date, NULLIF(@p3, ''), 23) ) ORDER BY CASE WHEN @p4 <> '' AND LTRIM(RTRIM(ISNULL(D.sRenk, ''))) = @p4 THEN 0 WHEN @p4 = '' THEN 0 ELSE 1 END, COALESCE(D.dteIslemTarihiDeg, D.dteIslemTarihi, M.Tarihi, M.dteKayitTarihi) DESC, D.nOnMLNo DESC, D.nOnMLDetNo DESC ` return uretimDB.QueryContext(ctx, sqlText, sKodu, currentOnMLNo, costDate, colorCode, limit) } func BuildProductionHasCostSimilarCodePrefix(sKodu string) string { normalizedCode := strings.ToUpper(strings.TrimSpace(sKodu)) if normalizedCode == "" { return "" } runes := []rune(normalizedCode) if len(runes) <= 4 { return normalizedCode } if len(runes) >= 5 && len(runes) > 1 && runes[1] == '.' { return string(runes[:5]) } return string(runes[:4]) } func GetProductionHasCostPurchaseHistoryByCodePrefix( ctx context.Context, mssqlDB *sql.DB, sKoduPrefix string, costDate string, limit int, ) (*sql.Rows, error) { sKoduPrefix = strings.TrimSpace(sKoduPrefix) costDate = strings.TrimSpace(costDate) if limit <= 0 { limit = 250 } sqlText := ` WITH BASE AS ( SELECT A.InvoiceDate, A.InvoiceNumber, A.ProcessCode, A.CurrAccTypeCode, A.CurrAccCode, A.ItemTypeCode, A.ItemCode, A.ColorCode, A.ItemDim1Code, A.Qty1, A.Doc_Price, A.Doc_Amount, A.Doc_CurrencyCode FROM AllInvoicesWithAttributes A WHERE A.ProcessCode IN ('BP') AND A.ATAtt01 IN (1, 2) AND A.CompanyCode IN (1, 2, 5) AND A.IsCompleted = 1 AND YEAR(A.InvoiceDate) >= 2022 AND NULLIF(@p1, '') IS NOT NULL AND LTRIM(RTRIM(A.ItemCode)) LIKE @p1 + '%' AND (ISNULL(A.Doc_Price, 0) > 0 OR ISNULL(A.Doc_Amount, 0) > 0) AND (NULLIF(@p2, '') IS NULL OR CONVERT(date, A.InvoiceDate) < CONVERT(date, NULLIF(@p2, ''), 23)) ) SELECT TOP (@p3) 'purchase' AS sourceType, 'BNZ' AS priceType, CONVERT(VARCHAR(16), B.InvoiceDate, 120) AS Tarih, ISNULL(B.InvoiceNumber, '') AS FaturaKodu, ISNULL(B.CurrAccCode, '') AS FirmaKodu, ISNULL(CAD.CurrAccDescription, '') AS FirmaAciklama, LTRIM(RTRIM(ISNULL(B.ItemCode, ''))) AS MasrafKodu, ISNULL(ID.ItemDescription, '') AS MasrafDetay, ISNULL(B.ColorCode, '') AS ColorCode, ISNULL(COL.ColorDescription, '') AS ColorDescription, ISNULL(B.ItemDim1Code, '') AS ItemDim1Code, ISNULL(DIM1.ItemDim1Description, '') AS ItemDim1Description, ISNULL(B.Qty1, 0) AS Miktar, CASE WHEN B.ProcessCode = 'EP' THEN '' ELSE ISNULL(CI.UnitOfMeasureCode1, '') END AS BIRIM, ISNULL(B.Doc_Price, 0) AS EvrakFiyat, ISNULL(B.Doc_Amount, 0) AS EvrakTutar, ISNULL(B.Doc_CurrencyCode, '') AS EvrakDoviz FROM BASE B LEFT JOIN cdItem CI ON CI.ItemTypeCode = B.ItemTypeCode AND CI.ItemCode = B.ItemCode OUTER APPLY ( SELECT TOP 1 ItemDescription FROM cdItemDesc WHERE ItemTypeCode = B.ItemTypeCode AND ItemCode = B.ItemCode AND LangCode = 'TR' ) ID OUTER APPLY ( SELECT TOP 1 ItemDim1Description FROM cdItemDim1Desc WHERE ItemDim1Code = B.ItemDim1Code AND LangCode = 'TR' ) DIM1 OUTER APPLY ( SELECT TOP 1 ColorDescription FROM cdColorDesc WHERE ColorCode = B.ColorCode AND LangCode = 'TR' ) COL OUTER APPLY ( SELECT TOP 1 CurrAccDescription FROM cdCurrAccDesc WHERE CurrAccTypeCode = B.CurrAccTypeCode AND CurrAccCode = B.CurrAccCode AND LangCode = 'TR' ) CAD ORDER BY B.InvoiceDate DESC, B.InvoiceNumber DESC ` return mssqlDB.QueryContext(ctx, sqlText, sKoduPrefix, costDate, limit) } func GetProductionHasCostOnMLHistoryByCodePrefix( ctx context.Context, uretimDB *sql.DB, sKoduPrefix string, costDate string, limit int, ) (*sql.Rows, error) { sKoduPrefix = strings.TrimSpace(sKoduPrefix) costDate = strings.TrimSpace(costDate) if limit <= 0 { limit = 250 } sqlText := ` SELECT TOP (@p3) 'recipe' AS sourceType, 'BNZ' AS priceType, CONVERT(VARCHAR(16), COALESCE(D.dteIslemTarihiDeg, D.dteIslemTarihi, M.Tarihi, M.dteKayitTarihi), 120) AS dteIslemTarihi, RTRIM(CONVERT(VARCHAR(32), ISNULL(D.nOnMLNo, 0))) AS nOnMLNo, ISNULL(UF.FirmaKodu, '') AS FirmaKodu, ISNULL(UF.FirmaAciklama, '') AS FirmaAciklama, ISNULL(D.sKodu, '') AS sKodu, ISNULL(D.sAciklama, '') AS sAciklama, ISNULL(D.sRenk, '') AS sRenk, ISNULL(D.lMiktar, 0) AS lMiktar, ISNULL(D.sBirim, '') AS sBirim, CASE WHEN ISNULL(D.fiyat_girilen, 0) > 0 THEN ISNULL(D.fiyat_girilen, 0) ELSE ISNULL(D.lDovizFiyati, 0) END AS lDovizFiyati, CASE WHEN ISNULL(D.lDovizTutari, 0) > 0 THEN ISNULL(D.lDovizTutari, 0) WHEN ISNULL(D.fiyat_girilen, 0) > 0 THEN ISNULL(D.fiyat_girilen, 0) * ISNULL(D.lMiktar, 0) ELSE ISNULL(D.lDovizFiyati, 0) * ISNULL(D.lMiktar, 0) END AS lDovizTutari, CASE WHEN LTRIM(RTRIM(ISNULL(D.fiyat_doviz, ''))) <> '' THEN LTRIM(RTRIM(D.fiyat_doviz)) WHEN LTRIM(RTRIM(ISNULL(D.sDovizCinsi, ''))) <> '' THEN LTRIM(RTRIM(D.sDovizCinsi)) WHEN LTRIM(RTRIM(ISNULL(M.sDovizCinsi, ''))) <> '' THEN LTRIM(RTRIM(M.sDovizCinsi)) ELSE 'USD' END AS USD, ISNULL(NULLIF(LTRIM(RTRIM(D.sAciklama3)), ''), N'DUMMY') AS DUMMY FROM dbo.spUrtOnMLMasDet D INNER JOIN dbo.spUrtOnMLMas M ON M.nOnMLNo = D.nOnMLNo OUTER APPLY ( SELECT TOP 1 ISNULL(F.sKodu, '') AS FirmaKodu, ISNULL(F.sAciklama, '') AS FirmaAciklama FROM dbo.spUrtSiparisDet SD INNER JOIN dbo.spUrtSiparis SM ON SM.nUrtSiparisID = SD.nUrtSiparisID LEFT JOIN dbo.tbFirma F ON F.nFirmaID = SM.nFirmaID WHERE ( (ISNULL(M.nUrtReceteID, 0) > 0 AND SD.nUrtReceteID = M.nUrtReceteID) OR (ISNULL(M.nUrtReceteID, 0) <= 0 AND LTRIM(RTRIM(ISNULL(SD.sMModelKodu, ''))) = LTRIM(RTRIM(ISNULL(M.UrunKodu, '')))) ) AND SD.dteIslemTarihi <= COALESCE(D.dteIslemTarihiDeg, D.dteIslemTarihi, M.Tarihi, M.dteKayitTarihi) ORDER BY SD.dteIslemTarihi DESC, SD.nUrtSiparisID DESC ) UF WHERE NULLIF(@p1, '') IS NOT NULL AND LTRIM(RTRIM(ISNULL(D.sKodu, ''))) LIKE @p1 + '%' AND ( ISNULL(D.fiyat_girilen, 0) > 0 OR ISNULL(D.lDovizFiyati, 0) > 0 OR ISNULL(D.lDovizTutari, 0) > 0 ) AND ( NULLIF(@p2, '') IS NULL OR CONVERT(date, COALESCE(D.dteIslemTarihiDeg, D.dteIslemTarihi, M.Tarihi, M.dteKayitTarihi)) < CONVERT(date, NULLIF(@p2, ''), 23) ) ORDER BY COALESCE(D.dteIslemTarihiDeg, D.dteIslemTarihi, M.Tarihi, M.dteKayitTarihi) DESC, D.nOnMLNo DESC, D.nOnMLDetNo DESC ` return uretimDB.QueryContext(ctx, sqlText, sKoduPrefix, costDate, limit) } func GetProductionHasCostOnMLHistoryByHammaddeTuruNo( ctx context.Context, uretimDB *sql.DB, nHammaddeTuruNo string, costDate string, limit int, ) (*sql.Rows, error) { nHammaddeTuruNo = strings.TrimSpace(nHammaddeTuruNo) costDate = strings.TrimSpace(costDate) if limit <= 0 { limit = 250 } sqlText := ` SELECT TOP (@p3) 'recipe' AS sourceType, 'BNZ' AS priceType, CONVERT(VARCHAR(16), COALESCE(D.dteIslemTarihiDeg, D.dteIslemTarihi, M.Tarihi, M.dteKayitTarihi), 120) AS dteIslemTarihi, RTRIM(CONVERT(VARCHAR(32), ISNULL(D.nOnMLNo, 0))) AS nOnMLNo, ISNULL(UF.FirmaKodu, '') AS FirmaKodu, ISNULL(UF.FirmaAciklama, '') AS FirmaAciklama, ISNULL(D.sKodu, '') AS sKodu, ISNULL(D.sAciklama, '') AS sAciklama, ISNULL(D.sRenk, '') AS sRenk, ISNULL(D.lMiktar, 0) AS lMiktar, ISNULL(D.sBirim, '') AS sBirim, CASE WHEN ISNULL(D.fiyat_girilen, 0) > 0 THEN ISNULL(D.fiyat_girilen, 0) ELSE ISNULL(D.lDovizFiyati, 0) END AS lDovizFiyati, CASE WHEN ISNULL(D.lDovizTutari, 0) > 0 THEN ISNULL(D.lDovizTutari, 0) WHEN ISNULL(D.fiyat_girilen, 0) > 0 THEN ISNULL(D.fiyat_girilen, 0) * ISNULL(D.lMiktar, 0) ELSE ISNULL(D.lDovizFiyati, 0) * ISNULL(D.lMiktar, 0) END AS lDovizTutari, CASE WHEN LTRIM(RTRIM(ISNULL(D.fiyat_doviz, ''))) <> '' THEN LTRIM(RTRIM(D.fiyat_doviz)) WHEN LTRIM(RTRIM(ISNULL(D.sDovizCinsi, ''))) <> '' THEN LTRIM(RTRIM(D.sDovizCinsi)) WHEN LTRIM(RTRIM(ISNULL(M.sDovizCinsi, ''))) <> '' THEN LTRIM(RTRIM(M.sDovizCinsi)) ELSE 'USD' END AS USD, ISNULL(NULLIF(LTRIM(RTRIM(D.sAciklama3)), ''), N'DUMMY') AS DUMMY FROM dbo.spUrtOnMLMasDet D INNER JOIN dbo.spUrtOnMLMas M ON M.nOnMLNo = D.nOnMLNo OUTER APPLY ( SELECT TOP 1 ISNULL(F.sKodu, '') AS FirmaKodu, ISNULL(F.sAciklama, '') AS FirmaAciklama FROM dbo.spUrtSiparisDet SD INNER JOIN dbo.spUrtSiparis SM ON SM.nUrtSiparisID = SD.nUrtSiparisID LEFT JOIN dbo.tbFirma F ON F.nFirmaID = SM.nFirmaID WHERE ( (ISNULL(M.nUrtReceteID, 0) > 0 AND SD.nUrtReceteID = M.nUrtReceteID) OR (ISNULL(M.nUrtReceteID, 0) <= 0 AND LTRIM(RTRIM(ISNULL(SD.sMModelKodu, ''))) = LTRIM(RTRIM(ISNULL(M.UrunKodu, '')))) ) AND SD.dteIslemTarihi <= COALESCE(D.dteIslemTarihiDeg, D.dteIslemTarihi, M.Tarihi, M.dteKayitTarihi) ORDER BY SD.dteIslemTarihi DESC, SD.nUrtSiparisID DESC ) UF WHERE D.nHammaddeTuruNo = @p1 AND ISNULL(D.fiyat_girilen, 0) > 0 AND ( NULLIF(@p2, '') IS NULL OR CONVERT(date, COALESCE(D.dteIslemTarihiDeg, D.dteIslemTarihi, M.Tarihi, M.dteKayitTarihi)) < CONVERT(date, NULLIF(@p2, ''), 23) ) ORDER BY COALESCE(D.dteIslemTarihiDeg, D.dteIslemTarihi, M.Tarihi, M.dteKayitTarihi) DESC, D.nOnMLNo DESC, D.nOnMLDetNo DESC ` return uretimDB.QueryContext(ctx, sqlText, nHammaddeTuruNo, costDate, limit) } func GetProductionHasCostSimilarItemHistory( ctx context.Context, mssqlDB *sql.DB, uretimDB *sql.DB, nHammaddeTuruNo string, costDate string, limit int, ) ([]any, error) { if limit <= 0 { limit = 50 } // 1. Satinalma (V3) tarafini sorgula - Simdilik V3 tarafi icin hammadde turu eslestirmesi belirsiz oldugundan pasif /* v3Sql := ` SELECT TOP (@p2) 'purchase' AS sourceType, 'BNZ' AS priceType, CONVERT(VARCHAR(16), A.InvoiceDate, 120) AS Tarih, ISNULL(A.InvoiceNumber, '') AS FaturaKodu, LTRIM(RTRIM(ISNULL(A.ItemCode, ''))) AS MasrafKodu, ISNULL(ID.ItemDescription, '') AS MasrafDetay, ISNULL(A.ColorCode, '') AS ColorCode, ISNULL(A.Qty1, 0) AS Miktar, ISNULL(CI.UnitOfMeasureCode1, '') AS BIRIM, ISNULL(A.Doc_Price, 0) AS EvrakFiyat, ISNULL(A.Doc_CurrencyCode, '') AS EvrakDoviz FROM AllInvoicesWithAttributes A LEFT JOIN cdItem CI ON CI.ItemTypeCode = A.ItemTypeCode AND CI.ItemCode = A.ItemCode OUTER APPLY ( SELECT TOP 1 ItemDescription FROM cdItemDesc WHERE ItemTypeCode = A.ItemTypeCode AND ItemCode = A.ItemCode AND LangCode = 'TR' ) ID WHERE A.ProcessCode IN ('BP') AND A.ATAtt01 IN (1, 2) AND A.CompanyCode IN (1, 2, 5) AND A.IsCompleted = 1 AND YEAR(A.InvoiceDate) >= 2023 AND (NULLIF(@p1, '') IS NULL OR CONVERT(date, A.InvoiceDate) < CONVERT(date, NULLIF(@p1, ''), 23)) AND EXISTS ( -- Hammadde turu eslestirmesi (V3 tarafindaki karsiligi varsa) SELECT 1 FROM cdItem WHERE ItemCode = A.ItemCode ) ORDER BY A.InvoiceDate DESC ` */ // 2. Uretim (Recete) tarafini sorgula uretimSql := ` SELECT TOP (@p3) 'recipe' AS sourceType, 'BNZ' AS priceType, CONVERT(VARCHAR(16), ISNULL(M.Tarihi, M.dteKayitTarihi), 120) AS dteIslemTarihi, RTRIM(CONVERT(VARCHAR(32), ISNULL(D.nOnMLNo, 0))) AS nOnMLNo, ISNULL(D.sKodu, '') AS sKodu, ISNULL(D.sAciklama, '') AS sAciklama, ISNULL(D.sRenk, '') AS sRenk, ISNULL(D.lMiktar, 0) AS lMiktar, ISNULL(D.sBirim, '') AS sBirim, ISNULL(D.lDovizFiyati, 0) AS lDovizFiyati, CASE WHEN LTRIM(RTRIM(ISNULL(D.fiyat_doviz, ''))) <> '' THEN LTRIM(RTRIM(D.fiyat_doviz)) WHEN LTRIM(RTRIM(ISNULL(M.sDovizCinsi, ''))) <> '' THEN LTRIM(RTRIM(M.sDovizCinsi)) ELSE 'USD' END AS USD FROM dbo.spUrtOnMLMasDet D INNER JOIN dbo.spUrtOnMLMas M ON M.nOnMLNo = D.nOnMLNo WHERE D.nHammaddeTuruNo = @p1 AND (NULLIF(@p2, '') IS NULL OR CONVERT(date, ISNULL(M.Tarihi, M.dteKayitTarihi)) < CONVERT(date, NULLIF(@p2, ''), 23)) ORDER BY ISNULL(M.Tarihi, M.dteKayitTarihi) DESC ` // Not: nHammaddeTuruNo parametresine gore sadece Reçete tarafı şu an doğrudan filtrelenebiliyor. // V3 tarafı için ItemTypeCode veya özel bir grup kodu gerekebilir. // Kullanıcının talebi üzerine Reçete (URETIM) odaklı sorguyu önceliklendiriyoruz. rows, err := uretimDB.QueryContext(ctx, uretimSql, nHammaddeTuruNo, costDate, limit) if err != nil { return nil, err } defer rows.Close() var results []any for rows.Next() { // Basit bir map veya struct ile dondurebiliriz var row struct { SourceType string `json:"sourceType"` PriceType string `json:"priceType"` Tarih string `json:"Tarih"` EvrakKodu string `json:"EvrakKodu"` Kod string `json:"Kod"` Aciklama string `json:"Aciklama"` Renk string `json:"Renk"` Miktar float64 `json:"Miktar"` Birim string `json:"Birim"` Fiyat float64 `json:"Fiyat"` Doviz string `json:"Doviz"` } if err := rows.Scan( &row.SourceType, &row.PriceType, &row.Tarih, &row.EvrakKodu, &row.Kod, &row.Aciklama, &row.Renk, &row.Miktar, &row.Birim, &row.Fiyat, &row.Doviz, ); err == nil { results = append(results, row) } } return results, nil }