# CLAUDE.md This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository. ## Project Overview German-language MLM/direct-sales e-commerce platform for organic/natural products ("Gruene Seele" / Green Soul). Partners/distributors get personal whitelabel shops, earn commissions through a multi-level hierarchy, and manage orders, invoices, and promotions. **Stack:** PHP 8.4, Laravel 11 (using Laravel 10 directory structure), Bootstrap 4, jQuery, Laravel Mix (webpack), MySQL, Laravel Passport (API auth). ## Common Commands ```bash # Tests (Pest v2, uses SQLite in-memory) php artisan test # run all tests php artisan test tests/Feature/ExampleTest.php # run single file php artisan test --filter=testName # filter by name # Code formatting (Laravel Pint) vendor/bin/pint --dirty # format changed files only vendor/bin/pint # format all files composer format # alias for pint # Frontend (Laravel Mix, NOT Vite) npm run dev # development build npm run prod # production build npm run watch # watch mode # Artisan - always pass --no-interaction php artisan make:model Name --no-interaction php artisan make:test --pest Name --no-interaction ``` ## Architecture ### Multi-Domain Routing (`routes/web.php`) Three separate domain groups, each with distinct middleware: - **Main domain** (`config('app.domain')`) - admin panel + user dashboard - **Promo domain** (`config('app.promo_domain')`) - public promotion/microsite pages - **Shop domain** (`config('app.shop_domain')`) - public whitelabel shop ### Admin Access Levels (middleware in `app/Http/Middleware/`) - `CopyReader` - admin >= 1 (product/content management) - `Admin` - admin >= 7 (sales, customers, promotions) - `SuperAdmin` - admin >= 8 (users, shipping, settings) - `SysAdmin` - admin >= 9 (system tools, imports) ### Key Service Layer - **`app/Services/Yard.php`** + `app/Services/Yard/` - Custom shopping cart (extends forked Gloudemans Cart in `packages/digital-bird/shoppingcart/`). Handles shipping, tax, margins, commissions. - **`app/Services/Invoice.php`** - Invoice and cancellation invoice PDF generation (uses DomPDF) - **`app/Services/PaymentReminderService.php`** - Payment reminder logic with status progression - **`app/Services/Credit.php`** - User credit/balance management - **`app/Services/Stats/`** - Sales statistics ### Repository Pattern Business logic uses repositories in `app/Repositories/` (e.g., `CheckoutRepository`, `InvoiceRepository`, `CustomerRepository`). Controllers delegate to repositories and services. ### Local Packages `packages/digital-bird/shoppingcart/` - Forked `gloudemans/shoppingcart`, autoloaded via composer PSR-4 as `Gloudemans\Shoppingcart\`. ### Cron Jobs (`app/Console/Kernel.php`) - `payments:accounts` - Checks user account expiry, sends reminders (statuses 31/33/34/35), deactivates expired accounts - `payments:reminders` - Sends payment reminders for open invoices ### API (`routes/api.php`) No versioning. Passport-authenticated endpoints for WordPress integration (`/api/wp/*`) and auth (`/api/auth/*`). ### Global Helpers `app/helpers.php` (autoloaded) - URL helpers, formatting delegates to `App\Services\Util`. ### PDF Generation - `app/Libraries/InvoicePDF.php`, `ContractPDF.php` - FPDF/FPDI based - `app/Services/Invoice.php` - DomPDF based (Blade templates in `resources/views/pdf/`) ## Important Conventions - This project uses **Laravel 10 directory structure** on Laravel 11. Do NOT migrate to Laravel 11 structure. - Middleware registration: `app/Http/Kernel.php` - Exception handling: `app/Exceptions/Handler.php` - Schedule: `app/Console/Kernel.php` - Default auth guard is `user` (not `web`), configured in `config/auth.php` - User model is `App\User` (not `App\Models\User`) - Views are Blade templates with Bootstrap 4 + jQuery DataTables - Always run `vendor/bin/pint --dirty` before finalizing changes - Countries supported: DE, FR, CH, NL (with reverse charge VAT handling)