lib/amee/profile_item.rb in Floppy-amee-0.4.2 vs lib/amee/profile_item.rb in Floppy-amee-0.4.3
- old
+ new
@@ -1,8 +1,117 @@
module AMEE
module Profile
class Item < AMEE::Profile::Object
+ def initialize(data = {})
+ @values = data ? data[:values] : []
+ @total_amount_per_month = data[:total_amount_per_month]
+ @valid_from = data[:valid_from]
+ @end = data[:end]
+ super
+ end
+
+ attr_reader :values
+ attr_reader :total_amount_per_month
+ attr_reader :valid_from
+ attr_reader :end
+
+ def self.from_json(json)
+ # Parse json
+ doc = JSON.parse(json)
+ data = {}
+ data[:profile_uid] = doc['profile']['uid']
+ data[:uid] = doc['profileItem']['uid']
+ data[:name] = doc['profileItem']['name']
+ data[:path] = doc['path']
+ data[:total_amount_per_month] = doc['profileItem']['amountPerMonth']
+ data[:valid_from] = DateTime.strptime(doc['profileItem']['validFrom'], "%Y%m%d")
+ data[:end] = doc['profileItem']['end'] == "false" ? false : true
+ data[:values] = []
+ doc['profileItem']['itemValues'].each do |item|
+ value_data = {}
+ value_data[:values] = {}
+ item.each_pair do |key,value|
+ case key
+ when 'name', 'path', 'uid', 'value'
+ value_data[key.downcase.to_sym] = value
+ end
+ end
+ data[:values] << value_data
+ end
+ # Create object
+ Item.new(data)
+ rescue
+ raise AMEE::BadData.new("Couldn't load ProfileItem from JSON data. Check that your URL is correct.")
+ end
+
+ def self.from_xml(xml)
+ # Parse XML
+ doc = REXML::Document.new(xml)
+ data = {}
+ data[:profile_uid] = REXML::XPath.first(doc, "/Resources/ProfileItemResource/Profile/@uid").to_s
+ data[:uid] = REXML::XPath.first(doc, "/Resources/ProfileItemResource/ProfileItem/@uid").to_s
+ data[:name] = REXML::XPath.first(doc, '/Resources/ProfileItemResource/ProfileItem/Name').text
+ data[:path] = REXML::XPath.first(doc, '/Resources/ProfileItemResource/Path').text || ""
+ data[:total_amount_per_month] = REXML::XPath.first(doc, '/Resources/ProfileItemResource/ProfileItem/AmountPerMonth').text.to_f rescue nil
+ data[:valid_from] = DateTime.strptime(REXML::XPath.first(doc, "/Resources/ProfileItemResource/ProfileItem/ValidFrom").text, "%Y%m%d")
+ data[:end] = REXML::XPath.first(doc, '/Resources/ProfileItemResource/ProfileItem/End').text == "false" ? false : true
+ data[:values] = []
+ REXML::XPath.each(doc, '/Resources/ProfileItemResource/ProfileItem/ItemValues/ItemValue') do |item|
+ value_data = {}
+ value_data[:values] = {}
+ item.elements.each do |element|
+ key = element.name
+ value = element.text
+ case key
+ when 'Name', 'Path'
+ value_data[key.downcase.to_sym] = value
+ when 'Value'
+ value_data[:value] = value
+ end
+ end
+ value_data[:uid] = item.attributes['uid'].to_s
+ data[:values] << value_data
+ end
+ # Create object
+ Item.new(data)
+ rescue
+ raise AMEE::BadData.new("Couldn't load ProfileItem from XML data. Check that your URL is correct.")
+ end
+
+ def self.get_history(connection, path, num_months, end_date = Date.today)
+ month = end_date.month
+ year = end_date.year
+ history = []
+ num_months.times do
+ date = Date.new(year, month)
+ history << self.get(connection, path, date)
+ month -= 1
+ if (month == 0)
+ year -= 1
+ month = 12
+ end
+ end
+ return history.reverse
+ end
+
+ def self.get(connection, path, for_date = Date.today)
+ # Load data from path
+ response = connection.get(path, :profileDate => for_date.strftime("%Y%m"))
+ # Parse data from response
+ if response.is_json?
+ cat = Item.from_json(response)
+ else
+ cat = Item.from_xml(response)
+ end
+ # Store connection in object for future use
+ cat.connection = connection
+ # Done
+ return cat
+ #rescue
+ # raise AMEE::BadData.new("Couldn't load ProfileItem. Check that your URL is correct.")
+ end
+
def self.create(profile, data_item_uid, options = {})
# Send data to path
options.merge! :dataItemUid => data_item_uid
profile.connection.post(profile.full_path, options)
rescue