Files
service-finder/docs/database_address_audit_2026-06-17.md

195 lines
7.7 KiB
Markdown

# 🔍 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