|
|
|
|
@ -122,7 +122,7 @@ async def avaliar_veiculo_troca(modelo: str, ano: int, km: int) -> Dict[str, Any
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
async def agendar_revisao(placa: str, data_hora: str) -> Dict[str, Any]:
|
|
|
|
|
async def agendar_revisao(placa: str, data_hora: str, user_id: Optional[int] = None) -> Dict[str, Any]:
|
|
|
|
|
"""Cria ou reaproveita agendamento de revisao a partir de placa e data/hora."""
|
|
|
|
|
try:
|
|
|
|
|
dt = datetime.fromisoformat(data_hora.replace("Z", "+00:00"))
|
|
|
|
|
@ -132,7 +132,7 @@ async def agendar_revisao(placa: str, data_hora: str) -> Dict[str, Any]:
|
|
|
|
|
detail="data_hora invalida. Use formato ISO 8601, por exemplo: 2026-03-10T09:00:00-03:00",
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
entropy = hashlib.md5(f"{placa}:{data_hora}".encode("utf-8")).hexdigest()[:8].upper()
|
|
|
|
|
entropy = hashlib.md5(f"{user_id}:{placa}:{data_hora}".encode("utf-8")).hexdigest()[:8].upper()
|
|
|
|
|
protocolo = f"REV-{dt.strftime('%Y%m%d')}-{entropy}"
|
|
|
|
|
|
|
|
|
|
db = SessionMockLocal()
|
|
|
|
|
@ -141,6 +141,7 @@ async def agendar_revisao(placa: str, data_hora: str) -> Dict[str, Any]:
|
|
|
|
|
if existente:
|
|
|
|
|
return {
|
|
|
|
|
"protocolo": existente.protocolo,
|
|
|
|
|
"user_id": existente.user_id,
|
|
|
|
|
"placa": existente.placa,
|
|
|
|
|
"data_hora": existente.data_hora.isoformat(),
|
|
|
|
|
"status": existente.status,
|
|
|
|
|
@ -148,6 +149,7 @@ async def agendar_revisao(placa: str, data_hora: str) -> Dict[str, Any]:
|
|
|
|
|
|
|
|
|
|
agendamento = ReviewSchedule(
|
|
|
|
|
protocolo=protocolo,
|
|
|
|
|
user_id=user_id,
|
|
|
|
|
placa=placa.upper(),
|
|
|
|
|
data_hora=dt,
|
|
|
|
|
status="agendado",
|
|
|
|
|
@ -158,6 +160,7 @@ async def agendar_revisao(placa: str, data_hora: str) -> Dict[str, Any]:
|
|
|
|
|
|
|
|
|
|
return {
|
|
|
|
|
"protocolo": agendamento.protocolo,
|
|
|
|
|
"user_id": agendamento.user_id,
|
|
|
|
|
"placa": agendamento.placa,
|
|
|
|
|
"data_hora": agendamento.data_hora.isoformat(),
|
|
|
|
|
"status": agendamento.status,
|
|
|
|
|
@ -166,17 +169,38 @@ async def agendar_revisao(placa: str, data_hora: str) -> Dict[str, Any]:
|
|
|
|
|
db.close()
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
async def cancelar_pedido(numero_pedido: str, motivo: str) -> Dict[str, Any]:
|
|
|
|
|
async def cancelar_pedido(numero_pedido: str, motivo: str, user_id: Optional[int] = None) -> Dict[str, Any]:
|
|
|
|
|
"""Cancela pedido existente e registra motivo e data de cancelamento."""
|
|
|
|
|
db = SessionMockLocal()
|
|
|
|
|
try:
|
|
|
|
|
pedido = db.query(Order).filter(Order.numero_pedido == numero_pedido).first()
|
|
|
|
|
query = db.query(Order).filter(Order.numero_pedido == numero_pedido)
|
|
|
|
|
if user_id is not None:
|
|
|
|
|
query = query.filter(Order.user_id == user_id)
|
|
|
|
|
|
|
|
|
|
pedido = query.first()
|
|
|
|
|
if not pedido and user_id is not None:
|
|
|
|
|
# Compatibilidade com pedidos antigos que ainda nao possuem user_id.
|
|
|
|
|
legado = (
|
|
|
|
|
db.query(Order)
|
|
|
|
|
.filter(Order.numero_pedido == numero_pedido)
|
|
|
|
|
.filter(Order.user_id.is_(None))
|
|
|
|
|
.first()
|
|
|
|
|
)
|
|
|
|
|
if legado:
|
|
|
|
|
legado.user_id = user_id
|
|
|
|
|
db.commit()
|
|
|
|
|
db.refresh(legado)
|
|
|
|
|
pedido = legado
|
|
|
|
|
|
|
|
|
|
if not pedido:
|
|
|
|
|
if user_id is not None:
|
|
|
|
|
raise HTTPException(status_code=404, detail="Pedido nao encontrado para este usuario.")
|
|
|
|
|
raise HTTPException(status_code=404, detail="Pedido nao encontrado na base ficticia.")
|
|
|
|
|
|
|
|
|
|
if pedido.status.lower() == "cancelado":
|
|
|
|
|
return {
|
|
|
|
|
"numero_pedido": pedido.numero_pedido,
|
|
|
|
|
"user_id": pedido.user_id,
|
|
|
|
|
"status": pedido.status,
|
|
|
|
|
"motivo": pedido.motivo_cancelamento,
|
|
|
|
|
"data_cancelamento": pedido.data_cancelamento.isoformat() if pedido.data_cancelamento else None,
|
|
|
|
|
@ -190,6 +214,7 @@ async def cancelar_pedido(numero_pedido: str, motivo: str) -> Dict[str, Any]:
|
|
|
|
|
|
|
|
|
|
return {
|
|
|
|
|
"numero_pedido": pedido.numero_pedido,
|
|
|
|
|
"user_id": pedido.user_id,
|
|
|
|
|
"status": pedido.status,
|
|
|
|
|
"motivo": pedido.motivo_cancelamento,
|
|
|
|
|
"data_cancelamento": pedido.data_cancelamento.isoformat() if pedido.data_cancelamento else None,
|
|
|
|
|
|