Phase 115 complete (vertical slice "zamowienie z NIP -> faktura PDF"):
- Task 1: InvoiceRepository + InvoiceService (dual-flow orchestrator) +
InvoiceIssueException + FakturowniaApiClient::createInvoice + buildPdfUrl
- Task 2: InvoiceController + OrdersController::toggleInvoiceRequested +
OrdersRepository::setInvoiceRequested + auto-import invoice_requested z
Allegro (invoice.required) i shopPRO (5-key flexible parser) + show.php
(toggle w zakladce Platnosci + warunkowy przycisk Wystaw fakture)
- Task 3: Lista wystawionych /settings/accounting/invoices/issued z filtrami
+ invoice_preview + invoice_pdf Dompdf template + hub link
- Task 3b (dodany): NIP lookup przez MF Biala Lista (publiczne API, bez
rejestracji) — MfWhitelistApiClient w src/Core/Http/ + /api/nip/lookup +
przycisk "Pobierz z GUS" w formularzu
Auto-fixes podczas smoke testu (5):
- GUS endpoint Fakturowni nie istnial (HTML 404 -> "json is not valid");
switch na MF Biala Liste
- PHP 8.5 curl_close() deprecation wycieka HTML przed JSON; usuniete z
MfWhitelistApiClient i FakturowniaApiClient (3 miejsca)
- Fakturownia 422 payment_to_kind_days (nieistniejace pole) -> usuniete
- Generic "error" w 422 -> parser plaskuje errors: {pole: [...]} +
error_log z 1000 znakow raw body
- Fakturownia security odrzuca seller_*/department_id jako "create new
department"; usuniete z payloadu (Fakturownia uzywa danych konta)
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
4.0 KiB
4.0 KiB
TODO — odlozone zadania techniczne
Lista nieformalnych zadan do zrobienia pozniej. Kazdy wpis ma wlasny tag (np.
STAT-NET) zeby mozna go bylo zlinkowac z komentarzy w kodzie.
INVOICE-IDEMP-115 — idempotencja podwojnego POST do Fakturowni (data: 2026-05-10)
Kontekst
- Phase 115-01 — wystawianie faktury z zamowienia (delegacja Fakturownia).
- Flow:
InvoiceService::issueDelegated()-> POST do Fakturowni -> on success INSERT doinvoices. - Edge case: faktura zostala utworzona w Fakturowni, ale odpowiedz nie dotarla (timeout, network). Operator widzi blad, klika "Wystaw fakture" ponownie -> drugi POST -> Fakturownia tworzy DRUGA fakture.
Zadania
- Dorzucic idempotency-key (np. UUID per attempt zachowany w sesji albo w
invoicesze statusempending_external). - Sprawdzic czy Fakturownia API wspiera nag/lowek
Idempotency-Keylub deduplikacje po referencji. - Alternatywa: po bledzie API, przed kolejnym POST, query Fakturowni
GET /invoices.json?q=<order_reference>zeby sprawdzic czy faktura juz istnieje.
Status
- Odlozone — operator musi recznie zweryfikowac w panelu Fakturowni przy bledach API.
STAT-NET — netto zamowien w statystykach (data: 2026-04-19)
Kontekst
- Statystyki
/statistics/orderspokazujaNettoper dzien/kanal. - shopPRO nie wysyla kwoty netto ani na poziomie zamowienia (
orders.total_without_tax), ani produktow (order_items.original_price_without_tax— rowniez puste). - Allegro:
orders.total_without_taxrowniez moze byc puste. - Obecnie dziala fallback: netto =
ROUND(total_with_tax / 1.23, 2)gdy kolumna netto jest pusta/zerowa. Zaklada 23% VAT dla wszystkich.
Zadania
- Ustalic zrodlo prawdy dla netto:
- Sprawdzic, czy API shopPRO udostepnia
price_nettolubtotal_netto(payload zawiera tylkoprice_brutto+vat). - Jesli TAK → rozszerzyc mapping importu (
src/Modules/ShopPro/...) i backfill migracja dla historycznych rekordow. - Jesli NIE → liczyc netto deterministycznie z
order_items.original_price_with_taxiorder_items.tax_rate(wtedy nie zakladamy sztywno 23%).
- Sprawdzic, czy API shopPRO udostepnia
- Backfill historycznych zamowien po wdrozeniu zrodla netto (migracja SQL + idempotentny skrypt).
- Zastapic fallback /1.23 w
OrdersStatisticsRepository::netAmountSql():- Preferuj
orders.total_without_tax. - Jesli brak —
SUM(order_items.original_price_with_tax / (1 + order_items.tax_rate / 100) * order_items.quantity). - Stala 1.23 tylko jako ostateczny fallback przy braku item-levelu.
- Preferuj
Linki w kodzie
src/Modules/Statistics/OrdersStatisticsRepository.php- metodanetAmountSql()(komentarzTODO(STAT-NET)).
DELIVERY-STATUS-MGMT — zarzadzanie statusami znormalizowanymi z panelu (data: 2026-04-26)
Kontekst
- Aktualnie statusy znormalizowane (
created,confirmed,picked_up,in_transit, itd.) sa stalymi w kodzie (DeliveryStatus.php). - Dodanie nowego statusu wymaga zmiany kodu + deploymentu.
- Panel ustawien pozwala tylko mapowac surowe statusy kurierow na istniejace statusy znormalizowane - nie mozna dodac nowego znormalizowanego statusu z UI.
Zadania
- Wyniesc liste statusow znormalizowanych do tabeli DB (np.
delivery_statuses) z kolumnami:key,label_pl,color,sort_order,is_terminal,is_system. - Statusy systemowe (
delivered,returned,cancelled) oznaczac flagais_system = true- nieedytowalne z UI (maja specjalne znaczenie w kodzie). - Panel
/settings/delivery-statuses- CRUD dla statusow niebedacych systemowymi (dodaj, zmien etykiete/kolor, usun jesli nieuzywany). DeliveryStatus::ALL_STATUSES,LABEL_PLi badge CSS zastapic dynamicznym ladowaniem z DB (cache per-request).- Automatyzacje i mapowania kurierow - dropdown statusow znormalizowanych pobierany z DB zamiast hardcoded.
Uwagi
TERMINAL_STATUSESmusi zostac zachowane jako lista systemowych statusow koncowych - te nie powinny byc usuwalne.- Przy usuwaniu statusu znormalizowanego - blokada jesli uzywany w
delivery_status_mappingslubshipment_packages.delivery_status.