openapi: 3.0.0
info:
  title: GT Payroll Originator API
  description: |
    API pública do GT Payroll para parceiros (originators) gerenciarem employees, simulações, propostas e contratos de empréstimo consignado.

    ## Autenticação

    O token JWT é fornecido pelo administrador ao criar o originator.
    Inclua o token no header `Authorization: Bearer {token}` em todas as requisições.

    ## Fluxo de Originação

    1. **Criar Employee** - Cadastrar trabalhador
    2. **Autorização Dataprev** - Enviar autorização para consulta de dados
    3. **Consultar Margem** - Verificar margem consignável disponível
    4. **Criar Simulação** - Simular empréstimo
    5. **Criar Proposta** - Gerar proposta formal
    6. **Criar Contrato** - Formalizar contrato
  version: 1.0.0
  contact:
    name: GT Payroll Team
    email: suporte@giro.tech
servers:
  - url: 'https://consignado.staging.giro.tech'
    description: Ambiente de Staging
  - url: 'https://consignado.giro.tech'
    description: Ambiente de Produção
tags:
  - name: Employees
    description: Gerenciamento de employees (trabalhadores)
  - name: Authorization
    description: Autorização Dataprev para consulta de dados
  - name: Margin
    description: Consulta de margem consignável
  - name: Simulations
    description: Simulações de empréstimo
  - name: Proposals
    description: Propostas de empréstimo
  - name: Contracts
    description: Contratos de empréstimo
  - name: Disbursement
    description: Atualização de conta de desembolso
  - name: Banks
    description: Consulta de bancos disponíveis
  - name: Loan Limits
    description: Limites e parâmetros de empréstimo
  - name: Dataprev
    description: Dados Dataprev (transferências de pagamento e lançamentos contábeis)
  - name: Webhooks
    description: Configuração de webhook (subscription) para receber eventos
