diff --git a/.roo/history.md b/.roo/history.md index 6f25528..468ffc7 100644 --- a/.roo/history.md +++ b/.roo/history.md @@ -18,506 +18,308 @@ Teljes körű adatbázis konzisztencia ellenőrzés és zombie API végpontok fe 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 -- `backend/static/locales/en.json` - GAMIFICATION szekció hozzáadva (16 kulcs: SUBMIT_SERVICE, QUIZ, BADGE, SEASON, ACHIEVEMENTS) -- `backend/static/locales/hu.json` - GAMIFICATION szekció hozzáadva (16 kulcs, magyar fordításokkal) -### ✅ Ellenőrzés -- JSON szintaxis: ✅ Érvényes mindkét fájlban -- i18n helper `t()` függvény: ✅ Minden kulcs lekérdezhető angolul és magyarul -- Interpoláció: ✅ `{error}` helyőrzők működnek -- Leaf key count: 16 = 16 (en/hu egyezés) - -## 2026-06-30 - [#344] Fázis 5/7: Backend API endpointok átalakítása - hardcoded stringek eltávolítása +## 2026-07-01 - Opening Hours (JSONB) Admin UI támogatás ### 🎯 Cél -A `backend/app/api/v1/endpoints/gamification.py` végpontjaiban található összes hardcoded magyar és angol szöveg cseréje az i18n `t()` helper segítségével. +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/gamification.py` - 14 helyen hardcoded string → `t("GAMIFICATION.xxx")` hívás; `from app.core.i18n import t` import hozzáadva -- `backend/static/locales/hu.json` - +10 új GAMIFICATION kulcs (QUIZ.ALREADY_COMPLETED, QUIZ.COMPLETED_SUCCESS, QUIZ.QUESTION_NOT_FOUND, QUIZ.POINTS_FAILED, BADGE.AWARDED_SUCCESS, BADGE.POINTS_FAILED, SEASON.NO_ACTIVE, XP_*_DESC, QUIZ_*_DESC) -- `backend/static/locales/en.json` - +10 új GAMIFICATION kulcs angol fordítással +- `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 -### ✅ Ellenőrzés -- Python import: ✅ `from app.api.v1.endpoints.gamification import router` sikeres -- Szintaxis: ✅ Nincs hiba -- i18n lefedettség: ✅ Minden korábbi hardcoded string i18n kulcsra cserélve -- Interpoláció: ✅ `{error}`, `{badge_name}` helyőrzők működnek +### ✅ 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-23 - Cost Entry Wizard (CostEntryWizard.vue) - 4-lépéses Számla Űrlap +## 2026-06-30 - [#377] M4: Többnyelvű támogatás bevezetése (DE, FR, RO, CZ, SK) ### 🎯 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. +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-24 - P0 Fix & Enhance: Permissions Page Data Flow, Editing & i18n +## 2026-06-30 - [#376] M3: Admin nyelvválasztó átalakítása legördülő menüvé ### 🎯 Cél -Permissions oldal adatáramlás javítása, szerkesztés/mentés funkció bevezetése, és @nuxtjs/i18n telepítése/konfigurálása. +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/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 -- `frontend_admin/nuxt.config.ts` - @nuxtjs/i18n modul hozzáadása, locales konfiguráció (hu/en) -- `frontend_admin/i18n/locales/hu.json` - Magyar fordítási fájl (permissions oldal összes szövege) -- `frontend_admin/i18n/locales/en.json` - Angol fordítási fájl +- `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ények -- Build: ✅ Sikeres (hu-DbjfOUfH.mjs, en-DnJ23n0t.mjs locale chunk-ok) -- i18n modul: @nuxtjs/i18n v10.4.0 telepítve, no_prefix stratégiával -- Szerkesztés: modified/original Map-ek, handleToggle, savePermissions (PATCH /admin/permissions/override/{org_id}) -- Adatmentés: success/error toast notification auto-clear-el +### 📊 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-24 - P0 Execution: Wire Packages UI to Real Database +## 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 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. +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 -- `backend/app/schemas/subscription.py` - `tier_level` és `feature_capabilities` mezők hozzáadva a SubscriptionTierResponse, SubscriptionTierCreate, SubscriptionTierUpdate modellekhez -- `backend/app/api/v1/endpoints/admin_packages.py` - create/update végpontok frissítve az új mezők kezelésére -- `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 -- `frontend_admin/locales/hu.json` - packages i18n kulcsok (magyar) -- `frontend_admin/locales/en.json` - packages i18n kulcsok (angol) -## 2026-06-29 - #327 Gitea Kártya: Backend - Meglévő PATCH /admin/users/{id}/penalty endpoint javítása +**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 -A #327-es Gitea kártya (Epic 8 Gamification 2.0, 4. implementációs lépés) feladata a meglévő `PATCH /admin/users/{user_id}/penalty` végpont hibáinak kijavítása. Az endpoint már refaktorálva volt GamificationService `process_activity()` használatára, de 3 hibát tartalmazott. - -### 🔧 Javított hibák - -**1. Hiányzó `import logging` az [`admin.py`](backend/app/api/v1/endpoints/admin.py)-ban** -- `logger.error()` hívás volt a fájlban (483. sor), de `import logging` nem szerepelt -- Javítás: `import logging` és `logger = logging.getLogger("admin-endpoints")` hozzáadva - -**2. Undefined variable `admin` a `approve_action` endpointban** -- 82. sor: `admin.id` helyett `current_user.id` (az `admin` változó sosem volt definiálva) - -**3. Rossz [`SecurityAuditLog`](backend/app/models/system/audit.py:12) mezőnevek a penalty endpointban (464-471. sor)** -- `user_id=current_user.id` → `actor_id=current_user.id` -- `target_user_id=user_id` → `target_id=user_id` -- `details="..."` → `payload_after={"penalty_points_added": ..., "reason": ...}` (JSON dict, nem string) -- `ip_address="admin_api"` → eltávolítva (nem létező mező) -- `payload_before={}` hozzáadva (kötelező mező) - -### 🐛 Hibakeresési tapasztalat -- A kezdeti 500-as hibaüzenet félrevezető volt: `'UserStats' object has no attribute 'level'` - valójában a `current_level` mező helyesen létezik -- A valódi hiba a `SecurityAuditLog` létrehozásánál volt, de a `raise e` minta a [`process_activity()`](backend/app/services/gamification_service.py:174)-ben elnyelte a belső traceback-et -- Stratégiai debug logging segítségével sikerült lokalizálni a valódi hibát -- `.pyc` cache törlése és konténer újraindítás szükséges volt a friss kód betöltéséhez - -### ✅ Eredmények -- HTTP 200: `{"status":"success","message":"Gamification penalty applied to user 1","user_id":1,"penalty_points_added":100,"total_penalty_points":300,"restriction_level":1}` -- Adatbázis: user 1 `penalty_points=300`, `restriction_level=1` -- Audit log: `audit.security_audit_logs` bejegyzés `action="apply_gamification_penalty"`, `actor_id=2`, `target_id=1` -- Sync Engine: ✅ 1284 OK, 0 Fixed, 0 Extra -- Debug logging eltávolítva a [`gamification_service.py`](backend/app/services/gamification_service.py)-ból -- Gitea #327: ✅ Lezárva - -## 2026-06-29 - Gitea #328: Gamification Admin Integration - Bugfixes & Endpoint Verification - -### 🎯 Cél -Gitea #328 ("Backend: gamification.py endpointok Gami") kártya feladatainak befejezése: admin gamification végpontok hibáinak javítása és teljes körű tesztelése. - -### 🔧 Javítások - -**1. [`gamification.py`](backend/app/api/v1/endpoints/gamification.py) - submit-service végpont hibák:** -- Hiányzó `logger` import hozzáadva (`import logging`, `logger = logging.getLogger("gamification-endpoints")`) -- `metadata={...}` → `provided_fields={...}` javítás (a `UserContribution` modellben `provided_fields` a JSONB mező neve) -- Hiányzó kötelező mezők hozzáadva: `action_type=1`, `earned_xp=submission_rewards.get("xp", 100)` - -**2. [`admin_gamification.py`](backend/app/api/v1/endpoints/admin_gamification.py) - master-config végpont javítás:** -- `system_service.get_setting()` → `system_service.get_scoped_parameter()` (a `SystemService`-ben nincs `get_setting` metódus) -- `system_service.set_setting()` → `system_service.set_scoped_parameter()` ugyanezen okból - -**3. [`system_service.py`](backend/app/services/system_service.py) - set_scoped_parameter upsert logika javítás:** -- Az eredeti `ON CONFLICT ON CONSTRAINT uix_param_scope` nem működött `scope_id IS NULL` esetén, mert PostgreSQL-ben a UNIQUE constraint nem blokkolja a NULL értékű duplikátumokat (NULL != NULL) -- Kétlépéses megközelítésre váltva: először megkeresi a meglévő rekordot, ha van frissíti, ha nincs beszúrja -- Adatbázis: `system.system_parameters.scope_level` oszlop típusa átállítva custom PostgreSQL enum-ról `VARCHAR(50)`-re a SQLAlchemy String(50) modellel való kompatibilitás miatt - -### ✅ Teszt Eredmények -- **Admin Gamification végpontok:** 18/18 ✅ (GET/POST/PUT/DELETE point-rules, level-configs, badges, seasons, competitions, user-stats, master-config, system-params, points-ledger, contributions) -- **Penalty/Reward végpontok:** ✅ POST `/admin/gamification/user-stats/{id}/penalty` és `/reward` -- **Legacy PATCH `/admin/users/{id}/penalty`:** ✅ Továbbra is működik a GamificationService-en keresztül -- **Sync Engine:** ✅ 1284 OK, 0 Fixed, 0 Extra -- **Gitea #328:** ✅ Lezárva - -## 2026-06-29 - #329 Frontend: Gamification menüpont + routing - -### 🎯 Cél -Gamification menüpont és routing létrehozása a Nuxt 3 admin frontendben. - -### 📝 Megvalósítás -- **`frontend_admin/layouts/default.vue`:** Gamification menücsoport beszúrása a sidebar `menuGroups` tömbjébe 6 menüelemmel (Játékmenet Beállítások, Események & Szezonok, Felhasználói Adatok, Gamification HQ, Rendszer Konfig, Rendszerparaméterek) -- **`frontend_admin/pages/gamification/`:** 12 oldal létrehozása: - - `index.vue` — Gamification HQ Dashboard (stat kártyák, gyors műveletek, pontnapló, top 5 ranglista) - - `point-rules.vue`, `levels.vue`, `badges.vue` — Játékmenet beállítások - - `seasons.vue`, `competitions.vue` — Események & Szezonok - - `users/index.vue`, `users/[id].vue` — Felhasználói statisztikák - - `leaderboard.vue`, `ledger.vue` — Ranglista és Pontnapló - - `config.vue`, `parameters.vue` — Rendszer konfiguráció -- **Routing:** Nuxt 3 file-based routing automatikusan generálja a route-okat -- **Build:** Sikeres Nuxt build (Vite + Nitro), konténer újraindítva -- **Gitea #329:** ✅ Elkészült - -## 2026-06-29 - Gitea #330: Gamification Dashboard (Frontend Admin) - -### 🎯 Cél -Gamification HQ Dashboard oldal (`/gamification/index.vue`) elkészítése az admin felülethez, stat kártyákkal, gyors műveletekkel, pontnaplóval és top 5 ranglistával. - -### 🔧 Módosított fájlok -- **`backend/app/api/v1/endpoints/admin_gamification.py`:** - - Új `GET /admin/gamification/dashboard-summary` végpont hozzáadva, ami összesíti: összes felhasználó, aktív szezon neve, függő hozzájárulások száma, mai XP - - `list_points_ledger` végpont javítva: `user_name` mező hozzáadva (User.email JOIN-nel) - - `datetime.utcnow()` → `datetime.now(timezone.utc)` deprecation fix -- **`frontend_admin/pages/gamification/index.vue`:** - - API hívás átirányítva a dedikált `/api/v1/admin/gamification/dashboard-summary` végpontra - - Leaderboard adatok mapping-je kiegészítve: `username`/`current_level`/`total_xp` mezők támogatása a backend válaszhoz igazodva -- **Sync Engine:** ✅ 1284 elem szinkronban, 0 hiba -- **Gitea #330:** ✅ Elkészült - -## 2026-06-29 - Gitea #331: Frontend Pontszabályok + Szintek CRUD oldal (admin) - -### 🎯 Cél -A Gamification admin felület Pontszabályok és Szintek CRUD oldalainak implementálása a Nuxt 3 admin frontendben. +4 darab kritikus blokkoló hiba javítása az Admin Providers flow-ban. ### 🔧 Változtatások -- **`frontend_admin/pages/gamification/point-rules.vue`:** - - Teljes CRUD implementáció: listázás, létrehozás, szerkesztés, soft-delete (is_active=False) - - Adattábla: ID, action_key, points, description, is_active oszlopok - - Create/Edit modal: action_key, points, description, is_active mezők validációval - - Delete confirmation modal soft-delete-hez - - 409 Conflict kezelés (duplikált action_key) - - Toast értesítések minden művelethez - - API végpont: `/api/v1/admin/gamification/point-rules` +**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 -- **`frontend_admin/pages/gamification/levels.vue`:** - - Teljes CRUD implementáció: listázás, létrehozás, szerkesztés - - Adattábla: level_number, rank_name, min_points, is_penalty oszlopok - - Create/Edit modal: level_number, rank_name, min_points, is_penalty mezők validációval - - Vizuális szint fa diagram progress bar-okkal - - 409 Conflict kezelés (duplikált level_number) - - Toast értesítések minden művelethez - - API végpont: `/api/v1/admin/gamification/level-configs` +**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 -- **Build:** ✅ Sikeres Nuxt build a `sf_admin_frontend` konténerben -- **Gitea #331:** ✅ Elkészült +**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 -## 2026-06-29 - Gitea #332: Frontend: Kitüntetések (Badge) kezelő oldal +**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 -A Gamification admin felület Kitüntetések (Badge) CRUD oldalának implementálása a Nuxt 3 admin frontendben. A backend API végpontok már léteztek a [`admin_gamification.py`](backend/app/api/v1/endpoints/admin_gamification.py)-ban (GET/POST/PUT/DELETE `/admin/gamification/badges`). +Két P0 hibajavítás az Admin Provider Details oldalon. ### 🔧 Módosított fájlok -- **`frontend_admin/pages/gamification/badges.vue`:** - - Teljes CRUD implementáció: listázás, létrehozás, szerkesztés, törlés - - Adattábla: ID, Név, Leírás, Ikon (kép előnézettel), Műveletek oszlopok - - Create/Edit modal: name (kötelező, max 100), description (kötelező, max 500), icon_url (opcionális URL élő előnézettel) - - Delete confirmation modal: badge név és leírás megjelenítése - - 409 Conflict kezelés (duplikált név) - - Toast értesítések minden művelethez (siker/hiba) - - Loading, error és empty állapotok kezelése - - Auth middleware (`useAuth()`) - - API végpont: `/api/v1/admin/gamification/badges` +**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ő -### ✅ Eredmények -- **GET /admin/gamification/badges:** ✅ 200 OK (2 meglévő badge listázva) -- **POST /admin/gamification/badges:** ✅ 201 Created (új badge létrehozva egyedi névvel) -- **PUT /admin/gamification/badges/{id}:** ✅ 200 Updated (badge adatok módosítva) -- **DELETE /admin/gamification/badges/{id}:** ✅ 204 No Content (badge törölve, GET visszaadja a maradékot) -- **Sync Engine:** ✅ Ellenőrizve -- **Gitea #332:** ✅ Elkészült +**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 `