From c410c2fa87173a846fc764d7fa445b0c64468b9d Mon Sep 17 00:00:00 2001 From: Karel Picman Date: Tue, 16 Jul 2013 14:24:42 +0200 Subject: [PATCH] next_assignment routine fixed --- app/models/dmsf_workflow.rb | 74 ++++++++++++--------- app/models/dmsf_workflow_step.rb | 15 ++++- app/models/dmsf_workflow_step_assignment.rb | 16 ++++- test/unit/dmsf_workflow_test.rb | 6 +- 4 files changed, 74 insertions(+), 37 deletions(-) diff --git a/app/models/dmsf_workflow.rb b/app/models/dmsf_workflow.rb index b3846638..814de927 100644 --- a/app/models/dmsf_workflow.rb +++ b/app/models/dmsf_workflow.rb @@ -116,24 +116,46 @@ class DmsfWorkflow < ActiveRecord::Base end def next_assignments(dmsf_file_revision_id) - results = Array.new - self.dmsf_workflow_steps.each do |step| - break unless results.empty? || results[0].dmsf_workflow_step.step == step.step - step.dmsf_workflow_step_assignments.each do |assignment| - if assignment.dmsf_file_revision_id == dmsf_file_revision_id - if assignment.dmsf_workflow_step_actions.empty? - results << assignment - next - end - add = true - assignment.dmsf_workflow_step_actions.each do |action| - if action.is_finished? - add = false - break + results = Array.new + nsteps = self.dmsf_workflow_steps.collect{|s| s.step}.uniq + nsteps.each do |i| + step_is_finished = false + steps = self.dmsf_workflow_steps.collect{|s| s.step == i ? s : nil}.compact + steps.each do |step| + step.dmsf_workflow_step_assignments.each do |assignment| + if assignment.dmsf_file_revision_id == dmsf_file_revision_id + assignment.dmsf_workflow_step_actions.each do |action| + case action.action + when DmsfWorkflowStepAction::ACTION_APPROVE + step_is_finished = true + # Try to find another unfinished AND step + exists = false + stps = self.dmsf_workflow_steps.collect{|s| (s.step == i && s.operator == DmsfWorkflowStep::OPERATOR_AND) ? s : nil}.compact + stps.each do |s| + s.dmsf_workflow_step_assignments.each do |a| + exists = a.add?(dmsf_file_revision_id) + break if exists + end + end + step_is_finished = false if exists + break + when DmsfWorkflowStepAction::ACTION_REJECT + return Array.new + end end end - results << assignment if add - end + break if step_is_finished + end + if step_is_finished + break + else + steps.each do |step| + step.dmsf_workflow_step_assignments.each do |assignment| + results << assignment if assignment.add?(dmsf_file_revision_id) + end + end + return results + end end end results @@ -160,27 +182,15 @@ class DmsfWorkflow < ActiveRecord::Base def try_finish(revision, action, user_id) case action.action - when DmsfWorkflowStepAction::ACTION_APPROVE - self.dmsf_workflow_steps.each do |step| - step.dmsf_workflow_step_assignments.each do |assignment| - if assignment.dmsf_file_revision_id == revision.id - if assignment.dmsf_workflow_step_actions.empty? - return false - end - assignment.dmsf_workflow_step_actions.each do |act| - return false unless act.is_finished? - end - end - end - end + when DmsfWorkflowStepAction::ACTION_APPROVE + assignments = self.next_assignments revision.id + return false unless assignments.empty? revision.update_attribute(:workflow, DmsfWorkflow::STATE_APPROVED) return true when DmsfWorkflowStepAction::ACTION_REJECT revision.update_attribute(:workflow, DmsfWorkflow::STATE_REJECTED) return true - when DmsfWorkflowStepAction::ACTION_DELEGATE - #assignment = DmsfWorkflowStepAssignment.find_by_id(action.dmsf_workflow_step_assignment_id) - #assignment.update_attribute(:user_id, user_id) if assignment + when DmsfWorkflowStepAction::ACTION_DELEGATE self.dmsf_workflow_steps.each do |step| step.dmsf_workflow_step_assignments.each do |assignment| if assignment.id == action.dmsf_workflow_step_assignment_id diff --git a/app/models/dmsf_workflow_step.rb b/app/models/dmsf_workflow_step.rb index 351e1635..647b9136 100644 --- a/app/models/dmsf_workflow_step.rb +++ b/app/models/dmsf_workflow_step.rb @@ -44,5 +44,18 @@ class DmsfWorkflowStep < ActiveRecord::Base :user_id => user_id, :dmsf_file_revision_id => dmsf_file_revision_id) step_assignment.save - end + end + + def is_finished?(dmsf_file_revision_id) + self.dmsf_workflow_step_assignments.each do |assignment| + if assignment.dmsf_file_revision_id == dmsf_file_revision_id + if assignment.dmsf_workflow_step_actions.empty? + return false + end + assignment.dmsf_workflow_step_actions.each do |act| + return false unless act.is_finished? + end + end + end + end end \ No newline at end of file diff --git a/app/models/dmsf_workflow_step_assignment.rb b/app/models/dmsf_workflow_step_assignment.rb index 84b76549..39d0f5ce 100644 --- a/app/models/dmsf_workflow_step_assignment.rb +++ b/app/models/dmsf_workflow_step_assignment.rb @@ -22,5 +22,19 @@ class DmsfWorkflowStepAssignment < ActiveRecord::Base has_many :dmsf_workflow_step_actions, :dependent => :destroy validates :dmsf_workflow_step_id, :presence => true validates :dmsf_file_revision_id, :presence => true - validates_uniqueness_of :dmsf_workflow_step_id, :scope => [:dmsf_file_revision_id] + validates_uniqueness_of :dmsf_workflow_step_id, :scope => [:dmsf_file_revision_id] + + def add?(dmsf_file_revision_id) + if self.dmsf_file_revision_id == dmsf_file_revision_id + add = true + self.dmsf_workflow_step_actions.each do |action| + if action.is_finished? + add = false + break + end + end + return add + end + false + end end \ No newline at end of file diff --git a/test/unit/dmsf_workflow_test.rb b/test/unit/dmsf_workflow_test.rb index 457d346e..1d4778eb 100644 --- a/test/unit/dmsf_workflow_test.rb +++ b/test/unit/dmsf_workflow_test.rb @@ -66,10 +66,10 @@ class DmsfWorkflowTest < RedmineDmsf::Test::UnitTest def test_project # Global workflow - assert_nil @wf1.project + assert_nil @wf2.project # Project workflow - @wf1.project_id = 5 - assert @wf1.project + @wf2.project_id = 5 + assert @wf2.project end def test_to_s