# 🏗️ 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