DBA Data[Home] [Help]

PACKAGE BODY: APPS.PER_PMA_BUS

Source


1 Package Body per_pma_bus as
2 /* $Header: pepmarhi.pkb 120.4.12010000.2 2008/08/06 09:29:11 ubhat ship $ */
3 --
4 -- ----------------------------------------------------------------------------
5 -- |                     Private Global Definitions                           |
6 -- ----------------------------------------------------------------------------
7 --
8 g_package  varchar2(33) := '  per_pma_bus.';  -- Global package name
9 g_debug    boolean      := hr_utility.debug_enabled;
10 --
11 -- The following two global variables are only to be
12 -- used by the return_legislation_code function.
13 --
14 g_legislation_code            varchar2(150)  default null;
15 g_appraisal_period_id         number         default null;
16 --
17 -- ----------------------------------------------------------------------------
18 -- |------------------------------< chk_df >----------------------------------|
19 -- ----------------------------------------------------------------------------
20 --
21 -- Description:
22 --   Validates all the Descriptive Flexfield values.
23 --
24 -- Prerequisites:
25 --   All other columns have been validated.  Must be called as the
26 --   last step from insert_validate and update_validate.
27 --
28 -- In Arguments:
29 --   p_rec
30 --
31 -- Post Success:
32 --   If the Descriptive Flexfield structure column and data values are
33 --   all valid this procedure will end normally and processing will
34 --   continue.
35 --
36 -- Post Failure:
37 --   If the Descriptive Flexfield structure column value or any of
38 --   the data values are invalid then an application error is raised as
39 --   a PL/SQL exception.
40 --
41 -- Access Status:
42 --   Internal Row Handler Use Only.
43 --
44 -- ----------------------------------------------------------------------------
45 procedure chk_df
46   (p_rec in per_pma_shd.g_rec_type
47   ) is
48 --
49   l_proc   varchar2(72) := g_package || 'chk_df';
50 --
51 begin
52   hr_utility.set_location('Entering:'||l_proc,10);
53   --
54   if ((p_rec.appraisal_period_id is not null)  and (
55     nvl(per_pma_shd.g_old_rec.attribute_category, hr_api.g_varchar2) <>
56     nvl(p_rec.attribute_category, hr_api.g_varchar2)  or
57     nvl(per_pma_shd.g_old_rec.attribute1, hr_api.g_varchar2) <>
58     nvl(p_rec.attribute1, hr_api.g_varchar2)  or
59     nvl(per_pma_shd.g_old_rec.attribute2, hr_api.g_varchar2) <>
60     nvl(p_rec.attribute2, hr_api.g_varchar2)  or
61     nvl(per_pma_shd.g_old_rec.attribute3, hr_api.g_varchar2) <>
62     nvl(p_rec.attribute3, hr_api.g_varchar2)  or
63     nvl(per_pma_shd.g_old_rec.attribute4, hr_api.g_varchar2) <>
64     nvl(p_rec.attribute4, hr_api.g_varchar2)  or
65     nvl(per_pma_shd.g_old_rec.attribute5, hr_api.g_varchar2) <>
66     nvl(p_rec.attribute5, hr_api.g_varchar2)  or
67     nvl(per_pma_shd.g_old_rec.attribute6, hr_api.g_varchar2) <>
68     nvl(p_rec.attribute6, hr_api.g_varchar2)  or
69     nvl(per_pma_shd.g_old_rec.attribute7, hr_api.g_varchar2) <>
70     nvl(p_rec.attribute7, hr_api.g_varchar2)  or
71     nvl(per_pma_shd.g_old_rec.attribute8, hr_api.g_varchar2) <>
72     nvl(p_rec.attribute8, hr_api.g_varchar2)  or
73     nvl(per_pma_shd.g_old_rec.attribute9, hr_api.g_varchar2) <>
74     nvl(p_rec.attribute9, hr_api.g_varchar2)  or
75     nvl(per_pma_shd.g_old_rec.attribute10, hr_api.g_varchar2) <>
76     nvl(p_rec.attribute10, hr_api.g_varchar2)  or
77     nvl(per_pma_shd.g_old_rec.attribute11, hr_api.g_varchar2) <>
78     nvl(p_rec.attribute11, hr_api.g_varchar2)  or
79     nvl(per_pma_shd.g_old_rec.attribute12, hr_api.g_varchar2) <>
80     nvl(p_rec.attribute12, hr_api.g_varchar2)  or
81     nvl(per_pma_shd.g_old_rec.attribute13, hr_api.g_varchar2) <>
82     nvl(p_rec.attribute13, hr_api.g_varchar2)  or
83     nvl(per_pma_shd.g_old_rec.attribute14, hr_api.g_varchar2) <>
84     nvl(p_rec.attribute14, hr_api.g_varchar2)  or
85     nvl(per_pma_shd.g_old_rec.attribute15, hr_api.g_varchar2) <>
86     nvl(p_rec.attribute15, hr_api.g_varchar2)  or
87     nvl(per_pma_shd.g_old_rec.attribute16, hr_api.g_varchar2) <>
88     nvl(p_rec.attribute16, hr_api.g_varchar2)  or
89     nvl(per_pma_shd.g_old_rec.attribute17, hr_api.g_varchar2) <>
90     nvl(p_rec.attribute17, hr_api.g_varchar2)  or
91     nvl(per_pma_shd.g_old_rec.attribute18, hr_api.g_varchar2) <>
92     nvl(p_rec.attribute18, hr_api.g_varchar2)  or
93     nvl(per_pma_shd.g_old_rec.attribute19, hr_api.g_varchar2) <>
94     nvl(p_rec.attribute19, hr_api.g_varchar2)  or
95     nvl(per_pma_shd.g_old_rec.attribute20, hr_api.g_varchar2) <>
96     nvl(p_rec.attribute20, hr_api.g_varchar2)  or
97     nvl(per_pma_shd.g_old_rec.attribute21, hr_api.g_varchar2) <>
98     nvl(p_rec.attribute21, hr_api.g_varchar2)  or
99     nvl(per_pma_shd.g_old_rec.attribute22, hr_api.g_varchar2) <>
100     nvl(p_rec.attribute22, hr_api.g_varchar2)  or
101     nvl(per_pma_shd.g_old_rec.attribute23, hr_api.g_varchar2) <>
102     nvl(p_rec.attribute23, hr_api.g_varchar2)  or
103     nvl(per_pma_shd.g_old_rec.attribute24, hr_api.g_varchar2) <>
104     nvl(p_rec.attribute24, hr_api.g_varchar2)  or
105     nvl(per_pma_shd.g_old_rec.attribute25, hr_api.g_varchar2) <>
106     nvl(p_rec.attribute25, hr_api.g_varchar2)  or
107     nvl(per_pma_shd.g_old_rec.attribute26, hr_api.g_varchar2) <>
108     nvl(p_rec.attribute26, hr_api.g_varchar2)  or
109     nvl(per_pma_shd.g_old_rec.attribute27, hr_api.g_varchar2) <>
110     nvl(p_rec.attribute27, hr_api.g_varchar2)  or
111     nvl(per_pma_shd.g_old_rec.attribute28, hr_api.g_varchar2) <>
112     nvl(p_rec.attribute28, hr_api.g_varchar2)  or
113     nvl(per_pma_shd.g_old_rec.attribute29, hr_api.g_varchar2) <>
114     nvl(p_rec.attribute29, hr_api.g_varchar2)  or
115     nvl(per_pma_shd.g_old_rec.attribute30, hr_api.g_varchar2) <>
116     nvl(p_rec.attribute30, hr_api.g_varchar2) ))
117     or (p_rec.appraisal_period_id is null)  then
118     --
119     -- Only execute the validation if absolutely necessary:
120     -- a) During update, the structure column value or any
121     --    of the attribute values have actually changed.
122     -- b) During insert.
123     --
124     hr_dflex_utility.ins_or_upd_descflex_attribs
125       (p_appl_short_name                 => 'PER'
126       ,p_descflex_name                   => 'PER_APPRAISAL_PERIODS'
127       ,p_attribute_category              => p_rec.attribute_category
128       ,p_attribute1_name                 => 'ATTRIBUTE1'
129       ,p_attribute1_value                => p_rec.attribute1
130       ,p_attribute2_name                 => 'ATTRIBUTE2'
131       ,p_attribute2_value                => p_rec.attribute2
132       ,p_attribute3_name                 => 'ATTRIBUTE3'
133       ,p_attribute3_value                => p_rec.attribute3
134       ,p_attribute4_name                 => 'ATTRIBUTE4'
135       ,p_attribute4_value                => p_rec.attribute4
136       ,p_attribute5_name                 => 'ATTRIBUTE5'
137       ,p_attribute5_value                => p_rec.attribute5
138       ,p_attribute6_name                 => 'ATTRIBUTE6'
139       ,p_attribute6_value                => p_rec.attribute6
140       ,p_attribute7_name                 => 'ATTRIBUTE7'
141       ,p_attribute7_value                => p_rec.attribute7
142       ,p_attribute8_name                 => 'ATTRIBUTE8'
143       ,p_attribute8_value                => p_rec.attribute8
144       ,p_attribute9_name                 => 'ATTRIBUTE9'
145       ,p_attribute9_value                => p_rec.attribute9
146       ,p_attribute10_name                => 'ATTRIBUTE10'
147       ,p_attribute10_value               => p_rec.attribute10
148       ,p_attribute11_name                => 'ATTRIBUTE11'
149       ,p_attribute11_value               => p_rec.attribute11
150       ,p_attribute12_name                => 'ATTRIBUTE12'
151       ,p_attribute12_value               => p_rec.attribute12
152       ,p_attribute13_name                => 'ATTRIBUTE13'
153       ,p_attribute13_value               => p_rec.attribute13
154       ,p_attribute14_name                => 'ATTRIBUTE14'
155       ,p_attribute14_value               => p_rec.attribute14
156       ,p_attribute15_name                => 'ATTRIBUTE15'
157       ,p_attribute15_value               => p_rec.attribute15
158       ,p_attribute16_name                => 'ATTRIBUTE16'
159       ,p_attribute16_value               => p_rec.attribute16
160       ,p_attribute17_name                => 'ATTRIBUTE17'
161       ,p_attribute17_value               => p_rec.attribute17
162       ,p_attribute18_name                => 'ATTRIBUTE18'
163       ,p_attribute18_value               => p_rec.attribute18
164       ,p_attribute19_name                => 'ATTRIBUTE19'
165       ,p_attribute19_value               => p_rec.attribute19
166       ,p_attribute20_name                => 'ATTRIBUTE20'
167       ,p_attribute20_value               => p_rec.attribute20
168       ,p_attribute21_name                => 'ATTRIBUTE21'
169       ,p_attribute21_value               => p_rec.attribute21
170       ,p_attribute22_name                => 'ATTRIBUTE22'
171       ,p_attribute22_value               => p_rec.attribute22
172       ,p_attribute23_name                => 'ATTRIBUTE23'
173       ,p_attribute23_value               => p_rec.attribute23
174       ,p_attribute24_name                => 'ATTRIBUTE24'
175       ,p_attribute24_value               => p_rec.attribute24
176       ,p_attribute25_name                => 'ATTRIBUTE25'
177       ,p_attribute25_value               => p_rec.attribute25
178       ,p_attribute26_name                => 'ATTRIBUTE26'
179       ,p_attribute26_value               => p_rec.attribute26
180       ,p_attribute27_name                => 'ATTRIBUTE27'
181       ,p_attribute27_value               => p_rec.attribute27
182       ,p_attribute28_name                => 'ATTRIBUTE28'
183       ,p_attribute28_value               => p_rec.attribute28
184       ,p_attribute29_name                => 'ATTRIBUTE29'
185       ,p_attribute29_value               => p_rec.attribute29
186       ,p_attribute30_name                => 'ATTRIBUTE30'
187       ,p_attribute30_value               => p_rec.attribute30
188       );
189   end if;
190   --
191   hr_utility.set_location(' Leaving:'||l_proc,20);
192 end chk_df;
193 --
194 -- ----------------------------------------------------------------------------
195 -- |---------------------------< chk_start_date >----------------------------|
196 -- ----------------------------------------------------------------------------
197 Procedure chk_start_date
198  (p_task_start_date  in date
199  )is
200  --
201  l_proc  varchar2(72) := g_package||'chk_start_date';
202  --
203 
204 Begin
205  hr_utility.set_location('Entering:'||l_proc, 5);
206  hr_api.mandatory_arg_error
207           (p_api_name       => l_proc
208           ,p_argument       => 'p_task_start_date'
209           ,p_argument_value => p_task_start_date
210           );
211 IF trunc(p_task_start_date)  < trunc(sysdate) THEN
212      fnd_message.set_name('PER', 'HR_APPR_TASK_DT_BEFORE_SYSDATE');
213      fnd_message.raise_error;
214    END IF;
215 hr_utility.set_location(' Leaving:'||l_proc, 980);
216 End chk_start_date;
217 --
218 
219 --
220 --
221 -- ----------------------------------------------------------------------------
222 -- |-----------------------< chk_non_updateable_args >------------------------|
223 -- ----------------------------------------------------------------------------
224 -- {Start Of Comments}
225 --
226 -- Description:
227 --   This procedure is used to ensure that non updateable attributes have
228 --   not been updated. If an attribute has been updated an error is generated.
229 --
230 -- Pre Conditions:
231 --   g_old_rec has been populated with details of the values currently in
232 --   the database.
233 --
234 -- In Arguments:
235 --   p_rec has been populated with the updated values the user would like the
236 --   record set to.
237 --
238 -- Post Success:
239 --   Processing continues if all the non updateable attributes have not
240 --   changed.
241 --
242 -- Post Failure:
243 --   An application error is raised if any of the non updatable attributes
244 --   have been altered.
245 --
246 -- {End Of Comments}
247 -- ----------------------------------------------------------------------------
248 Procedure chk_non_updateable_args
249   (p_effective_date               in date
250   ,p_rec in per_pma_shd.g_rec_type
251   ) IS
252 --
253   l_proc     varchar2(72) := g_package || 'chk_non_updateable_args';
254   l_error    EXCEPTION;
255   l_argument varchar2(30);
256 --
257 Begin
258   --
259   -- Only proceed with the validation if a row exists for the current
260   -- record in the HR Schema.
261   --
262   IF NOT per_pma_shd.api_updating
263       (p_appraisal_period_id               => p_rec.appraisal_period_id
264       ,p_object_version_number             => p_rec.object_version_number
265       ) THEN
266      fnd_message.set_name('PER', 'HR_6153_ALL_PROCEDURE_FAIL');
267      fnd_message.set_token('PROCEDURE ', l_proc);
268      fnd_message.set_token('STEP ', '5');
269      fnd_message.raise_error;
270   END IF;
271   --
272   hr_utility.set_location(l_proc, 10);
273   if nvl(p_rec.plan_id,hr_api.g_number) <>
274      per_pma_shd.g_old_rec.plan_id then
275      l_argument := 'plan_id';
276      raise l_error;
277   end if;
278   --
279   hr_utility.set_location(l_proc, 20);
280   if nvl(p_rec.appraisal_template_id,hr_api.g_number) <>
281      per_pma_shd.g_old_rec.appraisal_template_id then
282      l_argument := 'appraisal_template_id';
283      raise l_error;
284   end if;
285   --
286   hr_utility.set_location(l_proc, 30);
287   --
288   EXCEPTION
289     WHEN l_error THEN
290        hr_api.argument_changed_error
291          (p_api_name   => l_proc
292          ,p_argument   => l_argument
293          ,p_base_table => per_pma_shd.g_tab_nam);
294     WHEN OTHERS THEN
295        RAISE;
296 End chk_non_updateable_args;
297 --
298 -- ----------------------------------------------------------------------------
299 -- |-----------------------< chk_plan_id >------------------------------------|
300 -- ----------------------------------------------------------------------------
301 -- {Start Of Comments}
302 --
303 -- Description:
304 --   This procedure is used to validate that the specified performance
305 --   management plan exists.
306 --
307 -- Pre Conditions:
308 --   The plan must already exist.
309 --
310 -- In Arguments:
311 --
312 --
313 -- Post Success:
314 --   Processing continues if the plan is valid.
315 --
316 -- Post Failure:
317 --   An application error is raised if the plan does not exist.
318 --
319 -- {End Of Comments}
320 -- ----------------------------------------------------------------------------
321 Procedure chk_plan_id
322   (p_plan_id          IN number
323   ) IS
324 
325   --
326   l_proc          varchar2(72) := g_package || 'chk_plan_id';
327   l_plan_id       number;
328   --
329 
330   CURSOR csr_chk_plan_id IS
331   SELECT pmp.plan_id
332   FROM   per_perf_mgmt_plans pmp
333   WHERE  pmp.plan_id = p_plan_id;
334 --
335 BEGIN
336 
337   IF g_debug THEN hr_utility.set_location('Entering:'|| l_proc, 10); END IF;
338 
339   hr_api.mandatory_arg_error
340           (p_api_name       => l_proc
341           ,p_argument       => 'p_plan_id'
342           ,p_argument_value => p_plan_id
343           );
344 
345   --
346   -- Check that plan exists.
347   --
348   IF g_debug THEN hr_utility.set_location(l_proc, 20); END IF;
349   OPEN  csr_chk_plan_id;
350   FETCH csr_chk_plan_id INTO l_plan_id;
351   CLOSE csr_chk_plan_id;
352 
353   IF l_plan_id IS null THEN
354     fnd_message.set_name('PER', 'HR_50264_PMS_INVALID_PLAN');
355     fnd_message.raise_error;
356   END IF;
357 
358   IF g_debug THEN hr_utility.set_location('Leaving:'|| l_proc, 970); END IF;
359 
360 EXCEPTION
361 
362   WHEN app_exception.application_exception THEN
366       hr_utility.set_location(' Leaving:'|| l_proc, 980);
363     IF hr_multi_message.exception_add
364       (p_associated_column1 => 'PER_APPRAISAL_PERIODS.PLAN_ID')
365     THEN
367       RAISE;
368     END IF;
369     hr_utility.set_location(' Leaving:'|| l_proc, 990);
370 
371 END chk_plan_id;
372 --
373 -- ----------------------------------------------------------------------------
374 -- |-----------------------< chk_appraisal_template_id >----------------------|
375 -- ----------------------------------------------------------------------------
376 -- {Start Of Comments}
377 --
378 -- Description:
379 --   This procedure is used to validate that the specified appraisal
380 --   template exists.
381 --
382 -- Pre Conditions:
383 --   The appraisal template must already exist.
384 --
385 -- In Arguments:
386 --
387 --
388 -- Post Success:
389 --   Processing continues if the appraisal template is valid.
390 --
391 -- Post Failure:
392 --   An application error is raised if the appraisal template does not exist.
393 --
394 -- {End Of Comments}
395 -- ----------------------------------------------------------------------------
396 Procedure chk_appraisal_template_id
397   (p_appraisal_template_id   IN number
398   ) IS
399 
400   --
401   l_proc          varchar2(72) := g_package || 'chk_appraisal_template_id';
402   l_template_id   number;
403   --
404 
405   CURSOR csr_chk_template IS
406   SELECT apt.appraisal_template_id
407   FROM   per_appraisal_templates apt
408   WHERE  apt.appraisal_template_id = p_appraisal_template_id;
409 --
410 BEGIN
411 
412   IF g_debug THEN hr_utility.set_location('Entering:'|| l_proc, 10); END IF;
413 
414   hr_api.mandatory_arg_error
415           (p_api_name       => l_proc
416           ,p_argument       => 'p_appraisal_template_id'
417           ,p_argument_value => p_appraisal_template_id
418           );
419 
420   --
421   -- Check that template exists.
422   --
423   IF g_debug THEN hr_utility.set_location(l_proc, 20); END IF;
424   OPEN  csr_chk_template;
425   FETCH csr_chk_template INTO l_template_id;
426   CLOSE csr_chk_template;
427 
428   IF l_template_id IS null THEN
429     fnd_message.set_name('PER', 'HR_50299_PMA_TEMPLATE_INVALID');
430     fnd_message.raise_error;
431   END IF;
432 
433   IF g_debug THEN hr_utility.set_location('Leaving:'|| l_proc, 970); END IF;
434 
435 EXCEPTION
436 
437   WHEN app_exception.application_exception THEN
438     IF hr_multi_message.exception_add
439       (p_associated_column1 => 'PER_APPRAISAL_PERIODS.APPRAISAL_TEMPLATE_ID')
440     THEN
441       hr_utility.set_location(' Leaving:'|| l_proc, 980);
442       RAISE;
443     END IF;
444     hr_utility.set_location(' Leaving:'|| l_proc, 990);
445 
446 END chk_appraisal_template_id;
447 --
448 -- ----------------------------------------------------------------------------
449 -- |-----------------------< chk_dates >--------------------------------------|
450 -- ----------------------------------------------------------------------------
451 -- {Start Of Comments}
452 --
453 -- Description:
454 --   This procedure checks the start and end date of the appraisal period.
455 --   It first checks that the start date is earlier than the end date,
456 --   then it checks that the appraisal period dates are within the dates
457 --   of the performance management plan and finally it checks that the
458 --   dates fall within the dates of the appraisal template.
459 --
460 -- Pre Conditions:
461 --   The plan and appraisal template must exist and have been validated.
462 --
463 -- In Arguments:
464 --
465 --
466 -- Post Success:
467 --   Processing continues if the dates are valid.
468 --
469 -- Post Failure:
470 --   An application error is raised if the dates are invalid.
471 --
472 -- {End Of Comments}
473 -- ----------------------------------------------------------------------------
474 Procedure chk_dates
475   (p_appraisal_period_id   IN number
476   ,p_object_version_number IN number
477   ,p_plan_id               IN number
478   ,p_appraisal_template_id IN number
479   ,p_start_date            IN date
480   ,p_end_date              IN date
481   ) IS
482 
483   --
484   l_proc           varchar2(72) := g_package || 'chk_dates';
485   l_api_updating   boolean;
486   l_pmp_start_date date;
487   l_pmp_end_date   date;
488   l_apt_date_from  date;
489   l_apt_date_to    date;
490   l_pap_start_date date;
491   l_pap_end_date   date;
492   l_row_found      varchar2(1)  := 'N';
493   --
494 
495   CURSOR csr_dates_within_plan IS
496   SELECT pmp.start_date, pmp.end_date
497   FROM   per_perf_mgmt_plans pmp
498   WHERE  pmp.plan_id = p_plan_id;
499 
500   CURSOR csr_dates_within_template IS
501   SELECT apt.date_from, apt.date_to
502   FROM   per_appraisal_templates apt
503   WHERE  apt.appraisal_template_id = p_appraisal_template_id;
504 --
505 BEGIN
506 
507   IF g_debug THEN hr_utility.set_location('Entering:'|| l_proc, 10); END IF;
508 
509   --
510   hr_api.mandatory_arg_error
514           );
511           (p_api_name       => l_proc
512           ,p_argument       => 'p_start_date'
513           ,p_argument_value => p_start_date
515   --
516   hr_api.mandatory_arg_error
517           (p_api_name       => l_proc
518           ,p_argument       => 'p_end_date'
519           ,p_argument_value => p_end_date
520           );
521 
522   --
523   -- Only proceed with validation if :
524   -- a) The current g_old_rec is current and
525   -- b) The date values have changed
526   --
527   l_api_updating := per_pma_shd.api_updating
528          (p_appraisal_period_id    => p_appraisal_period_id
529          ,p_object_version_number  => p_object_version_number);
530   --
531   IF (l_api_updating
532   AND nvl(per_pma_shd.g_old_rec.start_date, hr_api.g_date)
533     = nvl(p_start_date, hr_api.g_date)
534   AND nvl(per_pma_shd.g_old_rec.end_date, hr_api.g_date)
535     = nvl(p_end_date, hr_api.g_date))
536   THEN
537      RETURN;
538   END IF;
539 
540   IF g_debug THEN hr_utility.set_location(l_proc, 20); END IF;
541 
542   --
543   -- Check that the appraisal period's start date is not later
544   -- than the end date.
545   --
546   IF p_start_date > p_end_date THEN
547     fnd_message.set_name('PER', 'HR_50233_WPM_PLAN_DATES');
548     fnd_message.raise_error;
549   END IF;
550 
551   IF g_debug THEN hr_utility.set_location(l_proc, 30); END IF;
552 
553   --
554   -- Check that the appraisal period is within the plan dates.
555   --
556   IF g_debug THEN hr_utility.set_location(l_proc, 40); END IF;
557   OPEN  csr_dates_within_plan;
558   FETCH csr_dates_within_plan INTO l_pmp_start_date
559                                   ,l_pmp_end_date;
560   CLOSE csr_dates_within_plan;
561 
562   IF p_start_date < l_pmp_start_date
563    OR p_end_date > l_pmp_end_date
564   THEN
565     fnd_message.set_name('PER', 'HR_50391_PMA_PLAN_DATES');
566     fnd_message.raise_error;
567   END IF;
568 
569   --
570   -- Check that the appraisal period is within the template dates.
571   --
572   IF g_debug THEN hr_utility.set_location(l_proc, 50); END IF;
573   OPEN  csr_dates_within_template;
574   FETCH csr_dates_within_template INTO l_apt_date_from
575                                       ,l_apt_date_to;
576   CLOSE csr_dates_within_template;
577 
578   IF p_start_date < nvl(l_apt_date_from, hr_api.g_sot)
579    OR p_end_date > nvl(l_apt_date_to, hr_api.g_eot)
580   THEN
581     fnd_message.set_name('PER', 'HR_50393_PMA_TEMPLATE_DATES');
582     fnd_message.raise_error;
583   END IF;
584 
585 
586   IF g_debug THEN hr_utility.set_location('Leaving:'|| l_proc, 970); END IF;
587 
588 EXCEPTION
589 
590   WHEN app_exception.application_exception THEN
591     IF hr_multi_message.exception_add
592       (p_associated_column1 => 'PER_APPRAISAL_PERIODS.START_DATE'
593       ,p_associated_column2 => 'PER_APPRAISAL_PERIODS.END_DATE')
594     THEN
595       hr_utility.set_location(' Leaving:'|| l_proc, 980);
596       RAISE;
597     END IF;
598     hr_utility.set_location(' Leaving:'|| l_proc, 990);
599 
600 END chk_dates;
601 --
602 -- ----------------------------------------------------------------------------
603 -- |-----------------------< chk_duplicate >----------------------------------|
604 -- ----------------------------------------------------------------------------
605 -- {Start Of Comments}
606 --
607 -- Description:
608 --   This procedure is used to validate that a personal scorecard does not
609 --   already exist for the given assignment and given plan.
610 --
611 -- Pre Conditions:
612 --   The plan and assignment must exist and have been validated.
613 --
614 -- In Arguments:
615 --
616 --
617 -- Post Success:
618 --   Processing continues if the scorecard is not a duplicate.
619 --
620 -- Post Failure:
621 --   An application error is raised if the scorecard is a duplicate.
622 --
623 -- {End Of Comments}
624 -- ----------------------------------------------------------------------------
625 Procedure chk_duplicate
626   (p_appraisal_period_id   IN number
627   ,p_object_version_number IN number
628   ,p_plan_id               IN number
629   ,p_appraisal_template_id IN number
630   ,p_start_date            IN date
631   ,p_end_date              IN date
632   ) IS
633 
634   --
635   l_proc           varchar2(72) := g_package || 'chk_duplicate';
636   l_api_updating   boolean;
637   l_dup            varchar2(5) := 'FALSE';
638   --
639 
640   CURSOR csr_chk_duplicate IS
641   SELECT 'TRUE'
642   FROM   per_appraisal_periods pma
643   WHERE  pma.plan_id = p_plan_id
644   AND    pma.appraisal_template_id = p_appraisal_template_id
645   AND    pma.start_date = p_start_date
646   AND    pma.end_date = p_end_date
647   AND    pma.appraisal_period_id <> nvl(p_appraisal_period_id, hr_api.g_number);
648 --
649 BEGIN
650 
651   IF g_debug THEN hr_utility.set_location('Entering:'|| l_proc, 10); END IF;
652 
653   --
654   -- Only proceed with validation if :
655   -- a) The current g_old_rec is current and
659          (p_appraisal_period_id    => p_appraisal_period_id
656   -- b) The date values have changed
657   --
658   l_api_updating := per_pma_shd.api_updating
660          ,p_object_version_number  => p_object_version_number);
661   --
662   IF (l_api_updating
663   AND nvl(per_pma_shd.g_old_rec.plan_id, hr_api.g_number)
664     = nvl(p_plan_id, hr_api.g_number)
665   AND nvl(per_pma_shd.g_old_rec.appraisal_template_id, hr_api.g_number)
666     = nvl(p_appraisal_template_id, hr_api.g_number)
667   AND nvl(per_pma_shd.g_old_rec.start_date, hr_api.g_date)
668     = nvl(p_start_date, hr_api.g_date)
669   AND nvl(per_pma_shd.g_old_rec.end_date, hr_api.g_date)
670     = nvl(p_end_date, hr_api.g_date))
671   THEN
672      RETURN;
673   END IF;
674 
675   --
676   -- Check that the plan is not a duplicate.
677   --
678   IF g_debug THEN hr_utility.set_location(l_proc, 20); END IF;
679   OPEN  csr_chk_duplicate;
680   FETCH csr_chk_duplicate INTO l_dup;
681   CLOSE csr_chk_duplicate;
682 
683   IF l_dup = 'TRUE' THEN
684     fnd_message.set_name('PER', 'HR_50394_PMA_DUP_ERROR');
685     fnd_message.raise_error;
686   END IF;
687 
688   IF g_debug THEN hr_utility.set_location('Leaving:'|| l_proc, 970); END IF;
689 
690 EXCEPTION
691 
692   WHEN app_exception.application_exception THEN
693     IF hr_multi_message.exception_add
694       (p_associated_column1 => 'PER_PERSONAL_SCORECARDS.PLAN_ID'
695       ,p_associated_column2 => 'PER_PERSONAL_SCORECARDS.APPRAISAL_TEMPLATE_ID'
696       ,p_associated_column3 => 'PER_PERSONAL_SCORECARDS.START_DATE'
697       ,p_associated_column4 => 'PER_PERSONAL_SCORECARDS.START_END')
698     THEN
699       hr_utility.set_location(' Leaving:'|| l_proc, 980);
700       RAISE;
701     END IF;
702     hr_utility.set_location(' Leaving:'|| l_proc, 990);
703 
704 END chk_duplicate;
705 --
706 -- ----------------------------------------------------------------------------
707 -- |--------------------------< chk_initiator_code >--------------------------|
708 -- ----------------------------------------------------------------------------
709 -- {Start Of Comments}
710 --
711 -- Description:
712 --   Checks that the status code is a valid lookup code in the lookup type
713 --   HR_WPM_INITIATOR.
714 --
715 -- Prerequisites:
716 --   None.
717 --
718 -- In Arguments:
719 --
720 --
721 -- Post Success:
722 --  Processing continues if the status code is valid.
723 --
724 -- Post Failure:
725 --  An application error is raised if the status code is not valid.
726 --
727 -- Access Status:
728 --   Internal Row Handler Use Only.
729 --
730 -- {End Of Comments}
731 -- ----------------------------------------------------------------------------
732 procedure chk_initiator_code
733   (p_appraisal_period_id     in  number
734   ,p_object_version_number   in  number
735   ,p_effective_date          in  date
736   ,p_initiator_code             in  varchar2
737   ) is
738 
739  -- Declare local variables
740 
741     l_proc         varchar2(72) :=  g_package||'chk_status_code';
742     l_api_updating boolean;
743 
744 Begin
745 
746 IF g_debug THEN hr_utility.set_location('Entering:'|| l_proc, 10); END IF;
747 
748     --
749     hr_api.mandatory_arg_error
750             (p_api_name       => l_proc
751             ,p_argument       => 'p_initiator_code'
752             ,p_argument_value => p_initiator_code
753             );
754     --
755     -- Only proceed with validation if :
756     -- a) The current g_old_rec is current and
757     -- b) The date values have changed
758     --
759     l_api_updating := per_pma_shd.api_updating
760            (p_appraisal_period_id   => p_appraisal_period_id
761            ,p_object_version_number => p_object_version_number);
762     --
763     IF (l_api_updating
764     AND nvl(per_pma_shd.g_old_rec.initiator_code, hr_api.g_varchar2)
765       = nvl(p_initiator_code, hr_api.g_varchar2))
766     THEN
767         RETURN;
768     END IF;
769 
770     IF g_debug THEN hr_utility.set_location(l_proc, 20); END IF;
771 
772     --
773     -- Checks that the status code is valid
774     --
775     IF hr_api.not_exists_in_hrstanlookups
776          (p_effective_date        => p_effective_date
777          ,p_lookup_type           => 'HR_WPM_INITIATOR'
778          ,p_lookup_code           => p_initiator_code
779          ) THEN
780        fnd_message.set_name('PER','HR_50234_WPM_PLAN_STATUS');
781        fnd_message.raise_error;
782     END IF;
783 
784     IF g_debug THEN hr_utility.set_location('Leaving:'|| l_proc, 970); END IF;
785 
786 exception
787   when app_exception.application_exception then
788     IF hr_multi_message.exception_add
789     (p_associated_column1 =>  'PER_APPRAISAL_PERIODS.INITIATOR_CODE'
790     ) THEN
791       hr_utility.set_location(' Leaving:'||l_proc, 980);
792       raise;
793     END IF;
794    hr_utility.set_location(' Leaving:'||l_proc, 990);
795 
796 
797 End chk_initiator_code;
798 --
799 -- ----------------------------------------------------------------------------
800 -- |------------------------< chk_task_dates >--------------------------------|
801 -- ----------------------------------------------------------------------------
802 -- {Start Of Comments}
803 --
804 -- Description:
805 --   This procedure checks the task start and task end date of the appraisal
806 --   period.
807 --   It checks that the task start date is earlier than the task end date.
808 --
809 -- Pre Conditions:
810 --   The plan and appraisal template must exist and have been validated.
811 --
812 -- In Arguments:
813 --
814 --
815 -- Post Success:
816 --   Processing continues if the dates are valid.
817 --
818 -- Post Failure:
819 --   An application error is raised if the dates are invalid.
820 --
821 -- {End Of Comments}
822 -- ----------------------------------------------------------------------------
823 Procedure chk_task_dates
824   (p_task_start_date            IN date
825   ,p_task_end_date              IN date
826   ) IS
827 
828   --
829   l_proc           varchar2(72) := g_package || 'chk_task_dates';
830 
831 BEGIN
832 
833    IF g_debug THEN hr_utility.set_location('Entering:'|| l_proc, 10); END IF;
834 
835    --
836    hr_api.mandatory_arg_error
837           (p_api_name       => l_proc
838           ,p_argument       => 'p_task_start_date'
839           ,p_argument_value => p_task_start_date
840           );
841    --
842    hr_api.mandatory_arg_error
843           (p_api_name       => l_proc
844           ,p_argument       => 'p_task_end_date'
845           ,p_argument_value => p_task_end_date
846           );
847 
848    --
849    -- Check that the appraisal period's task start date is not later
850    -- than the task end date.
851    --
852    IF p_task_start_date > p_task_end_date THEN
853      fnd_message.set_name('PER', 'HR_50417_WPM_PLAN_DATES');
854      fnd_message.raise_error;
855    END IF;
856 
857    IF g_debug THEN hr_utility.set_location('Leaving:'|| l_proc, 970); END IF;
858 
859 EXCEPTION
860 
861   WHEN app_exception.application_exception THEN
862     IF hr_multi_message.exception_add
863       (p_associated_column1 => 'PER_APPRAISAL_PERIODS.TASK_START_DATE'
864       ,p_associated_column2 => 'PER_APPRAISAL_PERIODS.TASK_END_DATE')
865     THEN
866       hr_utility.set_location(' Leaving:'|| l_proc, 980);
867       RAISE;
868     END IF;
869     hr_utility.set_location(' Leaving:'|| l_proc, 990);
870 
871 END chk_task_dates;
872 --
873 -- ----------------------------------------------------------------------------
874 -- |---------------------------< insert_validate >----------------------------|
875 -- ----------------------------------------------------------------------------
876 Procedure insert_validate
877   (p_effective_date               in date
878   ,p_rec                          in per_pma_shd.g_rec_type
879   ) is
880 --
881   l_proc  varchar2(72) := g_package||'insert_validate';
882 --
883 Begin
884   IF g_debug THEN hr_utility.set_location('Entering:'||l_proc, 5); END IF;
885   --
886   -- Call all supporting business operations
887   --
888   -- No business group context. HR_STANDARD_LOOKUPS used for validation.
889 
890   --
891   -- Validate Dependent Attributes
892   --
893   chk_plan_id
894     (p_plan_id                => p_rec.plan_id);
895 
896   IF g_debug THEN hr_utility.set_location(l_proc, 10); END IF;
897 
898   chk_appraisal_template_id
899     (p_appraisal_template_id  => p_rec.appraisal_template_id);
900 
901   --
902   -- End important validation
903   --
904   hr_multi_message.end_validation_set;
905 
906   IF g_debug THEN hr_utility.set_location(l_proc, 20); END IF;
907 
908   --
909   -- Validate Independent Attributes
910   --
911   chk_dates
912     (p_appraisal_period_id     => p_rec.appraisal_period_id
913     ,p_object_version_number   => p_rec.object_version_number
914     ,p_plan_id                 => p_rec.plan_id
915     ,p_appraisal_template_id   => p_rec.appraisal_template_id
916     ,p_start_date              => p_rec.start_date
917     ,p_end_date                => p_rec.end_date);
918 
919   IF g_debug THEN hr_utility.set_location(l_proc, 30); END IF;
920 
921   chk_duplicate
922     (p_appraisal_period_id     => p_rec.appraisal_period_id
923     ,p_object_version_number   => p_rec.object_version_number
924     ,p_plan_id                 => p_rec.plan_id
925     ,p_appraisal_template_id   => p_rec.appraisal_template_id
926     ,p_start_date              => p_rec.start_date
927     ,p_end_date                => p_rec.end_date);
928 
929   chk_initiator_code
930     (p_appraisal_period_id     => p_rec.appraisal_period_id
931     ,p_object_version_number   => p_rec.object_version_number
932     ,p_effective_date          => p_effective_date
933     ,p_initiator_code          => p_rec.initiator_code);
934 
935   chk_task_dates
936   (p_task_start_date           => p_rec.task_start_date
937   ,p_task_end_date             => p_rec.task_end_date);
938 
939   chk_start_date
940   (p_task_start_date             => p_rec.task_start_date);
941 
942   per_pma_bus.chk_df(p_rec);
943   --
944   hr_utility.set_location(' Leaving:'||l_proc, 980);
945 
946 End insert_validate;
947 --
948 -- ----------------------------------------------------------------------------
949 -- |---------------------------< update_validate >----------------------------|
950 -- ----------------------------------------------------------------------------
951 Procedure update_validate
952   (p_effective_date               in date
953   ,p_rec                          in per_pma_shd.g_rec_type
954   ) is
955 --
956   l_proc  varchar2(72) := g_package||'update_validate';
957 --
958 Begin
959   hr_utility.set_location('Entering:'||l_proc, 5);
960   --
961   -- Call all supporting business operations
962   --
963   -- No business group context. HR_STANDARD_LOOKUPS used for validation.
964   --
965   chk_non_updateable_args
966     (p_effective_date   => p_effective_date
967     ,p_rec              => p_rec
968     );
969 
970   IF g_debug THEN hr_utility.set_location(l_proc, 10); END IF;
971 
972   --
973   -- Validate Independent Attributes
974   --
975   chk_dates
976     (p_appraisal_period_id     => p_rec.appraisal_period_id
977     ,p_object_version_number   => p_rec.object_version_number
978     ,p_plan_id                 => p_rec.plan_id
979     ,p_appraisal_template_id   => p_rec.appraisal_template_id
980     ,p_start_date              => p_rec.start_date
981     ,p_end_date                => p_rec.end_date);
982 
983   IF g_debug THEN hr_utility.set_location(l_proc, 20); END IF;
984 
985   chk_duplicate
986     (p_appraisal_period_id     => p_rec.appraisal_period_id
987     ,p_object_version_number   => p_rec.object_version_number
988     ,p_plan_id                 => p_rec.plan_id
989     ,p_appraisal_template_id   => p_rec.appraisal_template_id
990     ,p_start_date              => p_rec.start_date
991     ,p_end_date                => p_rec.end_date);
992 
993   chk_initiator_code
994     (p_appraisal_period_id     => p_rec.appraisal_period_id
995     ,p_object_version_number   => p_rec.object_version_number
996     ,p_effective_date          => p_effective_date
997     ,p_initiator_code          => p_rec.initiator_code);
998 
999   chk_task_dates
1000   (p_task_start_date           => p_rec.task_start_date
1001   ,p_task_end_date             => p_rec.task_end_date);
1002 
1003 --
1004 if( nvl(per_pma_shd.g_old_rec.task_start_date, hr_api.g_date)
1005     <> nvl(p_rec.task_start_date, hr_api.g_date)) then
1006     chk_start_date(p_task_start_date           => p_rec.task_start_date);
1007     end if;
1008 --
1009 
1010   --
1011   per_pma_bus.chk_df(p_rec);
1012   --
1013   hr_utility.set_location(' Leaving:'||l_proc, 980);
1014 
1015 End update_validate;
1016 --
1017 -- ----------------------------------------------------------------------------
1018 -- |---------------------------< delete_validate >----------------------------|
1019 -- ----------------------------------------------------------------------------
1020 Procedure delete_validate
1021   (p_rec                          in per_pma_shd.g_rec_type
1022   ) is
1023 --
1024   l_proc  varchar2(72) := g_package||'delete_validate';
1025 --
1026 Begin
1027   hr_utility.set_location('Entering:'||l_proc, 5);
1028   --
1029   -- Call all supporting business operations
1030   --
1031   hr_utility.set_location(' Leaving:'||l_proc, 10);
1032 End delete_validate;
1033 --
1034 end per_pma_bus;