# -*- coding: utf-8 -*-
class WeldersController < ApplicationController


  before_filter :isAuthorization
  before_filter :set_var, :except => :new


 
  def index
    @current_user = Employee.find(session[:user_id])
    @boss = (@current_user.accesses.for_department('welder').size > 0 && @current_user.accesses.for_department('welder').first.access_write == 1)
    @shifts = WorkShift.find_or_create_for_month(@date, 'welder') 
    @reports = Report.for_department('welder').for_calendar(@date)
  end

  def new
    params.delete("action")
    redirect_to :action => :edit, :id => 1, :params => params
  end


  def edit
    if params[:t_id]
      # "t_date"=>"1449694800", "t_empl"=>"Ptica", "com_stay_work"=>"", "date"=>"2015-12-10", "t_id"=>"302983", "workplace"=>"", "t_ct"=>"47", "id"=>"1", "t_login"=>"kliment10k3"
      @new_report = Report.new(:date => @date, :login_from => params[:workplace], :request_id => params[:t_id], :category => params[:t_ct], :name => params[:t_login], :department => "welder")
      empl = Person.find_by_login params[:t_empl]
      @new_report.done_employees.build(:empl_id => empl.id)
      @new_report.id = (10000000+rand(1000))
    end
    @shifts = WorkShift.for_department("welder").for_date(@date)      
    @employees = (Employee.find_by_login 'lipan').to_a + Employee.from_division(168).working + (Employee.find_by_login 'annet17').to_a
    @works = @new_report.to_a + Report.find(:all, :conditions => ["department = 'welder' AND DATE(date) = ?", @date])
  end
  
  def update
    @shifts = []
    @employees = params[:employees]   
    @errors = []
    ## СМЕНЫ
    period = Period.find_by_sql "SELECT * FROM periods WHERE DATE_FORMAT(periods.month, '%m.%Y') = '#{@date.to_date.strftime("%m.%Y")}' AND periods.department = 'welder' LIMIT 1"
    if period && period.first.closed == false
    @employees.each  do |k, v|
      empl = Employee.find k
      empl.update_attributes(v)
      @shifts << empl.reload.work_shifts.select{|i| i.shift_date == @date}
    end
    ## РАБОТЫ
      for rep in params[:reports].to_a do
        report = (rep.first.to_i >= 10000000 ? Report.new : (Report.find rep.first))
        pars = rep.last
        if report && pars[:_delete] != 'true'
          report.attributes = {:name => pars[:name], :login_from => pars[:login_from], :category => pars[:category].to_i, :date => pars[:date].to_date, :department => pars[:department], :request_id => pars[:request_id]}
          report.done_works.new(:work_id => Work.with_category(report.category).first.id, :count => 1) if report.done_works.size == 0
          for d_employee in pars[:done_employees].to_a do
            employee = d_employee.first.to_i
            if (report.done_employees.select{|i| i.empl_id.to_i == employee}).size == 0
              report.done_employees.build(:empl_id => employee)           
            end            
          end
          if pars[:done_employees] && report.done_employees
            destr_employees = report.done_employees.map{|i| i.empl_id.to_s} - pars[:done_employees].keys
            report.done_employees.select{|i| destr_employees.include? i.empl_id.to_s }.each{ |n| n.mark_for_destruction}
          end
          for material in pars[:done_materials_attributes].to_a do
            empl = Employee.find material.last[:employee_id]
            mat = material.last            
            if mat[:_delete] != 'true'
              report.done_materials.build(:employee_id => empl.id, :employee_name => empl.login, :material_id => mat[:material_id], :count => mat[:count], :material_name =>mat[:material_name], :price_from_store => mat[:price_from_store], :purchase_price => mat[:purchase_price], :inst_type => mat[:inst_type], :pay_type => mat[:pay_type]) if mat[:count].to_i > 0
            else
              report.done_materials.select{ |i| i.material_id.to_s == mat[:material_id].to_s && i.employee_id == empl.id}.each{ |n| n.mark_for_destruction}
            end

          end          
          unless report.save
            @errors << report.errors.each_full { |msg| puts msg }
          end
        else
          unless report.new_record?
              unless report.destroy
                @errors << report.errors.each_full { |msg| puts msg } 
              end
          end
        end
      end      
      respond_to do |f|
        if @errors.size == 0
          flash[:notice] = 'Запись обновлена'
          f.html { redirect_to welders_path(:date => @date)}
        else          
          flash.now[:error] =  @errors.join(', ')
          @shifts = WorkShift.for_department("welder").for_date(@date)      
          @employees = (Employee.find_by_login 'lipan').to_a + Employee.from_division(168).working + (Employee.find_by_login 'annet17').to_a
          @works = Report.find(:all, :conditions => ["department = 'welder' AND DATE(date) = ?", @date])
          f.html { render :action => "edit", :shifts => @shifts, :employees => @employees, :works => @works}
        end
      end
    else
      respond_to do |f|
        flash[:error] = 'Период закрыт, изменения не возможны!'
        f.html { redirect_to welders_path(:date => @date)}
      end      
    end
  end
  
  def destroy_material
    dm = DoneMaterial.find params[:id]
    dm.destroy
    r =dm.report
    r.save
    render :update do |page|    
      page.call "delete_row", dm.id
    end
  end


  def destroy
    @report = Report.find params[:id]
    unless @report.destroy
      messages = ''
      @mes = @report.errors.each_full {|msg| messages += msg + "<br/>"}
    end
    render :update do |page|    
      if @mes
        page.alert @mes
      else        
        page.call "cut_work", @report.id
      end
    end
  end


  def add_work
    r = (10000000+rand(1000))
    work = Report.new(:date => @date, :department => 'welder', :name => '', :category => Category.welders.first)
    work.id = r
    @employees =  (Employee.find_by_login 'lipan').to_a + Employee.from_division(168).working + (Employee.find_by_login 'annet17').to_a
    render :update do |page|    
      page.insert_html :top, 'works', :partial => 'work', :locals =>{:work => work}
      page.call "show_hide", @employees.first.id
      page.call "check_login"
    end
  end


  def add_materials
    @employee = Employee.find params[:employee_id]
    if params[:id].to_i >= 10000000 
      @report = Report.new
      @report.id = params[:id] 
    else
      @report = Report.find params[:id]
    end
    @date_report = params[:date].to_date
    render :update do |page|
      page.call 'modal_window', 'window2'
      page.replace_html  'yield2', :partial => 'material'
      page.call "set_materials_count"
    end
  end

  def change_materials
    if params[:report_id].to_i >= 10000000 
      @report = Report.new
      @report.id = params[:report_id]
      @report.date = params[:date]
    else
      @report = Report.find params[:report_id]
    end
    @category = Category.find params[:category]
    @employees =  (Employee.find_by_login 'lipan').to_a + Employee.from_division(168).working + (Employee.find_by_login 'annet17').to_a

    render :update do |page|
      page.replace_html @report.id.to_s+"_empls", :partial => 'employee', :locals =>{:category => @category, :report => @report}
    end
  end


  def change_status
    @reports = Report.for_department('welder').for_date(@date)
    @shifts = WorkShift.for_department('welder').for_date(@date)
    if @reports.size > 0
      new_status = @reports.first.status.to_i == 2 ? 1 : 2
      Report.update(@reports.map{|i| i.id }, [:status => new_status] * @reports.size) 
    end
    if @shifts.size > 0
      new_status = @shifts.first.status.to_i == 2 ? 1 : 2
      WorkShift.update(@shifts.map{|i| i.id }, [:status => new_status] * @shifts.size) 
    end
    render :update do |page|
        page.call "change_status", @date, (new_status == 2 ? "Отклонить" : "Утвердить")
    end
  end

  def report
      db_name = Rails.configuration.database_configuration[Rails.env]["database"]
    if params[:date]
      @date = params[:date].to_date
    else
      @date = Date.today
    end       
    @reports = Report.find_by_sql(
                                  "SELECT e.login as login, e.active, e.division_id,
                                   de.count_works as obj_size, 
                                   s.count_shifts as smena, 
                                   s.evening_time as evening, 
                                   s.nighttime as night 
                                     FROM pricelist.pl_people e
                                        LEFT JOIN (SELECT de.empl_id empl_id, SUM(de.sum) sum, COUNT(de.id) count_works FROM #{db_name}.done_employees de LEFT JOIN reports r ON de.report_id = r.id WHERE r.status = '2' AND r.closed_at IS NULL AND r.department = 'welder' AND DATE(r.date) BETWEEN '#{@date.beginning_of_month}' AND '#{@date.end_of_month}' GROUP BY de.empl_id) de  ON e.id = de.empl_id                        
                        LEFT JOIN (SELECT COUNT(s.id) count_shifts, SUM(evening_time) evening_time, SUM(nighttime) nighttime, s.employee_id empl_id FROM #{db_name}.shifts s WHERE type = 'WorkShift' AND department = 'welder' AND status = 2 AND shift_date BETWEEN DATE('#{@date.beginning_of_month}') AND DATE('#{@date.end_of_month}') GROUP BY empl_id) s ON s.empl_id = e.id
                                
                                                               GROUP BY login HAVING (smena > 0 OR obj_size > 0 OR (e.active = 'Y' AND e.division_id = 168))")

  end

private

  def set_var
    Employee.current_user = Employee.find(session[:user_id]) unless session[:user_id].nil?
    $department = 'welder'
    $department_id = '168'   
    cookies[:sys_dep] = { :value => $department }
    if params[:date] && !params[:date].blank?
      @date = params[:date].to_date
    elsif params[:t_date]
      @date = Time.at(params[:t_date].to_i).to_date
    else
      @date = (Date.today)
    end
  end


end
