Files
service-finder/.roo/history.md

16 KiB

1 | # Service Finder Fejlesztési Történet 2 | 3 | ## 2026-06-21 - P0 Deep Audit: Database Consistency & Zombie API Hunt 4 | 5 | ### 🎯 Cél 6 | 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. 7 | 8 | ### 🔧 Eredmények 9 | 10 | 1. ADATBÁZIS TISZTASÁG: PASS 11 | - API modul import: Sikeres (2 route: GET, POST) 12 | - Sync Engine: 1210 OK, 0 Fixed, 0 Extra 13 | - E2E test: ⚠️ Pre-existing conftest hiba (verification token timeout - nem kapcsolódó) 14 | 15 | ## 2026-06-23 - Cost Entry Wizard (CostEntryWizard.vue) - 4-lépéses Számla Űrlap 16 | 17 | ### 🎯 Cél 18 | 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. 19 | 20 | ### 🔧 Módosított fájlok 21 | 22 | ## 2026-06-24 - P0 Fix & Enhance: Permissions Page Data Flow, Editing & i18n 23 | 24 | ### 🎯 Cél 25 | Permissions oldal adatáramlás javítása, szerkesztés/mentés funkció bevezetése, és @nuxtjs/i18n telepítése/konfigurálása. 26 | 27 | ### 🔧 Módosított fájlok 28 | - frontend_admin/pages/permissions/index.vue - Teljes átírás: client-side data fetch onMounted-ben, szerkeszthető toggle-ok (modifiedPermissions Map), PATCH mentés, toast notification, $t() hívások 29 | - frontend_admin/nuxt.config.ts - @nuxtjs/i18n modul hozzáadása, locales konfiguráció (hu/en) 30 | - frontend_admin/i18n/locales/hu.json - Magyar fordítási fájl (permissions oldal összes szövege) 31 | - frontend_admin/i18n/locales/en.json - Angol fordítási fájl 32 | 33 | ### Eredmények 34 | - Build: Sikeres (hu-DbjfOUfH.mjs, en-DnJ23n0t.mjs locale chunk-ok) 35 | - i18n modul: @nuxtjs/i18n v10.4.0 telepítve, no_prefix stratégiával 36 | - Szerkesztés: modified/original Map-ek, handleToggle, savePermissions (PATCH /admin/permissions/override/{org_id}) 37 | - Adatmentés: success/error toast notification auto-clear-el 38 | 39 | ## 2026-06-24 - P0 Execution: Wire Packages UI to Real Database 40 | 41 | ### 🎯 Cél 42 | A frontend_admin Packages oldal (packages/index.vue) mock adatok helyett valós API adatbázisból töltse a SubscriptionTier csomagokat. "Új Csomag Létrehozása" gomb és modal hozzáadása. 43 | 44 | ### 🔧 Módosított fájlok 45 | - backend/app/schemas/subscription.py - tier_level és feature_capabilities mezők hozzáadva a SubscriptionTierResponse, SubscriptionTierCreate, SubscriptionTierUpdate modellekhez 46 | - backend/app/api/v1/endpoints/admin_packages.py - create/update végpontok frissítve az új mezők kezelésére 47 | - frontend_admin/pages/packages/index.vue - Teljes átírás: mock adatok eltávolítva, fetchPackages() API hívás, create/edit/delete modal-ok, loading/error/empty állapotok, i18n támogatás 48 | - frontend_admin/locales/hu.json - packages i18n kulcsok (magyar) 49 | - frontend_admin/locales/en.json - packages i18n kulcsok (angol) 50 | 51 | ### Eredmények 52 | - Backend API: GET /api/v1/admin/packages → 200 OK, 10 tier (tier_level, feature_capabilities mezőkkel) 53 | - Frontend: mock adatok eltávolítva, valós API hívás onMounted-ben, loading/error/empty állapotok 54 | - CRUD: Létrehozás (POST), Szerkesztés (PATCH), Törlés (DELETE soft-delete) teljes körűen implementálva 55 | - i18n: Minden UI szöveg magyar és angol nyelven elérhető 56 | 57 | ## 2026-06-24 - P0 CRITICAL FIX: Deep Merge JSONB (Multi-zone Pricing Data Loss) 58 | 59 | ### 🎯 Cél 60 | Javítani a PATCH /api/v1/admin/packages/{tier_id} végpontot, hogy a rules JSONB oszlop frissítésekor a meglévő nested kulcsok (pl. pricing_zones.HU, pricing_zones.US, lifecycle.available_until) ne vesszenek el, ha a frontend csak egy részhalmazt küld (pl. csak pricing_zones.DEFAULT). 61 | 62 | ### 🔧 Módosított fájlok 63 | - backend/app/api/v1/endpoints/admin_packages.pydeep_merge_dict() függvény hozzáadva, update_package endpoint átírva deep merge szemantikára 64 | - tests/active/test_deep_merge_fix.py — Verifikációs teszt (unit + API PATCH) 65 | 66 | ### Eredmények 67 | - Unit test: PASS — deep_merge_dict() helyesen működik: nested dict-ek rekurzív merge, None értékek megőrzése, üres override megőrzése 68 | - API test: PASS — private_pro_v1 (id=14) csomagon: HU, US, DEFAULT zónák mind megmaradtak a PATCH után, DEFAULT ára frissült, lifecycle.available_until megőrződött 69 | - Sync Engine: 1220 OK, 0 Fixed — adatbázis séma konzisztens 70 | - Root cause: A frontend packages/index.vue rulesPayload függvénye csak pricing_zones.DEFAULT-ot állítja elő, a backend pedig wholesale replace-t végzett → multi-zone adatvesztés

