defmodule Transbank.Webpay.WebpayPlus.Transaction do defstruct [ :commerce_code, :api_key, :environment ] def default_environment, do: :integration def resources_url, do: Transbank.Common.ApiConstants.webpay_endpoint() def create_endpoint, do: resources_url() <> "/transactions/" def commit_endpoint(token), do: resources_url() <> "/transactions/#{token}" def status_endpoint(token), do: resources_url() <> "/transactions/#{token}" def refund_endpoint(token), do: resources_url() <> "/transactions/#{token}/refunds" def capture_endpoint(token), do: resources_url() <> "/transactions/#{token}/capture" def new( # = Transbank.Common.IntegrationCommerceCodes.webpay_plus, 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 create(trx, buy_order, session_id, amount, return_url) 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( session_id, Transbank.Common.ApiConstants.session_id_length(), "session_id" ) Transbank.Common.Validation.has_text_with_max_length( return_url, Transbank.Common.ApiConstants.return_url_length(), "return_url" ) request_service = Transbank.Shared.RequestService.new( trx.environment, create_endpoint(), trx.commerce_code, trx.api_key ) Transbank.Shared.RequestService.post( request_service, %{ buy_order: buy_order, session_id: session_id, amount: amount, return_url: return_url } ) end def commit(trx, token) do Transbank.Common.Validation.has_text_with_max_length( token, Transbank.Common.ApiConstants.token_length(), "token" ) Transbank.Shared.RequestService.new( trx.environment, commit_endpoint(token), trx.commerce_code, trx.api_key ) |> Transbank.Shared.RequestService.put(%{}) end def status(trx, token) do Transbank.Common.Validation.has_text_with_max_length( token, Transbank.Common.ApiConstants.token_length(), "token" ) Transbank.Shared.RequestService.new( trx.environment, status_endpoint(token), trx.commerce_code, trx.api_key ) |> Transbank.Shared.RequestService.get() end def refund(trx, token, amount) do Transbank.Common.Validation.has_text_with_max_length( token, Transbank.Common.ApiConstants.token_length(), "token" ) Transbank.Shared.RequestService.new( trx.environment, refund_endpoint(token), trx.commerce_code, trx.api_key ) |> Transbank.Shared.RequestService.post(%{amount: amount}) end def capture(trx, token, buy_order, authorization_code, amount) do Transbank.Common.Validation.has_text_with_max_length( token, Transbank.Common.ApiConstants.token_length(), "token" ) 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( authorization_code, Transbank.Common.ApiConstants.authorization_code_length(), "authorization_code" ) Transbank.Shared.RequestService.new( trx.environment, capture_endpoint(token), trx.commerce_code, trx.api_key ) |> Transbank.Shared.RequestService.put( buy_order: trx.buy_order, authorization_code: authorization_code, capture_amount: amount ) end end