# -*- coding: utf-8 -*-
class Report < ActiveRecord::Base
  WELDER_smena_works = 2750
  WELDER_evening_works = 650
  WELDER_night_works = 1000
  CORP_dop_works = 180
  NAL_money_types = [1, 2, 3]
  DISP_FAST_WAGE = 2100
  DISP_SOFT_WAGE = 1800
  def self.table_name() 
    db_name = Rails.configuration.database_configuration[Rails.env]["database"]
    db_name+".reports" 
  end  
  has_many :done_works, :dependent => :destroy do
    def count(work_id, pricelist)
      if done_work = (find_by_work_id_and_pricelist work_id, pricelist)
        done_work.count
      end
    end
  end

  has_many :report_factors, :dependent => :destroy
  accepts_nested_attributes_for :report_factors, :reject_if => lambda { |a| a[:active].blank? || a[:active].nil? }, :allow_destroy => true

  has_many :audits
  has_many :works, :through => :done_works
  has_many :done_employees, :dependent => :destroy, :autosave => true
  has_many :employees, :through => :done_employees
  has_many :done_materials, :order => "employee_id", :dependent => :destroy
  has_many :done_materials_from_login, :order => "employee_id", :dependent => :destroy, :class_name => "DoneMaterial"
  has_many :family_mails
  belongs_to :login, :class_name => "Login"
  belongs_to :loginroot, :class_name => "LoginRoot"
  has_many :rep_logins, :dependent => :destroy, :class_name => "RepLogin"
  has_many :topology_files, :autosave => :true, :dependent => :destroy
  accepts_nested_attributes_for :topology_files

  has_one :rep_material, :through => :rep_logins

  attr_accessor :rep_login_id, :time_start, :time_stop, :problem_ids, :acept_id, :comment_for_soft_new_tracker_report, :create_tracker_report_for_soft_from_private, :discount_from_empl
  attr_accessor_with_default(:total_sum_get_money_from_bill) { total_sum_get_money.to_f + marge.to_f  }
  attr_accessor_with_default(:get_money_sum_in_hours) {  get_money_sum.to_f != 0 ? get_money_sum.to_f / Report::CORP_dop_works : '' }
  attr_accessor_with_default(:nick) {name}
#  accepts_nested_attributes_for :done_employees, :reject_if => proc { |attributes| attributes['role'] != '1'},  :allow_destroy => true
 accepts_nested_attributes_for :done_employees,  :allow_destroy => true
  accepts_nested_attributes_for :done_works, :reject_if => proc { |attributes| attributes['count'].blank? || attributes['count'] == '0' || attributes['count'] == 0 || attributes['count'] == '' }, :allow_destroy => true
  accepts_nested_attributes_for :done_materials, :reject_if => proc { |attributes| attributes['count'].blank? || attributes['count'] == '0' }, :allow_destroy => true
  accepts_nested_attributes_for :done_materials_from_login, :reject_if => proc { |attributes| attributes['count'].blank? || attributes['count'] == '0' }, :allow_destroy => true
  accepts_nested_attributes_for :rep_logins,  :allow_destroy => true#, :reject_if => proc { |attributes| attributes['cable_length'].blank? || attributes['cable_length'] == '0' }

  belongs_to :categor, :foreign_key => 'category', :class_name => "Category"
  belongs_to :manager, :foreign_key => 'manager_id', :class_name => "Employee"
  belongs_to :user_editor, :foreign_key => 'update_user_id', :class_name => "Employee"
  before_save :set_done_materials, :check_date,  :calculate, :employees_wage, :works_sum,  :check_period, :user_updated_record, :change_status_name, :update_finn_status, :update_store
 
  after_save :update_store_id
