-- -- workflow_case__begin_task_action/5 -- create or replace function workflow_case__begin_task_action( integer, character varying, character varying, integer, character varying ) returns int4 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;