# -*- coding: utf-8 -*-
class Corp2Controller < ApplicationController
    $department = 'corp'
    $department_id = '241'
  before_filter :isAuthorization
  before_filter :set_var, :except => :update_value
  before_filter :get_reports, :only => [:index, :index_excel]
  before_filter :get_stats, :only => [:stats, :stats_excel]

### MUST BE
  def 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]
      if Category.exists? params[:t_ct] 
        category = params[:t_ct] 
      else
        category = Category.active.corp.first.id
      end
      t_id =  params[:t_id].to_i
      user = Employee.find_by_login params[:t_empl]
      user = @current_user unless user
      if params[:t_date]
        t_date = Time.at(params[:t_date].to_i).to_date
      else
        t_date = Time.now
      end
      description = Iconv.conv("utf-8", "KOI8-R", @template.strip_tags(params[:com_stay_work]))
      ## Уникальность заявки в один день по одной категории с одним реквест_ид
      if @report=Report.find(:first, :conditions =>"DATE(date) = '#{t_date}' AND request_id = #{t_id} AND category = '#{category}'")
        redirect_to edit_corp2_path(:id => @report.id, :com_stay_work => description), :notice => "Отчет с данным id уже существует. " # :action => 'edit', :id => @report.id, :com_stay_work => description
      else
        @report = Report.new(:department => 'corp', :date => t_date, :name => params[:t_login], :request_id => t_id, :category => category, :com_stay_work => description, :dhcp_login => 'new', :status => 0)
        @report.done_employees.build(:employee => user, :time_addwork => '', :time_stopwork =>'')
      end
    elsif @boss
      @report = Report.new(:department => 'corp', :date => Time.now, :category => Category.active.corp.first.id, :dhcp_login => 'new', :status => 0)
      @report.done_employees.build(:employee => @current_user, :time_addwork => '', :time_stopwork =>'')
    else
      flash[:error] = "Новые отчеты следует создавать из реквеста!"
      redirect_to :action => 'index'
    end
    get_pricelist
  end

  def create
    @report = Report.new(params[:report])
    @report.save
    if @report.new_record?
      flash.now[:error] =  (@report.errors.each_full { |msg| puts msg }).to_s
    end
    respond_to do |format|
      unless flash.size > 0
        flash[:notice] = 'Отчет создан! '
        format.html { redirect_to corp2_index_path(:filter_month => @report.date.to_date.month, :filter_year => @report.date.to_date.year)}
        format.xml  { head :ok }
      else
        get_pricelist
        format.html { render :action => "new", :report => @report }
      end
    end
  end

 def edit
   @report = Report.find(params[:id])
   @report.com_stay_work = params[:com_stay_work] if params[:com_stay_work]
   get_pricelist
 end

 def update
   @report = Report.find(params[:id])
   @report.attributes = params[:report]
   respond_to do |format|
     if @boss || @report.status != 2
       unless @disp && !(@report.done_employees.map{|i| i.empl_id}.include? @current_user.id)
         if @report.save
           flash[:notice] = 'Запись обновлена'
           format.html { redirect_to corp2_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 }
         end
       else
         flash[:error] = 'Права только на просмотр!'
       end
     else
       flash[:error] = 'У вас недостаточно прав для изменения отчета'
     end
     unless flash[:error].nil?
       get_pricelist
       format.html { render :action => "edit" }
       format.xml  { render :xml => @report.errors, :status => :unprocessable_entity }
     end
   end

 end

  def destroy
    @report =   Report.find(params[:id])
    if @boss || @report.status != 2
      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 corp2_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 = 'corp'
    end
    @report.category =  params[:type]
    
    @pricelist = Division.corp.pricelist.with_category(@report.category)
    @top_works = (@report.done_works.map{|i| i.work} + DoneWork.top_works_for_mod(@report)).uniq
    
    @pricelist = @top_works + (@pricelist - @top_works)
    render :update do |page|
      page.replace_html  'pricelist_table', :partial => 'pricelist', :collection => @pricelist, :locals =>{:done_works => @report.done_works}
      page.call "ChangeMaterials"
    end
  end

  def 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] = "Материалы"
      row[9] = "Коммент"
      row[10] = "Последняя правка"
      row[11] = "Request"
      row[12] = "Выходной"    
      row[13] = "Статус"
    for report in @reports do
      i += 1
      row = dataBook1.row(i)
      row[0] = report.id
      row[1] = report.name
      row[2] = report.empls.to_s.gsub("<li>", "").gsub("</li>", "").gsub("<font class=currency>", "").gsub("</font>", "\r")
      row[3] = report.date.to_date
      row[4] = report.sum.to_f
      row[5] = report.request_bonus_sum.to_i
      row[6] = report.cat_n
      row[7] = (report.wrks.to_s.gsub("<li>", "").gsub("</li>", "\r") + report.not_standart_wrks.to_s.gsub("<li>", "").gsub("</li>", "\r"))
      row[8] = report.mats.to_s.gsub("<li>", "").gsub("</li>", "\r")
      row[9] = report.comment
      row[10] = report.ed_name
      row[11] = report.request_id
      row[12] = report.weld
      row[13] = report.status_name
    end
    # Write book
    @file = 'excel-' + rand().to_s + '.xls'
    book.write 'public/'+@file
    render :layout => false
  end


  def update_value
    Employee.current_user = Employee.find(session[:user_id]) unless session[:user_id].nil?
    report = Report.find(params[:id])
    if report
      params.delete("id"); params.delete("controller"); params.delete("action")
      report.update_attributes(params)
    end
    render :update do |page|
      page.call "ChangeRow", report.id, report.sum
    end
  end

  def update_sum
    if params[:id]
      @report = Report.find params[:id]
    else
      @report = Report.new
      @report.department = 'corp'
    end
    @report.attributes = params[:report]

    @report.calculate
     render :update do |page|
      page.replace_html  'sums', :partial => 'sum', :locals =>{:report => @report}
      page.call "show_hide_attrs"
    end
  end

   def 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] = "З/П"
    for e in @d_employees do
      i += 1
      row = dataBook1.row(i)
      row[0] = e.nic
      row[1] = e.time_work
      row[2] = e.shifts
      row[3] = 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 year_report
    if params[:filter_year]
      year = params[:filter_year]
    else
      year = Date.today.year.to_s
    end
    @year = ('01/01/' + year).to_date
    if params[:category] && params[:category] != ''
      cond = "AND r.category = #{params[:category]}"
    else
      cond = ''
    end
    @reports = Report.find_by_sql("SELECT MONTH(DATE(r.date)) as month, SUM(r.sum) as sum, COUNT(r.id) as reps_size FROM reports r WHERE r.closed_at IS NULL AND r.department ='corp' AND DATE(r.date) BETWEEN DATE('#{@year.beginning_of_year}') AND DATE('#{@year.end_of_year}') AND r.status = 2 #{cond} GROUP BY month")
  end


