DBA Data[Home] [Help]

PACKAGE BODY: APPS.PY_ZA_TX_UTL_01032000

Source


1 PACKAGE BODY py_za_tx_utl_01032000 AS
2 /* $Header: pyzatu01.pkb 120.2 2005/06/28 00:12:22 kapalani 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_01032000.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       RetroInPrd
20          Boolean function returns true if a retro action
21          took place in the specified period
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.4     Bug 3491357 BRA Enhancement.
111                                                Balance value retrieval modified
112       L.Kloppers  31/01/2001         115.0     Changed ptp.attribute1 to
113                                                        ptp.prd_information1
114       J.N. Louw   13/12/2000         110.3     Updated SitPaySplit to fire for
115                                                   Latepayperiod
116       J.N. Louw   28/09/2000         110.2     Added SetRebates procedure
117                                                Modified Abatements procedure
118       J.N. Louw   28/09/2000         110.1     Fixed NpVal Bug
119       J.N. Louw   27/09/2000         110.0     First Created
120 */
121 
122 /* PACKAGE BODY */
123 
124 -- StartHrTrace
125 -- Wrapper for hr_utility.trace_on
126 PROCEDURE StartHrTrace AS
127 BEGIN
128    IF g_HrTraceEnabled THEN
129       hr_utility.trace_on(null,g_HrTracePipeName);
130    END IF;
131 END StartHrTrace;
132 
133 -- StopHrTrace
134 -- Wrapper for hr_utility.trace_off
135 PROCEDURE StopHrTrace AS
136 BEGIN
137    IF g_HrTraceEnabled THEN
138       hr_utility.trace_off;
139    END IF;
140 END StopHrTrace;
141 
142 -- WriteHrTrace
143 -- Wrapper for hr_utility.trace
144 PROCEDURE WriteHrTrace(
145    p_Buffer VARCHAR2
146    )
147 AS
148 BEGIN
149    IF g_HrTraceEnabled THEN
150    -- Write the Line
151       hr_utility.trace(p_Buffer);
152    END IF;
153 END WriteHrTrace;
154 
155 
156 
157 -- Tax Utility Functions
158 --
159 
160 FUNCTION GlbVal
161    (p_GlbNme ff_globals_f.global_name%TYPE
162    ,p_EffDte DATE
163    ) RETURN ff_globals_f.global_value%TYPE
164 AS
165 -- Variables
166    l_GlbVal NUMBER(15,2);
167 BEGIN
168    hr_utility.set_location('py_za_tx_utl_01032000.GlbVal',1);
169    WriteHrTrace('p_GlbNme :'||p_GlbNme);
170    WriteHrTrace('p_EffDte :'||to_char(p_EffDte,'DD/MM/YYYY'));
171    --
172    SELECT TO_NUMBER(global_value)
173      INTO l_GlbVal
174      FROM ff_globals_f
175     WHERE p_EffDte between effective_start_date and effective_end_date
176       AND global_name = p_GlbNme;
177 
178    hr_utility.set_location('py_za_tx_utl_01032000.GlbVal',2);
179    RETURN l_GlbVal;
180 
181 EXCEPTION
182    WHEN OTHERS THEN
183       IF py_za_tx_01032000.xpt_Msg = 'No Error' THEN
184          py_za_tx_01032000.xpt_Msg := 'GlbVal: '||TO_CHAR(SQLCODE);
185       END IF;
186       RAISE py_za_tx_01032000.xpt_E;
187 END GlbVal;
188 
189 FUNCTION RetroInPrd RETURN BOOLEAN AS
190    CURSOR c_RetActs(
191         p_AsgId       pay_assignment_actions.assignment_id%TYPE
192       , p_AsgActSeq   pay_assignment_actions.action_sequence%TYPE
193       , p_TimPrdId    pay_payroll_actions.time_period_id%TYPE
194       )
195    IS
196       SELECT 1
197         FROM pay_payroll_actions ppa
198            , pay_assignment_actions paa
199        WHERE paa.assignment_id = p_AsgId
200          AND paa.action_sequence < p_AsgActSeq
201          AND paa.payroll_action_id = ppa.payroll_action_id
202          AND ppa.time_period_id = p_TimPrdId
203          AND ppa.action_status = 'C'
204          AND ppa.action_type IN ('O','G');
205 
206    l_AsgActSeq     pay_assignment_actions.action_sequence%TYPE;
207    l_TimPrdId      pay_payroll_actions.time_period_id%TYPE;
208    v_RetActs       c_RetActs%ROWTYPE;
209 --   l_RetroInPeriod BOOLEAN DEFAULT FALSE;
210 
211 BEGIN
212    hr_utility.set_location('py_za_tx_utl_01032000.RetroInPrd',1);
213 -- Get Assignment_Action.Action_Sequence
214    SELECT paa.action_sequence
215         , ppa.time_period_id
216      INTO l_AsgActSeq
217         , l_TimPrdId
218      FROM pay_assignment_actions paa
219         , pay_payroll_actions ppa
220     WHERE paa.assignment_action_id = py_za_tx_01032000.con_ASG_ACT_ID
221       AND paa.payroll_action_id = ppa.payroll_action_id;
222 
223    hr_utility.set_location('py_za_tx_utl_01032000.RetroInPrd',2);
224    WriteHrTrace('p_AsgId: '||to_char(py_za_tx_01032000.con_ASG_ID));
225    WriteHrTrace('p_AsgActSeq: '||to_char(l_AsgActSeq));
226    WriteHrTrace('p_TimPrdId: '||to_char(l_TimPrdId));
227 
228 -- Was there a Retropay action in the period?
229    OPEN c_RetActs(
230         p_AsgId       => py_za_tx_01032000.con_ASG_ID
231       , p_AsgActSeq   => l_AsgActSeq
232       , p_TimPrdId    => l_TimPrdId
233       );
234    FETCH c_RetActs INTO v_RetActs;
235       hr_utility.set_location('py_za_tx_utl_01032000.RetroInPrd',3);
236       IF c_RetActs%FOUND THEN
237          hr_utility.set_location('py_za_tx_utl_01032000.RetroInPrd',4);
238          --l_RetroInPeriod := TRUE;
239          py_za_tx_01032000.trc_RetroInPeriod := TRUE;
240       END IF;
241    CLOSE c_RetActs;
242 
243    hr_utility.set_location('py_za_tx_utl_01032000.RetroInPrd',5);
244    RETURN py_za_tx_01032000.trc_RetroInPeriod;
245 
246 EXCEPTION
247    WHEN OTHERS THEN
248       IF py_za_tx_01032000.xpt_Msg = 'No Error' THEN
249          py_za_tx_01032000.xpt_Msg := 'RetroInPrd: '||TO_CHAR(SQLCODE);
250       END IF;
251       RAISE py_za_tx_01032000.xpt_E;
252 END RetroInPrd;
253 
254 FUNCTION LatePayPeriod RETURN BOOLEAN AS
255 -- Variables
256    l_CurTxYear NUMBER(15);
257 BEGIN
258    hr_utility.set_location('py_za_tx_utl_01032000.LatePayPeriod',1);
259 -- IF the employee's assignment ended before the current tax year
260 -- it's a Late Pay Period
261    IF py_za_tx_01032000.dbi_ZA_ACT_END_DTE < py_za_tx_01032000.dbi_ZA_TX_YR_STRT THEN
262 
263       hr_utility.set_location('py_za_tx_utl_01032000.LatePayPeriod',2);
264 
265    -- Valid Late Pay Period?
266    --
267    -- Current Tax Year
268       l_CurTxYear := to_number(to_char(py_za_tx_01032000.dbi_ZA_TX_YR_END,'YYYY'));
269 
270    -- Assignment's Tax Year
271       SELECT ptp.prd_information1
272         INTO py_za_tx_01032000.trc_AsgTxYear
273         FROM per_time_periods ptp
274        WHERE ptp.payroll_id = py_za_tx_01032000.con_PRL_ID
275          AND py_za_tx_01032000.dbi_ZA_ACT_END_DTE BETWEEN ptp.start_date AND ptp.end_date;
276 
277       hr_utility.set_location('py_za_tx_utl_01032000.LatePayPeriod',3);
278 
279       IF (l_CurTxYear - py_za_tx_01032000.trc_AsgTxYear) > 1 THEN
280          hr_utility.set_location('py_za_tx_utl_01032000.LatePayPeriod',4);
281          hr_utility.set_message(801, 'Late Payment Across Two Tax Years!');
282          hr_utility.raise_error;
283       ELSE
284          hr_utility.set_location('py_za_tx_utl_01032000.LatePayPeriod',5);
285          RETURN TRUE;
286       END IF;
287 
288    ELSE
289       hr_utility.set_location('py_za_tx_utl_01032000.LatePayPeriod',6);
290       RETURN FALSE;
291    END IF;
292 
293 EXCEPTION
294    WHEN OTHERS THEN
295       IF py_za_tx_01032000.xpt_Msg = 'No Error' THEN
296          py_za_tx_01032000.xpt_Msg := 'LatePayPeriod: '||TO_CHAR(SQLCODE);
297       END IF;
298       RAISE py_za_tx_01032000.xpt_E;
299 END LatePayPeriod;
300 
301 FUNCTION LstPeriod RETURN BOOLEAN AS
302 BEGIN
303    -- Is this the last period for the tax year
304    --
305    IF py_za_tx_01032000.dbi_ZA_PAY_PRDS_LFT = 1 THEN
306       hr_utility.set_location('py_za_tx_utl_01032000.LstPeriod',1);
307       RETURN TRUE;
308    ELSE
309       hr_utility.set_location('py_za_tx_utl_01032000.LstPeriod',2);
310       RETURN FALSE;
311    END IF;
312 
313 EXCEPTION
314    WHEN OTHERS THEN
315       IF py_za_tx_01032000.xpt_Msg = 'No Error' THEN
316          py_za_tx_01032000.xpt_Msg := 'LstPeriod: '||TO_CHAR(SQLCODE);
317       END IF;
318       RAISE py_za_tx_01032000.xpt_E;
319 END LstPeriod;
320 
321 FUNCTION EmpTermInPeriod RETURN BOOLEAN AS
322 
323 BEGIN
324    -- Was the employee terminated in the current period
325    --
326    IF py_za_tx_01032000.dbi_ZA_ACT_END_DTE BETWEEN py_za_tx_01032000.dbi_ZA_CUR_PRD_STRT_DTE AND py_za_tx_01032000.dbi_ZA_CUR_PRD_END_DTE THEN
327       hr_utility.set_location('py_za_tx_utl_01032000.EmpTermInPeriod',1);
328       RETURN TRUE;
329    ELSE
330       hr_utility.set_location('py_za_tx_utl_01032000.EmpTermInPeriod',2);
331       RETURN FALSE;
332    END IF;
333 
334 EXCEPTION
335    WHEN OTHERS THEN
336       IF py_za_tx_01032000.xpt_Msg = 'No Error' THEN
337          py_za_tx_01032000.xpt_Msg := 'EmpTermInPeriod: '||TO_CHAR(SQLCODE);
338       END IF;
339       RAISE py_za_tx_01032000.xpt_E;
340 END EmpTermInPeriod;
341 
342 FUNCTION EmpTermPrePeriod RETURN BOOLEAN AS
343 
344 BEGIN
345    -- Was the employee terminated before the current period
346    --
347    IF py_za_tx_01032000.dbi_ZA_ACT_END_DTE <= py_za_tx_01032000.dbi_ZA_CUR_PRD_STRT_DTE THEN
348       hr_utility.set_location('py_za_tx_utl_01032000.EmpTermPrePeriod',1);
349       RETURN TRUE;
350    ELSE
351       hr_utility.set_location('py_za_tx_utl_01032000.EmpTermPrePeriod',2);
352       RETURN FALSE;
353    END IF;
354 
355 EXCEPTION
356    WHEN OTHERS THEN
357       IF py_za_tx_01032000.xpt_Msg = 'No Error' THEN
358          py_za_tx_01032000.xpt_Msg := 'EmpTermPrePeriod: '||TO_CHAR(SQLCODE);
359       END IF;
360       RAISE py_za_tx_01032000.xpt_E;
361 END EmpTermPrePeriod;
362 
363 FUNCTION PreErnPeriod RETURN BOOLEAN AS
364 
365 BEGIN
366    -- PTD Taxable Income
367    --
368    py_za_tx_01032000.trc_TxbIncPtd :=
369       ( py_za_tx_01032000.bal_AST_PRCHD_RVAL_NRFI_PTD
370       + py_za_tx_01032000.bal_AST_PRCHD_RVAL_RFI_PTD
371       + py_za_tx_01032000.bal_BP_PTD
372       + py_za_tx_01032000.bal_BUR_AND_SCH_NRFI_PTD
373       + py_za_tx_01032000.bal_BUR_AND_SCH_RFI_PTD
374       + py_za_tx_01032000.bal_COMM_NRFI_PTD
375       + py_za_tx_01032000.bal_COMM_RFI_PTD
376       + py_za_tx_01032000.bal_COMP_ALL_NRFI_PTD
377       + py_za_tx_01032000.bal_COMP_ALL_RFI_PTD
378       + py_za_tx_01032000.bal_ENT_ALL_NRFI_PTD
379       + py_za_tx_01032000.bal_ENT_ALL_RFI_PTD
380       + py_za_tx_01032000.bal_FREE_ACCOM_NRFI_PTD
381       + py_za_tx_01032000.bal_FREE_ACCOM_RFI_PTD
382       + py_za_tx_01032000.bal_FREE_SERV_NRFI_PTD
383       + py_za_tx_01032000.bal_FREE_SERV_RFI_PTD
384       + py_za_tx_01032000.bal_LOW_LOANS_NRFI_PTD
385       + py_za_tx_01032000.bal_LOW_LOANS_RFI_PTD
386       + py_za_tx_01032000.bal_MLS_AND_VOUCH_NRFI_PTD
387       + py_za_tx_01032000.bal_MLS_AND_VOUCH_RFI_PTD
388       + py_za_tx_01032000.bal_MED_PAID_NRFI_PTD
389       + py_za_tx_01032000.bal_MED_PAID_RFI_PTD
390       + py_za_tx_01032000.bal_OTHER_TXB_ALL_NRFI_PTD
391       + py_za_tx_01032000.bal_OTHER_TXB_ALL_RFI_PTD
392       + py_za_tx_01032000.bal_OVTM_NRFI_PTD
393       + py_za_tx_01032000.bal_OVTM_RFI_PTD
394       + py_za_tx_01032000.bal_PYM_DBT_NRFI_PTD
395       + py_za_tx_01032000.bal_PYM_DBT_RFI_PTD
396       + py_za_tx_01032000.bal_RGT_AST_NRFI_PTD
397       + py_za_tx_01032000.bal_RGT_AST_RFI_PTD
398       + py_za_tx_01032000.bal_TXB_INC_NRFI_PTD
399       + py_za_tx_01032000.bal_TXB_INC_RFI_PTD
400       + py_za_tx_01032000.bal_TXB_PEN_NRFI_PTD
401       + py_za_tx_01032000.bal_TXB_PEN_RFI_PTD
402       + py_za_tx_01032000.bal_TEL_ALL_NRFI_PTD
403       + py_za_tx_01032000.bal_TEL_ALL_RFI_PTD
404       + py_za_tx_01032000.bal_TOOL_ALL_NRFI_PTD
405       + py_za_tx_01032000.bal_TOOL_ALL_RFI_PTD
406       + py_za_tx_01032000.bal_TA_NRFI_PTD
407       + py_za_tx_01032000.bal_TA_RFI_PTD
408       + py_za_tx_01032000.bal_USE_VEH_NRFI_PTD
409       + py_za_tx_01032000.bal_USE_VEH_RFI_PTD
410       );
411 
412    -- Ptd Annual Bonus
413    py_za_tx_01032000.trc_AnnBonPtd :=
414       ( py_za_tx_01032000.bal_AB_NRFI_RUN
415       + py_za_tx_01032000.bal_AB_RFI_RUN
416       );
417 
418    -- Ytd Annual Payments
419    py_za_tx_01032000.trc_AnnPymPtd :=
420       ( py_za_tx_01032000.bal_ANU_FRM_RET_FND_NRFI_RUN
421       + py_za_tx_01032000.bal_ANU_FRM_RET_FND_RFI_RUN
422       + py_za_tx_01032000.bal_PRCH_ANU_TXB_NRFI_RUN
423       + py_za_tx_01032000.bal_PRCH_ANU_TXB_RFI_RUN
424       + py_za_tx_01032000.bal_TXB_AP_NRFI_RUN
425       + py_za_tx_01032000.bal_TXB_AP_RFI_RUN
426       );
427 
428    WriteHrTrace('py_za_tx_01032000.trc_TxbIncPtd: '||to_char(py_za_tx_01032000.trc_TxbIncPtd));
429    WriteHrTrace('py_za_tx_01032000.trc_AnnBonPtd: '||to_char(py_za_tx_01032000.trc_AnnBonPtd));
430    WriteHrTrace('py_za_tx_01032000.trc_AnnPymPtd: '||to_char(py_za_tx_01032000.trc_AnnPymPtd));
431 
432    -- Annual Type PTD Income with no Period Type PTD Income
433    IF (py_za_tx_01032000.trc_AnnBonPtd + py_za_tx_01032000.trc_AnnPymPtd) <> 0 AND py_za_tx_01032000.trc_TxbIncPtd <= 0 THEN
434       hr_utility.set_location('py_za_tx_utl_01032000.PreErnPeriod',1);
435       RETURN TRUE;
436    ELSE
437       hr_utility.set_location('py_za_tx_utl_01032000.PreErnPeriod',2);
438       RETURN FALSE;
439    END IF;
440 
441 EXCEPTION
442   WHEN OTHERS THEN
443     IF py_za_tx_01032000.xpt_Msg = 'No Error' THEN
444        py_za_tx_01032000.xpt_Msg := 'PreErnPeriod: '||TO_CHAR(SQLCODE);
445     END IF;
446        RAISE py_za_tx_01032000.xpt_E;
447 END PreErnPeriod;
448 
449 FUNCTION SitePeriod RETURN BOOLEAN AS
450 BEGIN
451    IF LstPeriod OR EmpTermInPeriod OR EmpTermPrePeriod THEN
452       hr_utility.set_location('py_za_tx_utl_01032000.SitePeriod',1);
453       RETURN TRUE;
454    ELSE
455       hr_utility.set_location('py_za_tx_utl_01032000.SitePeriod',2);
456       RETURN FALSE;
457    END IF;
458 
459 EXCEPTION
460    WHEN OTHERS THEN
461       IF py_za_tx_01032000.xpt_Msg = 'No Error' THEN
462          py_za_tx_01032000.xpt_Msg := 'SitePeriod: '||TO_CHAR(SQLCODE);
463       END IF;
464       RAISE py_za_tx_01032000.xpt_E;
465 END SitePeriod;
466 
467 PROCEDURE PeriodFactor AS
468 
469 BEGIN
470    IF py_za_tx_01032000.dbi_ZA_TX_YR_STRT < py_za_tx_01032000.dbi_ZA_ACT_STRT_DTE THEN
471       hr_utility.set_location('py_za_tx_utl_01032000.PeriodFactor',1);
472 
473       IF py_za_tx_01032000.bal_TOT_INC_YTD = py_za_tx_01032000.bal_TOT_INC_PTD THEN
474          hr_utility.set_location('py_za_tx_utl_01032000.PeriodFactor',2);
475       /* i.e. first pay period for the person */
476          py_za_tx_01032000.trc_PrdFactor := (py_za_tx_01032000.dbi_ZA_CUR_PRD_END_DTE - py_za_tx_01032000.dbi_ZA_ACT_STRT_DTE + 1) /
477                           (py_za_tx_01032000.dbi_ZA_CUR_PRD_END_DTE - py_za_tx_01032000.dbi_ZA_CUR_PRD_STRT_DTE + 1);
478       ELSE
479          hr_utility.set_location('py_za_tx_utl_01032000.PeriodFactor',3);
480          py_za_tx_01032000.trc_PrdFactor := 1;
481       END IF;
482 
483    ELSE
484       hr_utility.set_location('py_za_tx_utl_01032000.PeriodFactor',4);
485       py_za_tx_01032000.trc_PrdFactor := 1;
486    END IF;
487 
488    WriteHrTrace('py_za_tx_01032000.dbi_ZA_TX_YR_STRT: '||to_char(py_za_tx_01032000.dbi_ZA_TX_YR_STRT,'DD/MM/YYYY'));
489    WriteHrTrace('py_za_tx_01032000.dbi_ZA_ACT_STRT_DTE: '||to_char(py_za_tx_01032000.dbi_ZA_ACT_STRT_DTE,'DD/MM/YYYY'));
490    WriteHrTrace('py_za_tx_01032000.dbi_ZA_CUR_PRD_END_DTE: '||to_char(py_za_tx_01032000.dbi_ZA_CUR_PRD_END_DTE,'DD/MM/YYYY'));
491    WriteHrTrace('py_za_tx_01032000.dbi_ZA_CUR_PRD_STRT_DTE: '||to_char(py_za_tx_01032000.dbi_ZA_CUR_PRD_STRT_DTE,'DD/MM/YYYY'));
492 
493 EXCEPTION
494    WHEN OTHERS THEN
495       IF py_za_tx_01032000.xpt_Msg = 'No Error' THEN
496          py_za_tx_01032000.xpt_Msg := 'PeriodFactor: '||TO_CHAR(SQLCODE);
497       END IF;
498       RAISE py_za_tx_01032000.xpt_E;
499 END PeriodFactor;
500 
501 
502 PROCEDURE PossiblePeriodsFactor AS
503 BEGIN
504    IF py_za_tx_01032000.dbi_ZA_TX_YR_STRT >= py_za_tx_01032000.dbi_ZA_ACT_STRT_DTE THEN
505       hr_utility.set_location('py_za_tx_utl_01032000.PossiblePeriodsFactor',1);
506       py_za_tx_01032000.trc_PosFactor := 1;
507    ELSE
508       hr_utility.set_location('py_za_tx_utl_01032000.PossiblePeriodsFactor',2);
509       py_za_tx_01032000.trc_PosFactor := py_za_tx_01032000.dbi_ZA_DYS_IN_YR / (py_za_tx_01032000.dbi_ZA_TX_YR_END - py_za_tx_01032000.dbi_ZA_ACT_STRT_DTE + 1);
510    END IF;
511 
512 EXCEPTION
513    WHEN OTHERS THEN
514       IF py_za_tx_01032000.xpt_Msg = 'No Error' THEN
515          py_za_tx_01032000.xpt_Msg := 'PossiblePeriodsFactor: '||TO_CHAR(SQLCODE);
516       END IF;
517       RAISE py_za_tx_01032000.xpt_E;
518 END PossiblePeriodsFactor;
519 
520 
521 FUNCTION Annualise
522    (p_YtdInc IN NUMBER
523    ,p_PtdInc IN NUMBER
524    ) RETURN NUMBER
525 AS
526    l_AnnFig  NUMBER(15,2);
527    l_PtdFact  NUMBER(15,2);
528 
529 BEGIN
530    l_PtdFact := p_PtdInc / py_za_tx_01032000.trc_PrdFactor;
531 
532   -- Payment over less than one period?
533    IF py_za_tx_01032000.trc_PrdFactor < 1 THEN
534       hr_utility.set_location('py_za_tx_utl_01032000.Annualise',1);
535       l_AnnFig := ((l_PtdFact * py_za_tx_01032000.dbi_ZA_PAY_PRDS_LFT)
536                     +(p_YtdInc - p_PtdInc)
537                     ) * py_za_tx_01032000.trc_PosFactor;
538    ELSE
539       hr_utility.set_location('py_za_tx_utl_01032000.Annualise',2);
540       l_AnnFig := ((l_PtdFact * py_za_tx_01032000.dbi_ZA_PAY_PRDS_LFT)
541                     +(p_YtdInc - l_PtdFact)
542                     ) * py_za_tx_01032000.trc_PosFactor;
543    END IF;
544 
545    WriteHrTrace('p_YtdInc: '||to_char(p_YtdInc));
546    WriteHrTrace('p_PtdInc: '||to_char(p_PtdInc));
547    WriteHrTrace('l_PtdFact: '||to_char(l_PtdFact));
548    WriteHrTrace('py_za_tx_01032000.trc_PrdFactor: '||to_char(py_za_tx_01032000.trc_PrdFactor));
549    WriteHrTrace('py_za_tx_01032000.trc_PosFactor: '||to_char(py_za_tx_01032000.trc_PosFactor));
550    WriteHrTrace('py_za_tx_01032000.dbi_ZA_PAY_PRDS_LFT: '||to_char(py_za_tx_01032000.dbi_ZA_PAY_PRDS_LFT));
551 
552    RETURN l_AnnFig;
553 
554 EXCEPTION
555    WHEN OTHERS THEN
556       IF py_za_tx_01032000.xpt_Msg = 'No Error' THEN
557          py_za_tx_01032000.xpt_Msg := 'Annualise: '||TO_CHAR(SQLCODE);
558       END IF;
559       RAISE py_za_tx_01032000.xpt_E;
560 END Annualise;
561 
562 PROCEDURE SetRebates AS
563 
564 -- Variables
565    l_65Year DATE;
566    l_EndDate per_time_periods.end_date%TYPE;
567 
568    l_ZA_TX_YR_END        DATE;
569    l_ZA_ADL_TX_RBT       NUMBER(15,2);
570    l_ZA_PRI_TX_RBT       NUMBER(15,2);
571    l_ZA_PRI_TX_THRSHLD   NUMBER(15,2);
572    l_ZA_SC_TX_THRSHLD    NUMBER(15,2);
573 
574 BEGIN
575    -- Setup the Globals
576    IF py_za_tx_01032000.trc_CalTyp = 'PstCalc' THEN
577       hr_utility.set_location('py_za_tx_utl_01032000.SetRebates',1);
578    -- Employee Tax Year Start and End Dates
579    --
580       SELECT MAX(ptp.end_date) "EndDate"
581         INTO l_EndDate
582         FROM per_time_periods ptp
583        WHERE ptp.payroll_id = py_za_tx_01032000.con_PRL_ID
584          AND ptp.prd_information1 = py_za_tx_01032000.trc_AsgTxYear
585        GROUP BY ptp.prd_information1;
586 
587       hr_utility.set_location('py_za_tx_utl_01032000.SetRebates',2);
588 
589    -- Global Values
590       l_ZA_TX_YR_END        := l_EndDate;
591       l_ZA_ADL_TX_RBT       := GlbVal('ZA_ADDITIONAL_TAX_REBATE',l_EndDate);
592       l_ZA_PRI_TX_RBT       := GlbVal('ZA_PRIMARY_TAX_REBATE',l_EndDate);
593       l_ZA_PRI_TX_THRSHLD   := GlbVal('ZA_PRIM_TAX_THRESHOLD',l_EndDate);
594       l_ZA_SC_TX_THRSHLD    := GlbVal('ZA_SEC_TAX_THRESHOLD',l_EndDate);
595    ELSE
596       hr_utility.set_location('py_za_tx_utl_01032000.SetRebates',3);
597    -- Set locals to current values
598       l_ZA_TX_YR_END         := py_za_tx_01032000.dbi_ZA_TX_YR_END;
599       l_ZA_ADL_TX_RBT        := py_za_tx_01032000.glb_ZA_ADL_TX_RBT;
600       l_ZA_PRI_TX_RBT        := py_za_tx_01032000.glb_ZA_PRI_TX_RBT;
601       l_ZA_PRI_TX_THRSHLD    := py_za_tx_01032000.glb_ZA_PRI_TX_THRSHLD;
602       l_ZA_SC_TX_THRSHLD     := py_za_tx_01032000.glb_ZA_SC_TX_THRSHLD;
603    END IF;
604 
605    hr_utility.set_location('py_za_tx_utl_01032000.SetRebates',4);
606 
607 -- Calculate the Rebate and Threshold Values
608    IF py_za_tx_01032000.dbi_TX_STA = 'K' THEN
609       hr_utility.set_location('py_za_tx_utl_01032000.SetRebates',5);
610    -- Personal Service Trusts receives no Abatements
611       py_za_tx_01032000.trc_Rebate    := 0;
612       py_za_tx_01032000.trc_Threshold := 0;
613    ELSE
614       hr_utility.set_location('py_za_tx_utl_01032000.SetRebates',6);
615       -- Calculate the assignments 65 Year Date
616       l_65Year := add_months(py_za_tx_01032000.dbi_PER_DTE_OF_BRTH,780);
617 
618       IF l_65Year <= l_ZA_TX_YR_END THEN
619          hr_utility.set_location('py_za_tx_utl_01032000.SetRebates',7);
620       -- give the extra abatement
621          py_za_tx_01032000.trc_Rebate := l_ZA_PRI_TX_RBT + l_ZA_ADL_TX_RBT;
622          py_za_tx_01032000.trc_Threshold := l_ZA_SC_TX_THRSHLD;
623       ELSE
624          hr_utility.set_location('py_za_tx_utl_01032000.SetRebates',8);
625       -- not eligable for extra abatement
626          py_za_tx_01032000.trc_Rebate := l_ZA_PRI_TX_RBT;
627          py_za_tx_01032000.trc_Threshold := l_ZA_PRI_TX_THRSHLD;
628       END IF;
629    END IF;
630 
631    WriteHrTrace('l_ZA_TX_YR_END: '||to_char(l_ZA_TX_YR_END,'DD/MM/YYYY'));
632    WriteHrTrace('l_ZA_ADL_TX_RBT: '||to_char(l_ZA_ADL_TX_RBT));
633    WriteHrTrace('l_ZA_PRI_TX_RBT: '||to_char(l_ZA_PRI_TX_RBT));
634    WriteHrTrace('l_ZA_PRI_TX_THRSHLD: '||to_char(l_ZA_PRI_TX_THRSHLD));
635    WriteHrTrace('l_ZA_SC_TX_THRSHLD: '||to_char(l_ZA_SC_TX_THRSHLD));
636 
637 EXCEPTION
638    WHEN OTHERS THEN
639       IF py_za_tx_01032000.xpt_Msg = 'No Error' THEN
640          py_za_tx_01032000.xpt_Msg := 'SetRebates: '||TO_CHAR(SQLCODE);
641       END IF;
642       RAISE py_za_tx_01032000.xpt_E;
643 END SetRebates;
644 
645 PROCEDURE Abatements AS
646 
647 -- Variables
648    l_65Year DATE;
649    l_EndDate per_time_periods.end_date%TYPE;
650 
651    l_ZA_TX_YR_END        DATE;
652    l_ZA_ARR_PF_AN_MX_ABT NUMBER(15,2);
653    l_ZA_ARR_RA_AN_MX_ABT NUMBER(15,2);
654    l_ZA_PF_AN_MX_ABT     NUMBER(15,2);
655    l_ZA_PF_MX_PRC        NUMBER(15,2);
656    l_ZA_RA_AN_MX_ABT     NUMBER(15,2);
657    l_ZA_RA_MX_PRC        NUMBER(15,2);
658 
659 BEGIN
660 -- Initialise the figures needed for the calculation
661 -- of tax abatements and rebates, based on the
662 -- calculation type
663 --
664    IF py_za_tx_01032000.dbi_TX_STA = 'K' THEN
665       hr_utility.set_location('py_za_tx_utl_01032000.Abatements',1);
666       -- Personal Service Trusts receives no Abatements
667       py_za_tx_01032000.trc_PerTotAbm := 0;
668       py_za_tx_01032000.trc_AnnTotAbm := 0;
669    ELSE
670       IF py_za_tx_01032000.trc_CalTyp = 'NorCalc' THEN
671          hr_utility.set_location('py_za_tx_utl_01032000.Abatements',2);
672 
673       -- Pension Fund Abatement
674       --
675          -- Period Calculation
676          --
677          -- Annualise Period Pension Fund Contributions
678          py_za_tx_01032000.trc_PerPenFnd := Annualise
679                     (p_YtdInc => py_za_tx_01032000.bal_CUR_PF_YTD
680                     ,p_PtdInc => py_za_tx_01032000.bal_CUR_PF_PTD
681                     );
682          -- Annualise Period RFIable Contributions
683          py_za_tx_01032000.trc_PerRfiCon := Annualise
684                     (p_ytdInc => py_za_tx_01032000.bal_TOT_RFI_INC_YTD
685                     ,p_PtdInc => py_za_tx_01032000.bal_TOT_RFI_INC_PTD
686                     );
687 
688          hr_utility.set_location('py_za_tx_utl_01032000.Abatements',3);
689 
690          -- Annual Calculation
691          --
692          -- Annual Pension Fund Contribution
693          py_za_tx_01032000.trc_AnnPenFnd := py_za_tx_01032000.trc_PerPenFnd + py_za_tx_01032000.bal_ANN_PF_YTD;
694          -- Annual Rfi Contribution
695          py_za_tx_01032000.trc_AnnRfiCon := py_za_tx_01032000.trc_PerRfiCon + py_za_tx_01032000.bal_TOT_RFI_AN_INC_YTD;
696 
697       -- Arrear Pension Fund Abatement
698       --
699          hr_utility.set_location('py_za_tx_utl_01032000.Abatements',4);
700          -- Check Arrear Pension Fund Frequency
701          IF py_za_tx_01032000.dbi_ARR_PF_FRQ = 'M' THEN
702             hr_utility.set_location('py_za_tx_utl_01032000.Abatements',5);
703 
704             py_za_tx_01032000.trc_ArrPenFnd := Annualise
705                       (p_YtdInc => py_za_tx_01032000.bal_ARR_PF_YTD
706                       ,p_PtdInc => py_za_tx_01032000.bal_ARR_PF_PTD
707                       )
708                       +py_za_tx_01032000.bal_EXC_ARR_PEN_ITD;
709          ELSE
710             hr_utility.set_location('py_za_tx_utl_01032000.Abatements',6);
711 
712             py_za_tx_01032000.trc_ArrPenFnd := py_za_tx_01032000.bal_ARR_PF_YTD
713                       + py_za_tx_01032000.bal_EXC_ARR_PEN_ITD;
714          END IF;
715 
716       -- Retirement Annuity Abatement
717       --
718          hr_utility.set_location('py_za_tx_utl_01032000.Abatements',7);
719          -- Calculate RA Contribution
720          IF py_za_tx_01032000.dbi_RA_FRQ = 'M' THEN
721             hr_utility.set_location('py_za_tx_utl_01032000.Abatements',8);
722             py_za_tx_01032000.trc_RetAnu := Annualise
723                    (p_YtdInc => py_za_tx_01032000.bal_CUR_RA_YTD
724                    ,p_PtdINc => py_za_tx_01032000.bal_CUR_RA_PTD
725                    );
726          ELSE
727             hr_utility.set_location('py_za_tx_utl_01032000.Abatements',9);
728             py_za_tx_01032000.trc_RetAnu := py_za_tx_01032000.bal_CUR_RA_YTD;
729          END IF;
730 
731          -- Calculate Nrfi Contribution based on Pension Fund
732          -- Contributions
733          IF py_za_tx_01032000.bal_CUR_PF_YTD = 0 THEN
734             hr_utility.set_location('py_za_tx_utl_01032000.Abatements',10);
735             py_za_tx_01032000.trc_NrfiCon := Annualise
736                     (p_YtdInc => py_za_tx_01032000.bal_TOT_RFI_INC_YTD + py_za_tx_01032000.bal_TOT_NRFI_INC_YTD
737                     ,p_PtdInc => py_za_tx_01032000.bal_TOT_RFI_INC_PTD + py_za_tx_01032000.bal_TOT_NRFI_INC_PTD
738                     )
739                     +py_za_tx_01032000.bal_TOT_NRFI_AN_INC_YTD
740                     +py_za_tx_01032000.bal_TOT_RFI_AN_INC_YTD;
741          ELSE
742             hr_utility.set_location('py_za_tx_utl_01032000.Abatements',11);
743             py_za_tx_01032000.trc_NrfiCon := Annualise
744                     (p_YtdInc => py_za_tx_01032000.bal_TOT_NRFI_INC_YTD
745                     ,p_PtdInc => py_za_tx_01032000.bal_TOT_NRFI_INC_PTD
746                     )
747                     +py_za_tx_01032000.bal_TOT_NRFI_AN_INC_YTD;
748          END IF;
749 
750 
751       -- Arrear Retirement Annuity Abatement
752       --
753          -- Check Arrear Retirement Annuity Frequency
754          IF py_za_tx_01032000.dbi_ARR_RA_FRQ = 'M' THEN
755             hr_utility.set_location('py_za_tx_utl_01032000.Abatements',12);
756             py_za_tx_01032000.trc_ArrRetAnu := Annualise
757                       (p_YtdInc => py_za_tx_01032000.bal_ARR_RA_YTD
758                       ,p_PtdInc => py_za_tx_01032000.bal_ARR_RA_PTD
759                       )
760                       +py_za_tx_01032000.bal_EXC_ARR_RA_ITD;
761          ELSE
762             hr_utility.set_location('py_za_tx_utl_01032000.Abatements',13);
763             py_za_tx_01032000.trc_ArrRetAnu := py_za_tx_01032000.bal_ARR_RA_YTD
764                       + py_za_tx_01032000.bal_EXC_ARR_RA_ITD;
765          END IF;
766 
767 
768       -- Medical Aid Abatement
769       --
770          hr_utility.set_location('py_za_tx_utl_01032000.Abatements',14);
771          py_za_tx_01032000.trc_MedAidAbm := Annualise
772                     (p_YtdInc => py_za_tx_01032000.bal_MED_CONTR_YTD
773                     ,p_PtdInc => py_za_tx_01032000.bal_MED_CONTR_PTD
774                     );
775 
776       ELSIF py_za_tx_01032000.trc_CalTyp IN ('YtdCalc','SitCalc') THEN
777          hr_utility.set_location('py_za_tx_utl_01032000.Abatements',15);
778       -- Pension Fund Abatement
779       --
780          -- Period Calculation
781          --
782          -- Annualise Period Pension Fund Contribution
783          py_za_tx_01032000.trc_PerPenFnd := py_za_tx_01032000.bal_CUR_PF_YTD * py_za_tx_01032000.trc_SitFactor;
784          -- Annualise Period Rfiable Contributions
785          py_za_tx_01032000.trc_PerRfiCon := py_za_tx_01032000.bal_TOT_RFI_INC_YTD * py_za_tx_01032000.trc_SitFactor;
786 
787          -- Annual Calculation
788          --
789          -- Annual Pension Fund Contribution
790          py_za_tx_01032000.trc_AnnPenFnd := py_za_tx_01032000.trc_PerPenFnd + py_za_tx_01032000.bal_ANN_PF_YTD;
791          -- Annual Rfi Contribution
792          py_za_tx_01032000.trc_AnnRfiCon := py_za_tx_01032000.trc_PerRfiCon + py_za_tx_01032000.bal_TOT_RFI_AN_INC_YTD;
793 
794          hr_utility.set_location('py_za_tx_utl_01032000.Abatements',16);
795 
796       -- Arrear Pension Fund Abatement
797       --
798          -- Check Arrear Pension Fund Frequency
799          IF py_za_tx_01032000.dbi_ARR_PF_FRQ = 'M' THEN
800             hr_utility.set_location('py_za_tx_utl_01032000.Abatements',17);
801             py_za_tx_01032000.trc_ArrPenFnd := ( py_za_tx_01032000.bal_ARR_PF_YTD * py_za_tx_01032000.trc_SitFactor)
802                              + py_za_tx_01032000.bal_EXC_ARR_PEN_ITD;
803          ELSE
804             hr_utility.set_location('py_za_tx_utl_01032000.Abatements',18);
805             py_za_tx_01032000.trc_ArrPenFnd := py_za_tx_01032000.bal_ARR_PF_YTD + py_za_tx_01032000.bal_EXC_ARR_PEN_ITD;
806          END IF;
807 
808       -- Retirement Annuity Abatement
809       --
810          -- Calculate RA Contribution
811          IF py_za_tx_01032000.dbi_RA_FRQ = 'M' THEN
812             hr_utility.set_location('py_za_tx_utl_01032000.Abatements',19);
813             py_za_tx_01032000.trc_RetAnu := py_za_tx_01032000.bal_CUR_RA_YTD * py_za_tx_01032000.trc_SitFactor;
814          ELSE
815             hr_utility.set_location('py_za_tx_utl_01032000.Abatements',20);
816             py_za_tx_01032000.trc_RetAnu := py_za_tx_01032000.bal_CUR_RA_YTD;
817          END IF;
818 
819          -- Calculate Nrfi Contribution based on Pension Fund
820          -- Contributions
821          IF py_za_tx_01032000.bal_CUR_PF_YTD = 0 THEN
822             hr_utility.set_location('py_za_tx_utl_01032000.Abatements',21);
823             py_za_tx_01032000.trc_NrfiCon :=
824             (( py_za_tx_01032000.bal_TOT_RFI_INC_YTD
825              + py_za_tx_01032000.bal_TOT_NRFI_INC_YTD
826              )* py_za_tx_01032000.trc_SitFactor)
827             + py_za_tx_01032000.bal_TOT_NRFI_AN_INC_YTD
828             + py_za_tx_01032000.bal_TOT_RFI_AN_INC_YTD;
829          ELSE
830             hr_utility.set_location('py_za_tx_utl_01032000.Abatements',22);
831             py_za_tx_01032000.trc_NrfiCon := ( py_za_tx_01032000.bal_TOT_NRFI_INC_YTD * py_za_tx_01032000.trc_SitFactor)
832                            + py_za_tx_01032000.bal_TOT_NRFI_AN_INC_YTD;
833          END IF;
834 
835 
836       -- Arrear Retirement Annuity Abatement
837       --
838          -- Check Arrear Retirement Annuity Frequency
839          IF py_za_tx_01032000.dbi_ARR_RA_FRQ = 'M' THEN
840             hr_utility.set_location('py_za_tx_utl_01032000.Abatements',23);
841             py_za_tx_01032000.trc_ArrRetAnu := (py_za_tx_01032000.bal_ARR_RA_YTD * py_za_tx_01032000.trc_SitFactor)
842                              +py_za_tx_01032000.bal_EXC_ARR_RA_ITD;
843          ELSE
844             hr_utility.set_location('py_za_tx_utl_01032000.Abatements',24);
845             py_za_tx_01032000.trc_ArrRetAnu := py_za_tx_01032000.bal_ARR_RA_YTD
846                          + py_za_tx_01032000.bal_EXC_ARR_RA_ITD;
847          END IF;
848 
849       -- Medical Aid Abatement
850          py_za_tx_01032000.trc_MedAidAbm := py_za_tx_01032000.bal_MED_CONTR_YTD * py_za_tx_01032000.trc_SitFactor;
851 
852       hr_utility.set_location('py_za_tx_utl_01032000.Abatements',25);
853 
854       ELSIF py_za_tx_01032000.trc_CalTyp = 'CalCalc' THEN
855          hr_utility.set_location('py_za_tx_utl_01032000.Abatements',26);
856       -- Pension Fund Abatement
857       --
858          -- Period Calculation
859          --
860          -- Annualise Period Pension Fund Contribution
861          py_za_tx_01032000.trc_PerPenFnd := py_za_tx_01032000.bal_CUR_PF_CYTD * py_za_tx_01032000.trc_SitFactor;
862          -- Annualise Period Rfiable Contributions
863          py_za_tx_01032000.trc_PerRfiCon := py_za_tx_01032000.bal_TOT_RFI_INC_CYTD * py_za_tx_01032000.trc_SitFactor;
864 
865          -- Annual Calculation
866          --
867          -- Annual Pension Fund Contribution
868          py_za_tx_01032000.trc_AnnPenFnd := py_za_tx_01032000.trc_PerPenFnd + py_za_tx_01032000.bal_ANN_PF_YTD;
869          -- Annual Rfi Contribution
870          py_za_tx_01032000.trc_AnnRfiCon := py_za_tx_01032000.trc_PerRfiCon + py_za_tx_01032000.bal_TOT_RFI_AN_INC_YTD;
871 
872       -- Arrear Pension Fund Abatement
873       --
874          -- Check Arrear Pension Fund Frequency
875          IF py_za_tx_01032000.dbi_ARR_PF_FRQ = 'M' THEN
876             hr_utility.set_location('py_za_tx_utl_01032000.Abatements',27);
877             py_za_tx_01032000.trc_ArrPenFnd := (py_za_tx_01032000.bal_ARR_PF_CYTD * py_za_tx_01032000.trc_SitFactor)
878                              +py_za_tx_01032000.bal_EXC_ARR_PEN_ITD;
879          ELSE
880             hr_utility.set_location('py_za_tx_utl_01032000.Abatements',28);
881             py_za_tx_01032000.trc_ArrPenFnd := py_za_tx_01032000.bal_ARR_PF_CYTD
882                            + py_za_tx_01032000.bal_EXC_ARR_PEN_ITD;
883          END IF;
884 
885       -- Retirement Annuity Abatement
886       --
887          -- Calculate RA Contribution
888          IF py_za_tx_01032000.dbi_RA_FRQ = 'M' THEN
889             hr_utility.set_location('py_za_tx_utl_01032000.Abatements',29);
890             py_za_tx_01032000.trc_RetAnu := py_za_tx_01032000.bal_CUR_RA_CYTD * py_za_tx_01032000.trc_SitFactor;
891          ELSE
892             hr_utility.set_location('py_za_tx_utl_01032000.Abatements',30);
893             py_za_tx_01032000.trc_RetAnu := py_za_tx_01032000.bal_CUR_RA_CYTD;
894          END IF;
895 
896          -- Calculate Nrfi Contribution based on Pension Fund
897          -- Contributions
898          IF py_za_tx_01032000.bal_CUR_PF_CYTD = 0 THEN
899             hr_utility.set_location('py_za_tx_utl_01032000.Abatements',31);
900             py_za_tx_01032000.trc_NrfiCon :=
901                (( py_za_tx_01032000.bal_TOT_RFI_INC_CYTD
902                 + py_za_tx_01032000.bal_TOT_NRFI_INC_CYTD
903                 )* py_za_tx_01032000.trc_SitFactor)
904                + py_za_tx_01032000.bal_TOT_NRFI_AN_INC_CYTD
905                + py_za_tx_01032000.bal_TOT_RFI_AN_INC_CYTD;
906          ELSE
907             hr_utility.set_location('py_za_tx_utl_01032000.Abatements',32);
908             py_za_tx_01032000.trc_NrfiCon := (py_za_tx_01032000.bal_TOT_NRFI_INC_CYTD * py_za_tx_01032000.trc_SitFactor)
909                            +py_za_tx_01032000.bal_TOT_NRFI_AN_INC_CYTD;
910          END IF;
911 
912       -- Arrear Retirement Annuity Abatement
913       --
914          -- Check Arrear Retirement Annuity Frequency
915          IF py_za_tx_01032000.dbi_ARR_RA_FRQ = 'M' THEN
916             hr_utility.set_location('py_za_tx_utl_01032000.Abatements',33);
917             py_za_tx_01032000.trc_ArrRetAnu := (py_za_tx_01032000.bal_ARR_RA_CYTD * py_za_tx_01032000.trc_SitFactor)
918                              +py_za_tx_01032000.bal_EXC_ARR_RA_ITD;
919          ELSE
920             hr_utility.set_location('py_za_tx_utl_01032000.Abatements',34);
921             py_za_tx_01032000.trc_ArrRetAnu := py_za_tx_01032000.bal_ARR_RA_CYTD
922                            + py_za_tx_01032000.bal_EXC_ARR_RA_ITD;
923          END IF;
924 
925       -- Medical Aid Abatement
926       --
927          py_za_tx_01032000.trc_MedAidAbm := py_za_tx_01032000.bal_MED_CONTR_CYTD * py_za_tx_01032000.trc_SitFactor;
928 
929       ELSIF py_za_tx_01032000.trc_CalTyp = 'SeaCalc' THEN
930          hr_utility.set_location('py_za_tx_utl_01032000.Abatements',35);
931       -- Pension Fund Abatement
932       --
933          -- Period Calculation
934          --
935          -- Annualise Period Pension Fund Contribution
936          py_za_tx_01032000.trc_PerPenFnd := py_za_tx_01032000.bal_CUR_PF_RUN * py_za_tx_01032000.trc_SitFactor;
937          -- Annualise Period Rfiable Contributions
938          py_za_tx_01032000.trc_PerRfiCon := py_za_tx_01032000.bal_TOT_RFI_INC_RUN * py_za_tx_01032000.trc_SitFactor;
939 
940          -- Annual Calculation
941          --
942          -- Annual Pension Fund Contribution
943          py_za_tx_01032000.trc_AnnPenFnd := py_za_tx_01032000.trc_PerPenFnd + py_za_tx_01032000.bal_ANN_PF_RUN;
944          -- Annual Rfi Contribution
945          py_za_tx_01032000.trc_AnnRfiCon := py_za_tx_01032000.trc_PerRfiCon + py_za_tx_01032000.bal_TOT_RFI_AN_INC_RUN;
946 
947       -- Arrear pension Fund Abatement
948       --
949          py_za_tx_01032000.trc_ArrPenFndAbm := 0;
950 
951       -- Retirement Annuity Abatement
952       --
953          -- Calculate RA Contribution
954          IF py_za_tx_01032000.dbi_RA_FRQ = 'M' THEN
955             hr_utility.set_location('py_za_tx_utl_01032000.Abatements',36);
956             py_za_tx_01032000.trc_RetAnu := py_za_tx_01032000.bal_CUR_RA_RUN * py_za_tx_01032000.trc_SitFactor;
957          ELSE
958             hr_utility.set_location('py_za_tx_utl_01032000.Abatements',37);
959             py_za_tx_01032000.trc_RetAnu := py_za_tx_01032000.bal_CUR_RA_RUN;
960          END IF;
961 
962          -- Calculate Nrfi Contribution based on Pension Fund
963          -- Contributions
964          IF py_za_tx_01032000.bal_CUR_PF_RUN = 0 THEN
965             hr_utility.set_location('py_za_tx_utl_01032000.Abatements',38);
966             py_za_tx_01032000.trc_NrfiCon :=
967                (( py_za_tx_01032000.bal_TOT_RFI_INC_RUN
968                 + py_za_tx_01032000.bal_TOT_NRFI_INC_RUN
969                 )* py_za_tx_01032000.trc_SitFactor)
970                + py_za_tx_01032000.bal_TOT_NRFI_AN_INC_RUN
971                + py_za_tx_01032000.bal_TOT_RFI_AN_INC_RUN;
972          ELSE
973             hr_utility.set_location('py_za_tx_utl_01032000.Abatements',39);
974             py_za_tx_01032000.trc_NrfiCon := (py_za_tx_01032000.bal_TOT_NRFI_INC_RUN * py_za_tx_01032000.trc_SitFactor)
975                            + py_za_tx_01032000.bal_TOT_NRFI_AN_INC_RUN;
976          END IF;
977 
978       -- Arrear Retirement Annuity
979       --
980          py_za_tx_01032000.trc_ArrRetAnuAbm := 0;
981 
982       -- Medical Aid Abatement
983       --
984          py_za_tx_01032000.trc_MedAidAbm := py_za_tx_01032000.bal_MED_CONTR_RUN * py_za_tx_01032000.trc_SitFactor;
985 
986       ELSIF py_za_tx_01032000.trc_CalTyp = 'LteCalc' THEN
987          hr_utility.set_location('py_za_tx_utl_01032000.Abatements',40);
988       -- Pension Fund Abatement
989       --
990 
991          -- Period Calculation
992          --
993          -- Annualise Period Pension Fund Contribution
994          py_za_tx_01032000.trc_PerPenFnd := py_za_tx_01032000.bal_CUR_PF_YTD;
995          -- Annualise Period Rfiable Contributions
996          py_za_tx_01032000.trc_PerRfiCon := py_za_tx_01032000.bal_TOT_RFI_INC_YTD;
997 
998          -- Annual Calculation
999          --
1000          -- Annual Pension Fund Contribution
1001          py_za_tx_01032000.trc_AnnPenFnd := py_za_tx_01032000.trc_PerPenFnd + py_za_tx_01032000.bal_ANN_PF_YTD;
1002          -- Annual Rfi Contribution
1003          py_za_tx_01032000.trc_AnnRfiCon := py_za_tx_01032000.trc_PerRfiCon + py_za_tx_01032000.bal_TOT_RFI_AN_INC_YTD;
1004 
1005       -- Arrear Pension Fund Abatement
1006       --
1007          -- Check Arrear Pension Fund Frequency
1008          IF py_za_tx_01032000.dbi_ARR_PF_FRQ = 'M' THEN
1009             hr_utility.set_location('py_za_tx_utl_01032000.Abatements',41);
1010             py_za_tx_01032000.trc_ArrPenFnd := py_za_tx_01032000.bal_ARR_PF_YTD + py_za_tx_01032000.bal_EXC_ARR_PEN_ITD;
1011          ELSE
1012             hr_utility.set_location('py_za_tx_utl_01032000.Abatements',42);
1013             py_za_tx_01032000.trc_ArrPenFnd := py_za_tx_01032000.bal_ARR_PF_YTD + py_za_tx_01032000.bal_EXC_ARR_PEN_ITD;
1014          END IF;
1015 
1016       -- Retirement Annuity Abatement
1017       --
1018          -- Calculate RA Contribution
1019          IF py_za_tx_01032000.dbi_RA_FRQ = 'M' THEN
1020             hr_utility.set_location('py_za_tx_utl_01032000.Abatements',43);
1021             py_za_tx_01032000.trc_RetAnu := py_za_tx_01032000.bal_CUR_RA_YTD;
1022          ELSE
1023             hr_utility.set_location('py_za_tx_utl_01032000.Abatements',44);
1024             py_za_tx_01032000.trc_RetAnu := py_za_tx_01032000.bal_CUR_RA_YTD;
1025          END IF;
1026 
1027          -- Calculate Nrfi Contribution based on Pension Fund
1028          -- Contributions
1029          IF py_za_tx_01032000.bal_CUR_PF_YTD = 0 THEN
1030             hr_utility.set_location('py_za_tx_utl_01032000.Abatements',45);
1031             py_za_tx_01032000.trc_NrfiCon :=
1032                (py_za_tx_01032000.bal_TOT_RFI_INC_YTD
1033                +py_za_tx_01032000.bal_TOT_NRFI_INC_YTD
1034                +py_za_tx_01032000.bal_TOT_NRFI_AN_INC_YTD
1035                +py_za_tx_01032000.bal_TOT_RFI_AN_INC_YTD
1036                );
1037          ELSE
1038             hr_utility.set_location('py_za_tx_utl_01032000.Abatements',46);
1039             py_za_tx_01032000.trc_NrfiCon := py_za_tx_01032000.bal_TOT_NRFI_INC_YTD +py_za_tx_01032000.bal_TOT_NRFI_AN_INC_YTD;
1040          END IF;
1041 
1042       -- Arrear Retirement Annuity Abatement
1043       --
1044          -- Check Arrear Retirement Annuity Frequency
1045          IF py_za_tx_01032000.dbi_ARR_RA_FRQ = 'M' THEN
1046             hr_utility.set_location('py_za_tx_utl_01032000.Abatements',47);
1047             py_za_tx_01032000.trc_ArrRetAnu := py_za_tx_01032000.bal_ARR_RA_YTD +py_za_tx_01032000.bal_EXC_ARR_RA_ITD;
1048          ELSE
1049             hr_utility.set_location('py_za_tx_utl_01032000.Abatements',48);
1050             py_za_tx_01032000.trc_ArrRetAnu := py_za_tx_01032000.bal_ARR_RA_YTD + py_za_tx_01032000.bal_EXC_ARR_RA_ITD;
1051          END IF;
1052 
1053       -- Medical Aid Abatement
1054          py_za_tx_01032000.trc_MedAidAbm := py_za_tx_01032000.bal_MED_CONTR_YTD;
1055 
1056 
1057       ELSIF py_za_tx_01032000.trc_CalTyp = 'PstCalc' THEN
1058          hr_utility.set_location('py_za_tx_utl_01032000.Abatements',49);
1059       -- Pension Fund Abatement
1060       --
1061          -- Period Calculation
1062          --
1063          -- Annualise Period Pension Fund Contribution
1064          py_za_tx_01032000.trc_PerPenFnd := py_za_tx_01032000.bal_CUR_PF_PTD * py_za_tx_01032000.trc_SitFactor;
1065          -- Annualise Period Rfiable Contributions
1066          py_za_tx_01032000.trc_PerRfiCon := py_za_tx_01032000.bal_TOT_RFI_INC_PTD * py_za_tx_01032000.trc_SitFactor;
1067 
1068          -- Annual Calculation
1069          --
1070          -- Annual Pension Fund Contribution
1071          py_za_tx_01032000.trc_AnnPenFnd := py_za_tx_01032000.trc_PerPenFnd + py_za_tx_01032000.bal_ANN_PF_PTD;
1072          -- Annual Rfi Contribution
1073          py_za_tx_01032000.trc_AnnRfiCon := py_za_tx_01032000.trc_PerRfiCon + py_za_tx_01032000.bal_TOT_RFI_AN_INC_PTD;
1074 
1075       -- Arrear Pension Fund Abatement
1076       --
1077          -- Check Arrear Pension Fund Frequency
1078          IF py_za_tx_01032000.dbi_ARR_PF_FRQ = 'M' THEN
1079             hr_utility.set_location('py_za_tx_utl_01032000.Abatements',50);
1080             py_za_tx_01032000.trc_ArrPenFnd := (py_za_tx_01032000.bal_ARR_PF_PTD * py_za_tx_01032000.trc_SitFactor) + py_za_tx_01032000.bal_EXC_ARR_PEN_PTD;
1081          ELSE
1082             hr_utility.set_location('py_za_tx_utl_01032000.Abatements',51);
1083             py_za_tx_01032000.trc_ArrPenFnd := py_za_tx_01032000.bal_ARR_PF_PTD + py_za_tx_01032000.bal_EXC_ARR_PEN_PTD;
1084          END IF;
1085 
1086       -- Retirement Annuity Abatement
1087       --
1088          -- Calculate RA Contribution
1089          IF py_za_tx_01032000.dbi_RA_FRQ = 'M' THEN
1090             hr_utility.set_location('py_za_tx_utl_01032000.Abatements',52);
1091             py_za_tx_01032000.trc_RetAnu := py_za_tx_01032000.bal_CUR_RA_PTD * py_za_tx_01032000.trc_SitFactor;
1092          ELSE
1093             hr_utility.set_location('py_za_tx_utl_01032000.Abatements',53);
1094             py_za_tx_01032000.trc_RetAnu := py_za_tx_01032000.bal_CUR_RA_PTD;
1095          END IF;
1096 
1097          -- Calculate Nrfi Contribution based on Pension Fund
1098          -- Contributions
1099          IF py_za_tx_01032000.bal_CUR_PF_PTD = 0 THEN
1100             hr_utility.set_location('py_za_tx_utl_01032000.Abatements',54);
1101             py_za_tx_01032000.trc_NrfiCon :=
1102              (((py_za_tx_01032000.bal_TOT_RFI_INC_PTD+py_za_tx_01032000.bal_TOT_NRFI_INC_PTD) * py_za_tx_01032000.trc_SitFactor)
1103              +py_za_tx_01032000.bal_TOT_NRFI_AN_INC_PTD
1104              +py_za_tx_01032000.bal_TOT_RFI_AN_INC_PTD
1105              );
1106          ELSE
1107             hr_utility.set_location('py_za_tx_utl_01032000.Abatements',55);
1108             py_za_tx_01032000.trc_NrfiCon := py_za_tx_01032000.bal_TOT_NRFI_INC_PTD +py_za_tx_01032000.bal_TOT_NRFI_AN_INC_PTD;
1109          END IF;
1110 
1111 
1112       -- Arrear Retirement Annuity Abatement
1113       --
1114          -- Check Arrear Retirement Annuity Frequency
1115          IF py_za_tx_01032000.dbi_ARR_RA_FRQ = 'M' THEN
1116             hr_utility.set_location('py_za_tx_utl_01032000.Abatements',56);
1117             py_za_tx_01032000.trc_ArrRetAnu := (py_za_tx_01032000.bal_ARR_RA_PTD * py_za_tx_01032000.trc_SitFactor) +py_za_tx_01032000.bal_EXC_ARR_RA_PTD;
1118          ELSE
1119             hr_utility.set_location('py_za_tx_utl_01032000.Abatements',57);
1120             py_za_tx_01032000.trc_ArrRetAnu := py_za_tx_01032000.bal_ARR_RA_PTD + py_za_tx_01032000.bal_EXC_ARR_RA_PTD;
1121          END IF;
1122 
1123       -- Medical Aid Abatement
1124          py_za_tx_01032000.trc_MedAidAbm := py_za_tx_01032000.bal_MED_CONTR_PTD * py_za_tx_01032000.trc_SitFactor;
1125 
1126       END IF;
1127 
1128 
1129    -- CALCULATE THE ABATEMENTS
1130    --
1131       hr_utility.set_location('py_za_tx_utl_01032000.Abatements',58);
1132       -- Check the Calculation Type
1133       IF py_za_tx_01032000.trc_CalTyp = 'PstCalc' THEN
1134          hr_utility.set_location('py_za_tx_utl_01032000.Abatements',59);
1135       -- Employee Tax Year Start and End Dates
1136       --
1137          SELECT MAX(ptp.end_date) "EndDate"
1138            INTO l_EndDate
1139            FROM per_time_periods ptp
1140           WHERE ptp.payroll_id = py_za_tx_01032000.con_PRL_ID
1141             AND ptp.prd_information1 = py_za_tx_01032000.trc_AsgTxYear
1142           GROUP BY ptp.prd_information1;
1143 
1144          hr_utility.set_location('py_za_tx_utl_01032000.Abatements',60);
1145 
1146       -- Global Values
1147          l_ZA_TX_YR_END        := l_EndDate;
1148          l_ZA_ARR_PF_AN_MX_ABT := GlbVal('ZA_ARREAR_PEN_AN_MAX_ABATE',l_EndDate);
1149          l_ZA_ARR_RA_AN_MX_ABT := GlbVal('ZA_ARREAR_RA_AN_MAX_ABATE',l_EndDate);
1150          l_ZA_PF_AN_MX_ABT     := GlbVal('ZA_PEN_AN_MAX_ABATE',l_EndDate);
1151          l_ZA_PF_MX_PRC        := GlbVal('ZA_PEN_MAX_PERC',l_EndDate);
1152          l_ZA_RA_AN_MX_ABT     := GlbVal('ZA_RA_AN_MAX_ABATE',l_EndDate);
1153          l_ZA_RA_MX_PRC        := GlbVal('ZA_RA_MAX_PERC',l_EndDate);
1154 
1155       ELSE
1156          hr_utility.set_location('py_za_tx_utl_01032000.Abatements',61);
1157       -- Set locals to current values
1158          l_ZA_TX_YR_END         := py_za_tx_01032000.dbi_ZA_TX_YR_END;
1159          l_ZA_ARR_PF_AN_MX_ABT  := py_za_tx_01032000.glb_ZA_ARR_PF_AN_MX_ABT;
1160          l_ZA_ARR_RA_AN_MX_ABT  := py_za_tx_01032000.glb_ZA_ARR_RA_AN_MX_ABT;
1161          l_ZA_PF_AN_MX_ABT      := py_za_tx_01032000.glb_ZA_PF_AN_MX_ABT;
1162          l_ZA_PF_MX_PRC         := py_za_tx_01032000.glb_ZA_PF_MX_PRC;
1163          l_ZA_RA_AN_MX_ABT      := py_za_tx_01032000.glb_ZA_RA_AN_MX_ABT;
1164          l_ZA_RA_MX_PRC         := py_za_tx_01032000.glb_ZA_RA_MX_PRC;
1165 
1166       END IF;
1167 
1168       WriteHrTrace('l_ZA_TX_YR_END: '||to_char(l_ZA_TX_YR_END,'DD/MM/YYYY'));
1169       WriteHrTrace('l_ZA_ARR_PF_AN_MX_ABT: '||to_char(l_ZA_ARR_PF_AN_MX_ABT));
1170       WriteHrTrace('l_ZA_ARR_RA_AN_MX_ABT: '||to_char(l_ZA_ARR_RA_AN_MX_ABT));
1171       WriteHrTrace('l_ZA_PF_AN_MX_ABT: '||to_char(l_ZA_PF_AN_MX_ABT));
1172       WriteHrTrace('l_ZA_PF_MX_PRC: '||to_char(l_ZA_PF_MX_PRC));
1173       WriteHrTrace('l_ZA_RA_AN_MX_ABT: '||to_char(l_ZA_RA_AN_MX_ABT));
1174       WriteHrTrace('l_ZA_RA_MX_PRC: '||to_char(l_ZA_RA_MX_PRC));
1175 
1176    -- Pension Fund Abatement
1177    --
1178       -- Period Calculation
1179       -- Calculate the Pension Fund Maximum
1180       py_za_tx_01032000.trc_PerPenFndMax := GREATEST( l_ZA_PF_AN_MX_ABT
1181                                  ,(l_ZA_PF_MX_PRC / 100 * py_za_tx_01032000.trc_PerRfiCon)
1182                                   );
1183       -- Calculate Period Pension Fund Abatement
1184       py_za_tx_01032000.trc_PerPenFndAbm := LEAST(py_za_tx_01032000.trc_PerPenFnd, py_za_tx_01032000.trc_PerPenFndMax);
1185 
1186       -- Annual Calculation
1187       -- Calculate the Pension Fund Maximum
1188       py_za_tx_01032000.trc_AnnPenFndMax := GREATEST(l_ZA_PF_AN_MX_ABT
1189                                   ,l_ZA_PF_MX_PRC / 100 * py_za_tx_01032000.trc_AnnRfiCon
1190                                   );
1191 
1192       -- Calculate Annual Pension Fund Abatement
1193       py_za_tx_01032000.trc_AnnPenFndAbm := LEAST(py_za_tx_01032000.trc_AnnPenFnd,py_za_tx_01032000.trc_AnnPenFndMax);
1194 
1195    -- Arrear Pension Fund Abatement
1196    --
1197       py_za_tx_01032000.trc_ArrPenFndAbm := LEAST(py_za_tx_01032000.trc_ArrPenFnd, l_ZA_ARR_PF_AN_MX_ABT);
1198 
1199    -- Retirement Annnnuity Abatement
1200    --
1201       -- Calculate the Retirement Annuity Maximum
1202       py_za_tx_01032000.trc_RetAnuMax := GREATEST(l_ZA_PF_AN_MX_ABT
1203                                ,l_ZA_RA_AN_MX_ABT - py_za_tx_01032000.trc_AnnPenFndAbm
1204                                ,l_ZA_RA_MX_PRC / 100 * py_za_tx_01032000.trc_NrfiCon
1205                                );
1206 
1207       -- Calculate Retirement Annuity Abatement
1208       py_za_tx_01032000.trc_RetAnuAbm := LEAST(py_za_tx_01032000.trc_RetAnu, py_za_tx_01032000.trc_RetAnuMax);
1209 
1210    -- Arrear Retirement Annuity Abatement
1211    --
1212       py_za_tx_01032000.trc_ArrRetAnuAbm := LEAST(py_za_tx_01032000.trc_ArrRetAnu, l_ZA_ARR_RA_AN_MX_ABT);
1213 
1214    -- Tax Rebates, Threshold Figure and Medical Aid
1215    -- Abatements
1216       -- Calculate the assignments 65 Year Date
1217       l_65Year := add_months(py_za_tx_01032000.dbi_PER_DTE_OF_BRTH,780);
1218 
1219       IF l_65Year > l_ZA_TX_YR_END THEN
1220          py_za_tx_01032000.trc_MedAidAbm := 0;
1221       END IF;
1222 
1223       hr_utility.set_location('py_za_tx_utl_01032000.Abatements',62);
1224 
1225    -- Total Abatements
1226    --
1227       -- Period Total Abatement
1228       py_za_tx_01032000.trc_PerTotAbm :=
1229                        ( py_za_tx_01032000.trc_PerPenFndAbm
1230                        + py_za_tx_01032000.trc_ArrPenFndAbm
1231                        + py_za_tx_01032000.trc_RetAnuAbm
1232                        + py_za_tx_01032000.trc_ArrRetAnuAbm
1233                        + py_za_tx_01032000.trc_MedAidAbm
1234                        );
1235 
1236       -- Annual Total Abatements
1237       py_za_tx_01032000.trc_AnnTotAbm :=
1238                        ( py_za_tx_01032000.trc_AnnPenFndAbm
1239                        + py_za_tx_01032000.trc_ArrPenFndAbm
1240                        + py_za_tx_01032000.trc_RetAnuAbm
1241                        + py_za_tx_01032000.trc_ArrRetAnuAbm
1242                        + py_za_tx_01032000.trc_MedAidAbm
1243                        );
1244 
1245       WriteHrTrace('py_za_tx_01032000.trc_PerPenFndAbm: '||to_char(py_za_tx_01032000.trc_PerPenFndAbm));
1246       WriteHrTrace('py_za_tx_01032000.trc_AnnPenFndAbm: '||to_char(py_za_tx_01032000.trc_AnnPenFndAbm));
1247       WriteHrTrace('py_za_tx_01032000.trc_ArrPenFndAbm: '||to_char(py_za_tx_01032000.trc_ArrPenFndAbm));
1248       WriteHrTrace('py_za_tx_01032000.trc_RetAnuAbm: '||to_char(py_za_tx_01032000.trc_RetAnuAbm));
1249       WriteHrTrace('py_za_tx_01032000.trc_ArrRetAnuAbm: '||to_char(py_za_tx_01032000.trc_ArrRetAnuAbm));
1250       WriteHrTrace('py_za_tx_01032000.trc_MedAidAbm: '||to_char(py_za_tx_01032000.trc_MedAidAbm));
1251       WriteHrTrace('py_za_tx_01032000.trc_PerTotAbm: '||to_char(py_za_tx_01032000.trc_PerTotAbm));
1252       WriteHrTrace('py_za_tx_01032000.trc_AnnTotAbm: '||to_char(py_za_tx_01032000.trc_AnnTotAbm));
1253    END IF;
1254 
1255 EXCEPTION
1256    WHEN OTHERS THEN
1257       IF py_za_tx_01032000.xpt_Msg = 'No Error' THEN
1258          py_za_tx_01032000.xpt_Msg := 'Abatements: '||TO_CHAR(SQLCODE);
1259       END IF;
1260       RAISE py_za_tx_01032000.xpt_E;
1261 END Abatements;
1262 
1263 PROCEDURE ArrearExcess AS
1264 -- Variables
1265    l_PfExcessAmt NUMBER;
1266    l_RaExcessAmt NUMBER;
1267 
1268 BEGIN
1269    hr_utility.set_location('py_za_tx_utl_01032000.ArrearExcess',1);
1270 -- Pension Excess
1271    l_PfExcessAmt := (py_za_tx_01032000.bal_ARR_PF_YTD + (py_za_tx_01032000.bal_EXC_ARR_PEN_ITD - py_za_tx_01032000.bal_EXC_ARR_PEN_YTD)) - py_za_tx_01032000.glb_ZA_ARR_PF_AN_MX_ABT;
1272 
1273    IF l_PfExcessAmt > 0 THEN
1274       hr_utility.set_location('py_za_tx_utl_01032000.ArrearExcess',2);
1275       py_za_tx_01032000.trc_PfUpdFig := l_PfExcessAmt - py_za_tx_01032000.bal_EXC_ARR_PEN_ITD;
1276    ELSE
1277       hr_utility.set_location('py_za_tx_utl_01032000.ArrearExcess',3);
1278       py_za_tx_01032000.trc_PfUpdFig := -1*(py_za_tx_01032000.bal_EXC_ARR_PEN_ITD);
1279    END IF;
1280 
1281 -- Retirement Annuity
1282    l_RaExcessAmt := (py_za_tx_01032000.bal_ARR_RA_YTD + (py_za_tx_01032000.bal_EXC_ARR_RA_ITD - py_za_tx_01032000.bal_EXC_ARR_RA_YTD)) - py_za_tx_01032000.glb_ZA_ARR_RA_AN_MX_ABT;
1283 
1284    IF l_RaExcessAmt > 0 THEN
1285       hr_utility.set_location('py_za_tx_utl_01032000.ArrearExcess',4);
1286       py_za_tx_01032000.trc_RaUpdFig := l_RaExcessAmt - py_za_tx_01032000.bal_EXC_ARR_RA_ITD;
1287    ELSE
1288       hr_utility.set_location('py_za_tx_utl_01032000.ArrearExcess',5);
1289       py_za_tx_01032000.trc_RaUpdFig := -1*(py_za_tx_01032000.bal_EXC_ARR_RA_ITD);
1290    END IF;
1291 
1292    hr_utility.set_location('py_za_tx_utl_01032000.ArrearExcess',6);
1293    WriteHrTrace('l_PfExcessAmt: '||to_char(l_PfExcessAmt));
1294    WriteHrTrace('l_RaExcessAmt: '||to_char(l_RaExcessAmt));
1295 
1296 EXCEPTION
1297    WHEN OTHERS THEN
1298       IF py_za_tx_01032000.xpt_Msg = 'No Error' THEN
1299          py_za_tx_01032000.xpt_Msg := 'ArrearExcess: '||TO_CHAR(SQLCODE);
1300       END IF;
1301       RAISE py_za_tx_01032000.xpt_E;
1302 END ArrearExcess;
1303 
1304 FUNCTION GetTableValue
1305    ( p_TableName     IN pay_user_tables.user_table_name%TYPE
1306    , p_ColumnName    IN pay_user_columns.user_column_name%TYPE
1307    , p_RowValue      IN NUMBER
1308    , p_EffectiveDate IN DATE
1309    ) RETURN VARCHAR2
1310 AS
1311    l_TableValue pay_user_column_instances_f.value%TYPE;
1312 BEGIN
1313 
1314    SELECT pucif.value
1315      INTO l_TableValue
1316      FROM pay_user_column_instances_f pucif
1317         , pay_user_columns            puc
1318         , pay_user_rows_f             pur
1319         , pay_user_tables             put
1320     WHERE upper(put.user_table_name) = upper(p_TableName)
1321       AND put.legislation_code = 'ZA'
1322       AND puc.user_table_id = put.user_table_id
1323       AND puc.legislation_code = 'ZA'
1324       AND upper(puc.user_column_name) = upper(p_ColumnName)
1325       AND pucif.user_column_id = puc.user_column_id
1326       AND pur.user_table_id = put.user_table_id
1327       AND p_EffectiveDate BETWEEN pur.effective_start_date AND pur.effective_end_date
1328       AND pur.legislation_code = 'ZA'
1329       AND p_RowValue BETWEEN pur.row_low_range_or_name AND pur.row_high_range
1330       AND put.user_key_units = 'N'
1331       AND pucif.user_row_id = pur.user_row_id
1332       AND p_EffectiveDate BETWEEN pucif.effective_start_date AND pucif.effective_end_date
1333       AND pucif.legislation_code = 'ZA';
1334 
1335    RETURN l_TableValue;
1336 EXCEPTION
1337    WHEN OTHERS THEN
1338       IF py_za_tx_01032000.xpt_Msg = 'No Error' THEN
1339          py_za_tx_01032000.xpt_Msg := 'GetTableValue: '||TO_CHAR(SQLCODE);
1340       END IF;
1341       RAISE py_za_tx_01032000.xpt_E;
1342 END GetTableValue;
1343 
1344 FUNCTION TaxLiability
1345    (p_Amt  IN NUMBER
1346    )RETURN  NUMBER
1347 AS
1348 
1349 -- Variables
1350 --
1351    l_fixed pay_user_column_instances_f.value%TYPE;
1352    l_limit pay_user_column_instances_f.value%TYPE;
1353    l_percentage pay_user_column_instances_f.value%TYPE;
1354    l_effective_date pay_payroll_actions.effective_date%TYPE;
1355    tax_liability NUMBER(15,2);
1356    l_TxbAmt NUMBER(15,2);
1357 
1358 BEGIN
1359    hr_utility.set_location('py_za_tx_utl_01032000.TaxLiability',1);
1360   -- First Check for a Tax Override
1361    IF py_za_tx_01032000.trc_OvrTxCalc AND py_za_tx_01032000.trc_OvrTyp = 'P' THEN
1362       hr_utility.set_location('py_za_tx_utl_01032000.TaxLiability',2);
1363       tax_liability := (p_Amt * py_za_tx_01032000.trc_OvrPrc) / 100;
1364    ELSIF py_za_tx_01032000.dbi_TX_STA = 'C' THEN
1365       hr_utility.set_location('py_za_tx_utl_01032000.TaxLiability',3);
1366       tax_liability := (p_Amt * py_za_tx_01032000.dbi_TX_DIR_VAL) / 100;
1367    ELSIF py_za_tx_01032000.dbi_TX_STA = 'D' THEN
1368       hr_utility.set_location('py_za_tx_utl_01032000.TaxLiability',4);
1369       tax_liability := (p_Amt * py_za_tx_01032000.dbi_TX_DIR_VAL) / 100;
1370    ELSIF py_za_tx_01032000.dbi_TX_STA = 'E' THEN
1371       hr_utility.set_location('py_za_tx_utl_01032000.TaxLiability',5);
1372       tax_liability := (p_Amt * py_za_tx_01032000.glb_ZA_CC_TX_PRC) / 100;
1373    ELSIF py_za_tx_01032000.dbi_TX_STA = 'F' THEN
1374       hr_utility.set_location('py_za_tx_utl_01032000.TaxLiability',6);
1375       tax_liability := (p_Amt * py_za_tx_01032000.glb_ZA_TMP_TX_RTE) / 100;
1376    ELSIF py_za_tx_01032000.dbi_TX_STA = 'J' THEN
1377       hr_utility.set_location('py_za_tx_utl_01032000.TaxLiability',7);
1378       tax_liability := (p_Amt * py_za_tx_01032000.glb_ZA_PER_SERV_COMP_PERC) / 100;
1379    ELSIF py_za_tx_01032000.dbi_TX_STA = 'L' THEN
1380       hr_utility.set_location('py_za_tx_utl_01032000.TaxLiability',8);
1381       tax_liability := (p_Amt * py_za_tx_01032000.glb_ZA_LABOUR_BROK_PERC) / 100;
1382    ELSE
1383       hr_utility.set_location('py_za_tx_utl_01032000.TaxLiability',9);
1384       /* Taxable Amount must be rounded off to two decimal places */
1385       l_TxbAmt := round(p_Amt,2);
1386 
1387       /* this selects the effective date for the payroll_run*/
1388       SELECT ppa.effective_date
1389         INTO l_effective_date
1390         FROM pay_payroll_actions ppa
1391        WHERE ppa.payroll_action_id = py_za_tx_01032000.con_PRL_ACT_ID;
1392 
1393       IF py_za_tx_01032000.dbi_TX_STA = 'K' THEN
1394          hr_utility.set_location('py_za_tx_utl_01032000.TaxLiability',10);
1395          l_fixed      := GetTableValue('ZA_TAX_PERSONAL_SERVICE_TRUST','Fixed',l_TxbAmt,l_effective_date);
1396          l_limit      := GetTableValue('ZA_TAX_PERSONAL_SERVICE_TRUST','Limit',l_TxbAmt,l_effective_date);
1397          l_percentage := GetTableValue('ZA_TAX_PERSONAL_SERVICE_TRUST','Percentage',l_TxbAmt,l_effective_date);
1398          tax_liability := (l_fixed + ((l_TxbAmt - l_limit) * (l_percentage / 100)));
1399       ELSE
1400          hr_utility.set_location('py_za_tx_utl_01032000.TaxLiability',11);
1401          l_fixed      := GetTableValue('ZA_TAX_TABLE','Fixed',l_TxbAmt,l_effective_date);
1402          l_limit      := GetTableValue('ZA_TAX_TABLE','Limit',l_TxbAmt,l_effective_date);
1403          l_percentage := GetTableValue('ZA_TAX_TABLE','Percentage',l_TxbAmt,l_effective_date);
1404          tax_liability := (l_fixed + ((l_TxbAmt - l_limit) * (l_percentage / 100))) -  py_za_tx_01032000.trc_Rebate;
1405       END IF;
1406       hr_utility.set_location('py_za_tx_utl_01032000.TaxLiability',12);
1407    END IF;
1408 
1409    WriteHrTrace('l_fixed: '||l_fixed);
1410    WriteHrTrace('l_TxbAmt: '||to_char(l_TxbAmt));
1411    WriteHrTrace('l_limit: '||l_limit);
1412    WriteHrTrace('l_percentage: '||l_percentage);
1413    WriteHrTrace('py_za_tx_01032000.trc_Rebate: '||to_char(py_za_tx_01032000.trc_Rebate));
1414    WriteHrTrace('tax_liability: '||to_char(tax_liability));
1415 
1416    RETURN tax_liability ;
1417 
1418 EXCEPTION
1419    WHEN OTHERS THEN
1420       IF py_za_tx_01032000.xpt_Msg = 'No Error' THEN
1421          py_za_tx_01032000.xpt_Msg := 'TaxLiability: '||TO_CHAR(SQLCODE);
1422       END IF;
1423       RAISE py_za_tx_01032000.xpt_E;
1424 END TaxLiability;
1425 
1426 
1427 FUNCTION DeAnnualise
1428    (p_Liab IN NUMBER
1429    ,p_TxOnYtd IN NUMBER
1430    ,p_TxOnPtd IN NUMBER
1431    ) RETURN NUMBER
1432 AS
1433    l_LiabRoy NUMBER(15,2);
1434    l_LiabFp  NUMBER(15,2);
1435 BEGIN
1436    hr_utility.set_location('py_za_tx_utl_01032000.DeAnnualise',1);
1437    l_LiabRoy := (p_liab/py_za_tx_01032000.trc_PosFactor - (p_TxOnYtd - p_TxOnPtd))
1438            /py_za_tx_01032000.dbi_ZA_PAY_PRDS_LFT * py_za_tx_01032000.trc_PrdFactor;
1439 
1440    l_LiabFp := l_LiabRoy - p_TxOnPtd;
1441 
1442    hr_utility.set_location('py_za_tx_utl_01032000.DeAnnualise',2);
1443    WriteHrTrace('p_Liab: '||to_char(p_Liab));
1444    WriteHrTrace('p_TxOnYtd: '||to_char(p_TxOnYtd));
1445    WriteHrTrace('p_TxOnPtd: '||to_char(p_TxOnPtd));
1446    WriteHrTrace('l_LiabRoy: '||to_char(l_LiabRoy));
1447    WriteHrTrace('l_LiabFp: '||to_char(l_LiabFp));
1448 
1449    RETURN l_LiabFp;
1450 
1451 EXCEPTION
1452    WHEN OTHERS THEN
1453       IF py_za_tx_01032000.xpt_Msg = 'No Error' THEN
1454          py_za_tx_01032000.xpt_Msg := 'DeAnnualise: '||TO_CHAR(SQLCODE);
1455       END IF;
1456       RAISE py_za_tx_01032000.xpt_E;
1457 END DeAnnualise;
1458 
1459 
1460 PROCEDURE TrvAll AS
1461 -- Cursors
1462 --
1463   -- Global Effective End Dates
1464   CURSOR c_GlbEffDte
1465     (p_ty_sd DATE       -- start date
1466     ,p_ty_ed DATE       -- end date
1467     )
1468   IS
1469   SELECT effective_end_date
1470        , to_number(global_value) global_value
1471     FROM ff_globals_f
1472    WHERE effective_end_date < p_ty_ed
1473      AND effective_end_date > p_ty_sd
1474      AND global_name = 'ZA_CAR_ALLOW_TAX_PERC';
1475 
1476 -- Variables
1477 --
1478   l_NrfiBalID  pay_balance_types.balance_type_id%TYPE;
1479   l_RfiBalID   pay_balance_types.balance_type_id%TYPE;
1480   l_StrtDate   DATE;
1481   l_EndDate    DATE;
1482   l_NrfiYtd    NUMBER(15,2) DEFAULT 0;
1483   l_CurNrfiYtd NUMBER(15,2) DEFAULT 0;
1484   l_TotNrfiYtd NUMBER(15,2) DEFAULT 0;
1485   l_CurTxbNrfi NUMBER(15,2) DEFAULT 0;
1486   l_TotTxbNrfi NUMBER(15,2) DEFAULT 0;
1487   l_RfiYtd     NUMBER(15,2) DEFAULT 0;
1488   l_CurRfiYtd  NUMBER(15,2) DEFAULT 0;
1489   l_TotRfiYtd  NUMBER(15,2) DEFAULT 0;
1490   l_CurTxbRfi  NUMBER(15,2) DEFAULT 0;
1491   l_TotTxbRfi  NUMBER(15,2) DEFAULT 0;
1492   l_GlbVal     ff_globals_f.global_value%TYPE DEFAULT '0';
1493 
1494 BEGIN
1495    hr_utility.set_location('py_za_tx_utl_01032000.TrvAll',1);
1496 -- Retrieve Balance Type ID's
1497    SELECT balance_type_id
1498      INTO l_NrfiBalID
1499      FROM pay_balance_types
1500     WHERE legislation_code = 'ZA'
1501       AND balance_name = 'Travel Allowance NRFI';
1502 
1503    hr_utility.set_location('py_za_tx_utl_01032000.TrvAll',2);
1504 
1505    SELECT balance_type_id
1506      INTO l_RfiBalID
1507      FROM pay_balance_types
1508     WHERE legislation_code = 'ZA'
1509       AND balance_name = 'Travel Allowance RFI';
1510 
1511 -- Check Calc and setup correct values
1512 --
1513    IF py_za_tx_01032000.trc_CalTyp in ('DirCalc','NorCalc','SitCalc','YtdCalc') THEN
1514       hr_utility.set_location('py_za_tx_utl_01032000.TrvAll',3);
1515    -- Employee Tax Year Start and End Dates
1516    --
1517       l_StrtDate := GREATEST(py_za_tx_01032000.dbi_ZA_ACT_STRT_DTE, py_za_tx_01032000.dbi_ZA_TX_YR_STRT);
1518       l_EndDate := LEAST(py_za_tx_01032000.dbi_ZA_ACT_END_DTE, py_za_tx_01032000.dbi_ZA_TX_YR_END,py_za_tx_01032000.dbi_ZA_CUR_PRD_END_DTE);
1519 
1520    ELSIF py_za_tx_01032000.trc_CalTyp = 'CalCalc' THEN
1521       hr_utility.set_location('py_za_tx_utl_01032000.TrvAll',4);
1522    -- Employee Tax Year Start and End Dates
1523    --
1524       l_StrtDate := to_date('01-01-'||to_char(py_za_tx_01032000.dbi_ZA_TX_YR_STRT,'YYYY')||''||'','DD-MM-YYYY');
1525       l_EndDate := py_za_tx_01032000.dbi_ZA_TX_YR_STRT -1;
1526 
1527    ELSIF py_za_tx_01032000.trc_CalTyp = 'LteCalc' THEN
1528       hr_utility.set_location('py_za_tx_utl_01032000.TrvAll',5);
1529    -- Employee Tax Year Start and End Dates
1530    --
1531       l_StrtDate := py_za_tx_01032000.dbi_ZA_TX_YR_STRT;
1532       l_EndDate := py_za_tx_01032000.dbi_ZA_CUR_PRD_END_DTE;
1533 
1534    ELSIF py_za_tx_01032000.trc_CalTyp = 'PstCalc' THEN
1535       hr_utility.set_location('py_za_tx_utl_01032000.TrvAll',6);
1536    -- Employee Tax Year Start and End Dates
1537    --
1538       SELECT MIN(ptp.start_date) "StartDate"
1539            , MAX(ptp.end_date) "EndDate"
1540         INTO l_StrtDate
1541            , l_EndDate
1542         FROM per_time_periods ptp
1543        WHERE ptp.payroll_id = py_za_tx_01032000.con_PRL_ID
1544          AND ptp.prd_information1 = py_za_tx_01032000.trc_AsgTxYear
1545        GROUP BY ptp.prd_information1;
1546    END IF;
1547 
1548    hr_utility.set_location('py_za_tx_utl_01032000.TrvAll',7);
1549 
1550 -- Loop through cursor and for every end date calculate the balance
1551    FOR v_Date IN c_GlbEffDte
1552                  (l_StrtDate
1553                  ,l_EndDate
1554                  )
1555    LOOP
1556    -- Nrfi Travel Allowance
1557    --
1558       hr_utility.set_location('py_za_tx_utl_01032000.TrvAll',8);
1559       -- Check Calc Type
1560       IF py_za_tx_01032000.trc_CalTyp IN ('DirCalc','NorCalc','SitCalc','YtdCalc','LteCalc','PstCalc') THEN
1561          hr_utility.set_location('py_za_tx_utl_01032000.TrvAll',9);
1562       -- Nrfi Balance At That Date
1563       -- 3491357
1564          /*l_NrfiYtd := py_za_bal.calc_asg_tax_ytd_date
1565                       (py_za_tx_01032000.con_ASG_ID
1566                       ,l_NrfiBalID
1567                       ,v_Date.effective_end_date
1568                       );*/
1569          l_NrfiYtd := py_za_bal.get_balance_value
1570                       (py_za_tx_01032000.con_ASG_ID
1571                       ,l_NrfiBalID
1572                       , '_ASG_TAX_YTD'
1573                       ,v_Date.effective_end_date
1574                       );
1575       ELSIF  py_za_tx_01032000.trc_CalTyp = 'CalCalc' THEN
1576          hr_utility.set_location('py_za_tx_utl_01032000.TrvAll',10);
1577       -- Nrfi Balance At That Date
1578       -- 3491357
1579          /*l_NrfiYtd := py_za_bal.calc_asg_cal_ytd_date
1580                       (py_za_tx_01032000.con_ASG_ID
1581                       ,l_NrfiBalID
1582                       ,v_Date.effective_end_date
1583                       );*/
1584          l_NrfiYtd := py_za_bal.get_balance_value
1585                       (py_za_tx_01032000.con_ASG_ID
1586                       ,l_NrfiBalID
1587                       , '_ASG_CAL_YTD'
1588                       ,v_Date.effective_end_date
1589                       );
1590       END IF;
1591 
1592       -- Take Off the Ytd value used already
1593       l_CurNrfiYtd := l_NrfiYtd - l_TotNrfiYtd;
1594       -- Update TotYtd value
1595       l_TotNrfiYtd := l_NrfiYtd;
1596       -- Get the Taxable Travel Allowance at that date
1597       l_CurTxbNrfi := l_CurNrfiYtd * v_Date.global_value/100;
1598       -- Add this to the total
1599       l_TotTxbNrfi := l_TotTxbNrfi + l_CurTxbNrfi;
1600 
1601    -- Rfi Travel Allowance
1602    --
1603       hr_utility.set_location('py_za_tx_utl_01032000.TrvAll',11);
1604       -- Check Calc Type
1605       IF py_za_tx_01032000.trc_CalTyp in ('DirCalc','NorCalc','SitCalc','YtdCalc','LteCalc','PstCalc') THEN
1606          hr_utility.set_location('py_za_tx_utl_01032000.TrvAll',12);
1607       -- Rfi Balance At That Date
1608       -- 3491357
1609          /*l_RfiYtd := py_za_bal.calc_asg_tax_ytd_date
1610                      (py_za_tx_01032000.con_ASG_ID
1611                      ,l_RfiBalID
1612                      ,v_Date.effective_end_date
1613                      );*/
1614          l_RfiYtd := py_za_bal.get_balance_value
1615                      (py_za_tx_01032000.con_ASG_ID
1616                      ,l_RfiBalID
1617                      ,'_ASG_TAX_YTD'
1618                      ,v_Date.effective_end_date
1619                      );
1620       ELSIF py_za_tx_01032000.trc_CalTyp = 'CalCalc' THEN
1621          hr_utility.set_location('py_za_tx_utl_01032000.TrvAll',13);
1622       -- Rfi Balance At That Date
1623       -- 3491357
1624          /*l_RfiYtd := py_za_bal.calc_asg_cal_ytd_date
1625                      (py_za_tx_01032000.con_ASG_ID
1626                      ,l_RfiBalID
1627                      ,v_Date.effective_end_date
1628                      );*/
1629          l_RfiYtd := py_za_bal.get_balance_value
1630                      (py_za_tx_01032000.con_ASG_ID
1631                      ,l_RfiBalID
1632                      , '_ASG_CAL_YTD'
1633                      ,v_Date.effective_end_date
1634                      );
1635       END IF;
1636 
1637       -- Take Off the Ytd value used already
1638       l_CurRfiYtd := l_RfiYtd - l_TotRfiYtd;
1639       -- Update TotYtd value
1640       l_TotRfiYtd := l_RfiYtd;
1641       -- Get the Taxable Travel Allowance at that date
1642       l_CurTxbRfi := l_CurRfiYtd * v_Date.global_value/100;
1643       -- Add this to the total
1644       l_TotTxbRfi := l_TotTxbRfi + l_CurTxbRfi;
1645 
1646    END LOOP;
1647 
1648    WriteHrTrace('l_CurNrfiYtd: '||to_char(l_CurNrfiYtd));
1649    WriteHrTrace('l_TotNrfiYtd: '||to_char(l_TotNrfiYtd));
1650    WriteHrTrace('l_CurTxbNrfi: '||to_char(l_CurTxbNrfi));
1651    WriteHrTrace('l_TotTxbNrfi: '||to_char(l_TotTxbNrfi));
1652    WriteHrTrace('l_CurRfiYtd: '||to_char(l_CurRfiYtd));
1653    WriteHrTrace('l_TotRfiYtd: '||to_char(l_TotRfiYtd));
1654    WriteHrTrace('l_CurTxbRfi: '||to_char(l_CurTxbRfi));
1655    WriteHrTrace('l_TotTxbRfi: '||to_char(l_TotTxbRfi));
1656 
1657 -- Calculate the current Taxable Travel Allowance Value
1658 -- add this to any calculated in the loop
1659 --
1660    hr_utility.set_location('py_za_tx_utl_01032000.TrvAll',14);
1661    -- Check Calc TYPE
1662    IF py_za_tx_01032000.trc_CalTyp IN ('DirCalc','NorCalc','SitCalc','YtdCalc', 'LteCalc') THEN
1663       hr_utility.set_location('py_za_tx_utl_01032000.TrvAll',15);
1664    -- Balance Values
1665       l_NrfiYtd := py_za_tx_01032000.bal_TA_NRFI_YTD;
1666       l_RfiYtd := py_za_tx_01032000.bal_TA_RFI_YTD;
1667    -- Global Value
1668       l_GlbVal := py_za_tx_01032000.glb_ZA_TRV_ALL_TX_PRC;
1669 
1670    ELSIF py_za_tx_01032000.trc_CalTyp = 'PstCalc' THEN
1671       hr_utility.set_location('py_za_tx_utl_01032000.TrvAll',16);
1672    -- Balance Values
1673       l_NrfiYtd := py_za_tx_01032000.bal_TA_NRFI_PTD;
1674       l_RfiYtd := py_za_tx_01032000.bal_TA_RFI_PTD;
1675    -- Global Value
1676       SELECT TO_NUMBER(global_value)
1677         INTO l_GlbVal
1678         FROM ff_globals_f
1679        WHERE l_EndDate between effective_start_date and effective_end_date
1680          AND global_name = 'ZA_CAR_ALLOW_TAX_PERC';
1681 
1682       hr_utility.set_location('py_za_tx_utl_01032000.TrvAll',17);
1683 
1684    ELSIF py_za_tx_01032000.trc_CalTyp = 'CalCalc' THEN
1685       hr_utility.set_location('py_za_tx_utl_01032000.TrvAll',18);
1686    -- Balance Values
1687       l_NrfiYtd := py_za_tx_01032000.bal_TA_NRFI_CYTD;
1688       l_RfiYtd := py_za_tx_01032000.bal_TA_RFI_CYTD;
1689 
1690    -- Global Value
1691       SELECT TO_NUMBER(global_value)
1692       INTO l_GlbVal
1693       FROM ff_globals_f
1694       WHERE l_EndDate between effective_start_date and effective_end_date
1695       AND global_name = 'ZA_CAR_ALLOW_TAX_PERC';
1696 
1697       hr_utility.set_location('py_za_tx_utl_01032000.TrvAll',19);
1698 
1699    END IF;
1700 
1701    WriteHrTrace('l_NrfiYtd: '||to_char(l_NrfiYtd));
1702    WriteHrTrace('l_RfiYtd: '||to_char(l_RfiYtd));
1703    WriteHrTrace('l_GlbVal: '||l_GlbVal);
1704 
1705 -- Nrfi Travel Allowance
1706 --
1707    -- Take Off the Ytd value used already
1708    l_CurNrfiYtd := l_NrfiYtd - l_TotNrfiYtd;
1709    -- Update TotYtd value
1710    l_TotNrfiYtd := l_NrfiYtd;
1711    -- Get the Taxable Travel Allowance at that date
1712    l_CurTxbNrfi := l_CurNrfiYtd * l_GlbVal/100;
1713    -- Add this to the total
1714    l_TotTxbNrfi := l_TotTxbNrfi + l_CurTxbNrfi;
1715 
1716 -- Rfi Travel Allowance
1717 --
1718    -- Take Off the Ytd value used already
1719    l_CurRfiYtd := l_RfiYtd - l_TotRfiYtd;
1720    -- Update TotYtd value
1721    l_TotRfiYtd := l_RfiYtd;
1722    -- Get the Taxable Travel Allowance at that date
1723    l_CurTxbRfi := l_CurRfiYtd * l_GlbVal/100;
1724    -- Add this to the total
1725    l_TotTxbRfi := l_TotTxbRfi + l_CurTxbRfi;
1726 
1727 -- Update Globals
1728    -- Check Calc Type
1729    IF py_za_tx_01032000.trc_CalTyp IN ('DirCalc','NorCalc','SitCalc','YtdCalc', 'LteCalc') THEN
1730       hr_utility.set_location('py_za_tx_utl_01032000.TrvAll',20);
1731       py_za_tx_01032000.bal_TA_NRFI_YTD := l_TotTxbNrfi;
1732       py_za_tx_01032000.bal_TA_RFI_YTD := l_TotTxbRfi;
1733    ELSIF py_za_tx_01032000.trc_CalTyp = 'PstCalc' THEN
1734       hr_utility.set_location('py_za_tx_utl_01032000.TrvAll',21);
1735       py_za_tx_01032000.bal_TA_NRFI_PTD := l_TotTxbNrfi;
1736       py_za_tx_01032000.bal_TA_RFI_PTD := l_TotTxbRfi;
1737    ELSIF py_za_tx_01032000.trc_CalTyp = 'CalCalc' THEN
1738       hr_utility.set_location('py_za_tx_utl_01032000.TrvAll',22);
1739       py_za_tx_01032000.bal_TA_NRFI_CYTD := l_TotTxbNrfi;
1740       py_za_tx_01032000.bal_TA_RFI_CYTD := l_TotTxbRfi;
1741    END IF;
1742 
1743    WriteHrTrace('l_TotTxbNrfi: '||to_char(l_TotTxbNrfi));
1744    WriteHrTrace('l_TotTxbRfi: '||to_char(l_TotTxbRfi));
1745 
1746 EXCEPTION
1747    WHEN OTHERS THEN
1748       IF py_za_tx_01032000.xpt_Msg = 'No Error' THEN
1749          py_za_tx_01032000.xpt_Msg := 'TrvAll: '||TO_CHAR(SQLCODE);
1750       END IF;
1751       RAISE py_za_tx_01032000.xpt_E;
1752 END TrvAll;
1753 
1754 
1755 
1756 PROCEDURE NpVal(
1757    p_Rf IN BOOLEAN DEFAULT FALSE -- Refund Allowed Regardless
1758    )
1759 AS
1760 
1761 -- Type Declaration
1762 --
1763    TYPE r_Row IS RECORD(
1764      Ovrrde BOOLEAN
1765     ,Lib    NUMBER
1766     );
1767 
1768    TYPE t_Table IS TABLE OF r_Row
1769       INDEX BY BINARY_INTEGER;
1770 -- Variable Declaration
1771 --
1772    t_Liabilities t_Table;
1773 
1774    l_TotLib NUMBER(15,2); -- Total Liability
1775    l_TotNp NUMBER(15,2); -- Total Net Pay
1776    l_RecVal NUMBER(15,2); -- Recovery Value
1777    l_NewLib NUMBER(15,2); -- New Liability
1778    i NUMBER; -- Counter
1779 
1780 BEGIN
1781    hr_utility.set_location('py_za_tx_utl_01032000.NpVal',1);
1782 -- Set up the Table
1783    t_Liabilities(1).Ovrrde := py_za_tx_01032000.trc_NpValNIOvr;
1784    t_Liabilities(1).Lib := py_za_tx_01032000.trc_LibFpNI;
1785 
1786    t_Liabilities(2).Ovrrde := py_za_tx_01032000.trc_NpValFBOvr;
1787    t_Liabilities(2).Lib := py_za_tx_01032000.trc_LibFpFB;
1788 
1789    t_Liabilities(3).Ovrrde := py_za_tx_01032000.trc_NpValTAOvr;
1790    t_Liabilities(3).Lib := py_za_tx_01032000.trc_LibFpTA;
1791 
1792    t_Liabilities(4).Ovrrde := py_za_tx_01032000.trc_NpValBPOvr;
1793    t_Liabilities(4).Lib := py_za_tx_01032000.trc_LibFpBP;
1794 
1795    t_Liabilities(5).Ovrrde := py_za_tx_01032000.trc_NpValABOvr;
1796    t_Liabilities(5).Lib := py_za_tx_01032000.trc_LibFpAB;
1797 
1798    t_Liabilities(6).Ovrrde := py_za_tx_01032000.trc_NpValAPOvr;
1799    t_Liabilities(6).Lib := py_za_tx_01032000.trc_LibFpAP;
1800 
1801    t_Liabilities(7).Ovrrde := py_za_tx_01032000.trc_NpValPOOvr;
1802    t_Liabilities(7).Lib := py_za_tx_01032000.trc_LibFpPO;
1803 
1804    IF py_za_tx_01032000.trc_NpValNIOvr THEN
1805       WriteHrTrace('py_za_tx_01032000.trc_NpValNIOvr: TRUE');
1806    ELSE
1807       WriteHrTrace('py_za_tx_01032000.trc_NpValNIOvr: FALSE');
1808    END IF;
1809    WriteHrTrace('py_za_tx_01032000.trc_LibFpNI: '||to_char(py_za_tx_01032000.trc_LibFpNI));
1810    IF py_za_tx_01032000.trc_NpValFBOvr THEN
1811       WriteHrTrace('py_za_tx_01032000.trc_NpValFBOvr: TRUE');
1812    ELSE
1813       WriteHrTrace('py_za_tx_01032000.trc_NpValFBOvr: FALSE');
1814    END IF;
1815    WriteHrTrace('py_za_tx_01032000.trc_LibFpFB: '||to_char(py_za_tx_01032000.trc_LibFpFB));
1816    IF py_za_tx_01032000.trc_NpValTAOvr THEN
1817       WriteHrTrace('py_za_tx_01032000.trc_NpValTAOvr: TRUE');
1818    ELSE
1819       WriteHrTrace('py_za_tx_01032000.trc_NpValTAOvr: FALSE');
1820    END IF;
1821    WriteHrTrace('py_za_tx_01032000.trc_LibFpTA: '||to_char(py_za_tx_01032000.trc_LibFpTA));
1822    IF py_za_tx_01032000.trc_NpValBPOvr THEN
1823       WriteHrTrace('py_za_tx_01032000.trc_NpValBPOvr: TRUE');
1824    ELSE
1825       WriteHrTrace('py_za_tx_01032000.trc_NpValBPOvr: FALSE');
1826    END IF;
1827    WriteHrTrace('py_za_tx_01032000.trc_LibFpBP: '||to_char(py_za_tx_01032000.trc_LibFpBP));
1828    IF py_za_tx_01032000.trc_NpValABOvr THEN
1829       WriteHrTrace('py_za_tx_01032000.trc_NpValABOvr: TRUE');
1830    ELSE
1831       WriteHrTrace('py_za_tx_01032000.trc_NpValABOvr: FALSE');
1832    END IF;
1833    WriteHrTrace('py_za_tx_01032000.trc_LibFpAB: '||to_char(py_za_tx_01032000.trc_LibFpAB));
1834    IF py_za_tx_01032000.trc_NpValAPOvr THEN
1835       WriteHrTrace('py_za_tx_01032000.trc_NpValAPOvr: TRUE');
1836    ELSE
1837       WriteHrTrace('py_za_tx_01032000.trc_NpValAPOvr: FALSE');
1838    END IF;
1839    WriteHrTrace('py_za_tx_01032000.trc_LibFpAP: '||to_char(py_za_tx_01032000.trc_LibFpAP));
1840    IF py_za_tx_01032000.trc_NpValPOOvr THEN
1841       WriteHrTrace('py_za_tx_01032000.trc_NpValPOOvr: TRUE');
1842    ELSE
1843       WriteHrTrace('py_za_tx_01032000.trc_NpValPOOvr: FALSE');
1844    END IF;
1845    WriteHrTrace('py_za_tx_01032000.trc_LibFpPO: '||to_char(py_za_tx_01032000.trc_LibFpPO));
1846 
1847 -- Sum the Liabilities
1848    l_TotLib :=
1849    ( py_za_tx_01032000.trc_LibFpNI
1850    + py_za_tx_01032000.trc_LibFpFB
1851    + py_za_tx_01032000.trc_LibFpTA
1852    + py_za_tx_01032000.trc_LibFpBP
1853    + py_za_tx_01032000.trc_LibFpAB
1854    + py_za_tx_01032000.trc_LibFpAP
1855    + py_za_tx_01032000.trc_LibFpPO
1856    );
1857 
1858 -- Set Net Pay
1859    l_TotNp := py_za_tx_01032000.bal_NET_PAY_RUN;
1860    WriteHrTrace('l_TotNp: '||to_char(l_TotNp));
1861 -- Start Validation
1862 --
1863    IF l_TotLib = 0 THEN
1864       hr_utility.set_location('py_za_tx_utl_01032000.NpVal',2);
1865       NULL;
1866    ELSIF l_TotLib > 0 THEN
1867       hr_utility.set_location('py_za_tx_utl_01032000.NpVal',3);
1868       IF l_TotNp > 0 THEN
1869          hr_utility.set_location('py_za_tx_utl_01032000.NpVal',4);
1870          IF l_TotLib = l_TotNp THEN
1871             hr_utility.set_location('py_za_tx_utl_01032000.NpVal',5);
1872             NULL;
1873          ELSIF l_TotLib > l_TotNp THEN
1874             hr_utility.set_location('py_za_tx_utl_01032000.NpVal',6);
1875             l_RecVal := l_TotLib - l_TotNp;
1876             i:= 1;
1877 
1878             FOR i IN 1..7 LOOP
1879                IF t_Liabilities(i).Lib = 0 THEN
1880                   hr_utility.set_location('py_za_tx_utl_01032000.NpVal',7);
1881                   NULL;
1882                ELSIF t_Liabilities(i).Lib > 0 THEN
1883                   hr_utility.set_location('py_za_tx_utl_01032000.NpVal',8);
1884                   l_NewLib := t_Liabilities(i).Lib - LEAST(t_Liabilities(i).Lib,l_RecVal);
1885                   l_RecVal := l_RecVal - (t_Liabilities(i).Lib - l_NewLib);
1886                   t_Liabilities(i).Lib := l_NewLib;
1887                   py_za_tx_01032000.trc_LibWrn := 'Warning: Net Pay Balance not enough for Tax Recovery';
1888                ELSE -- lib < 0
1889                   hr_utility.set_location('py_za_tx_utl_01032000.NpVal',9);
1890                   NULL;
1891                END IF;
1892            END LOOP;
1893 
1894          ELSE -- l_TotLib > 0,l_TotNp > 0,l_TotLib < l_TotNp
1895             hr_utility.set_location('py_za_tx_utl_01032000.NpVal',10);
1896             NULL;
1897          END IF;
1898 
1899       ELSE -- l_TotLib > 0,l_TotNp <= 0
1900          hr_utility.set_location('py_za_tx_utl_01032000.NpVal',11);
1901          l_RecVal := l_TotLib;
1902          i := 1;
1903 
1904          FOR i IN 1..7 LOOP
1905             IF t_Liabilities(i).Lib > 0 THEN
1906                hr_utility.set_location('py_za_tx_utl_01032000.NpVal',12);
1907                l_NewLib := t_Liabilities(i).Lib - LEAST(t_Liabilities(i).Lib,l_RecVal);
1908                l_RecVal := l_RecVal - (t_Liabilities(i).Lib - l_NewLib);
1909                t_Liabilities(i).Lib := l_NewLib;
1910                py_za_tx_01032000.trc_LibWrn := 'Warning: Net Pay Balance not enough for Tax Recovery';
1911             END IF;
1912          END LOOP;
1913       END IF;
1914 
1915    ELSE -- l_TotLib < 0
1916       hr_utility.set_location('py_za_tx_utl_01032000.NpVal',13);
1917       IF p_Rf THEN
1918          hr_utility.set_location('py_za_tx_utl_01032000.NpVal',14);
1919          NULL;
1920       ELSE
1921          hr_utility.set_location('py_za_tx_utl_01032000.NpVal',15);
1922          l_RecVal := l_TotLib;
1923          i := 1;
1924          FOR i IN 1..7 LOOP
1925             IF t_Liabilities(i).Lib >= 0 THEN
1926                hr_utility.set_location('py_za_tx_utl_01032000.NpVal',16);
1927                NULL;
1928             ELSE -- l_lib < 0
1929                hr_utility.set_location('py_za_tx_utl_01032000.NpVal',17);
1930             -- Has the liability been Overridden?
1931                IF t_Liabilities(i).Ovrrde THEN
1932                   hr_utility.set_location('py_za_tx_utl_01032000.NpVal',18);
1933                   NULL;
1934                ELSE
1935                   hr_utility.set_location('py_za_tx_utl_01032000.NpVal',19);
1936                   l_NewLib := t_Liabilities(i).Lib - GREATEST(t_Liabilities(i).Lib,l_RecVal);
1937                   l_RecVal := l_RecVal - (t_Liabilities(i).Lib - l_NewLib);
1938                   t_Liabilities(i).Lib := l_NewLib;
1939                END IF;
1940            END IF;
1941          END LOOP;
1942       END IF;
1943    END IF;
1944 
1945    hr_utility.set_location('py_za_tx_utl_01032000.NpVal',20);
1946 
1947    py_za_tx_01032000.trc_LibFpNI := t_Liabilities(1).Lib;
1948    py_za_tx_01032000.trc_LibFpFB := t_Liabilities(2).Lib;
1949    py_za_tx_01032000.trc_LibFpTA := t_Liabilities(3).Lib;
1950    py_za_tx_01032000.trc_LibFpBP := t_Liabilities(4).Lib;
1951    py_za_tx_01032000.trc_LibFpAB := t_Liabilities(5).Lib;
1952    py_za_tx_01032000.trc_LibFpAP := t_Liabilities(6).Lib;
1953    py_za_tx_01032000.trc_LibFpPO := t_Liabilities(7).Lib;
1954 
1955    WriteHrTrace('py_za_tx_01032000.trc_LibFpNI: '||to_char(py_za_tx_01032000.trc_LibFpNI));
1956    WriteHrTrace('py_za_tx_01032000.trc_LibFpFB: '||to_char(py_za_tx_01032000.trc_LibFpFB));
1957    WriteHrTrace('py_za_tx_01032000.trc_LibFpTA: '||to_char(py_za_tx_01032000.trc_LibFpTA));
1958    WriteHrTrace('py_za_tx_01032000.trc_LibFpBP: '||to_char(py_za_tx_01032000.trc_LibFpBP));
1959    WriteHrTrace('py_za_tx_01032000.trc_LibFpAB: '||to_char(py_za_tx_01032000.trc_LibFpAB));
1960    WriteHrTrace('py_za_tx_01032000.trc_LibFpAP: '||to_char(py_za_tx_01032000.trc_LibFpAP));
1961    WriteHrTrace('py_za_tx_01032000.trc_LibFpPO: '||to_char(py_za_tx_01032000.trc_LibFpPO));
1962 
1963 EXCEPTION
1964    WHEN OTHERS THEN
1965       IF py_za_tx_01032000.xpt_Msg = 'No Error' THEN
1966          py_za_tx_01032000.xpt_Msg := 'NpVal: '||TO_CHAR(SQLCODE);
1967       END IF;
1968       RAISE py_za_tx_01032000.xpt_E;
1969 END NpVal;
1970 
1971 
1972 -- DaysWorked
1973 /*  Returns the number of days that the person has worked
1974     This could be a negative number that would indicate
1975     a LatePayePeriod
1976 */
1977 FUNCTION DaysWorked RETURN NUMBER
1978 AS
1979    l_DaysWorked NUMBER;
1980    l_EndDte DATE;
1981    l_StrtDte DATE;
1982 
1983 BEGIN
1984    IF py_za_tx_01032000.trc_CalTyp = 'YtdCalc' THEN
1985       hr_utility.set_location('py_za_tx_utl_01032000.DaysWorked',1);
1986       l_EndDte := py_za_tx_01032000.dbi_ZA_CUR_PRD_STRT_DTE - 1;
1987       l_StrtDte := GREATEST(py_za_tx_01032000.dbi_ZA_ACT_STRT_DTE, py_za_tx_01032000.dbi_ZA_TX_YR_STRT);
1988 
1989    ELSIF py_za_tx_01032000.trc_CalTyp = 'CalCalc' THEN
1990       hr_utility.set_location('py_za_tx_utl_01032000.DaysWorked',2);
1991       l_EndDte := py_za_tx_01032000.dbi_ZA_TX_YR_STRT - 1;
1992       l_StrtDte := GREATEST(py_za_tx_01032000.dbi_ZA_ACT_STRT_DTE,
1993       to_date('01-JAN-'||to_char(to_number(to_char(py_za_tx_01032000.dbi_ZA_TX_YR_END,'YYYY'))-1),'DD/MM/YYYY'));
1994 
1995    ELSIF py_za_tx_01032000.trc_CalTyp = 'SitCalc' AND
1996        ( py_za_tx_01032000.trc_RetroInPeriod
1997       OR py_za_tx_01032000.trc_OvrTxCalc
1998        )THEN
1999       hr_utility.set_location('py_za_tx_utl_01032000.DaysWorked',3);
2000       l_EndDte := LEAST(py_za_tx_01032000.dbi_ZA_ACT_END_DTE, py_za_tx_01032000.dbi_ZA_CUR_PRD_END_DTE);
2001       l_StrtDte := GREATEST(py_za_tx_01032000.dbi_ZA_ACT_STRT_DTE, py_za_tx_01032000.dbi_ZA_TX_YR_STRT);
2002 
2003    ELSIF py_za_tx_01032000.trc_CalTyp = 'SitCalc' THEN
2004       hr_utility.set_location('py_za_tx_utl_01032000.DaysWorked',4);
2005       l_EndDte := LEAST(py_za_tx_01032000.dbi_ZA_ACT_END_DTE, py_za_tx_01032000.dbi_ZA_TX_YR_END);
2006       l_StrtDte := GREATEST(py_za_tx_01032000.dbi_ZA_ACT_STRT_DTE, py_za_tx_01032000.dbi_ZA_TX_YR_STRT);
2007 
2008    ELSIF py_za_tx_01032000.trc_CalTyp = 'PstCalc' THEN
2009       hr_utility.set_location('py_za_tx_utl_01032000.DaysWorked',5);
2010       l_EndDte := py_za_tx_01032000.dbi_ZA_ACT_END_DTE;
2011    -- Get Asg Start Date
2012       SELECT MIN(ptp.start_date)
2013         INTO l_StrtDte
2014         FROM per_time_periods ptp
2015        WHERE ptp.prd_information1 = py_za_tx_01032000.trc_AsgTxYear
2016          AND ptp.payroll_id = py_za_tx_01032000.con_PRL_ID;
2017 
2018       hr_utility.set_location('py_za_tx_utl_01032000.DaysWorked',6);
2019 
2020       l_StrtDte := GREATEST(py_za_tx_01032000.dbi_ZA_ACT_STRT_DTE, l_StrtDte);
2021    END IF;
2022 
2023    l_DaysWorked := l_EndDte - l_StrtDte + 1; -- remember about the zero!!!!!
2024 
2025    WriteHrTrace('l_EndDte: '||to_char(l_EndDte,'DD/MM/YYYY'));
2026    WriteHrTrace('l_StrtDte: '||to_char(l_StrtDte,'DD/MM/YYYY'));
2027    WriteHrTrace('l_DaysWorked: '||to_char(l_DaysWorked));
2028 
2029    RETURN l_DaysWorked;
2030 
2031 EXCEPTION
2032    WHEN OTHERS THEN
2033       IF py_za_tx_01032000.xpt_Msg = 'No Error' THEN
2034          py_za_tx_01032000.xpt_Msg := 'DaysWorked: '||TO_CHAR(SQLCODE);
2035       END IF;
2036       RAISE py_za_tx_01032000.xpt_E;
2037 END DaysWorked;
2038 
2039 
2040 PROCEDURE SitPaySplit
2041 AS
2042    l_TxOnSitLim NUMBER(15,2);
2043    l_SitAblTx NUMBER(15,2);
2044 BEGIN
2045    hr_utility.set_location('py_za_tx_utl_01032000.SitPaySplit',1);
2046 -- Directive Type Statuses
2047 --
2048    IF py_za_tx_01032000.dbi_TX_STA IN ('C','D','E','F','J','K','L') THEN
2049       hr_utility.set_location('py_za_tx_utl_01032000.SitPaySplit',2);
2050    -- Check for SitePeriod
2051       IF SitePeriod THEN
2052          hr_utility.set_location('py_za_tx_utl_01032000.SitPaySplit',3);
2053          py_za_tx_01032000.trc_PayeVal :=
2054             ( py_za_tx_01032000.bal_TAX_YTD
2055             + py_za_tx_01032000.trc_LibFpNI
2056             + py_za_tx_01032000.trc_LibFpFB
2057             + py_za_tx_01032000.trc_LibFpTA
2058             + py_za_tx_01032000.trc_LibFpBP
2059             + py_za_tx_01032000.trc_LibFpAB
2060             + py_za_tx_01032000.trc_LibFpAP
2061             + py_za_tx_01032000.trc_LibFpPO
2062             ) - py_za_tx_01032000.bal_PAYE_YTD;
2063          py_za_tx_01032000.trc_SiteVal := -1*py_za_tx_01032000.bal_SITE_YTD;
2064       ELSE
2065          hr_utility.set_location('py_za_tx_utl_01032000.SitPaySplit',4);
2066          py_za_tx_01032000.trc_PayeVal := -1*py_za_tx_01032000.bal_PAYE_YTD;
2067          py_za_tx_01032000.trc_SiteVal := -1*py_za_tx_01032000.bal_SITE_YTD;
2068       END IF;
2069 -- Normal Type Statuses
2070 --
2071    ELSIF py_za_tx_01032000.dbi_TX_STA IN ('A','B') THEN
2072       IF (SitePeriod AND NOT PreErnPeriod) OR LatePayPeriod THEN
2073          hr_utility.set_location('py_za_tx_utl_01032000.SitPaySplit',5);
2074       -- Get the Tax Liability on the Site Limit
2075          l_TxOnSitLim := TaxLiability(p_Amt => py_za_tx_01032000.glb_ZA_SIT_LIM)/py_za_tx_01032000.trc_SitFactor;
2076       -- Get the Tax Amount Liable for SITE
2077          l_SitAblTx :=
2078          ( py_za_tx_01032000.bal_TX_ON_NI_YTD
2079          + py_za_tx_01032000.bal_TX_ON_FB_YTD
2080          + py_za_tx_01032000.bal_TX_ON_BP_YTD
2081          + py_za_tx_01032000.bal_TX_ON_AB_YTD
2082          + py_za_tx_01032000.bal_TX_ON_AP_YTD
2083          + py_za_tx_01032000.trc_LibFpNI
2084          + py_za_tx_01032000.trc_LibFpFB
2085          + py_za_tx_01032000.trc_LibFpBP
2086          + py_za_tx_01032000.trc_LibFpAB
2087          + py_za_tx_01032000.trc_LibFpAP
2088          );
2089       -- Check the Limit
2090          IF l_SitAblTx > l_TxOnSitLim THEN
2091             hr_utility.set_location('py_za_tx_utl_01032000.SitPaySplit',6);
2092             py_za_tx_01032000.trc_SiteVal := l_TxOnSitLim - py_za_tx_01032000.bal_SITE_YTD;
2093             py_za_tx_01032000.trc_PayeVal := (
2094               ( py_za_tx_01032000.bal_TAX_YTD
2095               + py_za_tx_01032000.trc_LibFpNI
2096               + py_za_tx_01032000.trc_LibFpFB
2097               + py_za_tx_01032000.trc_LibFpBP
2098               + py_za_tx_01032000.trc_LibFpAB
2099               + py_za_tx_01032000.trc_LibFpAP
2100               + py_za_tx_01032000.trc_LibFpTA
2101               + py_za_tx_01032000.trc_LibFpPO
2102               ) - l_TxOnSitLim) - py_za_tx_01032000.bal_PAYE_YTD;
2103 
2104          ELSE
2105             hr_utility.set_location('py_za_tx_utl_01032000.SitPaySplit',7);
2106             IF ( py_za_tx_01032000.bal_TX_ON_TA_YTD
2107                + py_za_tx_01032000.trc_LibFpTA
2108                + py_za_tx_01032000.bal_TX_ON_PO_YTD
2109                + py_za_tx_01032000.trc_LibFpPO
2110                ) <= 0 THEN
2111                hr_utility.set_location('py_za_tx_utl_01032000.SitPaySplit',8);
2112                py_za_tx_01032000.trc_SiteVal := ( py_za_tx_01032000.bal_TAX_YTD
2113                               + py_za_tx_01032000.trc_LibFpNI
2114                               + py_za_tx_01032000.trc_LibFpFB
2115                               + py_za_tx_01032000.trc_LibFpBP
2116                               + py_za_tx_01032000.trc_LibFpAB
2117                               + py_za_tx_01032000.trc_LibFpAP
2118                               + py_za_tx_01032000.trc_LibFpTA
2119                               + py_za_tx_01032000.trc_LibFpPO) - py_za_tx_01032000.bal_SITE_YTD;
2120 
2121                py_za_tx_01032000.trc_PayeVal := -1*py_za_tx_01032000.bal_PAYE_YTD;
2122             ELSE
2123                hr_utility.set_location('py_za_tx_utl_01032000.SitPaySplit',9);
2124                py_za_tx_01032000.trc_SiteVal := l_SitAblTx - py_za_tx_01032000.bal_SITE_YTD;
2125 
2126                py_za_tx_01032000.trc_PayeVal := (
2127                  ( py_za_tx_01032000.bal_TAX_YTD
2128                  + py_za_tx_01032000.trc_LibFpNI
2129                  + py_za_tx_01032000.trc_LibFpFB
2130                  + py_za_tx_01032000.trc_LibFpBP
2131                  + py_za_tx_01032000.trc_LibFpAB
2132                  + py_za_tx_01032000.trc_LibFpAP
2133                  + py_za_tx_01032000.trc_LibFpTA
2134                  + py_za_tx_01032000.trc_LibFpPO
2135                  ) - l_SitAblTx) - py_za_tx_01032000.bal_PAYE_YTD;
2136             END IF;
2137          END IF;
2138       ELSE
2139          hr_utility.set_location('py_za_tx_utl_01032000.SitPaySplit',10);
2140          py_za_tx_01032000.trc_PayeVal := -1*py_za_tx_01032000.bal_PAYE_YTD;
2141          py_za_tx_01032000.trc_SiteVal := -1*py_za_tx_01032000.bal_SITE_YTD;
2142       END IF;
2143 -- Seasonal Worker Status
2144 --
2145    ELSIF py_za_tx_01032000.dbi_TX_STA = 'G' THEN
2146       hr_utility.set_location('py_za_tx_utl_01032000.SitPaySplit',11);
2147    -- Get the SitFactor YTD
2148       py_za_tx_01032000.trc_SitFactor := py_za_tx_01032000.glb_ZA_WRK_DYS_PR_YR / py_za_tx_01032000.bal_TOT_SEA_WRK_DYS_WRK_YTD;
2149    -- Get the Tax Liability on the Site Limit
2150       l_TxOnSitLim := TaxLiability(p_Amt => py_za_tx_01032000.glb_ZA_SIT_LIM)/py_za_tx_01032000.trc_SitFactor;
2151    -- Get the Tax Amount Liable for SITE
2152       l_SitAblTx :=
2153       ( py_za_tx_01032000.bal_TX_ON_NI_YTD
2154       + py_za_tx_01032000.bal_TX_ON_FB_YTD
2155       + py_za_tx_01032000.bal_TX_ON_AP_YTD
2156       + py_za_tx_01032000.trc_LibFpNI
2157       + py_za_tx_01032000.trc_LibFpFB
2158       + py_za_tx_01032000.trc_LibFpAP
2159       );
2160    -- Check the Limit
2161       IF l_SitAblTx > l_TxOnSitLim THEN
2162          hr_utility.set_location('py_za_tx_utl_01032000.SitPaySplit',12);
2163          py_za_tx_01032000.trc_SiteVal := l_TxOnSitLim - py_za_tx_01032000.bal_SITE_YTD;
2164          py_za_tx_01032000.trc_PayeVal := ((py_za_tx_01032000.bal_TX_ON_PO_YTD+py_za_tx_01032000.trc_LibFpPO) +(l_SitAblTx - l_TxOnSitLim)) - py_za_tx_01032000.bal_PAYE_YTD;
2165       ELSE
2166          hr_utility.set_location('py_za_tx_utl_01032000.SitPaySplit',13);
2167          py_za_tx_01032000.trc_SiteVal := l_SitAblTx - py_za_tx_01032000.bal_SITE_YTD;
2168          py_za_tx_01032000.trc_PayeVal := py_za_tx_01032000.bal_TX_ON_PO_YTD + py_za_tx_01032000.trc_LibFpPO  - py_za_tx_01032000.bal_PAYE_YTD;
2169       END IF;
2170 -- All Other Statuses
2171 --
2172    ELSE -- set the globals to zero
2173       hr_utility.set_location('py_za_tx_utl_01032000.SitPaySplit',14);
2174       py_za_tx_01032000.trc_PayeVal := 0 - py_za_tx_01032000.bal_PAYE_YTD;
2175       py_za_tx_01032000.trc_SiteVal := 0 - py_za_tx_01032000.bal_SITE_YTD;
2176    END IF;
2177 
2178 EXCEPTION
2179    WHEN OTHERS THEN
2180       IF py_za_tx_01032000.xpt_Msg = 'No Error' THEN
2181          py_za_tx_01032000.xpt_Msg := 'SitPaySplit: '||TO_CHAR(SQLCODE);
2182       END IF;
2183       RAISE py_za_tx_01032000.xpt_E;
2184 END SitPaySplit;
2185 
2186 
2187 -- Trace Function
2188 --
2189 PROCEDURE Trace AS
2190 BEGIN
2191 
2192 /*DELETE FROM pay_za_tax_traces pztt
2193    WHERE pztt.prl_act_id not in (
2194    SELECT payroll_action_id
2195      from pay_payroll_actions)
2196 */
2197    INSERT INTO pay_za_tax_traces(
2198     ASG_ACT_ID
2199    ,ASG_ID
2200    ,PRL_ACT_ID
2201    ,PRL_ID
2202    ,TX_STA
2203    ,PER_AGE
2204    ,CalTyp
2205    ,TX_DIR_VAL
2206    ,It3Ind
2207    ,TxPercVal
2208    ,ASG_STRT_DTE
2209    ,ZA_ACT_END_DTE
2210    ,ZA_CUR_PRD_STRT_DTE
2211    ,ZA_CUR_PRD_END_DTE
2212    ,ZA_TX_YR_STRT
2213    ,ZA_TX_YR_END
2214    ,SES_DTE
2215    ,PrdFactor
2216    ,PosFactor
2217    ,SitFactor
2218    ,ZA_PAY_PRDS_LFT
2219    ,ZA_PAY_PRDS_PER_YR
2220    ,ZA_DYS_IN_YR
2221    ,SEA_WRK_DYS_WRK
2222    ,ARR_PF_FRQ
2223    ,ARR_RA_FRQ
2224    ,BP_TX_RCV
2225    ,RA_FRQ
2226    ,TxbIncPtd
2227    ,BseErn
2228    ,TxbBseInc
2229    ,TotLibBse
2230    ,TxbIncYtd
2231    ,PerTxbInc
2232    ,PerPenFnd
2233    ,PerRfiCon
2234    ,PerRfiTxb
2235    ,PerPenFndMax
2236    ,PerPenFndAbm
2237    ,AnnTxbInc
2238    ,AnnPenFnd
2239    ,AnnRfiCon
2240    ,AnnRfiTxb
2241    ,AnnPenFndMax
2242    ,AnnPenFndAbm
2243    ,ArrPenFnd
2244    ,ArrPenFndAbm
2245    ,RetAnu
2246    ,NrfiCon
2247    ,RetAnuMax
2248    ,RetAnuAbm
2249    ,ArrRetAnu
2250    ,ArrRetAnuAbm
2251    ,Rebate
2252    ,Threshold
2253    ,MedAidAbm
2254    ,PerTotAbm
2255    ,AnnTotAbm
2256    ,NorIncYtd
2257    ,NorIncPtd
2258    ,NorErn
2259    ,TxbNorInc
2260    ,LibFyNI
2261    ,TX_ON_NI_YTD
2262    ,TX_ON_NI_PTD
2263    ,LibFpNI
2264    ,FrnBenYtd
2265    ,FrnBenPtd
2266    ,FrnBenErn
2267    ,TxbFrnInc
2268    ,LibFyFB
2269    ,TX_ON_FB_YTD
2270    ,TX_ON_FB_PTD
2271    ,LibFpFB
2272    ,TrvAllYtd
2273    ,TrvAllPtd
2274    ,TrvAllErn
2275    ,TxbTrvInc
2276    ,LibFyTA
2277    ,TX_ON_TA_YTD
2278    ,TX_ON_TA_PTD
2279    ,LibFpTA
2280    ,BonProYtd
2281    ,BonProPtd
2282    ,BonProErn
2283    ,TxbBonProInc
2284    ,LibFyBP
2285    ,TX_ON_BP_YTD
2286    ,TX_ON_BP_PTD
2287    ,LibFpBP
2288    ,AnnBonYtd
2289    ,AnnBonErn
2290    ,TxbAnnBonInc
2291    ,LibFyAB
2292    ,TX_ON_AB_YTD
2293    ,TX_ON_AB_PTD
2294    ,LibFpAB
2295    ,AnnPymYtd
2296    ,AnnPymPtd
2297    ,AnnPymErn
2298    ,TxbAnnPymInc
2299    ,LibFyAP
2300    ,TX_ON_AP_YTD
2301    ,TX_ON_AP_PTD
2302    ,LibFpAP
2303    ,PblOffYtd
2304    ,PblOffPtd
2305    ,PblOffErn
2306    ,LibFyPO
2307    ,TX_ON_PO_YTD
2308    ,TX_ON_PO_PTD
2309    ,LibFpPO
2310    ,MsgTxStatus
2311    ,LibWrn
2312    ,PayValue
2313    ,PayeVal
2314    ,SiteVal
2315    )
2316    VALUES(
2317     py_za_tx_01032000.con_ASG_ACT_ID
2318    ,py_za_tx_01032000.con_ASG_ID
2319    ,py_za_tx_01032000.con_PRL_ACT_ID
2320    ,py_za_tx_01032000.con_PRL_ID
2321    ,py_za_tx_01032000.dbi_TX_STA
2322    ,py_za_tx_01032000.dbi_PER_AGE
2323    ,py_za_tx_01032000.trc_CalTyp
2324    ,py_za_tx_01032000.dbi_TX_DIR_VAL
2325    ,py_za_tx_01032000.trc_It3Ind
2326    ,py_za_tx_01032000.trc_TxPercVal
2327    ,py_za_tx_01032000.dbi_ZA_ACT_STRT_DTE
2328    ,py_za_tx_01032000.dbi_ZA_ACT_END_DTE
2329    ,py_za_tx_01032000.dbi_ZA_CUR_PRD_STRT_DTE
2330    ,py_za_tx_01032000.dbi_ZA_CUR_PRD_END_DTE
2331    ,py_za_tx_01032000.dbi_ZA_TX_YR_STRT
2332    ,py_za_tx_01032000.dbi_ZA_TX_YR_END
2333    ,py_za_tx_01032000.dbi_SES_DTE
2334    ,py_za_tx_01032000.trc_PrdFactor
2335    ,py_za_tx_01032000.trc_PosFactor
2336    ,py_za_tx_01032000.trc_SitFactor
2337    ,py_za_tx_01032000.dbi_ZA_PAY_PRDS_LFT
2338    ,py_za_tx_01032000.dbi_ZA_PAY_PRDS_PER_YR
2339    ,py_za_tx_01032000.dbi_ZA_DYS_IN_YR
2340    ,py_za_tx_01032000.dbi_SEA_WRK_DYS_WRK
2341    ,py_za_tx_01032000.dbi_ARR_PF_FRQ
2342    ,py_za_tx_01032000.dbi_ARR_RA_FRQ
2343    ,py_za_tx_01032000.dbi_BP_TX_RCV
2344    ,py_za_tx_01032000.dbi_RA_FRQ
2345    ,py_za_tx_01032000.trc_TxbIncPtd
2346    ,py_za_tx_01032000.trc_BseErn
2347    ,py_za_tx_01032000.trc_TxbBseInc
2348    ,py_za_tx_01032000.trc_TotLibBse
2349    ,py_za_tx_01032000.trc_TxbIncYtd
2350    ,py_za_tx_01032000.trc_PerTxbInc
2351    ,py_za_tx_01032000.trc_PerPenFnd
2352    ,py_za_tx_01032000.trc_PerRfiCon
2353    ,py_za_tx_01032000.trc_PerRfiTxb
2354    ,py_za_tx_01032000.trc_PerPenFndMax
2355    ,py_za_tx_01032000.trc_PerPenFndAbm
2356    ,py_za_tx_01032000.trc_AnnTxbInc
2357    ,py_za_tx_01032000.trc_AnnPenFnd
2358    ,py_za_tx_01032000.trc_AnnRfiCon
2359    ,py_za_tx_01032000.trc_AnnRfiTxb
2360    ,py_za_tx_01032000.trc_AnnPenFndMax
2361    ,py_za_tx_01032000.trc_AnnPenFndAbm
2362    ,py_za_tx_01032000.trc_ArrPenFnd
2363    ,py_za_tx_01032000.trc_ArrPenFndAbm
2364    ,py_za_tx_01032000.trc_RetAnu
2365    ,py_za_tx_01032000.trc_NrfiCon
2366    ,py_za_tx_01032000.trc_RetAnuMax
2367    ,py_za_tx_01032000.trc_RetAnuAbm
2368    ,py_za_tx_01032000.trc_ArrRetAnu
2369    ,py_za_tx_01032000.trc_ArrRetAnuAbm
2370    ,py_za_tx_01032000.trc_Rebate
2371    ,py_za_tx_01032000.trc_Threshold
2372    ,py_za_tx_01032000.trc_MedAidAbm
2373    ,py_za_tx_01032000.trc_PerTotAbm
2374    ,py_za_tx_01032000.trc_AnnTotAbm
2375    ,py_za_tx_01032000.trc_NorIncYtd
2376    ,py_za_tx_01032000.trc_NorIncPtd
2377    ,py_za_tx_01032000.trc_NorErn
2378    ,py_za_tx_01032000.trc_TxbNorInc
2379    ,py_za_tx_01032000.trc_LibFyNI
2380    ,py_za_tx_01032000.bal_TX_ON_NI_YTD
2381    ,py_za_tx_01032000.bal_TX_ON_NI_PTD
2382    ,py_za_tx_01032000.trc_LibFpNI
2383    ,py_za_tx_01032000.trc_FrnBenYtd
2384    ,py_za_tx_01032000.trc_FrnBenPtd
2385    ,py_za_tx_01032000.trc_FrnBenErn
2386    ,py_za_tx_01032000.trc_TxbFrnInc
2387    ,py_za_tx_01032000.trc_LibFyFB
2388    ,py_za_tx_01032000.bal_TX_ON_FB_YTD
2389    ,py_za_tx_01032000.bal_TX_ON_FB_PTD
2390    ,py_za_tx_01032000.trc_LibFpFB
2391    ,py_za_tx_01032000.trc_TrvAllYtd
2392    ,py_za_tx_01032000.trc_TrvAllPtd
2393    ,py_za_tx_01032000.trc_TrvAllErn
2394    ,py_za_tx_01032000.trc_TxbTrvInc
2395    ,py_za_tx_01032000.trc_LibFyTA
2396    ,py_za_tx_01032000.bal_TX_ON_TA_YTD
2397    ,py_za_tx_01032000.bal_TX_ON_TA_PTD
2398    ,py_za_tx_01032000.trc_LibFpTA
2399    ,py_za_tx_01032000.trc_BonProYtd
2400    ,py_za_tx_01032000.trc_BonProPtd
2401    ,py_za_tx_01032000.trc_BonProErn
2402    ,py_za_tx_01032000.trc_TxbBonProInc
2403    ,py_za_tx_01032000.trc_LibFyBP
2404    ,py_za_tx_01032000.bal_TX_ON_BP_YTD
2405    ,py_za_tx_01032000.bal_TX_ON_BP_PTD
2406    ,py_za_tx_01032000.trc_LibFpBP
2407    ,py_za_tx_01032000.trc_AnnBonYtd
2408    ,py_za_tx_01032000.trc_AnnBonErn
2409    ,py_za_tx_01032000.trc_TxbAnnBonInc
2410    ,py_za_tx_01032000.trc_LibFyAB
2411    ,py_za_tx_01032000.bal_TX_ON_AB_YTD
2412    ,py_za_tx_01032000.bal_TX_ON_AB_PTD
2413    ,py_za_tx_01032000.trc_LibFpAB
2414    ,py_za_tx_01032000.trc_AnnPymYtd
2415    ,py_za_tx_01032000.trc_AnnPymPtd
2416    ,py_za_tx_01032000.trc_AnnPymErn
2417    ,py_za_tx_01032000.trc_TxbAnnPymInc
2418    ,py_za_tx_01032000.trc_LibFyAP
2419    ,py_za_tx_01032000.bal_TX_ON_AP_YTD
2420    ,py_za_tx_01032000.bal_TX_ON_AP_PTD
2421    ,py_za_tx_01032000.trc_LibFpAP
2422    ,py_za_tx_01032000.trc_PblOffYtd
2423    ,py_za_tx_01032000.trc_PblOffPtd
2424    ,py_za_tx_01032000.trc_PblOffErn
2425    ,py_za_tx_01032000.trc_LibFyPO
2426    ,py_za_tx_01032000.bal_TX_ON_PO_YTD
2427    ,py_za_tx_01032000.bal_TX_ON_PO_PTD
2428    ,py_za_tx_01032000.trc_LibFpPO
2429    ,''
2430    ,py_za_tx_01032000.trc_LibWrn
2431    ,py_za_tx_01032000.trc_PayValue
2432    ,py_za_tx_01032000.trc_PayeVal
2433    ,py_za_tx_01032000.trc_SiteVal);
2434 
2435 EXCEPTION
2436    WHEN OTHERS THEN
2437       IF py_za_tx_01032000.xpt_Msg = 'No Error' THEN
2438          py_za_tx_01032000.xpt_Msg := 'Trace: '||TO_CHAR(SQLCODE);
2439       END IF;
2440       RAISE py_za_tx_01032000.xpt_E;
2441 END Trace;
2442 
2443 PROCEDURE ClearGlobals AS
2444 
2445 BEGIN
2446    hr_utility.set_location('py_za_tx_utl_01032000.ClearGlobals',1);
2447 -- Calculation Type
2448    py_za_tx_01032000.trc_CalTyp := 'Unknown';
2449 -- Factors
2450    py_za_tx_01032000.trc_TxbIncPtd := 0;
2451    py_za_tx_01032000.trc_PrdFactor := 0;
2452    py_za_tx_01032000.trc_PosFactor := 0;
2453    py_za_tx_01032000.trc_SitFactor := 1;
2454 -- Base Income
2455    py_za_tx_01032000.trc_BseErn := 0;
2456    py_za_tx_01032000.trc_TxbBseInc := 0;
2457    py_za_tx_01032000.trc_TotLibBse := 0;
2458 -- Period Pension Fund
2459    py_za_tx_01032000.trc_TxbIncYtd := 0;
2460    py_za_tx_01032000.trc_PerTxbInc := 0;
2461    py_za_tx_01032000.trc_PerPenFnd := 0;
2462    py_za_tx_01032000.trc_PerRfiCon := 0;
2463    py_za_tx_01032000.trc_PerRfiTxb := 0;
2464    py_za_tx_01032000.trc_PerPenFndMax := 0;
2465    py_za_tx_01032000.trc_PerPenFndAbm := 0;
2466 -- Annual Pension Fund
2467    py_za_tx_01032000.trc_AnnTxbInc := 0;
2468    py_za_tx_01032000.trc_AnnPenFnd := 0;
2469    py_za_tx_01032000.trc_AnnRfiCon := 0;
2470    py_za_tx_01032000.trc_AnnRfiTxb := 0;
2471    py_za_tx_01032000.trc_AnnPenFndMax := 0;
2472    py_za_tx_01032000.trc_AnnPenFndAbm := 0;
2473 -- Arrear Pension
2474    py_za_tx_01032000.trc_ArrPenFnd := 0;
2475    py_za_tx_01032000.trc_ArrPenFndAbm := 0;
2476    py_za_tx_01032000.trc_PfUpdFig := 0;
2477 -- Retirement Annuity
2478    py_za_tx_01032000.trc_RetAnu := 0;
2479    py_za_tx_01032000.trc_NrfiCon := 0;
2480    py_za_tx_01032000.trc_RetAnuMax := 0;
2481    py_za_tx_01032000.trc_RetAnuAbm := 0;
2482 -- Arrear Retirement Annuity
2483    py_za_tx_01032000.trc_ArrRetAnu := 0;
2484    py_za_tx_01032000.trc_ArrRetAnuAbm := 0;
2485    py_za_tx_01032000.trc_RaUpdFig := 0;
2486 -- Rebates Thresholds and Med Aid
2487    py_za_tx_01032000.trc_Rebate := 0;
2488    py_za_tx_01032000.trc_Threshold := 0;
2489    py_za_tx_01032000.trc_MedAidAbm := 0;
2490 -- Abatement Totals
2491    py_za_tx_01032000.trc_PerTotAbm := 0;
2492    py_za_tx_01032000.trc_AnnTotAbm := 0;
2493 -- Normal Income
2494    py_za_tx_01032000.trc_NorIncYtd := 0;
2495    py_za_tx_01032000.trc_NorIncPtd := 0;
2496    py_za_tx_01032000.trc_NorErn := 0;
2497    py_za_tx_01032000.trc_TxbNorInc := 0;
2498    py_za_tx_01032000.trc_TotLibNI  := 0;
2499    py_za_tx_01032000.trc_LibFyNI := 0;
2500    py_za_tx_01032000.trc_LibFpNI := 0;
2501 -- Fringe Benefits
2502    py_za_tx_01032000.trc_FrnBenYtd := 0;
2503    py_za_tx_01032000.trc_FrnBenPtd := 0;
2504    py_za_tx_01032000.trc_FrnBenErn := 0;
2505    py_za_tx_01032000.trc_TxbFrnInc := 0;
2506    py_za_tx_01032000.trc_TotLibFB := 0;
2507    py_za_tx_01032000.trc_LibFyFB := 0;
2508    py_za_tx_01032000.trc_LibFpFB := 0;
2509 -- Travel Allowance
2510    py_za_tx_01032000.trc_TrvAllYtd := 0;
2511    py_za_tx_01032000.trc_TrvAllPtd := 0;
2512    py_za_tx_01032000.trc_TrvAllErn := 0;
2513    py_za_tx_01032000.trc_TxbTrvInc := 0;
2514    py_za_tx_01032000.trc_TotLibTA := 0;
2515    py_za_tx_01032000.trc_LibFyTA := 0;
2516    py_za_tx_01032000.trc_LibFpTA := 0;
2517 -- Bonus Provision
2518    py_za_tx_01032000.trc_BonProYtd := 0;
2519    py_za_tx_01032000.trc_BonProPtd := 0;
2520    py_za_tx_01032000.trc_BonProErn := 0;
2521    py_za_tx_01032000.trc_TxbBonProInc := 0;
2522    py_za_tx_01032000.trc_TotLibBP := 0;
2523    py_za_tx_01032000.trc_LibFyBP := 0;
2524    py_za_tx_01032000.trc_LibFpBP := 0;
2525 -- Annual Bonus
2526    py_za_tx_01032000.trc_AnnBonYtd := 0;
2527    py_za_tx_01032000.trc_AnnBonPtd := 0;
2528    py_za_tx_01032000.trc_AnnBonErn := 0;
2529    py_za_tx_01032000.trc_TxbAnnBonInc := 0;
2530    py_za_tx_01032000.trc_TotLibAB := 0;
2531    py_za_tx_01032000.trc_LibFyAB := 0;
2532    py_za_tx_01032000.trc_LibFpAB := 0;
2533 -- Annual Payments
2534    py_za_tx_01032000.trc_AnnPymYtd := 0;
2535    py_za_tx_01032000.trc_AnnPymPtd := 0;
2536    py_za_tx_01032000.trc_AnnPymErn := 0;
2537    py_za_tx_01032000.trc_TxbAnnPymInc := 0;
2538    py_za_tx_01032000.trc_TotLibAP := 0;
2539    py_za_tx_01032000.trc_LibFyAP := 0;
2540    py_za_tx_01032000.trc_LibFpAP := 0;
2541 -- Pubilc Office Allowance
2542    py_za_tx_01032000.trc_PblOffYtd := 0;
2543    py_za_tx_01032000.trc_PblOffPtd := 0;
2544    py_za_tx_01032000.trc_PblOffErn := 0;
2545    py_za_tx_01032000.trc_LibFyPO := 0;
2546    py_za_tx_01032000.trc_LibFpPO := 0;
2547 -- Messages
2548    py_za_tx_01032000.trc_LibWrn := ' ';
2549 -- Pay Value of This Calculation
2550    py_za_tx_01032000.trc_PayValue := 0;
2551 -- PAYE and SITE Values
2552    py_za_tx_01032000.trc_PayeVal := 0;
2553    py_za_tx_01032000.trc_SiteVal := 0;
2554 -- IT3A Threshold Indicator
2555    py_za_tx_01032000.trc_It3Ind := 0;
2556 -- Tax Percentage Value On trace
2557    py_za_tx_01032000.trc_TxPercVal := 0;
2558 
2559 -- Total Taxable Income Update Figure
2560    py_za_tx_01032000.trc_OUpdFig := 0;
2561 
2562 -- Net Taxable Income Update Figure
2563    py_za_tx_01032000.trc_NtiUpdFig := 0;
2564 
2565 -- NpVal Override Globals
2566    py_za_tx_01032000.trc_NpValNIOvr := FALSE;
2567    py_za_tx_01032000.trc_NpValFBOvr := FALSE;
2568    py_za_tx_01032000.trc_NpValTAOvr := FALSE;
2569    py_za_tx_01032000.trc_NpValBPOvr := FALSE;
2570    py_za_tx_01032000.trc_NpValABOvr := FALSE;
2571    py_za_tx_01032000.trc_NpValAPOvr := FALSE;
2572    py_za_tx_01032000.trc_NpValPOOvr := FALSE;
2573 
2574 -- Assignment Tax Year
2575    py_za_tx_01032000.trc_AsgTxYear := 0;
2576 
2577 -- Global Exception Message
2578    py_za_tx_01032000.xpt_Msg := 'No Error';
2579 
2580 -- Override Globals
2581    py_za_tx_01032000.trc_OvrTxCalc   := FALSE;
2582    py_za_tx_01032000.trc_OvrTyp      := 'V';
2583    py_za_tx_01032000.trc_OvrPrc      := 0;
2584    py_za_tx_01032000.trc_OvrWrn      := ' ';
2585 
2586 -- Retro Global
2587    py_za_tx_01032000.trc_RetroInPeriod := FALSE;
2588 
2589 EXCEPTION
2590    WHEN OTHERS THEN
2591       IF py_za_tx_01032000.xpt_Msg = 'No Error' THEN
2592          py_za_tx_01032000.xpt_Msg := 'ClearGlobals: '||TO_CHAR(SQLCODE);
2593       END IF;
2594       RAISE py_za_tx_01032000.xpt_E;
2595 END ClearGlobals;
2596 
2597 END py_za_tx_utl_01032000;
2598