Files
ISA-Frontend/docs/architecture-analysis.md
Lorenz Hilpert fd8e0194ac 🚚 refactor(skills): reorganize skill structure
- Rename logging-helper to logging for consistency
- Remove git-commit-helper (superseded by /commit command)
- Add git-workflow skill for Git Flow operations

Co-Authored-By: Claude <noreply@anthropic.com>
2025-10-29 13:39:14 +01:00

1121 lines
50 KiB
Markdown

# ISA-Frontend Monorepo: Comprehensive Architectural Analysis
**Document Version:** 1.0
**Last Updated:** 2025-10-29
**Monorepo Size:** 63 total libraries + 1 main application
**Angular Version:** 20.3.6
**Nx Version:** 21.3.2
**Node.js:** >= 22.12.0, < 23.0.0
**npm:** >= 11.6.0, < 11.7.0
---
## Table of Contents
1. [Project Structure Analysis](#project-structure-analysis)
2. [Dependency Architecture](#dependency-architecture)
3. [Technology Stack](#technology-stack)
4. [Domain Boundaries](#domain-boundaries)
5. [Architecture Patterns](#architecture-patterns)
6. [C4 Model Components](#c4-model-components)
---
## Project Structure Analysis
### Overall Organization
The ISA-Frontend is a sophisticated Angular monorepo employing **Domain-Driven Design (DDD)** principles with a strict layered architecture. The project uses Nx workspaces for efficient dependency management and build orchestration.
```
ISA-Frontend/
├── apps/
│ └── isa-app/ # Main Angular application (only runnable app)
│ └── src/
│ ├── app/ # Application bootstrap and root routing
│ ├── domain/ # Domain-specific feature implementations
│ ├── page/ # Page-level components
│ ├── modal/ # Modal dialogs
│ ├── adapter/ # External service adapters
│ ├── core/ # App-specific core services
│ ├── shared/ # App-specific shared utilities
│ ├── ui/ # App-specific UI components
│ ├── utils/ # App-specific utilities
│ ├── config/ # Configuration files
│ ├── environments/ # Environment-specific configs
│ └── assets/ # Static assets
├── libs/ # 63 domain-driven libraries
│ ├── core/ # Core infrastructure (5 libs)
│ ├── common/ # Common utilities (3 libs)
│ ├── ui/ # UI component system (17 libs)
│ ├── shared/ # Shared domain components (7 libs)
│ ├── availability/ # Availability domain (1 lib)
│ ├── catalogue/ # Catalogue domain (1 lib)
│ ├── checkout/ # Checkout domain (6 libs)
│ ├── crm/ # CRM domain (1 lib)
│ ├── oms/ # Order Management domain (9 libs)
│ ├── remission/ # Remission domain (8 libs)
│ ├── icons/ # Icon library (1 lib)
│ ├── utils/ # General utilities (3 libs)
│ └── [domain]/
│ ├── data-access/ # State & API integration
│ ├── feature/ # Feature components
│ ├── shared/ # Domain-specific shared
│ └── utils/ # Domain-specific utilities
├── generated/swagger/ # Auto-generated API clients (10 APIs)
│ ├── availability-api/
│ ├── cat-search-api/
│ ├── checkout-api/
│ ├── crm-api/
│ ├── eis-api/
│ ├── inventory-api/
│ ├── isa-api/
│ ├── oms-api/
│ ├── print-api/
│ └── wws-api/
├── tools/ # Build scripts and utilities
├── docs/ # Documentation
└── config files # Nx, TypeScript, Prettier configs
```
### Library Count by Domain
| Domain | Count | Libraries |
|--------|-------|-----------|
| **UI Components** | 17 | buttons, carousel, datepicker, dialog, empty-state, expandable, input-controls, item-rows, label, layout, menu, progress-bar, search-bar, skeleton-loader, toolbar, tooltip, bullet-list |
| **OMS (Orders)** | 9 | data-access, feature (return-details, return-process, return-review, return-search, return-summary), shared (product-info, task-list), utils (translation) |
| **Remission (Returns)** | 8 | data-access, feature (remission-list, remission-return-receipt-details, remission-return-receipt-list), shared (product, remission-start-dialog, return-receipt-actions, search-item-to-remit-dialog) |
| **Checkout** | 6 | data-access, feature (reward-catalog, reward-order-confirmation, reward-shopping-cart), shared (product-info, reward-selection-dialog) |
| **Core Infrastructure** | 5 | config, logging, navigation, storage, tabs |
| **Shared Components** | 7 | address, filter, product-format, product-image, product-router-link, quantity-control, scanner |
| **Common Utilities** | 3 | data-access, decorators, print |
| **Utility Libraries** | 3 | ean-validation, scroll-position, z-safe-parse |
| **Specialized Domains** | 4 | availability (1), catalogue (1), crm (1), icons (1) |
| **Generated APIs** | 10 | Auto-generated from Swagger/OpenAPI specs |
| **TOTAL** | **63** | + 1 main application (isa-app) |
---
## Dependency Architecture
### Layer Model
The architecture enforces strict unidirectional dependencies following a layered approach:
```
┌─────────────────────────────────────────────┐
│ Feature Layer (Pages) │
│ [oms-feature-return-search, etc.] │
└────────────────┬────────────────────────────┘
│ depends on
┌────────────────▼────────────────────────────┐
│ Shared/UI Component Layer │
│ [oms-shared-product-info, etc.] │
│ [ui-buttons, ui-dialog, etc.] │
└────────────────┬────────────────────────────┘
│ depends on
┌────────────────▼────────────────────────────┐
│ Data Access & State Layer │
│ [oms-data-access, checkout-data-access] │
│ (NgRx Signals Stores) │
└────────────────┬────────────────────────────┘
│ depends on
┌────────────────▼────────────────────────────┐
│ Infrastructure/Common Layer │
│ [generated-swagger, common-data-access] │
│ [core-logging, core-config, core-storage] │
└─────────────────────────────────────────────┘
```
### Import Boundaries
All imports use **path aliases** via TypeScript `tsconfig.base.json`:
```typescript
// Correct (cross-domain)
import { OrderService } from '@isa/oms/data-access';
import { CheckoutService } from '@isa/checkout/data-access';
import { UiButton } from '@isa/ui/buttons';
// Correct (within domain)
import { OrderState } from '../data-access/order.store';
// INCORRECT (relative imports across domains)
// ❌ import { OrderService } from '../../../oms/data-access';
```
### Path Alias Mapping
All 63 libraries are mapped via path aliases:
```json
{
"paths": {
"@isa/[domain]/[layer]/[feature]": ["libs/[domain]/[layer]/[feature]/src/index.ts"],
"@generated/swagger/[api-name]": ["generated/swagger/[api-name]/src/index.ts"]
}
}
```
### Dependency Graph Overview
**Main Application (isa-app) Dependencies:**
- All 9 OMS libraries
- All 8 Remission libraries
- All 6 Checkout libraries
- Specialized domains: Availability, Catalogue, CRM
- All 17 UI component libraries
- All 7 Shared component libraries
- Core infrastructure: 5 libraries
- Common utilities: 3 libraries
- Generated Swagger APIs: 10 clients
- Utility libraries: 3 libraries
**Key Observations:**
- No circular dependencies (strict acyclic graph)
- Feature libraries depend on shared/UI components
- Shared/UI libraries depend on data-access or core only
- Data-access libraries may depend on generated Swagger APIs and common utilities
- Core libraries have minimal dependencies (infrastructure only)
---
## Technology Stack
### Angular & Build Tools
| Component | Version | Purpose |
|-----------|---------|---------|
| **Angular** | 20.3.6 | Core framework with signals, standalone components |
| **Angular CDK** | 20.2.9 | Component primitives (overlays, focus, platform) |
| **TypeScript** | 5.8.3 | Type safety and modern language features |
| **Nx** | 21.3.2 | Monorepo management and build orchestration |
| **Vite** | 6.3.5 | Fast build tool (for testing) |
| **esbuild** | (via Nx) | Fast JavaScript bundler |
### State Management
| Library | Version | Usage |
|---------|---------|-------|
| **NgRx Signals** | 20.0.0 | Primary state management with signal stores |
| **NgRx Entity** | 20.0.0 | Normalized entity state management |
| **NgRx Effects** | 20.0.0 | Side effects handling |
| **NgRx Store DevTools** | 20.0.0 | Redux DevTools integration |
**State Management Pattern:**
- **signalStore()**: Modern functional signal-based stores
- **withEntities()**: Normalized data with entity adapters
- **withStorage()**: SessionStorage/IDB persistence
- **rxMethod()**: Reactive methods with cancellation support
- **withHooks()**: Lifecycle management and cleanup
### Testing Frameworks
| Framework | Status | Count | Usage |
|-----------|--------|-------|-------|
| **Jest** | Legacy | 40 libs (65.6%) | Older libraries (being phased out) |
| **Vitest** | Standard | 21 libs (34.4%) | New libraries (migration target) |
| **Spectator** | Jest only | - | Advanced mocking for Jest |
| **ng-mocks** | Both | - | Angular-specific mocking utilities |
| **Angular Testing Utilities** | Vitest | - | TestBed, ComponentFixture |
**Testing Strategy:**
- New libraries: Vitest + Angular Testing Utilities
- Legacy libraries: Jest + Spectator
- Migration: Ongoing from Jest to Vitest
### HTTP & API Integration
| Library | Version | Purpose |
|---------|---------|---------|
| **HttpClient** | 20.3.6 | Angular HTTP client |
| **ng-swagger-gen** | 2.3.1 | OpenAPI/Swagger code generation |
| **Zod** | 3.24.2 | Runtime schema validation |
**Generated API Clients (10 total):**
1. `availability-api` - Product availability
2. `cat-search-api` - Catalogue search
3. `checkout-api` - Shopping cart & orders
4. `crm-api` - Customer management
5. `eis-api` - Enterprise Info System
6. `inventory-api` - Inventory management
7. `isa-api` - Main ISA API
8. `oms-api` - Order Management System
9. `print-api` - Print services
10. `wws-api` - Warehouse services
### Form Handling & Input
| Library | Version | Purpose |
|---------|---------|---------|
| **@angular/forms** | 20.3.6 | Reactive and template-driven forms |
| **Angular CDK** | 20.2.9 | Form primitives and accessibility |
### UI & Styling
| Library | Version | Purpose |
|---------|---------|---------|
| **Tailwind CSS** | 3.4.14 | Utility-first CSS framework |
| **ISA Custom Plugins** | - | 7 custom Tailwind plugins (button, typography, menu, label, input, section, select-bullet) |
| **@angular/animations** | 20.3.6 | Animation framework |
### Additional Libraries
| Library | Version | Purpose |
|---------|---------|---------|
| **date-fns** | 4.1.0 | Modern date manipulation |
| **moment** | 2.30.1 | Legacy date library (being replaced by date-fns) |
| **lodash** | 4.17.21 | Utility functions |
| **uuid** | 8.3.2 | UUID generation |
| **RxJS** | 7.8.2 | Reactive programming |
| **@microsoft/signalr** | 8.0.7 | Real-time communication (SignalR) |
| **angular-oauth2-oidc** | 20.0.2 | OAuth2/OIDC authentication |
| **ng2-pdf-viewer** | 10.4.0 | PDF viewing |
| **scandit-web-datacapture** | 6.28.1 | Barcode scanning |
| **ngx-matomo-client** | 8.0.0 | Analytics (Matomo) |
---
## Domain Boundaries
### Domain 1: Order Management System (OMS)
**Purpose:** Handle product returns, receipt management, and return workflow processing
**Libraries (9):**
- `@isa/oms/data-access` - State management for returns/receipts
- `@isa/oms/feature/return-search` - Receipt search & filtering
- `@isa/oms/feature/return-details` - Receipt detail view & item selection
- `@isa/oms/feature/return-process` - Return workflow with questions
- `@isa/oms/feature/return-summary` - Return confirmation & printing
- `@isa/oms/feature/return-review` - Return completion review
- `@isa/oms/shared/product-info` - Product display components
- `@isa/oms/shared/task-list` - Receipt task management
- `@isa/oms/utils/translation` - Receipt type translations
**Key Workflows:**
1. Search for receipts by order ID, EAN, or date range
2. Select items from receipt for return
3. Configure return quantities and categories
4. Answer dynamic return process questions
5. Review and confirm return
6. Print return receipt
**API Dependencies:**
- `oms-api` - Main OMS API
- `isa-api` - General ISA API
- `print-api` - Receipt printing
**State Management:**
- NgRx Signal Store with entity normalization
- Session persistence for in-progress returns
---
### Domain 2: Remission (Returns Management)
**Purpose:** Manage warehouse remission processes (mandatory and department returns)
**Libraries (8):**
- `@isa/remission/data-access` - Remission state and API
- `@isa/remission/feature/remission-list` - Main remission list view
- `@isa/remission/feature/remission-return-receipt-list` - Return receipts view
- `@isa/remission/feature/remission-return-receipt-details` - Receipt details
- `@isa/remission/shared/product` - Product components
- `@isa/remission/shared/remission-start-dialog` - Start remission workflow
- `@isa/remission/shared/return-receipt-actions` - Receipt action buttons
- `@isa/remission/shared/search-item-to-remit-dialog` - Item search dialog
**Key Workflows:**
1. View mandatory (Pflicht) vs department (Abteilung) remissions
2. Create return receipts ("Warenbegleitschein")
3. Assign package numbers
4. Search and add items to remission
5. Complete remission items
6. Delete/continue remission
**API Dependencies:**
- Remission-specific APIs via ISA backend
---
### Domain 3: Checkout & Rewards
**Purpose:** Shopping cart, order placement, and loyalty rewards redemption
**Libraries (6):**
- `@isa/checkout/data-access` - Cart and checkout state
- `@isa/checkout/feature/reward-catalog` - Reward item browsing
- `@isa/checkout/feature/reward-shopping-cart` - Cart with rewards
- `@isa/checkout/feature/reward-order-confirmation` - Order confirmation
- `@isa/checkout/shared/product-info` - Product display
- `@isa/checkout/shared/reward-selection-dialog` - Reward selection UI
**Key Workflows:**
1. Add items to shopping cart
2. View cart items and totals
3. Redeem loyalty points for rewards
4. Browse available rewards
5. Place order with rewards
6. View order confirmation
**API Dependencies:**
- `checkout-api` - Cart and order APIs
- `crm-api` - Customer and bonus card info
**State Management:**
- NgRx Signal Store for cart/checkout state
- Reward selection dialog state
---
### Domain 4: Catalogue
**Purpose:** Product search and catalogue management
**Libraries (1):**
- `@isa/catalogue/data-access` - Catalogue search and filtering
**Key Capabilities:**
- Product search by EAN, title, author
- Loyalty program integration
- Format and edition handling
- Stock availability by location
**API Dependencies:**
- `cat-search-api` - Catalogue search
- `availability-api` - Stock availability
---
### Domain 5: Availability
**Purpose:** Product stock availability across retail locations
**Libraries (1):**
- `@isa/availability/data-access` - Availability queries
**Key Capabilities:**
- Check stock by location
- Support multiple order types
- Delivery method validation
**API Dependencies:**
- `availability-api` - Availability service
---
### Domain 6: CRM (Customer Relationship Management)
**Purpose:** Customer data, addresses, and bonus card management
**Libraries (1):**
- `@isa/crm/data-access` - Customer, address, and bonus card state
**Key Capabilities:**
- Customer lookup and management
- Shipping address management
- Payer information
- Bonus card (Prämienkarte) status and points
**API Dependencies:**
- `crm-api` - Customer management
---
### Shared Component Domains
#### UI Component Library (17 libraries)
Universal design system components used across all domains:
| Component | Purpose |
|-----------|---------|
| `ui-buttons` | Button variants (primary, secondary, ghost, etc.) |
| `ui-input-controls` | Form inputs, checkboxes, radio buttons |
| `ui-dialog` | Modal dialogs and alert boxes |
| `ui-datepicker` | Date range picker |
| `ui-layout` | Responsive layout utilities and breakpoint service |
| `ui-menu` | Dropdown menus |
| `ui-toolbar` | Top bar container |
| `ui-search-bar` | Search input with autocomplete |
| `ui-expandable` | Expandable/collapsible sections |
| `ui-empty-state` | Empty state messages |
| `ui-skeleton-loader` | Loading placeholders |
| `ui-carousel` | Horizontal scroll container |
| `ui-item-rows` | Data row display |
| `ui-progress-bar` | Progress indication |
| `ui-tooltip` | Tooltip overlays |
| `ui-label` | Tag/label components |
| `ui-bullet-list` | Bullet point lists |
**Design System Features:**
- Tailwind CSS + 7 custom plugins
- Custom breakpoints: Tablet, Desktop, DesktopL, DesktopXL
- ISA brand color palette (isa-accent-*, isa-text-*)
- Typography system (14 custom utilities)
- Consistent spacing and sizing
#### Shared Components (7 libraries)
Domain-agnostic components for product display and interaction:
| Component | Purpose |
|-----------|---------|
| `shared-address` | Address display (multi-line, inline) |
| `shared-filter` | Filter and search UI |
| `shared-product-image` | Product image with CDN support |
| `shared-product-format` | Format display (hardcover, audiobook, etc.) |
| `shared-product-router-link` | Product navigation links |
| `shared-quantity-control` | Quantity selector |
| `shared-scanner` | Barcode scanner interface |
---
### Core Infrastructure Libraries (5)
#### `@isa/core/config`
- Type-safe configuration management
- Runtime validation
- Nested object access
#### `@isa/core/logging`
- Structured logging with log levels
- Multiple output sinks (console, remote)
- Hierarchical context support
- Performance optimized
#### `@isa/core/navigation`
- Context preservation for multi-step flows
- Tab-scoped temporary state storage
- Return URL management
- Wizard state preservation
#### `@isa/core/storage`
- Type-safe storage abstraction
- NgRx Signals integration
- Multiple backends: localStorage, sessionStorage, IndexedDB
- Server-side user state sync
#### `@isa/core/tabs`
- Browser-like tab management
- Multi-tab navigation
- History tracking
- Intelligent persistence
---
### Common Utilities (3)
#### `@isa/common/data-access`
- Core data fetching patterns
- RxJS operator library
- Error handling and response models
- Request batching infrastructure
#### `@isa/common/decorators`
- Method validation decorators
- Caching and debouncing
- Rate limiting
- Enhanced logging decorators
#### `@isa/common/print`
- Printer discovery and selection
- Print queue management
- Label and office printer support
---
### Utility Libraries (3)
| Utility | Purpose |
|---------|---------|
| `@isa/utils/ean-validation` | EAN barcode validation with reactive forms |
| `@isa/utils/scroll-position` | Scroll position preservation |
| `@isa/utils/z-safe-parse` | Safe Zod parsing with fallbacks |
---
## Architecture Patterns
### 1. Feature-Based Organization
Each domain follows a **feature-based** organization:
```
libs/[domain]/
├── data-access/ # State store + API services
├── feature/ # Feature components (pages/views)
│ ├── feature-1/
│ ├── feature-2/
│ └── ...
├── shared/ # Domain-specific reusable components
└── utils/ # Domain-specific utilities
```
**Benefits:**
- Clear domain boundaries
- Easy to scale and maintain
- Explicit dependencies
- Parallel team development
### 2. Standalone Components
All new components use Angular's **standalone** architecture:
```typescript
@Component({
selector: 'oms-return-details',
standalone: true,
imports: [CommonModule, OmsSharedModule, UiButtonsModule],
template: `...`,
})
export class OmsReturnDetailsComponent {}
```
**Advantages:**
- Explicit dependencies in imports
- Tree-shakeable
- Easier to test
- No NgModule boilerplate
### 3. Signal-Based State Management
Uses modern **NgRx Signals** with functional composition:
```typescript
export const orderStore = signalStore(
withState({ orders: [] as Order[] }),
withEntities({ entity: type<Order>() }),
withMethods((store) => ({
loadOrders: rxMethod<void>(
pipe(
switchMap(() => api.getOrders()),
tapResponse(
(orders) => patchState(store, setAllEntities(orders)),
(error) => handleError(error)
)
)
),
})),
withStorage({ key: 'orders' }) // Session persistence
);
```
**Features:**
- Signals for reactive state
- Entity management for normalized data
- Request cancellation via `rxMethod()`
- Automatic persistence
- Type-safe
### 4. Data Access Layer Pattern
Each domain has a dedicated data-access library:
```typescript
// Service wrapping generated API
export class OmsApiService {
private api = inject(OmsApi);
getReceipt(id: string): Observable<Receipt> {
return this.api.getReceipt(id).pipe(
tapResponse(
(receipt) => Receipt.parse(receipt), // Zod validation
(error) => this.handleError(error)
)
);
}
}
// Domain store
export const omsStore = signalStore(
withEntities({ entity: type<Receipt>() }),
withMethods((store, api = inject(OmsApiService)) => ({
load: rxMethod<string>(
pipe(
switchMap((id) => api.getReceipt(id)),
tapResponse(
(receipt) => patchState(store, addEntity(receipt))
)
)
),
}))
);
```
### 5. Responsive Design with Breakpoint Service
Uses **breakpoint service** instead of CSS-only solutions:
```typescript
import { breakpoint, Breakpoint } from '@isa/ui/layout';
@Component({
template: `
@if (isDesktop()) {
<desktop-view />
} @else {
<mobile-view />
}
`,
})
export class ResponsiveComponent {
isDesktop = breakpoint([
Breakpoint.Desktop,
Breakpoint.DesktopL,
Breakpoint.DesktopXL
]);
}
```
**Available Breakpoints:**
- Tablet: max-width 1279px
- Desktop: 1280px - 1439px
- DesktopL: 1440px - 1919px
- DesktopXL: 1920px+
### 6. Error Handling & Validation
Two-tier approach with TypeScript + Zod:
```typescript
import { z } from 'zod';
// Schema definition
const OrderSchema = z.object({
id: z.string().uuid(),
items: z.array(OrderItemSchema),
total: z.number().positive(),
});
type Order = z.infer<typeof OrderSchema>;
// Usage
function processOrder(data: unknown): Result<Order> {
return OrderSchema.safeParse(data);
}
```
### 7. Request Cancellation
Built-in cancellation support via custom RxJS operators:
```typescript
export class ReturnSearchComponent {
private searchTerm$ = new Subject<string>();
search$ = this.searchTerm$.pipe(
debounceTime(300),
distinctUntilChanged(),
takeUntilKeydown('Escape'), // Cancel on ESC
switchMap((term) => this.api.search(term))
);
}
```
**Custom Operators:**
- `takeUntilAborted()` - Abort signal support
- `takeUntilKeydown()` - Keyboard event cancellation
- `takeUntilKeydownEscape()` - Escape key shortcut
---
## C4 Model Components
### C4 Level 1: System Context
```
┌─────────────────────────────────────────────────────────────┐
│ ISA Frontend │
│ (Angular 20.3.6 Monorepo - Order/Returns Management) │
│ - OMS (Order Management) │
│ - Remission (Returns Processing) │
│ - Checkout (Shopping Cart & Rewards) │
│ - Catalogue (Product Search) │
│ - CRM (Customer Management) │
└──────────────┬──────────────────────────────────────────────┘
┌────────┼────────┐
│ │ │
▼ ▼ ▼
┌──────────┐ ┌──────────┐ ┌──────────────┐
│ Backend │ │Browser/ │ │Native Mobile │
│ REST API │ │Web App │ │(WebView) │
└──────────┘ └──────────┘ └──────────────┘
```
### C4 Level 2: Container Architecture
```
┌─────────────────────────────────────────────────────────┐
│ ISA Frontend Application │
│ (Angular 20.3.6 SPA + PWA) │
│ │
│ ┌────────────────────────────────────────────────────┐ │
│ │ Routing & Shell │ │
│ │ - isa-app root │ │
│ │ - Tab navigation (5+ open tabs) │ │
│ │ - Auth flow │ │
│ └────────────────────────────────────────────────────┘ │
│ │ │
│ ┌──────────────────▼──────────────────────────────┐ │
│ │ Domain Feature Modules │ │
│ │ ┌────────────────────────────────────────────┐ │ │
│ │ │ OMS (Return Management) │ │ │
│ │ │ - Search → Details → Process → Review │ │ │
│ │ └────────────────────────────────────────────┘ │ │
│ │ ┌────────────────────────────────────────────┐ │ │
│ │ │ Remission (Warehouse Returns) │ │ │
│ │ │ - List → Receipt → Actions │ │ │
│ │ └────────────────────────────────────────────┘ │ │
│ │ ┌────────────────────────────────────────────┐ │ │
│ │ │ Checkout (Orders & Rewards) │ │ │
│ │ │ - Cart → Rewards → Confirmation │ │ │
│ │ └────────────────────────────────────────────┘ │ │
│ │ ┌────────────────────────────────────────────┐ │ │
│ │ │ Catalogue (Product Search) │ │ │
│ │ │ - Search → Browse → Details │ │ │
│ │ └────────────────────────────────────────────┘ │ │
│ │ ┌────────────────────────────────────────────┐ │ │
│ │ │ CRM (Customer Management) │ │ │
│ │ │ - Customer → Address → Bonus Card │ │ │
│ │ └────────────────────────────────────────────┘ │ │
│ └────────────────────────────────────────────────┘ │
│ │ │
│ ┌──────────────────▼──────────────────────────────┐ │
│ │ Shared Component Layer │ │
│ │ ┌──────────────────────────────────────────┐ │ │
│ │ │ UI Component Library (17 libs) │ │ │
│ │ │ Buttons, Forms, Dialogs, etc. │ │ │
│ │ └──────────────────────────────────────────┘ │ │
│ │ ┌──────────────────────────────────────────┐ │ │
│ │ │ Shared Components (7 libs) │ │ │
│ │ │ Product Info, Address, Scanner, etc. │ │ │
│ │ └──────────────────────────────────────────┘ │ │
│ └────────────────────────────────────────────────┘ │
│ │ │
│ ┌──────────────────▼──────────────────────────────┐ │
│ │ Data Access & State Layer │ │
│ │ ┌──────────────────────────────────────────┐ │ │
│ │ │ Domain Stores (NgRx Signals) │ │ │
│ │ │ - Order Store │ │ │
│ │ │ - Remission Store │ │ │
│ │ │ - Checkout Store │ │ │
│ │ │ - Catalogue Store │ │ │
│ │ │ - CRM Store │ │ │
│ │ └──────────────────────────────────────────┘ │ │
│ │ ┌──────────────────────────────────────────┐ │ │
│ │ │ Data Access Services │ │ │
│ │ │ (wrapping generated APIs) │ │ │
│ │ └──────────────────────────────────────────┘ │ │
│ └────────────────────────────────────────────────┘ │
│ │ │
│ ┌──────────────────▼──────────────────────────────┐ │
│ │ Infrastructure & Core Layer │ │
│ │ ┌──────────────────────────────────────────┐ │ │
│ │ │ Core Services (5 libs) │ │ │
│ │ │ - Config (runtime settings) │ │ │
│ │ │ - Logging (structured logging) │ │ │
│ │ │ - Navigation (context preservation) │ │ │
│ │ │ - Storage (localStorage/IDB) │ │ │
│ │ │ - Tabs (multi-tab management) │ │ │
│ │ └──────────────────────────────────────────┘ │ │
│ │ ┌──────────────────────────────────────────┐ │ │
│ │ │ Common Services (3 libs) │ │ │
│ │ │ - Data Access (batching, operators) │ │ │
│ │ │ - Decorators (caching, validation) │ │ │
│ │ │ - Print (printer management) │ │ │
│ │ └──────────────────────────────────────────┘ │ │
│ │ ┌──────────────────────────────────────────┐ │ │
│ │ │ Generated Swagger API Clients (10) │ │ │
│ │ │ - oms-api, checkout-api, crm-api, etc. │ │ │
│ │ └──────────────────────────────────────────┘ │ │
│ └────────────────────────────────────────────────┘ │
└─────────────────────────────────────────────────────┘
│ HTTP/WebSocket
┌──────────────────────────────────────────────────┐
│ Backend Services (REST + SignalR) │
├──────────────────────────────────────────────────┤
│ - ISA API (core business logic) │
│ - OMS API (order management) │
│ - Remission API (returns processing) │
│ - Checkout API (shopping cart) │
│ - CRM API (customer data) │
│ - Catalogue API (product search) │
│ - Availability API (stock checking) │
│ - Print API (label printing) │
│ - EIS API (enterprise info system) │
│ - WWS API (warehouse services) │
└──────────────────────────────────────────────────┘
┌──────────────────────────────────────────────────┐
│ External Services │
├──────────────────────────────────────────────────┤
│ - Database (SQL Server) │
│ - File Storage (CDN for product images) │
│ - Print Queue (label/office printers) │
│ - Barcode Scanner (Scandit SDK) │
│ - Analytics (Matomo) │
│ - OAuth/OIDC (authentication) │
└──────────────────────────────────────────────────┘
```
### C4 Level 3: Component Structure (OMS Domain Example)
```
┌──────────────────────────────────────────────────────────────┐
│ OMS Domain (Order Management System) │
│ (9 Libraries) │
├──────────────────────────────────────────────────────────────┤
│ │
│ ┌────────────────────────────────────────────────────────┐ │
│ │ Feature Components (Route-Level) │ │
│ │ ┌──────────────────────────────────────────────────┐ │ │
│ │ │ oms-feature-return-search │ │ │
│ │ │ - Search for receipts (EAN, order ID, date) │ │ │
│ │ │ - Filter and pagination │ │ │
│ │ │ - Imports: shared/product-info, ui/buttons │ │ │
│ │ └──────────────────────────────────────────────────┘ │ │
│ │ ┌──────────────────────────────────────────────────┐ │ │
│ │ │ oms-feature-return-details │ │ │
│ │ │ - View receipt items │ │ │
│ │ │ - Select items for return │ │ │
│ │ │ - Configure quantities and categories │ │ │
│ │ │ - Imports: shared/product-info, ui/* │ │ │
│ │ └──────────────────────────────────────────────────┘ │ │
│ │ ┌──────────────────────────────────────────────────┐ │ │
│ │ │ oms-feature-return-process │ │ │
│ │ │ - Dynamic return reason questions │ │ │
│ │ │ - Validation and backend integration │ │ │
│ │ │ - Imports: data-access, ui/input-controls │ │ │
│ │ └──────────────────────────────────────────────────┘ │ │
│ │ ┌──────────────────────────────────────────────────┐ │ │
│ │ │ oms-feature-return-summary │ │ │
│ │ │ - Review all return details │ │ │
│ │ │ - Confirm and submit │ │ │
│ │ │ - Trigger receipt printing │ │ │
│ │ │ - Imports: data-access, shared/*, ui/* │ │ │
│ │ └──────────────────────────────────────────────────┘ │ │
│ │ ┌──────────────────────────────────────────────────┐ │ │
│ │ │ oms-feature-return-review │ │ │
│ │ │ - View completed return confirmation │ │ │
│ │ │ - Display return receipt │ │ │
│ │ │ - Option to reprint │ │ │
│ │ │ - Imports: data-access, shared/* │ │ │
│ │ └──────────────────────────────────────────────────┘ │ │
│ └────────────────────────────────────────────────────────┘ │
│ │ │
│ ┌────────────────────────▼────────────────────────────────┐ │
│ │ Shared Components (Reusable UI) │ │
│ │ ┌──────────────────────────────────────────────────┐ │ │
│ │ │ oms-shared-product-info │ │ │
│ │ │ - Product row display │ │ │
│ │ │ - EAN, title, author, format, stock info │ │ │
│ │ │ - Imports: shared/product-*, ui/item-rows │ │ │
│ │ └──────────────────────────────────────────────────┘ │ │
│ │ ┌──────────────────────────────────────────────────┐ │ │
│ │ │ oms-shared-task-list │ │ │
│ │ │ - Display return tasks │ │ │
│ │ │ - Mark complete/incomplete │ │ │
│ │ │ - Imports: ui/expandable, ui/item-rows │ │ │
│ │ └──────────────────────────────────────────────────┘ │ │
│ └────────────────────────────────────────────────────────┘ │
│ │ │
│ ┌────────────────────────▼────────────────────────────────┐ │
│ │ Data Access Layer │ │
│ │ ┌──────────────────────────────────────────────────┐ │ │
│ │ │ oms-data-access │ │ │
│ │ │ │ │ │
│ │ │ NgRx Signal Stores: │ │ │
│ │ │ - receiptStore (list, details, filters) │ │ │
│ │ │ - returnStore (current return process) │ │ │
│ │ │ - questionStore (dynamic questions) │ │ │
│ │ │ │ │ │
│ │ │ Services: │ │ │
│ │ │ - OmsReceiptService (API wrapper) │ │ │
│ │ │ - OmsReturnService (return workflow) │ │ │
│ │ │ - PrintService (receipt printing) │ │ │
│ │ │ │ │ │
│ │ │ Imports: @generated/swagger/oms-api │ │ │
│ │ │ @generated/swagger/print-api │ │ │
│ │ │ @isa/core/logging │ │ │
│ │ │ @isa/common/data-access │ │ │
│ │ └──────────────────────────────────────────────────┘ │ │
│ └────────────────────────────────────────────────────────┘ │
│ │ │
│ ┌────────────────────────▼────────────────────────────────┐ │
│ │ Utilities │ │
│ │ ┌──────────────────────────────────────────────────┐ │ │
│ │ │ oms-utils-translation │ │ │
│ │ │ - Receipt type translations (Rechnung, etc.) │ │ │
│ │ │ - Service and pipe for formatting │ │ │
│ │ └──────────────────────────────────────────────────┘ │ │
│ └────────────────────────────────────────────────────────┘ │
│ │ │
└──────────────────────────┬───────────────────────────────────┘
┌──────────────────┼──────────────────┐
│ │ │
▼ ▼ ▼
┌──────────────┐ ┌──────────────┐ ┌──────────────┐
│ OMS API │ │ Print API │ │ ISA API │
│ │ │ │ │ │
│ - getReceipt │ │ - printLabel │ │ - createReturn
│ - listReceipts
│ - createReturn
└──────────────┘ └──────────────┘ └──────────────┘
```
### C4 Level 4: Code Structure (Single Component)
```typescript
// File: libs/oms/feature/return-search/src/return-search.component.ts
import { Component, OnInit, inject } from '@angular/core';
import { CommonModule } from '@angular/common';
import { ReactiveFormsModule } from '@angular/forms';
// Feature dependencies
import { OmsStore, omsStore } from '@isa/oms/data-access';
// Shared components
import { UiSearchBar } from '@isa/ui/search-bar';
import { UiButton, UiPrimaryButton } from '@isa/ui/buttons';
import { OmsProductInfoComponent } from '@isa/oms/shared/product-info';
// Shared utilities
import { UiEmptyState } from '@isa/ui/empty-state';
@Component({
selector: 'oms-feature-return-search',
standalone: true,
imports: [
CommonModule,
ReactiveFormsModule,
UiSearchBar,
UiButton,
UiPrimaryButton,
OmsProductInfoComponent,
UiEmptyState,
],
template: `
<div class="oms-return-search">
<ui-search-bar
(search)="onSearch($event)"
placeholder="EAN oder Bestellnummer eingeben"
/>
@if (store.receipts(); as receipts) {
@if (receipts.length > 0) {
<div class="receipt-list">
@for (receipt of receipts; track receipt.id) {
<oms-product-info [receipt]="receipt" />
}
</div>
} @else {
<ui-empty-state
title="Keine Belege gefunden"
description="Bitte versuchen Sie es mit einer anderen Suchanfrage"
/>
}
}
</div>
`,
})
export class OmsReturnSearchComponent implements OnInit {
// Inject the domain store (NgRx Signals)
protected store = inject(omsStore);
private router = inject(Router);
ngOnInit() {
// Load receipts on component init
// Store automatically handles state, persistence, etc.
}
onSearch(term: string) {
this.store.searchReceipts(term);
}
}
```
---
## Architectural Strengths
1. **Strong Domain Separation**: Clear boundaries between OMS, Remission, Checkout, etc.
2. **Scalable Structure**: 63 libraries organized by domain and layer
3. **Type Safety**: TypeScript + Zod validation across all APIs
4. **Modern Patterns**: Standalone components, signals, NgRx Signals stores
5. **Code Reuse**: 17 UI component libraries + 7 shared component libraries
6. **Testing Strategy**: Vitest + Jest with clear framework separation
7. **Build Performance**: Nx caching and incremental builds
8. **State Management**: Centralized, persistent, typed NgRx Signals stores
9. **Error Handling**: Global HTTP interceptors and consistent error patterns
10. **Responsive Design**: Breakpoint service for proper mobile/desktop support
---
## Architectural Considerations
1. **Migration from Jest to Vitest**: Currently 40 Jest libraries, moving to 21 Vitest
2. **Legacy Code**: Some legacy modules still exist alongside new standalone patterns
3. **Bundle Size**: Monitor carefully (2MB warning, 5MB error limits)
4. **Cache Management**: Nx cache can cause issues - use `--skip-nx-cache` for tests
5. **Authentication**: OAuth2/OIDC required for all API calls
6. **Multi-Tab State**: Tab navigation requires careful state management
---
## Key Files for Reference
- **Architecture Definition**: `/nx.json`, `/tsconfig.base.json`
- **Library Reference**: `/docs/library-reference.md`
- **Testing Guidelines**: `/docs/guidelines/testing.md`
- **App Bootstrap**: `/apps/isa-app/src/app/app.module.ts`
- **Routing**: `/apps/isa-app/src/app/app-routing.module.ts`
- **Configuration**: `/apps/isa-app/src/config/`
---
## Deployment & Build Configuration
### Development
```bash
npm start # Run with SSL (required for auth flows)
```
### Testing
```bash
npm test # All libraries except main app
npm run ci # CI with coverage
npx nx test <project> --skip-nx-cache # Specific project (fresh)
```
### Production Build
```bash
npm run build-prod # Production bundle
npx nx build isa-app --configuration=production
```
### API Generation
```bash
npm run generate:swagger # Regenerate all 10 Swagger clients
npm run fix:files:swagger # Unicode cleanup post-generation
```
### Documentation
```bash
npm run docs:generate # Update library reference
npm run prettier # Format code
```