lib/webpay/oneclick/mall_transaction.ex

defmodule Transbank.Webpay.Oneclick.MallTransaction do
  defstruct [
    :commerce_code,
    :api_key,
    :environment
  ]

  def default_environment, do: :integration
  def resources_url, do: Transbank.Common.ApiConstants.oneclick_endpoint()
  def authorize_endpoint, do: resources_url() <> "/transactions"
  def status_endpoint(token), do: resources_url() <> "/transactions/#{token}"
  def refund_endpoint(token), do: resources_url() <> "/transactions/#{token}/refunds"
  def capture_endpoint, do: resources_url() <> "/transactions/capture"

  def new(
        # = Transbank.Common.IntegrationCommerceCodes.oneclick_mall(),
        commerce_code,
        # = Transbank.Common.IntegrationApiKeys.webpay(),
        api_key,
        environment \\ default_environment()
      ) do
    struct(
      __MODULE__,
      Transbank.Common.BaseTransaction.new(
        commerce_code,
        api_key,
        environment
      )
    )
  end

  def authorize(trx, username, tbk_user, parent_buy_order, details) do
    Transbank.Common.Validation.has_text_with_max_length(
      username,
      Transbank.Common.ApiConstants.user_name_length(),
      "username"
    )

    Transbank.Common.Validation.has_text_with_max_length(
      tbk_user,
      Transbank.Common.ApiConstants.tbk_user_length(),
      "tbk_user"
    )

    Transbank.Common.Validation.has_text_with_max_length(
      parent_buy_order,
      Transbank.Common.ApiConstants.buy_order_length(),
      "parent_buy_order"
    )

    request_service =
      Transbank.Shared.RequestService.new(
        trx.environment,
        authorize_endpoint(),
        trx.commerce_code,
        trx.api_key
      )

    Transbank.Shared.RequestService.post(
      request_service,
      %{
        username: username,
        tbk_user: tbk_user,
        buy_order: parent_buy_order,
        details: details
      }
    )
  end

  def capture(trx, child_commerce_code, child_buy_order, authorization_code, amount) do
    Transbank.Common.Validation.has_text_with_max_length(
      child_commerce_code,
      Transbank.Common.ApiConstants.COMMERCE_CODE_LENGTH,
      "child_commerce_code"
    )

    Transbank.Common.Validation.has_text_with_max_length(
      child_buy_order,
      Transbank.Common.ApiConstants.BUY_ORDER_LENGTH,
      "child_buy_order"
    )

    Transbank.Common.Validation.has_text_with_max_length(
      authorization_code,
      Transbank.Common.ApiConstants.AUTHORIZATION_CODE_LENGTH,
      "authorization_code"
    )

    Transbank.Shared.RequestService.new(
      trx.environment,
      capture_endpoint(),
      trx.commerce_code,
      trx.api_key
    )
    |> Transbank.Shared.RequestService.put(%{
      commerce_code: child_commerce_code,
      buy_order: child_buy_order,
      authorization_code: authorization_code,
      capture_amount: amount
    })
  end

  def status(trx, buy_order) do
    Transbank.Common.Validation.has_text_with_max_length(
      buy_order,
      Transbank.Common.ApiConstants.BUY_ORDER_LENGTH,
      "buy_order"
    )

    Transbank.Shared.RequestService.new(
      trx.environment,
      status_endpoint(buy_order),
      trx.commerce_code,
      trx.api_key
    )
    |> Transbank.Shared.RequestService.get()
  end

  def refund(trx, buy_order, child_commerce_code, child_buy_order, amount) do
    Transbank.Common.Validation.has_text_with_max_length(
      buy_order,
      Transbank.Common.ApiConstants.BUY_ORDER_LENGTH,
      "buy_order"
    )

    Transbank.Common.Validation.has_text_with_max_length(
      child_commerce_code,
      Transbank.Common.ApiConstants.COMMERCE_CODE_LENGTH,
      "child_commerce_code"
    )

    Transbank.Common.Validation.has_text_with_max_length(
      child_buy_order,
      Transbank.Common.ApiConstants.BUY_ORDER_LENGTH,
      "child_buy_order"
    )

    Transbank.Shared.RequestService.new(
      trx.environment,
      refund_endpoint(buy_order),
      trx.commerce_code,
      trx.api_key
    )
    |> Transbank.Shared.RequestService.post(
      detail_buy_order: child_buy_order,
      commerce_code: child_commerce_code,
      amount: amount
    )
  end
end