#  after_save :create_tracker_problem
#  after_create :create_tracker_problem_new, :add_sdelka_id_to_request, :new_ring_for_corp
#  after_save :create_tracker_report_for_soft_from_private_tr, :new_report_for_sales, :update_on_old_server

  default_scope :conditions => {:closed_at => nil}, :include => [:rep_logins, :done_employees, :categor, :done_works]

  named_scope :for_department, lambda { |dep| dep.present? ? { :conditions => ['reports.department = ?', dep] }: { } }
  named_scope :soft, :conditions => "reports.department = 'soft'"
  named_scope :alp, :conditions => "reports.department = 'alp'"
  named_scope :private, :conditions => "reports.department = 'private'"
  named_scope :ams, :conditions => "reports.department = 'ams'"
  named_scope :corp, :conditions => "reports.department = 'corp'"
  named_scope :mod, :conditions => "reports.department = 'mod'"
  named_scope :welders, :conditions => "reports.department = 'welder'"
  named_scope :couriers, :conditions => "reports.department = 'couriers'"
  named_scope :with_any_material, :include => :done_materials, :conditions => "done_materials.material_id IS NOT NULL"
  named_scope :with_material, lambda { |mat| mat.present? ? { :include => :done_materials, :conditions => ["done_materials.material_id = ?", mat] } : { } }
  named_scope :with_empls_in_period, lambda { |date_from, date_to| {:include => :done_employees, :conditions => ['(DATE(done_employees.date_create_report) >= DATE(?) AND DATE(done_employees.date_create_report) <= DATE(?))', date_from.to_date, date_to.to_date] } }
  named_scope :in_period, lambda { |date_from, date_to| { :conditions => ['DATE(reports.date) >= ? AND DATE(reports.date) <= ?', date_from.to_date, date_to.to_date] } }
  named_scope :in_month, lambda { |date| date.present? ? { :conditions => ['DATE(reports.date) >= (?) AND DATE(reports.date) <= (?)', date.to_date.beginning_of_month, date.to_date.end_of_month] } :{} }
  named_scope :for_calendar, lambda { |date| date.present? ? { :conditions => ['DATE(reports.date) >= (?) AND DATE(reports.date) <= (?)', date.to_date.beginning_of_month.beginning_of_week, date.to_date.end_of_month.end_of_week] } :{} }
  named_scope :in_year, lambda { |date| date.present? ? { :conditions => ['DATE(reports.date) >= (?) AND DATE(reports.date) <= (?)', date.to_date.beginning_of_year, date.to_date.end_of_year] } :{} }
  named_scope :for_date, lambda { |date| (date.present? && date != '') ? { :conditions => ['DATE(reports.date) >= ? AND DATE(reports.date) <= ?', date.to_time.beginning_of_day, date.to_time.end_of_day] } :{} }
  named_scope :with_empl, lambda { |empl| empl.present? ? { :conditions => ["#{Rails.configuration.database_configuration[Rails.env]["database"]}.done_employees.empl_id = ?", empl] } : { } }
  named_scope :with_manager, lambda { |empl| empl.present? ? {:conditions => ['manager_id = ?', empl] } : { } }
  named_scope :with_constr_manager, lambda { |empl| empl.present? ? { :conditions => ["#{Rails.configuration.database_configuration[Rails.env]["database"]}.done_employees.empl_id = ? AND role = 2", empl] } : { } }
  named_scope :with_constr_engineer, lambda { |empl| empl.present? ? { :conditions => ["#{Rails.configuration.database_configuration[Rails.env]["database"]}.done_employees.empl_id = ? AND role = 3", empl] } : { } }
  named_scope :with_works, lambda { |works| (works.present? && works.size > 0) ? { :conditions => ['done_works.work_id IN (?)', works] } : { } }
  named_scope :with_category, lambda { |category| category.present? ? { :conditions => ['category = ?', category] }: {} }
  named_scope :with_get_money_status, lambda { |money| money.present? ? { :conditions => ['get_money_status = ?', money] }: {} }
  named_scope :with_money_type, lambda { |money_type| money_type.present? ? { :conditions => ['money_type = ?', money_type] }: {} }
  named_scope :with_client_pay_type, lambda { |client_type| client_type.present? ? { :conditions => ['client_pay_type = ?', client_type] }: {} }
  named_scope :finn_closed, lambda { |finn| finn.present? ? { :conditions => [ if finn == "false" then "finn_closed = #{finn} AND total_sum_get_money > 0" else "finn_closed = #{finn}" end] }: {} }
  named_scope :with_status, lambda { |status| (status.present? && status != '5') ? (status.to_i == 0) ? {:conditions => '(status = 0 OR status IS NULL)'} : { :conditions => ['status = ?', status] }: { } }
  named_scope :with_topology_status, lambda { |status| (status.present? && status != '') ? { :conditions => ['topology_map = ?', status.to_bool] }: { } }
  named_scope :without_status, lambda { |status| status.present? ? { :conditions => ['status != ?', status] }: { } }
  named_scope :only_with_works, lambda { |status| status.present? ? { :conditions => 'total_sum_works > 0' }: { } }
  named_scope :only_with_money, lambda { |status| status.present? ? { :conditions => 'total_sum_get_money > 0' }: { } }
  named_scope :without_money, lambda { |status| status.present? ? { :conditions => 'money_type = 0' }: { } }
  named_scope :only_with_sale_materials, lambda { |status| status.present? ? { :conditions => 'total_sum_materials > 0' }: { } }
  named_scope :with_rinet_discount, lambda { |status| status.present? ? { :conditions => 'discount_works_2 > 0 OR discount_materials_2 > 0' }: { } }
  named_scope :with_problems, lambda { |status| status.present? ? { :conditions => 'problem_tracker_id IS NOT NULL' }: { } }
  named_scope :with_pay_types, lambda { |tps| (tps.present? && tps.size > 0) ? (tps.include? "1") ? {:include => :done_materials, :conditions => ['((done_materials.pay_type = 1 AND done_materials.inst_type = 1) OR (done_materials.pay_type IN (?)) OR (done_materials.inst_type IN (?)))', tps - ["1"], tps - ["1"]] } : (tps.include? "2") ? {:include => :done_materials, :conditions => ['((done_materials.pay_type = 2 AND done_materials.inst_type != 4) OR (done_materials.pay_type IN (?)) OR (done_materials.inst_type IN (?)))', tps - ["2"], tps - ["2"]] } : { :include => :done_materials, :conditions => ['((done_materials.pay_type IN (?)) OR (done_materials.inst_type IN (?)))', tps, tps - ["1"]] } : { } }

  def self.destroyed
    self.include_deleted_in{self.find(:all, :conditions =>"closed_at IS not NULL")}

  end

   def self.include_deleted_in
    self.with_exclusive_scope { yield }
  end

  def del?
    if closed_at
      true
    else
      false
    end
  end

  def destroy
    unless del?
      if check_period_before_destroy == false #||  destroy_from_new_store == false
        return false
      else
        self.closed_at = Time.now
        self.save
