DBA Data[Home] [Help]

PACKAGE BODY: APPS.PQH_BDGT_REALLOC_UTILITY

Source


1 Package body pqh_bdgt_realloc_utility as
2 /* $Header: pqbreutl.pkb 120.2 2006/02/03 14:18:03 deenath noship $ */
3 
4 g_package  Varchar2(30) := ' pqh_bdgt_realloc_utility.';
5 g_warning  Varchar2(30);
6 --
7 ---------------------------get_entity_name-----------------------------
8 --
9 
10 FUNCTION get_entity_name
11 (
12  p_entity_id              IN    pqh_bdgt_pool_realloctions.entity_id%TYPE,
13  p_entity_type            IN    pqh_budget_pools.entity_type%TYPE
14 )
15 RETURN  VARCHAR IS
16 /*
17   This function will return the Entity Name.
18 */
19 
20 BEGIN
21 
22    If p_entity_type = 'POSITION' then
23       return(hr_general. DECODE_POSITION_LATEST_NAME (p_entity_id ));
24    elsif p_entity_type = 'JOB' then
25      return(hr_general.DECODE_JOB(p_entity_id));
26    elsif p_entity_type = 'ORGANIZATION' then
27      return(hr_general.DECODE_ORGANIZATION(p_entity_id ));
28    elsif p_entity_type = 'GRADE' then
29      return(hr_general.DECODE_GRADE(p_entity_id ));
30    end if;
31 END get_entity_name;
32 --
33 ---------------------------GET_PRD_REALLOC_RESERVED_AMT-----------------------------
34 --
35 
36 FUNCTION GET_PRD_REALLOC_RESERVED_AMT
37 (
38  p_budget_period_id       IN    pqh_budget_periods.budget_period_id%TYPE,
39  p_budget_unit_id         IN    pqh_budgets.budget_unit1_id%TYPE,
40  p_transaction_type       IN   pqh_bdgt_pool_realloctions.transaction_type%TYPE DEFAULT 'DD',
41  p_approval_status        IN    varchar2,
42  p_amount_type            IN    varchar2 ,
43  p_entity_type            IN   varchar2,
44  p_entity_id              IN   NUMBER,
45  p_start_date             IN   DATE,
46  p_end_date               IN   DATE
47 )
48 RETURN  NUMBER IS
49 /*
50 
51   This function will return Already Donated or Unapproved Donations amount for
52   Or Received amount a given budged period.
53   For Already Donated : Approval Type is 'A'
54   For Unapproved Donations  : Approval Type is 'P'
55   Default for Approval type is 'P'
56 Transaction Type :
57 ==================
58 DD - Donor Details
59 RD - Receiver Details
60 Default for Transaction Type is 'DD'
61 
62 Amount Type :
63 ==============
64 R - Reallocation Amount
65 RV - Reserved Amount
66 */
67 l_realloc_amt NUMBER := 0;
68 l_reserved_amt NUMBER := 0;
69 /*for donors amount to be picked based on budget period_id */
70 CURSOR csr_donor_amt(p_approval_status IN Varchar2) IS
71   SELECT NVL(sum(trnxamt.reallocation_amt),0), NVL(sum(trnxamt.reserved_amt),0)
72   FROM   pqh_budget_pools fld,
73          pqh_budget_pools trnx,
74          pqh_bdgt_pool_realloctions trnxdtl,
75          pqh_bdgt_pool_realloctions trnxamt
76   WHERE  fld.pool_id = trnx.parent_pool_id
77    AND   fld.approval_status=p_approval_status
78    AND   fld.budget_unit_id = p_budget_unit_id
79    AND   fld.entity_type = p_entity_type
80    AND   trnx.pool_id = trnxdtl.pool_id
81    AND   trnxdtl.reallocation_id = trnxamt.txn_detail_id
82    AND   trnxamt.budget_period_id = p_budget_period_id
83    AND   trnxamt.transaction_type = p_transaction_type;
84 
85 /* for receivers the amount to be picked up based on entity/start date/end date */
86 CURSOR csr_receiver_amt(p_approval_status IN varchar2) IS
87   SELECT NVL(sum(trnxamt.reallocation_amt),0), NVL(sum(trnxamt.reserved_amt),0)
88   FROM   pqh_budget_pools fld,
89          pqh_budget_pools trnx,
90          pqh_bdgt_pool_realloctions trnxdtl,
91          pqh_bdgt_pool_realloctions trnxamt
92   WHERE  fld.pool_id = trnx.parent_pool_id
93    AND   fld.budget_unit_id = p_budget_unit_id
94    AND   fld.entity_type = p_entity_type
95    AND   trnx.pool_id = trnxdtl.pool_id
96    AND   fld.approval_status = p_approval_status
97    AND   trnxdtl.reallocation_id = trnxamt.txn_detail_id
98    AND   trnxamt.transaction_type = p_transaction_type
99    AND   trnxamt.entity_id = p_entity_id
100    AND   NVL(trnxamt.start_date,to_date('31/12/4712','dd/mm/RRRR')) BETWEEN p_start_date and p_end_date
101    AND   NVL(trnxamt.end_date,to_date('31/12/4712','dd/mm/RRRR')) BETWEEN p_start_date and p_end_date;
102 
103 BEGIN
104   -- get unit amt
105   IF p_amount_type = 'RV' THEN
106     IF p_transaction_type = 'DD' THEN
107       OPEN csr_donor_amt('A');
108       FETCH csr_donor_amt INTO l_realloc_amt, l_reserved_amt;
109       CLOSE csr_donor_amt;
110     ELSIF p_transaction_type = 'RD' THEN
111       OPEN csr_receiver_amt('A');
112       FETCH csr_receiver_amt INTO l_realloc_amt, l_reserved_amt;
113       CLOSE csr_receiver_amt;
114     END IF;
115   ELSIF p_amount_type = 'R' THEN
116     IF p_transaction_type = 'DD' THEN
117       OPEN csr_donor_amt(p_approval_status);
118       FETCH csr_donor_amt INTO l_realloc_amt, l_reserved_amt;
119       CLOSE csr_donor_amt;
120     ELSIF p_transaction_type = 'RD' THEN
121       OPEN csr_receiver_amt(p_approval_status);
122       FETCH csr_receiver_amt INTO l_realloc_amt, l_reserved_amt;
123       CLOSE csr_receiver_amt;
124     END IF;
125   END IF;
126   If p_amount_type = 'R' then
127      RETURN l_realloc_amt;
128   Elsif p_amount_type = 'RV' then
129      RETURN l_reserved_amt;
130   End if;
131 
132 EXCEPTION
133   WHEN OTHERS THEN
134     l_realloc_amt := 0;
135     l_reserved_amt := 0;
136     return(0);
137 END GET_PRD_REALLOC_RESERVED_AMT;
138 
139 --
140 ---------------------------GET_DTL_REALLOC_RESERVED_AMT-----------------------------
141 --
142 
143 FUNCTION GET_DTL_REALLOC_RESERVED_AMT
144 (
145  p_budget_detail_id       IN    pqh_budget_details.budget_detail_id%TYPE,
146  p_budget_unit_id         IN    pqh_budgets.budget_unit1_id%TYPE,
147  p_transaction_type       IN   pqh_bdgt_pool_realloctions.transaction_type%TYPE DEFAULT 'DD',
148  p_approval_status        IN    varchar2,
149  p_amount_type            IN    varchar2,
150  p_entity_type            IN    varchar2,
151  p_entity_id              IN    number,
152  p_start_date             IN    date,
153  p_end_date               IN    date
154 )
155 RETURN  NUMBER IS
156 /*
157 
158   This function will return Already Donated or Unapproved Donations amount for
159   Or Received amount of a given budget detail.
160   For Already Donated : Approval Type is 'A'
161   For Unapproved Donations  : Approval Type is 'P'
162   Default for Approval type is 'P'
163 Transaction Type :
164 ==================
165 DD - Donor Details
166 RD - Receiver Details
167 Default for Transaction Type is 'DD'
168 
169 Amount Type :
170 ==============
171 R - Reallocation Amount
172 RV - Reserved Amount
173 */
174 l_period_id NUMBER;
175 
176 l_budget_unit_id NUMBER := p_budget_unit_id;
177 l_transaction_type VARCHAR2(2) := p_transaction_type;
178 l_approval_status VARCHAR2(1) := p_approval_status;
179 l_amount_type VARCHAR2(2) := p_amount_type;
180 
181 
182 CURSOR csr_donor_amt(p_approval_status in varchar2) IS
183   SELECT  NVL(SUM(trnxamt.reallocation_amt),0), NVL(SUM(trnxamt.reserved_amt),0)
184   FROM    pqh_budget_pools fld,
185           pqh_budget_pools trnx,
186           pqh_bdgt_pool_realloctions trnxdtl,
187           pqh_bdgt_pool_realloctions trnxamt
188   WHERE   fld.budget_unit_id = p_budget_unit_id
189     AND   fld.entity_type = p_entity_type
190     AND   fld.approval_status = p_approval_status
191     AND   fld.pool_id = trnx.parent_pool_id
192     AND   trnx.pool_id = trnxdtl.pool_id
193     AND   trnxdtl.budget_detail_id = p_budget_detail_id
194     AND   trnxamt.transaction_type = 'DD'
195     AND   trnxdtl.reallocation_id = trnxamt.txn_detail_id;
196 
197 CURSOR csr_receiver_amt(p_approval_status in varchar2) IS
198   SELECT  NVL(SUM(trnxamt.reallocation_amt),0), NVL(SUM(trnxamt.reserved_amt),0)
199   FROM    pqh_budget_pools fld,
200           pqh_budget_pools trnx,
201           pqh_bdgt_pool_realloctions trnxdtl,
202           pqh_bdgt_pool_realloctions trnxamt
203   WHERE   fld.budget_unit_id = p_budget_unit_id
204     AND   fld.entity_type = p_entity_type
205     AND   fld.approval_status = p_approval_status
206     AND   fld.pool_id = trnx.parent_pool_id
207     AND   trnx.pool_id = trnxdtl.pool_id
208     AND   trnxdtl.reallocation_id = trnxamt.txn_detail_id
209     AND   trnxdtl.entity_id = p_entity_id
210     AND   trnxamt.transaction_type = 'RD'
211     AND   NVL(trnxamt.start_date,TO_DATE('31/12/4712','dd/mm/RRRR')) BETWEEN p_start_date and p_end_date
212     AND   NVL(trnxamt.end_date,TO_DATE('31/12/4712','dd/mm/RRRR')) BETWEEN p_start_date and p_end_date;
213  l_reserved_amt NUMBER := 0;
214  l_realloc_amt  NUMBER := 0;
215 BEGIN
216  IF p_transaction_type = 'DD' THEN
217     IF p_amount_type = 'RV' THEN
218        OPEN csr_donor_amt('A');
219        FETCH csr_donor_amt INTO l_realloc_amt,l_reserved_amt;
220        CLOSE csr_donor_amt;
221     ELSE
222        OPEN csr_donor_amt(p_approval_status);
223        FETCH csr_donor_amt INTO l_realloc_amt,l_reserved_amt;
224        CLOSE csr_donor_amt;
225     END IF;
226  ELSIF p_transaction_type = 'RD' THEN
227    IF p_amount_type = 'RV' THEN
228      OPEN csr_receiver_amt('A');
229      FETCH csr_receiver_amt INTO l_realloc_amt, l_reserved_amt;
230      CLOSE csr_receiver_amt;
231    ELSE
232      OPEN csr_receiver_amt(p_approval_status);
233      FETCH csr_receiver_amt INTO l_realloc_amt, l_reserved_amt;
234      CLOSE csr_receiver_amt;
235    END IF;
236  END IF;
237   If p_amount_type = 'R' then
238      RETURN l_realloc_amt;
239   Elsif p_amount_type = 'RV' then
240      RETURN l_reserved_amt;
241   End if;
242 EXCEPTION
243  WHEN OTHERS THEN
244 
245    return (0);
246 
247 end GET_DTL_REALLOC_RESERVED_AMT;
248 
249 --
250 ---------------------------GET_TRNX_LEVEL_TRANS_AMT-----------------------------
251 --
252 
253 
254 FUNCTION GET_TRNX_LEVEL_TRANS_AMT
255 (
256  p_transaction_id         IN    pqh_bdgt_pool_realloctions.reallocation_id%TYPE,
257  p_txn_amt_balance_flag    IN    varchar2
258 ) RETURN  NUMBER IS
259 
260 /*
261 a) Txn Aount  is donor amount or receiver amount whichever is higher. for a balanced txn it will be same.
262 b) Txn Balancce is donor amt - rcvr amt
263 
264 This function returns Transaction/Reallocation Amount and Transaction Balance Amount for a given Transation Id.
265 
266 
267 Txn Amt Balance_flag :
268 ==========================
269 TA - Transaction Amount
270 TB - Transaction Balance
271 
272 
273 */
274 CURSOR csr_tranaction_amt (p_transaction_type in varchar)
275 IS
276 Select nvl(sum(trnxamt.reallocation_amt),0)
277 From pqh_bdgt_pool_realloctions trnxamt,
278 pqh_bdgt_pool_realloctions trnxdtl
279 where trnxamt.txn_detail_id = trnxdtl.reallocation_id
280 and  trnxdtl.pool_id= p_transaction_id
281 and  trnxamt.transaction_type = p_transaction_type;
282 
283 l_donor_txn_amt number;
284 l_receiver_txn_amt number;
285 l_txn_amt number;
286 
287 begin
288 
289 Open csr_tranaction_amt(p_transaction_type => 'DD');
290 fetch csr_tranaction_amt into l_donor_txn_amt;
291 close csr_tranaction_amt;
292 
293 Open csr_tranaction_amt(p_transaction_type => 'RD');
294 fetch csr_tranaction_amt into l_receiver_txn_amt;
295 close csr_tranaction_amt;
296 
297 If p_txn_amt_balance_flag = 'TA' then
298    if l_donor_txn_amt > l_receiver_txn_amt then
299       return (l_donor_txn_amt);
300    else
301       return (l_receiver_txn_amt);
302    end if;
303 End If;
304 
305 If p_txn_amt_balance_flag = 'TB' then
306          return ((l_donor_txn_amt)-(l_receiver_txn_amt));
307 End If;
308 
309 EXCEPTION
310   WHEN OTHERS THEN
311     l_receiver_txn_amt := 0;
312     l_donor_txn_amt := 0;
313     return l_receiver_txn_amt;
314 End GET_TRNX_LEVEL_TRANS_AMT;
315 --
316 ---------------------------GET_FOLDER_LEVEL_TRANS_AMT-----------------------------
317 --
318 
319 FUNCTION GET_FOLDER_LEVEL_TRANS_AMT
320 (
321  p_folder_id             IN    pqh_budget_pools.pool_id%TYPE
322 ) RETURN  NUMBER IS
323 
324 /* This function returns Transaction Amount for a given Folder Id */
325 
326 CURSOR csr_transaction_ids
327 IS
328 Select pool_id
329 From   pqh_budget_pools
330 Where  parent_pool_id= p_folder_id;
331 
332 l_transaction_id number;
333 l_trans_amt number :=0;
334 l_folder_amt number:=0;
335 
336 Begin
337 
338 open csr_transaction_ids;
339 loop
340   fetch csr_transaction_ids into l_transaction_id;
341   exit when csr_transaction_ids%notfound;
342   if l_transaction_id is not null then
343     l_trans_amt := pqh_bdgt_realloc_utility.GET_TRNX_LEVEL_TRANS_AMT
344                      (p_transaction_id => l_transaction_id
345                      ,p_txn_amt_balance_flag => 'TA');
346     l_folder_amt := l_folder_amt + l_trans_amt;
347 
348   end if;
349  end loop;
350  close csr_transaction_ids;
351  return l_folder_amt;
352 
353 EXCEPTION
354   WHEN OTHERS THEN
355     l_folder_amt := 0;
356     return(l_folder_amt);
357 
358 End GET_FOLDER_LEVEL_TRANS_AMT;
359 
360 FUNCTION GET_TRNX_DNR_REVR_COUNT
361 (
362  p_transaction_id             IN    pqh_bdgt_pool_realloctions.reallocation_id%TYPE,
363  p_transaction_type       IN    pqh_bdgt_pool_realloctions.transaction_type%TYPE
364 ) RETURN  NUMBER IS
365 
366 /*
367 This function retuns the number of Donors/Receivers for a given Transaction
368 Transaction Type :
369 ====================
370 D - Donor
371 R - Receiver
372 
373 */
374 
375 CURSOR csr_dnr_revr_count
376 IS
377 Select count(*)
378 From   pqh_bdgt_pool_realloctions
379 Where  pool_id = p_transaction_id
380 And    transaction_type = p_transaction_type;
381 
382 l_count number;
383 
384 Begin
385 
386 Open csr_dnr_revr_count;
387 fetch csr_dnr_revr_count into l_count;
388 close csr_dnr_revr_count;
389 
390 return (nvl(l_count,0) );
391 
392 EXCEPTION
393   WHEN OTHERS THEN
394     l_count := 0;
395     return l_count;
396 
397 End GET_TRNX_DNR_REVR_COUNT;
398 --
399 ---------------------------CHK_RECV_EXISTS-----------------------------
400 --
401 PROCEDURE CHK_RECV_EXISTS
402 (
403 	p_trans_id	IN	pqh_bdgt_pool_realloctions.pool_id%TYPE,
404 	p_entity_id	IN	pqh_bdgt_pool_realloctions.entity_id%TYPE,
405 	p_detail_id	OUT NOCOPY	pqh_bdgt_pool_realloctions.reallocation_id%TYPE
406 )
407 /*
408 This function checks whether a receiver exists in a Transaction or not
409 If it exists then it returns the reallocation_id else returns -1
410 
411 */
412 IS
413 CURSOR csr_trnx_det
414 IS
415 select transaction_id,entity_id,txn_detail_id
416 from pqh_realloc_txn_details_v
417 where transaction_id = p_trans_id
418 and entity_id =p_entity_id
419 and transaction_type = 'R';
420 csr_trnx_det_rec csr_trnx_det%rowtype;
421 
422 BEGIN
423 
424 OPEN csr_trnx_det;
425 
426 FETCH csr_trnx_det into csr_trnx_det_rec;
427 IF(csr_trnx_det%rowcount=0) THEN
428 p_detail_id := -1;
429 ELSE
430 p_detail_id := csr_trnx_det_rec.txn_detail_id;
431 END IF;
432 CLOSE csr_trnx_det;
433 
434 EXCEPTION
435   WHEN OTHERS THEN
436 p_detail_id := 0;
437 
438 End CHK_RECV_EXISTS;
439 --
440 
441 FUNCTION CHK_APPROVED_FOLDER
442 (
443  p_budget_version_id      IN    pqh_budget_pools.budget_version_id%TYPE,
444  p_budget_unit_id         IN    pqh_budget_pools.budget_unit_id%TYPE,
445  p_entity_type            IN    pqh_budget_pools.entity_type%TYPE,
446  p_approval_status        IN    pqh_budget_pools.approval_status%Type) RETURN  NUMBER IS
447 
448 /*
449 Approval Status :
450 ================
451 A - Approved
452 P - Pending
453 
454 This function returns the Budget Folder is Approved or not for a given
455 Budget Version Id, Budget Unit Id, Entity Type ,Approval Status*/
456 
457 CURSOR csr_approved_folder
458 IS
459 Select count(pool_id)
460 From   pqh_budget_pools
461 Where  budget_version_id = p_budget_version_id
462 And    budget_unit_id = p_budget_unit_id
463 And    entity_type = p_entity_type
464 And    approval_status  = p_approval_status;
465 
466 l_count number;
467 
468 Begin
469    Open csr_approved_folder;
470    Fetch csr_approved_folder into l_count;
471    Close csr_approved_folder;
472 
473    If l_count <> 0  Then
474         return 1;
475    Else
476         return 0;
477    End If;
478 
479 EXCEPTION
480   WHEN OTHERS THEN
481      return 0;
482 End CHK_APPROVED_FOLDER;
483 ---------------------------GET_TRNX_LEVEL_RESERVED_AMT-----------------------------
484 --
485 FUNCTION GET_TRNX_LEVEL_RESERVED_AMT
486 (
487  p_transaction_id         IN    pqh_bdgt_pool_realloctions.reallocation_id%TYPE,
488  p_transaction_type       IN    pqh_bdgt_pool_realloctions.transaction_type%TYPE DEFAULT 'DD'
489 ) RETURN  NUMBER IS
490 
491 /*
492 This function returns Transaction/Reallocation Amount for a given Transation Id.
493 Transaction Type :
494 ====================
495 DD - Donor Details
496 RD - Receiver Details
497 
498 Default is DD
499 */
500 CURSOR csr_tranaction_amt
501 IS
502 Select nvl(sum(trnxamt.reserved_amt),0)
503 From pqh_bdgt_pool_realloctions trnxamt,
504 pqh_bdgt_pool_realloctions trnxdtl
505 where trnxamt.txn_detail_id = trnxdtl.reallocation_id
506 and  trnxdtl.pool_id= p_transaction_id
507 and  trnxamt.transaction_type = p_transaction_type;
508 
509 l_trans_amt number;
510 
511 begin
512 
513 Open csr_tranaction_amt;
514 fetch csr_tranaction_amt into l_trans_amt;
515 close csr_tranaction_amt;
516 
517 return (l_trans_amt );
518 
519 EXCEPTION
520   WHEN OTHERS THEN
521     l_trans_amt := 0;
522     return l_trans_amt;
523 End GET_TRNX_LEVEL_RESERVED_AMT;
524 --
525 FUNCTION GET_LOCATION_CODE
526 (
527  p_entity_code		IN    pqh_budgets.budgeted_entity_cd%TYPE,
528  p_organization_id	IN    pqh_budget_details.organization_id%TYPE,
529  p_business_group_id    IN    hr_organization_units_v.business_group_id%TYPE
530 ) RETURN  VARCHAR
531 IS
532 l_location_code VARCHAR2(30);
533 BEGIN
534  IF(p_entity_code = 'POSITION' OR p_entity_code = 'ORGANIZATION') then
535 	select location_code
536 	into l_location_code
537 	from hr_organization_units_v
538 	where organization_id = p_organization_id;
539   ELSE
540        select location_code
541        into l_location_code
542        from hr_organization_units_v
543        where organization_id= p_business_group_id;
544   END IF;
545   RETURN l_location_code;
546 EXCEPTION
547 WHEN OTHERS THEN
548  l_location_code := null;
549  RETURN l_location_code;
550 END GET_LOCATION_CODE;
551 
552 --
553 PROCEDURE APP_NEXT_USER
554 (p_trans_id              in pqh_routing_history.transaction_id%type,
555 p_tran_cat_id           in pqh_transaction_categories.transaction_category_id%type,
556 p_cur_user_id           in out nocopy fnd_user.user_id%type,
557 p_cur_user_name         in out nocopy fnd_user.user_name%type,
558 p_user_active_role_id   in out nocopy pqh_roles.role_id%type,
559 p_user_active_role_name in out nocopy pqh_roles.role_name%type,
560 p_routing_category_id      out nocopy pqh_routing_categories.routing_category_id%type,
561 p_member_cd                out nocopy pqh_transaction_categories.member_cd%type,
562 p_routing_list_id          out nocopy pqh_routing_lists.routing_list_id%type,
563 p_member_role_id           out nocopy pqh_roles.role_id%type,
564 p_member_user_id           out nocopy fnd_user.user_id%type,
565 p_person_id                out nocopy fnd_user.employee_id%type,
566 p_member_id                out nocopy pqh_routing_list_members.routing_list_member_id%type,
567 p_position_id              out nocopy pqh_position_transactions.position_id%type,
568 p_cur_person_id            out nocopy fnd_user.employee_id%type,
569 p_cur_member_id            out nocopy pqh_routing_list_members.routing_list_member_id%type,
570 p_cur_position_id          out nocopy pqh_position_transactions.position_id%type,
571 p_pos_str_ver_id           out nocopy pqh_routing_history.pos_structure_version_id%type,
572 p_assignment_id            out nocopy per_assignments_f.assignment_id%type,
573 p_cur_assignment_id        out nocopy per_assignments_f.assignment_id%type,
574 p_next_user                out nocopy varchar2,
575 p_next_user_display        out nocopy varchar2,
576 p_status_flag              out nocopy number,
577 p_can_approve              out nocopy number)
578 IS
579 l_can_approve         	BOOLEAN;
580 l_old_member_cd		varchar2(30);
581 l_routing_history_id	NUMBER;
582 l_member_id		NUMBER;
583 l_person_id		NUMBER;
584 l_old_member_id		NUMBER;
585 l_old_routing_list_id	NUMBER;
586 l_position_id		NUMBER;
587 l_old_position_id	NUMBER;
588 l_pos_str_id		NUMBER;
589 l_old_pos_str_id	NUMBER;
590 l_old_pos_str_ver_id	NUMBER;
591 l_assignment_id		NUMBER;
592 l_old_assignment_id	NUMBER;
593 l_history_flag		BOOLEAN;
594 l_range_name		VARCHAR2(80);
595 l_proc varchar2(61) := 'app_next_user';
596 BEGIN
597 hr_utility.set_location('inside'||l_proc,10);
598 pqh_workflow.applicable_next_user
599              (p_trans_id               => p_trans_id
600               ,p_tran_cat_id           => p_tran_cat_id
601               ,p_cur_user_id           => p_cur_user_id
602               ,p_cur_user_name         => p_cur_user_name
603               ,p_user_active_role_id   => p_user_active_role_id
604               ,p_user_active_role_name => p_user_active_role_name
605               ,p_routing_category_id   => p_routing_category_id
606               ,p_member_cd             => p_member_cd
607               ,p_old_member_cd         => l_old_member_cd
608               ,p_routing_history_id    => l_routing_history_id
609               ,p_member_id             => p_member_id
610               ,p_person_id             => p_person_id
611               ,p_old_member_id         => l_old_member_id
612               ,p_routing_list_id       => p_routing_list_id
613               ,p_old_routing_list_id   => l_old_routing_list_id
614               ,p_member_role_id        => p_member_role_id
615               ,p_member_user_id        => p_member_user_id
616               ,p_cur_person_id         => p_cur_person_id
617               ,p_cur_member_id         => p_cur_member_id
618               ,p_position_id           => p_position_id
619               ,p_old_position_id       => l_old_position_id
620               ,p_cur_position_id       => p_cur_position_id
621               ,p_pos_str_id            => l_pos_str_id
622               ,p_old_pos_str_id        => l_old_pos_str_id
623               ,p_pos_str_ver_id        => p_pos_str_ver_id
624               ,p_old_pos_str_ver_id    => l_old_pos_str_ver_id
625               ,p_assignment_id         => p_assignment_id
626               ,p_cur_assignment_id     => p_cur_assignment_id
627               ,p_old_assignment_id     => l_old_assignment_id
628               ,p_status_flag           => p_status_flag
629               ,p_history_flag          => l_history_flag
630               ,p_range_name            => l_range_name
631               ,p_can_approve           => l_can_approve);
632    hr_utility.set_location('status returned is'||p_status_flag,20);
633    if nvl(p_status_flag,0) <> 0 then
634       hr_utility.set_location('error returned',25);
635    else
636       hr_utility.set_location('got the next user ',30);
637       if(l_can_approve) then
638          p_can_approve:=0;
639          hr_utility.set_location('approver yes ',35);
640       else
641          p_can_approve:=1;
642          hr_utility.set_location('approver no',40);
643       end if;
644       hr_utility.set_location('getting user name',50);
645       hr_utility.set_location('member_cd is '||p_member_cd,60);
646       hr_utility.set_location('position_id is '||p_position_id,62);
647       hr_utility.set_location('assignment_id is '||p_assignment_id,64);
648       hr_utility.set_location('user_id is '||p_member_user_id,66);
649       hr_utility.set_location('role_id is '||p_member_role_id,68);
650       FND_NEXT_USER(p_member_cd         => p_member_cd,
651                     p_position_id       => p_position_id,
652                     p_assignment_id     => p_assignment_id,
653                     p_member_role_id    => p_member_role_id,
654                     p_member_user_id    => p_member_user_id,
655                     p_next_name_display => p_next_user_display,
656                     p_next_name	        => p_next_user);
657       hr_utility.set_location('user_name is '||p_next_user,70);
658       hr_utility.set_location('display_name is '||p_next_user_display,75);
659    end if;
660 END APP_NEXT_USER;
661 
662 procedure get_next_user(p_member_cd           in pqh_transaction_categories.member_cd%type,
663 			p_routing_category_id in pqh_routing_categories.routing_category_id%type,
664                         p_tran_cat_id         in pqh_transaction_categories.transaction_category_id%type,
665 			p_trans_id            in pqh_routing_history.transaction_id%type,
666 			p_cur_assignment_id   in per_assignments_f.assignment_id%type,
667 			p_cur_member_id       in pqh_routing_list_members.routing_list_member_id%type,
668 			p_routing_list_id     in pqh_routing_categories.routing_list_id%type,
669 			p_cur_position_id     in pqh_position_transactions.position_id%type,
670 			p_pos_str_ver_id      in per_pos_structure_elements.pos_structure_version_id%type,
671 			p_next_position_id       out nocopy pqh_position_transactions.position_id%type,
672 			p_next_member_id         out nocopy pqh_routing_list_members.routing_list_member_id%type,
673                         p_next_role_id           out nocopy number,
674                         p_next_user_id           out nocopy number,
675 			p_next_assignment_id     out nocopy per_assignments_f.assignment_id%type,
676 			p_status_flag            out nocopy number,
677                         p_next_user              out nocopy varchar2,
678                         p_next_user_display      out nocopy varchar2) is
679 begin
680    pqh_workflow.next_applicable
681                   (p_member_cd           => p_member_cd,
682 	  	   p_routing_category_id => p_routing_category_id,
683                    p_tran_cat_id         => p_tran_cat_id,
684 		   p_trans_id            => p_trans_id,
685 		   p_cur_assignment_id   => p_cur_assignment_id,
686 		   p_cur_member_id       => p_cur_member_id,
687 		   p_routing_list_id     => p_routing_list_id,
688 		   p_cur_position_id     => p_cur_position_id,
689 		   p_pos_str_ver_id      => p_pos_str_ver_id,
690 		   p_next_position_id    => p_next_position_id,
691 		   p_next_member_id      => p_next_member_id,
692                    p_next_role_id        => p_next_role_id,
693                    p_next_user_id        => p_next_user_id,
694 		   p_next_assignment_id  => p_next_assignment_id,
695 		   p_status_flag         => p_status_flag);
696    hr_utility.set_location('getting user name',50);
697    hr_utility.set_location('member_cd is '||p_member_cd,60);
698    hr_utility.set_location('position_id is '||p_next_position_id,62);
699    hr_utility.set_location('assignment_id is '||p_next_assignment_id,64);
700    hr_utility.set_location('user_id is '||p_next_user_id,66);
701    hr_utility.set_location('role_id is '||p_next_role_id,68);
702    FND_NEXT_USER(p_member_cd         => p_member_cd,
703                  p_position_id       => p_next_position_id,
704                  p_assignment_id     => p_next_assignment_id,
705                  p_member_role_id    => p_next_role_id,
706                  p_member_user_id    => p_next_user_id,
707                  p_next_name_display => p_next_user_display,
708                  p_next_name	     => p_next_user);
709    hr_utility.set_location('user_name is '||p_next_user,70);
710 end get_next_user;
711 
712 PROCEDURE FND_NEXT_USER(p_member_cd         IN pqh_transaction_categories.member_cd%type,
713                         p_position_id       IN pqh_position_transactions.position_id%type,
714                         p_assignment_id     IN per_assignments_f.assignment_id%type,
715                         p_member_role_id    IN pqh_roles.role_id%type,
716                         p_member_user_id    IN fnd_user.user_id%type,
717                         p_next_name         OUT NOCOPY VARCHAR,
718                         p_next_name_display OUT NOCOPY VARCHAR) is
719    l_next_name VARCHAR2(240);
720    l_person_id NUMBER;
721 begin
722 IF(p_member_cd = 'R') THEN
723    IF(p_member_user_id is NOT null) THEN
724       select user_name
725       into p_next_name
726       from fnd_user
727       where user_id=p_member_user_id;
728       hr_utility.set_location('user_name is '||p_next_name,10);
729       l_next_name := hr_general.decode_lookup(p_lookup_type => 'PQH_BPR_ROUTING',
730                                               p_lookup_code => 'USER');
731       hr_utility.set_location('prefix is '||l_next_name,20);
732       p_next_name_display := l_next_name ||':'||p_next_name ;
733       hr_utility.set_location('name is '||p_next_name_display,30);
734    ELSIF p_member_role_id is not null then
735       select role_name
736       into p_next_name
737       from pqh_roles
738       where role_id= p_member_role_id;
739       hr_utility.set_location('user_name is '||p_next_name,40);
740       l_next_name := hr_general.decode_lookup(p_lookup_type => 'PQH_BPR_ROUTING',
741                                               p_lookup_code => 'ROLE');
742       hr_utility.set_location('prefix is '||l_next_name,50);
743       p_next_name_display := l_next_name ||':'||p_next_name ;
744       p_next_name         := 'PQH_ROLE:'||p_member_role_id;
745       hr_utility.set_location('name is '||p_next_name_display,60);
746    else
747       hr_utility.set_location('member_cd R but null values',70);
748       p_next_name := null;
749       p_next_name_display := null;
750    END IF;
751 ELSIF (p_member_cd = 'P') THEN
752    select hr_general.DECODE_POSITION_LATEST_NAME (p_position_id)
753    into p_next_name from dual;
754    hr_utility.set_location('user_name is '||p_next_name,80);
755    l_next_name := hr_general.decode_lookup(p_lookup_type => 'PQH_BPR_ROUTING',
756                                            p_lookup_code => 'POSITION');
757    hr_utility.set_location('prefix is '||l_next_name,90);
758    p_next_name_display := l_next_name ||':'||p_next_name ;
759    p_next_name := 'POS:'||p_position_id;
760    hr_utility.set_location('name is '||p_next_name_display,100);
761 ELSIF (p_member_cd = 'S') THEN
762    select person_id into l_person_id
763    from per_assignments
764    where assignment_id  = p_assignment_id;
765    hr_utility.set_location('person_id is '||l_person_id,110);
766    select user_name
767    into p_next_name
768    from fnd_user
769    where employee_id=l_person_id;
770    hr_utility.set_location('user_name is '||p_next_name,120);
771    l_next_name := hr_general.decode_lookup(p_lookup_type => 'PQH_BPR_ROUTING',
772                                            p_lookup_code => 'USER');
773    hr_utility.set_location('prefix is '||l_next_name,130);
774    p_next_name_display := l_next_name ||':'||p_next_name ;
775    hr_utility.set_location('name is '||p_next_name_display,140);
776 ELSE
777    hr_utility.set_location('invalid member_cd',150);
778    p_next_name := null;
779    p_next_name_display := null;
780 END IF;
781 EXCEPTION
782    WHEN OTHERS THEN
783       hr_utility.set_location('data issues',420);
784       p_next_name := null;
785       p_next_name_display := null;
786 END FND_NEXT_USER;
787 
788 -- ----------------------------------------------------------------------------
789 -- |------------------------< apply_transaction >------------------------|
790 -- ----------------------------------------------------------------------------
791 
792 function apply_transaction
793 (  p_transaction_id    in  NUMBER,
794    p_validate_only              in varchar2 default 'NO'
795 ) return varchar2 is
796 
797  l_proc                      varchar2(72) := g_package||'apply_transaction';
798  l_status   varchar2(30);
799  l_return   varchar2(30);
800  l_transaction_category_id NUMBER;
801 
802  Cursor csr_pool_dtls
803  IS  SELECT *
804      FROM   pqh_budget_pools
805      WHERE  pool_id = p_transaction_id;
806  l_pool_rec  csr_pool_dtls%ROWTYPE;
807 BEGIN
808    hr_utility.set_location('Entering '||l_proc,10);
809 --calling routine for enabling multi-message detection --kgowripe
810    hr_multi_message.enable_message_list;
811 --
812    OPEN csr_pool_dtls;
813    FETCH csr_pool_dtls INTO  l_pool_rec;
814    CLOSE csr_pool_dtls;
815    -- Added by krmahade for Bug#3036405
816    l_transaction_category_id := l_pool_rec.wf_transaction_category_id;
817    -- End krmahade
818    hr_utility.set_location('txn_cat is '||l_transaction_category_id||l_proc,12);
819    --Before Applying a Budget Reallocation Transaction, apply all the Business Rules
820    pqh_cbr_engine.apply_rules(p_transaction_type => 'REALLOCATION'
821                              ,p_transaction_id => p_transaction_id
822                              ,p_business_group_id => l_pool_rec.business_group_id
823                              ,p_effective_date => hr_general.effective_date
824                              ,p_status_flag => l_status);
825    hr_utility.set_location('status returned is '||l_status||l_proc,20);
826 
827    IF NVL(l_status,'S') <> 'E'and p_validate_only = 'NO' THEN
828       hr_utility.set_location('for folder approval '||l_proc,22);
829       pqh_budget_pools_api.update_reallocation_folder(p_effective_date=> hr_general.effective_date
830                                                      ,p_folder_id => p_transaction_id
831                                                      ,p_object_version_number=>l_pool_rec.object_version_number
832                                                      ,p_business_group_id => l_pool_rec.business_group_id
833                                                      ,p_approval_status=> 'A'
834                                                      ,p_wf_transaction_category_id => l_pool_rec.wf_transaction_category_id );
835       hr_utility.set_location('folder approved '||l_proc,26);
836   ELSIF l_status = 'E' THEN
837       hr_utility.set_location('error encountered '||l_proc,28);
838       l_return := 'FAILURE';
839       fnd_message.set_name(8302,'PQH_CBR_FAILED_ERROR');
840       fnd_message.raise_error;
841   END IF;
842   -- Addd by KGOWRIPE for fixing bug# 2896852
843   IF NVL(l_status,'S') = 'W'  THEN
844       l_return := 'WARNING';
845       hr_utility.set_location('Warning at '||l_proc,29);
846       /* commented by mvankada for fixing the bug : 293577
847 
848       pqh_wf.set_apply_error(p_transaction_category_id => l_transaction_category_id,
849                              p_transaction_id          => p_transaction_id,
850                              p_apply_error_mesg        => 'PQH_BPR_WARNING',
851                              p_apply_error_num         => 0);
852        */
853        g_warning := 'TRUE';
854   ELSE
855       l_return := 'SUCCESS';
856   END IF;
857 -- end fix for 2896852
858   hr_utility.set_location('Leaving '||l_proc,30);
859   --
860   RETURN l_return;
861   Exception
862 --added by kgowripe
863   when hr_multi_message.error_message_exist then
864     Null;
865 
866 When Others THEN
867 
868    IF SQLERRM IS NOT NULL THEN
869      hr_utility.set_location('setting wf error '||l_proc,40);
870      pqh_wf.set_apply_error(p_transaction_category_id => l_transaction_category_id,
871                             p_transaction_id          => p_transaction_id,
872                             p_apply_error_mesg        => SQLERRM,
873                             p_apply_error_num         => SQLCODE);
874      l_return := 'FAILURE';
875    END IF;
876         --
877    hr_utility.set_location('Leaving '||l_proc,30);
878    return l_return;
879         --
880 End apply_transaction;
881 
882 FUNCTION entity_id
883 ( p_budget_detail_id IN pqh_budget_details.budget_detail_id%TYPE,
884 p_entity_type    IN pqh_budgets.budgeted_entity_cd%TYPE
885 )RETURN NUMBER
886 IS
887 l_entity_id NUMBER :=0;
888 CURSOR csr_details
889 IS
890 select job_id,position_id,grade_id,organization_id
891 from pqh_budget_details
892 where budget_detail_id = p_budget_detail_id;
893 rec_details csr_details%ROWTYPE;
894 BEGIN
895 OPEN csr_details;
896 FETCH csr_details into rec_details;
897    If p_entity_type = 'POSITION' then
898 	l_entity_id := rec_details.position_id;
899    elsif p_entity_type = 'JOB' then
900      l_entity_id := rec_details.job_id;
901    elsif p_entity_type = 'ORGANIZATION' then
902      l_entity_id := rec_details.organization_id;
903    elsif p_entity_type = 'GRADE' then
904      l_entity_id := rec_details.grade_id;
905    else
906      l_entity_id :=0;
907    end if;
908 CLOSE csr_details;
909 	return l_entity_id;
910 EXCEPTION
911   WHEN OTHERS THEN
912   l_entity_id :=0;
913   return l_entity_id;
914 END entity_id;
915 
916 FUNCTION respond_notification (p_transaction_id in number) RETURN varchar2
917 is
918   l_document          varchar2(4000);
919   l_proc              varchar2(61) := g_package||'respond_notification' ;
920   l_folder_name       varchar2(2000);
921   l_unit       varchar2(80);
922   l_entity_desc varchar2(80);
923   l_transaction_status  varchar2(100);
924   cursor csr_pool_dtls is select name,
925                                  hr_general.decode_lookup('PQH_BUDGET_ENTITY',ENTITY_TYPE),
926                       hr_general.decode_shared_type(budget_unit_id),
927                       hr_general.decode_lookup('PQH_REALLOC_TXN_STATUS',approval_status)
928                from pqh_budget_pools
929                where pool_id = p_transaction_id;
930 BEGIN
931   hr_utility.set_location('inside respond notification'||l_proc,10);
932   open csr_pool_dtls;
933   fetch csr_pool_dtls into l_folder_name,l_entity_desc,l_unit,l_transaction_status;
934   close csr_pool_dtls;
935   hr_utility.set_location('pool dtls  fetched   '||l_proc,20);
936   --
937   hr_utility.set_message(8302,'PQH_BPL_WF_RESPOND_NOTICE');
938   hr_utility.set_message_token('FOLDER_NAME',l_folder_name);
939   hr_utility.set_message_token('ENTITY',l_entity_desc);
940   hr_utility.set_message_token('UNIT',l_unit);
941   hr_utility.set_message_token('TRANSACTION_STATUS',l_transaction_status);
942   l_document := hr_utility.get_message;
943   return l_document;
944 exception
945   when others then
946      hr_utility.set_message(8302,'PQH_BPL_WF_RESPOND_FAIL');
947      hr_utility.set_message_token('TRANSACTION_ID',p_transaction_id);
948      l_document := hr_utility.get_message;
949      return l_document;
950 END respond_notification;
951 
952 FUNCTION url_builder(p_transaction_id  in number) Return VARCHAR2 IS
953  l_url   varchar2(1000);
954  l_status  varchar2(30) := 'P';
955  Cursor csr_folder_status IS
956    SELECT business_group_id, NVL(approval_status,'P')
957    FROM   pqh_budget_pools
958   WHERE   pool_id = p_transaction_id;
959  l_business_group_id Number(15);
960  l_proc  varchar2(80) := g_package||'url_builder';
961 BEGIN
962   hr_utility.set_location('Entering '||l_proc,10);
963   OPEN csr_folder_status;
964   FETCH csr_folder_status INTO l_business_group_id,l_status;
965   CLOSE csr_folder_status;
966   l_url := 'JSP:/OA_HTML/OA.jsp?page=/oracle/apps/pqh/budgetreallocation/webui/BprReallocPG'||'&'||'retainAM=Y'||'&'||'P_FolderId='||p_transaction_id||'&'||'fromNotify=Y'||'&'||'approvalStatusFlag='||l_status||'&'||'P_BGId='||l_business_group_id;
967   hr_utility.set_location('URL '||substr(l_url,1,50),15);
968   hr_utility.set_location('URL2 '||substr(l_url,51,100),15);
969   hr_utility.set_location('Leaving '||l_proc,20);
970   RETURN l_url;
971 END url_builder;
972 FUNCTION warning_notification (p_transaction_id in number) RETURN varchar2
973 is
974   l_document varchar2(4000);
975   l_proc     varchar2(61) := g_package||'warning_notification' ;
976   l_folder_name       varchar2(2000);
977   l_unit       varchar2(80);
978   l_entity_desc varchar2(80);
979   l_transaction_status  varchar2(100);
980   cursor csr_pool_dtls is select name,
981                                  hr_general.decode_lookup('PQH_BUDGET_ENTITY',ENTITY_TYPE),
982                       hr_general.decode_shared_type(budget_unit_id),
983                       hr_general.decode_lookup('PQH_REALLOC_TXN_STATUS',approval_status)
984                from pqh_budget_pools
985                where pool_id = p_transaction_id;
986 BEGIN
987   hr_utility.set_location('inside warning notification'||l_proc,10);
988   open csr_pool_dtls;
989   fetch csr_pool_dtls into l_folder_name,l_entity_desc,l_unit,l_transaction_status;
990   close csr_pool_dtls;
991   hr_utility.set_location('pool dtls  fetched   '||l_proc,20);
992   --
993   hr_utility.set_message(8302,'PQH_BPL_WF_WARN_NOTICE');
994   hr_utility.set_message_token('FOLDER_NAME',l_folder_name);
995   hr_utility.set_message_token('ENTITY',l_entity_desc);
996   hr_utility.set_message_token('UNIT',l_unit);
997   hr_utility.set_message_token('TRANSACTION_STATUS',l_transaction_status);
998   l_document := hr_utility.get_message;
999   return l_document;
1000 exception
1001   when others then
1002      hr_utility.set_message(8302,'PQH_BPL_WF_WARN_FAIL');
1003      hr_utility.set_message_token('TRANSACTION_ID',p_transaction_id);
1004      l_document := hr_utility.get_message;
1005      return l_document;
1006 END warning_notification;
1007 FUNCTION reject_notification (p_transaction_id in number) RETURN varchar2
1008 is
1009   l_document varchar2(4000);
1010   l_proc     varchar2(61) := g_package||'reject_notification' ;
1011   l_folder_name       varchar2(2000);
1012   l_unit       varchar2(80);
1013   l_entity_desc varchar2(80);
1014   l_transaction_status  varchar2(100);
1015   cursor csr_pool_dtls is select name,
1016                                  hr_general.decode_lookup('PQH_BUDGET_ENTITY',ENTITY_TYPE),
1017                       hr_general.decode_shared_type(budget_unit_id),
1018                       hr_general.decode_lookup('PQH_REALLOC_TXN_STATUS',approval_status)
1019                from pqh_budget_pools
1020                where pool_id = p_transaction_id;
1021 BEGIN
1022   hr_utility.set_location('Entering'||l_proc,10);
1023   open csr_pool_dtls;
1024   fetch csr_pool_dtls into l_folder_name,l_entity_desc,l_unit,l_transaction_status;
1025   close csr_pool_dtls;
1026   hr_utility.set_location('pool dtls  fetched   '||l_proc,20);
1027   --
1028   hr_utility.set_message(8302,'PQH_BPL_WF_REJECT_NOTICE');
1029   hr_utility.set_message_token('FOLDER_NAME',l_folder_name);
1030   hr_utility.set_message_token('ENTITY',l_entity_desc);
1031   hr_utility.set_message_token('UNIT',l_unit);
1032   hr_utility.set_message_token('TRANSACTION_STATUS',l_transaction_status);
1033   l_document := hr_utility.get_message;
1034   hr_utility.set_location('Leaving'||l_proc,10);
1035   return l_document;
1036 exception
1037   when others then
1038      hr_utility.set_message(8302,'PQH_BPL_WF_REJECT_FAIL');
1039      hr_utility.set_message_token('TRANSACTION_ID',p_transaction_id);
1040      l_document := hr_utility.get_message;
1041 END reject_notification;
1042 FUNCTION apply_notification (p_transaction_id in number) RETURN varchar2
1043 is
1044   l_document varchar2(4000);
1045   l_proc     varchar2(61) := g_package||'apply_notification' ;
1046   l_folder_name       varchar2(2000);
1047   l_unit       varchar2(80);
1048   l_entity_desc varchar2(80);
1049   l_transaction_status  varchar2(100);
1050   cursor csr_pool_dtls is select name,
1051                                  hr_general.decode_lookup('PQH_BUDGET_ENTITY',ENTITY_TYPE),
1052                       hr_general.decode_shared_type(budget_unit_id),
1053                       hr_general.decode_lookup('PQH_REALLOC_TXN_STATUS',approval_status)
1054                from pqh_budget_pools
1055                where pool_id = p_transaction_id;
1056 BEGIN
1057   hr_utility.set_location('Entering'||l_proc,10);
1058   open csr_pool_dtls;
1059   fetch csr_pool_dtls into l_folder_name,l_entity_desc,l_unit,l_transaction_status;
1060   close csr_pool_dtls;
1061   hr_utility.set_location('pool dtls  fetched   '||l_proc,20);
1062   --
1063   hr_utility.set_message(8302,'PQH_BPL_WF_APPLY_NOTICE');
1064   hr_utility.set_message_token('FOLDER_NAME',l_folder_name);
1065   hr_utility.set_message_token('ENTITY',l_entity_desc);
1066   hr_utility.set_message_token('UNIT',l_unit);
1067   hr_utility.set_message_token('TRANSACTION_STATUS',l_transaction_status);
1068   l_document := hr_utility.get_message;
1069   hr_utility.set_location('Leaving'||l_proc,10);
1070   return l_document;
1071 exception
1072   when others then
1073      hr_utility.set_message(8302,'PQH_BPL_WF_APPLY_FAIL');
1074      hr_utility.set_message_token('TRANSACTION_ID',p_transaction_id);
1075      l_document := hr_utility.get_message;
1076 END apply_notification;
1077 
1078 function reject_transaction
1079 (  p_transaction_id    in  NUMBER,
1080    p_validate_only              in varchar2 default 'NO'
1081 ) return varchar2 is
1082 
1083  l_proc                      varchar2(72) := g_package||'reject_transaction';
1084  l_status   varchar2(30);
1085  l_return   varchar2(30);
1086  l_transaction_category_id NUMBER;
1087  l_validate boolean :=false;
1088 --
1089  Cursor csr_pool_dtls
1090  IS  SELECT *
1091      FROM   pqh_budget_pools
1092      WHERE  pool_id = p_transaction_id;
1093  l_pool_rec  csr_pool_dtls%ROWTYPE;
1094 BEGIN
1095    hr_utility.set_location('Entering '||l_proc,10);
1096 --added by kgowripe
1097 hr_multi_message.enable_message_list;
1098 --end changes by kgowripe
1099    OPEN csr_pool_dtls;
1100    FETCH csr_pool_dtls INTO  l_pool_rec;
1101    CLOSE csr_pool_dtls;
1102 
1103    if (p_validate_only = 'YES') then
1104      l_validate := true;
1105    end if;
1106   --
1107   pqh_budget_pools_api.update_reallocation_folder(p_effective_date=> hr_general.effective_date
1108                                                  ,p_folder_id => p_transaction_id
1109                                                  ,p_object_version_number=>l_pool_rec.object_version_number
1110                                                  ,p_business_group_id => l_pool_rec.business_group_id
1111                                                  ,p_approval_status=> 'R'
1112                                                  ,p_wf_transaction_category_id => l_pool_rec.wf_transaction_category_id
1113 ,p_validate => l_validate );
1114 
1115   l_return := 'SUCESS';
1116   hr_utility.set_location('Leaving '||l_proc,30);
1117   --
1118   RETURN l_return;
1119   Exception
1120 --added by kgowripe
1121   when hr_multi_message.error_message_exist then
1122     Null;
1123 
1124   When Others THEN
1125 
1126    IF SQLERRM IS NOT NULL THEN
1127      pqh_wf.set_apply_error(p_transaction_category_id
1128                                                  => l_transaction_category_id,
1129                             p_transaction_id     => p_transaction_id,
1130                             p_apply_error_mesg   => SQLERRM,
1131                             p_apply_error_num    => SQLCODE);
1132      l_return := 'FAILURE';
1133    END IF;
1134         --
1135    hr_utility.set_location('Leaving '||l_proc,30);
1136    return l_return;
1137         --
1138 End reject_transaction;
1139 
1140 
1141 
1142 PROCEDURE notify_bgt_manager_users
1143 (
1144  p_transaction_id number,
1145  p_transaction_name varchar2
1146 ) IS
1147 
1148 /*
1149 This procedure sends notifiction to all users having 'Budget Manager' as role type
1150 */
1151 -- Added by mvankada
1152 -- Bug : 2883516
1153 -- added business_group_id is null condition
1154 CURSOR csr_bgt_manager_rls(l_business_group_id IN number)
1155 IS
1156 Select  role_id,role_name
1157 From pqh_roles
1158 Where role_type_cd = 'BUDGET'
1159 And enable_flag = 'Y'
1160 And(  business_group_id = l_business_group_id
1161 OR business_group_id IS NULL );
1162 
1163 CURSOR csr_bg_id
1164 IS
1165 Select  business_group_id
1166 From pqh_budget_pools
1167 Where pool_id = p_transaction_id;
1168 
1169 Cursor csr_seq_no (l_transaction_category_id IN number)  IS
1170 Select max(substr(item_key,(length(l_transaction_category_id||'-'||p_transaction_id))+2,6) )
1171 From wf_items
1172 Where item_type='PQHGEN'
1173 And item_key like l_transaction_category_id||'-'||p_transaction_id||'%';
1174 
1175 l_proc                      varchar2(72) := g_package||'notify_bgt_manager_users';
1176 l_role_id number(15);
1177 l_role_name varchar2(30);
1178 l_business_group_id number(15);
1179 l_transaction_category_id number(15);
1180 l_apply_error_mesg varchar2(4000);
1181 l_apply_error_num number;
1182 l_max_seq_no number(15);
1183 
1184 
1185 Begin
1186 hr_utility.set_location('Entering '||l_proc,10);
1187 Open csr_bg_id;
1188 Fetch csr_bg_id into l_business_group_id;
1189 Close csr_bg_id;
1190 hr_utility.set_location('Business Group id '||l_business_group_id||l_proc,12);
1191 l_transaction_category_id := pqh_workflow.get_txn_cat
1192                               (p_short_name => 'PQH_BPR'
1193                               ,p_business_group_id => l_business_group_id);
1194 hr_utility.set_location('transaction category id '||l_transaction_category_id||l_proc,15);
1195 
1196 Open csr_bgt_manager_rls(l_business_group_id);
1197 loop
1198   fetch csr_bgt_manager_rls into l_role_id,l_role_name;
1199   exit when csr_bgt_manager_rls%notfound;
1200   hr_utility.set_location('Transaction id   '||p_transaction_id||l_proc,20);
1201   hr_utility.set_location('Transaction name  '||p_transaction_name||l_proc,25);
1202   hr_utility.set_location('Role Id  '||l_role_id||l_proc,30);
1203   hr_utility.set_location('Role Name  '||l_role_name||l_proc,35);
1204 
1205   -- Get the maximun Sequence number
1206   Open csr_seq_no(l_transaction_category_id);
1207   Fetch csr_seq_no into l_max_seq_no;
1208   Close csr_seq_no;
1209   if l_max_seq_no is null then
1210      l_max_seq_no := 1;
1211   else
1212      l_max_seq_no := l_max_seq_no + 1;
1213   end if;
1214   hr_utility.set_location('Max Seq No   '||l_max_seq_no||l_proc,37);
1215    pqh_wf.process_user_action( P_TRANSACTION_CATEGORY_ID => l_transaction_category_id,
1216                                P_TRANSACTION_ID => p_transaction_id,
1217                                P_USER_ACTION_CD => 'PQH_BPR',
1218                                p_workflow_seq_no => l_max_seq_no,
1219                                P_FORWARDED_TO_ROLE_ID => l_role_id,
1220                                P_ROUTE_TO_USER  => 'PQH_ROLE:'||l_role_id,
1221                                P_TRANSACTION_NAME => p_transaction_name,
1222                                P_APPLY_ERROR_MESG => l_apply_error_mesg,
1223                                P_APPLY_ERROR_NUM  => l_apply_error_num);
1224   If (l_apply_error_num <> 0) then
1225       hr_utility.set_location('error encountered '||l_proc,40);
1226       fnd_message.set_name(8302,'PQH_BPR_PROCESS_LOG_ERROR');
1227       fnd_message.raise_error;
1228   End if;
1229 
1230 End loop;
1231 Close csr_bgt_manager_rls;
1232 hr_utility.set_location('Leaving '||l_proc,50);
1233 
1234 End notify_bgt_manager_users;
1235 
1236 FUNCTION fyi_notification (p_transaction_id in number) RETURN varchar2
1237 is
1238   l_document varchar2(4000);
1239   l_proc     varchar2(61) := g_package||'fyi_notification' ;
1240   l_folder_name     varchar2(2000);
1241   l_entity_type     varchar2(80);
1242   l_budget_unit     varchar2(80);
1243   l_approval_status  varchar2(100);
1244   cursor c0 is select  name,
1245                        hr_general.decode_lookup('PQH_BUDGET_ENTITY',ENTITY_TYPE),
1246                        hr_general.decode_shared_type(budget_unit_id),
1247                        hr_general.decode_lookup('PQH_REALLOC_TXN_STATUS',approval_status)
1248                from pqh_budget_pools
1249                where pool_id = p_transaction_id;
1250 BEGIN
1251   hr_utility.set_location('inside fyi notification'||l_proc,10);
1252   open c0;
1253   fetch c0 into l_folder_name,l_entity_type, l_budget_unit, l_approval_status;
1254   close c0;
1255   hr_utility.set_location('Folder name, Approval Status fetched   '||l_proc,20);
1256   --
1257   hr_utility.set_message(8302,'PQH_BPR_WF_FYI_NOTICE');
1258   hr_utility.set_message_token('FOLDER_NAME',l_folder_name);
1259   hr_utility.set_message_token('ENTITY_TYPE',l_entity_type);
1260   hr_utility.set_message_token('BUDGET_UNIT',l_budget_unit);
1261   hr_utility.set_message_token('APPROVAL_STATUS',l_approval_status);
1262   l_document := hr_utility.get_message;
1263   return l_document;
1264   exception
1265   when others then
1266      hr_utility.set_message(8302,'PQH_BPR_WF_FYI_FAIL');
1267      hr_utility.set_message_token('TRANSACTION_ID',p_transaction_id);
1268      l_document := hr_utility.get_message;
1269      return l_document;
1270 END fyi_notification;
1271 
1272 PROCEDURE update_folder_approval_status (p_transaction_id in number, p_action_flag in varchar2)
1273 IS
1274 /* This procedure updates the folder approval status as 'P' (Pending)
1275    if the action flag is I (InBox) , F (Forward)
1276  */
1277 
1278 Cursor csr_pool_dtls IS
1279 Select *
1280 From pqh_budget_pools
1281 Where pool_id = p_transaction_id;
1282 
1283 l_pool_rec  csr_pool_dtls%ROWTYPE;
1284 l_proc   varchar2(72) := g_package||'update_folder_approval_status';
1285 l_transaction_category_id number;
1286 
1287 BEGIN
1288    hr_utility.set_location('Entering '||l_proc,10);
1289 --added by kgowripe
1290 hr_multi_message.enable_message_list;
1291 --end changes by kgowripe
1292    OPEN csr_pool_dtls;
1293    FETCH csr_pool_dtls INTO  l_pool_rec;
1294    CLOSE csr_pool_dtls;
1295    hr_utility.set_location('Txn Cat Id  '||l_transaction_category_id ,15);
1296 
1297    if ( l_pool_rec.approval_status = 'T' and (p_action_flag = 'I'  OR
1298                                               p_action_flag = 'F' ))
1299    then
1300          pqh_budget_pools_api.update_reallocation_folder(p_effective_date=> hr_general.effective_date
1301                                                  ,p_folder_id => p_transaction_id
1302                                                  ,p_object_version_number=>l_pool_rec.object_version_number
1303                                                  ,p_business_group_id => l_pool_rec.business_group_id
1304                                                  ,p_approval_status=> 'P'
1305                                                  ,p_wf_transaction_category_id => l_pool_rec.wf_transaction_category_id);
1306   end if;
1307 Exception
1308 --added by kgowripe
1309   when hr_multi_message.error_message_exist then
1310     Null;
1311 End update_folder_approval_status;
1312 PROCEDURE bgt_dummy_folder_delete(p_business_group_id IN number)
1313 is
1314 
1315 /*
1316 This procedure deletes all folders whose approval_status is T (created)
1317 i.e the folders which are created but not routed.
1318 */
1319 Cursor csr_approval_status_T_folders IS
1320 Select pool_id
1321 From pqh_budget_pools
1322 Where approval_status = 'T'
1323 And business_group_id = p_business_group_id
1324 AND creation_date < sysdate - 2;
1325 
1326 l_folder_id pqh_budget_pools.pool_id%type;
1327 l_proc    varchar2(72) := g_package ||'bgt_dummy_folder_delete';
1328 
1329 BEGIN
1330 
1331 hr_utility.set_location(' Entering:' || l_proc,10);
1332 --added by kgowripe
1333 hr_multi_message.enable_message_list;
1334 --end changes by kgowripe
1335 Open  csr_approval_status_T_folders;
1336 loop
1337      hr_utility.set_location('Folder Id :' || l_folder_id ,20);
1338      fetch csr_approval_status_T_folders into l_folder_id;
1339      exit when csr_approval_status_T_folders%NOTFOUND;
1340      If l_folder_id is Not Null Then
1341         /* In the procedure pqh_budget_pools_swi.bgt_realloc_delete
1342            node_type T is marked as Transaction.
1343            So here passed TCF (Tempory Created Folder) as node type
1344            to distinguish with Transaction
1345          */
1346        BEGIN
1347          pqh_budget_pools_swi.bgt_realloc_delete(p_node_type => 'TCF'
1348                                             ,p_node_id   =>l_folder_id);
1349        EXCEPTION
1350          When Others Then
1351               Null;
1352        END;
1353      End If;
1354 end loop;
1355 close csr_approval_status_T_folders;
1356 hr_utility.set_location(' Leaving:' || l_proc,30);
1357 Exception
1358   When others Then
1359      Null;
1360 END bgt_dummy_folder_delete;
1361 
1362 PROCEDURE chk_bpr_route_catg_exist(p_business_group_id IN Number,
1363                                    p_status out nocopy varchar2) IS
1364 
1365  l_txn_catg_id Number;
1366  l_route_catg_id Number;
1367 CURSOR csr_rout_catg(p_txn_catg_id IN Number) IS
1368    SELECT routing_category_id
1369    FROM   pqh_routing_categories
1370    WHERE  transaction_category_id = p_txn_catg_id;
1371 BEGIN
1372   l_txn_catg_id := pqh_workflow.get_txn_cat('PQH_BPR',p_business_group_id);
1373   OPEN csr_rout_catg(l_txn_catg_id);
1374   FETCH csr_rout_catg INTO l_route_catg_id;
1375   IF csr_rout_catg%NOTFOUND THEN
1376     p_status := 'FALSE';
1377   ELSE
1378     p_status := 'TRUE';
1379   END IF;
1380   CLOSE csr_rout_catg;
1381 END chk_bpr_route_catg_exist;
1382 
1383 -- Added procedure by mvanakda
1384 PROCEDURE bpr_process_user_action(
1385              	  p_transaction_id                IN  NUMBER
1386 	         ,p_transaction_category_id       IN  NUMBER
1387 	         ,p_route_to_user                 IN  VARCHAR2
1388 	         ,p_routing_category_id           IN  NUMBER
1389 	         ,p_pos_structure_version_id      IN  NUMBER
1390 	         ,p_user_action_cd                IN  VARCHAR2
1391 	         ,p_forwarded_to_user_id          IN  NUMBER
1392 	         ,p_forwarded_to_role_id          IN  NUMBER
1393 	         ,p_forwarded_to_position_id      IN  NUMBER
1394 	         ,p_forwarded_to_assignment_id    IN  NUMBER
1395 	         ,p_forwarded_to_member_id        IN  NUMBER
1396 	         ,p_forwarded_by_user_id          IN  NUMBER
1397 	         ,p_forwarded_by_role_id          IN  NUMBER
1398 	         ,p_forwarded_by_position_id      IN  NUMBER
1399 	         ,p_forwarded_by_assignment_id    IN  NUMBER
1400 	         ,p_forwarded_by_member_id        IN  NUMBER
1401 	         ,p_effective_date                IN  DATE
1402 	         ,p_approval_cd                   IN  VARCHAR2
1403 	         ,p_member_cd                     In  VARCHAR2
1404 	         ,p_transaction_name              IN  VARCHAR2
1405 	         ,p_apply_error_mesg              OUT NOCOPY VARCHAR2
1406        		 ,p_apply_error_num               OUT NOCOPY NUMBER
1407        		 ,p_warning_mesg                  OUT NOCOPY VARCHAR2
1408        		 ) IS
1409 l_proc    varchar2(72) := g_package ||'bpr_process_user_action';
1410 l_return   varchar2(30);
1411 
1412 --Added cursor by krmahade
1413 CURSOR csr_get_bdgt_start_dt IS
1414     select bgt.budget_start_date
1415     from   pqh_budgets bgt,
1416            pqh_budget_versions bvr,
1417            pqh_budget_pools fld
1418     where  fld.pool_id = p_transaction_id
1419     and    fld.budget_version_id = bvr.budget_version_id
1420     and    bvr.budget_id = bgt.budget_id;
1421 
1422     l_effective_date date;
1423 --end krmahade
1424 BEGIN
1425   hr_utility.set_location(' Entering:' || l_proc,10);
1426 
1427   --Added by krmahade
1428   OPEN csr_get_bdgt_start_dt;
1429   FETCH  csr_get_bdgt_start_dt into l_effective_date;
1430   CLOSE csr_get_bdgt_start_dt;
1431 
1432   --End krmahade
1433 
1434   g_warning := 'FALSE';
1435 
1436   -- Svorugan : for bug fix : 2864971
1437         if (p_user_action_cd = 'REJECT') then
1438          --
1439            l_return   :=  pqh_bdgt_realloc_utility.reject_transaction(p_transaction_id);
1440            --
1441            hr_utility.set_location(' Action Rejection Status :' || l_return,26);
1442          --
1443         end if;
1444   -- End Svorugan
1445 
1446   hr_utility.set_location(' before call warning :' || g_warning,15);
1447 
1448   pqh_wf.process_user_action(
1449               	 p_transaction_id                 =>  p_transaction_id
1450   	         ,p_transaction_category_id        =>  p_transaction_category_id
1451   	         ,p_route_to_user                  =>  p_route_to_user
1452   	         ,p_routing_category_id            =>  p_routing_category_id
1453   	         ,p_pos_structure_version_id       =>  p_pos_structure_version_id
1454   	         ,p_user_action_cd                 =>  p_user_action_cd
1455   	         ,p_forwarded_to_user_id           =>  p_forwarded_to_user_id
1456   	         ,p_forwarded_to_role_id           =>  p_forwarded_to_role_id
1457   	         ,p_forwarded_to_position_id       =>  p_forwarded_to_position_id
1458   	         ,p_forwarded_to_assignment_id     =>  p_forwarded_to_assignment_id
1459   	         ,p_forwarded_to_member_id         =>  p_forwarded_to_member_id
1460   	         ,p_forwarded_by_user_id           =>  p_forwarded_by_user_id
1461   	         ,p_forwarded_by_role_id           =>  p_forwarded_by_role_id
1462   	         ,p_forwarded_by_position_id       =>  p_forwarded_by_position_id
1463   	         ,p_forwarded_by_assignment_id     =>  p_forwarded_by_assignment_id
1464   	         ,p_forwarded_by_member_id         =>  p_forwarded_by_member_id
1465   	         ,p_effective_date                 =>  NVL(l_effective_date,p_effective_date)
1466   	         ,p_approval_cd                    =>  p_approval_cd
1467   	         ,p_member_cd                      =>  p_member_cd
1468   	         ,p_transaction_name               =>  p_transaction_name
1469   	         ,p_apply_error_mesg               =>  p_apply_error_mesg
1470                  ,p_apply_error_num           	   =>  p_apply_error_num
1471        		 );
1472   hr_utility.set_location(' after call warning :' || g_warning,25);
1473   p_warning_mesg := g_warning;
1474 hr_utility.set_location(' leaving:' || l_proc,40);
1475 END bpr_process_user_action;
1476 
1477 -- ----------------------------------------------------------------------------
1478 -- |----------------------< check_approver_skip >-------------------------|
1479 -- ----------------------------------------------------------------------------
1480 FUNCTION check_approver_skip(p_transaction_category_id IN NUMBER)
1481 RETURN VARCHAR2
1482 IS
1483 l_status VARCHAR2(10) := 'Y';
1484 BEGIN
1485 SELECT prevent_approver_skip
1486 into l_status
1487 from pqh_transaction_categories
1488 where transaction_category_id = p_transaction_category_id;
1489 IF l_status is null OR l_status = 'N' THEN
1490 RETURN 'N';
1491 ELSE
1492 RETURN 'Y';
1493 END IF;
1494 END CHECK_APPROVER_SKIP;
1495 
1496 
1497 -- ----------------------------------------------------------------------------
1498 -- |----------------------< valid_user_opening >-------------------------------|
1499 -- | Wrapper on top of pqh_workflow.valid_user_openingto allow multi messaging |
1500 -- ----------------------------------------------------------------------------
1501 procedure valid_user_opening(p_business_group_id           in number    default null,
1502                              p_short_name                  in varchar2  ,
1503                              p_transaction_id              in number    default null,
1504                              p_routing_history_id          in number    default null,
1505                              p_wf_transaction_category_id     out nocopy number,
1506                              p_glb_transaction_category_id    out nocopy number,
1507                              p_role_id                        out nocopy number,
1508                              p_role_template_id               out nocopy number,
1509                              p_status_flag                    out nocopy varchar2) is
1510 l_result varchar2(100);
1511 BEGIN
1512     --
1513     -- Enable multi-messaging
1514     hr_multi_message.enable_message_list;
1515     --
1516      pqh_workflow.valid_user_opening(
1517                      p_business_group_id           => p_business_group_id,
1518                      p_short_name                  => p_short_name,
1519                      p_transaction_id              => p_transaction_id,
1520                      p_routing_history_id          => p_routing_history_id,
1521                      p_wf_transaction_category_id  => p_wf_transaction_category_id,
1522                      p_glb_transaction_category_id => p_glb_transaction_category_id,
1523                      p_role_id                     => p_role_id,
1524                      p_role_template_id            => p_role_template_id,
1525                      p_status_flag                 => p_status_flag );
1526 
1527        if (p_status_flag <> 0 and hr_multi_message.exception_add ) then
1528             hr_utility.raise_error;
1529        end if;
1530 
1531     -- Get the return status and disable multi-messaging
1532     l_result := hr_multi_message.get_return_status_disable;
1533 
1534 
1535 exception
1536     when hr_multi_message.error_message_exist then
1537        l_result := hr_multi_message.get_return_status_disable;
1538     when others then
1539        raise;
1540 
1541 END valid_user_opening;
1542 
1543 -- ----------------------------------------------------------------------------
1544 -- |------------------------< get_folder_unit >-------------------------------|
1545 -- | Function to return Folder Unit Desciption for Bdgt_Unit_Id. Bug #3027076.|
1546 -- ----------------------------------------------------------------------------
1547 FUNCTION get_folder_unit (p_budget_unit_id IN NUMBER)
1548 RETURN  VARCHAR2 IS
1549 --Cursor to fetch Folder Unit Desc
1550   CURSOR csr_folder_unit_desc IS
1551   SELECT stt.shared_type_name
1552     FROM per_shared_types st, per_shared_types_tl stt
1553    WHERE st.lookup_type       = 'BUDGET_MEASUREMENT_TYPE'
1554      AND(st.business_group_id = HR_GENERAL.get_business_group_id OR
1555          st.business_group_id IS NULL)
1556      AND st.shared_type_id    = p_budget_unit_id
1557      AND stt.shared_type_id   = st.shared_type_id
1558      AND stt.language = USERENV('LANG');
1559 --Local Variables
1560   l_folder_unit_desc VARCHAR2(80);
1561 BEGIN
1562   l_folder_unit_desc := NULL;
1563   OPEN csr_folder_unit_desc;
1564   FETCH csr_folder_unit_desc INTO l_folder_unit_desc;
1565   CLOSE csr_folder_unit_desc;
1566   RETURN l_folder_unit_desc;
1567 EXCEPTION
1568   WHEN OTHERS THEN
1569     l_folder_unit_desc := NULL;
1570     RETURN l_folder_unit_desc;
1571 END get_folder_unit;
1572 
1573 End pqh_bdgt_realloc_utility;