138: PROCEDURE local_error(p_procedure varchar2,
139: p_step number) IS
140: BEGIN
141: --
142: hr_utility.set_message(801,'HR_6153_ALL_PROCEDURE_FAIL');
143: hr_utility.set_message_token('PROCEDURE',
144: 'pay_us_tax_bals_pkg.'||p_procedure);
145: hr_utility.set_message_token('STEP',p_step);
146: hr_utility.raise_error;
139: p_step number) IS
140: BEGIN
141: --
142: hr_utility.set_message(801,'HR_6153_ALL_PROCEDURE_FAIL');
143: hr_utility.set_message_token('PROCEDURE',
144: 'pay_us_tax_bals_pkg.'||p_procedure);
145: hr_utility.set_message_token('STEP',p_step);
146: hr_utility.raise_error;
147: --
141: --
142: hr_utility.set_message(801,'HR_6153_ALL_PROCEDURE_FAIL');
143: hr_utility.set_message_token('PROCEDURE',
144: 'pay_us_tax_bals_pkg.'||p_procedure);
145: hr_utility.set_message_token('STEP',p_step);
146: hr_utility.raise_error;
147: --
148: END local_error;
149: --
142: hr_utility.set_message(801,'HR_6153_ALL_PROCEDURE_FAIL');
143: hr_utility.set_message_token('PROCEDURE',
144: 'pay_us_tax_bals_pkg.'||p_procedure);
145: hr_utility.set_message_token('STEP',p_step);
146: hr_utility.raise_error;
147: --
148: END local_error;
149: --
150: --
164: l_found boolean;
165: begin
166: -- Look to see if the group level balance is in our cache.
167: --
168: hr_utility.set_location('pay_us_tax_bals_pkg.get_asg_for_grp_lvl', 10);
169: --
170: l_count := 0;
171: l_found := FALSE;
172: while ((l_count < g_nxt_free_dim) AND (l_found = FALSE)) loop
170: l_count := 0;
171: l_found := FALSE;
172: while ((l_count < g_nxt_free_dim) AND (l_found = FALSE)) loop
173: if (p_grp_dvl_dimension = g_dim_tbl_grp(l_count)) then
174: hr_utility.set_location('pay_us_tax_bals_pkg.get_asg_for_grp_lvl', 20);
175: --
176: p_asg_lvl_dimension := g_dim_tbl_asg(l_count);
177: p_asg_cursor := g_dim_tbl_crs(l_count);
178: p_asg_vdate_cursor := g_dim_tbl_vtd(l_count);
189: end if;
190: l_count := l_count + 1;
191: end loop;
192: --
193: hr_utility.set_location('pay_us_tax_bals_pkg.get_asg_for_grp_lvl', 30);
194: p_found := l_found;
195: --
196: end;
197: --
203: p_dimension_suffix varchar2) return number is
204: l_defined_balance_id number;
205: --
206: begin
207: hr_utility.set_location('pay_us_tax_bals_pkg.get_defined_balance', 10);
208: --
209:
210: SELECT creator_id
211: INTO l_defined_balance_id
213: WHERE user_entity_name like
214: translate(p_balance_name||'_'||p_dimension_suffix,' ','_')
215: AND legislation_code = 'US';
216: --
217: hr_utility.set_location('pay_us_tax_bals_pkg.get_defined_balance', 20);
218: return l_defined_balance_id;
219: end;
220: --
221: ------------------------------------------------------------------------------
235: begin
236: --
237: -- Is the assignment on a payroll.
238: --
239: hr_utility.set_location('pay_us_tax_bals_pkg.get_virtual_date', 10);
240: select ''
241: into l_dummy
242: from per_assignments_f paf
243: where paf.assignment_id = p_assignment_id
245: and paf.effective_end_date
246: and paf.payroll_id is not null;
247:
248: --
249: hr_utility.set_location('pay_us_tax_bals_pkg.get_virtual_date', 20);
250: return p_virtual_date;
251: exception
252: when no_data_found then
253: --
256: declare
257: sql_cursor number;
258: l_rows number;
259: begin
260: hr_utility.set_location('pay_us_tax_bals_pkg.get_virtual_date',
261: 30);
262: sql_cursor := dbms_sql.open_cursor;
263: dbms_sql.parse(sql_cursor, p_asg_vdate_cursor, dbms_sql.v7);
264: dbms_sql.bind_variable (sql_cursor, 'ASSIGNMENT_ID',
270: dbms_sql.define_column (sql_cursor, 1, l_virtual_date);
271: l_rows := dbms_sql.execute(sql_cursor);
272: l_rows := dbms_sql.fetch_rows (sql_cursor);
273: if l_rows > 0 then
274: hr_utility.set_location(
275: 'pay_us_tax_bals_pkg.get_virtual_date', 40);
276: dbms_sql.column_value (sql_cursor, 1, l_virtual_date);
277: --
278: select max(ppf.effective_end_date)
288: -- Now work out which date is needed
289: --
290: if l_virtual_date is null then
291: if l_virtual_date2 is null then
292: hr_utility.set_location(
293: 'pay_us_tax_bals_pkg.get_virtual_date', 60);
294: local_error('get_virtual_date', 2);
295: else
296: hr_utility.set_location(
292: hr_utility.set_location(
293: 'pay_us_tax_bals_pkg.get_virtual_date', 60);
294: local_error('get_virtual_date', 2);
295: else
296: hr_utility.set_location(
297: 'pay_us_tax_bals_pkg.get_virtual_date', 70);
298: l_res_date := l_virtual_date2;
299: end if;
300: else
298: l_res_date := l_virtual_date2;
299: end if;
300: else
301: if l_virtual_date2 is null then
302: hr_utility.set_location(
303: 'pay_us_tax_bals_pkg.get_virtual_date', 80);
304: l_res_date := l_virtual_date;
305: else
306: hr_utility.set_location(
302: hr_utility.set_location(
303: 'pay_us_tax_bals_pkg.get_virtual_date', 80);
304: l_res_date := l_virtual_date;
305: else
306: hr_utility.set_location(
307: 'pay_us_tax_bals_pkg.get_virtual_date', 90);
308: l_res_date := least(l_virtual_date, l_virtual_date2);
309: end if;
310: end if;
309: end if;
310: end if;
311: --
312: else
313: hr_utility.set_location(
314: 'pay_us_tax_bals_pkg.get_virtual_date', 50);
315: local_error('get_virtual_date', 1);
316: end if;
317: --
376: l_run_route_bool := true;
377: END IF;
378:
379: l_balance_value := 0;
380: hr_utility.set_location('pay_us_tax_bals_pkg.get_grp_asg_value', 10);
381: --
382: -- Get the assignment level version.
383: --
384: get_asg_for_grp_lvl(p_database_suffix,
392: if l_grp_lat_exist then
393: --
394: -- Are there latest balances available.
395: --
396: hr_utility.set_location('pay_us_tax_bals_pkg.get_grp_asg_value', 20);
397: l_defined_balance_id := get_defined_balance(p_balance_name,
398: l_asg_data_suffix);
399: --
400: begin
425: --
426: -- OK, we can sum the values of the assignment balances to get the
427: -- group balance.
428: --
429: hr_utility.set_location('pay_us_tax_bals_pkg.get_grp_asg_value', 30);
430: begin
431: --
432: sql_cursor := dbms_sql.open_cursor;
433: dbms_sql.parse(sql_cursor, l_asg_data_cursor, dbms_sql.v7);
460: while (l_rows <> 0) loop
461: l_rows := dbms_sql.fetch_rows (sql_cursor);
462: cnt := cnt + 1;
463: if l_rows > 0 then
464: hr_utility.set_location(
465: 'pay_us_tax_bals_pkg.get_grp_asg_value', 40);
466: dbms_sql.column_value (sql_cursor, 1, l_asg_id);
467: --
468: l_virtual_date := get_virtual_date(l_asg_id, p_virtual_date,
485: else
486: --
487: -- No latets balances available. Run the route.
488: --
489: hr_utility.set_location('pay_us_tax_bals_pkg.get_grp_asg_value', 50);
490: l_defined_balance_id := get_defined_balance(p_balance_name,
491: p_database_suffix);
492: l_balance_value := pay_balance_pkg.get_value_lock
493: (l_defined_balance_id,
501: --
502: -- Can not sum the assignment level balances, thus run group
503: -- level route.
504: --
505: hr_utility.set_location('pay_us_tax_bals_pkg.get_grp_asg_value', 60);
506: l_defined_balance_id := get_defined_balance(p_balance_name,
507: p_database_suffix);
508: l_balance_value := pay_balance_pkg.get_value_lock
509: (l_defined_balance_id,
513: p_asg_lock
514: );
515: end if;
516: --
517: hr_utility.set_location('pay_us_tax_bals_pkg.get_grp_asg_value', 70);
518: return l_balance_value;
519: --
520: end;
521: --
557: l_run_route_bool := true;
558: END IF;
559:
560: l_balance_value := 0;
561: hr_utility.set_location('pay_us_tax_bals_pkg.get_grp_act_value', 10);
562: --
563: l_defined_balance_id := get_defined_balance(p_balance_name,
564: p_database_suffix);
565: l_balance_value := pay_balance_pkg.get_value (l_defined_balance_id,
567: l_run_route_bool,
568: FALSE
569: );
570: --
571: hr_utility.set_location('pay_us_tax_bals_pkg.get_grp_act_value', 20);
572: return l_balance_value;
573: --
574: end;
575: --
585: p_assignment_action_id number default null,
586: p_asg_lock varchar2)
587: return number is
588: begin
589: hr_utility.set_location('pay_us_tax_bals_pkg.get_grp_value', 10);
590: if p_assignment_action_id is null then
591: hr_utility.set_location('pay_us_tax_bals_pkg.get_grp_value', 20);
592: return get_grp_asg_value(p_assignment_id,
593: p_virtual_date,
587: return number is
588: begin
589: hr_utility.set_location('pay_us_tax_bals_pkg.get_grp_value', 10);
590: if p_assignment_action_id is null then
591: hr_utility.set_location('pay_us_tax_bals_pkg.get_grp_value', 20);
592: return get_grp_asg_value(p_assignment_id,
593: p_virtual_date,
594: p_balance_name,
595: p_database_suffix,
596: p_gre_id,
597: p_jurisdiction_code,
598: p_asg_lock);
599: else
600: hr_utility.set_location('pay_us_tax_bals_pkg.get_grp_value', 30);
601: return get_grp_act_value(p_assignment_action_id,
602: p_virtual_date,
603: p_balance_name,
604: p_database_suffix,
631: --
632: BEGIN
633: --
634:
635: hr_utility.set_location('pay_us_tax_bals_pkg.balance_name'||p_balance_name, 9);
636: hr_utility.trace('p_dimension_suffix = '||p_dimension_suffix);
637: hr_utility.trace('p_balance_name = '||p_balance_name);
638: hr_utility.trace('p_asg_type = '||p_asg_type);
639: hr_utility.set_location('pay_us_tax_bals_pkg.call_balance_user_exit', 10);
632: BEGIN
633: --
634:
635: hr_utility.set_location('pay_us_tax_bals_pkg.balance_name'||p_balance_name, 9);
636: hr_utility.trace('p_dimension_suffix = '||p_dimension_suffix);
637: hr_utility.trace('p_balance_name = '||p_balance_name);
638: hr_utility.trace('p_asg_type = '||p_asg_type);
639: hr_utility.set_location('pay_us_tax_bals_pkg.call_balance_user_exit', 10);
640:
633: --
634:
635: hr_utility.set_location('pay_us_tax_bals_pkg.balance_name'||p_balance_name, 9);
636: hr_utility.trace('p_dimension_suffix = '||p_dimension_suffix);
637: hr_utility.trace('p_balance_name = '||p_balance_name);
638: hr_utility.trace('p_asg_type = '||p_asg_type);
639: hr_utility.set_location('pay_us_tax_bals_pkg.call_balance_user_exit', 10);
640:
641: -- check for the 'RUN_ROUTE' parameter_name in the pay_action_parameters
634:
635: hr_utility.set_location('pay_us_tax_bals_pkg.balance_name'||p_balance_name, 9);
636: hr_utility.trace('p_dimension_suffix = '||p_dimension_suffix);
637: hr_utility.trace('p_balance_name = '||p_balance_name);
638: hr_utility.trace('p_asg_type = '||p_asg_type);
639: hr_utility.set_location('pay_us_tax_bals_pkg.call_balance_user_exit', 10);
640:
641: -- check for the 'RUN_ROUTE' parameter_name in the pay_action_parameters
642: -- table to determine if we want to call the run_result route instead of
635: hr_utility.set_location('pay_us_tax_bals_pkg.balance_name'||p_balance_name, 9);
636: hr_utility.trace('p_dimension_suffix = '||p_dimension_suffix);
637: hr_utility.trace('p_balance_name = '||p_balance_name);
638: hr_utility.trace('p_asg_type = '||p_asg_type);
639: hr_utility.set_location('pay_us_tax_bals_pkg.call_balance_user_exit', 10);
640:
641: -- check for the 'RUN_ROUTE' parameter_name in the pay_action_parameters
642: -- table to determine if we want to call the run_result route instead of
643: -- the run_balance route.
665: /* commenting of the following code. From now on we will be using
666: the Balance Reporting Arch */
667: /*
668: if p_asg_type = 'GRE' then
669: hr_utility.set_location('pay_us_tax_bals_pkg.call_balance_user_exit',
670: 20);
671: return get_grp_value(p_assignment_id,
672: p_virtual_date,
673: p_balance_name,
681: */
682: l_defined_balance_id := get_defined_balance(p_balance_name,
683: p_dimension_suffix);
684: IF p_dimension_suffix not like '%PAY%' THEN
685: hr_utility.set_location('pay_us_tax_bals_pkg.call_balance_user_exit', 30);
686: return pay_balance_pkg.get_value (l_defined_balance_id,
687: p_assignment_action_id,
688: l_run_route_bool,
689: FALSE
688: l_run_route_bool,
689: FALSE
690: );
691: ELSE /* If payments dimension then must execute DB item 395029 */
692: hr_utility.set_location('pay_us_tax_bals_pkg.call_balance_user_exit', 40);
693: return pay_balance_pkg.get_value (l_defined_balance_id,
694: p_assignment_action_id,
695: true );
696: -- END IF;
701: /* commenting of the following code. From now on we will be using
702: the Balance Reporting Arch */
703: /*
704: if p_asg_type = 'GRE' then
705: hr_utility.set_location('pay_us_tax_bals_pkg.call_balance_user_exit',
706: 50);
707: return get_grp_value(p_assignment_id,
708: p_virtual_date,
709: p_balance_name,
716: else
717: */
718: l_defined_balance_id := get_defined_balance(p_balance_name,
719: p_dimension_suffix);
720: hr_utility.set_location('pay_us_tax_bals_pkg.call_balance_user_exit',
721: 60);
722: return pay_balance_pkg.get_value_lock
723: (l_defined_balance_id,
724: p_assignment_id,
961: WHERE lookup_type = 'US_TAX_BALANCE_CATEGORY'
962: AND lookup_code = p_tax_balance_category;
963: --
964: IF l_valid = 0 THEN
965: hr_utility.trace('Error: Invalid tax balance category');
966: local_error('us_tax_balance',1);
967: END IF;
968: --
969: SELECT count(0)
972: WHERE lookup_type = 'US_TAX_TYPE'
973: AND lookup_code = p_tax_type;
974: --
975: IF l_valid = 0 THEN
976: hr_utility.trace('Error: Invalid tax type');
977: local_error('us_tax_balance',2);
978: END IF;
979: --
980: end if; /* p_tax_balance_category is NONE */
984: FROM dual
985: WHERE p_asg_type in ('ASG','PER','GRE');
986: --
987: IF l_valid = 0 THEN
988: hr_utility.trace('Error: Invalid asg_type parameter');
989: local_error('us_tax_balance',3);
990: END IF;
991: --
992: SELECT count(0)
994: FROM dual
995: WHERE p_time_type in ('RUN','PTD','MONTH','QTD','YTD', 'PAYMENTS', 'PYDATE');
996: --
997: IF l_valid = 0 THEN
998: hr_utility.trace('Error: Invalid time_type parameter');
999: local_error('us_tax_balance',4);
1000: END IF;
1001: --
1002: -- Set the contexts used in the bal user exit. Same throughout, so set
1001: --
1002: -- Set the contexts used in the bal user exit. Same throughout, so set
1003: -- them up front
1004: --
1005: hr_utility.set_location('pay_tax_bals_pkg',30);
1006: --
1007: pay_balance_pkg.set_context('TAX_UNIT_ID',p_gre_id_context);
1008: IF p_jd_context IS NOT NULL THEN
1009: IF (p_tax_type = 'SCHOOL' and length(p_jd_context) > 11) THEN
1013: pay_balance_pkg.set_context('JURISDICTION_CODE',p_jd_context);
1014: END IF;
1015: END IF;
1016: --
1017: hr_utility.set_location('pay_tax_bals_pkg',40);
1018: --
1019: l_assignment_id := p_assignment_id;
1020:
1021: l_group_rb_report := NVL(pay_us_balance_view_pkg.get_session_var('GROUP_RB_REPORT'),'NA');
1060: -- Check if assignment exists at l_virtual_date, if using date mode
1061: -- Changed date format to DD-MON-YYYY, bug 612696
1062: l_virtual_date :=fnd_date.canonical_to_date(fnd_date.date_to_canonical(p_virtual_date));
1063: --
1064: hr_utility.set_location('pay_tax_bals_pkg',50);
1065: --
1066: IF (l_assignment_id is not null and l_virtual_date is not null) THEN
1067: --
1068: select count(0)
1072: and l_virtual_date between effective_start_date and effective_end_date;
1073: --
1074: -- if assignment doesn't exist ...
1075: --
1076: hr_utility.set_location('pay_tax_bals_pkg',60);
1077: --
1078: IF l_asg_exists = 0 THEN
1079: --
1080: -- get the termination date ...
1085: where assignment_id = l_assignment_id;
1086: --
1087: -- get the date of the start of the time period in question
1088: --
1089: hr_utility.set_location('pay_tax_bals_pkg',70);
1090: --
1091: IF p_time_type = 'QTD' THEN
1092: l_bal_start_date := trunc(l_virtual_date,'Q');
1093: ELSIF p_time_type = 'MONTH' THEN
1107: --
1108: -- set the virtual date to termination date, or return 0 if terminated
1109: -- before the time period.
1110: --
1111: hr_utility.trace('Assignment was terminated on : ' || l_max_date);
1112: hr_utility.trace('Time period in question begins on : ' ||
1113: l_bal_start_date);
1114: --
1115: IF l_max_date < l_bal_start_date THEN
1108: -- set the virtual date to termination date, or return 0 if terminated
1109: -- before the time period.
1110: --
1111: hr_utility.trace('Assignment was terminated on : ' || l_max_date);
1112: hr_utility.trace('Time period in question begins on : ' ||
1113: l_bal_start_date);
1114: --
1115: IF l_max_date < l_bal_start_date THEN
1116: return 0;
1117: ELSE
1118: l_virtual_date := l_max_date;
1119: END IF;
1120: --
1121: hr_utility.trace('Using new virtual date : ' || l_virtual_date);
1122: --
1123: END IF;
1124: END IF;
1125: --
1124: END IF;
1125: --
1126: -- Convert "WITHHELD" to proper balance categories;
1127: --
1128: hr_utility.set_location('pay_tax_bals_pkg',80);
1129: --
1130: IF l_tax_balance_category = 'WITHHELD' THEN
1131: IF p_ee_or_er = 'ER' or l_tax_type = 'FUTA' THEN
1132: l_tax_balance_category := 'LIABILITY';
1140: END IF;
1141: --
1142: -- Check if illegal tax combo (FIT and TAXABLE, FUTA and SUBJ_NWHABLE, etc.)
1143: --
1144: hr_utility.set_location('pay_tax_bals_pkg',90);
1145: --
1146: IF (l_tax_type = 'FIT' or l_tax_type = 'SIT' or l_tax_type = 'COUNTY' or
1147: l_tax_type = 'CITY' or l_tax_type = 'EIC' or l_tax_type = 'HT' or
1148: l_tax_type = 'SCHOOL' or l_tax_type = 'STEIC' ) THEN -- income tax
1147: l_tax_type = 'CITY' or l_tax_type = 'EIC' or l_tax_type = 'HT' or
1148: l_tax_type = 'SCHOOL' or l_tax_type = 'STEIC' ) THEN -- income tax
1149: IF (l_tax_balance_category = 'TAXABLE' or
1150: l_tax_balance_category = 'EXCESS') THEN
1151: hr_utility.trace('Error: Illegal tax category for tax type');
1152: local_error('us_tax_balance',5);
1153: END IF;
1154: --
1155: -- return 0 for currently unsupported EIC balances.
1171: return 0;
1172: END IF;
1173: END IF;
1174: --
1175: hr_utility.set_location('pay_tax_bals_pkg',100);
1176: --
1177: l_ee_or_er := ltrim(rtrim(p_ee_or_er));
1178: --
1179: --------------- Some Error Checking -------------
1183: l_tax_type = 'COUNTY' or l_tax_type = 'EIC' or l_tax_type = 'SCHOOL'
1184: or l_tax_type = 'HT' or l_tax_type = 'WC' or l_tax_type = 'WC2' or
1185: l_tax_type = 'STEIC' ) THEN
1186: if l_ee_or_er = 'ER' THEN
1187: hr_utility.trace('Error: ER not allowed for tax type');
1188: local_error('us_tax_balance',6);
1189: else
1190: l_ee_or_er := NULL;
1191: end if;
1190: l_ee_or_er := NULL;
1191: end if;
1192: elsif (l_tax_type = 'FUTA') THEN
1193: if l_ee_or_er = 'EE' THEN
1194: hr_utility.trace('Error: EE not allowed for tax type');
1195: local_error('us_tax_balance',7);
1196: else
1197: l_ee_or_er := NULL;
1198: end if;
1198: end if;
1199: elsif (l_tax_type = 'SS' or l_tax_type = 'MEDICARE' or l_tax_type = 'SDI' or
1200: l_tax_type = 'SUI') THEN
1201: if (l_ee_or_er <> 'EE' and l_ee_or_er <> 'ER') THEN
1202: hr_utility.trace('Error: EE or ER required for tax type');
1203: local_error('us_tax_balance',8);
1204: end if;
1205: end if;
1206: --
1203: local_error('us_tax_balance',8);
1204: end if;
1205: end if;
1206: --
1207: hr_utility.set_location('pay_tax_bals_pkg',110);
1208: --
1209: -- Force space at end of this parameter if necessary
1210: --
1211: hr_utility.set_location('pay_tax_bals_pkg',120);
1207: hr_utility.set_location('pay_tax_bals_pkg',110);
1208: --
1209: -- Force space at end of this parameter if necessary
1210: --
1211: hr_utility.set_location('pay_tax_bals_pkg',120);
1212: --
1213: IF l_ee_or_er IS NOT NULL THEN
1214: l_ee_or_er := rtrim(l_ee_or_er)||' ';
1215: END IF;
1315: g_nxt_free_asgid := g_nxt_free_asgid + 1;
1316: --
1317: exception when no_data_found then
1318: begin
1319: hr_utility.trace('Error: Failure to find defined balance');
1320: local_error('us_tax_balance',1);
1321: --
1322: end;
1323: end;
1716: END IF;
1717: --
1718: ELSIF l_tax_balance_category = 'TAXABLE' THEN
1719:
1720: hr_utility.trace('balance name sent = '||l_tax_type||'_'||
1721: l_ee_or_er||'TAXABLE');
1722: hr_utility.trace(' l_dimension_string = '||l_dimension_string);
1723:
1724: l_return_value := call_balance_user_exit (l_tax_type||'_'||
1718: ELSIF l_tax_balance_category = 'TAXABLE' THEN
1719:
1720: hr_utility.trace('balance name sent = '||l_tax_type||'_'||
1721: l_ee_or_er||'TAXABLE');
1722: hr_utility.trace(' l_dimension_string = '||l_dimension_string);
1723:
1724: l_return_value := call_balance_user_exit (l_tax_type||'_'||
1725: l_ee_or_er||'TAXABLE',
1726: l_dimension_string,
1772: l_tax_type := 'WORKERS COMP2';
1773: END IF;
1774: --
1775:
1776: hr_utility.trace ('The category is : '|| l_tax_balance_category);
1777: if l_tax_balance_category = 'NONE' then
1778:
1779: l_return_value := call_balance_user_exit (
1780: l_tax_type,
2052: l_virtual_date);
2053: END IF;
2054: END IF;
2055: --
2056: hr_utility.trace('Returning : ' || l_return_value);
2057: --
2058: return l_return_value;
2059: --
2060: END us_tax_balance;
2176: -- Set the next free cache space.
2177: g_nxt_free_dim := 4;
2178:
2179:
2180: -- hr_utility.trace_on(null,'tx');
2181: end pay_us_tax_bals_pkg;