openapi: 3.0.3
info:
  title: Fornecedor API
  description: |
    API consumida pelo **Portal do Fornecedor Web** (portal-fornecedor-web).

    Mapeamento feito a partir do código do portal (serviços, controllers e models).
    Todos os endpoints usam **POST** com corpo JSON, exceto o upload do servlet (multipart).

    **Backends**
    - `/appfornecedor/rest/*` — API principal do fornecedor (variável `BASEAPI`).
    - `/appcentral/rest/*` — autenticação, clientes e unidade gestora (variável `BASEAPICENTRAL`).
    - `/appadm/rest/*` — módulo Administrativo, usado pelo Credenciamento (variável `BASEAPIADM`).
    - `/portalfornecedor/servlet/upload` — upload de arquivos (variável `BASEAPISERVLET`).

    **Autenticação**
    - O token é obtido em `POST /appcentral/rest/auth` e enviado no header `GX-Token` nas rotas autenticadas.
    - HTTP 401 encerra a sessão no portal e redireciona para o login.

    **Arquivos**
    - Campos de arquivo (`base64`, `anexo`, `forn_credor_update_base64`) recebem o **token devolvido pelo
      servlet de upload**, e não o base64 bruto do arquivo.

    **Tenant**
    - O campo `cliente` é a sigla do cliente (ex.: `ponteselacerda`, `sinop`), sempre em minúsculas.
  version: 2.0.0
servers:
  - url: http://localhost:8080
    description: Servidor local de desenvolvimento

tags:
  - name: Autenticação
    description: Login, clientes e unidade gestora (appcentral)
  - name: Primeiro acesso e recuperação de senha
  - name: Fornecedor - Dados cadastrais
    description: Consultas dos dados do fornecedor logado (Meus Dados, Recadastramento, Regularidade Fiscal)
  - name: Recadastramento
    description: Solicitações de alteração cadastral
  - name: Pré-cadastro
    description: Fluxo público de pré-cadastro de fornecedor
  - name: Contratos
  - name: Aditivos
  - name: Assinatura digital
    description: Assinatura de anexos do contrato com certificado digital (Web PKI / REST PKI)
  - name: Nota Fiscal
    description: Apresentação de Nota Fiscal (protocolo de documentos)
  - name: Orçamento
    description: Solicitações de orçamento / cotação
  - name: Ata de Registro de Preço
  - name: Credenciamento
    description: Módulo Administrativo (appadm)
  - name: Upload
  - name: Autenticação de documento
  - name: Não utilizados pelo portal
    description: Endpoints que existiam neste documento mas que o portal web não chama hoje

