326 lines
20 KiB
Markdown
326 lines
20 KiB
Markdown
# Service Finder Fejlesztési Történet
|
|
|
|
## 2026-06-21 - P0 Deep Audit: Database Consistency & Zombie API Hunt
|
|
|
|
### 🎯 Cél
|
|
Teljes körű adatbázis konzisztencia ellenőrzés és zombie API végpontok felderítése a `vehicle`, `finance`, `fleet_finance` sémákban, mielőtt a frontend fejlesztés elkezdődik.
|
|
|
|
### 🔧 Eredmények
|
|
|
|
**1. ADATBÁZIS TISZTASÁG:** ✅ PASS
|
|
- API modul import: ✅ Sikeres (2 route: GET, POST)
|
|
- Sync Engine: ✅ 1210 OK, 0 Fixed, 0 Extra
|
|
- E2E test: ⚠️ Pre-existing conftest hiba (verification token timeout - nem kapcsolódó)
|
|
|
|
## 2026-06-30 - [#343] Fázis 4/7: Gamification kulcsok felvétele backend lokációs fájlokba
|
|
|
|
### 🎯 Cél
|
|
GAMIFICATION szekció létrehozása a `backend/static/locales/en.json` és `hu.json` fájlokban a `docs/gamification_i18n_audit_and_fix_proposal.md` dokumentáció alapján.
|
|
|
|
### 🔧 Módosított fájlok
|
|
|
|
## 2026-07-01 - Opening Hours (JSONB) Admin UI támogatás
|
|
|
|
### 🎯 Cél
|
|
Nyitvatartás (Opening Hours) JSONB mező adminisztrációs támogatásának megvalósítása: backend API (GET/PATCH), frontend edit UI (7 napos grid), frontend detail display.
|
|
|
|
### 🔧 Módosított fájlok
|
|
- `backend/app/api/v1/endpoints/admin_providers.py` - ProviderDetail + ProviderUpdateInput sémák `opening_hours` mezővel; get_provider_detail() és update_provider() végpontok kiegészítése a ServiceProfile JSONB oszlop olvasásával/írásával
|
|
- `frontend_admin/pages/providers/[id]/edit.vue` - "Nyitvatartás" tab (4. tab) 7 napos grid-del, checkbox + time input párokkal, 24/7 gyorsgombbal, hétköznap másolással, összes törléssel
|
|
- `frontend_admin/pages/providers/[id]/index.vue` - Nyitvatartás megjelenítő tábla a részletes nézetben
|
|
|
|
### ✅ Verifikáció
|
|
- Sync Engine: 1297 OK, 0 Fixed, 0 Extra - rendszer tökéletesen szinkronban
|
|
- GET /admin/providers/1 → 200, `opening_hours` mező visszatér
|
|
- PATCH /admin/providers/1 `opening_hours` → 200, adatok perzisztálódnak és visszaolvashatók
|
|
|
|
## 2026-06-30 - [#377] M4: Többnyelvű támogatás bevezetése (DE, FR, RO, CZ, SK)
|
|
|
|
### 🎯 Cél
|
|
5 új nyelv (Német, Francia, Román, Cseh, Szlovák) bevezetése a backend és frontend admin i18n rendszerekbe.
|
|
|
|
### 🔧 Létrehozott fájlok
|
|
- `backend/static/locales/de.json` - Backend német lokációs fájl (7 szekció)
|
|
- `backend/static/locales/fr.json` - Backend francia lokációs fájl (7 szekció)
|
|
- `backend/static/locales/ro.json` - Backend román lokációs fájl (7 szekció)
|
|
- `backend/static/locales/cz.json` - Backend cseh lokációs fájl (7 szekció)
|
|
- `backend/static/locales/sk.json` - Backend szlovák lokációs fájl (7 szekció)
|
|
- `frontend_admin/locales/de.json` - Frontend admin német fő lokációs fájl
|
|
- `frontend_admin/locales/fr.json` - Frontend admin francia fő lokációs fájl
|
|
- `frontend_admin/locales/ro.json` - Frontend admin román fő lokációs fájl
|
|
- `frontend_admin/locales/cz.json` - Frontend admin cseh fő lokációs fájl
|
|
- `frontend_admin/locales/sk.json` - Frontend admin szlovák fő lokációs fájl
|
|
- `frontend_admin/i18n/locales/de.json` - Frontend admin német közös lokációs fájl
|
|
- `frontend_admin/i18n/locales/fr.json` - Frontend admin francia közös lokációs fájl
|
|
- `frontend_admin/i18n/locales/ro.json` - Frontend admin román közös lokációs fájl
|
|
- `frontend_admin/i18n/locales/cz.json` - Frontend admin cseh közös lokációs fájl
|
|
- `frontend_admin/i18n/locales/sk.json` - Frontend admin szlovák közös lokációs fájl
|
|
|
|
### 🔧 Módosított fájlok
|
|
- `frontend_admin/nuxt.config.ts` - 5 új nyelv regisztrálása a @nuxtjs/i18n konfigurációban
|
|
|
|
### ✅ Verifikáció
|
|
- Backend i18n: Mind az 5 nyelv betöltődik (7-7 szekció), leaf key fordítések működnek
|
|
- Sync Engine: 1293 OK, 0 Fixed, 0 Extra - rendszer tökéletesen szinkronban
|
|
|
|
### 🎯 Cél
|
|
GAMIFICATION szekció létrehozása a `backend/static/locales/en.json` és `hu.json` fájlokban a `docs/gamification_i18n_audit_and_fix_proposal.md` dokumentáció alapján.
|
|
|
|
### 🔧 Módosított fájlok
|
|
|
|
## 2026-06-30 - [#376] M3: Admin nyelvválasztó átalakítása legördülő menüvé
|
|
|
|
### 🎯 Cél
|
|
A jelenlegi kétállású HU/EN kapcsoló átalakítása bővíthető, legördülő nyelvválasztó dropdownná, amely a backend-ből érkező támogatott nyelveket listázza.
|
|
|
|
### 🔧 Módosított fájlok
|
|
- `frontend_admin/components/LanguageSwitcher.vue` — **LÉTREHOZVA**: Új önálló LanguageSwitcher dropdown komponens zászló emoji-kkal, nyelv nevével, localStorage + backend perzisztálással
|
|
- `frontend_admin/layouts/default.vue` — **MÓDOSÍTVA**: 157-170. sorokban a régi gomb-alapú kapcsoló kicserélve `<LanguageSwitcher />` komponensre; felesleges `useI18n` import és `switchLocale`/`getAuthHeaders` függvények eltávolítva
|
|
|
|
### 📊 Eredmény
|
|
- LanguageSwitcher komponens: ✅ Létrehozva (zászló emoji, dinamikus locale lista, backend PATCH perzisztálás, localStorage)
|
|
- default.vue cleanup: ✅ 25 sor kód eltávolítva (i18n logika kiszervezve)
|
|
- Nuxt production build: ✅ Sikeres
|
|
|
|
## 2026-06-30 - Admin Provider Root Cause Analysis (#379)
|
|
|
|
**Vizsgálat típusa:** Rendszer-Architect root cause analysis
|
|
**Gitea kártya:** #379
|
|
|
|
### Felfedezett probléma
|
|
Az admin felület (providers list & pending queue) csak 6 rekordot mutat a `marketplace.service_providers` táblából. A robotok által gyűjtött 8569 rekord a `marketplace.service_staging`-ben láthatatlan.
|
|
|
|
### Root Cause
|
|
A `backend/app/api/v1/endpoints/admin_providers.py` `list_providers()` és `get_provider_stats()` endpointjai kizárólag a `ServiceProvider` modellt kérdezik le. A `provider_service.py` `search_providers()` (public API) már helyesen használ UNION ALL-t mindhárom forrásból.
|
|
|
|
### Javítási terv
|
|
1. `ProviderListItem` response model kiegészítése `source_table` mezővel
|
|
2. `list_providers()` UNION ALL kiterjesztése ServiceStaging-re
|
|
3. `get_provider_stats()` kiterjesztése staging rekordokkal
|
|
4. Nem kell új validációs mező - a `provider_validations`, `service_profiles.trust_score` stb. már létezik
|
|
|
|
### Dokumentáció
|
|
`docs/admin_providers_root_cause_analysis.md`
|
|
|
|
## 2026-06-30 - Admin Provider Discovery Implementáció
|
|
|
|
### 🎯 Cél
|
|
A `list_providers()` admin végpont kiterjesztése UNION ALL lekérdezéssel, hogy a bot által gyűjtött ServiceStaging rekordok (8569 db) és a verified organization-ök is megjelenjenek az admin felületen. Új `rejected.vue` oldal az elutasított szolgáltatók visszaállításához.
|
|
|
|
### 🔧 Változtatások
|
|
1. `backend/app/api/v1/endpoints/admin_providers.py`:
|
|
- `_build_unified_providers_query()`: UNION ALL a ServiceProvider, ServiceStaging és Organizations táblákból
|
|
- `source_filter` és `source_table_filter` a UNION ALL eredményére alkalmazva (nem az egyes részekre) - kijavítva a SourceType enum ütközési hibát
|
|
- `get_provider_stats()`: staging_pending mező hozzáadása
|
|
- `restore_provider()`: POST végpont rejected->approved státuszváltáshoz
|
|
- `get_provider_history()`, `update_provider()` végpontok
|
|
2. `frontend_admin/pages/providers/rejected.vue`: új oldal az elutasított szolgáltatók listázásához és visszaállításához
|
|
3. `frontend_admin/pages/providers/index.vue`: source_table, bot/verified_org szűrés támogatás
|
|
4. `frontend_admin/pages/providers/pending.vue`: source_table mező hozzáadása
|
|
|
|
### ✅ Tesztek
|
|
- `source=bot` filter: 200 OK, 5 staging rekord visszaadva
|
|
- `source=verified_org` filter: 200 OK, 1 organization rekord
|
|
- `source_table=service_staging` filter: 200 OK, 3 staging rekord
|
|
- Stats: total=8575, staging_pending=5096
|
|
- Rejected filter: 200 OK, 2 rejected rekord
|
|
|
|
## 2026-06-30 - Provider Admin Tabbed Edit UI (Status, Validations, History)
|
|
|
|
### 🎯 Cél
|
|
A szolgáltatók admin felületének bővítése: többfülű szerkesztési nézet, státuszkezelés, gamification validációs lista és állapotváltoztatási előzmények megjelenítése.
|
|
|
|
### 🔧 Módosított fájlok
|
|
|
|
**1. `backend/app/api/v1/endpoints/admin_providers.py`**
|
|
- `ProviderUpdateInput` séma bővítése: `status` (pending/approved/rejected) és `validation_score` (0-100) mezőkkel
|
|
- `ProviderValidationEntry` response séma létrehozása (id, provider_id, voter_user_id, validation_type, weight, validation_metadata, created_at, voter_name)
|
|
- `GET /admin/providers/{id}/validations` végpont: gamification validációk lekérése voter névvel
|
|
- `PATCH /admin/providers/{id}` módosítása: státuszváltás kezelése (ModerationStatus enum), old_data audit snapshot, validation_score auto-állítás restore/reject esetén
|
|
|
|
**2. `frontend_admin/pages/providers/[id].vue`**
|
|
- Teljes átírás: egysávos layout helyett 4 fül (Adatok, Státusz, Validációk, Előzmények)
|
|
- **Adatok fül**: változatlan alapadatok, cím, elérhetőség, moderációs műveletek
|
|
- **Státusz fül**: új űrlap státusz select, validation_score range slider (0-100), indoklás textarea
|
|
- **Validációk fül**: gamification validációs lista típus-badge-ekkel, szavazó név, súly, metadata, timestamp
|
|
- **Előzmények fül**: idővonal action-badge-ekkel, státusz átmenetek (régi→új), user info, expandálható részletek
|
|
- Elutasított/Megjelölt szekció: "Szerkesztés" és "Visszaállítás" gombok minden státuszhoz
|
|
|
|
### ✅ Verifikáció
|
|
- Sync Engine: ✅ 1293 OK, 0 Fixed, 0 Extra - teljes szinkron
|
|
- Backend syntax: ✅ admin_providers.py AST parse OK
|
|
- Backend import: ✅ router modul betöltés sikeres
|
|
|
|
## 2026-06-30 - P0 Rescue: Admin Providers API Blocker Fixes
|
|
|
|
### 🎯 Cél
|
|
4 darab kritikus blokkoló hiba javítása az Admin Providers flow-ban.
|
|
|
|
### 🔧 Változtatások
|
|
|
|
**FIX 1 - Silent Rollback (PATCH endpoint):**
|
|
- [`update_provider()`](backend/app/api/v1/endpoints/admin_providers.py:1147) `db.commit()` köré `try/except IntegrityError` blokk került
|
|
- IntegrityError esetén `db.rollback()` + `HTTPException(400)` a csendes 200 OK helyett
|
|
|
|
**FIX 2 - Unique Constraint on Restore:**
|
|
- [`_create_provider_validation()`](backend/app/api/v1/endpoints/admin_providers.py:198) átírva PostgreSQL `INSERT ... ON CONFLICT DO UPDATE` (UPSERT) használatára
|
|
- A `uq_voter_provider_validation` constraint tiszteletben tartva
|
|
|
|
**FIX 3 - Wrong Frontend URL:**
|
|
- Ellenőrizve: a frontend [`[id].vue`](frontend_admin/pages/providers/[id].vue:761) már a helyes `/api/v1/admin/providers/{id}/validations` URL-t használja
|
|
|
|
**FIX 4 - AuditLog Attribute Error:**
|
|
- [`get_provider_history()`](backend/app/api/v1/endpoints/admin_providers.py:1029) `AuditLog.created_at` → `AuditLog.timestamp`
|
|
- `timestamp=log.created_at` → `timestamp=log.timestamp`
|
|
|
|
### ✅ Verifikáció
|
|
- Backend syntax: ✅ `py_compile` OK
|
|
- Modul import: ✅ `admin_providers` modul betöltés sikeres
|
|
- Container: ✅ `sf_api` restart sikeres, státusz Up
|
|
|
|
|
|
## 2026-06-30 - [#381] P0 Fix: Provider validations 500 error & missing edit/flag modals
|
|
|
|
### 🎯 Cél
|
|
Két P0 hibajavítás az Admin Provider Details oldalon.
|
|
|
|
### 🔧 Módosított fájlok
|
|
|
|
**Bug #1 - `get_provider_validations()` 500 error:**
|
|
- [`admin_providers.py`](backend/app/api/v1/endpoints/admin_providers.py:1018) — `v.voter.display_name` → `v.voter.email`
|
|
- Root cause: `User` modellben nincs `display_name` mező
|
|
|
|
**Bug #2 - Dead "Szerkesztés" gomb:**
|
|
- [`[id].vue`](frontend_admin/pages/providers/[id].vue:540) — Edit modal template hozzáadva (name, city, address, contact, category mezőkkel)
|
|
- [`[id].vue`](frontend_admin/pages/providers/[id].vue:603) — Flag modal template hozzáadva (indoklás textarea-val)
|
|
- Root cause: A `<template>` szekcióból hiányzott mindkét modal, bár a JavaScript logika (`showEditModal`, `openEditModal`, `saveEdit`, `showFlagModal`, `flagProvider`) definiálva volt
|
|
|
|
### ✅ Verifikáció
|
|
- Backend syntax: ✅ `ast.parse` OK
|
|
- Frontend template: ✅ Mind a 3 modal (Reject, Edit, Flag) jelen van a `<template>`-ben
|
|
|
|
## 2026-07-01 - [#382] P0: Backend Database Models - 3D Filtering Matrix
|
|
|
|
### 🎯 Cél
|
|
A ServiceProvider és ServiceProfile modellek bővítése `supported_vehicle_classes` (ARRAY) és `specializations` (JSONB) oszlopokkal a 3D szűrési mátrix támogatásához. Pydantic schemák frissítése az új mezőkkel.
|
|
|
|
### 🔧 Módosított fájlok
|
|
|
|
**1. [`backend/app/models/identity/social.py`](backend/app/models/identity/social.py:55)**
|
|
- `ARRAY` import hozzáadva `sqlalchemy.dialects.postgresql`-ből
|
|
- `supported_vehicle_classes: Mapped[Optional[list]] = mapped_column(ARRAY(String), server_default=text("'{}'"), nullable=True)`
|
|
- `specializations: Mapped[Optional[dict]] = mapped_column(JSONB, server_default=text("'{}'::jsonb"), nullable=True)`
|
|
|
|
**2. [`backend/app/models/marketplace/service.py`](backend/app/models/marketplace/service.py:40)**
|
|
- `ARRAY` import hozzáadva `sqlalchemy.dialects.postgresql`-ből
|
|
- Azonos 2 oszlop hozzáadva a ServiceProfile modellhez
|
|
|
|
**3. [`backend/app/api/v1/endpoints/admin_providers.py`](backend/app/api/v1/endpoints/admin_providers.py:126)**
|
|
- `ProviderUpdateInput`: `category_ids`, `supported_vehicle_classes`, `specializations` mezők
|
|
- `ProviderDetail`: `category_ids`, `supported_vehicle_classes`, `specializations` mezők
|
|
- `get_provider_detail()` és `update_provider()` response-ok frissítve
|
|
|
|
**4. [`backend/app/schemas/provider.py`](backend/app/schemas/provider.py:137)**
|
|
- `ProviderQuickAddIn`: `supported_vehicle_classes`, `specializations` mezők
|
|
- `ProviderUpdateIn`: `supported_vehicle_classes`, `specializations` mezők
|
|
- `ProviderSearchResult`: `supported_vehicle_classes`, `specializations` mezők
|
|
|
|
### ✅ Verifikáció
|
|
- Sync Engine: ✅ 1293 OK, 4 Fixed (4 új oszlop), 0 Extra
|
|
- Adatbázis oszlopok ellenőrizve: `marketplace.service_providers.supported_vehicle_classes` (ARRAY), `marketplace.service_providers.specializations` (JSONB), `marketplace.service_profiles.supported_vehicle_classes` (ARRAY), `marketplace.service_profiles.specializations` (JSONB) — mind jelen van megfelelő típussal és default értékkel
|
|
|
|
## 2026-07-01 - [#383] P0: Admin PATCH endpoint - ServiceExpertise sync & Array persistence
|
|
|
|
### 🎯 Cél
|
|
A `PATCH /admin/providers/{id}` végpont kiegészítése: `category_ids`, `supported_vehicle_classes`, `specializations` mezők mentése mind a ServiceProvider, mind a ServiceProfile modellekbe, valamint `_sync_service_expertises()` meghívása a ServiceProfile ID-val a taxonomy fa szinkronizálásához.
|
|
|
|
### 🔧 Módosított fájlok
|
|
|
|
**1. [`backend/app/api/v1/endpoints/admin_providers.py`](backend/app/api/v1/endpoints/admin_providers.py:1098)**
|
|
- **Importok bővítése**: `ServiceProfile` import `app.models.marketplace.service`-ből, `_sync_service_expertises` import `app.services.provider_service`-ből
|
|
- **`update_provider()`**: `category_ids`, `supported_vehicle_classes`, `specializations` kiemelése a payload-ból `update_fields.pop()` segítségével; tömbök mentése ServiceProvider-re; ServiceProfile lekérése `service_provider_id` alapján; tömbök mentése ServiceProfile-ra; `_sync_service_expertises(db, profile.id, category_ids)` hívása
|
|
- **`get_provider_detail()`**: `category_ids` feloldása a ServiceExpertise join táblából ServiceProfile-on keresztül (korábban hardcoded `None`)
|
|
|
|
### ✅ Verifikáció
|
|
- Backend syntax: ✅ `py_compile` OK (exit code 0)
|
|
- Container restart: ✅ `sf_api` sikeresen újraindítva
|
|
- Import verifikáció: ✅ `ProviderUpdateInput` séma tartalmazza a `category_ids`, `supported_vehicle_classes`, `specializations` mezőket
|
|
|
|
## 2026-07-01 - [#384] P0: Service Provider Dedicated Full-Page Editor
|
|
|
|
### 🎯 Cél
|
|
Dedikált teljes oldalas szerkesztő létrehozása a szolgáltatók adminisztrációjához, amely felváltja a hiányzó modális szerkezetet. A szerkesztő 3 tabos struktúrával rendelkezik: Alapadatok & Kapcsolat, Szolgáltatások & Járművek (3D Mátrix), Helyszín & Lokáció.
|
|
|
|
### 🔧 Létrehozott fájlok
|
|
- `frontend_admin/pages/providers/[id]/edit.vue` - Teljes oldalas 3-tabos szerkesztő (Alapadatok, 3D Mátrix, Helyszín)
|
|
- `frontend_admin/components/TreeNode.vue` - Rekurzív fa komponens a kategória hierarchia megjelenítéséhez
|
|
|
|
### 🔧 Módosított fájlok
|
|
- `frontend_admin/pages/providers/[id].vue` - "Szerkesztés" gomb átirányítása a modális helyett az új `/providers/{id}/edit` útvonalra
|
|
|
|
### 📝 Technikai részletek
|
|
- **Tab 1 (Alapadatok & Kapcsolat):** Név, Kategória, Forrás (read-only), Telefon, Email, Weboldal
|
|
- **Tab 2 (Szolgáltatások & Járművek):** 3D Képesség Mátrix - A: Járműosztályok (8 checkbox), B: Szolgáltatási Kategóriák (rekurzív fa), C: Specializációk (márka + hajtáslánc tag inputok)
|
|
- **Tab 3 (Helyszín & Lokáció):** Teljes cím, Város, Irányítószám, Utca, Házszám, Plus Code
|
|
- **API integráció:** PATCH `/api/v1/admin/providers/{id}` végpont használata a `ProviderUpdateInput` séma szerint
|
|
- **Adatfolyam:** GET provider detail → form mapping → user edit → PATCH save → visszanavigálás a detail oldalra
|
|
- **Build:** Sikeres Nuxt build hibák nélkül
|
|
|
|
## 2026-07-01 - P0 HOTFIX: Edit page data modification fix (3 bugs)
|
|
|
|
### 🎯 Cél
|
|
A `/providers/[id]/edit` oldalon a felhasználó nem tudott adatokat módosítani és menteni. 3 összefüggő hibát azonosítottam és javítottam.
|
|
|
|
### 🔧 Javítások
|
|
|
|
**1. Backend - Hiányzó `address` mező a `ProviderUpdateInput` sémában**
|
|
- Hely: `backend/app/api/v1/endpoints/admin_providers.py:127`
|
|
- Probléma: A PATCH végpont Pydantic sémája nem tartalmazta az `address` mezőt, így a "Teljes cím" módosítása sosem került mentésre.
|
|
- Javítás: `address: Optional[str] = Field(None, max_length=500)` hozzáadva a sémához.
|
|
|
|
**2. Frontend - Hiányzó `address` és `address_street_type` a `hasChanges` computed-ból**
|
|
- Hely: `frontend_admin/pages/providers/[id]/edit.vue:579`
|
|
- Probléma: A Mentés gomb disabled maradt, ha csak a "Teljes cím" vagy "Utca típusa" mezőt módosították.
|
|
- Javítás: `form.address !== (p.address || '')` és `form.address_street_type !== (p.address_street_type || '')` ellenőrzések hozzáadva.
|
|
|
|
**3. Frontend - Hiányzó `address` a `saveForm` payload-ból**
|
|
- Hely: `frontend_admin/pages/providers/[id]/edit.vue:803`
|
|
- Probléma: A PATCH kérés törzséből hiányzott az `address` mező.
|
|
- Javítás: `address: form.address || null` hozzáadva a payload objektumhoz.
|
|
|
|
### ✅ Verifikáció
|
|
- Backend Python szintaxis: OK
|
|
- Sync Engine: 1297 elem OK, 0 hiba, teljes szinkronban
|
|
|
|
---
|
|
|
|
## 2026-07-01 - P0 Feature: "Always Open" (0-24) nyitvatartás a provider admin felületen
|
|
|
|
### 🎯 Cél
|
|
A provider admin szerkesztő felületen egy "Folyamatos (0-24) nyitvatartás" checkbox bevezetése, amely:
|
|
- Backend: `is_always_open: Optional[bool]` mező a `ProviderUpdateInput` sémában
|
|
- Backend: Ha `is_always_open=True`, a `update_provider()` PATCH endpoint automatikusan 00:00-23:59-re állítja mind a 7 napot, és `always_open: true` metadatát tárol a JSONB `opening_hours` mezőben
|
|
- Backend: Ha `is_always_open=False`, a meglévő `opening_hours` mentése változatlan, az `always_open` kulcs törlődik
|
|
- Frontend: Checkbox a Nyitvatartás tabon, amely bekapcsoláskor letiltja a naponkénti bevitelt és 00:00-23:59-re állít mindent
|
|
- Adatbázis: Nincs új migráció - a `always_open` metadata a meglévő JSONB `opening_hours` oszlopban tárolódik
|
|
|
|
### 🔧 Módosított fájlok
|
|
|
|
**1. Backend - `backend/app/api/v1/endpoints/admin_providers.py`**
|
|
- `ProviderUpdateInput` osztály: `is_always_open: Optional[bool] = Field(None, ...)` hozzáadva (148. sor)
|
|
- `update_provider()` PATCH endpoint: `is_always_open` kinyerése `update_fields`-ből, 0-24 kényszerítés True esetén, metadata törlés False esetén (1150-1170. sor)
|
|
|
|
**2. Frontend - `frontend_admin/pages/providers/[id]/edit.vue`**
|
|
- `form` reactive objektum: `is_always_open: false` mező hozzáadva
|
|
- Template: "Folyamatos (0-24) nyitvatartás" checkbox a Nyitvatartás tab tetején, amely letiltja a naponkénti grid-et
|
|
- `onAlwaysOpenChange()`: Checkbox toggle handler - bekapcsoláskor `setAllDaysOpen('00:00', '23:59')`, kikapcsoláskor `clearAllHours()`
|
|
- `mapProviderToForm()`: `always_open` metadata felismerése a JSONB-ből (mind a régi flat, mind az új nested formátum támogatott)
|
|
- `hasChanges` computed: `is_always_open` összehasonlítás a `p.opening_hours?.always_open`-val
|
|
- `saveForm()`: `is_always_open: form.is_always_open` a PATCH payload-ban
|
|
|
|
### ✅ Verifikáció
|
|
- Backend Python szintaxis: OK
|
|
- Sync Engine: 1297 elem OK, 0 hiba, teljes szinkronban
|
|
- API Test 1: `PATCH is_always_open=True` → `{"always_open": true, "days": {"monday": {"open": "00:00", "close": "23:59"}, ...}}` ✅
|
|
- API Test 2: `PATCH is_always_open=False` → `{"monday": {"open": "09:00", "close": "17:00"}}` (always_open metadata stripped) ✅
|