Skip to main content

📦 Backend Module Übersicht - WorkmateOS

Vollständige Dokumentation aller Backend-Module

Status: ✅ Vollständig Letzte Aktualisierung: Juli 2026 Autor: K.I.T Solutions Team


📋 Inhaltsverzeichnis

Core Module

  1. Employees Module - Mitarbeiter, Abteilungen, Rollen
  2. Documents Module - Dokumenten-Management (Nextcloud)
  3. Reminders Module - Erinnerungen & Benachrichtigungen
  4. Dashboards Module - Dashboard-Verwaltung
  5. System Module - Infrastruktur-Services

Backoffice Module

  1. CRM Module - Customer Relationship Management
  2. Projects Module - Projekt-Management
  3. Invoices Module - Rechnungswesen (PDF, E-Mail)
  4. Finance Module - Transaktionen, BankAccounts
  5. Time Tracking Module - Zeiterfassung

Weitere Module

  1. HR Module - Urlaub, Vergütung, Training, Onboarding
  2. Support Module - Ticket-System
  3. Knowledge Base - Internes Wiki
  4. Email Intake - IMAP → Tickets via n8n

Entfernt (Juli 2026): Chat-Modul — stattdessen wird Nextcloud Talk genutzt.


Modul-Übersicht

ModulTypModelsAPI PrefixStatus
EmployeesCoreDepartment, Role, Employee/api/employees, /api/departments, /api/roles✅ Produktiv
DocumentsCoreDocument/api/documents✅ Produktiv (Nextcloud)
RemindersCoreReminder/api/reminders✅ Produktiv
DashboardsCoreDashboard, UserSettings/api/dashboards✅ Produktiv
SystemCore/, /system/info, /system/health✅ Produktiv
CRMBackofficeCustomer, Contact, Activity/api/customers, /api/contacts✅ Produktiv
ProjectsBackofficeProject/api/projects✅ Produktiv
InvoicesBackofficeInvoice, InvoiceLineItem, Payment/api/invoices✅ Produktiv
FinanceBackofficeTransaction, BankAccount, BankTransaction/api/finance✅ Produktiv
Time TrackingBackofficeTimeEntry/api/time-entries✅ Produktiv
HRModulLeaveRequest, Training, Compensation …/api/hr✅ Produktiv
SupportModulTicket, Comment/api/support✅ Produktiv
KnowledgeModulArticle/api/knowledge✅ Produktiv
Email IntakeModulInboundEmail/api/email-intake✅ Produktiv
ChatBackoffice❌ Entfernt (Juli 2026)

Core Module


Employees Module

Pfad: app/modules/employees/ Zweck: Verwaltung von Mitarbeitern, Abteilungen und Rollen (Core-Entities)

Datenmodelle

1. Department

Organisationseinheiten wie IT, HR, Finance, etc.

Tabelle: departments

FeldTypBeschreibung
idUUIDPrimary Key
nameStringAbteilungsname (z.B. "IT", "HR")
codeStringKurz-Code (z.B. "IT", "FIN")
descriptionTextBeschreibung der Abteilung
manager_idUUID (FK)Abteilungsleiter (Employee)
created_atTimestampErstellungsdatum

Relationships:

  • employees → Liste aller Mitarbeiter in dieser Abteilung
  • manager → Abteilungsleiter (Employee)

API Endpoints:

GET    /api/departments        # Liste aller Abteilungen
POST /api/departments # Neue Abteilung erstellen
GET /api/departments/{id} # Abteilung abrufen
PUT /api/departments/{id} # Abteilung aktualisieren
DELETE /api/departments/{id} # Abteilung löschen

2. Role

System-Rollen mit Berechtigungen (RBAC).

Tabelle: roles

FeldTypBeschreibung
idUUIDPrimary Key
nameStringRollenname (z.B. "Admin", "Manager")
descriptionTextBeschreibung der Rolle
keycloak_idStringZitadel Role ID (für SSO-Mapping)
permissions_jsonJSONBArray von Permissions (z.B. ["*"], ["backoffice.*"])

