# -*- coding: utf-8 -*-
class StoreSoap
  require "savon"
  require "httpclient"
  attr_reader :client


  def initialize
    HTTPI.adapter = :net_http
    @client = Savon.client do
#     wsdl  "https://sdelka:tURc909pN@acc.lnet.su/set_store/ws/ws1.1cws?wsdl"      
      wsdl  "https://sdelka:tURc909pN@1c.allnets.pro/set_store/ws/ws1.1cws?wsdl"  
     open_timeout 120
      read_timeout 120
      raise_errors true    
      convert_request_keys_to :none # :camelcase #none
      encoding "UTF-8"
      basic_auth ["sdelka", "tURc909pN"]
      log_level :debug
      pretty_print_xml :true
    end
  end


  # Поиск материала по наименованию
  def self.material_search(mat_name) # Кабель
    begin
      response = self.new.client.call(:material_search, :message => { :str => mat_name}).to_hash[:material_search_response][:return][:material]     
    rescue => e  
      return []
    end
  end

  # Инвентори сотрудника
  def self.employee_materials(nick, date_r=Date.today) # Ivanov
    #    debugger
    d = Russian::strftime(date_r.to_date)
    begin
      @ms = self.new.client.call(:materials_from_the_installer, :message => {:nick =>nick, :date_report => d}).to_hash[:materials_from_the_installer_response][:return][:material]
      if @ms.class == Array                                                                                                                
        @ms = @ms.sort_by{|k, v| [k[:group].to_s, k[:name]]}
      end   
    rescue => e  
#      return []
      return e
    end
    return [@ms].flatten.compact
  end

  def self.employee_materials_test(nick) # Ivanov
    #    debugger
    begin
    @ms = self.new.client().call(:materials_from_the_installer, :message => {:nick =>nick}).to_hash[:materials_from_the_installer_response][:return]
    rescue => e  
      return []
    end
    return [@ms].flatten
  end


  # # Материалы по отчету (для обновления закупочной цены)
  # def self.materials_in_report(report)
  #   store_id = report.store_id
  #   if store_id
  #   begin
  #     @ms = self.new.client.call(:refresh_prices, :message => {:Store_id =>store_id}).to_hash[:refresh_prices_response][:return][:materials][:material]   
  #   rescue => e  
  #     return []
  #   end
  #   return [@ms].flatten
  #   else
  #     return []
  #   end
  # end

  
 # Материалы на объекте
  def self.materials_on_objects_with_pay_type(login_name, date) 
   begin     
    @ms = (self.new.client.call(:material_from_object, :message => {:login =>login_name, :date_report => Russian::strftime(date.to_date)}).to_hash[:material_from_object_response][:return][:material] )      
   rescue => e
     return []
   end
   return [@ms].flatten
  end

  # Материалы на объекте
  def self.materials_on_objects(login_name, date) 
   begin     
    @ms = (self.new.client.call(:material_from_object, :message => {:login =>login_name, :date_report => Russian::strftime(date.to_date)}).to_hash[:material_from_object_response][:return][:material] )      
   rescue => e
     return []
   end
   return [@ms].flatten
  end

  def self.send_sdelka_id_to_store(report)
    if RAILS_ENV == 'production'
      begin
        if report.store_id
          response = self.new.client.call(:confirm_sdelka_report, :message => {:id_1c => report.store_id, :id_sdelka => report.id}).to_hash[:confirm_sdelka_report_response][:return]  
          if response && response[:result] == true
            return true
          else
            report.errors.add_to_base "Невозможно проведение по складу ( #{response[:result]})"
            raise(ActiveRecord::Rollback, "Невозможно проведение по складу ( #{response[:result]})") 
          end
        end
      rescue => e  #ActiveResource::ResourceNotFound, ActiveResource::ResourceConflict, ActiveResource::ResourceInvalid, HTTPClient::ConnectTimeoutError
        report.errors.add_to_base "Невозможно проведение по складу ( #{e})" 
        raise(ActiveRecord::Rollback, "Невозможно проведение по складу ( #{e})")     
      end
    end   
  end

# Новый отчет и редактирование в сделке
 def self.sdelka_report(report)
   # sdelka_id 
   # nick - инсталлятора ник
   # loginroot - наименование логинрута (если есть)
   # login - наименование логина (если есть)
   # login_inn - ИНН заказчика (если есть)
   # DELETE customer - код организации заказчика 
   # DELETE contractor - код организации исполнителя
   # material_id - айди материала из склада
   # count - количество
   # price - стоимость продажи единицы материала
   # inst_type - тип инсталляции

   # pay_type - тип оплаты
   # 1 - Без взимания платы
   # 2 - Аренда
   # 3 - Продажа
   # 4 - Снятие с объекта
   # 5 - Аренда в счет тарифа
   # 7 - Продажа с оплатой со счёта
   # 8 - Продажа на Кроникс
   if RAILS_ENV == 'production'
   begin
     @mess = { }
     @mess["ins0:date"] = Russian::strftime(report.date.to_date)
     @mess["ins0:store_id"] =  report.store_id || nil
     @mess["ins0:login_name"] = report.name

     @mess["ins0:category_name"] = report.categor.name
     

     @mess[:order!] = ["ins0:date", "ins0:store_id", "ins0:login_name", "ins0:category_name", "ins0:list_of_inst_materials"]
     list = []
     report.done_materials.select{|i| i._destroy != true}.group_by{|i| i.employee_name}.each do |empl, dms|
       ms = []
       for dm in dms do        
         ms  << {"ins0:material_id" => dm.material_id, "ins0:count" => dm.count.to_i.abs, "ins0:inst_type" => dm.inst_type, :order! => ["ins0:material_id", "ins0:count", "ins0:inst_type"]}
       end       
       list << { "ins0:nick" => empl, "ins0:inst_material" => ms, :order! => ["ins0:nick", "ins0:inst_material"]}
     end
     @mess["ins0:list_of_inst_materials"] = list     
     m = { }
     m["report"] = @mess
#     if RAILS_ENV == 'production' 
       response = self.new.client.call(:sdelka_report, :message =>  m).to_hash[:sdelka_report_response][:return]
#     else
#       response = {:result => true, :store_id => 1}
#     end     
   
     if response[:result] == true
       return response[:store_id]
     else
       report.errors.add_to_base(response[:result])
       return false
     end
   rescue => e  #ActiveResource::ResourceNotFound, ActiveResource::ResourceConflict, ActiveResource::ResourceInvalid, HTTPClient::ConnectTimeoutError
     report.errors.add_to_base "Невозможно проведение по складу ( #{e})" 
     return false
   end
   end
 end

 
 # Удаление отчета
 def self.destroy_sdelka_report(report)
   if RAILS_ENV == 'production'
   begin
   if report.store_id
     response = self.new.client.call(:delete_sdelka_report, :message => {:store_id => report.store_id}).to_hash[:delete_sdelka_report_response][:return]
   if response[:result] == true
   #  report.store_id = response[:store_id]
   else
     report.errors.add_to_base(response[:result])
     return false
   end
   end
  rescue => e  #ActiveResource::ResourceNotFound, ActiveResource::ResourceConflict, ActiveResource::ResourceInvalid, HTTPClient::ConnectTimeoutError
     report.errors.add_to_base "Невозможно проведение по складу ( #{e})" 
     return false
   end
   end
 end

 
end