private

  def get_pricelist
    if @report
    @pricelist = Division.corp.pricelist.with_category(@report.category)
      @top_works = (@report.done_works.map{|i| i.work} + DoneWork.top_works_for_mod(@report)).uniq
      @pricelist = (@top_works + (@pricelist - @top_works)).flatten.compact.uniq
      @categories = (Category.active.corp + [@report.categor]).uniq
      end
  end



  def get_reports
    @employees = Division.corp.employees.working
    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
    if params[:filter_day] && params[:filter_day] != ""
      @date = (month +'/'+params[:filter_day]+'/' + year).to_date
      date_from = @date
      date_to = @date
    else
      @date = (month +'/01/' + year).to_date
      date_from = @date
      date_to = @date.end_of_month
    end

    if @boss
      @filter_empl =  params[:filter_empl]
      @wage = 0
    elsif @disp
      @filter_empl =  params[:filter_empl]
      @wage = Employee.wage_for_period_corp(@current_user, @date)
    else
      @filter_empl = @current_user.id
      @wage = Employee.wage_for_period_corp(@current_user, @date)
    end

    
    cond = []
    cond << "r.department = 'corp'"
    if @filter_empl != '' && @filter_empl != nil
      cond << "r.id IN (SELECT de.report_id FROM done_employees de WHERE de.empl_id = #{@filter_empl})"
    end

    if params[:works] && params[:works].size > 0
      cond << "dw.work_id IN (#{params[:works].join(', ')})"
    end
    cond << "status = #{params[:filter_status]}" if params[:filter_status] && params[:filter_status] != '5'
    cond << "r.category = #{params[:filter_worktype]}" if params[:filter_worktype].to_s != ''
    cond << "r.get_money_status = #{params[:get_money_status]}" if params[:get_money_status].to_s != ''    
    cond << "r.money_type = #{params[:money_type]}" if params[:money_type].to_s != ''
    cond = cond.join(" AND ")
 
