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