#        YouGile.sdelka_destroyed
        #SdelkaOld.update_fields(self)
        return true
      end
    end
  end


  def open! 
    if del?
      update_attributes(:closed_at => nil)
      return true
    end
  end

  def link_for_report
    link = "http://sdelka.rinet.net/constr_woks/#{id}/edit"     
    return link
  end

  def request_link
    if request_id.to_i > 0
      "http://request.rinet.ru/browse.php?page=showstroirequest&index="+request_id.to_s
    else
      'Отчет не из реквеста'
    end
  end


  def time_stop
    if date_stop
      Russian::strftime(date_stop.to_time, "%H:%M")
    end
  end
 def time_start
   unless new_record?
     Russian::strftime(date.to_time, "%H:%M")
   end
  end

  def name_for_report
    if department == "alp" && rep_logins.size > 0
      rep_logins.map{|i| [i.from_name, i.to_name]}.join(" - ")
    else
      return name
    end
  end

  def disp_name
    date_r = self.date.to_date
    disps = ManagerShift.for_department(self.department).for_date(date_r)
    if disps && disps.size > 0
      if e=disps[0].employee
        return e.nic
      end
    else
      return ''
    end
  end
  
  def prosrochka
    if date_from_tracker && !date_from_tracker.nil? && !date_from_tracker.blank?
       between_reports = date.to_date.mjd - (date_from_tracker + 3.hours).to_date.mjd
      if between_reports == 1
        return 1
      elsif between_reports > 1
        return 2
      elsif between_reports < 1
        return 0
      end
    else
      return 0
    end
  end


  def tracker_problem_id
   case department
   when "soft" 
     "5_soft"
   when "private" 
     "5_install"
   when "corp"
     "5_corp"     
   when "ams"
     "5_avar"     
   when "mod"
     "5_modern"          
   else
     "5_prog"
   end
 end


  def tracker_problem_id_old
   case department
   when "soft"
     138
   when "private"
     136
   when "corp"
     137
   when "ams"
     139
   when "mod"
     140     
   else
     141
   end
 end

  def diagnos_name
    diagn = Report.diagnos.select{|n, i| i == diagnosis.to_i}
    if diagn.size > 0
      return diagn.first[0]
    else
      return ''
    end
  end


  def self.diagnos
    diagnos = [["вирусы", 1],
               ["операционная система ", 14],
               ["установка/настройка ПО ", 15],
               ["установка/настройка оборудования", 16],
               ["гарантия", 17],
               ["настройка почты", 18],
               ["диагностика/настройка сети", 19],
               ["железо", 20],
               ["вызов мастера", 21],
               ["проблемы по трафику", 12],
               ["обслуживание", 13],
               ["не софтовая проблема", 9],
               ["передано в другой отдел", 10],
               ["снятие заявки клиентом", 11],
               ["дубль", 6],
               ["косяк сотрудника RiNet", 23],
               ["другое", 5],
               ["за давностью", 7],
               ["проблемы с IP-TV", 24],
               ["видеонаблюдение", 25],
               ["торговый проект", 26],
               ["осмотр", 27]
              ]
  end

  def self.tel_vars
    [['', ''], ['Мобильные', 1], ['Прямой одноканальный номер', 2], ['Есть аппаратная АТС', 3], ['Есть своя ВАТС', 4], ['Манго', 5], ['Берут нашу телефонию', 6]]
  end

  def self.video_vars
    [['', ''], ['Уже есть', 1], ['Есть, но недовольны', 2], ['Нет', 3], ['Берут наше', 4]]
  end

  def self.soft_get_money  # attr get_money_status
    [
     ["Не оплачено", 1],
     ["Оплачено", 2],
     ["Отказались платить", 3],     
     ["Частичная оплата", 4]     
    ]
  end

  def get_money_status_form  # attr get_money_status
    case get_money_status
    when 0
      "Не оплачено"
    when 1
      "Ждем оплаты"
    when 2
      "Оплачено"
    when 3
      "Отказались платить"
    when 4
      "Частичная оплата"
    end 
  end


  def self.soft_get_docs  # attr get_docs
    [["Готовим документы", 0],
     ["Документы отправлены", 1],
     ["Документы получены", 2],
     ["Документов нет и не будет", 3]     
    ]
  end
  
  def self.get_docs_from_master
    [["Документов нет", false], ["Документы получены", true]]
  end


  def get_docs_from_master_form  # attr get_docs_from_master
    if get_docs_from_master == true 
      "Документы получены"
    else
      "Документов нет"
    end   
  end


  def self.corp_ams_category_mod
    diagnos = [["Хотелки администрации", 1],
               ["Развитие узла", 2],
               ["Приведение в порядок абонентских выносов", 3]
              ]  
  end

  def not_standart_work
    if  com_conflicts.to_s.size > 0
      "Нестандартная работа: " + com_conflicts.to_s + " ("+ get_money_sum.to_s + " р.) "
    else
      ""
    end
  end

  def address    
      # if login
      #   login_name = login.full_address
      # elsif loginroot
      #   login_name = loginroot.full_address
      # else
      #   ""
      # end      
  end

  def user_editor_name
    if user_editor
      user_editor.nic
    else
      ''
    end
  end

  def update_on_old_server