# ["Продажа", 3], ["Установка",  1], ['Аренда', 2], ['Снято с объекта сети:', 4]]
      @reports = 
        Report.find_by_sql(
                           "SELECT GROUP_CONCAT(DISTINCT CONCAT('<li>', done_employees.empl_name, '  (', done_employees.sum, '<font class=currency> руб.</font>)</li>') SEPARATOR ' ') as empls,
                                   (SELECT GROUP_CONCAT(CONCAT('<li>', 
#{DoneMaterial.inst_type_for_sql}, ': ',
dm.material_name, ' ',
(IF((dm.count > 1), (CONCAT(dm.count, ' шт. ')), '')),
IF((dm.price>0), (CONCAT(' (цена - ', dm.price, ') ')), ''),
'</li>') SEPARATOR ' ') as mats FROM done_materials dm WHERE dm.report_id = r.id AND (dm.inst_type != 6 OR dm.pay_type != 4) GROUP BY dm.report_id) as mats, 
                                   GROUP_CONCAT(DISTINCT CONCAT('<li>', IFNULL(w.name, p.name), ' - ', dw.count, '</li>') SEPARATOR ' ') as wrks, 
                                   IF((r.get_money_sum = 0 OR r.get_money_sum = NULL), '', CONCAT('<li>', 'НЕСТАНДАРТНАЯ РАБОТА: ', r.com_conflicts, ' - ', r.get_money_sum, '</li>') ) as not_standart_wrks, 
                            IF((r.request_id IS NULL), '', IF((r.request_closed IS TRUE), 'Закрыт', 'Открыт')) as req_status, 
                            r.id as id, r.request_id, r.name, r.date, r.sum, r.status, ct.name as cat_n, r.weld, r.com_imperfection, r.com_stay_work as comment, ed.login as ed_name, r.request_closed, r.request_bonus_sum, r.total_sum_get_money, r.money_type
                               FROM reports r 
                                    LEFT JOIN done_employees on done_employees.report_id = r.id 
                                    LEFT JOIN pricelist.pl_people ed on r.update_user_id = ed.id 
                                    
                                    LEFT JOIN category ct ON ct.id = r.category 
                                    LEFT JOIN done_works dw ON dw.report_id = r.id
                                    LEFT JOIN works AS w ON dw.work_id=w.id && dw.pricelist=0
                                    LEFT JOIN pricelist.pl_items AS p ON dw.work_id=p.id && dw.pricelist=1
                                         WHERE r.closed_at IS NULL AND r.dhcp_login = 'new' AND DATE(r.date) BETWEEN DATE('#{date_from}') AND DATE('#{date_to}') AND #{cond}
                                               GROUP BY r.id ORDER BY r.request_id, r.date,r.name")

   
  end

   def get_stats
     db_name = Rails.configuration.database_configuration[Rails.env]["database"]
    @page_title = 'Статистика по з/п'
    @employees = Division.corp.employees  # ЗП
     @bonus = []
     if params[:filter_month]
       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
    # debugger
   if params[:filter_day] && params[:filter_day] != '0'
     
     @date_from = (month +'/' + params[:filter_day] +'/' + year).to_date
     @date_to = (month +'/' + params[:filter_day] +'/' + year).to_date
   else   
  #   debugger
     @date_from = (month +'/1/' + year).to_date
     @date_to = @date_from.end_of_month
   end
    work_days = WorkingDay.find(:first, :conditions => {:month => @date_from.beginning_of_month})
    if work_days
      @working_days = work_days.working_days.to_i
    else
      @working_days = 1
    end
    @category = params[:filter_worktype]
     if @boss
      @empl =  params[:filter_empl] if params[:filter_empl].to_i > 0 
    else
      @empl = @current_user.id
    end
     @date = @date_from
    cond = ''; cond2 ='';
    if @category && @category != ''
      cond += "AND r.category = #{@category} "
    end
    if @empl && @empl != '0' && !@empl.blank?
      cond += "AND de.empl_id = #{@empl}"
      cond2 = "empl_id = #{@empl} AND"
    end    

     @d_employees = DoneEmployee.find_by_sql(
    "SELECT e.login as nic, 
            e.id empl_id, 
            e.division_id,
            e.active,
            de.sum as sum, 
            de.bonus as bonus,
            shifts.shifts shifts,
            de.time_work time_work,             
           de.request_uniq request_uniq,             
            s.sum as oklad
                    FROM pricelist.pl_people e
            LEFT JOIN (SELECT GROUP_CONCAT(r.request_id  SEPARATOR ', ') request_uniq, COUNT(de.id) time_work, SUM(r.request_bonus_sum * de.time_work/r.work_time) as bonus, 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 AND r.closed_at IS NULL WHERE r.status = '2' AND r.department = 'corp' AND r.dhcp_login = 'new' 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 COUNT(s.id) as shifts, s.employee_id empl_id FROM #{db_name}.shifts s WHERE type = 'WorkShift' AND department = 'corp' 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 (e.active = 'Y' AND e.division_id = 155))")
  end




  def set_var
    Employee.current_user = Employee.find(session[:user_id]) unless session[:user_id].nil?
    $department = 'corp2'
    $department_id = '241'
    cookies[:sys_dep] = { :value => $department }
    @current_user = Employee.current_user
    @boss = (@current_user.accesses.for_department('corp').size > 0 && @current_user.accesses.for_department('corp').first.access_superuser == 1)
    @disp = (@current_user.accesses.for_department('corp').size > 0 && @current_user.accesses.for_department('corp').first.access_delete == 1) && !@boss
    
  end


end