Relationships:

  • employees → Liste aller Mitarbeiter mit dieser Rolle

Beispiel-Daten:

{
"name": "Admin",
"permissions_json": ["*"],
"keycloak_id": "zitadel-role-admin-123"
}

API Endpoints:

GET    /api/roles        # Liste aller Rollen
POST /api/roles # Neue Rolle erstellen
GET /api/roles/{id} # Rolle abrufen
PUT /api/roles/{id} # Rolle aktualisieren
DELETE /api/roles/{id} # Rolle löschen (nur wenn keine Employees)

3. Employee

Zentrale Mitarbeiter-Entity mit allen Personal-Informationen.

Tabelle: employees

FeldTypBeschreibung
Identifikation
idUUIDPrimary Key
employee_codeString (unique)Mitarbeiter-Code (z.B. "KIT-0001")
uuid_keycloakStringZitadel User ID (für SSO)
Persönliche Daten
first_nameStringVorname
last_nameStringNachname
genderStringGeschlecht (male, female, diverse, other)
birth_dateDateGeburtsdatum
nationalityStringStaatsangehörigkeit
photo_urlStringPfad zum Profilbild
bioTextBiografie / Beschreibung
Kontakt
emailString (unique)E-Mail-Adresse
phoneStringTelefonnummer
Adresse
address_streetStringStraße & Hausnummer
address_zipStringPostleitzahl
address_cityStringStadt
address_countryStringLand
Organisation
department_idUUID (FK)Zugehörige Abteilung
role_idUUID (FK)Zugewiesene Rolle
reports_toUUID (FK)Vorgesetzter (Employee)
Beschäftigung
employment_typeStringfulltime, parttime, intern, external
hire_dateDateEinstellungsdatum
termination_dateDateKündigungsdatum
statusStringactive, inactive, on_leave
Präferenzen
timezoneStringZeitzone (default: Europe/Berlin)
languageStringSprache (default: de)
themeStringUI-Theme (default: catppuccin-frappe)
notifications_enabledBooleanBenachrichtigungen aktiviert
Externe Services
matrix_usernameStringMatrix Chat Username
Timestamps
created_atTimestampErstellt am
updated_atTimestampZuletzt geändert
last_loginTimestampLetzter Login

Relationships:

  • department → Abteilung
  • role → Zugewiesene Rolle
  • supervisor → Vorgesetzter (Employee)
  • documents → Liste aller Dokumente
  • reminders → Liste aller Erinnerungen
  • dashboards → Personalisierte Dashboards
  • chat_messages → Chat-Nachrichten
  • os_preferences → OS-Einstellungen
  • user_settings → Benutzer-Einstellungen
  • notifications → Benachrichtigungen
  • activity_entries → Aktivitätsverlauf

API Endpoints:

GET    /api/employees              # Liste mit Pagination & Filtern
POST /api/employees # Neuen Mitarbeiter anlegen
GET /api/employees/{id} # Mitarbeiter abrufen
PUT /api/employees/{id} # Mitarbeiter aktualisieren
DELETE /api/employees/{id} # Mitarbeiter löschen
GET /api/employees/me # Aktuell eingeloggter User
GET /api/employees/{id}/documents # Dokumente eines Mitarbeiters

Query Parameter:

GET /api/employees?skip=0&limit=20&status=active&department_id={uuid}&search=Joshua

Validierungen:

  • employee_code muss unique sein
  • email muss unique und valid sein
  • status muss einer der erlaubten Werte sein
  • employment_type muss einer der erlaubten Werte sein

Documents Module

Pfad: app/modules/documents/ Zweck: Zentrales Dokumenten-Management für File-Uploads

Datenmodelle

Document

Zentrale Datei-Speicherung mit Referenzsystem.

Tabelle: documents