paths:

  # ============================================================
  # AUTENTICAÇÃO (appcentral)
  # ============================================================

  /appcentral/rest/auth:
    post:
      summary: Login do fornecedor
      description: Autentica CPF/CNPJ e senha e devolve o token usado no header `GX-Token`.
      operationId: appCentralAuth
      tags:
        - Autenticação
      security: []
      parameters:
        - $ref: '#/components/parameters/ClientIdHeader'
        - $ref: '#/components/parameters/ChaveHeader'
        - $ref: '#/components/parameters/GxSystemNameHeader'
        - name: origem
          in: header
          required: true
          schema:
            type: string
            example: "1"
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required:
                - dbName
                - user
                - pass
              properties:
                dbName:
                  type: string
                  description: Sigla do cliente (tenant)
                  example: ponteselacerda
                user:
                  type: string
                  description: CPF/CNPJ somente dígitos
                  example: "07281368000114"
                pass:
                  type: string
                  example: "senha"
      responses:
        '200':
          description: Autenticado
          content:
            application/json:
              schema:
                type: object
                properties:
                  token:
                    type: string
                    description: Token para o header GX-Token
        '401':
          description: Usuário ou senha inválidos
          content:
            application/json:
              schema:
                type: object
                properties:
                  message:
                    type: string
                    example: Usuário ou senha inválidos

  /appcentral/rest/clientes:
    post:
      summary: Lista clientes (tenants)
      description: Usado para validar se o cliente da URL existe e para a tela de seleção de cliente. Sem corpo.
      operationId: appCentralClientes
      tags:
        - Autenticação
      security: []
      parameters:
        - $ref: '#/components/parameters/ClientIdHeader'
        - $ref: '#/components/parameters/ChaveHeader'
        - $ref: '#/components/parameters/GxSystemNameHeader'
      responses:
        '200':
          description: Lista de clientes
          content:
            application/json:
              schema:
                type: object
                properties:
                  isErro:
                    type: boolean
                  Mensagens:
                    type: array
                    items:
                      $ref: '#/components/schemas/MensagemGx'
                  SDT_Clientes_Lista:
                    type: array
                    items:
                      type: object
                      properties:
                        cliente_nome:
                          type: string
                          example: Prefeitura de Pontes e Lacerda
                        cliente_sigla_cliente:
                          type: string
                          example: ponteselacerda
                        cliente_url_api:
                          type: string

  /appcentral/rest/Ws_Unidade_Gestora_Lista:
    post:
      summary: Dados da unidade gestora
      description: Valida o cliente e carrega brasão, nome e dados da unidade gestora (login, pré-cadastro e layout).
      operationId: appCentralUnidadeGestoraLista
      tags:
        - Autenticação
      security: []
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                Sdt_Parm_Unidade_Gestora:
                  type: object
                  properties:
                    chave:
                      type: string
                    clienteID:
                      type: string
                    cliente:
                      type: string
                      example: ponteselacerda
                    ug_id:
                      type: integer
                      example: 1
      responses:
        '200':
          description: Unidades gestoras
          content:
            application/json:
              schema:
                type: object
                properties:
                  isErro:
                    type: boolean
                  Mensagens:
                    type: array
                    items:
                      $ref: '#/components/schemas/MensagemGx'
                  Sdt_Retorno_Unidade_Gestora:
                    type: array
                    items:
                      $ref: '#/components/schemas/UnidadeGestora'

  # ============================================================
  # PRIMEIRO ACESSO / RECUPERAR SENHA
  # ============================================================

  /appfornecedor/rest/ws_primeiro_recuperar_senha:
    post:
      summary: Envia código de primeiro acesso / recuperação de senha
      operationId: wsPrimeiroRecuperarSenha
      tags:
        - Primeiro acesso e recuperação de senha
      security: []
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required:
                - cliente
                - cpf_cnpj
              properties:
                cliente:
                  type: string
                  example: ponteselacerda
                cpf_cnpj:
                  type: string
                  description: Somente dígitos
                  example: "07281368000114"
      responses:
        '200':
          $ref: '#/components/responses/RetornoErroMensagem'
        '400':
          $ref: '#/components/responses/Erro400'
        '500':
          $ref: '#/components/responses/Erro500'

  /appfornecedor/rest/ws_primeiro_recuperar_auth:
    post:
      summary: Valida o código de verificação
      operationId: wsPrimeiroRecuperarAuth
      tags:
        - Primeiro acesso e recuperação de senha
      security: []
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required:
                - cliente
                - cpf_cnpj
                - cod_verificacao
              properties:
                cliente:
                  type: string
                  example: ponteselacerda
                cpf_cnpj:
                  type: string
                  example: "07281368000114"
                cod_verificacao:
                  type: string
                  example: "123456"
      responses:
        '200':
          $ref: '#/components/responses/RetornoErroMensagem'
        '400':
          $ref: '#/components/responses/Erro400'
        '500':
          $ref: '#/components/responses/Erro500'

  /appfornecedor/rest/ws_primeiro_recuperar_new:
    post:
      summary: Define a nova senha
      operationId: wsPrimeiroRecuperarNew
      tags:
        - Primeiro acesso e recuperação de senha
      security: []
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required:
                - cliente
                - cpf_cnpj
                - nova_senha
                - conf_senha
              properties:
                cliente:
                  type: string
                  example: ponteselacerda
                cpf_cnpj:
                  type: string
                  example: "07281368000114"
                nova_senha:
                  type: string
                  example: "Senha@123"
                conf_senha:
                  type: string
                  example: "Senha@123"
      responses:
        '200':
          $ref: '#/components/responses/RetornoErroMensagem'
        '400':
          $ref: '#/components/responses/Erro400'
        '500':
          $ref: '#/components/responses/Erro500'

  # ============================================================
  # FORNECEDOR - DADOS CADASTRAIS
  # ============================================================

  /appfornecedor/rest/ws_forn_credor:
    post:
      summary: Dados básicos do fornecedor logado
      operationId: wsFornCredor
      tags:
        - Fornecedor - Dados cadastrais
      description: Sem corpo. O fornecedor é identificado pelo token.
      responses:
        '200':
          description: Dados do credor
          content:
            application/json:
              schema:
                type: object
                properties:
                  SDT_in_forn_credor:
                    $ref: '#/components/schemas/FornCredor'
                  oneMessage:
                    $ref: '#/components/schemas/OneMessage'
        '401':
          $ref: '#/components/responses/Erro401'
        '500':
          $ref: '#/components/responses/Erro500'

  /appfornecedor/rest/ws_forn_endereco:
    post:
      summary: Endereço e contato do fornecedor logado
      operationId: wsFornEndereco
      tags:
        - Fornecedor - Dados cadastrais
      description: Sem corpo.
      responses:
        '200':
          description: Endereço do fornecedor
          content:
            application/json:
              schema:
                type: object
                properties:
                  sdt_in_forn_endereco:
                    $ref: '#/components/schemas/FornEndereco'
        '401':
          $ref: '#/components/responses/Erro401'
        '500':
          $ref: '#/components/responses/Erro500'

  /appfornecedor/rest/ws_forn_logradouro:
    post:
      summary: Busca logradouro por CEP
      description: Paginado. Usado no Recadastramento e no Pré-cadastro (endereço da empresa e dos sócios).
      operationId: wsFornLogradouro
      tags:
        - Fornecedor - Dados cadastrais
      security: []
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                Gx_page:
                  type: integer
                  description: Página, começando em 0
                  example: 0
                PageSize:
                  type: integer
                  example: 5
                cep_busca:
                  type: string
                  description: CEP com 8 dígitos
                  example: "78250000"
                texto:
                  type: string
                  example: ""
                cidade_busca:
                  type: integer
                  example: 0
                estado_busca:
                  type: integer
                  example: 0
                cliente:
                  type: string
                  example: ponteselacerda
      responses:
        '200':
          description: Logradouros encontrados
          content:
            application/json:
              schema:
                type: object
                properties:
                  Sdt_endereco_lista:
                    type: object
                    properties:
                      endereco:
                        type: array
                        items:
                          $ref: '#/components/schemas/Logradouro'
                      isErro:
                        type: boolean
                      isFirstPage:
                        type: boolean
                      isLastPage:
                        type: boolean
                      mensagens:
                        type: array
                        description: Ex. "Dados não encontrados" quando o CEP não existe
                        items:
                          $ref: '#/components/schemas/MensagemGx'
                      page:
                        type: string
                      pageSize:
                        type: string
                      total:
                        type: string
                      totalPage:
                        type: string
                      totalRows:
                        type: string
        '500':
          $ref: '#/components/responses/Erro500'

  /appfornecedor/rest/ws_forn_socio:
    post:
      summary: Sócios do fornecedor logado
      operationId: wsFornSocio
      tags:
        - Fornecedor - Dados cadastrais
      description: Sem corpo.
      responses:
        '200':
          description: Lista de sócios
          content:
            application/json:
              schema:
                type: object
                properties:
                  oneMessage:
                    $ref: '#/components/schemas/OneMessage'
                  response:
                    type: array
                    items:
                      $ref: '#/components/schemas/Socio'
        '401':
          $ref: '#/components/responses/Erro401'
        '500':
          $ref: '#/components/responses/Erro500'

  /appfornecedor/rest/ws_forn_representante:
    post:
      summary: Representantes do fornecedor logado
      operationId: wsFornRepresentante
      tags:
        - Fornecedor - Dados cadastrais
      description: Sem corpo.
      responses:
        '200':
          description: Lista de representantes
          content:
            application/json:
              schema:
                type: object
                properties:
                  oneMessage:
                    $ref: '#/components/schemas/OneMessage'
                  response:
                    type: array
                    items:
                      $ref: '#/components/schemas/Representante'
        '401':
          $ref: '#/components/responses/Erro401'
        '500':
          $ref: '#/components/responses/Erro500'

  /appfornecedor/rest/ws_forn_banco:
    post:
      summary: Contas bancárias do fornecedor logado
      operationId: wsFornBanco
      tags:
        - Fornecedor - Dados cadastrais
      description: Sem corpo.
      responses:
        '200':
          description: Lista de contas bancárias
          content:
            application/json:
              schema:
                type: object
                properties:
                  oneMessage:
                    $ref: '#/components/schemas/OneMessage'
                  response:
                    type: array
                    items:
                      $ref: '#/components/schemas/ContaBancaria'
        '401':
          $ref: '#/components/responses/Erro401'
        '500':
          $ref: '#/components/responses/Erro500'

  /appfornecedor/rest/ws_forn_segmento:
    post:
      summary: Segmentos do fornecedor logado
      operationId: wsFornSegmento
      tags:
        - Fornecedor - Dados cadastrais
      description: Sem corpo.
      responses:
        '200':
          description: Segmentos vinculados
          content:
            application/json:
              schema:
                type: object
                properties:
                  oneMessage:
                    $ref: '#/components/schemas/OneMessage'
                  response:
                    type: array
                    items:
                      type: object
                      properties:
                        forn_seg_id:
                          type: string
                          example: "54"
                        forn_seg_desc:
                          type: string
                          example: Informática
                        forn_seg_status:
                          type: string
                          description: A = ativo
                          example: A
                        forn_segmento_id:
                          type: string
                        forn_seg_status_UPD:
                          type: string
                          description: Status pendente de alteração (opcional)
                        forn_seg_desc_UPD:
                          type: string
                          description: Descrição pendente de alteração (opcional)
        '401':
          $ref: '#/components/responses/Erro401'
        '500':
          $ref: '#/components/responses/Erro500'

  /appfornecedor/rest/ws_segmento:
    post:
      summary: Segmentos disponíveis no cliente
      description: Usado no Recadastramento e no Pré-cadastro (PJ).
      operationId: wsSegmento
      tags:
        - Fornecedor - Dados cadastrais
      security: []
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/BodyCliente'
      responses:
        '200':
          description: Segmentos
          content:
            application/json:
              schema:
                type: object
                properties:
                  sdt_segmento:
                    type: array
                    items:
                      type: object
                      properties:
                        segmento_id:
                          type: string
                          example: "54"
                        segmento_descricao:
                          type: string
                          example: Informática
                        segmento_status:
                          type: string
                          description: Só "A" é exibido
                          example: A

  /appfornecedor/rest/ws_forn_anexos:
    post:
      summary: Certidões / anexos do fornecedor logado
      description: Sem corpo. Usado em Meus Dados, Recadastramento, Regularidade Fiscal e para pré-preencher certidões na Nota Fiscal.
      operationId: wsFornAnexos
      tags:
        - Fornecedor - Dados cadastrais
      responses:
        '200':
          description: Anexos do fornecedor
          content:
            application/json:
              schema:
                type: object
                properties:
                  oneMessage:
                    $ref: '#/components/schemas/OneMessage'
                  response:
                    type: array
                    items:
                      $ref: '#/components/schemas/AnexoFornecedor'
        '401':
          $ref: '#/components/responses/Erro401'
        '500':
          $ref: '#/components/responses/Erro500'

  /appfornecedor/rest/ws_pre_cad_doc_parm_adm:
    post:
      summary: Parâmetros dos documentos exigidos
      description: |
        Lista os tipos de documento (certidões) exigidos pelo cliente.
        Usado no Pré-cadastro (sem token), no Recadastramento, na Regularidade Fiscal e na Nota Fiscal (com `GX-Token`).
      operationId: wsPreCadDocParmAdm
      tags:
        - Fornecedor - Dados cadastrais
        - Pré-cadastro
      security:
        - GXToken: []
        - {}
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                tipo_pessoa_busca:
                  type: integer
                  description: 1 = PF, 2 = PJ
                  example: 2
                forn_credor_pessoa_tipo_emp_id_busca:
                  type: integer
                  description: Tipo de empresa (0 para PF ou para trazer todos)
                  example: 0
                cliente:
                  type: string
                  example: ponteselacerda
      responses:
        '200':
          description: Tipos de documento
          content:
            application/json:
              schema:
                type: object
                properties:
                  sdt_tipo_documento:
                    type: array
                    items:
                      $ref: '#/components/schemas/TipoDocumentoParm'

  # ============================================================
  # RECADASTRAMENTO
  # ============================================================

  /appfornecedor/rest/ws_forn_credor_upd:
    post:
      summary: Lista solicitações de alteração cadastral
      description: Sem corpo. Usado em Solicitações de Alteração, Recadastramento e Regularidade Fiscal.
      operationId: wsFornCredorUpd
      tags:
        - Recadastramento
      responses:
        '200':
          description: Solicitações
          content:
            application/json:
              schema:
                type: object
                properties:
                  oneMessage:
                    $ref: '#/components/schemas/OneMessage'
                  response:
                    type: array
                    items:
                      type: object
                      properties:
                        forn_credor_update_id:
                          type: string
                          example: "10"
                        forn_credor_update_data:
                          type: string
                          format: date-time
                          example: "2026-09-01T10:00:00"
                        forn_credor_update_tipo:
                          $ref: '#/components/schemas/TipoAtualizacaoCadastral'
                        forn_credor_update_status:
                          type: integer
                          description: 1 Pendente, 2 Deferido, 3 Cancelado, 4 Em Análise, 5 Indeferido
                          example: 1
                        forn_credor_update_ant:
                          type: string
                          description: JSON (string) com os valores anteriores
                        forn_credor_update_novo:
                          type: string
                          description: |
                            JSON (string) com os valores novos. Chaves podem vir com sufixos `_ANT`, `_NOVO`, `_UPD`
                            e os campos de modo `socios_mode`, `representante_mode`, `forn_doc_mode`, `mode` (INS, UPD, DLT).
                            Para SEGMENTOS pode ser uma lista de ids, ex. `[54,61]`.
                        forn_credor_update_obs:
                          type: string
                        forn_credor_update_just:
                          type: string
                          description: Justificativa da análise
        '401':
          $ref: '#/components/responses/Erro401'
        '500':
          $ref: '#/components/responses/Erro500'

  /appfornecedor/rest/ws_forn_credor_update_in:
    post:
      summary: Envia solicitação de alteração cadastral
      description: |
        Uma chamada por aba do Recadastramento. O conteúdo de `forn_credor_update_json` depende de `forn_credor_update_tipo`:

        | tipo | forn_credor_update_json | outros campos |
        |---|---|---|
        | DADOS_BASICOS | objeto `UpdJsonDadosBasicos` | |
        | ENDERECO_CONTATO | objeto `UpdJsonEnderecoContato` | |
        | SEGMENTOS | `""` | `segmento_id_coll` com os ids |
        | SOCIOS | array de `UpdJsonSocio` | |
        | REPRESENTANTE | array de `UpdJsonRepresentante` | |
        | DADOS_BANCARIOS | array de `UpdJsonContaBancaria` | |
        | CERTIDOES | `""` | `sdt_documentos` com os documentos |

        Em SOCIOS, REPRESENTANTE e DADOS_BANCARIOS cada item traz o modo (`socios_mode` / `mode`): INS, UPD ou DLT.
        Para UPD e DLT o item é o objeto original retornado pela consulta, com os campos alterados sobrescritos.
      operationId: wsFornCredorUpdateIn
      tags:
        - Recadastramento
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required:
                - SDT_forn_credor_update_in
                - segmento_id_coll
              properties:
                SDT_forn_credor_update_in:
                  type: object
                  required:
                    - forn_credor_update_tipo
                    - forn_credor_update_json
                    - forn_credor_update_obs
                  properties:
                    forn_credor_update_tipo:
                      $ref: '#/components/schemas/TipoAtualizacaoCadastral'
                    forn_credor_update_json:
                      type: string
                      description: JSON serializado (string) conforme o tipo, ou "" para SEGMENTOS e CERTIDOES
                    forn_credor_update_obs:
                      type: string
                      description: Justificativa (obrigatória)
                    sdt_documentos:
                      type: array
                      description: Preenchido apenas para CERTIDOES
                      items:
                        $ref: '#/components/schemas/UpdDocumentoCertidao'
                segmento_id_coll:
                  type: array
                  description: Sempre enviado; preenchido apenas para SEGMENTOS
                  items:
                    type: string
            examples:
              dadosBasicos:
                summary: DADOS_BASICOS
                value:
                  SDT_forn_credor_update_in:
                    forn_credor_update_tipo: DADOS_BASICOS
                    forn_credor_update_json: '{"forn_credor_pessoa_razao_social":"ACME LTDA","forn_cad_pes_razao":"ACME LTDA","forn_credor_pessoa_nome_fantasia":"ACME","forn_cad_pes_nome_fant":"ACME","forn_credor_pessoa_insc_estadual":"","forn_cad_cont_insc_est":"","forn_credor_pessoa_insc_municipal":"","forn_cad_cont_cod_junta":"","forn_cad_cont_data_consti":"2020-01-31","forn_cad_cont_cap_social":"10000.0000","forn_credor_pessoa_optante_simples":true,"forn_credor_pessoa_tipo_emp_id":2,"forn_credor_pessoa_enquadramento":1}'
                    forn_credor_update_obs: Atualização da razão social
                    sdt_documentos: []
                  segmento_id_coll: []
              segmentos:
                summary: SEGMENTOS
                value:
                  SDT_forn_credor_update_in:
                    forn_credor_update_tipo: SEGMENTOS
                    forn_credor_update_json: ""
                    forn_credor_update_obs: Inclusão de segmento
                    sdt_documentos: []
                  segmento_id_coll:
                    - "54"
                    - "61"
              certidoes:
                summary: CERTIDOES
                value:
                  SDT_forn_credor_update_in:
                    forn_credor_update_tipo: CERTIDOES
                    forn_credor_update_json: ""
                    forn_credor_update_obs: Atualização de certidões
                    sdt_documentos:
                      - forn_credor_doc_tipo_doc_id: 5
                        forn_credor_doc_validade: "31/12/2026"
                        forn_credor_doc_emissao: "01/01/2026"
                        forn_credor_doc_cod_aut: "ABC123"
                        forn_credor_update_base64: "<token do upload>"
                  segmento_id_coll: []
      responses:
        '200':
          description: Resultado. `oneMessage.Type` diferente de 0 indica erro, com o texto em `Description`.
          content:
            application/json:
              schema:
                type: object
                properties:
                  oneMessage:
                    $ref: '#/components/schemas/OneMessage'
        '401':
          $ref: '#/components/responses/Erro401'
        '500':
          $ref: '#/components/responses/Erro500'

  # ============================================================
  # PRÉ-CADASTRO
  # ============================================================

  /appfornecedor/rest/ws_pre_cad_login:
    post:
      summary: Inicia o pré-cadastro / envia código de verificação
      description: Também usado para reenviar o código.
      operationId: wsPreCadLogin
      tags:
        - Pré-cadastro
      security: []
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required:
                - cliente
                - cpf_cnpj
                - email
              properties:
                cliente:
                  type: string
                  example: ponteselacerda
                cpf_cnpj:
                  type: string
                  description: CPF ou CNPJ (o portal envia com máscara)
                  example: "123.456.789-09"
                email:
                  type: string
                  example: fornecedor@exemplo.com
      responses:
        '200':
          description: Código enviado
          content:
            application/json:
              schema:
                allOf:
                  - $ref: '#/components/schemas/RetornoIsErro'
                  - type: object
                    properties:
                      cod_verif_tipo:
                        $ref: '#/components/schemas/CodVerifTipo'
                      usuario_token:
                        type: string
                        description: Token GX (opcional)

  /appfornecedor/rest/ws_pre_cad_login_auth:
    post:
      summary: Valida o código de verificação do pré-cadastro
      operationId: wsPreCadLoginAuth
      tags:
        - Pré-cadastro
      security: []
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required:
                - cliente
                - cod_verificacao
                - cod_verif_tipo
                - pre_cad_forn_id
              properties:
                cliente:
                  type: string
                  example: ponteselacerda
                cod_verificacao:
                  type: string
                  example: "1234"
                cod_verif_tipo:
                  $ref: '#/components/schemas/CodVerifTipo'
                pre_cad_forn_id:
                  type: integer
                  example: 1668
                recusada:
                  type: boolean
                  description: Enviado apenas quando cod_verif_tipo = PRE_CAD_RECUSA_REABRE (true ao confirmar "Corrigir dados")
      responses:
        '200':
          description: Código válido
          content:
            application/json:
              schema:
                allOf:
                  - $ref: '#/components/schemas/RetornoIsErro'
                  - type: object
                    properties:
                      usuario_token:
                        type: string
                      sdt_pre_cadastro_forn:
                        $ref: '#/components/schemas/SdtPreCadastroForn'

  /appfornecedor/rest/ws_pre_cadastro_forn_view:
    post:
      summary: Consulta o pré-cadastro pelo CPF/CNPJ
      operationId: wsPreCadastroFornView
      tags:
        - Pré-cadastro
      security: []
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required:
                - pre_cad_forn_cpf_cnpj_busca
                - cliente
              properties:
                pre_cad_forn_cpf_cnpj_busca:
                  type: string
                  description: Somente dígitos (11 ou 14)
                  example: "71729472079"
                cliente:
                  type: string
                  example: ponteselacerda
      responses:
        '200':
          description: Pré-cadastro encontrado. Quando não existe, vem isErro = true com "CPF/CNPJ não encontrado".
          content:
            application/json:
              schema:
                allOf:
                  - $ref: '#/components/schemas/RetornoIsErro'
                  - type: object
                    properties:
                      sdt_pre_cadastro_forn:
                        $ref: '#/components/schemas/SdtPreCadastroForn'

  /appfornecedor/rest/ws_pre_cadastro_forn_add:
    post:
      summary: Grava uma fase do pré-cadastro
      description: |
        Fases por tipo de pessoa:
        - **PF (1):** 1 dados básicos, 2 dados bancários, 3 documentos, 4 revisão.
        - **PJ (2):** 1 dados básicos, 2 endereço/contato, 3 dados complementares, 4 documentos, 5 revisão.

        `entrada` é sempre o conjunto **acumulado**: o conteúdo salvo em `pre_cad_forn_dados` mais as seções de todas
        as fases já preenchidas (não só a fase atual). Na fase de documentos de um fluxo de correção de recusa,
        `entrada` vai vazio (`{}`).
      operationId: wsPreCadastroFornAdd
      tags:
        - Pré-cadastro
      security: []
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required:
                - fase_atual
                - pre_cad_forn_id
                - pre_cad_forn_tipo_pessoa
                - cliente
                - entrada
              properties:
                fase_atual:
                  type: integer
                  example: 1
                pre_cad_forn_id:
                  type: integer
                  example: 1668
                pre_cad_forn_tipo_pessoa:
                  type: integer
                  description: 1 = PF, 2 = PJ
                  example: 2
                cad_id:
                  type: integer
                  description: Opcional; enviado quando o pré-cadastro já tem cad_id
                cliente:
                  type: string
                  example: ponteselacerda
                entrada:
                  $ref: '#/components/schemas/PreCadFornDados'
      responses:
        '200':
          description: Fase gravada
          content:
            application/json:
              schema:
                allOf:
                  - $ref: '#/components/schemas/RetornoIsErro'
                  - type: object
                    properties:
                      sdt_pre_cadastro_forn:
                        $ref: '#/components/schemas/SdtPreCadastroForn'

  /appfornecedor/rest/ws_pre_cad_doc_grava:
    post:
      summary: Grava documento do pré-cadastro
      description: Uma chamada por documento. Para atualizar só os dados de um arquivo já enviado, `anexo` vai vazio.
      operationId: wsPreCadDocGrava
      tags:
        - Pré-cadastro
      security: []
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required:
                - cliente
                - pre_cad_forn_id
                - tipo_doc_id
                - anexo
              properties:
                cliente:
                  type: string
                  example: ponteselacerda
                pre_cad_forn_id:
                  type: integer
                  example: 1668
                tipo_doc_id:
                  type: integer
                  example: 7
                tipo_doc_descricao:
                  type: string
                  example: CERTIDAO TRABALHISTA
                anexo:
                  type: string
                  description: Token do upload, ou "" para atualizar apenas os dados
                doc_validade:
                  type: string
                  description: dd/MM/yyyy, ou "" quando o tipo não exige validade
                  example: "31/12/2026"
                doc_emissao:
                  type: string
                  description: dd/MM/yyyy ou ""
                  example: "01/01/2026"
                doc_cod_aut:
                  type: string
                  description: Até 50 caracteres, ou ""
                  example: "ABC123"
      responses:
        '200':
          description: Documento gravado
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/RetornoIsErro'

  /appfornecedor/rest/ws_pre_cad_doc_view:
    post:
      summary: Lista documentos do pré-cadastro
      operationId: wsPreCadDocView
      tags:
        - Pré-cadastro
      security: []
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required:
                - cliente
                - pre_cad_forn_id
              properties:
                cliente:
                  type: string
                  example: ponteselacerda
                pre_cad_forn_id:
                  type: integer
                  example: 1668
      responses:
        '200':
          description: Documentos anexados
          content:
            application/json:
              schema:
                type: object
                properties:
                  response:
                    type: array
                    items:
                      type: object
                      properties:
                        anexos_fornecedor_id:
                          type: integer
                          example: 999
                        anexo_fornecedor_tipo_doc_id:
                          type: integer
                          example: 7
                        anexos_fornecedor_nome:
                          type: string
                          example: arquivo.pdf
                        anexos_fornecedor_caminho:
                          type: string
                        anexos_url:
                          type: string
                        anexo_fornecedor_cod_aut:
                          type: string
                        anexo_fornecedor_emissao:
                          type: string
                          description: yyyy-MM-dd ("0000-00-00" = vazio)
                        anexo_fornecedor_validade:
                          type: string
                          description: yyyy-MM-dd ("0000-00-00" = vazio)

  /appfornecedor/rest/ws_pre_cad_delete:
    post:
      summary: Exclui anexo do pré-cadastro
      operationId: wsPreCadDelete
      tags:
        - Pré-cadastro
      security: []
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required:
                - cliente
                - anexos_fornecedor_id
              properties:
                cliente:
                  type: string
                  example: ponteselacerda
                anexos_fornecedor_id:
                  type: integer
                  example: 999
      responses:
        '200':
          description: Anexo excluído
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/RetornoIsErro'

  /appfornecedor/rest/ws_bancos:
    post:
      summary: Lista bancos
      operationId: wsBancos
      tags:
        - Pré-cadastro
      security: []
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/BodyCliente'
      responses:
        '200':
          description: Bancos
          content:
            application/json:
              schema:
                type: object
                properties:
                  response:
                    type: array
                    items:
                      type: object
                      properties:
                        banco_id:
                          type: integer
                          example: 1
                        banco_numero:
                          type: string
                          example: "001"
                        banco_descricao:
                          type: string
                          example: BANCO DO BRASIL

  # ============================================================
  # CONTRATOS
  # ============================================================

  /appfornecedor/rest/ws_contrato_consulta:
    post:
      summary: Lista contratos do fornecedor
      description: O portal envia os filtros zerados e filtra em memória.
      operationId: wsContratoConsulta
      tags:
        - Contratos
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                contrato_num_busca:
                  type: integer
                  example: 0
                contrato_ano_busca:
                  type: integer
                  example: 0
                contrato_vig_ini_busca:
                  type: string
                  example: ""
                contrato_vig_fim_busca:
                  type: string
                  example: ""
                contrato_objetivo_busca:
                  type: string
                  example: ""
                contrato_data_publicacao_busca:
                  type: string
                  example: ""
                contrato_situacao_busca:
                  type: integer
                  description: 0 todos, 1 Em Execução, 2 Cancelado, 3 Concluído, 4 Paralisado, 5 Indisponível
                  example: 0
      responses:
        '200':
          description: Contratos
          content:
            application/json:
              schema:
                allOf:
                  - $ref: '#/components/schemas/RetornoPadrao'
                  - type: object
                    properties:
                      response:
                        type: array
                        items:
                          $ref: '#/components/schemas/Contrato'
        '401':
          $ref: '#/components/responses/Erro401'
        '500':
          $ref: '#/components/responses/Erro500'

  /appfornecedor/rest/ws_contrato_item_consulta:
    post:
      summary: Itens do contrato
      operationId: wsContratoItemConsulta
      tags:
        - Contratos
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/BodyContratoIdBusca'
      responses:
        '200':
          description: Itens
          content:
            application/json:
              schema:
                allOf:
                  - $ref: '#/components/schemas/RetornoPadrao'
                  - type: object
                    properties:
                      response:
                        type: array
                        items:
                          type: object
                          properties:
                            contrato_prod_cod:
                              type: string
                            contrato_prod_desc:
                              type: string
                            contrato_item_orgao_cod:
                              type: string
                            contrato_item_unidade_cod:
                              type: string
                            contrato_item_setor_cod:
                              type: string
                            contrato_item_qtd:
                              type: string
                              example: "10.0000"
                            contrato_item_qtd_aditada:
                              type: string
                            contrato_item_qtd_suprimida:
                              type: string
                            contrato_item_valor:
                              type: string
                              example: "5.00"
                            contrato_item_total:
                              type: string
                              example: "50.00"
        '401':
          $ref: '#/components/responses/Erro401'
        '500':
          $ref: '#/components/responses/Erro500'

  /appfornecedor/rest/ws_nad_consulta:
    post:
      summary: NADs (empenhos) do contrato
      operationId: wsNadConsulta
      tags:
        - Contratos
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/BodyContratoIdBusca'
      responses:
        '200':
          description: NADs com ordens de consumo
          content:
            application/json:
              schema:
                allOf:
                  - $ref: '#/components/schemas/RetornoPadrao'
                  - type: object
                    properties:
                      response:
                        type: array
                        items:
                          type: object
                          properties:
                            nad_id:
                              type: integer
                              example: 78776
                            nad_numero_ano:
                              type: string
                              example: "12559/2025"
                            nad_data:
                              type: string
                              format: date
                            nad_tipo:
                              type: integer
                              description: 5 = Contrato
                            nad_fixacao_despesa_exe_cod_red:
                              type: string
                            nad_orgao_adm_cod:
                              type: string
                            nad_unidade_adm_cod:
                              type: string
                            nad_setor_cod:
                              type: string
                            nad_empenho_num_ano:
                              type: string
                              example: "18343/2025"
                            nad_prazo_entrega:
                              type: string
                              format: date
                            sdt_ordem_consumo:
                              type: array
                              items:
                                type: object
                                properties:
                                  ordem_consumo_num_ano:
                                    type: string
                                    example: "27730/2025"
                                  ordem_consumo_data:
                                    type: string
                                    format: date
                                  ordem_consumo_status:
                                    type: integer
                                  ordem_consumo_valor:
                                    type: string
                                    example: "230587.94"
        '401':
          $ref: '#/components/responses/Erro401'
        '500':
          $ref: '#/components/responses/Erro500'

  /appfornecedor/rest/ws_contrato_anexo_lista:
    post:
      summary: Anexos do contrato
      description: Retorna duas listas na raiz, sem o campo `response`.
      operationId: wsContratoAnexoLista
      tags:
        - Contratos
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/BodyContratoIdBusca'
      responses:
        '200':
          description: Anexos da administração e do fornecedor
          content:
            application/json:
              schema:
                allOf:
                  - $ref: '#/components/schemas/RetornoPadrao'
                  - type: object
                    properties:
                      anexo_adm:
                        type: array
                        description: Documentos da administração (download / assinatura)
                        items:
                          type: object
                          properties:
                            contrato_anexo_id:
                              type: integer
                              example: 9605
                            contrato_anexo_nome:
                              type: string
                              example: CONTRATO_089_2022.pdf
                            contrato_anexo_data:
                              type: string
                              format: date
                            contrato_anexo_link:
                              type: string
                            contrato_anexo_caminho:
                              type: string
                              description: Caminho no servidor; quando preenchido a assinatura usa o fluxo batch
                      anexo_portal:
                        type: array
                        description: Arquivos enviados pelo fornecedor
                        items:
                          type: object
                          properties:
                            anexos_fornecedor_id:
                              type: integer
                              example: 77
                            anexos_fornecedor_nome:
                              type: string
                            anexos_fornecedor_data:
                              type: string
                              format: date
                            anexos_fornecedor_link:
                              type: string
                            contrato_anexo_id:
                              type: string
                              description: Diferente de "0" indica documento assinado (vinculado a um anexo da administração)
        '401':
          $ref: '#/components/responses/Erro401'
        '500':
          $ref: '#/components/responses/Erro500'

  /appfornecedor/rest/ws_contrato_anexo_grava:
    post:
      summary: Grava anexo do fornecedor no contrato
      operationId: wsContratoAnexoGrava
      tags:
        - Contratos
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required:
                - anexo
                - contrato_id
              properties:
                anexo:
                  type: string
                  description: Token devolvido pelo servlet de upload
                contrato_id:
                  type: integer
                  example: 123
      responses:
        '200':
          description: Anexo gravado
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/RetornoPadrao'
        '401':
          $ref: '#/components/responses/Erro401'
        '500':
          $ref: '#/components/responses/Erro500'

  /appfornecedor/rest/ws_contrato_anexo_delete:
    post:
      summary: Exclui anexo do fornecedor no contrato
      operationId: wsContratoAnexoDelete
      tags:
        - Contratos
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required:
                - anexos_fornecedor_id
              properties:
                anexos_fornecedor_id:
                  type: integer
                  example: 77
      responses:
        '200':
          description: Anexo excluído
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/RetornoPadrao'
        '401':
          $ref: '#/components/responses/Erro401'
        '500':
          $ref: '#/components/responses/Erro500'

  # ============================================================
  # ADITIVOS
  # ============================================================

  /appfornecedor/rest/ws_contrato_aditivo:
    post:
      summary: Lista aditivos
      description: Usado na lista de aditivos e no detalhe (com os números do aditivo selecionado).
      operationId: wsContratoAditivo
      tags:
        - Aditivos
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                contrato_num:
                  type: integer
                  description: 0 = sem filtro
                  example: 159
                contrato_ano:
                  type: integer
                  example: 2017
                contrato_aditivo_num:
                  type: integer
                  example: 1
                contrato_aditivo_ano:
                  type: integer
                  example: 2024
                contrato_tipo:
                  type: integer
                  example: 0
                contrato_situacao:
                  type: integer
                  description: 0 todos, 1 a 5 conforme situação do contrato
                  example: 0
      responses:
        '200':
          description: Aditivos
          content:
            application/json:
              schema:
                allOf:
                  - $ref: '#/components/schemas/RetornoPadrao'
                  - type: object
                    properties:
                      response:
                        type: array
                        items:
                          $ref: '#/components/schemas/Aditivo'
        '401':
          $ref: '#/components/responses/Erro401'
        '500':
          $ref: '#/components/responses/Erro500'

  /appfornecedor/rest/ws_contrato_aditivo_item:
    post:
      summary: Itens do aditivo e resumo do contrato principal
      operationId: wsContratoAditivoItem
      tags:
        - Aditivos
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required:
                - contrato_aditivo_id
              properties:
                contrato_aditivo_id:
                  type: integer
                  example: 55
      responses:
        '200':
          description: Itens do aditivo
          content:
            application/json:
              schema:
                type: object
                properties:
                  response:
                    type: array
                    items:
                      type: object
                      properties:
                        contrato_aditivo_item_id:
                          type: integer
                          example: 900
                        contrato_adt_item_prod_cod:
                          type: string
                        contrato_adt_item_prod_desc:
                          type: string
                        contrato_adt_item_setor_id:
                          type: string
                        contrato_adt_item_un_med:
                          type: string
                          example: UN
                        contrato_adt_item_qtd:
                          type: string
                        contrato_adt_item_qtd_sol:
                          type: string
                        contrato_adt_item_valor:
                          type: string
                        contrato_adt_item_valor_sol:
                          type: string
                        contrato_adt_item_total:
                          type: string
                        contrato_adt_item_total_sol:
                          type: string
                        contrato_adt_item_vlr_dif:
                          type: string
                        contrato_id:
                          type: integer
                        contrato_num:
                          type: string
                        contrato_ano:
                          type: integer
                        contrato_num_ano:
                          type: string
                        contrato_objetivo:
                          type: string
                        contrato_valor:
                          type: string
                        contrato_controle_saldo:
                          type: integer
                          description: 1 Quantidade, 2 Valor
                        contrato_uso_continuo:
                          type: boolean
                        existe_anexo:
                          type: boolean
                        contrato_fornecedor_nome:
                          type: string
        '401':
          $ref: '#/components/responses/Erro401'
        '500':
          $ref: '#/components/responses/Erro500'

  # ============================================================
  # ASSINATURA DIGITAL
  # ============================================================

  /appfornecedor/rest/ws_contrato_anexo_assinatura_start:
    post:
      summary: Inicia assinatura de anexo da administração
      description: Fluxo usado quando o anexo não tem `contrato_anexo_caminho`. Devolve o token do REST PKI.
      operationId: wsContratoAnexoAssinaturaStart
      tags:
        - Assinatura digital
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required:
                - contrato_id
                - anexo_id
                - anexo_url
                - certificate_thumbprint
              properties:
                contrato_id:
                  type: integer
                  example: 123
                anexo_id:
                  type: string
                  description: contrato_anexo_id (enviado como string)
                  example: "9605"
                anexo_url:
                  type: string
                certificate_thumbprint:
                  type: string
                certificate_cpf:
                  type: string
                  description: Opcional; CPF do certificado (somente dígitos)
      responses:
        '200':
          description: Token de assinatura
          content:
            application/json:
              schema:
                allOf:
                  - $ref: '#/components/schemas/RetornoPadrao'
                  - $ref: '#/components/schemas/RetornoTokenAssinatura'
        '401':
          $ref: '#/components/responses/Erro401'
        '500':
          $ref: '#/components/responses/Erro500'

  /appfornecedor/rest/ws_contrato_anexo_assinatura_complete:
    post:
      summary: Conclui assinatura de anexo da administração
      operationId: wsContratoAnexoAssinaturaComplete
      tags:
        - Assinatura digital
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required:
                - contrato_id
                - anexo_id
                - token
                - certificate_thumbprint
              properties:
                contrato_id:
                  type: integer
                  example: 123
                anexo_id:
                  type: string
                  example: "9605"
                token:
                  type: string
                certificate_thumbprint:
                  type: string
                certificate_cpf:
                  type: string
      responses:
        '200':
          description: Assinatura concluída
          content:
            application/json:
              schema:
                allOf:
                  - $ref: '#/components/schemas/RetornoPadrao'
                  - type: object
                    properties:
                      signed_path:
                        type: string
                        description: Link do documento assinado (opcional)
        '401':
          $ref: '#/components/responses/Erro401'
        '500':
          $ref: '#/components/responses/Erro500'

  /appfornecedor/rest/ws_forn_batch_start:
    post:
      summary: Inicia assinatura em lote (batch)
      description: Fluxo usado quando o anexo tem `contrato_anexo_caminho` e o certificado tem CPF.
      operationId: wsFornBatchStart
      tags:
        - Assinatura digital
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required:
                - caminho_arquivo
                - cpf
              properties:
                caminho_arquivo:
                  type: string
                  description: contrato_anexo_caminho do anexo
                cpf:
                  type: string
                  description: CPF do certificado (somente dígitos)
                  example: "12345678901"
      responses:
        '200':
          description: Token de assinatura
          content:
            application/json:
              schema:
                allOf:
                  - $ref: '#/components/schemas/RetornoPadrao'
                  - $ref: '#/components/schemas/RetornoTokenAssinatura'
        '401':
          $ref: '#/components/responses/Erro401'
        '500':
          $ref: '#/components/responses/Erro500'

  /appfornecedor/rest/ws_forn_batch_complete:
    post:
      summary: Conclui assinatura em lote (batch)
      operationId: wsFornBatchComplete
      tags:
        - Assinatura digital
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required:
                - token
                - contrato_id
                - anexo_id
                - cpf
              properties:
                token:
                  type: string
                contrato_id:
                  type: integer
                  example: 123
                anexo_id:
                  type: string
                  example: "9605"
                cpf:
                  type: string
                  example: "12345678901"
      responses:
        '200':
          description: Assinatura concluída
          content:
            application/json:
              schema:
                allOf:
                  - $ref: '#/components/schemas/RetornoPadrao'
                  - type: object
                    properties:
                      signed_path:
                        type: string
                        description: Link do documento assinado (opcional)
        '401':
          $ref: '#/components/responses/Erro401'
        '500':
          $ref: '#/components/responses/Erro500'

  # ============================================================
  # NOTA FISCAL (PROTOCOLO)
  # ============================================================

  /appfornecedor/rest/ws_documentos_protocolo_lista:
    post:
      summary: Lista notas fiscais apresentadas (protocolos)
      description: |
        Paginado. Os anexos de cada protocolo vêm em `sdt_anexo_protocolo`; o reenvio baixa cada arquivo
        com `GET` direto em `anexo_link` (com header GX-Token).
      operationId: wsDocumentosProtocoloLista
      tags:
        - Nota Fiscal
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                Gx_page:
                  type: integer
                  description: Página, começando em 1
                  example: 1
                PageSize:
                  type: integer
                  example: 10
                ano_busca:
                  type: integer
                  description: 0 = sem filtro
                  example: 0
                processo_numero_busca:
                  type: integer
                  example: 0
                processo_situacao_busca:
                  $ref: '#/components/schemas/SituacaoProtocolo'
                processo_desc_busca:
                  type: string
                  example: ""
      responses:
        '200':
          description: Protocolos
          content:
            application/json:
              schema:
                type: object
                properties:
                  sdt_processo_lista:
                    type: object
                    properties:
                      totalPage:
                        type: integer
                        example: 3
                      processo:
                        type: array
                        items:
                          $ref: '#/components/schemas/ProcessoProtocolo'
        '401':
          $ref: '#/components/responses/Erro401'
        '500':
          $ref: '#/components/responses/Erro500'

  /appfornecedor/rest/ws_protocolo_empenho:
    post:
      summary: Empenhos (NADs) disponíveis para vincular à nota fiscal
      description: Corpo vazio (`{}`). Saldo disponível = nad_valor - valor_notas_enviadas.
      operationId: wsProtocoloEmpenho
      tags:
        - Nota Fiscal
      requestBody:
        required: false
        content:
          application/json:
            schema:
              type: object
              example: {}
      responses:
        '200':
          description: Empenhos
          content:
            application/json:
              schema:
                type: object
                properties:
                  response:
                    type: array
                    items:
                      type: object
                      properties:
                        nad_id:
                          type: integer
                          example: 817
                        nad_ano:
                          type: integer
                          example: 2025
                        nad_numero:
                          type: string
                          example: "817"
                        nad_empenho_num_ano:
                          type: string
                          example: "1340/2025"
                        nad_valor:
                          type: string
                          example: "15000.00"
                        valor_notas_enviadas:
                          type: string
                          example: "2000.00"
                        nad_fixacao_despesa_exe_or_cod:
                          type: string
                          description: Código do órgão / secretaria
                          example: "03"
                        nad_fixacao_despesa_exe_or_dsc:
                          type: string
                          description: Descrição do órgão / secretaria
                          example: SECRETARIA MUNICIPAL DE ADMINISTRAÇÃO
        '401':
          $ref: '#/components/responses/Erro401'
        '500':
          $ref: '#/components/responses/Erro500'

  /appfornecedor/rest/ws_protocolo_add:
    post:
      summary: Protocola (ou reenvia) nota fiscal
      description: |
        - **Nova apresentação:** `Gx_mode = "INS"`, `processo_doc_forn_id = 0` e `anexos_fornecedor_id = 0` em todos os itens.
        - **Reenvio (nota devolvida):** `Gx_mode = "UPD"`, `processo_doc_forn_id` do protocolo devolvido e
          `anexos_fornecedor_id` de cada anexo original (0 quando não encontrado).

        `sdt_doc_fiscal` tem 1 item quando o documento importado é PDF, ou 2 itens quando é XML
        (primeiro o PDF, depois o XML). Os itens repetem os mesmos dados da nota; só mudam `anexos_fornecedor_id` e `base64`.

        Todos os arquivos (inclusive no reenvio) passam antes pelo servlet de upload; `base64` recebe o token devolvido.
      operationId: wsProtocoloAdd
      tags:
        - Nota Fiscal
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required:
                - processo_doc_forn_id
                - processo_desc
                - nad_id
                - tipo_doc_liquid
                - Gx_mode
                - tipo_doc_liquid_desc
                - sdt_doc_emissao_validade
                - sdt_doc_fiscal
              properties:
                processo_doc_forn_id:
                  type: integer
                  description: 0 na inclusão; id do protocolo no reenvio
                  example: 0
                processo_desc:
                  type: string
                  description: Descrição do processo (em maiúsculas)
                  example: FORNECIMENTO DE MATERIAL DE EXPEDIENTE
                nad_id:
                  type: integer
                  example: 817
                tipo_doc_liquid:
                  $ref: '#/components/schemas/TipoDocLiquid'
                Gx_mode:
                  type: string
                  enum:
                    - INS
                    - UPD
                  example: INS
                tipo_doc_liquid_desc:
                  type: string
                  example: Nota Fiscal de Serviço Eletrônica
                sdt_doc_emissao_validade:
                  type: array
                  description: Certidões (obrigatórias, ou opcionais totalmente preenchidas)
                  items:
                    type: object
                    properties:
                      anexos_fornecedor_id:
                        type: integer
                        description: 0 na inclusão; id do anexo original no reenvio
                        example: 0
                      base64:
                        type: string
                        description: Token do upload
                      numero:
                        type: string
                        example: "12345"
                      emissao:
                        type: string
                        description: dd/MM/yyyy ou ""
                        example: "01/01/2026"
                      validade:
                        type: string
                        description: dd/MM/yyyy ou ""
                        example: "31/12/2026"
                      tipo_doc_id:
                        type: integer
                        description: tipo_doc_id de ws_pre_cad_doc_parm_adm
                        example: 7
                sdt_doc_fiscal:
                  type: array
                  minItems: 1
                  maxItems: 2
                  items:
                    type: object
                    properties:
                      anexos_fornecedor_id:
                        type: integer
                        example: 0
                      chave_nfe:
                        type: string
                        description: Somente dígitos; preenchida só para NFS-e (5) e NF-e (11)
                        example: "35260312345678000199550010000001231000001234"
                      numero:
                        type: string
                        example: "123"
                      serie:
                        type: string
                        description: Opcional para NFS-e e Recibo
                        example: "1"
                      valor:
                        type: number
                        format: double
                        example: 1000.5
                      data:
                        type: string
                        description: Data de emissão dd/MM/yyyy
                        example: "10/03/2026"
                      base64:
                        type: string
                        description: Token do upload do PDF ou do XML
            examples:
              inclusaoXml:
                summary: Nova apresentação com XML (PDF + XML)
                value:
                  processo_doc_forn_id: 0
                  processo_desc: FORNECIMENTO DE MATERIAL DE EXPEDIENTE
                  nad_id: 817
                  tipo_doc_liquid: 11
                  Gx_mode: INS
                  tipo_doc_liquid_desc: Nota Fiscal Eletrônica de ICMS
                  sdt_doc_emissao_validade:
                    - anexos_fornecedor_id: 0
                      base64: "<token do upload>"
                      numero: "12345"
                      emissao: "01/01/2026"
                      validade: "31/12/2026"
                      tipo_doc_id: 7
                  sdt_doc_fiscal:
                    - anexos_fornecedor_id: 0
                      chave_nfe: "35260312345678000199550010000001231000001234"
                      numero: "123"
                      serie: "1"
                      valor: 1000.5
                      data: "10/03/2026"
                      base64: "<token do upload do PDF>"
                    - anexos_fornecedor_id: 0
                      chave_nfe: "35260312345678000199550010000001231000001234"
                      numero: "123"
                      serie: "1"
                      valor: 1000.5
                      data: "10/03/2026"
                      base64: "<token do upload do XML>"
              reenvioPdf:
                summary: Reenvio de nota devolvida (PDF)
                value:
                  processo_doc_forn_id: 123
                  processo_desc: FORNECIMENTO DE MATERIAL DE EXPEDIENTE
                  nad_id: 817
                  tipo_doc_liquid: 5
                  Gx_mode: UPD
                  tipo_doc_liquid_desc: Nota Fiscal de Serviço Eletrônica
                  sdt_doc_emissao_validade:
                    - anexos_fornecedor_id: 55
                      base64: "<token do upload>"
                      numero: "12345"
                      emissao: "01/01/2026"
                      validade: "31/12/2026"
                      tipo_doc_id: 7
                  sdt_doc_fiscal:
                    - anexos_fornecedor_id: 56
                      chave_nfe: ""
                      numero: "123"
                      serie: ""
                      valor: 1000.5
                      data: "10/03/2026"
                      base64: "<token do upload do PDF>"
      responses:
        '200':
          description: Protocolado. O portal considera erro quando `isErro = true`, `sucesso = false` ou `status_code >= 400`.
          content:
            application/json:
              schema:
                type: object
                properties:
                  isErro:
                    type: boolean
                  sucesso:
                    type: boolean
                  status_code:
                    type: string
                    example: "200"
                  mensagem:
                    type: string
                  message:
                    type: string
                  response:
                    type: object
        '401':
          $ref: '#/components/responses/Erro401'
        '500':
          $ref: '#/components/responses/Erro500'

  # ============================================================
  # ORÇAMENTO / COTAÇÃO
  # ============================================================

  /appfornecedor/rest/ws_orcamento_lista:
    post:
      summary: Lista solicitações de orçamento
      description: O portal envia os filtros zerados e filtra em memória.
      operationId: wsOrcamentoLista
      tags:
        - Orçamento
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                cotacao_num_busca:
                  type: integer
                  example: 0
                cotacao_ano_busca:
                  type: integer
                  example: 0
                cotacao_data_de:
                  type: string
                  example: ""
                cotacao_data_ate:
                  type: string
                  example: ""
                cotacao_status_busca:
                  type: integer
                  example: 0
                processo_compra_descricao_busca:
                  type: string
                  example: ""
      responses:
        '200':
          description: Cotações
          content:
            application/json:
              schema:
                type: object
                properties:
                  response:
                    type: array
                    items:
                      type: object
                      properties:
                        cotacao_id:
                          type: integer
                          example: 3585
                        cotacao_num:
                          type: integer
                          example: 12
                        cotacao_ano:
                          type: integer
                          example: 2026
                        cotacao_status:
                          type: integer
                        cotacao_valor:
                          type: string
                          description: Maior que 0 indica cotação já respondida
                          example: "0.00"
                        cotacao_data:
                          type: string
                          format: date
                        cotacao_tipo:
                          type: integer
                          description: 1 Produtos e Serviços, 2 Obras e Serviços de Engenharia
                        processo_compra_num:
                          type: integer
                        processo_compra_ano:
                          type: integer
                        processo_compra_descricao:
                          type: string
                        processo_compra_natureza:
                          type: integer
                          description: 0 Nenhum, 1 Diária/Adiantamento, 2 Compra Direta, 3 Registro de Preços, 4 Licitação, 5 Adesão à ARP
                        processo_compra_data:
                          type: string
                          format: date
        '401':
          $ref: '#/components/responses/Erro401'
        '500':
          $ref: '#/components/responses/Erro500'

  /appfornecedor/rest/ws_cotacao_view:
    post:
      summary: Detalhe da cotação com os itens
      operationId: wsCotacaoView
      tags:
        - Orçamento
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required:
                - cotacao_id_busca
              properties:
                cotacao_id_busca:
                  type: integer
                  example: 3585
      responses:
        '200':
          description: Itens da cotação
          content:
            application/json:
              schema:
                type: object
                properties:
                  cotacao_licita:
                    type: string
                    description: '"S" = licitação (sem desconto)'
                    example: N
                  sdt_item_cotacao:
                    type: array
                    items:
                      type: object
                      properties:
                        cotacao_item_id:
                          type: integer
                          example: 190623
                        processo_compra_item_seq:
                          type: integer
                          example: 1
                        produto_servico_descricao:
                          type: string
                          example: Papel A4
                        unidade_medida_descricao:
                          type: string
                          example: RESMA
                        unidade_forn_descricao:
                          type: string
                        Quantidade:
                          type: string
                          example: "10.0000"
                        valor:
                          type: string
                          example: "0.0000"
                        Total:
                          type: string
                          example: "0.0000"
                        ValorDesconto:
                          type: string
                          example: "0"
        '401':
          $ref: '#/components/responses/Erro401'
        '500':
          $ref: '#/components/responses/Erro500'

  /appfornecedor/rest/ws_cotacao_add:
    post:
      summary: Envia proposta da cotação
      description: |
        Um item por item da cotação. Só um de `valor` (lançamento unitário) ou `total` (lançamento pelo total) vem preenchido.
        O portal considera sucesso qualquer HTTP 2xx e não lê o corpo da resposta.
      operationId: wsCotacaoAdd
      tags:
        - Orçamento
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required:
                - cotacao_id_busca
                - sdt_cotacao_add
              properties:
                cotacao_id_busca:
                  type: integer
                  example: 3585
                base64:
                  type: string
                  description: Token do upload do anexo, ou "" sem anexo
                cotacao_anexo_data:
                  type: string
                  description: yyyy-MM-dd ou ""
                  example: "2026-04-16"
                cotacao_anexo_desc:
                  type: string
                  example: Proposta comercial
                sdt_cotacao_add:
                  type: array
                  items:
                    type: object
                    properties:
                      cotacao_item_id:
                        type: integer
                        example: 190623
                      valor:
                        type: number
                        format: double
                        description: Valor unitário (lançamento unitário), senão 0
                        example: 100.0
                      valorDesconto:
                        type: number
                        format: double
                        description: Percentual de desconto; 0 quando cotacao_licita = "S"
                        example: 20
                      total:
                        type: number
                        format: double
                        description: Valor total (lançamento pelo total), senão 0
                        example: 0
      responses:
        '200':
          description: Proposta enviada
        '401':
          $ref: '#/components/responses/Erro401'
        '500':
          $ref: '#/components/responses/Erro500'

  # ============================================================
  # ATA DE REGISTRO DE PREÇO
  # ============================================================

  /appfornecedor/rest/ws_ata_registro_preco:
    post:
      summary: Lista atas de registro de preço
      operationId: wsAtaRegistroPreco
      tags:
        - Ata de Registro de Preço
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                licitacao_ata_ano:
                  type: integer
                  description: 0 = todos
                  example: 0
                licitacao_ata_num:
                  type: integer
                  description: 0 = todos
                  example: 0
                licitacao_ata_data:
                  type: string
                  example: ""
                licitacao_ata_vencimento:
                  type: string
                  example: ""
                pagina_busca:
                  type: integer
                  example: 1
                limite_busca:
                  type: integer
                  example: 10
      responses:
        '200':
          description: Atas
          content:
            application/json:
              schema:
                type: object
                properties:
                  sdt_licitacao_ata_response:
                    type: object
                    properties:
                      totalRows:
                        type: integer
                        example: 20
                      TotalPages:
                        type: integer
                        example: 2
                      licitacao_ata:
                        type: array
                        items:
                          $ref: '#/components/schemas/AtaRegistroPreco'
        '401':
          $ref: '#/components/responses/Erro401'
        '500':
          $ref: '#/components/responses/Erro500'

  # ============================================================
  # CREDENCIAMENTO (appadm)
  # ============================================================

  /appadm/rest/ws_credenciamento_view:
    post:
      summary: Lista credenciamentos
      description: A proposta de credenciamento ainda não é enviada ao backend (botão "Em breve").
      operationId: wsCredenciamentoView
      tags:
        - Credenciamento
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                licitacaodatahomologacaoinicial:
                  type: string
                  description: yyyy-MM-dd ou ""
                  example: "2026-01-01"
                licitacaodatahomologacaofinal:
                  type: string
                  example: "2026-12-31"
                processocompranumero:
                  type: string
                  description: Número como string, "" sem filtro
                  example: "159"
                processocompraano:
                  type: string
                  example: "2026"
                licitacaoano:
                  type: string
                  example: ""
                licitacaonumero:
                  type: string
                  example: ""
                licitacao_concorrencia:
                  type: string
                  example: ""
                pagina:
                  type: integer
                  example: 1
                limit:
                  type: integer
                  example: 10
      responses:
        '200':
          description: Credenciamentos
          content:
            application/json:
              schema:
                type: object
                properties:
                  sdt_licitacao_out:
                    type: object
                    properties:
                      isErro:
                        type: boolean
                      totalRows:
                        type: integer
                        example: 42
                      totalPage:
                        type: integer
                        example: 5
                      Licitacao:
                        type: array
                        items:
                          type: object
                          properties:
                            licitacao_id:
                              type: integer
                              example: 10
                            licitacao_num_ano:
                              type: string
                              example: "00000207/2024"
                            licitacao_processo_compra_num_ano:
                              type: string
                              example: "159/2024"
                            licitacao_objeto:
                              type: string
                            licitacao_data_homologacao:
                              type: string
                              format: date
                            licitacao_data_adjudicacao:
                              type: string
                              format: date
                            licitacao_modalidade_num_ano:
                              type: string
                            licitacao_concorrencia:
                              type: integer
                              description: 1 Global, 2 Item, 3 Lote
                            licitacao_status:
                              type: integer
                              description: 1 Pendente, 2 Adjudicada, 3 Homologada, 4 Efetuada, 5 Empenhada, 6 Cancelada, 7 Deserta, 8 Suspensa
                            licitacao_processo_compra_id:
                              type: integer
        '401':
          $ref: '#/components/responses/Erro401'
        '500':
          $ref: '#/components/responses/Erro500'

  /appadm/rest/ws_credenciamento_item_view:
    post:
      summary: Detalhe do credenciamento com os itens
      operationId: wsCredenciamentoItemView
      tags:
        - Credenciamento
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required:
                - licitacao_id
              properties:
                licitacao_id:
                  type: integer
                  example: 10
      responses:
        '200':
          description: Detalhe (o portal usa o primeiro item de `response`)
          content:
            application/json:
              schema:
                allOf:
                  - $ref: '#/components/schemas/RetornoPadrao'
                  - type: object
                    properties:
                      response:
                        type: array
                        items:
                          type: object
                          properties:
                            licitacao_objeto:
                              type: string
                            licitacao_processo_compra_num_ano:
                              type: string
                            licitacao_processo_compra_descricao:
                              type: string
                            licitacao_valor_referencia:
                              type: string
                              example: "150000.00"
                            licitacao_modalidade:
                              type: string
                            licitacao_tipo_modalidade:
                              type: string
                            licitacao_criterio_lei_14133:
                              type: integer
                              description: 0 a 10 (1 Menor Preço, 9 Maior desconto, 10 Maior lance)
                            licitacao_abertura_data:
                              type: string
                              format: date
                            licitacao_abertura_hora:
                              type: string
                              example: "09:00"
                            licitacao_abertura_prop_data:
                              type: string
                              format: date
                            licitacao_abertura_prop_hora:
                              type: string
                            licitacao_entrega_data:
                              type: string
                              format: date
                            licitacao_entrega_hora:
                              type: string
                            item:
                              type: array
                              items:
                                type: object
                                properties:
                                  processo_compra_item_seq:
                                    type: integer
                                  processo_compra_prod_cod:
                                    type: string
                                  processo_compra_prod_desc:
                                    type: string
                                  processo_compra_item_qtd:
                                    type: string
                                  processo_compra_item_vlr_ref:
                                    type: string
                                  cotacao_item_valor_total:
                                    type: string
                                  processo_compra_un_med:
                                    type: string
                                  cotacao_item_unid_forn_des:
                                    type: string
        '401':
          $ref: '#/components/responses/Erro401'
        '500':
          $ref: '#/components/responses/Erro500'

  # ============================================================
  # UPLOAD (servlet)
  # ============================================================

  /portalfornecedor/servlet/upload:
    post:
      summary: Upload temporário de arquivo
      description: |
        Envia um arquivo e devolve um token. Esse token vai nos campos de arquivo de
        `ws_contrato_anexo_grava`, `ws_protocolo_add`, `ws_cotacao_add`, `ws_pre_cad_doc_grava`
        e `ws_forn_credor_update_in` (CERTIDOES).
      operationId: servletUpload
      tags:
        - Upload
      security:
        - GXToken: []
        - {}
      requestBody:
        required: true
        content:
          multipart/form-data:
            schema:
              type: object
              required:
                - teste
              properties:
                teste:
                  type: string
                  format: binary
                  description: Arquivo (o nome do campo é "teste")
      responses:
        '200':
          description: |
            Token do arquivo. Pode vir como texto puro, como string JSON ou como objeto JSON
            com uma das chaves `result`, `response`, `data`, `anexo` ou `base64`.
          content:
            text/plain:
              schema:
                type: string
            application/json:
              schema:
                type: object
                properties:
                  result:
                    type: string

  # ============================================================
  # AUTENTICAÇÃO DE DOCUMENTO
  # ============================================================

  /appfornecedor/rest/Ws_Dominio:
    post:
      summary: Tipos de documento para autenticação
      operationId: wsDominio
      tags:
        - Autenticação de documento
      security: []
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                SDT_Parm_Dominio:
                  type: object
                  properties:
                    dominio:
                      type: integer
                      example: 9
                    sdt_dados_conexao:
                      $ref: '#/components/schemas/SdtDadosConexao'
      responses:
        '200':
          description: Tipos de documento
          content:
            application/json:
              schema:
                allOf:
                  - $ref: '#/components/schemas/RetornoIsErro'
                  - type: object
                    properties:
                      SDT_Retorno_Dominio:
                        type: object
                        properties:
                          SDT_Dominio_WS:
                            type: array
                            items:
                              type: object
                              properties:
                                id:
                                  type: integer
                                  example: 2
                                codigo:
                                  type: string
                                  example: HOL
                                descricao:
                                  type: string
                                  example: Holerite

  /appfornecedor/rest/Ws_Servidor_Documento_Validacao:
    post:
      summary: Valida código de autenticação de documento
      operationId: wsServidorDocumentoValidacao
      tags:
        - Autenticação de documento
      security: []
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                SDT_Parm_Documento_Validacao:
                  type: object
                  properties:
                    clientID:
                      type: integer
                      example: 748
                    chave:
                      type: string
                    cliente:
                      type: string
                      example: ponteselacerda
                    unidade_gestora_id:
                      type: integer
                      example: 1
                    codigo_validador:
                      type: string
                      example: ABC123XYZ
      responses:
        '200':
          description: Documento validado
          content:
            application/json:
              schema:
                allOf:
                  - $ref: '#/components/schemas/RetornoIsErro'
                  - type: object
                    properties:
                      SDT_Retorno_Documento_Validacao:
                        type: object
                        properties:
                          Informacao:
                            type: array
                            items:
                              type: object
                              properties:
                                Campo:
                                  type: string
                                  example: Competência
                                Valor:
                                  type: string
                                  example: "08/2026"
                          Tipo_Doc:
                            type: integer
                            description: 2 Holerite, 3 Ficha Financeira, 4 Comprovante de Rendimentos
                          tipo_doc_descricao:
                            type: string
                          codigo_validador:
                            type: string
                          servidor_id:
                            type: string
                          servidor_descricao:
                            type: string
                          cargo_descricao:
                            type: string
                          departamento_descricao:
                            type: string
                          lotacao_descricao:
                            type: string
                          secretaria_descricao:
                            type: string
                          setor_descricao:
                            type: string

  # ============================================================
  # NÃO UTILIZADOS PELO PORTAL (mantidos da versão anterior)
  # ============================================================

  /appfornecedor/rest/ws_endereco_estado:
    post:
      summary: Lista estados
      description: Não é chamado pelo portal web.
      operationId: wsEnderecoEstado
      tags:
        - Não utilizados pelo portal
      requestBody:
        required: false
        content:
          application/json:
            schema:
              type: object
      responses:
        '200':
          description: Estados
          content:
            application/json:
              schema:
                type: object
                properties:
                  response:
                    type: array
                    items:
                      type: object
                      properties:
                        estado_id:
                          type: string
                          example: "27"
                        estado_nome:
                          type: string
                          example: TOCANTINS
                        estado_sigla:
                          type: string
                          example: TO

  /appfornecedor/rest/ws_endereco_cidade:
    post:
      summary: Lista cidades
      description: Não é chamado pelo portal web.
      operationId: wsEnderecoCidade
      tags:
        - Não utilizados pelo portal
      requestBody:
        required: false
        content:
          application/json:
            schema:
              type: object
              properties:
                estado_id:
                  type: integer
                  example: 11
                texto:
                  type: string
                  example: "cu"
      responses:
        '200':
          description: Cidades
          content:
            application/json:
              schema:
                type: object
                properties:
                  response:
                    type: array
                    items:
                      type: object
                      properties:
                        cidade_id:
                          type: string
                        cidade_nome:
                          type: string
                        estado_id:
                          type: string

  /appfornecedor/rest/ws_agencias:
    post:
      summary: Lista agências bancárias
      description: Não é chamado pelo portal web.
      operationId: wsAgencias
      tags:
        - Não utilizados pelo portal
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                cliente:
                  type: string
                banco_id_busca:
                  type: integer
      responses:
        '200':
          description: Resposta de sucesso

  /appfornecedor/rest/ws_pre_cad_tipo_doc:
    post:
      summary: Tipos de documento do pré-cadastro
      description: Não é chamado pelo portal web (substituído por ws_pre_cad_doc_parm_adm).
      operationId: wsPreCadTipoDoc
      tags:
        - Não utilizados pelo portal
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/BodyCliente'
      responses:
        '200':
          description: Resposta de sucesso

  /appfornecedor/rest/ws_tipo_doc_protocolar:
    post:
      summary: Tipos de documento para protocolar
      description: Não é chamado pelo portal web (as certidões da nota fiscal vêm de ws_pre_cad_doc_parm_adm).
      operationId: wsTipoDocProtocolar
      tags:
        - Não utilizados pelo portal
      requestBody:
        required: false
        content:
          application/json:
            schema:
              type: object
      responses:
        '200':
          description: Resposta de sucesso

