# 📐 Logic Spec — Vehicle Registration Documents ## Modul cĂ©lja Ă©s Masterbook 2 illeszkedĂ©s **CĂ©l:** A forgalmi engedĂ©ly szĂĄma, Ă©rvĂ©nyessĂ©gi ideje Ă©s a törzskönyv szĂĄma mezƑk hiĂĄnyĂĄnak pĂłtlĂĄsa a teljes adatfolyamban (adatbĂĄzis → API szint → Frontend UI). **Masterbook 2 illeszkedĂ©s:** A Thick Asset Digital Twin filozĂłfiĂĄba illeszkedik — minden adminisztratĂ­v adatot közvetlenĂŒl az Asset modellben tĂĄrolunk, nem JSONB-ben. --- ## Adatmodell ### Új mezƑk az Asset modellben | MezƑ | TĂ­pus | SQL tĂ­pus | KötelezƑ | AlapĂ©rtelmezett | |------|-------|-----------|----------|-----------------| | `registration_certificate_number` | `Optional[str]` | `VARCHAR(50)` | Nem | `None` | | `registration_certificate_validity` | `Optional[datetime]` | `DateTime(timezone=True)` | Nem | `None` | | `vehicle_registration_document_number` | `Optional[str]` | `VARCHAR(50)` | Nem | `None` | ### MiĂ©rt nem JSONB? Ezek strukturĂĄlt, kereshetƑ admin adatok, amelyek: - KĂŒlön lekĂ©rdezhetƑk (WHERE registration_certificate_number = '...') - IndexelhetƑk - ÉrvĂ©nyesĂ­thetƑk (pl. string hossz, dĂĄtum formĂĄtum) - Nincsenek elrejtve a szabad formĂĄtumĂș JSONB-ben --- ## 1. LĂ©pĂ©s: AdatbĂĄzis modell bƑvĂ­tĂ©se **FĂĄjl:** `backend/app/models/vehicle/asset.py` ### MĂłdosĂ­tĂĄs Az `Asset` osztĂĄlyhoz (a warranty mezƑk utĂĄn, a `notes` elƑtt) hozzĂĄadandĂł: ```python # === REGISTRATION DOCUMENTS === registration_certificate_number: Mapped[Optional[str]] = mapped_column( String(50), nullable=True, default=None, comment="Forgalmi engedĂ©ly szĂĄma" ) registration_certificate_validity: Mapped[Optional[datetime]] = mapped_column( DateTime(timezone=True), nullable=True, default=None, comment="Forgalmi engedĂ©ly Ă©rvĂ©nyessĂ©gi ideje" ) vehicle_registration_document_number: Mapped[Optional[str]] = mapped_column( String(50), nullable=True, default=None, comment="Törzskönyv szĂĄma" ) ``` ### Sync ```bash docker exec -it sf_api python -m app.scripts.sync_engine ``` --- ## 2. LĂ©pĂ©s: Pydantic sĂ©mĂĄk bƑvĂ­tĂ©se **FĂĄjl:** `backend/app/schemas/asset.py` ### AssetResponse (32. sor utĂĄn) ```python # === REGISTRATION DOCUMENTS === registration_certificate_number: Optional[str] = Field(None, max_length=50, description="Forgalmi engedĂ©ly szĂĄma") registration_certificate_validity: Optional[datetime] = Field(None, description="Forgalmi engedĂ©ly Ă©rvĂ©nyessĂ©gi ideje") vehicle_registration_document_number: Optional[str] = Field(None, max_length=50, description="Törzskönyv szĂĄma") ``` ### AssetCreate (a warranty utĂĄn, 233. sor környĂ©kĂ©n) ```python # === REGISTRATION DOCUMENTS === registration_certificate_number: Optional[str] = Field(None, max_length=50, description="Forgalmi engedĂ©ly szĂĄma") registration_certificate_validity: Optional[datetime] = Field(None, description="Forgalmi engedĂ©ly Ă©rvĂ©nyessĂ©gi ideje") vehicle_registration_document_number: Optional[str] = Field(None, max_length=50, description="Törzskönyv szĂĄma") ``` ### AssetUpdate (a warranty utĂĄn, 375. sor környĂ©kĂ©n) ```python # === REGISTRATION DOCUMENTS === registration_certificate_number: Optional[str] = Field(None, max_length=50, description="Forgalmi engedĂ©ly szĂĄma") registration_certificate_validity: Optional[datetime] = Field(None, description="Forgalmi engedĂ©ly Ă©rvĂ©nyessĂ©gi ideje") vehicle_registration_document_number: Optional[str] = Field(None, max_length=50, description="Törzskönyv szĂĄma") ``` --- ## 3. LĂ©pĂ©s: Asset Service bƑvĂ­tĂ©se **FĂĄjl:** `backend/app/services/asset_service.py` ### MĂłdosĂ­tĂĄs a create_or_claim_vehicle() metĂłdusban A 219-es sor elƑtt (a `first_registration_date` utĂĄn) az `asset_fields` dict-be: ```python # Registration Documents 'registration_certificate_number': asset_data.registration_certificate_number, 'registration_certificate_validity': asset_data.registration_certificate_validity, 'vehicle_registration_document_number': asset_data.vehicle_registration_document_number, ``` --- ## 4. LĂ©pĂ©s: Frontend — Vehicle Store bƑvĂ­tĂ©se **FĂĄjl:** `frontend/src/stores/vehicle.ts` ### MĂłdosĂ­tĂĄs a Vehicle interfĂ©szben (a 88-89. sor környĂ©kĂ©n) ```typescript // Registration Documents registration_certificate_number?: string | null registration_certificate_validity?: string | null vehicle_registration_document_number?: string | null ``` --- ## 5. LĂ©pĂ©s: Frontend — VehicleFormModal bƑvĂ­tĂ©se **FĂĄjl:** `frontend/src/components/dashboard/VehicleFormModal.vue` ### 5a. Form state bƑvĂ­tĂ©se (a 1779-es sor utĂĄn) ```typescript // Registration Documents registration_certificate_number: '', registration_certificate_validity: '', vehicle_registration_document_number: '', ``` ### 5b. Admin Tab UI bƑvĂ­tĂ©se (a 1006-os sor elƑtt, a warranty szekciĂł utĂĄn) ```html

