# -*- coding: utf-8 -*-
class ModController < ApplicationController
#
   # Отдел
  $department = 'mod'
  $department_id = '241'


  # Авторизация (файл: controllers/application.rb)
  before_filter :isAuthorization

  # Права доступа (файл: controllers/application.rb)
  around_filter :isAccessRead
  around_filter :isAccessWrite, :only => :saveReport
  around_filter :isAccessDelete, :only => :delReport

  # Конструктор
  before_filter :construct
  before_filter :set_users
  before_filter :get_reports, :only => [:index, :index_excel]
  before_filter :get_stats, :only => [:stats, :stats_excel]

  def construct

    # Устанавливаем сессионную куку.
    cookies[:sys_dep] = { :value => $department }
    $category_info = CategoryDB.getCategory($department)
    # Пункты меню
      $menu =
        [
          {"url"=>"index", "title"=>"Сводная таблица"},
          {"url"=>"/work_shifts", "title"=>"Смены"},
          {"url"=>"stats", "title"=>"Статистика"},
          {"url"=>"new", "title"=>"Добавить отчет"},
          {"url"=>"/works", "title"=>"Редактор работ"},
          {"url"=>"/cfg", "title"=>"Конфиг"},
          {"url"=>"/access", "title"=>"Доступ"}
        ]


      # Тип работ над объектом
      $category_info = CategoryDB.getCategory($department)


      # Статусы
      $status = [{'name'=>'Готово'}, {"name"=>'Отклонено'}, {'name'=>'Утверждено'}]

      # Сотрудники
      $employeesAll = EmployeesDB.getEmployees("*")
      $employeesGroup = EmployeesDB.getEmployees(session[:user_department])

      # Формируем сессию
      params.each { |key, value| session[""+key+""] = value }
      $session = session

  end

  def index
    redirect_to mod2_index_path()
    #@page_title = 'Сводная таблица модернизаторов'
    #@currPage = "index"    
  end

  def index_excel
    require 'spreadsheet'
    Spreadsheet.client_encoding = 'UTF-8'
    book = Spreadsheet::Workbook.new
    dataBook1 = book.create_worksheet :name => 'book'
    i = 0
      row = dataBook1.row(i)
      row[0] = "ID"
      row[1] = "Логин"
      row[2] = "Сотрудник"
      row[3] = "Дата"
      row[4] = "Сумма"
      row[5] = "Тип работ"
      row[6] = "Работы"
      row[7] = "Материалы"
      row[8] = "Статус"
    for report in @reports do
      i += 1
      row = dataBook1.row(i)
      row[0] = report.id
      row[1] = report.name
      row[2] = report.done_employees.map{|e| e.empl_name}.join(',')
      row[3] = report.date.to_date
      row[4] = report.sum.to_f
      row[5] = report.category_name
      row[6] = report.done_works.map{|d| d.work_name+" - "+d.count}.join(", ")
      row[7] = report.done_materials.map{|d| d.material_name+" - "+d.count}.join(", ")
      row[8] = report.status_name
    end
    # Write book
    @file = 'excel-' + rand().to_s + '.xls'
    book.write 'public/'+@file
    render :layout => false
  end


  def new
    redirect_to :controller => :mod2, :action => :new
  #   # Parameters: {"com_stay_work"=>"повесил ящик", "t_id"=>"214460", "t_ct"=>"2", "t_empl"=>"alexo", "t_login"=>"mpol5"}
  #   @page_title = 'Модернизация: новый отчет'
  #   @currPage = "new"        
  #   if params[:t_id]
  #     case params[:t_ct]
  #     when '2' # Модернизация старых домов
  #       category = 35
  #     when '1' # Монтаж ящиков на новых домах
  #       category = 34      
  #     end
  #     case params[:t_stat]
  #     when 'prov' # Исправление косяков
  #       category = 37
  #     when 'admin' # Приведение в порядок претензии администрации
  #       category = 36
  #     when 'nashi' # Хотелки наши
  #       category = 50
  #     when 'proekt'# Проектирование
  #       category = 42
  #     when 'mont'  # Монтаж ящиков на новых домах
  #       category = 33      
  #     when 'corp'
  #       category = 41
  #     end
  #     user = Employee.find_by_login params[:t_empl]
  #     @report = Report.new(:date => Time.now, :name => params[:t_login], :tracker_id => params[:t_id], :category => category, :com_stay_work => params[:com_stay_work])
  #     @report.done_employees.build(:employee => user)
  #   else #@boss
  #     @report = Report.new(:date => Time.now, :category => Category.mod.first.id)
  #     @report.done_employees.build(:employee => @current_user)
  # #  else 
  # #    flash[:error] = "Новые отчеты следует создавать из трекера!"
  # #    redirect_to :action => 'index'
  #   end
  #   @pricelist = Work.mod.with_category(@report.category) if @report
  end

  def create
    @report = Report.new(params[:report])
    @report.department = 'mod'
    Employee.current_user = Employee.find(session[:user_id]) unless session[:user_id].nil?
    @report.save
    if @report.new_record?
      flash.now[:error] =  (@report.errors.each_full { |msg| puts msg }).to_s + error.to_s
    end
    respond_to do |format|
      unless flash.size > 0
        flash[:notice] = 'Запись обновлена'
        format.html { redirect_to mod_index_path(:filter_month => @report.date.to_date.month, :filter_year => @report.date.to_date.year)}
        format.xml  { head :ok }
      else
        @pricelist = Work.mod.with_category(@report.category)
        format.html { render :action => "new", :report => @report }
      end
    end
  end


  def edit
    @page_title = 'Модернизация: редактирование отчета'
    @report = Report.find(params[:id])
    @pricelist = Work.mod.with_category(@report.category)
  end

  def update
    @report = Report.find(params[:id]) 
    Employee.current_user = Employee.find(session[:user_id]) unless session[:user_id].nil?
    respond_to do |format|
      if @boss || @report.status == 0
        if @report.update_attributes(params[:report])
          flash[:notice] = 'Запись обновлена'
          format.html { redirect_to mod_index_path(:filter_month => @report.date.to_date.month, :filter_year => @report.date.to_date.year)}
          format.xml  { head :ok }
        else
      flash.now[:error] = @report.errors.each_full { |msg| puts msg }
        format.html { render :action => "edit" }
        format.xml  { render :xml => @report.errors, :status => :unprocessable_entity }
      end
      else
        flash[:error] = 'У вас недостаточно прав для изменения отчета'
      end
    end
  end

  def destroy
    @report =   Report.find(params[:id])
    if @boss || @report.status == 0
      if @report.destroy
        flash[:notice] = 'Отчет № ' + params[:id] + ' был удален!'
      else
        messages = ''
        flash[:error] = @report.errors.each_full {|msg| messages += msg + "<br/>"}
      end
    else
      flash[:error] = "У вас недостаточно прав для удаления отчета!"
    end
    respond_to do |format|
      format.html { redirect_to mod_index_path(:filter_month => @report.date.to_date.month, :filter_year => @report.date.to_date.year)}
    end
  end

  def change_price
    if params[:id].to_i != 0
      @report = Report.find params[:id]
