{"openapi":"3.1.0","info":{"title":"DUX Roteirização — API","description":"Contrato JSON da plataforma SaaS de roteirização de cargas da **DUX Tecnologia**.\n\nCampos em inglês (snake_case); a API é a fonte de verdade (RF-00). Autentique em `/v1/auth/login` e use o token como `Authorization: Bearer <token>`.","version":"0.1.0","x-logo":{"url":"/dux-pos.png"}},"paths":{"/v1/auth/login":{"post":{"tags":["auth"],"summary":"Login","description":"Autentica (login/e-mail + senha) e devolve um token de acesso.","operationId":"login_v1_auth_login_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LoginIn"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/LoginOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/captcha":{"get":{"tags":["auth"],"summary":"Captcha","description":"Gera um desafio simples (soma) para o cadastro de teste, anti-bot.","operationId":"captcha_v1_captcha_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/v1/signup":{"post":{"tags":["auth"],"summary":"Signup","description":"Cadastro self-service de teste (14 dias) com CONFIRMAÇÃO POR E-MAIL.\nCria a organização como PENDENTE e o usuário inativo; só ativa (libera o trial\nde 14 dias e envia as credenciais) quando o e-mail é confirmado pelo link —\nevita cadastros falsos em massa. Copia os parâmetros padrão (org 0).","operationId":"signup_v1_signup_post","requestBody":{"content":{"application/json":{"schema":{"type":"object","title":"Body"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/auth/confirm":{"post":{"tags":["auth"],"summary":"Confirm Signup","description":"Confirma o cadastro self-service pelo link do e-mail: ativa a organização\n(inicia o trial de 14 dias), ativa o usuário admin e envia as credenciais.","operationId":"confirm_signup_v1_auth_confirm_post","requestBody":{"content":{"application/json":{"schema":{"type":"object","title":"Body"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/auth/forgot":{"post":{"tags":["auth"],"summary":"Forgot Password","description":"Gera link de redefinição e 'envia por e-mail'. Não revela se o usuário existe.\n(Demo: o link vai para o log do servidor e é retornado em `demo_link`; em\nprodução, enviar por SMTP e NÃO retornar o link.)","operationId":"forgot_password_v1_auth_forgot_post","requestBody":{"content":{"application/json":{"schema":{"type":"object","title":"Body"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/auth/reset":{"post":{"tags":["auth"],"summary":"Reset Password","description":"Redefine a senha a partir de um token válido.","operationId":"reset_password_v1_auth_reset_post","requestBody":{"content":{"application/json":{"schema":{"type":"object","title":"Body"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/auth/change-password":{"post":{"tags":["auth"],"summary":"Change Password","description":"O próprio usuário altera a senha (confere a senha atual).","operationId":"change_password_v1_auth_change_password_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","title":"Body"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/session":{"get":{"tags":["auth"],"summary":"Session Info","description":"Estado da sessão atual: usuário, tipo e organização ativa.","operationId":"session_info_v1_session_get","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SessionOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/session/organization":{"post":{"tags":["auth"],"summary":"Select Organization","description":"Define a organização ativa da sessão. Admin de plataforma escolhe qualquer\numa (com auditoria, RF-03/decisão 2.4); usuário comum só a própria.","operationId":"select_organization_v1_session_organization_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OrgSelectIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SessionOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/telemetria/evento":{"post":{"tags":["telemetria"],"summary":"Telemetria Evento","description":"Registra evento de uso (tela acessada, ação) e marca atividade na sessão.","operationId":"telemetria_evento_v1_telemetria_evento_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","title":"Body"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/telemetria/ping":{"post":{"tags":["telemetria"],"summary":"Telemetria Ping","description":"Heartbeat: mantém o relógio da sessão enquanto a aba está aberta/ativa.","operationId":"telemetria_ping_v1_telemetria_ping_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/telemetria/logout":{"post":{"tags":["telemetria"],"summary":"Telemetria Logout","description":"Encerra a sessão (logout explícito ou fechamento de aba via fetch keepalive):\ngrava a duração total e o evento de logout.","operationId":"telemetria_logout_v1_telemetria_logout_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/telemetria/resumo/{org_id}":{"get":{"tags":["telemetria"],"summary":"Telemetria Resumo","description":"Resumo de uso do trial (sessões, dias de acesso, tempo total/médio, telas,\nsequência). Consumido pelo CRM/robô de insights. Acesso: token de serviço\n(X-Ingest-Token) OU sessão de admin de plataforma.","operationId":"telemetria_resumo_v1_telemetria_resumo__org_id__get","parameters":[{"name":"org_id","in":"path","required":true,"schema":{"type":"integer","title":"Org Id"}},{"name":"authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}},{"name":"x-ingest-token","in":"header","required":false,"schema":{"type":"string","title":"X-Ingest-Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/customers":{"get":{"tags":["customers"],"summary":"Lookup Customer","description":"Consulta cliente por código externo (SRS RF-18a). Retorna o id se existir.","operationId":"lookup_customer_v1_customers_get","parameters":[{"name":"external_code","in":"query","required":true,"schema":{"type":"string","description":"CODCLIENTE_EXT no ERP","title":"External Code"},"description":"CODCLIENTE_EXT no ERP"},{"name":"authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CustomerLookup"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/orders":{"post":{"tags":["orders"],"summary":"Create Orders","description":"Cria pedido(s) no pool. Aceita objeto único ou lista. Resolve o cliente por\n`customer_id` OU `customer_code`; rejeita se o cliente não estiver pré-cadastrado.","operationId":"create_orders_v1_orders_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"anyOf":[{"$ref":"#/components/schemas/OrderIn"},{"type":"array","items":{"$ref":"#/components/schemas/OrderIn"}}],"title":"Body"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OrderCreateResult"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["orders"],"summary":"List Orders","description":"Lista os pedidos do pool da organização.","operationId":"list_orders_v1_orders_get","parameters":[{"name":"status","in":"query","required":false,"schema":{"type":"string","description":"Filtra por STATUS (P,R,T,E,N,A)","title":"Status"},"description":"Filtra por STATUS (P,R,T,E,N,A)"},{"name":"authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/OrderOut"},"title":"Response List Orders V1 Orders Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/orders/bulk-delete":{"post":{"tags":["orders"],"summary":"Orders Bulk Delete","description":"Exclui vários pedidos. Bloqueia os que estão em uso (em rota/ordem de carga)\ne devolve a lista do que foi excluído e do que foi bloqueado (com motivo).","operationId":"orders_bulk_delete_v1_orders_bulk_delete_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","title":"Body"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/routings":{"post":{"tags":["routings"],"summary":"Create Routing","description":"Cria uma roteirização para um depósito e importa os pedidos P/N do pool.","operationId":"create_routing_v1_routings_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RoutingIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RoutingOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["routings"],"summary":"List Routings","description":"Lista as roteirizações da organização (tela inicial da roteirização).","operationId":"list_routings_v1_routings_get","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/drivers/{driver_id}/whatsapp":{"post":{"tags":["drivers"],"summary":"Set Driver Whatsapp","description":"Salva o WhatsApp do motorista (qualquer usuário da org). Guarda só dígitos.","operationId":"set_driver_whatsapp_v1_drivers__driver_id__whatsapp_post","parameters":[{"name":"driver_id","in":"path","required":true,"schema":{"type":"integer","title":"Driver Id"}},{"name":"authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","title":"Body"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/routings/{routing_id}":{"delete":{"tags":["routings"],"summary":"Delete Routing","description":"Exclui a roteirização e devolve os pedidos ao pool. Só é permitido se\nnenhuma entrega tiver sido efetuada/iniciada (nenhum pedido T/E/N).","operationId":"delete_routing_v1_routings__routing_id__delete","parameters":[{"name":"routing_id","in":"path","required":true,"schema":{"type":"integer","title":"Routing Id"}},{"name":"authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/load-orders/{load_id}":{"delete":{"tags":["routings"],"summary":"Delete Load Order","description":"Exclui apenas uma ordem de carga; seus pedidos voltam ao pool (pendente).\nSó permitido se o motorista ainda não começou as entregas (nenhum T/E/N).","operationId":"delete_load_order_v1_load_orders__load_id__delete","parameters":[{"name":"load_id","in":"path","required":true,"schema":{"type":"integer","title":"Load Id"}},{"name":"authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/routing/candidates":{"get":{"tags":["routings"],"summary":"Routing Candidates","description":"Pedidos candidatos à roteirização (P/N) com os dados para a 1ª etapa do\nassistente: cliente, peso, volume, valor e prioridade.","operationId":"routing_candidates_v1_routing_candidates_get","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/routings/{routing_id}/execute":{"post":{"tags":["routings"],"summary":"Execute Routing","description":"Dispara a otimização. Assíncrono por contrato (retorna job_id); no demo\nexecuta em linha e já deixa o resultado pronto para GET .../result.","operationId":"execute_routing_v1_routings__routing_id__execute_post","parameters":[{"name":"routing_id","in":"path","required":true,"schema":{"type":"integer","title":"Routing Id"}},{"name":"authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ExecuteResult"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/routings/{routing_id}/result":{"get":{"tags":["routings"],"summary":"Routing Result","description":"Resultado: ordens de carga (veículo/motorista/sequência/métricas) +\npedidos não roteirizados com o código do motivo (SRS RF-34/35).","operationId":"routing_result_v1_routings__routing_id__result_get","parameters":[{"name":"routing_id","in":"path","required":true,"schema":{"type":"integer","title":"Routing Id"}},{"name":"authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RoutingResult"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/driver/loads":{"get":{"tags":["driver"],"summary":"Driver Loads","description":"Cargas do dia do motorista logado (RF-39/40), com a sequência de entregas.","operationId":"driver_loads_v1_driver_loads_get","parameters":[{"name":"date","in":"query","required":false,"schema":{"type":"string","description":"YYYY-MM-DD; padrão hoje","title":"Date"},"description":"YYYY-MM-DD; padrão hoje"},{"name":"authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/orders/{order_id}/deliver":{"post":{"tags":["driver"],"summary":"Deliver Order","description":"Marca o pedido como Entregue (E), gravando a data/hora (RF-40).","operationId":"deliver_order_v1_orders__order_id__deliver_post","parameters":[{"name":"order_id","in":"path","required":true,"schema":{"type":"integer","title":"Order Id"}},{"name":"authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/orders/{order_id}/undelivered":{"post":{"tags":["driver"],"summary":"Undeliver Order","description":"Marca o pedido como Não Entregue (N); justificativa obrigatória (RF-40a).","operationId":"undeliver_order_v1_orders__order_id__undelivered_post","parameters":[{"name":"order_id","in":"path","required":true,"schema":{"type":"integer","title":"Order Id"}},{"name":"authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","title":"Body"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/tracking/vehicles":{"get":{"tags":["tracking"],"summary":"Tracking Vehicles","description":"Veículos da organização + data/hora e local da última coordenada (RF-42).","operationId":"tracking_vehicles_v1_tracking_vehicles_get","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/tracking/vehicle/{vid}":{"get":{"tags":["tracking"],"summary":"Tracking Positions","description":"Posições de um veículo. Com from/to (YYYY-MM-DDTHH:MM) retorna o período;\nsem filtro, só a última conhecida (RF-42).","operationId":"tracking_positions_v1_tracking_vehicle__vid__get","parameters":[{"name":"vid","in":"path","required":true,"schema":{"type":"integer","title":"Vid"}},{"name":"from","in":"query","required":false,"schema":{"type":"string","title":"From"}},{"name":"to","in":"query","required":false,"schema":{"type":"string","title":"To"}},{"name":"authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/tracking/loads":{"get":{"tags":["tracking"],"summary":"Tracking Loads","description":"Ordens de carga LIBERADAS para o operador acompanhar, filtradas pela data de\nsaída da roteirização (período from/to = YYYY-MM-DD).","operationId":"tracking_loads_v1_tracking_loads_get","parameters":[{"name":"from","in":"query","required":false,"schema":{"type":"string","title":"From"}},{"name":"to","in":"query","required":false,"schema":{"type":"string","title":"To"}},{"name":"authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/tracking/load/{load_id}":{"get":{"tags":["tracking"],"summary":"Tracking Load","description":"Detalhe de uma carga p/ desenhar no mapa: depósito, paradas (com status de entrega)\ne a última posição do veículo.","operationId":"tracking_load_v1_tracking_load__load_id__get","parameters":[{"name":"load_id","in":"path","required":true,"schema":{"type":"integer","title":"Load Id"}},{"name":"authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/driver/position":{"post":{"tags":["driver"],"summary":"Driver Position","description":"Ping de rastreamento (a cada 5 min em rota, RF-41). Bufferiza no app.","operationId":"driver_position_v1_driver_position_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","title":"Body"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/depots":{"get":{"tags":["depots"],"summary":"List Depots","operationId":"list_depots_v1_depots_get","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/vehicles":{"get":{"tags":["vehicles"],"summary":"List Vehicles","operationId":"list_vehicles_v1_vehicles_get","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/customers/list":{"get":{"tags":["customers"],"summary":"List Customers","description":"Lista os clientes da organização (para a tela de cadastro).","operationId":"list_customers_v1_customers_list_get","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/ciot/fontes/depositos":{"get":{"tags":["ciot"],"summary":"Ciot Fontes Depositos","description":"Depósitos/Empresas da org com dados p/ preencher uma parte do CIOT (RF-00b).","operationId":"ciot_fontes_depositos_v1_ciot_fontes_depositos_get","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/ciot/fontes/clientes":{"get":{"tags":["ciot"],"summary":"Ciot Fontes Clientes","description":"Clientes da org com dados p/ preencher uma parte do CIOT (RF-00b).","operationId":"ciot_fontes_clientes_v1_ciot_fontes_clientes_get","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/ciot/fontes/motoristas":{"get":{"tags":["ciot"],"summary":"Ciot Fontes Motoristas","description":"Motoristas da org p/ preencher a seção Motorista do CIOT (RF-00b).","operationId":"ciot_fontes_motoristas_v1_ciot_fontes_motoristas_get","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/users":{"get":{"tags":["users"],"summary":"List Users","description":"Lista os usuários da organização ativa (RF-02). Apenas admin do tenant/plataforma.","operationId":"list_users_v1_users_get","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/drivers":{"get":{"tags":["drivers"],"summary":"List Drivers","description":"Lista os motoristas da organização.","operationId":"list_drivers_v1_drivers_get","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/organizations":{"get":{"tags":["organizations"],"summary":"List Organizations","description":"Lista as organizações. Apenas administrador de plataforma (SRS RF-01).\nInclui a org 0 (Modelo) e a org 1 (Demonstração), além dos tenants (>=1000).","operationId":"list_organizations_v1_organizations_get","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/organizations/{org_id}/tokens":{"get":{"tags":["integration"],"summary":"List Tokens","description":"Lista os tokens de integração da organização (sem expor o segredo).","operationId":"list_tokens_v1_organizations__org_id__tokens_get","parameters":[{"name":"org_id","in":"path","required":true,"schema":{"type":"integer","title":"Org Id"}},{"name":"authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["integration"],"summary":"Create Token","description":"Gera um token de integração. O segredo é devolvido UMA vez (só o hash é\nguardado); use-o como `Authorization: Bearer <token>`.","operationId":"create_token_v1_organizations__org_id__tokens_post","parameters":[{"name":"org_id","in":"path","required":true,"schema":{"type":"integer","title":"Org Id"}},{"name":"authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","title":"Body"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/organizations/{org_id}/tokens/{token_id}/revoke":{"post":{"tags":["integration"],"summary":"Revoke Token","description":"Revoga um token de integração (acesso cortado imediatamente).","operationId":"revoke_token_v1_organizations__org_id__tokens__token_id__revoke_post","parameters":[{"name":"org_id","in":"path","required":true,"schema":{"type":"integer","title":"Org Id"}},{"name":"token_id","in":"path","required":true,"schema":{"type":"integer","title":"Token Id"}},{"name":"authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/ciot/exemplo":{"get":{"tags":["ciot"],"summary":"Ciot Exemplo","operationId":"ciot_exemplo_v1_ciot_exemplo_get","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/ciot/emissores":{"get":{"tags":["ciot"],"summary":"Ciot Emissores","description":"Lista os emissores (provedores) plugáveis e qual está ativo na organização.","operationId":"ciot_emissores_v1_ciot_emissores_get","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/ciot/emissor":{"post":{"tags":["ciot"],"summary":"Ciot Set Emissor","description":"Define o emissor de CIOT da organização (ex.: 'bbc'). Config opcional p/ provedores\nque exijam endpoint/credenciais próprios.","operationId":"ciot_set_emissor_v1_ciot_emissor_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","title":"Body"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/ciot/distancia":{"get":{"tags":["ciot"],"summary":"Ciot Distancia","description":"Distância origem→destino em km. Tenta a rota real por estrada (OSRM);\nse indisponível, cai na linha reta (haversine) × fator de via.","operationId":"ciot_distancia_v1_ciot_distancia_get","parameters":[{"name":"lat1","in":"query","required":true,"schema":{"type":"number","title":"Lat1"}},{"name":"lng1","in":"query","required":true,"schema":{"type":"number","title":"Lng1"}},{"name":"lat2","in":"query","required":true,"schema":{"type":"number","title":"Lat2"}},{"name":"lng2","in":"query","required":true,"schema":{"type":"number","title":"Lng2"}},{"name":"authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/ciot/naturezas":{"get":{"tags":["ciot"],"summary":"Ciot Naturezas","description":"Busca no catálogo de naturezas de carga (GetNaturezasCarga, cacheado).","operationId":"ciot_naturezas_v1_ciot_naturezas_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"type":"string","default":"","title":"Q"}},{"name":"limite","in":"query","required":false,"schema":{"type":"integer","default":30,"title":"Limite"}},{"name":"authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/ciot/bancos":{"get":{"tags":["ciot"],"summary":"Ciot Bancos","description":"Lista de bancos (GetBancos da BBC, cacheado — código 3 dígitos).","operationId":"ciot_bancos_v1_ciot_bancos_get","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/ciot/cnpj/{cnpj}":{"get":{"tags":["ciot"],"summary":"Ciot Cnpj","description":"Dados de uma empresa por CNPJ. Primeiro o cache local (CNPJ_CACHE); se não\nhouver, consulta a Receita online e cacheia. Usado p/ autopreencher as partes.","operationId":"ciot_cnpj_v1_ciot_cnpj__cnpj__get","parameters":[{"name":"cnpj","in":"path","required":true,"schema":{"type":"string","title":"Cnpj"}},{"name":"authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/ciot/emitir":{"post":{"tags":["ciot"],"summary":"Ciot Emitir","operationId":"ciot_emitir_v1_ciot_emitir_post","parameters":[{"name":"dry_run","in":"query","required":false,"schema":{"type":"boolean","default":true,"title":"Dry Run"}},{"name":"rid","in":"query","required":false,"schema":{"type":"integer","title":"Rid"}},{"name":"authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","title":"Body"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/ciot/erros/{rid}":{"get":{"tags":["ciot"],"summary":"Ciot Erros","description":"Erros de emissão vinculados a um registro de CIOT (mais recente primeiro).","operationId":"ciot_erros_v1_ciot_erros__rid__get","parameters":[{"name":"rid","in":"path","required":true,"schema":{"type":"integer","title":"Rid"}},{"name":"authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/ciot/emitidos":{"get":{"tags":["ciot"],"summary":"Ciot Emitidos","operationId":"ciot_emitidos_v1_ciot_emitidos_get","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/ciot/rascunho":{"post":{"tags":["ciot"],"summary":"Ciot Rascunho Salvar","description":"Salva/atualiza um rascunho do CIOT (sem validar, sem emitir) p/ continuar depois.","operationId":"ciot_rascunho_salvar_v1_ciot_rascunho_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","title":"Body"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/ciot/rascunho/{rid}":{"get":{"tags":["ciot"],"summary":"Ciot Rascunho Obter","operationId":"ciot_rascunho_obter_v1_ciot_rascunho__rid__get","parameters":[{"name":"rid","in":"path","required":true,"schema":{"type":"integer","title":"Rid"}},{"name":"authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/ciot/rascunho/{rid}/excluir":{"post":{"tags":["ciot"],"summary":"Ciot Rascunho Excluir","operationId":"ciot_rascunho_excluir_v1_ciot_rascunho__rid__excluir_post","parameters":[{"name":"rid","in":"path","required":true,"schema":{"type":"integer","title":"Rid"}},{"name":"authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/ciot/emitidos/{ciot}":{"get":{"tags":["ciot"],"summary":"Ciot Emitido","operationId":"ciot_emitido_v1_ciot_emitidos__ciot__get","parameters":[{"name":"ciot","in":"path","required":true,"schema":{"type":"string","title":"Ciot"}},{"name":"authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/ciot/consultar-situacao":{"post":{"tags":["ciot"],"summary":"Ciot Consultar","operationId":"ciot_consultar_v1_ciot_consultar_situacao_post","parameters":[{"name":"dry_run","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Dry Run"}},{"name":"authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","title":"Body"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/ciot/cancelar":{"post":{"tags":["ciot"],"summary":"Ciot Cancelar","operationId":"ciot_cancelar_v1_ciot_cancelar_post","parameters":[{"name":"dry_run","in":"query","required":false,"schema":{"type":"boolean","default":true,"title":"Dry Run"}},{"name":"consultar_antes","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Consultar Antes"}},{"name":"authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","title":"Body"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/ciot/retificar":{"post":{"tags":["ciot"],"summary":"Ciot Retificar","operationId":"ciot_retificar_v1_ciot_retificar_post","parameters":[{"name":"dry_run","in":"query","required":false,"schema":{"type":"boolean","default":true,"title":"Dry Run"}},{"name":"authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","title":"Body"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/integrations/sankhya/test":{"post":{"tags":["integration"],"summary":"Sankhya Test","description":"Testa a conexão REAL com a Sankhya (autentica no Gateway).","operationId":"sankhya_test_v1_integrations_sankhya_test_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","title":"Body"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/integrations/sankhya/config":{"post":{"tags":["integration"],"summary":"Sankhya Save Config","description":"Salva a configuração da integração Sankhya da organização ativa.","operationId":"sankhya_save_config_v1_integrations_sankhya_config_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","title":"Body"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"get":{"tags":["integration"],"summary":"Sankhya Get Config","description":"Carrega a configuração da integração Sankhya da organização ativa.","operationId":"sankhya_get_config_v1_integrations_sankhya_config_get","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/integrations/sankhya/query":{"post":{"tags":["integration"],"summary":"Sankhya Query","description":"Executa um SELECT no Sankhya (DbExplorerSP.executeQuery) e devolve colunas+linhas.\nSó leitura: bloqueia qualquer verbo de escrita.","operationId":"sankhya_query_v1_integrations_sankhya_query_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","title":"Body"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/integrations/connections":{"get":{"tags":["integration"],"summary":"List Connections","description":"Lista as conexões de integração configuradas na organização ativa.","operationId":"list_connections_v1_integrations_connections_get","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["integration"],"summary":"Save Connection","description":"Cria ou atualiza (quando vem `id`) uma conexão de integração.","operationId":"save_connection_v1_integrations_connections_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","title":"Body"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/integrations/tops":{"get":{"tags":["integration"],"summary":"List Tops","description":"Lista as TOPs (TGFTOP) consideradas na integração da organização ativa.","operationId":"list_tops_v1_integrations_tops_get","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["integration"],"summary":"Save Tops","description":"Substitui o conjunto de TOPs consideradas da organização ativa.\nPK da tabela = (ID_ORGANIZACAO, CODTIPOPER).","operationId":"save_tops_v1_integrations_tops_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","title":"Body"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/integrations/import/classify":{"post":{"tags":["integration"],"summary":"Integ Import Classify","description":"Classifica as linhas vindas da conexão em NOVAS (não existem na nossa base)\nx EXISTENTES (já existem, pela chave natural). Não grava nada — só separa para\nas abas 'Novos cadastros' x 'Atualização'.","operationId":"integ_import_classify_v1_integrations_import_classify_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","title":"Body"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/integrations/import":{"post":{"tags":["integration"],"summary":"Integ Import","description":"Importa registros selecionados (vindos de uma conexão) para os cadastros.\nMapeia as colunas pelo nome retornado no SELECT.\nmode='insert' (padrão): só insere os que ainda não existem (ignora os existentes).\nmode='update': só atualiza os que já existem (ignora os novos).","operationId":"integ_import_v1_integrations_import_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","title":"Body"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/integrations/connections/{cid}":{"delete":{"tags":["integration"],"summary":"Delete Connection","description":"Exclui uma conexão de integração da organização ativa.","operationId":"delete_connection_v1_integrations_connections__cid__delete","parameters":[{"name":"cid","in":"path","required":true,"schema":{"type":"integer","title":"Cid"}},{"name":"authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/parameters":{"get":{"tags":["parameters"],"summary":"List Parameters","description":"Lista os parâmetros da organização, com valor atual e documentação (RF-06b).","operationId":"list_parameters_v1_parameters_get","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/parameters/{chave}":{"get":{"tags":["parameters"],"summary":"Get Parameter","description":"Um parâmetro com valor atual, padrão (org 0), documentação e tipo.","operationId":"get_parameter_v1_parameters__chave__get","parameters":[{"name":"chave","in":"path","required":true,"schema":{"type":"string","title":"Chave"}},{"name":"authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["parameters"],"summary":"Update Parameter","description":"Altera o valor de um parâmetro (admin do tenant/plataforma). A documentação não muda.","operationId":"update_parameter_v1_parameters__chave__patch","parameters":[{"name":"chave","in":"path","required":true,"schema":{"type":"string","title":"Chave"}},{"name":"authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","title":"Body"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/import/{entity}/template":{"get":{"tags":["import"],"summary":"Import Template","operationId":"import_template_v1_import__entity__template_get","parameters":[{"name":"entity","in":"path","required":true,"schema":{"type":"string","title":"Entity"}},{"name":"format","in":"query","required":false,"schema":{"type":"string","pattern":"^(csv|xlsx)$","default":"xlsx","title":"Format"}},{"name":"authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/import/{entity}":{"post":{"tags":["import"],"summary":"Import Data","description":"Importa Clientes ou Pedidos de um CSV/Excel para a organização ativa.","operationId":"import_data_v1_import__entity__post","parameters":[{"name":"entity","in":"path","required":true,"schema":{"type":"string","title":"Entity"}},{"name":"authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_import_data_v1_import__entity__post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/maps-key":{"get":{"tags":["maps"],"summary":"Maps Key","description":"Chave do Google Maps JS para o navegador. Usa google_maps_browser.key\n(restrita por referrer) se existir; senão cai na chave do servidor.","operationId":"maps_key_v1_maps_key_get","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/load-orders/move-bulk":{"post":{"tags":["routings"],"summary":"Move Bulk","description":"Move vários pedidos de uma vez (do pool e/ou de outras cargas) para a carga de um\nveículo. Recalcula as cargas de ORIGEM e a de DESTINO; apaga cargas que ficarem vazias.\nUsado pelo laço de polígono (seleciona roteirizados + não roteirizados juntos).","operationId":"move_bulk_v1_load_orders_move_bulk_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","title":"Body"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/load-orders/manual":{"post":{"tags":["routings"],"summary":"Manual Load Order","description":"Montagem manual: joga os pedidos selecionados (polígono) num veículo. Se o veículo\njá tem carga nesta roteirização, anexa; senão cria a carga. Sequencia por vizinho mais\npróximo e recalcula métricas. Não bloqueia por capacidade (modo manual).","operationId":"manual_load_order_v1_load_orders_manual_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","title":"Body"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/load-orders/remove-orders":{"post":{"tags":["routings"],"summary":"Remove Orders From Load","description":"Remove um ou mais pedidos da ordem de carga (voltam ao pool da roteirização).\nBloqueia se o motorista já começou a entrega (status T/E/N). Renumera/recalcula a\ncarga e a exclui se ficar vazia.","operationId":"remove_orders_from_load_v1_load_orders_remove_orders_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","title":"Body"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/load-orders/{load_id}/driver":{"patch":{"tags":["routings"],"summary":"Set Load Driver","description":"Define (ou remove) o motorista de uma ordem de carga.","operationId":"set_load_driver_v1_load_orders__load_id__driver_patch","parameters":[{"name":"load_id","in":"path","required":true,"schema":{"type":"integer","title":"Load Id"}},{"name":"authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","title":"Body"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/load-orders/{load_id}/vehicle":{"patch":{"tags":["routings"],"summary":"Set Load Vehicle","description":"Troca o veículo de uma ordem de carga e recalcula capacidade/ocupação.","operationId":"set_load_vehicle_v1_load_orders__load_id__vehicle_patch","parameters":[{"name":"load_id","in":"path","required":true,"schema":{"type":"integer","title":"Load Id"}},{"name":"authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","title":"Body"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/load-orders/{load_id}/release":{"post":{"tags":["routings"],"summary":"Release Load","description":"Libera (despacha) ou reabre uma ordem de carga. Carga liberada fica oculta no mapa.","operationId":"release_load_v1_load_orders__load_id__release_post","parameters":[{"name":"load_id","in":"path","required":true,"schema":{"type":"integer","title":"Load Id"}},{"name":"authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","title":"Body"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/load-orders/{load_id}/resequence":{"post":{"tags":["routings"],"summary":"Resequence Load","description":"Reordena as paradas de uma carga (arrastar e soltar). body.stops = lista de\ngrupos de pedidos na nova ordem: [[id,id],[id],...] (cada grupo = uma parada).","operationId":"resequence_load_v1_load_orders__load_id__resequence_post","parameters":[{"name":"load_id","in":"path","required":true,"schema":{"type":"integer","title":"Load Id"}},{"name":"authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","title":"Body"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/load-orders/{load_id}/restore-sequence":{"post":{"tags":["routings"],"summary":"Restore Sequence","description":"Restaura a sequência original de entrega da carga (a proposta pelo motor/montagem).\nSe a carga não tiver original gravada (dados antigos), reotimiza por vizinho mais próximo.","operationId":"restore_sequence_v1_load_orders__load_id__restore_sequence_post","parameters":[{"name":"load_id","in":"path","required":true,"schema":{"type":"integer","title":"Load Id"}},{"name":"authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/load-orders/move":{"post":{"tags":["routings"],"summary":"Move Delivery","description":"Move uma entrega (pedido) para outra ordem de carga da mesma roteirização;\nrenumera a sequência das duas e recalcula as métricas (RF-31b).","operationId":"move_delivery_v1_load_orders_move_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","title":"Body"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/route-path":{"post":{"tags":["routings"],"summary":"Route Path","description":"Geometria da rota seguindo as ruas (OSRM). points=[[lat,lng],...].","operationId":"route_path_v1_route_path_post","parameters":[{"name":"authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","title":"Body"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/geocode":{"get":{"tags":["geocode"],"summary":"Geocode","description":"Autocompletar de endereço (RF-00b): retorna sugestões estruturadas\n(logradouro, CEP, cidade, UF) já com coordenadas. Adapter: OpenStreetMap.","operationId":"geocode_v1_geocode_get","parameters":[{"name":"q","in":"query","required":true,"schema":{"type":"string","description":"Texto do endereço a buscar","title":"Q"},"description":"Texto do endereço a buscar"},{"name":"authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/admin/{entity}/schema":{"get":{"tags":["cadastros"],"summary":"Entity Schema","description":"Esquema de campos (rótulos, tipos, editável na edição, criável no novo, PK).\nCampos 'option' trazem as opções (valor+descrição); 'address' indica o\nmapeamento do campo rico de endereço. `can_manage` diz se o usuário pode\ncriar/editar.","operationId":"entity_schema_v1_admin__entity__schema_get","parameters":[{"name":"entity","in":"path","required":true,"schema":{"type":"string","title":"Entity"}},{"name":"authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/admin/{entity}/{rec_id}":{"get":{"tags":["cadastros"],"summary":"Entity Get","description":"Obtém um registro para edição (requer perfil de gestão da entidade).","operationId":"entity_get_v1_admin__entity___rec_id__get","parameters":[{"name":"entity","in":"path","required":true,"schema":{"type":"string","title":"Entity"}},{"name":"rec_id","in":"path","required":true,"schema":{"type":"integer","title":"Rec Id"}},{"name":"authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["cadastros"],"summary":"Entity Update","description":"Atualiza os campos editáveis. A PK e os campos somente-leitura são ignorados.","operationId":"entity_update_v1_admin__entity___rec_id__patch","parameters":[{"name":"entity","in":"path","required":true,"schema":{"type":"string","title":"Entity"}},{"name":"rec_id","in":"path","required":true,"schema":{"type":"integer","title":"Rec Id"}},{"name":"authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","title":"Body"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["cadastros"],"summary":"Entity Delete","description":"Exclui um registro do cadastro (somente entidades habilitadas e do perfil de gestão).","operationId":"entity_delete_v1_admin__entity___rec_id__delete","parameters":[{"name":"entity","in":"path","required":true,"schema":{"type":"string","title":"Entity"}},{"name":"rec_id","in":"path","required":true,"schema":{"type":"integer","title":"Rec Id"}},{"name":"authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/admin/{entity}":{"post":{"tags":["cadastros"],"summary":"Entity Create","description":"Cria um registro (botão \"Novo\"). Respeita o perfil de gestão da entidade.\nA PK autoincrement não é aceita no corpo; FKs e demais campos sim.","operationId":"entity_create_v1_admin__entity__post","parameters":[{"name":"entity","in":"path","required":true,"schema":{"type":"string","title":"Entity"}},{"name":"authorization","in":"header","required":false,"schema":{"type":"string","title":"Authorization"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","title":"Body"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}}},"components":{"schemas":{"Body_import_data_v1_import__entity__post":{"properties":{"file":{"type":"string","format":"binary","title":"File"}},"type":"object","required":["file"],"title":"Body_import_data_v1_import__entity__post"},"CustomerLookup":{"properties":{"found":{"type":"boolean","title":"Found"},"id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Id"},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"}},"type":"object","required":["found"],"title":"CustomerLookup","description":"Resposta de GET /v1/customers?external_code= (SRS RF-18a)."},"ExecuteResult":{"properties":{"routing_id":{"type":"integer","title":"Routing Id"},"job_id":{"type":"string","title":"Job Id"},"status":{"type":"string","title":"Status","description":"Estado do job (assíncrono): queued/running/done"}},"type":"object","required":["routing_id","job_id","status"],"title":"ExecuteResult"},"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"LoadOrderOut":{"properties":{"id":{"type":"integer","title":"Id"},"vehicle_id":{"type":"integer","title":"Vehicle Id"},"vehicle_plate":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Vehicle Plate"},"driver_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Driver Id"},"driver_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Driver Name"},"driver_whatsapp":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Driver Whatsapp"},"distance_km":{"type":"number","title":"Distance Km"},"duration_min":{"type":"integer","title":"Duration Min"},"weight_kg":{"type":"number","title":"Weight Kg"},"capacity_kg":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Capacity Kg"},"volume_m3":{"type":"number","title":"Volume M3"},"occupancy_pct":{"type":"number","title":"Occupancy Pct"},"start_time":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Start Time","description":"Horário previsto de saída do depósito (HH:MM)"},"end_time":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"End Time","description":"Horário previsto de término da rota (HH:MM)"},"released":{"type":"boolean","title":"Released","description":"Carga liberada (despachada) — fica oculta no mapa","default":false},"vehicle_model":{"type":"boolean","title":"Vehicle Model","description":"Veículo é MODELO (precisa trocar por real antes de liberar)","default":false},"stops":{"items":{"$ref":"#/components/schemas/StopOut"},"type":"array","title":"Stops"}},"type":"object","required":["id","vehicle_id","distance_km","duration_min","weight_kg","volume_m3","occupancy_pct","stops"],"title":"LoadOrderOut","description":"Ordem de carga: pedidos de um veículo, em sequência ótima (SRS RF-34)."},"LoginIn":{"properties":{"login":{"type":"string","title":"Login"},"password":{"type":"string","title":"Password"}},"type":"object","required":["login","password"],"title":"LoginIn"},"LoginOut":{"properties":{"token":{"type":"string","title":"Token"},"name":{"type":"string","title":"Name"},"type":{"type":"string","title":"Type"},"must_select_organization":{"type":"boolean","title":"Must Select Organization","description":"True para admin de plataforma: precisa escolher a organização (RF-03)","default":false},"organization_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Organization Id","description":"Org ativa (já definida para usuário comum)"}},"type":"object","required":["token","name","type"],"title":"LoginOut"},"OrderAddress":{"properties":{"street":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Street","description":"Logradouro + número"},"zip_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Zip Code","description":"CEP, só dígitos"},"city":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"City"},"state":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"State","description":"UF (2 letras)"},"complement":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Complement"},"lat":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Lat"},"lng":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Lng"}},"type":"object","title":"OrderAddress","description":"Endereço de entrega (sobrepõe o do cliente quando informado)."},"OrderCreateResult":{"properties":{"created":{"items":{"$ref":"#/components/schemas/OrderOut"},"type":"array","title":"Created","default":[]},"rejected":{"items":{"type":"object"},"type":"array","title":"Rejected","description":"Pedidos recusados, com motivo (ex.: cliente não resolvido)","default":[]}},"type":"object","title":"OrderCreateResult"},"OrderIn":{"properties":{"external_key":{"type":"string","title":"External Key","description":"CHAVE_EXT — chave do ERP, única por organização"},"customer_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Customer Id","description":"ID interno do cliente (nosso ID_CLIENTE)"},"customer_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Customer Code","description":"CODCLIENTE_EXT — código do cliente no ERP"},"weight_kg":{"type":"number","minimum":0.0,"title":"Weight Kg","description":"Peso em kg","default":0},"volume_m3":{"type":"number","minimum":0.0,"title":"Volume M3","description":"Volume em m³ (ao menos um entre peso/volume > 0)","default":0},"priority":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Priority","description":"Maior = mais prioritário"},"expected_date":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Expected Date","description":"DTPREVENT (YYYY-MM-DD)"},"service_time_min":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Service Time Min","description":"Tempo de serviço próprio (sobrepõe cliente/padrão)"},"depot_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Depot Id","description":"Se informado, o pedido deve sair desta empresa/depósito"},"delivery_note":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Delivery Note","description":"OBSLOG exibida ao motorista"},"address":{"anyOf":[{"$ref":"#/components/schemas/OrderAddress"},{"type":"null"}]}},"type":"object","required":["external_key"],"title":"OrderIn","description":"Pedido de venda enviado pelo ERP ao pool (SRS RF-20/21).","example":{"customer_code":"C001","delivery_note":"Entregar pela manhã","external_key":"PED-9001","priority":1,"volume_m3":0.7,"weight_kg":150}},"OrderOut":{"properties":{"id":{"type":"integer","title":"Id"},"external_key":{"type":"string","title":"External Key"},"customer_id":{"type":"integer","title":"Customer Id"},"customer_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Customer Name"},"status":{"type":"string","enum":["P","R","T","E","N","A"],"title":"Status"},"weight_kg":{"type":"number","title":"Weight Kg"},"volume_m3":{"type":"number","title":"Volume M3"},"value":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Value"},"priority":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Priority"},"order_date":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Order Date"},"forecast_date":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Forecast Date"},"service_time_min":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Service Time Min"},"obs":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Obs"},"free1":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Free1"},"free2":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Free2"},"free3":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Free3"},"street":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Street"},"zip":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Zip"},"city":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"City"},"state":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"State"},"complement":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Complement"},"lat":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Lat"},"lng":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Lng"},"load_order_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Load Order Id"},"delivery_sequence":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Delivery Sequence"},"delivery_datetime":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Delivery Datetime"},"no_delivery_reason":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"No Delivery Reason"},"unrouted_reason":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Unrouted Reason"}},"type":"object","required":["id","external_key","customer_id","status","weight_kg","volume_m3"],"title":"OrderOut"},"OrgSelectIn":{"properties":{"organization_id":{"type":"integer","title":"Organization Id"}},"type":"object","required":["organization_id"],"title":"OrgSelectIn"},"PoolOrderOut":{"properties":{"order_id":{"type":"integer","title":"Order Id"},"external_key":{"type":"string","title":"External Key"},"customer_name":{"type":"string","title":"Customer Name"},"lat":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Lat"},"lng":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Lng"},"weight_kg":{"type":"number","title":"Weight Kg","default":0},"volume_m3":{"type":"number","title":"Volume M3","default":0},"city":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"City"},"state":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"State"},"street":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Street"},"free1":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Free1"},"free2":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Free2"},"free3":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Free3"},"priority":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Priority"},"order_date":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Order Date"},"expected_date":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Expected Date"}},"type":"object","required":["order_id","external_key","customer_name"],"title":"PoolOrderOut","description":"Pedido vinculado à roteirização ainda não atribuído a uma carga (montagem manual)."},"RoutingIn":{"properties":{"depot_id":{"type":"integer","title":"Depot Id","description":"Empresa de origem (obrigatório)"},"vehicle_ids":{"anyOf":[{"items":{"type":"integer"},"type":"array"},{"type":"null"}],"title":"Vehicle Ids","description":"Veículos; omisso = todos os ativos"},"vehicle_quantities":{"anyOf":[{"additionalProperties":{"type":"integer"},"type":"object"},{"type":"null"}],"title":"Vehicle Quantities","description":"Qtd por veículo (só p/ veículo modelo): {id: n}"},"order_ids":{"anyOf":[{"items":{"type":"integer"},"type":"array"},{"type":"null"}],"title":"Order Ids","description":"Pedidos selecionados; omisso = todos P/N"},"departure_date":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Departure Date","description":"DTSAIDA (YYYY-MM-DD); nula = data corrente"},"manual":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Manual","description":"Se True: não roda o motor; cargas montadas à mão","default":false}},"type":"object","required":["depot_id"],"title":"RoutingIn","description":"Criação de uma roteirização (SRS RF-23/24).","example":{"depot_id":1}},"RoutingOut":{"properties":{"id":{"type":"integer","title":"Id"},"depot_id":{"type":"integer","title":"Depot Id"},"status":{"type":"string","enum":["criada","manual","executando","concluida","falhou"],"title":"Status"},"departure_date":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Departure Date"},"imported_orders":{"type":"integer","title":"Imported Orders","default":0}},"type":"object","required":["id","depot_id","status"],"title":"RoutingOut"},"RoutingResult":{"properties":{"routing_id":{"type":"integer","title":"Routing Id"},"status":{"type":"string","title":"Status"},"engine":{"type":"string","title":"Engine","description":"Motor usado: ortools | heuristico"},"depot":{"type":"object","title":"Depot"},"load_orders":{"items":{"$ref":"#/components/schemas/LoadOrderOut"},"type":"array","title":"Load Orders"},"unrouted_orders":{"items":{"$ref":"#/components/schemas/UnroutedOut"},"type":"array","title":"Unrouted Orders"},"manual":{"type":"boolean","title":"Manual","default":false},"pool_orders":{"items":{"$ref":"#/components/schemas/PoolOrderOut"},"type":"array","title":"Pool Orders","default":[]},"vehicles":{"items":{"type":"object"},"type":"array","title":"Vehicles","description":"Veículos da roteirização (montagem manual)"}},"type":"object","required":["routing_id","status","engine","depot","load_orders","unrouted_orders"],"title":"RoutingResult"},"SessionOut":{"properties":{"user":{"type":"string","title":"User"},"type":{"type":"string","title":"Type"},"organization_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Organization Id"},"organization_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Organization Name"},"driver_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Driver Id","description":"Motorista vinculado (habilita o app do motorista)"}},"type":"object","required":["user","type"],"title":"SessionOut"},"StopOut":{"properties":{"delivery_sequence":{"type":"integer","title":"Delivery Sequence"},"order_id":{"type":"integer","title":"Order Id"},"order_ids":{"items":{"type":"integer"},"type":"array","title":"Order Ids","description":"Todos os pedidos do agrupamento"},"external_key":{"type":"string","title":"External Key"},"customer_name":{"type":"string","title":"Customer Name"},"lat":{"type":"number","title":"Lat"},"lng":{"type":"number","title":"Lng"},"address":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Address"},"weight_kg":{"type":"number","title":"Weight Kg","default":0},"volume_m3":{"type":"number","title":"Volume M3","default":0},"value":{"type":"number","title":"Value","default":0},"eta":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Eta","description":"Horário previsto de chegada (HH:MM)"},"eta_departure":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Eta Departure","description":"Horário previsto de saída (HH:MM)"},"delivery_note":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Delivery Note"}},"type":"object","required":["delivery_sequence","order_id","external_key","customer_name","lat","lng"],"title":"StopOut"},"UnroutedOut":{"properties":{"order_id":{"type":"integer","title":"Order Id"},"external_key":{"type":"string","title":"External Key"},"customer_name":{"type":"string","title":"Customer Name"},"reason":{"type":"string","title":"Reason","description":"Código enum: SEM_CAPACIDADE, JANELA_INVIAVEL, FORA_DA_JORNADA, ..."},"reason_label":{"type":"string","title":"Reason Label"}},"type":"object","required":["order_id","external_key","customer_name","reason","reason_label"],"title":"UnroutedOut"},"ValidationError":{"properties":{"loc":{"items":{"anyOf":[{"type":"string"},{"type":"integer"}]},"type":"array","title":"Location"},"msg":{"type":"string","title":"Message"},"type":{"type":"string","title":"Error Type"}},"type":"object","required":["loc","msg","type"],"title":"ValidationError"}}}}