This commit is contained in:
2026-04-11 12:12:07 +02:00
parent 3bc6e2e080
commit 5b3c5ebb2f
92 changed files with 10948 additions and 35 deletions

91
internal/fiscal/fiscal.go Normal file
View File

@@ -0,0 +1,91 @@
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()
}