Step 1: Deploy Oracle SR Package
→ Description: Apply the Oracle-provided script Compile the package
/*===========================================================================+
| Copyright (c) 1999, 2025 Oracle Corporation |
| Redwood Shores, California, USA |
| All rights reserved. |
+===========================================================================*/
REM dbdrv: sql ~PROD ~PATH ~FILE none none none package &phase=plb checkfile(120.4.12010000.22=120.11.12020000.14)(120.4.12000000.6=120.4.12010000.6)(120.4.12000000.4=120.4.12010000.4)(115.5=120.2):~PROD:~PATH:~FILE
SET VERIFY OFF
WHENEVER OSERROR EXIT FAILURE ROLLBACK;
WHENEVER SQLERROR EXIT FAILURE ROLLBACK;
CREATE OR REPLACE PACKAGE BODY WSH_PURGE AS
/* $Header: WSHPURGB.pls 120.11.12020000.11.1 2025/04/17 08:10:45 shthacke ship $ */
— Description: Constant to distinguish CONCURRENT request from
— ONLINE request
G_CONC_REQ VARCHAR2(1) := FND_API.G_TRUE;
–Package Name
G_PKG_NAME CONSTANT VARCHAR2(50):=’WSH_PURGE’;
—————————————————————————–
— Procedure: Process_Purge
— Parameters: errbuf Parameter for the Concurrent Program to get the error.
— retcode Parameter for the Concurrent Program to get the return code
— p_execution_mode Specifies whether to Purge Data or View Purge Set
— p_source_system Only the delivery details belonging to this Source System
— would be considered eligible for Purge
— p_ship_from_org Only the deliveries belonging to this Ship From Org
— would be considered eligible for Purge
— p_order_number_from Only the delivery details having source_header_number
— greater than Order Number From would be considered eligible for Purge
— p_order_number_to Only the delivery details having source_header_number
— less than Order Number To would be considered eligible for Purge
— p_order_type Only the delivery details belonging to this Order Type
— would be considered eligible for Purge
— p_ship_date_from Only the deliveries having initial_pickup_date greater
— than Ship Date From would be considered eligible for Purge
— p_ship_date_to Only the deliveries having initial_pickup_date less than
— Ship Date To would be considered eligible for Purge
— p_delete_beyond_x_ship_days Only the deliveries having initial_pickup_date less
— than the specified date would be considered eligible for Purge
— p_purge_intransit_trips Decides whether to purge In Transit Trips or not
— p_delete_empty_records Decides whether to delete empty record or not.
— The empty records can be Empty Trips, Orphaned Empty Deliveries,
— Delivery with Empty containers, Empty Containers
— p_create_date_from Only Empty records having creation_date greater than this
— date would be purged
— p_create_date_to Only Empty records having creation_date less than this
— date would be purged
— p_del_beyond_creation_days Only Empty records having creation_date less than
— this date would be purged
— p_sort_per_criteria Sorts the report output according to Trip,
— Delivery or Order Number
— p_print_detail If “Detail with LPN”, the report would contain the parameters / summary
— page and all detail pages with Trips, Deliveries and
— Sales Orders with Container data eligible to purge or purged.
— If “Detail”, the report would contain the parameters / summary
— page and all detail pages with Trips, Deliveries and
— Sales Orders data eligible to purge or purged.
— If “Summary”, the report would contain only the parameters / summary page.
— Description: This procedure is called by the concurrent program. The procedure has the following structure
— calls Get_Purge_Set – To get the valid entities to be purged
— calls Purge_Entities – To purge data in Shipping/FTE tables
— calls Generate_Report – To generate the report through XML publisher
—————————————————————————–
PROCEDURE Process_Purge( errbuf OUT NOCOPY VARCHAR2,
retcode OUT NOCOPY VARCHAR2,
p_execution_mode varchar2,
p_source_system varchar2,
p_ship_from_org number,
p_order_number_from varchar2,
p_source_system_dummy varchar2,
p_order_number_to varchar2,
p_dummy_order varchar2,
p_order_type number,
p_ship_date_from varchar2,
p_ship_date_to varchar2,
p_dummy_ship_date varchar2,
p_delete_beyond_x_ship_days number,
p_dummy_x_ship_days varchar2,
p_purge_intransit_trips varchar2,
p_delete_empty_records varchar2,
p_create_date_from varchar2,
p_create_date_to varchar2,
p_dummy_create_date varchar2,
p_del_beyond_creation_days number,
p_dummy_x_create_days varchar2,
p_sort_per_criteria varchar2,
p_print_detail varchar2
)IS
l_return_status VARCHAR2(1);
l_debug_on BOOLEAN;
–PLSQL tables for the entities
l_tbl_trip_purge_set Trip_ID_Tbl_Type; –Trip
l_tbl_delivery_purge_set Delivery_ID_Tbl_Type; –Delivery
l_tbl_del_detail_purge_set Del_Detail_ID_Tbl_Type; — Delivery Detail
l_tbl_del_leg_purge_set Del_Leg_ID_Tbl_Type; –Delivery Leg
l_tbl_trip_stop_purge_set Trip_Stop_ID_Tbl_Type; –Trip Stop
l_tbl_container_purge_set Container_ID_Tbl_Type; –Container
l_module_name CONSTANT VARCHAR2(100) := ‘wsh.plsql.’ || G_PKG_NAME || ‘.’ || ‘PROCESS_PURGE’;
BEGIN
— Set for logging
IF G_CONC_REQ = FND_API.G_TRUE THEN
WSH_UTIL_CORE.Enable_Concurrent_Log_Print;
END IF;
— Debug Statements
—
l_debug_on := WSH_DEBUG_INTERFACE.g_debug;
—
IF l_debug_on IS NULL THEN
l_debug_on := WSH_DEBUG_SV.is_debug_enabled;
END IF;
—
IF l_debug_on THEN
WSH_DEBUG_SV.push(l_module_name);
WSH_DEBUG_SV.log(l_module_name,’P_EXECUTION_MODE’,p_execution_mode);
WSH_DEBUG_SV.log(l_module_name,’P_SOURCE_SYSTEM’,p_source_system);
WSH_DEBUG_SV.log(l_module_name,’P_SHIP_FROM_ORG’,p_ship_from_org);
WSH_DEBUG_SV.log(l_module_name,’P_ORDER_NUMBER_FROM’,p_order_number_from);
WSH_DEBUG_SV.log(l_module_name,’P_ORDER_NUMBER_To’,p_order_number_to);
WSH_DEBUG_SV.log(l_module_name,’P_ORDER_TYPE’,p_order_type);
WSH_DEBUG_SV.log(l_module_name,’P_SHIP_DATE_FROM’,p_ship_date_from);
WSH_DEBUG_SV.log(l_module_name,’P_SHIP_DATE_TO’,p_ship_date_to);
WSH_DEBUG_SV.log(l_module_name,’P_DELETE_BEYOND_X_SHIP_DAYS’,p_delete_beyond_x_ship_days);
WSH_DEBUG_SV.log(l_module_name,’P_PURGE_INTRANSIT_TRIPS’,p_purge_intransit_trips);
WSH_DEBUG_SV.log(l_module_name,’P_DELETE_EMPTY_Records’,p_delete_empty_records);
WSH_DEBUG_SV.log(l_module_name,’P_CREATE_DATE_FROM’,p_create_date_from);
WSH_DEBUG_SV.log(l_module_name,’P_CREATE_DATE_TO’,p_create_date_to);
WSH_DEBUG_SV.log(l_module_name,’P_DEL_BEYOND_CREATION_DAYS’,p_del_beyond_creation_days);
WSH_DEBUG_SV.log(l_module_name,’P_SORT_PER_CRITERIA’,p_sort_per_criteria);
WSH_DEBUG_SV.log(l_module_name,’P_PRINT_DETAIL’,p_print_detail);
END IF;
IF l_debug_on THEN
WSH_DEBUG_SV.logmsg(l_module_name,’Calling program unit WSH_PURGE.GET_PURGE_SET’, WSH_DEBUG_SV.C_PROC_LEVEL);
END IF;
–call Get_Purge_Set
Get_Purge_Set(p_source_system => p_source_system ,
p_ship_from_org => p_ship_from_org ,
p_order_number_from => p_order_number_from ,
p_order_number_to => p_order_number_to ,
p_order_type => p_order_type ,
p_ship_date_from => p_ship_date_from ,
p_ship_date_to => p_ship_date_to ,
p_delete_beyond_x_ship_days=> p_delete_beyond_x_ship_days ,
p_purge_intransit_trips => p_purge_intransit_trips ,
p_delete_empty_records => p_delete_empty_records ,
p_create_date_from => p_create_date_from ,
p_create_date_to => p_create_date_to ,
p_del_beyond_creation_days => p_del_beyond_creation_days ,
x_tbl_trip_purge_set=> l_tbl_trip_purge_set ,
x_tbl_delivery_purge_set=> l_tbl_delivery_purge_set,
x_tbl_del_details_purge_set => l_tbl_del_detail_purge_set,
x_tbl_del_legs_purge_set=> l_tbl_del_leg_purge_set ,
x_tbl_trip_stops_purge_set=> l_tbl_trip_stop_purge_set,
x_tbl_containers_purge_set => l_tbl_container_purge_set,
x_return_status => l_return_status
);
IF l_debug_on THEN
WSH_DEBUG_SV.log(l_module_name,’L_RETURN_STATUS’,l_return_status);
END IF;
IF (l_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS) THEN
IF G_CONC_REQ = FND_API.G_TRUE THEN
errbuf := ‘Error occurred in WSH_PURGE.GET_PURGE_SET’;
retcode := ‘2’;
END IF;
IF l_debug_on THEN
WSH_DEBUG_SV.pop(l_module_name);
END IF;
RETURN;
END IF;
IF l_debug_on THEN
WSH_DEBUG_SV.logmsg(l_module_name,’Calling program unit WSH_PURGE.GENERATE_PURGE_REPORT’, WSH_DEBUG_SV.C_PROC_LEVEL);
END IF;
–call Generate_Purge_Report
Generate_Purge_Report(p_execution_mode => p_execution_mode ,
p_source_system => p_source_system ,
p_ship_from_org => p_ship_from_org ,
p_order_number_from=> p_order_number_from ,
p_order_number_to => p_order_number_to ,
p_order_type => p_order_type ,
p_ship_date_from => p_ship_date_from ,
p_ship_date_to => p_ship_date_to ,
p_delete_beyond_x_ship_days=> p_delete_beyond_x_ship_days ,
p_purge_intransit_trips=> p_purge_intransit_trips ,
p_delete_empty_records=> p_delete_empty_records ,
p_create_date_from => p_create_date_from ,
p_create_date_to => p_create_date_to ,
p_del_beyond_creation_days => p_del_beyond_creation_days ,
p_sort_per_criteria=> p_sort_per_criteria ,
p_print_detail => p_print_detail ,
p_tbl_trip_purge_set=> l_tbl_trip_purge_set ,
p_tbl_delivery_purge_set=> l_tbl_delivery_purge_set,
p_tbl_container_purge_set=> l_tbl_container_purge_set,
p_count_legs => l_tbl_del_leg_purge_set.COUNT ,
p_count_stops => l_tbl_trip_stop_purge_set.COUNT,
p_count_details => l_tbl_del_detail_purge_set.COUNT,
p_count_containers => l_tbl_container_purge_set.COUNT,
x_return_status=> l_return_status
);
IF l_debug_on THEN
WSH_DEBUG_SV.log(l_module_name,’L_RETURN_STATUS’,l_return_status);
END IF;
IF (l_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS) THEN
IF G_CONC_REQ = FND_API.G_TRUE THEN
errbuf := ‘Error occurred in WSH_PURGE.GENERATE_PURGE_REPORT’;
retcode := ‘2’;
END IF;
IF l_debug_on THEN
WSH_DEBUG_SV.pop(l_module_name);
END IF;
RETURN;
END IF;
IF p_execution_mode = ‘P’ THEN
IF l_debug_on THEN
WSH_DEBUG_SV.logmsg(l_module_name,’Calling program unit WSH_PURGE.PURGE_ENTITIES’, WSH_DEBUG_SV.C_PROC_LEVEL);
END IF;
–call Purge_Entities
Purge_Entities(p_tbl_trip_purge_set => l_tbl_trip_purge_set ,
p_tbl_delivery_purge_set=> l_tbl_delivery_purge_set ,
p_tbl_del_details_purge_set=> l_tbl_del_detail_purge_set ,
p_tbl_del_legs_purge_set=> l_tbl_del_leg_purge_set ,
p_tbl_trip_stops_purge_set=> l_tbl_trip_stop_purge_set ,
p_tbl_containers_purge_set=> l_tbl_container_purge_set ,
x_return_status=> l_return_status
);
IF l_debug_on THEN
WSH_DEBUG_SV.log(l_module_name,’L_RETURN_STATUS’,l_return_status);
END IF;
IF (l_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS) THEN
IF G_CONC_REQ = FND_API.G_TRUE THEN
errbuf := ‘Error occurred in WSH_PURGE.PURGE_ENTITIES’;
retcode := ‘2’;
END IF;
IF l_debug_on THEN
WSH_DEBUG_SV.pop(l_module_name);
END IF;
RETURN;
END IF;
END IF;
l_tbl_trip_purge_set.DELETE;
l_tbl_delivery_purge_set.DELETE;
l_tbl_del_detail_purge_set.DELETE;
l_tbl_del_leg_purge_set.DELETE;
l_tbl_trip_stop_purge_set.DELETE;
l_tbl_container_purge_set.DELETE;
IF l_debug_on THEN
WSH_DEBUG_SV.pop(l_module_name);
END IF;
END Process_Purge;
/*—————————————————————————–
Procedure: Get_Purge_Set
Parameters: p_source_system Only the delivery details belonging to this Source System
would be considered eligible for Purge
p_ship_from_org Only the deliveries belonging to this Ship From Org
would be considered eligible for Purge
p_order_number_from Only the delivery details having source_header_number
greater than Order Number From would be considered eligible for Purge
p_order_number_to Only the delivery details having source_header_number
less than Order Number To would be considered eligible for Purge
p_order_type Only the delivery details belonging to this Order Type
would be considered eligible for Purge
p_ship_date_from Only the deliveries having initial_pickup_date greater
than Ship Date From would be considered eligible for Purge
p_ship_date_to Only the deliveries having initial_pickup_date less than
Ship Date To would be considered eligible for Purge
p_delete_beyond_x_ship_days Only the deliveries having initial_pickup_date greater
than the specified date would be considered eligible for Purge
p_purge_intransit_trips Decides whether to purge In Transit Trips or not
p_delete_empty_records Decides whether to delete empty record or not.
The empty records can be Empty Trips, Orphaned Empty Deliveries,
Delivery with Empty containers, Empty Containers
p_create_date_from Only Empty records having creation_date greater than this
date would be purged
p_create_date_to Only Empty records having creation_date less than this
date would be purged
p_del_beyond_creation_days Only Empty records having creation_date greater than
this date would be purged
x_tbl_trip_purge_set – pl/sql table of trip id’s eligible for purge
x_tbl_delivery_purge_set – pl/sql table of delivery id’s eligible for purge
x_tbl_del_details_purge_set – pl/sql table of delivery detail id’s eligible for purge
x_tbl_del_legs_purge_set – pl/sql table of delivery leg id’s eligible for purge
x_tbl_trip_stops_purge_set – pl/sql table of trip stop id’s eligible for purge
x_tbl_containers_purge_set – pl/sql table of container id’s eligible for purge
x_return_status – Returns WSH_UTIL_CORE.G_RET_STS_SUCCESS if Success
Description: This API gets all the Shipping Data from the view WSH_PURGE_SET_V
and puts it into the plsql tables for respective entities after validating it
with the user given parameters
==============================================================================
Input: Parameters as given in the FDD.
Output: Table of Record Types for Trips, Stops, Legs,
Deliveries, Containers, Details
================================================================================
Logic: i) Build Trip SQL for purge set types:
NON_EMPTY – Complete Shipping Entities
ii) Build Delivery SQL for purge set type:
EMPTYDELS – Orphaned empty deliveries without any details
only Delete Empty Records, creation date from, to and delete beyond
x creation days will be honoured.
iii) Execute the Trip ,Delivery and Container dynamically built SQLs and populate the
Table of record types for trip,delivery and containers.
Add Trip IDs for purge set types :
EMPTYTRIPS – Orphaned Trips without any deliveries assigned to them
iv) For NON_EMPTY purge sets get the deliveries for all
trips and add delivery ids to the purge set for deliveries.
v) For a given trip get all the stops and create a stops purge set.
vi) For a given delivery get all the delivery legs and details and create
a purge set.
vii) From NON_EMPTY get all the container ids(wdd.container_flag=’Y’) and
populate them in container purge set
—————————————————————————–*/
PROCEDURE Get_Purge_Set(p_source_system varchar2,
p_ship_from_org number,
p_order_number_from varchar2,
p_order_number_to varchar2,
p_order_type number,
p_ship_date_from varchar2,
p_ship_date_to varchar2,
p_delete_beyond_x_ship_days number,
p_purge_intransit_trips varchar2,
p_delete_empty_records varchar2,
p_create_date_from varchar2,
p_create_date_to varchar2,
p_del_beyond_creation_days number,
x_tbl_trip_purge_set OUT NOCOPY Trip_ID_Tbl_Type ,
x_tbl_delivery_purge_set OUT NOCOPY Delivery_ID_Tbl_Type,
x_tbl_del_details_purge_set OUT NOCOPY Del_Detail_ID_Tbl_Type,
x_tbl_del_legs_purge_set OUT NOCOPY Del_Leg_ID_Tbl_Type,
x_tbl_trip_stops_purge_set OUT NOCOPY Trip_Stop_ID_Tbl_Type,
x_tbl_containers_purge_set OUT NOCOPY Container_ID_Tbl_Type,
x_return_status OUT NOCOPY VARCHAR2
)IS
l_debug_on BOOLEAN;
l_return_status VARCHAR2(1);
trip_sql VARCHAR2(4000);
delivery_sql VARCHAR2(4000);
empty_trip_sql VARCHAR2(4000);
empty_container_sql VARCHAR2(4000);
–Variable added for bug 12397111
cancel_wdd_sql VARCHAR2(4000);
l_delivery_detail_id Del_Detail_ID_Tbl_Type;
l_source_system VARCHAR2(20);
l_loop_index NUMBER;
i number;
l_trip_id NUMBER;
l_delivery_id NUMBER;
l_stop_id NUMBER;
l_leg_id NUMBER;
l_detail_id NUMBER;
l_container_id NUMBER;
l_container_name VARCHAR2(50); — Added for bug # 18312829
l_container_flag VARCHAR2(1);
l_trip_name VARCHAR2(30);
l_delivery_name VARCHAR2(30);
l_trip_purge_row Trip_ID_Rec_Type;
l_del_purge_row Delivery_ID_Rec_Type;
l_tbl_trip_purge_set Trip_ID_Tbl_Type;
TYPE PurgeCurType IS REF CURSOR;
c_trip_purge_cur PurgeCurType;
c_del_purge_cur PurgeCurType;
c_empty_trip_cur PurgeCurType;
c_empty_containers PurgeCurType;
–Cursor variable added for bug 12397111
c_wdd_purge_cur PurgeCurType;
CURSOR c_dels_for_trip(p_tripid NUMBER) IS
SELECTdistinct wnd.delivery_id, wnd.name
FROMwsh_trips wt,
wsh_trip_stops wts,
wsh_delivery_legs wdl,
wsh_new_deliveries wnd
WHEREwt.trip_id = wts.trip_id
ANDwts.stop_id = wdl.pick_up_stop_id
ANDwdl.delivery_id = wnd.delivery_id
ANDwts.trip_id = p_tripid;
CURSOR c_stops_for_trip(p_tripid NUMBER) IS
SELECTstop_id
FROMwsh_trip_stops
WHEREtrip_id= p_tripid;
CURSOR c_legs_for_del(p_deliveryid NUMBER) IS
SELECTdelivery_leg_id
FROMwsh_delivery_legs
WHEREdelivery_id = p_deliveryid;
–Bug 12397111 : Added union to fetch cancelled delivery lines while purging
CURSOR c_details_for_del(p_deliveryid NUMBER) IS
SELECTwda.delivery_detail_id,
wdd.container_flag,
wdd.container_name — Added container Name for bug # 18312829
FROMwsh_delivery_assignments_v wda,
wsh_delivery_details wdd
WHEREwda.delivery_id = p_deliveryid
ANDwda.delivery_detail_id = wdd.delivery_detail_id
UNION
SELECT wdd_can.delivery_detail_id,
‘N’,
NULL– Added NULL for bug # 18312829
FROM wsh_delivery_assignments_v wda,
wsh_delivery_details wdd,
wsh_delivery_details wdd_can
WHERE wda.delivery_id = p_deliveryid
AND wda.delivery_detail_id = wdd.delivery_detail_id
AND wdd_can.source_line_id = wdd.source_line_id
AND wdd.source_code = ‘OE’
AND wdd_can.source_code = ‘OE’
AND wdd_can.released_status = ‘D’;
–cursor to select empty trips would come from dynamic sql
–cursor to select empty dels would come from dynamic sql
–(based on create date from and to)
/*
–cursor to select orphaned deliveries with only empty containers
CURSOR c_delivery_empty_containers IS
SELECTwnd.delivery_id
–wda.delivery_detail_id
FROMwsh_new_deliveries wnd,
wsh_delivery_assignments_v wda,
wsh_delivery_legs wdl
WHEREwnd.delivery_id = wda.delivery_id
ANDwnd.delivery_id = wdl.delivery_id(+)
ANDwdl.delivery_leg_id IS NULL
ANDNOT EXISTS (
SELECT1
FROMwsh_delivery_details wdd,
wsh_delivery_assignments_v wda1
WHEREwdd.delivery_Detail_id = wda1.delivery_detail_id
ANDwda1.delivery_id = wnd.delivery_id
ANDwdd.container_flag = ‘N’
) ;
*/
–cursor to select orphaned empty containers
/* CURSOR c_empty_containers IS
SELECT
wdd.delivery_detail_id,
‘EMPTYLPNS’
–wdd.container_name dd_lpn_number,
FROM
wsh_delivery_assignments_v wda,
wsh_delivery_details wdd
WHERE
wda.delivery_detail_id = wdd.delivery_detail_id AND
wdd.container_flag = ‘Y’AND
wda.delivery_id IS NULL AND
NOT EXISTS (
SELECT 1
FROM
wsh_delivery_assignments_v wda2
WHERE
wda2.parent_delivery_detail_id = wda.delivery_detail_id
) ;
*/
l_module_name CONSTANT VARCHAR2(100) := ‘wsh.plsql.’ || G_PKG_NAME || ‘.’ || ‘GET_PURGE_SET’;
BEGIN
— Debug Statements
—
l_debug_on := WSH_DEBUG_INTERFACE.g_debug;
—
IF l_debug_on IS NULL THEN
l_debug_on := WSH_DEBUG_SV.is_debug_enabled;
END IF;
IF l_debug_on THEN
WSH_DEBUG_SV.push(l_module_name);
WSH_DEBUG_SV.log(l_module_name,’P_SOURCE_SYSTEM’,p_source_system);
WSH_DEBUG_SV.log(l_module_name,’P_SHIP_FROM_ORG’,p_ship_from_org);
WSH_DEBUG_SV.log(l_module_name,’P_ORDER_NUMBER_FROM’,p_order_number_from);
WSH_DEBUG_SV.log(l_module_name,’P_ORDER_NUMBER_To’,p_order_number_to);
WSH_DEBUG_SV.log(l_module_name,’P_ORDER_TYPE’,p_order_type);
WSH_DEBUG_SV.log(l_module_name,’P_SHIP_DATE_FROM’,p_ship_date_from);
WSH_DEBUG_SV.log(l_module_name,’P_SHIP_DATE_TO’,p_ship_date_to);
WSH_DEBUG_SV.log(l_module_name,’P_DELETE_BEYOND_X_SHIP_DAYS’,p_delete_beyond_x_ship_days);
WSH_DEBUG_SV.log(l_module_name,’P_PURGE_INTRANSIT_TRIPS’,p_purge_intransit_trips);
WSH_DEBUG_SV.log(l_module_name,’P_DELETE_EMPTY_Records’,p_delete_empty_records);
WSH_DEBUG_SV.log(l_module_name,’P_CREATE_DATE_FROM’,p_create_date_from);
WSH_DEBUG_SV.log(l_module_name,’P_CREATE_DATE_TO’,p_create_date_to);
WSH_DEBUG_SV.log(l_module_name,’P_DEL_BEYOND_CREATION_DAYS’,p_del_beyond_creation_days);
END IF;
x_return_status:=WSH_UTIL_CORE.G_RET_STS_SUCCESS;
–construct trip_sql
–modifed sql for bug 12615666
— Perf. bug 19011746
trip_sql := ‘WITH trip_inner_query AS
(SELECT /*+ opt_param(”_optimizer_cost_based_transformation”,”off”) opt_param(”_optimizer_use_feedback”,”false”) */
inner.trip_id trip_id,
COUNT ( inner.dd_id ) dd_cnt
FROM
wsh_purge_set_v inner ‘;
–check whether FTE is installed
IF (wsh_util_core.fte_is_installed=’Y’) THEN
trip_sql := trip_sql || ‘,fte_invoice_headers fih ‘ ;
END IF;
trip_sql :=trip_sql ||’WHERE ‘;
IF (p_ship_from_org IS NOT NULL) THEN
trip_sql := trip_sql || ‘
inner.del_ship_from_org = ‘
|| p_ship_from_org || ‘ AND ‘ ;
END IF;
–added TRUNC function for bug 12605679
IF (p_ship_date_from IS NOT NULL) THEN
/* trip_sql := trip_sql ||
‘ TRUNC(inner.del_pickup_date) BETWEEN ”’ || FND_DATE.CANONICAL_TO_DATE(p_ship_date_from) ||
”’ AND ”’ || FND_DATE.CANONICAL_TO_DATE(p_ship_date_to) || ””; */
/* For Bug 31726468, Removed TRUNC and replaced p_ship_date_to with (p_ship_date_to+0.99999) */
trip_sql := trip_sql ||
‘ inner.del_pickup_date BETWEEN ”’ || FND_DATE.CANONICAL_TO_DATE(p_ship_date_from) ||
”’ AND (TO_DATE(”’ || FND_DATE.CANONICAL_TO_DATE(p_ship_date_to) || ”’)+0.99999)’;
–Bug 22107402: Handled NULL for p_delete_beyond_x_ship_days
ELSIF ( p_delete_beyond_x_ship_days IS NOT NULL ) THEN
trip_sql := trip_sql ||
‘ inner.del_pickup_date < ”’
|| to_date(SYSDATE – p_delete_beyond_x_ship_days,’DD-MM-YYYY’) ||”” ;
–Bug 22107402: Added ELSE to add WHERE clause 1 = 1 to avoid error ORA-00936 while executing DYNAMIC query
ELSE
trip_sql := trip_sql || ‘ 1 = 1 ‘;
END IF;
–RTV changes
IF p_source_system IS NULL THEN
RETURN;
END IF;
IF p_source_system = ‘WSH’ THEN
trip_sql := trip_sql || ‘ AND inner.dd_source_code = ”WSH” ‘ ;
ELSIF p_source_system <> ‘ALL’ THEN
trip_sql := trip_sql || ‘ AND inner.dd_source_code IN (”’||p_source_system||”’,”WSH”) ‘ ;
END IF;
/*
IF (p_source_system = ‘ALL’) THEN
trip_sql := trip_sql || ‘
AND inner.dd_source_code IN (”OE”,”PO”,”WSH”) ‘ ;
ELSIF (p_source_system = ‘OE’) THEN
trip_sql := trip_sql || ‘
AND inner.dd_source_code IN (”OE”,”WSH”) ‘ ;
ELSIF (p_source_system = ‘PO’) THEN
trip_sql := trip_sql || ‘
AND inner.dd_source_code IN (”PO”,”WSH”) ‘ ;
ELSIF (p_source_system = ‘WSH’) THEN
trip_sql := trip_sql || ‘
AND inner.dd_source_code = ”WSH” ‘ ;
END IF;
*/
–RTV changes
–check to take order type
IF (p_order_type IS NOT NULL) THEN
trip_sql := trip_sql ||
‘ AND inner.dd_source_header_type_id = ‘
|| p_order_type ;
END IF; –end check to take order type
–check to take order number range
IF (p_order_number_from IS NOT NULL) THEN
trip_sql := trip_sql ||
‘ AND inner.dd_source_header_number BETWEEN ”’
|| p_order_number_from ||
”’ AND ”’ || p_order_number_to || ”’ ‘ ;
END IF;–end check to take order number range
–RTV changes Exclude the OKE lines since they are not eligible to be purged and we cannot purge it
trip_sql := trip_sql || ‘ AND inner.dd_source_code <> ”OKE” ‘ ;
–check for deleting Intransit Trips
IF (p_purge_intransit_trips = ‘Y’) THEN
trip_sql := trip_sql ||
‘ AND inner.trip_status IN (”CL”,”IT”) ‘ ;
ELSE
trip_sql := trip_sql ||
‘ AND inner.trip_status IN (”CL”) ‘ ;
END IF;–end check for deleting Intransit Trips
–RTV changes
trip_sql := trip_sql ||
‘ AND DECODE(inner.dd_source_code,
”OE”,(DECODE((SELECT count(oe.order_number)
FROM oe_order_headers_all oe
WHERE oe.header_id= inner.dd_source_header_id),0,”FALSE”,”TRUE”)),
”PO”,( DECODE((SELECT count(po.po_header_id)
FROM po_headers_all po
WHERE po.po_header_id= inner.dd_source_header_id),0,”FALSE”,”TRUE”)),
”RTV”,(Decode(inner.dd_po_shipment_line_id,NULL,
decode((select count(mmt.transaction_id)
from mtl_material_transactions mmt
WHERE mmt.picking_line_id = inner.dd_id
),0,”FALSE”,”TRUE”
),
decode((select count(rt.interface_source_line_id)
from rcv_transactions rt
WHERE rt.interface_source_line_id= inner.dd_id
),0,”FALSE”,”TRUE”
)
)
),
”FALSE”) = ”FALSE”
‘;
–check whether FTE is installed
IF (wsh_util_core.fte_is_installed=’Y’) THEN
trip_sql := trip_sql ||
‘ AND fih.bol(+) = inner.bol
AND DECODE(fih.bill_status,
”PAID”, ”Y”,
”OBSOLETE” ,”Y”,
NULL, ”Y”,
”N”) = ”Y”
‘;
END IF;–end check whether FTE is installed
–end construct trip_sql
— Bug 10184411
— The following check is being added to ensure no un-shipped or un-interfaced
— delivery lines are being purged.This check is mandatory for TPW shipments.
— Don’t prefer to use a sub-query here.But we dont have these columns in the purge view.
— We can add these filtering columns to the view wsh_purge_set_v and scan directly and this sub-query can be flushed out.
trip_sql := trip_sql ||
‘ AND NOT EXISTS
( SELECT 1 FROM
wsh_delivery_details dd
WHERE
dd.delivery_detail_id = inner.dd_id AND
(
Nvl(dd.released_status,”N”) NOT IN (”C”,”L”) OR
dd.oe_interfaced_flag IN (”N”,”P”) OR
dd.inv_interfaced_flag IN (”N”,”P”)
)
) ‘;
trip_sql := trip_sql ||
‘GROUP BY inner.trip_id)’ ;
trip_sql := trip_sql ||’ SELECT outer.trip_id , outer.trip_name , ”NON_EMPTY” purge_set_type
FROM wsh_purge_set_v outer ,trip_inner_query
where outer.trip_id = trip_inner_query.trip_id
GROUP BY outer.trip_id , outer.trip_name
HAVING count ( outer.dd_id ) = (select dd_cnt from trip_inner_query where trip_id = outer.trip_id)’;
–end of trip_sql construct
IF l_debug_on THEN
WSH_DEBUG_SV.log(l_module_name,’trip_sql ==>’,trip_sql);
END IF;
–check whether to delete empty records
IF (p_delete_empty_records =’Y’) THEN
–construct delivery_sql for empty deliveries
delivery_sql := ‘SELECT
wnd.delivery_id,wnd.name
FROM
wsh_new_deliveries wnd,
wsh_delivery_assignments_v wda,
wsh_delivery_legs wdl
WHERE
wda.delivery_id(+) = wnd.delivery_id AND
wnd.delivery_id = wdl.delivery_id(+) AND
wdl.delivery_leg_id IS NULL AND
wda.delivery_detail_id IS NULL ‘ ;
–check for taking creation dates
–added TRUNC function for bug 12605679
IF (p_create_date_from IS NOT NULL) THEN
delivery_sql := delivery_sql || ‘
AND TRUNC(wnd.creation_date)
BETWEEN ”’|| FND_DATE.CANONICAL_TO_DATE(p_create_date_from) || ”’
AND ”’|| FND_DATE.CANONICAL_TO_DATE(p_create_date_to) || ”” ;
ELSE
delivery_sql := delivery_sql || ‘
AND wnd.creation_date < ”’
|| to_date(SYSDATE – p_del_beyond_creation_days,’DD-MM-YYYY’) ||”” ;
END IF; –end check for taking creation dates
–Bugfix 14578425 Start
–check for organization
IF (p_ship_from_org IS NOT NULL) THEN
delivery_sql := delivery_sql || ‘
AND wnd.organization_id =’|| p_ship_from_org ;
END IF; –end check for organization
–Bugfix 14578425 End
delivery_sql := delivery_sql || ‘
ORDER BY wnd.name ‘ ;
–end construct delivery_sql
–construct SQL for empty trips
empty_trip_sql := ‘SELECTdistinct wt.trip_id, wt.name
FROMwsh_trips wt,
wsh_trip_stops wts,
wsh_delivery_legs wdl1,
wsh_delivery_legs wdl2
WHERE’;
–check for taking creation dates
–added TRUNC function for bug 12605679
IF (p_create_date_from IS NOT NULL) THEN
empty_trip_sql := empty_trip_sql || ‘
TRUNC(wt.creation_date)
BETWEEN ”’|| FND_DATE.CANONICAL_TO_DATE(p_create_date_from) || ”’
AND ”’|| FND_DATE.CANONICAL_TO_DATE(p_create_date_to) || ”” ;
ELSE
empty_trip_sql := empty_trip_sql || ‘
wt.creation_date < ”’
|| to_date(SYSDATE – p_del_beyond_creation_days,’DD-MM-YYYY’) ||”” ;
END IF; –end check for taking creation dates
empty_trip_sql := empty_trip_sql || ‘
ANDwt.trip_id = wts.trip_id(+)
ANDwdl1.pick_up_stop_id(+) = wts.stop_id
ANDwdl2.drop_off_stop_id(+) = wts.stop_id
ANDwdl1.delivery_leg_id IS NULL
ANDwdl2.delivery_leg_id IS NULL
ANDNOT EXISTS
(SELECT1
FROMwsh_trip_stops wtss,
wsh_delivery_legs wdl1s
WHEREwtss.trip_id = wt.trip_id
ANDwdl1s.pick_up_stop_id = wtss.stop_id
)’ ;
–end contructing SQL for empty trips
–construct SQL for empty containers
empty_container_sql := ‘SELECT wdd.delivery_detail_id,
”EMPTYLPNS”,
wdd.container_name dd_lpn_number– Uncommented for bug # 18312829
FROM
wsh_delivery_assignments_v wda,
wsh_delivery_details wdd
WHEREwda.delivery_detail_id = wdd.delivery_detail_id
ANDwdd.container_flag = ”Y”
ANDwda.delivery_id IS NULL ‘;
–check for taking creation dates
–added TRUNC function for bug 12605679
IF (p_create_date_from IS NOT NULL) THEN
empty_container_sql := empty_container_sql || ‘
AND TRUNC(wdd.creation_date)
BETWEEN ”’|| FND_DATE.CANONICAL_TO_DATE(p_create_date_from) || ”’
AND ”’|| FND_DATE.CANONICAL_TO_DATE(p_create_date_to) || ”” ;
ELSE
empty_container_sql := empty_container_sql || ‘
AND wdd.creation_date < ”’
|| to_date(SYSDATE – p_del_beyond_creation_days,’DD-MM-YYYY’) ||”” ;
END IF; –end check for taking creation dates
–Bugfix 16825243 Start
–check for organization
IF (p_ship_from_org IS NOT NULL) THEN
empty_container_sql := empty_container_sql || ‘
AND wdd.organization_id =’|| p_ship_from_org ;
END IF; –end check for organization
–Bugfix 16825243 End
empty_container_sql := empty_container_sql || ‘
ANDNOT EXISTS (
SELECT 1
FROM
wsh_delivery_assignments_v wda2
WHERE
wda2.parent_delivery_detail_id = wda.delivery_detail_id
) ‘ ;
END IF; –end check whether to delete empty records
–fetch trip ids for non empty trips and insert into PL/SQL table
OPEN c_trip_purge_cur FOR trip_sql;
FETCH c_trip_purge_cur BULK COLLECT into x_tbl_trip_purge_set;
CLOSE c_trip_purge_cur;
IF x_tbl_trip_purge_set.COUNT > 0 THEN –check for number of records in plsql table
IF l_debug_on THEN
WSH_DEBUG_SV.logmsg(l_module_name,’Calling program unit WSH_PURGE.VALIDATE_TRIPS’, WSH_DEBUG_SV.C_PROC_LEVEL);
END IF;
–Check whether LPNs belonging to the trips are eligible to purge from WMS
Validate_Trips(p_tbl_trip_purge_set=> x_tbl_trip_purge_set,
x_tbl_trip_purge_set=> l_tbl_trip_purge_set,
x_return_status=> l_return_status );
x_tbl_trip_purge_set := l_tbl_trip_purge_set;
IF l_debug_on THEN
WSH_DEBUG_SV.log(l_module_name,’L_RETURN_STATUS’,l_return_status);
END IF;
IF (l_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS) THEN
x_return_status := l_return_status;
IF l_debug_on THEN
WSH_DEBUG_SV.pop(l_module_name);
END IF;
RETURN;
END IF;
END IF;
–check whether to fetch empty records
IF (p_delete_empty_records =’Y’) THEN
–fetch trip ids for empty trips and insert into PL/SQL table
OPEN c_empty_trip_cur FOR empty_trip_sql;
LOOP
FETCH c_empty_trip_cur into l_trip_id,l_trip_name;
EXIT WHEN c_empty_trip_cur%NOTFOUND;
x_tbl_trip_purge_set(x_tbl_trip_purge_set.COUNT+1).trip_id := l_trip_id;
x_tbl_trip_purge_set(x_tbl_trip_purge_set.COUNT).trip_name := l_trip_name;
x_tbl_trip_purge_set(x_tbl_trip_purge_set.COUNT).purge_set_type := ‘EMPTYTRIPS’;
END LOOP;
CLOSE c_empty_trip_cur;
–fetch delivery ids for empty deliveries
OPEN c_del_purge_cur FOR delivery_sql;
LOOP
FETCH c_del_purge_cur into l_delivery_id,l_delivery_name;
EXIT WHEN c_del_purge_cur%NOTFOUND;
x_tbl_delivery_purge_set(x_tbl_delivery_purge_set.COUNT+1).delivery_id := l_delivery_id;
x_tbl_delivery_purge_set(x_tbl_delivery_purge_set.COUNT).delivery_name := l_delivery_name;
x_tbl_delivery_purge_set(x_tbl_delivery_purge_set.COUNT).purge_set_type := ‘EMPTYDELS’;
END LOOP;
CLOSE c_del_purge_cur;
–fetch delivery ids for Deliveries having empty containers only
/*OPEN c_delivery_empty_containers;
LOOP
FETCH c_delivery_empty_containers into l_delivery_id;
EXIT WHEN c_delivery_empty_containers%NOTFOUND;
x_tbl_delivery_purge_set(x_tbl_delivery_purge_set.COUNT+1).delivery_id := l_delivery_id;
x_tbl_delivery_purge_set(x_tbl_delivery_purge_set.COUNT).purge_set_type := ‘DEL_EMPTYLPNS’;
END LOOP;
CLOSE c_delivery_empty_containers;
*/
–fetch container id for orphaned empty containers
OPEN c_empty_containers FOR empty_container_sql;
FETCH c_empty_containers BULK COLLECT INTO x_tbl_containers_purge_set;
CLOSE c_empty_containers;
END IF; –end check whether to fetch empty records
–add the deliveries belonging to trips from the table x_tbl_trip_purge_set
–to the table x_delivery_tbl_trip_set
IF x_tbl_trip_purge_set.COUNT > 0 THEN
FOR l_loop_index in x_tbl_trip_purge_set.FIRST .. x_tbl_trip_purge_set.LAST
LOOP
l_trip_id := x_tbl_trip_purge_set(l_loop_index).trip_id;
IF (x_tbl_trip_purge_set(l_loop_index).purge_set_type = ‘NON_EMPTY’) THEN
OPEN c_dels_for_trip(l_trip_id);
LOOP
FETCH c_dels_for_trip into l_delivery_id,l_delivery_name;
EXIT WHEN c_dels_for_trip%NOTFOUND;
–x_tbl_delivery_purge_set.EXTEND;
x_tbl_delivery_purge_set(x_tbl_delivery_purge_set.COUNT+1).delivery_id := l_delivery_id;
x_tbl_delivery_purge_set(x_tbl_delivery_purge_set.COUNT).delivery_name := l_delivery_name;
x_tbl_delivery_purge_set(x_tbl_delivery_purge_set.COUNT).purge_set_type := ‘NON_EMPTY’;
END LOOP;
CLOSE c_dels_for_trip;
END IF;
–fetch trip stops for the trips
OPEN c_stops_for_trip(l_trip_id);
LOOP
FETCH c_stops_for_trip into l_stop_id;
EXIT WHEN c_stops_for_trip%NOTFOUND;
x_tbl_trip_stops_purge_set(x_tbl_trip_stops_purge_set.COUNT+1).stop_id := l_stop_id;
END LOOP;
CLOSE c_stops_for_trip;
END LOOP; — end adding delivery ids to plsql table
END IF;
–fetch delivery legs and delivery details for Delivery Ids into PL/SQL table
IF x_tbl_delivery_purge_set.COUNT > 0 THEN
FOR l_loop_index in x_tbl_delivery_purge_set.FIRST .. x_tbl_delivery_purge_set.LAST
LOOP
l_delivery_id := x_tbl_delivery_purge_set(l_loop_index).delivery_id;
–fetch delivery legs
IF (x_tbl_delivery_purge_set(l_loop_index).purge_set_type = ‘NON_EMPTY’) THEN
OPEN c_legs_for_del(l_delivery_id);
LOOP
FETCH c_legs_for_del INTO l_leg_id;
EXIT WHEN c_legs_for_del%NOTFOUND;
x_tbl_del_legs_purge_set(x_tbl_del_legs_purge_set.COUNT+1).delivery_leg_id := l_leg_id;
END LOOP;
CLOSE c_legs_for_del;
END IF;
–fetch delivery details and containers for non empty deliveries
IF x_tbl_delivery_purge_set(l_loop_index).purge_set_type = ‘NON_EMPTY’ THEN
OPEN c_details_for_del(l_delivery_id);
LOOP
FETCH c_details_for_del INTO l_detail_id,l_container_flag,l_container_name;– Added container Name for bug # 18312829
EXIT WHEN c_details_for_del%NOTFOUND;
–l_container_flag = ‘Y’ would be Container
IF l_container_flag = ‘N’ THEN — Delivery Detail
x_tbl_del_details_purge_set(x_tbl_del_details_purge_set.COUNT+1).delivery_detail_id := l_detail_id;
INSERT INTO wsh_tmp (id) VALUES (l_detail_id);– BUG 33789139
ELSE — Container
x_tbl_containers_purge_set(x_tbl_containers_purge_set.COUNT+1).container_id := l_detail_id;
x_tbl_containers_purge_set(x_tbl_containers_purge_set.COUNT).purge_set_type := ‘NON_EMPTY’;
–Bug 19675985 container name was getting inserted in different record count+1, modified to count
x_tbl_containers_purge_set(x_tbl_containers_purge_set.COUNT).container_name := l_container_name;– Added for bug # 18312829
END IF;
END LOOP;
CLOSE c_details_for_del;
END IF;
–fetch empty containers for deliveries
/*IF x_tbl_delivery_purge_set(l_loop_index).purge_set_type = ‘DEL_EMPTYLPNS’ THEN
OPEN c_details_for_del(l_delivery_id);
LOOP
FETCH c_details_for_del INTO l_detail_id,l_container_flag;
EXIT WHEN c_details_for_del%NOTFOUND;
x_tbl_containers_purge_set(x_tbl_containers_purge_set.COUNT+1).container_id := l_detail_id;
x_tbl_containers_purge_set(x_tbl_containers_purge_set.COUNT).purge_set_type := ‘EMPTYLPNS’;
END LOOP;
CLOSE c_details_for_del;
END IF; */
END LOOP;
END IF;
IF (p_delete_empty_records =’Y’) THEN — Bug 18018957
–Bug 12397111 – Start
cancel_wdd_sql := ‘SELECT wdd.delivery_detail_id
FROM wsh_delivery_details wdd
WHERE wdd.source_code = ”OE”
AND wdd.released_status = ”D”
AND NOT EXISTS
( SELECT 1
FROM wsh_delivery_details det
WHERE det.source_code = ”OE”
AND det.source_line_id = wdd.source_line_id
AND det.released_status <> ”D” )
AND NOT EXISTS
( SELECT 1
FROM oe_order_headers_all oeh
WHERE oeh.header_id = wdd.source_header_id ) ‘;
–check for taking creation dates
IF (p_create_date_from IS NOT NULL) THEN
cancel_wdd_sql := cancel_wdd_sql || ‘
AND TRUNC(wdd.creation_date)
BETWEEN ”’|| FND_DATE.CANONICAL_TO_DATE(p_create_date_from) || ”’
AND ”’|| FND_DATE.CANONICAL_TO_DATE(p_create_date_to) || ”” ;
ELSE
cancel_wdd_sql := cancel_wdd_sql || ‘
AND wdd.creation_date < ”’
|| to_date(SYSDATE – p_del_beyond_creation_days,’DD-MM-YYYY’) ||”” ;
END IF; –end check for taking creation dates
IF l_debug_on THEN
WSH_DEBUG_SV.log(l_module_name,’cancel_wdd_sql’, cancel_wdd_sql);
END IF;
–fetch orphan canceled delivery detail ids
OPEN c_wdd_purge_cur FOR cancel_wdd_sql;
LOOP
FETCH c_wdd_purge_cur BULK COLLECT INTO l_delivery_detail_id LIMIT 5000;
EXIT WHEN l_delivery_detail_id.COUNT<=0;
FOR l_count in l_delivery_detail_id.FIRST..l_delivery_detail_id.LAST
LOOP
x_tbl_del_details_purge_set(x_tbl_del_details_purge_set.COUNT+1).delivery_detail_id := l_delivery_detail_id(l_count).delivery_detail_id;
INSERT INTO wsh_tmp (id) VALUES (l_delivery_detail_id(l_count).delivery_detail_id);–BUG 33789139
END LOOP;
END LOOP;
CLOSE c_wdd_purge_cur;
–Bug 12397111 – Ends
END IF;
IF l_debug_on THEN
WSH_DEBUG_SV.pop(l_module_name);
END IF;
EXCEPTION
WHEN OTHERS THEN
x_return_status := WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR ;
IF l_debug_on THEN
WSH_DEBUG_SV.logmsg(l_module_name,’Unexpected error has occured. Oracle error message is ‘||
SQLERRM,WSH_DEBUG_SV.C_UNEXPEC_ERR_LEVEL);
WSH_DEBUG_SV.pop(l_module_name,’EXCEPTION:OTHERS’);
END IF;
END Get_Purge_Set;
/*—————————————————————————–
Procedure: Purge_Entities
Parameters: p_tbl_trip_purge_set – pl/sql table of trip id’s eligible for purge
p_tbl_delivery_purge_set – pl/sql table of delivery id’s eligible for purge
p_tbl_del_details_purge_set – pl/sql table of delivery detail id’s eligible for purge
p_tbl_del_legs_purge_set – pl/sql table of delivery leg id’s eligible for purge
p_tbl_trip_stops_purge_set – pl/sql table of trip stop id’s eligible for purge
p_tbl_containers_purge_set pl/sql – table of container id’s eligible for purge
x_return_status – Returns WSH_UTIL_CORE.G_RET_STS_SUCCESS if Success
Description: This API calls the individual APIs to delete the data in
Shipping and Transportation tables
=============================================================================
Input: Table of Record Types for Trips, Stops, Legs, Deliveries, Containers, Details
Output: Return Status – success or failure
==============================================================================
Logic: i) Call Purge_Delivery_Details
ii) Call Purge_Containers
iii) Call Purge_Delivery_Legs
iv) Call Purge_Trip_Stops
v) Call Purge_Deliveries
vi) Call Purge_Trips
—————————————————————————–*/
PROCEDURE Purge_Entities( p_tbl_trip_purge_set Trip_ID_Tbl_Type ,
p_tbl_delivery_purge_set Delivery_ID_Tbl_Type,
p_tbl_del_details_purge_set Del_Detail_ID_Tbl_Type,
p_tbl_del_legs_purge_set Del_Leg_ID_Tbl_Type,
p_tbl_trip_stops_purge_set Trip_Stop_ID_Tbl_Type,
p_tbl_containers_purge_set Container_ID_Tbl_Type,
x_return_status OUT NOCOPY VARCHAR2
)IS
l_debug_on BOOLEAN;
l_return_status VARCHAR2(1);
l_module_name CONSTANT VARCHAR2(100) := ‘wsh.plsql.’ || G_PKG_NAME || ‘.’ || ‘PURGE_ENTITIES’;
BEGIN
— Debug Statements
—
l_debug_on := WSH_DEBUG_INTERFACE.g_debug;
—
IF l_debug_on IS NULL THEN
l_debug_on := WSH_DEBUG_SV.is_debug_enabled;
END IF;
IF l_debug_on THEN
WSH_DEBUG_SV.push(l_module_name);
END IF;
x_return_status := WSH_UTIL_CORE.G_RET_STS_SUCCESS;
IF p_tbl_del_details_purge_set.COUNT > 0 THEN
IF l_debug_on THEN
WSH_DEBUG_SV.logmsg(l_module_name,’Calling program unit WSH_PURGE.PURGE_DELIVERY_DETAILS’, WSH_DEBUG_SV.C_PROC_LEVEL);
END IF;
–Purge Delivery Details
Purge_Delivery_Details(p_tbl_del_detail_purge_set=> p_tbl_del_details_purge_set,
x_return_status=> l_return_status);
IF l_debug_on THEN
WSH_DEBUG_SV.log(l_module_name,’L_RETURN_STATUS’,l_return_status);
END IF;
IF (l_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS) THEN
x_return_status := l_return_status;
IF l_debug_on THEN
WSH_DEBUG_SV.pop(l_module_name);
END IF;
RETURN;
END IF;
END IF;
IF p_tbl_containers_purge_set.COUNT > 0 THEN
IF l_debug_on THEN
WSH_DEBUG_SV.logmsg(l_module_name,’Calling program unit WSH_PURGE.PURGE_CONTAINERS’, WSH_DEBUG_SV.C_PROC_LEVEL);
END IF;
–Purge Containers
Purge_Containers(p_tbl_containers_purge_set => p_tbl_containers_purge_set,
x_return_status => l_return_status);
IF l_debug_on THEN
WSH_DEBUG_SV.log(l_module_name,’L_RETURN_STATUS’,l_return_status);
END IF;
IF (l_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS) THEN
x_return_status := l_return_status;
IF l_debug_on THEN
WSH_DEBUG_SV.pop(l_module_name);
END IF;
RETURN;
END IF;
END IF;
IF p_tbl_del_legs_purge_set.COUNT > 0 THEN
IF l_debug_on THEN
WSH_DEBUG_SV.logmsg(l_module_name,’Calling program unit WSH_PURGE.PURGE_DELIVERY_LEGS’, WSH_DEBUG_SV.C_PROC_LEVEL);
END IF;
–Purge Delivery Legs
Purge_Delivery_Legs(p_tbl_del_leg_purge_set=> p_tbl_del_legs_purge_set,
x_return_status=> l_return_status);
IF l_debug_on THEN
WSH_DEBUG_SV.log(l_module_name,’L_RETURN_STATUS’,l_return_status);
END IF;
IF (l_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS) THEN
x_return_status := l_return_status;
IF l_debug_on THEN
WSH_DEBUG_SV.pop(l_module_name);
END IF;
RETURN;
END IF;
END IF;
IF p_tbl_trip_stops_purge_set.COUNT > 0 THEN
IF l_debug_on THEN
WSH_DEBUG_SV.logmsg(l_module_name,’Calling program unit WSH_PURGE.PURGE_TRIP_STOPS’, WSH_DEBUG_SV.C_PROC_LEVEL);
END IF;
–Purge Trip Stops
Purge_Trip_Stops(p_tbl_trip_stop_purge_set=> p_tbl_trip_stops_purge_set,
x_return_status=> l_return_status);
IF l_debug_on THEN
WSH_DEBUG_SV.log(l_module_name,’L_RETURN_STATUS’,l_return_status);
END IF;
IF (l_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS) THEN
x_return_status := l_return_status;
IF l_debug_on THEN
WSH_DEBUG_SV.pop(l_module_name);
END IF;
RETURN;
END IF;
END IF;
IF (p_tbl_delivery_purge_set.COUNT > 0 OR p_tbl_trip_purge_set.COUNT > 0) THEN
IF l_debug_on THEN
WSH_DEBUG_SV.logmsg(l_module_name,’Calling program unit WSH_PURGE.PURGE_WORKFLOW’, WSH_DEBUG_SV.C_PROC_LEVEL);
END IF;
–Purge workflows related to Trips and Deliveries
Purge_Workflow(p_tbl_trip_purge_set=> p_tbl_trip_purge_set,
p_tbl_delivery_purge_set=> p_tbl_delivery_purge_set,
x_return_status=> l_return_status);
IF (l_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS) THEN
x_return_status := l_return_status;
IF l_debug_on THEN
WSH_DEBUG_SV.pop(l_module_name);
END IF;
RETURN;
END IF;
END IF;
IF p_tbl_delivery_purge_set.COUNT > 0 THEN
IF l_debug_on THEN
WSH_DEBUG_SV.logmsg(l_module_name,’Calling program unit WSH_PURGE.PURGE_DELIVERIES’, WSH_DEBUG_SV.C_PROC_LEVEL);
END IF;
–Purge Deliveries
Purge_Deliveries(p_tbl_delivery_purge_set=> p_tbl_delivery_purge_set,
x_return_status=> l_return_status);
IF l_debug_on THEN
WSH_DEBUG_SV.log(l_module_name,’L_RETURN_STATUS’,l_return_status);
END IF;
IF (l_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS) THEN
x_return_status := l_return_status;
IF l_debug_on THEN
WSH_DEBUG_SV.pop(l_module_name);
END IF;
RETURN;
END IF;
END IF;
IF p_tbl_trip_purge_set.COUNT > 0 THEN
IF l_debug_on THEN
WSH_DEBUG_SV.logmsg(l_module_name,’Calling program unit WSH_PURGE.PURGE_TRIPS’, WSH_DEBUG_SV.C_PROC_LEVEL);
END IF;
–Purge Trips
Purge_Trips(p_tbl_trip_purge_set=> p_tbl_trip_purge_set,
x_return_status=> l_return_status);
IF l_debug_on THEN
WSH_DEBUG_SV.log(l_module_name,’L_RETURN_STATUS’,l_return_status);
END IF;
IF (l_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS) THEN
x_return_status := l_return_status;
IF l_debug_on THEN
WSH_DEBUG_SV.pop(l_module_name);
END IF;
RETURN;
END IF;
END IF;
IF l_debug_on THEN
WSH_DEBUG_SV.pop(l_module_name);
END IF;
EXCEPTION
WHEN OTHERS THEN
x_return_status := WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR ;
IF l_debug_on THEN
WSH_DEBUG_SV.logmsg(l_module_name,’Unexpected error has occured. Oracle error message is ‘||
SQLERRM,WSH_DEBUG_SV.C_UNEXPEC_ERR_LEVEL);
WSH_DEBUG_SV.pop(l_module_name,’EXCEPTION:OTHERS’);
END IF;
END Purge_Entities;
/*—————————————————————————–
Procedure: Purge_Trips
Parameters: p_tbl_trip_purge_set pl/sql table of trip id’s eligible for purge
x_return_status – Returns WSH_UTIL_CORE.G_RET_STS_SUCCESS if Success
Description: This API delete the data in Shipping and Transportation
related to trip
==============================================================================
Input: Table of Record Types for Trips
Output: Return Status – success or failure
==============================================================================
Logic: i) Delete records from the following tables:
WSH_EXCEPTIONS, WSH_FREIGHT_COSTS, WSH_DOCUMENT_INSTANCES,WSH_TRIPS
—————————————————————————–*/
PROCEDURE Purge_Trips( p_tbl_trip_purge_set Trip_ID_Tbl_Type,
x_return_status OUT NOCOPY VARCHAR2
)IS
l_debug_onBOOLEAN;
l_loop_indexNUMBER;
l_trip_idNUMBER;
l_module_name CONSTANT VARCHAR2(100) := ‘wsh.plsql.’ || G_PKG_NAME || ‘.’ || ‘PURGE_TRIPS’;
l_attachment_exists VARCHAR2(1):=’N’; –Bug 17867024
BEGIN
— Debug Statements
—
l_debug_on := WSH_DEBUG_INTERFACE.g_debug;
—
IF l_debug_on IS NULL THEN
l_debug_on := WSH_DEBUG_SV.is_debug_enabled;
END IF;
IF l_debug_on THEN
WSH_DEBUG_SV.push(l_module_name);
END IF;
x_return_status := WSH_UTIL_CORE.G_RET_STS_SUCCESS;
FOR l_loop_index in p_tbl_trip_purge_set.FIRST .. p_tbl_trip_purge_set.LAST
LOOP
l_trip_id := p_tbl_trip_purge_set(l_loop_index).trip_id;
DELETE
FROMwsh_exceptions
WHEREtrip_id = l_trip_id;
IF SQL%FOUND THEN
IF l_debug_on THEN
WSH_DEBUG_SV.logmsg(l_module_name,’Deleted from wsh_exceptions: TRIP_ID=’ || l_trip_id, WSH_DEBUG_SV.C_PROC_LEVEL);
END IF;
END IF;
DELETE
FROMwsh_freight_costs
WHEREtrip_id = l_trip_id;
IF SQL%FOUND THEN
IF l_debug_on THEN
WSH_DEBUG_SV.logmsg(l_module_name,’Deleted from wsh_freight_costs: TRIP_ID=’ || l_trip_id, WSH_DEBUG_SV.C_PROC_LEVEL);
END IF;
END IF;
DELETE
FROMwsh_document_instances
WHEREentity_id = l_trip_id
ANDentity_name = ‘WSH_TRIPS’;
IF SQL%FOUND THEN
IF l_debug_on THEN
WSH_DEBUG_SV.logmsg(l_module_name,’Deleted from wsh_document_instances: TRIP_ID=’ || l_trip_id, WSH_DEBUG_SV.C_PROC_LEVEL);
END IF;
END IF;
DELETE
FROMwsh_trips
WHEREtrip_id = l_trip_id;
IF SQL%FOUND THEN
IF l_debug_on THEN
WSH_DEBUG_SV.logmsg(l_module_name,’Deleted from wsh_trips: TRIP_ID=’ || l_trip_id, WSH_DEBUG_SV.C_PROC_LEVEL);
END IF;
END IF;
BEGIN –Bug 17867024
l_attachment_exists:=’N’;
SELECT ‘Y’
INTO l_attachment_exists
FROM fnd_attached_documents
WHERE entity_name = ‘WSH_TRIPS’
AND pk1_value = l_trip_id
AND rownum=1;
EXCEPTION
WHEN NO_DATA_FOUND
THEN
l_attachment_exists:=’N’;
END;
IF l_attachment_exists =’Y’
THEN
FND_ATTACHED_DOCUMENTS2_PKG.Delete_Attachments
(x_entity_name => ‘WSH_TRIPS’
,x_pk1_value => to_char(l_trip_id)
,x_delete_document_flag => ‘Y’
);
IF l_debug_on THEN
WSH_DEBUG_SV.logmsg(l_module_name,’Deleted attachemnts for TRIP_ID=’ || l_trip_id, WSH_DEBUG_SV.C_PROC_LEVEL);
END IF;
END IF;
END LOOP;
IF l_debug_on THEN
WSH_DEBUG_SV.pop(l_module_name);
END IF;
EXCEPTION
WHEN OTHERS THEN
x_return_status := WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR ;
IF l_debug_on THEN
WSH_DEBUG_SV.logmsg(l_module_name,’Unexpected error has occured. Oracle error message is ‘||
SQLERRM,WSH_DEBUG_SV.C_UNEXPEC_ERR_LEVEL);
WSH_DEBUG_SV.pop(l_module_name,’EXCEPTION:OTHERS’);
END IF;
END Purge_Trips;
/*—————————————————————————–
Procedure: Purge_Deliveries
Parameters: p_tbl_delivery_purge_set pl/sql table of delivery id’s eligible for purge
x_return_status – Returns WSH_UTIL_CORE.G_RET_STS_SUCCESS if Success
Description: This API delete the data in Shipping and Transportation
related to delivery
=============================================================================+
Input: Table of Record Types for Deliveries
Output: Return Status – success or failure
==============================================================================
Logic: i) Delete records from the following tables:
WSH_EXCEPTIONS, WSH_TRANSACTIONS_HISTORY, WSH_DOCUMENT_INSTANCES,
WSH_FREIGHT_COSTS
If FTE is installed,
FTE_SHIPMENT_STATUS_DETAILS, FTE_SHIPMENT_STATUS_EXCEPTIONS,
FTE_MESSAGE_PARTNER, FTE_MESSAGE_CONTACT, FTE_MESSAGE_LOCATION,
FTE_DELIVERY_PROOF, FTE_SHIPMENT_STATUS_HEADERS
If ITM Screening is done,
WSH_ITM_RESPONSE_LINES, WSH_ITM_RESPONSE_HEADERS, WSH_ITM_REQUEST_CONTROL,
WSH_INBOUND_TXN_HISTORY
and finally WSH_NEW_DELIVERIES.
—————————————————————————–*/
PROCEDURE Purge_Deliveries( p_tbl_delivery_purge_set Delivery_ID_Tbl_Type,
x_return_status OUT NOCOPY VARCHAR2
)IS
l_debug_onBOOLEAN;
l_loop_indexNUMBER;
l_delivery_idNUMBER;
l_module_name CONSTANT VARCHAR2(100) := ‘wsh.plsql.’ || G_PKG_NAME || ‘.’ || ‘PURGE_DELIVERIES’;
l_attachment_exists VARCHAR2(1):=’N’; –Bug 17867024
BEGIN
— Debug Statements
—
l_debug_on := WSH_DEBUG_INTERFACE.g_debug;
—
IF l_debug_on IS NULL THEN
l_debug_on := WSH_DEBUG_SV.is_debug_enabled;
END IF;
IF l_debug_on THEN
WSH_DEBUG_SV.push(l_module_name);
END IF;
x_return_status := WSH_UTIL_CORE.G_RET_STS_SUCCESS;
FOR l_loop_index in p_tbl_delivery_purge_set.FIRST .. p_tbl_delivery_purge_set.LAST
LOOP
l_delivery_id := p_tbl_delivery_purge_set(l_loop_index).delivery_id;
DELETE
FROMwsh_exceptions
WHEREdelivery_id = l_delivery_id;
IF SQL%FOUND THEN
IF l_debug_on THEN
WSH_DEBUG_SV.logmsg(l_module_name,’Deleted from wsh_exceptions: DELIVERY_ID=’ || l_delivery_id, WSH_DEBUG_SV.C_PROC_LEVEL);
END IF;
END IF;
DELETE
FROMwsh_transactions_history
WHEREentity_number = to_char(l_delivery_id)
ANDentity_type = ‘DLVY’;
IF SQL%FOUND THEN
IF l_debug_on THEN
WSH_DEBUG_SV.logmsg(l_module_name,’Deleted from wsh_transactions_history: DELIVERY_ID=’ || l_delivery_id, WSH_DEBUG_SV.C_PROC_LEVEL);
END IF;
END IF;
DELETE
FROMwsh_freight_costs
WHEREdelivery_id = l_delivery_id;
IF SQL%FOUND THEN
IF l_debug_on THEN
WSH_DEBUG_SV.logmsg(l_module_name,’Deleted from wsh_freight_costs: DELIVERY_ID=’ || l_delivery_id, WSH_DEBUG_SV.C_PROC_LEVEL);
END IF;
END IF;
DELETE
FROMwsh_document_instances
WHEREentity_id = l_delivery_id
ANDentity_name = ‘WSH_NEW_DELIVERIES’;
IF SQL%FOUND THEN
IF l_debug_on THEN
WSH_DEBUG_SV.logmsg(l_module_name,’Deleted from wsh_document_instances: DELIVERY_ID=’ || l_delivery_id, WSH_DEBUG_SV.C_PROC_LEVEL);
END IF;
END IF;
IF (wsh_util_core.fte_is_installed=’Y’) THEN
DELETE
FROMfte_shipment_status_details
WHERE transaction_id IN (SELECT transaction_id
FROM fte_shipment_status_headers
WHERE delivery_id = l_delivery_id);
IF SQL%FOUND THEN
IF l_debug_on THEN
WSH_DEBUG_SV.logmsg(l_module_name,’Deleted from fte_shipment_status_details: DELIVERY_ID=’ || l_delivery_id, WSH_DEBUG_SV.C_PROC_LEVEL);
END IF;
END IF;
DELETE
FROMfte_shipment_status_exceptions
WHERE transaction_id IN (SELECT transaction_id
FROM fte_shipment_status_headers
WHERE delivery_id = l_delivery_id);
IF SQL%FOUND THEN
IF l_debug_on THEN
WSH_DEBUG_SV.logmsg(l_module_name,’Deleted from fte_shipment_status_exceptions: DELIVERY_ID=’ || l_delivery_id, WSH_DEBUG_SV.C_PROC_LEVEL);
END IF;
END IF;
DELETE
FROMfte_message_partner
WHERE transaction_id IN (SELECT transaction_id
FROM fte_shipment_status_headers
WHERE delivery_id = l_delivery_id);
IF SQL%FOUND THEN
IF l_debug_on THEN
WSH_DEBUG_SV.logmsg(l_module_name,’Deleted from fte_message_partner: DELIVERY_ID=’ || l_delivery_id, WSH_DEBUG_SV.C_PROC_LEVEL);
END IF;
END IF;
DELETE
FROMfte_message_address
WHERE transaction_id IN (SELECT transaction_id
FROM fte_shipment_status_headers
WHERE delivery_id = l_delivery_id);
IF SQL%FOUND THEN
IF l_debug_on THEN
WSH_DEBUG_SV.logmsg(l_module_name,’Deleted from fte_message_address: DELIVERY_ID=’ || l_delivery_id, WSH_DEBUG_SV.C_PROC_LEVEL);
END IF;
END IF;
DELETE
FROMfte_message_contact
WHERE transaction_id IN (SELECT transaction_id
FROM fte_shipment_status_headers
WHERE delivery_id = l_delivery_id);
IF SQL%FOUND THEN
IF l_debug_on THEN
WSH_DEBUG_SV.logmsg(l_module_name,’Deleted from fte_message_contact: DELIVERY_ID=’ || l_delivery_id, WSH_DEBUG_SV.C_PROC_LEVEL);
END IF;
END IF;
DELETE
FROMfte_message_location
WHERE transaction_id IN (SELECT transaction_id
FROM fte_shipment_status_headers
WHERE delivery_id = l_delivery_id);
IF SQL%FOUND THEN
IF l_debug_on THEN
WSH_DEBUG_SV.logmsg(l_module_name,’Deleted from fte_message_location: DELIVERY_ID=’ || l_delivery_id, WSH_DEBUG_SV.C_PROC_LEVEL);
END IF;
END IF;
DELETE
FROMfte_delivery_proof
WHERE transaction_id IN (SELECT transaction_id
FROM fte_shipment_status_headers
WHERE delivery_id = l_delivery_id);
IF SQL%FOUND THEN
IF l_debug_on THEN
WSH_DEBUG_SV.logmsg(l_module_name,’Deleted from fte_delivery_proof: DELIVERY_ID=’ || l_delivery_id, WSH_DEBUG_SV.C_PROC_LEVEL);
END IF;
END IF;
DELETE
FROMfte_shipment_status_headers
WHERE delivery_id = l_delivery_id;
IF SQL%FOUND THEN
IF l_debug_on THEN
WSH_DEBUG_SV.logmsg(l_module_name,’Deleted from fte_shipment_status_headers: DELIVERY_ID=’ || l_delivery_id, WSH_DEBUG_SV.C_PROC_LEVEL);
END IF;
END IF;
END IF;
DELETE
FROMwsh_itm_response_lines
WHERE response_header_id IN (SELECTwirh.response_header_id
FROMwsh_itm_response_headers wirh,
wsh_itm_request_control wirc
WHEREwirc.original_system_reference = l_delivery_id
ANDwirc.request_control_id = wirh.request_control_id
ANDwirc.service_type_code = ‘WSH_EXPORT_COMPLIANCE’ );
IF SQL%FOUND THEN
IF l_debug_on THEN
WSH_DEBUG_SV.logmsg(l_module_name,’Deleted from wsh_itm_response_lines: DELIVERY_ID=’ || l_delivery_id, WSH_DEBUG_SV.C_PROC_LEVEL);
END IF;
END IF;
DELETE
FROMwsh_itm_response_headers
WHERE request_control_id IN (SELECTrequest_control_id
FROMwsh_itm_request_control
WHEREoriginal_system_reference = l_delivery_id
ANDservice_type_code = ‘WSH_EXPORT_COMPLIANCE’ ) ;
IF SQL%FOUND THEN
IF l_debug_on THEN
WSH_DEBUG_SV.logmsg(l_module_name,’Deleted from wsh_itm_response_headers: DELIVERY_ID=’ || l_delivery_id, WSH_DEBUG_SV.C_PROC_LEVEL);
END IF;
END IF;
DELETE
FROMwsh_itm_request_control
WHERE original_system_reference = l_delivery_id
ANDservice_type_code = ‘WSH_EXPORT_COMPLIANCE’;
IF SQL%FOUND THEN
IF l_debug_on THEN
WSH_DEBUG_SV.logmsg(l_module_name,’Deleted from wsh_itm_request_control: DELIVERY_ID=’ || l_delivery_id, WSH_DEBUG_SV.C_PROC_LEVEL);
END IF;
END IF;
DELETE
FROMwsh_inbound_txn_history
WHEREshipment_header_id IN (SELECT rcv_shipment_header_id
FROM wsh_new_deliveries
WHERE delivery_id = l_delivery_id) ;
IF SQL%FOUND THEN
IF l_debug_on THEN
WSH_DEBUG_SV.logmsg(l_module_name,’Deleted from wsh_inbound_txn_history: DELIVERY_ID=’ || l_delivery_id, WSH_DEBUG_SV.C_PROC_LEVEL);
END IF;
END IF;
–Bugfix Start 29553831
DELETE
FROM wsh_delivery_assignments
WHERE delivery_id = l_delivery_id
AND type = ‘C’;
IF SQL%FOUND THEN
IF l_debug_on THEN
WSH_DEBUG_SV.logmsg(l_module_name,’Deleted from wsh_delivery_assignments: DELIVERY_ID=’ || l_delivery_id, WSH_DEBUG_SV.C_PROC_LEVEL);
END IF;
END IF;
–Bugfix End 29553831
DELETE
FROMwsh_new_deliveries
WHEREdelivery_id = l_delivery_id;
IF SQL%FOUND THEN
IF l_debug_on THEN
WSH_DEBUG_SV.logmsg(l_module_name,’Deleted from wsh_new_deliveries: DELIVERY_ID=’ || l_delivery_id, WSH_DEBUG_SV.C_PROC_LEVEL);
END IF;
END IF;
BEGIN –Bug 17867024
l_attachment_exists:=’N’;
SELECT ‘Y’
INTO l_attachment_exists
FROM fnd_attached_documents
WHERE entity_name = ‘WSH_NEW_DELIVERIES’
AND pk1_value = l_delivery_id
AND rownum=1;
EXCEPTION
WHEN NO_DATA_FOUND
THEN
l_attachment_exists:=’N’;
END;
IF l_attachment_exists =’Y’
THEN
FND_ATTACHED_DOCUMENTS2_PKG.Delete_Attachments
(x_entity_name => ‘WSH_NEW_DELIVERIES’
,x_pk1_value => to_char(l_delivery_id)
,x_delete_document_flag => ‘Y’
);
IF l_debug_on THEN
WSH_DEBUG_SV.logmsg(l_module_name,’Deleted attachemnts for delivery_id=’ || l_delivery_id, WSH_DEBUG_SV.C_PROC_LEVEL);
END IF;
END IF;
END LOOP;
IF l_debug_on THEN
WSH_DEBUG_SV.pop(l_module_name);
END IF;
EXCEPTION
WHEN OTHERS THEN
x_return_status := WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR ;
IF l_debug_on THEN
WSH_DEBUG_SV.logmsg(l_module_name,’Unexpected error has occured. Oracle error message is ‘||
SQLERRM,WSH_DEBUG_SV.C_UNEXPEC_ERR_LEVEL);
WSH_DEBUG_SV.pop(l_module_name,’EXCEPTION:OTHERS’);
END IF;
END Purge_Deliveries;
/*—————————————————————————–
Procedure: Purge_Trip_Stops
Parameters: p_tbl_trip_stop_purge_set pl/sql table of trip stop id’s
eligible for purge
x_return_status – Returns WSH_UTIL_CORE.G_RET_STS_SUCCESS if Success
Description: This API delete the data in Shipping and Transportation
related to trip stop
==============================================================================
Input: Table of Record Types for Trip Stops
Output: Return Status – success or failure
==============================================================================
Logic: i) Delete records from the following tables:
WSH_EXCEPTIONS, WSH_FREIGHT_COSTS, WSH_TRIP_STOPS
—————————————————————————–*/
PROCEDURE Purge_Trip_Stops( p_tbl_trip_stop_purge_set Trip_Stop_ID_Tbl_Type,
x_return_status OUT NOCOPY VARCHAR2
)IS
l_debug_onBOOLEAN;
l_loop_indexNUMBER;
l_stop_idNUMBER;
l_module_name CONSTANT VARCHAR2(100) := ‘wsh.plsql.’ || G_PKG_NAME || ‘.’ || ‘PURGE_TRIP_STOPS’;
l_attachment_exists VARCHAR2(1):=’N’; –Bug 17867024
BEGIN
— Debug Statements
—
l_debug_on := WSH_DEBUG_INTERFACE.g_debug;
—
IF l_debug_on IS NULL THEN
l_debug_on := WSH_DEBUG_SV.is_debug_enabled;
END IF;
IF l_debug_on THEN
WSH_DEBUG_SV.push(l_module_name);
END IF;
x_return_status := WSH_UTIL_CORE.G_RET_STS_SUCCESS;
FOR l_loop_index in p_tbl_trip_stop_purge_set.FIRST .. p_tbl_trip_stop_purge_set.LAST
LOOP
l_stop_id := p_tbl_trip_stop_purge_set(l_loop_index).stop_id;
DELETE
FROMwsh_exceptions
WHEREtrip_stop_id = l_stop_id;
IF SQL%FOUND THEN
IF l_debug_on THEN
WSH_DEBUG_SV.logmsg(l_module_name,’Deleted from wsh_exceptions: STOP_ID=’ || l_stop_id, WSH_DEBUG_SV.C_PROC_LEVEL);
END IF;
END IF;
DELETE
FROMwsh_freight_costs
WHEREstop_id = l_stop_id;
IF SQL%FOUND THEN
IF l_debug_on THEN
WSH_DEBUG_SV.logmsg(l_module_name,’Deleted from wsh_freight_costs: STOP_ID=’ || l_stop_id, WSH_DEBUG_SV.C_PROC_LEVEL);
END IF;
END IF;
DELETE
FROMwsh_trip_stops
WHEREstop_id = l_stop_id;
IF SQL%FOUND THEN
IF l_debug_on THEN
WSH_DEBUG_SV.logmsg(l_module_name,’Deleted from wsh_trip_stops: STOP_ID=’ || l_stop_id, WSH_DEBUG_SV.C_PROC_LEVEL);
END IF;
END IF;
BEGIN –Bug 17867024
l_attachment_exists:=’N’;
SELECT ‘Y’
INTO l_attachment_exists
FROM fnd_attached_documents
WHERE entity_name = ‘WSH_TRIP_STOPS’
AND pk1_value = l_stop_id
AND rownum=1;
EXCEPTION
WHEN NO_DATA_FOUND
THEN
l_attachment_exists:=’N’;
END;
IF l_attachment_exists =’Y’
THEN
FND_ATTACHED_DOCUMENTS2_PKG.Delete_Attachments
(x_entity_name => ‘WSH_TRIP_STOPS’
,x_pk1_value => to_char(l_stop_id)
,x_delete_document_flag => ‘Y’
);
IF l_debug_on THEN
WSH_DEBUG_SV.logmsg(l_module_name,’Deleted attachemnts for stop_id=’ || l_stop_id, WSH_DEBUG_SV.C_PROC_LEVEL);
END IF;
END IF;
END LOOP;
IF l_debug_on THEN
WSH_DEBUG_SV.pop(l_module_name);
END IF;
EXCEPTION
WHEN OTHERS THEN
x_return_status := WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR ;
IF l_debug_on THEN
WSH_DEBUG_SV.logmsg(l_module_name,’Unexpected error has occured. Oracle error message is ‘||
SQLERRM,WSH_DEBUG_SV.C_UNEXPEC_ERR_LEVEL);
WSH_DEBUG_SV.pop(l_module_name,’EXCEPTION:OTHERS’);
END IF;
END Purge_Trip_Stops;
/*—————————————————————————–
Procedure: Purge_Delivery_Legs
Parameters: p_tbl_del_leg_purge_set pl/sql table of delivery leg id’s eligible for purge
x_return_status – Returns WSH_UTIL_CORE.G_RET_STS_SUCCESS if Success
Description: This API delete the data in Shipping and Transportation
related to delivery leg
==============================================================================
Input: Table of Record Types for Delivery Legs
Output: Return Status – success or failure
==============================================================================
Logic: i) Delete records from the following tables:
WSH_FREIGHT_COSTS, WSH_DOCUMENT_INSTANCES, WSH_DELIVERY_LEG_ACTIVITIES,
WSH_DELIVERY_LEG_DETAILS, WSH_DELIVERY_LEGS
If FTE is installed,
FTE_INVOICE_LINES, FTE_INVOICE_HISTORY, FTE_INVOICE_HEADERS,
FTE_FAILURE_REASONS
—————————————————————————–*/
PROCEDURE Purge_Delivery_Legs( p_tbl_del_leg_purge_set Del_Leg_ID_Tbl_Type,
x_return_status OUT NOCOPY VARCHAR2
)IS
l_debug_onBOOLEAN;
l_loop_indexNUMBER;
l_leg_idNUMBER;
l_module_name CONSTANT VARCHAR2(100) := ‘wsh.plsql.’ || G_PKG_NAME || ‘.’ || ‘PURGE_DELIVERY_LEGS’;
BEGIN
— Debug Statements
—
l_debug_on := WSH_DEBUG_INTERFACE.g_debug;
—
IF l_debug_on IS NULL THEN
l_debug_on := WSH_DEBUG_SV.is_debug_enabled;
END IF;
IF l_debug_on THEN
WSH_DEBUG_SV.push(l_module_name);
END IF;
x_return_status := WSH_UTIL_CORE.G_RET_STS_SUCCESS;
FOR l_loop_index in p_tbl_del_leg_purge_set.FIRST .. p_tbl_del_leg_purge_set.LAST
LOOP
l_leg_id := p_tbl_del_leg_purge_set(l_loop_index).delivery_leg_id;
DELETE
FROMwsh_freight_costs
WHEREdelivery_leg_id = l_leg_id;
IF SQL%FOUND THEN
IF l_debug_on THEN
WSH_DEBUG_SV.logmsg(l_module_name,’Deleted from wsh_freight_costs: LEG_ID=’ || l_leg_id, WSH_DEBUG_SV.C_PROC_LEVEL);
END IF;
END IF;
IF (wsh_util_core.fte_is_installed=’Y’) THEN
DELETE
FROMfte_invoice_lines
WHEREinvoice_header_id IN (SELECTfih.invoice_header_id
FROMfte_invoice_headers fih,
wsh_document_instances wdi
WHEREwdi.entity_id = l_leg_id
ANDwdi.entity_name = ‘WSH_DELIVERY_LEGS’
ANDwdi.sequence_number = fih.bol
) ;
IF SQL%FOUND THEN
IF l_debug_on THEN
WSH_DEBUG_SV.logmsg(l_module_name,’Deleted from fte_invoice_lines: LEG_ID=’ || l_leg_id, WSH_DEBUG_SV.C_PROC_LEVEL);
END IF;
END IF;
DELETE
FROMfte_invoice_headers
WHEREbol IN (SELECTsequence_number
FROMwsh_document_instances
WHEREentity_id = l_leg_id
ANDentity_name = ‘WSH_DELIVERY_LEGS’) ;
IF SQL%FOUND THEN
IF l_debug_on THEN
WSH_DEBUG_SV.logmsg(l_module_name,’Deleted from fte_invoice_headers: LEG_ID=’ || l_leg_id, WSH_DEBUG_SV.C_PROC_LEVEL);
END IF;
END IF;
DELETE
FROMfte_invoice_history
WHEREbol IN (SELECTsequence_number
FROMwsh_document_instances
WHEREentity_id = l_leg_id
ANDentity_name = ‘WSH_DELIVERY_LEGS’) ;
IF SQL%FOUND THEN
IF l_debug_on THEN
WSH_DEBUG_SV.logmsg(l_module_name,’Deleted from fte_invoice_history: LEG_ID=’ || l_leg_id, WSH_DEBUG_SV.C_PROC_LEVEL);
END IF;
END IF;
DELETE
FROMfte_failure_reasons
WHEREbol IN (SELECTsequence_number
FROMwsh_document_instances
WHEREentity_id = l_leg_id
ANDentity_name = ‘WSH_DELIVERY_LEGS’) ;
IF SQL%FOUND THEN
IF l_debug_on THEN
WSH_DEBUG_SV.logmsg(l_module_name,’Deleted from fte_failure_reasons: LEG_ID=’ || l_leg_id, WSH_DEBUG_SV.C_PROC_LEVEL);
END IF;
END IF;
END IF;
DELETE
FROMwsh_document_instances
WHEREentity_id = l_leg_id
ANDentity_name = ‘WSH_DELIVERY_LEGS’;
IF SQL%FOUND THEN
IF l_debug_on THEN
WSH_DEBUG_SV.logmsg(l_module_name,’Deleted from wsh_document_instances: LEG_ID=’ || l_leg_id, WSH_DEBUG_SV.C_PROC_LEVEL);
END IF;
END IF;
DELETE
FROMwsh_delivery_leg_activities
WHEREdelivery_leg_id = l_leg_id ;
IF SQL%FOUND THEN
IF l_debug_on THEN
WSH_DEBUG_SV.logmsg(l_module_name,’Deleted from wsh_delivery_leg_activities: LEG_ID=’ || l_leg_id, WSH_DEBUG_SV.C_PROC_LEVEL);
END IF;
END IF;
DELETE
FROMwsh_delivery_leg_details
WHEREdelivery_leg_id = l_leg_id;
IF SQL%FOUND THEN
IF l_debug_on THEN
WSH_DEBUG_SV.logmsg(l_module_name,’Deleted from wsh_delivery_leg_details: LEG_ID=’ || l_leg_id, WSH_DEBUG_SV.C_PROC_LEVEL);
END IF;
END IF;
DELETE
FROMwsh_delivery_legs
WHEREdelivery_leg_id = l_leg_id ;
IF SQL%FOUND THEN
IF l_debug_on THEN
WSH_DEBUG_SV.logmsg(l_module_name,’Deleted from wsh_delivery_legs: LEG_ID=’ || l_leg_id, WSH_DEBUG_SV.C_PROC_LEVEL);
END IF;
END IF;
END LOOP;
IF l_debug_on THEN
WSH_DEBUG_SV.pop(l_module_name);
END IF;
EXCEPTION
WHEN OTHERS THEN
x_return_status := WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR ;
IF l_debug_on THEN
WSH_DEBUG_SV.logmsg(l_module_name,’Unexpected error has occured. Oracle error message is ‘||
SQLERRM,WSH_DEBUG_SV.C_UNEXPEC_ERR_LEVEL);
WSH_DEBUG_SV.pop(l_module_name,’EXCEPTION:OTHERS’);
END IF;
END Purge_Delivery_Legs;
/*—————————————————————————–
Procedure: Purge_Delivery_Details
Parameters: p_tbl_del_detail_purge_set pl/sql table of delivery detail id’s
eligible for purge
x_return_status – Returns WSH_UTIL_CORE.G_RET_STS_SUCCESS if Success
Description: This API delete the data in Shipping and Transportation
related to delivery detail
=============================================================================
Input: Table of Record Types for Delivery Details
Output: Return Status – success or failure
==============================================================================
Logic: i) Delete records from the following tables:
WSH_FREIGHT_COSTS, WSH_SERIAL_NUMBERS, WSH_EXCEPTIONS,
wsh_delivery_assignments_v, WSH_DELIVERY_DETAILS
—————————————————————————–*/
PROCEDURE Purge_Delivery_Details(p_tbl_del_detail_purge_set Del_Detail_ID_Tbl_Type,
x_return_status OUT NOCOPY VARCHAR2
)IS
l_debug_onBOOLEAN;
l_loop_indexNUMBER;
l_detail_idNUMBER;
l_delivery_detail_id1 NUMBER;
l_module_name CONSTANT VARCHAR2(100) := ‘wsh.plsql.’ || G_PKG_NAME || ‘.’ || ‘PURGE_DELIVERY_DETAILS’;
l_attachment_exists VARCHAR2(1):=’N’; –Bug 17867024
count_del_serial_nb NUMBER;
count_del_exception NUMBER;
count_del_frieght_cost NUMBER;
count_del_assignment NUMBER;
count_detail NUMBER;
CURSOR c_get_delivery_detail IS
SELECT id FROM wsh_tmp;
BEGIN
— Debug Statements
l_debug_on := WSH_DEBUG_INTERFACE.g_debug;
—
IF l_debug_on IS NULL THEN
l_debug_on := WSH_DEBUG_SV.is_debug_enabled;
END IF;
IF l_debug_on THEN
WSH_DEBUG_SV.push(l_module_name);
END IF;
x_return_status := WSH_UTIL_CORE.G_RET_STS_SUCCESS;
–BUG 33789139 Inatead of deleteing data in loop using global temp table to improve performance
DELETE
FROMwsh_serial_numbers
WHEREdelivery_detail_id IN (SELECT id FROM wsh_tmp);
IF SQL%FOUND THEN
count_del_serial_nb := SQL%ROWCOUNT;
IF l_debug_on THEN
WSH_DEBUG_SV.log(l_module_name,’Number of delivery details deleted from wsh_serial_numbers’, count_del_serial_nb);
END IF;
END IF;
DELETE
FROMwsh_exceptions
WHEREdelivery_detail_id IN (SELECT id FROM wsh_tmp);
IF SQL%FOUND THEN
count_del_exception := SQL%ROWCOUNT;
IF l_debug_on THEN
WSH_DEBUG_SV.log(l_module_name,’Number of delivery details deleted from wsh_exceptions’, count_del_exception);
END IF;
END IF;
DELETE
FROMwsh_freight_costs
WHEREdelivery_detail_id IN (SELECT id FROM wsh_tmp);
IF SQL%FOUND THEN
count_del_frieght_cost := SQL%ROWCOUNT;
IF l_debug_on THEN
WSH_DEBUG_SV.log(l_module_name,’Number of delivery details deleted from wsh_freight_costs’, count_del_frieght_cost);
END IF;
END IF;
DELETE
FROMwsh_delivery_assignments_v
WHEREdelivery_detail_id IN (SELECT id FROM wsh_tmp);
IF SQL%FOUND THEN
count_del_assignment := SQL%ROWCOUNT;
IF l_debug_on THEN
WSH_DEBUG_SV.log(l_module_name,’Number of delivery details deleted from wsh_delivery_assignments_v’, count_del_assignment);
END IF;
END IF;
DELETE
FROMwsh_delivery_details
WHEREdelivery_detail_id IN (SELECT id FROM wsh_tmp);
IF SQL%FOUND THEN
count_detail := SQL%ROWCOUNT;
IF l_debug_on THEN
WSH_DEBUG_SV.log(l_module_name,’Number of delivery details deleted from wsh_delivery_details’, count_detail);
END IF;
END IF;
OPEN c_get_delivery_detail;
LOOP
FETCH c_get_delivery_detail INTO l_delivery_detail_id1;
exit when c_get_delivery_detail%NOTFOUND;
IF l_debug_on THEN
WSH_DEBUG_SV.log(l_module_name,’Deleted delivery detail id’,l_delivery_detail_id1);
END IF;
end LOOP;
IF p_tbl_del_detail_purge_set.COUNT > 0 THEN
FOR l_loop_index in p_tbl_del_detail_purge_set.FIRST .. p_tbl_del_detail_purge_set.LAST
LOOP
l_detail_id := p_tbl_del_detail_purge_set(l_loop_index).delivery_detail_id;
BEGIN –Bug 17867024
l_attachment_exists:=’N’;
SELECT ‘Y’
INTO l_attachment_exists
FROM fnd_attached_documents
WHERE entity_name = ‘WSH_DELIVERY_DETAILS’
AND pk1_value = l_detail_id
AND rownum=1;
EXCEPTION
WHEN NO_DATA_FOUND
THEN
l_attachment_exists:=’N’;
END;
IF l_attachment_exists =’Y’
THEN
FND_ATTACHED_DOCUMENTS2_PKG.Delete_Attachments
(x_entity_name => ‘WSH_DELIVERY_DETAILS’
,x_pk1_value => to_char(l_detail_id)
,x_delete_document_flag => ‘Y’
);
IF l_debug_on THEN
WSH_DEBUG_SV.logmsg(l_module_name,’Deleted attachemnts for detail_id=’ || l_detail_id, WSH_DEBUG_SV.C_PROC_LEVEL);
END IF;
END IF;
END LOOP;
END IF;
IF l_debug_on THEN
WSH_DEBUG_SV.pop(l_module_name);
END IF;
EXCEPTION
WHEN OTHERS THEN
x_return_status := WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR ;
IF l_debug_on THEN
WSH_DEBUG_SV.logmsg(l_module_name,’Unexpected error has occured. Oracle error message is ‘||
SQLERRM,WSH_DEBUG_SV.C_UNEXPEC_ERR_LEVEL);
WSH_DEBUG_SV.pop(l_module_name,’EXCEPTION:OTHERS’);
END IF;
END Purge_Delivery_Details;
/*—————————————————————————–
Procedure: Purge_Containers
Parameters: p_tbl_containers_purge_set pl/sql table of container id’s eligible for purge
x_return_status – Returns WSH_UTIL_CORE.G_RET_STS_SUCCESS if Success
Description: This API calls the WMS API to delete the data in WMS
related to Containers
==============================================================================
Input: Table of Record Types for Container Ids
Output: Return Status – success or failure
==============================================================================
Logic: i) Delete records from the following tables:
wsh_delivery_assignments_v, WSH_DELIVERY_DETAILS
—————————————————————————–*/
PROCEDURE Purge_Containers(p_tbl_containers_purge_set Container_ID_Tbl_Type,
x_return_status OUT NOCOPY VARCHAR2
)IS
l_debug_onBOOLEAN;
l_loop_indexNUMBER;
l_container_idNUMBER;
l_lpn_idNUMBER;
l_return_status VARCHAR2(1);
l_msg_count NUMBER;
l_msg_data VARCHAR2(32767);
l_wms_lpn_record WMS_Data_Type_Definitions_PUB.LPNPurgeRecordType;
l_module_name CONSTANT VARCHAR2(100) := ‘wsh.plsql.’ || G_PKG_NAME || ‘.’ || ‘PURGE_CONTAINERS’;
l_attachment_exists VARCHAR2(1):=’N’; –Bug 17867024
l_lpn_exists VARCHAR2(1); –Bugfix 37755394
BEGIN
— Debug Statements
—
l_debug_on := WSH_DEBUG_INTERFACE.g_debug;
—
IF l_debug_on IS NULL THEN
l_debug_on := WSH_DEBUG_SV.is_debug_enabled;
END IF;
IF l_debug_on THEN
WSH_DEBUG_SV.push(l_module_name);
END IF;
x_return_status := WSH_UTIL_CORE.G_RET_STS_SUCCESS;
FOR l_loop_index in p_tbl_containers_purge_set.FIRST .. p_tbl_containers_purge_set.LAST
LOOP
l_container_id := p_tbl_containers_purge_set(l_loop_index).container_id;
l_lpn_id := NULL; — Added for Bug #19675985
DELETE
FROMwsh_exceptions
WHEREdelivery_detail_id = l_container_id;
IF SQL%FOUND THEN
IF l_debug_on THEN
WSH_DEBUG_SV.logmsg(l_module_name,’Deleted from wsh_exceptions: CONTAINER_ID=’ || l_container_id, WSH_DEBUG_SV.C_PROC_LEVEL);
END IF;
END IF;
DELETE
FROMwsh_freight_costs
WHEREdelivery_detail_id = l_container_id;
IF SQL%FOUND THEN
IF l_debug_on THEN
WSH_DEBUG_SV.logmsg(l_module_name,’Deleted from wsh_freight_costs: CONTAINER_ID=’ || l_container_id, WSH_DEBUG_SV.C_PROC_LEVEL);
END IF;
END IF;
DELETE
FROMwsh_delivery_assignments_v
WHEREdelivery_detail_id = l_container_id;
IF SQL%FOUND THEN
IF l_debug_on THEN
WSH_DEBUG_SV.logmsg(l_module_name,’Deleted from wsh_delivery_assignments_v: CONTAINER_ID=’ || l_container_id, WSH_DEBUG_SV.C_PROC_LEVEL);
END IF;
END IF;
DELETE
FROMwsh_delivery_details
WHEREdelivery_detail_id = l_container_id
RETURNING lpn_id INTO l_lpn_id;
IF SQL%FOUND THEN
IF l_debug_on THEN
WSH_DEBUG_SV.logmsg(l_module_name,’Deleted from wsh_delivery_details: CONTAINER_ID=’ || l_container_id, WSH_DEBUG_SV.C_PROC_LEVEL);
END IF;
END IF;
IF l_lpn_id IS NOT NULL THEN — Populate the LPN IDs in the table
–Bugfix 37755394 Start
BEGIN
l_lpn_exists:=’N’;
SELECT ‘Y’
INTO l_lpn_exists
FROM wms_license_plate_numbers
WHERE LPN_ID = l_lpn_id;
EXCEPTION
WHEN NO_DATA_FOUND
THEN
IF l_debug_on THEN
WSH_DEBUG_SV.log(l_module_name,’LPN does not exist in wms license’,l_lpn_id);
END IF;
END;
IF l_lpn_exists = ‘Y’ THEN
l_wms_lpn_record.LPN_IDs(l_wms_lpn_record.LPN_IDs.COUNT+1) := l_lpn_id;
END IF;
–Bugfix 37755394 completes
END IF;
BEGIN –Bug 17867024
l_attachment_exists:=’N’;
SELECT ‘Y’
INTO l_attachment_exists
FROM fnd_attached_documents
WHERE entity_name = ‘WSH_DELIVERY_DETAILS’
AND pk1_value = l_container_id
AND rownum=1;
EXCEPTION
WHEN NO_DATA_FOUND
THEN
l_attachment_exists:=’N’;
END;
IF l_attachment_exists =’Y’
THEN
FND_ATTACHED_DOCUMENTS2_PKG.Delete_Attachments
(x_entity_name => ‘WSH_DELIVERY_DETAILS’
,x_pk1_value => to_char(l_container_id)
,x_delete_document_flag => ‘Y’
);
IF l_debug_on THEN
WSH_DEBUG_SV.logmsg(l_module_name,’Deleted attachemnts for container_id=’ || l_container_id, WSH_DEBUG_SV.C_PROC_LEVEL);
END IF;
END IF;
END LOOP;
–Call the WMS API to DELETE the LPNs
IF l_debug_on THEN
WSH_DEBUG_SV.logmsg(l_module_name,’Calling program unit WMS_CONTAINER_GRP.LPN_PURGE_ACTIONS’, WSH_DEBUG_SV.C_PROC_LEVEL);
END IF;
WMS_Container_GRP.LPN_Purge_Actions(p_api_version=>1.0,
p_init_msg_list=>FND_API.G_TRUE,
p_commit=>’FALSE’,
x_return_status=>l_return_status,
x_msg_count=>l_msg_count,
x_msg_data=>l_msg_data,
p_caller=>’WSH’,
p_action=>WMS_Container_GRP.G_LPN_PURGE_ACTION_DELETE,
p_lpn_purge_rec=> l_wms_lpn_record
);
IF l_debug_on THEN
WSH_DEBUG_SV.log(l_module_name,’L_RETURN_STATUS’,l_return_status);
WSH_DEBUG_SV.log(l_module_name,’L_MSG_DATA’,l_msg_data);
END IF;
IF (l_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS) THEN
x_return_status := l_return_status;
IF l_debug_on THEN
WSH_DEBUG_SV.pop(l_module_name);
END IF;
RETURN;
END IF;
IF l_debug_on THEN
WSH_DEBUG_SV.pop(l_module_name);
END IF;
EXCEPTION
WHEN OTHERS THEN
x_return_status := WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR ;
IF l_debug_on THEN
WSH_DEBUG_SV.logmsg(l_module_name,’Unexpected error has occured. Oracle error message is ‘||
SQLERRM,WSH_DEBUG_SV.C_UNEXPEC_ERR_LEVEL);
WSH_DEBUG_SV.pop(l_module_name,’EXCEPTION:OTHERS’);
END IF;
END Purge_Containers;
—————————————————————————–
—
— Procedure: Generate_Purge_Report
— Parameters: p_execution_mode Specifies whether to Purge Data or View Purge Set
— p_source_system Only the delivery details belonging to this Source System
— would be considered eligible for Purge
— p_ship_from_org Only the deliveries belonging to this Ship From Org
— would be considered eligible for Purge
— p_order_number_from Only the delivery details having source_header_number
— greater than Order Number From would be considered eligible for Purge
— p_order_number_to Only the delivery details having source_header_number
— less than Order Number To would be considered eligible for Purge
— p_order_type Only the delivery details belonging to this Order Type
— would be considered eligible for Purge
— p_ship_date_from Only the deliveries having initial_pickup_date greater
— than Ship Date From would be considered eligible for Purge
— p_ship_date_to Only the deliveries having initial_pickup_date less than
— Ship Date To would be considered eligible for Purge
— p_delete_beyond_x_ship_days Only the deliveries having initial_pickup_date greater
— than the specified date would be considered eligible for Purge
— p_purge_intransit_trips Decides whether to purge In Transit Trips or not
— p_delete_empty_records Decides whether to delete empty record or not.
— The empty records can be Empty Trips, Orphaned Empty Deliveries,
— Delivery with Empty containers, Empty Containers
— p_create_date_from Only Empty records having creation_date greater than this
— date would be purged
— p_create_date_to Only Empty records having creation_date less than this
— date would be purged
— p_del_beyond_creation_days Only Empty records having creation_date greater than
— this date would be purged
— p_sort_per_criteria Sorts the report output according to Trip,
— Delivery or Order Number
— p_print_detail If Low, the report would contain the parameters / summary
— page and all detail pages with Trips, Deliveries and
— Sales Orders data eligible to purge or purged.
— If No, the report would contain only the parameters / summary page.
— p_tbl_trip_purge_set pl/sql table of trip id’s eligible for purge
— p_tbl_delivery_purge_set pl/sql table of delivery id’s eligible for purge
— p_tbl_delivery_purge_set pl/sql table of container ids’s eligible for purge
— p_count_legs count of delivery legs to be purged/eligible to be purged
— p_count_stops count of trip stops to be purged/eligible to be purged
— p_count_details count of delivery details to be purged/eligible to be purged
— p_count_containers count of containers to be purged/eligible to be purged
— x_return_status – Returns WSH_UTIL_CORE.G_RET_STS_SUCCESS if Success
— Description: This API generates the XML and writes it in output file
— of the concurrent program to be used by the XML Publisher
— to generate the XML report
—————————————————————————–
PROCEDURE Generate_Purge_Report(p_execution_mode varchar2,
p_source_system varchar2,
p_ship_from_org number,
p_order_number_from varchar2,
p_order_number_to varchar2,
p_order_type number,
p_ship_date_from varchar2,
p_ship_date_to varchar2,
p_delete_beyond_x_ship_days number,
p_purge_intransit_trips varchar2,
p_delete_empty_records varchar2,
p_create_date_from varchar2,
p_create_date_to varchar2,
p_del_beyond_creation_days number,
p_sort_per_criteria varchar2,
p_print_detail varchar2,
p_tbl_trip_purge_set Trip_ID_Tbl_Type ,
p_tbl_delivery_purge_set Delivery_ID_Tbl_Type,
p_tbl_container_purge_set Container_ID_Tbl_Type,
p_count_legs NUMBER,
p_count_stops NUMBER,
p_count_details NUMBER,
p_count_containers NUMBER,
x_return_status OUT NOCOPY VARCHAR2
)IS
l_debug_on BOOLEAN;
l_trip_id NUMBER;
l_delivery_id NUMBER;
l_delivery_name VARCHAR2(30);
l_trip_name VARCHAR2(30);
l_sales_order VARCHAR2(150);
— bug 19011746 , alpha-num bol # possible, not just Numbers
l_bol_number VARCHAR2(50);
l_container_id NUMBER;
l_container_name VARCHAR2(50); — Added for bug # 18312829
l_waybill VARCHAR2(30);
l_gross_weight NUMBER;
l_ship_to VARCHAR2(500);
l_customer_name VARCHAR2(50);
l_pickup_date DATE;
l_dropoff_date DATE;
l_ship_date DATE;
l_order_type VARCHAR2(240);
l_create_date DATE;
l_trip_index NUMBER;
l_delivery_index NUMBER;
l_sales_order_index NUMBER;
l_container_index NUMBER;
l_nonempty_count NUMBER;
l_lpn_count NUMBER;
l_empty_trip_count NUMBER;
l_empty_del_count NUMBER;
l_empty_lpn_count NUMBER;
l_buff_size NUMBER;
l_src_meaning wsh_lookups.meaning%TYPE; –RTV changes
l_err varchar2(500);
l_module_name CONSTANT VARCHAR2(100) := ‘wsh.plsql.’ || G_PKG_NAME || ‘.’ || ‘GENERATE_PURGE_REPORT’;
–Get Deliveries for Trips
CURSOR c_dels_for_trip(p_tripid NUMBER) IS
SELECTdistinct del_id,
del_name,
del_waybill,
del_gross_weight,
del_ui_location_code,
del_customer_name,
del_pickup_date,
del_dropoff_date,
del_ship_date,
bol
FROMwsh_purge_set_v
WHEREtrip_id = p_tripid;
–Added hints to the query for bug 4891951
CURSOR c_bols_for_del(p_delivery_id NUMBER) IS
SELECT/*+use_nl(v.wda, v.wnd, v.wdl)*/ distinct v.bol
FROMwsh_purge_set_v v
WHEREv.del_id = p_delivery_id
ANDv.bol is not null;
–Get Sales Order Details for Deliveries
–Added hints to the query for bug 4891951
CURSORc_so_for_delivery(p_delivery_id NUMBER) IS
SELECT/*+use_nl(v.wda, v.wnd, v.wdl)*/ DISTINCT v.dd_source_header_number,
v.dd_source_header_type_name–,
— dd_creation_date
FROMwsh_purge_set_v v
WHEREv.del_id = p_delivery_id
ANDv.dd_source_header_number is not null;
CURSOR c_dels_trips_for_order(p_ordernumber VARCHAR2) IS
SELECTdistinct trip_id,
trip_name,
del_id,
del_name,
del_waybill,
del_gross_weight,
del_ui_location_code,
del_customer_name,
del_pickup_date,
del_dropoff_date,
del_ship_date,
bol
FROMwsh_purge_set_v
WHEREdd_source_header_number= p_ordernumber;
–Get Containers for Sales Orders
/*CURSORc_containers_for_so(order_number varchar2) IS
SELECTdistinct wda.parent_delivery_detail_id
FROMwsh_delivery_assignments_v wda,
wsh_delivery_details wdd
WHEREwda.delivery_detail_id = wdd.delivery_detail_id
ANDwdd.source_header_number = order_number
ANDwda.parent_delivery_detail_id IS NOT NULL;
*/
/*CURSORc_containers_for_so(order_number varchar2) IS
SELECT DISTINCT wda.parent_delivery_detail_id
FROM wsh_delivery_assignments_v wda ,wsh_Delivery_Details wdd
WHERE wda.parent_delivery_detail_id is not null
AND wdd.delivery_Detail_id = wda.delivery_detail_id
CONNECT BY PRIOR wda.delivery_detail_id = wda.parent_delivery_detail_id
START WITH wdd.source_header_number =order_number;
*/
CURSORc_containers_for_so(p_order_number varchar2) IS
SELECT DISTINCT wda.parent_delivery_detail_id
FROM wsh_delivery_assignments_v wda
WHERE wda.parent_delivery_detail_id is not null
CONNECT BY PRIOR wda.delivery_detail_id = wda.parent_delivery_detail_id
START WITH wda.delivery_id IN (select wda1.delivery_id from
wsh_delivery_assignments_v wda1, wsh_delivery_Details wdd
WHERE wda1.delivery_Detail_id = wdd.delivery_Detail_id
and wdd.source_header_number = p_order_number);
BEGIN
— Debug Statements
—
l_debug_on := WSH_DEBUG_INTERFACE.g_debug;
—
IF l_debug_on IS NULL THEN
l_debug_on := WSH_DEBUG_SV.is_debug_enabled;
END IF;
IF l_debug_on THEN
WSH_DEBUG_SV.push(l_module_name);
END IF;
x_return_status := WSH_UTIL_CORE.G_RET_STS_SUCCESS;
l_nonempty_count := 0;
l_lpn_count := 0;
l_empty_trip_count := 0;
l_empty_del_count := 0;
l_empty_lpn_count := 0;
IF l_debug_on THEN
WSH_DEBUG_SV.log(l_module_name,’P_EXECUTION_MODE’,p_execution_mode);
WSH_DEBUG_SV.log(l_module_name,’P_SOURCE_SYSTEM’,p_source_system);
WSH_DEBUG_SV.log(l_module_name,’P_SHIP_FROM_ORG’,p_ship_from_org);
WSH_DEBUG_SV.log(l_module_name,’P_ORDER_NUMBER_FROM’,p_order_number_from);
WSH_DEBUG_SV.log(l_module_name,’P_ORDER_NUMBER_To’,p_order_number_to);
WSH_DEBUG_SV.log(l_module_name,’P_ORDER_TYPE’,p_order_type);
WSH_DEBUG_SV.log(l_module_name,’P_SHIP_DATE_FROM’,p_ship_date_from);
WSH_DEBUG_SV.log(l_module_name,’P_SHIP_DATE_TO’,p_ship_date_to);
WSH_DEBUG_SV.log(l_module_name,’P_DELETE_BEYOND_X_SHIP_DAYS’,p_delete_beyond_x_ship_days);
WSH_DEBUG_SV.log(l_module_name,’P_PURGE_INTRANSIT_TRIPS’,p_purge_intransit_trips);
WSH_DEBUG_SV.log(l_module_name,’P_DELETE_EMPTY_Records’,p_delete_empty_records);
WSH_DEBUG_SV.log(l_module_name,’P_CREATE_DATE_FROM’,p_create_date_from);
WSH_DEBUG_SV.log(l_module_name,’P_CREATE_DATE_TO’,p_create_date_to);
WSH_DEBUG_SV.log(l_module_name,’P_DEL_BEYOND_CREATION_DAYS’,p_del_beyond_creation_days);
WSH_DEBUG_SV.log(l_module_name,’P_SORT_PER_CRITERIA’,p_sort_per_criteria);
WSH_DEBUG_SV.log(l_module_name,’P_PRINT_DETAIL’,p_print_detail);
WSH_DEBUG_SV.log(l_module_name,’P_COUNT_LEGS’,p_count_legs);
WSH_DEBUG_SV.log(l_module_name,’P_COUNT_STOPS’,p_count_stops);
WSH_DEBUG_SV.log(l_module_name,’P_COUNT_DETAILS’,p_count_details);
WSH_DEBUG_SV.log(l_module_name,’P_COUNT_ContainerS’,p_count_containers);
END IF;
— FND_FILE.PUT_LINE(FND_FILE.OUTPUT, ‘<?xml version=”1.0″ ?>’);
–bug 12605679: Added encoding to UTF-8
FND_FILE.PUT_LINE(FND_FILE.OUTPUT, ‘<?xml version=”1.0″ encoding=”UTF-8″ ?>’);
FND_FILE.PUT_LINE(FND_FILE.OUTPUT, ‘<ROWSET>’);
IF p_execution_mode = ‘V’ THEN
FND_FILE.PUT_LINE(FND_FILE.OUTPUT, ‘<EXEC_MODE>View Purge Selection</EXEC_MODE>’);
FND_FILE.PUT_LINE(FND_FILE.OUTPUT,'<COUNT_HEADING>Eligible to Purge</COUNT_HEADING>’);
ELSE
FND_FILE.PUT_LINE(FND_FILE.OUTPUT, ‘<EXEC_MODE>Purge</EXEC_MODE>’);
FND_FILE.PUT_LINE(FND_FILE.OUTPUT,'<COUNT_HEADING>Purged</COUNT_HEADING>)’);
END IF;
FND_FILE.PUT_LINE(FND_FILE.OUTPUT, ‘<CURR_DATE>’|| SYSDATE ||'</CURR_DATE>’);
–RTV changes
/*
IF (p_source_system = ‘ALL’) THEN
FND_FILE.PUT_LINE(FND_FILE.OUTPUT, ‘<SOURCE_SYSTEM>All</SOURCE_SYSTEM>’);
ELSIF (p_source_system = ‘OE’) THEN
FND_FILE.PUT_LINE(FND_FILE.OUTPUT, ‘<SOURCE_SYSTEM>Order Management</SOURCE_SYSTEM>’);
ELSIF (p_source_system = ‘PO’) THEN
FND_FILE.PUT_LINE(FND_FILE.OUTPUT, ‘<SOURCE_SYSTEM>Purchasing</SOURCE_SYSTEM>’);
ELSIF (p_source_system = ‘WSH’) THEN
FND_FILE.PUT_LINE(FND_FILE.OUTPUT, ‘<SOURCE_SYSTEM>Shipping</SOURCE_SYSTEM>’);
END IF;
*/
SELECT meaning
INTO l_src_meaning
FROM wsh_lookups
WHERE lookup_code = p_source_system
AND lookup_type in (‘WSH_PURGE_SOURCE_SYSTEMS’,’SOURCE_SYSTEM’)
AND LOOKUP_CODE <> ‘OKE’
AND enabled_flag = ‘Y’
AND Trunc(SYSDATE) BETWEEN Nvl(start_date_active, Trunc(SYSDATE)) AND Nvl
(
end_date_active, Trunc(SYSDATE))
AND ROWNUM < 2;
FND_FILE.PUT_LINE(FND_FILE.OUTPUT, ‘<SOURCE_SYSTEM>’||l_src_meaning||'</SOURCE_SYSTEM>’);
–RTV changes
IF p_ship_from_org IS NOT NULL THEN
FND_FILE.PUT_LINE(FND_FILE.OUTPUT,'<SHIP_ORG>’ ||
WSH_UTIL_CORE.GET_ORG_NAME(p_organization_id => to_number(p_ship_from_org)) ||
‘</SHIP_ORG>’);
ELSE
FND_FILE.PUT_LINE(FND_FILE.OUTPUT, ‘<SHIP_ORG></SHIP_ORG>’);
END IF;
FND_FILE.PUT_LINE(FND_FILE.OUTPUT, ‘<ORDER_NUM_FROM>’ || p_order_number_from || ‘</ORDER_NUM_FROM>’);
FND_FILE.PUT_LINE(FND_FILE.OUTPUT, ‘<ORDER_NUM_TO>’ || p_order_number_to || ‘</ORDER_NUM_TO>’);
FND_FILE.PUT_LINE(FND_FILE.OUTPUT, ‘<ORDER_TYPE>’ || p_order_type || ‘</ORDER_TYPE>’);
FND_FILE.PUT_LINE(FND_FILE.OUTPUT, ‘<SHIP_DATE_FROM>’ || FND_DATE.CANONICAL_TO_DATE(p_ship_date_from) || ‘</SHIP_DATE_FROM>’);
FND_FILE.PUT_LINE(FND_FILE.OUTPUT, ‘<SHIP_DATE_TO>’ || FND_DATE.CANONICAL_TO_DATE(p_ship_date_to) || ‘</SHIP_DATE_TO>’);
FND_FILE.PUT_LINE(FND_FILE.OUTPUT, ‘<DEL_SHIP_DAYS>’ || p_delete_beyond_x_ship_days || ‘</DEL_SHIP_DAYS>’);
IF p_purge_intransit_trips = ‘Y’ THEN
FND_FILE.PUT_LINE(FND_FILE.OUTPUT, ‘<CLOSE_IT_TRIPS>Yes</CLOSE_IT_TRIPS>’);
ELSE
FND_FILE.PUT_LINE(FND_FILE.OUTPUT, ‘<CLOSE_IT_TRIPS>No</CLOSE_IT_TRIPS>’);
END IF;
IF p_delete_empty_records = ‘Y’ THEN
FND_FILE.PUT_LINE(FND_FILE.OUTPUT, ‘<DEL_EMPTY>Yes</DEL_EMPTY>’);
ELSE
FND_FILE.PUT_LINE(FND_FILE.OUTPUT, ‘<DEL_EMPTY>No</DEL_EMPTY>’);
END IF;
FND_FILE.PUT_LINE(FND_FILE.OUTPUT, ‘<CREATE_DATE_FROM>’|| FND_DATE.CANONICAL_TO_DATE(p_create_date_from) ||'</CREATE_DATE_FROM>’);
FND_FILE.PUT_LINE(FND_FILE.OUTPUT, ‘<CREATE_DATE_TO>’|| FND_DATE.CANONICAL_TO_DATE(p_create_date_to) ||'</CREATE_DATE_TO>’);
FND_FILE.PUT_LINE(FND_FILE.OUTPUT, ‘<DEL_CREATE_DAYS>’ || p_del_beyond_creation_days || ‘</DEL_CREATE_DAYS>’);
IF p_sort_per_criteria = ‘T’ THEN
FND_FILE.PUT_LINE(FND_FILE.OUTPUT, ‘<SORT_CRITERIA>Trip</SORT_CRITERIA>’);
ELSIF p_sort_per_criteria = ‘D’ THEN
FND_FILE.PUT_LINE(FND_FILE.OUTPUT, ‘<SORT_CRITERIA>Delivery</SORT_CRITERIA>’);
ELSIF p_sort_per_criteria = ‘O’ THEN
FND_FILE.PUT_LINE(FND_FILE.OUTPUT, ‘<SORT_CRITERIA>Order</SORT_CRITERIA>’);
END IF;
IF p_print_detail=’L’ THEN
FND_FILE.PUT_LINE(FND_FILE.OUTPUT, ‘<PRINT_DETAIL>Detail with LPN</PRINT_DETAIL>’);
ELSIF p_print_detail=’D’ THEN
FND_FILE.PUT_LINE(FND_FILE.OUTPUT, ‘<PRINT_DETAIL>Detail</PRINT_DETAIL>’);
ELSIF p_print_detail=’S’ THEN
FND_FILE.PUT_LINE(FND_FILE.OUTPUT, ‘<PRINT_DETAIL>Summary</PRINT_DETAIL>’);
END IF;
FND_FILE.PUT_LINE(FND_FILE.OUTPUT, ‘<PURGED_BY>’|| FND_GLOBAL.USER_NAME ||'</PURGED_BY>’);
FND_FILE.PUT_LINE(FND_FILE.OUTPUT, ‘<REQUEST_ID>’ ||FND_GLOBAL.CONC_REQUEST_ID ||'</REQUEST_ID>’);
FND_FILE.PUT_LINE(FND_FILE.OUTPUT, ‘<NO_OF_TRIPS>’ || p_tbl_trip_purge_set.COUNT || ‘</NO_OF_TRIPS>’);
FND_FILE.PUT_LINE(FND_FILE.OUTPUT, ‘<NO_OF_STOPS>’ || p_count_stops || ‘</NO_OF_STOPS>’);
FND_FILE.PUT_LINE(FND_FILE.OUTPUT, ‘<NO_OF_DELS>’ || p_tbl_delivery_purge_set.COUNT || ‘</NO_OF_DELS>’);
FND_FILE.PUT_LINE(FND_FILE.OUTPUT, ‘<NO_OF_LINES>’ || p_count_details || ‘</NO_OF_LINES>’);
IF p_print_detail <> ‘S’ THEN –check for print detail
IF p_tbl_trip_purge_set.COUNT > 0 THEN
FOR l_trip_index in p_tbl_trip_purge_set.FIRST .. p_tbl_trip_purge_set.LAST
LOOP
l_trip_id := p_tbl_trip_purge_set(l_trip_index).trip_id;
l_trip_name := p_tbl_trip_purge_set(l_trip_index).trip_name;
IF (p_tbl_trip_purge_set(l_trip_index).purge_set_type = ‘NON_EMPTY’) THEN
–FND_FILE.PUT_LINE(FND_FILE.OUTPUT, ‘<TRIP>’);
–FND_FILE.PUT_LINE(FND_FILE.OUTPUT, ‘<TRIP_ID>’ || l_trip_id || ‘</TRIP_ID>’);
l_nonempty_count := l_nonempty_count +1;
OPEN c_dels_for_trip(l_trip_id);
LOOP
FETCH c_dels_for_trip into l_delivery_id,l_delivery_name,l_waybill,l_gross_weight,
l_ship_to,l_customer_name,l_pickup_date,l_dropoff_date,l_ship_date,l_bol_number ;
EXIT WHEN c_dels_for_trip%NOTFOUND;
IF p_sort_per_criteria <> ‘O’ THEN –check for sort by order
FND_FILE.PUT_LINE(FND_FILE.OUTPUT,'<TRIP>’);
IF P_SORT_PER_CRITERIA = ‘T’ THEN
FND_FILE.PUT_LINE(FND_FILE.OUTPUT, ‘<SORT_ID>’ || l_trip_name || ‘</SORT_ID>’);
ELSIF P_SORT_PER_CRITERIA = ‘D’ THEN
FND_FILE.PUT_LINE(FND_FILE.OUTPUT, ‘<SORT_ID>’ || l_delivery_name || ‘</SORT_ID>’);
END IF ;
FND_FILE.PUT_LINE(FND_FILE.OUTPUT, ‘<TRIP_ID>’ || l_trip_name || ‘</TRIP_ID>’);
FND_FILE.PUT_LINE(FND_FILE.OUTPUT,'<DELIVERY_ID>’ || l_delivery_name || ‘</DELIVERY_ID>’);
FND_FILE.PUT_LINE(FND_FILE.OUTPUT,'<WAYBILL>’ || l_waybill || ‘</WAYBILL>’);
FND_FILE.PUT_LINE(FND_FILE.OUTPUT,'<BOL>’ || l_bol_number || ‘</BOL>’);
FND_FILE.PUT_LINE(FND_FILE.OUTPUT,'<GROSS_WEIGHT>’ || l_gross_weight || ‘</GROSS_WEIGHT>’);
FND_FILE.PUT_LINE(FND_FILE.OUTPUT,'<SHIP_TO>’ || dbms_xmlgen.convert(l_ship_to) || ‘</SHIP_TO>’); –Bug 18490513
–FND_FILE.PUT_LINE(FND_FILE.OUTPUT,'<SHIP_TO>’ || l_ship_to || ‘</SHIP_TO>’);
FND_FILE.PUT_LINE(FND_FILE.OUTPUT,'<CUSTOMER><![CDATA[ ‘ || l_customer_name || ‘]]></CUSTOMER>’);
FND_FILE.PUT_LINE(FND_FILE.OUTPUT,'<PICKUP_DATE>’ || l_pickup_date || ‘</PICKUP_DATE>’);
FND_FILE.PUT_LINE(FND_FILE.OUTPUT,'<DROPOFF_DATE>’ || l_dropoff_date || ‘</DROPOFF_DATE>’);
FND_FILE.PUT_LINE(FND_FILE.OUTPUT,'<SHIP_DATE>’ || l_ship_date || ‘</SHIP_DATE>’);
END IF;–check for sort by order
OPEN c_so_for_delivery(l_delivery_id);
LOOP
FETCH c_so_for_delivery into l_sales_order,l_order_type;
EXIT WHEN c_so_for_delivery%NOTFOUND;
FND_FILE.PUT_LINE(FND_FILE.OUTPUT,'<SALES_ORDER>’);
FND_FILE.PUT_LINE(FND_FILE.OUTPUT,'<ORDER_NUMBER>’ || l_sales_order || ‘</ORDER_NUMBER>’);
FND_FILE.PUT_LINE(FND_FILE.OUTPUT,'<ORDER_TYPE>’ || l_order_type || ‘</ORDER_TYPE>’);
IF p_print_detail = ‘L’ THEN –check whether to print container details
FND_FILE.PUT_LINE(FND_FILE.OUTPUT,'<CONTAINER>’);
OPEN c_containers_for_so(l_sales_order);
LOOP
l_lpn_count := l_lpn_count+1;
FETCH c_containers_for_so into l_container_id;
EXIT WHEN c_containers_for_so%NOTFOUND;
IF l_lpn_count = 1 THEN
FND_FILE.PUT_LINE(FND_FILE.OUTPUT,l_container_id);
ELSE
FND_FILE.PUT_LINE(FND_FILE.OUTPUT,’ ,’ || l_container_id);
END IF;
END LOOP;
CLOSE c_containers_for_so;
FND_FILE.PUT_LINE(FND_FILE.OUTPUT,'</CONTAINER>’);
END IF; — end check to print container details
IF p_sort_per_criteria = ‘O’ THEN –check for sort by order
OPEN c_dels_trips_for_order(l_sales_order);
LOOP
FETCH c_dels_trips_for_order into l_trip_id,l_trip_name,l_delivery_id,
l_delivery_name,l_waybill,l_gross_weight,l_ship_to,l_customer_name,
l_pickup_date,l_dropoff_date,l_ship_date,l_bol_number ;
EXIT WHEN c_dels_trips_for_order%NOTFOUND;
FND_FILE.PUT_LINE(FND_FILE.OUTPUT,'<TRIP>’);
FND_FILE.PUT_LINE(FND_FILE.OUTPUT, ‘<TRIP_ID>’ || l_trip_name || ‘</TRIP_ID>’);
FND_FILE.PUT_LINE(FND_FILE.OUTPUT,'<DELIVERY_ID>’ || l_delivery_name || ‘</DELIVERY_ID>’);
FND_FILE.PUT_LINE(FND_FILE.OUTPUT,'<WAYBILL>’ || l_waybill || ‘</WAYBILL>’);
FND_FILE.PUT_LINE(FND_FILE.OUTPUT,'<BOL>’ || l_bol_number || ‘</BOL>’);
FND_FILE.PUT_LINE(FND_FILE.OUTPUT,'<GROSS_WEIGHT>’ || l_gross_weight || ‘</GROSS_WEIGHT>’);
FND_FILE.PUT_LINE(FND_FILE.OUTPUT,'<SHIP_TO>’ || dbms_xmlgen.convert(l_ship_to) || ‘</SHIP_TO>’); –Bug 18490513
–FND_FILE.PUT_LINE(FND_FILE.OUTPUT,'<SHIP_TO>’ || l_ship_to || ‘</SHIP_TO>’);
FND_FILE.PUT_LINE(FND_FILE.OUTPUT,'<CUSTOMER><![CDATA[ ‘ || l_customer_name || ‘]]></CUSTOMER>’);
FND_FILE.PUT_LINE(FND_FILE.OUTPUT,'<PICKUP_DATE>’ || l_pickup_date || ‘</PICKUP_DATE>’);
FND_FILE.PUT_LINE(FND_FILE.OUTPUT,'<DROPOFF_DATE>’ || l_dropoff_date || ‘</DROPOFF_DATE>’);
FND_FILE.PUT_LINE(FND_FILE.OUTPUT,'<SHIP_DATE>’ || l_ship_date || ‘</SHIP_DATE>’);
FND_FILE.PUT_LINE(FND_FILE.OUTPUT,'</TRIP>’);
END LOOP;
CLOSE c_dels_trips_for_order;
END IF; –check for sort by order
FND_FILE.PUT_LINE(FND_FILE.OUTPUT,'</SALES_ORDER>’);
END LOOP;
CLOSE c_so_for_delivery;
IF p_sort_per_criteria <> ‘O’ THEN –check for sort by order
FND_FILE.PUT_LINE(FND_FILE.OUTPUT,'</TRIP>’);
END IF; –check for sort by order
END LOOP;
CLOSE c_dels_for_trip;
–FND_FILE.PUT_LINE(FND_FILE.OUTPUT,'</TRIP>’);
END IF;
END LOOP;
END IF; –check for number of records in plsql table
— print empty trips
IF p_tbl_trip_purge_set.COUNT > 0 THEN –check for number of records in plsql table
FND_FILE.PUT_LINE(FND_FILE.OUTPUT,'<EMPTY_TRIPS>’);
l_buff_size := 0 ; — Reset the buffer size to zero
FOR l_trip_index in p_tbl_trip_purge_set.FIRST .. p_tbl_trip_purge_set.LAST
LOOP
l_trip_id := p_tbl_trip_purge_set(l_trip_index).trip_id;
l_trip_name := p_tbl_trip_purge_set(l_trip_index).trip_name;
IF (p_tbl_trip_purge_set(l_trip_index).purge_set_type = ‘EMPTYTRIPS’) THEN
l_empty_trip_count := l_empty_trip_count+1;
/*FND_FILE.PUT_LINE(FND_FILE.OUTPUT,'<TRIP>’);
IF P_SORT_PER_CRITERIA = ‘T’ THEN
FND_FILE.PUT_LINE(FND_FILE.OUTPUT, ‘<SORT_ID>’ || lpad(l_trip_id,10,’0′) || ‘</SORT_ID>’);
ELSIF P_SORT_PER_CRITERIA = ‘D’ THEN
FND_FILE.PUT_LINE(FND_FILE.OUTPUT, ‘<SORT_ID>999999999</SORT_ID>’);
END IF ;
FND_FILE.PUT_LINE(FND_FILE.OUTPUT, ‘<TRIP_ID>’ || l_trip_id || ‘</TRIP_ID>’);
FND_FILE.PUT_LINE(FND_FILE.OUTPUT,'<DELIVERY_ID></DELIVERY_ID>’);
FND_FILE.PUT_LINE(FND_FILE.OUTPUT,'</TRIP>’);*/
–Bug 8204644
IF ( l_buff_size = 0 AND l_empty_trip_count=1 ) THEN
l_buff_size := lengthb(l_trip_name);
FND_FILE.PUT(FND_FILE.OUTPUT,l_trip_name);
ELSIF ( l_buff_size = 0 AND l_empty_trip_count<>1 ) THEN
FND_FILE.PUT_LINE(FND_FILE.OUTPUT,’,’);
l_buff_size := lengthb(l_trip_name);
FND_FILE.PUT(FND_FILE.OUTPUT,l_trip_name);
ELSIF l_buff_size < 30000 THEN
l_buff_size := l_buff_size + lengthb(l_trip_name) + 2;
FND_FILE.PUT(FND_FILE.OUTPUT, ‘, ‘ || l_trip_name);
ELSIF l_buff_size >= 30000 THEN
l_buff_size := 0;
FND_FILE.PUT(FND_FILE.OUTPUT, ‘, ‘ || l_trip_name );
END IF;
–Bug 8204644
END IF;
END LOOP;
FND_FILE.PUT_LINE(FND_FILE.OUTPUT,'</EMPTY_TRIPS>’);
END IF; –check for number of records in plsql table
— print empty deliveries
IF p_tbl_delivery_purge_set.COUNT > 0 THEN –check for number of records in plsql table
FND_FILE.PUT_LINE(FND_FILE.OUTPUT,'<EMPTY_DELS>’);
l_buff_size := 0 ; — Reset the buffer size to zero
FOR l_delivery_index in p_tbl_delivery_purge_set.FIRST .. p_tbl_delivery_purge_set.LAST
LOOP
l_delivery_id := p_tbl_delivery_purge_set(l_delivery_index).delivery_id;
l_delivery_name := p_tbl_delivery_purge_set(l_delivery_index).delivery_name;
IF (p_tbl_delivery_purge_set(l_delivery_index).purge_set_type = ‘EMPTYDELS’) THEN
l_empty_del_count := l_empty_del_count+1 ;
–Bug 8204644
IF ( l_buff_size = 0 AND l_empty_del_count=1 ) THEN
l_buff_size := lengthb(l_delivery_name);
FND_FILE.PUT(FND_FILE.OUTPUT,l_delivery_name);
ELSIF ( l_buff_size = 0 AND l_empty_del_count<>1 ) THEN
FND_FILE.PUT_LINE(FND_FILE.OUTPUT,’,’);
l_buff_size := lengthb(l_delivery_name);
FND_FILE.PUT(FND_FILE.OUTPUT,l_delivery_name);
ELSIF l_buff_size < 30000 THEN
l_buff_size := l_buff_size + lengthb(l_delivery_name) + 2;
FND_FILE.PUT(FND_FILE.OUTPUT, ‘, ‘ || l_delivery_name);
ELSIF l_buff_size >= 30000 THEN
l_buff_size := 0;
FND_FILE.PUT(FND_FILE.OUTPUT, ‘, ‘ || l_delivery_name );
END IF;
–Bug 8204644
/*FND_FILE.PUT_LINE(FND_FILE.OUTPUT,'<TRIP>’);
IF P_SORT_PER_CRITERIA = ‘T’ THEN
FND_FILE.PUT_LINE(FND_FILE.OUTPUT, ‘<SORT_ID>999999999</SORT_ID>’);
ELSIF P_SORT_PER_CRITERIA = ‘D’ THEN
FND_FILE.PUT_LINE(FND_FILE.OUTPUT, ‘<SORT_ID>’ || lpad(l_delivery_id,10,’0′) || ‘</SORT_ID>’);
END IF ;
FND_FILE.PUT_LINE(FND_FILE.OUTPUT, ‘<TRIP_ID></TRIP_ID>’);
FND_FILE.PUT_LINE(FND_FILE.OUTPUT,'<DELIVERY_ID>’ || l_delivery_id || ‘</DELIVERY_ID>’);
FND_FILE.PUT_LINE(FND_FILE.OUTPUT,'</TRIP>’);*/
END IF;
END LOOP;
FND_FILE.PUT_LINE(FND_FILE.OUTPUT,'</EMPTY_DELS>’);
END IF; –check for number of records in plsql table
— print empty containers
IF p_tbl_container_purge_set.COUNT > 0 THEN –check for number of records in plsql table
FND_FILE.PUT_LINE(FND_FILE.OUTPUT,'<EMPTY_LPNS>’);
l_buff_size := 0 ; — Reset the buffer size to zero
FOR l_container_index in p_tbl_container_purge_set.FIRST .. p_tbl_container_purge_set.LAST
LOOP
l_container_id := p_tbl_container_purge_set(l_container_index).container_id;
l_container_name := p_tbl_container_purge_set(l_container_index).container_name;– Added for bug # 18312829
IF (p_tbl_container_purge_set(l_container_index).purge_set_type = ‘EMPTYLPNS’) THEN
l_empty_lpn_count := l_empty_lpn_count+1 ;
–Bug 8204644
IF ( l_buff_size = 0 AND l_empty_lpn_count=1 ) THEN
l_buff_size := lengthb(l_container_name);– bug # 18312829
FND_FILE.PUT(FND_FILE.OUTPUT,l_container_name);– bug # 18312829
ELSIF ( l_buff_size = 0 AND l_empty_lpn_count<>1 ) THEN
FND_FILE.PUT_LINE(FND_FILE.OUTPUT,’,’);
l_buff_size := lengthb(l_container_name); — bug # 18312829
FND_FILE.PUT(FND_FILE.OUTPUT,l_container_name); — bug # 18312829
ELSIF l_buff_size < 30000 THEN
l_buff_size := l_buff_size + lengthb(l_container_name) + 2;– bug # 18312829
FND_FILE.PUT(FND_FILE.OUTPUT, ‘, ‘ || l_container_name);– bug # 18312829
ELSIF l_buff_size >= 30000 THEN
l_buff_size := 0;
FND_FILE.PUT(FND_FILE.OUTPUT, ‘, ‘ || l_container_name );– bug # 18312829
END IF;
–Bug 8204644
/*FND_FILE.PUT_LINE(FND_FILE.OUTPUT,'<TRIP>’);
IF P_SORT_PER_CRITERIA = ‘T’ THEN
FND_FILE.PUT_LINE(FND_FILE.OUTPUT, ‘<SORT_ID>999999999</SORT_ID>’);
ELSIF P_SORT_PER_CRITERIA = ‘D’ THEN
FND_FILE.PUT_LINE(FND_FILE.OUTPUT, ‘<SORT_ID>’ || lpad(l_delivery_id,10,’0′) || ‘</SORT_ID>’);
END IF ;
FND_FILE.PUT_LINE(FND_FILE.OUTPUT, ‘<TRIP_ID></TRIP_ID>’);
FND_FILE.PUT_LINE(FND_FILE.OUTPUT,'<DELIVERY_ID>’ || l_delivery_id || ‘</DELIVERY_ID>’);
FND_FILE.PUT_LINE(FND_FILE.OUTPUT,'</TRIP>’);*/
END IF;
END LOOP;
FND_FILE.PUT_LINE(FND_FILE.OUTPUT,'</EMPTY_LPNS>’);
END IF; –check for number of records in plsql table
END IF; –check for print detail
FND_FILE.PUT_LINE(FND_FILE.OUTPUT,'<NON_EMPTY_COUNT>’ || l_nonempty_count || ‘</NON_EMPTY_COUNT>’);
FND_FILE.PUT_LINE(FND_FILE.OUTPUT,'<EMPTY_TRIP_COUNT>’ || l_empty_trip_count || ‘</EMPTY_TRIP_COUNT>’);
FND_FILE.PUT_LINE(FND_FILE.OUTPUT,'<EMPTY_DEL_COUNT>’ || l_empty_del_count || ‘</EMPTY_DEL_COUNT>’);
FND_FILE.PUT_LINE(FND_FILE.OUTPUT,'<EMPTY_LPN_COUNT>’ || l_empty_lpn_count || ‘</EMPTY_LPN_COUNT>’);
FND_FILE.PUT_LINE(FND_FILE.OUTPUT, ‘</ROWSET>’);
IF l_debug_on THEN
WSH_DEBUG_SV.pop(l_module_name);
END IF;
EXCEPTION
WHEN OTHERS THEN
x_return_status := WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR ;
l_err := SQLERRM;
IF l_debug_on THEN
WSH_DEBUG_SV.logmsg(l_module_name,’Unexpected error has occured. Oracle error message is ‘||
SQLERRM,WSH_DEBUG_SV.C_UNEXPEC_ERR_LEVEL);
WSH_DEBUG_SV.pop(l_module_name,’EXCEPTION:OTHERS’);
END IF;
END Generate_Purge_Report;
—————————————————————————–
—
— Procedure: Purge_Workflow
— Parameters: p_tbl_trip_purge_set pl/sql table of trip id’s eligible for purge
— p_tbl_delivery_purge_set pl/sql table of delivery id’s eligible for purge
— x_return_status – Returns WSH_UTIL_CORE.G_RET_STS_SUCCESS if Success
— Description: This API deletes the workflows for Trip and Delivery.
—————————————————————————–
PROCEDURE Purge_Workflow(p_tbl_trip_purge_set Trip_ID_Tbl_Type ,
p_tbl_delivery_purge_set Delivery_ID_Tbl_Type,
x_return_status OUT NOCOPY VARCHAR2) IS
l_debug_on BOOLEAN;
l_return_status VARCHAR2(1);
l_delivery_ids_tab WSH_UTIL_CORE.column_tab_type;
l_trip_ids_tab WSH_UTIL_CORE.column_tab_type;
l_success_count NUMBER;
l_module_name CONSTANT VARCHAR2(100) := ‘wsh.plsql.’ || G_PKG_NAME || ‘.’ || ‘PURGE_WORKFLOW’;
BEGIN
— Debug Statements
—
l_debug_on := WSH_DEBUG_INTERFACE.g_debug;
—
IF l_debug_on IS NULL THEN
l_debug_on := WSH_DEBUG_SV.is_debug_enabled;
END IF;
IF l_debug_on THEN
WSH_DEBUG_SV.push(l_module_name);
END IF;
x_return_status := WSH_UTIL_CORE.G_RET_STS_SUCCESS;
–Check for number of ids in delivery table
IF p_tbl_delivery_purge_set.COUNT > 0 THEN
FOR l_delivery_index in p_tbl_delivery_purge_set.FIRST .. p_tbl_delivery_purge_set.LAST
LOOP
l_delivery_ids_tab(l_delivery_index) := p_tbl_delivery_purge_set(l_delivery_index).delivery_id;
END LOOP;
IF l_debug_on THEN
WSH_DEBUG_SV.logmsg(l_module_name,’Calling program unit WSH_WF_STD.PURGE_ENTITY’, WSH_DEBUG_SV.C_PROC_LEVEL);
WSH_DEBUG_SV.logmsg(l_module_name,’no of delivery ids =’ || l_delivery_ids_tab.count, WSH_DEBUG_SV.C_PROC_LEVEL);
END IF;
WSH_WF_STD.Purge_Entity(
p_entity_type=> ‘DELIVERY’,
p_entity_ids=>l_delivery_ids_tab,
–p_action IN VARCHAR2 DEFAULT ‘PURGE’,
–p_docommit IN BOOLEAN DEFAULT FALSE,
x_success_count=> l_success_count,
x_return_status=> l_return_status) ;
IF l_debug_on THEN
WSH_DEBUG_SV.log(l_module_name,’L_RETURN_STATUS’,l_return_status);
WSH_DEBUG_SV.log(l_module_name,’L_SUCCESS_COUNT’,l_success_count);
END IF;
IF (l_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS) THEN
x_return_status := l_return_status;
IF l_debug_on THEN
WSH_DEBUG_SV.pop(l_module_name);
END IF;
RETURN;
END IF;
END IF; –Check for number of ids in delivery table
–Check for number of ids in trip table
IF p_tbl_trip_purge_set.COUNT > 0 THEN
FOR l_trip_index in p_tbl_trip_purge_set.FIRST .. p_tbl_trip_purge_set.LAST
LOOP
l_trip_ids_tab(l_trip_index) := p_tbl_trip_purge_set(l_trip_index).trip_id;
END LOOP;
IF l_debug_on THEN
WSH_DEBUG_SV.logmsg(l_module_name,’Calling program unit WSH_WF_STD.PURGE_ENTITY’, WSH_DEBUG_SV.C_PROC_LEVEL);
END IF;
WSH_WF_STD.Purge_Entity(
p_entity_type=> ‘TRIP’,
p_entity_ids=>l_trip_ids_tab,
–p_action IN VARCHAR2 DEFAULT ‘PURGE’,
–p_docommit IN BOOLEAN DEFAULT FALSE,
x_success_count=> l_success_count,
x_return_status=> l_return_status) ;
IF l_debug_on THEN
WSH_DEBUG_SV.log(l_module_name,’L_RETURN_STATUS’,l_return_status);
WSH_DEBUG_SV.log(l_module_name,’L_SUCCESS_COUNT’,l_success_count);
END IF;
IF (l_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS) THEN
x_return_status := l_return_status;
IF l_debug_on THEN
WSH_DEBUG_SV.pop(l_module_name);
END IF;
RETURN;
END IF;
END IF; –Check for number of ids in trip table
IF l_debug_on THEN
WSH_DEBUG_SV.pop(l_module_name);
END IF;
END Purge_Workflow;
—————————————————————————–
—
— Procedure: Validate_Trips
— Parameters: p_tbl_trip_purge_set pl/sql table of trip id’s eligible for purge
— x_tbl_trip_purge_set pl/sql table of trip id’s eligible for purge
— after validating all the LPNs belonging to the trip with WMS API
— x_return_status – Returns WSH_UTIL_CORE.G_RET_STS_SUCCESS if Success
— Description: This API call the WMS_Container_Grp API for checking the validity of
— each LPN belonging to a particular trip.
— The WMS LPN Purge API returns the list of LPN Ids that are eligible to
— be purged from WMS side. If the number of LPNs returned by WMS
— is same as the number of LPNs passed by this API that means that
— all the LPNs within the trip are eligible to be purged and the
— further validations for MDC/Moves can be performed on the trip.
— If the count is not same then the trip is marked as in eligible for
— purge and is excluded from the list of trips to be purged.
— This API also checks whether the trip is a part of valid Continuous
— Move(CM). A valid CM is one in which all the the trips are eligible
— for purge. If not then the Trip is not eligible to be purged.
— This API also checks whether the trip is a part of valid MDC
— configuration. A valid MDC configurationis one in which all
— the the trips are eligible for purge. If not then the Trip is
— not eligible to be purged.
—————————————————————————–
PROCEDURE Validate_Trips( p_tbl_trip_purge_set Trip_ID_Tbl_Type ,
x_tbl_trip_purge_set OUT NOCOPY Trip_ID_Tbl_Type ,
x_return_status OUT NOCOPY VARCHAR2) IS
l_debug_on BOOLEAN;
l_return_status VARCHAR2(1);
l_trip_id NUMBER;
l_move_id NUMBER;
l_lpn_id NUMBER;
l_trip_index NUMBER;
l_loop_index NUMBER;
l_old_move NUMBER;
l_new_move NUMBER;
l_mdc_trip NUMBER;
l_lpn_count NUMBER;
l_lpn_valid BOOLEAN;
l_move_valid BOOLEAN;
l_trip_valid BOOLEAN;
l_move_found BOOLEAN;
l_trip_found BOOLEAN;
l_err VARCHAR2(500);
sql_tripmove VARCHAR2(4000);
l_msg_count NUMBER;
l_msg_data VARCHAR2(32767);
l_wms_lpn_record WMS_Data_Type_Definitions_PUB.LPNPurgeRecordType;
–TYPE IDTableType IS TABLE OF NUMBER INDEX BY BINARY_INTEGER;
–l_lpn_ids IDTableType;
l_module_name CONSTANT VARCHAR2(100) := ‘wsh.plsql.’ || G_PKG_NAME || ‘.’ || ‘VALIDATE_TRIPS’;
TYPE PurgeCurType IS REF CURSOR;
c_trip_moves PurgeCurType; –The cursor gets all the moves their trips
–wherever the move has more than 1 trip
l_tbl_trip_moves Trip_moves_Tbl_Type;
l_tbl_trip_mdc WSH_UTIL_CORE.ID_TAB_TYPE;
CURSOR c_lpns_for_trip(p_tripid NUMBER) IS
SELECTwdd.lpn_id
FROMwsh_trips wt,
wsh_trip_stops wts,
wsh_delivery_legs wdl,
wsh_new_deliveries wnd,
wsh_delivery_assignments_v wda,
wsh_delivery_details wdd
WHEREwt.trip_id = wts.trip_id
ANDwts.stop_id = wdl.pick_up_stop_id
ANDwdl.delivery_id = wnd.delivery_id
ANDwda.delivery_id = wnd.delivery_id
ANDwda.delivery_detail_id = wdd.delivery_detail_id
ANDwdd.container_flag = ‘Y’
ANDwdd.lpn_id IS NOT NULL
ANDwts.trip_id = p_tripid
AND EXISTS
(SELECT 1
FROM wms_license_plate_numbers wlpn
WHERE wlpn.lpn_id = wdd.lpn_id ); — Bugfix 37755394
— Bug 5084113
/* Replaced the query below with a non recursive query
The query below was fetching,
1. All the deliveries of consolidation type( wnd.delivery_type = ‘CONSOLIDATION’ or wdl.parent_delivery_leg_id IS NULL )
2. Search for possible consolidations within the above list.
3. Build the list of deliveries under consolidation deliveries in step2 and identify the list of trips.
CURSOR c_get_mdc_trips(p_tripid NUMBER) IS
SELECT
DISTINCT wt1.trip_id
FROM
wsh_trips wt1,
wsh_trip_stops pickup_stop1,
wsh_trip_stops dropoff_stop1,
wsh_delivery_legs wdl1
WHERE
wdl1.pick_up_stop_id = pickup_stop1.stop_id AND
wdl1.drop_off_stop_id = dropoff_stop1.stop_id AND
wt1.trip_id = pickup_stop1.trip_id AND
wt1.trip_id = dropoff_stop1.trip_id AND
wdl1.delivery_id IN (SELECT delivery_id
FROM wsh_delivery_legs
START WITH delivery_id IN (SELECT delivery_id
FROM wsh_delivery_legs
WHERE parent_delivery_leg_id IS NULL
START WITH delivery_id IN (SELECT wdl.delivery_id
FROM
wsh_new_deliveries wnd,
wsh_delivery_legs wdl,
wsh_trip_stops pickup_stop,
wsh_trip_stops dropoff_stop,
wsh_trips wt
WHERE
wnd.delivery_id = wdl.delivery_id AND
wdl.pick_up_stop_id = pickup_stop.stop_id AND
wdl.drop_off_stop_id = dropoff_stop.stop_id AND
wt.trip_id = pickup_stop.trip_id AND
wt.trip_id = dropoff_stop.trip_id AND
((wnd.delivery_type = ‘CONSOLIDATION’)
OR
(wdl.parent_delivery_leg_id IS NULL)
) AND
wt.trip_id = p_tripid)
CONNECT BY delivery_leg_id = PRIOR parent_delivery_leg_id )
CONNECT BY parent_delivery_leg_id = PRIOR delivery_leg_id)
ORDER BY wt1.trip_id;
*/
CURSOR c_get_mdc_trips(p_tripid NUMBER) IS
SELECT
DISTINCT wt1.trip_id
FROM
wsh_trips wt1,
wsh_trip_stops wts,
wsh_delivery_legs wdl1
WHERE
(wdl1.pick_up_stop_id = wts.stop_id OR
wdl1.drop_off_stop_id = wts.stop_id) AND
wt1.trip_id = wts.trip_id AND
wdl1.delivery_id IN
(
SELECT delivery_id
FROM wsh_delivery_legs
WHERE parent_delivery_leg_id
IN
(
SELECT wdl.delivery_leg_id
FROM
wsh_delivery_legs wdl,
wsh_trip_stops wts,
wsh_trips wt
WHERE
(wdl.pick_up_stop_id = wts.stop_id OR
wdl.drop_off_stop_id = wts.stop_id) AND
wt.trip_id = wts.trip_id AND
wdl.parent_delivery_leg_id IS NULL AND
wt.trip_id = p_tripid
)
)
ORDER BY wt1.trip_id;
BEGIN
— Debug Statements
—
l_debug_on := WSH_DEBUG_INTERFACE.g_debug;
—
IF l_debug_on IS NULL THEN
l_debug_on := WSH_DEBUG_SV.is_debug_enabled;
END IF;
IF l_debug_on THEN
WSH_DEBUG_SV.push(l_module_name);
END IF;
x_return_status := WSH_UTIL_CORE.G_RET_STS_SUCCESS;
l_lpn_valid := TRUE;
IF (wsh_util_core.fte_is_installed=’Y’) THEN
sql_tripmove := ‘SELECT move_id, trip_id
FROM fte_trip_moves
WHERE move_id IN
(SELECT move_id
FROM fte_trip_moves
GROUP BY move_id
HAVING count(trip_id) >1 )
ORDER BY move_id’;
OPEN c_trip_moves FOR sql_tripmove;
FETCH c_trip_moves BULK COLLECT into l_tbl_trip_moves;
CLOSE c_trip_moves;
END IF;
FOR l_trip_index in p_tbl_trip_purge_set.FIRST .. p_tbl_trip_purge_set.LAST
LOOP
l_lpn_valid := TRUE;
l_trip_id := p_tbl_trip_purge_set(l_trip_index).trip_id;
–Get all the LPNs for the Trip
OPEN c_lpns_for_trip(l_trip_id);
FETCH c_lpns_for_trip BULK COLLECT into l_wms_lpn_record.LPN_IDs;
CLOSE c_lpns_for_trip;
l_lpn_count := l_wms_lpn_record.LPN_IDs.COUNT;
–call WMS API to check whether the LPN is eligible for purge
IF l_debug_on THEN
WSH_DEBUG_SV.logmsg(l_module_name,’Calling program unit WMS_CONTAINER_GRP.LPN_PURGE_ACTIONS’, WSH_DEBUG_SV.C_PROC_LEVEL);
END IF;
WMS_Container_GRP.LPN_Purge_Actions(p_api_version=>1.0,
p_init_msg_list=>FND_API.G_TRUE,
p_commit=>’FALSE’,
x_return_status=>l_return_status,
x_msg_count=>l_msg_count,
x_msg_data=>l_msg_data,
p_caller=>’WSH’,
p_action=>WMS_Container_GRP.G_LPN_PURGE_ACTION_VALIDATE,
p_lpn_purge_rec=> l_wms_lpn_record
);
IF l_debug_on THEN
WSH_DEBUG_SV.log(l_module_name,’L_RETURN_STATUS’,l_return_status);
–WSH_DEBUG_SV.log(l_module_name,’L_MSG_DATA’,l_msg_data); –Bugfix 37755394
END IF;
IF (l_return_status <> WSH_UTIL_CORE.G_RET_STS_SUCCESS) THEN
x_return_status := l_return_status;
IF l_debug_on THEN
WSH_DEBUG_SV.pop(l_module_name);
END IF;
RETURN;
END IF;
IF l_lpn_count <> l_wms_lpn_record.LPN_IDs.COUNT THEN
l_lpn_valid := FALSE;
END IF;
–Bugfix 37755394
IF l_debug_on THEN
WSH_DEBUG_SV.logmsg(l_module_name,’l_trip_id : ‘|| l_trip_id || ‘ l_lpn_count : ‘||l_lpn_count || ‘ l_wms_lpn_record.LPN_IDs.COUNT : ‘ || l_wms_lpn_record.LPN_IDs.COUNT );
WSH_DEBUG_SV.log(l_module_name,’l_lpn_valid’, l_lpn_valid );
END IF;
–Check for Trip Moves/MDC related validations only when LPN check returns TRUE
IF l_lpn_valid THEN — is there some other way to stop the loop here and
— and continue the loop with the next value ?
l_trip_valid := TRUE;
l_move_found := FALSE;
–Check for Trip Moves related validations
IF l_tbl_trip_moves.COUNT > 0 THEN
FOR l_loop_index in l_tbl_trip_moves.FIRST .. l_tbl_trip_moves.LAST
LOOP
IF l_tbl_trip_moves(l_loop_index).trip_id = l_trip_id THEN
l_move_id := l_tbl_trip_moves(l_loop_index).move_id;
l_move_found := TRUE;
FOR l_move_index in l_tbl_trip_moves.FIRST .. l_tbl_trip_moves.LAST
LOOP
l_old_move := l_new_move;
l_new_move :=l_tbl_trip_moves(l_move_index).move_id;
IF (l_old_move IS NOT NULL AND l_old_move <> l_new_move) THEN
EXIT;
END IF;
IF l_tbl_trip_moves(l_move_index).move_id = l_move_id THEN
l_trip_id := l_tbl_trip_moves(l_move_index).trip_id;
l_trip_valid := FALSE;
FOR l_index in p_tbl_trip_purge_set.FIRST .. p_tbl_trip_purge_set.LAST
LOOP
IF p_tbl_trip_purge_set(l_index).trip_id = l_trip_id THEN
l_trip_valid := TRUE;
END IF;
EXIT WHEN l_trip_valid;
END LOOP;
IF NOT l_trip_valid THEN
EXIT;
END IF;
END IF;
END LOOP;
END IF;
EXIT WHEN l_move_found;
END LOOP;
END IF;
–End Check for Trip Moves related validations
–Check for MDC related validations only if Trip Move related validation returns TRUE
IF l_trip_valid THEN
OPEN c_get_mdc_trips(l_trip_id);
FETCH c_get_mdc_trips BULK COLLECT into l_tbl_trip_mdc;
CLOSE c_get_mdc_trips;
–Check for MDC related validations
IF l_tbl_trip_mdc.COUNT > 1 THEN
FOR l_loop_index in l_tbl_trip_mdc.FIRST .. l_tbl_trip_mdc.LAST
LOOP
l_mdc_trip := l_tbl_trip_mdc(l_loop_index);
l_trip_valid := FALSE;
FOR l_index in p_tbl_trip_purge_set.FIRST .. p_tbl_trip_purge_set.LAST
LOOP
IF p_tbl_trip_purge_set(l_index).trip_id = l_mdc_trip THEN
l_trip_valid := TRUE;
END IF;
EXIT WHEN l_trip_valid;
END LOOP;
EXIT WHEN NOT l_trip_valid;
END LOOP;
END IF; –End check for MDC related validations
END IF;–Check for MDC related validations only if Trip Move related validation returns TRUE
END IF; –End Check for Trip Moves/MDC related validations only when LPN check returns TRUE
IF l_lpn_valid AND l_trip_valid THEN
x_tbl_trip_purge_set(x_tbl_trip_purge_set.COUNT+1).trip_id := p_tbl_trip_purge_set(l_trip_index).trip_id;
x_tbl_trip_purge_set(x_tbl_trip_purge_set.COUNT).trip_name := p_tbl_trip_purge_set(l_trip_index).trip_name;
x_tbl_trip_purge_set(x_tbl_trip_purge_set.COUNT).purge_set_type := p_tbl_trip_purge_set(l_trip_index).purge_set_type;
END IF ;
END LOOP;
IF l_debug_on THEN
WSH_DEBUG_SV.pop(l_module_name);
END IF;
EXCEPTION
WHEN OTHERS THEN
x_return_status := WSH_UTIL_CORE.G_RET_STS_UNEXP_ERROR ;
l_err := SQLERRM;
IF l_debug_on THEN
WSH_DEBUG_SV.logmsg(l_module_name,’Unexpected error has occured. Oracle error message is ‘||
SQLERRM,WSH_DEBUG_SV.C_UNEXPEC_ERR_LEVEL);
WSH_DEBUG_SV.pop(l_module_name,’EXCEPTION:OTHERS’);
END IF;
END Validate_Trips ;
END WSH_PURGE;
/
commit;
exit;
Step 2: Run the Shipping Purge Program with Validate DateShipping Purge navigation path
Step 3: Once completed the purge programvalidate the Delivery Details Tables to Ensure Some Data Remains Unpurged.
Step 4: Identify Deliveries That Are Still in ‘Open’ Status
4.1: To resolve this, use the API script to close the deliveries.
4.2: After Complete this process again rerun the purge program
Close delivery API script
set serveroutput on;
DECLARE
l_operation VARCHAR2 (30) := ‘Close Delivery ‘;
x_return_status VARCHAR2 (1);
x_msg_data VARCHAR2 (2000);
x_msg_count VARCHAR2 (2000);
–Standard Parameters.
p_api_version_number NUMBER;
init_msg_list VARCHAR2 (30);
x_msg_details VARCHAR2 (3000);
x_msg_summary VARCHAR2 (3000);
p_validation_level NUMBER;
p_commit VARCHAR2 (30);
–Parameters for WSH_DELIVERIES_PUB.Delivery_Action.
p_action_code VARCHAR2 (15);
p_delivery_id NUMBER;
p_delivery_name VARCHAR2 (30);
p_asg_trip_id NUMBER;
p_asg_trip_name VARCHAR2 (30);
p_asg_pickup_stop_id NUMBER;
p_asg_pickup_loc_id NUMBER;
p_asg_pickup_loc_code VARCHAR2 (30);
p_asg_pickup_arr_date DATE;
p_asg_pickup_dep_date DATE;
p_asg_dropoff_stop_id NUMBER;
p_asg_dropoff_loc_id NUMBER;
p_asg_dropoff_loc_code VARCHAR2 (30);
p_asg_dropoff_arr_date DATE;
p_asg_dropoff_dep_date DATE;
p_sc_action_flag VARCHAR2 (10);
p_sc_close_trip_flag VARCHAR2 (10);
p_sc_create_bol_flag VARCHAR2 (10);
p_sc_stage_del_flag VARCHAR2 (10);
p_sc_trip_ship_method VARCHAR2 (30);
p_sc_actual_dep_date VARCHAR2 (30);
p_sc_report_set_id NUMBER;
p_sc_report_set_name VARCHAR2 (60);
p_wv_override_flag VARCHAR2 (10);
x_trip_id VARCHAR2 (30);
x_trip_name VARCHAR2 (30);
CURSOR c1
IS
SELECT delivery_id
FROM wsh_new_deliveries wnd
WHERE 1 = 1
AND status_code = ‘OP’
–AND planned_flag = ‘N’
AND trunc(initial_pickup_date) <= ’31-DEC-2017′;
—
BEGIN
—
x_return_status := wsh_util_core.g_ret_sts_success;
fnd_global.apps_initialize (user_id => 1318,
resp_id => 21623,
resp_appl_id => 660
);
–========================================================================
— Delivery Action API (Pick Release)
–========================================================================
FOR rec_close IN c1
LOOP
p_action_code := ‘CLOSE’;
p_delivery_id := rec_close.delivery_id;
wsh_deliveries_pub.delivery_action
(p_api_version_number => 1.0,
p_init_msg_list => init_msg_list,
x_return_status => x_return_status,
x_msg_count => x_msg_count,
x_msg_data => x_msg_data,
p_action_code => p_action_code,
p_delivery_id => p_delivery_id,
p_delivery_name => p_delivery_name,
p_asg_trip_id => p_asg_trip_id,
p_asg_trip_name => p_asg_trip_name,
p_asg_pickup_stop_id => p_asg_pickup_stop_id,
p_asg_pickup_loc_id => p_asg_pickup_loc_id,
p_asg_pickup_loc_code => p_asg_pickup_loc_code,
p_asg_pickup_arr_date => p_asg_pickup_arr_date,
p_asg_pickup_dep_date => p_asg_pickup_dep_date,
p_asg_dropoff_stop_id => p_asg_dropoff_stop_id,
p_asg_dropoff_loc_id => p_asg_dropoff_loc_id,
p_asg_dropoff_loc_code => p_asg_dropoff_loc_code,
p_asg_dropoff_arr_date => p_asg_dropoff_arr_date,
p_asg_dropoff_dep_date => p_asg_dropoff_dep_date,
p_sc_action_flag => p_sc_action_flag,
p_sc_close_trip_flag => p_sc_close_trip_flag,
p_sc_create_bol_flag => p_sc_create_bol_flag,
p_sc_stage_del_flag => p_sc_stage_del_flag,
p_sc_trip_ship_method => p_sc_trip_ship_method,
p_sc_actual_dep_date => p_sc_actual_dep_date,
p_sc_report_set_id => p_sc_report_set_id,
p_sc_report_set_name => p_sc_report_set_name,
p_wv_override_flag => p_wv_override_flag,
x_trip_id => x_trip_id,
x_trip_name => x_trip_name
);
–========================================================================
— COMMIT/ROLLBACK
–========================================================================
IF x_return_status = wsh_util_core.g_ret_sts_success
THEN
—DBMS_OUTPUT.put_line (l_operation || ‘ done successfully.’);
COMMIT;
ELSE
DBMS_OUTPUT.put_line (‘Failure.’);
DBMS_OUTPUT.put_line (‘Return Status = ‘ || x_return_status);
wsh_util_core.get_messages (‘Y’,
x_msg_data,
x_msg_details,
x_msg_count
);
DBMS_OUTPUT.put_line (l_operation || ‘: ‘);
DBMS_OUTPUT.put_line (‘Summary: ‘ || SUBSTRB (x_msg_data, 1, 200));
DBMS_OUTPUT.put_line (‘Detail: ‘ || SUBSTRB (x_msg_details, 1, 200));
ROLLBACK;
END IF;
END LOOP;
END;
/
Step 5: Rerun the Shipping Purge Program
Some delivery records were successfully purged, but certain data remains unpurged.
5.1: Revalidate the delivery details associated with the unpurged data.
5.2: It was observed that certain deliveries remain in ‘Open’ status due to an associated Planned flag. Appropriate API scripts were identified to unplan the corresponding delivery details
5.3: Execute the API script to unplan the delivery details. After completion, apply the ‘Close Delivery’ API.
UNPLAN API SCRIPT
set serveroutput on;
DECLARE
cursor c1_records is
SELECT *
FROM wsh_new_deliveries wnd
WHERE 1 = 1
AND planned_flag = ‘Y’
AND trunc(initial_pickup_date) <= ’31-DEC-2017′;
l_userid number := 36543 ;
l_respid number := 21623;
l_applid number := 660;
l_P_API_VERSION_NUMBER NUMBER :=1.0 ;
l_P_INIT_MSG_LIST VARCHAR2(200) ;
l_X_RETURN_STATUS VARCHAR2(2000) ;
l_X_MSG_COUNT NUMBER ;
l_X_MSG_DATA VARCHAR2(2000) ;
l_P_ACTION_CODE VARCHAR2(20) := ‘UNPLAN’;
–l_P_DELIVERY_ID NUMBER ;
l_P_DELIVERY_NAME VARCHAR2(200) ;
l_X_TRIP_ID VARCHAR2(2000) ;
l_X_TRIP_NAME VARCHAR2(2000) ;
Begin
dbms_output.put_line(‘***** Testing WSH_DELIVERIES_PUB.Delivery_Action *****’);
fnd_global.apps_initialize(user_id => l_userid,
resp_id => l_respid,
resp_appl_id => l_applid
);
for I in c1_records LOOP
if I.planned_flag = ‘Y’ then
–dbms_output.put_line(‘Updated the successfully’);
WSH_DELIVERIES_PUB.Delivery_Action(
p_api_version_number => l_P_API_VERSION_NUMBER,
p_init_msg_list => l_p_init_msg_list,
x_return_status => l_x_return_status,
x_msg_count => l_x_msg_count,
x_msg_data => l_x_msg_data,
p_action_code => ‘UNPLAN’,
p_delivery_id => I.DELIVERY_ID ,
x_trip_id => l_x_trip_id,
x_trip_name => l_x_trip_name);
IF (l_x_return_status = wsh_util_core.g_ret_sts_success)
THEN
dbms_output.put_line(‘Success’||I.DELIVERY_ID);
else
dbms_output.put_line(‘Error’||I.DELIVERY_ID);
end if;
end if;
end loop;
COMMIT;
End ;
/
Step 6: After completing the Shipping Purge Program, revalidate the delivery statuses to identify any remaining unpurged records. Deliveries that are still in ‘In Transit’ status and not yet closed may require further investigation.
6.1: To resolve this type of issue during the Shipping Purge process, ensure that the ‘In Transit Purge’ parameter is set to ‘Yes’ before submitting the program. This will allow the purge process to include and remove the related ‘In Transit’ delivery data.IN Transit Parameter scre shot
Step 7: Run the Shipping Purge process again as a small number of records still remain.
7.1: It is identified that some deliveries are associated with Orphan Records.
As per SR 3-39959404543 manually change the status with help of SQL UPDATE statement
CREATE TABLE del_dev_208 AS
select
*
from
wsh_delivery_assignments wda,
wsh_delivery_details wdd,
wsh_new_deliveries wnd
where
wda.delivery_detail_id = wdd.delivery_detail_id
and wda.delivery_id = wnd.delivery_id
and wdd.source_code = ‘OE’
and wdd.released_status =’C’
and trunc(wnd.initial_pickup_date) <= ’31-DEC-2017′;
update wsh_Delivery_Details
set
source_header_id = -1
, source_line_id = -1
, source_header_number = ‘-‘
, source_line_number = ‘-‘
, last_updated_by = -1
, last_update_date = sysdate
where delivery_Detail_id in ( select
wdd.delivery_Detail_id
from
wsh_delivery_assignments wda,
wsh_delivery_details wdd,
wsh_new_deliveries wnd
where
wda.delivery_detail_id = wdd.delivery_detail_id
and wda.delivery_id = wnd.delivery_id
and wdd.source_code = ‘OE’
and wdd.released_status =’C’
and trunc(wnd.initial_pickup_date) <= ’31-DEC-2017′);
update wsh_delivery_assignments
set delivery_id = null
, parent_delivery_detail_id = null
, last_updated_by = -1
, last_update_date = sysdate
where delivery_detail_id in ( select
wdd.delivery_Detail_id
from
wsh_delivery_assignments wda,
wsh_delivery_details wdd,
wsh_new_deliveries wnd
where
wda.delivery_detail_id = wdd.delivery_detail_id
and wda.delivery_id = wnd.delivery_id
and wdd.source_code = ‘OE’
and wdd.released_status =’C’
and trunc(wnd.initial_pickup_date) <= ’31-DEC-2017′);
Step 8: After completing the Shipping Purge, some records were still not purged. Upon further analysis, it was found that some deliveries were associated with closed trips.
8.1: For this type of data, use the PL/SQL delete script provided by Oracle Support Followed by SR 3-39959404543 which is specifically designed to purge only the closed trip details.
8.2: Apply the script only to those records that are part of closed trips. After applying the script, run the Shipping Purge program again.
8.3: Once these steps were completed, the Shipping Purge program was executed successfully, and the data was purged as expected.
CREATE TABLE del_assign_37732674 AS
select wdl.* from
wsh_trips wt,
wsh_trip_stops wts,
wsh_delivery_legs wdl,
wsh_new_deliveries wnd
WHERE wt.trip_id = wts.trip_id
AND wts.stop_id = wdl.pick_up_stop_id
AND wdl.delivery_id = wnd.delivery_id
and not exists (select 1 from wsh_delivery_assignments wda where wda.delivery_id = wnd.delivery_id )
and wnd.INITIAL_PICKUP_DATE BETWEEN ’01-JAN-1999′ AND ’31-DEC-2017′;
—————————————————————————————–
SET SERVEROUTPUT ON size 100000000;
DECLARE
l_records_affected NUMBER := 0;
CURSOR cur_details
IS
select wdl.DELIVERY_LEG_ID from
wsh_trips wt,
wsh_trip_stops wts,
wsh_delivery_legs wdl,
wsh_new_deliveries wnd
WHERE wt.trip_id = wts.trip_id
AND wts.stop_id = wdl.pick_up_stop_id
AND wdl.delivery_id = wnd.delivery_id
and not exists (select 1 from wsh_delivery_assignments wda where wda.delivery_id = wnd.delivery_id )
and wnd.INITIAL_PICKUP_DATE BETWEEN ’01-JAN-1999′ AND ’31-DEC-2017′;
BEGIN
FOR rec IN cur_details
LOOP
delete from wsh_delivery_legs
where DELIVERY_LEG_ID = rec.DELIVERY_LEG_ID;
l_records_affected := l_records_affected + 1;
END LOOP;
EXCEPTION
WHEN OTHERS THEN
dbms_output.put_line( l_records_affected|| ‘Before exception records updated.’);
dbms_output.put_line(‘Error occurred: ‘ || SQLERRM);
ROLLBACK;
END ;
Step 9: After completing these steps, the Shipping Purge Program was executed again and successfully completed. The data was purged as expected.