#      @report.done_works.destroy_all
    else
      @report = Report.new
      @report.department = 'mod'
    end
    @report.category =  params[:type]
    done_works = @report.done_works
    @pricelist = (@report.done_works.map{|i| i.work} + Work.mod.with_category(params[:type])).uniq
    render :update do |page|
      page.replace_html  'pricelist_table', :partial => 'pricelist', :collection => @pricelist, :locals =>{:done_works => done_works}
    end
  end



  def stats
    @currPage = "stats"
  end

  def stats_excel
    require 'spreadsheet'
    Spreadsheet.client_encoding = 'UTF-8'
    book = Spreadsheet::Workbook.new
    dataBook1 = book.create_worksheet :name => 'book'
    i = 0
      row = dataBook1.row(i)
      row[0] = "Сотрудник"
      row[1] = "Количество отработанных часов"
      row[2] = "Количество часов простоя"
      row[3] = "Количество часов допработ"
      row[4] = "З/П"
    for e in @d_employees do
      i += 1
      row = dataBook1.row(i)
      row[0] = e.nic
      row[1] = e.time_work
      row[2] = e.time_dop_work
      row[3] = e.prostoy
      row[4] = e.sum.to_f.round()
    end
    # Write book
    @file = 'excel-' + rand().to_s + '.xls'
    book.write 'public/'+@file
    render :template => "mod/index_excel", :layout => false
  end


  def add_employee
    rener :update do |page|    
      page.show 'window2'
      page.replace_html  'yield2', :partial => 'add_employee'
    end
  end



  private
  
  def set_users
    @current_user = Employee.find(session[:user_id])
    @boss = (@current_user.accesses.for_department('mod').size > 0 && @current_user.accesses.for_department('mod').first.access_superuser == 1)
  end
  
  def get_reports
      db_name = Rails.configuration.database_configuration[Rails.env]["database"]

    if (params[:filter_month] && params[:filter_month] != '' && params[:filter_year])
      month = params[:filter_month].to_s
      year = params[:filter_year].to_s
    else
      month = Date.today.month.to_s
      year = Date.today.year.to_s
    end
    order = []
    if params[:name_s]
      order << db_name+".reports.name " + params[:name_s]
    end
    if params[:sdate]
      order << db_name+".reports.date " + params[:sdate]
    end
    if params[:ssum]
      order << db_name+".reports.sum " + params[:ssum]
    end
    if params[:sstatus]
      order << db_name+".reports.status " + params[:sstatus]
    end
    if order.empty?
      ord = db_name+'.reports.date DESC'
    else
      ord = order.join(",")
    end
    @date = (month +'/01/' + year).to_date
    empl =  params[:filter_empl]
    worktype = params[:filter_worktype]
    status = params[:filter_status]
    if params[:works] && params[:works].size > 0
      cond = "AND done_works.work_id IN (#{params[:works].join(', ')})"
    else
      cond = ''
    end
    @reports = Report.in_month(@date).mod.with_empl(empl).with_category(worktype).with_status(status).only_with_works(params[:only_with_works]).find(:all, :conditions => "dhcp_login IS NULL #{cond}", :order => ord, :include => [:done_employees, :done_materials, :user_editor])    
    @employees = Employee.working.from_division(241)  # ЗП    

  end

  def get_stats
      db_name = Rails.configuration.database_configuration[Rails.env]["database"]
    @page_title = 'Статистика по з/п'
    @employees = Employee.working.from_division(241)  # ЗП    
    if (params[:filter_month] && params[:filter_year])
      month = params[:filter_month].to_s
      year = params[:filter_year].to_s
    else
      month = Date.today.month.to_s
      year = Date.today.year.to_s
    end
    @date = (month +'/01/' + year).to_date
    work_days = WorkingDay.find(:first, :conditions => {:month => @date.beginning_of_month})
    if work_days
      @working_days = work_days.working_days.to_i
      @weekends = work_days.weekends
    else
      @working_days = 1
      @weekends = 1
    end
    @category = params[:filter_worktype]
    @empl =  params[:filter_empl]
    cond = ''; cond2 = '';
    if @category && @category != ''
      cond += "AND r.category = #{@category} "
    end
    if @empl && @empl != ''
      cond += "AND de.empl_id = #{@empl}"
      cond2 += "e.id = #{@empl} AND "
    end    
    