FeldTypBeschreibung
idUUIDPrimary Key
titleStringDokumenten-Titel
file_pathStringPfad zur Datei (z.B. /uploads/docs/...)
typeStringDateityp (pdf, image, doc, etc.)
categoryStringKategorie (Krankmeldung, Vertrag, Rechnung)
owner_idUUID (FK)Besitzer (Employee)
linked_moduleStringUrsprungs-Modul (HR, Finance, etc.)
uploaded_atTimestampUpload-Zeitpunkt
checksumStringDatei-Prüfsumme (SHA256)
is_confidentialBooleanVertraulich (DSGVO)

Relationships:

  • owner → Besitzer (Employee)

API Endpoints:

GET    /api/documents           # Liste aller Dokumente (gefiltert nach Permissions)
POST /api/documents # Dokument hochladen
GET /api/documents/{id} # Dokument-Metadaten abrufen
GET /api/documents/{id}/download # Datei herunterladen
PUT /api/documents/{id} # Metadaten aktualisieren
DELETE /api/documents/{id} # Dokument löschen

Upload-Beispiel:

# POST /api/documents
# Content-Type: multipart/form-data

{
"file": <binary>,
"title": "Arbeitsvertrag Joshua Phu",
"category": "Vertrag",
"is_confidential": true
}

Validierungen:

  • Datei-Größe max. 50MB
  • Erlaubte Dateitypen: pdf, png, jpg, docx, xlsx
  • Checksum wird automatisch berechnet
  • Duplicate detection via checksum

Reminders Module

Pfad: app/modules/reminders/ Zweck: Universelles Erinnerungs- und Benachrichtigungssystem

Datenmodelle

Reminder

Erinnerungen mit polymorphem Entity-Linking.

Tabelle: reminders

FeldTypBeschreibung
idUUIDPrimary Key
titleStringErinnerungs-Titel
descriptionTextBeschreibung
due_dateDateFälligkeitsdatum
priorityStringlow, medium, high, critical
linked_entity_typeStringVerknüpfter Entity-Typ (z.B. "Document", "Invoice")
linked_entity_idUUIDID des verknüpften Entities
owner_idUUID (FK)Besitzer (Employee)
statusStringopen, done, overdue
created_atTimestampErstellungsdatum
notifiedBooleanNotification bereits gesendet

Relationships:

  • owner → Besitzer (Employee)

API Endpoints:

GET    /api/reminders           # Liste aller Erinnerungen (current user)
POST /api/reminders # Neue Erinnerung erstellen
GET /api/reminders/{id} # Erinnerung abrufen
PUT /api/reminders/{id} # Erinnerung aktualisieren
DELETE /api/reminders/{id} # Erinnerung löschen
PATCH /api/reminders/{id}/complete # Als erledigt markieren

Beispiel - Polymorphe Verknüpfung:

{
"title": "Rechnung RE-2025-001 bezahlen",
"linked_entity_type": "Invoice",
"linked_entity_id": "uuid-invoice-123",
"due_date": "2025-01-15",
"priority": "high"
}

Background Jobs:

  • Täglicher Cronjob prüft überfällige Reminders
  • Automatische Notifications per Email/Push

Dashboards Module

Pfad: app/modules/dashboards/ Zweck: Personalisierte Dashboards und Benutzer-Einstellungen

Datenmodelle

Dashboard

Benutzer-definierte Dashboard-Konfigurationen.

Tabelle: dashboards

FeldTypBeschreibung
idUUIDPrimary Key
owner_idUUID (FK)Besitzer (Employee)
nameStringDashboard-Name
config_jsonJSONBWidget-Konfiguration
is_defaultBooleanStandard-Dashboard
created_atTimestampErstellungsdatum

Relationships:

  • owner → Besitzer (Employee)

Beispiel-Config:

