1 package body pay_sa_general as
2 /* $Header: pysagenr.pkb 120.2.12010000.2 2008/08/06 08:16:32 ubhat ship $ */
3
4 g_package varchar2(30) := 'pay_sa_general';
5
6 ------------------------------------------------------------------------
7 -- Function LOCAL_NATNATIONALITY_NOT_DEFINED
8 -- This function return NOTEXISTS If the value for HR: Local Nationality
9 -- Profile has not been defined else it retuns EXISTS.
10 ------------------------------------------------------------------------
11
12 function local_nationality_not_defined return varchar2
13 is
14
15 begin
16
17 if FND_PROFILE.VALUE('PER_LOCAL_NATIONALITY') is null then
18 return 'NOTEXISTS';
19 else
20 return 'EXISTS';
21 end if;
22 end local_nationality_not_defined;
23
24
25 ------------------------------------------------------------------------
26 ------------------------------------------------------------------------
27 -- Function LOCAL_NATIONALITY_MATCHES
28 -- This function return NOMATCH If the value for HR: Local Nationality
29 -- Profile does not match with the person's nationality else it retuns MATCH.
30 ------------------------------------------------------------------------
31 function local_nationality_matches
32 (p_assignment_id IN per_all_assignments_f.assignment_id%type,
33 p_date_earned IN Date)
34 return varchar2
35 is
36 l_person_id number;
37 l_nat_cd varchar2(100);
38
39 begin
40
41 BEGIN
42 Select person_id
43 Into l_person_id
44 From PER_ALL_ASSIGNMENTS_F
45 Where ASSIGNMENT_ID = p_assignment_id
46 AND p_date_earned between EFFECTIVE_START_DATE AND EFFECTIVE_END_DATE;
47 EXCEPTION
48 WHEN no_data_found Then
49 Null;
50 END;
51
52 BEGIN
53 SELECT NATIONALITY
54 INTO l_nat_cd
55 FROM per_all_people_f
56 WHERE person_id = l_person_id
57 AND p_date_earned BETWEEN effective_start_date AND effective_end_date;
58
59 EXCEPTION
60 WHEN no_data_found Then
61 Null;
62 END;
63
64 if UPPER(l_nat_cd) = FND_PROFILE.VALUE('PER_LOCAL_NATIONALITY') then
65 return 'MATCH';
66 else
67 return 'NOMATCH';
68 end if;
69 end local_nationality_matches;
70 ------------------------------------------------------------------------
71 -- Function GET_MESSAGE
72 -- This function is used to obtain a message.
73 -- The token parameters must be of the form 'TOKEN_NAME:TOKEN_VALUE' i.e.
74 -- If you want to set the value of a token called ELEMENT to Social Ins
75 -- the token parameter would be 'ELEMENT:Social Ins.'
76 ------------------------------------------------------------------------
77
78 function get_message
79 (p_product in varchar2
80 ,p_message_name in varchar2
81 ,p_token1 in varchar2 default null
82 ,p_token2 in varchar2 default null
83 ,p_token3 in varchar2 default null) return varchar2
84 is
85
86 l_message varchar2(2000);
87 l_token_name varchar2(20);
88 l_token_value varchar2(80);
89 l_colon_position number;
90 l_proc varchar2(72) := g_package||'.get_message';
91 --
92 begin
93 --
94 hr_utility.set_location('Entered '||l_proc,5);
95 hr_utility.set_location('. Message Name: '||p_message_name,40);
96
97 fnd_message.set_name(p_product, p_message_name);
98
99 if p_token1 is not null then
100 /* Obtain token 1 name and value */
101 l_colon_position := instr(p_token1,':');
102 l_token_name := substr(p_token1,1,l_colon_position-1);
103 l_token_value := substr(p_token1,l_colon_position+1,length(p_token1));
104 fnd_message.set_token(l_token_name, l_token_value);
105 hr_utility.set_location('. Token1: '||l_token_name||'. Value: '||l_token_value,50);
106 end if;
107
108 if p_token2 is not null then
109 /* Obtain token 2 name and value */
110 l_colon_position := instr(p_token2,':');
111 l_token_name := substr(p_token2,1,l_colon_position-1);
112 l_token_value := substr(p_token2,l_colon_position+1,length(p_token2));
113 fnd_message.set_token(l_token_name, l_token_value);
114 hr_utility.set_location('. Token2: '||l_token_name||'. Value: '||l_token_value,60);
115 end if;
116
117 if p_token3 is not null then
118 /* Obtain token 3 name and value */
119 l_colon_position := instr(p_token3,':');
120 l_token_name := substr(p_token3,1,l_colon_position-1);
121 l_token_value := substr(p_token3,l_colon_position+1,length(p_token3));
122 fnd_message.set_token(l_token_name, l_token_value);
123 hr_utility.set_location('. Token3: '||l_token_name||'. Value: '||l_token_value,70);
124 end if;
125
126 l_message := substr(fnd_message.get,1,254);
127
128 hr_utility.set_location('leaving '||l_proc,100);
129
130 return l_message;
131
132 end get_message;
133 ------------------------------------------------------------------
134 --Functions for EFT
135 ------------------------------------------------------------------
136 -- GET_PARAMETER used in SQL to decode legislative parameters
137 -----------------------------------------------------------------------------
138 FUNCTION get_parameter(
139 p_parameter_string IN VARCHAR2
140 ,p_token IN VARCHAR2
141 ,p_segment_number IN NUMBER DEFAULT NULL ) RETURN VARCHAR2
142 IS
143 l_parameter pay_payroll_actions.legislative_parameters%TYPE:=NULL;
144 l_start_pos NUMBER;
145 l_delimiter varchar2(1):=' ';
146 l_proc VARCHAR2(60):= g_package||' get parameter ';
147 BEGIN
148 l_start_pos := instr(' '||p_parameter_string,l_delimiter||p_token||'=');
149 IF l_start_pos = 0 THEN
150 l_delimiter := '|';
151 l_start_pos := instr(' '||p_parameter_string,l_delimiter||p_token||'=');
152 end if;
153 IF l_start_pos <> 0 THEN
154 l_start_pos := l_start_pos + length(p_token||'=');
155 l_parameter := substr(p_parameter_string,
156 l_start_pos,
157 instr(p_parameter_string||' ',
158 ',',l_start_pos)
159 - l_start_pos);
160 IF p_segment_number IS NOT NULL THEN
161 l_parameter := ':'||l_parameter||':';
162 l_parameter := substr(l_parameter,
163 instr(l_parameter,':',1,p_segment_number)+1,
164 instr(l_parameter,':',1,p_segment_number+1) -1
165 - instr(l_parameter,':',1,p_segment_number));
166 END IF;
167 END IF;
168 RETURN l_parameter;
169 END get_parameter;
170 --
171 FUNCTION chk_multiple_assignments(p_effective_date IN DATE
172 ,p_person_id IN NUMBER) RETURN VARCHAR2 AS
173 CURSOR get_multiple_assgts IS
174 SELECT count(DISTINCT paf.assignment_id)
175 FROM per_all_assignments_f paf
176 ,per_assignment_status_types pas
177 WHERE paf.assignment_type = 'E'
178 AND paf.PERSON_ID = p_person_id
179 AND p_effective_date between effective_start_date and effective_end_date
180 AND paf.assignment_status_type_id = pas.assignment_status_type_id
181 AND pas.per_system_status in ('ACTIVE_ASSIGN', 'SUSP_ASSIGN');
182 l_count NUMBER :=0;
183 BEGIN
184 OPEN get_multiple_assgts;
185 FETCH get_multiple_assgts INTO l_count;
186 CLOSE get_multiple_assgts;
187 IF l_count > 1 THEN
188 RETURN 'Y';
189 ELSE
190 RETURN 'N';
191 END IF;
192 END chk_multiple_assignments;
193 -----
194 function get_sum return number as
195 l_sum pay_pre_payments.value%type;
196 CURSOR CSR_SA_EFT_SUM is
197 SELECT SUM(ppp.value)
198 FROM per_assignments_f paf
199 ,per_people_f pef
200 ,pay_pre_payments ppp
201 ,pay_assignment_actions paa
202 ,pay_payroll_actions ppa
203 WHERE paa.payroll_action_id =
204 pay_magtape_generic.get_parameter_value('PAYROLL_ACTION_ID')
205 AND paa.pre_payment_id = ppp.pre_payment_id
206 AND paa.payroll_action_id = ppa.payroll_action_id
207 AND paa.assignment_id = paf.assignment_id
208 AND paf.person_id = pef.person_id
209 AND ppp.value > 0
210 AND ppa.effective_date BETWEEN paf.effective_start_date
211 AND paf.effective_end_date
212 AND ppa.effective_date BETWEEN pef.effective_start_date
213 AND pef.effective_end_date;
214 BEGIN
215 open CSR_SA_EFT_SUM;
216 fetch CSR_SA_EFT_SUM into l_sum;
217 close CSR_SA_EFT_SUM;
218 return l_sum;
219 END get_sum;
220 ----------------
221 function get_count RETURN NUMBER as
222 l_count NUMBER(15);
223 CURSOR CSR_SA_EFT_COUNT IS
224 SELECT COUNT(*)
225 FROM per_assignments_f paf
226 ,per_people_f pef
227 ,pay_pre_payments ppp
228 ,pay_assignment_actions paa
229 ,pay_payroll_actions ppa
230 WHERE paa.payroll_action_id =
231 pay_magtape_generic.get_parameter_value('PAYROLL_ACTION_ID')
232 AND paa.pre_payment_id = ppp.pre_payment_id
233 AND paa.payroll_action_id = ppa.payroll_action_id
234 AND paa.assignment_id = paf.assignment_id
235 AND paf.person_id = pef.person_id
236 AND ppp.value > 0
237 AND ppa.effective_date BETWEEN paf.effective_start_date
238 AND paf.effective_end_date
239 AND ppa.effective_date BETWEEN pef.effective_start_date
240 AND pef.effective_end_date;
241 BEGIN
242 open CSR_SA_EFT_COUNT;
243 fetch CSR_SA_EFT_COUNT into l_count;
244 close CSR_SA_EFT_COUNT;
245 return l_count;
246 END get_count;
247 ------------------------
248 ------------------------------------------------------------------------
249 -- Function for returning contributory wage of employees over 50 years
250 ------------------------------------------------------------------------
251 FUNCTION get_cont_wage_emp_50 (
252 p_assignment_action_id IN NUMBER
253 ,p_assignment_id IN NUMBER
254 ,p_date_earned IN DATE
255 ,p_pct_value IN NUMBER
256 ,p_subject_to_gosi IN NUMBER)
257 RETURN NUMBER AS
258
259 CURSOR csr_get_def_bal_id (p_def_bal_name IN VARCHAR2) IS
260 SELECT u.creator_id
261 FROM ff_user_entities u,
262 ff_database_items d
263 WHERE d.user_name = p_def_bal_name
264 AND u.user_entity_id = d.user_entity_id
265 AND u.legislation_code = 'SA'
266 AND u.business_group_id is null
267 AND u.creator_type = 'B';
268
269 CURSOR csr_get_assact_id IS
270 SELECT paa.assignment_action_id
271 ,ppa.date_earned
272 FROM pay_assignment_actions paa
273 ,pay_payroll_actions ppa
274 ,pay_run_results prr
275 ,pay_element_types_f pet
276 WHERE paa.assignment_id = p_assignment_id
277 AND paa.assignment_action_id = prr.assignment_action_id
278 AND paa.payroll_action_id = ppa.payroll_action_id
279 AND paa.action_status = 'C'
280 AND ppa.action_status = 'C'
281 AND ppa.action_type in ('R','Q')
282 AND prr.element_type_id = pet.element_type_id
283 AND pet.element_name ='GOSI'
284 AND p_date_earned between pet.effective_start_date and pet.effective_end_date
285 AND prr.status = 'P'
286 AND paa.assignment_action_id < p_assignment_action_id
287 --AND ppa.date_earned >= ADD_MONTHS(TRUNC(p_date_earned,'YYYY'),-12)
288 ORDER BY paa.assignment_action_id DESC;
289
290 rec_get_assact_id csr_get_assact_id%ROWTYPE;
291
292 l_prev_salary NUMBER;
293 l_subject_gosi_id NUMBER;
294 l_old_assact_id NUMBER;
295 l_prev_assact_id NUMBER;
296 l_ref_earnings_id NUMBER;
297 l_diff_exist NUMBER;
298 l_diff_salary NUMBER;
299 l_old_wage NUMBER;
300 l_c_wage_1 NUMBER;
301 l_c_wage_2 NUMBER;
302 l_old_date_earned DATE;
303
304 BEGIN
305 l_diff_exist := 0;
306 l_ref_earnings_id := NULL;
307 OPEN csr_get_def_bal_id( 'GOSI_REFERENCE_EARNINGS_ASG_YTD');
308 FETCH csr_get_def_bal_id INTO l_ref_earnings_id;
309 CLOSE csr_get_def_bal_id;
310
311 l_subject_gosi_id := NULL;
312 OPEN csr_get_def_bal_id( 'SUBJECT_TO_GOSI_ASG_RUN');
313 FETCH csr_get_def_bal_id INTO l_subject_gosi_id;
314 CLOSE csr_get_def_bal_id;
315
316 l_old_assact_id := NULL;
317
318 /*check if the earlier run was in previous year and get the assignment action_id*/
319 OPEN csr_get_assact_id;
320 LOOP
321 FETCH csr_get_assact_id INTO rec_get_assact_id;
322 EXIT WHEN csr_get_assact_id%NOTFOUND;
323 IF l_old_assact_id IS NULL THEN
324 IF TRUNC(rec_get_assact_id.date_earned,'YYYY') < TRUNC(p_date_earned, 'YYYY') THEN
325 l_old_assact_id := rec_get_assact_id.assignment_action_id;
326 l_old_date_earned := rec_get_assact_id.date_earned;
327 l_old_wage := pay_balance_pkg.get_value(l_ref_earnings_id,l_old_assact_id);
328 ELSE
329 /*Exit if the earlier run is in the same year. This indicates there is no need to calculate contributory wage*/
330 EXIT;
331 END IF;
332 END IF;
333 /*l_prev_salary := pay_balance_pkg.get_value(l_subject_gosi_id,rec_get_assact_id.assignment_action_id);*/
334 /*Check if there is any salary change in the previous year*/
335 IF TRUNC(l_old_date_earned ,'YYYY') = TRUNC(rec_get_assact_id.date_earned,'YYYY') THEN
336 /*Bug No6976224*/
337 /*IF l_prev_salary <> p_subject_to_gosi THEN*/
338 IF l_old_wage <> p_subject_to_gosi THEN
339 l_diff_exist := 1;
340 EXIT;
341 END IF;
342 END IF;
343
344 END LOOP;
345 CLOSE csr_get_assact_id;
346
347 IF (l_diff_exist = 1) AND (l_old_assact_id IS NOT NULL) THEN
348 /*Calculate contributory wage if there is any change*/
349 l_diff_salary := p_subject_to_gosi - l_prev_salary;
350 /*Bug No 6976224*/
351 /*l_c_wage_1 := ((p_pct_value/100) * (l_diff_salary)) + l_old_wage;*/
352 l_c_wage_1 := ((p_pct_value/100) * (l_old_wage)) + l_old_wage;
353 l_c_wage_2 := p_subject_to_gosi;
354
355 RETURN (LEAST(l_c_wage_1, l_c_wage_2));
356 END IF;
357
358 RETURN(nvl(l_old_wage,0));
359
360 END get_cont_wage_emp_50;
361
362 end pay_sa_general;
363