Skip to main content

Ezpservices Integration In Ruby on Rails(Cafe Press)

Ezprints  Integration In rails

1)Posting Order to Ezprints and get the shipping values
require 'net/https'
require 'rexml/document'
def shipping_options_ezp_services
      @order = Order.where(:id => 5).first
      @total_orders = Order.all
      xml = "<?xml version='1.0' encoding='UTF-8'?>
      <orders partnerid='45678' version='1'>
      <ordersession>
      <order>
      <orderid>#{@order.id}</orderid>
      <shippingaddress>
      <firstname>#{@order.first_name}</firstname>
      <address1>#{@order.address1}</address1>
      <city>#{@order.city}</city>
      <state>#{@order.state}</state>
      <zip>#{@order.zip}</zip>
      <countrycode>#{@order.country}</countrycode>
      <phone>#{@order.phone_no}</phone>
      </shippingaddress>"
     @total_orders.each do |t|
        xml << "<orderline productid='#{t.product_id}' imageid='#{t.image_id}'>
                 <description>#{t.description}</description>
                  <quantity>#{t.quantity}</quantity>
                </orderline>
             </order>
          </ordersession>
       </orders>"
      end
  
    begin
        url = URI.parse('http://services.ezprints.com/ShippingCalculator/CalculateShipping.axd')
        request = Net::HTTP::Post.new(url.path)
        request.content_type = 'text/xml'
        request.body = xml
        response = Net::HTTP.start(url.host, url.port) {|http| http.request(request)}
        # Start of After Posting the order to ezpshipping ShippingCalculator output will be getting like these
        # <?xml version="1.0"?>
        # <shippingOptions>
        #   <order orderid="1234">
        #      <option type="FC" price="9.95" shippingMethod="USFC" description="Economy to United States"/>
        #      <option type="PM" price="9.95" shippingMethod="USPM" description="Express to United States"/>
        #      <option type="SD" price="15.95" shippingMethod="USSD"
        #         description="Second Business Day to United States"/>
        #      <option type="ON" price="23.95" shippingMethod="OVNT"
        #         description="Next Business Day to United States"/>
        #   </order>
        # </shippingOptions>
        #End of response after posting order to ezpshipping calculator
        @options = Array.new
        document = REXML::Document.new(response.body)
        doc = REXML::XPath.each(document, "*//option type") { |element|
        type = element.attributes["type"]
        price =  element.attributes["price"]
        shippingmethod =  element.attributes["shippingMethod"]
        description =  element.attributes["description"]
         @options << {
          :id => type,:service => shippingmethod + "(" + description +")",:price => price }
          }
        p @options.inspect
      rescue Exception
      end
  end

2)Send Order To Ezprints and placing order


