feat: time tracking + billing — hourly rates, time entries, invoices (P1)
Database: time_entries, billing_rates, invoices tables with RLS.
Backend: CRUD services+handlers for time entries, billing rates, invoices.
- Time entries: list/create/update/delete, summary by case/user/month
- Billing rates: upsert with auto-close previous, current rate lookup
- Invoices: create with auto-number (RE-YYYY-NNN), status transitions
(draft->sent->paid, cancellation), link time entries on invoice create
API: 11 new endpoints under /api/time-entries, /api/billing-rates, /api/invoices
Frontend: Zeiterfassung tab on case detail, /abrechnung overview with filters,
/abrechnung/rechnungen list+detail with status actions, billing rates settings
Also: resolved merge conflicts between audit-trail and role-based branches,
added missing types (Notification, AuditLogResponse, NotificationPreferences)
This commit is contained in:
24
backend/internal/models/time_entry.go
Normal file
24
backend/internal/models/time_entry.go
Normal file
@@ -0,0 +1,24 @@
|
||||
package models
|
||||
|
||||
import (
|
||||
"time"
|
||||
|
||||
"github.com/google/uuid"
|
||||
)
|
||||
|
||||
type TimeEntry struct {
|
||||
ID uuid.UUID `db:"id" json:"id"`
|
||||
TenantID uuid.UUID `db:"tenant_id" json:"tenant_id"`
|
||||
CaseID uuid.UUID `db:"case_id" json:"case_id"`
|
||||
UserID uuid.UUID `db:"user_id" json:"user_id"`
|
||||
Date string `db:"date" json:"date"`
|
||||
DurationMinutes int `db:"duration_minutes" json:"duration_minutes"`
|
||||
Description string `db:"description" json:"description"`
|
||||
Activity *string `db:"activity" json:"activity,omitempty"`
|
||||
Billable bool `db:"billable" json:"billable"`
|
||||
Billed bool `db:"billed" json:"billed"`
|
||||
InvoiceID *uuid.UUID `db:"invoice_id" json:"invoice_id,omitempty"`
|
||||
HourlyRate *float64 `db:"hourly_rate" json:"hourly_rate,omitempty"`
|
||||
CreatedAt time.Time `db:"created_at" json:"created_at"`
|
||||
UpdatedAt time.Time `db:"updated_at" json:"updated_at"`
|
||||
}
|
||||
Reference in New Issue
Block a user