139 lines
5.7 KiB
Markdown
139 lines
5.7 KiB
Markdown
# 🏗️ Logic Spec: Cég Garázsa (Company Onboarding & Garage UI)
|
|
|
|
## 1. Cél
|
|
|
|
Lehetővé tenni a felhasználó számára, hogy:
|
|
1. Létrehozzon egy céget/szervezetet (Company Onboarding) 3 egyszerű lépésben
|
|
2. A jobb felső sarokban lévő "Cég Garázsa" gombbal gyorsan elérje a cég flottáját
|
|
3. Válthasson a személyes garázsa és a cég garázsa között
|
|
|
|
## 2. Meglévő Backend API
|
|
|
|
### Már létező végpontok:
|
|
- **POST /api/v1/organizations/onboard** - Szervezet létrehozása (CorpOnboardIn séma)
|
|
- **GET /api/v1/organizations/my** - Felhasználó szervezeteinek listája
|
|
|
|
### CorpOnboardIn séma mezői:
|
|
full_name, name, display_name, tax_number, reg_number, country_code, language, default_currency, address_zip, address_city, address_street_name, address_street_type, address_house_number, address_stairwell, address_floor, address_door, address_hrsz, contacts
|
|
|
|
### Modell: Organization (fleet.organizations) + OrganizationMember + Branch
|
|
|
|
## 3. 3 Kártyára Bontva
|
|
|
|
### #217 - Backend API bővítés
|
|
**Végpontok:**
|
|
1. GET /api/v1/organizations/{org_id} - Részletes adatok
|
|
2. PUT /api/v1/organizations/{org_id} - Frissítés
|
|
3. PATCH /api/v1/users/me/active-organization - Aktív szervezet váltás
|
|
4. DELETE /api/v1/organizations/{org_id} - Soft-delete
|
|
|
|
### #218 - Frontend 3-lépéses Onboarding UI
|
|
**Komponensek:**
|
|
1. CompanyOnboardingView.vue - 3-lépéses wizard (/company/onboard)
|
|
2. CompanyGarageView.vue - Cég garázs (/company/garage)
|
|
3. i18n kulcsok bővítése
|
|
4. Router bővítés
|
|
|
|
### #219 - Cég Garázsa gomb + szervezetváltás
|
|
**Header gomb 3 állapota:**
|
|
1. Nincs cég -> "Cég létrehozása" -> /company/onboard
|
|
2. Van cég, személyes mód -> "Cég Garázsa" -> PATCH + /company/garage
|
|
3. Cég mód -> "Személyes mód" -> PATCH null + /dashboard
|
|
|
|
## 4. Header Layout
|
|
```
|
|
LOGO [≡ Funkciók] [🏢 Cég Garázsa] [🌐 EN] 👤
|
|
```
|
|
|
|
## 5. Végrehajtási Sorrend
|
|
1. #217 Backend API (előfeltétel)
|
|
2. #218 Frontend Onboarding UI
|
|
3. #219 Cég Garázsa gomb integráció
|
|
|
|
---
|
|
|
|
## 6. Vizsgálati Eredmények (2026-06-07) - users.py audit
|
|
|
|
### 6.1 PATCH /users/me/active-organization - MÁR IMPLEMENTÁLVA!
|
|
A [`users.py`](backend/app/api/v1/endpoints/users.py:371) (371-434. sor) tartalmazza az aktív szervezet váltás végpontot:
|
|
- Validálja, hogy a user tagja-e a szervezetnek (`OrganizationMember` lekérdezés)
|
|
- Frissíti a `scope_id`-t az adatbázisban
|
|
- Új JWT tokent generál a frissített `scope_id`-val
|
|
- Visszaadja `UserWithTokenResponse`-t (user + új token)
|
|
|
|
### 6.2 PersonUpdate schema - NEM alkalmas cégadatokra
|
|
A [`PersonUpdate`](backend/app/schemas/user.py:69) séma (69-91. sor) CSAK személyes adatokat tartalmaz:
|
|
- `first_name`, `last_name`, `phone`
|
|
- `mothers_last_name`, `mothers_first_name`
|
|
- `birth_place`, `birth_date`
|
|
- `identity_docs` (személyi, útlevél, jogsi)
|
|
- `address_*` mezők
|
|
- **NINCSENEK benne cég/business mezők**
|
|
|
|
### 6.3 Aktív szervezet váltás frontend integráció
|
|
A frontend [`auth store`](frontend/src/stores/auth.ts:53) már tartalmazza:
|
|
- `active_organization_id: number | null` a `UserProfile` interfészben
|
|
- `scope_level`, `scope_id` mezők
|
|
|
|
### 6.4 Következtetés
|
|
A **#217** kártya eredeti tervéből a `PATCH /users/me/active-organization` végpont **MÁR KÉSZ**.
|
|
**Amit még kell a #217-ben:**
|
|
- `GET /api/v1/organizations/{org_id}` - cég részletes adatainak lekérése
|
|
- `PUT /api/v1/organizations/{org_id}` - cég adatainak frissítése
|
|
- `DELETE /api/v1/organizations/{org_id}` - soft-delete
|
|
|
|
### 6.5 Típus inkonzisztencia
|
|
Az [`ActiveOrganizationUpdate`](backend/app/schemas/user.py:107) séma `organization_id` mezője `Optional[str]` típusú, de az adatbázisban `integer`-ként használódik. Javítandó: `Optional[int]`.
|
|
|
|
## 7. Végrehajtási Sorrend (Frissítve)
|
|
1. **#217** Backend API (már csak GET/PUT/DELETE kell - PATCH kész)
|
|
2. **#218** Frontend Onboarding UI
|
|
3. **#219** Cég Garázsa gomb integráció
|
|
|
|
---
|
|
|
|
## 8. KYC Privát Cég Vizsgálat (2026-06-07)
|
|
|
|
### 8.1 Hogyan jön létre a privát cég?
|
|
A KYC lezárásakor az [`AuthService.complete_kyc`](backend/app/services/auth_service.py:249) metódus automatikusan létrehoz egy privát szervezetet:
|
|
|
|
```python
|
|
new_org = Organization(
|
|
full_name=org_full_name, # "{last_name} Flotta"
|
|
name=f"{p.last_name} Széfe", # pl. "Nagy Széfe"
|
|
org_type=OrgType.individual, # <-- PRIVÁT CÉG FLAG!
|
|
owner_id=user.id,
|
|
status="verified", # Azonnal verified
|
|
...
|
|
)
|
|
```
|
|
|
|
### 8.2 Van flag a privát cég azonosítására?
|
|
**IGEN.** Az [`OrgType`](backend/app/models/marketplace/organization.py:19) enum `individual` értéke szolgál privátcég-jelzőként.
|
|
|
|
| org_type érték | Jelentés | Hol jön létre? |
|
|
|---|---|---|
|
|
| `individual` | Privát személyes "széf" | KYC lezárás (`auth_service.py:255`) |
|
|
| `business` | Valódi cég | `/organizations/onboard` végpont (`organizations.py:70`) |
|
|
| `service` | Szerviz | Későbbi regisztráció |
|
|
| `service_provider` | Szolgáltató partner | Későbbi regisztráció |
|
|
| `fleet_owner` | Flottatulajdonos | Későbbi regisztráció |
|
|
| `club` | Klub | Későbbi regisztráció |
|
|
|
|
### 8.3 Különbségek: Privát vs Valódi cég
|
|
|
|
| Tulajdonság | Privát (KYC) | Valódi (/onboard) |
|
|
|---|---|---|
|
|
| `org_type` | `individual` | `business` |
|
|
| `status` | `verified` | `pending_verification` |
|
|
| `tax_number` | NULL | Kötelező |
|
|
| Név | `"{last_name} Flotta"` | Valós cégnév |
|
|
| Branch | `"Home Base"` | `"Központi Telephely"` |
|
|
|
|
### 8.4 Hatás a #219-es kártyára
|
|
A "Cég Garázsa" gomb logikája:
|
|
1. `GET /organizations/my` → visszaadja a user összes szervezetét
|
|
2. `org_type == "individual"` → privát garázs gomb
|
|
3. `org_type == "business"` → cég garázs gomb
|
|
4. `PATCH /users/me/active-organization` → váltás a kettő között
|