{"openapi":"3.1.0","info":{"title":"MyHeaven API","version":"0.1.0","description":"Migração incremental das APIs PHP legadas (apis_legado/) para Next.js. Contrato próprio (não compatível byte a byte com o legado) — ver `x-pending-migration` para o que ainda falta portar."},"servers":[{"url":"http://localhost:3000"}],"security":[{"bearerAuth":[]}],"tags":[{"name":"Autenticacao","description":"Login multi-empresa que resolve o schema do tenant e emite a sessão."},{"name":"Clientes","description":"Cadastro de clientes, escopado à empresa/tenant da sessão."},{"name":"Situacao","description":"Dicionário de status compartilhado entre entidades (clientes, OS, etc.)."},{"name":"Empresas","description":"Empresas (filiais) do tenant logado."},{"name":"FormasPagamento","description":"Catálogo de formas de pagamento/recebimento."},{"name":"Pipelines","description":"Status comerciais/pipeline (CRM, OS), discriminados por `tipo`."},{"name":"Produtos","description":"Catálogo de produtos, grupos de produtos e tabelas de preço."},{"name":"Servicos","description":"Catálogo de serviços/tipos de atendimento usados em OS."},{"name":"TiposChamado","description":"Catálogo de tipos de chamado usados em OS."},{"name":"Usuarios","description":"Usuários do sistema e permissões por grupo."},{"name":"OrdemServico","description":"Ordens de serviço, atendimentos, anexos e itens de serviço."},{"name":"PontoEletronico","description":"Ponto eletrônico dos funcionários (entrada/saída)."},{"name":"Sistema","description":"Saúde e identificação da release publicada."}],"paths":{"/api/v1/autenticacao/login":{"post":{"tags":["Autenticacao"],"summary":"Login (substitui apiLogin.php)","operationId":"login","security":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"properties":{"empresa":{},"usuario":{},"senha":{}},"required":["empresa","usuario","senha"]}}}},"responses":{"200":{"description":"Sucesso.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/JsonResponse"}}}},"400":{"description":"Campo obrigatório ausente ou inválido."},"404":{"description":"Recurso não encontrado."},"500":{"description":"Erro interno sem exposição de detalhes sensíveis."}}}},"/api/v1/clientes/listar":{"post":{"tags":["Clientes"],"summary":"Lista clientes da empresa logada (substitui apiClientes.php GET)","operationId":"listarClientes","requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"properties":{"idEmpresa":{},"page":{},"pageSize":{}}}}}},"responses":{"200":{"description":"Sucesso.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/JsonResponse"}}}},"400":{"description":"Campo obrigatório ausente ou inválido."},"401":{"description":"Sessão ausente, inválida ou expirada."},"404":{"description":"Recurso não encontrado."},"500":{"description":"Erro interno sem exposição de detalhes sensíveis."}}}},"/api/v1/clientes/adicionar":{"post":{"tags":["Clientes"],"summary":"Cadastra um cliente (substitui apiClientes.php POST)","operationId":"adicionarCliente","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"properties":{"idEmpresa":{},"nome":{},"fantasia":{},"tipoCadastro":{},"tipoCliente":{},"situacao":{},"endereco":{},"numero":{},"complemento":{},"bairro":{},"cidade":{},"uf":{},"pais":{},"cep":{},"telefoneResidencial":{},"telefoneCelular":{},"telefoneComercial":{},"telefoneContato":{},"cpfCnpj":{},"email":{},"consumidor":{},"idStatusInterno":{},"sexo":{}},"required":["nome"]}}}},"responses":{"200":{"description":"Sucesso.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/JsonResponse"}}}},"400":{"description":"Campo obrigatório ausente ou inválido."},"401":{"description":"Sessão ausente, inválida ou expirada."},"404":{"description":"Recurso não encontrado."},"500":{"description":"Erro interno sem exposição de detalhes sensíveis."}}}},"/api/v1/clientes/atualizar":{"post":{"tags":["Clientes"],"summary":"Atualiza um cliente (substitui apiClientes.php PUT)","operationId":"atualizarCliente","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"properties":{"idCliente":{},"nome":{},"situacao":{},"email":{},"telefoneCelular":{}},"required":["idCliente"]}}}},"responses":{"200":{"description":"Sucesso.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/JsonResponse"}}}},"400":{"description":"Campo obrigatório ausente ou inválido."},"401":{"description":"Sessão ausente, inválida ou expirada."},"404":{"description":"Recurso não encontrado."},"500":{"description":"Erro interno sem exposição de detalhes sensíveis."}}}},"/api/v1/clientes/excluir":{"post":{"tags":["Clientes"],"summary":"Exclui um cliente (substitui apiClientes.php DELETE)","operationId":"excluirCliente","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"properties":{"idCliente":{}},"required":["idCliente"]}}}},"responses":{"200":{"description":"Sucesso.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/JsonResponse"}}}},"400":{"description":"Campo obrigatório ausente ou inválido."},"401":{"description":"Sessão ausente, inválida ou expirada."},"404":{"description":"Recurso não encontrado."},"500":{"description":"Erro interno sem exposição de detalhes sensíveis."}}}},"/api/v1/situacao/listar":{"post":{"tags":["Situacao"],"summary":"Lista o dicionário de status (substitui apiSituacao.php)","operationId":"listarSituacao","requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"properties":{"tabela":{}}}}}},"responses":{"200":{"description":"Sucesso.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/JsonResponse"}}}},"400":{"description":"Campo obrigatório ausente ou inválido."},"401":{"description":"Sessão ausente, inválida ou expirada."},"404":{"description":"Recurso não encontrado."},"500":{"description":"Erro interno sem exposição de detalhes sensíveis."}}}},"/api/v1/empresas/listar":{"post":{"tags":["Empresas"],"summary":"Lista as empresas do tenant (substitui apiEmpresas.php)","operationId":"listarEmpresas","requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"properties":{}}}}},"responses":{"200":{"description":"Sucesso.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/JsonResponse"}}}},"400":{"description":"Campo obrigatório ausente ou inválido."},"401":{"description":"Sessão ausente, inválida ou expirada."},"404":{"description":"Recurso não encontrado."},"500":{"description":"Erro interno sem exposição de detalhes sensíveis."}}}},"/api/v1/formas-pagamento/listar":{"post":{"tags":["FormasPagamento"],"summary":"Lista formas de pagamento/recebimento (substitui apiFormapagtorecto.php)","operationId":"listarFormasPagamento","requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"properties":{"apenasDisponivelApp":{}}}}}},"responses":{"200":{"description":"Sucesso.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/JsonResponse"}}}},"400":{"description":"Campo obrigatório ausente ou inválido."},"401":{"description":"Sessão ausente, inválida ou expirada."},"404":{"description":"Recurso não encontrado."},"500":{"description":"Erro interno sem exposição de detalhes sensíveis."}}}},"/api/v1/pipelines/listar":{"post":{"tags":["Pipelines"],"summary":"Lista status comerciais/pipeline (substitui apiPipelines.php)","operationId":"listarPipelines","requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"properties":{"tipo":{}}}}}},"responses":{"200":{"description":"Sucesso.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/JsonResponse"}}}},"400":{"description":"Campo obrigatório ausente ou inválido."},"401":{"description":"Sessão ausente, inválida ou expirada."},"404":{"description":"Recurso não encontrado."},"500":{"description":"Erro interno sem exposição de detalhes sensíveis."}}}},"/api/v1/produtos/listar":{"post":{"tags":["Produtos"],"summary":"Lista produtos (substitui apiProdutos.php)","operationId":"listarProdutos","requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"properties":{"grupo1":{}}}}}},"responses":{"200":{"description":"Sucesso.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/JsonResponse"}}}},"400":{"description":"Campo obrigatório ausente ou inválido."},"401":{"description":"Sessão ausente, inválida ou expirada."},"404":{"description":"Recurso não encontrado."},"500":{"description":"Erro interno sem exposição de detalhes sensíveis."}}}},"/api/v1/produtos-grupos/listar":{"post":{"tags":["Produtos"],"summary":"Lista grupos de produtos (substitui apiProdutosGrupos.php GET)","operationId":"listarProdutosGrupos","requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"properties":{}}}}},"responses":{"200":{"description":"Sucesso.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/JsonResponse"}}}},"400":{"description":"Campo obrigatório ausente ou inválido."},"401":{"description":"Sessão ausente, inválida ou expirada."},"404":{"description":"Recurso não encontrado."},"500":{"description":"Erro interno sem exposição de detalhes sensíveis."}}}},"/api/v1/produtos-grupos/adicionar":{"post":{"tags":["Produtos"],"summary":"Cadastra um grupo de produtos (substitui apiProdutosGrupos.php POST)","operationId":"adicionarProdutoGrupo","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"properties":{"idGrupoMaster":{},"descricao":{},"referencia":{},"situacao":{},"ordenacao":{}},"required":["descricao"]}}}},"responses":{"200":{"description":"Sucesso.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/JsonResponse"}}}},"400":{"description":"Campo obrigatório ausente ou inválido."},"401":{"description":"Sessão ausente, inválida ou expirada."},"404":{"description":"Recurso não encontrado."},"500":{"description":"Erro interno sem exposição de detalhes sensíveis."}}}},"/api/v1/produtos-grupos/atualizar":{"post":{"tags":["Produtos"],"summary":"Atualiza um grupo de produtos (substitui apiProdutosGrupos.php PUT)","operationId":"atualizarProdutoGrupo","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"properties":{"idGrupoProdutos":{},"descricao":{},"idGrupoMaster":{},"referencia":{},"situacao":{},"ordenacao":{}},"required":["idGrupoProdutos"]}}}},"responses":{"200":{"description":"Sucesso.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/JsonResponse"}}}},"400":{"description":"Campo obrigatório ausente ou inválido."},"401":{"description":"Sessão ausente, inválida ou expirada."},"404":{"description":"Recurso não encontrado."},"500":{"description":"Erro interno sem exposição de detalhes sensíveis."}}}},"/api/v1/produtos-grupos/excluir":{"post":{"tags":["Produtos"],"summary":"Exclui um grupo de produtos (substitui apiProdutosGrupos.php DELETE)","operationId":"excluirProdutoGrupo","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"properties":{"idGrupoProdutos":{}},"required":["idGrupoProdutos"]}}}},"responses":{"200":{"description":"Sucesso.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/JsonResponse"}}}},"400":{"description":"Campo obrigatório ausente ou inválido."},"401":{"description":"Sessão ausente, inválida ou expirada."},"404":{"description":"Recurso não encontrado."},"500":{"description":"Erro interno sem exposição de detalhes sensíveis."}}}},"/api/v1/produtos-precos/listar":{"post":{"tags":["Produtos"],"summary":"Lista preços de produtos por tabela (substitui apiProdutosprecos.php)","operationId":"listarProdutosPrecos","requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"properties":{"idProduto":{}}}}}},"responses":{"200":{"description":"Sucesso.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/JsonResponse"}}}},"400":{"description":"Campo obrigatório ausente ou inválido."},"401":{"description":"Sessão ausente, inválida ou expirada."},"404":{"description":"Recurso não encontrado."},"500":{"description":"Erro interno sem exposição de detalhes sensíveis."}}}},"/api/v1/servicos/listar":{"post":{"tags":["Servicos"],"summary":"Lista serviços/tipos de atendimento (substitui apiServicos.php)","operationId":"listarServicos","requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"properties":{}}}}},"responses":{"200":{"description":"Sucesso.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/JsonResponse"}}}},"400":{"description":"Campo obrigatório ausente ou inválido."},"401":{"description":"Sessão ausente, inválida ou expirada."},"404":{"description":"Recurso não encontrado."},"500":{"description":"Erro interno sem exposição de detalhes sensíveis."}}}},"/api/v1/tipos-chamado/listar":{"post":{"tags":["TiposChamado"],"summary":"Lista tipos de chamado (substitui apiTipochamados.php)","operationId":"listarTiposChamado","requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"properties":{}}}}},"responses":{"200":{"description":"Sucesso.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/JsonResponse"}}}},"400":{"description":"Campo obrigatório ausente ou inválido."},"401":{"description":"Sessão ausente, inválida ou expirada."},"404":{"description":"Recurso não encontrado."},"500":{"description":"Erro interno sem exposição de detalhes sensíveis."}}}},"/api/v1/usergrupos-parametro/listar":{"post":{"tags":["Usuarios"],"summary":"Lista permissões por grupo de usuário (substitui apiUsergruposparametro.php)","operationId":"listarUserGruposParametro","requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"properties":{"idusergrupo":{}}}}}},"responses":{"200":{"description":"Sucesso.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/JsonResponse"}}}},"400":{"description":"Campo obrigatório ausente ou inválido."},"401":{"description":"Sessão ausente, inválida ou expirada."},"404":{"description":"Recurso não encontrado."},"500":{"description":"Erro interno sem exposição de detalhes sensíveis."}}}},"/api/v1/usuarios/listar":{"post":{"tags":["Usuarios"],"summary":"Lista usuários do sistema (substitui apiUsuarios.php)","operationId":"listarUsuarios","requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"properties":{}}}}},"responses":{"200":{"description":"Sucesso.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/JsonResponse"}}}},"400":{"description":"Campo obrigatório ausente ou inválido."},"401":{"description":"Sessão ausente, inválida ou expirada."},"404":{"description":"Recurso não encontrado."},"500":{"description":"Erro interno sem exposição de detalhes sensíveis."}}}},"/api/v1/os/listar":{"post":{"tags":["OrdemServico"],"summary":"Lista ordens de serviço (substitui apiOrdemservicos.php GET)","operationId":"listarOs","requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"properties":{"idEmpresa":{},"idCliente":{}}}}}},"responses":{"200":{"description":"Sucesso.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/JsonResponse"}}}},"400":{"description":"Campo obrigatório ausente ou inválido."},"401":{"description":"Sessão ausente, inválida ou expirada."},"404":{"description":"Recurso não encontrado."},"500":{"description":"Erro interno sem exposição de detalhes sensíveis."}}}},"/api/v1/os/adicionar":{"post":{"tags":["OrdemServico"],"summary":"Cadastra uma ordem de serviço (substitui apiOrdemservicos.php POST)","operationId":"adicionarOs","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"properties":{"idCliente":{},"numOS":{},"descricao":{},"idAtendente":{},"idTipoChamado":{},"local":{}},"required":["idCliente"]}}}},"responses":{"200":{"description":"Sucesso.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/JsonResponse"}}}},"400":{"description":"Campo obrigatório ausente ou inválido."},"401":{"description":"Sessão ausente, inválida ou expirada."},"404":{"description":"Recurso não encontrado."},"500":{"description":"Erro interno sem exposição de detalhes sensíveis."}}}},"/api/v1/os/atualizar":{"post":{"tags":["OrdemServico"],"summary":"Atualiza uma ordem de serviço (substitui apiOrdemservicos.php PUT). Ao mudar situacaoOrdem para 3 (encerrada), enfileira o e-mail de notificação ao cliente.","operationId":"atualizarOs","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"properties":{"idOS":{},"situacaoOrdem":{},"descricao":{},"solucao":{},"observacao":{}},"required":["idOS"]}}}},"responses":{"200":{"description":"Sucesso.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/JsonResponse"}}}},"400":{"description":"Campo obrigatório ausente ou inválido."},"401":{"description":"Sessão ausente, inválida ou expirada."},"404":{"description":"Recurso não encontrado."},"500":{"description":"Erro interno sem exposição de detalhes sensíveis."}}}},"/api/v1/os/excluir":{"post":{"tags":["OrdemServico"],"summary":"Exclui uma ordem de serviço (substitui apiOrdemservicos.php DELETE)","operationId":"excluirOs","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"properties":{"idOS":{}},"required":["idOS"]}}}},"responses":{"200":{"description":"Sucesso.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/JsonResponse"}}}},"400":{"description":"Campo obrigatório ausente ou inválido."},"401":{"description":"Sessão ausente, inválida ou expirada."},"404":{"description":"Recurso não encontrado."},"500":{"description":"Erro interno sem exposição de detalhes sensíveis."}}}},"/api/v1/os-atendimentos/listar":{"post":{"tags":["OrdemServico"],"summary":"Lista atendimentos de OS (substitui apiOsatendimentos.php GET)","operationId":"listarOsAtendimentos","requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"properties":{"idOS":{},"idTecnico":{},"dataInicio":{},"dataFim":{}}}}}},"responses":{"200":{"description":"Sucesso.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/JsonResponse"}}}},"400":{"description":"Campo obrigatório ausente ou inválido."},"401":{"description":"Sessão ausente, inválida ou expirada."},"404":{"description":"Recurso não encontrado."},"500":{"description":"Erro interno sem exposição de detalhes sensíveis."}}}},"/api/v1/os-atendimentos/adicionar":{"post":{"tags":["OrdemServico"],"summary":"Agenda um atendimento de OS (substitui apiOsatendimentos.php POST)","operationId":"adicionarOsAtendimento","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"properties":{"idOS":{},"datahoraInicialAgend":{},"datahoraFinalAgend":{},"idTecnicoAgend":{}},"required":["idOS"]}}}},"responses":{"200":{"description":"Sucesso.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/JsonResponse"}}}},"400":{"description":"Campo obrigatório ausente ou inválido."},"401":{"description":"Sessão ausente, inválida ou expirada."},"404":{"description":"Recurso não encontrado."},"500":{"description":"Erro interno sem exposição de detalhes sensíveis."}}}},"/api/v1/os-atendimentos/atualizar":{"post":{"tags":["OrdemServico"],"summary":"Atualiza um atendimento de OS (substitui apiOsatendimentos.php PUT)","operationId":"atualizarOsAtendimento","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"properties":{"idOSAtendimentos":{},"datahoraInicialRealiz":{},"datahoraFinalRealiz":{},"idTecnicoRealiz":{}},"required":["idOSAtendimentos"]}}}},"responses":{"200":{"description":"Sucesso.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/JsonResponse"}}}},"400":{"description":"Campo obrigatório ausente ou inválido."},"401":{"description":"Sessão ausente, inválida ou expirada."},"404":{"description":"Recurso não encontrado."},"500":{"description":"Erro interno sem exposição de detalhes sensíveis."}}}},"/api/v1/os-atendimentos/excluir":{"post":{"tags":["OrdemServico"],"summary":"Exclui um atendimento de OS (substitui apiOsatendimentos.php DELETE)","operationId":"excluirOsAtendimento","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"properties":{"idOSAtendimentos":{}},"required":["idOSAtendimentos"]}}}},"responses":{"200":{"description":"Sucesso.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/JsonResponse"}}}},"400":{"description":"Campo obrigatório ausente ou inválido."},"401":{"description":"Sessão ausente, inválida ou expirada."},"404":{"description":"Recurso não encontrado."},"500":{"description":"Erro interno sem exposição de detalhes sensíveis."}}}},"/api/v1/os-imagens/listar":{"post":{"tags":["OrdemServico"],"summary":"Lista anexos de uma OS (substitui apiOsImagens.php GET)","operationId":"listarOsImagens","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"properties":{"idOS":{}},"required":["idOS"]}}}},"responses":{"200":{"description":"Sucesso.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/JsonResponse"}}}},"400":{"description":"Campo obrigatório ausente ou inválido."},"401":{"description":"Sessão ausente, inválida ou expirada."},"404":{"description":"Recurso não encontrado."},"500":{"description":"Erro interno sem exposição de detalhes sensíveis."}}}},"/api/v1/os-imagens/adicionar":{"post":{"tags":["OrdemServico"],"summary":"Anexa um documento/foto a uma OS (substitui apiOsImagens.php POST). Espera uma URL pública em `arquivo` — não aceita mais binário embutido.","operationId":"adicionarOsImagem","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"properties":{"idOS":{},"arquivo":{},"descricao":{},"idCliente":{}},"required":["idOS","arquivo"]}}}},"responses":{"200":{"description":"Sucesso.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/JsonResponse"}}}},"400":{"description":"Campo obrigatório ausente ou inválido."},"401":{"description":"Sessão ausente, inválida ou expirada."},"404":{"description":"Recurso não encontrado."},"500":{"description":"Erro interno sem exposição de detalhes sensíveis."}}}},"/api/v1/os-servico/listar":{"post":{"tags":["OrdemServico"],"summary":"Lista os itens de serviço de uma OS (substitui apiOsservico.php GET)","operationId":"listarOsServicos","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"properties":{"idOS":{}},"required":["idOS"]}}}},"responses":{"200":{"description":"Sucesso.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/JsonResponse"}}}},"400":{"description":"Campo obrigatório ausente ou inválido."},"401":{"description":"Sessão ausente, inválida ou expirada."},"404":{"description":"Recurso não encontrado."},"500":{"description":"Erro interno sem exposição de detalhes sensíveis."}}}},"/api/v1/os-servico/adicionar":{"post":{"tags":["OrdemServico"],"summary":"Adiciona um item de serviço à OS (substitui apiOsservico.php POST)","operationId":"adicionarOsServico","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"properties":{"idOS":{},"item":{},"idServico":{},"quantidade":{},"medicao1":{},"medicao2":{},"medicao3":{}},"required":["idOS","item"]}}}},"responses":{"200":{"description":"Sucesso.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/JsonResponse"}}}},"400":{"description":"Campo obrigatório ausente ou inválido."},"401":{"description":"Sessão ausente, inválida ou expirada."},"404":{"description":"Recurso não encontrado."},"500":{"description":"Erro interno sem exposição de detalhes sensíveis."}}}},"/api/v1/os-servico/atualizar":{"post":{"tags":["OrdemServico"],"summary":"Atualiza um item de serviço da OS (substitui apiOsservico.php PUT)","operationId":"atualizarOsServico","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"properties":{"idOSServicos":{},"quantidade":{},"medicao1":{},"medicao2":{},"medicao3":{}},"required":["idOSServicos"]}}}},"responses":{"200":{"description":"Sucesso.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/JsonResponse"}}}},"400":{"description":"Campo obrigatório ausente ou inválido."},"401":{"description":"Sessão ausente, inválida ou expirada."},"404":{"description":"Recurso não encontrado."},"500":{"description":"Erro interno sem exposição de detalhes sensíveis."}}}},"/api/v1/os-servico/excluir":{"post":{"tags":["OrdemServico"],"summary":"Exclui um item de serviço da OS (substitui apiOsservico.php DELETE)","operationId":"excluirOsServico","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"properties":{"idOSServicos":{}},"required":["idOSServicos"]}}}},"responses":{"200":{"description":"Sucesso.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/JsonResponse"}}}},"400":{"description":"Campo obrigatório ausente ou inválido."},"401":{"description":"Sessão ausente, inválida ou expirada."},"404":{"description":"Recurso não encontrado."},"500":{"description":"Erro interno sem exposição de detalhes sensíveis."}}}},"/api/v1/ponto/marcar":{"post":{"tags":["PontoEletronico"],"summary":"Registra entrada ou saída do ponto eletrônico (substitui apiPontoEletronico.php). Alterna automaticamente entre entrada/saída conforme o último registro do dia.","operationId":"marcarPonto","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"properties":{"senha":{},"localizacao":{}},"required":["senha"]}}}},"responses":{"200":{"description":"Sucesso.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/JsonResponse"}}}},"400":{"description":"Campo obrigatório ausente ou inválido."},"401":{"description":"Sessão ausente, inválida ou expirada."},"404":{"description":"Recurso não encontrado."},"500":{"description":"Erro interno sem exposição de detalhes sensíveis."}}}},"/api/health":{"get":{"tags":["Sistema"],"summary":"Saúde da API","operationId":"health","security":[],"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"properties":{}}}}},"responses":{"200":{"description":"Estado atual da aplicação."}}}},"/api/version":{"get":{"tags":["Sistema"],"summary":"Versão publicada","operationId":"version","security":[],"requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"properties":{}}}}},"responses":{"200":{"description":"Estado atual da aplicação."}}}}},"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"JWT","description":"Token de sessão emitido por autenticacao/login."}},"schemas":{"JsonResponse":{"description":"Formato de resposta desta API. Varia por operação.","type":"object","additionalProperties":true}}},"x-pending-migration":["apiPedido.php","apiPedidoItens.php","apiPedidoPagamentos.php"]}