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

  has_many :period_zp
  has_many :payrolls, :through => :period_zp
  has_many :payments, :through => :period_zp

  has_many :reports, :finder_sql => 'SELECT * FROM reports WHERE DATE_FORMAT(DATE(date), "%m.%Y") = "#{self.month.strftime("%m.%Y")}" AND department = "#{self.department}" AND closed_AT IS NULL  ORDER BY DATE(date)' 
  has_many :work_shifts, :finder_sql => 'SELECT * FROM shifts WHERE DATE_FORMAT(DATE(shift_date), "%m.%Y") = "#{month.strftime("%m.%Y")}" AND department = "#{department}" AND type="WorkShift"  ORDER BY DATE(shift_date)'
  has_many :manager_shifts, :finder_sql => 'SELECT * FROM shifts WHERE DATE_FORMAT(DATE(shift_date), "%m.%Y") = "#{month.strftime("%m.%Y")}" AND department = "#{department}" AND type="ManagerShift"  ORDER BY DATE(shift_date)'
  default_scope :order => "month"

  named_scope :actives, :conditions => "periods.closed IS FALSE"
  named_scope :for_department, lambda { |dep| dep.present? ? { :conditions => ['periods.department = ?', dep] }: { } }
  named_scope :for_month, lambda { |date| date.present? ? { :conditions => ['DATE(periods.month) = (?)', date.to_date.beginning_of_month] } :{} }


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

  def self.rus_name(date)
    Russian::strftime(date.to_date,  "%B %Y")
  end

  def rus_name
    Russian::strftime(self.month.to_date,  "%B %Y")
  end


  def self.for_date(date)
#    self.find(:first, :conditions => ["closed IS FALSE AND month = ?", date.to_date.beginning_of_month])
    self.find(:first, :conditions => ["month = ?", date.to_date.beginning_of_month])
  end

  
  def close
    # Начисляем ЗП.
    @payrolls = Payroll.calculate_for_period(self)
    for payroll in @payrolls do
      payroll.save_with_check
    end      
    # Удаляем отмененные отчеты
    reports_for_destroy = self.reports.select{|i| i.status == 1}
    for report in reports_for_destroy do
      report.destroy
    end
    self.update_attributes(:closed => true)    
    return self
  end

  def open
    # Удаляем все начисления (payrolls)
    # Меняем сумму period_zp.payroll_sum на ноль 
    ps = self.payrolls
    for p in ps do
      p.destroy
    end
    for pz in period_zp do
      pz.update_attributes(:payroll_sum => 0)
    end
    if self.update_attributes(:closed => false)
      return true
    end
  end


end