2026-06-24 - P0 System Architecture: Global Region Config & Smart Pricing

🎯 Cél

Globális régió konfigurációs rendszer (RegionConfig modell + API) megvalósítása, frontend region store és formatter composable létrehozása, Smart Pricing Calculator beépítése a package edit modalba, valamint nyelvi preferencia perzisztálása a layoutban.

🔧 Módosított fájlok

  • backend/app/models/core_logic.pyRegionConfig osztály hozzáadva (system.region_config séma, mezők: country_code, name, currency, default_vat_rate, locale_code, timezone, is_active)
  • backend/app/models/__init__.pyRegionConfig import hozzáadva
  • backend/app/api/v1/endpoints/regions.pyLÉTREHOZVA: GET /system/regions publikus végpont
  • backend/app/api/v1/api.py — regions router regisztrálva /system prefix-szel
  • backend/scripts/seed_regions.pyLÉTREHOZVA: 3 régió seedelése (HU, GB, DEFAULT)
  • backend/app/api/v1/endpoints/auth.pyPATCH /auth/me/language végpont hozzáadva nyelvi preferencia perzisztáláshoz
  • frontend_admin/stores/region.tsLÉTREHOZVA: Pinia store régiók lekérésére, aktív régió getterekkel (currency, locale, VAT, timezone)
  • frontend_admin/composables/useFormatter.tsLÉTREHOZVA: Lokalizált formatter (number, currency, date, datetime, percent, VAT számítás)
  • frontend_admin/pages/packages/index.vue — Tabbed modal refaktor (Basic Info, Pricing, Features), per-régió árazási grid, Smart Pricing Calculator net/VAT/gross kijelzéssel
  • frontend_admin/layouts/default.vue — Nyelvváltó perzisztálás PATCH hívással, region store inicializálás onMounted-ban

Eredmények

  • Sync Engine: 1220 OK, 1 Fixed, 0 Shadow — system.region_config tábla létrejött
  • GET /api/v1/system/regions: 200 — 3 régió (DEFAULT/EUR/0%, GB/GBP/20%, HU/HUF/27%)
  • PATCH /auth/me/language: 200 — preferred_language perzisztálódik és visszaolvasható
  • Frontend build (admin): Sikeres — region-*.mjs chunk generálódott
  • Adatbázis: country_code VARCHAR(5)→VARCHAR(10) manuális ALTER a seed előtt

2026-06-25 - P0 CRITICAL SECURITY & UI FIX - RBAC Middleware & Mock Data Removal

🎯 Cél

Szigorú frontend Route-Based Access Control (RBAC) bevezetése az admin middleware-ben, és a hardcoded mock email (admin@servicefinder.hu) eltávolítása a Topbar-ból.

🔧 Módosított fájlok

  • frontend_admin/middleware/auth.ts — Teljes átírás: token cookie ellenőrzés után authStore.fetchUser() hívás, majd authStore.user.role ellenőrzés az allowed staff role-ok listája (SUPERADMIN, ADMIN, MODERATOR, SALES_REP, SERVICE_MGR) alapján. Ha a role nem staff szintű → authStore.logout() + navigateTo('/login').
  • frontend_admin/layouts/default.vueuserEmail computed fallback 'admin@servicefinder.hu''Ismeretlen Felhasználó', userInitials fallback 'AD''??', dropdown role label 'Administrator' → dinamikus authStore.userRole alapú.

