180 lines
6.4 KiB
Markdown
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
|