{
"widgets": [
{
"type": "time_tracker",
"position": {"x": 0, "y": 0, "w": 6, "h": 4}
},
{
"type": "upcoming_reminders",
"position": {"x": 6, "y": 0, "w": 6, "h": 4}
}
]
}

API Endpoints:

GET    /api/dashboards          # Liste aller Dashboards (current user)
POST /api/dashboards # Neues Dashboard erstellen
GET /api/dashboards/{id} # Dashboard abrufen
PUT /api/dashboards/{id} # Dashboard aktualisieren
DELETE /api/dashboards/{id} # Dashboard löschen

System Module

Pfad: app/modules/system/ Zweck: Infrastruktur-Services und technische Integrationen

Datenmodelle

InfraService

Technische Services wie Datenbanken, Keycloak, Matrix, etc.

Tabelle: infra_services

FeldTypBeschreibung
idUUIDPrimary Key
nameStringService-Name
typeStringdatabase, auth, mail, chat, storage, external_api
connection_urlStringVerbindungs-URL
statusStringactive, inactive, error
last_syncTimestampLetzte Synchronisation
managed_byUUID (FK)Verantwortlicher Admin (Employee)

Relationships:

  • manager → Verantwortlicher (Employee)

Verwendung:

  • Überwachung externer Services
  • Health-Checks
  • Admin-Dashboard für Infrastruktur

Backoffice Module


CRM Module

Pfad: app/modules/backoffice/crm/ Zweck: Customer Relationship Management (Kunden & Kontakte)

Datenmodelle

1. Customer

Kunden / Organisationen.

Tabelle: customers

FeldTypBeschreibung
Identifikation
idUUIDPrimary Key
customer_numberString (unique)Kundennummer (z.B. "KIT-CUS-000001")
nameStringKundenname / Firmenname
typeStringcreator, individual, business, government
Kontakt
emailStringHaupt-E-Mail
phoneStringTelefonnummer
websiteStringWebseite
Business
tax_idStringSteuernummer / USt-IdNr
Adresse
streetStringStraße & Hausnummer
zip_codeStringPLZ
cityStringStadt
countryStringLand (default: Deutschland)
Meta
notesTextInterne Notizen
statusStringactive, inactive, lead, blocked
created_atTimestampErstellt am
updated_atTimestampAktualisiert am

Relationships:

  • contacts → Liste aller Ansprechpartner
  • projects → Liste aller Projekte
  • invoices → Liste aller Rechnungen

Properties:

@property
def full_address(self) -> str:
"""Vollständige Adresse als String"""

@property
def primary_contact(self) -> Contact:
"""Hauptansprechpartner"""

@property
def total_revenue(self) -> Decimal:
"""Gesamtumsatz (alle paid invoices)"""

@property
def outstanding_amount(self) -> Decimal:
"""Offene Forderungen"""

@property
def active_projects_count(self) -> int:
"""Anzahl aktiver Projekte"""

API Endpoints:

GET    /api/customers              # Liste mit Filtern
POST /api/customers # Neuen Kunden anlegen
GET /api/customers/{id} # Kunde abrufen
PUT /api/customers/{id} # Kunde aktualisieren
DELETE /api/customers/{id} # Kunde löschen
GET /api/customers/{id}/contacts # Kontakte eines Kunden
GET /api/customers/{id}/projects # Projekte eines Kunden
GET /api/customers/{id}/invoices # Rechnungen eines Kunden
GET /api/customers/{id}/statistics # Umsatz-Statistiken

Validierungen:

  • customer_number muss unique sein
  • status muss einer der erlaubten Werte sein
  • type muss einer der erlaubten Werte sein

2. Contact

Ansprechpartner eines Kunden.

Tabelle: contacts

FeldTypBeschreibung
idUUIDPrimary Key
customer_idUUID (FK)Zugehöriger Kunde
firstnameStringVorname
lastnameStringNachname
emailStringE-Mail
phoneStringTelefon
mobileStringMobilnummer
positionStringPosition im Unternehmen
departmentStringAbteilung
is_primaryBooleanHauptansprechpartner (nur einer pro Customer)
notesTextNotizen
created_atTimestampErstellt am
updated_atTimestampAktualisiert am