#    SdelkaOld.update_fields(self)
  end
  
  def update_store
    if (self.done_materials.size > 0 || self.done_materials.any?{ |i| i.changed?}) && # если есть материалы
        (self.new_record? ||                                                          # и новый отчет или 
         ((self.date_was.to_date != self.date.to_date) || self.category_changed? || self.closed_at_changed? || self.name_changed? || self.electro_changed? || done_materials.select{|i| i.new_record? || i._destroy == true}.size > 0))                                                                             # или поменяли важные параметры в старом.
      if self.done_materials.select{|i| i._destroy != true}.size == 0 || !self.closed_at.nil? # если удалили все материалы, то по просьбе склада шлём удаление отчёта, а не корректировку.
        StoreSoap.destroy_sdelka_report(self)
        self.store_id = nil
      else
        self.store_id = StoreSoap.sdelka_report(self)
      end
    end    
  end

  def update_store_id
    if self.store_id
      StoreSoap.send_sdelka_id_to_store(self)      
    end
  end
  
  def update_finn_status
    if (self.total_sum_get_money_changed? || self.money_type_changed?) && (self.money_type == 10 || self.money_type == 6) && self.get_money_status != 3
      if self.total_sum_get_money.to_i == self.finn_money.to_i
        self.finn_closed = true
        self.get_money_status = 2
      elsif self.finn_money.to_f > 0
        self.get_money_status = 4 
        self.finn_closed = false
      else
        self.get_money_status = 1
        self.finn_closed = false
      end
    end
    return true
  end



  def destroy_from_new_store
    if self.store_id      
      return result = StoreSoap.destroy_sdelka_report(self)
    end
  end

  def destroy_from_finn
    if self.department == "soft" && self.finn_money.to_f > 0
        errors.add_to_base "Деньги от клиента были получены по финну, удаление невозможно!"
        return false
    end    
      # if self.finn_closed && self.money_type == 10
      #   result = Finn.destroy_sdelka_report(self)
      #   if result == true
      #     self.finn_closed == false
      #   end
      #   return result
      # end
  end

  
  def calculate_construction

    # Для категории Ринет-Халява, ОКК-Халява устанавливаем скидку равную сумме работ, если пользователь не указал иное
    self.total_sum_works = self.done_works.map{|i| if (i.work && i.count.to_f > 0) then i.work.price.to_f * i.count.to_f else 0 end}.sum - discount_works.to_f
    self.total_sum_works += self.get_money_sum.to_f
    # Сумма всех проданных расходников
    self.total_sum_materials = self.done_materials.map{|i|if(i.count.to_i > 0 && ([3, 7].include? i.pay_type.to_i)) then i.price.to_f * i.count.to_i else 0 end}.sum().to_f - self.discount_materials.to_f - self.discount_materials_2.to_f
    self.total_sum_get_money = self.total_sum_materials.to_f + self.total_sum_works.to_f + self.total_acc_sum.to_f 
    self.sum = (self.done_works.map{|i|  if i.work then (i.work.wage.to_f * i.count.to_f) else 0 end}.sum + self.get_money_sum.to_f).round(2)
    percents = 100
    for factor in self.report_factors.select{|i| i._destroy != true} do # коэффициенты
      percents += factor.percent.to_f
    end
    self.sum = (self.sum * percents) / 100
  end


  def calculate   
      calculate_construction
  end

  def period 
    if date.to_s != '' && department.to_s != ''
      period = Period.find_by_sql "SELECT * FROM periods WHERE DATE_FORMAT(periods.month, '%m.%Y') = '#{self.date.to_date.strftime("%m.%Y")}' AND periods.department = '#{self.department}' LIMIT 1"
      if period
        return period.first
      else
        return false
      end
    else
      return false
    end
  end

  def check_period_before_destroy
    if !self.period || self.period ==  false
      errors.add_to_base "Период не найден!"
      return false
    elsif self.period.closed == true
      errors.add_to_base "Период '#{self.period.rus_name}' закрыт, внесение изменений невозможно!"
      return false      
    end
  end


  def check_period
    if !self.period || self.period ==  false
      errors.add_to_base "Период не найден!"
      return false
    elsif self.period.closed == true && (self.new_record? || self.sum_changed? || self.date_was.to_date != self.date.to_date || self.total_sum_works_was.to_f != self.total_sum_works.to_f  || self.total_sum_materials_was.to_f != self.total_sum_materials.to_f || self.done_works.any?{|i| i.changed?} || self.done_materials.select{|i| i.new_record? || i._destroy == true}.size > 0)
      errors.add_to_base "Период '#{self.period.rus_name}' закрыт, внесение изменений невозможно!"
      return false      
    elsif !self.new_record? && self.date_was.to_date != self.date.to_date && Period.for_department_and_date_closed?(self.department, self.date_was)
      errors.add_to_base "Нельзя переносить отчеты из закрытых периодов! Период '#{Period.rus_name(self.date_was)}' закрыт!"
      return false      
    end
  end


  def category_name
    if categor
      categor.name
    else
      'не опред.'
    end
  end


  def self.client_types
    [["Частный", '0'], ["Корпоративный", 1], ["Внутренний", 2]]
  end

  def client_type_name
    case client_type
    when '0', 0
      "Частный"
    when 1
      "Корпоративный"
    when 2
      "Внутренний"
    end
  end

  def self.price_types
    [["Частный", '0'], ["Корпоративный", 1]]
  end

  def self.statuss
    [["Готово", 0], ["Отклонено", 1], ["Утверждено", 2]]
  end

  def self.status_priv
    [["В проверке", 0], ["Отклонено", 1], ["Утверждено", 2]]
  end
  

  def self.status_topology
    [["Отрисовано в топологии", "true"], ["Не отрисовано в топологии", "false"]]
  end
  
  def status_change
    case status
    when 0, nil, 1
      "Утвердить"
    when 2
      "Отклонить"
    end
  end

  def self.status_name(status)
    report = self.new
    report.status = status
    report.status_name
  end

  def status_name
    case status
    when 0, nil
      "Готово"
    when 1
      "Отклонено"
    when 2
      "Утверждено"
    end
  end
  def status_priv_name
    case status
    when 0, nil
      "В проверке"
    when 1
      "Отклонено"
    when 2
      "Утверждено"
    end
  end
  def status_topology_name
    if topology_map == true 
      "Топология отрисована"
    else
      "Топология не отрисована"
    end
  end

  def self.months
    months = [["Январь", 1],
              ["Февраль", 2],
              ["Март", 3],
              ["Апрель", 4],
              ["Май", 5],
              ["Июнь", 6],
              ["Июль", 7],
              ["Август", 8],
              ["Сентябрь", 9],
              ["Октябрь", 10],
              ["Ноябрь", 11],
              ["Декабрь", 12]
             ]
  end

  
  def self.all_deps
    [['Модернизаторы', 'mod'], ['Альпинисты', 'alp'], ['Частные инсталляторы', 'private'], ['Корп. отдел', 'corp'], ['АМС', 'ams'], ['Софт отдел', 'soft'], ['Ресепшн', 'reception'], ['Офис btul2', 'btul2'], ['Списание на офис', 'office'], ['Сварщики', 'welder'], ['Подземное строительство', 'underground'], ['Монтажные подряды ЛС', 'construction'], ['Передача материалов между логинами', 'between_logins'], ['Регистрация ранее установленных материалов', 'to_login']]
  end

  def department_name
    Division.name_for_form(department)
  end

 

  def money_type_name
    case money_type
    when 10 # Безнал
      self.get_money =  'Безнал'
    when 1 # Нал
      self.get_money = 'Наличные'
     when 2 # Нал
      self.get_money = 'Наличные НКС'
     when 3 # Нал
       self.get_money = 'Наличные ССМ'
     when 6
       self.get_money = 'Онлайн касса'       
    when 0 # Без денег
      self.get_money ='Без денег'
    when 11
      self.get_money =  'Договор подряда'
    end
  end

  def update_purchase_price
    resp = []
    ms=self.done_materials
    new_data_mats = StoreSoap.materials_in_report(self)
    for new_m in new_data_mats do
      # m = ms.select{|i| i.material_id == new_m[:id].strip && i.inst_type.to_i == new_m[:inst_type].to_i && i.pay_type.to_i == new_m[:pay_type].to_i}[0] Правильный вариант, но 11с не передает inst_type!
      m = ms.select{|i| i.material_id == new_m[:id].strip && i.pay_type.to_i == new_m[:pay_type].to_i}[0]
      if m
        if m.purchase_price.to_f != new_m[:purchase_price].to_f
          resp << "Материал: "+m.material_name+", было - #{m.purchase_price.to_s}, стало - #{new_m[:purchase_price].to_s}."
          m.purchase_price = new_m[:purchase_price]
          m.save          
        end
      end
    end
    return "Обновлены следующие закупочные цены: "+resp.join(", ")
  end

  def date_stop_rus
    if date_stop
      date_stop.to_time.strftime("%d.%m.%Y %H:%M")
    else
      ""
    end
  end

  def date_stop_tracker_rus
    if tracker_closed_at
      (tracker_closed_at+3.hours).to_time.strftime("%d.%m.%Y %H:%M")
    else
      ""
    end
  end

  def date_from_tracker_rus
    if tracker_created_at
      (tracker_created_at+3.hours).strftime("%d.%m.%Y %H:%M")
    else
      ""
    end
  end
  
  def kpi
    if tracker_created_at
      sec=((date_stop.to_time) - (tracker_created_at.to_time + 3.hours))
    else
      sec=100000000
    end
  end
  
  def kpi_tracker
    if tracker_created_at && tracker_closed_at
      sec=((tracker_closed_at.to_time+ 3.hours) - (tracker_created_at.to_time + 3.hours))
    else
      sec=100000000
    end
  end

  def kpi_tracker_hm
    sec = kpi_tracker
    return "%02d:%02d" % [sec / 3600, sec / 60 % 60] if    tracker_created_at && tracker_closed_at
  end
  
  def kpi_hm
    sec = kpi
    return "%02d:%02d" % [sec / 3600, sec / 60 % 60] if    tracker_created_at
  end  

  def kpi_name
    if (kpi/3600) < 4
      "Профилактические работы по обслуживанию абонентского оборудования, выполненные в течении 4 часов с момента заведения заявки"
    elsif (kpi/3600) > 4 && (kpi/3600) < 24
      "Профилактические работы по обслуживанию абонентского оборудования, выполненные  в период с 4 часов 01 минуты до 24 часов с момента заведения заявки"      
    elsif (kpi/3600) > 24 && (kpi/3600) < 48
      "Профилактические работы по обслуживанию абонентского оборудования, выполненные в период с 24 часов 01 минуты до 48 часов с момента заведения заявки"
    elsif (kpi/3600) > 48
      "Профилактические работы по обслуживанию абонентского оборудования, выполненные позже, чем через 48 часов с момента заведения заявки"
    end
  end

  def kpi_price
    if (kpi/3600) < 4
      1500
    elsif (kpi/3600) > 4 && (kpi/3600) < 24
      1250      
    elsif (kpi/3600) > 24 && (kpi/3600) < 48
      600
    elsif (kpi/3600) > 48
      0
    end
  end

  private

  def validate
    if self.department == "soft" && self.finn_money.to_f > 0 && self.money_type_changed?
      errors.add_to_base "Деньги от клиента были получены по финну, изменение невозможно!"
    end
  end

  def check_date
    if self.department == 'private' || self.department == 'mod'  || self.department == 'corp'
      self.date = self.date.to_date
    elsif  self.department == 'construction' && @time_start && @time_stop
    #  d = date.to_date + date.to_time.hour.hours + date.to_time.min.minutes
      d = (date.split(" ")[0] + " " + @time_start).to_time
      d2 = (date.split(" ")[0] + " " + @time_stop).to_time
      self.date = d
      self.date_stop = d2
    elsif self.department == 'ams'
      self.date = self.date.to_time
      self.date_stop = self.date_stop.to_time
    elsif self.new_record?
      time = Time.now
      d = date.to_date + time.hour.hours + time.min.minutes
      self.date = d
    elsif self.date_changed?
      d = date.to_date
      self.date = d
    end
    if self.department == 'soft' || self.department == 'private'  ### Для софтгруппы устанавливаем attr get_money, так исторически сложилось что у софта это учитывается в другом атр.
      case money_type 
      when 10 # Безнал
        self.get_money = 2
      when 1 # Нал
        self.get_money = 0
      when 0 # Без денег
        self.get_money = 1
      end
    end
  end

  def employees_wage
    self.work_time = done_employees.size
    for de in done_employees do
        if de == self.done_employees.first  ## Первый - босс
          de.role = 1
        end
        de.hand = (1.0/self.work_time)
    end
  end
  
  