# ============================================================
# COMPONENTES
# ============================================================

components:

  securitySchemes:
    GXToken:
      type: apiKey
      in: header
      name: GX-Token
      description: Token retornado por POST /appcentral/rest/auth

  parameters:
    ClientIdHeader:
      name: clientID
      in: header
      required: true
      schema:
        type: string
    ChaveHeader:
      name: chave
      in: header
      required: true
      schema:
        type: string
    GxSystemNameHeader:
      name: GX-SYSTEM-NAME
      in: header
      required: true
      schema:
        type: string
        example: PORTALFORNECEDOR

  responses:
    Erro400:
      description: Requisição inválida
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ErroApi'
    Erro401:
      description: Não autorizado - token inválido, ausente ou expirado
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ErroApi'
    Erro500:
      description: Erro interno do servidor
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ErroApi'
    RetornoErroMensagem:
      description: Resultado. `erro = true` indica falha, com o texto em `mensagem`.
      content:
        application/json:
          schema:
            type: object
            properties:
              erro:
                type: boolean
                example: false
              mensagem:
                type: string
                example: Código enviado

  schemas:

    # ---------- Envelopes ----------

    ErroApi:
      type: object
      description: Corpo de erro. Quando traz `message` + `status_code`/`request_uri`, o portal exibe a própria mensagem.
      properties:
        status_code:
          type: integer
          example: 404
        message:
          type: string
        request_uri:
          type: string

    RetornoPadrao:
      type: object
      description: Envelope usado em Contratos, Aditivos, Assinatura e Credenciamento. status_code diferente de "200" indica erro.
      properties:
        status_code:
          type: string
          example: "200"
        message:
          type: string

    OneMessage:
      type: object
      description: Type diferente de 0 indica erro
      properties:
        Description:
          type: string
        Id:
          type: string
        Type:
          type: integer
          example: 0

    MensagemGx:
      type: object
      properties:
        Description:
          type: string
        Id:
          type: string
        Type:
          type: integer

    RetornoIsErro:
      type: object
      properties:
        isErro:
          type: boolean
          example: false
        Mensagens:
          type: array
          items:
            $ref: '#/components/schemas/MensagemGx'
        mensagem:
          type: string
        message:
          type: string
        aviso:
          type: string

    RetornoTokenAssinatura:
      type: object
      properties:
        token:
          type: string
          description: Token do REST PKI usado para assinar no navegador

    BodyCliente:
      type: object
      required:
        - cliente
      properties:
        cliente:
          type: string
          example: ponteselacerda

    BodyContratoIdBusca:
      type: object
      required:
        - contrato_id_busca
      properties:
        contrato_id_busca:
          type: integer
          example: 123

    SdtDadosConexao:
      type: object
      properties:
        cliente:
          type: string
        unidade_gestora_id:
          type: string
          example: "1"
        chave:
          type: string
        cliente_id:
          type: string

    # ---------- Enums ----------

    TipoAtualizacaoCadastral:
      type: string
      enum:
        - DADOS_BASICOS
        - ENDERECO_CONTATO
        - SEGMENTOS
        - DADOS_COMPLEMENTARES
        - SOCIOS
        - REPRESENTANTE
        - DADOS_BANCARIOS
        - CERTIDOES
      description: DADOS_COMPLEMENTARES aparece só no retorno; o portal não envia esse tipo.

    CodVerifTipo:
      type: string
      enum:
        - PRE_CAD_NOVO
        - PRE_CAD_VAL_EMAIL
        - PRE_CAD_REENVIO
        - LOGIN_ESQUECI_SENHA
        - PRE_CAD_RECUSA_REABRE

    TipoDocLiquid:
      type: integer
      description: |
        1 Nota Fiscal de Outros Modelos, 2 Recibo, 3 Comprovantes Diversos,
        5 Nota Fiscal de Serviço Eletrônica, 11 Nota Fiscal Eletrônica de ICMS
      enum: [1, 2, 3, 5, 11]
      example: 5

    SituacaoProtocolo:
      type: integer
      description: |
        0 Todos, 1 Enviado, 2 Em Análise, 3 Devolvido, 4 Concluído, 5 Aprovado,
        6 Aguardando CRC, 7 Atesto Gerado, 8 Atesto Assinado
      example: 0

    # ---------- Autenticação ----------

    UnidadeGestora:
      type: object
      properties:
        unidade_gestora_id:
          type: string
          example: "1"
        unidade_gestora_descricao:
          type: string
        unidade_gestora_cnpj:
          type: string
        unidade_gestora_cnpj_mascarado:
          type: string
        unidade_gestora_email:
          type: string
        unidade_gestora_telefone:
          type: string
        unidade_gestora_website:
          type: string
        unidade_gestora_end_numero:
          type: string
        unidade_gestora_status:
          type: integer
        unidade_gestora_tipo_entidade:
          type: integer
        unidade_gestora_brasao:
          type: string
        unidade_gestora_brasao_path:
          type: string
        unidade_gestora_logo:
          type: string
        unidade_gestora_logo_rod_path:
          type: string
        unidade_gestora_img_app_path:
          type: string
        unidade_gestora_img_cab_path:
          type: string
        ug_logradouro_id:
          type: string
        ug_logradouro_end:
          type: string
        ug_logradouro_cep:
          type: string
        ug_logradouro_bairro_id:
          type: string
        ug_logradouro_bairro_nome:
          type: string
        ug_logradouro_cidade_id:
          type: string
        ug_logradouro_cidade_nome:
          type: string
        ug_logradouro_cidade_ibge:
          type: integer
        ug_logradouro_estado_id:
          type: string
        ug_logradouro_estado_nome:
          type: string
        ug_logradouro_estado_sigla:
          type: string
        ug_logradouro_pais_id:
          type: string
        ug_logradouro_pais_nome:
          type: string

    # ---------- Fornecedor ----------

    FornCredor:
      type: object
      properties:
        forn_credor_id:
          type: string
        forn_credor_pessoa_id:
          type: string
        forn_credor_pessoa_cpf_cnpj:
          type: string
          example: "07281368000114"
        forn_credor_pessoa_razao_social:
          type: string
        forn_credor_pessoa_nome_fantasia:
          type: string
        forn_credor_pessoa_insc_estadual:
          type: string
        forn_credor_pessoa_insc_municipal:
          type: string
        forn_credor_pessoa_optante_simples:
          type: boolean
        forn_credor_pessoa_tipo:
          type: integer
          description: 1 = PF, 2 = PJ
        forn_credor_pessoa_tipo_emp_id:
          type: integer
          description: Tipo de empresa
        forn_credor_pessoa_enquadramento:
          type: integer
        forn_cad_cont_cod_junta:
          type: string
        forn_cad_cont_cap_social:
          type: string
        forn_cad_cont_data_consti:
          type: string
          format: date

    FornEndereco:
      type: object
      properties:
        forn_credor_pessoa_email:
          type: string
        forn_credor_pessoa_tel_fixo:
          type: string
        forn_credor_pessoa_tel_movel:
          type: string
        forn_credor_pessoa_logr_id:
          type: string
        forn_credor_pessoa_logr_end:
          type: string
        forn_credor_pessoa_logr_numero:
          type: string
        forn_credor_pessoa_logr_comp:
          type: string
        forn_credor_pessoa_logr_refe:
          type: string
        forn_credor_pessoa_logr_cep:
          type: string
        forn_credor_pessoa_logr_bai_id:
          type: string
        forn_credor_pessoa_logr_bai_nome:
          type: string
        forn_credor_pessoa_logr_cid_id:
          type: string
        forn_credor_pessoa_logr_cid_nome:
          type: string
        forn_credor_pessoa_logr_est_id:
          type: string
        forn_credor_pessoa_logr_est_sigla:
          type: string

    Logradouro:
      type: object
      properties:
        logradouro_id:
          type: string
        logradouro_endereco:
          type: string
        logradouro_cep:
          type: string
        logradouro_bairro_nome:
          type: string
        bairro_codigo:
          type: string
        logradouro_cidade_nome:
          type: string
        cidade_codigo:
          type: string
        logradouro_cidade_id:
          type: string
        logradouro_estado_id:
          type: string
        logradouro_estado_sigla:
          type: string

    Socio:
      type: object
      properties:
        socios_id:
          type: string
        socios_pessoa_id:
          type: string
        socios_pessoa_juridica_id:
          type: integer
        socios_pessoa_codigo:
          type: string
        socios_pessoa_razao_social:
          type: string
        socios_pessoa_tipo:
          type: integer
        socios_pessoa_cpf_cnpj:
          type: string
        socios_pessoa_cpf_cnpj_masc:
          type: string
        socios_pessoa_email:
          type: string
        socios_pessoa_telefone:
          type: string
        socios_pessoa_celular:
          type: string
        socios_data_junta:
          type: string
          format: date
        socios_percentual:
          type: number
          example: 51.0
        socios_qualificacao:
          type: integer
        socios_soc_qualificacao_id:
          type: integer

    Representante:
      type: object
      properties:
        representante_id:
          type: string
        representante_funcao:
          type: integer
          description: 1 Presidente, 2 Vice-presidente, 3 Diretor, 4 Gerente, 5 Coordenador, 6 Representante
        representante_pessoa_id:
          type: string
        representante_pessoa_codigo:
          type: string
        representante_pessoa_cpf_cnpj:
          type: string
        representante_pessoa_cpf_cnpj_masc:
          type: string
        representante_pessoa_razao_social:
          type: string

    ContaBancaria:
      type: object
      properties:
        forn_credor_conta_id:
          type: string
        forn_credor_id:
          type: integer
        forn_credor_pessoa_id:
          type: string
        forn_credor_pessoa_razao_social:
          type: string
        forn_credor_conta_banco_id:
          type: string
        forn_credor_conta_banco_numero:
          type: string
          example: "260"
        forn_credor_conta_banco_descricao:
          type: string
          example: NU Pagamentos S.A.
        forn_credor_conta_agencia_num:
          type: string
        forn_credor_conta_agencia_dg:
          type: string
        agencia_tce_agencia_id:
          type: string
        agencia_tce_agencia_codigo:
          type: string
        forn_credor_conta_numero:
          type: string
        forn_credor_conta_dg:
          type: string
        forn_credor_conta_tipo:
          type: integer
          description: 1 Corrente, 2 Poupança
        forn_credor_conta_operacao:
          type: string
        forn_credor_conta_razao:
          type: string
        forn_credor_conta_datacad:
          type: string
        forn_credor_conta_ordempag:
          type: integer
        forn_credor_conta_principal:
          type: boolean
        forn_credor_conta_status:
          type: integer

    AnexoFornecedor:
      type: object
      properties:
        anexos_fornecedor_id:
          type: string
        anexos_fornecedor_nome:
          type: string
          example: certidao.pdf
        anexos_fornecedor_caminho:
          type: string
        anexos_fornecedor_data:
          type: string
          format: date
        anexos_fornecedor_ext:
          type: string
        anexos_url:
          type: string
        anexo_fornecedor_tipo_doc_id:
          type: string
          example: "5"
        anexo_fornecedor_descricao:
          type: string
        anexo_fornecedor_cod_aut:
          type: string
        anexo_fornecedor_emissao:
          type: string
          description: yyyy-MM-dd ("0000-00-00" = vazio)
        anexo_fornecedor_validade:
          type: string
          description: yyyy-MM-dd ("0000-00-00" = vazio)

    TipoDocumentoParm:
      type: object
      properties:
        tipo_doc_id:
          type: integer
          example: 7
        tipo_doc_descricao:
          type: string
          example: CERTIDAO TRABALHISTA
        tipo_doc_obrigatorio:
          type: boolean
        exigencia_fiscal:
          type: boolean
          description: Também torna o anexo obrigatório
        tipo_doc_validade:
          type: boolean
          description: Exige número, emissão e validade
        tipo_doc_status:
          type: string
        tipo_doc_tipo_formato:
          type: string
          description: JSON (string) com as extensões aceitas; vazio = só PDF
          example: '["PDF"]'
        tipo_doc_unico:
          type: boolean
        tipo_doc_tpo_pessoa:
          type: integer
          description: 1 PF, 2 PJ, 3 ambos
        tipo_doc_disp_portal:
          type: integer
          description: 1 todos, 2 todos exceto os tipos de empresa listados, 3 só os listados
        tipo_doc_disp_empresa:
          type: string
          description: JSON (string) com ids de tipo de empresa
          example: "[1,2]"
        regularidade_fiscal:
          type: boolean
          description: Documento exigido na apresentação de Nota Fiscal

    # ---------- Recadastramento (conteúdo de forn_credor_update_json) ----------

    UpdJsonDadosBasicos:
      type: object
      properties:
        forn_credor_pessoa_razao_social:
          type: string
        forn_cad_pes_razao:
          type: string
        forn_credor_pessoa_nome_fantasia:
          type: string
        forn_cad_pes_nome_fant:
          type: string
        forn_credor_pessoa_insc_estadual:
          type: string
        forn_cad_cont_insc_est:
          type: string
        forn_credor_pessoa_insc_municipal:
          type: string
        forn_cad_cont_cod_junta:
          type: string
        forn_cad_cont_data_consti:
          type: string
          description: yyyy-MM-dd ou ""
        forn_cad_cont_cap_social:
          type: string
          description: 4 casas decimais
          example: "10000.0000"
        forn_credor_pessoa_optante_simples:
          type: boolean
        forn_credor_pessoa_tipo_emp_id:
          type: integer
        forn_credor_pessoa_enquadramento:
          type: integer
          description: 0 exceto para tipos de empresa 1, 2, 10 e 11

    UpdJsonEnderecoContato:
      type: object
      properties:
        forn_credor_pessoa_logr_id:
          type: integer
          description: logradouro_id de ws_forn_logradouro
        forn_credor_pessoa_logr_numero:
          type: string
        forn_credor_pessoa_logr_comp:
          type: string
        forn_credor_pessoa_logr_refe:
          type: string
        forn_logra_refe:
          type: string
        forn_credor_pessoa_email:
          type: string
        forn_credor_pessoa_tel_fixo:
          type: string
          description: Somente dígitos
        forn_credor_pessoa_tel_movel:
          type: string
          description: Somente dígitos

    UpdJsonSocio:
      allOf:
        - $ref: '#/components/schemas/Socio'
        - type: object
          properties:
            socios_percentual_UPD:
              type: number
            socios_pessoa_celular_UPD:
              type: string
            socios_mode:
              type: string
              enum: [INS, UPD, DLT]

    UpdJsonRepresentante:
      allOf:
        - $ref: '#/components/schemas/Representante'
        - type: object
          properties:
            representante_funcao_UPD:
              type: integer
            mode:
              type: string
              enum: [INS, UPD, DLT]

    UpdJsonContaBancaria:
      allOf:
        - $ref: '#/components/schemas/ContaBancaria'
        - type: object
          description: |
            Para cada campo auditado K (banco_id, agencia_num, numero, dg, agencia_dg, datacad, principal, tipo,
            agencia_tce_agencia_id, agencia_tce_agencia_codigo) são enviados `K_ANT` (valor anterior) e
            `K_NOVO` (valor novo, ou vazio quando não mudou). Na alteração, `mode` vai como "".
          properties:
            forn_credor_conta_banco_id_ANT:
              type: integer
            forn_credor_conta_banco_id_NOVO:
              type: integer
            forn_credor_conta_agencia_num_ANT:
              type: string
            forn_credor_conta_agencia_num_NOVO:
              type: string
            forn_credor_conta_numero_ANT:
              type: string
            forn_credor_conta_numero_NOVO:
              type: string
            forn_credor_conta_dg_ANT:
              type: string
            forn_credor_conta_dg_NOVO:
              type: string
            forn_credor_conta_agencia_dg_ANT:
              type: string
            forn_credor_conta_agencia_dg_NOVO:
              type: string
            forn_credor_conta_datacad_ANT:
              type: string
            forn_credor_conta_datacad_NOVO:
              type: string
            forn_credor_conta_principal_ANT:
              type: boolean
            forn_credor_conta_principal_NOVO:
              type: boolean
            forn_credor_conta_tipo_ANT:
              type: integer
            forn_credor_conta_tipo_NOVO:
              type: integer
            agencia_tce_agencia_id_ANT:
              type: integer
            agencia_tce_agencia_id_NOVO:
              type: integer
            mode:
              type: string
              enum: [INS, "", DLT]

    UpdDocumentoCertidao:
      type: object
      properties:
        forn_credor_doc_tipo_doc_id:
          type: integer
          example: 5
        forn_credor_doc_validade:
          type: string
          description: dd/MM/yyyy ou ""
          example: "31/12/2026"
        forn_credor_doc_emissao:
          type: string
          description: dd/MM/yyyy ou ""
          example: "01/01/2026"
        forn_credor_doc_cod_aut:
          type: string
          description: Até 50 caracteres
        forn_credor_update_base64:
          type: string
          description: Token do upload, ou "" quando não há arquivo novo

    # ---------- Pré-cadastro ----------

    SdtPreCadastroForn:
      type: object
      properties:
        pre_cad_forn_id:
          type: integer
          example: 1668
        pre_cad_forn_cpf_cnpj:
          type: string
        pre_cad_forn_email:
          type: string
        pre_cad_forn_cel:
          type: string
        pre_cad_forn_tipo_pessoa:
          type: integer
          description: 1 = PF, 2 = PJ
        pre_cad_forn_situacao:
          type: integer
          description: 1 Rascunho, 2 Aprovado, 3 Cancelado, 4 Em análise, 5 Recusado
        pre_cad_forn_fase_atual:
          type: integer
        pre_cad_forn_existe_recusa:
          type: boolean
        cad_id:
          type: integer
        forn_cad_id:
          type: integer
        pre_cad_forn_dados:
          type: string
          description: JSON serializado (string) com a estrutura `PreCadFornDados`

    PreCadFornDados:
      type: object
      description: |
        Estrutura de `entrada` (ws_pre_cadastro_forn_add) e de `pre_cad_forn_dados` (JSON em string no retorno).
        `dados_complementares` e `dados_socios` são só para PJ.
      properties:
        existe_recusa:
          type: boolean
        dados_basicos:
          $ref: '#/components/schemas/PreCadDadosBasicos'
        endereco:
          $ref: '#/components/schemas/PreCadEndereco'
        dados_bancarios:
          $ref: '#/components/schemas/PreCadDadosBancarios'
        dados_complementares:
          type: object
          properties:
            descricao_fase:
              type: string
            segmento_id_COLL:
              type: array
              items:
                type: integer
              example: [3, 7]
            situacao:
              type: string
              example: complete
        sdt_pre_cad_documento:
          type: array
          description: Documentos salvos (apenas no retorno)
          items:
            type: object
            properties:
              tipo_doc_id:
                type: integer
              doc_cod_aut:
                type: string
              doc_emissao:
                type: string
              doc_validade:
                type: string

    PreCadDadosBasicos:
      type: object
      properties:
        situacao:
          type: string
          example: complete
        descricao_fase:
          type: string
        forn_cad_id:
          type: integer
          description: Opcional
        forn_cad_pes_razao:
          type: string
          description: Nome completo (PF) ou razão social (PJ)
        forn_cad_pes_nome_fant:
          type: string
        forn_cad_cont_cod_junta:
          type: string
        forn_cad_cont_insc_est:
          type: string
        forn_cad_cont_cap_social:
          type: string
          example: "123123.1300"
        forn_cad_cont_data_consti:
          type: string
          description: yyyy-MM-dd ou "0000-00-00"
        forn_cad_cont_reg_esp:
          type: integer
        forn_cad_cont_data_reg:
          type: string
          example: "0000-00-00"
        forn_credor_pessoa_tipo_emp_id:
          type: integer
        forn_credor_pessoa_enquadramento:
          type: integer
          description: 1 a 4 para tipos de empresa 1, 2, 10 e 11; senão 0
        forn_credor_pessoa_optante_simples:
          type: boolean
        dados_socios:
          type: array
          description: PJ com tipo de empresa 1, 2, 10 ou 11; senão vazio
          items:
            $ref: '#/components/schemas/PreCadSocio'

    PreCadSocio:
      type: object
      properties:
        socios_id:
          type: integer
          example: 0
        mode:
          type: string
          example: INS
        socios_pessoa_razao_social:
          type: string
        socios_pessoa_cpf_cnpj:
          type: string
          description: Somente dígitos
        socios_pessoa_nacionalidade:
          type: integer
          description: 1 Brasileira, 2 Estrangeira
        socios_percentual:
          type: number
          example: 50
        socios_data_junta:
          type: string
          description: yyyy-MM-dd ou "0000-00-00"
        dados_socio_endereco:
          type: object
          properties:
            socios_pessoa_logra_id:
              type: integer
            socios_pessoa_logra_cep:
              type: string
              example: "78250-000"
            socios_pessoa_logra_tipo:
              type: integer
            socios_pessoa_logra_endereco:
              type: string
            socios_pessoa_logra_numero:
              type: string
            socios_pessoa_logra_bairro:
              type: string
            socios_pessoa_logra_cidade:
              type: string
            socios_pessoa_logra_cidade_id:
              type: integer
            socios_pessoa_logra_estado:
              type: string
            socios_pessoa_logra_estado_id:
              type: integer
            socios_pessoa_logra_comple:
              type: string
            socios_pessoa_logra_refe:
              type: string

    PreCadEndereco:
      type: object
      properties:
        situacao:
          type: string
          example: complete
        descricao_fase:
          type: string
        forn_logra_id:
          type: integer
        forn_logra_cep:
          type: string
          description: 8 dígitos
          example: "78250000"
        forn_logra_tipo:
          type: integer
        forn_logra_endereco:
          type: string
        forn_logra_numero:
          type: string
        forn_logra_bairro:
          type: string
        forn_logra_cidade:
          type: string
        forn_logra_cidade_id:
          type: integer
        forn_logra_estado:
          type: string
          example: MT
        forn_logra_estado_id:
          type: integer
        forn_logra_comple:
          type: string
        forn_logra_refe:
          type: string
        sdt_fornecedor_contato:
          type: array
          items:
            type: object
            properties:
              forn_contato_id:
                type: integer
                example: 0
              forn_contato_tipo:
                type: integer
                description: 1 Telefone fixo, 2 Celular, 3 E-mail
              forn_contato_class:
                type: integer
                example: 1
              forn_contato_desc:
                type: string
                example: fornecedor@exemplo.com
              fornecedor_id:
                type: integer
                example: 0

    PreCadDadosBancarios:
      type: object
      properties:
        situacao:
          type: string
          example: complete
        descricao_fase:
          type: string
        forn_credor_conta_banco_id:
          type: integer
        forn_credor_conta_banco_numero:
          type: string
          example: "001"
        forn_credor_conta_banco_descricao:
          type: string
        forn_credor_conta_agencia_num:
          type: string
        forn_credor_conta_agencia_dg:
          type: string
        forn_credor_conta_numero:
          type: string
        forn_credor_conta_dg:
          type: string
        conta_bancaria_data_abertura:
          type: string
          description: yyyy-MM-dd ou "0000-00-00"
        forn_credor_conta_tipo:
          type: integer
          description: 0 não informado, 1 Corrente, 2 Poupança

    # ---------- Contratos ----------

    Contrato:
      type: object
      properties:
        contrato_id:
          type: integer
          example: 123
        contrato_num:
          type: string
          example: "159"
        contrato_ano:
          type: integer
          example: 2017
        contrato_num_ano:
          type: string
          example: "00000159/2017"
        contrato_objetivo:
          type: string
        contrato_valor:
          type: string
          example: "1234.56"
        contrato_data_publicacao:
          type: string
          format: date
        contrato_vig_ini:
          type: string
          format: date
        contrato_vig_fim:
          type: string
          format: date
        contrato_vig_nova:
          type: string
          format: date
        contrato_assinatura:
          type: string
          format: date
        contrato_vencimento:
          type: string
          description: '"0000-00-00" = sem vencimento'
        contrato_tipo:
          type: integer
          description: 1 a 33
        contrato_situacao:
          type: integer
          description: 1 Em Execução, 2 Cancelado, 3 Concluído, 4 Paralisado, 5 Indisponível
        existe_anexo:
          type: boolean

    Aditivo:
      type: object
      properties:
        contrato_aditivo_id:
          type: integer
          example: 55
        contrato_aditivo_num:
          type: string
        contrato_aditivo_ano:
          type: integer
        contrato_aditivo_num_ano:
          type: string
        contrato_id:
          type: integer
        contrato_num:
          type: string
        contrato_ano:
          type: integer
        contrato_num_ano:
          type: string
        contrato_situacao:
          type: integer
        contrato_tipo:
          type: integer
        contrato_valor:
          type: string
        contrato_aditivo_valor:
          type: string
        contrato_aditivo_justificativa:
          type: string
        contrato_aditivo_data_pub:
          type: string
          format: date
        contrato_data_publicacao:
          type: string
          format: date
        contrato_vig_ini:
          type: string
          format: date
        contrato_vig_fim:
          type: string
          format: date
        contrato_aditivo_vig:
          type: string
          format: date
          description: Nova vigência
        contrato_aditivo_data:
          type: string
          format: date
        contrato_aditivo_assinatura:
          type: string
          format: date
        contrato_aditivo_tipo:
          type: integer
          description: |
            1 Aditivo de Prazo, 2 Acréscimo Valor, 3 Acréscimo Valor e Prazo,
            4 Alterações de Outras Cláusulas, 5 Supressão Valor, 6 Supressão Valor e Prazo
        contrato_aditivo_tipo_desc:
          type: string
        contrato_aditivo_tipo_det:
          type: integer
          description: 1 Reequilíbrio econômico-financeiro, 2 Reajuste, 3 Renovação, 4 Fornecedor, 5 Prorrogação
        contrato_aditivo_operacao_desc:
          type: string
        contrato_aditivo_fundamentacao:
          type: string
        contrato_aditivo_descricao:
          type: string
        contrato_aditivo_responsavel:
          type: string
        contrato_aditivo_responsavel_id:
          type: string
        contrato_aditivo_responsavel_nome:
          type: string
        contrato_aditivo_oab:
          type: string
        contrato_aditivo_veiculo_publicacao:
          type: string
        existe_anexo:
          type: boolean

    # ---------- Nota Fiscal ----------

    ProcessoProtocolo:
      type: object
      properties:
        processo_doc_forn_id:
          type: integer
          example: 123
        processo_desc:
          type: string
        processo_doc_forn_descricao:
          type: string
          description: Formato antigo ("NF 123 / 1 ...")
        nad_id:
          type: integer
          example: 817
        empenho_numero_ano:
          type: string
          example: "1340/2025"
        tipo_doc_liquid:
          $ref: '#/components/schemas/TipoDocLiquid'
        tipo_doc_liquid_desc:
          type: string
        processo_doc_forn_situacao:
          type: object
          description: Situação do protocolo (valor 3 = Devolvido)
          properties:
            valor:
              $ref: '#/components/schemas/SituacaoProtocolo'
            descricao:
              type: string
              example: Devolvido
        processo_doc_just_devo:
          type: string
          description: Motivo da devolução
        processo_doc_forn_tipo:
          type: integer
          description: 1 = Ordem de Consumo
        processo_doc_forn_inc_em:
          type: string
          format: date-time
        processo_doc_forn_alt_em:
          type: string
          format: date-time
        sdt_doc_fiscal:
          type: object
          properties:
            numero:
              type: string
            serie:
              type: string
            chave_nfe:
              type: string
            data:
              type: string
            valor:
              type: number
        sdt_anexo_protocolo:
          type: array
          items:
            $ref: '#/components/schemas/AnexoProtocolo'

    AnexoProtocolo:
      type: object
      properties:
        anexos_fornecedor_id:
          type: integer
          example: 55
        anexo_fornecedor_doc_tipo:
          type: integer
          description: 0 = certidão; senão o tipo_doc_liquid do documento fiscal
        anexo_fornecedor_tipo_doc_id:
          type: integer
          description: Tipo da certidão
        anexo_fornecedor_descricao:
          type: string
        anexo_fornecedor_numero:
          type: string
        anexo_fornecedor_serie:
          type: string
        anexo_fornecedor_chave_nfe:
          type: string
        anexo_fornecedor_valor:
          type: string
          example: "1000.00"
        anexos_fornecedor_data:
          type: string
          description: Data de emissão do documento fiscal
        anexo_fornecedor_emissao:
          type: string
          description: Emissão da certidão
        anexo_fornecedor_validade:
          type: string
        anexos_fornecedor_nome:
          type: string
          example: nota.pdf
        anexos_fornecedor_ext:
          type: string
          example: pdf
        anexo_link:
          type: string
          description: URL de download do arquivo

    # ---------- Ata de Registro de Preço ----------

    AtaRegistroPreco:
      type: object
      properties:
        licitacao_ata_id:
          type: integer
        licitacao_ata_num:
          type: integer
        licitacao_ata_ano:
          type: integer
        licitacao_ata_data:
          type: string
          format: date
        licitacao_ata_vencimento:
          type: string
          format: date
        licitacao_ata_vig_prorrogacao:
          type: string
          description: '"0000-00-00" = sem prorrogação'
        licitacao_ata_status:
          type: integer
          description: 1 Disponível, 2 Em Execução, 3 Vencida, 4 Finalizada, 5 Cancelada, 6 Indisponível
        licit_ata_item_valor:
          type: string
        licitacao_objeto:
          type: string
        licitacao_id:
          type: integer
        licitacao_num:
          type: integer
        licitacao_ano:
          type: integer
        licitacao_criterio_julgamento:
          type: string
        licitacao_modalidade:
          type: string
          description: Código da modalidade (6 = Pregão)
        licitacao_modalidade_num:
          type: integer
        licitacao_modalidade_ano:
          type: integer
        licitacao_ata_arquivo_link:
          type: string
        licitacao_ata_arquivo_nome:
          type: string
        licitacao_ata_arquivo_ext:
          type: string
        licitacao_ata_arquivo_link2:
          type: string
        licitacao_ata_arquivo_nome2:
          type: string
        licitacao_ata_arquivo_ext2:
          type: string
        licitacao_ata_ug_id:
          type: integer
        licitacao_ata_forn_id:
          type: integer
        ata_item:
          type: array
          items:
            type: object
            properties:
              produto_servico_codigo:
                type: string
              produto_servico_descricao:
                type: string
              licitacao_ata_item_qtd:
                type: string
              consumido:
                type: string
              licitacao_ata_item_vlr_un:
                type: string
              total:
                type: string
        nad:
          type: array
          items:
            type: object
            properties:
              nad_numero_ano:
                type: string
              nad_numero:
                type: string
              nad_data:
                type: string
                format: date
              nad_tipo:
                type: string
                description: 4 = Ata de Registro de Preços
              nad_fixacao_despesa_exe_cod_red:
                type: string
              orgao_unidade_setor:
                type: string
              nad_empenho_num_ano:
                type: string
              nad_prazo_entrega:
                type: string

security:
  - GXToken: []
