> ## Documentation Index
> Fetch the complete documentation index at: https://docs.extat.com.br/llms.txt
> Use this file to discover all available pages before exploring further.

# Estorna um pagamento de lançamento de conta bancária.

> F1: grava a operação inversa no extrato da conta QUE RECEBEU o pagamento (não a conta atual do lançamento), com data de hoje, e devolve o saldo dessa conta ao valor anterior. O pagamento não é apagado: ganha uma linha `kind=reversal` que o referencia, e o restante dele vai a 0. Estorna o restante (o pagamento inteiro, ou o que sobrou depois de uma redução de valor). O status é recalculado (pago parcial, ou pelo vencimento). `reason` é obrigatório e fica na auditoria. Operação atômica.



## OpenAPI

````yaml /openapi/extat-openapi.json post /companies/transactions/{id}/payments/{paymentId}/reverse
openapi: 3.0.0
info:
  contact:
    email: contato@cernedigital.io
    name: Cerne Digital
    url: https://cernedigital.io
  description: >-
    API REST da Extat Plataforma usada pelo painel web. Artefato OpenAPI 3.0
    para a documentação Mintlify (tags em PT-BR).
  license:
    name: Apache 2.0
    url: http://www.apache.org/licenses/LICENSE-2.0.html
  termsOfService: http://swagger.io/terms/
  title: Extat Plataforma - API REST
  version: '1.0'
servers:
  - url: https://golang-api-vgnqx.ondigitalocean.app/v1
security: []
tags:
  - name: Autenticação
  - name: Bancos
  - name: Contas Bancárias
  - name: Plano e Assinaturas
  - name: Empresa
  - name: Centros de Custo
  - name: Painel
  - name: Demonstrativos
  - name: Saúde
  - name: Convites
  - name: Membros
  - name: Onboarding
  - name: Fornecedores
  - name: Usuário
  - name: DangerZone
paths:
  /companies/transactions/{id}/payments/{paymentId}/reverse:
    post:
      tags:
        - Empresa
      summary: Estorna um pagamento de lançamento de conta bancária.
      description: >-
        F1: grava a operação inversa no extrato da conta QUE RECEBEU o pagamento
        (não a conta atual do lançamento), com data de hoje, e devolve o saldo
        dessa conta ao valor anterior. O pagamento não é apagado: ganha uma
        linha `kind=reversal` que o referencia, e o restante dele vai a 0.
        Estorna o restante (o pagamento inteiro, ou o que sobrou depois de uma
        redução de valor). O status é recalculado (pago parcial, ou pelo
        vencimento). `reason` é obrigatório e fica na auditoria. Operação
        atômica.
      parameters:
        - description: company uuid
          in: header
          name: x-company-id
          required: true
          schema:
            type: string
        - description: Transaction ID
          in: path
          name: id
          required: true
          schema:
            type: string
        - description: Transaction Payment ID
          in: path
          name: paymentId
          required: true
          schema:
            type: string
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/transaction.ReversePaymentRequestDTO'
        description: Motivo do estorno
        required: true
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/transaction.TransactionDetailResponseDTO'
          description: o lançamento atualizado, como no GET /companies/transactions/{id}
        '400':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/handler.ErrorResponseDTO'
          description: corpo malformado ou id do lançamento malformado
        '403':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/handler.ErrorResponseDTO'
          description: usuário não é membro desta empresa
        '404':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/handler.ErrorResponseDTO'
          description: >-
            transaction_not_found (lançamento inexistente ou de outra empresa),
            payment_not_found (pagamento inexistente ou de outro lançamento)
        '409':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/handler.ErrorResponseDTO'
          description: >-
            payment_already_reversed (pagamento já estornado, ou o id é de uma
            linha de estorno)
        '422':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/handler.ErrorResponseDTO'
          description: >-
            reason_required, credit_card_not_reversible (compra no cartão:
            estorne o pagamento da fatura), account_unavailable (conta do
            pagamento excluída ou inativa)
        '500':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/handler.ErrorResponseDTO'
          description: Internal Server Error
      security:
        - ApiKeyAuth: []
