Merge remote-tracking branch 'origin/master'
This commit is contained in:
@@ -10,6 +10,7 @@ import (
|
||||
|
||||
// Ana tabloyu getiren fonksiyon (Vue header tablosu için)
|
||||
func GetStatements(params models.StatementParams) ([]models.StatementHeader, error) {
|
||||
|
||||
// AccountCode normalize: "ZLA0127" → "ZLA 0127"
|
||||
if len(params.AccountCode) == 7 && strings.ContainsAny(params.AccountCode, "0123456789") {
|
||||
params.AccountCode = params.AccountCode[:3] + " " + params.AccountCode[3:]
|
||||
@@ -27,7 +28,6 @@ func GetStatements(params models.StatementParams) ([]models.StatementHeader, err
|
||||
if v == "" {
|
||||
continue
|
||||
}
|
||||
// Escape tek tırnak to avoid malformed SQL when list is injected into IN (...).
|
||||
quoted = append(quoted, fmt.Sprintf("'%s'", strings.ReplaceAll(v, "'", "''")))
|
||||
}
|
||||
if len(quoted) > 0 {
|
||||
@@ -36,7 +36,6 @@ func GetStatements(params models.StatementParams) ([]models.StatementHeader, err
|
||||
}
|
||||
|
||||
query := fmt.Sprintf(`
|
||||
|
||||
;WITH CurrDesc AS (
|
||||
SELECT
|
||||
CurrAccCode,
|
||||
@@ -45,89 +44,102 @@ func GetStatements(params models.StatementParams) ([]models.StatementHeader, err
|
||||
WHERE LangCode = @LangCode
|
||||
GROUP BY CurrAccCode
|
||||
),
|
||||
|
||||
/* =========================================================
|
||||
✅ Bu aralıkta hareket var mı?
|
||||
Varsa : Devir = startdate öncesi
|
||||
Yoksa : Devir = enddate dahil (enddate itibariyle bakiye)
|
||||
========================================================= */
|
||||
HasMovement AS (
|
||||
SELECT
|
||||
CASE WHEN EXISTS (
|
||||
SELECT 1
|
||||
FROM trCurrAccBook b
|
||||
INNER JOIN CurrAccBookATAttributesFilter f
|
||||
ON f.CurrAccBookID = b.CurrAccBookID
|
||||
AND f.ATAtt01 IN (%s)
|
||||
WHERE b.CurrAccCode LIKE '%%' + @Carikod + '%%'
|
||||
AND b.DocumentDate BETWEEN @startdate AND @enddate
|
||||
) THEN 1 ELSE 0 END AS HasMov
|
||||
),
|
||||
|
||||
/* =========================================================
|
||||
✅ Opening (Devir) — TEK CARİ KOD ALTINDA KONSOLİDE
|
||||
Cari_Kod = @Carikod (sabit)
|
||||
========================================================= */
|
||||
Opening AS (
|
||||
SELECT
|
||||
b.CurrAccCode AS Cari_Kod,
|
||||
b.DocCurrencyCode AS Para_Birimi,
|
||||
SUM(c.Debit - c.Credit) AS Devir_Bakiyesi
|
||||
|
||||
SELECT
|
||||
@Carikod AS Cari_Kod,
|
||||
b.DocCurrencyCode AS Para_Birimi,
|
||||
SUM(ISNULL(c.Debit,0) - ISNULL(c.Credit,0)) AS Devir_Bakiyesi
|
||||
FROM trCurrAccBook b
|
||||
|
||||
CROSS JOIN HasMovement hm
|
||||
INNER JOIN CurrAccBookATAttributesFilter f2
|
||||
ON f2.CurrAccBookID = b.CurrAccBookID
|
||||
AND f2.ATAtt01 IN (%s)
|
||||
LEFT JOIN trCurrAccBookCurrency c
|
||||
ON c.CurrAccBookID = b.CurrAccBookID
|
||||
AND c.CurrencyCode = b.DocCurrencyCode
|
||||
|
||||
WHERE b.CurrAccCode LIKE '%%' + @Carikod + '%%'
|
||||
AND b.DocumentDate < @startdate
|
||||
|
||||
AND EXISTS (
|
||||
SELECT 1
|
||||
FROM CurrAccBookATAttributesFilter f2
|
||||
WHERE f2.CurrAccBookID = b.CurrAccBookID
|
||||
AND f2.ATAtt01 IN (%s)
|
||||
AND (
|
||||
(hm.HasMov = 1 AND b.DocumentDate < @startdate) -- hareket varsa: klasik devir
|
||||
OR (hm.HasMov = 0 AND b.DocumentDate <= @enddate) -- hareket yoksa: enddate itibariyle bakiye
|
||||
)
|
||||
|
||||
GROUP BY
|
||||
b.CurrAccCode,
|
||||
b.DocCurrencyCode
|
||||
),
|
||||
OpeningByCurrency AS (
|
||||
SELECT
|
||||
Para_Birimi,
|
||||
SUM(Devir_Bakiyesi) AS Devir_Bakiyesi
|
||||
FROM Opening
|
||||
GROUP BY Para_Birimi
|
||||
GROUP BY b.DocCurrencyCode
|
||||
),
|
||||
|
||||
/* =========================================================
|
||||
✅ Hareketler (Movements) — TEK CARİ KOD ALTINDA KONSOLİDE
|
||||
Cari_Kod = @Carikod (sabit)
|
||||
Running sadece aralıktaki hareketlerden gelir.
|
||||
========================================================= */
|
||||
Movements AS (
|
||||
SELECT
|
||||
b.CurrAccCode AS Cari_Kod,
|
||||
d.CurrAccDescription AS Cari_Isim,
|
||||
SELECT
|
||||
@Carikod AS Cari_Kod,
|
||||
|
||||
CONVERT(varchar(10), b.DocumentDate, 23) AS Belge_Tarihi,
|
||||
CONVERT(varchar(10), b.DueDate, 23) AS Vade_Tarihi,
|
||||
COALESCE(
|
||||
(SELECT TOP 1 cd.CurrAccDescription
|
||||
FROM CurrDesc cd
|
||||
WHERE cd.CurrAccCode = @Carikod),
|
||||
(SELECT TOP 1 cd.CurrAccDescription
|
||||
FROM CurrDesc cd
|
||||
WHERE cd.CurrAccCode LIKE '%%' + @Carikod + '%%'
|
||||
ORDER BY cd.CurrAccCode)
|
||||
) AS Cari_Isim,
|
||||
|
||||
b.RefNumber AS Belge_No,
|
||||
CONVERT(varchar(10), b.DocumentDate, 23) AS Belge_Tarihi,
|
||||
CONVERT(varchar(10), b.DueDate, 23) AS Vade_Tarihi,
|
||||
|
||||
b.RefNumber AS Belge_No,
|
||||
b.BaseApplicationCode AS Islem_Tipi,
|
||||
b.LineDescription AS Aciklama,
|
||||
b.LineDescription AS Aciklama,
|
||||
|
||||
b.DocCurrencyCode AS Para_Birimi,
|
||||
b.DocCurrencyCode AS Para_Birimi,
|
||||
|
||||
c.Debit AS Borc,
|
||||
c.Credit AS Alacak,
|
||||
ISNULL(c.Debit,0) AS Borc,
|
||||
ISNULL(c.Credit,0) AS Alacak,
|
||||
|
||||
SUM(c.Debit - c.Credit)
|
||||
SUM(ISNULL(c.Debit,0) - ISNULL(c.Credit,0))
|
||||
OVER (
|
||||
PARTITION BY b.CurrAccCode, c.CurrencyCode
|
||||
PARTITION BY b.DocCurrencyCode
|
||||
ORDER BY b.DocumentDate, b.CurrAccBookID
|
||||
) AS Hareket_Bakiyesi,
|
||||
|
||||
f.ATAtt01 AS Parislemtipi
|
||||
|
||||
FROM trCurrAccBook b
|
||||
|
||||
LEFT JOIN CurrDesc d
|
||||
ON b.CurrAccCode = d.CurrAccCode
|
||||
|
||||
INNER JOIN CurrAccBookATAttributesFilter f
|
||||
ON f.CurrAccBookID = b.CurrAccBookID
|
||||
AND f.ATAtt01 IN (%s)
|
||||
LEFT JOIN trCurrAccBookCurrency c
|
||||
ON b.CurrAccBookID = c.CurrAccBookID
|
||||
AND b.DocCurrencyCode = c.CurrencyCode
|
||||
|
||||
LEFT JOIN CurrAccBookATAttributesFilter f
|
||||
ON b.CurrAccBookID = f.CurrAccBookID
|
||||
ON c.CurrAccBookID = b.CurrAccBookID
|
||||
AND c.CurrencyCode = b.DocCurrencyCode
|
||||
|
||||
WHERE b.CurrAccCode LIKE '%%' + @Carikod + '%%'
|
||||
AND b.DocumentDate BETWEEN @startdate AND @enddate
|
||||
|
||||
AND EXISTS (
|
||||
SELECT 1
|
||||
FROM CurrAccBookATAttributesFilter f2
|
||||
WHERE f2.CurrAccBookID = b.CurrAccBookID
|
||||
AND f2.ATAtt01 IN (%s)
|
||||
)
|
||||
)
|
||||
|
||||
SELECT
|
||||
SELECT
|
||||
m.Cari_Kod,
|
||||
m.Cari_Isim,
|
||||
m.Belge_Tarihi,
|
||||
@@ -136,27 +148,28 @@ SELECT
|
||||
m.Islem_Tipi,
|
||||
m.Aciklama,
|
||||
m.Para_Birimi,
|
||||
|
||||
m.Borc,
|
||||
m.Alacak,
|
||||
|
||||
/* ✅ Bakiye = Devir + Aralıktaki Running */
|
||||
ISNULL(o.Devir_Bakiyesi,0) + m.Hareket_Bakiyesi AS Bakiye,
|
||||
|
||||
m.Parislemtipi AS Parislemler
|
||||
|
||||
FROM Movements m
|
||||
|
||||
LEFT JOIN Opening o
|
||||
ON o.Cari_Kod = m.Cari_Kod
|
||||
ON o.Cari_Kod = m.Cari_Kod
|
||||
AND o.Para_Birimi = m.Para_Birimi
|
||||
|
||||
|
||||
UNION ALL
|
||||
|
||||
|
||||
/* ✅ Devir satırı sadece Opening’den */
|
||||
SELECT
|
||||
@Carikod AS Cari_Kod,
|
||||
/* =========================================================
|
||||
✅ Devir Satırı (kur bazında) — Opening'den gelir
|
||||
Hareket varsa: startdate öncesi
|
||||
Hareket yoksa: enddate itibariyle bakiye
|
||||
========================================================= */
|
||||
SELECT
|
||||
o.Cari_Kod,
|
||||
COALESCE(
|
||||
(SELECT TOP 1 cd.CurrAccDescription
|
||||
FROM CurrDesc cd
|
||||
@@ -167,38 +180,31 @@ SELECT
|
||||
ORDER BY cd.CurrAccCode)
|
||||
) AS Cari_Isim,
|
||||
|
||||
CONVERT(varchar(10), @startdate, 23),
|
||||
CONVERT(varchar(10), @startdate, 23),
|
||||
CONVERT(varchar(10), @startdate, 23) AS Belge_Tarihi,
|
||||
CONVERT(varchar(10), @startdate, 23) AS Vade_Tarihi,
|
||||
|
||||
'Baslangic_devir',
|
||||
'Devir',
|
||||
'Devir Bakiyesi',
|
||||
'Baslangic_devir' AS Belge_No,
|
||||
'Devir' AS Islem_Tipi,
|
||||
'Devir Bakiyesi' AS Aciklama,
|
||||
|
||||
obc.Para_Birimi,
|
||||
o.Para_Birimi,
|
||||
|
||||
CASE
|
||||
WHEN obc.Devir_Bakiyesi >= 0 THEN obc.Devir_Bakiyesi
|
||||
ELSE 0
|
||||
END,
|
||||
CASE WHEN o.Devir_Bakiyesi >= 0 THEN o.Devir_Bakiyesi ELSE 0 END AS Borc,
|
||||
CASE WHEN o.Devir_Bakiyesi < 0 THEN ABS(o.Devir_Bakiyesi) ELSE 0 END AS Alacak,
|
||||
|
||||
CASE
|
||||
WHEN obc.Devir_Bakiyesi < 0 THEN ABS(obc.Devir_Bakiyesi)
|
||||
ELSE 0
|
||||
END,
|
||||
|
||||
obc.Devir_Bakiyesi,
|
||||
o.Devir_Bakiyesi AS Bakiye,
|
||||
|
||||
CAST(NULL AS varchar(32)) AS Parislemler
|
||||
|
||||
FROM OpeningByCurrency obc
|
||||
FROM Opening o
|
||||
|
||||
|
||||
ORDER BY
|
||||
Para_Birimi,
|
||||
ORDER BY
|
||||
Para_Birimi,
|
||||
Belge_Tarihi;
|
||||
`,
|
||||
parislemFilter,
|
||||
parislemFilter,
|
||||
parislemFilter, // HasMovement
|
||||
parislemFilter, // Opening
|
||||
parislemFilter, // Movements
|
||||
)
|
||||
|
||||
rows, err := db.MssqlDB.Query(query,
|
||||
|
||||
Reference in New Issue
Block a user