1 package body FND_PROFILE_CAT_OPTIONS_PKG as
2 /* $Header: FNDPRCTB.pls 120.7 2006/09/21 10:28:13 stadepal noship $ */
3 procedure INSERT_ROW (
4 X_ROWID in out nocopy VARCHAR2,
5 X_PROFILE_OPTION_ID in NUMBER,
6 X_CATEGORY_NAME in VARCHAR2,
7 X_PROFILE_OPTION_APPLICATION_I in NUMBER,
8 X_DISPLAY_SEQUENCE in NUMBER,
9 X_DISPLAY_TYPE in VARCHAR2,
10 X_CREATION_DATE in DATE,
11 X_CREATED_BY in NUMBER,
12 X_LAST_UPDATE_DATE in DATE,
13 X_LAST_UPDATED_BY in NUMBER,
14 X_LAST_UPDATE_LOGIN in NUMBER,
15 X_APPLICATION_ID in NUMBER
16 ) is
17 cursor C is select ROWID from FND_PROFILE_CAT_OPTIONS
18 where PROFILE_OPTION_ID = X_PROFILE_OPTION_ID
19 and CATEGORY_NAME = upper(X_CATEGORY_NAME)
20 and PROFILE_OPTION_APPLICATION_ID = X_PROFILE_OPTION_APPLICATION_I
21 and APPLICATION_ID = X_APPLICATION_ID
22 ;
23 begin
24 insert into FND_PROFILE_CAT_OPTIONS (
25 PROFILE_OPTION_APPLICATION_ID,
26 PROFILE_OPTION_ID,
27 CATEGORY_NAME,
28 APPLICATION_ID,
29 DISPLAY_SEQUENCE,
30 DISPLAY_TYPE,
31 CREATION_DATE,
32 CREATED_BY,
33 LAST_UPDATE_DATE,
34 LAST_UPDATED_BY,
35 LAST_UPDATE_LOGIN
36 ) values (
37 X_PROFILE_OPTION_APPLICATION_I,
38 X_PROFILE_OPTION_ID,
39 upper(X_CATEGORY_NAME),
40 X_APPLICATION_ID,
41 X_DISPLAY_SEQUENCE,
42 X_DISPLAY_TYPE,
43 X_CREATION_DATE,
44 X_CREATED_BY,
45 X_LAST_UPDATE_DATE,
46 X_LAST_UPDATED_BY,
47 X_LAST_UPDATE_LOGIN
48 );
49
50 /******************Commented. Since TL table is dropped
51 insert into FND_PROFILE_CAT_OPTIONS_TL (
52 PROFILE_OPTION_APPLICATION_ID,
53 PROFILE_OPTION_ID,
54 CATEGORY_NAME,
55 APPLICATION_ID,
56 CREATED_BY,
57 CREATION_DATE,
58 LAST_UPDATED_BY,
59 LAST_UPDATE_DATE,
60 LAST_UPDATE_LOGIN,
61 DESCRIPTION_OVERRIDE,
62 LANGUAGE,
63 SOURCE_LANG
64 ) select
65 X_PROFILE_OPTION_APPLICATION_I,
66 X_PROFILE_OPTION_ID,
67 X_CATEGORY_NAME,
68 X_APPLICATION_ID,
69 X_CREATED_BY,
70 X_CREATION_DATE,
71 X_LAST_UPDATED_BY,
72 X_LAST_UPDATE_DATE,
73 X_LAST_UPDATE_LOGIN,
74 X_DESCRIPTION_OVERRIDE,
75 L.LANGUAGE_CODE,
76 userenv('LANG')
77 from FND_LANGUAGES L
78 where L.INSTALLED_FLAG in ('I', 'B')
79 and not exists
80 (select NULL
81 from FND_PROFILE_CAT_OPTIONS_TL T
82 where T.PROFILE_OPTION_ID = X_PROFILE_OPTION_ID
83 and T.CATEGORY_NAME = X_CATEGORY_NAME
84 and T.PROFILE_OPTION_APPLICATION_ID = X_PROFILE_OPTION_APPLICATION_I
85 and T.APPLICATION_ID = X_APPLICATION_ID
86 and T.LANGUAGE = L.LANGUAGE_CODE);
87 ***********************************/
88
89 open c;
90 fetch c into X_ROWID;
91 if (c%notfound) then
92 close c;
93 raise no_data_found;
94 end if;
95 close c;
96
97 end INSERT_ROW;
98
99 procedure LOCK_ROW (
100 X_PROFILE_OPTION_ID in NUMBER,
101 X_CATEGORY_NAME in VARCHAR2,
102 X_PROFILE_OPTION_APPLICATION_I in NUMBER,
103 X_DISPLAY_SEQUENCE in NUMBER,
104 X_DISPLAY_TYPE in VARCHAR2,
105 X_APPLICATION_ID in NUMBER
106 ) is
107 cursor c is select
108 DISPLAY_SEQUENCE,
109 DISPLAY_TYPE
110 from FND_PROFILE_CAT_OPTIONS
111 where PROFILE_OPTION_ID = X_PROFILE_OPTION_ID
112 and CATEGORY_NAME = upper(X_CATEGORY_NAME)
113 and PROFILE_OPTION_APPLICATION_ID = X_PROFILE_OPTION_APPLICATION_I
114 and APPLICATION_ID = X_APPLICATION_ID
115 for update of PROFILE_OPTION_ID nowait;
116 recinfo c%rowtype;
117
118 /******************Commented. Since TL table is dropped
119 cursor c1 is select
120 DESCRIPTION_OVERRIDE,
121 decode(LANGUAGE, userenv('LANG'), 'Y', 'N') BASELANG
122 from FND_PROFILE_CAT_OPTIONS_TL
123 where PROFILE_OPTION_ID = X_PROFILE_OPTION_ID
124 and CATEGORY_NAME = X_CATEGORY_NAME
125 and PROFILE_OPTION_APPLICATION_ID = X_PROFILE_OPTION_APPLICATION_I
126 and APPLICATION_ID = X_APPLICATION_ID
127 and userenv('LANG') in (LANGUAGE, SOURCE_LANG)
128 for update of PROFILE_OPTION_ID nowait;
129 ***********************/
130 begin
131 open c;
132 fetch c into recinfo;
133 if (c%notfound) then
134 close c;
135 fnd_message.set_name('FND', 'FORM_RECORD_DELETED');
136 app_exception.raise_exception;
137 end if;
138 close c;
139 if ( ((recinfo.DISPLAY_SEQUENCE = X_DISPLAY_SEQUENCE)
140 OR ((recinfo.DISPLAY_SEQUENCE is null) AND (X_DISPLAY_SEQUENCE is null)))
141 AND ((recinfo.DISPLAY_TYPE = X_DISPLAY_TYPE)
142 OR ((recinfo.DISPLAY_TYPE is null) AND (X_DISPLAY_TYPE is null)))
143 ) then
144 null;
145 else
146 fnd_message.set_name('FND', 'FORM_RECORD_CHANGED');
147 app_exception.raise_exception;
148 end if;
149
150 /******************Commented. Since TL table is dropped
151 for tlinfo in c1 loop
152 if (tlinfo.BASELANG = 'Y') then
153 if ( ((tlinfo.DESCRIPTION_OVERRIDE = X_DESCRIPTION_OVERRIDE)
154 OR ((tlinfo.DESCRIPTION_OVERRIDE is null) AND (X_DESCRIPTION_OVERRIDE is null)))
155 ) then
156 null;
157 else
158 fnd_message.set_name('FND', 'FORM_RECORD_CHANGED');
159 app_exception.raise_exception;
160 end if;
161 end if;
162 end loop;
163 ***********************/
164 return;
165 end LOCK_ROW;
166
167 procedure UPDATE_ROW (
168 X_PROFILE_OPTION_ID in NUMBER,
169 X_CATEGORY_NAME in VARCHAR2,
170 X_PROFILE_OPTION_APPLICATION_I in NUMBER,
171 X_DISPLAY_SEQUENCE in NUMBER,
172 X_DISPLAY_TYPE in VARCHAR2,
173 X_LAST_UPDATE_DATE in DATE,
174 X_LAST_UPDATED_BY in NUMBER,
175 X_LAST_UPDATE_LOGIN in NUMBER,
176 X_APPLICATION_ID in NUMBER
177 ) is
178 begin
179 update FND_PROFILE_CAT_OPTIONS set
180 DISPLAY_SEQUENCE = X_DISPLAY_SEQUENCE,
181 DISPLAY_TYPE = X_DISPLAY_TYPE,
182 LAST_UPDATE_DATE = X_LAST_UPDATE_DATE,
183 LAST_UPDATED_BY = X_LAST_UPDATED_BY,
184 LAST_UPDATE_LOGIN = X_LAST_UPDATE_LOGIN
185 where PROFILE_OPTION_ID = X_PROFILE_OPTION_ID
186 and CATEGORY_NAME = upper(X_CATEGORY_NAME)
187 and PROFILE_OPTION_APPLICATION_ID = X_PROFILE_OPTION_APPLICATION_I
188 and APPLICATION_ID = X_APPLICATION_ID;
189
190 if (sql%notfound) then
191 raise no_data_found;
192 end if;
193
194 /******************Commented. Since TL table is dropped
195 update FND_PROFILE_CAT_OPTIONS_TL set
196 DESCRIPTION_OVERRIDE = X_DESCRIPTION_OVERRIDE,
197 LAST_UPDATE_DATE = X_LAST_UPDATE_DATE,
198 LAST_UPDATED_BY = X_LAST_UPDATED_BY,
199 LAST_UPDATE_LOGIN = X_LAST_UPDATE_LOGIN,
200 SOURCE_LANG = userenv('LANG')
201 where PROFILE_OPTION_ID = X_PROFILE_OPTION_ID
202 and CATEGORY_NAME = X_CATEGORY_NAME
203 and PROFILE_OPTION_APPLICATION_ID = X_PROFILE_OPTION_APPLICATION_I
204 and APPLICATION_ID = X_APPLICATION_ID
205 and userenv('LANG') in (LANGUAGE, SOURCE_LANG);
206
207 if (sql%notfound) then
208 raise no_data_found;
209 end if;
210 ***********************/
211 end UPDATE_ROW;
212
213 procedure DELETE_ROW (
214 X_PROFILE_OPTION_ID in NUMBER,
215 X_CATEGORY_NAME in VARCHAR2,
216 X_PROFILE_OPTION_APPLICATION_I in NUMBER,
217 X_APPLICATION_ID in NUMBER
218 ) is
219 begin
220 /******************Commented. Since TL table is dropped
221 delete from FND_PROFILE_CAT_OPTIONS_TL
222 where PROFILE_OPTION_ID = X_PROFILE_OPTION_ID
223 and CATEGORY_NAME = X_CATEGORY_NAME
224 and PROFILE_OPTION_APPLICATION_ID = X_PROFILE_OPTION_APPLICATION_I
225 and APPLICATION_ID = X_APPLICATION_ID;
226
227 if (sql%notfound) then
228 raise no_data_found;
229 end if;
230 ***********************/
231
232 delete from FND_PROFILE_CAT_OPTIONS
233 where PROFILE_OPTION_ID = X_PROFILE_OPTION_ID
234 and CATEGORY_NAME = upper(X_CATEGORY_NAME)
235 and PROFILE_OPTION_APPLICATION_ID = X_PROFILE_OPTION_APPLICATION_I
236 and APPLICATION_ID = X_APPLICATION_ID;
237
238 if (sql%notfound) then
239 raise no_data_found;
240 end if;
241 end DELETE_ROW;
242
243 /*** DEPRECATED, DEPRECATED, DEPRECATED ***/
244 procedure ADD_LANGUAGE
245 is
246 begin
247 /** deleted all the code instead of commenting the ADD_LANGUAGE to remove
248 ** the dependency between this change and FNDNLINS.sql which has call to
249 ** Fnd_profile_cat_options_pkg.add_language. If the api is commented,
250 ** then this change requires a change in FNDNLINS.sql.
251 **/
252 null;
253 end ADD_LANGUAGE;
254
255 /******************Commented ADD_LANGUAGE and TRANSLATE_ROW.
256 ******************Since TL table is dropped.
257 **/
258 /*****
259 procedure TRANSLATE_ROW (
260 X_PROFILE_OPTION_APP_NAME in VARCHAR2,
261 X_PROFILE_OPTION_NAME in VARCHAR2,
262 X_CATEGORY_NAME in VARCHAR2,
263 X_APPLICATION_SHORT_NAME in VARCHAR2,
264 X_DESCRIPTION_OVERRIDE in VARCHAR2,
265 X_CUSTOM_MODE in VARCHAR2,
266 X_OWNER in VARCHAR2,
267 X_LAST_UPDATE_DATE in VARCHAR2)
268 is
269 f_luby number; -- entity owner in file
270 f_ludate date; -- entity update date in file
271 db_luby number; -- entity owner in db
272 db_ludate date; -- entity update date in db
273 prof_app_id number;
274 prof_id number;
275 app_id number;
276 begin
277
278 select application_id into app_id
279 from fnd_application
280 where application_short_name = X_APPLICATION_SHORT_NAME;
281
282 select profile_option_id, application_id into prof_id, prof_app_id
283 from fnd_profile_options
284 where profile_option_name = X_PROFILE_OPTION_NAME;
285
286 -- Translate owner to file_last_updated_by
287 f_luby := fnd_load_util.owner_id(x_owner);
288
289 -- Translate char last_update_date to date
290 f_ludate := nvl(to_date(x_last_update_date, 'YYYY/MM/DD'), sysdate);
291
292 begin
293 select LAST_UPDATED_BY, LAST_UPDATE_DATE
294 into db_luby, db_ludate
295 from FND_PROFILE_CAT_OPTIONS_TL
296 where PROFILE_OPTION_APPLICATION_ID = prof_app_id
297 and PROFILE_OPTION_ID = prof_id
298 and CATEGORY_NAME = X_CATEGORY_NAME
299 and APPLICATION_ID = app_id
300 and LANGUAGE = userenv('LANG');
301
302 if (fnd_load_util.upload_test(f_luby, f_ludate, db_luby,
303 db_ludate, X_CUSTOM_MODE)) then
304
305 update FND_PROFILE_CAT_OPTIONS_TL set
306 DESCRIPTION_OVERRIDE = X_DESCRIPTION_OVERRIDE,
307 LAST_UPDATE_DATE = f_ludate,
308 LAST_UPDATED_BY = f_luby,
309 LAST_UPDATE_LOGIN = f_luby,
310 SOURCE_LANG = userenv('LANG')
311 where PROFILE_OPTION_APPLICATION_ID = prof_app_id
312 and PROFILE_OPTION_ID = prof_id
313 and CATEGORY_NAME = X_CATEGORY_NAME
314 and APPLICATION_ID = app_id
315 and userenv('LANG') in (LANGUAGE, SOURCE_LANG);
316 end if;
317 exception
318 when no_data_found then
319 null;
320 end;
321 end TRANSLATE_ROW;
322 ***********************/
323
324 /*** Bug 5060938. Added default param X_PROF_APPL_SHORT_NAME to LOAD_ROW api.
325 *** This is required to create a Dummy profile option in Fnd_Profile_Options
326 *** table when category ldt is uploaded before it's corresponding profile ldt
327 *** to handle No-Data-Found issues.
328 ***/
329 procedure LOAD_ROW (
330 X_PROFILE_OPTION_NAME in VARCHAR2,
331 X_CATEGORY_NAME in VARCHAR2,
332 X_DISPLAY_SEQUENCE in VARCHAR2,
333 X_DISPLAY_TYPE in VARCHAR2,
334 X_OWNER in VARCHAR2,
335 X_CUSTOM_MODE in VARCHAR2,
336 X_LAST_UPDATE_DATE in VARCHAR2,
337 X_APPLICATION_SHORT_NAME in VARCHAR2,
338 X_PROF_APPL_SHORT_NAME in VARCHAR2 default NULL)
339 is
340 row_id varchar2(64);
341 prof_app_id number;
342 prof_id number;
343 f_luby number; -- entity owner in file
344 f_ludate date; -- entity update date in file
345 db_luby number; -- entity owner in db
346 db_ludate date; -- entity update date in db
347 app_id number;
348 retVal number;
349
350 begin
351
352 select application_id into app_id
353 from fnd_application
354 where application_short_name = X_APPLICATION_SHORT_NAME;
355
356 -- Translate owner to file_last_updated_by
357 f_luby := fnd_load_util.owner_id(x_owner);
358
359 -- Translate char last_update_date to date
360 f_ludate := nvl(to_date(x_last_update_date, 'YYYY/MM/DD'), sysdate);
361
362 begin
363 select profile_option_id, application_id into prof_id, prof_app_id
364 from FND_PROFILE_OPTIONS
365 where PROFILE_OPTION_NAME = X_PROFILE_OPTION_NAME;
366 exception
367 when no_data_found then
368 /* The profile option doesn't yet exist so create a dummy profile*/
369 /* to serve as a temporary placeholder. This solves bug */
370 /* 5060938 about uploading category ldt before it's related profiles */
371 /* hadn't yet been uploaded. This dummy profile will end up getting */
372 /* updated with the real profile information later on during */
373 /* the load when the real profile data gets uploaded. */
374
375 /********** WARNING !!!!!!!!!!!! *********/
376 /* Here fnd_profile_options_pkg.INSERT_ROW() is called instead of
377 * fnd_profile_options_pkg.LOAD_ROW() since in this case there's an extra
378 * processing for the values passed to Last_Updated_By and Last_Update_Date
379
380 * In this case, the Creation_Date should be set to X_LAST_UPDATE_DATE
381 * whereas the Last_Update_Date should be set to FND_API.G_MISS_DATE.
382 * Similarly, Created_By is set to OWNER and Last_Updated_By to 'SEED'/1.
383 * This is to ensure that, 'fnd_load_util.upload_test()' succeeds for this
384 * dummy row and consequently this Dummy profile definition always gets
385 * updated with the actual definition when the profile ldt shipping the
386 * right definition is uploaded.
387 */
388
389 select fnd_profile_options_s.nextval
390 into prof_id
391 from dual;
392
393 /* If X_PROF_APPL_SHORT_NAME is not passed then profile is created with
394 * the same application as that of it's category.
395 */
396
397 select application_id into prof_app_id
398 from fnd_application
399 where application_short_name = nvl(X_PROF_APPL_SHORT_NAME, X_APPLICATION_SHORT_NAME);
400
401 begin
402 fnd_profile_options_pkg.insert_row (
403 x_rowid => row_id,
404 x_profile_option_name => X_PROFILE_OPTION_NAME,
405 x_application_id => prof_app_id,
406 x_profile_option_id => prof_id,
407 x_write_allowed_flag => 'N',
408 x_read_allowed_flag => 'N',
409 x_user_changeable_flag => 'N',
410 x_user_visible_flag => 'N',
411 x_site_enabled_flag => 'N',
412 x_site_update_allowed_flag => 'N',
413 x_app_enabled_flag => 'N',
414 x_app_update_allowed_flag => 'N',
415 x_resp_enabled_flag => 'N',
416 x_resp_update_allowed_flag => 'N',
417 x_user_enabled_flag => 'N',
418 x_user_update_allowed_flag => 'N',
419 x_start_date_active => FND_API.G_MISS_DATE,
420 x_sql_validation => NULL,
421 x_end_date_active => FND_API.G_MISS_DATE,
422 x_user_profile_option_name => X_PROFILE_OPTION_NAME,
423 x_description => NULL,
424 x_creation_date => f_ludate,
425 x_created_by => f_luby,
426 x_last_update_date => FND_API.G_MISS_DATE,
427 x_last_updated_by => fnd_load_util.owner_id('SEED'),
428 x_last_update_login => 0,
429 x_hierarchy_type => 'SECURITY',
430 x_server_enabled_flag => 'N',
431 x_server_update_allowed_flag => 'N',
432 x_org_enabled_flag => 'N',
433 x_org_update_allowed_flag => 'N',
434 x_serverresp_enabled_flag => 'N',
435 x_serverresp_upd_allow_fl => 'N');
436 exception
437 when dup_val_on_index then
438 -- Bug 5453931.
439 -- It means actual profile is already inserted by another ldt parallely.
440 -- So ignore creation of this dummy profile and get the
441 -- Profile_Option_Id and Application_Id of the real profile option from
442 -- Fnd_Profile_Options table.
443 select profile_option_id, application_id
444 into prof_id, prof_app_id
445 from FND_PROFILE_OPTIONS
446 where PROFILE_OPTION_NAME = X_PROFILE_OPTION_NAME;
447 end;
448 end;
449
450 begin
451 select 1 into retVal
452 from FND_PROFILE_CATS
453 where NAME = X_CATEGORY_NAME
454 and APPLICATION_ID = app_id;
455 exception
456 when no_data_found then
457 -- Bug 5060938.
458 -- While uploading profile ldt (with link info), the referenced category
459 -- is not yet uploaded. Hence postpone the upload of this category->option
460 -- link info till the category ldt with the definition for this category
461 -- and this link info is uploaded.
462
463 /********** WARNING !!!!!!!!!!!! *********/
464 /* Placeholder/Stub needs to be created only for the missing profiles when
465 * uploading categories. This is not required for this case (missing category
466 * when uploading profiles).
467 * The main reason for doing this way is, for backward compatibility.
468 * The profile ldt's that were extracted with the default behaviour of
469 * old 'afscprof.lct' (<= (115.50=120.10)) will not have profile->category
470 * link information. So while uploading the category ldt, IF upload of
471 * category->option link info is skipped for the missing profiles THEN
472 * we can never upload the above information(if profile ldt's were
473 * extracted with default behaviour of old afscprof.lct). It's equivalent to
474 * loosing this information.
475
476 * We don't have any issues if we skip the upload of this link info for the
477 * missing category while uploading the profile ldt. Because this info
478 * is always available in the category ldt.
479
480 * NOTE: The new version afscprof.lct(115.51=120.11) always extracts the
481 * profile->category information. So, if profiles are re-extracted with
485
482 * the latest version of 'afscprof.lct' then by default they pick up
483 * profile->category information also.
484 */
486 return;
487 end;
488
489 begin
490 select LAST_UPDATED_BY, LAST_UPDATE_DATE
491 into db_luby, db_ludate
492 from FND_PROFILE_CAT_OPTIONS
493 where PROFILE_OPTION_APPLICATION_ID = prof_app_id
494 and PROFILE_OPTION_ID = prof_id
495 and CATEGORY_NAME = upper(X_CATEGORY_NAME)
496 and APPLICATION_ID = app_id;
497
498 if (fnd_load_util.upload_test(f_luby, f_ludate, db_luby,
499 db_ludate, X_CUSTOM_MODE)) then
500
501 FND_PROFILE_CAT_OPTIONS_PKG.UPDATE_ROW (
502 X_PROFILE_OPTION_APPLICATION_I => prof_app_id,
503 X_PROFILE_OPTION_ID => prof_id,
504 X_CATEGORY_NAME => X_CATEGORY_NAME,
505 X_APPLICATION_ID => app_id,
506 X_DISPLAY_SEQUENCE => X_DISPLAY_SEQUENCE,
507 X_DISPLAY_TYPE => X_DISPLAY_TYPE,
508 X_LAST_UPDATE_DATE => f_ludate,
509 X_LAST_UPDATED_BY => f_luby,
510 X_LAST_UPDATE_LOGIN => f_luby);
511 end if;
512 exception
513 when no_data_found then
514 begin
515 FND_PROFILE_CAT_OPTIONS_PKG.INSERT_ROW (
516 X_ROWID => row_id,
517 X_PROFILE_OPTION_APPLICATION_I => prof_app_id,
518 X_PROFILE_OPTION_ID => prof_id,
519 X_CATEGORY_NAME => X_CATEGORY_NAME,
520 X_APPLICATION_ID => app_id,
521 X_DISPLAY_SEQUENCE => X_DISPLAY_SEQUENCE,
522 X_DISPLAY_TYPE => X_DISPLAY_TYPE,
523 X_CREATION_DATE => f_ludate,
524 X_CREATED_BY => f_luby,
525 X_LAST_UPDATE_DATE => f_ludate,
526 X_LAST_UPDATED_BY => f_luby,
527 X_LAST_UPDATE_LOGIN => f_luby);
528 exception
529 when dup_val_on_index then
530 -- Bug 5453931.
531 -- It means profile->category link information is already inserted
532 -- by another ldt parallely. For a given profile->category link,
533 -- since the data for this link info is always same from different
534 -- ldt's, we can ignore this dup_val_on_index exception while
535 -- inserting profile->category link data.
536 -- (Only Display_Sequence and Display_Type fields are updateable
537 -- in Fnd_Profile_Cat_Options table. But there is no UI feature
538 -- to update the above updateable columns. Hence data in
539 -- different ldt's is always same for this Fnd_Profile_Cat_Options
540 -- entity)
541
542 null;
543 end;
544 end;
545 end LOAD_ROW;
546
547 end FND_PROFILE_CAT_OPTIONS_PKG;