class PagSeguro::PaymentRequest::RequestSerializer

Attributes

payment_request[R]

The payment request that will be serialized.

Public Class Methods

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

Public Instance Methods

to_params() click to toggle source
# File lib/pagseguro/payment_request/request_serializer.rb, line 19
def to_params
  {}.tap do |data|
    data[:receiverEmail] = PagSeguro.receiver_email
    data[:currency] = payment_request.currency
    data[:reference] = payment_request.reference
    data[:extraAmount] = to_amount(payment_request.extra_amount)
    data[:redirectURL] = payment_request.redirect_url
    data[:notificationURL] = payment_request.notification_url
    data[:abandonURL] = payment_request.abandon_url
    data[:maxUses] = payment_request.max_uses
    data[:maxAge] = payment_request.max_age
    data[:credentials] = payment_request.credentials
    payment_request.items.each_with_index do |item, index|
      serialize_item(data, item, index.succ)
    end

    serialize_sender(data, payment_request.sender)
    serialize_shipping(data, payment_request.shipping)
    serialize_receivers(data, payment_request.receivers)
    serialize_extra_params(data, payment_request.extra_params)
  end.delete_if { |_, value| value.nil? }
end
to_xml_params() click to toggle source
# File lib/pagseguro/payment_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

serialize_address(data, address) click to toggle source
# File lib/pagseguro/payment_request/request_serializer.rb, line 101
def serialize_address(data, address)
  return unless address

  data[:shippingAddressCountry] = address.country
  data[:shippingAddressState] = address.state
  data[:shippingAddressCity] = address.city
  data[:shippingAddressPostalCode] = address.postal_code
  data[:shippingAddressDistrict] = address.district
  data[:shippingAddressStreet] = address.street
  data[:shippingAddressNumber] = address.number
  data[:shippingAddressComplement] = address.complement
end
serialize_documents(data, documents) click to toggle source
# File lib/pagseguro/payment_request/request_serializer.rb, line 76
def serialize_documents(data, documents)
  return if documents.empty?

  documents.each do |document|
    data[:senderCPF] = document.value if document.cpf?
    data[:senderCNPJ] = document.value if document.cnpj?
  end
end
serialize_extra_params(data, extra_params) click to toggle source
# File lib/pagseguro/payment_request/request_serializer.rb, line 114
def serialize_extra_params(data, extra_params)
  return unless extra_params

  extra_params.each do |extra_param|
    data[extra_param.keys.first] = extra_param.values.first
  end
end
serialize_item(data, item, index) click to toggle source
# File lib/pagseguro/payment_request/request_serializer.rb, line 57
def serialize_item(data, item, index)
  data["itemId#{index}"] = item.id
  data["itemDescription#{index}"] = item.description
  data["itemAmount#{index}"] = to_amount(item.amount)
  data["itemQuantity#{index}"] = item.quantity
  data["itemShippingCost#{index}"] = to_amount(item.shipping_cost)
  data["itemWeight#{index}"] = item.weight if item.weight
end
serialize_phone(data, phone) click to toggle source
# File lib/pagseguro/payment_request/request_serializer.rb, line 85
def serialize_phone(data, phone)
  return unless phone

  data[:senderAreaCode] = phone.area_code
  data[:senderPhone] = phone.number
end
serialize_receiver_split(data, receiver, idx, split) click to toggle source
# File lib/pagseguro/payment_request/request_serializer.rb, line 51
def serialize_receiver_split(data, receiver, idx, split)
  data["receiver[#{idx}].split.amount"] = receiver.split.amount
  data["receiver[#{idx}].split.feePercent"] = receiver.split.fee_percent
  data["receiver[#{idx}].split.ratePercent"] = receiver.split.rate_percent
end
serialize_receivers(data, receivers) click to toggle source
# File lib/pagseguro/payment_request/request_serializer.rb, line 44
def serialize_receivers(data, receivers)
  receivers.each.with_index(1) do |receiver, idx|
    data["receiver[#{idx}].email"] = receiver.email
    serialize_receiver_split(data, receiver, idx, receiver.split)
  end
end
serialize_sender(data, sender) click to toggle source
# File lib/pagseguro/payment_request/request_serializer.rb, line 66
def serialize_sender(data, sender)
  return unless sender

  data[:senderEmail] =  sender.email
  data[:senderName] = sender.name

  serialize_documents(data, sender.documents)
  serialize_phone(data, sender.phone)
end
serialize_shipping(data, shipping) click to toggle source
# File lib/pagseguro/payment_request/request_serializer.rb, line 92
def serialize_shipping(data, shipping)
  return unless shipping

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

  serialize_address(data, shipping.address)
end
to_amount(amount) click to toggle source
# File lib/pagseguro/payment_request/request_serializer.rb, line 122
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/payment_request/request_serializer.rb, line 126
def xml_builder
  Nokogiri::XML::Builder.new(encoding: PagSeguro.encoding) do |xml|
    xml.send(:checkout) {
      xml_serialize_receivers(xml)
      xml_serialize_sender(xml, payment_request.sender)
      xml.send(:currency, payment_request.currency)
      xml.send(:reference, payment_request.reference)
      xml.send(:redirectURL, payment_request.redirect_url)
      xml.send(:notificationURL, payment_request.notification_url)
      xml_serialize_items(xml, payment_request.items)
    }
  end
end
xml_serialize_documents(xml, documents) click to toggle source
# File lib/pagseguro/payment_request/request_serializer.rb, line 155
def xml_serialize_documents(xml, documents)
  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/payment_request/request_serializer.rb, line 140
def xml_serialize_items(xml, items)
  xml.send(:items) {
    items.each do |item|
      xml.send(:item) {
        xml.send(:id, item.id)
        xml.send(:description, item.description)
        xml.send(:quantity, item.quantity)
        xml.send(:amount, to_amount(item.amount))
        xml.send(:weight, item.weight) if item.weight
        xml.send(:shippingCost, to_amount(item.shipping_cost))
      }
    end
  }
end
xml_serialize_receivers(xml) click to toggle source
# File lib/pagseguro/payment_request/request_serializer.rb, line 185
def xml_serialize_receivers(xml)
  xml.send(:primaryReceiver) {
    xml.send(:email, payment_request.primary_receiver)
  }

  xml.send(:receivers) {
    payment_request.receivers.each do |receiver|
      xml.send(:receiver) {
        xml.send(:email, receiver.email)
        xml.send(:split) {
          xml.send(:amount, receiver.split.amount)
        }
      }
    end
  }
end
xml_serialize_sender(xml, sender) click to toggle source
# File lib/pagseguro/payment_request/request_serializer.rb, line 168
def xml_serialize_sender(xml, sender)
  return unless sender

  xml.send(:sender) {
    xml.send(:name, sender.name)
    xml.send(:email, sender.email)
    if sender.phone
      xml.send(:phone) {
        xml.send(:areaCode, sender.phone.area_code)
        xml.send(:number, sender.phone.number)
      }
    end

    xml_serialize_documents(xml, sender.documents)
  }
end