DBA Data[Home] [Help]

PACKAGE BODY: APPS.PY_ZA_TX_UTL_01032004

Source


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