Files
service-finder/.roo/history.md
2026-06-23 21:11:21 +00:00

12 KiB
Raw Blame History

Service Finder Fejlesztési Történet

2026-06-21 - P0 Deep Audit: Database Consistency & Zombie API Hunt

🎯 Cél

Teljes körű adatbázis konzisztencia ellenőrzés és zombie API végpontok felderítése a vehicle, finance, fleet_finance sémákban, mielőtt a frontend fejlesztés elkezdődik.

🔧 Eredmények

1. ADATBÁZIS TISZTASÁG: PASS

  • API modul import: Sikeres (2 route: GET, POST)
  • Sync Engine: 1210 OK, 0 Fixed, 0 Extra
  • E2E test: ⚠️ Pre-existing conftest hiba (verification token timeout - nem kapcsolódó)

2026-06-23 - Cost Entry Wizard (CostEntryWizard.vue) - 4-lépéses Számla Űrlap

🎯 Cél

4-lépéses stepper wizard építése részletes számla/invoice költségek rögzítésére a CostsActionsCard-ból indíthatóan.

🔧 Módosított fájlok

  • frontend/src/components/cost/CostEntryWizard.vue (ÚJ) - 4-step stepper wizard komponens
  • frontend/src/components/dashboard/CostsActionsCard.vue - "🧾 Részletes Számla" gomb hozzáadva, CostEntryWizard import és modal state
  • frontend/src/i18n/en.ts - costWizard i18n szekció hozzáadva
  • frontend/src/i18n/hu.ts - costWizard i18n szekció hozzáadva

🧩 CostEntryWizard lépések

  1. Alapadatok: Jármű (read-only), kategória cascade (fő+alkategória), dátum
  2. Pénzügyek: Nettó összeg, ÁFA kulcs (0/5/10/20/27%), Bruttó összeg (GROSS-FIRST), Pénznem
  3. Admin & Szállító: Dinamikus vendor autocomplete (GET /organizations?org_type=SERVICE_PROVIDER) szabad szöveges fallbackkel, számlaszám, számla dátuma, fizetési határidő
  4. Fájlok: Drag & drop fájl feltöltő UI (csak UI szintű file picker)

🔌 API Integráció

  • POST /expenses/ a costStore.addExpense()-on keresztül AssetCostBase payload-dal
  • Payload tartalmazza: amount_gross (GROSS-FIRST), category_id, currency, date, data JSONB (net_amount, vat_rate, invoice_number, invoice_date, payment_deadline, vendor_id, vendor_name, file_names)

Verifikáció

  • Vite build: Sikeres (253 modules, 6.94s)
  • Gitea kártya: #277

2026-06-23 - Dashboard Cost Card Navigation Fix & Dedicated Costs Page

🎯 Cél

A dashboard költség kártya üres területére kattintva és a "További költségek" gombbal is a költségek oldalra navigálás. Dedikált CostsView oldal létrehozása vissza gombbal és garázs háttérrel.

🔧 Módosított fájlok

  • frontend/src/views/costs/CostsView.vue (ÚJ) - Teljes költség oldal garázs háttérrel, vissza gombbal, költség táblázattal és paginációval
  • frontend/src/router/index.ts - /dashboard/costs route hozzáadva a CostsView-hoz
  • frontend/src/components/dashboard/CostsActionsCard.vue - Header bar kattinthatóvá téve + "További költségek" gomb átirányítva a /dashboard/costs oldalra
  • frontend/src/layouts/PrivateLayout.vue - Hamburger menü "Költségek" navigáció /dashboard/costs-ra módosítva
  • frontend/src/i18n/hu.ts - costs.backToDashboard kulcs hozzáadva
  • frontend/src/i18n/en.ts - costs.backToDashboard kulcs hozzáadva

Verifikáció

  • Vite build: Sikeres (CostsView-DaFsqPnD.js chunk generálva)

2026-06-23 - Hotfix: Backend Expenses GET / endpoint & AssetCost.organization FK fix

🎯 Cél

Két kritikus backend hiba javítása:

  1. A GET /api/v1/expenses/ hívás 404-et adott (nem létezett GET / végpont), amit a reverse proxy 307-es HTTPS→HTTP átirányítással válaszolt, ami Mixed Content blokkolást okozott a böngészőben.
  2. A backend indításkor InvalidRequestError-ral összeomlott az AssetCost.organization relationship hibás konfigurációja miatt (két FK ugyanarra a táblára, de a foreign_keys paraméter hiányzott).

