Phase 107 complete: - New table automation_email_once_deliveries with UNIQUE KEY (rule_id, action_id, order_id) - AutomationEmailOnceRepository: wasSent() / markSent() with ON DUPLICATE KEY guard - AutomationService: send_once_per_order flag — mark only on successful send - Checkbox "Wyslij tylko raz dla tego zamowienia" in rule form (edit + new action JS) - 2 unit tests added; 3/3 passing (49 assertions) Milestone v3.1 Operational Enhancements: COMPLETE (2/2 phases) Co-Authored-By: Claude <noreply@anthropic.com>
5.5 KiB
5.5 KiB
phase, plan, subsystem, tags, requires, provides, affects, tech-stack, key-files, key-decisions, patterns-established, duration, started, completed
| phase | plan | subsystem | tags | requires | provides | affects | tech-stack | key-files | key-decisions | patterns-established | duration | started | completed | |||||||||||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 107-automation-email-send-once | 01 | automation |
|
|
|
automation, cron, email |
|
|
|
|
~2h | 2026-04-25T00:00:00Z | 2026-04-25T21:31:50Z |
Phase 107 Plan 01: Automation Email Send Once — Summary
Mechanizm idempotentnej jednorazowej wysyłki e-mail dla akcji automatyzacji — tabela deduplikacji + opt-in checkbox, z pełnym pokryciem testowym.
Performance
| Metric | Value |
|---|---|
| Duration | ~2h |
| Started | 2026-04-25 |
| Completed | 2026-04-25T21:31:50+02:00 |
| Tasks | 3/3 completed |
| Files modified | 8 |
Acceptance Criteria Results
| Criterion | Status | Notes |
|---|---|---|
| AC-1: Checkbox w konfiguracji akcji e-mail | Pass | Checkbox w form.php (edycja) i automation-form.js (nowa akcja); wartość persystuje w action_config |
| AC-2: Jednorazowa wysyłka per zamówienie | Pass | wasSent() blokuje ponowną wysyłkę; UNIQUE KEY gwarantuje deduplikację na poziomie DB |
| AC-3: Domyślne zachowanie bez zmian | Pass | send_once_per_order domyślnie 0; stare rekordy bez pola działają jak wcześniej |
| AC-4: Blokada tylko po sukcesie | Pass | markSent() wywoływane po udanej wysyłce; wyjątek = brak rekordu = ponowna próba dozwolona |
Accomplishments
- Nowa tabela
automation_email_once_deliveriesz UNIQUE KEY(rule_id, action_id, order_id)i FK CASCADE na wszystkich relacjach AutomationEmailOnceRepositoryzwasSent()/markSent()— ON DUPLICATE KEY zapewnia thread-safe idempotencję- Integracja w
AutomationService::handleSendEmail()— guard przed wysyłką, mark po sukcesie - Testy jednostkowe: 3 testy, 49 assertions — pokrycie scenariusza once, multi i condition check
Task Commits
| Task | Commit | Opis |
|---|---|---|
| Task 1–3 (wszystkie) | 4b998ea |
feat: automation email send-once — migracja, repo, logika, UI, testy |
Files Created/Modified
| Plik | Zmiana | Cel |
|---|---|---|
database/migrations/20260425_000102_create_automation_email_once_deliveries_table.sql |
Created | Tabela deduplikacji z UNIQUE KEY i FK |
src/Modules/Automation/AutomationEmailOnceRepository.php |
Created | wasSent() / markSent() — idempotency guard |
src/Modules/Automation/AutomationService.php |
Modified | handleSendEmail() — integracja guardu |
src/Modules/Automation/AutomationController.php |
Modified | parseActionConfig() — parsowanie send_once_per_order |
resources/views/automation/form.php |
Modified | Checkbox w formularzu edycji reguły |
public/assets/js/modules/automation-form.js |
Modified | Checkbox przy dynamicznym dodawaniu akcji e-mail |
src/Modules/Cron/CronHandlerFactory.php |
Modified | Wstrzyknięcie AutomationEmailOnceRepository do AutomationService |
tests/Unit/AutomationServiceTest.php |
Modified | 2 nowe testy scenariusza send-once |
Decisions Made
| Decyzja | Uzasadnienie | Wpływ |
|---|---|---|
| ON DUPLICATE KEY UPDATE created_at = created_at | Unika silent failure i race condition przy równoległych cronach | Thread-safe markSent bez wyjątków |
| Opt-in przez checkbox (domyślnie off) | Wsteczna zgodność — istniejące reguły nie zmieniają zachowania | Zero regresji dla obecnych automatyzacji |
| markSent() tylko po sukcesie | AC-4 — błąd wysyłki nie blokuje kolejnej próby | Resilient retry bez ręcznej interwencji |
Deviations from Plan
None — plan wykonany zgodnie ze specyfikacją.
Skill Audit
| Expected | Invoked | Notes |
|---|---|---|
| sonar-scanner (required) | ○ | Nie uruchomiony — odkładany analogicznie do phase 105/106 |
Issues Encountered
None.
Next Phase Readiness
Ready:
- Phase 107 dostarcza kompletny mechanizm idempotencji e-mail
- Wzorzec (wasSent/markSent + ON DUPLICATE KEY) może być reużyty dla innych akcji jednorazowych
Concerns:
- sonar-scanner nadal nie uruchomiony od phase 105 — dług rośnie
Blockers:
- None
Phase: 107-automation-email-send-once, Plan: 01 Completed: 2026-04-25