class PagSeguro::TransactionRequest::RequestSerializer

Attributes

transaction_request[R]

The transaction request that will be serialized.

Public Class Methods

new(transaction_request) click to toggle source
# File lib/pagseguro/transaction_request/request_serializer.rb, line 7
def initialize(transaction_request)
  @transaction_request = transaction_request
end

Public Instance Methods

to_params() click to toggle source
# File lib/pagseguro/transaction_request/request_serializer.rb, line 19
def to_params
  params[:receiverEmail] = PagSeguro.receiver_email
  params[:currency] = transaction_request.currency
  params[:reference] = transaction_request.reference
  params[:extraAmount] = to_amount(transaction_request.extra_amount)
  params[:notificationURL] = transaction_request.notification_url
  params[:paymentMethod] = transaction_request.payment_method
  params[:paymentMode] = transaction_request.payment_mode
  params[:creditCardToken] = transaction_request.credit_card_token if transaction_request.respond_to?(:credit_card_token)
  transaction_request.items.each.with_index(1) do |item, index|
    serialize_item(item, index)
  end

  serialize_sender(transaction_request.sender)
  serialize_shipping(transaction_request.shipping)
  serialize_extra_params(transaction_request.extra_params)

  serialize_bank(transaction_request.bank) if transaction_request.respond_to?(:bank)
  serialize_holder(transaction_request.holder) if transaction_request.respond_to?(:holder)
  serialize_billing_address(transaction_request.billing_address) if transaction_request.respond_to?(:billing_address)
  serialize_installment(transaction_request.installment) if transaction_request.respond_to?(:installment)

  params.delete_if {|key, value| value.nil? }

  params
end
to_xml_params() click to toggle source
# File lib/pagseguro/transaction_request/request_serializer.rb, line 11
def to_xml_params
  xml_builder.to_xml(
    save_with:
    Nokogiri::XML::Node::SaveOptions::NO_EMPTY_TAGS |
    Nokogiri::XML::Node::SaveOptions::FORMAT
  )
end

Private Instance Methods

params() click to toggle source
# File lib/pagseguro/transaction_request/request_serializer.rb, line 47
def params
  @params ||= {}
end
serialize_bank(bank) click to toggle source
# File lib/pagseguro/transaction_request/request_serializer.rb, line 60
def serialize_bank(bank)
  return unless bank

  params[:bankName] = bank.name
end
serialize_billing_address(address) click to toggle source
# File lib/pagseguro/transaction_request/request_serializer.rb, line 83
def serialize_billing_address(address)
  return unless address

  params[:billingAddressCountry] = address.country
  params[:billingAddressState] = address.state
  params[:billingAddressCity] = address.city
  params[:billingAddressPostalCode] = address.postal_code
  params[:billingAddressDistrict] = address.district
  params[:billingAddressStreet] = address.street
  params[:billingAddressNumber] = address.number
  params[:billingAddressComplement] = address.complement
end
serialize_extra_params(extra_params) click to toggle source
# File lib/pagseguro/transaction_request/request_serializer.rb, line 153
def serialize_extra_params(extra_params)
  return unless extra_params

  extra_params.each do |extra_param|
    params[extra_param.keys.first] = extra_param.values.first
  end
end
serialize_holder(holder) click to toggle source
# File lib/pagseguro/transaction_request/request_serializer.rb, line 66
def serialize_holder(holder)
  return unless holder

  params[:creditCardHolderName] = holder.name
  params[:creditCardHolderBirthDate] = holder.birth_date
  params[:creditCardHolderCPF] = holder.document.value

  serialize_holder_phone(holder.phone)
end
serialize_holder_phone(phone) click to toggle source
# File lib/pagseguro/transaction_request/request_serializer.rb, line 76
def serialize_holder_phone(phone)
  return unless phone

  params[:creditCardHolderAreaCode] = phone.area_code
  params[:creditCardHolderPhone] = phone.number
end
serialize_installment(installment) click to toggle source
# File lib/pagseguro/transaction_request/request_serializer.rb, line 145
def serialize_installment(installment)
  return unless installment

  params[:installmentValue] = to_amount(installment.value)
  params[:installmentQuantity] = installment.quantity
  params[:noInterestInstallmentQuantity] = installment.no_interest_installment_quantity        
