172 lines
3.2 KiB
Go
172 lines
3.2 KiB
Go
package routes
|
||
|
||
import (
|
||
"bssapp-backend/queries"
|
||
"database/sql"
|
||
"fmt"
|
||
"net/http"
|
||
"time"
|
||
|
||
"github.com/xuri/excelize/v2"
|
||
)
|
||
|
||
func OrderListExcelRoute(db *sql.DB) http.Handler {
|
||
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
|
||
|
||
w.Header().Set("Cache-Control", "no-store")
|
||
|
||
// ======================
|
||
// PARAMS
|
||
// ======================
|
||
search := r.URL.Query().Get("search")
|
||
currAcc := r.URL.Query().Get("CurrAccCode")
|
||
orderDate := r.URL.Query().Get("OrderDate")
|
||
|
||
// ======================
|
||
// QUERY
|
||
// ======================
|
||
rows, err := queries.GetOrderListExcel(db, search, currAcc, orderDate)
|
||
if err != nil {
|
||
http.Error(w, err.Error(), 500)
|
||
return
|
||
}
|
||
defer rows.Close()
|
||
|
||
// ======================
|
||
// EXCEL INIT
|
||
// ======================
|
||
f := excelize.NewFile()
|
||
sheet := "Orders"
|
||
f.SetSheetName("Sheet1", sheet)
|
||
|
||
// ======================
|
||
// HEADERS
|
||
// ======================
|
||
headers := []string{
|
||
"Sipariş No",
|
||
"Tarih",
|
||
"Cari Kod",
|
||
"Cari Adı",
|
||
"Temsilci",
|
||
"Piyasa",
|
||
"PB",
|
||
"Tutar",
|
||
"Tutar (USD)",
|
||
"Paketlenen Tutar",
|
||
"Paketlenen (USD)",
|
||
"Paketlenme (%)",
|
||
"USD Kur",
|
||
"Açıklama",
|
||
}
|
||
|
||
for i, h := range headers {
|
||
cell, _ := excelize.CoordinatesToCellName(i+1, 1)
|
||
f.SetCellValue(sheet, cell, h)
|
||
}
|
||
|
||
// ======================
|
||
// ROWS
|
||
// ======================
|
||
row := 2
|
||
|
||
for rows.Next() {
|
||
|
||
// 🔴 15 KOLON = 15 DEĞİŞKEN
|
||
var (
|
||
id, no, date, code, name string
|
||
rep, piyasa, cur string
|
||
|
||
total float64
|
||
totalUSD float64
|
||
packedAmount float64
|
||
packedUSD float64
|
||
packedRatePct float64
|
||
usdRate float64
|
||
|
||
desc string
|
||
)
|
||
|
||
// 🔴 SELECT SIRASIYLA BİREBİR
|
||
err := rows.Scan(
|
||
&id, // 1
|
||
&no, // 2
|
||
&date, // 3
|
||
&code, // 4
|
||
&name, // 5
|
||
&rep, // 6
|
||
&piyasa, // 7
|
||
&cur, // 8
|
||
&total, // 9
|
||
&totalUSD, // 10
|
||
&packedAmount, // 11
|
||
&packedUSD, // 12
|
||
&packedRatePct, // 13
|
||
&desc, // 14
|
||
&usdRate, // 15
|
||
)
|
||
|
||
if err != nil {
|
||
http.Error(w, "Scan error: "+err.Error(), 500)
|
||
return
|
||
}
|
||
|
||
// ======================
|
||
// WRITE ROW
|
||
// ======================
|
||
f.SetSheetRow(sheet, fmt.Sprintf("A%d", row), &[]any{
|
||
no,
|
||
date,
|
||
code,
|
||
name,
|
||
rep,
|
||
piyasa,
|
||
cur,
|
||
total,
|
||
totalUSD,
|
||
packedAmount,
|
||
packedUSD,
|
||
packedRatePct,
|
||
usdRate,
|
||
desc,
|
||
})
|
||
|
||
row++
|
||
}
|
||
|
||
// ======================
|
||
// BUFFER WRITE
|
||
// ======================
|
||
buf, err := f.WriteToBuffer()
|
||
if err != nil {
|
||
http.Error(w, err.Error(), 500)
|
||
return
|
||
}
|
||
|
||
filename := fmt.Sprintf(
|
||
"siparis_listesi_%s.xlsx",
|
||
time.Now().Format("20060102_150405"),
|
||
)
|
||
|
||
// ======================
|
||
// RESPONSE
|
||
// ======================
|
||
w.Header().Set(
|
||
"Content-Type",
|
||
"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",
|
||
)
|
||
|
||
w.Header().Set(
|
||
"Content-Disposition",
|
||
"attachment; filename=\""+filename+"\"",
|
||
)
|
||
|
||
w.Header().Set(
|
||
"Content-Length",
|
||
fmt.Sprint(len(buf.Bytes())),
|
||
)
|
||
|
||
w.WriteHeader(http.StatusOK)
|
||
_, _ = w.Write(buf.Bytes())
|
||
})
|
||
}
|