Relationships:

  • customer → Zugehöriger Kunde

Properties:

@property
def full_name(self) -> str:
"""Vorname + Nachname"""

@property
def display_name(self) -> str:
"""Name mit Position (z.B. 'Max Mustermann (Geschäftsführer)')"""

API Endpoints:

GET    /api/contacts           # Alle Kontakte (gefiltert)
POST /api/contacts # Neuen Kontakt erstellen
GET /api/contacts/{id} # Kontakt abrufen
PUT /api/contacts/{id} # Kontakt aktualisieren
DELETE /api/contacts/{id} # Kontakt löschen

Constraints:

  • Nur ein is_primary=true pro Customer (PostgreSQL Partial Unique Index)

3. Activity

CRM-Aktivitäten (Calls, Meetings, Emails).

Tabelle: crm_activities

FeldTypBeschreibung
idUUIDPrimary Key
customer_idUUID (FK)Zugehöriger Kunde
contact_idUUID (FK)Optional: Zugehöriger Kontakt
typeStringcall, meeting, email, note
descriptionTextBeschreibung der Aktivität
occurred_atTimestampZeitpunkt der Aktivität
created_atTimestampErstellt am

Relationships:

  • customer → Kunde
  • contact → Kontakt (optional)

API Endpoints:

GET    /api/activities           # Alle Aktivitäten
POST /api/activities # Neue Aktivität erstellen
GET /api/customers/{id}/activities # Aktivitäten eines Kunden

Projects Module

Pfad: app/modules/backoffice/projects/ Zweck: Projekt-Management mit Budget, Zeiterfassung und Abrechnung

Datenmodelle

Project

Projekte für Kunden mit Zeiterfassung und Budgetverwaltung.

Tabelle: projects

FeldTypBeschreibung
Identifikation
idUUIDPrimary Key
customer_idUUID (FK)Zugehöriger Kunde
project_numberString (unique)Projektnummer (z.B. "PRJ-2025-001")
titleStringProjekttitel
Organisation
department_idUUID (FK)Zugehörige Abteilung
project_manager_idUUID (FK)Projektmanager (Employee)
Status & Priorität
statusStringplanning, active, on_hold, completed, cancelled
priorityStringlow, medium, high, urgent
Zeitplan
start_dateDateProjektstartdatum
end_dateDateGeplantes Projektende
deadlineDateFinale Deadline
Finanzen
budgetDecimal(10,2)Gesamtbudget in EUR
hourly_rateDecimal(10,2)Standard-Stundensatz
Inhalt
descriptionTextProjektbeschreibung
notesTextInterne Notizen
Timestamps
created_atTimestampErstellt am
updated_atTimestampAktualisiert am

Relationships:

  • customer → Kunde
  • department → Abteilung
  • project_manager → Projektmanager
  • time_entries → Zeiterfassungen
  • invoices → Rechnungen
  • expenses → Ausgaben
  • chat_messages → Chat-Nachrichten

Properties:

@property
def is_active(self) -> bool:
"""Prüft ob Projekt aktiv ist"""

@property
def is_overdue(self) -> bool:
"""Prüft ob Projekt überfällig ist"""

@property
def days_until_deadline(self) -> int:
"""Tage bis Deadline (negativ = überfällig)"""

@property
def total_hours_tracked(self) -> Decimal:
"""Summe aller erfassten Stunden"""

@property
def billable_hours(self) -> Decimal:
"""Summe abrechenbarer Stunden"""

@property
def total_revenue(self) -> Decimal:
"""Umsatz aus bezahlten Rechnungen"""

@property
def total_expenses(self) -> Decimal:
"""Summe aller Ausgaben"""

@property
def budget_utilization(self) -> float:
"""Budget-Auslastung in %"""