🔧 Módosított fájlok

  • backend/app/api/v1/endpoints/expenses.py - GET / végpont hozzáadva: list_all_expenses() - szervezet összes költségének listázása paginációval, Asset, CostCategory, Organization JOIN-okkal
  • backend/app/models/fleet_finance/models.py - AssetCost.organization relationship javítva: foreign_keys=[organization_id] paraméter hozzáadva a kétértelmű FK kapcsolat feloldásához

🔧 Eredmények

  • Backend konténer: Tisztán indul, nincs SQLAlchemy hiba
  • Login: Működik (nem omlik össze)
  • GET /api/v1/expenses/: Végpont elérhető, paginált költség listát ad vissza

2026-06-23 - Hotfix #2: Expenses API 307 redirect / Mixed Content - trailing slash fix

🎯 Cél

A GET /api/v1/expenses hívás 307-es HTTPS→HTTP átirányítást kapott, mert a backend route @router.get("/") (perjellel) volt definiálva, de a frontend /expenses (perjel nélkül) hívta. A Starlette automatikus 307 redirect-je a külső openresty proxy miatt http:// címmé alakult → Mixed Content blokk.

🔧 Módosított fájlok

  • backend/app/api/v1/endpoints/expenses.py - @router.get("/")@router.get("") (perjel eltávolítva a route-ból)

🔧 Eredmények

  • Backend konténer: Tisztán indul
  • GET /api/v1/expenses most direkt egyezik a route-tal → nincs 307 redirect → nincs Mixed Content

2026-06-23 - Hotfix #3: Expenses API 500 Internal Server Error - AssetCost.cost_date → AssetCost.date

🎯 Cél

A GET /api/v1/expenses végpont 500-as hibát dobott: AttributeError: type object 'AssetCost' has no attribute 'cost_date'. Az AssetCost modellben a mező neve date (110. sor), de a kód cost_date-t használt.

🔧 Módosított fájlok

  • backend/app/api/v1/endpoints/expenses.py - 2 helyen javítva:
      1. sor: AssetCost.cost_dateAssetCost.date
      1. sor: cost.cost_date.isoformat()cost.date.isoformat()

🔧 Eredmények

  • Backend konténer: Tisztán indul
  • GET /api/v1/expenses: Várhatóan 200 OK (nem 500)

2026-06-23: Dashboard üres AdPlacementWidget elrejtése

🎯 Cél

A felhasználó kérésére: a dashboardon a "PRO" feliratú SubscriptionStatusWidget mellett egy üres csempe volt látható (AdPlacementWidget), mert nincs hirdetés beállítva a rendszerben. A kérés az volt, hogy rejtsük el ezt az üres csempét.

🔧 Módosított fájlok

  • frontend/src/components/dashboard/AdPlacementWidget.vue - defineEmits hozzáadva: ads-loaded esemény, amely jelzi a szülőnek, hogy van-e hirdetés (hasAds: boolean). Az esemény a fetchAds siker és hiba ágában is meghívásra kerül.
  • frontend/src/views/DashboardView.vue - adWidgetHasAds ref hozzáadva (alapértelmezett: false). A hirdetési csempe wrapper <div>-je v-if="adWidgetHasAds" feltételt kapott, így csak akkor jelenik meg, ha az API ténylegesen adott vissza hirdetéseket. Az @ads-loaded esemény frissíti a ref értékét.

Verifikáció

  • Frontend build: Sikeres (Vite build, 0 hiba)

2026-06-23 - P0 Fix: cost_date vs date mezőnév mismatch + CostsView.vue upgrade

🎯 Cél

Két produkciós hiba javítása a cost rögzítésben:

  1. P0 - 500 Internal Server Error POST /api/v1/expenses/ végponton: négyrétegű mezőnév-eltérés (cost_date vs date) a frontend, Pydantic séma, endpoint és SQLAlchemy model között.
  2. P1 - /dashboard/costs oldal nem mutatott semmilyen információt és nem volt költség hozzáadási lehetőség.

🔧 Módosított fájlok

Fix 1a - Backend endpoint (backend/app/api/v1/endpoints/expenses.py:464):

  • cost_date=expense.cost_datedate=expense.cost_date (SQLAlchemy model mezőneve date)

Fix 1b - Backend Pydantic schema (backend/app/schemas/asset_cost.py:37):

  • validation_alias="date" hozzáadva a cost_date mezőhöz, hogy mind a date, mind a cost_date kulcsot elfogadja

Fix 2 - Frontend CostsView.vue (frontend/src/views/costs/CostsView.vue):

  • Vezérlősáv hozzáadva járműszűrő dropdown-nal
  • " Új Költség" gomb hozzáadva
  • CostEntryWizard integráció (modal formában)
  • Mezőnevek javítva: cost_typecategory_name, amountamount_gross, vehicle_labelvehicle_name
  • useVehicleStore importálva a járművek listájához

