1703 lines
51 KiB
Go
1703 lines
51 KiB
Go
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
|
||
}
|