-- Procedural database code for the workflow package, a package in the OpenACS system. -- -- @author Lars Pind (lars@collaboraid.biz) -- @author Peter Marklund (peter@collaboraid.biz) -- -- This is free software distributed under the terms of the GNU Public -- License. Full text of the license is available from the GNU Project: -- http://www.fsf.org/copyleft/gpl.html --------------------------------- -- Workflow level, Generic Model --------------------------------- create or replace package workflow_case_pkg as function get_pretty_state( workflow_short_name in varchar, object_id in integer ) return varchar; function del( delete_case_id in integer ) return integer; end workflow_case_pkg; / show errors create or replace package body workflow_case_pkg as function get_pretty_state( workflow_short_name in varchar, object_id in integer ) return varchar is v_state_pretty varchar(4000); v_object_id integer; begin v_object_id := object_id; select s.pretty_name into v_state_pretty from workflows w, workflow_cases c, workflow_case_fsm cfsm, workflow_fsm_states s where w.short_name = workflow_short_name and c.object_id = v_object_id and c.workflow_id = w.workflow_id and cfsm.case_id = c.case_id and s.state_id = cfsm.current_state; return v_state_pretty; end get_pretty_state; function del( delete_case_id in integer ) return integer is begin -- All workflow data cascades from the case id delete from workflow_cases where case_id = workflow_case_pkg.del.delete_case_id; return 0; end del; end workflow_case_pkg; / show errors create or replace package workflow as function del( delete_workflow_id in integer ) return integer; function new( short_name in varchar, pretty_name in varchar, package_key in varchar, object_id in integer, object_type in varchar, creation_user in integer, creation_ip in varchar, context_id in integer ) return integer; end workflow; / show errors create or replace package body workflow as function del( delete_workflow_id in integer ) return integer is foo integer; begin -- Delete all cases first for rec in (select case_id from workflow_cases where workflow_id = delete_workflow_id) loop foo := workflow_case_pkg.del(rec.case_id); end loop; acs_object.del(delete_workflow_id); return 0; end del; -- Function for creating a workflow function new( short_name in varchar, pretty_name in varchar, package_key in varchar, object_id in integer, object_type in varchar, creation_user in integer, creation_ip in varchar, context_id in integer ) return integer is v_workflow_id integer; begin -- Instantiate the ACS Object super type with auditing info v_workflow_id := acs_object.new( object_id => null, object_type => 'workflow_lite', creation_date => sysdate(), creation_user => creation_user, creation_ip => creation_ip, context_id => context_id ); -- Insert workflow specific info into the workflows table insert into workflows (workflow_id, short_name, pretty_name, package_key, object_id, object_type) values (v_workflow_id, short_name, pretty_name, package_key, object_id, object_type); return v_workflow_id; end new; end workflow; / show errors create or replace package workflow_case_log_entry as function new( entry_id in integer, case_id in integer, action_id in integer, comment in varchar, comment_mime_type in varchar, creation_user in integer, creation_ip in varchar, content_type in varchar default 'workflow_case_log_entry', package_id in integer ) return integer; end workflow_case_log_entry; / show errors create or replace package body workflow_case_log_entry as function new( entry_id in integer, case_id in integer, action_id in integer, comment in varchar, comment_mime_type in varchar, creation_user in integer, creation_ip in varchar, content_type in varchar default 'workflow_case_log_entry', package_id in integer ) return integer is v_name varchar2(4000); -- XXX aufflick fix this v_action_short_name varchar2(4000); v_action_pretty_past_tense varchar2(4000); v_case_object_id integer; v_item_id integer; v_revision_id integer; v_package_id integer; begin select short_name, pretty_past_tense into v_action_short_name, v_action_pretty_past_tense from workflow_actions where action_id = new.action_id; -- use case object as context_id select object_id into v_case_object_id from workflow_cases where case_id = new.case_id; -- build the unique name if entry_id is not null then v_item_id := entry_id; else select acs_object_id_seq.nextval into v_item_id from dual; end if; v_name := v_action_short_name || ' ' || v_item_id; -- get the package_id if package_id is not null then v_package_id := package_id; else -- this will return null if the app stores the package_id -- in a package-specific table instead of acs_objects v_package_id := acs_object.package_id(v_case_object_id); end if; v_item_id := content_item.new ( item_id => v_item_id, name => v_name, parent_id => v_case_object_id, title => v_action_pretty_past_tense, creation_date => sysdate(), creation_user => creation_user, context_id => v_case_object_id, creation_ip => creation_ip, is_live => 't', mime_type => comment_mime_type, text => comment, storage_type => 'text', item_subtype => 'content_item', content_type => content_type, package_id => package_id ); -- insert the row into the single-column entry revision table v_revision_id := content_item.get_live_revision (v_item_id); insert into workflow_case_log_rev (entry_rev_id) values (v_revision_id); -- insert into workflow-case-log -- raise_application_error(-20000, 'about to insert ' || v_item_id || ',' || new.case_id || ',' || new.action_id); insert into workflow_case_log (entry_id, case_id, action_id) values (v_item_id, new.case_id, new.action_id); -- return id of newly created item return v_item_id; end new; end workflow_case_log_entry; / show errors