components:
  schemas:
    transaction.ReversePaymentRequestDTO:
      properties:
        reason:
          type: string
      type: object
    transaction.TransactionDetailResponseDTO:
      properties:
        amount:
          type: string
        audit_logs:
          items:
            $ref: '#/components/schemas/transaction.TransactionAuditLogResponseDTO'
          type: array
        bank_account:
          description: >-
            BankAccount é PONTEIRO (CERNE-304/T4d): uma transação de cartão de
            crédito

            não tem conta bancária, e o contrato precisa expressar isso como
            `null`

            explícito no JSON — nunca `{}` (pareceria conta real de campos
            vazios) e

            nunca campo ausente (o front não distinguiria de versão antiga da
            API).

            Decisão registrada em plan.md, Q6.
          type: object
        category:
          $ref: '#/components/schemas/coa.ChartOfAccountResponseDTO'
        competence:
          type: string
        contact:
          type: string
        cost_center:
          description: >-
            swaggertype: o swag v1.16 não resolve o alias dto2 (há quatro
            pacotes

            "dto" importados aqui) e o make swagger falhava. Só a doc fica
            genérica;

            o JSON é o mesmo.
          type: object
        created_at:
          type: string
        created_by:
          type: object
        credit_card:
          allOf:
            - $ref: >-
                #/components/schemas/transaction.TransactionCreditCardResponseDTO
          description: >-
            CreditCard é o espelho de BankAccount para a outra origem (CERNE-304
            /

            T11): `null` explícito no lançamento de conta bancária, preenchido
            na

            compra de cartão. Campo NOVO e aditivo — quem já ignora o corpo não

            percebe, e quem lê `origin` sabe qual dos dois consultar.
        due_date:
          type: string
        id:
          type: string
        more_infos:
          type: string
        origin:
          description: |-
            Origin é o discriminador explícito da origem do lançamento — ver as
            constantes acima. Sempre presente, nunca vazio.
          type: string
        payment_date:
          type: string
        payments:
          items:
            $ref: '#/components/schemas/transaction.TransactionPaymentResponse'
          type: array
        reference:
          type: string
        status:
          type: string
        supplier:
          $ref: '#/components/schemas/dto.SupplierResponseDTO'
        tags:
          items:
            type: string
          type: array
        type:
          type: string
        updated_at:
          type: string
        url:
          type: string
      type: object
    handler.ErrorResponseDTO:
      properties:
        error:
          type: string
        message:
          type: string
      type: object
    transaction.TransactionAuditLogResponseDTO:
      properties:
        actor_id:
          type: string
        after:
          type: object
        before:
          type: object
        created_at:
          type: string
        effects:
          items:
            type: object
          type: array
        id:
          type: string
        operation:
          enum:
            - payment_reversal
            - paid_transaction_update
            - paid_transaction_delete
          type: string
        reason:
          type: string
      type: object
    coa.ChartOfAccountResponseDTO:
      properties:
        active:
          type: boolean
        children:
          items:
            $ref: '#/components/schemas/coa.ChartOfAccountResponseDTO'
          type: array
        code:
          type: string
        description:
          type: string
        id:
          type: integer
        is_default:
          type: boolean
        is_title:
          type: boolean
        label:
          type: string
        parent_id:
          type: integer
        type:
          type: string
      type: object
    transaction.TransactionCreditCardResponseDTO:
      properties:
        alias:
          type: string
        id:
          type: string
        installment:
          allOf:
            - $ref: >-
                #/components/schemas/transaction.TransactionInstallmentResponseDTO
          description: >-
            Installment é o contexto de PARCELAMENTO (plan-parcelamento.md §4),
            e é

            o que torna a listagem interpretável depois da RN1': uma compra de

            R$ 10.000 em 5× virou cinco linhas de R$ 2.000, e sem isto o front
            não

            tem como dizer quais delas são a mesma compra.


            nil quando a movimentação veio por um caminho que não carrega o
            contexto

            — a resposta do POST, por exemplo, devolve a linha recém-criada sem

            reconsultar. A listagem e o GET por id sempre trazem.


            Isto NÃO contradiz o comentário acima sobre "deliberadamente menor":
            o

            que continua de fora são limite, dia de fechamento e KPIs, que
            exigiriam

            as agregações de fatura. O parcelamento sai de UMA query em lote
            sobre a

            página (attachInstallmentContext) e é o dado sem o qual a linha não
            se

            explica.
        issuer:
          type: string
        last4:
          type: string
      type: object
    transaction.TransactionPaymentResponse:
      properties:
        amount:
          type: number
        bank_account:
          type: object
        created_at:
          type: string
        created_by:
          type: object
        id:
          type: string
        kind:
          description: >-
            Estado de estorno (paid-transaction-reversal / T10), campos
            aditivos.

            Kind=reversal é uma linha de estorno, com Amount NEGATIVO e

            ReversesPaymentID apontando para o pagamento reduzido; a soma de

            `amount` de todas as linhas continua sendo o total pago ativo.
          enum:
            - payment
            - reversal
          type: string
        payment_date:
          type: string
        payment_method:
          type: string
        reason:
          type: string
        remaining_amount:
          description: |-
            RemainingAmount: quanto deste pagamento ainda é estornável (amount +
            estornos que o referenciam). 0 em linha de estorno.
          type: number
        reversed:
          description: |-
            Reversed: pagamento integralmente estornado (restante 0). false em
            linha de estorno e em pagamento só parcialmente estornado.
          type: boolean
        reverses_payment_id:
          type: string
        updated_at:
          type: string
      type: object
    dto.SupplierResponseDTO:
      properties:
        active:
          type: boolean
        created_at:
          type: string
        document:
          type: string
        id:
          type: string
        name:
          type: string
        updated_at:
          type: string
      type: object
    transaction.TransactionInstallmentResponseDTO:
      properties:
        invoice_id:
          type: string
        number:
          type: integer
        purchase_id:
          type: string
        purchase_total:
          description: >-
            PurchaseTotal é o valor INTEGRAL da compra, com o par String+Value
            do

            padrão do agregado: a tela mostra "3/5 de R$ 10.000,00" sem
            reparsear

            moeda nem somar as parcelas por conta própria.
          type: string
        purchase_total_value:
          type: number
        total:
          type: integer
      type: object
  securitySchemes:
    ApiKeyAuth:
      description: >-
        Token da sessão no cabeçalho Authorization, no formato Bearer (mesmo
        esquema ApiKeyAuth do contrato).
      in: header
      name: Authorization
      type: apiKey

````

This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.