# 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-30 - [#343] Fázis 4/7: Gamification kulcsok felvétele backend lokációs fájlokba ### 🎯 Cél GAMIFICATION szekció létrehozása a `backend/static/locales/en.json` és `hu.json` fájlokban a `docs/gamification_i18n_audit_and_fix_proposal.md` dokumentáció alapján. ### 🔧 Módosított fájlok ## 2026-07-01 - Opening Hours (JSONB) Admin UI támogatás ### 🎯 Cél Nyitvatartás (Opening Hours) JSONB mező adminisztrációs támogatásának megvalósítása: backend API (GET/PATCH), frontend edit UI (7 napos grid), frontend detail display. ### 🔧 Módosított fájlok - `backend/app/api/v1/endpoints/admin_providers.py` - ProviderDetail + ProviderUpdateInput sémák `opening_hours` mezővel; get_provider_detail() és update_provider() végpontok kiegészítése a ServiceProfile JSONB oszlop olvasásával/írásával - `frontend_admin/pages/providers/[id]/edit.vue` - "Nyitvatartás" tab (4. tab) 7 napos grid-del, checkbox + time input párokkal, 24/7 gyorsgombbal, hétköznap másolással, összes törléssel - `frontend_admin/pages/providers/[id]/index.vue` - Nyitvatartás megjelenítő tábla a részletes nézetben ### ✅ Verifikáció - Sync Engine: 1297 OK, 0 Fixed, 0 Extra - rendszer tökéletesen szinkronban - GET /admin/providers/1 → 200, `opening_hours` mező visszatér - PATCH /admin/providers/1 `opening_hours` → 200, adatok perzisztálódnak és visszaolvashatók ## 2026-06-30 - [#377] M4: Többnyelvű támogatás bevezetése (DE, FR, RO, CZ, SK) ### 🎯 Cél 5 új nyelv (Német, Francia, Román, Cseh, Szlovák) bevezetése a backend és frontend admin i18n rendszerekbe. ### 🔧 Létrehozott fájlok - `backend/static/locales/de.json` - Backend német lokációs fájl (7 szekció) - `backend/static/locales/fr.json` - Backend francia lokációs fájl (7 szekció) - `backend/static/locales/ro.json` - Backend román lokációs fájl (7 szekció) - `backend/static/locales/cz.json` - Backend cseh lokációs fájl (7 szekció) - `backend/static/locales/sk.json` - Backend szlovák lokációs fájl (7 szekció) - `frontend_admin/locales/de.json` - Frontend admin német fő lokációs fájl - `frontend_admin/locales/fr.json` - Frontend admin francia fő lokációs fájl - `frontend_admin/locales/ro.json` - Frontend admin román fő lokációs fájl - `frontend_admin/locales/cz.json` - Frontend admin cseh fő lokációs fájl - `frontend_admin/locales/sk.json` - Frontend admin szlovák fő lokációs fájl - `frontend_admin/i18n/locales/de.json` - Frontend admin német közös lokációs fájl - `frontend_admin/i18n/locales/fr.json` - Frontend admin francia közös lokációs fájl - `frontend_admin/i18n/locales/ro.json` - Frontend admin román közös lokációs fájl - `frontend_admin/i18n/locales/cz.json` - Frontend admin cseh közös lokációs fájl - `frontend_admin/i18n/locales/sk.json` - Frontend admin szlovák közös lokációs fájl ### 🔧 Módosított fájlok - `frontend_admin/nuxt.config.ts` - 5 új nyelv regisztrálása a @nuxtjs/i18n konfigurációban ### ✅ Verifikáció - Backend i18n: Mind az 5 nyelv betöltődik (7-7 szekció), leaf key fordítések működnek - Sync Engine: 1293 OK, 0 Fixed, 0 Extra - rendszer tökéletesen szinkronban ### 🎯 Cél GAMIFICATION szekció létrehozása a `backend/static/locales/en.json` és `hu.json` fájlokban a `docs/gamification_i18n_audit_and_fix_proposal.md` dokumentáció alapján. ### 🔧 Módosított fájlok ## 2026-06-30 - [#376] M3: Admin nyelvválasztó átalakítása legördülő menüvé ### 🎯 Cél A jelenlegi kétállású HU/EN kapcsoló átalakítása bővíthető, legördülő nyelvválasztó dropdownná, amely a backend-ből érkező támogatott nyelveket listázza. ### 🔧 Módosított fájlok - `frontend_admin/components/LanguageSwitcher.vue` — **LÉTREHOZVA**: Új önálló LanguageSwitcher dropdown komponens zászló emoji-kkal, nyelv nevével, localStorage + backend perzisztálással - `frontend_admin/layouts/default.vue` — **MÓDOSÍTVA**: 157-170. sorokban a régi gomb-alapú kapcsoló kicserélve `` komponensre; felesleges `useI18n` import és `switchLocale`/`getAuthHeaders` függvények eltávolítva ### 📊 Eredmény - LanguageSwitcher komponens: ✅ Létrehozva (zászló emoji, dinamikus locale lista, backend PATCH perzisztálás, localStorage) - default.vue cleanup: ✅ 25 sor kód eltávolítva (i18n logika kiszervezve) - Nuxt production build: ✅ Sikeres ## 2026-06-30 - Admin Provider Root Cause Analysis (#379) **Vizsgálat típusa:** Rendszer-Architect root cause analysis **Gitea kártya:** #379 ### Felfedezett probléma Az admin felület (providers list & pending queue) csak 6 rekordot mutat a `marketplace.service_providers` táblából. A robotok által gyűjtött 8569 rekord a `marketplace.service_staging`-ben láthatatlan. ### Root Cause A `backend/app/api/v1/endpoints/admin_providers.py` `list_providers()` és `get_provider_stats()` endpointjai kizárólag a `ServiceProvider` modellt kérdezik le. A `provider_service.py` `search_providers()` (public API) már helyesen használ UNION ALL-t mindhárom forrásból. ### Javítási terv 1. `ProviderListItem` response model kiegészítése `source_table` mezővel 2. `list_providers()` UNION ALL kiterjesztése ServiceStaging-re 3. `get_provider_stats()` kiterjesztése staging rekordokkal 4. Nem kell új validációs mező - a `provider_validations`, `service_profiles.trust_score` stb. már létezik ### Dokumentáció `docs/admin_providers_root_cause_analysis.md` ## 2026-06-30 - Admin Provider Discovery Implementáció ### 🎯 Cél A `list_providers()` admin végpont kiterjesztése UNION ALL lekérdezéssel, hogy a bot által gyűjtött ServiceStaging rekordok (8569 db) és a verified organization-ök is megjelenjenek az admin felületen. Új `rejected.vue` oldal az elutasított szolgáltatók visszaállításához. ### 🔧 Változtatások 1. `backend/app/api/v1/endpoints/admin_providers.py`: - `_build_unified_providers_query()`: UNION ALL a ServiceProvider, ServiceStaging és Organizations táblákból - `source_filter` és `source_table_filter` a UNION ALL eredményére alkalmazva (nem az egyes részekre) - kijavítva a SourceType enum ütközési hibát - `get_provider_stats()`: staging_pending mező hozzáadása - `restore_provider()`: POST végpont rejected->approved státuszváltáshoz - `get_provider_history()`, `update_provider()` végpontok 2. `frontend_admin/pages/providers/rejected.vue`: új oldal az elutasított szolgáltatók listázásához és visszaállításához 3. `frontend_admin/pages/providers/index.vue`: source_table, bot/verified_org szűrés támogatás 4. `frontend_admin/pages/providers/pending.vue`: source_table mező hozzáadása ### ✅ Tesztek - `source=bot` filter: 200 OK, 5 staging rekord visszaadva - `source=verified_org` filter: 200 OK, 1 organization rekord - `source_table=service_staging` filter: 200 OK, 3 staging rekord - Stats: total=8575, staging_pending=5096 - Rejected filter: 200 OK, 2 rejected rekord ## 2026-06-30 - Provider Admin Tabbed Edit UI (Status, Validations, History) ### 🎯 Cél A szolgáltatók admin felületének bővítése: többfülű szerkesztési nézet, státuszkezelés, gamification validációs lista és állapotváltoztatási előzmények megjelenítése. ### 🔧 Módosított fájlok **1. `backend/app/api/v1/endpoints/admin_providers.py`** - `ProviderUpdateInput` séma bővítése: `status` (pending/approved/rejected) és `validation_score` (0-100) mezőkkel - `ProviderValidationEntry` response séma létrehozása (id, provider_id, voter_user_id, validation_type, weight, validation_metadata, created_at, voter_name) - `GET /admin/providers/{id}/validations` végpont: gamification validációk lekérése voter névvel - `PATCH /admin/providers/{id}` módosítása: státuszváltás kezelése (ModerationStatus enum), old_data audit snapshot, validation_score auto-állítás restore/reject esetén **2. `frontend_admin/pages/providers/[id].vue`** - Teljes átírás: egysávos layout helyett 4 fül (Adatok, Státusz, Validációk, Előzmények) - **Adatok fül**: változatlan alapadatok, cím, elérhetőség, moderációs műveletek - **Státusz fül**: új űrlap státusz select, validation_score range slider (0-100), indoklás textarea - **Validációk fül**: gamification validációs lista típus-badge-ekkel, szavazó név, súly, metadata, timestamp - **Előzmények fül**: idővonal action-badge-ekkel, státusz átmenetek (régi→új), user info, expandálható részletek - Elutasított/Megjelölt szekció: "Szerkesztés" és "Visszaállítás" gombok minden státuszhoz ### ✅ Verifikáció - Sync Engine: ✅ 1293 OK, 0 Fixed, 0 Extra - teljes szinkron - Backend syntax: ✅ admin_providers.py AST parse OK - Backend import: ✅ router modul betöltés sikeres ## 2026-06-30 - P0 Rescue: Admin Providers API Blocker Fixes ### 🎯 Cél 4 darab kritikus blokkoló hiba javítása az Admin Providers flow-ban. ### 🔧 Változtatások **FIX 1 - Silent Rollback (PATCH endpoint):** - [`update_provider()`](backend/app/api/v1/endpoints/admin_providers.py:1147) `db.commit()` köré `try/except IntegrityError` blokk került - IntegrityError esetén `db.rollback()` + `HTTPException(400)` a csendes 200 OK helyett **FIX 2 - Unique Constraint on Restore:** - [`_create_provider_validation()`](backend/app/api/v1/endpoints/admin_providers.py:198) átírva PostgreSQL `INSERT ... ON CONFLICT DO UPDATE` (UPSERT) használatára - A `uq_voter_provider_validation` constraint tiszteletben tartva **FIX 3 - Wrong Frontend URL:** - Ellenőrizve: a frontend [`[id].vue`](frontend_admin/pages/providers/[id].vue:761) már a helyes `/api/v1/admin/providers/{id}/validations` URL-t használja **FIX 4 - AuditLog Attribute Error:** - [`get_provider_history()`](backend/app/api/v1/endpoints/admin_providers.py:1029) `AuditLog.created_at` → `AuditLog.timestamp` - `timestamp=log.created_at` → `timestamp=log.timestamp` ### ✅ Verifikáció - Backend syntax: ✅ `py_compile` OK - Modul import: ✅ `admin_providers` modul betöltés sikeres - Container: ✅ `sf_api` restart sikeres, státusz Up ## 2026-06-30 - [#381] P0 Fix: Provider validations 500 error & missing edit/flag modals ### 🎯 Cél Két P0 hibajavítás az Admin Provider Details oldalon. ### 🔧 Módosított fájlok **Bug #1 - `get_provider_validations()` 500 error:** - [`admin_providers.py`](backend/app/api/v1/endpoints/admin_providers.py:1018) — `v.voter.display_name` → `v.voter.email` - Root cause: `User` modellben nincs `display_name` mező **Bug #2 - Dead "Szerkesztés" gomb:** - [`[id].vue`](frontend_admin/pages/providers/[id].vue:540) — Edit modal template hozzáadva (name, city, address, contact, category mezőkkel) - [`[id].vue`](frontend_admin/pages/providers/[id].vue:603) — Flag modal template hozzáadva (indoklás textarea-val) - Root cause: A `