# coding: utf-8
# -*- coding: utf-8 -*-
class Payroll < ActiveRecord::Base

  belongs_to :period_zp
  has_one :period, :through => :period_zp
  belongs_to :employee
  named_scope :over_period, lambda { |date_from, date_to| { :include => {:period_zp => :period},  :conditions =>  "DATE(DATE_ADD(periods.month, INTERVAL #{Time.now.utc_offset} SECOND)) >= (DATE('#{date_from.to_date}')) AND DATE(DATE_ADD(periods.month, INTERVAL #{Time.now.utc_offset} SECOND)) <= (DATE('#{date_to.to_date}'))" }}

  named_scope :with_employee, lambda { |empl|  empl.present? ? { :conditions => ['payrolls.employee_id = ?', empl] } : { }}

  serialize :done_ids
  ZP_TYPES = [[1, "Оклад"], [2, "Сдельная часть"], [3, "Премия"], [4, "Отпускные"], [5, "Больничные"], [6, "Штрафы"], [7, "Транспорт"], [8, "Телефон"], [9, "День рождения"], [10, "Бензин - частные инсталляторы"], [11, "Единый проездной"], [12, "Телефон - частные инсталляторы"], [13, "Премия квартальная - частные инсталляторы"], [14, "За приведение клиента"], [15, "Бензин - модернизаторы"]]

  def save_with_check
    ActiveRecord::Base.transaction do
      self.lock!
      pz = self.period_zp
      pz.lock!
      self.save!      
      pz.payroll_sum = pz.reload.payroll_sum.to_f + self.reload.sum.to_f
      pz.save!
      
    end
  end

  def self.calculate_for_period(period)
    @payrolls = []
    WorkShift.calculate_shifts(period.month)
    reports = period.reports.select{|i| i.status == 2}
    des = reports.map{ |i| i.done_employees}.flatten
    empls = Employee.working#find(des.map{|i| i.empl_id}.flatten.uniq, :order => "nic")

    # Сдельная часть зп по отчетам, для всех отделов
    for empl in empls do
      e_des = des.select{|i| i.empl_id == empl.id}
      descr = "Всего отчетов: "+ e_des.size.to_s
      sum = e_des.sum{ |i| i.sum.to_f}.to_f
      period_zp = PeriodZp.for_period_and_employee(period.id, empl.id)
      @payrolls << self.new(:done_ids => e_des.map{ |i| i.report_id}.flatten, :sum => sum, :employee_id => empl.id, :period_zp => period_zp, :zp_type_id => 2, :description => descr) if sum > 0
      # Для фиксированного оклада берём указанную сумму.
      salary = Salary.find(:first, :conditions =>["DATE(date_from) <= DATE('#{period.month}') AND static_sum IS TRUE AND position_id = ?", empl.position_id], :order =>'date_from DESC')
      if salary
        @payrolls << self.new(:sum =>salary.sum, :employee_id => empl.id, :period_zp => period_zp, :zp_type_id => 1, :description => "Фиксированный оклад")
      end
    end
 
     # Смены. ЗП за месяц делим на кол-во рабочих дней и умножаем на кол-во смен. 
    e_shifts = period.work_shifts.select{|i| i.status.to_i == 1}.group_by{|i| i.employee_id}
      days = WorkingDay.for_month(period.month).first
      working_days = days.working_days
      e_shifts.each do |empl_id, shifts|
        empl = Employee.find empl_id
        salary = Salary.find(:first, :conditions =>["DATE(date_from) <= DATE('#{period.month}') AND static_sum IS NOT TRUE AND position_id = ?", empl.position_id], :order =>'date_from DESC')
        if salary
          salary_for_day = salary.sum / working_days
          salary_for_empl = shifts.map{ |i| i.shift_date.to_date}.uniq.size * salary_for_day      
          period_zp = PeriodZp.for_period_and_employee(period.id, empl.id)
          @payrolls << self.new(:done_ids => shifts.map{ |i| i.id}, :sum => salary_for_empl, :employee_id => empl_id, :period_zp => period_zp, :zp_type_id => 1, :description => "#{shifts.size.to_s} смен по #{salary_for_day.to_i.to_s} руб.") if salary_for_empl > 0
        end
      end
      

    return @payrolls

  end


  def change_dms
   
  end


end