# Перед сохранением, для аналитики рассчитываем зп для каждой работы.
  def works_sum
    if self.period && self.period.closed != true
    for dw in done_works do
      if dw.work
      case department       
      when "corp"
        if categor && categor.master_percent.to_f > 0 # Если для категории указан процент от продажи, то считаем процент, иначе по полю «З/П мастера»
          dw.rate = (dw.work.price.to_f * categor.master_percent.to_f) / 100 
          # Учитываем скидку
          if discount_works.to_i != 0
            work_percent = dw.rate.to_f * dw.count.to_f *  100 / (total_sum_works.to_f + discount_works.to_f)
            work_discount_sum = discount_works.to_f * work_percent / 100
            dw.rate -= work_discount_sum
          end
        else 
          dw.rate = dw.work.wage 
        end
      when "soft" # Самый сложный вариант.
        #
        if dw.work.section_id == 252 && (category == 53 || category == 54) # Для категорий  «Подключение» и «Переподключение» значение «З/П мастера» для работ в секции «Подключение»
        dw.rate  = dw.work.wage
        elsif category == 25 # Обслуживание, 50% от работ или 420 р. если 50% работ меньше 420.          
        dw.rate = dw.work.price.to_f  * 0.5
        if total_sum_works.to_f * 0.5 < 420  # Если стоимость работ меньше минимальной, то платим 420 р. и стоимость одной работы возрастает
          work_percent = dw.rate.to_f * dw.count.to_i * 100 / (total_sum_works.to_f + discount_works.to_f)
          dw.rate = 420 * work_percent / 100
        elsif discount_works.to_f != 0 #  - скидки
          work_percent = dw.rate.to_f * dw.count.to_i * 100 / (total_sum_works.to_f + discount_works.to_f)
          work_discount_sum = discount_works.to_f * work_percent / 100
          dw.rate -= work_discount_sum   
        end
      elsif [24, 53, 54 ].include? category #  Категория = "Клиентская" 24, Подключение, Переподключение - ("Стоимость работ"-600)*0,4
        dw.rate = dw.work.price.to_f  * 0.4
        work_percent = dw.rate.to_f * dw.count.to_i * 100 / (total_sum_works.to_f + discount_works.to_f)
        dw.rate -= 600 * work_percent / 100 # делим 600 рублей пропорционально стоимости работ.
        # Учитываем скидку
        if discount_works.to_f != 0
          work_percent = dw.rate.to_f * dw.count.to_i * 100 / (total_sum_works.to_f + discount_works.to_f)
          work_discount_sum = discount_works.to_f * work_percent / 100
          dw.rate -= work_discount_sum
        end
      else
        dw.rate = 0
      end
      when "ams", "welder", "alp"
        dw.rate = 0
      else
        dw.rate  = dw.work.wage.to_f unless dw.rate.to_i > 0        
      end
      if dw.rate == nil || dw.rate.to_f < 0
        dw.rate = 0
      end
    end
    end
    end
  end

  def add_sdelka_id_to_request
    if self.department == 'corp' && !self.request_id.nil?
      add_req = AddRequest.find_by_request self.request_id
      add_req.update_attributes(:journal => self.id) if add_req
    end
  end
  
  def remove_sdelka_id_from_request
    if self.department == 'corp' && !self.request_id.nil?
      add_req = AddRequest.find_by_request self.request_id
      add_req.update_attributes(:journal => '') if add_req
    end
  end

  def new_ring_for_corp
    if self.department == 'corp' && person = Employee.current_user
      Ring.new(self, person)
    end
  end
  
  def user_updated_record
    if self.changed? && person = Employee.current_user
      self.update_user_id = person.id
    end
  end

  def update_tracker
   if self.changed? && self.department == "soft" && self.tracker_id != 0
 #    TrackerSoap.update(self) if self.user_editor
   end
  end

  def create_tracker_report_for_soft_from_private_tr
    if self.create_tracker_report_for_soft_from_private && self.create_tracker_report_for_soft_from_private.to_i == 1
 #     TrackerSoap.create_tracker_report_for_soft_from_private(self, Employee.current_user)
    end
  end


  def create_tracker_problem
    if Employee.current_user
