-- -- workflow_case__remove_task_assignment/3 -- create or replace function workflow_case__remove_task_assignment( integer, integer, boolean ) returns int4 as $$ declare remove_task_assignment__task_id alias for $1; remove_task_assignment__party_id alias for $2; remove_task_assignment__permanent_p alias for $3; v_num_assigned integer; v_case_id integer; v_role_key wf_roles.role_key%TYPE; v_workflow_key varchar; v_transition_key varchar; v_context_key varchar; callback_rec record; begin -- get some information select ta.case_id, ta.transition_key, tr.role_key, ta.workflow_key, c.context_key into v_case_id, v_transition_key, v_role_key, v_workflow_key, v_context_key from wf_tasks ta, wf_transitions tr, wf_cases c where ta.task_id = remove_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 remove_task_assignment__permanent_p = 't' then perform workflow_case__remove_manual_assignment ( v_case_id, v_role_key, remove_task_assignment__party_id ); end if; -- now delete the row delete from wf_task_assignments where task_id = remove_task_assignment__task_id and party_id = remove_task_assignment__party_id; -- check if the task now became unassigned select count(*) into v_num_assigned from wf_task_assignments where task_id = remove_task_assignment__task_id; if v_num_assigned > 0 then return 0; end if; -- yup, the task is now unassigned; fire the callback select unassigned_callback, unassigned_custom_arg into callback_rec from wf_context_transition_info where workflow_key = v_workflow_key and context_key = v_context_key and transition_key = v_transition_key; if FOUND then PERFORM workflow_case__execute_unassigned_callback ( callback_rec.unassigned_callback, remove_task_assignment__task_id, callback_rec.unassigned_custom_arg ); end if; return 0; end;$$ language plpgsql;