# Effigenix Backend

Java Spring Boot Backend für das Effigenix ERP-System.

## Schnellstart

```bash
# 1. PostgreSQL starten (Docker)
docker run --name effigenix-postgres \
  -e POSTGRES_DB=effigenix \
  -e POSTGRES_USER=effigenix \
  -e POSTGRES_PASSWORD=effigenix \
  -p 5432:5432 \
  -d postgres:15

# 2. Bauen & starten
mvn spring-boot:run
```

**Ohne Datenbank** (Stub-Modus – nur API-Docs):
```bash
mvn spring-boot:run
# Warnung im Log: "⚠️  Keine Datenbankverbindung – Stub-Modus aktiv"
# OpenAPI-Spec: http://localhost:8080/api-docs
```

**API-Dokumentation** (mit laufender DB):
- Swagger UI: http://localhost:8080/swagger-ui.html
- OpenAPI JSON: http://localhost:8080/api-docs

## Build

```bash
# Kompilieren + Tests
mvn clean install

# Nur starten (ohne Tests)
mvn spring-boot:run

# Mit Profil
mvn spring-boot:run -Dspring-boot.run.profiles=dev
```

## Architektur

DDD + Clean Architecture. Einweg-Abhängigkeit: `domain → application → infrastructure`.

```
de.effigenix/
├── domain/              # Reine Geschäftslogik – keine Framework-Deps
│   ├── usermanagement/
│   └── masterdata/
├── application/         # Use Cases, Commands, DTOs
│   ├── usermanagement/
│   └── masterdata/
├── infrastructure/      # Spring, JPA, REST, Security, Audit
│   ├── config/
│   ├── security/
│   ├── audit/
│   ├── stub/            # Stub-Beans für no-db-Profil
│   ├── usermanagement/
│   └── masterdata/
└── shared/              # Shared Kernel (Result<E,T>, AuthorizationPort, Action)
```

**Liquibase-Migrationen:** `src/main/resources/db/changelog/`

## User Management

### Vordefinierte Rollen

| Rolle | Zielgruppe |
|-------|------------|
| `ADMIN` | Systemadministrator (alle Rechte) |
| `PRODUCTION_MANAGER` | Leiter Produktion |
| `PRODUCTION_WORKER` | Produktionsmitarbeiter |
| `QUALITY_MANAGER` | Qualitätsbeauftragter |
| `QUALITY_INSPECTOR` | QM-Mitarbeiter |
| `PROCUREMENT_MANAGER` | Einkaufsleiter |
| `WAREHOUSE_WORKER` | Lagermitarbeiter |
| `SALES_MANAGER` | Verkaufsleiter |
| `SALES_STAFF` | Verkaufsmitarbeiter |

### AuthorizationPort

```java
// Typsichere, fachliche Authorization – kein direkter Zugriff auf User/Roles
authPort.assertCan(ProductionAction.RECIPE_WRITE);
authPort.assertCan(SalesAction.ORDER_READ, orderId);
```

## Tests

```bash
mvn test                          # Unit Tests
mvn verify                        # + Integration Tests
mvn clean verify jacoco:report    # Test Coverage
```

## Dokumentation

- [Quick Start](docs/QUICK_START.md) – Docker, Seed-Daten, lokale Entwicklung
- [User Management](docs/USER_MANAGEMENT.md) – Referenz-BC, JWT, Audit
