[Home] [Help]
PACKAGE BODY: APPS.XLA_PRODUCT_RULES_F_PKG
Source
1 PACKAGE BODY xla_product_rules_f_pkg AS
2 /* $Header: xlathpdr.pkb 120.19.12010000.1 2008/07/29 10:10:17 appldev ship $ */
3 /*======================================================================+
4 | Copyright (c) 2001-2002 Oracle Corporation |
5 | Redwood Shores, CA, USA |
6 | All rights reserved. |
7 +=======================================================================+
8 | PACKAGE NAME |
9 | xla_product_rules |
10 | |
11 | DESCRIPTION |
12 | Forms PL/SQL Wrapper for xla_product_rules |
13 | |
14 | HISTORY |
15 | Generated from XLAUTB. |
16 | |
17 +======================================================================*/
18
19 --=============================================================================
20 -- *********** Local Trace Routine **********
21 --=============================================================================
22 C_LEVEL_STATEMENT CONSTANT NUMBER := FND_LOG.LEVEL_STATEMENT;
23 C_LEVEL_PROCEDURE CONSTANT NUMBER := FND_LOG.LEVEL_PROCEDURE;
24 C_LEVEL_EVENT CONSTANT NUMBER := FND_LOG.LEVEL_EVENT;
25 C_LEVEL_EXCEPTION CONSTANT NUMBER := FND_LOG.LEVEL_EXCEPTION;
26 C_LEVEL_ERROR CONSTANT NUMBER := FND_LOG.LEVEL_ERROR;
27 C_LEVEL_UNEXPECTED CONSTANT NUMBER := FND_LOG.LEVEL_UNEXPECTED;
28
29 C_LEVEL_LOG_DISABLED CONSTANT NUMBER := 99;
30 C_DEFAULT_MODULE CONSTANT VARCHAR2(240) := 'xla.plsql.xla_product_rules_f_pkg';
31
32 g_log_level NUMBER;
33 g_log_enabled BOOLEAN;
34
35 PROCEDURE trace
36 (p_msg IN VARCHAR2
37 ,p_module IN VARCHAR2
38 ,p_level IN NUMBER) IS
39 BEGIN
40 ----------------------------------------------------------------------------
41 -- Following is for FND log.
42 ----------------------------------------------------------------------------
43 IF (p_msg IS NULL AND p_level >= g_log_level) THEN
44 fnd_log.message(p_level, p_module);
45 ELSIF p_level >= g_log_level THEN
46 fnd_log.string(p_level, p_module, p_msg);
47 END IF;
48
49 EXCEPTION
50 WHEN xla_exceptions_pkg.application_exception THEN
51 RAISE;
52
53 WHEN OTHERS THEN
54 xla_exceptions_pkg.raise_message
55 (p_location => 'xla_product_rules_f_pkg.trace');
56 END trace;
57
58
59 /*======================================================================+
60 | |
61 | Procedure insert_row |
62 | |
63 +======================================================================*/
64 PROCEDURE insert_row
65 (x_rowid IN OUT NOCOPY VARCHAR2
66 ,x_application_id IN NUMBER
67 ,x_amb_context_code IN VARCHAR2
68 ,x_product_rule_type_code IN VARCHAR2
69 ,x_product_rule_code IN VARCHAR2
70 ,x_enabled_flag IN VARCHAR2
71 ,x_request_id IN NUMBER
72 ,x_product_rule_version IN VARCHAR2
73 ,x_transaction_coa_id IN NUMBER
74 ,x_accounting_coa_id IN NUMBER
75 ,x_product_rule_hash_id IN NUMBER
76 ,x_compile_status_code IN VARCHAR2
77 ,x_name IN VARCHAR2
78 ,x_description IN VARCHAR2
79 ,x_creation_date IN DATE
80 ,x_created_by IN NUMBER
81 ,x_last_update_date IN DATE
82 ,x_last_updated_by IN NUMBER
83 ,x_last_update_login IN NUMBER)
84
85 IS
86
87 CURSOR c IS
88 SELECT rowid
89 FROM xla_product_rules_b
90 WHERE application_id = x_application_id
91 AND amb_context_code = x_amb_context_code
92 AND product_rule_type_code = x_product_rule_type_code
93 AND product_rule_code = x_product_rule_code
94 ;
95
96 l_log_module VARCHAR2(240);
97 BEGIN
98 IF g_log_enabled THEN
99 l_log_module := C_DEFAULT_MODULE||'.insert_row';
100 END IF;
101
102 IF (C_LEVEL_PROCEDURE >= g_log_level) THEN
103 trace(p_msg => 'BEGIN of procedure insert_row',
104 p_module => l_log_module,
105 p_level => C_LEVEL_PROCEDURE);
106 END IF;
107
108 INSERT INTO xla_product_rules_b
109 (creation_date
110 ,created_by
111 ,enabled_flag
112 ,request_id
113 ,product_rule_version
114 ,application_id
115 ,product_rule_type_code
116 ,product_rule_code
117 ,transaction_coa_id
118 ,accounting_coa_id
119 ,product_rule_hash_id
120 ,amb_context_code
121 ,compile_status_code
122 ,updated_flag
123 ,version_num
124 ,last_update_date
125 ,last_updated_by
126 ,last_update_login)
127 VALUES
128 (x_creation_date
129 ,x_created_by
130 ,x_enabled_flag
131 ,x_request_id
132 ,x_product_rule_version
133 ,x_application_id
134 ,x_product_rule_type_code
135 ,x_product_rule_code
136 ,x_transaction_coa_id
137 ,x_accounting_coa_id
138 ,x_product_rule_hash_id
139 ,x_amb_context_code
140 ,x_compile_status_code
141 ,'Y'
142 ,0
143 ,x_last_update_date
144 ,x_last_updated_by
145 ,x_last_update_login)
146 ;
147
148 INSERT INTO xla_product_rules_tl
149 (amb_context_code
150 ,last_update_login
151 ,creation_date
152 ,created_by
153 ,last_update_date
154 ,last_updated_by
155 ,application_id
156 ,product_rule_type_code
157 ,product_rule_code
158 ,name
159 ,description
160 ,language
161 ,source_lang)
162 SELECT
163 x_amb_context_code
164 ,x_last_update_login
165 ,x_creation_date
166 ,x_created_by
167 ,x_last_update_date
168 ,x_last_updated_by
169 ,x_application_id
170 ,x_product_rule_type_code
171 ,x_product_rule_code
172 ,x_name
173 ,x_description
174 ,l.language_code
175 ,USERENV('LANG')
176 FROM fnd_languages l
177 WHERE l.installed_flag IN ('I', 'B')
178 AND NOT EXISTS
179 (SELECT NULL
180 FROM xla_product_rules_tl t
181 WHERE t.application_id = x_application_id
182 AND t.amb_context_code = x_amb_context_code
183 AND t.product_rule_type_code = x_product_rule_type_code
184 AND t.product_rule_code = x_product_rule_code
185 AND t.language = l.language_code);
186
187 OPEN c;
188 FETCH c INTO x_rowid;
189
190 IF (c%NOTFOUND) THEN
191 CLOSE c;
192 RAISE NO_DATA_FOUND;
193 END IF;
194 CLOSE c;
195
196 IF (C_LEVEL_PROCEDURE >= g_log_level) THEN
197 trace(p_msg => 'END of procedure insert_row',
198 p_module => l_log_module,
199 p_level => C_LEVEL_PROCEDURE);
200 END IF;
201
202 END insert_row;
203
204 /*======================================================================+
205 | |
206 | Procedure lock_row |
207 | |
208 +======================================================================*/
209 PROCEDURE lock_row
210 (x_application_id IN NUMBER
211 ,x_amb_context_code IN VARCHAR2
212 ,x_product_rule_type_code IN VARCHAR2
213 ,x_product_rule_code IN VARCHAR2
214 ,x_enabled_flag IN VARCHAR2
215 ,x_request_id IN NUMBER
216 ,x_product_rule_version IN VARCHAR2
217 ,x_transaction_coa_id IN NUMBER
218 ,x_accounting_coa_id IN NUMBER
219 ,x_product_rule_hash_id IN NUMBER
220 ,x_compile_status_code IN VARCHAR2
221 ,x_name IN VARCHAR2
222 ,x_description IN VARCHAR2)
223
224 IS
225
226 CURSOR c IS
227 SELECT enabled_flag
228 ,request_id
229 ,product_rule_version
230 ,transaction_coa_id
231 ,accounting_coa_id
232 ,product_rule_hash_id
233 ,compile_status_code
234 FROM xla_product_rules_b
235 WHERE application_id = x_application_id
236 AND amb_context_code = x_amb_context_code
237 AND product_rule_type_code = x_product_rule_type_code
238 AND product_rule_code = x_product_rule_code
239 FOR UPDATE OF application_id NOWAIT;
240
241 recinfo c%ROWTYPE;
242
243 CURSOR c1 IS
244 SELECT amb_context_code
245 ,name
246 ,description
247 ,DECODE(language , USERENV('LANG'), 'Y', 'N') baselang
248 FROM xla_product_rules_tl
249 WHERE application_id = X_application_id
250 AND amb_context_code = X_amb_context_code
251 AND product_rule_type_code = X_product_rule_type_code
252 AND product_rule_code = X_product_rule_code
253 AND USERENV('LANG') IN (language ,source_lang)
254 FOR UPDATE OF application_id NOWAIT;
255
256 l_log_module VARCHAR2(240);
257 BEGIN
258 IF g_log_enabled THEN
259 l_log_module := C_DEFAULT_MODULE||'.lock_row';
260 END IF;
261
262 IF (C_LEVEL_PROCEDURE >= g_log_level) THEN
263 trace(p_msg => 'BEGIN of procedure lock_row',
264 p_module => l_log_module,
265 p_level => C_LEVEL_PROCEDURE);
266 END IF;
267
268
269 OPEN c;
270 FETCH c INTO recinfo;
271
272 IF (c%NOTFOUND) THEN
273 CLOSE c;
274 fnd_message.set_name('FND', 'FORM_RECORD_DELETED');
275 app_exception.raise_exception;
276 END IF;
277 CLOSE c;
278
279 IF ( (recinfo.enabled_flag = x_enabled_flag)
280 AND ((recinfo.request_id = X_request_id)
281 OR ((recinfo.request_id IS NULL)
282 AND (x_request_id IS NULL)))
283 AND ((recinfo.product_rule_version = X_product_rule_version)
284 OR ((recinfo.product_rule_version IS NULL)
285 AND (x_product_rule_version IS NULL)))
286 AND ((recinfo.transaction_coa_id = X_transaction_coa_id)
287 OR ((recinfo.transaction_coa_id IS NULL)
288 AND (x_transaction_coa_id IS NULL)))
289 AND ((recinfo.accounting_coa_id = X_accounting_coa_id)
290 OR ((recinfo.accounting_coa_id IS NULL)
291 AND (x_accounting_coa_id IS NULL)))
292 AND ((recinfo.product_rule_hash_id = X_product_rule_hash_id)
293 OR ((recinfo.product_rule_hash_id IS NULL)
294 AND (x_product_rule_hash_id IS NULL)))
295 AND ((recinfo.compile_status_code = X_compile_status_code)
296 OR ((recinfo.compile_status_code IS NULL)
297 AND (x_compile_status_code IS NULL)))
298 ) THEN
299 NULL;
300 ELSE
301 fnd_message.set_name('FND', 'FORM_RECORD_CHANGED');
302 app_exception.raise_exception;
303 END IF;
304
305 FOR tlinfo IN c1 LOOP
306 IF (tlinfo.baselang = 'Y') THEN
307 IF ( (tlinfo.name = X_name)
308 AND ((tlinfo.description = X_description)
309 OR ((tlinfo.description is null)
310 AND (X_description is null)))
311 ) THEN
312 NULL;
313 ELSE
314 fnd_message.set_name('FND', 'FORM_RECORD_CHANGED');
315 app_exception.raise_exception;
316 END IF;
317 END IF;
318 END LOOP;
319
320 IF (C_LEVEL_PROCEDURE >= g_log_level) THEN
321 trace(p_msg => 'END of procedure lock_row',
322 p_module => l_log_module,
323 p_level => C_LEVEL_PROCEDURE);
324 END IF;
325
326 RETURN;
327
328 END lock_row;
329
330 /*======================================================================+
331 | |
332 | Procedure update_row |
333 | |
334 +======================================================================*/
335 PROCEDURE update_row
336 (x_application_id IN NUMBER
337 ,x_amb_context_code IN VARCHAR2
338 ,x_product_rule_type_code IN VARCHAR2
339 ,x_product_rule_code IN VARCHAR2
340 ,x_enabled_flag IN VARCHAR2
341 ,x_request_id IN NUMBER
342 ,x_product_rule_version IN VARCHAR2
343 ,x_transaction_coa_id IN NUMBER
344 ,x_accounting_coa_id IN NUMBER
345 ,x_product_rule_hash_id IN NUMBER
346 ,x_compile_status_code IN VARCHAR2
347 ,x_name IN VARCHAR2
348 ,x_description IN VARCHAR2
349 ,x_last_update_date IN DATE
350 ,x_last_updated_by IN NUMBER
351 ,x_last_update_login IN NUMBER)
352
353 IS
354
355 l_log_module VARCHAR2(240);
356 BEGIN
357 IF g_log_enabled THEN
358 l_log_module := C_DEFAULT_MODULE||'.update_row';
359 END IF;
360
361 IF (C_LEVEL_PROCEDURE >= g_log_level) THEN
362 trace(p_msg => 'BEGIN of procedure update_row',
363 p_module => l_log_module,
364 p_level => C_LEVEL_PROCEDURE);
365 END IF;
366
367 UPDATE xla_product_rules_b
368 SET
369 last_update_date = x_last_update_date
370 ,enabled_flag = x_enabled_flag
371 ,request_id = x_request_id
372 ,product_rule_version = x_product_rule_version
373 ,transaction_coa_id = x_transaction_coa_id
374 ,accounting_coa_id = x_accounting_coa_id
375 ,product_rule_hash_id = x_product_rule_hash_id
376 ,compile_status_code = x_compile_status_code
377 ,updated_flag = 'Y'
378 ,last_updated_by = x_last_updated_by
379 ,last_update_login = x_last_update_login
380 WHERE application_id = X_application_id
381 AND amb_context_code = X_amb_context_code
382 AND product_rule_type_code = X_product_rule_type_code
383 AND product_rule_code = X_product_rule_code;
384
385 IF (SQL%NOTFOUND) THEN
386 RAISE NO_DATA_FOUND;
387 END IF;
388
389 UPDATE xla_product_rules_tl
390 SET
391 last_update_date = x_last_update_date
392 ,name = X_name
393 ,description = X_description
394 ,last_updated_by = x_last_updated_by
395 ,last_update_login = x_last_update_login
396 ,source_lang = USERENV('LANG')
397 WHERE application_id = X_application_id
398 AND amb_context_code = X_amb_context_code
399 AND product_rule_type_code = X_product_rule_type_code
400 AND product_rule_code = X_product_rule_code
401 AND USERENV('LANG') IN (language, source_lang);
402
403 IF (SQL%NOTFOUND) THEN
404 RAISE NO_DATA_FOUND;
405 END IF;
406
407 IF (C_LEVEL_PROCEDURE >= g_log_level) THEN
408 trace(p_msg => 'END of procedure update_row',
409 p_module => l_log_module,
410 p_level => C_LEVEL_PROCEDURE);
411 END IF;
412
413 END update_row;
414
415 /*======================================================================+
416 | |
417 | Procedure delete_row |
418 | |
419 +======================================================================*/
420 PROCEDURE delete_row
421 (x_application_id IN NUMBER
422 ,x_amb_context_code IN VARCHAR2
423 ,x_product_rule_type_code IN VARCHAR2
424 ,x_product_rule_code IN VARCHAR2)
425
426 IS
427
428 l_log_module VARCHAR2(240);
429 BEGIN
430 IF g_log_enabled THEN
431 l_log_module := C_DEFAULT_MODULE||'.delete_row';
432 END IF;
433
434 IF (C_LEVEL_PROCEDURE >= g_log_level) THEN
435 trace(p_msg => 'BEGIN of procedure delete_row',
436 p_module => l_log_module,
437 p_level => C_LEVEL_PROCEDURE);
438 END IF;
439
440 DELETE FROM xla_product_rules_tl
441 WHERE application_id = x_application_id
442 AND amb_context_code = x_amb_context_code
443 AND product_rule_type_code = x_product_rule_type_code
444 AND product_rule_code = x_product_rule_code;
445
446
447 IF (SQL%NOTFOUND) THEN
448 RAISE NO_DATA_FOUND;
449 END IF;
450
451 DELETE FROM xla_product_rules_b
452 WHERE application_id = x_application_id
453 AND amb_context_code = x_amb_context_code
454 AND product_rule_type_code = x_product_rule_type_code
455 AND product_rule_code = x_product_rule_code;
456
457
458 IF (SQL%NOTFOUND) THEN
459 RAISE NO_DATA_FOUND;
460 END IF;
461
462
463 IF (C_LEVEL_PROCEDURE >= g_log_level) THEN
464 trace(p_msg => 'END of procedure delete_row',
465 p_module => l_log_module,
466 p_level => C_LEVEL_PROCEDURE);
467 END IF;
468
469 END delete_row;
470
471 /*======================================================================+
472 | |
473 | Procedure add_language |
474 | |
475 +======================================================================*/
476 PROCEDURE add_language
477
478 IS
479
480 l_log_module VARCHAR2(240);
481 BEGIN
482 IF g_log_enabled THEN
483 l_log_module := C_DEFAULT_MODULE||'.add_language';
484 END IF;
485
486 IF (C_LEVEL_PROCEDURE >= g_log_level) THEN
487 trace(p_msg => 'BEGIN of procedure add_language',
488 p_module => l_log_module,
489 p_level => C_LEVEL_PROCEDURE);
490 END IF;
491
492
493 DELETE FROM xla_product_rules_tl T
494 WHERE NOT EXISTS
495 (SELECT NULL
496 FROM xla_product_rules_b b
497 WHERE b.application_id = t.application_id
498 AND b.amb_context_code = t.amb_context_code
499 AND b.product_rule_type_code = t.product_rule_type_code
500 AND b.product_rule_code = t.product_rule_code);
501
502 UPDATE xla_product_rules_tl t
503 SET (name
504 ,description)
505 = (SELECT b.name
506 ,b.description
507 FROM xla_product_rules_tl b
508 WHERE b.application_id = t.application_id
509 AND b.amb_context_code = t.amb_context_code
510 AND b.product_rule_type_code = t.product_rule_type_code
511 AND b.product_rule_code = t.product_rule_code
512 AND b.language = t.source_lang)
513 WHERE (t.application_id
514 ,t.amb_context_code
515 ,t.product_rule_type_code
516 ,t.product_rule_code
517 ,t.language)
518 IN (SELECT subt.application_id
519 ,subt.amb_context_code
520 ,subt.product_rule_type_code
521 ,subt.product_rule_code
522 ,subt.language
523 FROM xla_product_rules_tl subb
524 ,xla_product_rules_tl subt
525 WHERE subb.application_id = subt.application_id
526 AND subb.amb_context_code = subt.amb_context_code
527 AND subb.product_rule_type_code = subt.product_rule_type_code
528 AND subb.product_rule_code = subt.product_rule_code
529 AND subb.language = subt.source_lang
530 AND (SUBB.name <> SUBT.name
531 OR SUBB.description <> SUBT.description
532 OR (subb.description IS NULL
533 AND subt.description IS NOT NULL)
534 OR (subb.description IS NOT NULL
535 AND subt.description IS NULL)
536 ))
537 ;
538
539 INSERT INTO xla_product_rules_tl
540 (amb_context_code
541 ,last_update_login
542 ,creation_date
543 ,created_by
544 ,last_update_date
545 ,last_updated_by
546 ,application_id
547 ,product_rule_type_code
548 ,product_rule_code
549 ,name
550 ,description
551 ,language
552 ,source_lang)
553 SELECT /*+ ORDERED */
554 b.amb_context_code
555 ,b.last_update_login
556 ,b.creation_date
557 ,b.created_by
558 ,b.last_update_date
559 ,b.last_updated_by
560 ,b.application_id
561 ,b.product_rule_type_code
562 ,b.product_rule_code
563 ,b.name
564 ,b.description
565 ,l.language_code
566 ,b.source_lang
567 FROM xla_product_rules_tl b
568 ,fnd_languages l
569 WHERE l.installed_flag IN ('I', 'B')
570 AND b.language = userenv('LANG')
571 AND NOT EXISTS
572 (SELECT NULL
573 FROM xla_product_rules_tl t
574 WHERE t.application_id = b.application_id
575 AND t.amb_context_code = b.amb_context_code
576 AND t.product_rule_type_code = b.product_rule_type_code
577 AND t.product_rule_code = b.product_rule_code
578 AND t.language = l.language_code);
579
580 IF (C_LEVEL_PROCEDURE >= g_log_level) THEN
581 trace(p_msg => 'END of procedure add_language',
582 p_module => l_log_module,
583 p_level => C_LEVEL_PROCEDURE);
584 END IF;
585
586 END add_language;
587
588 --=============================================================================
589 --
590 -- Name: translate_row
591 -- Description: To be used by FNDLOAD to upload a translated row
592 --
593 --=============================================================================
594 PROCEDURE translate_row
595 (p_application_short_name IN VARCHAR2
596 ,p_amb_context_code IN VARCHAR2
597 ,p_product_rule_type_code IN VARCHAR2
598 ,p_product_rule_code IN VARCHAR2
599 ,p_name IN VARCHAR2
600 ,p_description IN VARCHAR2
601 ,p_owner IN VARCHAR2
602 ,p_last_update_date IN VARCHAR2
603 ,p_custom_mode IN VARCHAR2)
604 IS
605 CURSOR c_app_id IS
606 SELECT application_id
607 FROM fnd_application
608 WHERE application_short_name = p_application_short_name;
609
610 l_application_id INTEGER;
611 l_rowid ROWID;
612 l_exist VARCHAR2(1);
613 f_luby NUMBER; -- entity owner in file
614 f_ludate DATE; -- entity update date in file
615 db_luby NUMBER; -- entity owner in db
616 db_ludate DATE; -- entity update date in db
617 l_log_module VARCHAR2(240);
618 BEGIN
619
620 IF g_log_enabled THEN
621 l_log_module := C_DEFAULT_MODULE||'.translate_row';
622 END IF;
623
624 IF (C_LEVEL_PROCEDURE >= g_log_level) THEN
625 trace(p_msg => 'BEGIN of procedure translate_row',
626 p_module => l_log_module,
627 p_level => C_LEVEL_PROCEDURE);
628 END IF;
629
630 -- Translate owner to file_last_updated_by
631 f_luby := fnd_load_util.owner_id(p_owner);
632
633 -- Translate char last_update_date to date
634 f_ludate := nvl(to_date(p_last_update_date, 'YYYY/MM/DD'), sysdate);
635
636 OPEN c_app_id;
637 FETCH c_app_id INTO l_application_id;
638 CLOSE c_app_id;
639
640 BEGIN
641 SELECT last_updated_by, last_update_date
642 INTO db_luby, db_ludate
643 FROM xla_product_rules_tl
644 WHERE application_id = l_application_id
645 AND amb_context_code = p_amb_context_code
646 AND product_rule_type_code = p_product_rule_type_code
647 AND product_rule_code = p_product_rule_code
648 AND language = userenv('LANG');
649
650 IF (fnd_load_util.upload_test(f_luby, f_ludate, db_luby,
651 db_ludate, p_custom_mode)) then
652 UPDATE xla_product_rules_tl
653 SET name = p_name
654 ,description = p_description
655 ,last_update_date = f_ludate
656 ,last_updated_by = f_luby
657 ,last_update_login = 0
658 ,source_lang = userenv('LANG')
659 WHERE userenv('LANG') IN (language, source_lang)
660 AND application_id = l_application_id
661 AND amb_context_code = p_amb_context_code
662 AND product_rule_type_code = p_product_rule_type_code
663 AND product_rule_code = p_product_rule_code;
664
665 END IF;
666
667
668
669 END;
670
671 IF (C_LEVEL_PROCEDURE >= g_log_level) THEN
672 trace(p_msg => 'END of procedure translate_row',
673 p_module => l_log_module,
674 p_level => C_LEVEL_PROCEDURE);
675 END IF;
676
677
678 END translate_row;
679
680 --=============================================================================
681 --
682 -- Following code is executed when the package body is referenced for the first
683 -- time
684 --
685 --=============================================================================
686 BEGIN
687 g_log_level := FND_LOG.G_CURRENT_RUNTIME_LEVEL;
688 g_log_enabled := fnd_log.test
689 (log_level => g_log_level
690 ,module => C_DEFAULT_MODULE);
691
692 IF NOT g_log_enabled THEN
693 g_log_level := C_LEVEL_LOG_DISABLED;
694 END IF;
695
696
697 end xla_product_rules_f_PKG;