Entwickler-Dokumentation
Aufbau, lokale Entwicklung, Tests und Erweiterungspunkte von digisoft-bilanz (privates Repo digi-soft-ug/digisoft-bilanz).
Architektur
CSV --> Import\CsvTrialBalanceImporter --> Domain\TrialBalance (Cent, Soll +, Haben -)
|
Mapping\Skr03Mapper --> Engine\BalanceSheetBuilder --> BalanceSheet
| |
Engine\Validator (Issues) Render\BalanceSheetPdf / BalanceSheetXml
|
Submit\Submitter (ManualUploadExport)
- Domain:
Money(ganzzahlige Cent, strenges Parsen),Position(Buchstabenposten § 266 HGB),Company,Issue. - Engine: reine Funktionen ohne I/O; Fehlseiten werden je Konto umklassifiziert, negatives Eigenkapital wird zu Aktiva F.
- Web: NikanzoPHP (Kernel, Router, Container, CSRF- und Security-Header-Middleware, Stand dev-master);
Controller/*(Routen per Attribut),Auth(Hub-SSO),Draft(Sitzungszustand),View/Lang(Templates, de/en). Keine Datenbank.
Lokal arbeiten
sh dev-test.sh # composer install, phpcs (PSR-12), phpunit in Docker docker compose up # Dienst auf Port 8080 (Traefik-Labels, Host aus .env DOMAIN)
Tests liegen in tests/; Golden-Datei: tests/golden/ug_first_year.csv (Erwartung: Aktiva B 550,00; Passiva A 400,00; Passiva C 150,00; Ergebnis -600,00). OffenlegungSchemaTest validiert gegen das offizielle XSD, sobald es unter specs/offenlegung/ liegt (lizenzpflichtig, nicht im Git; siehe specs/MANIFEST.md).
Hub-Login
Anmeldung gehört dem Digi Soft Hub. Ablauf: /login leitet auf https://digi-soft.app/sso/bilanz; der Hub stellt ein 60-Sekunden-JWT (HS256, Secret HUB_SSO_SECRET) mit sub, email, name, jti, aud=bilanz aus und leitet auf /sso/callback?token=…. Auth::verify() verlangt aud=bilanz und löst jede jti nur einmal ein. In der Sitzung liegen nur id, email, name.
Umgebungsvariablen (nur serverseitig in .env, nie im Repo): DOMAIN, HUB_URL, HUB_SSO_SECRET.
Erweitern
Neuer Importer
Klasse mit import(string $content): array{TrialBalance, list<Issue>} schreiben (siehe CsvTrialBalanceImporter), in Draft::compute() einhängen. Fehler als Issue::error() melden, nie stillschweigend Zeilen verwerfen.
Neuer Einreicher
Submit\Submitter implementieren (Unternehmensregister) oder Submit\EBilanzSubmitter (Finanzamt, bewusst getrennt). Standard ist ManualUploadExport: sendet nichts. Echte Einreichungen müssen standardmäßig im Test-/Dry-Run-Modus laufen und eine ausdrückliche Bestätigung verlangen. Vorgesehen: BundesanzeigerMassenschnittstelle (nach Vertrag mit dem Verlag), NotImplementedEBilanzSubmitter ist der Stub für M4 (ERiC nur als Docker-Dienst auf Hetzner, Zertifikate über Secrets).
Kontenrahmen
Mapping\Skr03Mapper trägt die Bereiche (Entwurf, ungeprüft). SKR04 und Überschreibungen pro Mandant sind offen.
Deployment
Hetzner, Verzeichnis ~/digisoft-infra/projects/bilanz/, ein zustandsloser Apache/PHP-Container im Netz web, Traefik mit Let's Encrypt (letsencrypt-Resolver, security-headers@file). Dockerfile-Änderungen erfordern up -d --build; Änderungen an .env erfordern --force-recreate.
Grenzen
- Kein XBRL/E-Bilanz; das XML ist ein eigenes Format (
urn:digisoft:bilanz:1). - Die Bundesanzeiger-Massenschnittstelle ist vertraglich/auf Anfrage; Spezifikation und Testsystem stehen aus.
- Keine Persistenz; ein verschlüsselter Speicher mit Audit-Log ist nicht gebaut.
- SKR03-Zuordnung ist ein ungeprüfter Entwurf.