12 KiB
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 komponensfrontend/src/components/dashboard/CostsActionsCard.vue- "🧾 Részletes Számla" gomb hozzáadva, CostEntryWizard import és modal statefrontend/src/i18n/en.ts- costWizard i18n szekció hozzáadvafrontend/src/i18n/hu.ts- costWizard i18n szekció hozzáadva
🧩 CostEntryWizard lépések
- Alapadatok: Jármű (read-only), kategória cascade (fő+alkategória), dátum
- Pénzügyek: Nettó összeg, ÁFA kulcs (0/5/10/20/27%), Bruttó összeg (GROSS-FIRST), Pénznem
- 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ő
- Fájlok: Drag & drop fájl feltöltő UI (csak UI szintű file picker)
🔌 API Integráció
- POST
/expenses/acostStore.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óvalfrontend/src/router/index.ts-/dashboard/costsroute hozzáadva a CostsView-hozfrontend/src/components/dashboard/CostsActionsCard.vue- Header bar kattinthatóvá téve + "További költségek" gomb átirányítva a/dashboard/costsoldalrafrontend/src/layouts/PrivateLayout.vue- Hamburger menü "Költségek" navigáció/dashboard/costs-ra módosítvafrontend/src/i18n/hu.ts-costs.backToDashboardkulcs hozzáadvafrontend/src/i18n/en.ts-costs.backToDashboardkulcs 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:
- A
GET /api/v1/expenses/hívás 404-et adott (nem létezettGET /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. - A backend indításkor
InvalidRequestError-ral összeomlott azAssetCost.organizationrelationship hibás konfigurációja miatt (két FK ugyanarra a táblára, de aforeign_keysparamé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-okkalbackend/app/models/fleet_finance/models.py-AssetCost.organizationrelationship 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/expensesmost 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:-
- sor:
AssetCost.cost_date→AssetCost.date
- sor:
-
- sor:
cost.cost_date.isoformat()→cost.date.isoformat()
- sor:
-
🔧 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-defineEmitshozzáadva:ads-loadedesemény, amely jelzi a szülőnek, hogy van-e hirdetés (hasAds: boolean). Az esemény afetchAdssiker és hiba ágában is meghívásra kerül.frontend/src/views/DashboardView.vue-adWidgetHasAdsref hozzáadva (alapértelmezett:false). A hirdetési csempe wrapper<div>-jev-if="adWidgetHasAds"feltételt kapott, így csak akkor jelenik meg, ha az API ténylegesen adott vissza hirdetéseket. Az@ads-loadedesemé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:
- P0 - 500 Internal Server Error POST
/api/v1/expenses/végponton: négyrétegű mezőnév-eltérés (cost_datevsdate) a frontend, Pydantic séma, endpoint és SQLAlchemy model között. - P1 -
/dashboard/costsoldal 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_date→date=expense.cost_date(SQLAlchemy model mezőnevedate)
Fix 1b - Backend Pydantic schema (backend/app/schemas/asset_cost.py:37):
validation_alias="date"hozzáadva acost_datemezőhöz, hogy mind adate, mind acost_datekulcsot 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_type→category_name,amount→amount_gross,vehicle_label→vehicle_name useVehicleStoreimportá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_coststá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:
- Nincs rögzítve költség admin egyetlen járművéhez sem
- Az egyetlen DB-ben lévő költség egy másik szervezethez tartozik
- 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_owner → individual
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.