@d_employees = DoneEmployee.find_by_sql(
    "SELECT e.login as nic, 
            e.id id, 
            e.division_id,
            e.active,
            de.sum as sum, 
            CONVERT(de.time_work, UNSIGNED INTEGER) as time_work, 
            CONVERT(de.time_addwork, UNSIGNED INTEGER) as time_dop_work, 
            CONVERT(de.time_stopwork, UNSIGNED INTEGER) as prostoy, 
            s.sum as oklad,
            shifts.shifts, shifts.shifts_weekend 
                                                FROM pricelist.pl_people e
            LEFT JOIN (SELECT SUM(de.time_work) time_work, SUM(de.time_stopwork) time_stopwork, SUM(de.time_addwork) time_addwork, de.empl_id empl_id, SUM(de.sum) sum FROM #{db_name}.done_employees de LEFT JOIN reports r ON de.report_id = r.id WHERE r.dhcp_login IS NULL AND r.status = '2' AND r.department = 'mod' AND DATE(r.date) BETWEEN '#{@date.beginning_of_month}' AND '#{@date.end_of_month}' #{cond} GROUP BY de.empl_id) de  ON e.id = de.empl_id
            LEFT JOIN #{db_name}.salaries s ON s.division_id = e.division_id AND e.position = s.position AND s.date_from <= '#{@date}'                    
            LEFT JOIN (SELECT SUM(IF((DAY(s.shift_date) NOT IN (#{@weekends} )), 1, 0)) as shifts, SUM(IF((DAY(s.shift_date) IN (#{@weekends} )), 1, 0)) as shifts_weekend, s.employee_id empl_id FROM #{db_name}.shifts s WHERE type = 'WorkShift' AND department = 'mod' AND shift_date BETWEEN DATE('#{@date.beginning_of_month}') AND DATE('#{@date.end_of_month}') GROUP BY empl_id) shifts ON shifts.empl_id = e.id                                                           
                                                               GROUP BY nic HAVING #{cond2} (de.sum > 0 OR shifts.shifts > 0 OR shifts.shifts_weekend > 0 OR (e.active = 'Y' AND e.division_id = 241))")

  end


end
