openapi: 3.1.0
info:
  title: Mottu Wallet API
  description: API para o fluxo de transações iniciados pelo estabelecimento.
  version: 0.0.1
paths:
  /transaction:
    post:
      summary: Gera uma cobrança
      description: Gera uma nova cobrança de um estabelecimento para ser autorizado por um cliente Mottu.
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/Transaction'
      responses:
        '200':
          description: Id da Cobrança Mottu
          content:
            application/json:
              schema:
                type: object
                properties:
                  id:
                    type: string
                    example: "1e1a71e3-d04e-4fbd-805f-6e7971eabad3"
      callbacks:
        transactionStatus:
          '{$ref.request.body#/callbackUrl}':
            post:
              summary: Status da cobrança
              description: Status de uma cobrança específica.
              responses:
                '200':
                  description: Confirma o status da cobrança
                  content:
                    application/json:
                      schema:
                        type: object
                        required:
                          - id
                          - status
                        properties:
                          id:
                            type: string
                            example: "1e1a71e3-d04e-4fbd-805f-6e7971eabad3"
                          status:
                            type: string
                            enum:
                              - created
                              - pending
                              - confirmed
                              - cancelled
                              - reversed
                            example: "created"

  '${callbackUrl}':
    post:
      summary: Status da cobrança
      description: Status de uma cobrança específica.
      responses:
        '200':
          description: Confirma o status da cobrança
          content:
            application/json:
              schema:
                type: object
                required:
                  - id
                  - status
                properties:
                  id:
                    type: string
                    example: "1e1a71e3-d04e-4fbd-805f-6e7971eabad3"
                  status:
                    type: string
                    enum:
                      - created
                      - pending
                      - confirmed
                      - cancelled
                      - reversed
                    example: "created"
  /transaction/{id}:
    get:
      summary: Status da cobrança
      description: Status de uma cobrança específica.
      responses:
        '200':
          description: Confirma o status da cobrança
          content:
            application/json:
              schema:
                type: object
                required:
                  - id
                  - status
                properties:
                  id:
                    type: string
                    example: "1e1a71e3-d04e-4fbd-805f-6e7971eabad3"
                  status:
                    type: string
                    enum:
                      - created
                      - pending
                      - confirmed
                      - cancelled
                      - reversed
                    example: "created"
  /transaction/{id}/cancel:
    post:
      summary: Cancela uma cobrança
      description: Cancela uma cobrança específica usando o ID da cobrança, pode ser usada apenas se a transação ainda não foi autorizada.
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
          example: "1e1a71e3-d04e-4fbd-805f-6e7971eabad3"
      responses:
        '200':
          description: Cobrança cancelada
          content:
            application/json:
              schema:
                type: object
                properties:
                  status:
                    type: string
                    enum:
                      - confirmed
                    example: "confirmed"
        '400':
          description: Cobrança não cancelável

  /transaction/{id}/reversal:
    post:
      summary: Reverte uma transação
      description: Reverte uma transação específica usando o ID da transação, apenas funciona se a transação já foi autorizada.
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: string
          example: "1e1a71e3-d04e-4fbd-805f-6e7971eabad3"
      responses:
        '200':
          description: Cobrança revertida
          content:
            application/json:
              schema:
                type: object
                properties:
                  status:
                    type: string
                    enum:
                      - confirmed
                    example: "confirmed"
        '400':
          description: Cobrança não reversível
components:
  schemas:
    Payment:
      type: object
      properties:
        value:
          type: number
          format: float
          example: 70.0
        value_discount:
          type: number
          format: float
          example: 0.0
    Item:
      required:
        - ncm
        - name
        - quantity
        - amount
      type: object
      properties:
        name:
          type: string
          example: "ETANOL ADITIVADO"
        quantity:
          type: number
          format: float
          example: 10.555
        amount:
          $ref: '#/components/schemas/Amount'
        ncm:
          type: string
          example: "22071090"
    Transaction:
      type: object
      required:
        - amount
        - items
      properties:
        external_id:
          type: string
          example: "1e1a71e3-d04e-4fbd-805f-6e7971eabad3"
        pos_id:
          type: string
          example: "5a9dfd2e-279c-49b9-8d3d-7cdbfbb03f26"
        amount:
          $ref: '#/components/schemas/Amount'
        callbackUrl:
          type: string
          description: Define em qual URL vai escutar resposta dessa transação
          example: "https://example.com/callback"
        items:
          type: array
          items:
            $ref: '#/components/schemas/Item'
    Amount:
      type: object
      required:
        - amount
      properties:
        amount:
          type: number
          format: float
          example: 70.0
        subtotal:
          type: number
          format: float
          example: 70.0
        discount:
          type: number
          format: float
          example: 0.0
        addition:
          type: number
          format: float
          example: 0.0