195 lines
7.7 KiB
Markdown
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
|