next_assignment routine fixed

This commit is contained in:
Karel Picman 2013-07-16 14:24:42 +02:00
parent 1b38113655
commit c410c2fa87
4 changed files with 74 additions and 37 deletions

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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