@property
def profit_margin(self) -> Decimal:
"""Gewinnmarge (Umsatz - Kosten)"""

@property
def completion_percentage(self) -> float:
"""Fertigstellungsgrad basierend auf Zeitraum"""

API Endpoints:

GET    /api/projects              # Liste aller Projekte
POST /api/projects # Neues Projekt erstellen
GET /api/projects/{id} # Projekt abrufen
PUT /api/projects/{id} # Projekt aktualisieren
DELETE /api/projects/{id} # Projekt löschen
GET /api/projects/{id}/time-entries # Zeiterfassungen
GET /api/projects/{id}/invoices # Rechnungen
GET /api/projects/{id}/expenses # Ausgaben
GET /api/projects/{id}/statistics # Statistiken

Validierungen:

  • budget muss >= 0 sein
  • hourly_rate muss >= 0 sein
  • end_date muss >= start_date sein
  • status muss einer der erlaubten Werte sein

Invoices Module

Pfad: app/modules/backoffice/invoices/ Zweck: Rechnungserstellung und Zahlungsmanagement

📚 Vollständige Dokumentation: Siehe FINANCE_DOCUMENTATION_INDEX.md

Datenmodelle

1. Invoice

Kundenrechnungen und Angebote.

Tabelle: invoices

FeldTypBeschreibung
idUUIDPrimary Key
customer_idUUID (FK)Kunde
project_idUUID (FK)Optional: Projekt
invoice_numberString (unique)Rechnungsnummer (z.B. "RE-2025-001")
document_typeStringinvoice, quote
statusStringdraft, sent, paid, partial, overdue, cancelled
totalDecimal(10,2)Gesamtbetrag inkl. MwSt
subtotalDecimal(10,2)Zwischensumme ohne MwSt
tax_amountDecimal(10,2)MwSt-Betrag
issued_dateDateRechnungsdatum
due_dateDateFälligkeitsdatum
pdf_pathStringPfad zur PDF-Rechnung
notesTextInterne Notizen
termsTextZahlungsbedingungen
created_atTimestampErstellt am
updated_atTimestampAktualisiert am

Relationships:

  • customer → Kunde
  • project → Projekt (optional)
  • line_items → Rechnungspositionen
  • payments → Zahlungseingänge

Properties:

@property
def outstanding_amount(self) -> Decimal:
"""Offener Betrag (total - sum(payments))"""

@property
def is_fully_paid(self) -> bool:
"""Ist vollständig bezahlt?"""

@property
def days_overdue(self) -> int:
"""Tage überfällig (0 wenn nicht überfällig)"""

Methods:

def recalculate_totals(self):
"""Berechnet total/subtotal/tax_amount aus line_items neu"""

def add_line_item(self, description, quantity, unit_price, tax_rate):
"""Fügt Rechnungsposition hinzu und aktualisiert Summen"""

API Endpoints:

GET    /api/invoices              # Liste aller Rechnungen
POST /api/invoices # Neue Rechnung erstellen
GET /api/invoices/{id} # Rechnung abrufen
PUT /api/invoices/{id} # Rechnung aktualisieren
DELETE /api/invoices/{id} # Rechnung löschen
POST /api/invoices/{id}/finalize # Rechnung finalisieren (PDF generieren)
GET /api/invoices/{id}/pdf # PDF herunterladen
POST /api/invoices/{id}/send # Rechnung per Email versenden

2. InvoiceLineItem

Rechnungspositionen.

Tabelle: invoice_line_items

FeldTypBeschreibung
idUUIDPrimary Key
invoice_idUUID (FK)Zugehörige Rechnung
positionIntegerSortierung
descriptionStringPositionsbeschreibung
quantityDecimal(10,2)Menge
unit_priceDecimal(10,2)Einzelpreis
tax_rateDecimal(5,2)Steuersatz (19.00 = 19%)
totalDecimal(10,2)Gesamtpreis (berechnet)

