Sync completed work orders into vehicle records
Some checks failed
ci / test (push) Has been cancelled

This commit is contained in:
VPN SaaS Dev
2026-05-16 12:17:45 +09:00
parent ecfb5aa949
commit 069b0a66c0
7 changed files with 68 additions and 4 deletions

View File

@@ -1,11 +1,14 @@
from datetime import UTC, datetime
from decimal import Decimal
from fastapi import APIRouter, Depends, HTTPException, status
from sqlalchemy import select
from sqlalchemy.ext.asyncio import AsyncSession
from app.api.deps import ensure_service_employee, get_current_telegram_user, log_audit
from app.db.session import get_session
from app.models.car import Car, ServiceVisit, ServiceWorkItem, VehicleDataChangeRequest
from app.models.expense import ExpenseCategory, ExpenseEntry, ServiceEntry, ServiceType
from app.models.user import User
from app.schemas.service_center import (
ServiceVisitRead,
@@ -27,6 +30,51 @@ async def get_visit_or_404(session: AsyncSession, visit_id: int) -> ServiceVisit
return visit
async def ensure_visit_owner_records(session: AsyncSession, visit: ServiceVisit, vehicle: Car) -> None:
service = (
await session.execute(
select(ServiceEntry).where(ServiceEntry.service_visit_id == visit.id)
)
).scalar_one_or_none()
expense = (
await session.execute(
select(ExpenseEntry).where(ExpenseEntry.service_visit_id == visit.id)
)
).scalar_one_or_none()
if service is not None and expense is not None:
return
amount = Decimal(str(visit.final_total or visit.total_cost or 0)).quantize(Decimal("0.01"))
title = f"Визит СТО #{visit.id}"
if service is None:
session.add(
ServiceEntry(
car_id=vehicle.id,
service_visit_id=visit.id,
entry_date=visit.visit_date,
odometer=visit.odometer,
service_type=ServiceType.maintenance,
title=title,
category="service_visit",
total_cost=amount,
notes=visit.service_comment or visit.notes,
)
)
if expense is None:
session.add(
ExpenseEntry(
car_id=vehicle.id,
service_visit_id=visit.id,
entry_date=visit.visit_date,
category=ExpenseCategory.maintenance,
title=title,
total_cost=max(amount, Decimal("0")),
currency=visit.currency,
odometer=visit.odometer,
metadata_json={"service_visit_id": visit.id},
)
)
@router.post("/{visit_id}/work-items", response_model=ServiceWorkItemRead, status_code=status.HTTP_201_CREATED)
async def add_work_item(
visit_id: int,
@@ -84,6 +132,7 @@ async def confirm_visit(
raise HTTPException(status_code=403, detail="Forbidden")
visit.status = "confirmed"
visit.owner_resolved_at = datetime.now(UTC)
await ensure_visit_owner_records(session, visit, vehicle)
await apply_odometer_from_record(
session,
vehicle,