backend admin flotta bekötése

This commit is contained in:
Roo
2026-06-26 01:21:15 +00:00
parent 36109fc722
commit c75c7b2270
17 changed files with 3014 additions and 532 deletions

View File

@@ -492,3 +492,220 @@ Dinamikus permission management UI építése a DB-driven RBAC rendszerhez. Back
- `_build_user_response` async függvény, ami `rbac_service.get_role_permissions(db, role_id)`-t hív
- `/auth/me` és `/users/me` endpoint-ok 38 db system_capabilities-t adnak vissza (mind True)
- `Capability` osztály eltávolítva a kódbázisból
## 2026-06-25 - P0 EXECUTION: Garage CRM Completion (Status & Edit)
### 🎯 Cél
Garázs CRM funkciók teljes körű implementálása: backend státuszváltó és adatszerkesztő végpontok, frontend UI integráció a listázó és részletes oldalakon.
### 🔧 Módosított fájlok
**1. Backend API - [`backend/app/api/v1/endpoints/admin_organizations.py`](backend/app/api/v1/endpoints/admin_organizations.py:512)**
- `PUT /{org_id}/status` — Státuszváltó végpont (`OrgStatusUpdate` séma): validálja a státuszt (active/inactive/suspended/pending_verification), szinkronizálja `org.is_active`-t, rögzíti `last_deactivated_at`-t. Védve: `Depends(RequirePermission("org:edit"))`.
- `PUT /{org_id}` — Adatszerkesztő végpont (`OrganizationUpdate` séma): 10 mező (name, full_name, display_name, tax_number, reg_number, address_zip/city/street_name/street_type/house_number). Csak a nem-None mezőket frissíti. Védve: `Depends(RequirePermission("org:edit"))`.
**2. Frontend Lista - [`frontend_admin/pages/garages/index.vue`](frontend_admin/pages/garages/index.vue)**
- `toggleStatus()` függvény: valós API hívással (`PUT /api/v1/admin/organizations/{id}/status`), dinamikus gombszín (piros/zöld), success/error toast, automatikus refresh.
**3. Frontend Részletek - [`frontend_admin/pages/garages/[id]/index.vue`](frontend_admin/pages/garages/[id]/index.vue)**
- "Adatok Szerkesztése" gomb a header-ben
- Edit Modal: 8 mező (full_name, display_name, tax_number, reg_number, address_zip/city/street_name/street_type/house_number), pre-fill, Mentés → `PUT /api/v1/admin/organizations/{id}`, success/error toast, automatikus refresh
**4. i18n - [`frontend_admin/i18n/locales/hu.json`](frontend_admin/i18n/locales/hu.json) + [`frontend_admin/i18n/locales/en.json`](frontend_admin/i18n/locales/en.json)**
- `garages.details.edit_details`, `garages.details.save`, `garages.details.zip`, `garages.details.city`, `garages.details.street_name`, `garages.details.street_type`, `garages.details.house_number` kulcsok (magyar + angol)
### ✅ Verifikáció
- **Sync Engine:** ✅ 1265 OK, 0 Fixed, 0 Extra
- **PUT status (inactive):** ✅ 200 — "A(z) 'KYC Garázsa' garázs státusza frissítve: 'active' → 'inactive'."
- **PUT status (active):** ✅ 200 — "A(z) 'KYC Garázsa' garázs státusza frissítve: 'inactive' → 'active'."
- **PUT update:** ✅ 200 — "A(z) 'KYC Garázsa' garázs adatai frissítve." (updated_fields: ['display_name'])
## 2026-06-25 - P0 Garage CRM Expansion: Contact/Billing Fields, Fleet Tab, RBAC UI
### 🎯 Cél
Teljes Garage CRM profil bővítése: kapcsolattartói, számlázási és értesítési cím mezők hozzáadása a backendhez, flotta járművek végpont létrehozása, és a frontend garancia részletes nézetének teljes körű implementálása RBAC védelemmel.
### 🔧 Módosított Fájlok
**1. BACKEND - Modell (`backend/app/models/marketplace/organization.py`)**
- 14 új oszlop hozzáadva a `Organization` modellhez:
- `contact_person_name`, `contact_email`, `contact_phone` (kapcsolattartó)
- `billing_zip`, `billing_city`, `billing_street_name`, `billing_street_type`, `billing_house_number` (számlázási cím)
- `notification_zip`, `notification_city`, `notification_street_name`, `notification_street_type`, `notification_house_number` (értesítési cím)
**2. BACKEND - API Végpont (`backend/app/api/v1/endpoints/admin_organizations.py`)**
- `OrganizationUpdate` séma bővítve a 14 új mezővel
- `GarageDetailsResponse` séma bővítve ugyanezen mezőkkel
- Új `GET /{org_id}/vehicles` végpont létrehozva (`GarageVehicleItem`, `GarageFleetResponse` sémákkal)
- `GarageVehicleItem` mezői: id, license_plate, vin, brand, model, year, color, status, branch_name, created_at
**3. FRONTEND - i18n (`frontend_admin/i18n/locales/hu.json`, `en.json`)**
- Új kulcsok a `garages.details`, `garages.employees`, `garages.fleet` szekciókban
**4. FRONTEND - Garage Detail Page (`frontend_admin/pages/garages/[id]/index.vue`)**
- Teljes körű implementáció (1366 sor):
- **STEP 4:** "Missing Data" warning banner (tax_number, contact_email, contact_phone, billing_address ellenőrzés)
- **STEP 5:** Tabbed Edit Modal (Alapadatok / Kapcsolat / Címek fülekkel)
- **STEP 6:** Strict RBAC UI enforcement (`hasOrgPermission()` helper)
- **STEP 7:** Fleet tab adattáblával (license_plate, brand, model, year, status)
- **STEP 8:** "Add Employee" gomb a Dolgozók fülön
- Add Employee, Edit Role, Remove confirmation modálok
- Notification Toast komponens
- Teljes `<script setup lang="ts">` szekció (API hívások, állapotkezelés, helper függvények)
### ✅ Verifikáció
- **Sync Engine:** ✅ 1278 OK, 0 Fixed, 0 Extra
- **Adatbázis séma:** 14 új oszlop sikeresen alkalmazva a `fleet.organizations` táblában
## 2026-06-25 - P0 UI Hotfix: Garage Details Tabok, Edit Modal & i18n
### 🎯 Cél
Garage Details oldal (`garages/[id]/index.vue`) UI hibajavítások: hiányzó 4. "Analitika" fül visszaállítása, i18n kulcsok pótlása, edit modal adatkötés javítása, hiányzó adatok riasztó javítása.
### 🔧 Módosított fájlok
1. **`frontend_admin/i18n/locales/hu.json`** — Hozzáadva: `generalTab`, `employeesTab`, `fleetTab`, `analyticsTab`, `editBasicTab`, `editContactTab`, `editAddressTab` kulcsok
2. **`frontend_admin/i18n/locales/en.json`** — Hozzáadva: `generalTab`, `employeesTab`, `fleetTab`, `analyticsTab`, `editBasicTab`, `editContactTab`, `editAddressTab` kulcsok
3. **`frontend_admin/pages/garages/[id]/index.vue`** — Több javítás:
- 4. "analytics" tab hozzáadva a `tabs` tömbhöz
- Analytics tab tartalom (Coming Soon placeholder) hozzáadva a template-hez
- `editForm` ref kibővítve: `full_name`, `display_name`, `reg_number`, `address_zip`, `address_city`, `address_street_name`, `address_street_type`, `address_house_number` mezőkkel
- Edit form template v-model javítva: `editForm.zip``editForm.address_zip`, stb.
- `address_street_type` input mező hozzáadva az Alapadatok tabhoz
- `openEditModal()` kibővítve az összes hiányzó mező pre-fill-lel
- `saveEdit()` javítva: API válaszból `result.organization` kinyerése
- `missingFields` computed javítva: helyes i18n kulcsok (`missing_tax_number`, `missing_contact_email`, `missing_contact_phone`, `missing_billing`) és `{ key, label }` objektum struktúra
- `formattedAddress` computed javítva: `garage.value.zip``garage.value.address_zip`, stb.
### ✅ Verifikáció
- **Nuxt Build:** ✅ Sikeres (7.27s)
- **Backend:** Nem volt szükség módosításra (model és API séma már tartalmazta az összes billing/contact mezőt)
---
## 2026-06-25 - P0 Hotfix: Garage CRM Smart Validation (i18n, Tab Switching, Missing Data, Contact Propagation)
### 🎯 Cél
4 kritikus javítás a Garage CRM Smart Validation rendszerben:
1. **i18n rendering** - nyers kulcsok (pl. `garages.details.generalTab`) megjelenítése helyett fordított szöveg
2. **Tab switching** - edit modal tabok nem működtek (halott kattintás)
3. **Missing Data logika** - Private Garages (individual org_type) esetén ne kérjen adószámot/számlázási címet
4. **Edit Modal contact info** - email/phone propagálása Person/User rekordokba individual org_type esetén
### 🔧 Változtatások
**1. Frontend - i18n javítások:**
- [`frontend_admin/pages/garages/[id]/index.vue`](frontend_admin/pages/garages/[id]/index.vue:125) - `{{ tab.label }}``{{ $t(tab.label) }}` (fő tab navigáció)
- [`frontend_admin/pages/garages/[id]/index.vue`](frontend_admin/pages/garages/[id]/index.vue:509) - `{{ tab.label }}``{{ $t(tab.label) }}` (edit modal tabok)
- [`frontend_admin/pages/garages/[id]/index.vue`](frontend_admin/pages/garages/[id]/index.vue:55) - `{{ field.label }}``{{ $t(field.label) }}` (missing data tag-ek)
**2. Frontend - Tab switching javítás:**
- [`frontend_admin/pages/garages/[id]/index.vue`](frontend_admin/pages/garages/[id]/index.vue:983) - `editModalTabs` kulcs javítva: `'address'``'addresses'` (egyezés a template `v-if="editModalTab === 'addresses'"` feltétellel)
**3. Frontend - Missing Data logika:**
- [`frontend_admin/pages/garages/[id]/index.vue`](frontend_admin/pages/garages/[id]/index.vue:995) - `missingFields` computed:
- `tax_number` ellenőrzés kihagyása `org_type === 'individual'` esetén
- `contact_email`/`contact_phone` mellett `email`/`phone` fallback ellenőrzés
- Számlázási cím ellenőrzés kihagyása individual org_type esetén
**4. Frontend - Edit Modal contact info:**
- [`frontend_admin/pages/garages/[id]/index.vue`](frontend_admin/pages/garages/[id]/index.vue:1123) - `saveEdit()`:
- Csak nem-üres mezők küldése a payload-ban
- Individual garages esetén `contact_email``email` és `contact_phone``phone` mapping
**5. Backend - OrganizationUpdate séma bővítés:**
- [`backend/app/api/v1/endpoints/admin_organizations.py`](backend/app/api/v1/endpoints/admin_organizations.py:623) - `OrganizationUpdate` séma: új `email` és `phone` mezők hozzáadva
**6. Backend - Propagációs logika:**
- [`backend/app/api/v1/endpoints/admin_organizations.py`](backend/app/api/v1/endpoints/admin_organizations.py:702) - `update_organization` végpont:
- Individual org_type + legal_owner_id esetén:
- `contact_phone`/`phone` propagálása `Person.phone`-ba
- `contact_email`/`email` propagálása a hozzá tartozó `User.email`-be
### ✅ Verifikáció
- **Backend Schema:** ✅ Sikeres (`OrganizationUpdate` séma tartalmazza az új `email` és `phone` mezőket)
- **Frontend:** Mind a 4 javítás implementálva és ellenőrizve
## 2026-06-25 - P0 HOTFIX: Zero-Duplication Contact & 401 Auth Header
### 🎯 Cél
Az Architect által jelzett 3 kritikus hiba javítása:
1. Frontend 401 Auth Header (token whitespace/newline trimming)
2. Backend Zero-Duplication Contact Logic (owner fallback)
3. Owner mindig látható a Dolgozók (Employees) tabon
### 🔧 Változtatások
**1. Frontend 401 Auth Header Fix**
- Fájl: `frontend_admin/pages/garages/[id]/index.vue`
- Minden `fetch` hívásnál a token `.trim()`-elve kerül a `Bearer` header-be
- Érintett függvények: `fetchDetails`, `fetchFleetVehicles`, `saveEdit`, `addEmployee`, `saveRoleEdit`, `executeRemove`
**2. Backend Zero-Duplication Contact Logic**
- Fájl: `backend/app/api/v1/endpoints/admin_organizations.py`
- `get_organization_details` endpoint kibővítve:
- `Organization.owner` + `User.person` eager loading
- Ha `contact_person_name` NULL → `owner.person` full name
- Ha `contact_email` NULL → `owner.email`
- Ha `contact_phone` NULL → `owner.person.phone`
**3. Owner Presence in Members List**
- Ha az owner nem szerepel az `OrganizationMember` táblában, dinamikusan prependáljuk
- `synthetic_owner` rekord `id=0` markerrel, `role="OWNER"`
- `member_count` is nő, ha szintetikus owner került hozzáadásra
### ✅ Verifikáció
- **Syntax check:** ✅ Sikeres (py_compile)
- **DB Sync:** ✅ Tökéletes szinkron (1278 elem)
- **API Test:** ✅ Sikeres
- Individual org: contact_person_name="TestUser KYC", contact_email=owner email
- Business org with owner: contact info correctly populated
- Owner minden esetben szerepel a members listában
## 2026-06-25 - P0 Security & UI Execution: 401 Interceptor, Employees Tab, Add Employee Modal
### 🎯 Cél
P0 Security & UI Execution feladat három komponenssel:
1. **Global 401 Unauthorized Interceptor** - lejárt token esetén automatikus logout és redirect /login-ra
2. **Employees Tab renderelése** - OWNER szerepkör arany badge-dzsel
3. **Add Employee Modal** - email alapú tag hozzáadás
### 🔧 Változtatások
**1. Global 401 Interceptor** ([`frontend_admin/plugins/api.ts`](frontend_admin/plugins/api.ts))
- Új Nuxt plugin, amely `globalThis.fetch`-et wrap-eli
- 401-es válasz esetén meghívja `authStore.logout()`-ot, majd redirectel `/login`-ra
- Kivétel: `/auth/login` és `/auth/refresh` végpontok (redirect loop elkerülése)
**2. Backend email-based member lookup** ([`backend/app/schemas/organization.py`](backend/app/schemas/organization.py:18))
- `OrganizationMemberCreate` séma most már támogatja az `email` mezőt `user_id` alternatívaként
- [`backend/app/api/v1/endpoints/admin_organizations.py`](backend/app/api/v1/endpoints/admin_organizations.py:990) - email alapú felhasználó keresés implementálva
**3. Frontend javítások** ([`frontend_admin/pages/garages/[id]/index.vue`](frontend_admin/pages/garages/[id]/index.vue))
- `openEditRoleModal``openEditRole` függvénynév mismatch javítva
- Add Employee, Edit Role, Remove modálok dark theme-re átállítva (`bg-slate-800`, `text-white`)
- Notification toast dark theme-re átállítva
**4. i18n kiegészítések** ([`frontend_admin/i18n/locales/en.json`](frontend_admin/i18n/locales/en.json:207), [`frontend_admin/i18n/locales/hu.json`](frontend_admin/i18n/locales/hu.json:207))
- `editRoleTitle`, `removeTitle`, `removeConfirm` camelCase kulcsok hozzáadva
### ✅ Verifikáció
- **DB Sync:** ✅ Tökéletes szinkron (1278 elem)
- **Syntax:** ✅ Minden fájl szintaktikailag helyes
## 2026-06-26 - P0 HOTFIX: GET /admin/organizations/{org_id}/vehicles 500 Internal Server Error
### 🔍 Diagnózis
A frontend által hívott `GET /api/v1/admin/organizations/43/vehicles` végpont 500-as hibát dobott. A Docker logok három egymásra épülő `AttributeError`-t mutattak:
1. **`Asset.branch`** — Az [`Asset`](backend/app/models/vehicle/asset.py:69) modellben nincs `branch` relationship, csak `branch_id` oszlop. A kód `.options(selectinload(Asset.branch))`-et használt.
2. **`Asset.year`** — Az Asset modellben `year_of_manufacture` a mező neve, nem `year`.
3. **`Asset.color`** — Az Asset modellben nincs `color` mező.
### 🔧 Javítások ([`admin_organizations.py`](backend/app/api/v1/endpoints/admin_organizations.py:1289))
- **`selectinload(Asset.branch)` eltávolítva** — Helyette explicit `outerjoin(Branch, Asset.branch_id == Branch.id)` a `Branch.name` lekéréséhez.
- **`v.year``v.year_of_manufacture`** — Javítva a mezőnév az Asset modell valós oszlopnevére.
- **`color` mező eltávolítva** a `GarageVehicleItem` Pydantic sémából és a leképzésből, mert az Asset modell nem tartalmaz ilyen attribútumot.
### ✅ Verifikáció
- `GET /api/v1/admin/organizations/43/vehicles`**200 OK**
- Visszaadott 3 jármű helyes adatokkal (brand, model, year, license_plate, branch_name)