matheustardivo/pagseguro_client

View on GitHub
lib/pagseguro_client/transaction.rb

Summary

Maintainability
A
1 hr
Test Coverage
# encoding: utf-8
module PagseguroClient
  class Transaction
    PAYMENT_METHOD = {
      1 => :credit_card,
      2 => :invoice,
      3 => :online_transfer,
      4 => :pagseguro,
      5 => :oi_paggo
    }

    STATUS = {
      1 => :pending,
      2 => :verifying,
      3 => :approved,
      4 => :available,
      6 => :refunded,
      7 => :canceled
    }

    SHIPPING_TYPE = {
      1 => :pac,
      2 => :sedex
    }

    attr_accessor :code, :order_id, :status, :payment_method, :last_event_date, :sender, :address, :shipping

    def initialize(attributes = {})
      attributes.each do |name, value|
        send("#{name}=", value)
      end
    end

    def self.create_by_xml(xml)
      doc = Nokogiri::XML(xml)
      code = doc.xpath("//transaction/code").text
      order_id = doc.xpath("//reference").text
      status = doc.xpath("//status").text.to_i
      payment_method = doc.xpath("//paymentMethod/type").text.to_i
      last_event_date = doc.xpath("//transaction/lastEventDate").text
      email = doc.xpath("//transaction/sender/email").text
      name = doc.xpath("//transaction/sender/name").text
      phone = {
        area_code: doc.xpath("//transaction/sender/phone/areaCode").text,
        number: doc.xpath("//transaction/sender/phone/number").text
      }

      address = {
        country: doc.xpath("//transaction/shipping/address/country").text,
        state: doc.xpath("//transaction/shipping/address/state").text,
        city: doc.xpath("//transaction/shipping/address/city").text,
        postal_code: doc.xpath("//transaction/shipping/address/postalCode").text,
        district: doc.xpath("//transaction/shipping/address/district").text,
        street: doc.xpath("//transaction/shipping/address/street").text,
        number: doc.xpath("//transaction/shipping/address/number").text,
        complement: doc.xpath("//transaction/shipping/address/complement").text
      }

      shipping = {
        type: SHIPPING_TYPE[doc.xpath("//transaction/shipping/type").text.to_i],
        cost: doc.xpath("//transaction/shipping/cost").text.to_f
      }

      transaction = Transaction.new(
        code: code,
        order_id: order_id,
        status: STATUS[status],
        payment_method: PAYMENT_METHOD[payment_method],
        sender: {
          name: name,
          email: email,
          phone: phone
        },
        address: address,
        last_event_date: last_event_date,
        shipping: shipping
      )
    end

    def self.url(code)
      PagseguroClient.transaction_url(code)
    end

    def self.retrieve(code)
      response = RestClient.get(url(code),
        {
          params: {
            email: PagseguroClient.email,
            token: PagseguroClient.token
          }
        }
      )

      create_by_xml(response.body)
    end
  end
end