This commit is contained in:
@@ -3,7 +3,7 @@ from io import BytesIO
|
||||
|
||||
import matplotlib.pyplot as plt
|
||||
from fastapi import APIRouter, Depends, HTTPException, Response, status
|
||||
from sqlalchemy import select
|
||||
from sqlalchemy import func, select
|
||||
from sqlalchemy.ext.asyncio import AsyncSession
|
||||
|
||||
from app.api.deps import get_current_telegram_user
|
||||
@@ -25,6 +25,7 @@ from app.schemas.expense import (
|
||||
ServiceEntryRead,
|
||||
ServiceEntryUpdate,
|
||||
)
|
||||
from app.services.admin_notifications import create_admin_notification
|
||||
from app.services.calculations import dataframe_from_query, get_ownership_stats, predict_odometer
|
||||
from app.services.odometer import (
|
||||
apply_odometer_from_record,
|
||||
@@ -53,6 +54,59 @@ async def ensure_entry_owner(
|
||||
return entry
|
||||
|
||||
|
||||
async def maybe_notify_first_record(
|
||||
session: AsyncSession,
|
||||
*,
|
||||
user: User,
|
||||
car: Car,
|
||||
record_type: str,
|
||||
record_id: int,
|
||||
) -> None:
|
||||
fuel_count = int(
|
||||
(
|
||||
await session.execute(
|
||||
select(func.count(FuelEntry.id)).join(Car, FuelEntry.car_id == Car.id).where(Car.owner_id == user.id)
|
||||
)
|
||||
).scalar_one()
|
||||
or 0
|
||||
)
|
||||
service_count = int(
|
||||
(
|
||||
await session.execute(
|
||||
select(func.count(ServiceEntry.id)).join(Car, ServiceEntry.car_id == Car.id).where(Car.owner_id == user.id)
|
||||
)
|
||||
).scalar_one()
|
||||
or 0
|
||||
)
|
||||
expense_count = int(
|
||||
(
|
||||
await session.execute(
|
||||
select(func.count(ExpenseEntry.id)).join(Car, ExpenseEntry.car_id == Car.id).where(Car.owner_id == user.id)
|
||||
)
|
||||
).scalar_one()
|
||||
or 0
|
||||
)
|
||||
if fuel_count + service_count + expense_count != 1:
|
||||
return
|
||||
await create_admin_notification(
|
||||
session,
|
||||
event_type="first_record_created",
|
||||
title="Пользователь впервые создал запись",
|
||||
body="\n".join(
|
||||
[
|
||||
f"User ID: {user.id}",
|
||||
f"Telegram ID: {user.telegram_id}",
|
||||
f"Авто: {car.name}",
|
||||
f"Тип записи: {record_type}",
|
||||
]
|
||||
),
|
||||
entity_type="vehicle",
|
||||
entity_id=car.id,
|
||||
idempotency_key=f"first_record_created:{user.id}",
|
||||
metadata={"user_id": user.id, "vehicle_id": car.id, "record_type": record_type, "record_id": record_id},
|
||||
)
|
||||
|
||||
|
||||
@router.post("/fuel", response_model=FuelEntryRead, status_code=status.HTTP_201_CREATED)
|
||||
async def create_fuel_entry(
|
||||
payload: FuelEntryCreate,
|
||||
@@ -78,6 +132,7 @@ async def create_fuel_entry(
|
||||
changed_by=current_user.id,
|
||||
confirm_lower_odometer=payload.confirm_lower_odometer,
|
||||
)
|
||||
await maybe_notify_first_record(session, user=current_user, car=car, record_type="fuel", record_id=entry.id)
|
||||
await session.commit()
|
||||
await session.refresh(entry)
|
||||
return entry
|
||||
@@ -174,6 +229,7 @@ async def create_service_entry(
|
||||
changed_by=current_user.id,
|
||||
confirm_lower_odometer=payload.confirm_lower_odometer,
|
||||
)
|
||||
await maybe_notify_first_record(session, user=current_user, car=car, record_type="service", record_id=entry.id)
|
||||
await session.commit()
|
||||
await session.refresh(entry)
|
||||
return entry
|
||||
@@ -266,6 +322,7 @@ async def create_expense_entry(
|
||||
changed_by=current_user.id,
|
||||
confirm_lower_odometer=payload.confirm_lower_odometer,
|
||||
)
|
||||
await maybe_notify_first_record(session, user=current_user, car=car, record_type="expense", record_id=entry.id)
|
||||
await session.commit()
|
||||
await session.refresh(entry)
|
||||
return entry
|
||||
|
||||
Reference in New Issue
Block a user