Caja — Pflichtenheft: Übersicht & Management-Summary
Dieses Dokument ist die Einstiegsseite des Pflichtenhefts. Es gibt Kontext, orientiert im Gesamtsystem, verlinkt auf alle Fachkapitel und hält die verbindlichen Entscheidungen fest. Alle nachgelagerten Kapitel bauen auf diesem Fundament auf. Letzte Aktualisierung: 2026-06-26.
1. Vision & Management-Summary
Caja (ES: Box und Kasse) ist die dedizierte All-in-One-Backend-Plattform der Dominicano Express GmbH — einem Schweizer Familienunternehmen, das seit 2026 See-Fracht zwischen der Schweiz und der Dominikanischen Republik betreibt.
Das Problem heute
Das operative Geschäft wird über eine Kombination aus einem Excel-ERP (Erfassung_Digitar, ERP_DASHBOARD FULL.xlsx), manuellen WhatsApp-Chats, Papierformularen am Depot und verstreuten Insellösungen abgewickelt. Konsequenzen:
- Finanzbuchungen entstehen manuell, mit Zeitverzug und Fehlerrisiko
- Kundenstamm ist dezentral; Duplikate sind die Regel
- Box-Tracking und Container-Status sind nur im Kopf oder auf Papier
- Affiliate-Provisionen werden nachträglich manuell ausgerechnet
- MWST-Scharfschaltung würde heute einen Systemwechsel erzwingen
Die Lösung: Caja
Eine App ersetzt alle Insellösungen. Der entscheidende Kerngewinn: operative Events erzeugen die Finanzbuchungen automatisch — statt Excel-Zeilen manuell nachzupflegen. Das Prinzip zieht sich durch den gesamten Fluss:
| Ohne Caja | Mit Caja |
|---|---|
| Offerte per WhatsApp, Preis im Kopf | Offerte aus Preisliste → PDF → WhatsApp, ein Klick |
| Auftrag = neue Excel-Zeile | Auftrag → Boxen (UUID+QR) + Sendung automatisch |
| Tracking = Telefonanruf | 10 Schritte pro Box, sichtbar für alle Rollen |
| Zahlung = manuelle Ledger-Zeile | Zahlung → bucht automatisch ins movements-Ledger |
| Affiliate-Provision = Monatsrecherche | Provision entsteht synchron mit dem Auftrag |
Team & Rollen
| Person | Rolle | Caja-Rollencode |
|---|---|---|
| Marcel | Geschäftsführer | ADMIN |
| Mariela | Administration / Mitgründerin | BUCHHALTUNG |
| Markus | Operations / Gründer | OPERATIONS |
| Arkys | Fahrer / Logistik | FAHRER |
Externe Affiliates und ein optionaler Read-only-Zugang (z. B. Treuhänder) sind in Phase 2 vorgesehen.
2. Durchgängiger Fluss
Alle 8 Fachmodule sind durch einen einzigen, durchgängigen Datenfluss verbunden. Kein Modul ist eine Insel.
Diagramm wird geladen …
Geteilte Kern-Entitäten (modulübergreifend)
Diese Tabellen existieren einmal und werden von allen Modulen referenziert. Änderungen an ihnen haben modulübergreifende Konsequenzen.
| Entität | Heimat | Konsumiert von |
|---|---|---|
contacts | CRM (Modul 1) | allen Modulen |
movements | Finanzen (Modul 6) | Logistik, Affiliate, Plattform |
payment_methods | Plattform (Modul 8) | Finanzen, Logistik, Depot |
movement_types | Plattform (Modul 8) | Finanzen, Auto-Posting-Engine |
box_products | Produkte (Modul 3) | Offerten, Logistik, Depot |
boxes | Logistik (Modul 5) | Tracking, Depot, QR |
shipments | Logistik (Modul 5) | Container, Tracking, CRM |
containers | Logistik (Modul 5) | Shipments, Dashboard |
quotes | Offerten (Modul 4) | Aufträge, Affiliate, Finanzen |
orders | Logistik (Modul 5) | Boxen, Sendung, Rechnungen, movements |
invoices | Finanzen (Modul 6) | movements, Affiliate-Trigger |
deposit_orders / deposit_payments | Logistik/Depot (Modul 5) | movements, Boxen |
affiliates + referral_codes | Affiliate (Modul 7) | Offerten, Aufträge, Provisionen |
commission_entries + commission_payouts | Affiliate (Modul 7) | movements |
audit_log | Plattform (Modul 8) | alle schreibenden Tabellen |
Kanonisches Schema (DDL, alle 48 Tabellen, Konflikt-Auflösungen K-01..K-21): Dokument 30 — Schema konsolidiert
3. Die 8 Fachmodule
| # | Modul | Kernfunktion | Dokument |
|---|---|---|---|
| 1 | CRM / Kundenstamm | Golden Record aller Parteien (Kunden, Leads, Lieferanten, Affiliates, Empfänger DR); Lead-Intake (Website + WhatsApp); Dedup/Merge | 10-crm.md |
| 2 | WhatsApp + OCR / Ausweis | ID-Scan (Cédula/Pass) via WhatsApp/Kamera → OCR → Kundensatz vorfüllen (KYC/Zoll-Matching) | 11-whatsapp-ocr.md |
| 3 | Produkte & Preise | Box-/Fass-Typen; variable Preislisten (saisonal/effective-dated); Zonen-/Zielortpreise; Depot-Sätze | 12-produkte-preise.md |
| 4 | Offerten | Aus Katalog + Rabatte + Affiliate-Code → PDF → WhatsApp/E-Mail; Statusfluss draft→sent→accepted→Auftrag | 13-offerten.md |
| 5 | Logistik / ERP | Auftrag → Boxen (UUID+QR) → 10 Tracking-Schritte; Container-Management; Depot-Lifecycle (Rückgabe/Verfall) | 14-logistik-tracking.md |
| 6 | Finanzen | movements-Ledger (Single SoT); Auto-Posting; Kasse/Bank/Twint; Debitoren/Kreditoren; MWST schema-ready; Monats-/Jahresabschluss | 15-finanzen.md |
| 7 | Affiliate-Programm | Affiliates + Rabatt-/Referral-Codes; Provisions-Berechnung; Affiliate-Abrechnung/Payout; Mini-Portal (spätere Phase) | 16-affiliate.md |
| 8 | Plattform | Auth (Magic-Link); Rollen/RLS; i18n DE/ES/EN; Audit-Log (OR 957/GeBüV); Dokument-Storage; Notifications (WhatsApp/E-Mail) | 17-plattform.md |
Design-System & Mobile-Patterns
Das Design-System ist kein eigenes Fachmodul, aber ein verbindliches Querschnittskapitel, das alle anderen Module beeinflusst.
| Thema | Dokument |
|---|---|
| Design-System, Breakpoints, Navigation, Kamera-Flows | 18-design-mobile.md |
Querschnitts-Kapitel
| Thema | Dokument |
|---|---|
| IST-Kontext: Alt-ERP „LCCargo" — bestehende Fachlogik als Anforderungsbasis | 05-legacy-ist.md |
| Technische Architektur (Monorepo, App-Router, RLS, i18n, PWA, Auto-Posting-Engine, Deployment) | 20-architektur.md |
| Kanonisches Supabase-Schema (konsolidiert, alle 48 Tabellen, Konflikt-Auflösungen) | 30-schema-konsolidiert.md |
| Roadmap & 4-Wochen-Umsetzungsplan (Go-Live 25.07.2026, Mermaid-Timeline) + Phasen-Detail P0–P4 | 40-roadmap.md |
| Compliance- & Sicherheits-Matrix (OR 957, GeBüV, MWST, revDSG, ZG) | 45-compliance.md |
| Offene Punkte / Completeness-Critic (Lücken, Widersprüche, fehlende Verbindungen) | 99-offene-punkte.md |
4. Tech-Stack ("Atlas")
Der Stack ist fix und abgeleitet vom internen Atlas-Projekt (atlas.zvv.dev). Er ist nicht verhandelbar — alle Modulspezifikationen gehen von diesem Stack aus.
Core
| Layer | Technologie | Rolle in Caja |
|---|---|---|
| Framework | Next.js 15 (App Router) + TypeScript | Server Components, Server Actions, API-Routes |
| Styling | Tailwind CSS 4 + shadcn/ui (Radix UI + lucide-react) | Design-Tokens, Komponenten-Bibliothek |
| Daten (Tabellen) | TanStack Table | Adaptive Listen → Karten auf Mobile |
| Charts | Recharts / ECharts | Dashboard KPI-Kacheln, Trend-Charts |
| Backend | Supabase | Postgres 15+, Auth (Magic-Link), RLS, Storage |
| Hosting | Vercel | Separate Vercel-Projekte pro App (Web, Caja, CajaSpec) |
| Analytics | Vercel Web Analytics | Datenschutzkonform, ohne Cookie-Banner |
UI-Konventionen (Atlas-Muster)
- Sidebar (Desktop/Tablet) + Command-Palette (⌘K) — globale Navigation und Schnellsuche
- KPI-Kacheln — Dashboard-Einstieg jedes Moduls
- Action-State-Forms + Toasts — Formular-Feedback ohne Page-Reload
- Empty-States + Skeletons — kein leeres Weiss, kein FOUC
- Light / Dark via Design-Tokens (
CSS Custom Properties) — systemseitig oder manuell wählbar
Monorepo-Struktur (Soll-Zustand)
dominicanoexpress.com/ ← Privates Familien-GmbH-Repo
├── apps/
│ ├── web/ ← LIVE: statische Website (nicht anfassen)
│ ├── cajaspec/ ← DIESE Spec-Site (cajaspec.dominicanoexpress.com)
│ └── caja/ ← NEU: die App (Next.js App Router, caja.dominicanoexpress)
├── packages/
│ ├── db/ ← @caja/db: Supabase-Clients, Typen, Query-Helfer, RLS
│ ├── ui/ ← @caja/ui: geteilte shadcn-Komponenten
│ ├── i18n/ ← @caja/i18n: Locale-Loading, Type-safe Keys
│ └── config/ ← @caja/config: ESLint, TSConfig, Tailwind-Preset
└── dokumente/ ← gitignored (sensibel → SharePoint)
Details: Dokument 20 — Technische Architektur
5. Mobile/Tablet-First — Harte Kern-Pflicht
Mobile/Tablet-First ist keine Responsive-Nachbesserung, sondern eine strukturelle Entscheidung, die jede Layout-, Navigations- und Datenbankdesign-Entscheidung beeinflusst.
Warum
Das Feldteam (Arkys am Depot, Markus am Container-Terminal) arbeitet ausschliesslich auf Handy oder Tablet. Mariela arbeitet im Büro vorwiegend auf Tablet. Marcel hat als einziger einen regulären Desktop-Kontext.
Verbindliche Regeln
| Regel | Konkret |
|---|---|
| Design ab 375px | Kein Feature ist nur Desktop-tauglich |
| Tablet als Haupt-Formfaktor | Alle primären Workflows passen auf 768px ohne Horizontal-Scroll |
| Adaptive Listen | Tabelle (Tablet/Desktop) → Karten (Handy); KEIN Horizontal-Scroll |
| Navigation | Bottom-Tab-Bar + Drawer (Handy); kollabierbare Sidebar (Tablet+Desktop) |
| Touch-Targets | Alle interaktiven Elemente ≥ 44px |
| Quick-Entry thumb-optimiert | Bottom-Sheet-Selects, inputmode="numeric", Swipe-Aktionen |
| Camera-First | Box-QR scannen, Ausweis/OCR, Belege direkt aus Kamera |
| PWA installierbar | manifest.json, offline-tolerant (Cache + Queue für Tracking-Updates) |
| Performance-Budget | Mittelklasse-Android (z. B. Motorola G52); LCP < 2.5s auf 4G |
6. Dreisprachigkeit DE / ES / EN
Caja ist vollständig dreisprachig. Die Sprache ist nie in der Logik verdrahtet — interne Fachcodes (IDs, source_type, Rollen-Codes, Status-Werte) sind die Wahrheit; DE/ES/EN sind Anzeige-Schichten.
| Schicht | Mechanismus |
|---|---|
| Lookup-Tabellen | Inline-Spalten label_de / label_es / label_en auf allen Lookup-Entitäten |
| Freie UI-Texte | locale_strings(namespace, key, locale, value) — Seed aus GLOSSAR-ERP_DE-ES-EN.csv |
| Stabile Codes | Immer englischsprachige Kurzformen (ADMIN, EXPENSE, EMPTY_DELIVERED), nie übersetzt, nie in Logik hartkodiert |
| Benutzerpräferenz | app_users.preferred_locale ∈ {de, es, en} |
7. Fixe Entscheidungen
Diese Entscheidungen sind abgeschlossen und werden in den Modul-Specs als gegeben behandelt. Sie werden hier nicht mehr zur Diskussion gestellt.
| # | Entscheidung | Begründung |
|---|---|---|
| E-01 | Buchhaltung = Cash-Basis + Offene Posten, KEINE doppelte Buchführung | GmbH 2026, Startphase; Treuhänder erhält Export, erstellt formalen Abschluss |
| E-02 | MWST: schema-ready, inaktiv | Pflicht erst ab CHF 100'000 Umsatz; Aktivierung ohne Schema-Migration via vat_rates.active |
| E-03 | Alle fachlich erweiterbaren Status-Mengen als Lookup-Tabellen (TEXT-Code-PK), nicht als Postgres-enum | Migrations-Flexibilität, i18n, keine ALTER TYPE bei Erweiterung |
| E-04 | Postgres-enum nur für technisch-geschlossene Mengen ohne i18n-Bedarf: discount_kind, commission_kind | Zweielementige, stabile Mengen (PERCENT/ABSOLUTE) |
| E-05 | contacts und app_users getrennt | contacts = Geschäftspartei; app_users = Login-Identität (Team + Affiliate) |
| E-06 | app_users(id) als Referenz für alle created_by/actor_id-Spalten | Einheitlich, kein Mix mit contacts(id) oder auth.users direkt |
| E-07 | Kein hartes DELETE auf finanziell relevante Daten | Storno via voided_at + Neubuchung; RLS-Policy for delete using (false) auf movements |
| E-08 | Auto-Posting via idempotenten Upsert auf (source_type, source_id) | Verhindert Doppelbuchungen bei Retry/Webhook-Wiederholung |
| E-09 | Caja ist ein eigenständiges Vercel-Projekt im selben Monorepo | Live-Website (apps/web) bleibt unberührt; separate Build-Pipeline |
| E-10 | Mehrwährung (DOP/USD) ist out of scope für MVP | Alle Beträge in CHF (numeric(12,2)); Erweiterung möglich, aber nicht spezifiziert |
| E-11 | Kanonisches Schema = Dokument 30 | Bei Widerspruch zwischen Modul-Spec und Dok 30 gewinnt immer Dok 30 |
| E-12 | Affiliate-Mini-Portal ist spätere Phase (nach P2) | Genug Daten erst verfügbar, wenn Affiliate-Programm läuft |
8. Roadmap-Phasen (Übersicht)
| Phase | Name | Kerngewinn | Aufwand ca. |
|---|---|---|---|
| P0 | Fundament | Auth, RLS, i18n, Audit-Log, Lookups — produktionsreif, bevor Fach-Code entsteht | 3–4 Wochen |
| P1 | CRM + Finanzen-Kern | Erster produktiver Excel-Ersatz; Ledger läuft, Kunden sind drin | 4–5 Wochen |
| P2 | Produkte, Preise, Offerten, Affiliate-Codes | Vollständiger kommerzieller Zyklus: Preisliste → Offerte → Auftrag → Provision | 3–4 Wochen |
| P3 | Logistik: Boxen, Tracking, Container | Operativer Kernfluss; Box-QR, 10 Schritte, Container-Board, Depot-Lifecycle | 4–5 Wochen |
| P4 | WhatsApp + OCR + Dedup | Automatisierter Lead-Intake; Ausweis-Scan → Kontakt; Duplikat-Bereinigung | 3–4 Wochen |
Umsetzung als 4-Wochen-Plan bis Go-Live 25.07.2026 (parallelisiert, KI-gestützt aus der Spec — s. 40-roadmap.md mit Mermaid-Timeline). Die sequentielle Schätzung (~18–22 Wochen) bleibt die fachliche Aufschlüsselung der Phasen.
Details: Dokument 40 — Roadmap
9. Compliance-Rahmen (Kurzübersicht)
Vollständige Matrix: Dokument 45 — Compliance & Sicherheit
| Regelwerk | Caja-Relevanz |
|---|---|
| OR 957–963b | Ledger movements als ordnungsgemässe Buchhaltung; 10 Jahre Aufbewahrung |
| GeBüV | audit_log append-only; Periodensperre; Backup; Export-Migrierbarkeit |
| MWSTG/MWSTV | Schema-ready, inaktiv (Pflicht ab CHF 100'000 Umsatz) |
| revDSG | Personendaten (contacts, kyc_scans), Drittland-Transfer CH→DR, Bearbeitungsverzeichnis |
| ZG | KYC-Zweckbindung (Cédula/Pass für Zolldossier) |
10. 🔲 Zu bestätigen — Index
Alle offenen Geschäftsentscheide und Klärungspunkte, die die Implementierung blockieren könnten. Technische Lücken/Widersprüche sind in Dokument 99 — Offene Punkte separat geführt.
| # | Thema | Entscheid gebraucht von | Heimat |
|---|---|---|---|
| OE-01 | MWST-Pflicht-Eintritt: ab wann, Saldosteuermethode oder effektiv? | Finanzen (Modul 6), Compliance (Dok 45) | Treuhänder |
| OE-02 | OCR-Provider: Google Vision, AWS Textract oder anderer? | Modul 2 (WhatsApp/OCR) | Marcel + Tech |
| OE-03 | Depot-Rückgabefrist: nach wie vielen Tagen verfällt das Depot (heute mündliche Regel)? | Modul 5 (Logistik) | Markus/Mariela |
| OE-04 | Zonen-Taxonomie DR: welche Provinzen/Municipios bilden welche Preiszone? | Modul 3 (Produkte/Preise) | Markus |
| OE-05 | Empfänger-Benachrichtigung in DR: WhatsApp via welchem Business-Konto / API-Tier? | Modul 8 (Plattform) | Marcel |
| OE-06 | Affiliate-Provisions-Satz: einheitlich oder pro Produkt-Typ? | Modul 7 (Affiliate) | Marcel |
| OE-07 | Revisionspflicht: ordentliche Revision oder Opting-out (OR 727a)? | Compliance (Dok 45) | Treuhänder |
| OE-08 | Mehrwährung DOP/USD: explizit out of scope für Vollausbau, oder spätere Phase? | Modul 6 (Finanzen) | Marcel |
Gelöst (F-01): keine eigene order_lines-Tabelle — Positionen leben (eingefroren) in quote_lines + Box-Materialisierung. Siehe Dok 30 §2.6. | Modul 4/5, Dok 30 | erledigt | |
| OE-10 | Kreditoren-Workflow: Struktur ✅ gelöst (F-02) — Kreditoren bleiben manuell (movements, source_type='manual', Typen EXPENSE/SUPPLIER_PAYMENT/SUPPLIER_DEBT). Offen nur noch (🔲): welche Lieferantentypen werden in Phase 1 erfasst? | Modul 6, Dok 99 F-02 | Marcel/Mariela |
| OE-11 | OCR-Rohbild-Aufbewahrung: serverseitig löschen nach Verarbeitung (Datenschutz) oder aufbewahren (Zoll-Nachweis)? | Modul 2, Dok 99 F-21 | Marcel + Rechtsgutachten |
| OE-12 | WhatsApp-API-Tier für Lead-Intake: Cloud API (Meta) oder Business-App-Webhook? | Modul 2, Plattform | Marcel |
11. Lesereihenfolge
Empfohlene Reihenfolge für Erstleser:
- Dieses Dokument (00-overview.md) — Gesamtüberblick, Fluss, Entscheidungen
- 05-legacy-ist.md — IST-Kontext: was das Alt-ERP fachlich kann (Anforderungsbasis)
- 20-architektur.md — wie alles technisch verdrahtet ist (Monorepo, RLS, i18n, Auto-Posting)
- 30-schema-konsolidiert.md — die einzige Wahrheitsquelle des Datenmodells
- 10-crm.md → 11-whatsapp-ocr.md — Einstiegspunkte des Flusses
- 12-produkte-preise.md → 13-offerten.md — kommerzieller Zyklus
- 14-logistik-tracking.md — operativer Kernfluss
- 15-finanzen.md — Ledger + Auto-Posting
- 16-affiliate.md — Provisions-Layer
- 17-plattform.md — Auth, RLS, i18n, Audit, Notifications
- 18-design-mobile.md — Design-System, Mobile-Patterns
- 40-roadmap.md — Phasen und Prioritäten
- 45-compliance.md — rechtliche Anforderungen
- 50-us-logistik.md ff. — User Stories (Connextra + Gherkin) je Epic
- 99-offene-punkte.md — technische Lücken (vor Implementierung lesen!)