Merge remote-tracking branch 'origin/master'

This commit is contained in:
M_Kececi
2026-02-25 10:40:07 +03:00
parent 47848fc14d
commit 15e51e9c39
21 changed files with 1526 additions and 618 deletions

View File

@@ -22,7 +22,7 @@ UI_DIR=/opt/bssapp/ui/dist
# DATABASES
# ===============================
POSTGRES_CONN=host=46.224.33.150 port=5432 user=postgres password=tayitkan dbname=baggib2b sslmode=disable
MSSQL_CONN=sqlserver://sa:Gil_0150@100.127.186.137:1433?database=BAGGI_V3&encrypt=disable
MSSQL_CONN=sqlserver://sa:Gil_0150@10.0.0.9:1433?database=BAGGI_V3&encrypt=disable
# ===============================
# PDF

View File

@@ -3,7 +3,6 @@ package db
import (
"database/sql"
"fmt"
"log"
"os"
"strings"
@@ -13,23 +12,24 @@ import (
var MssqlDB *sql.DB
// ConnectMSSQL MSSQL baglantisini ortam degiskeninden baslatir.
func ConnectMSSQL() {
func ConnectMSSQL() error {
connString := strings.TrimSpace(os.Getenv("MSSQL_CONN"))
if connString == "" {
log.Fatal("MSSQL_CONN tanımlı değil")
return fmt.Errorf("MSSQL_CONN tanımlı değil")
}
var err error
MssqlDB, err = sql.Open("sqlserver", connString)
if err != nil {
log.Fatal("MSSQL bağlantı hatası:", err)
return fmt.Errorf("MSSQL bağlantı hatası: %w", err)
}
if err = MssqlDB.Ping(); err != nil {
log.Fatal("MSSQL erişilemiyor:", err)
return fmt.Errorf("MSSQL erişilemiyor: %w", err)
}
fmt.Println("MSSQL bağlantısı başarılı")
return nil
}
func GetDB() *sql.DB {

View File

@@ -425,6 +425,12 @@ func InitRoutes(pgDB *sql.DB, mssql *sql.DB, ml *mailer.GraphMailer) *mux.Router
wrapV3(routes.ExportStatementHeaderReportPDFHandler(mssql)),
)
bindV3(r, pgDB,
"/api/finance/customer-balances", "GET",
"finance", "view",
wrapV3(http.HandlerFunc(routes.GetCustomerBalanceListHandler)),
)
// ============================================================
// REPORT (STATEMENTS)
// ============================================================
@@ -576,6 +582,7 @@ func main() {
// -------------------------------------------------------
// 🔑 ENV
// -------------------------------------------------------
// Önce .env + mail.env yükle. MSSQL başarısızsa .env.local dene.
if err := godotenv.Load(".env", "mail.env"); err != nil {
log.Println("⚠️ .env / mail.env bulunamadı")
}
@@ -589,7 +596,15 @@ func main() {
// -------------------------------------------------------
// 🔗 DATABASE
// -------------------------------------------------------
db.ConnectMSSQL()
if err := db.ConnectMSSQL(); err != nil {
log.Println("⚠️ MSSQL ilk deneme başarısız:", err)
if err2 := godotenv.Overload(".env.local"); err2 != nil {
log.Println("⚠️ .env.local bulunamadı")
}
if err3 := db.ConnectMSSQL(); err3 != nil {
log.Fatal(err3)
}
}
pgDB, err := db.ConnectPostgres()
if err != nil {

View File

@@ -0,0 +1,36 @@
package models
type CustomerBalanceListParams struct {
SelectedDate string
CariSearch string
CariIlkGrup string
Piyasa string
Temsilci string
RiskDurumu string
IslemTipi string
Ulke string
}
type CustomerBalanceListRow struct {
CariIlkGrup string `json:"cari_ilk_grup"`
Piyasa string `json:"piyasa"`
Temsilci string `json:"temsilci"`
Sirket string `json:"sirket"`
AnaCariKodu string `json:"ana_cari_kodu"`
AnaCariAdi string `json:"ana_cari_adi"`
CariKodu string `json:"cari_kodu"`
CariDetay string `json:"cari_detay"`
Ozellik03 string `json:"ozellik03"`
Ozellik05 string `json:"ozellik05"`
Ozellik06 string `json:"ozellik06"`
Ozellik07 string `json:"ozellik07"`
CariDoviz string `json:"cari_doviz"`
Bakiye12 float64 `json:"bakiye_1_2"`
TLBakiye12 float64 `json:"tl_bakiye_1_2"`
USDBakiye12 float64 `json:"usd_bakiye_1_2"`
Bakiye13 float64 `json:"bakiye_1_3"`
TLBakiye13 float64 `json:"tl_bakiye_1_3"`
USDBakiye13 float64 `json:"usd_bakiye_1_3"`
HesapAlinmayanGun NullInt32 `json:"hesap_alinmayan_gun"`
KalanFaturaOrtalamaVadeTarihi NullString `json:"kalan_fatura_ortalama_vade_tarihi"`
}

View File

@@ -0,0 +1,200 @@
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
}

View File

@@ -0,0 +1,49 @@
package routes
import (
"bssapp-backend/auth"
"bssapp-backend/models"
"bssapp-backend/queries"
"encoding/json"
"log"
"net/http"
"strings"
"time"
)
// GET /api/finance/customer-balances
func GetCustomerBalanceListHandler(w http.ResponseWriter, r *http.Request) {
claims, ok := auth.GetClaimsFromContext(r.Context())
if !ok || claims == nil {
http.Error(w, "unauthorized", http.StatusUnauthorized)
return
}
selectedDate := strings.TrimSpace(r.URL.Query().Get("selected_date"))
if selectedDate == "" {
selectedDate = time.Now().Format("2006-01-02")
}
params := models.CustomerBalanceListParams{
SelectedDate: selectedDate,
CariSearch: strings.TrimSpace(r.URL.Query().Get("cari_search")),
CariIlkGrup: strings.TrimSpace(r.URL.Query().Get("cari_ilk_grup")),
Piyasa: strings.TrimSpace(r.URL.Query().Get("piyasa")),
Temsilci: strings.TrimSpace(r.URL.Query().Get("temsilci")),
RiskDurumu: strings.TrimSpace(r.URL.Query().Get("risk_durumu")),
IslemTipi: strings.TrimSpace(r.URL.Query().Get("islem_tipi")),
Ulke: strings.TrimSpace(r.URL.Query().Get("ulke")),
}
rows, err := queries.GetCustomerBalanceList(r.Context(), params)
if err != nil {
log.Println("GetCustomerBalanceList error:", err)
http.Error(w, "db error: "+err.Error(), http.StatusInternalServerError)
return
}
w.Header().Set("Content-Type", "application/json; charset=utf-8")
if err := json.NewEncoder(w).Encode(rows); err != nil {
log.Println("GetCustomerBalanceList json encode error:", err)
}
}

137
svc/run.log Normal file
View File

@@ -0,0 +1,137 @@
2026/02/23 12:29:31 🔥🔥🔥 BSSAPP BACKEND STARTED — LOGIN ROUTE SHOULD EXIST 🔥🔥🔥
2026/02/23 12:29:31 🔐 JWT_SECRET yüklendi
MSSQL bağlantısı başarılı
2026/02/23 12:29:31 PostgreSQL bağlantısı başarılı
2026/02/23 12:29:31 ✅ Admin dept permissions seeded
2026/02/23 12:29:31 🟢 auditlog Init called, buffer: 1000
2026/02/23 12:29:31 🕵️ AuditLog sistemi başlatıldı (buffer=1000)
2026/02/23 12:29:31 ✉️ Graph Mailer hazır (App-only token) | from=baggiss@baggi.com.tr
2026/02/23 12:29:31 ✉️ Graph Mailer hazır
2026/02/23 12:29:31 🟢 auditlog worker STARTED
📋 [DEBUG] İlk 10 kullanıcı:
- 1 : ctengiz
- 2 : ali.kale
- 5 : mehmet.keçeci
- 6 : mert.keçeci
- 7 : samet.keçeci
- 9 : orhan.caliskan
- 10 : nilgun.sara
- 14 : rustem.kurbanov
- 15 : caner.akyol
- 16 : kemal.matyakupov
2026/02/23 12:29:32 ✅ Route+Perm registered → POST /api/auth/login [auth:login]
2026/02/23 12:29:32 ✅ Route+Perm registered → POST /api/auth/refresh [auth:refresh]
2026/02/23 12:29:32 ✅ Route+Perm registered → POST /api/password/forgot [auth:update]
2026/02/23 12:29:33 ✅ Route+Perm registered → GET /api/password/reset/validate/{token} [auth:view]
2026/02/23 12:29:33 ✅ Route+Perm registered → POST /api/password/reset [auth:update]
2026/02/23 12:29:34 ✅ Route+Perm registered → POST /api/password/change [auth:update]
2026/02/23 12:29:34 ✅ Route+Perm registered → GET /api/activity-logs [system:read]
2026/02/23 12:29:35 ✅ Route+Perm registered → POST /api/test-mail [system:update]
2026/02/23 12:29:35 ✅ Route+Perm registered → GET /api/roles/{id}/permissions [system:update]
2026/02/23 12:29:36 ✅ Route+Perm registered → POST /api/roles/{id}/permissions [system:update]
2026/02/23 12:29:36 ✅ Route+Perm registered → GET /api/users/{id}/permissions [system:update]
2026/02/23 12:29:36 ✅ Route+Perm registered → POST /api/users/{id}/permissions [system:update]
2026/02/23 12:29:37 ✅ Route+Perm registered → GET /api/permissions/routes [system:view]
2026/02/23 12:29:37 ✅ Route+Perm registered → GET /api/permissions/effective [system:view]
2026/02/23 12:29:38 ✅ Route+Perm registered → GET /api/permissions/matrix [system:view]
2026/02/23 12:29:38 ✅ Route+Perm registered → GET /api/role-dept-permissions/list [system:update]
2026/02/23 12:29:38 ✅ Route+Perm registered → GET /api/roles/{roleId}/departments/{deptCode}/permissions [system:update]
2026/02/23 12:29:39 ✅ Route+Perm registered → POST /api/roles/{roleId}/departments/{deptCode}/permissions [system:update]
2026/02/23 12:29:39 ✅ Route+Perm registered → GET /api/users/list [user:view]
2026/02/23 12:29:40 ✅ Route+Perm registered → POST /api/users [user:insert]
2026/02/23 12:29:40 ✅ Route+Perm registered → GET /api/users/{id} [user:update]
2026/02/23 12:29:41 ✅ Route+Perm registered → PUT /api/users/{id} [user:update]
2026/02/23 12:29:41 ✅ Route+Perm registered → DELETE /api/users/{id} [user:delete]
2026/02/23 12:29:41 ✅ Route+Perm registered → POST /api/users/{id}/admin-reset-password [user:update]
2026/02/23 12:29:42 ✅ Route+Perm registered → POST /api/users/{id}/send-password-mail [user:update]
2026/02/23 12:29:42 ✅ Route+Perm registered → POST /api/users/create [user:insert]
2026/02/23 12:29:43 ✅ Route+Perm registered → GET /api/lookups/users-perm [user:view]
2026/02/23 12:29:43 ✅ Route+Perm registered → GET /api/lookups/roles-perm [user:view]
2026/02/23 12:29:43 ✅ Route+Perm registered → GET /api/lookups/departments-perm [user:view]
2026/02/23 12:29:44 ✅ Route+Perm registered → GET /api/lookups/modules [user:view]
2026/02/23 12:29:44 ✅ Route+Perm registered → GET /api/lookups/roles [user:view]
2026/02/23 12:29:45 ✅ Route+Perm registered → GET /api/lookups/departments [user:view]
2026/02/23 12:29:45 ✅ Route+Perm registered → GET /api/lookups/nebim-users [user:view]
2026/02/23 12:29:46 ✅ Route+Perm registered → GET /api/lookups/piyasalar [user:view]
2026/02/23 12:29:46 ✅ Route+Perm registered → GET /api/accounts [customer:view]
2026/02/23 12:29:46 ✅ Route+Perm registered → GET /api/customer-list [customer:view]
2026/02/23 12:29:47 ✅ Route+Perm registered → GET /api/today-currency [finance:view]
2026/02/23 12:29:47 ✅ Route+Perm registered → GET /api/export-pdf [finance:export]
2026/02/23 12:29:48 ✅ Route+Perm registered → GET /api/exportstamentheaderreport-pdf [finance:export]
2026/02/23 12:29:48 ✅ Route+Perm registered → GET /api/finance/customer-balances [finance:view]
2026/02/23 12:29:48 ✅ Route+Perm registered → GET /api/statements [finance:view]
2026/02/23 12:29:49 ✅ Route+Perm registered → GET /api/statements/{id}/details [finance:view]
2026/02/23 12:29:49 ✅ Route+Perm registered → POST /api/order/create [order:insert]
2026/02/23 12:29:50 ✅ Route+Perm registered → POST /api/order/update [order:update]
2026/02/23 12:29:50 ✅ Route+Perm registered → GET /api/order/get/{id} [order:view]
2026/02/23 12:29:51 ✅ Route+Perm registered → GET /api/orders/list [order:view]
2026/02/23 12:29:51 ✅ Route+Perm registered → GET /api/orders/production-list [order:update]
2026/02/23 12:29:51 ✅ Route+Perm registered → GET /api/orders/production-items/{id} [order:view]
2026/02/23 12:29:52 ✅ Route+Perm registered → POST /api/orders/production-items/{id}/insert-missing [order:update]
2026/02/23 12:29:52 ✅ Route+Perm registered → POST /api/orders/production-items/{id}/validate [order:update]
2026/02/23 12:29:53 ✅ Route+Perm registered → POST /api/orders/production-items/{id}/apply [order:update]
2026/02/23 12:29:53 ✅ Route+Perm registered → GET /api/orders/close-ready [order:update]
2026/02/23 12:29:54 ✅ Route+Perm registered → POST /api/orders/bulk-close [order:update]
2026/02/23 12:29:54 ✅ Route+Perm registered → GET /api/orders/export [order:export]
2026/02/23 12:29:54 ✅ Route+Perm registered → GET /api/order/check/{id} [order:view]
2026/02/23 12:29:55 ✅ Route+Perm registered → POST /api/order/validate [order:insert]
2026/02/23 12:29:55 ✅ Route+Perm registered → GET /api/order/pdf/{id} [order:export]
2026/02/23 12:29:56 ✅ Route+Perm registered → GET /api/order-inventory [order:view]
2026/02/23 12:29:56 ✅ Route+Perm registered → GET /api/orderpricelistb2b [order:view]
2026/02/23 12:29:57 ✅ Route+Perm registered → GET /api/min-price [order:view]
2026/02/23 12:29:57 ✅ Route+Perm registered → GET /api/products [order:view]
2026/02/23 12:29:57 ✅ Route+Perm registered → GET /api/product-detail [order:view]
2026/02/23 12:29:58 ✅ Route+Perm registered → GET /api/product-colors [order:view]
2026/02/23 12:29:58 ✅ Route+Perm registered → GET /api/product-colorsize [order:view]
2026/02/23 12:29:59 ✅ Route+Perm registered → GET /api/product-secondcolor [order:view]
2026/02/23 12:29:59 ✅ Route+Perm registered → GET /api/roles [user:view]
2026/02/23 12:29:59 ✅ Route+Perm registered → GET /api/departments [user:view]
2026/02/23 12:30:00 ✅ Route+Perm registered → GET /api/piyasalar [user:view]
2026/02/23 12:30:01 ✅ Route+Perm registered → POST /api/roles/{id}/departments [user:update]
2026/02/23 12:30:01 ✅ Route+Perm registered → POST /api/roles/{id}/piyasalar [user:update]
2026/02/23 12:30:01 ✅ Route+Perm registered → POST /api/users/{id}/roles [user:update]
2026/02/23 12:30:02 ✅ Route+Perm registered → POST /api/admin/users/{id}/piyasa-sync [admin:user.update]
2026/02/23 12:30:02 🌍 CORS Allowed Origin: http://ss.baggi.com.tr/app
2026/02/23 12:30:02 🚀 Server running at: 0.0.0.0:8080
2026/02/23 12:30:43 ➡️ POST /api/auth/login | auth=false
2026/02/23 12:30:44 🔎 LOGIN DEBUG | mk_user_found=false err=mk_user not found hash_len=0
2026/02/23 12:30:44 🟡 LEGACY LOGIN PATH: x
2026/02/23 12:30:44 🟡 LEGACY LOGIN QUERY HIT: x
2026/02/23 12:30:44 ❌ LEGACY SCAN ERROR: sql: no rows in result set
2026/02/23 12:30:44 ⬅️ POST /api/auth/login | status=401 | 279.0065ms
2026/02/23 12:30:44 ⚠️ LOGGER: claims is NIL
2026/02/23 12:30:44 🧾 auditlog INSERT | actor_dfusr=<nil> actor_user=<nil> role=public nav /api/auth/login target=<nil>
2026/02/23 12:30:50 ➡️ POST /api/auth/login | auth=false
2026/02/23 12:30:50 🧪 MK USER FROM DB
2026/02/23 12:30:50 🧪 ID=5 role_id=3 role_code='admin' depts=[UST_YONETIM]
2026/02/23 12:30:50 🔎 LOGIN DEBUG | mk_user_found=true err=<nil> hash_len=60
2026/02/23 12:30:50 🧪 LOGIN RESPONSE USER DEBUG
2026/02/23 12:30:50 🧪 user.ID = 5
2026/02/23 12:30:50 🧪 user.Username = mehmet.keçeci
2026/02/23 12:30:50 🧪 user.RoleID = 3
2026/02/23 12:30:50 🧪 user.RoleCode = 'admin'
2026/02/23 12:30:50 🧪 user.IsActive = true
2026/02/23 12:30:50 ⬅️ POST /api/auth/login | status=200 | 593.239ms
2026/02/23 12:30:50 ⚠️ LOGGER: claims is NIL
2026/02/23 12:30:50 🧾 auditlog INSERT | actor_dfusr=<nil> actor_user=<nil> role=public nav /api/auth/login target=<nil>
2026/02/23 12:30:52 🔐 GLOBAL AUTH user=5 role=admin
2026/02/23 12:30:52 ➡️ GET /api/finance/customer-balances | auth=true
2026/02/23 12:30:52 AUTH_MIDDLEWARE PASS user=5 role=admin method=GET path=/api/finance/customer-balances
2026/02/23 12:30:52 🔐 PERM CHECK user=5 role=3 dept=[UST_YONETIM] finance:view
2026/02/23 12:30:53 ↳ ROLE+DEPT OVERRIDE = true
2026/02/23 12:33:21 ⬅️ GET /api/finance/customer-balances | status=200 | 2m28.8586087s
2026/02/23 12:33:21 ✅ LOGGER CLAIMS user=mehmet.keçeci role=admin id=5
2026/02/23 12:33:21 🧾 auditlog INSERT | actor_dfusr=5 actor_user=mehmet.keçeci role=admin nav /api/finance/customer-balances target=<nil>
2026/02/23 13:40:17 ➡️ POST /api/auth/refresh | auth=false
2026/02/23 13:40:18 ⬅️ POST /api/auth/refresh | status=200 | 852.618ms
2026/02/23 13:40:18 ⚠️ LOGGER: claims is NIL
2026/02/23 13:40:18 🧾 auditlog INSERT | actor_dfusr=<nil> actor_user=<nil> role=public nav /api/auth/refresh target=<nil>
2026/02/23 13:40:18 🔐 GLOBAL AUTH user=5 role=admin
2026/02/23 13:40:18 ➡️ GET /api/finance/customer-balances | auth=true
2026/02/23 13:40:18 AUTH_MIDDLEWARE PASS user=5 role=admin method=GET path=/api/finance/customer-balances
2026/02/23 13:40:18 🔐 PERM CHECK user=5 role=3 dept=[UST_YONETIM] finance:view
2026/02/23 13:40:19 ↳ ROLE+DEPT OVERRIDE = true
2026/02/23 13:42:46 ⬅️ GET /api/finance/customer-balances | status=200 | 2m27.9525306s
2026/02/23 13:42:46 ✅ LOGGER CLAIMS user=mehmet.keçeci role=admin id=5
2026/02/23 13:42:46 🧾 auditlog INSERT | actor_dfusr=5 actor_user=mehmet.keçeci role=admin nav /api/finance/customer-balances target=<nil>
exit status 1