feat(14-email-templates): CRUD szablonów e-mail z Quill.js + załączniki

Phase 14 complete (2 plans):
- 14-01: CRUD szablonów, Quill.js editor, system zmiennych {{grupa.pole}}, podgląd, toggle
- 14-02: Select "Załącznik nr 1" z mapą ATTACHMENT_TYPES, kolumna w liście, migracja attachment_1

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-03-16 23:59:25 +01:00
parent 4d091b2441
commit 2f73a940de
12 changed files with 479 additions and 25 deletions

View File

@@ -0,0 +1,112 @@
---
phase: 14-email-templates
plan: 02
subsystem: database, ui
tags: [email, templates, attachments, receipt]
requires:
- phase: 14-email-templates/14-01
provides: CRUD szablonów e-mail, Quill.js editor, system zmiennych
provides:
- Konfiguracja załącznika na poziomie szablonu (attachment_1)
- Mapa typów załączników ATTACHMENT_TYPES w kontrolerze
affects: [15-email-sending]
tech-stack:
added: []
patterns: [ATTACHMENT_TYPES const map for extensible attachment options]
key-files:
created:
- database/migrations/20260316_000001_add_attachment1_to_email_templates.sql
modified:
- src/Modules/Settings/EmailTemplateController.php
- src/Modules/Settings/EmailTemplateRepository.php
- resources/views/settings/email-templates.php
- DOCS/DB_SCHEMA.md
key-decisions:
- "ATTACHMENT_TYPES jako stała mapa w kontrolerze — rozszerzalność bez zmian DB/widoku"
- "attachment_1 VARCHAR(50) zamiast ENUM — elastyczność dodawania nowych typów"
patterns-established:
- "Centralna mapa typów załączników: dodanie nowego typu = 1 linia w ATTACHMENT_TYPES"
duration: ~15min
started: 2026-03-16
completed: 2026-03-16
---
# Phase 14 Plan 02: Załączniki w szablonach e-mail — Summary
**Select "Załącznik nr 1" w szablonach e-mail z opcją "Paragon", rozszerzalną mapą typów ATTACHMENT_TYPES, kolumną w liście i pełnym CRUD.**
## Performance
| Metric | Value |
|--------|-------|
| Duration | ~15min |
| Started | 2026-03-16 |
| Completed | 2026-03-16 |
| Tasks | 3 completed (2 auto + 1 checkpoint) |
| Files modified | 5 |
## Acceptance Criteria Results
| Criterion | Status | Notes |
|-----------|--------|-------|
| AC-1: Kolumna attachment_1 w DB | Pass | VARCHAR(50) DEFAULT NULL, zweryfikowane DESCRIBE |
| AC-2: Zapis i odczyt przez formularz | Pass | receipt zapisywane/odczytywane poprawnie |
| AC-3: Opcja "brak" czyści attachment_1 | Pass | Pusta wartość → NULL w DB |
| AC-4: Kolumna "Załącznik" w liście | Pass | "Paragon" / "—" wyświetlane poprawnie |
## Accomplishments
- Kolumna `attachment_1` w `email_templates` z migracją na serwerze
- Centralna mapa `ATTACHMENT_TYPES` w kontrolerze — dodanie nowego typu załącznika = 1 linia PHP
- Select w formularzu generowany dynamicznie z mapy (nie hardkodowany)
- Kolumna "Zalacznik" w liście szablonów z rozwiązywaniem label z mapy
- Walidacja po stronie serwera: tylko klucze z ATTACHMENT_TYPES akceptowane
## Files Created/Modified
| File | Change | Purpose |
|------|--------|---------|
| `database/migrations/20260316_000001_add_attachment1_to_email_templates.sql` | Created | Migracja: kolumna attachment_1 |
| `src/Modules/Settings/EmailTemplateController.php` | Modified | ATTACHMENT_TYPES const, walidacja, przekazanie do widoku |
| `src/Modules/Settings/EmailTemplateRepository.php` | Modified | attachment_1 w SELECT, INSERT, UPDATE |
| `resources/views/settings/email-templates.php` | Modified | Select w formularzu + kolumna w tabeli |
| `DOCS/DB_SCHEMA.md` | Modified | Opis kolumny attachment_1 |
## Decisions Made
| Decision | Rationale | Impact |
|----------|-----------|--------|
| ATTACHMENT_TYPES jako stała mapa | User request: w przyszłości inne typy niż paragon | Dodanie nowego typu = 1 linia w tablicy PHP |
| VARCHAR(50) zamiast ENUM | Nowe typy bez ALTER TABLE | Elastyczność kosztem minimalnej walidacji (robiona w PHP) |
| Walidacja przez array_key_exists | Tylko znane typy akceptowane | Bezpieczeństwo: nieznane wartości → NULL |
## Deviations from Plan
None — plan executed exactly as written.
## Issues Encountered
None.
## Next Phase Readiness
**Ready:**
- Faza 15 może odczytać `attachment_1` z szablonu (`listActive()` zawiera pole)
- Jeśli `attachment_1 === 'receipt'` → dołączyć PDF paragonu (dompdf już dostępny z fazy 11)
- Mapa ATTACHMENT_TYPES może być referencją dla logiki generowania załączników
**Concerns:**
- Brak — prosta konfiguracja, logika generowania w fazie 15
**Blockers:**
- None
---
*Phase: 14-email-templates, Plan: 02*
*Completed: 2026-03-16*