Eredmények

  • RBAC Middleware: Standard USER role esetén a middleware kilépteti a felhasználót és a /login oldalra irányítja
  • Mock adatok eltávolítva: admin@servicefinder.hu sehol sem szerepel hardcoded értékként
  • Auth Store: Tiszta, nincs benne mock/default user adat
  • Minden admin oldal (index.vue, garages/index.vue, packages/index.vue, permissions/index.vue) használja a definePageMeta({ middleware: 'auth' }) direktívát

2026-06-25 - P0 Data Architecture: Populate Full EU Region Registry

🎯 Cél

A system.region_config tábla feltöltése mind a 27 EU tagállammal, plusz UK, Svájc és DEFAULT/Eurozone fallback rekorddal. Korábban csak 3 dummy/seed régió (HU, GB, DEFAULT) volt az adatbázisban.

🔧 Módosított fájlok

  • backend/scripts/seed_regions.py — Teljes átírás: 30 régiós adatbázis (27 EU + GB + CH + DEFAULT), UPSERT logika (meglévő rekordok frissítése, új rekordok beszúrása), pontos VAT kulcsok, devizanemek, locale kódok és időzónák minden országra.

Eredmények

  • Seed futtatás: 27 új régió létrehozva, 3 meglévő frissítve (HU, GB, DEFAULT)
  • API verifikáció: GET /api/v1/system/regions → 30 régió visszaadva, minden adat helyes
  • UPSERT idempotencia: A script többször is futtatható, frissíti a meglévő rekordokat ahelyett, hogy duplikációt okozna

2026-06-25 - Garages CRM Wiring & Custom B2B Deals UI

🎯 Cél

Garázsok (Organizations) CRM felületének teljes körű implementálása: backend API végpontok, frontend adattábla mock adatok nélkül, előfizetéskezelő modál egyedi lejárati dátumokkal (B2B deal-ekhez).

🔧 Módosított/Létrehozott fájlok

1. backend/app/api/v1/endpoints/admin_organizations.py (LÉTREHOZVA)

  • GET /admin/organizations — Garázsok listázása előfizetési adatokkal, taglétszámmal, kereséssel, szűréssel, lapozással
  • PATCH /admin/organizations/{org_id}/subscription — Előfizetés módosítása tier_id és opcionális expires_at megadásával
  • Tömeges subscription és member_count lekérdezés (N+1 elkerülése)

2. backend/app/api/v1/api.py (MÓDOSÍTVA)

  • admin_organizations router regisztrációja

3. frontend_admin/pages/garages/index.vue (ÁTÍRVA)

  • Mock adatok eltávolítva, valós API hívások ($fetch)
  • Statisztikai kártyák (összes, aktív, premium, enterprise)
  • Keresés és szűrés (tier alapján)
  • Adattábla: ID, cégnév, státusz, csomag, lejárat, műveletek
  • Előfizetéskezelő modál: tier dropdown + egyéni datetime-local input
  • Mentés utáni automatikus refresh

4. frontend_admin/i18n/locales/hu.json (MÓDOSÍTVA)

  • Garázs CRM-hez kapcsolódó összes magyar fordítás hozzáadva

5. frontend_admin/i18n/locales/en.json (MÓDOSÍTVA)

  • Garázs CRM-hez kapcsolódó összes angol fordítás hozzáadva

Teszt Eredmények

  • Sync Engine: 1230 OK, 0 Fixed, 0 Extra (tökéletes szinkron)
  • GET /admin/organizations?limit=5: 200 — 31 garázs, 5 visszaadva
  • GET /admin/packages?limit=5: 200 — 5 tier elérhető
  • PATCH /admin/organizations/2406/subscription: 200 — Celebro Kft. → corp_premium_v1, lejárat: 2027-06-25
  • Verifikáció: Tier és lejárati dátum helyesen perzisztálva

2026-06-25 - P0 FIX & ENHANCE: Auth Token Missing & Duplicate Package Button

🎯 Cél

  1. Garázsok oldal "Not authenticated" hiba javítása — hiányzó Authorization header pótlása
  2. "Másolás" (Duplicate) gomb implementálása a csomagok oldalon

🔧 Módosított fájlok

1. frontend_admin/pages/garages/index.vue (MÓDOSÍTVA)

  • getAuthHeaders() helper hozzáadva — access_token cookie-ból olvassa a tokent
  • fetchGarages() és fetchTiers() hívásokhoz headers: getAuthHeaders() hozzáadva
  • saveSubscription() PATCH híváshoz Authorization header hozzáadva