##Post orders to ezpprints
def send_order_ezp
  begin
   xml = "<?xml version='1.0' encoding='UTF-8'?>
                 <orders partnerid = 'xxxxx' version = '1'>
                  <images>
                      <uri id='3'title='Logo'>http://www.ezprints.com/images/logo.jpg</uri>
                      <uri id='5' title='My Photo'>http://www.ezprints.com/images/0/0_5.jpg</uri>
                      <uri id='6' title='A  Photo'>http://www.ezprints.com/images/0/123.jpg</uri>
                  </images>
                  <ordersession>
                      <sessionid>1234</sessionid>
                      <vendor logoimageid = '3'>
                          <name>MyCompanyName</name>
                          <address1>123 Any St.</address1>
                          <address2>Apartment 3</address2>
                          <city>Anytown</city>
                          <state>PA</state>
                          <zip>12345</zip>
                          <countrycode>USA</countrycode>
                          <phone>303-555-1212</phone>
                          <email>jane@host.com</email>
                          <url>www.ezprints.com</url>
                      </vendor>
                      <customer>
                          <customerid>1234</customerid>
                          <title>Ms</title>
                          <firstname>Jane</firstname>
                          <lastname>Doe</lastname>
                          <address1>123 Any St.</address1>
                          <address2>Apartment 3</address2>
                          <city>Anytown</city>
                          <state>PA</state>
                          <zip>12345</zip>
                          <countrycode>USA</countrycode>
                          <phone>303-555-1212</phone>
                          <email>jane@host.com</email>
                      </customer>
                      <order>
                          <orderid>1234</orderid>
                          <shippingaddress>
                              <title>Ms</title>
                              <firstname>Jane</firstname>
                              <lastname>Doe</lastname>
                              <address1>456 Another St.</address1>
                              <address2>Unit D</address2>
                              <city>Anothertown</city>
                              <state>ON</state>
                              <zip>B6B-4G3</zip>
                              <countrycode>USA</countrycode>
                              <phone>301-555-1212</phone>
                              <email>jo@hots.com</email>
                          </shippingaddress>
                          <shippingmethod>FC</shippingmethod>
                          <orderline productid = '10050' imageid = '5'>
                              <description>5x7 Glossy Print</description>
                              <productprice>1.95</productprice>
                              <quantity>1</quantity>
                              <position>fit</position>
                          </orderline>
                          <producttotal>1.95</producttotal>
                          <shippingprice>5.95</shippingprice>
                          <tax>0.00</tax>
                          <ordertotal>1.95</ordertotal>
                      </order>
                      <producttotal>1.95</producttotal>
                      <shippingtotal>5.95</shippingtotal>
                      <taxtotal>0.00</taxtotal>
                      <total>7.90</total>
                  </ordersession>
              </orders>"
              url = URI.parse("http://order.ezprints.com")
              request = Net::HTTP::Post.new("/PostXmlOrder.axd?PartnerNumber=xxxx&PartnerReference=#{@order}")
              request.content_type = 'text/xml'
              request.body = xml
              logger.info  xml.inspect
              response = Net::HTTP.start(url.host, url.port) {|http| http.request(request)}
              response_data = CobraVsMongoose.xml_to_hash(response.body)
               #After sending ezpprints to order details it will place ezpprints site and response we will recevive as the below format
                #  <orderfailed AffiliateID="499">
                #    <ordernumber>718362</ordernumber>
                #    <referencenumber>00123-200708031121-62724</referencenumber>
                #    <message>4002 Error: Type mismatch</message>
                # </orderfailed>
                # <orderfailed AffiliateID="499">
                #    <ordernumber />
                #    <referencenumber>00244-200708031403-63077</referencenumber>
                #    <message>6047 Invalid State Code in Customer Node. </message>
                # </orderfailed>
               #end After sending ezpprints to order details it will place ezpprints site and response we will recevive as the below format
              if !response_data["XmlOrder"].nil?
                 reference = response_data["XmlOrder"]["@Reference"]
                 message = reference
              elsif !response_data["XmlOrderFailed"].nil?
                  message = response_data["XmlOrderFailed"]["@Reason"]
              end
          rescue
              redirect_to "/"
           end
     end



#After Sending Order To get the status of ezpprints get notifications.

  def Ezprints_notification_status

   xmlstring = request.raw_post

    begin
      x = CobraVsMongoose.xml_to_hash(xmlstring)
      xd = x.stringify_keys
      oen = xd["OrderEventNotification"]
      not_id = oen["@Id"]
      orders = oen["Order"]
      if orders.class == "Array"
      orders.each do |o|
      EzpOrder_parse(o,not_id)
      end
      else
      order = oen["Order"]
      EzpOrder_parse(order,not_id)
      end
    rescue
  end
   render :text => "<?xml version=\"1.0\" encoding=\"UTF-8\"?><OrderEventNotificationReceived Result=\"Success\"/>"
 end

