Files
carvalho-finances/apps/api/internal/handler/pending_bill.go
T
Mlcavalho1andClaude Sonnet 4.6 2b8524dcde feat: #44 fatura de cartão com data futura fica pendente até confirmação
- Nova tabela pending_bill_imports (migration 016)
- ImportHandler.Confirm: quando is_credit_card=true e payment_date > hoje,
  salva como pending em vez de inserir transações
- Novos endpoints: GET /pending-bills, POST /pending-bills/:id/confirm,
  DELETE /pending-bills/:id
- Dashboard inclui pending_bill_imports no payload
- Frontend: resultado "fatura salva como pendente" no ImportView
- AccountsView exibe widget de faturas pendentes com ações de confirmar/descartar
- dashboard_test: mock de PendingBillRepo + TransactionRepository

Co-Authored-By: Claude Sonnet 4.6 <[email protected]>
2026-05-28 22:26:42 -03:00

60 lines
1.6 KiB
Go

package handler
import (
"net/http"
"strconv"
"github.com/go-chi/chi/v5"
"financeiro-carvalho/internal/service"
)
type PendingBillHandler struct {
svc *service.PendingBillService
gameSvc *service.GameService
}
func NewPendingBillHandler(svc *service.PendingBillService, gameSvc *service.GameService) *PendingBillHandler {
return &PendingBillHandler{svc: svc, gameSvc: gameSvc}
}
func (h *PendingBillHandler) List(w http.ResponseWriter, r *http.Request) {
items, err := h.svc.List(r.Context())
if err != nil {
respondError(w, http.StatusInternalServerError, "failed to list pending bills")
return
}
respondJSON(w, http.StatusOK, items)
}
func (h *PendingBillHandler) Confirm(w http.ResponseWriter, r *http.Request) {
id, err := strconv.Atoi(chi.URLParam(r, "id"))
if err != nil {
respondError(w, http.StatusBadRequest, "invalid id")
return
}
if err := h.svc.Confirm(r.Context(), id); err != nil {
if err == service.ErrPendingBillNotFound {
respondError(w, http.StatusNotFound, "pending bill not found")
return
}
respondError(w, http.StatusInternalServerError, "failed to confirm pending bill")
return
}
h.gameSvc.NotifyAction(r.Context(), "import_confirmed", map[string]any{"count": 1})
w.WriteHeader(http.StatusNoContent)
}
func (h *PendingBillHandler) Discard(w http.ResponseWriter, r *http.Request) {
id, err := strconv.Atoi(chi.URLParam(r, "id"))
if err != nil {
respondError(w, http.StatusBadRequest, "invalid id")
return
}
if err := h.svc.Discard(r.Context(), id); err != nil {
respondError(w, http.StatusInternalServerError, "failed to discard pending bill")
return
}
w.WriteHeader(http.StatusNoContent)
}