Files
orderPRO/.paul/STATE.md
Jacek Pyziak c78ac335ee feat(128): polkurier shipment service + tracking + UI prepare
PolkurierApiClient rozszerzony do pelnego kontraktu (7 metod):
createShipment/getLabel/getStatus/cancelOrder/getAvailableCarriers/
getInpostParcelMachines/getCourierPoints. Wspolny call() parsuje
envelope {status, response}. Kontrakt zweryfikowany na oficjalnej
dokumentacji PDF v1.11.

PolkurierShipmentService (implements ShipmentProviderInterface)
orchestruje pelen flow: normalizeShipmentType (lowercase), split
ulicy, build recipient/sender/pickup, COD z bank account z
company_settings, extractOrderNumber/extractTrackingNumber
priorytetujace SDK Order entity (number, waybills[0].number).

PolkurierTrackingService (implements ShipmentTrackingInterface)
mapuje statusy O/P/A/WP/D/Z/W przez delivery_status_mappings.

UI panel polkurier w prepare.php z dynamiczna lista uslug z
available_carriers. Bez dedykowanego selektora punktu — operator
wpisuje receiver_point_id w istniejace pole w sekcji Adres odbiorcy.

Migracja 20260514_000115 seedujaca 7 wpisow delivery_status_mappings
z oficjalnej tabeli ORDER_STATUS (O/P/A/WP/D/Z/W).

Live test #114/#115 zakonczony sukcesem po 4 iteracjach
(ReferenceError -> uppercase shipmenttype -> orderno parsing ->
A4/A6 etykieta). Rozmiar etykiety A4/A6 sterowany w panelu klienta
polkurier.pl, NIE przez API.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-14 12:56:36 +02:00

6.8 KiB

Project State

Project Reference

See: .paul/PROJECT.md (updated 2026-05-07)

Core value: Sprzedawca moze obslugiwac zamowienia ze wszystkich kanalow sprzedazy i nadawac przesylki bez przelaczania sie miedzy platformami. Current focus: v3.7 Invoices + operational integrations - Phase 128 polkurier ShipmentService loop closed, transition pending (git commit + ROADMAP/PROJECT update).

Current Position

Milestone: v3.7 Invoices (Fakturownia integration) - In progress Phase: 128 of TBD (polkurier ShipmentService + Tracking + UI) - Complete Plan: 128-01 complete (SUMMARY.md created) Status: UNIFY complete, transition pending (git commit + Decisions w PROJECT.md + ROADMAP status) Last activity: 2026-05-14 - Phase 128-01 UNIFY zakonczony, SUMMARY + changelog utworzone

