No description
Tarif-Datenmodell (Decision-Update): - plans: Starter/Business/Pro/Agency mit Monats-/Jahrespreis (Jahres = 10 x Monat), PM-Kontingent, Tageslimit, Stripe-IDs; idempotenter Seeder - single_purchases: Einzel-PM, Extra-PM, Boost, PDF-Nachweis mit Status-Lifecycle und Stripe-Checkout-Referenzen - laravel/cashier ^16.5 installiert (freigegeben); User ist Billable, Cashier-Migrationen published + ausgefuehrt; lokale invoices()-Relation ueberschreibt bewusst die Cashier-Methode Hybride Rechnungskreise (Entscheidung 12.06.2026): - invoice_number_sequences + InvoiceNumberGenerator: atomare fortlaufende Nummern pro Kreis (STR- fuer den neuen Stripe-Shop, MAN- fuer den manuellen Legacy-Kreis); Alt-Archiv legacy_invoices bleibt unveraendert - ManualInvoiceService + billing:generate-manual-invoices (Scheduler taeglich 04:30): prueft aktive/grandfathered user_payment_options ohne Stripe-Subscription auf erreichtes Periodenende, friert die Rechnungsadresse als Snapshot ein, stellt die MAN-Rechnung aus (Zahlungsziel billing.manual_due_days) und schaltet die Periode weiter; Konditions-Overrides via legacy_conditions, sonst Netto-Preis + billing.vat_rate; nicht abrechenbare Faelle werden geloggt und beim naechsten Lauf erneut geprueft Submit-Gate: - User::hasActiveBooking() prueft jetzt echt (hinter billing.enforce_booking): Cashier-Abo, bezahlter Einzel-/Extra-PM-Kauf oder laufende Legacy-Vereinbarung (MAN-Kreis) Suite: 468 passed, 4 skipped (17 neue Billing-Tests). Pint clean. Offen fuer 9E: Stripe-Checkout/Webhooks, STR-Spiegelung, Slot-Logik auf Plan-Kontingent, Migration der aktiven Legacy-Zahlungen in user_payment_options. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> |
||
|---|---|---|
| .agents/skills | ||
| .codex | ||
| .devcontainer | ||
| .github/workflows | ||
| _docs | ||
| app | ||
| bootstrap | ||
| config | ||
| database | ||
| dev | ||
| docs | ||
| public | ||
| resources | ||
| routes | ||
| storage/debugbar | ||
| tests | ||
| .cursorrules | ||
| .editorconfig | ||
| .env.example | ||
| .gitattributes | ||
| .gitignore | ||
| .mcp.json | ||
| AGENTS.md | ||
| artisan | ||
| boost.json | ||
| CLAUDE.md | ||
| composer.json | ||
| composer.lock | ||
| docker-compose.yml | ||
| package-lock.json | ||
| package.json | ||
| phpstan-baseline.neon | ||
| phpstan.neon | ||
| phpunit.xml | ||
| pint.json | ||
| Readme.md | ||
| setup-new-asset-urls.sh | ||
| tailwind.portal.config.js | ||
| tailwind.web.config.js | ||
| vite | ||
| vite.config.js | ||
| vite.portal.config.js | ||
| vite.shared.js | ||
| vite.web.config.js | ||
Multi-Domain Laravel-Anwendung
Übersicht
Diese Laravel-Anwendung unterstützt verschiedene Domains mit unterschiedlichen Styles:
- Haupt-Website: https://pressekonto.test (lokal) / https://pressekonto.de (live) – Haupt-Portal Admin-Page
- APP_PRESSEECHO: https://presseecho.test
- APP_BUSINESSPORTAL: https://businessportal24.test
Installation
- Repository klonen
- Abhängigkeiten installieren:
composer install npm install - Umgebungsvariablen konfigurieren (siehe
.env.exampleundDOMAINS-CONFIG.md) - Laravel-Anwendung initialisieren:
php artisan key:generate php artisan migrate - Assets kompilieren:
npm run build npm run build:admin npm run build:web
Domain-Konfiguration
Die Domains werden über die .env-Datei konfiguriert. Für detaillierte Anweisungen siehe DOMAINS-CONFIG.md.
Lokaler Entwicklungsserver
php artisan serve
Asset-Kompilierung
Diese Anwendung verwendet Vite mit verschiedenen Konfigurationen:
- Hauptkompilierung:
npm run devodernpm run build - Admin-Assets:
npm run build:admin - Web-Assets:
npm run build:web
Domain-Simulation
Während der Entwicklung können Domains simuliert werden, ohne die Hosts-Datei zu bearbeiten:
- In der
.env-Datei:DEV_SIMULATE_DOMAIN=true - Gewünschte Domain angeben:
DEV_SIMULATED_DOMAIN=landing1.local
Favicons
Um Platzhalter-Favicons für alle konfigurierten Domains zu generieren:
php artisan domains:generate-favicons