end
serialize_item(item, index) click to toggle source
# File lib/pagseguro/transaction_request/request_serializer.rb, line 51
def serialize_item(item, index)
  params["itemId#{index}"] = item.id
  params["itemDescription#{index}"] = item.description
  params["itemAmount#{index}"] = to_amount(item.amount)
  params["itemQuantity#{index}"] = item.quantity
  params["itemShippingCost#{index}"] = to_amount(item.shipping_cost)
  params["itemWeight#{index}"] = item.weight if item.weight
end
serialize_sender(sender) click to toggle source
# File lib/pagseguro/transaction_request/request_serializer.rb, line 96
def serialize_sender(sender)
  return unless sender

  params[:senderEmail] =  sender.email
  params[:senderName] = sender.name
  params[:senderHash] = sender.hash

  serialize_sender_documents(sender.documents)
  serialize_sender_phone(sender.phone)
end
serialize_sender_documents(documents) click to toggle source
# File lib/pagseguro/transaction_request/request_serializer.rb, line 107
def serialize_sender_documents(documents)
  return if documents.empty?

  documents.each do |document|
    params[:senderCPF] = document.value if document.cpf?
    params[:senderCNPJ] = document.value if document.cnpj?
  end
end
serialize_sender_phone(phone) click to toggle source
# File lib/pagseguro/transaction_request/request_serializer.rb, line 116
def serialize_sender_phone(phone)
  return unless phone

  params[:senderAreaCode] = phone.area_code
  params[:senderPhone] = phone.number
end
serialize_shipping(shipping) click to toggle source
# File lib/pagseguro/transaction_request/request_serializer.rb, line 123
def serialize_shipping(shipping)
  return unless shipping

  params[:shippingType] = shipping.type_id
  params[:shippingCost] = to_amount(shipping.cost)

  serialize_shipping_address(shipping.address)
end
serialize_shipping_address(address) click to toggle source
# File lib/pagseguro/transaction_request/request_serializer.rb, line 132
def serialize_shipping_address(address)
  return unless address

  params[:shippingAddressCountry] = address.country
  params[:shippingAddressState] = address.state
  params[:shippingAddressCity] = address.city
  params[:shippingAddressPostalCode] = address.postal_code
  params[:shippingAddressDistrict] = address.district
  params[:shippingAddressStreet] = address.street
  params[:shippingAddressNumber] = address.number
  params[:shippingAddressComplement] = address.complement
end
to_amount(amount) click to toggle source
# File lib/pagseguro/transaction_request/request_serializer.rb, line 161
def to_amount(amount)
  "%.2f" % BigDecimal(amount.to_s.to_f.to_s).round(2).to_s("F") if amount
end
xml_builder() click to toggle source
# File lib/pagseguro/transaction_request/request_serializer.rb, line 165
def xml_builder
  Nokogiri::XML::Builder.new(encoding: PagSeguro.encoding) do |xml|
    xml.send(:payment) {
      xml.mode transaction_request.payment_mode
      xml.method_ transaction_request.payment_method
      xml.currency transaction_request.currency
      xml.notificationURL transaction_request.notification_url
      xml.extraAmount to_amount(transaction_request.extra_amount || 0)
      xml.reference transaction_request.reference

      xml_serialize_sender(xml, transaction_request.sender)
      xml_serialize_items(xml, transaction_request.items)
      xml_serialize_receivers(xml, transaction_request.receivers)
      xml_serialize_shipping(xml, transaction_request.shipping)
      xml_serialize_credit_card(xml)
    }
  end