{{ t('vehicle.registration_documents_title') || 'Forgalmi engedély és Törzskönyv' }}

``` ### 5c. handleSave payload bƑvĂ­tĂ©se (a 2159-es sor utĂĄn) ```typescript // Registration Documents registration_certificate_number: form.registration_certificate_number || null, registration_certificate_validity: form.registration_certificate_validity || null, vehicle_registration_document_number: form.vehicle_registration_document_number || null, ``` ### 5d. populateForm bƑvĂ­tĂ©se (a 2065-ös sor utĂĄn) ```typescript // Registration Documents form.registration_certificate_number = vehicle.registration_certificate_number || '' form.registration_certificate_validity = vehicle.registration_certificate_validity || '' form.vehicle_registration_document_number = vehicle.vehicle_registration_document_number || '' ``` ### 5e. resetForm bƑvĂ­tĂ©se (kb. 1987-2026 sorok között) ```typescript form.registration_certificate_number = '' form.registration_certificate_validity = '' form.vehicle_registration_document_number = '' ``` --- ## 6. LĂ©pĂ©s: Frontend i18n fordĂ­tĂĄsok **FĂĄjl:** `frontend/src/i18n/hu.ts` ```typescript label_registration_certificate_number: 'Forgalmi engedĂ©ly szĂĄma', label_registration_certificate_validity: 'Forgalmi engedĂ©ly Ă©rvĂ©nyessĂ©ge', label_vehicle_registration_document_number: 'Törzskönyv szĂĄma', placeholder_registration_certificate_number: 'Pl. AB-123456', placeholder_vehicle_registration_document_number: 'Pl. 1234567890', registration_documents_title: 'Forgalmi engedĂ©ly Ă©s Törzskönyv', ``` **FĂĄjl:** `frontend/src/i18n/en.ts` ```typescript label_registration_certificate_number: 'Registration Certificate Number', label_registration_certificate_validity: 'Registration Certificate Validity', label_vehicle_registration_document_number: 'Vehicle Registration Document Number', placeholder_registration_certificate_number: 'e.g. AB-123456', placeholder_vehicle_registration_document_number: 'e.g. 1234567890', registration_documents_title: 'Registration Certificate & Vehicle Document', ``` --- ## 7. LĂ©pĂ©s: Backend i18n (opcionĂĄlis) **FĂĄjl:** `backend/static/locales/hu.json` ```json "REGISTRATION_DOCUMENTS": { "CERTIFICATE_NUMBER": "Forgalmi engedĂ©ly szĂĄma", "CERTIFICATE_VALIDITY": "Forgalmi engedĂ©ly Ă©rvĂ©nyessĂ©ge", "DOCUMENT_NUMBER": "Törzskönyv szĂĄma" } ``` **FĂĄjl:** `backend/static/locales/en.json` ```json "REGISTRATION_DOCUMENTS": { "CERTIFICATE_NUMBER": "Registration Certificate Number", "CERTIFICATE_VALIDITY": "Registration Certificate Validity", "DOCUMENT_NUMBER": "Vehicle Registration Document Number" } ``` --- ## TesztelĂ©si terv 1. **AdatbĂĄzis:** `docker exec -it sf_api python -m app.scripts.sync_engine` futtatĂĄsa utĂĄn ellenƑrizni, hogy a 3 Ășj oszlop lĂ©trejött a `vehicle.assets` tĂĄblĂĄban 2. **API:** POST /vehicles hĂ­vĂĄs Ășj mezƑkkel → 201 Created + az Ășj mezƑk visszakĂŒldĂ©se 3. **API:** PUT /vehicles/{id} hĂ­vĂĄs Ășj mezƑkkel → 200 OK + az Ășj mezƑk frissĂ­tĂ©se 4. **API:** GET /vehicles/{id} → az Ășj mezƑk megjelennek a vĂĄlaszban 5. **Frontend:** VehicleFormModal → Admin tabon megjelennek az Ășj mezƑk, mentĂ©skor elkĂŒldƑdnek, szerkesztĂ©skor visszatöltƑdnek