Files
service-finder/plans/logic_spec_provider_cegeim_bugfix.md
2026-06-17 22:07:55 +00:00

180 lines
6.4 KiB
Markdown

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