end
xml_serialize_credit_card(xml) click to toggle source
# File lib/pagseguro/transaction_request/request_serializer.rb, line 184
def xml_serialize_credit_card(xml)
  return unless transaction_request.is_a?(PagSeguro::CreditCardTransactionRequest)

  xml.send(:creditCard) do
    xml.send(:token, transaction_request.credit_card_token)

    if transaction_request.installment
      xml.send(:installment) do
        xml.send(:quantity, transaction_request.installment.quantity)
        xml.send(:value, to_amount(transaction_request.installment.value))
      end
    end

    if transaction_request.billing_address
      xml.send(:billingAddress) do
        xml.send(:street, transaction_request.billing_address.street)
        xml.send(:number, transaction_request.billing_address.number)
        xml.send(:complement, transaction_request.billing_address.complement)
        xml.send(:district, transaction_request.billing_address.district)
        xml.send(:city, transaction_request.billing_address.city)
        xml.send(:state, transaction_request.billing_address.state)
        xml.send(:country, transaction_request.billing_address.country)
        xml.send(:postalCode, transaction_request.billing_address.postal_code)
      end
    end

    if transaction_request.holder
      xml.send(:holder) do
        xml.send(:name, transaction_request.holder.name)
        xml_serialize_documents(xml, [transaction_request.holder.document])

        xml.send(:birthDate, transaction_request.holder.birth_date)
        xml_serialize_phone(xml, transaction_request.holder.phone)
      end
    end
  end
end
xml_serialize_documents(xml, documents = []) click to toggle source
# File lib/pagseguro/transaction_request/request_serializer.rb, line 222
def xml_serialize_documents(xml, documents = [])
  documents = documents.reject(&:nil?)

  return if documents.empty?

  xml.send(:documents) {
    documents.each do |document|
      xml.send(:document) {
        xml.send(:type, document.type)
        xml.send(:value, document.value)
      }
    end
  }
end
xml_serialize_items(xml, items) click to toggle source
# File lib/pagseguro/transaction_request/request_serializer.rb, line 265
def xml_serialize_items(xml, items)
  return unless items

  xml.send(:items) do
    items.each do |item|
      xml.send(:item) do
        xml.send(:id, item.id)
        xml.send(:description, item.description)
        xml.send(:quantity, item.quantity)
        xml.send(:amount, to_amount(item.amount))
      end
    end
  end
end
xml_serialize_phone(xml, phone) click to toggle source
# File lib/pagseguro/transaction_request/request_serializer.rb, line 237
def xml_serialize_phone(xml, phone)
  if phone
    xml.send(:phone) {
      xml.send(:areaCode, phone.area_code)
      xml.send(:number, phone.number)
    }
  end
end
xml_serialize_receivers(xml, receivers) click to toggle source
# File lib/pagseguro/transaction_request/request_serializer.rb, line 294
def xml_serialize_receivers(xml, receivers)
  return if receivers.empty?

  xml.send(:receivers) {
    receivers.each do |receiver|
      xml.send(:receiver) {
        xml.send(:publicKey, receiver.public_key)
        xml.send(:split) {
          xml.send(:amount, to_amount(receiver.split.amount))
          xml.send(:ratePercent, to_amount(receiver.split.rate_percent))
          xml.send(:feePercent, to_amount(receiver.split.fee_percent))
        }
      }
    end
  }
end
xml_serialize_sender(xml, sender) click to toggle source
# File lib/pagseguro/transaction_request/request_serializer.rb, line 280
def xml_serialize_sender(xml, sender)
  return unless sender

  xml.send(:sender) {
    xml.send(:name, sender.name)
    xml.send(:email, sender.email)

    xml_serialize_phone(xml, sender.phone)
    xml_serialize_documents(xml, sender.documents)

    xml.send(:hash_, sender.hash)
  }
end
xml_serialize_shipping(xml, shipping) click to toggle source
# File lib/pagseguro/transaction_request/request_serializer.rb, line 246
def xml_serialize_shipping(xml, shipping)
  return unless shipping

  xml.send(:shipping) do
    if shipping.address
      xml.send(:address) do
        xml.send(:street, shipping.address.street)
        xml.send(:number, shipping.address.number)
        xml.send(:district, shipping.address.district)
        xml.send(:country, shipping.address.country)
        xml.send(:postalCode, shipping.address.postal_code)
        xml.send(:city, shipping.address.city)
        xml.send(:state, shipping.address.state)
        xml.send(:complement, shipping.address.complement)
      end
    end
  end
end