-- acs-mail-nt-create.sql
--
-- replicate basic functionality of acs-notifications in acs-mail
-- This will make acs-notifications obsolete and aggregate
--   all mail and alert functions into acs-mail
--
-- ported from PG to oracle
--
-- @author Vinod Kurup (vkurup@massmed.org)
-- @creation-date 2001-08-04
-- @cvs-id $Id: acs-mail-nt-create.sql,v 1.9 2004/03/12 18:48:50 jeffd Exp $

create or replace package acs_mail_nt
as

-- /** acs_mail_nt.post_request
--     * Post a notification request
--     * A new CR item will be created and inserted into an acs_mail_body
--     * This acs_mail_body will then be queued.
--     * When tcl proc 'acs_mail_process_queue' gets run (every 15 min),
--       this message will be sent via ns_sendmail
--     * original nt.post_request by Stanislav Freidin 
--
--    @author Vinod Kurup
--    @param party_from    The id of the sending party
--    @param party_to      The id of the sending party
--    @param expand_group  part of old nt API - no longer supported
--    @param subject       A one-line subject for the message
--    @param message       The body of the message
--    @param max_retries   part of old nt API - no longer supported
--    @return The id of the new request
-- */

 function post_request (
	party_from		in parties.party_id%TYPE,
	party_to		in parties.party_id%TYPE,
	expand_group	in char				default 'f',
	subject			in acs_mail_bodies.header_subject%TYPE,
	message			in varchar2,
	max_retries		in integer			default 0,
	package_id		in acs_objects.package_id%TYPE	default null
 ) return acs_mail_queue_messages.message_id%TYPE;

-- /** acs_mail_nt.cancel_request
--    * Cancel a notification request
--    * Original author: Stanislav Freidin
--
--    @author Vinod Kurup
--    @param request_id    Id of the request to cancel
-- */

 procedure cancel_request (
	message_id		in acs_mail_queue_messages.message_id%TYPE
 );

-- /** acs_mail_nt.expand_requests
--     * This was part of the nt package, but is no longer relevant
--     * There is no replacement
--
--		@author Vinod Kurup
-- */

 procedure expand_requests;

-- /** acs_mail_nt.update_requests
--     * This was part of the nt package, but is no longer relevant
--     * There is no replacement
--
--		@author Vinod Kurup
-- */

 procedure update_requests;

-- /** acs_mail_nt.process_queue
--     * This was part of the nt package, but is no longer relevant
--     * Instead use the tcl proc: acs_mail_process_queue
--
--		@author Vinod Kurup
-- */

 procedure process_queue (
	host			in varchar2,
	port			in integer			default 25
 );

-- /** acs_mail_nt.schedule_process
--     * This was part of the nt package, but is no longer relevant
--	   * Instead, use ad_schedule_proc to schedule 
--       the tcl proc acs_mail_process_queue
--     * Note: this is already done in a default install
--       See packages/acs-mail/tcl/acs-mail-init.tcl
--
--		@author Vinod Kurup
-- */

 procedure schedule_process (
	interval		in number,
	host			in varchar2,
	port			in integer			default 25
 );

end acs_mail_nt;
/
show errors


