first commit

This commit is contained in:
VPN SaaS Dev
2026-05-12 03:52:13 +09:00
commit d93c88c751
44 changed files with 4108 additions and 0 deletions

1
app/schemas/__init__.py Normal file
View File

@@ -0,0 +1 @@

58
app/schemas/car.py Normal file
View File

@@ -0,0 +1,58 @@
from datetime import date, datetime
from decimal import Decimal
from pydantic import BaseModel, ConfigDict
class CarBase(BaseModel):
name: str
make: str | None = None
model: str | None = None
year: int | None = None
plate_number: str | None = None
vin: str | None = None
fuel_type: str | None = None
purchase_date: date | None = None
purchase_price: Decimal | None = None
current_odometer: int | None = None
class CarCreate(CarBase):
owner_id: int
class CarUpdate(BaseModel):
name: str | None = None
make: str | None = None
model: str | None = None
year: int | None = None
plate_number: str | None = None
vin: str | None = None
fuel_type: str | None = None
purchase_date: date | None = None
purchase_price: Decimal | None = None
current_odometer: int | None = None
class CarRead(CarBase):
id: int
owner_id: int
created_at: datetime
model_config = ConfigDict(from_attributes=True)
class CarModelRead(BaseModel):
id: int
name: str
model_config = ConfigDict(from_attributes=True)
class CarMakeRead(BaseModel):
id: int
name: str
country: str | None = None
models: list[CarModelRead] = []
model_config = ConfigDict(from_attributes=True)

89
app/schemas/expense.py Normal file
View File

@@ -0,0 +1,89 @@
from datetime import date, datetime
from decimal import Decimal
from pydantic import BaseModel, ConfigDict, model_validator
from app.models.expense import ServiceType
class FuelEntryBase(BaseModel):
entry_date: date
odometer: int
liters: Decimal
price_per_liter: Decimal
total_cost: Decimal | None = None
station: str | None = None
fuel_brand: str | None = None
is_full_tank: bool = True
notes: str | None = None
@model_validator(mode="after")
def fill_total_cost(self) -> "FuelEntryBase":
if self.total_cost is None:
self.total_cost = self.liters * self.price_per_liter
return self
class FuelEntryCreate(FuelEntryBase):
car_id: int
class FuelEntryRead(FuelEntryBase):
id: int
car_id: int
total_cost: Decimal
created_at: datetime
model_config = ConfigDict(from_attributes=True)
class ServiceEntryBase(BaseModel):
entry_date: date
odometer: int | None = None
service_type: ServiceType
title: str
category: str | None = None
vendor: str | None = None
total_cost: Decimal
next_due_date: date | None = None
next_due_odometer: int | None = None
notes: str | None = None
class ServiceEntryCreate(ServiceEntryBase):
car_id: int
class ServiceEntryRead(ServiceEntryBase):
id: int
car_id: int
created_at: datetime
model_config = ConfigDict(from_attributes=True)
class OwnershipStats(BaseModel):
car_id: int
date_from: date
date_to: date
fuel_cost: Decimal
service_cost: Decimal
total_cost: Decimal
liters: Decimal
distance_km: int
avg_consumption_l_per_100km: float | None
cost_per_km: float | None
fuel_entries_count: int
service_entries_count: int
class OdometerPrediction(BaseModel):
car_id: int
samples: int
current_odometer: int | None
predicted_today: int | None
predicted_30_days: int | None
avg_km_per_day: float | None
avg_km_per_month: float | None
confidence: float
insight: str

26
app/schemas/user.py Normal file
View File

@@ -0,0 +1,26 @@
from datetime import datetime
from pydantic import BaseModel, ConfigDict
class UserUpsert(BaseModel):
telegram_id: int
username: str | None = None
first_name: str | None = None
last_name: str | None = None
locale: str | None = None
currency: str | None = None
class UserPreferencesUpdate(BaseModel):
locale: str | None = None
currency: str | None = None
class UserRead(UserUpsert):
id: int
locale: str
currency: str
created_at: datetime
model_config = ConfigDict(from_attributes=True)