{"openapi":"3.1.0","info":{"title":"KIPI — API do Parceiro (Atacadista)","description":"\nAPI oficial da plataforma **KIPI** para integração do sistema de gestão (ERP) do parceiro atacadista.\n\nCom ela o seu ERP pode, sem acessar o app:\n\n- **Carregar produtos** (carga completa ou incremental via `POST /produtos/bulk` — upsert pelo `codigo`);\n- **Baixar os pedidos** feitos pelos clientes, com todos os dados do cliente (razão social, CNPJ, endereço) para cadastro no ERP;\n- **Agir sobre os pedidos**: aceitar, recusar, marcar como entregue ou cancelar;\n- **Filtrar pedidos por status**: `pendente`, `aceito`, `recusado`, `entregue`.\n\n**Autenticação**: use `POST /auth/login` com o e-mail e a senha da sua conta de parceiro para obter o\n`access_token` (JWT). Envie-o em todas as chamadas no header `Authorization: Bearer <token>`.\n\nManual completo com exemplos passo a passo: **http://apis.kipi.com.br/**\n","contact":{"name":"KIPI","url":"https://kipi.com.br/"},"version":"1.0.0"},"paths":{"/health":{"get":{"tags":["health"],"summary":"Health Check","description":"Simple health check endpoint.","operationId":"health_check_health_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":{"type":"string"},"type":"object","title":"Response Health Check Health Get"}}}}}}},"/health/dependencies":{"get":{"tags":["health"],"summary":"Health Dependencies","description":"Diagnostico seguro de dependencias externas sem expor segredos.","operationId":"health_dependencies_health_dependencies_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Health Dependencies Health Dependencies Get"}}}}}}},"/auth/register":{"post":{"tags":["auth"],"summary":"Register Atacadista","description":"Registra um novo atacadista + usuário admin.\n\nFluxo:\n- Valida se já existe atacadista com o CNPJ informado\n- Cria o atacadista\n- Cria o usuário administrador vinculado\n- Retorna par de tokens (access + refresh)","operationId":"register_atacadista_auth_register_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AuthRegisterRequest"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TokenPair"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/auth/login":{"post":{"tags":["auth"],"summary":"Login","description":"Autentica o usuário do atacadista via e-mail/username e senha.\n\nAceita payload com `email` (compatibilidade) ou `login`.","operationId":"login_auth_login_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AuthLoginRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TokenPair"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/auth/me":{"get":{"tags":["auth"],"summary":"Get Me","description":"Retorna informações do usuário logado e do atacadista vinculado.\n\nO `atacadista_id` é sempre obtido do JWT via `get_current_user`.","operationId":"get_me_auth_me_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MeResponse"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/auth/refresh":{"post":{"tags":["auth"],"summary":"Refresh Tokens","description":"Gera um novo par de tokens (access + refresh) a partir de um refresh token válido.\n\nRegras:\n- O token deve ser do tipo `refresh`\n- O payload deve conter `sub` (id do usuário) e `atacadista_id`\n- Expiração do token é validada automaticamente pelo decode","operationId":"refresh_tokens_auth_refresh_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AuthRefreshRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TokenPair"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/eventos/":{"post":{"tags":["eventos"],"summary":"Registrar Evento","description":"Registra um passo da navegacao do parceiro. Exige sessao.","operationId":"registrar_evento_eventos__post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EventoRequest"}}},"required":true},"responses":{"202":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Registrar Evento Eventos  Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/eventos":{"post":{"tags":["eventos"],"summary":"Registrar Evento","description":"Registra um passo da navegacao do parceiro. Exige sessao.","operationId":"registrar_evento_eventos_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EventoRequest"}}},"required":true},"responses":{"202":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Registrar Evento Eventos Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/atacadista/me":{"get":{"tags":["atacadista"],"summary":"Obter Meu Cadastro","description":"Retorna dados do próprio atacadista, incluindo o status de pausa de vendas.","operationId":"obter_meu_cadastro_atacadista_me_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Obter Meu Cadastro Atacadista Me Get"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/atacadista/me/venda-mais":{"put":{"tags":["atacadista"],"summary":"Alterar Venda Mais","description":"Liga/desliga a participação do parceiro no Plano VendeMais.\n\nAo participar, os produtos aparecem no portal dos Representantes e a\ncomissão passa a ser a do Plano VendeMais (fora do plano, a padrão).","operationId":"alterar_venda_mais_atacadista_me_venda_mais_put","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/VendaMaisRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Alterar Venda Mais Atacadista Me Venda Mais Put"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/atacadista/me/senha-compra":{"put":{"tags":["atacadista"],"summary":"Alterar Senha Compra","description":"Define se o parceiro quer gerar uma palavra-chave por compra.\n\n- 'desligado': não gera.\n- 'toda': gera em toda compra.\n- 'primeiras': gera nas N primeiras compras de cada cliente com o parceiro.\n\nA senha nunca bloqueia a compra; serve só como conferência opcional.","operationId":"alterar_senha_compra_atacadista_me_senha_compra_put","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SenhaCompraRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Alterar Senha Compra Atacadista Me Senha Compra Put"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/atacadista/me/atendimento":{"put":{"tags":["atacadista"],"summary":"Alterar Atendimento","description":"Atualiza o estado e as cidades que o parceiro atende com entrega.\n\nO catálogo do cliente só mostra este parceiro para clientes cuja cidade\nesteja nesta lista.","operationId":"alterar_atendimento_atacadista_me_atendimento_put","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AtendimentoRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Alterar Atendimento Atacadista Me Atendimento Put"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/atacadista/me/pausa-vendas":{"put":{"tags":["atacadista"],"summary":"Alterar Pausa Vendas","description":"Pausa ou retoma as vendas do próprio atacadista.\n\nDiferente da inativação feita pelo administrador (campo `ativo`), a\npausa não bloqueia o login: apenas esconde os produtos do catálogo do\nvarejista até o parceiro decidir voltar a vender.","operationId":"alterar_pausa_vendas_atacadista_me_pausa_vendas_put","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PausaVendasRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Alterar Pausa Vendas Atacadista Me Pausa Vendas Put"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/atacadista/me/pedido-minimo":{"put":{"tags":["atacadista"],"summary":"Alterar Pedido Minimo","description":"Atualiza o valor de pedido mínimo do próprio parceiro.\n\nPermite ao parceiro ajustar, a qualquer momento, o valor mínimo que o\ncliente precisa atingir para fechar um pedido com ele.","operationId":"alterar_pedido_minimo_atacadista_me_pedido_minimo_put","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PedidoMinimoRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Alterar Pedido Minimo Atacadista Me Pedido Minimo Put"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/atacadista/me/pessoa-fisica":{"put":{"tags":["atacadista"],"summary":"Alterar Pessoa Fisica","description":"Define se o parceiro vende para CPF e qual o minimo desse publico.\n\nDesmarcar nao apaga nada: pedidos ja abertos seguem o seu caminho e o\nbloqueio acontece so no fechamento, com aviso ao cliente.","operationId":"alterar_pessoa_fisica_atacadista_me_pessoa_fisica_put","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PessoaFisicaRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Alterar Pessoa Fisica Atacadista Me Pessoa Fisica Put"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/atacadista/cnpj/{cnpj}":{"get":{"tags":["atacadista"],"summary":"Buscar Cnpj","description":"Consulta dados de CNPJ na API pública e retorna campos relevantes.\n\nEste endpoint é utilizado pela tela de registro do atacadista para\nauto-preencher dados como razão social, endereço, atividade principal,\nUF, cidade e CEP.","operationId":"buscar_cnpj_atacadista_cnpj__cnpj__get","parameters":[{"name":"cnpj","in":"path","required":true,"schema":{"type":"string","title":"Cnpj"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Buscar Cnpj Atacadista Cnpj  Cnpj  Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/localidades/":{"get":{"tags":["localidades"],"summary":"Listar Localidades","description":"Lista pública de estados/cidades atendidos (gerenciada pelo admin).\n\nUsada no cadastro e no perfil do parceiro para selecionar a área de\natendimento sem depender de uma lista fixa no frontend.","operationId":"listar_localidades_localidades__get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Response Listar Localidades Localidades  Get"}}}}}}},"/produtos":{"get":{"tags":["produtos"],"summary":"Listar Produtos","description":"Lista produtos do atacadista logado com paginação e busca opcional.\n\n- O filtro multi-tenant é aplicado automaticamente via `atacadista_id`\n  derivado do JWT.\n- Se `search` for informado, a consulta no Mongo considera todos os\n  produtos do atacadista com `codigo` **ou** `descricao` contendo o\n  termo (case-insensitive), antes de aplicar a paginação.","operationId":"listar_produtos_produtos_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"description":"Número da página (iniciando em 1)","default":1,"title":"Page"},"description":"Número da página (iniciando em 1)"},{"name":"page_size","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"description":"Quantidade de registros por página (1-100)","default":20,"title":"Page Size"},"description":"Quantidade de registros por página (1-100)"},{"name":"search","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Termo de busca para código ou descrição do produto (case-insensitive)","title":"Search"},"description":"Termo de busca para código ou descrição do produto (case-insensitive)"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProdutoListResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["produtos"],"summary":"Criar Produto","description":"Cria um novo produto para o atacadista logado.\n\nEsta rota é utilizada principalmente pelo frontend para cadastro\nunitário. Para integrações em massa, utilize `POST /produtos/bulk`.","operationId":"criar_produto_produtos_post","security":[{"OAuth2PasswordBearer":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProdutoCreate"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProdutoResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/produtos/nao-publicados":{"get":{"tags":["produtos"],"summary":"Listar Nao Publicados","description":"Produtos do parceiro que NÃO aparecem para o cliente.\n\nUm produto só é publicado no catálogo quando tem imagem que carrega. Aqui\nentram os que estão sem foto e os que têm foto quebrada (enviada para um\nserviço de imagens desativado) — nos dois casos o parceiro precisa\n(re)enviar a imagem para o produto voltar a ser vendido.","operationId":"listar_nao_publicados_produtos_nao_publicados_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"page_size","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"title":"Page Size"}},{"name":"search","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Search"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Listar Nao Publicados Produtos Nao Publicados Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/produtos/{produto_id}":{"get":{"tags":["produtos"],"summary":"Obter Produto","description":"Obtém os detalhes de um produto específico do atacadista logado.","operationId":"obter_produto_produtos__produto_id__get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"produto_id","in":"path","required":true,"schema":{"type":"string","title":"Produto Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProdutoResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["produtos"],"summary":"Atualizar Produto","description":"Atualiza um produto existente do atacadista logado.","operationId":"atualizar_produto_produtos__produto_id__put","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"produto_id","in":"path","required":true,"schema":{"type":"string","title":"Produto Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProdutoUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProdutoResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["produtos"],"summary":"Deletar Produto","description":"Remove um produto do atacadista logado.\n\nUsamos status 200 com um corpo simples para evitar o erro do FastAPI\nem relação a 204 + body.","operationId":"deletar_produto_produtos__produto_id__delete","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"produto_id","in":"path","required":true,"schema":{"type":"string","title":"Produto Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":{"type":"string"},"title":"Response Deletar Produto Produtos  Produto Id  Delete"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/produtos/{produto_id}/imagem":{"get":{"tags":["produtos"],"summary":"Obter Imagem Produto","description":"Retorna somente a imagem do produto para reduzir payload.","operationId":"obter_imagem_produto_produtos__produto_id__imagem_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"produto_id","in":"path","required":true,"schema":{"type":"string","title":"Produto Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":{"anyOf":[{"type":"string"},{"type":"null"}]},"title":"Response Obter Imagem Produto Produtos  Produto Id  Imagem Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/produtos/bulk":{"post":{"tags":["produtos"],"summary":"Upsert Produtos Bulk","description":"Cria ou atualiza múltiplos produtos com base no código.\n\nRegras:\n- O corpo da requisição deve ser uma lista de produtos.\n- Para cada item, se já existir produto com o mesmo `codigo` para o\n  atacadista logado, o registro é atualizado.\n- Caso contrário, um novo produto é criado.\n\nImportante: o `atacadista_id` **não** deve ser enviado no corpo. Ele\né sempre obtido a partir do JWT (multi-tenant).","operationId":"upsert_produtos_bulk_produtos_bulk_post","requestBody":{"content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/ProdutoBase"},"type":"array","title":"Payload"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/ProdutoResponse"},"type":"array","title":"Response Upsert Produtos Bulk Produtos Bulk Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/combos":{"get":{"tags":["combos"],"summary":"Listar Combos","description":"Lista os combos criados por este parceiro (vigentes ou não).","operationId":"listar_combos_combos_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ComboListResponse"}}}}},"security":[{"OAuth2PasswordBearer":[]}]},"post":{"tags":["combos"],"summary":"Criar Combo","description":"Cria um combo. O parceiro define produtos, quantidades, preços e condições.\n\n- **Combo Box**: sempre 2 produtos — o principal (carro-chefe, que abre o\n  pedido) e o bonificador. Cada um sai com o seu valor; o que muda é a\n  natureza fiscal (venda x bonificação), gerando as duas saídas no ERP.\n- **Combo Individual**: item principal associado a outro, com a regra de\n  quantidade/desconto definida pelo parceiro.","operationId":"criar_combo_combos_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ComboCreate"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ComboResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/combos/{combo_id}":{"get":{"tags":["combos"],"summary":"Obter Combo","operationId":"obter_combo_combos__combo_id__get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"combo_id","in":"path","required":true,"schema":{"type":"string","title":"Combo Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ComboResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["combos"],"summary":"Atualizar Combo","operationId":"atualizar_combo_combos__combo_id__put","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"combo_id","in":"path","required":true,"schema":{"type":"string","title":"Combo Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ComboUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ComboResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["combos"],"summary":"Excluir Combo","operationId":"excluir_combo_combos__combo_id__delete","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"combo_id","in":"path","required":true,"schema":{"type":"string","title":"Combo Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Excluir Combo Combos  Combo Id  Delete"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/pedidos/":{"get":{"tags":["pedidos"],"summary":"Listar Pedidos","description":"Lista pedidos do atacadista logado, com filtros opcionais.\n\nO filtro de multi-tenant é aplicado automaticamente via `atacadista_id`\nrecuperado do JWT.","operationId":"listar_pedidos_pedidos__get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"$ref":"#/components/schemas/PedidoStatus"},{"type":"null"}],"description":"Filtrar pedidos por status (pendente, aceito, recusado, entregue)","title":"Status"},"description":"Filtrar pedidos por status (pendente, aceito, recusado, entregue)"},{"name":"data_inicio","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Filtrar pedidos com data de criação a partir desta data (YYYY-MM-DD)","title":"Data Inicio"},"description":"Filtrar pedidos com data de criação a partir desta data (YYYY-MM-DD)"},{"name":"data_fim","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"description":"Filtrar pedidos com data de criação até esta data (YYYY-MM-DD)","title":"Data Fim"},"description":"Filtrar pedidos com data de criação até esta data (YYYY-MM-DD)"},{"name":"varejista","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filtrar por identificador/nome do varejista (contém, case-insensitive)","title":"Varejista"},"description":"Filtrar por identificador/nome do varejista (contém, case-insensitive)"},{"name":"produto","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filtrar por descrição de produto contida nos itens do pedido","title":"Produto"},"description":"Filtrar por descrição de produto contida nos itens do pedido"},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"description":"Número da página (para paginação)","default":1,"title":"Page"},"description":"Número da página (para paginação)"},{"name":"page_size","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"description":"Quantidade de itens por página (para paginação)","default":20,"title":"Page Size"},"description":"Quantidade de itens por página (para paginação)"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PedidoListResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/pedidos/{pedido_id}":{"get":{"tags":["pedidos"],"summary":"Obter Pedido","description":"Obtém os detalhes de um pedido específico do atacadista logado.","operationId":"obter_pedido_pedidos__pedido_id__get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"pedido_id","in":"path","required":true,"schema":{"type":"string","title":"Pedido Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PedidoResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/pedidos/{pedido_id}/confirmar-senha":{"post":{"tags":["pedidos"],"summary":"Confirmar Senha","description":"Marca a palavra-chave da compra como conferida (não bloqueia nada).","operationId":"confirmar_senha_pedidos__pedido_id__confirmar_senha_post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"pedido_id","in":"path","required":true,"schema":{"type":"string","title":"Pedido Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Confirmar Senha Pedidos  Pedido Id  Confirmar Senha Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/pedidos/{pedido_id}/aceitar":{"post":{"tags":["pedidos"],"summary":"Aceitar Pedido","description":"Marca o pedido como **aceito**.","operationId":"aceitar_pedido_pedidos__pedido_id__aceitar_post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"pedido_id","in":"path","required":true,"schema":{"type":"string","title":"Pedido Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PedidoStatusUpdateResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/pedidos/{pedido_id}/recusar":{"post":{"tags":["pedidos"],"summary":"Recusar Pedido","description":"Marca o pedido como **recusado**.","operationId":"recusar_pedido_pedidos__pedido_id__recusar_post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"pedido_id","in":"path","required":true,"schema":{"type":"string","title":"Pedido Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PedidoRecusaRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PedidoStatusUpdateResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/pedidos/{pedido_id}/entregar":{"post":{"tags":["pedidos"],"summary":"Entregar Pedido","description":"Marca o pedido como **entregue**.","operationId":"entregar_pedido_pedidos__pedido_id__entregar_post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"pedido_id","in":"path","required":true,"schema":{"type":"string","title":"Pedido Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PedidoStatusUpdateResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/pedidos/{pedido_id}/cancelar":{"post":{"tags":["pedidos"],"summary":"Cancelar Pedido","description":"Cancela o pedido (marca como **recusado**), mesmo após aceito.\n\nMantemos o status `recusado` no domínio, mas expomos a ação como\n\"cancelar\" para o atacadista.","operationId":"cancelar_pedido_pedidos__pedido_id__cancelar_post","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"pedido_id","in":"path","required":true,"schema":{"type":"string","title":"Pedido Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PedidoRecusaRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PedidoStatusUpdateResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/dashboard/":{"get":{"tags":["dashboard"],"summary":"Get Dashboard Stats","description":"Retorna os indicadores principais do dashboard do atacadista.\n\nTodos os dados são calculados exclusivamente para o `atacadista_id`\nextraído do JWT, garantindo o isolamento multi-tenant.","operationId":"get_dashboard_stats_dashboard__get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DashboardStats"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}},"/dashboard/comissoes":{"get":{"tags":["dashboard"],"summary":"Get Commission Summary","description":"Retorna o extrato mensal de comissões devidas pelo atacadista.\n\nA comissão é calculada sobre os pedidos faturados (aceitos/entregues)\nno mês/ano informados.","operationId":"get_commission_summary_dashboard_comissoes_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"ano","in":"query","required":true,"schema":{"type":"integer","title":"Ano"}},{"name":"mes","in":"query","required":true,"schema":{"type":"integer","title":"Mes"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CommissionSummary"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/relatorios/venda-mais":{"get":{"tags":["relatorios"],"summary":"Relatorio Venda Mais","description":"Relatório mensal das vendas VendeMais deste parceiro, por representante.","operationId":"relatorio_venda_mais_relatorios_venda_mais_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"mes","in":"query","required":true,"schema":{"type":"string","description":"Mês no formato YYYY-MM","title":"Mes"},"description":"Mês no formato YYYY-MM"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/relatorios/extrato":{"get":{"tags":["relatorios"],"summary":"Extrato Parceiro","description":"Extrato mensal de comissões que ESTE parceiro paga ao portal.\n\nInclui todas as vendas do mês (VendeMais ou não): o parceiro paga a comissão\ntotal de cada pedido ao portal.","operationId":"extrato_parceiro_relatorios_extrato_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"mes","in":"query","required":true,"schema":{"type":"string","description":"Mês no formato YYYY-MM","title":"Mes"},"description":"Mês no formato YYYY-MM"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/relatorios/por-plano":{"get":{"tags":["relatorios"],"summary":"Relatorio Por Plano","description":"Relatório mensal discriminando cada plano de vendas do parceiro.\n\nRetorna, por plano (Básico, Flex, VendeMais), a quantidade de pedidos, o\ntotal vendido, a comissão paga e o % médio de cada plano; e no fim o % médio\ngeral gerado para o parceiro no período.","operationId":"relatorio_por_plano_relatorios_por_plano_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"mes","in":"query","required":true,"schema":{"type":"string","description":"Mês no formato YYYY-MM","title":"Mes"},"description":"Mês no formato YYYY-MM"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/clientes/{varejista_id}":{"get":{"tags":["clientes"],"summary":"Obter Cliente","operationId":"obter_cliente_clientes__varejista_id__get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"varejista_id","in":"path","required":true,"schema":{"type":"string","title":"Varejista Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ClienteDetailResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/clientes/{varejista_id}/bloqueio":{"put":{"tags":["clientes"],"summary":"Sinalizar Bloqueio","description":"Parceiro sinaliza (ou remove) SITUAÇÃO DE BLOQUEIO de um cliente.\n\nApenas marca o cliente; a EXCLUSÃO DEFINITIVA é feita pelo ADM, que vê a\nsinalização e registra os motivos reais em Observações.","operationId":"sinalizar_bloqueio_clientes__varejista_id__bloqueio_put","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"varejista_id","in":"path","required":true,"schema":{"type":"string","title":"Varejista Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BloqueioRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Sinalizar Bloqueio Clientes  Varejista Id  Bloqueio Put"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/clientes":{"get":{"tags":["clientes"],"summary":"Listar Clientes","operationId":"listar_clientes_clientes_get","security":[{"OAuth2PasswordBearer":[]}],"parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Busca por nome, CNPJ ou email","title":"Q"},"description":"Busca por nome, CNPJ ou email"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ClienteListResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/condicoes-pagamento":{"get":{"tags":["condicoes-pagamento"],"summary":"Obter Condicoes Pagamento","operationId":"obter_condicoes_pagamento_condicoes_pagamento_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CondicoesPagamentoResponse"}}}}},"security":[{"OAuth2PasswordBearer":[]}]},"put":{"tags":["condicoes-pagamento"],"summary":"Atualizar Condicoes Pagamento","operationId":"atualizar_condicoes_pagamento_condicoes_pagamento_put","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CondicoesPagamentoUpdateRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CondicoesPagamentoResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"OAuth2PasswordBearer":[]}]}}},"components":{"schemas":{"AtendimentoRequest":{"properties":{"estado_atendimento":{"type":"string","maxLength":2,"minLength":2,"title":"Estado Atendimento"},"cidades_atendidas":{"items":{"type":"string"},"type":"array","title":"Cidades Atendidas"},"perfil_clientes":{"items":{"type":"string"},"type":"array","title":"Perfil Clientes"}},"type":"object","required":["estado_atendimento"],"title":"AtendimentoRequest"},"AuthLoginRequest":{"properties":{"login":{"type":"string","title":"Login","description":"Email ou username"},"senha":{"type":"string","title":"Senha"}},"type":"object","required":["login","senha"],"title":"AuthLoginRequest","description":"Payload de login do usuário do atacadista.\n\nAceita **tanto** `login` quanto `email` no JSON de entrada (compatibilidade com o frontend).\n\n- `login`: pode ser e-mail ou username\n- `email`: alias aceito para manter compatibilidade"},"AuthRefreshRequest":{"properties":{"refresh_token":{"type":"string","title":"Refresh Token"}},"type":"object","required":["refresh_token"],"title":"AuthRefreshRequest","description":"Payload para solicitar novo par de tokens a partir do refresh token."},"AuthRegisterRequest":{"properties":{"nome_fantasia":{"type":"string","title":"Nome Fantasia"},"cnpj":{"type":"string","title":"Cnpj"},"email":{"type":"string","format":"email","title":"Email"},"telefone":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Telefone"},"senha":{"type":"string","title":"Senha"},"pedido_minimo":{"anyOf":[{"type":"number","minimum":0.0},{"type":"null"}],"title":"Pedido Minimo","description":"Valor mínimo de pedido (em reais) que o varejista precisa atingir para comprar com este atacadista."},"aceita_pessoa_fisica":{"type":"boolean","title":"Aceita Pessoa Fisica","description":"Se o parceiro tambem vende para cliente pessoa fisica (CPF).","default":false},"pedido_minimo_cpf":{"anyOf":[{"type":"number","minimum":0.0},{"type":"null"}],"title":"Pedido Minimo Cpf","description":"Pedido minimo para cliente CPF. Vazio = usa o mesmo valor do CNPJ."},"estado_atendimento":{"anyOf":[{"type":"string","maxLength":2,"minLength":2},{"type":"null"}],"title":"Estado Atendimento","description":"UF principal de atendimento do atacadista (ex: SP)"},"cidades_atendidas":{"items":{"type":"string"},"type":"array","title":"Cidades Atendidas","description":"Lista de cidades (dentro da UF de atendimento) que o atacadista consegue atender."},"perfil_clientes":{"items":{"type":"string"},"type":"array","title":"Perfil Clientes","description":"Perfis de clientes que o parceiro atende."},"participa_venda_mais":{"type":"boolean","title":"Participa Venda Mais","default":false}},"type":"object","required":["nome_fantasia","cnpj","email","senha"],"title":"AuthRegisterRequest","description":"Payload de registro de um novo atacadista + usuário administrador.\n\nAlém dos dados básicos, já recebemos a configuração de área de\natendimento do atacadista, que será usada depois para filtrar quais\natacadistas atendem determinada cidade do varejista."},"BloqueioRequest":{"properties":{"motivo":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Motivo"},"bloqueado":{"type":"boolean","title":"Bloqueado","default":true}},"type":"object","title":"BloqueioRequest"},"ClienteDetailResponse":{"properties":{"cliente":{"$ref":"#/components/schemas/ClienteResumo"},"enderecos":{"items":{"$ref":"#/components/schemas/ClienteEndereco"},"type":"array","title":"Enderecos"},"insights":{"$ref":"#/components/schemas/ClienteInsight"},"ultimos_pedidos":{"items":{"$ref":"#/components/schemas/ClientePedidoResumo"},"type":"array","title":"Ultimos Pedidos"},"produtos_mais_comprados":{"items":{"$ref":"#/components/schemas/ClienteProdutoResumo"},"type":"array","title":"Produtos Mais Comprados"}},"type":"object","required":["cliente","insights"],"title":"ClienteDetailResponse"},"ClienteEndereco":{"properties":{"descricao":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Descricao"},"logradouro":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Logradouro"},"numero":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Numero"},"bairro":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Bairro"},"cidade":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Cidade"},"uf":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Uf"},"cep":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Cep"},"complemento":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Complemento"},"eh_principal":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Eh Principal"}},"type":"object","title":"ClienteEndereco"},"ClienteInsight":{"properties":{"total_pedidos":{"type":"integer","title":"Total Pedidos","description":"Quantidade total de pedidos"},"valor_total":{"type":"number","title":"Valor Total","description":"Soma do valor de compras"},"ticket_medio":{"type":"number","title":"Ticket Medio","description":"Valor medio por pedido"},"ultima_compra":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Ultima Compra","description":"Data da ultima compra"},"abc_classificacao":{"type":"string","title":"Abc Classificacao","description":"Classificacao ABC (A/B/C)"},"participacao_percentual":{"type":"number","title":"Participacao Percentual","description":"Participacao no faturamento do atacadista"}},"type":"object","required":["total_pedidos","valor_total","ticket_medio","abc_classificacao","participacao_percentual"],"title":"ClienteInsight"},"ClienteListItem":{"properties":{"id":{"type":"string","title":"Id"},"nome_fantasia":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Nome Fantasia"},"razao_social":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Razao Social"},"cnpj":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Cnpj"},"email":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Email"},"telefone":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Telefone"},"total_pedidos":{"type":"integer","title":"Total Pedidos"},"valor_total":{"type":"number","title":"Valor Total"},"ultima_compra":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Ultima Compra"}},"type":"object","required":["id","total_pedidos","valor_total"],"title":"ClienteListItem"},"ClienteListResponse":{"properties":{"items":{"items":{"$ref":"#/components/schemas/ClienteListItem"},"type":"array","title":"Items"},"total":{"type":"integer","title":"Total"},"top10":{"items":{"$ref":"#/components/schemas/ClienteTop10Item"},"type":"array","title":"Top10"}},"type":"object","required":["items","total","top10"],"title":"ClienteListResponse"},"ClientePedidoResumo":{"properties":{"id":{"type":"string","title":"Id"},"valor_total":{"type":"number","title":"Valor Total"},"status":{"$ref":"#/components/schemas/PedidoStatus"},"data_criacao":{"type":"string","format":"date-time","title":"Data Criacao"}},"type":"object","required":["id","valor_total","status","data_criacao"],"title":"ClientePedidoResumo"},"ClienteProdutoResumo":{"properties":{"produto_id":{"type":"string","title":"Produto Id"},"descricao_produto":{"type":"string","title":"Descricao Produto"},"quantidade_total":{"type":"integer","title":"Quantidade Total"},"valor_total":{"type":"number","title":"Valor Total"}},"type":"object","required":["produto_id","descricao_produto","quantidade_total","valor_total"],"title":"ClienteProdutoResumo"},"ClienteResumo":{"properties":{"id":{"type":"string","title":"Id"},"nome_fantasia":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Nome Fantasia"},"razao_social":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Razao Social"},"cnpj":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Cnpj"},"email":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Email"},"telefone":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Telefone"},"bloqueio_solicitado":{"type":"boolean","title":"Bloqueio Solicitado","default":false},"bloqueio_motivo":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Bloqueio Motivo"}},"type":"object","required":["id"],"title":"ClienteResumo"},"ClienteTop10Item":{"properties":{"id":{"type":"string","title":"Id"},"nome_fantasia":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Nome Fantasia"},"valor_total":{"type":"number","title":"Valor Total"}},"type":"object","required":["id","valor_total"],"title":"ClienteTop10Item"},"ComboCreate":{"properties":{"tipo":{"type":"string","title":"Tipo","description":"'box' (principal + bonificador) ou 'individual'"},"nome":{"type":"string","maxLength":120,"minLength":1,"title":"Nome"},"condicoes":{"anyOf":[{"type":"string","maxLength":1000},{"type":"null"}],"title":"Condicoes","description":"Condições da oferta escritas pelo parceiro (quantidade, volume, desconto...)"},"validade_inicio":{"type":"string","format":"date","title":"Validade Inicio"},"validade_fim":{"type":"string","format":"date","title":"Validade Fim"},"ativo":{"type":"boolean","title":"Ativo","default":true},"imagem_base64":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Imagem Base64","description":"Arte do combo (upload)"},"itens":{"items":{"$ref":"#/components/schemas/ComboItem"},"type":"array","minItems":2,"title":"Itens"}},"type":"object","required":["tipo","nome","validade_inicio","validade_fim","itens"],"title":"ComboCreate"},"ComboItem":{"properties":{"produto_id":{"type":"string","title":"Produto Id","description":"ID do produto do próprio parceiro"},"codigo":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Codigo","description":"Código do produto (preenchido pelo sistema)"},"descricao":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Descricao","description":"Descrição do produto (preenchida pelo sistema)"},"unidade":{"type":"string","title":"Unidade","description":"Embalagem vendida (CX, UN, FD...)","default":"UN"},"quantidade":{"type":"integer","minimum":1.0,"title":"Quantidade","description":"Quantidade deste item dentro do combo"},"preco_unitario":{"type":"number","exclusiveMinimum":0.0,"title":"Preco Unitario","description":"Preço unitário praticado NO COMBO"},"natureza":{"type":"string","title":"Natureza","description":"'venda' (item principal) ou 'bonificacao' (item bonificador)","default":"venda"},"principal":{"type":"boolean","title":"Principal","description":"Item carro-chefe que abre o pedido","default":false}},"type":"object","required":["produto_id","quantidade","preco_unitario"],"title":"ComboItem","description":"Item que compõe o combo.\n\nO Parceiro é quem define a regra comercial: quais produtos entram, em que\nquantidade e por qual preço dentro do combo. Nenhum item vai a valor zero —\na bonificação também sai com valor, apenas com natureza fiscal diferente\n(CFOP de bonificação em vez de CFOP de venda)."},"ComboListResponse":{"properties":{"items":{"items":{"$ref":"#/components/schemas/ComboResponse"},"type":"array","title":"Items"},"total":{"type":"integer","title":"Total"}},"type":"object","required":["items","total"],"title":"ComboListResponse"},"ComboResponse":{"properties":{"id":{"type":"string","title":"Id"},"atacadista_id":{"type":"string","title":"Atacadista Id"},"tipo":{"type":"string","title":"Tipo"},"nome":{"type":"string","title":"Nome"},"condicoes":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Condicoes"},"validade_inicio":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Validade Inicio"},"validade_fim":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Validade Fim"},"ativo":{"type":"boolean","title":"Ativo","default":true},"vigente":{"type":"boolean","title":"Vigente","description":"Ativo E dentro do período de validade","default":false},"image_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Image Url"},"thumb_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Thumb Url"},"itens":{"items":{"$ref":"#/components/schemas/ComboItem"},"type":"array","title":"Itens"},"valor_total":{"type":"number","title":"Valor Total","default":0.0}},"type":"object","required":["id","atacadista_id","tipo","nome"],"title":"ComboResponse"},"ComboUpdate":{"properties":{"tipo":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tipo"},"nome":{"anyOf":[{"type":"string","maxLength":120,"minLength":1},{"type":"null"}],"title":"Nome"},"condicoes":{"anyOf":[{"type":"string","maxLength":1000},{"type":"null"}],"title":"Condicoes"},"validade_inicio":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Validade Inicio"},"validade_fim":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Validade Fim"},"ativo":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Ativo"},"imagem_base64":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Imagem Base64"},"itens":{"anyOf":[{"items":{"$ref":"#/components/schemas/ComboItem"},"type":"array"},{"type":"null"}],"title":"Itens"}},"type":"object","title":"ComboUpdate"},"CommissionItem":{"properties":{"pedido_id":{"type":"string","title":"Pedido Id","description":"ID do pedido"},"varejista_id":{"type":"string","title":"Varejista Id","description":"Identificador do varejista"},"varejista_nome_fantasia":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Varejista Nome Fantasia","description":"Nome fantasia do varejista"},"valor_pedido":{"type":"number","title":"Valor Pedido","description":"Valor total do pedido"},"comissao":{"type":"number","title":"Comissao","description":"Valor da comissão calculada para o pedido"},"status":{"type":"string","title":"Status","description":"Status atual do pedido"},"data_criacao":{"type":"string","title":"Data Criacao","description":"Data de criação do pedido em ISO 8601"}},"type":"object","required":["pedido_id","varejista_id","valor_pedido","comissao","status","data_criacao"],"title":"CommissionItem","description":"Item de extrato de comissão por pedido."},"CommissionSummary":{"properties":{"ano":{"type":"integer","title":"Ano","description":"Ano de referência do extrato"},"mes":{"type":"integer","title":"Mes","description":"Mês de referência (1-12)"},"comissao_percentual":{"type":"number","title":"Comissao Percentual","description":"Percentual de comissão considerado (0.02 = 2%)"},"total_comissao":{"type":"number","title":"Total Comissao","description":"Total de comissão devida no mês"},"total_pedidos_base":{"type":"integer","title":"Total Pedidos Base","description":"Quantidade de pedidos que geraram comissão no período"},"itens":{"items":{"$ref":"#/components/schemas/CommissionItem"},"type":"array","title":"Itens","description":"Lista detalhada das comissões por pedido"}},"type":"object","required":["ano","mes","comissao_percentual","total_comissao","total_pedidos_base"],"title":"CommissionSummary","description":"Resumo mensal de comissões devidas pelo atacadista."},"CondicoesPagamentoResponse":{"properties":{"condicoes":{"items":{"type":"string","enum":["A VISTA","PIX","BOL 7 DIAS","BOL 14 DIAS","BOL 21 DIAS","BOL 28 DIAS","BOL 7/14 DIAS","BOL 7/14/21 DIAS","BOL 14/21/28 DIAS","BOL 14/21 DIAS","CARTAO CREDITO","CARTAO DEBITO"]},"type":"array","title":"Condicoes"},"opcoes_disponiveis":{"items":{"type":"string","enum":["A VISTA","PIX","BOL 7 DIAS","BOL 14 DIAS","BOL 21 DIAS","BOL 28 DIAS","BOL 7/14 DIAS","BOL 7/14/21 DIAS","BOL 14/21/28 DIAS","BOL 14/21 DIAS","CARTAO CREDITO","CARTAO DEBITO"]},"type":"array","title":"Opcoes Disponiveis"}},"type":"object","title":"CondicoesPagamentoResponse"},"CondicoesPagamentoUpdateRequest":{"properties":{"condicoes":{"items":{"type":"string","enum":["A VISTA","PIX","BOL 7 DIAS","BOL 14 DIAS","BOL 21 DIAS","BOL 28 DIAS","BOL 7/14 DIAS","BOL 7/14/21 DIAS","BOL 14/21/28 DIAS","BOL 14/21 DIAS","CARTAO CREDITO","CARTAO DEBITO"]},"type":"array","title":"Condicoes"}},"type":"object","title":"CondicoesPagamentoUpdateRequest"},"DashboardStats":{"properties":{"total_pedidos":{"type":"integer","title":"Total Pedidos","description":"Total de pedidos do atacadista"},"pedidos_pendentes":{"type":"integer","title":"Pedidos Pendentes","description":"Quantidade de pedidos pendentes"},"total_produtos":{"type":"integer","title":"Total Produtos","description":"Total de produtos cadastrados"},"vendas_no_mes":{"type":"number","title":"Vendas No Mes","description":"Soma do valor_total dos pedidos aceitos/entregues no mês corrente para este atacadista"},"comissao_percentual":{"type":"number","title":"Comissao Percentual","description":"Percentual de comissão aplicado sobre os pedidos faturados (0.02 = 2%). Caso o atacadista não tenha um valor específico configurado, o dashboard sempre exibirá 0.02 (2%)."},"comissao_no_mes":{"type":"number","title":"Comissao No Mes","description":"Total de comissão devida no mês corrente, calculada como vendas_no_mes * comissao_percentual."},"ultimos_pedidos":{"items":{"$ref":"#/components/schemas/PedidoListItem"},"type":"array","title":"Ultimos Pedidos","description":"Lista dos últimos pedidos"}},"type":"object","required":["total_pedidos","pedidos_pendentes","total_produtos","vendas_no_mes","comissao_percentual","comissao_no_mes"],"title":"DashboardStats","description":"Resumo de indicadores do painel do atacadista.\n\nTodas as métricas são calculadas com base apenas nos dados do\n`atacadista_id` presente no JWT."},"EventoRequest":{"properties":{"evento":{"type":"string","maxLength":40,"title":"Evento"},"sessao_id":{"type":"string","maxLength":64,"title":"Sessao Id"},"caminho":{"anyOf":[{"type":"string","maxLength":200},{"type":"null"}],"title":"Caminho"},"detalhe":{"additionalProperties":true,"type":"object","title":"Detalhe"}},"type":"object","required":["evento","sessao_id"],"title":"EventoRequest"},"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"MeResponse":{"properties":{"user":{"$ref":"#/components/schemas/UserResponse"},"atacadista_nome_fantasia":{"type":"string","title":"Atacadista Nome Fantasia"},"atacadista_id":{"type":"string","title":"Atacadista Id"}},"type":"object","required":["user","atacadista_nome_fantasia","atacadista_id"],"title":"MeResponse","description":"Informações consolidadas do usuário + atacadista logado."},"PausaVendasRequest":{"properties":{"pausado":{"type":"boolean","title":"Pausado"}},"type":"object","required":["pausado"],"title":"PausaVendasRequest"},"PedidoEnderecoEntrega":{"properties":{"descricao":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Descricao"},"logradouro":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Logradouro"},"numero":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Numero"},"bairro":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Bairro"},"cidade":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Cidade"},"uf":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Uf"},"cep":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Cep"},"complemento":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Complemento"}},"type":"object","title":"PedidoEnderecoEntrega","description":"Endereço de entrega gravado no pedido (para o parceiro entregar)."},"PedidoItemResponse":{"properties":{"produto_id":{"type":"string","title":"Produto Id"},"codigo":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Codigo","description":"Código do produto no catálogo"},"descricao_produto":{"type":"string","title":"Descricao Produto"},"unidade":{"type":"string","title":"Unidade"},"quantidade":{"type":"integer","minimum":1.0,"title":"Quantidade"},"valor_unitario":{"type":"number","minimum":0.0,"title":"Valor Unitario"},"valor_total":{"type":"number","minimum":0.0,"title":"Valor Total"}},"type":"object","required":["produto_id","descricao_produto","unidade","quantidade","valor_unitario","valor_total"],"title":"PedidoItemResponse"},"PedidoListItem":{"properties":{"id":{"type":"string","title":"Id"},"tipo_operacao":{"type":"string","title":"Tipo Operacao","description":"'venda' ou 'bonificacao' (remessa em bonificação, não cobrada)","default":"venda"},"varejista_id":{"type":"string","title":"Varejista Id"},"varejista_nome_fantasia":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Varejista Nome Fantasia","description":"Nome fantasia do varejista para exibição"},"representante_nome":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Representante Nome","description":"Nome do representante, quando o pedido tem representante vinculado"},"venda_mais":{"type":"boolean","title":"Venda Mais","description":"True quando o pedido foi feito pelo representante no VendeMais","default":false},"valor_total":{"type":"number","title":"Valor Total"},"condicao_pagamento":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Condicao Pagamento","description":"Condição de pagamento escolhida pelo cliente"},"observacao_varejista":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Observacao Varejista"},"senha_compra":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Senha Compra","description":"Palavra-chave da compra, se gerada"},"senha_confirmada":{"type":"boolean","title":"Senha Confirmada","default":false},"status":{"$ref":"#/components/schemas/PedidoStatus"},"motivo_recusa":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Motivo Recusa","description":"Motivo informado quando o pedido foi recusado"},"data_criacao":{"type":"string","format":"date-time","title":"Data Criacao"}},"type":"object","required":["id","varejista_id","valor_total","status","data_criacao"],"title":"PedidoListItem"},"PedidoListResponse":{"properties":{"items":{"items":{"$ref":"#/components/schemas/PedidoListItem"},"type":"array","title":"Items"},"total":{"type":"integer","title":"Total"},"page":{"type":"integer","title":"Page"},"page_size":{"type":"integer","title":"Page Size"},"total_pages":{"type":"integer","title":"Total Pages"}},"type":"object","required":["items","total","page","page_size","total_pages"],"title":"PedidoListResponse","description":"Resposta paginada de pedidos.\n\nMantém a lista de itens e metadados de paginação para o frontend\nevitar telas infinitas quando houver muitos registros."},"PedidoMinimoRequest":{"properties":{"pedido_minimo":{"type":"number","minimum":0.0,"title":"Pedido Minimo"}},"type":"object","required":["pedido_minimo"],"title":"PedidoMinimoRequest"},"PedidoRecusaRequest":{"properties":{"motivo":{"type":"string","minLength":3,"title":"Motivo","description":"Motivo da recusa do pedido"}},"type":"object","required":["motivo"],"title":"PedidoRecusaRequest"},"PedidoResponse":{"properties":{"id":{"type":"string","title":"Id"},"atacadista_id":{"type":"string","title":"Atacadista Id"},"varejista_id":{"type":"string","title":"Varejista Id"},"varejista_nome_fantasia":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Varejista Nome Fantasia","description":"Nome fantasia do varejista para exibição"},"varejista_razao_social":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Varejista Razao Social"},"varejista_inscricao_estadual":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Varejista Inscricao Estadual"},"varejista_cnpj":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Varejista Cnpj"},"varejista_tipo_pessoa":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Varejista Tipo Pessoa","default":"pj"},"varejista_cpf":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Varejista Cpf"},"varejista_documento":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Varejista Documento"},"varejista_email":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Varejista Email"},"varejista_email_notas":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Varejista Email Notas"},"varejista_nome_contato":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Varejista Nome Contato"},"varejista_telefone":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Varejista Telefone"},"varejista_celular":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Varejista Celular"},"varejista_endereco":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Varejista Endereco","description":"Endereço cadastral do cliente, formatado"},"representante_nome":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Representante Nome","description":"Nome do representante, quando o pedido tem representante vinculado"},"venda_mais":{"type":"boolean","title":"Venda Mais","description":"True quando o pedido foi feito pelo representante no VendeMais","default":false},"endereco_entrega":{"anyOf":[{"$ref":"#/components/schemas/PedidoEnderecoEntrega"},{"type":"null"}],"description":"Endereço onde o parceiro deve entregar"},"itens":{"items":{"$ref":"#/components/schemas/PedidoItemResponse"},"type":"array","title":"Itens"},"valor_total":{"type":"number","title":"Valor Total"},"condicao_pagamento":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Condicao Pagamento","description":"Condição de pagamento escolhida pelo cliente"},"observacao_varejista":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Observacao Varejista"},"preferencia_ruptura":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Preferencia Ruptura","description":"Preferência do cliente em caso de falta: aguardar | excluir | urgencia"},"tipo_operacao":{"type":"string","title":"Tipo Operacao","description":"'venda' ou 'bonificacao' (remessa em bonificação, CFOP próprio, não cobrada)","default":"venda"},"pedido_venda_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Pedido Venda Id","description":"Pedido de venda que originou esta bonificação"},"valor_mercadoria":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Valor Mercadoria","description":"Valor das mercadorias na bonificação (para a NF); não é cobrado do cliente"},"oc":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Oc","description":"Dados de Ordem de Compra, se preenchidos"},"senha_compra":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Senha Compra","description":"Palavra-chave da compra, se gerada"},"senha_confirmada":{"type":"boolean","title":"Senha Confirmada","description":"Parceiro marcou a senha como conferida","default":false},"status":{"$ref":"#/components/schemas/PedidoStatus"},"motivo_recusa":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Motivo Recusa","description":"Motivo informado quando o pedido foi recusado"},"data_criacao":{"type":"string","format":"date-time","title":"Data Criacao"}},"type":"object","required":["id","atacadista_id","varejista_id","itens","valor_total","status","data_criacao"],"title":"PedidoResponse"},"PedidoStatus":{"type":"string","enum":["pendente","aceito","recusado","entregue"],"title":"PedidoStatus","description":"Status possível de um pedido."},"PedidoStatusUpdateResponse":{"properties":{"id":{"type":"string","title":"Id"},"status":{"$ref":"#/components/schemas/PedidoStatus"},"data_criacao":{"type":"string","format":"date-time","title":"Data Criacao"}},"type":"object","required":["id","status","data_criacao"],"title":"PedidoStatusUpdateResponse"},"PessoaFisicaRequest":{"properties":{"aceita":{"type":"boolean","title":"Aceita"},"pedido_minimo_cpf":{"anyOf":[{"type":"number","minimum":0.0},{"type":"null"}],"title":"Pedido Minimo Cpf"}},"type":"object","required":["aceita"],"title":"PessoaFisicaRequest","description":"Aceite de venda para CPF e o pedido minimo proprio desse publico."},"PrecoItem":{"properties":{"unidade":{"type":"string","title":"Unidade"},"preco":{"type":"number","exclusiveMinimum":0.0,"title":"Preco"},"quantidade_unidades":{"type":"integer","minimum":1.0,"title":"Quantidade Unidades","default":1}},"type":"object","required":["unidade","preco"],"title":"PrecoItem"},"ProdutoBase":{"properties":{"codigo":{"type":"string","title":"Codigo","description":"Código interno do produto"},"descricao":{"type":"string","title":"Descricao"},"descricao_detalhada":{"anyOf":[{"type":"string","maxLength":1000},{"type":"null"}],"title":"Descricao Detalhada","description":"Descrição livre do produto (opcional, até 1000 caracteres)"},"image_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Image Url","description":"URL publica da imagem do produto"},"thumb_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Thumb Url","description":"URL otimizada da miniatura do produto"},"imagem_base64":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Imagem Base64","description":"Campo legado para upload temporario em base64"},"estoque":{"type":"integer","minimum":0.0,"title":"Estoque","default":0},"qtd_minima":{"anyOf":[{"type":"integer","minimum":1.0},{"type":"null"}],"title":"Qtd Minima","description":"Quantidade mínima de venda por pedido"},"qtd_maxima":{"anyOf":[{"type":"integer","minimum":1.0},{"type":"null"}],"title":"Qtd Maxima","description":"Quantidade máxima de venda por pedido"},"precos":{"items":{"$ref":"#/components/schemas/PrecoItem"},"type":"array","minItems":1,"title":"Precos"}},"type":"object","required":["codigo","descricao","precos"],"title":"ProdutoBase"},"ProdutoCreate":{"properties":{"codigo":{"type":"string","title":"Codigo","description":"Código interno do produto"},"descricao":{"type":"string","title":"Descricao"},"descricao_detalhada":{"anyOf":[{"type":"string","maxLength":1000},{"type":"null"}],"title":"Descricao Detalhada","description":"Descrição livre do produto (opcional, até 1000 caracteres)"},"image_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Image Url","description":"URL publica da imagem do produto"},"thumb_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Thumb Url","description":"URL otimizada da miniatura do produto"},"imagem_base64":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Imagem Base64","description":"Campo legado para upload temporario em base64"},"estoque":{"type":"integer","minimum":0.0,"title":"Estoque","default":0},"qtd_minima":{"anyOf":[{"type":"integer","minimum":1.0},{"type":"null"}],"title":"Qtd Minima","description":"Quantidade mínima de venda por pedido"},"qtd_maxima":{"anyOf":[{"type":"integer","minimum":1.0},{"type":"null"}],"title":"Qtd Maxima","description":"Quantidade máxima de venda por pedido"},"precos":{"items":{"$ref":"#/components/schemas/PrecoItem"},"type":"array","minItems":1,"title":"Precos"}},"type":"object","required":["codigo","descricao","precos"],"title":"ProdutoCreate"},"ProdutoListResponse":{"properties":{"items":{"items":{"$ref":"#/components/schemas/ProdutoResponse"},"type":"array","title":"Items"},"total":{"type":"integer","title":"Total"},"page":{"type":"integer","title":"Page"},"page_size":{"type":"integer","title":"Page Size"},"total_pages":{"type":"integer","title":"Total Pages"}},"type":"object","required":["items","total","page","page_size","total_pages"],"title":"ProdutoListResponse","description":"Resposta paginada de produtos.\n\nMantém a lista de itens e metadados de paginação para o frontend\nevitar telas infinitas quando houver muitos registros."},"ProdutoResponse":{"properties":{"codigo":{"type":"string","title":"Codigo","description":"Código interno do produto"},"descricao":{"type":"string","title":"Descricao"},"descricao_detalhada":{"anyOf":[{"type":"string","maxLength":1000},{"type":"null"}],"title":"Descricao Detalhada","description":"Descrição livre do produto (opcional, até 1000 caracteres)"},"image_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Image Url","description":"URL publica da imagem do produto"},"thumb_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Thumb Url","description":"URL otimizada da miniatura do produto"},"imagem_base64":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Imagem Base64","description":"Campo legado para upload temporario em base64"},"estoque":{"type":"integer","minimum":0.0,"title":"Estoque","default":0},"qtd_minima":{"anyOf":[{"type":"integer","minimum":1.0},{"type":"null"}],"title":"Qtd Minima","description":"Quantidade mínima de venda por pedido"},"qtd_maxima":{"anyOf":[{"type":"integer","minimum":1.0},{"type":"null"}],"title":"Qtd Maxima","description":"Quantidade máxima de venda por pedido"},"precos":{"items":{"$ref":"#/components/schemas/PrecoItem"},"type":"array","minItems":1,"title":"Precos"},"id":{"type":"string","title":"Id"}},"type":"object","required":["codigo","descricao","precos","id"],"title":"ProdutoResponse"},"ProdutoUpdate":{"properties":{"codigo":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Codigo"},"descricao":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Descricao"},"descricao_detalhada":{"anyOf":[{"type":"string","maxLength":1000},{"type":"null"}],"title":"Descricao Detalhada"},"image_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Image Url"},"thumb_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Thumb Url"},"imagem_base64":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Imagem Base64"},"estoque":{"anyOf":[{"type":"integer","minimum":0.0},{"type":"null"}],"title":"Estoque"},"qtd_minima":{"anyOf":[{"type":"integer","minimum":1.0},{"type":"null"}],"title":"Qtd Minima"},"qtd_maxima":{"anyOf":[{"type":"integer","minimum":1.0},{"type":"null"}],"title":"Qtd Maxima"},"precos":{"anyOf":[{"items":{"$ref":"#/components/schemas/PrecoItem"},"type":"array"},{"type":"null"}],"title":"Precos"}},"type":"object","title":"ProdutoUpdate"},"SenhaCompraRequest":{"properties":{"modo":{"type":"string","title":"Modo","default":"desligado"},"quantidade":{"type":"integer","minimum":1.0,"title":"Quantidade","default":1}},"type":"object","title":"SenhaCompraRequest"},"TokenPair":{"properties":{"access_token":{"type":"string","title":"Access Token"},"refresh_token":{"type":"string","title":"Refresh Token"},"token_type":{"type":"string","title":"Token Type","default":"bearer"},"expires_in":{"type":"integer","title":"Expires In","description":"Tempo de expiração do access token em segundos."}},"type":"object","required":["access_token","refresh_token","expires_in"],"title":"TokenPair","description":"Payload retornado após login ou refresh contendo os tokens JWT."},"UserResponse":{"properties":{"id":{"type":"string","title":"Id"},"nome":{"type":"string","title":"Nome"},"email":{"type":"string","format":"email","title":"Email"},"atacadista_id":{"type":"string","title":"Atacadista Id"},"created_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Created At"}},"type":"object","required":["id","nome","email","atacadista_id"],"title":"UserResponse","description":"Usuário logado retornado pelo /auth/me."},"ValidationError":{"properties":{"loc":{"items":{"anyOf":[{"type":"string"},{"type":"integer"}]},"type":"array","title":"Location"},"msg":{"type":"string","title":"Message"},"type":{"type":"string","title":"Error Type"},"input":{"title":"Input"},"ctx":{"type":"object","title":"Context"}},"type":"object","required":["loc","msg","type"],"title":"ValidationError"},"VendaMaisRequest":{"properties":{"participa":{"type":"boolean","title":"Participa"}},"type":"object","required":["participa"],"title":"VendaMaisRequest"}},"securitySchemes":{"OAuth2PasswordBearer":{"type":"oauth2","flows":{"password":{"scopes":{},"tokenUrl":"/auth/login"}}}}},"tags":[{"name":"auth","description":"Login e renovação de token (JWT). Comece por aqui."},{"name":"produtos","description":"Catálogo do parceiro: consulta, cadastro unitário e carga em massa (bulk upsert por código)."},{"name":"pedidos","description":"Pedidos recebidos dos clientes: consulta com filtros por status, detalhe com dados do cliente e ações (aceitar/recusar/entregar/cancelar)."},{"name":"atacadista","description":"Dados e configurações da própria conta do parceiro."},{"name":"dashboard","description":"Indicadores resumidos."},{"name":"relatorios","description":"Extrato mensal de comissões."}]}