class WorksController < ApplicationController in_place_edit_for :work, :hours in_place_edit_for :work, :invoice in_place_edit_for :work, :started_at_time in_place_edit_for :work, :completed_at_time skip_before_filter :populate_layout, :except => [:create, :destroy, :edit, :index, :list, :new, :show, :update] auto_complete_for :work, :description def index list render :action => 'list' end # GETs should be safe (see http://www.w3.org/2001/tag/doc/whenToUseGet.html) verify :method => :post, :only => [ :destroy, :create, :update ], :redirect_to => { :action => :list } def list @period = params[:id] && Period.find(params[:id]) @work_pages, @works = paginate :works, :per_page => 20 end def show @work = Work.find(params[:id]) end def new unless @work @work = Work.new(params[:work]) @work.user = user end @estimate ||= Estimate.new(params[:estimate]) @work_accounts = WorkAccount.find(:all, :order => :name) @tasks = Task.find_open @users = User.find(:all) end def create if params[:work] backlog_name = params[:work].delete(:backlog_name) task_description = params[:work].delete(:task_description) if backlog_name && backlog_name.size > 0 && task_description && task_description.size > 0 backlog = Backlog.find_by_name(backlog_name) task = backlog.tasks_with_children.find{|t| t.description == task_description} params[:work][:task_id] = task.id end account_name = params[:work].delete(:work_account_name) if account_name && account_name.size > 0 account = WorkAccount.find_by_name(account_name) params[:work][:work_account_id] = account.id end end convert_hours_param convert_start_time_param @work = Work.new(params[:work]) @work.completed_at = Time.now unless @work.completed_at @work.user_id = current_user.id if @work.save flash[:notice] = 'Work was successfully created.' else new render :action => 'new' return end @work.task.estimates.create!(params[:estimate]) if @work.task && params[:estimate] back_or_redirect_to :controller => 'periods', :action => 'show', :id => @work.task && @work.task.period, :task_id => @work.task && @work.task.id end def edit @work = Work.find(params[:id]) @work.attributes = params[:work] @estimate = Estimate.new(params[:estimate]) @tasks = Task.find_open @users = User.find(:all) end def update if update_work back_or_redirect_to :controller => 'periods', :action => 'show', :id => @work.task.period, :task_id => @work.task.id else @task = @work.task edit render :action => 'edit' end end def update_row update_work flash.discard @field = params[:field] || 'started_at_time' end def update_time update_work flash.discard @field = params[:field] || 'started_at_time' end def update_work @work = Work.find(params[:id]) convert_start_time_param convert_hours_param if @work.update_attributes(params[:work]) flash[:notice] = 'Work was successfully updated.' if @work.task if params[:estimate] if (@estimate = @work.task.estimates.create(params[:estimate])).errors.size == 0 return true end else return true end else return true end end return false end def destroy work = Work.find(params[:id]) period = work.task && work.task.period work.destroy back_or_redirect_to :controller => 'periods', :action => :list_work, :id => period end def daily_work_sheet @date = (params[:id] && Date.parse(params[:id])) || Date.today @periods = [] @works = Work.find_work_for_day @date @started_works = Task.find_started @work = Work.new(:started_at => Time.now, :completed_at => Time.now) render :layout => 'wide' end def weekly_work_sheet @week = (params[:id] && params[:id].to_i) || Date.today.cweek @rows = Work.works_for_week(@week) render :layout => 'wide' end def timeliste @week = (params[:id] && params[:id].to_i) || Date.today.cweek @backlogs = Work.work_totals_for_week(@week) headers["Content-Type"] = "application/vnd.ms-excel" headers["Content-Disposition"] = 'attachment; filename="export.xml"' render :layout => false end def auto_complete_for_work_work_account_name @accounts = WorkAccount.find(:all, :conditions => [ 'LOWER(name) LIKE ?', '%' + params[:work][:work_account_name].downcase + '%' ], :order => 'name ASC', :limit => 16) render :partial => '/work_accounts/name_list' end def auto_complete_for_work_backlog_name @backlogs = Backlog.find(:all, :conditions => [ 'LOWER(name) LIKE ?', '%' + params[:work][:backlog_name].downcase + '%' ], :order => 'name ASC', :limit => 16) render :partial => '/backlogs/name_list' end def auto_complete_for_work_task_description if backlog_name = params[:backlog_name] if @backlog = Backlog.find_by_name(backlog_name) @tasks = @backlog.tasks_with_children.select {|t| t.description.downcase =~ /#{params[:work][:task_description].downcase}/} end end @tasks ||= Task.find(:all, :conditions => [ "finished_at IS NULL AND LOWER(description) LIKE ?", '%' + params[:work][:task_description].downcase + '%' ], :order => 'description ASC', :limit => 16) render :partial => 'description_list' end private def convert_start_time_param if params[:work] && params[:work][:started_at_time] if params[:work][:started_at_time] =~ /^(\d*):(\d{2})$/ new_hours = $1 new_minutes = $2.to_i else raise "Unknown time format: '#{params[:work][:hours_time]}'" end if @work && @work.started? t = @work.started_at else t = Time.now end params[:work][:started_at] = Time.local(t.year, t.month, t.day, new_hours, new_minutes) params[:work].delete :started_at_time end end def convert_hours_param if params[:work] && params[:work][:hours_time] params[:work][:hours_time].strip! if params[:work][:hours_time] =~ /^(\d*):(\d{2})$/ new_hours = $1 new_minutes = $2.to_i params[:work][:hours] = BigDecimal("#{new_hours}.#{new_minutes / 0.6}") elsif params[:work][:hours_time] =~ /^(\d*(?:.\d)?)$/ params[:work][:hours] = BigDecimal($1) else raise "Unknown time format: '#{params[:work][:hours_time]}'" end params[:work].delete :hours_time end end end