Report abuse

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
  map.resources :apis, :collection => {:ota => :post}
 

class ApisController < ApplicationController

    require 'hpricot'
    require 'rexml/document'
    include REXML
    
  layout false

  def index
    render :layout => 'application'
  end

  def ota
    packages = []
    req = params[:rq].to_s
    doc = Hpricot.XML(req)
    segments = (doc/:AvailRequestSegment)
    segments.each do |seg|
      dates = (seg/:StayDateRange)
      dates.each do |d| 
        @start_date = d.attributes['Start'].to_date
        @end_date = d.attributes['End'].to_date
      end
      @guests = 0
      (seg/:RoomStayCandidate/:GuestCount).each do |g|
        @guests += g.attributes['Count'].to_i
      end
      (seg/:HotelSearchCriteria/:Criterion).each do |criterion|
      end
      if @start_date.wday == 6 && @end_date > (@start_date + 5.days)  
        cottages = []
        Cottage.find(:all).each do |cottage|
          booked = ActiveRecord::Base.connection.select_value("
            SELECT COUNT(*) FROM bookings WHERE cottage_id = #{cottage.id}
            AND ((start_date, end_date) OVERLAPS (DATE '#{@start_date}', 
            DATE '#{@end_date}') = true);").to_i
            if booked == 0 
              cottages << cottage
            end
        end
        sleeps = 0
        cottages.each{|i| sleeps += i.sleeps}
        if sleeps >= @guests
          cottages.each do |cottage|
            package = []
            price = ActiveRecord::Base.connection.select_value("
              SELECT sterling FROM prices WHERE band = #{cottage.band}
              AND ((start_date, end_date) OVERLAPS (DATE '#{@start_date}', 
              DATE '#{@end_date}') = true)
              AND kind = 1;").to_f
              [@start_date,@end_date,cottage.title,price].each{|i| package << i.to_s}
              packages << package
          end
        end  
      end
    end
    ota_rs(packages)
  end

  def ota_rs(packages)
    @uuid = "3e47ef1e-d081-11dc-ae8e-000cf10ee5d5"
    doc = Document.new
    ota = doc.add_element "OTA_HotelAvailRS"
    ota.add_attributes({ "xmlns" => "http://www.opentravel.org/OTA/2003/05", "xmlns:xsi" => "http://www.w3.org/2001/XMLSchema-instance", "xsi:schemaLocation" => "http://www.opentravel.org/2004B/OTA_HotelAvailRQ.xsd", "Version" => "1.003"})
    pos = ota.add_element "pos"
    source = pos.add_element "source"
    roomstays = ota.add_element "RoomStays"
    
    packages.each do |package|
      roomstay = roomstays.add_element "RoomStay"
      roomstaytype = roomstay.add_element "RoomStayType"
      roomtypes = roomstaytype.add_element "RoomTypes"
      roomtype = roomtypes.add_element "RoomType"
      roomtype.add_attributes({"RoomTypeCode" => package[2]})
      roomrates = roomstay.add_element "RoomRates"
      roomrate = roomrates.add_element "RoomRate"
      roomrate.add_attributes({"EffectiveDate" => package[0], "ExpireDate" => package[1]})
      rate = roomrate.add_element "Rate"
      total = rate.add_element "Total"
      total.add_attributes({"AdditionalFeesExcludedIndicator" => "true", "AmountBeforeTax" => package[3], "CurrencyCode" => "GBP"})
      taxes = total.add_element "Taxes"
      tax = taxes.add_element "Tax"
      fees = rate.add_element "fees"
      fee = fees.add_element "fee"
      feetaxes = fee.add_element "Taxes"
      feetax = feetaxes.add_element "Tax" 
      propinfo = roomstay.add_element "BasicPropertyInfo"
      propinfo.add_attributes( {"ChainName"=>"lets_holiday", "HotelCode"=> '1'} )
    end
    respond_to do |wants|
      wants.xml { render :xml => doc}
    end
  end


end