create or replace package body acs_mail_nt
as

 function post_request (
	party_from		in parties.party_id%TYPE,
	party_to		in parties.party_id%TYPE,
	expand_group	in char				default 'f',
	subject			in acs_mail_bodies.header_subject%TYPE,
	message			in varchar2,
	max_retries		in integer			default 0,
	package_id		in acs_objects.package_id%TYPE	default null
 ) return acs_mail_queue_messages.message_id%TYPE
 is
	cursor c_expanded_cur is 
		   select email from parties p 
			where p.party_id in (select member_id from group_approved_member_map 
								where group_id = party_to);
	c_request_row	c_expanded_cur%ROWTYPE;
	v_header_from	acs_mail_bodies.header_from%TYPE;
	v_header_to		acs_mail_bodies.header_to%TYPE;
	v_body_id		acs_mail_bodies.body_id%TYPE;
	v_item_id		cr_items.item_id%TYPE;
	v_revision_id	cr_revisions.revision_id%TYPE;
	v_message_id	acs_mail_queue_messages.message_id%TYPE;
	v_creation_user	acs_objects.creation_user%TYPE;
 begin
	if max_retries <> 0 then
	   raise_application_error(-20000,
			'max_retries parameter not implemented.'
		);
	end if;

	-- get the sender email address
	select max(email) into v_header_from from parties where party_id = party_from;

	-- if sender address is null, then use site default OutgoingSender
	if v_header_from is null then
	   	select apm.get_value(package_id, 'OutgoingSender') into v_header_from
		from apm_packages where package_key='acs-kernel';
	end if;

	-- make sure that this party is in users table. If not, let creation_user
	-- be null to prevent integrity constraint violations on acs_objects
	select max(user_id) into v_creation_user 
      from users where user_id = party_from;

	-- get the recipient email address
	select max(email) into v_header_to from parties where party_id = party_to;

	-- do not let any of these addresses be null
	if v_header_from is null or v_header_to is null then
	   raise_application_error(-20000,
			'acs_mail_nt: cannot sent email to blank address or from blank address.'
	   );
	end if;

	-- create a mail body with empty content

	v_body_id := acs_mail_body.new (
		body_from => party_from,
		body_date => sysdate,
		header_subject => subject,
		creation_user => v_creation_user,
		package_id => package_id
	);

	-- create a CR item to stick message into
	-- for oracle, we need to stick it in a blob

	v_item_id := content_item.new (
		name  => 'acs-mail message' || v_body_id,	
        	title => subject,
        	text  => message,
		package_id => package_id
	);

	-- content_item__new makes a CR revision. We need to get that revision
	-- and make it live

	v_revision_id := content_item.get_latest_revision (v_item_id);
	content_item.set_live_revision ( v_revision_id );

	-- set the content of the message
	acs_mail_body.set_content_object( v_body_id, v_item_id );

	-- queue the message
	v_message_id := acs_mail_queue_message.new (
		body_id       => v_body_id,
		creation_user => v_creation_user,
		package_id    => package_id
	);

	-- now put the message into the outgoing queue
	-- i know this seems redundant, but that's the way it was built.
	-- The idea is that you put a generic message into the main queue
	-- without from or to address, and then insert a copy of the message
	-- into the outgoing_queue with the specific from and to address

    if expand_group = 'f' then
	   insert into acs_mail_queue_outgoing
	   ( message_id, envelope_from, envelope_to )
	   values
	   ( v_message_id, v_header_from, v_header_to );
	else
		-- expand the group
		-- FIXME: need to check if this is a group and if there are members
		--        if not, do we need to notify sender?

		for c_request_row in c_expanded_cur loop
			insert into acs_mail_queue_outgoing
			( message_id, envelope_from, envelope_to ) 
			values 
			( v_message_id, v_header_from, c_request_row.email );
		end loop;
	end if;

	return v_message_id;
 end post_request;

 procedure cancel_request (
	message_id		in acs_mail_queue_messages.message_id%TYPE
 ) 
 is
 begin
	acs_mail_queue_message.del ( message_id );
 end cancel_request;

 procedure expand_requests
 is
 begin
   raise_application_error(-20000,
		'Procedure expand_requests no longer supported.'
      );
 end expand_requests;

 procedure update_requests 
 is
 begin
	raise_application_error(-20000, 
		'Procedure no longer supported.'
	);
 end update_requests;

 procedure schedule_process (
	interval		in number,
	host			in varchar2,
	port			in integer			default 25
 ) 
 is
 begin
	raise_application_error(-20000,
		'Procedure no longer supported - see packages/acs-mail/sql/oracle/acs-mail-nt-create.sql.'
	);
 end schedule_process;

 procedure process_queue (
	host			in varchar2,
	port			in integer			default 25
 ) 
 is
 begin
	raise_application_error(-20000,
		'Procedure no longer supported - see packages/acs-mail/sql/oracle/acs-mail-nt-create.sql.'
	);
 end process_queue;

end acs_mail_nt;
/
show errors

