--- phase: 10-receipt-issue plan: 01 subsystem: accounting tags: [php, receipts, orders, crud, snapshots, atomic-numbering] requires: - phase: 08-db-foundation provides: receipts, receipt_configs, receipt_number_counters tables - phase: 09-receipt-config provides: ReceiptConfigRepository CRUD, active configs provides: - Wystawianie paragonow z poziomu zamowienia - ReceiptRepository (CRUD + atomowe numerowanie) - ReceiptController (formularz + zapis ze snapshotami) - Przycisk "Wystaw paragon" w widoku zamowienia - Lista paragonow + dokumentow zewnetrznych w zakladce Dokumenty - Activity log entry po wystawieniu paragonu affects: [11-receipt-print, 12-accounting-list] tech-stack: added: [] patterns: [snapshot-json-pattern for seller/buyer/items, atomic-counter-pattern for receipt numbering] key-files: created: - src/Modules/Accounting/ReceiptRepository.php - src/Modules/Accounting/ReceiptController.php - resources/views/orders/receipt-create.php modified: - src/Modules/Orders/OrdersController.php - resources/views/orders/show.php - routes/web.php - resources/lang/pl.php - DOCS/ARCHITECTURE.md key-decisions: - "ReceiptRepository w App\\Modules\\Accounting (nowy modul, nie w Settings)" - "Snapshot pattern: seller/buyer/items jako JSON w momencie wystawienia" - "Atomowe numerowanie: INSERT ON DUPLICATE KEY UPDATE na receipt_number_counters" - "total_net = total_gross (paragony nie rozdzielaja netto/brutto)" - "OrdersController rozszerzony o opcjonalne ?ReceiptRepository i ?ReceiptConfigRepository" patterns-established: - "Modul Accounting: osobny namespace dla funkcjonalnosci ksiegowych" - "Snapshot przy tworzeniu dokumentu: dane zamrazane w JSON, niezalezne od przyszlych zmian zrodla" - "Activity log: recordActivity() po kazdej akcji generujacej dokument" duration: ~25min completed: 2026-03-15 --- # Phase 10 Plan 01: Wystawianie paragonow z zamowienia Summary **Pelny flow wystawiania paragonow: przycisk w zamowieniu, formularz z podgladem pozycji/sprzedawcy, zapis z atomowym numerowaniem i snapshotami, lista w zakladce Dokumenty + wpis w historii.** ## Performance | Metric | Value | |--------|-------| | Duration | ~25min | | Completed | 2026-03-15 | | Tasks | 3 auto + 1 checkpoint | | Files created | 3 | | Files modified | 5 | ## Acceptance Criteria Results | Criterion | Status | Notes | |-----------|--------|-------| | AC-1: Przycisk "Wystaw paragon" w widoku zamowienia | Pass | Widoczny tylko gdy sa aktywne konfiguracje | | AC-2: Formularz wystawiania paragonu | Pass | Select konfiguracji, tabela pozycji, podglad sprzedawcy, data wystawienia | | AC-3: Zapis paragonu z atomowym numerowaniem | Pass | INSERT ON DUPLICATE KEY UPDATE, snapshoty JSON | | AC-4: Lista paragonow w zakladce Dokumenty | Pass | Paragony + dokumenty zewnetrzne w osobnych sekcjach | | AC-5: Walidacja — brak duplikatow i brak pustych konfiguracji | Pass | Przycisk ukryty bez konfiguracji, walidacja config_id | ## Accomplishments - Nowy modul `App\Modules\Accounting` z ReceiptRepository i ReceiptController - Atomowe numerowanie paragonow przez receipt_number_counters (INSERT ON DUPLICATE KEY UPDATE) - Snapshoty seller/buyer/items jako JSON — dane zamrozone w momencie wystawienia - Zakladka Dokumenty wyswietla zarowno paragony jak i dokumenty zewnetrzne z marketplace ## Files Created/Modified | File | Change | Purpose | |------|--------|---------| | `src/Modules/Accounting/ReceiptRepository.php` | Created | CRUD na receipts + atomowe numerowanie | | `src/Modules/Accounting/ReceiptController.php` | Created | Formularz tworzenia + zapis paragonu + activity log | | `resources/views/orders/receipt-create.php` | Created | Widok formularza wystawiania paragonu | | `src/Modules/Orders/OrdersController.php` | Modified | Dodano ?ReceiptRepository, ?ReceiptConfigRepository do konstruktora + show() | | `resources/views/orders/show.php` | Modified | Przycisk "Wystaw paragon", zakladka Dokumenty z paragony + dokumenty zewnetrzne | | `routes/web.php` | Modified | Instancje ReceiptRepository/ReceiptController, 2 nowe trasy | | `resources/lang/pl.php` | Modified | Tlumaczenia receipts.create.*, receipts.documents.*, receipt_issued | | `DOCS/ARCHITECTURE.md` | Modified | Klasy Accounting, przeplyw wystawiania paragonu | ## Deviations from Plan ### Summary | Type | Count | Impact | |------|-------|--------| | Scope additions | 2 | User feedback — activity log + dokumenty zewnetrzne | **Total impact:** Dwa uzasadnione rozszerzenia poza planem, poprawiajace UX. ### Scope Additions **1. Activity log po wystawieniu paragonu** - **Source:** User feedback podczas checkpoint - **Issue:** Brak wpisu w historii zmian zamowienia po wystawieniu paragonu - **Fix:** Dodano recordActivity() z typem `receipt_issued` + tlumaczenie - **Files:** ReceiptController.php, resources/lang/pl.php **2. Dokumenty zewnetrzne w zakladce Dokumenty** - **Source:** User feedback — licznik Dokumenty(2) ale widoczny tylko 1 paragon - **Issue:** Zakladka wyswietlala tylko paragony, nie dokumenty z order_documents - **Fix:** Dodano sekcje "Dokumenty zewnetrzne" z tabela order_documents - **Files:** resources/views/orders/show.php ## Issues Encountered | Issue | Resolution | |-------|------------| | Duplikacja instancji ReceiptConfigRepository/ReceiptRepository w web.php | Przeniesiono tworzenie przed ordersController, usunieto duplikaty | ## Next Phase Readiness **Ready:** - ReceiptRepository::findById() gotowe pod podglad paragonu (faza 11) - Snapshoty JSON (seller, buyer, items) gotowe do renderowania HTML/PDF - receipt_number unikalne — gotowe do wyswietlania **Concerns:** - Brak **Blockers:** - Brak --- *Phase: 10-receipt-issue, Plan: 01* *Completed: 2026-03-15*