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

declare
  consume_token__case_id                alias for $1;  
  consume_token__place_key              alias for $2;  
  consume_token__journal_id             alias for $3;  
  consume_token__task_id                alias for $4;  -- default null  
begin
        if consume_token__task_id is null then
            update wf_tokens
            set    state = 'consumed',
                   consumed_date = now(),
                   consumed_journal_id = consume_token__journal_id
            where  token_id = (select token_id 
                                 from wf_tokens 
                                where case_id = consume_token__case_id
                                  and place_key = consume_token__place_key
                                  and state = 'free'
                                limit 1);
        else
            update wf_tokens
            set    state = 'consumed',
                   consumed_date = now(),
                   consumed_journal_id = consume_token__journal_id
            where  case_id = consume_token__case_id
            and    place_key = consume_token__place_key
            and    state = 'locked'
            and    locked_task_id = consume_token__task_id;
        end if;

        return 0; 
end;$$ language plpgsql;