Verifikáció

  • Python szintaxis: asset_cost.py OK, expenses.py OK
  • Backend indítás: Uvicorn fut, nincs hiba
  • Frontend build: Sikeres (Vite build 6.77s, 0 hiba)
  • Gitea kártyák: #278 (P0) és #279 (P1) lezárva

2026-06-23 - #280 Vizsgálat: Miért nem jelennek meg költségek?

🎯 Cél

Annak kivizsgálása, hogy az admin@profibot.hu teszt felhasználó miért nem lát költségeket.

🔍 Vizsgálat

  • fleet_finance.asset_costs táblában összesen 1 rekord van (org_id=43, asset=PTB162 Mazda 2, 18118 HUF, "Finanszírozás")
  • admin@profibot.hu (user_id=2) tagja: org 1 (Test Company), 57, 58, 62, 67
  • admin NEM tagja org 43-nak ("Accipe garage"), ahova az egyetlen költség tartozik
  • admin szervezeteiben (1, 57, 58, 62, 67) összesen 0 db költség van

Következtetés

NINCS backend/frontend hiba. A probléma egyszerű adathiány:

  1. Nincs rögzítve költség admin egyetlen járművéhez sem
  2. Az egyetlen DB-ben lévő költség egy másik szervezethez tartozik
  3. A #278 és #279 javítások után most már lehetővé vált a költségrögzítés
  • Dokumentáció: /opt/docker/docs/cost_visibility_investigation_280.md

2026-06-23 - #281 Hotfix: Hiányos #278 javítás - expenses.py:533 new_cost.cost_date → new_cost.date

🎯 Cél

A #278-as javítás hiányos volt: a konstruktor paramétert kijavítottuk (expenses.py:464: cost_date= → date=), de a response dict-ben (expenses.py:533) továbbra is new_cost.cost_date-et használtunk az SQLAlchemy AssetCost modellen, aminek a mezőneve date. Ez AttributeError: 'AssetCost' object has no attribute 'cost_date' hibát okozott minden POST /api/v1/expenses/ híváskor.

🔧 Módosított fájlok

  • backend/app/api/v1/endpoints/expenses.py:533 - new_cost.cost_date.isoformat()new_cost.date.isoformat()

Verifikáció

  • Python szintaxis: OK
  • Backend újraindítás: OK (Application startup complete)
  • POST /api/v1/expenses/ teszt: 201 Created - sikeres költség rögzítés a QWE432 járműre
  • Response tartalmazza: "date":"2026-06-23T13:07:34.785065+00:00" (helyes)
  • Gitea kártya: #281 lezárva

2026-06-23 - P0 Fix: User 28 Data Anomaly Resolution

🎯 Cél

User 28 (tester_pro@profibot.hu) adat-anomália javítása ORM szkript segítségével.

🔧 Végrehajtott műveletek

A) Org 1 javítása: fleet.organizations ID=1 org_type átállítva fleet_ownerindividual

B) Tag hozzáadása: fleet.organization_members rekord létrehozva: org=1, user=28, role=OWNER, status=active. Org 1 owner_id=28 beállítva.

C) Scope törlése: User 28 scope_level visszaállítva individual-ra (NOT NULL constraint miatt), scope_id None-ra.

D) Fantom garázs törlése: Org 68 ("Tester Garázsa") és hozzá tartozó OrganizationMember rekordok törlése.

Verifikáció

  • Org 1: org_type=individual, owner_id=28
  • Org 1 Member: role=OWNER, status=active, is_verified=True
  • User 28: scope_level=individual, scope_id=None
  • Org 68: nem létezik (deleted)
  • Ideiglenes szkript törölve: backend/scripts/fix_user_28.py

2026-06-23 - P0 Cost Pipeline Visibility Audit (#282)

🔍 Felfedezés

A /dashboard/costs oldal üres User 28 számára, annak ellenére, hogy Org 1-ben 5 db asset_cost rekord van (BMW123, QWE432).

🐛 Gyökér Ok

A GET /expenses/ endpoint (backend/app/api/v1/endpoints/expenses.py:130-139) a user első aktív tagságát használja org feloldáshoz (.limit(1) ORDER BY nélkül). User 28-nak 3 tagsága van: org 63 (ADMIN, nincs költség), org 21 (OWNER), org 1 (OWNER, 5 költség). Az első tagság org 63-ra mutat, ami üres.

📄 Dokumentáció

docs/cost_pipeline_audit.md - Teljes pipeline audit a frontendtől a DB-ig.