--
-- workflow_case__set_task_assignments/3
--
create or replace function workflow_case__set_task_assignments(
  integer,
  character varying,
  character varying
) returns int4 as $$

declare
  set_task_assignments__task_id                alias for $1;  
  set_task_assignments__callback               alias for $2;  
  set_task_assignments__custom_arg             alias for $3;  
  v_done_p                                     boolean;
  case_assignment_rec                          record;
  context_assignment_rec                       record;
  v_str                                        text;
begin

        /* Find out who to assign the given task to.
         *
         * 1. See if there are rows in wf_case_assignments.
         * 2. If not, and a callback is defined, execute that.
         * 3. Otherwise, grab the assignment from the workflow context.
         *
         * (We used to use the callback first, but that makes
         *  reassignment of tasks difficult.)
         */

        v_done_p := 'f';
        for case_assignment_rec in  select party_id
              from wf_case_assignments ca, wf_tasks t, wf_transitions tr
             where t.task_id = set_task_assignments__task_id
               and ca.case_id = t.case_id
               and ca.role_key = tr.role_key
               and tr.workflow_key = t.workflow_key
               and tr.transition_key = t.transition_key
        LOOP
            v_done_p := 't';
            PERFORM workflow_case__add_task_assignment (
                set_task_assignments__task_id,
                case_assignment_rec.party_id,
		'f'
            );
        end loop;
        if v_done_p != 't' then

            if set_task_assignments__callback != '' and set_task_assignments__callback is not null then
                v_str := 'select '|| set_task_assignments__callback || '(' || 
                set_task_assignments__task_id || ',' || 
                coalesce(quote_literal(set_task_assignments__custom_arg),'null') || ')';
                execute v_str;
            else
                for context_assignment_rec in  
                    select party_id
		    from wf_context_assignments ca, wf_cases c, wf_tasks t, wf_transitions tr
		    where t.task_id = set_task_assignments__task_id
		    and c.case_id = t.case_id
		    and ca.context_key = c.context_key
		    and ca.workflow_key = t.workflow_key
		    and ca.role_key = tr.role_key
		    and tr.workflow_key = t.workflow_key
		    and tr.transition_key = t.transition_key
                LOOP
                    PERFORM workflow_case__add_task_assignment (
                        set_task_assignments__task_id,
                        context_assignment_rec.party_id,
			'f'
                    );
                end LOOP;
            end if;
        end if;

        return 0; 
end;$$ language plpgsql;