Progress:

  • Milestone v3.7: [##########] ~99% (Phase 113-128 complete; transition pending)
  • Phase 128: [##########] 100%

Loop Position

Current loop state:

PLAN -> APPLY -> UNIFY
  done       done       done   [Loop complete - transition pending]

Session Continuity

Last session: 2026-05-14 Stopped at: Phase 128-01 UNIFY closed; SUMMARY.md created Next action: Phase transition (git commit feat(128): polkurier shipment service + tracking + UI prepare + Decisions w PROJECT.md + ROADMAP status update), potem wybor kolejnego kandydata v3.7 (paczkomaty UI / shipment_presets polkurier / OrderValuationV2 / invoice.created event / eksport XLSX faktur) Resume file: .paul/ROADMAP.md

Pending parallel work

  • None — Phase 118, 121, 122 wszystkie zacommitowane (8f14851, 360eef1).

Git State

Last phase commit: 3443879 feat(127): polkurier integration foundation Previous: c758ec7 feat(126): invoice GUS field mapping fix (JDG/KRS heuristic) Branch: main (6 commits ahead of origin/main)

Pending Actions

  • Manualne testy AC-1..AC-7 dla Phase 112 na zywej bazie (XAMPP online).
  • Backfill zamowienia #882 - operator robi recznie po wdrozeniu (poza zakresem planu).
  • Uruchom migracje gdy XAMPP online: php bin/migrate.php (delivery_statuses).
  • Recznie odtworzyc istniejace reguly automatyzacji z grupowymi kluczami (BREAKING z 108-02).
  • HostedSMS inbound replies: requires DCS/HostedSMS activation before implementation.
  • Phase 117 follow-up: run migration when XAMPP MySQL is online and manually test real SMSPLANET sends for Bearer token and key + password.
  • Phase 119 follow-up: composer install + vendor/bin/phpunit tests/Unit/OrderImportRepositoryTest.php to run the 3 new tests; manual smoke test re-syncing order #976 from shoppro to confirm total_paid=91.00 persists across re-import.
  • Phase 121 follow-up: manually verify SMSPLANET settings/test send, inbound webhook insertion, order SMS tab, and notification polling/browser notification.
  • Phase 121 transition note: git commit was not created during UNIFY because the worktree contains unrelated Phase 118/local dirty files; prepare a scoped commit manually.
  • Phase 122 follow-up: manually verify settings save/reload and real SMSPLANET test/order sends with non-empty and empty footer; manually trigger over-limit final body rejection in UI.
  • Phase 123 follow-up: wystaw nowy paragon i potwierdz items_json zawiera vat per pozycja; eksport XLSX z paragonem multi-rate (np. mix 23% + 8%) — sprawdz osobne wiersze; eksport "wybrane paragony" zachowuje breakdown.
  • Phase 123 deferred: RECEIPT-NET-FIX (ReceiptService::issue() zapisuje total_net=total_gross) — udokumentowane w .paul/codebase/todo.md.
  • Phase 124 follow-up: php bin/migrate.php (XAMPP MySQL online) — utworzy sms_templates. Operator nastepnie tworzy szablony manualnie z /settings/sms-templates.
  • Phase 124 follow-up: real smoke wysylki SMS z szablonu (zamowienie z paczka + skonfigurowana stopka SMSPLANET) — sprawdzic ze sms_messages.body ma stopke raz, finalna tresc <= 918 znakow.
  • Phase 124 follow-up: regresja Email — wyslij e-mail z istniejacym szablonem aby potwierdzic ze refaktor Email\VariableResolver na fasade nie zlamal EmailSendingService.
  • Phase 125 follow-up: uruchom php bin/migrate.php (XAMPP MySQL online) — backfill 7 zamowien + DROP COLUMN orders.is_invoice. Weryfikacja: SELECT id, invoice_requested FROM orders WHERE id=1089; -> 1; SHOW COLUMNS FROM orders LIKE 'is_invoice'; -> empty.
  • Phase 125 follow-up: ponowne uruchomienie migracji powinno byc no-op (ALTER TABLE orders COMMENT = 'phase-125 backfill no-op').
  • Phase 125 follow-up: zaimportuj nowe zamowienie shopPRO z firm_nip (bez kluczy w 5-elementowej liscie wczesniejszej heurystyki) -> potwierdz ze UI w zakladce Platnosci pokazuje zaznaczony checkbox „Klient prosi o fakture" i widoczny przycisk „Wystaw fakture".
  • Phase 121 transition note (rozwiązane): commit 360eef1 obejmuje Phase 121 i Phase 122 razem; per-faza hunk-split nie wykonany ze względu na nakładkowe modyfikacje plików.
  • Phase 126 follow-up: manual smoke /orders/1090/invoice/create (JDG, NIP 5170167517) -> "Imie i nazwisko"="JACEK PYZIAK", "Nazwa firmy"="Project-Pro Pyziak Jacek" niezmieniona; drugi smoke na zamowieniu spolki z aktywnym KRS; curl /api/nip/lookup?nip=5170167517 -> data.is_jdg=true.
  • Phase 127 follow-up: zaplanowac kolejna faze polkurier — PolkurierShipmentService (CreateOrder + GetLabel + OrderValuationV2 + AvailableCarriers mapping + UI mapowan metod dostawy + presety przesylek) — fundament + zweryfikowany kontrakt API gotowy.
  • Phase 127 follow-up: drugi krok — PolkurierTrackingService + wpisy w delivery_status_mappings (provider='polkurier').
  • Phase 127 follow-up: po polkurier shipment service rozwazyc fazy paczkomaty (InpostParcelMachines / PocztexPostOffices / Kurier48PostOffices API juz dostepne w SDK polkuriera).
  • Phase 128 follow-up: uruchom migracje gdy XAMPP MySQL online: php bin/migrate.php (seed 7 wpisow provider='polkurier' w delivery_status_mappings).
  • Phase 128 follow-up: weryfikacja crona shipment_tracking_sync przy pierwszej zywej paczce polkurier w in_transit — sprawdz ze shipment_packages.delivery_status aktualizuje sie z D/WP/Z przez DeliveryStatus::normalizeWithOverrides('polkurier', ...).
  • Phase 128 follow-up: rozmiar etykiety A4 vs A6 sterowany jest w panelu klienta polkurier.pl (Ustawienia konta → Preferencje etykiet), NIE przez API — operator ustawil A6.

Deferred to Next Milestones

  • Phase 68 - Code Deduplication Refactor (0/2 Planning, nigdy nie rozpoczety).
  • STAT-NET - netto shopPRO z API lub z order_items.tax_rate (.paul/TODO.md).
  • Mobile Orders List / Mobile Order Details / Mobile Settings.
  • INDEX-106-01 - indeksy DB dla query customer_returned_count: order_addresses(order_id, address_type), shipment_packages(order_id, delivery_status) (gdy dataset >50k wierszy).

Skill Requirements

  • sonar-scanner required after APPLY; Phase 116, Phase 117, Phase 121 and Phase 122 gaps documented because CLI was not available in PATH.