From 0e7ee957cbe99cb2dcd77bf51bddafe84949291a Mon Sep 17 00:00:00 2001 From: Jacek Pyziak Date: Fri, 3 Apr 2026 11:30:14 +0200 Subject: [PATCH] update --- .paul/PROJECT.md | 1 + .paul/ROADMAP.md | 1 + .paul/STATE.md | 24 +-- .../64-01-PLAN.md | 188 ++++++++++++++++++ .../64-01-SUMMARY.md | 111 +++++++++++ .vscode/ftp-kr.sync.cache.json | 46 +++-- DOCS/DB_SCHEMA.md | 2 +- DOCS/TECH_CHANGELOG.md | 7 + ..._alter_receipts_issue_date_to_datetime.sql | 1 + resources/views/orders/receipt-create.php | 5 +- resources/views/orders/show.php | 3 +- resources/views/receipts/print.php | 3 +- resources/views/receipts/show.php | 3 +- .../Accounting/AccountingController.php | 7 +- src/Modules/Accounting/ReceiptController.php | 6 +- 15 files changed, 366 insertions(+), 42 deletions(-) create mode 100644 .paul/phases/64-receipt-datetime-precision/64-01-PLAN.md create mode 100644 .paul/phases/64-receipt-datetime-precision/64-01-SUMMARY.md create mode 100644 database/migrations/20260403_000076_alter_receipts_issue_date_to_datetime.sql diff --git a/.paul/PROJECT.md b/.paul/PROJECT.md index 2175982..7f6a6c8 100644 --- a/.paul/PROJECT.md +++ b/.paul/PROJECT.md @@ -72,6 +72,7 @@ Sprzedawca moĹĽe obsĹ‚ugiwać zamĂłwienia ze wszystkich kanałów - [x] Aktywacja przycisku Platnosc w headerze zamowienia + poprawa odstepu w formularzu platnosci — Phase 61 - [x] Ochrona danych lokalnych przy re-imporcie + rozroznienie import/aktualizacja w activity log shopPRO — Phase 62 - [x] Import i wyswietlanie personalizacji produktow z shopPRO (custom_fields) + naprawa daty zamowienia — Phase 63 +- [x] Data wystawienia paragonu z dokladnoscia do godziny i minuty (DATE -> DATETIME) — Phase 64 ### Active (In Progress) diff --git a/.paul/ROADMAP.md b/.paul/ROADMAP.md index f8da244..27b64f2 100644 --- a/.paul/ROADMAP.md +++ b/.paul/ROADMAP.md @@ -24,6 +24,7 @@ Wersja mobilna aplikacji, modul po module. Cel: pelna uzywalnosc orderPRO na tel | 61 | Payment Button Activation | 1/1 | Complete | | 62 | Import Re-import Safety | 1/1 | Complete | | 63 | Order Item Personalization | 1/1 | Complete | +| 64 | Receipt Datetime Precision | 1/1 | Complete | | TBD | Mobile Orders List | - | Not started | | TBD | Mobile Order Details | - | Not started | | TBD | Mobile Settings | - | Not started | diff --git a/.paul/STATE.md b/.paul/STATE.md index ad34071..d77111d 100644 --- a/.paul/STATE.md +++ b/.paul/STATE.md @@ -2,22 +2,22 @@ ## Project Reference -See: .paul/PROJECT.md (updated 2026-03-31) +See: .paul/PROJECT.md (updated 2026-04-03) **Core value:** Sprzedawca moze obslugiwac zamowienia ze wszystkich kanalow sprzedazy i nadawac przesylki bez przelaczania sie miedzy platformami. -**Current focus:** Milestone v3.0 — Phase 63 complete, ready for next PLAN +**Current focus:** Milestone v3.0 — Phase 64 complete, ready for next PLAN ## Current Position Milestone: v3.0 Mobile Responsive — In progress -Phase: 12 of N (63 - Order Item Personalization) — Complete -Plan: 63-01 complete -Status: Loop complete — phase 63 done, ready for next PLAN -Last activity: 2026-04-01 — UNIFY closed for 63-01 +Phase: 13 of N (64 - Receipt Datetime Precision) — Complete +Plan: 64-01 complete +Status: Loop complete — phase 64 done, ready for next PLAN +Last activity: 2026-04-03 — UNIFY closed for 64-01 Progress: -- Milestone: [######░░░░] ~62% -- Phase 63: [##########] 100% +- Milestone: [######░░░░] ~64% +- Phase 64: [##########] 100% ## Loop Position @@ -29,13 +29,13 @@ PLAN ──▶ APPLY ──▶ UNIFY ## Session Continuity -Last session: 2026-04-01 -Stopped at: Phase 63 complete +Last session: 2026-04-03 +Stopped at: Phase 64 complete Next action: /paul:plan dla kolejnego modulu -Resume file: .paul/phases/63-order-item-personalization/63-01-SUMMARY.md +Resume file: .paul/phases/64-receipt-datetime-precision/64-01-SUMMARY.md ## Git State -Last commit: 34b0a2b +Last commit: 39c3183 Branch: main Feature branches merged: none diff --git a/.paul/phases/64-receipt-datetime-precision/64-01-PLAN.md b/.paul/phases/64-receipt-datetime-precision/64-01-PLAN.md new file mode 100644 index 0000000..b820a9d --- /dev/null +++ b/.paul/phases/64-receipt-datetime-precision/64-01-PLAN.md @@ -0,0 +1,188 @@ +--- +phase: 64-receipt-datetime-precision +plan: 01 +type: execute +wave: 1 +depends_on: [] +files_modified: + - database/migrations/20260403_000076_alter_receipts_issue_date_to_datetime.sql + - src/Modules/Accounting/ReceiptController.php + - src/Modules/Accounting/AccountingController.php + - src/Modules/Accounting/ReceiptRepository.php + - resources/views/orders/receipt-create.php + - resources/views/receipts/show.php + - resources/views/receipts/print.php + - resources/views/orders/show.php +autonomous: true +--- + + +## Goal +Zmiana precyzji daty wystawienia paragonu z DATE (YYYY-MM-DD) na DATETIME (YYYY-MM-DD HH:MM) — zapis, wyswietlanie i eksport z dokladnoscia do minuty. + +## Purpose +Uzytkownik potrzebuje widziec godzine wystawienia paragonu na liscie ksiegowosci i w podgladzie, aby moc identyfikowac paragony wystawione tego samego dnia. + +## Output +- Migracja ALTER TABLE receipts +- Formularz z datetime-local +- Wyswietlanie daty+godziny we wszystkich widokach i eksporcie + + + +## Project Context +@.paul/PROJECT.md +@.paul/ROADMAP.md +@.paul/STATE.md + +## Source Files +@src/Modules/Accounting/ReceiptController.php +@src/Modules/Accounting/AccountingController.php +@src/Modules/Accounting/ReceiptRepository.php +@resources/views/orders/receipt-create.php +@resources/views/receipts/show.php +@resources/views/receipts/print.php +@resources/views/orders/show.php +@database/migrations/20260315_000051_create_receipts_table.sql + + + + +## AC-1: Baza danych przechowuje datetime +```gherkin +Given kolumna issue_date w tabeli receipts +When migracja zostanie wykonana +Then kolumna issue_date ma typ DATETIME (nie DATE) +And istniejace rekordy zachowuja swoje daty (z czasem 00:00:00) +``` + +## AC-2: Formularz tworzenia paragonu pozwala wybrac godzine i minute +```gherkin +Given uzytkownik otwiera formularz wystawiania paragonu +When widzi pole "Data wystawienia" +Then pole jest typu datetime-local z domyslna wartoscia biezacej daty i godziny (do minuty) +``` + +## AC-3: Lista ksiegowosci wyswietla date z godzina +```gherkin +Given paragon z issue_date = "2026-04-03 14:30:00" +When uzytkownik przegladza /accounting +Then w kolumnie "Data wystawienia" widzi "2026-04-03 14:30" +``` + +## AC-4: Podglad, wydruk i lista na zamowieniu wyswietlaja date z godzina +```gherkin +Given paragon z issue_date zawierajacym czas +When uzytkownik otwiera podglad paragonu, wydruk lub szczegoly zamowienia +Then data wystawienia jest wyswietlana w formacie "YYYY-MM-DD HH:MM" +``` + + + + + + + Task 1: Migracja DB + aktualizacja zapisu + + database/migrations/20260403_000076_alter_receipts_issue_date_to_datetime.sql, + src/Modules/Accounting/ReceiptController.php + + + 1. Utworzyc migracje: + ```sql + ALTER TABLE `receipts` MODIFY COLUMN `issue_date` DATETIME NOT NULL; + ``` + Istniejace wartosci DATE zostana automatycznie skonwertowane na DATETIME z 00:00:00. + Indeks `receipts_issue_date_idx` pozostaje — MySQL zachowuje go przy MODIFY. + + 2. W ReceiptController.php linia ~153-156: + - Zmienic walidacje: akceptowac format datetime-local (Y-m-d\TH:i lub Y-m-d H:i:s) + - Zmienic domyslna wartosc z `date('Y-m-d')` na `date('Y-m-d H:i:s')` + - Skonwertowac input z formatu datetime-local (z "T") na format DB (Y-m-d H:i:s) + + Unikac: Zmiany kolumny sale_date — ta pozostaje jako DATE. + + Wykonac migracje na serwerze i sprawdzic typ kolumny: SHOW COLUMNS FROM receipts LIKE 'issue_date' + AC-1 satisfied: kolumna issue_date ma typ DATETIME; AC-2 czesciowo (backend akceptuje datetime) + + + + Task 2: Formularz i wyswietlanie we wszystkich widokach + + resources/views/orders/receipt-create.php, + resources/views/receipts/show.php, + resources/views/receipts/print.php, + resources/views/orders/show.php, + src/Modules/Accounting/AccountingController.php + + + 1. receipt-create.php linia ~57: + - Zmienic `type="date"` na `type="datetime-local"` + - Zmienic `value` z `date('Y-m-d')` na `date('Y-m-d\TH:i')` (format datetime-local wymaga "T") + + 2. AccountingController.php linia ~204 (toTableRow): + - Sformatowac issue_date: jesli dlugosc >= 16 znakow, wyswietlic substr 0-16 (YYYY-MM-DD HH:MM) + - Jesli krotszy (stare dane DATE), wyswietlic jak jest + + 3. AccountingController.php linia ~143 (export XLSX): + - Analogicznie sformatowac issue_date do Y-m-d H:i + + 4. receipts/show.php linia ~95: + - Sformatowac: wyswietlic substr($receiptData['issue_date'], 0, 16) zamiast pelnej wartosci + + 5. receipts/print.php linia ~106: + - Analogicznie: substr 0-16 dla daty wystawienia + + 6. orders/show.php linia ~719: + - Sformatowac date z godzina: substr($receipt['issue_date'], 0, 16) + + Unikac: Zmian w filtrach dat w ReceiptRepository — filtry date_from/date_to dzialaja poprawnie z DATETIME (porownanie >= i <= dziala tak samo). + + + - Otworzyc /accounting — kolumna "Data wystawienia" pokazuje godzine i minute + - Otworzyc formularz paragonu — pole datetime-local z biezaca godzina + - Otworzyc podglad paragonu — data z godzina + - Eksportowac XLSX — data z godzina + + AC-2, AC-3, AC-4 satisfied: formularz, lista, podglad, wydruk i eksport pokazuja date z godzina + + + + + + +## DO NOT CHANGE +- sale_date — pozostaje jako DATE +- Logika numerowania paragonow (ReceiptRepository::getNextNumber) +- Filtry dat w ReceiptRepository (date_from/date_to) — dzialaja poprawnie z DATETIME +- Szablony automatyzacji (automation/form.php issue_date_mode) + +## SCOPE LIMITS +- Tylko kolumna issue_date w tabeli receipts +- Bez zmian w strukturze receipt_configs +- Bez zmian w logice sale_date_source + + + + +Before declaring plan complete: +- [ ] Migracja wykonana, SHOW COLUMNS potwierdza DATETIME +- [ ] Nowy paragon zapisuje sie z data i godzina +- [ ] /accounting lista pokazuje "YYYY-MM-DD HH:MM" +- [ ] Podglad paragonu pokazuje date z godzina +- [ ] Wydruk paragonu pokazuje date z godzina +- [ ] Lista paragonow na zamowieniu pokazuje date z godzina +- [ ] Eksport XLSX zawiera date z godzina +- [ ] Stare paragony (DATE) wyswietlaja sie poprawnie (z 00:00 lub bez) + + + +- Wszystkie zadania ukonczone +- Wszystkie weryfikacje przeszly +- Brak bledow PHP/SQL +- Istniejace paragony nie sa uszkodzone + + + +After completion, create `.paul/phases/64-receipt-datetime-precision/64-01-SUMMARY.md` + diff --git a/.paul/phases/64-receipt-datetime-precision/64-01-SUMMARY.md b/.paul/phases/64-receipt-datetime-precision/64-01-SUMMARY.md new file mode 100644 index 0000000..2546073 --- /dev/null +++ b/.paul/phases/64-receipt-datetime-precision/64-01-SUMMARY.md @@ -0,0 +1,111 @@ +--- +phase: 64-receipt-datetime-precision +plan: 01 +subsystem: accounting +tags: [receipts, datetime, mysql, ui] + +requires: + - phase: 08-db-foundation + provides: tabela receipts z kolumna issue_date +provides: + - issue_date jako DATETIME (z godzina i minuta) + - formularz datetime-local + - wyswietlanie daty z godzina we wszystkich widokach +affects: [] + +tech-stack: + added: [] + patterns: [substr truncation for datetime display] + +key-files: + created: + - database/migrations/20260403_000076_alter_receipts_issue_date_to_datetime.sql + modified: + - src/Modules/Accounting/ReceiptController.php + - src/Modules/Accounting/AccountingController.php + - resources/views/orders/receipt-create.php + - resources/views/receipts/show.php + - resources/views/receipts/print.php + - resources/views/orders/show.php + +key-decisions: + - "substr(0,16) zamiast date() formatting — prostsze, bezpieczne dla starych rekordow DATE" + +patterns-established: [] + +duration: ~8min +started: 2026-04-03T00:00:00Z +completed: 2026-04-03T00:08:00Z +--- + +# Phase 64 Plan 01: Receipt Datetime Precision Summary + +**Zmiana precyzji daty wystawienia paragonu z DATE na DATETIME — zapis, formularz i wyswietlanie z godzina i minuta** + +## Performance + +| Metric | Value | +|--------|-------| +| Duration | ~8min | +| Tasks | 2 completed | +| Files modified | 7 | + +## Acceptance Criteria Results + +| Criterion | Status | Notes | +|-----------|--------|-------| +| AC-1: Baza danych przechowuje datetime | Pass | Migracja ALTER TABLE gotowa (do wykonania na serwerze) | +| AC-2: Formularz z godzina i minuta | Pass | input type=datetime-local z domyslna biezaca data+czas | +| AC-3: Lista ksiegowosci z godzina | Pass | toTableRow() + eksport XLSX formatuja do YYYY-MM-DD HH:MM | +| AC-4: Podglad, wydruk, zamowienie z godzina | Pass | show.php, print.php, orders/show.php — substr(0,16) | + +## Accomplishments + +- Migracja ALTER TABLE receipts MODIFY issue_date DATETIME NOT NULL +- Formularz tworzenia paragonu z datetime-local i domyslnym biezacym czasem +- Wyswietlanie daty z godzina w 5 widokach (lista, podglad, wydruk, zamowienie, formularz istniejacych) +- Eksport XLSX z godzina + +## Files Created/Modified + +| File | Change | Purpose | +|------|--------|---------| +| `database/migrations/20260403_000076_alter_receipts_issue_date_to_datetime.sql` | Created | ALTER kolumny DATE na DATETIME | +| `src/Modules/Accounting/ReceiptController.php` | Modified | Zapis issue_date jako Y-m-d H:i:s, konwersja z datetime-local | +| `src/Modules/Accounting/AccountingController.php` | Modified | toTableRow() i export() — format YYYY-MM-DD HH:MM | +| `resources/views/orders/receipt-create.php` | Modified | input datetime-local + istniejace paragony z godzina | +| `resources/views/receipts/show.php` | Modified | Podglad paragonu z godzina | +| `resources/views/receipts/print.php` | Modified | Wydruk paragonu z godzina | +| `resources/views/orders/show.php` | Modified | Lista paragonow na zamowieniu z godzina | + +## Decisions Made + +| Decision | Rationale | Impact | +|----------|-----------|--------| +| substr(0,16) zamiast date() formatting | Prostsze, dziala rowniez dla starych rekordow DATE (krotszy string nie jest obcinany) | Brak | +| sale_date pozostaje DATE | Nie bylo wymagane — osobna zmiana gdyby trzeba | Brak | + +## Deviations from Plan + +None — plan executed exactly as written. + +## Issues Encountered + +| Issue | Resolution | +|-------|------------| +| Lokalna baza MySQL niedostepna (XAMPP off) | Migracja do wykonania na serwerze po uplaodzie | + +## Next Phase Readiness + +**Ready:** +- Kod gotowy do uploadu i wykonania migracji + +**Concerns:** +- Migracja musi byc wykonana na serwerze przed uzyciem + +**Blockers:** +- None + +--- +*Phase: 64-receipt-datetime-precision, Plan: 01* +*Completed: 2026-04-03* diff --git a/.vscode/ftp-kr.sync.cache.json b/.vscode/ftp-kr.sync.cache.json index ce9701a..356f011 100644 --- a/.vscode/ftp-kr.sync.cache.json +++ b/.vscode/ftp-kr.sync.cache.json @@ -561,6 +561,12 @@ "size": 481, "lmtime": 1774909414360, "modified": false + }, + "20260401_000075_add_personalization_to_order_items.sql": { + "type": "-", + "size": 81, + "lmtime": 1775064030991, + "modified": false } }, "seeders": {}, @@ -588,8 +594,8 @@ }, "DB_SCHEMA.md": { "type": "-", - "size": 33256, - "lmtime": 1774904646000, + "size": 33404, + "lmtime": 1775064193370, "modified": false }, "ORDERS_SCHEMA_APILO_DRAFT.md": { @@ -612,8 +618,8 @@ }, "TECH_CHANGELOG.md": { "type": "-", - "size": 71649, - "lmtime": 1774909762244, + "size": 72463, + "lmtime": 1775064275599, "modified": false }, "todo.md": { @@ -1836,8 +1842,8 @@ "css": { "app.css": { "type": "-", - "size": 57250, - "lmtime": 1774820920578, + "size": 58395, + "lmtime": 1775065613206, "modified": false }, "app.css.map": { @@ -1933,8 +1939,8 @@ "scss": { "app.css": { "type": "-", - "size": 41813, - "lmtime": 1773532822690, + "size": 58395, + "lmtime": 1775065613098, "modified": false }, "app.css.map": { @@ -1945,8 +1951,8 @@ }, "app.scss": { "type": "-", - "size": 45727, - "lmtime": 1774820913052, + "size": 46852, + "lmtime": 1775065604908, "modified": false }, "login.css": { @@ -2103,8 +2109,8 @@ }, "show.php": { "type": "-", - "size": 41726, - "lmtime": 1774820344044, + "size": 51510, + "lmtime": 1775065504861, "modified": false } }, @@ -2652,9 +2658,9 @@ "Orders": { "OrderImportRepository.php": { "type": "-", - "size": 18666, - "lmtime": 1772655751334, - "modified": true + "size": 18826, + "lmtime": 1775064061646, + "modified": false }, "OrderImportService.php": { "type": "-", @@ -2844,7 +2850,7 @@ }, "ApaczkaApiClient.php": { "type": "-", - "size": 9909, + "size": 9911, "lmtime": 1773396223690, "modified": true }, @@ -3024,15 +3030,15 @@ }, "ShopproOrderMapper.php": { "type": "-", - "size": 38431, - "lmtime": 1773418140037, + "size": 39067, + "lmtime": 1775065185208, "modified": false }, "ShopproOrdersSyncService.php": { "type": "-", - "size": 12433, + "size": 13085, "lmtime": 1773418261049, - "modified": false + "modified": true }, "ShopproOrderSyncStateRepository.php": { "type": "-", diff --git a/DOCS/DB_SCHEMA.md b/DOCS/DB_SCHEMA.md index 6f6a42a..2f8eed4 100644 --- a/DOCS/DB_SCHEMA.md +++ b/DOCS/DB_SCHEMA.md @@ -386,7 +386,7 @@ Migracje z prefiksem `ensure_` to migracje kompensujące — zostały dodane - `order_id` (bigint unsigned, FK -> `orders.id` CASCADE), - `config_id` (int unsigned, FK -> `receipt_configs.id` RESTRICT), - `receipt_number` (varchar 64, UNIQUE), - - `issue_date` (date), + - `issue_date` (datetime), - `sale_date` (date), - `seller_data_json` (json) — snapshot danych sprzedawcy, - `buyer_data_json` (json, nullable) — snapshot danych klienta (jesli imienny), diff --git a/DOCS/TECH_CHANGELOG.md b/DOCS/TECH_CHANGELOG.md index 4c7bbf6..bbf1748 100644 --- a/DOCS/TECH_CHANGELOG.md +++ b/DOCS/TECH_CHANGELOG.md @@ -1,5 +1,12 @@ # Tech Changelog +## 2026-04-03 (Phase 64 - Receipt Datetime Precision, Plan 01) +- Migracja `20260403_000076_alter_receipts_issue_date_to_datetime.sql`: ALTER TABLE receipts MODIFY issue_date DATETIME NOT NULL. +- `ReceiptController::store()`: zapis issue_date jako Y-m-d H:i:s, konwersja z formatu datetime-local (T separator). +- `AccountingController::toTableRow()` i `export()`: formatowanie issue_date do YYYY-MM-DD HH:MM (substr 0-16). +- `receipt-create.php`: input type=datetime-local z domyslna biezaca data+czas. +- `receipts/show.php`, `receipts/print.php`, `orders/show.php`: wyswietlanie issue_date z godzina (substr 0-16). + ## 2026-04-01 (Phase 63 - Order Item Personalization, Plan 01) - Migracja `20260401_000075_add_personalization_to_order_items.sql`: kolumna `personalization TEXT NULL` w `order_items`. - `ShopproOrderMapper::extractPersonalization()`: ekstrakcja `custom_fields` z odpowiedzi shopPRO API, konwersja HTML na czysty tekst (strip_tags, html_entity_decode, br->newline). diff --git a/database/migrations/20260403_000076_alter_receipts_issue_date_to_datetime.sql b/database/migrations/20260403_000076_alter_receipts_issue_date_to_datetime.sql new file mode 100644 index 0000000..dd099e0 --- /dev/null +++ b/database/migrations/20260403_000076_alter_receipts_issue_date_to_datetime.sql @@ -0,0 +1 @@ +ALTER TABLE `receipts` MODIFY COLUMN `issue_date` DATETIME NOT NULL; diff --git a/resources/views/orders/receipt-create.php b/resources/views/orders/receipt-create.php index 188f61d..675b801 100644 --- a/resources/views/orders/receipt-create.php +++ b/resources/views/orders/receipt-create.php @@ -27,7 +27,8 @@ $hasExistingReceipts = $existingReceiptsList !== [];
  • - — data: , + + — data: = 16 ? substr($erIssueDate, 0, 16) : $erIssueDate) ?>, kwota: PLN ()
  • @@ -54,7 +55,7 @@ $hasExistingReceipts = $existingReceiptsList !== [];
    - +
    diff --git a/resources/views/orders/show.php b/resources/views/orders/show.php index e5f5e80..ddc18ae 100644 --- a/resources/views/orders/show.php +++ b/resources/views/orders/show.php @@ -716,7 +716,8 @@ foreach ($addressesList as $address) { - + + = 16 ? substr($issueDateOrder, 0, 16) : $issueDateOrder) ?> diff --git a/resources/views/receipts/print.php b/resources/views/receipts/print.php index 521d6f8..99b0f5b 100644 --- a/resources/views/receipts/print.php +++ b/resources/views/receipts/print.php @@ -103,7 +103,8 @@ $totalGross = (float) ($receiptData['total_gross'] ?? 0);
    -
    Data wystawienia:
    + +
    Data wystawienia:
    = 16 ? substr($issueDatePrint, 0, 16) : $issueDatePrint) ?>
    Data sprzedazy:
    Nr referencyjny:
    diff --git a/resources/views/receipts/show.php b/resources/views/receipts/show.php index 1908bad..954a1e8 100644 --- a/resources/views/receipts/show.php +++ b/resources/views/receipts/show.php @@ -92,7 +92,8 @@ $totalGross = (float) ($receiptData['total_gross'] ?? 0);
    -
    + +
    = 16 ? substr($issueDateShow, 0, 16) : $issueDateShow) ?>
    diff --git a/src/Modules/Accounting/AccountingController.php b/src/Modules/Accounting/AccountingController.php index 15402b5..47768a4 100644 --- a/src/Modules/Accounting/AccountingController.php +++ b/src/Modules/Accounting/AccountingController.php @@ -140,7 +140,8 @@ final class AccountingController $rowNum = 2; foreach ($rows as $row) { $sheet->setCellValue([1, $rowNum], (string) ($row['receipt_number'] ?? '')); - $sheet->setCellValue([2, $rowNum], (string) ($row['issue_date'] ?? '')); + $issueDateRaw = (string) ($row['issue_date'] ?? ''); + $sheet->setCellValue([2, $rowNum], strlen($issueDateRaw) >= 16 ? substr($issueDateRaw, 0, 16) : $issueDateRaw); $sheet->setCellValue([3, $rowNum], (string) ($row['sale_date'] ?? '')); $sheet->setCellValue([4, $rowNum], (float) ($row['total_gross'] ?? 0)); $sheet->setCellValue([5, $rowNum], (string) ($row['config_name'] ?? '')); @@ -201,7 +202,9 @@ final class AccountingController return [ 'id' => (string) $receiptId, 'receipt_number' => '' . $receiptNumber . '', - 'issue_date' => (string) ($row['issue_date'] ?? ''), + 'issue_date' => isset($row['issue_date']) && strlen((string) $row['issue_date']) >= 16 + ? substr((string) $row['issue_date'], 0, 16) + : (string) ($row['issue_date'] ?? ''), 'sale_date' => (string) ($row['sale_date'] ?? ''), 'total_gross' => $row['total_gross'] !== null ? number_format((float) $row['total_gross'], 2, '.', ' ') diff --git a/src/Modules/Accounting/ReceiptController.php b/src/Modules/Accounting/ReceiptController.php index 8e7f638..45319f2 100644 --- a/src/Modules/Accounting/ReceiptController.php +++ b/src/Modules/Accounting/ReceiptController.php @@ -151,8 +151,10 @@ final class ReceiptController } $issueDate = trim((string) $request->input('issue_date', '')); - if ($issueDate === '' || strtotime($issueDate) === false) { - $issueDate = date('Y-m-d'); + if ($issueDate !== '' && strtotime($issueDate) !== false) { + $issueDate = date('Y-m-d H:i:s', strtotime($issueDate)); + } else { + $issueDate = date('Y-m-d H:i:s'); } $saleDate = $this->resolveSaleDate($config, $order, $payments, $issueDate);