# 🔍 Deep Dive Audit Jelentés — Címek, API sémák & Autónyíri Kft. (ID 58) **Dátum:** 2026-06-17 **Auditor:** Architect Mode **Cél:** A cím szétdarabolás, kapcsolatfelvételi mezők és API sémák állapotának felmérése --- ## 1. ADATBÁZIS SÉMA AUDIT — Organization modell **Fájl:** [`backend/app/models/marketplace/organization.py`](backend/app/models/marketplace/organization.py) ### 1.1 Cím mezők az `Organization` táblában (`fleet.organizations`) A modell **rendelkezik atomizált címmezőkkel**: | Mező | Típus | Hossz | Leírás | |------|-------|-------|--------| | `address_id` | PG_UUID, FK→`system.addresses.id` | - | Opcionális hivatkozás a központi cím táblára | | `address_zip` | String | 10 | Irányítószám | | `address_city` | String | 100 | Város | | `address_street_name` | String | 150 | **Utca név** (pl. "Egressy u.") | | `address_street_type` | String | 50 | **Közterület típus** (pl. "utca", "út", "tér") — jelenleg null | | `address_house_number` | String | 20 | **Házszám** (pl. "4.") — jelenleg null | | `address_hrsz` | String | 50 | Helyrajzi szám | **Megjegyzés:** A `Branch` modell még tovább bontja: `stairwell`, `floor`, `door` — ezek az `Organization`-ben **nincsenek** implementálva, de a `CorpOnboardIn` séma tartalmazza őket. ### 1.2 Kapcsolatfelvételi mezők **Az `Organization` modell NEM tartalmazza a következőket:** - ❌ `contact_phone` - ❌ `contact_email` - ❌ `website` **Ezek a `ServiceProfile` modellben vannak** ([`backend/app/models/marketplace/service.py`](backend/app/models/marketplace/service.py:66)): | Mező | Típus | Tábla | |------|-------|-------| | `contact_phone` | String | `marketplace.service_profiles` | | `contact_email` | String | `marketplace.service_profiles` | | `website` | String | `marketplace.service_profiles` | **Következtetés:** A kapcsolatfelvételi adatok **szét vannak szórva** két tábla között. Az Organization-ben tárolódnak a címadatok, míg a ServiceProfile-ban a telefon/email/weboldal. Ez egy **1:1 kapcsolat** `organization_id`-n keresztül. --- ## 2. API SÉMA AUDIT — Provider Pydantic sémák **Fájl:** [`backend/app/schemas/provider.py`](backend/app/schemas/provider.py) ### 2.1 CRITICAL BUG: A `ProviderQuickAddIn` és `ProviderUpdateIn` sérülékeny Mindkét séma **összevont `street` mezőt** használ: ```python # provider.py sor 59 street: Optional[str] = Field(None, max_length=255, description="Utca, házszám") ``` Eközben a modell (`Organization`) **atomizált** mezőket vár: ```python # organization.py sor 83-86 address_street_name: Mapped[Optional[str]] # Utca név address_street_type: Mapped[Optional[str]] # Közterület típus address_house_number: Mapped[Optional[str]] # Házszám ``` **A `quick_add_provider()` függvény** ([`provider_service.py:403`](backend/app/services/provider_service.py:403)) a teljes `street` sztringet az `address_street_name`-be tömöríti: ```python org.address_street_name = data.street, # "Egressy u. 4." → address_street_name ``` **Következmény:** `address_street_type` és `address_house_number` **mindig `null`** maradnak a crowdsource-olt szolgáltatóknál! ### 2.2 A `ProviderSearchResult` séma hiányosságai A `ProviderSearchResult` ([`provider.py:21`](backend/app/schemas/provider.py:21)) **nem tartalmazza az atomizált címmezőket**: - ❌ `address_street_name` — hiányzik - ❌ `address_street_type` — hiányzik - ❌ `address_house_number` — hiányzik - ❌ `address_hrsz` — hiányzik - ✅ `address_zip` — van - ⚠️ `address` — generic string (összefűzött) - ⚠️ `city` — generic string ### 2.3 A `CorpOnboardIn` séma (organization.py) helyes A [`CorpOnboardIn`](backend/app/schemas/organization.py:10) **helyesen tartalmazza** az összes atomizált mezőt: `address_zip`, `address_city`, `address_street_name`, `address_street_type`, `address_house_number`, `address_stairwell`, `address_floor`, `address_door`, `address_hrsz` Az [`OrganizationUpdate`](backend/app/schemas/organization.py:41) is helyes. --- ## 3. NYERS ADAT — Autónyíri Kft. (ID 58) ### 3.1 Organization rekord ```json { "id": 58, "name": "Autónyíri Kft.", "full_name": "Autónyíri Kft.", "org_type": "service_provider", "status": "pending_verification", "is_verified": false, "is_active": true, "is_deleted": false, "tax_number": null, "reg_number": null, "country_code": "HU", "language": "hu", "default_currency": "HUF", "address_id": null, "address_zip": null, "address_city": "Dunakeszi", "address_street_name": "Egressy u. 4.", "address_street_type": null, "address_house_number": null, "address_hrsz": null, "first_registered_at": "2026-06-16 23:16:23", "lifecycle_index": 1, "subscription_plan": "FREE", "owner_id": 2, "legal_owner_id": null, "folder_slug": "84632013004e", "aliases": [], "tags": [], "external_integration_config": {}, "visual_settings": {"theme": "default", "primary_color": null, "wall_logo_url": null} } ``` ### 3.2 ServiceProfile rekord ```json { "id": 3, "organization_id": 58, "status": "ghost", "contact_phone": null, "contact_email": null, "website": null, "bio": null, "is_verified": false, "trust_score": 30, "rating": null, "specialization_tags": {"primary_category": "auto_szerelo"} } ``` ### 3.3 Branch rekord ```json { "id": "3b80ee85-7712-4b17-b992-d62dcefdf5e2", "name": "Autónyíri Kft.", "is_main": true, "status": "active", "city": "Dunakeszi", "street_name": "Egressy u. 4.", "street_type": null, "house_number": null, "postal_code": null } ``` ### 3.4 Megállapítások az ID=58-ról 1. **Cím szétdarabolás hiánya:** `address_street_name` = "Egressy u. 4." — a teljes utca+házszám egyben. A `street_type` és `house_number` feldolgozatlan. 2. **Nincs kapcsolatfelvételi adat:** `contact_phone`, `contact_email`, `website` — mind `null` a ServiceProfile-ban. 3. **Nincs adószám:** `tax_number` = null — bár ez egy Kft. 4. **Crowdsource-olt rekord:** `external_integration_config` = `{}` (üres) — a source nincs beállítva, bár a kód logikája szerint "crowdsourced" kéne legyen. --- ## 4. ÖSSZEFOGLALÓ — Feltárt problémák | # | Probléma | Hatás | Súlyosság | |---|----------|-------|-----------| | P1 | `ProviderQuickAddIn` és `ProviderUpdateIn` összevont `street` mezőt használ atomizált `address_street_name`/`_type`/`_house_number` helyett | A cím soha nem kerül szétdarabolásra. A `street_type` és `house_number` mindig `null` marad. | 🔴 MAGAS | | P2 | `ProviderSearchResult` séma nem tartalmazza az atomizált címmezőket | A frontend nem tudja megjeleníteni a szétdarabolt címet. | 🟠 KÖZEPES | | P3 | Kapcsolatfelvételi adatok (telefon, email, weboldal) a ServiceProfile-ban vannak, de a gyors felvételkor üresen maradnak | Az Autónyíri Kft.-nek nincs elérhetősége az adatbázisban. | 🟠 KÖZEPES | | P4 | `OrganizationResponse` séma nem adja vissza a címmezőket | A frontend `OrganizationUpdate`-on keresztül írhat címet, de `OrganizationResponse`-on keresztül nem olvassa vissza. | 🟡 ALACSONY | | P5 | A `Branch` modellben is hiányzik a `street_type`/`house_number` az autónyíris rekordnál | A Branch címe is strukturálatlan | 🟡 ALACSONY | ### Javasolt javítási sorrend: 1. **P1:** A `ProviderQuickAddIn` és `ProviderUpdateIn` sémák kiterjesztése atomizált mezőkkel (`address_street_name`, `address_street_type`, `address_house_number`) 2. **P2:** A `ProviderSearchResult` kibővítése az atomizált címmezőkkel 3. **P3:** A frontend űrlapok kiegészítése telefonszám, email és weboldal mezőkkel a gyors felvételnél 4. **P5:** A Branch létrehozásánál a `street_type` és `house_number` mezők feltöltése