diff --git a/.paul/PROJECT.md b/.paul/PROJECT.md
index 034922d..b5c6325 100644
--- a/.paul/PROJECT.md
+++ b/.paul/PROJECT.md
@@ -106,6 +106,7 @@ Sprzedawca może obsługiwać zamówienia ze wszystkich kanałów
- [x] Wizualna flaga wiekowa na liscie zamowien: czerwona ramka o rosnacej intensywnosci dla zamowien 4-7+ dniowych — Phase 101
- [x] Naprawa tworzenia przesylek Apaczka dla dlugich adresow: auto-truncate dla uslug punktowych (ORLEN/Paczkomat), walidacja + blad dla uslug kurierskich — Phase 102
- [x] Naprawa auto-click etykiety po utworzeniu przesylki: klik na najnowsza paczke zamiast najstarszej (buttons[0] vs buttons[length-1]) — Phase 103
+- [x] Apaczka Paczka w Weekend: checkbox "Dostawa w weekend (sobota)" dla uslug InPost paczkomatowych + mapowanie pole formularza weekend_delivery -> option[19] w API Apaczki — Phase 104
- [ ] Eliminacja zduplikowanego kodu: SslCertificateResolver, ToggleableRepositoryTrait, RedirectPathResolver, ReceiptService — Phase 68
### Active (In Progress)
@@ -208,6 +209,6 @@ Quick Reference:
---
*PROJECT.md — Updated when requirements or context change*
-*Last updated: 2026-04-11 after Phase 96 completion (Automation Payment Method Condition)*
+*Last updated: 2026-04-17 after Phase 104 completion (Apaczka Weekend Delivery)*
diff --git a/.paul/ROADMAP.md b/.paul/ROADMAP.md
index 6599b8d..060b8d8 100644
--- a/.paul/ROADMAP.md
+++ b/.paul/ROADMAP.md
@@ -64,6 +64,7 @@ Wersja mobilna aplikacji, modul po module. Cel: pelna uzywalnosc orderPRO na tel
| 101 | Aged Orders Row Highlight | 1/1 | Complete |
| 102 | Apaczka Receiver Street Length | 1/1 | Complete |
| 103 | Print Autoclick Fix | 1/1 | Complete |
+| 104 | Apaczka Weekend Delivery | 1/1 | Complete |
| TBD | Mobile Orders List | - | Not started |
| TBD | Mobile Order Details | - | Not started |
| TBD | Mobile Settings | - | Not started |
@@ -387,4 +388,4 @@ Archive: `.paul/milestones/v0.1-ROADMAP.md`
---
*Roadmap created: 2026-03-12*
-*Last updated: 2026-04-11 - phase 96 unified (Automation Payment Method Condition)*
+*Last updated: 2026-04-17 - phase 104 unified (Apaczka Weekend Delivery)*
diff --git a/.paul/STATE.md b/.paul/STATE.md
index 06ce03d..da95262 100644
--- a/.paul/STATE.md
+++ b/.paul/STATE.md
@@ -2,22 +2,22 @@
## Project Reference
-See: .paul/PROJECT.md (updated 2026-04-12)
+See: .paul/PROJECT.md (updated 2026-04-17)
**Core value:** Sprzedawca moze obslugiwac zamowienia ze wszystkich kanalow sprzedazy i nadawac przesylki bez przelaczania sie miedzy platformami.
-**Current focus:** Milestone v3.0 - Phase 97 complete, ready for next phase
+**Current focus:** Milestone v3.0 - Phase 104 complete, ready for next phase
## Current Position
Milestone: v3.0 Mobile Responsive - In progress
-Phase: 103 (Print Autoclick Fix) — Complete
-Plan: 103-01 Complete
+Phase: 104 (Apaczka Weekend Delivery) — Complete
+Plan: 104-01 Complete
Status: Loop closed, ready for next PLAN
-Last activity: 2026-04-16 — UNIFY Phase 103 complete
+Last activity: 2026-04-17 — UNIFY Phase 104 complete
Progress:
- Milestone: [#########.] ~96%
-- Phase 103: [##########] 100%
+- Phase 104: [##########] 100%
## Loop Position
@@ -29,7 +29,7 @@ PLAN ──▶ APPLY ──▶ UNIFY
## Session Continuity
-Last session: 2026-04-16
-Stopped at: Phase 103 Complete
+Last session: 2026-04-17
+Stopped at: Phase 104 Complete
Next action: /paul:plan dla kolejnej fazy
-Resume file: .paul/phases/103-print-autoclick-fix/103-01-SUMMARY.md
+Resume file: .paul/phases/104-apaczka-weekend-delivery/104-01-SUMMARY.md
diff --git a/.paul/changelog/2026-04-17.md b/.paul/changelog/2026-04-17.md
new file mode 100644
index 0000000..1e5cec1
--- /dev/null
+++ b/.paul/changelog/2026-04-17.md
@@ -0,0 +1,25 @@
+# 2026-04-17
+
+## Co zrobiono
+
+- [Phase 104, Plan 01] Apaczka Weekend Delivery — opcjonalna usluga "Paczka w Weekend" dla przesylek Apaczki paczkomatowych InPost
+- Backend: `ApaczkaShipmentService::buildOptionsPayload()` mapuje pole `weekend_delivery` na `option[19] = 1` w payloadzie API Apaczki
+- Stala `OPTION_KEYS = ['weekend_delivery' => 19]` jako rozszerzalne mapowanie pole formularza -> id opcji Apaczki
+- Frontend: checkbox "Dostawa w weekend (sobota)" w formularzu prepare.php widoczny tylko dla supplier=INPOST + paczkomat (door_to_point=1 lub point_to_point=1)
+- JS toggle oparty na atrybutach `data-supplier`/`data-paczkomat` na
selektu uslug (data-supplier, data-paczkomat)"
+
+duration: ~35min
+started: 2026-04-17T00:00:00Z
+completed: 2026-04-17T00:35:00Z
+---
+
+# Phase 104 Plan 01: Apaczka Weekend Delivery Summary
+
+**Dodano opcjonalna usluge "Paczka w Weekend" dla przesylek Apaczki paczkomatowych InPost — checkbox w formularzu mapowany na `option[19]=1` w payloadzie `order_send` API Apaczki v2.**
+
+## Performance
+
+| Metric | Value |
+|--------|-------|
+| Duration | ~35min |
+| Started | 2026-04-17T00:00:00Z |
+| Completed | 2026-04-17T00:35:00Z |
+| Tasks | 3/3 completed |
+| Files modified | 5 |
+
+## Acceptance Criteria Results
+
+| Criterion | Status | Notes |
+|-----------|--------|-------|
+| AC-1: Checkbox widoczny tylko dla paczkomatow Apaczka InPost | Pass | Toggle JS sprawdza `data-supplier=INPOST` + `data-paczkomat=1`; reset stanu przy zmianie uslugi/przewoznika |
+| AC-2: Zaznaczony checkbox dodaje option[19]=1 do payloadu | Pass | `createShipment` warunkowo wstrzykuje `$apiPayload['option']` tylko gdy tablica niepusta; brak regresji dla scenariusza bez opcji |
+| AC-3: Test jednostkowy pokrywa mapowanie pola formularza | Pass | 3 nowe testy (`testBuildOptionsPayloadWeekendEnabled/Disabled/EmptyForm`) zielone |
+
+## Accomplishments
+
+- Operator moze wlaczac dostawe w weekend dla Apaczki InPost paczkomat bez wchodzenia recznie na panel apaczka.pl.
+- Backend i frontend skonsolidowane wokol jednego kontraktu (`weekend_delivery` -> `option[19]`), z testami pokrywajacymi mapping.
+- Wzorzec `OPTION_KEYS` przygotowuje grunt pod kolejne opcje Apaczki (np. `25` = dostawa w godzinach, `58` = ostroznie, `31` = SMS) — przyszle dodanie to 1 linia w stalej + 1 wpis w UI.
+
+## Task Commits
+
+| Task | Commit | Type | Description |
+|------|--------|------|-------------|
+| Task 1: Backend buildOptionsPayload + integracja w createShipment | (pending phase commit) | feat | Stala OPTION_KEYS + metoda + warunkowe `option` w payloadzie |
+| Task 2: Frontend checkbox "Dostawa w weekend" + toggle JS | (pending phase commit) | feat | HTML checkbox, data-* atrybuty na
, JS toggleWeekendOption |
+| Task 3: Testy jednostkowe + dokumentacja | (pending phase commit) | test+docs | 3 testy PHPUnit, ARCHITECTURE.md, TECH_CHANGELOG.md |
+
+Atomowe commity per task pominiete — zmiany trafia w pojedynczym commicie fazowym `feat(104-apaczka-weekend-delivery): ...` w transition-phase.
+
+## Files Created/Modified
+
+| File | Change | Purpose |
+|------|--------|---------|
+| `src/Modules/Shipments/ApaczkaShipmentService.php` | Modified (+31) | Stala `OPTION_KEYS`, metoda `buildOptionsPayload`, integracja w `createShipment` |
+| `src/Modules/Shipments/ShipmentController.php` | Modified (+1, hotfix) | Przekazanie pola `weekend_delivery` z requestu do `formData` providera |
+| `resources/views/shipments/prepare.php` | Modified (+31) | Checkbox `weekend_delivery`, atrybuty data-* na
, JS toggle |
+| `tests/Unit/ApaczkaShipmentServiceTest.php` | Modified (+29) | Helper `invokeBuildOptions` + 3 nowe testy |
+| `DOCS/ARCHITECTURE.md` | Modified (+1) | Wpis o `buildOptionsPayload` w sekcji `POST /orders/{id}/shipment/create` |
+| `DOCS/TECH_CHANGELOG.md` | Modified (+8) | Wpis Phase 104 z opisem zmian, mapowania i testow |
+
+## Decisions Made
+
+| Decision | Rationale | Impact |
+|----------|-----------|--------|
+| Stale id opcji `19` zaszyte w stalej PHP (nie pobierane dynamicznie z service_structure) | Apaczka traktuje numery opcji jako kontrakt API; dynamiczne wyszukiwanie po nazwie byloby krucha (lokalizacja, slowotworstwo). Stala = jasny kontrakt | Przy ewentualnej zmianie ID po stronie API — jedno miejsce do aktualizacji |
+| Brak walidacji okna "Paczka w Weekend" (czw 20:00 - pt 18:00) | API Apaczki/InPost zwraca jasny blad poza tym oknem; replikacja logiki po stronie klienta = ryzyko driftu | Operator widzi blad z API; brak false-positive blokady |
+| Checkbox tylko dla supplier=INPOST | Dokumentacja Apaczki "Paczka w Weekend" wskazuje InPost jako jedynego supplera; UPS/POCZTA nie maja tej uslugi | Inne suppliery nie zobacza checkboxa |
+| Brak rozszerzenia presetow przesylek o flage weekendu | Decyzja swiadoma — operator wlacza weekend swiadomie per-przesylke; preset moglby utrwalic kosztowniejsza opcje | Mozliwa kolejna faza (preset advanced options) |
+
+## Deviations from Plan
+
+### Summary
+
+| Type | Count | Impact |
+|------|-------|--------|
+| Auto-fixed | 1 | Hotfix integracyjny w ShipmentController (UAT wykryl, ze checkbox nie skutkowal) |
+| Scope additions | 0 | n/a |
+| Deferred | 1 | Test integracyjny pelnego flow (controller -> service) — logged below |
+
+**Total impact:** Plan dostarczyl wartosc; bug integracyjny wykryty podczas UAT i zalataniem 1-linii.
+
+### Auto-fixed Issues
+
+**1. [Integration bug] Pole weekend_delivery nie bylo przekazywane z requestu do formData providera**
+- **Found during:** UAT po zamknieciu plan-loop (operator zaznaczyl checkbox, etykieta wygenerowana bez option[19])
+- **Issue:** `ShipmentController::create()` (linie 182-207) buduje `$formData` poprzez recznie wymieniona liste pol z requestu. Nowe pole `weekend_delivery` nie zostalo dodane do listy, wiec `ApaczkaShipmentService::buildOptionsPayload()` dostawal tablice bez tego klucza i zwracal pusta tablice opcji.
+- **Fix:** Dodano linie 207: `'weekend_delivery' => (string) $request->input('weekend_delivery', '')`.
+- **Files:** `src/Modules/Shipments/ShipmentController.php` (+1)
+- **Verification:** Operator powtorzyl UAT z UI po fixie — przesylka utworzona z opcja Paczka w Weekend.
+- **Root cause planu:** Test jednostkowy `ApaczkaShipmentServiceTest::testBuildOptionsPayload*` testowal metode przez Reflection (omijajac kontroler). Plan 104-01 nie wymagal testu integracyjnego pelnego flow.
+
+### Deferred Items
+
+- **DEFER-104-01:** Brak testu integracyjnego pokrywajacego pelny flow `ShipmentController::create()` → `ApaczkaShipmentService::createShipment()`. Aktualne testy jednostkowe nie zlapalyby brakujacego pola w formData. Mozliwe rozwiazania: (a) refactor `ShipmentController::create()` na przekazywanie `$request->all()` zamiast recznej listy pol (eliminuje cala klase bugow); (b) test integracyjny z mock'owanym `ProviderRegistry`. Sugerowana ewentualna kolejna faza housekeeping.
+
+## Issues Encountered
+
+| Issue | Resolution |
+|-------|------------|
+| TECH_CHANGELOG.md ma konwencje newest-at-top, ale plan instruowal "na koncu pliku" | Zastosowano explicit instrukcje planu (na koncu pliku); konwencja moze byc znormalizowana w przyszlej fazie housekeeping |
+
+## Next Phase Readiness
+
+**Ready:**
+- Wzorzec `OPTION_KEYS` gotowy do rozszerzenia o kolejne opcje Apaczki (25=dostawa w godzinach, 58=ostroznie, 31=SMS, 11=ROD).
+- Frontend toggle JS oparty na `data-supplier`/`data-paczkomat` mozna powtorzyc dla innych przewoznikow.
+
+**Concerns:**
+- Dokumentacja Apaczka API v2 nie precyzuje na poziomie service_structure jakie opcje sa dostepne dla konkretnej uslugi — w razie wprowadzenia kolejnych opcji warto rozwazyc walidacje przy wyborze uslugi.
+
+**Blockers:** None
+
+---
+*Phase: 104-apaczka-weekend-delivery, Plan: 01*
+*Completed: 2026-04-17*
diff --git a/DOCS/ARCHITECTURE.md b/DOCS/ARCHITECTURE.md
index 3ab721e..44f4935 100644
--- a/DOCS/ARCHITECTURE.md
+++ b/DOCS/ARCHITECTURE.md
@@ -351,6 +351,7 @@
- `apaczka` ustawia jawnie `pickup.type` (`SELF`/`COURIER`) na podstawie uslugi i obecnosci `sender_point_id`; dla `COURIER` dopelnia tez `pickup.date`, `pickup.hours_from`, `pickup.hours_to`,
- dla uslug punktowych `apaczka` payload adresu zawiera aliasy identyfikatora punktu (`point`, `foreign_address_id`, `point_id`) dla nadania i odbioru,
- `ApaczkaShipmentService::buildReceiverAddress(...)` sklada dane odbiorcy z fallbackami (formularz -> delivery -> punkt odbioru z `parcel_name` -> customer), a dla przesylek punktowych dodatkowo probuje uzupelnic adres punktu przez API `points`; przy dalszych brakach dopelnia minimum techniczne, aby nie blokowac tworzenia.
+ - `ApaczkaShipmentService::buildOptionsPayload(array $formData): array` mapuje pola formularza (`weekend_delivery`) na klucze `option[]` w payloadzie API Apaczki (`order_send`). Klucz `19` = dostawa w sobote (InPost Paczka w Weekend); stala `OPTION_KEYS` trzyma mape pole_formularza -> id_opcji, walidacja boolean przez `filter_var(..., FILTER_VALIDATE_BOOL, FILTER_NULL_ON_FAILURE)`.
- `GET /orders/{id}/shipment/{packageId}/status`:
- `ShipmentController::checkStatus(Request): Response`,
- wybiera providera po `shipment_packages.provider` i deleguje `checkCreationStatus(...)`.
diff --git a/DOCS/TECH_CHANGELOG.md b/DOCS/TECH_CHANGELOG.md
index dd7f46d..26e0845 100644
--- a/DOCS/TECH_CHANGELOG.md
+++ b/DOCS/TECH_CHANGELOG.md
@@ -993,7 +993,15 @@ Odwrocenie kierunku mapowania statusow w integracjach shopPRO i Allegro.
- wspiera `--use-remote` i `--dry-run`.
- Wykonano podmiane statusow na bazie zdalnej (`--use-remote`): zaktualizowano 30 zamowien.
-
+## 2026-04-17 — Phase 104: Apaczka Weekend Delivery Option
+
+Dodanie opcji "Dostawa w weekend (sobota)" dla przesylek Apaczka + InPost paczkomat.
+
+- **Zmiana:** W formularzu przygotowania przesylki dodano checkbox "Dostawa w weekend (sobota)" widoczny dla uslug Apaczki o `supplier=INPOST` i fladze paczkomatowej (`door_to_point=1` lub `point_to_point=1`).
+- **Mapping:** `ApaczkaShipmentService::buildOptionsPayload()` mapuje pole `weekend_delivery` na `option[19] = 1` w payloadzie API Apaczki (`order_send`). Stala `OPTION_KEYS = ['weekend_delivery' => 19]` trzyma mape pole -> id opcji.
+- **Testy:** `tests/Unit/ApaczkaShipmentServiceTest.php` rozszerzony o 3 testy jednostkowe `buildOptionsPayload` (weekend enabled / disabled / pusty formularz).
+- **DB:** Brak zmian w schemacie. Walidacja okna czasowego "Paczka w Weekend" pozostaje po stronie API Apaczki.
+- **Pliki:** `src/Modules/Shipments/ApaczkaShipmentService.php`, `resources/views/shipments/prepare.php`, `tests/Unit/ApaczkaShipmentServiceTest.php`
diff --git a/resources/views/shipments/prepare.php b/resources/views/shipments/prepare.php
index 53ca0f8..b3d14fd 100644
--- a/resources/views/shipments/prepare.php
+++ b/resources/views/shipments/prepare.php
@@ -184,16 +184,29 @@ $defaultCodAmount = $isCod ? number_format($totalWithTax, 2, '.', '') : '0';
$aSvcName = trim((string) ($aSvc['name'] ?? ''));
$aSvcCarrierCode = trim((string) ($aSvc['carrier_code'] ?? ''));
$aSvcSelected = $mappedCarrier === 'apaczka' && $mappedMethodId === $aSvcId;
+ $aSvcSupplier = strtoupper(trim((string) ($aSvc['supplier'] ?? '')));
+ $aSvcDoorToPoint = (int) ($aSvc['door_to_point'] ?? 0) === 1;
+ $aSvcPointToPoint = (int) ($aSvc['point_to_point'] ?? 0) === 1;
+ $aSvcPaczkomat = $aSvcDoorToPoint || $aSvcPointToPoint;
?>