DBA Data[Home] [Help]

PACKAGE BODY: APPS.PY_ZA_TX_UTL_01032012

Source


1 PACKAGE BODY PY_ZA_TX_UTL_01032012 AS
2 /* $Header: pyzatu13.pkb 120.9.12020000.2 2013/01/31 11:01:01 nchinnam noship $ */
3 /* Copyright (c) Oracle Corporation 2005. All rights reserved. */
4 /*
5    PRODUCT
6       Oracle Payroll - ZA Localisation Tax Module
7 
8    NAME
9       py_za_tx_utl_01032012.pkb
10 
11    DESCRIPTION
12       This is the ZA Tax Module utility package.  It contains
13       functions and procedures used by the main tax package.
14 
15    PUBLIC FUNCTIONS
16       GlbVal
17          Returns the value of a Oracle Application Global
18          date effectively
19       NegPtd
20          Boolean function returns true if any current PTD
21          total balance value is negative
22       LatePayPeriod
23          Boolean function returns true if the current period
24          is a Late Payment Period, i.e. a payment over the
25          tax year boundary.
26       LstPeriod
27          Boolean function returns true if current period is the
28          last period in the current tax year.
29       EmpTermInPeriod
30          Boolean function returns true if the assignment was terminated
31          in the current pay period.
32       EmpTermPrePeiod
33          Boolean function returns true if the assignment was terminated
34          before the current period.
35       PreErnPeriod
36          Boolean function returns true if this run is deemed to be
37          a Pre-Earnings Calculation Run.
38          For a complete description see the tax module design document.
39       SitePeriod
40          Boolean function returns true if it is a tax site period.
41          For a complete description see the tax module design document.
42       Annualise
43          Returns annualised value to the calling object.
44          For a complete description see the tax module design document.
45       TaxLiability
46          Returns the gross tax liability on passed value.
47          For a complete description see the tax module design document.
48       DeAnnualise
49          Returns the de-annualised value to the calling object.
50          For a complete description see the tax module design document.
51       DaysWorked
52          Returns the number of days worked for the assignment.
53          For a complete description see the tax module design document.
54       AllowableDeduction
55          Returns the least of the specified percentage of employee's
56          remumeration and the Donation amount
57 
58    PUBLIC PROCEDURES
59       StartHrTrace
60          Sets package global that determines if extra trace information
61          will be written to file - hr_utility
62       StopHrTrace
63          Stops trace information from being written to file
64       WriteHrTrace
65          Writes extra trace information to file if global
66          has been set
67       PeriodFactor
68          Calculates the period factor for the assignment.
69          For a complete description see the tax module design document.
70       PossiblePeriodsFactor
71          Calculates the possible period factor for the assignment.
72          For a complete description see the tax module design document.
73       SetRebates
74          Calculate tax Rebate and Threshold values.
75          For a complete description see the tax module design document.
76       Abatements
77          Calculates all necessary abatements.
78          For a complete description see the tax module design document.
79       ArrearExcess
80          Calculates the arrear excess figure to 'effectively' update the
81          Asg_Itd dimension of the arrear excess pension and retirement
82          annuity balances.  Will only fire on siteperiod.
83       TrvAll
84          Calculates the taxable travel allowance over a period of
85          time based on the effective global values at the time.
86          For a complete description see the tax module design document.
87       NpVal
88          Validates the calculated category liabilities.
89          For a complete description see the tax module design document.
90       SitPaySplit
91          Calculates the site paye split of tax liabilities.
92          For a complete description see the tax module design document.
93       Trace
94          Traces the tax calculation.
95          For a complete description see the tax module design document.
96       ClearGlobals
97          Clears any set package globals.
98          For a complete description see the tax module design document.
99 
100    PRIVATE FUNCTIONS
101       GetTableValue
102          Returns the value from a user table date effectively
103 
104    PRIVATE PROCEDURES
105       <none>
106 
107    NOTES
108       .
109 
110    MODIFICATION HISTORY
111    Person    Date       Version      Bug     Comments
112    --------- ---------- ----------- ------- --------------------------------
113    R Babla  03/04/2008 115.0       8406456   For detail history see
114                                              py_za_tx_utl_01032007
115                                              Changes done in Abatements for
116                                              TYS2010 -new SARS codes
117                                              Function AllowableDeduction
118                                              added
119    R Babla  10/06/2009 115.1       8512751   Modified ClearGlobals to clear
120                                              global for Net PAYE Taxable Income
121                                              used in EMP201
122    P.Arusia 17/7/2009  115.2       8691928   a) Updated global name from
123                                              ZA_ALLOW_DONATION_PERC to
124                                              ZA_ALLOWABLE_DONATION_PERC
125                                              b) Updated the message text
126                                              as well as the way of raising
127                                              exception for 'late Payment
128                                              Across Two Tax Years' in
129                                              LatePayPeriod procedure
130    R Babla  29/07/2009 115.3       8526698   Updated ClearGlobals to clear the
131                                              globals for Net to Gross
132    R Babla  20/08/2009 115.4       8824018   Updated ClearGlobals to clear the
133                                              new globals for Net to Gross.
134                                              Abatements modified to calculate
135                                              the abatement of Net to Gross earnings
136                                              separately.
137    R Babla  02/09/2009 115.7       8824018   Updated Proc SitPaySplit to consider
138                                              the Net to Gross tax.
139    R Babla  02/09/2009 115.8       8844712   1.Removed the error is Late Payment Across two Tax Yrs
140                                              2.Modified the TaxLiability for Late Payments
141    R Babla  25/02/2010 115.9       9369895   Changes in abatement calculation for package structure emp
142    R Babla  26/02/2010 115.10      9397464   Removed reference of dbi_ZA_ASG_TX_YR%
143    R Babla  10/03/2009 115.11      9438325   Modified PreErnPeriod to consider _ASG_RUN value
144                                              for Annual Payments
145    NCHINNAM 03/11/2010 115.12      10245740  Non Cumilative tax method enhancement changes.
146 
147    NCHINNAM 24/02/2011 115.1       11806660  2011/12 Tax Year End Legislative Changes.
148 
149    ABDASH   24/04/2012 115.3       13986697  Changes made to enable generation of tax trace from application.
150    ABDASH   21/05/2012 115.4       14062746 MEDICAL TAX CREDIT CALCULATION IN CASE OF TAX REFUND.
151    ABDASH   25/05/2012 115.6       14062746 MEDICAL TAX CREDIT CALCULATION IN CASE OF TAX REFUND WITH NEGATIVE PAYE.
152    ABDASH   25/05/2012 115.7       14062746 MEDICAL TAX CREDIT CALCULATION IN CASE OF TAX REFUND FOR PARTIAL REFUND.
153    ABDASH   12/06/2012 115.8       14168167 MAC ALLOWED TO BE REFUNDED INCASE OF EMPLOYEE ABOVE AGE 65 OR WHEN BALANCES FOR CODE 3810, 4005 AND 4474 ARE ZERO.
154    ABDASH   19/06/2012 115.9       14195352 Tax should be refunded only when net taxable income is below SITE limit and Med Abatement is not applicable for NI for employees above 65.
155    ABDASH   19/06/2012 115.10     14195352 Modified Med Abatement Calculation for BasCalc
156  */
157 -------------------------------------------------------------------------------
158 --                               PACKAGE BODY                                --
159 -------------------------------------------------------------------------------
160 
161 -------------------------------------------------------------------------------
162 -- StartHrTrace                                                              --
163 -- Wrapper for hr_utility.trace_on                                           --
164 -------------------------------------------------------------------------------
165 PROCEDURE StartHrTrace AS
166 BEGIN
167    IF g_HrTraceEnabled THEN
168       hr_utility.trace_on(null,g_HrTracePipeName);
169    END IF;
170 END StartHrTrace;
171 -------------------------------------------------------------------------------
172 -- StartHrTrace                                                              --
173 -- Function wrapper for hr_utility.trace_on                                  --
174 -------------------------------------------------------------------------------
175 FUNCTION StartHrTrace(
176    p_HrTracePipeName VARCHAR2
177    ) RETURN VARCHAR2
178 AS
179 BEGIN
180    hr_utility.trace_on(null,p_HrTracePipeName);
181    RETURN p_HrTracePipeName;
182 END StartHrTrace;
183 -------------------------------------------------------------------------------
184 -- StopHrTrace                                                               --
185 -- Wrapper for hr_utility.trace_off                                          --
186 -------------------------------------------------------------------------------
187 PROCEDURE StopHrTrace AS
188 BEGIN
189    IF g_HrTraceEnabled THEN
190       hr_utility.trace_off;
191    END IF;
192 END StopHrTrace;
193 -------------------------------------------------------------------------------
194 -- StopHrTrace                                                               --
195 -- Function wrapper for hr_utility.trace_off                                 --
196 -------------------------------------------------------------------------------
197 FUNCTION StopHrTrace RETURN VARCHAR2 AS
198 BEGIN
199    hr_utility.trace_off;
200    RETURN 'TRACE_OFF';
201 END StopHrTrace;
202 -------------------------------------------------------------------------------
203 -- WriteHrTrace                                                              --
204 -- Wrapper for hr_utility.trace                                              --
205 -------------------------------------------------------------------------------
206 PROCEDURE WriteHrTrace(
207    p_Buffer VARCHAR2
208    )
209 AS
210 BEGIN
211 
212 -- bug 13986697
213    -- IF g_HrTraceEnabled THEN
214       -- Write the Line
215       hr_utility.trace(p_Buffer);
216    -- END IF;
217 END WriteHrTrace;
218 
219 
220 -------------------------------------------------------------------------------
221 --                           Tax Utility Functions                           --
222 -------------------------------------------------------------------------------
223 -------------------------------------------------------------------------------
224 -- GlbVal                                                                    --
225 -------------------------------------------------------------------------------
226 FUNCTION GlbVal
227    (p_GlbNme ff_globals_f.global_name%TYPE
228    ,p_EffDte DATE
229    ) RETURN ff_globals_f.global_value%TYPE
230 AS
231 -- Variables
232    l_GlbVal t_balance;
233 BEGIN
234    hr_utility.set_location('py_za_tx_utl_01032012.GlbVal',1);
235    WriteHrTrace('p_GlbNme :'||p_GlbNme);
236    WriteHrTrace('p_EffDte :'||to_char(p_EffDte,'DD/MM/YYYY'));
237    --
238    SELECT TO_NUMBER(global_value)
239      INTO l_GlbVal
240      FROM ff_globals_f
241     WHERE p_EffDte between effective_start_date and effective_end_date
242       AND global_name = p_GlbNme;
243 
244    hr_utility.set_location('py_za_tx_utl_01032012.GlbVal',2);
245    RETURN l_GlbVal;
246 
247 EXCEPTION
248    WHEN OTHERS THEN
249       IF py_za_tx_01032012.xpt_Msg = 'No Error' THEN
250          py_za_tx_01032012.xpt_Msg := 'GlbVal: '||TO_CHAR(SQLCODE);
251       END IF;
252       RAISE py_za_tx_01032012.xpt_E;
253 END GlbVal;
254 
255 
256 -------------------------------------------------------------------------------
257 -- TotPrdTxbIncYtd
258 -------------------------------------------------------------------------------
259 FUNCTION TotPrdTxbIncYtd RETURN t_balance AS
260    ------------
261    -- Variables
262    ------------
263    l_tot_txb_prd_inc_ytd t_balance;
264 
265 -------------------------------------------------------------------------------
266 BEGIN --                  MAIN                                               --
267 -------------------------------------------------------------------------------
268    hr_utility.set_location('py_za_tx_utl_01032012.TotPrdTxbIncYtd',1);
269 
270    l_tot_txb_prd_inc_ytd :=
271       ( py_za_tx_01032012.bal_TOT_TXB_NI_YTD
272       + py_za_tx_01032012.bal_TOT_TXB_FB_YTD
273       + py_za_tx_01032012.bal_TOT_TXB_TA_YTD
274       );
275    hr_utility.set_location('py_za_tx_utl_01032012.TotPrdTxbIncYtd',2);
276    RETURN l_tot_txb_prd_inc_ytd;
277 
278 EXCEPTION
279    WHEN OTHERS THEN
280       hr_utility.set_location('py_za_tx_utl_01032012.TotPrdTxbIncYtd',3);
281       IF py_za_tx_01032012.xpt_Msg = 'No Error' THEN
282          py_za_tx_01032012.xpt_Msg := 'TotPrdTxbIncYtd: '||TO_CHAR(SQLCODE);
283       END IF;
284       RAISE py_za_tx_01032012.xpt_E;
285 -------------------------------------------------------------------------------
286 END TotPrdTxbIncYtd;
287 
288 
289 -------------------------------------------------------------------------------
290 -- TotPrdTxbIncPtd
291 -------------------------------------------------------------------------------
292 FUNCTION TotPrdTxbIncPtd RETURN t_balance AS
293    ------------
294    -- Variables
295    ------------
296    l_tot_txb_prd_inc_ptd t_balance;
297 
298 -------------------------------------------------------------------------------
299 BEGIN --                  MAIN                                               --
300 -------------------------------------------------------------------------------
301    hr_utility.set_location('py_za_tx_utl_01032012.TotPrdTxbIncPtd',1);
302 
303    l_tot_txb_prd_inc_ptd :=
304       ( py_za_tx_01032012.bal_TOT_TXB_NI_PTD
305       + py_za_tx_01032012.bal_TOT_TXB_FB_PTD
306       + py_za_tx_01032012.bal_TOT_TXB_TA_PTD
307       );
308    hr_utility.set_location('py_za_tx_utl_01032012.TotPrdTxbIncPtd',2);
309    RETURN l_tot_txb_prd_inc_ptd;
310 
311 EXCEPTION
312    WHEN OTHERS THEN
313       hr_utility.set_location('py_za_tx_utl_01032012.TotPrdTxbIncPtd',3);
314       IF py_za_tx_01032012.xpt_Msg = 'No Error' THEN
315          py_za_tx_01032012.xpt_Msg := 'TotPrdTxbIncPtd: '||TO_CHAR(SQLCODE);
316       END IF;
317       RAISE py_za_tx_01032012.xpt_E;
318 -------------------------------------------------------------------------------
319 END TotPrdTxbIncPtd;
320 
321 
322 -------------------------------------------------------------------
323 -- NegPtd
324 -------------------------------------------------------------------
325 FUNCTION NegPtd RETURN BOOLEAN AS
326    ------------
327    -- Variables
328    ------------
329    l_Retval BOOLEAN DEFAULT FALSE;
330 
331 -------------------------------------------------------------------
332 BEGIN --                   NegPtd - MAIN                         --
333 -------------------------------------------------------------------
334    hr_utility.set_location('py_za_tx_utl_01032012.NegPtd',1);
335    -- If any period ptd income value is negative
336    -- a site calc has to be done
337 
338    py_za_tx_01032012.trc_NorIncPtd := py_za_tx_01032012.bal_TOT_TXB_NI_PTD;
339    py_za_tx_01032012.trc_FrnBenPtd := py_za_tx_01032012.bal_TOT_TXB_FB_PTD;
340    py_za_tx_01032012.trc_TrvAllPtd := py_za_tx_01032012.bal_TOT_TXB_TA_PTD;
341 
342    py_za_tx_01032012.trc_BonProPtd := py_za_tx_01032012.bal_BP_PTD;
343 
344    IF LEAST( py_za_tx_01032012.trc_NorIncPtd
345            , py_za_tx_01032012.trc_FrnBenPtd
346            , py_za_tx_01032012.trc_TrvAllPtd
347            , py_za_tx_01032012.trc_BonProPtd
348            ) < 0
349    THEN
350       hr_utility.set_location('py_za_tx_utl_01032012.NegPtd',2);
351       py_za_tx_01032012.trc_NegPtd := TRUE;
352    END IF;
353 
354    hr_utility.set_location('py_za_tx_utl_01032012.NegPtd',3);
355    RETURN py_za_tx_01032012.trc_NegPtd;
356 
357 EXCEPTION
358    WHEN OTHERS THEN
359       IF py_za_tx_01032012.xpt_Msg = 'No Error' THEN
360          py_za_tx_01032012.xpt_Msg := 'NegPtd: '||TO_CHAR(SQLCODE);
361       END IF;
362       RAISE py_za_tx_01032012.xpt_E;
363 END NegPtd;
364 
365 -------------------------------------------------------------------------------
366 -- LatePayPeriod                                                             --
367 -------------------------------------------------------------------------------
368 FUNCTION LatePayPeriod RETURN BOOLEAN AS
369 -- Variables
370    l_CurTxYear NUMBER(15);
371 BEGIN
372    hr_utility.set_location('py_za_tx_utl_01032012.LatePayPeriod',1);
373 -- IF the employee's assignment ended before the current tax year
374 -- it's a Late Pay Period
375    IF py_za_tx_01032012.dbi_ZA_ACT_END_DTE < py_za_tx_01032012.dbi_ZA_TX_YR_STRT THEN
376 
377       hr_utility.set_location('py_za_tx_utl_01032012.LatePayPeriod',2);
378 
379    -- Valid Late Pay Period?
380    --
381    -- Current Tax Year
382       l_CurTxYear := to_number(to_char(py_za_tx_01032012.dbi_ZA_TX_YR_END,'YYYY'));
383 
384       hr_utility.set_location('py_za_tx_utl_01032012.LatePayPeriod',3);
385 
386       /* Commented for Bug 8844712
387       IF (l_CurTxYear - py_za_tx_01032012.dbi_ZA_ASG_TX_YR) > 1 THEN
388          hr_utility.set_location('py_za_tx_utl_01032012.LatePayPeriod',4);
389              -- Bug 8691928
390              py_za_tx_01032012.xpt_Msg := 'LatePayment Across Two Tax Yrs' ;
391              RAISE py_za_tx_01032012.xpt_E;
392       ELSE
393          hr_utility.set_location('py_za_tx_utl_01032012.LatePayPeriod',5);
394          RETURN TRUE;
395       END IF; */
396       RETURN TRUE;
397 
398    ELSE
399       hr_utility.set_location('py_za_tx_utl_01032012.LatePayPeriod',6);
400       RETURN FALSE;
401    END IF;
402 
403 EXCEPTION
404    WHEN OTHERS THEN
405       IF py_za_tx_01032012.xpt_Msg = 'No Error' THEN
406          py_za_tx_01032012.xpt_Msg := 'LatePayPeriod: '||TO_CHAR(SQLCODE);
407       END IF;
408       RAISE py_za_tx_01032012.xpt_E;
409 END LatePayPeriod;
410 -------------------------------------------------------------------------------
411 -- LstPeriod                                                                 --
412 -------------------------------------------------------------------------------
413 FUNCTION LstPeriod RETURN BOOLEAN AS
414 BEGIN
415    -- Is this the last period for the tax year
416    --
417    IF py_za_tx_01032012.dbi_ZA_PAY_PRDS_LFT = 1 THEN
418       hr_utility.set_location('py_za_tx_utl_01032012.LstPeriod',1);
419       RETURN TRUE;
420    ELSE
421       hr_utility.set_location('py_za_tx_utl_01032012.LstPeriod',2);
422       RETURN FALSE;
423    END IF;
424 
425 EXCEPTION
426    WHEN OTHERS THEN
427       IF py_za_tx_01032012.xpt_Msg = 'No Error' THEN
428          py_za_tx_01032012.xpt_Msg := 'LstPeriod: '||TO_CHAR(SQLCODE);
429       END IF;
430       RAISE py_za_tx_01032012.xpt_E;
431 END LstPeriod;
432 -------------------------------------------------------------------------------
433 -- EmpTermInPeriod                                                           --
434 -------------------------------------------------------------------------------
435 FUNCTION EmpTermInPeriod RETURN BOOLEAN AS
436 
437 BEGIN
438    -- Was the employee terminated in the current period
439    --
440    IF py_za_tx_01032012.dbi_ZA_ACT_END_DTE BETWEEN py_za_tx_01032012.dbi_ZA_CUR_PRD_STRT_DTE
441                                                AND py_za_tx_01032012.dbi_ZA_CUR_PRD_END_DTE
442    THEN
443       hr_utility.set_location('py_za_tx_utl_01032012.EmpTermInPeriod',1);
444       RETURN TRUE;
445    ELSE
446       hr_utility.set_location('py_za_tx_utl_01032012.EmpTermInPeriod',2);
447       RETURN FALSE;
448    END IF;
449 
450 EXCEPTION
451    WHEN OTHERS THEN
452       IF py_za_tx_01032012.xpt_Msg = 'No Error' THEN
453          py_za_tx_01032012.xpt_Msg := 'EmpTermInPeriod: '||TO_CHAR(SQLCODE);
454       END IF;
455       RAISE py_za_tx_01032012.xpt_E;
456 END EmpTermInPeriod;
457 -------------------------------------------------------------------------------
458 -- EmpTermPrePeriod                                                          --
459 -------------------------------------------------------------------------------
460 FUNCTION EmpTermPrePeriod RETURN BOOLEAN AS
461 
462 BEGIN
463    -- Was the employee terminated before the current period
464    --
465    IF py_za_tx_01032012.dbi_ZA_ACT_END_DTE <= py_za_tx_01032012.dbi_ZA_CUR_PRD_STRT_DTE THEN
466       hr_utility.set_location('py_za_tx_utl_01032012.EmpTermPrePeriod',1);
467       RETURN TRUE;
468    ELSE
469       hr_utility.set_location('py_za_tx_utl_01032012.EmpTermPrePeriod',2);
470       RETURN FALSE;
471    END IF;
472 
473 EXCEPTION
474    WHEN OTHERS THEN
475       IF py_za_tx_01032012.xpt_Msg = 'No Error' THEN
476          py_za_tx_01032012.xpt_Msg := 'EmpTermPrePeriod: '||TO_CHAR(SQLCODE);
477       END IF;
478       RAISE py_za_tx_01032012.xpt_E;
479 END EmpTermPrePeriod;
480 -------------------------------------------------------------------------------
481 -- PreErnPeriod                                                              --
482 -------------------------------------------------------------------------------
483 FUNCTION PreErnPeriod RETURN BOOLEAN AS
484 
485 BEGIN
486    -- PTD Taxable Income
487    --
488 
489    py_za_tx_01032012.trc_TxbIncPtd :=
490       ( py_za_tx_01032012.bal_TOT_TXB_NI_PTD
491       + py_za_tx_01032012.bal_TOT_TXB_FB_PTD
492       + py_za_tx_01032012.bal_TOT_TXB_TA_PTD
493       + py_za_tx_01032012.bal_BP_PTD
494       );
495    -- Ptd Annual Bonus
496    py_za_tx_01032012.trc_AnnBonPtd := py_za_tx_01032012.bal_TOT_TXB_AB_RUN;
497    --Modified the value of trc_AnnPymPtd for Bug 9438325 to consider _ASG_RUN value for AP instead of _ASG_TAX_YTD
498    -- Run Annual Payments
499    py_za_tx_01032012.trc_AnnPymPtd := py_za_tx_01032012.bal_TOT_TXB_AP_RUN;
500 
501    WriteHrTrace('py_za_tx_01032012.trc_TxbIncPtd: '||to_char(py_za_tx_01032012.trc_TxbIncPtd));
502    WriteHrTrace('py_za_tx_01032012.trc_AnnBonPtd: '||to_char(py_za_tx_01032012.trc_AnnBonPtd));
503    WriteHrTrace('py_za_tx_01032012.trc_AnnPymPtd: '||to_char(py_za_tx_01032012.trc_AnnPymPtd));
504 
505    -- Annual Type PTD Income with no Period Type PTD Income
506    IF (py_za_tx_01032012.trc_AnnBonPtd + py_za_tx_01032012.trc_AnnPymPtd) <> 0 AND py_za_tx_01032012.trc_TxbIncPtd <= 0 THEN
507       hr_utility.set_location('py_za_tx_utl_01032012.PreErnPeriod',1);
508       RETURN TRUE;
509    ELSE
510       hr_utility.set_location('py_za_tx_utl_01032012.PreErnPeriod',2);
511       RETURN FALSE;
512    END IF;
513 
514 EXCEPTION
515   WHEN OTHERS THEN
516     IF py_za_tx_01032012.xpt_Msg = 'No Error' THEN
517        py_za_tx_01032012.xpt_Msg := 'PreErnPeriod: '||TO_CHAR(SQLCODE);
518     END IF;
519        RAISE py_za_tx_01032012.xpt_E;
520 END PreErnPeriod;
521 -------------------------------------------------------------------------------
522 -- SitePeriod                                                                --
523 -------------------------------------------------------------------------------
524 FUNCTION SitePeriod RETURN BOOLEAN AS
525 BEGIN
526    IF LstPeriod OR EmpTermInPeriod OR EmpTermPrePeriod THEN
527       hr_utility.set_location('py_za_tx_utl_01032012.SitePeriod',1);
528       RETURN TRUE;
529    ELSE
530       hr_utility.set_location('py_za_tx_utl_01032012.SitePeriod',2);
531       RETURN FALSE;
532    END IF;
533 
534 EXCEPTION
535    WHEN OTHERS THEN
536       IF py_za_tx_01032012.xpt_Msg = 'No Error' THEN
537          py_za_tx_01032012.xpt_Msg := 'SitePeriod: '||TO_CHAR(SQLCODE);
538       END IF;
539       RAISE py_za_tx_01032012.xpt_E;
540 END SitePeriod;
541 -------------------------------------------------------------------------------
542 -- PeriodFactor                                                              --
543 -------------------------------------------------------------------------------
544 PROCEDURE PeriodFactor AS
545    ------------
546    -- Variables
547    ------------
548    l_tot_inc_ytd t_balance;
549    l_tot_inc_ptd t_balance;
550 BEGIN
551    hr_utility.set_location('py_za_tx_utl_01032012.PeriodFactor',1);
552 
553    l_tot_inc_ytd := TotPrdTxbIncYtd;
554    l_tot_inc_ptd := TotPrdTxbIncPtd;
555 
556    hr_utility.set_location('py_za_tx_utl_01032012.PeriodFactor',2);
557 
558    IF py_za_tx_01032012.dbi_ZA_TX_YR_STRT < py_za_tx_01032012.dbi_ZA_ACT_STRT_DTE THEN
559       hr_utility.set_location('py_za_tx_utl_01032012.PeriodFactor',3);
560 
561       IF l_tot_inc_ytd = l_tot_inc_ptd THEN
562          hr_utility.set_location('py_za_tx_utl_01032012.PeriodFactor',3);
563          -- i.e. first pay period for the person
564 
565          -- Bug 8691928
566          -- removed newlines between various operands of the expression
567          py_za_tx_01032012.trc_PrdFactor := ( py_za_tx_01032012.dbi_ZA_CUR_PRD_END_DTE - py_za_tx_01032012.dbi_ZA_ACT_STRT_DTE + 1)/ ( py_za_tx_01032012.dbi_ZA_CUR_PRD_END_DTE - py_za_tx_01032012.dbi_ZA_CUR_PRD_STRT_DTE  + 1 );
568       ELSE
569          hr_utility.set_location('py_za_tx_utl_01032012.PeriodFactor',5);
570          py_za_tx_01032012.trc_PrdFactor := 1;
571       END IF;
572 
573    ELSE
574       hr_utility.set_location('py_za_tx_utl_01032012.PeriodFactor',6);
575       py_za_tx_01032012.trc_PrdFactor := 1;
576    END IF;
577 
578    WriteHrTrace('dbi_ZA_TX_YR_STRT:       '
579       ||to_char(py_za_tx_01032012.dbi_ZA_TX_YR_STRT,'DD/MM/YYYY'));
580    WriteHrTrace('dbi_ZA_ACT_STRT_DTE:     '
581       ||to_char(py_za_tx_01032012.dbi_ZA_ACT_STRT_DTE,'DD/MM/YYYY'));
582    WriteHrTrace('dbi_ZA_CUR_PRD_END_DTE:  '
583       ||to_char(py_za_tx_01032012.dbi_ZA_CUR_PRD_END_DTE,'DD/MM/YYYY'));
584    WriteHrTrace('dbi_ZA_CUR_PRD_STRT_DTE: '
585       ||to_char(py_za_tx_01032012.dbi_ZA_CUR_PRD_STRT_DTE,'DD/MM/YYYY'));
586    WriteHrTrace('l_tot_inc_ytd:           '
587       ||to_char(l_tot_inc_ytd));
588    WriteHrTrace('l_tot_inc_ptd:           '
589       ||to_char(l_tot_inc_ptd));
590 
591 EXCEPTION
592    WHEN OTHERS THEN
593       IF py_za_tx_01032012.xpt_Msg = 'No Error' THEN
594          py_za_tx_01032012.xpt_Msg := 'PeriodFactor: '||TO_CHAR(SQLCODE);
595       END IF;
596       RAISE py_za_tx_01032012.xpt_E;
597 END PeriodFactor;
598 -------------------------------------------------------------------------------
599 -- PossiblePeriodsFactor                                                     --
600 -------------------------------------------------------------------------------
601 PROCEDURE PossiblePeriodsFactor AS
602 BEGIN
603    IF py_za_tx_01032012.dbi_ZA_TX_YR_STRT >= py_za_tx_01032012.dbi_ZA_ACT_STRT_DTE THEN
604       hr_utility.set_location('py_za_tx_utl_01032012.PossiblePeriodsFactor',1);
605       py_za_tx_01032012.trc_PosFactor := 1;
606    ELSE
607       IF py_za_tx_01032012.trc_PrdFactor <> 1 THEN
608          hr_utility.set_location('py_za_tx_utl_01032012.PossiblePeriodsFactor',2);
609          --
610          py_za_tx_01032012.trc_PosFactor :=
611             py_za_tx_01032012.dbi_ZA_DYS_IN_YR
612           / ( py_za_tx_01032012.dbi_ZA_TX_YR_END
613             - py_za_tx_01032012.dbi_ZA_CUR_PRD_STRT_DTE
614             + 1
615             );
616       ELSE
617          hr_utility.set_location('py_za_tx_utl_01032012.PossiblePeriodsFactor',3);
618          --
619          py_za_tx_01032012.trc_PosFactor :=
620             py_za_tx_01032012.dbi_ZA_DYS_IN_YR
621           / ( py_za_tx_01032012.dbi_ZA_TX_YR_END
622             - py_za_tx_01032012.dbi_ZA_ACT_STRT_DTE
623             + 1
624             );
625       END IF;
626    END IF;
627 EXCEPTION
628    WHEN OTHERS THEN
629       IF py_za_tx_01032012.xpt_Msg = 'No Error' THEN
630          py_za_tx_01032012.xpt_Msg := 'PossiblePeriodsFactor: '||TO_CHAR(SQLCODE);
631       END IF;
632       RAISE py_za_tx_01032012.xpt_E;
633 END PossiblePeriodsFactor;
634 -------------------------------------------------------------------------------
635 -- Annualise                                                                 --
636 -------------------------------------------------------------------------------
637 FUNCTION Annualise
638    (p_YtdInc IN NUMBER
639    ,p_PtdInc IN NUMBER
640    ) RETURN NUMBER
641 AS
642    l_AnnFig1  t_balance;
643    l_AnnFig2  t_balance;
644    l_AnnFig3  t_balance;
645    l_AnnFig4  t_balance;
646 
647 BEGIN
648    hr_utility.set_location('py_za_tx_utl_01032012.Annualise',1);
649    IF py_za_tx_01032012.dbi_TX_MTD = 'C' THEN -- Cumulative Tax Method
650        hr_utility.set_location('py_za_tx_utl_01032012.Annualise',2);
651       -- 1
652       l_AnnFig1 := p_PtdInc / py_za_tx_01032012.trc_PrdFactor;
653       -- 2
654       l_AnnFig2 := l_AnnFig1 * py_za_tx_01032012.dbi_ZA_PAY_PRDS_LFT;
655       -- 3
656       l_AnnFig3 := l_AnnFig2 + p_YtdInc - p_PtdInc;
657       -- 4
658       l_AnnFig4 := l_AnnFig3 * py_za_tx_01032012.trc_PosFactor;
659       --
660       hr_utility.set_location('py_za_tx_utl_01032012.Annualise',3);
661       --
662       WriteHrTrace('p_PtdInc:                             '||to_char(p_PtdInc));
663       WriteHrTrace('py_za_tx_01032012.trc_PrdFactor:      '||to_char(py_za_tx_01032012.trc_PrdFactor));
664       WriteHrTrace('l_AnnFig1:                            '||to_char(l_AnnFig1));
665       WriteHrTrace('py_za_tx_01032012.dbi_ZA_PAY_PRDS_LFT:'||to_char(py_za_tx_01032012.dbi_ZA_PAY_PRDS_LFT));
666       WriteHrTrace('l_AnnFig2:                            '||to_char(l_AnnFig2));
667       WriteHrTrace('p_YtdInc:                             '||to_char(p_YtdInc));
668       WriteHrTrace('p_PtdInc:                             '||to_char(p_PtdInc));
669       WriteHrTrace('l_AnnFig3:                            '||to_char(l_AnnFig3));
670       WriteHrTrace('py_za_tx_01032012.trc_PosFactor:      '||to_char(py_za_tx_01032012.trc_PosFactor));
671       WriteHrTrace('l_AnnFig4:                            '||to_char(l_AnnFig4));
672    ELSE  -- Non Cumulative Tax Method
673        hr_utility.set_location('py_za_tx_utl_01032012.Annualise',4);
674 
675        l_AnnFig4 := p_PtdInc * py_za_tx_01032012.dbi_ZA_PAY_PRDS_PER_YR;
676 		   WriteHrTrace('p_PtdInc:                             '||to_char(p_PtdInc));
677 		   WriteHrTrace('py_za_tx_01032012.dbi_ZA_PAY_PRDS_PER_YR:'||to_char(py_za_tx_01032012.dbi_ZA_PAY_PRDS_PER_YR));
678 		   WriteHrTrace('l_AnnFig4:                            '||to_char(l_AnnFig4));
679    END IF;
680 
681    --
682    RETURN l_AnnFig4;
683 
684 EXCEPTION
685    WHEN OTHERS THEN
686       IF py_za_tx_01032012.xpt_Msg = 'No Error' THEN
687          py_za_tx_01032012.xpt_Msg := 'Annualise: '||TO_CHAR(SQLCODE);
688       END IF;
689       RAISE py_za_tx_01032012.xpt_E;
690 END Annualise;
691 -------------------------------------------------------------------------------
692 -- SetRebates                                                                --
693 -------------------------------------------------------------------------------
694 PROCEDURE SetRebates AS
695 
696 -- Variables
697    l_65Year DATE;
698    l_75Year   DATE;
699    l_EndDate per_time_periods.end_date%TYPE;
700 
701    l_ZA_TX_YR_END        DATE;
702    l_ZA_ADL_TX_RBT       t_balance;
703    l_ZA_PRI_TX_RBT       t_balance;
704    l_ZA_TRI_TX_RBT       t_balance;
705    l_ZA_PRI_TX_THRSHLD   t_balance;
706    l_ZA_SC_TX_THRSHLD    t_balance;
707    l_ZA_TRI_TX_THRSHLD   t_balance;
708 
709 BEGIN
710    -- Setup the Globals
711    /*
712    IF py_za_tx_01032012.trc_CalTyp = 'PstCalc' THEN
713       hr_utility.set_location('py_za_tx_utl_01032012.SetRebates',1);
714       -- Employee Tax Year Start and End Dates
715       --
716       l_EndDate  := py_za_tx_01032012.dbi_ZA_ASG_TX_YR_END;
717 
718       hr_utility.set_location('py_za_tx_utl_01032012.SetRebates',2);
719 
720       -- Global Values
721       l_ZA_TX_YR_END        := l_EndDate;
722       l_ZA_ADL_TX_RBT       := GlbVal('ZA_ADDITIONAL_TAX_REBATE',l_EndDate);
723       l_ZA_PRI_TX_RBT       := GlbVal('ZA_PRIMARY_TAX_REBATE',l_EndDate);
724       l_ZA_PRI_TX_THRSHLD   := GlbVal('ZA_PRIM_TAX_THRESHOLD',l_EndDate);
725       l_ZA_SC_TX_THRSHLD    := GlbVal('ZA_SEC_TAX_THRESHOLD',l_EndDate);
726    ELSE */
727       hr_utility.set_location('py_za_tx_utl_01032012.SetRebates',3);
728       -- Set locals to current values
729       l_ZA_TX_YR_END         := py_za_tx_01032012.dbi_ZA_TX_YR_END;
730       l_ZA_ADL_TX_RBT        := py_za_tx_01032012.glb_ZA_ADL_TX_RBT;
731       l_ZA_PRI_TX_RBT        := py_za_tx_01032012.glb_ZA_PRI_TX_RBT;
732       l_ZA_TRI_TX_RBT        := py_za_tx_01032012.glb_ZA_TRI_TX_RBT;
733       l_ZA_PRI_TX_THRSHLD    := py_za_tx_01032012.glb_ZA_PRI_TX_THRSHLD;
734       l_ZA_SC_TX_THRSHLD     := py_za_tx_01032012.glb_ZA_SC_TX_THRSHLD;
735       l_ZA_TRI_TX_THRSHLD     := py_za_tx_01032012.glb_ZA_TRI_TX_THRSHLD;
736   -- END IF;
737 
738    hr_utility.set_location('py_za_tx_utl_01032012.SetRebates',4);
739 
740 -- Calculate the Rebate and Threshold Values
741    hr_utility.set_location('py_za_tx_utl_01032012.SetRebates',5);
742    -- Calculate the assignments 65 Year Date
743    l_65Year := add_months(py_za_tx_01032012.dbi_PER_DTE_OF_BRTH,780);
744    l_75Year := add_months(py_za_tx_01032012.dbi_PER_DTE_OF_BRTH,900);
745 
746    IF l_75Year <= l_ZA_TX_YR_END THEN
747       hr_utility.set_location('py_za_tx_utl_01032012.SetRebates',51);
748       -- give the extra abatement
749       py_za_tx_01032012.trc_Rebate    := l_ZA_PRI_TX_RBT + l_ZA_ADL_TX_RBT+l_ZA_TRI_TX_RBT;
750       py_za_tx_01032012.trc_Threshold := l_ZA_TRI_TX_THRSHLD;
751    ELSIF l_65Year <= l_ZA_TX_YR_END THEN
752       hr_utility.set_location('py_za_tx_utl_01032012.SetRebates',6);
753       -- give the extra abatement
754       py_za_tx_01032012.trc_Rebate    := l_ZA_PRI_TX_RBT + l_ZA_ADL_TX_RBT;
755       py_za_tx_01032012.trc_Threshold := l_ZA_SC_TX_THRSHLD;
756    ELSE
757       hr_utility.set_location('py_za_tx_utl_01032012.SetRebates',7);
758       -- not eligable for extra abatement
759       py_za_tx_01032012.trc_Rebate    := l_ZA_PRI_TX_RBT;
760       py_za_tx_01032012.trc_Threshold := l_ZA_PRI_TX_THRSHLD;
761    END IF;
762 
763    WriteHrTrace('l_ZA_TX_YR_END:      '||to_char(l_ZA_TX_YR_END,'DD/MM/YYYY'));
764    WriteHrTrace('l_ZA_ADL_TX_RBT:     '||to_char(l_ZA_ADL_TX_RBT));
765    WriteHrTrace('l_ZA_PRI_TX_RBT:     '||to_char(l_ZA_PRI_TX_RBT));
766    WriteHrTrace('l_ZA_TRI_TX_RBT:     '||to_char(l_ZA_TRI_TX_RBT));
767    WriteHrTrace('l_ZA_PRI_TX_THRSHLD: '||to_char(l_ZA_PRI_TX_THRSHLD));
768    WriteHrTrace('l_ZA_SC_TX_THRSHLD:  '||to_char(l_ZA_SC_TX_THRSHLD));
769    WriteHrTrace('l_ZA_TRI_TX_THRSHLD:  '||to_char(l_ZA_TRI_TX_THRSHLD));
770 
771 EXCEPTION
772    WHEN OTHERS THEN
773       IF py_za_tx_01032012.xpt_Msg = 'No Error' THEN
774          py_za_tx_01032012.xpt_Msg := 'SetRebates: '||TO_CHAR(SQLCODE);
775       END IF;
776       RAISE py_za_tx_01032012.xpt_E;
777 END SetRebates;
778 -------------------------------------------------------------------------------
779 -- Abatements
780 -------------------------------------------------------------------------------
781 PROCEDURE Abatements AS
782 
783 -- Variables
784    l_65Year DATE;
785    l_EndDate per_time_periods.end_date%TYPE;
786 
787    l_ZA_TX_YR_END        DATE;
788    l_ZA_ARR_PF_AN_MX_ABT t_balance;
789    l_ZA_ARR_RA_AN_MX_ABT t_balance;
790    l_ZA_PF_AN_MX_ABT     t_balance;
791    l_ZA_PF_MX_PRC        t_balance;
792    l_ZA_RA_AN_MX_ABT     t_balance;
793    l_ZA_RA_MX_PRC        t_balance;
794 
795    --Bug 9369895
796    l_TotTxbIncPkgYtd     t_balance;
797 --   l_TotTxbIncPenBasPtd  t_balance;
798    l_TotTxbIncEEDbtPkgYtd t_balance;
799    l_TotTxbNIYtd         t_balance;
800    l_TotTxbFBYtd         t_balance;
801    l_TotTxbTAYtd         t_balance;
802    l_TotTxbABYtd         t_balance;
803    l_TotTxbAPYtd         t_balance;
804    l_TotTxbPOYtd         t_balance;
805    l_TotTxbAPNTGYtd      t_balance;
806    l_TotTxbEEDbtYtd      t_balance;
807 
808 ------------------------------------------------------------------------------
809 BEGIN --                      Abatements - Main                             --
810 ------------------------------------------------------------------------------
811 -- Calculate the assignments 65 Year Date
812    l_65Year        := add_months(py_za_tx_01032012.dbi_PER_DTE_OF_BRTH,780);
813    --Commented for Bug 9397464
814    --l_ZA_TX_YR_END  := py_za_tx_01032012.dbi_ZA_ASG_TX_YR_END;
815    l_ZA_TX_YR_END  := py_za_tx_01032012.dbi_ZA_TX_YR_END;
816 
817 -- Initialise the figures needed for the calculation
818 -- of tax abatements and rebates, based on the
819 -- calculation type
820 --
821    -------------------------------------------------------------------------
822    IF py_za_tx_01032012.trc_CalTyp = 'NorCalc' THEN                       --
823    -------------------------------------------------------------------------
824    hr_utility.set_location('py_za_tx_utl_01032012.Abatements',1);
825 
826    -- Bug 9369895
827    -- If employee is on Fixed Percentage of Total Package then calculate the Total Taxable Income
828    -- which includes both periodic and annual income. This will be used in calculation of Pension
829    -- fund abatement
830    if py_za_tx_01032012.trc_PenBasis = 1 then
831         hr_utility.set_location('py_za_tx_utl_01032012.Abatements - Package Structure',2);
832 
833         l_TotTxbNIYtd :=  Annualise
834                  (p_YtdInc => py_za_tx_01032012.bal_TOT_TXB_NI_YTD
835                  ,p_PtdInc => py_za_tx_01032012.bal_TOT_TXB_NI_PTD
836                  );
837 
838         l_TotTxbFBYtd :=  Annualise
839                  (p_YtdInc => py_za_tx_01032012.bal_TOT_TXB_FB_YTD
840                  ,p_PtdInc => py_za_tx_01032012.bal_TOT_TXB_FB_PTD
841                  );
842 
843         l_TotTxbTAYtd :=  Annualise
844                  (p_YtdInc => py_za_tx_01032012.bal_TOT_TXB_TA_YTD
845                  ,p_PtdInc => py_za_tx_01032012.bal_TOT_TXB_TA_PTD
846                  );
847 
848         l_TotTxbPOYtd :=  Annualise
849                  (p_YtdInc => py_za_tx_01032012.bal_TOT_TXB_PO_YTD
850                  ,p_PtdInc => py_za_tx_01032012.bal_TOT_TXB_PO_PTD
851                  );
852 
853         l_TotTxbIncPkgYtd :=     (  l_TotTxbNIYtd + l_TotTxbFBYtd
854                                   + l_TotTxbTAYtd + l_TotTxbPOYtd
855                                   + py_za_tx_01032012.bal_TOT_TXB_AB_YTD
856                                   + py_za_tx_01032012.bal_TOT_TXB_AP_YTD
857                                   + py_za_tx_01032012.bal_TOT_TXB_AP_NTG_YTD );
858 
859         l_TotTxbIncEEDbtPkgYtd :=  ( l_TotTxbIncPkgYtd
860                                   + py_za_tx_01032012.bal_TOT_TXB_EE_DBT_NTG_YTD );
861 
862         hr_utility.set_location('l_TotTxbNIYtd          :'||to_char(l_TotTxbNIYtd),2);
863         hr_utility.set_location('l_TotTxbFBYtd          :'||to_char(l_TotTxbFBYtd),2);
864         hr_utility.set_location('l_TotTxbTAYtd          :'||to_char(l_TotTxbTAYtd),2);
865         hr_utility.set_location('l_TotTxbPOYtd          :'||to_char(l_TotTxbPOYtd),2);
866         hr_utility.set_location('l_TotTxbIncPkgYtd      :'||to_char(l_TotTxbIncPkgYtd),2);
867         hr_utility.set_location('l_TotTxbIncEEDbtPkgYtd :'||to_char(l_TotTxbIncEEDbtPkgYtd),2);
868 
869 
870    end if;
871    -------------------------
872    -- Pension Fund Abatement
873    -------------------------
874       ---------------------
875       -- Period Calculation
876       ---------------------
877       -- Annualise Period Pension Fund Contributions
878       py_za_tx_01032012.trc_PerPenFnd := Annualise
879                  (p_YtdInc => py_za_tx_01032012.bal_CUR_PF_YTD
880                  ,p_PtdInc => py_za_tx_01032012.bal_CUR_PF_PTD
881                  );
882       -- Annualise Period RFIable Contributions
883       py_za_tx_01032012.trc_PerRfiCon := Annualise
884                  (p_ytdInc => py_za_tx_01032012.bal_TOT_RFI_INC_YTD
885                  ,p_PtdInc => py_za_tx_01032012.bal_TOT_RFI_INC_PTD
886                  );
887 
888       hr_utility.set_location('py_za_tx_utl_01032012.Abatements',17);
889 
890       ---------------------
891       -- Annual Calculation
892       ---------------------
893       -- Annual Pension Fund Contribution
894       py_za_tx_01032012.trc_AnnPenFnd :=
895          py_za_tx_01032012.trc_PerPenFnd
896        + py_za_tx_01032012.bal_ANN_PF_YTD;
897       -- Annual Rfi Contribution
898       py_za_tx_01032012.trc_AnnRfiCon :=
899          py_za_tx_01032012.trc_PerRfiCon
900        + py_za_tx_01032012.bal_TOT_RFI_AN_INC_YTD;
901 
902       -- NTG
903       -- Annual EE Debt Rfi Contribution
904       py_za_tx_01032012.trc_AnnRfiEEDbtNTGCon :=
905          py_za_tx_01032012.trc_AnnRfiCon
906        + py_za_tx_01032012.bal_TOT_RFI_EE_DBT_NTG_YTD;
907 
908    --------------------------------
909    -- Arrear Pension Fund Abatement
910    --------------------------------
911       hr_utility.set_location('py_za_tx_utl_01032012.Abatements',18);
912       -------------
913       -- Excess ITD
914       -------------
915       py_za_tx_01032012.trc_PerArrPenFnd :=
916          py_za_tx_01032012.bal_EXC_ARR_PEN_ITD;
917 
918       ----------
919       -- Current
920       ----------
921       py_za_tx_01032012.trc_PerArrPenFnd :=
922          py_za_tx_01032012.trc_PerArrPenFnd
923        + Annualise
924          ( p_YtdInc => py_za_tx_01032012.bal_ARR_PF_YTD
925          , p_PtdInc => py_za_tx_01032012.bal_ARR_PF_PTD
926          );
927       ---------
928       -- Annual
929       ---------
930       py_za_tx_01032012.trc_AnnArrPenFnd :=
931            py_za_tx_01032012.trc_PerArrPenFnd
932          + py_za_tx_01032012.bal_ANN_ARR_PF_YTD;
933 
934    -------------------------------
935    -- Retirement Annuity Abatement
936    -------------------------------
937       hr_utility.set_location('py_za_tx_utl_01032012.Abatements',19);
938 
939       -------------
940       -- Current RA
941       -------------
942       py_za_tx_01032012.trc_PerRetAnu :=
943          Annualise
944             ( p_YtdInc => py_za_tx_01032012.bal_CUR_RA_YTD
945             , p_PtdInc => py_za_tx_01032012.bal_CUR_RA_PTD
946             );
947       ---------------------
948       -- Current NRFI Contr
949       ---------------------
950 
951       hr_utility.set_location('py_za_tx_utl_01032012.Abatements',20);
952       py_za_tx_01032012.trc_PerNrfiCon :=
953             Annualise
954                ( p_YtdInc => py_za_tx_01032012.bal_TOT_NRFI_INC_YTD
955                , p_PtdInc => py_za_tx_01032012.bal_TOT_NRFI_INC_PTD
956                );
957 
958 
959       ------------
960       -- Annual RA
961       ------------
962       py_za_tx_01032012.trc_AnnRetAnu :=
963          py_za_tx_01032012.trc_PerRetAnu
964        + py_za_tx_01032012.bal_ANN_RA_YTD;
965 
966 
967       hr_utility.set_location('py_za_tx_utl_01032012.Abatements',21);
968       py_za_tx_01032012.trc_AnnNrfiCon :=
969             py_za_tx_01032012.trc_PerNrfiCon
970           + py_za_tx_01032012.bal_TOT_NRFI_AN_INC_YTD;
971 
972 
973       -- NTG
974       -- Annual EE Debt NRFI Contribution
975       py_za_tx_01032012.trc_AnnNrfiEEDbtNTGCon :=
976          py_za_tx_01032012.trc_AnnNrfiCon
977        + py_za_tx_01032012.bal_TOT_NRFI_EE_DBT_NTG_YTD;
978 
979 
980    --------------------------------------
981    -- Arrear Retirement Annuity Abatement
982    --------------------------------------
983          hr_utility.set_location('py_za_tx_utl_01032012.Abatements',22);
984       -------------
985       -- Excess ITD
986       -------------
987       py_za_tx_01032012.trc_PerArrRetAnu :=
988          py_za_tx_01032012.bal_EXC_ARR_RA_ITD;
989       ----------
990       -- Current
991       ----------
992       py_za_tx_01032012.trc_PerArrRetAnu :=
993          py_za_tx_01032012.trc_PerArrRetAnu
994        + Annualise
995             ( p_YtdInc => py_za_tx_01032012.bal_ARR_RA_YTD
996             , p_PtdInc => py_za_tx_01032012.bal_ARR_RA_PTD
997             );
998       ---------
999       -- Annual
1000       ---------
1001       py_za_tx_01032012.trc_AnnArrRetAnu :=
1002          py_za_tx_01032012.trc_PerArrRetAnu
1003        + py_za_tx_01032012.bal_ANN_ARR_RA_YTD;
1004 
1005    ------------------------
1006    -- Medical Aid Abatement
1007    ------------------------
1008       -- If the person is not yet 65 this tax year
1009       IF l_65Year > l_ZA_TX_YR_END THEN
1010          ----------
1011          -- Current
1012          ----------
1013          py_za_tx_01032012.trc_PerMedAidAbm :=
1014             Annualise
1015                ( p_YtdInc => py_za_tx_01032012.bal_MED_CNTRB_ABM_YTD
1016                , p_PtdInc => py_za_tx_01032012.bal_MED_CNTRB_ABM_PTD
1017                );
1018          ---------
1019          -- Annual
1020          ---------
1021          py_za_tx_01032012.trc_AnnMedAidAbm :=
1022             py_za_tx_01032012.trc_PerMedAidAbm
1023           + py_za_tx_01032012.bal_ANN_MED_CNTRB_ABM_YTD;
1024       ELSE
1025       -- if the person is over 65
1026          ----------
1027          -- Current
1028          ----------
1029          py_za_tx_01032012.trc_PerMedAidAbm :=
1030             Annualise
1031                ( p_YtdInc => py_za_tx_01032012.bal_MED_CONTR_YTD
1032                , p_PtdInc => py_za_tx_01032012.bal_MED_CONTR_PTD
1033                )
1034             +
1035             -- Medical Aid Employer Contribution Changes
1036             Annualise
1037                ( p_YtdInc => py_za_tx_01032012.bal_ER_MED_CONTR_YTD
1038                , p_PtdInc => py_za_tx_01032012.bal_ER_MED_CONTR_PTD
1039                );
1040          ---------
1041          -- Annual
1042          ---------
1043          py_za_tx_01032012.trc_AnnMedAidAbm := py_za_tx_01032012.trc_PerMedAidAbm;
1044       END IF;
1045       hr_utility.set_location('py_za_tx_utl_01032012.Abatements',23);
1046 
1047    ---------------------------
1048    -- Income Protection Policy
1049    ---------------------------
1050       ---------------------
1051       -- Period Calculation
1052       ---------------------
1053       -- Annualise Income Protection Policy Contributions
1054       py_za_tx_01032012.trc_PerIncProPolAbm := Annualise
1055                  (p_YtdInc => py_za_tx_01032012.bal_EE_INC_PRO_POL_YTD
1056                  ,p_PtdInc => py_za_tx_01032012.bal_EE_INC_PRO_POL_PTD
1057                  );
1058 
1059       hr_utility.set_location('py_za_tx_utl_01032012.Abatements',24);
1060 
1061       ---------------------
1062       -- Annual Calculation
1063       ---------------------
1064       -- Annual Income Protection Policy Contributions
1065       py_za_tx_01032012.trc_AnnIncProPolAbm :=
1066          py_za_tx_01032012.trc_PerIncProPolAbm
1067        + py_za_tx_01032012.bal_ANN_EE_INC_PRO_POL_YTD;
1068 
1069    --TYS2010
1070    -------------------------------
1071    -- Donation made by EE pd by ER
1072    -------------------------------
1073       ---------------------
1074       -- Period Calculation
1075       ---------------------
1076       -- Annualise Donation Amount
1077       py_za_tx_01032012.trc_PerDonAmt := Annualise
1078                  (p_YtdInc => py_za_tx_01032012.bal_DONAT_MD_EE_YTD
1079                  ,p_PtdInc => py_za_tx_01032012.bal_DONAT_MD_EE_PTD
1080                  );
1081 
1082       hr_utility.set_location('py_za_tx_utl_01032012.Abatements',25);
1083 
1084       ---------------------
1085       -- Annual Calculation
1086       ---------------------
1087       -- Annual Donation
1088       py_za_tx_01032012.trc_AnnDonAmt :=
1089          py_za_tx_01032012.trc_PerDonAmt
1090        + py_za_tx_01032012.bal_ANN_DONAT_MD_EE_YTD;
1091 
1092 
1093    -------------------------------------------------------------------------
1094    ELSIF py_za_tx_01032012.trc_CalTyp IN ('YtdCalc','SitCalc') THEN       --
1095    -------------------------------------------------------------------------
1096       hr_utility.set_location('py_za_tx_utl_01032012.Abatements',26);
1097 
1098    -- Bug 9369895
1099    -- If employee is on Fixed Percentage of Total Package then calculate the Total Taxable Income
1100    -- which includes both periodic and annual income. This will be used in calculation of Pension
1101    -- fund abatement
1102    if py_za_tx_01032012.trc_PenBasis = 1 then
1103         hr_utility.set_location('py_za_tx_utl_01032012.Abatements - Package Structure',27);
1104 
1105         l_TotTxbNIYtd :=  py_za_tx_01032012.bal_TOT_TXB_NI_YTD
1106                         * py_za_tx_01032012.trc_SitFactor;
1107 
1108         l_TotTxbFBYtd :=  py_za_tx_01032012.bal_TOT_TXB_FB_YTD
1109                         * py_za_tx_01032012.trc_SitFactor;
1110 
1111         l_TotTxbTAYtd :=  py_za_tx_01032012.bal_TOT_TXB_TA_YTD
1112                         * py_za_tx_01032012.trc_SitFactor;
1113 
1114         l_TotTxbPOYtd :=  py_za_tx_01032012.bal_TOT_TXB_PO_YTD
1115                         * py_za_tx_01032012.trc_SitFactor;
1116 
1117         l_TotTxbIncPkgYtd :=     (  l_TotTxbNIYtd + l_TotTxbFBYtd
1118                                   + l_TotTxbTAYtd + l_TotTxbPOYtd
1119                                   + py_za_tx_01032012.bal_TOT_TXB_AB_YTD
1120                                   + py_za_tx_01032012.bal_TOT_TXB_AP_YTD
1121                                   + py_za_tx_01032012.bal_TOT_TXB_AP_NTG_YTD );
1122 
1123         l_TotTxbIncEEDbtPkgYtd :=  ( l_TotTxbIncPkgYtd
1124                                   + py_za_tx_01032012.bal_TOT_TXB_EE_DBT_NTG_YTD );
1125 
1126 
1127         hr_utility.set_location('l_TotTxbNIYtd          :'||to_char(l_TotTxbNIYtd),27);
1128         hr_utility.set_location('l_TotTxbFBYtd          :'||to_char(l_TotTxbFBYtd),27);
1129         hr_utility.set_location('l_TotTxbTAYtd          :'||to_char(l_TotTxbTAYtd),27);
1130         hr_utility.set_location('l_TotTxbPOYtd          :'||to_char(l_TotTxbPOYtd),27);
1131         hr_utility.set_location('l_TotTxbIncPkgYtd      :'||to_char(l_TotTxbIncPkgYtd),27);
1132         hr_utility.set_location('l_TotTxbIncEEDbtPkgYtd :'||to_char(l_TotTxbIncEEDbtPkgYtd),27);
1133 
1134    end if;
1135 
1136    -------------------------
1137    -- Pension Fund Abatement
1138    -------------------------
1139       ---------------------
1140       -- Period Calculation
1141       ---------------------
1142       -- Annualise Period Pension Fund Contribution
1143       py_za_tx_01032012.trc_PerPenFnd :=
1144          py_za_tx_01032012.bal_CUR_PF_YTD
1145        * py_za_tx_01032012.trc_SitFactor;
1146       -- Annualise Period Rfiable Contributions
1147       py_za_tx_01032012.trc_PerRfiCon :=
1148          py_za_tx_01032012.bal_TOT_RFI_INC_YTD
1149        * py_za_tx_01032012.trc_SitFactor;
1150       ---------------------
1151       -- Annual Calculation
1152       ---------------------
1153       -- Annual Pension Fund Contribution
1154       py_za_tx_01032012.trc_AnnPenFnd :=
1155          py_za_tx_01032012.trc_PerPenFnd
1156        + py_za_tx_01032012.bal_ANN_PF_YTD;
1157       -- Annual Rfi Contribution
1158       py_za_tx_01032012.trc_AnnRfiCon :=
1159          py_za_tx_01032012.trc_PerRfiCon
1160        + py_za_tx_01032012.bal_TOT_RFI_AN_INC_YTD;
1161 
1162       -- NTG
1163       -- Annual EE Debt RFI Contribution
1164       py_za_tx_01032012.trc_AnnRfiEEDbtNTGCon :=
1165          py_za_tx_01032012.trc_AnnRfiCon
1166        + py_za_tx_01032012.bal_TOT_RFI_EE_DBT_NTG_YTD;
1167 
1168 
1169       hr_utility.set_location('py_za_tx_utl_01032012.Abatements',40);
1170 
1171    --------------------------------
1172    -- Arrear Pension Fund Abatement
1173    --------------------------------
1174       hr_utility.set_location('py_za_tx_utl_01032012.Abatements',41);
1175       -------------
1176       -- Excess ITD
1177       -------------
1178       py_za_tx_01032012.trc_PerArrPenFnd :=
1179          py_za_tx_01032012.bal_EXC_ARR_PEN_ITD;
1180 
1181       ----------
1182       -- Current
1183       ----------
1184       py_za_tx_01032012.trc_PerArrPenFnd :=
1185           py_za_tx_01032012.trc_PerArrPenFnd
1186       + ( py_za_tx_01032012.bal_ARR_PF_YTD
1187         * py_za_tx_01032012.trc_SitFactor
1188         );
1189       ---------
1190       -- Annual
1191       ---------
1192       py_za_tx_01032012.trc_AnnArrPenFnd :=
1193            py_za_tx_01032012.trc_PerArrPenFnd
1194          + py_za_tx_01032012.bal_ANN_ARR_PF_YTD;
1195 
1196 
1197    -------------------------------
1198    -- Retirement Annuity Abatement
1199    -------------------------------
1200       hr_utility.set_location('py_za_tx_utl_01032012.Abatements',42);
1201 
1202       -------------
1203       -- Current RA
1204       -------------
1205       -- Calculate RA Contribution
1206       py_za_tx_01032012.trc_PerRetAnu :=
1207          py_za_tx_01032012.bal_CUR_RA_YTD
1208        * py_za_tx_01032012.trc_SitFactor;
1209       ---------------------
1210       -- Current NRFI Contr
1211       ---------------------
1212 
1213       hr_utility.set_location('py_za_tx_utl_01032012.Abatements',43);
1214       py_za_tx_01032012.trc_PerNrfiCon :=
1215             py_za_tx_01032012.bal_TOT_NRFI_INC_YTD
1216           * py_za_tx_01032012.trc_SitFactor;
1217 
1218       ------------
1219       -- Annual RA
1220       ------------
1221       py_za_tx_01032012.trc_AnnRetAnu :=
1222          py_za_tx_01032012.trc_PerRetAnu
1223        + py_za_tx_01032012.bal_ANN_RA_YTD;
1224 
1225 
1226       hr_utility.set_location('py_za_tx_utl_01032012.Abatements',44);
1227       py_za_tx_01032012.trc_AnnNrfiCon :=
1228             py_za_tx_01032012.trc_PerNrfiCon
1229           + py_za_tx_01032012.bal_TOT_NRFI_AN_INC_YTD;
1230 
1231 
1232       -- NTG
1233       -- Annual EE Debt NRFI Contribution
1234       py_za_tx_01032012.trc_AnnNrfiEEDbtNTGCon :=
1235          py_za_tx_01032012.trc_AnnNrfiCon
1236        + py_za_tx_01032012.bal_TOT_NRFI_EE_DBT_NTG_YTD;
1237 
1238    --------------------------------------
1239    -- Arrear Retirement Annuity Abatement
1240    --------------------------------------
1241       hr_utility.set_location('py_za_tx_utl_01032012.Abatements',45);
1242       -------------
1243       -- Excess ITD
1244       -------------
1245       py_za_tx_01032012.trc_PerArrRetAnu :=
1246          py_za_tx_01032012.bal_EXC_ARR_RA_ITD;
1247       ----------
1248       -- Current
1249       ----------
1250       py_za_tx_01032012.trc_PerArrRetAnu :=
1251          py_za_tx_01032012.trc_PerArrRetAnu
1252        + ( py_za_tx_01032012.bal_ARR_RA_YTD
1253          * py_za_tx_01032012.trc_SitFactor
1254          );
1255       ---------
1256       -- Annual
1257       ---------
1258       py_za_tx_01032012.trc_AnnArrRetAnu :=
1259          py_za_tx_01032012.trc_PerArrRetAnu
1260        + py_za_tx_01032012.bal_ANN_ARR_RA_YTD;
1261 
1262    ------------------------
1263    -- Medical Aid Abatement
1264    ------------------------
1265       -- If the person is not yet 65 this tax year
1266       IF l_65Year > l_ZA_TX_YR_END THEN
1267          ----------
1268          -- Current
1269          ----------
1270          py_za_tx_01032012.trc_PerMedAidAbm :=
1271             py_za_tx_01032012.bal_MED_CNTRB_ABM_YTD
1272           * py_za_tx_01032012.trc_SitFactor;
1273          ---------
1274          -- Annual
1275          ---------
1276          py_za_tx_01032012.trc_AnnMedAidAbm :=
1277             py_za_tx_01032012.trc_PerMedAidAbm
1278           + py_za_tx_01032012.bal_ANN_MED_CNTRB_ABM_YTD;
1279       ELSE
1280       -- if the person is over 65
1281          ----------
1282          -- Current
1283          ----------
1284          py_za_tx_01032012.trc_PerMedAidAbm :=
1285             -- Medical Aid Employer Contribution Changes
1286             -- py_za_tx_01032012.bal_MED_CONTR_YTD
1287             (py_za_tx_01032012.bal_MED_CONTR_YTD + py_za_tx_01032012.bal_ER_MED_CONTR_YTD)
1288           * py_za_tx_01032012.trc_SitFactor;
1289          ---------
1290          -- Annual
1291          ---------
1292          py_za_tx_01032012.trc_AnnMedAidAbm := py_za_tx_01032012.trc_PerMedAidAbm;
1293       END IF;
1294 
1295    hr_utility.set_location('py_za_tx_utl_01032012.Abatements',46);
1296 
1297    ---------------------------
1298    -- Income Protection Policy
1299    ---------------------------
1300       ---------------------
1301       -- Period Calculation
1302       ---------------------
1303       -- Annualise Income Protection Policy Contributions
1304       py_za_tx_01032012.trc_PerIncProPolAbm :=
1305          py_za_tx_01032012.bal_EE_INC_PRO_POL_YTD
1306        * py_za_tx_01032012.trc_SitFactor;
1307 
1308       hr_utility.set_location('py_za_tx_utl_01032012.Abatements',47);
1309 
1310       ---------------------
1311       -- Annual Calculation
1312       ---------------------
1313       -- Annual Income Protection Policy Contributions
1314       py_za_tx_01032012.trc_AnnIncProPolAbm :=
1315          py_za_tx_01032012.trc_PerIncProPolAbm
1316        + py_za_tx_01032012.bal_ANN_EE_INC_PRO_POL_YTD;
1317 
1318 
1319    --TYS2010
1320    -------------------------------
1321    -- Donation made by EE pd by ER
1322    -------------------------------
1323       ---------------------
1324       -- Period Calculation
1325       ---------------------
1326       -- Annualise Donation Amount
1327       py_za_tx_01032012.trc_PerDonAmt :=
1328                  py_za_tx_01032012.bal_DONAT_MD_EE_YTD
1329                  * py_za_tx_01032012.trc_SitFactor;
1330 
1331       hr_utility.set_location('py_za_tx_utl_01032012.Abatements',48);
1332 
1333       ---------------------
1334       -- Annual Calculation
1335       ---------------------
1336       -- Annual Donation
1337       py_za_tx_01032012.trc_AnnDonAmt :=
1338          py_za_tx_01032012.trc_PerDonAmt
1339        + py_za_tx_01032012.bal_ANN_DONAT_MD_EE_YTD;
1340 
1341 
1342    -------------------------------------------------------------------------
1343    ELSIF py_za_tx_01032012.trc_CalTyp = 'CalCalc' THEN                    --
1344    -------------------------------------------------------------------------
1345       hr_utility.set_location('py_za_tx_utl_01032012.Abatements',49);
1346 
1347    -- Bug 9369895
1348    -- If employee is on Fixed Percentage of Total Package then calculate the Total Taxable Income
1349    -- which includes both periodic and annual income. This will be used in calculation of Pension
1350    -- fund abatement
1351    if py_za_tx_01032012.trc_PenBasis = 1 then
1352 
1353         hr_utility.set_location('py_za_tx_utl_01032012.Abatements - Package Structure',50);
1354         l_TotTxbNIYtd :=  py_za_tx_01032012.bal_TOT_TXB_NI_CYTD
1355                         * py_za_tx_01032012.trc_SitFactor;
1356 
1357         l_TotTxbFBYtd :=  py_za_tx_01032012.bal_TOT_TXB_FB_CYTD
1358                         * py_za_tx_01032012.trc_SitFactor;
1359 
1360         l_TotTxbTAYtd :=  py_za_tx_01032012.bal_TOT_TXB_TA_CYTD
1361                         * py_za_tx_01032012.trc_SitFactor;
1362 
1363         l_TotTxbIncPkgYtd :=     (  l_TotTxbNIYtd + l_TotTxbFBYtd
1364                                   + l_TotTxbTAYtd
1365                                   + py_za_tx_01032012.bal_TOT_TXB_AB_YTD
1366                                   + py_za_tx_01032012.bal_TOT_TXB_AP_YTD
1367                                   + py_za_tx_01032012.bal_TOT_TXB_AP_NTG_YTD );
1368 
1369         l_TotTxbIncEEDbtPkgYtd :=  ( l_TotTxbIncPkgYtd
1370                                   + py_za_tx_01032012.bal_TOT_TXB_EE_DBT_NTG_YTD );
1371 
1372 
1373         hr_utility.set_location('l_TotTxbNIYtd          :'||to_char(l_TotTxbNIYtd),50);
1374         hr_utility.set_location('l_TotTxbFBYtd          :'||to_char(l_TotTxbFBYtd),50);
1375         hr_utility.set_location('l_TotTxbTAYtd          :'||to_char(l_TotTxbTAYtd),50);
1376         hr_utility.set_location('l_TotTxbPOYtd          :'||to_char(l_TotTxbPOYtd),50);
1377         hr_utility.set_location('l_TotTxbIncPkgYtd      :'||to_char(l_TotTxbIncPkgYtd),50);
1378         hr_utility.set_location('l_TotTxbIncEEDbtPkgYtd :'||to_char(l_TotTxbIncEEDbtPkgYtd),50);
1379 
1380 
1381    end if;
1382 
1383    -------------------------
1384    -- Pension Fund Abatement
1385    -------------------------
1386       ---------------------
1387       -- Period Calculation
1388       ---------------------
1389       -- Annualise Period Pension Fund Contribution
1390       py_za_tx_01032012.trc_PerPenFnd :=
1391          py_za_tx_01032012.bal_CUR_PF_CYTD
1392        * py_za_tx_01032012.trc_SitFactor;
1393       -- Annualise Period Rfiable Contributions
1394       py_za_tx_01032012.trc_PerRfiCon :=
1395          py_za_tx_01032012.bal_TOT_RFI_INC_CYTD
1396        * py_za_tx_01032012.trc_SitFactor;
1397       ---------------------
1398       -- Annual Calculation
1399       ---------------------
1400       -- Annual Pension Fund Contribution
1401       py_za_tx_01032012.trc_AnnPenFnd :=
1402          py_za_tx_01032012.trc_PerPenFnd
1403        + py_za_tx_01032012.bal_ANN_PF_YTD;
1404       -- Annual Rfi Contribution
1405       py_za_tx_01032012.trc_AnnRfiCon :=
1406          py_za_tx_01032012.trc_PerRfiCon
1407        + py_za_tx_01032012.bal_TOT_RFI_AN_INC_YTD;
1408 
1409       -- NTG
1410       -- Annual EE Debt RFI Contribution
1411       py_za_tx_01032012.trc_AnnRfiEEDbtNTGCon :=
1412          py_za_tx_01032012.trc_AnnRfiCon
1413        + py_za_tx_01032012.bal_TOT_RFI_EE_DBT_NTG_YTD;
1414 
1415    --------------------------------
1416    -- Arrear Pension Fund Abatement
1417    --------------------------------
1418       hr_utility.set_location('py_za_tx_utl_01032012.Abatements',61);
1419       -------------
1420       -- Excess ITD
1421       -------------
1422       py_za_tx_01032012.trc_PerArrPenFnd :=
1423          py_za_tx_01032012.bal_EXC_ARR_PEN_ITD;
1424       ------------------------------------
1425       -- Current/Annual based on frequency
1426       ------------------------------------
1427       py_za_tx_01032012.trc_PerArrPenFnd :=
1428           py_za_tx_01032012.trc_PerArrPenFnd
1429       + ( py_za_tx_01032012.bal_ARR_PF_CYTD
1430         * py_za_tx_01032012.trc_SitFactor
1431         );
1432       ---------
1433       -- Annual
1434       ---------
1435       py_za_tx_01032012.trc_AnnArrPenFnd :=
1436            py_za_tx_01032012.trc_PerArrPenFnd
1437          + py_za_tx_01032012.bal_ANN_ARR_PF_YTD;
1438 
1439    -------------------------------
1440    -- Retirement Annuity Abatement
1441    -------------------------------
1442       hr_utility.set_location('py_za_tx_utl_01032012.Abatements',62);
1443 
1444       -------------
1445       -- Current RA
1446       -------------
1447       -- Calculate RA Contribution
1448       py_za_tx_01032012.trc_PerRetAnu :=
1449          py_za_tx_01032012.bal_CUR_RA_CYTD
1450        * py_za_tx_01032012.trc_SitFactor;
1451       ---------------------
1452       -- Current NRFI Contr
1453       ---------------------
1454 
1455       hr_utility.set_location('py_za_tx_utl_01032012.Abatements',63);
1456       py_za_tx_01032012.trc_PerNrfiCon :=
1457             py_za_tx_01032012.bal_TOT_NRFI_INC_CYTD
1458           * py_za_tx_01032012.trc_SitFactor;
1459 
1460       ------------
1461       -- Annual RA
1462       ------------
1463       py_za_tx_01032012.trc_AnnRetAnu :=
1464          py_za_tx_01032012.trc_PerRetAnu
1465        + py_za_tx_01032012.bal_ANN_RA_YTD;
1466 
1467 
1468       hr_utility.set_location('py_za_tx_utl_01032012.Abatements',64);
1469       py_za_tx_01032012.trc_AnnNrfiCon :=
1470             py_za_tx_01032012.trc_PerNrfiCon
1471           + py_za_tx_01032012.bal_TOT_NRFI_AN_INC_YTD;
1472 
1473 
1474       -- NTG
1475       -- Annual EE Debt NRFI Contribution
1476       py_za_tx_01032012.trc_AnnNrfiEEDbtNTGCon :=
1477          py_za_tx_01032012.trc_AnnNrfiCon
1478        + py_za_tx_01032012.bal_TOT_NRFI_EE_DBT_NTG_YTD;
1479 
1480    --------------------------------------
1481    -- Arrear Retirement Annuity Abatement
1482    --------------------------------------
1483       hr_utility.set_location('py_za_tx_utl_01032012.Abatements',65);
1484       -------------
1485       -- Excess ITD
1486       -------------
1487       py_za_tx_01032012.trc_PerArrRetAnu := py_za_tx_01032012.bal_EXC_ARR_RA_ITD;
1488       ----------
1489       -- Current
1490       ----------
1491       py_za_tx_01032012.trc_PerArrRetAnu :=
1492          py_za_tx_01032012.trc_PerArrRetAnu
1493        + ( py_za_tx_01032012.bal_ARR_RA_CYTD
1494          * py_za_tx_01032012.trc_SitFactor
1495          );
1496       ---------
1497       -- Annual
1498       ---------
1499       py_za_tx_01032012.trc_AnnArrRetAnu :=
1500          py_za_tx_01032012.trc_PerArrRetAnu
1501        + py_za_tx_01032012.bal_ANN_ARR_RA_YTD;
1502 
1503    ------------------------
1504    -- Medical Aid Abatement
1505    ------------------------
1506       -- If the person is not yet 65 this tax year
1507       IF l_65Year > l_ZA_TX_YR_END THEN
1508          ----------
1509          -- Current
1510          ----------
1511          py_za_tx_01032012.trc_PerMedAidAbm :=
1512             py_za_tx_01032012.bal_MED_CNTRB_ABM_CYTD
1513           * py_za_tx_01032012.trc_SitFactor;
1514          ---------
1515          -- Annual
1516          ---------
1517          py_za_tx_01032012.trc_AnnMedAidAbm :=
1518             py_za_tx_01032012.trc_PerMedAidAbm
1519           + py_za_tx_01032012.bal_ANN_MED_CNTRB_ABM_YTD;
1520       ELSE
1521       -- if the person is over 65
1522          ----------
1523          -- Current
1524          ----------
1525          py_za_tx_01032012.trc_PerMedAidAbm :=
1526             -- Medical Aid Employer Contribution Changes
1527             -- py_za_tx_01032012.bal_MED_CONTR_CYTD
1528             (py_za_tx_01032012.bal_MED_CONTR_CYTD + py_za_tx_01032012.bal_ER_MED_CONTR_CYTD)
1529           * py_za_tx_01032012.trc_SitFactor;
1530          ---------
1531          -- Annual
1532          ---------
1533          py_za_tx_01032012.trc_AnnMedAidAbm := py_za_tx_01032012.trc_PerMedAidAbm;
1534       END IF;
1535 
1536    ---------------------------
1537    -- Income Protection Policy
1538    ---------------------------
1539       ---------------------
1540       -- Period Calculation
1541       ---------------------
1542       -- Annualise Income Protection Policy Contributions
1543       py_za_tx_01032012.trc_PerIncProPolAbm :=
1544          py_za_tx_01032012.bal_EE_INC_PRO_POL_CYTD
1545        * py_za_tx_01032012.trc_SitFactor;
1546 
1547       hr_utility.set_location('py_za_tx_utl_01032012.Abatements',66);
1548 
1549       ---------------------
1550       -- Annual Calculation
1551       ---------------------
1552       -- Annual Income Protection Policy Contributions
1553       py_za_tx_01032012.trc_AnnIncProPolAbm :=
1554          py_za_tx_01032012.trc_PerIncProPolAbm
1555        + py_za_tx_01032012.bal_ANN_EE_INC_PRO_POL_YTD;
1556 
1557    --TYS2010
1558    -------------------------------
1559    -- Donation made by EE pd by ER
1560    -------------------------------
1561       ---------------------
1562       -- Period Calculation
1563       ---------------------
1564       -- Annualise Donation Amount
1565       py_za_tx_01032012.trc_PerDonAmt :=
1566          py_za_tx_01032012.bal_DONAT_MD_EE_CYTD
1567        * py_za_tx_01032012.trc_SitFactor;
1568 
1569       hr_utility.set_location('py_za_tx_utl_01032012.Abatements',67);
1570 
1571       ---------------------
1572       -- Annual Calculation
1573       ---------------------
1574       -- Annual Donation
1575       py_za_tx_01032012.trc_AnnDonAmt :=
1576          py_za_tx_01032012.trc_PerDonAmt
1577        + py_za_tx_01032012.bal_ANN_DONAT_MD_EE_YTD;
1578 
1579 
1580    -------------------------------------------------------------------------
1581    ELSIF py_za_tx_01032012.trc_CalTyp IN ('BasCalc') THEN       --
1582    -------------------------------------------------------------------------
1583       hr_utility.set_location('py_za_tx_utl_01032012.Abatements',67);
1584 
1585    -- Bug 9369895
1586    -- If employee is on Fixed Percentage of Total Package then calculate the Total Taxable Income
1587    -- which includes both periodic and annual income. This will be used in calculation of Pension
1588    -- fund abatement
1589    if py_za_tx_01032012.trc_PenBasis = 1 then
1590         hr_utility.set_location('py_za_tx_utl_01032012.Abatements - Package Structure',68);
1591 
1592         l_TotTxbIncPkgYtd :=      ( py_za_tx_01032012.bal_TOT_TXB_AB_YTD
1593                                   + py_za_tx_01032012.bal_TOT_TXB_AP_YTD
1594                                   + py_za_tx_01032012.bal_TOT_TXB_AP_NTG_YTD );
1595 
1596         l_TotTxbIncEEDbtPkgYtd :=     ( l_TotTxbIncPkgYtd
1597                                       + py_za_tx_01032012.bal_TOT_TXB_EE_DBT_NTG_YTD );
1598 
1599         hr_utility.set_location('l_TotTxbIncPkgYtd      :'||to_char(l_TotTxbIncPkgYtd),68);
1600         hr_utility.set_location('l_TotTxbIncEEDbtPkgYtd :'||to_char(l_TotTxbIncEEDbtPkgYtd),68);
1601 
1602 
1603    end if;
1604 
1605    -------------------------
1606    -- Pension Fund Abatement
1607    -------------------------
1608       ---------------------
1609       -- Annual Calculation
1610       ---------------------
1611       -- Annual Pension Fund Contribution
1612       py_za_tx_01032012.trc_AnnPenFnd := py_za_tx_01032012.bal_ANN_PF_YTD;
1613       -- Annual Rfi Contribution
1614       py_za_tx_01032012.trc_AnnRfiCon := py_za_tx_01032012.bal_TOT_RFI_AN_INC_YTD;
1615       -- NTG
1616       -- Annual EE Debt RFI Contribution
1617       py_za_tx_01032012.trc_AnnRfiEEDbtNTGCon :=
1618          py_za_tx_01032012.trc_AnnRfiCon
1619        + py_za_tx_01032012.bal_TOT_RFI_EE_DBT_NTG_YTD;
1620 
1621 
1622       hr_utility.set_location('py_za_tx_utl_01032012.Abatements',78);
1623 
1624    --------------------------------
1625    -- Arrear Pension Fund Abatement
1626    --------------------------------
1627       hr_utility.set_location('py_za_tx_utl_01032012.Abatements',79);
1628       -------------
1629       -- Excess ITD
1630       -------------
1631       py_za_tx_01032012.trc_PerArrPenFnd := py_za_tx_01032012.bal_EXC_ARR_PEN_ITD;
1632 
1633       ---------
1634       -- Annual
1635       ---------
1636       py_za_tx_01032012.trc_AnnArrPenFnd := py_za_tx_01032012.trc_PerArrPenFnd
1637                                           + py_za_tx_01032012.bal_ANN_ARR_PF_YTD;
1638 
1639 
1640    -------------------------------
1641    -- Retirement Annuity Abatement
1642    -------------------------------
1643       hr_utility.set_location('py_za_tx_utl_01032012.Abatements',80);
1644 
1645       ------------
1646       -- Annual RA
1647       ------------
1648       py_za_tx_01032012.trc_AnnRetAnu := py_za_tx_01032012.bal_ANN_RA_YTD;
1649 
1650       hr_utility.set_location('py_za_tx_utl_01032012.Abatements',81);
1651       py_za_tx_01032012.trc_AnnNrfiCon := py_za_tx_01032012.bal_TOT_NRFI_AN_INC_YTD;
1652       -- NTG
1653       -- Annual EE Debt NRFI Contribution
1654       py_za_tx_01032012.trc_AnnNrfiEEDbtNTGCon :=
1655          py_za_tx_01032012.trc_AnnNrfiCon
1656        + py_za_tx_01032012.bal_TOT_NRFI_EE_DBT_NTG_YTD;
1657 
1658 
1659    --------------------------------------
1660    -- Arrear Retirement Annuity Abatement
1661    --------------------------------------
1662       hr_utility.set_location('py_za_tx_utl_01032012.Abatements',82);
1663       -------------
1664       -- Excess ITD
1665       -------------
1666       py_za_tx_01032012.trc_PerArrRetAnu := py_za_tx_01032012.bal_EXC_ARR_RA_ITD;
1667 
1668       ---------
1669       -- Annual
1670       ---------
1671       py_za_tx_01032012.trc_AnnArrRetAnu := py_za_tx_01032012.trc_PerArrRetAnu
1672                                           + py_za_tx_01032012.bal_ANN_ARR_RA_YTD;
1673 
1674    ------------------------
1675    -- Medical Aid Abatement
1676    ------------------------
1677       py_za_tx_01032012.trc_PerMedAidAbm := 0;
1678       If l_65Year > l_ZA_TX_YR_END Then
1679            hr_utility.set_location('py_za_tx_utl_01032012.Abatements',83);
1680            py_za_tx_01032012.trc_AnnMedAidAbm := 0;
1681       else
1682            hr_utility.set_location('py_za_tx_utl_01032012.Abatements',83);
1683            py_za_tx_01032012.trc_AnnMedAidAbm :=
1684                       py_za_tx_01032012.trc_PerMedAidAbm
1685                    + py_za_tx_01032012.bal_ANN_MED_CNTRB_ABM_YTD;
1686       end if;
1687 
1688    hr_utility.set_location('py_za_tx_utl_01032012.Abatements',83);
1689 
1690 
1691    ---------------------------
1692    -- Income Protection Policy
1693    ---------------------------
1694       ---------------------
1695       -- Annual Calculation
1696       ---------------------
1697       -- Annual Income Protection Policy Contributions
1698       py_za_tx_01032012.trc_AnnIncProPolAbm :=
1699          py_za_tx_01032012.bal_ANN_EE_INC_PRO_POL_YTD;
1700 
1701 
1702    hr_utility.set_location('py_za_tx_utl_01032012.Abatements',84);
1703 
1704    --TYS2010
1705    -------------------------------
1706    -- Donation made by EE pd by ER
1707    -------------------------------
1708 
1709       ---------------------
1710       -- Annual Calculation
1711       ---------------------
1712       -- Annual Donation
1713       py_za_tx_01032012.trc_AnnDonAmt :=
1714          py_za_tx_01032012.bal_ANN_DONAT_MD_EE_YTD;
1715 
1716    hr_utility.set_location('py_za_tx_utl_01032012.Abatements',85);
1717 
1718    -------------------------------------------------------------------------
1719    ELSIF py_za_tx_01032012.trc_CalTyp = 'SeaCalc' THEN                    --
1720    -------------------------------------------------------------------------
1721       hr_utility.set_location('py_za_tx_utl_01032012.Abatements',88);
1722 
1723    -- Bug 9369895
1724    -- If employee is on Fixed Percentage of Total Package then calculate the Total Taxable Income
1725    -- which includes both periodic and annual income. This will be used in calculation of Pension
1726    -- fund abatement
1727    if py_za_tx_01032012.trc_PenBasis = 1 then
1728         hr_utility.set_location('py_za_tx_utl_01032012.Abatements - Package Structure',89);
1729 
1730         l_TotTxbNIYtd :=  py_za_tx_01032012.bal_TOT_TXB_NI_RUN
1731                         * py_za_tx_01032012.trc_SitFactor;
1732 
1733         l_TotTxbFBYtd :=  py_za_tx_01032012.bal_TOT_TXB_FB_RUN
1734                         * py_za_tx_01032012.trc_SitFactor;
1735 
1736         l_TotTxbIncPkgYtd :=     (  l_TotTxbNIYtd + l_TotTxbFBYtd
1737                                   + py_za_tx_01032012.bal_TOT_TXB_AP_RUN );
1738         hr_utility.set_location('l_TotTxbNIYtd        :'||to_char(l_TotTxbNIYtd),89);
1739         hr_utility.set_location('l_TotTxbFBYtd        :'||to_char(l_TotTxbFBYtd),89);
1740         hr_utility.set_location('l_TotTxbIncPkgYtd    :'||to_char(l_TotTxbIncPkgYtd),89);
1741 
1742    end if;
1743 
1744    -------------------------
1745    -- Pension Fund Abatement
1746    -------------------------
1747       ---------------------
1748       -- Period Calculation
1749       ---------------------
1750       -- Annualise Period Pension Fund Contribution
1751       py_za_tx_01032012.trc_PerPenFnd :=
1752          py_za_tx_01032012.bal_CUR_PF_RUN
1753        * py_za_tx_01032012.trc_SitFactor;
1754       -- Annualise Period Rfiable Contributions
1755       py_za_tx_01032012.trc_PerRfiCon :=
1756          py_za_tx_01032012.bal_TOT_RFI_INC_RUN
1757        * py_za_tx_01032012.trc_SitFactor;
1758       ---------------------
1759       -- Annual Calculation
1760       ---------------------
1761       -- Annual Pension Fund Contribution
1762       py_za_tx_01032012.trc_AnnPenFnd :=
1763          py_za_tx_01032012.trc_PerPenFnd
1764        + py_za_tx_01032012.bal_ANN_PF_RUN;
1765       -- Annual Rfi Contribution
1766       py_za_tx_01032012.trc_AnnRfiCon :=
1767          py_za_tx_01032012.trc_PerRfiCon
1768        + py_za_tx_01032012.bal_TOT_RFI_AN_INC_RUN;
1769 
1770    --------------------------------
1771    -- Arrear Pension Fund Abatement
1772    --------------------------------
1773       py_za_tx_01032012.trc_PerArrPenFnd := 0;
1774       py_za_tx_01032012.trc_AnnArrPenFnd := 0;
1775 
1776    -------------------------------
1777    -- Retirement Annuity Abatement
1778    -------------------------------
1779       hr_utility.set_location('py_za_tx_utl_01032012.Abatements',89);
1780 
1781       -------------
1782       -- Current RA
1783       -------------
1784       -- Calculate RA Contribution
1785       py_za_tx_01032012.trc_PerRetAnu :=
1786          py_za_tx_01032012.bal_CUR_RA_RUN
1787        * py_za_tx_01032012.trc_SitFactor;
1788       ---------------------
1789       -- Current NRFI Contr
1790       ---------------------
1791 
1792       hr_utility.set_location('py_za_tx_utl_01032012.Abatements',90);
1793       py_za_tx_01032012.trc_PerNrfiCon :=
1794             py_za_tx_01032012.bal_TOT_NRFI_INC_RUN
1795           * py_za_tx_01032012.trc_SitFactor;
1796 
1797 
1798       ------------
1799       -- Annual RA
1800       ------------
1801       py_za_tx_01032012.trc_AnnRetAnu :=
1802          py_za_tx_01032012.trc_PerRetAnu
1803        + py_za_tx_01032012.bal_ANN_RA_RUN;
1804 
1805 
1806       hr_utility.set_location('py_za_tx_utl_01032012.Abatements',91);
1807       py_za_tx_01032012.trc_AnnNrfiCon :=
1808             py_za_tx_01032012.trc_PerNrfiCon
1809           + py_za_tx_01032012.bal_TOT_NRFI_AN_INC_RUN;
1810 
1811 
1812    ----------------------------
1813    -- Arrear Retirement Annuity
1814    ----------------------------
1815       py_za_tx_01032012.trc_PerArrRetAnu := 0;
1816       py_za_tx_01032012.trc_AnnArrRetAnu := 0;
1817 
1818    ------------------------
1819    -- Medical Aid Abatement
1820    ------------------------
1821       -- If the person is not yet 65 this tax year
1822       IF l_65Year > l_ZA_TX_YR_END THEN
1823          ----------
1824          -- Current
1825          ----------
1826          py_za_tx_01032012.trc_PerMedAidAbm :=
1827             py_za_tx_01032012.bal_MED_CNTRB_ABM_RUN
1828           * py_za_tx_01032012.trc_SitFactor;
1829          ---------
1830          -- Annual
1831          ---------
1832          py_za_tx_01032012.trc_AnnMedAidAbm :=
1833             py_za_tx_01032012.trc_PerMedAidAbm
1834           + py_za_tx_01032012.bal_ANN_MED_CNTRB_ABM_RUN;
1835       ELSE
1836       -- if the person is over 65
1837          ----------
1838          -- Current
1839          ----------
1840          py_za_tx_01032012.trc_PerMedAidAbm :=
1841             -- Medical Aid Employer Contribution Changes
1842             --py_za_tx_01032012.bal_MED_CONTR_RUN
1843            ( py_za_tx_01032012.bal_MED_CONTR_RUN + py_za_tx_01032012.bal_ER_MED_CONTR_RUN)
1844           * py_za_tx_01032012.trc_SitFactor;
1845          ---------
1846          -- Annual
1847          ---------
1848          py_za_tx_01032012.trc_AnnMedAidAbm := py_za_tx_01032012.trc_PerMedAidAbm;
1849       END IF;
1850 
1851    ---------------------------
1852    -- Income Protection Policy
1853    ---------------------------
1854       ---------------------
1855       -- Period Calculation
1856       ---------------------
1857       -- Annualise Income Protection Policy Contributions
1858       py_za_tx_01032012.trc_PerIncProPolAbm :=
1859          py_za_tx_01032012.bal_EE_INC_PRO_POL_RUN
1860        * py_za_tx_01032012.trc_SitFactor;
1861 
1862       hr_utility.set_location('py_za_tx_utl_01032012.Abatements',92);
1863 
1864       ---------------------
1865       -- Annual Calculation
1866       ---------------------
1867       -- Annual Income Protection Policy Contributions
1868       py_za_tx_01032012.trc_AnnIncProPolAbm :=
1869          py_za_tx_01032012.trc_PerIncProPolAbm
1870        + py_za_tx_01032012.bal_ANN_EE_INC_PRO_POL_RUN;
1871 
1872 
1873    --TYS2010
1874    -------------------------------
1875    -- Donation made by EE pd by ER
1876    -------------------------------
1877       ---------------------
1878       -- Period Calculation
1879       ---------------------
1880       -- Annualise Donation Amount
1881       py_za_tx_01032012.trc_PerDonAmt :=
1882          py_za_tx_01032012.bal_DONAT_MD_EE_RUN
1883        * py_za_tx_01032012.trc_SitFactor;
1884 
1885       hr_utility.set_location('py_za_tx_utl_01032012.Abatements',93);
1886 
1887       ---------------------
1888       -- Annual Calculation
1889       ---------------------
1890       -- Annual Donation
1891       py_za_tx_01032012.trc_AnnDonAmt :=
1892          py_za_tx_01032012.trc_PerDonAmt
1893        + py_za_tx_01032012.bal_ANN_DONAT_MD_EE_RUN;
1894 
1895    --Abatements will not be calculated for LteCalc as a part of bug 8844712
1896    -------------------------------------------------------------------------
1897    ELSIF py_za_tx_01032012.trc_CalTyp = 'LteCalc' THEN                    --
1898    -------------------------------------------------------------------------
1899       hr_utility.set_location('py_za_tx_utl_01032012.Abatements',95);
1900    -------------------------
1901    -- Pension Fund Abatement
1902    -------------------------
1903       ---------------------
1904       -- Period Calculation
1905       ---------------------
1906       -- Annualise Period Pension Fund Contribution
1907       py_za_tx_01032012.trc_PerPenFnd :=
1908          py_za_tx_01032012.bal_CUR_PF_YTD;
1909       -- Annualise Period Rfiable Contributions
1910       py_za_tx_01032012.trc_PerRfiCon :=
1911          py_za_tx_01032012.bal_TOT_RFI_INC_YTD;
1912       ---------------------
1913       -- Annual Calculation
1914       ---------------------
1915       -- Annual Pension Fund Contribution
1916       py_za_tx_01032012.trc_AnnPenFnd :=
1917          py_za_tx_01032012.trc_PerPenFnd
1918        + py_za_tx_01032012.bal_ANN_PF_YTD;
1919       -- Annual Rfi Contribution
1920       py_za_tx_01032012.trc_AnnRfiCon :=
1921          py_za_tx_01032012.trc_PerRfiCon
1922        + py_za_tx_01032012.bal_TOT_RFI_AN_INC_YTD;
1923 
1924       -- NTG
1925       -- Annual EE Debt RFI Contribution
1926       py_za_tx_01032012.trc_AnnRfiEEDbtNTGCon :=
1927          py_za_tx_01032012.trc_AnnRfiCon
1928        + py_za_tx_01032012.bal_TOT_RFI_EE_DBT_NTG_YTD;
1929 
1930    --------------------------------
1931    -- Arrear Pension Fund Abatement
1932    --------------------------------
1933       hr_utility.set_location('py_za_tx_utl_01032012.Abatements',104);
1934       -------------
1935       -- Excess ITD
1936       -------------
1937       py_za_tx_01032012.trc_PerArrPenFnd :=
1938          py_za_tx_01032012.bal_EXC_ARR_PEN_ITD;
1939       ----------
1940       -- Current
1941       ----------
1942       py_za_tx_01032012.trc_PerArrPenFnd :=
1943          py_za_tx_01032012.trc_PerArrPenFnd
1944        + py_za_tx_01032012.bal_ARR_PF_YTD;
1945        ---------
1946        -- Annual
1947        ---------
1948        py_za_tx_01032012.trc_AnnArrPenFnd :=
1949           py_za_tx_01032012.trc_PerArrPenFnd
1950         + py_za_tx_01032012.bal_ANN_ARR_PF_YTD;
1951 
1952    -------------------------------
1953    -- Retirement Annuity Abatement
1954    -------------------------------
1955       hr_utility.set_location('py_za_tx_utl_01032012.Abatements',105);
1956       -------------
1957       -- Current RA
1958       -------------
1959       hr_utility.set_location('py_za_tx_utl_01032012.Abatements',106);
1960       -- Calculate RA Contribution
1961       py_za_tx_01032012.trc_PerRetAnu :=
1962          py_za_tx_01032012.bal_CUR_RA_YTD;
1963       ---------------------
1964       -- Current NRFI Contr
1965       ---------------------
1966 
1967       hr_utility.set_location('py_za_tx_utl_01032012.Abatements',107);
1968       py_za_tx_01032012.trc_PerNrfiCon :=
1969             py_za_tx_01032012.bal_TOT_NRFI_INC_YTD;
1970 
1971 
1972       ------------
1973       -- Annual RA
1974       ------------
1975       py_za_tx_01032012.trc_AnnRetAnu :=
1976          py_za_tx_01032012.trc_PerRetAnu
1977        + py_za_tx_01032012.bal_ANN_RA_YTD;
1978 
1979 
1980       hr_utility.set_location('py_za_tx_utl_01032012.Abatements',108);
1981       py_za_tx_01032012.trc_AnnNrfiCon :=
1982             py_za_tx_01032012.trc_PerNrfiCon
1983           + py_za_tx_01032012.bal_TOT_NRFI_AN_INC_YTD;
1984 
1985       -- NTG
1986       -- Annual EE Debt NRFI Contribution
1987       py_za_tx_01032012.trc_AnnNrfiEEDbtNTGCon :=
1988          py_za_tx_01032012.trc_AnnNrfiCon
1989        + py_za_tx_01032012.bal_TOT_NRFI_EE_DBT_NTG_YTD;
1990 
1991    --------------------------------------
1992    -- Arrear Retirement Annuity Abatement
1993    --------------------------------------
1994       hr_utility.set_location('py_za_tx_utl_01032012.Abatements',109);
1995       -------------
1996       -- Excess ITD
1997       -------------
1998       py_za_tx_01032012.trc_PerArrRetAnu :=
1999          py_za_tx_01032012.bal_EXC_ARR_RA_ITD;
2000       ----------
2001       -- Current
2002       ----------
2003       py_za_tx_01032012.trc_PerArrRetAnu :=
2004          py_za_tx_01032012.trc_PerArrRetAnu
2005        + py_za_tx_01032012.bal_ARR_RA_YTD;
2006       ---------
2007       -- Annual
2008       ---------
2009       py_za_tx_01032012.trc_AnnArrRetAnu :=
2010          py_za_tx_01032012.trc_PerArrRetAnu
2011        + py_za_tx_01032012.bal_ANN_ARR_RA_YTD;
2012 
2013    ------------------------
2014    -- Medical Aid Abatement
2015    ------------------------
2016       IF l_65Year > l_ZA_TX_YR_END THEN
2017          ----------
2018          -- Current
2019          ----------
2020          py_za_tx_01032012.trc_PerMedAidAbm :=
2021             py_za_tx_01032012.bal_MED_CNTRB_ABM_YTD;
2022          ---------
2023          -- Annual
2024          ---------
2025          py_za_tx_01032012.trc_AnnMedAidAbm :=
2026             py_za_tx_01032012.trc_PerMedAidAbm
2027           + py_za_tx_01032012.bal_ANN_MED_CNTRB_ABM_YTD;
2028       ELSE
2029       -- if the person is over 65
2030          ----------
2031          -- Current
2032          ----------
2033          py_za_tx_01032012.trc_PerMedAidAbm :=
2034             -- Medical Aid Employer Contribution Changes
2035             --py_za_tx_01032012.bal_MED_CONTR_YTD;
2036             py_za_tx_01032012.bal_MED_CONTR_YTD + py_za_tx_01032012.bal_ER_MED_CONTR_YTD;
2037          ---------
2038          -- Annual
2039          ---------
2040          py_za_tx_01032012.trc_AnnMedAidAbm := py_za_tx_01032012.trc_PerMedAidAbm;
2041       END IF;
2042 
2043    ---------------------------
2044    -- Income Protection Policy
2045    ---------------------------
2046       ---------------------
2047       -- Period Calculation
2048       ---------------------
2049       -- Annualise Income Protection Policy Contributions
2050       py_za_tx_01032012.trc_PerIncProPolAbm :=
2051          py_za_tx_01032012.bal_EE_INC_PRO_POL_YTD;
2052 
2053       hr_utility.set_location('py_za_tx_utl_01032012.Abatements',110);
2054 
2055       ---------------------
2056       -- Annual Calculation
2057       ---------------------
2058       -- Annual Income Protection Policy Contributions
2059       py_za_tx_01032012.trc_AnnIncProPolAbm :=
2060          py_za_tx_01032012.trc_PerIncProPolAbm
2061        + py_za_tx_01032012.bal_ANN_EE_INC_PRO_POL_YTD;
2062 
2063 
2064    --TYS2010
2065    -------------------------------
2066    -- Donation made by EE pd by ER
2067    -------------------------------
2068       ---------------------
2069       -- Period Calculation
2070       ---------------------
2071       -- Annualise Donation Amount
2072       py_za_tx_01032012.trc_PerDonAmt :=
2073              py_za_tx_01032012.bal_DONAT_MD_EE_YTD;
2074 
2075       hr_utility.set_location('py_za_tx_utl_01032012.Abatements',111);
2076 
2077       ---------------------
2078       -- Annual Calculation
2079       ---------------------
2080       -- Annual Donation
2081       py_za_tx_01032012.trc_AnnDonAmt :=
2082          py_za_tx_01032012.trc_PerDonAmt
2083        + py_za_tx_01032012.bal_ANN_DONAT_MD_EE_YTD;
2084 
2085 
2086    -------------------------------------------------------------------------
2087    ELSIF py_za_tx_01032012.trc_CalTyp = 'PstCalc' THEN                    --
2088    -------------------------------------------------------------------------
2089       hr_utility.set_location('py_za_tx_utl_01032012.Abatements',117);
2090    -------------------------
2091    -- Pension Fund Abatement
2092    -------------------------
2093       ---------------------
2094       -- Period Calculation
2095       ---------------------
2096       -- Annualise Period Pension Fund Contribution
2097       py_za_tx_01032012.trc_PerPenFnd :=
2098          py_za_tx_01032012.bal_CUR_PF_PTD
2099        * py_za_tx_01032012.trc_SitFactor;
2100       -- Annualise Period Rfiable Contributions
2101       py_za_tx_01032012.trc_PerRfiCon :=
2102          py_za_tx_01032012.bal_TOT_RFI_INC_PTD
2103        * py_za_tx_01032012.trc_SitFactor;
2104       ---------------------
2105       -- Annual Calculation
2106       ---------------------
2107       -- Annual Pension Fund Contribution
2108       py_za_tx_01032012.trc_AnnPenFnd :=
2109          py_za_tx_01032012.trc_PerPenFnd
2110        + py_za_tx_01032012.bal_ANN_PF_PTD;
2111       -- Annual Rfi Contribution
2112       py_za_tx_01032012.trc_AnnRfiCon :=
2113          py_za_tx_01032012.trc_PerRfiCon
2114        + py_za_tx_01032012.bal_TOT_RFI_AN_INC_PTD;
2115 
2116       -- NTG
2117       -- Annual EE Debt RFI Contribution
2118       py_za_tx_01032012.trc_AnnRfiEEDbtNTGCon :=
2119          py_za_tx_01032012.trc_AnnRfiCon
2120        + py_za_tx_01032012.bal_TOT_RFI_EE_DBT_NTG_YTD;
2121    --------------------------------
2122    -- Arrear Pension Fund Abatement
2123    --------------------------------
2124       hr_utility.set_location('py_za_tx_utl_01032012.Abatements',118);
2125       -------------
2126       -- Excess ITD
2127       -------------
2128       py_za_tx_01032012.trc_PerArrPenFnd :=
2129          py_za_tx_01032012.bal_EXC_ARR_PEN_PTD;
2130       ----------
2131       -- Current
2132       ----------
2133       py_za_tx_01032012.trc_PerArrPenFnd :=
2134           py_za_tx_01032012.trc_PerArrPenFnd
2135       + ( py_za_tx_01032012.bal_ARR_PF_PTD
2136         * py_za_tx_01032012.trc_SitFactor
2137         );
2138       ---------
2139       -- Annual
2140       ---------
2141       py_za_tx_01032012.trc_AnnArrPenFnd :=
2142          py_za_tx_01032012.trc_PerArrPenFnd
2143        + py_za_tx_01032012.bal_ANN_ARR_PF_PTD;
2144 
2145    -------------------------------
2146    -- Retirement Annuity Abatement
2147    -------------------------------
2148       hr_utility.set_location('py_za_tx_utl_01032012.Abatements',119);
2149 
2150       -------------
2151       -- Current RA
2152       -------------
2153       -- Calculate RA Contribution
2154       py_za_tx_01032012.trc_PerRetAnu :=
2155          py_za_tx_01032012.bal_CUR_RA_PTD
2156        * py_za_tx_01032012.trc_SitFactor;
2157       ---------------------
2158       -- Current NRFI Contr
2159       ---------------------
2160 
2161       hr_utility.set_location('py_za_tx_utl_01032012.Abatements',120);
2162       py_za_tx_01032012.trc_PerNrfiCon :=
2163             py_za_tx_01032012.bal_TOT_NRFI_INC_PTD
2164           * py_za_tx_01032012.trc_SitFactor;
2165 
2166 
2167       ------------
2168       -- Annual RA
2169       ------------
2170       py_za_tx_01032012.trc_AnnRetAnu :=
2171          py_za_tx_01032012.trc_PerRetAnu
2172        + py_za_tx_01032012.bal_ANN_RA_PTD;
2173 
2174 
2175       hr_utility.set_location('py_za_tx_utl_01032012.Abatements',121);
2176       py_za_tx_01032012.trc_AnnNrfiCon :=
2177             py_za_tx_01032012.trc_PerNrfiCon
2178           + py_za_tx_01032012.bal_TOT_NRFI_AN_INC_PTD;
2179 
2180       -- NTG
2181       -- Annual EE Debt NRFI Contribution
2182       py_za_tx_01032012.trc_AnnNrfiEEDbtNTGCon :=
2183          py_za_tx_01032012.trc_AnnNrfiCon
2184        + py_za_tx_01032012.bal_TOT_NRFI_EE_DBT_NTG_YTD;
2185 
2186    --------------------------------------
2187    -- Arrear Retirement Annuity Abatement
2188    --------------------------------------
2189       hr_utility.set_location('py_za_tx_utl_01032012.Abatements',122);
2190       -------------
2191       -- Excess ITD
2192       -------------
2193       py_za_tx_01032012.trc_PerArrRetAnu :=
2194          py_za_tx_01032012.bal_EXC_ARR_RA_PTD;
2195       ----------
2196       -- Current
2197       ----------
2198       py_za_tx_01032012.trc_PerArrRetAnu :=
2199          py_za_tx_01032012.trc_PerArrRetAnu
2200        + ( py_za_tx_01032012.bal_ARR_RA_PTD
2201          * py_za_tx_01032012.trc_SitFactor
2202          );
2203       ---------
2204       -- Annual
2205       ---------
2206       py_za_tx_01032012.trc_AnnArrRetAnu :=
2207          py_za_tx_01032012.trc_PerArrRetAnu
2208        + py_za_tx_01032012.trc_AnnArrRetAnu
2209        + py_za_tx_01032012.bal_ANN_ARR_RA_PTD;
2210 
2211    ------------------------
2212    -- Medical Aid Abatement
2213    ------------------------
2214       -- If the person is not yet 65 this tax year
2215       IF l_65Year > l_ZA_TX_YR_END THEN
2216          ----------
2217          -- Current
2218          ----------
2219          py_za_tx_01032012.trc_PerMedAidAbm :=
2220             py_za_tx_01032012.bal_MED_CNTRB_ABM_PTD
2221           * py_za_tx_01032012.trc_SitFactor;
2222          ---------
2223          -- Annual
2224          ---------
2225          py_za_tx_01032012.trc_AnnMedAidAbm :=
2226             py_za_tx_01032012.trc_PerMedAidAbm
2227           + py_za_tx_01032012.bal_ANN_MED_CNTRB_ABM_PTD;
2228       ELSE
2229       -- if the person is over 65
2230          ----------
2231          -- Current
2232          ----------
2233          py_za_tx_01032012.trc_PerMedAidAbm :=
2234             -- Medical Aid Employer Contribution Changes
2235             -- py_za_tx_01032012.bal_MED_CONTR_PTD
2236             (py_za_tx_01032012.bal_MED_CONTR_PTD + py_za_tx_01032012.bal_ER_MED_CONTR_PTD)
2237           * py_za_tx_01032012.trc_SitFactor;
2238          ---------
2239          -- Annual
2240          ---------
2241          py_za_tx_01032012.trc_AnnMedAidAbm := py_za_tx_01032012.trc_PerMedAidAbm;
2242       END IF;
2243 
2244    ---------------------------
2245    -- Income Protection Policy
2246    ---------------------------
2247       ---------------------
2248       -- Period Calculation
2249       ---------------------
2250       -- Annualise Income Protection Policy Contributions
2251       py_za_tx_01032012.trc_PerIncProPolAbm :=
2252          py_za_tx_01032012.bal_EE_INC_PRO_POL_PTD
2253        * py_za_tx_01032012.trc_SitFactor;
2254 
2255       hr_utility.set_location('py_za_tx_utl_01032012.Abatements',123);
2256 
2257       ---------------------
2258       -- Annual Calculation
2259       ---------------------
2260       -- Annual Income Protection Policy Contributions
2261       py_za_tx_01032012.trc_AnnIncProPolAbm :=
2262          py_za_tx_01032012.trc_PerIncProPolAbm
2263        + py_za_tx_01032012.bal_ANN_EE_INC_PRO_POL_PTD;
2264 
2265 
2266    --TYS2010
2267    -------------------------------
2268    -- Donation made by EE pd by ER
2269    -------------------------------
2270       ---------------------
2271       -- Period Calculation
2272       ---------------------
2273       -- Annualise Donation Amount
2274       py_za_tx_01032012.trc_PerDonAmt :=
2275          py_za_tx_01032012.bal_DONAT_MD_EE_PTD
2276        * py_za_tx_01032012.trc_SitFactor;
2277 
2278 
2279       hr_utility.set_location('py_za_tx_utl_01032012.Abatements',124);
2280 
2281       ---------------------
2282       -- Annual Calculation
2283       ---------------------
2284       -- Annual Donation
2285       py_za_tx_01032012.trc_AnnDonAmt :=
2286          py_za_tx_01032012.trc_PerDonAmt
2287        + py_za_tx_01032012.bal_ANN_DONAT_MD_EE_PTD;
2288 
2289 
2290    -------------------------------------------------------------------------
2291    END IF;--                End CalcTyp Check
2292    -------------------------------------------------------------------------
2293 
2294 
2295 ----------------------------------------------------------------------------
2296 --                        CALCULATE THE ABATEMENTS                        --
2297 ----------------------------------------------------------------------------
2298    hr_utility.set_location('py_za_tx_utl_01032012.Abatements',124);
2299    -- Check the Calculation Type
2300    /*
2301    IF py_za_tx_01032012.trc_CalTyp = 'PstCalc' THEN
2302       hr_utility.set_location('py_za_tx_utl_01032012.Abatements',125);
2303       -- Employee Tax Year Start and End Dates
2304       --
2305       l_EndDate  := py_za_tx_01032012.dbi_ZA_ASG_TX_YR_END;
2306 
2307       hr_utility.set_location('py_za_tx_utl_01032012.Abatements',126);
2308 
2309       -- Global Values
2310       l_ZA_TX_YR_END        := l_EndDate;
2311       l_ZA_ARR_PF_AN_MX_ABT := GlbVal('ZA_ARREAR_PEN_AN_MAX_ABATE',l_EndDate);
2312       l_ZA_ARR_RA_AN_MX_ABT := GlbVal('ZA_ARREAR_RA_AN_MAX_ABATE' ,l_EndDate);
2313       l_ZA_PF_AN_MX_ABT     := GlbVal('ZA_PEN_AN_MAX_ABATE'       ,l_EndDate);
2314       l_ZA_PF_MX_PRC        := GlbVal('ZA_PEN_MAX_PERC'           ,l_EndDate);
2315       l_ZA_RA_AN_MX_ABT     := GlbVal('ZA_RA_AN_MAX_ABATE'        ,l_EndDate);
2316       l_ZA_RA_MX_PRC        := GlbVal('ZA_RA_MAX_PERC'            ,l_EndDate);
2317       -- Bug 8691928
2318       py_za_tx_01032012.trc_AllowDonPerc := GlbVal('ZA_ALLOWABLE_DONATION_PERC' ,l_EndDate);
2319 
2320    ELSE */
2321       hr_utility.set_location('py_za_tx_utl_01032012.Abatements',127);
2322       -- Set locals to current values
2323       l_ZA_TX_YR_END         := py_za_tx_01032012.dbi_ZA_TX_YR_END;
2324       l_ZA_ARR_PF_AN_MX_ABT  := py_za_tx_01032012.glb_ZA_ARR_PF_AN_MX_ABT;
2325       l_ZA_ARR_RA_AN_MX_ABT  := py_za_tx_01032012.glb_ZA_ARR_RA_AN_MX_ABT;
2326       l_ZA_PF_AN_MX_ABT      := py_za_tx_01032012.glb_ZA_PF_AN_MX_ABT;
2327       l_ZA_PF_MX_PRC         := py_za_tx_01032012.glb_ZA_PF_MX_PRC;
2328       l_ZA_RA_AN_MX_ABT      := py_za_tx_01032012.glb_ZA_RA_AN_MX_ABT;
2329       l_ZA_RA_MX_PRC         := py_za_tx_01032012.glb_ZA_RA_MX_PRC;
2330       py_za_tx_01032012.trc_AllowDonPerc := py_za_tx_01032012.glb_ZA_ALLOW_DONATION_PERC;
2331 
2332 
2333    --END IF;
2334 
2335    WriteHrTrace('l_ZA_TX_YR_END:        '||to_char(l_ZA_TX_YR_END,'DD/MM/YYYY'));
2336    WriteHrTrace('l_ZA_ARR_PF_AN_MX_ABT: '||to_char(l_ZA_ARR_PF_AN_MX_ABT      ));
2337    WriteHrTrace('l_ZA_ARR_RA_AN_MX_ABT: '||to_char(l_ZA_ARR_RA_AN_MX_ABT      ));
2338    WriteHrTrace('l_ZA_PF_AN_MX_ABT:     '||to_char(l_ZA_PF_AN_MX_ABT          ));
2339    WriteHrTrace('l_ZA_PF_MX_PRC:        '||to_char(l_ZA_PF_MX_PRC             ));
2340    WriteHrTrace('l_ZA_RA_AN_MX_ABT:     '||to_char(l_ZA_RA_AN_MX_ABT          ));
2341    WriteHrTrace('l_ZA_RA_MX_PRC:        '||to_char(l_ZA_RA_MX_PRC             ));
2342 
2343 -------------------------
2344 -- Pension Fund Abatement
2345 -------------------------
2346 
2347    if py_za_tx_01032012.trc_PenBasis = 2 then --Percentage of Specific Income
2348            ---------------------
2349            -- Period Calculation
2350            ---------------------
2351            -- Calculate the Pension Fund Maximum
2352            py_za_tx_01032012.trc_PerPenFndMax :=
2353               GREATEST( l_ZA_PF_AN_MX_ABT
2354                       , l_ZA_PF_MX_PRC / 100 * py_za_tx_01032012.trc_PerRfiCon
2355                       );
2356            -- Calculate Period Pension Fund Abatement
2357            py_za_tx_01032012.trc_PerPenFndAbm :=
2358               LEAST( py_za_tx_01032012.trc_PerPenFnd
2359                    , py_za_tx_01032012.trc_PerPenFndMax);
2360 
2361            ---------------------
2362            -- Annual Calculation
2363            ---------------------
2364            -- Calculate the Pension Fund Maximum
2365            py_za_tx_01032012.trc_AnnPenFndMax :=
2366               GREATEST( l_ZA_PF_AN_MX_ABT
2367                       , l_ZA_PF_MX_PRC / 100 * py_za_tx_01032012.trc_AnnRfiCon
2368                       );
2369 
2370            -- Calculate Annual Pension Fund Abatement
2371            py_za_tx_01032012.trc_AnnPenFndAbm :=
2372               LEAST( py_za_tx_01032012.trc_AnnPenFnd
2373                    , py_za_tx_01032012.trc_AnnPenFndMax);
2374 
2375            -- NTG
2376            -- Calculate the Pension Fund Maximum for Net to Gross Pymt of EE Debt
2377            py_za_tx_01032012.trc_AnnPenFndNTGMax :=
2378               GREATEST( l_ZA_PF_AN_MX_ABT
2379                       , l_ZA_PF_MX_PRC / 100 * py_za_tx_01032012.trc_AnnRfiEEDbtNTGCon
2380                       );
2381 
2382            -- Calculate Annual Pension Fund Abatement for Net to Gross Pymt of EE Debt
2383            py_za_tx_01032012.trc_AnnPenFndNTGAbm :=
2384               LEAST( py_za_tx_01032012.trc_AnnPenFnd
2385                    , py_za_tx_01032012.trc_AnnPenFndNTGMax);
2386 
2387 
2388    else
2389 
2390            ---------------------
2391            -- Annual Calculation
2392            ---------------------
2393            -- Calculate Annual Pension Fund Abatement
2394            py_za_tx_01032012.trc_AnnPenFndAbm :=
2395               LEAST( py_za_tx_01032012.trc_AnnPenFnd
2396                    ,l_ZA_PF_MX_PRC / 100 * py_za_tx_01032012.trc_AnnRfiCon
2397                    ,l_ZA_PF_MX_PRC / 100 * l_TotTxbIncPkgYtd);
2398 
2399            --Periodic Pension Fund Abatement is same as annual as annual income is considered for Periodic abatement too
2400            py_za_tx_01032012.trc_PerPenFndAbm :=  py_za_tx_01032012.trc_AnnPenFndAbm;
2401            -- NTG
2402            -- Calculate Annual Pension Fund Abatement for Net to Gross Pymt of EE Debt
2403            py_za_tx_01032012.trc_AnnPenFndNTGAbm :=
2404               LEAST( py_za_tx_01032012.trc_AnnPenFnd
2405                    ,l_ZA_PF_MX_PRC / 100 * py_za_tx_01032012.trc_AnnRfiEEDbtNTGCon
2406                    ,l_ZA_PF_MX_PRC / 100 * l_TotTxbIncEEDbtPkgYtd);
2407 
2408    end if;
2409 
2410 
2411 --------------------------------
2412 -- Arrear Pension Fund Abatement
2413 --------------------------------
2414    ---------------------
2415    -- Period Calculation
2416    ---------------------
2417    py_za_tx_01032012.trc_PerArrPenFndAbm :=
2418       LEAST( py_za_tx_01032012.trc_PerArrPenFnd
2419            , l_ZA_ARR_PF_AN_MX_ABT
2420            );
2421    ---------------------
2422    -- Annual Calculation
2423    ---------------------
2424    py_za_tx_01032012.trc_AnnArrPenFndAbm :=
2425       LEAST( py_za_tx_01032012.trc_AnnArrPenFnd
2426            , l_ZA_ARR_PF_AN_MX_ABT
2427            );
2428 ---------------------------------
2429 -- Retirement Annnnuity Abatement
2430 ---------------------------------
2431    ---------------------
2432    -- Period Calculation
2433    ---------------------
2434    -- Calculate the Retirement Annuity Maximum
2435    py_za_tx_01032012.trc_PerRetAnuMax :=
2436       GREATEST( l_ZA_PF_AN_MX_ABT
2437               , l_ZA_RA_AN_MX_ABT - py_za_tx_01032012.trc_PerPenFndAbm
2438               , l_ZA_RA_MX_PRC / 100 * py_za_tx_01032012.trc_PerNrfiCon
2439               );
2440 
2441    -- Calculate Retirement Annuity Abatement
2442    py_za_tx_01032012.trc_PerRetAnuAbm :=
2443       LEAST( py_za_tx_01032012.trc_PerRetAnu
2444            , py_za_tx_01032012.trc_PerRetAnuMax);
2445    ---------------------
2446    -- Annual Calculation
2447    ---------------------
2448    py_za_tx_01032012.trc_AnnRetAnuMax :=
2449       GREATEST( l_ZA_PF_AN_MX_ABT
2450               , l_ZA_RA_AN_MX_ABT - py_za_tx_01032012.trc_AnnPenFndAbm
2451               , l_ZA_RA_MX_PRC / 100 * py_za_tx_01032012.trc_AnnNrfiCon
2452               );
2453 
2454    -- Calculate Retirement Annuity Abatement
2455    py_za_tx_01032012.trc_AnnRetAnuAbm :=
2456       LEAST( py_za_tx_01032012.trc_AnnRetAnu
2457            , py_za_tx_01032012.trc_AnnRetAnuMax);
2458 
2459    -- NTG
2460    -- Calculate the Retirement Annuity Maximum for Net to Gross Pymt of EE Debt
2461    py_za_tx_01032012.trc_AnnRetAnuNTGMax :=
2462       GREATEST( l_ZA_PF_AN_MX_ABT
2463               , l_ZA_RA_AN_MX_ABT - py_za_tx_01032012.trc_AnnPenFndNTGAbm
2464               , l_ZA_RA_MX_PRC / 100 * py_za_tx_01032012.trc_AnnNrfiEEDbtNTGCon
2465               );
2466 
2467    -- Calculate the Retirement Annuity Abatement for Net to Gross Pymt of EE Debt
2468    py_za_tx_01032012.trc_AnnRetAnuNTGAbm :=
2469       LEAST( py_za_tx_01032012.trc_AnnRetAnu
2470            , py_za_tx_01032012.trc_AnnRetAnuNTGMax);
2471 
2472 --------------------------------------
2473 -- Arrear Retirement Annuity Abatement
2474 --------------------------------------
2475    ---------------------
2476    -- Period Calculation
2477    ---------------------
2478    py_za_tx_01032012.trc_PerArrRetAnuAbm :=
2479       LEAST( py_za_tx_01032012.trc_PerArrRetAnu
2480            , l_ZA_ARR_RA_AN_MX_ABT);
2481    ---------------------
2482    -- Annual Calculation
2483    ---------------------
2484    py_za_tx_01032012.trc_AnnArrRetAnuAbm :=
2485       LEAST( py_za_tx_01032012.trc_AnnArrRetAnu
2486            , l_ZA_ARR_RA_AN_MX_ABT);
2487 
2488    --TYE 2012/13 Medical Aid Abatement Changes
2489    -----------------------------------
2490    -- Medical Aid Abatement Adjustment
2491    -----------------------------------
2492       -- If the person is not yet 65 this tax year
2493       -- No Abatement from TYE 2012/13 onwards
2494       IF l_65Year > l_ZA_TX_YR_END THEN
2495          hr_utility.set_location('py_za_tx_utl_01032012.Abatements',128);
2496 
2497          py_za_tx_01032012.trc_PerMedAidAbm := 0;
2498          py_za_tx_01032012.trc_AnnMedAidAbm := 0;
2499       END IF;
2500 
2501 -------------------
2502 -- TOTAL ABATEMENTS
2503 -------------------
2504    -- Period Total Abatement
2505    py_za_tx_01032012.trc_PerTotAbm := ( py_za_tx_01032012.trc_PerPenFndAbm
2506                                       + py_za_tx_01032012.trc_PerArrPenFndAbm
2507                                       + py_za_tx_01032012.trc_PerRetAnuAbm
2508                                       + py_za_tx_01032012.trc_PerArrRetAnuAbm
2509                                       + py_za_tx_01032012.trc_PerMedAidAbm
2510                                       + py_za_tx_01032012.trc_PerIncProPolAbm
2511                                       );
2512 
2513    -- Annual Total Abatements
2514    py_za_tx_01032012.trc_AnnTotAbm := ( py_za_tx_01032012.trc_AnnPenFndAbm
2515                                       + py_za_tx_01032012.trc_AnnArrPenFndAbm
2516                                       + py_za_tx_01032012.trc_AnnRetAnuAbm
2517                                       + py_za_tx_01032012.trc_AnnArrRetAnuAbm
2518                                       + py_za_tx_01032012.trc_AnnMedAidAbm
2519                                       + py_za_tx_01032012.trc_AnnIncProPolAbm
2520                                       );
2521    -- NTG
2522    -- Annual Payment of EE Debt Abatements
2523    py_za_tx_01032012.trc_AnnTotNTGAbm := ( py_za_tx_01032012.trc_AnnPenFndNTGAbm
2524                                       + py_za_tx_01032012.trc_AnnArrPenFndAbm
2525                                       + py_za_tx_01032012.trc_AnnRetAnuNTGAbm
2526                                       + py_za_tx_01032012.trc_AnnArrRetAnuAbm
2527                                       + py_za_tx_01032012.trc_AnnMedAidAbm
2528                                       + py_za_tx_01032012.trc_AnnIncProPolAbm
2529                                       );
2530 
2531 
2532 
2533    WriteHrTrace('py_za_tx_01032012.trc_PerTotAbm:                      '||to_char(py_za_tx_01032012.trc_PerTotAbm ));
2534    WriteHrTrace('   trc_PerTotAbm consists of:               __________');
2535    WriteHrTrace('   py_za_tx_01032012.trc_PerPenFndAbm:         '||to_char(py_za_tx_01032012.trc_PerPenFndAbm   ));
2536    WriteHrTrace('   py_za_tx_01032012.trc_PerArrPenFndAbm:      '||to_char(py_za_tx_01032012.trc_PerArrPenFndAbm));
2537    WriteHrTrace('   py_za_tx_01032012.trc_PerRetAnuAbm:         '||to_char(py_za_tx_01032012.trc_PerRetAnuAbm   ));
2538    WriteHrTrace('   py_za_tx_01032012.trc_PerArrRetAnuAbm:      '||to_char(py_za_tx_01032012.trc_PerArrRetAnuAbm));
2539    WriteHrTrace('   py_za_tx_01032012.trc_PerMedAidAbm:         '||to_char(py_za_tx_01032012.trc_PerMedAidAbm      ));
2540    WriteHrTrace('   py_za_tx_01032012.trc_PerIncProPolAbm:      '||to_char(py_za_tx_01032012.trc_PerIncProPolAbm));
2541    WriteHrTrace(' ');
2542    WriteHrTrace('py_za_tx_01032012.trc_AnnTotAbm:                      '||to_char(py_za_tx_01032012.trc_AnnTotAbm ));
2543    WriteHrTrace('   trc_AnnTotAbm consists of:               __________');
2544    WriteHrTrace('   py_za_tx_01032012.trc_AnnPenFndAbm:      '||to_char(py_za_tx_01032012.trc_AnnPenFndAbm   ));
2545    WriteHrTrace('   py_za_tx_01032012.trc_AnnArrPenFndAbm:   '||to_char(py_za_tx_01032012.trc_AnnArrPenFndAbm));
2546    WriteHrTrace('   py_za_tx_01032012.trc_AnnRetAnuAbm:      '||to_char(py_za_tx_01032012.trc_AnnRetAnuAbm   ));
2547    WriteHrTrace('   py_za_tx_01032012.trc_AnnArrRetAnuAbm:   '||to_char(py_za_tx_01032012.trc_AnnArrRetAnuAbm));
2548    WriteHrTrace('   py_za_tx_01032012.trc_AnnMedAidAbm:      '||to_char(py_za_tx_01032012.trc_AnnMedAidAbm      ));
2549    WriteHrTrace('   py_za_tx_01032012.trc_AnnIncProPolAbm:   '||to_char(py_za_tx_01032012.trc_AnnIncProPolAbm));
2550    WriteHrTrace(' ');
2551    WriteHrTrace('py_za_tx_01032012.trc_AnnTotNTGAbm:                   '||to_char(py_za_tx_01032012.trc_AnnTotNTGAbm ));
2552    WriteHrTrace('   trc_AnnTotNTGAbm consists of:            __________');
2553    WriteHrTrace('   py_za_tx_01032012.trc_AnnPenFndNTGAbm:   '||to_char(py_za_tx_01032012.trc_AnnPenFndNTGAbm   ));
2554    WriteHrTrace('   py_za_tx_01032012.trc_AnnArrPenFndAbm:   '||to_char(py_za_tx_01032012.trc_AnnArrPenFndAbm));
2555    WriteHrTrace('   py_za_tx_01032012.trc_AnnRetAnuNTGAbm:   '||to_char(py_za_tx_01032012.trc_AnnRetAnuNTGAbm   ));
2556    WriteHrTrace('   py_za_tx_01032012.trc_AnnArrRetAnuAbm:   '||to_char(py_za_tx_01032012.trc_AnnArrRetAnuAbm));
2557    WriteHrTrace('   py_za_tx_01032012.trc_AnnMedAidAbm:      '||to_char(py_za_tx_01032012.trc_AnnMedAidAbm      ));
2558    WriteHrTrace('   py_za_tx_01032012.trc_AnnIncProPolAbm:   '||to_char(py_za_tx_01032012.trc_AnnIncProPolAbm));
2559    WriteHrTrace(' ');
2560    WriteHrTrace(' ');
2561    WriteHrTrace('   py_za_tx_01032012.trc_PerDonAmt   :      '||to_char(py_za_tx_01032012.trc_PerDonAmt   ));
2562    WriteHrTrace('   py_za_tx_01032012.trc_AnnDonAmt   :      '||to_char(py_za_tx_01032012.trc_AnnDonAmt   ));
2563    WriteHrTrace('   py_za_tx_01032012.trc_AllowDonPerc:      '||to_char(py_za_tx_01032012.trc_AllowDonPerc   ));
2564 
2565 EXCEPTION
2566    WHEN OTHERS THEN
2567       IF py_za_tx_01032012.xpt_Msg = 'No Error' THEN
2568          py_za_tx_01032012.xpt_Msg := 'Abatements: '||TO_CHAR(SQLCODE);
2569       END IF;
2570       RAISE py_za_tx_01032012.xpt_E;
2571 END Abatements;
2572 -------------------------------------------------------------------------------
2573 -- ArrearExcess                                                              --
2574 -------------------------------------------------------------------------------
2575 PROCEDURE ArrearExcess AS
2576 -- Variables
2577    l_PfExcessAmt NUMBER;
2578    l_RaExcessAmt NUMBER;
2579 
2580 BEGIN
2581    hr_utility.set_location('py_za_tx_utl_01032012.ArrearExcess',1);
2582 -- Pension Excess
2583    l_PfExcessAmt := ( py_za_tx_01032012.bal_ARR_PF_YTD
2584                     + ( py_za_tx_01032012.bal_EXC_ARR_PEN_ITD
2585                       - py_za_tx_01032012.bal_EXC_ARR_PEN_YTD
2586                       )
2587                     ) - py_za_tx_01032012.glb_ZA_ARR_PF_AN_MX_ABT;
2588 
2589    IF l_PfExcessAmt > 0 THEN
2590       hr_utility.set_location('py_za_tx_utl_01032012.ArrearExcess',2);
2591       py_za_tx_01032012.trc_PfUpdFig := l_PfExcessAmt - py_za_tx_01032012.bal_EXC_ARR_PEN_ITD;
2592    ELSE
2593       hr_utility.set_location('py_za_tx_utl_01032012.ArrearExcess',3);
2594       py_za_tx_01032012.trc_PfUpdFig := -1*(py_za_tx_01032012.bal_EXC_ARR_PEN_ITD);
2595    END IF;
2596 
2597 -- Retirement Annuity
2598    l_RaExcessAmt := ( py_za_tx_01032012.bal_ARR_RA_YTD
2599                     + ( py_za_tx_01032012.bal_EXC_ARR_RA_ITD
2600                       - py_za_tx_01032012.bal_EXC_ARR_RA_YTD
2601                       )
2602                     ) - py_za_tx_01032012.glb_ZA_ARR_RA_AN_MX_ABT;
2603 
2604    IF l_RaExcessAmt > 0 THEN
2605       hr_utility.set_location('py_za_tx_utl_01032012.ArrearExcess',4);
2606       py_za_tx_01032012.trc_RaUpdFig := l_RaExcessAmt - py_za_tx_01032012.bal_EXC_ARR_RA_ITD;
2607    ELSE
2608       hr_utility.set_location('py_za_tx_utl_01032012.ArrearExcess',5);
2609       py_za_tx_01032012.trc_RaUpdFig := -1*(py_za_tx_01032012.bal_EXC_ARR_RA_ITD);
2610    END IF;
2611 
2612    hr_utility.set_location('py_za_tx_utl_01032012.ArrearExcess',6);
2613    WriteHrTrace('l_PfExcessAmt: '||to_char(l_PfExcessAmt));
2614    WriteHrTrace('l_RaExcessAmt: '||to_char(l_RaExcessAmt));
2615 
2616 EXCEPTION
2617    WHEN OTHERS THEN
2618       IF py_za_tx_01032012.xpt_Msg = 'No Error' THEN
2619          py_za_tx_01032012.xpt_Msg := 'ArrearExcess: '||TO_CHAR(SQLCODE);
2620       END IF;
2621       RAISE py_za_tx_01032012.xpt_E;
2622 END ArrearExcess;
2623 -------------------------------------------------------------------------------
2624 -- GetTableValue                                                             --
2625 -------------------------------------------------------------------------------
2626 FUNCTION GetTableValue
2627    ( p_TableName     IN pay_user_tables.user_table_name%TYPE
2628    , p_ColumnName    IN pay_user_columns.user_column_name%TYPE
2629    , p_RowValue      IN NUMBER
2630    , p_EffectiveDate IN DATE
2631    ) RETURN VARCHAR2
2632 AS
2633 -- Variables
2634 --
2635    l_UserTableID pay_user_tables.user_table_id%TYPE;
2636    l_ColumnID    pay_user_columns.user_column_id%TYPE;
2637    l_RowID       pay_user_rows_f.user_row_id%TYPE;
2638    l_TableValue  pay_user_column_instances_f.value%TYPE;
2639 BEGIN
2640    hr_utility.set_location('py_za_tx_utl_01032012.GetTableValue',1);
2641    -- Get the user_table_id
2642    --
2643    select put.user_table_id
2644      INTO l_UserTableID
2645      from pay_user_tables put
2646     where upper(put.user_table_name) = upper(p_TableName)
2647       AND put.legislation_code       = 'ZA';
2648 
2649    hr_utility.set_location('py_za_tx_utl_01032012.GetTableValue',2);
2650    -- Get the user_column_id
2651    --
2652    select puc.user_column_id
2653      INTO l_ColumnID
2654      from pay_user_columns            puc
2655     where puc.user_table_id           = l_UserTableID
2656       AND puc.legislation_code        = 'ZA'
2657       and puc.business_group_id       is null
2658       AND upper(puc.user_column_name) = upper(p_ColumnName);
2659 
2660    hr_utility.set_location('py_za_tx_utl_01032012.GetTableValue',3);
2661    -- Get the user_row_id
2662    --
2663    select pur.user_row_id
2664      INTO l_RowID
2665      from pay_user_tables      put
2666         , pay_user_rows_f      pur
2667     where put.user_table_id    = l_UserTableID
2668       and pur.user_table_id    = put.user_table_id
2669       AND pur.row_high_range   IS NOT NULL
2670       AND p_EffectiveDate      BETWEEN pur.effective_start_date
2671                                    AND pur.effective_end_date
2672       AND pur.legislation_code = 'ZA'
2673       AND p_RowValue           BETWEEN decode ( put.user_key_units
2674                                               , 'N'
2675                                               , FFFUNC.CN(pur.row_low_range_or_name)
2676                                               , p_RowValue+1
2677                                               )
2678                                    AND decode ( put.user_key_units
2679                                               , 'N'
2680                                               , FFFUNC.CN(pur.row_high_range)
2681                                               , p_RowValue-1
2682                                               );
2683 
2684    hr_utility.set_location('py_za_tx_utl_01032012.GetTableValue',4);
2685    -- Get the value
2686    --
2687    SELECT pucif.value
2688      INTO l_TableValue
2689      FROM pay_user_column_instances_f pucif
2690     where pucif.user_column_id        = l_ColumnID
2691       and pucif.user_row_id           = l_RowID
2692       AND pucif.legislation_code      = 'ZA'
2693       and p_EffectiveDate             BETWEEN pucif.effective_start_date
2694                                           AND pucif.effective_end_date;
2695 
2696    hr_utility.set_location('py_za_tx_utl_01032012.GetTableValue',5);
2697    RETURN l_TableValue;
2698 EXCEPTION
2699    WHEN OTHERS THEN
2700       IF py_za_tx_01032012.xpt_Msg = 'No Error' THEN
2701          py_za_tx_01032012.xpt_Msg := 'GetTableValue: '||TO_CHAR(SQLCODE);
2702       END IF;
2703       RAISE py_za_tx_01032012.xpt_E;
2704 END GetTableValue;
2705 -------------------------------------------------------------------------------
2706 -- TaxLiability                                                              --
2707 -------------------------------------------------------------------------------
2708 FUNCTION TaxLiability
2709    (p_Amt  IN NUMBER
2710    )RETURN  NUMBER
2711 AS
2712 --
2713 -- Variables
2714 --
2715    l_fixed          pay_user_column_instances_f.value%TYPE;
2716    l_limit          pay_user_column_instances_f.value%TYPE;
2717    l_percentage     pay_user_column_instances_f.value%TYPE;
2718    l_effective_date pay_payroll_actions.effective_date%TYPE;
2719    tax_liability    t_Balance;
2720    l_TxbAmt         t_Balance;
2721 --
2722 BEGIN
2723    hr_utility.set_location('py_za_tx_utl_01032012.TaxLiability',1);
2724    -------------------------------------------------------------------------------
2725    -- First Check for a Tax Override
2726    -------------------------------------------------------------------------------
2727    IF py_za_tx_01032012.trc_OvrTxCalc AND py_za_tx_01032012.trc_OvrTyp = 'P' THEN
2728       hr_utility.set_location('py_za_tx_utl_01032012.TaxLiability',2);
2729       tax_liability := (p_Amt * py_za_tx_01032012.trc_OvrPrc) / 100;
2730    -------------------------------------------------------------------------------
2731    -- D = Directive Percentage
2732    -- P = Private Director wth Directive Percentage
2733    -------------------------------------------------------------------------------
2734    ELSIF py_za_tx_01032012.dbi_TX_STA IN ('D','P') THEN
2735       hr_utility.set_location('py_za_tx_utl_01032012.TaxLiability',3);
2736       tax_liability := (p_Amt * py_za_tx_01032012.dbi_TX_DIR_VAL) / 100;
2737    -------------------------------------------------------------------------------
2738    -- E = Close Corporation
2739    -------------------------------------------------------------------------------
2740    ELSIF py_za_tx_01032012.dbi_TX_STA = 'E' THEN
2741       hr_utility.set_location('py_za_tx_utl_01032012.TaxLiability',4);
2742       tax_liability := (p_Amt * py_za_tx_01032012.glb_ZA_CC_TX_PRC) / 100;
2743    -------------------------------------------------------------------------------
2744    -- F = Temporary Worker/Student
2745    -------------------------------------------------------------------------------
2746    ELSIF py_za_tx_01032012.dbi_TX_STA = 'F' THEN
2747       hr_utility.set_location('py_za_tx_utl_01032012.TaxLiability',5);
2748       tax_liability := (p_Amt * py_za_tx_01032012.glb_ZA_TMP_TX_RTE) / 100;
2749    -------------------------------------------------------------------------------
2750    -- J = Personal Service Company
2751    -------------------------------------------------------------------------------
2752    ELSIF py_za_tx_01032012.dbi_TX_STA = 'J' THEN
2753       hr_utility.set_location('py_za_tx_utl_01032012.TaxLiability',6);
2754       tax_liability := (p_Amt * py_za_tx_01032012.glb_ZA_PER_SERV_COMP_PERC) / 100;
2755    -------------------------------------------------------------------------------
2756    -- K = Personal Service Trust
2757    -------------------------------------------------------------------------------
2758    ELSIF py_za_tx_01032012.dbi_TX_STA = 'K' THEN
2759       hr_utility.set_location('py_za_tx_utl_01032012.TaxLiability',7);
2760       tax_liability := (p_Amt * py_za_tx_01032012.glb_ZA_PER_SERV_TRST_PERC) / 100;
2761    -------------------------------------------------------------------------------
2762    -- L = Labour Broker
2763    -------------------------------------------------------------------------------
2764    ELSIF py_za_tx_01032012.dbi_TX_STA = 'L' THEN
2765       hr_utility.set_location('py_za_tx_utl_01032012.TaxLiability',8);
2766       tax_liability := (p_Amt * py_za_tx_01032012.glb_ZA_PER_SERV_COMP_PERC) / 100;
2767    -------------------------------------------------------------------------------
2768    -- A = Normal
2769    -- B = Provisional
2770    -- G = Seasonal Worker
2771    -- M = Private Director
2772    -------------------------------------------------------------------------------
2773    ELSIF py_za_tx_01032012.dbi_TX_STA IN ('A','B','G','M') THEN
2774       hr_utility.set_location('py_za_tx_utl_01032012.TaxLiability',9);
2775       --Bug 8844712
2776       if py_za_tx_01032012.trc_CalTyp = 'LteCalc' and py_za_tx_01032012.trc_LateSitePaye = 0 then
2777               hr_utility.set_location('py_za_tx_utl_01032012.TaxLiability',10);
2778               tax_liability := (p_Amt * py_za_tx_01032012.glb_ZA_LATE_PAYMENT_PERC) / 100;
2779       else
2780       -- Taxable Amount must be rounded off to two decimal places
2781               l_TxbAmt := round(p_Amt,2);
2782 
2783               -- effective date for the payroll_run
2784               l_effective_date := py_za_tx_01032012.dbi_PAY_PROC_PRD_DTE_PD;
2785 
2786               hr_utility.set_location('py_za_tx_utl_01032012.TaxLiability',10);
2787               l_fixed       := GetTableValue('ZA_TAX_TABLE','Fixed',l_TxbAmt,l_effective_date);
2788               l_limit       := GetTableValue('ZA_TAX_TABLE','Limit',l_TxbAmt,l_effective_date);
2789               l_percentage  := GetTableValue('ZA_TAX_TABLE','Percentage',l_TxbAmt,l_effective_date);
2790               tax_liability := (l_fixed + ((l_TxbAmt - l_limit) * (l_percentage / 100)));
2791               tax_liability := greatest(tax_liability -  py_za_tx_01032012.trc_Rebate,0);
2792               hr_utility.set_location('py_za_tx_utl_01032012.TaxLiability',11);
2793       end if;
2794    -------------------------------------------------------------------------------
2795    -- Tax Status invalid for the call to TaxLiability
2796    -------------------------------------------------------------------------------
2797    ELSE
2798       hr_utility.set_location('py_za_tx_utl_01032012.TaxLiability',12);
2799       IF py_za_tx_01032012.xpt_Msg = 'No Error' THEN
2800          py_za_tx_01032012.xpt_Msg := 'TaxLiability: Invalid Tax Status';
2801       END IF;
2802       RAISE py_za_tx_01032012.xpt_E;
2803    END IF;
2804 
2805    WriteHrTrace('l_fixed:       '||        l_fixed                      );
2806    WriteHrTrace('l_TxbAmt:      '||to_char(l_TxbAmt                    ));
2807    WriteHrTrace('l_limit:       '||        l_limit                      );
2808    WriteHrTrace('l_percentage:  '||        l_percentage                 );
2809    WriteHrTrace('trc_Rebate:    '||to_char(py_za_tx_01032012.trc_Rebate));
2810    WriteHrTrace('tax_liability: '||to_char(tax_liability               ));
2811 
2812    RETURN tax_liability;
2813 
2814 EXCEPTION
2815    WHEN OTHERS THEN
2816       IF py_za_tx_01032012.xpt_Msg = 'No Error' THEN
2817          py_za_tx_01032012.xpt_Msg := 'TaxLiability: '||TO_CHAR(SQLCODE);
2818       END IF;
2819       RAISE py_za_tx_01032012.xpt_E;
2820 END TaxLiability;
2821 -------------------------------------------------------------------------------
2822 -- DeAnnualise                                                               --
2823 -------------------------------------------------------------------------------
2824 FUNCTION DeAnnualise
2825    (p_Liab IN NUMBER
2826    ,p_TxOnYtd IN NUMBER
2827    ,p_TxOnPtd IN NUMBER
2828    ) RETURN NUMBER
2829 AS
2830    l_LiabRoy1 t_balance;
2831    l_LiabRoy2 t_balance;
2832    l_LiabRoy3 t_balance;
2833    l_LiabRoy4 t_balance;
2834    l_LiabFp   t_balance;
2835 BEGIN
2836    hr_utility.set_location('py_za_tx_utl_01032012.DeAnnualise',1);
2837    IF py_za_tx_01032012.dbi_TX_MTD = 'C' THEN -- Cumulative Tax Method
2838       -- 1
2839       l_LiabRoy1 := p_liab / py_za_tx_01032012.trc_PosFactor;
2840       -- 2
2841       l_LiabRoy2 := l_LiabRoy1 - p_TxOnYtd + p_TxOnPtd;
2842       -- 3
2843       l_LiabRoy3 := l_LiabRoy2 / py_za_tx_01032012.dbi_ZA_PAY_PRDS_LFT;
2844       -- 4
2845       l_LiabRoy4 := l_LiabRoy3 * py_za_tx_01032012.trc_PrdFactor;
2846       -- 5
2847       l_LiabFp   := l_LiabRoy4 - p_TxOnPtd;
2848       --
2849       hr_utility.set_location('py_za_tx_utl_01032012.DeAnnualise',2);
2850       --
2851       WriteHrTrace('p_liab:                               '||to_char(p_liab));
2852       WriteHrTrace('py_za_tx_01032012.trc_PosFactor:      '||to_char(py_za_tx_01032012.trc_PosFactor));
2853       WriteHrTrace('l_LiabRoy1:                           '||to_char(l_LiabRoy1));
2854       WriteHrTrace('p_TxOnYtd:                            '||to_char(p_TxOnYtd));
2855       WriteHrTrace('p_TxOnPtd:                            '||to_char(p_TxOnPtd));
2856       WriteHrTrace('l_LiabRoy2:                           '||to_char(l_LiabRoy2));
2857       WriteHrTrace('py_za_tx_01032012.dbi_ZA_PAY_PRDS_LFT:'||to_char(py_za_tx_01032012.dbi_ZA_PAY_PRDS_LFT));
2858       WriteHrTrace('l_LiabRoy3:                           '||to_char(l_LiabRoy3));
2859       WriteHrTrace('py_za_tx_01032012.trc_PrdFactor:      '||to_char(py_za_tx_01032012.trc_PrdFactor));
2860       WriteHrTrace('l_LiabRoy4:                           '||to_char(l_LiabRoy4));
2861       WriteHrTrace('l_LiabFp:                             '||to_char(l_LiabFp));
2862    ELSE  -- Non Cumulative Tax Method
2863        hr_utility.set_location('py_za_tx_utl_01032012.Annualise',3);
2864 
2865        l_LiabFp := p_Liab / py_za_tx_01032012.dbi_ZA_PAY_PRDS_PER_YR;
2866 		   WriteHrTrace('p_liab:                               '||to_char(p_liab));
2867 		   WriteHrTrace('py_za_tx_01032012.dbi_ZA_PAY_PRDS_PER_YR:'||to_char(py_za_tx_01032012.dbi_ZA_PAY_PRDS_PER_YR));
2868 		   WriteHrTrace('l_LiabFp:                             '||to_char(l_LiabFp));
2869    END IF;
2870    --
2871    RETURN l_LiabFp;
2872 
2873 EXCEPTION
2874    WHEN OTHERS THEN
2875       IF py_za_tx_01032012.xpt_Msg = 'No Error' THEN
2876          py_za_tx_01032012.xpt_Msg := 'DeAnnualise: '||TO_CHAR(SQLCODE);
2877       END IF;
2878       RAISE py_za_tx_01032012.xpt_E;
2879 END DeAnnualise;
2880 -------------------------------------------------------------------------------
2881 -- TrvAll                                                                    --
2882 -------------------------------------------------------------------------------
2883 PROCEDURE TrvAll AS
2884 -- Cursors
2885 --
2886   -- Global Effective End Dates
2887   CURSOR c_GlbEffDte
2888     (p_ty_sd DATE       -- start date
2889     ,p_ty_ed DATE       -- end date
2890     )
2891   IS
2892   SELECT effective_end_date
2893        , to_number(global_value) global_value
2894     FROM ff_globals_f
2895    WHERE effective_end_date < p_ty_ed
2896      AND effective_end_date > p_ty_sd
2897      AND global_name        = 'ZA_CAR_ALLOW_TAX_PERC';
2898 
2899 -- Variables
2900 --
2901   l_RfiBalID   pay_balance_types.balance_type_id%TYPE;
2902   l_StrtDate   DATE;
2903   l_EndDate    DATE;
2904   l_RfiYtd     t_balance DEFAULT 0;
2905   l_CurRfiYtd  t_balance DEFAULT 0;
2906   l_TotRfiYtd  t_balance DEFAULT 0;
2907   l_CurTxbRfi  t_balance DEFAULT 0;
2908   l_TotTxbRfi  t_balance DEFAULT 0;
2909   l_GlbVal     ff_globals_f.global_value%TYPE DEFAULT '0';
2910 
2911 BEGIN
2912    hr_utility.set_location('py_za_tx_utl_01032012.TrvAll',1);
2913 -- Retrieve Balance Type ID's
2914 
2915    SELECT balance_type_id
2916      INTO l_RfiBalID
2917      FROM pay_balance_types
2918     WHERE legislation_code = 'ZA'
2919       AND balance_name     = 'ZATax Total Taxable Travel Allowance';
2920 
2921 -- Check Calc and setup correct values
2922 --
2923    IF py_za_tx_01032012.trc_CalTyp in ('DirCalc','NorCalc','SitCalc','YtdCalc') THEN
2924       hr_utility.set_location('py_za_tx_utl_01032012.TrvAll',3);
2925       -- Employee Tax Year Start and End Dates
2926       --
2927       l_StrtDate := GREATEST( py_za_tx_01032012.dbi_ZA_ACT_STRT_DTE
2928                             , py_za_tx_01032012.dbi_ZA_TX_YR_STRT
2929                             );
2930       l_EndDate  := LEAST( py_za_tx_01032012.dbi_ZA_ACT_END_DTE
2931                          , py_za_tx_01032012.dbi_ZA_TX_YR_END
2932                          , py_za_tx_01032012.dbi_ZA_CUR_PRD_END_DTE
2933                          );
2934 
2935    ELSIF py_za_tx_01032012.trc_CalTyp = 'CalCalc' THEN
2936       hr_utility.set_location('py_za_tx_utl_01032012.TrvAll',4);
2937       -- Employee Tax Year Start and End Dates
2938       --
2939       l_StrtDate := to_date('01-01-'||to_char(py_za_tx_01032012.dbi_ZA_TX_YR_STRT,'YYYY')||''||'','DD-MM-YYYY');
2940       l_EndDate  := py_za_tx_01032012.dbi_ZA_TX_YR_STRT -1;
2941    -- Bug 8844712
2942    ELSIF py_za_tx_01032012.trc_CalTyp = 'LteCalc' THEN
2943       hr_utility.set_location('py_za_tx_utl_01032012.TrvAll',5);
2944       -- Employee Tax Year Start and End Dates
2945       --
2946       l_StrtDate := py_za_tx_01032012.dbi_ZA_TX_YR_STRT;
2947       l_EndDate  := py_za_tx_01032012.dbi_ZA_CUR_PRD_END_DTE;
2948    --PstCalc is not set as a part of Bug 8844712
2949    /*ELSIF py_za_tx_01032012.trc_CalTyp = 'PstCalc' THEN
2950       hr_utility.set_location('py_za_tx_utl_01032012.TrvAll',6);
2951       -- Employee Tax Year Start and End Dates
2952       --
2953       l_StrtDate := py_za_tx_01032012.dbi_ZA_ASG_TX_YR_STRT;
2954       l_EndDate := py_za_tx_01032012.dbi_ZA_ASG_TX_YR_END; */
2955    END IF;
2956 
2957    hr_utility.set_location('py_za_tx_utl_01032012.TrvAll',7);
2958 
2959 -- Loop through cursor and for every end date calculate the balance
2960    FOR v_Date IN c_GlbEffDte
2961                  (l_StrtDate
2962                  ,l_EndDate
2963                  )
2964    LOOP
2965    -- Rfi Travel Allowance
2966    --
2967       hr_utility.set_location('py_za_tx_utl_01032012.TrvAll',11);
2968       -- Check Calc Type
2969       IF py_za_tx_01032012.trc_CalTyp in ('DirCalc','NorCalc','SitCalc','YtdCalc','LteCalc','PstCalc') THEN
2970          hr_utility.set_location('py_za_tx_utl_01032012.TrvAll',12);
2971          -- Rfi Balance At That Date
2972            l_RfiYtd := py_za_bal.get_balance_value
2973                         ( py_za_tx_01032012.con_ASG_ID
2974                         , l_RfiBalID
2975                         , '_ASG_TAX_YTD'
2976                         , v_Date.effective_end_date
2977                         );
2978       ELSIF py_za_tx_01032012.trc_CalTyp = 'CalCalc' THEN
2979          hr_utility.set_location('py_za_tx_utl_01032012.TrvAll',13);
2980          -- Rfi Balance At That Date
2981            l_RfiYtd := py_za_bal.get_balance_value
2982                         ( py_za_tx_01032012.con_ASG_ID
2983                         , l_RfiBalID
2984                         , '_ASG_CAL_YTD'
2985                         , v_Date.effective_end_date
2986                         );
2987       END IF;
2988 
2989       -- Take Off the Ytd value used already
2990       l_CurRfiYtd := l_RfiYtd - l_TotRfiYtd;
2991       -- Update TotYtd value
2992       l_TotRfiYtd := l_RfiYtd;
2993       -- Get the Taxable Travel Allowance at that date
2994       l_CurTxbRfi := l_CurRfiYtd * v_Date.global_value/100;
2995       -- Add this to the total
2996       l_TotTxbRfi := l_TotTxbRfi + l_CurTxbRfi;
2997 
2998    END LOOP;
2999 
3000    WriteHrTrace('l_CurRfiYtd:  '||to_char(l_CurRfiYtd));
3001    WriteHrTrace('l_TotRfiYtd:  '||to_char(l_TotRfiYtd));
3002    WriteHrTrace('l_CurTxbRfi:  '||to_char(l_CurTxbRfi));
3003    WriteHrTrace('l_TotTxbRfi:  '||to_char(l_TotTxbRfi));
3004 
3005 -- Calculate the current Taxable Travel Allowance Value
3006 -- add this to any calculated in the loop
3007 --
3008    hr_utility.set_location('py_za_tx_utl_01032012.TrvAll',14);
3009    -- Check Calc TYPE
3010    IF py_za_tx_01032012.trc_CalTyp IN ('DirCalc','NorCalc','SitCalc','YtdCalc', 'LteCalc') THEN
3011       hr_utility.set_location('py_za_tx_utl_01032012.TrvAll',15);
3012       -- Balance Values
3013       l_RfiYtd  := py_za_tx_01032012.bal_TOT_TXB_TA_YTD;
3014       -- Global Value
3015       l_GlbVal  := py_za_tx_01032012.glb_ZA_TRV_ALL_TX_PRC;
3016 
3017    ELSIF py_za_tx_01032012.trc_CalTyp = 'PstCalc' THEN
3018       hr_utility.set_location('py_za_tx_utl_01032012.TrvAll',16);
3019       -- Balance Values
3020       l_RfiYtd := py_za_tx_01032012.bal_TOT_TXB_TA_PTD;
3021       -- Global Value
3022       SELECT TO_NUMBER(global_value)
3023         INTO l_GlbVal
3024         FROM ff_globals_f
3025        WHERE l_EndDate between effective_start_date
3026                            and effective_end_date
3027          AND global_name     = 'ZA_CAR_ALLOW_TAX_PERC';
3028 
3029       hr_utility.set_location('py_za_tx_utl_01032012.TrvAll',17);
3030 
3031    ELSIF py_za_tx_01032012.trc_CalTyp = 'CalCalc' THEN
3032       hr_utility.set_location('py_za_tx_utl_01032012.TrvAll',18);
3033       -- Balance Values
3034       l_RfiYtd  := py_za_tx_01032012.bal_TOT_TXB_TA_CYTD;
3035 
3036       -- Global Value
3037       SELECT TO_NUMBER(global_value)
3038         INTO l_GlbVal
3039         FROM ff_globals_f
3040        WHERE l_EndDate between effective_start_date
3041                            and effective_end_date
3042          AND global_name     = 'ZA_CAR_ALLOW_TAX_PERC';
3043 
3044       hr_utility.set_location('py_za_tx_utl_01032012.TrvAll',19);
3045 
3046    END IF;
3047 
3048    WriteHrTrace('l_RfiYtd:  '||to_char(l_RfiYtd));
3049    WriteHrTrace('l_GlbVal:  '||l_GlbVal);
3050 
3051 -- Rfi Travel Allowance
3052 --
3053    -- Take Off the Ytd value used already
3054    l_CurRfiYtd := l_RfiYtd - l_TotRfiYtd;
3055    -- Update TotYtd value
3056    l_TotRfiYtd := l_RfiYtd;
3057    -- Get the Taxable Travel Allowance at that date
3058    l_CurTxbRfi := l_CurRfiYtd * l_GlbVal/100;
3059    -- Add this to the total
3060    l_TotTxbRfi := l_TotTxbRfi + l_CurTxbRfi;
3061 
3062 -- Update Globals
3063 --
3064    -- Check Calc Type
3065    IF py_za_tx_01032012.trc_CalTyp IN ('DirCalc','NorCalc','SitCalc','YtdCalc', 'LteCalc') THEN
3066       hr_utility.set_location('py_za_tx_utl_01032012.TrvAll',20);
3067       py_za_tx_01032012.bal_TOT_TXB_TA_YTD  := l_TotTxbRfi;
3068    ELSIF py_za_tx_01032012.trc_CalTyp = 'PstCalc' THEN
3069       hr_utility.set_location('py_za_tx_utl_01032012.TrvAll',21);
3070       py_za_tx_01032012.bal_TOT_TXB_TA_PTD  := l_TotTxbRfi;
3071    ELSIF py_za_tx_01032012.trc_CalTyp = 'CalCalc' THEN
3072       hr_utility.set_location('py_za_tx_utl_01032012.TrvAll',22);
3073       py_za_tx_01032012.bal_TOT_TXB_TA_CYTD  := l_TotTxbRfi;
3074    END IF;
3075 
3076    WriteHrTrace('l_TotTxbRfi:  '||to_char(l_TotTxbRfi));
3077 
3078 EXCEPTION
3079    WHEN OTHERS THEN
3080       IF py_za_tx_01032012.xpt_Msg = 'No Error' THEN
3081          py_za_tx_01032012.xpt_Msg := 'TrvAll: '||TO_CHAR(SQLCODE);
3082       END IF;
3083       RAISE py_za_tx_01032012.xpt_E;
3084 END TrvAll;
3085 -------------------------------------------------------------------------------
3086 -- ValidateTaxOns                                                            --
3087 -------------------------------------------------------------------------------
3088 PROCEDURE ValidateTaxOns(
3089    p_Rf IN BOOLEAN DEFAULT FALSE -- Refund Allowed Regardless
3090    )
3091 AS
3092 
3093 -- Type Declaration
3094 --
3095    TYPE r_Row IS RECORD(
3096      Ovrrde BOOLEAN
3097     ,Lib    NUMBER
3098     );
3099 
3100    TYPE t_Table IS TABLE OF r_Row
3101       INDEX BY BINARY_INTEGER;
3102 -- Variable Declaration
3103 --
3104    t_Liabilities t_Table;
3105 
3106    l_TotLib t_Balance; -- Total Liability
3107    l_TotNp  t_Balance; -- Total Net Pay
3108    l_RecVal t_Balance; -- Recovery Value
3109    l_NewLib t_Balance; -- New Liability
3110    i NUMBER; -- Counter
3111    l_totMAC t_Balance;
3112 
3113 BEGIN
3114    hr_utility.set_location('py_za_tx_utl_01032012.ValidateTaxOns',1);
3115 -- Set up the Table
3116    t_Liabilities(1).Ovrrde := py_za_tx_01032012.trc_LibFpNIOvr;
3117    t_Liabilities(1).Lib    := py_za_tx_01032012.trc_LibFpNI;
3118 
3119    t_Liabilities(2).Ovrrde := py_za_tx_01032012.trc_LibFpFBOvr;
3120    t_Liabilities(2).Lib    := py_za_tx_01032012.trc_LibFpFB;
3121 
3122    t_Liabilities(3).Ovrrde := py_za_tx_01032012.trc_LibFpTAOvr;
3123    t_Liabilities(3).Lib    := py_za_tx_01032012.trc_LibFpTA;
3124 
3125    t_Liabilities(4).Ovrrde := py_za_tx_01032012.trc_LibFpBPOvr;
3126    t_Liabilities(4).Lib    := py_za_tx_01032012.trc_LibFpBP;
3127 
3128    t_Liabilities(5).Ovrrde := py_za_tx_01032012.trc_LibFpABOvr;
3129    t_Liabilities(5).Lib    := py_za_tx_01032012.trc_LibFpAB;
3130 
3131    t_Liabilities(6).Ovrrde := py_za_tx_01032012.trc_LibFpAPOvr;
3132    t_Liabilities(6).Lib    := py_za_tx_01032012.trc_LibFpAP;
3133 
3134    t_Liabilities(7).Ovrrde := py_za_tx_01032012.trc_LibFpPOOvr;
3135    t_Liabilities(7).Lib    := py_za_tx_01032012.trc_LibFpPO;
3136 
3137 -- Bug 14195352
3138 -- To  prevent tax refund in any situation other
3139 -- than when net taxable income is below SITE limit.
3140 
3141    t_Liabilities(1).Ovrrde := FALSE;
3142    t_Liabilities(2).Ovrrde := FALSE;
3143    t_Liabilities(3).Ovrrde := FALSE;
3144    t_Liabilities(4).Ovrrde := FALSE;
3145    t_Liabilities(5).Ovrrde := FALSE;
3146    t_Liabilities(6).Ovrrde := FALSE;
3147    t_Liabilities(6).Ovrrde := FALSE;
3148 
3149 -- Bug 14195352 ends
3150 
3151    IF py_za_tx_01032012.trc_LibFpNIOvr THEN
3152       WriteHrTrace('py_za_tx_01032012.trc_LibFpNIOvr: TRUE');
3153    ELSE
3154       WriteHrTrace('py_za_tx_01032012.trc_LibFpNIOvr: FALSE');
3155    END IF;
3156    WriteHrTrace('py_za_tx_01032012.trc_LibFpNI: '||to_char(py_za_tx_01032012.trc_LibFpNI));
3157    IF py_za_tx_01032012.trc_LibFpFBOvr THEN
3158       WriteHrTrace('py_za_tx_01032012.trc_LibFpFBOvr: TRUE');
3159    ELSE
3160       WriteHrTrace('py_za_tx_01032012.trc_LibFpFBOvr: FALSE');
3161    END IF;
3162    WriteHrTrace('py_za_tx_01032012.trc_LibFpFB: '||to_char(py_za_tx_01032012.trc_LibFpFB));
3163    IF py_za_tx_01032012.trc_LibFpTAOvr THEN
3164       WriteHrTrace('py_za_tx_01032012.trc_LibFpTAOvr: TRUE');
3165    ELSE
3166       WriteHrTrace('py_za_tx_01032012.trc_LibFpTAOvr: FALSE');
3167    END IF;
3168    WriteHrTrace('py_za_tx_01032012.trc_LibFpTA: '||to_char(py_za_tx_01032012.trc_LibFpTA));
3169    IF py_za_tx_01032012.trc_LibFpBPOvr THEN
3170       WriteHrTrace('py_za_tx_01032012.trc_LibFpBPOvr: TRUE');
3171    ELSE
3172       WriteHrTrace('py_za_tx_01032012.trc_LibFpBPOvr: FALSE');
3173    END IF;
3174    WriteHrTrace('py_za_tx_01032012.trc_LibFpBP: '||to_char(py_za_tx_01032012.trc_LibFpBP));
3175    IF py_za_tx_01032012.trc_LibFpABOvr THEN
3176       WriteHrTrace('py_za_tx_01032012.trc_LibFpABOvr: TRUE');
3177    ELSE
3178       WriteHrTrace('py_za_tx_01032012.trc_LibFpABOvr: FALSE');
3179    END IF;
3180    WriteHrTrace('py_za_tx_01032012.trc_LibFpAB: '||to_char(py_za_tx_01032012.trc_LibFpAB));
3181    IF py_za_tx_01032012.trc_LibFpAPOvr THEN
3182       WriteHrTrace('py_za_tx_01032012.trc_LibFpAPOvr: TRUE');
3183    ELSE
3184       WriteHrTrace('py_za_tx_01032012.trc_LibFpAPOvr: FALSE');
3185    END IF;
3186    WriteHrTrace('py_za_tx_01032012.trc_LibFpAP: '||to_char(py_za_tx_01032012.trc_LibFpAP));
3187    IF py_za_tx_01032012.trc_LibFpPOOvr THEN
3188       WriteHrTrace('py_za_tx_01032012.trc_LibFpPOOvr: TRUE');
3189    ELSE
3190       WriteHrTrace('py_za_tx_01032012.trc_LibFpPOOvr: FALSE');
3191    END IF;
3192    WriteHrTrace('py_za_tx_01032012.trc_LibFpPO: '||to_char(py_za_tx_01032012.trc_LibFpPO));
3193 
3194 -- Sum the Liabilities
3195    l_TotLib :=
3196    ( py_za_tx_01032012.trc_LibFpNI
3197    + py_za_tx_01032012.trc_LibFpFB
3198    + py_za_tx_01032012.trc_LibFpTA
3199    + py_za_tx_01032012.trc_LibFpBP
3200    + py_za_tx_01032012.trc_LibFpAB
3201    + py_za_tx_01032012.trc_LibFpAP
3202    + py_za_tx_01032012.trc_LibFpPO
3203    );
3204 
3205    l_totMAC := Greatest(
3206   (  py_za_tx_01032012.trc_MedTxCrUsedDR_Upd
3207   +  py_za_tx_01032012.trc_MedTxCrUsedNI_Upd
3208   +  py_za_tx_01032012.trc_MedTxCrUsedFB_Upd
3209   +  py_za_tx_01032012.trc_MedTxCrUsedTA_Upd
3210   +  py_za_tx_01032012.trc_MedTxCrUsedBP_Upd
3211   +  py_za_tx_01032012.trc_MedTxCrUsedAB_Upd
3212   +  py_za_tx_01032012.trc_MedTxCrUsedAP_Upd
3213   +  py_za_tx_01032012.trc_MedTxCrUsedPO_Upd
3214   +  py_za_tx_01032012.trc_MedTxCrUsedNtgAP_Upd
3215   +  py_za_tx_01032012.trc_MedTxCrUsedNtgEEDbt_Upd
3216   ),0);
3217 
3218 -- Set Net Pay
3219    l_TotNp := py_za_tx_01032012.bal_NET_PAY_RUN;
3220    WriteHrTrace('l_TotNp: '||to_char(l_TotNp));
3221 
3222    WriteHrTrace('l_totMAC:'||to_char(l_totMAC));
3223 -- Start Validation
3224 --
3225    IF l_TotLib = 0 THEN
3226       hr_utility.set_location('py_za_tx_utl_01032012.ValidateTaxOns',2);
3227       NULL;
3228    ELSIF l_TotLib + l_totMAC > 0 THEN
3229       hr_utility.set_location('py_za_tx_utl_01032012.ValidateTaxOns',3);
3230       IF l_TotNp > 0 THEN
3231          hr_utility.set_location('py_za_tx_utl_01032012.ValidateTaxOns',4);
3232          IF l_TotLib = l_TotNp THEN
3233             hr_utility.set_location('py_za_tx_utl_01032012.ValidateTaxOns',5);
3234             NULL;
3235          ELSIF l_TotLib > l_TotNp THEN
3236             hr_utility.set_location('py_za_tx_utl_01032012.ValidateTaxOns',6);
3237             l_RecVal := l_TotLib - l_TotNp;
3238             i:= 1;
3239 
3240             FOR i IN 1..7 LOOP
3241                IF t_Liabilities(i).Lib = 0 THEN
3242                   hr_utility.set_location('py_za_tx_utl_01032012.ValidateTaxOns',7);
3243                   NULL;
3244                ELSIF t_Liabilities(i).Lib > 0 THEN
3245                   hr_utility.set_location('py_za_tx_utl_01032012.ValidateTaxOns',8);
3246                   l_NewLib := t_Liabilities(i).Lib - LEAST(t_Liabilities(i).Lib,l_RecVal);
3247                   l_RecVal := l_RecVal - (t_Liabilities(i).Lib - l_NewLib);
3248                   t_Liabilities(i).Lib := l_NewLib;
3249                   py_za_tx_01032012.trc_LibWrn := 'Warning: Net Pay Balance not enough for Tax Recovery';
3250                ELSE -- lib < 0
3251                   hr_utility.set_location('py_za_tx_utl_01032012.ValidateTaxOns',9);
3252                   NULL;
3253                END IF;
3254            END LOOP;
3255 
3256          ELSE -- l_TotLib > 0,l_TotNp > 0,l_TotLib < l_TotNp
3257             hr_utility.set_location('py_za_tx_utl_01032012.ValidateTaxOns',10);
3258             NULL;
3259          END IF;
3260 
3261       ELSE -- l_TotLib > 0,l_TotNp <= 0
3262          hr_utility.set_location('py_za_tx_utl_01032012.ValidateTaxOns',11);
3263          l_RecVal := l_TotLib;
3264          i := 1;
3265 
3266          FOR i IN 1..7 LOOP
3267             IF t_Liabilities(i).Lib > 0 THEN
3268                hr_utility.set_location('py_za_tx_utl_01032012.ValidateTaxOns',12);
3269                l_NewLib := t_Liabilities(i).Lib - LEAST(t_Liabilities(i).Lib,l_RecVal);
3270                l_RecVal := l_RecVal - (t_Liabilities(i).Lib - l_NewLib);
3271                t_Liabilities(i).Lib := l_NewLib;
3272                py_za_tx_01032012.trc_LibWrn := 'Warning: Net Pay Balance not enough for Tax Recovery';
3273             END IF;
3274          END LOOP;
3275       END IF;
3276 
3277    ELSE -- l_TotLib < 0
3278       hr_utility.set_location('py_za_tx_utl_01032012.ValidateTaxOns',13);
3279       IF p_Rf THEN
3280          hr_utility.set_location('py_za_tx_utl_01032012.ValidateTaxOns',14);
3281          NULL;
3282       ELSE
3283          hr_utility.set_location('py_za_tx_utl_01032012.ValidateTaxOns',15);
3284          l_RecVal := l_TotLib + l_totMAC;
3285 -- Accomodating Medical Tax Credit Used in Run
3286 
3287 
3288          i := 1;
3289          FOR i IN 1..7 LOOP
3290             IF t_Liabilities(i).Lib >= 0 THEN
3291                hr_utility.set_location('py_za_tx_utl_01032012.ValidateTaxOns',16);
3292                NULL;
3293             ELSE -- l_lib < 0
3294                hr_utility.set_location('py_za_tx_utl_01032012.ValidateTaxOns',17);
3295                -- Has the liability been Overridden?
3296                IF t_Liabilities(i).Ovrrde THEN
3297                   hr_utility.set_location('py_za_tx_utl_01032012.ValidateTaxOns',18);
3298                   NULL;
3299                ELSE
3300                   hr_utility.set_location('py_za_tx_utl_01032012.ValidateTaxOns',19);
3301                   l_NewLib := t_Liabilities(i).Lib - GREATEST(t_Liabilities(i).Lib,l_RecVal);
3302                   l_RecVal := l_RecVal - (t_Liabilities(i).Lib - l_NewLib);
3303                   t_Liabilities(i).Lib := l_NewLib;
3304                END IF;
3305            END IF;
3306          END LOOP;
3307       END IF;
3308    END IF;
3309 
3310    hr_utility.set_location('py_za_tx_utl_01032012.ValidateTaxOns',20);
3311 
3312    py_za_tx_01032012.trc_LibFpNI := t_Liabilities(1).Lib;
3313    py_za_tx_01032012.trc_LibFpFB := t_Liabilities(2).Lib;
3314    py_za_tx_01032012.trc_LibFpTA := t_Liabilities(3).Lib;
3315    py_za_tx_01032012.trc_LibFpBP := t_Liabilities(4).Lib;
3316    py_za_tx_01032012.trc_LibFpAB := t_Liabilities(5).Lib;
3317    py_za_tx_01032012.trc_LibFpAP := t_Liabilities(6).Lib;
3318    py_za_tx_01032012.trc_LibFpPO := t_Liabilities(7).Lib;
3319 
3320    WriteHrTrace('py_za_tx_01032012.trc_LibFpNI: '||to_char(py_za_tx_01032012.trc_LibFpNI));
3321    WriteHrTrace('py_za_tx_01032012.trc_LibFpFB: '||to_char(py_za_tx_01032012.trc_LibFpFB));
3322    WriteHrTrace('py_za_tx_01032012.trc_LibFpTA: '||to_char(py_za_tx_01032012.trc_LibFpTA));
3323    WriteHrTrace('py_za_tx_01032012.trc_LibFpBP: '||to_char(py_za_tx_01032012.trc_LibFpBP));
3324    WriteHrTrace('py_za_tx_01032012.trc_LibFpAB: '||to_char(py_za_tx_01032012.trc_LibFpAB));
3325    WriteHrTrace('py_za_tx_01032012.trc_LibFpAP: '||to_char(py_za_tx_01032012.trc_LibFpAP));
3326    WriteHrTrace('py_za_tx_01032012.trc_LibFpPO: '||to_char(py_za_tx_01032012.trc_LibFpPO));
3327 
3328 EXCEPTION
3329    WHEN OTHERS THEN
3330       IF py_za_tx_01032012.xpt_Msg = 'No Error' THEN
3331          py_za_tx_01032012.xpt_Msg := 'ValidateTaxOns: '||TO_CHAR(SQLCODE);
3332       END IF;
3333       RAISE py_za_tx_01032012.xpt_E;
3334 END ValidateTaxOns;
3335 -------------------------------------------------------------------------------
3336 -- DaysWorked                                                                --
3337 --  Returns the number of days that the person has worked                    --
3338 --    This could be a negative number that would indicate                    --
3339 --    a LatePayePeriod                                                       --
3340 -------------------------------------------------------------------------------
3341 FUNCTION DaysWorked RETURN NUMBER
3342 AS
3343    l_DaysWorked NUMBER;
3344    l_EndDte     DATE;
3345    l_StrtDte    DATE;
3346 
3347 BEGIN
3348    IF py_za_tx_01032012.trc_OvrTxCalc AND py_za_tx_01032012.trc_OvrTyp = 'V' THEN
3349       hr_utility.set_location('py_za_tx_utl_01032012.DaysWorked',1);
3350       IF LatePayPeriod THEN
3351          hr_utility.set_location('py_za_tx_utl_01032012.DaysWorked',2);
3352          -- This will set the sitfactor = 1
3353          l_EndDte  := py_za_tx_01032012.dbi_ZA_TX_YR_END;
3354          l_StrtDte := py_za_tx_01032012.dbi_ZA_TX_YR_STRT;
3355       ELSE
3356          hr_utility.set_location('py_za_tx_utl_01032012.DaysWorked',3);
3357          l_EndDte  := LEAST(py_za_tx_01032012.dbi_ZA_ACT_END_DTE, py_za_tx_01032012.dbi_ZA_CUR_PRD_END_DTE);
3358          l_StrtDte := GREATEST(py_za_tx_01032012.dbi_ZA_ACT_STRT_DTE, py_za_tx_01032012.dbi_ZA_TX_YR_STRT);
3359       END IF;
3360 
3361    ELSIF py_za_tx_01032012.trc_CalTyp = 'YtdCalc' THEN
3362       hr_utility.set_location('py_za_tx_utl_01032012.DaysWorked',4);
3363       l_EndDte  := py_za_tx_01032012.dbi_ZA_CUR_PRD_STRT_DTE - 1;
3364       l_StrtDte := GREATEST(py_za_tx_01032012.dbi_ZA_ACT_STRT_DTE, py_za_tx_01032012.dbi_ZA_TX_YR_STRT);
3365 
3366    ELSIF py_za_tx_01032012.trc_CalTyp = 'CalCalc' THEN
3367       hr_utility.set_location('py_za_tx_utl_01032012.DaysWorked',5);
3368       l_EndDte  := py_za_tx_01032012.dbi_ZA_TX_YR_STRT - 1;
3369       l_StrtDte := GREATEST(py_za_tx_01032012.dbi_ZA_ACT_STRT_DTE,
3370       to_date('01/01/'||to_char(to_number(to_char(py_za_tx_01032012.dbi_ZA_TX_YR_END,'YYYY'))-1),'DD/MM/YYYY'));
3371 
3372    ELSIF py_za_tx_01032012.trc_CalTyp = 'SitCalc' AND
3373        ( py_za_tx_01032012.dbi_ZA_ASG_TX_RTR_PRD = 'Y'
3374       OR py_za_tx_01032012.trc_OvrTxCalc
3375       OR py_za_tx_01032012.trc_NegPtd
3376        )THEN
3377       hr_utility.set_location('py_za_tx_utl_01032012.DaysWorked',6);
3378       l_EndDte  := LEAST(py_za_tx_01032012.dbi_ZA_ACT_END_DTE, py_za_tx_01032012.dbi_ZA_CUR_PRD_END_DTE);
3379       l_StrtDte := GREATEST(py_za_tx_01032012.dbi_ZA_ACT_STRT_DTE, py_za_tx_01032012.dbi_ZA_TX_YR_STRT);
3380 
3381    ELSIF py_za_tx_01032012.trc_CalTyp = 'SitCalc' THEN
3382       hr_utility.set_location('py_za_tx_utl_01032012.DaysWorked',7);
3383       l_EndDte  := LEAST(py_za_tx_01032012.dbi_ZA_ACT_END_DTE, py_za_tx_01032012.dbi_ZA_TX_YR_END);
3384       l_StrtDte := GREATEST(py_za_tx_01032012.dbi_ZA_ACT_STRT_DTE, py_za_tx_01032012.dbi_ZA_TX_YR_STRT);
3385    /*
3386    ELSIF py_za_tx_01032012.trc_CalTyp = 'PstCalc' THEN
3387       hr_utility.set_location('py_za_tx_utl_01032012.DaysWorked',8);
3388       l_EndDte := py_za_tx_01032012.dbi_ZA_ACT_END_DTE;
3389       l_StrtDte := py_za_tx_01032012.dbi_ZA_ASG_TX_YR_STRT;
3390 
3391       hr_utility.set_location('py_za_tx_utl_01032012.DaysWorked',9);
3392 
3393       l_StrtDte := GREATEST(py_za_tx_01032012.dbi_ZA_ACT_STRT_DTE, l_StrtDte); */
3394    END IF;
3395 
3396    l_DaysWorked := l_EndDte - l_StrtDte + 1;
3397 
3398    WriteHrTrace('l_EndDte:     '||to_char(l_EndDte,'DD/MM/YYYY'));
3399    WriteHrTrace('l_StrtDte:    '||to_char(l_StrtDte,'DD/MM/YYYY'));
3400    WriteHrTrace('l_DaysWorked: '||to_char(l_DaysWorked));
3401 
3402    RETURN l_DaysWorked;
3403 
3404 EXCEPTION
3405    WHEN OTHERS THEN
3406       IF py_za_tx_01032012.xpt_Msg = 'No Error' THEN
3407          py_za_tx_01032012.xpt_Msg := 'DaysWorked: '||TO_CHAR(SQLCODE);
3408       END IF;
3409       RAISE py_za_tx_01032012.xpt_E;
3410 END DaysWorked;
3411 -------------------------------------------------------------------------------
3412 -- SitPaySplit                                                               --
3413 -------------------------------------------------------------------------------
3414 PROCEDURE SitPaySplit
3415 AS
3416    l_TxOnSitLim t_Balance;
3417    l_SitAblTx t_Balance;
3418 BEGIN
3419    hr_utility.set_location('py_za_tx_utl_01032012.SitPaySplit',1);
3420 -- Directive Type Statuses
3421 --
3422    IF py_za_tx_01032012.dbi_TX_STA IN ('C','D','E','F','J','K','L','N','P') THEN
3423       hr_utility.set_location('py_za_tx_utl_01032012.SitPaySplit',2);
3424    -- Check for SitePeriod
3425       IF SitePeriod THEN
3426          hr_utility.set_location('py_za_tx_utl_01032012.SitPaySplit',3);
3427          py_za_tx_01032012.trc_PayeVal :=
3428             ( py_za_tx_01032012.bal_TAX_YTD
3429             + py_za_tx_01032012.trc_LibFpNI
3430             + py_za_tx_01032012.trc_LibFpFB
3431             + py_za_tx_01032012.trc_LibFpTA
3432             + py_za_tx_01032012.trc_LibFpBP
3433             + py_za_tx_01032012.trc_LibFpAB
3434             + py_za_tx_01032012.trc_LibFpAP
3435             + py_za_tx_01032012.trc_LibFpPO
3436             + py_za_tx_01032012.trc_LibFpNtgAP
3437             + py_za_tx_01032012.trc_LibFpNtgEEDbt
3438             ) - py_za_tx_01032012.bal_PAYE_YTD;
3439          py_za_tx_01032012.trc_SiteVal := -1*py_za_tx_01032012.bal_SITE_YTD;
3440       ELSE
3441          hr_utility.set_location('py_za_tx_utl_01032012.SitPaySplit',4);
3442          py_za_tx_01032012.trc_PayeVal := -1*py_za_tx_01032012.bal_PAYE_YTD;
3443          py_za_tx_01032012.trc_SiteVal := -1*py_za_tx_01032012.bal_SITE_YTD;
3444       END IF;
3445 -- Normal Type Statuses
3446 --
3447    ELSIF py_za_tx_01032012.dbi_TX_STA IN ('A','B') THEN
3448       IF (SitePeriod AND NOT PreErnPeriod) OR EmpTermPrePeriod THEN
3449          hr_utility.set_location('py_za_tx_utl_01032012.SitPaySplit',5);
3450       -- Get the Tax Liability on the Site Limit
3451          py_za_tx_01032012.trc_LateSitePaye := 1;
3452          l_TxOnSitLim := TaxLiability(p_Amt => py_za_tx_01032012.glb_ZA_SIT_LIM)/py_za_tx_01032012.trc_SitFactor;
3453       -- Get the Tax Amount Liable for SITE
3454          l_SitAblTx :=
3455          ( py_za_tx_01032012.bal_TX_ON_NI_YTD
3456          + py_za_tx_01032012.bal_TX_ON_FB_YTD
3457          + py_za_tx_01032012.bal_TX_ON_BP_YTD
3458          + py_za_tx_01032012.bal_TX_ON_AB_YTD
3459          + py_za_tx_01032012.bal_TX_ON_AP_YTD
3460          + py_za_tx_01032012.bal_TX_ON_AP_NTG_YTD
3461          + py_za_tx_01032012.bal_TX_ON_EE_DBT_NTG_YTD
3462          + py_za_tx_01032012.trc_LibFpNI
3463          + py_za_tx_01032012.trc_LibFpFB
3464          + py_za_tx_01032012.trc_LibFpBP
3465          + py_za_tx_01032012.trc_LibFpAB
3466          + py_za_tx_01032012.trc_LibFpAP
3467          + py_za_tx_01032012.trc_LibFpNtgAP
3468          + py_za_tx_01032012.trc_LibFpNtgEEDbt
3469          );
3470       -- Check the Limit
3471          IF l_SitAblTx > l_TxOnSitLim THEN
3472             hr_utility.set_location('py_za_tx_utl_01032012.SitPaySplit',6);
3473             py_za_tx_01032012.trc_SiteVal := l_TxOnSitLim - py_za_tx_01032012.bal_SITE_YTD;
3474             py_za_tx_01032012.trc_PayeVal := (
3475               ( py_za_tx_01032012.bal_TAX_YTD
3476               + py_za_tx_01032012.trc_LibFpNI
3477               + py_za_tx_01032012.trc_LibFpFB
3478               + py_za_tx_01032012.trc_LibFpBP
3479               + py_za_tx_01032012.trc_LibFpAB
3480               + py_za_tx_01032012.trc_LibFpAP
3481               + py_za_tx_01032012.trc_LibFpTA
3482               + py_za_tx_01032012.trc_LibFpPO
3483               + py_za_tx_01032012.trc_LibFpNtgAP
3484               + py_za_tx_01032012.trc_LibFpNtgEEDbt
3485               ) - l_TxOnSitLim) - py_za_tx_01032012.bal_PAYE_YTD;
3486 
3487          ELSE
3488             hr_utility.set_location('py_za_tx_utl_01032012.SitPaySplit',7);
3489             IF ( py_za_tx_01032012.bal_TX_ON_TA_YTD
3490                + py_za_tx_01032012.trc_LibFpTA
3491                + py_za_tx_01032012.bal_TX_ON_PO_YTD
3492                + py_za_tx_01032012.trc_LibFpPO
3493                ) <= 0 THEN
3494                hr_utility.set_location('py_za_tx_utl_01032012.SitPaySplit',8);
3495                py_za_tx_01032012.trc_SiteVal := ( py_za_tx_01032012.bal_TAX_YTD
3496                               + py_za_tx_01032012.trc_LibFpNI
3497                               + py_za_tx_01032012.trc_LibFpFB
3498                               + py_za_tx_01032012.trc_LibFpBP
3499                               + py_za_tx_01032012.trc_LibFpAB
3500                               + py_za_tx_01032012.trc_LibFpAP
3501                               + py_za_tx_01032012.trc_LibFpTA
3502                               + py_za_tx_01032012.trc_LibFpPO
3503                               + py_za_tx_01032012.trc_LibFpNtgAP
3504                               + py_za_tx_01032012.trc_LibFpNtgEEDbt
3505                               ) - py_za_tx_01032012.bal_SITE_YTD;
3506 
3507                py_za_tx_01032012.trc_PayeVal := -1*py_za_tx_01032012.bal_PAYE_YTD;
3508             ELSE
3509                hr_utility.set_location('py_za_tx_utl_01032012.SitPaySplit',9);
3510                py_za_tx_01032012.trc_SiteVal := l_SitAblTx - py_za_tx_01032012.bal_SITE_YTD;
3511 
3512                py_za_tx_01032012.trc_PayeVal := (
3513                  ( py_za_tx_01032012.bal_TAX_YTD
3514                  + py_za_tx_01032012.trc_LibFpNI
3515                  + py_za_tx_01032012.trc_LibFpFB
3516                  + py_za_tx_01032012.trc_LibFpBP
3517                  + py_za_tx_01032012.trc_LibFpAB
3518                  + py_za_tx_01032012.trc_LibFpAP
3519                  + py_za_tx_01032012.trc_LibFpTA
3520                  + py_za_tx_01032012.trc_LibFpPO
3521                  + py_za_tx_01032012.trc_LibFpNtgAP
3522                  + py_za_tx_01032012.trc_LibFpNtgEEDbt
3523                  ) - l_SitAblTx) - py_za_tx_01032012.bal_PAYE_YTD;
3524             END IF;
3525          END IF;
3526       ELSE
3527          hr_utility.set_location('py_za_tx_utl_01032012.SitPaySplit',10);
3528          py_za_tx_01032012.trc_PayeVal := -1*py_za_tx_01032012.bal_PAYE_YTD;
3529          py_za_tx_01032012.trc_SiteVal := -1*py_za_tx_01032012.bal_SITE_YTD;
3530       END IF;
3531 -- Seasonal Worker Status
3532 --
3533    ELSIF py_za_tx_01032012.dbi_TX_STA = 'G' THEN
3534       hr_utility.set_location('py_za_tx_utl_01032012.SitPaySplit',11);
3535    -- Get the SitFactor YTD
3536       py_za_tx_01032012.trc_SitFactor := py_za_tx_01032012.glb_ZA_WRK_DYS_PR_YR / py_za_tx_01032012.bal_TOT_SEA_WRK_DYS_WRK_YTD;
3537    -- Get the Tax Liability on the Site Limit
3538       l_TxOnSitLim := TaxLiability(p_Amt => py_za_tx_01032012.glb_ZA_SIT_LIM)/py_za_tx_01032012.trc_SitFactor;
3539    -- Get the Tax Amount Liable for SITE
3540       l_SitAblTx := ( py_za_tx_01032012.bal_TX_ON_NI_YTD
3541                     + py_za_tx_01032012.bal_TX_ON_FB_YTD
3542                     + py_za_tx_01032012.bal_TX_ON_AP_YTD
3543                     + py_za_tx_01032012.trc_LibFpNI
3544                     + py_za_tx_01032012.trc_LibFpFB
3545                     + py_za_tx_01032012.trc_LibFpAP
3546                     );
3547    -- Check the Limit
3548       IF l_SitAblTx > l_TxOnSitLim THEN
3549          hr_utility.set_location('py_za_tx_utl_01032012.SitPaySplit',12);
3550          py_za_tx_01032012.trc_SiteVal := l_TxOnSitLim - py_za_tx_01032012.bal_SITE_YTD;
3551          py_za_tx_01032012.trc_PayeVal := ( (py_za_tx_01032012.bal_TX_ON_PO_YTD + py_za_tx_01032012.trc_LibFpPO)
3552                                           + (l_SitAblTx - l_TxOnSitLim)
3553                                           ) - py_za_tx_01032012.bal_PAYE_YTD;
3554       ELSE
3555          hr_utility.set_location('py_za_tx_utl_01032012.SitPaySplit',13);
3556          py_za_tx_01032012.trc_SiteVal := l_SitAblTx - py_za_tx_01032012.bal_SITE_YTD;
3557          py_za_tx_01032012.trc_PayeVal := py_za_tx_01032012.bal_TX_ON_PO_YTD
3558                                         + py_za_tx_01032012.trc_LibFpPO
3559                                         - py_za_tx_01032012.bal_PAYE_YTD;
3560       END IF;
3561 -- Private Director
3562 --
3563    ELSIF py_za_tx_01032012.dbi_TX_STA = 'M' THEN
3564       IF (SitePeriod AND NOT PreErnPeriod) OR EmpTermPrePeriod THEN
3565          hr_utility.set_location('py_za_tx_utl_01032012.SitPaySplit',14);
3566          py_za_tx_01032012.trc_PayeVal :=
3567             ( py_za_tx_01032012.bal_TAX_YTD
3568             + py_za_tx_01032012.trc_LibFpDR
3569             + py_za_tx_01032012.trc_LibFpNI
3570             + py_za_tx_01032012.trc_LibFpFB
3571             + py_za_tx_01032012.trc_LibFpTA
3572             + py_za_tx_01032012.trc_LibFpBP
3573             + py_za_tx_01032012.trc_LibFpAB
3574             + py_za_tx_01032012.trc_LibFpAP
3575             + py_za_tx_01032012.trc_LibFpPO
3576             + py_za_tx_01032012.trc_LibFpNtgAP
3577             + py_za_tx_01032012.trc_LibFpNtgEEDbt
3578             ) - py_za_tx_01032012.bal_PAYE_YTD;
3579          py_za_tx_01032012.trc_SiteVal := -1*py_za_tx_01032012.bal_SITE_YTD;
3580       ELSE
3581          hr_utility.set_location('py_za_tx_utl_01032012.SitPaySplit',15);
3582          py_za_tx_01032012.trc_PayeVal := -1*py_za_tx_01032012.bal_PAYE_YTD;
3583          py_za_tx_01032012.trc_SiteVal := -1*py_za_tx_01032012.bal_SITE_YTD;
3584       END IF;
3585 -- All Other Statuses
3586 --
3587    ELSE -- set the globals to zero
3588       hr_utility.set_location('py_za_tx_utl_01032012.SitPaySplit',16);
3589       py_za_tx_01032012.trc_PayeVal := 0 - py_za_tx_01032012.bal_PAYE_YTD;
3590       py_za_tx_01032012.trc_SiteVal := 0 - py_za_tx_01032012.bal_SITE_YTD;
3591    END IF;
3592 
3593 EXCEPTION
3594    WHEN OTHERS THEN
3595       IF py_za_tx_01032012.xpt_Msg = 'No Error' THEN
3596          py_za_tx_01032012.xpt_Msg := 'SitPaySplit: '||TO_CHAR(SQLCODE);
3597       END IF;
3598       RAISE py_za_tx_01032012.xpt_E;
3599 END SitPaySplit;
3600 
3601 -------------------------------------------------------------------------------
3602 -- Allowable deduction funtion                                                           --
3603 -------------------------------------------------------------------------------
3604 
3605 
3606 FUNCTION AllowableDeduction
3607    (p_Amt IN NUMBER
3608    ,p_Donat_Amt IN NUMBER
3609    ) RETURN NUMBER
3610 AS
3611    l_Ded t_Balance;
3612 BEGIN
3613    hr_utility.set_location('py_za_tx_utl_01032012.AllowableDeduction',10);
3614    l_Ded := least(py_za_tx_01032012.trc_AllowDonPerc*p_Amt/100,p_Donat_Amt);
3615 
3616    WriteHrTrace('p_Amt: '||to_char(p_Amt));
3617    WriteHrTrace('l_Ded: '||to_char(l_Ded));
3618 
3619    RETURN l_Ded;
3620 
3621 EXCEPTION
3622    WHEN OTHERS THEN
3623       IF py_za_tx_01032012.xpt_Msg = 'No Error' THEN
3624          py_za_tx_01032012.xpt_Msg := 'Trace: '||TO_CHAR(SQLCODE);
3625       END IF;
3626       RAISE py_za_tx_01032012.xpt_E;
3627 
3628 END AllowableDeduction;
3629 
3630 -------------------------------------------------------------------------------
3631 -- Trace Function                                                            --
3632 -------------------------------------------------------------------------------
3633 PROCEDURE Trace AS
3634 BEGIN
3635 
3636 /*DELETE FROM pay_za_tax_traces pztt
3637    WHERE pztt.prl_act_id not in (
3638    SELECT payroll_action_id
3639      from pay_payroll_actions)
3640 */
3641    INSERT INTO pay_za_tax_traces(
3642     ASG_ACT_ID
3643    ,ASG_ID
3644    ,PRL_ACT_ID
3645    ,PRL_ID
3646    ,TX_STA
3647    ,PER_AGE
3648    ,CalTyp
3649    ,TX_DIR_VAL
3650    ,It3Ind
3651    ,TxPercVal
3652    ,ASG_STRT_DTE
3653    ,ZA_ACT_END_DTE
3654    ,ZA_CUR_PRD_STRT_DTE
3655    ,ZA_CUR_PRD_END_DTE
3656    ,ZA_TX_YR_STRT
3657    ,ZA_TX_YR_END
3658    ,SES_DTE
3659    ,PrdFactor
3660    ,PosFactor
3661    ,SitFactor
3662    ,ZA_PAY_PRDS_LFT
3663    ,ZA_PAY_PRDS_PER_YR
3664    ,ZA_DYS_IN_YR
3665    ,SEA_WRK_DYS_WRK
3666    ,BP_TX_RCV
3667    ,TxbIncPtd
3668    ,BseErn
3669    ,TxbBseInc
3670    ,TotLibBse
3671    ,TxbIncYtd
3672    ,PerTxbInc
3673    ,PerPenFnd
3674    ,PerRfiCon
3675    ,PerRfiTxb
3676    ,PerPenFndMax
3677    ,PerPenFndAbm
3678    ,AnnTxbInc
3679    ,AnnPenFnd
3680    ,AnnRfiCon
3681    ,AnnRfiTxb
3682    ,AnnPenFndMax
3683    ,AnnPenFndAbm
3684    ,ArrPenFnd
3685    ,ArrPenFndAbm
3686    ,AnnArrPenFnd
3687    ,AnnArrPenFndAbm
3688    ,RetAnu
3689    ,NrfiCon
3690    ,RetAnuMax
3691    ,RetAnuAbm
3692    ,AnnRetAnu
3693    ,AnnNrfiCon
3694    ,AnnRetAnuMax
3695    ,AnnRetAnuAbm
3696    ,ArrRetAnu
3697    ,ArrRetAnuAbm
3698    ,AnnArrRetAnu
3699    ,AnnArrRetAnuAbm
3700    ,Rebate
3701    ,Threshold
3702    ,MedAidAbm
3703    ,PerTotAbm
3704    ,AnnTotAbm
3705    ,NorIncYtd
3706    ,NorIncPtd
3707    ,NorErn
3708    ,TxbNorInc
3709    ,LibFyNI
3710    ,TX_ON_NI_YTD
3711    ,TX_ON_NI_PTD
3712    ,LibFpNI
3713    ,FrnBenYtd
3714    ,FrnBenPtd
3715    ,FrnBenErn
3716    ,TxbFrnInc
3717    ,LibFyFB
3718    ,TX_ON_FB_YTD
3719    ,TX_ON_FB_PTD
3720    ,LibFpFB
3721    ,TrvAllYtd
3722    ,TrvAllPtd
3723    ,TrvAllErn
3724    ,TxbTrvInc
3725    ,LibFyTA
3726    ,TX_ON_TA_YTD
3727    ,TX_ON_TA_PTD
3728    ,LibFpTA
3729    ,BonProYtd
3730    ,BonProPtd
3731    ,BonProErn
3732    ,TxbBonProInc
3733    ,LibFyBP
3734    ,TX_ON_BP_YTD
3735    ,TX_ON_BP_PTD
3736    ,LibFpBP
3737    ,AnnBonYtd
3738    ,AnnBonErn
3739    ,TxbAnnBonInc
3740    ,LibFyAB
3741    ,TX_ON_AB_YTD
3742    ,TX_ON_AB_PTD
3743    ,LibFpAB
3744    ,AnnPymYtd
3745    ,AnnPymPtd
3746    ,AnnPymErn
3747    ,TxbAnnPymInc
3748    ,LibFyAP
3749    ,TX_ON_AP_YTD
3750    ,TX_ON_AP_PTD
3751    ,LibFpAP
3752    ,PblOffYtd
3753    ,PblOffPtd
3754    ,PblOffErn
3755    ,LibFyPO
3756    ,TX_ON_PO_YTD
3757    ,TX_ON_PO_PTD
3758    ,LibFpPO
3759    ,LibWrn
3760    ,PayValue
3761    ,PayeVal
3762    ,SiteVal
3763    )
3764    VALUES(
3765     py_za_tx_01032012.con_ASG_ACT_ID
3766    ,py_za_tx_01032012.con_ASG_ID
3767    ,py_za_tx_01032012.con_PRL_ACT_ID
3768    ,py_za_tx_01032012.con_PRL_ID
3769    ,py_za_tx_01032012.dbi_TX_STA
3770    ,py_za_tx_01032012.dbi_PER_AGE
3771    ,py_za_tx_01032012.trc_CalTyp
3772    ,py_za_tx_01032012.dbi_TX_DIR_VAL
3773    ,py_za_tx_01032012.trc_It3Ind
3774    ,py_za_tx_01032012.trc_TxPercVal
3775    ,py_za_tx_01032012.dbi_ZA_ACT_STRT_DTE
3776    ,py_za_tx_01032012.dbi_ZA_ACT_END_DTE
3777    ,py_za_tx_01032012.dbi_ZA_CUR_PRD_STRT_DTE
3778    ,py_za_tx_01032012.dbi_ZA_CUR_PRD_END_DTE
3779    ,py_za_tx_01032012.dbi_ZA_TX_YR_STRT
3780    ,py_za_tx_01032012.dbi_ZA_TX_YR_END
3781    ,py_za_tx_01032012.dbi_SES_DTE
3782    ,py_za_tx_01032012.trc_PrdFactor
3783    ,py_za_tx_01032012.trc_PosFactor
3784    ,py_za_tx_01032012.trc_SitFactor
3785    ,py_za_tx_01032012.dbi_ZA_PAY_PRDS_LFT
3786    ,py_za_tx_01032012.dbi_ZA_PAY_PRDS_PER_YR
3787    ,py_za_tx_01032012.dbi_ZA_DYS_IN_YR
3788    ,py_za_tx_01032012.dbi_SEA_WRK_DYS_WRK
3789    ,py_za_tx_01032012.dbi_BP_TX_RCV
3790    ,py_za_tx_01032012.trc_TxbIncPtd
3791    ,py_za_tx_01032012.trc_BseErn
3792    ,py_za_tx_01032012.trc_TxbBseInc
3793    ,py_za_tx_01032012.trc_TotLibBse
3794    ,py_za_tx_01032012.trc_TxbIncYtd
3795    ,py_za_tx_01032012.trc_PerTxbInc
3796    ,py_za_tx_01032012.trc_PerPenFnd
3797    ,py_za_tx_01032012.trc_PerRfiCon
3798    ,py_za_tx_01032012.trc_PerRfiTxb
3799    ,py_za_tx_01032012.trc_PerPenFndMax
3800    ,py_za_tx_01032012.trc_PerPenFndAbm
3801    ,py_za_tx_01032012.trc_AnnTxbInc
3802    ,py_za_tx_01032012.trc_AnnPenFnd
3803    ,py_za_tx_01032012.trc_AnnRfiCon
3804    ,py_za_tx_01032012.trc_AnnRfiTxb
3805    ,py_za_tx_01032012.trc_AnnPenFndMax
3806    ,py_za_tx_01032012.trc_AnnPenFndAbm
3807    ,py_za_tx_01032012.trc_PerArrPenFnd
3808    ,py_za_tx_01032012.trc_PerArrPenFndAbm
3809    ,py_za_tx_01032012.trc_AnnArrPenFnd
3810    ,py_za_tx_01032012.trc_AnnArrPenFndAbm
3811    ,py_za_tx_01032012.trc_PerRetAnu
3812    ,py_za_tx_01032012.trc_PerNrfiCon
3813    ,py_za_tx_01032012.trc_PerRetAnuMax
3814    ,py_za_tx_01032012.trc_PerRetAnuAbm
3815    ,py_za_tx_01032012.trc_AnnRetAnu
3816    ,py_za_tx_01032012.trc_AnnNrfiCon
3817    ,py_za_tx_01032012.trc_AnnRetAnuMax
3818    ,py_za_tx_01032012.trc_AnnRetAnuAbm
3819    ,py_za_tx_01032012.trc_PerArrRetAnu
3820    ,py_za_tx_01032012.trc_PerArrRetAnuAbm
3821    ,py_za_tx_01032012.trc_AnnArrRetAnu
3822    ,py_za_tx_01032012.trc_AnnArrRetAnuAbm
3823    ,py_za_tx_01032012.trc_Rebate
3824    ,py_za_tx_01032012.trc_Threshold
3825    ,py_za_tx_01032012.trc_PerMedAidAbm
3826    ,py_za_tx_01032012.trc_PerTotAbm
3827    ,py_za_tx_01032012.trc_AnnTotAbm
3828    ,py_za_tx_01032012.trc_NorIncYtd
3829    ,py_za_tx_01032012.trc_NorIncPtd
3830    ,py_za_tx_01032012.trc_NorErn
3831    ,py_za_tx_01032012.trc_TxbNorInc
3832    ,py_za_tx_01032012.trc_LibFyNI
3833    ,py_za_tx_01032012.bal_TX_ON_NI_YTD
3834    ,py_za_tx_01032012.bal_TX_ON_NI_PTD
3835    ,py_za_tx_01032012.trc_LibFpNI
3836    ,py_za_tx_01032012.trc_FrnBenYtd
3837    ,py_za_tx_01032012.trc_FrnBenPtd
3838    ,py_za_tx_01032012.trc_FrnBenErn
3839    ,py_za_tx_01032012.trc_TxbFrnInc
3840    ,py_za_tx_01032012.trc_LibFyFB
3841    ,py_za_tx_01032012.bal_TX_ON_FB_YTD
3842    ,py_za_tx_01032012.bal_TX_ON_FB_PTD
3843    ,py_za_tx_01032012.trc_LibFpFB
3844    ,py_za_tx_01032012.trc_TrvAllYtd
3845    ,py_za_tx_01032012.trc_TrvAllPtd
3846    ,py_za_tx_01032012.trc_TrvAllErn
3847    ,py_za_tx_01032012.trc_TxbTrvInc
3848    ,py_za_tx_01032012.trc_LibFyTA
3849    ,py_za_tx_01032012.bal_TX_ON_TA_YTD
3850    ,py_za_tx_01032012.bal_TX_ON_TA_PTD
3851    ,py_za_tx_01032012.trc_LibFpTA
3852    ,py_za_tx_01032012.trc_BonProYtd
3853    ,py_za_tx_01032012.trc_BonProPtd
3854    ,py_za_tx_01032012.trc_BonProErn
3855    ,py_za_tx_01032012.trc_TxbBonProInc
3856    ,py_za_tx_01032012.trc_LibFyBP
3857    ,py_za_tx_01032012.bal_TX_ON_BP_YTD
3858    ,py_za_tx_01032012.bal_TX_ON_BP_PTD
3859    ,py_za_tx_01032012.trc_LibFpBP
3860    ,py_za_tx_01032012.trc_AnnBonYtd
3861    ,py_za_tx_01032012.trc_AnnBonErn
3862    ,py_za_tx_01032012.trc_TxbAnnBonInc
3863    ,py_za_tx_01032012.trc_LibFyAB
3864    ,py_za_tx_01032012.bal_TX_ON_AB_YTD
3865    ,py_za_tx_01032012.bal_TX_ON_AB_PTD
3866    ,py_za_tx_01032012.trc_LibFpAB
3867    ,py_za_tx_01032012.trc_AnnPymYtd
3868    ,py_za_tx_01032012.trc_AnnPymPtd
3869    ,py_za_tx_01032012.trc_AnnPymErn
3870    ,py_za_tx_01032012.trc_TxbAnnPymInc
3871    ,py_za_tx_01032012.trc_LibFyAP
3872    ,py_za_tx_01032012.bal_TX_ON_AP_YTD
3873    ,py_za_tx_01032012.bal_TX_ON_AP_PTD
3874    ,py_za_tx_01032012.trc_LibFpAP
3875    ,py_za_tx_01032012.trc_PblOffYtd
3876    ,py_za_tx_01032012.trc_PblOffPtd
3877    ,py_za_tx_01032012.trc_PblOffErn
3878    ,py_za_tx_01032012.trc_LibFyPO
3879    ,py_za_tx_01032012.bal_TX_ON_PO_YTD
3880    ,py_za_tx_01032012.bal_TX_ON_PO_PTD
3881    ,py_za_tx_01032012.trc_LibFpPO
3882    ,py_za_tx_01032012.trc_LibWrn
3883    ,py_za_tx_01032012.trc_PayValSD
3884    ,py_za_tx_01032012.trc_PayeVal
3885    ,py_za_tx_01032012.trc_SiteVal);
3886 
3887 EXCEPTION
3888    WHEN OTHERS THEN
3889       IF py_za_tx_01032012.xpt_Msg = 'No Error' THEN
3890          py_za_tx_01032012.xpt_Msg := 'Trace: '||TO_CHAR(SQLCODE);
3891       END IF;
3892       RAISE py_za_tx_01032012.xpt_E;
3893 END Trace;
3894 
3895 
3896 -------------------------------------------------------------------------------
3897 -- ClearGlobals                                                              --
3898 -------------------------------------------------------------------------------
3899 PROCEDURE ClearGlobals AS
3900 
3901 BEGIN
3902    hr_utility.set_location('py_za_tx_utl_01032012.ClearGlobals',1);
3903    -- Calculation Type
3904    py_za_tx_01032012.trc_CalTyp               := 'Unknown';
3905    -- Factors
3906    py_za_tx_01032012.trc_TxbIncPtd            := 0;
3907    py_za_tx_01032012.trc_PrdFactor            := 0;
3908    py_za_tx_01032012.trc_PosFactor            := 0;
3909    py_za_tx_01032012.trc_SitFactor            := 1;
3910    -- Deemed Remuneration
3911    py_za_tx_01032012.trc_DmdRmnRun            := 0;
3912    py_za_tx_01032012.trc_TxbDmdRmn            := 0;
3913    py_za_tx_01032012.trc_TotLibDR             := 0;
3914    py_za_tx_01032012.trc_LibFyDR              := 0;
3915    py_za_tx_01032012.trc_LibFpDR              := 0;
3916    -- Base Income
3917    py_za_tx_01032012.trc_BseErn               := 0;
3918    py_za_tx_01032012.trc_TxbBseInc            := 0;
3919    --TYS2010
3920    py_za_tx_01032012.trc_TxbBseIncWoDon       := 0;
3921    py_za_tx_01032012.trc_TotLibBse            := 0;
3922    -- Period Pension Fund
3923    py_za_tx_01032012.trc_TxbIncYtd            := 0;
3924    py_za_tx_01032012.trc_PerTxbInc            := 0;
3925    py_za_tx_01032012.trc_PerPenFnd            := 0;
3926    py_za_tx_01032012.trc_PerRfiCon            := 0;
3927    py_za_tx_01032012.trc_PerRfiTxb            := 0;
3928    py_za_tx_01032012.trc_PerPenFndMax         := 0;
3929    py_za_tx_01032012.trc_PerPenFndAbm         := 0;
3930    -- Annual Pension Fund
3931    py_za_tx_01032012.trc_AnnTxbInc            := 0;
3932    py_za_tx_01032012.trc_AnnPenFnd            := 0;
3933    py_za_tx_01032012.trc_AnnRfiCon            := 0;
3934    py_za_tx_01032012.trc_AnnRfiTxb            := 0;
3935    py_za_tx_01032012.trc_AnnPenFndMax         := 0;
3936    py_za_tx_01032012.trc_AnnPenFndAbm         := 0;
3937    -- Period Arrear Pension
3938    py_za_tx_01032012.trc_PerArrPenFnd         := 0;
3939    py_za_tx_01032012.trc_PerArrPenFndAbm      := 0;
3940    -- Annual Arrear Pension
3941    py_za_tx_01032012.trc_AnnArrPenFnd         := 0;
3942    py_za_tx_01032012.trc_AnnArrPenFndAbm      := 0;
3943    -- Arrear Excess Update Value
3944    py_za_tx_01032012.trc_PfUpdFig             := 0;
3945    -- Period Retirement Annuity
3946    py_za_tx_01032012.trc_PerRetAnu            := 0;
3947    py_za_tx_01032012.trc_PerNrfiCon           := 0;
3948    py_za_tx_01032012.trc_PerRetAnuMax         := 0;
3949    py_za_tx_01032012.trc_PerRetAnuAbm         := 0;
3950    -- Annual Retirement Annuity
3951    py_za_tx_01032012.trc_AnnRetAnu            := 0;
3952    py_za_tx_01032012.trc_AnnNrfiCon           := 0;
3953    py_za_tx_01032012.trc_AnnRetAnuMax         := 0;
3954    py_za_tx_01032012.trc_AnnRetAnuAbm         := 0;
3955    -- Period Arrear Retirement Annuity
3956    py_za_tx_01032012.trc_PerArrRetAnu         := 0;
3957    py_za_tx_01032012.trc_PerArrRetAnuAbm      := 0;
3958    -- Annual Arrear Retirement Annuity
3959    py_za_tx_01032012.trc_AnnArrRetAnu         := 0;
3960    py_za_tx_01032012.trc_AnnArrRetAnuAbm      := 0;
3961    -- Arrear Excess Update Value
3962    py_za_tx_01032012.trc_RaUpdFig             := 0;
3963    -- Medical Aid Abatement
3964    py_za_tx_01032012.trc_PerMedAidAbm         := 0;
3965    py_za_tx_01032012.trc_AnnMedAidAbm         := 0;
3966    -- Rebates Thresholds
3967    py_za_tx_01032012.trc_Rebate               := 0;
3968    py_za_tx_01032012.trc_Threshold            := 0;
3969    -- Abatement Totals
3970    py_za_tx_01032012.trc_PerTotAbm            := 0;
3971    py_za_tx_01032012.trc_AnnTotAbm            := 0;
3972    -- TYS2010
3973    -- Donations made by EE
3974    py_za_tx_01032012.trc_PerDonAmt            := 0;
3975    py_za_tx_01032012.trc_AnnDonAmt            := 0;
3976    py_za_tx_01032012.trc_AllowDonPerc         := 0;
3977    -- Normal Income
3978    py_za_tx_01032012.trc_NorIncYtd            := 0;
3979    py_za_tx_01032012.trc_NorIncPtd            := 0;
3980    py_za_tx_01032012.trc_NorErn               := 0;
3981    py_za_tx_01032012.trc_TxbNorInc            := 0;
3982    --TYS2010
3983    py_za_tx_01032012.trc_TxbNorIncWoDon       := 0;
3984    py_za_tx_01032012.trc_TotLibNI             := 0;
3985    py_za_tx_01032012.trc_LibFyNI              := 0;
3986    py_za_tx_01032012.trc_LibFpNI              := 0;
3987    -- Fringe Benefits
3988    py_za_tx_01032012.trc_FrnBenYtd            := 0;
3989    py_za_tx_01032012.trc_FrnBenPtd            := 0;
3990    py_za_tx_01032012.trc_FrnBenErn            := 0;
3991    py_za_tx_01032012.trc_TxbFrnInc            := 0;
3992    --TYS2010
3993    py_za_tx_01032012.trc_TxbFrnIncWoDon       := 0;
3994    py_za_tx_01032012.trc_TotLibFB             := 0;
3995    py_za_tx_01032012.trc_LibFyFB              := 0;
3996    py_za_tx_01032012.trc_LibFpFB              := 0;
3997    -- Travel Allowance
3998    py_za_tx_01032012.trc_TrvAllYtd            := 0;
3999    py_za_tx_01032012.trc_TrvAllPtd            := 0;
4000    py_za_tx_01032012.trc_TrvAllErn            := 0;
4001    py_za_tx_01032012.trc_TxbTrvInc            := 0;
4002    --TYS2010
4003    py_za_tx_01032012.trc_TxbTrvIncWoDon       := 0;
4004    py_za_tx_01032012.trc_TotLibTA             := 0;
4005    py_za_tx_01032012.trc_LibFyTA              := 0;
4006    py_za_tx_01032012.trc_LibFpTA              := 0;
4007    -- Bonus Provision
4008    py_za_tx_01032012.trc_BonProYtd            := 0;
4009    py_za_tx_01032012.trc_BonProPtd            := 0;
4010    py_za_tx_01032012.trc_BonProErn            := 0;
4011    py_za_tx_01032012.trc_TxbBonProInc         := 0;
4012    --TYS2010
4013    py_za_tx_01032012.trc_TxbBonProIncWoDon    := 0;
4014    py_za_tx_01032012.trc_TotLibBP             := 0;
4015    py_za_tx_01032012.trc_LibFyBP              := 0;
4016    py_za_tx_01032012.trc_LibFpBP              := 0;
4017    -- Annual Bonus
4018    py_za_tx_01032012.trc_AnnBonYtd            := 0;
4019    py_za_tx_01032012.trc_AnnBonPtd            := 0;
4020    py_za_tx_01032012.trc_AnnBonErn            := 0;
4021    py_za_tx_01032012.trc_TxbAnnBonInc         := 0;
4022    --TYS2010
4023    py_za_tx_01032012.trc_TxbAnnBonIncWoDon    := 0;
4024    py_za_tx_01032012.trc_TotLibAB             := 0;
4025    py_za_tx_01032012.trc_LibFyAB              := 0;
4026    py_za_tx_01032012.trc_LibFpAB              := 0;
4027    -- Annual Payments
4028    py_za_tx_01032012.trc_AnnPymYtd            := 0;
4029    py_za_tx_01032012.trc_AnnPymPtd            := 0;
4030    py_za_tx_01032012.trc_AnnPymErn            := 0;
4031    py_za_tx_01032012.trc_TxbAnnPymInc         := 0;
4032    --TYS2010
4033    py_za_tx_01032012.trc_TxbAnnPymIncWoDon    := 0;
4034    py_za_tx_01032012.trc_TotLibAP             := 0;
4035    py_za_tx_01032012.trc_LibFyAP              := 0;
4036    py_za_tx_01032012.trc_LibFpAP              := 0;
4037    -- Pubilc Office Allowance
4038    py_za_tx_01032012.trc_PblOffYtd            := 0;
4039    py_za_tx_01032012.trc_PblOffPtd            := 0;
4040    py_za_tx_01032012.trc_PblOffErn            := 0;
4041    --TYS2010
4042    py_za_tx_01032012.trc_TxbPblOffIncWoDon    := 0;
4043    py_za_tx_01032012.trc_LibFyPO              := 0;
4044    py_za_tx_01032012.trc_LibFpPO              := 0;
4045    -- Messages
4046    py_za_tx_01032012.trc_LibWrn               := ' ';
4047 
4048    -- Statutory Deduction Value
4049    py_za_tx_01032012.trc_PayValSD             := 0;
4050    -- Employer Contribution Value
4051    py_za_tx_01032012.trc_PayValEC             := 0;
4052    -- PAYE and SITE Values
4053    py_za_tx_01032012.trc_PayeVal              := 0;
4054    py_za_tx_01032012.trc_SiteVal              := 0;
4055    -- IT3A Threshold Indicator
4056    py_za_tx_01032012.trc_It3Ind               := 0;
4057    -- Tax Percentage Value On trace
4058    py_za_tx_01032012.trc_TxPercVal            := 0;
4059    -- Total Taxable Income Update Figure
4060    py_za_tx_01032012.trc_OUpdFig              := 0;
4061 
4062    -- Net Taxable Income Update Figure
4063    py_za_tx_01032012.trc_NtiUpdFig            := 0;
4064 
4065    -- Net PAYE Taxable Income Update Figure (EMP201)
4066    py_za_tx_01032012.trc_NPtiUpdFig           := 0;
4067 
4068    -- ValidateTaxOns Override Globals
4069    py_za_tx_01032012.trc_LibFpDROvr           := FALSE;
4070    py_za_tx_01032012.trc_LibFpNIOvr           := FALSE;
4071    py_za_tx_01032012.trc_LibFpFBOvr           := FALSE;
4072    py_za_tx_01032012.trc_LibFpTAOvr           := FALSE;
4073    py_za_tx_01032012.trc_LibFpBPOvr           := FALSE;
4074    py_za_tx_01032012.trc_LibFpABOvr           := FALSE;
4075    py_za_tx_01032012.trc_LibFpAPOvr           := FALSE;
4076    py_za_tx_01032012.trc_LibFpPOOvr           := FALSE;
4077 
4078   -- NTG
4079    py_za_tx_01032012.trc_LibFpNtgAPOvr        := FALSE;
4080    py_za_tx_01032012.trc_LibFpNtgEEDbtOvr     := FALSE;
4081 
4082    /* NTG */
4083    py_za_tx_01032012.trc_AnnPymNtgYtd             := 0;
4084    py_za_tx_01032012.trc_AnnPymNtgPtd             := 0;
4085    py_za_tx_01032012.trc_AnnPymNtgErn             := 0;
4086    py_za_tx_01032012.trc_TxbAnnPymNtgInc          := 0;
4087    py_za_tx_01032012.trc_TxbAnnPymNtgIncWoDon     := 0;
4088    py_za_tx_01032012.trc_TotLibNtgAP              := 0;
4089    py_za_tx_01032012.trc_LibFyNtgAP               := 0;
4090    py_za_tx_01032012.trc_LibFpNtgAP               := 0;
4091    -- NTG Employee Debt
4092    py_za_tx_01032012.trc_AnnEEDbtNtgYtd           := 0;
4093    py_za_tx_01032012.trc_AnnEEDbtNtgPtd           := 0;
4094    py_za_tx_01032012.trc_AnnEEDbtNtgErn           := 0;
4095    py_za_tx_01032012.trc_TxbAnnEEDbtNtgInc        := 0;
4096    py_za_tx_01032012.trc_TxbAnnEEDbtNtgIncWoDon   := 0;
4097    py_za_tx_01032012.trc_TotLibNtgEEDbt           := 0;
4098    py_za_tx_01032012.trc_LibFyNtgEEDbt            := 0;
4099    py_za_tx_01032012.trc_LibFpNtgEEDbt            := 0;
4100    py_za_tx_01032012.trc_AnnRfiEEDbtNTGCon        := 0;
4101    py_za_tx_01032012.trc_AnnNrfiEEDbtNTGCon       := 0;
4102    py_za_tx_01032012.trc_AnnPenFndNTGMax          := 0;
4103    py_za_tx_01032012.trc_AnnPenFndNTGAbm          := 0;
4104    py_za_tx_01032012.trc_AnnRetAnuNTGMax          := 0;
4105    py_za_tx_01032012.trc_AnnRetAnuNTGAbm          := 0;
4106    py_za_tx_01032012.trc_AnnTotNTGAbm             := 0;
4107    /* End NTG */
4108    py_za_tx_01032012.trc_LateSitePaye             := 0;
4109 
4110    -- Global Exception Message
4111    py_za_tx_01032012.xpt_Msg                  := 'No Error';
4112 
4113    -- Override Globals
4114    py_za_tx_01032012.trc_OvrTxCalc            := FALSE;
4115    py_za_tx_01032012.trc_OvrTyp               := 'V';
4116    py_za_tx_01032012.trc_OvrPrc               := 0;
4117    py_za_tx_01032012.trc_OvrWrn               := ' ';
4118 
4119    -- Negative Ptd Global
4120    py_za_tx_01032012.trc_NegPtd               := FALSE;
4121    -- Bug 9369895
4122    py_za_tx_01032012.trc_PenBasis             := 0;
4123 
4124 EXCEPTION
4125    WHEN OTHERS THEN
4126       IF py_za_tx_01032012.xpt_Msg = 'No Error' THEN
4127          py_za_tx_01032012.xpt_Msg := 'ClearGlobals: '||TO_CHAR(SQLCODE);
4128       END IF;
4129       RAISE py_za_tx_01032012.xpt_E;
4130 END ClearGlobals;
4131 
4132 FUNCTION AllowableMedTaxCrdtRfnd
4133    (p_Avlbl_Md_Tx_Crdt IN NUMBER
4134    ,p_Md_Tx_Crdt_Used_YTD IN NUMBER
4135    ,p_Tx_RUN in NUMBER
4136    ,p_Tx_YTD in NUMBER
4137    ) RETURN NUMBER
4138  AS
4139   l_Md_Tx_Cr_Usd t_Balance;
4140   l_Rfnd_trc number;
4141   begin
4142   l_Md_Tx_Cr_Usd := 0;
4143   l_Rfnd_trc :=0;
4144 
4145    hr_utility.set_location('  AllowableMedTaxCrdtRfnd' ,1);
4146    WriteHrTrace('   Inside  AllowableMedTaxCrdtRfnd:     1');
4147    WriteHrTrace('   p_Avlbl_Md_Tx_Crdt       :     '||to_char(p_Avlbl_Md_Tx_Crdt   ));
4148    WriteHrTrace('   p_Md_Tx_Crdt_Used_YTD    :     '||to_char(p_Md_Tx_Crdt_Used_YTD));
4149    WriteHrTrace('   p_Tx_RUN                 :     '||to_char(p_Tx_RUN             ));
4150    WriteHrTrace('   p_Tx_YTD                 :     '||to_char(p_Tx_YTD             ));
4151 
4152   l_Md_Tx_Cr_Usd := least(p_Avlbl_Md_Tx_Crdt,p_Md_Tx_Crdt_Used_YTD);
4153   l_Rfnd_trc := l_Md_Tx_Cr_Usd - p_Md_Tx_Crdt_Used_YTD;
4154 
4155    WriteHrTrace('   l_Md_Tx_Cr_Usd           :     '||to_char(l_Md_Tx_Cr_Usd       ));
4156    WriteHrTrace('   l_Rfnd_trc               :     '||to_char(l_Rfnd_trc           ));
4157 
4158 -- Check if the reduced Medical Tax Credit due to availability is sufficient for refund
4159 -- if not then first Tax should be refunded and then only Medical Tax Credit
4160 -- Such that Medical Tax Credit Used YTD can not be -ve.
4161   if l_Rfnd_trc > p_Tx_RUN then
4162    hr_utility.set_location('  AllowableMedTaxCrdtRfnd' ,2);
4163      l_Rfnd_trc := least((p_Tx_YTD + (p_Tx_RUN - l_Rfnd_trc)),0);
4164      l_Md_Tx_Cr_Usd := greatest(l_Md_Tx_Cr_Usd + l_Rfnd_trc,0);
4165 
4166    WriteHrTrace('   l_Md_Tx_Cr_Usd           :     '||to_char(l_Md_Tx_Cr_Usd       ));
4167    WriteHrTrace('   l_Rfnd_trc               :     '||to_char(l_Rfnd_trc           ));
4168 
4169   end if;
4170 
4171    hr_utility.set_location('  AllowableMedTaxCrdtRfnd' ,10);
4172   return l_Md_Tx_Cr_Usd;
4173 EXCEPTION
4174    WHEN OTHERS THEN
4175       IF py_za_tx_01032012.xpt_Msg = 'No Error' THEN
4176          py_za_tx_01032012.xpt_Msg := 'AllowableMedTaxCrdtRfnd: '||TO_CHAR(SQLCODE);
4177          hr_utility.set_location('  AllowableMedTaxCrdtRfnd' ,99);
4178       END IF;
4179       hr_utility.set_location('  AllowableMedTaxCrdtRfnd' ,999);
4180       RAISE py_za_tx_01032012.xpt_E;
4181 END AllowableMedTaxCrdtRfnd;
4182 
4183 
4184 PROCEDURE CalMedTxCrUSEDOns
4185    (p_Avlbl_Md_Tx_Crdt    IN  NUMBER
4186    ,p_Md_Tx_Crdt_Used_YTD IN  NUMBER
4187    ,p_Tx_RUN              IN  NUMBER
4188    ,p_Tx_YTD              IN  NUMBER
4189    ,p_Md_Tx_Cr_Usd        OUT NOCOPY NUMBER
4190    ,p_Md_Tx_Cr_Usd_Upd    OUT NOCOPY NUMBER
4191    )
4192 AS
4193 
4194 BEGIN
4195    hr_utility.set_location('py_za_tx_utl_01032012.CalMedTxCrUSEDOns' ,1);
4196    hr_utility.set_location('         trc_curMedTxCrEle:'||p_Avlbl_Md_Tx_Crdt,2);
4197    hr_utility.set_location('bal_MED_TAX_CR_USED_XX_YTD:'||p_Md_Tx_Crdt_Used_YTD,2);
4198    hr_utility.set_location('               trc_LibFpXX:'||p_Tx_RUN,2);
4199    hr_utility.set_location('          bal_TX_ON_XX_YTD:'||p_Tx_YTD,2);
4200 
4201    p_Md_Tx_Cr_Usd     := 0;
4202    p_Md_Tx_Cr_Usd_Upd := 0;
4203 
4204    IF p_Tx_RUN > 0 THEN
4205       hr_utility.set_location('py_za_tx_utl_01032012.CalMedTxCrUSEDOns' ,3);
4206       p_Md_Tx_Cr_Usd := least(p_Avlbl_Md_Tx_Crdt, p_Md_Tx_Crdt_Used_YTD + p_Tx_RUN);
4207       p_Md_Tx_Cr_Usd_Upd := p_Md_Tx_Cr_Usd - p_Md_Tx_Crdt_Used_YTD;
4208       IF p_Md_Tx_Cr_Usd_Upd > p_Tx_RUN THEN
4209          hr_utility.set_location('py_za_tx_utl_01032012.CalMedTxCrUSEDOns' ,4);
4210          p_Md_Tx_Cr_Usd_Upd := p_Tx_RUN;
4211          p_Md_Tx_Cr_Usd := p_Md_Tx_Crdt_Used_YTD + p_Md_Tx_Cr_Usd_Upd;
4212       END IF;
4213    ELSE
4214       hr_utility.set_location('py_za_tx_utl_01032012.CalMedTxCrUSEDOns' ,5);
4215       p_Md_Tx_Cr_Usd :=py_za_tx_utl_01032012.AllowableMedTaxCrdtRfnd
4216                        (p_Avlbl_Md_Tx_Crdt     => p_Avlbl_Md_Tx_Crdt
4217                        ,p_Md_tx_Crdt_Used_YTD  => p_Md_Tx_Crdt_Used_YTD
4218                        ,p_Tx_RUN               => p_Tx_RUN
4219                        ,p_Tx_YTD               => p_Tx_YTD
4220                        );
4221       p_Md_Tx_Cr_Usd_Upd := p_Md_Tx_Cr_Usd - p_Md_Tx_Crdt_Used_YTD;
4222    END IF;
4223    hr_utility.set_location('py_za_tx_utl_01032012.CalMedTxCrUSEDOns' ,10);
4224 EXCEPTION
4225    WHEN OTHERS THEN
4226       IF py_za_tx_01032012.xpt_Msg = 'No Error' THEN
4227          py_za_tx_01032012.xpt_Msg := 'CalMedTxCrUSEDOns: '||TO_CHAR(SQLCODE);
4228          hr_utility.set_location('  CalMedTxCrUSEDOns' ,99);
4229       END IF;
4230       hr_utility.set_location('  CalMedTxCrUSEDOns' ,999);
4231       RAISE py_za_tx_01032012.xpt_E;
4232 END CalMedTxCrUSEDOns;
4233 
4234 Function Adj_Med_TxCr
4235    ( p_MedTxCrUsed_Upd in OUT NOCOPY number
4236    , p_Adj_Amount  in number
4237    , p_TxOn        in OUT NOCOPY NUMBER
4238    ) return number
4239 is
4240 l_Adj_Amount Number;
4241 l_MedTxCrUsed Number;
4242 
4243   begin
4244   l_MedTxCrUsed := p_MedTxCrUsed_Upd;
4245   l_Adj_Amount := Greatest(0,p_MedTxCrUsed_Upd - p_Adj_Amount  );
4246   If l_Adj_Amount <> p_MedTxCrUsed_Upd and p_MedTxCrUsed_Upd > 0 then
4247      p_MedTxCrUsed_Upd :=  Greatest(0,p_MedTxCrUsed_Upd - p_Adj_Amount  );
4248      l_Adj_Amount := l_MedTxCrUsed - p_MedTxCrUsed_Upd;
4249      p_TxOn := p_TxOn + l_Adj_Amount;
4250   else
4251      l_Adj_Amount := 0;
4252   end if;
4253 return l_Adj_Amount;
4254 
4255 end Adj_Med_TxCr;
4256 
4257 
4258 
4259 Function AdjMACTxOns
4260 (    p_MedTxCrUsedDR_Upd     IN OUT NOCOPY NUMBER
4261   ,  p_MedTxCrUsedNI_Upd     IN OUT NOCOPY NUMBER
4262   ,  p_MedTxCrUsedFB_Upd     IN OUT NOCOPY NUMBER
4263   ,  p_MedTxCrUsedTA_Upd     IN OUT NOCOPY NUMBER
4264   ,  p_MedTxCrUsedBP_Upd     IN OUT NOCOPY NUMBER
4265   ,  p_MedTxCrUsedAB_Upd     IN OUT NOCOPY NUMBER
4266   ,  p_MedTxCrUsedAP_Upd     IN OUT NOCOPY NUMBER
4267   ,  p_MedTxCrUsedPO_Upd     IN OUT NOCOPY NUMBER
4268   ,  p_MedTxCrUsedNtgAP_Upd  IN OUT NOCOPY NUMBER
4269   ,  p_MedTxCrUsedNtgEEDbt_Upd IN OUT NOCOPY NUMBER
4270   ,  p_MedTxCrAvailable   IN   NUMBER
4271     ) return NUMBER
4272 is
4273 l_mac_used_run Number;
4274 l_TxOns Number;
4275 l_Adj_Amount Number;
4276 l_trc_Adj_Amount NUMBER;
4277 l_MedTxCrAvailable NUMBER ;
4278 begin
4279 
4280   hr_utility.set_location('py_za_tx_utl_01032012.AdjMACTxOns' ,10);
4281   l_Adj_Amount := 0;
4282   l_mac_used_run := 0;
4283   l_MedTxCrAvailable := p_MedTxCrAvailable;
4284   l_trc_Adj_Amount :=0;
4285   l_mac_used_run :=
4286           ( p_MedTxCrUsedDR_Upd
4287            +  p_MedTxCrUsedNI_Upd
4288            +  p_MedTxCrUsedFB_Upd
4289            +  p_MedTxCrUsedTA_Upd
4290            +  p_MedTxCrUsedBP_Upd
4291            +  p_MedTxCrUsedAB_Upd
4292            +  p_MedTxCrUsedAP_Upd
4293            +  p_MedTxCrUsedPO_Upd
4294            +  p_MedTxCrUsedNtgAP_Upd
4295            +  p_MedTxCrUsedNtgEEDbt_Upd
4296            );
4297    hr_utility.set_location('py_za_tx_utl_01032012.AdjMACTxOns' ,20);
4298   l_TxOns := 0;
4299   l_TxOns :=
4300        (  py_za_tx_01032012.trc_LibFpDR
4301             + py_za_tx_01032012.trc_LibFpNI
4302             + py_za_tx_01032012.trc_LibFpFB
4303             + py_za_tx_01032012.trc_LibFpTA
4304             + py_za_tx_01032012.trc_LibFpBP
4305             + py_za_tx_01032012.trc_LibFpAB
4306             + py_za_tx_01032012.trc_LibFpAP
4307             + py_za_tx_01032012.trc_LibFpPO
4308             + py_za_tx_01032012.trc_LibFpNtgAP
4309             + py_za_tx_01032012.trc_LibFpNtgEEDbt
4310       );
4311 
4312    If l_TxOns < 0 and l_mac_used_run > 0 then
4313       hr_utility.set_location('py_za_tx_utl_01032012.AdjMACTxOns' ,30);
4314       l_Adj_Amount := LEAST( -1 * l_TxOns, l_mac_used_run);
4315 
4316      if p_MedTxCrUsedNtgEEDbt_Upd > 0 and l_Adj_Amount > 0 then
4317 
4318        l_trc_Adj_Amount := Adj_Med_TxCr
4319                    ( p_MedTxCrUsed_Upd =>  p_MedTxCrUsedNtgEEDbt_Upd
4320                    , p_Adj_Amount      =>  l_Adj_Amount
4321                    , p_TxOn            =>  py_za_tx_01032012.trc_LibFpNtgEEDbt
4322                    );
4323        l_Adj_Amount := l_Adj_Amount - l_trc_Adj_Amount;
4324        l_MedTxCrAvailable := l_MedTxCrAvailable + l_trc_Adj_Amount;
4325        if l_Adj_Amount <= 0 then
4326           return l_MedTxCrAvailable;
4327        end if;
4328      end if;
4329 
4330      if p_MedTxCrUsedNtgAP_Upd > 0 and l_Adj_Amount > 0 then
4331 
4332        l_trc_Adj_Amount := Adj_Med_TxCr
4333                    ( p_MedTxCrUsed_Upd =>  p_MedTxCrUsedNtgAP_Upd
4334                    , p_Adj_Amount      =>  l_Adj_Amount
4335                    , p_TxOn            =>  py_za_tx_01032012.trc_LibFpNtgAP
4336                    );
4337        l_Adj_Amount := l_Adj_Amount - l_trc_Adj_Amount;
4338        l_MedTxCrAvailable := l_MedTxCrAvailable + l_trc_Adj_Amount;
4339        if l_Adj_Amount <= 0 then
4340           return l_MedTxCrAvailable;
4341        end if;
4342      end if;
4343 
4344      if p_MedTxCrUsedPO_Upd > 0 and l_Adj_Amount > 0 then
4345 
4346        l_trc_Adj_Amount := Adj_Med_TxCr
4347                    ( p_MedTxCrUsed_Upd =>  p_MedTxCrUsedPO_Upd
4348                    , p_Adj_Amount      =>  l_Adj_Amount
4349                    , p_TxOn            =>  py_za_tx_01032012.trc_LibFpPO
4350                    );
4351        l_Adj_Amount := l_Adj_Amount - l_trc_Adj_Amount;
4352        l_MedTxCrAvailable := l_MedTxCrAvailable + l_trc_Adj_Amount;
4353        if l_Adj_Amount <= 0 then
4354           return l_MedTxCrAvailable;
4355        end if;
4356      end if;
4357 
4358      if p_MedTxCrUsedAP_Upd > 0 and l_Adj_Amount > 0 then
4359 
4360        l_trc_Adj_Amount := Adj_Med_TxCr
4361                    ( p_MedTxCrUsed_Upd =>  p_MedTxCrUsedAP_Upd
4362                    , p_Adj_Amount      =>  l_Adj_Amount
4363                    , p_TxOn            =>  py_za_tx_01032012.trc_LibFpAP
4364                    );
4365        l_Adj_Amount := l_Adj_Amount - l_trc_Adj_Amount;
4366        l_MedTxCrAvailable := l_MedTxCrAvailable + l_trc_Adj_Amount;
4367        if l_Adj_Amount <= 0 then
4368           return l_MedTxCrAvailable;
4369        end if;
4370      end if;
4371 
4372      if p_MedTxCrUsedAB_Upd > 0 and l_Adj_Amount > 0 then
4373 
4374        l_trc_Adj_Amount := Adj_Med_TxCr
4375                    ( p_MedTxCrUsed_Upd =>  p_MedTxCrUsedAB_Upd
4376                    , p_Adj_Amount      =>  l_Adj_Amount
4377                    , p_TxOn            =>  py_za_tx_01032012.trc_LibFpAB
4378                    );
4379        l_Adj_Amount := l_Adj_Amount - l_trc_Adj_Amount;
4380        l_MedTxCrAvailable := l_MedTxCrAvailable + l_trc_Adj_Amount;
4381        if l_Adj_Amount <= 0 then
4382           return l_MedTxCrAvailable;
4383        end if;
4384      end if;
4385 
4386      if p_MedTxCrUsedBP_Upd > 0 and l_Adj_Amount > 0 then
4387 
4388        l_trc_Adj_Amount := Adj_Med_TxCr
4389                    ( p_MedTxCrUsed_Upd =>  p_MedTxCrUsedBP_Upd
4390                    , p_Adj_Amount      =>  l_Adj_Amount
4391                    , p_TxOn            =>  py_za_tx_01032012.trc_LibFpBP
4392                    );
4393        l_Adj_Amount := l_Adj_Amount - l_trc_Adj_Amount;
4394        l_MedTxCrAvailable := l_MedTxCrAvailable + l_trc_Adj_Amount;
4395        if l_Adj_Amount <= 0 then
4396           return l_MedTxCrAvailable;
4397        end if;
4398      end if;
4399 
4400      if p_MedTxCrUsedTA_Upd > 0 and l_Adj_Amount > 0 then
4401 
4402        l_trc_Adj_Amount := Adj_Med_TxCr
4403                    ( p_MedTxCrUsed_Upd =>  p_MedTxCrUsedTA_Upd
4404                    , p_Adj_Amount      =>  l_Adj_Amount
4405                    , p_TxOn            =>  py_za_tx_01032012.trc_LibFpTA
4406                    );
4407        l_Adj_Amount := l_Adj_Amount - l_trc_Adj_Amount;
4408        l_MedTxCrAvailable := l_MedTxCrAvailable + l_trc_Adj_Amount;
4409        if l_Adj_Amount <= 0 then
4410           return l_MedTxCrAvailable;
4411        end if;
4412      end if;
4413 
4414      if p_MedTxCrUsedFB_Upd > 0 and l_Adj_Amount > 0 then
4415 
4416        l_trc_Adj_Amount := Adj_Med_TxCr
4417                    ( p_MedTxCrUsed_Upd =>  p_MedTxCrUsedFB_Upd
4418                    , p_Adj_Amount      =>  l_Adj_Amount
4419                    , p_TxOn            =>  py_za_tx_01032012.trc_LibFpFB
4420                    );
4421        l_Adj_Amount := l_Adj_Amount - l_trc_Adj_Amount;
4422        l_MedTxCrAvailable := l_MedTxCrAvailable + l_trc_Adj_Amount;
4423        if l_Adj_Amount <= 0 then
4424           return l_MedTxCrAvailable;
4425        end if;
4426      end if;
4427 
4428      if p_MedTxCrUsedNI_Upd > 0 and l_Adj_Amount > 0 then
4429 
4430        l_trc_Adj_Amount := Adj_Med_TxCr
4431                    ( p_MedTxCrUsed_Upd =>  p_MedTxCrUsedNI_Upd
4432                    , p_Adj_Amount      =>  l_Adj_Amount
4433                    , p_TxOn            =>  py_za_tx_01032012.trc_LibFpNI
4434                    );
4435        l_Adj_Amount := l_Adj_Amount - l_trc_Adj_Amount;
4436        l_MedTxCrAvailable := l_MedTxCrAvailable + l_trc_Adj_Amount;
4437        if l_Adj_Amount <= 0 then
4438           return l_MedTxCrAvailable;
4439        end if;
4440      end if;
4441 
4442      if p_MedTxCrUsedDR_Upd > 0 and l_Adj_Amount > 0 then
4443 
4444        l_trc_Adj_Amount := Adj_Med_TxCr
4445                    ( p_MedTxCrUsed_Upd =>  p_MedTxCrUsedDR_Upd
4446                    , p_Adj_Amount      =>  l_Adj_Amount
4447                    , p_TxOn            =>  py_za_tx_01032012.trc_LibFpDR
4448                    );
4449        l_Adj_Amount := l_Adj_Amount - l_trc_Adj_Amount;
4450        l_MedTxCrAvailable := l_MedTxCrAvailable + l_trc_Adj_Amount;
4451        if l_Adj_Amount <= 0 then
4452           return l_MedTxCrAvailable;
4453        end if;
4454      end if;
4455 
4456   end if;
4457 --  Null;
4458 return l_MedTxCrAvailable;
4459 
4460    hr_utility.set_location('py_za_tx_utl_01032012.AdjMACTxOns' ,50);
4461 EXCEPTION
4462    WHEN OTHERS THEN
4463       IF py_za_tx_01032012.xpt_Msg = 'No Error' THEN
4464          py_za_tx_01032012.xpt_Msg := 'AdjMACTxOns: '||TO_CHAR(SQLCODE);
4465          hr_utility.set_location('  AdjMACTxOns' ,99);
4466       END IF;
4467       hr_utility.set_location('  AdjMACTxOns' ,999);
4468       RAISE py_za_tx_01032012.xpt_E;
4469 
4470 end AdjMACTxOns;
4471 
4472 FUNCTION AllowRefund
4473      (  p_65Year   IN DATE
4474      )  RETURN BOOLEAN
4475 AS
4476 
4477 BEGIN
4478   hr_utility.set_location('py_za_tx_utl_01032012.AllowRefund' ,10);
4479   IF p_65Year <= PY_ZA_TX_01032012.dbi_ZA_TX_YR_END THEN
4480      hr_utility.set_location('py_za_tx_utl_01032012.AllowRefund' ,20);
4481      RETURN TRUE;
4482   END IF;
4483   IF (PY_ZA_TX_01032012.bal_MED_EMP_NRFI_ASG_TAX_YTD     <= 0 and
4484           PY_ZA_TX_01032012.bal_MED_EMP_PKG_ASG_TAX_YTD  <= 0 and
4485           PY_ZA_TX_01032012.bal_MED_EMP_RFI_ASG_TAX_YTD  <= 0 and
4486           PY_ZA_TX_01032012.bal_MED_CONTR_YTD            <= 0 and
4487 	        PY_ZA_TX_01032012.bal_ER_MED_CONTR_YTD         <= 0
4488          ) THEN
4489       hr_utility.set_location('py_za_tx_utl_01032012.AllowRefund' ,30);
4490       RETURN TRUE;
4491   END IF;
4492   RETURN FALSE;
4493 END AllowRefund;
4494 
4495 END py_za_tx_utl_01032012;