feat: add deadline CRUD, calculator, and holiday services (Phase 1C)
- Holiday service with German federal holidays, Easter calculation, DB loading - Deadline calculator adapted from youpc.org (duration calc + non-working day adjustment) - Deadline CRUD service (tenant-scoped: list, create, update, complete, delete) - Deadline rule service (list, filter by proceeding type, hierarchical rule trees) - HTTP handlers for all endpoints with tenant resolution via X-Tenant-ID header - Router wired with all new endpoints under /api/ - Tests for holiday and calculator services (8 passing)
This commit is contained in:
58
backend/internal/handlers/deadline_rules.go
Normal file
58
backend/internal/handlers/deadline_rules.go
Normal file
@@ -0,0 +1,58 @@
|
||||
package handlers
|
||||
|
||||
import (
|
||||
"net/http"
|
||||
"strconv"
|
||||
|
||||
"mgit.msbls.de/m/KanzlAI-mGMT/internal/services"
|
||||
)
|
||||
|
||||
// DeadlineRuleHandlers holds handlers for deadline rule endpoints
|
||||
type DeadlineRuleHandlers struct {
|
||||
rules *services.DeadlineRuleService
|
||||
}
|
||||
|
||||
// NewDeadlineRuleHandlers creates deadline rule handlers
|
||||
func NewDeadlineRuleHandlers(rs *services.DeadlineRuleService) *DeadlineRuleHandlers {
|
||||
return &DeadlineRuleHandlers{rules: rs}
|
||||
}
|
||||
|
||||
// List handles GET /api/deadline-rules
|
||||
// Query params: proceeding_type_id (optional int filter)
|
||||
func (h *DeadlineRuleHandlers) List(w http.ResponseWriter, r *http.Request) {
|
||||
var proceedingTypeID *int
|
||||
if v := r.URL.Query().Get("proceeding_type_id"); v != "" {
|
||||
id, err := strconv.Atoi(v)
|
||||
if err != nil {
|
||||
writeError(w, http.StatusBadRequest, "invalid proceeding_type_id")
|
||||
return
|
||||
}
|
||||
proceedingTypeID = &id
|
||||
}
|
||||
|
||||
rules, err := h.rules.List(proceedingTypeID)
|
||||
if err != nil {
|
||||
writeError(w, http.StatusInternalServerError, "failed to list deadline rules")
|
||||
return
|
||||
}
|
||||
|
||||
writeJSON(w, http.StatusOK, rules)
|
||||
}
|
||||
|
||||
// GetRuleTree handles GET /api/deadline-rules/{type}
|
||||
// {type} is the proceeding type code (e.g., "INF", "REV")
|
||||
func (h *DeadlineRuleHandlers) GetRuleTree(w http.ResponseWriter, r *http.Request) {
|
||||
typeCode := r.PathValue("type")
|
||||
if typeCode == "" {
|
||||
writeError(w, http.StatusBadRequest, "proceeding type code required")
|
||||
return
|
||||
}
|
||||
|
||||
tree, err := h.rules.GetRuleTree(typeCode)
|
||||
if err != nil {
|
||||
writeError(w, http.StatusNotFound, "proceeding type not found")
|
||||
return
|
||||
}
|
||||
|
||||
writeJSON(w, http.StatusOK, tree)
|
||||
}
|
||||
Reference in New Issue
Block a user