defmodule Payeezy.GiftCard do @moduledoc """ Payeezy gift card requests including balance_inquiry, purchase, and refund """ @type t :: %__MODULE__{ amount: String.t, bank_message: String.t, bank_resp_code: String.t, correlation_id: String.t, currency: String.t, gateway_message: String.t, gateway_resp_code: String.t, method: String.t, transaction_id: String.t, transaction_status: String.t, transaction_tag: String.t, transaction_type: String.t, validation_status: String.t, valuelink: map } defstruct amount: nil, bank_message: nil, bank_resp_code: nil, correlation_id: nil, currency: nil, gateway_message: nil, gateway_resp_code: nil, method: nil, transaction_id: nil, transaction_status: nil, transaction_tag: nil, transaction_type: nil, validation_status: nil, valuelink: %{} alias Payeezy.PostTransaction @doc """ Complete a balance_inquiry for a given set of `params` """ @spec balance_inquiry(map) :: {:ok, t} | {:error, any} def balance_inquiry(params) do post_params = "balance_inquiry" |> defaults |> merge_params(params) PostTransaction.handle_response(__MODULE__, post_params) end @doc """ Complete a purchase for a given set of `params` """ @spec purchase(map) :: {:ok, t} | {:error, any} def purchase(params) do post_params = "purchase" |> defaults |> merge_params(params) PostTransaction.handle_response(__MODULE__, post_params) end @doc """ Complete a refund for a given set of `params` """ @spec refund(map) :: {:ok, t} | {:error, any} def refund(params) do post_params = "refund" |> defaults |> merge_params(params) PostTransaction.handle_response(__MODULE__, post_params) end @doc """ Complete a deactivation for a given set of `params` """ @spec deactivation(map) :: {:ok, t} | {:error, any} def deactivation(params) do post_params = "deactivation" |> defaults |> merge_params(params) PostTransaction.handle_response(__MODULE__, post_params) end @doc """ Complete an activation for a given set of `params` """ @spec activation(map) :: {:ok, t} | {:error, any} def activation(params) do post_params = "activation" |> defaults |> merge_params(params) PostTransaction.handle_response(__MODULE__, post_params) end @doc """ Complete a reload for a given set of `params` """ @spec reload(map) :: {:ok, t} | {:error, any} def reload(params) do post_params = "reload" |> defaults |> merge_params(params) PostTransaction.handle_response(__MODULE__, post_params) end @doc """ Complete a void for a `transaction_id` and a given set of `params` """ @spec void(String.t, map) :: {:ok, t} | {:error, any} def void(transaction_id, params) do post_params = "void" |> defaults |> merge_params(params) PostTransaction.handle_response(__MODULE__, post_params, "#{transaction_id}") end @doc """ Complete a reload for a given set of `params` """ @spec cashout(map) :: {:ok, t} | {:error, any} def cashout(params) do post_params = "cashout" |> defaults |> merge_params(params) PostTransaction.handle_response(__MODULE__, post_params) end @spec defaults(String.t) :: map defp defaults(endpoint) do %{ transaction_type: endpoint, method: "valuelink" } end @spec merge_params(map, map) :: map defp merge_params(current_map, %{valuelink: %{"cc_number" => cc_number}} = params) do merged_valuelink_params = Map.merge(params[:valuelink], %{"cc_number" => strip_gift_card(cc_number)}) do_merge_valuelink_params(current_map, params, merged_valuelink_params) end defp merge_params(current_map, %{valuelink: %{cc_number: cc_number}} = params) do merged_valuelink_params = Map.merge(params[:valuelink], %{cc_number: strip_gift_card(cc_number)}) do_merge_valuelink_params(current_map, params, merged_valuelink_params) end defp merge_params(current_map, params), do: do_merge_valuelink_params(current_map, params) defp do_merge_valuelink_params(current_map, params, merged_valuelink_params \\ %{}) do params |> Map.merge(%{valuelink: merged_valuelink_params}) |> Map.merge(current_map) end @spec strip_gift_card(String.t) :: String.t defp strip_gift_card(nil), do: nil defp strip_gift_card(cc_string) do String.replace(cc_string, ~r/\D/, "") end end