diff --git a/svc/routes/customer_balance_pdf.go b/svc/routes/customer_balance_pdf.go index 62a8268..44df153 100644 --- a/svc/routes/customer_balance_pdf.go +++ b/svc/routes/customer_balance_pdf.go @@ -72,6 +72,9 @@ func ExportCustomerBalancePDFHandler(_ *sql.DB) http.HandlerFunc { rows = filterCustomerBalanceRowsForPDF(rows, excludeZero12, excludeZero13) summaries, detailsByMaster := buildCustomerBalancePDFData(rows) + sortBy := strings.TrimSpace(r.URL.Query().Get("sort_by")) + sortDesc := parseBoolQuery(r.URL.Query().Get("sort_desc")) + sortBalanceSummariesForPDF(summaries, sortBy, sortDesc) pdf := gofpdf.New("L", "mm", "A4", "") pdf.SetMargins(8, 8, 8) @@ -240,6 +243,79 @@ func buildCustomerBalancePDFData(rows []models.CustomerBalanceListRow) ([]balanc return summaries, detailsByMaster } +func sortBalanceSummariesForPDF(summaries []balanceSummaryPDF, sortBy string, descending bool) { + key := strings.TrimSpace(sortBy) + if key == "" || len(summaries) <= 1 { + return + } + + textCmp := func(a, b string) int { + return strings.Compare(strings.ToUpper(strings.TrimSpace(a)), strings.ToUpper(strings.TrimSpace(b))) + } + numCmp := func(a, b float64) int { + if a < b { + return -1 + } + if a > b { + return 1 + } + return 0 + } + + sort.SliceStable(summaries, func(i, j int) bool { + a := summaries[i] + b := summaries[j] + cmp := 0 + + switch key { + case "ana_cari_kodu": + cmp = textCmp(a.AnaCariKodu, b.AnaCariKodu) + case "ana_cari_adi": + cmp = textCmp(a.AnaCariAdi, b.AnaCariAdi) + case "piyasa": + cmp = textCmp(a.Piyasa, b.Piyasa) + case "temsilci": + cmp = textCmp(a.Temsilci, b.Temsilci) + case "risk_durumu": + cmp = textCmp(a.RiskDurumu, b.RiskDurumu) + case "usd_bakiye_1_2": + cmp = numCmp(a.USDBakiye12, b.USDBakiye12) + case "tl_bakiye_1_2": + cmp = numCmp(a.TLBakiye12, b.TLBakiye12) + case "usd_bakiye_1_3": + cmp = numCmp(a.USDBakiye13, b.USDBakiye13) + case "tl_bakiye_1_3": + cmp = numCmp(a.TLBakiye13, b.TLBakiye13) + case "vade_gun": + cmp = numCmp(a.VadeGun, b.VadeGun) + case "vade_belge_tarihi_gun": + cmp = numCmp(a.VadeBelge, b.VadeBelge) + case "prbr_1_2": + cmp = numCmp(sumCurrencyMapForSort(a.Bakiye12Map), sumCurrencyMapForSort(b.Bakiye12Map)) + case "prbr_1_3": + cmp = numCmp(sumCurrencyMapForSort(a.Bakiye13Map), sumCurrencyMapForSort(b.Bakiye13Map)) + default: + cmp = textCmp(a.AnaCariKodu, b.AnaCariKodu) + } + + if cmp == 0 { + cmp = textCmp(a.AnaCariKodu, b.AnaCariKodu) + } + if descending { + return cmp > 0 + } + return cmp < 0 + }) +} + +func sumCurrencyMapForSort(m map[string]float64) float64 { + total := 0.0 + for _, v := range m { + total += v + } + return total +} + func drawCustomerBalancePDF( pdf *gofpdf.Fpdf, selectedDate string, diff --git a/svc/routes/statement_aging_pdf.go b/svc/routes/statement_aging_pdf.go index 2640dd5..f77d0ed 100644 --- a/svc/routes/statement_aging_pdf.go +++ b/svc/routes/statement_aging_pdf.go @@ -73,6 +73,9 @@ func ExportStatementAgingPDFHandler(_ *sql.DB) http.HandlerFunc { rows = filterCustomerBalanceRowsForPDF(rows, excludeZero12, excludeZero13) summaries, detailsByMaster := buildCustomerBalancePDFData(rows) + sortBy := strings.TrimSpace(r.URL.Query().Get("sort_by")) + sortDesc := parseBoolQuery(r.URL.Query().Get("sort_desc")) + sortBalanceSummariesForPDF(summaries, sortBy, sortDesc) pdf := gofpdf.New("L", "mm", "A4", "") pdf.SetMargins(8, 8, 8) diff --git a/ui/src/pages/AgingCustomerBalancelist.go.vue b/ui/src/pages/AgingCustomerBalancelist.go.vue index 6c27407..1e0c987 100644 --- a/ui/src/pages/AgingCustomerBalancelist.go.vue +++ b/ui/src/pages/AgingCustomerBalancelist.go.vue @@ -839,6 +839,8 @@ async function downloadAgingBalancePDF (detailed) { ilce: (store.filters.ilce || []).join(','), exclude_zero_12: store.filters.excludeZeroBalance12 ? '1' : '0', exclude_zero_13: store.filters.excludeZeroBalance13 ? '1' : '0', + sort_by: String(summaryPagination.value?.sortBy || ''), + sort_desc: summaryPagination.value?.descending ? '1' : '0', detailed: detailed ? '1' : '0' } diff --git a/ui/src/pages/CustomerBalanceList.vue b/ui/src/pages/CustomerBalanceList.vue index f253c8c..4aaa025 100644 --- a/ui/src/pages/CustomerBalanceList.vue +++ b/ui/src/pages/CustomerBalanceList.vue @@ -727,6 +727,8 @@ async function downloadCustomerBalancePDF (detailed) { ilce: (store.filters.ilce || []).join(','), exclude_zero_12: store.filters.excludeZeroBalance12 ? '1' : '0', exclude_zero_13: store.filters.excludeZeroBalance13 ? '1' : '0', + sort_by: String(summaryPagination.value?.sortBy || ''), + sort_desc: summaryPagination.value?.descending ? '1' : '0', detailed: detailed ? '1' : '0' }