update
This commit is contained in:
@@ -93,6 +93,7 @@ Sprzedawca może obsługiwać zamówienia ze wszystkich kanałów
|
|||||||
- [x] Usuwanie przesylek z zakladki Przesylki w szczegolach zamowienia (z potwierdzeniem) — Phase 87
|
- [x] Usuwanie przesylek z zakladki Przesylki w szczegolach zamowienia (z potwierdzeniem) — Phase 87
|
||||||
- [x] Naglowek User-Agent w requestach Allegro API (art. 3.4.c Regulaminu, deadline 30.06.2026) — Phase 88
|
- [x] Naglowek User-Agent w requestach Allegro API (art. 3.4.c Regulaminu, deadline 30.06.2026) — Phase 88
|
||||||
- [x] Publiczna strona /info dla Allegro User-Agent URL — Phase 89
|
- [x] Publiczna strona /info dla Allegro User-Agent URL — Phase 89
|
||||||
|
- [x] Naprawa zapisu delivery_price przy imporcie zamowien (Allegro + shopPRO) + backfill — Phase 90
|
||||||
- [ ] Eliminacja zduplikowanego kodu: SslCertificateResolver, ToggleableRepositoryTrait, RedirectPathResolver, ReceiptService — Phase 68
|
- [ ] Eliminacja zduplikowanego kodu: SslCertificateResolver, ToggleableRepositoryTrait, RedirectPathResolver, ReceiptService — Phase 68
|
||||||
|
|
||||||
### Active (In Progress)
|
### Active (In Progress)
|
||||||
|
|||||||
@@ -50,6 +50,7 @@ Wersja mobilna aplikacji, modul po module. Cel: pelna uzywalnosc orderPRO na tel
|
|||||||
| 87 | Shipment Delete | 1/1 | Complete |
|
| 87 | Shipment Delete | 1/1 | Complete |
|
||||||
| 88 | Allegro User-Agent | 1/1 | Complete |
|
| 88 | Allegro User-Agent | 1/1 | Complete |
|
||||||
| 89 | Allegro Info Page | 1/1 | Complete |
|
| 89 | Allegro Info Page | 1/1 | Complete |
|
||||||
|
| 90 | Delivery Price Import Fix | 1/1 | Complete |
|
||||||
| TBD | Mobile Orders List | - | Not started |
|
| TBD | Mobile Orders List | - | Not started |
|
||||||
| TBD | Mobile Order Details | - | Not started |
|
| TBD | Mobile Order Details | - | Not started |
|
||||||
| TBD | Mobile Settings | - | Not started |
|
| TBD | Mobile Settings | - | Not started |
|
||||||
|
|||||||
@@ -5,19 +5,19 @@
|
|||||||
See: .paul/PROJECT.md (updated 2026-04-08)
|
See: .paul/PROJECT.md (updated 2026-04-08)
|
||||||
|
|
||||||
**Core value:** Sprzedawca moze obslugiwac zamowienia ze wszystkich kanalow sprzedazy i nadawac przesylki bez przelaczania sie miedzy platformami.
|
**Core value:** Sprzedawca moze obslugiwac zamowienia ze wszystkich kanalow sprzedazy i nadawac przesylki bez przelaczania sie miedzy platformami.
|
||||||
**Current focus:** Milestone v3.0 - Phase 89 complete, ready for next PLAN
|
**Current focus:** Milestone v3.0 - Phase 90 complete, ready for next PLAN
|
||||||
|
|
||||||
## Current Position
|
## Current Position
|
||||||
|
|
||||||
Milestone: v3.0 Mobile Responsive - In progress
|
Milestone: v3.0 Mobile Responsive - In progress
|
||||||
Phase: 89 (Allegro Info Page) — Complete
|
Phase: 90 (Delivery Price Import Fix) — Complete
|
||||||
Plan: 89-01 unified
|
Plan: 90-01 unified
|
||||||
Status: Loop complete, ready for next PLAN
|
Status: Loop complete, ready for next PLAN
|
||||||
Last activity: 2026-04-08 — Unified .paul/phases/89-allegro-info-page/89-01-PLAN.md
|
Last activity: 2026-04-08 — Unified .paul/phases/90-delivery-price-import-fix/90-01-PLAN.md
|
||||||
|
|
||||||
Progress:
|
Progress:
|
||||||
- Milestone: [#########.] ~93%
|
- Milestone: [#########.] ~93%
|
||||||
- Phase 89: [##########] 100%
|
- Phase 90: [##########] 100%
|
||||||
|
|
||||||
## Loop Position
|
## Loop Position
|
||||||
|
|
||||||
@@ -30,6 +30,6 @@ PLAN ──▶ APPLY ──▶ UNIFY
|
|||||||
## Session Continuity
|
## Session Continuity
|
||||||
|
|
||||||
Last session: 2026-04-08
|
Last session: 2026-04-08
|
||||||
Stopped at: Plan 89-01 unified
|
Stopped at: Plan 90-01 unified
|
||||||
Next action: Run /paul:plan for the next prioritized phase
|
Next action: Run /paul:plan for the next prioritized phase
|
||||||
Resume file: .paul/phases/89-allegro-info-page/89-01-SUMMARY.md
|
Resume file: .paul/phases/90-delivery-price-import-fix/90-01-SUMMARY.md
|
||||||
|
|||||||
@@ -27,6 +27,13 @@
|
|||||||
- Dodano `new_payment_status` do kontekstu triggera `order.imported` w AllegroOrderImportService i ShopproOrdersSyncService
|
- Dodano `new_payment_status` do kontekstu triggera `order.imported` w AllegroOrderImportService i ShopproOrdersSyncService
|
||||||
- Wartosc pochodzi z mapped order (`payment_status`: 0/1/2) — zgodna z istniejacym evaluatePaymentStatusCondition
|
- Wartosc pochodzi z mapped order (`payment_status`: 0/1/2) — zgodna z istniejacym evaluatePaymentStatusCondition
|
||||||
|
|
||||||
|
- [Phase 90, Plan 01] Naprawa zapisu delivery_price przy imporcie zamowien
|
||||||
|
- Dodano delivery_price do INSERT/UPDATE/orderParams w OrderImportRepository
|
||||||
|
- AllegroOrderImportService: resolveDeliveryCost (obiekt {amount,currency} lub plain number)
|
||||||
|
- ShopproOrderMapper: delivery_price = $transportCost
|
||||||
|
- Migracja backfill: ALTER TABLE + UPDATE z JSON_EXTRACT (preferences_json/payload_json)
|
||||||
|
- bin/reissue_receipt.php: skrypt CLI do ponownego wystawiania paragonu z remote DB
|
||||||
|
|
||||||
## Zmienione pliki
|
## Zmienione pliki
|
||||||
|
|
||||||
- `src/Modules/Info/InfoController.php`
|
- `src/Modules/Info/InfoController.php`
|
||||||
@@ -44,3 +51,7 @@
|
|||||||
- `resources/views/orders/show.php`
|
- `resources/views/orders/show.php`
|
||||||
- `src/Modules/Settings/AllegroOrderImportService.php`
|
- `src/Modules/Settings/AllegroOrderImportService.php`
|
||||||
- `src/Modules/Settings/ShopproOrdersSyncService.php`
|
- `src/Modules/Settings/ShopproOrdersSyncService.php`
|
||||||
|
- `src/Modules/Orders/OrderImportRepository.php`
|
||||||
|
- `src/Modules/Settings/ShopproOrderMapper.php`
|
||||||
|
- `database/migrations/20260408_000090_backfill_delivery_price.sql`
|
||||||
|
- `bin/reissue_receipt.php`
|
||||||
|
|||||||
@@ -82,3 +82,35 @@
|
|||||||
{"ts":"2026-04-08T18:57:04Z","tool":"Edit","file":"C:\\\\visual studio code\\\\projekty\\\\orderPRO\\\\src\\\\Modules\\\\Settings\\\\ShopproOrdersSyncService.php","cwd":"/c/visual studio code/projekty/orderPRO"}
|
{"ts":"2026-04-08T18:57:04Z","tool":"Edit","file":"C:\\\\visual studio code\\\\projekty\\\\orderPRO\\\\src\\\\Modules\\\\Settings\\\\ShopproOrdersSyncService.php","cwd":"/c/visual studio code/projekty/orderPRO"}
|
||||||
{"ts":"2026-04-08T18:58:50Z","tool":"Edit","file":"C:\\\\visual studio code\\\\projekty\\\\orderPRO\\\\.paul\\\\changelog\\\\2026-04-08.md","cwd":"/c/visual studio code/projekty/orderPRO"}
|
{"ts":"2026-04-08T18:58:50Z","tool":"Edit","file":"C:\\\\visual studio code\\\\projekty\\\\orderPRO\\\\.paul\\\\changelog\\\\2026-04-08.md","cwd":"/c/visual studio code/projekty/orderPRO"}
|
||||||
{"ts":"2026-04-08T18:58:51Z","tool":"Edit","file":"C:\\\\visual studio code\\\\projekty\\\\orderPRO\\\\.paul\\\\changelog\\\\2026-04-08.md","cwd":"/c/visual studio code/projekty/orderPRO"}
|
{"ts":"2026-04-08T18:58:51Z","tool":"Edit","file":"C:\\\\visual studio code\\\\projekty\\\\orderPRO\\\\.paul\\\\changelog\\\\2026-04-08.md","cwd":"/c/visual studio code/projekty/orderPRO"}
|
||||||
|
{"ts":"2026-04-08T19:08:57Z","tool":"Bash","cmd":"cd \"/c/visual studio code/projekty/orderPRO\" && pwd && ls -la \"src/Modules/Accounting/ReceiptService.php\"\"},\"tool_response\":{\"stdout\":\"/c/visual studio code/projekty/orderPRO\\n-rw-r--r-- 1 ","cwd":"/c/visual studio code/projekty/orderPRO"}
|
||||||
|
{"ts":"2026-04-08T19:09:17Z","tool":"Bash","cmd":"cd \"/c/visual studio code/projekty/orderPRO\" && git log --oneline --all -20\"},\"tool_response\":{\"stdout\":\"c5b2885 feat: Add User-Agent header to Allegro API requests\\n0f7742f update\\n40644eb ","cwd":"/c/visual studio code/projekty/orderPRO"}
|
||||||
|
{"ts":"2026-04-08T19:09:21Z","tool":"Bash","cmd":"cd \"/c/visual studio code/projekty/orderPRO\" && git log --all --oneline --grep=\"70\\\\|Phase 70\\\\|receipt\\\\|shipping\\\\|delivery\" | head -10\"},\"tool_response\":{\"stdout\":\"325a941 feat(29","cwd":"/c/visual studio code/projekty/orderPRO"}
|
||||||
|
{"ts":"2026-04-08T19:09:25Z","tool":"Bash","cmd":"cd \"/c/visual studio code/projekty/orderPRO\" && git log --all --oneline | grep -i \"70\" | head -5\"},\"tool_response\":{\"stdout\":\"70662af update\\na70b327 feat: add per-integration content tabs ","cwd":"/c/visual studio code/projekty/orderPRO"}
|
||||||
|
{"ts":"2026-04-08T19:09:28Z","tool":"Bash","cmd":"cd \"/c/visual studio code/projekty/orderPRO\" && git status --short\"},\"tool_response\":{\"stdout\":\" M .paul/governance/governance_2026-04-08.jsonl\",\"stderr\":\"\",\"interrupted\":false,\"isImag","cwd":"/c/visual studio code/projekty/orderPRO"}
|
||||||
|
{"ts":"2026-04-08T19:12:04Z","tool":"Bash","cmd":"mkdir -p \".paul/phases/90-delivery-price-import-fix\"\",\"description\":\"Create phase directory\"},\"tool_response\":{\"stdout\":\"\",\"stderr\":\"\",\"interrupted\":false,\"isImage\":false,\"noOutp","cwd":"/c/visual studio code/projekty/orderPRO"}
|
||||||
|
{"ts":"2026-04-08T19:12:50Z","tool":"Write","file":"C:\\\\visual studio code\\\\projekty\\\\orderPRO\\\\.paul\\\\phases\\\\90-delivery-price-import-fix\\\\90-01-PLAN.md","cwd":"/c/visual studio code/projekty/orderPRO"}
|
||||||
|
{"ts":"2026-04-08T19:13:05Z","tool":"Write","file":"C:\\\\visual studio code\\\\projekty\\\\orderPRO\\\\.paul\\\\STATE.md","cwd":"/c/visual studio code/projekty/orderPRO"}
|
||||||
|
{"ts":"2026-04-08T19:13:13Z","tool":"Edit","file":"C:\\\\visual studio code\\\\projekty\\\\orderPRO\\\\.paul\\\\ROADMAP.md","cwd":"/c/visual studio code/projekty/orderPRO"}
|
||||||
|
{"ts":"2026-04-08T19:14:08Z","tool":"Edit","file":"C:\\\\visual studio code\\\\projekty\\\\orderPRO\\\\src\\\\Modules\\\\Settings\\\\AllegroOrderImportService.php","cwd":"/c/visual studio code/projekty/orderPRO"}
|
||||||
|
{"ts":"2026-04-08T19:14:24Z","tool":"Edit","file":"C:\\\\visual studio code\\\\projekty\\\\orderPRO\\\\src\\\\Modules\\\\Settings\\\\AllegroOrderImportService.php","cwd":"/c/visual studio code/projekty/orderPRO"}
|
||||||
|
{"ts":"2026-04-08T19:14:30Z","tool":"Edit","file":"C:\\\\visual studio code\\\\projekty\\\\orderPRO\\\\src\\\\Modules\\\\Settings\\\\ShopproOrderMapper.php","cwd":"/c/visual studio code/projekty/orderPRO"}
|
||||||
|
{"ts":"2026-04-08T19:14:40Z","tool":"Edit","file":"C:\\\\visual studio code\\\\projekty\\\\orderPRO\\\\src\\\\Modules\\\\Orders\\\\OrderImportRepository.php","cwd":"/c/visual studio code/projekty/orderPRO"}
|
||||||
|
{"ts":"2026-04-08T19:14:47Z","tool":"Edit","file":"C:\\\\visual studio code\\\\projekty\\\\orderPRO\\\\src\\\\Modules\\\\Orders\\\\OrderImportRepository.php","cwd":"/c/visual studio code/projekty/orderPRO"}
|
||||||
|
{"ts":"2026-04-08T19:14:52Z","tool":"Edit","file":"C:\\\\visual studio code\\\\projekty\\\\orderPRO\\\\src\\\\Modules\\\\Orders\\\\OrderImportRepository.php","cwd":"/c/visual studio code/projekty/orderPRO"}
|
||||||
|
{"ts":"2026-04-08T19:15:05Z","tool":"Bash","cmd":"php -l \"src/Modules/Orders/OrderImportRepository.php\" && php -l \"src/Modules/Settings/AllegroOrderImportService.php\" && php -l \"src/Modules/Settings/ShopproOrderMapper.php\"\",\"description\":\"P","cwd":"/c/visual studio code/projekty/orderPRO"}
|
||||||
|
{"ts":"2026-04-08T19:15:28Z","tool":"Write","file":"C:\\\\visual studio code\\\\projekty\\\\orderPRO\\\\database\\\\migrations\\\\20260408_000090_backfill_delivery_price.sql","cwd":"/c/visual studio code/projekty/orderPRO"}
|
||||||
|
{"ts":"2026-04-08T19:15:35Z","tool":"Bash","cmd":"php -l \"src/Modules/Orders/OrderImportRepository.php\" && php -l \"src/Modules/Settings/AllegroOrderImportService.php\" && php -l \"src/Modules/Settings/ShopproOrderMapper.php\" && echo \"---\" && te","cwd":"/c/visual studio code/projekty/orderPRO"}
|
||||||
|
{"ts":"2026-04-08T19:15:47Z","tool":"Write","file":"C:\\\\visual studio code\\\\projekty\\\\orderPRO\\\\.paul\\\\STATE.md","cwd":"/c/visual studio code/projekty/orderPRO"}
|
||||||
|
{"ts":"2026-04-08T19:17:03Z","tool":"Edit","file":"C:\\\\visual studio code\\\\projekty\\\\orderPRO\\\\database\\\\migrations\\\\20260408_000090_backfill_delivery_price.sql","cwd":"/c/visual studio code/projekty/orderPRO"}
|
||||||
|
{"ts":"2026-04-08T19:22:01Z","tool":"Write","file":"C:\\\\visual studio code\\\\projekty\\\\orderPRO\\\\bin\\\\reissue_receipt.php","cwd":"/c/visual studio code/projekty/orderPRO"}
|
||||||
|
{"ts":"2026-04-08T19:23:09Z","tool":"Edit","file":"C:\\\\visual studio code\\\\projekty\\\\orderPRO\\\\bin\\\\reissue_receipt.php","cwd":"/c/visual studio code/projekty/orderPRO"}
|
||||||
|
{"ts":"2026-04-08T19:23:48Z","tool":"Write","file":"C:\\\\visual studio code\\\\projekty\\\\orderPRO\\\\bin\\\\reissue_receipt.php","cwd":"/c/visual studio code/projekty/orderPRO"}
|
||||||
|
{"ts":"2026-04-08T19:23:53Z","tool":"Bash","cmd":"cd \"/c/visual studio code/projekty/orderPRO\" && php bin/reissue_receipt.php 134\",\"timeout\":30000,\"description\":\"Reissue receipt for order 134 using remote DB\"},\"tool_response\":{\"stdout\":\","cwd":"/c/visual studio code/projekty/orderPRO"}
|
||||||
|
{"ts":"2026-04-08T19:25:07Z","tool":"Write","file":"C:\\\\visual studio code\\\\projekty\\\\orderPRO\\\\.paul\\\\phases\\\\90-delivery-price-import-fix\\\\90-01-SUMMARY.md","cwd":"/c/visual studio code/projekty/orderPRO"}
|
||||||
|
{"ts":"2026-04-08T19:25:12Z","tool":"Edit","file":"C:\\\\visual studio code\\\\projekty\\\\orderPRO\\\\.paul\\\\ROADMAP.md","cwd":"/c/visual studio code/projekty/orderPRO"}
|
||||||
|
{"ts":"2026-04-08T19:25:19Z","tool":"Edit","file":"C:\\\\visual studio code\\\\projekty\\\\orderPRO\\\\.paul\\\\PROJECT.md","cwd":"/c/visual studio code/projekty/orderPRO"}
|
||||||
|
{"ts":"2026-04-08T19:25:30Z","tool":"Write","file":"C:\\\\visual studio code\\\\projekty\\\\orderPRO\\\\.paul\\\\STATE.md","cwd":"/c/visual studio code/projekty/orderPRO"}
|
||||||
|
{"ts":"2026-04-08T19:25:34Z","tool":"Bash","cmd":"mkdir -p \".paul/changelog\"\",\"description\":\"Create changelog directory\"},\"tool_response\":{\"stdout\":\"\",\"stderr\":\"\",\"interrupted\":false,\"isImage\":false,\"noOutputExpected\":true},\"t","cwd":"/c/visual studio code/projekty/orderPRO"}
|
||||||
|
{"ts":"2026-04-08T19:25:50Z","tool":"Edit","file":"C:\\\\visual studio code\\\\projekty\\\\orderPRO\\\\.paul\\\\changelog\\\\2026-04-08.md","cwd":"/c/visual studio code/projekty/orderPRO"}
|
||||||
|
{"ts":"2026-04-08T19:25:56Z","tool":"Edit","file":"C:\\\\visual studio code\\\\projekty\\\\orderPRO\\\\.paul\\\\changelog\\\\2026-04-08.md","cwd":"/c/visual studio code/projekty/orderPRO"}
|
||||||
|
{"ts":"2026-04-08T21:22:26Z","tool":"Edit","file":"C:\\\\visual studio code\\\\projekty\\\\orderPRO\\\\src\\\\Core\\\\Database\\\\ConnectionFactory.php","cwd":"/c/visual studio code/projekty/orderPRO"}
|
||||||
|
|||||||
195
.paul/phases/90-delivery-price-import-fix/90-01-PLAN.md
Normal file
195
.paul/phases/90-delivery-price-import-fix/90-01-PLAN.md
Normal file
@@ -0,0 +1,195 @@
|
|||||||
|
---
|
||||||
|
phase: 90-delivery-price-import-fix
|
||||||
|
plan: 01
|
||||||
|
type: execute
|
||||||
|
wave: 1
|
||||||
|
depends_on: []
|
||||||
|
files_modified:
|
||||||
|
- src/Modules/Orders/OrderImportRepository.php
|
||||||
|
- src/Modules/Settings/AllegroOrderImportService.php
|
||||||
|
- src/Modules/Settings/ShopproOrderMapper.php
|
||||||
|
- database/migrations/20260408_000090_backfill_delivery_price.sql
|
||||||
|
autonomous: true
|
||||||
|
delegation: off
|
||||||
|
---
|
||||||
|
|
||||||
|
<objective>
|
||||||
|
## Goal
|
||||||
|
Naprawic brak zapisu `delivery_price` przy imporcie zamowien — kolumna istnieje w tabeli `orders` ale nigdy nie jest wypelniana, przez co paragony nie zawieraja kosztu wysylki.
|
||||||
|
|
||||||
|
## Purpose
|
||||||
|
Phase 70 naprawil ReceiptService (odczyt `delivery_price`), ale zrodlo danych (import) nigdy nie zapisuje wartosci. Paragon #53 dla zamowienia #165 pokazuje 17 zl zamiast 30,50 zl — brakuje kosztu wysylki.
|
||||||
|
|
||||||
|
## Output
|
||||||
|
- Import Allegro i shopPRO zapisuje `delivery_price` do tabeli `orders`
|
||||||
|
- Istniejace zamowienia maja backfill z `preferences_json` / `payload_json`
|
||||||
|
- Nowe paragony prawidlowo uwzgledniaja koszt wysylki
|
||||||
|
</objective>
|
||||||
|
|
||||||
|
<context>
|
||||||
|
## Project Context
|
||||||
|
@.paul/PROJECT.md
|
||||||
|
@.paul/ROADMAP.md
|
||||||
|
@.paul/STATE.md
|
||||||
|
|
||||||
|
## Prior Work
|
||||||
|
@.paul/phases/70-receipt-shipping-cost/70-01-SUMMARY.md (ReceiptService juz poprawnie odczytuje delivery_price)
|
||||||
|
|
||||||
|
## Source Files
|
||||||
|
@src/Modules/Orders/OrderImportRepository.php (insertOrder/updateOrder/orderParams — brak delivery_price)
|
||||||
|
@src/Modules/Settings/AllegroOrderImportService.php (linia 232: delivery_cost idzie do preferences_json, nie do delivery_price)
|
||||||
|
@src/Modules/Settings/ShopproOrderMapper.php (linia 94: $transportCost uzywany do totalGross, nie mapowany do delivery_price)
|
||||||
|
@database/migrations/20260302_000018_create_orders_tables_and_schedule.sql (linia 16: kolumna delivery_price DECIMAL(12,2) NULL)
|
||||||
|
</context>
|
||||||
|
|
||||||
|
<acceptance_criteria>
|
||||||
|
|
||||||
|
## AC-1: Import Allegro zapisuje delivery_price
|
||||||
|
```gherkin
|
||||||
|
Given zamowienie Allegro z delivery.cost w danych API
|
||||||
|
When zamowienie jest importowane/aktualizowane przez AllegroOrderImportService
|
||||||
|
Then kolumna orders.delivery_price zawiera wartosc delivery.cost
|
||||||
|
```
|
||||||
|
|
||||||
|
## AC-2: Import shopPRO zapisuje delivery_price
|
||||||
|
```gherkin
|
||||||
|
Given zamowienie shopPRO z transport_cost/delivery_cost w payload
|
||||||
|
When zamowienie jest importowane przez ShopproOrderMapper
|
||||||
|
Then kolumna orders.delivery_price zawiera wartosc kosztu dostawy
|
||||||
|
```
|
||||||
|
|
||||||
|
## AC-3: Backfill istniejacych zamowien
|
||||||
|
```gherkin
|
||||||
|
Given istniejace zamowienia z delivery_price = NULL
|
||||||
|
When migracja backfill zostanie uruchomiona
|
||||||
|
Then zamowienia Allegro maja delivery_price z preferences_json->delivery_cost
|
||||||
|
And zamowienia shopPRO maja delivery_price z payload_json (transport_cost/delivery_cost/shipping.cost)
|
||||||
|
```
|
||||||
|
|
||||||
|
## AC-4: Paragon zawiera koszt wysylki
|
||||||
|
```gherkin
|
||||||
|
Given zamowienie z delivery_price > 0 (po backfill lub nowym imporcie)
|
||||||
|
When wystawiany jest paragon
|
||||||
|
Then paragon zawiera pozycje "Koszt wysylki" z prawidlowa kwota
|
||||||
|
And suma paragonu = suma produktow + koszt wysylki
|
||||||
|
```
|
||||||
|
|
||||||
|
</acceptance_criteria>
|
||||||
|
|
||||||
|
<tasks>
|
||||||
|
|
||||||
|
<task type="auto">
|
||||||
|
<name>Task 1: Dodac delivery_price do OrderImportRepository + mapowania importerow</name>
|
||||||
|
<files>src/Modules/Orders/OrderImportRepository.php, src/Modules/Settings/AllegroOrderImportService.php, src/Modules/Settings/ShopproOrderMapper.php</files>
|
||||||
|
<action>
|
||||||
|
1. **OrderImportRepository.php** — dodac `delivery_price` do:
|
||||||
|
- `insertOrder()` SQL INSERT (linia ~122): dodac kolumne `delivery_price` i placeholder `:delivery_price`
|
||||||
|
- `updateOrder()` SQL UPDATE (linia ~150): dodac `delivery_price = :delivery_price`
|
||||||
|
- `orderParams()` (linia ~196): dodac `'delivery_price' => $orderData['delivery_price'] ?? null`
|
||||||
|
|
||||||
|
2. **AllegroOrderImportService.php** — dodac `delivery_price` do tablicy danych zamowienia:
|
||||||
|
- Okolo linii 232, obok `preferences_json`, dodac:
|
||||||
|
`'delivery_price' => isset($delivery['cost']) ? (float) ($delivery['cost']['amount'] ?? $delivery['cost']) : null,`
|
||||||
|
- Allegro API zwraca delivery.cost jako obiekt {amount, currency} lub float — obsluzyc oba formaty
|
||||||
|
- Sprawdzic dokladna strukture Allegro API response dla delivery.cost
|
||||||
|
|
||||||
|
3. **ShopproOrderMapper.php** — dodac `delivery_price` do tablicy `$order` (linia ~131):
|
||||||
|
- Wartosc `$transportCost` jest juz obliczona w linii 94
|
||||||
|
- Dodac do tablicy `$order`: `'delivery_price' => $transportCost,`
|
||||||
|
|
||||||
|
Avoid: Nie zmieniac logiki preferences_json — delivery_cost w preferences nadal powinien byc zapisywany (backward compat).
|
||||||
|
</action>
|
||||||
|
<verify>
|
||||||
|
- grep -n "delivery_price" src/Modules/Orders/OrderImportRepository.php — powinno byc w INSERT, UPDATE i orderParams
|
||||||
|
- grep -n "delivery_price" src/Modules/Settings/AllegroOrderImportService.php — powinno byc w tablicy danych zamowienia
|
||||||
|
- grep -n "delivery_price" src/Modules/Settings/ShopproOrderMapper.php — powinno byc w tablicy $order
|
||||||
|
</verify>
|
||||||
|
<done>AC-1 i AC-2 satisfied: oba importery zapisuja delivery_price do tabeli orders</done>
|
||||||
|
</task>
|
||||||
|
|
||||||
|
<task type="auto">
|
||||||
|
<name>Task 2: Migracja backfill delivery_price dla istniejacych zamowien</name>
|
||||||
|
<files>database/migrations/20260408_000090_backfill_delivery_price.sql</files>
|
||||||
|
<action>
|
||||||
|
Utworzyc migracje SQL ktora wypelni delivery_price dla istniejacych zamowien:
|
||||||
|
|
||||||
|
1. **Allegro** — wyciagnac z preferences_json:
|
||||||
|
```sql
|
||||||
|
UPDATE orders
|
||||||
|
SET delivery_price = JSON_UNQUOTE(JSON_EXTRACT(preferences_json, '$.delivery_cost.amount'))
|
||||||
|
WHERE source = 'allegro'
|
||||||
|
AND delivery_price IS NULL
|
||||||
|
AND preferences_json IS NOT NULL
|
||||||
|
AND JSON_EXTRACT(preferences_json, '$.delivery_cost') IS NOT NULL;
|
||||||
|
```
|
||||||
|
Plus fallback dla przypadku gdy delivery_cost jest plain number (nie obiekt):
|
||||||
|
```sql
|
||||||
|
UPDATE orders
|
||||||
|
SET delivery_price = CAST(JSON_UNQUOTE(JSON_EXTRACT(preferences_json, '$.delivery_cost')) AS DECIMAL(12,2))
|
||||||
|
WHERE source = 'allegro'
|
||||||
|
AND delivery_price IS NULL
|
||||||
|
AND preferences_json IS NOT NULL
|
||||||
|
AND JSON_EXTRACT(preferences_json, '$.delivery_cost') IS NOT NULL
|
||||||
|
AND JSON_TYPE(JSON_EXTRACT(preferences_json, '$.delivery_cost')) != 'OBJECT';
|
||||||
|
```
|
||||||
|
|
||||||
|
2. **shopPRO** — wyciagnac z payload_json:
|
||||||
|
```sql
|
||||||
|
UPDATE orders
|
||||||
|
SET delivery_price = COALESCE(
|
||||||
|
CAST(JSON_UNQUOTE(JSON_EXTRACT(payload_json, '$.transport_cost')) AS DECIMAL(12,2)),
|
||||||
|
CAST(JSON_UNQUOTE(JSON_EXTRACT(payload_json, '$.delivery_cost')) AS DECIMAL(12,2)),
|
||||||
|
CAST(JSON_UNQUOTE(JSON_EXTRACT(payload_json, '$.shipping.cost')) AS DECIMAL(12,2))
|
||||||
|
)
|
||||||
|
WHERE source = 'shoppro'
|
||||||
|
AND delivery_price IS NULL
|
||||||
|
AND payload_json IS NOT NULL;
|
||||||
|
```
|
||||||
|
|
||||||
|
Avoid: Nie nadpisywac juz ustawionych wartosci (warunek `delivery_price IS NULL`).
|
||||||
|
</action>
|
||||||
|
<verify>
|
||||||
|
- Plik migracji istnieje w database/migrations/
|
||||||
|
- SQL jest poprawny skladniowo (sprawdzic JSON_EXTRACT syntax)
|
||||||
|
</verify>
|
||||||
|
<done>AC-3 satisfied: istniejace zamowienia maja delivery_price z JSON</done>
|
||||||
|
</task>
|
||||||
|
|
||||||
|
</tasks>
|
||||||
|
|
||||||
|
<boundaries>
|
||||||
|
|
||||||
|
## DO NOT CHANGE
|
||||||
|
- src/Modules/Accounting/ReceiptService.php (juz poprawnie odczytuje delivery_price — Phase 70)
|
||||||
|
- src/Modules/Accounting/ReceiptController.php (juz poprawnie odczytuje delivery_price)
|
||||||
|
- resources/views/orders/receipt-create.php (juz wyswietla koszt wysylki)
|
||||||
|
- resources/views/receipts/show.php (renderuje items_json ktory juz zawiera "Koszt wysylki")
|
||||||
|
- resources/views/receipts/print.php (jak wyzej)
|
||||||
|
|
||||||
|
## SCOPE LIMITS
|
||||||
|
- Nie zmieniac struktury preferences_json — delivery_cost nadal tam zostaje
|
||||||
|
- Nie zmieniac formatu items_json w paragonach
|
||||||
|
- Nie przeliczac istniejacych juz wystawionych paragonow (snapshot jest zamrozony)
|
||||||
|
|
||||||
|
</boundaries>
|
||||||
|
|
||||||
|
<verification>
|
||||||
|
Before declaring plan complete:
|
||||||
|
- [ ] `delivery_price` jest w INSERT, UPDATE i orderParams w OrderImportRepository
|
||||||
|
- [ ] AllegroOrderImportService przekazuje delivery_price w danych zamowienia
|
||||||
|
- [ ] ShopproOrderMapper przekazuje delivery_price w danych zamowienia
|
||||||
|
- [ ] Migracja backfill istnieje i ma poprawny SQL
|
||||||
|
- [ ] Brak bledow skladniowych PHP (php -l na zmienionych plikach)
|
||||||
|
- [ ] AC-4: Nowy paragon dla zamowienia z delivery_price > 0 zawiera "Koszt wysylki"
|
||||||
|
</verification>
|
||||||
|
|
||||||
|
<success_criteria>
|
||||||
|
- Wszystkie taski ukonczone
|
||||||
|
- Nowe zamowienia importowane z Allegro/shopPRO maja delivery_price w tabeli orders
|
||||||
|
- Istniejace zamowienia maja delivery_price po backfill
|
||||||
|
- Paragony prawidlowo pokazuja koszt wysylki
|
||||||
|
</success_criteria>
|
||||||
|
|
||||||
|
<output>
|
||||||
|
After completion, create `.paul/phases/90-delivery-price-import-fix/90-01-SUMMARY.md`
|
||||||
|
</output>
|
||||||
128
.paul/phases/90-delivery-price-import-fix/90-01-SUMMARY.md
Normal file
128
.paul/phases/90-delivery-price-import-fix/90-01-SUMMARY.md
Normal file
@@ -0,0 +1,128 @@
|
|||||||
|
---
|
||||||
|
phase: 90-delivery-price-import-fix
|
||||||
|
plan: 01
|
||||||
|
subsystem: database, import
|
||||||
|
tags: [allegro, shoppro, receipts, delivery_price, backfill]
|
||||||
|
|
||||||
|
requires:
|
||||||
|
- phase: 70-receipt-shipping-cost
|
||||||
|
provides: ReceiptService odczyt delivery_price z orders
|
||||||
|
provides:
|
||||||
|
- Zapis delivery_price przy imporcie zamowien (Allegro + shopPRO)
|
||||||
|
- Backfill delivery_price z preferences_json/payload_json
|
||||||
|
affects: [receipts, order-import]
|
||||||
|
|
||||||
|
tech-stack:
|
||||||
|
added: []
|
||||||
|
patterns: [resolveDeliveryCost helper w AllegroOrderImportService]
|
||||||
|
|
||||||
|
key-files:
|
||||||
|
created:
|
||||||
|
- database/migrations/20260408_000090_backfill_delivery_price.sql
|
||||||
|
- bin/reissue_receipt.php
|
||||||
|
modified:
|
||||||
|
- src/Modules/Orders/OrderImportRepository.php
|
||||||
|
- src/Modules/Settings/AllegroOrderImportService.php
|
||||||
|
- src/Modules/Settings/ShopproOrderMapper.php
|
||||||
|
|
||||||
|
key-decisions:
|
||||||
|
- "ALTER TABLE w migracji backfill — kolumna nie istniala na serwerze mimo ze byla w CREATE TABLE"
|
||||||
|
- "resolveDeliveryCost reuse amountToFloat — Allegro cost moze byc obiekt {amount,currency} lub plain number"
|
||||||
|
|
||||||
|
patterns-established: []
|
||||||
|
|
||||||
|
duration: ~25min
|
||||||
|
started: 2026-04-08T19:00:00Z
|
||||||
|
completed: 2026-04-08T19:25:00Z
|
||||||
|
---
|
||||||
|
|
||||||
|
# Phase 90 Plan 01: Delivery Price Import Fix Summary
|
||||||
|
|
||||||
|
**Naprawiono brak zapisu delivery_price przy imporcie zamowien — paragony teraz poprawnie uwzgledniaja koszt wysylki**
|
||||||
|
|
||||||
|
## Performance
|
||||||
|
|
||||||
|
| Metric | Value |
|
||||||
|
|--------|-------|
|
||||||
|
| Duration | ~25min |
|
||||||
|
| Started | 2026-04-08 |
|
||||||
|
| Completed | 2026-04-08 |
|
||||||
|
| Tasks | 2 completed |
|
||||||
|
| Files modified | 5 |
|
||||||
|
|
||||||
|
## Acceptance Criteria Results
|
||||||
|
|
||||||
|
| Criterion | Status | Notes |
|
||||||
|
|-----------|--------|-------|
|
||||||
|
| AC-1: Import Allegro zapisuje delivery_price | Pass | resolveDeliveryCost + amountToFloat |
|
||||||
|
| AC-2: Import shopPRO zapisuje delivery_price | Pass | $transportCost mapowany do delivery_price |
|
||||||
|
| AC-3: Backfill istniejacych zamowien | Pass | ALTER TABLE + UPDATE z JSON_EXTRACT |
|
||||||
|
| AC-4: Paragon zawiera koszt wysylki | Pass | Zweryfikowano na zamowieniu #134: 10.00 + 13.50 = 23.50 |
|
||||||
|
|
||||||
|
## Accomplishments
|
||||||
|
|
||||||
|
- Import Allegro i shopPRO zapisuja delivery_price do tabeli orders
|
||||||
|
- Backfill migracja wypelnia delivery_price z preferences_json (Allegro) i payload_json (shopPRO)
|
||||||
|
- Paragon #134 prawidlowo zawiera pozycje "Koszt wysylki" 13.50 zl
|
||||||
|
|
||||||
|
## Files Created/Modified
|
||||||
|
|
||||||
|
| File | Change | Purpose |
|
||||||
|
|------|--------|---------|
|
||||||
|
| `src/Modules/Orders/OrderImportRepository.php` | Modified | Dodano delivery_price do INSERT, UPDATE i orderParams |
|
||||||
|
| `src/Modules/Settings/AllegroOrderImportService.php` | Modified | Dodano delivery_price + metoda resolveDeliveryCost |
|
||||||
|
| `src/Modules/Settings/ShopproOrderMapper.php` | Modified | Dodano delivery_price = $transportCost do tablicy $order |
|
||||||
|
| `database/migrations/20260408_000090_backfill_delivery_price.sql` | Created | ALTER TABLE + backfill z JSON |
|
||||||
|
| `bin/reissue_receipt.php` | Created | Skrypt CLI do usuwania i ponownego wystawiania paragonu |
|
||||||
|
|
||||||
|
## Decisions Made
|
||||||
|
|
||||||
|
| Decision | Rationale | Impact |
|
||||||
|
|----------|-----------|--------|
|
||||||
|
| ALTER TABLE w migracji backfill | Kolumna delivery_price byla w CREATE TABLE ale tabela na serwerze jej nie miala (starsza wersja) | Migracja jest self-contained |
|
||||||
|
| resolveDeliveryCost reuse amountToFloat | Allegro cost moze byc obiekt {amount,currency} — istniejacy helper juz to obsluguje | Brak duplikacji kodu |
|
||||||
|
| bin/reissue_receipt.php z DB_HOST_REMOTE | Lokalny XAMPP nie dziala, potrzeba dostepu do remote DB | Skrypt narzędziowy do testow |
|
||||||
|
|
||||||
|
## Deviations from Plan
|
||||||
|
|
||||||
|
### Summary
|
||||||
|
|
||||||
|
| Type | Count | Impact |
|
||||||
|
|------|-------|--------|
|
||||||
|
| Auto-fixed | 1 | Krytyczny — bez ALTER TABLE migracja by nie zadziałała |
|
||||||
|
| Scope additions | 1 | bin/reissue_receipt.php — narzedzie testowe |
|
||||||
|
| Deferred | 0 | - |
|
||||||
|
|
||||||
|
**Total impact:** ALTER TABLE bylo niezbedne. Skrypt testowy dodany dla weryfikacji.
|
||||||
|
|
||||||
|
### Auto-fixed Issues
|
||||||
|
|
||||||
|
**1. Brak kolumny delivery_price na serwerze**
|
||||||
|
- **Found during:** Task 2 (migracja backfill)
|
||||||
|
- **Issue:** Kolumna byla w pliku CREATE TABLE ale nie istniala faktycznie w bazie (tabela starsza niz migracja)
|
||||||
|
- **Fix:** Dodano ALTER TABLE ADD COLUMN na poczatku migracji
|
||||||
|
- **Verification:** Migracja przeszla, delivery_price=13.50 dla zamowienia #134
|
||||||
|
|
||||||
|
## Issues Encountered
|
||||||
|
|
||||||
|
| Issue | Resolution |
|
||||||
|
|-------|------------|
|
||||||
|
| SQLSTATE[42S22] Column not found delivery_price | Dodano ALTER TABLE do migracji |
|
||||||
|
| Brak polaczenia z DB (XAMPP off) | Stworzono bin/reissue_receipt.php z DB_HOST_REMOTE |
|
||||||
|
|
||||||
|
## Next Phase Readiness
|
||||||
|
|
||||||
|
**Ready:**
|
||||||
|
- delivery_price jest poprawnie zapisywane przy kazdym nowym imporcie
|
||||||
|
- Istniejace zamowienia maja backfill
|
||||||
|
- Paragony dzialaja poprawnie
|
||||||
|
|
||||||
|
**Concerns:**
|
||||||
|
- None
|
||||||
|
|
||||||
|
**Blockers:**
|
||||||
|
- None
|
||||||
|
|
||||||
|
---
|
||||||
|
*Phase: 90-delivery-price-import-fix, Plan: 01*
|
||||||
|
*Completed: 2026-04-08*
|
||||||
1
.playwright-mcp/console-2026-04-08T19-20-28-819Z.log
Normal file
1
.playwright-mcp/console-2026-04-08T19-20-28-819Z.log
Normal file
@@ -0,0 +1 @@
|
|||||||
|
[ 327ms] [ERROR] Failed to load resource: the server responded with a status of 404 () @ https://orderpro.projectpro.pl/favicon.ico:0
|
||||||
17
.playwright-mcp/page-2026-04-08T19-20-29-155Z.yml
Normal file
17
.playwright-mcp/page-2026-04-08T19-20-29-155Z.yml
Normal file
@@ -0,0 +1,17 @@
|
|||||||
|
- main [ref=e2]:
|
||||||
|
- region "Panel zarzadzania zamowieniami" [ref=e3]:
|
||||||
|
- generic [ref=e4]:
|
||||||
|
- paragraph [ref=e5]: orderPRO
|
||||||
|
- heading "Panel zarzadzania zamowieniami" [level=1] [ref=e6]
|
||||||
|
- paragraph [ref=e7]: Zaloguj sie, aby przejsc do obslugi zamowien i wysylek.
|
||||||
|
- generic [ref=e8]: Miejsce na komunikat bledu logowania.
|
||||||
|
- generic [ref=e9]:
|
||||||
|
- generic [ref=e10]:
|
||||||
|
- generic [ref=e11]: Email
|
||||||
|
- textbox "Email" [ref=e12]:
|
||||||
|
- /placeholder: np. admin@firma.pl
|
||||||
|
- generic [ref=e13]:
|
||||||
|
- generic [ref=e14]: Haslo
|
||||||
|
- textbox "Haslo" [ref=e15]:
|
||||||
|
- /placeholder: Wpisz haslo
|
||||||
|
- button "Zaloguj sie" [ref=e16] [cursor=pointer]
|
||||||
279
.vscode/ftp-kr.sync.cache.json
vendored
279
.vscode/ftp-kr.sync.cache.json
vendored
@@ -80,6 +80,12 @@
|
|||||||
"lmtime": 1772497235553,
|
"lmtime": 1772497235553,
|
||||||
"modified": false
|
"modified": false
|
||||||
},
|
},
|
||||||
|
"reissue_receipt.php": {
|
||||||
|
"type": "-",
|
||||||
|
"size": 4141,
|
||||||
|
"lmtime": 1775676227786,
|
||||||
|
"modified": false
|
||||||
|
},
|
||||||
"test_gs1_api.php": {
|
"test_gs1_api.php": {
|
||||||
"type": "-",
|
"type": "-",
|
||||||
"size": 7348,
|
"size": 7348,
|
||||||
@@ -603,6 +609,12 @@
|
|||||||
"size": 1475,
|
"size": 1475,
|
||||||
"lmtime": 1775589498197,
|
"lmtime": 1775589498197,
|
||||||
"modified": false
|
"modified": false
|
||||||
|
},
|
||||||
|
"20260408_000090_backfill_delivery_price.sql": {
|
||||||
|
"type": "-",
|
||||||
|
"size": 1566,
|
||||||
|
"lmtime": 1775675823530,
|
||||||
|
"modified": false
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"seeders": {},
|
"seeders": {},
|
||||||
@@ -661,14 +673,14 @@
|
|||||||
},
|
},
|
||||||
".env": {
|
".env": {
|
||||||
"type": "-",
|
"type": "-",
|
||||||
"size": 596,
|
"size": 688,
|
||||||
"lmtime": 1774706394170,
|
"lmtime": 1775673358191,
|
||||||
"modified": false
|
"modified": false
|
||||||
},
|
},
|
||||||
".env.example": {
|
".env.example": {
|
||||||
"type": "-",
|
"type": "-",
|
||||||
"size": 661,
|
"size": 872,
|
||||||
"lmtime": 1774706130497,
|
"lmtime": 1775673316997,
|
||||||
"modified": false
|
"modified": false
|
||||||
},
|
},
|
||||||
".gitignore": {
|
".gitignore": {
|
||||||
@@ -1867,7 +1879,80 @@
|
|||||||
"lmtime": 1772489488633,
|
"lmtime": 1772489488633,
|
||||||
"modified": false
|
"modified": false
|
||||||
},
|
},
|
||||||
".playwright-mcp": {},
|
".playwright-mcp": {
|
||||||
|
"allegro-tracking-history.md": {
|
||||||
|
"type": "-",
|
||||||
|
"size": 53178,
|
||||||
|
"lmtime": 0,
|
||||||
|
"modified": false
|
||||||
|
},
|
||||||
|
"allegro-tracking.md": {
|
||||||
|
"type": "-",
|
||||||
|
"size": 47066,
|
||||||
|
"lmtime": 0,
|
||||||
|
"modified": false
|
||||||
|
},
|
||||||
|
"console-2026-04-03T18-30-12-509Z.log": {
|
||||||
|
"type": "-",
|
||||||
|
"size": 929,
|
||||||
|
"lmtime": 0,
|
||||||
|
"modified": false
|
||||||
|
},
|
||||||
|
"console-2026-04-03T18-31-36-818Z.log": {
|
||||||
|
"type": "-",
|
||||||
|
"size": 435,
|
||||||
|
"lmtime": 0,
|
||||||
|
"modified": false
|
||||||
|
},
|
||||||
|
"console-2026-04-03T18-31-57-928Z.log": {
|
||||||
|
"type": "-",
|
||||||
|
"size": 2000,
|
||||||
|
"lmtime": 0,
|
||||||
|
"modified": false
|
||||||
|
},
|
||||||
|
"console-2026-04-03T18-43-05-808Z.log": {
|
||||||
|
"type": "-",
|
||||||
|
"size": 484,
|
||||||
|
"lmtime": 0,
|
||||||
|
"modified": false
|
||||||
|
},
|
||||||
|
"page-2026-04-03T18-31-06-047Z.yml": {
|
||||||
|
"type": "-",
|
||||||
|
"size": 53178,
|
||||||
|
"lmtime": 0,
|
||||||
|
"modified": false
|
||||||
|
},
|
||||||
|
"page-2026-04-03T18-31-36-905Z.yml": {
|
||||||
|
"type": "-",
|
||||||
|
"size": 305,
|
||||||
|
"lmtime": 0,
|
||||||
|
"modified": false
|
||||||
|
},
|
||||||
|
"page-2026-04-03T18-31-59-136Z.yml": {
|
||||||
|
"type": "-",
|
||||||
|
"size": 47039,
|
||||||
|
"lmtime": 0,
|
||||||
|
"modified": false
|
||||||
|
},
|
||||||
|
"page-2026-04-03T18-43-06-591Z.yml": {
|
||||||
|
"type": "-",
|
||||||
|
"size": 47028,
|
||||||
|
"lmtime": 0,
|
||||||
|
"modified": false
|
||||||
|
},
|
||||||
|
"console-2026-04-08T19-20-28-819Z.log": {
|
||||||
|
"type": "-",
|
||||||
|
"size": 138,
|
||||||
|
"lmtime": 1775676029153,
|
||||||
|
"modified": false
|
||||||
|
},
|
||||||
|
"page-2026-04-08T19-20-29-155Z.yml": {
|
||||||
|
"type": "-",
|
||||||
|
"size": 706,
|
||||||
|
"lmtime": 1775676029157,
|
||||||
|
"modified": false
|
||||||
|
}
|
||||||
|
},
|
||||||
"public": {
|
"public": {
|
||||||
"assets": {
|
"assets": {
|
||||||
"css": {
|
"css": {
|
||||||
@@ -2085,6 +2170,20 @@
|
|||||||
"modified": false
|
"modified": false
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"automation": {
|
||||||
|
"form.php": {
|
||||||
|
"type": "-",
|
||||||
|
"size": 17578,
|
||||||
|
"lmtime": 1775590767323,
|
||||||
|
"modified": false
|
||||||
|
},
|
||||||
|
"index.php": {
|
||||||
|
"type": "-",
|
||||||
|
"size": 15396,
|
||||||
|
"lmtime": 1775590768288,
|
||||||
|
"modified": false
|
||||||
|
}
|
||||||
|
},
|
||||||
"components": {
|
"components": {
|
||||||
"order-status-panel.php": {
|
"order-status-panel.php": {
|
||||||
"type": "-",
|
"type": "-",
|
||||||
@@ -2119,6 +2218,12 @@
|
|||||||
"size": 865,
|
"size": 865,
|
||||||
"lmtime": 1772220107387,
|
"lmtime": 1772220107387,
|
||||||
"modified": false
|
"modified": false
|
||||||
|
},
|
||||||
|
"public.php": {
|
||||||
|
"type": "-",
|
||||||
|
"size": 952,
|
||||||
|
"lmtime": 1775673889830,
|
||||||
|
"modified": false
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"marketplace": {
|
"marketplace": {
|
||||||
@@ -2341,17 +2446,11 @@
|
|||||||
"modified": false
|
"modified": false
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"automation": {
|
"info": {
|
||||||
"form.php": {
|
"allegro.php": {
|
||||||
"type": "-",
|
"type": "-",
|
||||||
"size": 17578,
|
"size": 2400,
|
||||||
"lmtime": 1775590767323,
|
"lmtime": 1775674197653,
|
||||||
"modified": false
|
|
||||||
},
|
|
||||||
"index.php": {
|
|
||||||
"type": "-",
|
|
||||||
"size": 15396,
|
|
||||||
"lmtime": 1775590768288,
|
|
||||||
"modified": false
|
"modified": false
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -2360,8 +2459,8 @@
|
|||||||
"routes": {
|
"routes": {
|
||||||
"web.php": {
|
"web.php": {
|
||||||
"type": "-",
|
"type": "-",
|
||||||
"size": 29085,
|
"size": 29230,
|
||||||
"lmtime": 1775665188561,
|
"lmtime": 1775673880474,
|
||||||
"modified": false
|
"modified": false
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@@ -2595,6 +2694,38 @@
|
|||||||
"modified": false
|
"modified": false
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"Automation": {
|
||||||
|
"AutomationController.php": {
|
||||||
|
"type": "-",
|
||||||
|
"size": 23909,
|
||||||
|
"lmtime": 1775590757613,
|
||||||
|
"modified": false
|
||||||
|
},
|
||||||
|
"AutomationExecutionLogRepository.php": {
|
||||||
|
"type": "-",
|
||||||
|
"size": 6493,
|
||||||
|
"lmtime": 1774702487160,
|
||||||
|
"modified": false
|
||||||
|
},
|
||||||
|
"AutomationRepository.php": {
|
||||||
|
"type": "-",
|
||||||
|
"size": 10557,
|
||||||
|
"lmtime": 1775246477348,
|
||||||
|
"modified": false
|
||||||
|
},
|
||||||
|
"AutomationService.php": {
|
||||||
|
"type": "-",
|
||||||
|
"size": 24938,
|
||||||
|
"lmtime": 1775245766985,
|
||||||
|
"modified": false
|
||||||
|
},
|
||||||
|
"OrderStatusAgedService.php": {
|
||||||
|
"type": "-",
|
||||||
|
"size": 5040,
|
||||||
|
"lmtime": 1774909434600,
|
||||||
|
"modified": false
|
||||||
|
}
|
||||||
|
},
|
||||||
"Cron": {
|
"Cron": {
|
||||||
"AllegroOrdersImportHandler.php": {
|
"AllegroOrdersImportHandler.php": {
|
||||||
"type": "-",
|
"type": "-",
|
||||||
@@ -2762,9 +2893,9 @@
|
|||||||
"Orders": {
|
"Orders": {
|
||||||
"OrderImportRepository.php": {
|
"OrderImportRepository.php": {
|
||||||
"type": "-",
|
"type": "-",
|
||||||
"size": 19810,
|
"size": 19963,
|
||||||
"lmtime": 1775064061646,
|
"lmtime": 1775675692146,
|
||||||
"modified": true
|
"modified": false
|
||||||
},
|
},
|
||||||
"OrderImportService.php": {
|
"OrderImportService.php": {
|
||||||
"type": "-",
|
"type": "-",
|
||||||
@@ -2791,6 +2922,32 @@
|
|||||||
"modified": false
|
"modified": false
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"Printing": {
|
||||||
|
"ApiKeyMiddleware.php": {
|
||||||
|
"type": "-",
|
||||||
|
"size": 1077,
|
||||||
|
"lmtime": 0,
|
||||||
|
"modified": false
|
||||||
|
},
|
||||||
|
"PrintApiController.php": {
|
||||||
|
"type": "-",
|
||||||
|
"size": 5405,
|
||||||
|
"lmtime": 1774473708117,
|
||||||
|
"modified": false
|
||||||
|
},
|
||||||
|
"PrintApiKeyRepository.php": {
|
||||||
|
"type": "-",
|
||||||
|
"size": 2143,
|
||||||
|
"lmtime": 0,
|
||||||
|
"modified": false
|
||||||
|
},
|
||||||
|
"PrintJobRepository.php": {
|
||||||
|
"type": "-",
|
||||||
|
"size": 4696,
|
||||||
|
"lmtime": 1774474858944,
|
||||||
|
"modified": false
|
||||||
|
}
|
||||||
|
},
|
||||||
"ProductLinks": {
|
"ProductLinks": {
|
||||||
"ChannelOffersRepository.php": {
|
"ChannelOffersRepository.php": {
|
||||||
"type": "-",
|
"type": "-",
|
||||||
@@ -2870,8 +3027,8 @@
|
|||||||
"Settings": {
|
"Settings": {
|
||||||
"AllegroApiClient.php": {
|
"AllegroApiClient.php": {
|
||||||
"type": "-",
|
"type": "-",
|
||||||
"size": 14831,
|
"size": 15365,
|
||||||
"lmtime": 1775246456529,
|
"lmtime": 1775673414584,
|
||||||
"modified": false
|
"modified": false
|
||||||
},
|
},
|
||||||
"AllegroDeliveryMappingController.php": {
|
"AllegroDeliveryMappingController.php": {
|
||||||
@@ -2900,14 +3057,14 @@
|
|||||||
},
|
},
|
||||||
"AllegroOAuthClient.php": {
|
"AllegroOAuthClient.php": {
|
||||||
"type": "-",
|
"type": "-",
|
||||||
"size": 6550,
|
"size": 6910,
|
||||||
"lmtime": 1775246465879,
|
"lmtime": 1775673436567,
|
||||||
"modified": false
|
"modified": false
|
||||||
},
|
},
|
||||||
"AllegroOrderImportService.php": {
|
"AllegroOrderImportService.php": {
|
||||||
"type": "-",
|
"type": "-",
|
||||||
"size": 31560,
|
"size": 32098,
|
||||||
"lmtime": 1775590791166,
|
"lmtime": 1775675664259,
|
||||||
"modified": false
|
"modified": false
|
||||||
},
|
},
|
||||||
"AllegroOrdersSyncService.php": {
|
"AllegroOrdersSyncService.php": {
|
||||||
@@ -3140,14 +3297,14 @@
|
|||||||
},
|
},
|
||||||
"ShopproOrderMapper.php": {
|
"ShopproOrderMapper.php": {
|
||||||
"type": "-",
|
"type": "-",
|
||||||
"size": 40039,
|
"size": 40088,
|
||||||
"lmtime": 1775559420878,
|
"lmtime": 1775675670687,
|
||||||
"modified": false
|
"modified": false
|
||||||
},
|
},
|
||||||
"ShopproOrdersSyncService.php": {
|
"ShopproOrdersSyncService.php": {
|
||||||
"type": "-",
|
"type": "-",
|
||||||
"size": 15054,
|
"size": 15154,
|
||||||
"lmtime": 1775591087317,
|
"lmtime": 1775674624190,
|
||||||
"modified": false
|
"modified": false
|
||||||
},
|
},
|
||||||
"ShopproOrderSyncStateRepository.php": {
|
"ShopproOrderSyncStateRepository.php": {
|
||||||
@@ -3196,8 +3353,8 @@
|
|||||||
},
|
},
|
||||||
"AllegroTrackingService.php": {
|
"AllegroTrackingService.php": {
|
||||||
"type": "-",
|
"type": "-",
|
||||||
"size": 6437,
|
"size": 6854,
|
||||||
"lmtime": 1775246468084,
|
"lmtime": 1775673463499,
|
||||||
"modified": false
|
"modified": false
|
||||||
},
|
},
|
||||||
"ApaczkaShipmentService.php": {
|
"ApaczkaShipmentService.php": {
|
||||||
@@ -3299,61 +3456,11 @@
|
|||||||
"modified": false
|
"modified": false
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"Automation": {
|
"Info": {
|
||||||
"AutomationController.php": {
|
"InfoController.php": {
|
||||||
"type": "-",
|
"type": "-",
|
||||||
"size": 23909,
|
"size": 665,
|
||||||
"lmtime": 1775590757613,
|
"lmtime": 1775673991488,
|
||||||
"modified": false
|
|
||||||
},
|
|
||||||
"AutomationExecutionLogRepository.php": {
|
|
||||||
"type": "-",
|
|
||||||
"size": 6493,
|
|
||||||
"lmtime": 1774702487160,
|
|
||||||
"modified": false
|
|
||||||
},
|
|
||||||
"AutomationRepository.php": {
|
|
||||||
"type": "-",
|
|
||||||
"size": 10557,
|
|
||||||
"lmtime": 1775246477348,
|
|
||||||
"modified": false
|
|
||||||
},
|
|
||||||
"AutomationService.php": {
|
|
||||||
"type": "-",
|
|
||||||
"size": 24938,
|
|
||||||
"lmtime": 1775245766985,
|
|
||||||
"modified": false
|
|
||||||
},
|
|
||||||
"OrderStatusAgedService.php": {
|
|
||||||
"type": "-",
|
|
||||||
"size": 5040,
|
|
||||||
"lmtime": 1774909434600,
|
|
||||||
"modified": false
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"Printing": {
|
|
||||||
"ApiKeyMiddleware.php": {
|
|
||||||
"type": "-",
|
|
||||||
"size": 1077,
|
|
||||||
"lmtime": 0,
|
|
||||||
"modified": false
|
|
||||||
},
|
|
||||||
"PrintApiController.php": {
|
|
||||||
"type": "-",
|
|
||||||
"size": 5405,
|
|
||||||
"lmtime": 1774473708117,
|
|
||||||
"modified": false
|
|
||||||
},
|
|
||||||
"PrintApiKeyRepository.php": {
|
|
||||||
"type": "-",
|
|
||||||
"size": 2143,
|
|
||||||
"lmtime": 0,
|
|
||||||
"modified": false
|
|
||||||
},
|
|
||||||
"PrintJobRepository.php": {
|
|
||||||
"type": "-",
|
|
||||||
"size": 4696,
|
|
||||||
"lmtime": 1774474858944,
|
|
||||||
"modified": false
|
"modified": false
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
125
bin/reissue_receipt.php
Normal file
125
bin/reissue_receipt.php
Normal file
@@ -0,0 +1,125 @@
|
|||||||
|
<?php
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
use App\Modules\Accounting\ReceiptRepository;
|
||||||
|
use App\Modules\Accounting\ReceiptService;
|
||||||
|
use App\Modules\Orders\OrdersRepository;
|
||||||
|
use App\Modules\Settings\CompanySettingsRepository;
|
||||||
|
use App\Modules\Settings\ReceiptConfigRepository;
|
||||||
|
|
||||||
|
$basePath = dirname(__DIR__);
|
||||||
|
|
||||||
|
// Autoloader
|
||||||
|
$vendorAutoload = $basePath . '/vendor/autoload.php';
|
||||||
|
if (is_file($vendorAutoload)) {
|
||||||
|
require $vendorAutoload;
|
||||||
|
} else {
|
||||||
|
spl_autoload_register(static function (string $class) use ($basePath): void {
|
||||||
|
$prefix = 'App\\';
|
||||||
|
if (!str_starts_with($class, $prefix)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
$relative = substr($class, strlen($prefix));
|
||||||
|
$file = $basePath . '/src/' . str_replace('\\', '/', $relative) . '.php';
|
||||||
|
if (is_file($file)) {
|
||||||
|
require $file;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
// Parse .env manually
|
||||||
|
$env = [];
|
||||||
|
$envFile = $basePath . '/.env';
|
||||||
|
if (is_file($envFile)) {
|
||||||
|
foreach (file($envFile, FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES) as $line) {
|
||||||
|
$line = trim($line);
|
||||||
|
if ($line === '' || str_starts_with($line, '#')) continue;
|
||||||
|
$pos = strpos($line, '=');
|
||||||
|
if ($pos === false) continue;
|
||||||
|
$key = trim(substr($line, 0, $pos));
|
||||||
|
$value = trim(trim(substr($line, $pos + 1)), "\"'");
|
||||||
|
$env[$key] = $value;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Use DB_HOST_REMOTE if available, fallback to DB_HOST
|
||||||
|
$host = ($env['DB_HOST_REMOTE'] ?? '') !== '' ? $env['DB_HOST_REMOTE'] : ($env['DB_HOST'] ?? '127.0.0.1');
|
||||||
|
$port = (int) ($env['DB_PORT'] ?? 3306);
|
||||||
|
$database = $env['DB_DATABASE'] ?? 'orderpro';
|
||||||
|
$username = $env['DB_USERNAME'] ?? 'root';
|
||||||
|
$password = $env['DB_PASSWORD'] ?? '';
|
||||||
|
|
||||||
|
echo "Connecting to: {$host}:{$port}/{$database}\n";
|
||||||
|
|
||||||
|
$dsn = sprintf('mysql:host=%s;port=%d;dbname=%s;charset=utf8mb4', $host, $port, $database);
|
||||||
|
$pdo = new PDO($dsn, $username, $password, [
|
||||||
|
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
|
||||||
|
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
|
||||||
|
PDO::ATTR_EMULATE_PREPARES => false,
|
||||||
|
]);
|
||||||
|
|
||||||
|
echo "Connected OK\n";
|
||||||
|
|
||||||
|
$orderId = (int) ($argv[1] ?? 0);
|
||||||
|
if ($orderId <= 0) {
|
||||||
|
echo "Usage: php bin/reissue_receipt.php <order_id> [config_id]\n";
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
$configId = (int) ($argv[2] ?? 0);
|
||||||
|
|
||||||
|
// Find active config if not specified
|
||||||
|
if ($configId <= 0) {
|
||||||
|
$stmt = $pdo->prepare('SELECT id FROM receipt_configs WHERE is_active = 1 LIMIT 1');
|
||||||
|
$stmt->execute();
|
||||||
|
$row = $stmt->fetch(PDO::FETCH_ASSOC);
|
||||||
|
if (!$row) {
|
||||||
|
echo "ERROR: No active receipt config found\n";
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
$configId = (int) $row['id'];
|
||||||
|
echo "Using config_id: {$configId}\n";
|
||||||
|
}
|
||||||
|
|
||||||
|
// Delete existing receipts for this order
|
||||||
|
$existing = $pdo->prepare('SELECT id, receipt_number FROM receipts WHERE order_id = :order_id');
|
||||||
|
$existing->execute(['order_id' => $orderId]);
|
||||||
|
$receipts = $existing->fetchAll(PDO::FETCH_ASSOC);
|
||||||
|
|
||||||
|
if ($receipts) {
|
||||||
|
foreach ($receipts as $r) {
|
||||||
|
echo "Deleting receipt #{$r['id']} ({$r['receipt_number']})\n";
|
||||||
|
}
|
||||||
|
$pdo->prepare('DELETE FROM receipts WHERE order_id = :order_id')->execute(['order_id' => $orderId]);
|
||||||
|
} else {
|
||||||
|
echo "No existing receipts for order #{$orderId}\n";
|
||||||
|
}
|
||||||
|
|
||||||
|
// Check delivery_price
|
||||||
|
$stmt = $pdo->prepare('SELECT delivery_price, total_with_tax FROM orders WHERE id = :id');
|
||||||
|
$stmt->execute(['id' => $orderId]);
|
||||||
|
$order = $stmt->fetch(PDO::FETCH_ASSOC);
|
||||||
|
if (!$order) {
|
||||||
|
echo "ERROR: Order #{$orderId} not found\n";
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
echo "Order #{$orderId}: total_with_tax={$order['total_with_tax']}, delivery_price={$order['delivery_price']}\n";
|
||||||
|
|
||||||
|
// Issue new receipt
|
||||||
|
$receiptRepo = new ReceiptRepository($pdo);
|
||||||
|
$configRepo = new ReceiptConfigRepository($pdo);
|
||||||
|
$companyRepo = new CompanySettingsRepository($pdo);
|
||||||
|
$ordersRepo = new OrdersRepository($pdo);
|
||||||
|
$service = new ReceiptService($receiptRepo, $configRepo, $companyRepo, $ordersRepo);
|
||||||
|
|
||||||
|
try {
|
||||||
|
$result = $service->issue([
|
||||||
|
'order_id' => $orderId,
|
||||||
|
'config_id' => $configId,
|
||||||
|
'created_by' => null,
|
||||||
|
]);
|
||||||
|
echo "SUCCESS: Receipt issued: {$result['receipt_number']}, total_gross: {$result['total_gross']}\n";
|
||||||
|
} catch (Throwable $e) {
|
||||||
|
echo "ERROR: {$e->getMessage()}\n";
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
@@ -0,0 +1,32 @@
|
|||||||
|
-- Phase 90: Add delivery_price column and backfill from import JSON data
|
||||||
|
-- Column was in CREATE TABLE migration but table predates it — add if missing
|
||||||
|
|
||||||
|
ALTER TABLE orders ADD COLUMN delivery_price DECIMAL(12,2) NULL AFTER total_paid;
|
||||||
|
|
||||||
|
-- Allegro: delivery_cost stored as object {amount, currency} in preferences_json
|
||||||
|
UPDATE orders
|
||||||
|
SET delivery_price = CAST(JSON_UNQUOTE(JSON_EXTRACT(preferences_json, '$.delivery_cost.amount')) AS DECIMAL(12,2))
|
||||||
|
WHERE source = 'allegro'
|
||||||
|
AND delivery_price IS NULL
|
||||||
|
AND preferences_json IS NOT NULL
|
||||||
|
AND JSON_EXTRACT(preferences_json, '$.delivery_cost.amount') IS NOT NULL;
|
||||||
|
|
||||||
|
-- Allegro fallback: delivery_cost stored as plain number (edge case)
|
||||||
|
UPDATE orders
|
||||||
|
SET delivery_price = CAST(JSON_UNQUOTE(JSON_EXTRACT(preferences_json, '$.delivery_cost')) AS DECIMAL(12,2))
|
||||||
|
WHERE source = 'allegro'
|
||||||
|
AND delivery_price IS NULL
|
||||||
|
AND preferences_json IS NOT NULL
|
||||||
|
AND JSON_EXTRACT(preferences_json, '$.delivery_cost') IS NOT NULL
|
||||||
|
AND JSON_TYPE(JSON_EXTRACT(preferences_json, '$.delivery_cost')) != 'OBJECT';
|
||||||
|
|
||||||
|
-- shopPRO: transport_cost / delivery_cost / shipping.cost in payload_json
|
||||||
|
UPDATE orders
|
||||||
|
SET delivery_price = COALESCE(
|
||||||
|
CAST(NULLIF(JSON_UNQUOTE(JSON_EXTRACT(payload_json, '$.transport_cost')), 'null') AS DECIMAL(12,2)),
|
||||||
|
CAST(NULLIF(JSON_UNQUOTE(JSON_EXTRACT(payload_json, '$.delivery_cost')), 'null') AS DECIMAL(12,2)),
|
||||||
|
CAST(NULLIF(JSON_UNQUOTE(JSON_EXTRACT(payload_json, '$.shipping.cost')), 'null') AS DECIMAL(12,2))
|
||||||
|
)
|
||||||
|
WHERE source = 'shoppro'
|
||||||
|
AND delivery_price IS NULL
|
||||||
|
AND payload_json IS NOT NULL;
|
||||||
@@ -33,6 +33,7 @@ final class ConnectionFactory
|
|||||||
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
|
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
|
||||||
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
|
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
|
||||||
PDO::ATTR_EMULATE_PREPARES => false,
|
PDO::ATTR_EMULATE_PREPARES => false,
|
||||||
|
PDO::ATTR_TIMEOUT => 5,
|
||||||
]);
|
]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -122,13 +122,13 @@ final class OrderImportRepository
|
|||||||
integration_id, source, source_order_id, external_order_id, external_platform_id, external_platform_account_id,
|
integration_id, source, source_order_id, external_order_id, external_platform_id, external_platform_account_id,
|
||||||
external_status_id, external_payment_type_id, payment_status, external_carrier_id, external_carrier_account_id,
|
external_status_id, external_payment_type_id, payment_status, external_carrier_id, external_carrier_account_id,
|
||||||
customer_login, is_invoice, is_encrypted, is_canceled_by_buyer, currency,
|
customer_login, is_invoice, is_encrypted, is_canceled_by_buyer, currency,
|
||||||
total_without_tax, total_with_tax, total_paid, send_date_min, send_date_max, ordered_at,
|
total_without_tax, total_with_tax, total_paid, delivery_price, send_date_min, send_date_max, ordered_at,
|
||||||
source_created_at, source_updated_at, preferences_json, payload_json, fetched_at
|
source_created_at, source_updated_at, preferences_json, payload_json, fetched_at
|
||||||
) VALUES (
|
) VALUES (
|
||||||
:integration_id, :source, :source_order_id, :external_order_id, :external_platform_id, :external_platform_account_id,
|
:integration_id, :source, :source_order_id, :external_order_id, :external_platform_id, :external_platform_account_id,
|
||||||
:external_status_id, :external_payment_type_id, :payment_status, :external_carrier_id, :external_carrier_account_id,
|
:external_status_id, :external_payment_type_id, :payment_status, :external_carrier_id, :external_carrier_account_id,
|
||||||
:customer_login, :is_invoice, :is_encrypted, :is_canceled_by_buyer, :currency,
|
:customer_login, :is_invoice, :is_encrypted, :is_canceled_by_buyer, :currency,
|
||||||
:total_without_tax, :total_with_tax, :total_paid, :send_date_min, :send_date_max, :ordered_at,
|
:total_without_tax, :total_with_tax, :total_paid, :delivery_price, :send_date_min, :send_date_max, :ordered_at,
|
||||||
:source_created_at, :source_updated_at, :preferences_json, :payload_json, :fetched_at
|
:source_created_at, :source_updated_at, :preferences_json, :payload_json, :fetched_at
|
||||||
)'
|
)'
|
||||||
);
|
);
|
||||||
@@ -168,6 +168,7 @@ final class OrderImportRepository
|
|||||||
total_without_tax = :total_without_tax,
|
total_without_tax = :total_without_tax,
|
||||||
total_with_tax = :total_with_tax,
|
total_with_tax = :total_with_tax,
|
||||||
total_paid = :total_paid,
|
total_paid = :total_paid,
|
||||||
|
delivery_price = :delivery_price,
|
||||||
send_date_min = :send_date_min,
|
send_date_min = :send_date_min,
|
||||||
send_date_max = :send_date_max,
|
send_date_max = :send_date_max,
|
||||||
ordered_at = :ordered_at,
|
ordered_at = :ordered_at,
|
||||||
@@ -213,6 +214,7 @@ final class OrderImportRepository
|
|||||||
'total_without_tax' => $orderData['total_without_tax'] ?? null,
|
'total_without_tax' => $orderData['total_without_tax'] ?? null,
|
||||||
'total_with_tax' => $orderData['total_with_tax'] ?? null,
|
'total_with_tax' => $orderData['total_with_tax'] ?? null,
|
||||||
'total_paid' => $orderData['total_paid'] ?? null,
|
'total_paid' => $orderData['total_paid'] ?? null,
|
||||||
|
'delivery_price' => $orderData['delivery_price'] ?? null,
|
||||||
'send_date_min' => $orderData['send_date_min'] ?? null,
|
'send_date_min' => $orderData['send_date_min'] ?? null,
|
||||||
'send_date_max' => $orderData['send_date_max'] ?? null,
|
'send_date_max' => $orderData['send_date_max'] ?? null,
|
||||||
'ordered_at' => $orderData['ordered_at'] ?? null,
|
'ordered_at' => $orderData['ordered_at'] ?? null,
|
||||||
|
|||||||
@@ -232,6 +232,7 @@ final class AllegroOrderImportService
|
|||||||
'delivery_cost' => $delivery['cost'] ?? null,
|
'delivery_cost' => $delivery['cost'] ?? null,
|
||||||
'delivery_time' => $deliveryTime,
|
'delivery_time' => $deliveryTime,
|
||||||
],
|
],
|
||||||
|
'delivery_price' => $this->resolveDeliveryCost($delivery),
|
||||||
'payload_json' => $payload,
|
'payload_json' => $payload,
|
||||||
'fetched_at' => $fetchedAt,
|
'fetched_at' => $fetchedAt,
|
||||||
];
|
];
|
||||||
@@ -733,6 +734,21 @@ final class AllegroOrderImportService
|
|||||||
return (float) $value;
|
return (float) $value;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param array<string, mixed> $delivery
|
||||||
|
*/
|
||||||
|
private function resolveDeliveryCost(array $delivery): ?float
|
||||||
|
{
|
||||||
|
$cost = $delivery['cost'] ?? null;
|
||||||
|
if (is_array($cost)) {
|
||||||
|
return $this->amountToFloat($cost);
|
||||||
|
}
|
||||||
|
if (is_numeric($cost)) {
|
||||||
|
return (float) $cost;
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param array<string, mixed> $address
|
* @param array<string, mixed> $address
|
||||||
*/
|
*/
|
||||||
|
|||||||
@@ -152,6 +152,7 @@ final class ShopproOrderMapper
|
|||||||
'total_without_tax' => $totalNet,
|
'total_without_tax' => $totalNet,
|
||||||
'total_with_tax' => $totalGross,
|
'total_with_tax' => $totalGross,
|
||||||
'total_paid' => $totalPaid,
|
'total_paid' => $totalPaid,
|
||||||
|
'delivery_price' => $transportCost,
|
||||||
'send_date_min' => null,
|
'send_date_min' => null,
|
||||||
'send_date_max' => null,
|
'send_date_max' => null,
|
||||||
'ordered_at' => $sourceCreatedAt,
|
'ordered_at' => $sourceCreatedAt,
|
||||||
|
|||||||
Reference in New Issue
Block a user