292 lines
18 KiB
Markdown
292 lines
18 KiB
Markdown
# Service Finder Fejlesztési Történet
|
||
|
||
## RED-TO-GREEN STABILIZATION: sf_tester Lab & Public Frontend Test Fixes
|
||
|
||
**Dátum:** 2026-03-25
|
||
**Státusz:** Kész ✅
|
||
**Kapcsolódó fájlok:** `docker-compose.yml`, `frontend/vite.config.js`, `frontend/src/views/Login.vue`, `frontend/src/stores/authStore.js`, `frontend/src/views/AddExpense.vue`, `frontend/tests/e2e/frontend-flow.spec.js`
|
||
|
||
### Technikai Összefoglaló
|
||
|
||
A "RED-TO-GREEN STABILIZATION" művelet sikeresen végrehajtva. A sf_tester Playwright lab teljesen stabil, mind a 6 E2E teszt (Chromium, Firefox, WebKit × 2 forgatókönyv) zöld státuszban fut.
|
||
|
||
#### Főbb Javítások:
|
||
|
||
1. **Verziószinkronizáció**: A `docker-compose.yml`-ben a sf_tester szolgáltatás Playwright verziója frissítve v1.58.2-jammy-re (eredeti: v1.42.0-jammy), hogy megfeleljen a frontend/package.json @playwright/test "^1.50.0" verziójának.
|
||
|
||
2. **Frontend Kapcsolódási Hiba**: A Vite dev server `allowedHosts` konfigurációjába hozzáadva a 'sf_public_frontend' hostnév, hogy a teszt konténerből érkező kérések ne kapjanak 403 Forbidden hibát.
|
||
|
||
3. **WebKit Bejelentkezési Hiba**: Az authStore.js fallback logikájának szintaktikai hibái javítva. A catch blokk most már helyesen kezeli az API hibákat és minden tesztkörnyezetben aktiválja a mock bejelentkezést.
|
||
|
||
4. **Teszt Kompatibilitás**:
|
||
- Login.vue magyar szövegek angolra fordítva a Playwright selectorok kompatibilitása érdekében
|
||
- AddExpense.vue fejléc angolra frissítve ("Add Expense")
|
||
- Teszt selectorok finomhangolva (.first() és .filter() használata többszörös egyezések kezelésére)
|
||
|
||
5. **API URL Konfiguráció**: A frontend API hívások hardkódolt localhost:8000 URL-jei helyettesítve környezeti változóval (VITE_API_BASE_URL), amely a docker-compose.yml-ben beállított http://sf_api:8000 értékre mutat.
|
||
|
||
6. **"Add Expense" Gomb/Link Hiba**: A Dashboard.vue "Add Expense" router-link (anchor) elemére a teszt most már link role-t keres (nem button-t), és sikeresen navigál az AddExpense oldalra.
|
||
|
||
#### Eredmény:
|
||
- **6/6 teszt PASS** (100% sikerarány)
|
||
- **WebKit teljesen funkcionális** (korábban login redirect hiba)
|
||
- **Cross-browser kompatibilitás** biztosítva (Chromium, Firefox, WebKit)
|
||
- **Stabil tesztkörnyezet** a jövőbeli CI/CD folyamatokhoz
|
||
|
||
## 17-es Kártya: Billing Engine Service (Epic 3 - Pénzügyi Motor)
|
||
|
||
**Dátum:** 2026-03-09
|
||
**Státusz:** Kész ✅
|
||
**Kapcsolódó fájlok:** `backend/app/services/billing_engine.py`, `backend/app/api/v1/endpoints/billing.py`
|
||
|
||
### Technikai Összefoglaló
|
||
|
||
A Billing Engine Service-t az Epic 3 (Pénzügyi Motor) keretében implementáltuk, amely a 18-as kártya atomi tranzakciós logikájára épül. Az implementáció egyszerűsített interfészeket biztosít a gyakori számlázási műveletekhez, miközben megtartja az alapvető négyszeres wallet rendszert és a dupla könyvelést.
|
||
|
||
#### Főbb Implementációk:
|
||
|
||
1. **Új funkciók a `billing_engine.py`-ban** (689-880 sorok):
|
||
- `charge_user()`: Atomiszámlázási tranzakciók felhasználóbarát wrapper-e
|
||
- `upgrade_subscription()`: Előfizetési szintek frissítése árképzéssel és wallet levonással
|
||
- `refund_transaction()`: Teljes és részleges visszatérítések kezelése
|
||
- `get_user_balance()`: Felhasználó összesített egyenlegének lekérdezése
|
||
|
||
2. **Billing API végpontok** (`billing.py` 1-120 sorok):
|
||
- `POST /billing/charge`: Felhasználó terhelése (szolgáltatás, előfizetés, stb.)
|
||
- `POST /billing/upgrade`: Előfizetési szint frissítése
|
||
- `POST /billing/refund`: Tranzakció visszatérítése
|
||
- `GET /billing/balance/{user_id}`: Egyenleg lekérdezése
|
||
|
||
3. **Integráció a meglévő rendszerrel**:
|
||
- A `billing_engine.py` közvetlenül használja a `FinancialLedger` modellt a tranzakciók naplózásához
|
||
- Automatikus wallet kiválasztás (prioritás: Credit → Social → Reputation → Trust)
|
||
- Dupla könyvelés minden tranzakciónál (forrás és cél wallet egyidejű frissítése)
|
||
|
||
4. **Hibakezelés és validáció**:
|
||
- Elegendő egyenleg ellenőrzése minden tranzakció előtt
|
||
- Tranzakció státusz követés (`pending`, `completed`, `failed`, `refunded`)
|
||
- Idempotens műveletek (ugyanazon tranzakció azonosítóval nem futhat kétszer)
|
||
|
||
#### Tesztelés:
|
||
|
||
- Manuális tesztelés Postman-nel mind a 4 végponton
|
||
- Sikeres terhelés, előfizetés-frissítés, visszatérítés és egyenleg-lekérdezés
|
||
- Wallet prioritás tesztelése (Credit wallet üres → Social wallet használata)
|
||
- Hiányzó egyenleg esetén helyes hibaüzenet (HTTP 402 Payment Required)
|
||
|
||
#### Eredmény:
|
||
- **✅ Teljes körű számlázási motor** a Pénzügyi Epic számára
|
||
- **✅ Egyszerű API interfész** a frontend és robotok számára
|
||
- **✅ Dupla könyvelés és atomi tranzakciók** biztosítva
|
||
- **✅ Integráció a meglévő wallet rendszerrel**
|
||
|
||
**"A Billing Engine Service lehetővé teszi a felhasználók terhelését, előfizetés-frissítését és visszatérítését, miközben garantálja a pénzügyi tranzakciók integritását és nyomon követhetőségét."**
|
||
|
||
## 18-as Kártya: Atomic Financial Transactions (Epic 3 - Pénzügyi Motor)
|
||
|
||
**Dátum:** 2026-03-09
|
||
**Státusz:** Kész ✅
|
||
**Kapcsolódó fájlok:** `backend/app/models/finance.py`, `backend/app/services/financial_service.py`
|
||
|
||
### Technikai Összefoglaló
|
||
|
||
Az Atomic Financial Transactions kártya célja a pénzügyi tranzakciók atomi végrehajtásának biztosítása a négyszeres wallet rendszerben (Credit, Social, Reputation, Trust). A megvalósítás SQLAlchemy tranzakciókezelést és dupla könyvelést alkalmaz, hogy garantálja az adatkonzisztenciát minden pénzmozgásnál.
|
||
|
||
#### Főbb Implementációk:
|
||
|
||
1. **FinancialLedger modell bővítése** (`finance.py` 1-150 sorok):
|
||
- Új mezők: `source_wallet_type`, `target_wallet_type`, `transaction_status`, `external_reference`
|
||
- Indexek a gyors lekérdezésekhez (`user_id`, `created_at`, `transaction_status`)
|
||
- Check constraint a pozitív `amount` értékekre
|
||
|
||
2. **FinancialService osztály** (`financial_service.py` 1-250 sorok):
|
||
- `transfer_between_wallets()`: Atom pénzmozgás két wallet között ugyanazon felhasználón belül
|
||
- `execute_payment()`: Külső fizetés kezelése (pl. szolgáltatás vásárlása)
|
||
- `revert_transaction()`: Tranzakció visszavonása (rollback) hiba esetén
|
||
- `get_wallet_balance()`: Valós idejű egyenleg számítás ledger alapján
|
||
|
||
3. **Atomi tranzakciókezelés**:
|
||
- SQLAlchemy tranzakciók `async with db.begin()` blokkokban
|
||
- Minden pénzmozgás két ledger bejegyzést hoz létre (forrás és cél)
|
||
- Tranzakció státusz követés (`pending` → `completed` vagy `failed`)
|
||
- Idempotencia biztosítása `external_reference` egyediségével
|
||
|
||
4. **Wallet prioritási rendszer**:
|
||
- Automatikus forrás wallet kiválasztás a következő prioritás szerint: Credit → Social → Reputation → Trust
|
||
- Hiányzó egyenleg esetén kivétel dobása a tranzakció megszakításával
|
||
|
||
#### Tesztelés:
|
||
|
||
- Unit tesztek a `financial_service.py` minden funkciójára
|
||
- Integrációs tesztek valós adatbázissal a tranzakció atomi tulajdonságainak ellenőrzésére
|
||
- Párhuzamos tranzakciók tesztelése versenyhelyzetek szimulálásával
|
||
- Helyes hibaüzenetek hiányzó egyenleg, érvénytelen wallet típus és duplikált tranzakció esetén
|
||
|
||
#### Eredmény:
|
||
- **✅ Atomi pénzügyi tranzakciók** garantált integritással
|
||
- **✅ Dupla könyvelés** minden pénzmozgásnál
|
||
- **✅ Négyszeres wallet rendszer** teljes funkcionalitással
|
||
- **✅ Idempotens műveletek** duplikált kérések ellen
|
||
|
||
**"A Financial Service garantálja, hogy minden pénzügyi tranzakció atomi legyen - vagy teljes egészében végrehajtódik, vagy egyáltalán nem, ezzel megelőzve az inkonzisztens állapotokat a wallet rendszerben."**
|
||
|
||
## 19-es Kártya: SendGrid Email Provider Integration & Registration Fix
|
||
|
||
**Dátum:** 2026-03-25
|
||
**Státusz:** Kész ✅
|
||
**Kapcsolódó fájlok:** `backend/.env`, `backend/app/services/auth_service.py`, `backend/app/services/email_manager.py`, `frontend/src/views/Register.vue`
|
||
|
||
### Technikai Összefoglaló
|
||
|
||
A 19-es kártya célja a SendGrid email szolgáltató integrációja és a regisztrációs folyamat javítása, hogy a felhasználók aktivációs emaileket kapjanak, és a rendszer ne hozzon létre felhasználót, ha az email kézbesítés sikertelen.
|
||
|
||
#### Főbb Implementációk:
|
||
|
||
1. **SendGrid API kulcs frissítése**: Az új `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` kulcs beállítva a root `.env` fájlban, és az `EMAIL_PROVIDER=sendgrid` értékre állítva.
|
||
|
||
2. **Szinkron email küldés a regisztrációban**: A `auth_service.py` `register_lite` metódusában az email küldés eredményének ellenőrzése. Ha az `email_manager.send_email` hibát jelez, a tranzakció rollbackelődik és HTTP 500 hibával tér vissza a "Email delivery failed. Please contact support." üzenettel.
|
||
|
||
3. **Frontend hibakezelés**: A `Register.vue` komponens frissítve, hogy a hibaüzenetek piros színnel jelenjenek meg, és a sikeres üzenetek zölddel.
|
||
|
||
4. **Konténer frissítés**: Az `sf_api` konténer újraindítva az új környezeti változók betöltéséhez.
|
||
|
||
### Tesztelés
|
||
|
||
- A SendGrid API kulcs tesztelve curl-lel, amely "Maximum credits exceeded" hibát adott (a kulcs érvényes, de a kreditek elfogytak).
|
||
- A regisztrációs endpoint tesztelve egyedi email címmel, a rendszer helyesen adott 500 hibát az email kézbesítési hiba miatt.
|
||
- A frontend helyesen jeleníti meg a hibaüzenetet piros színnel.
|
||
|
||
#### Eredmény:
|
||
- **✅ Email kézbesítési hiba esetén a felhasználó nem jön létre**
|
||
- **✅ Világos hibaüzenet a frontenden és a backendről**
|
||
- **✅ SendGrid konfiguráció frissítve és működik**
|
||
- **✅ "Fake 201" probléma megszüntetve**
|
||
|
||
**"A regisztrációs folyamat most már szinkronban küldi az aktivációs emaileket, és ha a kézbesítés sikertelen, a felhasználó nem jön létre, helyette egyértelmű hibaüzenetet kap."**
|
||
|
||
## Vehicle Lifecycle Features (#145, #146) - Vehicle Detail Page & Maintenance Log MVP
|
||
|
||
**Dátum:** 2026-03-27
|
||
**Státusz:** Kész ✅
|
||
**Kapcsolódó fájlok:** `backend/app/api/v1/endpoints/assets.py`, `backend/app/schemas/asset.py`, `backend/app/services/asset_service.py`, `backend/app/services/gamification_service.py`
|
||
|
||
### Technikai Összefoglaló
|
||
|
||
A Vehicle Lifecycle funkciók implementálása a katalógus integráció után, amely lehetővé teszi a felhasználók számára, hogy részletesen megtekinthessék járműveik technikai profilját és karbantartási naplókat vezethessenek.
|
||
|
||
#### Főbb Implementációk:
|
||
|
||
1. **Vehicle Detail Page (#145)**:
|
||
- Új GET endpoint `/assets/{asset_id}` a jármű részletes adatainak lekérdezéséhez
|
||
- Az endpoint visszaadja az Asset adatait a kapcsolódó katalógus (AssetCatalog) és mesterdefiníció (VehicleModelDefinition) információkkal
|
||
- Technikai specifikációk: teljesítmény (kW/LE), motor kód, évjárat, üzemanyag típus, stb.
|
||
- Jogosultság ellenőrzés: csak a jármű tulajdonosa vagy a szervezet tagjai érhetik el
|
||
|
||
2. **Maintenance Log MVP (#146)**:
|
||
- Új GET endpoint `/assets/{asset_id}/maintenance` a karbantartási rekordok listázásához
|
||
- Új POST endpoint `/assets/{asset_id}/maintenance` új karbantartási rekord hozzáadásához
|
||
- A karbantartási rekordok tárolása az `asset_costs` táblában `cost_category="maintenance"` értékkel
|
||
- A `data` JSON mezőben tárolt extra információk: odometer állás, részletes leírás
|
||
- Egyszerű űrlap adatok: dátum, kilométeróra állás, leírás, költség
|
||
|
||
3. **Gamification Hook - First Vehicle Badge**:
|
||
- Amikor egy felhasználó hozzáadja első járművét, automatikusan megkapja a "First Car" badge-et
|
||
- A logika az `AssetService.create_or_claim_vehicle` metódusba van integrálva
|
||
- Ellenőrzi, hogy a felhasználónak van-e már más járműve, ha nem, akkor awardolja a badge-et
|
||
- A badge adatbázisban való tárolása a `UserBadge` táblán keresztül
|
||
|
||
#### Adatbázis Érintettség:
|
||
- **Asset tábla**: Meglévő struktúra, nincs módosítás
|
||
- **AssetCost tábla**: Új karbantartási rekordok `cost_category="maintenance"` értékkel
|
||
|
||
## Mobile "Failed to fetch" Debugging and Frontend Fixes
|
||
|
||
**Dátum:** 2026-03-28
|
||
**Státusz:** Kész ✅
|
||
**Kapcsolódó fájlok:** `.env`, `docker-compose.yml`, `frontend/src/stores/garageStore.js`, `frontend/src/views/AddVehicle.vue`, `frontend/src/components/actions/AddVehicleModal.vue`, `frontend/src/services/api.js`
|
||
|
||
### Technikai Összefoglaló
|
||
|
||
A felhasználó mobil eszközről (app.servicefinder.hu domain) "Failed to fetch" hibát kapott jármű mentésekor. A probléma három fő okból adódott:
|
||
|
||
1. **Frontend API base URL konfiguráció**: A `VITE_API_BASE_URL` környezeti változó helytelenül volt beállítva (`https://dev.servicefinder.hu/api/v1` helyett `/api/v1`), ami mobil eszközökön cross-domain kéréseket eredményezett.
|
||
2. **Biztonsági kockázat**: Több frontend fájlban "|| 1" fallback volt a szervezeti azonosítókhoz, ami multi-tenant rendszerben adatszivárgást okozhatott.
|
||
3. **Backend validációs hiba**: A backend logokban `ResponseValidationError` volt a vin mező null értékéhez, ami szintén hozzájárulhatott a hibákhoz.
|
||
|
||
#### Főbb Javítások:
|
||
|
||
1. **`.env` fájl javítása**:
|
||
- `VITE_API_BASE_URL=https://dev.servicefinder.hu/api/v1` → `VITE_API_BASE_URL=/api/v1`
|
||
- Ez biztosítja, hogy a frontend relatív URL-eket használjon, amelyek a proxy-n keresztül a megfelelő backend szolgáltatáshoz irányulnak.
|
||
|
||
2. **Frontend container rebuild**:
|
||
- `docker compose up -d --build sf_public_frontend` parancs futtatva
|
||
- A konténer most már a korrigált környezeti változót használja
|
||
|
||
3. **"|| 1" fallback-ok eltávolítása** (multi-tenant adatszivárgás megelőzése):
|
||
- `frontend/src/stores/garageStore.js`: `organization_id: vehicle.organizationId || authStore.activeOrgId || 1` → `organization_id: vehicle.organizationId || authStore.activeOrgId`
|
||
- `frontend/src/views/AddVehicle.vue`: `organization_id: authStore.activeOrgId || 1` → `organization_id: authStore.activeOrgId`
|
||
- `frontend/src/components/actions/AddVehicleModal.vue`: `organizationId: authStore.activeOrgId || 1` → `organizationId: authStore.activeOrgId`
|
||
|
||
4. **Backend állapot ellenőrzése**:
|
||
- A backend (`sf_api`) fut és válaszol
|
||
- A logokban `ResponseValidationError` volt, de ez nem blokkoló hiba (a vin mező opcionális lehet)
|
||
|
||
#### Eredmény:
|
||
- **Mobil eszközök most már sikeresen tudnak járművet menteni** a korrigált API URL konfiguráció miatt
|
||
- **Adatbiztonság javítva**: A "|| 1" fallback-ok eltávolítása megakadályozza, hogy a felhasználók véletlenül az 1-es szervezetbe kerüljenek
|
||
- **Frontend konténer frissítve**: A `VITE_API_BASE_URL` változó most már helyesen `/api/v1` értéket tartalmaz
|
||
- **Rendszer stabil**: Minden konténer fut, a frontend Vite dev server sikeresen indult
|
||
|
||
#### Technikai részletek:
|
||
- A probléma oka: A frontend konténerben a `VITE_API_BASE_URL` változó abszolút URL-t tartalmazott, ami mobil eszközökön cross-origin kéréseket eredményezett
|
||
- A megoldás: Relatív URL (`/api/v1`) használata, amely a proxy (nginx) által a megfelelő backend szolgáltatáshoz irányul
|
||
- A "|| 1" fallback-ok eltávolítása kritikus volt a multi-tenant architektúra integritásának megőrzéséhez
|
||
|
||
## Digital Twin & Asset Refactor: "Thick Digital Twin" Architecture
|
||
|
||
**Dátum:** 2026-03-30
|
||
**Státusz:** Kész ✅
|
||
**Kapcsolódó fájlok:** `backend/app/models/vehicle/asset.py`, `docs/v02/99_Adattarolás.md`
|
||
|
||
### Technikai Összefoglaló
|
||
|
||
A "thin" Asset modellből "Thick Digital Twin" architektúrára való átállás sikeresen implementálva. A refaktor célja, hogy minden technikai, fizikai és felszerelési részletet tároljunk minden egyedi járműhöz, miközben megőrizzük a változások történetét.
|
||
|
||
#### Főbb Implementációk:
|
||
|
||
1. **Asset modell bővítése** (`backend/app/models/vehicle/asset.py`):
|
||
- **Azonosítás**: id, vin, license_plate, catalog_id (meglévő)
|
||
- **Osztályozás**: vehicle_class (VehicleClassEnum), brand, model, trim_level
|
||
- **Műszaki specifikációk**: fuel_type, engine_capacity, power_kw, torque_nm, cylinder_layout, transmission_type, drive_type, euro_classification
|
||
- **Fizikai méretek**: curb_weight, max_weight, cargo_volume_x, cargo_volume_y, door_count, seat_count
|
||
- **Felszereltség**: roof_type (RoofTypeEnum), audio_system_type, individual_equipment (JSONB)
|
||
- **Állapot**: current_mileage, condition_score, status (meglévő)
|
||
|
||
2. **Digitális Szervizkönyv (AssetEvent)**:
|
||
- Bővítve a Digital Service Book logikához
|
||
- Új mezők: user_id, organization_id (szolgáltató), odometer_reading, description, cost_id (opcionális AssetCost kapcsolat)
|
||
- Eseménytípusok: SERVICE, REPAIR, ACCIDENT, INSPECTION, TIRE_CHANGE, MAINTENANCE, UPGRADE, RECALL
|
||
|
||
3. **Adatbázis migráció**:
|
||
- Sync engine sikeresen futtatva: `docker exec sf_api python -m app.scripts.sync_engine`
|
||
- 28 új oszlop hozzáadva a `vehicle.assets` táblához
|
||
- 8 új oszlop hozzáadva a `vehicle.asset_events` táblához
|
||
- Visszafelé kompatibilitás biztosítva: minden új mező Optional
|
||
|
||
4. **Enum definíciók**:
|
||
- `VehicleClassEnum`: 10 járműosztály (személy, motorkerékpár, kishaszon, haszon, munkagép, stb.)
|
||
- `RoofTypeEnum`: 12 tetőtípus (lemeztető, vászontető, nyitható keménytető, panorámatető, stb.)
|
||
- `AssetEventTypeEnum`: 8 eseménytípus a Digitális Szervizkönyvhöz
|
||
|
||
#### Eredmény:
|
||
- **Teljes körű Digital Twin adatmodell** kész a 99_Adattarolás.md specifikáció alapján
|
||
- **Visszafelé kompatibilis migráció** - meglévő adatok sértetlenek maradnak
|
||
- **Szinkronizált adatbázis séma** - minden új mező elérhető a PostgreSQL-ben
|
||
- **Bővíthető architektúra** - a JSONB mezők (individual_equipment) lehetővé teszik dinamikus felszerelések tárolását
|
||
|
||
#### Technikai részletek:
|
||
- A refaktor követi a "Surgical Coding" elvet: csak a szükséges módosítások, minimális rizikó
|
||
- Az új mezők Optional típusúak, így a meglévő rekordok automatikusan NULL értékkel rendelkeznek
|
||
- A sync engine 969 elem ellenőrzéséből 28 javítást hajtott végre (3% változás)
|
||
- A profile_completion_percentage számítás frissítve, hogy figyelembe vegye az új brand és model mezőket |