backend admin flotta bekötése
This commit is contained in:
217
.roo/history.md
217
.roo/history.md
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user