lib/carnet.ex

defmodule GnApiSdkElixir.Carnet do
  @moduledoc """
  Um carnê é um conjunto de transações (parcelas) geradas em lote e com forma de pagamento já definida.
  As parcelas de um carnê vencem mensalmente, de acordo com a data definida pelo integrador.
  """

  alias GnApiSdkElixir.Request

  @doc """
  Utilizado para geração de um conjunto de transações (parcelas) geradas em lote e com uma forma de pagamento já definida.
  As parcelas de um carnê vencem mensalmente, de acordo com a data definida pelo integrador.
  """
  def create(data) do
    Request.post("/v1/carnet", data)
  end

  @doc """
  Retorna informações sobre um carnê criado. Cada transação criada via carnê possui uma única chave identificadora que a identifica.
  """
  def get(carnet_id) do
    Request.get("/v1/carnet/#{carnet_id}")
  end

  @doc """
  Permite incluir em um carnê informações como notification_url e custom_id.
  Para isso, você precisa informar o carnet_id do carnê existente no qual deseja incluir essas informações.
  Este endpoint é de extrema importância para atualizar sua URL de notificação atrelada ao carnê ou modificar o custom_id previamente associado aos carnês.
  """
  def metadata(carnet_id, metadata) do
    Request.put("/v1/carnet/#{carnet_id}", metadata)
  end

  @doc """
  Possibilita alterar a data de vencimento de uma determinada parcela de um carnê.
  Para tal, é necessário que você informe o carnet_id, a parcela que deseja e a expire_at (nova data de vencimento, no formato YYYY-MM-DD).
  """
  def parcel(carnet_id, parcel, expire_at) do
    Request.put("/v1/carnet/#{carnet_id}/parcel/#{parcel}", %{expire_at: expire_at})
  end

  @doc """
  Possibilita alterar a data de vencimento de uma determinada parcela de um carnê.
  Para tal, é necessário que você informe o carnet_id, a parcela que deseja e a expire_at (nova data de vencimento, no formato YYYY-MM-DD).
  """
  def cancel(carnet_id) do
    Request.put("/v1/carnet/#{carnet_id}/cancel", %{})
  end

  @doc """
  Possibilita efetuar o cancelamento de uma parcela específica de um carnê existente.
  Para isso, você deve informar o carnet_id e o número da parcela que deseja efetuar o cancelamento.
  """
  def parcel_cancel(carnet_id, parcel) do
    Request.put("/v1/carnet/#{carnet_id}/parcel/#{parcel}/cancel", %{})
  end

  @doc """
  Este método possibilita que o carnê seja reenviado para um endereço de email.
  É preciso que você informe o carnet_id do carnê desejado.
  """
  def resend(carnet_id, email) do
    Request.post("/v1/carnet/#{carnet_id}/resend", %{email: email})
  end

  @doc """
  Este método possibilita que uma determinada parcela de um carnê seja reenviado para um endereço de e-mail.
  Para tal, você deve informar o carnet_id desejado.
  """
  def parcel_resend(carnet_id, parcel, email) do
    Request.post("/v1/carnet/#{carnet_id}/parcel/#{parcel}/resend", %{email: email})
  end

  @doc """
  O histórico de um carnê é semelhante ao histórico de uma transação. Porém, ele reflete as ações que o carnê em si sofreu.
  E, da mesma forma, é possível adicionar mensagens personalizadas ao histórico de um carnê, sem que estas, contudo, influenciem no fluxo do mesmo.
  """
  def history(carnet_id, description) do
    Request.post("/v1/carnet/#{carnet_id}/history", description)
  end

  @doc """
  Permite marcar como pago (baixa manual) uma determinada parcela de um carnê.
  Para tal, você deverá informar o carnet_id e o número da parcela do carnê que deseja marcar como pago.
  """
  def settle(carnet_id, parcel) do
    Request.put("/v1/carnet/#{carnet_id}/parcel/#{parcel}/settle", %{})
  end
end