# 🔧 Logic Spec: Service Provider Discovery & Admin Integration **VerziĂł:** 1.1 **DĂĄtum:** 2026-06-30 **Állapot:** Tervezet (Architect Review) **KapcsolĂłdĂł MĂ©rföldkƑ:** Service Finder Marketplace & Expense Integration --- ## 1. 🎯 Modul CĂ©lja Ă©s Masterbook 2.0 IlleszkedĂ©s ### CĂ©l A rendszer jelenleg hĂĄrom pĂĄrhuzamos szolgĂĄltatĂłi adatforrĂĄssal dolgozik: 1. **Crowdsourced** (`marketplace.service_providers`) — KözössĂ©g ĂĄltal bekĂŒldött, moderĂĄlandĂł 2. **Robot-hunted** (`marketplace.service_staging`) — Automata felderĂ­tĂ©sbƑl 3. **Szervezeti** (`fleet.organizations`) — Hivatalos garĂĄzs/szerviz profilok A jelenlegi hiĂĄnyossĂĄg: **Nincs automatikus felderĂ­tĂ©s**, amikor egy felhasznĂĄlĂł költsĂ©get rögzĂ­t Ă©s egy ismeretlen szolgĂĄltatĂłi nĂ©vvel talĂĄlkozik. Emellett **nincs admin felĂŒlet** a crowdsourced szolgĂĄltatĂłk moderĂĄlĂĄsĂĄra. ### Masterbook 2.0 IlleszkedĂ©s - **P0 Hybrid Vendor Refactor** — mĂĄr megalapozta a `ServiceProvider` modellt Ă©s a `quick_add_provider()` szolgĂĄltatĂĄst - **Gross-First KönyvelĂ©s** — a költsĂ©g rögzĂ­tĂ©s az expense creation flow rĂ©sze - **Triple Wallet / Gamification** — a felderĂ­tĂ©s pontozhatĂł (XP a discovered provider-ekĂ©rt) - **Dual Control (Moderation)** — a feltöltött/felderĂ­tett szolgĂĄltatĂłknak moderĂĄciĂłn kell ĂĄtesniĂŒk --- ## 2. 📊 Existing Module Map — Teljes KörkĂ©p ### 2.1 Modellek | Modell | TĂĄbla (Schema) | FĂĄjl | CĂ©l | |--------|---------------|------|-----| | `ServiceProvider` | `marketplace.service_providers` | `identity/social.py:22` | Crowdsourced providers, moderĂĄciĂłval | | `ServiceProfile` | `marketplace.service_profiles` | `marketplace/service.py:21` | Enriched profile (trust score, location) | | `ServiceStaging` | `marketplace.service_staging` | `marketplace/service.py:162` | Robot-hunted, approval pending | | `ExpertiseTag` | `marketplace.expertise_tags` | `marketplace/service.py:83` | 4-level taxonomy | | `ServiceExpertise` | `marketplace.service_expertise` | `marketplace/service.py:146` | Junction table | | `AssetCost` | `fleet_finance.asset_costs` | `fleet_finance/models.py:109` | KöltsĂ©g rekord 3 vendor mezƑvel | | `Organization` | `fleet.organizations` | `marketplace/organization.py:73` | Hivatalos garĂĄzs/szerviz szervezetek | ### 2.2 Service Layer | Service | FĂĄjl | FunkciĂłk | |---------|------|----------| | `search_providers()` | `provider_service.py:138` | Unified search, geo-filter, trust score | | `quick_add_provider()` | `provider_service.py:473` | Gyors ServiceProvider lĂ©trehozĂĄs + gamification | | `update_provider()` | `provider_service.py:804` | Provider adatok frissĂ­tĂ©se | | `CostService.record_cost()` | `cost_service.py:23` | Teljes költsĂ©grögzĂ­tĂ©s | ### 2.3 API Endpointok | VĂ©gpont | Prefix | FĂĄjl | FunkciĂł | |---------|--------|------|---------| | `GET /providers/search` | `/providers` | `providers.py:184` | Unified service search | | `POST /providers/quick-add` | `/providers` | `providers.py:243` | Quick add provider | | `PUT /providers/{id}` | `/providers` | `providers.py:279` | Update provider | | `POST /expenses/` | `/expenses` | `expenses.py:439` | Create expense (hook pont!) | | `GET /categories/tree` | `/providers` | `providers.py:46` | Category tree | | `POST /admin/services/{staging_id}/approve` | `/admin` | `admin.py:238` | Staged service approval | | `GET/POST/PUT admin/gamification/...` | `/admin/gamification` | `admin_gamification.py:1` | Gamification admin | | `GET/PATCH admin/organizations/...` | `/admin/organizations` | `admin_organizations.py:1` | Organization CRM | ### 2.4 Frontend Admin (HiĂĄnyzĂł oldalak) Jelenlegi admin oldalak: `frontend_admin/pages/` - `dashboard`, `users`, `persons`, `garages`, `packages`, `permissions` - `gamification/*` (9 oldal) - **NINCS:** `providers/`, `services/`, `marketplace/` oldal --- ## 3. 🔄 Auto-Discovery Flow: Expense → Provider Creation ### 3.1 Trigger Flow Diagram ```mermaid flowchart TD A[POST /expenses/] --> B{external_vendor_name\nmegadva?} B -->|Nem| C[NormĂĄl költsĂ©g rögzĂ­tĂ©s] B -->|Igen| D{service_provider_id\nmegadva?} D -->|Igen| E[Link meglĂ©vƑ providerhez] D -->|Nem| F[NĂ©v egyeztetĂ©s\nServiceProvider tĂĄblĂĄban] F --> G{TalĂĄlat?} G -->|Igen, pontosan| H[Auto-link meglĂ©vƑhöz] G -->|Igen, hasonlĂł| I[LehetƑsĂ©g: auto-link\nvagy Ășj pending] G -->|Nem| J[Új ServiceProvider lĂ©trehozĂĄsa] J --> K[status=pending\nsource=import\nvalidation_score=0] K --> L[added_by_user_id =\nköltsĂ©get rögzĂ­tƑ user] L --> M[Gamification XP jutalmazĂĄs] M --> N[AssetCost.service_provider_id \n= Ășj provider.id] N --> O[Commit + response] ``` ### 3.2 ImplementĂĄciĂłs RĂ©szletek **Hook pont:** `expenses.py:566-588` — Az AssetCost pĂ©ldĂĄnyosĂ­tĂĄs elƑtt **Logikai lĂ©pĂ©sek a `create_expense`-ben (a `try` blokk elƑtt):** ```python # P0 SERVICE PROVIDER AUTO-DISCOVERY resolved_service_provider_id = expense.service_provider_id if expense.external_vendor_name and not expense.service_provider_id: # 1. Fuzzy match keresĂ©s from app.services.provider_service import find_or_create_provider_by_name result = await find_or_create_provider_by_name( db=db, name=expense.external_vendor_name, added_by_user_id=current_user.id, ) resolved_service_provider_id = result.id ``` **`find_or_create_provider_by_name()` logika:** ```python async def find_or_create_provider_by_name( db: AsyncSession, name: str, added_by_user_id: int, ) -> ServiceProvider: """ 1. Exact match keresĂ©s (ILIKE) 2. Fuzzy match (trigram similarity, pl. pg_trgm) 3. Ha nincs talĂĄlat -> Ășj ServiceProvider lĂ©trehozĂĄsa: - status = "pending" - source = "import" (API import forrĂĄs) - validation_score = 0 - added_by_user_id = a költsĂ©get rögzĂ­tƑ user 4. Gamification XP award (pl. SERVICE_PROVIDER_DISCOVERY) """ ``` ### 3.3 AdatbĂĄzis MĂłdosĂ­tĂĄs **Nincs Ășj tĂĄbla!** A meglĂ©vƑ `ServiceProvider` modell minden szĂŒksĂ©ges mezƑt tartalmaz: - `name`, `address` (opcionĂĄlis, az expense-bƑl nem jön) - `status` -> `pending` (alapĂ©rtelmezett) - `source` -> `import` (Ășj value a `SourceType` enum-ban, mĂĄr lĂ©tezik: `manual`, `ocr`, `import`) - `validation_score` -> `0` - `added_by_user_id` -> a költsĂ©get rögzĂ­tƑ user ID-ja **Csak a `SourceType` enum ellenƑrzĂ©se:** A jelenlegi Ă©rtĂ©k `api_import = "import"` — ez megfelelƑ. --- ## 4. đŸ›ïž Admin Interface Integration ### 4.1 Backend Endpointok (admin/providers/) | VĂ©gpont | MetĂłdus | CĂ©l | |---------|---------|-----| | `GET /admin/providers` | LIST | SzolgĂĄltatĂłk listĂĄzĂĄsa szƱrĂ©ssel (status, source, search) | | `GET /admin/providers/{id}` | GET | RĂ©szletes nĂ©zet | | `POST /admin/providers/{id}/approve` | POST | Provider jĂłvĂĄhagyĂĄsa (pending -> approved) | | `POST /admin/providers/{id}/reject` | POST | Provider elutasĂ­tĂĄsa (pending -> rejected) | | `POST /admin/providers/{id}/flag` | POST | Provider megjelölĂ©se (approved -> flagged) | | `DELETE /admin/providers/{id}` | DELETE | Provider törlĂ©se (soft delete) | | `GET /admin/providers/stats` | GET | StatisztikĂĄk (pending count, total, etc.) | **Új fĂĄjl:** `backend/app/api/v1/endpoints/admin_providers.py` **Router regisztrĂĄciĂł:** `api.py:48` — hozzĂĄadni: ```python from app.api.v1.endpoints import admin_providers api_router.include_router(admin_providers.router, prefix="/admin/providers", tags=["Admin Provider Moderation"]) ``` ### 4.2 Frontend Admin Oldalak **Új oldalak:** `frontend_admin/pages/providers/` | Oldal | Útvonal | FunkciĂł | |-------|---------|---------| | Providers List | `/providers` | Lista szƱrĂ©ssel (pending/approved/rejected), keresĂ©s | | Provider Detail | `/providers/[id]` | RĂ©szletes adatok, moderĂĄciĂłs akciĂłk | | Pending Queue | `/providers/pending` | Csak a pending provider-ek (moderĂĄciĂłs sor) | **Sidebar menĂŒ mĂłdosĂ­tĂĄs:** `frontend_admin/layouts/default.vue:324` — Új menĂŒcsoport "SzolgĂĄltatĂłk": ```javascript { title: 'SzolgĂĄltatĂłk', items: [ { label: 'SzolgĂĄltatĂłk', icon: '...', children: [ { path: '/providers', label: 'Összes szolgĂĄltatĂł', icon: '...', }, { path: '/providers/pending', label: 'JĂłvĂĄhagyĂĄsra vĂĄrĂł', icon: '...', }, ], }, ], }, ``` ### 4.3 Admin Endpoint Minta (admin_providers.py) ```python """ Admin Provider Moderation API VĂ©gpontok: GET /admin/providers — SzolgĂĄltatĂłk listĂĄzĂĄsa GET /admin/providers/{id} — RĂ©szletes adatok POST /admin/providers/{id}/approve — JĂłvĂĄhagyĂĄs (-> approved) POST /admin/providers/{id}/reject — ElutasĂ­tĂĄs (-> rejected) POST /admin/providers/{id}/flag — MegjelölĂ©s (-> flagged) DELETE /admin/providers/{id} — TörlĂ©s (soft delete) GET /admin/providers/stats — StatisztikĂĄk """ ``` --- ## 5. 📝 Adatmodell Ă©s Alembic Terv ### 5.1 MeglĂ©vƑ Modell — Nincs VĂĄltozĂĄs A `ServiceProvider` modell mĂĄr tartalmazza az összes szĂŒksĂ©ges mezƑt. Nincs szĂŒksĂ©g Ășj migrĂĄciĂłra. **EllenƑrizendƑ:** A `SourceType` enum tartalmazzon `import` Ă©rtĂ©ket: ```python class SourceType(str, enum.Enum): manual = "manual" ocr = "ocr" api_import = "import" ``` ### 5.2 Twin-technika (TöbbnyelvƱsĂ©g) A `ServiceProvider` modellben nincs i18n mezƑ (a nĂ©v nem lesz fordĂ­tva). A kategĂłriĂĄk (ExpertiseTag) mĂĄr tĂĄmogatjĂĄk a többnyelvƱsĂ©get a `name_hu`, `name_en` mezƑkkel. ### 5.3 Soft-delete A `ServiceProvider` modell jelenleg nem tĂĄmogatja a soft-delete-t. Ha szĂŒksĂ©ges, lehet hozzĂĄadni: ```python is_deleted: Mapped[bool] = mapped_column(Boolean, default=False) deleted_at: Mapped[Optional[datetime]] = mapped_column(DateTime(timezone=True)) ``` --- ## 6. ⚙ Admin Kontroll (Global/Country/Region/User) A provider moderĂĄciĂłhoz az alĂĄbbi SystemParameter vĂĄltozĂłk javasoltak: | ParamĂ©ter | Scope | Default | LeĂ­rĂĄs | |-----------|-------|---------|--------| | `PROVIDER_AUTO_APPROVE_TRUSTED_USERS` | global | `false` | MegbĂ­zhatĂł user-ek provider-ei auto-approved | | `PROVIDER_MAX_PENDING_PER_USER` | global | `10` | Maximum fĂŒggƑben lĂ©vƑ provider per user | | `PROVIDER_REQUIRE_VALIDATION_SCORE` | global | `3` | Minimum validation score az auto-approve-hoz | | `PROVIDER_DISCOVERY_XP` | global/gamification | `25` | XP jutalom provider felfedezĂ©sĂ©rt | --- ## 7. 🌍 Geo-Logika Ă©s Service Finder Algoritmus ### 7.1 MeglĂ©vƑ Geo TĂĄmogatĂĄs A `ServiceProfile` modell `marketplace/service.py:40` mĂĄr tartalmaz PostGIS `location` mezƑt Ă©s geo-keresĂ©st. A `ServiceProvider` viszont NEM rendelkezik location mezƑvel — csak szöveges cĂ­mmel. ### 7.2 Provider -> ServiceProfile Upgrade Path Az auto-discovered ServiceProvider-ekbƑl kĂ©sƑbb lehet ServiceProfile-t lĂ©trehozni (admin jĂłvĂĄhagyĂĄssal). Ez a folyamat mĂĄr lĂ©tezik a `quick_add_provider()` fĂŒggvĂ©nyben, ami egyszerre hozza lĂ©tre a `ServiceProfile`-t Ă©s a `ServiceProvider`-t. **Javaslat:** Az auto-discovery csak a `ServiceProvider` szintig menjen. A `ServiceProfile` lĂ©trehozĂĄsa maradjon admin feladat. --- ## 8. 🎼 Gamification Pontrendszer RĂ©szletes SpecifikĂĄciĂł ### 8.1 MeglĂ©vƑ PontszabĂĄlyok (point_rules tĂĄbla) Az alĂĄbbi pontszabĂĄlyok mĂĄr lĂ©teznek az adatbĂĄzisban: | action_key | Pont | AktĂ­v | LeĂ­rĂĄs | |------------|------|-------|--------| | `ADD_NEW_PROVIDER` | **500** | ✅ | Új szolgĂĄltatĂł rögzĂ­tĂ©se a rendszerbe | | `USE_UNVERIFIED_PROVIDER` | **200** | ✅ | SzervizesemĂ©ny/költsĂ©g rögzĂ­tĂ©se olyan szolgĂĄltatĂłnĂĄl, aminek mĂ©g nincs 5 megerƑsĂ­tĂ©se | | `UPDATE_PROVIDER` | **100** | ✅ | SzolgĂĄltatĂł adatainak szerkesztĂ©se (kategĂłriĂĄk, cĂ­mkĂ©k frissĂ­tĂ©se) | | `RATE_PROVIDER` | **250** | ✅ | SzolgĂĄltatĂł Ă©rtĂ©kelĂ©se (tagekkel) | | `ASSET_REGISTER` | **100** | ✅ | JĂĄrmƱ regisztrĂĄciĂł | | `ASSET_REVIEW` | **75** | ✅ | JĂĄrmƱ felĂŒlvizsgĂĄlat | | `TEST_ACTION` | **100** | ✅ | Test point rule | ### 8.2 Gamification Rendszer MƱködĂ©se #### PontozĂĄsi Folyamat (`process_activity()`) A `GamificationService.process_activity()` (`gamification_service.py:52`) az alĂĄbbi lĂ©pĂ©seket hajtja vĂ©gre: 1. **Admin KonfigurĂĄciĂł BetöltĂ©se** — `GAMIFICATION_MASTER_CONFIG` JSON a `system_parameters` tĂĄblĂĄbĂłl 2. **Point Rules LekĂ©rĂ©s** — Ha `action_key` meg van adva, a `point_rules` tĂĄblĂĄbĂłl olvassa a pontĂ©rtĂ©keket (admin override) 3. **BĂŒntetĂ©s SzƱrĂ©s** — Ha a user bĂŒntetĂ©s alatt ĂĄll, szorzĂł alkalmazĂĄsa 4. **XP SzĂĄmĂ­tĂĄs** — `final_xp = int(xp_amount * multiplier)` 5. **SzintszĂĄmĂ­tĂĄs** — HatvĂĄnyfĂŒggvĂ©ny: `Level = (XP/500)^(1/1.5) + 1` 6. **Social Pont → Kredit KonverziĂł** — Minden 100 social pont = 1 kredit (Wallet.earned_credits) 7. **NaplĂłzĂĄs** — `PointsLedger` rekord lĂ©trehozĂĄsa #### Master Config AlapĂ©rtĂ©kek ```json { "xp_logic": {"base_xp": 500, "exponent": 1.5}, "penalty_logic": { "recovery_rate": 0.5, "thresholds": {"level_1": 100, "level_2": 500, "level_3": 1000}, "multipliers": {"L0": 1.0, "L1": 0.5, "L2": 0.1, "L3": 0.0} }, "conversion_logic": {"social_to_credit_rate": 100}, "level_rewards": {"credits_per_10_levels": 50} } ``` #### SzorzĂłk BĂŒntetĂ©si Szintek Szerint | Szint | KĂŒszöb (penalty_points) | SzorzĂł | HatĂĄs | |-------|------------------------|--------|-------| | L0 | 0 | 1.0 (100%) | Nincs korlĂĄtozĂĄs | | L1 | 100+ | 0.5 (50%) | Fele annyi XP jĂĄr | | L2 | 500+ | 0.1 (10%) | Csak 10% XP | | L3 | 1000+ | 0.0 (0%) | Teljes blokkolĂĄs | ### 8.3 Javasolt Új PontszabĂĄlyok a Provider Discovery Rendszerhez Az alĂĄbbi Ășj `action_key`-ek lĂ©trehozĂĄsa javasolt a `point_rules` tĂĄblĂĄban: | action_key | Javasolt Pont | LeĂ­rĂĄs | |------------|--------------|--------| | `PROVIDER_DISCOVERY` | **25** | Provider felfedezĂ©se expense rögzĂ­tĂ©skor (external_vendor_name alapjĂĄn) | | `PROVIDER_CONFIRMATION` | **50** | MĂĄr lĂ©tezƑ, de nem 100%-ban megerƑsĂ­tett provider hasznĂĄlata mĂĄsik user ĂĄltal | | `PROVIDER_VERIFIED_USE` | **100** | MĂĄr jĂłvĂĄhagyott (approved) provider hasznĂĄlata | **IndoklĂĄs:** - A `PROVIDER_DISCOVERY` (25 XP) alacsonyabb, mint a `USE_UNVERIFIED_PROVIDER` (200 XP), mert a discovery csak a nĂ©v beĂ­rĂĄsĂĄĂ©rt jĂĄr, mĂ­g a hasznĂĄlatĂ©rt több jĂĄr - A `PROVIDER_CONFIRMATION` (50 XP) egy kompromisszum: a user kap valamennyi XP-t, de kevesebbet, mint aki elƑször fedezte fel - A `PROVIDER_VERIFIED_USE` (100 XP) jutalmazza a mĂĄr ellenƑrzött provider-ek hasznĂĄlatĂĄt ### 8.4 MegbĂ­zhatĂłsĂĄgi ÉrtĂ©k (Trust Score) Rendszer #### Jelenlegi Állapot - **`ServiceProvider.validation_score`** (`social.py:58`) — Integer, default=0. A `quick_add_provider()` 50-re ĂĄllĂ­tja. - **`ServiceProfile.trust_score`** (`service.py:65`) — Integer, default=30. A `quick_add_provider()` nem ĂĄllĂ­tja be expliciten. #### Javasolt Trust Score SzĂĄmĂ­tĂĄs A `ServiceProvider.validation_score` automatikus szĂĄmĂ­tĂĄsa: | EsemĂ©ny | validation_score vĂĄltozĂĄs | |---------|--------------------------| | Új provider lĂ©trehozĂĄsa (discovery) | 0 (alapĂ©rtelmezett) | | Admin jĂłvĂĄhagyĂĄs (approve) | +50 | | MĂĄsodik user hasznĂĄlja (confirmation) | +10 | | Harmadik user hasznĂĄlja | +5 | | Minden tovĂĄbbi user | +2 (max +20-ig) | | ServiceReview (Ă©rtĂ©kelĂ©s) | +5 per review (max +30) | | OCR bizonylat kapcsolĂłdik hozzĂĄ | +3 | **KĂŒszöbĂ©rtĂ©kek:** - `validation_score >= 30` → `ServiceProfile.trust_score = 50` (megbĂ­zhatĂłnak jelölve) - `validation_score >= 70` → `ServiceProfile.trust_score = 80` (nagyon megbĂ­zhatĂł) - `validation_score >= 100` → `ServiceProfile.trust_score = 100` (teljesen megbĂ­zhatĂł) ### 8.5 PĂ©lda: Teljes PontozĂĄsi Folyamat #### Scenario 1: Új provider felfedezĂ©se 1. User A rögzĂ­ti a költsĂ©get `external_vendor_name="JĂĄnos AutĂłszerviz"` 2. A rendszer nem talĂĄlja a `ServiceProvider` tĂĄblĂĄban 3. LĂ©trejön: `ServiceProvider(name="JĂĄnos AutĂłszerviz", status=pending, source=import, validation_score=0, added_by_user_id=A)` 4. Gamification: `PROVIDER_DISCOVERY` → **25 XP** (ha a point_rules-ban van) 5. Gamification: `USE_UNVERIFIED_PROVIDER` → **200 XP** (mĂĄr lĂ©tezƑ szabĂĄly) 6. **Összesen: 225 XP** a user-nek 7. A provider `validation_score` = 0 (mĂ©g nincs megerƑsĂ­tve) #### Scenario 2: MeglĂ©vƑ provider megerƑsĂ­tĂ©se mĂĄsik user ĂĄltal 1. User B rögzĂ­ti a költsĂ©get `external_vendor_name="JĂĄnos AutĂłszerviz"` 2. A rendszer megtalĂĄlja a meglĂ©vƑ `ServiceProvider`-t (status=pending, validation_score=0) 3. Auto-link a meglĂ©vƑ provider-hez 4. Gamification: `PROVIDER_CONFIRMATION` → **50 XP** (Ășj szabĂĄly) 5. Gamification: `USE_UNVERIFIED_PROVIDER` → **200 XP** (mĂĄr lĂ©tezƑ szabĂĄly) 6. **Összesen: 250 XP** a user-nek 7. A provider `validation_score` += 10 → most **10** #### Scenario 3: MĂĄr jĂłvĂĄhagyott provider hasznĂĄlata 1. Admin jĂłvĂĄhagyta a provider-t (validation_score = 50) 2. User C rögzĂ­ti a költsĂ©get Ă©s kivĂĄlasztja a provider-t 3. Gamification: `PROVIDER_VERIFIED_USE` → **100 XP** 4. A provider `validation_score` += 2 → most **52** ### 8.6 Kredit Rendszer - **Social pont → Kredit konverziĂł:** 100 social pont = 1 kredit (Wallet.earned_credits) - A kredit a `Wallet` modellben (`identity/identity.py:248`) tĂĄrolĂłdik - A kredit felhasznĂĄlhatĂł: prĂ©mium funkciĂłk, szolgĂĄltatĂĄsok vĂĄsĂĄrlĂĄsa - **SzintlĂ©pĂ©si jutalom:** Minden 10. szintnĂ©l +50 kredit --- ## 9. 🚀 TovĂĄbbfejlesztĂ©si Javaslatok ### 9.1 RövidtĂĄvĂș (P0 — KötelezƑ) 1. **Auto-discovery hook** az `expenses.py:439` `create_expense` vĂ©gpontban 2. **`find_or_create_provider_by_name()`** szolgĂĄltatĂĄs a `provider_service.py`-ben 3. **Admin provider moderation endpointok** — Ășj `admin_providers.py` 4. **Frontend admin providers oldal** — Ășj `providers/` oldalak 5. **Új point_rules lĂ©trehozĂĄsa:** `PROVIDER_DISCOVERY` (25), `PROVIDER_CONFIRMATION` (50), `PROVIDER_VERIFIED_USE` (100) ### 9.2 KözĂ©ptĂĄvĂș (P1 — Javasolt) 6. **Trigram similarity index** a `service_providers.name` oszlopon a jobb fuzzy match-hez 7. **DuplikĂĄciĂł detektĂĄlĂĄs** — ha kĂ©t user ugyanazt a provider-t tölti fel, merge logika 8. **Bulk import** CSV-bƑl a meglĂ©vƑ provider-ek batch feltöltĂ©sĂ©re 9. **Trust score automatizĂĄlĂĄs** — a `validation_score` automatikus szĂĄmĂ­tĂĄsa a hasznĂĄlati statisztikĂĄk alapjĂĄn ### 9.3 HosszĂștĂĄvĂș (P2 — JövƑbeli) 10. **Provider reputation score** — az AssetCost tranzakciĂłkbĂłl szĂĄmolt automata reputĂĄciĂł 11. **Automata ServiceProfile upgrade** — ha egy provider-nek X db sikeres tranzakciĂłja van 12. **Provider matching OCR-bƑl** — ha egy OCR bizonylaton szereplƑ cĂ©gnĂ©v ismeretlen --- ## 10. 🔐 BiztonsĂĄgi Ă©s NaplĂłzĂĄsi Szempontok ### Audit Log Minden moderĂĄciĂłs akciĂłt (approve, reject, flag) naplĂłzni kell az `AuditLog` tĂĄblĂĄba: - `action`: "PROVIDER_APPROVED" / "PROVIDER_REJECTED" / "PROVIDER_FLAGGED" - `entity_type`: "service_provider" - `entity_id`: provider.id - `actor_id`: admin user ID - `details`: JSON with reason ### RBAC - `providers:moderate` — kĂ©pesĂ©g a provider moderĂĄciĂłs endpointokhoz - `providers:view` — csak olvasĂĄsi jog a provider listĂĄhoz --- ## 11. ✅ JĂłvĂĄhagyĂĄsi Pont (Architect Review) **Jelen dokumentum jĂłvĂĄhagyĂĄsa utĂĄn az alĂĄbbi Gitea kĂĄrtyĂĄk kerĂŒlnek lĂ©trehozĂĄsra:** | # | CĂ­m | Scope | Type | |---|-----|-------|------| | 1 | Auto-discovery hook expense creation-ben | Backend | Feature | | 2 | `find_or_create_provider_by_name()` service | Backend | Feature | | 3 | Admin provider moderation API (admin_providers.py) | Backend, API | Feature | | 4 | Frontend admin providers oldal (list + detail + pending) | Frontend | Feature | | 5 | Sidebar menĂŒ bƑvĂ­tĂ©s providers modullal | Frontend | Feature | --- *JĂłvĂĄhagyĂĄs utĂĄn a Code mĂłdban törtĂ©nƑ implementĂĄciĂł megkezdhetƑ.*