paths:
  /api/v1/originator/employees:
    post:
      summary: Criar Employee
      description: |
        Cria o cadastro de um trabalhador (employee) vinculado ao originator autenticado.
        Os dados enviados serão utilizados nas validações de elegibilidade, simulação, proposta e formalização contratual.
      tags:
        - Employees
      security:
        - BearerAuth: []
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required:
                - cpf
                - name
              properties:
                cpf:
                  type: string
                  pattern: '^\d{11}$'
                  minLength: 11
                  maxLength: 11
                  description: 'CPF do trabalhador contendo 11 dígitos numéricos, sem pontos ou traços.'
                name:
                  type: string
                  maxLength: 100
                  description: Nome civil completo do trabalhador conforme documento oficial.
                birthDate:
                  type: string
                  format: date
                  description: Data de nascimento no formato ISO (yyyy-MM-dd).
                motherName:
                  type: string
                  maxLength: 100
                  description: 'Nome completo da mãe, utilizado para validação cadastral.'
                gender:
                  type: string
                  enum:
                    - MALE
                    - FEMALE
                    - NOT_INFORMED
                  description: |
                    Gênero declarado pelo trabalhador.
                    | Valor | Significado |
                    |-------|-------------|
                    | MALE | Masculino |
                    | FEMALE | Feminino |
                    | NOT_INFORMED | Não informado |
                idDocumentType:
                  type: string
                  enum:
                    - MARITIME_CARD
                    - RESERVIST_CERTIFICATE
                    - DRIVERS_LICENSE
                    - WORK_CARD
                    - PASSPORT
                    - GENERAL_REGISTRY
                    - PROFESSIONAL_ID_CARD
                    - INDIGENOUS_BIRTH_REGISTRY
                    - ELECTRONIC_DRIVERS_LICENSE
                    - NATIONAL_ID
                    - PROVISIONAL_MIGRATION_REGISTRY
                    - MILITARY_ID_CARD
                    - FOREIGNER_REGISTRY
                  description: |
                    Tipo do documento de identificação (código retornado pela API).
                    | Valor | Significado |
                    |-------|-------------|
                    | MARITIME_CARD | Carteira de Marítimo |
                    | RESERVIST_CERTIFICATE | Certidão de Reservista |
                    | DRIVERS_LICENSE | CNH |
                    | WORK_CARD | CTPS |
                    | PASSPORT | Passaporte |
                    | GENERAL_REGISTRY | RG |
                    | PROFESSIONAL_ID_CARD | CIP |
                    | INDIGENOUS_BIRTH_REGISTRY | RANI |
                    | ELECTRONIC_DRIVERS_LICENSE | CNH-e |
                    | NATIONAL_ID | DNI |
                    | PROVISIONAL_MIGRATION_REGISTRY | DPRNM |
                    | MILITARY_ID_CARD | CIM |
                    | FOREIGNER_REGISTRY | RNE/CIE |
                idDocumentNumber:
                  type: string
                  maxLength: 50
                  description: Número do documento de identificação correspondente ao `idDocumentType`.
                isPoliticallyExposed:
                  type: boolean
                  description: Indica se o trabalhador é Pessoa Politicamente Exposta (PPE/PEP).
                phone:
                  type: string
                  maxLength: 20
                  description: 'Telefone de contato do trabalhador, preferencialmente com DDD.'
                email:
                  type: string
                  format: email
                  maxLength: 100
                  description: E-mail válido para comunicações operacionais e notificações.
                partnerName:
                  type: string
                  maxLength: 100
                  description: 'Nome do cônjuge ou parceiro, quando aplicável.'
              example:
                cpf: '12345678901'
                name: João da Silva
                birthDate: '1990-05-20'
                phone: '11987654321'
                email: joao.silva@email.com
            example:
              cpf: '12345678901'
              name: João da Silva
              birthDate: '1990-05-15'
              motherName: Maria da Silva
              gender: MALE
              phone: '11999999999'
              email: joao@email.com
      responses:
        '201':
          description: Employee criado com sucesso
          content:
            application/json:
              schema:
                type: object
                properties:
                  id:
                    type: integer
                    format: int64
                    description: Identificador interno do trabalhador no sistema.
                  publicId:
                    type: string
                    description: Identificador público (16 caracteres Base64 URL-safe). Ex. Kj8mP2xQ9nR4sT6v
                  cpf:
                    type: string
                    description: CPF do trabalhador cadastrado.
                  name:
                    type: string
                    description: Nome civil completo do trabalhador.
                  birthDate:
                    type: string
                    format: date
                    description: Data de nascimento registrada.
                  motherName:
                    type: string
                    description: Nome completo da mãe registrado.
                  gender:
                    type: string
                    enum:
                      - MALE
                      - FEMALE
                      - NOT_INFORMED
                    description: |
                      Gênero no cadastro.
                      | Valor | Significado |
                      |-------|-------------|
                      | MALE | Masculino |
                      | FEMALE | Feminino |
                      | NOT_INFORMED | Não informado |
                  idDocumentType:
                    type: string
                    enum:
                      - MARITIME_CARD
                      - RESERVIST_CERTIFICATE
                      - DRIVERS_LICENSE
                      - WORK_CARD
                      - PASSPORT
                      - GENERAL_REGISTRY
                      - PROFESSIONAL_ID_CARD
                      - INDIGENOUS_BIRTH_REGISTRY
                      - ELECTRONIC_DRIVERS_LICENSE
                      - NATIONAL_ID
                      - PROVISIONAL_MIGRATION_REGISTRY
                      - MILITARY_ID_CARD
                      - FOREIGNER_REGISTRY
                    description: Mesmos valores de CreateEmployeeRequest.idDocumentType (ver tabela).
                  idDocumentNumber:
                    type: string
                    description: Número do documento de identificação registrado.
                  isPoliticallyExposed:
                    type: boolean
                    description: Indicador de Pessoa Politicamente Exposta no cadastro do trabalhador.
                  phone:
                    type: string
                    description: Telefone de contato registrado.
                  email:
                    type: string
                    description: E-mail registrado para contato.
                  partnerName:
                    type: string
                    description: Nome do cônjuge/parceiro registrado.
                  status:
                    type: string
                    enum:
                      - ACTIVE
                      - INACTIVE
                      - REVOKED
                    description: |
                      Situação cadastral do trabalhador.
                      | Valor | Significado |
                      |-------|-------------|
                      | ACTIVE | Cadastro ativo, pode operar |
                      | INACTIVE | Cadastro inativo (ex.: desligado) |
                      | REVOKED | Acesso revogado pelo originator |
                  createdDate:
                    type: string
                    format: date-time
                    description: Data e hora de criação do cadastro no sistema (UTC).
                  lastModifiedDate:
                    type: string
                    format: date-time
                    description: Data e hora da última atualização do cadastro (UTC).
                example:
                  id: 15
                  publicId: Kj8mP2xQ9nR4sT6v
                  cpf: '12345678901'
                  name: João da Silva
                  birthDate: '1990-05-20'
                  phone: '11987654321'
                  email: joao.silva@email.com
                  status: ACTIVE
                  createdDate: '2025-01-10T14:30:00Z'
                  lastModifiedDate: '2025-01-10T14:30:00Z'
        '400':
          description: Dados inválidos
        '401':
          description: Não autenticado
        '403':
          description: Permissão insuficiente
  '/api/v1/originator/employees/{publicId}':
    get:
      summary: Buscar Employee
      description: Retorna os dados cadastrais de um trabalhador a partir do `publicId`.
      tags:
        - Employees
      security:
        - BearerAuth: []
      parameters:
        - name: publicId
          in: path
          required: true
          description: Public ID do employee
          schema:
            type: string
      responses:
        '200':
          description: Employee retornado com sucesso
          content:
            application/json:
              schema:
                type: object
                properties:
                  id:
                    type: integer
                    format: int64
                    description: Identificador interno do trabalhador no sistema.
                  publicId:
                    type: string
                    description: Identificador público (16 caracteres Base64 URL-safe). Ex. Kj8mP2xQ9nR4sT6v
                  cpf:
                    type: string
                    description: CPF do trabalhador cadastrado.
                  name:
                    type: string
                    description: Nome civil completo do trabalhador.
                  birthDate:
                    type: string
                    format: date
                    description: Data de nascimento registrada.
                  motherName:
                    type: string
                    description: Nome completo da mãe registrado.
                  gender:
                    type: string
                    enum:
                      - MALE
                      - FEMALE
                      - NOT_INFORMED
                    description: |
                      Gênero no cadastro.
                      | Valor | Significado |
                      |-------|-------------|
                      | MALE | Masculino |
                      | FEMALE | Feminino |
                      | NOT_INFORMED | Não informado |
                  idDocumentType:
                    type: string
                    enum:
                      - MARITIME_CARD
                      - RESERVIST_CERTIFICATE
                      - DRIVERS_LICENSE
                      - WORK_CARD
                      - PASSPORT
                      - GENERAL_REGISTRY
                      - PROFESSIONAL_ID_CARD
                      - INDIGENOUS_BIRTH_REGISTRY
                      - ELECTRONIC_DRIVERS_LICENSE
                      - NATIONAL_ID
                      - PROVISIONAL_MIGRATION_REGISTRY
                      - MILITARY_ID_CARD
                      - FOREIGNER_REGISTRY
                    description: Mesmos valores de CreateEmployeeRequest.idDocumentType (ver tabela).
                  idDocumentNumber:
                    type: string
                    description: Número do documento de identificação registrado.
                  isPoliticallyExposed:
                    type: boolean
                    description: Indicador de Pessoa Politicamente Exposta no cadastro do trabalhador.
                  phone:
                    type: string
                    description: Telefone de contato registrado.
                  email:
                    type: string
                    description: E-mail registrado para contato.
                  partnerName:
                    type: string
                    description: Nome do cônjuge/parceiro registrado.
                  status:
                    type: string
                    enum:
                      - ACTIVE
                      - INACTIVE
                      - REVOKED
                    description: |
                      Situação cadastral do trabalhador.
                      | Valor | Significado |
                      |-------|-------------|
                      | ACTIVE | Cadastro ativo, pode operar |
                      | INACTIVE | Cadastro inativo (ex.: desligado) |
                      | REVOKED | Acesso revogado pelo originator |
                  createdDate:
                    type: string
                    format: date-time
                    description: Data e hora de criação do cadastro no sistema (UTC).
                  lastModifiedDate:
                    type: string
                    format: date-time
                    description: Data e hora da última atualização do cadastro (UTC).
                example:
                  id: 15
                  publicId: Kj8mP2xQ9nR4sT6v
                  cpf: '12345678901'
                  name: João da Silva
                  birthDate: '1990-05-20'
                  phone: '11987654321'
                  email: joao.silva@email.com
                  status: ACTIVE
                  createdDate: '2025-01-10T14:30:00Z'
                  lastModifiedDate: '2025-01-10T14:30:00Z'
        '401':
          description: Não autenticado
        '403':
          description: Permissão insuficiente
        '404':
          description: Employee não encontrado
    put:
      summary: Atualizar Employee
      description: |
        Atualiza os dados cadastrais de um trabalhador existente.
        A atualização impacta os próximos fluxos de simulação e contratação.
      tags:
        - Employees
      security:
        - BearerAuth: []
      parameters:
        - name: publicId
          in: path
          required: true
          description: Public ID do employee
          schema:
            type: string
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required:
                - cpf
                - name
              properties:
                cpf:
                  type: string
                  pattern: '^\d{11}$'
                  minLength: 11
                  maxLength: 11
                  description: 'CPF do trabalhador contendo 11 dígitos numéricos, sem pontos ou traços.'
                name:
                  type: string
                  maxLength: 100
                  description: Nome civil completo do trabalhador conforme documento oficial.
                birthDate:
                  type: string
                  format: date
                  description: Data de nascimento no formato ISO (yyyy-MM-dd).
                motherName:
                  type: string
                  maxLength: 100
                  description: 'Nome completo da mãe, utilizado para validação cadastral.'
                gender:
                  type: string
                  enum:
                    - MALE
                    - FEMALE
                    - NOT_INFORMED
                  description: |
                    Gênero declarado pelo trabalhador.
                    | Valor | Significado |
                    |-------|-------------|
                    | MALE | Masculino |
                    | FEMALE | Feminino |
                    | NOT_INFORMED | Não informado |
                idDocumentType:
                  type: string
                  enum:
                    - MARITIME_CARD
                    - RESERVIST_CERTIFICATE
                    - DRIVERS_LICENSE
                    - WORK_CARD
                    - PASSPORT
                    - GENERAL_REGISTRY
                    - PROFESSIONAL_ID_CARD
                    - INDIGENOUS_BIRTH_REGISTRY
                    - ELECTRONIC_DRIVERS_LICENSE
                    - NATIONAL_ID
                    - PROVISIONAL_MIGRATION_REGISTRY
                    - MILITARY_ID_CARD
                    - FOREIGNER_REGISTRY
                  description: |
                    Tipo do documento de identificação (código retornado pela API).
                    | Valor | Significado |
                    |-------|-------------|
                    | MARITIME_CARD | Carteira de Marítimo |
                    | RESERVIST_CERTIFICATE | Certidão de Reservista |
                    | DRIVERS_LICENSE | CNH |
                    | WORK_CARD | CTPS |
                    | PASSPORT | Passaporte |
                    | GENERAL_REGISTRY | RG |
                    | PROFESSIONAL_ID_CARD | CIP |
                    | INDIGENOUS_BIRTH_REGISTRY | RANI |
                    | ELECTRONIC_DRIVERS_LICENSE | CNH-e |
                    | NATIONAL_ID | DNI |
                    | PROVISIONAL_MIGRATION_REGISTRY | DPRNM |
                    | MILITARY_ID_CARD | CIM |
                    | FOREIGNER_REGISTRY | RNE/CIE |
                idDocumentNumber:
                  type: string
                  maxLength: 50
                  description: Número do documento de identificação correspondente ao `idDocumentType`.
                isPoliticallyExposed:
                  type: boolean
                  description: Indica se o trabalhador é Pessoa Politicamente Exposta (PPE/PEP).
                phone:
                  type: string
                  maxLength: 20
                  description: 'Telefone de contato do trabalhador, preferencialmente com DDD.'
                email:
                  type: string
                  format: email
                  maxLength: 100
                  description: E-mail válido para comunicações operacionais e notificações.
                partnerName:
                  type: string
                  maxLength: 100
                  description: 'Nome do cônjuge ou parceiro, quando aplicável.'
              example:
                cpf: '12345678901'
                name: João da Silva
                birthDate: '1990-05-20'
                phone: '11987654321'
                email: joao.silva@email.com
            example:
              cpf: '12345678901'
              name: João da Silva
              birthDate: '1990-05-15'
              motherName: Maria da Silva
              gender: MALE
              phone: '11999999999'
              email: joao@email.com
      responses:
        '200':
          description: Employee atualizado com sucesso
          content:
            application/json:
              schema:
                type: object
                properties:
                  id:
                    type: integer
                    format: int64
                    description: Identificador interno do trabalhador no sistema.
                  publicId:
                    type: string
                    description: Identificador público (16 caracteres Base64 URL-safe). Ex. Kj8mP2xQ9nR4sT6v
                  cpf:
                    type: string
                    description: CPF do trabalhador cadastrado.
                  name:
                    type: string
                    description: Nome civil completo do trabalhador.
                  birthDate:
                    type: string
                    format: date
                    description: Data de nascimento registrada.
                  motherName:
                    type: string
                    description: Nome completo da mãe registrado.
                  gender:
                    type: string
                    enum:
                      - MALE
                      - FEMALE
                      - NOT_INFORMED
                    description: |
                      Gênero no cadastro.
                      | Valor | Significado |
                      |-------|-------------|
                      | MALE | Masculino |
                      | FEMALE | Feminino |
                      | NOT_INFORMED | Não informado |
                  idDocumentType:
                    type: string
                    enum:
                      - MARITIME_CARD
                      - RESERVIST_CERTIFICATE
                      - DRIVERS_LICENSE
                      - WORK_CARD
                      - PASSPORT
                      - GENERAL_REGISTRY
                      - PROFESSIONAL_ID_CARD
                      - INDIGENOUS_BIRTH_REGISTRY
                      - ELECTRONIC_DRIVERS_LICENSE
                      - NATIONAL_ID
                      - PROVISIONAL_MIGRATION_REGISTRY
                      - MILITARY_ID_CARD
                      - FOREIGNER_REGISTRY
                    description: Mesmos valores de CreateEmployeeRequest.idDocumentType (ver tabela).
                  idDocumentNumber:
                    type: string
                    description: Número do documento de identificação registrado.
                  isPoliticallyExposed:
                    type: boolean
                    description: Indicador de Pessoa Politicamente Exposta no cadastro do trabalhador.
                  phone:
                    type: string
                    description: Telefone de contato registrado.
                  email:
                    type: string
                    description: E-mail registrado para contato.
                  partnerName:
                    type: string
                    description: Nome do cônjuge/parceiro registrado.
                  status:
                    type: string
                    enum:
                      - ACTIVE
                      - INACTIVE
                      - REVOKED
                    description: |
                      Situação cadastral do trabalhador.
                      | Valor | Significado |
                      |-------|-------------|
                      | ACTIVE | Cadastro ativo, pode operar |
                      | INACTIVE | Cadastro inativo (ex.: desligado) |
                      | REVOKED | Acesso revogado pelo originator |
                  createdDate:
                    type: string
                    format: date-time
                    description: Data e hora de criação do cadastro no sistema (UTC).
                  lastModifiedDate:
                    type: string
                    format: date-time
                    description: Data e hora da última atualização do cadastro (UTC).
                example:
                  id: 15
                  publicId: Kj8mP2xQ9nR4sT6v
                  cpf: '12345678901'
                  name: João da Silva
                  birthDate: '1990-05-20'
                  phone: '11987654321'
                  email: joao.silva@email.com
                  status: ACTIVE
                  createdDate: '2025-01-10T14:30:00Z'
                  lastModifiedDate: '2025-01-10T14:30:00Z'
        '400':
          description: Dados inválidos
        '401':
          description: Não autenticado
        '403':
          description: Permissão insuficiente
        '404':
          description: Employee não encontrado
    delete:
      summary: Desativar Employee
      description: Desativa o trabalhador para impedir novas operações de originação.
      tags:
        - Employees
      security:
        - BearerAuth: []
      parameters:
        - name: publicId
          in: path
          required: true
          description: Public ID do employee
          schema:
            type: string
      responses:
        '204':
          description: Employee desativado com sucesso
        '401':
          description: Não autenticado
        '403':
          description: Permissão insuficiente
        '404':
          description: Employee não encontrado
  '/api/v1/originator/employees/by-cpf/{cpf}':
    get:
      summary: Verificar Employee por CPF
      description: |
        Verifica se existe um employee cadastrado para o CPF informado no originator autenticado.
        Retorna o `publicId` quando encontrado.
      tags:
        - Employees
      security:
        - BearerAuth: []
      parameters:
        - name: cpf
          in: path
          required: true
          description: CPF do trabalhador (11 dígitos numéricos)
          schema:
            type: string
            pattern: '^\d{11}$'
      responses:
        '200':
          description: Resultado da verificação
          content:
            application/json:
              schema:
                type: object
                properties:
                  exists:
                    type: boolean
                    description: Indica se o CPF possui um employee cadastrado para o originator.
                  publicId:
                    type: string
                    description: Identificador público do employee (16 caracteres Base64 URL-safe). Presente apenas quando exists é true.
                required:
                  - exists
                example:
                  exists: true
                  publicId: Kj8mP2xQ9nR4sT6v
              examples:
                found:
                  summary: Employee encontrado
                  value:
                    exists: true
                    publicId: Kj8mP2xQ9nR4sT6v
                notFound:
                  summary: Employee não encontrado
                  value:
                    exists: false
        '400':
          description: CPF com formato inválido
        '401':
          description: Não autenticado
        '403':
          description: Permissão insuficiente
  '/api/v1/originator/employees/{cpf}/authorization/status':
    get:
      summary: Status de Autorização
      description: Consulta status de autorização Dataprev de um employee
      tags:
        - Authorization
      security:
        - BearerAuth: []
      parameters:
        - name: cpf
          in: path
          required: true
          description: CPF do employee (11 dígitos)
          schema:
            type: string
            pattern: '^\d{11}$'
      responses:
        '200':
          description: Status retornado com sucesso
          content:
            application/json:
              schema:
                type: object
                properties:
                  status:
                    type: string
                    enum:
                      - NOT_STARTED
                      - PENDING_SIGNATURE
                      - PENDING_SUBMISSION
                      - AUTHORIZED
                      - EXPIRED
                    description: |
                      Status da autorização Dataprev.
                      | Valor | Significado |
                      |-------|-------------|
                      | NOT_STARTED | Processo não iniciado |
                      | PENDING_SIGNATURE | Aguardando assinatura do termo |
                      | PENDING_SUBMISSION | Aguardando envio ao Dataprev |
                      | AUTHORIZED | Autorização concluída (termo assinado) |
                      | EXPIRED | Prazo de assinatura expirado |
                  message:
                    type: string
                  signUrl:
                    type: string
                  nsu:
                    type: string
                  expiresAt:
                    type: string
                    format: date-time
                  daysRemaining:
                    type: integer
                example:
                  status: PENDING_SIGNATURE
                  message: Aguardando assinatura do trabalhador.
                  signUrl: 'https://sign.example.com/auth/abc123'
                  nsu: '20250115000001'
                  expiresAt: '2025-01-22T23:59:59Z'
                  daysRemaining: 7
        '401':
          description: Não autenticado
        '403':
          description: Permissão insuficiente
        '404':
          description: Employee não encontrado
  '/api/v1/originator/employees/{cpf}/authorization':
    post:
      summary: Enviar Autorização
      description: Envia autorização para Dataprev
      tags:
        - Authorization
      security:
        - BearerAuth: []
      parameters:
        - name: cpf
          in: path
          required: true
          description: CPF do employee (11 dígitos)
          schema:
            type: string
            pattern: '^\d{11}$'
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required:
                - authorizationDocumentNsu
              properties:
                authorizationDocumentNsu:
                  type: string
                  description: NSU do documento de autorização
              example:
                authorizationDocumentNsu: '20250115000001'
            example:
              authorizationDocumentNsu: NSU123456
      responses:
        '202':
          description: Autorização enviada com sucesso
          content:
            application/json:
              schema:
                type: object
                properties:
                  status:
                    type: string
                    enum:
                      - PROCESSING
                      - SUCCESS
                      - ERROR
                    description: |
                      Resultado do envio da autorização.
                      | Valor | Significado |
                      |-------|-------------|
                      | PROCESSING | Em processamento |
                      | SUCCESS | Enviado com sucesso |
                      | ERROR | Erro no envio |
                  message:
                    type: string
                  nsu:
                    type: string
                example:
                  status: SUCCESS
                  message: Autorização enviada com sucesso.
                  nsu: '20250115000001'
        '400':
          description: Dados inválidos
        '401':
          description: Não autenticado
        '403':
          description: Permissão insuficiente
  '/api/v1/originator/employees/{cpf}/authorization/resend':
    post:
      summary: Reenviar Link de Autorização
      description: Reenvia link de assinatura de autorização
      tags:
        - Authorization
      security:
        - BearerAuth: []
      parameters:
        - name: cpf
          in: path
          required: true
          description: CPF do employee (11 dígitos)
          schema:
            type: string
            pattern: '^\d{11}$'
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required:
                - nsu
              properties:
                nsu:
                  type: string
                  description: NSU do documento
              example:
                nsu: '20250115000001'
            example:
              nsu: NSU123456
      responses:
        '200':
          description: Link reenviado com sucesso
          content:
            application/json:
              schema:
                type: object
                properties:
                  status:
                    type: string
                    enum:
                      - SENT
                      - FAILED
                      - DOCUMENT_NOT_FOUND
                      - INVALID_STATUS
                    description: |
                      Resultado do reenvio do link de assinatura.
                      | Valor | Significado |
                      |-------|-------------|
                      | SENT | Link reenviado com sucesso |
                      | FAILED | Falha no reenvio |
                      | DOCUMENT_NOT_FOUND | Documento não encontrado |
                      | INVALID_STATUS | Status inválido para reenvio |
                  message:
                    type: string
                  nsu:
                    type: string
                  signUrl:
                    type: string
                example:
                  status: SENT
                  message: Link de assinatura reenviado com sucesso.
                  nsu: '20250115000001'
                  signUrl: 'https://sign.example.com/auth/abc123'
        '400':
          description: Dados inválidos
        '401':
          description: Não autenticado
        '403':
          description: Permissão insuficiente
  '/api/v1/originator/employees/{cpf}/margin':
    get:
      summary: Consultar Margem
      description: Consulta margem consignável de um employee
      tags:
        - Margin
      security:
        - BearerAuth: []
      parameters:
        - name: cpf
          in: path
          required: true
          description: CPF do employee (11 dígitos)
          schema:
            type: string
            pattern: '^\d{11}$'
      responses:
        '200':
          description: Margem retornada com sucesso
          content:
            application/json:
              schema:
                type: object
                properties:
                  status:
                    type: string
                    enum:
                      - OK
                      - PENDING
                      - PROCESSING
                      - EXPIRED
                      - TERM_EXPIRED
                      - NO_BONDS
                      - NOT_ELIGIBLE
                      - NO_MARGIN
                      - ERROR
                    description: |
                      Status da consulta de margem no convênio.
                      | Valor | Significado |
                      |-------|-------------|
                      | OK | Margem disponível e elegível |
                      | PENDING | Consulta em análise |
                      | PROCESSING | Processando dados no convênio |
                      | EXPIRED | Margem expirada (prazo Dataprev) |
                      | TERM_EXPIRED | Prazo do contrato expirado |
                      | NO_BONDS | Sem vínculos ativos |
                      | NOT_ELIGIBLE | Não elegível às regras do produto |
                      | NO_MARGIN | Sem margem disponível |
                      | ERROR | Erro na consulta |
                  reason:
                    type: string
                  employmentRelationships:
                    type: array
                    items:
                      type: object
                      properties:
                        id:
                          type: integer
                          format: int64
                          example: 7
                        registrationNumber:
                          type: string
                          example: '12345678901'
                        employerTaxId:
                          type: string
                          example: '12345678000199'
                        employerName:
                          type: string
                          example: Empresa Exemplo Ltda
                        admissionDate:
                          type: string
                          format: date
                          example: '2020-03-15'
                        status:
                          type: string
                          enum:
                            - ACTIVE
                            - INACTIVE
                            - TERMINATED
                            - SUSPENDED
                          description: |
                            Status do vínculo empregatício no convênio.
                            | Valor | Significado |
                            |-------|-------------|
                            | ACTIVE | Vínculo ativo |
                            | INACTIVE | Vínculo inativo |
                            | TERMINATED | Vínculo encerrado |
                            | SUSPENDED | Vínculo suspenso (ex.: afastamento) |
                          example: ACTIVE
                        totalEarnings:
                          type: number
                          format: decimal
                          description: Remuneração total em reais (decimal com 2 casas decimais).
                          example: 4850.73
                        marginBase:
                          type: number
                          format: decimal
                          description: Base de margem em reais (decimal com 2 casas decimais).
                          example: 4850.73
                        availableMargin:
                          type: number
                          format: decimal
                          description: Margem disponível em reais (decimal com 2 casas decimais).
                          example: 1697.76
                        usableMargin:
                          type: number
                          format: decimal
                          description: Margem utilizável em reais (decimal com 2 casas decimais).
                          example: 1697.76
                        isEligible:
                          type: boolean
                          example: true
                      example:
                        id: 7
                        registrationNumber: '12345678901'
                        employerTaxId: '12345678000199'
                        employerName: Empresa Exemplo Ltda
                        admissionDate: '2020-03-15'
                        status: ACTIVE
                        totalEarnings: 4850.73
                        marginBase: 4850.73
                        availableMargin: 1697.76
                        usableMargin: 1697.76
                        isEligible: true
                example:
                  status: OK
                  reason: null
                  employmentRelationships:
                    - id: 7
                      registrationNumber: '12345678901'
                      employerTaxId: '12345678000199'
                      employerName: Empresa Exemplo Ltda
                      admissionDate: '2020-03-15'
                      status: ACTIVE
                      totalEarnings: 4850.73
                      marginBase: 4850.73
                      availableMargin: 1697.76
                      usableMargin: 1697.76
                      isEligible: true
        '202':
          description: Consulta em processamento
          content:
            application/json:
              schema:
                type: object
                properties:
                  status:
                    type: string
                    enum:
                      - OK
                      - PENDING
                      - PROCESSING
                      - EXPIRED
                      - TERM_EXPIRED
                      - NO_BONDS
                      - NOT_ELIGIBLE
                      - NO_MARGIN
                      - ERROR
                    description: |
                      Status da consulta de margem no convênio.
                      | Valor | Significado |
                      |-------|-------------|
                      | OK | Margem disponível e elegível |
                      | PENDING | Consulta em análise |
                      | PROCESSING | Processando dados no convênio |
                      | EXPIRED | Margem expirada (prazo Dataprev) |
                      | TERM_EXPIRED | Prazo do contrato expirado |
                      | NO_BONDS | Sem vínculos ativos |
                      | NOT_ELIGIBLE | Não elegível às regras do produto |
                      | NO_MARGIN | Sem margem disponível |
                      | ERROR | Erro na consulta |
                  reason:
                    type: string
                  employmentRelationships:
                    type: array
                    items:
                      type: object
                      properties:
                        id:
                          type: integer
                          format: int64
                          example: 7
                        registrationNumber:
                          type: string
                          example: '12345678901'
                        employerTaxId:
                          type: string
                          example: '12345678000199'
                        employerName:
                          type: string
                          example: Empresa Exemplo Ltda
                        admissionDate:
                          type: string
                          format: date
                          example: '2020-03-15'
                        status:
                          type: string
                          enum:
                            - ACTIVE
                            - INACTIVE
                            - TERMINATED
                            - SUSPENDED
                          description: |
                            Status do vínculo empregatício no convênio.
                            | Valor | Significado |
                            |-------|-------------|
                            | ACTIVE | Vínculo ativo |
                            | INACTIVE | Vínculo inativo |
                            | TERMINATED | Vínculo encerrado |
                            | SUSPENDED | Vínculo suspenso (ex.: afastamento) |
                          example: ACTIVE
                        totalEarnings:
                          type: number
                          format: decimal
                          description: Remuneração total em reais (decimal com 2 casas decimais).
                          example: 4850.73
                        marginBase:
                          type: number
                          format: decimal
                          description: Base de margem em reais (decimal com 2 casas decimais).
                          example: 4850.73
                        availableMargin:
                          type: number
                          format: decimal
                          description: Margem disponível em reais (decimal com 2 casas decimais).
                          example: 1697.76
                        usableMargin:
                          type: number
                          format: decimal
                          description: Margem utilizável em reais (decimal com 2 casas decimais).
                          example: 1697.76
                        isEligible:
                          type: boolean
                          example: true
                      example:
                        id: 7
                        registrationNumber: '12345678901'
                        employerTaxId: '12345678000199'
                        employerName: Empresa Exemplo Ltda
                        admissionDate: '2020-03-15'
                        status: ACTIVE
                        totalEarnings: 4850.73
                        marginBase: 4850.73
                        availableMargin: 1697.76
                        usableMargin: 1697.76
                        isEligible: true
                example:
                  status: OK
                  reason: null
                  employmentRelationships:
                    - id: 7
                      registrationNumber: '12345678901'
                      employerTaxId: '12345678000199'
                      employerName: Empresa Exemplo Ltda
                      admissionDate: '2020-03-15'
                      status: ACTIVE
                      totalEarnings: 4850.73
                      marginBase: 4850.73
                      availableMargin: 1697.76
                      usableMargin: 1697.76
                      isEligible: true
        '401':
          description: Não autenticado
        '403':
          description: Permissão insuficiente
        '404':
          description: Employee não encontrado
  '/api/v1/originator/employees/{publicId}/simulations':
    post:
      summary: Criar Simulação
      description: |
        Cria uma nova simulação de empréstimo para um vínculo empregatício do trabalhador.
        O primeiro vencimento segue o calendário Dataprev (sempre dia 25): até dia 20 do `loanDate` → +2 meses; dia 21 em diante → +3 meses.
        Se `firstDueDate` for enviado como `null`, o sistema aplica automaticamente essa regra. Se informado, deve respeitar o calendário e o dia 25.
      tags:
        - Simulations
      security:
        - BearerAuth: []
      parameters:
        - name: publicId
          in: path
          required: true
          description: Public ID do employee
          schema:
            type: string
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required:
                - employmentRelationshipId
                - loanAmount
                - installmentCount
                - monthlyInterestRate
                - loanDate
                - feesAmount
              properties:
                employmentRelationshipId:
                  type: integer
                  format: int64
                  description: Identificador do vínculo empregatício usado como base da simulação.
                loanAmount:
                  type: number
                  format: decimal
                  minimum: 0.01
                  description: Valor líquido solicitado em reais (decimal com 2 casas decimais). Ex. 5000.00
                installmentCount:
                  type: integer
                  minimum: 1
                  description: Quantidade de parcelas desejada para pagamento do empréstimo.
                monthlyInterestRate:
                  type: number
                  format: decimal
                  minimum: 0.01
                  description: Taxa de juros mensal nominal em percentual (decimal com 4 casas decimais). Ex. 4.0
                loanDate:
                  type: string
                  format: date
                  description: Data base de contratação considerada para cálculo da operação.
                firstDueDate:
                  type: string
                  format: date
                  nullable: true
                  description: |
                    Data do primeiro vencimento (sempre dia 25).
                    - Se informado, deve seguir o calendário Dataprev: data mínima conforme competência (dia do `loanDate` até 20 → +2 meses; dia 21 em diante → +3 meses).
                    - Se `null` (ou omitido), o sistema aplica automaticamente o primeiro vencimento no dia 25 conforme o calendário Dataprev.
                feesAmount:
                  type: number
                  format: decimal
                  minimum: 0
                  description: Valor total de tarifas em reais (decimal com 2 casas decimais). Ex. 0 ou 122.22
              example:
                employmentRelationshipId: 7
                loanAmount: 5000
                installmentCount: 12
                monthlyInterestRate: 4
                loanDate: '2025-01-15'
                firstDueDate: '2025-04-25'
                feesAmount: 0
            example:
              employmentRelationshipId: 1
              loanAmount: 5750
              installmentCount: 12
              monthlyInterestRate: 1.97
              loanDate: '2024-02-01'
              firstDueDate: null
              feesAmount: 122.22
      responses:
        '201':
          description: Simulação criada com sucesso
          content:
            application/json:
              schema:
                type: object
                properties:
                  id:
                    type: integer
                    format: int64
                    description: Identificador interno da simulação criada.
                    example: 42
                  employeeId:
                    type: integer
                    format: int64
                    description: Identificador interno do trabalhador associado à simulação.
                    example: 15
                  employmentRelationshipId:
                    type: integer
                    format: int64
                    description: Identificador do vínculo empregatício usado no cálculo.
                    example: 7
                  requestedAmount:
                    type: number
                    format: decimal
                    description: Valor solicitado em reais (decimal com 2 casas decimais).
                    example: 5750
                  installmentCount:
                    type: integer
                    description: Quantidade de parcelas calculada para a proposta simulada.
                    example: 12
                  monthlyInterestRate:
                    type: number
                    format: decimal
                    description: Taxa de juros mensal em percentual (decimal com 4 casas decimais).
                    example: 1.97
                  termMonths:
                    type: integer
                    description: Prazo total da operação em meses.
                    example: 12
                  installmentAmount:
                    type: number
                    format: decimal
                    description: Parcela mensal em reais (decimal com 2 casas decimais).
                    example: 593.78
                  totalAmount:
                    type: number
                    format: decimal
                    description: Valor total da operação em reais (decimal com 2 casas decimais).
                    example: 7125.36
                  monthlyEffectiveCost:
                    type: number
                    format: decimal
                    description: CET mensal em percentual (decimal com 4 casas decimais).
                    example: 2.43
                  annualEffectiveCost:
                    type: number
                    format: decimal
                    description: CET anual em percentual (decimal com 4 casas decimais).
                    example: 33.18
                  iofAmount:
                    type: number
                    format: decimal
                    description: IOF estimado em reais (decimal com 2 casas decimais).
                    example: 63.42
                  feesAmount:
                    type: number
                    format: decimal
                    description: Tarifas (TAC + seguro) em reais (decimal com 2 casas decimais).
                    example: 122.22
                  status:
                    type: string
                    enum:
                      - EPHEMERAL
                      - CONVERTED_TO_PROPOSAL
                      - EXPIRED
                    description: |
                      Situação da simulação no ciclo de originação.
                      | Valor | Significado |
                      |-------|-------------|
                      | EPHEMERAL | Simulação ativa, ainda não convertida em proposta |
                      | CONVERTED_TO_PROPOSAL | Simulação já convertida em proposta |
                      | EXPIRED | Simulação expirada (prazo de validade ultrapassado) |
                    example: EPHEMERAL
                  expiresAt:
                    type: string
                    format: date-time
                    description: Data e hora limite de validade da simulação (UTC).
                    example: '2024-02-08T10:00:00Z'
                  source:
                    type: string
                    description: 'Origem da simulação no sistema (por exemplo, ORIGINATOR).'
                    example: ORIGINATOR
                  createdDate:
                    type: string
                    format: date-time
                    description: Data e hora de criação da simulação (UTC).
                    example: '2024-02-01T10:00:00Z'
                example:
                  id: 42
                  employeeId: 15
                  employmentRelationshipId: 7
                  requestedAmount: 5000
                  installmentCount: 12
                  monthlyInterestRate: 4
                  termMonths: 12
                  installmentAmount: 593.78
                  totalAmount: 7125.36
                  monthlyEffectiveCost: 2.43
                  annualEffectiveCost: 33.18
                  iofAmount: 63.42
                  feesAmount: 0
                  status: EPHEMERAL
                  expiresAt: '2025-01-16T10:00:00Z'
                  source: ORIGINATOR
                  createdDate: '2025-01-15T10:00:00Z'
        '400':
          description: Dados inválidos
        '401':
          description: Não autenticado
        '403':
          description: Permissão insuficiente
    get:
      summary: Listar Simulações
      description: Lista as simulações já registradas para o trabalhador informado.
      tags:
        - Simulations
      security:
        - BearerAuth: []
      parameters:
        - name: publicId
          in: path
          required: true
          description: Public ID do employee
          schema:
            type: string
      responses:
        '200':
          description: Simulações retornadas com sucesso
          content:
            application/json:
              schema:
                type: array
                items:
                  type: object
                  properties:
                    id:
                      type: integer
                      format: int64
                      description: Identificador interno da simulação criada.
                      example: 42
                    employeeId:
                      type: integer
                      format: int64
                      description: Identificador interno do trabalhador associado à simulação.
                      example: 15
                    employmentRelationshipId:
                      type: integer
                      format: int64
                      description: Identificador do vínculo empregatício usado no cálculo.
                      example: 7
                    requestedAmount:
                      type: number
                      format: decimal
                      description: Valor solicitado em reais (decimal com 2 casas decimais).
                      example: 5750
                    installmentCount:
                      type: integer
                      description: Quantidade de parcelas calculada para a proposta simulada.
                      example: 12
                    monthlyInterestRate:
                      type: number
                      format: decimal
                      description: Taxa de juros mensal em percentual (decimal com 4 casas decimais).
                      example: 1.97
                    termMonths:
                      type: integer
                      description: Prazo total da operação em meses.
                      example: 12
                    installmentAmount:
                      type: number
                      format: decimal
                      description: Parcela mensal em reais (decimal com 2 casas decimais).
                      example: 593.78
                    totalAmount:
                      type: number
                      format: decimal
                      description: Valor total da operação em reais (decimal com 2 casas decimais).
                      example: 7125.36
                    monthlyEffectiveCost:
                      type: number
                      format: decimal
                      description: CET mensal em percentual (decimal com 4 casas decimais).
                      example: 2.43
                    annualEffectiveCost:
                      type: number
                      format: decimal
                      description: CET anual em percentual (decimal com 4 casas decimais).
                      example: 33.18
                    iofAmount:
                      type: number
                      format: decimal
                      description: IOF estimado em reais (decimal com 2 casas decimais).
                      example: 63.42
                    feesAmount:
                      type: number
                      format: decimal
                      description: Tarifas (TAC + seguro) em reais (decimal com 2 casas decimais).
                      example: 122.22
                    status:
                      type: string
                      enum:
                        - EPHEMERAL
                        - CONVERTED_TO_PROPOSAL
                        - EXPIRED
                      description: |
                        Situação da simulação no ciclo de originação.
                        | Valor | Significado |
                        |-------|-------------|
                        | EPHEMERAL | Simulação ativa, ainda não convertida em proposta |
                        | CONVERTED_TO_PROPOSAL | Simulação já convertida em proposta |
                        | EXPIRED | Simulação expirada (prazo de validade ultrapassado) |
                      example: EPHEMERAL
                    expiresAt:
                      type: string
                      format: date-time
                      description: Data e hora limite de validade da simulação (UTC).
                      example: '2024-02-08T10:00:00Z'
                    source:
                      type: string
                      description: 'Origem da simulação no sistema (por exemplo, ORIGINATOR).'
                      example: ORIGINATOR
                    createdDate:
                      type: string
                      format: date-time
                      description: Data e hora de criação da simulação (UTC).
                      example: '2024-02-01T10:00:00Z'
                  example:
                    id: 42
                    employeeId: 15
                    employmentRelationshipId: 7
                    requestedAmount: 5000
                    installmentCount: 12
                    monthlyInterestRate: 4
                    termMonths: 12
                    installmentAmount: 593.78
                    totalAmount: 7125.36
                    monthlyEffectiveCost: 2.43
                    annualEffectiveCost: 33.18
                    iofAmount: 63.42
                    feesAmount: 0
                    status: EPHEMERAL
                    expiresAt: '2025-01-16T10:00:00Z'
                    source: ORIGINATOR
                    createdDate: '2025-01-15T10:00:00Z'
        '401':
          description: Não autenticado
        '403':
          description: Permissão insuficiente
  '/api/v1/originator/simulations/{id}':
    get:
      summary: Buscar Simulação
      description: Retorna os detalhes de uma simulação específica por identificador.
      tags:
        - Simulations
      security:
        - BearerAuth: []
      parameters:
        - name: id
          in: path
          required: true
          description: ID da simulação
          schema:
            type: integer
            format: int64
      responses:
        '200':
          description: Simulação retornada com sucesso
          content:
            application/json:
              schema:
                type: object
                properties:
                  id:
                    type: integer
                    format: int64
                    description: Identificador interno da simulação criada.
                    example: 42
                  employeeId:
                    type: integer
                    format: int64
                    description: Identificador interno do trabalhador associado à simulação.
                    example: 15
                  employmentRelationshipId:
                    type: integer
                    format: int64
                    description: Identificador do vínculo empregatício usado no cálculo.
                    example: 7
                  requestedAmount:
                    type: number
                    format: decimal
                    description: Valor solicitado em reais (decimal com 2 casas decimais).
                    example: 5750
                  installmentCount:
                    type: integer
                    description: Quantidade de parcelas calculada para a proposta simulada.
                    example: 12
                  monthlyInterestRate:
                    type: number
                    format: decimal
                    description: Taxa de juros mensal em percentual (decimal com 4 casas decimais).
                    example: 1.97
                  termMonths:
                    type: integer
                    description: Prazo total da operação em meses.
                    example: 12
                  installmentAmount:
                    type: number
                    format: decimal
                    description: Parcela mensal em reais (decimal com 2 casas decimais).
                    example: 593.78
                  totalAmount:
                    type: number
                    format: decimal
                    description: Valor total da operação em reais (decimal com 2 casas decimais).
                    example: 7125.36
                  monthlyEffectiveCost:
                    type: number
                    format: decimal
                    description: CET mensal em percentual (decimal com 4 casas decimais).
                    example: 2.43
                  annualEffectiveCost:
                    type: number
                    format: decimal
                    description: CET anual em percentual (decimal com 4 casas decimais).
                    example: 33.18
                  iofAmount:
                    type: number
                    format: decimal
                    description: IOF estimado em reais (decimal com 2 casas decimais).
                    example: 63.42
                  feesAmount:
                    type: number
                    format: decimal
                    description: Tarifas (TAC + seguro) em reais (decimal com 2 casas decimais).
                    example: 122.22
                  status:
                    type: string
                    enum:
                      - EPHEMERAL
                      - CONVERTED_TO_PROPOSAL
                      - EXPIRED
                    description: |
                      Situação da simulação no ciclo de originação.
                      | Valor | Significado |
                      |-------|-------------|
                      | EPHEMERAL | Simulação ativa, ainda não convertida em proposta |
                      | CONVERTED_TO_PROPOSAL | Simulação já convertida em proposta |
                      | EXPIRED | Simulação expirada (prazo de validade ultrapassado) |
                    example: EPHEMERAL
                  expiresAt:
                    type: string
                    format: date-time
                    description: Data e hora limite de validade da simulação (UTC).
                    example: '2024-02-08T10:00:00Z'
                  source:
                    type: string
                    description: 'Origem da simulação no sistema (por exemplo, ORIGINATOR).'
                    example: ORIGINATOR
                  createdDate:
                    type: string
                    format: date-time
                    description: Data e hora de criação da simulação (UTC).
                    example: '2024-02-01T10:00:00Z'
                example:
                  id: 42
                  employeeId: 15
                  employmentRelationshipId: 7
                  requestedAmount: 5000
                  installmentCount: 12
                  monthlyInterestRate: 4
                  termMonths: 12
                  installmentAmount: 593.78
                  totalAmount: 7125.36
                  monthlyEffectiveCost: 2.43
                  annualEffectiveCost: 33.18
                  iofAmount: 63.42
                  feesAmount: 0
                  status: EPHEMERAL
                  expiresAt: '2025-01-16T10:00:00Z'
                  source: ORIGINATOR
                  createdDate: '2025-01-15T10:00:00Z'
        '401':
          description: Não autenticado
        '403':
          description: Permissão insuficiente
        '404':
          description: Simulação não encontrada
  '/api/v1/originator/employees/{publicId}/proposals':
    post:
      summary: Criar Proposta
      description: Cria uma nova proposta de empréstimo
      tags:
        - Proposals
      security:
        - BearerAuth: []
      parameters:
        - name: publicId
          in: path
          required: true
          description: Public ID do employee
          schema:
            type: string
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required:
                - loanAmount
                - financedAmount
                - totalInterestAmount
                - monthlyInterestRate
                - monthlyEffectiveCost
                - annualEffectiveCost
                - disbursementAmount
                - insuranceAmount
                - iofAmount
                - tacAmount
                - installmentCount
                - dueDate
              properties:
                simulationId:
                  type: integer
                  format: int64
                employmentRelationshipId:
                  type: integer
                  format: int64
                loanAmount:
                  type: number
                  format: decimal
                  minimum: 0.01
                  description: Valor do empréstimo em reais (decimal com 2 casas decimais).
                financedAmount:
                  type: number
                  format: decimal
                  minimum: 0.01
                  description: Valor financiado em reais (decimal com 2 casas decimais).
                totalInterestAmount:
                  type: number
                  format: decimal
                  minimum: 0
                  description: Juros totais em reais (decimal com 2 casas decimais).
                monthlyInterestRate:
                  type: number
                  format: decimal
                  minimum: 0
                  description: Taxa de juros mensal em percentual (decimal com 4 casas decimais).
                monthlyEffectiveCost:
                  type: number
                  format: decimal
                  minimum: 0
                  description: CET mensal em percentual (decimal com 4 casas decimais).
                annualEffectiveCost:
                  type: number
                  format: decimal
                  minimum: 0
                  description: CET anual em percentual (decimal com 4 casas decimais).
                disbursementAmount:
                  type: number
                  format: decimal
                  minimum: 0
                  description: Valor a desembolsar em reais (decimal com 2 casas decimais).
                insuranceAmount:
                  type: number
                  format: decimal
                  minimum: 0
                  description: Valor do seguro em reais (decimal com 2 casas decimais).
                iofAmount:
                  type: number
                  format: decimal
                  minimum: 0
                  description: IOF em reais (decimal com 2 casas decimais).
                tacAmount:
                  type: number
                  format: decimal
                  minimum: 0
                  description: TAC em reais (decimal com 2 casas decimais).
                installmentCount:
                  type: integer
                  minimum: 1
                dueDate:
                  type: string
                  format: date
                installments:
                  type: array
                  items:
                    type: object
                    properties:
                      number:
                        type: integer
                      amount:
                        type: number
                        format: decimal
                        description: Valor da parcela em reais (decimal com 2 casas decimais).
                      dueDate:
                        type: string
                        format: date
                    example:
                      number: 1
                      amount: 593.78
                      dueDate: '2025-04-25'
              example:
                simulationId: 42
                loanAmount: 5000
                financedAmount: 5935.64
                totalInterestAmount: 1189.72
                monthlyInterestRate: 4
                monthlyEffectiveCost: 2.43
                annualEffectiveCost: 33.18
                disbursementAmount: 5627.78
                insuranceAmount: 87.3
                iofAmount: 63.42
                tacAmount: 34.92
                installmentCount: 12
                dueDate: '2025-04-25'
            example:
              simulationId: 1
              loanAmount: 5750
              financedAmount: 7125.36
              totalInterestAmount: 1189.72
              monthlyInterestRate: 1.97
              monthlyEffectiveCost: 2.43
              annualEffectiveCost: 33.18
              disbursementAmount: 5627.78
              insuranceAmount: 87.3
              iofAmount: 63.42
              tacAmount: 34.92
              installmentCount: 12
              dueDate: '2024-04-25'
      responses:
        '201':
          description: Proposta criada com sucesso
          content:
            application/json:
              schema:
                type: object
                properties:
                  id:
                    type: integer
                    format: int64
                    example: 23
                  publicId:
                    type: string
                    description: Identificador público (16 caracteres Base64 URL-safe). Ex. Kj8mP2xQ9nR4sT6v
                    example: Kj8mP2xQ9nR4sT6v
                  employeeId:
                    type: integer
                    format: int64
                    example: 15
                  simulationId:
                    type: integer
                    format: int64
                    example: 42
                  loanAmount:
                    type: number
                    format: decimal
                    description: Valor do empréstimo em reais (decimal com 2 casas decimais).
                    example: 5750
                  financedAmount:
                    type: number
                    format: decimal
                    description: Valor financiado em reais (decimal com 2 casas decimais).
                    example: 5935.64
                  totalInterestAmount:
                    type: number
                    format: decimal
                    description: Juros totais em reais (decimal com 2 casas decimais).
                    example: 1189.72
                  monthlyInterestRate:
                    type: number
                    format: decimal
                    description: Taxa mensal em percentual (decimal com 4 casas decimais).
                    example: 1.97
                  monthlyEffectiveCost:
                    type: number
                    format: decimal
                    description: CET mensal em percentual (decimal com 4 casas decimais).
                    example: 2.43
                  annualEffectiveCost:
                    type: number
                    format: decimal
                    description: CET anual em percentual (decimal com 4 casas decimais).
                    example: 33.18
                  disbursementAmount:
                    type: number
                    format: decimal
                    description: Valor a desembolsar em reais (decimal com 2 casas decimais).
                    example: 5627.78
                  insuranceAmount:
                    type: number
                    format: decimal
                    description: Seguro em reais (decimal com 2 casas decimais).
                    example: 87.3
                  iofAmount:
                    type: number
                    format: decimal
                    description: IOF em reais (decimal com 2 casas decimais).
                    example: 63.42
                  tacAmount:
                    type: number
                    format: decimal
                    description: TAC em reais (decimal com 2 casas decimais).
                    example: 34.92
                  outstandingBalance:
                    type: number
                    format: decimal
                    description: Saldo devedor em reais (decimal com 2 casas decimais).
                    example: 7125.36
                  installmentCount:
                    type: integer
                    example: 12
                  dueDate:
                    type: string
                    format: date
                    example: '2024-04-25'
                  status:
                    type: string
                    enum:
                      - PENDING
                      - ACCEPTED
                      - REJECTED
                      - EXPIRED
                      - CONVERTED_TO_CONTRACT
                    description: |
                      Status da proposta.
                      | Valor | Significado |
                      |-------|-------------|
                      | PENDING | Aguardando aceite do trabalhador |
                      | ACCEPTED | Aceita pelo trabalhador |
                      | REJECTED | Rejeitada pelo trabalhador |
                      | EXPIRED | Expirada (prazo de aceite) |
                      | CONVERTED_TO_CONTRACT | Convertida em contrato |
                    example: PENDING
                  expiresAt:
                    type: string
                    format: date-time
                    example: '2024-02-08T10:00:00Z'
                  acceptedAt:
                    type: string
                    format: date-time
                  installments:
                    type: array
                    items:
                      type: object
                      properties:
                        number:
                          type: integer
                          example: 1
                        amount:
                          type: number
                          format: decimal
                          description: Valor da parcela em reais (decimal com 2 casas decimais).
                          example: 593.78
                        dueDate:
                          type: string
                          format: date
                          example: '2024-04-25'
                      example:
                        number: 1
                        amount: 593.78
                        dueDate: '2024-04-25'
                  createdDate:
                    type: string
                    format: date-time
                    example: '2024-02-01T10:00:00Z'
                example:
                  id: 23
                  publicId: Kj8mP2xQ9nR4sT6v
                  employeeId: 15
                  simulationId: 42
                  loanAmount: 5750
                  financedAmount: 5935.64
                  totalInterestAmount: 1189.72
                  monthlyInterestRate: 1.97
                  monthlyEffectiveCost: 2.43
                  annualEffectiveCost: 33.18
                  disbursementAmount: 5627.78
                  insuranceAmount: 87.3
                  iofAmount: 63.42
                  tacAmount: 34.92
                  outstandingBalance: 7125.36
                  installmentCount: 12
                  dueDate: '2024-04-25'
                  status: PENDING
                  expiresAt: '2024-02-08T10:00:00Z'
                  installments:
                    - number: 1
                      amount: 593.78
                      dueDate: '2024-04-25'
                  createdDate: '2024-02-01T10:00:00Z'
        '400':
          description: Dados inválidos
        '401':
          description: Não autenticado
        '403':
          description: Permissão insuficiente
    get:
      summary: Listar Propostas
      description: Lista propostas de um employee
      tags:
        - Proposals
      security:
        - BearerAuth: []
      parameters:
        - name: publicId
          in: path
          required: true
          description: Public ID do employee
          schema:
            type: string
      responses:
        '200':
          description: Propostas retornadas com sucesso
          content:
            application/json:
              schema:
                type: array
                items:
                  type: object
                  properties:
                    id:
                      type: integer
                      format: int64
                      example: 23
                    publicId:
                      type: string
                      description: Identificador público (16 caracteres Base64 URL-safe). Ex. Kj8mP2xQ9nR4sT6v
                      example: Kj8mP2xQ9nR4sT6v
                    employeeId:
                      type: integer
                      format: int64
                      example: 15
                    simulationId:
                      type: integer
                      format: int64
                      example: 42
                    loanAmount:
                      type: number
                      format: decimal
                      description: Valor do empréstimo em reais (decimal com 2 casas decimais).
                      example: 5750
                    financedAmount:
                      type: number
                      format: decimal
                      description: Valor financiado em reais (decimal com 2 casas decimais).
                      example: 5935.64
                    totalInterestAmount:
                      type: number
                      format: decimal
                      description: Juros totais em reais (decimal com 2 casas decimais).
                      example: 1189.72
                    monthlyInterestRate:
                      type: number
                      format: decimal
                      description: Taxa mensal em percentual (decimal com 4 casas decimais).
                      example: 1.97
                    monthlyEffectiveCost:
                      type: number
                      format: decimal
                      description: CET mensal em percentual (decimal com 4 casas decimais).
                      example: 2.43
                    annualEffectiveCost:
                      type: number
                      format: decimal
                      description: CET anual em percentual (decimal com 4 casas decimais).
                      example: 33.18
                    disbursementAmount:
                      type: number
                      format: decimal
                      description: Valor a desembolsar em reais (decimal com 2 casas decimais).
                      example: 5627.78
                    insuranceAmount:
                      type: number
                      format: decimal
                      description: Seguro em reais (decimal com 2 casas decimais).
                      example: 87.3
                    iofAmount:
                      type: number
                      format: decimal
                      description: IOF em reais (decimal com 2 casas decimais).
                      example: 63.42
                    tacAmount:
                      type: number
                      format: decimal
                      description: TAC em reais (decimal com 2 casas decimais).
                      example: 34.92
                    outstandingBalance:
                      type: number
                      format: decimal
                      description: Saldo devedor em reais (decimal com 2 casas decimais).
                      example: 7125.36
                    installmentCount:
                      type: integer
                      example: 12
                    dueDate:
                      type: string
                      format: date
                      example: '2024-04-25'
                    status:
                      type: string
                      enum:
                        - PENDING
                        - ACCEPTED
                        - REJECTED
                        - EXPIRED
                        - CONVERTED_TO_CONTRACT
                      description: |
                        Status da proposta.
                        | Valor | Significado |
                        |-------|-------------|
                        | PENDING | Aguardando aceite do trabalhador |
                        | ACCEPTED | Aceita pelo trabalhador |
                        | REJECTED | Rejeitada pelo trabalhador |
                        | EXPIRED | Expirada (prazo de aceite) |
                        | CONVERTED_TO_CONTRACT | Convertida em contrato |
                      example: PENDING
                    expiresAt:
                      type: string
                      format: date-time
                      example: '2024-02-08T10:00:00Z'
                    acceptedAt:
                      type: string
                      format: date-time
                    installments:
                      type: array
                      items:
                        type: object
                        properties:
                          number:
                            type: integer
                            example: 1
                          amount:
                            type: number
                            format: decimal
                            description: Valor da parcela em reais (decimal com 2 casas decimais).
                            example: 593.78
                          dueDate:
                            type: string
                            format: date
                            example: '2024-04-25'
                        example:
                          number: 1
                          amount: 593.78
                          dueDate: '2024-04-25'
                    createdDate:
                      type: string
                      format: date-time
                      example: '2024-02-01T10:00:00Z'
                  example:
                    id: 23
                    publicId: Kj8mP2xQ9nR4sT6v
                    employeeId: 15
                    simulationId: 42
                    loanAmount: 5750
                    financedAmount: 5935.64
                    totalInterestAmount: 1189.72
                    monthlyInterestRate: 1.97
                    monthlyEffectiveCost: 2.43
                    annualEffectiveCost: 33.18
                    disbursementAmount: 5627.78
                    insuranceAmount: 87.3
                    iofAmount: 63.42
                    tacAmount: 34.92
                    outstandingBalance: 7125.36
                    installmentCount: 12
                    dueDate: '2024-04-25'
                    status: PENDING
                    expiresAt: '2024-02-08T10:00:00Z'
                    installments:
                      - number: 1
                        amount: 593.78
                        dueDate: '2024-04-25'
                    createdDate: '2024-02-01T10:00:00Z'
        '401':
          description: Não autenticado
        '403':
          description: Permissão insuficiente
  '/api/v1/originator/proposals/{id}':
    get:
      summary: Buscar Proposta
      description: Busca uma proposta por ID
      tags:
        - Proposals
      security:
        - BearerAuth: []
      parameters:
        - name: id
          in: path
          required: true
          description: ID da proposta
          schema:
            type: integer
            format: int64
      responses:
        '200':
          description: Proposta retornada com sucesso
          content:
            application/json:
              schema:
                type: object
                properties:
                  id:
                    type: integer
                    format: int64
                    example: 23
                  publicId:
                    type: string
                    description: Identificador público (16 caracteres Base64 URL-safe). Ex. Kj8mP2xQ9nR4sT6v
                    example: Kj8mP2xQ9nR4sT6v
                  employeeId:
                    type: integer
                    format: int64
                    example: 15
                  simulationId:
                    type: integer
                    format: int64
                    example: 42
                  loanAmount:
                    type: number
                    format: decimal
                    description: Valor do empréstimo em reais (decimal com 2 casas decimais).
                    example: 5750
                  financedAmount:
                    type: number
                    format: decimal
                    description: Valor financiado em reais (decimal com 2 casas decimais).
                    example: 5935.64
                  totalInterestAmount:
                    type: number
                    format: decimal
                    description: Juros totais em reais (decimal com 2 casas decimais).
                    example: 1189.72
                  monthlyInterestRate:
                    type: number
                    format: decimal
                    description: Taxa mensal em percentual (decimal com 4 casas decimais).
                    example: 1.97
                  monthlyEffectiveCost:
                    type: number
                    format: decimal
                    description: CET mensal em percentual (decimal com 4 casas decimais).
                    example: 2.43
                  annualEffectiveCost:
                    type: number
                    format: decimal
                    description: CET anual em percentual (decimal com 4 casas decimais).
                    example: 33.18
                  disbursementAmount:
                    type: number
                    format: decimal
                    description: Valor a desembolsar em reais (decimal com 2 casas decimais).
                    example: 5627.78
                  insuranceAmount:
                    type: number
                    format: decimal
                    description: Seguro em reais (decimal com 2 casas decimais).
                    example: 87.3
                  iofAmount:
                    type: number
                    format: decimal
                    description: IOF em reais (decimal com 2 casas decimais).
                    example: 63.42
                  tacAmount:
                    type: number
                    format: decimal
                    description: TAC em reais (decimal com 2 casas decimais).
                    example: 34.92
                  outstandingBalance:
                    type: number
                    format: decimal
                    description: Saldo devedor em reais (decimal com 2 casas decimais).
                    example: 7125.36
                  installmentCount:
                    type: integer
                    example: 12
                  dueDate:
                    type: string
                    format: date
                    example: '2024-04-25'
                  status:
                    type: string
                    enum:
                      - PENDING
                      - ACCEPTED
                      - REJECTED
                      - EXPIRED
                      - CONVERTED_TO_CONTRACT
                    description: |
                      Status da proposta.
                      | Valor | Significado |
                      |-------|-------------|
                      | PENDING | Aguardando aceite do trabalhador |
                      | ACCEPTED | Aceita pelo trabalhador |
                      | REJECTED | Rejeitada pelo trabalhador |
                      | EXPIRED | Expirada (prazo de aceite) |
                      | CONVERTED_TO_CONTRACT | Convertida em contrato |
                    example: PENDING
                  expiresAt:
                    type: string
                    format: date-time
                    example: '2024-02-08T10:00:00Z'
                  acceptedAt:
                    type: string
                    format: date-time
                  installments:
                    type: array
                    items:
                      type: object
                      properties:
                        number:
                          type: integer
                          example: 1
                        amount:
                          type: number
                          format: decimal
                          description: Valor da parcela em reais (decimal com 2 casas decimais).
                          example: 593.78
                        dueDate:
                          type: string
                          format: date
                          example: '2024-04-25'
                      example:
                        number: 1
                        amount: 593.78
                        dueDate: '2024-04-25'
                  createdDate:
                    type: string
                    format: date-time
                    example: '2024-02-01T10:00:00Z'
                example:
                  id: 23
                  publicId: Kj8mP2xQ9nR4sT6v
                  employeeId: 15
                  simulationId: 42
                  loanAmount: 5750
                  financedAmount: 5935.64
                  totalInterestAmount: 1189.72
                  monthlyInterestRate: 1.97
                  monthlyEffectiveCost: 2.43
                  annualEffectiveCost: 33.18
                  disbursementAmount: 5627.78
                  insuranceAmount: 87.3
                  iofAmount: 63.42
                  tacAmount: 34.92
                  outstandingBalance: 7125.36
                  installmentCount: 12
                  dueDate: '2024-04-25'
                  status: PENDING
                  expiresAt: '2024-02-08T10:00:00Z'
                  installments:
                    - number: 1
                      amount: 593.78
                      dueDate: '2024-04-25'
                  createdDate: '2024-02-01T10:00:00Z'
        '401':
          description: Não autenticado
        '403':
          description: Permissão insuficiente
        '404':
          description: Proposta não encontrada
  '/api/v1/originator/proposals/{proposalId}/contracts':
    post:
      summary: Criar Contrato
      description: |
        Inicia a formalização contratual a partir de uma proposta previamente criada.
        O payload define dados financeiros, forma de desembolso, endereço e informações complementares necessárias para assinatura e integração.
      tags:
        - Contracts
      security:
        - BearerAuth: []
      parameters:
        - name: proposalId
          in: path
          required: true
          description: ID da proposta
          schema:
            type: integer
            format: int64
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required:
                - contractAmount
                - installments
                - contractDate
                - address
                - attendantName
                - attendantCpf
              properties:
                contractAmount:
                  type: number
                  format: decimal
                  minimum: 0.01
                  description: Valor principal do contrato em reais (decimal com 2 casas decimais).
                installments:
                  type: integer
                  minimum: 1
                  description: Quantidade total de parcelas do contrato.
                contractDate:
                  type: string
                  format: date-time
                  description: Data e hora da contratação da operação (UTC).
                firstInstallmentDueDate:
                  type: string
                  format: date
                  description: Data do primeiro vencimento. Deve respeitar as regras de carência e calendário da operação.
                lastInstallmentDueDate:
                  type: string
                  format: date
                  description: Data prevista para vencimento da última parcela.
                pix:
                  description: Dados para desembolso por chave Pix.
                  type: object
                  required:
                    - keyType
                    - key
                  properties:
                    keyType:
                      type: string
                      enum:
                        - CPF
                        - CNPJ
                        - EMAIL
                        - PHONE
                        - RANDOM
                      description: |
                        Tipo da chave Pix.
                        | Valor | Significado |
                        |-------|-------------|
                        | CPF | Chave CPF (11 dígitos) |
                        | CNPJ | Chave CNPJ |
                        | EMAIL | Chave e-mail |
                        | PHONE | Chave telefone |
                        | RANDOM | Chave aleatória (EVP) |
                    key:
                      type: string
                      maxLength: 100
                      description: Valor da chave Pix conforme o tipo informado.
                  example:
                    keyType: CPF
                    key: '12345678901'
                bankAccount:
                  description: Dados para desembolso em conta bancária.
                  type: object
                  required:
                    - bankNumber
                    - agency
                    - accountNumber
                    - type
                  properties:
                    bankNumber:
                      type: string
                      maxLength: 3
                      description: Código COMPE/ISPB do banco de destino.
                    agency:
                      type: string
                      maxLength: 4
                      description: Número da agência bancária de destino.
                    agencyDigit:
                      type: string
                      maxLength: 2
                      description: 'Dígito verificador da agência, quando existente.'
                    accountNumber:
                      type: string
                      maxLength: 10
                      description: Número da conta para crédito.
                    accountDigit:
                      type: string
                      maxLength: 2
                      description: 'Dígito verificador da conta, quando existente.'
                    type:
                      type: string
                      enum:
                        - CHECKING
                        - SAVINGS
                      description: |
                        Tipo da conta.
                        | Valor | Significado |
                        |-------|-------------|
                        | CHECKING | Conta corrente |
                        | SAVINGS | Conta poupança |
                  example:
                    bankNumber: '001'
                    agency: '1234'
                    accountNumber: '123456'
                    accountDigit: '7'
                    type: CHECKING
                address:
                  description: Endereço residencial do trabalhador para composição contratual.
                  type: object
                  required:
                    - street
                    - neighborhood
                    - city
                    - state
                    - zipCode
                  properties:
                    street:
                      type: string
                      maxLength: 200
                      description: Logradouro do endereço residencial.
                    number:
                      type: string
                      maxLength: 20
                      description: Número do imóvel.
                    complement:
                      type: string
                      maxLength: 100
                      description: 'Complemento do endereço (apto, bloco, etc.), se houver.'
                    neighborhood:
                      type: string
                      maxLength: 100
                      description: Bairro do endereço residencial.
                    city:
                      type: string
                      maxLength: 100
                      description: Município do endereço.
                    state:
                      type: string
                      minLength: 2
                      maxLength: 2
                      description: Unidade federativa (UF) com duas letras.
                    zipCode:
                      type: string
                      maxLength: 10
                      description: CEP do endereço residencial.
                  example:
                    street: Rua das Flores
                    number: '123'
                    complement: Apto 101
                    neighborhood: Centro
                    city: São Paulo
                    state: SP
                    zipCode: '01234567'
                redirectUrl:
                  type: string
                  maxLength: 1000
                  description: URL de redirecionamento após o fluxo de assinatura digital.
                contractInfo:
                  description: Informações contratuais complementares para formalização.
                  type: object
                  properties:
                    penaltyFee:
                      type: number
                      format: decimal
                      description: Percentual ou valor de multa em reais (decimal com 2 casas decimais).
                      example: 2
                    remuneratoryInterestRate:
                      type: number
                      format: decimal
                      description: Taxa de juros em percentual (decimal com 4 casas decimais).
                      example: 1.97
                    guarantees:
                      type: string
                      maxLength: 500
                      description: Descrição das garantias vinculadas à operação.
                      example: Consignação em folha de pagamento
                    bankFee:
                      type: number
                      format: decimal
                      description: Tarifa bancária em reais (decimal com 2 casas decimais).
                      example: 34.92
                    insurancePolicyNumber:
                      type: string
                      maxLength: 50
                      description: Número da apólice de seguro associada ao contrato.
                      example: AP-2024-00789
                    insurerName:
                      type: string
                      maxLength: 100
                      description: Nome da seguradora responsável.
                      example: Seguradora Exemplo S.A.
                    insurancePremiumAmount:
                      type: number
                      format: decimal
                      description: Prêmio de seguro em reais (decimal com 2 casas decimais).
                      example: 87.3
                    documentObservation:
                      type: string
                      maxLength: 2048
                      description: Observações livres que devem constar no instrumento contratual.
                  example:
                    penaltyFee: 2
                    remuneratoryInterestRate: 1.97
                    guarantees: Consignação em folha de pagamento
                    bankFee: 34.92
                    insurancePolicyNumber: AP-2024-00789
                    insurerName: Seguradora Exemplo S.A.
                    insurancePremiumAmount: 87.3
                attendantName:
                  type: string
                  maxLength: 150
                  description: Nome do atendente ou vendedor responsável pela venda.
                attendantCpf:
                  type: string
                  maxLength: 14
                  description: CPF do atendente ou vendedor responsável.
              example:
                contractAmount: 5000
                installments: 12
                contractDate: '2025-01-15T10:00:00Z'
                firstInstallmentDueDate: '2025-04-25'
                lastInstallmentDueDate: '2026-03-25'
                address:
                  street: 'Rua Exemplo, 100'
                  neighborhood: Centro
                  city: São Paulo
                  state: SP
                  zipCode: '01310100'
                attendantName: Maria Atendente
                attendantCpf: '98765432100'
                pix:
                  keyType: CPF
                  key: '12345678901'
            example:
              contractAmount: 5750
              installments: 12
              contractDate: '2024-02-01T10:00:00Z'
              firstInstallmentDueDate: '2024-04-25'
              lastInstallmentDueDate: '2025-03-25'
              pix:
                keyType: CPF
                key: '12345678901'
              address:
                street: Rua das Flores
                number: '123'
                complement: Apto 101
                neighborhood: Centro
                city: São Paulo
                state: SP
                zipCode: '01234567'
      responses:
        '201':
          description: Contrato criado com sucesso
          content:
            application/json:
              schema:
                type: object
                properties:
                  id:
                    type: integer
                    format: int64
                    description: Identificador interno do contrato.
                    example: 156
                  requestNumber:
                    type: string
                    description: Número da requisição (GT + 10 alfanuméricos maiúsculos). Ex. GTAB12CD34EF
                    example: GTAB12CD34EF
                  contractNumber:
                    type: string
                    description: Número do contrato (8 dígitos com zero à esquerda). Ex. 00345678
                    example: 00345678
                  employeeId:
                    type: integer
                    format: int64
                    description: Identificador interno do trabalhador vinculado ao contrato.
                    example: 15
                  proposalId:
                    type: integer
                    format: int64
                    description: Identificador da proposta que originou o contrato.
                    example: 23
                  status:
                    type: string
                    enum:
                      - CREATED
                      - SIGNED
                      - ENDORSED
                      - FORMALIZED
                      - COMPLETED
                      - CANCELLED
                    description: |
                      Ciclo de vida do contrato.
                      | Valor | Significado |
                      |-------|-------------|
                      | CREATED | Contrato criado, aguardando assinatura |
                      | SIGNED | Assinado pelo trabalhador |
                      | ENDORSED | Averbação consignada confirmada |
                      | FORMALIZED | Formalizado no sistema de pagamento |
                      | COMPLETED | Operação concluída (desembolsado) |
                      | CANCELLED | Cancelado |
                    example: CREATED
                  endorsementStatus:
                    type: string
                    enum:
                      - PENDING
                      - PROCESSING
                      - ENDORSED
                      - FAILED
                      - RETRYING
                    description: |
                      Situação da averbação no convênio.
                      | Valor | Significado |
                      |-------|-------------|
                      | PENDING | Aguardando averbação |
                      | PROCESSING | Em processamento no convênio |
                      | ENDORSED | Averbação confirmada |
                      | FAILED | Falha na averbação |
                      | RETRYING | Nova tentativa em andamento |
                    example: PENDING
                  endorsementProtocol:
                    type: string
                    description: 'Protocolo retornado pelo provedor de averbação, quando disponível.'
                  contractAmount:
                    type: number
                    format: decimal
                    description: Valor principal do contrato em reais (decimal com 2 casas decimais).
                    example: 5750
                  installments:
                    type: integer
                    description: Quantidade de parcelas definida no contrato.
                    example: 12
                  contractDate:
                    type: string
                    format: date-time
                    description: Data e hora de contratação registradas (UTC).
                    example: '2024-02-01T10:00:00Z'
                  firstInstallmentDueDate:
                    type: string
                    format: date
                    description: Data de vencimento da primeira parcela.
                    example: '2024-04-25'
                  lastInstallmentDueDate:
                    type: string
                    format: date
                    description: Data de vencimento da última parcela.
                    example: '2025-03-25'
                  signedAt:
                    type: string
                    format: date-time
                    description: Data e hora em que o contrato foi assinado (UTC).
                  formalizedAt:
                    type: string
                    format: date-time
                    description: Data e hora em que a formalização foi concluída (UTC).
                  paidAt:
                    type: string
                    format: date-time
                    description: Data e hora de liquidação/desembolso do contrato (UTC).
                  endorsedAt:
                    type: string
                    format: date-time
                    description: Data e hora de confirmação da averbação (UTC).
                  bankInfo:
                    description: Informações de destino financeiro para pagamento/desembolso.
                    type: object
                    properties:
                      type:
                        type: string
                        description: Modalidade de destino financeiro utilizada (PIX ou BANK_ACCOUNT).
                      pix:
                        description: 'Dados de chave Pix utilizados, quando aplicável.'
                        type: object
                        properties:
                          keyType:
                            type: string
                            description: Tipo da chave Pix registrada no contrato.
                          key:
                            type: string
                            description: Valor da chave Pix registrada.
                        example:
                          keyType: CPF
                          key: '12345678901'
                      bankAccount:
                        description: 'Dados bancários utilizados, quando aplicável.'
                        type: object
                        properties:
                          bankNumber:
                            type: string
                            description: Código do banco registrado no contrato.
                          agency:
                            type: string
                            description: Agência bancária registrada.
                          agencyDigit:
                            type: string
                            description: Dígito da agência registrado.
                          accountNumber:
                            type: string
                            description: Número da conta registrada.
                          accountDigit:
                            type: string
                            description: Dígito da conta registrado.
                          type:
                            type: string
                            description: Tipo da conta registrada para desembolso.
                        example:
                          bankNumber: '001'
                          agency: '1234'
                          agencyDigit: '0'
                          accountNumber: '123456'
                          accountDigit: '7'
                          type: CHECKING
                    example:
                      type: PIX
                      pix:
                        keyType: CPF
                        key: '12345678901'
                  address:
                    description: Endereço associado ao contrato.
                    type: object
                    properties:
                      street:
                        type: string
                        description: Logradouro registrado no contrato.
                      number:
                        type: string
                        description: Número do imóvel registrado.
                      complement:
                        type: string
                        description: Complemento do endereço registrado.
                      neighborhood:
                        type: string
                        description: Bairro registrado.
                      city:
                        type: string
                        description: Cidade registrada.
                      state:
                        type: string
                        description: UF registrada.
                      zipCode:
                        type: string
                        description: CEP registrado.
                    example:
                      street: Rua das Flores
                      number: '123'
                      complement: Apto 101
                      neighborhood: Centro
                      city: São Paulo
                      state: SP
                      zipCode: '01234567'
                  createdDate:
                    type: string
                    format: date-time
                    description: Data e hora de criação do contrato no sistema (UTC).
                  attendantName:
                    type: string
                    description: Nome do atendente/vendedor responsável.
                  attendantCpf:
                    type: string
                    description: CPF do atendente/vendedor responsável.
                example:
                  id: 156
                  requestNumber: GTAB12CD34EF
                  contractNumber: 00345678
                  employeeId: 15
                  proposalId: 23
                  status: CREATED
                  endorsementStatus: PENDING
                  contractAmount: 5000
                  installments: 12
                  contractDate: '2025-01-15T10:00:00Z'
                  firstInstallmentDueDate: '2025-04-25'
                  lastInstallmentDueDate: '2026-03-25'
                  attendantName: Maria Atendente
                  attendantCpf: '98765432100'
                  createdDate: '2025-01-15T10:00:00Z'
        '400':
          description: Dados inválidos
        '401':
          description: Não autenticado
        '403':
          description: Permissão insuficiente
  '/api/v1/originator/contracts/{id}':
    get:
      summary: Buscar Contrato por ID
      description: Retorna os detalhes do contrato a partir do identificador interno.
      tags:
        - Contracts
      security:
        - BearerAuth: []
      parameters:
        - name: id
          in: path
          required: true
          description: ID do contrato
          schema:
            type: integer
            format: int64
      responses:
        '200':
          description: Contrato retornado com sucesso
          content:
            application/json:
              schema:
                type: object
                properties:
                  id:
                    type: integer
                    format: int64
                    description: Identificador interno do contrato.
                    example: 156
                  requestNumber:
                    type: string
                    description: Número da requisição (GT + 10 alfanuméricos maiúsculos). Ex. GTAB12CD34EF
                    example: GTAB12CD34EF
                  contractNumber:
                    type: string
                    description: Número do contrato (8 dígitos com zero à esquerda). Ex. 00345678
                    example: 00345678
                  employeeId:
                    type: integer
                    format: int64
                    description: Identificador interno do trabalhador vinculado ao contrato.
                    example: 15
                  proposalId:
                    type: integer
                    format: int64
                    description: Identificador da proposta que originou o contrato.
                    example: 23
                  status:
                    type: string
                    enum:
                      - CREATED
                      - SIGNED
                      - ENDORSED
                      - FORMALIZED
                      - COMPLETED
                      - CANCELLED
                    description: |
                      Ciclo de vida do contrato.
                      | Valor | Significado |
                      |-------|-------------|
                      | CREATED | Contrato criado, aguardando assinatura |
                      | SIGNED | Assinado pelo trabalhador |
                      | ENDORSED | Averbação consignada confirmada |
                      | FORMALIZED | Formalizado no sistema de pagamento |
                      | COMPLETED | Operação concluída (desembolsado) |
                      | CANCELLED | Cancelado |
                    example: CREATED
                  endorsementStatus:
                    type: string
                    enum:
                      - PENDING
                      - PROCESSING
                      - ENDORSED
                      - FAILED
                      - RETRYING
                    description: |
                      Situação da averbação no convênio.
                      | Valor | Significado |
                      |-------|-------------|
                      | PENDING | Aguardando averbação |
                      | PROCESSING | Em processamento no convênio |
                      | ENDORSED | Averbação confirmada |
                      | FAILED | Falha na averbação |
                      | RETRYING | Nova tentativa em andamento |
                    example: PENDING
                  endorsementProtocol:
                    type: string
                    description: 'Protocolo retornado pelo provedor de averbação, quando disponível.'
                  contractAmount:
                    type: number
                    format: decimal
                    description: Valor principal do contrato em reais (decimal com 2 casas decimais).
                    example: 5750
                  installments:
                    type: integer
                    description: Quantidade de parcelas definida no contrato.
                    example: 12
                  contractDate:
                    type: string
                    format: date-time
                    description: Data e hora de contratação registradas (UTC).
                    example: '2024-02-01T10:00:00Z'
                  firstInstallmentDueDate:
                    type: string
                    format: date
                    description: Data de vencimento da primeira parcela.
                    example: '2024-04-25'
                  lastInstallmentDueDate:
                    type: string
                    format: date
                    description: Data de vencimento da última parcela.
                    example: '2025-03-25'
                  signedAt:
                    type: string
                    format: date-time
                    description: Data e hora em que o contrato foi assinado (UTC).
                  formalizedAt:
                    type: string
                    format: date-time
                    description: Data e hora em que a formalização foi concluída (UTC).
                  paidAt:
                    type: string
                    format: date-time
                    description: Data e hora de liquidação/desembolso do contrato (UTC).
                  endorsedAt:
                    type: string
                    format: date-time
                    description: Data e hora de confirmação da averbação (UTC).
                  bankInfo:
                    description: Informações de destino financeiro para pagamento/desembolso.
                    type: object
                    properties:
                      type:
                        type: string
                        description: Modalidade de destino financeiro utilizada (PIX ou BANK_ACCOUNT).
                      pix:
                        description: 'Dados de chave Pix utilizados, quando aplicável.'
                        type: object
                        properties:
                          keyType:
                            type: string
                            description: Tipo da chave Pix registrada no contrato.
                          key:
                            type: string
                            description: Valor da chave Pix registrada.
                        example:
                          keyType: CPF
                          key: '12345678901'
                      bankAccount:
                        description: 'Dados bancários utilizados, quando aplicável.'
                        type: object
                        properties:
                          bankNumber:
                            type: string
                            description: Código do banco registrado no contrato.
                          agency:
                            type: string
                            description: Agência bancária registrada.
                          agencyDigit:
                            type: string
                            description: Dígito da agência registrado.
                          accountNumber:
                            type: string
                            description: Número da conta registrada.
                          accountDigit:
                            type: string
                            description: Dígito da conta registrado.
                          type:
                            type: string
                            description: Tipo da conta registrada para desembolso.
                        example:
                          bankNumber: '001'
                          agency: '1234'
                          agencyDigit: '0'
                          accountNumber: '123456'
                          accountDigit: '7'
                          type: CHECKING
                    example:
                      type: PIX
                      pix:
                        keyType: CPF
                        key: '12345678901'
                  address:
                    description: Endereço associado ao contrato.
                    type: object
                    properties:
                      street:
                        type: string
                        description: Logradouro registrado no contrato.
                      number:
                        type: string
                        description: Número do imóvel registrado.
                      complement:
                        type: string
                        description: Complemento do endereço registrado.
                      neighborhood:
                        type: string
                        description: Bairro registrado.
                      city:
                        type: string
                        description: Cidade registrada.
                      state:
                        type: string
                        description: UF registrada.
                      zipCode:
                        type: string
                        description: CEP registrado.
                    example:
                      street: Rua das Flores
                      number: '123'
                      complement: Apto 101
                      neighborhood: Centro
                      city: São Paulo
                      state: SP
                      zipCode: '01234567'
                  createdDate:
                    type: string
                    format: date-time
                    description: Data e hora de criação do contrato no sistema (UTC).
                  attendantName:
                    type: string
                    description: Nome do atendente/vendedor responsável.
                  attendantCpf:
                    type: string
                    description: CPF do atendente/vendedor responsável.
                example:
                  id: 156
                  requestNumber: GTAB12CD34EF
                  contractNumber: 00345678
                  employeeId: 15
                  proposalId: 23
                  status: CREATED
                  endorsementStatus: PENDING
                  contractAmount: 5000
                  installments: 12
                  contractDate: '2025-01-15T10:00:00Z'
                  firstInstallmentDueDate: '2025-04-25'
                  lastInstallmentDueDate: '2026-03-25'
                  attendantName: Maria Atendente
                  attendantCpf: '98765432100'
                  createdDate: '2025-01-15T10:00:00Z'
        '401':
          description: Não autenticado
        '403':
          description: Permissão insuficiente
        '404':
          description: Contrato não encontrado
  '/api/v1/originator/contracts/by-request-number/{requestNumber}':
    get:
      summary: Buscar Contrato por Request Number
      description: Retorna os detalhes do contrato a partir do número de requisição.
      tags:
        - Contracts
      security:
        - BearerAuth: []
      parameters:
        - name: requestNumber
          in: path
          required: true
          description: Número da requisição do contrato
          schema:
            type: string
      responses:
        '200':
          description: Contrato retornado com sucesso
          content:
            application/json:
              schema:
                type: object
                properties:
                  id:
                    type: integer
                    format: int64
                    description: Identificador interno do contrato.
                    example: 156
                  requestNumber:
                    type: string
                    description: Número da requisição (GT + 10 alfanuméricos maiúsculos). Ex. GTAB12CD34EF
                    example: GTAB12CD34EF
                  contractNumber:
                    type: string
                    description: Número do contrato (8 dígitos com zero à esquerda). Ex. 00345678
                    example: 00345678
                  employeeId:
                    type: integer
                    format: int64
                    description: Identificador interno do trabalhador vinculado ao contrato.
                    example: 15
                  proposalId:
                    type: integer
                    format: int64
                    description: Identificador da proposta que originou o contrato.
                    example: 23
                  status:
                    type: string
                    enum:
                      - CREATED
                      - SIGNED
                      - ENDORSED
                      - FORMALIZED
                      - COMPLETED
                      - CANCELLED
                    description: |
                      Ciclo de vida do contrato.
                      | Valor | Significado |
                      |-------|-------------|
                      | CREATED | Contrato criado, aguardando assinatura |
                      | SIGNED | Assinado pelo trabalhador |
                      | ENDORSED | Averbação consignada confirmada |
                      | FORMALIZED | Formalizado no sistema de pagamento |
                      | COMPLETED | Operação concluída (desembolsado) |
                      | CANCELLED | Cancelado |
                    example: CREATED
                  endorsementStatus:
                    type: string
                    enum:
                      - PENDING
                      - PROCESSING
                      - ENDORSED
                      - FAILED
                      - RETRYING
                    description: |
                      Situação da averbação no convênio.
                      | Valor | Significado |
                      |-------|-------------|
                      | PENDING | Aguardando averbação |
                      | PROCESSING | Em processamento no convênio |
                      | ENDORSED | Averbação confirmada |
                      | FAILED | Falha na averbação |
                      | RETRYING | Nova tentativa em andamento |
                    example: PENDING
                  endorsementProtocol:
                    type: string
                    description: 'Protocolo retornado pelo provedor de averbação, quando disponível.'
                  contractAmount:
                    type: number
                    format: decimal
                    description: Valor principal do contrato em reais (decimal com 2 casas decimais).
                    example: 5750
                  installments:
                    type: integer
                    description: Quantidade de parcelas definida no contrato.
                    example: 12
                  contractDate:
                    type: string
                    format: date-time
                    description: Data e hora de contratação registradas (UTC).
                    example: '2024-02-01T10:00:00Z'
                  firstInstallmentDueDate:
                    type: string
                    format: date
                    description: Data de vencimento da primeira parcela.
                    example: '2024-04-25'
                  lastInstallmentDueDate:
                    type: string
                    format: date
                    description: Data de vencimento da última parcela.
                    example: '2025-03-25'
                  signedAt:
                    type: string
                    format: date-time
                    description: Data e hora em que o contrato foi assinado (UTC).
                  formalizedAt:
                    type: string
                    format: date-time
                    description: Data e hora em que a formalização foi concluída (UTC).
                  paidAt:
                    type: string
                    format: date-time
                    description: Data e hora de liquidação/desembolso do contrato (UTC).
                  endorsedAt:
                    type: string
                    format: date-time
                    description: Data e hora de confirmação da averbação (UTC).
                  bankInfo:
                    description: Informações de destino financeiro para pagamento/desembolso.
                    type: object
                    properties:
                      type:
                        type: string
                        description: Modalidade de destino financeiro utilizada (PIX ou BANK_ACCOUNT).
                      pix:
                        description: 'Dados de chave Pix utilizados, quando aplicável.'
                        type: object
                        properties:
                          keyType:
                            type: string
                            description: Tipo da chave Pix registrada no contrato.
                          key:
                            type: string
                            description: Valor da chave Pix registrada.
                        example:
                          keyType: CPF
                          key: '12345678901'
                      bankAccount:
                        description: 'Dados bancários utilizados, quando aplicável.'
                        type: object
                        properties:
                          bankNumber:
                            type: string
                            description: Código do banco registrado no contrato.
                          agency:
                            type: string
                            description: Agência bancária registrada.
                          agencyDigit:
                            type: string
                            description: Dígito da agência registrado.
                          accountNumber:
                            type: string
                            description: Número da conta registrada.
                          accountDigit:
                            type: string
                            description: Dígito da conta registrado.
                          type:
                            type: string
                            description: Tipo da conta registrada para desembolso.
                        example:
                          bankNumber: '001'
                          agency: '1234'
                          agencyDigit: '0'
                          accountNumber: '123456'
                          accountDigit: '7'
                          type: CHECKING
                    example:
                      type: PIX
                      pix:
                        keyType: CPF
                        key: '12345678901'
                  address:
                    description: Endereço associado ao contrato.
                    type: object
                    properties:
                      street:
                        type: string
                        description: Logradouro registrado no contrato.
                      number:
                        type: string
                        description: Número do imóvel registrado.
                      complement:
                        type: string
                        description: Complemento do endereço registrado.
                      neighborhood:
                        type: string
                        description: Bairro registrado.
                      city:
                        type: string
                        description: Cidade registrada.
                      state:
                        type: string
                        description: UF registrada.
                      zipCode:
                        type: string
                        description: CEP registrado.
                    example:
                      street: Rua das Flores
                      number: '123'
                      complement: Apto 101
                      neighborhood: Centro
                      city: São Paulo
                      state: SP
                      zipCode: '01234567'
                  createdDate:
                    type: string
                    format: date-time
                    description: Data e hora de criação do contrato no sistema (UTC).
                  attendantName:
                    type: string
                    description: Nome do atendente/vendedor responsável.
                  attendantCpf:
                    type: string
                    description: CPF do atendente/vendedor responsável.
                example:
                  id: 156
                  requestNumber: GTAB12CD34EF
                  contractNumber: 00345678
                  employeeId: 15
                  proposalId: 23
                  status: CREATED
                  endorsementStatus: PENDING
                  contractAmount: 5000
                  installments: 12
                  contractDate: '2025-01-15T10:00:00Z'
                  firstInstallmentDueDate: '2025-04-25'
                  lastInstallmentDueDate: '2026-03-25'
                  attendantName: Maria Atendente
                  attendantCpf: '98765432100'
                  createdDate: '2025-01-15T10:00:00Z'
        '401':
          description: Não autenticado
        '403':
          description: Permissão insuficiente
        '404':
          description: Contrato não encontrado
  '/api/v1/originator/employees/{publicId}/contracts':
    get:
      summary: Listar Contratos
      description: Lista contratos associados ao trabalhador informado.
      tags:
        - Contracts
      security:
        - BearerAuth: []
      parameters:
        - name: publicId
          in: path
          required: true
          description: Public ID do employee
          schema:
            type: string
      responses:
        '200':
          description: Contratos retornados com sucesso
          content:
            application/json:
              schema:
                type: array
                items:
                  type: object
                  properties:
                    id:
                      type: integer
                      format: int64
                      description: Identificador interno do contrato.
                      example: 156
                    requestNumber:
                      type: string
                      description: Número da requisição (GT + 10 alfanuméricos maiúsculos). Ex. GTAB12CD34EF
                      example: GTAB12CD34EF
                    contractNumber:
                      type: string
                      description: Número do contrato (8 dígitos com zero à esquerda). Ex. 00345678
                      example: 00345678
                    employeeId:
                      type: integer
                      format: int64
                      description: Identificador interno do trabalhador vinculado ao contrato.
                      example: 15
                    proposalId:
                      type: integer
                      format: int64
                      description: Identificador da proposta que originou o contrato.
                      example: 23
                    status:
                      type: string
                      enum:
                        - CREATED
                        - SIGNED
                        - ENDORSED
                        - FORMALIZED
                        - COMPLETED
                        - CANCELLED
                      description: |
                        Ciclo de vida do contrato.
                        | Valor | Significado |
                        |-------|-------------|
                        | CREATED | Contrato criado, aguardando assinatura |
                        | SIGNED | Assinado pelo trabalhador |
                        | ENDORSED | Averbação consignada confirmada |
                        | FORMALIZED | Formalizado no sistema de pagamento |
                        | COMPLETED | Operação concluída (desembolsado) |
                        | CANCELLED | Cancelado |
                      example: CREATED
                    endorsementStatus:
                      type: string
                      enum:
                        - PENDING
                        - PROCESSING
                        - ENDORSED
                        - FAILED
                        - RETRYING
                      description: |
                        Situação da averbação no convênio.
                        | Valor | Significado |
                        |-------|-------------|
                        | PENDING | Aguardando averbação |
                        | PROCESSING | Em processamento no convênio |
                        | ENDORSED | Averbação confirmada |
                        | FAILED | Falha na averbação |
                        | RETRYING | Nova tentativa em andamento |
                      example: PENDING
                    endorsementProtocol:
                      type: string
                      description: 'Protocolo retornado pelo provedor de averbação, quando disponível.'
                    contractAmount:
                      type: number
                      format: decimal
                      description: Valor principal do contrato em reais (decimal com 2 casas decimais).
                      example: 5750
                    installments:
                      type: integer
                      description: Quantidade de parcelas definida no contrato.
                      example: 12
                    contractDate:
                      type: string
                      format: date-time
                      description: Data e hora de contratação registradas (UTC).
                      example: '2024-02-01T10:00:00Z'
                    firstInstallmentDueDate:
                      type: string
                      format: date
                      description: Data de vencimento da primeira parcela.
                      example: '2024-04-25'
                    lastInstallmentDueDate:
                      type: string
                      format: date
                      description: Data de vencimento da última parcela.
                      example: '2025-03-25'
                    signedAt:
                      type: string
                      format: date-time
                      description: Data e hora em que o contrato foi assinado (UTC).
                    formalizedAt:
                      type: string
                      format: date-time
                      description: Data e hora em que a formalização foi concluída (UTC).
                    paidAt:
                      type: string
                      format: date-time
                      description: Data e hora de liquidação/desembolso do contrato (UTC).
                    endorsedAt:
                      type: string
                      format: date-time
                      description: Data e hora de confirmação da averbação (UTC).
                    bankInfo:
                      description: Informações de destino financeiro para pagamento/desembolso.
                      type: object
                      properties:
                        type:
                          type: string
                          description: Modalidade de destino financeiro utilizada (PIX ou BANK_ACCOUNT).
                        pix:
                          description: 'Dados de chave Pix utilizados, quando aplicável.'
                          type: object
                          properties:
                            keyType:
                              type: string
                              description: Tipo da chave Pix registrada no contrato.
                            key:
                              type: string
                              description: Valor da chave Pix registrada.
                          example:
                            keyType: CPF
                            key: '12345678901'
                        bankAccount:
                          description: 'Dados bancários utilizados, quando aplicável.'
                          type: object
                          properties:
                            bankNumber:
                              type: string
                              description: Código do banco registrado no contrato.
                            agency:
                              type: string
                              description: Agência bancária registrada.
                            agencyDigit:
                              type: string
                              description: Dígito da agência registrado.
                            accountNumber:
                              type: string
                              description: Número da conta registrada.
                            accountDigit:
                              type: string
                              description: Dígito da conta registrado.
                            type:
                              type: string
                              description: Tipo da conta registrada para desembolso.
                          example:
                            bankNumber: '001'
                            agency: '1234'
                            agencyDigit: '0'
                            accountNumber: '123456'
                            accountDigit: '7'
                            type: CHECKING
                      example:
                        type: PIX
                        pix:
                          keyType: CPF
                          key: '12345678901'
                    address:
                      description: Endereço associado ao contrato.
                      type: object
                      properties:
                        street:
                          type: string
                          description: Logradouro registrado no contrato.
                        number:
                          type: string
                          description: Número do imóvel registrado.
                        complement:
                          type: string
                          description: Complemento do endereço registrado.
                        neighborhood:
                          type: string
                          description: Bairro registrado.
                        city:
                          type: string
                          description: Cidade registrada.
                        state:
                          type: string
                          description: UF registrada.
                        zipCode:
                          type: string
                          description: CEP registrado.
                      example:
                        street: Rua das Flores
                        number: '123'
                        complement: Apto 101
                        neighborhood: Centro
                        city: São Paulo
                        state: SP
                        zipCode: '01234567'
                    createdDate:
                      type: string
                      format: date-time
                      description: Data e hora de criação do contrato no sistema (UTC).
                    attendantName:
                      type: string
                      description: Nome do atendente/vendedor responsável.
                    attendantCpf:
                      type: string
                      description: CPF do atendente/vendedor responsável.
                  example:
                    id: 156
                    requestNumber: GTAB12CD34EF
                    contractNumber: 00345678
                    employeeId: 15
                    proposalId: 23
                    status: CREATED
                    endorsementStatus: PENDING
                    contractAmount: 5000
                    installments: 12
                    contractDate: '2025-01-15T10:00:00Z'
                    firstInstallmentDueDate: '2025-04-25'
                    lastInstallmentDueDate: '2026-03-25'
                    attendantName: Maria Atendente
                    attendantCpf: '98765432100'
                    createdDate: '2025-01-15T10:00:00Z'
        '401':
          description: Não autenticado
        '403':
          description: Permissão insuficiente
  '/api/v1/originator/contracts/{requestNumber}/resend':
    post:
      summary: Reenviar Link de Assinatura do Contrato
      description: Solicita o reenvio do link de assinatura para continuidade da formalização.
      tags:
        - Contracts
      security:
        - BearerAuth: []
      parameters:
        - name: requestNumber
          in: path
          required: true
          description: Número da requisição do contrato
          schema:
            type: string
      responses:
        '200':
          description: Link reenviado com sucesso
          content:
            application/json:
              schema:
                type: object
                properties:
                  status:
                    type: string
                    enum:
                      - SENT
                      - FAILED
                      - DOCUMENT_NOT_FOUND
                      - INVALID_STATUS
                    description: |
                      Resultado do reenvio do link de assinatura.
                      | Valor | Significado |
                      |-------|-------------|
                      | SENT | Link reenviado com sucesso |
                      | FAILED | Falha no reenvio |
                      | DOCUMENT_NOT_FOUND | Documento não encontrado |
                      | INVALID_STATUS | Status inválido para reenvio |
                  message:
                    type: string
                    description: Mensagem explicativa do resultado retornado pela operação.
                  requestNumber:
                    type: string
                    description: Número da requisição do contrato processado.
                  signUrl:
                    type: string
                    description: URL de assinatura retornada para continuidade do fluxo.
                example:
                  status: SENT
                  message: Link de assinatura reenviado com sucesso.
                  requestNumber: GTAB12CD34EF
                  signUrl: 'https://sign.example.com/contract/abc123'
        '401':
          description: Não autenticado
        '403':
          description: Permissão insuficiente
        '404':
          description: Contrato não encontrado
  /api/v1/originator/contracts/cancel:
    post:
      summary: Cancelar Contrato
      description: |
        Cancela um contrato do originator usando **um único identificador**:
        - `requestNumber` **ou**
        - `contractNumber`

        Regras de negócio:
        - O contrato é carregado com lock pessimista antes da atualização.
        - O cancelamento só é permitido quando o contrato ainda não entrou em assinatura/averbação/formalização.
        - Após o lock, o backend valida o status do contrato e também os status de Endorsement e Formalization.
      tags:
        - Contracts
      security:
        - BearerAuth: []
      parameters:
        - name: requestNumber
          in: query
          required: false
          description: Número da requisição do contrato (enviar apenas quando contractNumber não for informado)
          schema:
            type: string
        - name: contractNumber
          in: query
          required: false
          description: Número do contrato (enviar apenas quando requestNumber não for informado)
          schema:
            type: string
      responses:
        '200':
          description: Contrato cancelado com sucesso
          content:
            application/json:
              schema:
                type: object
                properties:
                  id:
                    type: integer
                    format: int64
                    description: Identificador interno do contrato.
                    example: 156
                  requestNumber:
                    type: string
                    description: Número da requisição (GT + 10 alfanuméricos maiúsculos). Ex. GTAB12CD34EF
                    example: GTAB12CD34EF
                  contractNumber:
                    type: string
                    description: Número do contrato (8 dígitos com zero à esquerda). Ex. 00345678
                    example: 00345678
                  employeeId:
                    type: integer
                    format: int64
                    description: Identificador interno do trabalhador vinculado ao contrato.
                    example: 15
                  proposalId:
                    type: integer
                    format: int64
                    description: Identificador da proposta que originou o contrato.
                    example: 23
                  status:
                    type: string
                    enum:
                      - CREATED
                      - SIGNED
                      - ENDORSED
                      - FORMALIZED
                      - COMPLETED
                      - CANCELLED
                    description: |
                      Ciclo de vida do contrato.
                      | Valor | Significado |
                      |-------|-------------|
                      | CREATED | Contrato criado, aguardando assinatura |
                      | SIGNED | Assinado pelo trabalhador |
                      | ENDORSED | Averbação consignada confirmada |
                      | FORMALIZED | Formalizado no sistema de pagamento |
                      | COMPLETED | Operação concluída (desembolsado) |
                      | CANCELLED | Cancelado |
                    example: CREATED
                  endorsementStatus:
                    type: string
                    enum:
                      - PENDING
                      - PROCESSING
                      - ENDORSED
                      - FAILED
                      - RETRYING
                    description: |
                      Situação da averbação no convênio.
                      | Valor | Significado |
                      |-------|-------------|
                      | PENDING | Aguardando averbação |
                      | PROCESSING | Em processamento no convênio |
                      | ENDORSED | Averbação confirmada |
                      | FAILED | Falha na averbação |
                      | RETRYING | Nova tentativa em andamento |
                    example: PENDING
                  endorsementProtocol:
                    type: string
                    description: 'Protocolo retornado pelo provedor de averbação, quando disponível.'
                  contractAmount:
                    type: number
                    format: decimal
                    description: Valor principal do contrato em reais (decimal com 2 casas decimais).
                    example: 5750
                  installments:
                    type: integer
                    description: Quantidade de parcelas definida no contrato.
                    example: 12
                  contractDate:
                    type: string
                    format: date-time
                    description: Data e hora de contratação registradas (UTC).
                    example: '2024-02-01T10:00:00Z'
                  firstInstallmentDueDate:
                    type: string
                    format: date
                    description: Data de vencimento da primeira parcela.
                    example: '2024-04-25'
                  lastInstallmentDueDate:
                    type: string
                    format: date
                    description: Data de vencimento da última parcela.
                    example: '2025-03-25'
                  signedAt:
                    type: string
                    format: date-time
                    description: Data e hora em que o contrato foi assinado (UTC).
                  formalizedAt:
                    type: string
                    format: date-time
                    description: Data e hora em que a formalização foi concluída (UTC).
                  paidAt:
                    type: string
                    format: date-time
                    description: Data e hora de liquidação/desembolso do contrato (UTC).
                  endorsedAt:
                    type: string
                    format: date-time
                    description: Data e hora de confirmação da averbação (UTC).
                  bankInfo:
                    description: Informações de destino financeiro para pagamento/desembolso.
                    type: object
                    properties:
                      type:
                        type: string
                        description: Modalidade de destino financeiro utilizada (PIX ou BANK_ACCOUNT).
                      pix:
                        description: 'Dados de chave Pix utilizados, quando aplicável.'
                        type: object
                        properties:
                          keyType:
                            type: string
                            description: Tipo da chave Pix registrada no contrato.
                          key:
                            type: string
                            description: Valor da chave Pix registrada.
                        example:
                          keyType: CPF
                          key: '12345678901'
                      bankAccount:
                        description: 'Dados bancários utilizados, quando aplicável.'
                        type: object
                        properties:
                          bankNumber:
                            type: string
                            description: Código do banco registrado no contrato.
                          agency:
                            type: string
                            description: Agência bancária registrada.
                          agencyDigit:
                            type: string
                            description: Dígito da agência registrado.
                          accountNumber:
                            type: string
                            description: Número da conta registrada.
                          accountDigit:
                            type: string
                            description: Dígito da conta registrado.
                          type:
                            type: string
                            description: Tipo da conta registrada para desembolso.
                        example:
                          bankNumber: '001'
                          agency: '1234'
                          agencyDigit: '0'
                          accountNumber: '123456'
                          accountDigit: '7'
                          type: CHECKING
                    example:
                      type: PIX
                      pix:
                        keyType: CPF
                        key: '12345678901'
                  address:
                    description: Endereço associado ao contrato.
                    type: object
                    properties:
                      street:
                        type: string
                        description: Logradouro registrado no contrato.
                      number:
                        type: string
                        description: Número do imóvel registrado.
                      complement:
                        type: string
                        description: Complemento do endereço registrado.
                      neighborhood:
                        type: string
                        description: Bairro registrado.
                      city:
                        type: string
                        description: Cidade registrada.
                      state:
                        type: string
                        description: UF registrada.
                      zipCode:
                        type: string
                        description: CEP registrado.
                    example:
                      street: Rua das Flores
                      number: '123'
                      complement: Apto 101
                      neighborhood: Centro
                      city: São Paulo
                      state: SP
                      zipCode: '01234567'
                  createdDate:
                    type: string
                    format: date-time
                    description: Data e hora de criação do contrato no sistema (UTC).
                  attendantName:
                    type: string
                    description: Nome do atendente/vendedor responsável.
                  attendantCpf:
                    type: string
                    description: CPF do atendente/vendedor responsável.
                example:
                  id: 156
                  requestNumber: GTAB12CD34EF
                  contractNumber: 00345678
                  employeeId: 15
                  proposalId: 23
                  status: CREATED
                  endorsementStatus: PENDING
                  contractAmount: 5000
                  installments: 12
                  contractDate: '2025-01-15T10:00:00Z'
                  firstInstallmentDueDate: '2025-04-25'
                  lastInstallmentDueDate: '2026-03-25'
                  attendantName: Maria Atendente
                  attendantCpf: '98765432100'
                  createdDate: '2025-01-15T10:00:00Z'
              examples:
                cancelled:
                  summary: Contrato cancelado
                  value:
                    id: 1
                    requestNumber: GTAB12CD34EF
                    contractNumber: 00345678
                    status: CANCELLED
        '400':
          description: Deve informar exatamente um identificador (requestNumber ou contractNumber)
        '401':
          description: Não autenticado
        '403':
          description: Permissão insuficiente
        '404':
          description: Contrato não encontrado
        '409':
          description: Contrato não pode ser cancelado porque já está em assinatura/averbação/formalização
          content:
            application/json:
              schema:
                type: object
                properties:
                  title:
                    type: string
                    example: Contract cancellation not allowed
                  status:
                    type: integer
                    example: 409
                  message:
                    type: string
                    description: Motivo do bloqueio de cancelamento
                  requestNumber:
                    type: string
                    description: Número da requisição (GT + 10 alfanuméricos maiúsculos). Ex. GTAB12CD34EF
                    example: GTAB12CD34EF
                  contractNumber:
                    type: string
                    description: Número do contrato (8 dígitos com zero à esquerda). Ex. 00345678
                    example: 00345678
                  contractStatus:
                    type: string
                    enum:
                      - CREATED
                      - SIGNED
                      - ENDORSED
                      - FORMALIZED
                      - COMPLETED
                      - CANCELLED
                    description: Mesmos valores de ContractResponse.status (ver tabela do contrato).
                  endorsementStatus:
                    type: string
                    enum:
                      - PENDING
                      - PROCESSING
                      - ENDORSED
                      - FAILED
                      - RETRYING
                    description: Mesmos valores de ContractResponse.endorsementStatus.
                  formalizationStatus:
                    type: string
                    enum:
                      - PENDING
                      - SENT
                      - FORMALIZED
                      - PAID
                      - FAILED
                      - RETRYING
                    description: |
                      Situação da formalização no sistema de pagamento.
                      | Valor | Significado |
                      |-------|-------------|
                      | PENDING | Aguardando envio |
                      | SENT | Enviado para formalização |
                      | FORMALIZED | Formalizado |
                      | PAID | Desembolsado |
                      | FAILED | Falha na formalização |
                      | RETRYING | Nova tentativa em andamento |
                example:
                  title: Contract cancellation not allowed
                  status: 409
                  message: Contrato já está em processo de averbação e não pode ser cancelado.
                  requestNumber: GTAB12CD34EF
                  contractNumber: 00345678
                  contractStatus: ENDORSED
                  endorsementStatus: PROCESSING
                  formalizationStatus: PENDING
  '/api/v1/originator/contracts/{contractId}/dataprev/payment-transfers':
    get:
      summary: Listar transferências de pagamento por contrato
      description: Retorna as transferências de pagamento Dataprev do contrato informado (do originador autenticado).
      tags:
        - Dataprev
      security:
        - BearerAuth: []
      parameters:
        - name: contractId
          in: path
          required: true
          description: ID do contrato
          schema:
            type: integer
            format: int64
      responses:
        '200':
          description: Lista de transferências retornada com sucesso
          content:
            application/json:
              schema:
                type: array
                items:
                  type: object
                  properties:
                    id:
                      type: integer
                      format: int64
                      example: 89
                    dataprevId:
                      type: integer
                      format: int64
                      example: 456789
                    contractNumber:
                      type: string
                      description: Número do contrato (8 dígitos com zero à esquerda). Ex. 00345678
                      example: 00345678
                    amountPaid:
                      type: number
                      format: decimal
                      description: Valor pago em reais (decimal com 2 casas decimais).
                      example: 593.78
                    guidePaymentAt:
                      type: string
                      format: date-time
                      example: '2024-04-25T00:00:00Z'
                    transferAt:
                      type: string
                      format: date-time
                      example: '2024-04-28T14:30:00Z'
                    guideNumber:
                      type: integer
                      format: int64
                      example: 123456
                    trfCode:
                      type: integer
                      format: int64
                      example: 1
                    competence:
                      type: integer
                      example: 202404
                    nsu:
                      type: integer
                      format: int64
                      example: 987654
                    lateInterestAmount:
                      type: number
                      format: decimal
                      description: Juros de mora em reais (decimal com 2 casas decimais).
                      example: 0
                    penaltyAmount:
                      type: number
                      format: decimal
                      description: Multa em reais (decimal com 2 casas decimais).
                      example: 0
                    monetaryAdjustmentAmount:
                      type: number
                      format: decimal
                      description: Ajuste monetário em reais (decimal com 2 casas decimais).
                      example: 0
                    includedAtDataprev:
                      type: string
                      format: date-time
                    institutionCode:
                      type: integer
                    cpf:
                      type: string
                    registrationNumber:
                      type: string
                    operatorTaxId:
                      type: integer
                      format: int64
                    employerRegistrationTypeCode:
                      type: integer
                    employerRegistrationNumber:
                      type: integer
                      format: int64
                  example:
                    id: 89
                    dataprevId: 456789
                    contractNumber: 00345678
                    amountPaid: 593.78
                    guidePaymentAt: '2024-04-25T00:00:00Z'
                    transferAt: '2024-04-28T14:30:00Z'
                    guideNumber: 123456
                    trfCode: 1
                    competence: 202404
                    nsu: 987654
                    lateInterestAmount: 0
                    penaltyAmount: 0
                    monetaryAdjustmentAmount: 0
        '401':
          description: Não autenticado
        '403':
          description: Permissão insuficiente
        '404':
          description: Contrato não encontrado ou não pertence ao originador
  '/api/v1/originator/contracts/{contractId}/dataprev/bookkeeping-entries':
    get:
      summary: Listar lançamentos contábeis por contrato
      description: Retorna os lançamentos contábeis Dataprev do contrato informado (do originador autenticado).
      tags:
        - Dataprev
      security:
        - BearerAuth: []
      parameters:
        - name: contractId
          in: path
          required: true
          description: ID do contrato
          schema:
            type: integer
            format: int64
      responses:
        '200':
          description: Lista de lançamentos retornada com sucesso
          content:
            application/json:
              schema:
                type: array
                items:
                  type: object
                  properties:
                    id:
                      type: integer
                      format: int64
                      example: 201
                    dataprevId:
                      type: integer
                      format: int64
                      example: 456789
                    contractNumber:
                      type: string
                      description: Número do contrato (8 dígitos com zero à esquerda). Ex. 00345678
                      example: 00345678
                    referencePeriod:
                      type: integer
                      example: 202404
                    deductionAmount:
                      type: number
                      format: decimal
                      description: Valor da dedução em reais (decimal com 2 casas decimais).
                      example: 593.78
                    includedAtDataprev:
                      type: string
                      format: date-time
                    eSocialEventId:
                      type: integer
                      format: int64
                    dataMatch:
                      type: boolean
                    eventTypeCode:
                      type: integer
                    institutionCode:
                      type: integer
                    cpf:
                      type: string
                    registrationNumber:
                      type: string
                    employerRegistrationTypeCode:
                      type: integer
                    employerRegistrationNumber:
                      type: integer
                      format: int64
                    loanInstitutionCode:
                      type: integer
                    loanInstallmentValue:
                      type: number
                      format: decimal
                    analysisContractBooked:
                      type: boolean
                    analysisWorkerBooked:
                      type: boolean
                    analysisInstitutionCorrect:
                      type: boolean
                    analysisInstallmentValueCorrect:
                      type: boolean
                    analysisLinkCorrect:
                      type: boolean
                    exclusionEventDatetime:
                      type: string
                    correctionEventDatetime:
                      type: string
                    exclusionEventId:
                      type: integer
                      format: int64
                    correctionEventId:
                      type: integer
                      format: int64
                  example:
                    id: 201
                    dataprevId: 456789
                    contractNumber: 00345678
                    referencePeriod: 202404
                    deductionAmount: 593.78
                    includedAtDataprev: '2024-04-30T12:00:00Z'
        '401':
          description: Não autenticado
        '403':
          description: Permissão insuficiente
        '404':
          description: Contrato não encontrado ou não pertence ao originador
  /api/v1/originator/dataprev/payment-transfers:
    get:
      summary: Listar transferências de pagamento (paginado)
      description: 'Retorna as transferências de pagamento Dataprev do originador autenticado, com paginação e filtro opcional por data de inclusão.'
      tags:
        - Dataprev
      security:
        - BearerAuth: []
      parameters:
        - name: includedFrom
          in: query
          required: false
          description: Data/hora mínima de inclusão na Dataprev (ISO-8601)
          schema:
            type: string
            format: date-time
        - name: includedTo
          in: query
          required: false
          description: Data/hora máxima de inclusão na Dataprev (ISO-8601)
          schema:
            type: string
            format: date-time
        - name: page
          in: query
          required: false
          description: Número da página (0-based)
          schema:
            type: integer
            default: 0
        - name: size
          in: query
          required: false
          description: Tamanho da página
          schema:
            type: integer
            default: 20
      responses:
        '200':
          description: Página de transferências retornada com sucesso
          content:
            application/json:
              schema:
                type: object
                properties:
                  content:
                    type: array
                    items:
                      type: object
                      properties:
                        id:
                          type: integer
                          format: int64
                          example: 89
                        dataprevId:
                          type: integer
                          format: int64
                          example: 456789
                        contractNumber:
                          type: string
                          description: Número do contrato (8 dígitos com zero à esquerda). Ex. 00345678
                          example: 00345678
                        amountPaid:
                          type: number
                          format: decimal
                          description: Valor pago em reais (decimal com 2 casas decimais).
                          example: 593.78
                        guidePaymentAt:
                          type: string
                          format: date-time
                          example: '2024-04-25T00:00:00Z'
                        transferAt:
                          type: string
                          format: date-time
                          example: '2024-04-28T14:30:00Z'
                        guideNumber:
                          type: integer
                          format: int64
                          example: 123456
                        trfCode:
                          type: integer
                          format: int64
                          example: 1
                        competence:
                          type: integer
                          example: 202404
                        nsu:
                          type: integer
                          format: int64
                          example: 987654
                        lateInterestAmount:
                          type: number
                          format: decimal
                          description: Juros de mora em reais (decimal com 2 casas decimais).
                          example: 0
                        penaltyAmount:
                          type: number
                          format: decimal
                          description: Multa em reais (decimal com 2 casas decimais).
                          example: 0
                        monetaryAdjustmentAmount:
                          type: number
                          format: decimal
                          description: Ajuste monetário em reais (decimal com 2 casas decimais).
                          example: 0
                        includedAtDataprev:
                          type: string
                          format: date-time
                        institutionCode:
                          type: integer
                        cpf:
                          type: string
                        registrationNumber:
                          type: string
                        operatorTaxId:
                          type: integer
                          format: int64
                        employerRegistrationTypeCode:
                          type: integer
                        employerRegistrationNumber:
                          type: integer
                          format: int64
                      example:
                        id: 89
                        dataprevId: 456789
                        contractNumber: 00345678
                        amountPaid: 593.78
                        guidePaymentAt: '2024-04-25T00:00:00Z'
                        transferAt: '2024-04-28T14:30:00Z'
                        guideNumber: 123456
                        trfCode: 1
                        competence: 202404
                        nsu: 987654
                        lateInterestAmount: 0
                        penaltyAmount: 0
                        monetaryAdjustmentAmount: 0
                  totalElements:
                    type: integer
                    format: int64
                  totalPages:
                    type: integer
                  size:
                    type: integer
                  number:
                    type: integer
                  numberOfElements:
                    type: integer
                  first:
                    type: boolean
                  last:
                    type: boolean
                  empty:
                    type: boolean
                example:
                  content:
                    - id: 89
                      dataprevId: 456789
                      contractNumber: 00345678
                      amountPaid: 593.78
                      guidePaymentAt: '2024-04-25T00:00:00Z'
                      transferAt: '2024-04-28T14:30:00Z'
                  totalElements: 1
                  totalPages: 1
                  size: 20
                  number: 0
                  numberOfElements: 1
                  first: true
                  last: true
                  empty: false
        '401':
          description: Não autenticado
        '403':
          description: Permissão insuficiente
  /api/v1/originator/dataprev/bookkeeping-entries:
    get:
      summary: Listar lançamentos contábeis (paginado)
      description: 'Retorna os lançamentos contábeis Dataprev do originador autenticado, com paginação e filtro opcional por data de inclusão.'
      tags:
        - Dataprev
      security:
        - BearerAuth: []
      parameters:
        - name: includedFrom
          in: query
          required: false
          description: Data/hora mínima de inclusão na Dataprev (ISO-8601)
          schema:
            type: string
            format: date-time
        - name: includedTo
          in: query
          required: false
          description: Data/hora máxima de inclusão na Dataprev (ISO-8601)
          schema:
            type: string
            format: date-time
        - name: page
          in: query
          required: false
          description: Número da página (0-based)
          schema:
            type: integer
            default: 0
        - name: size
          in: query
          required: false
          description: Tamanho da página
          schema:
            type: integer
            default: 20
      responses:
        '200':
          description: Página de lançamentos retornada com sucesso
          content:
            application/json:
              schema:
                type: object
                properties:
                  content:
                    type: array
                    items:
                      type: object
                      properties:
                        id:
                          type: integer
                          format: int64
                          example: 201
                        dataprevId:
                          type: integer
                          format: int64
                          example: 456789
                        contractNumber:
                          type: string
                          description: Número do contrato (8 dígitos com zero à esquerda). Ex. 00345678
                          example: 00345678
                        referencePeriod:
                          type: integer
                          example: 202404
                        deductionAmount:
                          type: number
                          format: decimal
                          description: Valor da dedução em reais (decimal com 2 casas decimais).
                          example: 593.78
                        includedAtDataprev:
                          type: string
                          format: date-time
                        eSocialEventId:
                          type: integer
                          format: int64
                        dataMatch:
                          type: boolean
                        eventTypeCode:
                          type: integer
                        institutionCode:
                          type: integer
                        cpf:
                          type: string
                        registrationNumber:
                          type: string
                        employerRegistrationTypeCode:
                          type: integer
                        employerRegistrationNumber:
                          type: integer
                          format: int64
                        loanInstitutionCode:
                          type: integer
                        loanInstallmentValue:
                          type: number
                          format: decimal
                        analysisContractBooked:
                          type: boolean
                        analysisWorkerBooked:
                          type: boolean
                        analysisInstitutionCorrect:
                          type: boolean
                        analysisInstallmentValueCorrect:
                          type: boolean
                        analysisLinkCorrect:
                          type: boolean
                        exclusionEventDatetime:
                          type: string
                        correctionEventDatetime:
                          type: string
                        exclusionEventId:
                          type: integer
                          format: int64
                        correctionEventId:
                          type: integer
                          format: int64
                      example:
                        id: 201
                        dataprevId: 456789
                        contractNumber: 00345678
                        referencePeriod: 202404
                        deductionAmount: 593.78
                        includedAtDataprev: '2024-04-30T12:00:00Z'
                  totalElements:
                    type: integer
                    format: int64
                  totalPages:
                    type: integer
                  size:
                    type: integer
                  number:
                    type: integer
                  numberOfElements:
                    type: integer
                  first:
                    type: boolean
                  last:
                    type: boolean
                  empty:
                    type: boolean
                example:
                  content:
                    - id: 201
                      dataprevId: 456789
                      contractNumber: 00345678
                      referencePeriod: 202404
                      deductionAmount: 593.78
                  totalElements: 1
                  totalPages: 1
                  size: 20
                  number: 0
                  numberOfElements: 1
                  first: true
                  last: true
                  empty: false
        '401':
          description: Não autenticado
        '403':
          description: Permissão insuficiente
  /api/v1/originator/disbursement-accounts:
    put:
      summary: Atualizar Conta de Desembolso
      description: Atualiza conta de desembolso de um contrato
      tags:
        - Disbursement
      security:
        - BearerAuth: []
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required:
                - ccbNumber
                - ticket
              properties:
                ccbNumber:
                  type: string
                  maxLength: 50
                ticket:
                  type: string
                  maxLength: 100
                pix:
                  type: object
                  required:
                    - keyType
                    - key
                  properties:
                    keyType:
                      type: string
                      enum:
                        - CPF
                        - CNPJ
                        - EMAIL
                        - PHONE
                        - RANDOM
                      description: |
                        Tipo da chave Pix.
                        | Valor | Significado |
                        |-------|-------------|
                        | CPF | Chave CPF |
                        | CNPJ | Chave CNPJ |
                        | EMAIL | E-mail |
                        | PHONE | Telefone |
                        | RANDOM | Chave aleatória (EVP) |
                    key:
                      type: string
                      maxLength: 255
                  example:
                    keyType: CPF
                    key: '12345678901'
                bankAccount:
                  type: object
                  required:
                    - bankCode
                    - branchNumber
                    - accountNumber
                    - accountType
                  properties:
                    bankCode:
                      type: string
                      maxLength: 3
                    branchNumber:
                      type: string
                      maxLength: 4
                    accountNumber:
                      type: string
                      maxLength: 20
                    accountDigit:
                      type: string
                      maxLength: 2
                    accountType:
                      type: string
                      enum:
                        - CHECKING
                        - SAVINGS
                      description: |
                        Tipo da conta.
                        | Valor | Significado |
                        |-------|-------------|
                        | CHECKING | Conta corrente |
                        | SAVINGS | Conta poupança |
                  example:
                    bankCode: '001'
                    branchNumber: '1234'
                    accountNumber: '123456'
                    accountDigit: '7'
                    accountType: CHECKING
              example:
                ccbNumber: CCB-2024-001
                ticket: TKT-ABC123
                pix:
                  keyType: CPF
                  key: '12345678901'
            example:
              ccbNumber: CCB123456
              ticket: TICKET-001
              pix:
                keyType: CPF
                key: '12345678901'
      responses:
        '204':
          description: Conta atualizada com sucesso
        '400':
          description: Dados inválidos
        '401':
          description: Não autenticado
        '403':
          description: Permissão insuficiente
        '404':
          description: Contrato não encontrado
  /api/v1/banks:
    get:
      summary: Listar Bancos
      description: 'Lista bancos disponíveis para desembolso, com filtro opcional por nome'
      tags:
        - Banks
      parameters:
        - name: search
          in: query
          required: false
          description: Termo de busca para filtrar bancos por nome
          schema:
            type: string
      responses:
        '200':
          description: Bancos retornados com sucesso
          content:
            application/json:
              schema:
                type: array
                items:
                  type: object
                  properties:
                    code:
                      type: string
                      description: Código do banco
                    ispb:
                      type: string
                      description: Código ISPB do banco
                    name:
                      type: string
                      description: Nome completo do banco
                    shortName:
                      type: string
                      description: Nome curto do banco
                    supportsPix:
                      type: boolean
                      description: Indica se o banco suporta PIX
                    active:
                      type: boolean
                      description: Indica se o banco está ativo
                  example:
                    code: '001'
                    ispb: '00000000'
                    name: Banco do Brasil S.A.
                    shortName: Banco do Brasil
                    supportsPix: true
                    active: true
  '/api/v1/banks/{code}':
    get:
      summary: Buscar Banco
      description: Busca um banco pelo código
      tags:
        - Banks
      parameters:
        - name: code
          in: path
          required: true
          description: Código do banco
          schema:
            type: string
      responses:
        '200':
          description: Banco retornado com sucesso
          content:
            application/json:
              schema:
                type: object
                properties:
                  code:
                    type: string
                    description: Código do banco
                  ispb:
                    type: string
                    description: Código ISPB do banco
                  name:
                    type: string
                    description: Nome completo do banco
                  shortName:
                    type: string
                    description: Nome curto do banco
                  supportsPix:
                    type: boolean
                    description: Indica se o banco suporta PIX
                  active:
                    type: boolean
                    description: Indica se o banco está ativo
                example:
                  code: '001'
                  ispb: '00000000'
                  name: Banco do Brasil S.A.
                  shortName: Banco do Brasil
                  supportsPix: true
                  active: true
        '404':
          description: Banco não encontrado
  /api/v1/loan-limits:
    get:
      summary: Consultar Limites de Empréstimo
      description: Retorna os limites e parâmetros configurados para empréstimos
      tags:
        - Loan Limits
      responses:
        '200':
          description: Limites retornados com sucesso
          content:
            application/json:
              schema:
                type: object
                properties:
                  minAmount:
                    type: number
                    format: decimal
                    description: Valor mínimo do empréstimo em reais (decimal com 2 casas decimais).
                  maxAmount:
                    type: number
                    format: decimal
                    description: Valor máximo do empréstimo em reais (decimal com 2 casas decimais).
                  minInstallment:
                    type: number
                    format: decimal
                    description: Valor mínimo da parcela em reais (decimal com 2 casas decimais).
                  maxInstallment:
                    type: number
                    format: decimal
                    description: Valor máximo da parcela em reais (decimal com 2 casas decimais).
                  minTerm:
                    type: integer
                    description: Prazo mínimo em meses
                  maxTerm:
                    type: integer
                    description: Prazo máximo em meses
                  minInterestRate:
                    type: number
                    format: decimal
                    description: Taxa de juros mínima em percentual (decimal com 4 casas decimais).
                  maxInterestRate:
                    type: number
                    format: decimal
                    description: Taxa de juros máxima em percentual (decimal com 4 casas decimais).
                  totalMarginPercentage:
                    type: integer
                    description: Percentual total da margem consignável
                  usableMarginPercentage:
                    type: integer
                    description: Percentual utilizável da margem
                  minEmployeeAge:
                    type: integer
                    description: Idade mínima do employee
                  maxEmployeeAgeAtContractEnd:
                    type: integer
                    description: Idade máxima do employee ao final do contrato
                  minEmploymentMonths:
                    type: integer
                    description: Tempo mínimo de vínculo empregatício em meses
                  maxActiveContracts:
                    type: integer
                    description: Número máximo de contratos ativos
                  minEmployerExistenceMonths:
                    type: integer
                    description: Tempo mínimo de existência do empregador em meses
                example:
                  minAmount: 2200
                  maxAmount: 20000
                  minInstallment: 280
                  maxInstallment: 2000
                  minTerm: 12
                  maxTerm: 24
                  minInterestRate: 4
                  maxInterestRate: 5
                  totalMarginPercentage: 35
                  usableMarginPercentage: 70
                  minEmployeeAge: 21
                  maxEmployeeAgeAtContractEnd: 55
                  minEmploymentMonths: 3
                  maxActiveContracts: 9
                  minEmployerExistenceMonths: 24
  /api/v1/originator/webhooks:
    post:
      summary: Criar subscription de webhook
      description: |
        Cria a configuração de webhook do originator autenticado.
        Cada originator pode ter apenas uma subscription (1:1).
        Retorna 409 se já existir subscription para o originator.
      tags:
        - Webhooks
      security:
        - BearerAuth: []
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required:
                - webhookUrls
                - authKey
                - authValue
              properties:
                webhookUrls:
                  type: array
                  minItems: 1
                  maxItems: 20
                  items:
                    type: string
                    format: uri
                    pattern: '^https://'
                    maxLength: 500
                    description: URL HTTPS que receberá os eventos de webhook (POST).
                  description: Lista de URLs de destino para entrega dos eventos. Pelo menos uma obrigatória.
                authKey:
                  type: string
                  maxLength: 100
                  description: 'Nome do header HTTP usado para autenticação nas chamadas de webhook (ex. X-Webhook-Secret, Authorization).'
                authValue:
                  type: string
                  maxLength: 500
                  description: Valor do header de autenticação enviado em cada POST para as URLs configuradas.
              example:
                webhookUrls:
                  - 'https://api.parceiro.com/webhooks/gtpayroll'
                authKey: X-Webhook-Secret
                authValue: seu-token-secreto
      responses:
        '201':
          description: Subscription criada com sucesso
          content:
            application/json:
              schema:
                type: object
                description: |
                  Representa a subscription de webhook do originator (1:1).
                  O campo `authValue` não é retornado por segurança.
                properties:
                  id:
                    type: integer
                    format: int64
                    description: Identificador interno da subscription.
                  webhookUrls:
                    type: array
                    items:
                      type: string
                    description: URLs configuradas para receber os eventos.
                  authKey:
                    type: string
                    description: Nome do header de autenticação configurado.
                  active:
                    type: boolean
                    description: Indica se a subscription está ativa.
                  createdDate:
                    type: string
                    format: date-time
                    description: Data de criação do registro.
                  lastModifiedDate:
                    type: string
                    format: date-time
                    nullable: true
                    description: Data da última alteração.
                example:
                  id: 1
                  webhookUrls:
                    - 'https://api.parceiro.com/webhooks/gtpayroll'
                  authKey: X-Webhook-Secret
                  active: true
                  createdDate: '2025-03-01T10:00:00'
                  lastModifiedDate: '2025-03-05T14:30:00'
        '400':
          description: Dados inválidos
        '401':
          description: Não autenticado
        '403':
          description: Permissão insuficiente
        '409':
          description: Já existe subscription de webhook para este originator
    get:
      summary: Consultar subscription de webhook
      description: Retorna a configuração de webhook do originator autenticado. 404 se ainda não tiver subscription.
      tags:
        - Webhooks
      security:
        - BearerAuth: []
      responses:
        '200':
          description: Subscription retornada com sucesso
          content:
            application/json:
              schema:
                type: object
                description: |
                  Representa a subscription de webhook do originator (1:1).
                  O campo `authValue` não é retornado por segurança.
                properties:
                  id:
                    type: integer
                    format: int64
                    description: Identificador interno da subscription.
                  webhookUrls:
                    type: array
                    items:
                      type: string
                    description: URLs configuradas para receber os eventos.
                  authKey:
                    type: string
                    description: Nome do header de autenticação configurado.
                  active:
                    type: boolean
                    description: Indica se a subscription está ativa.
                  createdDate:
                    type: string
                    format: date-time
                    description: Data de criação do registro.
                  lastModifiedDate:
                    type: string
                    format: date-time
                    nullable: true
                    description: Data da última alteração.
                example:
                  id: 1
                  webhookUrls:
                    - 'https://api.parceiro.com/webhooks/gtpayroll'
                  authKey: X-Webhook-Secret
                  active: true
                  createdDate: '2025-03-01T10:00:00'
                  lastModifiedDate: '2025-03-05T14:30:00'
        '401':
          description: Não autenticado
        '403':
          description: Permissão insuficiente
        '404':
          description: Subscription não encontrada
    put:
      summary: Atualizar subscription de webhook
      description: 'Atualiza URLs, header de autenticação e flag ativo da subscription do originator autenticado.'
      tags:
        - Webhooks
      security:
        - BearerAuth: []
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required:
                - webhookUrls
                - authKey
                - authValue
                - active
              properties:
                webhookUrls:
                  type: array
                  minItems: 1
                  maxItems: 20
                  items:
                    type: string
                    format: uri
                    pattern: '^https://'
                    maxLength: 500
                  description: Lista de URLs de destino para entrega dos eventos.
                authKey:
                  type: string
                  maxLength: 100
                  description: Nome do header HTTP de autenticação.
                authValue:
                  type: string
                  maxLength: 500
                  description: Valor do header de autenticação.
                active:
                  type: boolean
                  description: Indica se a subscription está ativa (true) ou pausada (false).
              example:
                webhookUrls:
                  - 'https://api.parceiro.com/webhooks/gtpayroll'
                authKey: X-Webhook-Secret
                authValue: novo-token-secreto
                active: true
      responses:
        '200':
          description: Subscription atualizada com sucesso
          content:
            application/json:
              schema:
                type: object
                description: |
                  Representa a subscription de webhook do originator (1:1).
                  O campo `authValue` não é retornado por segurança.
                properties:
                  id:
                    type: integer
                    format: int64
                    description: Identificador interno da subscription.
                  webhookUrls:
                    type: array
                    items:
                      type: string
                    description: URLs configuradas para receber os eventos.
                  authKey:
                    type: string
                    description: Nome do header de autenticação configurado.
                  active:
                    type: boolean
                    description: Indica se a subscription está ativa.
                  createdDate:
                    type: string
                    format: date-time
                    description: Data de criação do registro.
                  lastModifiedDate:
                    type: string
                    format: date-time
                    nullable: true
                    description: Data da última alteração.
                example:
                  id: 1
                  webhookUrls:
                    - 'https://api.parceiro.com/webhooks/gtpayroll'
                  authKey: X-Webhook-Secret
                  active: true
                  createdDate: '2025-03-01T10:00:00'
                  lastModifiedDate: '2025-03-05T14:30:00'
        '400':
          description: Dados inválidos
        '401':
          description: Não autenticado
        '403':
          description: Permissão insuficiente
        '404':
          description: Subscription não encontrada
    delete:
      summary: Remover subscription de webhook
      description: Remove a configuração de webhook do originator autenticado. O envio de eventos para as URLs cessa.
      tags:
        - Webhooks
      security:
        - BearerAuth: []
      responses:
        '204':
          description: Subscription removida com sucesso
        '401':
          description: Não autenticado
        '403':
          description: Permissão insuficiente
        '404':
          description: Subscription não encontrada
