BΓΌrotaugliches Speditions-System mit MariaDB-Persistenz.
- .NET 10 SDK
- Docker Desktop
- Visual Studio 2022 oder VS Code
# EF Core Tools lokal installieren (konsistent ΓΌber Team/CI)
dotnet tool restore# Im Root-Verzeichnis des Projekts
docker compose up -dDies startet:
- MariaDB auf Port
3306 - phpMyAdmin auf Port
8081(http://localhost:8081)
- Γffne
TransportLogisticsERP.sln - Rechtsklick auf Solution β "Startprojekte festlegen"
- WΓ€hle "Mehrere Startprojekte"
- Setze
TransportLogisticsERP.APIundOfficeUIauf "Starten" - DrΓΌcke
F5
# Terminal 1 - API
cd src/API
dotnet run
# Terminal 2 - UI
cd src/OfficeUI
dotnet run| Dienst | URL |
|---|---|
| Office UI | http://localhost:5148 |
| API | http://localhost:5147 |
| API Dokumentation | http://localhost:5147/scalar/v1 |
| phpMyAdmin | http://localhost:8081 |
- TagesΓΌbersicht mit Auftragsstatistiken
- Offene/Disponierte/Abrechnungsbereite AuftrΓ€ge
- Umsatz heute
- Schnellerfassung per Telefon/E-Mail
- Kundenauswahl mit Inline-Anlage
- Automatische Preiskalkulation
- Workflow: Entwurf β BestΓ€tigt β Disponiert β Erledigt β Abgerechnet
- Ein-Klick-Rechnungserstellung
- Sammelrechnungen
- DATEV-Export
- Multi-Tenant-FΓ€higkeit
- Eigene Nummernkreise pro Mandant
- Individuelle Bankdaten/MwSt
{
"ConnectionStrings": {
"MariaDb": "Server=localhost;Port=3306;Database=speditionsbuero;User=app;Password=app;TreatTinyAsBoolean=true;"
},
"DatabaseProvider": "MariaDb"
}Setze DatabaseProvider auf leer oder entferne es:
{
"DatabaseProvider": ""
}dotnet tool restoredotnet tool run dotnet-ef migrations add <MigrationName> \
--context ErpDbContext \
--startup-project src/API \
--project src/Infrastructuredotnet tool run dotnet-ef database update \
--context ErpDbContext \
--startup-project src/API \
--project src/Infrastructuredotnet tool run dotnet-ef migrations remove \
--context ErpDbContext \
--startup-project src/API \
--project src/InfrastructureWichtig: Verwende IMMER dotnet tool run dotnet-ef (nicht dotnet ef global)!
Grund: Garantiert konsistentes Scaffolding (9.0.1) ΓΌber alle Entwickler/CI hinweg.
docker compose downdocker compose down -vdocker compose logs -f mariadb# PrΓΌfen was Port 3306 benutzt
netstat -an | findstr 3306
# MariaDB Container neu starten
docker compose restart mariadb# Migration manuell anwenden
cd src/API
dotnet ef database update --project ../Infrastructure/TransportLogisticsERP.Infrastructure.csprojDie Seed-Daten werden nur beim ersten Start eingefΓΌgt. Zum ZurΓΌcksetzen:
docker compose down -v
docker compose up -d
# Dann API neu startenβββ docker-compose.yml # MariaDB + phpMyAdmin
βββ src/
β βββ API/ # REST API
β βββ Core/ # Domain-Entities
β βββ Infrastructure/ # EF Core, Repositories
β β βββ Data/
β β βββ Migrations/
β βββ Modules/
β β βββ TMS/ # Transport Management
β β βββ WMS/ # Warehouse Management
β β βββ Billing/ # Abrechnung
β β βββ Disposition/ # Disposition
β βββ OfficeUI/ # Blazor Frontend
βββ tests/
Nach dem ersten Start werden automatisch Testdaten angelegt:
| Typ | Name | Details |
|---|---|---|
| Mandant | DEMO | Demo Spedition GmbH |
| Mandant | TEST | Test Transport AG |
| Kunde | MΓΌller & SΓΆhne KG | Berlin, 30 Tage Zahlungsziel |
| Kunde | Schmidt Handel GmbH | MΓΌnchen, 14 Tage Zahlungsziel |
| AuftrΓ€ge | 3 StΓΌck | Verschiedene Status |
| Prefix | Beschreibung |
|---|---|
/api/office/* |
BΓΌro-Workflow (AuftrΓ€ge, Rechnungen) |
/api/driver/* |
Mobile Driver App (Touren, GPS) |
/api/ops/* |
Verladung, Sendungsstatus |
/api/auth/* |
Authentication (Token, Login) |
/api/setup/* |
Owner-Setup (DB-Config, Migration, Status) |
/scalar/v1 |
Interactive API Documentation |
| Endpoint | Auth | Beschreibung |
|---|---|---|
GET /api/setup/status |
β Nein | System-Status (hasBusinessDb, canConnect, isMigrated) |
GET /api/setup/database/status |
β Owner | Detaillierter DB-Status mit Migrations-Info |
POST /api/setup/database/test |
β Owner | Verbindung testen (mit Diagnose) |
POST /api/setup/database/configure |
β Owner | DB-Connection konfigurieren |
POST /api/setup/database/migrate |
β Owner | Migrations manuell ausfΓΌhren |
POST /api/setup/database/seed |
β Owner | Demo-Daten anlegen |
503 Service Unavailable mit Code BUSINESS_DB_NOT_CONFIGURED:
{
"error": "BUSINESS_DB_NOT_CONFIGURED",
"message": "Business-Datenbank ist nicht konfiguriert",
"hint": "Bitte als Owner einloggen und Datenbank unter /owner/connections einrichten",
"setupUrl": "/owner/connections",
"statusUrl": "/api/setup/status"
}Dieser Fehler wird zurΓΌckgegeben wenn:
- Business-DB nicht konfiguriert ist
- Ein Endpoint aufgerufen wird, der Business-DB benΓΆtigt
- Middleware schΓΌtzt vor 500-Fehlern
Die API fΓΌhrt beim Start automatisch Migrations aus:
- Settings-DB (SQLite) - Immer
- Business-DB (MariaDB) - Falls konfiguriert und erreichbar
Robust: API startet auch wenn Business-DB nicht erreichbar ist!
# Status prΓΌfen
curl http://localhost:5147/api/setup/status
# Migration manuell triggern
curl -X POST http://localhost:5147/api/setup/database/migrate \
-H "Authorization: Bearer YOUR_TOKEN"
# Oder: Container neu starten
docker compose restart api
βββββββββββββββββββββββββββββββββββββββββββββββ
β OfficeUI (Blazor Server) β
β - Dashboard, Auftragserfassung, Abrechnung β
ββββββββββββββββββββ¬βββββββββββββββββββββββββββ
β HTTP/Cookie+JWT
βΌ
βββββββββββββββββββββββββββββββββββββββββββββββ
β REST API (ASP.NET Core) β
β - JWT Auth, Multi-Tenant, OpenAPI/Scalar β
ββββββββββββββββββββ¬βββββββββββββββββββββββββββ
β
ββββββββββββ΄βββββββββββ
βΌ βΌ
ββββββββββββββββ ββββββββββββββββ
β Settings-DB β β Business-DB β
β (SQLite) β β (MariaDB) β
β - Config β β - Tenants β
β - Users β β - Orders β
β - Roles β β - Shipments β
ββββββββββββββββ ββββββββββββββββ
docker compose up
β
ββ db (MariaDB)
β ββ Healthcheck β
β β
ββ init (One-Shot) β Wartet auf db
β ββ Provision Business-DB Connection
β ββ Run Migrations
β ββ Exit(0) β
β β
ββ api β Wartet auf init completion
β ββ Settings-DB bereits konfiguriert
β β
ββ officeui β Wartet auf api
ββ Ready β
Vorteil: API-Container bleibt sauber - Init-Container macht Setup!
The _mobile_readiness_package/ directory contains a standalone deliverable and verification bundle that we keep outside Git. Review or publish it independently but do not track it in the main repo.