#      TrackerSoap.create_problem_report(self, Employee.current_user)
    end
  end
  def create_tracker_problem_new
    # unless acept_id.to_s.blank?
    #   if Employee.current_user
    #     author = Employee.current_user.login
    #   else
    #     author = "sdelka_bot"
    #   end
    #   url = URI.escape("http://tag.rinet.ru/tag/accept_bind?accept_id=#{acept_id}&src_id=#{self.id}&login=#{self.name}&author=#{author}")
    #   require 'httparty'
    #   resp = MultiJson.load(HTTParty.get(url).parsed_response)
    #   if resp["res"] == true
    #     tracker_id = self.problem_tracker_id.to_i == 0 ? resp["tracker_id"] : self.problem_tracker_id
    #     comment = resp["comment"]
    #     tags = resp["tags"]
    #     self.reload.update_attributes(:problem_tracker_id => tracker_id, :problem_tags => tags, :problem_description => comment)
    #   else
    #     self.reload.update_attributes(:problem_tracker_id => nil, :problem_tags => '', :problem_description => '')
    #   end
    #   return true
    # end
  end


  def set_done_materials
    for dm in done_materials do
      dm.inst_type = 1 unless dm.inst_type
      dm.pay_type = 1 unless dm.pay_type
      dm.date = Date.today
      dm.department = self.department

      if dm.new_record?
        old_mats = self.done_materials.select{|i| i.employee_id == dm.employee_id && i.material_id == dm.material_id && !i.new_record? && i._destroy != true}
        if old_mats.size > 0
          old_mats[0].count = old_mats[0].count.to_i + dm.count.to_i
          dm.count = 0
          dm.destroy
        end
      end
    end
    
  end

  def new_report_for_sales
    if (RAILS_ENV == 'production' && department == "corp") && ((tel_changed? || tel_comment_changed? || video_changed? || video_comment_changed?) && (tel.to_i != 0 || video.to_i != 0))
      ReportMailer.deliver_new_report_for_sales_from_corp(self, Employee.current_user)
      require 'httparty'
      str = {:data =>{:report_id => self.id.to_s, :login_id => self.login_id.to_s, :nick => Employee.current_user.login, :tel => self.tel.to_s, :tel_comment =>self.tel_comment.to_s, :video => self.video.to_s, :video_comment => self.video_comment.to_s}}
      response = HTTParty.post('http://reqmini.rinet.ru/br/from_sdelka', :body =>str.to_json,  :headers => { 'Content-Type' => 'application/json', 'Accept' => 'application/json' })
