85 lines
4.2 KiB
Markdown
85 lines
4.2 KiB
Markdown
# 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)
|