DBA Data[Home] [Help]

PACKAGE BODY: APPS.PQH_PSP_INTEGRATION

Source


1 PACKAGE BODY PQH_PSP_INTEGRATION AS
2 /* $Header: pqhpspkg.pkb 115.4 2003/09/24 23:35:50 kgowripe noship $ */
3 --
4 -----------------------------------------------------------------------------
5 -- |                     Private Global Definitions
6 -----------------------------------------------------------------------------
7 --
8 g_asg_bgt_tab               t_assignment_budget_tab;
9 g_encumbered_entity_tab  t_enc_entity_tab;
10 g_package                   varchar2(25) := 'pqh_psp_integration';
11 --
12 
13 -----------------------------------------------------------------------------
14 -- Private procedure to get Encumbered/Liquidated Assignments and Periods
15 -----------------------------------------------------------------------------
16 /*
17 LD call returns a Pl/Sql record with Assignment, Element,Period and Amount
18 details for Encumbered/Liquidated Assignments.
19 But we are interested only in Assignment and Period details and we dont want
20 Element Details.
21 This procedure finds Assignment and Min/Max Encumbered Periods irrespective
22 of Elements Involved.
23 */
24 
25 Procedure get_distinct_assignments
26 (
27   p_assg_ele_tab IN  psp_pqh_integration.assignment_enc_ld_col
28 )  IS
29 --
30 Cursor csr_period_date(p_time_period_id  in  number) is
31  Select start_date,end_date
32    From per_time_periods
33    Where time_period_id = p_time_period_id;
34 
35 --------Local Variables-----------------------------------------------
36 
37 i              NUMBER :=1;
38 l_start_date   DATE;
39 l_end_date     DATE;
40 l_start_period NUMBER;
41 l_end_period   NUMBER;
42 l_proc         VARCHAR2(72) := g_package||'get_distinct_assignments';
43 
44 
45 Begin
46 --
47 hr_utility.set_location('Entering: '||l_proc, 5);
48 --
49 g_asg_bgt_tab(1).assignment_id    :=p_assg_ele_tab.r_assignment_id(1);
50 l_start_period                    :=p_assg_ele_tab.r_begin_time_period_id(1);
51 l_end_period                      := p_assg_ele_tab.r_end_time_period_id(1);
52 --
53 Open csr_period_date(l_start_period);
54 Fetch csr_period_date into l_start_date, l_end_date;
55 Close csr_period_date;
56 g_asg_bgt_tab(1).start_period  :=l_start_date;
57 --
58 Open csr_period_date(l_end_period);
59 Fetch csr_period_date into l_start_date, l_end_date;
60 Close csr_period_date;
61 g_asg_bgt_tab(1).end_period    :=l_end_date;
62 --
63 For cnt in 2..p_assg_ele_tab.r_assignment_id.COUNT
64  LOOP
65  --
66  IF(g_asg_bgt_tab(i).assignment_id = p_assg_ele_tab.r_assignment_id(cnt))
67 
68   THEN
69   --
70   IF (l_start_period  <> p_assg_ele_tab.r_begin_time_period_id(cnt) Or
71       l_end_period    <> p_assg_ele_tab.r_end_time_period_id(cnt))
72   THEN
73   Open csr_period_date(p_assg_ele_tab.r_begin_time_period_id(cnt));
74   Fetch csr_period_date into l_start_date, l_end_date;
75   Close csr_period_date;
76   IF ( l_start_date < g_asg_bgt_tab(i).start_period)
77   THEN
78   l_start_period :=p_assg_ele_tab.r_begin_time_period_id(cnt);
79   g_asg_bgt_tab(i).start_period  :=l_start_date;
80   END IF;
81   Open csr_period_date(p_assg_ele_tab.r_end_time_period_id(cnt));
82   Fetch csr_period_date into l_start_date, l_end_date;
83   Close csr_period_date;
84   IF ( l_end_date  > g_asg_bgt_tab(i).end_period)
85     THEN
86     l_end_period :=p_assg_ele_tab.r_end_time_period_id(cnt);
87     g_asg_bgt_tab(i).end_period  :=l_end_date;
88   END IF;
89   END IF;
90   --
91   Else
92    --
93    i :=i+1;
94    g_asg_bgt_tab(i).assignment_id    :=p_assg_ele_tab.r_assignment_id(cnt);
95    l_start_period :=p_assg_ele_tab.r_begin_time_period_id(cnt);
96    l_end_period := p_assg_ele_tab.r_end_time_period_id(cnt);
97    Open csr_period_date(l_start_period);
98    Fetch csr_period_date into l_start_date, l_end_date;
99    Close csr_period_date;
100    g_asg_bgt_tab(i).start_period  :=l_start_date;
101    Open csr_period_date(l_end_period);
102    Fetch csr_period_date into l_start_date, l_end_date;
103    Close csr_period_date;
104    g_asg_bgt_tab(i).end_period    :=l_end_date;
105    --
106   END IF;
107 
108  --
109  END LOOP;
110 hr_utility.set_location('Leaving:'||l_proc, 1000);
111 --
112 EXCEPTION
113       WHEN OTHERS THEN
114         hr_utility.set_message(8302, 'PQH_CATASTROPHIC_ERROR');
115         hr_utility.set_message_token('ROUTINE', l_proc);
116         hr_utility.set_message_token('REASON', SQLERRM);
117         hr_utility.raise_error;
118 END;
119 
120 -----------------------------------------------------------------------------
121 -- Private procedure to get Entities attached to Enc/Liquidated Assignment
122 -----------------------------------------------------------------------------
123 /*
124 Given a set of Assignments and Encumbered Period this procedure will find
125 all Entites attatched to those Assignments in that period.
126 Eg:
127 ---LD Encumbrance Details---                ----Assignment Details-----------------
128 Assignment  Start Period  End Period        Assignment Start Date  End date    Position
129 A1          01-jan-2000   30-Jun-2000       A1         01-jan-2000 15-jan-2000 P1
130                                             A1         15-jan-2000 31-mar-2000 P2
131                                             A1         01-apr-2000 30-jun-2000 P3
132 For this assignment we will pick positions P1,P2,P3.
133 
134 Note that Positions may repeate. But when fnding Budget Versions we will take
135 care that Budget Version in not repeated even though position is repeated.
136 */
137 Procedure get_asg_entities IS
138 --
139 Cursor csr_asg_entities(p_assignment_id NUMBER,p_start_date DATE, p_end_date DATE) IS
140 Select position_id ,organization_id,
141        grade_id,job_id,
142        effective_start_date,effective_end_date
143  From per_all_assignments_f
144  Where assignment_id=p_assignment_id And
145        position_id is not null And
146        effective_start_date >= p_start_date And
147        effective_end_date   <= p_end_date;
148 
149 i NUMBER :=0;
150 l_proc           VARCHAR2(72) := g_package||'get_asg_entities';
151 --
152 Begin
153 --
154 hr_utility.set_location('Entering: '||l_proc, 5);
155 For cnt in 1..g_asg_bgt_tab.COUNT
156  LOOP
157  --
158  FOR C1 in csr_asg_entities(g_asg_bgt_tab(cnt).assignment_id,
159                             g_asg_bgt_tab(cnt).start_period,
160                             g_asg_bgt_tab(cnt).end_period)
161  LOOP
162  --
163  i :=i+1;
164  g_encumbered_entity_tab(i).position_id     :=C1.position_id;
165  g_encumbered_entity_tab(i).organization_id :=C1.organization_id;
166  g_encumbered_entity_tab(i).grade_id        :=C1.grade_id;
167  g_encumbered_entity_tab(i).job_id          :=C1.job_id;
168  g_encumbered_entity_tab(i).start_period    :=C1.effective_start_date;
169  g_encumbered_entity_tab(i).end_period      :=C1.effective_end_date;
170  --
171  END LOOP;
172  --
173  END LOOP;
174  hr_utility.set_location('Leaving:'||l_proc, 1000);
175 --
176 EXCEPTION
177       WHEN OTHERS THEN
178         hr_utility.set_message(8302, 'PQH_CATASTROPHIC_ERROR');
179         hr_utility.set_message_token('ROUTINE', l_proc);
180         hr_utility.set_message_token('REASON', SQLERRM);
181         hr_utility.raise_error;
182 END;
183 
184 -----------------------------------------------------------------------------
185 -- Private procedure to get Budget Versions from Assignment Positions
186 -----------------------------------------------------------------------------
187 /*
188 Given a set of Positions this procedure will find Budget Versions coresponding
189 to those Positions.
190 However Budget Version will be considered only if
191 1.Budget is marked for Transfer to GMS
192 2.Corresponding Budget detail is already posted to Target system
193 3.Budget Version is  already posted to Target system
194 
195 Also care is taken that Budget version is not repeated even though 2 different
196 positions may belong to same budget version.
197 */
198 Procedure get_budget_versions
199 (
200  l_versions_tab  OUT NOCOPY PSP_PQH_INTEGRATION.t_num_15_type
201 ) IS
202 --
203 -----------------------Cursors----------------------------------------------------
204 Cursor csr_position_budget(p_position_id NUMBER,
205                            p_start_date date,
206                            p_end_date date) IS
207 Select bdt.budget_detail_id ,bdt.budget_version_id
208 From   pqh_budget_details  bdt,
209        pqh_budget_versions bvr,
210        pqh_budgets         bgt
211 Where
212      bdt.position_id=p_position_id And
213      bdt.gl_status='POST' And
214      bvr.budget_version_id=bdt.budget_version_id And
215      bvr.gl_status='POST' And
216      bgt.budget_id=bvr.budget_id And
217      bgt.TRANSFER_TO_GRANTS_FLAG='Y' And
218      bgt.budgeted_entity_cd='POSITION'AND
219      ( (bgt.budget_start_date>=p_start_date and bgt.budget_start_date < p_end_date) Or
220        (bgt.budget_end_date > P_start_date and bgt.budget_end_date   <=p_end_date )Or
221        (p_start_date >=bgt.budget_end_date and p_start_date < bgt.budget_end_date )
222      );
223 
224 
225 Cursor csr_org_budget(p_organization_id NUMBER,
226                            p_start_date date,
227                            p_end_date date) IS
228 Select bdt.budget_detail_id ,bdt.budget_version_id
229 From   pqh_budget_details  bdt,
230        pqh_budget_versions bvr,
231        pqh_budgets         bgt
232 Where
233      bdt.organization_id=p_organization_id And
234      bdt.gl_status='POST' And
235      bvr.budget_version_id=bdt.budget_version_id And
236      bvr.gl_status='POST' And
237      bgt.budget_id=bvr.budget_id And
238      bgt.TRANSFER_TO_GRANTS_FLAG='Y' And
239      bgt.budgeted_entity_cd='ORGANIZATION'AND
240      ( (bgt.budget_start_date>=p_start_date and bgt.budget_start_date < p_end_date) Or
241        (bgt.budget_end_date > P_start_date and bgt.budget_end_date   <=p_end_date )Or
242        (p_start_date >=bgt.budget_end_date and p_start_date < bgt.budget_end_date )
243      );
244 
245 
246 
247 Cursor csr_grade_budget(p_grade_id NUMBER,
248                            p_start_date date,
249                            p_end_date date) IS
250 Select bdt.budget_detail_id ,bdt.budget_version_id
251 From   pqh_budget_details  bdt,
252        pqh_budget_versions bvr,
253        pqh_budgets         bgt
254 Where
255      bdt.grade_id=p_grade_id And
256      bdt.gl_status='POST' And
257      bvr.budget_version_id=bdt.budget_version_id And
258      bvr.gl_status='POST' And
259      bgt.budget_id=bvr.budget_id And
260      bgt.TRANSFER_TO_GRANTS_FLAG='Y' And
261      bgt.budgeted_entity_cd='GRADE'AND
262      ( (bgt.budget_start_date>=p_start_date and bgt.budget_start_date < p_end_date) Or
263        (bgt.budget_end_date > P_start_date and bgt.budget_end_date   <=p_end_date )Or
264        (p_start_date >=bgt.budget_end_date and p_start_date < bgt.budget_end_date )
265      );
266 
267 
268 Cursor csr_job_budget(p_job_id NUMBER,
269                            p_start_date date,
270                            p_end_date date) IS
271 Select bdt.budget_detail_id ,bdt.budget_version_id
272 From   pqh_budget_details  bdt,
273        pqh_budget_versions bvr,
274        pqh_budgets         bgt
275 Where
276      bdt.job_id=p_job_id And
277      bdt.gl_status='POST' And
278      bvr.budget_version_id=bdt.budget_version_id And
279      bvr.gl_status='POST' And
280      bgt.budget_id=bvr.budget_id And
281      bgt.TRANSFER_TO_GRANTS_FLAG='Y' And
282      bgt.budgeted_entity_cd='JOB'AND
283      ( (bgt.budget_start_date>=p_start_date and bgt.budget_start_date < p_end_date) Or
284        (bgt.budget_end_date > P_start_date and bgt.budget_end_date   <=p_end_date )Or
285        (p_start_date >=bgt.budget_end_date and p_start_date < bgt.budget_end_date )
286      );
287 
288 ----------------------------Local Variables-----------------------------------------
289 
290 i                NUMBER :=0;
291 version_repeated BOOLEAN;
292 l_proc           VARCHAR2(72) := g_package||'get_budget_versions';
293 
294 
295 Begin
296 --
297 hr_utility.set_location('Entering: '||l_proc, 5);
298 --
299 -- For each Encumbered Entity
300 --
301 For cnt in 1..g_encumbered_entity_tab.COUNT
302  LOOP
303  --
304  -- If Assignment has a Position attached
305  --
306  IF g_encumbered_entity_tab(cnt).position_id is NOT NULL
307  THEN
308   FOR C1 in csr_position_budget(g_encumbered_entity_tab(cnt).position_id,
309                                 g_encumbered_entity_tab(cnt).start_period,
310                                 g_encumbered_entity_tab(cnt).end_period)
311   LOOP
312   --
313    version_repeated :=false;
314    For inx in 1..l_versions_tab.COUNT
315    LOOP
316    --
317     IF (C1.budget_version_id = l_versions_tab(inx))
318     THEN
319      version_repeated :=true;
320      EXIT;
321     END IF;
322    --
323    END LOOP;
324    IF ( not version_repeated )
325    THEN
326     i :=i+1;
327     l_versions_tab(i) :=C1.budget_version_id;
328     Update pqh_budget_details
329       SET commitment_gl_status='ENC',gl_status='ENC'
330     Where budget_detail_id = C1.budget_detail_id;
331    END IF;
332   --
333   END LOOP;
334  END IF;
335  --
336  --If Assignment has Organization attached
337  --
338   IF g_encumbered_entity_tab(cnt).organization_id is NOT NULL
339   THEN
340    FOR C1 in csr_org_budget(g_encumbered_entity_tab(cnt).organization_id,
341                             g_encumbered_entity_tab(cnt).start_period,
342                             g_encumbered_entity_tab(cnt).end_period)
343    LOOP
344    --
345     version_repeated :=false;
346     For inx in 1..l_versions_tab.COUNT
347     LOOP
348     --
349      IF (C1.budget_version_id = l_versions_tab(inx))
350      THEN
351       version_repeated :=true;
352       EXIT;
353      END IF;
354     --
355     END LOOP;
356     IF ( not version_repeated )
357     THEN
358      i :=i+1;
359      l_versions_tab(i) :=C1.budget_version_id;
360      Update pqh_budget_details
361        SET commitment_gl_status='ENC',gl_status='ENC'
362      Where budget_detail_id = C1.budget_detail_id;
363     END IF;
364    --
365    END LOOP;
366   END IF;
367  --
368  --If Assignment has Grade attached
369  --
370    IF g_encumbered_entity_tab(cnt).grade_id is NOT NULL
371    THEN
372     FOR C1 in csr_grade_budget(g_encumbered_entity_tab(cnt).grade_id,
373                                g_encumbered_entity_tab(cnt).start_period,
374                                g_encumbered_entity_tab(cnt).end_period)
375     LOOP
376     --
377      version_repeated :=false;
378      For inx in 1..l_versions_tab.COUNT
379      LOOP
380      --
381       IF (C1.budget_version_id = l_versions_tab(inx))
382       THEN
383        version_repeated :=true;
384        EXIT;
385       END IF;
386      --
387      END LOOP;
388      IF ( not version_repeated )
389      THEN
390       i :=i+1;
391       l_versions_tab(i) :=C1.budget_version_id;
392       Update pqh_budget_details
393        SET commitment_gl_status='ENC',gl_status='ENC'
394       Where budget_detail_id = C1.budget_detail_id;
395      END IF;
396      --
397     END LOOP;
398    END IF;
399  --
400  --If Assignment has Job attached
401  --
402    IF g_encumbered_entity_tab(cnt).job_id is NOT NULL
403    THEN
404     FOR C1 in csr_job_budget(g_encumbered_entity_tab(cnt).job_id,
405                              g_encumbered_entity_tab(cnt).start_period,
406                              g_encumbered_entity_tab(cnt).end_period)
407     LOOP
408     --
409      version_repeated :=false;
410      For inx in 1..l_versions_tab.COUNT
411      LOOP
412      --
413       IF (C1.budget_version_id = l_versions_tab(inx))
414       THEN
415        version_repeated :=true;
416        EXIT;
417       END IF;
418      --
419      END LOOP;
420      IF ( not version_repeated )
421      THEN
422       i :=i+1;
423       l_versions_tab(i) :=C1.budget_version_id;
424       Update pqh_budget_details
425         SET commitment_gl_status='ENC',gl_status='ENC'
426       Where budget_detail_id = C1.budget_detail_id;
427      END IF;
428     --
429     END LOOP;
430    END IF;
431   --
432  END LOOP;
433 hr_utility.set_location('Leaving:'||l_proc, 1000);
434 --
435 EXCEPTION
436       WHEN OTHERS THEN
437         hr_utility.set_message(8302, 'PQH_CATASTROPHIC_ERROR');
438         hr_utility.set_message_token('ROUTINE', l_proc);
439         hr_utility.set_message_token('REASON', SQLERRM);
440         hr_utility.raise_error;
441 END;
442 
443 -----------------------------------------------------------------------------
444 -- Main procedure called by LD Encumbrane and Summarize/Liquidation process
445 -----------------------------------------------------------------------------
446 /*
447 This procedure is called by LD whenever assignments are encumbered or lquidated.
448 This procedure picks up all assignments encumbered by LD and identifies Budget
449 Version involved based on Assignment positions.
450 For each such budget version we will call
451 Budget Transfer process
452 Commitment Calculation process
453 Commitment Transfer Process
454 in that order.
455 These individual processes will take care of relieving PQH commitments.
456 */
457 
458 PROCEDURE  relieve_budget_commitments( p_calling_process IN  VARCHAR2,
459                                        p_return_status   OUT NOCOPY VARCHAR2) IS
460 --
461 l_assignment_enc_ld_table      psp_pqh_integration.assignment_enc_ld_col;
462 l_distinct_assignment_table    t_assignment_budget_tab;
463 l_encumbered_positions_table   PSP_PQH_INTEGRATION.t_num_15_type;
464 l_budget_versions_table        PSP_PQH_INTEGRATION.t_num_15_type;
465 l_psp_encumbered               BOOLEAN;
466 l_return_status                varchar2(2);
467 l_proc                         varchar2(72) := g_package||'relieve_budget_commitments';
468 l_err                          varchar2(100);
469 l_ret                          varchar2(100);
470 l_budget_version               number(15);
471 --
472 BEGIN
473 
474  hr_utility.set_location('Entering: '||l_proc, 5);
475  PSP_PQH_INTEGRATION.GET_ENCUMBRANCE_DETAILS(
476      P_CALLING_PROCESS          =>p_calling_process,
477      P_ASSIGNMENT_ENC_LD_TABLE  =>l_assignment_enc_ld_table,
478      P_PSP_ENCUMBERED           =>l_psp_encumbered,
479      P_RETURN_STATUS            =>l_return_status);
480 
481  IF( l_return_status <> FND_API.G_RET_STS_SUCCESS)
482  THEN
483  --
484  p_return_status:=FND_API.G_RET_STS_ERROR;
485  RETURN;
486  --
487 --added for fixing bug#3153433
488 -- check whether the assignments are encumbered or not and proceed.
489  ELSIF NOT (l_psp_encumbered) THEN
490 
491  p_return_status:=FND_API.G_RET_STS_SUCCESS;
492  RETURN;
493 --end changes for bug#3153433
494  END IF;
495 
496  --Get Assignmetns and Period os Encumbrance
497  get_distinct_assignments(l_assignment_enc_ld_table);
498 
499  -- Get Postions attached to Encumbered/Liquidated assignmnts
500  get_asg_entities;
501 
502  --Get Budget Versions of Assignment Positions
503  get_budget_versions(l_budget_versions_table);
504 
505  --For each Budget Version call Budget Xfer, Commitment Calculation and Commiment Xfer
506  For cnt in 1..l_budget_versions_table.COUNT
507   LOOP
508   --
509   l_budget_version :=l_budget_versions_table(cnt);
510   pqh_commitment_pkg.calculate_commitment(
511                                           errbuf               =>l_err,
512                                           retcode              => l_ret,
513                                           p_budgeted_entity_cd  =>'POSITION',
514                                           p_budget_version_id  =>l_budget_version
515                                           );
516  pqh_gl_posting.post_budget(
517                             p_budget_version_id=>l_budget_version,
518                             p_status            =>l_ret
519                            );
520 
521  pqh_commitment_posting.post_budget_commitment(
522                                                errbuf=>l_err,
523                                                retcode => l_ret,
524                                                p_effective_date =>sysdate,
525                                                p_budget_version_id=>l_budget_version
526                                               );
527   --
528  END LOOP;
529 
530  p_return_status:=FND_API.G_RET_STS_SUCCESS;
531  hr_utility.set_location('Leaving:'||l_proc, 1000);
532  EXCEPTION
533   WHEN OTHERS THEN
534       ROLLBACK ;
535       p_return_status:=FND_API.G_RET_STS_ERROR;
536       hr_utility.set_message(8302, 'PQH_CATASTROPHIC_ERROR');
537       hr_utility.set_message_token('ROUTINE', l_proc);
538       hr_utility.set_message_token('REASON', SQLERRM);
539       hr_utility.raise_error;
540  END relieve_budget_commitments;
541  --
542  --
543 END PQH_PSP_INTEGRATION;