DBA Data[Home] [Help]

PACKAGE BODY: APPS.CSP_SCH_INT_PVT

Source


1 PACKAGE BODY CSP_SCH_INT_PVT AS
2 /* $Header: cspgscib.pls 120.9.12010000.3 2008/11/07 10:37:18 htank ship $ */
3 -- Start of Comments
4 -- Package name     : CSP_SCH_INT_PVT
5 -- Purpose          :
6 -- History          :
7 -- NOTE             :
8 -- End of Comments
9 
10     G_PKG_NAME CONSTANT VARCHAR2(30):= 'CSP_SCH_INT_PVT';
11    G_FILE_NAME CONSTANT VARCHAR2(12) := 'cspgscib.pls';
12 
13    g_interval  CSP_SCH_INT_PVT.csp_sch_interval_rec_typ;
14    g_schedular_call  VARCHAR2(1) := 'Y' ;
15    g_shipto_timezone_id NUMBER;
16    g_earliest_delivery_date Date := sysdate + 365 * 10;
17    TYPE CSP_RESOURCE_ORG_REC_TYP IS RECORD(resource_id      NUMBER
18                                           ,resource_type    VARCHAR2(30)
19                                           ,organization_id  NUMBER
20                                           ,sub_inv_code     VARCHAR2(10));
21 
22    TYPE CSP_RESOURCE_ORG_tbl_TYP IS TABLE OF CSP_SCH_INT_PVT.CSP_RESOURCE_ORG_REC_TYP ;
23 
24    TYPE CSP_SHIP_PARAMETERS_REC_TYPE IS RECORD( resource_id        NUMBER
25                                                ,resource_type      VARCHAR2(30)
26                                                ,lead_time          NUMBER
27                                                ,transfer_cost      NUMBER
28                                                ,shipping_methodes  VARCHAR2(4000)
29                                                ,arrival_date       DATE);
30 
31    TYPE CSP_SHIP_PARAMETERS_TBL_TYPE IS TABLE OF CSP_SCH_INT_PVT.CSP_SHIP_PARAMETERS_REC_TYPE ;
32 
33    TYPE CSP_ORGS_SHIP_PARAM_REC_TYPE IS RECORD(resource_id         NUMBER
34                                                ,resource_type      VARCHAR2(30)
35                                                ,from_org_id        NUMBER
36                                                ,to_org_id          NUMBER
37                                                ,quantity           NUMBER
38                                                ,lead_time          NUMBER
39                                                ,transfer_cost      NUMBER
40                                                ,shipping_method    VARCHAR2(30)
41                                                ,delivery_time      DATE);
42 
43    TYPE CSP_ORGS_SHIP_PARAM_TBL_TYPE IS TABLE OF CSP_SCH_INT_PVT.CSP_ORGS_SHIP_PARAM_REC_TYPE;
44 
45 
46    TYPE CSP_SHIP_QUANTITY_REC_TYPE IS RECORD(resource_id    NUMBER
47                                         ,resource_type      VARCHAR2(30)
48                                         ,from_org_id        NUMBER
49                                         ,to_org_id          NUMBER
50                                         ,quantity           NUMBER
51                                         ,destination_location_id      NUMBER);
52 
53    TYPE CSP_SHIP_QUANTITY_TBL_TYPE IS TABLE OF CSP_SCH_INT_PVT.CSP_SHIP_QUANTITY_REC_TYPE ;
54 
55    TYPE CSP_SHIP_METHOD_COUNT_REC_TYP IS RECORD(from_org_id         NUMBER
56                                                 ,to_org_id          NUMBER
57                                                 ,shipping_methodes  NUMBER
58                                                 ,min_leadtime       NUMBER
59                                                 ,max_leadtime       NUMBER);
60 
61 
62    TYPE CSP_SHIP_METHOD_COUNT_TBL_TYP IS TABLE OF CSP_SCH_INT_PVT.CSP_SHIP_METHOD_COUNT_REC_TYP ;
63 
64 
65     TYPE org_ship_methodes IS RECORD(from_org NUMBER,
66                                          to_org   NUMBER,
67                                          shipping_methode varchar2(30));
68 
69     TYPE org_ship_methodes_tbl_type IS TABLE OF csp_sch_int_pvt.org_ship_methodes ;
70     TYPE csp_req_line_details_rec_typ is  RECORD(req_line_detail_id    NUMBER
71                                                 ,requirement_line_id   NUMBER
72                                                 ,source_type           varchar2(30)
73                                                 ,source_id            NUMBER);
74     TYPE csp_req_line_details_tabl_typ is table of csp_req_line_details_rec_typ;
75 
76    PROCEDURE GET_ORGANIZATION_SUBINV(p_resources            IN  CSP_SCH_INT_PVT.csp_sch_resource_tbl_typ
77                                     ,x_resource_org_subinv  OUT NOCOPY CSP_SCH_INT_PVT.csp_resource_org_tbl_typ
78                                     ,x_return_status        OUT NOCOPY VARCHAR2
79                                     ,x_msg_data             OUT NOCOPY VARCHAR2
80                                     ,x_msg_count            OUT NOCOPY NUMBER);
81 
82    PROCEDURE GET_PARTS_LIST(p_task_id       IN NUMBER
83                            ,p_likelihood    IN NUMBER
84                            ,x_parts_list    OUT NOCOPY CSP_SCH_INT_PVT.csp_parts_tbl_typ1
85                            ,x_return_status OUT NOCOPY VARCHAR2
86                            ,x_msg_data      OUT NOCOPY VARCHAR2
87                            ,x_msg_count     OUT NOCOPY NUMBER);
88 
89    PROCEDURE CHECK_LOCAl_INVENTORY( p_resource_org_subinv  IN  CSP_SCH_INT_PVT.CSP_RESOURCE_ORG_tbl_TYP
90                                    ,p_parts_list           IN  CSP_SCH_INT_PVT.CSP_PARTS_TBL_TYP1
91                                    ,x_unavailable_list    OUT NOCOPY  CSP_SCH_INT_PVT.CSP_UNAVAILABILITY_TBL_TYPE
92                                    ,x_available_list      OUT NOCOPY  CSP_SCH_INT_PVT.CSP_AVAILABILITY_TBL_TYPE
93                                    ,x_return_status       OUT NOCOPY VARCHAR2
94                                    ,x_msg_data            OUT NOCOPY VARCHAR2
95                                    ,x_msg_count           OUT NOCOPY NUMBER);
96 
97    PROCEDURE DO_ATP_CHECK(p_unavailable_list       IN     CSP_SCH_INT_PVT.CSP_UNAVAILABILITY_TBL_TYPE
98                          ,p_interval               IN     CSP_SCH_INT_PVT.csp_sch_interval_rec_typ
99                          ,px_available_list        IN OUT NOCOPY CSP_SCH_INT_PVT.CSP_AVAILABILITY_TBL_TYPE
100                          ,x_final_unavailable_list OUT NOCOPY    CSP_SCH_INT_PVT.CSP_UNAVAILABILITY_TBL_TYPE
101                          ,x_return_status          OUT NOCOPY    VARCHAR2
102                          ,x_msg_data               OUT NOCOPY    VARCHAR2
103                          ,x_msg_count              OUT NOCOPY    NUMBER);
104 
105    PROCEDURE ELIGIBLE_RESOURCES(p_resource_list            IN  CSP_SCH_INT_PVT.CSP_SCH_RESOURCE_tbl_TYP
106                                ,p_available_list           IN  CSP_SCH_INT_PVT.CSP_AVAILABILITY_TBL_TYPE
107                                ,p_final_unavailable_list   IN  CSP_SCH_INT_PVT.CSP_UNAVAILABILITY_TBL_TYPE
108                                ,x_eligible_resources_list  OUT NOCOPY CSP_SCH_INT_PVT.CSP_AVAILABILITY_TBL_TYPE
109                                ,x_return_status            OUT NOCOPY VARCHAR2
110                                ,x_msg_data                 OUT NOCOPY VARCHAR2
111                                ,x_msg_count                OUT NOCOPY NUMBER);
112 
113    PROCEDURE CONSOLIDATE_QUANTITIES(p_eligible_resources_list IN  CSP_SCH_INT_PVT.CSP_AVAILABILITY_TBL_TYPE
114                                    ,x_ship_quantity           OUT NOCOPY    CSP_SCH_INT_PVT.CSP_SHIP_QUANTITY_TBL_TYPE
115                                    ,x_return_status OUT NOCOPY VARCHAR2
116                                    ,X_MSG_DATA      OUT NOCOPY VARCHAR2
117                                    ,x_msg_count     OUT NOCOPY NUMBER);
118 
119 
120    PROCEDURE EXTEND_ATP_REC(p_atp_rec IN OUT NOCOPY MRP_ATP_PUB.ATP_REC_TYP
121                              ,x_return_status OUT NOCOPY VARCHAR2);
122 
123    /*PROCEDURE GET_TIME_COST(p_eligible_resources_list  IN  CSP_SCH_INT_PVT.CSP_AVAILABILITY_TBL_TYPE
124                           ,x_options                  OUT NOCOPY CSP_SCH_INT_PVT.csp_sch_options_tab_typ
125                           ,x_return_status            OUT NOCOPY VARCHAR2);*/
126 
127    PROCEDURE BUILD_FINAL_LIST(p_temp_options  IN  CSP_SCH_INT_PVT.CSP_SHIP_PARAMETERS_TBL_TYPE
128                                ,px_options IN OUT NOCOPY CSP_SCH_INT_PVT.csp_sch_options_tbl_typ
129                                ,x_return_status OUT NOCOPY VARCHAR2
130                                ,x_msg_data      OUT NOCOPY VARCHAR2
131                                ,x_msg_count     OUT NOCOPY NUMBER);
132 
133    PROCEDURE OPTIMIZE_OPTIONS(p_eligible_resources IN  CSP_SCH_INT_PVT.CSP_AVAILABILITY_TBL_TYPE
134                               ,px_options       IN OUT NOCOPY CSP_SCH_INT_PVT.CSP_SHIP_PARAMETERS_TBL_TYPE
135                               ,x_ship_count        OUT NOCOPY CSP_SCH_INT_PVT.CSP_SHIP_METHOD_COUNT_TBL_TYP
136                               ,x_ship_parameters   OUT NOCOPY CSP_SCH_INT_PVT.CSP_ORGS_SHIP_PARAM_TBL_TYPE
137                               ,x_return_status     OUT NOCOPY VARCHAR2
138                               ,x_msg_data          OUT NOCOPY VARCHAR2
139                               ,x_msg_count         OUT NOCOPY NUMBER);
140 
141    PROCEDURE GET_SHIPPING_PARAMETERS(p_ship_quantity            IN CSP_SCH_INT_PVT.CSP_SHIP_QUANTITY_TBL_TYPE
142                                     ,x_resource_ship_parameters OUT NOCOPY CSP_SCH_INT_PVT.CSP_ORGS_SHIP_PARAM_TBL_TYPE
143                                     ,x_ship_count               OUT NOCOPY CSP_SCH_INT_PVT.CSP_SHIP_METHOD_COUNT_TBL_TYP
144                                     ,x_return_status            OUT NOCOPY VARCHAR2
145                                     ,x_msg_data                 OUT NOCOPY VARCHAR2
146                                     ,x_msg_count                OUT NOCOPY NUMBER);
147 
148    PROCEDURE GET_TIME_COST(p_eligible_resources_list  IN  CSP_SCH_INT_PVT.CSP_AVAILABILITY_TBL_TYPE
149                           ,x_options                  OUT NOCOPY CSP_SCH_INT_PVT.csp_sch_options_tbl_typ
150                           ,x_return_status            OUT NOCOPY VARCHAR2
151                           ,x_msg_data                 OUT NOCOPY VARCHAR2
152                           ,x_msg_count                OUT NOCOPY NUMBER);
153 
154 
155    PROCEDURE CANCEL_ORDER(p_order_id       IN  NUMBER
156                          ,x_return_status  OUT NOCOPY VARCHAR2
157                          ,x_msg_data       OUT NOCOPY VARCHAR2
158                          ,x_msg_count      OUT NOCOPY NUMBER);
159 
160    PROCEDURE GET_SHIPPING_METHODE(p_from_org_id     IN   NUMBER,
161                                    p_to_org_id        IN   NUMBER,
162                                    p_need_by_date     IN   DATE,
163                                    p_timezone_id      IN   NUMBER,
164                                    x_shipping_methode OUT NOCOPY  VARCHAR2,
165                                    x_intransit_time   OUT NOCOPY  NUMBER,
166                                    x_return_status    OUT NOCOPY  VARCHAR2
167                                    , x_msg_data       OUT NOCOPY  VARCHAR2
168                                    , x_msg_count      OUT NOCOPY  NUMBER);
169 
170 
171 
172     PROCEDURE TRANSFER_RESERVATION(p_reservation_id  IN  NUMBER
173                                    ,p_order_header_id IN  NUMBER
174                                    ,p_order_line_id   IN  NUMBER
175                                    ,x_return_status   OUT NOCOPY VARCHAR2
176                                    ,x_reservation_id   OUT NOCOPY NUMBER
177                                    ,x_msg_data        OUT NOCOPY VARCHAR2
178                                    ,x_msg_count       OUT NOCOPY NUMBER);
179 
180     PROCEDURE strip_into_lines (px_options          IN  OUT NOCOPY    CSP_SCH_INT_PVT.CSP_SHIP_PARAMETERS_TBL_TYPE
181                                  ,p_ship_count      IN      CSP_SCH_INT_PVT.CSP_SHIP_METHOD_COUNT_TBL_TYP
182                                  ,p_res_ship_parameters IN  CSP_SCH_INT_PVT.CSP_ORGS_SHIP_PARAM_TBL_TYPE
183                                  ,px_available_list     IN OUT NOCOPY CSP_SCH_INT_PVT.CSP_AVAILABILITY_TBL_TYPE
184                                  ,x_msg_data           OUT NOCOPY varchar2
185                                  ,x_return_status      OUT NOCOPY varchar2
186                                  ,x_msg_count          OUT NOCOPY NUMBER);
187 
188    FUNCTION get_order_by_date(p_org_id IN NUMBER,
189                                 p_ship_method varchar2,
190                                 p_need_by_date IN DATE,
191                                 p_lead_time IN NUMBER,
192                                 p_to_org_id IN NUMBER) return  DATE ;
193  procedure get_session_id(p_database_link IN varchar2, x_sesssion_id OUT NOCOPY NUMBER);
194 
195  PROCEDURE DELETE_RESERVATION(p_reservation_id IN NUMBER
196                                 ,x_return_status     OUT NOCOPY VARCHAR2
197                                 ,x_msg_data         OUT NOCOPY VARCHAR2);
198 
199    PROCEDURE GET_AVAILABILITY_OPTIONS(p_api_version_number  IN  NUMBER
200                                       ,p_task_id            IN  NUMBER
201                                       ,p_resources          IN  CSP_SCH_INT_PVT.csp_sch_resource_tbl_typ
202                                       ,p_interval           IN  CSP_SCH_INT_PVT.csp_sch_interval_rec_typ
203                                       ,p_likelihood         IN  NUMBER
204                                       ,p_subinv_only        IN  BOOLEAN
205                                       ,x_options            OUT NOCOPY CSP_SCH_INT_PVT.csp_sch_options_tbl_typ
206                                       ,x_return_status      OUT NOCOPY VARCHAR2
207                                       ,x_msg_data           OUT NOCOPY VARCHAR2
208                                       ,x_msg_count          OUT NOCOPY NUMBER) IS
209 
210         l_resource_org_subinv     CSP_SCH_INT_PVT.CSP_RESOURCE_ORG_tbl_TYP;
211         l_parts_list              CSP_SCH_INT_PVT.CSP_PARTS_TBL_TYP1 ;
212         l_unavailable_list        CSP_SCH_INT_PVT.CSP_UNAVAILABILITY_TBL_TYPE ;
213         l_available_list          CSP_SCH_INT_PVT.CSP_AVAILABILITY_TBL_TYPE ;
214         l_final_available_list    CSP_SCH_INT_PVT.CSP_AVAILABILITY_TBL_TYPE ;
215         l_eligible_resources_list CSP_SCH_INT_PVT.CSP_AVAILABILITY_TBL_TYPE ;
216         l_final_unavailable_list  CSP_SCH_INT_PVT.CSP_UNAVAILABILITY_TBL_TYPE ;
217         l_return_status           VARCHAR2(128) := FND_API.G_RET_STS_SUCCESS;
218         l_del_date                VARCHAR2(50);
219         l_api_name                VARCHAR2(60) := 'CSP_SCH_INT_PVT.GET_AVAILABILITY_OPTIONS';
220         l_temp_line_id            NUMBER;
221 
222          cursor get_line_id is
223         select distinct(crl.requirement_line_id) req_line_id
224         from csp_requirement_lines  crl,csp_requirement_headers crh
225         where crh.task_id = p_task_id
226         and crl.requirement_header_id = crh.requirement_header_id;
227    BEGIN
228 
229         l_resource_org_subinv     := CSP_SCH_INT_PVT.CSP_RESOURCE_ORG_tbl_TYP();
230        -- l_parts_list              := CSP_SCH_INT_PVT.CSP_PARTS_TBL_TYP1();
231         l_unavailable_list        := CSP_SCH_INT_PVT.CSP_UNAVAILABILITY_TBL_TYPE();
232         l_available_list          := CSP_SCH_INT_PVT.CSP_AVAILABILITY_TBL_TYPE ();
233         l_eligible_resources_list := CSP_SCH_INT_PVT.CSP_AVAILABILITY_TBL_TYPE() ;
234         l_final_unavailable_list  := CSP_SCH_INT_PVT.CSP_UNAVAILABILITY_TBL_TYPE();
235         x_options :=  CSP_SCH_INT_PVT.csp_sch_options_tbl_typ();
236         x_return_status := FND_API.G_RET_STS_SUCCESS;
237         g_interval := p_interval;
238         CSP_SCH_INT_PVT.GET_ORGANIZATION_SUBINV(p_resources, l_resource_org_subinv , x_return_status,x_msg_data,x_msg_count);
239         IF x_return_status <> FND_API.G_RET_STS_SUCCESS THEN
240             RETURN;
241         END IF;
242         CSP_SCH_INT_PVT.GET_PARTS_LIST(p_task_id,p_likelihood,l_parts_list,x_return_status,x_msg_data,x_msg_count);
243         IF x_return_status <> FND_API.G_RET_STS_SUCCESS THEN
244             RETURN;
245         END IF;
246         IF l_parts_list.count = 0 THEN
247             x_return_status := FND_API.G_RET_STS_SUCCESS;
248             FOR I IN 1..p_resources.count LOOP
249                 x_options.extend;
250                 x_options(x_options.count).resource_id   := p_resources(I).resource_id;
251                 x_options(x_options.count).resource_type := p_resources(I).resource_type;
252                 x_options(x_options.count).start_time    := NULL;
253                 x_options(x_options.count).transfer_cost := NULL;
254             END LOOP;
255             RETURN;
256         END IF;
257          IF l_parts_list.count > 0 THEN
258             CSP_SCH_INT_PVT.CHECK_LOCAl_INVENTORY(l_resource_org_subinv,l_parts_list,l_unavailable_list,l_final_available_list,x_return_status,x_msg_data,x_msg_count);
259             IF x_return_status <> FND_API.G_RET_STS_SUCCESS THEN
260                 RETURN;
261             END IF ;
262             IF  l_unavailable_list.count > 0 AND (NOT p_subinv_only) AND
263             (fnd_profile.value(name => 'CSP_CHECK_ATP')= 'ALWAYS' or
264                       fnd_profile.value(name => 'CSP_CHECK_ATP')= 'SCHONLY' ) THEN
265                 CSP_SCH_INT_PVT.DO_ATP_CHECK(l_unavailable_list,p_interval,l_available_list,l_final_unavailable_list,x_return_status,x_msg_data,x_msg_count);
266             ELSE
267             	l_final_unavailable_list := l_unavailable_list;
268             END IF;
269             IF x_return_status <> FND_API.G_RET_STS_SUCCESS  THEN
270                 RETURN;
271             END IF;
272              If l_available_list.count > 0 THEN
273                FOR gli in get_line_id LOOP
274                         FOR J IN 1..l_available_list.count LOOP
275                           FOR I IN 1..p_resources.count LOOP
276                             IF l_available_list(J).resource_id = p_resources(I).resource_id
277                                 and l_available_list(J).resource_type = p_resources(I).resource_type
278                                 and l_available_list(J).line_id = gli.req_line_id THEN
279                                 l_final_available_list.extend;
280                                 l_final_available_list(l_final_available_list.count) := l_available_list(J);
281                                 EXIT;
282                             END IF;
283                         END LOOP;
284                     END LOOP;
285                 END LOOP;
286              END IF;
287             CSP_SCH_INT_PVT.ELIGIBLE_RESOURCES(p_resources,l_final_available_list,l_final_unavailable_list,l_eligible_resources_list,x_return_status,x_msg_data,x_msg_count);
288             IF x_return_status <> FND_API.G_RET_STS_SUCCESS  THEN
289                 RETURN;
290             END IF;
291             IF l_eligible_resources_list.count > 0 THEN
292                CSP_SCH_INT_PVT.GET_TIME_COST(l_eligible_resources_list,x_options,x_return_status,x_msg_data,x_msg_count);
293                 IF x_return_status <> FND_API.G_RET_STS_SUCCESS  THEN
294                     RETURN;
295                 /*ELSE
296                     IF x_options.count = 0 THEN
297                         x_return_status := FND_API.G_RET_STS_ERROR;
298                         l_del_date := to_char(g_earliest_delivery_date,'MM-DD-YYYY HH24:MI:SS');
299                         FND_MESSAGE.SET_NAME('CSP', 'CSP_SCH_DEL');
300                         FND_MESSAGE.SET_TOKEN('DDATE', l_del_date, TRUE);
301                         FND_MSG_PUB.ADD;
302                         fnd_msg_pub.count_and_get
303                          ( p_count => x_msg_count
304                          , p_data  => x_msg_data);
305                     END IF;*/
306                 END IF;
307             ELSE
308                 x_return_status := FND_API.G_RET_STS_ERROR;
309                 FND_MESSAGE.SET_NAME('CSP', 'CSP_SCH_NO_PARTS');
310                 FND_MSG_PUB.ADD;
311                 fnd_msg_pub.count_and_get
312                     ( p_count => x_msg_count
313                     , p_data  => x_msg_data);
314             END IF;
315        ELSE
316             FOR I IN 1..p_resources.count LOOP
317                 x_options.extend;
318                 x_options(x_options.count).resource_id   := p_resources(I).resource_id;
319                 x_options(x_options.count).resource_type := p_resources(I).resource_type;
320                 x_options(x_options.count).start_time    := p_interval.earliest_time;
321                 x_options(x_options.count).transfer_cost := 0;
322             END LOOP;
323         END IF;
324         EXCEPTION
325         WHEN OTHERS THEN
326             FND_MESSAGE.SET_NAME('CSP', 'CSP_UNEXPECTED_EXEC_ERRORS');
327             FND_MESSAGE.SET_TOKEN('ROUTINE', l_api_name, FALSE);
328             FND_MESSAGE.SET_TOKEN('SQLERRM', sqlerrm, FALSE);
329             FND_MSG_PUB.ADD;
330             fnd_msg_pub.count_and_get
331               ( p_count => x_msg_count
332               , p_data  => x_msg_data);
333             x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
334             return;
335    END GET_AVAILABILITY_OPTIONS;
336 
337    PROCEDURE CHOOSE_OPTION(p_api_version_number IN  NUMBER
338                           ,p_task_id            IN  NUMBER
339                           ,p_task_assignment_id IN  NUMBER
340                           ,p_likelihood         IN  NUMBER
341                           ,p_options            IN  CSP_SCH_INT_PVT.csp_sch_options_rec_typ
342                           ,x_return_status      OUT NOCOPY VARCHAR2
343                           ,x_msg_data           OUT NOCOPY VARCHAR2
344                           ,x_msg_count          OUT NOCOPY NUMBER) IS
345 
346           CURSOR C2  IS
347         SELECT crh.REQUIREMENT_HEADER_ID,crh.address_type
348         FROM   CSP_REQUIREMENT_HEADERS crh
349         WHERE  crh.TASK_ID = p_task_id;
350 
351 
352         CURSOR  csp_resource_org(c_resource_id number, c_resource_type varchar2) IS
353         SELECT  ORGANIZATION_ID, SUBINVENTORY_CODE
354         FROM    CSP_INV_LOC_ASSIGNMENTS
355         WHERE   RESOURCE_ID = c_resource_id
356         AND     RESOURCE_TYPE = c_resource_type
357         AND     DEFAULT_CODE = 'IN' ;
358 
359         CURSOR  csp_ship_to_location(c_resource_id number, c_resource_type varchar2) IS
360         SELECT  SHIP_TO_LOCATION_ID
361         FROM    CSP_RS_SHIP_TO_ADDRESSES_ALL_V
362         WHERE   RESOURCE_ID = c_resource_id
363         AND     RESOURCE_TYPE = c_resource_type
364         AND     PRIMARY_FLAG = 'Y';
365         l_interval                CSP_SCH_INT_PVT.csp_sch_interval_rec_typ;
366         l_resources               CSP_SCH_INT_PVT.csp_sch_resource_tbl_typ;
367         l_resource_org_subinv     CSP_SCH_INT_PVT.CSP_RESOURCE_ORG_tbl_TYP;
368         l_parts_list              CSP_SCH_INT_PVT.CSP_PARTS_TBL_TYP1 ;
369         l_unavailable_list        CSP_SCH_INT_PVT.CSP_UNAVAILABILITY_TBL_TYPE ;
370         l_available_list          CSP_SCH_INT_PVT.CSP_AVAILABILITY_TBL_TYPE ;
371         l_eligible_resources_list CSP_SCH_INT_PVT.CSP_AVAILABILITY_TBL_TYPE ;
372         l_final_unavailable_list  CSP_SCH_INT_PVT.CSP_UNAVAILABILITY_TBL_TYPE ;
373         l_options                 CSP_SCH_INT_PVT.CSP_SHIP_PARAMETERS_TBL_TYPE;
374         l_ship_count              CSP_SCH_INT_PVT.CSP_SHIP_METHOD_COUNT_TBL_TYP;
375         l_return_status           VARCHAR2(128);
376         l_temp_options            CSP_SCH_INT_PVT.CSP_SHIP_PARAMETERS_TBL_TYPE ;
377         min_cost                  NUMBER ;
378         l_final_option            CSP_SCH_INT_PVT.CSP_SHIP_PARAMETERS_TBL_TYPE ;
379         l_reservation_parts       CSP_SCH_INT_PVT.RESERVATION_REC_TYP;
380         l_org_ship_methode        org_ship_methodes_tbl_type ;
381        -- l_Requirement_Line_Tbl    CSP_Requirement_Lines_PVT.Requirement_Line_Tbl_Type;
382         l_res_ship_parameters     CSP_SCH_INT_PVT.CSP_ORGS_SHIP_PARAM_TBL_TYPE;
383         l_requirement_header      CSP_Requirement_Headers_PVT.REQUIREMENT_HEADER_Rec_Type;
384         l_parts_header             csp_parts_requirement.Header_rec_type;
385         l_parts_lines              csp_parts_requirement.Line_Tbl_type;
386         l_revision                varchar2(3);
387         l_ship_set                varchar2(3);
388         g_arrival_date            DATE;
389         current_position          NUMBER;
390         previous_position         NUMBER;
391         str_length                NUMBER;
392         l_reservation_id          NUMBER;
393         l_requirements_line_id    NUMBER;
394         req_loop                  NUMBER := 1;
395         l_requirement_header_id   NUMBER;
396         l_api_name                varchar2(60) := 'CSP_SCH_INT_PVT.CHOOSE_OPTION';
397         l_msg varchar2(2000);
398         rec_count                 NUMBER;
399         l_destination_sub_inv     varchar2(30);
400         l_destination_org_id      NUMBER;
401         l_ship_to_location_id     NUMBER;
402         l_ship_methode_count      NUMBER;
403         l_temp_line_id            NUMBER;
404         l_final_available_list    CSP_SCH_INT_PVT.CSP_AVAILABILITY_TBL_TYPE ;
405         l_req_line_details_tbl    CSP_SCH_INT_PVT.csp_req_line_details_tabl_typ;
406         l_address_type            varchar2(3);
407    BEGIN
408         savepoint choose_options;
409         x_return_status           := FND_API.G_RET_STS_SUCCESS ;
410         l_resources               := CSP_SCH_INT_PVT.csp_sch_resource_tbl_typ();
411          l_resource_org_subinv    := CSP_SCH_INT_PVT.CSP_RESOURCE_ORG_tbl_TYP();
412         --l_parts_list              := CSP_SCH_INT_PVT.CSP_PARTS_TBL_TYPE();
413         l_unavailable_list        := CSP_SCH_INT_PVT.CSP_UNAVAILABILITY_TBL_TYPE();
414         l_available_list          := CSP_SCH_INT_PVT.CSP_AVAILABILITY_TBL_TYPE ();
415         l_eligible_resources_list := CSP_SCH_INT_PVT.CSP_AVAILABILITY_TBL_TYPE() ;
416         l_final_unavailable_list  := CSP_SCH_INT_PVT.CSP_UNAVAILABILITY_TBL_TYPE();
417         l_resources               := CSP_SCH_INT_PVT.csp_sch_resource_tbl_typ();
418         l_options                 := CSP_SCH_INT_PVT.CSP_SHIP_PARAMETERS_TBL_TYPE();
419         l_ship_count              := CSP_SCH_INT_PVT.CSP_SHIP_METHOD_COUNT_TBL_TYP();
420         l_temp_options            := CSP_SCH_INT_PVT.CSP_SHIP_PARAMETERS_TBL_TYPE() ;
421         l_final_option            := CSP_SCH_INT_PVT.CSP_SHIP_PARAMETERS_TBL_TYPE() ;
422         l_res_ship_parameters     := CSP_SCH_INT_PVT.CSP_ORGS_SHIP_PARAM_TBL_TYPE();
423         l_org_ship_methode        := org_ship_methodes_tbl_type();
424         l_req_line_details_tbl    := CSP_SCH_INT_PVT.csp_req_line_details_tabl_typ();
425 
426 
427         l_resources.extend;
428         l_resources(1).resource_id   := p_options.resource_id ;
429         l_resources(1).resource_type := p_options.resource_type ;
430        -- l_interval.earliest_time     :=
431         l_interval.latest_time       := p_options.start_time;
432         CSP_SCH_INT_PVT.GET_ORGANIZATION_SUBINV(l_resources, l_resource_org_subinv , x_return_status,x_msg_data,x_msg_count);
433         IF x_return_status <> FND_API.G_RET_STS_SUCCESS  THEN
434             RETURN;
435         END IF;
436         CSP_SCH_INT_PVT.GET_PARTS_LIST(p_task_id,p_likelihood,l_parts_list,x_return_status,x_msg_data,x_msg_count);
437         IF x_return_status <> FND_API.G_RET_STS_SUCCESS  THEN
438             RETURN;
439         END IF;
440         IF x_return_status = FND_API.G_RET_STS_SUCCESS THEN
441             CSP_SCH_INT_PVT.CHECK_LOCAL_INVENTORY(l_resource_org_subinv,l_parts_list,l_unavailable_list,l_final_available_list,x_return_status,x_msg_data,x_msg_count);
442         ELSE
443             return;
444         END IF;
445         IF l_unavailable_list.count >= 1 THEN
446             CSP_SCH_INT_PVT.DO_ATP_CHECK(l_unavailable_list,l_interval,l_available_list,l_final_unavailable_list,x_return_status,x_msg_data,x_msg_count);
447         END IF;
448         IF x_return_status <> FND_API.G_RET_STS_SUCCESS  THEN
449             RETURN;
450         END IF;
451         IF l_available_list.count > 0 THEN
452                 l_temp_line_id := l_available_list(1).line_id;
453                 l_final_available_list.extend;
454                 l_final_available_list(l_final_available_list.count) := l_available_list(1);
455         END IF;
456         FOR I IN 1..l_available_list.count LOOP
457             IF l_temp_line_id <> l_available_list(I).line_id THEN
458                 l_final_available_list.extend;
459                 l_final_available_list(l_final_available_list.count) := l_available_list(I);
460                 l_temp_line_id := l_available_list(I).line_id;
461             END IF;
462         END LOOP;
463         CSP_SCH_INT_PVT.ELIGIBLE_RESOURCES(l_resources,l_final_available_list,l_final_unavailable_list,l_eligible_resources_list,x_return_status,x_msg_data,x_msg_count);
464         IF x_return_status <> FND_API.G_RET_STS_SUCCESS  THEN
465             RETURN;
466         END IF;
467         IF l_eligible_resources_list.count > 0 THEN
468          --CSP_SCH_INT_PVT.GET_TIME_COST(l_eligible_resources_list,l_options,x_return_status);
469             CSP_SCH_INT_PVT.OPTIMIZE_OPTIONS(l_eligible_resources_list,l_options,l_ship_count,l_res_ship_parameters,x_return_status,x_msg_data,x_msg_count);
470         ELSE
471             x_return_status := FND_API.G_RET_STS_ERROR;
472             FND_MESSAGE.SET_NAME('CSP', 'CSP_SCH_OPTION_NOT_VALIED');
473             FND_MSG_PUB.ADD;
474             fnd_msg_pub.count_and_get
475               ( p_count => x_msg_count
476               , p_data  => x_msg_data);
477             return;
478         END IF;
479          FOR I IN 1..l_options.count LOOP
480             IF (ROUND(((l_options(I).arrival_date - sysdate) * 24 * 60 ),2) <=  ROUND(((p_options.start_time - sysdate) * 24 * 60),2)
481                OR (ROUND(((l_options(I).arrival_date - sysdate) * 24 * 60 ),2) - ROUND(((p_options.start_time - sysdate) * 24 * 60),2)) <= 10 )
482                AND   l_options(I).transfer_cost <= nvl(p_options.transfer_cost,0) THEN
483                l_temp_options.extend;
484                l_temp_options(l_temp_options.count).resource_id       :=  l_options(I).resource_id;
485                l_temp_options(l_temp_options.count).resource_type     :=  l_options(I).resource_type;
486                l_temp_options(l_temp_options.count).lead_time         :=  l_options(I).lead_time   ;
487                l_temp_options(l_temp_options.count).transfer_cost     :=  l_options(I).transfer_cost;
488                l_temp_options(l_temp_options.count).shipping_methodes :=  l_options(I).shipping_methodes;
489                l_temp_options(l_temp_options.count).arrival_date      :=  l_options(I).arrival_date ;
490             END IF;
491          END LOOP;
492             IF l_temp_options.count = 0 then
493                 x_return_status := FND_API.G_RET_STS_ERROR;
494                 FND_MESSAGE.SET_NAME('CSP', 'CSP_SCH_OPTION_NOT_VALIED');
495                 FND_MSG_PUB.ADD;
496                 fnd_msg_pub.count_and_get
497                     ( p_count => x_msg_count
498                     , p_data  => x_msg_data);
499                 return;
500             END IF;
501         FOR I IN 1..l_temp_options.count LOOP
502                IF I =1 THEN
503                     min_cost := l_temp_options(I).transfer_cost;
504                     l_final_option.extend;
505                     l_final_option(l_final_option.count).resource_id       :=  l_temp_options(I).resource_id;
506                     l_final_option(l_final_option.count).resource_type     :=  l_temp_options(I).resource_type;
507                     l_final_option(l_final_option.count).lead_time         :=  l_temp_options(I).lead_time   ;
508                     l_final_option(l_final_option.count).transfer_cost     :=  l_temp_options(I).transfer_cost;
509                     IF l_temp_options(I).shipping_methodes IS NOT NULL THEN
510                         l_temp_options(I).shipping_methodes := l_temp_options(I).shipping_methodes || '-' ;
511                     END IF;
512                     l_final_option(l_final_option.count).shipping_methodes :=  l_temp_options(I).shipping_methodes;
513                     l_final_option(l_final_option.count).arrival_date      :=  l_temp_options(I).arrival_date ;
514                ELSE
515                     SELECT LEAST(min_cost, l_temp_options(I).transfer_cost) INTO min_cost
516                     FROM   DUAL;
517                     IF min_cost = l_temp_options(I).transfer_cost THEN
518                        l_final_option.trim(l_final_option.count);
519                        l_final_option.extend;
520                        l_final_option(l_final_option.count).resource_id       :=  l_temp_options(I).resource_id;
521                        l_final_option(l_final_option.count).resource_type     :=  l_temp_options(I).resource_type;
522                        l_final_option(l_final_option.count).lead_time         :=  l_temp_options(I).lead_time   ;
523                        l_final_option(l_final_option.count).transfer_cost     :=  l_temp_options(I).transfer_cost;
524                         IF l_temp_options(I).shipping_methodes IS NOT NULL THEN
525                             l_temp_options(I).shipping_methodes := l_temp_options(I).shipping_methodes || '-' ;
526                         END IF;
527                             l_final_option(l_final_option.count).shipping_methodes :=  l_temp_options(I).shipping_methodes;
528                             l_final_option(l_final_option.count).arrival_date      :=  l_temp_options(I).arrival_date ;
529                      END IF;
530                END IF;
531                g_arrival_date := l_final_option(l_final_option.count).arrival_date;
532         END LOOP;
533         previous_position :=1;
534         str_length := 0;
535         l_ship_methode_count := 1;
536         IF l_ship_count.count > 1 THEN
537             FOR I IN 1..l_ship_count.count LOOP
538                IF l_ship_count(I).from_org_id <> l_ship_count(I).to_org_id  THEN
539                     --IF I <> l_ship_count.count THEN
540                         l_org_ship_methode.extend;
541                         SELECT INSTR(l_final_option(1).shipping_methodes,'-',1,l_ship_methode_count ) INTO current_position
542                         FROM   DUAL;
543                         SELECT SUBSTR(l_final_option(1).shipping_methodes,previous_position,(current_position-previous_position))
544                         INTO   l_org_ship_methode(l_org_ship_methode.count).shipping_methode
545                         FROM   DUAL;
546                         l_org_ship_methode(l_org_ship_methode.count).from_org := l_ship_count(I).from_org_id;
547                         l_org_ship_methode(l_org_ship_methode.count).to_org   := l_ship_count(I).to_org_id ;
548                         previous_position := current_position+1;
549                         current_position := 1;
550                         l_ship_methode_count := l_ship_methode_count + 1;
551                  ELSE
552                         l_org_ship_methode.extend;
553                         l_org_ship_methode(l_org_ship_methode.count).from_org := l_ship_count(I).from_org_id;
554                         l_org_ship_methode(l_org_ship_methode.count).to_org   := l_ship_count(I).to_org_id ;
555                         l_org_ship_methode(l_org_ship_methode.count).shipping_methode := NULL;
556                  END IF;
557             END LOOP;
558          ELSE
559             l_org_ship_methode.extend;
560             SELECT INSTR(l_final_option(1).shipping_methodes,'-',1,l_ship_methode_count ) INTO current_position
561                         FROM   DUAL;
562                         SELECT SUBSTR(l_final_option(1).shipping_methodes,previous_position,(current_position-previous_position))
563                         INTO   l_org_ship_methode(l_org_ship_methode.count).shipping_methode
564                         FROM   DUAL;
565             l_org_ship_methode(l_org_ship_methode.count).from_org := l_ship_count(1).from_org_id;
566             l_org_ship_methode(l_org_ship_methode.count).to_org   := l_ship_count(1).to_org_id ;
567          --   l_org_ship_methode(l_org_ship_methode.count).shipping_methode := l_final_option(1).shipping_methodes;
568          END IF;
569         FOR I IN 1..l_eligible_resources_list.count LOOP
570            IF l_eligible_resources_list(I).sub_inventory IS NULL  AND (l_eligible_resources_list(I).organization_id <> l_eligible_resources_list(I).source_org) THEN
571                 FOR J IN 1..l_org_ship_methode.count LOOP
572                     IF l_eligible_resources_list(I).organization_id =l_org_ship_methode(J).to_org
573                             AND  l_eligible_resources_list(I).source_org =l_org_ship_methode(J).from_org THEN
574                         l_eligible_resources_list(I).shipping_methode := l_org_ship_methode(J).shipping_methode;
575                             FOR K In 1..l_res_ship_parameters.count LOOP
576                                 IF l_res_ship_parameters(K).to_org_id = l_eligible_resources_list(I).organization_id
577                                     AND l_res_ship_parameters(K).from_org_id = l_eligible_resources_list(I).source_org
578                                     AND l_res_ship_parameters(K).shipping_method = l_eligible_resources_list(I).shipping_methode THEN
579                                     l_eligible_resources_list(I).intransit_time := l_res_ship_parameters(K).lead_time ;
580                                     exit;
581                                 END IF;
582                             END LOOP;
583                         EXIT;
584                     END IF;
585                 END LOOP;
586            END IF;
587         END LOOP;
588         rec_count := 1;
589         IF l_eligible_resources_list.count > 0 THEN
590                 OPEN csp_resource_org(p_options.resource_id,p_options.resource_type);
591                 LOOP
592                     FETCH csp_resource_org INTO l_destination_org_id,l_destination_sub_inv;
593                     EXIT WHEN csp_resource_org % NOTFOUND;
594                 END LOOP;
595                 CLOSE csp_resource_org;
596                 OPEN csp_ship_to_location(p_options.resource_id,p_options.resource_type);
597                 LOOP
598                     FETCH csp_ship_to_location INTO l_ship_to_location_id;
599                     EXIT WHEN csp_ship_to_location % NOTFOUND;
600                 END LOOP;
601                 CLOSE csp_ship_to_location;
602         END IF;
603        FOR I IN 1..l_eligible_resources_list.count LOOP
604             IF  l_eligible_resources_list(I).sub_inventory IS NOT NULL THEN
605                 l_reservation_id := NULL;
606                 l_reservation_parts.need_by_date       := p_options.start_time;
607                 l_reservation_parts.organization_id    := l_eligible_resources_list(I).source_org ;
608                 l_reservation_parts.item_id            := l_eligible_resources_list(I).item_id;
609                 l_reservation_parts.item_uom_code      := l_eligible_resources_list(I).item_uom;
610                 l_reservation_parts.quantity_needed    := l_eligible_resources_list(I).quantity;
611                 l_reservation_parts.sub_inventory_code := l_eligible_resources_list(I).sub_inventory;
612                 l_reservation_parts.line_id            := l_eligible_resources_list(I).line_id;
613                 l_reservation_parts.revision           := l_eligible_resources_list(I).revision;
614                 l_reservation_id := CSP_SCH_INT_PVT.CREATE_RESERVATION(l_reservation_parts,x_return_status,x_msg_data);
615                 IF l_reservation_id <= 0 THEN
616                     ROLLBACK TO choose_options;
617                     x_return_status := FND_API.G_RET_STS_ERROR;
618                     FND_MESSAGE.SET_NAME('CSP', 'CSP_SCH_COULD_NOT_RESERVE');
619                     FND_MSG_PUB.ADD;
620                     fnd_msg_pub.count_and_get
621                         ( p_count => x_msg_count
622                         , p_data  => x_msg_data);
623                     return;
624                 END IF;
625                 l_req_line_details_tbl.extend;
626                 select CSP_REQUIREMENT_LINES_S1.nextval INTO l_req_line_details_tbl(l_req_line_details_tbl.count).req_line_detail_id from dual;
627                 l_req_line_details_tbl(l_req_line_details_tbl.count).requirement_line_id  := l_eligible_resources_list(I).line_id ;
628                 l_req_line_details_tbl(l_req_line_details_tbl.count).source_type  := 'RES' ;
629                 l_req_line_details_tbl(l_req_line_details_tbl.count).source_id  := l_reservation_id ;
630             ELSE
631                 l_parts_lines(rec_count).inventory_item_id := l_eligible_resources_list(I).item_id;
632                 l_parts_lines(rec_count).line_num                :=  rec_count ;
633                 l_parts_lines(rec_count).revision                :=  l_eligible_resources_list(I).revision; --l_revision;
634                 l_parts_lines(rec_count).quantity                :=  NULL;
635                 l_parts_lines(rec_count).unit_of_measure         :=  l_eligible_resources_list(I).item_uom;
636                 l_parts_lines(rec_count).dest_subinventory       :=  l_destination_sub_inv ;
637                 l_parts_lines(rec_count).source_organization_id  :=  l_eligible_resources_list(I).source_org ;
638                 l_parts_lines(rec_count).source_subinventory     :=  NULL;
639                 l_parts_lines(rec_count).ship_complete           :=  l_ship_set;
640                 l_parts_lines(rec_count).shipping_method_code    :=  l_eligible_resources_list(I).shipping_methode;
641                 l_parts_lines(rec_count).likelihood              :=  NULL;
642                 l_parts_lines(rec_count).ordered_quantity        :=  l_eligible_resources_list(I).quantity;
643                  l_parts_lines(rec_count).reservation_id          :=  l_reservation_id;
644                 l_parts_lines(rec_count).requirement_line_id     :=  l_requirements_line_id;
645                 rec_count := rec_count + 1;
646                 l_req_line_details_tbl.extend;
647                 select CSP_REQUIREMENT_LINES_S1.nextval INTO l_req_line_details_tbl(l_req_line_details_tbl.count).req_line_detail_id from dual;
648                 l_req_line_details_tbl(l_req_line_details_tbl.count).requirement_line_id  := l_eligible_resources_list(I).line_id ;
649                 l_req_line_details_tbl(l_req_line_details_tbl.count).source_type  := 'IO' ;
650             END IF;
651             END LOOP;
652             IF l_parts_lines.count > 0 THEN
653             l_parts_header.ORDER_TYPE_ID := FND_PROFILE.value(name => 'CSP_ORDER_TYPE');
654             l_parts_header.SHIP_TO_LOCATION_ID :=  l_ship_to_location_id;
655             l_parts_header.DEST_ORGANIZATION_ID := l_destination_org_id;
656             l_parts_header.OPERATION := 'CREATE';
657             l_parts_header.need_by_date :=g_arrival_date;
658              CSP_PARTS_ORDER.process_order(
659                                       p_api_version   =>  1.0
660                                      ,p_Init_Msg_List =>  FND_API.G_FALSE
661                                      ,p_commit        =>  FND_API.G_FALSE
662                                      ,px_header_rec   =>  l_parts_header
663                                      ,px_line_table   =>  l_parts_lines
664                                      ,x_return_status =>  x_return_status
665                                      ,x_msg_count     =>  x_msg_count
666                                      ,x_msg_data      =>  x_msg_data
667                                      );
668             END IF;
669             IF x_return_status <> FND_API.G_RET_STS_SUCCESS THEN
670                 ROLLBACK TO CHOOSE_OPTIONS;
671                 x_return_status := FND_API.G_RET_STS_ERROR;
672                 FND_MESSAGE.SET_NAME('CSP', 'CSP_SCH_UNABLE_TO_ORDER');
673                 FND_MSG_PUB.ADD;
674                 fnd_msg_pub.count_and_get
675                             ( p_count => x_msg_count
676                             , p_data  => x_msg_data);
677                 return;
678           ELSE
679                 FOR I IN 1..l_parts_lines.count LOOP
680                     FOR J IN 1..l_req_line_details_tbl.count LOOP
681                         IF l_req_line_details_tbl(J).source_type = 'IO' AND l_req_line_details_tbl(J).source_ID IS NULL THEN
682                             l_req_line_details_tbl(J).source_ID :=  l_parts_lines(I).order_line_id;
683                             EXIT;
684                         END IF;
685                     END LOOP;
686                 END LOOP;
687            /* CSP_Requirement_Lines_PVT.Update_requirement_lines(
688                                 P_Api_Version_Number         => 1.0,
689                                 P_Init_Msg_List              => FND_API.G_FALSE,
690                                 P_Commit                     => FND_API.G_FALSE,
691                                 p_validation_level           => FND_API.G_VALID_LEVEL_FULL,
692                                 P_Requirement_Line_Tbl       => l_Requirement_Line_Tbl,
693                                 X_Return_Status              => x_return_status,
694                                 X_Msg_Count                  => x_msg_count,
695                                 X_Msg_Data                   => x_msg_data
696                                 );*/
697          IF x_return_status <> FND_API.G_RET_STS_SUCCESS THEN
698             ROLLBACK TO choose_options;
699             return;
700          END IF;
701          FOR K IN 1..l_req_line_details_tbl.count LOOP
702             csp_req_line_details_pkg.insert_row(l_req_line_details_tbl(K).REQ_LINE_DETAIL_ID
703                                                 ,l_req_line_details_tbl(K).REQUIREMENT_LINE_ID
704                                                 ,fnd_global.user_id
705                                                 ,sysdate
706                                                 ,fnd_global.user_id
707                                                 ,sysdate
708                                                 ,fnd_global.login_id
709                                                 ,l_req_line_details_tbl(K).SOURCE_TYPE
710                                                 ,l_req_line_details_tbl(K).SOURCE_ID);
711          END LOOP;
712          OPEN C2;
713          FETCH C2 INTO l_requirement_header_id,l_address_type;
714          CLOSE C2;
715          l_requirement_header.REQUIREMENT_HEADER_ID := l_requirement_header_id;
716          l_requirement_header.TASK_ASSIGNMENT_ID    := p_task_assignment_id ;
717 
718          l_requirement_header.Last_Update_Date      := SYSDATE;
719          IF l_address_type IS NULL or l_address_type = 'R' OR l_address_type = 'S' THEN
720             l_requirement_header.address_type          := 'R';
721             l_requirement_header.ship_to_location_id   := l_ship_to_location_id;
722          END IF;
723          l_requirement_header.ORDER_TYPE_ID := FND_PROFILE.value(name => 'CSP_ORDER_TYPE');
724          CSP_Requirement_Headers_PVT.Update_requirement_headers(
725                                 P_Api_Version_Number         => 1.0,
726                                 P_Init_Msg_List              => FND_API.G_FALSE,
727                                 P_Commit                     => FND_API.G_FALSE,
728                                 p_validation_level           => FND_API.G_VALID_LEVEL_FULL,
729                                 P_REQUIREMENT_HEADER_Rec     => l_requirement_header,
730                                 X_Return_Status              => x_return_status,
731                                 X_Msg_Count                  => x_msg_count,
732                                 X_Msg_Data                   => x_msg_data
733                                 );
734          IF x_return_status <> FND_API.G_RET_STS_SUCCESS THEN
735             ROLLBACK TO choose_options;
736             return;
737          END IF;
738         END IF;
739       EXCEPTION
740         WHEN OTHERS THEN
741             ROLLBACK TO choose_options;
742             FND_MESSAGE.SET_NAME('CSP', 'CSP_UNEXPECTED_EXEC_ERRORS');
743             FND_MESSAGE.SET_TOKEN('ROUTINE', l_api_name, FALSE);
744             FND_MESSAGE.SET_TOKEN('SQLERRM', sqlerrm, FALSE);
745             FND_MSG_PUB.ADD;
746             fnd_msg_pub.count_and_get
747               ( p_count => x_msg_count
748               , p_data  => x_msg_data);
749             x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
750    END CHOOSE_OPTION;
751 
752    /* PROCEDURE CLEAN_MATERIAL_TRANSACTION(p_api_version_number  IN  NUMBER
753                                         ,p_task_assignment_id  IN  NUMBER
754                                         ,x_return_status       OUT NOCOPY VARCHAR2
755                                         ,x_msg_data            OUT NOCOPY VARCHAR2
756                                         ,x_msg_count           OUT NOCOPY NUMBER) IS
757 
758     CURSOR cancel_reserv  IS
759     SELECT crl.RESERVATION_ID,crl.LOCAL_RESERVATION_ID,crl.REQUIREMENT_LINE_ID
760     FROM   CSP_REQUIREMENT_LINES crl, csp_requirement_headers crh
761     WHERE  crh.task_assignment_id = p_task_assignment_id
762     and    crl.REQUIREMENT_HEADER_ID = crh.requirement_header_id
763     AND    crl.local_RESERVATION_ID IS NOT NULL;
764 
765      cursor cancel_order IS
766      select distinct  oeh.header_id,crl.requirement_line_id
767      from oe_order_lines_all oel, oe_order_headers_all oeh, csp_requirement_headers crh, csp_requirement_lines crl
768      where crh.task_assignment_id = p_task_assignment_id
769      and   crl.REQUIREMENT_HEADER_ID = crh.REQUIREMENT_HEADER_ID
770      and   oel.line_id = crl.order_line_id
771      and   oeh.header_id =  oel.header_id
772      order by oeh.header_id;
773 
774     l_api_name   varchar2(60) := 'CSP_SCH_INT_PVT.CLEAN_MATERIAL_TRANSACTION';
775     l_reserv_id NUMBER;
776     l_local_reserv_id NUMBER;
777     l_order_id  NUMBER;
778     l_return_status VARCHAR2(3);
779     l_msg_data VARCHAR2(128);
780     l_msg_count NUMBER;
781     l_order_line_id NUMBER;
782     l_previous_order_id NUMBER := 0;
783     l_requirement_line_id NUMBER;
784     l_Requirement_Line_Tbl         CSP_Requirement_Lines_PVT.Requirement_Line_Tbl_Type;
785     l_Requirement_Line_Tbl_order   CSP_Requirement_Lines_PVT.Requirement_Line_Tbl_Type;
786     req_loop NUMBER := 0 ;
787     reservation_present BOOLEAN := FALSE;
788     order_present       BOOLEAN := FALSE;
789     BEGIN
790          x_return_status := FND_API.G_RET_STS_SUCCESS;
791          SAVEPOINT CLEAN_MATERIAL_TRANSACTION;
792          OPEN cancel_reserv ;
793          LOOP
794             FETCH cancel_reserv INTO l_reserv_id,l_local_reserv_id,l_requirement_line_id;
795             EXIT WHEN  cancel_reserv%NOTFOUND;
796             IF l_reserv_id IS NOT NULL THEN
797                 CSP_SCH_INT_PVT.CANCEL_RESERVATION(l_reserv_id,x_return_status,x_msg_data,x_msg_count);
798             END IF;
799             IF l_local_reserv_id IS NOT NULL THEN
800                 CSP_SCH_INT_PVT.CANCEL_RESERVATION(l_local_reserv_id,x_return_status,x_msg_data,x_msg_count);
801             END IF;
802             IF x_return_status <> FND_API.G_RET_STS_SUCCESS THEN
803                 ROLLBACK TO CLEAN_MATERIAL_TRANSACTION;
804                 x_return_status := FND_API.G_RET_STS_ERROR;
805                 FND_MESSAGE.SET_NAME('CSP', 'CSP_SCH_NOT_CANCEL_RESERV');
806                 FND_MSG_PUB.ADD;
807                 fnd_msg_pub.count_and_get
808                     ( p_count => x_msg_count
809                     , p_data  => x_msg_data);
810                 exit;
811             ELSE
812                 req_loop := req_loop + 1;
813                 l_Requirement_Line_Tbl(req_loop).REQUIREMENT_LINE_ID      := l_requirement_line_id;
814                 l_Requirement_Line_Tbl(req_loop).local_RESERVATION_ID     := NULL;
815                 l_Requirement_Line_Tbl(req_loop).RESERVATION_ID           := NULL;
816                 l_Requirement_Line_Tbl(req_loop).source_organization_id   := NULL;
817                 l_Requirement_Line_Tbl(req_loop).source_subinventory      := NULL;
818                 l_Requirement_Line_Tbl(req_loop).sourced_from             := NULL;
819                 reservation_present := TRUE;
820             END IF;
821             l_reserv_id := NULL ;
822          END LOOP;
823          CLOSE cancel_reserv;
824          IF x_return_status = FND_API.G_RET_STS_ERROR THEN
825              ROLLBACK TO CLEAN_MATERIAL_TRANSACTION;
826              return;
827          ELSE
828             IF  reservation_present THEN
829                 CSP_Requirement_Lines_PVT.Update_requirement_lines(
830                                 P_Api_Version_Number         => 1.0,
831                                 P_Init_Msg_List              => FND_API.G_FALSE,
832                                 P_Commit                     => FND_API.G_FALSE,
833                                 p_validation_level           => FND_API.G_VALID_LEVEL_FULL,
834                                 P_Requirement_Line_Tbl       => l_Requirement_Line_Tbl,
835                                 X_Return_Status              => x_return_status,
836                                 X_Msg_Count                  => x_msg_count,
837                                 X_Msg_Data                   => x_msg_data
838                                 );
839                 IF x_return_status <> FND_API.G_RET_STS_SUCCESS THEN
840                     ROLLBACK TO CLEAN_MATERIAL_TRANSACTION;
841                     return;
842                 END IF;
843              END IF;
844           END IF;
845                 req_loop := 0;
846          OPEN cancel_order;
847          LOOP
848             FETCH cancel_order INTO l_order_id,l_requirement_line_id ;
849             EXIT WHEN cancel_order % NOTFOUND;
850             IF l_order_id <> l_previous_order_id THEN
851                 CSP_SCH_INT_PVT.CANCEL_ORDER(l_order_id,x_return_status,x_msg_data,x_msg_count);
852                 l_previous_order_id := l_order_id;
853             ELSE
854                 x_return_status := FND_API.G_RET_STS_SUCCESS;
855             END IF;
856             IF x_return_status <> FND_API.G_RET_STS_SUCCESS THEN
857                x_return_status := FND_API.G_RET_STS_ERROR;
858                FND_MESSAGE.SET_NAME('CSP', 'CSP_SCH_NOT_CANCEL_ORDER');
859                FND_MSG_PUB.ADD;
860                fnd_msg_pub.count_and_get
861                                 ( p_count => x_msg_count
862                                 , p_data  => x_msg_data);
863                exit;
864             ELSE
865                 req_loop := req_loop + 1;
866                 l_Requirement_Line_Tbl(req_loop).REQUIREMENT_LINE_ID      := l_requirement_line_id;
867                 l_Requirement_Line_Tbl(req_loop).ORDER_LINE_ID            := NULL;
868                 l_Requirement_Line_Tbl(req_loop).source_organization_id   := NULL;
869                 l_Requirement_Line_Tbl(req_loop).source_subinventory      := NULL;
870                 l_Requirement_Line_Tbl(req_loop).shipping_method_code     := NULL;
871                 l_Requirement_Line_Tbl(req_loop).order_by_date            := NULL;
872                 l_Requirement_Line_Tbl(req_loop).arrival_date             := NULL;
873                 l_Requirement_Line_Tbl(req_loop).ordered_quantity         := NULL;
874                 l_Requirement_Line_Tbl(req_loop).sourced_from             := NULL;
875                 order_present := TRUE;
876                 l_requirement_line_id := null;
877             END IF;
878          END LOOP;
879          CLOSE cancel_order;
880          IF x_return_status = FND_API.G_RET_STS_ERROR THEN
881              ROLLBACK TO CLEAN_MATERIAL_TRANSACTION;
882              return;
883          ELSE
884               IF order_present then
885                     CSP_Requirement_Lines_PVT.Update_requirement_lines(
886                                 P_Api_Version_Number         => 1.0,
887                                 P_Init_Msg_List              => FND_API.G_FALSE,
888                                 P_Commit                     => FND_API.G_FALSE,
889                                 p_validation_level           => FND_API.G_VALID_LEVEL_FULL,
890                                 P_Requirement_Line_Tbl       => l_Requirement_Line_Tbl,
891                                 X_Return_Status              => x_return_status,
892                                 X_Msg_Count                  => x_msg_count,
893                                 X_Msg_Data                   => x_msg_data
894                                 );
895                     IF x_return_status <> FND_API.G_RET_STS_SUCCESS THEN
896                         ROLLBACK TO CLEAN_MATERIAL_TRANSACTION;
897                         return;
898                     END IF;
899                 END IF;
900            END IF;
901            IF  x_return_status = FND_API.G_RET_STS_SUCCESS THEN
902                     COMMIT WORK;
903            END IF;
904       EXCEPTION
905         WHEN OTHERS THEN
906             ROLLBACK TO CLEAN_MATERIAL_TRANSACTION;
907             FND_MESSAGE.SET_NAME('CSP', 'CSP_UNEXPECTED_EXEC_ERRORS');
908             FND_MESSAGE.SET_TOKEN('ROUTINE', l_api_name, TRUE);
909             FND_MESSAGE.SET_TOKEN('SQLERRM', sqlerrm, TRUE);
910             FND_MSG_PUB.ADD;
911             fnd_msg_pub.count_and_get
912               ( p_count => x_msg_count
913               , p_data  => x_msg_data);
914             x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
915 
916    END CLEAN_MATERIAL_TRANSACTION;*/
917    PROCEDURE CLEAN_MATERIAL_TRANSACTION(p_api_version_number  IN  NUMBER
918                                         ,p_task_assignment_id  IN  NUMBER
919                                         ,x_return_status       OUT NOCOPY VARCHAR2
920                                         ,x_msg_data            OUT NOCOPY VARCHAR2
921                                         ,x_msg_count           OUT NOCOPY NUMBER) IS
922 
923     l_order_id  NUMBER;
924     l_req_details_line_id NUMBER;
925     l_reserv_id NUMBER;
926     l_status varchar2(30);
927 
928     CURSOR get_reservations is
929     select crld.source_id , crld.req_line_detail_id
930     from  csp_req_line_details crld
931          ,csp_requirement_lines crl
932          ,csp_requirement_headers crh
933     where  crh.task_assignment_id = p_task_assignment_id
934     and crl.requirement_header_id = crh.requirement_header_id
935     and crld.requirement_line_id = crl.requirement_line_id
936     and crld.source_type = 'RES' ;
937 
938     CURSOR get_orders is
939     select oeh.header_id, crld.req_line_detail_id
940     from  csp_req_line_details crld
941          ,csp_requirement_lines crl
942          ,csp_requirement_headers crh
943          ,oe_order_lines_all oel
944          ,oe_order_headers_all oeh
945     where  crh.task_assignment_id = p_task_assignment_id
946     and crl.requirement_header_id = crh.requirement_header_id
947     and crld.requirement_line_id = crl.requirement_line_id
948     and crld.source_type = 'IO'
949     and oel.line_id = crld.source_id
950     and oeh.header_id =  oel.header_id
951     order by oeh.header_id;
952 
953     CURSOR get_order_status(c_header_id NUMBER) IS
954     select flow_status_code
955     from   oe_order_headers_all
956     where  header_id =  c_header_id;
957 
958     cursor get_line_details(c_order_header_id Number) is
959     select REQ_LINE_DETAIL_ID
960     from  csp_req_line_details crld,oe_order_lines_all oel
961     where crld.source_id = oel.line_id
962     and crld.source_type = 'IO'
963     and oel.header_id = c_order_header_id;
964 
965     cursor get_requirement_header_id is
966     select requirement_header_id,address_type
967     from csp_requirement_headers
968     where task_assignment_id = p_task_assignment_id;
969 
970     l_requirement_header      CSP_Requirement_Headers_PVT.REQUIREMENT_HEADER_Rec_Type;
971     l_requirement_header_id NUMBER;
972     l_address_type varchar2(3);
973    BEGIN
974 
975          x_return_status := FND_API.G_RET_STS_SUCCESS;
976          SAVEPOINT CLEAN_MATERIAL_TRANSACTION;
977          OPEN get_reservations ;
978          LOOP
979             FETCH get_reservations INTO l_reserv_id,l_req_details_line_id;
980             EXIT WHEN  get_reservations%NOTFOUND;
981                 CSP_SCH_INT_PVT.CANCEL_RESERVATION(l_reserv_id,x_return_status,x_msg_data,x_msg_count);
982                 IF x_return_status <> FND_API.G_RET_STS_SUCCESS THEN
983                     x_return_status := FND_API.G_RET_STS_SUCCESS;
984                     exit;
985                 ELSE
986                     delete from csp_req_line_details where req_line_detail_id = l_req_details_line_id;
987                 END IF;
988          END LOOP;
989          close get_reservations;
990          IF x_return_status <> FND_API.G_RET_STS_SUCCESS THEN
991             x_return_status := FND_API.G_RET_STS_SUCCESS;
992             rollback to CLEAN_MATERIAL_TRANSACTION;
993             return;
994          ELSE
995             OPEN get_orders;
996             LOOP
997                 FETCH get_orders INTO l_order_id ,l_req_details_line_id ;
998                 EXIT WHEN get_orders% NOTFOUND;
999                 OPEN get_order_status(l_order_id);
1000                 FETCH get_order_status INTO l_status;
1001                 CLOSE get_order_status;
1002                 IF l_status <> 'CANCELLED' THEN
1003                    CSP_SCH_INT_PVT.CANCEL_ORDER(l_order_id,x_return_status,x_msg_data,x_msg_count);
1004                    IF x_return_status <> FND_API.G_RET_STS_SUCCESS THEN
1005                     x_return_status := FND_API.G_RET_STS_SUCCESS;
1006                     EXIT;
1007                    ELSE
1008                      open get_line_details(l_order_id);
1009                      LOOP
1010                          FETCH get_line_details INTO l_req_details_line_id;
1011                          EXIT WHEN get_line_details% NOTFOUND;
1012                             delete from csp_req_line_details where req_line_detail_id = l_req_details_line_id;
1013                      END LOOP;
1014                      CLOSE get_line_details;
1015                    END IF;
1016                 END IF;
1017             END LOOP;
1018             CLOSE get_orders;
1019          OPEN get_requirement_header_id;
1020          FETCH get_requirement_header_id INTO l_requirement_header_id,l_address_type;
1021          CLOSE get_requirement_header_id;
1022          if l_requirement_header_id is not null THEN
1023          	l_requirement_header.REQUIREMENT_HEADER_ID := l_requirement_header_id;
1024          	l_requirement_header.TASK_ASSIGNMENT_ID    := NULL ;
1025          	if nvl(l_address_type,-1) = 'R' THEN
1026          	  l_requirement_header.ship_to_location_id := null;
1027          	  l_requirement_header.address_Type := null;
1028        	    end if;
1029          	l_requirement_header.resource_type := null;
1030          	l_requirement_header.resource_id := null;
1031          	l_requirement_header.destination_organization_id  := null;
1032          	l_requirement_header.destination_subinventory  := null;
1033          	CSP_Requirement_Headers_PVT.Update_requirement_headers(
1034                                 P_Api_Version_Number         => 1.0,
1035                                 P_Init_Msg_List              => FND_API.G_FALSE,
1036                                 P_Commit                     => FND_API.G_FALSE,
1037                                 p_validation_level           => FND_API.G_VALID_LEVEL_FULL,
1038                                 P_REQUIREMENT_HEADER_Rec     => l_requirement_header,
1039                                 X_Return_Status              => x_return_status,
1040                                 X_Msg_Count                  => x_msg_count,
1041                                 X_Msg_Data                   => x_msg_data
1042                                 );
1043           END IF;
1044             IF x_return_status <> FND_API.G_RET_STS_SUCCESS THEN
1045                 x_return_status := FND_API.G_RET_STS_SUCCESS;
1046                 rollback to CLEAN_MATERIAL_TRANSACTION;
1047                 return;
1048             END IF;
1049          END IF;
1050    END CLEAN_MATERIAL_TRANSACTION;
1051    PROCEDURE CANCEL_RESERVATION(p_reserv_id   IN NUMBER
1052                                 ,x_return_status OUT NOCOPY VARCHAR2
1053                                 ,x_msg_data OUT NOCOPY VARCHAR2
1054                                 ,x_msg_count OUT NOCOPY NUMBER) IS
1055     l_api_name   varchar2(60) := 'CSP_SCH_INT_PVT.CANCEL_RESERVATION';
1056     l_api_version_number NUMBER := 1.0;
1057     l_return_status      VARCHAR2(3);
1058     l_msg_count          NUMBER;
1059     l_init_msg_lst       VARCHAR2(1) := fnd_api.g_true;
1060     l_msg_data           VARCHAR2(2000);
1061     l_rsv_rec        inv_reservation_global.mtl_reservation_rec_type;
1062     l_serial_number  inv_reservation_global.serial_number_tbl_type;
1063    BEGIN
1064         x_return_status := FND_API.G_RET_STS_SUCCESS;
1065         l_rsv_rec.reservation_id := p_reserv_id ;
1066         INV_RESERVATION_PUB.delete_reservation(l_api_version_number
1067                                               ,l_init_msg_lst
1068                                               ,x_return_status
1069                                               ,x_msg_count
1070                                               ,x_msg_data
1071                                               ,l_rsv_rec
1072                                               ,l_serial_number);
1073      EXCEPTION
1074      WHEN OTHERS THEN
1075             ROLLBACK TO CLEAN_MATERIAL_TRANSACTION;
1076             FND_MESSAGE.SET_NAME('CSP', 'CSP_UNEXPECTED_EXEC_ERRORS');
1077             FND_MESSAGE.SET_TOKEN('ROUTINE', l_api_name, FALSE);
1078             FND_MESSAGE.SET_TOKEN('SQLERRM', sqlerrm, FALSE);
1079             FND_MSG_PUB.ADD;
1080             fnd_msg_pub.count_and_get
1081               ( p_count => x_msg_count
1082               , p_data  => x_msg_data);
1083             x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
1084 
1085    END CANCEL_RESERVATION;
1086 
1087    PROCEDURE CANCEL_ORDER(p_order_id      IN   NUMBER
1088                          ,x_return_status OUT NOCOPY  VARCHAR2
1089                          ,x_msg_data      OUT NOCOPY  VARCHAR2
1090                          ,x_msg_count     OUT NOCOPY  NUMBER) IS
1091       l_parts_header             csp_parts_requirement.Header_rec_type;
1092       l_parts_lines              csp_parts_requirement.Line_Tbl_type;
1093       l_api_version              NUMBER := 1.0;
1094       l_api_name        varchar2(60) := 'CSP_SCH_INT_PVT.CANCEL_ORDER';
1095    BEGIN
1096             x_return_status := FND_API.G_RET_STS_SUCCESS;
1097             l_parts_header.order_header_id := p_order_id;
1098             l_parts_header.operation       := 'CANCEL';
1099             l_parts_header.change_Reason   := 'Late';
1100             CSP_PARTS_ORDER.process_order(p_api_version       =>  l_api_version
1101                                          ,p_Init_Msg_List     =>  FND_API.G_FALSE
1102                                          ,p_commit            =>  FND_API.G_FALSE
1103                                          ,px_header_rec       =>  l_parts_header
1104                                          ,px_line_table       =>  l_parts_lines
1105                                          ,x_return_status     =>  x_return_status
1106                                          ,x_msg_count         =>  x_msg_count
1107                                          ,x_msg_data          =>  x_msg_data
1108                                           );
1109             EXCEPTION
1110             WHEN OTHERS THEN
1111             FND_MESSAGE.SET_NAME('CSP', 'CSP_UNEXPECTED_EXEC_ERRORS');
1112             FND_MESSAGE.SET_TOKEN('ROUTINE', l_api_name, FALSE);
1113             FND_MESSAGE.SET_TOKEN('SQLERRM', sqlerrm, FALSE);
1114             FND_MSG_PUB.ADD;
1115             fnd_msg_pub.count_and_get
1116               ( p_count => x_msg_count
1117               , p_data  => x_msg_data);
1118             x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
1119    END CANCEL_ORDER;
1120    PROCEDURE CREATE_ORDERS(p_api_version_number  IN  NUMBER
1121                          ,p_task_assignment_id  IN  NUMBER
1122                          ,x_return_status       OUT NOCOPY VARCHAR2
1123                          ,x_msg_data            OUT NOCOPY VARCHAR2
1124                          ,x_msg_count           OUT NOCOPY NUMBER) IS
1125 
1126         CURSOR get_orders is
1127         select distinct oeh.header_id, oel.line_id
1128         from  csp_req_line_details crld
1129          ,csp_requirement_lines crl
1130          ,csp_requirement_headers crh
1131          ,oe_order_lines_all oel
1132          ,oe_order_headers_all oeh
1133         where  crh.task_assignment_id = p_task_assignment_id
1134         and crl.requirement_header_id = crh.requirement_header_id
1135         and crld.requirement_line_id = crl.requirement_line_id
1136         and crld.source_type = 'IO'
1137         and oel.line_id = crld.source_id
1138         and oeh.header_id =  oel.header_id
1139         order by oeh.header_id;
1140 
1141         l_api_name                 VARCHAR2(60) := 'CSP_SCH_INT_PVT.CREATE_ORDERS';
1142         l_parts_header             csp_parts_requirement.Header_rec_type;
1143         l_parts_lines              csp_parts_requirement.Line_Tbl_type;
1144         l_order_header_id          NUMBER;
1145         l_order_line_id            NUMBER;
1146         l_header_id                NUMBER;
1147         rec_count                  NUMBER := 1;
1148         l_previous_header_id       NUMBER := NULL;
1149    BEGIN
1150         SAVEPOINT CREATE_ORDERS;
1151         l_previous_header_id := NULL;
1152         OPEN get_orders;
1153         LOOP
1154         FETCH get_orders into l_order_header_id, l_order_line_id;
1155         EXIT WHEN get_orders % NOTFOUND;
1156         IF l_previous_header_id IS NULL THEN
1157             l_previous_header_id := l_order_header_id;
1158         END IF;
1159         IF l_previous_header_id <> l_order_header_id THEN
1160                  l_parts_header.OPERATION := 'UPDATE';
1161                  l_parts_header.order_header_id := l_previous_header_id;
1162         	     CSP_PARTS_ORDER.process_order(
1163                                       p_api_version   =>  1.0
1164                                      ,p_Init_Msg_List =>  FND_API.G_FALSE
1165                                      ,p_commit        =>  FND_API.G_FALSE
1166                                      ,px_header_rec   =>  l_parts_header
1167                                      ,px_line_table   =>  l_parts_lines
1168                                      ,p_process_type  =>  'ORDER'
1169                                      ,x_return_status =>  x_return_status
1170                                      ,x_msg_count     =>  x_msg_count
1171                                      ,x_msg_data      =>  x_msg_data
1172                                      );
1173        	        IF x_return_status <> FND_API.G_RET_STS_SUCCESS THEN
1174                     ROLLBACK TO CREATE_ORDERS;
1175                     x_return_status := FND_API.G_RET_STS_ERROR;
1176                     FND_MESSAGE.SET_NAME('CSP', 'CSP_SCH_UNABLE_TO_ORDER');
1177                     FND_MSG_PUB.ADD;
1178                     fnd_msg_pub.count_and_get
1179                             ( p_count => x_msg_count
1180                             , p_data  => x_msg_data);
1181                     exit;
1182        	        END IF;
1183                 l_previous_header_id := l_order_header_id;
1184               END IF;
1185             l_parts_lines(rec_count).order_line_id     := l_order_line_id;
1186             l_parts_lines(rec_count).booked_flag       := 'Y';
1187             rec_count := rec_count + 1;
1188         END LOOP;
1189         CLOSE get_orders;
1190         IF x_return_status <> FND_API.G_RET_STS_SUCCESS THEN
1191             RETURN;
1192         END IF;
1193    END CREATE_ORDERS;
1194 
1195    /*PROCEDURE CREATE_ORDERS(p_api_version_number  IN  NUMBER
1196                          ,p_task_assignment_id  IN  NUMBER
1197                          ,x_return_status       OUT NOCOPY VARCHAR2
1198                          ,x_msg_data            OUT NOCOPY VARCHAR2
1199                          ,x_msg_count           OUT NOCOPY NUMBER) IS
1200    /* CURSOR get_parts(c_task_assignment NUMBER) IS
1201     SELECT  INVENTORY_ITEM_ID, UOM_CODE,REVISION
1202            ,SHIP_COMPLETE_FLAG,SOURCE_ORGANIZATION_ID
1203            ,ORDERED_QUANTITY,REQUIREMENT_LINE_ID,RESERVATION_ID
1204     FROM  CSP_REQUIREMENT_HEADERS HR,CSP_REQUIREMENT_LINES LN
1205     WHERE HR.TASK_ASSIGNMENT_ID = c_task_assignment
1206     AND   LN.REQUIREMENT_HEADER_ID = HR.REQUIREMENT_HEADER_ID;
1207 
1208 
1209     This has been commented and spli in to two queries because of performance
1210     reasons.
1211 
1212 
1213     */
1214     /*CURSOR C1(c_task_assignment number) is
1215     select REQUIREMENT_HEADER_ID
1216     from   CSP_REQUIREMENT_HEADERS
1217     where  TASK_ASSIGNMENT_ID = c_task_assignment;
1218     CURSOR C2(c_header_id number) is
1219     SELECT  INVENTORY_ITEM_ID, UOM_CODE,REVISION
1220            ,SHIP_COMPLETE_FLAG,SOURCE_ORGANIZATION_ID
1221            ,ORDERED_QUANTITY,REQUIREMENT_LINE_ID,RESERVATION_ID
1222     FROM  CSP_REQUIREMENT_LINES
1223     WHERE REQUIREMENT_HEADER_ID = c_header_id;
1224 
1225 
1226     CURSOR get_resource(c_task_assignment_id NUMBER) IS
1227     SELECT RESOURCE_ID,RESOURCE_TYPE_CODE
1228     FROM   JTF_TASK_ASSIGNMENTS
1229     WHERE  TASK_ASSIGNMENT_ID=c_task_assignment_id;
1230 
1231     CURSOR  csp_resource_org(c_resource_id number, c_resource_type varchar2) IS
1232     SELECT  ORGANIZATION_ID, SUBINVENTORY_CODE
1233     FROM    CSP_INV_LOC_ASSIGNMENTS
1234     WHERE   RESOURCE_ID = c_resource_id
1235     AND     RESOURCE_TYPE = c_resource_type
1236     AND     DEFAULT_CODE = 'IN' ;
1237 
1238     CURSOR  csp_ship_to_location(c_resource_id number, c_resource_type varchar2) IS
1239     SELECT  SHIP_TO_LOCATION_ID
1240     FROM    CSP_RS_SHIP_TO_ADDRESSES_V
1241     WHERE   RESOURCE_ID = c_resource_id
1242     AND     RESOURCE_TYPE = c_resource_type
1243     AND     PRIMARY_FLAG = 'Y';
1244 
1245     l_api_name                 VARCHAR2(60) := 'CSP_SCH_INT_PVT.CREATE_ORDERS';
1246     l_parts_header             csp_parts_requirement.Header_rec_type;
1247     l_parts_lines              csp_parts_requirement.Line_Tbl_type;
1248     l_requrements_lines        CSP_Requirement_Lines_PVT.Requirement_Line_Tbl_Type;
1249     l_return_status            VARCHAR2(30);
1250     l_msg_count                NUMBER;
1251     l_msg_data                 VARCHAR2(1000);
1252     l_resource_id              NUMBER;
1253     l_resource_type            VARCHAR2(30);
1254     l_destination_org_id       NUMBER;
1255     l_destination_sub_inv      VARCHAR2(10);
1256     l_item_id                  NUMBER;
1257     l_uom_code                 VARCHAR2(3);
1258     l_ship_set                 VARCHAR2(30);
1259     l_source_org               NUMBER;
1260     l_order_quantity           NUMBER;
1261     l_revision                 VARCHAR2(3);
1262     l_line_id                  NUMBER;
1263     rec_count                     NUMBER;
1264     l_ship_to_location_id         NUMBER;
1265     l_reservation_id              NUMBER;
1266     x_reservation_id              NUMBER;
1267     l_header_id                   NUMBER;
1268   BEGIN
1269         x_return_status := FND_API.G_RET_STS_SUCCESS;
1270         SAVEPOINT CREATE_ORDERS;
1271         OPEN get_resource(p_task_assignment_id);
1272         LOOP
1273             FETCH get_resource INTO l_resource_id,l_resource_type;
1274             EXIT WHEN get_resource% NOTFOUND;
1275         END LOOP;
1276         CLOSE get_resource;
1277 
1278         OPEN csp_resource_org(l_resource_id,l_resource_type);
1279         LOOP
1280             FETCH csp_resource_org INTO l_destination_org_id,l_destination_sub_inv ;
1281             EXIT WHEN csp_resource_org%NOTFOUND;
1282         END LOOP;
1283         CLOSE csp_resource_org;
1284         /*OPEN get_parts(p_task_assignment_id);
1285         rec_count := 1;
1286         LOOP
1287             FETCH get_parts INTO l_item_id,l_uom_code,l_revision,
1288                                  l_ship_set,l_source_org,l_order_quantity,
1289                                  l_line_id,l_reservation_id;
1290             EXIT WHEN get_parts % NOTFOUND ;
1291             l_parts_lines(rec_count).inventory_item_id := l_item_id;
1292             --l_parts_lines(rec_count).item_description  := 'test';
1293             l_parts_lines(rec_count).line_num := rec_count ;
1294             l_parts_lines(rec_count).revision          := l_revision;
1295             l_parts_lines(rec_count).quantity          := NULL;
1296             l_parts_lines(rec_count).unit_of_measure   := l_uom_code ;
1297             l_parts_lines(rec_count).dest_subinventory := l_destination_sub_inv ;
1298             l_parts_lines(rec_count).source_organization_id  :=  l_source_org ;
1299             l_parts_lines(rec_count).source_subinventory     :=  NULL;
1300             l_parts_lines(rec_count).ship_complete           :=  l_ship_set;
1301             l_parts_lines(rec_count).likelihood              :=  NULL;
1302             l_parts_lines(rec_count).ordered_quantity        :=  l_order_quantity;
1303             l_parts_lines(rec_count).reservation_id          :=  l_reservation_id;
1304             l_parts_lines(rec_count).requirement_line_id     :=  l_line_id;
1305             rec_count := rec_count + 1;
1306         END LOOP;
1307         CLOSE get_parts;*/
1308         /*OPEN C1(p_task_assignment_id);
1309         LOOP
1310             FETCH C1 INTO l_header_id;
1311             EXIT WHEN C1%NOTFOUND;
1312         END LOOP;
1313         CLOSE C1;
1314         OPEN C2(l_header_id);
1315         rec_count := 1;
1316         LOOP
1317             l_item_id := null;
1318             l_uom_code := null;
1319             l_revision := null;
1320             l_ship_set := null;
1321             l_source_org := null;
1322             l_order_quantity := null;
1323             l_line_id := null;
1324             l_reservation_id := null;
1325             FETCH C2 INTO l_item_id,l_uom_code,l_revision,
1326                                  l_ship_set,l_source_org,l_order_quantity,
1327                                  l_line_id,l_reservation_id;
1328             EXIT WHEN C2 % NOTFOUND ;
1329             l_parts_lines(rec_count).inventory_item_id := l_item_id;
1330             --l_parts_lines(rec_count).item_description  := 'test';
1331             l_parts_lines(rec_count).line_num := rec_count ;
1332             l_parts_lines(rec_count).revision          := l_revision;
1333             l_parts_lines(rec_count).quantity          := NULL;
1334             l_parts_lines(rec_count).unit_of_measure   := l_uom_code ;
1335             l_parts_lines(rec_count).dest_subinventory := l_destination_sub_inv ;
1336             l_parts_lines(rec_count).source_organization_id  :=  l_source_org ;
1337             l_parts_lines(rec_count).source_subinventory     :=  NULL;
1338             l_parts_lines(rec_count).ship_complete           :=  l_ship_set;
1339             l_parts_lines(rec_count).likelihood              :=  NULL;
1340             l_parts_lines(rec_count).ordered_quantity        :=  l_order_quantity;
1341             --l_parts_lines(rec_count).reservation_id          :=  l_reservation_id;
1342             l_parts_lines(rec_count).requirement_line_id     :=  l_line_id;
1343             rec_count := rec_count + 1;
1344         END LOOP;
1345         CLOSE C2;
1346         OPEN csp_ship_to_location(l_resource_id,l_resource_type);
1347         LOOP
1348             FETCH csp_ship_to_location INTO l_ship_to_location_id;
1349             EXIT WHEN csp_ship_to_location% NOTFOUND;
1350         END LOOP;
1351         CLOSE csp_ship_to_location;
1352         l_parts_header.ORDER_TYPE_ID := FND_PROFILE.value(name => 'CSP_ORDER_TYPE');
1353         l_parts_header.SHIP_TO_LOCATION_ID :=  l_ship_to_location_id;
1354         l_parts_header.DEST_ORGANIZATION_ID := l_destination_org_id;
1355         l_parts_header.OPERATION := 'CREATE';
1356         CSP_PARTS_ORDER.process_order(
1357                                       p_api_version   =>  1.0
1358                                      ,p_Init_Msg_List =>  FND_API.G_FALSE
1359                                      ,p_commit        =>  FND_API.G_FALSE
1360                                      ,px_header_rec   =>  l_parts_header
1361                                      ,px_line_table   =>  l_parts_lines
1362                                      ,x_return_status =>  l_return_status
1363                                      ,x_msg_count     =>  l_msg_count
1364                                      ,x_msg_data      =>  l_msg_data
1365                                      );
1366        IF x_return_status <> FND_API.G_RET_STS_SUCCESS THEN
1367             ROLLBACK TO CREATE_ORDERS;
1368              x_return_status := FND_API.G_RET_STS_ERROR;
1369              FND_MESSAGE.SET_NAME('CSP', 'CSP_SCH_UNABLE_TO_ORDER');
1370              FND_MSG_PUB.ADD;
1371              fnd_msg_pub.count_and_get
1372                             ( p_count => x_msg_count
1373                             , p_data  => x_msg_data);
1374             return;
1375        ELSE
1376           FOR I IN 1..l_parts_lines.count LOOP
1377                 l_requrements_lines(I).REQUIREMENT_LINE_ID :=  l_parts_lines(I).requirement_line_id;
1378                 l_requrements_lines(I).ORDER_LINE_ID       :=  l_parts_lines(I).order_line_id;
1379                 CSP_SCH_INT_PVT.TRANSFER_RESERVATION(p_reservation_id  => l_parts_lines(I).reservation_id
1380                                                     ,p_order_header_id => l_parts_header.order_header_id
1381                                                     ,p_order_line_id   => l_parts_lines(I).order_line_id
1382                                                     ,x_return_status   => x_return_status
1383                                                     ,x_reservation_id  => x_reservation_id
1384                                                     ,x_msg_data        => x_msg_data
1385                                                     ,x_msg_count       => x_msg_count);
1386                IF x_return_status <> FND_API.G_RET_STS_SUCCESS THEN
1387                     Rollback to CREATE_ORDERS;
1388                     x_msg_data := ' Unable to Transfer Reservations';
1389                     x_return_status := FND_API.G_RET_STS_ERROR;
1390                     return;
1391                ELSE
1392                     l_requrements_lines(I).reservation_id := x_reservation_id;
1393                END IF;
1394           END LOOP;
1395           CSP_Requirement_Lines_PVT.Update_requirement_lines(
1396                                     P_Api_Version_Number     => 1.0,
1397                                     P_Init_Msg_List          => FND_API.G_FALSE,
1398                                     P_Commit                 => FND_API.G_FALSE,
1399                                     p_validation_level       => FND_API.G_VALID_LEVEL_FULL,
1400                                     P_Requirement_Line_Tbl   => l_requrements_lines,
1401                                     X_Return_Status          => l_return_status,
1402                                     X_Msg_Count              => l_msg_count,
1403                                     X_Msg_Data               => l_msg_data
1404                                     )  ;
1405          IF x_return_status <> FND_API.G_RET_STS_SUCCESS THEN
1406             ROLLBACK TO CREATE_ORDERS;
1407             return;
1408          END IF;
1409       END IF;
1410       EXCEPTION
1411         WHEN OTHERS THEN
1412             FND_MESSAGE.SET_NAME('CSP', 'CSP_UNEXPECTED_EXEC_ERRORS');
1413             FND_MESSAGE.SET_TOKEN('ROUTINE', l_api_name, TRUE);
1414             FND_MESSAGE.SET_TOKEN('SQLERRM', sqlerrm, TRUE);
1415             FND_MSG_PUB.ADD;
1416             fnd_msg_pub.count_and_get
1417               ( p_count => x_msg_count
1418               , p_data  => x_msg_data);
1419             x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
1420   END CREATE_ORDERS;*/
1421 
1422   PROCEDURE GET_ORGANIZATION_SUBINV( p_resources            IN  CSP_SCH_INT_PVT.csp_sch_resource_tbl_typ
1423                                     ,x_resource_org_subinv  OUT NOCOPY CSP_SCH_INT_PVT.csp_resource_org_tbl_typ
1424                                     ,x_return_status        OUT NOCOPY VARCHAR2
1425                                     ,x_msg_data             OUT NOCOPY VARCHAR2
1426                                     ,x_msg_count            OUT NOCOPY NUMBER) IS
1427 
1428         CURSOR csp_resource_org(l_resource_id number, l_resource_type varchar2) IS
1429         SELECT  ORGANIZATION_ID, SUBINVENTORY_CODE
1430         FROM    CSP_INV_LOC_ASSIGNMENTS
1431         WHERE   RESOURCE_ID = l_resource_id
1432         AND     RESOURCE_TYPE = l_resource_type
1433         AND     DEFAULT_CODE = 'IN' ;
1434 
1435         CURSOR csp_resource_type_name(l_resource_type varchar2) is
1436         SELECT NAME
1437         FROM JTF_OBJECTS_VL
1438         WHERE OBJECT_CODE = l_resource_type;
1439         l_organization NUMBER;
1440         l_sub_inventory VARCHAR2(10);
1441         l_api_name   varchar2(60) :=    'CSP_SCH_INT_PVT.GET_ORGANIZATION_SUBINV';
1442         l_msg_count  number;
1443         l_msg_data   number;
1444         l_resource_name varchar2(1000);
1445         l_resource_type_name varchar2(1000);
1446   BEGIN
1447         x_return_status := FND_API.G_RET_STS_SUCCESS;
1448         x_resource_org_subinv := CSP_SCH_INT_PVT.csp_resource_org_tbl_typ();
1449         FOR I IN 1..p_resources.count LOOP
1450                OPEN csp_resource_org(p_resources(I).resource_id, p_resources(I).resource_type);
1451                 LOOP
1452                     FETCH csp_resource_org INTO l_organization,l_sub_inventory ;
1453                     EXIT WHEN csp_resource_org%NOTFOUND ;
1454                 END LOOP;
1455                     IF csp_resource_org%rowcount =0 THEN
1456                         /*select csp_pick_utils.get_object_name(p_resources(I).resource_type,p_resources(I).resource_id)
1457                         INTO   l_resource_name
1458                         FROM   DUAL;*/
1459                         OPEN csp_resource_type_name(p_resources(I).resource_type);
1460                         LOOP
1461                             FETCH csp_resource_type_name INTO l_resource_type_name;
1462                             EXIT WHEN csp_resource_type_name%NOTFOUND;
1463                         END LOOP;
1464                         CLOSE csp_resource_type_name;
1465                         l_resource_name := csp_pick_utils.get_object_name(p_resources(I).resource_type,p_resources(I).resource_id);
1466                         FND_MESSAGE.SET_NAME('CSP', 'CSP_SCH_DEFAULT_SUBINV');
1467                         FND_MESSAGE.SET_TOKEN('RESOURCE_TYPE',l_resource_type_name,FALSE);
1468                         FND_MESSAGE.SET_TOKEN('RESOURCE_NAME',l_resource_name, FALSE);
1469                         FND_MSG_PUB.ADD;
1470                         fnd_msg_pub.count_and_get( p_count => x_msg_count
1471                                                  , p_data  => x_msg_data);
1472                       --  x_msg_data := 'Default organization and subinventory not defined for  ' || l_resource_type_name || '  ' || l_resource_name ;
1473                         x_return_status := FND_API.G_RET_STS_ERROR;
1474                         return;
1475                     END IF;
1476                 CLOSE csp_resource_org;
1477                      x_resource_org_subinv.extend;
1478                      x_resource_org_subinv(I).resource_id := p_resources(I).resource_id ;
1479                      x_resource_org_subinv(I).resource_type := p_resources(I).resource_type ;
1480                      x_resource_org_subinv(I).organization_id := l_organization;
1481                      x_resource_org_subinv(I).sub_inv_code  := l_sub_inventory;
1482         END LOOP;
1483         EXCEPTION
1484         WHEN OTHERS THEN
1485             FND_MESSAGE.SET_NAME('CSP', 'CSP_UNEXPECTED_EXEC_ERRORS');
1486             FND_MESSAGE.SET_TOKEN('ROUTINE', l_api_name, FALSE);
1487             FND_MESSAGE.SET_TOKEN('SQLERRM', sqlerrm,FALSE);
1488             FND_MSG_PUB.ADD;
1489             fnd_msg_pub.count_and_get
1490               ( p_count => x_msg_count
1491               , p_data  => x_msg_data);
1492             x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
1493   END GET_ORGANIZATION_SUBINV;
1494 
1495   PROCEDURE GET_PARTS_LIST(p_task_id       IN NUMBER
1496                            ,p_likelihood    IN NUMBER
1497                            ,x_parts_list    OUT NOCOPY CSP_SCH_INT_PVT.csp_parts_tbl_typ1
1498                            ,x_return_status OUT NOCOPY VARCHAR2
1499                            ,x_msg_data      OUT NOCOPY VARCHAR2
1500                            ,x_msg_count     OUT NOCOPY NUMBER) IS
1501 
1502         CURSOR parts_list(product_task NUMBER,  parts_category NUMBER) IS
1503         SELECT INVENTORY_ITEM_ID,REQUIRED_QUANTITY , UOM_CODE,SHIP_COMPLETE_FLAG,REVISION,REQUIREMENT_LINE_ID
1504         FROM   CSP_REQUIREMENT_LINES crl, CSP_REQUIREMENT_HEADERS crh
1505         WHERE  crh.TASK_ID = product_task
1506         AND    crl.requirement_header_id = crh.requirement_header_id
1507         AND    nvl(crl.LIKELIHOOD,0) >= nvl(parts_category,0) ;
1508 
1509         part_number   NUMBER;
1510         part_quantity NUMBER;
1511         l_requirement_header_id NUMBER;
1512         part_uom      varchar2(3) ;
1513         l_ship_complet VARCHAR2(30);
1514         l_msg_data     VARCHAR2(2000);
1515         l_msg_count    NUMBER;
1516         l_revision     varchar2(3);
1517         l_api_name     varchar2(60) := 'CSP_SCH_INT_PVT.GET_PARTS_LIST' ;
1518         l_header_id    NUMBER;
1519         loop_count     NUMBER := 0;
1520         l_line_id     NUMBER;
1521 
1522   BEGIN
1523        -- savepoint GET_PARTS_LIST;
1524         x_return_status := FND_API.G_RET_STS_SUCCESS ;
1525        --x_parts_list := CSP_SCH_INT_PVT.csp_parts_tbl_typ1();
1526             OPEN parts_list(p_task_id, p_likelihood);
1527                 LOOP
1528                     FETCH parts_list  INTO part_number, part_quantity , part_uom , l_ship_complet,l_revision , l_line_id;
1529                     EXIT WHEN parts_list % NOTFOUND;
1530                         --x_parts_list.extend;
1531                         loop_count := loop_count + 1;
1532                         x_parts_list(loop_count).item_id       :=  part_number ;
1533                         x_parts_list(loop_count).quantity      :=  part_quantity ;
1534                         x_parts_list(loop_count).Item_UOM      :=  part_uom;
1535                         x_parts_list(loop_count).ship_set_name :=  l_ship_complet ;
1536                         x_parts_list(loop_count).revision      :=  l_revision;
1537                         x_parts_list(loop_count).line_id       :=  l_line_id;
1538                 END LOOP;
1539            CLOSE parts_list;
1540         EXCEPTION
1541         WHEN OTHERS THEN
1542         FND_MESSAGE.SET_NAME('CSP', 'CSP_UNEXPECTED_EXEC_ERRORS');
1543             FND_MESSAGE.SET_TOKEN('ROUTINE', l_api_name, FALSE);
1544             FND_MESSAGE.SET_TOKEN('SQLERRM', sqlerrm, FALSE);
1545             FND_MSG_PUB.ADD;
1546             fnd_msg_pub.count_and_get
1547               ( p_count => x_msg_count
1548               , p_data  => x_msg_data);
1549             x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
1550         return;
1551   END GET_PARTS_LIST;
1552   PROCEDURE CHECK_LOCAl_INVENTORY(p_resource_org_subinv  IN   CSP_SCH_INT_PVT.CSP_RESOURCE_ORG_tbl_TYP
1553                                  ,p_parts_list          IN   CSP_SCH_INT_PVT.CSP_PARTS_TBL_TYP1
1554                                  ,x_unavailable_list    OUT NOCOPY  CSP_SCH_INT_PVT.CSP_UNAVAILABILITY_TBL_TYPE
1555                                  ,x_available_list      OUT NOCOPY  CSP_SCH_INT_PVT.CSP_AVAILABILITY_TBL_TYPE
1556                                  ,x_return_status       OUT NOCOPY  VARCHAR2
1557                                  ,x_msg_data            OUT NOCOPY  VARCHAR2
1558                                  ,x_msg_count           OUT NOCOPY  NUMBER) IS
1559    /* CURSOR reservation_check(org_id NUMBER, sub_inv_code VARCHAR2,item_id NUMBER)
1560     IS
1561     SELECT NVL((REQUIRED_QUANTITY-ORDERED_QUANTITY),0)
1562     FROM   CSP_REQUIREMENT_LINES
1563     WHERE  REQUIREMENT_HEADER_ID = (SELECT REQUIREMENT_HEADER_ID
1564                                     FROM   CSP_REQUIREMENT_HEADERS
1565                                     WHERE  OPEN_REQUIREMENT = 'Yes'
1566                                     AND    DESTINATION_ORGANIZATION_ID = org_id)
1567     AND   SOURCE_SUBINVENTORY =  sub_inv_code
1568     AND   INVENTORY_ITEM_ID = item_id
1569     AND   ORDER_LINE_ID IS NOT NULL ;*/
1570 
1571         CURSOR substitutes(item_id NUMBER,org_id NUMBER) IS
1572         SELECT mri.RELATED_ITEM_ID
1573         FROM   MTL_RELATED_ITEMS_VIEW mri, mtl_parameters mp
1574         WHERE  mp.organization_id = org_id
1575         AND    mri.INVENTORY_ITEM_ID = item_id
1576         AND    mri.RELATIONSHIP_TYPE_ID = 2
1577         AND    mri.ORGANIZATION_ID  = MP.MASTER_ORGANIZATION_ID;
1578 
1579     l_onhand            NUMBER;
1580     l_available         NUMBER;
1581     l_msg_data          VARCHAR2(2000);
1582     l_msg_count         NUMBER;
1583     l_return_status     VARCHAR2(128);
1584     l_rqoh              NUMBER;
1585     l_qr                NUMBER;
1586     l_qs                NUMBER;
1587     l_att               NUMBER;
1588     l_temp_reserv_quantity NUMBER;
1589     l_substitute_item  NUMBER;
1590     l_api_name varchar2(60) := 'CSP_SCH_INT_PVT.CHECK_LOCAl_INVENTORY';
1591    --- l_cumulative_att   NUMBER;
1592     l_supersede_items  CSP_SUPERSESSIONS_PVT.NUMBER_ARR;
1593     l_required_quantity NUMBER;
1594     l_alternate_parts CSP_SUPERSESSIONS_PVT.NUMBER_ARR;
1595     l_append     boolean := true;
1596     l_revision_controlled BOOLEAN := false;
1597     l_reservation_parts       CSP_SCH_INT_PVT.RESERVATION_REC_TYP;
1598     l_reservation_id NUMBER;
1599      l_res_ids CSP_SUPERSESSIONS_PVT.NUMBER_ARR;
1600   BEGIN
1601       savepoint csp_check_local_inv;
1602       x_return_status := FND_API.G_RET_STS_SUCCESS;
1603       x_unavailable_list:=  CSP_SCH_INT_PVT.CSP_UNAVAILABILITY_TBL_TYPE();
1604       x_available_list  := CSP_SCH_INT_PVT.CSP_AVAILABILITY_TBL_TYPE();
1605       if l_res_ids.count > 0 THEN
1606         l_res_ids.delete;
1607       END IF;
1608           FOR I IN 1..p_resource_org_subinv.count LOOP
1609             FOR J IN 1..p_parts_list.count LOOP
1610 		  	l_required_quantity := 0;
1611                IF fnd_profile.value(name => 'CSP_INCL_ALTERNATES')= 'ALWAYS' or
1612                   fnd_profile.value(name => 'CSP_INCL_ALTERNATES')= 'SCHONLY'  THEN
1613                  if l_alternate_parts.count >0 THEN
1614                     l_alternate_parts.delete;
1615                  END IF;
1616                  if l_supersede_items.count > 0 THEN
1617                     l_supersede_items.DELETE;
1618                  END IF;
1619                 CSP_SUPERSESSIONS_PVT.get_supersede_bilateral_items(p_inventory_item_id => p_parts_list(J).item_id
1620                                                     ,p_organization_id => p_resource_org_subinv(I).organization_id
1621                                                     ,x_supersede_items => l_supersede_items);
1622                 l_alternate_parts := l_supersede_items;
1623 
1624                 OPEN substitutes(p_parts_list(J).item_id, p_resource_org_subinv(I).organization_id);
1625                 LOOP
1626                   FETCH substitutes INTO l_substitute_item;
1627                   EXIT WHEN substitutes % NOTFOUND;
1628                     l_append := true;
1629                     FOR I IN 1.. l_alternate_parts.count LOOP
1630                         if l_substitute_item =  l_alternate_parts(I) then
1631                            l_append := false;
1632                            exit;
1633                         end if;
1634                     END LOOP;
1635                         IF l_append THEN
1636                             l_alternate_parts(l_alternate_parts.count+1) := l_substitute_item;
1637                         END IF;
1638                     l_substitute_item := null;
1639                 END LOOP;
1640                 CLOSE substitutes;
1641                 END IF;
1642 
1643                IF fnd_profile.value(name => 'CSP_INCL_CAR_STOCK')= 'ALWAYS' or
1644                   fnd_profile.value(name => 'CSP_INCL_CAR_STOCK')= 'SCHONLY'  THEN
1645                 l_att := 0;
1646                     IF p_parts_list(J).revision IS NOT NULL THEN
1647                         l_revision_controlled := TRUE;
1648                     END IF;
1649                     inv_quantity_tree_pub.clear_quantity_cache;
1650                 inv_quantity_tree_pub.query_quantities(p_api_version_number => 1.0
1651                                                      , p_organization_id  => p_resource_org_subinv(I).organization_id
1652                                                      , p_inventory_item_id => p_parts_list(J).item_id
1653                                                      , p_subinventory_code => p_resource_org_subinv(I).sub_inv_code
1654                                                      , x_qoh     => l_onhand
1655                                                      , x_atr     => l_available
1656                                                      , p_init_msg_lst   => fnd_api.g_false
1657                                                      , p_tree_mode   => inv_quantity_tree_pvt.g_transaction_mode
1658                                                      , p_is_revision_control => l_revision_controlled
1659                                                      , p_is_lot_control  => NULL
1660                                                      , p_is_serial_control => NULL
1661                                                      , p_revision    =>  p_parts_list(J).revision
1662                                                      , p_lot_number   => NULL
1663                                                      , p_locator_id   => NULL
1664                                                      , x_rqoh     => l_rqoh
1665                                                      , x_qr     => l_qr
1666                                                      , x_qs     => l_qs
1667                                                      , x_att     => l_att
1668                                                      , x_return_status  => l_return_status
1669                                                      , x_msg_count   => l_msg_count
1670                                                      , x_msg_data    => l_msg_data
1671                                                      );
1672                 IF x_return_status <> FND_API.G_RET_STS_SUCCESS THEN
1673                     l_att := 0;
1674                 END IF;
1675                     /*OPEN reservation_check(p_resource_org_subinv(I).organization_id, p_resource_org_subinv(I).sub_inv_code,p_parts_list(J).item_id);
1676                     LOOP
1677                         FETCH reservation_check INTO l_temp_reserv_quantity;
1678                         EXIT WHEN reservation_check% NOTFOUND;
1679                         l_att := l_att - l_temp_reserv_quantity ;
1680                      END LOOP;
1681                     CLOSE reservation_check;*/
1682                     IF l_att <= 0 THEN
1683                         l_att := 0;
1684                     ELSIF  l_att >=  p_parts_list(J).quantity THEN
1685                         x_available_list.extend;
1686                         x_available_list(x_available_list.count).resource_id := p_resource_org_subinv(I).resource_id;
1687                         x_available_list(x_available_list.count).resource_type := p_resource_org_subinv(I).resource_type;
1688                         x_available_list(x_available_list.count).organization_id   := p_resource_org_subinv(I).organization_id;
1689                         x_available_list(x_available_list.count).item_id   := p_parts_list(J).item_id ;
1690                         x_available_list(x_available_list.count).item_uom   := p_parts_list(J).item_uom ;
1691                         x_available_list(x_available_list.count).revision   := p_parts_list(J).revision ;
1692                         x_available_list(x_available_list.count).quantity  := p_parts_list(J).quantity  ;
1693                         x_available_list(x_available_list.count).source_org := p_resource_org_subinv(I).organization_id ;
1694                         x_available_list(x_available_list.count).sub_inventory := p_resource_org_subinv(I).sub_inv_code;
1695                         x_available_list(x_available_list.count).AVAILABLE_DATE  := SYSDATE;
1696                         x_available_list(x_available_list.count).line_id  := p_parts_list(J).line_id;
1697                         IF l_alternate_parts.count >0 THEN
1698                          l_reservation_id := NULL;
1699                             l_reservation_parts.need_by_date       := sysdate;
1700                             l_reservation_parts.organization_id    := x_available_list(x_available_list.count).source_org ;
1701                             l_reservation_parts.item_id            := x_available_list(x_available_list.count).item_id;
1702                             l_reservation_parts.item_uom_code      := x_available_list(x_available_list.count).item_uom ;
1703                             l_reservation_parts.quantity_needed    := x_available_list(x_available_list.count).quantity ;
1704                             l_reservation_parts.sub_inventory_code := x_available_list(x_available_list.count).sub_inventory;
1705                             l_reservation_parts.line_id            := x_available_list(x_available_list.count).line_id ;
1706                             l_reservation_parts.revision           :=  x_available_list(x_available_list.count).revision;
1707                             l_reservation_id := CSP_SCH_INT_PVT.CREATE_RESERVATION(l_reservation_parts,x_return_status,x_msg_data);
1708 
1709                          IF l_reservation_id <= 0 THEN
1710                             FND_MESSAGE.SET_NAME('CSP', 'CSP_SCH_COULD_NOT_RESERVE');
1711                             FND_MSG_PUB.ADD;
1712                             fnd_msg_pub.count_and_get
1713                                 ( p_count => x_msg_count
1714                                 , p_data  => x_msg_data);
1715                          else
1716                              l_res_ids(l_res_ids.count+1) := l_reservation_id;
1717                          END IF;
1718                         END IF;
1719                     ELSIF l_att <=  p_parts_list(J).quantity THEN
1720                         x_available_list.extend;
1721                         x_available_list(x_available_list.count).resource_id := p_resource_org_subinv(I).resource_id;
1722                         x_available_list(x_available_list.count).resource_type := p_resource_org_subinv(I).resource_type;
1723                         x_available_list(x_available_list.count).organization_id   := p_resource_org_subinv(I).organization_id;
1724                         x_available_list(x_available_list.count).item_id   := p_parts_list(J).item_id ;
1725                         x_available_list(x_available_list.count).item_uom   := p_parts_list(J).item_uom ;
1726                         x_available_list(x_available_list.count).revision   := p_parts_list(J).revision ;
1727                         x_available_list(x_available_list.count).quantity  := l_att ;
1728                         x_available_list(x_available_list.count).source_org := p_resource_org_subinv(I).organization_id ;
1729                         x_available_list(x_available_list.count).sub_inventory := p_resource_org_subinv(I).sub_inv_code;
1730                         x_available_list(x_available_list.count).AVAILABLE_DATE  := SYSDATE;
1731                         x_available_list(x_available_list.count).line_id  := p_parts_list(J).line_id;
1732                          IF l_alternate_parts.count >0 THEN
1733                             l_reservation_id := NULL;
1734                             l_reservation_parts.need_by_date       := sysdate;
1735                             l_reservation_parts.organization_id    := x_available_list(x_available_list.count).source_org ;
1736                             l_reservation_parts.item_id            := x_available_list(x_available_list.count).item_id;
1737                             l_reservation_parts.item_uom_code      := x_available_list(x_available_list.count).item_uom ;
1738                             l_reservation_parts.quantity_needed    := x_available_list(x_available_list.count).quantity ;
1739                             l_reservation_parts.sub_inventory_code := x_available_list(x_available_list.count).sub_inventory;
1740                             l_reservation_parts.line_id            := x_available_list(x_available_list.count).line_id ;
1741                             l_reservation_parts.revision           :=  x_available_list(x_available_list.count).revision;
1742                              l_reservation_id := CSP_SCH_INT_PVT.CREATE_RESERVATION(l_reservation_parts,x_return_status,x_msg_data);
1743 
1744                          IF l_reservation_id <= 0 THEN
1745                             FND_MESSAGE.SET_NAME('CSP', 'CSP_SCH_COULD_NOT_RESERVE');
1746                             FND_MSG_PUB.ADD;
1747                             fnd_msg_pub.count_and_get
1748                                 ( p_count => x_msg_count
1749                                 , p_data  => x_msg_data);
1750                           else
1751                              l_res_ids(l_res_ids.count+1) := l_reservation_id;
1752                          END IF;
1753                         END IF;
1754                     END IF;
1755 
1756                     IF l_att < p_parts_list(J).quantity THEN
1757                     l_required_quantity := p_parts_list(J).quantity - l_att;
1758                          FOR K IN 1..l_alternate_parts.count LOOP
1759                             l_onhand := 0;
1760                             l_available := 0;
1761                             l_rqoh := 0;
1762                             l_qr := 0;
1763                             l_qs := 0;
1764                             l_att := 0;
1765                             l_msg_count := 0;
1766                             inv_quantity_tree_pub.clear_quantity_cache;
1767                             inv_quantity_tree_pub.query_quantities(p_api_version_number => 1.0
1768                                                      , p_organization_id  => p_resource_org_subinv(I).organization_id
1769                                                      , p_inventory_item_id => l_alternate_parts(k)
1770                                                      , p_subinventory_code => p_resource_org_subinv(I).sub_inv_code
1771                                                      , x_qoh     => l_onhand
1772                                                      , x_atr     => l_available
1773                                                      , p_init_msg_lst   => fnd_api.g_false
1774                                                      , p_tree_mode   => inv_quantity_tree_pvt.g_transaction_mode
1775                                                      , p_is_revision_control => NULL
1776                                                      , p_is_lot_control  => NULL
1777                                                      , p_is_serial_control => NULL
1778                                                      , p_revision    =>  NULL
1779                                                      , p_lot_number   => NULL
1780                                                      , p_locator_id   => NULL
1781                                                      , x_rqoh     => l_rqoh
1782                                                      , x_qr     => l_qr
1783                                                      , x_qs     => l_qs
1784                                                      , x_att     => l_att
1785                                                      , x_return_status  => l_return_status
1786                                                      , x_msg_count   => l_msg_count
1787                                                      , x_msg_data    => l_msg_data
1788                                                      );
1789 
1790                             IF l_att <= 0 THEN
1791                                 l_att := 0;
1792                             ELSIF  l_att >=  l_required_quantity THEN
1793                                 x_available_list.extend;
1794                                 x_available_list(x_available_list.count).resource_id := p_resource_org_subinv(I).resource_id;
1795                                 x_available_list(x_available_list.count).resource_type := p_resource_org_subinv(I).resource_type;
1796                                 x_available_list(x_available_list.count).organization_id   := p_resource_org_subinv(I).organization_id;
1797                                 x_available_list(x_available_list.count).item_id   := l_alternate_parts(k) ;
1798                                 x_available_list(x_available_list.count).item_uom   := p_parts_list(J).item_uom ;
1799                                 x_available_list(x_available_list.count).revision   := p_parts_list(J).revision ;
1800                                 x_available_list(x_available_list.count).quantity  := l_required_quantity ;
1801                                 x_available_list(x_available_list.count).source_org := p_resource_org_subinv(I).organization_id ;
1802                                 x_available_list(x_available_list.count).sub_inventory := p_resource_org_subinv(I).sub_inv_code;
1803                                 x_available_list(x_available_list.count).AVAILABLE_DATE  := SYSDATE;
1804                                 x_available_list(x_available_list.count).line_id  := p_parts_list(J).line_id;
1805                                 IF l_alternate_parts.count >0 THEN
1806                          l_reservation_id := NULL;
1807                             l_reservation_parts.need_by_date       := sysdate;
1808                             l_reservation_parts.organization_id    := x_available_list(x_available_list.count).source_org ;
1809                             l_reservation_parts.item_id            := x_available_list(x_available_list.count).item_id;
1810                             l_reservation_parts.item_uom_code      := x_available_list(x_available_list.count).item_uom ;
1811                             l_reservation_parts.quantity_needed    := x_available_list(x_available_list.count).quantity ;
1812                             l_reservation_parts.sub_inventory_code := x_available_list(x_available_list.count).sub_inventory;
1813                             l_reservation_parts.line_id            := x_available_list(x_available_list.count).line_id ;
1814                             l_reservation_parts.revision           :=  x_available_list(x_available_list.count).revision;
1815                             l_reservation_id := CSP_SCH_INT_PVT.CREATE_RESERVATION(l_reservation_parts,x_return_status,x_msg_data);
1816 
1817                          IF l_reservation_id <= 0 THEN
1818                             FND_MESSAGE.SET_NAME('CSP', 'CSP_SCH_COULD_NOT_RESERVE');
1819                             FND_MSG_PUB.ADD;
1820                             fnd_msg_pub.count_and_get
1821                                 ( p_count => x_msg_count
1822                                 , p_data  => x_msg_data);
1823                           else
1824                              l_res_ids(l_res_ids.count+1) := l_reservation_id;
1825                          END IF;
1826                         END IF;
1827                                 l_required_quantity := 0;
1828                                 exit;
1829                             ELSIF l_att <  l_required_quantity THEN
1830                                 x_available_list.extend;
1831                                 x_available_list(x_available_list.count).resource_id := p_resource_org_subinv(I).resource_id;
1832                                 x_available_list(x_available_list.count).resource_type := p_resource_org_subinv(I).resource_type;
1833                                 x_available_list(x_available_list.count).organization_id   := p_resource_org_subinv(I).organization_id;
1834                                 x_available_list(x_available_list.count).item_id   := l_alternate_parts(k) ;
1835                                 x_available_list(x_available_list.count).item_uom   := p_parts_list(J).item_uom ;
1836                                 x_available_list(x_available_list.count).revision   := p_parts_list(J).revision ;
1837                                 x_available_list(x_available_list.count).quantity  := l_att ;
1838                                 x_available_list(x_available_list.count).source_org := p_resource_org_subinv(I).organization_id ;
1839                                 x_available_list(x_available_list.count).sub_inventory := p_resource_org_subinv(I).sub_inv_code;
1840                                 x_available_list(x_available_list.count).AVAILABLE_DATE  := SYSDATE;
1841                                 x_available_list(x_available_list.count).line_id  := p_parts_list(J).line_id;
1842                                 IF l_alternate_parts.count >0 THEN
1843                          l_reservation_id := NULL;
1844                             l_reservation_parts.need_by_date       := sysdate;
1845                             l_reservation_parts.organization_id    := x_available_list(x_available_list.count).source_org ;
1846                             l_reservation_parts.item_id            := x_available_list(x_available_list.count).item_id;
1847                             l_reservation_parts.item_uom_code      := x_available_list(x_available_list.count).item_uom ;
1848                             l_reservation_parts.quantity_needed    := x_available_list(x_available_list.count).quantity ;
1849                             l_reservation_parts.sub_inventory_code := x_available_list(x_available_list.count).sub_inventory;
1850                             l_reservation_parts.line_id            := x_available_list(x_available_list.count).line_id ;
1851                             l_reservation_parts.revision           :=  x_available_list(x_available_list.count).revision;
1852                             l_reservation_id := CSP_SCH_INT_PVT.CREATE_RESERVATION(l_reservation_parts,x_return_status,x_msg_data);
1853 
1854                          IF l_reservation_id <= 0 THEN
1855                             FND_MESSAGE.SET_NAME('CSP', 'CSP_SCH_COULD_NOT_RESERVE');
1856                             FND_MSG_PUB.ADD;
1857                             fnd_msg_pub.count_and_get
1858                                 ( p_count => x_msg_count
1859                                 , p_data  => x_msg_data);
1860                            else
1861                              l_res_ids(l_res_ids.count+1) := l_reservation_id;
1862                          END IF;
1863                         END IF;
1864                             END IF;
1865                             l_required_quantity := l_required_quantity - l_att ;
1866                          END LOOP;
1867                     END IF;
1868                   ELSE
1869                     l_required_quantity := p_parts_list(J).quantity;
1870                   END IF;
1871                 IF l_required_quantity > 0 THEN
1872                         x_unavailable_list.extend ;
1873                         x_unavailable_list(x_unavailable_list.count).resource_id
1874                                                                         := p_resource_org_subinv(I).resource_id;
1875                         x_unavailable_list(x_unavailable_list.count).resource_type
1876                                                                         := p_resource_org_subinv(I).resource_type;
1877                         x_unavailable_list(x_unavailable_list.count).organization_id   := p_resource_org_subinv(I).organization_id;
1878                         x_unavailable_list(x_unavailable_list.count).item_id   := p_parts_list(J).Item_id ;
1879                         x_unavailable_list(x_unavailable_list.count).quantity  := l_required_quantity;
1880                         x_unavailable_list(x_unavailable_list.count).item_UOM := p_parts_list(J).Item_UOM ;
1881                         x_unavailable_list(x_unavailable_list.count).revision := p_parts_list(J).revision   ;
1882                         x_unavailable_list(x_unavailable_list.count).ship_set_name := p_parts_list(J).ship_set_name;
1883                         x_unavailable_list(x_unavailable_list.count).line_id := p_parts_list(J).line_id;
1884                     FOR K IN 1..l_alternate_parts.count LOOP
1885                         x_unavailable_list.extend ;
1886                         x_unavailable_list(x_unavailable_list.count).resource_id
1887                                                                         := p_resource_org_subinv(I).resource_id;
1888                         x_unavailable_list(x_unavailable_list.count).resource_type
1889                                                                         := p_resource_org_subinv(I).resource_type;
1890                         x_unavailable_list(x_unavailable_list.count).organization_id   := p_resource_org_subinv(I).organization_id;
1891                         x_unavailable_list(x_unavailable_list.count).item_id   := l_alternate_parts(k);
1892                         x_unavailable_list(x_unavailable_list.count).quantity  := l_required_quantity;
1893                         x_unavailable_list(x_unavailable_list.count).item_UOM := p_parts_list(J).Item_UOM ;
1894                         x_unavailable_list(x_unavailable_list.count).revision := p_parts_list(J).revision ;
1895                         x_unavailable_list(x_unavailable_list.count).ship_set_name := p_parts_list(J).ship_set_name;
1896                         x_unavailable_list(x_unavailable_list.count).line_id := p_parts_list(J).line_id;
1897                     END LOOP;
1898                 END IF;
1899                 END LOOP;
1900             END LOOP;
1901              for i in 1..l_res_ids.count loop
1902                 CSP_SCH_INT_PVT.DELETE_RESERVATION(l_res_ids(i),x_return_status,x_msg_data);
1903               end loop;
1904       EXCEPTION
1905         WHEN OTHERS THEN
1906             FND_MESSAGE.SET_NAME('CSP', 'CSP_UNEXPECTED_EXEC_ERRORS');
1907             FND_MESSAGE.SET_TOKEN('ROUTINE', l_api_name, FALSE);
1908             FND_MESSAGE.SET_TOKEN('SQLERRM', sqlerrm, FALSE);
1909             FND_MSG_PUB.ADD;
1910             fnd_msg_pub.count_and_get
1911               ( p_count => x_msg_count
1912               , p_data  => x_msg_data);
1913             x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
1914             return;
1915   END  CHECK_LOCAl_INVENTORY;
1916 PROCEDURE DO_ATP_CHECK(p_unavailable_list         IN     CSP_SCH_INT_PVT.CSP_UNAVAILABILITY_TBL_TYPE
1917                           ,p_interval               IN     CSP_SCH_INT_PVT.csp_sch_interval_rec_typ
1918                           ,px_available_list        IN OUT NOCOPY CSP_SCH_INT_PVT.CSP_AVAILABILITY_TBL_TYPE
1919                           ,x_final_unavailable_list OUT NOCOPY    CSP_SCH_INT_PVT.CSP_UNAVAILABILITY_TBL_TYPE
1920                           ,x_return_status          OUT NOCOPY    VARCHAR2
1921                           ,x_msg_data               OUT NOCOPY    VARCHAR2
1922                           ,x_msg_count              OUT NOCOPY    NUMBER) IS
1923         CURSOR instance IS
1924         SELECT instance_id
1925         FROM   mrp_ap_apps_instances;
1926 
1927         CURSOR  error_message(c_errro_code number) IS
1928         select  meaning
1929         from    mfg_lookups
1930         where   lookup_type = 'MTL_DEMAND_INTERFACE_ERRORS'
1931         and    lookup_code = c_errro_code;
1932 
1933         CURSOR  get_item_segments(c_item_id number,c_organization_id number) IS
1934         select  distinct(CONCATENATED_SEGMENTS)
1935         from    mtl_system_items_b_kfv
1936         where   inventory_item_id = c_item_id
1937         and     organization_id = cs_std.get_item_valdn_orgzn_id;
1938 
1939         CURSOR check_buy_from(c_item_id number,c_assignment_id number, c_organization_id number)
1940         IS
1941        /* SELECT vendor_id, vendor_site_id
1942         FROM  mrp_sources_v
1943         where assignment_set_id = c_assignment_id
1944         and   inventory_item_id = c_item_id
1945         and   organization_id  = c_organization_id
1946         and   source_type = 3;*/
1947        Select 'Y'
1948        from MRP_ITEM_SOURCING_LEVELS_V  misl
1949        where misl.organization_id = c_organization_id
1950        and misl.assignment_set_id =c_assignment_id
1951        and inventory_item_id = c_item_id
1952        and SOURCE_TYPE       = 3
1953        and sourcing_level = (select min(sourcing_level) from MRP_ITEM_SOURCING_LEVELS_V
1954                              where organization_id = c_organization_id
1955                              and assignment_set_id = c_assignment_id
1956                              and inventory_item_id = c_item_id
1957                              and sourcing_level not in (2,9));
1958 
1959         l_atp_rec            mrp_atp_pub.atp_rec_typ;
1960         l_atp_rec_out        mrp_atp_pub.atp_rec_typ;
1961         l_atp_supply_demand  mrp_atp_pub.atp_supply_demand_typ;
1962         l_atp_period         mrp_atp_pub.atp_period_typ;
1963         l_atp_details        mrp_atp_pub.atp_details_typ;
1964         l_mrp_database_link  VARCHAR2(128);
1965         l_statement          VARCHAR2(500);
1966         l_session_id         NUMBER;
1967         l_return_status      VARCHAR2(128);
1968      --   x_msg_data           VARCHAR2(2000);
1969      --   x_msg_count          NUMBER;
1970         l_msg                varchar2(2000);
1971         l_ship_complete_profile VARCHAR2(3);
1972         l_instance_id        NUMBER;
1973         l_api_name           VARCHAR2(60) := 'CSP_SCH_INT_PVT.DO_ATP_CHECK' ;
1974         l_message	     varchar2(2000);
1975         l_item_segments	     varchar2(1000);
1976         l_error		     BOOLEAN := FALSE;
1977         dbug_variable1    NUMBER;
1978         l_calling_module NUMBER := NULL;
1979         l_buy_from varchar2(1);
1980         l_assignment_set_id NUMBER;
1981         l_unavailable varchar2(1);
1982     BEGIN
1983         x_return_status := FND_API.G_RET_STS_SUCCESS;
1984         x_final_unavailable_list := CSP_SCH_INT_PVT.CSP_UNAVAILABILITY_TBL_TYPE();
1985                 OPEN instance;
1986                 FETCH instance INTO l_instance_id;
1987                 CLOSE instance;
1988             l_mrp_database_link := fnd_profile.value(name => 'MRP_ATP_DATABASE_LINK');
1989             If l_mrp_database_link IS NULL Then
1990                 Select MRP_ATP_SCHEDULE_TEMP_S.NextVal
1991                 Into   l_session_id
1992                 From   Dual;
1993                 l_calling_module := 724;
1994              Else
1995                  get_session_id(p_database_link => l_mrp_database_link,
1996                                 x_sesssion_id => l_session_id);
1997                 l_calling_module := NULL;
1998              End If;
1999          FOR I in 1..p_unavailable_list.count LOOP
2000                      msc_satp_func.extend_atp(l_atp_rec,x_return_status,1);
2001                     l_atp_rec.Insert_Flag(I) := 1;
2002                     l_atp_rec.inventory_item_id(I) := p_unavailable_list(I).item_id;
2003                     l_atp_rec.quantity_ordered(I) := p_unavailable_list(I).quantity;
2004                     l_atp_rec.quantity_uom(I) :=  p_unavailable_list(I).Item_UOM;
2005                     l_atp_rec.calling_module(I) := l_calling_module;  ---- 724
2006                     l_atp_rec.action(I) := 100 ;
2007                     l_atp_rec.Instance_Id(I)  := l_instance_id ;  ----- (for srp it is 1);
2008                     IF p_interval.latest_time IS NOT NULL THEN
2009                        l_atp_rec.latest_acceptable_date(I)  := p_interval.latest_time ;
2010                     END IF;
2011 
2012                     --l_atp_rec.latest_acceptable_date(I) := p_interval.latest_time;
2013                     l_atp_rec.Requested_Ship_Date(I) := sysdate ; --'03-MAY-2002' ;
2014                     l_atp_rec.Organization_id(I) := p_unavailable_list(I).organization_id;
2015                     l_atp_rec.Identifier(I):= p_unavailable_list(I).resource_id + I ;
2016                     l_atp_rec.Scenario_Id(I) := 1;
2017                     l_ship_complete_profile := fnd_profile.value(name => 'CSP_SHIP_COMPLETE');
2018                     IF l_ship_complete_profile ='Y' THEN
2019                         IF g_schedular_call = 'Y' THEN
2020                             l_atp_rec.ship_set_name(I) := to_char(p_unavailable_list(I).resource_id);
2021                         ELSE
2022                             l_atp_rec.ship_set_name(I) :=  p_unavailable_list(I).ship_set_name;
2023                         END IF;
2024                     ELSE
2025                             l_atp_rec.ship_set_name(I) :=  p_unavailable_list(I).ship_set_name;
2026                     END IF;
2027             END LOOP;
2028          savepoint csp_msc_atp_check;
2029             MRP_ATP_PUB.CALL_ATP(l_session_id,
2030                                            l_atp_rec,
2031                                            l_atp_rec_out,
2032                                            l_atp_supply_demand,
2033                                            l_atp_period,
2034                                            l_atp_details,
2035                                            x_return_status,
2036                                            x_msg_data,
2037                                            x_msg_count);
2038             l_msg := FND_MSG_PUB.Get(1,FND_API.G_FALSE) ;
2039 
2040             rollback to csp_msc_atp_check;
2041 	IF x_return_status = FND_API.G_RET_STS_SUCCESS  THEN
2042                 l_unavailable := 'Y';
2043                 FOR I IN 1..l_atp_rec_out.Inventory_Item_Id.count LOOP
2044                     IF  (l_atp_rec_out.Error_Code(I) <> 0 and l_atp_rec_out.Error_Code(I) <> 150  ) THEN
2045                         l_assignment_set_id := FND_PROFILE.value(name => 'MRP_ATP_ASSIGN_SET');
2046                         OPEN check_buy_from(l_atp_rec.Inventory_Item_Id(I),l_assignment_set_id, l_atp_rec.Organization_id(I));
2047                         FETCH check_buy_from INTO l_buy_from;
2048                         CLOSE check_buy_from;
2049                        IF   g_schedular_call = 'N' AND l_buy_from = 'Y' THEN
2050                             IF (nvl(l_atp_rec_out.Error_Code(I),0) <> 0  and l_atp_rec_out.Error_Code(I) <> 52 and l_atp_rec_out.Error_Code(I) <>53) THEN
2051                              IF not l_error then
2052                                 OPEN error_message(23);
2053                                 FETCH error_message INTO l_message;
2054                                 CLOSE error_message;
2055 
2056                                 FND_MESSAGE.SET_NAME('CSP', 'CSP_ATP');
2057                                 FND_MESSAGE.SET_TOKEN('ERROR', l_message, FALSE);
2058                                 FND_MSG_PUB.ADD;
2059                                 fnd_msg_pub.count_and_get
2060                                     ( p_count => x_msg_count
2061                                     , p_data  => x_msg_data);
2062 
2063                              END IF;
2064                             x_return_status := FND_API.G_RET_STS_ERROR;
2065                             OPEN error_message(l_atp_rec_out.Error_Code(I));
2066                             FETCH error_message INTO l_message;
2067                             CLOSE error_message;
2068                              l_item_segments := null;
2069                             OPEN get_item_segments(l_atp_rec.Inventory_Item_Id(I),l_atp_rec.Organization_id(I));
2070                             FETCH get_item_segments INTO l_item_segments;
2071                             CLOSE get_item_segments;
2072                             l_error := true;
2073                             l_message := l_item_segments || ' : '||  l_message;
2074                             FND_MESSAGE.SET_NAME('CSP', 'CSP_ATP');
2075                             FND_MESSAGE.SET_TOKEN('ERROR', l_message, FALSE);
2076                             FND_MSG_PUB.ADD;
2077                             fnd_msg_pub.count_and_get
2078                                 ( p_count => x_msg_count
2079                                 , p_data  => x_msg_data);
2080                         END IF;
2081                       ELSE
2082                         If l_atp_rec_out.ship_date(I) IS NULL or l_atp_rec_out.Error_Code(I) <>53 THEN
2083                             IF not l_error then
2084                              OPEN error_message(23);
2085                              FETCH error_message INTO l_message;
2086                              CLOSE error_message;
2087 
2088                              FND_MESSAGE.SET_NAME('CSP', 'CSP_ATP');
2089                              FND_MESSAGE.SET_TOKEN('ERROR', l_message, FALSE);
2090                              FND_MSG_PUB.ADD;
2091                              fnd_msg_pub.count_and_get
2092                                 ( p_count => x_msg_count
2093                                 , p_data  => x_msg_data);
2094 
2095                             END IF;
2096                             x_return_status := FND_API.G_RET_STS_ERROR;
2097                             OPEN error_message(l_atp_rec_out.Error_Code(I));
2098                             FETCH error_message INTO l_message;
2099                             CLOSE error_message;
2100                              l_item_segments := null;
2101                             OPEN get_item_segments(l_atp_rec.Inventory_Item_Id(I),l_atp_rec.Organization_id(I));
2102                             FETCH get_item_segments INTO l_item_segments;
2103                             CLOSE get_item_segments;
2104                             l_error := true;
2105                             l_message := l_item_segments || ' : '||  l_message;
2106                             FND_MESSAGE.SET_NAME('CSP', 'CSP_ATP');
2107                             FND_MESSAGE.SET_TOKEN('ERROR', l_message, FALSE);
2108                             FND_MSG_PUB.ADD;
2109                             fnd_msg_pub.count_and_get
2110                                 ( p_count => x_msg_count
2111                                 , p_data  => x_msg_data);
2112                           ELSE
2113                             l_unavailable := 'N';
2114                           END IF;
2115                       END IF;
2116                        IF l_unavailable = 'Y' THEN
2117                         x_final_unavailable_list.extend;
2118                         x_final_unavailable_list(x_final_unavailable_list.count).resource_id
2119                                                                         := p_unavailable_list(I).resource_id;
2120                         x_final_unavailable_list(x_final_unavailable_list.count).resource_type
2121                                                                         := p_unavailable_list(I).resource_type ;
2122                         x_final_unavailable_list(x_final_unavailable_list.count).organization_id := l_atp_rec.Organization_id(I);
2123                         x_final_unavailable_list(x_final_unavailable_list.count).item_id    := l_atp_rec.Inventory_Item_Id(I);
2124                         x_final_unavailable_list(x_final_unavailable_list.count).quantity   := l_atp_rec.quantity_ordered(I);
2125                         x_final_unavailable_list(x_final_unavailable_list.count).item_UOM   := l_atp_rec.quantity_uom(I) ;
2126                         x_final_unavailable_list(x_final_unavailable_list.count).revision   := p_unavailable_list(I).revision ;
2127                         FOR J IN 1..p_unavailable_list.count LOOP
2128                             IF x_final_unavailable_list(x_final_unavailable_list.count).item_id =
2129                                 p_unavailable_list(J).item_id THEN
2130                                 x_final_unavailable_list(x_final_unavailable_list.count).item_type := p_unavailable_list(J).item_type;
2131                                 x_final_unavailable_list(x_final_unavailable_list.count).line_id  := p_unavailable_list(J).line_id;
2132                                     EXIT;
2133                             END IF;
2134                         END LOOP;
2135                        ELSE
2136                              px_available_list.extend;
2137                         px_available_list(px_available_list.count).resource_id        :=  p_unavailable_list(I).resource_id ;
2138                         px_available_list(px_available_list.count).resource_type      :=  p_unavailable_list(I).resource_type;
2139                         px_available_list(px_available_list.count).organization_id    :=  l_atp_rec_out.Organization_id(I);
2140                         px_available_list(px_available_list.count).item_id            :=  l_atp_rec_out.Inventory_Item_Id(I);
2141                         px_available_list(px_available_list.count).item_uom            := l_atp_rec_out.quantity_uom(I) ;
2142                         px_available_list(px_available_list.count).quantity           :=  l_atp_rec_out.quantity_ordered(I);
2143                         px_available_list(px_available_list.count).source_org         :=  l_atp_rec_out.Source_Organization_Id(I);
2144                         px_available_list(px_available_list.count).sub_inventory      :=  NULL;
2145                         if trunc(l_atp_rec_out.ship_date(I)) = trunc(sysdate) THEN
2146                             px_available_list(px_available_list.count).available_date := trunc(l_atp_rec_out.ship_date(I)) + (sysdate - trunc(sysdate));
2147                         ELSE
2148                             px_available_list(px_available_list.count).available_date := l_atp_rec_out.ship_date(I);
2149                         END IF;
2150                       --  px_available_list(px_available_list.count).available_date     :=  l_atp_rec_out.ship_date(I);
2151                         px_available_list(px_available_list.count).available_quantity :=  l_atp_rec_out.Available_Quantity(I);
2152                         px_available_list(px_available_list.count).revision         := p_unavailable_list(I).revision ;
2153                          FOR J IN 1..p_unavailable_list.count LOOP
2154                             IF px_available_list(px_available_list.count).item_id =
2155                                 p_unavailable_list(J).item_id THEN
2156                                 px_available_list(px_available_list.count).item_type := p_unavailable_list(J).item_type;
2157                                 px_available_list(px_available_list.count).line_id  := p_unavailable_list(J).line_id;
2158                                     EXIT;
2159                             END IF;
2160                         END LOOP;
2161                        END IF;
2162                     ELSE
2163                         px_available_list.extend;
2164                         px_available_list(px_available_list.count).resource_id        :=  p_unavailable_list(I).resource_id ;
2165                         px_available_list(px_available_list.count).resource_type      :=  p_unavailable_list(I).resource_type;
2166                         px_available_list(px_available_list.count).organization_id    :=  l_atp_rec_out.Organization_id(I);
2167                         px_available_list(px_available_list.count).item_id            :=  l_atp_rec_out.Inventory_Item_Id(I);
2168                         px_available_list(px_available_list.count).item_uom            := l_atp_rec_out.quantity_uom(I) ;
2169                         px_available_list(px_available_list.count).quantity           :=  l_atp_rec_out.quantity_ordered(I);
2170                         px_available_list(px_available_list.count).source_org         :=  l_atp_rec_out.Source_Organization_Id(I);
2171                         px_available_list(px_available_list.count).sub_inventory      :=  NULL;
2172                         if trunc(l_atp_rec_out.ship_date(I)) = trunc(sysdate) THEN
2173                             px_available_list(px_available_list.count).available_date := trunc(l_atp_rec_out.ship_date(I)) + (sysdate - trunc(sysdate));
2174                         ELSE
2175                             px_available_list(px_available_list.count).available_date := l_atp_rec_out.ship_date(I);
2176                         END IF;
2177                       --  px_available_list(px_available_list.count).available_date     :=  l_atp_rec_out.ship_date(I);
2178                         px_available_list(px_available_list.count).available_quantity :=  l_atp_rec_out.Available_Quantity(I);
2179                         px_available_list(px_available_list.count).revision         := p_unavailable_list(I).revision ;
2180                          FOR J IN 1..p_unavailable_list.count LOOP
2181                             IF px_available_list(px_available_list.count).item_id =
2182                                 p_unavailable_list(J).item_id THEN
2183                                 px_available_list(px_available_list.count).item_type := p_unavailable_list(J).item_type;
2184                                 px_available_list(px_available_list.count).line_id  := p_unavailable_list(J).line_id;
2185                                     EXIT;
2186                             END IF;
2187                         END LOOP;
2188                      END IF;
2189                 END LOOP;
2190             ELSE
2191                 return;
2192             END IF;
2193             EXCEPTION
2194             WHEN OTHERS THEN
2195             FND_MESSAGE.SET_NAME('CSP', 'CSP_UNEXPECTED_EXEC_ERRORS');
2196             FND_MESSAGE.SET_TOKEN('ROUTINE', l_api_name, FALSE);
2197             FND_MESSAGE.SET_TOKEN('SQLERRM', sqlerrm, FALSE);
2198             FND_MSG_PUB.ADD;
2199             fnd_msg_pub.count_and_get
2200               ( p_count => x_msg_count
2201               , p_data  => x_msg_data);
2202             x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
2203             return;
2204 
2205      END DO_ATP_CHECK;
2206 
2207 
2208 
2209      PROCEDURE ELIGIBLE_RESOURCES(p_resource_list            IN  CSP_SCH_INT_PVT.CSP_SCH_RESOURCE_tbl_TYP
2210                                  ,p_available_list           IN  CSP_SCH_INT_PVT.CSP_AVAILABILITY_TBL_TYPE
2211                                  ,p_final_unavailable_list   IN  CSP_SCH_INT_PVT.CSP_UNAVAILABILITY_TBL_TYPE
2212                                  ,x_eligible_resources_list  OUT NOCOPY CSP_SCH_INT_PVT.CSP_AVAILABILITY_TBL_TYPE
2213                                  ,x_return_status            OUT NOCOPY VARCHAR2
2214                                  ,x_msg_data                 OUT NOCOPY VARCHAR2
2215                                  ,x_msg_count                OUT NOCOPY NUMBER) IS
2216 
2217         resource_eligible BOOLEAN := TRUE;
2218         l_api_name     VARCHAR2(60) := 'CSP_SCH_INT_PVT.ELIGIBLE_RESOURCES';
2219      BEGIN
2220         x_return_status := FND_API.G_RET_STS_SUCCESS;
2221         x_eligible_resources_list :=  CSP_SCH_INT_PVT.CSP_AVAILABILITY_TBL_TYPE();
2222           FOR I IN 1..p_resource_list.count LOOP
2223                 FOR J IN 1..p_final_unavailable_list.count LOOP
2224                     IF p_final_unavailable_list(J).resource_id = p_resource_list(I).resource_id THEN
2225                         resource_eligible := FALSE;
2226                         EXIT;
2227                     ELSE
2228                         resource_eligible := TRUE ;
2229                     END IF;
2230                 END LOOP;
2231                 IF resource_eligible = TRUE THEN
2232                    FOR K IN  1..p_available_list.count LOOP
2233                         IF  p_available_list(K).resource_id = p_resource_list(I).resource_id THEN
2234                             x_eligible_resources_list.extend ;
2235                             x_eligible_resources_list(x_eligible_resources_list.count).resource_id    := p_available_list(K).resource_id ;
2236                             x_eligible_resources_list(x_eligible_resources_list.count).resource_type  := p_available_list(K).resource_type ;
2237                             x_eligible_resources_list(x_eligible_resources_list.count).organization_id:= p_available_list(K).organization_id ;
2238                             x_eligible_resources_list(x_eligible_resources_list.count).item_id        := p_available_list(K).Item_Id ;
2239                             x_eligible_resources_list(x_eligible_resources_list.count).quantity       := p_available_list(K).quantity ;
2240                             x_eligible_resources_list(x_eligible_resources_list.count).source_org     := p_available_list(K).source_org ;
2241                             x_eligible_resources_list(x_eligible_resources_list.count).item_uom       := p_available_list(K).Item_uom ;
2242                             x_eligible_resources_list(x_eligible_resources_list.count).revision       := p_available_list(K).revision ;
2243                             x_eligible_resources_list(x_eligible_resources_list.count).sub_inventory       := p_available_list(K).sub_inventory ;
2244                             x_eligible_resources_list(x_eligible_resources_list.count).available_date := p_available_list(K).available_date;
2245                              x_eligible_resources_list(x_eligible_resources_list.count).line_id :=p_available_list(K).line_id;
2246                         END IF;
2247                    END LOOP;
2248                 END IF;
2249         END LOOP;
2250         EXCEPTION
2251         WHEN OTHERS THEN
2252             FND_MESSAGE.SET_NAME('CSP', 'CSP_UNEXPECTED_EXEC_ERRORS');
2253             FND_MESSAGE.SET_TOKEN('ROUTINE', l_api_name, FALSE);
2254             FND_MESSAGE.SET_TOKEN('SQLERRM', sqlerrm, FALSE);
2255             FND_MSG_PUB.ADD;
2256             fnd_msg_pub.count_and_get
2257               ( p_count => x_msg_count
2258               , p_data  => x_msg_data);
2259             x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
2260             return;
2261     END ELIGIBLE_RESOURCES;
2262 
2263     PROCEDURE GET_TIME_COST(p_eligible_resources_list  IN  CSP_SCH_INT_PVT.CSP_AVAILABILITY_TBL_TYPE
2264                           ,x_options                  OUT NOCOPY  CSP_SCH_INT_PVT.csp_sch_options_tbl_typ
2265                           ,x_return_status            OUT NOCOPY  VARCHAR2
2266                           ,x_msg_data                 OUT NOCOPY  VARCHAR2
2267                           ,x_msg_count                OUT NOCOPY  NUMBER) IS
2268         l_temp_options        CSP_SCH_INT_PVT.CSP_SHIP_PARAMETERS_TBL_TYPE;
2269         l_temp_resources_list CSP_SCH_INT_PVT.CSP_AVAILABILITY_TBL_TYPE;
2270         l_options             CSP_SCH_INT_PVT.CSP_SHIP_PARAMETERS_TBL_TYPE ;
2271         loop_count            NUMBER;
2272         l_resources           CSP_SCH_INT_PVT.CSP_AVAILABILITY_TBL_TYPE;
2273         l_ship_count          CSP_SCH_INT_PVT.CSP_SHIP_METHOD_COUNT_TBL_TYP;
2274         l_res_ship_parameters CSP_SCH_INT_PVT.CSP_ORGS_SHIP_PARAM_TBL_TYPE ;
2275         l_api_name            VARCHAR2(60) := 'CSP_SCH_INT_PVT.GET_TIME_COST' ;
2276      BEGIN
2277             x_return_status := FND_API.G_RET_STS_SUCCESS;
2278             l_temp_options        :=  CSP_SCH_INT_PVT.CSP_SHIP_PARAMETERS_TBL_TYPE();
2279             l_temp_resources_list :=  CSP_SCH_INT_PVT.CSP_AVAILABILITY_TBL_TYPE();
2280             l_options             :=  CSP_SCH_INT_PVT.CSP_SHIP_PARAMETERS_TBL_TYPE();
2281             l_resources           :=  CSP_SCH_INT_PVT.CSP_AVAILABILITY_TBL_TYPE();
2282             x_options             :=  CSP_SCH_INT_PVT.csp_sch_options_tbl_typ();
2283             l_ship_count          :=  CSP_SCH_INT_PVT.CSP_SHIP_METHOD_COUNT_TBL_TYP();
2284             l_res_ship_parameters :=  CSP_SCH_INT_PVT.CSP_ORGS_SHIP_PARAM_TBL_TYPE();
2285             loop_count :=1 ;
2286             WHILE loop_count <= p_eligible_resources_list.count LOOP
2287                 IF loop_count > 1 THEN
2288                     IF p_eligible_resources_list(loop_count).resource_id =
2289                                 p_eligible_resources_list(loop_count-1).resource_id
2290                             AND p_eligible_resources_list(loop_count).resource_type =
2291                                 p_eligible_resources_list(loop_count-1).resource_type THEN
2292                             l_temp_resources_list.extend;
2293                             l_temp_resources_list(l_temp_resources_list.count).resource_type :=
2294                                                                   p_eligible_resources_list(loop_count).resource_type ;
2295                             l_temp_resources_list(l_temp_resources_list.count).resource_id :=
2296                                                                   p_eligible_resources_list(loop_count).resource_id ;
2297                             l_temp_resources_list(l_temp_resources_list.count).source_org := p_eligible_resources_list(loop_count).source_org;
2298                             l_temp_resources_list(l_temp_resources_list.count).organization_id :=  p_eligible_resources_list(loop_count).organization_id ;
2299                             l_temp_resources_list(l_temp_resources_list.count).quantity := p_eligible_resources_list(loop_count).quantity;
2300                             l_temp_resources_list(l_temp_resources_list.count).sub_inventory := p_eligible_resources_list(loop_count).sub_inventory;
2301                             l_temp_resources_list(l_temp_resources_list.count).available_date := p_eligible_resources_list(loop_count).available_date;
2302                             IF loop_count = p_eligible_resources_list.count THEN
2303                                 CSP_SCH_INT_PVT.OPTIMIZE_OPTIONS(l_temp_resources_list,l_temp_options,l_ship_count,l_res_ship_parameters,x_return_status,x_msg_data,x_msg_count);
2304                                 IF x_return_status <> FND_API.G_RET_STS_SUCCESS THEN
2305                                     RETURN;
2306                                 END IF;
2307                                 CSP_SCH_INT_PVT.BUILD_FINAL_LIST(l_temp_options,x_options,x_return_status,x_msg_data,x_msg_count);
2308                                 IF x_return_status <> FND_API.G_RET_STS_SUCCESS THEN
2309                                     RETURN;
2310                                 END IF;
2311                                 l_temp_options.trim(l_temp_options.count);
2312                                 l_temp_resources_list.trim(l_temp_resources_list.count);
2313                             END IF;
2314                     ELSE
2315                      CSP_SCH_INT_PVT.OPTIMIZE_OPTIONS(l_temp_resources_list,l_temp_options,l_ship_count,l_res_ship_parameters,x_return_status,x_msg_data,x_msg_count);
2316                      IF x_return_status <> FND_API.G_RET_STS_SUCCESS THEN
2317                                     RETURN;
2318                      END IF;
2319                      CSP_SCH_INT_PVT.BUILD_FINAL_LIST(l_temp_options,x_options,x_return_status,x_msg_data,x_msg_count);
2320                      IF x_return_status <> FND_API.G_RET_STS_SUCCESS THEN
2321                                     RETURN;
2322                      END IF;
2323                      l_temp_options.trim(l_temp_options.count);
2324                      l_temp_resources_list.trim(l_temp_resources_list.count);
2325                         l_temp_resources_list.extend;
2326                         l_temp_resources_list(l_temp_resources_list.count).resource_type   := p_eligible_resources_list(loop_count).resource_type ;
2327                          l_temp_resources_list(l_temp_resources_list.count).resource_id     := p_eligible_resources_list(loop_count).resource_id ;
2328                         l_temp_resources_list(l_temp_resources_list.count).source_org      := p_eligible_resources_list(loop_count).source_org;
2329                         l_temp_resources_list(l_temp_resources_list.count).organization_id := p_eligible_resources_list(loop_count).organization_id;
2330                         l_temp_resources_list(l_temp_resources_list.count).quantity        := p_eligible_resources_list(loop_count).quantity;
2331                         l_temp_resources_list(l_temp_resources_list.count).sub_inventory   := p_eligible_resources_list(loop_count).sub_inventory ;
2332                         l_temp_resources_list(l_temp_resources_list.count).available_date := p_eligible_resources_list(loop_count).available_date;
2333                     END IF;
2334                     IF loop_count = p_eligible_resources_list.count THEN
2335                                 CSP_SCH_INT_PVT.OPTIMIZE_OPTIONS(l_temp_resources_list,l_temp_options,l_ship_count,l_res_ship_parameters,x_return_status,x_msg_data,x_msg_count);
2336                                 IF x_return_status <> FND_API.G_RET_STS_SUCCESS THEN
2337                                     RETURN;
2338                                 END IF;
2339                                 CSP_SCH_INT_PVT.BUILD_FINAL_LIST(l_temp_options,x_options,x_return_status,x_msg_data,x_msg_count);
2340                                 IF x_return_status <> FND_API.G_RET_STS_SUCCESS THEN
2341                                     RETURN;
2342                                 END IF;
2343                                 l_temp_options.trim(l_temp_options.count);
2344                                 l_temp_resources_list.trim(l_temp_resources_list.count);
2345                      END IF;
2346                 ELSE
2347                     l_temp_resources_list.extend;
2348                     l_temp_resources_list(l_temp_resources_list.count).resource_type   := p_eligible_resources_list(loop_count).resource_type ;
2349                     l_temp_resources_list(l_temp_resources_list.count).resource_id     := p_eligible_resources_list(loop_count).resource_id ;
2350                     l_temp_resources_list(l_temp_resources_list.count).source_org      := p_eligible_resources_list(loop_count).source_org;
2351                     l_temp_resources_list(l_temp_resources_list.count).organization_id := p_eligible_resources_list(loop_count).organization_id;
2352                     l_temp_resources_list(l_temp_resources_list.count).quantity        := p_eligible_resources_list(loop_count).quantity;
2353                     l_temp_resources_list(l_temp_resources_list.count).sub_inventory   := p_eligible_resources_list(loop_count).sub_inventory ;
2354                     l_temp_resources_list(l_temp_resources_list.count).available_date := p_eligible_resources_list(loop_count).available_date;
2355                     IF p_eligible_resources_list.count =1 THEN
2356                         CSP_SCH_INT_PVT.OPTIMIZE_OPTIONS(l_temp_resources_list,l_temp_options,l_ship_count,l_res_ship_parameters,x_return_status,x_msg_data,x_msg_count);
2357                         IF x_return_status <> FND_API.G_RET_STS_SUCCESS THEN
2358                                     RETURN;
2359                         END IF;
2360                         CSP_SCH_INT_PVT.BUILD_FINAL_LIST(l_temp_options,x_options,x_return_status,x_msg_data,x_msg_count);
2361                         IF x_return_status <> FND_API.G_RET_STS_SUCCESS THEN
2362                                     RETURN;
2363                         END IF;
2364                         l_temp_options.trim(l_temp_options.count);
2365                         l_temp_resources_list.trim(l_temp_resources_list.count);
2366                     END IF;
2367                  END IF;
2368                     loop_count := loop_count + 1 ;
2369             END LOOP;
2370             EXCEPTION
2371             WHEN OTHERS THEN
2372             FND_MESSAGE.SET_NAME('CSP', 'CSP_UNEXPECTED_EXEC_ERRORS');
2373             FND_MESSAGE.SET_TOKEN('ROUTINE', l_api_name, FALSE);
2374             FND_MESSAGE.SET_TOKEN('SQLERRM', sqlerrm, FALSE);
2375             FND_MSG_PUB.ADD;
2376             fnd_msg_pub.count_and_get
2377               ( p_count => x_msg_count
2378               , p_data  => x_msg_data);
2379             x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
2380             return;
2381      END GET_TIME_COST;
2382      PROCEDURE BUILD_FINAL_LIST(p_temp_options  IN     CSP_SCH_INT_PVT.CSP_SHIP_PARAMETERS_TBL_TYPE
2383                                ,px_options      IN OUT NOCOPY CSP_SCH_INT_PVT.csp_sch_options_tbl_typ
2384                                ,x_return_status  OUT NOCOPY   VARCHAR2
2385                                ,x_msg_data       OUT NOCOPY   VARCHAR2
2386                                ,x_msg_count      OUT NOCOPY   NUMBER) IS
2387         l_api_name varchar2(60) := 'CSP_SCH_INT_PVT.BUILD_FINAL_LIST';
2388         l_need_by_date date;
2389      BEGIN
2390             IF g_interval.latest_time IS NOT NULL
2391             THEN
2392                l_need_by_date := g_interval.latest_time;
2393             ELSE
2394                l_need_by_date := g_interval.earliest_time;
2395             END IF;
2396         x_return_status := FND_API.G_RET_STS_SUCCESS;
2397         FOR I IN 1..p_temp_options.count LOOP
2398           -- IF round(p_temp_options(I).arrival_date,'MI') <= round(l_need_by_date,'MI') THEN
2399             px_options.extend;
2400             px_options(px_options.count).resource_type :=  p_temp_options(I).resource_type;
2401             px_options(px_options.count).resource_id   :=  p_temp_options(I).resource_id;
2402             px_options(px_options.count).start_time    :=  round(p_temp_options(I).arrival_date,'MI') ;
2403             px_options(px_options.count).transfer_cost :=  p_temp_options(I).transfer_cost;
2404            /* ELSE
2405                 select least(round(p_temp_options(I).arrival_date,'MI'),round(g_earliest_delivery_date,'MI'))
2406                 INTO g_earliest_delivery_date
2407                 from dual;
2408             END IF;*/
2409         END LOOP;
2410         EXCEPTION
2411         WHEN OTHERS THEN
2412             FND_MESSAGE.SET_NAME('CSP', 'CSP_UNEXPECTED_EXEC_ERRORS');
2413             FND_MESSAGE.SET_TOKEN('ROUTINE', l_api_name, FALSE);
2414             FND_MESSAGE.SET_TOKEN('SQLERRM', sqlerrm, FALSE);
2415             FND_MSG_PUB.ADD;
2416             fnd_msg_pub.count_and_get
2417               ( p_count => x_msg_count
2418               , p_data  => x_msg_data);
2419             x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
2420             return;
2421      END BUILD_FINAL_LIST;
2422 
2423       PROCEDURE OPTIMIZE_OPTIONS(p_eligible_resources IN      CSP_SCH_INT_PVT.CSP_AVAILABILITY_TBL_TYPE
2424                                ,px_options           IN OUT NOCOPY  CSP_SCH_INT_PVT.CSP_SHIP_PARAMETERS_TBL_TYPE
2425                                ,x_ship_count         OUT NOCOPY     CSP_SCH_INT_PVT.CSP_SHIP_METHOD_COUNT_TBL_TYP
2426                                ,x_ship_parameters    OUT NOCOPY     CSP_SCH_INT_PVT.CSP_ORGS_SHIP_PARAM_TBL_TYPE
2427                                ,x_return_status      OUT NOCOPY     VARCHAR2
2428                                ,x_msg_data           OUT NOCOPY     VARCHAR2
2429                                ,x_msg_count          OUT NOCOPY     NUMBER) IS
2430 
2431          cursor location_shipping_method_count(c_from_org_id number, c_to_location_id number) IS
2432         SELECT count(*)
2433         FROM   MTL_INTERORG_SHIP_METHODS ISM,HR_ALL_ORGANIZATION_UNITS hao
2434         where  hao.organization_id = c_from_org_id
2435         and  ism.from_location_id = hao.location_id
2436         and  ism.to_location_id = c_to_location_id;
2437 
2438 
2439         l_resource_shipping_parameters  CSP_SCH_INT_PVT.CSP_ORGS_SHIP_PARAM_TBL_TYPE ;
2440         l_temp_rec                      CSP_SCH_INT_PVT.CSP_ORGS_SHIP_PARAM_TBL_TYPE ;
2441         l_ship_quantity                 CSP_SCH_INT_PVT.CSP_SHIP_QUANTITY_TBL_TYPE ;
2442         l_final_resource                CSP_SCH_INT_PVT.CSP_SHIP_PARAMETERS_TBL_TYPE ;
2443         l_temp_final_resource           CSP_SCH_INT_PVT.CSP_SHIP_PARAMETERS_TBL_TYPE ;
2444         L_API_NAME  VARCHAR2(60) := 'CSP_SCH_INT_PVT.OPTIMIZE_OPTIONS';
2445         loop_start NUMBER :=0 ;
2446         loop_end   NUMBER :=0 ;
2447         loop_min   NUMBER :=100000 ;
2448         loop_max   NUMBER :=0 ;
2449         min_leadtime NUMBER;
2450         max_leadtime NUMBER;
2451         k   NUMBER;
2452         low_cost_present BOOLEAN;
2453         ship_methodes_count NUMBER;
2454         first_count NUMBER;
2455         itration NUMBER;
2456         I NUMBER;
2457         resource_count NUMBER;
2458         record_present BOOLEAN;
2459         min_cost NUMBER;
2460         do_optimize BOOLEAN := FALSE;
2461         greatest_available_date DATE:= to_date('1','j');
2462         l_present boolean;
2463         l_min_cost_for_loop number;
2464         do_insert BOOLEAN;
2465         l_shipping_methods varchar2(2000);
2466         l_to_org_id NUMBER;
2467         l_loc_ship_method_count NUMBER := 0;
2468       BEGIN
2469              x_return_status := FND_API.G_RET_STS_SUCCESS ;
2470             l_resource_shipping_parameters :=  CSP_SCH_INT_PVT.CSP_ORGS_SHIP_PARAM_TBL_TYPE() ;
2471             l_temp_rec                     :=  CSP_SCH_INT_PVT.CSP_ORGS_SHIP_PARAM_TBL_TYPE() ;
2472             x_ship_count                   :=  CSP_SCH_INT_PVT.CSP_SHIP_METHOD_COUNT_TBL_TYP() ;
2473             l_ship_quantity                :=  CSP_SCH_INT_PVT.CSP_SHIP_QUANTITY_TBL_TYPE() ;
2474             l_final_resource               :=  CSP_SCH_INT_PVT.CSP_SHIP_PARAMETERS_TBL_TYPE() ;
2475             l_temp_final_resource          :=  CSP_SCH_INT_PVT.CSP_SHIP_PARAMETERS_TBL_TYPE() ;
2476             x_ship_parameters              :=  CSP_SCH_INT_PVT.CSP_ORGS_SHIP_PARAM_TBL_TYPE();
2477             FOR I IN 1..p_eligible_resources.count LOOP
2478                l_to_org_id := p_eligible_resources(I).organization_id;
2479                OPEN location_shipping_method_count(p_eligible_resources(I).source_org, p_eligible_resources(I).destination_location_id);
2480                FETCH location_shipping_method_count INTO l_loc_ship_method_count;
2481                CLOSE location_shipping_method_count;
2482                 IF p_eligible_resources(I).sub_inventory IS NULL AND
2483                                        (p_eligible_resources(I).organization_id <> p_eligible_resources(I).source_org or nvl(l_loc_ship_method_count,0) <> 0 ) THEN
2484                     do_optimize := TRUE ;
2485                     exit;
2486                 ELSE
2487                     do_optimize := FALSE;
2488                 END IF;
2489             END LOOP;
2490 
2491           IF do_optimize  THEN
2492             CSP_SCH_INT_PVT.CONSOLIDATE_QUANTITIES(p_eligible_resources, l_ship_quantity,x_return_status,x_msg_data,x_msg_count);
2493             IF x_return_status <>  FND_API.G_RET_STS_SUCCESS THEN
2494                 return;
2495             END IF;
2496             CSP_SCH_INT_PVT.GET_SHIPPING_PARAMETERS(l_ship_quantity,l_resource_shipping_parameters,x_ship_count,x_return_status,x_msg_data,x_msg_count);
2497             IF x_return_status <> FND_API.G_RET_STS_SUCCESS THEN
2498                 return;
2499             END IF;
2500             x_ship_parameters := l_resource_shipping_parameters;
2501                 loop_start := 1 ;
2502                 min_leadtime := 0;
2503                 max_leadtime := 0;
2504            FOR I IN 1..p_eligible_resources.count LOOP
2505                 IF p_eligible_resources(I).sub_inventory IS NULL THEN
2506                     SELECT GREATEST(greatest_available_date, p_eligible_resources(I).available_date)
2507                     INTO   greatest_available_date
2508                     FROM DUAL;
2509                 END IF;
2510            END LOOP;
2511            FOR I IN 1..x_ship_count.count LOOP
2512                 loop_min := x_ship_count(I).min_leadtime;
2513                 loop_max := x_ship_count(I).max_leadtime;
2514                 SELECT GREATEST(min_leadtime,loop_min) INTO min_leadtime FROM DUAL;
2515                 SELECT GREATEST(max_leadtime,loop_max) INTO max_leadtime FROM DUAL;
2516            END LOOP;
2517              resource_count := 1 ;
2518               WHILE resource_count <= l_resource_shipping_parameters.count LOOP
2519                 first_count := 0;
2520                 FOR J IN 1..x_ship_count.count LOOP
2521                     IF x_ship_count(J).from_org_id  = l_resource_shipping_parameters(resource_count).from_org_id AND
2522                        x_ship_count(J).to_org_id    = l_resource_shipping_parameters(resource_count).to_org_id  THEN
2523                        first_count := x_ship_count(J).shipping_methodes;
2524                        exit;
2525                     END IF;
2526                 END LOOP;
2527                IF first_count  > 1 THEN
2528                 FOR I IN resource_count..(resource_count + first_count-1) LOOP
2529                     IF  l_resource_shipping_parameters(I).lead_time >= min_leadtime THEN
2530                            k := I-1 ;
2531                            low_cost_present := FALSE;
2532                             FOR K IN resource_count..(resource_count + first_count-1) LOOP
2533                                 IF l_resource_shipping_parameters(K).lead_time < l_resource_shipping_parameters(I).lead_time
2534                                 AND  l_resource_shipping_parameters(K).transfer_cost <=
2535                                             l_resource_shipping_parameters(I).transfer_cost THEN
2536                                     low_cost_present := TRUE;
2537                                     l_temp_rec.extend;
2538                                     l_temp_rec(l_temp_rec.count).resource_type
2539                                                                 := l_resource_shipping_parameters(k).resource_type ;
2540                                     l_temp_rec(l_temp_rec.count).resource_id
2541                                                                 := l_resource_shipping_parameters(k).resource_id ;
2542                                     l_temp_rec(l_temp_rec.count) .from_org_id
2543                                                                 := l_resource_shipping_parameters(k).from_org_id ;
2544                                     l_temp_rec(l_temp_rec.count) .to_org_id
2545                                                                 := l_resource_shipping_parameters(k).to_org_id ;
2546                                     l_temp_rec(l_temp_rec.count) .quantity
2547                                                                 := l_resource_shipping_parameters(k).quantity ;
2548                                     l_temp_rec(l_temp_rec.count) .shipping_method
2549                                                                 := l_resource_shipping_parameters(k).shipping_method;
2550                                     l_temp_rec(l_temp_rec.count) .lead_time
2551                                                                 := l_resource_shipping_parameters(k).lead_time ;
2552                                     l_temp_rec(l_temp_rec.count) .transfer_cost
2553                                                                 := l_resource_shipping_parameters(k).transfer_cost ;
2554                                 END IF ;
2555                             END LOOP;
2556                             IF low_cost_present = FALSE THEN
2557                                     l_temp_rec .extend;
2558                                     l_temp_rec(l_temp_rec.count).resource_type
2559                                                                 := l_resource_shipping_parameters(I).resource_type ;
2560                                     l_temp_rec(l_temp_rec.count) .resource_id
2561                                                                 := l_resource_shipping_parameters(I).resource_id ;
2562                                     l_temp_rec(l_temp_rec.count) .from_org_id
2563                                                                 := l_resource_shipping_parameters(I).from_org_id;
2564                                     l_temp_rec(l_temp_rec.count) .to_org_id
2565                                                                 := l_resource_shipping_parameters(I).to_org_id;
2566                                     l_temp_rec(l_temp_rec.count) .quantity
2567                                                                 := l_resource_shipping_parameters(I).quantity ;
2568                                     l_temp_rec(l_temp_rec.count) .shipping_method
2569                                                                 := l_resource_shipping_parameters(I).shipping_method;
2570                                     l_temp_rec(l_temp_rec.count) .lead_time
2571                                                                 := l_resource_shipping_parameters(I).lead_time ;
2572                                     l_temp_rec(l_temp_rec.count) .transfer_cost
2573                                                                 := l_resource_shipping_parameters(I).transfer_cost ;
2574                             END IF;
2575                     END IF;
2576                 END LOOP;
2577                ELSE
2578                     l_temp_rec .extend;
2579                     l_temp_rec(l_temp_rec.count).resource_type
2580                                           := l_resource_shipping_parameters(resource_count).resource_type ;
2581                     l_temp_rec(l_temp_rec.count) .resource_id
2582                                           := l_resource_shipping_parameters(resource_count).resource_id ;
2583                     l_temp_rec(l_temp_rec.count) .from_org_id
2584                                           := l_resource_shipping_parameters(resource_count).from_org_id;
2585                     l_temp_rec(l_temp_rec.count) .to_org_id
2586                                           := l_resource_shipping_parameters(resource_count).to_org_id;
2587                     l_temp_rec(l_temp_rec.count) .quantity
2588                                           := l_resource_shipping_parameters(resource_count).quantity ;
2589                     l_temp_rec(l_temp_rec.count) .shipping_method
2590                                           := l_resource_shipping_parameters(resource_count).shipping_method;
2591                    l_temp_rec(l_temp_rec.count) .lead_time
2592                                           := l_resource_shipping_parameters(resource_count).lead_time ;
2593                    l_temp_rec(l_temp_rec.count) .transfer_cost
2594                                           := l_resource_shipping_parameters(resource_count).transfer_cost ;
2595                  END IF;
2596                         l_present := FALSE ;
2597                         FOR N IN 1..l_temp_rec.count LOOP
2598                             IF l_temp_rec(N).resource_type = l_resource_shipping_parameters(resource_count).resource_type and
2599                                l_temp_rec(N) .resource_id  = l_resource_shipping_parameters(resource_count).resource_id   and
2600                                l_temp_rec(N) .from_org_id  = l_resource_shipping_parameters(resource_count).from_org_id   and
2601                                l_temp_rec(N) .to_org_id    = l_resource_shipping_parameters(resource_count).to_org_id  THEN
2602                                l_present := TRUE;
2603                                exit;
2604                             END IF;
2605                         END LOOP;
2606                         l_min_cost_for_loop := 1000000000;
2607                         IF not l_present THEN
2608                             FOR N IN resource_count..(resource_count+first_count-1) LOOP
2609                                 select LEAST(l_min_cost_for_loop,l_resource_shipping_parameters(N).transfer_cost)
2610                                 INTO l_min_cost_for_loop
2611                                 FROM DUAL;
2612                             END LOOP;
2613                             FOR N IN resource_count..(resource_count+first_count-1) LOOP
2614                                 IF l_min_cost_for_loop = l_resource_shipping_parameters(N).transfer_cost THEN
2615                                 l_temp_rec .extend;
2616                                 l_temp_rec(l_temp_rec.count).resource_type
2617                                           := l_resource_shipping_parameters(resource_count).resource_type ;
2618                                 l_temp_rec(l_temp_rec.count) .resource_id
2619                                           := l_resource_shipping_parameters(resource_count).resource_id ;
2620                                 l_temp_rec(l_temp_rec.count) .from_org_id
2621                                           := l_resource_shipping_parameters(resource_count).from_org_id;
2622                                 l_temp_rec(l_temp_rec.count) .to_org_id
2623                                           := l_resource_shipping_parameters(resource_count).to_org_id;
2624                                 l_temp_rec(l_temp_rec.count) .quantity
2625                                           := l_resource_shipping_parameters(resource_count).quantity ;
2626                                 l_temp_rec(l_temp_rec.count) .shipping_method
2627                                           := l_resource_shipping_parameters(resource_count).shipping_method;
2628                                 l_temp_rec(l_temp_rec.count) .lead_time
2629                                           := l_resource_shipping_parameters(resource_count).lead_time ;
2630                                 l_temp_rec(l_temp_rec.count) .transfer_cost
2631                                           := l_resource_shipping_parameters(resource_count).transfer_cost ;
2632                                 END IF;
2633                             END LOOP;
2634                           END IF;
2635                     resource_count := resource_count + first_count ;
2636               END LOOP;
2637             FOR I IN 1..x_ship_count.count LOOP
2638                     ship_methodes_count := 0;
2639                     FOR J IN 1..l_temp_rec.count LOOP
2640                         IF l_temp_rec(J).from_org_id = x_ship_count(I).from_org_id AND
2641                                l_temp_rec(J).to_org_id = x_ship_count(I).to_org_id THEN
2642                                ship_methodes_count := ship_methodes_count + 1 ;
2643                         END IF;
2644                     END LOOP;
2645                     x_ship_count(I).shipping_methodes  := ship_methodes_count ;
2646             END LOOP;
2647             itration := 1;
2648             loop_start := 0;
2649             I :=1;
2650            WHILE I <=  l_temp_rec.count LOOP
2651                 first_count := 0;
2652                 FOR J IN 1..x_ship_count.count LOOP
2653                     IF x_ship_count(J).from_org_id = l_temp_rec(I).from_org_id AND
2654                        x_ship_count(J).to_org_id = l_temp_rec(I).to_org_id THEN
2655                        first_count := x_ship_count(J).shipping_methodes;
2656                        exit;
2657                     END IF;
2658                 END LOOP;
2659                 IF itration = 1 then
2660                     FOR K IN 1..first_count LOOP
2661                      l_final_resource.extend;
2662                      l_final_resource(l_final_resource.count).resource_id        :=  l_temp_rec(I).resource_id ;
2663                      l_final_resource(l_final_resource.count).resource_type      :=  l_temp_rec(I).resource_type ;
2664                      l_final_resource(l_final_resource.count).lead_time          :=  l_temp_rec(K).lead_time;
2665                      l_final_resource(l_final_resource.count).transfer_cost      :=  l_temp_rec(K).quantity * l_temp_rec(K).transfer_cost;
2666                      l_final_resource(l_final_resource.count).shipping_methodes  :=  l_temp_rec(K).shipping_method ;
2667                     END LOOP;
2668                ELSE
2669                     FOR K IN 1..l_final_resource.count LOOP
2670                         FOR L IN I..(I+first_count-1) LOOP
2671                             l_temp_final_resource.extend ;
2672                             l_temp_final_resource(l_temp_final_resource.count).resource_id
2673                                                         :=  l_final_resource(k).resource_id ;
2674                             l_temp_final_resource(l_temp_final_resource.count).resource_type :=
2675                                                                        l_final_resource(K).resource_type ;
2676                             SELECT GREATEST(l_final_resource(K).lead_time,l_temp_rec(L).lead_time)
2677                             INTO l_temp_final_resource(l_temp_final_resource.count).lead_time
2678                             FROM DUAL ;
2679                              l_temp_final_resource(l_temp_final_resource.count).transfer_cost :=
2680                                                 (l_temp_rec(L).transfer_cost * l_temp_rec(L) .quantity) +
2681                                                  l_final_resource(K).transfer_cost;
2682                              l_temp_final_resource(l_temp_final_resource.count).shipping_methodes
2683                                                          := l_final_resource(K).shipping_methodes || '-' || l_temp_rec(L).shipping_method ;
2684                         END LOOP;
2685                     END LOOP;
2686                             l_final_resource.trim(l_final_resource.count) ;
2687                     FOR L IN 1..l_temp_final_resource.count LOOP
2688                         l_final_resource.extend ;
2689                         l_final_resource(l_final_resource.count).resource_id      :=  l_temp_final_resource(L).resource_id ;
2690                         l_final_resource(l_final_resource.count).resource_type    :=  l_temp_final_resource(L).resource_type ;
2691                         l_final_resource(l_final_resource.count).lead_time        := l_temp_final_resource(L).lead_time;
2692                         l_final_resource(l_final_resource.count).transfer_cost    := l_temp_final_resource(L).transfer_cost ;
2693                         l_final_resource(l_final_resource.count).shipping_methodes:= l_temp_final_resource(L).shipping_methodes;
2694                     END LOOP;
2695                         l_temp_final_resource.trim(l_temp_final_resource.count);
2696                 END IF;
2697                 itration := itration + 1;
2698                 I := I + first_count ;
2699             END LOOP;
2700             FOR L IN 1..l_final_resource.count LOOP
2701                   record_present := false;
2702                   FOR K IN 1..px_options.count LOOP
2703                             IF l_final_resource(L).lead_time = px_options(K).lead_time THEN
2704                                 record_present := TRUE;
2705                                 exit;
2706                             END IF;
2707                   END LOOP;
2708                  IF record_present = FALSE THEN
2709                     min_cost := l_final_resource(L).transfer_cost ;
2710                     l_shipping_methods := l_final_resource(L).shipping_methodes;
2711                     FOR J IN 1..l_final_resource.count LOOP
2712                         IF L <> J AND l_final_resource(L).lead_time =l_final_resource(J).lead_time THEN
2713                            /* SELECT LEAST(min_cost, l_final_resource(J).transfer_cost)
2714                             INTO min_cost
2715                             FROM DUAL;*/
2716                             if min_cost > l_final_resource(J).transfer_cost then
2717                                 min_cost := l_final_resource(J).transfer_cost;
2718                                 l_shipping_methods := l_final_resource(J).shipping_methodes;
2719                             end if;
2720                         END IF;
2721                     END LOOP;
2722                     px_options.extend;
2723                     px_options(px_options.count).resource_id       :=  l_final_resource(L).resource_id ;
2724                     px_options(px_options.count).resource_type     :=  l_final_resource(L).resource_type ;
2725                    /* in case of available date not today we have to assume that it is from other source
2726                      hence we have to substarct the current time from midnight today*/
2727                     l_final_resource(L).lead_time := l_final_resource(L).lead_time -
2728                                             ((to_number(to_Char(greatest_available_date,'HH24')) + to_number(to_Char(greatest_available_date,'MI'))/60 ) -(to_number(to_Char(sysdate,'HH24')) + to_number(to_Char(sysdate,'MI'))/60 ));
2729 
2730                     px_options(px_options.count).lead_time         :=  l_final_resource(L).lead_time;
2731                     px_options(px_options.count).transfer_cost     :=  min_cost;
2732                     px_options(px_options.count).shipping_methodes :=  l_shipping_methods;
2733                     px_options(px_options.count).arrival_date      :=  get_arrival_date(greatest_available_date,
2734                                                                                         l_final_resource(L).lead_time,
2735                                                                                         l_to_org_id);
2736 
2737                    END IF;
2738             END LOOP;
2739            ELSE
2740                  FOR I IN 1..p_eligible_resources.count LOOP
2741                     IF px_options.count >= 1 THEN
2742                         FOR J IN 1..px_options.count LOOP
2743                             IF px_options(J).resource_id <> p_eligible_resources(I).resource_id AND
2744                                px_options(J).resource_type <>  p_eligible_resources(I).resource_type THEN
2745                                do_insert := TRUE;
2746                                EXIT;
2747                             END IF;
2748                         END LOOP;
2749                         IF do_insert THEN
2750                             px_options.extend;
2751                             px_options(px_options.count).resource_id       :=  p_eligible_resources(I).resource_id ;
2752                             px_options(px_options.count).resource_type     :=  p_eligible_resources(I).resource_type ;
2753                             px_options(px_options.count).lead_time         :=  0;
2754                             px_options(px_options.count).transfer_cost     :=  0;
2755                             px_options(px_options.count).shipping_methodes :=  null;
2756                             px_options(px_options.count).arrival_date      :=  SYSDATE;
2757                         END IF;
2758                     ELSE
2759                             px_options.extend;
2760                             px_options(px_options.count).resource_id       :=  p_eligible_resources(I).resource_id ;
2761                             px_options(px_options.count).resource_type     :=  p_eligible_resources(I).resource_type ;
2762                             px_options(px_options.count).lead_time         :=  0;
2763                             px_options(px_options.count).transfer_cost     :=  0;
2764                             px_options(px_options.count).shipping_methodes :=  null;
2765                             px_options(px_options.count).arrival_date      :=  SYSDATE;
2766                     END IF;
2767                     do_insert := FALSE;
2768                     IF x_ship_count.count = 0 THEN
2769                         x_ship_count.extend;
2770                         x_ship_count(x_ship_count.count).from_org_id       := p_eligible_resources(I).source_org;
2771                         x_ship_count(x_ship_count.count).to_org_Id         := p_eligible_resources(I).organization_id;
2772                         x_ship_count(x_ship_count.count).shipping_methodes := 0 ;
2773                         x_ship_count(x_ship_count.count).min_leadtime      := 0;
2774                         x_ship_count(x_ship_count.count).max_leadtime      := 0;
2775                     ELSE
2776                         FOR I IN 1..x_ship_count.count LOOP
2777                             IF x_ship_count(x_ship_count.count).from_org_id <> p_eligible_resources(I).source_org AND
2778                                  x_ship_count(x_ship_count.count).to_org_id <> p_eligible_resources(I).organization_id THEN
2779                                 do_insert := TRUE;
2780                                 exit;
2781                             END IF;
2782                         END LOOP;
2783                         IF do_insert THEN
2784                             x_ship_count.extend;
2785                             x_ship_count(x_ship_count.count).from_org_id       := p_eligible_resources(I).source_org;
2786                             x_ship_count(x_ship_count.count).to_org_Id         := p_eligible_resources(I).organization_id;
2787                             x_ship_count(x_ship_count.count).shipping_methodes := 0 ;
2788                             x_ship_count(x_ship_count.count).min_leadtime      := 0;
2789                             x_ship_count(x_ship_count.count).max_leadtime      := 0;
2790                         END IF;
2791                     END IF;
2792                 END LOOP;
2793            END IF;
2794            EXCEPTION
2795             WHEN OTHERS THEN
2796             FND_MESSAGE.SET_NAME('CSP', 'CSP_UNEXPECTED_EXEC_ERRORS');
2797             FND_MESSAGE.SET_TOKEN('ROUTINE', l_api_name, FALSE);
2798             FND_MESSAGE.SET_TOKEN('SQLERRM', sqlerrm, FALSE);
2799             FND_MSG_PUB.ADD;
2800             fnd_msg_pub.count_and_get
2801               ( p_count => x_msg_count
2802               , p_data  => x_msg_data);
2803             x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
2804             return;
2805       END OPTIMIZE_OPTIONS;
2806 
2807      PROCEDURE CONSOLIDATE_QUANTITIES(p_eligible_resources_list IN     CSP_SCH_INT_PVT.CSP_AVAILABILITY_TBL_TYPE
2808                                       ,x_ship_quantity          OUT NOCOPY    CSP_SCH_INT_PVT.CSP_SHIP_QUANTITY_TBL_TYPE
2809                                       ,x_return_status          OUT NOCOPY    VARCHAR2
2810                                       ,x_msg_data               OUT NOCOPY    VARCHAR2
2811                                       ,x_msg_count              OUT NOCOPY    NUMBER) IS
2812         I NUMBER;
2813         J NUMBER;
2814         available BOOLEAN;
2815         l_api_name VARCHAR2(60) := 'CSP_SCH_INT_PVT.CONSOLIDATE_QUANTITIES';
2816      BEGIN
2817             x_return_status := FND_API.G_RET_STS_SUCCESS ;
2818             x_ship_quantity := CSP_SCH_INT_PVT.CSP_SHIP_QUANTITY_TBL_TYPE();
2819             x_ship_quantity.trim(x_ship_quantity.count);
2820             FOR I IN 1..p_eligible_resources_list.count LOOP
2821                 IF p_eligible_resources_list(I).sub_inventory IS NULL THEN
2822                     IF x_ship_quantity.count >= 1 THEN
2823                         FOR J IN 1..x_ship_quantity.count LOOP
2824                             IF p_eligible_resources_list(I).organization_id = x_ship_quantity(J).to_org_id AND
2825                              p_eligible_resources_list(I).source_org = x_ship_quantity(J).from_org_id THEN
2826                              x_ship_quantity(J).quantity := x_ship_quantity(J).quantity +
2827                                                               p_eligible_resources_list(I).quantity ;
2828                                 available := TRUE;
2829                                 EXIT ;
2830                             ELSE
2831                              available := FALSE;
2832                             END IF;
2833                         END LOOP;
2834                             IF available  = FALSE THEN
2835                                 x_ship_quantity.extend ;
2836                                 x_ship_quantity(x_ship_quantity.count).resource_type :=
2837                                                                            p_eligible_resources_list(I).resource_type  ;
2838                                 x_ship_quantity(x_ship_quantity.count).resource_id :=
2839                                                                            p_eligible_resources_list(I).resource_id ;
2840                                 x_ship_quantity(x_ship_quantity.count).from_org_id := p_eligible_resources_list(I).source_org;
2841                                 x_ship_quantity(x_ship_quantity.count).to_org_id   :=  p_eligible_resources_list(I).organization_id;
2842                                 x_ship_quantity(x_ship_quantity.count).quantity := p_eligible_resources_list(I).quantity;
2843                                 x_ship_quantity(x_ship_quantity.count).destination_location_id :=  p_eligible_resources_list(I).destination_location_id;
2844                             END IF;
2845                     ELSE
2846                         x_ship_quantity.extend ;
2847                         x_ship_quantity(x_ship_quantity.count).resource_type := p_eligible_resources_list(I).resource_type  ;
2848                         x_ship_quantity(x_ship_quantity.count).resource_id := p_eligible_resources_list(I).resource_id ;
2849                         x_ship_quantity(x_ship_quantity.count).from_org_id := p_eligible_resources_list(I).source_org;
2850                         x_ship_quantity(x_ship_quantity.count).to_org_id   :=  p_eligible_resources_list(I).organization_id;
2851                         x_ship_quantity(x_ship_quantity.count).quantity    := p_eligible_resources_list(I).quantity;
2852                          x_ship_quantity(x_ship_quantity.count).destination_location_id :=  p_eligible_resources_list(I).destination_location_id;
2853                     END IF;
2854                 END IF;
2855             END LOOP;
2856             EXCEPTION
2857             WHEN OTHERS THEN
2858             FND_MESSAGE.SET_NAME('CSP', 'CSP_UNEXPECTED_EXEC_ERRORS');
2859             FND_MESSAGE.SET_TOKEN('ROUTINE', l_api_name, FALSE);
2860             FND_MESSAGE.SET_TOKEN('SQLERRM', sqlerrm, FALSE);
2861             FND_MSG_PUB.ADD;
2862             fnd_msg_pub.count_and_get
2863               ( p_count => x_msg_count
2864               , p_data  => x_msg_data);
2865             x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
2866             return;
2867      END CONSOLIDATE_QUANTITIES;
2868 
2869       PROCEDURE GET_SHIPPING_PARAMETERS(p_ship_quantity            IN CSP_SCH_INT_PVT.CSP_SHIP_QUANTITY_TBL_TYPE,
2870                                        x_resource_ship_parameters OUT NOCOPY CSP_SCH_INT_PVT.CSP_ORGS_SHIP_PARAM_TBL_TYPE
2871                                       ,x_ship_count               OUT NOCOPY CSP_SCH_INT_PVT.CSP_SHIP_METHOD_COUNT_TBL_TYP
2872                                       ,x_return_status            OUT NOCOPY VARCHAR2
2873                                       ,x_msg_data                 OUT NOCOPY VARCHAR2
2874                                       ,x_msg_count                OUT NOCOPY NUMBER) IS
2875         CURSOR csp_ship_methodes(from_org varchar2,to_org varchar2) IS
2876         SELECT ISM.SHIP_METHOD,NVL(ISM.COST_PER_UNIT_LOAD_WEIGHT,0)
2877        ,CDT.FREIGHT_CODE,CDT.LEAD_TIME,CDT.LEAD_TIME_UOM,CDT.DELIVERY_TIME
2878        ,CDT.CUTOFF_TIME,CDT.TIMEZONE_ID,CDT.SAFETY_ZONE
2879         FROM   MTL_INTERORG_SHIP_METHODS ISM,CSP_CARRIER_DELIVERY_TIMES CDT
2880         WHERE  ISM.FROM_ORGANIZATION_ID = from_org
2881         AND    ISM.TO_ORGANIZATION_ID =  to_org
2882         AND    CDT.ORGANIZATION_ID = from_org
2883         AND    CDT.SHIPPING_METHOD = ISM.SHIP_METHOD;
2884 
2885         CURSOR C2(c_resource_type varchar2, c_resource_id NUMBER)
2886         IS
2887         SELECT TIMEZONE_ID
2888         FROM   CSP_RS_SHIP_TO_ADDRESSES_V
2889         WHERE  PRIMARY_FLAG ='Y'
2890         AND resource_id  = c_resource_id
2891         AND resource_type = c_resource_type;
2892 
2893         CURSOR get_organization_code(l_org_id number) IS
2894         SELECT ORGANIZATION_CODE
2895         FROM   MTL_PARAMETERS
2896         WHERE  ORGANIZATION_ID = l_org_id;
2897 
2898         cursor csp_location_ship_methods(c_from_org_id number, c_to_location_id number) IS
2899          SELECT ISM.SHIP_METHOD,NVL(ISM.COST_PER_UNIT_LOAD_WEIGHT,0),
2900         ism.intransit_time,ism.from_location_id,ism.to_location_id,ism.destination_type
2901         FROM   MTL_INTERORG_SHIP_METHODS ISM,HR_ALL_ORGANIZATION_UNITS hao
2902         where  hao.organization_id = c_from_org_id
2903         and  ism.from_location_id = hao.location_id
2904         and  ism.to_location_id = c_to_location_id
2905         and ism.destination_type ='L'
2906         UNION ALL
2907          /*SELECT ISM.SHIP_METHOD,NVL(ISM.COST_PER_UNIT_LOAD_WEIGHT,0),
2908         ism.intransit_time,ism.from_location_id,ism.to_location_id,ism.destination_type
2909         FROM   MTL_INTERORG_SHIP_METHODS ISM,HR_ALL_ORGANIZATION_UNITS hao
2910         where  hao.organization_id = c_from_org_id
2911         and  ism.from_location_id = hao.location_id
2912          and ism.destination_type ='R'
2913         and  ism.to_region_id IN(select wlr.REGION_ID
2914                                  from WSH_LOCATIONS_REGIONS_V wlr, WSH_ZONE_REGIONS_V wzr
2915                                  where wlr.location_id = c_to_location_id
2916                                  and wzr.REGION_ID(+) = wlr.region_id)*/
2917         SELECT ISM.SHIP_METHOD,NVL(ISM.COST_PER_UNIT_LOAD_WEIGHT,0),
2918         ism.intransit_time,ism.from_location_id,ism.to_location_id,ism.destination_type
2919          FROM   MTL_INTERORG_SHIP_METHODS ISM,HR_ALL_ORGANIZATION_UNITS hao
2920         where  hao.organization_id = c_from_org_id
2921         and  ism.from_location_id = hao.location_id
2922          and ism.destination_type ='R'
2923         and  ism.to_region_id IN (select wlr.region_id
2924                                  from WSH_REGION_LOCATIONS_VL wlr, WSH_ZONE_REGIONS_V wzr
2925                                  where wlr.location_id = c_to_location_id
2926                                  and wzr.REGION_ID(+) = wlr.region_id
2927                               and wlr.region_type = (select  max(region_type)
2928                               from WSH_REGION_LOCATIONS_VL wrl2
2929                               where wrl2.region_id IN(SELECT ism1.to_region_id FROM
2930                               MTL_INTERORG_SHIP_METHODS ISM1,HR_ALL_ORGANIZATION_UNITS hao,WSH_LOCATIONS_REGIONS_V wlr1
2931         where  hao.organization_id = c_from_org_id
2932         and  ism1.from_location_id = hao.location_id
2933          and ism1.destination_type ='R')))
2934          UNION ALL
2935          SELECT ISM.SHIP_METHOD,NVL(ISM.COST_PER_UNIT_LOAD_WEIGHT,0),
2936         ism.intransit_time,ism.from_location_id,ism.to_location_id,ism.destination_type
2937         FROM   MTL_INTERORG_SHIP_METHODS ISM,HR_ALL_ORGANIZATION_UNITS hao
2938         where  hao.organization_id = c_from_org_id
2939         and  ism.from_location_id = hao.location_id
2940         and ism.destination_type ='Z'
2941         and  ism.to_region_id IN(select wzr.zone_id
2942                                  from WSH_LOCATIONS_REGIONS_V wlr, WSH_ZONE_REGIONS_V wzr
2943                                  where wlr.location_id = c_to_location_id
2944                                  and wzr.REGION_ID(+) = wlr.region_id);
2945 
2946 
2947         l_default_unit_for_hour  varchar2(3);
2948         l_ship_methode           VARCHAR2(30);
2949         l_cost_per_unit          NUMBER;
2950         l_lead_time              NUMBER;
2951         l_freight_code           Varchar2(30);
2952         l_lead_time_uom          varchar2(3);
2953         l_delivery_time           date;
2954         l_cutoff_time            date;
2955         l_timezone_id            NUMBER;
2956         l_saftey_zone            number;
2957         l_hours                  NUMBER;
2958         l_server_timezone_id     NUMBER;
2959         l_shipto_timezone_id   NUMBER;
2960         l_delivery_date          DATE;
2961         l_days                   NUMBER;
2962         shipping_option         BOOLEAN;
2963 
2964         l_shipping_methode_count NUMBER;
2965         l_need_by_date           DATE;
2966         l_min_lead_time      NUMBER;
2967         l_max_lead_time      NUMBER;
2968         l_server_time_zone_id NUMBER;
2969         l_msg_count           NUMBER;
2970         l_cutoff_hours        NUMBER;
2971         l_sys_hours           NUMBER;
2972         l_msg_data            VARCHAR2(2000);
2973         l_return_status       VARCHAR2(3);
2974         l_server_delivery_date DATE;
2975         l_server_cutoff_time   DATE;
2976         l_api_name             VARCHAR2(60) := 'CSP_SCH_INT_PVT.GET_SHIPPING_PARAMETERS';
2977         l_from_org_code        VARCHAR2(10);
2978         l_to_org_code           VARCHAR2(10);
2979         l_sysdate              DATE;
2980         l_server_sys_date      Date;
2981         l_from_location_id     NUMBER;
2982         l_to_location_id       NUMBER ;
2983         l_destination_type     varchar2(1);
2984         l_ship_method_present_for_loc boolean := false;
2985         l_ship_method_present_for_reg boolean :=false;
2986      BEGIN
2987             l_server_sys_date := sysdate;
2988             x_return_status := FND_API.G_RET_STS_SUCCESS;
2989             l_default_unit_for_hour := FND_PROFILE.VALUE(NAME => 'CSF_UOM_HOURS');
2990             l_server_time_zone_id   := FND_PROFILE.VALUE(NAME => 'SERVER_TIMEZONE_ID');
2991 
2992             IF g_interval.latest_time IS NOT NULL
2993             THEN
2994                l_need_by_date := g_interval.latest_time;
2995             ELSE
2996                l_need_by_date := g_interval.earliest_time;
2997             END IF;
2998             x_resource_ship_parameters :=  CSP_SCH_INT_PVT.CSP_ORGS_SHIP_PARAM_TBL_TYPE();
2999             x_ship_count := CSP_SCH_INT_PVT.CSP_SHIP_METHOD_COUNT_TBL_TYP();
3000             x_ship_count.trim(x_ship_count.count) ;
3001             FOR I IN 1..p_ship_quantity.count LOOP
3002                 IF p_ship_quantity(I).resource_type = 'DUMMY'          and
3003                    p_ship_quantity(I).resource_id =  '999999999999999'  or g_shipto_timezone_id is not null THEN
3004                    l_shipto_timezone_id := g_shipto_timezone_id;
3005                 ELSE
3006                     OPEN C2(p_ship_quantity(I).resource_type, p_ship_quantity(I).resource_id);
3007                     LOOP
3008                         FETCH C2 INTO l_shipto_timezone_id;
3009                         EXIT WHEN C2%NOTFOUND;
3010                     END LOOP;
3011                     CLOSE C2;
3012                 END IF;
3013                 IF l_shipto_timezone_id <> l_server_time_zone_id THEN
3014                             HZ_TIMEZONE_PUB.Get_Time(   p_api_version  => 1.0,
3015                                     p_init_msg_list  => FND_API.G_FALSE,
3016                                     p_source_tz_id   => l_server_time_zone_id,
3017                                     p_dest_tz_id     => l_shipto_timezone_id,
3018                                     p_source_day_time  => sysdate,
3019                                     x_dest_day_time    => l_sysdate,
3020                                     x_return_status    => l_return_status ,
3021                                     x_msg_count        => l_msg_count ,
3022                                     x_msg_data         => l_msg_data);
3023                   ELSE
3024                       l_sysdate := sysdate;
3025                   END IF;
3026                 l_min_lead_time  := 0;
3027                 l_max_lead_time  := 0;
3028                 l_shipping_methode_count := 0;
3029                 OPEN csp_location_ship_methods(p_ship_quantity(I).from_org_id,p_ship_quantity(I).destination_location_id);
3030                 LOOP
3031                     FETCH csp_location_ship_methods INTO l_ship_methode,l_cost_per_unit,l_lead_time,l_from_location_id,l_to_location_id,l_destination_type;
3032                     EXIT WHEN csp_location_ship_methods%NOTFOUND;
3033                     if not l_ship_method_present_for_loc then
3034                         if l_destination_type = 'L' THEN
3035                             l_ship_method_present_for_loc := true;
3036                         end if;
3037                         if not l_ship_method_present_for_reg then
3038                           if l_destination_type = 'R' THEN
3039                             l_ship_method_present_for_reg := true;
3040                           end if;
3041                         end if;
3042                     end if ;
3043                     shipping_option := false;
3044                     if l_ship_method_present_for_loc AND l_destination_type = 'L' THEN
3045                             shipping_option := true;
3046                     end if;
3047                     if not l_ship_method_present_for_loc AND l_ship_method_present_for_reg AND l_destination_type = 'R' THEN
3048                         shipping_option := true;
3049                     END IF;
3050                     if not l_ship_method_present_for_loc AND NOT l_ship_method_present_for_reg AND l_destination_type = 'Z' THEN
3051                         shipping_option := true;
3052                     END IF;
3053                         l_delivery_date := trunc(l_sysdate + l_lead_time);
3054                          IF l_shipto_timezone_id <> l_server_time_zone_id THEN
3055                             HZ_TIMEZONE_PUB.Get_Time(   p_api_version  => 1.0,
3056                                     p_init_msg_list  => FND_API.G_FALSE,
3057                                     p_source_tz_id   => l_shipto_timezone_id,
3058                                     p_dest_tz_id     => l_server_time_zone_id,
3059                                     p_source_day_time  => l_delivery_date,
3060                                     x_dest_day_time    => l_server_delivery_date,
3061                                     x_return_status    => l_return_status ,
3062                                     x_msg_count        => l_msg_count ,
3063                                     x_msg_data         => l_msg_data);
3064                         ELSE
3065                             l_server_delivery_date := l_delivery_date;
3066                         END IF;
3067                         IF  shipping_option then
3068                             l_shipping_methode_count := l_shipping_methode_count + 1;
3069                         IF l_shipping_methode_count = 1 THEN
3070                             l_min_lead_time :=  (l_server_delivery_date - l_server_sys_date) * 24 ;
3071                             l_max_lead_time :=  (l_server_delivery_date - l_server_sys_date) * 24 ;
3072                         ELSE
3073                             IF l_min_lead_time > (l_server_delivery_date - l_server_sys_date) * 24 THEN
3074                                l_min_lead_time :=  (l_server_delivery_date - l_server_sys_date) * 24 ;
3075                             END IF;
3076                             IF l_max_lead_time < (l_server_delivery_date - l_server_sys_date) * 24 THEN
3077                                 l_max_lead_time :=  (l_server_delivery_date - l_server_sys_date) * 24 ;
3078                             END IF;
3079                         END IF;
3080                         x_resource_ship_parameters.extend ;
3081                     x_resource_ship_parameters(x_resource_ship_parameters.count).resource_type
3082                                                                 := p_ship_quantity(I).resource_type ;
3083                     x_resource_ship_parameters(x_resource_ship_parameters.count).resource_id
3084                                                                 := p_ship_quantity(I).resource_id ;
3085                     x_resource_ship_parameters(x_resource_ship_parameters.count).from_org_id
3086                                                                 := p_ship_quantity(I).from_org_id;
3087                     x_resource_ship_parameters(x_resource_ship_parameters.count).to_org_id
3088                                                                 := p_ship_quantity(I).to_org_id;
3089                     x_resource_ship_parameters(x_resource_ship_parameters.count).quantity
3090                                                                 := p_ship_quantity(I).quantity ;
3091                     x_resource_ship_parameters(x_resource_ship_parameters.count).shipping_method
3092                                                                 := l_ship_methode ;
3093                     x_resource_ship_parameters(x_resource_ship_parameters.count).lead_time
3094                                                                 := (l_server_delivery_date - l_server_sys_date) * 24  ;
3095                     x_resource_ship_parameters(x_resource_ship_parameters.count).transfer_cost
3096                                                                 := NVL(l_cost_per_unit,0);
3097                     x_resource_ship_parameters(x_resource_ship_parameters.count).delivery_time := l_server_delivery_date;
3098                     END IF;
3099                 END LOOP;
3100               IF csp_location_ship_methods % ROWCOUNT = 0 THEN
3101                 CLOSE csp_location_ship_methods;
3102                 OPEN CSP_SHIP_METHODES(p_ship_quantity(I).from_org_id,p_ship_quantity(I).to_org_id);
3103                 LOOP
3104                     FETCH CSP_SHIP_METHODES INTO l_ship_methode,l_cost_per_unit,l_freight_code,l_lead_time,l_lead_time_uom,
3105                                      l_delivery_time,l_cutoff_time, l_timezone_id, l_saftey_zone;
3106                     EXIT WHEN CSP_SHIP_METHODES%NOTFOUND;
3107                     l_hours := 0;
3108                     l_days := 0;
3109                     shipping_option := true;
3110                     IF l_lead_time > 0 THEN
3111                         l_hours := inv_convert.inv_um_convert (null,6,l_lead_time,l_lead_time_uom,l_default_unit_for_hour,null,null);
3112                         IF l_hours >= 24 then
3113                             IF l_delivery_time is null THEN
3114                                 l_hours := l_hours ;
3115                                 l_delivery_date := (l_sysdate + (1/24) * l_hours);
3116                             ELSE
3117                                 l_days := round (l_hours / 24 ) ;
3118                                 l_delivery_date := trunc(l_sysdate + l_days) ;
3119                                 l_hours :=  TO_NUMBER(to_char(l_delivery_time,'HH24'))  +  TO_NUMBER(to_char(l_delivery_time,'MI')) * (1/60);
3120                                 l_delivery_date := (l_delivery_date + (1/24) * l_hours);
3121                             END IF;
3122                         ELSE
3123                             IF l_delivery_time is null THEN
3124                                 l_delivery_date := (l_sysdate + (1/24) * l_hours);
3125                             ELSE
3126                                 IF ((to_number(to_char(l_delivery_time,'HH24')) + (1/60) * to_number(to_char(l_delivery_time,'MI')))
3127                                      - (to_number(to_char(l_sysdate ,'HH24'))  + (1/60) * to_number(to_char(l_sysdate,'MI'))) ) > l_hours THEN
3128                                     l_delivery_date := (l_sysdate + (1/24) * l_hours);
3129                                 ELSE
3130                                     shipping_option := FALSE;
3131                                 END IF;
3132                             END IF;
3133                         END IF;
3134                     END IF;
3135                     IF l_saftey_zone IS NOT NULL THEN
3136                         l_delivery_date := l_delivery_date + (l_saftey_zone * 1/24) ;
3137                     END IF;
3138 
3139                       IF l_shipto_timezone_id <> l_server_time_zone_id THEN
3140                             HZ_TIMEZONE_PUB.Get_Time(   p_api_version  => 1.0,
3141                                     p_init_msg_list  => FND_API.G_FALSE,
3142                                     p_source_tz_id   => l_shipto_timezone_id,
3143                                     p_dest_tz_id     => l_server_time_zone_id,
3144                                     p_source_day_time  => l_delivery_date,
3145                                     x_dest_day_time    => l_server_delivery_date,
3146                                     x_return_status    => l_return_status ,
3147                                     x_msg_count        => l_msg_count ,
3148                                     x_msg_data         => l_msg_data);
3149                         ELSE
3150                             l_server_delivery_date := l_delivery_date;
3151                         END IF;
3152 
3153                         IF l_cutoff_time is not null then
3154                             HZ_TIMEZONE_PUB.Get_Time(   p_api_version  => 1.0,
3155                                     p_init_msg_list  => FND_API.G_FALSE,
3156                                     p_source_tz_id   => l_timezone_id,
3157                                     p_dest_tz_id     => l_server_time_zone_id,
3158                                     p_source_day_time  => l_cutoff_time,
3159                                     x_dest_day_time    => l_server_cutoff_time,
3160                                     x_return_status    => l_return_status ,
3161                                     x_msg_count        => l_msg_count ,
3162                                     x_msg_data         => l_msg_data);
3163                                     l_cutoff_hours := to_number(to_char(l_server_cutoff_time,'HH24')) + (to_number(to_char(l_server_cutoff_time,'MI')) * 1/60);
3164                                     l_sys_hours    := to_number(to_char(l_sysdate,'HH24')) + (to_number(to_char(l_sysdate,'MI')) * 1/60);
3165 
3166                             IF l_cutoff_hours < l_sys_hours THEN
3167                                 l_server_delivery_date := l_server_delivery_date + 1;
3168                             END IF;
3169                         END IF;
3170                   /*  IF l_need_by_date IS NOT NULL AND  l_server_delivery_date > l_need_by_date THEN
3171                             shipping_option := FALSE;
3172                     END IF;*/
3173                        IF  shipping_option then
3174                         l_shipping_methode_count := l_shipping_methode_count + 1;
3175                         IF l_shipping_methode_count = 1 THEN
3176                             l_min_lead_time :=  (l_server_delivery_date - l_server_sys_date) * 24 ;
3177                             l_max_lead_time :=  (l_server_delivery_date - l_server_sys_date) * 24 ;
3178                         ELSE
3179                             IF l_min_lead_time > (l_server_delivery_date - l_server_sys_date) * 24 THEN
3180                                l_min_lead_time :=  (l_server_delivery_date - l_server_sys_date) * 24 ;
3181                             END IF;
3182                             IF l_max_lead_time < (l_server_delivery_date - l_server_sys_date) * 24 THEN
3183                                 l_max_lead_time :=  (l_server_delivery_date - l_server_sys_date) * 24 ;
3184                             END IF;
3185                         END IF;
3186                         x_resource_ship_parameters.extend ;
3187                     x_resource_ship_parameters(x_resource_ship_parameters.count).resource_type
3188                                                                 := p_ship_quantity(I).resource_type ;
3189                     x_resource_ship_parameters(x_resource_ship_parameters.count).resource_id
3190                                                                 := p_ship_quantity(I).resource_id ;
3191                     x_resource_ship_parameters(x_resource_ship_parameters.count).from_org_id
3192                                                                 := p_ship_quantity(I).from_org_id;
3193                     x_resource_ship_parameters(x_resource_ship_parameters.count).to_org_id
3194                                                                 := p_ship_quantity(I).to_org_id;
3195                     x_resource_ship_parameters(x_resource_ship_parameters.count).quantity
3196                                                                 := p_ship_quantity(I).quantity ;
3197                     x_resource_ship_parameters(x_resource_ship_parameters.count).shipping_method
3198                                                                 := l_ship_methode ;
3199                     x_resource_ship_parameters(x_resource_ship_parameters.count).lead_time
3200                                                                 := (l_server_delivery_date - l_server_sys_date) * 24  ;
3201                     x_resource_ship_parameters(x_resource_ship_parameters.count).transfer_cost
3202                                                                 := NVL(l_cost_per_unit,0);
3203                     x_resource_ship_parameters(x_resource_ship_parameters.count).delivery_time := l_server_delivery_date;
3204                     END IF;
3205                 END LOOP;
3206                     IF csp_ship_methodes%ROWCOUNT = 0 and  (p_ship_quantity(I).from_org_id <> p_ship_quantity(I).to_org_id) THEN
3207                          open get_organization_code(p_ship_quantity(I).from_org_id);
3208                          LOOP
3209                              FETCH get_organization_code INTO l_from_org_code;
3210                              EXIT WHEN get_organization_code % NOTFOUND;
3211                          END LOOP;
3212                          CLOSE get_organization_code;
3213                          open get_organization_code(p_ship_quantity(I).to_org_id);
3214                          LOOP
3215                              FETCH get_organization_code INTO l_to_org_code;
3216                              EXIT WHEN get_organization_code % NOTFOUND;
3217                          END LOOP;
3218                          CLOSE get_organization_code;
3219                          FND_MESSAGE.SET_NAME('CSP', 'CSP_SCH_SHIPMETHOD_NOT_DEFINED');
3220                          FND_MESSAGE.SET_TOKEN('FROM_ORG', l_from_org_code, TRUE);
3221                          FND_MESSAGE.SET_TOKEN('TO_ORG', l_to_org_code, TRUE);
3222                          FND_MSG_PUB.ADD;
3223                          fnd_msg_pub.count_and_get
3224                                             ( p_count => x_msg_count
3225                                             , p_data  => x_msg_data);
3226                          x_return_status := FND_API.G_RET_STS_ERROR;
3227                          return;
3228                     END IF;
3229                     IF csp_ship_methodes%ISOPEN THEN
3230                         CLOSE csp_ship_methodes;
3231                     END IF;
3232                 END IF;
3233                     IF csp_location_ship_methods %ISOPEN THEN
3234                         CLOSE csp_location_ship_methods;
3235                     END IF;
3236                 x_ship_count.extend;
3237                 x_ship_count(x_ship_count.count).from_org_id       := p_ship_quantity(I).from_org_id ;
3238                 x_ship_count(x_ship_count.count).to_org_Id         := p_ship_quantity(I).to_org_id ;
3239                 x_ship_count(x_ship_count.count).shipping_methodes := l_shipping_methode_count ;
3240                 x_ship_count(x_ship_count.count).min_leadtime      := l_min_lead_time;
3241                 x_ship_count(x_ship_count.count).max_leadtime      := l_max_lead_time;
3242             END LOOP;
3243 
3244             EXCEPTION
3245             WHEN OTHERS THEN
3246             FND_MESSAGE.SET_NAME('CSP', 'CSP_UNEXPECTED_EXEC_ERRORS');
3247             FND_MESSAGE.SET_TOKEN('ROUTINE', l_api_name, TRUE);
3248             FND_MESSAGE.SET_TOKEN('SQLERRM', sqlerrm, TRUE);
3249             FND_MSG_PUB.ADD;
3250             fnd_msg_pub.count_and_get
3251               ( p_count => x_msg_count
3252               , p_data  => x_msg_data);
3253             x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
3254             return;
3255      END GET_SHIPPING_PARAMETERS;
3256      PROCEDURE GET_DELIVERY_DATE(p_relation_ship_id  IN  NUMBER,
3257                                  x_delivery_date     OUT NOCOPY DATE,
3258                                  x_shipping_option   OUT NOCOPY BOOLEAN,
3259                                  x_return_status     OUT NOCOPY VARCHAR2,
3260                                  x_msg_data          OUT NOCOPY VARCHAR2,
3261                                  x_msg_count         OUT NOCOPY NUMBER) IS
3262         CURSOR C1(c_relation_id NUMBER) IS
3263         SELECT CDT.LEAD_TIME,CDT.LEAD_TIME_UOM,CDT.DELIVERY_TIME
3264               ,CDT.CUTOFF_TIME,CDT.TIMEZONE_ID,CDT.SAFETY_ZONE
3265         FROM   CSP_CARRIER_DELIVERY_TIMES CDT
3266         WHERE  CDT.relation_ship_id = c_relation_id;
3267         I NUMBER;
3268         l_hours     NUMBER;
3269         l_days      NUMBER;
3270         l_lead_time NUMBER;
3271         l_lead_time_uom varchar2(3);
3272         l_delivery_time DATE;
3273         l_cutoff_time DATE;
3274         l_timezone_id NUMBER;
3275         l_saftey_zone NUMBER;
3276         l_delivery_date DATE;
3277         l_default_unit_for_hour  varchar2(3);
3278         l_api_name varchar2(60) := 'CSP_SCH_INT_PVT.GET_DELIVERY_DATE' ;
3279       BEGIN
3280             x_return_status := FND_API.G_RET_STS_SUCCESS ;
3281           l_default_unit_for_hour := FND_PROFILE.VALUE(NAME => 'CSF_UOM_HOURS');
3282             OPEN C1(p_relation_ship_id);
3283             LOOP
3284                 FETCH C1 INTO l_lead_time,l_lead_time_uom,l_delivery_time,l_cutoff_time, l_timezone_id, l_saftey_zone;
3285                     EXIT WHEN C1%NOTFOUND;
3286                     l_hours := 0;
3287                     l_days := 0;
3288                     x_shipping_option := true;
3289                     IF l_lead_time > 0 THEN
3290                         l_hours := inv_convert.inv_um_convert (null,6,l_lead_time,l_lead_time_uom,l_default_unit_for_hour,null,null);
3291                         IF l_hours >= 24 then
3292                             IF l_delivery_time is null THEN
3293                                 l_hours := l_hours ;
3294                                 l_delivery_date := (SYSDATE + (1/24) * l_hours);
3295                             ELSE
3296                                 l_days := round (l_hours / 24 ) ;
3297                                 l_delivery_date := trunc(SYSDATE + l_days) ;
3298                                 l_hours :=  TO_NUMBER(to_char(l_delivery_time,'HH24'))  +  TO_NUMBER(to_char(l_delivery_time,'MI')) * (1/60);
3299                                 l_delivery_date := (l_delivery_date + (1/24) * l_hours);
3300                             END IF;
3301                         ELSE
3302                             IF l_delivery_time is null THEN
3303                                 l_delivery_date := (SYSDATE + (1/24) * l_hours);
3304                             ELSE
3305                                 IF ((to_number(to_char(l_delivery_time,'HH24')) + (1/60) * to_number(to_char(l_delivery_time,'MI')))
3306                                      - (to_number(to_char(sysdate ,'HH24'))  + (1/60) * to_number(to_char(sysdate,'MI'))) ) > l_hours THEN
3307                                     l_delivery_date := (SYSDATE + (1/24) * l_hours);
3308                                 ELSE
3309                                     x_shipping_option := FALSE;
3310                                 END IF;
3311                             END IF;
3312                         END IF;
3313                     END IF;
3314             END LOOP;
3315                 CLOSE C1;
3316                     IF l_saftey_zone IS NOT NULL THEN
3317                         l_delivery_date := l_delivery_date + (l_saftey_zone * 1/24) ;
3318                     END IF;
3319                     x_delivery_date := l_delivery_date;
3320             EXCEPTION
3321             WHEN OTHERS THEN
3322             FND_MESSAGE.SET_NAME('CSP', 'CSP_UNEXPECTED_EXEC_ERRORS');
3323             FND_MESSAGE.SET_TOKEN('ROUTINE', l_api_name, FALSE);
3324             FND_MESSAGE.SET_TOKEN('SQLERRM', sqlerrm, FALSE);
3325             FND_MSG_PUB.ADD;
3326             fnd_msg_pub.count_and_get
3327               ( p_count => x_msg_count
3328               , p_data  => x_msg_data);
3329             x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
3330             return;
3331       END GET_DELIVERY_DATE;
3332 
3333     PROCEDURE EXTEND_ATP_REC(p_atp_rec IN OUT NOCOPY mrp_atp_pub.atp_rec_typ
3334                              ,x_return_status OUT NOCOPY VARCHAR2) IS
3335 
3336     BEGIN
3337         x_return_status := FND_API.G_RET_STS_SUCCESS;
3338         p_atp_rec.Row_Id.Extend;
3339         p_atp_rec.Instance_Id.Extend;
3340         p_atp_rec.Inventory_Item_Id.Extend;
3341         p_atp_rec.Inventory_Item_Name.Extend;
3342         p_atp_rec.Source_Organization_Id.Extend;
3343         p_atp_rec.Source_Organization_Code.Extend;
3344         p_atp_rec.organization_id.Extend;
3345         p_atp_rec.Identifier.Extend;
3346         p_atp_rec.Demand_Source_Header_Id.Extend;
3347         p_atp_rec.Demand_Source_Delivery.Extend;
3348         p_atp_rec.Demand_Source_Type.Extend;
3349         p_atp_rec.Scenario_Id.Extend;
3350         p_atp_rec.Calling_Module.Extend;
3351         p_atp_rec.Customer_Id.Extend;
3352         p_atp_rec.Customer_Site_Id.Extend;
3353         p_atp_rec.Destination_Time_Zone.Extend;
3354         p_atp_rec.Quantity_Ordered.Extend;
3355         p_atp_rec.Quantity_UOM.Extend;
3356         p_atp_rec.Requested_Ship_Date.Extend;
3357         p_atp_rec.Requested_Arrival_Date.Extend;
3358         p_atp_rec.Earliest_Acceptable_Date.Extend;
3359         p_atp_rec.Latest_Acceptable_Date.Extend;
3360         p_atp_rec.Delivery_Lead_Time.Extend;
3361         p_atp_rec.Freight_Carrier.Extend;
3362         p_atp_rec.Ship_Method.Extend;
3363         p_atp_rec.Demand_Class.Extend;
3364         p_atp_rec.Ship_Set_Name.Extend;
3365         p_atp_rec.Arrival_Set_Name.Extend;
3366         p_atp_rec.Override_Flag.Extend;
3367         p_atp_rec.Action.Extend;
3368         p_atp_rec.Ship_Date.Extend;
3369         p_atp_rec.Available_Quantity.Extend;
3370         p_atp_rec.Requested_Date_Quantity.Extend;
3371         p_atp_rec.Group_Ship_Date.Extend;
3372         p_atp_rec.Group_Arrival_Date.Extend;
3373         p_atp_rec.Vendor_Id.Extend;
3374         p_atp_rec.Vendor_Name.Extend;
3375         p_atp_rec.Vendor_Site_Id.Extend;
3376         p_atp_rec.Vendor_Site_Name.Extend;
3377         p_atp_rec.Insert_Flag.Extend;
3378         p_atp_rec.OE_Flag.Extend;
3379         p_atp_rec.Error_Code.Extend;
3380         p_atp_rec.Atp_Lead_Time.Extend;
3381         p_atp_rec.Message.Extend;
3382         p_atp_rec.End_Pegging_Id.EXTEND;
3383         p_atp_rec.Order_Number.EXTEND;
3384         p_atp_rec.Old_Source_Organization_Id.EXTEND;
3385         p_atp_rec.Old_Demand_Class.EXTEND;
3386         EXCEPTION
3387         WHEN OTHERS THEN
3388             x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
3389             return;
3390     END EXTEND_ATP_REC;
3391 
3392     FUNCTION CREATE_RESERVATION(p_reservation_parts IN CSP_SCH_INT_PVT.RESERVATION_REC_TYP
3393                                 ,x_return_status     OUT NOCOPY VARCHAR2
3394                                 ,x_msg_data         OUT NOCOPY VARCHAR2)
3395     RETURN NUMBER
3396     IS
3397           CURSOR csp_transactions IS
3398           SELECT TRANSACTION_SOURCE_TYPE_ID,TRANSACTION_SOURCE_TYPE_NAME
3399           FROM   MTL_TXN_SOURCE_TYPES
3400           WHERE  transaction_source_type_id = 13;
3401           I NUMBER;
3402           l_api_version_number number :=1;
3403           l_init_msg_lst  varchar2(1) := fnd_api.g_true;
3404           x_msg_count number;
3405          -- x_msg_data  varchar2(128);
3406           l_rsv_rec  inv_reservation_global.mtl_reservation_rec_type;
3407           l_serial_number inv_reservation_global.serial_number_tbl_type;
3408           x_serial_number inv_reservation_global.serial_number_tbl_type;
3409           l_partial_reservation_flag varchar2(1):= fnd_api.g_false;
3410           l_force_reservation_flag varchar2(1) := fnd_api.g_true;
3411           l_validation_flag    varchar2(1) := fnd_api.g_true;
3412           l_source_type_id     NUMBER;
3413           l_source_name        varchar2(30);
3414           x_quantity_reserved  number;
3415           x_reservation_id number;
3416           l_msg varchar2(2000);
3417           --x_return_status varchar(128);
3418      BEGIN
3419           x_return_status  := FND_API.G_RET_STS_SUCCESS;
3420           OPEN csp_transactions;
3421             LOOP
3422                 FETCH csp_transactions INTO l_source_type_id, l_source_name;
3423                 EXIT WHEN csp_transactions%NOTFOUND;
3424             END LOOP;
3425           CLOSE csp_transactions;
3426                 IF l_source_type_id IS NULL THEN
3427                     raise NO_DATA_FOUND ;
3428                 END IF;
3429                 begin
3430                     select LOT INTO l_rsv_rec.lot_number
3431                     from MTL_ONHAND_LOT_V
3432                     where INVENTORY_ITEM_ID=p_reservation_parts.item_id
3433                     and SUBINVENTORY_CODE = p_reservation_parts.sub_inventory_code
3434                     and organization_id=p_reservation_parts.organization_id
3435                     and rownum=1;
3436                     EXCEPTION
3437                     WHEN NO_DATA_FOUND THEN
3438                       l_rsv_rec.lot_number:=null;
3439                 end;
3440                 l_rsv_rec.reservation_id   := NULL;
3441                 l_rsv_rec.requirement_date := p_reservation_parts.need_by_date  ;
3442                 l_rsv_rec.organization_id  := p_reservation_parts.organization_id  ;
3443                 l_rsv_rec.inventory_item_id := p_reservation_parts.item_id   ;
3444                 l_rsv_rec.demand_source_type_id  := l_source_type_id ;
3445                 l_rsv_rec.demand_source_name     := l_source_name ;
3446                 l_rsv_rec.demand_source_header_id   := NULL;
3447                 l_rsv_rec.demand_source_line_id     := p_reservation_parts.line_id;
3448                 l_rsv_rec.demand_source_delivery    := NULL;
3449                 l_rsv_rec.primary_uom_code          := p_reservation_parts.item_UOM_code ;
3450                 l_rsv_rec.primary_uom_id            := NULL;
3451                 l_rsv_rec.reservation_uom_code      := p_reservation_parts.item_UOM_code;
3452                 l_rsv_rec.reservation_uom_id        := NULL;
3453                 l_rsv_rec.reservation_quantity      := p_reservation_parts.quantity_needed;
3454                 l_rsv_rec.primary_reservation_quantity  := NUll;
3455                 l_rsv_rec.detailed_quantity         := null;
3456                 l_rsv_rec.autodetail_group_id       := NULL;
3457                 l_rsv_rec.external_source_code       := NULL;
3458                 l_rsv_rec.external_source_line_id     := NULL;
3459                 l_rsv_rec.supply_source_type_id        := 13; --inv_reservation_global.g_source_type_internal_req;
3460                 l_rsv_rec.supply_source_header_id      := NULL;
3461                 l_rsv_rec.supply_source_line_id        := NULL;
3462                 l_rsv_rec.supply_source_name           := NULL;
3463                 l_rsv_rec.supply_source_line_detail    := NULL;
3464                 l_rsv_rec.revision                     := p_reservation_parts.revision ;
3465                 l_rsv_rec.subinventory_code            := p_reservation_parts.sub_inventory_code ;
3466                 l_rsv_rec.subinventory_id              := NULL ;
3467                 l_rsv_rec.locator_id                   := NULL;
3468                 --l_rsv_rec.lot_number                   := NULL;
3469                 l_rsv_rec.lot_number_id                := NULL;
3470                 l_rsv_rec.pick_slip_number            := NULL;
3471                 l_rsv_rec.lpn_id                      := NULL;
3472                 l_rsv_rec.attribute_category       := NULL;
3473                 l_rsv_rec.attribute1               := NULL;
3474                 l_rsv_rec.attribute2               := NULL;
3475                 l_rsv_rec.attribute3               := NULL;
3476                 l_rsv_rec.attribute4               := NULL;
3477                 l_rsv_rec.attribute5               := NULL;
3478                 l_rsv_rec.attribute6               := NULL;
3479                 l_rsv_rec.attribute7               := NULL;
3480                 l_rsv_rec.attribute8               := NULL;
3481                 l_rsv_rec.attribute9               := NULL;
3482                 l_rsv_rec.attribute10              := NULL;
3483                 l_rsv_rec.attribute11              := NULL;
3484                 l_rsv_rec.attribute12              := NULL;
3485                 l_rsv_rec.attribute13              := NULL;
3486                 l_rsv_rec.attribute14              := NULL;
3487                 l_rsv_rec.attribute15              := NULL;
3488                 l_rsv_rec.ship_ready_flag          := NULL;
3489                 /*INV_RESERVATION_PUB.create_reservation(l_api_version_number
3490                                                  , l_init_msg_lst
3491                                                  , x_return_status
3492                                                  , x_msg_count
3493                                                  , x_msg_data
3494                                                  , l_rsv_rec
3495                                                  , l_serial_number
3496                                                  , x_serial_number
3497                                                  , l_partial_reservation_flag
3498                                                  , l_force_reservation_flag
3499                                                  , l_validation_flag
3500                                                  , x_quantity_reserved
3501                                                  , x_reservation_id);*/
3502                INV_RESERVATION_PUB.create_reservation(p_api_version_number => l_api_version_number
3503                                                  , p_init_msg_lst => l_init_msg_lst
3504                                                  , x_return_status => x_return_status
3505                                                  , x_msg_count => x_msg_count
3506                                                  , x_msg_data => x_msg_data
3507                                                  , p_rsv_rec => l_rsv_rec
3508                                                  , p_serial_number => l_serial_number
3509                                                  , x_serial_number => x_serial_number
3510                                                  , p_partial_reservation_flag => l_partial_reservation_flag
3511                                                  , p_force_reservation_flag => l_force_reservation_flag
3512                                                  , p_validation_flag => l_validation_flag
3513                                                  , x_quantity_reserved => x_quantity_reserved
3514                                                  , x_reservation_id => x_reservation_id
3515                                                  );
3516            IF x_return_status <> FND_API.G_RET_STS_SUCCESS and x_reservation_id <= 0  THEN
3517                 return 0;
3518            ELSE
3519                 return x_reservation_id;
3520            END IF;
3521            EXCEPTION
3522         WHEN NO_DATA_FOUND THEN
3523             FND_MESSAGE.SET_NAME('CSP', 'CSP_SCH_TRANSACTION');
3524             FND_MSG_PUB.ADD;
3525             fnd_msg_pub.count_and_get
3526               ( p_count => x_msg_count
3527               , p_data  => x_msg_data);
3528             x_return_status := FND_API.G_RET_STS_ERROR;
3529             return 0;
3530         WHEN OTHERS THEN
3531             x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
3532             return 0;
3533      END CREATE_RESERVATION;
3534      PROCEDURE TRANSFER_RESERVATION(p_reservation_id  IN  NUMBER
3535                                    ,p_order_header_id IN  NUMBER
3536                                    ,p_order_line_id   IN  NUMBER
3537                                    ,x_return_status   OUT NOCOPY VARCHAR2
3538                                    ,x_reservation_id   OUT NOCOPY NUMBER
3539                                    ,x_msg_data        OUT NOCOPY VARCHAR2
3540                                    ,x_msg_count       OUT NOCOPY NUMBER) IS
3541 
3542           I NUMBER;
3543           l_api_version_number number :=1;
3544           l_init_msg_lst  varchar2(1) := fnd_api.g_true;
3545          -- x_msg_data  varchar2(128);
3546           l_old_rsv_rec  inv_reservation_global.mtl_reservation_rec_type;
3547           l_new_rsv_rec  inv_reservation_global.mtl_reservation_rec_type;
3548           l_old_serial_number inv_reservation_global.serial_number_tbl_type;
3549           l_new_serial_number inv_reservation_global.serial_number_tbl_type;
3550           l_partial_reservation_flag varchar2(1):= fnd_api.g_false;
3551           l_is_transfer_supply varchar2(1) := fnd_api.g_true;
3552           l_validation_flag    varchar2(1) := fnd_api.g_true;
3553           l_source_type_id     NUMBER;
3554           l_source_name        varchar2(30);
3555           x_quantity_reserved  number;
3556           l_msg varchar2(2000);
3557           --x_return_status varchar(128);
3558      BEGIN
3559           x_return_status  := FND_API.G_RET_STS_SUCCESS;
3560 
3561                 l_old_rsv_rec.reservation_id   := p_reservation_id;
3562 
3563                 l_new_rsv_rec.reservation_id   := NULL;
3564                 l_new_rsv_rec.demand_source_type_id  := 8 ;
3565                 l_new_rsv_rec.demand_source_name     := 'g_source_type_internal_ord' ;
3566                 l_new_rsv_rec.demand_source_header_id   := p_order_header_id;
3567                 l_new_rsv_rec.demand_source_line_id     := p_order_line_id ;
3568                 INV_RESERVATION_PUB. transfer_reservation(
3569                                         p_api_version_number  =>  l_api_version_number
3570                                       , p_init_msg_lst        =>  l_init_msg_lst
3571                                       , x_return_status       =>  x_return_status
3572                                       , x_msg_count           =>  x_msg_count
3573                                       , x_msg_data            =>  x_msg_data
3574                                       , p_is_transfer_supply  =>  l_is_transfer_supply
3575                                       , p_original_rsv_rec    => l_old_rsv_rec
3576                                       , p_to_rsv_rec          => l_new_rsv_rec
3577                                       , p_original_serial_number => l_old_serial_number
3578                                       , p_to_serial_number       => l_new_serial_number
3579                                       , p_validation_flag        => l_validation_flag
3580                                       , x_to_reservation_id      => x_reservation_id
3581                                       );
3582            IF x_return_status <> FND_API.G_RET_STS_SUCCESS THEN
3583                  X_return_status := FND_API.G_RET_STS_ERROR;
3584                 return;
3585            END IF;
3586            EXCEPTION
3587         WHEN NO_DATA_FOUND THEN
3588             X_return_status := FND_API.G_RET_STS_ERROR;
3589             return;
3590         WHEN OTHERS THEN
3591             x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
3592             return;
3593      END TRANSFER_RESERVATION;
3594      PROCEDURE GET_SHIPPING_METHODE(p_from_org_id     IN   NUMBER,
3595                                    p_to_org_id        IN   NUMBER,
3596                                    p_need_by_date     IN   DATE,
3597                                    p_timezone_id     IN   NUMBER,
3598                                    x_shipping_methode OUT NOCOPY  VARCHAR2,
3599                                    x_intransit_time   OUT NOCOPY  NUMBER,
3600                                    x_return_status    OUT NOCOPY  VARCHAR2
3601                                    ,x_msg_data        OUT NOCOPY  VARCHAR2
3602                                    ,x_msg_count       OUT NOCOPY  NUMBER) IS
3603      CURSOR C3(from_org varchar2,to_org varchar2) IS
3604         SELECT NVL(ISM.COST_PER_UNIT_LOAD_WEIGHT,0),
3605                CDT.RELATION_SHIP_ID,CDT.CUTOFF_TIME,CDT.TIMEZONE_ID,ISM.SHIP_METHOD
3606         FROM   MTL_INTERORG_SHIP_METHODS ISM,CSP_CARRIER_DELIVERY_TIMES CDT
3607         WHERE  ISM.FROM_ORGANIZATION_ID = from_org
3608         AND    ISM.TO_ORGANIZATION_ID =  to_org
3609         AND    CDT.ORGANIZATION_ID = from_org
3610         AND    CDT.SHIPPING_METHOD = ISM.SHIP_METHOD;
3611         I NUMBER :=0;
3612         l_relation_ship_id NUMBER;
3613         l_cost             NUMBER;
3614         x_delivery_date    DATE;
3615         x_shipping_option  BOOLEAN := true;
3616         l_cutoff_time      DATE;
3617         l_timezone_id      NUMBER;
3618         l_shipto_timezone_id NUMBER;
3619         l_server_time_zone_id NUMBER;
3620         l_cutoff_hours       NUMBER;
3621         l_sys_hours          NUMBER;
3622         l_server_delivery_date DATE;
3623         l_server_cutoff_time DATE;
3624         l_return_status Varchar2(3);
3625         l_msg_count NUMBER;
3626         l_msg_data  varchar2(1000);
3627         l_min_leadtime NUMBER := 100000000;
3628         l_shipping_methode varchar2(30);
3629         l_api_name varchar2(60) := 'CSP_SCH_INT_PVT.GET_SHIPPING_METHODE' ;
3630      BEGIN
3631             x_return_status := FND_API.G_RET_STS_SUCCESS ;
3632             l_server_time_zone_id   := FND_PROFILE.VALUE(NAME => 'SERVER_TIMEZONE_ID');
3633             OPEN C3(p_from_org_id,p_to_org_id);
3634             LOOP
3635                 FETCH C3 INTO l_cost,l_relation_ship_id ,l_cutoff_time,l_timezone_id,l_shipping_methode ;
3636                 EXIT WHEN C3%NOTFOUND;
3637                 CSP_SCH_INT_PVT.GET_DELIVERY_DATE(l_relation_ship_id, x_delivery_date,x_shipping_option,x_return_status,x_msg_data,x_msg_count);
3638                     IF p_timezone_id <> l_server_time_zone_id THEN
3639                             HZ_TIMEZONE_PUB.Get_Time(   p_api_version  => 1.0,
3640                                     p_init_msg_list  => FND_API.G_FALSE,
3641                                     p_source_tz_id   => p_timezone_id,
3642                                     p_dest_tz_id     => l_server_time_zone_id,
3643                                     p_source_day_time  => x_delivery_date,
3644                                     x_dest_day_time    => l_server_delivery_date,
3645                                     x_return_status    => l_return_status ,
3646                                     x_msg_count        => l_msg_count ,
3647                                     x_msg_data         => l_msg_data);
3648                         ELSE
3649                             l_server_delivery_date := x_delivery_date;
3650                         END IF;
3651                         IF l_cutoff_time is not null then
3652                             HZ_TIMEZONE_PUB.Get_Time(   p_api_version  => 1.0,
3653                                     p_init_msg_list  => FND_API.G_FALSE,
3654                                     p_source_tz_id   => l_timezone_id,
3655                                     p_dest_tz_id     => l_server_time_zone_id,
3656                                     p_source_day_time  => l_cutoff_time,
3657                                     x_dest_day_time    => l_server_cutoff_time,
3658                                     x_return_status    => l_return_status ,
3659                                     x_msg_count        => l_msg_count ,
3660                                     x_msg_data         => l_msg_data);
3661                                     l_cutoff_hours := to_number(to_char(l_server_cutoff_time,'HH24')) + (to_number(to_char(l_server_cutoff_time,'MI')) * 1/60);
3662                                     l_sys_hours    := to_number(to_char(sysdate,'HH24')) + (to_number(to_char(sysdate,'MI')) * 1/60);
3663                             IF l_cutoff_hours < l_sys_hours THEN
3664                                 l_server_delivery_date := l_server_delivery_date + 1;
3665                             END IF;
3666                         END IF;
3667                     IF p_need_by_date IS NOT NULL AND  l_server_delivery_date > p_need_by_date THEN
3668                             x_shipping_option := FALSE;
3669                     END IF;
3670                     IF x_shipping_option THEN
3671                         IF l_min_leadtime > ( (l_server_delivery_date -  sysdate) * 24 )THEN
3672                             l_min_leadtime := ( (l_server_delivery_date -  sysdate) * 24 );
3673                             x_shipping_methode := l_shipping_methode ;
3674                             x_intransit_time  :=  l_min_leadtime / 24 ;
3675                         END IF;
3676                     END IF;
3677               END LOOP;
3678             EXCEPTION
3679             WHEN OTHERS THEN
3680              FND_MESSAGE.SET_NAME('CSP', 'CSP_UNEXPECTED_EXEC_ERRORS');
3681             FND_MESSAGE.SET_TOKEN('ROUTINE', l_api_name, FALSE);
3682             FND_MESSAGE.SET_TOKEN('SQLERRM', sqlerrm, FALSE);
3683             FND_MSG_PUB.ADD;
3684             fnd_msg_pub.count_and_get
3685               ( p_count => x_msg_count
3686               , p_data  => x_msg_data);
3687             x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
3688             return;
3689      END GET_SHIPPING_METHODE;
3690      PROCEDURE CHECK_PARTS_AVAILABILITY(p_resource         IN  CSP_SCH_INT_PVT.csp_sch_resources_rec_typ
3691                                        ,p_organization_id  IN  NUMBER
3692                                        ,p_subinv_code      IN  VARCHAR2
3693                                        ,p_need_by_date     IN  DATE
3694                                        ,p_parts_list       IN  CSP_SCH_INT_PVT.CSP_PARTS_TBL_TYP1
3695                                        ,p_timezone_id      IN  NUMBER
3696                                        ,x_availability     OUT NOCOPY CSP_SCH_INT_PVT.AVAILABLE_PARTS_TBL_TYP1
3697                                        ,x_return_status    OUT NOCOPY VARCHAR2
3698                                        ,X_MSG_DATA         OUT NOCOPY VARCHAR2
3699                                        ,x_msg_count        OUT NOCOPY NUMBER
3700                                        ,p_called_from     IN  varchar2
3701                                        ,p_location_id     IN NUMBER DEFAULT NULL
3702                                         ) IS
3703         TYPE alternate_item_rec_type IS RECORD(item NUMBER
3704                                                 ,revision varchar2(3)
3705                                                ,item_uom varchar2(10)
3706                                                ,item_quantity NUMBER
3707                                               ,alternate_item NUMBER
3708                                               ,alternate_item_uom varchar2(10)
3709                                               ,alternate_item_quantity NUMBER
3710                                               ,relation_type NUMBER);
3711 
3712         TYPE alternate_items_table_type IS TABLE OF alternate_item_rec_type;
3713 
3714         CURSOR C1(c_resource_type varchar2, c_resource_id NUMBER)
3715         IS
3716         /*SELECT TIMEZONE_ID
3717         FROM   CSP_RS_SHIP_TO_ADDRESSES_V
3718         WHERE  PRIMARY_FLAG ='Y'
3719         AND resource_id  = c_resource_id
3720         AND resource_type = c_resource_type;*/
3721          SELECT  hzl.time_zone TIMEZONE_ID
3722  	from csp_rs_cust_relations rcr, hz_cust_acct_sites cas, hz_cust_site_uses csu,
3723   hz_party_sites ps, hz_locations hzl
3724   where rcr.customer_id = cas.cust_account_id
3725   and cas.cust_acct_site_id = csu.cust_acct_site_id (+)
3726   and csu.site_use_code = 'SHIP_TO'
3727    and cas.party_site_id = ps.party_site_id
3728   and ps.location_id = hzl.location_id
3729   and csu.primary_flag = 'Y'
3730   and  rcr.resource_type =c_resource_type
3731   and rcr.resource_id = c_resource_id;
3732 
3733 
3734         CURSOR check_buy_from(c_item_id number,c_assignment_id number, c_organization_id number)
3735         IS
3736        /* SELECT vendor_id, vendor_site_id
3737         FROM  mrp_sources_v
3738         where assignment_set_id = c_assignment_id
3739         and   inventory_item_id = c_item_id
3740         and   organization_id  = c_organization_id
3741         and   source_type = 3;*/
3742        Select vendor_id, vendor_site_id
3743        from MRP_ITEM_SOURCING_LEVELS_V  misl
3744        where misl.organization_id = c_organization_id
3745        and misl.assignment_set_id =c_assignment_id
3746        and inventory_item_id = c_item_id
3747        and SOURCE_TYPE       = 3
3748        and sourcing_level = (select min(sourcing_level) from MRP_ITEM_SOURCING_LEVELS_V
3749                              where organization_id = c_organization_id
3750                              and assignment_set_id = c_assignment_id
3751                              and inventory_item_id = c_item_id
3752                              and sourcing_level not in (2,9));
3753 
3754         CURSOR primary_uom_code(item_id NUMBER,org_id NUMBER) IS
3755         SELECT PRIMARY_UOM_CODE
3756         FROM   MTL_SYSTEM_ITEMS_B
3757         WHERE  INVENTORY_ITEM_ID = item_id
3758         AND    organization_id  = org_id;
3759 
3760         CURSOR substitutes(item_id NUMBER,org_id NUMBER) IS
3761        /* SELECT mri.RELATED_ITEM_ID
3762         FROM   MTL_RELATED_ITEMS_VIEW mri, mtl_parameters mp
3763         WHERE  mp.organization_id = org_id
3764         AND    mri.INVENTORY_ITEM_ID = item_id
3765         AND    mri.RELATIONSHIP_TYPE_ID = 2
3766         AND    mri.ORGANIZATION_ID  = MP.MASTER_ORGANIZATION_ID;*/
3767         SELECT mri.RELATED_ITEM_ID
3768         FROM   MTL_RELATED_ITEMS mri, mtl_parameters mp
3769         WHERE  mp.organization_id = org_id
3770         AND    mri.INVENTORY_ITEM_ID = item_id
3771         AND    mri.RELATIONSHIP_TYPE_ID = 2
3772         AND    mri.ORGANIZATION_ID  = MP.MASTER_ORGANIZATION_ID;
3773 
3774 
3775 
3776         l_interval                CSP_SCH_INT_PVT.csp_sch_interval_rec_typ;
3777         l_resources               CSP_SCH_INT_PVT.csp_sch_resource_tbl_typ;
3778         l_resource_org_subinv     CSP_SCH_INT_PVT.CSP_RESOURCE_ORG_tbl_TYP;
3779         l_unavailable_list        CSP_SCH_INT_PVT.CSP_UNAVAILABILITY_TBL_TYPE ;
3780         l_available_list          CSP_SCH_INT_PVT.CSP_AVAILABILITY_TBL_TYPE ;
3781        /* l_subinv_unavailable_list        CSP_SCH_INT_PVT.CSP_UNAVAILABILITY_TBL_TYPE ;
3782         l_subinv_available_list          CSP_SCH_INT_PVT.CSP_AVAILABILITY_TBL_TYPE ;*/
3783         l_eligible_resources_list CSP_SCH_INT_PVT.CSP_AVAILABILITY_TBL_TYPE ;
3784         l_final_unavailable_list  CSP_SCH_INT_PVT.CSP_UNAVAILABILITY_TBL_TYPE ;
3785         l_parts_list              CSP_SCH_INT_PVT.CSP_PARTS_TBL_TYPE;
3786         l_options                 CSP_SCH_INT_PVT.CSP_SHIP_PARAMETERS_TBL_TYPE;
3787         l_ship_count              CSP_SCH_INT_PVT.CSP_SHIP_METHOD_COUNT_TBL_TYP;
3788         l_res_ship_parameters     CSP_SCH_INT_PVT.CSP_ORGS_SHIP_PARAM_TBL_TYPE;
3789         l_temp_options            CSP_SCH_INT_PVT.CSP_SHIP_PARAMETERS_TBL_TYPE ;
3790         l_final_option            CSP_SCH_INT_PVT.CSP_SHIP_PARAMETERS_TBL_TYPE ;
3791         l_org_ship_methode        org_ship_methodes_tbl_type ;
3792         l_supersede_items  CSP_SUPERSESSIONS_PVT.NUMBER_ARR;
3793         min_cost                  NUMBER ;
3794         rec_pointer              NUMBER;
3795         l_intransit_time          NUMBER;
3796         l_timezone_id             NUMBER;
3797         l_return_status           VARCHAR2(128);
3798         l_shipping_methode        VARCHAR2(30);
3799         record_present            BOOLEAN;
3800         l_temp_org_id             NUMBER;
3801         loop_count                NUMBER := 1;
3802         l_need_by_date            DATE;
3803         previous_position         NUMBER;
3804         str_length                NUMBER;
3805         current_position          NUMBER;
3806         l_api_name                VARCHAR2(60) := 'CSP_SCH_INT_PVT.CHECK_PARTS_AVAILABILITY';
3807         g_arrival_date            DATE;
3808         l_ship_methode_count      NUMBER;
3809         l_assignment_set_id       NUMBER;
3810         l_vendor_id               NUMBER;
3811         l_vendor_site_id          NUMBER;
3812         do_purchase               BOOLEAN;
3813         l_uom_code                varchar2(3);
3814         l_temp_quantity           NUMBER;
3815         l_substitute_item         NUMBER;
3816         l_alternate_items_list    alternate_items_table_type;
3817         l_alternate_parts           CSP_SUPERSESSIONS_PVT.NUMBER_ARR;
3818         l_final_available_list    CSP_SCH_INT_PVT.CSP_AVAILABILITY_TBL_TYPE ;
3819         l_atp_success             BOOLEAN;
3820         check_subinventory        BOOLEAN;
3821 
3822         l_att                     NUMBER;
3823         l_onhand                  NUMBER;
3824         x_final_availability      CSP_SCH_INT_PVT.AVAILABLE_PARTS_TBL_TYP1;
3825         l_temp_subinv_code        varchar2(30);
3826         try_buy_from              BOOLEAN;
3827         l_temp_line_id            NUMBER;
3828         quantity_fullfilled       BOOLEAN := FALSE ;
3829         l_required_quantity       NUMBER;
3830         l_no_of_options           NUMBER;
3831         l_dest_org_id             NUMBER;
3832         l_atleast_one_rec_per_line boolean;
3833         l_temp_avail_list          CSP_SCH_INT_PVT.CSP_AVAILABILITY_TBL_TYPE ;
3834         min_arrival_date         DATE;
3835 	   l_no_of_days             number;--heh
3836      l_reservation_parts       CSP_SCH_INT_PVT.RESERVATION_REC_TYP;
3837        l_reservation_id number;
3838        l_res_ids CSP_SUPERSESSIONS_PVT.NUMBER_ARR;
3839 
3840          l_primary_uom_code       varchar2(10);
3841 
3842      BEGIN
3843         g_schedular_call := 'N';
3844          fnd_msg_pub.initialize;
3845         IF p_timezone_id  is not null THEN
3846             g_shipto_timezone_id := p_timezone_id;
3847         END IF;
3848         l_resources               := CSP_SCH_INT_PVT.csp_sch_resource_tbl_typ();
3849         l_resource_org_subinv     := CSP_SCH_INT_PVT.CSP_RESOURCE_ORG_tbl_TYP();
3850         l_unavailable_list        := CSP_SCH_INT_PVT.CSP_UNAVAILABILITY_TBL_TYPE();
3851         l_available_list          := CSP_SCH_INT_PVT.CSP_AVAILABILITY_TBL_TYPE ();
3852         l_eligible_resources_list := CSP_SCH_INT_PVT.CSP_AVAILABILITY_TBL_TYPE() ;
3853         l_final_unavailable_list  := CSP_SCH_INT_PVT.CSP_UNAVAILABILITY_TBL_TYPE();
3854         l_parts_list              := CSP_SCH_INT_PVT.CSP_PARTS_TBL_TYPE();
3855         l_ship_count              := CSP_SCH_INT_PVT.CSP_SHIP_METHOD_COUNT_TBL_TYP();
3856         l_res_ship_parameters     := CSP_SCH_INT_PVT.CSP_ORGS_SHIP_PARAM_TBL_TYPE();
3857         l_final_option            := CSP_SCH_INT_PVT.CSP_SHIP_PARAMETERS_TBL_TYPE() ;
3858         l_org_ship_methode        := org_ship_methodes_tbl_type() ;
3859        /* l_subinv_unavailable_list := CSP_SCH_INT_PVT.CSP_UNAVAILABILITY_TBL_TYPE() ;
3860         l_subinv_available_list   := CSP_SCH_INT_PVT.CSP_AVAILABILITY_TBL_TYPE();*/
3861        -- x_availability            := CSP_SCH_INT_PVT.AVAILABLE_PARTS_TBL_TYP1();
3862         l_interval.latest_time  := p_need_by_date;
3863         x_return_status := FND_API.G_RET_STS_SUCCESS;
3864         l_alternate_items_list :=   alternate_items_table_type();
3865         l_final_available_list :=   CSP_SCH_INT_PVT.CSP_AVAILABILITY_TBL_TYPE() ;
3866         l_temp_avail_list   :=       CSP_SCH_INT_PVT.CSP_AVAILABILITY_TBL_TYPE() ;
3867         l_timezone_id := p_timezone_id ;
3868       IF  p_organization_id IS NOT NULL THEN
3869              l_temp_org_id :=  p_organization_id;
3870              l_timezone_id := p_timezone_id ;
3871              l_temp_subinv_code := p_subinv_code;
3872              l_resources.extend;
3873              l_resources(1).resource_id := p_resource.resource_id;
3874              l_resources(1).resource_type := p_resource.resource_type;
3875 	     IF p_resource.resource_id IS NULL THEN
3876 		l_resources(1).resource_id   := '999999999999999';
3877 		l_resources(1).resource_type := 'DUMMY';
3878 	     END IF;
3879        ELSE
3880         IF p_resource.resource_id IS NOT NULL THEN
3881                 OPEN C1(p_resource.resource_type,p_resource.resource_id);
3882                 LOOP
3883                     FETCH C1 INTO l_timezone_id;
3884                     EXIT WHEN C1%NOTFOUND;
3885                 END LOOP;
3886                 CLOSE C1;
3887             l_resources.extend;
3888             l_resources(1).resource_id := p_resource.resource_id;
3889             l_resources(1).resource_type := p_resource.resource_type;
3890             CSP_SCH_INT_PVT.GET_ORGANIZATION_SUBINV(l_resources, l_resource_org_subinv , l_return_status,x_msg_data,x_msg_count);
3891             l_temp_org_id :=  l_resource_org_subinv(1).organization_id;
3892             l_temp_subinv_code := l_resource_org_subinv(1).sub_inv_code;
3893          ELSE
3894             l_resources.extend;
3895             l_temp_org_id :=  p_organization_id;
3896             l_temp_subinv_code := p_subinv_code;
3897             l_resources(1).resource_type := 'DUMMY' ;
3898             l_resources(1).resource_id :=  '999999999999999' ;
3899             l_temp_subinv_code := p_subinv_code;
3900             l_resource_org_subinv(1).resource_type := 'DUMMY' ;
3901             l_resource_org_subinv(1).resource_id := '999999999999999' ;
3902             l_resource_org_subinv(1).organization_id := p_organization_id;
3903             l_resource_org_subinv(1).sub_inv_code :=    p_subinv_code;
3904          END IF;
3905        END IF;
3906         IF  p_organization_id IS NOT NULL THEN
3907              l_dest_org_id :=  p_organization_id;
3908         ELSE
3909              l_dest_org_id :=  l_temp_org_id;
3910         END IF;
3911        IF p_parts_list.count > 1 THEN
3912             csp_supersessions_pvt.check_for_duplicate_parts(p_parts_list,l_temp_org_id,x_return_status,x_msg_data,x_msg_count);
3913        END IF;
3914         IF x_return_status <> FND_API.G_RET_STS_SUCCESS THEN
3915             RETURN;
3916         END IF;
3917 
3918             FOR I IN 1..p_parts_list.count LOOP
3919                l_unavailable_list.extend;
3920                l_unavailable_list(l_unavailable_list.count).resource_type     := l_resources(1).resource_type;
3921                l_unavailable_list(l_unavailable_list.count).resource_id       := l_resources(1).resource_id;
3922                l_unavailable_list(l_unavailable_list.count).organization_id   := l_dest_org_id;
3923                l_unavailable_list(l_unavailable_list.count).item_id           := p_parts_list(I).item_id;
3924                l_primary_uom_code := p_parts_list(I).item_uom;
3925                OPEN primary_uom_code(p_parts_list(I).item_id ,l_dest_org_id);
3926                 FETCH primary_uom_code INTO l_primary_uom_code;
3927                CLOSE primary_uom_code;
3928                IF l_primary_uom_code <> p_parts_list(I).item_uom THEN
3929                     l_unavailable_list(l_unavailable_list.count).quantity :=
3930                                                 inv_convert.inv_um_convert(item_id       => p_parts_list(I).item_id
3931                                                  , precision     => NULL  -- use default precision
3932                                                  , from_quantity => p_parts_list(I).quantity
3933                                                  , from_unit     => p_parts_list(I).item_uom
3934                                                  , to_unit       => l_primary_uom_code
3935                                                  , from_name     => NULL  -- from uom name
3936                                                  , to_name       => NULL  -- to uom name
3937                                                  );
3938                    l_unavailable_list(l_unavailable_list.count).item_uom          := l_primary_uom_code ;
3939                ELSE
3940                   l_unavailable_list(l_unavailable_list.count).quantity       := p_parts_list(I).quantity;
3941                   l_unavailable_list(l_unavailable_list.count).item_uom          := p_parts_list(I).item_uom;
3942                END IF;
3943                l_unavailable_list(l_unavailable_list.count).ship_set_name     := p_parts_list(I).ship_set_name;
3944                 l_unavailable_list(l_unavailable_list.count).line_id          := p_parts_list(I).line_id;
3945                  l_unavailable_list(l_unavailable_list.count).revision         := p_parts_list(I).revision;
3946           /*  END LOOP;
3947             FOR I IN 1..p_parts_list.count LOOP*/
3948              If p_called_from <> 'MOBILE' THEN
3949                 l_att := 0;
3950                 IF l_temp_subinv_code is not null   THEN
3951                     CHECK_LOCAL_INVENTORY(  p_org_id        => l_temp_org_id
3952                                      ,p_subinv_code   => l_temp_subinv_code
3953                                      ,p_item_id       => p_parts_list(I).item_id
3954                                      ,p_revision      => p_parts_list(I).revision
3955                                      ,x_att           => l_att
3956                                      ,x_onhand        => l_onhand
3957                                      ,x_return_status => x_return_status
3958                                      ,x_msg_data      => x_msg_data
3959                                      ,x_msg_count     => x_return_status);
3960                     IF l_att > 0 THEN
3961                         l_final_available_list.extend;
3962                         l_final_available_list(l_final_available_list.count).resource_id := l_resources(1).resource_id;
3963                         l_final_available_list(l_final_available_list.count).resource_type := l_resources(1).resource_type;
3964                         l_final_available_list(l_final_available_list.count).organization_id   := l_temp_org_id;
3965                         l_final_available_list(l_final_available_list.count).item_id   := p_parts_list(I).item_id ;
3966                         l_final_available_list(l_final_available_list.count).item_uom   := l_unavailable_list(l_unavailable_list.count).item_uom  ;
3967                         l_final_available_list(l_final_available_list.count).revision   := p_parts_list(I).revision ;
3968                         l_final_available_list(l_final_available_list.count).available_quantity  := l_att ;
3969                         l_final_available_list(l_final_available_list.count).source_org := l_temp_org_id;
3970                         l_final_available_list(l_final_available_list.count).sub_inventory := l_temp_subinv_code;
3971                         l_final_available_list(l_final_available_list.count).AVAILABLE_DATE  := SYSDATE;
3972                         l_final_available_list(l_final_available_list.count).line_id  := p_parts_list(I).line_id;
3973                             l_reservation_id := NULL;
3974                             l_reservation_parts.need_by_date       := sysdate;
3975                             l_reservation_parts.organization_id    := l_final_available_list(l_final_available_list.count).source_org ;
3976                             l_reservation_parts.item_id            := l_final_available_list(l_final_available_list.count).item_id;
3977                             l_reservation_parts.item_uom_code      := l_final_available_list(l_final_available_list.count).item_uom ;
3978                             l_reservation_parts.quantity_needed    := least(l_final_available_list(l_final_available_list.count).available_quantity,l_unavailable_list(l_unavailable_list.count).quantity);
3979                             l_reservation_parts.sub_inventory_code := l_final_available_list(l_final_available_list.count).sub_inventory;
3980                             l_reservation_parts.line_id            := l_final_available_list(l_final_available_list.count).line_id ;
3981                             l_reservation_parts.revision           := l_final_available_list(l_final_available_list.count).revision;
3982                             l_reservation_id := CSP_SCH_INT_PVT.CREATE_RESERVATION(l_reservation_parts,x_return_status,x_msg_data);
3983 
3984                          IF l_reservation_id <= 0 THEN
3985                             x_return_status := FND_API.G_RET_STS_ERROR;
3986                             FND_MESSAGE.SET_NAME('CSP', 'CSP_SCH_COULD_NOT_RESERVE');
3987                             FND_MSG_PUB.ADD;
3988                             fnd_msg_pub.count_and_get
3989                                 ( p_count => x_msg_count
3990                                 , p_data  => x_msg_data);
3991                          else
3992                            l_res_ids(l_res_ids.count+1) := l_reservation_id ;
3993                          END IF;
3994                     END IF;
3995                     END IF;
3996                 END IF;
3997          END LOOP;
3998           FOR I IN 1..p_parts_list.count LOOP
3999            IF fnd_profile.value(name => 'CSP_INCL_ALTERNATES')= 'ALWAYS' or
4000                       fnd_profile.value(name => 'CSP_INCL_ALTERNATES')= 'PRONLY'  THEN
4001                 CSP_SUPERSESSIONS_PVT.get_supersede_bilateral_items(p_inventory_item_id => p_parts_list(I).item_id
4002                                                     ,p_organization_id => l_temp_org_id
4003                                                     ,x_supersede_items => l_supersede_items);
4004                     FOR J IN 1..l_supersede_items.count LOOP
4005                         l_uom_code := null;
4006                         OPEN primary_uom_code(l_supersede_items(J),p_organization_id);
4007                         LOOP
4008                         FETCH primary_uom_code INTO l_uom_code;
4009                         EXIT WHEN primary_uom_code% NOTFOUND;
4010                         END LOOP;
4011                         CLOSE primary_uom_code;
4012                         l_temp_quantity :=
4013                         inv_convert.inv_um_convert(item_id       => l_supersede_items(J)
4014                                                  , precision     => NULL  -- use default precision
4015                                                  , from_quantity => p_parts_list(I).quantity
4016                                                  , from_unit     => p_parts_list(I).item_uom
4017                                                  , to_unit       => l_uom_code
4018                                                  , from_name     => NULL  -- from uom name
4019                                                  , to_name       => NULL  -- to uom name
4020                                                  );
4021                         l_alternate_items_list.extend;
4022                         l_alternate_items_list(l_alternate_items_list.count).item                     := p_parts_list(I).item_id;
4023                         l_alternate_items_list(l_alternate_items_list.count).item_quantity            := p_parts_list(I).quantity;
4024                         l_alternate_items_list(l_alternate_items_list.count).item_uom                 := p_parts_list(I).item_uom;
4025                         l_alternate_items_list(l_alternate_items_list.count).alternate_item           := l_supersede_items(J);
4026                         l_alternate_items_list(l_alternate_items_list.count).alternate_item_quantity  := l_temp_quantity;
4027                         l_alternate_items_list(l_alternate_items_list.count).alternate_item_uom       := l_uom_code;
4028                         l_alternate_items_list(l_alternate_items_list.count).relation_type            := 8;
4029                         l_temp_quantity := 0;
4030                         l_uom_code := NULL;
4031                     END LOOP;
4032                     OPEN substitutes(p_parts_list(I).item_id, l_temp_org_id);
4033                     LOOP
4034                     FETCH substitutes INTO l_substitute_item;
4035                     EXIT WHEN substitutes % NOTFOUND;
4036                          l_uom_code := null;
4037                         OPEN primary_uom_code(l_substitute_item,l_temp_org_id);
4038                         LOOP
4039                         FETCH primary_uom_code INTO l_uom_code;
4040                         EXIT WHEN primary_uom_code% NOTFOUND;
4041                         END LOOP;
4042                         CLOSE primary_uom_code;
4043                         l_temp_quantity :=
4044                         inv_convert.inv_um_convert(item_id       => l_substitute_item
4045                                                  , precision     => NULL  -- use default precision
4046                                                  , from_quantity => p_parts_list(I).quantity
4047                                                  , from_unit     => p_parts_list(I).item_uom
4048                                                  , to_unit       => l_uom_code
4049                                                  , from_name     => NULL  -- from uom name
4050                                                  , to_name       => NULL  -- to uom name
4051                                                  );
4052                         l_alternate_items_list.extend;
4053                         l_alternate_items_list(l_alternate_items_list.count).item                     := p_parts_list(I).item_id;
4054                         l_alternate_items_list(l_alternate_items_list.count).item_quantity            := p_parts_list(I).quantity;
4055                         l_alternate_items_list(l_alternate_items_list.count).item_uom                 := p_parts_list(I).item_uom;
4056                         l_alternate_items_list(l_alternate_items_list.count).alternate_item           := l_substitute_item;
4057                         l_alternate_items_list(l_alternate_items_list.count).alternate_item_quantity  := l_temp_quantity;
4058                         l_alternate_items_list(l_alternate_items_list.count).alternate_item_uom       := l_uom_code;
4059                         l_alternate_items_list(l_alternate_items_list.count).relation_type            := 2;
4060                         l_temp_quantity := 0;
4061                         l_uom_code := NULL;
4062                     END LOOP;
4063                     CLOSE substitutes;
4064                END IF;
4065 
4066               FOR J IN 1..l_alternate_items_list.count LOOP
4067 
4068                 --l_parts_list.extend;
4069                     l_unavailable_list.extend;
4070                     l_unavailable_list(l_unavailable_list.count).resource_type     := l_resources(1).resource_type;
4071                     l_unavailable_list(l_unavailable_list.count).resource_id       := l_resources(1).resource_id;
4072                     l_unavailable_list(l_unavailable_list.count).organization_id   := l_dest_org_id;
4073                     l_unavailable_list(l_unavailable_list.count).item_id           := l_alternate_items_list(J).alternate_item;
4074                     l_unavailable_list(l_unavailable_list.count).item_uom          := l_alternate_items_list(J).alternate_item_uom;
4075                     l_unavailable_list(l_unavailable_list.count).quantity          := l_alternate_items_list(J).alternate_item_quantity;
4076                     l_unavailable_list(l_unavailable_list.count).ship_set_name     := p_parts_list(I).ship_set_name;
4077                     l_unavailable_list(l_unavailable_list.count).item_type         := l_alternate_items_list(J).relation_type ;
4078                     l_unavailable_list(l_unavailable_list.count).line_id          := p_parts_list(I).line_id;
4079                     l_unavailable_list(l_unavailable_list.count).revision          := p_parts_list(I).revision;
4080                     IF l_temp_subinv_code is not null  THEN
4081                         CHECK_LOCAL_INVENTORY(  p_org_id        => l_temp_org_id
4082                                      ,p_subinv_code   => l_temp_subinv_code
4083                                      ,p_item_id       => l_alternate_items_list(J).alternate_item
4084                                      ,p_revision      => NULL
4085                                      ,x_att           => l_att
4086                                      ,x_onhand        => l_onhand
4087                                      ,x_return_status => x_return_status
4088                                      ,x_msg_data      => x_msg_data
4089                                      ,x_msg_count     => x_return_status);
4090                           IF l_att > 0 THEN
4091                             l_final_available_list.extend;
4092                             l_final_available_list(l_final_available_list.count).resource_id := l_resources(1).resource_id;
4093                             l_final_available_list(l_final_available_list.count).resource_type := l_resources(1).resource_type;
4094                             l_final_available_list(l_final_available_list.count).organization_id   := l_temp_org_id;
4095                             l_final_available_list(l_final_available_list.count).item_id   := l_alternate_items_list(J).alternate_item ;
4096                             l_final_available_list(l_final_available_list.count).item_uom   := l_alternate_items_list(J).alternate_item_uom ;
4097                             l_final_available_list(l_final_available_list.count).revision   := NULL;
4098                             l_final_available_list(l_final_available_list.count).available_quantity  := l_att ;
4099                             l_final_available_list(l_final_available_list.count).source_org := l_temp_org_id;
4100                             l_final_available_list(l_final_available_list.count).sub_inventory := l_temp_subinv_code;
4101                             l_final_available_list(l_final_available_list.count).AVAILABLE_DATE  := SYSDATE;
4102                             l_final_available_list(l_final_available_list.count).line_id  := p_parts_list(I).line_id;
4103                             l_final_available_list(l_final_available_list.count).item_type   := l_alternate_items_list(J).relation_type ;
4104                             l_reservation_id := NULL;
4105                             l_reservation_parts.need_by_date       := sysdate;
4106                             l_reservation_parts.organization_id    := l_final_available_list(l_final_available_list.count).source_org ;
4107                             l_reservation_parts.item_id            := l_final_available_list(l_final_available_list.count).item_id;
4108                             l_reservation_parts.item_uom_code      := l_final_available_list(l_final_available_list.count).item_uom ;
4109                             l_reservation_parts.quantity_needed    := least(l_final_available_list(l_final_available_list.count).available_quantity,l_unavailable_list(l_unavailable_list.count).quantity)  ;
4110                             l_reservation_parts.sub_inventory_code := l_final_available_list(l_final_available_list.count).sub_inventory;
4111                             l_reservation_parts.line_id            := l_final_available_list(l_final_available_list.count).line_id ;
4112                             l_reservation_parts.revision           := l_final_available_list(l_final_available_list.count).revision;
4113                             l_reservation_id := CSP_SCH_INT_PVT.CREATE_RESERVATION(l_reservation_parts,x_return_status,x_msg_data);
4114 
4115                          IF l_reservation_id <= 0 THEN
4116                             x_return_status := FND_API.G_RET_STS_ERROR;
4117                             FND_MESSAGE.SET_NAME('CSP', 'CSP_SCH_COULD_NOT_RESERVE');
4118                             FND_MSG_PUB.ADD;
4119                             fnd_msg_pub.count_and_get
4120                                 ( p_count => x_msg_count
4121                                 , p_data  => x_msg_data);
4122                          else
4123                            l_res_ids(l_res_ids.count+1) := l_reservation_id ;
4124                          END IF;
4125                         END IF;
4126                     END IF;
4127                  l_uom_code      := NULL;
4128                  l_temp_quantity := NULL;
4129                  l_att := 0;
4130              END LOOP;
4131              IF l_alternate_items_list.count > 0 THEN
4132                 l_alternate_items_list.trim;
4133                 l_alternate_items_list :=   alternate_items_table_type();
4134              END IF;
4135           END LOOP;
4136           for i in 1..l_res_ids.count loop
4137             CSP_SCH_INT_PVT.DELETE_RESERVATION(l_res_ids(i),x_return_status,x_msg_data);
4138           end loop;
4139      IF fnd_profile.value(name => 'CSP_CHECK_ATP')= 'ALWAYS' or
4140                       fnd_profile.value(name => 'CSP_CHECK_ATP')= 'PRONLY'  THEN
4141         IF l_unavailable_list.count >=1 THEN
4142             CSP_SCH_INT_PVT.DO_ATP_CHECK(l_unavailable_list,l_interval,l_available_list,l_final_unavailable_list,l_return_status,x_msg_data,x_msg_count);
4143         END IF;
4144 
4145       IF l_available_list.count > 0 THEN
4146        FOR K IN 1..p_parts_list.count LOOP
4147              l_atleast_one_rec_per_line := FALSE;
4148          FOR J IN 1..l_available_list.count LOOP
4149            IF l_available_list(J).line_id = p_parts_list(K).line_id THEN
4150              l_options                := CSP_SCH_INT_PVT.CSP_SHIP_PARAMETERS_TBL_TYPE();
4151             l_temp_options          := CSP_SCH_INT_PVT.CSP_SHIP_PARAMETERS_TBL_TYPE ();
4152             l_temp_avail_list.extend;
4153             l_temp_avail_list(1) := l_available_list(J);
4154             l_temp_avail_list(1).destination_location_id := p_location_id;
4155             CSP_SCH_INT_PVT.OPTIMIZE_OPTIONS(l_temp_avail_list,l_options,l_ship_count,l_res_ship_parameters,x_return_status,x_msg_data,x_msg_count);
4156 
4157 
4158             min_cost := null; l_temp_avail_list.trim;
4159             min_arrival_date := null;
4160             rec_pointer := null;
4161             FOR I IN 1..l_options.count LOOP
4162 	      -- phegde : uncommenting the if condition as a fix for Ikon bug 3925273
4163               IF ROUND(((l_options(I).arrival_date - sysdate) * 24),2) <=  ROUND(((p_need_by_date - sysdate) * 24),2)
4164               OR p_need_by_date IS NULL THEN
4165                 l_temp_options.extend;
4166                 l_temp_options(l_temp_options.count).resource_id       :=  l_options(I).resource_id;
4167                 l_temp_options(l_temp_options.count).resource_type     :=  l_options(I).resource_type;
4168                 l_temp_options(l_temp_options.count).lead_time         :=  l_options(I).lead_time   ;
4169                 l_temp_options(l_temp_options.count).transfer_cost     :=  l_options(I).transfer_cost;
4170                 l_temp_options(l_temp_options.count).shipping_methodes :=  l_options(I).shipping_methodes;
4171                 l_temp_options(l_temp_options.count).arrival_date      :=  l_options(I).arrival_date ;
4172                 l_atleast_one_rec_per_line := TRUE;
4173                 IF p_need_by_date is not null then
4174                  IF min_cost is null then
4175                     min_cost :=  l_temp_options(l_temp_options.count).transfer_cost;
4176                     rec_pointer := l_temp_options.count;
4177                  ELSE
4178                     IF min_cost > l_temp_options(l_temp_options.count).transfer_cost THEN
4179                        min_cost := l_temp_options(l_temp_options.count).transfer_cost;
4180                        rec_pointer := l_temp_options.count;
4181                     END IF;
4182                  END IF;
4183                 ELSE
4184                    if  min_arrival_date is null then
4185                         min_arrival_date := l_temp_options(l_temp_options.count).arrival_date;
4186                         rec_pointer := l_temp_options.count;
4187                    ELSE
4188                         IF min_arrival_date > l_temp_options(l_temp_options.count).arrival_date THEN
4189                             min_arrival_date := l_temp_options(l_temp_options.count).arrival_date;
4190                             rec_pointer := l_temp_options.count;
4191                         END IF;
4192                    END IF;
4193                 END IF;
4194               END IF;
4195              END LOOP;
4196                IF l_temp_options.count > 0 THEN
4197                     l_available_list(J).shipping_methode := l_temp_options(rec_pointer).shipping_methodes;
4198                     l_available_list(J).intransit_time := l_temp_options(rec_pointer).lead_time  ;
4199                     l_temp_options.trim;
4200                ELSE
4201 	         -- phegde : adding this code, since uncommented the if condition above
4202                FOR I IN 1..l_options.count LOOP
4203                    l_temp_options.extend;
4204                    l_temp_options(l_temp_options.count).resource_id       :=  l_options(I).resource_id;
4205                    l_temp_options(l_temp_options.count).resource_type     :=  l_options(I).resource_type;
4206                    l_temp_options(l_temp_options.count).lead_time         :=  l_options(I).lead_time   ;
4207                    l_temp_options(l_temp_options.count).transfer_cost     :=  l_options(I).transfer_cost;
4208                    l_temp_options(l_temp_options.count).shipping_methodes :=  l_options(I).shipping_methodes;
4209                    l_temp_options(l_temp_options.count).arrival_date      :=  l_options(I).arrival_date ;
4210                    l_atleast_one_rec_per_line := TRUE;
4211 
4212                    if  min_arrival_date is null then
4213                      min_arrival_date := l_temp_options(l_temp_options.count).arrival_date;
4214                      rec_pointer := l_temp_options.count;
4215                    ELSE
4216                      IF min_arrival_date > l_temp_options(l_temp_options.count).arrival_date THEN
4217                        min_arrival_date := l_temp_options(l_temp_options.count).arrival_date;
4218                        rec_pointer := l_temp_options.count;
4219                      END IF;
4220                    END IF;
4221                  END LOOP;
4222                  IF l_temp_options.count > 0 THEN
4223                     l_available_list(J).shipping_methode := l_temp_options(rec_pointer).shipping_methodes;
4224                     l_available_list(J).intransit_time := l_temp_options(rec_pointer).lead_time  ;
4225                     l_temp_options.trim;
4226                  ELSE
4227                     l_available_list(J).item_id := NULL;
4228                  END IF;
4229                  -- phegde : end of changes
4230               END IF;
4231             END IF;
4232           END LOOP;
4233                FOR I IN 1..l_final_available_list.count LOOP
4234                     IF l_final_available_list(I).line_id = p_parts_list(K).line_id THEN
4235                         l_atleast_one_rec_per_line := TRUE;
4236                     END IF;
4237                END LOOP;
4238                IF not l_atleast_one_rec_per_line THEN
4239                     FND_MESSAGE.SET_NAME('CSP', 'CSP_UNABLE_NEED_BY_DATE');
4240                     FND_MSG_PUB.ADD;
4241                     fnd_msg_pub.count_and_get
4242                     ( p_count => x_msg_count
4243                     , p_data  => x_msg_data);
4244                END IF;
4245         END LOOP;
4246      END IF;
4247    END IF;
4248         l_temp_line_id  := p_parts_list(1).line_id;
4249         loop_Count := 1;
4250         l_required_quantity := 0;
4251         FOR I IN 1..p_parts_list.count LOOP
4252             l_no_of_options := 0;
4253             l_required_quantity := p_parts_list(I).quantity;
4254             quantity_fullfilled := FALSE ;
4255            If p_called_from <> 'MOBILE' THEN
4256             FOR K IN 1..l_final_available_list.count LOOP
4257             IF l_final_available_list(K).line_id  = p_parts_list(I).line_id THEN
4258                      l_no_of_options := l_no_of_options + 1;
4259                      x_availability(loop_count).line_id          :=  l_final_available_list(k).line_id ;
4260                      x_availability(loop_count).item_uom          :=  p_parts_list(I).item_uom ;
4261                      x_availability(loop_count).item_id          :=  l_final_available_list(k).item_id ;
4262                      x_availability(loop_count).source_org_id    :=  l_final_available_list(k).source_org;
4263                      x_availability(loop_count).shipping_methode :=  l_final_available_list(k).shipping_methode;
4264                      x_availability(loop_count).item_type        :=  l_final_available_list(k).item_type ;
4265                      x_availability(loop_count).sub_inventory_code := l_final_available_list(k).sub_inventory;
4266 
4267                       x_availability(loop_count).available_quantity := inv_convert.inv_um_convert(item_id       => l_final_available_list(K).item_id
4268                                                  , precision     => NULL  -- use default precision
4269                                                  , from_quantity => l_final_available_list(K).available_quantity
4270                                                  , from_unit     => l_final_available_list(K).item_uom
4271                                                  , to_unit       => p_parts_list(I).item_uom
4272                                                  , from_name     => NULL  -- from uom name
4273                                                  , to_name       => NULL  -- to uom name
4274                                                  );
4275                    l_final_available_list(K).available_quantity := x_availability(loop_count).available_quantity;
4276                      x_availability(loop_count).revision := l_final_available_list(K).revision;
4277                      IF x_availability(loop_count).source_org_id = l_temp_org_id THEN
4278                             IF p_need_by_date IS NOT NULL THEN
4279                                 x_availability(loop_count).arraival_date   := p_need_by_date;
4280                                 x_availability(loop_count).order_by_date   := p_need_by_date;
4281                             ELSE
4282                                 x_availability(loop_count).arraival_date   := sysdate ;
4283                                 x_availability(loop_count).order_by_date   := sysdate ;
4284                             END IF;
4285                     END IF;
4286                     IF l_final_available_list(k).shipping_methode IS NOT NULL THEN
4287                         x_availability(loop_count).source_type      := 'IO' ;
4288                         IF p_need_by_date IS NOT NULL THEN
4289                             x_availability(loop_count).arraival_date    := l_final_available_list(k).available_date + l_final_available_list(k).intransit_time/24 ;
4290                             IF p_need_by_date > x_availability(loop_count).arraival_date THEN
4291                                x_availability(loop_count).arraival_date    := p_need_by_date;
4292                             END IF;
4293                             x_availability(loop_count).order_by_date    := x_availability(loop_count).arraival_date
4294                                                                    - l_final_available_list(k).intransit_time/24 ;
4295                         ELSE
4296                             x_availability(loop_count).arraival_date    := l_final_available_list(k).available_date + l_final_available_list(k).intransit_time/24 ;
4297                             x_availability(loop_count).order_by_date    := SYSDATE;
4298                         END IF;
4299                     ELSE
4300                         x_availability(loop_count).source_type      := 'RES' ;
4301                     END IF;
4302 
4303                    IF fnd_profile.value(name => 'CSP_INCL_CAR_STOCK')= 'ALWAYS' or
4304                       fnd_profile.value(name => 'CSP_INCL_CAR_STOCK')= 'PRONLY'  THEN
4305                     IF NOT quantity_fullfilled THEN
4306                         IF l_required_quantity > l_final_available_list(k).available_quantity THEN
4307                             x_availability(loop_count).recommended_option := 'Y';
4308                             quantity_fullfilled := FALSE;
4309                             l_required_quantity := l_required_quantity - l_final_available_list(k).available_quantity;
4310                             x_availability(loop_count).ordered_quantity :=  l_final_available_list(k).available_quantity;
4311                         ELSE
4312                             x_availability(loop_count).recommended_option := 'Y';
4313                             x_availability(loop_count).ordered_quantity :=  l_required_quantity;
4314                             quantity_fullfilled := TRUE ;
4315                         END IF;
4316                     END IF;
4317                    END IF;
4318                   loop_count := loop_count + 1;
4319                 END IF;
4320                END LOOP;
4321             END IF;
4322                 FOR J IN 1..l_available_list.count LOOP
4323                     IF l_available_list(J).line_id = p_parts_list(I).line_id and l_available_list(J).item_id  IS not null THEN
4324                      l_no_of_options := l_no_of_options + 1;
4325                      x_availability(loop_count).item_uom          :=  p_parts_list(I).item_uom ;
4326                      x_availability(loop_count).line_id          :=  l_available_list(J).line_id ;
4327                      x_availability(loop_count).item_id          :=  l_available_list(J).item_id ;
4328                      x_availability(loop_count).source_org_id    :=  l_available_list(J).source_org;
4329                      x_availability(loop_count).shipping_methode :=  l_available_list(J).shipping_methode;
4330                    --  x_availability(loop_count).ordered_quantity :=  l_available_list(J).quantity;
4331                     x_availability(loop_count).item_type        :=  l_available_list(J).item_type ;
4332                    --  x_availability(loop_count).source_type      := 'IO' ;
4333                      x_availability(loop_count).sub_inventory_code := l_available_list(J).sub_inventory;
4334                     x_availability(loop_count).available_quantity := inv_convert.inv_um_convert(item_id       => l_available_list(J).item_id
4335                                                  , precision     => NULL  -- use default precision
4336                                                  , from_quantity => l_available_list(J).available_quantity
4337                                                  , from_unit     => l_available_list(J).item_uom
4338                                                  , to_unit       => p_parts_list(I).item_uom
4339                                                  , from_name     => NULL  -- from uom name
4340                                                  , to_name       => NULL  -- to uom name
4341                                                  );
4342                    l_available_list(J).available_quantity := x_availability(loop_count).available_quantity;
4343                     x_availability(loop_count).revision      := l_available_list(J).revision;
4344                      IF x_availability(loop_count).source_org_id = l_temp_org_id THEN
4345                             IF p_need_by_date IS NOT NULL THEN
4346                                 x_availability(loop_count).arraival_date   := p_need_by_date;
4347                                  x_availability(loop_count).order_by_date    := get_order_by_date(x_availability(loop_count).source_org_id,
4348                                                                                              x_availability(loop_count).shipping_methode,
4349                                                                                              x_availability(loop_count).arraival_date ,
4350                                                                                              l_available_list(I).intransit_time,
4351                                                                                              l_temp_org_id);
4352                             ELSE
4353                                 x_availability(loop_count).arraival_date   := sysdate ;
4354                                 x_availability(loop_count).order_by_date   := sysdate ;
4355                             END IF;
4356                     END IF;
4357                     IF l_available_list(J).shipping_methode IS NOT NULL
4358                         or  l_available_list(J).sub_inventory is null THEN
4359                         x_availability(loop_count).source_type      := 'IO' ;
4360                         IF p_need_by_date IS NOT NULL THEN
4361                             x_availability(loop_count).arraival_date    := get_arrival_date(l_available_list(J).available_date,
4362                                                                                         l_available_list(J).intransit_time,
4363                                                                                         l_temp_org_id) ;
4364 -- Modified for bug 3925273
4365 
4366                              IF p_need_by_date - x_availability(loop_count).arraival_date >= 1 THEN
4367 					      l_no_of_days := round((p_need_by_date - x_availability(loop_count).arraival_date) - 0.5);
4368 						 x_availability(loop_count).arraival_date    := x_availability(loop_count).arraival_date + l_no_of_days;
4369                              END IF;
4370                            /* x_availability(loop_count).order_by_date    := x_availability(loop_count).arraival_date
4371                                                                    - l_available_list(J).intransit_time/24 ;*/
4372                              x_availability(loop_count).order_by_date    := get_order_by_date(x_availability(loop_count).source_org_id,
4373                                                                                              x_availability(loop_count).shipping_methode,
4374                                                                                              x_availability(loop_count).arraival_date ,
4375                                                                                              l_available_list(J).intransit_time,
4376                                                                                              l_temp_org_id);
4377                         ELSE
4378                             x_availability(loop_count).arraival_date    := get_arrival_date(l_available_list(J).available_date,
4379                                                                                         l_available_list(J).intransit_time,
4380                                                                                         l_temp_org_id);
4381                             x_availability(loop_count).order_by_date    := SYSDATE;
4382                         END IF;
4383                    ELSE
4384                         x_availability(loop_count).source_type      := 'RES' ;
4385                    END IF;
4386                    IF NOT quantity_fullfilled THEN
4387                         IF l_required_quantity > l_available_list(J).available_quantity THEN
4388                             x_availability(loop_count).recommended_option := 'Y';
4389                             quantity_fullfilled := FALSE;
4390                             l_required_quantity := l_required_quantity - l_available_list(J).available_quantity;
4391                         ELSE
4392                             x_availability(loop_count).recommended_option := 'Y';
4393                             x_availability(loop_count).ordered_quantity :=  l_required_quantity;
4394                             quantity_fullfilled := TRUE ;
4395                         END IF;
4396                    END IF;
4397                         loop_count := loop_count + 1;
4398                   END IF;
4399                 END LOOP;
4400                 IF NOT quantity_fullfilled  THEN
4401                     l_assignment_set_id := FND_PROFILE.value(name => 'MRP_ATP_ASSIGN_SET');
4402                         open check_buy_from(p_parts_list(I).item_id, l_assignment_set_id,l_temp_org_id);
4403                         LOOP
4404                             fetch check_buy_from  INTO l_vendor_id, l_vendor_site_id;
4405                             exit when check_buy_from%notfound;
4406                             x_availability(loop_count).item_id  :=  p_parts_list(I).item_id ;
4407                             x_availability(loop_count).source_type  := 'POREQ' ;
4408                             x_availability(loop_count).ordered_quantity := l_required_quantity;
4409                             x_availability(loop_count).line_id             := p_parts_list(I).line_id ;
4410                             x_availability(loop_count).recommended_option := 'Y';
4411                             x_availability(loop_count).item_uom          :=  p_parts_list(I).item_uom ;
4412                             x_availability(loop_count).shipping_methode := NULL;
4413                             l_no_of_options := 1;
4414                             loop_count := loop_count+ 1;
4415                             exit;
4416                         END LOOP;
4417                         close check_buy_from;
4418 
4419                 END IF;
4420                 IF l_no_of_options = 0 THEN
4421                      x_availability(loop_count).line_id             := p_parts_list(I).line_id ;
4422                      x_availability(loop_count).item_id             := p_parts_list(I).item_id ;
4423                      x_availability(loop_count).source_org_id       := NULL;
4424                      x_availability(loop_count).shipping_methode    := NULL;
4425                      x_availability(loop_count).ordered_quantity    := NULL;
4426                      x_availability(loop_count).item_type           := NULL;
4427                      x_availability(loop_count).source_type         := NULL;
4428                      x_availability(loop_count).sub_inventory_code  := NULL;
4429                      x_availability(loop_count).arraival_date       := NULL;
4430                      x_availability(loop_count).order_by_date       := NULL;
4431                      loop_count := loop_count+ 1;
4432                 END IF;
4433         END LOOP;
4434      EXCEPTION
4435           WHEN OTHERS THEN
4436             FND_MESSAGE.SET_NAME('CSP', 'CSP_UNEXPECTED_EXEC_ERRORS');
4437             FND_MESSAGE.SET_TOKEN('ROUTINE', l_api_name, FALSE);
4438             FND_MESSAGE.SET_TOKEN('SQLERRM', sqlerrm, FALSE);
4439             FND_MSG_PUB.ADD;
4440             fnd_msg_pub.count_and_get
4441               ( p_count => x_msg_count
4442               , p_data  => x_msg_data);
4443             x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
4444             return;
4445      END CHECK_PARTS_AVAILABILITY;
4446     PROCEDURE CHECK_LOCAL_INVENTORY(  p_org_id        IN   NUMBER
4447                                       ,p_revision      IN   varchar2
4448                                      ,p_subinv_code   IN   VARCHAR2
4449                                      ,p_item_id       IN   NUMBER
4450                                      ,x_att           OUT NOCOPY  NUMBER
4451                                      ,x_onhand        OUT NOCOPY  NUMBER
4452                                      ,x_return_status OUT NOCOPY  VARCHAR2
4453                                      ,x_msg_data      OUT NOCOPY  VARCHAR2
4454                                      ,x_msg_count     OUT NOCOPY  NUMBER) IS
4455     /*CURSOR reservation_check(org_id NUMBER, sub_inv_code VARCHAR2,item_id NUMBER)
4456     IS
4457     SELECT (REQUIRED_QUANTITY-ORDERED_QUANTITY)
4458     FROM   CSP_REQUIREMENT_LINES
4459     WHERE  REQUIREMENT_HEADER_ID = (SELECT REQUIREMENT_HEADER_ID
4460                                     FROM   CSP_REQUIREMENT_HEADERS
4461                                     WHERE  OPEN_REQUIREMENT = 'Yes'
4462                                     AND    DESTINATION_ORGANIZATION_ID = org_id)
4463     AND   SOURCE_SUBINVENTORY =  sub_inv_code
4464     AND   INVENTORY_ITEM_ID = item_id
4465     AND   ORDER_LINE_ID IS NOT NULL ;*/
4466 
4467     l_onhand            NUMBER;
4468     l_available         NUMBER;
4469     l_rqoh              NUMBER;
4470    -- l_msg_data          VARCHAR2(2000);
4471    -- l_msg_count         NUMBER;
4472     l_return_status     VARCHAR2(128);
4473     l_qr                NUMBER;
4474     l_qs                NUMBER;
4475     l_temp_reserv_quantity NUMBER;
4476     l_api_name varchar2(60) := 'CSP_SCH_INT_PVT.CHECK_LOCAl_INVENTORY';
4477     l_is_revision_control boolean := null;
4478   BEGIN
4479   	IF p_revision IS NOT NULL THEN
4480   		l_is_revision_control  := TRUE;
4481   	END IF;
4482                 x_return_status := FND_API.G_RET_STS_SUCCESS ;
4483                 x_att := 0;
4484                 inv_quantity_tree_pub.clear_quantity_cache;
4485                 inv_quantity_tree_pub.query_quantities(p_api_version_number => 1.0
4486                                                      , p_organization_id  =>  p_org_id
4487                                                      , p_inventory_item_id => p_item_id
4488                                                      , p_subinventory_code => p_subinv_code
4489                                                      , x_qoh     => x_onhand
4490                                                      , x_atr     => l_available
4491                                                      , p_init_msg_lst   => fnd_api.g_false
4492                                                      , p_tree_mode   => inv_quantity_tree_pvt.g_transaction_mode
4493                                                      , p_is_revision_control => l_is_revision_control
4494                                                      , p_is_lot_control  => NULL
4495                                                      , p_is_serial_control => NULL
4496                                                      , p_revision    => p_revision
4497                                                      , p_lot_number   => NULL
4498                                                      , p_locator_id   => NULL
4499                                                      , x_rqoh     => l_rqoh
4500                                                      , x_qr     => l_qr
4501                                                      , x_qs     => l_qs
4502                                                      , x_att     => x_att
4503                                                      , x_return_status  => l_return_status
4504                                                      , x_msg_count   => x_msg_count
4505                                                      , x_msg_data    => x_msg_data
4506                                                      );
4507 
4508                /* OPEN reservation_check(p_org_id, p_subinv_code,p_item_id );
4509                 LOOP
4510                     FETCH reservation_check INTO l_temp_reserv_quantity;
4511                     EXIT WHEN reservation_check% NOTFOUND;
4512                      x_att := x_att - l_temp_reserv_quantity ;
4513                  END LOOP;
4514                  CLOSE reservation_check;*/
4515             EXCEPTION
4516             WHEN OTHERS THEN
4517             FND_MESSAGE.SET_NAME('CSP', 'CSP_UNEXPECTED_EXEC_ERRORS');
4518             FND_MESSAGE.SET_TOKEN('ROUTINE', l_api_name, FALSE);
4519             FND_MESSAGE.SET_TOKEN('SQLERRM', sqlerrm, FALSE);
4520             FND_MSG_PUB.ADD;
4521             fnd_msg_pub.count_and_get
4522               ( p_count => x_msg_count
4523               , p_data  => x_msg_data);
4524             x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
4525             return;
4526       END CHECK_LOCAL_INVENTORY;
4527       PROCEDURE TASKS_POST_INSERT( x_return_status out nocopy varchar2) IS
4528         p_task_id NUMBER;
4529         l_msg_data varchar2(3000);
4530         l_msg_count NUMBER;
4531         l_header_id NUMBER;
4532         p_task_template_id NUMBER;
4533       BEGIN
4534             p_task_id := jtf_tasks_pub.p_task_user_hooks.task_id;
4535              CSP_REQUIREMENT_POPULATE_PVT.POPULATE_REQUIREMENTS(p_task_id       => p_task_id
4536                                                               ,p_api_version   => 1.0
4537                                                               ,p_Init_Msg_List => FND_API.G_FALSE
4538                                                               ,p_commit        => FND_API.G_FALSE
4539                                                               ,x_return_status => x_return_status
4540                                                               ,x_msg_data      => l_msg_data
4541                                                               ,x_msg_count     => l_msg_count
4542                                                               ,px_header_id    => l_header_id
4543                                                               ,p_called_by     => 1);
4544 
4545 
4546       END TASKS_POST_INSERT;
4547       PROCEDURE strip_into_lines(px_options          IN OUT NOCOPY      CSP_SCH_INT_PVT.CSP_SHIP_PARAMETERS_TBL_TYPE
4548                                  ,p_ship_count      IN      CSP_SCH_INT_PVT.CSP_SHIP_METHOD_COUNT_TBL_TYP
4549                                  ,p_res_ship_parameters IN  CSP_SCH_INT_PVT.CSP_ORGS_SHIP_PARAM_TBL_TYPE
4550                                  ,px_available_list     IN OUT NOCOPY CSP_SCH_INT_PVT.CSP_AVAILABILITY_TBL_TYPE
4551                                  ,x_msg_data           OUT NOCOPY varchar2
4552                                  ,x_return_status      OUT NOCOPY varchar2
4553                                  ,x_msg_count          OUT NOCOPY NUMBER) IS
4554 
4555 
4556         l_org_ship_methode        org_ship_methodes_tbl_type ;
4557         l_final_option            CSP_SCH_INT_PVT.CSP_SHIP_PARAMETERS_TBL_TYPE ;
4558         min_cost number;
4559         previous_position NUMBER;
4560         str_length NUMBER;
4561         l_ship_methode_count NUMBER;
4562         g_arrival_date            DATE;
4563         current_position NUMBER;
4564 
4565       BEGIN
4566          l_final_option   :=         CSP_SCH_INT_PVT.CSP_SHIP_PARAMETERS_TBL_TYPE() ;
4567          l_org_ship_methode :=       org_ship_methodes_tbl_type() ;
4568           FOR I IN 1..px_options.count LOOP
4569                IF I =1 THEN
4570                     min_cost := px_options(I).transfer_cost;
4571                     l_final_option.extend;
4572                     l_final_option(l_final_option.count).resource_id       :=  px_options(I).resource_id;
4573                     l_final_option(l_final_option.count).resource_type     :=  px_options(I).resource_type;
4574                     l_final_option(l_final_option.count).lead_time         :=  px_options(I).lead_time   ;
4575                     l_final_option(l_final_option.count).transfer_cost     :=  px_options(I).transfer_cost;
4576                     IF px_options(I).shipping_methodes IS NOT NULL THEN
4577                         px_options(I).shipping_methodes := px_options(I).shipping_methodes || '-' ;
4578                     END IF;
4579                     l_final_option(l_final_option.count).shipping_methodes :=  px_options(I).shipping_methodes;
4580                     l_final_option(l_final_option.count).arrival_date      :=  px_options(I).arrival_date ;
4581                ELSE
4582                     SELECT LEAST(min_cost, px_options(I).transfer_cost) INTO min_cost
4583                     FROM   DUAL;
4584                     IF min_cost = px_options(I).transfer_cost THEN
4585                        l_final_option.trim(l_final_option.count);
4586                        l_final_option.extend;
4587                        l_final_option(l_final_option.count).resource_id       :=  px_options(I).resource_id;
4588                        l_final_option(l_final_option.count).resource_type     :=  px_options(I).resource_type;
4589                        l_final_option(l_final_option.count).lead_time         :=  px_options(I).lead_time   ;
4590                        l_final_option(l_final_option.count).transfer_cost     :=  px_options(I).transfer_cost;
4591                         IF px_options(I).shipping_methodes IS NOT NULL THEN
4592                             px_options(I).shipping_methodes := px_options(I).shipping_methodes || '-' ;
4593                         END IF;
4594                             l_final_option(l_final_option.count).shipping_methodes :=  px_options(I).shipping_methodes;
4595                             l_final_option(l_final_option.count).arrival_date      :=  px_options(I).arrival_date ;
4596                      END IF;
4597                END IF;
4598                g_arrival_date := l_final_option(l_final_option.count).arrival_date;
4599         END LOOP;
4600         previous_position :=1;
4601         str_length := 0;
4602         l_ship_methode_count := 1;
4603         IF p_ship_count.count > 1 THEN
4604             FOR I IN 1..p_ship_count.count LOOP
4605                IF p_ship_count(I).from_org_id <> p_ship_count(I).to_org_id  THEN
4606                     --IF I <> p_ship_count.count THEN
4607                         l_org_ship_methode.extend;
4608                         SELECT INSTR(l_final_option(1).shipping_methodes,'-',1,l_ship_methode_count ) INTO current_position
4609                         FROM   DUAL;
4610                         SELECT SUBSTR(l_final_option(1).shipping_methodes,previous_position,(current_position-previous_position))
4611                         INTO   l_org_ship_methode(l_org_ship_methode.count).shipping_methode
4612                         FROM   DUAL;
4613                         l_org_ship_methode(l_org_ship_methode.count).from_org := p_ship_count(I).from_org_id;
4614                         l_org_ship_methode(l_org_ship_methode.count).to_org   := p_ship_count(I).to_org_id ;
4615                         previous_position := current_position+1;
4616                         current_position := 1;
4617                         l_ship_methode_count := l_ship_methode_count + 1;
4618                  ELSE
4619                         l_org_ship_methode.extend;
4620                         l_org_ship_methode(l_org_ship_methode.count).from_org := p_ship_count(I).from_org_id;
4621                         l_org_ship_methode(l_org_ship_methode.count).to_org   := p_ship_count(I).to_org_id ;
4622                         l_org_ship_methode(l_org_ship_methode.count).shipping_methode := NULL;
4623                  END IF;
4624             END LOOP;
4625          ELSE
4626             l_org_ship_methode.extend;
4627             SELECT INSTR(l_final_option(1).shipping_methodes,'-',1,l_ship_methode_count ) INTO current_position
4628             FROM   DUAL;
4629             SELECT SUBSTR(l_final_option(1).shipping_methodes,previous_position,(current_position-previous_position))
4630             INTO   l_org_ship_methode(l_org_ship_methode.count).shipping_methode
4631             FROM   DUAL;
4632             l_org_ship_methode(l_org_ship_methode.count).from_org := p_ship_count(1).from_org_id;
4633             l_org_ship_methode(l_org_ship_methode.count).to_org   := p_ship_count(1).to_org_id ;
4634           ---  l_org_ship_methode(l_org_ship_methode.count).shipping_methode := l_final_option(1).shipping_methodes;
4635          END IF;
4636         FOR I IN 1..px_available_list.count LOOP
4637            IF px_available_list(I).sub_inventory IS NULL  AND (px_available_list(I).organization_id <> px_available_list(I).source_org) THEN
4638                 FOR J IN 1..l_org_ship_methode.count LOOP
4639                     IF px_available_list(I).organization_id =l_org_ship_methode(J).to_org
4640                             AND  px_available_list(I).source_org =l_org_ship_methode(J).from_org THEN
4641                                 px_available_list(I).shipping_methode := l_org_ship_methode(J).shipping_methode;
4642                             FOR K In 1..p_res_ship_parameters.count LOOP
4643                                 IF p_res_ship_parameters(K).to_org_id = px_available_list(I).organization_id
4644                                     AND p_res_ship_parameters(K).from_org_id = px_available_list(I).source_org
4645                                     AND p_res_ship_parameters(K).shipping_method = px_available_list(I).shipping_methode THEN
4646                                     px_available_list(I).intransit_time := p_res_ship_parameters(K).lead_time ;
4647                                     exit;
4648                                 END IF;
4649                             END LOOP;
4650                         EXIT;
4651                     END IF;
4652                 END LOOP;
4653            END IF;
4654         END LOOP;
4655       END strip_into_lines;
4656        PROCEDURE ws_Check_engineers_subinv(p_resource_type IN varchar2
4657                                    ,p_resource_id  IN NUMBER
4658                                    ,p_parts_list    IN csp_sch_int_pvt.CSP_PARTS_TBL_TYP1
4659                                    ,p_include_alternate IN varchar2
4660                                    ,x_available_list   OUT NOCOPY csp_sch_int_pvt.ws_AVAILABLE_PARTS_tbl_TYP
4661                                    ,x_return_status   OUT NOCOPY varchar2
4662                                    ,x_msg_data      OUT NOCOPY varchar2
4663                                    ,x_msg_count      OUT NOCOPY  NUMBER) IS
4664             l_att NUMBER:=0;
4665             l_onhand NUMBER := 0;
4666             l_org_id NUMBER;
4667             l_subinv_code varchar2(30);
4668             l_items   csp_sch_int_pvt.alternate_items_table_type;
4669 
4670             CURSOR get_all_subinventories(l_resource_id number, l_resource_type varchar2) IS
4671             SELECT  cil.ORGANIZATION_ID, cil.SUBINVENTORY_CODE
4672             FROM    CSP_INV_LOC_ASSIGNMENTS cil,csp_sec_inventories csi
4673             WHERE   cil.RESOURCE_ID = l_resource_id
4674             AND     cil.RESOURCE_TYPE = l_resource_type
4675             AND     nvl(cil.EFFECTIVE_DATE_END,sysdate) >= sysdate
4676             AND     csi.organization_id = cil.organization_id
4677             and     csi.secondary_inventory_name = cil.subinventory_code
4678             and     csi.condition_type = 'G' ;
4679 
4680             CURSOR get_default_subinventory(l_resource_id number, l_resource_type varchar2) IS
4681             SELECT  ORGANIZATION_ID, SUBINVENTORY_CODE
4682             FROM    CSP_INV_LOC_ASSIGNMENTS
4683             WHERE   RESOURCE_ID = l_resource_id
4684             AND     RESOURCE_TYPE = l_resource_type
4685             AND     DEFAULT_CODE = 'IN' ;
4686 
4687             CURSOR get_source_meaning(l_type varchar2) IS
4688             select meaning
4689             from fnd_lookups
4690             where lookup_type = 'CSP_REQ_SOURCE_TYPE'
4691             and lookup_code = l_type;
4692 
4693             CURSOR get_item_type_meaning(l_item_type number) IS
4694             select meaning
4695             from mfg_lookups
4696             where lookup_type
4697             like 'MTL_RELATIONSHIP_TYPES'
4698             and lookup_code = l_item_type;
4699 
4700             CURSOR get_item_number(c_item_id NUMBER, c_org_id NUMBER) IS
4701             select CONCATENATED_SEGMENTS
4702             FROM   mtl_system_items_kfv
4703             where inventory_item_id = c_item_id
4704             and   organization_id = c_org_id;
4705 
4706             -- bug # 4618899
4707             CURSOR primary_uom_code(item_id NUMBER,org_id NUMBER) IS
4708             SELECT PRIMARY_UOM_CODE
4709             FROM   MTL_SYSTEM_ITEMS_B
4710             WHERE  INVENTORY_ITEM_ID = item_id
4711             AND    organization_id  = org_id;
4712             l_primary_uom varchar2(500);
4713 
4714       BEGIN
4715             l_items  := csp_sch_int_pvt.alternate_items_table_type();
4716             x_available_list   := csp_sch_int_pvt.ws_AVAILABLE_PARTS_tbl_TYP();
4717             OPEN get_default_subinventory(p_resource_id,p_resource_type);
4718             FETCH get_default_subinventory INTO l_org_id, l_subinv_code;
4719             CLOSE get_default_subinventory;
4720                  l_items.extend;
4721                  l_items(l_items.count).item                     := p_parts_list(1).item_id;
4722                  l_items(l_items.count).item_quantity            := p_parts_list(1).quantity;
4723                  l_items(l_items.count).item_uom                 := p_parts_list(1).item_uom;
4724                  l_items(l_items.count).alternate_item           := p_parts_list(1).item_id;
4725                  l_items(l_items.count).alternate_item_quantity  := p_parts_list(1).quantity;
4726                  l_items(l_items.count).alternate_item_uom       := p_parts_list(1).item_uom;
4727                  l_items(l_items.count).relation_type            := NULL;
4728                  l_items(l_items.count).revision                 := p_parts_list(1).revision;
4729               IF p_include_alternate = 'Y' THEN
4730                  get_alternates(p_parts_rec   => p_parts_list(1)
4731                                ,p_org_id      => l_org_id
4732                                ,px_alternate_items => l_items
4733                                ,x_return_status => x_return_status
4734                                ,x_msg_data      => x_msg_data
4735                                ,x_msg_count    => x_msg_count);
4736               END IF;
4737 
4738                 open get_all_subinventories(p_resource_id,p_resource_type);
4739                 LOOP
4740                     FETCH get_all_subinventories INTO l_org_id, l_subinv_code;
4741                     EXIT WHEN get_all_subinventories% NOTFOUND;
4742                     l_onhand := 0;
4743                     l_att := 0;
4744                     FOR I IN 1..l_items.count LOOP
4745                         CHECK_LOCAL_INVENTORY(p_org_id        => l_org_id
4746                                      ,p_revision     => l_items(I).revision
4747                                      ,p_subinv_code   => l_subinv_code
4748                                      ,p_item_id       => l_items(I).alternate_item
4749                                      ,x_att           => l_att
4750                                      ,x_onhand        => l_onhand
4751                                      ,x_return_status => x_return_status
4752                                      ,x_msg_data      => x_msg_data
4753                                      ,x_msg_count     => x_msg_count);
4754                        IF l_att > 0 or l_onhand > 0 THEN
4755                           x_available_list.extend;
4756                           x_available_list(x_available_list.count).item_id       := l_items(I).alternate_item;
4757                           x_available_list(x_available_list.count).item_uom      := l_items(I).alternate_item_uom;
4758                           x_available_list(x_available_list.count).revision      := l_items(I).revision;
4759 
4760                           -- bug # 6955417
4761                           if l_items(I).relation_type is not NULL then
4762                             OPEN get_item_type_meaning(l_items(I).relation_type);
4763                             FETCH get_item_type_meaning INTO x_available_list(x_available_list.count).item_type ;
4764                             CLOSE get_item_type_meaning;
4765                           end if;
4766 
4767                           x_available_list(x_available_list.count).source_org_id := l_org_id;
4768                           OPEN get_item_number(x_available_list(x_available_list.count).item_id ,x_available_list(x_available_list.count).source_org_id);
4769                           FETCH  get_item_number INTO x_available_list(x_available_list.count).item_number;
4770                           CLOSE get_item_number;
4771                           x_available_list(x_available_list.count).sub_inventory_code  := l_subinv_code;
4772 
4773                           -- bug # 4618899
4774                           --x_available_list(x_available_list.count).available_quantity  := l_att;
4775                           --x_available_list(x_available_list.count).on_hand_quantity    := l_onhand;
4776 
4777                           open primary_uom_code(x_available_list(x_available_list.count).item_id ,x_available_list(x_available_list.count).source_org_id);
4778                           fetch primary_uom_code into l_primary_uom;
4779                           close primary_uom_code;
4780 
4781                           -- for available_quantity
4782                           x_available_list(x_available_list.count).available_quantity :=
4783                                 inv_convert.inv_um_convert(item_id => x_available_list(x_available_list.count).item_id
4784                                  , precision     => NULL  -- use default precision
4785                                  , from_quantity => l_att
4786                                  , from_unit     => l_primary_uom
4787                                  , to_unit       => x_available_list(x_available_list.count).item_uom
4788                                  , from_name     => NULL  -- from uom name
4789                                  , to_name       => NULL  -- to uom name
4790                                  );
4791 
4792                           -- for on_hand_quantity
4793                           x_available_list(x_available_list.count).on_hand_quantity :=
4794                                 inv_convert.inv_um_convert(item_id => x_available_list(x_available_list.count).item_id
4795                                  , precision     => NULL  -- use default precision
4796                                  , from_quantity => l_onhand
4797                                  , from_unit     => l_primary_uom
4798                                  , to_unit       => x_available_list(x_available_list.count).item_uom
4799                                  , from_name     => NULL  -- from uom name
4800                                  , to_name       => NULL  -- to uom name
4801                                  );
4802 
4803 
4804                           x_available_list(x_available_list.count).arraival_date       := sysdate;
4805                           OPEN  get_source_meaning('RES');
4806                           FETCH get_source_meaning INTO x_available_list(x_available_list.count).source_type;
4807                           CLOSE get_source_meaning;
4808                        END IF;
4809                    END LOOP;
4810                 END LOOP;
4811                 CLOSE get_all_subinventories;
4812       END ws_Check_engineers_subinv;
4813       PROCEDURE ws_Check_other_eng_subinv(p_resource_list IN csp_sch_int_pvt.csp_ws_resource_table_type
4814                                    ,p_parts_list    IN csp_sch_int_pvt.CSP_PARTS_TBL_TYP1
4815                                    ,p_include_alternate IN varchar2
4816                                    ,x_available_list   OUT NOCOPY csp_sch_int_pvt.ws_AVAILABLE_PARTS_tbl_TYP
4817                                    ,x_return_status   OUT NOCOPY varchar2
4818                                    ,x_msg_data      OUT NOCOPY varchar2
4819                                    ,x_msg_count      OUT NOCOPY  NUMBER) IS
4820 
4821             l_att NUMBER:=0;
4822             l_onhand NUMBER := 0;
4823             l_org_id NUMBER;
4824             l_subinv_code varchar2(30);
4825             l_items   csp_sch_int_pvt.alternate_items_table_type;
4826 
4827             CURSOR get_default_subinventory(l_resource_id number, l_resource_type varchar2) IS
4828             SELECT  ORGANIZATION_ID, SUBINVENTORY_CODE
4829             FROM    CSP_INV_LOC_ASSIGNMENTS
4830             WHERE   RESOURCE_ID = l_resource_id
4831             AND     RESOURCE_TYPE = l_resource_type
4832             AND     DEFAULT_CODE = 'IN' ;
4833 
4834              CURSOR get_source_meaning(l_type varchar2) IS
4835             select meaning
4836             from fnd_lookups
4837             where lookup_type = 'CSP_REQ_SOURCE_TYPE'
4838             and lookup_code = l_type;
4839 
4840             CURSOR get_item_type_meaning(l_item_type number) IS
4841             select meaning
4842             from mfg_lookups
4843             where lookup_type
4844             like 'MTL_RELATIONSHIP_TYPES'
4845             and lookup_code = l_item_type;
4846 
4847             CURSOR get_item_number(c_item_id NUMBER, c_org_id NUMBER) IS
4848             select CONCATENATED_SEGMENTS
4849             FROM   mtl_system_items_kfv
4850             where inventory_item_id = c_item_id
4851             and   organization_id = c_org_id;
4852 
4853             -- bug # 4618899
4854             CURSOR primary_uom_code(item_id NUMBER,org_id NUMBER) IS
4855             SELECT PRIMARY_UOM_CODE
4856             FROM   MTL_SYSTEM_ITEMS_B
4857             WHERE  INVENTORY_ITEM_ID = item_id
4858             AND    organization_id  = org_id;
4859             l_primary_uom varchar2(500);
4860 
4861       BEGIN
4862             l_items   := csp_sch_int_pvt.alternate_items_table_type();
4863             x_available_list   := csp_sch_int_pvt.ws_AVAILABLE_PARTS_tbl_TYP();
4864             --null;
4865         /*    OPEN get_default_subinventory(p_resource_list(1).resource_id,p_resource_list(1).resource_type);
4866             FETCH get_default_subinventory INTO l_org_id, l_subinv_code;
4867             CLOSE get_default_subinventory;
4868                  l_items.extend;
4869                  l_items(l_items.count).item                     := p_parts_list(1).item_id;
4870                  l_items(l_items.count).item_quantity            := p_parts_list(1).quantity;
4871                  l_items(l_items.count).item_uom                 := p_parts_list(1).item_uom;
4872                  l_items(l_items.count).alternate_item           := p_parts_list(1).item_id;
4873                  l_items(l_items.count).alternate_item_quantity  := p_parts_list(1).quantity;
4874                  l_items(l_items.count).alternate_item_uom       := p_parts_list(1).item_uom;
4875                  l_items(l_items.count).relation_type            := NULL;
4876               IF p_include_alternate = 'Y' THEN
4877                  get_alternates(p_parts_rec   => p_parts_list(1)
4878                                ,p_org_id      => l_org_id
4879                                ,px_alternate_items => l_items
4880                                ,x_return_status => x_return_status
4881                                ,x_msg_data      => x_msg_data
4882                                ,x_msg_count    => x_msg_count);
4883               END IF;*/
4884                 FOR J IN 1..p_resource_list.count LOOP
4885                     l_org_id := null;
4886                     l_subinv_code := null;
4887                     OPEN get_default_subinventory(p_resource_list(J).resource_id,p_resource_list(J).resource_type);
4888                     FETCH get_default_subinventory INTO l_org_id, l_subinv_code;
4889                     CLOSE get_default_subinventory;
4890                     IF l_org_id IS NOT NULL AND l_subinv_code IS NOT NULL THEN
4891                         IF l_items.count = 0 THEN
4892                             l_items.extend;
4893                             l_items(l_items.count).item                     := p_parts_list(1).item_id;
4894                             l_items(l_items.count).item_quantity            := p_parts_list(1).quantity;
4895                             l_items(l_items.count).item_uom                 := p_parts_list(1).item_uom;
4896                             l_items(l_items.count).alternate_item           := p_parts_list(1).item_id;
4897                             l_items(l_items.count).alternate_item_quantity  := p_parts_list(1).quantity;
4898                             l_items(l_items.count).alternate_item_uom       := p_parts_list(1).item_uom;
4899                             l_items(l_items.count).revision                 := p_parts_list(1).revision;
4900                             l_items(l_items.count).relation_type            := NULL;
4901                             IF p_include_alternate = 'Y' THEN
4902                                 get_alternates(p_parts_rec   => p_parts_list(1)
4903                                ,p_org_id      => l_org_id
4904                                ,px_alternate_items => l_items
4905                                ,x_return_status => x_return_status
4906                                ,x_msg_data      => x_msg_data
4907                                ,x_msg_count    => x_msg_count);
4908                             END IF;
4909                         END IF;
4910                     l_att := 0;
4911                         FOR I IN 1..l_items.count LOOP
4912                             CHECK_LOCAL_INVENTORY(p_org_id        => l_org_id
4913                                      ,p_subinv_code   => l_subinv_code
4914                                      ,p_item_id       => l_items(I).alternate_item
4915                                      ,p_revision      => l_items(I).revision
4916                                      ,x_att           => l_att
4917                                      ,x_onhand        => l_onhand
4918                                      ,x_return_status => x_return_status
4919                                      ,x_msg_data      => x_msg_data
4920                                      ,x_msg_count     => x_return_status);
4921                             IF l_att > 0  THEN
4922                                 x_available_list.extend;
4923                                 x_available_list(x_available_list.count).resource_id   :=   p_resource_list(J).resource_id;
4924                                 x_available_list(x_available_list.count).resource_type :=   p_resource_list(J).resource_type;
4925                                 x_available_list(x_available_list.count).distance      :=   p_resource_list(J).distance;
4926                                 x_available_list(x_available_list.count).unit          :=   p_resource_list(J).unit;
4927                                 x_available_list(x_available_list.count).phone_number  :=  p_resource_list(J).phone_number;
4928                                 x_available_list(x_available_list.count).name          :=   p_resource_list(J).name;
4929                                 x_available_list(x_available_list.count).item_id       := l_items(I).alternate_item;
4930                                 x_available_list(x_available_list.count).item_uom      := l_items(I).alternate_item_uom;
4931 
4932                               -- bug # 6955417
4933                               if l_items(I).relation_type is not NULL then
4934                                 OPEN get_item_type_meaning(l_items(I).relation_type);
4935                                 FETCH get_item_type_meaning INTO x_available_list(x_available_list.count).item_type ;
4936                                 CLOSE get_item_type_meaning;
4937                               end if;
4938 
4939                                 x_available_list(x_available_list.count).source_org_id := l_org_id;
4940                                 OPEN get_item_number(x_available_list(x_available_list.count).item_id ,x_available_list(x_available_list.count).source_org_id);
4941                                 FETCH  get_item_number INTO x_available_list(x_available_list.count).item_number;
4942                                 CLOSE get_item_number;
4943                                 x_available_list(x_available_list.count).sub_inventory_code  := l_subinv_code;
4944 
4945                           -- bug # 4618899
4946                           --x_available_list(x_available_list.count).available_quantity  := l_att;
4947                           --x_available_list(x_available_list.count).on_hand_quantity    := l_onhand;
4948 
4949 
4950                           open primary_uom_code(x_available_list(x_available_list.count).item_id ,x_available_list(x_available_list.count).source_org_id);
4951                           fetch primary_uom_code into l_primary_uom;
4952                           close primary_uom_code;
4953 
4954                           -- for available_quantity
4955                           x_available_list(x_available_list.count).available_quantity :=
4956                                 inv_convert.inv_um_convert(item_id => x_available_list(x_available_list.count).item_id
4957                                  , precision     => NULL  -- use default precision
4958                                  , from_quantity => l_att
4959                                  , from_unit     => l_primary_uom
4960                                  , to_unit       => x_available_list(x_available_list.count).item_uom
4961                                  , from_name     => NULL  -- from uom name
4962                                  , to_name       => NULL  -- to uom name
4963                                  );
4964 
4965                           -- for on_hand_quantity
4966                           x_available_list(x_available_list.count).on_hand_quantity :=
4967                                 inv_convert.inv_um_convert(item_id => x_available_list(x_available_list.count).item_id
4968                                  , precision     => NULL  -- use default precision
4969                                  , from_quantity => l_onhand
4970                                  , from_unit     => l_primary_uom
4971                                  , to_unit       => x_available_list(x_available_list.count).item_uom
4972                                  , from_name     => NULL  -- from uom name
4973                                  , to_name       => NULL  -- to uom name
4974                                  );
4975 
4976                                 x_available_list(x_available_list.count).arraival_date       := sysdate;
4977                                 OPEN  get_source_meaning('RES');
4978                                 FETCH get_source_meaning INTO x_available_list(x_available_list.count).source_type;
4979                                 CLOSE get_source_meaning;
4980                             END IF;
4981                           END LOOP;
4982                     END IF;
4983                 END LOOP;
4984       END ws_Check_other_eng_subinv;
4985 
4986        PROCEDURE ws_Check_organizations(p_resource_type IN varchar2
4987                                    ,p_resource_id  IN NUMBER
4988                                    ,p_parts_list    IN csp_sch_int_pvt.CSP_PARTS_TBL_TYP1
4989                                    ,p_include_alternate IN varchar2
4990                                    ,x_available_list   OUT NOCOPY csp_sch_int_pvt.ws_AVAILABLE_PARTS_tbl_TYP
4991                                    ,x_return_status   OUT NOCOPY varchar2
4992                                    ,x_msg_data      OUT NOCOPY varchar2
4993                                    ,x_msg_count      OUT NOCOPY  NUMBER) IS
4994 
4995             l_att NUMBER:=0;
4996             l_onhand NUMBER := 0;
4997             l_org_id NUMBER;
4998             l_subinv_code varchar2(30);
4999             l_items   csp_sch_int_pvt.alternate_items_table_type;
5000             l_unavailable_list        CSP_SCH_INT_PVT.CSP_UNAVAILABILITY_TBL_TYPE ;
5001             l_interval                CSP_SCH_INT_PVT.csp_sch_interval_rec_typ;
5002             l_available_list          CSP_SCH_INT_PVT.CSP_AVAILABILITY_TBL_TYPE ;
5003             l_temp_avail_list          CSP_SCH_INT_PVT.CSP_AVAILABILITY_TBL_TYPE ;
5004             l_final_unavailable_list  CSP_SCH_INT_PVT.CSP_UNAVAILABILITY_TBL_TYPE ;
5005             l_options                 CSP_SCH_INT_PVT.CSP_SHIP_PARAMETERS_TBL_TYPE;
5006              l_ship_count              CSP_SCH_INT_PVT.CSP_SHIP_METHOD_COUNT_TBL_TYP;
5007              l_res_ship_parameters      CSP_SCH_INT_PVT.CSP_ORGS_SHIP_PARAM_TBL_TYPE;
5008              l_temp_options            CSP_SCH_INT_PVT.CSP_SHIP_PARAMETERS_TBL_TYPE;
5009              l_final_option            CSP_SCH_INT_PVT.CSP_SHIP_PARAMETERS_TBL_TYPE;
5010              l_return_status           varchar2(10);
5011              p_need_by_date             date := null ;
5012              l_atleast_one_rec          BOOLEAN;
5013              min_cost                   NUMBER;
5014              min_arrival_date           DATE;
5015              rec_pointer                NUMBER;
5016 
5017             CURSOR get_default_subinventory(l_resource_id number, l_resource_type varchar2) IS
5018             SELECT  ORGANIZATION_ID, SUBINVENTORY_CODE
5019             FROM    CSP_INV_LOC_ASSIGNMENTS
5020             WHERE   RESOURCE_ID = l_resource_id
5021             AND     RESOURCE_TYPE = l_resource_type
5022             AND     DEFAULT_CODE = 'IN' ;
5023 
5024              CURSOR get_source_meaning(l_type varchar2) IS
5025             select meaning
5026             from fnd_lookups
5027             where lookup_type = 'CSP_REQ_SOURCE_TYPE'
5028             and lookup_code = l_type;
5029 
5030             CURSOR get_item_type_meaning(l_item_type number) IS
5031             select meaning
5032             from mfg_lookups
5033             where lookup_type
5034             like 'MTL_RELATIONSHIP_TYPES'
5035             and lookup_code = l_item_type;
5036 
5037             CURSOR get_location_id(c_org_id NUMBER) IS
5038             select location_id
5039             from HR_ALL_ORGANIZATION_UNITS
5040             where organization_id = c_org_id;
5041 
5042             CURSOR get_item_number(c_item_id NUMBER, c_org_id NUMBER) IS
5043             select CONCATENATED_SEGMENTS
5044             FROM   mtl_system_items_kfv
5045             where inventory_item_id = c_item_id
5046             and   organization_id = c_org_id;
5047 
5048             CURSOR get_shpping_method_meaning(c_ship_method varchar2) IS
5049             select meaning
5050             from   OE_SHIP_METHODS_V
5051             where  lookup_code = c_ship_method;
5052 
5053       BEGIN
5054 
5055             l_unavailable_list  :=     CSP_SCH_INT_PVT.CSP_UNAVAILABILITY_TBL_TYPE() ;
5056             l_available_list    :=     CSP_SCH_INT_PVT.CSP_AVAILABILITY_TBL_TYPE();
5057             l_final_unavailable_list := CSP_SCH_INT_PVT.CSP_UNAVAILABILITY_TBL_TYPE() ;
5058 
5059              l_ship_count            :=  CSP_SCH_INT_PVT.CSP_SHIP_METHOD_COUNT_TBL_TYP();
5060              l_res_ship_parameters   :=  CSP_SCH_INT_PVT.CSP_ORGS_SHIP_PARAM_TBL_TYPE();
5061              l_temp_options          := CSP_SCH_INT_PVT.CSP_SHIP_PARAMETERS_TBL_TYPE ();
5062              l_final_option          := CSP_SCH_INT_PVT.CSP_SHIP_PARAMETERS_TBL_TYPE ();
5063              x_available_list   := csp_sch_int_pvt.ws_AVAILABLE_PARTS_tbl_TYP();
5064              l_items           := csp_sch_int_pvt.alternate_items_table_type();
5065             l_temp_avail_list   :=  CSP_SCH_INT_PVT.CSP_AVAILABILITY_TBL_TYPE() ;
5066             OPEN get_default_subinventory(p_resource_id,p_resource_type);
5067             FETCH get_default_subinventory INTO l_org_id, l_subinv_code;
5068             CLOSE get_default_subinventory;
5069                  l_items.extend;
5070                  l_items(l_items.count).item                     := p_parts_list(1).item_id;
5071                  l_items(l_items.count).item_quantity            := p_parts_list(1).quantity;
5072                  l_items(l_items.count).item_uom                 := p_parts_list(1).item_uom;
5073                  l_items(l_items.count).alternate_item           := p_parts_list(1).item_id;
5074                  l_items(l_items.count).alternate_item_quantity  := p_parts_list(1).quantity;
5075                  l_items(l_items.count).alternate_item_uom       := p_parts_list(1).item_uom;
5076                  l_items(l_items.count).relation_type            := NULL;
5077               IF p_include_alternate = 'Y' THEN
5078                  get_alternates(p_parts_rec   => p_parts_list(1)
5079                                ,p_org_id      => l_org_id
5080                                ,px_alternate_items => l_items
5081                                ,x_return_status => x_return_status
5082                                ,x_msg_data      => x_msg_data
5083                                ,x_msg_count    => x_msg_count);
5084               END IF;
5085             FOR J IN 1..l_items.count LOOP
5086                     l_unavailable_list.extend;
5087                     l_unavailable_list(l_unavailable_list.count).resource_type     := p_resource_type;
5088                     l_unavailable_list(l_unavailable_list.count).resource_id       := p_resource_id;
5089                     l_unavailable_list(l_unavailable_list.count).organization_id   := l_org_id;
5090                     l_unavailable_list(l_unavailable_list.count).item_id           := l_items(J).alternate_item;
5091                     l_unavailable_list(l_unavailable_list.count).item_uom          := l_items(J).alternate_item_uom;
5092                     l_unavailable_list(l_unavailable_list.count).quantity          := l_items(J).alternate_item_quantity;
5093                    -- l_unavailable_list(l_unavailable_list.count).ship_set_name     := p_parts_list(I).ship_set_name;
5094                     l_unavailable_list(l_unavailable_list.count).item_type         := l_items(J).relation_type ;
5095                     l_unavailable_list(l_unavailable_list.count).line_id          := 1;
5096             END LOOP;
5097         IF l_unavailable_list.count >=1 THEN
5098             CSP_SCH_INT_PVT.DO_ATP_CHECK(l_unavailable_list,l_interval,l_available_list,l_final_unavailable_list,l_return_status,x_msg_data,x_msg_count);
5099         END IF;
5100      IF l_available_list.count > 0 THEN
5101              l_atleast_one_rec := FALSE;
5102          FOR J IN 1..l_available_list.count LOOP
5103             l_temp_avail_list.extend;
5104             l_temp_avail_list(1) := l_available_list(J);
5105             l_options                := CSP_SCH_INT_PVT.CSP_SHIP_PARAMETERS_TBL_TYPE();
5106             l_temp_options          := CSP_SCH_INT_PVT.CSP_SHIP_PARAMETERS_TBL_TYPE ();
5107             CSP_SCH_INT_PVT.OPTIMIZE_OPTIONS(l_temp_avail_list,l_options,l_ship_count,l_res_ship_parameters,x_return_status,x_msg_data,x_msg_count);
5108             l_temp_avail_list.trim;
5109             min_cost := null;
5110             min_arrival_date := null;
5111             rec_pointer := null;
5112             FOR I IN 1..l_options.count LOOP
5113                 IF ROUND(((l_options(I).arrival_date - sysdate) * 24),2) <=  ROUND(((p_need_by_date - sysdate) * 24),2)
5114                 OR p_need_by_date IS NULL THEN
5115                 l_temp_options.extend;
5116                 l_temp_options(l_temp_options.count).resource_id       :=  l_options(I).resource_id;
5117                 l_temp_options(l_temp_options.count).resource_type     :=  l_options(I).resource_type;
5118                 l_temp_options(l_temp_options.count).lead_time         :=  l_options(I).lead_time   ;
5119                 l_temp_options(l_temp_options.count).transfer_cost     :=  l_options(I).transfer_cost;
5120                 l_temp_options(l_temp_options.count).shipping_methodes :=  l_options(I).shipping_methodes;
5121                 l_temp_options(l_temp_options.count).arrival_date      :=  l_options(I).arrival_date ;
5122                 l_atleast_one_rec := TRUE;
5123                 IF p_need_by_date is not null then
5124                  IF min_cost is null then
5125                     min_cost :=  l_temp_options(l_temp_options.count).transfer_cost;
5126                     rec_pointer := l_temp_options.count;
5127                  ELSE
5128                     IF min_cost > l_temp_options(l_temp_options.count).transfer_cost THEN
5129                        min_cost := l_temp_options(l_temp_options.count).transfer_cost;
5130                        rec_pointer := l_temp_options.count;
5131                     END IF;
5132                  END IF;
5133                 ELSE
5134                    if  min_arrival_date is null then
5135                         min_arrival_date := l_temp_options(l_temp_options.count).arrival_date;
5136                         rec_pointer := l_temp_options.count;
5137                    ELSE
5138                         IF min_arrival_date > l_temp_options(l_temp_options.count).arrival_date THEN
5139                             min_arrival_date := l_temp_options(l_temp_options.count).arrival_date;
5140                             rec_pointer := l_temp_options.count;
5141                         END IF;
5142                    END IF;
5143                   END IF;
5144                 END IF;
5145              END LOOP;
5146                IF l_temp_options.count > 0 THEN
5147                     l_available_list(J).shipping_methode := l_temp_options(rec_pointer).shipping_methodes;
5148                     l_available_list(J).intransit_time := l_temp_options(rec_pointer).lead_time  ;
5149                ELSE
5150                     l_available_list(J).item_id := NULL;
5151                END IF;
5152            END LOOP;
5153                IF not l_atleast_one_rec THEN
5154                     FND_MESSAGE.SET_NAME('CSP', 'CSP_UNABLE_NEED_BY_DATE');
5155                     FND_MSG_PUB.ADD;
5156                     fnd_msg_pub.count_and_get
5157                     ( p_count => x_msg_count
5158                     , p_data  => x_msg_data);
5159                END IF;
5160      END IF;
5161          FOR J IN 1..l_available_list.count LOOP
5162                 x_available_list.extend;
5163                 x_available_list(x_available_list.count).item_uom          :=  p_parts_list(1).item_uom ;
5164 
5165                 x_available_list(x_available_list.count).item_id          :=  l_available_list(J).item_id ;
5166                 x_available_list(x_available_list.count).source_org_id    :=  l_available_list(J).source_org;
5167                 OPEN get_item_number(x_available_list(x_available_list.count).item_id ,x_available_list(x_available_list.count).source_org_id);
5168                 FETCH  get_item_number INTO x_available_list(x_available_list.count).item_number;
5169                 CLOSE get_item_number;
5170                 OPEN get_location_id(x_available_list(x_available_list.count).source_org_id);
5171                 FETCH get_location_id INTO x_available_list(x_available_list.count).location_id;
5172                 CLOSE get_location_id;
5173                 OPEN get_shpping_method_meaning(l_available_list(J).shipping_methode);
5174                 FETCH get_shpping_method_meaning INTO x_available_list(x_available_list.count).shipping_methode;
5175                 CLOSE get_shpping_method_meaning;
5176                  x_available_list(x_available_list.count).shipping_method_code := l_available_list(J).shipping_methode;
5177               --  x_available_list(x_available_list.count).shipping_methode :=  l_available_list(J).shipping_methode;
5178                 OPEN get_item_type_meaning(l_available_list(J).item_type);
5179                 FETCH get_item_type_meaning INTO x_available_list(x_available_list.count).item_type;
5180                 CLOSE get_item_type_meaning;
5181                --x_available_list(x_available_list.count).item_type        :=  l_available_list(J).item_type ;
5182                 x_available_list(x_available_list.count).sub_inventory_code := l_available_list(J).sub_inventory;
5183                 x_available_list(x_available_list.count).available_quantity := l_available_list(J).available_quantity;
5184                     IF l_available_list(J).shipping_methode IS NOT NULL THEN
5185                         x_available_list(x_available_list.count).source_type      := 'IO' ;
5186                         IF p_need_by_date IS NOT NULL THEN
5187                             x_available_list(x_available_list.count).arraival_date    := p_need_by_date ;
5188                             x_available_list(x_available_list.count).order_by_date    := x_available_list(x_available_list.count).arraival_date
5189                                                                    - l_available_list(J).intransit_time/24 ;
5190                         ELSE
5191                             x_available_list(x_available_list.count).arraival_date    := get_arrival_date(SYSDATE,
5192                                                                                         l_available_list(J).intransit_time,
5193                                                                                         l_org_id);
5194                             x_available_list(x_available_list.count).order_by_date    := SYSDATE;
5195                         END IF;
5196                    ELSE
5197                         x_available_list(x_available_list.count).source_type      := 'RES' ;
5198                    END IF;
5199          END LOOP;
5200 
5201       END ws_Check_organizations;
5202       PROCEDURE get_alternates(p_parts_rec    IN csp_sch_int_pvt.CSP_PARTS_REC_TYPE
5203                                ,p_org_id      IN  NUMBER
5204                                ,px_alternate_items IN OUT NOCOPY csp_sch_int_pvt.alternate_items_table_type
5205                                ,x_return_status OUT NOCOPY varchar2
5206                                ,x_msg_data      OUT NOCOPY varchar2
5207                                ,x_msg_count     OUT NOCOPY NUMBER)  IS
5208 
5209        l_temp_quantity NUMBER := 0;
5210        l_uom_code     varchar2(10);
5211        l_supersede_items  CSP_SUPERSESSIONS_PVT.NUMBER_ARR;
5212        l_substitute_item NUMBER;
5213 
5214         CURSOR primary_uom_code(item_id NUMBER,org_id NUMBER) IS
5215         SELECT PRIMARY_UOM_CODE
5216         FROM   MTL_SYSTEM_ITEMS_B
5217         WHERE  INVENTORY_ITEM_ID = item_id
5218         AND    organization_id  = org_id;
5219 
5220         CURSOR substitutes(item_id NUMBER,org_id NUMBER) IS
5221        /* SELECT mri.RELATED_ITEM_ID
5222         FROM   MTL_RELATED_ITEMS_VIEW mri, mtl_parameters mp
5223         WHERE  mp.organization_id = org_id
5224         AND    mri.INVENTORY_ITEM_ID = item_id
5225         AND    mri.RELATIONSHIP_TYPE_ID = 2
5226         AND    mri.ORGANIZATION_ID  = MP.MASTER_ORGANIZATION_ID;*/
5227         SELECT mri.RELATED_ITEM_ID
5228         FROM   MTL_RELATED_ITEMS mri, mtl_parameters mp
5229         WHERE  mp.organization_id = org_id
5230         AND    mri.INVENTORY_ITEM_ID = item_id
5231         AND    mri.RELATIONSHIP_TYPE_ID = 2
5232         AND    mri.ORGANIZATION_ID  = MP.MASTER_ORGANIZATION_ID;
5233 
5234 
5235 
5236       BEGIN
5237                     CSP_SUPERSESSIONS_PVT.get_supersede_bilateral_items(p_inventory_item_id => p_parts_rec.item_id
5238                                                     ,p_organization_id => p_org_id
5239                                                     ,x_supersede_items => l_supersede_items);
5240                     FOR J IN 1..l_supersede_items.count LOOP
5241                         l_uom_code := null;
5242                         OPEN primary_uom_code(l_supersede_items(J),p_org_id);
5243                         LOOP
5244                         FETCH primary_uom_code INTO l_uom_code;
5245                         EXIT WHEN primary_uom_code% NOTFOUND;
5246                         END LOOP;
5247                         CLOSE primary_uom_code;
5248 
5249                         l_temp_quantity :=
5250                         inv_convert.inv_um_convert(item_id       => l_supersede_items(J)
5251                                                  , precision     => NULL  -- use default precision
5252                                                  , from_quantity => p_parts_rec.quantity
5253                                                  , from_unit     => p_parts_rec.item_uom
5254                                                  , to_unit       => l_uom_code
5255                                                  , from_name     => NULL  -- from uom name
5256                                                  , to_name       => NULL  -- to uom name
5257                                                  );
5258                         px_alternate_items.extend;
5259                         px_alternate_items(px_alternate_items.count).item                     := p_parts_rec.item_id;
5260                         px_alternate_items(px_alternate_items.count).item_quantity            := p_parts_rec.quantity;
5261                         px_alternate_items(px_alternate_items.count).item_uom                 := p_parts_rec.item_uom;
5262                         px_alternate_items(px_alternate_items.count).alternate_item           := l_supersede_items(J);
5263                         px_alternate_items(px_alternate_items.count).alternate_item_quantity  := l_temp_quantity;
5264                         px_alternate_items(px_alternate_items.count).alternate_item_uom       := l_uom_code;
5265                         px_alternate_items(px_alternate_items.count).relation_type            := 8;
5266                         l_temp_quantity := 0;
5267                         l_uom_code := NULL;
5268                     END LOOP;
5269                     OPEN substitutes(p_parts_rec.item_id, p_org_id);
5270                     LOOP
5271                     FETCH substitutes INTO l_substitute_item;
5272                     EXIT WHEN substitutes % NOTFOUND;
5273                          l_uom_code := null;
5274                         OPEN primary_uom_code(l_substitute_item,p_org_id);
5275                         LOOP
5276                         FETCH primary_uom_code INTO l_uom_code;
5277                         EXIT WHEN primary_uom_code% NOTFOUND;
5278                         END LOOP;
5279                         CLOSE primary_uom_code;
5280                         l_temp_quantity :=
5281                         inv_convert.inv_um_convert(item_id       => l_substitute_item
5282                                                  , precision     => NULL  -- use default precision
5283                                                  , from_quantity => p_parts_rec.quantity
5284                                                  , from_unit     => p_parts_rec.item_uom
5285                                                  , to_unit       => l_uom_code
5286                                                  , from_name     => NULL  -- from uom name
5287                                                  , to_name       => NULL  -- to uom name
5288                                                  );
5289                         px_alternate_items.extend;
5290                         px_alternate_items(px_alternate_items.count).item                     := p_parts_rec.item_id;
5291                         px_alternate_items(px_alternate_items.count).item_quantity            := p_parts_rec.quantity;
5292                         px_alternate_items(px_alternate_items.count).item_uom                 := p_parts_rec.item_uom;
5293                         px_alternate_items(px_alternate_items.count).alternate_item           := l_substitute_item;
5294                         px_alternate_items(px_alternate_items.count).alternate_item_quantity  := l_temp_quantity;
5295                         px_alternate_items(px_alternate_items.count).alternate_item_uom       := l_uom_code;
5296                         px_alternate_items(px_alternate_items.count).relation_type            := 2;
5297                         l_temp_quantity := 0;
5298                         l_uom_code := NULL;
5299                     END LOOP;
5300                     CLOSE substitutes;
5301       END get_alternates;
5302        FUNCTION get_arrival_date(p_ship_date IN DATE,
5303                                 p_lead_time IN NUMBER,
5304                                 p_org_id IN NUMBER) return  DATE IS
5305 
5306         l_lead_time number;
5307         l_calendar_code varchar2(10);
5308         l_exception_set_id number;
5309         l_expected_arrival_date date;
5310         l_arrival_date date;
5311         l_no_of_days number;
5312         l_lead_time_in_days number;
5313 
5314 
5315         CURSOR csp_resource_calendar  IS
5316         SELECT  mp.calendar_code,mp.calendar_exception_set_id
5317         FROM    mtl_parameters mp
5318         where     mp.organization_id = p_org_id;
5319 
5320 
5321         cursor get_arrival_seq_number(c_calendar_code varchar2,
5322                                        c_exception_set_id number,
5323                                        c_calendar_date date,
5324                                        c_lead_time number) IS
5325         select bcd1.calendar_date
5326         from bom_calendar_dates bcd,
5327              bom_calendar_dates bcd1
5328         where bcd.calendar_code = c_calendar_code
5329         and   bcd.exception_set_id = c_exception_set_id
5330         and   bcd.calendar_date = c_calendar_date
5331         and   bcd1.calendar_code = bcd.calendar_code
5332         and   bcd1.exception_set_id = bcd.exception_set_id
5333         and   bcd1.seq_num = (bcd.seq_num + c_lead_time);
5334 
5335         cursor get_seq_number(c_calendar_code varchar2,
5336                                        c_exception_set_id number,
5337                                        c_calendar_date date)
5338                                       IS
5339           select bcd.seq_num
5340           from bom_calendar_dates bcd
5341           where   bcd.calendar_code = c_calendar_code
5342             and   bcd.exception_set_id = c_exception_set_id
5343             and   bcd.calendar_date = c_calendar_date;
5344 
5345      BEGIN
5346         OPEN csp_resource_calendar;
5347         FETCH csp_resource_calendar INTO l_calendar_code,l_exception_set_id ;
5348         CLOSE csp_resource_calendar;
5349         IF l_calendar_code is null then
5350             l_arrival_date := p_ship_date +  (p_lead_time * (1/24));
5351             return l_arrival_date;
5352         END IF;
5353         l_lead_time_in_days :=    p_lead_time * (1/24);
5354 -- bug 3925273        l_expected_arrival_date := p_ship_date + l_lead_time_in_days;
5355         l_expected_arrival_date := trunc(p_ship_date) + (sysdate - trunc(sysdate)) + l_lead_time_in_days;
5356         l_no_of_days := trunc(l_expected_arrival_date) - trunc(p_ship_date);
5357         IF  l_no_of_days  >  0  THEN
5358             OPEN get_arrival_seq_number(l_calendar_code,
5359                                         l_exception_set_id,
5360                                        trunc(p_ship_date),
5361                                        trunc(l_no_of_days));
5362             FETCH get_arrival_seq_number INTO l_arrival_date;
5363             CLOSE get_arrival_seq_number;
5364             l_arrival_date := l_arrival_date + (l_expected_arrival_date - trunc(l_expected_arrival_date));
5365         ELSE
5366             l_arrival_date  := l_expected_arrival_date;
5367         END IF;
5368         return   trunc(l_arrival_date,'MI');
5369      END;
5370   FUNCTION get_order_by_date(p_org_id IN NUMBER,
5371                                 p_ship_method varchar2,
5372                                 p_need_by_date IN DATE,
5373                                 p_lead_time IN NUMBER,
5374                                 p_to_org_id IN NUMBER) return  DATE IS
5375 
5376         l_lead_time number;
5377         l_calendar_code varchar2(10);
5378         l_exception_set_id number;
5379         l_expected_arrival_date date;
5380         l_order_by_date date;
5381         l_no_of_days number;
5382         l_lead_time_in_days number;
5383         l_cutoff_time   date;
5384         l_server_cutoff_time date;
5385         l_server_cutoff_hours number;
5386         l_timezone_id number;
5387         l_server_time_zone_id number;
5388         l_return_status varchar2(10);
5389         l_msg_count number;
5390         l_msg_data  varchar2(2000);
5391 
5392         CURSOR csp_resource_calendar  IS
5393         SELECT  mp.calendar_code,mp.calendar_exception_set_id
5394         FROM    mtl_parameters mp
5395         WHERE   mp.organization_id = p_to_org_id ;
5396 
5397 
5398         cursor get_arrival_seq_number(c_calendar_code varchar2,
5399                                        c_exception_set_id number,
5400                                        c_calendar_date date,
5401                                        c_lead_time number) IS
5402         select bcd1.calendar_date
5403         from bom_calendar_dates bcd,
5404              bom_calendar_dates bcd1
5405         where bcd.calendar_code = c_calendar_code
5406         and   bcd.exception_set_id = c_exception_set_id
5407         and   bcd.calendar_date = c_calendar_date
5408         and   bcd1.calendar_code = bcd.calendar_code
5409         and   bcd1.exception_set_id = bcd.exception_set_id
5410         and   bcd1.seq_num = (bcd.seq_num - c_lead_time);
5411 
5412         cursor get_seq_number(c_calendar_code varchar2,
5413                                        c_exception_set_id number,
5414                                        c_calendar_date date)
5415                                       IS
5416           select bcd.seq_num
5417           from bom_calendar_dates bcd
5418           where   bcd.calendar_code = c_calendar_code
5419             and   bcd.exception_set_id = c_exception_set_id
5420             and   bcd.calendar_date = c_calendar_date;
5421 
5422         cursor get_cutoff_time(c_org_id number,
5423                                c_ship_method_code varchar2) IS
5424             select cutoff_time,timezone_id
5425             from CSP_CARRIER_DELIVERY_TIMES
5426             where  ORGANIZATION_ID = c_org_id
5427             and    SHIPPING_METHOD = c_ship_method_code;
5428 
5429      BEGIN
5430         l_server_time_zone_id   := FND_PROFILE.VALUE(NAME => 'SERVER_TIMEZONE_ID');
5431         OPEN csp_resource_calendar;
5432         FETCH csp_resource_calendar INTO l_calendar_code,l_exception_set_id ;
5433         CLOSE csp_resource_calendar;
5434         IF l_calendar_code is null then
5435             l_order_by_date := p_need_by_date -  (p_lead_time * (1/24));
5436             return l_order_by_date;
5437         END IF;
5438         l_lead_time_in_days :=    p_lead_time * (1/24);
5439         l_expected_arrival_date := p_need_by_date - l_lead_time_in_days;
5440         l_no_of_days :=  trunc(p_need_by_date) - trunc(l_expected_arrival_date);
5441         IF  l_no_of_days  >  0  THEN
5442             OPEN get_arrival_seq_number(l_calendar_code,
5443                                         l_exception_set_id,
5444                                        trunc(p_need_by_date),
5445                                        trunc(l_no_of_days));
5446             FETCH get_arrival_seq_number INTO l_order_by_date;
5447             CLOSE get_arrival_seq_number;
5448             l_order_by_date := l_order_by_date + (l_expected_arrival_date - trunc(l_expected_arrival_date));
5449         ELSE
5450             l_order_by_date  := l_expected_arrival_date;
5451         END IF;
5452         OPEN get_cutoff_time(p_org_id,p_ship_method);
5453         FETCH get_cutoff_time INTO l_cutoff_time ,  l_timezone_id;
5454         CLOSE get_cutoff_time;
5455         IF l_cutoff_time IS NOT NULL and l_server_time_zone_id IS NOT NULL THEN
5456             HZ_TIMEZONE_PUB.Get_Time(   p_api_version  => 1.0,
5457                                     p_init_msg_list  => FND_API.G_FALSE,
5458                                     p_source_tz_id   => l_timezone_id,
5459                                     p_dest_tz_id     => l_server_time_zone_id,
5460                                     p_source_day_time  => l_cutoff_time,
5461                                     x_dest_day_time    => l_server_cutoff_time,
5462                                     x_return_status    => l_return_status ,
5463                                     x_msg_count        => l_msg_count ,
5464                                     x_msg_data         => l_msg_data);
5465             IF l_return_status <> 'S' THEN
5466                 l_server_cutoff_hours := nvl(to_number(to_char(l_cutoff_time,'HH24')),0) * 60 + nvl(to_number(to_char(l_cutoff_time,'MI')),0);
5467             ELSE
5468                 l_server_cutoff_hours := nvl(to_number(to_char(l_server_cutoff_time,'HH24')),0) * 60 + nvl(to_number(to_char(l_server_cutoff_time,'MI')),0);
5469             END IF;
5470            IF l_server_cutoff_hours  < (nvl(to_number(to_char(l_order_by_date,'HH24')),0) * 60 + nvl(to_number(to_char(l_order_by_date,'MI')),0)) THEN
5471                 l_order_by_date := trunc(l_order_by_date) + round(((l_server_cutoff_hours -60)/(24*60)),2);
5472             END IF;
5473         END IF;
5474         return l_order_by_date;
5475      END;
5476       procedure get_session_id(p_database_link IN varchar2, x_sesssion_id OUT NOCOPY NUMBER) IS
5477      PRAGMA AUTONOMOUS_TRANSACTION;
5478         l_statement varchar2(1000);
5479         l_statement1 varchar2(1000);
5480      BEGIN
5481         BEGIN
5482         l_statement := 'Select MRP_ATP_SCHEDULE_TEMP_S.NextVal From   Dual@'
5483                          || p_database_link;
5484                 EXECUTE IMMEDIATE l_statement
5485                 INTO x_sesssion_id;
5486         END;
5487         commit;
5488         Begin
5489         l_statement1 := 'alter session close database link ' ||p_database_link;
5490                 EXECUTE IMMEDIATE l_statement1;
5491         END;
5492      END;
5493 
5494       PROCEDURE TASK_POST_CANCEL( x_return_status out nocopy varchar2) IS
5495 
5496            l_task_id NUMBER;
5497            l_task_status_id NUMBER;
5498             l_order_id  NUMBER;
5499             l_req_details_line_id NUMBER;
5500             l_reserv_id NUMBER;
5501             l_status varchar2(30);
5502             l_return_status varchar2(3);
5503             x_msg_data varchar2(4000);
5504             x_msg_count NUMBER;
5505             l_cleanup_needed Varchar2(1) := 'N';
5506 
5507     CURSOR get_reservations is
5508     select crld.source_id , crld.req_line_detail_id
5509     from  csp_req_line_details crld
5510          ,csp_requirement_lines crl
5511          ,csp_requirement_headers crh
5512     where  crh.task_id = l_task_id
5513     and crl.requirement_header_id = crh.requirement_header_id
5514     and crld.requirement_line_id = crl.requirement_line_id
5515     and crld.source_type = 'RES' ;
5516 
5517     CURSOR get_orders is
5518     select oeh.header_id, crld.req_line_detail_id
5519     from  csp_req_line_details crld
5520          ,csp_requirement_lines crl
5521          ,csp_requirement_headers crh
5522          ,oe_order_lines_all oel
5523          ,oe_order_headers_all oeh
5524     where  crh.task_id = l_task_id
5525     and crl.requirement_header_id = crh.requirement_header_id
5526     and crld.requirement_line_id = crl.requirement_line_id
5527     and crld.source_type = 'IO'
5528     and oel.line_id = crld.source_id
5529     and oeh.header_id =  oel.header_id
5530     order by oeh.header_id;
5531 
5532     CURSOR get_order_status(c_header_id NUMBER) IS
5533     select flow_status_code
5534     from   oe_order_headers_all
5535     where  header_id =  c_header_id;
5536 
5537     cursor cleanup_needed IS
5538     select 'Y'
5539     from jtf_task_statuses_vl
5540     where task_status_id = l_task_status_id
5541     and ( CANCELLED_FLAG = 'Y' or rejected_flag = 'Y');
5542 
5543     cursor get_line_details(c_order_header_id Number) is
5544     select REQ_LINE_DETAIL_ID
5545     from  csp_req_line_details crld,oe_order_lines_all oel
5546     where crld.source_id = oel.line_id
5547     and crld.source_type = 'IO'
5548     and oel.header_id = c_order_header_id;
5549 
5550      BEGIN
5551         x_return_status :=  FND_API.G_RET_STS_SUCCESS;
5552         l_return_status := FND_API.G_RET_STS_SUCCESS;
5553          l_task_id := jtf_tasks_pub.p_task_user_hooks.task_id;
5554          l_task_status_id := jtf_tasks_pub.p_task_user_hooks.task_status_id;
5555          OPEN cleanup_needed;
5556          FETCH cleanup_needed INTO l_cleanup_needed;
5557          CLOSE cleanup_needed;
5558        IF l_cleanup_needed = 'Y' THEN
5559          OPEN get_reservations ;
5560          LOOP
5561             FETCH get_reservations INTO l_reserv_id,l_req_details_line_id;
5562             EXIT WHEN  get_reservations%NOTFOUND;
5563                 CSP_SCH_INT_PVT.CANCEL_RESERVATION(l_reserv_id,l_return_status,x_msg_data,x_msg_count);
5564                 IF l_return_status = FND_API.G_RET_STS_UNEXP_ERROR  THEN
5565                      x_return_status := FND_API.G_RET_STS_SUCCESS;
5566                 ELSIF l_return_status = FND_API.G_RET_STS_SUCCESS THEN
5567                     delete from csp_req_line_details where req_line_detail_id = l_req_details_line_id;
5568                 END IF;
5569          END LOOP;
5570          close get_reservations;
5571             OPEN get_orders;
5572             LOOP
5573                 FETCH get_orders INTO l_order_id ,l_req_details_line_id ;
5574                 EXIT WHEN get_orders% NOTFOUND;
5575                 OPEN get_order_status(l_order_id);
5576                 FETCH get_order_status INTO l_status;
5577                 CLOSE get_order_status;
5578                 IF l_status <> 'CANCELLED' THEN
5579                    CSP_SCH_INT_PVT.CANCEL_ORDER(l_order_id,l_return_status,x_msg_data,x_msg_count);
5580                    IF l_return_status = FND_API.G_RET_STS_UNEXP_ERROR THEN
5581                        x_return_status := FND_API.G_RET_STS_SUCCESS;
5582                    ELSIF l_return_status =  FND_API.G_RET_STS_SUCCESS THEN
5583                      open get_line_details(l_order_id);
5584                      LOOP
5585                          FETCH get_line_details INTO l_req_details_line_id;
5586                          EXIT WHEN get_line_details% NOTFOUND;
5587                             delete from csp_req_line_details where req_line_detail_id = l_req_details_line_id;
5588                      END LOOP;
5589                      CLOSE get_line_details;
5590                    END IF;
5591                 END IF;
5592             END LOOP;
5593             CLOSE get_orders;
5594         END IF;
5595      END;
5596       PROCEDURE   CREATE_RES_FOR_RCV_TRANXS(p_transaction_id IN NUMBER
5597                                            ,x_return_Status  OUT NOCOPY varchar2
5598                                            ,x_msg_data OUT NOCOPY varchar2) IS
5599 
5600         CURSOR get_res_detail IS
5601         select mmt.transaction_quantity transaction_quantity ,mmt.inventory_item_id  item_id,
5602                mmt.revision revision, mmt.organization_id org_id,mmt.subinventory_code subinv_code,
5603                crld.source_id line_id, mmt.transaction_uom uom,crh.need_by_date need_by_date,
5604                crld.requirement_line_id requirement_line_id,rcl.quantity_shipped quantity_shipped,
5605                rcl.quantity_received quantity_received,crld.req_line_detail_id req_line_detail_id
5606         from mtl_material_transactions mmt,RCV_SHIPMENT_headers rsh,
5607             rcv_shipment_lines rcl,
5608             oe_order_lines_all oola,csp_req_line_details crld,
5609             csp_requirement_lines crl,
5610             csp_requirement_headers crh
5611         where mmt.transaction_id = p_transaction_id
5612         and mmt.shipment_number = rsh.shipment_num
5613         and rsh.shipment_header_id = rcl.shipment_header_id
5614         and oola.source_document_line_id = rcl.requisition_line_id
5615         and crld.source_id = oola.line_id
5616         and mmt.source_code = 'RCV'
5617         and crld.source_type = 'IO'
5618         and crld.requirement_line_id = crl.requirement_line_id
5619         and crh.requirement_header_id = crl.requirement_header_id
5620 	   and crh.task_id is not null
5621 	 UNION
5622          select mmt.transaction_quantity transaction_quantity ,mmt.inventory_item_id  item_id,
5623                mmt.revision revision, mmt.organization_id org_id,mmt.subinventory_code subinv_code,
5624                crld.source_id line_id, mmt.transaction_uom uom,crh.need_by_date need_by_date,
5625                crld.requirement_line_id requirement_line_id, mmt.transaction_quantity quantity_shipped,
5626                mmt.transaction_quantity quantity_received,crld.req_line_detail_id req_line_detail_id
5627          from mtl_material_transactions mmt,
5628             oe_order_lines_all oola,csp_req_line_details crld,
5629             csp_requirement_lines crl,csp_requirement_headers crh
5630           where mmt.transaction_id = p_transaction_id
5631           and  oola.source_document_id = mmt.transaction_source_id
5632            and crld.source_id = oola.line_id
5633         and (mmt.source_code = 'ORDER ENTRY')
5634         and TRANSACTION_QUANTITY > 0
5635         and crld.source_type = 'IO'
5636         and crld.requirement_line_id = crl.requirement_line_id
5637         and crh.requirement_header_id = crl.requirement_header_id
5638 	   and crh.task_id is not null;
5639 
5640          l_reservation_parts CSP_SCH_INT_PVT.RESERVATION_REC_TYP;
5641          l_reservation_id NUMBER;
5642          l_req_line_detali_id NUMBER;
5643 
5644       BEGIN
5645         FOR grd in get_res_detail LOOP
5646                 l_reservation_id := NULL;
5647                 l_reservation_parts.need_by_date       := nvl(grd.need_by_date,sysdate);
5648                 l_reservation_parts.organization_id    := grd.org_id ;
5649                 l_reservation_parts.item_id            := grd.item_id;
5650                 l_reservation_parts.item_uom_code      := grd.uom;
5651                 l_reservation_parts.quantity_needed    := grd.transaction_quantity ;
5652                 l_reservation_parts.sub_inventory_code := grd.subinv_code ;
5653                 l_reservation_parts.line_id            := p_transaction_id;
5654                 l_reservation_parts.revision           := grd.revision;
5655                 l_reservation_id := csp_sch_int_pvt.CREATE_RESERVATION(l_reservation_parts
5656                                                                         ,x_return_status
5657                                                                         ,x_msg_data );
5658                 l_req_line_detali_id := NULL;
5659 		IF l_reservation_id IS NOT NULL AND l_reservation_id >0 THEN
5660                 	csp_req_line_details_pkg.insert_row(px_req_line_detail_id => l_req_line_detali_id
5661                                               ,p_requirement_line_id => grd.requirement_line_id
5662                                               ,p_created_by => FND_GLOBAL.user_id
5663                                               ,p_creation_date => sysdate
5664                                               ,p_last_updated_by =>  FND_GLOBAL.user_id
5665                                               ,p_last_update_date => sysdate
5666                                               ,p_last_update_login => FND_GLOBAL.login_id
5667                                               ,p_source_type => 'RES'
5668                                               ,p_source_id => l_reservation_id );
5669 
5670                 IF grd.quantity_shipped = grd.quantity_received THEN
5671                  csp_req_line_details_pkg.delete_row(grd.req_line_detail_id);
5672                END IF;
5673            END IF;
5674         END LOOP;
5675       END CREATE_RES_FOR_RCV_TRANXS;
5676        PROCEDURE cancel_order_line(
5677               p_order_line_id IN NUMBER,
5678               p_cancel_reason IN Varchar2,
5679               x_return_status OUT NOCOPY VARCHAR2,
5680               x_msg_count     OUT NOCOPY NUMBER,
5681               x_msg_data      OUT NOCOPY VARCHAR2) IS
5682        BEGIN
5683             csp_parts_order.cancel_order_line(p_order_line_id
5684                                         ,p_cancel_reason
5685                                         ,x_return_status
5686                                         ,x_msg_count
5687                                         ,x_msg_data);
5688        END;
5689      PROCEDURE DELETE_RESERVATION(p_reservation_id IN NUMBER
5690                                 ,x_return_status     OUT NOCOPY VARCHAR2
5691                                 ,x_msg_data         OUT NOCOPY VARCHAR2)
5692     IS
5693           CURSOR csp_transactions IS
5694           SELECT TRANSACTION_SOURCE_TYPE_ID,TRANSACTION_SOURCE_TYPE_NAME
5695           FROM   MTL_TXN_SOURCE_TYPES
5696           WHERE  transaction_source_type_id = 13;
5697           I NUMBER;
5698           l_api_version_number number :=1;
5699           l_init_msg_lst  varchar2(1) := fnd_api.g_true;
5700           x_msg_count number;
5701          -- x_msg_data  varchar2(128);
5702           l_rsv_rec  inv_reservation_global.mtl_reservation_rec_type;
5703           l_serial_number inv_reservation_global.serial_number_tbl_type;
5704           x_serial_number inv_reservation_global.serial_number_tbl_type;
5705           l_partial_reservation_flag varchar2(1):= fnd_api.g_false;
5706           l_force_reservation_flag varchar2(1) := fnd_api.g_true;
5707           l_validation_flag    varchar2(1) := fnd_api.g_true;
5708           l_source_type_id     NUMBER;
5709           l_source_name        varchar2(30);
5710           x_quantity_reserved  number;
5711           x_reservation_id number;
5712           l_msg varchar2(2000);
5713           --x_return_status varchar(128);
5714      BEGIN
5715           x_return_status  := FND_API.G_RET_STS_SUCCESS;
5716           OPEN csp_transactions;
5717             LOOP
5718                 FETCH csp_transactions INTO l_source_type_id, l_source_name;
5719                 EXIT WHEN csp_transactions%NOTFOUND;
5720             END LOOP;
5721           CLOSE csp_transactions;
5722                 IF l_source_type_id IS NULL THEN
5723                     raise NO_DATA_FOUND ;
5724                 END IF;
5725                 l_rsv_rec.reservation_id   :=  p_reservation_id;
5726                 /*l_rsv_rec.requirement_date := p_reservation_parts.need_by_date  ;
5727                 l_rsv_rec.organization_id  := p_reservation_parts.organization_id  ;
5728                 l_rsv_rec.inventory_item_id := p_reservation_parts.item_id   ;
5729                 l_rsv_rec.demand_source_type_id  := l_source_type_id ;
5730                 l_rsv_rec.demand_source_name     := l_source_name ;
5731                 l_rsv_rec.demand_source_header_id   := NULL;
5732                 l_rsv_rec.demand_source_line_id     := p_reservation_parts.line_id;
5733                 l_rsv_rec.demand_source_delivery    := NULL;
5734                 l_rsv_rec.primary_uom_code          := p_reservation_parts.item_UOM_code ;
5735                 l_rsv_rec.primary_uom_id            := NULL;
5736                 l_rsv_rec.reservation_uom_code      := p_reservation_parts.item_UOM_code;
5737                 l_rsv_rec.reservation_uom_id        := NULL;
5738                 l_rsv_rec.reservation_quantity      := p_reservation_parts.quantity_needed;
5739                 l_rsv_rec.primary_reservation_quantity  := NUll;
5740                 l_rsv_rec.detailed_quantity         := null;
5741                 l_rsv_rec.autodetail_group_id       := NULL;
5742                 l_rsv_rec.external_source_code       := NULL;
5743                 l_rsv_rec.external_source_line_id     := NULL;
5744                 l_rsv_rec.supply_source_type_id        := 13; --inv_reservation_global.g_source_type_internal_req;
5745                 l_rsv_rec.supply_source_header_id      := NULL;
5746                 l_rsv_rec.supply_source_line_id        := NULL;
5747                 l_rsv_rec.supply_source_name           := NULL;
5748                 l_rsv_rec.supply_source_line_detail    := NULL;
5749                 l_rsv_rec.revision                     := p_reservation_parts.revision ;
5750                 l_rsv_rec.subinventory_code            := p_reservation_parts.sub_inventory_code ;
5751                 l_rsv_rec.subinventory_id              := NULL ;
5752                 l_rsv_rec.locator_id                   := NULL;
5753                 l_rsv_rec.lot_number                   := NULL;
5754                 l_rsv_rec.lot_number_id                := NULL;
5755                 l_rsv_rec.pick_slip_number            := NULL;
5756                 l_rsv_rec.lpn_id                      := NULL;
5757                 l_rsv_rec.attribute_category       := NULL;
5758                 l_rsv_rec.attribute1               := NULL;
5759                 l_rsv_rec.attribute2               := NULL;
5760                 l_rsv_rec.attribute3               := NULL;
5761                 l_rsv_rec.attribute4               := NULL;
5762                 l_rsv_rec.attribute5               := NULL;
5763                 l_rsv_rec.attribute6               := NULL;
5764                 l_rsv_rec.attribute7               := NULL;
5765                 l_rsv_rec.attribute8               := NULL;
5766                 l_rsv_rec.attribute9               := NULL;
5767                 l_rsv_rec.attribute10              := NULL;
5768                 l_rsv_rec.attribute11              := NULL;
5769                 l_rsv_rec.attribute12              := NULL;
5770                 l_rsv_rec.attribute13              := NULL;
5771                 l_rsv_rec.attribute14              := NULL;
5772                 l_rsv_rec.attribute15              := NULL;
5773                 l_rsv_rec.ship_ready_flag          := NULL;*/
5774                 INV_RESERVATION_PUB.delete_reservation(l_api_version_number
5775                                                  , l_init_msg_lst
5776                                                  , x_return_status
5777                                                  , x_msg_count
5778                                                  , x_msg_data
5779                                                  , l_rsv_rec
5780                                                  , l_serial_number);
5781            EXCEPTION
5782         WHEN NO_DATA_FOUND THEN
5783             FND_MESSAGE.SET_NAME('CSP', 'CSP_SCH_TRANSACTION');
5784             FND_MSG_PUB.ADD;
5785             fnd_msg_pub.count_and_get
5786               ( p_count => x_msg_count
5787               , p_data  => x_msg_data);
5788             x_return_status := FND_API.G_RET_STS_ERROR;
5789         WHEN OTHERS THEN
5790             x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
5791 
5792      END DELETE_RESERVATION;
5793  END CSP_SCH_INT_PVT;