feat(05-01): template query functions and updated budget item queries with item_tier

- Add BudgetExistsError struct and ErrBudgetExists sentinel
- Update GetBudgetWithItems, CopyBudgetItems to include item_tier
- Update CreateBudgetItem/UpdateBudgetItem signatures to accept itemTier (default one_off)
- Add GetTemplate, UpdateTemplateName, CreateTemplateItem, UpdateTemplateItem, DeleteTemplateItem
- Add ReorderTemplateItems with transaction
- Add GenerateBudgetFromTemplate with duplicate-month detection and locale-aware naming
- Update handlers to pass ItemTier from request body (Rule 3 fix - blocking compile)
This commit is contained in:
2026-03-12 12:06:43 +01:00
parent b3082ca14f
commit f9dd40984c
2 changed files with 330 additions and 17 deletions

View File

@@ -385,13 +385,14 @@ func (h *Handlers) CreateBudgetItem(w http.ResponseWriter, r *http.Request) {
BudgetedAmount decimal.Decimal `json:"budgeted_amount"`
ActualAmount decimal.Decimal `json:"actual_amount"`
Notes string `json:"notes"`
ItemTier models.ItemTier `json:"item_tier"`
}
if err := decodeJSON(r, &req); err != nil {
writeError(w, http.StatusBadRequest, "invalid request body")
return
}
item, err := h.queries.CreateBudgetItem(r.Context(), budgetID, req.CategoryID, req.BudgetedAmount, req.ActualAmount, req.Notes)
item, err := h.queries.CreateBudgetItem(r.Context(), budgetID, req.CategoryID, req.BudgetedAmount, req.ActualAmount, req.Notes, req.ItemTier)
if err != nil {
writeError(w, http.StatusInternalServerError, "failed to create budget item")
return
@@ -415,13 +416,14 @@ func (h *Handlers) UpdateBudgetItem(w http.ResponseWriter, r *http.Request) {
BudgetedAmount decimal.Decimal `json:"budgeted_amount"`
ActualAmount decimal.Decimal `json:"actual_amount"`
Notes string `json:"notes"`
ItemTier models.ItemTier `json:"item_tier"`
}
if err := decodeJSON(r, &req); err != nil {
writeError(w, http.StatusBadRequest, "invalid request body")
return
}
item, err := h.queries.UpdateBudgetItem(r.Context(), itemID, budgetID, req.BudgetedAmount, req.ActualAmount, req.Notes)
item, err := h.queries.UpdateBudgetItem(r.Context(), itemID, budgetID, req.BudgetedAmount, req.ActualAmount, req.Notes, req.ItemTier)
if err != nil {
writeError(w, http.StatusNotFound, "budget item not found")
return