Files
bssapp/svc/queries/customer_balance_list.go
2026-02-25 10:40:19 +03:00

201 lines
5.3 KiB
Go

package queries
import (
"bssapp-backend/db"
"bssapp-backend/internal/authz"
"bssapp-backend/models"
"context"
"database/sql"
"fmt"
"strings"
)
func GetCustomerBalanceList(ctx context.Context, params models.CustomerBalanceListParams) ([]models.CustomerBalanceListRow, error) {
// AuthZ bazli piyasa filtresi
piyasaFilter := authz.BuildMSSQLPiyasaFilter(ctx, "D.Ozellik01")
if strings.TrimSpace(piyasaFilter) == "" {
piyasaFilter = "1=1"
}
// Dinamik WHERE insa et
where := make([]string, 0, 16)
where = append(where, "D.Islem_Tarihi < DATEADD(DAY, 1, @SecilenTarih)")
where = append(where, piyasaFilter)
if params.CariIlkGrup != "" {
where = append(where, "D.Ozellik08 = @CariIlkGrup")
}
if params.Piyasa != "" {
where = append(where, "D.Ozellik01 = @Piyasa")
}
if params.Temsilci != "" {
where = append(where, "COALESCE(NULLIF(D.Ozellik02, ''), D.Ozellik09) = @Temsilci")
}
if params.RiskDurumu != "" {
where = append(where, "D.Ozellik03 = @RiskDurumu")
}
if params.IslemTipi != "" {
where = append(where, "D.PislemTipi = @IslemTipi")
}
if params.Ulke != "" {
where = append(where, "D.Ozellik05 = @Ulke")
}
whereSQL := strings.Join(where, "\n AND ")
cariSearchLike := "%" + strings.TrimSpace(params.CariSearch) + "%"
outerWhere := "1=1"
if strings.TrimSpace(params.CariSearch) != "" {
outerWhere = `(LEFT(B.CariKodu, 8) COLLATE Turkish_100_CI_AI LIKE @CariSearchLike
OR B.CariKodu COLLATE Turkish_100_CI_AI LIKE @CariSearchLike
OR B.CariDetay COLLATE Turkish_100_CI_AI LIKE @CariSearchLike
OR AC.ANA_CARI_ADI COLLATE Turkish_100_CI_AI LIKE @CariSearchLike)`
}
const queryTemplate = `
;WITH CTE_ANA_CARI AS (
SELECT
ANA_CARI_KODU = LEFT(CariKodu, 8),
CariDetay,
rn = ROW_NUMBER() OVER (
PARTITION BY LEFT(CariKodu, 8)
ORDER BY CariKodu
)
FROM dbo.MK_CARI_ILETISIM WITH (NOLOCK)
),
ANA_CARI AS (
SELECT
ANA_CARI_KODU,
CariDetay AS ANA_CARI_ADI
FROM CTE_ANA_CARI
WHERE rn = 1
),
BASE AS (
SELECT
D.SirketKodu,
D.SirketDetay,
D.CariKodu,
D.CariDetay,
D.CariDoviz,
D.Ozellik01,
D.Ozellik02,
D.Ozellik03,
D.Ozellik05,
D.Ozellik06,
D.Ozellik07,
D.Ozellik08,
D.Ozellik09,
D.PislemTipi,
D.Bakiye,
D.KurBakiye,
D.Son_Guncel_Kur
FROM dbo.DENEME02DENEME AS D WITH (NOLOCK)
WHERE %s
)
SELECT
B.Ozellik08 AS CARI_ILK_GRUP,
B.Ozellik01 AS PIYASA,
COALESCE(NULLIF(B.Ozellik02, ''), B.Ozellik09) AS Temsilci,
LEFT(B.SirketDetay, 10) AS Sirket,
LEFT(B.CariKodu, 8) AS ANA_CARI_KODU,
AC.ANA_CARI_ADI,
B.CariKodu,
B.CariDetay,
B.Ozellik03,
B.Ozellik05,
B.Ozellik06,
B.Ozellik07,
B.CariDoviz,
ISNULL(SUM(CASE WHEN B.PislemTipi = '1_2' THEN ISNULL(B.Bakiye, 0) ELSE 0 END), 0) AS Bakiye_1_2,
ISNULL(SUM(CASE WHEN B.PislemTipi = '1_2' THEN ISNULL(B.KurBakiye, 0) ELSE 0 END), 0) AS TL_Bakiye_1_2,
ISNULL(
SUM(CASE WHEN B.PislemTipi = '1_2' THEN ISNULL(B.KurBakiye, 0) ELSE 0 END) / NULLIF(MIN(B.Son_Guncel_Kur), 0),
0
) AS USD_Bakiye_1_2,
ISNULL(SUM(CASE WHEN B.PislemTipi = '1_3' THEN ISNULL(B.Bakiye, 0) ELSE 0 END), 0) AS Bakiye_1_3,
ISNULL(SUM(CASE WHEN B.PislemTipi = '1_3' THEN ISNULL(B.KurBakiye, 0) ELSE 0 END), 0) AS TL_Bakiye_1_3,
ISNULL(
SUM(CASE WHEN B.PislemTipi = '1_3' THEN ISNULL(B.KurBakiye, 0) ELSE 0 END) / NULLIF(MIN(B.Son_Guncel_Kur), 0),
0
) AS USD_Bakiye_1_3,
CAST(NULL AS int) AS Hesap_Alinmayan_Gun,
CAST(NULL AS varchar(32)) AS Kalan_Fatura_Ortalama_Vade_Tarihi
FROM BASE AS B
LEFT JOIN ANA_CARI AS AC
ON AC.ANA_CARI_KODU = LEFT(B.CariKodu, 8)
WHERE %s
GROUP BY
B.Ozellik08,
B.Ozellik01,
COALESCE(NULLIF(B.Ozellik02, ''), B.Ozellik09),
LEFT(B.SirketDetay, 10),
LEFT(B.CariKodu, 8),
AC.ANA_CARI_ADI,
B.CariKodu,
B.CariDetay,
B.Ozellik03,
B.Ozellik05,
B.Ozellik06,
B.Ozellik07,
B.CariDoviz
ORDER BY
LEFT(B.SirketDetay, 10),
B.CariKodu
OPTION (RECOMPILE);
`
query := fmt.Sprintf(queryTemplate, whereSQL, outerWhere)
rows, err := db.MssqlDB.QueryContext(
ctx,
query,
sql.Named("SecilenTarih", params.SelectedDate),
sql.Named("CariIlkGrup", params.CariIlkGrup),
sql.Named("Piyasa", params.Piyasa),
sql.Named("Temsilci", params.Temsilci),
sql.Named("RiskDurumu", params.RiskDurumu),
sql.Named("IslemTipi", params.IslemTipi),
sql.Named("Ulke", params.Ulke),
sql.Named("CariSearchLike", cariSearchLike),
)
if err != nil {
return nil, fmt.Errorf("MSSQL query error: %w", err)
}
defer rows.Close()
out := make([]models.CustomerBalanceListRow, 0, 512)
for rows.Next() {
var r models.CustomerBalanceListRow
if err := rows.Scan(
&r.CariIlkGrup,
&r.Piyasa,
&r.Temsilci,
&r.Sirket,
&r.AnaCariKodu,
&r.AnaCariAdi,
&r.CariKodu,
&r.CariDetay,
&r.Ozellik03,
&r.Ozellik05,
&r.Ozellik06,
&r.Ozellik07,
&r.CariDoviz,
&r.Bakiye12,
&r.TLBakiye12,
&r.USDBakiye12,
&r.Bakiye13,
&r.TLBakiye13,
&r.USDBakiye13,
&r.HesapAlinmayanGun,
&r.KalanFaturaOrtalamaVadeTarihi,
); err != nil {
return nil, fmt.Errorf("row scan error: %w", err)
}
out = append(out, r)
}
if err := rows.Err(); err != nil {
return nil, fmt.Errorf("rows iteration error: %w", err)
}
return out, nil
}