Complete CarPass product flows

This commit is contained in:
VPN SaaS Dev
2026-05-14 21:19:37 +09:00
parent a83f55c646
commit c0014ab4ea
28 changed files with 3006 additions and 159 deletions

View File

@@ -28,6 +28,8 @@ class Car(Base):
make: Mapped[str | None] = mapped_column(String(80))
model: Mapped[str | None] = mapped_column(String(80))
trim: Mapped[str | None] = mapped_column(String(120))
generation: Mapped[str | None] = mapped_column(String(120))
body_type: Mapped[str | None] = mapped_column(String(80))
year: Mapped[int | None]
plate_number: Mapped[str | None] = mapped_column(String(32))
vin: Mapped[str | None] = mapped_column(String(32))
@@ -36,6 +38,9 @@ class Car(Base):
license_plate_country: Mapped[str | None] = mapped_column(String(2), index=True)
vin_normalized: Mapped[str | None] = mapped_column(String(17), unique=True, index=True)
fuel_type: Mapped[str | None] = mapped_column(String(32))
engine_volume_l: Mapped[Decimal | None] = mapped_column(Numeric(5, 2))
transmission: Mapped[str | None] = mapped_column(String(40))
drive_type: Mapped[str | None] = mapped_column(String(40))
target_consumption_l_per_100km: Mapped[Decimal | None] = mapped_column(Numeric(6, 2))
fuel_tank_volume_l: Mapped[Decimal | None] = mapped_column(Numeric(6, 2))
engine_oil_type: Mapped[str | None] = mapped_column(String(80))
@@ -46,11 +51,28 @@ class Car(Base):
brake_fluid_type: Mapped[str | None] = mapped_column(String(80))
tire_pressure_front_bar: Mapped[Decimal | None] = mapped_column(Numeric(4, 2))
tire_pressure_rear_bar: Mapped[Decimal | None] = mapped_column(Numeric(4, 2))
tire_size: Mapped[str | None] = mapped_column(String(80))
oil_change_interval_km: Mapped[int | None] = mapped_column(Integer)
oil_change_interval_months: Mapped[int | None] = mapped_column(Integer)
purchase_date: Mapped[date | None] = mapped_column(Date)
purchase_price: Mapped[Decimal | None] = mapped_column(Numeric(12, 2))
purchase_currency: Mapped[str | None] = mapped_column(String(3))
purchase_type: Mapped[str] = mapped_column(String(24), default="unknown", server_default="unknown")
currency: Mapped[str] = mapped_column(String(3), default="RUB", server_default="RUB")
include_depreciation: Mapped[bool] = mapped_column(Boolean, default=False, server_default="false")
expected_ownership_months: Mapped[int | None] = mapped_column(Integer)
expected_residual_value: Mapped[Decimal | None] = mapped_column(Numeric(12, 2))
loan_principal: Mapped[Decimal | None] = mapped_column(Numeric(12, 2))
loan_down_payment: Mapped[Decimal | None] = mapped_column(Numeric(12, 2))
loan_term_months: Mapped[int | None] = mapped_column(Integer)
loan_annual_interest_rate: Mapped[Decimal | None] = mapped_column(Numeric(6, 3))
loan_first_payment_date: Mapped[date | None] = mapped_column(Date)
loan_payment_day: Mapped[int | None] = mapped_column(Integer)
loan_payment_type: Mapped[str] = mapped_column(String(24), default="annuity", server_default="annuity")
loan_currency: Mapped[str | None] = mapped_column(String(3))
loan_comment: Mapped[str | None] = mapped_column(Text)
current_odometer: Mapped[int | None]
notes: Mapped[str | None] = mapped_column(Text)
created_at: Mapped[datetime] = mapped_column(DateTime(timezone=True), server_default=func.now())
updated_at: Mapped[datetime] = mapped_column(
DateTime(timezone=True), server_default=func.now(), onupdate=func.now()
@@ -61,6 +83,7 @@ class Car(Base):
service_entries = relationship("ServiceEntry", back_populates="car", cascade="all, delete-orphan")
expense_entries = relationship("ExpenseEntry", back_populates="car", cascade="all, delete-orphan")
service_links = relationship("CarServiceLink", back_populates="car", cascade="all, delete-orphan")
odometer_history = relationship("OdometerHistory", back_populates="car", cascade="all, delete-orphan")
class CarMake(Base):
@@ -163,6 +186,23 @@ class CarServiceLink(Base):
service_center = relationship("ServiceCenter", back_populates="car_links")
class OdometerHistory(Base):
__tablename__ = "odometer_history"
id: Mapped[int] = mapped_column(primary_key=True)
car_id: Mapped[int] = mapped_column(ForeignKey("cars.id", ondelete="CASCADE"), index=True)
previous_odometer: Mapped[int | None] = mapped_column(Integer)
new_odometer: Mapped[int] = mapped_column(Integer)
source_record_type: Mapped[str] = mapped_column(String(40), index=True)
source_record_id: Mapped[int | None] = mapped_column(Integer, index=True)
changed_at: Mapped[datetime] = mapped_column(DateTime(timezone=True), server_default=func.now(), index=True)
changed_by: Mapped[int | None] = mapped_column(ForeignKey("users.id", ondelete="SET NULL"), index=True)
confirmation_required: Mapped[bool] = mapped_column(Boolean, default=False, server_default="false")
user_confirmed: Mapped[bool] = mapped_column(Boolean, default=True, server_default="true")
car = relationship("Car", back_populates="odometer_history")
class ServiceInboxMessage(Base):
__tablename__ = "service_inbox_messages"