##parsing the ezp orders and creating the ezp notifications

  def EzpOrder_parse(o,nid)
      oid = o["@Id"]
      oref = o["@EZPReferenceNumber"]
      oin = nil
      itemd = nil
      nt = nil
      ship_method = ""
      begin
      if !o["Accepted"].nil?
      nt = "Accepted"
      oin = o["Accepted"]
      elsif !o["AssetsCollected"].nil?
      nt = "AssetsCollected"
      oin = o["AssetsCollected"]
      elsif !o["InProduction"].nil?
      nt = "InProduction"
      oin = o["InProduction"]
      elsif !o["Canceled"].nil?
      nt = "Canceled"
      oin = o["Canceled"]
      elsif !o["Shipment"].nil?
      nt = "Shipment"
      oin = o["Shipment"]
      elsif !o["CompleteShipment"].nil?
      nt = "CompleteShipment"
      oin = o["CompleteShipment"]
      elsif !o["Complete"].nil?
      nt = "Complete"
      oin = o["Complete"]
      end
      ndt = oin["@DateTime"]
      date = ndt.gsub(%r{\"}, '').gsub("T"," ").split(".")
      if (nt == "Shipment") or (nt == "CompleteShipment")
       unless oin["@Carrier"].nil?
       car = oin["@Carrier"].gsub(%r{\"}, '').to_s
      end
      unless oin["@Service"].nil?
       ser = oin["@Service"].gsub(%r{\"}, '').to_s
      end
      unless oin["@DeliveryMethod"].nil?
      del = oin["@DeliveryMethod"].gsub(%r{\"}, '').to_s
      end
      unless oin["@TrackingNumber"].nil?
      track = oin["@TrackingNumber"].gsub(%r{\"}, '').to_s 
      end
      if car.nil? and ser.nil? and del.nil? and track.nil?
      ship_method = ""
      else
      ship_method = car +"|"+ser +"|"+del +"|"+track
      end
      end
      if oin["Item"].nil?
      itemd = ""
      else
      itemd = oin["Item"].inspect
      end
      if itemd.empty?
      if o["Item"].nil?
      itemd = ""
      else
      itemd = o["Item"].inspect
      end
      end
      not_id = nid[/\w+/].to_i
      ref_no = oref.gsub(%r{\"}, '')
      nt_type = nt[/\w+/].to_s
     rescue
    end 
end

Link for Docs

Comments

Popular posts from this blog

Rails Migration Difference between Text and String

Rails Migration Difference between Text and String ? While working with Rails Migration Difference between Text and String is important to be known to every developer. Columns and their data types are finalized while deciding Table structure. This tutorial will help understand difference between String and Text column type and illustrate how to write Rails Migration implementing the same. You might want to read about database.yml files for specifying database configuration for Rails Application. 1. Concepts When String or Text data type is required?     Whenever you require your column to store information which is lengthy in size (Many characters), you need to consider String or Text data type for the column.     Both of them let you store Many(How Many - will see later) characters Difference between String and Text Considering MySQL database Feature     String     Text Length     1 to 255     ...

Error malloc(): memory corruption nginx with passenger?

Error malloc(): memory corruption nginx with passenger Passenger issue resolving steps :  sudo gem uninstall passenger(uninstall all passenger) sudo gem install passenger sudo passenger-install-nginx-module --auto --auto-download --prefix=/opt/nginx --extra-configure-flags=none Update nginx config file with new passenger version and restart the nginx

rake db migrate with down, up, redo, rollback options in rails

rake db migrate with down, up, redo, rollback options ? rake db migrate - This can be used to migrate your production/test database using various options like up, down, step, redo, version etc. In this tutorial we will learn how all these options can be used with rake tool to migrate the database. What is rake? rake is basically ruby make. i.e. make tool for ruby It has similar functionality to the make tool that you may have used on unix based systems for comopiling running some kind of script. rake allows you to ruby particular task in the environment that you specify. How to Install rake? You can install rake by installing gem 'rake' as, gem install rake Above command will install the latest version of rake tool avaialable. Various rake db migrate commands Operation     Command     Description General     rake db:migrate     This will migrate your database by running migrations that are not run yet Running specific Migra...