diff --git a/app/controllers/jobs_controller.rb b/app/controllers/jobs_controller.rb index 6e2bc41..ba00706 100644 --- a/app/controllers/jobs_controller.rb +++ b/app/controllers/jobs_controller.rb @@ -10,14 +10,15 @@ class JobsController < ApplicationController end def new - @job = Job.new + @job = Job.new.with_all_time_budgets end def edit + @job.with_all_time_budgets end def update - if @job.update(job_params) + if @job.update(remove_empty_time_budgets(job_params)) redirect_to job_path(@job, project_id: @job.project.id) else render :edit @@ -51,7 +52,8 @@ class JobsController < ApplicationController :budget, :external_project_id, :name, - :description + :description, + time_budgets_attributes: [:id, :activity_id, :hours, :job_id, :_destroy] ) end @@ -62,4 +64,12 @@ class JobsController < ApplicationController def set_job @job = Job.find(params[:id]) end + + # If a time budget is set to 0, remove it + def remove_empty_time_budgets(params) + params[:time_budgets_attributes].each do |key, value| + params[:time_budgets_attributes][key]["_destroy"] = true if params[:time_budgets_attributes][key]["hours"] == "0" + end + params + end end diff --git a/app/models/job.rb b/app/models/job.rb index ff6ad68..55d3a29 100644 --- a/app/models/job.rb +++ b/app/models/job.rb @@ -7,10 +7,34 @@ class Job < ActiveRecord::Base presence: true belongs_to :project - has_many :time_entries + has_many :time_entries, dependent: :restrict_with_error + has_many :time_budgets, dependent: :restrict_with_error + accepts_nested_attributes_for :time_budgets, allow_destroy: true scope :project, ->(project) { where(project_id: project.id) } - scope :project_or_parent, ->(project) { where(project_id: [project.id, project.parent.id]) } + scope :project_or_parent, ->(project) { where(project_id: [project.id, project.parent&.id]) } + + def with_all_time_budgets + TimeEntryActivity.where.not(id: time_budgets.pluck(:activity_id)).each do |activity| + time_budgets << TimeBudget.new(job_id: id, activity_id: activity.id) + end + self + end + + def missing_time_budgets + budgets = [] + new_activities.collect { |activity| budgets << TimeBudget.new(job_id: id, activity_id: activity.id) } + end + + def total_time_budget + return 0 if time_budgets.empty? + + time_budgets.sum(&:hours) + end + + def time_budget_for(activity) + time_budgets.where(activity_id: activity.id).hours || 0 + end def total_time_logged TimeEntry.where(job_id: id) diff --git a/app/models/time_budget.rb b/app/models/time_budget.rb new file mode 100644 index 0000000..83198b4 --- /dev/null +++ b/app/models/time_budget.rb @@ -0,0 +1,11 @@ +class TimeBudget < ActiveRecord::Base + validates :hours, + presence: true + + validates :activity_id, + inclusion: { in: TimeEntryActivity.pluck(:id) } + + belongs_to :job + belongs_to :activity, class_name: "TimeEntryActivity" + +end diff --git a/app/views/jobs/_budget.html.erb b/app/views/jobs/_budget.html.erb new file mode 100644 index 0000000..1f54c16 --- /dev/null +++ b/app/views/jobs/_budget.html.erb @@ -0,0 +1,11 @@ +
<%= f.label :name %> <%= f.text_field :name %> -
<%= f.label :description %> <%= f.text_area :description %> -
<%= f.label :starts_on %> <%= f.date_field :starts_on %> -
<%= f.label :ends_on %> <%= f.date_field :ends_on %> -
<%= f.hidden_field :project_id, value: @project.id %><%= f.label :external_project_id %> <%= f.number_field :external_project_id %> -
-- <%= f.label :budget %> - <%= f.number_field :budget %> -
+ <%= f.submit %> diff --git a/app/views/jobs/_job.html.erb b/app/views/jobs/_job.html.erb index d29dee7..f3253b1 100644 --- a/app/views/jobs/_job.html.erb +++ b/app/views/jobs/_job.html.erb @@ -1,9 +1,13 @@