feat: perinco Pulse - Zeiterfassung fuer perinco

Erste Fassung, live unter https://pulse.perinco.de.

Frontend React 19 + TypeScript + Tailwind 4 (Vite), Backend Express mit
mysql2 auf MariaDB, Exporte als PDF (pdfkit), Excel (exceljs) und CSV.
Aufbau, Designsystem und die sieben Themes kommen aus dem perinco CRM.

Fachlich:
- Buchung mit Wochen-, Monats- und Jahresansicht, Zeiten als 1:23 oder 1,5
- Projekte mit n Budgettoepfen: Laufzeit, Volumen, Sperre bei Ablauf oder
  aufgebrauchtem Budget, Buchung nur auf den passenden Topf
- Kunden, Team mit Hierarchie, Reports im Harvest-Stil, Monatsexporte
- Rollen user/lead/management/admin, doppelt geprueft (Menue und Backend)
- SSO gegen Microsoft Entra ID, Uebernahme der AD-Benutzer per Drag & Drop

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
schakal00783
2026-09-17 22:52:20 +02:00
co-authored by Claude Opus 5
commit ef676a95f4
104 changed files with 21030 additions and 0 deletions
+26
View File
@@ -0,0 +1,26 @@
[Unit]
Description=perinco Pulse Backend (Express + MariaDB)
After=network.target mariadb.service
Wants=mariadb.service
[Service]
Type=simple
# Eigener Systembenutzer ohne Login - das Backend braucht keine Root-Rechte.
User=pulse
Group=pulse
WorkingDirectory=/var/www/pulse/server
EnvironmentFile=/var/www/pulse/server/.env
# Server laeuft auf UTC; "heute", Monatsgrenzen und Ablaufdaten gelten in Berlin.
Environment=TZ=Europe/Berlin
Environment=NODE_ENV=production
ExecStart=/usr/bin/node src/server.js
Restart=on-failure
RestartSec=5
# Sicherheitsnetz: ein Leck soll Apache, MariaDB und das ICON CRM nicht mitreissen.
MemoryMax=768M
NoNewPrivileges=true
ProtectSystem=full
PrivateTmp=true
[Install]
WantedBy=multi-user.target