9.0 KiB
9.0 KiB
phase, plan, type, wave, depends_on, files_modified, autonomous
| phase | plan | type | wave | depends_on | files_modified | autonomous | ||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 05-finances-fakturownia-import | 01 | execute | 1 |
|
true |
Purpose
Zminimalizowac reczna prace w finansach: pierwsze faktury wymagaja mapowania, ale kolejne dokumenty z tymi samymi klientami i pozycjami maja importowac sie juz calkowicie automatycznie.
Output
- Warstwa integracji API Fakturowni z konfiguracja przez
.env - Trwale mapowania klientow i produktow/uslug do struktur finansowych crmPRO
- Automatyczny import przez cron z idempotencja i data startu
- Panel w finansach do obslugi brakujacych mapowan
Source Files
@cron.php @autoload/class.Cron.php @autoload/Controllers/FinancesController.php @autoload/Domain/Finances/FinanceRepository.php @templates/finances/main-view.php @config.php
<acceptance_criteria>
AC-1: Konfiguracja API i data startu importu
Given w pliku .env ustawiono dane dostepowe Fakturowni oraz date startu importu
When cron uruchamia proces importu
Then importer laczy sie z API Fakturowni i pobiera tylko dokumenty od skonfigurowanej daty
And brakujaca konfiguracja zwraca czytelny blad bez przerwania calego crona
AC-2: Import przychodow i kosztow z idempotencja
Given faktura przychodowa lub kosztowa istnieje w Fakturowni
When dokument ma komplet mapowan klienta i pozycji
Then powstaje operacja finansowa w crmPRO z poprawnym znakiem kwoty (przychod > 0, koszt < 0)
And ponowne uruchomienie importu nie tworzy duplikatu tej samej faktury
AC-3: Mechanizm uczenia mapowan
Given dokument zawiera klienta lub pozycje bez mapowania
When importer przetwarza dokument
Then dokument nie jest importowany do finansow, a brakujace mapowania trafiaja na liste do recznego przypisania
And po zapisaniu mapowania kolejne faktury z tym klientem/pozycja importuja sie automatycznie
AC-4: Obsluga mapowan w zakladce finansow
Given uzytkownik jest na /finances/main_view/
When otwiera panel importu Fakturownia
Then widzi brakujace mapowania klientow i produktow/uslug
And moze przypisac klienta CRM i kategorie finansowa
And zapis mapowania jest chroniony tokenem CSRF
</acceptance_criteria>
Task 1: Zbudowac warstwe integracji Fakturownia + trwawe mapowania autoload/Domain/Finances/FakturowniaApiClient.php, autoload/Domain/Finances/FakturowniaImportRepository.php, autoload/Domain/Finances/FinanceRepository.php, .env.example 1. Dodac loader `.env` (bez nowych bibliotek) i zdefiniowac klucze: - `FAKTUROWNIA_API_DOMAIN` - `FAKTUROWNIA_API_TOKEN` - `FAKTUROWNIA_START_DATE` - `FAKTUROWNIA_PAGE_LIMIT` (opcjonalnie) 2. Dodac klienta API Fakturowni z obsluga paginacji i timeoutow: - pobieranie faktur przychodowych (np. endpoint invoices) - pobieranie faktur kosztowych (np. endpoint costs/expenses) 3. Dodac repozytorium importu z tabelami tworzonymi przez `CREATE TABLE IF NOT EXISTS`: - tabela mapowania klientow Fakturownia -> crm_client.id - tabela mapowania pozycji (nazwa produktu/uslugi) -> finance_categories.id - tabela stanu importu i idempotencji (external_id + typ dokumentu) - tabela kolejki brakujacych mapowan do panelu finansow 4. Wszystkie zapytania SQL wykonywac przez medoo/query z parametrami bindowanymi (bez sklejania SQL z danymi wejsciowymi). 5. W `FinanceRepository` dodac metody pomocnicze do pobierania kategorii i klientow dla panelu mapowan.Unikac: trzymania tokenu API w `config.php`, mapowan w sesji i importu bez kontroli duplikatow.
- Odczyt `.env.example` potwierdza nowe klucze integracji.
- Odczyt nowych klas potwierdza osobne odpowiedzialnosci (API, repo mapowan, state importu).
- Test manualny: dwukrotne wywolanie zapisu importu dla tego samego external_id nie tworzy duplikatu.
AC-1 i AC-2 i AC-3 satisfied: konfiguracja, idempotencja i struktury mapowan gotowe
Task 2: Dodac importer dokumentow i podpiac go pod cron
autoload/Domain/Finances/FakturowniaInvoiceImporter.php,
autoload/class.Cron.php,
cron.php
1. Dodac serwis importera, ktory:
- pobiera dokumenty od `FAKTUROWNIA_START_DATE`,
- scala dane klienta i pozycji,
- sprawdza mapowania klienta i pozycji,
- przy komplecie mapowan zapisuje operacje finansowe,
- przy brakach wpisuje rekordy do kolejki brakow mapowan i pomija import dokumentu.
2. Dodac polityke znaku kwoty:
- przychodowe -> dodatnie `amount`
- kosztowe -> ujemne `amount`
3. Wprowadzic idempotencje na poziomie zrodlowego `external_id` + typ dokumentu.
4. Rozszerzyc `Cron` i `cron.php` o krok `import_finances_from_fakturownia()`:
- uruchamiany przy kazdym cyklu crona,
- zwraca statusy `ok|empty|error` analogicznie do obecnych zadan,
- loguje krotki komunikat o liczbie zaimportowanych i pominietych dokumentow.
Unikac: przerywania calego crona przy pojedynczym bledzie faktury.
- Suchy przebieg importera zwraca licznik imported/skipped/unmapped.
- Uruchomienie `php cron.php` wykonuje nowy krok i nie psuje istniejacych zadan cron.
- Powtorne uruchomienie dla tych samych danych nie dubluje wpisow w `finance_operations`.
AC-1 i AC-2 i AC-3 satisfied: cron importuje faktury cyklicznie i bez duplikatow
Task 3: Dodac panel mapowan Fakturowni w finansach i zapis mapowan
autoload/Controllers/FinancesController.php,
templates/finances/main-view.php,
templates/finances/fakturownia-import-panel.php
1. Rozszerzyc `FinancesController` o akcje:
- pobranie brakujacych mapowan do widoku finansow,
- zapis mapowania klienta,
- zapis mapowania produktu/uslugi do kategorii,
- wszystkie zapisy z walidacja i `S::csrf_verify()`.
2. W `templates/finances/main-view.php` dolaczyc panel importu (partial) pokazujacy:
- liste nieprzypisanych klientow z Fakturowni + select klienta CRM,
- liste nieprzypisanych pozycji + select kategorii finansowej,
- status ostatniego importu (czas, liczba imported/skipped/unmapped).
3. W panelu uzyc escapingu danych wyjsciowych (np. `htmlspecialchars`) i komunikatow zgodnych z UI crmPRO.
Unikac: logiki biznesowej bezposrednio w widoku.
- Wejscie na `/finances/main_view/` pokazuje panel mapowan bez regresji istniejacych statystyk.
- Zapis mapowania bez tokenu CSRF jest odrzucany.
- Po zapisaniu mapowania i ponownym imporcie dokument znika z listy brakow i tworzy operacje automatycznie.
AC-3 i AC-4 satisfied: mapowania sa obslugiwane z UI i kolejne faktury wpadaja automatycznie
DO NOT CHANGE
- modules niezwiązane z finansami (tasks, projects, wiki)
- mechanizm logowania i sesji poza niezbednym CSRF check
- istniejace endpointy email importera zadan
SCOPE LIMITS
- Ten plan obejmuje tylko import i mapowania Fakturownia -> Finanse
- Bez refaktoryzacji calego modulu finansow
- Bez zmian w zewnetrznym harmonogramie systemowym (zakladamy, ze cron systemowy juz wywoluje
cron.php) - Bez automatycznego tworzenia nowych klientow CRM (tylko mapowanie do istniejacych)
<success_criteria>
- Faktury przychodowe i kosztowe importuja sie automatycznie po uzupelnieniu mapowan
- Pierwszy import nie robi blednych przypisan: nieznane rekordy trafiaja do kolejki mapowania
- Kolejne dokumenty z tym samym klientem i pozycja sa przypisywane bez interwencji recznej
- Import uruchamia sie cyklicznie przez cron i jest bezpieczny na ponowne wykonanie </success_criteria>