# đŸ€– Logic Spec: Social 3 – VerifikĂĄlt Szerviz ÉrtĂ©kelĂ©sek (User → Service) **Epic:** 4.1 – GazdasĂĄgi Ă©s KözössĂ©gi Motorok (Economy & Social) **KĂĄrtya:** #66 – Social 3: VerifikĂĄlt Szerviz ÉrtĂ©kelĂ©sek – User → Service **PrioritĂĄs:** Magas – Csak igazolt pĂ©nzĂŒgyi tranzakciĂł utĂĄn lehet Ă©rtĂ©kelni! --- ## 🎯 Modul CĂ©lja Ă©s MasterBook 2 IlleszkedĂ©s A **Social 3** modul a Service Finder közössĂ©gi vĂ©lemĂ©nyrendszerĂ©nek magas szintƱ minƑsĂ©gbiztosĂ­tĂĄsĂĄt valĂłsĂ­tja meg. A MasterBook 2 **“Csak valĂłs tranzakciĂł, valĂłs vĂ©lemĂ©ny”** elvĂ©t követi: egy felhasznĂĄlĂł csak akkor adhat le Ă©rtĂ©kelĂ©st egy szervizrƑl, ha az adott szerviznĂ©l korĂĄbban **igazolt pĂ©nzĂŒgyi tranzakciĂł** (szĂĄmla, fizetĂ©s) törtĂ©nt, Ă©s az Ă©rtĂ©kelĂ©si idƑablak (konfigurĂĄlhatĂł) mĂ©g nem jĂĄrt le. ### đŸ›Ąïž AlapvetƑ BiztonsĂĄgi Elvek 1. **Tranzakció‑alapĂș verifikĂĄciĂł** – `transaction_id` kötelezƑ, Ă©s csak a felhasznĂĄlĂł sajĂĄt tranzakciĂłira hivatkozhat. 2. **IdƑkorlĂĄt** – Az Ă©rtĂ©kelĂ©si lehetƑsĂ©g a tranzakciĂł utĂĄn limitĂĄlt ideig (pl. 30 nap) Ă©l. 3. **Egyszeri Ă©rtĂ©kelĂ©s** – Egy tranzakciĂłt csak egyszer lehet Ă©rtĂ©kelni (UniqueConstraint). 4. **Trust‑Score sĂșlyozĂĄs** – A felhasznĂĄlĂł Gondos Gazda Indexe befolyĂĄsolja, mennyire szĂĄmĂ­t az Ă©rtĂ©kelĂ©se a szerviz globĂĄlis pontszĂĄmĂĄban. --- ## đŸ—„ïž Adatmodell (Alembic Terv) ### 1. Új TĂĄbla: `service_reviews` (marketplace sĂ©ma) | MezƑ | TĂ­pus | KötelezƑ | LeĂ­rĂĄs | |------|-------|----------|---------| | `id` | `bigserial` | ✅ | ElsƑdleges kulcs | | `service_id` | `integer` | ✅ | FK → `marketplace.service_profiles.id` | | `user_id` | `integer` | ✅ | FK → `identity.users.id` | | `transaction_id` | `uuid` | ✅ | FK → **`finance.transactions.id`** (a FinancialLedger transaction_id mezƑje) | | `price_rating` | `smallint` | ✅ | Ár‑értĂ©k arĂĄny (1–10) | | `quality_rating` | `smallint` | ✅ | MinƑsĂ©g (1–10) | | `time_rating` | `smallint` | ✅ | IdƑtartam (1–10) | | `communication_rating` | `smallint` | ✅ | KommunikĂĄciĂł (1–10) | | `comment` | `text` | ❌ | Szabad szöveges vĂ©lemĂ©ny | | `is_verified` | `boolean` | ✅ | AlapĂ©rtelmezetten `true` (mert tranzakció‑alapĂș) | | `created_at` | `timestamptz` | ✅ | LĂ©trehozĂĄs idƑbĂ©lyege | | `updated_at` | `timestamptz` | ❌ | FrissĂ­tĂ©s idƑbĂ©lyege | **Indexek:** - `idx_service_reviews_service` (`service_id`) - `idx_service_reviews_user` (`user_id`) - `idx_service_reviews_transaction` (`transaction_id`) – egyedi index a `UniqueConstraint` miatt **EgyedisĂ©gi korlĂĄt:** - `uq_service_review_transaction` – egy tranzakciĂłhoz csak egy Ă©rtĂ©kelĂ©s tartozhat. **KĂŒlsƑ kulcsok:** - `service_id` → `marketplace.service_profiles.id` (ON DELETE CASCADE) - `user_id` → `identity.users.id` (ON DELETE SET NULL) - `transaction_id` → `finance.transactions.id` (ON DELETE RESTRICT) > **MegjegyzĂ©s:** A `finance.transactions` tĂĄbla jelenleg a `audit.financial_ledger` tĂĄbla `transaction_id` oszlopĂĄval azonosĂ­thatĂł. A FK hivatkozĂĄst ennek megfelelƑen kell felĂ©pĂ­teni. ### 2. FrissĂ­tendƑ TĂĄbla: `service_profiles` (marketplace sĂ©ma) A `service_profiles` tĂĄblĂĄba bekerĂŒlnek az aggregĂĄlt Ă©rtĂ©kelĂ©si adatok: | Új mezƑ | TĂ­pus | LeĂ­rĂĄs | |---------|-------|---------| | `rating_verified_count` | `integer` | Összes verifikĂĄlt Ă©rtĂ©kelĂ©s szĂĄma | | `rating_price_avg` | `decimal(3,2)` | Átlagos ĂĄr‑értĂ©k (1‑10) | | `rating_quality_avg` | `decimal(3,2)` | Átlagos minƑsĂ©g | | `rating_time_avg` | `decimal(3,2)` | Átlagos idƑtartam | | `rating_communication_avg` | `decimal(3,2)` | Átlagos kommunikĂĄciĂł | | `rating_overall` | `decimal(3,2)` | SĂșlyozott összpontszĂĄm (trust‑score‑al szĂĄmolva) | | `last_review_at` | `timestamptz` | LegutĂłbbi Ă©rtĂ©kelĂ©s ideje | --- ## ⚙ Admin Kontroll (Hierarchikus RendszerparamĂ©terek) A hierarchikus `system_parameters` tĂĄblĂĄba kĂ©t Ășj konfigurĂĄciĂłs kulcs kerĂŒl: ### 1. `REVIEW_WINDOW_DAYS` - **AlapĂ©rtĂ©k:** `30` - **Scope:** `GLOBAL` (orszĂĄg‑ vagy rĂ©gió‑specifikus felĂŒlĂ­rhatĂł) - **LeĂ­rĂĄs:** A tranzakciĂł utĂĄn ennyi napig lehet Ă©rtĂ©kelĂ©st bekĂŒldeni. Ha lejĂĄrt, az API `HTTP 410 Gone` hibĂĄt ad vissza. ### 2. `TRUST_SCORE_INFLUENCE_FACTOR` - **AlapĂ©rtĂ©k:** `1.0` - **Scope:** `GLOBAL` - **LeĂ­rĂĄs:** A felhasznĂĄlĂł Gondos Gazda IndexĂ©nek sĂșlyozĂĄsi tĂ©nyezƑje. Pl.: `trust_score = 85` → sĂșly = `1.0 + (85 / 100) = 1.85`. A magasabb trust‑score‑Ăș felhasznĂĄlĂłk Ă©rtĂ©kelĂ©se jobban szĂĄmĂ­t a szerviz összpontszĂĄmĂĄba. **PĂ©lda beillesztĂ©s:** ```sql INSERT INTO system.system_parameters (key, category, value, scope_level, description) VALUES ('REVIEW_WINDOW_DAYS', 'social', '{"value": 30}', 'global', 'ÉrtĂ©kelĂ©si idƑablak napokban'), ('TRUST_SCORE_INFLUENCE_FACTOR', 'social', '{"value": 1.0}', 'global', 'Trust‑score sĂșlyozĂĄsi tĂ©nyezƑ'); ``` --- ## 🧠 Geo‑logika Ă©s Service Finder Algoritmus A verifikĂĄlt Ă©rtĂ©kelĂ©sek közvetlenĂŒl befolyĂĄsoljĂĄk a **Service Finder keresĂ©si rangsorolĂĄsĂĄt**: ### SĂșlyozott PontszĂĄm SzĂĄmĂ­tĂĄsa ``` weighted_score = ( price_avg * price_weight + quality_avg * quality_weight + time_avg * time_weight + communication_avg * communication_weight ) * trust_influence_factor ``` Ahol a sĂșlyok a `system_parameters`‑bƑl szĂĄrmaznak (alapĂ©rtĂ©k: mindegyik 0.25). ### KeresĂ©si RangsorolĂĄs A `ServiceFinder` algoritmus a következƑ tĂ©nyezƑket veszi figyelembe: 1. **VerifikĂĄlt Ă©rtĂ©kelĂ©sek szĂĄma** – minĂ©l több, annĂĄl megbĂ­zhatĂłbb a pontszĂĄm. 2. **Trust‑score sĂșlyozĂĄs** – a magasabb Gondos Gazda IndexƱ felhasznĂĄlĂłk vĂ©lemĂ©nye többet nyom. 3. **FrissessĂ©g** – a legutĂłbbi Ă©rtĂ©kelĂ©sek nagyobb sĂșllyal szerepelnek (exponenciĂĄlis lecsengĂ©s). ### Cache‑elĂ©s A `service_profiles` tĂĄblĂĄban tĂĄrolt aggregĂĄlt Ă©rtĂ©kek **percenkĂ©nt frissĂŒlnek** egy hĂĄttĂ©r‑worker (`service_rating_aggregator`) ĂĄltal, Ă­gy a keresĂ©si lekĂ©rdezĂ©sek nem terhelik Ă©lƑben az adatbĂĄzist. --- ## 🔗 FĂŒggƑsĂ©gek (Dependencies) ### Bemenet (Mikre tĂĄmaszkodik) - **Finance modul:** `audit.financial_ledger` (transaction_id egyedisĂ©ge Ă©s ĂĄllapota). - **Identity modul:** `identity.users` (user_id) Ă©s `identity.user_trust_profiles` (trust‑score). - **Marketplace modul:** `marketplace.service_profiles` (service_id). ### Kimenet (Mik tĂĄmaszkodnak rĂĄ) - **Service Finder keresƑmotor:** A sĂșlyozott Ă©rtĂ©kelĂ©sek befolyĂĄsoljĂĄk a szervizek rangsorolĂĄsĂĄt. - **AnalyticsService:** A TCO/km szĂĄmĂ­tĂĄsokhoz szĂŒksĂ©ges a szerviz minƑsĂ©gi mutatĂłja. - **Gamification Engine:** ÉrtĂ©kelĂ©s‑írĂĄsĂ©rt XP‑jutalom jĂĄr (csak verifikĂĄlt tranzakciĂł esetĂ©n). --- ## đŸ› ïž Technikai SpecifikĂĄciĂłk ### 1. Service RĂ©teg (`marketplace_service.py`) Új fĂŒggvĂ©nyek: - `create_verified_review(service_id, user_id, transaction_id, ratings, comment)` 1. EllenƑrzi, hogy a `transaction_id` lĂ©tezik‑e Ă©s a `user_id`‑hoz tartozik‑e. 2. EllenƑrzi, hogy a tranzakciĂł idƑpontja a `REVIEW_WINDOW_DAYS`‑on belĂŒl van‑e. 3. Ha minden ok, beszĂșrja a `service_reviews` tĂĄblĂĄba. 4. ElindĂ­tja a hĂĄttĂ©r‑aggregĂĄtort (`update_service_rating_aggregates`). - `update_service_rating_aggregates(service_id)` - ÚjraszĂĄmolja az összes aggregĂĄlt mezƑt a `service_profiles` tĂĄblĂĄban. ### 2. API VĂ©gpontok (`marketplace.py`) - **`POST /api/v1/services/{service_id}/reviews`** SzigorĂș validĂĄciĂł: `transaction_id` kötelezƑ, a hitelesĂ­tett felhasznĂĄlĂłnak kell lennie a tranzakciĂł tulajdonosĂĄnak. - **`GET /api/v1/services/{service_id}/reviews`** LapozhatĂł listĂĄzĂĄs, opcionĂĄlis szƱrĂ©s `is_verified` szerint. ### 3. HĂĄttĂ©r‑feldolgozĂĄs - **Rating Aggregator Worker:** PercenkĂ©nt frissĂ­ti a `service_profiles` aggregĂĄlt Ă©rtĂ©keit. - **LejĂĄrt Ă©rtĂ©kelĂ©si ablakok figyelĂ©se:** Napi egyszer jelez, ha egy tranzakciĂł Ă©rtĂ©kelĂ©si ablaka lejĂĄrt (Ă©rtesĂ­tĂ©s a felhasznĂĄlĂłnak). --- ## 📊 MigrĂĄciĂłs Terv (Alembic) ### 1. LĂ©pĂ©s: Új tĂĄbla lĂ©trehozĂĄsa ```python # migrations/versions/xxxx_verified_service_reviews.py def upgrade(): op.create_table( 'service_reviews', sa.Column('id', sa.BigInteger(), primary_key=True), sa.Column('service_id', sa.Integer(), nullable=False), sa.Column('user_id', sa.Integer(), nullable=False), sa.Column('transaction_id', sa.UUID(), nullable=False), # ... tovĂĄbbi mezƑk schema='marketplace' ) op.create_foreign_key( 'fk_service_reviews_transaction', 'service_reviews', 'financial_ledger', ['transaction_id'], ['transaction_id'], source_schema='marketplace', referent_schema='audit' ) op.create_unique_constraint( 'uq_service_review_transaction', 'service_reviews', ['transaction_id'], schema='marketplace' ) ``` ### 2. LĂ©pĂ©s: `service_profiles` bƑvĂ­tĂ©se aggregĂĄlt mezƑkkel ### 3. LĂ©pĂ©s: RendszerparamĂ©terek beszĂșrĂĄsa --- ## ✅ TesztelĂ©si ScenĂĄriĂłk 1. **Sikeres Ă©rtĂ©kelĂ©s:** ValĂłs tranzakciĂł, idƑablakon belĂŒl, elsƑ Ă©rtĂ©kelĂ©s. 2. **DuplikĂĄlt tranzakciĂł:** Ugyanazt a tranzakciĂłt mĂĄsodszor nem lehet Ă©rtĂ©kelni (409 Conflict). 3. **IdƑablak lejĂĄrt:** A tranzakciĂł több mint 30 napos → 410 Gone. 4. **Nem a felhasznĂĄlĂł tranzakciĂłja:** MĂĄsik user transaction_id‑jĂĄt hasznĂĄlja → 403 Forbidden. 5. **Trust‑score sĂșlyozĂĄs:** KĂ©t felhasznĂĄlĂł (trust 30 vs 90) Ă©rtĂ©kelĂ©sei kĂŒlönbözƑ sĂșllyal szĂĄmĂ­tanak. --- ## 🚀 KövetkezƑ LĂ©pĂ©sek (3A GranularitĂĄs) 1. **Alembic migrĂĄciĂł** – `service_reviews` tĂĄbla lĂ©trehozĂĄsa. 2. **System paramĂ©terek** – `REVIEW_WINDOW_DAYS` Ă©s `TRUST_SCORE_INFLUENCE_FACTOR` beszĂșrĂĄsa. 3. **Service rĂ©teg** – `create_verified_review` logika implementĂĄlĂĄsa. 4. **API vĂ©gpontok** – `POST /services/{id}/reviews` Ă©s `GET /services/{id}/reviews`. 5. **HĂĄttĂ©r‑aggregĂĄtor** – PercenkĂ©nti rating‑frissĂ­tĂ©s. 6. **TesztelĂ©s** – IntegrĂĄciĂłs tesztek a fenti scenĂĄriĂłkra. 7. **DokumentĂĄciĂł** – Swagger + felhasznĂĄlĂłi kĂ©zikönyv. --- ## ⚠ KockĂĄzatok Ă©s MegoldĂĄsok | KockĂĄzat | MegoldĂĄs | |----------|----------| | A `finance.transactions` tĂĄbla nem lĂ©tezik, csak `audit.financial_ledger` | FK a `financial_ledger.transaction_id`‑re mutat, a sĂ©ma neve `audit`. | | Trust‑score mĂ©g nincs minden felhasznĂĄlĂłnĂĄl | AlapĂ©rtĂ©k 50, a sĂșlyozĂĄs ezzel mƱködik. | | TĂșl sok Ă©rtĂ©kelĂ©s terheli az Ă©lƑ adatbĂĄzist | AggregĂĄlt mezƑk + cache‑elĂ©s (percenkĂ©nti hĂĄttĂ©r‑frissĂ­tĂ©s). | --- **JĂłvĂĄhagyĂĄs szĂŒksĂ©ges:** A fenti tervezet alapjĂĄn lehet tovĂĄbblĂ©pni a megvalĂłsĂ­tĂĄsra. A migrĂĄciĂłs szkriptek Ă©s a API vĂ©gpontok pontos kĂłdja csak a jĂłvĂĄhagyĂĄs utĂĄn kĂ©szĂŒl el.