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.py` — `deep_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.py` — `RegionConfig` 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__.py` — `RegionConfig` import hozzáadva - `backend/app/api/v1/endpoints/regions.py` — **LÉTREHOZVA**: `GET /system/regions` publikus végpont - `backend/app/api/v1/api.py` — regions router regisztrálva `/system` prefix-szel - `backend/scripts/seed_regions.py` — **LÉTREHOZVA**: 3 régió seedelése (HU, GB, DEFAULT) - `backend/app/api/v1/endpoints/auth.py` — `PATCH /auth/me/language` végpont hozzáadva nyelvi preferencia perzisztáláshoz - `frontend_admin/stores/region.ts` — **LÉTREHOZVA**: Pinia store régiók lekérésére, aktív régió getterekkel (currency, locale, VAT, timezone) - `frontend_admin/composables/useFormatter.ts` — **LÉ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.vue` — `userEmail` 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.py` — `service_provider_id` hozzáadva `AssetCost`-hoz + FK javítás (relációk indentálása) - `backend/app/models/marketplace/service.py` — `service_provider_id` hozzáadva `ServiceProfile`-hoz - `backend/app/models/identity/social.py` — `ServiceProvider` 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.py` — `quick_add_provider()` átírva: `ServiceProvider` + `ServiceProfile` létrehozása (NO Organization, NO Branch, NO OrganizationMember) - `backend/app/schemas/asset_cost.py` — `service_provider_id` hozzáadva a Pydantic modellekhez - `backend/app/schemas/provider.py` — `ProviderQuickAddIn` kiegészítve új mezőkkel - `backend/app/api/v1/endpoints/expenses.py` — `service_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