"""Локальная очередь заказов (синхронизируется из CRM) — список, вкладки, удаление.""" from __future__ import annotations from fastapi import APIRouter, Depends, HTTPException, Request, status from app.api.deps import CashierUser, CrmClientDep, SessionDep, require_any from app.db.models.audit import AuditAction from app.schemas.orders import OrderRowOut from app.services import audit from app.services import orders as orders_service from app.services import receipts as receipts_service router = APIRouter(prefix="/orders", tags=["orders"], dependencies=[Depends(require_any)]) @router.get("", response_model=list[OrderRowOut], response_model_by_alias=False) async def list_orders( session: SessionDep, crm: CrmClientDep, has_receipt: bool = False ) -> list[OrderRowOut]: # by_alias=False: без этого FastAPI сериализует вложенные OrderGoodOut через # CRM-алиасы (SKU/Name/...) вместо snake_case полей, которые ждёт фронтенд. await orders_service.sync_orders_from_crm(session, crm) orders = await orders_service.list_orders(session, has_receipt=has_receipt) receipts = await receipts_service.latest_receipts_by_order( session, [order.id for order in orders] ) return [OrderRowOut.from_order(order, receipts.get(order.id)) for order in orders] @router.delete("/{order_id}", status_code=status.HTTP_204_NO_CONTENT) async def delete_order( order_id: str, request: Request, session: SessionDep, actor: CashierUser ) -> None: order = await orders_service.delete_order(session, order_id) if order is None: raise HTTPException(status_code=status.HTTP_404_NOT_FOUND, detail="Заказ не найден") await audit.record( session, action=AuditAction.ORDER_DELETED, user=actor, entity_type="order", entity_id=order.id, request=request, ) await session.commit()