feat(08-10-receipt-module): phases 08-10 complete — receipt issuing from orders

Phase 08 — DB Foundation:
- 3 new tables: receipt_configs, receipts, receipt_number_counters
- company_settings extended with BDO, REGON, KRS, logo fields

Phase 09 — Receipt Config:
- CRUD for receipt configurations (Settings > Accounting)
- ReceiptConfigController + ReceiptConfigRepository

Phase 10 — Receipt Issuing:
- ReceiptRepository with atomic numbering (INSERT ON DUPLICATE KEY UPDATE)
- ReceiptController with snapshot pattern (seller/buyer/items as JSON)
- "Wystaw paragon" button in order view
- Documents tab showing both receipts and marketplace documents
- Activity log entry on receipt creation

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-03-15 19:49:06 +01:00
parent 3bccc7a533
commit ed057fc304
31 changed files with 2539 additions and 39 deletions

View File

@@ -9,6 +9,7 @@
- `App\Modules\Orders`
- `App\Modules\Users`
- `App\Modules\Settings`
- `App\Modules\Accounting` (modul paragonow — wystawianie z zamowien)
## Routing
- `GET /login`, `POST /login`, `POST /logout`
@@ -54,6 +55,10 @@
- `POST /settings/integrations/shoppro/statuses/save`
- `POST /settings/integrations/shoppro/statuses/sync`
- `POST /settings/integrations/shoppro/delivery/save`
- `GET /settings/accounting`
- `POST /settings/accounting/save`
- `POST /settings/accounting/toggle`
- `POST /settings/accounting/delete`
- `GET /health`
- `GET /` (redirect)
@@ -111,6 +116,10 @@
- `App\Modules\Settings\AllegroOrdersSyncService`
- `App\Modules\Settings\AllegroOrderSyncStateRepository`
- `App\Modules\Settings\AllegroStatusSyncService`
- `App\Modules\Settings\ReceiptConfigController`
- `App\Modules\Settings\ReceiptConfigRepository`
- `App\Modules\Accounting\ReceiptRepository`
- `App\Modules\Accounting\ReceiptController`
- `App\Modules\Shipments\ShipmentProviderInterface`
- `App\Modules\Shipments\ShipmentProviderRegistry`
- `App\Modules\Shipments\ApaczkaShipmentService`
@@ -197,6 +206,39 @@
- `Statusy` (`/settings/statuses`).
- `Cron` (`/settings/cron`).
- `Integracje` (`/settings/integrations`) - wspolny hub konfiguracji providerow.
- `Ksiegowosc` (`/settings/accounting`) - konfiguracja paragonow.
## Przeplyw Ustawienia > Ksiegowosc (konfiguracja paragonow)
- `GET /settings/accounting`:
- `ReceiptConfigController::index(Request): Response`
- pobiera liste konfiguracji przez `ReceiptConfigRepository::listAll()`,
- opcjonalnie laduje konfiguracje do edycji przez `findById()` (query param `edit`),
- renderuje widok `resources/views/settings/accounting.php`.
- `POST /settings/accounting/save`:
- `ReceiptConfigController::save(Request): Response`
- waliduje CSRF, nazwe (wymagana) i format numeracji (wymagany, musi zawierac `%N`),
- zapisuje przez `ReceiptConfigRepository::save(...)` (INSERT lub UPDATE wg obecnosci `id`).
- `POST /settings/accounting/toggle`:
- `ReceiptConfigController::toggleStatus(Request): Response`
- przelacza `is_active` przez `ReceiptConfigRepository::toggleStatus(...)`.
- `POST /settings/accounting/delete`:
- `ReceiptConfigController::delete(Request): Response`
- usuwa konfiguracje przez `ReceiptConfigRepository::delete(...)`,
- FK RESTRICT blokuje usuniecie jesli istnieja powiazane paragony.
## Przeplyw Wystawianie paragonu z zamowienia
- `GET /orders/{id}/receipt/create`:
- `ReceiptController::create(Request): Response`
- pobiera zamowienie (OrdersRepository::findDetails), aktywne konfiguracje, dane sprzedawcy,
- renderuje formularz `resources/views/orders/receipt-create.php`.
- `POST /orders/{id}/receipt/store`:
- `ReceiptController::store(Request): Response`
- waliduje CSRF, config_id, istnienie zamowienia,
- buduje snapshoty: seller_data_json (z company_settings), buyer_data_json (z adresow zamowienia), items_json (z pozycji),
- oblicza total_gross, sale_date (wg sale_date_source z konfiguracji), order_reference_value,
- generuje numer atomowo przez `ReceiptRepository::getNextNumber(...)` (INSERT ON DUPLICATE KEY UPDATE na receipt_number_counters),
- zapisuje paragon przez `ReceiptRepository::create(...)`,
- redirect na /orders/{id} z flash success.
## Przeplyw Ustawienia > Cron
- `GET /settings/cron`: