Sync completed work orders into vehicle records
Some checks failed
ci / test (push) Has been cancelled
Some checks failed
ci / test (push) Has been cancelled
This commit is contained in:
@@ -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,
|
||||
|
||||
Reference in New Issue
Block a user