DBA Data[Home] [Help]

PACKAGE BODY: APPS.PAY_ORG_PAY_METH_USAGES_F_PKG

Source


1 PACKAGE BODY PAY_ORG_PAY_METH_USAGES_F_PKG as
2 /* $Header: pyopu01t.pkb 120.0.12010000.2 2009/04/14 06:45:54 parusia ship $ */
3 --
4 --
5  -----------------------------------------------------------------------------
6  -- Name                                                                    --
7  --   opmu_end_date                                                         --
8  -- Purpose                                                                 --
9  --   Returns the date effective end date of an OPMU that is about to be    --
10  --   created. This takes into account future opmu's and also the end date  --
11  --   of the opm.                                                           --
12  -- Arguments                                                               --
13  --   See below.                                                            --
14  -- Notes                                                                   --
15  --                                                                         --
16  -----------------------------------------------------------------------------
17 --
18  function opmu_end_date
19  (
20   p_org_pay_method_usage_id number,
21   p_payroll_id              number,
22   p_org_payment_method_id   number,
23   p_session_date            date,
24   p_validation_start_date   date
25  ) return date is
26 --
27    v_next_opmu_start_date date;
28    v_max_payroll_end_date date;
29    v_max_opm_end_date     date;
30    v_opmu_end_date        date;
31 --
32  begin
33 --
34    -- Get the start date of the earliest future opmu if it exists.
35    begin
36      select min(opmu.effective_start_date)
37      into   v_next_opmu_start_date
38      from   pay_org_pay_method_usages_f opmu
39      where  opmu.payroll_id = p_payroll_id
40        and  opmu.org_payment_method_id = p_org_payment_method_id
41        and  opmu.effective_end_date >= p_session_date
42        and  opmu.org_pay_method_usage_id <> nvl(p_org_pay_method_usage_id,0);
43    exception
44      when no_data_found then null;
45    end;
46 --
47    -- If there are no future opmus , get the least of hte max end date of the
48    -- payroll and opm..
49    if v_next_opmu_start_date is null then
50 --
51      -- Get payroll end date
52      begin
53        select max(prl.effective_end_date)
54        into   v_max_payroll_end_date
55        from   pay_all_payrolls_f prl
56        where  prl.payroll_id = p_payroll_id;
57      exception
58        when no_data_found then
59          hr_utility.set_message(801,'HR_6153_ALL_PROCEDURE_FAIL');
60          hr_utility.set_message_token('PROCEDURE',
61 				      'pay_payrolls_f_pkg.opmu_end_date');
62          hr_utility.set_message_token('STEP','1');
63          hr_utility.raise_error;
64      end;
65 --
66      -- Get opm end date
67      begin
68        select max(opm.effective_end_date)
69        into   v_max_opm_end_date
70        from   pay_org_payment_methods_f opm
71        where  opm.org_payment_method_id = p_org_payment_method_id;
72      exception
73        when no_data_found then
74          hr_utility.set_message(801,'HR_6153_ALL_PROCEDURE_FAIL');
75          hr_utility.set_message_token('PROCEDURE',
76 				      'pay_payrolls_f_pkg.opmu_end_date');
77          hr_utility.set_message_token('STEP','2');
78          hr_utility.raise_error;
79      end;
80 --
81      -- Use the most restrictive date.
82      v_opmu_end_date := least(v_max_payroll_end_date,v_max_opm_end_date);
83 --
84    else
85 --
86      -- Set the date to the day before the next opmu.
87      v_opmu_end_date := v_next_opmu_start_date - 1;
88 --
89    end if;
90 --
91    -- Trying to open up an opmu that would either overlap with an
92    -- existing opmu or extend beyond the lifetime of the opm or payroll
93    -- on which it is based.
94    if v_opmu_end_date < p_validation_start_date then
95 --
96      -- No future opmu was found.
97      if v_next_opmu_start_date is null then
98 --
99        -- Trying to extend the end date of the opmu past the end date
100        -- of the payroll.
101        if v_opmu_end_date = v_max_payroll_end_date then
102 --
103          hr_utility.set_message(801, 'HR_6868_PAY_NO_DNC_PAY');
104 --
105        -- Trying to extend the end date of the opmu past the end date
106        -- of the opm.
107        else
108 --
109 	 hr_utility.set_message(801, 'HR_6870_PAY_NO_DNC_PAYM');
110 --
111        end if;
112 --
113      -- Trying to extend the end date of the opmu such that it will
114      -- overlap with an existing opmu.
115      else
116 --
117        hr_utility.set_message(801, 'HR_6869_PAY_NO_DNC_OPMU');
118 --
119      end if;
120 --
121      hr_utility.raise_error;
122 --
123    end if;
124 --
125    return v_opmu_end_date;
126 --
127  end opmu_end_date;
128 --
129  -----------------------------------------------------------------------------
130  -- Name                                                                    --
131  --   validate_delete_opmu                                                  --
132  -- Purpose                                                                 --
133  --   Checks to see if it is valid to delete the opmu.                      --
134  -- Arguments                                                               --
135  --   See below.                                                            --
136  -- Notes                                                                   --
137  --                                                                         --
138  -----------------------------------------------------------------------------
139 --
140  procedure validate_delete_opmu
141  (
142   p_payroll_id              number,
143   p_org_payment_method_id   number,
144   p_effective_start_date    date,
145   p_effective_end_date      date,
146   p_dt_delete_mode          varchar2,
147   p_validation_start_date   date,
148   p_validation_end_date     date
149  ) is
150 --
151    cursor csr_dflt_pay_meth
152 	  (
153 	   p_payroll_id            number,
154 	   p_org_payment_method_id number,
155 	   p_validation_start_date date,
156 	   p_validation_end_date   date
157 	  ) is
158      select prl.payroll_id
159      from   pay_all_payrolls_f prl
160      where  prl.payroll_id = p_payroll_id
161        and  prl.default_payment_method_id = p_org_payment_method_id
162        and  prl.effective_start_date <= p_validation_end_date
163        and  prl.effective_end_date   >= p_validation_start_date;
164 --
165    cursor csr_ppm
166 	  (
167 	   p_payroll_id            number,
168 	   p_org_payment_method_id number,
169 	   p_validation_start_date date,
170 	   p_validation_end_date   date
171 	  ) is
172      select ppm.personal_payment_method_id
173      from   per_all_assignments_f asg,
174 	    pay_personal_payment_methods_f ppm
175      where  asg.payroll_id = p_payroll_id
176        and  ppm.assignment_id = asg.assignment_id
177        and  ppm.org_payment_method_id = p_org_payment_method_id
178        and  ppm.effective_start_date <= asg.effective_end_date
179        and  ppm.effective_end_date   >= asg.effective_start_date
180        and  ppm.effective_start_date <= p_validation_end_date
181        and  ppm.effective_end_date   >= p_validation_start_date
182        /* Checks added for bug 8419878 */
183        and  asg.effective_start_date <= p_validation_end_date
184        and  asg.effective_end_date   >= p_validation_start_date;
185 --
186    cursor csr_pre_pay
187 	  (
188 	   p_payroll_id            number,
189 	   p_org_payment_method_id number,
190 	   p_validation_start_date date,
191 	   p_validation_end_date   date
192 	  ) is
193      select pp.pre_payment_id
194      from   pay_payroll_actions pa,
195 	    pay_assignment_actions aa,
196 	    pay_pre_payments pp
197      where  pa.payroll_id = p_payroll_id
198        and  aa.payroll_action_id = pa.payroll_action_id
199        and  pp.assignment_action_id = aa.assignment_action_id
200        and  pp.org_payment_method_id = p_org_payment_method_id
201        and  pa.action_type in ('P', 'U')
202        and  pa.effective_date between p_validation_start_date
203 				  and p_validation_end_date;
204 --
205    v_dummy_id              number;
206    v_validation_start_date date;
207    v_validation_end_date   date;
208 --
209  begin
210 --
211    -- NB. the validation for 'DELETE_NEXT_CHANGE' and 'FUTURE_CHANGE is done
212    -- by opmu_end_date ie. it checks for future opmus etc ...
213    if p_dt_delete_mode in ('ZAP','DELETE') then
214 --
215      -- DT code sets the validation dates to the start and end of time when
216      -- doing a ZAP. This would result in a check over a too wide range of
217      -- dates so the actual start and end dates of the record being removed are
218      -- used NB. as the opmu cannot be updated there will only be one record.
219      if p_dt_delete_mode = 'ZAP' then
220        v_validation_start_date := p_effective_start_date;
221        v_validation_end_date   := p_effective_end_date;
222      else
223        v_validation_start_date := p_validation_start_date;
224        v_validation_end_date   := p_validation_end_date;
225      end if;
226 --
227      -- Check to see if the opmu is being removed during a time when it is
228      -- the default for the payroll.
229      open csr_dflt_pay_meth(p_payroll_id,
230                             p_org_payment_method_id,
231                             v_validation_start_date,
232                             v_validation_end_date);
233      fetch csr_dflt_pay_meth into v_dummy_id;
234      if csr_dflt_pay_meth%found then
235        close csr_dflt_pay_meth;
236        hr_utility.set_message(801, 'HR_6932_PAY_PAST_DPM');
237        hr_utility.raise_error;
238      else
239        close csr_dflt_pay_meth;
240      end if;
241 --
242      -- Check to see if the opmu is being removed during a time when it is
243      -- has been used to allow the creation of a personal payment method.
244      open csr_ppm(p_payroll_id,
245 	          p_org_payment_method_id,
246 	          v_validation_start_date,
247 	          v_validation_end_date);
248      fetch csr_ppm into v_dummy_id;
249      if csr_ppm%found then
250        close csr_ppm;
251        hr_utility.set_message(801, 'HR_6497_PAY_DEL_PPM');
252        hr_utility.raise_error;
253      else
254        close csr_ppm;
255      end if;
256 --
257      -- Check to see if the opmu is being removed during a time when it is
258      -- has been used in a pre payment.
259      open csr_pre_pay(p_payroll_id,
260 	              p_org_payment_method_id,
261 	              v_validation_start_date,
262 	              v_validation_end_date);
263      fetch csr_pre_pay into v_dummy_id;
264      if csr_pre_pay%found then
265        close csr_pre_pay;
266        hr_utility.set_message(801, 'HR_6498_PAY_DEL_PREPAY');
267        hr_utility.raise_error;
268      else
269        close csr_pre_pay;
270      end if;
271 --
272    end if;
273 --
274  end validate_delete_opmu;
275 --
276  -----------------------------------------------------------------------------
277  -- Name                                                                    --
278  --   Insert_Row                                                            --
279  -- Purpose                                                                 --
280  --   Table handler procedure that supports the insert of an OPMU via the   --
281  --   Define Payroll form.                                                  --
282  -- Arguments                                                               --
283  --   See below.                                                            --
284  -- Notes                                                                   --
285  --                                                                         --
286  -----------------------------------------------------------------------------
287 --
288  PROCEDURE Insert_Row(X_Rowid                        IN OUT nocopy VARCHAR2,
289                       X_Org_Pay_Method_Usage_Id      IN OUT nocopy NUMBER,
290                       X_Effective_Start_Date                       DATE,
291                       X_Effective_End_Date           IN OUT nocopy DATE,
292                       X_Payroll_Id                                 NUMBER,
293                       X_Org_Payment_Method_Id                      NUMBER) IS
294 --
295    CURSOR C IS SELECT rowid FROM pay_org_pay_method_usages_f
296                WHERE  org_pay_method_usage_id = X_Org_Pay_Method_Usage_Id;
297 --
298    CURSOR C2 IS SELECT pay_org_pay_method_usages_s.nextval
299    FROM dual;
300 --
301  BEGIN
302 --
303    if (X_Org_Pay_Method_Usage_Id is NULL) then
304      OPEN C2;
305      FETCH C2 INTO X_Org_Pay_Method_Usage_Id;
306      CLOSE C2;
307    end if;
308 --
309    -- Sets the correct ned date for the opmu taking into account the payroll,
310    -- opm and future opmus.
311    X_Effective_End_Date := pay_org_pay_meth_usages_f_pkg.opmu_end_date
312                              (null,                    -- opmu id
313                               X_Payroll_Id,
314                               X_Org_Payment_Method_Id,
315                               X_Effective_Start_Date,  -- session date
316                               X_Effective_Start_Date); -- validation start date
317 --
318    INSERT INTO pay_org_pay_method_usages_f
319    (org_pay_method_usage_id,
320     effective_start_date,
321     effective_end_date,
322     payroll_id,
323     org_payment_method_id)
324    VALUES
325    (X_Org_Pay_Method_Usage_Id,
326     X_Effective_Start_Date,
327     X_Effective_End_Date,
328     X_Payroll_Id,
329     X_Org_Payment_Method_Id);
330 --
331    OPEN C;
332    FETCH C INTO X_Rowid;
333    if (C%NOTFOUND) then
334      CLOSE C;
335      hr_utility.set_message(801, 'HR_6153_ALL_PROCEDURE_FAIL');
336      hr_utility.set_message_token('PROCEDURE',
337                                   'pay_org_pay_meth_usages_f_pkg.insert_row');
338      hr_utility.set_message_token('STEP','1');
339      hr_utility.raise_error;
340    end if;
341    CLOSE C;
342 --
343  END Insert_Row;
344 --
345  -----------------------------------------------------------------------------
346  -- Name                                                                    --
347  --   Lock_Row                                                              --
348  -- Purpose                                                                 --
349  --   Table handler procedure that supports the insert , update and delete  --
350  --   of a formula by applying a lock on a formula in the Define Payroll    --
351  --   form.                                                                 --
352  -- Arguments                                                               --
353  --   See below.                                                            --
354  -- Notes                                                                   --
355  --   None.                                                                 --
356  -----------------------------------------------------------------------------
357 --
358  PROCEDURE Lock_Row(X_Rowid                                 VARCHAR2,
359                     X_Org_Pay_Method_Usage_Id               NUMBER,
360                     X_Effective_Start_Date                  DATE,
361                     X_Effective_End_Date                    DATE,
362                     X_Payroll_Id                            NUMBER,
363                     X_Org_Payment_Method_Id                 NUMBER) IS
364 --
365    CURSOR C IS SELECT * FROM pay_org_pay_method_usages_f
369    Recinfo C%ROWTYPE;
366                WHERE  rowid = X_Rowid FOR UPDATE of Org_Pay_Method_Usage_Id
367 	       NOWAIT;
368 --
370 --
371  BEGIN
372 --
373    OPEN C;
374    FETCH C INTO Recinfo;
375    if (C%NOTFOUND) then
376      CLOSE C;
377      hr_utility.set_message(801, 'HR_6153_ALL_PROCEDURE_FAIL');
378      hr_utility.set_message_token('PROCEDURE',
379                                   'pay_org_pay_meth_usages_f_pkg.lock_row');
380      hr_utility.set_message_token('STEP','1');
381      hr_utility.raise_error;
382    end if;
383    CLOSE C;
384 --
385    if (    (   (Recinfo.org_pay_method_usage_id = X_Org_Pay_Method_Usage_Id)
386             OR (    (Recinfo.org_pay_method_usage_id IS NULL)
387                 AND (X_Org_Pay_Method_Usage_Id IS NULL)))
388        AND (   (Recinfo.effective_start_date = X_Effective_Start_Date)
389             OR (    (Recinfo.effective_start_date IS NULL)
390                 AND (X_Effective_Start_Date IS NULL)))
391        AND (   (Recinfo.effective_end_date = X_Effective_End_Date)
392             OR (    (Recinfo.effective_end_date IS NULL)
393                 AND (X_Effective_End_Date IS NULL)))
394        AND (   (Recinfo.payroll_id = X_Payroll_Id)
395             OR (    (Recinfo.payroll_id IS NULL)
396                 AND (X_Payroll_Id IS NULL)))
397        AND (   (Recinfo.org_payment_method_id = X_Org_Payment_Method_Id)
398             OR (    (Recinfo.org_payment_method_id IS NULL)
399                 AND (X_Org_Payment_Method_Id IS NULL)))
400            ) then
401      return;
402    else
403      FND_MESSAGE.Set_Name('FND', 'FORM_RECORD_CHANGED');
404      APP_EXCEPTION.RAISE_EXCEPTION;
405    end if;
406 --
407  END Lock_Row;
408 --
409  -----------------------------------------------------------------------------
410  -- Name                                                                    --
411  --   Update_Row                                                            --
412  -- Purpose                                                                 --
413  --   Table handler procedure that supports the update of an OPMU   via the --
414  --   Define Payroll form.                                                  --
415  -- Arguments                                                               --
416  --   See below.                                                            --
417  -- Notes                                                                   --
418  --   None.                                                                 --
419  -----------------------------------------------------------------------------
420 --
421  PROCEDURE Update_Row(X_Rowid                               VARCHAR2,
422                       X_Org_Pay_Method_Usage_Id             NUMBER,
423                       X_Effective_Start_Date                DATE,
424                       X_Effective_End_Date                  DATE,
425                       X_Payroll_Id                          NUMBER,
426                       X_Org_Payment_Method_Id               NUMBER) IS
427 --
428  BEGIN
429 --
430    UPDATE pay_org_pay_method_usages_f
431    SET org_pay_method_usage_id   =    X_Org_Pay_Method_Usage_Id,
432        effective_start_date      =    X_Effective_Start_Date,
433        effective_end_date        =    X_Effective_End_Date,
434        payroll_id                =    X_Payroll_Id,
435        org_payment_method_id     =    X_Org_Payment_Method_Id
436    WHERE rowid = X_rowid;
437 --
438    if (SQL%NOTFOUND) then
439      hr_utility.set_message(801, 'HR_6153_ALL_PROCEDURE_FAIL');
440      hr_utility.set_message_token('PROCEDURE',
441                                   'pay_org_pay_meth_usages_f_pkg.update_row');
442      hr_utility.set_message_token('STEP','1');
443      hr_utility.raise_error;
444    end if;
445 --
446  END Update_Row;
447 --
448  -----------------------------------------------------------------------------
449  -- Name                                                                    --
450  --   Delete_Row                                                            --
451  -- Purpose                                                                 --
452  --   Table handler procedure that supports the delete of a OPMU via the    --
453  --   Define Payroll form.                                                  --
454  -- Arguments                                                               --
455  --   See below.                                                            --
456  -- Notes                                                                   --
457  --                                                                         --
458  -----------------------------------------------------------------------------
459 --
460  PROCEDURE Delete_Row(X_Rowid VARCHAR2) IS
461 --
462  BEGIN
463 --
464    DELETE FROM pay_org_pay_method_usages_f
465    WHERE  rowid = X_Rowid;
466 --
467    if (SQL%NOTFOUND) then
468      hr_utility.set_message(801, 'HR_6153_ALL_PROCEDURE_FAIL');
469      hr_utility.set_message_token('PROCEDURE',
470                                   'pay_org_pay_meth_usages_f_pkg.delete_row');
471      hr_utility.set_message_token('STEP','1');
472      hr_utility.raise_error;
473    end if;
474 --
475  END Delete_Row;
476 --
477 END PAY_ORG_PAY_METH_USAGES_F_PKG;