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, :only => [ :set_work_hours, :weekly_work_sheet, :weekly_work_sheet2, :timeliste ] 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 @work = Work.new(params[:work]) @work.user = user @estimate = Estimate.new(params[:estimate]) @tasks = Task.find_open @users = User.find(:all) end def create if params[:work] && params[:work][:backlog_name] && params[:work][:task_description] backlog = Backlog.find_by_name(params[:work].delete(:backlog_name)) description = params[:work][:task_description] task = Task.find_by_backlog_id_and_description(backlog.id, description) params[:work][:task_id] = Task.find_by_backlog_id_and_description(backlog.id, params[:work].delete(:task_description)) end convert_hours_param @work = Work.new(params[:work]) @work.completed_at = Time.now unless @work.completed_at if @work.save! flash[:notice] = 'Work was successfully created.' else render :action => 'new' return end @work.task.estimates.create!(params[:estimate]) if params[:estimate] back_or_redirect_to :controller => 'periods', :action => 'show', :id => @work.task.period, :task_id => @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 @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 params[:estimate].nil? || (@estimate = @work.task.estimates.create(params[:estimate])).errors.size == 0 back_or_redirect_to :controller => 'periods', :action => 'show', :id => @work.task.period, :task_id => @work.task.id return end end @task = @work.task edit render :action => 'edit' end def destroy work = Work.find(params[:id]) period = work.task.period work.destroy 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(:all, :conditions => "started_at < '#{@date+1}' AND completed_at >= '#{@date}'", :order => 'completed_at' ) @started_works = Task.find_started 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_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 @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 => '/tasks/description_list' end private def convert_start_time_param if params[:work] && params[:work][:started_at_time] new_hour = params[:work][:started_at_time][0..1] new_minutes = params[:work][:started_at_time][3..4] if @work.started? t = @work.started_at else t = Time.now end params[:work][:started_at] = Time.local(t.year, t.month, t.day, new_hour, 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