# 🐛 logic_spec: Quick-add provider cĂ©gek megjelennek a "CĂ©geim" menĂŒben **KĂĄrtya:** #266 **StĂĄtusz:** TervezĂ©s kĂ©sz, kivitelezĂ©s elƑtt **Architect:** Service Finder Rendszer-Architect --- ## 1. ProblĂ©ma összefoglalĂł A gyors szolgĂĄltatĂł felvĂ©tel (`quick_add_provider`) sorĂĄn lĂ©trejövƑ `service_provider` tĂ­pusĂș szervezetek hĂĄrom problĂ©mĂĄt okoznak: | # | ProblĂ©ma | HatĂĄs | |---|----------|-------| | 1 | **"CĂ©geim" menĂŒben valĂł megjelenĂ©s** | A `service_provider` tĂ­pusĂș szervezetek megjelennek a felhasznĂĄlĂł sajĂĄt cĂ©gei között | | 2 | **Tulajdonos hiĂĄnya** | A `GET /my` response nem adja vissza az `owner_id` mezƑt; Ășj provider-eknĂ©l `owner_id=null` lehet | | 3 | **StĂĄtusz megjelenĂ­tĂ©s** | BĂĄr a DB-ben `status='pending_verification'`, a UI mĂĄst mutathat | --- ## 2. Érintett fĂĄjlok ### Backend - `backend/app/api/v1/endpoints/organizations.py:177` — `GET /my` lekĂ©rdezĂ©s - `backend/app/services/provider_service.py:468` — `quick_add_provider()` fĂŒggvĂ©ny ### Frontend - `frontend/src/components/header/HeaderCompanySwitcher.vue:142` — `companyOrganizations` szƱrƑ - `frontend/src/stores/auth.ts:589` — `fetchMyOrganizations()` hĂ­vĂĄs --- ## 3. HibaelemzĂ©s rĂ©szletesen ### 3.1. `GET /my` endpoint (`organizations.py:183-186`) ```python stmt = ( select(Organization) .join(OrganizationMember) .where(OrganizationMember.user_id == current_user.id) ) ``` **Hiba:** Nincs `org_type` szƱrĂ©s. Minden szervezetet visszaad, ahol a user tag. **Response (193-206. sor):** Nem adja vissza az `owner_id` mezƑt. ### 3.2. `HeaderCompanySwitcher.vue:142-146` ```typescript const companyOrganizations = computed(() => { return authStore.myOrganizations.filter( (org) => org.org_type && org.org_type !== 'individual' ) }) ``` **Hiba:** Csak az `individual` tĂ­pust szƱri ki. A `service_provider`, `service` tĂ­pusĂș szervezetek ĂĄtmennek a szƱrƑn. ### 3.3. `quick_add_provider()` (`provider_service.py:521-646`) - LĂ©trehoz egy `Organization`-t `org_type='service_provider'`-rel (526. sor) - BeĂĄllĂ­tja `owner_id=user_id` (541. sor) - **LĂ©trehoz `OrganizationMember`-et `role=OWNER`-rel** (638-646. sor) → ez miatt a `GET /my` visszaadja a szervezetet ### 3.4. AdatbĂĄzis stĂĄtusz ```sql SELECT column_default FROM information_schema.columns WHERE table_schema='fleet' AND table_name='organizations' AND column_name='status'; -- Result: 'pending_verification'::character varying ``` A DB default helyes. A service_providerek `status='pending_verification'`, `is_verified=false`. --- ## 4. JavĂ­tĂĄsi terv ### 4.1. Backend: `GET /my` endpoint szƱrĂ©s **FĂĄjl:** `backend/app/api/v1/endpoints/organizations.py:177` **MĂłdosĂ­tĂĄs:** Adjunk hozzĂĄ `org_type` szƱrĂ©st, hogy csak a valĂłdi cĂ©ges tĂ­pusok (`business`, `fleet_owner`, `individual`) jelenjenek meg: ```python stmt = ( select(Organization) .join(OrganizationMember) .where(OrganizationMember.user_id == current_user.id) .where(Organization.org_type.in_([OrgType.business, OrgType.fleet_owner, OrgType.individual])) ) ``` **AlternatĂ­va:** SzƱrjĂŒk ki a `service_provider` Ă©s `service` tĂ­pusokat: ```python .where(Organization.org_type.notin_([OrgType.service_provider, OrgType.service])) ``` ### 4.2. Frontend: `HeaderCompanySwitcher` szƱrĂ©s (biztonsĂĄgi rĂ©teg) **FĂĄjl:** `frontend/src/components/header/HeaderCompanySwitcher.vue:142` **MĂłdosĂ­tĂĄs:** SzƱrjĂŒk ki a `service_provider` Ă©s `service` tĂ­pusokat is: ```typescript const companyOrganizations = computed(() => { return authStore.myOrganizations.filter( (org) => org.org_type && org.org_type !== 'individual' && org.org_type !== 'service_provider' && org.org_type !== 'service' ) }) ``` ### 4.3. Backend: `GET /my` response kiegĂ©szĂ­tĂ©se **FĂĄjl:** `backend/app/api/v1/endpoints/organizations.py:193` **MĂłdosĂ­tĂĄs:** Adjuk hozzĂĄ az `owner_id` mezƑt a response-hoz: ```python return [ { "organization_id": o.id, "owner_id": o.owner_id, # NEW "status": o.status, # ... existing fields } for o in orgs ] ``` ### 4.4. Backend: `quick_add_provider` OrganizationMember lĂ©trehozĂĄsĂĄnak felĂŒlvizsgĂĄlata **FĂĄjl:** `backend/app/services/provider_service.py:632` **MegfontolandĂł:** A `quick_add_provider()` lĂ©trehozza az `OrganizationMember`-et `role=OWNER`-rel. Ez lehetƑvĂ© teszi a user szĂĄmĂĄra a provider szerkesztĂ©sĂ©t (access control miatt), de emiatt a provider megjelenik a "CĂ©geim" listĂĄban. **MegoldĂĄs:** Ha a 4.1-es Ă©s 4.2-es javĂ­tĂĄsok Ă©letbe lĂ©pnek, akkor a service_provider tĂ­pusĂș szervezetek nem fognak megjelenni a "CĂ©geim" listĂĄban, Ă­gy az OrganizationMember lĂ©trehozĂĄsa tovĂĄbbra is mƱködhet az access control miatt. ### 4.5. AdatbĂĄzis: hiĂĄnyzĂł `owner_id`-k pĂłtlĂĄsa **MegfontolandĂł:** A rĂ©gebbi service_providerek, amik robot ĂĄltal vagy mĂĄs Ășton jöttek lĂ©tre Ă©s nincs `owner_id`-jĂŒk, kapjanak alapĂ©rtelmezett ownershipet vagy maradjanak owner nĂ©lkĂŒl. --- ## 5. Masterbook 2.0 illeszkedĂ©s | Elv | IlleszkedĂ©s | |-----|-------------| | **Dual Entity** | Az Organization (cĂ©g) Ă©s a User (technikai fiĂłk) szĂ©tvĂĄlasztĂĄsa helyes. A `service_provider` tĂ­pusĂș szervezeteket nem szabad a user sajĂĄt cĂ©gekĂ©nt kezelni. | | **DDD SzeparĂĄciĂł** | A `marketplace` domain (service_provider) Ă©s a `fleet` domain (business/fleet_owner) adatai nem keveredhetnek a UI-n. | | **Access Control** | Az OrganizationMember lĂ©trehozĂĄsa tovĂĄbbra is szĂŒksĂ©ges a provider szerkesztĂ©sĂ©hez, de a UI-n valĂł megjelenĂ­tĂ©st megfelelƑen kell szƱrni. | --- ## 6. TesztelĂ©si terv 1. **Unit teszt:** `GET /my` endpoint hĂ­vĂĄsa service_provider tĂ­pusĂș szervezettel → nem jelenik meg 2. **IntegrĂĄciĂłs teszt:** quick-add provider lĂ©trehozĂĄsa → nem jelenik meg a CĂ©geim listĂĄban 3. **Frontend teszt:** HeaderCompanySwitcher megjelenĂ­tĂ©se service_provider tĂ­pusĂș org-gal → nem jelenik meg 4. **AdatbĂĄzis teszt:** service_provider rekordok `status` Ă©s `owner_id` ellenƑrzĂ©se --- ## 7. JĂłvĂĄhagyĂĄsi pont A fenti terv alapjĂĄn a javĂ­tĂĄs kivitelezĂ©sĂ©hez az alĂĄbbi mĂłdosĂ­tĂĄsok szĂŒksĂ©gesek: - [ ] `organizations.py`: `GET /my` endpoint szƱrĂ©s `org_type` alapjĂĄn - [ ] `organizations.py`: `owner_id` hozzĂĄadĂĄsa a response-hoz - [ ] `HeaderCompanySwitcher.vue`: `service_provider` Ă©s `service` kiszƱrĂ©se - [ ] AdatbĂĄzis audit: hiĂĄnyzĂł `owner_id`-k ellenƑrzĂ©se **Architect jĂłvĂĄhagyĂĄsa:** ⏳ FĂŒggƑben