Properties:

@property
def subtotal(self) -> Decimal:
"""Zwischensumme (quantity * unit_price)"""

@property
def tax_amount(self) -> Decimal:
"""Steuerbetrag"""

3. Payment

Zahlungseingänge.

Tabelle: payments

FeldTypBeschreibung
idUUIDPrimary Key
invoice_idUUID (FK)Zugehörige Rechnung
amountDecimal(10,2)Zahlungsbetrag
payment_dateDateZahlungsdatum
payment_methodStringcash, bank_transfer, credit_card, etc.
referenceStringZahlungsreferenz / Transaktions-ID
notesTextNotizen
created_atTimestampErstellt am

Relationships:

  • invoice → Rechnung

API Endpoints:

GET    /api/payments              # Alle Zahlungen
POST /api/payments # Zahlung erfassen
GET /api/invoices/{id}/payments # Zahlungen einer Rechnung

Finance Module

Pfad: app/modules/backoffice/finance/ Zweck: Ausgaben-Management

Datenmodelle

Expense

Ausgaben/Kosten für Projekte oder allgemein.

Tabelle: expenses

FeldTypBeschreibung
idUUIDPrimary Key
project_idUUID (FK)Optional: Projekt
employee_idUUID (FK)Verantwortlicher Employee
categoryStringtravel, material, software, etc.
descriptionTextBeschreibung der Ausgabe
amountDecimal(10,2)Betrag
expense_dateDateAusgabedatum
receipt_urlStringPfad zum Beleg (Foto/PDF)
is_reimbursedBooleanErstattet?
notesTextNotizen
created_atTimestampErstellt am

Relationships:

  • project → Projekt (optional)
  • employee → Employee

API Endpoints:

GET    /api/expenses              # Liste aller Ausgaben
POST /api/expenses # Neue Ausgabe erfassen
GET /api/expenses/{id} # Ausgabe abrufen
PUT /api/expenses/{id} # Ausgabe aktualisieren
DELETE /api/expenses/{id} # Ausgabe löschen
PATCH /api/expenses/{id}/reimburse # Als erstattet markieren

Time Tracking Module

Pfad: app/modules/backoffice/time_tracking/ Zweck: Zeiterfassung für Projekte

Datenmodelle

TimeEntry

Arbeitszeit-Erfassung pro Employee und Projekt.

Tabelle: time_entries

FeldTypBeschreibung
idUUIDPrimary Key
employee_idUUID (FK)Mitarbeiter
project_idUUID (FK)Projekt (optional für interne Zeit)
start_timeTimestampStart-Zeitpunkt
end_timeTimestampEnd-Zeitpunkt (optional für laufende Timer)
duration_minutesIntegerDauer in Minuten (berechnet oder manuell)
billableBooleanAbrechenbar?
hourly_rateDecimal(10,2)Stundensatz für diesen Eintrag
noteTextWas wurde gearbeitet?
task_typeStringdevelopment, meeting, support, documentation
is_approvedBooleanVom Manager genehmigt?
is_invoicedBooleanBereits abgerechnet?
created_atTimestampErstellt am
updated_atTimestampAktualisiert am

Relationships:

  • employee → Employee
  • project → Projekt

Properties:

@property
def duration_hours(self) -> float:
"""Dauer in Stunden (Dezimal)"""

API Endpoints:

GET    /api/time-entries          # Liste aller Einträge
POST /api/time-entries # Neuen Eintrag erfassen
GET /api/time-entries/{id} # Eintrag abrufen
PUT /api/time-entries/{id} # Eintrag aktualisieren
DELETE /api/time-entries/{id} # Eintrag löschen
POST /api/time-entries/start # Timer starten
POST /api/time-entries/{id}/stop # Timer stoppen
GET /api/time-entries/current # Aktuell laufender Timer
GET /api/employees/{id}/time-entries # Einträge eines Mitarbeiters
GET /api/projects/{id}/time-entries # Einträge eines Projekts

