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 }