92 lines
2.4 KiB
Go
92 lines
2.4 KiB
Go
package fiscal
|
|
|
|
import (
|
|
"encoding/csv"
|
|
"encoding/json"
|
|
"fmt"
|
|
"net/http"
|
|
"strconv"
|
|
"time"
|
|
|
|
"github.com/f4bpo/rental-manager/internal/document"
|
|
"github.com/f4bpo/rental-manager/internal/transaction"
|
|
)
|
|
|
|
type Handler struct {
|
|
txStore *transaction.Store
|
|
docStore *document.Store
|
|
}
|
|
|
|
func NewHandler(txStore *transaction.Store, docStore *document.Store) *Handler {
|
|
return &Handler{txStore: txStore, docStore: docStore}
|
|
}
|
|
|
|
func (h *Handler) Summary(w http.ResponseWriter, r *http.Request) {
|
|
q := r.URL.Query()
|
|
year := q.Get("year")
|
|
if year == "" {
|
|
year = strconv.Itoa(time.Now().Year())
|
|
}
|
|
summaries, err := h.txStore.GetSummary(q.Get("property_id"), year, "")
|
|
if err != nil {
|
|
http.Error(w, err.Error(), http.StatusInternalServerError)
|
|
return
|
|
}
|
|
if summaries == nil {
|
|
summaries = []transaction.Summary{}
|
|
}
|
|
w.Header().Set("Content-Type", "application/json")
|
|
json.NewEncoder(w).Encode(summaries)
|
|
}
|
|
|
|
func (h *Handler) Export(w http.ResponseWriter, r *http.Request) {
|
|
q := r.URL.Query()
|
|
propertyID := q.Get("property_id")
|
|
yearStr := q.Get("year")
|
|
if yearStr == "" {
|
|
yearStr = strconv.Itoa(time.Now().Year())
|
|
}
|
|
|
|
// List() gère correctement propertyID vide et year en string
|
|
txs, err := h.txStore.List(propertyID, "", yearStr, "")
|
|
if err != nil {
|
|
http.Error(w, err.Error(), http.StatusInternalServerError)
|
|
return
|
|
}
|
|
|
|
propLabel := propertyID
|
|
if propLabel == "" {
|
|
propLabel = "tous"
|
|
}
|
|
filename := fmt.Sprintf("export_fiscal_%s_%s.csv", propLabel, yearStr)
|
|
w.Header().Set("Content-Type", "text/csv; charset=utf-8")
|
|
w.Header().Set("Content-Disposition", fmt.Sprintf(`attachment; filename="%s"`, filename))
|
|
|
|
w.Write([]byte{0xEF, 0xBB, 0xBF}) // BOM UTF-8 pour Excel
|
|
|
|
cw := csv.NewWriter(w)
|
|
cw.Comma = ';'
|
|
cw.Write([]string{"Date", "Type", "Catégorie", "Description", "Montant (€)", "Bien"})
|
|
|
|
var totalIncome, totalExpense float64
|
|
for _, t := range txs {
|
|
typeLabel := "Revenu"
|
|
if t.Type == "expense" {
|
|
typeLabel = "Dépense"
|
|
totalExpense += t.Amount
|
|
} else {
|
|
totalIncome += t.Amount
|
|
}
|
|
cw.Write([]string{
|
|
t.Date, typeLabel, t.CategoryName,
|
|
t.Description, fmt.Sprintf("%.2f", t.Amount), t.PropertyName,
|
|
})
|
|
}
|
|
|
|
cw.Write([]string{})
|
|
cw.Write([]string{"", "", "", "TOTAL REVENUS", fmt.Sprintf("%.2f", totalIncome), ""})
|
|
cw.Write([]string{"", "", "", "TOTAL DÉPENSES", fmt.Sprintf("%.2f", totalExpense), ""})
|
|
cw.Write([]string{"", "", "", "BÉNÉFICE NET", fmt.Sprintf("%.2f", totalIncome-totalExpense), ""})
|
|
cw.Flush()
|
|
}
|