feat: stabilize KYC, international assets and multi-currency schema

- Split mother's name in KYC (last/first)
- Added mileage_unit and fuel_type to Assets
- Expanded AssetCost for international VAT and original currency
- Fixed SQLAlchemy IndexError in asset catalog lookup
- Added exchange_rate and ratings tables to models
This commit is contained in:
2026-02-08 23:41:07 +00:00
parent 451900ae1a
commit 24d35fe0c1
34 changed files with 709 additions and 347 deletions

View File

@@ -1,9 +1,11 @@
import enum
from sqlalchemy import Column, Integer, String, Boolean, DateTime, ForeignKey, JSON
import uuid
from sqlalchemy import Column, Integer, String, Boolean, DateTime, ForeignKey, JSON, text
from sqlalchemy.dialects.postgresql import ENUM as PG_ENUM
from sqlalchemy.orm import relationship
from sqlalchemy.sql import func
from app.db.base import Base
from app.db.base_class import Base
from sqlalchemy.dialects.postgresql import UUID as PG_UUID
class OrgType(str, enum.Enum):
individual = "individual"
@@ -19,18 +21,21 @@ class Organization(Base):
id = Column(Integer, primary_key=True, index=True)
# ÚJ MEZŐ: Egységes címkezelés (GeoService hibrid)
address_id = Column(PG_UUID(as_uuid=True), ForeignKey("data.addresses.id"), nullable=True)
# --- NÉVKEZELÉS ---
full_name = Column(String, nullable=False) # Teljes hivatalos név
name = Column(String, nullable=False) # Rövidített cégnév (pl. ProfiBot Kft.)
display_name = Column(String(50)) # Alkalmazáson belüli rövidítés (pl. ProfiBot)
name = Column(String, nullable=False) # Rövidített cégnév
display_name = Column(String(50)) # Alkalmazáson belüli rövidítés
# --- ATOMIZÁLT CÍMKEZELÉS ---
# --- ATOMIZÁLT CÍMKEZELÉS (Kompatibilitási réteg) ---
address_zip = Column(String(10))
address_city = Column(String(100))
address_street_name = Column(String(150))
address_street_type = Column(String(50)) # utca, út, tér, dűlő, stb.
address_street_type = Column(String(50))
address_house_number = Column(String(20))
address_hrsz = Column(String(50)) # Helyrajzi szám
address_hrsz = Column(String(50))
address_stairwell = Column(String(20))
address_floor = Column(String(20))
address_door = Column(String(20))
@@ -40,7 +45,6 @@ class Organization(Base):
tax_number = Column(String(20), unique=True, index=True)
reg_number = Column(String(50))
# PG_ENUM használata a Python Enum-mal szinkronizálva
org_type = Column(
PG_ENUM(OrgType, name="orgtype", inherit_schema=True),
default=OrgType.individual
@@ -49,13 +53,8 @@ class Organization(Base):
status = Column(String(30), default="pending_verification")
is_deleted = Column(Boolean, default=False)
notification_settings = Column(JSON, default={
"notify_owner": True,
"notify_manager": True,
"notify_contact": True,
"alert_days_before": [30, 15, 7, 1]
})
external_integration_config = Column(JSON, default={})
notification_settings = Column(JSON, server_default=text("'{ \"notify_owner\": true, \"alert_days_before\": [30, 15, 7, 1] }'::jsonb"))
external_integration_config = Column(JSON, server_default=text("'{}'::jsonb"))
owner_id = Column(Integer, ForeignKey("data.users.id"), nullable=True)
is_active = Column(Boolean, default=True)
@@ -67,8 +66,8 @@ class Organization(Base):
updated_at = Column(DateTime(timezone=True), onupdate=func.now())
# Kapcsolatok
assets = relationship("Asset", back_populates="organization", cascade="all, delete-orphan")
members = relationship("OrganizationMember", back_populates="organization")
assets = relationship("AssetAssignment", back_populates="organization", cascade="all, delete-orphan")
members = relationship("OrganizationMember", back_populates="organization", cascade="all, delete-orphan")
owner = relationship("User", back_populates="owned_organizations")
class OrganizationMember(Base):
@@ -77,9 +76,13 @@ class OrganizationMember(Base):
id = Column(Integer, primary_key=True, index=True)
organization_id = Column(Integer, ForeignKey("data.organizations.id"), nullable=False)
user_id = Column(Integer, ForeignKey("data.users.id"), nullable=False)
role = Column(String, default="driver")
role = Column(String, default="driver") # owner, manager, driver, service_staff
# JAVÍTVA: Jogosultságok JSONB mezője (can_add_asset, etc.)
permissions = Column(JSON, server_default=text("'{}'::jsonb"))
organization = relationship("Organization", back_populates="members")
user = relationship("app.models.identity.User") # Visszamutató kapcsolat a felhasználóra
# Kompatibilitási réteg a korábbi kódokhoz
# Kompatibilitási réteg
Organization.vehicles = Organization.assets