DBA Data[Home] [Help]

PACKAGE BODY: APPS.PAY_SA_GENERAL

Source


1 package body pay_sa_general as
2 /* $Header: pysagenr.pkb 120.4.12020000.2 2012/10/16 11:05:23 bkeshary 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 /*+ index(pef) index(ppa) use_nl(paa ppa) use_nl(paa paf) */
198        SUM(ppp.value)
199  FROM  per_assignments_f            paf
200        ,per_people_f                 pef
201        ,pay_pre_payments             ppp
202        ,pay_assignment_actions       paa
203        ,pay_payroll_actions          ppa
204  WHERE  paa.payroll_action_id          =
205         pay_magtape_generic.get_parameter_value('PAYROLL_ACTION_ID')
206  AND    paa.pre_payment_id             = ppp.pre_payment_id
207  AND    paa.payroll_action_id          = ppa.payroll_action_id
208  AND    paa.assignment_id              = paf.assignment_id
209  AND    paf.person_id                  = pef.person_id
210  AND    ppp.value                      > 0
211  AND    ppa.effective_date BETWEEN paf.effective_start_date
212                                AND paf.effective_end_date
213  AND    ppa.effective_date BETWEEN pef.effective_start_date
214                                AND pef.effective_end_date;
215  BEGIN
216          open CSR_SA_EFT_SUM;
217          fetch CSR_SA_EFT_SUM into l_sum;
218          close CSR_SA_EFT_SUM;
219          return l_sum;
220  END get_sum;
221 ----------------
222 function get_count RETURN NUMBER as
223  l_count NUMBER(15);
224  CURSOR CSR_SA_EFT_COUNT IS
225  SELECT /*+ index(pef) index(ppa) use_nl(paa ppa) use_nl(paa paf) */
226        COUNT(*)
227  FROM  per_assignments_f            paf
228        ,per_people_f                 pef
229        ,pay_pre_payments             ppp
230        ,pay_assignment_actions       paa
231        ,pay_payroll_actions          ppa
232  WHERE  paa.payroll_action_id          =
233         pay_magtape_generic.get_parameter_value('PAYROLL_ACTION_ID')
234  AND    paa.pre_payment_id             = ppp.pre_payment_id
235  AND    paa.payroll_action_id          = ppa.payroll_action_id
236  AND    paa.assignment_id              = paf.assignment_id
237  AND    paf.person_id                  = pef.person_id
238  AND    ppp.value                      > 0
239  AND    ppa.effective_date BETWEEN paf.effective_start_date
240                                AND paf.effective_end_date
241  AND    ppa.effective_date BETWEEN pef.effective_start_date
242                                AND pef.effective_end_date;
243  BEGIN
244          open CSR_SA_EFT_COUNT;
245          fetch CSR_SA_EFT_COUNT into l_count;
246          close CSR_SA_EFT_COUNT;
247          return l_count;
248  END get_count;
249 ------------------------
250 ------------------------------------------------------------------------
251 -- Function for returning contributory wage of employees over 50 years
252 ------------------------------------------------------------------------
253 FUNCTION  get_cont_wage_emp_50 (
254           p_assignment_action_id  IN NUMBER
255          ,p_assignment_id              IN NUMBER
256          ,p_date_earned                 IN DATE
257          ,p_pct_value                      IN NUMBER
258          ,p_subject_to_gosi            IN NUMBER)
259 RETURN NUMBER AS
260 
261   CURSOR csr_get_def_bal_id (p_def_bal_name IN VARCHAR2) IS
262   SELECT  u.creator_id
263   FROM    ff_user_entities  u,
264                  ff_database_items d
265   WHERE   d.user_name = p_def_bal_name
266   AND      u.user_entity_id = d.user_entity_id
267   AND      u.legislation_code = 'SA'
268   AND      u.business_group_id is null
269   AND      u.creator_type = 'B';
270 
271   CURSOR csr_get_assact_id IS
272   SELECT paa.assignment_action_id
273                 ,ppa.date_earned
274   FROM pay_assignment_actions paa
275              ,pay_payroll_actions ppa
276              ,pay_run_results prr
277              ,pay_element_types_f pet
278   WHERE paa.assignment_id = p_assignment_id
279   AND   paa.assignment_action_id = prr.assignment_action_id
280   AND   paa.payroll_action_id = ppa.payroll_action_id
281   AND   paa.action_status IN ('C','S')
282   AND   ppa.action_status = 'C'
283   AND   ppa.action_type in ('R','Q')
284   AND   prr.element_type_id = pet.element_type_id
285   AND   pet.element_name ='GOSI'
286   AND   p_date_earned between pet.effective_start_date and pet.effective_end_date
287   AND   prr.status = 'P'
288   AND   paa.assignment_action_id < p_assignment_action_id
289   --AND   ppa.date_earned >= ADD_MONTHS(TRUNC(p_date_earned,'YYYY'),-12)
290   ORDER BY paa.assignment_action_id DESC;
291 
292   rec_get_assact_id     csr_get_assact_id%ROWTYPE;
293 
294   l_prev_salary             NUMBER;
295   l_subject_gosi_id       NUMBER;
296   l_old_assact_id          NUMBER;
297   l_prev_assact_id       NUMBER;
298   l_ref_earnings_id        NUMBER;
299   l_diff_exist                   NUMBER;
300   l_diff_salary                   NUMBER;
301   l_old_wage                 NUMBER;
302   l_c_wage_1                NUMBER;
303   l_c_wage_2                NUMBER;
304   l_old_date_earned     DATE;
305 
306 BEGIN
307   l_diff_exist := 0;
308   l_ref_earnings_id := NULL;
309   OPEN csr_get_def_bal_id( 'GOSI_REFERENCE_EARNINGS_ASG_YTD');
310   FETCH csr_get_def_bal_id INTO l_ref_earnings_id;
311   CLOSE csr_get_def_bal_id;
312 
313   l_subject_gosi_id := NULL;
314   OPEN csr_get_def_bal_id( 'SUBJECT_TO_GOSI_ASG_RUN');
315   FETCH csr_get_def_bal_id INTO l_subject_gosi_id;
316   CLOSE csr_get_def_bal_id;
317 
318   l_old_assact_id := NULL;
319 
320   /*check if the earlier run was in previous year and get the assignment action_id*/
321   OPEN csr_get_assact_id;
322   LOOP
323     FETCH csr_get_assact_id INTO rec_get_assact_id;
324     EXIT WHEN csr_get_assact_id%NOTFOUND;
325     IF l_old_assact_id IS NULL THEN
326       IF TRUNC(rec_get_assact_id.date_earned,'YYYY') < TRUNC(p_date_earned, 'YYYY') THEN
327         l_old_assact_id := rec_get_assact_id.assignment_action_id;
328         l_old_date_earned := rec_get_assact_id.date_earned;
329         l_old_wage := pay_balance_pkg.get_value(l_ref_earnings_id,l_old_assact_id);
330       ELSE
331         /*Exit if the earlier run is in the same year. This indicates there is no need to calculate contributory wage*/
332         EXIT;
333       END IF;
334     END IF;
335     /*l_prev_salary := pay_balance_pkg.get_value(l_subject_gosi_id,rec_get_assact_id.assignment_action_id);*/
336     /*Check if there is any salary change in the previous year*/
337     IF TRUNC(l_old_date_earned ,'YYYY') = TRUNC(rec_get_assact_id.date_earned,'YYYY') THEN
338      /*Bug No6976224*/
339       /*IF l_prev_salary <> p_subject_to_gosi THEN*/
340         IF l_old_wage  <> p_subject_to_gosi THEN
341         l_diff_exist := 1;
342         EXIT;
343       END IF;
344     END IF;
345 
346   END LOOP;
347   CLOSE csr_get_assact_id;
348 
349   IF (l_diff_exist = 1) AND (l_old_assact_id IS NOT NULL) THEN
350     /*Calculate contributory wage if there is any change*/
351     l_diff_salary := p_subject_to_gosi - l_prev_salary;
352      /*Bug No 6976224*/
353     /*l_c_wage_1 := ((p_pct_value/100) * (l_diff_salary)) + l_old_wage;*/
354     l_c_wage_1 := ((p_pct_value/100) * (l_old_wage)) + l_old_wage;
355     l_c_wage_2 := p_subject_to_gosi;
356 
357     RETURN (LEAST(l_c_wage_1, l_c_wage_2));
358   END IF;
359 
360   RETURN(nvl(l_old_wage,0));
361 
362 END get_cont_wage_emp_50;
363 
364 end pay_sa_general;
365