#      if MultiJson.load(response.parsed_response, :quirks_mode => true).to_i != 1
#        ActiveRecord::Base.logger.warn "REQMINI ERROR update REPORT #{self.id}"
      #      end

    end
  end
  
  def change_status_name
    if (department == "mod") && status_was != 1 && status == 1
      ReportMailer.deliver_change_status(self)
    end
  end

  def get_key_sha
    # sha1(логин_клиента.' '.юникс_таймштамп_времени_создания_заявки.' '.'vnfu307g299g'.' '.ID_заявки_в_трекере);
    str = []
    str << self.name
    str << self.date.to_time.to_i
    str << 'vnfu307g299g'
    str << self.id
    str = str.join(" ")
    key = Digest::MD5.hexdigest(str.downcase)
  end

  def comment_for_json    
    arr = {} 
    arr[:works] = []
    arr[:materials] = []
    if self.department == 'private'
      for w in done_works do
        arr[:works] <<  {:name => w.work_name.to_s, :count => w.count, :measure_name => w.measure_name, :price => (w.get_money.to_i * w.count.to_f)} if w.get_money.to_i > 0
      end    
    else
      for w in done_works do
        arr[:works] <<  {:name => w.work_name.to_s, :count => w.count, :measure_name => w.measure_name, :price => (w.work.price.to_f * w.count.to_f)} if w.work.price.to_i > 0
      end    
    end
    arr[:works] <<  {:name =>com_conflicts, :count => 1, :measure_name => "ед.", :price => get_money_sum} if get_money_sum.to_f > 0

    for m in done_materials do
      if m.count.to_i > 0 && m.price.to_f > 0
        arr[:materials] << {:name => (m.pay_type_name +  ": " + m.material_name), :count => m.count.to_s, :measure => "шт.", :price => (0  +  (money_type != 0 ? ((m.price.to_f * m.count.to_i)) : 0))}
      end
    end
    return arr
  end
  
  def set_request_bonus
   # category_without_request = [8, 9, 15, 12, 14, 58] Теперь задается для категории
    # category_without_request = [58] #CBEKLA от 28.01.2015 В реквесте нельзя закрыть заявку так что нельзхя использовать поквестовку
    if self.employee_bonus == false
      self.request_bonus_sum = 0
      self.request_closed = true
    else
    if self.categor && self.categor.bonus.to_f > 0 && (self.categor.quest_bonus.to_i == 1) && request_id.to_i != 0  ## Премия начисляется сразу, т.к. отчеты все единоразовые (автоначисление)
      # КОРП Подключение
      # КОРП Подключение телефонии
      # КОРП Подключение IP-TV
      # Доп.работы
      # Доп.работы при подключении
      # Подключение камер NBN
      self.request_bonus_sum = Category.find(self.category).bonus.to_f
      self.request_closed = true
    elsif category_changed? && self.categor.quest_bonus.to_i != 1 # Если поменяли категорию с автоначисления на поквестовую, надо обнулить бонус
      self.request_bonus_sum = 0
      self.request_closed = false
    elsif request_closed_changed? && self.categor.quest_bonus.to_i == 2 # Если это отчет из реквеста и у него изменился статус
      if request_closed == true
        all_time = Report.find(:all, :select => 'SUM(work_time) as work_time, category', :conditions => ["request_id = ? AND category = ?", request_id, self.category]).first.work_time.to_f
        all_sum = categor.bonus.to_f
        self.request_bonus_sum = (work_time.to_f.round(2) * all_sum)/all_time
      else
        self.request_bonus_sum = 0
      end                 
    else
    #    self.request_bonus_sum = 0
    end
    end
    return true
  end


end
