DBA Data[Home] [Help]

PACKAGE BODY: APPS.PY_ZA_TX_UTL_01032005

Source


1 PACKAGE BODY py_za_tx_utl_01032005 AS
2 /* $Header: pyzatu06.pkb 120.3 2005/08/26 02:00:59 jlouw noship $ */
3 /* Copyright (c) Oracle Corporation 2000. All rights reserved. */
4 /*
5    PRODUCT
6       Oracle Payroll - ZA Localisation Tax Module
7 
8    NAME
9       py_za_tx_utl_01032005.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 
55    PUBLIC PROCEDURES
56       StartHrTrace
57          Sets package global that determines if extra trace information
58          will be written to file - hr_utility
59       StopHrTrace
60          Stops trace information from being written to file
61       WriteHrTrace
62          Writes extra trace information to file if global
63          has been set
64       PeriodFactor
65          Calculates the period factor for the assignment.
66          For a complete description see the tax module design document.
67       PossiblePeriodsFactor
68          Calculates the possible period factor for the assignment.
69          For a complete description see the tax module design document.
70       SetRebates
71          Calculate tax Rebate and Threshold values.
72          For a complete description see the tax module design document.
73       Abatements
74          Calculates all necessary abatements.
75          For a complete description see the tax module design document.
76       ArrearExcess
77          Calculates the arrear excess figure to 'effectively' update the
78          Asg_Itd dimension of the arrear excess pension and retirement
79          annuity balances.  Will only fire on siteperiod.
80       TrvAll
81          Calculates the taxable travel allowance over a period of
82          time based on the effective global values at the time.
83          For a complete description see the tax module design document.
84       NpVal
85          Validates the calculated category liabilities.
86          For a complete description see the tax module design document.
87       SitPaySplit
88          Calculates the site paye split of tax liabilities.
89          For a complete description see the tax module design document.
90       Trace
91          Traces the tax calculation.
92          For a complete description see the tax module design document.
93       ClearGlobals
94          Clears any set package globals.
95          For a complete description see the tax module design document.
96 
97    PRIVATE FUNCTIONS
98       GetTableValue
99          Returns the value from a user table date effectively
100 
101    PRIVATE PROCEDURES
102       <none>
103 
104    NOTES
105       .
106 
107    MODIFICATION HISTORY
108    Person       Date       Version Bug     Comments
109    -----------  ---------- ------- ------- -----------------------------------
110    J.N. Louw    24/08/2005 115.7   4566053
111    J.N. Louw    18/08/2005 115.6   4346920
112    R.V. Pahune  05/08/2006 115.5   4346920
113    A. Mahanty   14/04/2005 115.4   3491357 BRA Enhancement.
114                                            Balance value retrieval modified.
115    R.V. Pahune  05/04/2005 115.3   4276047 For Employee Broadbased
116                                            share plan enh 4216609
117    J.N. Louw    12/01/2005 115.2   4117011
118    J.N. Louw    08/01/2005 115.1   4106203
119                                    4110940
120    J.N. Louw    22/12/2004 115.0           Next Version of Main ZA Tax
121                                            Package.
122                                            For detail history see
123                                            py_za_tx_utl_01032004
124  */
125 -------------------------------------------------------------------------------
126 --                               PACKAGE BODY                                --
127 -------------------------------------------------------------------------------
128 
129 -------------------------------------------------------------------------------
130 -- StartHrTrace                                                              --
131 -- Wrapper for hr_utility.trace_on                                           --
132 -------------------------------------------------------------------------------
133 PROCEDURE StartHrTrace AS
134 BEGIN
135    IF g_HrTraceEnabled THEN
136       hr_utility.trace_on(null,g_HrTracePipeName);
137    END IF;
138 END StartHrTrace;
139 -------------------------------------------------------------------------------
140 -- StartHrTrace                                                              --
141 -- Function wrapper for hr_utility.trace_on                                  --
142 -------------------------------------------------------------------------------
143 FUNCTION StartHrTrace(
144    p_HrTracePipeName VARCHAR2
145    ) RETURN VARCHAR2
146 AS
147 BEGIN
148    hr_utility.trace_on(null,p_HrTracePipeName);
149    RETURN p_HrTracePipeName;
150 END StartHrTrace;
151 -------------------------------------------------------------------------------
152 -- StopHrTrace                                                               --
153 -- Wrapper for hr_utility.trace_off                                          --
154 -------------------------------------------------------------------------------
155 PROCEDURE StopHrTrace AS
156 BEGIN
157    IF g_HrTraceEnabled THEN
158       hr_utility.trace_off;
159    END IF;
160 END StopHrTrace;
161 -------------------------------------------------------------------------------
162 -- StopHrTrace                                                               --
163 -- Function wrapper for hr_utility.trace_off                                 --
164 -------------------------------------------------------------------------------
165 FUNCTION StopHrTrace RETURN VARCHAR2 AS
166 BEGIN
167    hr_utility.trace_off;
168    RETURN 'TRACE_OFF';
169 END StopHrTrace;
170 -------------------------------------------------------------------------------
171 -- WriteHrTrace                                                              --
172 -- Wrapper for hr_utility.trace                                              --
173 -------------------------------------------------------------------------------
174 PROCEDURE WriteHrTrace(
175    p_Buffer VARCHAR2
176    )
177 AS
178 BEGIN
179    IF g_HrTraceEnabled THEN
180       -- Write the Line
181       hr_utility.trace(p_Buffer);
182    END IF;
183 END WriteHrTrace;
184 
185 
186 -------------------------------------------------------------------------------
187 --                           Tax Utility Functions                           --
188 -------------------------------------------------------------------------------
189 -------------------------------------------------------------------------------
190 -- GlbVal                                                                    --
191 -------------------------------------------------------------------------------
192 FUNCTION GlbVal
193    (p_GlbNme ff_globals_f.global_name%TYPE
194    ,p_EffDte DATE
195    ) RETURN ff_globals_f.global_value%TYPE
196 AS
197 -- Variables
198    l_GlbVal t_balance;
199 BEGIN
200    hr_utility.set_location('py_za_tx_utl_01032005.GlbVal',1);
201    WriteHrTrace('p_GlbNme :'||p_GlbNme);
202    WriteHrTrace('p_EffDte :'||to_char(p_EffDte,'DD/MM/YYYY'));
203    --
204    SELECT TO_NUMBER(global_value)
205      INTO l_GlbVal
206      FROM ff_globals_f
207     WHERE p_EffDte between effective_start_date and effective_end_date
208       AND global_name = p_GlbNme;
209 
210    hr_utility.set_location('py_za_tx_utl_01032005.GlbVal',2);
211    RETURN l_GlbVal;
212 
213 EXCEPTION
214    WHEN OTHERS THEN
215       IF py_za_tx_01032005.xpt_Msg = 'No Error' THEN
216          py_za_tx_01032005.xpt_Msg := 'GlbVal: '||TO_CHAR(SQLCODE);
217       END IF;
218       RAISE py_za_tx_01032005.xpt_E;
219 END GlbVal;
220 
221 
222 -------------------------------------------------------------------------------
223 -- TotPrdTxbIncYtd
224 -------------------------------------------------------------------------------
225 FUNCTION TotPrdTxbIncYtd RETURN t_balance AS
226    ------------
227    -- Variables
228    ------------
229    l_tot_txb_prd_inc_ytd t_balance;
230 
231 -------------------------------------------------------------------------------
232 BEGIN --                  MAIN                                               --
233 -------------------------------------------------------------------------------
234    hr_utility.set_location('py_za_tx_utl_01032005.TotPrdTxbIncYtd',1);
235 
236    l_tot_txb_prd_inc_ytd :=
237       ( py_za_tx_01032005.bal_TOT_TXB_NI_YTD
238       + py_za_tx_01032005.bal_TOT_TXB_FB_YTD
239       + py_za_tx_01032005.bal_TOT_TXB_TA_YTD
240       );
241    hr_utility.set_location('py_za_tx_utl_01032005.TotPrdTxbIncYtd',2);
242    RETURN l_tot_txb_prd_inc_ytd;
243 
244 EXCEPTION
245    WHEN OTHERS THEN
246       hr_utility.set_location('py_za_tx_utl_01032005.TotPrdTxbIncYtd',3);
247       IF py_za_tx_01032005.xpt_Msg = 'No Error' THEN
248          py_za_tx_01032005.xpt_Msg := 'TotPrdTxbIncYtd: '||TO_CHAR(SQLCODE);
249       END IF;
250       RAISE py_za_tx_01032005.xpt_E;
251 -------------------------------------------------------------------------------
252 END TotPrdTxbIncYtd;
253 
254 
255 -------------------------------------------------------------------------------
256 -- TotPrdTxbIncPtd
257 -------------------------------------------------------------------------------
258 FUNCTION TotPrdTxbIncPtd RETURN t_balance AS
259    ------------
260    -- Variables
261    ------------
262    l_tot_txb_prd_inc_ptd t_balance;
263 
264 -------------------------------------------------------------------------------
265 BEGIN --                  MAIN                                               --
266 -------------------------------------------------------------------------------
267    hr_utility.set_location('py_za_tx_utl_01032005.TotPrdTxbIncPtd',1);
268 
269    l_tot_txb_prd_inc_ptd :=
270       ( py_za_tx_01032005.bal_TOT_TXB_NI_PTD
271       + py_za_tx_01032005.bal_TOT_TXB_FB_PTD
272       + py_za_tx_01032005.bal_TOT_TXB_TA_PTD
273       );
274    hr_utility.set_location('py_za_tx_utl_01032005.TotPrdTxbIncPtd',2);
275    RETURN l_tot_txb_prd_inc_ptd;
276 
277 EXCEPTION
278    WHEN OTHERS THEN
279       hr_utility.set_location('py_za_tx_utl_01032005.TotPrdTxbIncPtd',3);
280       IF py_za_tx_01032005.xpt_Msg = 'No Error' THEN
281          py_za_tx_01032005.xpt_Msg := 'TotPrdTxbIncPtd: '||TO_CHAR(SQLCODE);
282       END IF;
283       RAISE py_za_tx_01032005.xpt_E;
284 -------------------------------------------------------------------------------
285 END TotPrdTxbIncPtd;
286 
287 
288 -------------------------------------------------------------------
289 -- NegPtd
290 -------------------------------------------------------------------
291 FUNCTION NegPtd RETURN BOOLEAN AS
292    ------------
293    -- Variables
294    ------------
295    l_Retval BOOLEAN DEFAULT FALSE;
296 
297 -------------------------------------------------------------------
298 BEGIN --                   NegPtd - MAIN                         --
299 -------------------------------------------------------------------
300    hr_utility.set_location('py_za_tx_utl_01032005.NegPtd',1);
301    -- If any period ptd income value is negative
302    -- a site calc has to be done
303 
304    py_za_tx_01032005.trc_NorIncPtd := py_za_tx_01032005.bal_TOT_TXB_NI_PTD;
305    py_za_tx_01032005.trc_FrnBenPtd := py_za_tx_01032005.bal_TOT_TXB_FB_PTD;
306    py_za_tx_01032005.trc_TrvAllPtd := py_za_tx_01032005.bal_TOT_TXB_TA_PTD;
307 
308    py_za_tx_01032005.trc_BonProPtd := py_za_tx_01032005.bal_BP_PTD;
309 
310    IF LEAST( py_za_tx_01032005.trc_NorIncPtd
311            , py_za_tx_01032005.trc_FrnBenPtd
312            , py_za_tx_01032005.trc_TrvAllPtd
313            , py_za_tx_01032005.trc_BonProPtd
314            ) < 0
315    THEN
316       hr_utility.set_location('py_za_tx_utl_01032005.NegPtd',2);
317       py_za_tx_01032005.trc_NegPtd := TRUE;
318    END IF;
319 
320    hr_utility.set_location('py_za_tx_utl_01032005.NegPtd',3);
321    RETURN py_za_tx_01032005.trc_NegPtd;
322 
323 EXCEPTION
324    WHEN OTHERS THEN
325       IF py_za_tx_01032005.xpt_Msg = 'No Error' THEN
326          py_za_tx_01032005.xpt_Msg := 'NegPtd: '||TO_CHAR(SQLCODE);
327       END IF;
328       RAISE py_za_tx_01032005.xpt_E;
329 END NegPtd;
330 
331 -------------------------------------------------------------------------------
332 -- LatePayPeriod                                                             --
333 -------------------------------------------------------------------------------
334 FUNCTION LatePayPeriod RETURN BOOLEAN AS
335 -- Variables
336    l_CurTxYear NUMBER(15);
337 BEGIN
338    hr_utility.set_location('py_za_tx_utl_01032005.LatePayPeriod',1);
339 -- IF the employee's assignment ended before the current tax year
340 -- it's a Late Pay Period
341    IF py_za_tx_01032005.dbi_ZA_ACT_END_DTE < py_za_tx_01032005.dbi_ZA_TX_YR_STRT THEN
342 
343       hr_utility.set_location('py_za_tx_utl_01032005.LatePayPeriod',2);
344 
345    -- Valid Late Pay Period?
346    --
347    -- Current Tax Year
348       l_CurTxYear := to_number(to_char(py_za_tx_01032005.dbi_ZA_TX_YR_END,'YYYY'));
349 
350       hr_utility.set_location('py_za_tx_utl_01032005.LatePayPeriod',3);
351 
352       IF (l_CurTxYear - py_za_tx_01032005.dbi_ZA_ASG_TX_YR) > 1 THEN
353          hr_utility.set_location('py_za_tx_utl_01032005.LatePayPeriod',4);
354          hr_utility.set_message(801, 'Late Payment Across Two Tax Years!');
355          hr_utility.raise_error;
356       ELSE
357          hr_utility.set_location('py_za_tx_utl_01032005.LatePayPeriod',5);
358          RETURN TRUE;
359       END IF;
360 
361    ELSE
362       hr_utility.set_location('py_za_tx_utl_01032005.LatePayPeriod',6);
363       RETURN FALSE;
364    END IF;
365 
366 EXCEPTION
367    WHEN OTHERS THEN
368       IF py_za_tx_01032005.xpt_Msg = 'No Error' THEN
369          py_za_tx_01032005.xpt_Msg := 'LatePayPeriod: '||TO_CHAR(SQLCODE);
370       END IF;
371       RAISE py_za_tx_01032005.xpt_E;
372 END LatePayPeriod;
373 -------------------------------------------------------------------------------
374 -- LstPeriod                                                                 --
375 -------------------------------------------------------------------------------
376 FUNCTION LstPeriod RETURN BOOLEAN AS
377 BEGIN
378    -- Is this the last period for the tax year
379    --
380    IF py_za_tx_01032005.dbi_ZA_PAY_PRDS_LFT = 1 THEN
381       hr_utility.set_location('py_za_tx_utl_01032005.LstPeriod',1);
382       RETURN TRUE;
383    ELSE
384       hr_utility.set_location('py_za_tx_utl_01032005.LstPeriod',2);
385       RETURN FALSE;
386    END IF;
387 
388 EXCEPTION
389    WHEN OTHERS THEN
390       IF py_za_tx_01032005.xpt_Msg = 'No Error' THEN
391          py_za_tx_01032005.xpt_Msg := 'LstPeriod: '||TO_CHAR(SQLCODE);
392       END IF;
393       RAISE py_za_tx_01032005.xpt_E;
394 END LstPeriod;
395 -------------------------------------------------------------------------------
396 -- EmpTermInPeriod                                                           --
397 -------------------------------------------------------------------------------
398 FUNCTION EmpTermInPeriod RETURN BOOLEAN AS
399 
400 BEGIN
401    -- Was the employee terminated in the current period
402    --
403    IF py_za_tx_01032005.dbi_ZA_ACT_END_DTE BETWEEN py_za_tx_01032005.dbi_ZA_CUR_PRD_STRT_DTE
404                                                AND py_za_tx_01032005.dbi_ZA_CUR_PRD_END_DTE
405    THEN
406       hr_utility.set_location('py_za_tx_utl_01032005.EmpTermInPeriod',1);
407       RETURN TRUE;
408    ELSE
409       hr_utility.set_location('py_za_tx_utl_01032005.EmpTermInPeriod',2);
410       RETURN FALSE;
411    END IF;
412 
413 EXCEPTION
414    WHEN OTHERS THEN
415       IF py_za_tx_01032005.xpt_Msg = 'No Error' THEN
416          py_za_tx_01032005.xpt_Msg := 'EmpTermInPeriod: '||TO_CHAR(SQLCODE);
417       END IF;
418       RAISE py_za_tx_01032005.xpt_E;
419 END EmpTermInPeriod;
420 -------------------------------------------------------------------------------
421 -- EmpTermPrePeriod                                                          --
422 -------------------------------------------------------------------------------
423 FUNCTION EmpTermPrePeriod RETURN BOOLEAN AS
424 
425 BEGIN
426    -- Was the employee terminated before the current period
427    --
428    IF py_za_tx_01032005.dbi_ZA_ACT_END_DTE <= py_za_tx_01032005.dbi_ZA_CUR_PRD_STRT_DTE THEN
429       hr_utility.set_location('py_za_tx_utl_01032005.EmpTermPrePeriod',1);
430       RETURN TRUE;
431    ELSE
432       hr_utility.set_location('py_za_tx_utl_01032005.EmpTermPrePeriod',2);
433       RETURN FALSE;
434    END IF;
435 
436 EXCEPTION
437    WHEN OTHERS THEN
438       IF py_za_tx_01032005.xpt_Msg = 'No Error' THEN
439          py_za_tx_01032005.xpt_Msg := 'EmpTermPrePeriod: '||TO_CHAR(SQLCODE);
440       END IF;
441       RAISE py_za_tx_01032005.xpt_E;
442 END EmpTermPrePeriod;
443 -------------------------------------------------------------------------------
444 -- PreErnPeriod                                                              --
445 -------------------------------------------------------------------------------
446 FUNCTION PreErnPeriod RETURN BOOLEAN AS
447 
448 BEGIN
449    -- PTD Taxable Income
450    --
451 
452    py_za_tx_01032005.trc_TxbIncPtd :=
453       ( py_za_tx_01032005.bal_TOT_TXB_NI_PTD
454       + py_za_tx_01032005.bal_TOT_TXB_FB_PTD
455       + py_za_tx_01032005.bal_TOT_TXB_TA_PTD
456       + py_za_tx_01032005.bal_BP_PTD
457       );
458    -- Ptd Annual Bonus
459    py_za_tx_01032005.trc_AnnBonPtd := py_za_tx_01032005.bal_TOT_TXB_AB_RUN;
460    -- Ytd Annual Payments
461    py_za_tx_01032005.trc_AnnPymPtd := py_za_tx_01032005.bal_TOT_TXB_AP_YTD;
462 
463    WriteHrTrace('py_za_tx_01032005.trc_TxbIncPtd: '||to_char(py_za_tx_01032005.trc_TxbIncPtd));
464    WriteHrTrace('py_za_tx_01032005.trc_AnnBonPtd: '||to_char(py_za_tx_01032005.trc_AnnBonPtd));
465    WriteHrTrace('py_za_tx_01032005.trc_AnnPymPtd: '||to_char(py_za_tx_01032005.trc_AnnPymPtd));
466 
467    -- Annual Type PTD Income with no Period Type PTD Income
468    IF (py_za_tx_01032005.trc_AnnBonPtd + py_za_tx_01032005.trc_AnnPymPtd) <> 0 AND py_za_tx_01032005.trc_TxbIncPtd <= 0 THEN
469       hr_utility.set_location('py_za_tx_utl_01032005.PreErnPeriod',1);
470       RETURN TRUE;
471    ELSE
472       hr_utility.set_location('py_za_tx_utl_01032005.PreErnPeriod',2);
473       RETURN FALSE;
474    END IF;
475 
476 EXCEPTION
477   WHEN OTHERS THEN
478     IF py_za_tx_01032005.xpt_Msg = 'No Error' THEN
479        py_za_tx_01032005.xpt_Msg := 'PreErnPeriod: '||TO_CHAR(SQLCODE);
480     END IF;
481        RAISE py_za_tx_01032005.xpt_E;
482 END PreErnPeriod;
483 -------------------------------------------------------------------------------
484 -- SitePeriod                                                                --
485 -------------------------------------------------------------------------------
486 FUNCTION SitePeriod RETURN BOOLEAN AS
487 BEGIN
488    IF LstPeriod OR EmpTermInPeriod OR EmpTermPrePeriod THEN
489       hr_utility.set_location('py_za_tx_utl_01032005.SitePeriod',1);
490       RETURN TRUE;
491    ELSE
492       hr_utility.set_location('py_za_tx_utl_01032005.SitePeriod',2);
493       RETURN FALSE;
494    END IF;
495 
496 EXCEPTION
497    WHEN OTHERS THEN
498       IF py_za_tx_01032005.xpt_Msg = 'No Error' THEN
499          py_za_tx_01032005.xpt_Msg := 'SitePeriod: '||TO_CHAR(SQLCODE);
500       END IF;
501       RAISE py_za_tx_01032005.xpt_E;
502 END SitePeriod;
503 -------------------------------------------------------------------------------
504 -- PeriodFactor                                                              --
505 -------------------------------------------------------------------------------
506 PROCEDURE PeriodFactor AS
507    ------------
508    -- Variables
509    ------------
510    l_tot_inc_ytd t_balance;
511    l_tot_inc_ptd t_balance;
512 BEGIN
513    hr_utility.set_location('py_za_tx_utl_01032005.PeriodFactor',1);
514 
515    l_tot_inc_ytd := TotPrdTxbIncYtd;
516    l_tot_inc_ptd := TotPrdTxbIncPtd;
517 
518    hr_utility.set_location('py_za_tx_utl_01032005.PeriodFactor',2);
519 
520    IF py_za_tx_01032005.dbi_ZA_TX_YR_STRT < py_za_tx_01032005.dbi_ZA_ACT_STRT_DTE THEN
521       hr_utility.set_location('py_za_tx_utl_01032005.PeriodFactor',3);
522 
523       IF l_tot_inc_ytd = l_tot_inc_ptd THEN
524          hr_utility.set_location('py_za_tx_utl_01032005.PeriodFactor',3);
525          -- i.e. first pay period for the person
526          py_za_tx_01032005.trc_PrdFactor :=
527          ( py_za_tx_01032005.dbi_ZA_CUR_PRD_END_DTE
528          - py_za_tx_01032005.dbi_ZA_ACT_STRT_DTE
529          + 1
530          )
531          /
532          ( py_za_tx_01032005.dbi_ZA_CUR_PRD_END_DTE
533          - py_za_tx_01032005.dbi_ZA_CUR_PRD_STRT_DTE
534          + 1
535          );
536       ELSE
537          hr_utility.set_location('py_za_tx_utl_01032005.PeriodFactor',5);
538          py_za_tx_01032005.trc_PrdFactor := 1;
539       END IF;
540 
541    ELSE
542       hr_utility.set_location('py_za_tx_utl_01032005.PeriodFactor',6);
543       py_za_tx_01032005.trc_PrdFactor := 1;
544    END IF;
545 
546    WriteHrTrace('dbi_ZA_TX_YR_STRT:       '
547       ||to_char(py_za_tx_01032005.dbi_ZA_TX_YR_STRT,'DD/MM/YYYY'));
548    WriteHrTrace('dbi_ZA_ACT_STRT_DTE:     '
549       ||to_char(py_za_tx_01032005.dbi_ZA_ACT_STRT_DTE,'DD/MM/YYYY'));
550    WriteHrTrace('dbi_ZA_CUR_PRD_END_DTE:  '
551       ||to_char(py_za_tx_01032005.dbi_ZA_CUR_PRD_END_DTE,'DD/MM/YYYY'));
552    WriteHrTrace('dbi_ZA_CUR_PRD_STRT_DTE: '
553       ||to_char(py_za_tx_01032005.dbi_ZA_CUR_PRD_STRT_DTE,'DD/MM/YYYY'));
554    WriteHrTrace('l_tot_inc_ytd:           '
555       ||to_char(l_tot_inc_ytd));
556    WriteHrTrace('l_tot_inc_ptd:           '
557       ||to_char(l_tot_inc_ptd));
558 
559 EXCEPTION
560    WHEN OTHERS THEN
561       IF py_za_tx_01032005.xpt_Msg = 'No Error' THEN
562          py_za_tx_01032005.xpt_Msg := 'PeriodFactor: '||TO_CHAR(SQLCODE);
563       END IF;
564       RAISE py_za_tx_01032005.xpt_E;
565 END PeriodFactor;
566 -------------------------------------------------------------------------------
567 -- PossiblePeriodsFactor                                                     --
568 -------------------------------------------------------------------------------
569 PROCEDURE PossiblePeriodsFactor AS
570 BEGIN
571    IF py_za_tx_01032005.dbi_ZA_TX_YR_STRT >= py_za_tx_01032005.dbi_ZA_ACT_STRT_DTE THEN
572       hr_utility.set_location('py_za_tx_utl_01032005.PossiblePeriodsFactor',1);
573       py_za_tx_01032005.trc_PosFactor := 1;
574    ELSE
575       IF py_za_tx_01032005.trc_PrdFactor <> 1 THEN
576          hr_utility.set_location('py_za_tx_utl_01032005.PossiblePeriodsFactor',2);
577          --
578          py_za_tx_01032005.trc_PosFactor :=
579             py_za_tx_01032005.dbi_ZA_DYS_IN_YR
580           / ( py_za_tx_01032005.dbi_ZA_TX_YR_END
581             - py_za_tx_01032005.dbi_ZA_CUR_PRD_STRT_DTE
582             + 1
583             );
584       ELSE
585          hr_utility.set_location('py_za_tx_utl_01032005.PossiblePeriodsFactor',3);
586          --
587          py_za_tx_01032005.trc_PosFactor :=
588             py_za_tx_01032005.dbi_ZA_DYS_IN_YR
589           / ( py_za_tx_01032005.dbi_ZA_TX_YR_END
590             - py_za_tx_01032005.dbi_ZA_ACT_STRT_DTE
591             + 1
592             );
593       END IF;
594    END IF;
595 EXCEPTION
596    WHEN OTHERS THEN
597       IF py_za_tx_01032005.xpt_Msg = 'No Error' THEN
598          py_za_tx_01032005.xpt_Msg := 'PossiblePeriodsFactor: '||TO_CHAR(SQLCODE);
599       END IF;
600       RAISE py_za_tx_01032005.xpt_E;
601 END PossiblePeriodsFactor;
602 -------------------------------------------------------------------------------
603 -- Annualise                                                                 --
604 -------------------------------------------------------------------------------
605 FUNCTION Annualise
606    (p_YtdInc IN NUMBER
607    ,p_PtdInc IN NUMBER
608    ) RETURN NUMBER
609 AS
610    l_AnnFig1  t_balance;
611    l_AnnFig2  t_balance;
612    l_AnnFig3  t_balance;
613    l_AnnFig4  t_balance;
614 
615 BEGIN
616    hr_utility.set_location('py_za_tx_utl_01032005.Annualise',1);
617    -- 1
618    l_AnnFig1 := p_PtdInc / py_za_tx_01032005.trc_PrdFactor;
619    -- 2
620    l_AnnFig2 := l_AnnFig1 * py_za_tx_01032005.dbi_ZA_PAY_PRDS_LFT;
621    -- 3
622    l_AnnFig3 := l_AnnFig2 + p_YtdInc - p_PtdInc;
623    -- 4
624    l_AnnFig4 := l_AnnFig3 * py_za_tx_01032005.trc_PosFactor;
625    --
626    hr_utility.set_location('py_za_tx_utl_01032005.Annualise',2);
627    --
628    WriteHrTrace('p_PtdInc:                             '||to_char(p_PtdInc));
629    WriteHrTrace('py_za_tx_01032005.trc_PrdFactor:      '||to_char(py_za_tx_01032005.trc_PrdFactor));
630    WriteHrTrace('l_AnnFig1:                            '||to_char(l_AnnFig1));
631    WriteHrTrace('py_za_tx_01032005.dbi_ZA_PAY_PRDS_LFT:'||to_char(py_za_tx_01032005.dbi_ZA_PAY_PRDS_LFT));
632    WriteHrTrace('l_AnnFig2:                            '||to_char(l_AnnFig2));
633    WriteHrTrace('p_YtdInc:                             '||to_char(p_YtdInc));
634    WriteHrTrace('p_PtdInc:                             '||to_char(p_PtdInc));
635    WriteHrTrace('l_AnnFig3:                            '||to_char(l_AnnFig3));
636    WriteHrTrace('py_za_tx_01032005.trc_PosFactor:      '||to_char(py_za_tx_01032005.trc_PosFactor));
637    WriteHrTrace('l_AnnFig4:                            '||to_char(l_AnnFig4));
638    --
639    RETURN l_AnnFig4;
640 
641 EXCEPTION
642    WHEN OTHERS THEN
643       IF py_za_tx_01032005.xpt_Msg = 'No Error' THEN
644          py_za_tx_01032005.xpt_Msg := 'Annualise: '||TO_CHAR(SQLCODE);
645       END IF;
646       RAISE py_za_tx_01032005.xpt_E;
647 END Annualise;
648 -------------------------------------------------------------------------------
649 -- SetRebates                                                                --
650 -------------------------------------------------------------------------------
651 PROCEDURE SetRebates AS
652 
653 -- Variables
654    l_65Year DATE;
655    l_EndDate per_time_periods.end_date%TYPE;
656 
657    l_ZA_TX_YR_END        DATE;
658    l_ZA_ADL_TX_RBT       t_balance;
659    l_ZA_PRI_TX_RBT       t_balance;
660    l_ZA_PRI_TX_THRSHLD   t_balance;
661    l_ZA_SC_TX_THRSHLD    t_balance;
662 
663 BEGIN
664    -- Setup the Globals
665    IF py_za_tx_01032005.trc_CalTyp = 'PstCalc' THEN
666       hr_utility.set_location('py_za_tx_utl_01032005.SetRebates',1);
667       -- Employee Tax Year Start and End Dates
668       --
669       l_EndDate  := py_za_tx_01032005.dbi_ZA_ASG_TX_YR_END;
670 
671       hr_utility.set_location('py_za_tx_utl_01032005.SetRebates',2);
672 
673       -- Global Values
674       l_ZA_TX_YR_END        := l_EndDate;
675       l_ZA_ADL_TX_RBT       := GlbVal('ZA_ADDITIONAL_TAX_REBATE',l_EndDate);
676       l_ZA_PRI_TX_RBT       := GlbVal('ZA_PRIMARY_TAX_REBATE',l_EndDate);
677       l_ZA_PRI_TX_THRSHLD   := GlbVal('ZA_PRIM_TAX_THRESHOLD',l_EndDate);
678       l_ZA_SC_TX_THRSHLD    := GlbVal('ZA_SEC_TAX_THRESHOLD',l_EndDate);
679    ELSE
680       hr_utility.set_location('py_za_tx_utl_01032005.SetRebates',3);
681       -- Set locals to current values
682       l_ZA_TX_YR_END         := py_za_tx_01032005.dbi_ZA_TX_YR_END;
683       l_ZA_ADL_TX_RBT        := py_za_tx_01032005.glb_ZA_ADL_TX_RBT;
684       l_ZA_PRI_TX_RBT        := py_za_tx_01032005.glb_ZA_PRI_TX_RBT;
685       l_ZA_PRI_TX_THRSHLD    := py_za_tx_01032005.glb_ZA_PRI_TX_THRSHLD;
686       l_ZA_SC_TX_THRSHLD     := py_za_tx_01032005.glb_ZA_SC_TX_THRSHLD;
687    END IF;
688 
689    hr_utility.set_location('py_za_tx_utl_01032005.SetRebates',4);
690 
691 -- Calculate the Rebate and Threshold Values
692    hr_utility.set_location('py_za_tx_utl_01032005.SetRebates',5);
693    -- Calculate the assignments 65 Year Date
694    l_65Year := add_months(py_za_tx_01032005.dbi_PER_DTE_OF_BRTH,780);
695 
696    IF l_65Year <= l_ZA_TX_YR_END THEN
697       hr_utility.set_location('py_za_tx_utl_01032005.SetRebates',6);
698       -- give the extra abatement
699       py_za_tx_01032005.trc_Rebate    := l_ZA_PRI_TX_RBT + l_ZA_ADL_TX_RBT;
700       py_za_tx_01032005.trc_Threshold := l_ZA_SC_TX_THRSHLD;
701    ELSE
702       hr_utility.set_location('py_za_tx_utl_01032005.SetRebates',7);
703       -- not eligable for extra abatement
704       py_za_tx_01032005.trc_Rebate    := l_ZA_PRI_TX_RBT;
705       py_za_tx_01032005.trc_Threshold := l_ZA_PRI_TX_THRSHLD;
706    END IF;
707 
708    WriteHrTrace('l_ZA_TX_YR_END:      '||to_char(l_ZA_TX_YR_END,'DD/MM/YYYY'));
709    WriteHrTrace('l_ZA_ADL_TX_RBT:     '||to_char(l_ZA_ADL_TX_RBT));
710    WriteHrTrace('l_ZA_PRI_TX_RBT:     '||to_char(l_ZA_PRI_TX_RBT));
711    WriteHrTrace('l_ZA_PRI_TX_THRSHLD: '||to_char(l_ZA_PRI_TX_THRSHLD));
712    WriteHrTrace('l_ZA_SC_TX_THRSHLD:  '||to_char(l_ZA_SC_TX_THRSHLD));
713 
714 EXCEPTION
715    WHEN OTHERS THEN
716       IF py_za_tx_01032005.xpt_Msg = 'No Error' THEN
717          py_za_tx_01032005.xpt_Msg := 'SetRebates: '||TO_CHAR(SQLCODE);
718       END IF;
719       RAISE py_za_tx_01032005.xpt_E;
720 END SetRebates;
721 -------------------------------------------------------------------------------
722 -- Abatements
723 -------------------------------------------------------------------------------
724 PROCEDURE Abatements AS
725 
726 -- Variables
727    l_65Year DATE;
728    l_EndDate per_time_periods.end_date%TYPE;
729 
730    l_ZA_TX_YR_END        DATE;
731    l_ZA_ARR_PF_AN_MX_ABT t_balance;
732    l_ZA_ARR_RA_AN_MX_ABT t_balance;
733    l_ZA_PF_AN_MX_ABT     t_balance;
734    l_ZA_PF_MX_PRC        t_balance;
735    l_ZA_RA_AN_MX_ABT     t_balance;
736    l_ZA_RA_MX_PRC        t_balance;
737 
738 ------------------------------------------------------------------------------
739 BEGIN --                      Abatements - Main                             --
740 ------------------------------------------------------------------------------
741 -- Initialise the figures needed for the calculation
742 -- of tax abatements and rebates, based on the
743 -- calculation type
744 --
745    -------------------------------------------------------------------------
746    IF py_za_tx_01032005.trc_CalTyp = 'NorCalc' THEN                       --
747    -------------------------------------------------------------------------
748    hr_utility.set_location('py_za_tx_utl_01032005.Abatements',1);
749    -------------------------
750    -- Pension Fund Abatement
751    -------------------------
752       ---------------------
753       -- Period Calculation
754       ---------------------
755       -- Annualise Period Pension Fund Contributions
756       py_za_tx_01032005.trc_PerPenFnd := Annualise
757                  (p_YtdInc => py_za_tx_01032005.bal_CUR_PF_YTD
758                  ,p_PtdInc => py_za_tx_01032005.bal_CUR_PF_PTD
759                  );
760       -- Annualise Period RFIable Contributions
761       py_za_tx_01032005.trc_PerRfiCon := Annualise
762                  (p_ytdInc => py_za_tx_01032005.bal_TOT_RFI_INC_YTD
763                  ,p_PtdInc => py_za_tx_01032005.bal_TOT_RFI_INC_PTD
764                  );
765 
766       hr_utility.set_location('py_za_tx_utl_01032005.Abatements',17);
767 
768       ---------------------
769       -- Annual Calculation
770       ---------------------
771       -- Annual Pension Fund Contribution
772       py_za_tx_01032005.trc_AnnPenFnd :=
773          py_za_tx_01032005.trc_PerPenFnd
774        + py_za_tx_01032005.bal_ANN_PF_YTD;
775       -- Annual Rfi Contribution
776       py_za_tx_01032005.trc_AnnRfiCon :=
777          py_za_tx_01032005.trc_PerRfiCon
778        + py_za_tx_01032005.bal_TOT_RFI_AN_INC_YTD;
779 
780    --------------------------------
781    -- Arrear Pension Fund Abatement
782    --------------------------------
783       hr_utility.set_location('py_za_tx_utl_01032005.Abatements',18);
784       -------------
785       -- Excess ITD
786       -------------
787       py_za_tx_01032005.trc_PerArrPenFnd :=
788          py_za_tx_01032005.bal_EXC_ARR_PEN_ITD;
789 
790       ----------
791       -- Current
792       ----------
793       py_za_tx_01032005.trc_PerArrPenFnd :=
794          py_za_tx_01032005.trc_PerArrPenFnd
795        + Annualise
796          ( p_YtdInc => py_za_tx_01032005.bal_ARR_PF_YTD
797          , p_PtdInc => py_za_tx_01032005.bal_ARR_PF_PTD
798          );
799       ---------
800       -- Annual
801       ---------
802       py_za_tx_01032005.trc_AnnArrPenFnd :=
803            py_za_tx_01032005.trc_PerArrPenFnd
804          + py_za_tx_01032005.bal_ANN_ARR_PF_YTD;
805 
806    -------------------------------
807    -- Retirement Annuity Abatement
808    -------------------------------
809       hr_utility.set_location('py_za_tx_utl_01032005.Abatements',19);
810 
811       -------------
812       -- Current RA
813       -------------
814       py_za_tx_01032005.trc_PerRetAnu :=
815          Annualise
816             ( p_YtdInc => py_za_tx_01032005.bal_CUR_RA_YTD
817             , p_PtdInc => py_za_tx_01032005.bal_CUR_RA_PTD
818             );
819       ---------------------
820       -- Current NRFI Contr
821       ---------------------
822 
823       hr_utility.set_location('py_za_tx_utl_01032005.Abatements',20);
824       py_za_tx_01032005.trc_PerNrfiCon :=
825             Annualise
826                ( p_YtdInc => py_za_tx_01032005.bal_TOT_NRFI_INC_YTD
827                , p_PtdInc => py_za_tx_01032005.bal_TOT_NRFI_INC_PTD
828                );
829 
830 
831       ------------
832       -- Annual RA
833       ------------
834       py_za_tx_01032005.trc_AnnRetAnu :=
835          py_za_tx_01032005.trc_PerRetAnu
836        + py_za_tx_01032005.bal_ANN_RA_YTD;
837 
838 
839       hr_utility.set_location('py_za_tx_utl_01032005.Abatements',21);
840       py_za_tx_01032005.trc_AnnNrfiCon :=
841             py_za_tx_01032005.trc_PerNrfiCon
842           + py_za_tx_01032005.bal_TOT_NRFI_AN_INC_YTD;
843 
844 
845    --------------------------------------
846    -- Arrear Retirement Annuity Abatement
847    --------------------------------------
848          hr_utility.set_location('py_za_tx_utl_01032005.Abatements',22);
849       -------------
850       -- Excess ITD
851       -------------
852       py_za_tx_01032005.trc_PerArrRetAnu :=
853          py_za_tx_01032005.bal_EXC_ARR_RA_ITD;
854       ----------
855       -- Current
856       ----------
857       py_za_tx_01032005.trc_PerArrRetAnu :=
858          py_za_tx_01032005.trc_PerArrRetAnu
859        + Annualise
860             ( p_YtdInc => py_za_tx_01032005.bal_ARR_RA_YTD
861             , p_PtdInc => py_za_tx_01032005.bal_ARR_RA_PTD
862             );
863       ---------
864       -- Annual
865       ---------
866       py_za_tx_01032005.trc_AnnArrRetAnu :=
867          py_za_tx_01032005.trc_PerArrRetAnu
868        + py_za_tx_01032005.bal_ANN_ARR_RA_YTD;
869 
870    ------------------------
871    -- Medical Aid Abatement
872    ------------------------
873       hr_utility.set_location('py_za_tx_utl_01032005.Abatements',23);
874       py_za_tx_01032005.trc_MedAidAbm :=
875          Annualise
876             ( p_YtdInc => py_za_tx_01032005.bal_MED_CONTR_YTD
877             , p_PtdInc => py_za_tx_01032005.bal_MED_CONTR_PTD
878             );
879 
880    ---------------------------
881    -- Income Protection Policy
882    ---------------------------
883       ---------------------
884       -- Period Calculation
885       ---------------------
886       -- Annualise Income Protection Policy Contributions
887       py_za_tx_01032005.trc_PerIncProPolAbm := Annualise
888                  (p_YtdInc => py_za_tx_01032005.bal_EE_INC_PRO_POL_YTD
889                  ,p_PtdInc => py_za_tx_01032005.bal_EE_INC_PRO_POL_PTD
890                  );
891 
892       hr_utility.set_location('py_za_tx_utl_01032005.Abatements',24);
893 
894       ---------------------
895       -- Annual Calculation
896       ---------------------
897       -- Annual Income Protection Policy Contributions
898       py_za_tx_01032005.trc_AnnIncProPolAbm :=
899          py_za_tx_01032005.trc_PerIncProPolAbm
900        + py_za_tx_01032005.bal_ANN_EE_INC_PRO_POL_YTD;
901 
902    -------------------------------------------------------------------------
903    ELSIF py_za_tx_01032005.trc_CalTyp IN ('YtdCalc','SitCalc') THEN       --
904    -------------------------------------------------------------------------
905       hr_utility.set_location('py_za_tx_utl_01032005.Abatements',25);
906    -------------------------
907    -- Pension Fund Abatement
908    -------------------------
909       ---------------------
910       -- Period Calculation
911       ---------------------
912       -- Annualise Period Pension Fund Contribution
913       py_za_tx_01032005.trc_PerPenFnd :=
914          py_za_tx_01032005.bal_CUR_PF_YTD
915        * py_za_tx_01032005.trc_SitFactor;
916       -- Annualise Period Rfiable Contributions
917       py_za_tx_01032005.trc_PerRfiCon :=
918          py_za_tx_01032005.bal_TOT_RFI_INC_YTD
919        * py_za_tx_01032005.trc_SitFactor;
920       ---------------------
921       -- Annual Calculation
922       ---------------------
923       -- Annual Pension Fund Contribution
924       py_za_tx_01032005.trc_AnnPenFnd :=
925          py_za_tx_01032005.trc_PerPenFnd
926        + py_za_tx_01032005.bal_ANN_PF_YTD;
927       -- Annual Rfi Contribution
928       py_za_tx_01032005.trc_AnnRfiCon :=
929          py_za_tx_01032005.trc_PerRfiCon
930        + py_za_tx_01032005.bal_TOT_RFI_AN_INC_YTD;
931 
932       hr_utility.set_location('py_za_tx_utl_01032005.Abatements',40);
933 
934    --------------------------------
935    -- Arrear Pension Fund Abatement
936    --------------------------------
937       hr_utility.set_location('py_za_tx_utl_01032005.Abatements',41);
938       -------------
939       -- Excess ITD
940       -------------
941       py_za_tx_01032005.trc_PerArrPenFnd :=
942          py_za_tx_01032005.bal_EXC_ARR_PEN_ITD;
943 
944       ----------
945       -- Current
946       ----------
947       py_za_tx_01032005.trc_PerArrPenFnd :=
948           py_za_tx_01032005.trc_PerArrPenFnd
949       + ( py_za_tx_01032005.bal_ARR_PF_YTD
950         * py_za_tx_01032005.trc_SitFactor
951         );
952       ---------
953       -- Annual
954       ---------
955       py_za_tx_01032005.trc_AnnArrPenFnd :=
956            py_za_tx_01032005.trc_PerArrPenFnd
957          + py_za_tx_01032005.bal_ANN_ARR_PF_YTD;
958 
959 
960    -------------------------------
961    -- Retirement Annuity Abatement
962    -------------------------------
963       hr_utility.set_location('py_za_tx_utl_01032005.Abatements',42);
964 
965       -------------
966       -- Current RA
967       -------------
968       -- Calculate RA Contribution
969       py_za_tx_01032005.trc_PerRetAnu :=
970          py_za_tx_01032005.bal_CUR_RA_YTD
971        * py_za_tx_01032005.trc_SitFactor;
972       ---------------------
973       -- Current NRFI Contr
974       ---------------------
975 
976       hr_utility.set_location('py_za_tx_utl_01032005.Abatements',43);
977       py_za_tx_01032005.trc_PerNrfiCon :=
978             py_za_tx_01032005.bal_TOT_NRFI_INC_YTD
979           * py_za_tx_01032005.trc_SitFactor;
980 
981       ------------
982       -- Annual RA
983       ------------
984       py_za_tx_01032005.trc_AnnRetAnu :=
985          py_za_tx_01032005.trc_PerRetAnu
986        + py_za_tx_01032005.bal_ANN_RA_YTD;
987 
988 
989       hr_utility.set_location('py_za_tx_utl_01032005.Abatements',44);
990       py_za_tx_01032005.trc_AnnNrfiCon :=
991             py_za_tx_01032005.trc_PerNrfiCon
992           + py_za_tx_01032005.bal_TOT_NRFI_AN_INC_YTD;
993 
994 
995    --------------------------------------
996    -- Arrear Retirement Annuity Abatement
997    --------------------------------------
998       hr_utility.set_location('py_za_tx_utl_01032005.Abatements',45);
999       -------------
1000       -- Excess ITD
1001       -------------
1002       py_za_tx_01032005.trc_PerArrRetAnu :=
1003          py_za_tx_01032005.bal_EXC_ARR_RA_ITD;
1004       ----------
1005       -- Current
1006       ----------
1007       py_za_tx_01032005.trc_PerArrRetAnu :=
1008          py_za_tx_01032005.trc_PerArrRetAnu
1009        + ( py_za_tx_01032005.bal_ARR_RA_YTD
1010          * py_za_tx_01032005.trc_SitFactor
1011          );
1012       ---------
1013       -- Annual
1014       ---------
1015       py_za_tx_01032005.trc_AnnArrRetAnu :=
1016          py_za_tx_01032005.trc_PerArrRetAnu
1017        + py_za_tx_01032005.bal_ANN_ARR_RA_YTD;
1018 
1019    ------------------------
1020    -- Medical Aid Abatement
1021    ------------------------
1022       py_za_tx_01032005.trc_MedAidAbm :=
1023          py_za_tx_01032005.bal_MED_CONTR_YTD
1024        * py_za_tx_01032005.trc_SitFactor;
1025 
1026    hr_utility.set_location('py_za_tx_utl_01032005.Abatements',46);
1027 
1028    ---------------------------
1029    -- Income Protection Policy
1030    ---------------------------
1031       ---------------------
1032       -- Period Calculation
1033       ---------------------
1034       -- Annualise Income Protection Policy Contributions
1035       py_za_tx_01032005.trc_PerIncProPolAbm :=
1036          py_za_tx_01032005.bal_EE_INC_PRO_POL_YTD
1037        * py_za_tx_01032005.trc_SitFactor;
1038 
1039       hr_utility.set_location('py_za_tx_utl_01032005.Abatements',47);
1040 
1041       ---------------------
1042       -- Annual Calculation
1043       ---------------------
1044       -- Annual Income Protection Policy Contributions
1045       py_za_tx_01032005.trc_AnnIncProPolAbm :=
1046          py_za_tx_01032005.trc_PerIncProPolAbm
1047        + py_za_tx_01032005.bal_ANN_EE_INC_PRO_POL_YTD;
1048 
1049    -------------------------------------------------------------------------
1050    ELSIF py_za_tx_01032005.trc_CalTyp = 'CalCalc' THEN                    --
1051    -------------------------------------------------------------------------
1052       hr_utility.set_location('py_za_tx_utl_01032005.Abatements',48);
1053    -------------------------
1054    -- Pension Fund Abatement
1055    -------------------------
1056       ---------------------
1057       -- Period Calculation
1058       ---------------------
1059       -- Annualise Period Pension Fund Contribution
1060       py_za_tx_01032005.trc_PerPenFnd :=
1061          py_za_tx_01032005.bal_CUR_PF_CYTD
1062        * py_za_tx_01032005.trc_SitFactor;
1063       -- Annualise Period Rfiable Contributions
1064       py_za_tx_01032005.trc_PerRfiCon :=
1065          py_za_tx_01032005.bal_TOT_RFI_INC_CYTD
1066        * py_za_tx_01032005.trc_SitFactor;
1067       ---------------------
1068       -- Annual Calculation
1069       ---------------------
1070       -- Annual Pension Fund Contribution
1071       py_za_tx_01032005.trc_AnnPenFnd :=
1072          py_za_tx_01032005.trc_PerPenFnd
1073        + py_za_tx_01032005.bal_ANN_PF_YTD;
1074       -- Annual Rfi Contribution
1075       py_za_tx_01032005.trc_AnnRfiCon :=
1076          py_za_tx_01032005.trc_PerRfiCon
1077        + py_za_tx_01032005.bal_TOT_RFI_AN_INC_YTD;
1078 
1079    --------------------------------
1080    -- Arrear Pension Fund Abatement
1081    --------------------------------
1082       hr_utility.set_location('py_za_tx_utl_01032005.Abatements',61);
1083       -------------
1084       -- Excess ITD
1085       -------------
1086       py_za_tx_01032005.trc_PerArrPenFnd :=
1087          py_za_tx_01032005.bal_EXC_ARR_PEN_ITD;
1088       ------------------------------------
1089       -- Current/Annual based on frequency
1090       ------------------------------------
1091       py_za_tx_01032005.trc_PerArrPenFnd :=
1092           py_za_tx_01032005.trc_PerArrPenFnd
1093       + ( py_za_tx_01032005.bal_ARR_PF_CYTD
1094         * py_za_tx_01032005.trc_SitFactor
1095         );
1096       ---------
1097       -- Annual
1098       ---------
1099       py_za_tx_01032005.trc_AnnArrPenFnd :=
1100            py_za_tx_01032005.trc_PerArrPenFnd
1101          + py_za_tx_01032005.bal_ANN_ARR_PF_YTD;
1102 
1103    -------------------------------
1104    -- Retirement Annuity Abatement
1105    -------------------------------
1106       hr_utility.set_location('py_za_tx_utl_01032005.Abatements',62);
1107 
1108       -------------
1109       -- Current RA
1110       -------------
1111       -- Calculate RA Contribution
1112       py_za_tx_01032005.trc_PerRetAnu :=
1113          py_za_tx_01032005.bal_CUR_RA_CYTD
1114        * py_za_tx_01032005.trc_SitFactor;
1115       ---------------------
1116       -- Current NRFI Contr
1117       ---------------------
1118 
1119       hr_utility.set_location('py_za_tx_utl_01032005.Abatements',63);
1120       py_za_tx_01032005.trc_PerNrfiCon :=
1121             py_za_tx_01032005.bal_TOT_NRFI_INC_CYTD
1122           * py_za_tx_01032005.trc_SitFactor;
1123 
1124       ------------
1125       -- Annual RA
1126       ------------
1127       py_za_tx_01032005.trc_AnnRetAnu :=
1128          py_za_tx_01032005.trc_PerRetAnu
1129        + py_za_tx_01032005.bal_ANN_RA_YTD;
1130 
1131 
1132       hr_utility.set_location('py_za_tx_utl_01032005.Abatements',64);
1133       py_za_tx_01032005.trc_AnnNrfiCon :=
1134             py_za_tx_01032005.trc_PerNrfiCon
1135           + py_za_tx_01032005.bal_TOT_NRFI_AN_INC_YTD;
1136 
1137 
1138    --------------------------------------
1139    -- Arrear Retirement Annuity Abatement
1140    --------------------------------------
1141       hr_utility.set_location('py_za_tx_utl_01032005.Abatements',65);
1142       -------------
1143       -- Excess ITD
1144       -------------
1145       py_za_tx_01032005.trc_PerArrRetAnu := py_za_tx_01032005.bal_EXC_ARR_RA_ITD;
1146       ----------
1147       -- Current
1148       ----------
1149       py_za_tx_01032005.trc_PerArrRetAnu :=
1150          py_za_tx_01032005.trc_PerArrRetAnu
1151        + ( py_za_tx_01032005.bal_ARR_RA_CYTD
1152          * py_za_tx_01032005.trc_SitFactor
1153          );
1154       ---------
1155       -- Annual
1156       ---------
1157       py_za_tx_01032005.trc_AnnArrRetAnu :=
1158          py_za_tx_01032005.trc_PerArrRetAnu
1159        + py_za_tx_01032005.bal_ANN_ARR_RA_YTD;
1160 
1161    ------------------------
1162    -- Medical Aid Abatement
1163    ------------------------
1164       py_za_tx_01032005.trc_MedAidAbm :=
1165          py_za_tx_01032005.bal_MED_CONTR_CYTD
1166        * py_za_tx_01032005.trc_SitFactor;
1167 
1168    ---------------------------
1169    -- Income Protection Policy
1170    ---------------------------
1171       ---------------------
1172       -- Period Calculation
1173       ---------------------
1174       -- Annualise Income Protection Policy Contributions
1175       py_za_tx_01032005.trc_PerIncProPolAbm :=
1176          py_za_tx_01032005.bal_EE_INC_PRO_POL_CYTD
1177        * py_za_tx_01032005.trc_SitFactor;
1178 
1179       hr_utility.set_location('py_za_tx_utl_01032005.Abatements',66);
1180 
1181       ---------------------
1182       -- Annual Calculation
1183       ---------------------
1184       -- Annual Income Protection Policy Contributions
1185       py_za_tx_01032005.trc_AnnIncProPolAbm :=
1186          py_za_tx_01032005.trc_PerIncProPolAbm
1187        + py_za_tx_01032005.bal_ANN_EE_INC_PRO_POL_YTD;
1188 
1189    -------------------------------------------------------------------------
1190    ELSIF py_za_tx_01032005.trc_CalTyp IN ('BasCalc') THEN       --
1191    -------------------------------------------------------------------------
1192       hr_utility.set_location('py_za_tx_utl_01032005.Abatements',67);
1193    -------------------------
1194    -- Pension Fund Abatement
1195    -------------------------
1196       ---------------------
1197       -- Annual Calculation
1198       ---------------------
1199       -- Annual Pension Fund Contribution
1200       py_za_tx_01032005.trc_AnnPenFnd := py_za_tx_01032005.bal_ANN_PF_YTD;
1201       -- Annual Rfi Contribution
1202       py_za_tx_01032005.trc_AnnRfiCon := py_za_tx_01032005.bal_TOT_RFI_AN_INC_YTD;
1203 
1204       hr_utility.set_location('py_za_tx_utl_01032005.Abatements',78);
1205 
1206    --------------------------------
1207    -- Arrear Pension Fund Abatement
1208    --------------------------------
1209       hr_utility.set_location('py_za_tx_utl_01032005.Abatements',79);
1210       -------------
1211       -- Excess ITD
1212       -------------
1213       py_za_tx_01032005.trc_PerArrPenFnd := py_za_tx_01032005.bal_EXC_ARR_PEN_ITD;
1214 
1215       ---------
1216       -- Annual
1217       ---------
1218       py_za_tx_01032005.trc_AnnArrPenFnd := py_za_tx_01032005.trc_PerArrPenFnd
1219                                           + py_za_tx_01032005.bal_ANN_ARR_PF_YTD;
1220 
1221 
1222    -------------------------------
1223    -- Retirement Annuity Abatement
1224    -------------------------------
1225       hr_utility.set_location('py_za_tx_utl_01032005.Abatements',80);
1226 
1227       ------------
1228       -- Annual RA
1229       ------------
1230       py_za_tx_01032005.trc_AnnRetAnu := py_za_tx_01032005.bal_ANN_RA_YTD;
1231 
1232       hr_utility.set_location('py_za_tx_utl_01032005.Abatements',81);
1233       py_za_tx_01032005.trc_AnnNrfiCon := py_za_tx_01032005.bal_TOT_NRFI_AN_INC_YTD;
1234 
1235 
1236    --------------------------------------
1237    -- Arrear Retirement Annuity Abatement
1238    --------------------------------------
1239       hr_utility.set_location('py_za_tx_utl_01032005.Abatements',82);
1240       -------------
1241       -- Excess ITD
1242       -------------
1243       py_za_tx_01032005.trc_PerArrRetAnu := py_za_tx_01032005.bal_EXC_ARR_RA_ITD;
1244 
1245       ---------
1246       -- Annual
1247       ---------
1248       py_za_tx_01032005.trc_AnnArrRetAnu := py_za_tx_01032005.trc_PerArrRetAnu
1249                                           + py_za_tx_01032005.bal_ANN_ARR_RA_YTD;
1250 
1251    ------------------------
1252    -- Medical Aid Abatement
1253    ------------------------
1254       py_za_tx_01032005.trc_MedAidAbm := 0;
1255 
1256    hr_utility.set_location('py_za_tx_utl_01032005.Abatements',83);
1257 
1258 
1259    ---------------------------
1260    -- Income Protection Policy
1261    ---------------------------
1262       ---------------------
1263       -- Annual Calculation
1264       ---------------------
1265       -- Annual Income Protection Policy Contributions
1266       py_za_tx_01032005.trc_AnnIncProPolAbm :=
1267          py_za_tx_01032005.bal_ANN_EE_INC_PRO_POL_YTD;
1268 
1269    -------------------------------------------------------------------------
1270    ELSIF py_za_tx_01032005.trc_CalTyp = 'SeaCalc' THEN                    --
1271    -------------------------------------------------------------------------
1272       hr_utility.set_location('py_za_tx_utl_01032005.Abatements',84);
1273    -------------------------
1274    -- Pension Fund Abatement
1275    -------------------------
1276       ---------------------
1277       -- Period Calculation
1278       ---------------------
1279       -- Annualise Period Pension Fund Contribution
1280       py_za_tx_01032005.trc_PerPenFnd :=
1281          py_za_tx_01032005.bal_CUR_PF_RUN
1282        * py_za_tx_01032005.trc_SitFactor;
1283       -- Annualise Period Rfiable Contributions
1284       py_za_tx_01032005.trc_PerRfiCon :=
1285          py_za_tx_01032005.bal_TOT_RFI_INC_RUN
1286        * py_za_tx_01032005.trc_SitFactor;
1287       ---------------------
1288       -- Annual Calculation
1289       ---------------------
1290       -- Annual Pension Fund Contribution
1291       py_za_tx_01032005.trc_AnnPenFnd :=
1292          py_za_tx_01032005.trc_PerPenFnd
1293        + py_za_tx_01032005.bal_ANN_PF_RUN;
1294       -- Annual Rfi Contribution
1295       py_za_tx_01032005.trc_AnnRfiCon :=
1296          py_za_tx_01032005.trc_PerRfiCon
1297        + py_za_tx_01032005.bal_TOT_RFI_AN_INC_RUN;
1298 
1299    --------------------------------
1300    -- Arrear Pension Fund Abatement
1301    --------------------------------
1302       py_za_tx_01032005.trc_PerArrPenFnd := 0;
1303       py_za_tx_01032005.trc_AnnArrPenFnd := 0;
1304 
1305    -------------------------------
1306    -- Retirement Annuity Abatement
1307    -------------------------------
1308       hr_utility.set_location('py_za_tx_utl_01032005.Abatements',85);
1309 
1310       -------------
1311       -- Current RA
1312       -------------
1313       -- Calculate RA Contribution
1314       py_za_tx_01032005.trc_PerRetAnu :=
1315          py_za_tx_01032005.bal_CUR_RA_RUN
1316        * py_za_tx_01032005.trc_SitFactor;
1317       ---------------------
1318       -- Current NRFI Contr
1319       ---------------------
1320 
1321       hr_utility.set_location('py_za_tx_utl_01032005.Abatements',86);
1322       py_za_tx_01032005.trc_PerNrfiCon :=
1323             py_za_tx_01032005.bal_TOT_NRFI_INC_RUN
1324           * py_za_tx_01032005.trc_SitFactor;
1325 
1326 
1327       ------------
1328       -- Annual RA
1329       ------------
1330       py_za_tx_01032005.trc_AnnRetAnu :=
1331          py_za_tx_01032005.trc_PerRetAnu
1332        + py_za_tx_01032005.bal_ANN_RA_RUN;
1333 
1334 
1335       hr_utility.set_location('py_za_tx_utl_01032005.Abatements',87);
1336       py_za_tx_01032005.trc_AnnNrfiCon :=
1337             py_za_tx_01032005.trc_PerNrfiCon
1338           + py_za_tx_01032005.bal_TOT_NRFI_AN_INC_RUN;
1339 
1340 
1341    ----------------------------
1342    -- Arrear Retirement Annuity
1343    ----------------------------
1344       py_za_tx_01032005.trc_PerArrRetAnu := 0;
1345       py_za_tx_01032005.trc_AnnArrRetAnu := 0;
1346 
1347    ------------------------
1348    -- Medical Aid Abatement
1349    ------------------------
1350       py_za_tx_01032005.trc_MedAidAbm :=
1351          py_za_tx_01032005.bal_MED_CONTR_RUN
1352        * py_za_tx_01032005.trc_SitFactor;
1353 
1354    ---------------------------
1355    -- Income Protection Policy
1356    ---------------------------
1357       ---------------------
1358       -- Period Calculation
1359       ---------------------
1360       -- Annualise Income Protection Policy Contributions
1361       py_za_tx_01032005.trc_PerIncProPolAbm :=
1362          py_za_tx_01032005.bal_EE_INC_PRO_POL_RUN
1363        * py_za_tx_01032005.trc_SitFactor;
1364 
1365       hr_utility.set_location('py_za_tx_utl_01032005.Abatements',88);
1366 
1367       ---------------------
1368       -- Annual Calculation
1369       ---------------------
1370       -- Annual Income Protection Policy Contributions
1371       py_za_tx_01032005.trc_AnnIncProPolAbm :=
1372          py_za_tx_01032005.trc_PerIncProPolAbm
1373        + py_za_tx_01032005.bal_ANN_EE_INC_PRO_POL_RUN;
1374 
1375    -------------------------------------------------------------------------
1376    ELSIF py_za_tx_01032005.trc_CalTyp = 'LteCalc' THEN                    --
1377    -------------------------------------------------------------------------
1378       hr_utility.set_location('py_za_tx_utl_01032005.Abatements',89);
1379    -------------------------
1380    -- Pension Fund Abatement
1381    -------------------------
1382       ---------------------
1383       -- Period Calculation
1384       ---------------------
1385       -- Annualise Period Pension Fund Contribution
1386       py_za_tx_01032005.trc_PerPenFnd :=
1387          py_za_tx_01032005.bal_CUR_PF_YTD;
1388       -- Annualise Period Rfiable Contributions
1389       py_za_tx_01032005.trc_PerRfiCon :=
1390          py_za_tx_01032005.bal_TOT_RFI_INC_YTD;
1391       ---------------------
1392       -- Annual Calculation
1393       ---------------------
1394       -- Annual Pension Fund Contribution
1395       py_za_tx_01032005.trc_AnnPenFnd :=
1396          py_za_tx_01032005.trc_PerPenFnd
1397        + py_za_tx_01032005.bal_ANN_PF_YTD;
1398       -- Annual Rfi Contribution
1399       py_za_tx_01032005.trc_AnnRfiCon :=
1400          py_za_tx_01032005.trc_PerRfiCon
1401        + py_za_tx_01032005.bal_TOT_RFI_AN_INC_YTD;
1402 
1403    --------------------------------
1404    -- Arrear Pension Fund Abatement
1405    --------------------------------
1406       hr_utility.set_location('py_za_tx_utl_01032005.Abatements',104);
1407       -------------
1408       -- Excess ITD
1409       -------------
1410       py_za_tx_01032005.trc_PerArrPenFnd :=
1411          py_za_tx_01032005.bal_EXC_ARR_PEN_ITD;
1412       ----------
1413       -- Current
1414       ----------
1415       py_za_tx_01032005.trc_PerArrPenFnd :=
1416          py_za_tx_01032005.trc_PerArrPenFnd
1417        + py_za_tx_01032005.bal_ARR_PF_YTD;
1418        ---------
1419        -- Annual
1420        ---------
1421        py_za_tx_01032005.trc_AnnArrPenFnd :=
1422           py_za_tx_01032005.trc_PerArrPenFnd
1423         + py_za_tx_01032005.bal_ANN_ARR_PF_YTD;
1424 
1425    -------------------------------
1426    -- Retirement Annuity Abatement
1427    -------------------------------
1428       hr_utility.set_location('py_za_tx_utl_01032005.Abatements',105);
1429       -------------
1430       -- Current RA
1431       -------------
1432       hr_utility.set_location('py_za_tx_utl_01032005.Abatements',106);
1433       -- Calculate RA Contribution
1434       py_za_tx_01032005.trc_PerRetAnu :=
1435          py_za_tx_01032005.bal_CUR_RA_YTD;
1436       ---------------------
1437       -- Current NRFI Contr
1438       ---------------------
1439 
1440       hr_utility.set_location('py_za_tx_utl_01032005.Abatements',107);
1441       py_za_tx_01032005.trc_PerNrfiCon :=
1442             py_za_tx_01032005.bal_TOT_NRFI_INC_YTD;
1443 
1444 
1445       ------------
1446       -- Annual RA
1447       ------------
1448       py_za_tx_01032005.trc_AnnRetAnu :=
1449          py_za_tx_01032005.trc_PerRetAnu
1450        + py_za_tx_01032005.bal_ANN_RA_YTD;
1451 
1452 
1453       hr_utility.set_location('py_za_tx_utl_01032005.Abatements',108);
1454       py_za_tx_01032005.trc_AnnNrfiCon :=
1455             py_za_tx_01032005.trc_PerNrfiCon
1456           + py_za_tx_01032005.bal_TOT_NRFI_AN_INC_YTD;
1457 
1458 
1459    --------------------------------------
1460    -- Arrear Retirement Annuity Abatement
1461    --------------------------------------
1462       hr_utility.set_location('py_za_tx_utl_01032005.Abatements',109);
1463       -------------
1464       -- Excess ITD
1465       -------------
1466       py_za_tx_01032005.trc_PerArrRetAnu :=
1467          py_za_tx_01032005.bal_EXC_ARR_RA_ITD;
1468       ----------
1469       -- Current
1470       ----------
1471       py_za_tx_01032005.trc_PerArrRetAnu :=
1472          py_za_tx_01032005.trc_PerArrRetAnu
1473        + py_za_tx_01032005.bal_ARR_RA_YTD;
1474       ---------
1475       -- Annual
1476       ---------
1477       py_za_tx_01032005.trc_AnnArrRetAnu :=
1478          py_za_tx_01032005.trc_PerArrRetAnu
1479        + py_za_tx_01032005.bal_ANN_ARR_RA_YTD;
1480 
1481    ------------------------
1482    -- Medical Aid Abatement
1483    ------------------------
1484       py_za_tx_01032005.trc_MedAidAbm :=
1485          py_za_tx_01032005.bal_MED_CONTR_YTD;
1486 
1487    ---------------------------
1488    -- Income Protection Policy
1489    ---------------------------
1490       ---------------------
1491       -- Period Calculation
1492       ---------------------
1493       -- Annualise Income Protection Policy Contributions
1494       py_za_tx_01032005.trc_PerIncProPolAbm :=
1495          py_za_tx_01032005.bal_EE_INC_PRO_POL_YTD;
1496 
1497       hr_utility.set_location('py_za_tx_utl_01032005.Abatements',110);
1498 
1499       ---------------------
1500       -- Annual Calculation
1501       ---------------------
1502       -- Annual Income Protection Policy Contributions
1503       py_za_tx_01032005.trc_AnnIncProPolAbm :=
1504          py_za_tx_01032005.trc_PerIncProPolAbm
1505        + py_za_tx_01032005.bal_ANN_EE_INC_PRO_POL_YTD;
1506 
1507    -------------------------------------------------------------------------
1508    ELSIF py_za_tx_01032005.trc_CalTyp = 'PstCalc' THEN                    --
1509    -------------------------------------------------------------------------
1510       hr_utility.set_location('py_za_tx_utl_01032005.Abatements',111);
1511    -------------------------
1512    -- Pension Fund Abatement
1513    -------------------------
1514       ---------------------
1515       -- Period Calculation
1516       ---------------------
1517       -- Annualise Period Pension Fund Contribution
1518       py_za_tx_01032005.trc_PerPenFnd :=
1519          py_za_tx_01032005.bal_CUR_PF_PTD
1520        * py_za_tx_01032005.trc_SitFactor;
1521       -- Annualise Period Rfiable Contributions
1522       py_za_tx_01032005.trc_PerRfiCon :=
1523          py_za_tx_01032005.bal_TOT_RFI_INC_PTD
1524        * py_za_tx_01032005.trc_SitFactor;
1525       ---------------------
1526       -- Annual Calculation
1527       ---------------------
1528       -- Annual Pension Fund Contribution
1529       py_za_tx_01032005.trc_AnnPenFnd :=
1530          py_za_tx_01032005.trc_PerPenFnd
1531        + py_za_tx_01032005.bal_ANN_PF_PTD;
1532       -- Annual Rfi Contribution
1533       py_za_tx_01032005.trc_AnnRfiCon :=
1534          py_za_tx_01032005.trc_PerRfiCon
1535        + py_za_tx_01032005.bal_TOT_RFI_AN_INC_PTD;
1536 
1537    --------------------------------
1538    -- Arrear Pension Fund Abatement
1539    --------------------------------
1540       hr_utility.set_location('py_za_tx_utl_01032005.Abatements',118);
1541       -------------
1542       -- Excess ITD
1543       -------------
1544       py_za_tx_01032005.trc_PerArrPenFnd :=
1545          py_za_tx_01032005.bal_EXC_ARR_PEN_PTD;
1546       ----------
1547       -- Current
1548       ----------
1549       py_za_tx_01032005.trc_PerArrPenFnd :=
1550           py_za_tx_01032005.trc_PerArrPenFnd
1551       + ( py_za_tx_01032005.bal_ARR_PF_PTD
1552         * py_za_tx_01032005.trc_SitFactor
1553         );
1554       ---------
1555       -- Annual
1556       ---------
1557       py_za_tx_01032005.trc_AnnArrPenFnd :=
1558          py_za_tx_01032005.trc_PerArrPenFnd
1559        + py_za_tx_01032005.bal_ANN_ARR_PF_PTD;
1560 
1561    -------------------------------
1562    -- Retirement Annuity Abatement
1563    -------------------------------
1564       hr_utility.set_location('py_za_tx_utl_01032005.Abatements',119);
1565 
1566       -------------
1567       -- Current RA
1568       -------------
1569       -- Calculate RA Contribution
1570       py_za_tx_01032005.trc_PerRetAnu :=
1571          py_za_tx_01032005.bal_CUR_RA_PTD
1572        * py_za_tx_01032005.trc_SitFactor;
1573       ---------------------
1574       -- Current NRFI Contr
1575       ---------------------
1576 
1577       hr_utility.set_location('py_za_tx_utl_01032005.Abatements',120);
1578       py_za_tx_01032005.trc_PerNrfiCon :=
1579             py_za_tx_01032005.bal_TOT_NRFI_INC_PTD
1580           * py_za_tx_01032005.trc_SitFactor;
1581 
1582 
1583       ------------
1584       -- Annual RA
1585       ------------
1586       py_za_tx_01032005.trc_AnnRetAnu :=
1587          py_za_tx_01032005.trc_PerRetAnu
1588        + py_za_tx_01032005.bal_ANN_RA_PTD;
1589 
1590 
1591       hr_utility.set_location('py_za_tx_utl_01032005.Abatements',121);
1592       py_za_tx_01032005.trc_AnnNrfiCon :=
1593             py_za_tx_01032005.trc_PerNrfiCon
1594           + py_za_tx_01032005.bal_TOT_NRFI_AN_INC_PTD;
1595 
1596 
1597    --------------------------------------
1598    -- Arrear Retirement Annuity Abatement
1599    --------------------------------------
1600       hr_utility.set_location('py_za_tx_utl_01032005.Abatements',122);
1601       -------------
1602       -- Excess ITD
1603       -------------
1604       py_za_tx_01032005.trc_PerArrRetAnu :=
1605          py_za_tx_01032005.bal_EXC_ARR_RA_PTD;
1606       ----------
1607       -- Current
1608       ----------
1609       py_za_tx_01032005.trc_PerArrRetAnu :=
1610          py_za_tx_01032005.trc_PerArrRetAnu
1611        + ( py_za_tx_01032005.bal_ARR_RA_PTD
1612          * py_za_tx_01032005.trc_SitFactor
1613          );
1614       ---------
1615       -- Annual
1616       ---------
1617       py_za_tx_01032005.trc_AnnArrRetAnu :=
1618          py_za_tx_01032005.trc_PerArrRetAnu
1619        + py_za_tx_01032005.trc_AnnArrRetAnu
1620        + py_za_tx_01032005.bal_ANN_ARR_RA_PTD;
1621 
1622    ------------------------
1623    -- Medical Aid Abatement
1624    ------------------------
1625       py_za_tx_01032005.trc_MedAidAbm :=
1626          py_za_tx_01032005.bal_MED_CONTR_PTD
1627        * py_za_tx_01032005.trc_SitFactor;
1628    ---------------------------
1629    -- Income Protection Policy
1630    ---------------------------
1631       ---------------------
1632       -- Period Calculation
1633       ---------------------
1634       -- Annualise Income Protection Policy Contributions
1635       py_za_tx_01032005.trc_PerIncProPolAbm :=
1636          py_za_tx_01032005.bal_EE_INC_PRO_POL_PTD
1637        * py_za_tx_01032005.trc_SitFactor;
1638 
1639       hr_utility.set_location('py_za_tx_utl_01032005.Abatements',123);
1640 
1641       ---------------------
1642       -- Annual Calculation
1643       ---------------------
1644       -- Annual Income Protection Policy Contributions
1645       py_za_tx_01032005.trc_AnnIncProPolAbm :=
1646          py_za_tx_01032005.trc_PerIncProPolAbm
1647        + py_za_tx_01032005.bal_ANN_EE_INC_PRO_POL_PTD;
1648 
1649    -------------------------------------------------------------------------
1650    END IF;--                End CalcTyp Check
1651    -------------------------------------------------------------------------
1652 
1653 
1654 ----------------------------------------------------------------------------
1655 --                        CALCULATE THE ABATEMENTS                        --
1656 ----------------------------------------------------------------------------
1657    hr_utility.set_location('py_za_tx_utl_01032005.Abatements',124);
1658    -- Check the Calculation Type
1659    IF py_za_tx_01032005.trc_CalTyp = 'PstCalc' THEN
1660       hr_utility.set_location('py_za_tx_utl_01032005.Abatements',125);
1661       -- Employee Tax Year Start and End Dates
1662       --
1663       l_EndDate  := py_za_tx_01032005.dbi_ZA_ASG_TX_YR_END;
1664 
1665       hr_utility.set_location('py_za_tx_utl_01032005.Abatements',126);
1666 
1667       -- Global Values
1668       l_ZA_TX_YR_END        := l_EndDate;
1669       l_ZA_ARR_PF_AN_MX_ABT := GlbVal('ZA_ARREAR_PEN_AN_MAX_ABATE',l_EndDate);
1670       l_ZA_ARR_RA_AN_MX_ABT := GlbVal('ZA_ARREAR_RA_AN_MAX_ABATE' ,l_EndDate);
1671       l_ZA_PF_AN_MX_ABT     := GlbVal('ZA_PEN_AN_MAX_ABATE'       ,l_EndDate);
1672       l_ZA_PF_MX_PRC        := GlbVal('ZA_PEN_MAX_PERC'           ,l_EndDate);
1673       l_ZA_RA_AN_MX_ABT     := GlbVal('ZA_RA_AN_MAX_ABATE'        ,l_EndDate);
1674       l_ZA_RA_MX_PRC        := GlbVal('ZA_RA_MAX_PERC'            ,l_EndDate);
1675 
1676    ELSE
1677       hr_utility.set_location('py_za_tx_utl_01032005.Abatements',127);
1678       -- Set locals to current values
1679       l_ZA_TX_YR_END         := py_za_tx_01032005.dbi_ZA_TX_YR_END;
1680       l_ZA_ARR_PF_AN_MX_ABT  := py_za_tx_01032005.glb_ZA_ARR_PF_AN_MX_ABT;
1681       l_ZA_ARR_RA_AN_MX_ABT  := py_za_tx_01032005.glb_ZA_ARR_RA_AN_MX_ABT;
1682       l_ZA_PF_AN_MX_ABT      := py_za_tx_01032005.glb_ZA_PF_AN_MX_ABT;
1683       l_ZA_PF_MX_PRC         := py_za_tx_01032005.glb_ZA_PF_MX_PRC;
1684       l_ZA_RA_AN_MX_ABT      := py_za_tx_01032005.glb_ZA_RA_AN_MX_ABT;
1685       l_ZA_RA_MX_PRC         := py_za_tx_01032005.glb_ZA_RA_MX_PRC;
1686 
1687    END IF;
1688 
1689    WriteHrTrace('l_ZA_TX_YR_END:        '||to_char(l_ZA_TX_YR_END,'DD/MM/YYYY'));
1690    WriteHrTrace('l_ZA_ARR_PF_AN_MX_ABT: '||to_char(l_ZA_ARR_PF_AN_MX_ABT      ));
1691    WriteHrTrace('l_ZA_ARR_RA_AN_MX_ABT: '||to_char(l_ZA_ARR_RA_AN_MX_ABT      ));
1692    WriteHrTrace('l_ZA_PF_AN_MX_ABT:     '||to_char(l_ZA_PF_AN_MX_ABT          ));
1693    WriteHrTrace('l_ZA_PF_MX_PRC:        '||to_char(l_ZA_PF_MX_PRC             ));
1694    WriteHrTrace('l_ZA_RA_AN_MX_ABT:     '||to_char(l_ZA_RA_AN_MX_ABT          ));
1695    WriteHrTrace('l_ZA_RA_MX_PRC:        '||to_char(l_ZA_RA_MX_PRC             ));
1696 
1697 -------------------------
1698 -- Pension Fund Abatement
1699 -------------------------
1700    ---------------------
1701    -- Period Calculation
1702    ---------------------
1703    -- Calculate the Pension Fund Maximum
1704    py_za_tx_01032005.trc_PerPenFndMax :=
1705       GREATEST( l_ZA_PF_AN_MX_ABT
1706               , l_ZA_PF_MX_PRC / 100 * py_za_tx_01032005.trc_PerRfiCon
1707               );
1708    -- Calculate Period Pension Fund Abatement
1709    py_za_tx_01032005.trc_PerPenFndAbm :=
1710       LEAST( py_za_tx_01032005.trc_PerPenFnd
1711            , py_za_tx_01032005.trc_PerPenFndMax);
1712    ---------------------
1713    -- Annual Calculation
1714    ---------------------
1715    -- Calculate the Pension Fund Maximum
1716    py_za_tx_01032005.trc_AnnPenFndMax :=
1717       GREATEST( l_ZA_PF_AN_MX_ABT
1718               , l_ZA_PF_MX_PRC / 100 * py_za_tx_01032005.trc_AnnRfiCon
1719               );
1720 
1721    -- Calculate Annual Pension Fund Abatement
1722    py_za_tx_01032005.trc_AnnPenFndAbm :=
1723       LEAST( py_za_tx_01032005.trc_AnnPenFnd
1724            , py_za_tx_01032005.trc_AnnPenFndMax);
1725 --------------------------------
1726 -- Arrear Pension Fund Abatement
1727 --------------------------------
1728    ---------------------
1729    -- Period Calculation
1730    ---------------------
1731    py_za_tx_01032005.trc_PerArrPenFndAbm :=
1732       LEAST( py_za_tx_01032005.trc_PerArrPenFnd
1733            , l_ZA_ARR_PF_AN_MX_ABT
1734            );
1735    ---------------------
1736    -- Annual Calculation
1737    ---------------------
1738    py_za_tx_01032005.trc_AnnArrPenFndAbm :=
1739       LEAST( py_za_tx_01032005.trc_AnnArrPenFnd
1740            , l_ZA_ARR_PF_AN_MX_ABT
1741            );
1742 ---------------------------------
1743 -- Retirement Annnnuity Abatement
1744 ---------------------------------
1745    ---------------------
1746    -- Period Calculation
1747    ---------------------
1748    -- Calculate the Retirement Annuity Maximum
1749    py_za_tx_01032005.trc_PerRetAnuMax :=
1750       GREATEST( l_ZA_PF_AN_MX_ABT
1751               , l_ZA_RA_AN_MX_ABT - py_za_tx_01032005.trc_PerPenFndAbm
1752               , l_ZA_RA_MX_PRC / 100 * py_za_tx_01032005.trc_PerNrfiCon
1753               );
1754 
1755    -- Calculate Retirement Annuity Abatement
1756    py_za_tx_01032005.trc_PerRetAnuAbm :=
1757       LEAST( py_za_tx_01032005.trc_PerRetAnu
1758            , py_za_tx_01032005.trc_PerRetAnuMax);
1759    ---------------------
1760    -- Annual Calculation
1761    ---------------------
1762    py_za_tx_01032005.trc_AnnRetAnuMax :=
1763       GREATEST( l_ZA_PF_AN_MX_ABT
1764               , l_ZA_RA_AN_MX_ABT - py_za_tx_01032005.trc_AnnPenFndAbm
1765               , l_ZA_RA_MX_PRC / 100 * py_za_tx_01032005.trc_AnnNrfiCon
1766               );
1767 
1768    -- Calculate Retirement Annuity Abatement
1769    py_za_tx_01032005.trc_AnnRetAnuAbm :=
1770       LEAST( py_za_tx_01032005.trc_AnnRetAnu
1771            , py_za_tx_01032005.trc_AnnRetAnuMax);
1772 --------------------------------------
1773 -- Arrear Retirement Annuity Abatement
1774 --------------------------------------
1775    ---------------------
1776    -- Period Calculation
1777    ---------------------
1778    py_za_tx_01032005.trc_PerArrRetAnuAbm :=
1779       LEAST( py_za_tx_01032005.trc_PerArrRetAnu
1780            , l_ZA_ARR_RA_AN_MX_ABT);
1781    ---------------------
1782    -- Annual Calculation
1783    ---------------------
1784    py_za_tx_01032005.trc_AnnArrRetAnuAbm :=
1785       LEAST( py_za_tx_01032005.trc_AnnArrRetAnu
1786            , l_ZA_ARR_RA_AN_MX_ABT);
1787 
1788 -----------------------------------------------------------
1789 -- Tax Rebates, Threshold Figure and Medical Aid Abatements
1790 -----------------------------------------------------------
1791    -- Calculate the assignments 65 Year Date
1792    l_65Year := add_months(py_za_tx_01032005.dbi_PER_DTE_OF_BRTH,780);
1793 
1794    IF l_65Year > l_ZA_TX_YR_END THEN
1795       py_za_tx_01032005.trc_MedAidAbm := 0;
1796    END IF;
1797 
1798    hr_utility.set_location('py_za_tx_utl_01032005.Abatements',128);
1799 
1800 -------------------
1801 -- Total Abatements
1802 -------------------
1803    -- Period Total Abatement
1804    py_za_tx_01032005.trc_PerTotAbm := ( py_za_tx_01032005.trc_PerPenFndAbm
1805                                       + py_za_tx_01032005.trc_PerArrPenFndAbm
1806                                       + py_za_tx_01032005.trc_PerRetAnuAbm
1807                                       + py_za_tx_01032005.trc_PerArrRetAnuAbm
1808                                       + py_za_tx_01032005.trc_MedAidAbm
1809                                       + py_za_tx_01032005.trc_PerIncProPolAbm
1810                                       );
1811 
1812    -- Annual Total Abatements
1813    py_za_tx_01032005.trc_AnnTotAbm := ( py_za_tx_01032005.trc_AnnPenFndAbm
1814                                       + py_za_tx_01032005.trc_AnnArrPenFndAbm
1815                                       + py_za_tx_01032005.trc_AnnRetAnuAbm
1816                                       + py_za_tx_01032005.trc_AnnArrRetAnuAbm
1817                                       + py_za_tx_01032005.trc_MedAidAbm
1818                                       + py_za_tx_01032005.trc_AnnIncProPolAbm
1819                                       );
1820 
1821 
1822    WriteHrTrace('py_za_tx_01032005.trc_PerTotAbm:            '||to_char(py_za_tx_01032005.trc_PerTotAbm      ));
1823    WriteHrTrace('trc_PerTotAbm consists of:');
1824    WriteHrTrace('py_za_tx_01032005.trc_PerPenFndAbm:         '||to_char(py_za_tx_01032005.trc_PerPenFndAbm   ));
1825    WriteHrTrace('py_za_tx_01032005.trc_PerArrPenFndAbm:      '||to_char(py_za_tx_01032005.trc_PerArrPenFndAbm));
1826    WriteHrTrace('py_za_tx_01032005.trc_PerRetAnuAbm:         '||to_char(py_za_tx_01032005.trc_PerRetAnuAbm   ));
1827    WriteHrTrace('py_za_tx_01032005.trc_PerArrRetAnuAbm:      '||to_char(py_za_tx_01032005.trc_PerArrRetAnuAbm));
1828    WriteHrTrace('py_za_tx_01032005.trc_MedAidAbm:            '||to_char(py_za_tx_01032005.trc_MedAidAbm      ));
1829    WriteHrTrace('py_za_tx_01032005.trc_PerIncProPolAbm:      '||to_char(py_za_tx_01032005.trc_PerIncProPolAbm));
1830    WriteHrTrace(' ');
1831    WriteHrTrace('py_za_tx_01032005.trc_AnnTotAbm:            '||to_char(py_za_tx_01032005.trc_AnnTotAbm      ));
1832    WriteHrTrace('trc_AnnTotAbm consists of:');
1833    WriteHrTrace('py_za_tx_01032005.trc_AnnPenFndAbm:         '||to_char(py_za_tx_01032005.trc_AnnPenFndAbm   ));
1834    WriteHrTrace('py_za_tx_01032005.trc_AnnArrPenFndAbm:      '||to_char(py_za_tx_01032005.trc_AnnArrPenFndAbm));
1835    WriteHrTrace('py_za_tx_01032005.trc_AnnRetAnuAbm:         '||to_char(py_za_tx_01032005.trc_AnnRetAnuAbm   ));
1836    WriteHrTrace('py_za_tx_01032005.trc_AnnArrRetAnuAbm:      '||to_char(py_za_tx_01032005.trc_AnnArrRetAnuAbm));
1837    WriteHrTrace('py_za_tx_01032005.trc_MedAidAbm:            '||to_char(py_za_tx_01032005.trc_MedAidAbm      ));
1838    WriteHrTrace('py_za_tx_01032005.trc_AnnIncProPolAbm:      '||to_char(py_za_tx_01032005.trc_AnnIncProPolAbm));
1839 
1840 EXCEPTION
1841    WHEN OTHERS THEN
1842       IF py_za_tx_01032005.xpt_Msg = 'No Error' THEN
1843          py_za_tx_01032005.xpt_Msg := 'Abatements: '||TO_CHAR(SQLCODE);
1844       END IF;
1845       RAISE py_za_tx_01032005.xpt_E;
1846 END Abatements;
1847 -------------------------------------------------------------------------------
1848 -- ArrearExcess                                                              --
1849 -------------------------------------------------------------------------------
1850 PROCEDURE ArrearExcess AS
1851 -- Variables
1852    l_PfExcessAmt NUMBER;
1853    l_RaExcessAmt NUMBER;
1854 
1855 BEGIN
1856    hr_utility.set_location('py_za_tx_utl_01032005.ArrearExcess',1);
1857 -- Pension Excess
1858    l_PfExcessAmt := ( py_za_tx_01032005.bal_ARR_PF_YTD
1859                     + ( py_za_tx_01032005.bal_EXC_ARR_PEN_ITD
1860                       - py_za_tx_01032005.bal_EXC_ARR_PEN_YTD
1861                       )
1862                     ) - py_za_tx_01032005.glb_ZA_ARR_PF_AN_MX_ABT;
1863 
1864    IF l_PfExcessAmt > 0 THEN
1865       hr_utility.set_location('py_za_tx_utl_01032005.ArrearExcess',2);
1866       py_za_tx_01032005.trc_PfUpdFig := l_PfExcessAmt - py_za_tx_01032005.bal_EXC_ARR_PEN_ITD;
1867    ELSE
1868       hr_utility.set_location('py_za_tx_utl_01032005.ArrearExcess',3);
1869       py_za_tx_01032005.trc_PfUpdFig := -1*(py_za_tx_01032005.bal_EXC_ARR_PEN_ITD);
1870    END IF;
1871 
1872 -- Retirement Annuity
1873    l_RaExcessAmt := ( py_za_tx_01032005.bal_ARR_RA_YTD
1874                     + ( py_za_tx_01032005.bal_EXC_ARR_RA_ITD
1875                       - py_za_tx_01032005.bal_EXC_ARR_RA_YTD
1876                       )
1877                     ) - py_za_tx_01032005.glb_ZA_ARR_RA_AN_MX_ABT;
1878 
1879    IF l_RaExcessAmt > 0 THEN
1880       hr_utility.set_location('py_za_tx_utl_01032005.ArrearExcess',4);
1881       py_za_tx_01032005.trc_RaUpdFig := l_RaExcessAmt - py_za_tx_01032005.bal_EXC_ARR_RA_ITD;
1882    ELSE
1883       hr_utility.set_location('py_za_tx_utl_01032005.ArrearExcess',5);
1884       py_za_tx_01032005.trc_RaUpdFig := -1*(py_za_tx_01032005.bal_EXC_ARR_RA_ITD);
1885    END IF;
1886 
1887    hr_utility.set_location('py_za_tx_utl_01032005.ArrearExcess',6);
1888    WriteHrTrace('l_PfExcessAmt: '||to_char(l_PfExcessAmt));
1889    WriteHrTrace('l_RaExcessAmt: '||to_char(l_RaExcessAmt));
1890 
1891 EXCEPTION
1892    WHEN OTHERS THEN
1893       IF py_za_tx_01032005.xpt_Msg = 'No Error' THEN
1894          py_za_tx_01032005.xpt_Msg := 'ArrearExcess: '||TO_CHAR(SQLCODE);
1895       END IF;
1896       RAISE py_za_tx_01032005.xpt_E;
1897 END ArrearExcess;
1898 -------------------------------------------------------------------------------
1899 -- GetTableValue                                                             --
1900 -------------------------------------------------------------------------------
1901 FUNCTION GetTableValue
1902    ( p_TableName     IN pay_user_tables.user_table_name%TYPE
1903    , p_ColumnName    IN pay_user_columns.user_column_name%TYPE
1904    , p_RowValue      IN NUMBER
1905    , p_EffectiveDate IN DATE
1906    ) RETURN VARCHAR2
1907 AS
1908 -- Variables
1909 --
1910    l_UserTableID pay_user_tables.user_table_id%TYPE;
1911    l_ColumnID    pay_user_columns.user_column_id%TYPE;
1912    l_RowID       pay_user_rows_f.user_row_id%TYPE;
1913    l_TableValue  pay_user_column_instances_f.value%TYPE;
1914 BEGIN
1915    hr_utility.set_location('py_za_tx_utl_01032005.GetTableValue',1);
1916    -- Get the user_table_id
1917    --
1918    select put.user_table_id
1919      INTO l_UserTableID
1920      from pay_user_tables put
1921     where upper(put.user_table_name) = upper(p_TableName)
1922       AND put.legislation_code       = 'ZA';
1923 
1924    hr_utility.set_location('py_za_tx_utl_01032005.GetTableValue',2);
1925    -- Get the user_column_id
1926    --
1927    select puc.user_column_id
1928      INTO l_ColumnID
1929      from pay_user_columns            puc
1930     where puc.user_table_id           = l_UserTableID
1931       AND puc.legislation_code        = 'ZA'
1932       and puc.business_group_id       is null
1933       AND upper(puc.user_column_name) = upper(p_ColumnName);
1934 
1935    hr_utility.set_location('py_za_tx_utl_01032005.GetTableValue',3);
1936    -- Get the user_row_id
1937    --
1938    select pur.user_row_id
1939      INTO l_RowID
1940      from pay_user_tables      put
1941         , pay_user_rows_f      pur
1942     where put.user_table_id    = l_UserTableID
1943       and pur.user_table_id    = put.user_table_id
1944       AND pur.row_high_range   IS NOT NULL
1945       AND p_EffectiveDate      BETWEEN pur.effective_start_date
1946                                    AND pur.effective_end_date
1947       AND pur.legislation_code = 'ZA'
1948       AND p_RowValue           BETWEEN decode ( put.user_key_units
1949                                               , 'N', pur.row_low_range_or_name
1950                                               , p_RowValue+1
1951                                               )
1952                                    AND decode ( put.user_key_units
1953                                               , 'N', pur.row_high_range
1954                                               , p_RowValue-1
1955                                               );
1956 
1957    hr_utility.set_location('py_za_tx_utl_01032005.GetTableValue',4);
1958    -- Get the value
1959    --
1960    SELECT pucif.value
1961      INTO l_TableValue
1962      FROM pay_user_column_instances_f pucif
1963     where pucif.user_column_id        = l_ColumnID
1964       and pucif.user_row_id           = l_RowID
1965       AND pucif.legislation_code      = 'ZA'
1966       and p_EffectiveDate             BETWEEN pucif.effective_start_date
1967                                           AND pucif.effective_end_date;
1968 
1969    hr_utility.set_location('py_za_tx_utl_01032005.GetTableValue',5);
1970    RETURN l_TableValue;
1971 EXCEPTION
1972    WHEN OTHERS THEN
1973       IF py_za_tx_01032005.xpt_Msg = 'No Error' THEN
1974          py_za_tx_01032005.xpt_Msg := 'GetTableValue: '||TO_CHAR(SQLCODE);
1975       END IF;
1976       RAISE py_za_tx_01032005.xpt_E;
1977 END GetTableValue;
1978 -------------------------------------------------------------------------------
1979 -- TaxLiability                                                              --
1980 -------------------------------------------------------------------------------
1981 FUNCTION TaxLiability
1982    (p_Amt  IN NUMBER
1983    )RETURN  NUMBER
1984 AS
1985 
1986 -- Variables
1987 --
1988    l_fixed          pay_user_column_instances_f.value%TYPE;
1989    l_limit          pay_user_column_instances_f.value%TYPE;
1990    l_percentage     pay_user_column_instances_f.value%TYPE;
1991    l_effective_date pay_payroll_actions.effective_date%TYPE;
1992    tax_liability    t_Balance;
1993    l_TxbAmt         t_Balance;
1994 
1995 BEGIN
1996    hr_utility.set_location('py_za_tx_utl_01032005.TaxLiability',1);
1997    -------------------------------------------------------------------------------
1998    -- First Check for a Tax Override
1999    -------------------------------------------------------------------------------
2000    IF py_za_tx_01032005.trc_OvrTxCalc AND py_za_tx_01032005.trc_OvrTyp = 'P' THEN
2001       hr_utility.set_location('py_za_tx_utl_01032005.TaxLiability',2);
2002       tax_liability := (p_Amt * py_za_tx_01032005.trc_OvrPrc) / 100;
2003    -------------------------------------------------------------------------------
2004    -- D = Directive Percentage
2005    -- P = Private Director wth Directive Percentage
2006    -------------------------------------------------------------------------------
2007    ELSIF py_za_tx_01032005.dbi_TX_STA IN ('D','P') THEN
2008       hr_utility.set_location('py_za_tx_utl_01032005.TaxLiability',3);
2009       tax_liability := (p_Amt * py_za_tx_01032005.dbi_TX_DIR_VAL) / 100;
2010    -------------------------------------------------------------------------------
2011    -- E = Close Corporation
2012    -------------------------------------------------------------------------------
2013    ELSIF py_za_tx_01032005.dbi_TX_STA = 'E' THEN
2014       hr_utility.set_location('py_za_tx_utl_01032005.TaxLiability',4);
2015       tax_liability := (p_Amt * py_za_tx_01032005.glb_ZA_CC_TX_PRC) / 100;
2016    -------------------------------------------------------------------------------
2017    -- F = Temporary Worker/Student
2018    -------------------------------------------------------------------------------
2019    ELSIF py_za_tx_01032005.dbi_TX_STA = 'F' THEN
2020       hr_utility.set_location('py_za_tx_utl_01032005.TaxLiability',5);
2021       tax_liability := (p_Amt * py_za_tx_01032005.glb_ZA_TMP_TX_RTE) / 100;
2022    -------------------------------------------------------------------------------
2023    -- J = Personal Service Company
2024    -------------------------------------------------------------------------------
2025    ELSIF py_za_tx_01032005.dbi_TX_STA = 'J' THEN
2026       hr_utility.set_location('py_za_tx_utl_01032005.TaxLiability',6);
2027       tax_liability := (p_Amt * py_za_tx_01032005.glb_ZA_PER_SERV_COMP_PERC) / 100;
2028    -------------------------------------------------------------------------------
2029    -- K = Personal Service Trust
2030    -------------------------------------------------------------------------------
2031    ELSIF py_za_tx_01032005.dbi_TX_STA = 'K' THEN
2032       hr_utility.set_location('py_za_tx_utl_01032005.TaxLiability',7);
2033       tax_liability := (p_Amt * py_za_tx_01032005.glb_ZA_PER_SERV_TRST_PERC) / 100;
2034    -------------------------------------------------------------------------------
2035    -- L = Labour Broker
2036    -------------------------------------------------------------------------------
2037    ELSIF py_za_tx_01032005.dbi_TX_STA = 'L' THEN
2038       hr_utility.set_location('py_za_tx_utl_01032005.TaxLiability',8);
2039       tax_liability := (p_Amt * py_za_tx_01032005.glb_ZA_PER_SERV_COMP_PERC) / 100;
2040    -------------------------------------------------------------------------------
2041    -- A = Normal
2042    -- B = Provisional
2043    -- G = Seasonal Worker
2044    -- M = Private Director
2045    -------------------------------------------------------------------------------
2046    ELSIF py_za_tx_01032005.dbi_TX_STA IN ('A','B','G','M') THEN
2047       hr_utility.set_location('py_za_tx_utl_01032005.TaxLiability',9);
2048       -- Taxable Amount must be rounded off to two decimal places
2049       l_TxbAmt := round(p_Amt,2);
2050 
2051       -- effective date for the payroll_run
2052       l_effective_date := py_za_tx_01032005.dbi_PAY_PROC_PRD_DTE_PD;
2053 
2054       hr_utility.set_location('py_za_tx_utl_01032005.TaxLiability',10);
2055       l_fixed       := GetTableValue('ZA_TAX_TABLE','Fixed',l_TxbAmt,l_effective_date);
2056       l_limit       := GetTableValue('ZA_TAX_TABLE','Limit',l_TxbAmt,l_effective_date);
2057       l_percentage  := GetTableValue('ZA_TAX_TABLE','Percentage',l_TxbAmt,l_effective_date);
2058       tax_liability := (l_fixed + ((l_TxbAmt - l_limit) * (l_percentage / 100))) -  py_za_tx_01032005.trc_Rebate;
2059       hr_utility.set_location('py_za_tx_utl_01032005.TaxLiability',11);
2060    -------------------------------------------------------------------------------
2061    -- Tax Status invalid for the call to TaxLiability
2062    -------------------------------------------------------------------------------
2063    ELSE
2064       hr_utility.set_location('py_za_tx_utl_01032005.TaxLiability',12);
2065       IF py_za_tx_01032005.xpt_Msg = 'No Error' THEN
2066          py_za_tx_01032005.xpt_Msg := 'TaxLiability: Invalid Tax Status';
2067       END IF;
2068       RAISE py_za_tx_01032005.xpt_E;
2069    END IF;
2070 
2071    WriteHrTrace('l_fixed:       '||        l_fixed                      );
2072    WriteHrTrace('l_TxbAmt:      '||to_char(l_TxbAmt                    ));
2073    WriteHrTrace('l_limit:       '||        l_limit                      );
2074    WriteHrTrace('l_percentage:  '||        l_percentage                 );
2075    WriteHrTrace('trc_Rebate:    '||to_char(py_za_tx_01032005.trc_Rebate));
2076    WriteHrTrace('tax_liability: '||to_char(tax_liability               ));
2077 
2078    RETURN tax_liability;
2079 
2080 EXCEPTION
2081    WHEN OTHERS THEN
2082       IF py_za_tx_01032005.xpt_Msg = 'No Error' THEN
2083          py_za_tx_01032005.xpt_Msg := 'TaxLiability: '||TO_CHAR(SQLCODE);
2084       END IF;
2085       RAISE py_za_tx_01032005.xpt_E;
2086 END TaxLiability;
2087 -------------------------------------------------------------------------------
2088 -- DeAnnualise                                                               --
2089 -------------------------------------------------------------------------------
2090 FUNCTION DeAnnualise
2091    (p_Liab IN NUMBER
2092    ,p_TxOnYtd IN NUMBER
2093    ,p_TxOnPtd IN NUMBER
2094    ) RETURN NUMBER
2095 AS
2096    l_LiabRoy1 t_balance;
2097    l_LiabRoy2 t_balance;
2098    l_LiabRoy3 t_balance;
2099    l_LiabRoy4 t_balance;
2100    l_LiabFp   t_balance;
2101 BEGIN
2102    hr_utility.set_location('py_za_tx_utl_01032005.DeAnnualise',1);
2103    -- 1
2104    l_LiabRoy1 := p_liab / py_za_tx_01032005.trc_PosFactor;
2105    -- 2
2106    l_LiabRoy2 := l_LiabRoy1 - p_TxOnYtd + p_TxOnPtd;
2107    -- 3
2108    l_LiabRoy3 := l_LiabRoy2 / py_za_tx_01032005.dbi_ZA_PAY_PRDS_LFT;
2109    -- 4
2110    l_LiabRoy4 := l_LiabRoy3 * py_za_tx_01032005.trc_PrdFactor;
2111    -- 5
2112    l_LiabFp   := l_LiabRoy4 - p_TxOnPtd;
2113    --
2114    hr_utility.set_location('py_za_tx_utl_01032005.DeAnnualise',2);
2115    --
2116    WriteHrTrace('p_liab:                               '||to_char(p_liab));
2117    WriteHrTrace('py_za_tx_01032005.trc_PosFactor:      '||to_char(py_za_tx_01032005.trc_PosFactor));
2118    WriteHrTrace('l_LiabRoy1:                           '||to_char(l_LiabRoy1));
2119    WriteHrTrace('p_TxOnYtd:                            '||to_char(p_TxOnYtd));
2120    WriteHrTrace('p_TxOnPtd:                            '||to_char(p_TxOnPtd));
2121    WriteHrTrace('l_LiabRoy2:                           '||to_char(l_LiabRoy2));
2122    WriteHrTrace('py_za_tx_01032005.dbi_ZA_PAY_PRDS_LFT:'||to_char(py_za_tx_01032005.dbi_ZA_PAY_PRDS_LFT));
2123    WriteHrTrace('l_LiabRoy3:                           '||to_char(l_LiabRoy3));
2124    WriteHrTrace('py_za_tx_01032005.trc_PrdFactor:      '||to_char(py_za_tx_01032005.trc_PrdFactor));
2125    WriteHrTrace('l_LiabRoy4:                           '||to_char(l_LiabRoy4));
2126    WriteHrTrace('l_LiabFp:                             '||to_char(l_LiabFp));
2127    --
2128    RETURN l_LiabFp;
2129 
2130 EXCEPTION
2131    WHEN OTHERS THEN
2132       IF py_za_tx_01032005.xpt_Msg = 'No Error' THEN
2133          py_za_tx_01032005.xpt_Msg := 'DeAnnualise: '||TO_CHAR(SQLCODE);
2134       END IF;
2135       RAISE py_za_tx_01032005.xpt_E;
2136 END DeAnnualise;
2137 -------------------------------------------------------------------------------
2138 -- TrvAll                                                                    --
2139 -------------------------------------------------------------------------------
2140 PROCEDURE TrvAll AS
2141 -- Cursors
2142 --
2143   -- Global Effective End Dates
2144   CURSOR c_GlbEffDte
2145     (p_ty_sd DATE       -- start date
2146     ,p_ty_ed DATE       -- end date
2147     )
2148   IS
2149   SELECT effective_end_date
2150        , to_number(global_value) global_value
2151     FROM ff_globals_f
2152    WHERE effective_end_date < p_ty_ed
2153      AND effective_end_date > p_ty_sd
2154      AND global_name        = 'ZA_CAR_ALLOW_TAX_PERC';
2155 
2156 -- Variables
2157 --
2158   l_RfiBalID   pay_balance_types.balance_type_id%TYPE;
2159   l_StrtDate   DATE;
2160   l_EndDate    DATE;
2161   l_RfiYtd     t_balance DEFAULT 0;
2162   l_CurRfiYtd  t_balance DEFAULT 0;
2163   l_TotRfiYtd  t_balance DEFAULT 0;
2164   l_CurTxbRfi  t_balance DEFAULT 0;
2165   l_TotTxbRfi  t_balance DEFAULT 0;
2166   l_GlbVal     ff_globals_f.global_value%TYPE DEFAULT '0';
2167 
2168 BEGIN
2169    hr_utility.set_location('py_za_tx_utl_01032005.TrvAll',1);
2170 -- Retrieve Balance Type ID's
2171 
2172    SELECT balance_type_id
2173      INTO l_RfiBalID
2174      FROM pay_balance_types
2175     WHERE legislation_code = 'ZA'
2176       AND balance_name     = 'ZATax Total Taxable Travel Allowance';
2177 
2178 -- Check Calc and setup correct values
2179 --
2180    IF py_za_tx_01032005.trc_CalTyp in ('DirCalc','NorCalc','SitCalc','YtdCalc') THEN
2181       hr_utility.set_location('py_za_tx_utl_01032005.TrvAll',3);
2182       -- Employee Tax Year Start and End Dates
2183       --
2184       l_StrtDate := GREATEST( py_za_tx_01032005.dbi_ZA_ACT_STRT_DTE
2185                             , py_za_tx_01032005.dbi_ZA_TX_YR_STRT
2186                             );
2187       l_EndDate  := LEAST( py_za_tx_01032005.dbi_ZA_ACT_END_DTE
2188                          , py_za_tx_01032005.dbi_ZA_TX_YR_END
2189                          , py_za_tx_01032005.dbi_ZA_CUR_PRD_END_DTE
2190                          );
2191 
2192    ELSIF py_za_tx_01032005.trc_CalTyp = 'CalCalc' THEN
2193       hr_utility.set_location('py_za_tx_utl_01032005.TrvAll',4);
2194       -- Employee Tax Year Start and End Dates
2195       --
2196       l_StrtDate := to_date('01-01-'||to_char(py_za_tx_01032005.dbi_ZA_TX_YR_STRT,'YYYY')||''||'','DD-MM-YYYY');
2197       l_EndDate  := py_za_tx_01032005.dbi_ZA_TX_YR_STRT -1;
2198 
2199    ELSIF py_za_tx_01032005.trc_CalTyp = 'LteCalc' THEN
2200       hr_utility.set_location('py_za_tx_utl_01032005.TrvAll',5);
2201       -- Employee Tax Year Start and End Dates
2202       --
2203       l_StrtDate := py_za_tx_01032005.dbi_ZA_TX_YR_STRT;
2204       l_EndDate  := py_za_tx_01032005.dbi_ZA_CUR_PRD_END_DTE;
2205 
2206    ELSIF py_za_tx_01032005.trc_CalTyp = 'PstCalc' THEN
2207       hr_utility.set_location('py_za_tx_utl_01032005.TrvAll',6);
2208       -- Employee Tax Year Start and End Dates
2209       --
2210       l_StrtDate := py_za_tx_01032005.dbi_ZA_ASG_TX_YR_STRT;
2211       l_EndDate := py_za_tx_01032005.dbi_ZA_ASG_TX_YR_END;
2212    END IF;
2213 
2214    hr_utility.set_location('py_za_tx_utl_01032005.TrvAll',7);
2215 
2216 -- Loop through cursor and for every end date calculate the balance
2217    FOR v_Date IN c_GlbEffDte
2218                  (l_StrtDate
2219                  ,l_EndDate
2220                  )
2221    LOOP
2222    -- Rfi Travel Allowance
2223    --
2224       hr_utility.set_location('py_za_tx_utl_01032005.TrvAll',11);
2225       -- Check Calc Type
2226       IF py_za_tx_01032005.trc_CalTyp in ('DirCalc','NorCalc','SitCalc','YtdCalc','LteCalc','PstCalc') THEN
2227          hr_utility.set_location('py_za_tx_utl_01032005.TrvAll',12);
2228          -- Rfi Balance At That Date
2229            l_RfiYtd := py_za_bal.get_balance_value
2230                         ( py_za_tx_01032005.con_ASG_ID
2231                         , l_RfiBalID
2232                         , '_ASG_TAX_YTD'
2233                         , v_Date.effective_end_date
2234                         );
2235       ELSIF py_za_tx_01032005.trc_CalTyp = 'CalCalc' THEN
2236          hr_utility.set_location('py_za_tx_utl_01032005.TrvAll',13);
2237          -- Rfi Balance At That Date
2238            l_RfiYtd := py_za_bal.get_balance_value
2239                         ( py_za_tx_01032005.con_ASG_ID
2240                         , l_RfiBalID
2241                         , '_ASG_CAL_YTD'
2242                         , v_Date.effective_end_date
2243                         );
2244       END IF;
2245 
2246       -- Take Off the Ytd value used already
2247       l_CurRfiYtd := l_RfiYtd - l_TotRfiYtd;
2248       -- Update TotYtd value
2249       l_TotRfiYtd := l_RfiYtd;
2250       -- Get the Taxable Travel Allowance at that date
2251       l_CurTxbRfi := l_CurRfiYtd * v_Date.global_value/100;
2252       -- Add this to the total
2253       l_TotTxbRfi := l_TotTxbRfi + l_CurTxbRfi;
2254 
2255    END LOOP;
2256 
2257    WriteHrTrace('l_CurRfiYtd:  '||to_char(l_CurRfiYtd));
2258    WriteHrTrace('l_TotRfiYtd:  '||to_char(l_TotRfiYtd));
2259    WriteHrTrace('l_CurTxbRfi:  '||to_char(l_CurTxbRfi));
2260    WriteHrTrace('l_TotTxbRfi:  '||to_char(l_TotTxbRfi));
2261 
2262 -- Calculate the current Taxable Travel Allowance Value
2263 -- add this to any calculated in the loop
2264 --
2265    hr_utility.set_location('py_za_tx_utl_01032005.TrvAll',14);
2266    -- Check Calc TYPE
2267    IF py_za_tx_01032005.trc_CalTyp IN ('DirCalc','NorCalc','SitCalc','YtdCalc', 'LteCalc') THEN
2268       hr_utility.set_location('py_za_tx_utl_01032005.TrvAll',15);
2269       -- Balance Values
2270       l_RfiYtd  := py_za_tx_01032005.bal_TOT_TXB_TA_YTD;
2271       -- Global Value
2272       l_GlbVal  := py_za_tx_01032005.glb_ZA_TRV_ALL_TX_PRC;
2273 
2274    ELSIF py_za_tx_01032005.trc_CalTyp = 'PstCalc' THEN
2275       hr_utility.set_location('py_za_tx_utl_01032005.TrvAll',16);
2276       -- Balance Values
2277       l_RfiYtd := py_za_tx_01032005.bal_TOT_TXB_TA_PTD;
2278       -- Global Value
2279       SELECT TO_NUMBER(global_value)
2280         INTO l_GlbVal
2281         FROM ff_globals_f
2282        WHERE l_EndDate between effective_start_date
2283                            and effective_end_date
2284          AND global_name     = 'ZA_CAR_ALLOW_TAX_PERC';
2285 
2286       hr_utility.set_location('py_za_tx_utl_01032005.TrvAll',17);
2287 
2288    ELSIF py_za_tx_01032005.trc_CalTyp = 'CalCalc' THEN
2289       hr_utility.set_location('py_za_tx_utl_01032005.TrvAll',18);
2290       -- Balance Values
2291       l_RfiYtd  := py_za_tx_01032005.bal_TOT_TXB_TA_CYTD;
2292 
2293       -- Global Value
2294       SELECT TO_NUMBER(global_value)
2295         INTO l_GlbVal
2296         FROM ff_globals_f
2297        WHERE l_EndDate between effective_start_date
2298                            and effective_end_date
2299          AND global_name     = 'ZA_CAR_ALLOW_TAX_PERC';
2300 
2301       hr_utility.set_location('py_za_tx_utl_01032005.TrvAll',19);
2302 
2303    END IF;
2304 
2305    WriteHrTrace('l_RfiYtd:  '||to_char(l_RfiYtd));
2306    WriteHrTrace('l_GlbVal:  '||l_GlbVal);
2307 
2308 -- Rfi Travel Allowance
2309 --
2310    -- Take Off the Ytd value used already
2311    l_CurRfiYtd := l_RfiYtd - l_TotRfiYtd;
2312    -- Update TotYtd value
2313    l_TotRfiYtd := l_RfiYtd;
2314    -- Get the Taxable Travel Allowance at that date
2315    l_CurTxbRfi := l_CurRfiYtd * l_GlbVal/100;
2316    -- Add this to the total
2317    l_TotTxbRfi := l_TotTxbRfi + l_CurTxbRfi;
2318 
2319 -- Update Globals
2320 --
2321    -- Check Calc Type
2322    IF py_za_tx_01032005.trc_CalTyp IN ('DirCalc','NorCalc','SitCalc','YtdCalc', 'LteCalc') THEN
2323       hr_utility.set_location('py_za_tx_utl_01032005.TrvAll',20);
2324       py_za_tx_01032005.bal_TOT_TXB_TA_YTD  := l_TotTxbRfi;
2325    ELSIF py_za_tx_01032005.trc_CalTyp = 'PstCalc' THEN
2326       hr_utility.set_location('py_za_tx_utl_01032005.TrvAll',21);
2327       py_za_tx_01032005.bal_TOT_TXB_TA_PTD  := l_TotTxbRfi;
2328    ELSIF py_za_tx_01032005.trc_CalTyp = 'CalCalc' THEN
2329       hr_utility.set_location('py_za_tx_utl_01032005.TrvAll',22);
2330       py_za_tx_01032005.bal_TOT_TXB_TA_CYTD  := l_TotTxbRfi;
2331    END IF;
2332 
2333    WriteHrTrace('l_TotTxbRfi:  '||to_char(l_TotTxbRfi));
2334 
2335 EXCEPTION
2336    WHEN OTHERS THEN
2337       IF py_za_tx_01032005.xpt_Msg = 'No Error' THEN
2338          py_za_tx_01032005.xpt_Msg := 'TrvAll: '||TO_CHAR(SQLCODE);
2339       END IF;
2340       RAISE py_za_tx_01032005.xpt_E;
2341 END TrvAll;
2342 -------------------------------------------------------------------------------
2343 -- ValidateTaxOns                                                            --
2344 -------------------------------------------------------------------------------
2345 PROCEDURE ValidateTaxOns(
2346    p_Rf IN BOOLEAN DEFAULT FALSE -- Refund Allowed Regardless
2347    )
2348 AS
2349 
2350 -- Type Declaration
2351 --
2352    TYPE r_Row IS RECORD(
2353      Ovrrde BOOLEAN
2354     ,Lib    NUMBER
2355     );
2356 
2357    TYPE t_Table IS TABLE OF r_Row
2358       INDEX BY BINARY_INTEGER;
2359 -- Variable Declaration
2360 --
2361    t_Liabilities t_Table;
2362 
2363    l_TotLib t_Balance; -- Total Liability
2364    l_TotNp  t_Balance; -- Total Net Pay
2365    l_RecVal t_Balance; -- Recovery Value
2366    l_NewLib t_Balance; -- New Liability
2367    i NUMBER; -- Counter
2368 
2369 BEGIN
2370    hr_utility.set_location('py_za_tx_utl_01032005.ValidateTaxOns',1);
2371 -- Set up the Table
2372    t_Liabilities(1).Ovrrde := py_za_tx_01032005.trc_LibFpNIOvr;
2373    t_Liabilities(1).Lib    := py_za_tx_01032005.trc_LibFpNI;
2374 
2375    t_Liabilities(2).Ovrrde := py_za_tx_01032005.trc_LibFpFBOvr;
2376    t_Liabilities(2).Lib    := py_za_tx_01032005.trc_LibFpFB;
2377 
2378    t_Liabilities(3).Ovrrde := py_za_tx_01032005.trc_LibFpTAOvr;
2379    t_Liabilities(3).Lib    := py_za_tx_01032005.trc_LibFpTA;
2380 
2381    t_Liabilities(4).Ovrrde := py_za_tx_01032005.trc_LibFpBPOvr;
2382    t_Liabilities(4).Lib    := py_za_tx_01032005.trc_LibFpBP;
2383 
2384    t_Liabilities(5).Ovrrde := py_za_tx_01032005.trc_LibFpABOvr;
2385    t_Liabilities(5).Lib    := py_za_tx_01032005.trc_LibFpAB;
2386 
2387    t_Liabilities(6).Ovrrde := py_za_tx_01032005.trc_LibFpAPOvr;
2388    t_Liabilities(6).Lib    := py_za_tx_01032005.trc_LibFpAP;
2389 
2390    t_Liabilities(7).Ovrrde := py_za_tx_01032005.trc_LibFpPOOvr;
2391    t_Liabilities(7).Lib    := py_za_tx_01032005.trc_LibFpPO;
2392 
2393    IF py_za_tx_01032005.trc_LibFpNIOvr THEN
2394       WriteHrTrace('py_za_tx_01032005.trc_LibFpNIOvr: TRUE');
2395    ELSE
2396       WriteHrTrace('py_za_tx_01032005.trc_LibFpNIOvr: FALSE');
2397    END IF;
2398    WriteHrTrace('py_za_tx_01032005.trc_LibFpNI: '||to_char(py_za_tx_01032005.trc_LibFpNI));
2399    IF py_za_tx_01032005.trc_LibFpFBOvr THEN
2400       WriteHrTrace('py_za_tx_01032005.trc_LibFpFBOvr: TRUE');
2401    ELSE
2402       WriteHrTrace('py_za_tx_01032005.trc_LibFpFBOvr: FALSE');
2403    END IF;
2404    WriteHrTrace('py_za_tx_01032005.trc_LibFpFB: '||to_char(py_za_tx_01032005.trc_LibFpFB));
2405    IF py_za_tx_01032005.trc_LibFpTAOvr THEN
2406       WriteHrTrace('py_za_tx_01032005.trc_LibFpTAOvr: TRUE');
2407    ELSE
2408       WriteHrTrace('py_za_tx_01032005.trc_LibFpTAOvr: FALSE');
2409    END IF;
2410    WriteHrTrace('py_za_tx_01032005.trc_LibFpTA: '||to_char(py_za_tx_01032005.trc_LibFpTA));
2411    IF py_za_tx_01032005.trc_LibFpBPOvr THEN
2412       WriteHrTrace('py_za_tx_01032005.trc_LibFpBPOvr: TRUE');
2413    ELSE
2414       WriteHrTrace('py_za_tx_01032005.trc_LibFpBPOvr: FALSE');
2415    END IF;
2416    WriteHrTrace('py_za_tx_01032005.trc_LibFpBP: '||to_char(py_za_tx_01032005.trc_LibFpBP));
2417    IF py_za_tx_01032005.trc_LibFpABOvr THEN
2418       WriteHrTrace('py_za_tx_01032005.trc_LibFpABOvr: TRUE');
2419    ELSE
2420       WriteHrTrace('py_za_tx_01032005.trc_LibFpABOvr: FALSE');
2421    END IF;
2422    WriteHrTrace('py_za_tx_01032005.trc_LibFpAB: '||to_char(py_za_tx_01032005.trc_LibFpAB));
2423    IF py_za_tx_01032005.trc_LibFpAPOvr THEN
2424       WriteHrTrace('py_za_tx_01032005.trc_LibFpAPOvr: TRUE');
2425    ELSE
2426       WriteHrTrace('py_za_tx_01032005.trc_LibFpAPOvr: FALSE');
2427    END IF;
2428    WriteHrTrace('py_za_tx_01032005.trc_LibFpAP: '||to_char(py_za_tx_01032005.trc_LibFpAP));
2429    IF py_za_tx_01032005.trc_LibFpPOOvr THEN
2430       WriteHrTrace('py_za_tx_01032005.trc_LibFpPOOvr: TRUE');
2431    ELSE
2432       WriteHrTrace('py_za_tx_01032005.trc_LibFpPOOvr: FALSE');
2433    END IF;
2434    WriteHrTrace('py_za_tx_01032005.trc_LibFpPO: '||to_char(py_za_tx_01032005.trc_LibFpPO));
2435 
2436 -- Sum the Liabilities
2437    l_TotLib :=
2438    ( py_za_tx_01032005.trc_LibFpNI
2439    + py_za_tx_01032005.trc_LibFpFB
2440    + py_za_tx_01032005.trc_LibFpTA
2441    + py_za_tx_01032005.trc_LibFpBP
2442    + py_za_tx_01032005.trc_LibFpAB
2443    + py_za_tx_01032005.trc_LibFpAP
2444    + py_za_tx_01032005.trc_LibFpPO
2445    );
2446 
2447 -- Set Net Pay
2448    l_TotNp := py_za_tx_01032005.bal_NET_PAY_RUN;
2449    WriteHrTrace('l_TotNp: '||to_char(l_TotNp));
2450 -- Start Validation
2451 --
2452    IF l_TotLib = 0 THEN
2453       hr_utility.set_location('py_za_tx_utl_01032005.ValidateTaxOns',2);
2454       NULL;
2455    ELSIF l_TotLib > 0 THEN
2456       hr_utility.set_location('py_za_tx_utl_01032005.ValidateTaxOns',3);
2457       IF l_TotNp > 0 THEN
2458          hr_utility.set_location('py_za_tx_utl_01032005.ValidateTaxOns',4);
2459          IF l_TotLib = l_TotNp THEN
2460             hr_utility.set_location('py_za_tx_utl_01032005.ValidateTaxOns',5);
2461             NULL;
2462          ELSIF l_TotLib > l_TotNp THEN
2463             hr_utility.set_location('py_za_tx_utl_01032005.ValidateTaxOns',6);
2464             l_RecVal := l_TotLib - l_TotNp;
2465             i:= 1;
2466 
2467             FOR i IN 1..7 LOOP
2468                IF t_Liabilities(i).Lib = 0 THEN
2469                   hr_utility.set_location('py_za_tx_utl_01032005.ValidateTaxOns',7);
2470                   NULL;
2471                ELSIF t_Liabilities(i).Lib > 0 THEN
2472                   hr_utility.set_location('py_za_tx_utl_01032005.ValidateTaxOns',8);
2473                   l_NewLib := t_Liabilities(i).Lib - LEAST(t_Liabilities(i).Lib,l_RecVal);
2474                   l_RecVal := l_RecVal - (t_Liabilities(i).Lib - l_NewLib);
2475                   t_Liabilities(i).Lib := l_NewLib;
2476                   py_za_tx_01032005.trc_LibWrn := 'Warning: Net Pay Balance not enough for Tax Recovery';
2477                ELSE -- lib < 0
2478                   hr_utility.set_location('py_za_tx_utl_01032005.ValidateTaxOns',9);
2479                   NULL;
2480                END IF;
2481            END LOOP;
2482 
2483          ELSE -- l_TotLib > 0,l_TotNp > 0,l_TotLib < l_TotNp
2484             hr_utility.set_location('py_za_tx_utl_01032005.ValidateTaxOns',10);
2485             NULL;
2486          END IF;
2487 
2488       ELSE -- l_TotLib > 0,l_TotNp <= 0
2489          hr_utility.set_location('py_za_tx_utl_01032005.ValidateTaxOns',11);
2490          l_RecVal := l_TotLib;
2491          i := 1;
2492 
2493          FOR i IN 1..7 LOOP
2494             IF t_Liabilities(i).Lib > 0 THEN
2495                hr_utility.set_location('py_za_tx_utl_01032005.ValidateTaxOns',12);
2496                l_NewLib := t_Liabilities(i).Lib - LEAST(t_Liabilities(i).Lib,l_RecVal);
2497                l_RecVal := l_RecVal - (t_Liabilities(i).Lib - l_NewLib);
2498                t_Liabilities(i).Lib := l_NewLib;
2499                py_za_tx_01032005.trc_LibWrn := 'Warning: Net Pay Balance not enough for Tax Recovery';
2500             END IF;
2501          END LOOP;
2502       END IF;
2503 
2504    ELSE -- l_TotLib < 0
2505       hr_utility.set_location('py_za_tx_utl_01032005.ValidateTaxOns',13);
2506       IF p_Rf THEN
2507          hr_utility.set_location('py_za_tx_utl_01032005.ValidateTaxOns',14);
2508          NULL;
2509       ELSE
2510          hr_utility.set_location('py_za_tx_utl_01032005.ValidateTaxOns',15);
2511          l_RecVal := l_TotLib;
2512          i := 1;
2513          FOR i IN 1..7 LOOP
2514             IF t_Liabilities(i).Lib >= 0 THEN
2515                hr_utility.set_location('py_za_tx_utl_01032005.ValidateTaxOns',16);
2516                NULL;
2517             ELSE -- l_lib < 0
2518                hr_utility.set_location('py_za_tx_utl_01032005.ValidateTaxOns',17);
2519                -- Has the liability been Overridden?
2520                IF t_Liabilities(i).Ovrrde THEN
2521                   hr_utility.set_location('py_za_tx_utl_01032005.ValidateTaxOns',18);
2522                   NULL;
2523                ELSE
2524                   hr_utility.set_location('py_za_tx_utl_01032005.ValidateTaxOns',19);
2525                   l_NewLib := t_Liabilities(i).Lib - GREATEST(t_Liabilities(i).Lib,l_RecVal);
2526                   l_RecVal := l_RecVal - (t_Liabilities(i).Lib - l_NewLib);
2527                   t_Liabilities(i).Lib := l_NewLib;
2528                END IF;
2529            END IF;
2530          END LOOP;
2531       END IF;
2532    END IF;
2533 
2534    hr_utility.set_location('py_za_tx_utl_01032005.ValidateTaxOns',20);
2535 
2536    py_za_tx_01032005.trc_LibFpNI := t_Liabilities(1).Lib;
2537    py_za_tx_01032005.trc_LibFpFB := t_Liabilities(2).Lib;
2538    py_za_tx_01032005.trc_LibFpTA := t_Liabilities(3).Lib;
2539    py_za_tx_01032005.trc_LibFpBP := t_Liabilities(4).Lib;
2540    py_za_tx_01032005.trc_LibFpAB := t_Liabilities(5).Lib;
2541    py_za_tx_01032005.trc_LibFpAP := t_Liabilities(6).Lib;
2542    py_za_tx_01032005.trc_LibFpPO := t_Liabilities(7).Lib;
2543 
2544    WriteHrTrace('py_za_tx_01032005.trc_LibFpNI: '||to_char(py_za_tx_01032005.trc_LibFpNI));
2545    WriteHrTrace('py_za_tx_01032005.trc_LibFpFB: '||to_char(py_za_tx_01032005.trc_LibFpFB));
2546    WriteHrTrace('py_za_tx_01032005.trc_LibFpTA: '||to_char(py_za_tx_01032005.trc_LibFpTA));
2547    WriteHrTrace('py_za_tx_01032005.trc_LibFpBP: '||to_char(py_za_tx_01032005.trc_LibFpBP));
2548    WriteHrTrace('py_za_tx_01032005.trc_LibFpAB: '||to_char(py_za_tx_01032005.trc_LibFpAB));
2549    WriteHrTrace('py_za_tx_01032005.trc_LibFpAP: '||to_char(py_za_tx_01032005.trc_LibFpAP));
2550    WriteHrTrace('py_za_tx_01032005.trc_LibFpPO: '||to_char(py_za_tx_01032005.trc_LibFpPO));
2551 
2552 EXCEPTION
2553    WHEN OTHERS THEN
2554       IF py_za_tx_01032005.xpt_Msg = 'No Error' THEN
2555          py_za_tx_01032005.xpt_Msg := 'ValidateTaxOns: '||TO_CHAR(SQLCODE);
2556       END IF;
2557       RAISE py_za_tx_01032005.xpt_E;
2558 END ValidateTaxOns;
2559 -------------------------------------------------------------------------------
2560 -- DaysWorked                                                                --
2561 --  Returns the number of days that the person has worked                    --
2562 --    This could be a negative number that would indicate                    --
2563 --    a LatePayePeriod                                                       --
2564 -------------------------------------------------------------------------------
2565 FUNCTION DaysWorked RETURN NUMBER
2566 AS
2567    l_DaysWorked NUMBER;
2568    l_EndDte     DATE;
2569    l_StrtDte    DATE;
2570 
2571 BEGIN
2572    IF py_za_tx_01032005.trc_OvrTxCalc AND py_za_tx_01032005.trc_OvrTyp = 'V' THEN
2573       hr_utility.set_location('py_za_tx_utl_01032005.DaysWorked',1);
2574       IF LatePayPeriod THEN
2575          hr_utility.set_location('py_za_tx_utl_01032005.DaysWorked',2);
2576          -- This will set the sitfactor = 1
2577          l_EndDte  := py_za_tx_01032005.dbi_ZA_TX_YR_END;
2578          l_StrtDte := py_za_tx_01032005.dbi_ZA_TX_YR_STRT;
2579       ELSE
2580          hr_utility.set_location('py_za_tx_utl_01032005.DaysWorked',3);
2581          l_EndDte  := LEAST(py_za_tx_01032005.dbi_ZA_ACT_END_DTE, py_za_tx_01032005.dbi_ZA_CUR_PRD_END_DTE);
2582          l_StrtDte := GREATEST(py_za_tx_01032005.dbi_ZA_ACT_STRT_DTE, py_za_tx_01032005.dbi_ZA_TX_YR_STRT);
2583       END IF;
2584 
2585    ELSIF py_za_tx_01032005.trc_CalTyp = 'YtdCalc' THEN
2586       hr_utility.set_location('py_za_tx_utl_01032005.DaysWorked',4);
2587       l_EndDte  := py_za_tx_01032005.dbi_ZA_CUR_PRD_STRT_DTE - 1;
2588       l_StrtDte := GREATEST(py_za_tx_01032005.dbi_ZA_ACT_STRT_DTE, py_za_tx_01032005.dbi_ZA_TX_YR_STRT);
2589 
2590    ELSIF py_za_tx_01032005.trc_CalTyp = 'CalCalc' THEN
2591       hr_utility.set_location('py_za_tx_utl_01032005.DaysWorked',5);
2592       l_EndDte  := py_za_tx_01032005.dbi_ZA_TX_YR_STRT - 1;
2593       l_StrtDte := GREATEST(py_za_tx_01032005.dbi_ZA_ACT_STRT_DTE,
2594       to_date('01/01/'||to_char(to_number(to_char(py_za_tx_01032005.dbi_ZA_TX_YR_END,'YYYY'))-1),'DD/MM/YYYY'));
2595 
2596    ELSIF py_za_tx_01032005.trc_CalTyp = 'SitCalc' AND
2597        ( py_za_tx_01032005.dbi_ZA_ASG_TX_RTR_PRD = 'Y'
2598       OR py_za_tx_01032005.trc_OvrTxCalc
2599       OR py_za_tx_01032005.trc_NegPtd
2600        )THEN
2601       hr_utility.set_location('py_za_tx_utl_01032005.DaysWorked',6);
2602       l_EndDte  := LEAST(py_za_tx_01032005.dbi_ZA_ACT_END_DTE, py_za_tx_01032005.dbi_ZA_CUR_PRD_END_DTE);
2603       l_StrtDte := GREATEST(py_za_tx_01032005.dbi_ZA_ACT_STRT_DTE, py_za_tx_01032005.dbi_ZA_TX_YR_STRT);
2604 
2605    ELSIF py_za_tx_01032005.trc_CalTyp = 'SitCalc' THEN
2606       hr_utility.set_location('py_za_tx_utl_01032005.DaysWorked',7);
2607       l_EndDte  := LEAST(py_za_tx_01032005.dbi_ZA_ACT_END_DTE, py_za_tx_01032005.dbi_ZA_TX_YR_END);
2608       l_StrtDte := GREATEST(py_za_tx_01032005.dbi_ZA_ACT_STRT_DTE, py_za_tx_01032005.dbi_ZA_TX_YR_STRT);
2609 
2610    ELSIF py_za_tx_01032005.trc_CalTyp = 'PstCalc' THEN
2611       hr_utility.set_location('py_za_tx_utl_01032005.DaysWorked',8);
2612       l_EndDte := py_za_tx_01032005.dbi_ZA_ACT_END_DTE;
2613       l_StrtDte := py_za_tx_01032005.dbi_ZA_ASG_TX_YR_STRT;
2614 
2615       hr_utility.set_location('py_za_tx_utl_01032005.DaysWorked',9);
2616 
2617       l_StrtDte := GREATEST(py_za_tx_01032005.dbi_ZA_ACT_STRT_DTE, l_StrtDte);
2618    END IF;
2619 
2620    l_DaysWorked := l_EndDte - l_StrtDte + 1;
2621 
2622    WriteHrTrace('l_EndDte:     '||to_char(l_EndDte,'DD/MM/YYYY'));
2623    WriteHrTrace('l_StrtDte:    '||to_char(l_StrtDte,'DD/MM/YYYY'));
2624    WriteHrTrace('l_DaysWorked: '||to_char(l_DaysWorked));
2625 
2626    RETURN l_DaysWorked;
2627 
2628 EXCEPTION
2629    WHEN OTHERS THEN
2630       IF py_za_tx_01032005.xpt_Msg = 'No Error' THEN
2631          py_za_tx_01032005.xpt_Msg := 'DaysWorked: '||TO_CHAR(SQLCODE);
2632       END IF;
2633       RAISE py_za_tx_01032005.xpt_E;
2634 END DaysWorked;
2635 -------------------------------------------------------------------------------
2636 -- SitPaySplit                                                               --
2637 -------------------------------------------------------------------------------
2638 PROCEDURE SitPaySplit
2639 AS
2640    l_TxOnSitLim t_Balance;
2641    l_SitAblTx t_Balance;
2642 BEGIN
2643    hr_utility.set_location('py_za_tx_utl_01032005.SitPaySplit',1);
2644 -- Directive Type Statuses
2645 --
2646    IF py_za_tx_01032005.dbi_TX_STA IN ('C','D','E','F','J','K','L','N','P') THEN
2647       hr_utility.set_location('py_za_tx_utl_01032005.SitPaySplit',2);
2648    -- Check for SitePeriod
2649       IF SitePeriod THEN
2650          hr_utility.set_location('py_za_tx_utl_01032005.SitPaySplit',3);
2651          py_za_tx_01032005.trc_PayeVal :=
2652             ( py_za_tx_01032005.bal_TAX_YTD
2653             + py_za_tx_01032005.trc_LibFpNI
2654             + py_za_tx_01032005.trc_LibFpFB
2655             + py_za_tx_01032005.trc_LibFpTA
2656             + py_za_tx_01032005.trc_LibFpBP
2657             + py_za_tx_01032005.trc_LibFpAB
2658             + py_za_tx_01032005.trc_LibFpAP
2659             + py_za_tx_01032005.trc_LibFpPO
2660             ) - py_za_tx_01032005.bal_PAYE_YTD;
2661          py_za_tx_01032005.trc_SiteVal := -1*py_za_tx_01032005.bal_SITE_YTD;
2662       ELSE
2663          hr_utility.set_location('py_za_tx_utl_01032005.SitPaySplit',4);
2664          py_za_tx_01032005.trc_PayeVal := -1*py_za_tx_01032005.bal_PAYE_YTD;
2665          py_za_tx_01032005.trc_SiteVal := -1*py_za_tx_01032005.bal_SITE_YTD;
2666       END IF;
2667 -- Normal Type Statuses
2668 --
2669    ELSIF py_za_tx_01032005.dbi_TX_STA IN ('A','B') THEN
2670       IF (SitePeriod AND NOT PreErnPeriod) OR EmpTermPrePeriod THEN
2671          hr_utility.set_location('py_za_tx_utl_01032005.SitPaySplit',5);
2672       -- Get the Tax Liability on the Site Limit
2673          l_TxOnSitLim := TaxLiability(p_Amt => py_za_tx_01032005.glb_ZA_SIT_LIM)/py_za_tx_01032005.trc_SitFactor;
2674       -- Get the Tax Amount Liable for SITE
2675          l_SitAblTx :=
2676          ( py_za_tx_01032005.bal_TX_ON_NI_YTD
2677          + py_za_tx_01032005.bal_TX_ON_FB_YTD
2678          + py_za_tx_01032005.bal_TX_ON_BP_YTD
2679          + py_za_tx_01032005.bal_TX_ON_AB_YTD
2680          + py_za_tx_01032005.bal_TX_ON_AP_YTD
2681          + py_za_tx_01032005.trc_LibFpNI
2682          + py_za_tx_01032005.trc_LibFpFB
2683          + py_za_tx_01032005.trc_LibFpBP
2684          + py_za_tx_01032005.trc_LibFpAB
2685          + py_za_tx_01032005.trc_LibFpAP
2686          );
2687       -- Check the Limit
2688          IF l_SitAblTx > l_TxOnSitLim THEN
2689             hr_utility.set_location('py_za_tx_utl_01032005.SitPaySplit',6);
2690             py_za_tx_01032005.trc_SiteVal := l_TxOnSitLim - py_za_tx_01032005.bal_SITE_YTD;
2691             py_za_tx_01032005.trc_PayeVal := (
2692               ( py_za_tx_01032005.bal_TAX_YTD
2693               + py_za_tx_01032005.trc_LibFpNI
2694               + py_za_tx_01032005.trc_LibFpFB
2695               + py_za_tx_01032005.trc_LibFpBP
2696               + py_za_tx_01032005.trc_LibFpAB
2697               + py_za_tx_01032005.trc_LibFpAP
2698               + py_za_tx_01032005.trc_LibFpTA
2699               + py_za_tx_01032005.trc_LibFpPO
2700               ) - l_TxOnSitLim) - py_za_tx_01032005.bal_PAYE_YTD;
2701 
2702          ELSE
2703             hr_utility.set_location('py_za_tx_utl_01032005.SitPaySplit',7);
2704             IF ( py_za_tx_01032005.bal_TX_ON_TA_YTD
2705                + py_za_tx_01032005.trc_LibFpTA
2706                + py_za_tx_01032005.bal_TX_ON_PO_YTD
2707                + py_za_tx_01032005.trc_LibFpPO
2708                ) <= 0 THEN
2709                hr_utility.set_location('py_za_tx_utl_01032005.SitPaySplit',8);
2710                py_za_tx_01032005.trc_SiteVal := ( py_za_tx_01032005.bal_TAX_YTD
2711                               + py_za_tx_01032005.trc_LibFpNI
2712                               + py_za_tx_01032005.trc_LibFpFB
2713                               + py_za_tx_01032005.trc_LibFpBP
2714                               + py_za_tx_01032005.trc_LibFpAB
2715                               + py_za_tx_01032005.trc_LibFpAP
2716                               + py_za_tx_01032005.trc_LibFpTA
2717                               + py_za_tx_01032005.trc_LibFpPO) - py_za_tx_01032005.bal_SITE_YTD;
2718 
2719                py_za_tx_01032005.trc_PayeVal := -1*py_za_tx_01032005.bal_PAYE_YTD;
2720             ELSE
2721                hr_utility.set_location('py_za_tx_utl_01032005.SitPaySplit',9);
2722                py_za_tx_01032005.trc_SiteVal := l_SitAblTx - py_za_tx_01032005.bal_SITE_YTD;
2723 
2724                py_za_tx_01032005.trc_PayeVal := (
2725                  ( py_za_tx_01032005.bal_TAX_YTD
2726                  + py_za_tx_01032005.trc_LibFpNI
2727                  + py_za_tx_01032005.trc_LibFpFB
2728                  + py_za_tx_01032005.trc_LibFpBP
2729                  + py_za_tx_01032005.trc_LibFpAB
2730                  + py_za_tx_01032005.trc_LibFpAP
2731                  + py_za_tx_01032005.trc_LibFpTA
2732                  + py_za_tx_01032005.trc_LibFpPO
2733                  ) - l_SitAblTx) - py_za_tx_01032005.bal_PAYE_YTD;
2734             END IF;
2735          END IF;
2736       ELSE
2737          hr_utility.set_location('py_za_tx_utl_01032005.SitPaySplit',10);
2738          py_za_tx_01032005.trc_PayeVal := -1*py_za_tx_01032005.bal_PAYE_YTD;
2739          py_za_tx_01032005.trc_SiteVal := -1*py_za_tx_01032005.bal_SITE_YTD;
2740       END IF;
2741 -- Seasonal Worker Status
2742 --
2743    ELSIF py_za_tx_01032005.dbi_TX_STA = 'G' THEN
2744       hr_utility.set_location('py_za_tx_utl_01032005.SitPaySplit',11);
2745    -- Get the SitFactor YTD
2746       py_za_tx_01032005.trc_SitFactor := py_za_tx_01032005.glb_ZA_WRK_DYS_PR_YR / py_za_tx_01032005.bal_TOT_SEA_WRK_DYS_WRK_YTD;
2747    -- Get the Tax Liability on the Site Limit
2748       l_TxOnSitLim := TaxLiability(p_Amt => py_za_tx_01032005.glb_ZA_SIT_LIM)/py_za_tx_01032005.trc_SitFactor;
2749    -- Get the Tax Amount Liable for SITE
2750       l_SitAblTx := ( py_za_tx_01032005.bal_TX_ON_NI_YTD
2751                     + py_za_tx_01032005.bal_TX_ON_FB_YTD
2752                     + py_za_tx_01032005.bal_TX_ON_AP_YTD
2753                     + py_za_tx_01032005.trc_LibFpNI
2754                     + py_za_tx_01032005.trc_LibFpFB
2755                     + py_za_tx_01032005.trc_LibFpAP
2756                     );
2757    -- Check the Limit
2758       IF l_SitAblTx > l_TxOnSitLim THEN
2759          hr_utility.set_location('py_za_tx_utl_01032005.SitPaySplit',12);
2760          py_za_tx_01032005.trc_SiteVal := l_TxOnSitLim - py_za_tx_01032005.bal_SITE_YTD;
2761          py_za_tx_01032005.trc_PayeVal := ( (py_za_tx_01032005.bal_TX_ON_PO_YTD + py_za_tx_01032005.trc_LibFpPO)
2762                                           + (l_SitAblTx - l_TxOnSitLim)
2763                                           ) - py_za_tx_01032005.bal_PAYE_YTD;
2764       ELSE
2765          hr_utility.set_location('py_za_tx_utl_01032005.SitPaySplit',13);
2766          py_za_tx_01032005.trc_SiteVal := l_SitAblTx - py_za_tx_01032005.bal_SITE_YTD;
2767          py_za_tx_01032005.trc_PayeVal := py_za_tx_01032005.bal_TX_ON_PO_YTD
2768                                         + py_za_tx_01032005.trc_LibFpPO
2769                                         - py_za_tx_01032005.bal_PAYE_YTD;
2770       END IF;
2771 -- Private Director
2772 --
2773    ELSIF py_za_tx_01032005.dbi_TX_STA = 'M' THEN
2774       IF (SitePeriod AND NOT PreErnPeriod) OR EmpTermPrePeriod THEN
2775          hr_utility.set_location('py_za_tx_utl_01032005.SitPaySplit',14);
2776          py_za_tx_01032005.trc_PayeVal :=
2777             ( py_za_tx_01032005.bal_TAX_YTD
2778             + py_za_tx_01032005.trc_LibFpDR
2779             + py_za_tx_01032005.trc_LibFpNI
2780             + py_za_tx_01032005.trc_LibFpFB
2781             + py_za_tx_01032005.trc_LibFpTA
2782             + py_za_tx_01032005.trc_LibFpBP
2783             + py_za_tx_01032005.trc_LibFpAB
2784             + py_za_tx_01032005.trc_LibFpAP
2785             + py_za_tx_01032005.trc_LibFpPO
2786             ) - py_za_tx_01032005.bal_PAYE_YTD;
2787          py_za_tx_01032005.trc_SiteVal := -1*py_za_tx_01032005.bal_SITE_YTD;
2788       ELSE
2789          hr_utility.set_location('py_za_tx_utl_01032005.SitPaySplit',15);
2790          py_za_tx_01032005.trc_PayeVal := -1*py_za_tx_01032005.bal_PAYE_YTD;
2791          py_za_tx_01032005.trc_SiteVal := -1*py_za_tx_01032005.bal_SITE_YTD;
2792       END IF;
2793 -- All Other Statuses
2794 --
2795    ELSE -- set the globals to zero
2796       hr_utility.set_location('py_za_tx_utl_01032005.SitPaySplit',16);
2797       py_za_tx_01032005.trc_PayeVal := 0 - py_za_tx_01032005.bal_PAYE_YTD;
2798       py_za_tx_01032005.trc_SiteVal := 0 - py_za_tx_01032005.bal_SITE_YTD;
2799    END IF;
2800 
2801 EXCEPTION
2802    WHEN OTHERS THEN
2803       IF py_za_tx_01032005.xpt_Msg = 'No Error' THEN
2804          py_za_tx_01032005.xpt_Msg := 'SitPaySplit: '||TO_CHAR(SQLCODE);
2805       END IF;
2806       RAISE py_za_tx_01032005.xpt_E;
2807 END SitPaySplit;
2808 -------------------------------------------------------------------------------
2809 -- Trace Function                                                            --
2810 -------------------------------------------------------------------------------
2811 PROCEDURE Trace AS
2812 BEGIN
2813 
2814 /*DELETE FROM pay_za_tax_traces pztt
2815    WHERE pztt.prl_act_id not in (
2816    SELECT payroll_action_id
2817      from pay_payroll_actions)
2818 */
2819    INSERT INTO pay_za_tax_traces(
2820     ASG_ACT_ID
2821    ,ASG_ID
2822    ,PRL_ACT_ID
2823    ,PRL_ID
2824    ,TX_STA
2825    ,PER_AGE
2826    ,CalTyp
2827    ,TX_DIR_VAL
2828    ,It3Ind
2829    ,TxPercVal
2830    ,ASG_STRT_DTE
2831    ,ZA_ACT_END_DTE
2832    ,ZA_CUR_PRD_STRT_DTE
2833    ,ZA_CUR_PRD_END_DTE
2834    ,ZA_TX_YR_STRT
2835    ,ZA_TX_YR_END
2836    ,SES_DTE
2837    ,PrdFactor
2838    ,PosFactor
2839    ,SitFactor
2840    ,ZA_PAY_PRDS_LFT
2841    ,ZA_PAY_PRDS_PER_YR
2842    ,ZA_DYS_IN_YR
2843    ,SEA_WRK_DYS_WRK
2844    ,BP_TX_RCV
2845    ,TxbIncPtd
2846    ,BseErn
2847    ,TxbBseInc
2848    ,TotLibBse
2849    ,TxbIncYtd
2850    ,PerTxbInc
2851    ,PerPenFnd
2852    ,PerRfiCon
2853    ,PerRfiTxb
2854    ,PerPenFndMax
2855    ,PerPenFndAbm
2856    ,AnnTxbInc
2857    ,AnnPenFnd
2858    ,AnnRfiCon
2859    ,AnnRfiTxb
2860    ,AnnPenFndMax
2861    ,AnnPenFndAbm
2862    ,ArrPenFnd
2863    ,ArrPenFndAbm
2864    ,AnnArrPenFnd
2865    ,AnnArrPenFndAbm
2866    ,RetAnu
2867    ,NrfiCon
2868    ,RetAnuMax
2869    ,RetAnuAbm
2870    ,AnnRetAnu
2871    ,AnnNrfiCon
2872    ,AnnRetAnuMax
2873    ,AnnRetAnuAbm
2874    ,ArrRetAnu
2875    ,ArrRetAnuAbm
2876    ,AnnArrRetAnu
2877    ,AnnArrRetAnuAbm
2878    ,Rebate
2879    ,Threshold
2880    ,MedAidAbm
2881    ,PerTotAbm
2882    ,AnnTotAbm
2883    ,NorIncYtd
2884    ,NorIncPtd
2885    ,NorErn
2886    ,TxbNorInc
2887    ,LibFyNI
2888    ,TX_ON_NI_YTD
2889    ,TX_ON_NI_PTD
2890    ,LibFpNI
2891    ,FrnBenYtd
2892    ,FrnBenPtd
2893    ,FrnBenErn
2894    ,TxbFrnInc
2895    ,LibFyFB
2896    ,TX_ON_FB_YTD
2897    ,TX_ON_FB_PTD
2898    ,LibFpFB
2899    ,TrvAllYtd
2900    ,TrvAllPtd
2901    ,TrvAllErn
2902    ,TxbTrvInc
2903    ,LibFyTA
2904    ,TX_ON_TA_YTD
2905    ,TX_ON_TA_PTD
2906    ,LibFpTA
2907    ,BonProYtd
2908    ,BonProPtd
2909    ,BonProErn
2910    ,TxbBonProInc
2911    ,LibFyBP
2912    ,TX_ON_BP_YTD
2913    ,TX_ON_BP_PTD
2914    ,LibFpBP
2915    ,AnnBonYtd
2916    ,AnnBonErn
2917    ,TxbAnnBonInc
2918    ,LibFyAB
2919    ,TX_ON_AB_YTD
2920    ,TX_ON_AB_PTD
2921    ,LibFpAB
2922    ,AnnPymYtd
2923    ,AnnPymPtd
2924    ,AnnPymErn
2925    ,TxbAnnPymInc
2926    ,LibFyAP
2927    ,TX_ON_AP_YTD
2928    ,TX_ON_AP_PTD
2929    ,LibFpAP
2930    ,PblOffYtd
2931    ,PblOffPtd
2932    ,PblOffErn
2933    ,LibFyPO
2934    ,TX_ON_PO_YTD
2935    ,TX_ON_PO_PTD
2936    ,LibFpPO
2937    ,LibWrn
2938    ,PayValue
2939    ,PayeVal
2940    ,SiteVal
2941    )
2942    VALUES(
2943     py_za_tx_01032005.con_ASG_ACT_ID
2944    ,py_za_tx_01032005.con_ASG_ID
2945    ,py_za_tx_01032005.con_PRL_ACT_ID
2946    ,py_za_tx_01032005.con_PRL_ID
2947    ,py_za_tx_01032005.dbi_TX_STA
2948    ,py_za_tx_01032005.dbi_PER_AGE
2949    ,py_za_tx_01032005.trc_CalTyp
2950    ,py_za_tx_01032005.dbi_TX_DIR_VAL
2951    ,py_za_tx_01032005.trc_It3Ind
2952    ,py_za_tx_01032005.trc_TxPercVal
2953    ,py_za_tx_01032005.dbi_ZA_ACT_STRT_DTE
2954    ,py_za_tx_01032005.dbi_ZA_ACT_END_DTE
2955    ,py_za_tx_01032005.dbi_ZA_CUR_PRD_STRT_DTE
2956    ,py_za_tx_01032005.dbi_ZA_CUR_PRD_END_DTE
2957    ,py_za_tx_01032005.dbi_ZA_TX_YR_STRT
2958    ,py_za_tx_01032005.dbi_ZA_TX_YR_END
2959    ,py_za_tx_01032005.dbi_SES_DTE
2960    ,py_za_tx_01032005.trc_PrdFactor
2961    ,py_za_tx_01032005.trc_PosFactor
2962    ,py_za_tx_01032005.trc_SitFactor
2963    ,py_za_tx_01032005.dbi_ZA_PAY_PRDS_LFT
2964    ,py_za_tx_01032005.dbi_ZA_PAY_PRDS_PER_YR
2965    ,py_za_tx_01032005.dbi_ZA_DYS_IN_YR
2966    ,py_za_tx_01032005.dbi_SEA_WRK_DYS_WRK
2967    ,py_za_tx_01032005.dbi_BP_TX_RCV
2968    ,py_za_tx_01032005.trc_TxbIncPtd
2969    ,py_za_tx_01032005.trc_BseErn
2970    ,py_za_tx_01032005.trc_TxbBseInc
2971    ,py_za_tx_01032005.trc_TotLibBse
2972    ,py_za_tx_01032005.trc_TxbIncYtd
2973    ,py_za_tx_01032005.trc_PerTxbInc
2974    ,py_za_tx_01032005.trc_PerPenFnd
2975    ,py_za_tx_01032005.trc_PerRfiCon
2976    ,py_za_tx_01032005.trc_PerRfiTxb
2977    ,py_za_tx_01032005.trc_PerPenFndMax
2978    ,py_za_tx_01032005.trc_PerPenFndAbm
2979    ,py_za_tx_01032005.trc_AnnTxbInc
2980    ,py_za_tx_01032005.trc_AnnPenFnd
2981    ,py_za_tx_01032005.trc_AnnRfiCon
2982    ,py_za_tx_01032005.trc_AnnRfiTxb
2983    ,py_za_tx_01032005.trc_AnnPenFndMax
2984    ,py_za_tx_01032005.trc_AnnPenFndAbm
2985    ,py_za_tx_01032005.trc_PerArrPenFnd
2986    ,py_za_tx_01032005.trc_PerArrPenFndAbm
2987    ,py_za_tx_01032005.trc_AnnArrPenFnd
2988    ,py_za_tx_01032005.trc_AnnArrPenFndAbm
2989    ,py_za_tx_01032005.trc_PerRetAnu
2990    ,py_za_tx_01032005.trc_PerNrfiCon
2991    ,py_za_tx_01032005.trc_PerRetAnuMax
2992    ,py_za_tx_01032005.trc_PerRetAnuAbm
2993    ,py_za_tx_01032005.trc_AnnRetAnu
2994    ,py_za_tx_01032005.trc_AnnNrfiCon
2995    ,py_za_tx_01032005.trc_AnnRetAnuMax
2996    ,py_za_tx_01032005.trc_AnnRetAnuAbm
2997    ,py_za_tx_01032005.trc_PerArrRetAnu
2998    ,py_za_tx_01032005.trc_PerArrRetAnuAbm
2999    ,py_za_tx_01032005.trc_AnnArrRetAnu
3000    ,py_za_tx_01032005.trc_AnnArrRetAnuAbm
3001    ,py_za_tx_01032005.trc_Rebate
3002    ,py_za_tx_01032005.trc_Threshold
3003    ,py_za_tx_01032005.trc_MedAidAbm
3004    ,py_za_tx_01032005.trc_PerTotAbm
3005    ,py_za_tx_01032005.trc_AnnTotAbm
3006    ,py_za_tx_01032005.trc_NorIncYtd
3007    ,py_za_tx_01032005.trc_NorIncPtd
3008    ,py_za_tx_01032005.trc_NorErn
3009    ,py_za_tx_01032005.trc_TxbNorInc
3010    ,py_za_tx_01032005.trc_LibFyNI
3011    ,py_za_tx_01032005.bal_TX_ON_NI_YTD
3012    ,py_za_tx_01032005.bal_TX_ON_NI_PTD
3013    ,py_za_tx_01032005.trc_LibFpNI
3014    ,py_za_tx_01032005.trc_FrnBenYtd
3015    ,py_za_tx_01032005.trc_FrnBenPtd
3016    ,py_za_tx_01032005.trc_FrnBenErn
3017    ,py_za_tx_01032005.trc_TxbFrnInc
3018    ,py_za_tx_01032005.trc_LibFyFB
3019    ,py_za_tx_01032005.bal_TX_ON_FB_YTD
3020    ,py_za_tx_01032005.bal_TX_ON_FB_PTD
3021    ,py_za_tx_01032005.trc_LibFpFB
3022    ,py_za_tx_01032005.trc_TrvAllYtd
3023    ,py_za_tx_01032005.trc_TrvAllPtd
3024    ,py_za_tx_01032005.trc_TrvAllErn
3025    ,py_za_tx_01032005.trc_TxbTrvInc
3026    ,py_za_tx_01032005.trc_LibFyTA
3027    ,py_za_tx_01032005.bal_TX_ON_TA_YTD
3028    ,py_za_tx_01032005.bal_TX_ON_TA_PTD
3029    ,py_za_tx_01032005.trc_LibFpTA
3030    ,py_za_tx_01032005.trc_BonProYtd
3031    ,py_za_tx_01032005.trc_BonProPtd
3032    ,py_za_tx_01032005.trc_BonProErn
3033    ,py_za_tx_01032005.trc_TxbBonProInc
3034    ,py_za_tx_01032005.trc_LibFyBP
3035    ,py_za_tx_01032005.bal_TX_ON_BP_YTD
3036    ,py_za_tx_01032005.bal_TX_ON_BP_PTD
3037    ,py_za_tx_01032005.trc_LibFpBP
3038    ,py_za_tx_01032005.trc_AnnBonYtd
3039    ,py_za_tx_01032005.trc_AnnBonErn
3040    ,py_za_tx_01032005.trc_TxbAnnBonInc
3041    ,py_za_tx_01032005.trc_LibFyAB
3042    ,py_za_tx_01032005.bal_TX_ON_AB_YTD
3043    ,py_za_tx_01032005.bal_TX_ON_AB_PTD
3044    ,py_za_tx_01032005.trc_LibFpAB
3045    ,py_za_tx_01032005.trc_AnnPymYtd
3046    ,py_za_tx_01032005.trc_AnnPymPtd
3047    ,py_za_tx_01032005.trc_AnnPymErn
3048    ,py_za_tx_01032005.trc_TxbAnnPymInc
3049    ,py_za_tx_01032005.trc_LibFyAP
3050    ,py_za_tx_01032005.bal_TX_ON_AP_YTD
3051    ,py_za_tx_01032005.bal_TX_ON_AP_PTD
3052    ,py_za_tx_01032005.trc_LibFpAP
3053    ,py_za_tx_01032005.trc_PblOffYtd
3054    ,py_za_tx_01032005.trc_PblOffPtd
3055    ,py_za_tx_01032005.trc_PblOffErn
3056    ,py_za_tx_01032005.trc_LibFyPO
3057    ,py_za_tx_01032005.bal_TX_ON_PO_YTD
3058    ,py_za_tx_01032005.bal_TX_ON_PO_PTD
3059    ,py_za_tx_01032005.trc_LibFpPO
3060    ,py_za_tx_01032005.trc_LibWrn
3061    ,py_za_tx_01032005.trc_PayValSD
3062    ,py_za_tx_01032005.trc_PayeVal
3063    ,py_za_tx_01032005.trc_SiteVal);
3064 
3065 EXCEPTION
3066    WHEN OTHERS THEN
3067       IF py_za_tx_01032005.xpt_Msg = 'No Error' THEN
3068          py_za_tx_01032005.xpt_Msg := 'Trace: '||TO_CHAR(SQLCODE);
3069       END IF;
3070       RAISE py_za_tx_01032005.xpt_E;
3071 END Trace;
3072 -------------------------------------------------------------------------------
3073 -- ClearGlobals                                                              --
3074 -------------------------------------------------------------------------------
3075 PROCEDURE ClearGlobals AS
3076 
3077 BEGIN
3078    hr_utility.set_location('py_za_tx_utl_01032005.ClearGlobals',1);
3079    -- Calculation Type
3080    py_za_tx_01032005.trc_CalTyp               := 'Unknown';
3081    -- Factors
3082    py_za_tx_01032005.trc_TxbIncPtd            := 0;
3083    py_za_tx_01032005.trc_PrdFactor            := 0;
3084    py_za_tx_01032005.trc_PosFactor            := 0;
3085    py_za_tx_01032005.trc_SitFactor            := 1;
3086    -- Deemed Remuneration
3087    py_za_tx_01032005.trc_DmdRmnRun            := 0;
3088    py_za_tx_01032005.trc_TxbDmdRmn            := 0;
3089    py_za_tx_01032005.trc_TotLibDR             := 0;
3090    py_za_tx_01032005.trc_LibFyDR              := 0;
3091    py_za_tx_01032005.trc_LibFpDR              := 0;
3092    -- Base Income
3093    py_za_tx_01032005.trc_BseErn               := 0;
3094    py_za_tx_01032005.trc_TxbBseInc            := 0;
3095    py_za_tx_01032005.trc_TotLibBse            := 0;
3096    -- Period Pension Fund
3097    py_za_tx_01032005.trc_TxbIncYtd            := 0;
3098    py_za_tx_01032005.trc_PerTxbInc            := 0;
3099    py_za_tx_01032005.trc_PerPenFnd            := 0;
3100    py_za_tx_01032005.trc_PerRfiCon            := 0;
3101    py_za_tx_01032005.trc_PerRfiTxb            := 0;
3102    py_za_tx_01032005.trc_PerPenFndMax         := 0;
3103    py_za_tx_01032005.trc_PerPenFndAbm         := 0;
3104    -- Annual Pension Fund
3105    py_za_tx_01032005.trc_AnnTxbInc            := 0;
3106    py_za_tx_01032005.trc_AnnPenFnd            := 0;
3107    py_za_tx_01032005.trc_AnnRfiCon            := 0;
3108    py_za_tx_01032005.trc_AnnRfiTxb            := 0;
3109    py_za_tx_01032005.trc_AnnPenFndMax         := 0;
3110    py_za_tx_01032005.trc_AnnPenFndAbm         := 0;
3111    -- Period Arrear Pension
3112    py_za_tx_01032005.trc_PerArrPenFnd         := 0;
3113    py_za_tx_01032005.trc_PerArrPenFndAbm      := 0;
3114    -- Annual Arrear Pension
3115    py_za_tx_01032005.trc_AnnArrPenFnd         := 0;
3116    py_za_tx_01032005.trc_AnnArrPenFndAbm      := 0;
3117    -- Arrear Excess Update Value
3118    py_za_tx_01032005.trc_PfUpdFig             := 0;
3119    -- Period Retirement Annuity
3120    py_za_tx_01032005.trc_PerRetAnu            := 0;
3121    py_za_tx_01032005.trc_PerNrfiCon           := 0;
3122    py_za_tx_01032005.trc_PerRetAnuMax         := 0;
3123    py_za_tx_01032005.trc_PerRetAnuAbm         := 0;
3124    -- Annual Retirement Annuity
3125    py_za_tx_01032005.trc_AnnRetAnu            := 0;
3126    py_za_tx_01032005.trc_AnnNrfiCon           := 0;
3127    py_za_tx_01032005.trc_AnnRetAnuMax         := 0;
3128    py_za_tx_01032005.trc_AnnRetAnuAbm         := 0;
3129    -- Period Arrear Retirement Annuity
3130    py_za_tx_01032005.trc_PerArrRetAnu         := 0;
3131    py_za_tx_01032005.trc_PerArrRetAnuAbm      := 0;
3132    -- Annual Arrear Retirement Annuity
3133    py_za_tx_01032005.trc_AnnArrRetAnu         := 0;
3134    py_za_tx_01032005.trc_AnnArrRetAnuAbm      := 0;
3135    -- Arrear Excess Update Value
3136    py_za_tx_01032005.trc_RaUpdFig             := 0;
3137    -- Rebates Thresholds and Med Aid
3138    py_za_tx_01032005.trc_Rebate               := 0;
3139    py_za_tx_01032005.trc_Threshold            := 0;
3140    py_za_tx_01032005.trc_MedAidAbm            := 0;
3141    -- Abatement Totals
3142    py_za_tx_01032005.trc_PerTotAbm            := 0;
3143    py_za_tx_01032005.trc_AnnTotAbm            := 0;
3144    -- Normal Income
3145    py_za_tx_01032005.trc_NorIncYtd            := 0;
3146    py_za_tx_01032005.trc_NorIncPtd            := 0;
3147    py_za_tx_01032005.trc_NorErn               := 0;
3148    py_za_tx_01032005.trc_TxbNorInc            := 0;
3149    py_za_tx_01032005.trc_TotLibNI             := 0;
3150    py_za_tx_01032005.trc_LibFyNI              := 0;
3151    py_za_tx_01032005.trc_LibFpNI              := 0;
3152    -- Fringe Benefits
3153    py_za_tx_01032005.trc_FrnBenYtd            := 0;
3154    py_za_tx_01032005.trc_FrnBenPtd            := 0;
3155    py_za_tx_01032005.trc_FrnBenErn            := 0;
3156    py_za_tx_01032005.trc_TxbFrnInc            := 0;
3157    py_za_tx_01032005.trc_TotLibFB             := 0;
3158    py_za_tx_01032005.trc_LibFyFB              := 0;
3159    py_za_tx_01032005.trc_LibFpFB              := 0;
3160    -- Travel Allowance
3161    py_za_tx_01032005.trc_TrvAllYtd            := 0;
3162    py_za_tx_01032005.trc_TrvAllPtd            := 0;
3163    py_za_tx_01032005.trc_TrvAllErn            := 0;
3164    py_za_tx_01032005.trc_TxbTrvInc            := 0;
3165    py_za_tx_01032005.trc_TotLibTA             := 0;
3166    py_za_tx_01032005.trc_LibFyTA              := 0;
3167    py_za_tx_01032005.trc_LibFpTA              := 0;
3168    -- Bonus Provision
3169    py_za_tx_01032005.trc_BonProYtd            := 0;
3170    py_za_tx_01032005.trc_BonProPtd            := 0;
3171    py_za_tx_01032005.trc_BonProErn            := 0;
3172    py_za_tx_01032005.trc_TxbBonProInc         := 0;
3173    py_za_tx_01032005.trc_TotLibBP             := 0;
3174    py_za_tx_01032005.trc_LibFyBP              := 0;
3175    py_za_tx_01032005.trc_LibFpBP              := 0;
3176    -- Annual Bonus
3177    py_za_tx_01032005.trc_AnnBonYtd            := 0;
3178    py_za_tx_01032005.trc_AnnBonPtd            := 0;
3179    py_za_tx_01032005.trc_AnnBonErn            := 0;
3180    py_za_tx_01032005.trc_TxbAnnBonInc         := 0;
3181    py_za_tx_01032005.trc_TotLibAB             := 0;
3182    py_za_tx_01032005.trc_LibFyAB              := 0;
3183    py_za_tx_01032005.trc_LibFpAB              := 0;
3184    -- Annual Payments
3185    py_za_tx_01032005.trc_AnnPymYtd            := 0;
3186    py_za_tx_01032005.trc_AnnPymPtd            := 0;
3187    py_za_tx_01032005.trc_AnnPymErn            := 0;
3188    py_za_tx_01032005.trc_TxbAnnPymInc         := 0;
3189    py_za_tx_01032005.trc_TotLibAP             := 0;
3190    py_za_tx_01032005.trc_LibFyAP              := 0;
3191    py_za_tx_01032005.trc_LibFpAP              := 0;
3192    -- Pubilc Office Allowance
3193    py_za_tx_01032005.trc_PblOffYtd            := 0;
3194    py_za_tx_01032005.trc_PblOffPtd            := 0;
3195    py_za_tx_01032005.trc_PblOffErn            := 0;
3196    py_za_tx_01032005.trc_LibFyPO              := 0;
3197    py_za_tx_01032005.trc_LibFpPO              := 0;
3198    -- Messages
3199    py_za_tx_01032005.trc_LibWrn               := ' ';
3200 
3201    -- Statutory Deduction Value
3202    py_za_tx_01032005.trc_PayValSD             := 0;
3203    -- Employer Contribution Value
3204    py_za_tx_01032005.trc_PayValEC             := 0;
3205    -- PAYE and SITE Values
3206    py_za_tx_01032005.trc_PayeVal              := 0;
3207    py_za_tx_01032005.trc_SiteVal              := 0;
3208    -- IT3A Threshold Indicator
3209    py_za_tx_01032005.trc_It3Ind               := 0;
3210    -- Tax Percentage Value On trace
3211    py_za_tx_01032005.trc_TxPercVal            := 0;
3212    -- Total Taxable Income Update Figure
3213    py_za_tx_01032005.trc_OUpdFig              := 0;
3214 
3215    -- Net Taxable Income Update Figure
3216    py_za_tx_01032005.trc_NtiUpdFig            := 0;
3217 
3218    -- ValidateTaxOns Override Globals
3219    py_za_tx_01032005.trc_LibFpDROvr           := FALSE;
3220    py_za_tx_01032005.trc_LibFpNIOvr           := FALSE;
3221    py_za_tx_01032005.trc_LibFpFBOvr           := FALSE;
3222    py_za_tx_01032005.trc_LibFpTAOvr           := FALSE;
3223    py_za_tx_01032005.trc_LibFpBPOvr           := FALSE;
3224    py_za_tx_01032005.trc_LibFpABOvr           := FALSE;
3225    py_za_tx_01032005.trc_LibFpAPOvr           := FALSE;
3226    py_za_tx_01032005.trc_LibFpPOOvr           := FALSE;
3227 
3228    -- Global Exception Message
3229    py_za_tx_01032005.xpt_Msg                  := 'No Error';
3230 
3231    -- Override Globals
3232    py_za_tx_01032005.trc_OvrTxCalc            := FALSE;
3233    py_za_tx_01032005.trc_OvrTyp               := 'V';
3234    py_za_tx_01032005.trc_OvrPrc               := 0;
3235    py_za_tx_01032005.trc_OvrWrn               := ' ';
3236 
3237    -- Negative Ptd Global
3238    py_za_tx_01032005.trc_NegPtd               := FALSE;
3239 
3240 EXCEPTION
3241    WHEN OTHERS THEN
3242       IF py_za_tx_01032005.xpt_Msg = 'No Error' THEN
3243          py_za_tx_01032005.xpt_Msg := 'ClearGlobals: '||TO_CHAR(SQLCODE);
3244       END IF;
3245       RAISE py_za_tx_01032005.xpt_E;
3246 END ClearGlobals;
3247 
3248 
3249 
3250 END py_za_tx_utl_01032005;
3251