{
  "openapi": "3.0.3",
  "info": {
    "title": "Próspero IA API",
    "version": "0.6.6",
    "description": "API multiempresa do Próspero ERP. O Bearer identifica o cliente e seu banco Firebird; o login do usuário cria uma sessão temporária para o dashboard e para as interações com a IA."
  },
  "servers": [
    { "url": "http://127.0.0.1:3001", "description": "Serviço Horse local" },
    { "url": "http://127.0.0.1:8080", "description": "Plataforma web e broker do Próspero Connector" },
    {
      "url": "http://{host}:{port}",
      "description": "Servidor Próspero na rede",
      "variables": {
        "host": { "default": "127.0.0.1", "description": "IP ou nome do servidor" },
        "port": { "default": "3001", "description": "Porta configurada no ERP" }
      }
    }
  ],
  "tags": [
    { "name": "Sistema", "description": "Disponibilidade da API e do Firebird" },
    { "name": "Cliente", "description": "Identificação da empresa pelo Bearer" },
    { "name": "Sessão", "description": "Autenticação do usuário cadastrado no ERP" },
    { "name": "Dashboard", "description": "Indicadores do cliente autenticado" },
    { "name": "Vendas", "description": "Vendas, comissões, comprovantes e documentos fiscais" },
    { "name": "Produtos", "description": "Vendas, estoque, movimentação e últimas compras" },
    { "name": "Compras", "description": "Entradas, fornecedores e documentos fiscais" },
    { "name": "Próspero IA", "description": "Interação em linguagem natural com as ações do ERP" },
    { "name": "Connector", "description": "Vínculo e transporte reverso entre a plataforma web e a API Horse local" }
  ],
  "paths": {
    "/health": {
      "get": {
        "tags": ["Sistema"],
        "summary": "Verifica se a API está disponível",
        "operationId": "health",
        "responses": {
          "200": {
            "description": "API disponível",
            "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Health" } } }
          }
        }
      }
    },
    "/api/v1/health": {
      "get": {
        "tags": ["Sistema"],
        "summary": "Health check versionado",
        "operationId": "versionedHealth",
        "responses": {
          "200": {
            "description": "API disponível",
            "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Health" } } }
          }
        }
      }
    },
    "/api/v1/secure/ping": {
      "get": {
        "tags": ["Cliente"],
        "summary": "Valida o Bearer e identifica o cliente",
        "operationId": "securePing",
        "security": [{ "bearerAuth": [] }],
        "responses": {
          "200": {
            "description": "Bearer válido",
            "content": { "application/json": { "schema": { "$ref": "#/components/schemas/SecurePing" } } }
          },
          "401": { "$ref": "#/components/responses/Unauthorized" }
        }
      }
    },
    "/api/v1/client": {
      "get": {
        "tags": ["Cliente"],
        "summary": "Consulta o cliente vinculado ao Bearer",
        "operationId": "currentClient",
        "security": [{ "bearerAuth": [] }],
        "responses": {
          "200": {
            "description": "Cliente autenticado",
            "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Client" } } }
          },
          "401": { "$ref": "#/components/responses/Unauthorized" }
        }
      }
    },
    "/api/v1/database/health": {
      "get": {
        "tags": ["Sistema"],
        "summary": "Testa o Firebird do cliente autenticado",
        "operationId": "databaseHealth",
        "security": [{ "bearerAuth": [] }],
        "responses": {
          "200": {
            "description": "Firebird conectado",
            "content": { "application/json": { "schema": { "$ref": "#/components/schemas/DatabaseHealth" } } }
          },
          "401": { "$ref": "#/components/responses/Unauthorized" },
          "503": { "$ref": "#/components/responses/DatabaseUnavailable" }
        }
      }
    },
    "/api/v1/auth/login": {
      "post": {
        "tags": ["Sessão"],
        "summary": "Autentica um usuário do ERP",
        "description": "O Bearer seleciona a empresa e o banco. Usuário e senha são validados na tabela USUARIO desse banco.",
        "operationId": "login",
        "security": [{ "bearerAuth": [] }],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": { "$ref": "#/components/schemas/LoginRequest" },
              "example": { "username": "Admin", "password": "sua-senha" }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Sessão criada por 8 horas",
            "content": { "application/json": { "schema": { "$ref": "#/components/schemas/LoginResponse" } } }
          },
          "401": { "$ref": "#/components/responses/Unauthorized" },
          "422": { "$ref": "#/components/responses/LoginFailed" },
          "503": { "$ref": "#/components/responses/DatabaseUnavailable" }
        }
      }
    },
    "/api/v1/auth/logout": {
      "post": {
        "tags": ["Sessão"],
        "summary": "Encerra a sessão do usuário",
        "operationId": "logout",
        "security": [{ "bearerAuth": [], "userSession": [] }],
        "responses": {
          "200": {
            "description": "Sessão encerrada",
            "content": { "application/json": { "schema": { "$ref": "#/components/schemas/StatusMessage" } } }
          },
          "401": { "$ref": "#/components/responses/Unauthorized" }
        }
      }
    },
    "/api/v1/dashboard/summary": {
      "get": {
        "tags": ["Dashboard"],
        "summary": "Resumo das vendas de hoje",
        "operationId": "dashboardSummary",
        "security": [{ "bearerAuth": [], "userSession": [] }],
        "responses": {
          "200": {
            "description": "Indicadores calculados no Firebird",
            "content": { "application/json": { "schema": { "$ref": "#/components/schemas/DashboardSummary" } } }
          },
          "401": { "$ref": "#/components/responses/InvalidSession" },
          "503": { "$ref": "#/components/responses/DatabaseUnavailable" }
        }
      }
    },
    "/api/v1/dashboard/legacy": {
      "post": {
        "tags": ["Dashboard"],
        "summary": "Indicadores gerenciais herdados do dashboard UniGUI",
        "description": "Retorna vendas, cancelamentos, evolução diária e mensal (até 12 meses), recebimentos, vendedores com comissão, top produtos, horário de pico, contas a receber e pagar, retiradas, patrimônio de estoque e saldos dos caixas.",
        "operationId": "legacyDashboard",
        "security": [{ "bearerAuth": [], "userSession": [] }],
        "requestBody": {
          "required": true,
          "content": { "application/json": { "schema": {
            "type": "object",
            "required": ["date_start", "date_end"],
            "properties": {
              "date_start": { "type": "string", "format": "date" },
              "date_end": { "type": "string", "format": "date" }
            }
          }, "example": { "date_start": "2026-07-01", "date_end": "2026-07-31" } } }
        },
        "responses": {
          "200": { "description": "Indicadores calculados no Firebird" },
          "401": { "$ref": "#/components/responses/InvalidSession" },
          "503": { "$ref": "#/components/responses/DatabaseUnavailable" }
        }
      }
    },
    "/api/v1/sales/indicators": {
      "post": { "tags": ["Dashboard"], "summary": "Indicadores de vendas por período", "operationId": "salesIndicators", "security": [{ "bearerAuth": [], "userSession": [] }], "requestBody": { "$ref": "#/components/requestBodies/Period" }, "responses": { "200": { "description": "Total, quantidade, média diária, ticket médio e top 10" }, "401": { "$ref": "#/components/responses/InvalidSession" } } }
    },
    "/api/v1/sales/sellers": {
      "post": { "tags": ["Dashboard"], "summary": "Vendas e produtos por vendedor", "operationId": "salesBySeller", "security": [{ "bearerAuth": [], "userSession": [] }], "requestBody": { "$ref": "#/components/requestBodies/Period" }, "responses": { "200": { "description": "Ranking de vendedores e produtos vendidos" }, "401": { "$ref": "#/components/responses/InvalidSession" } } }
    },
    "/api/v1/sales/sections": {
      "post": { "tags": ["Dashboard"], "summary": "Vendas de produtos por seção", "operationId": "salesBySection", "security": [{ "bearerAuth": [], "userSession": [] }], "requestBody": { "$ref": "#/components/requestBodies/Period" }, "responses": { "200": { "description": "Vendas, quantidade, média, ticket e total por seção" }, "401": { "$ref": "#/components/responses/InvalidSession" } } }
    },
    "/api/v1/sales/peak-hours": {
      "post": { "tags": ["Dashboard"], "summary": "Horário de pico detalhado por hora", "operationId": "salesPeakHours", "security": [{ "bearerAuth": [], "userSession": [] }], "requestBody": { "$ref": "#/components/requestBodies/Period" }, "responses": { "200": { "description": "Vendas, itens, média, ticket e percentuais por hora" }, "401": { "$ref": "#/components/responses/InvalidSession" } } }
    },
    "/api/v1/sales/list": {
      "post": {
        "tags": ["Vendas"],
        "summary": "Lista vendas e identifica o documento disponível",
        "description": "Retorna número, data, cliente, produtos, acréscimo, desconto, total, comissão e o tipo de documento: NF-e, NFC-e ou comprovante.",
        "operationId": "salesList",
        "security": [{ "bearerAuth": [], "userSession": [] }],
        "requestBody": { "$ref": "#/components/requestBodies/Period" },
        "responses": {
          "200": { "description": "Vendas do período", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/SalesList" } } } },
          "401": { "$ref": "#/components/responses/InvalidSession" }
        }
      }
    },
    "/api/v1/sales/document": {
      "post": {
        "tags": ["Vendas"],
        "summary": "Obtém DANFE ou comprovante de uma venda",
        "description": "Para NF-e/NFC-e retorna chave, protocolo, situação, XML, itens e recebimentos. Para venda não fiscal retorna os dados completos do comprovante.",
        "operationId": "saleDocument",
        "security": [{ "bearerAuth": [], "userSession": [] }],
        "requestBody": { "required": true, "content": { "application/json": { "schema": { "type": "object", "required": ["sale_id"], "properties": { "sale_id": { "type": "integer", "description": "Código do pedido/venda" } } }, "example": { "sale_id": 8 } } } },
        "responses": {
          "200": { "description": "Documento e itens da venda", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/SaleDocument" } } } },
          "401": { "$ref": "#/components/responses/InvalidSession" }
        }
      }
    },
    "/api/v1/finance/dre": {
      "post": { "tags": ["Dashboard"], "summary": "DRE com as regras do ERP", "operationId": "financeDre", "security": [{ "bearerAuth": [], "userSession": [] }], "requestBody": { "$ref": "#/components/requestBodies/Period" }, "responses": { "200": { "description": "Receitas, devoluções, impostos, CMV, despesas e lucros" }, "401": { "$ref": "#/components/responses/InvalidSession" } } }
    },
    "/api/v1/finance/chart-of-accounts": {
      "post": { "tags": ["Dashboard"], "summary": "Movimentos por plano de contas", "operationId": "financeChartOfAccounts", "security": [{ "bearerAuth": [], "userSession": [] }], "requestBody": { "$ref": "#/components/requestBodies/Period" }, "responses": { "200": { "description": "Créditos, débitos e saldo por plano" }, "401": { "$ref": "#/components/responses/InvalidSession" } } }
    },
    "/api/v1/people/search": {
      "post": { "tags": ["Cliente"], "summary": "Pesquisa cliente ou fornecedor e seu financeiro", "description": "Pesquisa por nome, CPF ou CNPJ. Retorna limite de crédito e títulos em aberto a receber e a pagar.", "operationId": "peopleSearch", "security": [{ "bearerAuth": [], "userSession": [] }], "requestBody": { "required": true, "content": { "application/json": { "schema": { "type": "object", "required": ["kind", "search"], "properties": { "kind": { "type": "string", "enum": ["cliente", "fornecedor"] }, "search": { "type": "string", "minLength": 2 } } }, "example": { "kind": "cliente", "search": "Alisson Barcelos" } } } }, "responses": { "200": { "description": "Cadastros e títulos encontrados" }, "401": { "$ref": "#/components/responses/InvalidSession" } } }
    },
    "/api/v1/products/search": {
      "post": { "tags": ["Produtos"], "summary": "Pesquisa produto e sua movimentação", "description": "Pesquisa por descrição, referência, código interno ou código de barras. Retorna saldo, entradas, saídas, vendas e última compra.", "operationId": "productSearch", "security": [{ "bearerAuth": [], "userSession": [] }], "requestBody": { "required": true, "content": { "application/json": { "schema": { "type": "object", "required": ["search"], "properties": { "search": { "type": "string" }, "date_start": { "type": "string", "format": "date" }, "date_end": { "type": "string", "format": "date" } } }, "example": { "search": "Coca-Cola", "date_start": "2026-07-01", "date_end": "2026-07-31" } } } }, "responses": { "200": { "description": "Produtos e movimentações encontrados" }, "401": { "$ref": "#/components/responses/InvalidSession" } } }
    },
    "/api/v1/purchases/search": {
      "post": { "tags": ["Compras"], "summary": "Pesquisa entradas e notas fiscais", "description": "Filtra por período, fornecedor, número da nota ou chave.", "operationId": "purchaseSearch", "security": [{ "bearerAuth": [], "userSession": [] }], "requestBody": { "required": true, "content": { "application/json": { "schema": { "type": "object", "properties": { "search": { "type": "string" }, "date_start": { "type": "string", "format": "date" }, "date_end": { "type": "string", "format": "date" } } }, "example": { "search": "Fornecedor X", "date_start": "2026-07-01", "date_end": "2026-07-31" } } } }, "responses": { "200": { "description": "Resumo e documentos de compra" }, "401": { "$ref": "#/components/responses/InvalidSession" } } }
    },
    "/api/v1/purchases/document": {
      "post": { "tags": ["Compras"], "summary": "Obtém documento fiscal de uma entrada", "description": "Retorna cabeçalho, itens e XML armazenado para visualização da DANFE.", "operationId": "purchaseDocument", "security": [{ "bearerAuth": [], "userSession": [] }], "requestBody": { "required": true, "content": { "application/json": { "schema": { "type": "object", "required": ["purchase_id"], "properties": { "purchase_id": { "type": "integer" } } }, "example": { "purchase_id": 123 } } } }, "responses": { "200": { "description": "Documento fiscal e itens" }, "401": { "$ref": "#/components/responses/InvalidSession" } } }
    },
    "/api/v1/ia/chat": {
      "post": {
        "tags": ["Próspero IA"],
        "summary": "Interpreta texto e executa uma consulta autorizada",
        "description": "A GPT configurada no ERP interpreta conversa natural, datas e entidades. O catálogo seguro consulta vendas, evolução mensal de até 12 meses, listagem e documentos, comissão por vendedor e vendas de origem, recebimentos, produtos, compras, fornecedores, estoque, financeiro, caixas, DRE e plano de contas. Dúvidas externas podem usar pesquisa web; solicitações internas ainda não suportadas retornam aprendizado.pendente.",
        "operationId": "aiChat",
        "security": [{ "bearerAuth": [], "userSession": [] }],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": { "$ref": "#/components/schemas/ChatRequest" },
              "example": { "conversation_id": "web-001", "message": "Quanto vendemos hoje em PIX?" }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Resposta da ação executada",
            "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ChatResponse" } } }
          },
          "401": { "$ref": "#/components/responses/InvalidSession" },
          "422": { "$ref": "#/components/responses/ActionUnavailable" },
          "503": { "$ref": "#/components/responses/DatabaseUnavailable" }
        }
      }
    },
    "/app/api.php": {
      "post": {
        "tags": ["Connector"],
        "summary": "Executa uma operação do broker Próspero Connector",
        "description": "Endpoint da plataforma web. O parâmetro action seleciona vínculo, consulta da fila ou devolução do resultado. connector-enroll usa o código temporário; connector-poll e connector-result exigem X-Prospero-Connector. As ações administrativas exigem a sessão do painel e suas permissões.",
        "operationId": "prosperoConnectorBroker",
        "servers": [{ "url": "http://127.0.0.1:8080", "description": "IIS da plataforma web; em produção use o domínio HTTPS" }],
        "parameters": [
          {
            "name": "action",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string",
              "enum": ["connector-enroll", "connector-poll", "connector-result", "admin-infrastructure", "admin-connector-enrollment", "admin-connector-revoke", "admin-delete"]
            }
          }
        ],
        "requestBody": {
          "required": false,
          "content": {
            "application/json": {
              "schema": { "$ref": "#/components/schemas/ConnectorBrokerRequest" }
            }
          }
        },
        "responses": {
          "200": { "description": "Operação concluída" },
          "204": { "description": "Nenhum comando pendente para o Connector" },
          "401": { "description": "Connector ou administrador não autenticado" },
          "403": { "description": "Permissão administrativa insuficiente" },
          "503": { "description": "Migração 007 ainda não aplicada ou Connector indisponível" }
        }
      }
    }
  },
  "components": {
    "securitySchemes": {
      "bearerAuth": {
        "type": "http",
        "scheme": "bearer",
        "bearerFormat": "Token do cliente/CNPJ",
        "description": "Token gerado na aba Próspero IA do ERP."
      },
      "userSession": {
        "type": "apiKey",
        "in": "header",
        "name": "X-Prospero-Session",
        "description": "Sessão temporária retornada pelo login do usuário."
      },
      "connectorAuth": {
        "type": "apiKey",
        "in": "header",
        "name": "X-Prospero-Connector",
        "description": "Segredo emitido uma única vez no vínculo e protegido por DPAPI no computador do cliente."
      }
    },
    "requestBodies": {
      "Period": {
        "required": true,
        "content": { "application/json": { "schema": { "type": "object", "required": ["date_start", "date_end"], "properties": { "date_start": { "type": "string", "format": "date" }, "date_end": { "type": "string", "format": "date" } } }, "example": { "date_start": "2026-08-01", "date_end": "2026-08-31" } } }
      }
    },
    "schemas": {
      "ConnectorBrokerRequest": {
        "type": "object",
        "description": "O conteúdo depende da action selecionada.",
        "properties": {
          "cnpj": { "type": "string", "example": "00000000000000" },
          "enrollment_code": { "type": "string", "example": "CODIGO-TEMPORARIO" },
          "connector_version": { "type": "string", "example": "0.1.0" },
          "local_api_version": { "type": "string", "example": "0.6.6" },
          "command_id": { "type": "string", "format": "uuid" },
          "http_status": { "type": "integer", "example": 200 },
          "body": { "description": "Resultado JSON devolvido pela API Horse" },
          "portal_id": { "type": "string", "description": "Hash público da empresa usado pelas ações administrativas" },
          "confirmation": { "type": "string", "enum": ["EXCLUIR"] }
        }
      },
      "Health": {
        "type": "object",
        "properties": {
          "status": { "type": "string", "example": "ok" },
          "service": { "type": "string", "example": "Prospero IA Server" },
          "version": { "type": "string", "example": "0.6.6" },
          "horse": { "type": "string", "example": "3.1.1" },
          "timestamp": { "type": "string", "format": "date-time" }
        }
      },
      "ClientSummary": {
        "type": "object",
        "properties": {
          "cnpj": { "type": "string", "example": "04763774000125" },
          "nome": { "type": "string", "example": "Empresa Exemplo" }
        }
      },
      "SecurePing": {
        "type": "object",
        "properties": {
          "status": { "type": "string", "example": "ok" },
          "message": { "type": "string", "example": "Autenticacao Bearer confirmada." },
          "cliente": { "$ref": "#/components/schemas/ClientSummary" }
        }
      },
      "Client": {
        "type": "object",
        "properties": {
          "cnpj": { "type": "string" },
          "nome": { "type": "string" },
          "database_configurado": { "type": "boolean" }
        }
      },
      "DatabaseHealth": {
        "type": "object",
        "properties": {
          "status": { "type": "string", "example": "ok" },
          "cnpj": { "type": "string" },
          "database": { "type": "string", "example": "conectado" }
        }
      },
      "LoginRequest": {
        "type": "object",
        "required": ["username", "password"],
        "properties": {
          "username": { "type": "string" },
          "password": { "type": "string", "format": "password" }
        }
      },
      "LoginResponse": {
        "type": "object",
        "properties": {
          "status": { "type": "string", "example": "ok" },
          "session_token": { "type": "string" },
          "expires_in": { "type": "integer", "example": 28800 },
          "user": {
            "type": "object",
            "properties": { "id": { "type": "integer" }, "name": { "type": "string" } }
          },
          "client": { "$ref": "#/components/schemas/ClientSummary" }
        }
      },
      "StatusMessage": {
        "type": "object",
        "properties": { "status": { "type": "string" }, "message": { "type": "string" } }
      },
      "DashboardSummary": {
        "type": "object",
        "properties": {
          "status": { "type": "string", "example": "ok" },
          "empresa": {
            "type": "object",
            "properties": { "codigo": { "type": "integer" }, "nome": { "type": "string" } }
          },
          "periodo": { "type": "string", "example": "hoje" },
          "vendas": {
            "type": "object",
            "properties": {
              "quantidade": { "type": "integer" },
              "total": { "type": "number", "format": "double" },
              "ticket_medio": { "type": "number", "format": "double" }
            }
          },
          "atualizado_em": { "type": "string", "format": "date-time" }
        }
      },
      "SaleListItem": {
        "type": "object",
        "properties": {
          "pedido": { "type": "integer" },
          "numero": { "type": "integer" },
          "data": { "type": "string", "format": "date-time" },
          "cliente": { "type": "string" },
          "valor_produtos": { "type": "number" },
          "acrescimo": { "type": "number" },
          "desconto": { "type": "number" },
          "valor_total": { "type": "number" },
          "percentual_comissao": { "type": "number", "example": 10 },
          "valor_comissao": { "type": "number" },
          "tipo_documento": { "type": "string", "enum": ["NFE", "NFCE", "COMPROVANTE"] },
          "numero_nota": { "type": "integer" },
          "chave": { "type": "string" },
          "fiscal": { "type": "boolean" }
        }
      },
      "SalesList": {
        "type": "object",
        "properties": {
          "status": { "type": "string", "example": "ok" },
          "periodo_inicio": { "type": "string", "format": "date" },
          "periodo_fim": { "type": "string", "format": "date" },
          "quantidade": { "type": "integer" },
          "total": { "type": "number" },
          "resultados": { "type": "array", "items": { "$ref": "#/components/schemas/SaleListItem" } }
        }
      },
      "SaleDocument": {
        "allOf": [
          { "$ref": "#/components/schemas/SaleListItem" },
          { "type": "object", "properties": {
            "cliente_documento": { "type": "string" },
            "modelo": { "type": "string" },
            "serie": { "type": "string" },
            "protocolo": { "type": "string" },
            "situacao": { "type": "string" },
            "xml": { "type": "string" },
            "itens": { "type": "array", "items": { "type": "object" } },
            "recebimentos": { "type": "array", "items": { "type": "object" } }
          } }
        ]
      },
      "ChatRequest": {
        "type": "object",
        "required": ["message"],
        "properties": {
          "conversation_id": { "type": "string" },
          "message": { "type": "string", "example": "Quanto vendemos hoje?" }
        }
      },
      "ChatResponse": {
        "type": "object",
        "properties": {
          "status": { "type": "string", "example": "ok" },
          "conversation_id": { "type": "string" },
          "answer": { "type": "string" },
          "action": { "type": "string", "enum": ["conversa", "vendas.total", "vendas.por_dia", "vendas.por_mes", "vendas.listagem", "vendas.vendedores", "vendas.comissao_vendedor", "vendas.por_recebimento", "vendas.recebimentos", "ajuda", "aprendizado.pendente"], "example": "vendas.comissao_vendedor" },
          "data": {
            "type": "object",
            "properties": {
              "empresa": { "type": "string" },
              "periodo": { "type": "string" },
              "quantidade": { "type": "integer" },
              "total": { "type": "number" },
              "ticket_medio": { "type": "number" },
              "tipo_recebimento": { "type": "string" },
              "knowledge_area": { "type": "string", "example": "Estoque" }
            }
          },
          "requires_confirmation": { "type": "boolean", "example": false }
        }
      },
      "Error": {
        "type": "object",
        "properties": { "error": { "type": "string" }, "message": { "type": "string" } }
      }
    },
    "responses": {
      "Unauthorized": {
        "description": "Bearer ausente, inválido ou inativo",
        "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Error" } } }
      },
      "InvalidSession": {
        "description": "Bearer inválido ou sessão do usuário ausente/expirada",
        "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Error" } } }
      },
      "LoginFailed": {
        "description": "Usuário, senha ou acesso ao ERP inválido",
        "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Error" } } }
      },
      "ActionUnavailable": {
        "description": "A solicitação não pôde ser executada",
        "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Error" } } }
      },
      "DatabaseUnavailable": {
        "description": "Configuração inválida ou Firebird indisponível",
        "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Error" } } }
      }
    }
  }
}
