2: /* $Header: PORSRCUB.pls 120.7 2006/08/18 22:08:58 jinwang noship $ */
3:
4: -- Logging Static Variables
5: G_CURRENT_RUNTIME_LEVEL NUMBER;
6: G_LEVEL_UNEXPECTED CONSTANT NUMBER := FND_LOG.LEVEL_UNEXPECTED;
7: G_LEVEL_ERROR CONSTANT NUMBER := FND_LOG.LEVEL_ERROR;
8: G_LEVEL_EXCEPTION CONSTANT NUMBER := FND_LOG.LEVEL_EXCEPTION;
9: G_LEVEL_EVENT CONSTANT NUMBER := FND_LOG.LEVEL_EVENT;
10: G_LEVEL_PROCEDURE CONSTANT NUMBER := FND_LOG.LEVEL_PROCEDURE;
3:
4: -- Logging Static Variables
5: G_CURRENT_RUNTIME_LEVEL NUMBER;
6: G_LEVEL_UNEXPECTED CONSTANT NUMBER := FND_LOG.LEVEL_UNEXPECTED;
7: G_LEVEL_ERROR CONSTANT NUMBER := FND_LOG.LEVEL_ERROR;
8: G_LEVEL_EXCEPTION CONSTANT NUMBER := FND_LOG.LEVEL_EXCEPTION;
9: G_LEVEL_EVENT CONSTANT NUMBER := FND_LOG.LEVEL_EVENT;
10: G_LEVEL_PROCEDURE CONSTANT NUMBER := FND_LOG.LEVEL_PROCEDURE;
11: G_LEVEL_STATEMENT CONSTANT NUMBER := FND_LOG.LEVEL_STATEMENT;
4: -- Logging Static Variables
5: G_CURRENT_RUNTIME_LEVEL NUMBER;
6: G_LEVEL_UNEXPECTED CONSTANT NUMBER := FND_LOG.LEVEL_UNEXPECTED;
7: G_LEVEL_ERROR CONSTANT NUMBER := FND_LOG.LEVEL_ERROR;
8: G_LEVEL_EXCEPTION CONSTANT NUMBER := FND_LOG.LEVEL_EXCEPTION;
9: G_LEVEL_EVENT CONSTANT NUMBER := FND_LOG.LEVEL_EVENT;
10: G_LEVEL_PROCEDURE CONSTANT NUMBER := FND_LOG.LEVEL_PROCEDURE;
11: G_LEVEL_STATEMENT CONSTANT NUMBER := FND_LOG.LEVEL_STATEMENT;
12: G_MODULE_NAME CONSTANT VARCHAR2(50) := 'ICX.PLSQL.POR_AUTOSOURCE_UTIL_PKG.';
5: G_CURRENT_RUNTIME_LEVEL NUMBER;
6: G_LEVEL_UNEXPECTED CONSTANT NUMBER := FND_LOG.LEVEL_UNEXPECTED;
7: G_LEVEL_ERROR CONSTANT NUMBER := FND_LOG.LEVEL_ERROR;
8: G_LEVEL_EXCEPTION CONSTANT NUMBER := FND_LOG.LEVEL_EXCEPTION;
9: G_LEVEL_EVENT CONSTANT NUMBER := FND_LOG.LEVEL_EVENT;
10: G_LEVEL_PROCEDURE CONSTANT NUMBER := FND_LOG.LEVEL_PROCEDURE;
11: G_LEVEL_STATEMENT CONSTANT NUMBER := FND_LOG.LEVEL_STATEMENT;
12: G_MODULE_NAME CONSTANT VARCHAR2(50) := 'ICX.PLSQL.POR_AUTOSOURCE_UTIL_PKG.';
13:
6: G_LEVEL_UNEXPECTED CONSTANT NUMBER := FND_LOG.LEVEL_UNEXPECTED;
7: G_LEVEL_ERROR CONSTANT NUMBER := FND_LOG.LEVEL_ERROR;
8: G_LEVEL_EXCEPTION CONSTANT NUMBER := FND_LOG.LEVEL_EXCEPTION;
9: G_LEVEL_EVENT CONSTANT NUMBER := FND_LOG.LEVEL_EVENT;
10: G_LEVEL_PROCEDURE CONSTANT NUMBER := FND_LOG.LEVEL_PROCEDURE;
11: G_LEVEL_STATEMENT CONSTANT NUMBER := FND_LOG.LEVEL_STATEMENT;
12: G_MODULE_NAME CONSTANT VARCHAR2(50) := 'ICX.PLSQL.POR_AUTOSOURCE_UTIL_PKG.';
13:
14: /* Check if the item is internally orderable in the destination organization */
7: G_LEVEL_ERROR CONSTANT NUMBER := FND_LOG.LEVEL_ERROR;
8: G_LEVEL_EXCEPTION CONSTANT NUMBER := FND_LOG.LEVEL_EXCEPTION;
9: G_LEVEL_EVENT CONSTANT NUMBER := FND_LOG.LEVEL_EVENT;
10: G_LEVEL_PROCEDURE CONSTANT NUMBER := FND_LOG.LEVEL_PROCEDURE;
11: G_LEVEL_STATEMENT CONSTANT NUMBER := FND_LOG.LEVEL_STATEMENT;
12: G_MODULE_NAME CONSTANT VARCHAR2(50) := 'ICX.PLSQL.POR_AUTOSOURCE_UTIL_PKG.';
13:
14: /* Check if the item is internally orderable in the destination organization */
15: FUNCTION is_internal_orderable(p_item_id IN NUMBER,
327: ORDER BY avail_quantity DESC, msub.secondary_inventory_name ASC;
328:
329: BEGIN
330:
331: G_CURRENT_RUNTIME_LEVEL := FND_LOG.G_CURRENT_RUNTIME_LEVEL;
332:
333: IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL ) THEN
334: FND_LOG.STRING(G_LEVEL_STATEMENT, G_MODULE_NAME || l_procedure_name, 'Start Autosource');
335: END IF;
330:
331: G_CURRENT_RUNTIME_LEVEL := FND_LOG.G_CURRENT_RUNTIME_LEVEL;
332:
333: IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL ) THEN
334: FND_LOG.STRING(G_LEVEL_STATEMENT, G_MODULE_NAME || l_procedure_name, 'Start Autosource');
335: END IF;
336:
337: p_error_msg_code := '';
338:
357: -- check if the autosource logic was customized
358: if l_custom_package_flag = TRUE then
359:
360: IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL ) THEN
361: FND_LOG.STRING(G_LEVEL_STATEMENT, G_MODULE_NAME || l_procedure_name, 'Return Custom');
362: END IF;
363:
364: return TRUE;
365: end if;
364: return TRUE;
365: end if;
366:
367: IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL ) THEN
368: FND_LOG.STRING(G_LEVEL_STATEMENT, G_MODULE_NAME ||
369: l_procedure_name, 'Item ID: ' || to_char(p_item_id));
370: FND_LOG.STRING(G_LEVEL_STATEMENT, G_MODULE_NAME ||
371: l_procedure_name, 'Category ID: ' || to_char(p_category_id));
372: FND_LOG.STRING(G_LEVEL_STATEMENT, G_MODULE_NAME ||
366:
367: IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL ) THEN
368: FND_LOG.STRING(G_LEVEL_STATEMENT, G_MODULE_NAME ||
369: l_procedure_name, 'Item ID: ' || to_char(p_item_id));
370: FND_LOG.STRING(G_LEVEL_STATEMENT, G_MODULE_NAME ||
371: l_procedure_name, 'Category ID: ' || to_char(p_category_id));
372: FND_LOG.STRING(G_LEVEL_STATEMENT, G_MODULE_NAME ||
373: l_procedure_name, 'Dest Org ID: ' || to_char(p_dest_organization_id));
374: FND_LOG.STRING(G_LEVEL_STATEMENT, G_MODULE_NAME ||
368: FND_LOG.STRING(G_LEVEL_STATEMENT, G_MODULE_NAME ||
369: l_procedure_name, 'Item ID: ' || to_char(p_item_id));
370: FND_LOG.STRING(G_LEVEL_STATEMENT, G_MODULE_NAME ||
371: l_procedure_name, 'Category ID: ' || to_char(p_category_id));
372: FND_LOG.STRING(G_LEVEL_STATEMENT, G_MODULE_NAME ||
373: l_procedure_name, 'Dest Org ID: ' || to_char(p_dest_organization_id));
374: FND_LOG.STRING(G_LEVEL_STATEMENT, G_MODULE_NAME ||
375: l_procedure_name, 'Dest Subinv: ' || p_dest_subinventory);
376: FND_LOG.STRING(G_LEVEL_STATEMENT, G_MODULE_NAME ||
370: FND_LOG.STRING(G_LEVEL_STATEMENT, G_MODULE_NAME ||
371: l_procedure_name, 'Category ID: ' || to_char(p_category_id));
372: FND_LOG.STRING(G_LEVEL_STATEMENT, G_MODULE_NAME ||
373: l_procedure_name, 'Dest Org ID: ' || to_char(p_dest_organization_id));
374: FND_LOG.STRING(G_LEVEL_STATEMENT, G_MODULE_NAME ||
375: l_procedure_name, 'Dest Subinv: ' || p_dest_subinventory);
376: FND_LOG.STRING(G_LEVEL_STATEMENT, G_MODULE_NAME ||
377: l_procedure_name, 'Vendor ID: ' || to_char(p_vendor_id));
378: FND_LOG.STRING(G_LEVEL_STATEMENT, G_MODULE_NAME ||
372: FND_LOG.STRING(G_LEVEL_STATEMENT, G_MODULE_NAME ||
373: l_procedure_name, 'Dest Org ID: ' || to_char(p_dest_organization_id));
374: FND_LOG.STRING(G_LEVEL_STATEMENT, G_MODULE_NAME ||
375: l_procedure_name, 'Dest Subinv: ' || p_dest_subinventory);
376: FND_LOG.STRING(G_LEVEL_STATEMENT, G_MODULE_NAME ||
377: l_procedure_name, 'Vendor ID: ' || to_char(p_vendor_id));
378: FND_LOG.STRING(G_LEVEL_STATEMENT, G_MODULE_NAME ||
379: l_procedure_name, 'Vendor Site ID: ' || to_char(p_vendor_site_id));
380: FND_LOG.STRING(G_LEVEL_STATEMENT, G_MODULE_NAME ||
374: FND_LOG.STRING(G_LEVEL_STATEMENT, G_MODULE_NAME ||
375: l_procedure_name, 'Dest Subinv: ' || p_dest_subinventory);
376: FND_LOG.STRING(G_LEVEL_STATEMENT, G_MODULE_NAME ||
377: l_procedure_name, 'Vendor ID: ' || to_char(p_vendor_id));
378: FND_LOG.STRING(G_LEVEL_STATEMENT, G_MODULE_NAME ||
379: l_procedure_name, 'Vendor Site ID: ' || to_char(p_vendor_site_id));
380: FND_LOG.STRING(G_LEVEL_STATEMENT, G_MODULE_NAME ||
381: l_procedure_name, 'Not Purchasable Override: ' || p_not_purchasable_override);
382: FND_LOG.STRING(G_LEVEL_STATEMENT, G_MODULE_NAME ||
376: FND_LOG.STRING(G_LEVEL_STATEMENT, G_MODULE_NAME ||
377: l_procedure_name, 'Vendor ID: ' || to_char(p_vendor_id));
378: FND_LOG.STRING(G_LEVEL_STATEMENT, G_MODULE_NAME ||
379: l_procedure_name, 'Vendor Site ID: ' || to_char(p_vendor_site_id));
380: FND_LOG.STRING(G_LEVEL_STATEMENT, G_MODULE_NAME ||
381: l_procedure_name, 'Not Purchasable Override: ' || p_not_purchasable_override);
382: FND_LOG.STRING(G_LEVEL_STATEMENT, G_MODULE_NAME ||
383: l_procedure_name, 'Unit of Issue: ' || p_unit_of_issue);
384: END IF;
378: FND_LOG.STRING(G_LEVEL_STATEMENT, G_MODULE_NAME ||
379: l_procedure_name, 'Vendor Site ID: ' || to_char(p_vendor_site_id));
380: FND_LOG.STRING(G_LEVEL_STATEMENT, G_MODULE_NAME ||
381: l_procedure_name, 'Not Purchasable Override: ' || p_not_purchasable_override);
382: FND_LOG.STRING(G_LEVEL_STATEMENT, G_MODULE_NAME ||
383: l_procedure_name, 'Unit of Issue: ' || p_unit_of_issue);
384: END IF;
385:
386: -- first find the MRP: Assignment Set profile value
386: -- first find the MRP: Assignment Set profile value
387: l_set_id := to_number(fnd_profile.value('MRP_DEFAULT_ASSIGNMENT_SET'));
388:
389: IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL ) THEN
390: FND_LOG.STRING(G_LEVEL_STATEMENT, G_MODULE_NAME ||
391: l_procedure_name, 'Assignment Set ID: ' || to_char(l_set_id));
392: END IF;
393:
394: -- get the unit of issue of the destination org
396:
397: if l_set_id is null then
398: p_error_msg_code := 'ICX_POR_SRC_SETUP_INC';
399: IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL ) THEN
400: FND_LOG.STRING(G_LEVEL_STATEMENT, G_MODULE_NAME || l_procedure_name, 'Return F');
401: END IF;
402: return FALSE;
403: end if;
404:
410: l_is_purchasable_flag := 'N';
411: end if;
412:
413: IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL ) THEN
414: FND_LOG.STRING(G_LEVEL_STATEMENT, G_MODULE_NAME ||
415: l_procedure_name, 'Is Purchasable Flag: ' || l_is_purchasable_flag);
416: END IF;
417:
418: -- run the sourcing query
424: l_vendor_site_id;
425: exit when c_sourcing%NOTFOUND;
426:
427: IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL ) THEN
428: FND_LOG.STRING(G_LEVEL_STATEMENT, G_MODULE_NAME ||
429: l_procedure_name, 'Source Org ID: ' || to_char(l_source_organization_id));
430: FND_LOG.STRING(G_LEVEL_STATEMENT, G_MODULE_NAME ||
431: l_procedure_name, 'Source Type: ' || l_source_type);
432: END IF;
426:
427: IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL ) THEN
428: FND_LOG.STRING(G_LEVEL_STATEMENT, G_MODULE_NAME ||
429: l_procedure_name, 'Source Org ID: ' || to_char(l_source_organization_id));
430: FND_LOG.STRING(G_LEVEL_STATEMENT, G_MODULE_NAME ||
431: l_procedure_name, 'Source Type: ' || l_source_type);
432: END IF;
433:
434: if PO_ASL_SV.check_asl_action('2_SOURCING',l_vendor_id,
438: -- if the sourcing rules say to pick the supplier, return supplier
439: if l_source_type = 3 then
440: p_sourcing_type := 'SUPPLIER';
441: IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL ) THEN
442: FND_LOG.STRING(G_LEVEL_STATEMENT, G_MODULE_NAME ||
443: l_procedure_name, 'Return T ' || p_sourcing_type);
444: END IF;
445: return true;
446: end if;
450: -- check if the item is assigned to this particular source org
451: if is_item_assigned(p_item_id, l_source_organization_id) = 1 then
452:
453: IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL ) THEN
454: FND_LOG.STRING(G_LEVEL_STATEMENT, G_MODULE_NAME ||
455: l_procedure_name, 'Is Item Assigned: 1');
456: END IF;
457:
458: l_is_item_assigned_err := FALSE;
459: -- check if there is a valid shipping network betweem the destination org and this particular source org
460: if is_valid_shipping_network(l_source_organization_id, p_dest_organization_id) = 1 then
461:
462: IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL ) THEN
463: FND_LOG.STRING(G_LEVEL_STATEMENT, G_MODULE_NAME ||
464: l_procedure_name, 'Is Valid Shipping Network: 1');
465: END IF;
466:
467: l_is_ship_network_assigned_err := FALSE;
468: -- check if the item flags are correctly set in this particular source org
469: if is_item_shippable(p_item_id, l_source_organization_id) = 1 then
470:
471: IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL ) THEN
472: FND_LOG.STRING(G_LEVEL_STATEMENT, G_MODULE_NAME ||
473: l_procedure_name, 'Is Item Shippable: 1');
474: END IF;
475:
476: l_is_item_shippable_err := FALSE;
481: -- price change and charge account is regenerated. Hence, rounding it off to 10 to prevent the same
482: p_cost_price := round(p_cost_price,10);
483:
484: IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL ) THEN
485: FND_LOG.STRING(G_LEVEL_STATEMENT, G_MODULE_NAME ||
486: l_procedure_name, 'Cost Price:' || to_char(p_cost_price));
487: END IF;
488:
489: OPEN c_avail_quantity;
496: -- default to this source org and subinventory
497: -- otherwise keep search the sourcing rule
498:
499: IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL ) THEN
500: FND_LOG.STRING(G_LEVEL_STATEMENT, G_MODULE_NAME ||
501: l_procedure_name, 'Avail Qty:' || to_char(l_avail_quantity));
502: END IF;
503:
504: if l_avail_quantity > 0 then
506: p_source_organization_id := l_source_organization_id;
507: p_source_subinventory := l_source_subinventory;
508: close c_sourcing;
509: IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL ) THEN
510: FND_LOG.STRING(G_LEVEL_STATEMENT, G_MODULE_NAME ||
511: l_procedure_name, 'Return T ' || p_sourcing_type);
512: END IF;
513: return true;
514: end if;
518:
519: if ( (l_count = 0) and not (l_sourcing_rule_exist_err or l_is_item_assigned_err or l_is_ship_network_assigned_err or l_is_item_shippable_err) ) then
520:
521: IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL ) THEN
522: FND_LOG.STRING(G_LEVEL_STATEMENT, G_MODULE_NAME ||
523: l_procedure_name, 'Count = 0');
524: END IF;
525:
526: l_first_source_org_id := l_source_organization_id ;
540: if ( ( l_count > 0) and (l_first_source_org_id <> -9999) ) then
541: p_sourcing_type := 'INTERNAL';
542: p_source_organization_id := l_first_source_org_id;
543: IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL ) THEN
544: FND_LOG.STRING(G_LEVEL_STATEMENT, G_MODULE_NAME ||
545: l_procedure_name, 'Return T ' || p_sourcing_type);
546: END IF;
547: return TRUE;
548: end if;
550: -- if we didn't find an internal source and the item is purchasable, return Supplier
551: if (l_is_purchasable_flag = 'Y') then
552: p_sourcing_type := 'SUPPLIER';
553: IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL ) THEN
554: FND_LOG.STRING(G_LEVEL_STATEMENT, G_MODULE_NAME ||
555: l_procedure_name, 'Return T ' || p_sourcing_type);
556: END IF;
557: return TRUE;
558: end if;
573: p_error_msg_code := 'ICX_POR_NO_INT_SOURCES_ERR';
574: end if;
575:
576: IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL ) THEN
577: FND_LOG.STRING(G_LEVEL_STATEMENT, G_MODULE_NAME ||
578: l_procedure_name, 'Return F');
579: END IF;
580:
581: return FALSE;
586: if c_sourcing%ISOPEN then
587: close c_sourcing;
588: end if;
589: IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL ) THEN
590: FND_LOG.STRING(G_LEVEL_STATEMENT, G_MODULE_NAME ||
591: l_procedure_name, 'Exception Return F');
592: END IF;
593: RETURN FALSE;
594: