Commit 84805ec3 authored by Frank Bergmann's avatar Frank Bergmann

- added WF capabilities to im_projects

parent 1aeaa3fe
-- DRB: None of this code has changed. We need to redefine these items because
-- the party_approved_member_map is now a table rather than view
drop view wf_user_tasks;
create view wf_user_tasks as
select distinct ta.task_id,
ta.case_id,
ta.workflow_key,
ta.transition_key,
tr.transition_name,
ta.enabled_date,
ta.started_date,
u.user_id,
ta.state,
ta.holding_user,
ta.hold_timeout,
ta.deadline,
ta.estimated_minutes
from wf_tasks ta,
wf_task_assignments tasgn,
wf_cases c,
wf_transition_info tr,
party_approved_member_map m,
users u
where ta.state in ( 'enabled','started')
and c.case_id = ta.case_id
and c.state = 'active'
and tr.transition_key = ta.transition_key
and tr.workflow_key = ta.workflow_key
and tr.trigger_type = 'user'
and tr.context_key = c.context_key
and tasgn.task_id = ta.task_id
and m.party_id = tasgn.party_id
and u.user_id = m.member_id;
-- procedure add_task_assignment
create or replace function workflow_case__add_task_assignment (integer,integer,boolean)
returns integer as '
declare
add_task_assignment__task_id alias for $1;
add_task_assignment__party_id alias for $2;
add_task_assignment__permanent_p alias for $3;
v_count integer;
v_workflow_key wf_workflows.workflow_key%TYPE;
v_context_key wf_contexts.context_key%TYPE;
v_case_id wf_cases.case_id%TYPE;
v_role_key wf_roles.role_key%TYPE;
v_transition_key wf_transitions.transition_key%TYPE;
v_notification_callback wf_context_transition_info.notification_callback%TYPE;
v_notification_custom_arg wf_context_transition_info.notification_custom_arg%TYPE;
callback_rec record;
v_assigned_user record;
begin
-- get some needed information
select ta.case_id, ta.workflow_key, ta.transition_key, tr.role_key, c.context_key
into v_case_id, v_workflow_key, v_transition_key, v_role_key, v_context_key
from wf_tasks ta, wf_transitions tr, wf_cases c
where ta.task_id = add_task_assignment__task_id
and tr.workflow_key = ta.workflow_key
and tr.transition_key = ta.transition_key
and c.case_id = ta.case_id;
-- make the same assignment as a manual assignment
if add_task_assignment__permanent_p = ''t'' then
/* We do this up-front, because
* even though the user already had a task assignment,
* he might not have a case assignment.
*/
perform workflow_case__add_manual_assignment (
v_case_id,
v_role_key,
add_task_assignment__party_id
);
end if;
-- check that we do not hit the unique constraint
select count(*) into v_count
from wf_task_assignments
where task_id = add_task_assignment__task_id
and party_id = add_task_assignment__party_id;
if v_count > 0 then
return null;
end if;
-- get callback information
select notification_callback,
notification_custom_arg into callback_rec
from wf_context_transition_info
where context_key = v_context_key
and workflow_key = v_workflow_key
and transition_key = v_transition_key;
if FOUND then
v_notification_callback := callback_rec.notification_callback;
v_notification_custom_arg := callback_rec.notification_custom_arg;
else
v_notification_callback := null;
v_notification_custom_arg := null;
end if;
-- notify any new assignees
for v_assigned_user in
select distinct u.user_id
from users u
where u.user_id not in (
select distinct u2.user_id
from wf_task_assignments tasgn2,
party_approved_member_map m2,
users u2
where tasgn2.task_id = add_task_assignment__task_id
and m2.party_id = tasgn2.party_id
and u2.user_id = m2.member_id)
and exists (
select 1
from party_approved_member_map m
where m.member_id = u.user_id
and m.party_id = add_task_assignment__party_id
)
LOOP
PERFORM workflow_case__notify_assignee (
add_task_assignment__task_id,
v_assigned_user.user_id,
v_notification_callback,
v_notification_custom_arg
);
end loop;
-- do the insert
insert into wf_task_assignments (
task_id,
party_id
) values (
add_task_assignment__task_id,
add_task_assignment__party_id
);
return 0;
end;' language 'plpgsql';
-- function begin_task_action
create or replace function workflow_case__begin_task_action (integer,varchar,varchar,integer,varchar)
returns integer as '
declare
begin_task_action__task_id alias for $1;
begin_task_action__action alias for $2;
begin_task_action__action_ip alias for $3;
begin_task_action__user_id alias for $4;
begin_task_action__msg alias for $5; -- default null
v_state varchar;
v_journal_id integer;
v_case_id integer;
v_transition_name varchar;
v_num_rows integer;
begin
select state into v_state
from wf_tasks
where task_id = begin_task_action__task_id;
if begin_task_action__action = ''start'' then
if v_state != ''enabled'' then
raise EXCEPTION ''-20000: Task is in state "%", but it must be in state "enabled" to be started.'', v_state;
end if;
select case when count(*) = 0 then 0 else 1 end into v_num_rows
from wf_user_tasks
where task_id = begin_task_action__task_id
and user_id = begin_task_action__user_id;
if v_num_rows = 0 then
raise EXCEPTION ''-20000: You are not assigned to this task.'';
end if;
else if begin_task_action__action = ''finish'' or begin_task_action__action = ''cancel'' then
if v_state = ''started'' then
/* Is this user the holding user? */
select case when count(*) = 0 then 0 else 1 end into v_num_rows
from wf_tasks
where task_id = begin_task_action__task_id
and holding_user = begin_task_action__user_id;
if v_num_rows = 0 then
raise EXCEPTION ''-20000: You are not the user currently working on this task.'';
end if;
else if v_state = ''enabled'' then
if begin_task_action__action = ''cancel'' then
raise EXCEPTION ''-20000: You can only cancel a task in state "started", but this task is in state "%"'', v_state;
end if;
/* Is this user assigned to this task? */
select case when count(*) = 0 then 0 else 1 end into v_num_rows
from wf_user_tasks
where task_id = begin_task_action__task_id
and user_id = begin_task_action__user_id;
if v_num_rows = 0 then
raise EXCEPTION ''-20000: You are not assigned to this task.'';
end if;
/* This task is finished without an explicit start.
* Store the user as the holding_user */
update wf_tasks
set holding_user = begin_task_action__user_id
where task_id = begin_task_action__task_id;
else
raise EXCEPTION ''-20000: Task is in state "%", but it must be in state "enabled" or "started" to be finished'', v_state;
end if; end if;
else if begin_task_action__action = ''comment'' then
-- We currently allow anyone to comment on a task
-- (need this line because PL/SQL does not like empty if blocks)
v_num_rows := 0;
end if; end if; end if;
select t.case_id, tr.transition_name into v_case_id, v_transition_name
from wf_tasks t,
wf_transitions tr
where t.task_id = begin_task_action__task_id
and tr.workflow_key = t.workflow_key
and tr.transition_key = t.transition_key;
/* Insert a journal entry */
v_journal_id := journal_entry__new (
null,
v_case_id,
''task '' || begin_task_action__task_id || '' '' || begin_task_action__action,
v_transition_name || '' '' || begin_task_action__action,
now(),
begin_task_action__user_id,
begin_task_action__action_ip,
begin_task_action__msg
);
return v_journal_id;
end;' language 'plpgsql';
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment