187 lines
5.5 KiB
SAS
Executable File
187 lines
5.5 KiB
SAS
Executable File
/**
|
|
@file
|
|
@brief send alerts
|
|
@details Send emails to users on review, approve, and/or reject
|
|
|
|
@param alert_event= either SUBMITTED, APPROVED or REJECTED
|
|
@param alert_lib= the library of the table being submitted
|
|
@param alert_ds= the table submitted
|
|
@param dsid= the staging reference for the submitted table
|
|
|
|
<h4> SAS Macros </h4>
|
|
@li mf_getattrn.sas
|
|
@li mf_existds.sas
|
|
@li mf_getuser.sas
|
|
|
|
@version 9.4
|
|
@author 4GL Apps Ltd
|
|
@copyright 4GL Apps Ltd. This code may only be used within Data Controller
|
|
and may not be re-distributed or re-sold without the express permission of
|
|
4GL Apps Ltd.
|
|
|
|
**/
|
|
|
|
|
|
%macro mpe_alerts(alert_event=
|
|
, alert_lib=
|
|
, alert_ds=
|
|
, dsid=
|
|
);
|
|
|
|
/* exit if not configured */
|
|
%global DC_EMAIL_ALERTS;
|
|
%if &DC_EMAIL_ALERTS ne YES %then %do;
|
|
%put DCNOTE: Email alerts are not configured;
|
|
%put DCNOTE: (dc_email_alerts=&dc_email_alerts in &mpelib..mpe_config);
|
|
%return;
|
|
%end;
|
|
|
|
|
|
%let alert_event=%upcase(&alert_event);
|
|
%let alert_lib=%upcase(&alert_lib);
|
|
%let alert_ds=%upcase(&alert_ds);
|
|
%let from_user=%mf_getuser();
|
|
|
|
|
|
/* get users TO which the email should be sent */
|
|
|
|
proc sql noprint;
|
|
create table work.users as select distinct a.alert_user,
|
|
b.user_displayname,
|
|
b.user_email
|
|
from &mpelib..mpe_alerts
|
|
(where=(&dc_dttmtfmt. lt tx_to)) a
|
|
left join &mpelib..mpe_emails
|
|
(where=(&dc_dttmtfmt. lt tx_to)) b
|
|
on upcase(trim(a.alert_user))=upcase(trim(b.user_name))
|
|
where a.alert_event in ("&alert_event","*ALL*")
|
|
and a.alert_lib in ("&alert_lib","*ALL*")
|
|
and a.alert_ds in ("&alert_ds","*ALL*");
|
|
|
|
/* ensure the submitter is included on the email */
|
|
%local isThere userdisp user_eml;
|
|
%let isThere=0;
|
|
select count(*) into: isThere from &syslast where alert_user="&from_user";
|
|
%if &isThere=0 %then %do;
|
|
select user_displayname, user_email
|
|
into: userdisp trimmed, :user_eml trimmed
|
|
from &mpelib..mpe_emails
|
|
where &dc_dttmtfmt. lt tx_to
|
|
and user_name="&from_user";
|
|
insert into work.users
|
|
set alert_user="&from_user"
|
|
,user_displayname="&userdisp"
|
|
,user_email="&user_eml";
|
|
%end;
|
|
|
|
|
|
/* if no email / displayname is provided, then extract from metadata */
|
|
data work.emails;
|
|
set work.users;
|
|
length emailuri uri text $256; call missing(emailuri,uri); drop emailuri uri;
|
|
|
|
/* get displayname */
|
|
text=cats("omsobj:Person?@Name='",alert_user,"'");
|
|
if metadata_getnobj(text,1,uri)<=0 then do;
|
|
putlog "DCWARN: &from_user not found";
|
|
return;
|
|
end;
|
|
else if user_displayname = '' then do;
|
|
if metadata_getattr(uri,'DisplayName',user_displayname)<0 then do;
|
|
putlog 'DCWARN: strange err, no displayname attribute of user URI';
|
|
end;
|
|
end;
|
|
|
|
if index(user_email,'@') then return;
|
|
/* get email from metadata if not in input table */
|
|
if metadata_getnasn(uri,"EmailAddresses",1,emailuri)<=0 then do;
|
|
putlog "DCWARN: " alert_user " has no emails in MPE_EMAILS or metadata!";
|
|
if metadata_getattr(emailuri,"Address",user_email)<0 then do;
|
|
putlog 'DCWARN: Unexpected error! Valid emailURI but no email. Weird.';
|
|
end;
|
|
end;
|
|
/* only keep valid emails */
|
|
if index(user_email,'@') ;
|
|
/* dump contents for debugging */
|
|
if _n_<21 then putlog (_all_)(=);
|
|
run;
|
|
|
|
%local emails;
|
|
proc sql noprint;
|
|
select quote(trim(user_email)) into: emails separated by ' ' from work.emails;
|
|
|
|
/* exit if nobody to email */
|
|
%if %mf_getattrn(emails,NLOBS)=0 %then %do;
|
|
%put NOTE: No alerts configured (mpe_alerts.sas);
|
|
%return;
|
|
%end;
|
|
|
|
/* display email options */
|
|
data _null_;
|
|
set sashelp.voption(where=(group='EMAIL'));
|
|
put optname '=' setting;
|
|
run;
|
|
|
|
filename __out email (&emails)
|
|
subject="Table &alert_lib..&alert_ds has been &alert_event";
|
|
|
|
%local SUBMITTED_TXT;
|
|
%if &alert_event=SUBMITTED %then %do;
|
|
data _null_;
|
|
set &mpelib..mpe_submit;
|
|
where table_id="&dsid" and submit_status_cd='SUBMITTED';
|
|
call symputx('SUBMITTED_TXT',submitted_reason_txt,'l');
|
|
run;
|
|
data _null_;
|
|
File __out lrecl=32000;
|
|
put 'Dear user,';
|
|
put ' ';
|
|
put "Please be advised that a change to table &alert_lib..&alert_ds has "
|
|
"been proposed by &from_user on the '&syshostname' SAS server.";
|
|
put " ";
|
|
length txt $2048;
|
|
txt=symget('SUBMITTED_TXT');
|
|
put "Reason provided: " txt;
|
|
put " ";
|
|
put "This is an automated email by Data Controller for SAS. For "
|
|
"documentation, please visit https://docs.datacontroller.io";
|
|
run;
|
|
%end;
|
|
%else %if &alert_event=APPROVED %then %do;
|
|
/* there is no approval message */
|
|
data _null_;
|
|
File __out lrecl=32000;
|
|
put 'Dear user,';
|
|
put ' ';
|
|
put "Please be advised that a change to table &alert_lib..&alert_ds has "
|
|
"been approved by &from_user on the '&syshostname' SAS server.";
|
|
put " ";
|
|
put "This is an automated email by Data Controller for SAS. For "
|
|
"documentation, please visit https://docs.datacontroller.io";
|
|
run;
|
|
%end;
|
|
%else %if &alert_event=REJECTED %then %do;
|
|
data _null_;
|
|
set &mpelib..mpe_review;
|
|
where table_id="&dsid" and review_status_id='REJECTED';
|
|
call symputx('REVIEW_REASON_TXT',REVIEW_REASON_TXT,'l');
|
|
run;
|
|
data _null_;
|
|
File __out lrecl=32000;
|
|
put 'Dear user,';
|
|
put ' ';
|
|
put "Please be advised that a change to table &alert_lib..&alert_ds has "
|
|
"been rejected by &from_user on the '&syshostname' SAS server.";
|
|
put " ";
|
|
length txt $2048;
|
|
txt=symget('REVIEW_REASON_TXT');
|
|
put "Reason provided: " txt;
|
|
put " ";
|
|
put "This is an automated email by Data Controller for SAS. For "
|
|
"documentation, please visit https://docs.datacontroller.io";
|
|
run;
|
|
%end;
|
|
|
|
filename __out clear;
|
|
|
|
%mend mpe_alerts ; |