[Home] [Help]
PACKAGE BODY: APPS.XTR_WORKFLOW_PKG
Source
1 PACKAGE BODY XTR_WORKFLOW_PKG AS
2 /* $Header: xtrwfpkb.pls 120.3 2011/03/12 20:28:25 nipant ship $*/
3 -- This procedure creates an ad hoc Treasury role
4 FUNCTION CREATE_XTR_ROLES(p_role_users IN VARCHAR2,
5 p_expiration_date IN DATE) RETURN VARCHAR2
6 IS
7 l_wf_sequence NUMBER;
8 l_role_name VARCHAR2(60);
9 l_role_display_name VARCHAR2(60);
10
11 BEGIN
12 select XTR_ROLES_S.nextval
13 into l_wf_sequence
14 from dual;
15
16 l_role_name := 'XTR'||to_char(l_wf_sequence);
17 l_role_display_name := 'XTR'||to_char(l_wf_sequence);
18
19 wf_directory.CreateAdHocRole(l_role_name,
20 l_role_display_name,
21 null, -- defaults to user setting language
22 null, -- defaults to user setting territory
23 null,
24 'QUERY',
25 p_role_users,
26 null, -- no email
27 null, -- no fax
28 'ACTIVE',
29 p_expiration_date);
30 return l_role_name;
31 END CREATE_XTR_ROLES;
32
33 PROCEDURE START_WORKFLOW(p_process IN VARCHAR2,
34 p_owner IN VARCHAR2,
35 p_deal_no IN NUMBER,
36 p_trans_no IN NUMBER,
37 p_deal_type IN VARCHAR2,
38 p_log_id IN NUMBER,
39 p_varnum_1 IN NUMBER,
40 p_varnum_2 IN NUMBER,
41 p_varchar_1 IN VARCHAR2,
42 p_varchar_2 IN VARCHAR2,
43 p_vardate_1 IN DATE,
44 p_vardate_2 IN DATE)
45 IS
46 l_role_name VARCHAR2(60);
47 l_user_list VARCHAR2(3000);
48 l_user_name FND_USER.USER_NAME%type;
49
50 -- Cursor used for IG
51 cursor cur_notify_users_ig is
52 select fu.USER_NAME, xwf.AMOUNT,xle.EXCEEDED_BY_AMOUNT
53 from XTR_WF_USER_ROLES xwf,
54 XTR_INTERGROUP_TRANSFERS_V xds,
55 XTR_LIMIT_EXCESS_LOG_V xle,
56 FND_USER fu
57 where xwf.ROLE_NAME = 'XTR_LIMITS_NOTIFICATION'
58 and xds.DEAL_NUMBER = p_deal_no
59 and xds.TRANSACTION_NUMBER = p_trans_no
60 and xle.LOG_ID = p_log_id
61 and fu.USER_ID = xwf.USER_ID
62 and fu.start_date <= trunc(sysdate)
63 and nvl(fu.end_date, sysdate+1) >= trunc(sysdate)
64 and nvl(xwf.COMPANY, xds.COMPANY_CODE) = xds.COMPANY_CODE
65 and nvl(xwf.PORTFOLIO, xds.PORTFOLIO) = xds.PORTFOLIO
66 and nvl(xwf.DEAL_TYPE, xds.DEAL_TYPE) = xds.DEAL_TYPE
67 and nvl(xwf.PRODUCT_TYPE, xds.PRODUCT_TYPE) = xds.PRODUCT_TYPE
68 and nvl(xwf.CPARTY, xds.PARTY_CODE) = xds.PARTY_CODE
69 and nvl(xwf.LIMIT_CHECK_TYPE, xle.LIMIT_CHECK_TYPE) = xle.LIMIT_CHECK_TYPE
70 order by fu.USER_NAME, xwf.PRIORITY,nvl(xle.EXCEEDED_BY_AMOUNT,0) desc;
71
72
73 -- Cursor used for ONC
74 cursor cur_notify_users_onc is
75 select fu.USER_NAME, xwf.AMOUNT,xle.EXCEEDED_BY_AMOUNT
76 from XTR_WF_USER_ROLES xwf,
77 XTR_ROLLOVER_TRANSACTIONS_V xds,
78 XTR_LIMIT_EXCESS_LOG_V xle,
79 FND_USER fu
80 where xwf.ROLE_NAME = 'XTR_LIMITS_NOTIFICATION'
81 and xds.DEAL_NUMBER = p_deal_no
82 and xds.TRANSACTION_NUMBER = p_trans_no
83 and xle.LOG_ID = p_log_id
84 and fu.USER_ID = xwf.USER_ID
85 and fu.start_date <= trunc(sysdate)
86 and nvl(fu.end_date, sysdate+1) >= trunc(sysdate)
87 and nvl(xwf.COMPANY, xds.COMPANY_CODE) = xds.COMPANY_CODE
88 and nvl(xwf.PORTFOLIO, xds.PORTFOLIO_CODE) = xds.PORTFOLIO_CODE
89 and nvl(xwf.DEAL_TYPE, xds.DEAL_TYPE) = xds.DEAL_TYPE
90 and nvl(xwf.DEAL_SUBTYPE, xds.DEAL_SUBTYPE) = xds.DEAL_SUBTYPE
91 and nvl(xwf.PRODUCT_TYPE, xds.PRODUCT_TYPE) = xds.PRODUCT_TYPE
92 and nvl(xwf.CPARTY, xds.CPARTY_CODE) = xds.CPARTY_CODE
93 and nvl(xwf.DEALER, xds.DEALER_CODE) = xds.DEALER_CODE
94 and nvl(xwf.LIMIT_CHECK_TYPE, xle.LIMIT_CHECK_TYPE) = xle.LIMIT_CHECK_TYPE
95 order by fu.USER_NAME, xwf.PRIORITY,nvl(xle.EXCEEDED_BY_AMOUNT,0) desc;
96
97
98 -- Cursor used for other deal types
99 cursor cur_notify_users_deal is
100 select fu.USER_NAME, xwf.AMOUNT,xle.EXCEEDED_BY_AMOUNT
101 from XTR_WF_USER_ROLES xwf,
102 XTR_DEALS_V xds,
103 XTR_LIMIT_EXCESS_LOG_V xle,
104 FND_USER fu
105 where xwf.ROLE_NAME = 'XTR_LIMITS_NOTIFICATION'
106 and xds.DEAL_NO = p_deal_no
107 and nvl(xds.TRANSACTION_NO,0) = nvl(p_trans_no,0)
108 and xle.LOG_ID = p_log_id
109 and fu.USER_ID = xwf.USER_ID
110 and fu.start_date <= trunc(sysdate)
111 and nvl(fu.end_date, sysdate+1) >= trunc(sysdate)
112 and nvl(xwf.COMPANY, xds.COMPANY_CODE) = xds.COMPANY_CODE
113 and nvl(xwf.PORTFOLIO, xds.PORTFOLIO_CODE) = xds.PORTFOLIO_CODE
114 and nvl(xwf.DEAL_TYPE, xds.DEAL_TYPE) = xds.DEAL_TYPE
115 and nvl(xwf.DEAL_SUBTYPE, xds.DEAL_SUBTYPE) = xds.DEAL_SUBTYPE
116 and nvl(xwf.PRODUCT_TYPE, xds.PRODUCT_TYPE) = xds.PRODUCT_TYPE
117 and nvl(xwf.CPARTY, xds.CPARTY_CODE) = xds.CPARTY_CODE
118 and nvl(xwf.DEALER, xds.DEALER_CODE) = xds.DEALER_CODE
119 and nvl(xwf.LIMIT_CHECK_TYPE, xle.LIMIT_CHECK_TYPE) = xle.LIMIT_CHECK_TYPE
120 order by fu.USER_NAME, xwf.PRIORITY,nvl(xle.EXCEEDED_BY_AMOUNT,0) desc;
121
122 BEGIN
123 l_user_list := ' ';
124 l_role_name := ' ';
125 l_user_name := ' ';
126
127 -- begin user selection for IG deal type
128 if (p_deal_type = 'IG') then
129 for limit_user in cur_notify_users_ig loop
130 if limit_user.user_name <> l_user_name then
131 l_user_name :=limit_user.user_name;
132 if nvl(limit_user.EXCEEDED_BY_AMOUNT,0) >=nvl(limit_user.AMOUNT,0) then
133 if (l_user_list = ' ') then
134 l_user_list := limit_user.user_name;
135 else
136 l_user_list := l_user_list||','||limit_user.user_name;
137 end if;
138 end if;
139 end if;
140 end loop;
141
142 -- begin user selection for ONC deal type
143 elsif (p_deal_type = 'ONC') then
144 for limit_user in cur_notify_users_onc loop
145 if limit_user.user_name <> l_user_name then
146 l_user_name :=limit_user.user_name;
147 if nvl(limit_user.EXCEEDED_BY_AMOUNT,0) >=nvl(limit_user.AMOUNT,0) then
148 if (l_user_list = ' ') then
149 l_user_list := limit_user.user_name;
150 else
151 l_user_list := l_user_list||','||limit_user.user_name;
152 end if;
153 end if;
154 end if;
155 end loop;
156
157 -- begin user selection for other deal types
158 else
159 for limit_user in cur_notify_users_deal loop
160 if limit_user.user_name <> l_user_name then
161 l_user_name :=limit_user.user_name;
162 if nvl(limit_user.EXCEEDED_BY_AMOUNT,0) >=nvl(limit_user.AMOUNT,0) then
163 if (l_user_list = ' ') then
164 l_user_list := limit_user.user_name;
165 else
166 l_user_list := l_user_list||','||limit_user.user_name;
167 end if;
168 end if;
169 end if;
170 end loop;
171
172 end if;
173 -- only start WF if there are users matching the critieria
174 if (l_user_list <> ' ') then
175 l_role_name := CREATE_XTR_ROLES(ltrim(l_user_list),SYSDATE+2);
176 -- begin limits notification
177 if (p_process = 'XTR_LIMITS_NOTIFICATION') then
178 START_LIMITS_NTF(p_process, p_owner, l_role_name, p_log_id);
179 end if;
180 end if;
181
182 END START_WORKFLOW;
183
184 PROCEDURE START_LIMITS_NTF(p_process IN VARCHAR2,
185 p_owner IN VARCHAR2,
186 p_receiver IN VARCHAR2,
187 p_log_id IN NUMBER)
188 IS
189 l_itemkey VARCHAR2(40);
190 l_itemtype VARCHAR2(40) := 'XTRWF';
191 l_userkey VARCHAR2(80);
192 l_wf_sequence NUMBER;
193
194 BEGIN
195 select XTR_WF_S.nextval
196 into l_wf_sequence
197 from dual;
198
199 l_itemkey := to_char(l_wf_sequence);
200 l_userkey := l_itemtype||l_itemkey;
201 wf_engine.CreateProcess(itemtype => l_itemtype,
202 itemkey => l_itemkey,
203 process => p_process);
204 wf_engine.SetItemAttrText(itemtype => l_itemtype,
205 itemkey => l_itemkey,
206 aname => 'XTR_NTF_RECEIVER',
207 avalue => p_receiver);
208 wf_engine.SetItemAttrText(itemtype => l_itemtype,
209 itemkey => l_itemkey,
210 aname => 'XTR_LIMITS_LOG_ID',
211 avalue => p_log_id);
212 wf_engine.StartProcess(itemtype => l_itemtype,
213 itemkey => l_itemkey );
214 EXCEPTION
215 when others then
216 wf_core.context('XTR_WORKFLOW_PKG', 'START_LIMITS_NTF', l_itemtype, l_itemkey);
217 raise;
218
219 END START_LIMITS_NTF;
220
221
222 PROCEDURE LIMITS_BREACHED_DOC(document_id IN VARCHAR2,
223 display_type IN VARCHAR2,
224 document IN OUT NOCOPY VARCHAR2,
225 document_type IN OUT NOCOPY VARCHAR2)
226 IS
227
228 cursor cur_limits_breached(p_log_id IN NUMBER) is
229 select xle.deal_number, xle.transaction_number, decode(xle.exception_type,
230 'EXCEEDED', FND_MESSAGE.GET_STRING('XTR','XTR_2242'), 'WARNING', FND_MESSAGE.GET_STRING('XTR','XTR_2241'), 'NO_AUTHO',
231 FND_MESSAGE.GET_STRING('XTR','XTR_2243'), 'NO_LIMIT', FND_MESSAGE.GET_STRING('XTR','XTR_2244')) as exception_type,
232 decode(xle.exception_type, 'EXCEEDED', 'XTR_2245',
233 'WARNING', 'XTR_2246', 'NO_AUTHO', 'XTR_2247',
234 'NO_LIMIT','XTR_2248') as exception_desc,
235 decode(xle.LIMIT_CHECK_TYPE,
236 'GLOBAL',FND_MESSAGE.GET_STRING('XTR','XTR_2233'),
237 'SOVRN', FND_MESSAGE.GET_STRING('XTR','XTR_2234'),
238 'DLR_DEAL', FND_MESSAGE.GET_STRING('XTR','XTR_2235'),
239 'CPARTY', FND_MESSAGE.GET_STRING('XTR','XTR_2237'),
240 'SETTLE', FND_MESSAGE.GET_STRING('XTR','XTR_2238'),
241 'CCY', FND_MESSAGE.GET_STRING('XTR','XTR_2239'),
242 'GROUP', FND_MESSAGE.GET_STRING('XTR','XTR_2250'),
243 'TIME', FND_MESSAGE.GET_STRING('XTR','XTR_2240') ) as exception_token,
244 xle.limit_code,
245 xle.exceeded_by_amount exceeded_by_amount_dsp,
246 xle.exceeded_on_date exceeded_on_date_dsp,
247 xle.currency, xle.company_code, xle.limit_party,
248 xle.amount_date amount_date_dsp,
249 xle.limiting_amount limiting_amount_dsp,
250 xle.authorised_by, xle.dealer_code, xle.log_id
251 from XTR_LIMIT_EXCESS_LOG_V xle
252 where xle.log_id = p_log_id
253 order by xle.deal_number, xle.transaction_number;
254
255 l_deal_no VARCHAR2(50);
256 l_trans_no VARCHAR2(50);
257 l_exc_type VARCHAR2(50);
258 l_limit_code VARCHAR2(50);
259 l_exc_amount VARCHAR2(50);
260 l_exc_on VARCHAR2(50);
261 l_ccy VARCHAR2(50);
262 l_comp_code VARCHAR2(50);
263 l_limit_party VARCHAR2(50);
264 l_amount_date VARCHAR2(50);
265 l_limit_amount VARCHAR2(50);
266 l_auth_by VARCHAR2(50);
267 l_dealer_code VARCHAR2(50);
268 l_exc_desc_title VARCHAR2(50);
269 l_ccy_code VARCHAR2(15);
270 l_exc_desc VARCHAR2(100);
271
272 BEGIN
273 l_deal_no := FND_MESSAGE.GET_STRING('XTR','XTR_WF_DEAL_NO');
274 l_trans_no := FND_MESSAGE.GET_STRING('XTR','XTR_WF_TRANS_NO');
275 l_exc_type := FND_MESSAGE.GET_STRING('XTR','XTR_WF_EXC_TYPE');
276 l_limit_code := FND_MESSAGE.GET_STRING('XTR','XTR_WF_LIMIT_CODE');
277 l_exc_amount := FND_MESSAGE.GET_STRING('XTR','XTR_WF_EXC_AMOUNT');
278 l_exc_on := FND_MESSAGE.GET_STRING('XTR','XTR_WF_EXC_ON');
279 l_ccy := FND_MESSAGE.GET_STRING('XTR','XTR_WF_CCY');
280 l_comp_code := FND_MESSAGE.GET_STRING('XTR','XTR_WF_COMP_CODE');
281 l_limit_party := FND_MESSAGE.GET_STRING('XTR','XTR_WF_LIMIT_PARTY');
282 l_amount_date := FND_MESSAGE.GET_STRING('XTR','XTR_WF_AMOUNT_DATE');
283 l_limit_amount := FND_MESSAGE.GET_STRING('XTR','XTR_WF_LIMIT_AMOUNT');
284 l_auth_by := FND_MESSAGE.GET_STRING('XTR','XTR_WF_AUTH_BY');
285 l_dealer_code := FND_MESSAGE.GET_STRING('XTR','XTR_WF_DEALER_CODE');
286 l_exc_desc_title := FND_MESSAGE.GET_STRING('XTR', 'XTR_WF_EXC_DESC');
287
288
289 SELECT nvl(param_value,'USD')
290 INTO l_ccy_code
291 FROM xtr_pro_param_v
292 WHERE param_name = 'SYSTEM_FUNCTIONAL_CCY';
293
294 if display_type = 'text/html' then
295 document_type := 'text/html';
296 document :=
297 '<BR><BR><LEFT><TABLE BORDER=0 CELLPADDING=5 CELLSPACING=1 BGCOLOR=#FFFFFF>'||
298 '<TR BGCOLOR=#CCCC99>'||
299 '<TH ALIGN=RIGHT><FONT COLOR=#336699><B>'|| l_deal_no ||'</B></TH>'||
300 '<TH ALIGN=RIGHT><FONT COLOR=#336699><B>'|| l_trans_no || '</B></TH>'||
301 '<TH ALIGN=LEFT><FONT COLOR=#336699><B>' || l_exc_type || '</B></TH>'||
302 '<TH ALIGN=LEFT><FONT COLOR=#336699><B>' || l_exc_desc_title || '</B></TH>'||
303 '<TH ALIGN=LEFT><FONT COLOR=#336699><B>' || l_limit_code || '</B></TH>'||
304 '<TH ALIGN=RIGHT><FONT COLOR=#336699><B>' || l_exc_amount || '</B></TH>'||
305 '<TH ALIGN=LEFT><FONT COLOR=#336699><B>' || l_exc_on || '</B></TH>'||
306 '<TH ALIGN=LEFT><FONT COLOR=#336699><B>' || l_ccy || '</B></TH>'||
307 '<TH ALIGN=LEFT><FONT COLOR=#336699><B>' || l_comp_code || '</B></TH>'||
308 '<TH ALIGN=LEFT><FONT COLOR=#336699><B>' || l_limit_party || '</B></TH>'||
309 '<TH ALIGN=LEFT><FONT COLOR=#336699><B>' || l_amount_date || '</B></TH>'||
310 '<TH ALIGN=RIGHT><FONT COLOR=#336699><B>' || l_limit_amount || '</B></TH>'||
311 '<TH ALIGN=LEFT><FONT COLOR=#336699><B>' || l_auth_by || '</B></TH>'||
312 '<TH ALIGN=LEFT><FONT COLOR=#336699><B>' || l_dealer_code || '</B></TH>'||
313 '</TR>';
314 else
315 document_type := 'text/plain';
316 document :=
317 FND_GLOBAL.NEWLINE||rpad(l_deal_no,28)||
318 rpad(l_trans_no,28)||
319 rpad(l_exc_type,28)||
320 rpad(l_exc_desc_title,28)||
321 rpad(l_limit_code,28)||
322 rpad(l_exc_amount,28)||
323 rpad(l_exc_on,28)||
324 rpad(l_ccy,28)||
325 rpad(l_comp_code,28)||
326 rpad(l_limit_party,28)||
327 rpad(l_amount_date,28)||
328 rpad(l_limit_amount,28)||
329 rpad(l_auth_by,28)||
330 rpad(l_dealer_code,28)||FND_GLOBAL.NEWLINE;
331 end if;
332 for limit_rec in cur_limits_breached(to_number(document_id)) loop
333 FND_MESSAGE.set_name('XTR', limit_rec.exception_desc);
334 FND_MESSAGE.set_token('LIMIT',limit_rec.exception_token );
335 l_exc_desc := FND_MESSAGE.get;
336 if display_type = 'text/html' then
337 document := document||
338 '<TR BGCOLOR=#F7F7E7>'||
339 '<TD ALIGN=RIGHT>'||limit_rec.deal_number||'</TD>'||
340 '<TD ALIGN=RIGHT>'||limit_rec.transaction_number||'</TD>'||
341 '<TD ALIGN=LEFT>'||limit_rec.exception_type||'</TD>'||
342 '<TD ALIGN=LEFT>'||l_exc_desc||'</TD>'||
343 '<TD ALIGN=LEFT>'||limit_rec.limit_code||'</TD>'||
344 '<TD ALIGN=RIGHT>'||TO_CHAR(limit_rec.exceeded_by_amount_dsp,
345 FND_CURRENCY.GET_FORMAT_MASK(l_ccy_code, 30))||'</TD>'||
346 '<TD ALIGN=LEFT NOWRAP>'||FND_DATE.DATE_TO_CHARDATE(dateval =>limit_rec.exceeded_on_date_dsp, calendar_aware=>1)||'</TD>'||
347 '<TD ALIGN=LEFT>'||limit_rec.currency||'</TD>'||
348 '<TD ALIGN=LEFT>'||limit_rec.company_code||'</TD>'||
349 '<TD ALIGN=LEFT>'||limit_rec.limit_party||'</TD>'||
350 '<TD ALIGN=LEFT NOWRAP>'||FND_DATE.DATE_TO_CHARDATE(dateval=>limit_rec.amount_date_dsp,calendar_aware=>1)||'</TD>'||
351 '<TD ALIGN=RIGHT>'||TO_CHAR(limit_rec.limiting_amount_dsp,
352 FND_CURRENCY.GET_FORMAT_MASK(l_ccy_code, 30))||'</TD>'||
353 '<TD ALIGN=LEFT>'||limit_rec.authorised_by||'</TD>'||
354 '<TD ALIGN=LEFT>'||limit_rec.dealer_code||'</TD>'||'</TR>';
355 else
356 document := document||rpad(limit_rec.deal_number,28)||
357 rpad(limit_rec.transaction_number,28)||
358 rpad(limit_rec.exception_type,28)||
359 rpad(l_exc_desc,28)||
360 rpad(limit_rec.limit_code,28)||
361 rpad(TO_CHAR(limit_rec.exceeded_by_amount_dsp,
362 FND_CURRENCY.GET_FORMAT_MASK(l_ccy_code, 30)),28)||
363 rpad(FND_DATE.DATE_TO_CHARDATE(dateval=>limit_rec.exceeded_on_date_dsp,calendar_aware=>1),28)||
364 rpad(limit_rec.currency,28)||
365 rpad(limit_rec.company_code,28)||
366 rpad(limit_rec.limit_party,28)||
367 rpad(FND_DATE.DATE_TO_CHARDATE(dateval=>limit_rec.amount_date_dsp,calendar_aware=>1),28)||
368 rpad(TO_CHAR(limit_rec.limiting_amount_dsp,
369 FND_CURRENCY.GET_FORMAT_MASK(l_ccy_code, 30)),28)||
370 rpad(limit_rec.authorised_by,28)||
371 rpad(limit_rec.dealer_code,28)||FND_GLOBAL.NEWLINE;
372 end if;
373 end loop;
374 if display_type = 'text/html' then
375 document := document||'</TABLE></LEFT><BR>';
376 end if;
377 EXCEPTION
378 when others then
379 wf_core.context('XTR_WORKFLOW_PKG', 'LIMITS_BREACHED_DOC', document_id, display_type);
380 raise;
381 END LIMITS_BREACHED_DOC;
382
383
384 -- This procedure removes a Treasury User from WF_LOCAL_USERS
385 PROCEDURE DELETE_XTR_USERS(p_name IN VARCHAR2,
386 p_dsp_name IN VARCHAR2,
387 p_email IN VARCHAR2)
388 IS
389
390 BEGIN
391
392 delete from WF_LOCAL_USERS
393 where NAME = p_name
394 and DISPLAY_NAME = p_dsp_name
395 and EMAIL_ADDRESS = p_email;
396
397 delete from WF_LOCAL_USER_ROLES
398 where USER_NAME = p_name
399 and ROLE_ORIG_SYSTEM = 'WF_LOCAL_ROLES';
400
401 END DELETE_XTR_USERS;
402
403 END XTR_WORKFLOW_PKG;
404