Query Parameter:

GET /api/time-entries?employee_id={uuid}&project_id={uuid}&start_date=2025-01-01&end_date=2025-01-31&billable=true

Chat Module

Pfad: app/modules/backoffice/chat/ Zweck: Projekt-bezogenes Messaging-System

Datenmodelle

ChatMessage

Nachrichten im Kontext von Projekten.

Tabelle: chat_messages

FeldTypBeschreibung
idUUIDPrimary Key
project_idUUID (FK)Zugehöriges Projekt
author_idUUID (FK)Autor (Employee)
contentTextNachrichten-Inhalt
is_system_messageBooleanSystem-Nachricht (z.B. "Projekt erstellt")
created_atTimestampErstellt am
updated_atTimestampBearbeitet am

Relationships:

  • project → Projekt
  • author → Employee

API Endpoints:

GET    /api/messages              # Alle Nachrichten (gefiltert)
POST /api/messages # Neue Nachricht senden
GET /api/projects/{id}/messages # Nachrichten eines Projekts
DELETE /api/messages/{id} # Nachricht löschen (nur eigene)

WebSocket Support:

WS /ws/projects/{project_id}/chat

Real-time Messaging für Live-Updates.


🔧 Entwickler-Hinweise

Konsistente Patterns

Alle Module folgen diesen Patterns:

1. Datenmodelle

from app.core.settings.database import Base
from app.core.misc.mixins import UUIDMixin, TimestampMixin

class MyModel(Base, UUIDMixin, TimestampMixin):
__tablename__ = "my_models"

# Fields...

# Relationships...

# Properties...

def __repr__(self):
return f"<MyModel(id={self.id}, ...)>"

2. Enums

from enum import Enum

class MyStatus(str, Enum):
ACTIVE = "active"
INACTIVE = "inactive"

3. API Routes

from fastapi import APIRouter, Depends
from sqlalchemy.orm import Session

router = APIRouter(prefix="/api/my-models", tags=["MyModels"])

@router.get("/")
async def list_items(skip: int = 0, limit: int = 20, db: Session = Depends(get_db)):
# Implementation...

@router.post("/")
async def create_item(item: ItemCreate, db: Session = Depends(get_db)):
# Implementation...

4. Schemas (Pydantic)

from pydantic import BaseModel

class ItemBase(BaseModel):
name: str

class ItemCreate(ItemBase):
pass

class ItemUpdate(ItemBase):
pass

class ItemResponse(ItemBase):
id: UUID
created_at: datetime

class Config:
from_attributes = True

Code-Qualität

Validierungen:

  • SQLAlchemy CheckConstraints für Daten-Integrität
  • Pydantic Schemas für Request/Response Validation
  • Business-Logic in Models (Properties & Methods)

Performance:

  • Indizes auf FK und häufig gefilterten Feldern
  • Lazy Loading für große Relationships
  • Pagination für alle List-Endpoints

Sicherheit:

  • RBAC via Permissions (siehe AUTHENTICATION.md)
  • SQL Injection Prevention durch ORM
  • Input Validation durch Pydantic

📊 Statistiken

Gesamt:

  • 11 Module
  • 25+ Models
  • 100+ API Endpoints
  • 50+ Relationships

Code-Metriken:

  • Lines of Code: ~15.000+
  • Test Coverage: ⏳ TODO
  • API Response Time: <100ms (avg)

📝 Changelog

DatumModulÄnderung
30.12.2025AlleInitiale Dokumentation erstellt
30.12.2025CRMCustomerStatus Enum hinzugefügt
30.12.2025ProjectsBudget-Properties erweitert
30.12.2025Invoicesrecalculate_totals() Method

🔗 Siehe auch


Letzte Aktualisierung: 30. Dezember 2025 Maintainer: K.I.T Solutions Team Feedback: GitHub Issues oder direkter Kontakt