components:
  schemas:
    WebhookEventType:
      type: string
      description: |
        Tipo do evento de webhook.
        | Valor | Significado |
        |-------|-------------|
        | MARGIN_QUERY_COMPLETED | Consulta de margem concluída |
        | AUTHORIZATION_COMPLETED | Autorização (termo) concluída |
        | ENDORSEMENT_ENDORSED | Averbação confirmada |
        | ENDORSEMENT_FAILED | Falha na averbação |
        | ENDORSEMENT_RETRYING | Nova tentativa de averbação |
        | ENDORSEMENT_PROCESSING | Averbação em processamento |
        | ENDORSEMENT_PENDING | Averbação pendente |
        | PAYMENT_SUCCESS | Pagamento/desembolso com sucesso |
        | PAYMENT_REVISION | Revisão de pagamento |
        | PAYMENT_FAILURE | Falha no pagamento |
        | CCB_RECEIVED | CCB recebida |
        | SIGNATURE_LINK_RESEND | Reenvio de link de assinatura |
      enum:
        - MARGIN_QUERY_COMPLETED
        - AUTHORIZATION_COMPLETED
        - ENDORSEMENT_ENDORSED
        - ENDORSEMENT_FAILED
        - ENDORSEMENT_RETRYING
        - ENDORSEMENT_PROCESSING
        - ENDORSEMENT_PENDING
        - PAYMENT_SUCCESS
        - PAYMENT_REVISION
        - PAYMENT_FAILURE
        - CCB_RECEIVED
        - SIGNATURE_LINK_RESEND
    WebhookSourceType:
      type: string
      description: |
        Entidade de origem do evento.
        | Valor | Significado |
        |-------|-------------|
        | EMPLOYEE | Colaborador/trabalhador |
        | CONTRACT | Contrato |
        | GTBANKER | Sistema de formalização/pagamento |
      enum:
        - EMPLOYEE
        - CONTRACT
        - GTBANKER
    MarginWebhookPayload:
      type: object
      description: Payload do evento MARGIN_QUERY_COMPLETED
      properties:
        cpf:
          type: string
          description: CPF do colaborador
          example: '12345678901'
        publicId:
          type: string
          description: Identificador público (16 caracteres Base64 URL-safe). Ex. Kj8mP2xQ9nR4sT6v
          example: Kj8mP2xQ9nR4sT6v
        status:
          type: string
          description: Status da consulta de margem (`MARGIN_UPDATED` quando concluída)
          example: MARGIN_UPDATED
      example:
        cpf: '12345678901'
        publicId: Kj8mP2xQ9nR4sT6v
        status: MARGIN_UPDATED
    AuthorizationWebhookPayload:
      type: object
      description: Payload do evento AUTHORIZATION_COMPLETED
      properties:
        cpf:
          type: string
          description: CPF do colaborador
          example: '12345678901'
        publicId:
          type: string
          description: Identificador público (16 caracteres Base64 URL-safe). Ex. Kj8mP2xQ9nR4sT6v
          example: Kj8mP2xQ9nR4sT6v
        status:
          type: string
          description: Status da autorização (`AUTHORIZED` quando concluída)
          example: AUTHORIZED
        termExpiresAt:
          type: string
          format: date-time
          description: Data de expiração do termo de autorização
          example: '2026-03-28T23:59:59Z'
        tokenExpiresAt:
          type: string
          format: date-time
          description: Data de expiração do token de autorização
          example: '2026-03-01T12:00:00Z'
      example:
        cpf: '12345678901'
        publicId: Kj8mP2xQ9nR4sT6v
        status: AUTHORIZED
        termExpiresAt: '2026-03-28T23:59:59Z'
        tokenExpiresAt: '2026-03-01T12:00:00Z'
    EndorsementWebhookPayload:
      type: object
      description: Payload dos eventos ENDORSEMENT_*
      properties:
        contractNumber:
          type: string
          description: Número do contrato (8 dígitos com zero à esquerda). Ex. 00345678. Corresponde a ContractResponse.contractNumber.
          example: 00345678
        status:
          type: string
          description: |
            Status da averbação. Mesmos valores de ContractResponse.endorsementStatus.
            | Valor | Significado |
            |-------|-------------|
            | ENDORSED | Averbação confirmada |
            | FAILED | Falha na averbação |
            | RETRYING | Nova tentativa |
            | PROCESSING | Em processamento |
            | PENDING | Pendente |
          enum:
            - ENDORSED
            - FAILED
            - RETRYING
            - PROCESSING
            - PENDING
          example: ENDORSED
        protocol:
          type: string
          description: Protocolo da averbação retornado pelo Dataprev. Corresponde a ContractResponse.endorsementProtocol.
          example: '20260226143000'
        failureReason:
          type: string
          nullable: true
          description: Motivo da falha (apenas quando status = FAILED)
          example: null
      example:
        contractNumber: 00345678
        status: ENDORSED
        protocol: '20260226143000'
        failureReason: null
    SignatureLinkResendWebhookPayload:
      type: object
      description: Payload do evento SIGNATURE_LINK_RESEND
      properties:
        cpf:
          type: string
          description: CPF do colaborador
          example: '12345678901'
        publicId:
          type: string
          description: Identificador público (16 caracteres Base64 URL-safe). Ex. Kj8mP2xQ9nR4sT6v
          example: Kj8mP2xQ9nR4sT6v
        requestNumber:
          type: string
          nullable: true
          description: Número da requisição (GT + 10 alfanuméricos maiúsculos). Ex. GTAB12CD34EF. Corresponde a ContractResponse.requestNumber.
          example: GTAB12CD34EF
        nsu:
          type: string
          description: NSU da operação
          example: NSU-123456
        signUrl:
          type: string
          description: URL de assinatura reenviada
          example: 'https://assinatura.giro.tech/sign/abc123'
      example:
        cpf: '12345678901'
        publicId: Kj8mP2xQ9nR4sT6v
        requestNumber: GTAB12CD34EF
        nsu: NSU-123456
        signUrl: 'https://assinatura.giro.tech/sign/abc123'
  securitySchemes:
    BearerAuth:
      type: http
      scheme: bearer
      bearerFormat: JWT
      description: JWT token fornecido pelo administrador
