Files
service-finder/plans/logic_spec_admin_user_person_management.md
2026-06-29 14:11:15 +00:00

479 lines
18 KiB
Markdown

# 🏗️ Logic Spec: Admin User & Person Management
## 📋 Metadata
- **Tervező:** Service Finder Rendszer-Architect
- **Státusz:** Draft (jóváhagyásra vár)
- **Masterbook 2 illeszkedés:** `docs/masterbook_2.0.1/User_person_kezelés.md`
- **Érintett domain:** `identity` (Person ↔ User Dual Entity)
---
## 1. 🎯 Célkitűzés
A feladat az adminisztrációs felület teljes körű felhasználókezelési rendszerének megtervezése és megvalósítása, amely kiterjed mind a **Person** (természetes személy), mind a **User** (bejelentkezési entitás) entitásokra. Jelenleg a frontend admin felületen **egyetlen user/person kezelő oldal sem létezik**, a meglévő backend végpontok részlegesek.
### Célok:
1. Admin felhasználói lista oldal létrehozása kereséssel, szűréssel, rendezéssel
2. Felhasználói részletek oldal létrehozása (User + Person adatok egy nézetben)
3. Felhasználók szerkesztése (admin által)
4. Person entitások kezelése (listázás, részletek, merge)
5. Statisztikai adatok megjelenítése (összesítő kártyák, trendek)
6. Szervezeti tagságok áttekintése
---
## 2. 📊 Meglévő Rendszer Állapota
### 2.1 Backend API Végpontok Jelenlegi Állapota
| Végpont | Metódus | Létezik? | Leírás |
|---------|---------|----------|--------|
| `/admin/users` | GET | ✅ Teljes | Listázás, keresés, szűrés, lapozás. Outerjoin User→Person→Address→GeoPostalCode |
| `/admin/users/{user_id}/ban` | POST | ✅ Teljes | Kitiltás audit loggal |
| `/admin/users/{user_id}/penalty` | PATCH | ✅ Teljes | Gamification büntetés |
| `/admin/users/bulk-action` | POST | ✅ Teljes | Tömeges műveletek (ban/unban/soft_delete/restore/hard_delete) |
| `/admin/users/{user_id}` | GET | ❌ Hiányzik | Felhasználó részletes adatai |
| `/admin/users/{user_id}` | PATCH | ❌ Hiányzik | Felhasználó szerkesztése admin által |
| `/admin/users/stats` | GET | ❌ Hiányzik | Felhasználói statisztikák |
| `/admin/persons` | GET | ❌ Hiányzik | Person lista |
| `/admin/persons/{person_id}` | GET | ❌ Hiányzik | Person részletek |
| `/admin/persons/{person_id}` | PATCH | ❌ Hiányzik | Person szerkesztése |
| `/admin/persons/{person_id}/merge` | POST | ❌ Hiányzik | Person merge (duplum kezelés) |
| `/admin/users/{user_id}/memberships` | GET | ❌ Hiányzik | Szervezeti tagságok listája |
### 2.2 Frontend Admin Oldalak Jelenlegi Állapota
| Oldal | Létezik? | Megjegyzés |
|-------|----------|------------|
| `/` (Dashboard) | ✅ | Hardcoded statisztikák |
| `/login` | ✅ | Bejelentkezés |
| `/garages` | ✅ | Garázs lista + részletek |
| `/packages` | ✅ | Csomagkezelés |
| `/permissions` | ✅ | RBAC jogosultsági mátrix |
| `/users` | ❌ | **Hiányzik** |
| `/users/[id]` | ❌ | **Hiányzik** |
| `/persons` | ❌ | **Hiányzik** |
| `/persons/[id]` | ❌ | **Hiányzik** |
---
## 3. 🧠 Dual Entity Adatmodell (Person ↔ User)
### 3.1 Person (természetes személy)
| Mező | Típus | Leírás |
|------|-------|--------|
| `id` | int (PK) | Elsődleges kulcs |
| `id_uuid` | UUID | Külső azonosító |
| `identity_hash` | str | Egyedi hash duplum detektáláshoz |
| `last_name` | str | Vezetéknév |
| `first_name` | str | Keresztnév |
| `phone` | Optional[str] | Telefonszám |
| `mothers_last_name` | Optional[str] | Anyja születési vezetékneve |
| `mothers_first_name` | Optional[str] | Anyja születési keresztneve |
| `birth_place` | Optional[str] | Születési hely |
| `birth_date` | Optional[date] | Születési dátum |
| `identity_docs` | Optional[JSON] | Személyi igazolvány/útlevél adatok |
| `ice_contact` | Optional[JSON] | Emergency contact |
| `is_active` | bool | Aktív-e |
| `is_ghost` | bool | Részleges adatú személy |
| `merged_into_id` | Optional[int] | FK -> persons.id (soft merge) |
| `deleted_at` | Optional[datetime] | Soft delete timestamp |
**Relációk:** `users` (1:N User), `active_user_account` (User), `address` (Address), `memberships` (OrganizationMember), `owned_business_entities` (Organization)
### 3.2 User (bejelentkezési entitás)
| Mező | Típus | Leírás |
|------|-------|--------|
| `id` | int (PK) | Elsődleges kulcs |
| `email` | str (unique) | Email cím |
| `hashed_password` | str | Jelszó hash |
| `role_id` | Optional[int] | FK -> system.roles.id (RBAC) |
| `role` | UserRole enum | SUPERADMIN, ADMIN, MODERATOR, SALES_REP, SERVICE_MGR, USER |
| `person_id` | Optional[int] | FK -> identity.persons.id |
| `subscription_plan` | Optional[str] | Előfizetési csomag |
| `subscription_expires_at` | Optional[datetime] | Előfizetés lejárata |
| `is_vip` | bool | VIP státusz |
| `referral_code` | Optional[str] (unique) | MLM referral kód |
| `referred_by_id` | Optional[int] | FK -> identity.users.id (self-ref) |
| `is_active` | bool | Aktív-e |
| `is_deleted` | bool | Törölt-e |
| `deleted_at` | Optional[datetime] | Törlés időpontja |
| `preferred_language` | str | Nyelv (default: "hu") |
| `region_code` | Optional[str] | Régió kód |
| `preferred_currency` | Optional[str] | Pénznem |
| `scope_level` | Optional[str] | global/country/region/organization |
| `scope_id` | Optional[int] | Scope azonosító |
| `custom_permissions` | Optional[JSON] | Egyedi jogosultságok |
| `alternative_emails` | Optional[JSON] | Alternatív emailek |
| `ui_mode` | str | light/dark (default: "light") |
| `visual_settings` | Optional[JSON] | UI beállítások |
| `active_organization_id` | Optional[int] | Aktív szervezet |
| `max_vehicles` | int | Jármű limit |
| `max_garages` | int | Garázs limit |
**Relációk:** `person` (Person), `system_role` (SystemRole), `referrer` (User self-ref), `wallet` (Wallet), `trust_profile` (UserTrustProfile), `social_accounts` (SocialAccount), `owned_organizations` (Organization), `memberships` (OrganizationMember)
### 3.3 OrganizationMember (tagsági kapcsolat)
| Mező | Típus | Leírás |
|------|-------|--------|
| `organization_id` | int (FK) | -> fleet.organizations.id |
| `user_id` | int (FK) | -> identity.users.id |
| `person_id` | int (FK) | -> identity.persons.id |
| `invited_email` | Optional[str] | Meghívott email |
| `expires_at` | Optional[datetime] | Tagság lejárata |
| `role` | str (OrgUserRole) | owner/admin/member |
| `permissions` | JSONB | Egyedi org jogosultságok |
| `status` | str | active/pending/inactive |
| `is_permanent` | bool | Állandó tagság |
| `is_verified` | bool | Ellenőrzött tagság |
### 3.4 Kapcsolatok Diagram
```mermaid
erDiagram
Person ||--o{ User : "1:N"
Person ||--o| Address : "lakcim"
Person ||--o{ OrganizationMember : "tagsagok"
Person ||--o{ Organization : "tulajdonolt cegek"
Person ||--o| Person : "merged_into (soft merge)"
User ||--o| Person : "tartozik"
User ||--o{ OrganizationMember : "tagsagok"
User ||--o{ Organization : "tulajdonolt szervezetek"
User ||--o| User : "referred_by (MLM)"
User ||--o| SystemRole : "RBAC role"
User ||--o| Wallet : "penztarca"
User ||--o| UserTrustProfile : "trust score"
OrganizationMember }o--|| Organization : "tagja"
```
---
## 4. 🔧 Új Backend API Végpontok Specifikációja
### 4.1 `GET /admin/users/{user_id}` — Felhasználó Részletek
**Cél:** Egy felhasználó összes adatának lekérése, beleértve Person, Address, Wallet, TrustProfile, OrganizationMembership adatokat.
**SQL logika:**
```sql
SELECT u.*, p.*, a.*, w.*, tp.*, om.*
FROM identity.users u
LEFT JOIN identity.persons p ON p.id = u.person_id
LEFT JOIN identity.addresses a ON a.id = p.address_id
LEFT JOIN identity.wallets w ON w.user_id = u.id
LEFT JOIN identity.user_trust_profiles tp ON tp.user_id = u.id
LEFT JOIN marketplace.organization_members om ON om.user_id = u.id
WHERE u.id = :user_id
```
**Válasz struktúra:**
```json
{
"id": 1,
"email": "user@example.com",
"role_id": 2,
"role": "admin",
"is_active": true,
"is_deleted": false,
"is_vip": false,
"preferred_language": "hu",
"region_code": "HU",
"preferred_currency": "HUF",
"subscription_plan": "premium",
"subscription_expires_at": "2026-12-31T23:59:59",
"max_vehicles": 10,
"max_garages": 5,
"active_organization_id": 3,
"scope_level": "organization",
"scope_id": 3,
"created_at": "2026-01-15T08:30:00",
"updated_at": "2026-06-28T14:22:00",
"person": { "id": 1, "last_name": "Nagy", "first_name": "Istvan", ... },
"wallet": { "balance": 15000, ... },
"trust_profile": { "trust_score": 85, ... },
"memberships": [ { "organization_id": 3, "role": "owner", ... } ],
"system_capabilities": [...],
"org_capabilities": [...]
}
```
### 4.2 `PATCH /admin/users/{user_id}` — Felhasználó Szerkesztése
**Admin által szerkeszthető mezők:**
- `email` (csak admin/superadmin)
- `is_active` (letiltás/feloldás)
- `is_vip`
- `preferred_language`, `region_code`, `preferred_currency`
- `subscription_plan`, `subscription_expires_at`
- `max_vehicles`, `max_garages`
- `scope_level`, `scope_id`
- `role_id` (csak superadmin)
- `custom_permissions`
**Person almzők (opcionális):**
- `person.last_name`, `person.first_name`, `person.phone`
- `person.mothers_last_name`, `person.mothers_first_name`
- `person.birth_place`, `person.birth_date`
- `person.identity_docs`
### 4.3 `GET /admin/users/stats` — Felhasználói Statisztikák
```json
{
"total_users": 2847,
"active_users": 2100,
"deleted_users": 120,
"banned_users": 45,
"new_users_today": 12,
"new_users_this_week": 85,
"new_users_this_month": 320,
"users_by_role": {
"superadmin": 2, "admin": 15, "moderator": 8,
"sales_rep": 23, "service_mgr": 45, "user": 2754
},
"users_by_plan": {
"free": 1500, "basic": 800, "premium": 400, "enterprise": 147
},
"users_by_language": { "hu": 2200, "en": 400, "de": 150, "ro": 97 },
"users_with_person": 2600,
"users_without_person": 247,
"registration_trend": [
{ "date": "2026-06-01", "count": 15 },
{ "date": "2026-06-02", "count": 12 }
],
"active_organizations_count": 420,
"total_memberships": 1800
}
```
### 4.4 `GET /admin/persons` — Person Lista
**Paraméterek:** `search`, `is_ghost`, `is_active`, `has_user`, `is_merged`, `skip`, `limit`
**Válasz:**
```json
{
"total": 3000,
"items": [
{
"id": 1, "last_name": "Nagy", "first_name": "Istvan",
"phone": "+36201234567", "birth_date": "1985-03-15",
"is_ghost": false, "is_active": true, "merged_into_id": null,
"users_count": 1,
"active_user": { "id": 1, "email": "user@example.com", "role": "user" },
"address": { "address_city": "Budapest", "address_zip": "1011" }
}
]
}
```
### 4.5 `GET /admin/persons/{person_id}` — Person Részletek
Teljes Person adatlap kapcsolódó User-ekkel, szervezeti tagságokkal, tulajdonolt cégekkel, merge history-val.
### 4.6 `PATCH /admin/persons/{person_id}` — Person Szerkesztése
Person adatok admin általi módosítása (last_name, first_name, phone, birth data, address, identity_docs, is_active, is_ghost).
### 4.7 `POST /admin/persons/{person_id}/merge` — Person Merge
**Body:**
```json
{ "source_person_id": 42, "keep_source_user": false }
```
**Logika:**
1. Ellenorizze, hogy mindket Person letezik es nincs mar merge-elve
2. Forras Person `merged_into_id` -> cel Person ID
3. Forras User-ek `person_id` -> cel Person ID
4. Forras OrganizationMember `person_id` -> cel Person ID
5. Audit log bejegyzes
### 4.8 `GET /admin/users/{user_id}/memberships` — Szervezeti Tagsagok
Egy felhasznalo szervezeti tagsagainak listazasa.
---
## 5. 🖼️ Frontend Admin UI Specifikacio
### 5.1 Oldalak Terkepe
```
frontend_admin/pages/
users/
index.vue -> Felhasznaloi lista (GET /admin/users)
[id]/index.vue -> Felhasznalo reszletek (GET /admin/users/{id})
persons/
index.vue -> Person lista (GET /admin/persons)
[id]/index.vue -> Person reszletek (GET /admin/persons/{id})
```
### 5.2 `users/index.vue` — Felhasznaloi Lista Oldal
**Elrendezes:**
- Header: "Felhasznalok" cim
- **Statisztikai kartyak sor:** Osszes, Aktiv, Torolt, Kitiltott, Mai regisztraciok
- **Keresomezo:** Email, nev, telefonszam
- **Szurolok:** Statusz (active/deleted/banned/all), Szerepkor (role), Elofizetes
- **Tablazat:** ID, Email, Nev (Person), Szerepkor, Statusz (szines jelolo), Elofizetes, Regisztracio datuma, Nyelv, Muveletek
- **Tomeges muveletek checkbox-szal:** Kitiltas, Feloldas, Torles, Visszaallitas
### 5.3 `users/[id]/index.vue` — Felhasznalo Reszlet Oldal
**Tab-ok:**
1. **Attekintes (Overview)** — Alapadatok, statusz, szerepkor
2. **Szemelyes adatok (Person)** — Person adatok, lakcim
3. **Penzingyek (Finance)** — Wallet, elofizetes
4. **Tagsagok (Memberships)** — Szervezeti tagsagok
5. **Bizalom (Trust)** — Trust score, gamification
6. **Tevekenyseg (Activity)** — Naplozott tevekenysegek
### 5.4 `persons/index.vue` — Person Lista Oldal
- Kereso: Nev, telefonszam, szuletesi adatok
- Szurok: Ghost statusz, Aktiv/Inaktiv, Van-e User, Merge statusz
- Tablazat: ID, Nev, Telefon, Szuletesi datum, Userek szama, Aktiv email, Statusz
### 5.5 `persons/[id]/index.vue` — Person Reszlet Oldal
- Szemely adatok
- Kapcsolodo User-ek
- Cim adatok
- Szervezeti tagsagok
- Merge informacio (forras/cel)
- Tulajdonolt cegek
### 5.6 Navigacios Frissites
Oldalsav uj bejegyzesek:
```
Felhasznalok -> /users
Felhasznalok -> /users/
Szemelyek -> /persons/
```
### 5.7 i18n Kovetelmenyek
Uj fordítási kulcsok (`hu.json` / `en.json`):
- `users.title`, `users.search_placeholder`, `users.filter_role`
- `users.status.active`, `users.status.deleted`, `users.status.banned`
- `users.table.id`, `users.table.email`, `users.table.name`, `users.table.role`, `users.table.status`
- `users.bulk.ban`, `users.bulk.unban`, `users.bulk.delete`, `users.bulk.restore`
- `persons.title`, `persons.search_placeholder`
- `person.merge.title`, `person.merge.confirm`, `person.merge.source`, `person.merge.target`
- `stats.total_users`, `stats.active_users`, `stats.new_today`
### 5.8 Permission Check (RBAC)
Minden admin user/person oldalnak ellenoriznie kell:
- `users:view` — Felhasznalok listazasa
- `users:edit` — Felhasznalok szerkesztese
- `users:ban` — Kitiltas
- `users:delete` — Torles
- `persons:view` — Person lista
- `persons:edit` — Person szerkesztes
- `persons:merge` — Person merge
Hasznald a meglévo `admin_permissions.py` rendszert es a `RequirePermission()` fuggoseget.
---
## 6. 📦 EPIC Bontas (3A Granularitas)
### 6.1 EPIC-1: Backend — User Management Vegpontok
| # | Task | Scope | Type | Fuggoseg |
|---|------|-------|------|-----------|
| 1.1 | `GET /admin/users/{user_id}` endpoint | Backend | Feature | - |
| 1.2 | `PATCH /admin/users/{user_id}` endpoint | Backend | Feature | 1.1 |
| 1.3 | `GET /admin/users/stats` endpoint | Backend | Feature | - |
| 1.4 | `GET /admin/users/{user_id}/memberships` | Backend | Feature | 1.1 |
### 6.2 EPIC-2: Backend — Person Management Vegpontok
| # | Task | Scope | Type | Fuggoseg |
|---|------|-------|------|-----------|
| 2.1 | `GET /admin/persons` endpoint | Backend | Feature | - |
| 2.2 | `GET /admin/persons/{person_id}` endpoint | Backend | Feature | 2.1 |
| 2.3 | `PATCH /admin/persons/{person_id}` endpoint | Backend | Feature | 2.2 |
| 2.4 | `POST /admin/persons/{person_id}/merge` | Backend | Feature | 2.2 |
### 6.3 EPIC-3: Frontend — User List & Detail Oldalak
| # | Task | Scope | Type | Fuggoseg |
|---|------|-------|------|-----------|
| 3.1 | `users/index.vue` — Felhasznaloi lista | Frontend | Feature | 1.x |
| 3.2 | `users/[id]/index.vue` — Reszlet oldal | Frontend | Feature | 1.1, 3.1 |
| 3.3 | Navigacios menu frissitese | Frontend | Feature | 3.1 |
### 6.4 EPIC-4: Frontend — Person List & Detail Oldalak
| # | Task | Scope | Type | Fuggoseg |
|---|------|-------|------|-----------|
| 4.1 | `persons/index.vue` — Person lista | Frontend | Feature | 2.x |
| 4.2 | `persons/[id]/index.vue` — Reszlet oldal | Frontend | Feature | 2.2, 4.1 |
### 6.5 EPIC-5: Frontend — Statisztikak & Dashboard
| # | Task | Scope | Type | Fuggoseg |
|---|------|-------|------|-----------|
| 5.1 | Dashboard statisztika kartyak dinamikus adatokkal | Frontend | Feature | 1.3 |
| 5.2 | Felhasznaloi trend diagram komponens | Frontend | Feature | 1.3 |
### 6.6 EPIC-6: i18n & Permission Integration
| # | Task | Scope | Type | Fuggoseg |
|---|------|-------|------|-----------|
| 6.1 | i18n forditasok felvetele (hu/en) | Frontend | Feature | 3.x, 4.x |
| 6.2 | RBAC permission check implementacio | Frontend | Feature | 3.x, 4.x |
---
## 7. 📐 Megvalosítási Terv (Phasing)
### Phase 0 (P0) — Alap Felhasznaloi Muv-eletek
- **Backend:** EPIC-1 (1.1, 1.2, 1.3) — User reszletek, szerkesztes, statisztikak
- **Frontend:** EPIC-3 (3.1) — User lista oldal
- **Indoklas:** A legalapvetobb admin funkcio
### Phase 1 (P1) — Person Management & Tagsagok
- **Backend:** EPIC-1 (1.4), EPIC-2 (2.1, 2.2, 2.3) — Person vegpontok
- **Frontend:** EPIC-3 (3.2), EPIC-4 (4.1) — User reszlet + Person lista
### Phase 2 (P2) — Halado Funkciok
- **Backend:** EPIC-2 (2.4) — Person merge
- **Frontend:** EPIC-4 (4.2), EPIC-5, EPIC-6
---
## 8. ✅ Jovahagyasi Pont
**A terv felulvizsgalatra es jovahagyasra var.**
Kerdesek:
1. **Prioritas:** A Phase 0 -> Phase 1 -> Phase 2 sorrend megfelelo?
2. **Hianyzo funkcio:** Van olyan admin funkcio a user/person kezelesben, ami kimaradt?
3. **Adatbiztonsag:** A szerkesztheto mezo-k listaja (Section 4.2) megfelelo?
4. **Megerosites:** Ha a terv rendben van, kerem a jovahagyast a megvalositas megkezdesehez.
---
## 9. 🔗 Kapcsolodo Fajlok
| Fajl | Leiras |
|------|--------|
| `backend/app/models/identity/identity.py` | Person, User modellek |
| `backend/app/models/marketplace/organization.py` | OrganizationMember modell |
| `backend/app/schemas/user.py` | User/Person Pydantic semak |
| `backend/app/api/v1/endpoints/admin.py` | Meglevo admin vegpontok (list_users, bulk_action) |
| `backend/app/api/v1/endpoints/admin_permissions.py` | RBAC permission management |
| `frontend_admin/pages/index.vue` | Dashboard (statisztikak frissitendok) |
| `frontend_admin/nuxt.config.ts` | Nuxt konfig (i18n, proxy) |
| `docs/masterbook_2.0.1/User_person_kezeles.md` | Masterbook dokumentacio |