2. frontend_admin/pages/packages/index.vue (MÓDOSÍTVA)

  • "Másolás" (Duplicate) gomb hozzáadva a kártya akcióihoz (Szerkesztés mellett, zöld színnel)
  • duplicatePackage(pkg) függvény implementálva:
    • Megnyitja a Create Modalt a kiválasztott csomag adataival előtöltve
    • id mező törölve (új rekordként mentődik)
    • Névhez _copy utótag fűzve, display_name-hez (másolat) fűzve
    • is_default_fallback false-ra állítva (nem duplikálható a visszaesési státusz)
    • Árazási zónák, allowance-ok, feature_capabilities teljes körű másolása

3. frontend_admin/i18n/locales/en.json (MÓDOSÍTVA)

  • packages.duplicate: "Duplicate" kulcs hozzáadva

4. frontend_admin/i18n/locales/hu.json (MÓDOSÍTVA)

  • packages.duplicate: "Másolás" kulcs hozzáadva

Domain Audit

  • backend/app/api/v1/endpoints/admin_organizations.py végpont kizárólag core táblákat érint:
    • Organization, OrganizationMember, OrganizationSubscription, SubscriptionTier, User
    • Nincs scraped provider tábla lekérdezés — domain határok helyesek

2026-06-25: P0 Audit - Domain Conflation in Expense/Cost Service Provider Flow

Gitea Card: #291 Scope: Backend Type: Bug / Domain Conflation

Findings

Identified 6 code locations causing domain conflation when quick_add_provider() creates Organization() (→ fleet.organizations) instead of ServiceProvider() (→ marketplace.service_providers):

  1. PRIMARY (provider_service.py:507-550): quick_add_provider() creates Organization() instead of ServiceProvider()
  2. SECONDARY (provider_service.py:561-570): ServiceProfile.organization_id FK to incorrectly created fleet.organizations
  3. TERTIARY (provider_service.py:618-630): Branch creation in fleet.branches for lightweight vendor
  4. QUATERNARY (provider_service.py:639-646): OrganizationMember addition for creating user
  5. SYSTEMIC (fleet_finance/models.py:104-110): AssetCost.vendor_organization_id FK references ONLY fleet.organizations.id
  6. STRUCTURAL (provider_service.py): search_providers() UNION masks domain conflation

Outcome

  • Report: /opt/docker/docs/p0_domain_conflation_cost_provider_audit.md (in roo-helper container)
  • No code changes made. Awaiting Architect decision on refactoring approach.
  • Refactoring Options proposed: A (flag in fleet), B (split to marketplace), C (hybrid - recommended)

2026-06-25 - P0 Hybrid Vendor Refactor & Categorization (Option C)

🎯 Cél

Implementálni az Option C (Hybrid) architektúrát: quick_add_provider() mostantól ServiceProvider-t (marketplace.service_providers) hoz létre Organization helyett (fleet.organizations). A valódi garázsok (safe list: 13 ID) továbbra is Organization-ként maradnak.

🔧 Módosított fájlok

PHASE 1 - Schema Updates:

  • backend/app/models/fleet_finance/models.pyservice_provider_id hozzáadva AssetCost-hoz + FK javítás (relációk indentálása)
  • backend/app/models/marketplace/service.pyservice_provider_id hozzáadva ServiceProfile-hoz
  • backend/app/models/identity/social.pyServiceProvider kiterjesztve 10 új mezővel (cím, kontakt)
  • unified_db_sync.py futtatva → 10 új oszlop létrehozva az adatbázisban

PHASE 2 - Refactor quick_add_provider():

  • backend/app/services/provider_service.pyquick_add_provider() átírva: ServiceProvider + ServiceProfile létrehozása (NO Organization, NO Branch, NO OrganizationMember)
  • backend/app/schemas/asset_cost.pyservice_provider_id hozzáadva a Pydantic modellekhez
  • backend/app/schemas/provider.pyProviderQuickAddIn kiegészítve új mezőkkel
  • backend/app/api/v1/endpoints/expenses.pyservice_provider_id átadva AssetCost creation-nél

PHASE 3 - Data Migration:

  • backend/scripts/migrate_providers.py — Létrehozva: 7 Organization → ServiceProvider migrálva

PHASE 4 - Verification:

  • 7 ServiceProvider rekord létrejött (marketplace.service_providers)
  • 6/7 rendelkezik ServiceProfile kapcsolattal (MOL-nak 0 profilja volt)
  • 1 AssetCost linkelve (Aszalós Motorszervíz)
  • Safe list garázsok (13) érintetlenek a fleet.organizations táblában