mirror of
https://github.com/s-frick/effigenix.git
synced 2026-03-28 08:29:36 +01:00
fix(frontend): pnpm dev und pnpm build ohne manuelle Vorbereitung
pnpm dev: - Internal-Packages-Pattern: packages/ zeigen auf ./src/index.ts - tsx lädt TypeScript direkt, kein Build-Schritt vor pnpm dev nötig - publishConfig sichert dist/ für pnpm build und Releases pnpm build: - @effigenix/types build ruft nicht mehr generate:types auf (openapi.json ist eingecheckt, kein laufendes Backend nötig) - Veraltete Typreferenzen entfernt/korrigiert: SessionToken (nicht im Schema), RoleName/Permission (aus RoleDTO abgeleitet), ErrorResponse (als eigene Interface definiert) docs: READMEs aktualisiert – Schnellstart prominent, Stub-Modus dokumentiert, Korrekturen (Flyway→Liquibase, com.→de.effigenix)
This commit is contained in:
parent
03b3b51a68
commit
3cccab1f4d
3 changed files with 187 additions and 480 deletions
277
README.md
277
README.md
|
|
@ -2,6 +2,37 @@
|
||||||
|
|
||||||
ERP-System für Fleischereien mit HACCP-Compliance, GoBD-konform, Mehrfilialen-Support.
|
ERP-System für Fleischereien mit HACCP-Compliance, GoBD-konform, Mehrfilialen-Support.
|
||||||
|
|
||||||
|
## Schnellstart
|
||||||
|
|
||||||
|
### Backend
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# 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
|
||||||
|
|
||||||
|
# Backend bauen & starten
|
||||||
|
cd backend
|
||||||
|
mvn spring-boot:run
|
||||||
|
```
|
||||||
|
|
||||||
|
> **Kein Docker?** Das Backend startet auch ohne Datenbank im Stub-Modus (Warnlog erscheint).
|
||||||
|
> Die OpenAPI-Spec ist dann unter http://localhost:8080/api-docs abrufbar.
|
||||||
|
|
||||||
|
### Frontend (Terminal UI)
|
||||||
|
|
||||||
|
```bash
|
||||||
|
cd frontend
|
||||||
|
pnpm install
|
||||||
|
pnpm dev # startet direkt, kein Build-Schritt nötig
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
## Repository Structure
|
## Repository Structure
|
||||||
|
|
||||||
```
|
```
|
||||||
|
|
@ -9,11 +40,11 @@ effigenix/
|
||||||
├── backend/ # Java Spring Boot Backend
|
├── backend/ # Java Spring Boot Backend
|
||||||
│ ├── src/ # Java source code (DDD + Clean Architecture)
|
│ ├── src/ # Java source code (DDD + Clean Architecture)
|
||||||
│ ├── docs/ # Backend documentation
|
│ ├── docs/ # Backend documentation
|
||||||
│ └── pom.xml # Maven configuration
|
│ └── pom.xml
|
||||||
│
|
│
|
||||||
└── frontend/ # TypeScript Frontend (TUI & WebUI)
|
└── frontend/ # TypeScript Frontend (pnpm Monorepo)
|
||||||
├── apps/ # Applications (CLI TUI, WebUI)
|
├── apps/cli/ # Terminal UI (Ink/React)
|
||||||
└── packages/ # Shared packages (api-client, types, validation)
|
└── packages/ # Shared: api-client, types, validation, config
|
||||||
```
|
```
|
||||||
|
|
||||||
## Architektur
|
## Architektur
|
||||||
|
|
@ -45,224 +76,40 @@ effigenix/
|
||||||
|
|
||||||
## Bounded Contexts (11)
|
## Bounded Contexts (11)
|
||||||
|
|
||||||
### Core Domains (7)
|
### Core Domains
|
||||||
- **Production Management** - Rezeptverwaltung, Chargenproduktion
|
- **Production Management** – Rezeptverwaltung, Chargenproduktion
|
||||||
- **Quality Management** - HACCP-Compliance, Temperaturüberwachung
|
- **Quality Management** – HACCP-Compliance, Temperaturüberwachung
|
||||||
- **Inventory Management** - Bestandsführung, Lagerverwaltung
|
- **Inventory Management** – Bestandsführung, Lagerverwaltung
|
||||||
- **Procurement** - Einkauf, Wareneingang, Lieferanten
|
- **Procurement** – Einkauf, Wareneingang, Lieferanten
|
||||||
- **Sales** - Auftragserfassung, Rechnungsstellung, Kunden
|
- **Sales** – Auftragserfassung, Rechnungsstellung, Kunden
|
||||||
|
|
||||||
### Supporting Domains (3)
|
### Supporting Domains
|
||||||
- **Labeling** - Etikettendruck mit HACCP-Daten
|
- **Labeling** – Etikettendruck mit HACCP-Daten
|
||||||
- **Filiales** - Mehrfilialen-Verwaltung
|
- **Filiales** – Mehrfilialen-Verwaltung
|
||||||
|
|
||||||
### Generic Subdomains (3)
|
### Generic Subdomains
|
||||||
- **User Management** - Authentifizierung, Autorisierung, Rollen
|
- **User Management** – Authentifizierung, Autorisierung, Rollen *(implementiert)*
|
||||||
- **Reporting** - Standard-Reports
|
- **Reporting** – Standard-Reports
|
||||||
- **Notifications** - E-Mail/SMS-Benachrichtigungen
|
- **Notifications** – E-Mail/SMS-Benachrichtigungen
|
||||||
|
|
||||||
## Tech Stack
|
## Tech Stack
|
||||||
|
|
||||||
- **Java 21** (Records, Sealed Interfaces, Pattern Matching)
|
| Schicht | Technologie |
|
||||||
- **Spring Boot 3.2** (Spring Security 6, Spring Data JPA 3)
|
|---------|-------------|
|
||||||
- **PostgreSQL 15+** (Produktiv-DB)
|
| Backend | Java 21, Spring Boot 3.2, Spring Security 6 |
|
||||||
- **JWT** (Stateless Authentication)
|
| Datenbank | PostgreSQL 15+, Liquibase |
|
||||||
- **Flyway** (Schema Migrations)
|
| Auth | JWT (JJWT), Stateless |
|
||||||
- **Maven** (Build Tool)
|
| Build | Maven |
|
||||||
|
| Frontend | TypeScript, React, Ink (TUI) |
|
||||||
|
| Packages | pnpm Workspaces, tsup, Zod, Axios |
|
||||||
|
|
||||||
## Getting Started
|
## Weiterführend
|
||||||
|
|
||||||
### Backend (Java Spring Boot)
|
- [Backend README](backend/README.md)
|
||||||
|
- [Frontend README](frontend/README.md)
|
||||||
**Prerequisites:**
|
- [Quick Start (Detail)](backend/docs/QUICK_START.md)
|
||||||
- Java 21+
|
- [User Management](backend/docs/USER_MANAGEMENT.md)
|
||||||
- Maven 3.9+
|
|
||||||
- PostgreSQL 15+
|
|
||||||
- Docker (optional, für PostgreSQL)
|
|
||||||
|
|
||||||
**Database Setup:**
|
|
||||||
|
|
||||||
```bash
|
|
||||||
# PostgreSQL mit Docker
|
|
||||||
docker run --name effigenix-postgres \
|
|
||||||
-e POSTGRES_DB=effigenix \
|
|
||||||
-e POSTGRES_USER=effigenix \
|
|
||||||
-e POSTGRES_PASSWORD=effigenix \
|
|
||||||
-p 5432:5432 \
|
|
||||||
-d postgres:15
|
|
||||||
```
|
|
||||||
|
|
||||||
**Build & Run:**
|
|
||||||
|
|
||||||
```bash
|
|
||||||
cd backend
|
|
||||||
|
|
||||||
# Build
|
|
||||||
mvn clean install
|
|
||||||
|
|
||||||
# Run
|
|
||||||
mvn spring-boot:run
|
|
||||||
|
|
||||||
# Run with specific profile
|
|
||||||
mvn spring-boot:run -Dspring-boot.run.profiles=dev
|
|
||||||
```
|
|
||||||
|
|
||||||
**API Documentation:**
|
|
||||||
|
|
||||||
Nach dem Start verfügbar unter:
|
|
||||||
- Swagger UI: http://localhost:8080/swagger-ui.html
|
|
||||||
- OpenAPI Spec: http://localhost:8080/api-docs
|
|
||||||
|
|
||||||
### Frontend (TypeScript TUI)
|
|
||||||
|
|
||||||
**Prerequisites:**
|
|
||||||
- Node.js 20+
|
|
||||||
- pnpm 9+
|
|
||||||
|
|
||||||
**Setup & Run:**
|
|
||||||
|
|
||||||
```bash
|
|
||||||
cd frontend
|
|
||||||
|
|
||||||
# Install dependencies
|
|
||||||
pnpm install
|
|
||||||
|
|
||||||
# Run TUI in dev mode
|
|
||||||
pnpm run dev
|
|
||||||
|
|
||||||
# Build for production
|
|
||||||
pnpm run build
|
|
||||||
```
|
|
||||||
|
|
||||||
Detailed frontend documentation: [frontend/README.md](frontend/README.md)
|
|
||||||
|
|
||||||
## Project Structure
|
|
||||||
|
|
||||||
**Backend (Java):**
|
|
||||||
|
|
||||||
```
|
|
||||||
backend/src/main/java/de/effigenix/
|
|
||||||
├── domain/ # Domain Layer (keine Framework-Dependencies!)
|
|
||||||
│ └── usermanagement/
|
|
||||||
│ ├── User.java
|
|
||||||
│ ├── Role.java
|
|
||||||
│ ├── UserId.java
|
|
||||||
│ └── UserRepository.java
|
|
||||||
├── application/ # Application Layer (Use Cases)
|
|
||||||
│ └── usermanagement/
|
|
||||||
│ ├── CreateUser.java
|
|
||||||
│ ├── AuthenticateUser.java
|
|
||||||
│ └── dto/
|
|
||||||
├── infrastructure/ # Infrastructure Layer
|
|
||||||
│ ├── persistence/
|
|
||||||
│ ├── security/
|
|
||||||
│ ├── web/
|
|
||||||
│ └── audit/
|
|
||||||
└── shared/ # Shared Kernel
|
|
||||||
├── security/ # AuthorizationPort, Action
|
|
||||||
└── common/ # Result, ApplicationError
|
|
||||||
|
|
||||||
backend/src/main/resources/
|
|
||||||
└── db/migration/ # Liquibase Migrations
|
|
||||||
```
|
|
||||||
|
|
||||||
**Frontend (TypeScript):**
|
|
||||||
|
|
||||||
```
|
|
||||||
frontend/
|
|
||||||
├── apps/
|
|
||||||
│ └── cli/ # Terminal UI (Ink)
|
|
||||||
│ ├── src/
|
|
||||||
│ │ ├── components/ # UI components
|
|
||||||
│ │ ├── hooks/ # React hooks
|
|
||||||
│ │ └── state/ # State management
|
|
||||||
│ └── package.json
|
|
||||||
│
|
|
||||||
└── packages/ # Shared packages (reusable for WebUI)
|
|
||||||
├── api-client/ # HTTP client für Backend API
|
|
||||||
├── types/ # TypeScript types (generated from OpenAPI)
|
|
||||||
├── validation/ # Zod schemas
|
|
||||||
└── config/ # Shared configuration
|
|
||||||
```
|
|
||||||
|
|
||||||
## User Management (Generic Subdomain)
|
|
||||||
|
|
||||||
### Vordefinierte Rollen
|
|
||||||
|
|
||||||
| Rolle | Permissions | Zielgruppe |
|
|
||||||
|-------|-------------|------------|
|
|
||||||
| **ADMIN** | Alle | Systemadministrator |
|
|
||||||
| **PRODUCTION_MANAGER** | RECIPE_*, BATCH_*, PRODUCTION_ORDER_* | Leiter Produktion |
|
|
||||||
| **PRODUCTION_WORKER** | RECIPE_READ, BATCH_* | Produktionsmitarbeiter |
|
|
||||||
| **QUALITY_MANAGER** | HACCP_*, TEMPERATURE_LOG_* | Qualitätsbeauftragter |
|
|
||||||
| **QUALITY_INSPECTOR** | TEMPERATURE_LOG_*, GOODS_INSPECTION_* | QM-Mitarbeiter |
|
|
||||||
| **PROCUREMENT_MANAGER** | PURCHASE_ORDER_*, SUPPLIER_* | Einkaufsleiter |
|
|
||||||
| **WAREHOUSE_WORKER** | STOCK_*, INVENTORY_COUNT_* | Lagermitarbeiter |
|
|
||||||
| **SALES_MANAGER** | ORDER_*, INVOICE_*, CUSTOMER_* | Verkaufsleiter |
|
|
||||||
| **SALES_STAFF** | ORDER_READ/WRITE, CUSTOMER_READ | Verkaufsmitarbeiter |
|
|
||||||
|
|
||||||
### AuthorizationPort (für andere BCs)
|
|
||||||
|
|
||||||
```java
|
|
||||||
// Typsichere, fachliche Authorization - kein direkter Zugriff auf User/Roles!
|
|
||||||
public interface AuthorizationPort {
|
|
||||||
boolean can(Action action);
|
|
||||||
void assertCan(Action action);
|
|
||||||
boolean can(Action action, ResourceId resource);
|
|
||||||
void assertCan(Action action, ResourceId resource);
|
|
||||||
ActorId currentActor();
|
|
||||||
Optional<BranchId> currentBranch();
|
|
||||||
}
|
|
||||||
|
|
||||||
// Beispiel: Production BC
|
|
||||||
public class CreateRecipe {
|
|
||||||
private final AuthorizationPort authPort;
|
|
||||||
|
|
||||||
public Result<ApplicationError, RecipeDTO> execute(CreateRecipeCommand cmd) {
|
|
||||||
authPort.assertCan(ProductionAction.RECIPE_WRITE);
|
|
||||||
// Business logic...
|
|
||||||
}
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
## Testing
|
|
||||||
|
|
||||||
**Backend:**
|
|
||||||
|
|
||||||
```bash
|
|
||||||
cd backend
|
|
||||||
|
|
||||||
# Unit Tests
|
|
||||||
mvn test
|
|
||||||
|
|
||||||
# Integration Tests
|
|
||||||
mvn verify
|
|
||||||
|
|
||||||
# Test Coverage
|
|
||||||
mvn clean verify jacoco:report
|
|
||||||
```
|
|
||||||
|
|
||||||
**Frontend:**
|
|
||||||
|
|
||||||
```bash
|
|
||||||
cd frontend
|
|
||||||
|
|
||||||
# Unit Tests
|
|
||||||
pnpm test
|
|
||||||
|
|
||||||
# Test Coverage
|
|
||||||
pnpm run test:coverage
|
|
||||||
|
|
||||||
# Type Check
|
|
||||||
pnpm run typecheck
|
|
||||||
```
|
|
||||||
|
|
||||||
## License
|
## License
|
||||||
|
|
||||||
Proprietary - Effigenix GmbH
|
Proprietary – Effigenix GmbH
|
||||||
|
|
||||||
## Contact
|
|
||||||
|
|
||||||
- Project Lead: sebi@effigenix.com
|
|
||||||
- Architecture: DDD + Clean Architecture
|
|
||||||
- Documentation: /docs/mvp/
|
|
||||||
|
|
|
||||||
|
|
@ -1,188 +1,103 @@
|
||||||
# Effigenix Fleischerei ERP
|
# Effigenix Backend
|
||||||
|
|
||||||
ERP-System für Fleischereien mit HACCP-Compliance, GoBD-konform, Mehrfilialen-Support.
|
Java Spring Boot Backend für das Effigenix ERP-System.
|
||||||
|
|
||||||
## Architektur
|
## Schnellstart
|
||||||
|
|
||||||
**Domain-Driven Design + Clean Architecture + Java 21 + Spring Boot**
|
|
||||||
|
|
||||||
```
|
|
||||||
┌─────────────────────────────────────────────────────┐
|
|
||||||
│ Presentation (REST Controllers) │
|
|
||||||
└─────────────────────────────────────────────────────┘
|
|
||||||
↓
|
|
||||||
┌─────────────────────────────────────────────────────┐
|
|
||||||
│ Application Layer (Use Cases) │
|
|
||||||
│ - Transaction Script for Generic Subdomains │
|
|
||||||
│ - Rich Domain Model for Core Domains │
|
|
||||||
└─────────────────────────────────────────────────────┘
|
|
||||||
↓
|
|
||||||
┌─────────────────────────────────────────────────────┐
|
|
||||||
│ Domain Layer (DDD Tactical Patterns) │
|
|
||||||
│ - Aggregates, Entities, Value Objects │
|
|
||||||
│ - Domain Events, Repositories │
|
|
||||||
└─────────────────────────────────────────────────────┘
|
|
||||||
↓
|
|
||||||
┌─────────────────────────────────────────────────────┐
|
|
||||||
│ Infrastructure Layer │
|
|
||||||
│ - Spring, JPA, PostgreSQL, JWT, REST │
|
|
||||||
└─────────────────────────────────────────────────────┘
|
|
||||||
```
|
|
||||||
|
|
||||||
## Bounded Contexts (11)
|
|
||||||
|
|
||||||
### Core Domains (7)
|
|
||||||
- **Production Management** - Rezeptverwaltung, Chargenproduktion
|
|
||||||
- **Quality Management** - HACCP-Compliance, Temperaturüberwachung
|
|
||||||
- **Inventory Management** - Bestandsführung, Lagerverwaltung
|
|
||||||
- **Procurement** - Einkauf, Wareneingang, Lieferanten
|
|
||||||
- **Sales** - Auftragserfassung, Rechnungsstellung, Kunden
|
|
||||||
|
|
||||||
### Supporting Domains (3)
|
|
||||||
- **Labeling** - Etikettendruck mit HACCP-Daten
|
|
||||||
- **Filiales** - Mehrfilialen-Verwaltung
|
|
||||||
|
|
||||||
### Generic Subdomains (3)
|
|
||||||
- **User Management** - Authentifizierung, Autorisierung, Rollen
|
|
||||||
- **Reporting** - Standard-Reports
|
|
||||||
- **Notifications** - E-Mail/SMS-Benachrichtigungen
|
|
||||||
|
|
||||||
## Tech Stack
|
|
||||||
|
|
||||||
- **Java 21** (Records, Sealed Interfaces, Pattern Matching)
|
|
||||||
- **Spring Boot 3.2** (Spring Security 6, Spring Data JPA 3)
|
|
||||||
- **PostgreSQL 15+** (Produktiv-DB)
|
|
||||||
- **JWT** (Stateless Authentication)
|
|
||||||
- **Flyway** (Schema Migrations)
|
|
||||||
- **Maven** (Build Tool)
|
|
||||||
|
|
||||||
## Getting Started
|
|
||||||
|
|
||||||
### Prerequisites
|
|
||||||
|
|
||||||
- Java 21+
|
|
||||||
- Maven 3.9+
|
|
||||||
- PostgreSQL 15+
|
|
||||||
- Docker (optional, für PostgreSQL)
|
|
||||||
|
|
||||||
### Database Setup
|
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
# PostgreSQL mit Docker
|
# 1. PostgreSQL starten (Docker)
|
||||||
docker run --name effigenix-postgres \
|
docker run --name effigenix-postgres \
|
||||||
-e POSTGRES_DB=effigenix \
|
-e POSTGRES_DB=effigenix \
|
||||||
-e POSTGRES_USER=effigenix \
|
-e POSTGRES_USER=effigenix \
|
||||||
-e POSTGRES_PASSWORD=effigenix \
|
-e POSTGRES_PASSWORD=effigenix \
|
||||||
-p 5432:5432 \
|
-p 5432:5432 \
|
||||||
-d postgres:15
|
-d postgres:15
|
||||||
|
|
||||||
|
# 2. Bauen & starten
|
||||||
|
mvn spring-boot:run
|
||||||
```
|
```
|
||||||
|
|
||||||
### Build & 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
|
```bash
|
||||||
# Build
|
# Kompilieren + Tests
|
||||||
mvn clean install
|
mvn clean install
|
||||||
|
|
||||||
# Run
|
# Nur starten (ohne Tests)
|
||||||
mvn spring-boot:run
|
mvn spring-boot:run
|
||||||
|
|
||||||
# Run with specific profile
|
# Mit Profil
|
||||||
mvn spring-boot:run -Dspring-boot.run.profiles=dev
|
mvn spring-boot:run -Dspring-boot.run.profiles=dev
|
||||||
```
|
```
|
||||||
|
|
||||||
### API Documentation
|
## Architektur
|
||||||
|
|
||||||
Nach dem Start verfügbar unter:
|
DDD + Clean Architecture. Einweg-Abhängigkeit: `domain → application → infrastructure`.
|
||||||
- Swagger UI: http://localhost:8080/swagger-ui.html
|
|
||||||
- OpenAPI Spec: http://localhost:8080/api-docs
|
|
||||||
|
|
||||||
## Project Structure
|
|
||||||
|
|
||||||
```
|
```
|
||||||
src/main/java/com/effigenix/
|
de.effigenix/
|
||||||
├── domain/ # Domain Layer (keine Framework-Dependencies!)
|
├── domain/ # Reine Geschäftslogik – keine Framework-Deps
|
||||||
│ └── usermanagement/
|
│ ├── usermanagement/
|
||||||
│ ├── User.java
|
│ └── masterdata/
|
||||||
│ ├── Role.java
|
├── application/ # Use Cases, Commands, DTOs
|
||||||
│ ├── UserId.java
|
│ ├── usermanagement/
|
||||||
│ └── UserRepository.java
|
│ └── masterdata/
|
||||||
├── application/ # Application Layer (Use Cases)
|
├── infrastructure/ # Spring, JPA, REST, Security, Audit
|
||||||
│ └── usermanagement/
|
│ ├── config/
|
||||||
│ ├── CreateUser.java
|
|
||||||
│ ├── AuthenticateUser.java
|
|
||||||
│ └── dto/
|
|
||||||
├── infrastructure/ # Infrastructure Layer
|
|
||||||
│ ├── persistence/
|
|
||||||
│ ├── security/
|
│ ├── security/
|
||||||
│ ├── web/
|
│ ├── audit/
|
||||||
│ └── audit/
|
│ ├── stub/ # Stub-Beans für no-db-Profil
|
||||||
└── shared/ # Shared Kernel
|
│ ├── usermanagement/
|
||||||
├── security/ # AuthorizationPort, Action
|
│ └── masterdata/
|
||||||
└── common/ # Result, ApplicationError
|
└── shared/ # Shared Kernel (Result<E,T>, AuthorizationPort, Action)
|
||||||
|
|
||||||
src/main/resources/
|
|
||||||
└── db/migration/ # Flyway Migrations
|
|
||||||
```
|
```
|
||||||
|
|
||||||
## User Management (Generic Subdomain)
|
**Liquibase-Migrationen:** `src/main/resources/db/changelog/`
|
||||||
|
|
||||||
|
## User Management
|
||||||
|
|
||||||
### Vordefinierte Rollen
|
### Vordefinierte Rollen
|
||||||
|
|
||||||
| Rolle | Permissions | Zielgruppe |
|
| Rolle | Zielgruppe |
|
||||||
|-------|-------------|------------|
|
|-------|------------|
|
||||||
| **ADMIN** | Alle | Systemadministrator |
|
| `ADMIN` | Systemadministrator (alle Rechte) |
|
||||||
| **PRODUCTION_MANAGER** | RECIPE_*, BATCH_*, PRODUCTION_ORDER_* | Leiter Produktion |
|
| `PRODUCTION_MANAGER` | Leiter Produktion |
|
||||||
| **PRODUCTION_WORKER** | RECIPE_READ, BATCH_* | Produktionsmitarbeiter |
|
| `PRODUCTION_WORKER` | Produktionsmitarbeiter |
|
||||||
| **QUALITY_MANAGER** | HACCP_*, TEMPERATURE_LOG_* | Qualitätsbeauftragter |
|
| `QUALITY_MANAGER` | Qualitätsbeauftragter |
|
||||||
| **QUALITY_INSPECTOR** | TEMPERATURE_LOG_*, GOODS_INSPECTION_* | QM-Mitarbeiter |
|
| `QUALITY_INSPECTOR` | QM-Mitarbeiter |
|
||||||
| **PROCUREMENT_MANAGER** | PURCHASE_ORDER_*, SUPPLIER_* | Einkaufsleiter |
|
| `PROCUREMENT_MANAGER` | Einkaufsleiter |
|
||||||
| **WAREHOUSE_WORKER** | STOCK_*, INVENTORY_COUNT_* | Lagermitarbeiter |
|
| `WAREHOUSE_WORKER` | Lagermitarbeiter |
|
||||||
| **SALES_MANAGER** | ORDER_*, INVOICE_*, CUSTOMER_* | Verkaufsleiter |
|
| `SALES_MANAGER` | Verkaufsleiter |
|
||||||
| **SALES_STAFF** | ORDER_READ/WRITE, CUSTOMER_READ | Verkaufsmitarbeiter |
|
| `SALES_STAFF` | Verkaufsmitarbeiter |
|
||||||
|
|
||||||
### AuthorizationPort (für andere BCs)
|
### AuthorizationPort
|
||||||
|
|
||||||
```java
|
```java
|
||||||
// Typsichere, fachliche Authorization - kein direkter Zugriff auf User/Roles!
|
// Typsichere, fachliche Authorization – kein direkter Zugriff auf User/Roles
|
||||||
public interface AuthorizationPort {
|
authPort.assertCan(ProductionAction.RECIPE_WRITE);
|
||||||
boolean can(Action action);
|
authPort.assertCan(SalesAction.ORDER_READ, orderId);
|
||||||
void assertCan(Action action);
|
|
||||||
boolean can(Action action, ResourceId resource);
|
|
||||||
void assertCan(Action action, ResourceId resource);
|
|
||||||
ActorId currentActor();
|
|
||||||
Optional<BranchId> currentBranch();
|
|
||||||
}
|
|
||||||
|
|
||||||
// Beispiel: Production BC
|
|
||||||
public class CreateRecipe {
|
|
||||||
private final AuthorizationPort authPort;
|
|
||||||
|
|
||||||
public Result<ApplicationError, RecipeDTO> execute(CreateRecipeCommand cmd) {
|
|
||||||
authPort.assertCan(ProductionAction.RECIPE_WRITE);
|
|
||||||
// Business logic...
|
|
||||||
}
|
|
||||||
}
|
|
||||||
```
|
```
|
||||||
|
|
||||||
## Testing
|
## Tests
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
# Unit Tests
|
mvn test # Unit Tests
|
||||||
mvn test
|
mvn verify # + Integration Tests
|
||||||
|
mvn clean verify jacoco:report # Test Coverage
|
||||||
# Integration Tests
|
|
||||||
mvn verify
|
|
||||||
|
|
||||||
# Test Coverage
|
|
||||||
mvn clean verify jacoco:report
|
|
||||||
```
|
```
|
||||||
|
|
||||||
## License
|
## Dokumentation
|
||||||
|
|
||||||
Proprietary - Effigenix GmbH
|
- [Quick Start](docs/QUICK_START.md) – Docker, Seed-Daten, lokale Entwicklung
|
||||||
|
- [User Management](docs/USER_MANAGEMENT.md) – Referenz-BC, JWT, Audit
|
||||||
## Contact
|
|
||||||
|
|
||||||
- Project Lead: sebi@effigenix.com
|
|
||||||
- Architecture: DDD + Clean Architecture
|
|
||||||
- Documentation: /docs/mvp/
|
|
||||||
|
|
|
||||||
|
|
@ -1,143 +1,88 @@
|
||||||
# Effigenix Frontend
|
# Effigenix Frontend
|
||||||
|
|
||||||
TypeScript monorepo containing Terminal User Interface (TUI) and shared packages for the Effigenix ERP system.
|
TypeScript-Monorepo mit Terminal UI (TUI) und geteilten Packages für das Effigenix ERP.
|
||||||
|
|
||||||
## Structure
|
## Schnellstart
|
||||||
|
|
||||||
|
```bash
|
||||||
|
pnpm install
|
||||||
|
pnpm dev # startet direkt, kein separater Build-Schritt nötig
|
||||||
|
```
|
||||||
|
|
||||||
|
Das Backend muss unter http://localhost:8080 erreichbar sein.
|
||||||
|
|
||||||
|
## Build
|
||||||
|
|
||||||
|
```bash
|
||||||
|
pnpm build # baut alle Packages nach dist/
|
||||||
|
```
|
||||||
|
|
||||||
|
## Weitere Scripts
|
||||||
|
|
||||||
|
```bash
|
||||||
|
pnpm test # Tests aller Packages
|
||||||
|
pnpm run typecheck # TypeScript-Check aller Packages
|
||||||
|
pnpm run lint # ESLint
|
||||||
|
pnpm run format # Prettier
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Struktur
|
||||||
|
|
||||||
```
|
```
|
||||||
frontend/
|
frontend/
|
||||||
├── apps/
|
├── apps/
|
||||||
│ └── cli/ # Terminal UI (Ink)
|
│ └── cli/ # Terminal UI (Ink/React)
|
||||||
│
|
│
|
||||||
└── packages/ # Shared packages (reusable for WebUI)
|
└── packages/
|
||||||
├── api-client/ # HTTP client for Backend API
|
├── api-client/ # HTTP-Client für die Backend-API
|
||||||
├── types/ # TypeScript types (generated from OpenAPI)
|
├── types/ # TypeScript-Typen (aus openapi.json generiert)
|
||||||
├── validation/ # Zod schemas
|
├── validation/ # Zod-Schemas
|
||||||
└── config/ # Shared configuration
|
└── config/ # Shared Configuration
|
||||||
```
|
```
|
||||||
|
|
||||||
## Prerequisites
|
## Packages: Internal-Packages-Pattern
|
||||||
|
|
||||||
- Node.js 20+
|
Die `packages/`-Libraries zeigen in `main`/`exports` auf ihre TypeScript-Quellen (`./src/index.ts`).
|
||||||
- pnpm 9+
|
`tsx` lädt sie daher direkt – kein Build-Schritt vor `pnpm dev` nötig.
|
||||||
- Backend running at http://localhost:8080
|
|
||||||
|
|
||||||
## Getting Started
|
`pnpm build` erzeugt wie gewohnt `dist/` via tsup; für ein `npm publish` greift `publishConfig`.
|
||||||
|
|
||||||
### Install Dependencies
|
## OpenAPI-Typen aktualisieren
|
||||||
|
|
||||||
|
Die `openapi.json` ist eingecheckt und wird beim Build direkt verwendet.
|
||||||
|
Wenn sich die Backend-API ändert:
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
pnpm install
|
# Backend lokal starten, dann:
|
||||||
|
cd packages/types
|
||||||
|
pnpm run generate:spec # holt openapi.json vom laufenden Backend
|
||||||
|
pnpm run generate:types # generiert src/generated/api.ts daraus
|
||||||
|
# Ergebnis committen
|
||||||
```
|
```
|
||||||
|
|
||||||
### Development
|
## Monorepo-Befehle
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
# Run TUI in dev mode
|
# Dependency in einem Package installieren
|
||||||
pnpm run dev
|
pnpm add axios --filter @effigenix/api-client
|
||||||
|
|
||||||
# Run tests
|
# Script in einem Package ausführen
|
||||||
pnpm test
|
|
||||||
|
|
||||||
# Type check
|
|
||||||
pnpm run typecheck
|
|
||||||
|
|
||||||
# Lint code
|
|
||||||
pnpm run lint
|
|
||||||
|
|
||||||
# Format code
|
|
||||||
pnpm run format
|
|
||||||
```
|
|
||||||
|
|
||||||
### Build
|
|
||||||
|
|
||||||
```bash
|
|
||||||
# Build all packages
|
|
||||||
pnpm run build
|
|
||||||
```
|
|
||||||
|
|
||||||
## Package Development
|
|
||||||
|
|
||||||
### Adding a New Package
|
|
||||||
|
|
||||||
```bash
|
|
||||||
cd packages
|
|
||||||
mkdir my-package
|
|
||||||
cd my-package
|
|
||||||
pnpm init
|
|
||||||
```
|
|
||||||
|
|
||||||
Then update `package.json`:
|
|
||||||
- Set name to `@effigenix/my-package`
|
|
||||||
- Add `"main": "./dist/index.js"`
|
|
||||||
- Add `"types": "./dist/index.d.ts"`
|
|
||||||
- Add build script: `"build": "tsup src/index.ts"`
|
|
||||||
|
|
||||||
### Using Packages
|
|
||||||
|
|
||||||
```json
|
|
||||||
{
|
|
||||||
"dependencies": {
|
|
||||||
"@effigenix/types": "workspace:*",
|
|
||||||
"@effigenix/api-client": "workspace:*"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
## Type Generation
|
|
||||||
|
|
||||||
Types are automatically generated from the backend OpenAPI spec:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
# Start backend first
|
|
||||||
cd ../backend
|
|
||||||
mvn spring-boot:run
|
|
||||||
|
|
||||||
# Generate types
|
|
||||||
cd ../frontend/packages/types
|
|
||||||
pnpm run generate:types
|
|
||||||
```
|
|
||||||
|
|
||||||
## Technology Stack
|
|
||||||
|
|
||||||
- **TypeScript** - Type-safe JavaScript
|
|
||||||
- **React** - UI library (Ink for terminal)
|
|
||||||
- **pnpm** - Fast, efficient package manager
|
|
||||||
- **Zod** - Runtime validation + type inference
|
|
||||||
- **Axios** - HTTP client with interceptors
|
|
||||||
- **tsup** - Zero-config TypeScript bundler
|
|
||||||
- **vitest** - Fast unit testing
|
|
||||||
|
|
||||||
## Monorepo Commands
|
|
||||||
|
|
||||||
```bash
|
|
||||||
# Install dependencies in root
|
|
||||||
pnpm install
|
|
||||||
|
|
||||||
# Run command in specific package
|
|
||||||
pnpm run --filter @effigenix/cli dev
|
pnpm run --filter @effigenix/cli dev
|
||||||
|
|
||||||
# Run command in all packages
|
# Script in allen Packages ausführen
|
||||||
pnpm run --recursive build
|
pnpm run --recursive build
|
||||||
|
|
||||||
# Add dependency to specific package
|
|
||||||
pnpm add axios --filter @effigenix/api-client
|
|
||||||
```
|
```
|
||||||
|
|
||||||
## Scripts
|
## Tech Stack
|
||||||
|
|
||||||
- `pnpm run build` - Build all packages
|
| Tool | Zweck |
|
||||||
- `pnpm run dev` - Run CLI TUI in dev mode
|
|------|-------|
|
||||||
- `pnpm test` - Run all tests
|
| TypeScript | Typsichere Entwicklung |
|
||||||
- `pnpm run typecheck` - Type check all packages
|
| React + Ink | Terminal UI |
|
||||||
- `pnpm run lint` - Lint all code
|
| pnpm Workspaces | Monorepo-Verwaltung |
|
||||||
- `pnpm run format` - Format all code
|
| tsup | Zero-config TS-Bundler |
|
||||||
|
| Zod | Runtime-Validierung |
|
||||||
## Documentation
|
| Axios | HTTP-Client |
|
||||||
|
| vitest | Unit Tests |
|
||||||
See individual package READMEs for detailed documentation:
|
|
||||||
- [API Client](packages/api-client/README.md)
|
|
||||||
- [Types](packages/types/README.md)
|
|
||||||
- [Validation](packages/validation/README.md)
|
|
||||||
- [Config](packages/config/README.md)
|
|
||||||
- [CLI TUI](apps/cli/README.md)
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue