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.68.12020000.14 2013/04/04 10:44:06 cmgandhi ship $
3  * */
4 -- Start of Comments
5 -- Package name     : CSP_SCH_INT_PVT
6 -- Purpose          :
7 -- History          :
8 -- NOTE             :
9 -- End of Comments
10 
11     G_PKG_NAME CONSTANT VARCHAR2(30):= 'CSP_SCH_INT_PVT';
12    G_FILE_NAME CONSTANT VARCHAR2(12) := 'cspgscib.pls';
13 
14    g_interval  CSP_SCH_INT_PVT.csp_sch_interval_rec_typ;
15    g_schedular_call  VARCHAR2(1) := 'Y' ;
16    g_shipto_timezone_id NUMBER;
17    g_earliest_delivery_date Date := sysdate + 365 * 10;
18 
19    TYPE CSP_RESOURCE_ORG_REC_TYP IS RECORD(resource_id      NUMBER
20                                           ,resource_type    VARCHAR2(30)
21                                           ,organization_id  NUMBER
22                                           ,sub_inv_code     VARCHAR2(10));
23 
24    TYPE CSP_RESOURCE_ORG_tbl_TYP IS TABLE OF CSP_SCH_INT_PVT.CSP_RESOURCE_ORG_REC_TYP ;
25 
26    TYPE CSP_SHIP_PARAMETERS_REC_TYPE IS RECORD( resource_id        NUMBER
27                                                ,resource_type      VARCHAR2(30)
28                                                ,lead_time          NUMBER
29                                                ,transfer_cost      NUMBER
30                                                ,shipping_methodes  VARCHAR2(4000)
31                                                ,arrival_date       DATE);
32 
33    TYPE CSP_SHIP_PARAMETERS_TBL_TYPE IS TABLE OF CSP_SCH_INT_PVT.CSP_SHIP_PARAMETERS_REC_TYPE ;
34 
35    TYPE CSP_ORGS_SHIP_PARAM_REC_TYPE IS RECORD(resource_id         NUMBER
36                                                ,resource_type      VARCHAR2(30)
37                                                ,from_org_id        NUMBER
38                                                ,to_org_id          NUMBER
39                                                ,quantity           NUMBER
40                                                ,lead_time          NUMBER
41                                                ,transfer_cost      NUMBER
42                                                ,shipping_method    VARCHAR2(30)
43                                                ,delivery_time      DATE);
44 
45    TYPE CSP_ORGS_SHIP_PARAM_TBL_TYPE IS TABLE OF CSP_SCH_INT_PVT.CSP_ORGS_SHIP_PARAM_REC_TYPE;
46 
47 
48    TYPE CSP_SHIP_QUANTITY_REC_TYPE IS RECORD(resource_id    NUMBER
49                                         ,resource_type      VARCHAR2(30)
50                                         ,from_org_id        NUMBER
51                                         ,to_org_id          NUMBER
52                                         ,quantity           NUMBER
53                                         ,destination_location_id      NUMBER);
54 
55    TYPE CSP_SHIP_QUANTITY_TBL_TYPE IS TABLE OF CSP_SCH_INT_PVT.CSP_SHIP_QUANTITY_REC_TYPE ;
56 
57    TYPE CSP_SHIP_METHOD_COUNT_REC_TYP IS RECORD(from_org_id         NUMBER
58                                                 ,to_org_id          NUMBER
59                                                 ,shipping_methodes  NUMBER
60                                                 ,min_leadtime       NUMBER
61                                                 ,max_leadtime       NUMBER);
62 
63 
64    TYPE CSP_SHIP_METHOD_COUNT_TBL_TYP IS TABLE OF CSP_SCH_INT_PVT.CSP_SHIP_METHOD_COUNT_REC_TYP ;
65 
66 
67     TYPE org_ship_methodes IS RECORD(from_org NUMBER,
68                                          to_org   NUMBER,
69                                          shipping_methode varchar2(30));
70 
71     TYPE org_ship_methodes_tbl_type IS TABLE OF csp_sch_int_pvt.org_ship_methodes ;
72     TYPE csp_req_line_details_rec_typ is  RECORD(req_line_detail_id    NUMBER
73                                                 ,requirement_line_id   NUMBER
74                                                 ,source_type           varchar2(30)
75                                                 ,source_id            NUMBER);
76     TYPE csp_req_line_details_tabl_typ is table of csp_req_line_details_rec_typ;
77 
78 procedure log(p_procedure in varchar2,p_message in varchar2) as
79 begin
80     --dbms_output.put_line(p_procedure||' - '||p_message);
81     if(FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) then
82             FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT,
83                    'csp.plsql.csp_sch_int_pvt.'||p_procedure,
84                    p_message);
85     end if;
86 end;
87 
88    PROCEDURE GET_ORGANIZATION_SUBINV(p_resources            IN  CSP_SCH_INT_PVT.csp_sch_resource_tbl_typ
89                                     ,x_resource_org_subinv  OUT NOCOPY CSP_SCH_INT_PVT.csp_resource_org_tbl_typ
90                                     ,x_return_status        OUT NOCOPY VARCHAR2
91                                     ,x_msg_data             OUT NOCOPY VARCHAR2
92                                     ,x_msg_count            OUT NOCOPY NUMBER);
93 
94    PROCEDURE GET_PARTS_LIST(p_task_id       IN NUMBER
95                            ,p_likelihood    IN NUMBER
96                            ,x_parts_list    OUT NOCOPY CSP_SCH_INT_PVT.csp_parts_tbl_typ1
97                            ,x_return_status OUT NOCOPY VARCHAR2
98                            ,x_msg_data      OUT NOCOPY VARCHAR2
99                            ,x_msg_count     OUT NOCOPY NUMBER);
100 
101    PROCEDURE CHECK_LOCAl_INVENTORY( p_resource_org_subinv  IN  CSP_SCH_INT_PVT.CSP_RESOURCE_ORG_tbl_TYP
102                                    ,p_parts_list           IN  CSP_SCH_INT_PVT.CSP_PARTS_TBL_TYP1
103                                    ,p_trunk                IN BOOLEAN
104                                    ,x_unavailable_list    OUT NOCOPY  CSP_SCH_INT_PVT.CSP_UNAVAILABILITY_TBL_TYPE
105                                    ,x_available_list      OUT NOCOPY  CSP_SCH_INT_PVT.CSP_AVAILABILITY_TBL_TYPE
106                                    ,x_return_status       OUT NOCOPY VARCHAR2
107                                    ,x_msg_data            OUT NOCOPY VARCHAR2
108                                    ,x_msg_count           OUT NOCOPY NUMBER);
109 
110    PROCEDURE DO_ATP_CHECK(p_unavailable_list       IN     CSP_SCH_INT_PVT.CSP_UNAVAILABILITY_TBL_TYPE
111                          ,p_interval               IN     CSP_SCH_INT_PVT.csp_sch_interval_rec_typ
112                          ,px_available_list        IN OUT NOCOPY CSP_SCH_INT_PVT.CSP_AVAILABILITY_TBL_TYPE
113                          ,x_final_unavailable_list OUT NOCOPY    CSP_SCH_INT_PVT.CSP_UNAVAILABILITY_TBL_TYPE
114                          ,x_return_status          OUT NOCOPY    VARCHAR2
115                          ,x_msg_data               OUT NOCOPY    VARCHAR2
116                          ,x_msg_count              OUT NOCOPY    NUMBER);
117 
118    PROCEDURE SPARES_CHECK(p_unavailable_list       IN     CSP_SCH_INT_PVT.CSP_UNAVAILABILITY_TBL_TYPE
119                          ,p_interval               IN     CSP_SCH_INT_PVT.csp_sch_interval_rec_typ
120                          ,px_available_list        IN OUT NOCOPY CSP_SCH_INT_PVT.CSP_AVAILABILITY_TBL_TYPE
121                          ,x_final_unavailable_list OUT NOCOPY    CSP_SCH_INT_PVT.CSP_UNAVAILABILITY_TBL_TYPE
122                          ,x_return_status          OUT NOCOPY    VARCHAR2
123                          ,x_msg_data               OUT NOCOPY    VARCHAR2
124                          ,x_msg_count              OUT NOCOPY    NUMBER);
125 
126    PROCEDURE ELIGIBLE_RESOURCES(p_resource_list            IN  CSP_SCH_INT_PVT.CSP_SCH_RESOURCE_tbl_TYP
127                                ,p_available_list           IN  CSP_SCH_INT_PVT.CSP_AVAILABILITY_TBL_TYPE
128                                ,p_final_unavailable_list   IN  CSP_SCH_INT_PVT.CSP_UNAVAILABILITY_TBL_TYPE
129                                ,x_eligible_resources_list  OUT NOCOPY CSP_SCH_INT_PVT.CSP_AVAILABILITY_TBL_TYPE
130                                ,x_return_status            OUT NOCOPY VARCHAR2
131                                ,x_msg_data                 OUT NOCOPY VARCHAR2
132                                ,x_msg_count                OUT NOCOPY NUMBER);
133 
134    PROCEDURE CONSOLIDATE_QUANTITIES(p_eligible_resources_list IN  CSP_SCH_INT_PVT.CSP_AVAILABILITY_TBL_TYPE
135                                    ,x_ship_quantity           OUT NOCOPY    CSP_SCH_INT_PVT.CSP_SHIP_QUANTITY_TBL_TYPE
136                                    ,x_return_status OUT NOCOPY VARCHAR2
137                                    ,X_MSG_DATA      OUT NOCOPY VARCHAR2
138                                    ,x_msg_count     OUT NOCOPY NUMBER);
139 
140 
141    PROCEDURE EXTEND_ATP_REC(p_atp_rec IN OUT NOCOPY MRP_ATP_PUB.ATP_REC_TYP
142                              ,x_return_status OUT NOCOPY VARCHAR2);
143 
144    /*PROCEDURE GET_TIME_COST(p_eligible_resources_list  IN  CSP_SCH_INT_PVT.CSP_AVAILABILITY_TBL_TYPE
145                           ,x_options                  OUT NOCOPY CSP_SCH_INT_PVT.csp_sch_options_tab_typ
146                           ,x_return_status            OUT NOCOPY VARCHAR2);*/
147 
148    PROCEDURE BUILD_FINAL_LIST(p_temp_options  IN  CSP_SCH_INT_PVT.CSP_SHIP_PARAMETERS_TBL_TYPE
149                                ,px_options IN 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    PROCEDURE OPTIMIZE_OPTIONS(p_eligible_resources IN  CSP_SCH_INT_PVT.CSP_AVAILABILITY_TBL_TYPE
155                               ,px_options       IN OUT NOCOPY CSP_SCH_INT_PVT.CSP_SHIP_PARAMETERS_TBL_TYPE
156                               ,x_ship_count        OUT NOCOPY CSP_SCH_INT_PVT.CSP_SHIP_METHOD_COUNT_TBL_TYP
157                               ,x_ship_parameters   OUT NOCOPY CSP_SCH_INT_PVT.CSP_ORGS_SHIP_PARAM_TBL_TYPE
158                               ,x_return_status     OUT NOCOPY VARCHAR2
159                               ,x_msg_data          OUT NOCOPY VARCHAR2
160                               ,x_msg_count         OUT NOCOPY NUMBER);
161 
162    PROCEDURE GET_SHIPPING_PARAMETERS(p_ship_quantity            IN CSP_SCH_INT_PVT.CSP_SHIP_QUANTITY_TBL_TYPE
163                                     ,x_resource_ship_parameters OUT NOCOPY CSP_SCH_INT_PVT.CSP_ORGS_SHIP_PARAM_TBL_TYPE
164                                     ,x_ship_count               OUT NOCOPY CSP_SCH_INT_PVT.CSP_SHIP_METHOD_COUNT_TBL_TYP
165                                     ,x_return_status            OUT NOCOPY VARCHAR2
166                                     ,x_msg_data                 OUT NOCOPY VARCHAR2
167                                     ,x_msg_count                OUT NOCOPY NUMBER);
168 
169    PROCEDURE GET_TIME_COST(p_eligible_resources_list  IN  CSP_SCH_INT_PVT.CSP_AVAILABILITY_TBL_TYPE
170                           ,x_options                  OUT NOCOPY CSP_SCH_INT_PVT.csp_sch_options_tbl_typ
171                           ,x_return_status            OUT NOCOPY VARCHAR2
172                           ,x_msg_data                 OUT NOCOPY VARCHAR2
173                           ,x_msg_count                OUT NOCOPY NUMBER);
174 
175 
176    PROCEDURE CANCEL_ORDER(p_order_id       IN  NUMBER
177                          ,x_return_status  OUT NOCOPY VARCHAR2
178                          ,x_msg_data       OUT NOCOPY VARCHAR2
179                          ,x_msg_count      OUT NOCOPY NUMBER);
180 
181    PROCEDURE GET_SHIPPING_METHODE(p_from_org_id     IN   NUMBER,
182                                    p_to_org_id        IN   NUMBER,
183                                    p_need_by_date     IN   DATE,
184                                    p_timezone_id      IN   NUMBER,
185                                    x_shipping_methode OUT NOCOPY  VARCHAR2,
186                                    x_intransit_time   OUT NOCOPY  NUMBER,
187                                    x_return_status    OUT NOCOPY  VARCHAR2
188                                    , x_msg_data       OUT NOCOPY  VARCHAR2
189                                    , x_msg_count      OUT NOCOPY  NUMBER);
190 
191 
192 
193     PROCEDURE TRANSFER_RESERVATION(p_reservation_id  IN  NUMBER
194                                    ,p_order_header_id IN  NUMBER
195                                    ,p_order_line_id   IN  NUMBER
196                                    ,x_return_status   OUT NOCOPY VARCHAR2
197                                    ,x_reservation_id   OUT NOCOPY NUMBER
198                                    ,x_msg_data        OUT NOCOPY VARCHAR2
199                                    ,x_msg_count       OUT NOCOPY NUMBER);
200 
201     PROCEDURE strip_into_lines (px_options          IN  OUT NOCOPY    CSP_SCH_INT_PVT.CSP_SHIP_PARAMETERS_TBL_TYPE
202                                  ,p_ship_count      IN      CSP_SCH_INT_PVT.CSP_SHIP_METHOD_COUNT_TBL_TYP
203                                  ,p_res_ship_parameters IN  CSP_SCH_INT_PVT.CSP_ORGS_SHIP_PARAM_TBL_TYPE
204                                  ,px_available_list     IN OUT NOCOPY CSP_SCH_INT_PVT.CSP_AVAILABILITY_TBL_TYPE
205                                  ,x_msg_data           OUT NOCOPY varchar2
206                                  ,x_return_status      OUT NOCOPY varchar2
207                                  ,x_msg_count          OUT NOCOPY NUMBER);
208 
209    FUNCTION get_order_by_date(p_org_id IN NUMBER,
210                                 p_ship_method varchar2,
211                                 p_need_by_date IN DATE,
212                                 p_lead_time IN NUMBER,
213                                 p_to_org_id IN NUMBER) return  DATE ;
214  procedure get_session_id(p_database_link IN varchar2, x_sesssion_id OUT NOCOPY NUMBER);
215 
216  PROCEDURE DELETE_RESERVATION(p_reservation_id IN NUMBER
217                                 ,x_return_status     OUT NOCOPY VARCHAR2
218                                 ,x_msg_data         OUT NOCOPY VARCHAR2);
219 
220    PROCEDURE GET_AVAILABILITY_OPTIONS(p_api_version_number  IN  NUMBER
221                                       ,p_task_id            IN  NUMBER
222                                       ,p_resources          IN  CSP_SCH_INT_PVT.csp_sch_resource_tbl_typ
223                                       ,p_interval           IN  CSP_SCH_INT_PVT.csp_sch_interval_rec_typ
224                                       ,p_likelihood         IN  NUMBER
225                                       ,p_subinv_only        IN  BOOLEAN
226                                       ,p_mandatory          IN  BOOLEAN
227                                       ,p_trunk              IN  BOOLEAN
228                                       ,p_warehouse          IN  BOOLEAN
229                                       ,x_options            OUT NOCOPY CSP_SCH_INT_PVT.csp_sch_options_tbl_typ
230                                       ,x_return_status      OUT NOCOPY VARCHAR2
231                                       ,x_msg_data           OUT NOCOPY VARCHAR2
232                                       ,x_msg_count          OUT NOCOPY NUMBER) IS
233 
234         l_resource_org_subinv     CSP_SCH_INT_PVT.CSP_RESOURCE_ORG_tbl_TYP;
235         l_parts_list              CSP_SCH_INT_PVT.CSP_PARTS_TBL_TYP1 ;
236         l_unavailable_list        CSP_SCH_INT_PVT.CSP_UNAVAILABILITY_TBL_TYPE ;
237         l_available_list          CSP_SCH_INT_PVT.CSP_AVAILABILITY_TBL_TYPE ;
238         l_final_available_list    CSP_SCH_INT_PVT.CSP_AVAILABILITY_TBL_TYPE ;
239         l_eligible_resources_list CSP_SCH_INT_PVT.CSP_AVAILABILITY_TBL_TYPE ;
240         l_final_unavailable_list  CSP_SCH_INT_PVT.CSP_UNAVAILABILITY_TBL_TYPE ;
241         l_return_status           VARCHAR2(128) := FND_API.G_RET_STS_SUCCESS;
242         l_del_date                VARCHAR2(50);
243         l_api_name                VARCHAR2(60) := 'CSP_SCH_INT_PVT.GET_AVAILABILITY_OPTIONS';
244         l_temp_line_id            NUMBER;
245         l_total_parts             NUMBER := 0;
246         l_subinv_only             BOOLEAN := p_subinv_only;
247         --hehxxx
248         l_search_method           varchar2(30) := fnd_profile.value('CSP_PART_SEARCH_METHOD_SCHEDULER');
249 
250          cursor get_line_id is
251         select distinct(crl.requirement_line_id) req_line_id
252         from csp_requirement_lines  crl,csp_requirement_headers crh
253         where crh.task_id = p_task_id
254         and crl.requirement_header_id = crh.requirement_header_id;
255 
256         cursor get_asgn_id is
257         select task_assignment_id
258         from jtf_task_assignments
259         where task_id = p_task_id;
260 
261                 l_partial_line number;
262                 l_fl_rcvd_multi_source number;
263                 l_oth_req_line number;
264                 l_fl_rcvd_lines number;
265                 l_non_src_line number;
266                 l_shpd_lines number;
267                 l_tech_spec_pr number;
268                 l_ship_multi_src number;
269                 l_old_arrival_date date;
270                 l_dest_ou number;
271                 l_rs_ou number;
272 
273                 cursor get_rs_ou(v_rs_type varchar2, v_rs_id number) is
274                 SELECT csp.organization_id
275                 FROM CSP_RS_SUBINVENTORIES_V csp
276                 WHERE csp.resource_type = v_rs_type
277                 AND csp.resource_id     = v_rs_id
278                 AND csp.condition_type  = 'G'
279                 AND csp.default_flag    = 'Y';
280 
281                 l_order_number number;
282 
283    BEGIN
284 
285                 if(FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) then
286                   FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT,
287                                                   'csp.plsql.CSP_SCH_INT_PVT.GET_AVAILABILITY_OPTIONS',
288                                                   'Begin');
289                   FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT,
290                                                   'csp.plsql.CSP_SCH_INT_PVT.GET_AVAILABILITY_OPTIONS',
291                                                   'p_task_id=' || p_task_id);
292                   FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT,
293                                                   'csp.plsql.CSP_SCH_INT_PVT.GET_AVAILABILITY_OPTIONS',
294                                                   'p_resources.count=' || p_resources.count);
295                   FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT,
296                                                   'csp.plsql.CSP_SCH_INT_PVT.GET_AVAILABILITY_OPTIONS',
297                                                   'p_interval.latest_time=' || to_char(p_interval.latest_time, 'DD-MON-RRRR HH24:MI:SS'));
298                 end if;
299 
300       savepoint GET_AVAILABILITY_OPTIONS_SP;
301 
302         if p_warehouse then
303           l_subinv_only := FALSE;
304         elsif not p_warehouse then
305           l_subinv_only := TRUE;
306         end if;
307 
308         l_resource_org_subinv     := CSP_SCH_INT_PVT.CSP_RESOURCE_ORG_tbl_TYP();
309        -- l_parts_list              := CSP_SCH_INT_PVT.CSP_PARTS_TBL_TYP1();
310         l_unavailable_list        := CSP_SCH_INT_PVT.CSP_UNAVAILABILITY_TBL_TYPE();
311         l_available_list          := CSP_SCH_INT_PVT.CSP_AVAILABILITY_TBL_TYPE ();
312         l_eligible_resources_list := CSP_SCH_INT_PVT.CSP_AVAILABILITY_TBL_TYPE() ;
313         l_final_unavailable_list  := CSP_SCH_INT_PVT.CSP_UNAVAILABILITY_TBL_TYPE();
314         x_options :=  CSP_SCH_INT_PVT.csp_sch_options_tbl_typ();
315         x_return_status := FND_API.G_RET_STS_SUCCESS;
316         g_interval := p_interval;
317 
318     -- bug # 12618325
319     -- need to clear old requirement
320     if(FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) then
321       FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT,
322                       'csp.plsql.CSP_SCH_INT_PVT.GET_AVAILABILITY_OPTIONS',
323                       'trying to clear old requirement if it has any...');
324     end if;
325 
326     for r_asgn in get_asgn_id loop
327 
328                 -- ER Task Rescheduling
329                 -- first check if there is any Partial Received order line
330                 -- if yes then reject the request saying order cannot be cancelled
331                 -- then check for the fully received case for task cand customer ship to
332                 -- also, make sure there is no other requirement line with other order line
333                 -- status, at this moment, we do not support that complex case
334                 -- then check for already shipped order lines
335                 -- also, we need to support the case where one line is fully received
336                 -- or shipped and other line is not yet sourced
337                 -- in above case, we need to continue with the search process
338 
339 
340                 -- first check for the partial received order line status
341                 l_partial_line := 0;
342                 SELECT count(l.requirement_line_id)
343                 into l_partial_line
344                 FROM csp_requirement_headers h,
345                   csp_requirement_lines l,
346                   csp_req_line_details d,
347                   oe_order_lines_all oola
348                 WHERE h.task_id             = p_task_id
349                 AND h.task_assignment_id    = r_asgn.task_assignment_id
350                 AND h.requirement_header_id = l.requirement_header_id
351                 AND l.requirement_line_id   = d.requirement_line_id
352                 and d.source_type = 'IO'
353                 AND d.source_id = oola.line_id
354                 and csp_pick_utils.get_order_status(oola.line_id,oola.flow_status_code) = 'PARTIALLY RECEIVED';
355 
356                 if(FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) then
357                   FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT,
358                                                   'csp.plsql.CSP_SCH_INT_PVT.GET_AVAILABILITY_OPTIONS',
359                                                   'l_partial_line = ' || l_partial_line);
360                 end if;
361 
362                 if l_partial_line > 0 then
363                         x_return_status := FND_API.G_RET_STS_ERROR;
364                         FND_MESSAGE.SET_NAME('CSP', 'CSP_SCH_NOT_CANCEL_ORDER');
365                         FND_MSG_PUB.ADD;
366                         fnd_msg_pub.count_and_get
367                                         ( p_count => x_msg_count
368                                         , p_data  => x_msg_data);
369                         return;
370                 end if;
371 
372                 -- bug # 14182971
373                 -- block rescheduling if part is already received for Tech or Special
374                 -- ship to address type
375                 l_fl_rcvd_lines := 0;
376                 SELECT COUNT(l.requirement_line_id)
377                 into l_fl_rcvd_lines
378                 FROM csp_requirement_headers h,
379                   csp_requirement_lines l,
380                   csp_req_line_details dio,
381                   csp_req_line_details dres,
382                   oe_order_lines_all oola,
383                   mtl_reservations mr
384                 WHERE h.task_id             = p_task_id
385                 AND h.task_assignment_id    = r_asgn.task_assignment_id
386                 AND h.address_type         IN ('R', 'S')
387                 AND h.requirement_header_id = l.requirement_header_id
388                 AND l.requirement_line_id   = dio.requirement_line_id
389                 AND dio.source_type        = 'IO'
390                 and dio.source_id = oola.line_id
391                 AND csp_pick_utils.get_order_status(oola.line_id,oola.flow_status_code)        = 'FULLY RECEIVED'
392                 AND dio.requirement_line_id = dres.requirement_line_id
393                 AND oola.inventory_item_id    = mr.inventory_item_id
394                 AND oola.ordered_quantity   = mr.reservation_quantity
395                 AND dres.source_type       = 'RES'
396                 AND dres.source_id = mr.reservation_id;
397 
398                 if(FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) then
399                   FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT,
400                                                   'csp.plsql.CSP_SCH_INT_PVT.GET_AVAILABILITY_OPTIONS',
401                                                   'l_fl_rcvd_lines (R or S) = ' || l_fl_rcvd_lines);
402                 end if;
403 
404                 if l_fl_rcvd_lines > 0 then
405                         SELECT ooha.order_number
406                         into l_order_number
407                         FROM csp_requirement_headers h,
408                           csp_requirement_lines l,
409                           csp_req_line_details dio,
410                           oe_order_lines_all oola,
411                           oe_order_headers_all ooha
412                         WHERE h.task_id             = p_task_id
413                         AND h.task_assignment_id    = r_asgn.task_assignment_id
414                         AND h.address_type         IN ('R', 'S')
415                         AND h.requirement_header_id = l.requirement_header_id
416                         AND l.requirement_line_id   = dio.requirement_line_id
417                         AND dio.source_type        = 'IO'
418                         and dio.source_id = oola.line_id
419                         and oola.header_id = ooha.header_id
420                         AND rownum                  = 1;
421 
422                         x_return_status := FND_API.G_RET_STS_ERROR;
423                         FND_MESSAGE.SET_NAME('CSP', 'CSP_TSK_ASSGN_NO_IO_CAN');
424                         FND_MESSAGE.SET_TOKEN('ORDER_NUMBER',l_order_number, FALSE);
425                         FND_MSG_PUB.ADD;
426                         fnd_msg_pub.count_and_get
427                                         ( p_count => x_msg_count
428                                         , p_data  => x_msg_data);
429                         return;
430                 end if;
431 
432                 -- for fully rcvd case
433                 l_fl_rcvd_lines := 0;
434                 SELECT COUNT(l.requirement_line_id)
435                 into l_fl_rcvd_lines
436                 FROM csp_requirement_headers h,
437                   csp_requirement_lines l,
438                   csp_req_line_details dio,
439                   csp_req_line_details dres,
440                   oe_order_lines_all oola,
441                   mtl_reservations mr
442                 WHERE h.task_id             = p_task_id
443                 AND h.task_assignment_id    = r_asgn.task_assignment_id
444                 AND h.address_type         IN ('T', 'C', 'P')
445                 AND h.requirement_header_id = l.requirement_header_id
446                 AND l.requirement_line_id   = dio.requirement_line_id
447                 AND dio.source_type        = 'IO'
448                 and dio.source_id = oola.line_id
449                 AND csp_pick_utils.get_order_status(oola.line_id,oola.flow_status_code)        = 'FULLY RECEIVED'
450                 AND dio.requirement_line_id = dres.requirement_line_id
451                 AND oola.inventory_item_id    = mr.inventory_item_id
452                 AND oola.ordered_quantity   = mr.reservation_quantity
453                 AND dres.source_type       = 'RES'
454                 AND dres.source_id = mr.reservation_id;
455 
456                 if(FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) then
457                   FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT,
458                                                   'csp.plsql.CSP_SCH_INT_PVT.GET_AVAILABILITY_OPTIONS',
459                                                   'l_fl_rcvd_lines (T or C) = ' || l_fl_rcvd_lines);
460                 end if;
461 
462                 if l_fl_rcvd_lines > 0 then
463 
464                         -- get fully received lines for task and customer ship to case
465                         l_fl_rcvd_multi_source := 0;
466                         SELECT COUNT(l.requirement_line_id)
467                         into l_fl_rcvd_multi_source
468                         FROM csp_requirement_headers h,
469                           csp_requirement_lines l,
470                           csp_req_line_details dio,
471                           csp_req_line_details dres,
472                           csp_req_line_details dother,
473                           oe_order_lines_all oola,
474                           mtl_reservations mr
475                         WHERE h.task_id             = p_task_id
476                         AND h.task_assignment_id    = r_asgn.task_assignment_id
477                         AND h.address_type         IN ('T', 'C', 'P')
478                         AND h.requirement_header_id = l.requirement_header_id
479                         AND l.requirement_line_id   = dio.requirement_line_id
480                         AND dio.source_type        = 'IO'
481                         AND dio.source_id = oola.line_id
482                         AND csp_pick_utils.get_order_status(oola.line_id,oola.flow_status_code)         = 'FULLY RECEIVED'
483                         AND dio.requirement_line_id = dres.requirement_line_id
484                         AND oola.inventory_item_id    = mr.inventory_item_id
485                         AND oola.ordered_quantity   = mr.reservation_quantity
486                         AND dres.source_type       = 'RES'
487                         AND dres.source_id = mr.reservation_id
488                         AND l.requirement_line_id   = dother.requirement_line_id
489                         AND dother.source_id       <> dio.source_id
490                         AND dother.source_id       <> dres.source_id;
491 
492                         if(FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) then
493                           FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT,
494                                                           'csp.plsql.CSP_SCH_INT_PVT.GET_AVAILABILITY_OPTIONS',
495                                                           'l_fl_rcvd_multi_source = ' || l_fl_rcvd_multi_source);
496                         end if;
497 
498                         if l_fl_rcvd_multi_source > 0 then
499                                 x_return_status := FND_API.G_RET_STS_ERROR;
500                                 FND_MESSAGE.SET_NAME('CSP', 'CSP_SCH_NOT_CANCEL_ORDER');
501                                 FND_MSG_PUB.ADD;
502                                 fnd_msg_pub.count_and_get
503                                                 ( p_count => x_msg_count
504                                                 , p_data  => x_msg_data);
505                                 return;
506                         end if;
507 
508                         -- check if any other req line sourced
509                         l_oth_req_line := 0;
510                         SELECT COUNT(requirement_line_id)
511                         into l_oth_req_line
512                         FROM
513                           (SELECT l.requirement_line_id
514                           FROM csp_requirement_headers h,
515                                 csp_requirement_lines l,
516                                 csp_req_line_details d
517                           WHERE h.task_id             = p_task_id
518                           AND h.task_assignment_id    = r_asgn.task_assignment_id
519                           AND h.requirement_header_id = l.requirement_header_id
520                           AND h.address_type         IN ('T', 'C', 'P')
521                           AND l.requirement_line_id   = d.requirement_line_id
522                           MINUS
523                           SELECT l.requirement_line_id
524                           FROM csp_requirement_headers h,
525                                 csp_requirement_lines l,
526                                 csp_req_line_details dio,
527                                 csp_req_line_details dres,
528                                 oe_order_lines_all oola,
529                                 mtl_reservations mr
530                           WHERE h.task_id             = p_task_id
531                           AND h.task_assignment_id    = r_asgn.task_assignment_id
532                           AND h.address_type         IN ('T', 'C', 'P')
533                           AND h.requirement_header_id = l.requirement_header_id
534                           AND l.requirement_line_id   = dio.requirement_line_id
535                           AND dio.source_type        = 'IO'
536                           AND dio.source_id = oola.line_id
537                           AND csp_pick_utils.get_order_status(oola.line_id,oola.flow_status_code)       = 'FULLY RECEIVED'
538                           AND dio.requirement_line_id = dres.requirement_line_id
539                           AND oola.inventory_item_id    = mr.inventory_item_id
540                           AND oola.ordered_quantity   = mr.reservation_quantity
541                           AND dres.source_type       = 'RES'
542                           AND dres.source_id = mr.reservation_id
543                           );
544 
545                         if(FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) then
546                           FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT,
547                                                           'csp.plsql.CSP_SCH_INT_PVT.GET_AVAILABILITY_OPTIONS',
548                                                           'l_oth_req_line = ' || l_oth_req_line);
549                         end if;
550 
551                         if l_oth_req_line > 0 then
552                                 x_return_status := FND_API.G_RET_STS_ERROR;
553                                 FND_MESSAGE.SET_NAME('CSP', 'CSP_SCH_NOT_CANCEL_ORDER');
554                                 FND_MSG_PUB.ADD;
555                                 fnd_msg_pub.count_and_get
556                                                 ( p_count => x_msg_count
557                                                 , p_data  => x_msg_data);
558                                 return;
559                         end if;
560 
561                         --check if there is any not sourced line
562                         l_non_src_line := 0;
563                         SELECT COUNT(requirement_line_id)
564                         into l_non_src_line
565                         FROM
566                           (SELECT l.requirement_line_id
567                           FROM csp_requirement_headers h,
568                                 csp_requirement_lines l
569                           WHERE h.task_id             = p_task_id
570                           AND h.task_assignment_id    = r_asgn.task_assignment_id
571                           AND h.requirement_header_id = l.requirement_header_id
572                           AND h.address_type         IN ('T', 'C', 'P')
573                           AND (SELECT COUNT (d.requirement_line_id)
574                                 FROM csp_req_line_details d
575                                 WHERE d.requirement_line_id = l.requirement_line_id) = 0
576                           MINUS
577                           SELECT l.requirement_line_id
578                           FROM csp_requirement_headers h,
579                                 csp_requirement_lines l,
580                                 csp_req_line_details dio,
581                                 csp_req_line_details dres,
582                                 oe_order_lines_all oola,
583                                 mtl_reservations mr
584                           WHERE h.task_id             = p_task_id
585                           AND h.task_assignment_id    = r_asgn.task_assignment_id
586                           AND h.address_type         IN ('T', 'C', 'P')
587                           AND h.requirement_header_id = l.requirement_header_id
588                           AND l.requirement_line_id   = dio.requirement_line_id
589                           AND dio.source_type        = 'IO'
590                           AND dio.source_id = oola.line_id
591                           AND csp_pick_utils.get_order_status(oola.line_id,oola.flow_status_code)        = 'FULLY RECEIVED'
592                           AND dio.requirement_line_id = dres.requirement_line_id
593                           AND oola.inventory_item_id    = mr.inventory_item_id
594                           AND oola.ordered_quantity   = mr.reservation_quantity
595                           AND dres.source_type       = 'RES'
596                           AND dres.source_id = mr.reservation_id
597                           );
598 
599                         if(FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) then
600                           FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT,
601                                                           'csp.plsql.CSP_SCH_INT_PVT.GET_AVAILABILITY_OPTIONS',
602                                                           'l_non_src_line = ' || l_non_src_line);
603                         end if;
604 
605                         if l_non_src_line = 0 then
606                                 -- if we are here that means all the lines source have been
607                                 -- already recived
608                                 -- return to scheduler saying part is available
609                                 x_options := CSP_SCH_INT_PVT.csp_sch_options_tbl_typ();
610                                 for res_count in 1..p_resources.count loop
611                                         x_options.extend;
612                                         x_options(x_options.count).resource_id   := p_resources(res_count).resource_id;
613                                         x_options(x_options.count).resource_type := p_resources(res_count).resource_type;
614                                         x_options(x_options.count).start_time    := sysdate + (1/144);
615                                         x_options(x_options.count).transfer_cost := 0;
616                                         x_options(x_options.count).missing_parts := 0;
617                                         x_options(x_options.count).available_parts := 1;        -- not sure if required
618                                         x_options(x_options.count).src_warehouse := '';
619                                         x_options(x_options.count).ship_method := '';
620                                         x_options(x_options.count).distance_str := '';
621                                 end loop;
622                                 return;
623                         end if;
624                 end if;
625 
626                 -- now check for shipped lines
627                 l_shpd_lines := 0;
628                 SELECT COUNT(l.requirement_line_id)
629                 into l_shpd_lines
630                 FROM csp_requirement_headers h,
631                   csp_requirement_lines l,
632                   csp_req_line_details d,
633                   oe_order_lines_all oola
634                 WHERE h.task_id             = p_task_id
635                 AND h.task_assignment_id    = r_asgn.task_assignment_id
636                 AND h.requirement_header_id = l.requirement_header_id
637                 AND l.requirement_line_id   = d.requirement_line_id
638                 AND d.source_type          = 'IO'
639                 AND d.source_id = oola.line_id
640                 AND csp_pick_utils.get_order_status(oola.line_id,oola.flow_status_code)          in ('SHIPPED', 'EXPECTED');
641 
642                 if(FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) then
643                   FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT,
644                                                   'csp.plsql.CSP_SCH_INT_PVT.GET_AVAILABILITY_OPTIONS',
645                                                   'l_shpd_lines = ' || l_shpd_lines);
646                 end if;
647 
648                 if l_shpd_lines > 0 then
649                         l_tech_spec_pr := 0;
650                         SELECT count(h.address_type)
651                         into l_tech_spec_pr
652                         FROM csp_requirement_headers h
653                         WHERE h.task_id          = p_task_id
654                         AND h.task_assignment_id = r_asgn.task_assignment_id
655                         AND h.address_type      IN ('R', 'S');
656 
657                         if(FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) then
658                           FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT,
659                                                           'csp.plsql.CSP_SCH_INT_PVT.GET_AVAILABILITY_OPTIONS',
660                                                           'l_tech_spec_pr = ' || l_tech_spec_pr);
661                         end if;
662 
663                         if l_tech_spec_pr > 0 then
664                                 SELECT ooha.order_number
665                                 INTO l_order_number
666                                 FROM csp_requirement_headers h,
667                                   csp_requirement_lines l,
668                                   csp_req_line_details d,
669                                   oe_order_lines_all oola,
670                                   oe_order_headers_all ooha
671                                 WHERE h.task_assignment_id  = r_asgn.task_assignment_id
672                                 AND h.task_id               = p_task_id
673                                 AND h.requirement_header_id = l.requirement_header_id
674                                 AND l.requirement_line_id   = d.requirement_line_id
675                                 AND d.source_type          = 'IO'
676                                 AND d.source_id = oola.line_id
677                                 AND oola.header_id = ooha.header_id
678                                 AND csp_pick_utils.get_order_status(oola.line_id,oola.flow_status_code)         IN ('SHIPPED', 'EXPECTED')
679                                 AND rownum                  = 1;
680 
681                                 x_return_status := FND_API.G_RET_STS_ERROR;
682                                 FND_MESSAGE.SET_NAME('CSP', 'CSP_TSK_ASSGN_NO_IO_CAN');
683                                 FND_MESSAGE.SET_TOKEN('ORDER_NUMBER',l_order_number, FALSE);
684                                 FND_MSG_PUB.ADD;
685                                 fnd_msg_pub.count_and_get
686                                                 ( p_count => x_msg_count
687                                                 , p_data  => x_msg_data);
688                                 return;
689                         else
690                                 -- now check for same line multiple IO case
691                                 l_ship_multi_src := 0;
692                                 SELECT COUNT(l.requirement_line_id)
693                                 into l_ship_multi_src
694                                 FROM csp_requirement_headers h,
695                                   csp_requirement_lines l,
696                                   csp_req_line_details d,
697                                   csp_req_line_details dother,
698                                   oe_order_lines_all oola
699                                 WHERE h.task_id                = p_task_id
700                                 AND h.task_assignment_id       = r_asgn.task_assignment_id
701                                 AND h.requirement_header_id    = l.requirement_header_id
702                                 AND l.requirement_line_id      = d.requirement_line_id
703                                 AND h.address_type         IN ('T', 'C', 'P')
704                                 AND d.source_type             = 'IO'
705                                 AND d.source_id = oola.line_id
706                                 AND csp_pick_utils.get_order_status(oola.line_id,oola.flow_status_code)              in ('SHIPPED', 'EXPECTED')
707                                 AND dother.requirement_line_id = l.requirement_line_id
708                                 AND dother.source_id          <> d.source_id;
709 
710                                 if(FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) then
711                                   FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT,
712                                                                   'csp.plsql.CSP_SCH_INT_PVT.GET_AVAILABILITY_OPTIONS',
713                                                                   'l_ship_multi_src = ' || l_ship_multi_src);
714                                 end if;
715 
716                                 if l_ship_multi_src > 0 then
717                                         x_return_status := FND_API.G_RET_STS_ERROR;
718                                         FND_MESSAGE.SET_NAME('CSP', 'CSP_SCH_NOT_CANCEL_ORDER');
719                                         FND_MSG_PUB.ADD;
720                                         fnd_msg_pub.count_and_get
721                                                         ( p_count => x_msg_count
722                                                         , p_data  => x_msg_data);
723                                         return;
724                                 end if;
725 
726                                 -- check of other source line
727                                 l_oth_req_line := 0;
728                                 SELECT COUNT(requirement_line_id)
729                                 into l_oth_req_line
730                                 FROM
731                                   (SELECT l.requirement_line_id
732                                   FROM csp_requirement_headers h,
733                                         csp_requirement_lines l,
734                                         csp_req_line_details d
735                                   WHERE h.task_id             = p_task_id
736                                   AND h.task_assignment_id    = r_asgn.task_assignment_id
737                                   AND h.requirement_header_id = l.requirement_header_id
738                                   AND l.requirement_line_id   = d.requirement_line_id
739                                   MINUS
740                                   SELECT l.requirement_line_id
741                                   FROM csp_requirement_headers h,
742                                         csp_requirement_lines l,
743                                         csp_req_line_details d,
744                                         oe_order_lines_all oola
745                                   WHERE h.task_id             = p_task_id
746                                   AND h.task_assignment_id    = r_asgn.task_assignment_id
747                                   AND h.requirement_header_id = l.requirement_header_id
748                                   AND l.requirement_line_id   = d.requirement_line_id
749                                   AND d.source_type          = 'IO'
750                                   AND d.source_id = oola.line_id
751                                   AND csp_pick_utils.get_order_status(oola.line_id,oola.flow_status_code)          in ('SHIPPED', 'EXPECTED')
752                                   );
753 
754                                 if(FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) then
755                                   FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT,
756                                                                   'csp.plsql.CSP_SCH_INT_PVT.GET_AVAILABILITY_OPTIONS',
757                                                                   'l_oth_req_line = ' || l_oth_req_line);
758                                 end if;
759 
760                                 if l_oth_req_line > 0 then
761                                         x_return_status := FND_API.G_RET_STS_ERROR;
762                                         FND_MESSAGE.SET_NAME('CSP', 'CSP_SCH_NOT_CANCEL_ORDER');
763                                         FND_MSG_PUB.ADD;
764                                         fnd_msg_pub.count_and_get
765                                                         ( p_count => x_msg_count
766                                                         , p_data  => x_msg_data);
767                                         return;
768                                 end if;
769 
770                                 -- now check for non sourced lines
771                                 l_non_src_line := 0;
772                                 SELECT COUNT(requirement_line_id)
773                                 into l_non_src_line
774                                 FROM
775                                   (SELECT l.requirement_line_id
776                                   FROM csp_requirement_headers h,
777                                         csp_requirement_lines l
778                                   WHERE h.task_id             = p_task_id
779                                   AND h.task_assignment_id    = r_asgn.task_assignment_id
780                                   AND h.requirement_header_id = l.requirement_header_id
781                                   AND (SELECT COUNT (d.requirement_line_id)
782                                                                 FROM csp_req_line_details d
783                                                                 WHERE d.requirement_line_id = l.requirement_line_id) = 0
784                                   MINUS
785                                   SELECT l.requirement_line_id
786                                   FROM csp_requirement_headers h,
787                                         csp_requirement_lines l,
788                                         csp_req_line_details d,
789                                         oe_order_lines_all oola
790                                   WHERE h.task_id             = p_task_id
791                                   AND h.task_assignment_id    = r_asgn.task_assignment_id
792                                   AND h.requirement_header_id = l.requirement_header_id
793                                   AND l.requirement_line_id   = d.requirement_line_id
794                                   AND d.source_type          = 'IO'
795                                   AND d.source_id = oola.line_id
796                                   AND csp_pick_utils.get_order_status(oola.line_id,oola.flow_status_code)         in ('SHIPPED', 'EXPECTED')
797                                   );
798 
799                                 if(FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) then
800                                   FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT,
801                                                                   'csp.plsql.CSP_SCH_INT_PVT.GET_AVAILABILITY_OPTIONS',
802                                                                   'l_non_src_line = ' || l_non_src_line);
803                                 end if;
804 
805                                 if l_non_src_line = 0 then
806                                         l_old_arrival_date := null;
807                                         SELECT MAX(oel.request_date)
808                                         into l_old_arrival_date
809                                         FROM csp_requirement_headers h,
810                                           csp_requirement_lines l,
811                                           csp_req_line_details d,
812                                           oe_order_lines_all oel
813                                         WHERE h.task_id             = p_task_id
814                                         AND h.task_assignment_id    = r_asgn.task_assignment_id
815                                         AND h.requirement_header_id = l.requirement_header_id
816                                         AND l.requirement_line_id   = d.requirement_line_id
817                                         AND d.source_type          = 'IO'
818                                         AND csp_pick_utils.get_order_status(oel.line_id,oel.flow_status_code)       in ('SHIPPED', 'EXPECTED')
819                                         AND d.source_id             = oel.line_id;
820 
821                                         if(FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) then
822                                           FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT,
823                                                                           'csp.plsql.CSP_SCH_INT_PVT.GET_AVAILABILITY_OPTIONS',
824                                                                           'l_old_arrival_date = ' || to_char(nvl(l_old_arrival_date, sysdate), 'dd-MON-YYYY HH24:MI'));
825                                         end if;
826 
827                                         l_dest_ou := -999;
828                                         SELECT ch.destination_organization_id
829                                         into l_dest_ou
830                                         FROM csp_requirement_headers ch
831                                         WHERE ch.task_id                     = p_task_id
832                                         AND ch.task_assignment_id          = r_asgn.task_assignment_id
833                                         AND rownum                         = 1;
834 
835                                         x_options := CSP_SCH_INT_PVT.csp_sch_options_tbl_typ();
836                                         for res_count in 1..p_resources.count loop
837                                                 l_rs_ou := -999;
838                                                 open get_rs_ou(p_resources(res_count).resource_type, p_resources(res_count).resource_id);
839                                                 fetch get_rs_ou into l_rs_ou;
840                                                 close get_rs_ou;
841                                                 if(l_rs_ou <> -999 and l_rs_ou = l_dest_ou) then
842                                                         x_options.extend;
843                                                         x_options(x_options.count).resource_id   := p_resources(res_count).resource_id;
844                                                         x_options(x_options.count).resource_type := p_resources(res_count).resource_type;
845                                                         x_options(x_options.count).start_time    := l_old_arrival_date;
846                                                         x_options(x_options.count).transfer_cost := 0;
847                                                         x_options(x_options.count).missing_parts := 0;
848                                                         x_options(x_options.count).available_parts := 1;        -- not sure if required
849                                                         x_options(x_options.count).src_warehouse := '';
850                                                         x_options(x_options.count).ship_method := '';
851                                                         x_options(x_options.count).distance_str := '';
852                                                 end if;
853                                         end loop;
854                                         return;
855                                 end if;
856                         end if;
857                 end if;
858 
859 
860         if(FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) then
861           FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT,
862                           'csp.plsql.CSP_SCH_INT_PVT.GET_AVAILABILITY_OPTIONS',
863                           'before making call to CLEAN_REQUIREMENT...');
864         end if;
865 
866         CLEAN_REQUIREMENT(
867             p_api_version_number    => 1.0,
868             p_task_assignment_id    => r_asgn.task_assignment_id,
869             x_return_status => x_return_status,
870             x_msg_count => x_msg_count,
871             x_msg_data => x_msg_data
872             );
873 
874         if(FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) then
875           FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT,
876                           'csp.plsql.CSP_SCH_INT_PVT.GET_AVAILABILITY_OPTIONS',
877                           'after making call to CLEAN_REQUIREMENT... x_return_status = ' || x_return_status);
878         end if;
879 
880          IF x_return_status <> FND_API.G_RET_STS_SUCCESS THEN
881                         -- bug # 14084319
882                         -- handle a case where cancellation of an order is failed
883                         -- due to OM processing constraints
884                         if x_return_status = 'C' then
885 
886                                 if(FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) then
887                                   FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT,
888                                                                   'csp.plsql.CSP_SCH_INT_PVT.GET_AVAILABILITY_OPTIONS',
889                                                                   'handle a case where cancellation of an order is failed due to OM processing constraints');
890                                 end if;
891 
892                                 l_old_arrival_date := null;
893                                 SELECT MAX(oel.request_date)
894                                 into l_old_arrival_date
895                                 FROM csp_requirement_headers h,
896                                   csp_requirement_lines l,
897                                   csp_req_line_details d,
898                                   oe_order_lines_all oel
899                                 WHERE h.task_id             = p_task_id
900                                 AND h.task_assignment_id    = r_asgn.task_assignment_id
901                                 AND h.requirement_header_id = l.requirement_header_id
902                                 AND l.requirement_line_id   = d.requirement_line_id
903                                 AND d.source_type          = 'IO'
904                                 --AND csp_pick_utils.get_order_status(oel.line_id,oel.flow_status_code)       in ('SHIPPED', 'EXPECTED')
905                                 AND d.source_id             = oel.line_id;
906 
907                                 if(FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) then
908                                   FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT,
909                                                                   'csp.plsql.CSP_SCH_INT_PVT.GET_AVAILABILITY_OPTIONS',
910                                                                   'l_old_arrival_date = ' || to_char(nvl(l_old_arrival_date, sysdate), 'dd-MON-YYYY HH24:MI'));
911                                 end if;
912 
913                                 l_dest_ou := -999;
914                                 SELECT ch.destination_organization_id
915                                 into l_dest_ou
916                                 FROM csp_requirement_headers ch
917                                 WHERE ch.task_id                     = p_task_id
918                                 AND ch.task_assignment_id          = r_asgn.task_assignment_id
919                                 AND rownum                         = 1;
920 
921                                 x_options := CSP_SCH_INT_PVT.csp_sch_options_tbl_typ();
922                                 for res_count in 1..p_resources.count loop
923                                         l_rs_ou := -999;
924                                         open get_rs_ou(p_resources(res_count).resource_type, p_resources(res_count).resource_id);
925                                         fetch get_rs_ou into l_rs_ou;
926                                         close get_rs_ou;
927                                         if(l_rs_ou <> -999 and l_rs_ou = l_dest_ou) then
928                                                 x_options.extend;
929                                                 x_options(x_options.count).resource_id   := p_resources(res_count).resource_id;
930                                                 x_options(x_options.count).resource_type := p_resources(res_count).resource_type;
931                                                 x_options(x_options.count).start_time    := l_old_arrival_date;
932                                                 x_options(x_options.count).transfer_cost := 0;
933                                                 x_options(x_options.count).missing_parts := 0;
934                                                 x_options(x_options.count).available_parts := 1;        -- not sure if required
935                                                 x_options(x_options.count).src_warehouse := '';
936                                                 x_options(x_options.count).ship_method := '';
937                                                 x_options(x_options.count).distance_str := '';
938                                         end if;
939                                 end loop;
940                                 x_return_status := FND_API.G_RET_STS_SUCCESS;
941                                 return;
942                         end if;
943             return;
944          END IF;
945 
946     end loop;
947 
948     if nvl(l_search_method,'SPARES') <> 'ATP' then
949       SPARES_CHECK2(
950                p_resources     => p_resources,
951                p_task_id       => p_task_id,
952                p_need_by_date  => p_interval.latest_time,
953                p_trunk         => p_trunk,
954                p_warehouse     => p_warehouse,
955                p_mandatory     => p_mandatory,
956                x_options       => x_options,
957                x_return_status => x_return_status,
958                x_msg_data      => x_msg_data,
959                x_msg_count     => x_msg_count);
960 
961 
962           if(FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) then
963             FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT,
964                             'csp.plsql.CSP_SCH_INT_PVT.GET_AVAILABILITY_OPTIONS',
965                             'rollback to GET_AVAILABILITY_OPTIONS_SP');
966           end if;
967 
968         rollback to GET_AVAILABILITY_OPTIONS_SP;
969 
970         return;
971      end if;
972 
973         CSP_SCH_INT_PVT.GET_ORGANIZATION_SUBINV(p_resources, l_resource_org_subinv , x_return_status,x_msg_data,x_msg_count);
974 
975                 if(FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) then
976                   FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT,
977                                                   'csp.plsql.CSP_SCH_INT_PVT.GET_AVAILABILITY_OPTIONS',
978                                                   'After CSP_SCH_INT_PVT.GET_ORGANIZATION_SUBINV... x_return_status=' || x_return_status);
979                   FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT,
980                                                   'csp.plsql.CSP_SCH_INT_PVT.GET_AVAILABILITY_OPTIONS',
981                                                   'l_resource_org_subinv.count=' || l_resource_org_subinv.count);
982                 end if;
983 
984         IF x_return_status <> FND_API.G_RET_STS_SUCCESS THEN
985             RETURN;
986         END IF;
987 
988         CSP_SCH_INT_PVT.GET_PARTS_LIST(p_task_id,p_likelihood,l_parts_list,x_return_status,x_msg_data,x_msg_count);
989 
990                 if(FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) then
991                   FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT,
992                                                   'csp.plsql.CSP_SCH_INT_PVT.GET_AVAILABILITY_OPTIONS',
993                                                   'After CSP_SCH_INT_PVT.GET_PARTS_LIST... x_return_status=' || x_return_status);
994                   FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT,
995                                                   'csp.plsql.CSP_SCH_INT_PVT.GET_AVAILABILITY_OPTIONS',
996                                                   'l_parts_list.count=' || l_parts_list.count);
997                 end if;
998 
999         IF x_return_status <> FND_API.G_RET_STS_SUCCESS THEN
1000             RETURN;
1001         END IF;
1002 
1003         IF l_parts_list.count = 0 THEN
1004             x_return_status := FND_API.G_RET_STS_SUCCESS;
1005             for i in 1..l_parts_list.count loop
1006               l_total_parts := l_total_parts + l_parts_list(i).quantity;
1007             end loop;
1008             FOR I IN 1..p_resources.count LOOP
1009                 x_options.extend;
1010                 x_options(x_options.count).resource_id   := p_resources(I).resource_id;
1011                 x_options(x_options.count).resource_type := p_resources(I).resource_type;
1012                 x_options(x_options.count).start_time    := p_interval.earliest_time;
1013                 x_options(x_options.count).transfer_cost := NULL;
1014                 x_options(x_options.count).missing_parts := 0;
1015                 x_options(x_options.count).available_parts := l_total_parts;
1016             END LOOP;
1017             RETURN;
1018         END IF;
1019 
1020          IF l_parts_list.count > 0 THEN
1021               CSP_SCH_INT_PVT.CHECK_LOCAl_INVENTORY(l_resource_org_subinv,l_parts_list,p_trunk,l_unavailable_list,l_final_available_list,x_return_status,x_msg_data,x_msg_count);
1022 
1023                         if(FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) then
1024                           FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT,
1025                                                           'csp.plsql.CSP_SCH_INT_PVT.GET_AVAILABILITY_OPTIONS',
1026                                                           'After CSP_SCH_INT_PVT.CHECK_LOCAl_INVENTORY... x_return_status=' || x_return_status);
1027                           FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT,
1028                                                           'csp.plsql.CSP_SCH_INT_PVT.GET_AVAILABILITY_OPTIONS',
1029                                                           'l_unavailable_list.count=' || l_unavailable_list.count);
1030                           FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT,
1031                                                           'csp.plsql.CSP_SCH_INT_PVT.GET_AVAILABILITY_OPTIONS',
1032                                                           'l_final_available_list.count=' || l_final_available_list.count);
1033                         end if;
1034 
1035               IF x_return_status <> FND_API.G_RET_STS_SUCCESS THEN
1036                   RETURN;
1037               END IF ;
1038 
1039             if p_trunk and not p_mandatory then
1040               for i in 1..p_resources.count loop
1041                 x_options.extend;
1042                 x_options(i).resource_id := p_resources(i).resource_id;
1043                 x_options(i).resource_type := p_resources(i).resource_type;
1044                 x_options(i).start_time := null;
1045                 x_options(i).transfer_cost := 0;
1046                 x_options(i).missing_parts := 0;
1047                 x_options(i).available_parts := 0;
1048                 for j in 1..l_unavailable_list.count loop
1049                   if p_resources(i).resource_id =
1050 l_unavailable_list(j).resource_id and
1051                      p_resources(i).resource_type =
1052 l_unavailable_list(j).resource_type then
1053                     x_options(i).missing_parts := x_options(i).missing_parts +
1054 l_unavailable_list(j).quantity;
1055                     x_options(i).transfer_cost := -1;
1056                   end if;
1057                 end loop;
1058                 for j in 1..l_final_available_list.count loop
1059                   if p_resources(i).resource_id =
1060 l_final_available_list(j).resource_id and
1061                      p_resources(i).resource_type =
1062 l_final_available_list(j).resource_type then
1063                     x_options(i).available_parts := x_options(i).available_parts +
1064 l_final_available_list(j).quantity;
1065                     x_options(i).start_time := sysdate;
1066                   end if;
1067                 end loop;
1068               end loop;
1069               return;
1070             end if;
1071 
1072            if nvl(l_search_method,'SPARES') <> 'ATP' and nvl(p_warehouse,FALSE)
1073               and l_unavailable_list.count >= 1 then
1074 
1075                                 if(FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) then
1076                                   FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT,
1077                                                                   'csp.plsql.CSP_SCH_INT_PVT.GET_AVAILABILITY_OPTIONS',
1078                                                                   'Before calling CSP_SCH_INT_PVT.SPARES_CHECK...');
1079                                 end if;
1080 
1081               CSP_SCH_INT_PVT.SPARES_CHECK(l_unavailable_list,p_interval,l_available_list,l_final_unavailable_list,x_return_status,x_msg_data,x_msg_count);
1082 
1083                                 if(FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) then
1084                                   FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT,
1085                                                                   'csp.plsql.CSP_SCH_INT_PVT.GET_AVAILABILITY_OPTIONS',
1086                                                                   'After CSP_SCH_INT_PVT.SPARES_CHECK... x_return_status=' || x_return_status);
1087                                   FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT,
1088                                                                   'csp.plsql.CSP_SCH_INT_PVT.GET_AVAILABILITY_OPTIONS',
1089                                                                   'l_unavailable_list.count=' || l_unavailable_list.count);
1090                                   FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT,
1091                                                                   'csp.plsql.CSP_SCH_INT_PVT.GET_AVAILABILITY_OPTIONS',
1092                                                                   'l_available_list.count=' || l_available_list.count);
1093                                   FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT,
1094                                                                   'csp.plsql.CSP_SCH_INT_PVT.GET_AVAILABILITY_OPTIONS',
1095                                                                   'l_final_unavailable_list.count=' || l_final_unavailable_list.count);
1096                                 end if;
1097 
1098             elsif  (l_unavailable_list.count > 0 AND (NOT l_subinv_only) AND
1099             (fnd_profile.value(name => 'CSP_CHECK_ATP')= 'ALWAYS' or
1100                       fnd_profile.value(name => 'CSP_CHECK_ATP')= 'SCHONLY' )) or
1101                 (l_unavailable_list.count > 0 and nvl(p_warehouse,FALSE)) THEN
1102                 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);
1103             ELSE
1104                 l_final_unavailable_list := l_unavailable_list;
1105             END IF;
1106 
1107             IF x_return_status <> FND_API.G_RET_STS_SUCCESS  THEN
1108                 RETURN;
1109             END IF;
1110 
1111              If l_available_list.count > 0 THEN
1112                FOR gli in get_line_id LOOP
1113                         FOR J IN 1..l_available_list.count LOOP
1114                           FOR I IN 1..p_resources.count LOOP
1115                             IF l_available_list(J).resource_id = p_resources(I).resource_id
1116                                 and l_available_list(J).resource_type = p_resources(I).resource_type
1117                                 and l_available_list(J).line_id = gli.req_line_id THEN
1118                                 l_final_available_list.extend;
1119                                 l_final_available_list(l_final_available_list.count) := l_available_list(J);
1120 
1121                                                                 if(FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) then
1122                                                                   FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT,
1123                                                                                                   'csp.plsql.CSP_SCH_INT_PVT.GET_AVAILABILITY_OPTIONS',
1124                                                                                                   'Got available data... l_final_available_list.count=' || l_final_available_list.count);
1125                                                                 end if;
1126 
1127                                 EXIT;
1128                             END IF;
1129                         END LOOP;
1130                     END LOOP;
1131                 END LOOP;
1132              END IF;
1133 
1134             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);
1135 
1136                         if(FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) then
1137                           FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT,
1138                                                           'csp.plsql.CSP_SCH_INT_PVT.GET_AVAILABILITY_OPTIONS',
1139                                                           'After CSP_SCH_INT_PVT.ELIGIBLE_RESOURCES... x_return_status=' || x_return_status);
1140                           FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT,
1141                                                           'csp.plsql.CSP_SCH_INT_PVT.GET_AVAILABILITY_OPTIONS',
1142                                                           'l_eligible_resources_list.count=' || l_eligible_resources_list.count);
1143                         end if;
1144 
1145             IF x_return_status <> FND_API.G_RET_STS_SUCCESS  THEN
1146                 RETURN;
1147             END IF;
1148 
1149             IF l_eligible_resources_list.count > 0 THEN
1150 
1151                            CSP_SCH_INT_PVT.GET_TIME_COST(l_eligible_resources_list,x_options,x_return_status,x_msg_data,x_msg_count);
1152 
1153                                 if(FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) then
1154                                   FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT,
1155                                                                   'csp.plsql.CSP_SCH_INT_PVT.GET_AVAILABILITY_OPTIONS',
1156                                                                   'After CSP_SCH_INT_PVT.GET_TIME_COST... x_return_status=' || x_return_status);
1157                                   FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT,
1158                                                                   'csp.plsql.CSP_SCH_INT_PVT.GET_AVAILABILITY_OPTIONS',
1159                                                                   'l_eligible_resources_list.count=' || l_eligible_resources_list.count);
1160                                   FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT,
1161                                                                   'csp.plsql.CSP_SCH_INT_PVT.GET_AVAILABILITY_OPTIONS',
1162                                                                   'x_options.count=' || x_options.count);
1163                                 end if;
1164 
1165                            IF x_return_status <> FND_API.G_RET_STS_SUCCESS  THEN
1166                     RETURN;
1167                 /*ELSE
1168                     IF x_options.count = 0 THEN
1169                         x_return_status := FND_API.G_RET_STS_ERROR;
1170                         l_del_date := to_char(g_earliest_delivery_date,'MM-DD-YYYY HH24:MI:SS');
1171                         FND_MESSAGE.SET_NAME('CSP', 'CSP_SCH_DEL');
1172                         FND_MESSAGE.SET_TOKEN('DDATE', l_del_date, TRUE);
1173                         FND_MSG_PUB.ADD;
1174                         fnd_msg_pub.count_and_get
1175                          ( p_count => x_msg_count
1176                          , p_data  => x_msg_data);
1177                     END IF;*/
1178                 END IF;
1179             ELSE
1180                 x_return_status := FND_API.G_RET_STS_ERROR;
1181                 FND_MESSAGE.SET_NAME('CSP', 'CSP_SCH_NO_PARTS');
1182                 FND_MSG_PUB.ADD;
1183                 fnd_msg_pub.count_and_get
1184                     ( p_count => x_msg_count
1185                     , p_data  => x_msg_data);
1186             END IF;
1187        ELSE
1188             FOR I IN 1..p_resources.count LOOP
1189                 x_options.extend;
1190                 x_options(x_options.count).resource_id   := p_resources(I).resource_id;
1191                 x_options(x_options.count).resource_type := p_resources(I).resource_type;
1192                 x_options(x_options.count).start_time    := p_interval.earliest_time;
1193                 x_options(x_options.count).transfer_cost := 0;
1194                 x_options(x_options.count).missing_parts := 0;
1195                 x_options(x_options.count).available_parts := 0;
1196             END LOOP;
1197         END IF;
1198         EXCEPTION
1199         WHEN OTHERS THEN
1200             FND_MESSAGE.SET_NAME('CSP', 'CSP_UNEXPECTED_EXEC_ERRORS');
1201             FND_MESSAGE.SET_TOKEN('ROUTINE', l_api_name, FALSE);
1202             FND_MESSAGE.SET_TOKEN('SQLERRM', sqlerrm, FALSE);
1203             FND_MSG_PUB.ADD;
1204             fnd_msg_pub.count_and_get
1205               ( p_count => x_msg_count
1206               , p_data  => x_msg_data);
1207             x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
1208             return;
1209    END GET_AVAILABILITY_OPTIONS;
1210 
1211    PROCEDURE CHOOSE_OPTION(p_api_version_number IN  NUMBER
1212                           ,p_task_id            IN  NUMBER
1213                           ,p_task_assignment_id IN  NUMBER
1214                           ,p_likelihood         IN  NUMBER
1215                           ,p_mandatory          IN  BOOLEAN
1216                           ,p_trunk              IN  BOOLEAN
1217                           ,p_warehouse          IN  BOOLEAN
1218                           ,p_options            IN  CSP_SCH_INT_PVT.csp_sch_options_rec_typ
1219                           ,x_return_status      OUT NOCOPY VARCHAR2
1220                           ,x_msg_data           OUT NOCOPY VARCHAR2
1221                           ,x_msg_count          OUT NOCOPY NUMBER) IS
1222 
1223           CURSOR C2  IS
1224         SELECT crh.REQUIREMENT_HEADER_ID,crh.address_type
1225         FROM   CSP_REQUIREMENT_HEADERS crh
1226         WHERE  crh.TASK_ID = p_task_id;
1227 
1228         cursor  c_accepted_flag is
1229         select  nvl(jtsv.accepted_flag,'N')
1230         from    jtf_task_statuses_vl jtsv,
1231                 jtf_task_assignments jta
1232         where   jta.task_assignment_id = p_task_assignment_id
1233         and     jtsv.task_status_id = jta.assignment_status_id;
1234 
1235         CURSOR  csp_resource_org(c_resource_id number, c_resource_type varchar2) IS
1236         SELECT  ORGANIZATION_ID, SUBINVENTORY_CODE
1237         FROM    CSP_INV_LOC_ASSIGNMENTS
1238         WHERE   RESOURCE_ID = c_resource_id
1239         AND     RESOURCE_TYPE = c_resource_type
1240         AND     DEFAULT_CODE = 'IN' ;
1241 
1242         CURSOR  csp_ship_to_location(c_resource_id number, c_resource_type varchar2) IS
1243         SELECT  SHIP_TO_LOCATION_ID
1244         FROM    CSP_RS_SHIP_TO_ADDRESSES_ALL_V
1245         WHERE   RESOURCE_ID = c_resource_id
1246         AND     RESOURCE_TYPE = c_resource_type
1247         AND     PRIMARY_FLAG = 'Y'
1248         AND     status        = 'A'
1249         AND     rownum        = 1;
1250 
1251         cursor c_scheduled_start is
1252         select scheduled_start_date
1253         from   jtf_tasks_b
1254         where  task_id = p_task_id;
1255 
1256         cursor c_available_parts(p_task_id number) is
1257         select distinct capt.supplied_item_id,
1258                capt.supplied_quantity,
1259                msib.primary_uom_code,
1260                capt.supplied_item_rev,
1261                capt.organization_id,
1262                capt.subinventory_code,
1263                capt.source_type_code,
1264                capt.shipping_method,
1265                ood.operating_unit,
1266                crl.requirement_line_id,
1267                crh.destination_organization_id,
1268                crh.destination_subinventory,
1269                crh.ship_to_location_id
1270         from   csp_available_parts_temp capt,
1271                org_organization_definitions ood,
1272                csp_requirement_lines crl,
1273                csp_requirement_headers crh,
1274                mtl_system_items_b msib
1275         where  ood.organization_id = capt.organization_id
1276         and    crl.requirement_header_id = crh.requirement_header_id
1277         and    crl.inventory_item_id = capt.required_item_id
1278         and    msib.organization_id = capt.organization_id
1279         and    msib.inventory_item_id = capt.supplied_item_id
1280         and    crh.task_id = p_task_id
1281         order by ood.operating_unit;
1282 
1283         l_interval                CSP_SCH_INT_PVT.csp_sch_interval_rec_typ;
1284         l_resources               CSP_SCH_INT_PVT.csp_sch_resource_tbl_typ;
1285         l_resource_org_subinv     CSP_SCH_INT_PVT.CSP_RESOURCE_ORG_tbl_TYP;
1286         l_parts_list              CSP_SCH_INT_PVT.CSP_PARTS_TBL_TYP1 ;
1287         l_unavailable_list        CSP_SCH_INT_PVT.CSP_UNAVAILABILITY_TBL_TYPE ;
1288         l_available_list          CSP_SCH_INT_PVT.CSP_AVAILABILITY_TBL_TYPE ;
1289         l_eligible_resources_list CSP_SCH_INT_PVT.CSP_AVAILABILITY_TBL_TYPE ;
1290         l_final_unavailable_list  CSP_SCH_INT_PVT.CSP_UNAVAILABILITY_TBL_TYPE ;
1291         l_options                 CSP_SCH_INT_PVT.CSP_SHIP_PARAMETERS_TBL_TYPE;
1292         l_ship_count              CSP_SCH_INT_PVT.CSP_SHIP_METHOD_COUNT_TBL_TYP;
1293         l_return_status           VARCHAR2(128);
1294         l_temp_options            CSP_SCH_INT_PVT.CSP_SHIP_PARAMETERS_TBL_TYPE ;
1295         min_cost                  NUMBER ;
1296         l_final_option            CSP_SCH_INT_PVT.CSP_SHIP_PARAMETERS_TBL_TYPE ;
1297         l_reservation_parts       CSP_SCH_INT_PVT.RESERVATION_REC_TYP;
1298         l_org_ship_methode        org_ship_methodes_tbl_type ;
1299        -- l_Requirement_Line_Tbl    CSP_Requirement_Lines_PVT.Requirement_Line_Tbl_Type;
1300         l_res_ship_parameters     CSP_SCH_INT_PVT.CSP_ORGS_SHIP_PARAM_TBL_TYPE;
1301         l_requirement_header      CSP_Requirement_Headers_PVT.REQUIREMENT_HEADER_Rec_Type;
1302         l_parts_header             csp_parts_requirement.Header_rec_type;
1303         l_parts_lines              csp_parts_requirement.Line_Tbl_type;
1304         l_revision                varchar2(3);
1305         l_ship_set                varchar2(3);
1306         g_arrival_date            DATE;
1307         current_position          NUMBER;
1308         previous_position         NUMBER;
1309         str_length                NUMBER;
1310         l_reservation_id          NUMBER;
1311         l_requirements_line_id    NUMBER;
1312         req_loop                  NUMBER := 1;
1313         l_requirement_header_id   NUMBER;
1314         l_api_name                varchar2(60) := 'CSP_SCH_INT_PVT.CHOOSE_OPTION';
1315         l_msg varchar2(2000);
1316         rec_count                 NUMBER := 1;
1317         l_destination_sub_inv     varchar2(30) := null;
1318         l_destination_org_id      NUMBER := null;
1319         l_ship_to_location_id     NUMBER;
1320         l_ship_methode_count      NUMBER;
1321         l_temp_line_id            NUMBER;
1322         l_final_available_list    CSP_SCH_INT_PVT.CSP_AVAILABILITY_TBL_TYPE ;
1323         l_req_line_details_tbl    CSP_SCH_INT_PVT.csp_req_line_details_tabl_typ;
1324         l_address_type            varchar2(3);
1325         --hehxxx
1326         l_search_method           varchar2(30) := fnd_profile.value('CSP_PART_SEARCH_METHOD_SCHEDULER');
1327         x_options                 CSP_SCH_INT_PVT.csp_sch_options_tbl_typ;
1328         l_req_line_details_id     number := null;
1329         l_old_operating_unit      number := null;
1330         l_book_order              varchar2(30) := fnd_profile.value('CSP_INIT_IO_STATUS');
1331         l_need_by_date            date := null;
1332 
1333         cursor get_asgn_id is
1334         select task_assignment_id
1335         from jtf_task_assignments
1336         where task_id = p_task_id;
1337 
1338         l_task_asgn_id number;
1339                 l_fl_rcvd_lines number;
1340                 l_shpd_lines number;
1341 
1342                 cursor c_parts_req (v_task_id number, v_task_assignment_id number) is
1343                 select requirement_header_id
1344                 from csp_requirement_headers
1345                 where task_id = v_task_id
1346                 and task_assignment_id = v_task_assignment_id;
1347 
1348                 l_resource_name varchar2(200);
1349                 l_resource_type_name varchar2(100);
1350    BEGIN
1351         savepoint choose_options;
1352 
1353         log('choose_option','Begin...');
1354 
1355                 open  csp_resource_org(p_options.resource_id, p_options.resource_type);
1356                 fetch csp_resource_org into l_destination_org_id, l_destination_sub_inv;
1357                 close csp_resource_org;
1358 
1359                 log('choose_option', 'l_destination_org_id=' || l_destination_org_id);
1360                 log('choose_option', 'l_destination_sub_inv=' || l_destination_sub_inv);
1361 
1362                 if l_destination_org_id is null or l_destination_sub_inv is null then
1363                         SELECT NAME
1364                         INTO l_resource_type_name
1365                         FROM JTF_OBJECTS_VL
1366                         WHERE OBJECT_CODE = p_options.resource_type;
1367                         l_resource_name := csp_pick_utils.get_object_name(p_options.resource_type, p_options.resource_id);
1368                         FND_MESSAGE.SET_NAME('CSP', 'CSP_SCH_DEFAULT_SUBINV');
1369                         FND_MESSAGE.SET_TOKEN('RESOURCE_TYPE',l_resource_type_name, FALSE);
1370                         FND_MESSAGE.SET_TOKEN('RESOURCE_NAME',l_resource_name, FALSE);
1371                         FND_MSG_PUB.ADD;
1372                         fnd_msg_pub.count_and_get( p_count => x_msg_count
1373                                                                          , p_data  => x_msg_data);
1374                         x_return_status := FND_API.G_RET_STS_ERROR;
1375                         return;
1376                 end if;
1377 
1378         for r_asgn in get_asgn_id loop
1379             l_task_asgn_id := r_asgn.task_assignment_id;
1380 
1381                         -- case 1: if the part is already received at task/customer address
1382                         -- first find out all RES created after receiving
1383                         -- read item, qty and src org/subinv information from the RES
1384                         -- release the RES
1385                         -- do part transfer using direct inter-org transfer or subinv transfer
1386                         -- create a new reservation for new destination org/subinv
1387                         -- link the RES to req_line
1388 
1389                         l_fl_rcvd_lines := 0;
1390                         SELECT COUNT(l.requirement_line_id)
1391                         into l_fl_rcvd_lines
1392                         FROM csp_requirement_headers h,
1393                           csp_requirement_lines l,
1394                           csp_req_line_details dio,
1395                           csp_req_line_details dres,
1396                           oe_order_lines_all oola,
1397                           mtl_reservations mr
1398                         WHERE h.task_id             = p_task_id
1399                         AND h.task_assignment_id    = r_asgn.task_assignment_id
1400                         AND h.address_type         IN ('T', 'C', 'P')
1401                         AND h.requirement_header_id = l.requirement_header_id
1402                         AND l.requirement_line_id   = dio.requirement_line_id
1403                         AND dio.source_type        = 'IO'
1404                         AND dio.source_id = oola.line_id
1405                         AND  csp_pick_utils.get_order_status(oola.line_id,oola.flow_status_code)      = 'FULLY RECEIVED'
1406                         AND dio.requirement_line_id = dres.requirement_line_id
1407                         AND oola.inventory_item_id    = mr.inventory_item_id
1408                         AND oola.ordered_quantity   = mr.reservation_quantity
1409                         AND dres.source_type       = 'RES'
1410                         AND dres.source_id = mr.reservation_id;
1411 
1412                         log('choose_option', 'l_fl_rcvd_lines=' || l_fl_rcvd_lines);
1413 
1414                         if l_fl_rcvd_lines > 0 then
1415                                 log('choose_option', 'before calling move_parts_on_reassign...');
1416                                 move_parts_on_reassign(
1417                                         p_task_id => p_task_id,
1418                                         p_task_asgn_id => r_asgn.task_assignment_id,
1419                                         p_new_task_asgn_id => p_task_assignment_id,
1420                                         p_new_need_by_date => p_options.start_time,
1421                                         p_new_resource_id => p_options.resource_id,
1422                                         p_new_resource_type => p_options.resource_type,
1423                                         x_return_status => x_return_status,
1424                                         x_msg_count => x_msg_count,
1425                                         x_msg_data => x_msg_data
1426                                 );
1427                                 log('choose_option', 'after calling move_parts_on_reassign...x_return_status=' || x_return_status);
1428                                 if x_return_status <> FND_API.G_RET_STS_SUCCESS then
1429                                         x_return_status := FND_API.G_RET_STS_ERROR;
1430                                         FND_MESSAGE.SET_NAME('CSP', 'CSP_SCH_NOT_CANCEL_ORDER');
1431                                         FND_MSG_PUB.ADD;
1432                                         fnd_msg_pub.count_and_get
1433                                                         ( p_count => x_msg_count
1434                                                         , p_data  => x_msg_data);
1435                                 end if;
1436                                 return;
1437                         end if;
1438 
1439                         -- case 2: Part is already shipped and we cannot cancel the internal order
1440                         -- if the task type is Task or Customer, we should allow reassignment with same
1441                         -- inventory org and let second resource receive it
1442                         l_shpd_lines := 0;
1443                         SELECT COUNT(l.requirement_line_id)
1444                         into l_shpd_lines
1445                         FROM csp_requirement_headers h,
1446                           csp_requirement_lines l,
1447                           csp_req_line_details d,
1448                           oe_order_lines_all oola
1449                         WHERE h.task_id             = p_task_id
1450                         AND h.task_assignment_id    = r_asgn.task_assignment_id
1451                         AND h.requirement_header_id = l.requirement_header_id
1452                         and h.address_type in ('C', 'T', 'P')
1453                         AND l.requirement_line_id   = d.requirement_line_id
1454                         AND d.source_type          = 'IO'
1455                         AND d.source_id = oola.line_id
1456                         AND csp_pick_utils.get_order_status(oola.line_id,oola.flow_status_code)        in ('SHIPPED', 'EXPECTED');
1457 
1458                         log('choose_option', 'l_shpd_lines=' || l_shpd_lines);
1459 
1460                         if l_shpd_lines > 0 then
1461                                 for cr in c_parts_req(p_task_id, r_asgn.task_assignment_id)
1462                                 loop
1463                                         l_requirement_header := CSP_Requirement_headers_PVT.G_MISS_REQUIREMENT_HEADER_REC;
1464                                         l_requirement_header.requirement_header_id := cr.requirement_header_id;
1465                                         l_requirement_header.need_by_date := p_options.start_time;
1466                                         l_requirement_header.task_assignment_id := p_task_assignment_id ;
1467                                         l_requirement_header.last_update_date := sysdate;
1468                                         l_requirement_header.destination_organization_id := l_destination_org_id;
1469                                         l_requirement_header.destination_subinventory := l_destination_sub_inv;
1470                                         l_requirement_header.resource_type := p_options.resource_type;
1471                                         l_requirement_header.resource_id := p_options.resource_id;
1472 
1473                                         log('choose_option','task_assignment_id:'||l_requirement_header.task_assignment_id);
1474                                         log('choose_option','dest_organization_id:'||l_requirement_header.destination_organization_id);
1475                                         log('choose_option','dest_subinventory:'||l_requirement_header.destination_subinventory);
1476                                         log('choose_option','resource_type:'||l_requirement_header.resource_type);
1477                                         log('choose_option','resource_id:'||l_requirement_header.resource_id);
1478                                         log('choose_option','start_time:'||to_char(l_requirement_header.need_by_date,'dd-mon-yyyy hh24:mi:ss'));
1479 
1480                                         log('choose_option', 'before calling Update_requirement_headers...');
1481                                         CSP_Requirement_Headers_PVT.Update_requirement_headers(
1482                                                                         P_Api_Version_Number         => 1.0,
1483                                                                         P_Init_Msg_List              => FND_API.G_FALSE,
1484                                                                         P_Commit                     => FND_API.G_FALSE,
1485                                                                         p_validation_level           => FND_API.G_VALID_LEVEL_FULL,
1486                                                                         P_REQUIREMENT_HEADER_Rec     => l_requirement_header,
1487                                                                         X_Return_Status              => x_return_status,
1488                                                                         X_Msg_Count                  => x_msg_count,
1489                                                                         x_msg_data                   => x_msg_data
1490                                                                         );
1491                                         log('choose_option', 'before calling Update_requirement_headers...x_return_status=' || x_return_status);
1492 
1493                                         if x_return_status <> FND_API.G_RET_STS_SUCCESS then
1494                                                 x_return_status := FND_API.G_RET_STS_ERROR;
1495                                                 FND_MESSAGE.SET_NAME('CSP', 'CSP_SCH_NOT_CANCEL_ORDER');
1496                                                 FND_MSG_PUB.ADD;
1497                                                 fnd_msg_pub.count_and_get
1498                                                                 ( p_count => x_msg_count
1499                                                                 , p_data  => x_msg_data);
1500                                                 return;
1501                                         end if;
1502                                 end loop;
1503                                 return;
1504                         end if;
1505 
1506 
1507             log('choose_option','l_task_asgn_id = ' || l_task_asgn_id);
1508             log('choose_option','before making call to CLEAN_REQUIREMENT...');
1509 
1510             CLEAN_REQUIREMENT(
1511                 p_api_version_number    => 1.0,
1512                 p_task_assignment_id    => l_task_asgn_id,
1513                 x_return_status => x_return_status,
1514                 x_msg_count => x_msg_count,
1515                 x_msg_data => x_msg_data
1516                 );
1517 
1518             log('choose_option', 'after making call to CLEAN_REQUIREMENT... x_return_status = ' || x_return_status);
1519 
1520              IF x_return_status <> FND_API.G_RET_STS_SUCCESS THEN
1521                                 if x_return_status = 'C' then
1522                                         for cr in c_parts_req(p_task_id, r_asgn.task_assignment_id)
1523                                         loop
1524                                                 l_requirement_header := CSP_Requirement_headers_PVT.G_MISS_REQUIREMENT_HEADER_REC;
1525                                                 l_requirement_header.requirement_header_id := cr.requirement_header_id;
1526                                                 l_requirement_header.need_by_date := p_options.start_time;
1527                                                 l_requirement_header.task_assignment_id := p_task_assignment_id ;
1528                                                 l_requirement_header.last_update_date := sysdate;
1529                                                 l_requirement_header.destination_organization_id := l_destination_org_id;
1530                                                 l_requirement_header.destination_subinventory := l_destination_sub_inv;
1531                                                 l_requirement_header.resource_type := p_options.resource_type;
1532                                                 l_requirement_header.resource_id := p_options.resource_id;
1533 
1534                                                 log('choose_option','task_assignment_id:'||l_requirement_header.task_assignment_id);
1535                                                 log('choose_option','dest_organization_id:'||l_requirement_header.destination_organization_id);
1536                                                 log('choose_option','dest_subinventory:'||l_requirement_header.destination_subinventory);
1537                                                 log('choose_option','resource_type:'||l_requirement_header.resource_type);
1538                                                 log('choose_option','resource_id:'||l_requirement_header.resource_id);
1539                                                 log('choose_option','start_time:'||to_char(l_requirement_header.need_by_date,'dd-mon-yyyy hh24:mi:ss'));
1540 
1541                                                 log('choose_option', 'before calling Update_requirement_headers...');
1542                                                 CSP_Requirement_Headers_PVT.Update_requirement_headers(
1543                                                                                 P_Api_Version_Number         => 1.0,
1544                                                                                 P_Init_Msg_List              => FND_API.G_FALSE,
1545                                                                                 P_Commit                     => FND_API.G_FALSE,
1546                                                                                 p_validation_level           => FND_API.G_VALID_LEVEL_FULL,
1547                                                                                 P_REQUIREMENT_HEADER_Rec     => l_requirement_header,
1548                                                                                 X_Return_Status              => x_return_status,
1549                                                                                 X_Msg_Count                  => x_msg_count,
1550                                                                                 x_msg_data                   => x_msg_data
1551                                                                                 );
1552                                                 log('choose_option', 'before calling Update_requirement_headers...x_return_status=' || x_return_status);
1553 
1554                                                 if x_return_status <> FND_API.G_RET_STS_SUCCESS then
1555                                                         x_return_status := FND_API.G_RET_STS_ERROR;
1556                                                         FND_MESSAGE.SET_NAME('CSP', 'CSP_SCH_NOT_CANCEL_ORDER');
1557                                                         FND_MSG_PUB.ADD;
1558                                                         fnd_msg_pub.count_and_get
1559                                                                         ( p_count => x_msg_count
1560                                                                         , p_data  => x_msg_data);
1561                                                         return;
1562                                                 end if;
1563                                         end loop;
1564                                         x_return_status := FND_API.G_RET_STS_SUCCESS;
1565                                         return;
1566                                 end if;
1567                 return;
1568              END IF;
1569 
1570         end loop;
1571 
1572         x_return_status           := FND_API.G_RET_STS_SUCCESS ;
1573         l_resources               := CSP_SCH_INT_PVT.csp_sch_resource_tbl_typ();
1574          l_resource_org_subinv    := CSP_SCH_INT_PVT.CSP_RESOURCE_ORG_tbl_TYP();
1575         --l_parts_list              := CSP_SCH_INT_PVT.CSP_PARTS_TBL_TYPE();
1576         l_unavailable_list        := CSP_SCH_INT_PVT.CSP_UNAVAILABILITY_TBL_TYPE();
1577         l_available_list          := CSP_SCH_INT_PVT.CSP_AVAILABILITY_TBL_TYPE ();
1578         l_eligible_resources_list := CSP_SCH_INT_PVT.CSP_AVAILABILITY_TBL_TYPE() ;
1579         l_final_unavailable_list  := CSP_SCH_INT_PVT.CSP_UNAVAILABILITY_TBL_TYPE();
1580         l_resources               := CSP_SCH_INT_PVT.csp_sch_resource_tbl_typ();
1581         l_options                 := CSP_SCH_INT_PVT.CSP_SHIP_PARAMETERS_TBL_TYPE();
1582         l_ship_count              := CSP_SCH_INT_PVT.CSP_SHIP_METHOD_COUNT_TBL_TYP();
1583         l_temp_options            := CSP_SCH_INT_PVT.CSP_SHIP_PARAMETERS_TBL_TYPE() ;
1584         l_final_option            := CSP_SCH_INT_PVT.CSP_SHIP_PARAMETERS_TBL_TYPE() ;
1585         l_res_ship_parameters     := CSP_SCH_INT_PVT.CSP_ORGS_SHIP_PARAM_TBL_TYPE();
1586         l_org_ship_methode        := org_ship_methodes_tbl_type();
1587         l_req_line_details_tbl    := CSP_SCH_INT_PVT.csp_req_line_details_tabl_typ();
1588 
1589         l_resources.extend;
1590         l_resources(1).resource_id   := p_options.resource_id ;
1591         l_resources(1).resource_type := p_options.resource_type ;
1592        -- l_interval.earliest_time     :=
1593         l_interval.latest_time       := p_options.start_time;
1594 
1595 
1596         if nvl(l_search_method,'SPARES') <> 'ATP' then
1597           if nvl(l_book_order,'B') = 'E' then
1598             l_book_order := 'N';
1599             -- if task assignment is accepted, create order in booked status
1600             open  c_accepted_flag;
1601             fetch c_accepted_flag into l_book_order;
1602             close c_accepted_flag;
1603           else
1604             l_book_order := 'Y';
1605           end if;
1606           open  c_scheduled_start;
1607           fetch c_scheduled_start into l_need_by_date;
1608           close c_scheduled_start;
1609           x_options := CSP_SCH_INT_PVT.csp_sch_options_tbl_typ();
1610           SPARES_CHECK2(
1611                p_resources     => l_resources,
1612                p_task_id       => p_task_id,
1613                p_need_by_date  => p_options.start_time+1/144,
1614                p_trunk         => p_trunk,
1615                p_warehouse     => p_warehouse,
1616                p_mandatory     => p_mandatory,
1617                x_options       => x_options,
1618                x_return_status => x_return_status,
1619                x_msg_data      => x_msg_data,
1620                x_msg_count     => x_msg_count);
1621 
1622 
1623                         if(x_options.count = 0) then
1624                                 x_return_status := FND_API.G_RET_STS_ERROR;
1625                                 FND_MESSAGE.SET_NAME('CSP', 'CSP_SCH_OPTION_NOT_VALIED');
1626                                 FND_MSG_PUB.ADD;
1627                                 fnd_msg_pub.count_and_get
1628                                   ( p_count => x_msg_count
1629                                   , p_data  => x_msg_data);
1630                                   return;
1631                         end if;
1632 
1633           log('choose_option','x_options(1).transfer_cost'||x_options(1).transfer_cost);
1634           log('choose_option','p_options.transfer_cost'||p_options.transfer_cost);
1635           log('choose_option','x_options(1).start_time'||to_char(x_options(1).start_time,'dd-mon-yyyy hh24:mi:ss'));
1636           log('choose_option','p_options.start_time'||to_char(p_options.start_time+1/144,'dd-mon-yyyy hh24:mi:ss'));
1637 
1638 
1639 
1640           if x_options(1).transfer_cost <= p_options.transfer_cost and
1641             x_options(1).start_time <= p_options.start_time+1/144 then
1642             -- Loop csp_available_parts_temp
1643             for cap in c_available_parts(p_task_id) loop
1644                 l_ship_to_location_id := cap.ship_to_location_id;
1645 
1646                 log('choose_option','l_destination_org_id:'||l_destination_org_id);
1647                 log('choose_option','cap.destination_organization_id:'||cap.destination_organization_id);
1648                 log('choose_option','cap.destination_subinventory:'||cap.destination_subinventory);
1649                 log('choose_option','l_ship_to_location_id:'||l_ship_to_location_id);
1650 
1651                 if l_destination_org_id is null and cap.destination_organization_id is null then
1652                   open  csp_resource_org(l_resources(1).resource_id, l_resources(1).resource_type);
1653                   fetch csp_resource_org into l_destination_org_id, l_destination_sub_inv;
1654                   close csp_resource_org;
1655                 elsif cap.destination_organization_id is not null then
1656                   l_destination_org_id := cap.destination_organization_id;
1657                   l_destination_sub_inv := cap.destination_subinventory;
1658                 end if;
1659 
1660                 if l_ship_to_location_id is null then
1661                   open csp_ship_to_location(l_resources(1).resource_id, l_resources(1).resource_type);
1662                   fetch csp_ship_to_location into l_ship_to_location_id;
1663                   close csp_ship_to_location;
1664                   log('choose_option','l_ship_to_location_id:'||l_ship_to_location_id);
1665                 end if;
1666 
1667               if cap.source_type_code in ('MYSELF','DEDICATED') then
1668                 log('choose_option','Create Reservation');
1669                 l_reservation_id := NULL;
1670                 l_reservation_parts.need_by_date       := sysdate;
1671                 l_reservation_parts.organization_id    := cap.organization_id;
1672                 l_reservation_parts.item_id            := cap.supplied_item_id;
1673                 l_reservation_parts.item_uom_code      := cap.primary_uom_code;
1674                 l_reservation_parts.quantity_needed    := cap.supplied_quantity;
1675                 l_reservation_parts.sub_inventory_code := cap.subinventory_code;
1676                 l_reservation_parts.line_id            := cap.requirement_line_id;
1677                 l_reservation_parts.revision           := cap.supplied_item_rev;
1678                 l_reservation_id := CSP_SCH_INT_PVT.CREATE_RESERVATION(l_reservation_parts,x_return_status,x_msg_data);
1679                 if x_return_status = FND_API.G_RET_STS_SUCCESS then
1680                   l_req_line_details_id := null;
1681                   csp_req_line_details_pkg.insert_row(
1682                        l_req_line_details_id
1683                       ,cap.requirement_line_id
1684                       ,fnd_global.user_id
1685                       ,sysdate
1686                       ,fnd_global.user_id
1687                       ,sysdate
1688                       ,fnd_global.login_id
1689                       ,'RES'
1690                       ,l_reservation_id);
1691                 else
1692                     log('choose_option','Reservation Creation failed');
1693                     ROLLBACK TO CHOOSE_OPTIONS;
1694                     x_return_status := FND_API.G_RET_STS_ERROR;
1695                     return;
1696                 end if;
1697                 log('choose_option','Reservation_id:'||l_reservation_id);
1698               else
1699                 if cap.operating_unit <> nvl(l_old_operating_unit,cap.operating_unit) then
1700                   CSP_PARTS_ORDER.process_order(
1701                       p_api_version   =>  1.0
1702                       ,p_Init_Msg_List =>  FND_API.G_FALSE
1703                       ,p_commit        =>  FND_API.G_FALSE
1704                       ,p_book_order    =>  l_book_order
1705                       ,px_header_rec   =>  l_parts_header
1706                       ,px_line_table   =>  l_parts_lines
1707                       ,x_return_status =>  x_return_status
1708                       ,x_msg_count     =>  x_msg_count
1709                       ,x_msg_data      =>  x_msg_data
1710                       );
1711                   IF x_return_status <> FND_API.G_RET_STS_SUCCESS THEN
1712                     log('choose_option','Order Creation failed');
1713                     ROLLBACK TO CHOOSE_OPTIONS;
1714                     x_return_status := FND_API.G_RET_STS_ERROR;
1715                     FND_MESSAGE.SET_NAME('CSP', 'CSP_SCH_UNABLE_TO_ORDER');
1716                     FND_MSG_PUB.ADD;
1717                     fnd_msg_pub.count_and_get
1718                             ( p_count => x_msg_count
1719                             , p_data  => x_msg_data);
1720                     return;
1721                   end if;
1722                   for i in 1..l_parts_lines.count loop
1723                     l_req_line_details_id := null;
1724                     csp_req_line_details_pkg.insert_row(
1725                        l_req_line_details_id
1726                       ,l_parts_lines(i).requirement_line_id
1727                       ,fnd_global.user_id
1728                       ,sysdate
1729                       ,fnd_global.user_id
1730                       ,sysdate
1731                       ,fnd_global.login_id
1732                       ,'IO'
1733                       ,l_parts_lines(i).order_line_id);
1734                   end loop;
1735                   l_parts_lines.delete;
1736                   rec_count := 1;
1737                 end if;
1738                 IF rec_count = 1 then
1739                   log('choose_option','Setting order header.');
1740                   open  c2;
1741                   fetch c2 into l_requirement_header_id,l_address_type;
1742                   close c2;
1743                   l_parts_header.requirement_header_id := l_requirement_header_id;
1744                   l_parts_header.ORDER_TYPE_ID := FND_PROFILE.value(name => 'CSP_ORDER_TYPE');
1745                   l_parts_header.SHIP_TO_LOCATION_ID :=  l_ship_to_location_id;
1746                   l_parts_header.DEST_ORGANIZATION_ID := l_destination_org_id;
1747                   l_parts_header.dest_subinventory := l_destination_sub_inv;
1748                   l_parts_header.operation := 'CREATE';
1749                   l_parts_header.need_by_date := nvl(l_need_by_date,p_options.start_time);
1750                 end if;
1751 
1752                 l_parts_lines(rec_count).inventory_item_id       := cap.supplied_item_id;
1753                 l_parts_lines(rec_count).line_num                := rec_count;
1754                 l_parts_lines(rec_count).revision                := null; --cap.supplied_item_rev;
1755                 l_parts_lines(rec_count).quantity                :=  NULL;
1756                 l_parts_lines(rec_count).unit_of_measure         := cap.primary_uom_code;
1757                 --l_parts_lines(l_parts_lines.count).dest_subinventory       := cap.destination_subinventory;
1758                 l_parts_lines(rec_count).source_organization_id  := cap.organization_id;
1759                 l_parts_lines(rec_count).source_subinventory     := cap.subinventory_code;
1760                 l_parts_lines(rec_count).ship_complete           := null;
1761                 l_parts_lines(rec_count).shipping_method_code    := cap.shipping_method;
1762                 --l_parts_lines(l_parts_lines.count).likelihood              :=  NULL;
1763                 l_parts_lines(rec_count).ordered_quantity        := cap.supplied_quantity;
1764                 --l_parts_lines(l_parts_lines.count).reservation_id          := null;
1765                 l_parts_lines(rec_count).requirement_line_id     := cap.requirement_line_id;
1766                 l_parts_lines(rec_count).arrival_date := least(x_options(1).start_time, nvl(l_need_by_date,p_options.start_time));
1767                 l_old_operating_unit := cap.operating_unit;
1768                 rec_count := rec_count + 1;
1769               end if;
1770             end loop;
1771 
1772             log('choose_option','outside loop, rec_count:'||rec_count);
1773             if rec_count > 1 then
1774               log('choose_option','Creating last order');
1775               CSP_PARTS_ORDER.process_order(
1776                 p_api_version   =>  1.0
1777                 ,p_Init_Msg_List =>  FND_API.G_FALSE
1778                 ,p_commit        =>  FND_API.G_FALSE
1779                 ,p_book_order    =>  l_book_order
1780                 ,px_header_rec   =>  l_parts_header
1781                 ,px_line_table   =>  l_parts_lines
1782                 ,x_return_status =>  x_return_status
1783                 ,x_msg_count     =>  x_msg_count
1784                 ,x_msg_data      =>  x_msg_data
1785                 );
1786               IF x_return_status <> FND_API.G_RET_STS_SUCCESS THEN
1787                 log('choose_option','Order Creation failed');
1788                 ROLLBACK TO CHOOSE_OPTIONS;
1789                 x_return_status := FND_API.G_RET_STS_ERROR;
1790                 FND_MESSAGE.SET_NAME('CSP', 'CSP_SCH_UNABLE_TO_ORDER');
1791                 FND_MSG_PUB.ADD;
1792                 fnd_msg_pub.count_and_get
1793                   ( p_count => x_msg_count
1794                   , p_data  => x_msg_data);
1795                 return;
1796               end if;
1797               for i in 1..l_parts_lines.count loop
1798                 log('choose_option','Creating requirement line details');
1799                 l_req_line_details_id := null;
1800                 csp_req_line_details_pkg.insert_row(
1801                    l_req_line_details_id
1802                   ,l_parts_lines(i).requirement_line_id
1803                   ,fnd_global.user_id
1804                   ,sysdate
1805                   ,fnd_global.user_id
1806                   ,sysdate
1807                   ,fnd_global.login_id
1808                   ,'IO'
1809                   ,l_parts_lines(i).order_line_id);
1810               end loop;
1811             end if;
1812 
1813 
1814              l_requirement_header.need_by_date := nvl(l_need_by_date,p_options.start_time);
1815 
1816              l_requirement_header.task_assignment_id    := p_task_assignment_id ;
1817              l_requirement_header.last_update_date      := sysdate;
1818              l_requirement_header.destination_organization_id := l_destination_org_id;
1819                                l_requirement_header.destination_subinventory := l_destination_sub_inv;
1820              --l_requirement_header.need_by_date := p_options.start_time;
1821              l_requirement_header.resource_type := p_options.resource_type;
1822              l_requirement_header.resource_id := p_options.resource_id;
1823              log('choose_option','task_assignment_id:'||l_requirement_header.task_assignment_id);
1824              log('choose_option','dest_organization_id:'||l_requirement_header.destination_organization_id);
1825              log('choose_option','dest_subinventory:'||l_requirement_header.destination_subinventory);
1826              log('choose_option','resource_type:'||l_requirement_header.resource_type);
1827              log('choose_option','resource_id:'||l_requirement_header.resource_id);
1828              log('choose_option','start_time:'||to_char(l_requirement_header.need_by_date,'dd-mon-yyyy hh24:mi:ss'));
1829              open  c2;
1830              fetch c2 into l_requirement_header_id,l_address_type;
1831              close c2;
1832              l_requirement_header.requirement_header_id := l_requirement_header_id;
1833              l_address_type := l_address_type;
1834              if l_address_type is null or l_address_type = 'R' or l_address_type = 'S' then
1835                if l_ship_to_location_id is not null then
1836                  l_requirement_header.address_type          := 'R';
1837                  l_requirement_header.ship_to_location_id   := l_ship_to_location_id;
1838                                  l_requirement_header.SHIP_TO_CONTACT_ID := null;
1839                end if;
1840              end if;
1841              CSP_Requirement_Headers_PVT.Update_requirement_headers(
1842                                 P_Api_Version_Number         => 1.0,
1843                                 P_Init_Msg_List              => FND_API.G_FALSE,
1844                                 P_Commit                     => FND_API.G_FALSE,
1845                                 p_validation_level           => FND_API.G_VALID_LEVEL_FULL,
1846                                 P_REQUIREMENT_HEADER_Rec     => l_requirement_header,
1847                                 X_Return_Status              => x_return_status,
1848                                 X_Msg_Count                  => x_msg_count,
1849                                 x_msg_data                   => x_msg_data
1850                                 );
1851 
1852           else
1853             x_return_status := FND_API.G_RET_STS_ERROR;
1854             FND_MESSAGE.SET_NAME('CSP', 'CSP_SCH_OPTION_NOT_VALIED');
1855             FND_MSG_PUB.ADD;
1856             fnd_msg_pub.count_and_get
1857               ( p_count => x_msg_count
1858               , p_data  => x_msg_data);
1859               return;
1860           end if;
1861 
1862           log('choose_option','Return');
1863           return;
1864         end if;
1865         log('choose_option','get_organization_subinv');
1866         CSP_SCH_INT_PVT.GET_ORGANIZATION_SUBINV(l_resources, l_resource_org_subinv , x_return_status,x_msg_data,x_msg_count);
1867         IF x_return_status <> FND_API.G_RET_STS_SUCCESS  THEN
1868             RETURN;
1869         END IF;
1870         CSP_SCH_INT_PVT.GET_PARTS_LIST(p_task_id,p_likelihood,l_parts_list,x_return_status,x_msg_data,x_msg_count);
1871         IF x_return_status <> FND_API.G_RET_STS_SUCCESS  THEN
1872             RETURN;
1873         END IF;
1874         IF x_return_status = FND_API.G_RET_STS_SUCCESS THEN
1875             CSP_SCH_INT_PVT.CHECK_LOCAL_INVENTORY(l_resource_org_subinv,l_parts_list,p_trunk,l_unavailable_list,l_final_available_list,x_return_status,x_msg_data,x_msg_count);
1876         ELSE
1877             return;
1878         END IF;
1879 --hehxxxx
1880         if nvl(l_search_method,'SPARES') <> 'ATP' and nvl(p_warehouse,FALSE)
1881            and l_unavailable_list.count >= 1 then
1882               CSP_SCH_INT_PVT.SPARES_CHECK(l_unavailable_list,l_interval,l_available_list,l_final_unavailable_list,x_return_status,x_msg_data,x_msg_count);
1883         elsif l_unavailable_list.count >= 1 and p_warehouse THEN
1884             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);
1885         END IF;
1886         IF x_return_status <> FND_API.G_RET_STS_SUCCESS  THEN
1887             RETURN;
1888         END IF;
1889         IF l_available_list.count > 0 THEN
1890                 l_temp_line_id := l_available_list(1).line_id;
1891                 l_final_available_list.extend;
1892                 l_final_available_list(l_final_available_list.count) := l_available_list(1);
1893         END IF;
1894         FOR I IN 1..l_available_list.count LOOP
1895             IF l_temp_line_id <> l_available_list(I).line_id THEN
1896                 l_final_available_list.extend;
1897                 l_final_available_list(l_final_available_list.count) := l_available_list(I);
1898                 l_temp_line_id := l_available_list(I).line_id;
1899             END IF;
1900         END LOOP;
1901         if p_mandatory then
1902           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);
1903           IF x_return_status <> FND_API.G_RET_STS_SUCCESS  THEN
1904             RETURN;
1905           END IF;
1906         else
1907           FOR K IN  1..l_final_available_list.count LOOP
1908              l_eligible_resources_list.extend ;
1909              l_eligible_resources_list(l_eligible_resources_list.count).resource_id := l_final_available_list(K).resource_id ;
1910              l_eligible_resources_list(l_eligible_resources_list.count).resource_type := l_final_available_list(K).resource_type ;
1911              l_eligible_resources_list(l_eligible_resources_list.count).organization_id:= l_final_available_list(K).organization_id ;
1912              l_eligible_resources_list(l_eligible_resources_list.count).item_id := l_final_available_list(K).Item_Id ;
1913              l_eligible_resources_list(l_eligible_resources_list.count).quantity := l_final_available_list(K).quantity ;
1914              l_eligible_resources_list(l_eligible_resources_list.count).source_org := l_final_available_list(K).source_org ;
1915              l_eligible_resources_list(l_eligible_resources_list.count).item_uom := l_final_available_list(K).Item_uom ;
1916              l_eligible_resources_list(l_eligible_resources_list.count).revision := l_final_available_list(K).revision ;
1917              l_eligible_resources_list(l_eligible_resources_list.count).sub_inventory := l_final_available_list(K).sub_inventory ;
1918              l_eligible_resources_list(l_eligible_resources_list.count).available_date := l_final_available_list(K).available_date;
1919              l_eligible_resources_list(l_eligible_resources_list.count).line_id := l_final_available_list(K).line_id;
1920            END LOOP;
1921         end if;
1922         IF l_eligible_resources_list.count > 0 THEN
1923          --CSP_SCH_INT_PVT.GET_TIME_COST(l_eligible_resources_list,l_options,x_return_status);
1924             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);
1925         ELSE
1926             x_return_status := FND_API.G_RET_STS_ERROR;
1927             FND_MESSAGE.SET_NAME('CSP', 'CSP_SCH_OPTION_NOT_VALIED');
1928             FND_MSG_PUB.ADD;
1929             fnd_msg_pub.count_and_get
1930               ( p_count => x_msg_count
1931               , p_data  => x_msg_data);
1932             return;
1933         END IF;
1934          FOR I IN 1..l_options.count LOOP
1935             IF (ROUND(((l_options(I).arrival_date - sysdate) * 24 * 60 ),2) <=  ROUND(((p_options.start_time - sysdate) * 24 * 60),2)
1936                OR (ROUND(((l_options(I).arrival_date - sysdate) * 24 * 60 ),2) - ROUND(((p_options.start_time - sysdate) * 24 * 60),2)) <= 10 )
1937                AND   l_options(I).transfer_cost <= nvl(p_options.transfer_cost,0) THEN
1938                l_temp_options.extend;
1939                l_temp_options(l_temp_options.count).resource_id       :=  l_options(I).resource_id;
1940                l_temp_options(l_temp_options.count).resource_type     :=  l_options(I).resource_type;
1941                l_temp_options(l_temp_options.count).lead_time         :=  l_options(I).lead_time   ;
1942                l_temp_options(l_temp_options.count).transfer_cost     :=  l_options(I).transfer_cost;
1943                l_temp_options(l_temp_options.count).shipping_methodes :=  l_options(I).shipping_methodes;
1944                l_temp_options(l_temp_options.count).arrival_date      :=  l_options(I).arrival_date ;
1945             END IF;
1946          END LOOP;
1947             IF l_temp_options.count = 0 then
1948                 x_return_status := FND_API.G_RET_STS_ERROR;
1949                 FND_MESSAGE.SET_NAME('CSP', 'CSP_SCH_OPTION_NOT_VALIED');
1950                 FND_MSG_PUB.ADD;
1951                 fnd_msg_pub.count_and_get
1952                     ( p_count => x_msg_count
1953                     , p_data  => x_msg_data);
1954                 return;
1955             END IF;
1956         FOR I IN 1..l_temp_options.count LOOP
1957                IF I =1 THEN
1958                     min_cost := l_temp_options(I).transfer_cost;
1959                     l_final_option.extend;
1960                     l_final_option(l_final_option.count).resource_id       :=  l_temp_options(I).resource_id;
1961                     l_final_option(l_final_option.count).resource_type     :=  l_temp_options(I).resource_type;
1962                     l_final_option(l_final_option.count).lead_time         :=  l_temp_options(I).lead_time   ;
1963                     l_final_option(l_final_option.count).transfer_cost     :=  l_temp_options(I).transfer_cost;
1964                     IF l_temp_options(I).shipping_methodes IS NOT NULL THEN
1965                         l_temp_options(I).shipping_methodes := l_temp_options(I).shipping_methodes || '$' ;
1966                     END IF;
1967                     l_final_option(l_final_option.count).shipping_methodes :=  l_temp_options(I).shipping_methodes;
1968                     l_final_option(l_final_option.count).arrival_date      :=  l_temp_options(I).arrival_date ;
1969                ELSE
1970                     SELECT LEAST(min_cost, l_temp_options(I).transfer_cost) INTO min_cost
1971                     FROM   DUAL;
1972                     IF min_cost = l_temp_options(I).transfer_cost THEN
1973                        l_final_option.trim(l_final_option.count);
1974                        l_final_option.extend;
1975                        l_final_option(l_final_option.count).resource_id       :=  l_temp_options(I).resource_id;
1976                        l_final_option(l_final_option.count).resource_type     :=  l_temp_options(I).resource_type;
1977                        l_final_option(l_final_option.count).lead_time         :=  l_temp_options(I).lead_time   ;
1978                        l_final_option(l_final_option.count).transfer_cost     :=  l_temp_options(I).transfer_cost;
1979                         IF l_temp_options(I).shipping_methodes IS NOT NULL THEN
1980                             l_temp_options(I).shipping_methodes := l_temp_options(I).shipping_methodes || '$' ;
1981                         END IF;
1982                             l_final_option(l_final_option.count).shipping_methodes :=  l_temp_options(I).shipping_methodes;
1983                             l_final_option(l_final_option.count).arrival_date      :=  l_temp_options(I).arrival_date ;
1984                      END IF;
1985                END IF;
1986                g_arrival_date := l_final_option(l_final_option.count).arrival_date;
1987         END LOOP;
1988         previous_position :=1;
1989         str_length := 0;
1990         l_ship_methode_count := 1;
1991         IF l_ship_count.count > 1 THEN
1992             FOR I IN 1..l_ship_count.count LOOP
1993                IF l_ship_count(I).from_org_id <> l_ship_count(I).to_org_id  THEN
1994                     --IF I <> l_ship_count.count THEN
1995                         l_org_ship_methode.extend;
1996                         SELECT INSTR(l_final_option(1).shipping_methodes,'$',1,l_ship_methode_count ) INTO current_position
1997                         FROM   DUAL;
1998                         SELECT SUBSTR(l_final_option(1).shipping_methodes,previous_position,(current_position-previous_position))
1999                         INTO   l_org_ship_methode(l_org_ship_methode.count).shipping_methode
2000                         FROM   DUAL;
2001                         l_org_ship_methode(l_org_ship_methode.count).from_org := l_ship_count(I).from_org_id;
2002                         l_org_ship_methode(l_org_ship_methode.count).to_org   := l_ship_count(I).to_org_id ;
2003                         previous_position := current_position+1;
2004                         current_position := 1;
2005                         l_ship_methode_count := l_ship_methode_count + 1;
2006                  ELSE
2007                         l_org_ship_methode.extend;
2008                         l_org_ship_methode(l_org_ship_methode.count).from_org := l_ship_count(I).from_org_id;
2009                         l_org_ship_methode(l_org_ship_methode.count).to_org   := l_ship_count(I).to_org_id ;
2010                         l_org_ship_methode(l_org_ship_methode.count).shipping_methode := NULL;
2011                  END IF;
2012             END LOOP;
2013          ELSE
2014             l_org_ship_methode.extend;
2015             SELECT INSTR(l_final_option(1).shipping_methodes,'$',1,l_ship_methode_count ) INTO current_position
2016                         FROM   DUAL;
2017                         SELECT SUBSTR(l_final_option(1).shipping_methodes,previous_position,(current_position-previous_position))
2018                         INTO   l_org_ship_methode(l_org_ship_methode.count).shipping_methode
2019                         FROM   DUAL;
2020             l_org_ship_methode(l_org_ship_methode.count).from_org := l_ship_count(1).from_org_id;
2021             l_org_ship_methode(l_org_ship_methode.count).to_org   := l_ship_count(1).to_org_id ;
2022          --   l_org_ship_methode(l_org_ship_methode.count).shipping_methode := l_final_option(1).shipping_methodes;
2023          END IF;
2024         FOR I IN 1..l_eligible_resources_list.count LOOP
2025            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
2026                 FOR J IN 1..l_org_ship_methode.count LOOP
2027                     IF l_eligible_resources_list(I).organization_id =l_org_ship_methode(J).to_org
2028                             AND  l_eligible_resources_list(I).source_org =l_org_ship_methode(J).from_org THEN
2029                         l_eligible_resources_list(I).shipping_methode := l_org_ship_methode(J).shipping_methode;
2030                             FOR K In 1..l_res_ship_parameters.count LOOP
2031                                 IF l_res_ship_parameters(K).to_org_id = l_eligible_resources_list(I).organization_id
2032                                     AND l_res_ship_parameters(K).from_org_id = l_eligible_resources_list(I).source_org
2033                                     AND l_res_ship_parameters(K).shipping_method = l_eligible_resources_list(I).shipping_methode THEN
2034                                     l_eligible_resources_list(I).intransit_time := l_res_ship_parameters(K).lead_time ;
2035                                     exit;
2036                                 END IF;
2037                             END LOOP;
2038                         EXIT;
2039                     END IF;
2040                 END LOOP;
2041            END IF;
2042         END LOOP;
2043         rec_count := 1;
2044         IF l_eligible_resources_list.count > 0 THEN
2045                 OPEN csp_resource_org(p_options.resource_id,p_options.resource_type);
2046                 LOOP
2047                     FETCH csp_resource_org INTO l_destination_org_id,l_destination_sub_inv;
2048                     EXIT WHEN csp_resource_org % NOTFOUND;
2049                 END LOOP;
2050                 CLOSE csp_resource_org;
2051                 OPEN csp_ship_to_location(p_options.resource_id,p_options.resource_type);
2052                 LOOP
2053                     FETCH csp_ship_to_location INTO l_ship_to_location_id;
2054                     EXIT WHEN csp_ship_to_location % NOTFOUND;
2055                 END LOOP;
2056                 CLOSE csp_ship_to_location;
2057         END IF;
2058        FOR I IN 1..l_eligible_resources_list.count LOOP
2059             IF  l_eligible_resources_list(I).sub_inventory IS NOT NULL THEN
2060                 l_reservation_id := NULL;
2061                 l_reservation_parts.need_by_date       := p_options.start_time;
2062                 l_reservation_parts.organization_id    := l_eligible_resources_list(I).source_org ;
2063                 l_reservation_parts.item_id            := l_eligible_resources_list(I).item_id;
2064                 l_reservation_parts.item_uom_code      := l_eligible_resources_list(I).item_uom;
2065                 l_reservation_parts.quantity_needed    := l_eligible_resources_list(I).quantity;
2066                 l_reservation_parts.sub_inventory_code := l_eligible_resources_list(I).sub_inventory;
2067                 l_reservation_parts.line_id            := l_eligible_resources_list(I).line_id;
2068                 l_reservation_parts.revision           := l_eligible_resources_list(I).revision;
2069                 l_reservation_id := CSP_SCH_INT_PVT.CREATE_RESERVATION(l_reservation_parts,x_return_status,x_msg_data);
2070                 IF l_reservation_id <= 0 THEN
2071                     ROLLBACK TO choose_options;
2072                     x_return_status := FND_API.G_RET_STS_ERROR;
2073                     FND_MESSAGE.SET_NAME('CSP', 'CSP_SCH_COULD_NOT_RESERVE');
2074                     FND_MSG_PUB.ADD;
2075                     fnd_msg_pub.count_and_get
2076                         ( p_count => x_msg_count
2077                         , p_data  => x_msg_data);
2078                     return;
2079                 END IF;
2080 
2081                 l_requirement_header.RESOURCE_TYPE := l_eligible_resources_list(I).resource_type;
2082                 l_requirement_header.RESOURCE_ID := l_eligible_resources_list(I).resource_id;
2083                 l_requirement_header.DESTINATION_ORGANIZATION_ID := l_eligible_resources_list(I).source_org;
2084                 l_requirement_header.DESTINATION_SUBINVENTORY := l_eligible_resources_list(I).sub_inventory;
2085 
2086                 l_req_line_details_tbl.extend;
2087                 select CSP_REQUIREMENT_LINES_S1.nextval INTO l_req_line_details_tbl(l_req_line_details_tbl.count).req_line_detail_id from dual;
2088                 l_req_line_details_tbl(l_req_line_details_tbl.count).requirement_line_id  := l_eligible_resources_list(I).line_id ;
2089                 l_req_line_details_tbl(l_req_line_details_tbl.count).source_type  := 'RES' ;
2090                 l_req_line_details_tbl(l_req_line_details_tbl.count).source_id  := l_reservation_id ;
2091             ELSE
2092                 l_parts_lines(rec_count).inventory_item_id := l_eligible_resources_list(I).item_id;
2093                 l_parts_lines(rec_count).line_num                :=  rec_count ;
2094                 l_parts_lines(rec_count).revision                :=  l_eligible_resources_list(I).revision; --l_revision;
2095                 l_parts_lines(rec_count).quantity                :=  NULL;
2096                 l_parts_lines(rec_count).unit_of_measure         :=  l_eligible_resources_list(I).item_uom;
2097                 l_parts_lines(rec_count).dest_subinventory       :=  l_destination_sub_inv ;
2098                 l_parts_lines(rec_count).source_organization_id  :=  l_eligible_resources_list(I).source_org ;
2099                 l_parts_lines(rec_count).source_subinventory     :=  NULL;
2100                 l_parts_lines(rec_count).ship_complete           :=  l_ship_set;
2101                 l_parts_lines(rec_count).shipping_method_code    :=  l_eligible_resources_list(I).shipping_methode;
2102                 l_parts_lines(rec_count).likelihood              :=  NULL;
2103                 l_parts_lines(rec_count).ordered_quantity        :=  l_eligible_resources_list(I).quantity;
2104                  l_parts_lines(rec_count).reservation_id          :=  l_reservation_id;
2105                 l_parts_lines(rec_count).requirement_line_id     :=  l_requirements_line_id;
2106                 rec_count := rec_count + 1;
2107                 l_req_line_details_tbl.extend;
2108                 select CSP_REQUIREMENT_LINES_S1.nextval INTO l_req_line_details_tbl(l_req_line_details_tbl.count).req_line_detail_id from dual;
2109                 l_req_line_details_tbl(l_req_line_details_tbl.count).requirement_line_id  := l_eligible_resources_list(I).line_id ;
2110                 l_req_line_details_tbl(l_req_line_details_tbl.count).source_type  := 'IO' ;
2111             END IF;
2112             END LOOP;
2113             IF l_parts_lines.count > 0 THEN
2114             l_parts_header.ORDER_TYPE_ID := FND_PROFILE.value(name => 'CSP_ORDER_TYPE');
2115             l_parts_header.SHIP_TO_LOCATION_ID :=  l_ship_to_location_id;
2116             l_parts_header.DEST_ORGANIZATION_ID := l_destination_org_id;
2117                         l_parts_header.dest_subinventory := l_destination_sub_inv;
2118             l_parts_header.OPERATION := 'CREATE';
2119             l_parts_header.need_by_date :=g_arrival_date;
2120              CSP_PARTS_ORDER.process_order(
2121                                       p_api_version   =>  1.0
2122                                      ,p_Init_Msg_List =>  FND_API.G_FALSE
2123                                      ,p_commit        =>  FND_API.G_FALSE
2124                                      ,px_header_rec   =>  l_parts_header
2125                                      ,px_line_table   =>  l_parts_lines
2126                                      ,x_return_status =>  x_return_status
2127                                      ,x_msg_count     =>  x_msg_count
2128                                      ,x_msg_data      =>  x_msg_data
2129                                      );
2130             END IF;
2131             IF x_return_status <> FND_API.G_RET_STS_SUCCESS THEN
2132                 ROLLBACK TO CHOOSE_OPTIONS;
2133                 x_return_status := FND_API.G_RET_STS_ERROR;
2134                 FND_MESSAGE.SET_NAME('CSP', 'CSP_SCH_UNABLE_TO_ORDER');
2135                 FND_MSG_PUB.ADD;
2136                 fnd_msg_pub.count_and_get
2137                             ( p_count => x_msg_count
2138                             , p_data  => x_msg_data);
2139                 return;
2140           ELSE
2141 
2142             l_requirement_header.RESOURCE_TYPE := p_options.resource_type;
2143             l_requirement_header.RESOURCE_ID := p_options.resource_id;
2144             l_requirement_header.DESTINATION_ORGANIZATION_ID := l_destination_org_id;
2145             l_requirement_header.DESTINATION_SUBINVENTORY := l_destination_sub_inv;
2146 
2147                 FOR I IN 1..l_parts_lines.count LOOP
2148                     FOR J IN 1..l_req_line_details_tbl.count LOOP
2149                         IF l_req_line_details_tbl(J).source_type = 'IO' AND l_req_line_details_tbl(J).source_ID IS NULL THEN
2150                             l_req_line_details_tbl(J).source_ID :=  l_parts_lines(I).order_line_id;
2151                             EXIT;
2152                         END IF;
2153                     END LOOP;
2154                 END LOOP;
2155             --CSP_Requirement_Lines_PVT.Update_requirement_lines(
2156                                 --P_Api_Version_Number         => 1.0,
2157                                 --P_Init_Msg_List              => FND_API.G_FALSE,
2158                                 --P_Commit                     => FND_API.G_FALSE,
2159                                 --p_validation_level           => FND_API.G_VALID_LEVEL_FULL,
2160                                 --P_Requirement_Line_Tbl       => l_Requirement_Line_Tbl,
2161                                 --X_Return_Status              => x_return_status,
2162                                 --X_Msg_Count                  => x_msg_count,
2163                                 --X_Msg_Data                   => x_msg_data
2164                                 --);
2165          IF x_return_status <> FND_API.G_RET_STS_SUCCESS THEN
2166             ROLLBACK TO choose_options;
2167             return;
2168          END IF;
2169          FOR K IN 1..l_req_line_details_tbl.count LOOP
2170             csp_req_line_details_pkg.insert_row(l_req_line_details_tbl(K).REQ_LINE_DETAIL_ID
2171                                                 ,l_req_line_details_tbl(K).REQUIREMENT_LINE_ID
2172                                                 ,fnd_global.user_id
2173                                                 ,sysdate
2174                                                 ,fnd_global.user_id
2175                                                 ,sysdate
2176                                                 ,fnd_global.login_id
2177                                                 ,l_req_line_details_tbl(K).SOURCE_TYPE
2178                                                 ,l_req_line_details_tbl(K).SOURCE_ID);
2179          END LOOP;
2180          OPEN C2;
2181          FETCH C2 INTO l_requirement_header_id,l_address_type;
2182          CLOSE C2;
2183          l_requirement_header.REQUIREMENT_HEADER_ID := l_requirement_header_id;
2184          l_requirement_header.TASK_ASSIGNMENT_ID    := p_task_assignment_id ;
2185 
2186          l_requirement_header.Last_Update_Date      := SYSDATE;
2187          IF l_address_type IS NULL or l_address_type = 'R' OR l_address_type = 'S' THEN
2188             l_requirement_header.address_type          := 'R';
2189             l_requirement_header.ship_to_location_id   := l_ship_to_location_id;
2190          END IF;
2191          l_requirement_header.ORDER_TYPE_ID := FND_PROFILE.value(name => 'CSP_ORDER_TYPE');
2192          CSP_Requirement_Headers_PVT.Update_requirement_headers(
2193                                 P_Api_Version_Number         => 1.0,
2194                                 P_Init_Msg_List              => FND_API.G_FALSE,
2195                                 P_Commit                     => FND_API.G_FALSE,
2196                                 p_validation_level           => FND_API.G_VALID_LEVEL_FULL,
2197                                 P_REQUIREMENT_HEADER_Rec     => l_requirement_header,
2198                                 X_Return_Status              => x_return_status,
2199                                 X_Msg_Count                  => x_msg_count,
2200                                 X_Msg_Data                   => x_msg_data
2201                                 );
2202          IF x_return_status <> FND_API.G_RET_STS_SUCCESS THEN
2203             ROLLBACK TO choose_options;
2204             return;
2205          END IF;
2206         END IF;
2207 
2208       EXCEPTION
2209         WHEN OTHERS THEN
2210             ROLLBACK TO choose_options;
2211             FND_MESSAGE.SET_NAME('CSP', 'CSP_UNEXPECTED_EXEC_ERRORS');
2212             FND_MESSAGE.SET_TOKEN('ROUTINE', l_api_name, FALSE);
2213             FND_MESSAGE.SET_TOKEN('SQLERRM', sqlerrm, FALSE);
2214             FND_MSG_PUB.ADD;
2215             fnd_msg_pub.count_and_get
2216               ( p_count => x_msg_count
2217               , p_data  => x_msg_data);
2218             x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
2219    END CHOOSE_OPTION;
2220 
2221    /* PROCEDURE CLEAN_MATERIAL_TRANSACTION(p_api_version_number  IN  NUMBER
2222                                         ,p_task_assignment_id  IN  NUMBER
2223                                         ,x_return_status       OUT NOCOPY VARCHAR2
2224                                         ,x_msg_data            OUT NOCOPY VARCHAR2
2225                                         ,x_msg_count           OUT NOCOPY NUMBER) IS
2226 
2227     CURSOR cancel_reserv  IS
2228     SELECT crl.RESERVATION_ID,crl.LOCAL_RESERVATION_ID,crl.REQUIREMENT_LINE_ID
2229     FROM   CSP_REQUIREMENT_LINES crl, csp_requirement_headers crh
2230     WHERE  crh.task_assignment_id = p_task_assignment_id
2231     and    crl.REQUIREMENT_HEADER_ID = crh.requirement_header_id
2232     AND    crl.local_RESERVATION_ID IS NOT NULL;
2233 
2234      cursor cancel_order IS
2235      select distinct  oeh.header_id,crl.requirement_line_id
2236      from oe_order_lines_all oel, oe_order_headers_all oeh, csp_requirement_headers crh, csp_requirement_lines crl
2237      where crh.task_assignment_id = p_task_assignment_id
2238      and   crl.REQUIREMENT_HEADER_ID = crh.REQUIREMENT_HEADER_ID
2239      and   oel.line_id = crl.order_line_id
2240      and   oeh.header_id =  oel.header_id
2241      order by oeh.header_id;
2242 
2243     l_api_name   varchar2(60) := 'CSP_SCH_INT_PVT.CLEAN_MATERIAL_TRANSACTION';
2244     l_reserv_id NUMBER;
2245     l_local_reserv_id NUMBER;
2246     l_order_id  NUMBER;
2247     l_return_status VARCHAR2(3);
2248     l_msg_data VARCHAR2(128);
2249     l_msg_count NUMBER;
2250     l_order_line_id NUMBER;
2251     l_previous_order_id NUMBER := 0;
2252     l_requirement_line_id NUMBER;
2253     l_Requirement_Line_Tbl         CSP_Requirement_Lines_PVT.Requirement_Line_Tbl_Type;
2254     l_Requirement_Line_Tbl_order   CSP_Requirement_Lines_PVT.Requirement_Line_Tbl_Type;
2255     req_loop NUMBER := 0 ;
2256     reservation_present BOOLEAN := FALSE;
2257     order_present       BOOLEAN := FALSE;
2258     BEGIN
2259          x_return_status := FND_API.G_RET_STS_SUCCESS;
2260          SAVEPOINT CLEAN_MATERIAL_TRANSACTION;
2261          OPEN cancel_reserv ;
2262          LOOP
2263             FETCH cancel_reserv INTO l_reserv_id,l_local_reserv_id,l_requirement_line_id;
2264             EXIT WHEN  cancel_reserv%NOTFOUND;
2265             IF l_reserv_id IS NOT NULL THEN
2266                 CSP_SCH_INT_PVT.CANCEL_RESERVATION(l_reserv_id,x_return_status,x_msg_data,x_msg_count);
2267             END IF;
2268             IF l_local_reserv_id IS NOT NULL THEN
2269                 CSP_SCH_INT_PVT.CANCEL_RESERVATION(l_local_reserv_id,x_return_status,x_msg_data,x_msg_count);
2270             END IF;
2271             IF x_return_status <> FND_API.G_RET_STS_SUCCESS THEN
2272                 ROLLBACK TO CLEAN_MATERIAL_TRANSACTION;
2273                 x_return_status := FND_API.G_RET_STS_ERROR;
2274                 FND_MESSAGE.SET_NAME('CSP', 'CSP_SCH_NOT_CANCEL_RESERV');
2275                 FND_MSG_PUB.ADD;
2276                 fnd_msg_pub.count_and_get
2277                     ( p_count => x_msg_count
2278                     , p_data  => x_msg_data);
2279                 exit;
2280             ELSE
2281                 req_loop := req_loop + 1;
2282                 l_Requirement_Line_Tbl(req_loop).REQUIREMENT_LINE_ID      := l_requirement_line_id;
2283                 l_Requirement_Line_Tbl(req_loop).local_RESERVATION_ID     := NULL;
2284                 l_Requirement_Line_Tbl(req_loop).RESERVATION_ID           := NULL;
2285                 l_Requirement_Line_Tbl(req_loop).source_organization_id   := NULL;
2286                 l_Requirement_Line_Tbl(req_loop).source_subinventory      := NULL;
2287                 l_Requirement_Line_Tbl(req_loop).sourced_from             := NULL;
2288                 reservation_present := TRUE;
2289             END IF;
2290             l_reserv_id := NULL ;
2291          END LOOP;
2292          CLOSE cancel_reserv;
2293          IF x_return_status = FND_API.G_RET_STS_ERROR THEN
2294              ROLLBACK TO CLEAN_MATERIAL_TRANSACTION;
2295              return;
2296          ELSE
2297             IF  reservation_present THEN
2298                 CSP_Requirement_Lines_PVT.Update_requirement_lines(
2299                                 P_Api_Version_Number         => 1.0,
2300                                 P_Init_Msg_List              => FND_API.G_FALSE,
2301                                 P_Commit                     => FND_API.G_FALSE,
2302                                 p_validation_level           => FND_API.G_VALID_LEVEL_FULL,
2303                                 P_Requirement_Line_Tbl       => l_Requirement_Line_Tbl,
2304                                 X_Return_Status              => x_return_status,
2305                                 X_Msg_Count                  => x_msg_count,
2306                                 X_Msg_Data                   => x_msg_data
2307                                 );
2308                 IF x_return_status <> FND_API.G_RET_STS_SUCCESS THEN
2309                     ROLLBACK TO CLEAN_MATERIAL_TRANSACTION;
2310                     return;
2311                 END IF;
2312              END IF;
2313           END IF;
2314                 req_loop := 0;
2315          OPEN cancel_order;
2316          LOOP
2317             FETCH cancel_order INTO l_order_id,l_requirement_line_id ;
2318             EXIT WHEN cancel_order % NOTFOUND;
2319             IF l_order_id <> l_previous_order_id THEN
2320                 CSP_SCH_INT_PVT.CANCEL_ORDER(l_order_id,x_return_status,x_msg_data,x_msg_count);
2321                 l_previous_order_id := l_order_id;
2322             ELSE
2323                 x_return_status := FND_API.G_RET_STS_SUCCESS;
2324             END IF;
2325             IF x_return_status <> FND_API.G_RET_STS_SUCCESS THEN
2326                x_return_status := FND_API.G_RET_STS_ERROR;
2327                FND_MESSAGE.SET_NAME('CSP', 'CSP_SCH_NOT_CANCEL_ORDER');
2328                FND_MSG_PUB.ADD;
2329                fnd_msg_pub.count_and_get
2330                                 ( p_count => x_msg_count
2331                                 , p_data  => x_msg_data);
2332                exit;
2333             ELSE
2334                 req_loop := req_loop + 1;
2335                 l_Requirement_Line_Tbl(req_loop).REQUIREMENT_LINE_ID      := l_requirement_line_id;
2336                 l_Requirement_Line_Tbl(req_loop).ORDER_LINE_ID            := NULL;
2337                 l_Requirement_Line_Tbl(req_loop).source_organization_id   := NULL;
2338                 l_Requirement_Line_Tbl(req_loop).source_subinventory      := NULL;
2339                 l_Requirement_Line_Tbl(req_loop).shipping_method_code     := NULL;
2340                 l_Requirement_Line_Tbl(req_loop).order_by_date            := NULL;
2341                 l_Requirement_Line_Tbl(req_loop).arrival_date             := NULL;
2342                 l_Requirement_Line_Tbl(req_loop).ordered_quantity         := NULL;
2343                 l_Requirement_Line_Tbl(req_loop).sourced_from             := NULL;
2344                 order_present := TRUE;
2345                 l_requirement_line_id := null;
2346             END IF;
2347          END LOOP;
2348          CLOSE cancel_order;
2349          IF x_return_status = FND_API.G_RET_STS_ERROR THEN
2350              ROLLBACK TO CLEAN_MATERIAL_TRANSACTION;
2351              return;
2352          ELSE
2353               IF order_present then
2354                     CSP_Requirement_Lines_PVT.Update_requirement_lines(
2355                                 P_Api_Version_Number         => 1.0,
2356                                 P_Init_Msg_List              => FND_API.G_FALSE,
2357                                 P_Commit                     => FND_API.G_FALSE,
2358                                 p_validation_level           => FND_API.G_VALID_LEVEL_FULL,
2359                                 P_Requirement_Line_Tbl       => l_Requirement_Line_Tbl,
2360                                 X_Return_Status              => x_return_status,
2361                                 X_Msg_Count                  => x_msg_count,
2362                                 X_Msg_Data                   => x_msg_data
2363                                 );
2364                     IF x_return_status <> FND_API.G_RET_STS_SUCCESS THEN
2365                         ROLLBACK TO CLEAN_MATERIAL_TRANSACTION;
2366                         return;
2367                     END IF;
2368                 END IF;
2369            END IF;
2370            IF  x_return_status = FND_API.G_RET_STS_SUCCESS THEN
2371                     COMMIT WORK;
2372            END IF;
2373       EXCEPTION
2374         WHEN OTHERS THEN
2375             ROLLBACK TO CLEAN_MATERIAL_TRANSACTION;
2376             FND_MESSAGE.SET_NAME('CSP', 'CSP_UNEXPECTED_EXEC_ERRORS');
2377             FND_MESSAGE.SET_TOKEN('ROUTINE', l_api_name, TRUE);
2378             FND_MESSAGE.SET_TOKEN('SQLERRM', sqlerrm, TRUE);
2379             FND_MSG_PUB.ADD;
2380             fnd_msg_pub.count_and_get
2381               ( p_count => x_msg_count
2382               , p_data  => x_msg_data);
2383             x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
2384 
2385    END CLEAN_MATERIAL_TRANSACTION;*/
2386 
2387    PROCEDURE CLEAN_MATERIAL_TRANSACTION(p_api_version_number  IN  NUMBER
2388                                         ,p_task_assignment_id  IN  NUMBER
2389                                         ,x_return_status       OUT NOCOPY VARCHAR2
2390                                         ,x_msg_data            OUT NOCOPY VARCHAR2
2391                                         ,x_msg_count           OUT NOCOPY NUMBER) IS
2392     BEGIN
2393 
2394          if(FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) then
2395            fnd_log.string(fnd_log.level_statement,
2396                            'csp.plsql.csp_sch_int_pvt.clean_material_transaction',
2397                            'in Clean_Material_Transaction procedure.. calling CLEAN_REQUIREMENT....');
2398            fnd_log.string(fnd_log.level_statement,
2399                            'csp.plsql.csp_sch_int_pvt.clean_material_transaction',
2400                            'p_task_assignment_id = ' || p_task_assignment_id);
2401          end if;
2402          x_return_status := FND_API.G_RET_STS_SUCCESS;
2403 
2404         /*
2405         CLEAN_REQUIREMENT(
2406             p_api_version_number    => p_api_version_number,
2407             p_task_assignment_id    => p_task_assignment_id,
2408             x_return_status => x_return_status,
2409             x_msg_count => x_msg_count,
2410             x_msg_data => x_msg_data
2411             );
2412             */
2413 
2414          if(FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) then
2415            fnd_log.string(fnd_log.level_statement,
2416                            'csp.plsql.csp_sch_int_pvt.clean_material_transaction',
2417                            'leaving... x_return_status = ' || x_return_status);
2418          end if;
2419 
2420     END CLEAN_MATERIAL_TRANSACTION;
2421 
2422    PROCEDURE CLEAN_REQUIREMENT(p_api_version_number  IN  NUMBER
2423                                         ,p_task_assignment_id  IN  NUMBER
2424                                         ,x_return_status       OUT NOCOPY VARCHAR2
2425                                         ,x_msg_data            OUT NOCOPY VARCHAR2
2426                                         ,x_msg_count           OUT NOCOPY NUMBER) IS
2427 
2428     l_order_id  NUMBER;
2429     l_req_details_line_id NUMBER;
2430     l_reserv_id NUMBER;
2431     l_status varchar2(30);
2432     l_module_name varchar2(100);
2433 
2434     CURSOR get_reservations is
2435     select crld.source_id , crld.req_line_detail_id
2436     from  csp_req_line_details crld
2437          ,csp_requirement_lines crl
2438          ,csp_requirement_headers crh
2439     where  crh.task_assignment_id = p_task_assignment_id
2440     and crl.requirement_header_id = crh.requirement_header_id
2441     and crld.requirement_line_id = crl.requirement_line_id
2442     and crld.source_type = 'RES' ;
2443 
2444     CURSOR get_orders is
2445     select oeh.header_id, crld.req_line_detail_id, crh.address_type
2446     from  csp_req_line_details crld
2447          ,csp_requirement_lines crl
2448          ,csp_requirement_headers crh
2449          ,oe_order_lines_all oel
2450          ,oe_order_headers_all oeh
2451     where  crh.task_assignment_id = p_task_assignment_id
2452     and crl.requirement_header_id = crh.requirement_header_id
2453     and crld.requirement_line_id = crl.requirement_line_id
2454     and crld.source_type = 'IO'
2455     and oel.line_id = crld.source_id
2456     and oeh.header_id =  oel.header_id
2457     order by oeh.header_id;
2458 
2459     CURSOR get_order_status(c_header_id NUMBER) IS
2460     select flow_status_code
2461     from   oe_order_headers_all
2462     where  header_id =  c_header_id;
2463 
2464     cursor get_line_details(c_order_header_id Number) is
2465     select REQ_LINE_DETAIL_ID
2466     from  csp_req_line_details crld,oe_order_lines_all oel
2467     where crld.source_id = oel.line_id
2468     and crld.source_type = 'IO'
2469     and oel.header_id = c_order_header_id;
2470 
2471     cursor get_requirement_header_id is
2472     select requirement_header_id,address_type
2473     from csp_requirement_headers
2474     where task_assignment_id = p_task_assignment_id;
2475 
2476     l_requirement_header      CSP_Requirement_Headers_PVT.REQUIREMENT_HEADER_Rec_Type;
2477     l_requirement_header_id NUMBER;
2478     l_address_type varchar2(3);
2479     l_line_to_cancel number;
2480         l_fl_rcvd_lines number;
2481         l_shpd_lines number;
2482    BEGIN
2483         l_module_name:= 'csp.plsql.csp_sch_int_pvt.clean_requirement';
2484 
2485          if(FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) then
2486            fnd_log.string(fnd_log.level_statement, l_module_name,
2487                            'begin...');
2488          end if;
2489 
2490         x_return_status := FND_API.G_RET_STS_SUCCESS;
2491 
2492                 -- check for the fully rcvd case
2493                 -- if yes then do not clear this
2494                 -- choose option will take care of it
2495                 l_fl_rcvd_lines := 0;
2496                 SELECT COUNT(l.requirement_line_id)
2497                 into l_fl_rcvd_lines
2498                 FROM csp_requirement_headers h,
2499                   csp_requirement_lines l,
2500                   csp_req_line_details dio,
2501                   csp_req_line_details dres,
2502                   oe_order_lines_all oola,
2503                   mtl_reservations mr
2504                 WHERE h.task_assignment_id    = p_task_assignment_id
2505                 AND h.address_type         IN ('T', 'C', 'P')
2506                 AND h.requirement_header_id = l.requirement_header_id
2507                 AND l.requirement_line_id   = dio.requirement_line_id
2508                 AND dio.source_type        = 'IO'
2509                 AND dio.source_id = oola.line_id
2510                 AND csp_pick_utils.get_order_status(oola.line_id,oola.flow_status_code)         = 'FULLY RECEIVED'
2511                 AND dio.requirement_line_id = dres.requirement_line_id
2512                 AND oola.inventory_item_id    = mr.inventory_item_id
2513                 AND oola.ordered_quantity   = mr.reservation_quantity
2514                 AND dres.source_type       = 'RES'
2515                 AND dres.source_id = mr.reservation_id;
2516 
2517                 if(FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) then
2518                         fnd_log.string(fnd_log.level_statement, l_module_name,
2519                                            'l_fl_rcvd_lines=' || l_fl_rcvd_lines);
2520                 end if;
2521 
2522                 if l_fl_rcvd_lines > 0 then
2523                         return;
2524                 end if;
2525 
2526                 -- another check for already shipped order lines
2527                 l_shpd_lines := 0;
2528                 SELECT COUNT(l.requirement_line_id)
2529                 into l_shpd_lines
2530                 FROM csp_requirement_headers h,
2531                   csp_requirement_lines l,
2532                   csp_req_line_details d,
2533                   oe_order_lines_all oola
2534                 WHERE h.task_assignment_id    = p_task_assignment_id
2535                 AND h.requirement_header_id = l.requirement_header_id
2536                 and h.address_type in ('C', 'T', 'P')
2537                 AND l.requirement_line_id   = d.requirement_line_id
2538                 AND d.source_type          = 'IO'
2539                 AND d.source_id = oola.line_id
2540                 AND csp_pick_utils.get_order_status(oola.line_id,oola.flow_status_code)           in ('SHIPPED', 'EXPECTED');
2541 
2542                 if(FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) then
2543                         fnd_log.string(fnd_log.level_statement, l_module_name,
2544                                            'l_shpd_lines=' || l_shpd_lines);
2545                 end if;
2546 
2547                 if l_shpd_lines > 0 then
2548                         return;
2549                 end if;
2550 
2551         SAVEPOINT CLEAN_MATERIAL_TRANSACTION;
2552 
2553          OPEN get_reservations ;
2554          LOOP
2555             FETCH get_reservations INTO l_reserv_id,l_req_details_line_id;
2556             EXIT WHEN  get_reservations%NOTFOUND;
2557 
2558              if(FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) then
2559                fnd_log.string(fnd_log.level_statement, l_module_name,
2560                                'l_reserv_id = ' || l_reserv_id);
2561                fnd_log.string(fnd_log.level_statement, l_module_name,
2562                                'l_req_details_line_id = ' || l_req_details_line_id);
2563                fnd_log.string(fnd_log.level_statement, l_module_name,
2564                                'before cancelling reservation');
2565              end if;
2566 
2567                 CSP_SCH_INT_PVT.CANCEL_RESERVATION(l_reserv_id,x_return_status,x_msg_data,x_msg_count);
2568 
2569              if(FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) then
2570                fnd_log.string(fnd_log.level_statement, l_module_name,
2571                                'after cancelling reservation... x_return_status = ' || x_return_status);
2572              end if;
2573 
2574                 IF x_return_status <> FND_API.G_RET_STS_SUCCESS THEN
2575                     --x_return_status := FND_API.G_RET_STS_SUCCESS;
2576                     rollback to CLEAN_MATERIAL_TRANSACTION;
2577                     return;
2578                 ELSE
2579                     CSP_REQ_LINE_DETAILS_PKG.Delete_Row(l_req_details_line_id);
2580                 END IF;
2581          END LOOP;
2582          close get_reservations;
2583 
2584          if(FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) then
2585            fnd_log.string(fnd_log.level_statement, l_module_name,
2586                            'after reservation loop... x_return_status = ' || x_return_status);
2587          end if;
2588 
2589          IF x_return_status <> FND_API.G_RET_STS_SUCCESS THEN
2590             --x_return_status := FND_API.G_RET_STS_SUCCESS;
2591             rollback to CLEAN_MATERIAL_TRANSACTION;
2592             return;
2593          ELSE
2594             OPEN get_orders;
2595             LOOP
2596                 FETCH get_orders INTO l_order_id ,l_req_details_line_id, l_address_type ;
2597                 EXIT WHEN get_orders% NOTFOUND;
2598 
2599                  if(FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) then
2600                    fnd_log.string(fnd_log.level_statement, l_module_name,
2601                                    'l_order_id = ' || l_order_id);
2602                    fnd_log.string(fnd_log.level_statement, l_module_name,
2603                                    'l_req_details_line_id = ' || l_req_details_line_id);
2604                  end if;
2605 
2606                 OPEN get_order_status(l_order_id);
2607                 FETCH get_order_status INTO l_status;
2608                 CLOSE get_order_status;
2609 
2610                  if(FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) then
2611                    fnd_log.string(fnd_log.level_statement, l_module_name,
2612                                    'l_status = ' || l_status);
2613                  end if;
2614 
2615                 SELECT COUNT(1)
2616                 INTO l_line_to_cancel
2617                 FROM oe_order_lines_all
2618                 WHERE header_id    = l_order_id
2619                 AND cancelled_flag = 'N'
2620                                 AND open_flag = 'Y'
2621                                 AND flow_status_code <> 'SHIPPED';
2622 
2623                  if(FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) then
2624                    fnd_log.string(fnd_log.level_statement, l_module_name,
2625                                    'l_line_to_cancel = ' || l_line_to_cancel);
2626                  end if;
2627 
2628                 IF l_status <> 'CANCELLED'
2629                                         and l_status <> 'CLOSED'
2630                                         and l_line_to_cancel > 0 THEN
2631 
2632                      if(FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) then
2633                        fnd_log.string(fnd_log.level_statement, l_module_name,
2634                                        'before CANCEL_ORDER...');
2635                      end if;
2636 
2637                    CSP_SCH_INT_PVT.CANCEL_ORDER(l_order_id,x_return_status,x_msg_data,x_msg_count);
2638 
2639                      if(FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) then
2640                        fnd_log.string(fnd_log.level_statement, l_module_name,
2641                                        'after CANCEL_ORDER... x_return_status = ' || x_return_status);
2642                      end if;
2643 
2644                    IF x_return_status <> FND_API.G_RET_STS_SUCCESS THEN
2645                                                 --x_return_status := FND_API.G_RET_STS_SUCCESS;
2646                                                 rollback to CLEAN_MATERIAL_TRANSACTION;
2647 
2648                                                 -- bug # 14084319
2649                                                 -- we assume the error is due to the custom OM constraints
2650                                                 -- return special return status code, so that the caller
2651                                                 -- can read this
2652                                                 if l_address_type = 'T' or l_address_type = 'C' or l_address_type = 'P' then
2653                                                         x_return_status := 'C';        -- CSP custom return code
2654                                                 end if;
2655                                                 return;
2656                    END IF;
2657                                 END IF;
2658 
2659                                 open get_line_details(l_order_id);
2660                                 LOOP
2661                                  FETCH get_line_details INTO l_req_details_line_id;
2662                                  EXIT WHEN get_line_details% NOTFOUND;
2663 
2664                                          if(FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) then
2665                                            fnd_log.string(fnd_log.level_statement, l_module_name,
2666                                                                            'deleting req_line_details for l_req_details_line_id = ' || l_req_details_line_id);
2667                                          end if;
2668 
2669                                         CSP_REQ_LINE_DETAILS_PKG.Delete_Row(l_req_details_line_id);
2670                                 END LOOP;
2671                                 CLOSE get_line_details;
2672 
2673             END LOOP;
2674             close get_orders;
2675 
2676          IF x_return_status <> FND_API.G_RET_STS_SUCCESS THEN
2677             rollback to CLEAN_MATERIAL_TRANSACTION;
2678             return;
2679          END IF;
2680 
2681          OPEN get_requirement_header_id;
2682          FETCH get_requirement_header_id INTO l_requirement_header_id, l_address_type;
2683          CLOSE get_requirement_header_id;
2684 
2685          if(FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) then
2686            fnd_log.string(fnd_log.level_statement, l_module_name,
2687                            'l_requirement_header_id = ' || l_requirement_header_id);
2688            fnd_log.string(fnd_log.level_statement, l_module_name,
2689                            'l_address_type = ' || l_address_type);
2690          end if;
2691 
2692          if l_requirement_header_id is not null THEN
2693                 l_requirement_header.REQUIREMENT_HEADER_ID := l_requirement_header_id;
2694                 l_requirement_header.TASK_ASSIGNMENT_ID    := NULL ;
2695 
2696                 if nvl(l_address_type, 'X') IN ('R', 'S') THEN
2697                   l_requirement_header.ship_to_location_id := null;
2698                   --l_requirement_header.address_Type := null;
2699             end if;
2700                 l_requirement_header.resource_type := null;
2701                 l_requirement_header.resource_id := null;
2702                 l_requirement_header.destination_organization_id  := null;
2703                 l_requirement_header.destination_subinventory  := null;
2704 
2705          if(FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) then
2706            fnd_log.string(fnd_log.level_statement, l_module_name,
2707                            'before updating req header... ');
2708          end if;
2709 
2710                 CSP_Requirement_Headers_PVT.Update_requirement_headers(
2711                                 P_Api_Version_Number         => 1.0,
2712                                 P_Init_Msg_List              => FND_API.G_FALSE,
2713                                 P_Commit                     => FND_API.G_FALSE,
2714                                 p_validation_level           => FND_API.G_VALID_LEVEL_FULL,
2715                                 P_REQUIREMENT_HEADER_Rec     => l_requirement_header,
2716                                 X_Return_Status              => x_return_status,
2717                                 X_Msg_Count                  => x_msg_count,
2718                                 X_Msg_Data                   => x_msg_data
2719                                 );
2720 
2721          if(FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) then
2722            fnd_log.string(fnd_log.level_statement, l_module_name,
2723                            'after updating req header... x_return_status = ' || x_return_status);
2724          end if;
2725 
2726           END IF;
2727             IF x_return_status <> FND_API.G_RET_STS_SUCCESS THEN
2728                 --x_return_status := FND_API.G_RET_STS_SUCCESS;
2729                 rollback to CLEAN_MATERIAL_TRANSACTION;
2730                 return;
2731             END IF;
2732 
2733          END IF;
2734    END CLEAN_REQUIREMENT;
2735 
2736    PROCEDURE CANCEL_RESERVATION(p_reserv_id   IN NUMBER
2737                                 ,x_return_status OUT NOCOPY VARCHAR2
2738                                 ,x_msg_data OUT NOCOPY VARCHAR2
2739                                 ,x_msg_count OUT NOCOPY NUMBER) IS
2740     l_api_name   varchar2(60) := 'CSP_SCH_INT_PVT.CANCEL_RESERVATION';
2741     l_api_version_number NUMBER := 1.0;
2742     l_return_status      VARCHAR2(3);
2743     l_msg_count          NUMBER;
2744     l_init_msg_lst       VARCHAR2(1) := fnd_api.g_true;
2745     l_msg_data           VARCHAR2(2000);
2746     l_rsv_rec        inv_reservation_global.mtl_reservation_rec_type;
2747     l_serial_number  inv_reservation_global.serial_number_tbl_type;
2748    BEGIN
2749         x_return_status := FND_API.G_RET_STS_SUCCESS;
2750         l_rsv_rec.reservation_id := p_reserv_id ;
2751         INV_RESERVATION_PUB.delete_reservation(l_api_version_number
2752                                               ,l_init_msg_lst
2753                                               ,x_return_status
2754                                               ,x_msg_count
2755                                               ,x_msg_data
2756                                               ,l_rsv_rec
2757                                               ,l_serial_number);
2758      EXCEPTION
2759      WHEN OTHERS THEN
2760             ROLLBACK TO CLEAN_MATERIAL_TRANSACTION;
2761             FND_MESSAGE.SET_NAME('CSP', 'CSP_UNEXPECTED_EXEC_ERRORS');
2762             FND_MESSAGE.SET_TOKEN('ROUTINE', l_api_name, FALSE);
2763             FND_MESSAGE.SET_TOKEN('SQLERRM', sqlerrm, FALSE);
2764             FND_MSG_PUB.ADD;
2765             fnd_msg_pub.count_and_get
2766               ( p_count => x_msg_count
2767               , p_data  => x_msg_data);
2768             x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
2769 
2770    END CANCEL_RESERVATION;
2771 
2772    PROCEDURE CANCEL_ORDER(p_order_id      IN   NUMBER
2773                          ,x_return_status OUT NOCOPY  VARCHAR2
2774                          ,x_msg_data      OUT NOCOPY  VARCHAR2
2775                          ,x_msg_count     OUT NOCOPY  NUMBER) IS
2776       l_parts_header             csp_parts_requirement.Header_rec_type;
2777       l_parts_lines              csp_parts_requirement.Line_Tbl_type;
2778       l_api_version              NUMBER := 1.0;
2779       l_api_name        varchar2(60) := 'CSP_SCH_INT_PVT.CANCEL_ORDER';
2780    BEGIN
2781             x_return_status := FND_API.G_RET_STS_SUCCESS;
2782             l_parts_header.order_header_id := p_order_id;
2783             --l_parts_header.operation       := 'CANCEL';
2784             fnd_profile.get('CSP_CANCEL_REASON', l_parts_header.change_Reason);
2785 
2786 
2787             CSP_PARTS_ORDER.Cancel_Order(
2788                 p_header_rec    => l_parts_header,
2789                 p_line_table    => l_parts_lines,
2790                 p_process_Type  => 'ORDER',
2791                 x_return_status => x_return_status,
2792                 x_msg_count     => x_msg_count,
2793                 x_msg_data      => x_msg_data
2794                 );
2795 
2796             EXCEPTION
2797             WHEN OTHERS THEN
2798             FND_MESSAGE.SET_NAME('CSP', 'CSP_UNEXPECTED_EXEC_ERRORS');
2799             FND_MESSAGE.SET_TOKEN('ROUTINE', l_api_name, FALSE);
2800             FND_MESSAGE.SET_TOKEN('SQLERRM', sqlerrm, FALSE);
2801             FND_MSG_PUB.ADD;
2802             fnd_msg_pub.count_and_get
2803               ( p_count => x_msg_count
2804               , p_data  => x_msg_data);
2805             x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
2806    END CANCEL_ORDER;
2807    PROCEDURE CREATE_ORDERS(p_api_version_number  IN  NUMBER
2808                          ,p_task_assignment_id  IN  NUMBER
2809                          ,x_return_status       OUT NOCOPY VARCHAR2
2810                          ,x_msg_data            OUT NOCOPY VARCHAR2
2811                          ,x_msg_count           OUT NOCOPY NUMBER) IS
2812 
2813         CURSOR get_orders is
2814         select distinct oeh.header_id, oel.line_id
2815         from  csp_req_line_details crld
2816          ,csp_requirement_lines crl
2817          ,csp_requirement_headers crh
2818          ,oe_order_lines_all oel
2819          ,oe_order_headers_all oeh
2820         where  crh.task_assignment_id = p_task_assignment_id
2821         and crl.requirement_header_id = crh.requirement_header_id
2822         and crld.requirement_line_id = crl.requirement_line_id
2823         and crld.source_type = 'IO'
2824         and oel.line_id = crld.source_id
2825         and oeh.header_id =  oel.header_id
2826         order by oeh.header_id;
2827 
2828         l_api_name                 VARCHAR2(60) := 'CSP_SCH_INT_PVT.CREATE_ORDERS';
2829         l_parts_header             csp_parts_requirement.Header_rec_type;
2830         l_parts_lines              csp_parts_requirement.Line_Tbl_type;
2831         l_order_header_id          NUMBER;
2832         l_order_line_id            NUMBER;
2833         l_header_id                NUMBER;
2834         rec_count                  NUMBER := 1;
2835         l_previous_header_id       NUMBER := NULL;
2836    BEGIN
2837         SAVEPOINT CREATE_ORDERS;
2838         l_previous_header_id := NULL;
2839         OPEN get_orders;
2840         LOOP
2841         FETCH get_orders into l_order_header_id, l_order_line_id;
2842         EXIT WHEN get_orders % NOTFOUND;
2843         IF l_previous_header_id IS NULL THEN
2844             l_previous_header_id := l_order_header_id;
2845         END IF;
2846         IF l_previous_header_id <> l_order_header_id THEN
2847                  l_parts_header.OPERATION := 'UPDATE';
2848                  l_parts_header.order_header_id := l_previous_header_id;
2849                      CSP_PARTS_ORDER.process_order(
2850                                       p_api_version   =>  1.0
2851                                      ,p_Init_Msg_List =>  FND_API.G_FALSE
2852                                      ,p_commit        =>  FND_API.G_FALSE
2853                                      ,px_header_rec   =>  l_parts_header
2854                                      ,px_line_table   =>  l_parts_lines
2855                                      ,p_process_type  =>  'ORDER'
2856                                      ,x_return_status =>  x_return_status
2857                                      ,x_msg_count     =>  x_msg_count
2858                                      ,x_msg_data      =>  x_msg_data
2859                                      );
2860                 IF x_return_status <> FND_API.G_RET_STS_SUCCESS THEN
2861                     ROLLBACK TO CREATE_ORDERS;
2862                     x_return_status := FND_API.G_RET_STS_ERROR;
2863                     FND_MESSAGE.SET_NAME('CSP', 'CSP_SCH_UNABLE_TO_ORDER');
2864                     FND_MSG_PUB.ADD;
2865                     fnd_msg_pub.count_and_get
2866                             ( p_count => x_msg_count
2867                             , p_data  => x_msg_data);
2868                     exit;
2869                 END IF;
2870                 l_previous_header_id := l_order_header_id;
2871               END IF;
2872             l_parts_lines(rec_count).order_line_id     := l_order_line_id;
2873             l_parts_lines(rec_count).booked_flag       := 'Y';
2874             rec_count := rec_count + 1;
2875         END LOOP;
2876         CLOSE get_orders;
2877         IF x_return_status <> FND_API.G_RET_STS_SUCCESS THEN
2878             RETURN;
2879         END IF;
2880    END CREATE_ORDERS;
2881 
2882    /*PROCEDURE CREATE_ORDERS(p_api_version_number  IN  NUMBER
2883                          ,p_task_assignment_id  IN  NUMBER
2884                          ,x_return_status       OUT NOCOPY VARCHAR2
2885                          ,x_msg_data            OUT NOCOPY VARCHAR2
2886                          ,x_msg_count           OUT NOCOPY NUMBER) IS
2887    /* CURSOR get_parts(c_task_assignment NUMBER) IS
2888     SELECT  INVENTORY_ITEM_ID, UOM_CODE,REVISION
2889            ,SHIP_COMPLETE_FLAG,SOURCE_ORGANIZATION_ID
2890            ,ORDERED_QUANTITY,REQUIREMENT_LINE_ID,RESERVATION_ID
2891     FROM  CSP_REQUIREMENT_HEADERS HR,CSP_REQUIREMENT_LINES LN
2892     WHERE HR.TASK_ASSIGNMENT_ID = c_task_assignment
2893     AND   LN.REQUIREMENT_HEADER_ID = HR.REQUIREMENT_HEADER_ID;
2894 
2895 
2896     This has been commented and spli in to two queries because of performance
2897     reasons.
2898 
2899 
2900     */
2901     /*CURSOR C1(c_task_assignment number) is
2902     select REQUIREMENT_HEADER_ID
2903     from   CSP_REQUIREMENT_HEADERS
2904     where  TASK_ASSIGNMENT_ID = c_task_assignment;
2905     CURSOR C2(c_header_id number) is
2906     SELECT  INVENTORY_ITEM_ID, UOM_CODE,REVISION
2907            ,SHIP_COMPLETE_FLAG,SOURCE_ORGANIZATION_ID
2908            ,ORDERED_QUANTITY,REQUIREMENT_LINE_ID,RESERVATION_ID
2909     FROM  CSP_REQUIREMENT_LINES
2910     WHERE REQUIREMENT_HEADER_ID = c_header_id;
2911 
2912 
2913     CURSOR get_resource(c_task_assignment_id NUMBER) IS
2914     SELECT RESOURCE_ID,RESOURCE_TYPE_CODE
2915     FROM   JTF_TASK_ASSIGNMENTS
2916     WHERE  TASK_ASSIGNMENT_ID=c_task_assignment_id;
2917 
2918     CURSOR  csp_resource_org(c_resource_id number, c_resource_type varchar2) IS
2919     SELECT  ORGANIZATION_ID, SUBINVENTORY_CODE
2920     FROM    CSP_INV_LOC_ASSIGNMENTS
2921     WHERE   RESOURCE_ID = c_resource_id
2922     AND     RESOURCE_TYPE = c_resource_type
2923     AND     DEFAULT_CODE = 'IN' ;
2924 
2925     CURSOR  csp_ship_to_location(c_resource_id number, c_resource_type varchar2) IS
2926     SELECT  SHIP_TO_LOCATION_ID
2927     FROM    CSP_RS_SHIP_TO_ADDRESSES_V
2928     WHERE   RESOURCE_ID = c_resource_id
2929     AND     RESOURCE_TYPE = c_resource_type
2930     AND     PRIMARY_FLAG = 'Y';
2931 
2932     l_api_name                 VARCHAR2(60) := 'CSP_SCH_INT_PVT.CREATE_ORDERS';
2933     l_parts_header             csp_parts_requirement.Header_rec_type;
2934     l_parts_lines              csp_parts_requirement.Line_Tbl_type;
2935     l_requrements_lines        CSP_Requirement_Lines_PVT.Requirement_Line_Tbl_Type;
2936     l_return_status            VARCHAR2(30);
2937     l_msg_count                NUMBER;
2938     l_msg_data                 VARCHAR2(1000);
2939     l_resource_id              NUMBER;
2940     l_resource_type            VARCHAR2(30);
2941     l_destination_org_id       NUMBER;
2942     l_destination_sub_inv      VARCHAR2(10);
2943     l_item_id                  NUMBER;
2944     l_uom_code                 VARCHAR2(3);
2945     l_ship_set                 VARCHAR2(30);
2946     l_source_org               NUMBER;
2947     l_order_quantity           NUMBER;
2948     l_revision                 VARCHAR2(3);
2949     l_line_id                  NUMBER;
2950     rec_count                     NUMBER;
2951     l_ship_to_location_id         NUMBER;
2952     l_reservation_id              NUMBER;
2953     x_reservation_id              NUMBER;
2954     l_header_id                   NUMBER;
2955   BEGIN
2956         x_return_status := FND_API.G_RET_STS_SUCCESS;
2957         SAVEPOINT CREATE_ORDERS;
2958         OPEN get_resource(p_task_assignment_id);
2959         LOOP
2960             FETCH get_resource INTO l_resource_id,l_resource_type;
2961             EXIT WHEN get_resource% NOTFOUND;
2962         END LOOP;
2963         CLOSE get_resource;
2964 
2965         OPEN csp_resource_org(l_resource_id,l_resource_type);
2966         LOOP
2967             FETCH csp_resource_org INTO l_destination_org_id,l_destination_sub_inv ;
2968             EXIT WHEN csp_resource_org%NOTFOUND;
2969         END LOOP;
2970         CLOSE csp_resource_org;
2971         /*OPEN get_parts(p_task_assignment_id);
2972         rec_count := 1;
2973         LOOP
2974             FETCH get_parts INTO l_item_id,l_uom_code,l_revision,
2975                                  l_ship_set,l_source_org,l_order_quantity,
2976                                  l_line_id,l_reservation_id;
2977             EXIT WHEN get_parts % NOTFOUND ;
2978             l_parts_lines(rec_count).inventory_item_id := l_item_id;
2979             --l_parts_lines(rec_count).item_description  := 'test';
2980             l_parts_lines(rec_count).line_num := rec_count ;
2981             l_parts_lines(rec_count).revision          := l_revision;
2982             l_parts_lines(rec_count).quantity          := NULL;
2983             l_parts_lines(rec_count).unit_of_measure   := l_uom_code ;
2984             l_parts_lines(rec_count).dest_subinventory := l_destination_sub_inv ;
2985             l_parts_lines(rec_count).source_organization_id  :=  l_source_org ;
2986             l_parts_lines(rec_count).source_subinventory     :=  NULL;
2987             l_parts_lines(rec_count).ship_complete           :=  l_ship_set;
2988             l_parts_lines(rec_count).likelihood              :=  NULL;
2989             l_parts_lines(rec_count).ordered_quantity        :=  l_order_quantity;
2990             l_parts_lines(rec_count).reservation_id          :=  l_reservation_id;
2991             l_parts_lines(rec_count).requirement_line_id     :=  l_line_id;
2992             rec_count := rec_count + 1;
2993         END LOOP;
2994         CLOSE get_parts;*/
2995         /*OPEN C1(p_task_assignment_id);
2996         LOOP
2997             FETCH C1 INTO l_header_id;
2998             EXIT WHEN C1%NOTFOUND;
2999         END LOOP;
3000         CLOSE C1;
3001         OPEN C2(l_header_id);
3002         rec_count := 1;
3003         LOOP
3004             l_item_id := null;
3005             l_uom_code := null;
3006             l_revision := null;
3007             l_ship_set := null;
3008             l_source_org := null;
3009             l_order_quantity := null;
3010             l_line_id := null;
3011             l_reservation_id := null;
3012             FETCH C2 INTO l_item_id,l_uom_code,l_revision,
3013                                  l_ship_set,l_source_org,l_order_quantity,
3014                                  l_line_id,l_reservation_id;
3015             EXIT WHEN C2 % NOTFOUND ;
3016             l_parts_lines(rec_count).inventory_item_id := l_item_id;
3017             --l_parts_lines(rec_count).item_description  := 'test';
3018             l_parts_lines(rec_count).line_num := rec_count ;
3019             l_parts_lines(rec_count).revision          := l_revision;
3020             l_parts_lines(rec_count).quantity          := NULL;
3021             l_parts_lines(rec_count).unit_of_measure   := l_uom_code ;
3022             l_parts_lines(rec_count).dest_subinventory := l_destination_sub_inv ;
3023             l_parts_lines(rec_count).source_organization_id  :=  l_source_org ;
3024             l_parts_lines(rec_count).source_subinventory     :=  NULL;
3025             l_parts_lines(rec_count).ship_complete           :=  l_ship_set;
3026             l_parts_lines(rec_count).likelihood              :=  NULL;
3027             l_parts_lines(rec_count).ordered_quantity        :=  l_order_quantity;
3028             --l_parts_lines(rec_count).reservation_id          :=  l_reservation_id;
3029             l_parts_lines(rec_count).requirement_line_id     :=  l_line_id;
3030             rec_count := rec_count + 1;
3031         END LOOP;
3032         CLOSE C2;
3033         OPEN csp_ship_to_location(l_resource_id,l_resource_type);
3034         LOOP
3035             FETCH csp_ship_to_location INTO l_ship_to_location_id;
3036             EXIT WHEN csp_ship_to_location% NOTFOUND;
3037         END LOOP;
3038         CLOSE csp_ship_to_location;
3039         l_parts_header.ORDER_TYPE_ID := FND_PROFILE.value(name => 'CSP_ORDER_TYPE');
3040         l_parts_header.SHIP_TO_LOCATION_ID :=  l_ship_to_location_id;
3041         l_parts_header.DEST_ORGANIZATION_ID := l_destination_org_id;
3042         l_parts_header.OPERATION := 'CREATE';
3043         CSP_PARTS_ORDER.process_order(
3044                                       p_api_version   =>  1.0
3045                                      ,p_Init_Msg_List =>  FND_API.G_FALSE
3046                                      ,p_commit        =>  FND_API.G_FALSE
3047                                      ,px_header_rec   =>  l_parts_header
3048                                      ,px_line_table   =>  l_parts_lines
3049                                      ,x_return_status =>  l_return_status
3050                                      ,x_msg_count     =>  l_msg_count
3051                                      ,x_msg_data      =>  l_msg_data
3052                                      );
3053        IF x_return_status <> FND_API.G_RET_STS_SUCCESS THEN
3054             ROLLBACK TO CREATE_ORDERS;
3055              x_return_status := FND_API.G_RET_STS_ERROR;
3056              FND_MESSAGE.SET_NAME('CSP', 'CSP_SCH_UNABLE_TO_ORDER');
3057              FND_MSG_PUB.ADD;
3058              fnd_msg_pub.count_and_get
3059                             ( p_count => x_msg_count
3060                             , p_data  => x_msg_data);
3061             return;
3062        ELSE
3063           FOR I IN 1..l_parts_lines.count LOOP
3064                 l_requrements_lines(I).REQUIREMENT_LINE_ID :=  l_parts_lines(I).requirement_line_id;
3065                 l_requrements_lines(I).ORDER_LINE_ID       :=  l_parts_lines(I).order_line_id;
3066                 CSP_SCH_INT_PVT.TRANSFER_RESERVATION(p_reservation_id  => l_parts_lines(I).reservation_id
3067                                                     ,p_order_header_id => l_parts_header.order_header_id
3068                                                     ,p_order_line_id   => l_parts_lines(I).order_line_id
3069                                                     ,x_return_status   => x_return_status
3070                                                     ,x_reservation_id  => x_reservation_id
3071                                                     ,x_msg_data        => x_msg_data
3072                                                     ,x_msg_count       => x_msg_count);
3073                IF x_return_status <> FND_API.G_RET_STS_SUCCESS THEN
3074                     Rollback to CREATE_ORDERS;
3075                     x_msg_data := ' Unable to Transfer Reservations';
3076                     x_return_status := FND_API.G_RET_STS_ERROR;
3077                     return;
3078                ELSE
3079                     l_requrements_lines(I).reservation_id := x_reservation_id;
3080                END IF;
3081           END LOOP;
3082           CSP_Requirement_Lines_PVT.Update_requirement_lines(
3083                                     P_Api_Version_Number     => 1.0,
3084                                     P_Init_Msg_List          => FND_API.G_FALSE,
3085                                     P_Commit                 => FND_API.G_FALSE,
3086                                     p_validation_level       => FND_API.G_VALID_LEVEL_FULL,
3087                                     P_Requirement_Line_Tbl   => l_requrements_lines,
3088                                     X_Return_Status          => l_return_status,
3089                                     X_Msg_Count              => l_msg_count,
3090                                     X_Msg_Data               => l_msg_data
3091                                     )  ;
3092          IF x_return_status <> FND_API.G_RET_STS_SUCCESS THEN
3093             ROLLBACK TO CREATE_ORDERS;
3094             return;
3095          END IF;
3096       END IF;
3097       EXCEPTION
3098         WHEN OTHERS THEN
3099             FND_MESSAGE.SET_NAME('CSP', 'CSP_UNEXPECTED_EXEC_ERRORS');
3100             FND_MESSAGE.SET_TOKEN('ROUTINE', l_api_name, TRUE);
3101             FND_MESSAGE.SET_TOKEN('SQLERRM', sqlerrm, TRUE);
3102             FND_MSG_PUB.ADD;
3103             fnd_msg_pub.count_and_get
3104               ( p_count => x_msg_count
3105               , p_data  => x_msg_data);
3106             x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
3107   END CREATE_ORDERS;*/
3108 
3109   PROCEDURE GET_ORGANIZATION_SUBINV( p_resources            IN  CSP_SCH_INT_PVT.csp_sch_resource_tbl_typ
3110                                     ,x_resource_org_subinv  OUT NOCOPY CSP_SCH_INT_PVT.csp_resource_org_tbl_typ
3111                                     ,x_return_status        OUT NOCOPY VARCHAR2
3112                                     ,x_msg_data             OUT NOCOPY VARCHAR2
3113                                     ,x_msg_count            OUT NOCOPY NUMBER) IS
3114 
3115         CURSOR csp_resource_org(l_resource_id number, l_resource_type varchar2) IS
3116         SELECT  ORGANIZATION_ID, SUBINVENTORY_CODE
3117         FROM    CSP_INV_LOC_ASSIGNMENTS
3118         WHERE   RESOURCE_ID = l_resource_id
3119         AND     RESOURCE_TYPE = l_resource_type
3120         AND     DEFAULT_CODE = 'IN' ;
3121 
3122         CURSOR csp_resource_type_name(l_resource_type varchar2) is
3123         SELECT NAME
3124         FROM JTF_OBJECTS_VL
3125         WHERE OBJECT_CODE = l_resource_type;
3126         l_organization NUMBER;
3127         l_sub_inventory VARCHAR2(10);
3128         l_api_name   varchar2(60) :=    'CSP_SCH_INT_PVT.GET_ORGANIZATION_SUBINV';
3129         l_msg_count  number;
3130         l_msg_data   number;
3131         l_resource_name varchar2(1000);
3132         l_resource_type_name varchar2(1000);
3133   BEGIN
3134         x_return_status := FND_API.G_RET_STS_SUCCESS;
3135         x_resource_org_subinv := CSP_SCH_INT_PVT.csp_resource_org_tbl_typ();
3136         FOR I IN 1..p_resources.count
3137                 LOOP
3138                         OPEN csp_resource_org(p_resources(I).resource_id, p_resources(I).resource_type);
3139                         LOOP
3140                                 FETCH csp_resource_org INTO l_organization,l_sub_inventory ;
3141                                 EXIT WHEN csp_resource_org%NOTFOUND ;
3142                         END LOOP;
3143 
3144                         IF csp_resource_org%rowcount =0 THEN
3145                         /*select csp_pick_utils.get_object_name(p_resources(I).resource_type,p_resources(I).resource_id)
3146                         INTO   l_resource_name
3147                         FROM   DUAL;*/
3148                         OPEN csp_resource_type_name(p_resources(I).resource_type);
3149                         LOOP
3150                             FETCH csp_resource_type_name INTO l_resource_type_name;
3151                             EXIT WHEN csp_resource_type_name%NOTFOUND;
3152                         END LOOP;
3153                         CLOSE csp_resource_type_name;
3154                         l_resource_name := csp_pick_utils.get_object_name(p_resources(I).resource_type,p_resources(I).resource_id);
3155                         FND_MESSAGE.SET_NAME('CSP', 'CSP_SCH_DEFAULT_SUBINV');
3156                         FND_MESSAGE.SET_TOKEN('RESOURCE_TYPE',l_resource_type_name,FALSE);
3157                         FND_MESSAGE.SET_TOKEN('RESOURCE_NAME',l_resource_name, FALSE);
3158                         FND_MSG_PUB.ADD;
3159                         fnd_msg_pub.count_and_get( p_count => x_msg_count
3160                                                  , p_data  => x_msg_data);
3161                       --  x_msg_data := 'Default organization and subinventory not defined for  ' || l_resource_type_name || '  ' || l_resource_name ;
3162                         x_return_status := FND_API.G_RET_STS_ERROR;
3163                         return;
3164                         END IF;
3165             CLOSE csp_resource_org;
3166                          x_resource_org_subinv.extend;
3167                          x_resource_org_subinv(I).resource_id := p_resources(I).resource_id ;
3168                          x_resource_org_subinv(I).resource_type := p_resources(I).resource_type ;
3169                          x_resource_org_subinv(I).organization_id := l_organization;
3170                          x_resource_org_subinv(I).sub_inv_code  := l_sub_inventory;
3171         END LOOP;
3172         EXCEPTION
3173         WHEN OTHERS THEN
3174             FND_MESSAGE.SET_NAME('CSP', 'CSP_UNEXPECTED_EXEC_ERRORS');
3175             FND_MESSAGE.SET_TOKEN('ROUTINE', l_api_name, FALSE);
3176             FND_MESSAGE.SET_TOKEN('SQLERRM', sqlerrm,FALSE);
3177             FND_MSG_PUB.ADD;
3178             fnd_msg_pub.count_and_get
3179               ( p_count => x_msg_count
3180               , p_data  => x_msg_data);
3181             x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
3182   END GET_ORGANIZATION_SUBINV;
3183 
3184   PROCEDURE GET_PARTS_LIST(p_task_id       IN NUMBER
3185                            ,p_likelihood    IN NUMBER
3186                            ,x_parts_list    OUT NOCOPY CSP_SCH_INT_PVT.csp_parts_tbl_typ1
3187                            ,x_return_status OUT NOCOPY VARCHAR2
3188                            ,x_msg_data      OUT NOCOPY VARCHAR2
3189                            ,x_msg_count     OUT NOCOPY NUMBER) IS
3190 
3191         CURSOR parts_list(product_task NUMBER,  parts_category NUMBER) IS
3192         SELECT INVENTORY_ITEM_ID,REQUIRED_QUANTITY , UOM_CODE,SHIP_COMPLETE_FLAG,REVISION,REQUIREMENT_LINE_ID
3193         FROM   CSP_REQUIREMENT_LINES crl, CSP_REQUIREMENT_HEADERS crh
3194         WHERE  crh.TASK_ID = product_task
3195         AND    crl.requirement_header_id = crh.requirement_header_id
3196         AND    nvl(crl.LIKELIHOOD,0) >= nvl(parts_category,0) ;
3197 
3198         part_number   NUMBER;
3199         part_quantity NUMBER;
3200         l_requirement_header_id NUMBER;
3201         part_uom      varchar2(3) ;
3202         l_ship_complet VARCHAR2(30);
3203         l_msg_data     VARCHAR2(2000);
3204         l_msg_count    NUMBER;
3205         l_revision     varchar2(3);
3206         l_api_name     varchar2(60) := 'CSP_SCH_INT_PVT.GET_PARTS_LIST' ;
3207         l_header_id    NUMBER;
3208         loop_count     NUMBER := 0;
3209         l_line_id     NUMBER;
3210 
3211   BEGIN
3212        -- savepoint GET_PARTS_LIST;
3213         x_return_status := FND_API.G_RET_STS_SUCCESS ;
3214        --x_parts_list := CSP_SCH_INT_PVT.csp_parts_tbl_typ1();
3215             OPEN parts_list(p_task_id, p_likelihood);
3216                 LOOP
3217                     FETCH parts_list  INTO part_number, part_quantity , part_uom , l_ship_complet,l_revision , l_line_id;
3218                     EXIT WHEN parts_list % NOTFOUND;
3219                         --x_parts_list.extend;
3220                         loop_count := loop_count + 1;
3221                         x_parts_list(loop_count).item_id       :=  part_number ;
3222                         x_parts_list(loop_count).quantity      :=  part_quantity ;
3223                         x_parts_list(loop_count).Item_UOM      :=  part_uom;
3224                         x_parts_list(loop_count).ship_set_name :=  l_ship_complet ;
3225                         x_parts_list(loop_count).revision      :=  l_revision;
3226                         x_parts_list(loop_count).line_id       :=  l_line_id;
3227                 END LOOP;
3228            CLOSE parts_list;
3229         EXCEPTION
3230         WHEN OTHERS THEN
3231         FND_MESSAGE.SET_NAME('CSP', 'CSP_UNEXPECTED_EXEC_ERRORS');
3232             FND_MESSAGE.SET_TOKEN('ROUTINE', l_api_name, FALSE);
3233             FND_MESSAGE.SET_TOKEN('SQLERRM', sqlerrm, FALSE);
3234             FND_MSG_PUB.ADD;
3235             fnd_msg_pub.count_and_get
3236               ( p_count => x_msg_count
3237               , p_data  => x_msg_data);
3238             x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
3239         return;
3240   END GET_PARTS_LIST;
3241   PROCEDURE CHECK_LOCAl_INVENTORY(p_resource_org_subinv  IN   CSP_SCH_INT_PVT.CSP_RESOURCE_ORG_tbl_TYP
3242                                  ,p_parts_list          IN   CSP_SCH_INT_PVT.CSP_PARTS_TBL_TYP1
3243                                  ,p_trunk               IN  BOOLEAN
3244                                  ,x_unavailable_list    OUT NOCOPY  CSP_SCH_INT_PVT.CSP_UNAVAILABILITY_TBL_TYPE
3245                                  ,x_available_list      OUT NOCOPY  CSP_SCH_INT_PVT.CSP_AVAILABILITY_TBL_TYPE
3246                                  ,x_return_status       OUT NOCOPY  VARCHAR2
3247                                  ,x_msg_data            OUT NOCOPY  VARCHAR2
3248                                  ,x_msg_count           OUT NOCOPY  NUMBER) IS
3249    /* CURSOR reservation_check(org_id NUMBER, sub_inv_code VARCHAR2,item_id NUMBER)
3250     IS
3251     SELECT NVL((REQUIRED_QUANTITY-ORDERED_QUANTITY),0)
3252     FROM   CSP_REQUIREMENT_LINES
3253     WHERE  REQUIREMENT_HEADER_ID = (SELECT REQUIREMENT_HEADER_ID
3254                                     FROM   CSP_REQUIREMENT_HEADERS
3255                                     WHERE  OPEN_REQUIREMENT = 'Yes'
3256                                     AND    DESTINATION_ORGANIZATION_ID = org_id)
3257     AND   SOURCE_SUBINVENTORY =  sub_inv_code
3258     AND   INVENTORY_ITEM_ID = item_id
3259     AND   ORDER_LINE_ID IS NOT NULL ;*/
3260 
3261         CURSOR substitutes(item_id NUMBER,org_id NUMBER) IS
3262         SELECT mri.RELATED_ITEM_ID
3263         FROM   MTL_RELATED_ITEMS_VIEW mri, mtl_parameters mp
3264         WHERE  mp.organization_id = org_id
3265         AND    mri.INVENTORY_ITEM_ID = item_id
3266         AND    mri.RELATIONSHIP_TYPE_ID = 2
3267         AND    mri.ORGANIZATION_ID  = MP.MASTER_ORGANIZATION_ID;
3268 
3269     l_onhand            NUMBER;
3270     l_available         NUMBER;
3271     l_msg_data          VARCHAR2(2000);
3272     l_msg_count         NUMBER;
3273     l_return_status     VARCHAR2(128);
3274     l_rqoh              NUMBER;
3275     l_qr                NUMBER;
3276     l_qs                NUMBER;
3277     l_att               NUMBER;
3278     l_temp_reserv_quantity NUMBER;
3279     l_substitute_item  NUMBER;
3280     l_api_name varchar2(60) := 'CSP_SCH_INT_PVT.CHECK_LOCAl_INVENTORY';
3281    --- l_cumulative_att   NUMBER;
3282     l_supersede_items  CSP_SUPERSESSIONS_PVT.NUMBER_ARR;
3283     l_required_quantity NUMBER;
3284     l_alternate_parts CSP_SUPERSESSIONS_PVT.NUMBER_ARR;
3285     l_append     boolean := true;
3286     l_revision_controlled BOOLEAN := false;
3287     l_reservation_parts       CSP_SCH_INT_PVT.RESERVATION_REC_TYP;
3288     l_reservation_id NUMBER;
3289      l_res_ids CSP_SUPERSESSIONS_PVT.NUMBER_ARR;
3290   BEGIN
3291       savepoint csp_check_local_inv;
3292       x_return_status := FND_API.G_RET_STS_SUCCESS;
3293       x_unavailable_list:=  CSP_SCH_INT_PVT.CSP_UNAVAILABILITY_TBL_TYPE();
3294       x_available_list  := CSP_SCH_INT_PVT.CSP_AVAILABILITY_TBL_TYPE();
3295       if l_res_ids.count > 0 THEN
3296         l_res_ids.delete;
3297       END IF;
3298           FOR I IN 1..p_resource_org_subinv.count LOOP
3299             FOR J IN 1..p_parts_list.count LOOP
3300                           l_required_quantity := 0;
3301                IF fnd_profile.value(name => 'CSP_INCL_ALTERNATES')= 'ALWAYS' or
3302                   fnd_profile.value(name => 'CSP_INCL_ALTERNATES')= 'SCHONLY'  THEN
3303                  if l_alternate_parts.count >0 THEN
3304                     l_alternate_parts.delete;
3305                  END IF;
3306                  if l_supersede_items.count > 0 THEN
3307                     l_supersede_items.DELETE;
3308                  END IF;
3309                 CSP_SUPERSESSIONS_PVT.get_supersede_bilateral_items(p_inventory_item_id => p_parts_list(J).item_id
3310                                                     ,p_organization_id => p_resource_org_subinv(I).organization_id
3311                                                     ,x_supersede_items => l_supersede_items);
3312                 l_alternate_parts := l_supersede_items;
3313 
3314                 OPEN substitutes(p_parts_list(J).item_id, p_resource_org_subinv(I).organization_id);
3315                 LOOP
3316                   FETCH substitutes INTO l_substitute_item;
3317                   EXIT WHEN substitutes % NOTFOUND;
3318                     l_append := true;
3319                     FOR I IN 1.. l_alternate_parts.count LOOP
3320                         if l_substitute_item =  l_alternate_parts(I) then
3321                            l_append := false;
3322                            exit;
3323                         end if;
3324                     END LOOP;
3325                         IF l_append THEN
3326                             l_alternate_parts(l_alternate_parts.count+1) := l_substitute_item;
3327                         END IF;
3328                     l_substitute_item := null;
3329                 END LOOP;
3330                 CLOSE substitutes;
3331                 END IF;
3332 
3333                IF (fnd_profile.value(name => 'CSP_INCL_CAR_STOCK')= 'ALWAYS' or
3334                   fnd_profile.value(name => 'CSP_INCL_CAR_STOCK')= 'SCHONLY') and
3335                   nvl(p_trunk,TRUE) THEN
3336                 l_att := 0;
3337                     IF p_parts_list(J).revision IS NOT NULL THEN
3338                         l_revision_controlled := TRUE;
3339                     END IF;
3340                     inv_quantity_tree_pub.clear_quantity_cache;
3341                 inv_quantity_tree_pub.query_quantities(p_api_version_number => 1.0
3342                                                      , p_organization_id  => p_resource_org_subinv(I).organization_id
3343                                                      , p_inventory_item_id => p_parts_list(J).item_id
3344                                                      , p_subinventory_code => p_resource_org_subinv(I).sub_inv_code
3345                                                      , x_qoh     => l_onhand
3346                                                      , x_atr     => l_available
3347                                                      , p_init_msg_lst   => fnd_api.g_false
3348                                                      , p_tree_mode   => inv_quantity_tree_pvt.g_transaction_mode
3349                                                      , p_is_revision_control => l_revision_controlled
3350                                                      , p_is_lot_control  => NULL
3351                                                      , p_is_serial_control => NULL
3352                                                      , p_revision    =>  p_parts_list(J).revision
3353                                                      , p_lot_number   => NULL
3354                                                      , p_locator_id   => NULL
3355                                                      , x_rqoh     => l_rqoh
3356                                                      , x_qr     => l_qr
3357                                                      , x_qs     => l_qs
3358                                                      , x_att     => l_att
3359                                                      , x_return_status  => l_return_status
3360                                                      , x_msg_count   => l_msg_count
3361                                                      , x_msg_data    => l_msg_data
3362                                                      );
3363                 IF x_return_status <> FND_API.G_RET_STS_SUCCESS THEN
3364                     l_att := 0;
3365                 END IF;
3366                     /*OPEN reservation_check(p_resource_org_subinv(I).organization_id, p_resource_org_subinv(I).sub_inv_code,p_parts_list(J).item_id);
3367                     LOOP
3368                         FETCH reservation_check INTO l_temp_reserv_quantity;
3369                         EXIT WHEN reservation_check% NOTFOUND;
3370                         l_att := l_att - l_temp_reserv_quantity ;
3371                      END LOOP;
3372                     CLOSE reservation_check;*/
3373                     IF l_att <= 0 THEN
3374                         l_att := 0;
3375                     ELSIF  l_att >=  p_parts_list(J).quantity THEN
3376                         x_available_list.extend;
3377                         x_available_list(x_available_list.count).resource_id := p_resource_org_subinv(I).resource_id;
3378                         x_available_list(x_available_list.count).resource_type := p_resource_org_subinv(I).resource_type;
3379                         x_available_list(x_available_list.count).organization_id   := p_resource_org_subinv(I).organization_id;
3380                         x_available_list(x_available_list.count).item_id   := p_parts_list(J).item_id ;
3381                         x_available_list(x_available_list.count).item_uom   := p_parts_list(J).item_uom ;
3382                         x_available_list(x_available_list.count).revision   := p_parts_list(J).revision ;
3383                         x_available_list(x_available_list.count).quantity  := p_parts_list(J).quantity  ;
3384                         x_available_list(x_available_list.count).source_org := p_resource_org_subinv(I).organization_id ;
3385                         x_available_list(x_available_list.count).sub_inventory := p_resource_org_subinv(I).sub_inv_code;
3386                         x_available_list(x_available_list.count).AVAILABLE_DATE  := SYSDATE;
3387                         x_available_list(x_available_list.count).line_id  := p_parts_list(J).line_id;
3388                         IF l_alternate_parts.count >0 THEN
3389                          l_reservation_id := NULL;
3390                             l_reservation_parts.need_by_date       := sysdate;
3391                             l_reservation_parts.organization_id    := x_available_list(x_available_list.count).source_org ;
3392                             l_reservation_parts.item_id            := x_available_list(x_available_list.count).item_id;
3393                             l_reservation_parts.item_uom_code      := x_available_list(x_available_list.count).item_uom ;
3394                             l_reservation_parts.quantity_needed    := x_available_list(x_available_list.count).quantity ;
3395                             l_reservation_parts.sub_inventory_code := x_available_list(x_available_list.count).sub_inventory;
3396                             l_reservation_parts.line_id            := x_available_list(x_available_list.count).line_id ;
3397                             l_reservation_parts.revision           :=  x_available_list(x_available_list.count).revision;
3398                             l_reservation_id := CSP_SCH_INT_PVT.CREATE_RESERVATION(l_reservation_parts,x_return_status,x_msg_data);
3399 
3400                          IF l_reservation_id <= 0 THEN
3401                             FND_MESSAGE.SET_NAME('CSP', 'CSP_SCH_COULD_NOT_RESERVE');
3402                             FND_MSG_PUB.ADD;
3403                             fnd_msg_pub.count_and_get
3404                                 ( p_count => x_msg_count
3405                                 , p_data  => x_msg_data);
3406                          else
3407                              l_res_ids(l_res_ids.count+1) := l_reservation_id;
3408                          END IF;
3409                         END IF;
3410                     ELSIF l_att <=  p_parts_list(J).quantity THEN
3411                         x_available_list.extend;
3412                         x_available_list(x_available_list.count).resource_id := p_resource_org_subinv(I).resource_id;
3413                         x_available_list(x_available_list.count).resource_type := p_resource_org_subinv(I).resource_type;
3414                         x_available_list(x_available_list.count).organization_id   := p_resource_org_subinv(I).organization_id;
3415                         x_available_list(x_available_list.count).item_id   := p_parts_list(J).item_id ;
3416                         x_available_list(x_available_list.count).item_uom   := p_parts_list(J).item_uom ;
3417                         x_available_list(x_available_list.count).revision   := p_parts_list(J).revision ;
3418                         x_available_list(x_available_list.count).quantity  := l_att ;
3419                         x_available_list(x_available_list.count).source_org := p_resource_org_subinv(I).organization_id ;
3420                         x_available_list(x_available_list.count).sub_inventory := p_resource_org_subinv(I).sub_inv_code;
3421                         x_available_list(x_available_list.count).AVAILABLE_DATE  := SYSDATE;
3422                         x_available_list(x_available_list.count).line_id  := p_parts_list(J).line_id;
3423                          IF l_alternate_parts.count >0 THEN
3424                             l_reservation_id := NULL;
3425                             l_reservation_parts.need_by_date       := sysdate;
3426                             l_reservation_parts.organization_id    := x_available_list(x_available_list.count).source_org ;
3427                             l_reservation_parts.item_id            := x_available_list(x_available_list.count).item_id;
3428                             l_reservation_parts.item_uom_code      := x_available_list(x_available_list.count).item_uom ;
3429                             l_reservation_parts.quantity_needed    := x_available_list(x_available_list.count).quantity ;
3430                             l_reservation_parts.sub_inventory_code := x_available_list(x_available_list.count).sub_inventory;
3431                             l_reservation_parts.line_id            := x_available_list(x_available_list.count).line_id ;
3432                             l_reservation_parts.revision           :=  x_available_list(x_available_list.count).revision;
3433                              l_reservation_id := CSP_SCH_INT_PVT.CREATE_RESERVATION(l_reservation_parts,x_return_status,x_msg_data);
3434 
3435                          IF l_reservation_id <= 0 THEN
3436                             FND_MESSAGE.SET_NAME('CSP', 'CSP_SCH_COULD_NOT_RESERVE');
3437                             FND_MSG_PUB.ADD;
3438                             fnd_msg_pub.count_and_get
3439                                 ( p_count => x_msg_count
3440                                 , p_data  => x_msg_data);
3441                           else
3442                              l_res_ids(l_res_ids.count+1) := l_reservation_id;
3443                          END IF;
3444                         END IF;
3445                     END IF;
3446 
3447                     IF l_att < p_parts_list(J).quantity THEN
3448                     l_required_quantity := p_parts_list(J).quantity - l_att;
3449                          FOR K IN 1..l_alternate_parts.count LOOP
3450                             l_onhand := 0;
3451                             l_available := 0;
3452                             l_rqoh := 0;
3453                             l_qr := 0;
3454                             l_qs := 0;
3455                             l_att := 0;
3456                             l_msg_count := 0;
3457                             inv_quantity_tree_pub.clear_quantity_cache;
3458                             inv_quantity_tree_pub.query_quantities(p_api_version_number => 1.0
3459                                                      , p_organization_id  => p_resource_org_subinv(I).organization_id
3460                                                      , p_inventory_item_id => l_alternate_parts(k)
3461                                                      , p_subinventory_code => p_resource_org_subinv(I).sub_inv_code
3462                                                      , x_qoh     => l_onhand
3463                                                      , x_atr     => l_available
3464                                                      , p_init_msg_lst   => fnd_api.g_false
3465                                                      , p_tree_mode   => inv_quantity_tree_pvt.g_transaction_mode
3466                                                      , p_is_revision_control => NULL
3467                                                      , p_is_lot_control  => NULL
3468                                                      , p_is_serial_control => NULL
3469                                                      , p_revision    =>  NULL
3470                                                      , p_lot_number   => NULL
3471                                                      , p_locator_id   => NULL
3472                                                      , x_rqoh     => l_rqoh
3473                                                      , x_qr     => l_qr
3474                                                      , x_qs     => l_qs
3475                                                      , x_att     => l_att
3476                                                      , x_return_status  => l_return_status
3477                                                      , x_msg_count   => l_msg_count
3478                                                      , x_msg_data    => l_msg_data
3479                                                      );
3480 
3481                             IF l_att <= 0 THEN
3482                                 l_att := 0;
3483                             ELSIF  l_att >=  l_required_quantity THEN
3484                                 x_available_list.extend;
3485                                 x_available_list(x_available_list.count).resource_id := p_resource_org_subinv(I).resource_id;
3486                                 x_available_list(x_available_list.count).resource_type := p_resource_org_subinv(I).resource_type;
3487                                 x_available_list(x_available_list.count).organization_id   := p_resource_org_subinv(I).organization_id;
3488                                 x_available_list(x_available_list.count).item_id   := l_alternate_parts(k) ;
3489                                 x_available_list(x_available_list.count).item_uom   := p_parts_list(J).item_uom ;
3490                                 x_available_list(x_available_list.count).revision   := p_parts_list(J).revision ;
3491                                 x_available_list(x_available_list.count).quantity  := l_required_quantity ;
3492                                 x_available_list(x_available_list.count).source_org := p_resource_org_subinv(I).organization_id ;
3493                                 x_available_list(x_available_list.count).sub_inventory := p_resource_org_subinv(I).sub_inv_code;
3494                                 x_available_list(x_available_list.count).AVAILABLE_DATE  := SYSDATE;
3495                                 x_available_list(x_available_list.count).line_id  := p_parts_list(J).line_id;
3496                                 IF l_alternate_parts.count >0 THEN
3497                          l_reservation_id := NULL;
3498                             l_reservation_parts.need_by_date       := sysdate;
3499                             l_reservation_parts.organization_id    := x_available_list(x_available_list.count).source_org ;
3500                             l_reservation_parts.item_id            := x_available_list(x_available_list.count).item_id;
3501                             l_reservation_parts.item_uom_code      := x_available_list(x_available_list.count).item_uom ;
3502                             l_reservation_parts.quantity_needed    := x_available_list(x_available_list.count).quantity ;
3503                             l_reservation_parts.sub_inventory_code := x_available_list(x_available_list.count).sub_inventory;
3504                             l_reservation_parts.line_id            := x_available_list(x_available_list.count).line_id ;
3505                             l_reservation_parts.revision           :=  x_available_list(x_available_list.count).revision;
3506                             l_reservation_id := CSP_SCH_INT_PVT.CREATE_RESERVATION(l_reservation_parts,x_return_status,x_msg_data);
3507 
3508                          IF l_reservation_id <= 0 THEN
3509                             FND_MESSAGE.SET_NAME('CSP', 'CSP_SCH_COULD_NOT_RESERVE');
3510                             FND_MSG_PUB.ADD;
3511                             fnd_msg_pub.count_and_get
3512                                 ( p_count => x_msg_count
3513                                 , p_data  => x_msg_data);
3514                           else
3515                              l_res_ids(l_res_ids.count+1) := l_reservation_id;
3516                          END IF;
3517                         END IF;
3518                                 l_required_quantity := 0;
3519                                 exit;
3520                             ELSIF l_att <  l_required_quantity THEN
3521                                 x_available_list.extend;
3522                                 x_available_list(x_available_list.count).resource_id := p_resource_org_subinv(I).resource_id;
3523                                 x_available_list(x_available_list.count).resource_type := p_resource_org_subinv(I).resource_type;
3524                                 x_available_list(x_available_list.count).organization_id   := p_resource_org_subinv(I).organization_id;
3525                                 x_available_list(x_available_list.count).item_id   := l_alternate_parts(k) ;
3526                                 x_available_list(x_available_list.count).item_uom   := p_parts_list(J).item_uom ;
3527                                 x_available_list(x_available_list.count).revision   := p_parts_list(J).revision ;
3528                                 x_available_list(x_available_list.count).quantity  := l_att ;
3529                                 x_available_list(x_available_list.count).source_org := p_resource_org_subinv(I).organization_id ;
3530                                 x_available_list(x_available_list.count).sub_inventory := p_resource_org_subinv(I).sub_inv_code;
3531                                 x_available_list(x_available_list.count).AVAILABLE_DATE  := SYSDATE;
3532                                 x_available_list(x_available_list.count).line_id  := p_parts_list(J).line_id;
3533                                 IF l_alternate_parts.count >0 THEN
3534                          l_reservation_id := NULL;
3535                             l_reservation_parts.need_by_date       := sysdate;
3536                             l_reservation_parts.organization_id    := x_available_list(x_available_list.count).source_org ;
3537                             l_reservation_parts.item_id            := x_available_list(x_available_list.count).item_id;
3538                             l_reservation_parts.item_uom_code      := x_available_list(x_available_list.count).item_uom ;
3539                             l_reservation_parts.quantity_needed    := x_available_list(x_available_list.count).quantity ;
3540                             l_reservation_parts.sub_inventory_code := x_available_list(x_available_list.count).sub_inventory;
3541                             l_reservation_parts.line_id            := x_available_list(x_available_list.count).line_id ;
3542                             l_reservation_parts.revision           :=  x_available_list(x_available_list.count).revision;
3543                             l_reservation_id := CSP_SCH_INT_PVT.CREATE_RESERVATION(l_reservation_parts,x_return_status,x_msg_data);
3544 
3545                          IF l_reservation_id <= 0 THEN
3546                             FND_MESSAGE.SET_NAME('CSP', 'CSP_SCH_COULD_NOT_RESERVE');
3547                             FND_MSG_PUB.ADD;
3548                             fnd_msg_pub.count_and_get
3549                                 ( p_count => x_msg_count
3550                                 , p_data  => x_msg_data);
3551                            else
3552                              l_res_ids(l_res_ids.count+1) := l_reservation_id;
3553                          END IF;
3554                         END IF;
3555                             END IF;
3556                             l_required_quantity := l_required_quantity - l_att ;
3557                          END LOOP;
3558                     END IF;
3559                   ELSE
3560                     l_required_quantity := p_parts_list(J).quantity;
3561                   END IF;
3562                 IF l_required_quantity > 0 THEN
3563                         x_unavailable_list.extend ;
3564                         x_unavailable_list(x_unavailable_list.count).resource_id
3565                                                                         := p_resource_org_subinv(I).resource_id;
3566                         x_unavailable_list(x_unavailable_list.count).resource_type
3567                                                                         := p_resource_org_subinv(I).resource_type;
3568                         x_unavailable_list(x_unavailable_list.count).organization_id   := p_resource_org_subinv(I).organization_id;
3569                         x_unavailable_list(x_unavailable_list.count).item_id   := p_parts_list(J).Item_id ;
3570                         x_unavailable_list(x_unavailable_list.count).quantity  := l_required_quantity;
3571                         x_unavailable_list(x_unavailable_list.count).item_UOM := p_parts_list(J).Item_UOM ;
3572                         x_unavailable_list(x_unavailable_list.count).revision := p_parts_list(J).revision   ;
3573                         x_unavailable_list(x_unavailable_list.count).ship_set_name := p_parts_list(J).ship_set_name;
3574                         x_unavailable_list(x_unavailable_list.count).line_id := p_parts_list(J).line_id;
3575                     FOR K IN 1..l_alternate_parts.count LOOP
3576                         x_unavailable_list.extend ;
3577                         x_unavailable_list(x_unavailable_list.count).resource_id
3578                                                                         := p_resource_org_subinv(I).resource_id;
3579                         x_unavailable_list(x_unavailable_list.count).resource_type
3580                                                                         := p_resource_org_subinv(I).resource_type;
3581                         x_unavailable_list(x_unavailable_list.count).organization_id   := p_resource_org_subinv(I).organization_id;
3582                         x_unavailable_list(x_unavailable_list.count).item_id   := l_alternate_parts(k);
3583                         x_unavailable_list(x_unavailable_list.count).quantity  := l_required_quantity;
3584                         x_unavailable_list(x_unavailable_list.count).item_UOM := p_parts_list(J).Item_UOM ;
3585                         x_unavailable_list(x_unavailable_list.count).revision := p_parts_list(J).revision ;
3586                         x_unavailable_list(x_unavailable_list.count).ship_set_name := p_parts_list(J).ship_set_name;
3587                         x_unavailable_list(x_unavailable_list.count).line_id := p_parts_list(J).line_id;
3588                     END LOOP;
3589                 END IF;
3590                 END LOOP;
3591             END LOOP;
3592              for i in 1..l_res_ids.count loop
3593                 CSP_SCH_INT_PVT.DELETE_RESERVATION(l_res_ids(i),x_return_status,x_msg_data);
3594               end loop;
3595       EXCEPTION
3596         WHEN OTHERS THEN
3597             FND_MESSAGE.SET_NAME('CSP', 'CSP_UNEXPECTED_EXEC_ERRORS');
3598             FND_MESSAGE.SET_TOKEN('ROUTINE', l_api_name, FALSE);
3599             FND_MESSAGE.SET_TOKEN('SQLERRM', sqlerrm, FALSE);
3600             FND_MSG_PUB.ADD;
3601             fnd_msg_pub.count_and_get
3602               ( p_count => x_msg_count
3603               , p_data  => x_msg_data);
3604             x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
3605             return;
3606   END  CHECK_LOCAl_INVENTORY;
3607   --hehxxx
3608    PROCEDURE SPARES_CHECK(p_unavailable_list       IN     CSP_SCH_INT_PVT.CSP_UNAVAILABILITY_TBL_TYPE
3609                          ,p_interval               IN     CSP_SCH_INT_PVT.csp_sch_interval_rec_typ
3610                          ,px_available_list        IN OUT NOCOPY CSP_SCH_INT_PVT.CSP_AVAILABILITY_TBL_TYPE
3611                          ,x_final_unavailable_list OUT NOCOPY    CSP_SCH_INT_PVT.CSP_UNAVAILABILITY_TBL_TYPE
3612                          ,x_return_status          OUT NOCOPY    VARCHAR2
3613                          ,x_msg_data               OUT NOCOPY    VARCHAR2
3614                          ,x_msg_count              OUT NOCOPY    NUMBER) is
3615 
3616     cursor c_available (p_inventory_item_id number, p_quantity number) is
3617     select organization_id,
3618            subinventory_code,
3619            shipping_date,
3620            sum(supplied_quantity)
3621     from   csp_available_parts_temp capt
3622     where  capt.required_item_id = p_inventory_item_id
3623     and    capt.supplied_quantity >= p_quantity
3624     and    capt.arrival_date <= p_interval.latest_time
3625     group by organization_id, subinventory_code, shipping_date, shipping_cost
3626     order by shipping_cost asc;
3627 
3628     cursor c_ship_to(p_resource_type varchar2,p_resource_id number) is
3629     select inv_loc_id,
3630            site_loc_id
3631     from   csp_rs_ship_to_addresses_all_v
3632     where  resource_type = p_resource_type
3633     and    resource_id = p_resource_id
3634     and    primary_flag = 'Y';
3635 
3636     l_total_supplied number := 0;
3637     l_old_item number;
3638     l_hz_location_id number;
3639     l_hr_location_id number;
3640 
3641     p_required_parts csp_part_search_pvt.required_parts_tbl;
3642     p_search_params apps.csp_part_search_pvt.search_params_rec;
3643     l_search_method     varchar2(30) := fnd_profile.value('CSP_PART_SEARCH_METHOD_SCHEDULER');
3644     l_incl_alternates   varchar2(30) := fnd_profile.value('CSP_INCL_ALTERNATES');
3645     l_alternates        boolean := FALSE;
3646 
3647     l_organization_id   number;
3648     l_supplied_quantity number;
3649     l_subinventory_code varchar2(30);
3650     l_shipping_date     date;
3651 
3652    begin
3653      if nvl(l_incl_alternates,'NEVER') in ('ALWAYS','SCHONLY') then
3654        l_alternates := TRUE;
3655      else
3656        l_alternates := FALSE;
3657      end if;
3658    x_final_unavailable_list := CSP_SCH_INT_PVT.CSP_UNAVAILABILITY_TBL_TYPE();
3659      for i in 1..p_unavailable_list.count loop
3660        open  c_ship_to(p_unavailable_list(i).resource_type,p_unavailable_list(i).resource_id);
3661        fetch c_ship_to into l_hr_location_id,l_hz_location_id;
3662        close c_ship_to;
3663        p_search_params.search_method := l_search_method;
3664        p_search_params.my_inventory := false;
3665        p_search_params.unmanned_warehouses := false;
3666        p_search_params.technicians := false;
3667        p_search_params.manned_warehouses := true;
3668        p_search_params.resource_type := p_unavailable_list(i).resource_type;
3669        p_search_params.resource_id := p_unavailable_list(i).resource_id;
3670        p_search_params.need_by_date := p_interval.latest_time;
3671        p_search_params.to_hz_location_id := l_hz_location_id;
3672        p_search_params.to_location_id := l_hr_location_id;
3673        p_search_params.include_closed := true;
3674        p_search_params.include_alternates := l_alternates;
3675        p_search_params.called_from := 'SCHEDULER';
3676 
3677        p_required_parts.delete();
3678        p_required_parts(1).inventory_item_id := p_unavailable_list(i).item_id;
3679        p_required_parts(1).quantity := p_unavailable_list(i).quantity;
3680 
3681                 if(FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) then
3682                   FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT,
3683                                                   'csp.plsql.CSP_SCH_INT_PVT.SPARES_CHECK',
3684                                                   'Before calling csp_part_search_pvt.search...');
3685                 end if;
3686 
3687        csp_part_search_pvt.search(
3688          p_required_parts => p_required_parts,
3689          p_search_params  => p_search_params,
3690          x_return_status  => x_return_status,
3691          x_msg_data       => x_msg_data,
3692          x_msg_count      => x_msg_count
3693        );
3694 
3695        open  c_available(p_unavailable_list(i).item_id,
3696                          p_unavailable_list(i).quantity);
3697        fetch c_available into l_organization_id,
3698                               l_subinventory_code,
3699                               l_shipping_date,
3700                               l_supplied_quantity;
3701        close c_available;
3702 
3703                 if(FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) then
3704                   FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT,
3705                                                   'csp.plsql.CSP_SCH_INT_PVT.SPARES_CHECK',
3706                                                   'After calling csp_part_search_pvt.search...');
3707                   FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT,
3708                                                   'csp.plsql.CSP_SCH_INT_PVT.SPARES_CHECK',
3709                                                   'l_organization_id=' || l_organization_id);
3710                   FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT,
3711                                                   'csp.plsql.CSP_SCH_INT_PVT.SPARES_CHECK',
3712                                                   'l_subinventory_code=' || l_subinventory_code);
3713                   FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT,
3714                                                   'csp.plsql.CSP_SCH_INT_PVT.SPARES_CHECK',
3715                                                   'l_shipping_date=' || to_char(l_shipping_date, 'DD-MON-RRRR HH24:MI:SS'));
3716                   FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT,
3717                                                   'csp.plsql.CSP_SCH_INT_PVT.SPARES_CHECK',
3718                                                   'l_supplied_quantity=' || l_supplied_quantity);
3719                 end if;
3720 
3721        if l_organization_id is not null then
3722          px_available_list.extend;
3723          px_available_list(px_available_list.count).resource_id        := p_unavailable_list(i).resource_id ;
3724          px_available_list(px_available_list.count).resource_type      := p_unavailable_list(i).resource_type;
3725          px_available_list(px_available_list.count).organization_id    := p_unavailable_list(i).organization_id;
3726          px_available_list(px_available_list.count).item_id            := p_unavailable_list(i).item_id;
3727          px_available_list(px_available_list.count).item_uom           := p_unavailable_list(i).item_uom;
3728          px_available_list(px_available_list.count).quantity           := p_unavailable_list(i).quantity;
3729          px_available_list(px_available_list.count).source_org         := l_organization_id;
3730          px_available_list(px_available_list.count).sub_inventory      := l_subinventory_code;
3731          px_available_list(px_available_list.count).available_date     := l_shipping_date;
3732          px_available_list(px_available_list.count).available_quantity := l_supplied_quantity;
3733          px_available_list(px_available_list.count).revision           := null;
3734          px_available_list(px_available_list.count).item_type          := p_unavailable_list(i).item_type;
3735          px_available_list(px_available_list.count).line_id            := p_unavailable_list(i).line_id;
3736        else
3737          x_final_unavailable_list.extend;
3738          x_final_unavailable_list(x_final_unavailable_list.count).resource_id     := p_unavailable_list(i).resource_id;
3739          x_final_unavailable_list(x_final_unavailable_list.count).resource_type   := p_unavailable_list(i).resource_type ;
3740          x_final_unavailable_list(x_final_unavailable_list.count).organization_id := p_unavailable_list(i).organization_id;
3741          x_final_unavailable_list(x_final_unavailable_list.count).item_id         := p_unavailable_list(i).item_id;
3742          x_final_unavailable_list(x_final_unavailable_list.count).quantity        := p_unavailable_list(i).quantity;
3743          x_final_unavailable_list(x_final_unavailable_list.count).item_UOM        := p_unavailable_list(i).item_uom;
3744          x_final_unavailable_list(x_final_unavailable_list.count).revision        := p_unavailable_list(i).revision;
3745          x_final_unavailable_list(x_final_unavailable_list.count).item_type       := p_unavailable_list(i).item_type;
3746          x_final_unavailable_list(x_final_unavailable_list.count).line_id         := p_unavailable_list(i).line_id;
3747        end if;
3748        delete from csp_available_parts_temp;
3749        delete from csp_required_parts_temp;
3750      end loop;
3751    end;
3752 
3753    PROCEDURE SPARES_CHECK2(
3754                p_resources     IN  CSP_SCH_INT_PVT.csp_sch_resource_tbl_typ,
3755                p_task_id       in     number,
3756                p_need_by_date  in     date,
3757                p_trunk              IN  BOOLEAN,
3758                p_warehouse          IN  BOOLEAN,
3759                p_mandatory          IN  BOOLEAN,
3760                x_options    OUT NOCOPY  CSP_SCH_INT_PVT.csp_sch_options_tbl_typ,
3761                x_return_status          OUT NOCOPY    VARCHAR2,
3762                x_msg_data               OUT NOCOPY    VARCHAR2,
3763                x_msg_count              OUT NOCOPY    NUMBER) is
3764 
3765     cursor c_requirement_header is
3766     select crh.requirement_header_id,
3767            decode(crh.address_type,'R',null,'S',null,crh.ship_to_location_id),
3768            decode(crh.address_type,'R',null,'S',null,hps.location_id)
3769     from   csp_requirement_headers crh,
3770            hz_cust_site_uses_all hcsua,
3771            po_location_associations_all plaa,
3772            hz_cust_acct_sites_all hcasa,
3773            hz_party_sites hps
3774     where  crh.task_id = p_task_id
3775     and    plaa.location_id = crh.ship_to_location_id
3776     and    hcsua.site_use_id = plaa.site_use_id
3777     and    hcsua.site_use_code = 'SHIP_TO'
3778     and    hcsua.status = 'A'
3779     and    hcasa.cust_acct_site_id = hcsua.cust_acct_site_id
3780     and    hps.party_site_id = hcasa.party_site_id;
3781 
3782     cursor c_requirement_header_id is
3783     select crh.requirement_header_id
3784     from   csp_requirement_headers crh
3785     where  crh.task_id = p_task_id;
3786 
3787     cursor c_parts is
3788     select inventory_item_id,
3789            quantity
3790     from   csp_required_parts_temp
3791     where  item_type = 'BASE';
3792 
3793     cursor c_available(p_inventory_item_id number) is
3794     select distinct supplied_quantity,
3795            arrival_date,
3796            shipping_cost,
3797            organization_id,
3798            subinventory_code,
3799            shipping_method,
3800            source_type_code,
3801            supplied_item_id,
3802            distance
3803     from   csp_available_parts_temp
3804     where  required_item_id = p_inventory_item_id
3805     and    nvl(open_or_closed,'-1') <> 'USED'
3806     order by shipping_cost,distance,organization_id,subinventory_code;
3807 
3808     cursor c_sr_org_id is
3809     select cia.org_id
3810     from   cs_incidents_all cia,
3811            jtf_tasks_b jtb
3812     where  jtb.task_id = p_task_id
3813     and    jtb.source_object_type_code = 'SR'
3814     and    cia.incident_id = jtb.source_object_id;
3815 
3816     cursor c_primary_ship_to(p_resource_type varchar2,
3817                              p_resource_id number) is
3818     select crstaav.ship_to_location_id,
3819            crstaav.site_loc_id,
3820            hcasa.org_id
3821     from   csp_rs_ship_to_addresses_all_v crstaav,
3822            hz_cust_acct_sites_all hcasa
3823     where  crstaav.resource_type = p_resource_type
3824     and    crstaav.resource_id = p_resource_id
3825     and    crstaav.primary_flag = 'Y'
3826     and    hcasa.cust_acct_site_id = crstaav.cust_acct_site_id;
3827 
3828     l_requirement_header_id number;
3829     l_ship_to_location_id   number := null;
3830     l_hz_to_location_id     number := null;
3831     l_primary_ship_to       number := null;
3832     l_org_id                number := null;
3833     l_sr_org_id             number := null;
3834     p_required_parts csp_part_search_pvt.required_parts_tbl;
3835     p_search_params apps.csp_part_search_pvt.search_params_rec;
3836     l_search_method     varchar2(30) := fnd_profile.value('CSP_PART_SEARCH_METHOD_SCHEDULER');
3837     l_incl_alternates   varchar2(30) := fnd_profile.value('CSP_INCL_ALTERNATES');
3838     l_alternates        boolean := FALSE;
3839     l_choose_option     boolean := FALSE;
3840 
3841     l_organization_id        number;
3842     l_supplied_quantity      number;
3843     l_subinventory_code      varchar2(30);
3844     l_shipping_date          date;
3845     l_start_time             date := sysdate;
3846     l_missing_parts          number :=0;
3847     l_total_missing_parts    number := 0;
3848     l_transfer_cost          number := 0;
3849     l_total_parts            number := 0;
3850     l_prev_organization_id   number := 0;
3851     l_prev_subinventory_code varchar2(10) := null;
3852     l_available              varchar2(1) := 'N';
3853     l_src_warehouse varchar2(4000) := null;
3854     l_ship_method varchar2(4000) := null;
3855     l_distance_str varchar2(4000) := null;
3856     l_src_org_code varchar2(3) := null;
3857     l_distance_uom varchar2(20):= fnd_profile.value('CSFW_DEFAULT_DISTANCE_UNIT');
3858     l_dist_temp_str varchar2(10);
3859     l_ship_method_meaning varchar2(1000);
3860 
3861    begin
3862      x_options := CSP_SCH_INT_PVT.csp_sch_options_tbl_typ();
3863 
3864      open  c_requirement_header;
3865      fetch c_requirement_header into l_requirement_header_id,
3866                                      l_ship_to_location_id,
3867                                      l_hz_to_location_id;
3868      close c_requirement_header;
3869      if l_requirement_header_id is null then
3870        open  c_requirement_header_id;
3871        fetch c_requirement_header_id into l_requirement_header_id;
3872        close c_requirement_header_id;
3873      end if;
3874 
3875      log('spares_check2','l_requirement_header_id:'||l_requirement_header_id);
3876      log('spares_check2','l_ship_to_location_id:'||l_ship_to_location_id);
3877      if nvl(l_incl_alternates,'NEVER') in ('ALWAYS','SCHONLY') then
3878        l_alternates := TRUE;
3879      else
3880        l_alternates := FALSE;
3881      end if;
3882      if l_ship_to_location_id is not null and p_warehouse then
3883        delete from csp_available_parts_temp;
3884        delete from csp_required_parts_temp;
3885        if p_warehouse then
3886          p_search_params.search_method := l_search_method;
3887          p_search_params.my_inventory := false;
3888          p_search_params.unmanned_warehouses := false;
3889          p_search_params.resource_type := p_resources(1).resource_type;
3890          p_search_params.resource_id := p_resources(1).resource_id;
3891          p_search_params.technicians := false;
3892          p_search_params.manned_warehouses := p_warehouse;
3893          p_search_params.need_by_date := p_need_by_date;
3894          p_search_params.to_location_id := l_ship_to_location_id;
3895          p_search_params.to_hz_location_id := l_hz_to_location_id;
3896          p_search_params.include_closed := true;
3897          p_search_params.include_alternates := l_alternates;
3898          p_search_params.requirement_header_id := l_requirement_header_id;
3899          p_search_params.called_from := 'SCHEDULER';
3900 
3901          csp_part_search_pvt.search(
3902              p_required_parts => p_required_parts,
3903              p_search_params  => p_search_params,
3904              x_return_status  => x_return_status,
3905              x_msg_data       => x_msg_data,
3906              x_msg_count      => x_msg_count);
3907        end if;
3908      end if;
3909      log('spares_check2','p_resources.count:'||p_resources.count);
3910      if p_resources.count = 1 then
3911          l_choose_option := TRUE;
3912        log('spares_check2','l_choose_option = TRUE');
3913      end if;
3914 
3915      for i in 1..p_resources.count LOOP
3916        log('spares_check2','Looping resources. ResourceID:'||p_resources(i).resource_id);
3917        log('spares_check2','l_ship_to_location_id:'||l_ship_to_location_id);
3918            l_src_warehouse := null;
3919            l_ship_method := null;
3920            l_distance_str := null;
3921            l_src_org_code := null;
3922            l_dist_temp_str := null;
3923            l_ship_method_meaning := null;
3924 
3925        if p_warehouse then
3926          log('spares_check2','p_warehouse=TRUE');
3927          l_primary_ship_to := l_ship_to_location_id;
3928          if l_ship_to_location_id is null then
3929            log('spares_check2','l_ship_to_location_id is null');
3930            open  c_sr_org_id;
3931            fetch c_sr_org_id into l_sr_org_id;
3932            close c_sr_org_id;
3933            for cr in c_primary_ship_to(p_resources(i).resource_type,
3934                                        p_resources(i).resource_id) loop
3935              l_primary_ship_to := cr.ship_to_location_id;
3936              l_hz_to_location_id := cr.site_loc_id;
3937              l_org_id := cr.org_id;
3938              log('spares_check2','l_org_id:'||l_org_id);
3939              log('spares_check2','l_sr_org_id:'||l_sr_org_id);
3940              log('spares_check2','l_primary_ship_to:'||l_primary_ship_to);
3941              log('spares_check2','l_hz_to_location_id:'||l_hz_to_location_id);
3942              if l_org_id = l_sr_org_id then
3943                exit;
3944              end if;
3945            end loop;
3946          delete from csp_available_parts_temp;
3947          delete from csp_required_parts_temp;
3948          p_search_params.search_method := l_search_method;
3949          p_search_params.my_inventory := false;
3950          p_search_params.unmanned_warehouses := false;
3951          p_search_params.resource_type := p_resources(i).resource_type;
3952          p_search_params.resource_id := p_resources(i).resource_id;
3953          p_search_params.technicians := false;
3954          p_search_params.manned_warehouses := p_warehouse;
3955          p_search_params.need_by_date := p_need_by_date;
3956          p_search_params.to_location_id := l_primary_ship_to;
3957          p_search_params.to_hz_location_id := l_hz_to_location_id;
3958          p_search_params.include_closed := true;
3959          p_search_params.include_alternates := l_alternates;
3960          p_search_params.requirement_header_id := l_requirement_header_id;
3961          p_search_params.called_from := 'SCHEDULER';
3962 
3963          csp_part_search_pvt.search(
3964              p_required_parts => p_required_parts,
3965              p_search_params  => p_search_params,
3966              x_return_status  => x_return_status,
3967              x_msg_data       => x_msg_data,
3968              x_msg_count      => x_msg_count);
3969          end if;
3970        end if;
3971 
3972        if p_trunk then
3973          begin
3974            delete from csp_available_parts_temp
3975            where source_type_code in ('MYSELF','DEDICATED');
3976            exception when others then null;
3977          end;
3978          --dbms_output.put_line('ResourceTYPE:'||p_resources(i).resource_type);
3979          --dbms_output.put_line('ResourceID:'||p_resources(i).resource_id);
3980          p_search_params.search_method := l_search_method;
3981          p_search_params.my_inventory := p_trunk;
3982          p_search_params.unmanned_warehouses := false;
3983          p_search_params.resource_type := p_resources(i).resource_type;
3984          p_search_params.resource_id := p_resources(i).resource_id;
3985          p_search_params.technicians := false;
3986          p_search_params.manned_warehouses := false;
3987          p_search_params.need_by_date := p_need_by_date;
3988          p_search_params.to_location_id := nvl(l_ship_to_location_id,
3989                                                l_primary_ship_to);
3990          p_search_params.to_hz_location_id := l_hz_to_location_id;
3991          p_search_params.include_closed := true;
3992          p_search_params.include_alternates := l_alternates;
3993          p_search_params.called_from := 'SCHEDULER';
3994          if not p_warehouse then
3995            delete from csp_required_parts_temp;
3996            p_search_params.requirement_header_id := l_requirement_header_id;
3997          end if;
3998          csp_part_search_pvt.search(
3999            p_required_parts => p_required_parts,
4000            p_search_params  => p_search_params,
4001            x_return_status  => x_return_status,
4002            x_msg_data       => x_msg_data,
4003            x_msg_count      => x_msg_count);
4004        end if;
4005 
4006        l_transfer_cost := 0;
4007        l_total_parts := 0;
4008        l_start_time := sysdate;
4009        l_total_missing_parts := 0;
4010        for cp in c_parts loop
4011          log('spares_check2','item_id:'||cp.inventory_item_id);
4012          log('spares_check2','quantity:'||cp.quantity);
4013          l_missing_parts := cp.quantity;
4014          for ca in c_available(cp.inventory_item_id) loop
4015            log('spares_check2','l_missing_parts:'||l_missing_parts);
4016            log('spares_check2','organization_id:'||ca.organization_id);
4017            log('spares_check2','shipping_method:'||ca.shipping_method);
4018            log('spares_check2','source_type_code:'||ca.source_type_code);
4019            log('spares_check2','shipping_cost:'||ca.shipping_cost);
4020            log('spares_check2','distance:'||ca.distance);
4021 
4022            if l_missing_parts > 0 then
4023              if ca.organization_id <> l_prev_organization_id or
4024                 nvl(ca.subinventory_code,'-1') <> nvl(l_prev_subinventory_code,'-1') then
4025                l_transfer_cost := l_transfer_cost + ca.shipping_cost;
4026 
4027                select organization_code into l_src_org_code
4028                     from mtl_parameters where organization_id = ca.organization_id;
4029 
4030                log('spares_check2','l_src_org_code:'||l_src_org_code);
4031                log('spares_check2','subinventory_code:'||ca.subinventory_code);
4032 
4033                if l_src_warehouse is null then
4034                     l_src_warehouse := l_src_org_code;
4035                else
4036                     l_src_warehouse := l_src_warehouse || ',' || l_src_org_code;
4037                end if;
4038                if ca.subinventory_code is not null then
4039                     l_src_warehouse := l_src_warehouse || '.' || ca.subinventory_code;
4040                end if;
4041                log('spares_check2','l_src_warehouse:'||l_src_warehouse);
4042 
4043                                 if ca.shipping_method is not null then
4044                                         SELECT meaning
4045                                         into l_ship_method_meaning
4046                                         FROM fnd_lookup_values_vl
4047                                         WHERE lookup_type = 'SHIP_METHOD'
4048                                         AND lookup_code   = ca.shipping_method;
4049                                 end if;
4050 
4051                if l_ship_method is null then
4052                     l_ship_method := nvl(l_ship_method_meaning, '-');
4053                else
4054                     l_ship_method := l_ship_method || ',' || nvl(l_ship_method_meaning, '-');
4055                end if;
4056                log('spares_check2','l_ship_method:'||l_ship_method);
4057 
4058                if ca.distance is null then
4059                     l_dist_temp_str := '-';
4060                else
4061                     l_dist_temp_str := to_char(ca.distance);
4062                end if;
4063                if l_distance_str is null then
4064                     l_distance_str := l_dist_temp_str;
4065                else
4066                     l_distance_str := l_distance_str || '$' || l_dist_temp_str;
4067                end if;
4068                if l_dist_temp_str <> '-' then
4069                     l_distance_str := l_distance_str || ' ' || l_distance_uom;
4070                end if;
4071                log('spares_check2','l_distance_str:'||l_distance_str);
4072 
4073              end if;
4074              log('spares_check2','l_transfer_cost:'||l_transfer_cost);
4075              l_start_time := greatest(l_start_time,ca.arrival_date);
4076              log('spares_check2','l_start_time:'||to_char(l_start_time,'dd-mon-yyyy hh24:mi'));
4077              if l_choose_option then
4078                log('spares_check2','update supplied quantity of capt');
4079                update csp_available_parts_temp
4080                set    supplied_quantity = least(supplied_quantity,l_missing_parts),
4081                       open_or_closed = 'USED'
4082                where  organization_id = ca.organization_id
4083                and    nvl(subinventory_code,'-1') = nvl(ca.subinventory_code,'-1')
4084                and    supplied_item_id = ca.supplied_item_id
4085                and    required_item_id = cp.inventory_item_id
4086                and    nvl(open_or_closed,'-1') <> 'USED'
4087                and    rownum = 1;
4088                log('spares_check2','Records updated:'||sql%rowcount);
4089              end if;
4090              l_missing_parts := greatest(l_missing_parts - ca.supplied_quantity,0);
4091              log('spares_check2','l_missing_parts:'||l_missing_parts);
4092            elsif l_missing_parts = 0 and l_choose_option then
4093              delete from csp_available_parts_temp
4094              where organization_id = ca.organization_id
4095              and   nvl(subinventory_code,'-1') = nvl(ca.subinventory_code,'-1')
4096              and   supplied_item_id = ca.supplied_item_id
4097              and   required_item_id = cp.inventory_item_id
4098              and   rownum = 1;
4099              log('spares_check2','Records deleted:'||sql%rowcount);
4100            elsif l_missing_parts = 0 then
4101              exit;
4102            end if;
4103            l_prev_organization_id := ca.organization_id;
4104            l_prev_subinventory_code := ca.subinventory_code;
4105          end loop;
4106          l_prev_organization_id := 0;
4107          l_prev_subinventory_code := null;
4108          l_total_missing_parts := l_total_missing_parts + l_missing_parts;
4109          l_total_parts := l_total_parts + cp.quantity - l_missing_parts;
4110        end loop;
4111        if l_total_missing_parts > 0 then
4112          l_transfer_cost := -1;
4113          l_start_time := null;
4114        end if;
4115        if l_total_missing_parts = 0 then
4116          l_available := 'Y';
4117        end if;
4118          log('spares_check2','l_total_parts:'||l_total_parts);
4119        if l_total_missing_parts = 0 or (l_total_missing_parts > 0 and not p_mandatory) then
4120          x_options.extend;
4121          x_options(x_options.count).resource_id   := p_resources(i).resource_id;
4122          x_options(x_options.count).resource_type := p_resources(i).resource_type;
4123          x_options(x_options.count).start_time    := l_start_time;
4124          x_options(x_options.count).transfer_cost := l_transfer_cost;--null;
4125          x_options(x_options.count).missing_parts := l_total_missing_parts;
4126          x_options(x_options.count).available_parts := l_total_parts;
4127          x_options(x_options.count).src_warehouse := l_src_warehouse;
4128          x_options(x_options.count).ship_method := l_ship_method;
4129          x_options(x_options.count).distance_str := l_distance_str;
4130        end if;
4131        log('spares_check2','resource_id:'||p_resources(i).resource_id);
4132        log('spares_check2','l_transfer_cost:'||l_transfer_cost);
4133        /*elsif l_total_missing_parts = 0 or p_mandatory then
4134 
4135          x_options.extend;
4136          x_options(x_options.count).resource_id   := p_resources(i).resource_id;
4137          x_options(x_options.count).resource_type := p_resources(i).resource_type;
4138          x_options(x_options.count).start_time    := l_start_time;
4139          x_options(x_options.count).transfer_cost := l_transfer_cost;
4140          x_options(x_options.count).missing_parts := l_total_missing_parts;
4141          x_options(x_options.count).available_parts := l_total_parts;
4142          log('spares_check2','resource_id:'||p_resources(i).resource_id);
4143          log('spares_check2','l_transfer_cost:'||l_transfer_cost);
4144        end if;*/
4145      end loop;
4146      if p_mandatory and l_available <> 'Y' then
4147        x_return_status := fnd_api.g_ret_sts_error;
4148        FND_MESSAGE.SET_NAME('CSP', 'CSP_SCH_NO_PARTS');
4149        FND_MSG_PUB.ADD;
4150        fnd_msg_pub.count_and_get
4151          ( p_count => x_msg_count
4152          , p_data  => x_msg_data);
4153      end if;
4154    end;
4155 
4156 PROCEDURE DO_ATP_CHECK(p_unavailable_list         IN     CSP_SCH_INT_PVT.CSP_UNAVAILABILITY_TBL_TYPE
4157                           ,p_interval               IN     CSP_SCH_INT_PVT.csp_sch_interval_rec_typ
4158                           ,px_available_list        IN OUT NOCOPY CSP_SCH_INT_PVT.CSP_AVAILABILITY_TBL_TYPE
4159                           ,x_final_unavailable_list OUT NOCOPY    CSP_SCH_INT_PVT.CSP_UNAVAILABILITY_TBL_TYPE
4160                           ,x_return_status          OUT NOCOPY    VARCHAR2
4161                           ,x_msg_data               OUT NOCOPY    VARCHAR2
4162                           ,x_msg_count              OUT NOCOPY    NUMBER) IS
4163         CURSOR instance IS
4164         SELECT instance_id
4165         FROM   mrp_ap_apps_instances;
4166 
4167         CURSOR  error_message(c_errro_code number) IS
4168         select  meaning
4169         from    mfg_lookups
4170         where   lookup_type = 'MTL_DEMAND_INTERFACE_ERRORS'
4171         and    lookup_code = c_errro_code;
4172 
4173         CURSOR  get_item_segments(c_item_id number,c_organization_id number) IS
4174         select  distinct(CONCATENATED_SEGMENTS)
4175         from    mtl_system_items_b_kfv
4176         where   inventory_item_id = c_item_id
4177         and     organization_id = cs_std.get_item_valdn_orgzn_id;
4178 
4179         CURSOR check_buy_from(c_item_id number,c_assignment_id number, c_organization_id number)
4180         IS
4181        /* SELECT vendor_id, vendor_site_id
4182         FROM  mrp_sources_v
4183         where assignment_set_id = c_assignment_id
4184         and   inventory_item_id = c_item_id
4185         and   organization_id  = c_organization_id
4186         and   source_type = 3;*/
4187        Select 'Y'
4188        from MRP_ITEM_SOURCING_LEVELS_V  misl
4189        where misl.organization_id = c_organization_id
4190        and misl.assignment_set_id =c_assignment_id
4191        and inventory_item_id = c_item_id
4192        and SOURCE_TYPE       = 3
4193        and sourcing_level = (select min(sourcing_level) from MRP_ITEM_SOURCING_LEVELS_V
4194                              where organization_id = c_organization_id
4195                              and assignment_set_id = c_assignment_id
4196                              and inventory_item_id = c_item_id
4197                              and sourcing_level not in (2,9));
4198 
4199         l_atp_rec            mrp_atp_pub.atp_rec_typ;
4200         l_atp_rec_out        mrp_atp_pub.atp_rec_typ;
4201         l_atp_supply_demand  mrp_atp_pub.atp_supply_demand_typ;
4202         l_atp_period         mrp_atp_pub.atp_period_typ;
4203         l_atp_details        mrp_atp_pub.atp_details_typ;
4204         l_mrp_database_link  VARCHAR2(128);
4205         l_statement          VARCHAR2(500);
4206         l_session_id         NUMBER;
4207         l_return_status      VARCHAR2(128);
4208      --   x_msg_data           VARCHAR2(2000);
4209      --   x_msg_count          NUMBER;
4210         l_msg                varchar2(2000);
4211         l_ship_complete_profile VARCHAR2(3);
4212         l_instance_id        NUMBER;
4213         l_api_name           VARCHAR2(60) := 'CSP_SCH_INT_PVT.DO_ATP_CHECK' ;
4214         l_message            varchar2(2000);
4215         l_item_segments      varchar2(1000);
4216         l_error              BOOLEAN := FALSE;
4217         dbug_variable1    NUMBER;
4218         l_calling_module NUMBER := NULL;
4219         l_buy_from varchar2(1);
4220         l_assignment_set_id NUMBER;
4221         l_unavailable varchar2(1);
4222     BEGIN
4223         log('do_atp_check', 'Begin');
4224         x_return_status := FND_API.G_RET_STS_SUCCESS;
4225         x_final_unavailable_list := CSP_SCH_INT_PVT.CSP_UNAVAILABILITY_TBL_TYPE();
4226                 OPEN instance;
4227                 FETCH instance INTO l_instance_id;
4228                 CLOSE instance;
4229                 log('do_atp_check', 'l_instance_id: '||l_instance_id);
4230             l_mrp_database_link := fnd_profile.value(name => 'MRP_ATP_DATABASE_LINK');
4231             log('do_atp_check', 'l_mrp_database_link: '||l_mrp_database_link);
4232             If l_mrp_database_link IS NULL Then
4233                 Select MRP_ATP_SCHEDULE_TEMP_S.NextVal
4234                 Into   l_session_id
4235                 From   Dual;
4236                 l_calling_module := 724;
4237              Else
4238                  get_session_id(p_database_link => l_mrp_database_link,
4239                                 x_sesssion_id => l_session_id);
4240                 l_calling_module := NULL;
4241              End If;
4242          log('do_atp_check', 'l_calling_module: '||l_calling_module);
4243          log('do_atp_check', 'begin p_unavailable_list loop. count: '||p_unavailable_list.count);
4244          FOR I in 1..p_unavailable_list.count LOOP
4245                     log('do_atp_check', 'calling msc_satp_func.extend_atp');
4246                      msc_satp_func.extend_atp(l_atp_rec,x_return_status,1);
4247                     log('do_atp_check', 'after msc_satp_func.extend_atp');
4248                     log('do_atp_check', 'x_return_status: '||x_return_status);
4249                     l_atp_rec.Insert_Flag(I) := 1;
4250                     l_atp_rec.inventory_item_id(I) := p_unavailable_list(I).item_id;
4251                     l_atp_rec.quantity_ordered(I) := p_unavailable_list(I).quantity;
4252                     l_atp_rec.quantity_uom(I) :=  p_unavailable_list(I).Item_UOM;
4253                     l_atp_rec.calling_module(I) := l_calling_module;  ---- 724
4254                     l_atp_rec.action(I) := 100 ;
4255                     l_atp_rec.Instance_Id(I)  := l_instance_id ;  ----- (for srp it is 1);
4256                     IF p_interval.latest_time IS NOT NULL THEN
4257                        l_atp_rec.latest_acceptable_date(I)  := p_interval.latest_time ;
4258                     END IF;
4259 
4260                     --l_atp_rec.latest_acceptable_date(I) := p_interval.latest_time;
4261                     l_atp_rec.Requested_Ship_Date(I) := sysdate ; --'03-MAY-2002' ;
4262                     l_atp_rec.Organization_id(I) := p_unavailable_list(I).organization_id;
4263                     l_atp_rec.Identifier(I):= p_unavailable_list(I).resource_id + I ;
4264                     l_atp_rec.Scenario_Id(I) := 1;
4265                     l_ship_complete_profile := fnd_profile.value(name => 'CSP_SHIP_COMPLETE');
4266                     IF l_ship_complete_profile ='Y' THEN
4267                         IF g_schedular_call = 'Y' THEN
4268                             l_atp_rec.ship_set_name(I) := to_char(p_unavailable_list(I).resource_id);
4269                         ELSE
4270                             l_atp_rec.ship_set_name(I) :=  p_unavailable_list(I).ship_set_name;
4271                         END IF;
4272                     ELSE
4273                             l_atp_rec.ship_set_name(I) :=  p_unavailable_list(I).ship_set_name;
4274                     END IF;
4275             END LOOP;
4276          savepoint csp_msc_atp_check;
4277             log('do_atp_check', 'calling MRP_ATP_PUB.CALL_ATP');
4278             MRP_ATP_PUB.CALL_ATP(l_session_id,
4279                                            l_atp_rec,
4280                                            l_atp_rec_out,
4281                                            l_atp_supply_demand,
4282                                            l_atp_period,
4283                                            l_atp_details,
4284                                            x_return_status,
4285                                            x_msg_data,
4286                                            x_msg_count);
4287             log('do_atp_check', 'after MRP_ATP_PUB.CALL_ATP');
4288             log('do_atp_check', 'x_return_status: '||x_return_status);
4289             log('do_atp_check', 'x_msg_data: '||x_msg_data);
4290             log('do_atp_check', 'x_msg_count: '||x_msg_count);
4291             l_msg := FND_MSG_PUB.Get(1,FND_API.G_FALSE) ;
4292 
4293             rollback to csp_msc_atp_check;
4294         IF x_return_status = FND_API.G_RET_STS_SUCCESS  THEN
4295                 l_unavailable := 'Y';
4296                 log('do_atp_check', 'begin l_atp_rec_out.Inventory_Item_Id loop. count: '||l_atp_rec_out.Inventory_Item_Id.count);
4297                 FOR I IN 1..l_atp_rec_out.Inventory_Item_Id.count LOOP
4298                     log('do_atp_check', 'l_atp_rec_out.Error_Code('||I||'): '||l_atp_rec_out.Error_Code(I));
4299                     IF  (l_atp_rec_out.Error_Code(I) <> 0 and l_atp_rec_out.Error_Code(I) <> 150  ) THEN
4300                         l_assignment_set_id := FND_PROFILE.value(name => 'MRP_ATP_ASSIGN_SET');
4301                         log('do_atp_check', 'l_assignment_set_id: '||l_assignment_set_id);
4302                         OPEN check_buy_from(l_atp_rec.Inventory_Item_Id(I),l_assignment_set_id, l_atp_rec.Organization_id(I));
4303                         FETCH check_buy_from INTO l_buy_from;
4304                         CLOSE check_buy_from;
4305                        log('do_atp_check', 'g_schedular_call: '||g_schedular_call);
4306                        log('do_atp_check', 'l_buy_from: '||l_buy_from);
4307                        log('do_atp_check', 'l_atp_rec_out.Error_Code('||I||'): '||l_atp_rec_out.Error_Code(I));
4308                        IF   g_schedular_call = 'N' AND l_buy_from = 'Y' THEN
4309                             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
4310                              IF not l_error then
4311                                 OPEN error_message(23);
4312                                 FETCH error_message INTO l_message;
4313                                 CLOSE error_message;
4314 
4315                                 FND_MESSAGE.SET_NAME('CSP', 'CSP_ATP');
4316                                 FND_MESSAGE.SET_TOKEN('ERROR', l_message, FALSE);
4317                                 FND_MSG_PUB.ADD;
4318                                 fnd_msg_pub.count_and_get
4319                                     ( p_count => x_msg_count
4320                                     , p_data  => x_msg_data);
4321 
4322                              END IF;
4323                             x_return_status := FND_API.G_RET_STS_ERROR;
4324                             OPEN error_message(l_atp_rec_out.Error_Code(I));
4325                             FETCH error_message INTO l_message;
4326                             CLOSE error_message;
4327                              l_item_segments := null;
4328                             OPEN get_item_segments(l_atp_rec.Inventory_Item_Id(I),l_atp_rec.Organization_id(I));
4329                             FETCH get_item_segments INTO l_item_segments;
4330                             CLOSE get_item_segments;
4331                             l_error := true;
4332                             l_message := l_item_segments || ' : '||  l_message;
4333                             FND_MESSAGE.SET_NAME('CSP', 'CSP_ATP');
4334                             FND_MESSAGE.SET_TOKEN('ERROR', l_message, FALSE);
4335                             FND_MSG_PUB.ADD;
4336                             fnd_msg_pub.count_and_get
4337                                 ( p_count => x_msg_count
4338                                 , p_data  => x_msg_data);
4339                         END IF;
4340                       ELSE
4341                         If l_atp_rec_out.ship_date(I) IS NULL or l_atp_rec_out.Error_Code(I) <>53 THEN
4342                             IF not l_error then
4343                              OPEN error_message(23);
4344                              FETCH error_message INTO l_message;
4345                              CLOSE error_message;
4346 
4347                              FND_MESSAGE.SET_NAME('CSP', 'CSP_ATP');
4348                              FND_MESSAGE.SET_TOKEN('ERROR', l_message, FALSE);
4349                              FND_MSG_PUB.ADD;
4350                              fnd_msg_pub.count_and_get
4351                                 ( p_count => x_msg_count
4352                                 , p_data  => x_msg_data);
4353 
4354                             END IF;
4355                             x_return_status := FND_API.G_RET_STS_ERROR;
4356                             OPEN error_message(l_atp_rec_out.Error_Code(I));
4357                             FETCH error_message INTO l_message;
4358                             CLOSE error_message;
4359                              l_item_segments := null;
4360                             OPEN get_item_segments(l_atp_rec.Inventory_Item_Id(I),l_atp_rec.Organization_id(I));
4361                             FETCH get_item_segments INTO l_item_segments;
4362                             CLOSE get_item_segments;
4363                             l_error := true;
4364                             l_message := l_item_segments || ' : '||  l_message;
4365                             FND_MESSAGE.SET_NAME('CSP', 'CSP_ATP');
4366                             FND_MESSAGE.SET_TOKEN('ERROR', l_message, FALSE);
4367                             FND_MSG_PUB.ADD;
4368                             fnd_msg_pub.count_and_get
4369                                 ( p_count => x_msg_count
4370                                 , p_data  => x_msg_data);
4371                           ELSE
4372                             l_unavailable := 'N';
4373                           END IF;
4374                       END IF;
4375                        log('do_atp_check', 'l_unavailable: '||l_unavailable);
4376                        IF l_unavailable = 'Y' THEN
4377                         x_final_unavailable_list.extend;
4378                         x_final_unavailable_list(x_final_unavailable_list.count).resource_id
4379                                                                         := p_unavailable_list(I).resource_id;
4380                         x_final_unavailable_list(x_final_unavailable_list.count).resource_type
4381                                                                         := p_unavailable_list(I).resource_type ;
4382                         x_final_unavailable_list(x_final_unavailable_list.count).organization_id := l_atp_rec.Organization_id(I);
4383                         x_final_unavailable_list(x_final_unavailable_list.count).item_id    := l_atp_rec.Inventory_Item_Id(I);
4384                         x_final_unavailable_list(x_final_unavailable_list.count).quantity   := l_atp_rec.quantity_ordered(I);
4385                         x_final_unavailable_list(x_final_unavailable_list.count).item_UOM   := l_atp_rec.quantity_uom(I) ;
4386                         x_final_unavailable_list(x_final_unavailable_list.count).revision   := p_unavailable_list(I).revision ;
4387                         FOR J IN 1..p_unavailable_list.count LOOP
4388                             IF x_final_unavailable_list(x_final_unavailable_list.count).item_id =
4389                                 p_unavailable_list(J).item_id THEN
4390                                 x_final_unavailable_list(x_final_unavailable_list.count).item_type := p_unavailable_list(J).item_type;
4391                                 x_final_unavailable_list(x_final_unavailable_list.count).line_id  := p_unavailable_list(J).line_id;
4392                                     EXIT;
4393                             END IF;
4394                         END LOOP;
4395                        ELSE
4396                         log('do_atp_check', 'inner else part');
4397                              px_available_list.extend;
4398                         px_available_list(px_available_list.count).resource_id        :=  p_unavailable_list(I).resource_id ;
4399                         px_available_list(px_available_list.count).resource_type      :=  p_unavailable_list(I).resource_type;
4400                         px_available_list(px_available_list.count).organization_id    :=  l_atp_rec_out.Organization_id(I);
4401                         px_available_list(px_available_list.count).item_id            :=  l_atp_rec_out.Inventory_Item_Id(I);
4402                         px_available_list(px_available_list.count).item_uom            := l_atp_rec_out.quantity_uom(I) ;
4403                         px_available_list(px_available_list.count).quantity           :=  l_atp_rec_out.quantity_ordered(I);
4404                         px_available_list(px_available_list.count).source_org         :=  l_atp_rec_out.Source_Organization_Id(I);
4405                         px_available_list(px_available_list.count).sub_inventory      :=  NULL;
4406                         if trunc(l_atp_rec_out.ship_date(I)) = trunc(sysdate) THEN
4407                             px_available_list(px_available_list.count).available_date := trunc(l_atp_rec_out.ship_date(I)) + (sysdate - trunc(sysdate));
4408                         ELSE
4409                             px_available_list(px_available_list.count).available_date := l_atp_rec_out.ship_date(I);
4410                         END IF;
4411                       --  px_available_list(px_available_list.count).available_date     :=  l_atp_rec_out.ship_date(I);
4412                         px_available_list(px_available_list.count).available_quantity :=  l_atp_rec_out.Available_Quantity(I);
4413                         px_available_list(px_available_list.count).revision         := p_unavailable_list(I).revision ;
4414                          FOR J IN 1..p_unavailable_list.count LOOP
4415                             IF px_available_list(px_available_list.count).item_id =
4416                                 p_unavailable_list(J).item_id THEN
4417                                 px_available_list(px_available_list.count).item_type := p_unavailable_list(J).item_type;
4418                                 px_available_list(px_available_list.count).line_id  := p_unavailable_list(J).line_id;
4419                                     EXIT;
4420                             END IF;
4421                         END LOOP;
4422                        END IF;
4423                     ELSE
4424                         log('do_atp_check', 'outer else part');
4425                         px_available_list.extend;
4426                         px_available_list(px_available_list.count).resource_id        :=  p_unavailable_list(I).resource_id ;
4427                         px_available_list(px_available_list.count).resource_type      :=  p_unavailable_list(I).resource_type;
4428                         px_available_list(px_available_list.count).organization_id    :=  l_atp_rec_out.Organization_id(I);
4429                         px_available_list(px_available_list.count).item_id            :=  l_atp_rec_out.Inventory_Item_Id(I);
4430                         px_available_list(px_available_list.count).item_uom            := l_atp_rec_out.quantity_uom(I) ;
4431                         px_available_list(px_available_list.count).quantity           :=  l_atp_rec_out.quantity_ordered(I);
4432                         px_available_list(px_available_list.count).source_org         :=  l_atp_rec_out.Source_Organization_Id(I);
4433                         px_available_list(px_available_list.count).sub_inventory      :=  NULL;
4434                         if trunc(l_atp_rec_out.ship_date(I)) = trunc(sysdate) THEN
4435                             px_available_list(px_available_list.count).available_date := trunc(l_atp_rec_out.ship_date(I)) + (sysdate - trunc(sysdate));
4436                         ELSE
4437                             px_available_list(px_available_list.count).available_date := l_atp_rec_out.ship_date(I);
4438                         END IF;
4439                       --  px_available_list(px_available_list.count).available_date     :=  l_atp_rec_out.ship_date(I);
4440                         px_available_list(px_available_list.count).available_quantity :=  l_atp_rec_out.Available_Quantity(I);
4441                         px_available_list(px_available_list.count).revision         := p_unavailable_list(I).revision ;
4442                          log('do_atp_check', 'begin p_unavailable_list loop. count: '||p_unavailable_list.count);
4443                          FOR J IN 1..p_unavailable_list.count LOOP
4444                             IF px_available_list(px_available_list.count).item_id =
4445                                 p_unavailable_list(J).item_id THEN
4446                                 px_available_list(px_available_list.count).item_type := p_unavailable_list(J).item_type;
4447                                 px_available_list(px_available_list.count).line_id  := p_unavailable_list(J).line_id;
4448                                     EXIT;
4449                             END IF;
4450                         END LOOP;
4451                      END IF;
4452                 END LOOP;
4453             ELSE
4454                 return;
4455             END IF;
4456             log('do_atp_check', 'End');
4457             EXCEPTION
4458             WHEN OTHERS THEN
4459             FND_MESSAGE.SET_NAME('CSP', 'CSP_UNEXPECTED_EXEC_ERRORS');
4460             FND_MESSAGE.SET_TOKEN('ROUTINE', l_api_name, FALSE);
4461             FND_MESSAGE.SET_TOKEN('SQLERRM', sqlerrm, FALSE);
4462             FND_MSG_PUB.ADD;
4463             fnd_msg_pub.count_and_get
4464               ( p_count => x_msg_count
4465               , p_data  => x_msg_data);
4466             x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
4467             return;
4468 
4469      END DO_ATP_CHECK;
4470 
4471 
4472 
4473      PROCEDURE ELIGIBLE_RESOURCES(p_resource_list            IN  CSP_SCH_INT_PVT.CSP_SCH_RESOURCE_tbl_TYP
4474                                  ,p_available_list           IN  CSP_SCH_INT_PVT.CSP_AVAILABILITY_TBL_TYPE
4475                                  ,p_final_unavailable_list   IN  CSP_SCH_INT_PVT.CSP_UNAVAILABILITY_TBL_TYPE
4476                                  ,x_eligible_resources_list  OUT NOCOPY CSP_SCH_INT_PVT.CSP_AVAILABILITY_TBL_TYPE
4477                                  ,x_return_status            OUT NOCOPY VARCHAR2
4478                                  ,x_msg_data                 OUT NOCOPY VARCHAR2
4479                                  ,x_msg_count                OUT NOCOPY NUMBER) IS
4480 
4481         resource_eligible BOOLEAN := TRUE;
4482         l_api_name     VARCHAR2(60) := 'CSP_SCH_INT_PVT.ELIGIBLE_RESOURCES';
4483      BEGIN
4484         x_return_status := FND_API.G_RET_STS_SUCCESS;
4485         x_eligible_resources_list :=  CSP_SCH_INT_PVT.CSP_AVAILABILITY_TBL_TYPE();
4486 
4487           FOR I IN 1..p_resource_list.count LOOP
4488 
4489                 FOR J IN 1..p_final_unavailable_list.count LOOP
4490                     IF p_final_unavailable_list(J).resource_id = p_resource_list(I).resource_id THEN
4491                         resource_eligible := FALSE;
4492                         EXIT;
4493                     ELSE
4494                         resource_eligible := TRUE ;
4495                     END IF;
4496                 END LOOP;
4497                 IF resource_eligible = TRUE THEN
4498                    FOR K IN  1..p_available_list.count LOOP
4499                         IF  p_available_list(K).resource_id = p_resource_list(I).resource_id THEN
4500                             x_eligible_resources_list.extend ;
4501                             x_eligible_resources_list(x_eligible_resources_list.count).resource_id    := p_available_list(K).resource_id ;
4502                             x_eligible_resources_list(x_eligible_resources_list.count).resource_type  := p_available_list(K).resource_type ;
4503                             x_eligible_resources_list(x_eligible_resources_list.count).organization_id:= p_available_list(K).organization_id ;
4504                             x_eligible_resources_list(x_eligible_resources_list.count).item_id        := p_available_list(K).Item_Id ;
4505                             x_eligible_resources_list(x_eligible_resources_list.count).quantity       := p_available_list(K).quantity ;
4506                             x_eligible_resources_list(x_eligible_resources_list.count).source_org     := p_available_list(K).source_org ;
4507                             x_eligible_resources_list(x_eligible_resources_list.count).item_uom       := p_available_list(K).Item_uom ;
4508                             x_eligible_resources_list(x_eligible_resources_list.count).revision       := p_available_list(K).revision ;
4509                             x_eligible_resources_list(x_eligible_resources_list.count).sub_inventory       := p_available_list(K).sub_inventory ;
4510                             x_eligible_resources_list(x_eligible_resources_list.count).available_date := p_available_list(K).available_date;
4511                              x_eligible_resources_list(x_eligible_resources_list.count).line_id :=p_available_list(K).line_id;
4512 
4513                         END IF;
4514                    END LOOP;
4515                 END IF;
4516         END LOOP;
4517         EXCEPTION
4518         WHEN OTHERS THEN
4519             FND_MESSAGE.SET_NAME('CSP', 'CSP_UNEXPECTED_EXEC_ERRORS');
4520             FND_MESSAGE.SET_TOKEN('ROUTINE', l_api_name, FALSE);
4521             FND_MESSAGE.SET_TOKEN('SQLERRM', sqlerrm, FALSE);
4522             FND_MSG_PUB.ADD;
4523             fnd_msg_pub.count_and_get
4524               ( p_count => x_msg_count
4525               , p_data  => x_msg_data);
4526             x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
4527             return;
4528     END ELIGIBLE_RESOURCES;
4529 
4530     PROCEDURE GET_TIME_COST(p_eligible_resources_list  IN  CSP_SCH_INT_PVT.CSP_AVAILABILITY_TBL_TYPE
4531                           ,x_options                  OUT NOCOPY  CSP_SCH_INT_PVT.csp_sch_options_tbl_typ
4532                           ,x_return_status            OUT NOCOPY  VARCHAR2
4533                           ,x_msg_data                 OUT NOCOPY  VARCHAR2
4534                           ,x_msg_count                OUT NOCOPY  NUMBER) IS
4535         l_temp_options        CSP_SCH_INT_PVT.CSP_SHIP_PARAMETERS_TBL_TYPE;
4536         l_temp_resources_list CSP_SCH_INT_PVT.CSP_AVAILABILITY_TBL_TYPE;
4537         l_options             CSP_SCH_INT_PVT.CSP_SHIP_PARAMETERS_TBL_TYPE ;
4538         loop_count            NUMBER;
4539         l_resources           CSP_SCH_INT_PVT.CSP_AVAILABILITY_TBL_TYPE;
4540         l_ship_count          CSP_SCH_INT_PVT.CSP_SHIP_METHOD_COUNT_TBL_TYP;
4541         l_res_ship_parameters CSP_SCH_INT_PVT.CSP_ORGS_SHIP_PARAM_TBL_TYPE ;
4542         l_api_name            VARCHAR2(60) := 'CSP_SCH_INT_PVT.GET_TIME_COST' ;
4543      BEGIN
4544 
4545         if(FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) then
4546           FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT,
4547                   'csp.plsql.CSP_SCH_INT_PVT.GET_TIME_COST',
4548                   'begin...');
4549         end if;
4550             x_return_status := FND_API.G_RET_STS_SUCCESS;
4551             l_temp_options        :=  CSP_SCH_INT_PVT.CSP_SHIP_PARAMETERS_TBL_TYPE();
4552             l_temp_resources_list :=  CSP_SCH_INT_PVT.CSP_AVAILABILITY_TBL_TYPE();
4553             l_options             :=  CSP_SCH_INT_PVT.CSP_SHIP_PARAMETERS_TBL_TYPE();
4554             l_resources           :=  CSP_SCH_INT_PVT.CSP_AVAILABILITY_TBL_TYPE();
4555             x_options             :=  CSP_SCH_INT_PVT.csp_sch_options_tbl_typ();
4556             l_ship_count          :=  CSP_SCH_INT_PVT.CSP_SHIP_METHOD_COUNT_TBL_TYP();
4557             l_res_ship_parameters :=  CSP_SCH_INT_PVT.CSP_ORGS_SHIP_PARAM_TBL_TYPE();
4558             loop_count :=1 ;
4559 
4560         if(FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) then
4561           FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT,
4562                   'csp.plsql.CSP_SCH_INT_PVT.GET_TIME_COST',
4563                   'Starting while loop with p_eligible_resources_list.count=' || p_eligible_resources_list.count);
4564         end if;
4565 
4566             WHILE loop_count <= p_eligible_resources_list.count LOOP
4567                 IF loop_count > 1 THEN
4568                     IF p_eligible_resources_list(loop_count).resource_id =
4569                                 p_eligible_resources_list(loop_count-1).resource_id
4570                             AND p_eligible_resources_list(loop_count).resource_type =
4571                                 p_eligible_resources_list(loop_count-1).resource_type THEN
4572                             l_temp_resources_list.extend;
4573                             l_temp_resources_list(l_temp_resources_list.count).resource_type :=
4574                                                                   p_eligible_resources_list(loop_count).resource_type ;
4575                             l_temp_resources_list(l_temp_resources_list.count).resource_id :=
4576                                                                   p_eligible_resources_list(loop_count).resource_id ;
4577                             l_temp_resources_list(l_temp_resources_list.count).source_org := p_eligible_resources_list(loop_count).source_org;
4578                             l_temp_resources_list(l_temp_resources_list.count).organization_id :=  p_eligible_resources_list(loop_count).organization_id ;
4579                             l_temp_resources_list(l_temp_resources_list.count).quantity := p_eligible_resources_list(loop_count).quantity;
4580                             l_temp_resources_list(l_temp_resources_list.count).sub_inventory := p_eligible_resources_list(loop_count).sub_inventory;
4581                             l_temp_resources_list(l_temp_resources_list.count).available_date := p_eligible_resources_list(loop_count).available_date;
4582                             IF loop_count = p_eligible_resources_list.count THEN
4583                                 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);
4584                                 IF x_return_status <> FND_API.G_RET_STS_SUCCESS THEN
4585                                     RETURN;
4586                                 END IF;
4587                                 CSP_SCH_INT_PVT.BUILD_FINAL_LIST(l_temp_options,x_options,x_return_status,x_msg_data,x_msg_count);
4588                                 IF x_return_status <> FND_API.G_RET_STS_SUCCESS THEN
4589                                     RETURN;
4590                                 END IF;
4591                                 l_temp_options.trim(l_temp_options.count);
4592                                 l_temp_resources_list.trim(l_temp_resources_list.count);
4593                             END IF;
4594                     ELSE
4595                      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);
4596                      IF x_return_status <> FND_API.G_RET_STS_SUCCESS THEN
4597                                     RETURN;
4598                      END IF;
4599                      CSP_SCH_INT_PVT.BUILD_FINAL_LIST(l_temp_options,x_options,x_return_status,x_msg_data,x_msg_count);
4600                      IF x_return_status <> FND_API.G_RET_STS_SUCCESS THEN
4601                                     RETURN;
4602                      END IF;
4603                      l_temp_options.trim(l_temp_options.count);
4604                      l_temp_resources_list.trim(l_temp_resources_list.count);
4605                         l_temp_resources_list.extend;
4606                         l_temp_resources_list(l_temp_resources_list.count).resource_type   := p_eligible_resources_list(loop_count).resource_type ;
4607                          l_temp_resources_list(l_temp_resources_list.count).resource_id     := p_eligible_resources_list(loop_count).resource_id ;
4608                         l_temp_resources_list(l_temp_resources_list.count).source_org      := p_eligible_resources_list(loop_count).source_org;
4609                         l_temp_resources_list(l_temp_resources_list.count).organization_id := p_eligible_resources_list(loop_count).organization_id;
4610                         l_temp_resources_list(l_temp_resources_list.count).quantity        := p_eligible_resources_list(loop_count).quantity;
4611                         l_temp_resources_list(l_temp_resources_list.count).sub_inventory   := p_eligible_resources_list(loop_count).sub_inventory ;
4612                         l_temp_resources_list(l_temp_resources_list.count).available_date := p_eligible_resources_list(loop_count).available_date;
4613                     END IF;
4614                     IF loop_count = p_eligible_resources_list.count THEN
4615                                 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);
4616                                 IF x_return_status <> FND_API.G_RET_STS_SUCCESS THEN
4617                                     RETURN;
4618                                 END IF;
4619                                 CSP_SCH_INT_PVT.BUILD_FINAL_LIST(l_temp_options,x_options,x_return_status,x_msg_data,x_msg_count);
4620                                 IF x_return_status <> FND_API.G_RET_STS_SUCCESS THEN
4621                                     RETURN;
4622                                 END IF;
4623                                 l_temp_options.trim(l_temp_options.count);
4624                                 l_temp_resources_list.trim(l_temp_resources_list.count);
4625                      END IF;
4626                 ELSE
4627 
4628                                         if(FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) then
4629                                           FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT,
4630                                                   'csp.plsql.CSP_SCH_INT_PVT.GET_TIME_COST',
4631                                                   'In else part of loop_count > 1');
4632                                         end if;
4633 
4634                     l_temp_resources_list.extend;
4635                     l_temp_resources_list(l_temp_resources_list.count).resource_type   := p_eligible_resources_list(loop_count).resource_type ;
4636                     l_temp_resources_list(l_temp_resources_list.count).resource_id     := p_eligible_resources_list(loop_count).resource_id ;
4637                     l_temp_resources_list(l_temp_resources_list.count).source_org      := p_eligible_resources_list(loop_count).source_org;
4638                     l_temp_resources_list(l_temp_resources_list.count).organization_id := p_eligible_resources_list(loop_count).organization_id;
4639                     l_temp_resources_list(l_temp_resources_list.count).quantity        := p_eligible_resources_list(loop_count).quantity;
4640                     l_temp_resources_list(l_temp_resources_list.count).sub_inventory   := p_eligible_resources_list(loop_count).sub_inventory ;
4641                     l_temp_resources_list(l_temp_resources_list.count).available_date := p_eligible_resources_list(loop_count).available_date;
4642 
4643                     IF p_eligible_resources_list.count =1 THEN
4644 
4645                                                 if(FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) then
4646                                                   FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT,
4647                                                           'csp.plsql.CSP_SCH_INT_PVT.GET_TIME_COST',
4648                                                           'Before calling CSP_SCH_INT_PVT.OPTIMIZE_OPTIONS...');
4649                                                 end if;
4650 
4651                                                 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);
4652 
4653                                                 if(FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) then
4654                                                   FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT,
4655                                                           'csp.plsql.CSP_SCH_INT_PVT.GET_TIME_COST',
4656                                                           'After calling CSP_SCH_INT_PVT.OPTIMIZE_OPTIONS... x_return_status=' || x_return_status);
4657                                                   FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT,
4658                                                           'csp.plsql.CSP_SCH_INT_PVT.GET_TIME_COST',
4659                                                           'After calling CSP_SCH_INT_PVT.OPTIMIZE_OPTIONS... l_temp_options.count=' || l_temp_options.count);
4660                                                 end if;
4661 
4662                                                 IF x_return_status <> FND_API.G_RET_STS_SUCCESS THEN
4663                                     RETURN;
4664                         END IF;
4665 
4666                                                 if(FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) then
4667                                                   FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT,
4668                                                           'csp.plsql.CSP_SCH_INT_PVT.GET_TIME_COST',
4669                                                           'Before calling BUILD_FINAL_LIST...');
4670                                                 end if;
4671 
4672                         CSP_SCH_INT_PVT.BUILD_FINAL_LIST(l_temp_options,x_options,x_return_status,x_msg_data,x_msg_count);
4673 
4674                                                 if(FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) then
4675                                                   FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT,
4676                                                           'csp.plsql.CSP_SCH_INT_PVT.GET_TIME_COST',
4677                                                           'After calling BUILD_FINAL_LIST... x_return_status=' || x_return_status);
4678                                                   FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT,
4679                                                           'csp.plsql.CSP_SCH_INT_PVT.GET_TIME_COST',
4680                                                           'After calling BUILD_FINAL_LIST... x_options.count=' || x_options.count);
4681                                                 end if;
4682 
4683                         IF x_return_status <> FND_API.G_RET_STS_SUCCESS THEN
4684                                     RETURN;
4685                         END IF;
4686 
4687                         l_temp_options.trim(l_temp_options.count);
4688                         l_temp_resources_list.trim(l_temp_resources_list.count);
4689 
4690                     END IF;
4691                  END IF;
4692                     loop_count := loop_count + 1 ;
4693             END LOOP;
4694 
4695                         if(FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) then
4696                           FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT,
4697                                   'csp.plsql.CSP_SCH_INT_PVT.GET_TIME_COST',
4698                                   'Coming out of the loop...');
4699                         end if;
4700 
4701             EXCEPTION
4702             WHEN OTHERS THEN
4703             FND_MESSAGE.SET_NAME('CSP', 'CSP_UNEXPECTED_EXEC_ERRORS');
4704             FND_MESSAGE.SET_TOKEN('ROUTINE', l_api_name, FALSE);
4705             FND_MESSAGE.SET_TOKEN('SQLERRM', sqlerrm, FALSE);
4706             FND_MSG_PUB.ADD;
4707             fnd_msg_pub.count_and_get
4708               ( p_count => x_msg_count
4709               , p_data  => x_msg_data);
4710             x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
4711             return;
4712      END GET_TIME_COST;
4713      PROCEDURE BUILD_FINAL_LIST(p_temp_options  IN     CSP_SCH_INT_PVT.CSP_SHIP_PARAMETERS_TBL_TYPE
4714                                ,px_options      IN OUT NOCOPY CSP_SCH_INT_PVT.csp_sch_options_tbl_typ
4715                                ,x_return_status  OUT NOCOPY   VARCHAR2
4716                                ,x_msg_data       OUT NOCOPY   VARCHAR2
4717                                ,x_msg_count      OUT NOCOPY   NUMBER) IS
4718         l_api_name varchar2(60) := 'CSP_SCH_INT_PVT.BUILD_FINAL_LIST';
4719         l_need_by_date date;
4720      BEGIN
4721             IF g_interval.latest_time IS NOT NULL
4722             THEN
4723                l_need_by_date := g_interval.latest_time;
4724             ELSE
4725                l_need_by_date := g_interval.earliest_time;
4726             END IF;
4727         x_return_status := FND_API.G_RET_STS_SUCCESS;
4728         FOR I IN 1..p_temp_options.count LOOP
4729           -- IF round(p_temp_options(I).arrival_date,'MI') <= round(l_need_by_date,'MI') THEN
4730             px_options.extend;
4731             px_options(px_options.count).resource_type :=  p_temp_options(I).resource_type;
4732             px_options(px_options.count).resource_id   :=  p_temp_options(I).resource_id;
4733             px_options(px_options.count).start_time    :=  round(p_temp_options(I).arrival_date,'MI') ;
4734             px_options(px_options.count).transfer_cost :=  p_temp_options(I).transfer_cost;
4735             px_options(px_options.count).missing_parts :=  0;
4736            /* ELSE
4737                 select least(round(p_temp_options(I).arrival_date,'MI'),round(g_earliest_delivery_date,'MI'))
4738                 INTO g_earliest_delivery_date
4739                 from dual;
4740             END IF;*/
4741         END LOOP;
4742         EXCEPTION
4743         WHEN OTHERS THEN
4744             FND_MESSAGE.SET_NAME('CSP', 'CSP_UNEXPECTED_EXEC_ERRORS');
4745             FND_MESSAGE.SET_TOKEN('ROUTINE', l_api_name, FALSE);
4746             FND_MESSAGE.SET_TOKEN('SQLERRM', sqlerrm, FALSE);
4747             FND_MSG_PUB.ADD;
4748             fnd_msg_pub.count_and_get
4749               ( p_count => x_msg_count
4750               , p_data  => x_msg_data);
4751             x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
4752             return;
4753      END BUILD_FINAL_LIST;
4754 
4755       PROCEDURE OPTIMIZE_OPTIONS(p_eligible_resources IN      CSP_SCH_INT_PVT.CSP_AVAILABILITY_TBL_TYPE
4756                                ,px_options           IN OUT NOCOPY  CSP_SCH_INT_PVT.CSP_SHIP_PARAMETERS_TBL_TYPE
4757                                ,x_ship_count         OUT NOCOPY     CSP_SCH_INT_PVT.CSP_SHIP_METHOD_COUNT_TBL_TYP
4758                                ,x_ship_parameters    OUT NOCOPY     CSP_SCH_INT_PVT.CSP_ORGS_SHIP_PARAM_TBL_TYPE
4759                                ,x_return_status      OUT NOCOPY     VARCHAR2
4760                                ,x_msg_data           OUT NOCOPY     VARCHAR2
4761                                ,x_msg_count          OUT NOCOPY     NUMBER) IS
4762 
4763          cursor location_shipping_method_count(c_from_org_id number, c_to_location_id number) IS
4764         SELECT count(*)
4765         FROM   MTL_INTERORG_SHIP_METHODS ISM,HR_ALL_ORGANIZATION_UNITS hao
4766         where  hao.organization_id = c_from_org_id
4767         and  ism.from_location_id = hao.location_id
4768         and  ism.to_location_id = c_to_location_id;
4769 
4770 
4771         l_resource_shipping_parameters  CSP_SCH_INT_PVT.CSP_ORGS_SHIP_PARAM_TBL_TYPE ;
4772         l_temp_rec                      CSP_SCH_INT_PVT.CSP_ORGS_SHIP_PARAM_TBL_TYPE ;
4773         l_ship_quantity                 CSP_SCH_INT_PVT.CSP_SHIP_QUANTITY_TBL_TYPE ;
4774         l_final_resource                CSP_SCH_INT_PVT.CSP_SHIP_PARAMETERS_TBL_TYPE ;
4775         l_temp_final_resource           CSP_SCH_INT_PVT.CSP_SHIP_PARAMETERS_TBL_TYPE ;
4776         L_API_NAME  VARCHAR2(60) := 'CSP_SCH_INT_PVT.OPTIMIZE_OPTIONS';
4777         loop_start NUMBER :=0 ;
4778         loop_end   NUMBER :=0 ;
4779         loop_min   NUMBER :=100000 ;
4780         loop_max   NUMBER :=0 ;
4781         min_leadtime NUMBER;
4782         max_leadtime NUMBER;
4783         k   NUMBER;
4784         low_cost_present BOOLEAN;
4785         ship_methodes_count NUMBER;
4786         first_count NUMBER;
4787         itration NUMBER;
4788         I NUMBER;
4789         resource_count NUMBER;
4790         record_present BOOLEAN;
4791         min_cost NUMBER;
4792         do_optimize BOOLEAN := FALSE;
4793         greatest_available_date DATE:= to_date('1','j');
4794         l_present boolean;
4795         l_min_cost_for_loop number;
4796         do_insert BOOLEAN;
4797         l_shipping_methods varchar2(2000);
4798         l_to_org_id NUMBER;
4799         l_loc_ship_method_count NUMBER := 0;
4800       BEGIN
4801              x_return_status := FND_API.G_RET_STS_SUCCESS ;
4802             l_resource_shipping_parameters :=  CSP_SCH_INT_PVT.CSP_ORGS_SHIP_PARAM_TBL_TYPE() ;
4803             l_temp_rec                     :=  CSP_SCH_INT_PVT.CSP_ORGS_SHIP_PARAM_TBL_TYPE() ;
4804             x_ship_count                   :=  CSP_SCH_INT_PVT.CSP_SHIP_METHOD_COUNT_TBL_TYP() ;
4805             l_ship_quantity                :=  CSP_SCH_INT_PVT.CSP_SHIP_QUANTITY_TBL_TYPE() ;
4806             l_final_resource               :=  CSP_SCH_INT_PVT.CSP_SHIP_PARAMETERS_TBL_TYPE() ;
4807             l_temp_final_resource          :=  CSP_SCH_INT_PVT.CSP_SHIP_PARAMETERS_TBL_TYPE() ;
4808             x_ship_parameters              :=  CSP_SCH_INT_PVT.CSP_ORGS_SHIP_PARAM_TBL_TYPE();
4809 
4810                 if(FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) then
4811                   FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT,
4812                           'csp.plsql.CSP_SCH_INT_PVT.OPTIMIZE_OPTIONS',
4813                           'Begin...');
4814                 end if;
4815 
4816             FOR I IN 1..p_eligible_resources.count LOOP
4817                l_to_org_id := p_eligible_resources(I).organization_id;
4818                OPEN location_shipping_method_count(p_eligible_resources(I).source_org, p_eligible_resources(I).destination_location_id);
4819                FETCH location_shipping_method_count INTO l_loc_ship_method_count;
4820                CLOSE location_shipping_method_count;
4821 
4822                                 if(FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) then
4823                                   FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT,
4824                                           'csp.plsql.CSP_SCH_INT_PVT.OPTIMIZE_OPTIONS',
4825                                           'inside first for loop l_loc_ship_method_count for row I =' || l_loc_ship_method_count || '(' || I || ')');
4826                                 end if;
4827 
4828                 IF p_eligible_resources(I).sub_inventory IS NULL AND
4829                                        (p_eligible_resources(I).organization_id <> p_eligible_resources(I).source_org or nvl(l_loc_ship_method_count,0) <> 0 ) THEN
4830                     do_optimize := TRUE ;
4831                     exit;
4832                 ELSE
4833                     do_optimize := FALSE;
4834                 END IF;
4835             END LOOP;
4836 
4837 
4838           IF do_optimize  THEN
4839 
4840                         if(FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) then
4841                           FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT,
4842                                   'csp.plsql.CSP_SCH_INT_PVT.OPTIMIZE_OPTIONS',
4843                                   'doing do_optimize...');
4844                           FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT,
4845                                   'csp.plsql.CSP_SCH_INT_PVT.OPTIMIZE_OPTIONS',
4846                                   'before calling CONSOLIDATE_QUANTITIES...');
4847                         end if;
4848 
4849             CSP_SCH_INT_PVT.CONSOLIDATE_QUANTITIES(p_eligible_resources, l_ship_quantity,x_return_status,x_msg_data,x_msg_count);
4850 
4851                         if(FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) then
4852                           FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT,
4853                                   'csp.plsql.CSP_SCH_INT_PVT.OPTIMIZE_OPTIONS',
4854                                   'After calling CONSOLIDATE_QUANTITIES...x_return_status=' || x_return_status);
4855                           FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT,
4856                                   'csp.plsql.CSP_SCH_INT_PVT.OPTIMIZE_OPTIONS',
4857                                   'After calling CONSOLIDATE_QUANTITIES...l_ship_quantity.count=' || l_ship_quantity.count);
4858                         end if;
4859 
4860             IF x_return_status <>  FND_API.G_RET_STS_SUCCESS THEN
4861                 return;
4862             END IF;
4863 
4864                         if(FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) then
4865                           FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT,
4866                                   'csp.plsql.CSP_SCH_INT_PVT.OPTIMIZE_OPTIONS',
4867                                   'before calling GET_SHIPPING_PARAMETERS...');
4868                         end if;
4869 
4870             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);
4871 
4872                         if(FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) then
4873                           FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT,
4874                                   'csp.plsql.CSP_SCH_INT_PVT.OPTIMIZE_OPTIONS',
4875                                   'After calling GET_SHIPPING_PARAMETERS...x_return_status=' || x_return_status);
4876                           FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT,
4877                                   'csp.plsql.CSP_SCH_INT_PVT.OPTIMIZE_OPTIONS',
4878                                   'After calling GET_SHIPPING_PARAMETERS...l_resource_shipping_parameters.count=' || l_resource_shipping_parameters.count);
4879                           FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT,
4880                                   'csp.plsql.CSP_SCH_INT_PVT.OPTIMIZE_OPTIONS',
4881                                   'After calling GET_SHIPPING_PARAMETERS...x_ship_count.count=' || x_ship_count.count);
4882                         end if;
4883 
4884             IF x_return_status <> FND_API.G_RET_STS_SUCCESS THEN
4885                 return;
4886             END IF;
4887 
4888             x_ship_parameters := l_resource_shipping_parameters;
4889                 loop_start := 1 ;
4890                 min_leadtime := 0;
4891                 max_leadtime := 0;
4892 
4893            FOR I IN 1..p_eligible_resources.count LOOP
4894                 IF p_eligible_resources(I).sub_inventory IS NULL THEN
4895                     SELECT GREATEST(greatest_available_date, nvl(p_eligible_resources(I).available_date,sysdate))
4896                     INTO   greatest_available_date
4897                     FROM DUAL;
4898                 END IF;
4899            END LOOP;
4900 
4901                         if(FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) then
4902                           FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT,
4903                                   'csp.plsql.CSP_SCH_INT_PVT.OPTIMIZE_OPTIONS',
4904                                   'greatest_available_date=' || to_char(greatest_available_date, 'DD-MON-RRRR HH24:MI:SS'));
4905                         end if;
4906 
4907            FOR I IN 1..x_ship_count.count LOOP
4908                 loop_min := x_ship_count(I).min_leadtime;
4909                 loop_max := x_ship_count(I).max_leadtime;
4910                 SELECT GREATEST(min_leadtime,loop_min) INTO min_leadtime FROM DUAL;
4911                 SELECT GREATEST(max_leadtime,loop_max) INTO max_leadtime FROM DUAL;
4912            END LOOP;
4913 
4914                         if(FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) then
4915                           FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT,
4916                                   'csp.plsql.CSP_SCH_INT_PVT.OPTIMIZE_OPTIONS',
4917                                   'min_leadtime=' || min_leadtime || ', max_leadtime=' || max_leadtime);
4918                         end if;
4919 
4920              resource_count := 1 ;
4921               WHILE resource_count <= l_resource_shipping_parameters.count LOOP
4922                 first_count := 0;
4923                 FOR J IN 1..x_ship_count.count LOOP
4924                     IF x_ship_count(J).from_org_id  = l_resource_shipping_parameters(resource_count).from_org_id AND
4925                        x_ship_count(J).to_org_id    = l_resource_shipping_parameters(resource_count).to_org_id  THEN
4926                        first_count := x_ship_count(J).shipping_methodes;
4927                        exit;
4928                     END IF;
4929                 END LOOP;
4930 
4931                         if(FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) then
4932                           FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT,
4933                                   'csp.plsql.CSP_SCH_INT_PVT.OPTIMIZE_OPTIONS',
4934                                   'after for loop first_count=' || first_count);
4935                         end if;
4936 
4937                IF first_count  > 1 THEN
4938                 FOR I IN resource_count..(resource_count + first_count-1) LOOP
4939                     IF  l_resource_shipping_parameters(I).lead_time >= min_leadtime THEN
4940                            k := I-1 ;
4941                            low_cost_present := FALSE;
4942                             FOR K IN resource_count..(resource_count + first_count-1) LOOP
4943                                 IF l_resource_shipping_parameters(K).lead_time < l_resource_shipping_parameters(I).lead_time
4944                                 AND  l_resource_shipping_parameters(K).transfer_cost <=
4945                                             l_resource_shipping_parameters(I).transfer_cost THEN
4946                                     low_cost_present := TRUE;
4947                                     l_temp_rec.extend;
4948                                     l_temp_rec(l_temp_rec.count).resource_type
4949                                                                 := l_resource_shipping_parameters(k).resource_type ;
4950                                     l_temp_rec(l_temp_rec.count).resource_id
4951                                                                 := l_resource_shipping_parameters(k).resource_id ;
4952                                     l_temp_rec(l_temp_rec.count) .from_org_id
4953                                                                 := l_resource_shipping_parameters(k).from_org_id ;
4954                                     l_temp_rec(l_temp_rec.count) .to_org_id
4955                                                                 := l_resource_shipping_parameters(k).to_org_id ;
4956                                     l_temp_rec(l_temp_rec.count) .quantity
4957                                                                 := l_resource_shipping_parameters(k).quantity ;
4958                                     l_temp_rec(l_temp_rec.count) .shipping_method
4959                                                                 := l_resource_shipping_parameters(k).shipping_method;
4960                                     l_temp_rec(l_temp_rec.count) .lead_time
4961                                                                 := l_resource_shipping_parameters(k).lead_time ;
4962                                     l_temp_rec(l_temp_rec.count) .transfer_cost
4963                                                                 := l_resource_shipping_parameters(k).transfer_cost ;
4964                                 END IF ;
4965                             END LOOP;
4966                             IF low_cost_present = FALSE THEN
4967                                     l_temp_rec .extend;
4968                                     l_temp_rec(l_temp_rec.count).resource_type
4969                                                                 := l_resource_shipping_parameters(I).resource_type ;
4970                                     l_temp_rec(l_temp_rec.count) .resource_id
4971                                                                 := l_resource_shipping_parameters(I).resource_id ;
4972                                     l_temp_rec(l_temp_rec.count) .from_org_id
4973                                                                 := l_resource_shipping_parameters(I).from_org_id;
4974                                     l_temp_rec(l_temp_rec.count) .to_org_id
4975                                                                 := l_resource_shipping_parameters(I).to_org_id;
4976                                     l_temp_rec(l_temp_rec.count) .quantity
4977                                                                 := l_resource_shipping_parameters(I).quantity ;
4978                                     l_temp_rec(l_temp_rec.count) .shipping_method
4979                                                                 := l_resource_shipping_parameters(I).shipping_method;
4980                                     l_temp_rec(l_temp_rec.count) .lead_time
4981                                                                 := l_resource_shipping_parameters(I).lead_time ;
4982                                     l_temp_rec(l_temp_rec.count) .transfer_cost
4983                                                                 := l_resource_shipping_parameters(I).transfer_cost ;
4984                             END IF;
4985                     END IF;
4986                 END LOOP;
4987                ELSE
4988                     l_temp_rec .extend;
4989                     l_temp_rec(l_temp_rec.count).resource_type
4990                                           := l_resource_shipping_parameters(resource_count).resource_type ;
4991                     l_temp_rec(l_temp_rec.count) .resource_id
4992                                           := l_resource_shipping_parameters(resource_count).resource_id ;
4993                     l_temp_rec(l_temp_rec.count) .from_org_id
4994                                           := l_resource_shipping_parameters(resource_count).from_org_id;
4995                     l_temp_rec(l_temp_rec.count) .to_org_id
4996                                           := l_resource_shipping_parameters(resource_count).to_org_id;
4997                     l_temp_rec(l_temp_rec.count) .quantity
4998                                           := l_resource_shipping_parameters(resource_count).quantity ;
4999                     l_temp_rec(l_temp_rec.count) .shipping_method
5000                                           := l_resource_shipping_parameters(resource_count).shipping_method;
5001                    l_temp_rec(l_temp_rec.count) .lead_time
5002                                           := l_resource_shipping_parameters(resource_count).lead_time ;
5003                    l_temp_rec(l_temp_rec.count) .transfer_cost
5004                                           := l_resource_shipping_parameters(resource_count).transfer_cost ;
5005                  END IF;
5006                         l_present := FALSE ;
5007                         FOR N IN 1..l_temp_rec.count LOOP
5008                             IF l_temp_rec(N).resource_type = l_resource_shipping_parameters(resource_count).resource_type and
5009                                l_temp_rec(N) .resource_id  = l_resource_shipping_parameters(resource_count).resource_id   and
5010                                l_temp_rec(N) .from_org_id  = l_resource_shipping_parameters(resource_count).from_org_id   and
5011                                l_temp_rec(N) .to_org_id    = l_resource_shipping_parameters(resource_count).to_org_id  THEN
5012                                l_present := TRUE;
5013                                exit;
5014                             END IF;
5015                         END LOOP;
5016                         l_min_cost_for_loop := 1000000000;
5017                         IF not l_present THEN
5018                             FOR N IN resource_count..(resource_count+first_count-1) LOOP
5019                                 select LEAST(l_min_cost_for_loop,l_resource_shipping_parameters(N).transfer_cost)
5020                                 INTO l_min_cost_for_loop
5021                                 FROM DUAL;
5022                             END LOOP;
5023                             FOR N IN resource_count..(resource_count+first_count-1) LOOP
5024                                 IF l_min_cost_for_loop = l_resource_shipping_parameters(N).transfer_cost THEN
5025                                 l_temp_rec .extend;
5026                                 l_temp_rec(l_temp_rec.count).resource_type
5027                                           := l_resource_shipping_parameters(resource_count).resource_type ;
5028                                 l_temp_rec(l_temp_rec.count) .resource_id
5029                                           := l_resource_shipping_parameters(resource_count).resource_id ;
5030                                 l_temp_rec(l_temp_rec.count) .from_org_id
5031                                           := l_resource_shipping_parameters(resource_count).from_org_id;
5032                                 l_temp_rec(l_temp_rec.count) .to_org_id
5033                                           := l_resource_shipping_parameters(resource_count).to_org_id;
5034                                 l_temp_rec(l_temp_rec.count) .quantity
5035                                           := l_resource_shipping_parameters(resource_count).quantity ;
5036                                 l_temp_rec(l_temp_rec.count) .shipping_method
5037                                           := l_resource_shipping_parameters(resource_count).shipping_method;
5038                                 l_temp_rec(l_temp_rec.count) .lead_time
5039                                           := l_resource_shipping_parameters(resource_count).lead_time ;
5040                                 l_temp_rec(l_temp_rec.count) .transfer_cost
5041                                           := l_resource_shipping_parameters(resource_count).transfer_cost ;
5042                                 END IF;
5043                             END LOOP;
5044                           END IF;
5045                     resource_count := resource_count + first_count ;
5046               END LOOP;
5047 
5048                         if(FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) then
5049                           FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT,
5050                                   'csp.plsql.CSP_SCH_INT_PVT.OPTIMIZE_OPTIONS',
5051                                   'Out of while loop ...');
5052                         end if;
5053 
5054                         FOR I IN 1..x_ship_count.count LOOP
5055                     ship_methodes_count := 0;
5056                     FOR J IN 1..l_temp_rec.count LOOP
5057                         IF l_temp_rec(J).from_org_id = x_ship_count(I).from_org_id AND
5058                                l_temp_rec(J).to_org_id = x_ship_count(I).to_org_id THEN
5059                                ship_methodes_count := ship_methodes_count + 1 ;
5060                         END IF;
5061                     END LOOP;
5062                     x_ship_count(I).shipping_methodes  := ship_methodes_count ;
5063             END LOOP;
5064             itration := 1;
5065             loop_start := 0;
5066             I :=1;
5067 
5068                         if(FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) then
5069                           FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT,
5070                                   'csp.plsql.CSP_SCH_INT_PVT.OPTIMIZE_OPTIONS',
5071                                   'another while loop ... l_temp_rec.count=' || l_temp_rec.count);
5072                         end if;
5073 
5074            WHILE I <=  l_temp_rec.count LOOP
5075                 first_count := 0;
5076 
5077                         if(FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) then
5078                           FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT,
5079                                   'csp.plsql.CSP_SCH_INT_PVT.OPTIMIZE_OPTIONS',
5080                                   'another while loop ... first_count=' || first_count);
5081                         end if;
5082 
5083                 FOR J IN 1..x_ship_count.count LOOP
5084                     IF x_ship_count(J).from_org_id = l_temp_rec(I).from_org_id AND
5085                        x_ship_count(J).to_org_id = l_temp_rec(I).to_org_id THEN
5086                        first_count := x_ship_count(J).shipping_methodes;
5087                        exit;
5088                     END IF;
5089                 END LOOP;
5090                 IF itration = 1 then
5091                     FOR K IN 1..first_count LOOP
5092                      l_final_resource.extend;
5093                      l_final_resource(l_final_resource.count).resource_id        :=  l_temp_rec(I).resource_id ;
5094                      l_final_resource(l_final_resource.count).resource_type      :=  l_temp_rec(I).resource_type ;
5095                      l_final_resource(l_final_resource.count).lead_time          :=  l_temp_rec(K).lead_time;
5096                      l_final_resource(l_final_resource.count).transfer_cost      :=  l_temp_rec(K).quantity * l_temp_rec(K).transfer_cost;
5097                      l_final_resource(l_final_resource.count).shipping_methodes  :=  l_temp_rec(K).shipping_method ;
5098                     END LOOP;
5099                ELSE
5100                     FOR K IN 1..l_final_resource.count LOOP
5101                         FOR L IN I..(I+first_count-1) LOOP
5102                             l_temp_final_resource.extend ;
5103                             l_temp_final_resource(l_temp_final_resource.count).resource_id
5104                                                         :=  l_final_resource(k).resource_id ;
5105                             l_temp_final_resource(l_temp_final_resource.count).resource_type :=
5106                                                                        l_final_resource(K).resource_type ;
5107                             SELECT GREATEST(l_final_resource(K).lead_time,l_temp_rec(L).lead_time)
5108                             INTO l_temp_final_resource(l_temp_final_resource.count).lead_time
5109                             FROM DUAL ;
5110                              l_temp_final_resource(l_temp_final_resource.count).transfer_cost :=
5111                                                 (l_temp_rec(L).transfer_cost * l_temp_rec(L) .quantity) +
5112                                                  l_final_resource(K).transfer_cost;
5113                              l_temp_final_resource(l_temp_final_resource.count).shipping_methodes
5114                                                          := l_final_resource(K).shipping_methodes || '$' || l_temp_rec(L).shipping_method ;
5115                         END LOOP;
5116                     END LOOP;
5117                             l_final_resource.trim(l_final_resource.count) ;
5118                     FOR L IN 1..l_temp_final_resource.count LOOP
5119                         l_final_resource.extend ;
5120                         l_final_resource(l_final_resource.count).resource_id      :=  l_temp_final_resource(L).resource_id ;
5121                         l_final_resource(l_final_resource.count).resource_type    :=  l_temp_final_resource(L).resource_type ;
5122                         l_final_resource(l_final_resource.count).lead_time        := l_temp_final_resource(L).lead_time;
5123                         l_final_resource(l_final_resource.count).transfer_cost    := l_temp_final_resource(L).transfer_cost ;
5124                         l_final_resource(l_final_resource.count).shipping_methodes:= l_temp_final_resource(L).shipping_methodes;
5125                     END LOOP;
5126                         l_temp_final_resource.trim(l_temp_final_resource.count);
5127                 END IF;
5128                 itration := itration + 1;
5129                 I := I + first_count ;
5130             END LOOP;
5131             FOR L IN 1..l_final_resource.count LOOP
5132                   record_present := false;
5133                   FOR K IN 1..px_options.count LOOP
5134                             IF l_final_resource(L).lead_time = px_options(K).lead_time THEN
5135                                 record_present := TRUE;
5136                                 exit;
5137                             END IF;
5138                   END LOOP;
5139                  IF record_present = FALSE THEN
5140                     min_cost := l_final_resource(L).transfer_cost ;
5141                     l_shipping_methods := l_final_resource(L).shipping_methodes;
5142                     FOR J IN 1..l_final_resource.count LOOP
5143                         IF L <> J AND l_final_resource(L).lead_time =l_final_resource(J).lead_time THEN
5144                            /* SELECT LEAST(min_cost, l_final_resource(J).transfer_cost)
5145                             INTO min_cost
5146                             FROM DUAL;*/
5147                             if min_cost > l_final_resource(J).transfer_cost then
5148                                 min_cost := l_final_resource(J).transfer_cost;
5149                                 l_shipping_methods := l_final_resource(J).shipping_methodes;
5150                             end if;
5151                         END IF;
5152                     END LOOP;
5153                     px_options.extend;
5154                     px_options(px_options.count).resource_id       :=  l_final_resource(L).resource_id ;
5155                     px_options(px_options.count).resource_type     :=  l_final_resource(L).resource_type ;
5156                    /* in case of available date not today we have to assume that it is from other source
5157                      hence we have to substarct the current time from midnight today*/
5158                     l_final_resource(L).lead_time := l_final_resource(L).lead_time -
5159                                             ((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 ));
5160 
5161                     px_options(px_options.count).lead_time         :=  l_final_resource(L).lead_time;
5162                     px_options(px_options.count).transfer_cost     :=  min_cost;
5163                     px_options(px_options.count).shipping_methodes :=  l_shipping_methods;
5164                     px_options(px_options.count).arrival_date      :=  get_arrival_date(greatest_available_date,
5165                                                                                         l_final_resource(L).lead_time,
5166                                                                                         l_to_org_id);
5167 
5168                    END IF;
5169             END LOOP;
5170            ELSE
5171                  FOR I IN 1..p_eligible_resources.count LOOP
5172                     IF px_options.count >= 1 THEN
5173                         FOR J IN 1..px_options.count LOOP
5174                             IF px_options(J).resource_id <> p_eligible_resources(I).resource_id AND
5175                                px_options(J).resource_type <>  p_eligible_resources(I).resource_type THEN
5176                                do_insert := TRUE;
5177                                EXIT;
5178                             END IF;
5179                         END LOOP;
5180                         IF do_insert THEN
5181                             px_options.extend;
5182                             px_options(px_options.count).resource_id       :=  p_eligible_resources(I).resource_id ;
5183                             px_options(px_options.count).resource_type     :=  p_eligible_resources(I).resource_type ;
5184                             px_options(px_options.count).lead_time         :=  0;
5185                             px_options(px_options.count).transfer_cost     :=  0;
5186                             px_options(px_options.count).shipping_methodes :=  null;
5187                             px_options(px_options.count).arrival_date      :=  SYSDATE;
5188                         END IF;
5189                     ELSE
5190                             px_options.extend;
5191                             px_options(px_options.count).resource_id       :=  p_eligible_resources(I).resource_id ;
5192                             px_options(px_options.count).resource_type     :=  p_eligible_resources(I).resource_type ;
5193                             px_options(px_options.count).lead_time         :=  0;
5194                             px_options(px_options.count).transfer_cost     :=  0;
5195                             px_options(px_options.count).shipping_methodes :=  null;
5196                             px_options(px_options.count).arrival_date      :=  SYSDATE;
5197                     END IF;
5198                     do_insert := FALSE;
5199                     IF x_ship_count.count = 0 THEN
5200                         x_ship_count.extend;
5201                         x_ship_count(x_ship_count.count).from_org_id       := p_eligible_resources(I).source_org;
5202                         x_ship_count(x_ship_count.count).to_org_Id         := p_eligible_resources(I).organization_id;
5203                         x_ship_count(x_ship_count.count).shipping_methodes := 0 ;
5204                         x_ship_count(x_ship_count.count).min_leadtime      := 0;
5205                         x_ship_count(x_ship_count.count).max_leadtime      := 0;
5206                     ELSE
5207                         FOR I IN 1..x_ship_count.count LOOP
5208                             IF x_ship_count(x_ship_count.count).from_org_id <> p_eligible_resources(I).source_org AND
5209                                  x_ship_count(x_ship_count.count).to_org_id <> p_eligible_resources(I).organization_id THEN
5210                                 do_insert := TRUE;
5211                                 exit;
5212                             END IF;
5213                         END LOOP;
5214                         IF do_insert THEN
5215                             x_ship_count.extend;
5216                             x_ship_count(x_ship_count.count).from_org_id       := p_eligible_resources(I).source_org;
5217                             x_ship_count(x_ship_count.count).to_org_Id         := p_eligible_resources(I).organization_id;
5218                             x_ship_count(x_ship_count.count).shipping_methodes := 0 ;
5219                             x_ship_count(x_ship_count.count).min_leadtime      := 0;
5220                             x_ship_count(x_ship_count.count).max_leadtime      := 0;
5221                         END IF;
5222                     END IF;
5223                 END LOOP;
5224            END IF;
5225            EXCEPTION
5226             WHEN OTHERS THEN
5227             FND_MESSAGE.SET_NAME('CSP', 'CSP_UNEXPECTED_EXEC_ERRORS');
5228             FND_MESSAGE.SET_TOKEN('ROUTINE', l_api_name, FALSE);
5229             FND_MESSAGE.SET_TOKEN('SQLERRM', sqlerrm, FALSE);
5230             FND_MSG_PUB.ADD;
5231             fnd_msg_pub.count_and_get
5232               ( p_count => x_msg_count
5233               , p_data  => x_msg_data);
5234             x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
5235             return;
5236       END OPTIMIZE_OPTIONS;
5237 
5238      PROCEDURE CONSOLIDATE_QUANTITIES(p_eligible_resources_list IN     CSP_SCH_INT_PVT.CSP_AVAILABILITY_TBL_TYPE
5239                                       ,x_ship_quantity          OUT NOCOPY    CSP_SCH_INT_PVT.CSP_SHIP_QUANTITY_TBL_TYPE
5240                                       ,x_return_status          OUT NOCOPY    VARCHAR2
5241                                       ,x_msg_data               OUT NOCOPY    VARCHAR2
5242                                       ,x_msg_count              OUT NOCOPY    NUMBER) IS
5243         I NUMBER;
5244         J NUMBER;
5245         available BOOLEAN;
5246         l_api_name VARCHAR2(60) := 'CSP_SCH_INT_PVT.CONSOLIDATE_QUANTITIES';
5247      BEGIN
5248             x_return_status := FND_API.G_RET_STS_SUCCESS ;
5249             x_ship_quantity := CSP_SCH_INT_PVT.CSP_SHIP_QUANTITY_TBL_TYPE();
5250             x_ship_quantity.trim(x_ship_quantity.count);
5251             FOR I IN 1..p_eligible_resources_list.count LOOP
5252                 IF p_eligible_resources_list(I).sub_inventory IS NULL THEN
5253                     IF x_ship_quantity.count >= 1 THEN
5254                         FOR J IN 1..x_ship_quantity.count LOOP
5255                             IF p_eligible_resources_list(I).organization_id = x_ship_quantity(J).to_org_id AND
5256                              p_eligible_resources_list(I).source_org = x_ship_quantity(J).from_org_id THEN
5257                              x_ship_quantity(J).quantity := x_ship_quantity(J).quantity +
5258                                                               p_eligible_resources_list(I).quantity ;
5259                                 available := TRUE;
5260                                 EXIT ;
5261                             ELSE
5262                              available := FALSE;
5263                             END IF;
5264                         END LOOP;
5265                             IF available  = FALSE THEN
5266                                 x_ship_quantity.extend ;
5267                                 x_ship_quantity(x_ship_quantity.count).resource_type :=
5268                                                                            p_eligible_resources_list(I).resource_type  ;
5269                                 x_ship_quantity(x_ship_quantity.count).resource_id :=
5270                                                                            p_eligible_resources_list(I).resource_id ;
5271                                 x_ship_quantity(x_ship_quantity.count).from_org_id := p_eligible_resources_list(I).source_org;
5272                                 x_ship_quantity(x_ship_quantity.count).to_org_id   :=  p_eligible_resources_list(I).organization_id;
5273                                 x_ship_quantity(x_ship_quantity.count).quantity := p_eligible_resources_list(I).quantity;
5274                                 x_ship_quantity(x_ship_quantity.count).destination_location_id :=  p_eligible_resources_list(I).destination_location_id;
5275                             END IF;
5276                     ELSE
5277                         x_ship_quantity.extend ;
5278                         x_ship_quantity(x_ship_quantity.count).resource_type := p_eligible_resources_list(I).resource_type  ;
5279                         x_ship_quantity(x_ship_quantity.count).resource_id := p_eligible_resources_list(I).resource_id ;
5280                         x_ship_quantity(x_ship_quantity.count).from_org_id := p_eligible_resources_list(I).source_org;
5281                         x_ship_quantity(x_ship_quantity.count).to_org_id   :=  p_eligible_resources_list(I).organization_id;
5282                         x_ship_quantity(x_ship_quantity.count).quantity    := p_eligible_resources_list(I).quantity;
5283                          x_ship_quantity(x_ship_quantity.count).destination_location_id :=  p_eligible_resources_list(I).destination_location_id;
5284                     END IF;
5285                 END IF;
5286             END LOOP;
5287             EXCEPTION
5288             WHEN OTHERS THEN
5289             FND_MESSAGE.SET_NAME('CSP', 'CSP_UNEXPECTED_EXEC_ERRORS');
5290             FND_MESSAGE.SET_TOKEN('ROUTINE', l_api_name, FALSE);
5291             FND_MESSAGE.SET_TOKEN('SQLERRM', sqlerrm, FALSE);
5292             FND_MSG_PUB.ADD;
5293             fnd_msg_pub.count_and_get
5294               ( p_count => x_msg_count
5295               , p_data  => x_msg_data);
5296             x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
5297             return;
5298      END CONSOLIDATE_QUANTITIES;
5299 
5300       PROCEDURE GET_SHIPPING_PARAMETERS(p_ship_quantity            IN CSP_SCH_INT_PVT.CSP_SHIP_QUANTITY_TBL_TYPE,
5301                                        x_resource_ship_parameters OUT NOCOPY CSP_SCH_INT_PVT.CSP_ORGS_SHIP_PARAM_TBL_TYPE
5302                                       ,x_ship_count               OUT NOCOPY CSP_SCH_INT_PVT.CSP_SHIP_METHOD_COUNT_TBL_TYP
5303                                       ,x_return_status            OUT NOCOPY VARCHAR2
5304                                       ,x_msg_data                 OUT NOCOPY VARCHAR2
5305                                       ,x_msg_count                OUT NOCOPY NUMBER) IS
5306         CURSOR csp_ship_methodes(from_org varchar2,to_org varchar2) IS
5307         SELECT ISM.SHIP_METHOD,NVL(ISM.COST_PER_UNIT_LOAD_WEIGHT,0)
5308        ,CDT.FREIGHT_CODE,CDT.LEAD_TIME,CDT.LEAD_TIME_UOM,CDT.DELIVERY_TIME
5309        ,CDT.CUTOFF_TIME,CDT.TIMEZONE_ID,CDT.SAFETY_ZONE
5310         FROM   MTL_INTERORG_SHIP_METHODS ISM,CSP_CARRIER_DELIVERY_TIMES CDT
5311         WHERE  ISM.FROM_ORGANIZATION_ID = from_org
5312         AND    ISM.TO_ORGANIZATION_ID =  to_org
5313         AND    CDT.ORGANIZATION_ID = from_org
5314         AND    CDT.SHIPPING_METHOD = ISM.SHIP_METHOD;
5315 
5316         CURSOR C2(c_resource_type varchar2, c_resource_id NUMBER)
5317         IS
5318         SELECT TIMEZONE_ID
5319         FROM   CSP_RS_SHIP_TO_ADDRESSES_V
5320         WHERE  PRIMARY_FLAG ='Y'
5321         AND resource_id  = c_resource_id
5322         AND resource_type = c_resource_type;
5323 
5324         CURSOR get_organization_code(l_org_id number) IS
5325         SELECT ORGANIZATION_CODE
5326         FROM   MTL_PARAMETERS
5327         WHERE  ORGANIZATION_ID = l_org_id;
5328 
5329         cursor csp_location_ship_methods(c_from_org_id number, c_to_location_id number) IS
5330         select shipping_method,
5331                shipping_cost,
5332                intransit_time,
5333                from_location_id,
5334                to_location_id,
5335                destination_type
5336         from   csp_shipping_details_v
5337         where  organization_id = c_from_org_id
5338         and    to_location_id = c_to_location_id;
5339 
5340 
5341         l_default_unit_for_hour  varchar2(3);
5342         l_ship_methode           VARCHAR2(30);
5343         l_cost_per_unit          NUMBER;
5344         l_lead_time              NUMBER;
5345         l_freight_code           Varchar2(30);
5346         l_lead_time_uom          varchar2(3);
5347         l_delivery_time           date;
5348         l_cutoff_time            date;
5349         l_timezone_id            NUMBER;
5350         l_saftey_zone            number;
5351         l_hours                  NUMBER;
5352         l_server_timezone_id     NUMBER;
5353         l_shipto_timezone_id   NUMBER;
5354         l_delivery_date          DATE;
5355         l_days                   NUMBER;
5356         shipping_option         BOOLEAN;
5357 
5358         l_shipping_methode_count NUMBER;
5359         l_need_by_date           DATE;
5360         l_min_lead_time      NUMBER;
5361         l_max_lead_time      NUMBER;
5362         l_server_time_zone_id NUMBER;
5363         l_msg_count           NUMBER;
5364         l_cutoff_hours        NUMBER;
5365         l_sys_hours           NUMBER;
5366         l_msg_data            VARCHAR2(2000);
5367         l_return_status       VARCHAR2(3);
5368         l_server_delivery_date DATE;
5369         l_server_cutoff_time   DATE;
5370         l_api_name             VARCHAR2(60) := 'CSP_SCH_INT_PVT.GET_SHIPPING_PARAMETERS';
5371         l_from_org_code        VARCHAR2(10);
5372         l_to_org_code           VARCHAR2(10);
5373         l_sysdate              DATE;
5374         l_server_sys_date      Date;
5375         l_from_location_id     NUMBER;
5376         l_to_location_id       NUMBER ;
5377         l_destination_type     varchar2(1);
5378         l_ship_method_present_for_loc boolean := false;
5379         l_ship_method_present_for_reg boolean :=false;
5380      BEGIN
5381             l_server_sys_date := sysdate;
5382             x_return_status := FND_API.G_RET_STS_SUCCESS;
5383             l_default_unit_for_hour := FND_PROFILE.VALUE(NAME => 'CSF_UOM_HOURS');
5384             l_server_time_zone_id   := FND_PROFILE.VALUE(NAME => 'SERVER_TIMEZONE_ID');
5385 
5386             IF g_interval.latest_time IS NOT NULL
5387             THEN
5388                l_need_by_date := g_interval.latest_time;
5389             ELSE
5390                l_need_by_date := g_interval.earliest_time;
5391             END IF;
5392             x_resource_ship_parameters :=  CSP_SCH_INT_PVT.CSP_ORGS_SHIP_PARAM_TBL_TYPE();
5393             x_ship_count := CSP_SCH_INT_PVT.CSP_SHIP_METHOD_COUNT_TBL_TYP();
5394             x_ship_count.trim(x_ship_count.count) ;
5395             FOR I IN 1..p_ship_quantity.count LOOP
5396                 IF p_ship_quantity(I).resource_type = 'DUMMY'          and
5397                    p_ship_quantity(I).resource_id =  '999999999999999'  or g_shipto_timezone_id is not null THEN
5398                    l_shipto_timezone_id := g_shipto_timezone_id;
5399                 ELSE
5400                     OPEN C2(p_ship_quantity(I).resource_type, p_ship_quantity(I).resource_id);
5401                     LOOP
5402                         FETCH C2 INTO l_shipto_timezone_id;
5403                         EXIT WHEN C2%NOTFOUND;
5404                     END LOOP;
5405                     CLOSE C2;
5406                 END IF;
5407                 IF l_shipto_timezone_id <> l_server_time_zone_id THEN
5408                             HZ_TIMEZONE_PUB.Get_Time(   p_api_version  => 1.0,
5409                                     p_init_msg_list  => FND_API.G_FALSE,
5410                                     p_source_tz_id   => l_server_time_zone_id,
5411                                     p_dest_tz_id     => l_shipto_timezone_id,
5412                                     p_source_day_time  => sysdate,
5413                                     x_dest_day_time    => l_sysdate,
5414                                     x_return_status    => l_return_status ,
5415                                     x_msg_count        => l_msg_count ,
5416                                     x_msg_data         => l_msg_data);
5417                   ELSE
5418                       l_sysdate := sysdate;
5419                   END IF;
5420                 l_min_lead_time  := 0;
5421                 l_max_lead_time  := 0;
5422                 l_shipping_methode_count := 0;
5423                 OPEN csp_location_ship_methods(p_ship_quantity(I).from_org_id,p_ship_quantity(I).destination_location_id);
5424                 LOOP
5425                     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;
5426                     EXIT WHEN csp_location_ship_methods%NOTFOUND;
5427                     if not l_ship_method_present_for_loc then
5428                         if l_destination_type = 'L' THEN
5429                             l_ship_method_present_for_loc := true;
5430                         end if;
5431                         if not l_ship_method_present_for_reg then
5432                           if l_destination_type = 'R' THEN
5433                             l_ship_method_present_for_reg := true;
5434                           end if;
5435                         end if;
5436                     end if ;
5437                     shipping_option := false;
5438                     if l_ship_method_present_for_loc AND l_destination_type = 'L' THEN
5439                             shipping_option := true;
5440                     end if;
5441                     if not l_ship_method_present_for_loc AND l_ship_method_present_for_reg AND l_destination_type = 'R' THEN
5442                         shipping_option := true;
5443                     END IF;
5444                     if not l_ship_method_present_for_loc AND NOT l_ship_method_present_for_reg AND l_destination_type = 'Z' THEN
5445                         shipping_option := true;
5446                     END IF;
5447                         l_delivery_date := trunc(l_sysdate + l_lead_time);
5448                          IF l_shipto_timezone_id <> l_server_time_zone_id THEN
5449                             HZ_TIMEZONE_PUB.Get_Time(   p_api_version  => 1.0,
5450                                     p_init_msg_list  => FND_API.G_FALSE,
5451                                     p_source_tz_id   => l_shipto_timezone_id,
5452                                     p_dest_tz_id     => l_server_time_zone_id,
5453                                     p_source_day_time  => l_delivery_date,
5454                                     x_dest_day_time    => l_server_delivery_date,
5455                                     x_return_status    => l_return_status ,
5456                                     x_msg_count        => l_msg_count ,
5457                                     x_msg_data         => l_msg_data);
5458                         ELSE
5459                             l_server_delivery_date := l_delivery_date;
5460                         END IF;
5461                         IF  shipping_option then
5462                             l_shipping_methode_count := l_shipping_methode_count + 1;
5463                         IF l_shipping_methode_count = 1 THEN
5464                             l_min_lead_time :=  (l_server_delivery_date - l_server_sys_date) * 24 ;
5465                             l_max_lead_time :=  (l_server_delivery_date - l_server_sys_date) * 24 ;
5466                         ELSE
5467                             IF l_min_lead_time > (l_server_delivery_date - l_server_sys_date) * 24 THEN
5468                                l_min_lead_time :=  (l_server_delivery_date - l_server_sys_date) * 24 ;
5469                             END IF;
5470                             IF l_max_lead_time < (l_server_delivery_date - l_server_sys_date) * 24 THEN
5471                                 l_max_lead_time :=  (l_server_delivery_date - l_server_sys_date) * 24 ;
5472                             END IF;
5473                         END IF;
5474                         x_resource_ship_parameters.extend ;
5475                     x_resource_ship_parameters(x_resource_ship_parameters.count).resource_type
5476                                                                 := p_ship_quantity(I).resource_type ;
5477                     x_resource_ship_parameters(x_resource_ship_parameters.count).resource_id
5478                                                                 := p_ship_quantity(I).resource_id ;
5479                     x_resource_ship_parameters(x_resource_ship_parameters.count).from_org_id
5480                                                                 := p_ship_quantity(I).from_org_id;
5481                     x_resource_ship_parameters(x_resource_ship_parameters.count).to_org_id
5482                                                                 := p_ship_quantity(I).to_org_id;
5483                     x_resource_ship_parameters(x_resource_ship_parameters.count).quantity
5484                                                                 := p_ship_quantity(I).quantity ;
5485                     x_resource_ship_parameters(x_resource_ship_parameters.count).shipping_method
5486                                                                 := l_ship_methode ;
5487                     x_resource_ship_parameters(x_resource_ship_parameters.count).lead_time
5488                                                                 := (l_server_delivery_date - l_server_sys_date) * 24  ;
5489                     x_resource_ship_parameters(x_resource_ship_parameters.count).transfer_cost
5490                                                                 := NVL(l_cost_per_unit,0);
5491                     x_resource_ship_parameters(x_resource_ship_parameters.count).delivery_time := l_server_delivery_date;
5492                     END IF;
5493                 END LOOP;
5494               IF csp_location_ship_methods % ROWCOUNT = 0 THEN
5495                 CLOSE csp_location_ship_methods;
5496                 OPEN CSP_SHIP_METHODES(p_ship_quantity(I).from_org_id,p_ship_quantity(I).to_org_id);
5497                 LOOP
5498                     FETCH CSP_SHIP_METHODES INTO l_ship_methode,l_cost_per_unit,l_freight_code,l_lead_time,l_lead_time_uom,
5499                                      l_delivery_time,l_cutoff_time, l_timezone_id, l_saftey_zone;
5500                     EXIT WHEN CSP_SHIP_METHODES%NOTFOUND;
5501                     l_hours := 0;
5502                     l_days := 0;
5503                     shipping_option := true;
5504                     IF l_lead_time > 0 THEN
5505                         l_hours := inv_convert.inv_um_convert (null,6,l_lead_time,l_lead_time_uom,l_default_unit_for_hour,null,null);
5506                         IF l_hours >= 24 then
5507                             IF l_delivery_time is null THEN
5508                                 l_hours := l_hours ;
5509                                 l_delivery_date := (l_sysdate + (1/24) * l_hours);
5510                             ELSE
5511                                 l_days := round (l_hours / 24 ) ;
5512                                 l_delivery_date := trunc(l_sysdate + l_days) ;
5513                                 l_hours :=  TO_NUMBER(to_char(l_delivery_time,'HH24'))  +  TO_NUMBER(to_char(l_delivery_time,'MI')) * (1/60);
5514                                 l_delivery_date := (l_delivery_date + (1/24) * l_hours);
5515                             END IF;
5516                         ELSE
5517                             IF l_delivery_time is null THEN
5518                                 l_delivery_date := (l_sysdate + (1/24) * l_hours);
5519                             ELSE
5520                                 IF ((to_number(to_char(l_delivery_time,'HH24')) + (1/60) * to_number(to_char(l_delivery_time,'MI')))
5521                                      - (to_number(to_char(l_sysdate ,'HH24'))  + (1/60) * to_number(to_char(l_sysdate,'MI'))) ) > l_hours THEN
5522                                     l_delivery_date := (l_sysdate + (1/24) * l_hours);
5523                                 ELSE
5524                                     shipping_option := FALSE;
5525                                 END IF;
5526                             END IF;
5527                         END IF;
5528                     END IF;
5529                     IF l_saftey_zone IS NOT NULL THEN
5530                         l_delivery_date := l_delivery_date + (l_saftey_zone * 1/24) ;
5531                     END IF;
5532 
5533                       IF l_shipto_timezone_id <> l_server_time_zone_id THEN
5534                             HZ_TIMEZONE_PUB.Get_Time(   p_api_version  => 1.0,
5535                                     p_init_msg_list  => FND_API.G_FALSE,
5536                                     p_source_tz_id   => l_shipto_timezone_id,
5537                                     p_dest_tz_id     => l_server_time_zone_id,
5538                                     p_source_day_time  => l_delivery_date,
5539                                     x_dest_day_time    => l_server_delivery_date,
5540                                     x_return_status    => l_return_status ,
5541                                     x_msg_count        => l_msg_count ,
5542                                     x_msg_data         => l_msg_data);
5543                         ELSE
5544                             l_server_delivery_date := l_delivery_date;
5545                         END IF;
5546 
5547                         IF l_cutoff_time is not null then
5548                             HZ_TIMEZONE_PUB.Get_Time(   p_api_version  => 1.0,
5549                                     p_init_msg_list  => FND_API.G_FALSE,
5550                                     p_source_tz_id   => l_timezone_id,
5551                                     p_dest_tz_id     => l_server_time_zone_id,
5552                                     p_source_day_time  => l_cutoff_time,
5553                                     x_dest_day_time    => l_server_cutoff_time,
5554                                     x_return_status    => l_return_status ,
5555                                     x_msg_count        => l_msg_count ,
5556                                     x_msg_data         => l_msg_data);
5557                                     l_cutoff_hours := to_number(to_char(l_server_cutoff_time,'HH24')) + (to_number(to_char(l_server_cutoff_time,'MI')) * 1/60);
5558                                     l_sys_hours    := to_number(to_char(l_sysdate,'HH24')) + (to_number(to_char(l_sysdate,'MI')) * 1/60);
5559 
5560                             IF l_cutoff_hours < l_sys_hours THEN
5561                                 l_server_delivery_date := l_server_delivery_date + 1;
5562                             END IF;
5563                         END IF;
5564                   /*  IF l_need_by_date IS NOT NULL AND  l_server_delivery_date > l_need_by_date THEN
5565                             shipping_option := FALSE;
5566                     END IF;*/
5567                        IF  shipping_option then
5568                         l_shipping_methode_count := l_shipping_methode_count + 1;
5569                         IF l_shipping_methode_count = 1 THEN
5570                             l_min_lead_time :=  (l_server_delivery_date - l_server_sys_date) * 24 ;
5571                             l_max_lead_time :=  (l_server_delivery_date - l_server_sys_date) * 24 ;
5572                         ELSE
5573                             IF l_min_lead_time > (l_server_delivery_date - l_server_sys_date) * 24 THEN
5574                                l_min_lead_time :=  (l_server_delivery_date - l_server_sys_date) * 24 ;
5575                             END IF;
5576                             IF l_max_lead_time < (l_server_delivery_date - l_server_sys_date) * 24 THEN
5577                                 l_max_lead_time :=  (l_server_delivery_date - l_server_sys_date) * 24 ;
5578                             END IF;
5579                         END IF;
5580                         x_resource_ship_parameters.extend ;
5581                     x_resource_ship_parameters(x_resource_ship_parameters.count).resource_type
5582                                                                 := p_ship_quantity(I).resource_type ;
5583                     x_resource_ship_parameters(x_resource_ship_parameters.count).resource_id
5584                                                                 := p_ship_quantity(I).resource_id ;
5585                     x_resource_ship_parameters(x_resource_ship_parameters.count).from_org_id
5586                                                                 := p_ship_quantity(I).from_org_id;
5587                     x_resource_ship_parameters(x_resource_ship_parameters.count).to_org_id
5588                                                                 := p_ship_quantity(I).to_org_id;
5589                     x_resource_ship_parameters(x_resource_ship_parameters.count).quantity
5590                                                                 := p_ship_quantity(I).quantity ;
5591                     x_resource_ship_parameters(x_resource_ship_parameters.count).shipping_method
5592                                                                 := l_ship_methode ;
5593                     x_resource_ship_parameters(x_resource_ship_parameters.count).lead_time
5594                                                                 := (l_server_delivery_date - l_server_sys_date) * 24  ;
5595                     x_resource_ship_parameters(x_resource_ship_parameters.count).transfer_cost
5596                                                                 := NVL(l_cost_per_unit,0);
5597                     x_resource_ship_parameters(x_resource_ship_parameters.count).delivery_time := l_server_delivery_date;
5598                     END IF;
5599                 END LOOP;
5600                     IF csp_ship_methodes%ROWCOUNT = 0 and  (p_ship_quantity(I).from_org_id <> p_ship_quantity(I).to_org_id) THEN
5601                          open get_organization_code(p_ship_quantity(I).from_org_id);
5602                          LOOP
5603                              FETCH get_organization_code INTO l_from_org_code;
5604                              EXIT WHEN get_organization_code % NOTFOUND;
5605                          END LOOP;
5606                          CLOSE get_organization_code;
5607                          open get_organization_code(p_ship_quantity(I).to_org_id);
5608                          LOOP
5609                              FETCH get_organization_code INTO l_to_org_code;
5610                              EXIT WHEN get_organization_code % NOTFOUND;
5611                          END LOOP;
5612                          CLOSE get_organization_code;
5613                          FND_MESSAGE.SET_NAME('CSP', 'CSP_SCH_SHIPMETHOD_NOT_DEFINED');
5614                          FND_MESSAGE.SET_TOKEN('FROM_ORG', l_from_org_code, TRUE);
5615                          FND_MESSAGE.SET_TOKEN('TO_ORG', l_to_org_code, TRUE);
5616                          FND_MSG_PUB.ADD;
5617                          fnd_msg_pub.count_and_get
5618                                             ( p_count => x_msg_count
5619                                             , p_data  => x_msg_data);
5620                          x_return_status := FND_API.G_RET_STS_ERROR;
5621                          return;
5622                     END IF;
5623                     IF csp_ship_methodes%ISOPEN THEN
5624                         CLOSE csp_ship_methodes;
5625                     END IF;
5626                 END IF;
5627                     IF csp_location_ship_methods %ISOPEN THEN
5628                         CLOSE csp_location_ship_methods;
5629                     END IF;
5630                 x_ship_count.extend;
5631                 x_ship_count(x_ship_count.count).from_org_id       := p_ship_quantity(I).from_org_id ;
5632                 x_ship_count(x_ship_count.count).to_org_Id         := p_ship_quantity(I).to_org_id ;
5633                 x_ship_count(x_ship_count.count).shipping_methodes := l_shipping_methode_count ;
5634                 x_ship_count(x_ship_count.count).min_leadtime      := l_min_lead_time;
5635                 x_ship_count(x_ship_count.count).max_leadtime      := l_max_lead_time;
5636             END LOOP;
5637 
5638             EXCEPTION
5639             WHEN OTHERS THEN
5640             FND_MESSAGE.SET_NAME('CSP', 'CSP_UNEXPECTED_EXEC_ERRORS');
5641             FND_MESSAGE.SET_TOKEN('ROUTINE', l_api_name, TRUE);
5642             FND_MESSAGE.SET_TOKEN('SQLERRM', sqlerrm, TRUE);
5643             FND_MSG_PUB.ADD;
5644             fnd_msg_pub.count_and_get
5645               ( p_count => x_msg_count
5646               , p_data  => x_msg_data);
5647             x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
5648             return;
5649      END GET_SHIPPING_PARAMETERS;
5650      PROCEDURE GET_DELIVERY_DATE(p_relation_ship_id  IN  NUMBER,
5651                                  x_delivery_date     OUT NOCOPY DATE,
5652                                  x_shipping_option   OUT NOCOPY BOOLEAN,
5653                                  x_return_status     OUT NOCOPY VARCHAR2,
5654                                  x_msg_data          OUT NOCOPY VARCHAR2,
5655                                  x_msg_count         OUT NOCOPY NUMBER) IS
5656         CURSOR C1(c_relation_id NUMBER) IS
5657         SELECT CDT.LEAD_TIME,CDT.LEAD_TIME_UOM,CDT.DELIVERY_TIME
5658               ,CDT.CUTOFF_TIME,CDT.TIMEZONE_ID,CDT.SAFETY_ZONE
5659         FROM   CSP_CARRIER_DELIVERY_TIMES CDT
5660         WHERE  CDT.relation_ship_id = c_relation_id;
5661         I NUMBER;
5662         l_hours     NUMBER;
5663         l_days      NUMBER;
5664         l_lead_time NUMBER;
5665         l_lead_time_uom varchar2(3);
5666         l_delivery_time DATE;
5667         l_cutoff_time DATE;
5668         l_timezone_id NUMBER;
5669         l_saftey_zone NUMBER;
5670         l_delivery_date DATE;
5671         l_default_unit_for_hour  varchar2(3);
5672         l_api_name varchar2(60) := 'CSP_SCH_INT_PVT.GET_DELIVERY_DATE' ;
5673       BEGIN
5674             x_return_status := FND_API.G_RET_STS_SUCCESS ;
5675           l_default_unit_for_hour := FND_PROFILE.VALUE(NAME => 'CSF_UOM_HOURS');
5676             OPEN C1(p_relation_ship_id);
5677             LOOP
5678                 FETCH C1 INTO l_lead_time,l_lead_time_uom,l_delivery_time,l_cutoff_time, l_timezone_id, l_saftey_zone;
5679                     EXIT WHEN C1%NOTFOUND;
5680                     l_hours := 0;
5681                     l_days := 0;
5682                     x_shipping_option := true;
5683                     IF l_lead_time > 0 THEN
5684                         l_hours := inv_convert.inv_um_convert (null,6,l_lead_time,l_lead_time_uom,l_default_unit_for_hour,null,null);
5685                         IF l_hours >= 24 then
5686                             IF l_delivery_time is null THEN
5687                                 l_hours := l_hours ;
5688                                 l_delivery_date := (SYSDATE + (1/24) * l_hours);
5689                             ELSE
5690                                 l_days := round (l_hours / 24 ) ;
5691                                 l_delivery_date := trunc(SYSDATE + l_days) ;
5692                                 l_hours :=  TO_NUMBER(to_char(l_delivery_time,'HH24'))  +  TO_NUMBER(to_char(l_delivery_time,'MI')) * (1/60);
5693                                 l_delivery_date := (l_delivery_date + (1/24) * l_hours);
5694                             END IF;
5695                         ELSE
5696                             IF l_delivery_time is null THEN
5697                                 l_delivery_date := (SYSDATE + (1/24) * l_hours);
5698                             ELSE
5699                                 IF ((to_number(to_char(l_delivery_time,'HH24')) + (1/60) * to_number(to_char(l_delivery_time,'MI')))
5700                                      - (to_number(to_char(sysdate ,'HH24'))  + (1/60) * to_number(to_char(sysdate,'MI'))) ) > l_hours THEN
5701                                     l_delivery_date := (SYSDATE + (1/24) * l_hours);
5702                                 ELSE
5703                                     x_shipping_option := FALSE;
5704                                 END IF;
5705                             END IF;
5706                         END IF;
5707                     END IF;
5708             END LOOP;
5709                 CLOSE C1;
5710                     IF l_saftey_zone IS NOT NULL THEN
5711                         l_delivery_date := l_delivery_date + (l_saftey_zone * 1/24) ;
5712                     END IF;
5713                     x_delivery_date := l_delivery_date;
5714             EXCEPTION
5715             WHEN OTHERS THEN
5716             FND_MESSAGE.SET_NAME('CSP', 'CSP_UNEXPECTED_EXEC_ERRORS');
5717             FND_MESSAGE.SET_TOKEN('ROUTINE', l_api_name, FALSE);
5718             FND_MESSAGE.SET_TOKEN('SQLERRM', sqlerrm, FALSE);
5719             FND_MSG_PUB.ADD;
5720             fnd_msg_pub.count_and_get
5721               ( p_count => x_msg_count
5722               , p_data  => x_msg_data);
5723             x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
5724             return;
5725       END GET_DELIVERY_DATE;
5726 
5727     PROCEDURE EXTEND_ATP_REC(p_atp_rec IN OUT NOCOPY mrp_atp_pub.atp_rec_typ
5728                              ,x_return_status OUT NOCOPY VARCHAR2) IS
5729 
5730     BEGIN
5731         x_return_status := FND_API.G_RET_STS_SUCCESS;
5732         p_atp_rec.Row_Id.Extend;
5733         p_atp_rec.Instance_Id.Extend;
5734         p_atp_rec.Inventory_Item_Id.Extend;
5735         p_atp_rec.Inventory_Item_Name.Extend;
5736         p_atp_rec.Source_Organization_Id.Extend;
5737         p_atp_rec.Source_Organization_Code.Extend;
5738         p_atp_rec.organization_id.Extend;
5739         p_atp_rec.Identifier.Extend;
5740         p_atp_rec.Demand_Source_Header_Id.Extend;
5741         p_atp_rec.Demand_Source_Delivery.Extend;
5742         p_atp_rec.Demand_Source_Type.Extend;
5743         p_atp_rec.Scenario_Id.Extend;
5744         p_atp_rec.Calling_Module.Extend;
5745         p_atp_rec.Customer_Id.Extend;
5746         p_atp_rec.Customer_Site_Id.Extend;
5747         p_atp_rec.Destination_Time_Zone.Extend;
5748         p_atp_rec.Quantity_Ordered.Extend;
5749         p_atp_rec.Quantity_UOM.Extend;
5750         p_atp_rec.Requested_Ship_Date.Extend;
5751         p_atp_rec.Requested_Arrival_Date.Extend;
5752         p_atp_rec.Earliest_Acceptable_Date.Extend;
5753         p_atp_rec.Latest_Acceptable_Date.Extend;
5754         p_atp_rec.Delivery_Lead_Time.Extend;
5755         p_atp_rec.Freight_Carrier.Extend;
5756         p_atp_rec.Ship_Method.Extend;
5757         p_atp_rec.Demand_Class.Extend;
5758         p_atp_rec.Ship_Set_Name.Extend;
5759         p_atp_rec.Arrival_Set_Name.Extend;
5760         p_atp_rec.Override_Flag.Extend;
5761         p_atp_rec.Action.Extend;
5762         p_atp_rec.Ship_Date.Extend;
5763         p_atp_rec.Available_Quantity.Extend;
5764         p_atp_rec.Requested_Date_Quantity.Extend;
5765         p_atp_rec.Group_Ship_Date.Extend;
5766         p_atp_rec.Group_Arrival_Date.Extend;
5767         p_atp_rec.Vendor_Id.Extend;
5768         p_atp_rec.Vendor_Name.Extend;
5769         p_atp_rec.Vendor_Site_Id.Extend;
5770         p_atp_rec.Vendor_Site_Name.Extend;
5771         p_atp_rec.Insert_Flag.Extend;
5772         p_atp_rec.OE_Flag.Extend;
5773         p_atp_rec.Error_Code.Extend;
5774         p_atp_rec.Atp_Lead_Time.Extend;
5775         p_atp_rec.Message.Extend;
5776         p_atp_rec.End_Pegging_Id.EXTEND;
5777         p_atp_rec.Order_Number.EXTEND;
5778         p_atp_rec.Old_Source_Organization_Id.EXTEND;
5779         p_atp_rec.Old_Demand_Class.EXTEND;
5780         EXCEPTION
5781         WHEN OTHERS THEN
5782             x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
5783             return;
5784     END EXTEND_ATP_REC;
5785 
5786     FUNCTION CREATE_RESERVATION(p_reservation_parts IN CSP_SCH_INT_PVT.RESERVATION_REC_TYP
5787                                 ,x_return_status     OUT NOCOPY VARCHAR2
5788                                 ,x_msg_data         OUT NOCOPY VARCHAR2)
5789     RETURN NUMBER
5790     IS
5791           CURSOR csp_transactions IS
5792           SELECT TRANSACTION_SOURCE_TYPE_ID,TRANSACTION_SOURCE_TYPE_NAME
5793           FROM   MTL_TXN_SOURCE_TYPES
5794           WHERE  transaction_source_type_id = 13;
5795           I NUMBER;
5796           l_api_version_number number :=1;
5797           l_init_msg_lst  varchar2(1) := fnd_api.g_true;
5798           x_msg_count number;
5799          -- x_msg_data  varchar2(128);
5800           l_rsv_rec  inv_reservation_global.mtl_reservation_rec_type;
5801           l_serial_number inv_reservation_global.serial_number_tbl_type;
5802           x_serial_number inv_reservation_global.serial_number_tbl_type;
5803           l_partial_reservation_flag varchar2(1):= fnd_api.g_false;
5804           l_force_reservation_flag varchar2(1) := fnd_api.g_true;
5805           l_validation_flag    varchar2(1) := fnd_api.g_true;
5806           l_source_type_id     NUMBER;
5807           l_source_name        varchar2(30);
5808           x_quantity_reserved  number;
5809           x_reservation_id number;
5810           l_avail_qty number;
5811           l_msg varchar2(2000);
5812           --x_return_status varchar(128);
5813      BEGIN
5814           log('create_reservation','In function Create_reservation');
5815           x_return_status  := FND_API.G_RET_STS_SUCCESS;
5816           OPEN csp_transactions;
5817             LOOP
5818                 FETCH csp_transactions INTO l_source_type_id, l_source_name;
5819                 EXIT WHEN csp_transactions%NOTFOUND;
5820             END LOOP;
5821           CLOSE csp_transactions;
5822                 IF l_source_type_id IS NULL THEN
5823                     raise NO_DATA_FOUND ;
5824                 END IF;
5825                 /* IF p_reservation_parts.sub_inventory_code IS NULL THEN
5826                   FND_MSG_PUB.INITIALIZE;
5827                   FND_MESSAGE.SET_NAME('CSP', 'CSP_RES_SUBINV_NULL');
5828                   FND_MSG_PUB.ADD;
5829                   fnd_msg_pub.count_and_get
5830                   ( p_count => x_msg_count
5831                     , p_data  => x_msg_data);
5832                   x_return_status := FND_API.G_RET_STS_ERROR;
5833                   RETURN 0;
5834               	 END IF; */
5835                 begin
5836                     select LOT INTO l_rsv_rec.lot_number
5837                     from MTL_ONHAND_LOT_V
5838                     where INVENTORY_ITEM_ID=p_reservation_parts.item_id
5839                     and SUBINVENTORY_CODE = p_reservation_parts.sub_inventory_code
5840                     and organization_id=p_reservation_parts.organization_id
5841                     and rownum=1;
5842                     EXCEPTION
5843                     WHEN NO_DATA_FOUND THEN
5844                       l_rsv_rec.lot_number:=null;
5845                 end;
5846                 l_rsv_rec.reservation_id   := NULL;
5847                 l_rsv_rec.requirement_date := p_reservation_parts.need_by_date  ;
5848                 l_rsv_rec.organization_id  := p_reservation_parts.organization_id  ;
5849                 l_rsv_rec.inventory_item_id := p_reservation_parts.item_id   ;
5850                 l_rsv_rec.demand_source_type_id  := l_source_type_id ;
5851                 l_rsv_rec.demand_source_name     := l_source_name ;
5852                 l_rsv_rec.demand_source_header_id   := NULL;
5853                 l_rsv_rec.demand_source_line_id     := p_reservation_parts.line_id;
5854                 l_rsv_rec.demand_source_delivery    := NULL;
5855                 l_rsv_rec.primary_uom_code          := p_reservation_parts.item_UOM_code ;
5856                 l_rsv_rec.primary_uom_id            := NULL;
5857                 l_rsv_rec.reservation_uom_code      := p_reservation_parts.item_UOM_code;
5858                 l_rsv_rec.reservation_uom_id        := NULL;
5859                 l_rsv_rec.reservation_quantity      := p_reservation_parts.quantity_needed;
5860                 l_rsv_rec.primary_reservation_quantity  := NUll;
5861                 l_rsv_rec.detailed_quantity         := null;
5862                 l_rsv_rec.autodetail_group_id       := NULL;
5863                 l_rsv_rec.external_source_code       := NULL;
5864                 l_rsv_rec.external_source_line_id     := NULL;
5865                 l_rsv_rec.supply_source_type_id        := 13; --inv_reservation_global.g_source_type_internal_req;
5866                 l_rsv_rec.supply_source_header_id      := NULL;
5867                 l_rsv_rec.supply_source_line_id        := NULL;
5868                 l_rsv_rec.supply_source_name           := NULL;
5869                 l_rsv_rec.supply_source_line_detail    := NULL;
5870                 l_rsv_rec.revision                     := p_reservation_parts.revision ;
5871                 l_rsv_rec.subinventory_code            := p_reservation_parts.sub_inventory_code ;
5872                 l_rsv_rec.subinventory_id              := NULL ;
5873                 l_rsv_rec.locator_id                   := NULL;
5874                 --l_rsv_rec.lot_number                   := NULL;
5875                 l_rsv_rec.lot_number_id                := NULL;
5876                 l_rsv_rec.pick_slip_number            := NULL;
5877                 l_rsv_rec.lpn_id                      := NULL;
5878                 l_rsv_rec.attribute_category       := NULL;
5879                 l_rsv_rec.attribute1               := NULL;
5880                 l_rsv_rec.attribute2               := NULL;
5881                 l_rsv_rec.attribute3               := NULL;
5882                 l_rsv_rec.attribute4               := NULL;
5883                 l_rsv_rec.attribute5               := NULL;
5884                 l_rsv_rec.attribute6               := NULL;
5885                 l_rsv_rec.attribute7               := NULL;
5886                 l_rsv_rec.attribute8               := NULL;
5887                 l_rsv_rec.attribute9               := NULL;
5888                 l_rsv_rec.attribute10              := NULL;
5889                 l_rsv_rec.attribute11              := NULL;
5890                 l_rsv_rec.attribute12              := NULL;
5891                 l_rsv_rec.attribute13              := NULL;
5892                 l_rsv_rec.attribute14              := NULL;
5893                 l_rsv_rec.attribute15              := NULL;
5894                 l_rsv_rec.ship_ready_flag          := NULL;
5895                 /*INV_RESERVATION_PUB.create_reservation(l_api_version_number
5896                                                  , l_init_msg_lst
5897                                                  , x_return_status
5898                                                  , x_msg_count
5899                                                  , x_msg_data
5900                                                  , l_rsv_rec
5901                                                  , l_serial_number
5902                                                  , x_serial_number
5903                                                  , l_partial_reservation_flag
5904                                                  , l_force_reservation_flag
5905                                                  , l_validation_flag
5906                                                  , x_quantity_reserved
5907                                                  , x_reservation_id);*/
5908                 l_avail_qty := csp_validate_pub.get_avail_qty(l_rsv_rec.organization_id,
5909                                                l_rsv_rec.subinventory_code,
5910                                                l_rsv_rec.locator_id,
5911                                                l_rsv_rec.inventory_item_id,
5912                                                l_rsv_rec.revision,
5913                                                l_rsv_rec.lot_number);
5914                 log('create_reservation','Avail Quatity: '||l_avail_qty);
5915                 IF l_avail_qty >= l_rsv_rec.reservation_quantity THEN
5916                INV_RESERVATION_PUB.create_reservation(p_api_version_number => l_api_version_number
5917                                                  , p_init_msg_lst => l_init_msg_lst
5918                                                  , x_return_status => x_return_status
5919                                                  , x_msg_count => x_msg_count
5920                                                  , x_msg_data => x_msg_data
5921                                                  , p_rsv_rec => l_rsv_rec
5922                                                  , p_serial_number => l_serial_number
5923                                                  , x_serial_number => x_serial_number
5924                                                  , p_partial_reservation_flag => l_partial_reservation_flag
5925                                                  , p_force_reservation_flag => l_force_reservation_flag
5926                                                  , p_validation_flag => l_validation_flag
5927                                                  , x_quantity_reserved => x_quantity_reserved
5928                                                  , x_reservation_id => x_reservation_id
5929                                                  );
5930            IF x_return_status <> FND_API.G_RET_STS_SUCCESS and x_reservation_id <= 0  THEN
5931                 return 0;
5932            ELSE
5933                 log('create_reservation','Created reservation ID:'||x_reservation_id);
5934                 return x_reservation_id;
5935            END IF;
5936            ELSE
5937                 FND_MSG_PUB.INITIALIZE;
5938                 FND_MESSAGE.SET_NAME('CSP', 'CSP_INSUFFICIENT_QTY');
5939                 FND_MSG_PUB.ADD;
5940                 fnd_msg_pub.count_and_get
5941                   ( p_count => x_msg_count
5942                   , p_data  => x_msg_data);
5943                 x_return_status := FND_API.G_RET_STS_ERROR;
5944                 return 0;
5945            END IF;
5946            EXCEPTION
5947         WHEN NO_DATA_FOUND THEN
5948             FND_MESSAGE.SET_NAME('CSP', 'CSP_SCH_TRANSACTION');
5949             FND_MSG_PUB.ADD;
5950             fnd_msg_pub.count_and_get
5951               ( p_count => x_msg_count
5952               , p_data  => x_msg_data);
5953             x_return_status := FND_API.G_RET_STS_ERROR;
5954             return 0;
5955         WHEN OTHERS THEN
5956             x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
5957             return 0;
5958      END CREATE_RESERVATION;
5959      PROCEDURE TRANSFER_RESERVATION(p_reservation_id  IN  NUMBER
5960                                    ,p_order_header_id IN  NUMBER
5961                                    ,p_order_line_id   IN  NUMBER
5962                                    ,x_return_status   OUT NOCOPY VARCHAR2
5963                                    ,x_reservation_id   OUT NOCOPY NUMBER
5964                                    ,x_msg_data        OUT NOCOPY VARCHAR2
5965                                    ,x_msg_count       OUT NOCOPY NUMBER) IS
5966 
5967           I NUMBER;
5968           l_api_version_number number :=1;
5969           l_init_msg_lst  varchar2(1) := fnd_api.g_true;
5970          -- x_msg_data  varchar2(128);
5971           l_old_rsv_rec  inv_reservation_global.mtl_reservation_rec_type;
5972           l_new_rsv_rec  inv_reservation_global.mtl_reservation_rec_type;
5973           l_old_serial_number inv_reservation_global.serial_number_tbl_type;
5974           l_new_serial_number inv_reservation_global.serial_number_tbl_type;
5975           l_partial_reservation_flag varchar2(1):= fnd_api.g_false;
5976           l_is_transfer_supply varchar2(1) := fnd_api.g_true;
5977           l_validation_flag    varchar2(1) := fnd_api.g_true;
5978           l_source_type_id     NUMBER;
5979           l_source_name        varchar2(30);
5980           x_quantity_reserved  number;
5981           l_msg varchar2(2000);
5982           --x_return_status varchar(128);
5983      BEGIN
5984           x_return_status  := FND_API.G_RET_STS_SUCCESS;
5985 
5986                 l_old_rsv_rec.reservation_id   := p_reservation_id;
5987 
5988                 l_new_rsv_rec.reservation_id   := NULL;
5989                 l_new_rsv_rec.demand_source_type_id  := 8 ;
5990                 l_new_rsv_rec.demand_source_name     := 'g_source_type_internal_ord' ;
5991                 l_new_rsv_rec.demand_source_header_id   := p_order_header_id;
5992                 l_new_rsv_rec.demand_source_line_id     := p_order_line_id ;
5993                 INV_RESERVATION_PUB. transfer_reservation(
5994                                         p_api_version_number  =>  l_api_version_number
5995                                       , p_init_msg_lst        =>  l_init_msg_lst
5996                                       , x_return_status       =>  x_return_status
5997                                       , x_msg_count           =>  x_msg_count
5998                                       , x_msg_data            =>  x_msg_data
5999                                       , p_is_transfer_supply  =>  l_is_transfer_supply
6000                                       , p_original_rsv_rec    => l_old_rsv_rec
6001                                       , p_to_rsv_rec          => l_new_rsv_rec
6002                                       , p_original_serial_number => l_old_serial_number
6003                                       , p_to_serial_number       => l_new_serial_number
6004                                       , p_validation_flag        => l_validation_flag
6005                                       , x_to_reservation_id      => x_reservation_id
6006                                       );
6007            IF x_return_status <> FND_API.G_RET_STS_SUCCESS THEN
6008                  X_return_status := FND_API.G_RET_STS_ERROR;
6009                 return;
6010            END IF;
6011            EXCEPTION
6012         WHEN NO_DATA_FOUND THEN
6013             X_return_status := FND_API.G_RET_STS_ERROR;
6014             return;
6015         WHEN OTHERS THEN
6016             x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
6017             return;
6018      END TRANSFER_RESERVATION;
6019      PROCEDURE GET_SHIPPING_METHODE(p_from_org_id     IN   NUMBER,
6020                                    p_to_org_id        IN   NUMBER,
6021                                    p_need_by_date     IN   DATE,
6022                                    p_timezone_id     IN   NUMBER,
6023                                    x_shipping_methode OUT NOCOPY  VARCHAR2,
6024                                    x_intransit_time   OUT NOCOPY  NUMBER,
6025                                    x_return_status    OUT NOCOPY  VARCHAR2
6026                                    ,x_msg_data        OUT NOCOPY  VARCHAR2
6027                                    ,x_msg_count       OUT NOCOPY  NUMBER) IS
6028      CURSOR C3(from_org varchar2,to_org varchar2) IS
6029         SELECT NVL(ISM.COST_PER_UNIT_LOAD_WEIGHT,0),
6030                CDT.RELATION_SHIP_ID,CDT.CUTOFF_TIME,CDT.TIMEZONE_ID,ISM.SHIP_METHOD
6031         FROM   MTL_INTERORG_SHIP_METHODS ISM,CSP_CARRIER_DELIVERY_TIMES CDT
6032         WHERE  ISM.FROM_ORGANIZATION_ID = from_org
6033         AND    ISM.TO_ORGANIZATION_ID =  to_org
6034         AND    CDT.ORGANIZATION_ID = from_org
6035         AND    CDT.SHIPPING_METHOD = ISM.SHIP_METHOD;
6036         I NUMBER :=0;
6037         l_relation_ship_id NUMBER;
6038         l_cost             NUMBER;
6039         x_delivery_date    DATE;
6040         x_shipping_option  BOOLEAN := true;
6041         l_cutoff_time      DATE;
6042         l_timezone_id      NUMBER;
6043         l_shipto_timezone_id NUMBER;
6044         l_server_time_zone_id NUMBER;
6045         l_cutoff_hours       NUMBER;
6046         l_sys_hours          NUMBER;
6047         l_server_delivery_date DATE;
6048         l_server_cutoff_time DATE;
6049         l_return_status Varchar2(3);
6050         l_msg_count NUMBER;
6051         l_msg_data  varchar2(1000);
6052         l_min_leadtime NUMBER := 100000000;
6053         l_shipping_methode varchar2(30);
6054         l_api_name varchar2(60) := 'CSP_SCH_INT_PVT.GET_SHIPPING_METHODE' ;
6055      BEGIN
6056             x_return_status := FND_API.G_RET_STS_SUCCESS ;
6057             l_server_time_zone_id   := FND_PROFILE.VALUE(NAME => 'SERVER_TIMEZONE_ID');
6058             OPEN C3(p_from_org_id,p_to_org_id);
6059             LOOP
6060                 FETCH C3 INTO l_cost,l_relation_ship_id ,l_cutoff_time,l_timezone_id,l_shipping_methode ;
6061                 EXIT WHEN C3%NOTFOUND;
6062                 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);
6063                     IF p_timezone_id <> l_server_time_zone_id THEN
6064                             HZ_TIMEZONE_PUB.Get_Time(   p_api_version  => 1.0,
6065                                     p_init_msg_list  => FND_API.G_FALSE,
6066                                     p_source_tz_id   => p_timezone_id,
6067                                     p_dest_tz_id     => l_server_time_zone_id,
6068                                     p_source_day_time  => x_delivery_date,
6069                                     x_dest_day_time    => l_server_delivery_date,
6070                                     x_return_status    => l_return_status ,
6071                                     x_msg_count        => l_msg_count ,
6072                                     x_msg_data         => l_msg_data);
6073                         ELSE
6074                             l_server_delivery_date := x_delivery_date;
6075                         END IF;
6076                         IF l_cutoff_time is not null then
6077                             HZ_TIMEZONE_PUB.Get_Time(   p_api_version  => 1.0,
6078                                     p_init_msg_list  => FND_API.G_FALSE,
6079                                     p_source_tz_id   => l_timezone_id,
6080                                     p_dest_tz_id     => l_server_time_zone_id,
6081                                     p_source_day_time  => l_cutoff_time,
6082                                     x_dest_day_time    => l_server_cutoff_time,
6083                                     x_return_status    => l_return_status ,
6084                                     x_msg_count        => l_msg_count ,
6085                                     x_msg_data         => l_msg_data);
6086                                     l_cutoff_hours := to_number(to_char(l_server_cutoff_time,'HH24')) + (to_number(to_char(l_server_cutoff_time,'MI')) * 1/60);
6087                                     l_sys_hours    := to_number(to_char(sysdate,'HH24')) + (to_number(to_char(sysdate,'MI')) * 1/60);
6088                             IF l_cutoff_hours < l_sys_hours THEN
6089                                 l_server_delivery_date := l_server_delivery_date + 1;
6090                             END IF;
6091                         END IF;
6092                     IF p_need_by_date IS NOT NULL AND  l_server_delivery_date > p_need_by_date THEN
6093                             x_shipping_option := FALSE;
6094                     END IF;
6095                     IF x_shipping_option THEN
6096                         IF l_min_leadtime > ( (l_server_delivery_date -  sysdate) * 24 )THEN
6097                             l_min_leadtime := ( (l_server_delivery_date -  sysdate) * 24 );
6098                             x_shipping_methode := l_shipping_methode ;
6099                             x_intransit_time  :=  l_min_leadtime / 24 ;
6100                         END IF;
6101                     END IF;
6102               END LOOP;
6103             EXCEPTION
6104             WHEN OTHERS THEN
6105              FND_MESSAGE.SET_NAME('CSP', 'CSP_UNEXPECTED_EXEC_ERRORS');
6106             FND_MESSAGE.SET_TOKEN('ROUTINE', l_api_name, FALSE);
6107             FND_MESSAGE.SET_TOKEN('SQLERRM', sqlerrm, FALSE);
6108             FND_MSG_PUB.ADD;
6109             fnd_msg_pub.count_and_get
6110               ( p_count => x_msg_count
6111               , p_data  => x_msg_data);
6112             x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
6113             return;
6114      END GET_SHIPPING_METHODE;
6115 
6116 PROCEDURE CHECK_PARTS_AVAILABILITY(
6117     p_resource        IN CSP_SCH_INT_PVT.csp_sch_resources_rec_typ ,
6118     p_organization_id IN NUMBER ,
6119     p_subinv_code     IN VARCHAR2 ,
6120     p_need_by_date    IN DATE ,
6121     p_parts_list      IN CSP_SCH_INT_PVT.CSP_PARTS_TBL_TYP1 ,
6122     p_timezone_id     IN NUMBER ,
6123     x_availability OUT NOCOPY CSP_SCH_INT_PVT.AVAILABLE_PARTS_TBL_TYP1 ,
6124     x_return_status OUT NOCOPY VARCHAR2 ,
6125     X_MSG_DATA OUT NOCOPY      VARCHAR2 ,
6126     x_msg_count OUT NOCOPY     NUMBER ,
6127     p_called_from IN VARCHAR2 ,
6128     p_location_id IN NUMBER DEFAULT NULL,
6129     p_include_alternates IN BOOLEAN DEFAULT NULL)
6130 IS
6131 TYPE alternate_item_rec_type
6132 IS
6133   RECORD
6134   (
6135     item                    NUMBER ,
6136     revision                VARCHAR2(3) ,
6137     item_uom                VARCHAR2(10) ,
6138     item_quantity           NUMBER ,
6139     alternate_item          NUMBER ,
6140     alternate_item_uom      VARCHAR2(10) ,
6141     alternate_item_quantity NUMBER ,
6142     relation_type           NUMBER);
6143 TYPE alternate_items_table_type
6144 IS
6145   TABLE OF alternate_item_rec_type;
6146 
6147   CURSOR C1(c_resource_type VARCHAR2, c_resource_id NUMBER)
6148   IS
6149     /*SELECT TIMEZONE_ID
6150     FROM   CSP_RS_SHIP_TO_ADDRESSES_V
6151     WHERE  PRIMARY_FLAG ='Y'
6152     AND resource_id  = c_resource_id
6153     AND resource_type = c_resource_type;*/
6154     SELECT hzl.time_zone TIMEZONE_ID
6155     FROM csp_rs_cust_relations rcr,
6156       hz_cust_acct_sites cas,
6157       hz_cust_site_uses csu,
6158       hz_party_sites ps,
6159       hz_locations hzl
6160     WHERE rcr.customer_id     = cas.cust_account_id
6161     AND cas.cust_acct_site_id = csu.cust_acct_site_id (+)
6162     AND csu.site_use_code     = 'SHIP_TO'
6163     AND cas.party_site_id     = ps.party_site_id
6164     AND ps.location_id        = hzl.location_id
6165     AND csu.primary_flag      = 'Y'
6166     AND rcr.resource_type     =c_resource_type
6167     AND rcr.resource_id       = c_resource_id;
6168 
6169   CURSOR check_buy_from(c_item_id NUMBER,c_assignment_id NUMBER, c_organization_id NUMBER)
6170   IS
6171     /* SELECT vendor_id, vendor_site_id
6172     FROM  mrp_sources_v
6173     where assignment_set_id = c_assignment_id
6174     and   inventory_item_id = c_item_id
6175     and   organization_id  = c_organization_id
6176     and   source_type = 3;*/
6177     SELECT vendor_id,
6178       vendor_site_id
6179     FROM MRP_ITEM_SOURCING_LEVELS_V misl
6180     WHERE misl.organization_id = c_organization_id
6181     AND misl.assignment_set_id =c_assignment_id
6182     AND inventory_item_id      = c_item_id
6183     AND SOURCE_TYPE            = 3
6184     AND sourcing_level         =
6185       (SELECT MIN(sourcing_level)
6186       FROM MRP_ITEM_SOURCING_LEVELS_V
6187       WHERE organization_id   = c_organization_id
6188       AND assignment_set_id   = c_assignment_id
6189       AND inventory_item_id   = c_item_id
6190       AND sourcing_level NOT IN (2,9)
6191       );
6192 
6193   CURSOR primary_uom_code(item_id NUMBER,org_id NUMBER)
6194   IS
6195     SELECT PRIMARY_UOM_CODE
6196     FROM MTL_SYSTEM_ITEMS_B
6197     WHERE INVENTORY_ITEM_ID = item_id
6198     AND organization_id     = org_id;
6199   CURSOR substitutes(item_id NUMBER,org_id NUMBER)
6200   IS
6201     /* SELECT mri.RELATED_ITEM_ID
6202     FROM   MTL_RELATED_ITEMS_VIEW mri, mtl_parameters mp
6203     WHERE  mp.organization_id = org_id
6204     AND    mri.INVENTORY_ITEM_ID = item_id
6205     AND    mri.RELATIONSHIP_TYPE_ID = 2
6206     AND    mri.ORGANIZATION_ID  = MP.MASTER_ORGANIZATION_ID;*/
6207     SELECT mri.RELATED_ITEM_ID
6208     FROM MTL_RELATED_ITEMS mri,
6209       mtl_parameters mp
6210     WHERE mp.organization_id     = org_id
6211     AND mri.INVENTORY_ITEM_ID    = item_id
6212     AND mri.RELATIONSHIP_TYPE_ID = 2
6213     AND mri.ORGANIZATION_ID      = MP.MASTER_ORGANIZATION_ID;
6214 
6215   l_interval CSP_SCH_INT_PVT.csp_sch_interval_rec_typ;
6216   l_resources CSP_SCH_INT_PVT.csp_sch_resource_tbl_typ;
6217   l_resource_org_subinv CSP_SCH_INT_PVT.CSP_RESOURCE_ORG_tbl_TYP;
6218   l_unavailable_list CSP_SCH_INT_PVT.CSP_UNAVAILABILITY_TBL_TYPE ;
6219   l_available_list CSP_SCH_INT_PVT.CSP_AVAILABILITY_TBL_TYPE ;
6220   /* l_subinv_unavailable_list        CSP_SCH_INT_PVT.CSP_UNAVAILABILITY_TBL_TYPE ;
6221   l_subinv_available_list          CSP_SCH_INT_PVT.CSP_AVAILABILITY_TBL_TYPE ;*/
6222   l_eligible_resources_list CSP_SCH_INT_PVT.CSP_AVAILABILITY_TBL_TYPE ;
6223   l_final_unavailable_list CSP_SCH_INT_PVT.CSP_UNAVAILABILITY_TBL_TYPE ;
6224   l_parts_list CSP_SCH_INT_PVT.CSP_PARTS_TBL_TYPE;
6225   l_options CSP_SCH_INT_PVT.CSP_SHIP_PARAMETERS_TBL_TYPE;
6226   l_ship_count CSP_SCH_INT_PVT.CSP_SHIP_METHOD_COUNT_TBL_TYP;
6227   l_res_ship_parameters CSP_SCH_INT_PVT.CSP_ORGS_SHIP_PARAM_TBL_TYPE;
6228   l_temp_options CSP_SCH_INT_PVT.CSP_SHIP_PARAMETERS_TBL_TYPE ;
6229   l_final_option CSP_SCH_INT_PVT.CSP_SHIP_PARAMETERS_TBL_TYPE ;
6230   l_org_ship_methode org_ship_methodes_tbl_type ;
6231   l_supersede_items CSP_SUPERSESSIONS_PVT.NUMBER_ARR;
6232   min_cost           NUMBER ;
6233   rec_pointer        NUMBER;
6234   l_intransit_time   NUMBER;
6235   l_timezone_id      NUMBER;
6236   l_return_status    VARCHAR2(128);
6237   l_shipping_methode VARCHAR2(30);
6238   record_present     BOOLEAN;
6239   l_temp_org_id      NUMBER;
6240   loop_count         NUMBER := 1;
6241   l_need_by_date DATE;
6242   previous_position NUMBER;
6243   str_length        NUMBER;
6244   current_position  NUMBER;
6245   l_api_name        VARCHAR2(60) := 'CSP_SCH_INT_PVT.CHECK_PARTS_AVAILABILITY';
6246   g_arrival_date DATE;
6247   l_ship_methode_count NUMBER;
6248   l_assignment_set_id  NUMBER;
6249   l_vendor_id          NUMBER;
6250   l_vendor_site_id     NUMBER;
6251   do_purchase          BOOLEAN;
6252   l_uom_code           VARCHAR2(3);
6253   l_temp_quantity      NUMBER;
6254   l_substitute_item    NUMBER;
6255   l_alternate_items_list alternate_items_table_type;
6256   l_alternate_parts CSP_SUPERSESSIONS_PVT.NUMBER_ARR;
6257   l_final_available_list CSP_SCH_INT_PVT.CSP_AVAILABILITY_TBL_TYPE ;
6258   l_atp_success      BOOLEAN;
6259   check_subinventory BOOLEAN;
6260   l_att              NUMBER;
6261   l_onhand           NUMBER;
6262   x_final_availability CSP_SCH_INT_PVT.AVAILABLE_PARTS_TBL_TYP1;
6263   l_temp_subinv_code         VARCHAR2(30);
6264   try_buy_from               BOOLEAN;
6265   l_temp_line_id             NUMBER;
6266   quantity_fullfilled        BOOLEAN := FALSE ;
6267   l_required_quantity        NUMBER;
6268   l_no_of_options            NUMBER;
6269   l_dest_org_id              NUMBER;
6270   l_atleast_one_rec_per_line BOOLEAN;
6271   l_temp_avail_list CSP_SCH_INT_PVT.CSP_AVAILABILITY_TBL_TYPE ;
6272   min_arrival_date DATE;
6273   l_no_of_days NUMBER;--heh
6274   l_reservation_parts CSP_SCH_INT_PVT.RESERVATION_REC_TYP;
6275   l_reservation_id NUMBER;
6276   l_res_ids CSP_SUPERSESSIONS_PVT.NUMBER_ARR;
6277   l_primary_uom_code          VARCHAR2(10);
6278   l_replenisment_org_id       NUMBER;
6279   l_replenisment_subinventory VARCHAR2(100);
6280   l_check_alternates          BOOLEAN := FALSE;
6281 BEGIN
6282   log('check_parts_availability', 'BEGIN');
6283   g_schedular_call := 'N';
6284   fnd_msg_pub.initialize;
6285   IF p_timezone_id IS NOT NULL THEN
6286     g_shipto_timezone_id := p_timezone_id;
6287   END IF;
6288   l_resources               := CSP_SCH_INT_PVT.csp_sch_resource_tbl_typ();
6289   l_resource_org_subinv     := CSP_SCH_INT_PVT.CSP_RESOURCE_ORG_tbl_TYP();
6290   l_unavailable_list        := CSP_SCH_INT_PVT.CSP_UNAVAILABILITY_TBL_TYPE();
6291   l_available_list          := CSP_SCH_INT_PVT.CSP_AVAILABILITY_TBL_TYPE ();
6292   l_eligible_resources_list := CSP_SCH_INT_PVT.CSP_AVAILABILITY_TBL_TYPE() ;
6293   l_final_unavailable_list  := CSP_SCH_INT_PVT.CSP_UNAVAILABILITY_TBL_TYPE();
6294   l_parts_list              := CSP_SCH_INT_PVT.CSP_PARTS_TBL_TYPE();
6295   l_ship_count              := CSP_SCH_INT_PVT.CSP_SHIP_METHOD_COUNT_TBL_TYP();
6296   l_res_ship_parameters     := CSP_SCH_INT_PVT.CSP_ORGS_SHIP_PARAM_TBL_TYPE();
6297   l_final_option            := CSP_SCH_INT_PVT.CSP_SHIP_PARAMETERS_TBL_TYPE() ;
6298   l_org_ship_methode        := org_ship_methodes_tbl_type() ;
6299   /* l_subinv_unavailable_list := CSP_SCH_INT_PVT.CSP_UNAVAILABILITY_TBL_TYPE() ;
6300   l_subinv_available_list   := CSP_SCH_INT_PVT.CSP_AVAILABILITY_TBL_TYPE();*/
6301   -- x_availability            := CSP_SCH_INT_PVT.AVAILABLE_PARTS_TBL_TYP1();
6302   l_interval.latest_time := p_need_by_date;
6303   x_return_status        := FND_API.G_RET_STS_SUCCESS;
6304   l_alternate_items_list := alternate_items_table_type();
6305   l_final_available_list := CSP_SCH_INT_PVT.CSP_AVAILABILITY_TBL_TYPE() ;
6306   l_temp_avail_list      := CSP_SCH_INT_PVT.CSP_AVAILABILITY_TBL_TYPE() ;
6307   l_timezone_id          := p_timezone_id ;
6308   log('check_parts_availability', 'p_organization_id: '||p_organization_id);
6309   log('check_parts_availability', 'p_resource.resource_id: '||p_resource.resource_id);
6310   IF p_organization_id IS NOT NULL THEN
6311     log('check_parts_availability', '1');
6312     l_temp_org_id      := p_organization_id;
6313     l_timezone_id      := p_timezone_id ;
6314     l_temp_subinv_code := p_subinv_code;
6315     l_resources.extend;
6316     l_resources(1).resource_id   := p_resource.resource_id;
6317     l_resources(1).resource_type := p_resource.resource_type;
6318     IF p_resource.resource_id IS NULL THEN
6319       log('check_parts_availability', '2');
6320       l_resources(1).resource_id   := '999999999999999';
6321       l_resources(1).resource_type := 'DUMMY';
6322     END IF;
6323   ELSE
6324     log('check_parts_availability', '3');
6325     IF p_resource.resource_id IS NOT NULL THEN
6326       log('check_parts_availability', '4');
6327       OPEN C1(p_resource.resource_type,p_resource.resource_id);
6328       LOOP
6329         FETCH C1 INTO l_timezone_id;
6330         EXIT
6331       WHEN C1%NOTFOUND;
6332       END LOOP;
6333       CLOSE C1;
6334       l_resources.extend;
6335       l_resources(1).resource_id   := p_resource.resource_id;
6336       l_resources(1).resource_type := p_resource.resource_type;
6337       CSP_SCH_INT_PVT.GET_ORGANIZATION_SUBINV(l_resources, l_resource_org_subinv , l_return_status,x_msg_data,x_msg_count);
6338       l_temp_org_id      := l_resource_org_subinv(1).organization_id;
6339       l_temp_subinv_code := l_resource_org_subinv(1).sub_inv_code;
6340     ELSE
6341       log('check_parts_availability', '5');
6342       l_resources.extend;
6343       l_temp_org_id                            := p_organization_id;
6344       l_temp_subinv_code                       := p_subinv_code;
6345       l_resources(1).resource_type             := 'DUMMY' ;
6346       l_resources(1).resource_id               := '999999999999999' ;
6347       l_temp_subinv_code                       := p_subinv_code;
6348       l_resource_org_subinv(1).resource_type   := 'DUMMY' ;
6349       l_resource_org_subinv(1).resource_id     := '999999999999999' ;
6350       l_resource_org_subinv(1).organization_id := p_organization_id;
6351       l_resource_org_subinv(1).sub_inv_code    := p_subinv_code;
6352     END IF;
6353   END IF;
6354   log('check_parts_availability', '6');
6355   IF p_organization_id IS NOT NULL THEN
6356     l_dest_org_id      := p_organization_id;
6357   ELSE
6358     l_dest_org_id := l_temp_org_id;
6359   END IF;
6360   log('check_parts_availability', 'p_parts_list.count: '||p_parts_list.count);
6361   IF p_parts_list.count > 1 THEN
6362     log('check_parts_availability', 'l_temp_org_id: '||l_temp_org_id);
6363     csp_supersessions_pvt.check_for_duplicate_parts(p_parts_list,l_temp_org_id,x_return_status,x_msg_data,x_msg_count);
6364   END IF;
6365   IF x_return_status <> FND_API.G_RET_STS_SUCCESS THEN
6366     RETURN;
6367   END IF;
6368   log('check_parts_availability', 'begin p_parts_list loop');
6369   FOR I IN 1..p_parts_list.count
6370   LOOP
6371     log('check_parts_availability', 'p_parts_list('||I||').item_id: '||p_parts_list(I).item_id);
6372     log('check_parts_availability', 'p_parts_list('||I||').item_uom: '||p_parts_list(I).item_uom);
6373     log('check_parts_availability', 'p_parts_list('||I||').quantity: '||p_parts_list(I).quantity);
6374     log('check_parts_availability', 'p_parts_list('||i||').line_id: '||p_parts_list(i).line_id);
6375     log('check_parts_availability', 'p_parts_list('||I||').revision: '||p_parts_list(I).revision);
6376     l_unavailable_list.extend;
6377     l_unavailable_list(l_unavailable_list.count).resource_type   := l_resources(1).resource_type;
6378     l_unavailable_list(l_unavailable_list.count).resource_id     := l_resources(1).resource_id;
6379     l_unavailable_list(l_unavailable_list.count).organization_id := l_dest_org_id;
6380     l_unavailable_list(l_unavailable_list.count).item_id         := p_parts_list(I).item_id;
6381     l_primary_uom_code                                           := p_parts_list(I).item_uom;
6382     OPEN primary_uom_code(p_parts_list(I).item_id ,l_dest_org_id);
6383     FETCH primary_uom_code INTO l_primary_uom_code;
6384     CLOSE primary_uom_code;
6385     IF l_primary_uom_code                                   <> p_parts_list(I).item_uom THEN
6386       l_unavailable_list(l_unavailable_list.count).quantity :=
6387             inv_convert.inv_um_convert(  item_id => p_parts_list(I).item_id
6388                                        , PRECISION => NULL -- use default precision
6389                                        , from_quantity => p_parts_list(I).quantity
6390                                        , from_unit => p_parts_list(I).item_uom
6391                                        , to_unit => l_primary_uom_code
6392                                        , from_name => NULL    -- from uom name
6393                                        , to_name => NULL      -- to uom name
6394                                       );
6395       l_unavailable_list(l_unavailable_list.count).item_uom := l_primary_uom_code ;
6396     ELSE
6397       l_unavailable_list(l_unavailable_list.count).quantity := p_parts_list(I).quantity;
6398       l_unavailable_list(l_unavailable_list.count).item_uom := p_parts_list(I).item_uom;
6399     END IF;
6400     l_unavailable_list(l_unavailable_list.count).ship_set_name := p_parts_list(I).ship_set_name;
6401     l_unavailable_list(l_unavailable_list.count).line_id       := p_parts_list(I).line_id;
6402     l_unavailable_list(l_unavailable_list.count).revision      := p_parts_list(I).revision;
6403     /*  END LOOP;
6404     FOR I IN 1..p_parts_list.count LOOP*/
6405     log('check_parts_availability', 'p_called_from: '||p_called_from);
6406     IF p_called_from <> 'MOBILE' THEN
6407       l_att          := 0;
6408       log('check_parts_availability', 'l_temp_subinv_code: '||l_temp_subinv_code);
6409       IF l_temp_subinv_code IS NOT NULL THEN
6410         log('check_parts_availability', 'calling check_local_inventory');
6411         check_local_inventory(
6412                 p_org_id => l_temp_org_id,
6413                 p_subinv_code => l_temp_subinv_code,
6414                 p_item_id => p_parts_list(i).item_id,
6415                 p_revision => p_parts_list(i).revision,
6416                 x_att => l_att,
6417                 x_onhand => l_onhand,
6418                 x_return_status => x_return_status,
6419                 x_msg_data => x_msg_data,
6420                 x_msg_count => x_return_status);
6421         log('check_parts_availability', 'x_return_status: '||x_return_status);
6422         log('check_parts_availability', 'x_msg_data: '||x_msg_data);
6423         log('check_parts_availability', 'x_msg_count: '||x_msg_count);
6424         log('check_parts_availability', 'after check_local_inventory');
6425         log('check_parts_availability', 'l_att: '||l_att);
6426         IF l_att > 0 THEN
6427           l_final_available_list.extend;
6428           l_final_available_list(l_final_available_list.count).resource_id        := l_resources(1).resource_id;
6429           l_final_available_list(l_final_available_list.count).resource_type      := l_resources(1).resource_type;
6430           l_final_available_list(l_final_available_list.count).organization_id    := l_temp_org_id;
6431           l_final_available_list(l_final_available_list.count).item_id            := p_parts_list(I).item_id ;
6432           l_final_available_list(l_final_available_list.count).item_uom           := l_unavailable_list(l_unavailable_list.count).item_uom ;
6433           l_final_available_list(l_final_available_list.count).revision           := p_parts_list(I).revision ;
6434           l_final_available_list(l_final_available_list.count).available_quantity := l_att ;
6435           l_final_available_list(l_final_available_list.count).source_org         := l_temp_org_id;
6436           l_final_available_list(l_final_available_list.count).sub_inventory      := l_temp_subinv_code;
6437           l_final_available_list(l_final_available_list.count).AVAILABLE_DATE     := SYSDATE;
6438           l_final_available_list(l_final_available_list.count).line_id            := p_parts_list(I).line_id;
6439           l_reservation_id                                                        := NULL;
6440           l_reservation_parts.need_by_date                                        := sysdate;
6441           l_reservation_parts.organization_id                                     := l_final_available_list(l_final_available_list.count).source_org ;
6442           l_reservation_parts.item_id                                             := l_final_available_list(l_final_available_list.count).item_id;
6443           l_reservation_parts.item_uom_code                                       := l_final_available_list(l_final_available_list.count).item_uom ;
6444           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);
6445           l_reservation_parts.sub_inventory_code                                  := l_final_available_list(l_final_available_list.count).sub_inventory;
6446           l_reservation_parts.line_id                                             := l_final_available_list(l_final_available_list.count).line_id ;
6447           l_reservation_parts.revision                                            := l_final_available_list(l_final_available_list.count).revision;
6448           l_reservation_id                                                        := csp_sch_int_pvt.create_reservation(l_reservation_parts,x_return_status,x_msg_data);
6449           log('check_parts_availability', 'l_reservation_id: '||l_reservation_id);
6450           IF l_reservation_id <= 0 THEN
6451             x_return_status   := FND_API.G_RET_STS_ERROR;
6452             FND_MESSAGE.SET_NAME('CSP', 'CSP_SCH_COULD_NOT_RESERVE');
6453             FND_MSG_PUB.ADD;
6454             fnd_msg_pub.count_and_get ( p_count => x_msg_count , p_data => x_msg_data);
6455           ELSE
6456             log('check_parts_availability', 'l_res_ids.count: ||l_res_ids.count');
6457             l_res_ids(l_res_ids.count+1) := l_reservation_id ;
6458             log('check_parts_availability', 'l_res_ids.count: '||l_res_ids.count);
6459           END IF;
6460         END IF;
6461       END IF;
6462     END IF;
6463   END LOOP;
6464   log('check_parts_availability', 'begin p_parts_list loop again. count: '||p_parts_list.count);
6465   FOR I IN 1..p_parts_list.count
6466   LOOP
6467     log('check_parts_availability', 'profile CSP_INCL_ALTERNATES value: '||fnd_profile.value(name => 'CSP_INCL_ALTERNATES'));
6468     if p_include_alternates is not null then
6469       l_check_alternates := p_include_alternates;
6470     else
6471       l_check_alternates := fnd_profile.value(name => 'CSP_INCL_ALTERNATES')= 'ALWAYS' OR fnd_profile.value(name => 'CSP_INCL_ALTERNATES')= 'PRONLY';
6472     end if;
6473     IF l_check_alternates THEN
6474       CSP_SUPERSESSIONS_PVT.get_supersede_bilateral_items(p_inventory_item_id => p_parts_list(I).item_id ,p_organization_id => l_temp_org_id ,x_supersede_items => l_supersede_items);
6475       log('check_parts_availability', 'begin l_supersede_items loop. l_supersede_items count: '||l_supersede_items.count);
6476       FOR J IN 1..l_supersede_items.count
6477       loop
6478         log('check_parts_availability', 'supersede items loop begin: '||J);
6479         log('check_parts_availability', 'l_supersede_items('||J||'): '||l_supersede_items(J));
6480         l_uom_code := NULL;
6481         OPEN primary_uom_code(l_supersede_items(J),p_organization_id);
6482         LOOP
6483           FETCH primary_uom_code INTO l_uom_code;
6484           EXIT
6485         WHEN primary_uom_code% NOTFOUND;
6486         END LOOP;
6487         CLOSE primary_uom_code;
6488         log('check_parts_availability', 'l_uom_code: '||l_uom_code);
6489         l_temp_quantity := inv_convert.inv_um_convert(  item_id => l_supersede_items(J)
6490                                                       , PRECISION => NULL   -- use default precision
6491                                                       , from_quantity => p_parts_list(I).quantity
6492                                                       , from_unit => p_parts_list(I).item_uom
6493                                                       , to_unit => l_uom_code
6494                                                       , from_name => NULL -- from uom name
6495                                                       , to_name => NULL   -- to uom name
6496                                                       );
6497         log('check_parts_availability', 'l_temp_quantity: '||l_temp_quantity);
6498         l_alternate_items_list.extend;
6499         l_alternate_items_list(l_alternate_items_list.count).item                    := p_parts_list(I).item_id;
6500         l_alternate_items_list(l_alternate_items_list.count).item_quantity           := p_parts_list(I).quantity;
6501         l_alternate_items_list(l_alternate_items_list.count).item_uom                := p_parts_list(I).item_uom;
6502         l_alternate_items_list(l_alternate_items_list.count).alternate_item          := l_supersede_items(J);
6503         l_alternate_items_list(l_alternate_items_list.count).alternate_item_quantity := l_temp_quantity;
6504         l_alternate_items_list(l_alternate_items_list.count).alternate_item_uom      := l_uom_code;
6505         l_alternate_items_list(l_alternate_items_list.count).relation_type           := 8;
6506         l_temp_quantity                                                              := 0;
6507         l_uom_code                                                                   := NULL;
6508       END LOOP;
6509       OPEN substitutes(p_parts_list(I).item_id, l_temp_org_id);
6510       LOOP
6511         FETCH substitutes INTO l_substitute_item;
6512         EXIT
6513       WHEN substitutes % NOTFOUND;
6514         log('check_parts_availability', 'inside substitutes loop');
6515         log('check_parts_availability', 'l_substitute_item: '||l_substitute_item);
6516         l_uom_code := NULL;
6517         OPEN primary_uom_code(l_substitute_item,l_temp_org_id);
6518         LOOP
6519           FETCH primary_uom_code INTO l_uom_code;
6520           EXIT
6521         WHEN primary_uom_code% NOTFOUND;
6522         end loop;
6523         CLOSE primary_uom_code;
6524         log('check_parts_availability', 'l_uom_code: '||l_uom_code);
6525         l_temp_quantity := inv_convert.inv_um_convert(item_id => l_substitute_item , PRECISION => NULL                                  -- use default precision
6526         , from_quantity => p_parts_list(I).quantity , from_unit => p_parts_list(I).item_uom , to_unit => l_uom_code , from_name => NULL -- from uom name
6527         , to_name => NULL                                                                                                               -- to uom name
6528         );
6529         log('check_parts_availability', 'l_temp_quantity: '||l_temp_quantity);
6530         l_alternate_items_list.extend;
6531         l_alternate_items_list(l_alternate_items_list.count).item                    := p_parts_list(I).item_id;
6532         l_alternate_items_list(l_alternate_items_list.count).item_quantity           := p_parts_list(I).quantity;
6533         l_alternate_items_list(l_alternate_items_list.count).item_uom                := p_parts_list(I).item_uom;
6534         l_alternate_items_list(l_alternate_items_list.count).alternate_item          := l_substitute_item;
6535         l_alternate_items_list(l_alternate_items_list.count).alternate_item_quantity := l_temp_quantity;
6536         l_alternate_items_list(l_alternate_items_list.count).alternate_item_uom      := l_uom_code;
6537         l_alternate_items_list(l_alternate_items_list.count).relation_type           := 2;
6538         l_temp_quantity                                                              := 0;
6539         l_uom_code                                                                   := NULL;
6540       END LOOP;
6541       CLOSE substitutes;
6542     END IF;
6543     log('check_parts_availability', 'begin l_alternate_items_list loop. count: '||l_alternate_items_list.count);
6544     FOR J IN 1..l_alternate_items_list.count
6545     LOOP
6546       --l_parts_list.extend;
6547       l_unavailable_list.extend;
6548       l_unavailable_list(l_unavailable_list.count).resource_type   := l_resources(1).resource_type;
6549       l_unavailable_list(l_unavailable_list.count).resource_id     := l_resources(1).resource_id;
6550       l_unavailable_list(l_unavailable_list.count).organization_id := l_dest_org_id;
6551       l_unavailable_list(l_unavailable_list.count).item_id         := l_alternate_items_list(J).alternate_item;
6552       l_unavailable_list(l_unavailable_list.count).item_uom        := l_alternate_items_list(J).alternate_item_uom;
6553       l_unavailable_list(l_unavailable_list.count).quantity        := l_alternate_items_list(J).alternate_item_quantity;
6554       l_unavailable_list(l_unavailable_list.count).ship_set_name   := p_parts_list(I).ship_set_name;
6555       l_unavailable_list(l_unavailable_list.count).item_type       := l_alternate_items_list(J).relation_type ;
6556       l_unavailable_list(l_unavailable_list.count).line_id         := p_parts_list(I).line_id;
6557       l_unavailable_list(l_unavailable_list.count).revision        := p_parts_list(I).revision;
6558       log('check_parts_availability', 'l_alternate_items_list(J).alternate_item: '||l_alternate_items_list(j).alternate_item);
6559       log('check_parts_availability', 'l_alternate_items_list(J).relation_type: '||l_alternate_items_list(j).relation_type);
6560       log('check_parts_availability', 'l_alternate_items_list(J).alternate_item_quantity: '||l_alternate_items_list(j).alternate_item_quantity);
6561       log('check_parts_availability', 'l_alternate_items_list(J).alternate_item_uom: '||l_alternate_items_list(j).alternate_item_uom);
6562       log('check_parts_availability', 'l_temp_org_id: '||l_temp_org_id);
6563       IF l_temp_subinv_code IS NOT NULL THEN
6564         log('check_parts_availability', 'calling check_local_inventory');
6565         check_local_inventory(
6566                 p_org_id => l_temp_org_id,
6567                 p_subinv_code => l_temp_subinv_code,
6568                 p_item_id => l_alternate_items_list(J).alternate_item,
6569                 p_revision => null,
6570                 x_att => l_att,
6571                 x_onhand => l_onhand,
6572                 x_return_status => x_return_status,
6573                 x_msg_data => x_msg_data,
6574                 x_msg_count => x_return_status);
6575         log('check_parts_availability', 'after check_local_inventory');
6576         log('check_parts_availability', 'x_return_status: '||x_return_status);
6577         log('check_parts_availability', 'x_msg_data: '||x_msg_data);
6578         log('check_parts_availability', 'x_msg_count: '||x_msg_count);
6579         log('check_parts_availability', 'l_att: '||l_att);
6580         IF l_att > 0 THEN
6581           l_final_available_list.extend;
6582           l_final_available_list(l_final_available_list.count).resource_id        := l_resources(1).resource_id;
6583           l_final_available_list(l_final_available_list.count).resource_type      := l_resources(1).resource_type;
6584           l_final_available_list(l_final_available_list.count).organization_id    := l_temp_org_id;
6585           l_final_available_list(l_final_available_list.count).item_id            := l_alternate_items_list(J).alternate_item ;
6586           l_final_available_list(l_final_available_list.count).item_uom           := l_alternate_items_list(J).alternate_item_uom ;
6587           l_final_available_list(l_final_available_list.count).revision           := NULL;
6588           l_final_available_list(l_final_available_list.count).available_quantity := l_att ;
6589           l_final_available_list(l_final_available_list.count).source_org         := l_temp_org_id;
6590           l_final_available_list(l_final_available_list.count).sub_inventory      := l_temp_subinv_code;
6591           l_final_available_list(l_final_available_list.count).AVAILABLE_DATE     := SYSDATE;
6592           l_final_available_list(l_final_available_list.count).line_id            := p_parts_list(I).line_id;
6593           l_final_available_list(l_final_available_list.count).item_type          := l_alternate_items_list(J).relation_type ;
6594           l_reservation_id                                                        := NULL;
6595           l_reservation_parts.need_by_date                                        := sysdate;
6596           l_reservation_parts.organization_id                                     := l_final_available_list(l_final_available_list.count).source_org ;
6597           l_reservation_parts.item_id                                             := l_final_available_list(l_final_available_list.count).item_id;
6598           l_reservation_parts.item_uom_code                                       := l_final_available_list(l_final_available_list.count).item_uom ;
6599           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) ;
6600           l_reservation_parts.sub_inventory_code                                  := l_final_available_list(l_final_available_list.count).sub_inventory;
6601           l_reservation_parts.line_id                                             := l_final_available_list(l_final_available_list.count).line_id ;
6602           l_reservation_parts.revision                                            := l_final_available_list(l_final_available_list.count).revision;
6603           l_reservation_id                                                        := CSP_SCH_INT_PVT.CREATE_RESERVATION(l_reservation_parts,x_return_status,x_msg_data);
6604           IF l_reservation_id                                                     <= 0 THEN
6605             x_return_status                                                       := FND_API.G_RET_STS_ERROR;
6606             FND_MESSAGE.SET_NAME('CSP', 'CSP_SCH_COULD_NOT_RESERVE');
6607             FND_MSG_PUB.ADD;
6608             fnd_msg_pub.count_and_get ( p_count => x_msg_count , p_data => x_msg_data);
6609           ELSE
6610             l_res_ids(l_res_ids.count+1) := l_reservation_id ;
6611           END IF;
6612         END IF;
6613       END IF;
6614       l_uom_code      := NULL;
6615       l_temp_quantity := NULL;
6616       l_att           := 0;
6617     END LOOP;
6618     IF l_alternate_items_list.count > 0 THEN
6619       l_alternate_items_list.trim;
6620       l_alternate_items_list := alternate_items_table_type();
6621     END IF;
6622   END LOOP;
6623   log('check_parts_availability', 'begin l_res_ids loop. count: '||l_res_ids.count);
6624   FOR i IN 1..l_res_ids.count
6625   LOOP
6626     log('check_parts_availability', 'l_res_ids('||i||'): '||l_res_ids(i));
6627     CSP_SCH_INT_PVT.DELETE_RESERVATION(l_res_ids(i),x_return_status,x_msg_data);
6628   END LOOP;
6629   log('check_parts_availability', 'profile CSP_CHECK_ATP value: '||fnd_profile.value(name => 'CSP_CHECK_ATP'));
6630   IF fnd_profile.value(name => 'CSP_CHECK_ATP')= 'ALWAYS' OR fnd_profile.value(name => 'CSP_CHECK_ATP')= 'PRONLY' THEN
6631     log('check_parts_availability', 'l_unavailable_list count: '||l_unavailable_list.count);
6632     IF l_unavailable_list.count >=1 THEN
6633       log('check_parts_availability', 'calling csp_sch_int_pvt.do_atp_check');
6634       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);
6635       log('check_parts_availability', 'after csp_sch_int_pvt.do_atp_check');
6636       log('check_parts_availability', 'l_return_status: '||l_return_status);
6637       log('check_parts_availability', 'x_msg_data: '||x_msg_data);
6638       log('check_parts_availability', 'x_msg_count: '||x_msg_count);
6639     END IF;
6640     log('check_parts_availability', 'l_available_list count: '||l_available_list.count);
6641     IF l_available_list.count > 0 THEN
6642       log('check_parts_availability', 'begin p_parts_list loop. count: '||p_parts_list.count);
6643       FOR K IN 1..p_parts_list.count
6644       LOOP
6645         l_atleast_one_rec_per_line := FALSE;
6646         log('check_parts_availability', 'begin l_available_list loop. count: '||l_available_list.count);
6647         FOR J IN 1..l_available_list.count
6648         LOOP
6649           log('check_parts_availability', 'l_available_list('||j||').line_id: '||l_available_list(j).line_id);
6650           log('check_parts_availability', 'p_parts_list('||K||').line_id: '||p_parts_list(K).line_id);
6651           IF l_available_list(J).line_id = p_parts_list(K).line_id THEN
6652             l_options                   := CSP_SCH_INT_PVT.CSP_SHIP_PARAMETERS_TBL_TYPE();
6653             l_temp_options              := CSP_SCH_INT_PVT.CSP_SHIP_PARAMETERS_TBL_TYPE ();
6654             l_temp_avail_list.extend;
6655             l_temp_avail_list(1)                         := l_available_list(J);
6656             l_temp_avail_list(1).destination_location_id := p_location_id;
6657             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);
6658             min_cost := NULL;
6659             l_temp_avail_list.trim;
6660             min_arrival_date := NULL;
6661             rec_pointer      := NULL;
6662             log('check_parts_availability', 'begin l_options loop. count: '||l_options.count);
6663             FOR I IN 1..l_options.count
6664             LOOP
6665               -- phegde : uncommenting the if condition as a fix for Ikon bug 3925273
6666               IF ROUND(((l_options(I).arrival_date - sysdate) * 24),2) <= ROUND(((p_need_by_date - sysdate) * 24),2) OR p_need_by_date IS NULL THEN
6667                 l_temp_options.extend;
6668                 l_temp_options(l_temp_options.count).resource_id       := l_options(I).resource_id;
6669                 l_temp_options(l_temp_options.count).resource_type     := l_options(I).resource_type;
6670                 l_temp_options(l_temp_options.count).lead_time         := l_options(I).lead_time ;
6671                 l_temp_options(l_temp_options.count).transfer_cost     := l_options(I).transfer_cost;
6672                 l_temp_options(l_temp_options.count).shipping_methodes := l_options(I).shipping_methodes;
6673                 l_temp_options(l_temp_options.count).arrival_date      := l_options(I).arrival_date ;
6674                 l_atleast_one_rec_per_line                             := TRUE;
6675                 IF p_need_by_date IS NOT NULL THEN
6676                   IF min_cost IS NULL THEN
6677                     min_cost                                           := l_temp_options(l_temp_options.count).transfer_cost;
6678                     rec_pointer                                        := l_temp_options.count;
6679                   ELSE
6680                     IF min_cost    > l_temp_options(l_temp_options.count).transfer_cost THEN
6681                       min_cost    := l_temp_options(l_temp_options.count).transfer_cost;
6682                       rec_pointer := l_temp_options.count;
6683                     END IF;
6684                   END IF;
6685                 ELSE
6686                   IF min_arrival_date IS NULL THEN
6687                     min_arrival_date  := l_temp_options(l_temp_options.count).arrival_date;
6688                     rec_pointer       := l_temp_options.count;
6689                   ELSE
6690                     IF min_arrival_date > l_temp_options(l_temp_options.count).arrival_date THEN
6691                       min_arrival_date := l_temp_options(l_temp_options.count).arrival_date;
6692                       rec_pointer      := l_temp_options.count;
6693                     END IF;
6694                   END IF;
6695                 END IF;
6696               END IF;
6697             END LOOP;
6698             log('check_parts_availability', 'l_temp_options.count: '||l_temp_options.count);
6699             IF l_temp_options.count                 > 0 THEN
6700               l_available_list(J).shipping_methode := l_temp_options(rec_pointer).shipping_methodes;
6701               l_available_list(J).intransit_time   := l_temp_options(rec_pointer).lead_time ;
6702               l_temp_options.trim;
6703             ELSE
6704               -- phegde : adding this code, since uncommented the if condition above
6705               log('check_parts_availability', 'begin l_options loop. count: '||l_options.count);
6706               FOR I IN 1..l_options.count
6707               LOOP
6708                 l_temp_options.extend;
6709                 l_temp_options(l_temp_options.count).resource_id       := l_options(I).resource_id;
6710                 l_temp_options(l_temp_options.count).resource_type     := l_options(I).resource_type;
6711                 l_temp_options(l_temp_options.count).lead_time         := l_options(I).lead_time ;
6712                 l_temp_options(l_temp_options.count).transfer_cost     := l_options(I).transfer_cost;
6713                 l_temp_options(l_temp_options.count).shipping_methodes := l_options(I).shipping_methodes;
6714                 l_temp_options(l_temp_options.count).arrival_date      := l_options(I).arrival_date ;
6715                 l_atleast_one_rec_per_line                             := TRUE;
6716                 IF min_arrival_date                                    IS NULL THEN
6717                   min_arrival_date                                     := l_temp_options(l_temp_options.count).arrival_date;
6718                   rec_pointer                                          := l_temp_options.count;
6719                 ELSE
6720                   IF min_arrival_date > l_temp_options(l_temp_options.count).arrival_date THEN
6721                     min_arrival_date := l_temp_options(l_temp_options.count).arrival_date;
6722                     rec_pointer      := l_temp_options.count;
6723                   END IF;
6724                 END IF;
6725               END LOOP;
6726               log('check_parts_availability', 'l_temp_options.count: '||l_temp_options.count);
6727               IF l_temp_options.count                 > 0 THEN
6728                 l_available_list(J).shipping_methode := l_temp_options(rec_pointer).shipping_methodes;
6729                 l_available_list(J).intransit_time   := l_temp_options(rec_pointer).lead_time ;
6730                 l_temp_options.trim;
6731               ELSE
6732                 l_available_list(J).item_id := NULL;
6733               END IF;
6734               -- phegde : end of changes
6735             END IF;
6736           END IF;
6737         END LOOP;
6738         log('check_parts_availability', 'begin l_final_available_list loop. count: '||l_final_available_list.count);
6739         FOR I IN 1..l_final_available_list.count
6740         LOOP
6741           IF l_final_available_list(I).line_id = p_parts_list(K).line_id THEN
6742             l_atleast_one_rec_per_line        := TRUE;
6743           END IF;
6744         END LOOP;
6745         IF NOT l_atleast_one_rec_per_line THEN
6746           FND_MESSAGE.SET_NAME('CSP', 'CSP_UNABLE_NEED_BY_DATE');
6747           FND_MSG_PUB.ADD;
6748           fnd_msg_pub.count_and_get ( p_count => x_msg_count , p_data => x_msg_data);
6749         END IF;
6750       END LOOP;
6751     END IF;
6752   ELSE
6753     log('check_parts_availability', 'ATP profile else part. begin l_unavailable_list loop. count: '||l_unavailable_list.count);
6754     FOR I IN 1..l_unavailable_list.count
6755     LOOP
6756       l_replenisment_org_id       := NULL;
6757       l_replenisment_subinventory := NULL;
6758       csp_parts_requirement.get_source_organization(l_unavailable_list(I).item_id, l_unavailable_list(I).organization_id, l_temp_subinv_code, l_replenisment_org_id, l_replenisment_subinventory);
6759       IF l_replenisment_org_id IS NOT NULL THEN
6760         l_available_list.extend;
6761         l_available_list(l_available_list.count).item_id          := l_unavailable_list(I).item_id ;
6762         l_available_list(l_available_list.count).source_org       := l_replenisment_org_id;
6763         l_available_list(l_available_list.count).shipping_methode := NULL;
6764         CHECK_LOCAL_INVENTORY(
6765                 p_org_id => l_replenisment_org_id,
6766                 p_subinv_code => l_replenisment_subinventory,
6767                 p_item_id => l_unavailable_list(i).item_id,
6768                 p_revision => l_unavailable_list(i).revision,
6769                 x_att => l_att,
6770                 x_onhand => l_onhand,
6771                 x_return_status => x_return_status,
6772                 x_msg_data => x_msg_data,
6773                 x_msg_count => x_return_status);
6774         l_available_list(l_available_list.count).available_quantity   := l_att;
6775         l_available_list(l_available_list.count).sub_inventory        := l_replenisment_subinventory;
6776         l_available_list(l_available_list.count).item_type            := l_unavailable_list(I).item_type ;
6777         l_available_list(l_available_list.count).item_uom             := l_unavailable_list(I).item_uom ;
6778         l_available_list(l_available_list.count).line_id              := l_unavailable_list(I).line_id ;
6779         l_available_list(l_available_list.count).replenishment_source := 'Y';
6780       END IF;
6781     END LOOP;
6782   END IF;
6783   l_temp_line_id      := p_parts_list(1).line_id;
6784   loop_Count          := 1;
6785   l_required_quantity := 0;
6786   log('check_parts_availability', 'begin p_parts_list loop again. count: '||p_parts_list.count);
6787   FOR I IN 1..p_parts_list.count
6788   LOOP
6789     l_no_of_options     := 0;
6790     l_required_quantity := p_parts_list(I).quantity;
6791     quantity_fullfilled := FALSE ;
6792     log('check_parts_availability', 'p_called_from: '||p_called_from);
6793     IF p_called_from <> 'MOBILE' THEN
6794       log('check_parts_availability', 'begin l_final_available_list loop. count: '||l_final_available_list.count);
6795       FOR K IN 1..l_final_available_list.count
6796       LOOP
6797         log('check_parts_availability', 'l_final_available_list('||K||').line_id: '||l_final_available_list(K).line_id);
6798         log('check_parts_availability', 'p_parts_list('||I||').line_id: '||p_parts_list(I).line_id);
6799         IF l_final_available_list(K).line_id             = p_parts_list(I).line_id THEN
6800           l_no_of_options                               := l_no_of_options + 1;
6801           x_availability(loop_count).line_id            := l_final_available_list(k).line_id ;
6802           x_availability(loop_count).item_uom           := p_parts_list(I).item_uom ;
6803           x_availability(loop_count).item_id            := l_final_available_list(k).item_id ;
6804           x_availability(loop_count).source_org_id      := l_final_available_list(k).source_org;
6805           x_availability(loop_count).shipping_methode   := l_final_available_list(k).shipping_methode;
6806           x_availability(loop_count).item_type          := l_final_available_list(k).item_type ;
6807           x_availability(loop_count).sub_inventory_code := l_final_available_list(k).sub_inventory;
6808           x_availability(loop_count).available_quantity := inv_convert.inv_um_convert(  item_id => l_final_available_list(K).item_id
6809                                                                                       , PRECISION => NULL   -- use default precision
6810                                                                                       , from_quantity => l_final_available_list(K).available_quantity
6811                                                                                       , from_unit => l_final_available_list(K).item_uom
6812                                                                                       , to_unit => p_parts_list(I).item_uom
6813                                                                                       , from_name => NULL -- from uom name
6814                                                                                       , to_name => NULL   -- to uom name
6815                                                                                       );
6816           l_final_available_list(K).available_quantity := x_availability(loop_count).available_quantity;
6817           x_availability(loop_count).revision          := l_final_available_list(K).revision;
6818           IF x_availability(loop_count).source_org_id = l_temp_org_id THEN
6819             IF p_need_by_date IS NOT NULL THEN
6820               x_availability(loop_count).arraival_date := p_need_by_date;
6821               x_availability(loop_count).order_by_date := p_need_by_date;
6822             ELSE
6823               x_availability(loop_count).arraival_date := sysdate ;
6824               x_availability(loop_count).order_by_date := sysdate ;
6825             END IF;
6826           END IF;
6827           IF l_final_available_list(k).shipping_methode IS NOT NULL THEN
6828             x_availability(loop_count).source_type       := 'IO' ;
6829             IF p_need_by_date IS NOT NULL THEN
6830               x_availability(loop_count).arraival_date   := l_final_available_list(k).available_date + l_final_available_list(k).intransit_time/24 ;
6831               IF p_need_by_date > x_availability(loop_count).arraival_date THEN
6832                 x_availability(loop_count).arraival_date := p_need_by_date;
6833               END IF;
6834               x_availability(loop_count).order_by_date := x_availability(loop_count).arraival_date - l_final_available_list(k).intransit_time/24 ;
6835             ELSE
6836               x_availability(loop_count).arraival_date := l_final_available_list(k).available_date + l_final_available_list(k).intransit_time/24 ;
6837               x_availability(loop_count).order_by_date := SYSDATE;
6838             END IF;
6839           ELSE
6840             x_availability(loop_count).source_type := 'RES' ;
6841           END IF;
6842           IF fnd_profile.value(name => 'CSP_INCL_CAR_STOCK')= 'ALWAYS' OR fnd_profile.value(name => 'CSP_INCL_CAR_STOCK')= 'PRONLY' THEN
6843             IF NOT quantity_fullfilled THEN
6844               IF l_required_quantity                           > l_final_available_list(k).available_quantity THEN
6845                 x_availability(loop_count).recommended_option := 'Y';
6846                 quantity_fullfilled                           := FALSE;
6847                 l_required_quantity                           := l_required_quantity - l_final_available_list(k).available_quantity;
6848                 x_availability(loop_count).ordered_quantity   := l_final_available_list(k).available_quantity;
6849               ELSE
6850                 x_availability(loop_count).recommended_option := 'Y';
6851                 x_availability(loop_count).ordered_quantity   := l_required_quantity;
6852                 quantity_fullfilled                           := TRUE ;
6853               END IF;
6854             END IF;
6855           END IF;
6856           loop_count := loop_count + 1;
6857         END IF;
6858       END LOOP;
6859     END IF;
6860     log('check_parts_availability', 'begin l_available_list loop. count: '||l_available_list.count);
6861     FOR J IN 1..l_available_list.count
6862     LOOP
6863       log('check_parts_availability', 'l_available_list('||J||').line_id: '||l_available_list(J).line_id);
6864       log('check_parts_availability', 'p_parts_list('||i||').line_id: '||p_parts_list(i).line_id);
6865       log('check_parts_availability', 'l_available_list('||J||').item_id: '||l_available_list(J).item_id);
6866       IF l_available_list(J).line_id = p_parts_list(I).line_id AND l_available_list(J).item_id IS NOT NULL THEN
6867         l_no_of_options                             := l_no_of_options + 1;
6868         x_availability(loop_count).item_uom         := p_parts_list(I).item_uom ;
6869         x_availability(loop_count).line_id          := l_available_list(J).line_id ;
6870         x_availability(loop_count).item_id          := l_available_list(J).item_id ;
6871         x_availability(loop_count).source_org_id    := l_available_list(J).source_org;
6872         x_availability(loop_count).shipping_methode := l_available_list(J).shipping_methode;
6873         --  x_availability(loop_count).ordered_quantity :=  l_available_list(J).quantity;
6874         x_availability(loop_count).item_type := l_available_list(J).item_type ;
6875         --  x_availability(loop_count).source_type      := 'IO' ;
6876         x_availability(loop_count).sub_inventory_code := l_available_list(J).sub_inventory;
6877         x_availability(loop_count).available_quantity := inv_convert.inv_um_convert(  item_id => l_available_list(J).item_id
6878                                                                                     , PRECISION => NULL   -- use default precision
6879                                                                                     , from_quantity => l_available_list(J).available_quantity
6880                                                                                     , from_unit => l_available_list(J).item_uom
6881                                                                                     , to_unit => p_parts_list(I).item_uom
6882                                                                                     , from_name => NULL -- from uom name
6883                                                                                     , to_name => NULL   -- to uom name
6884                                                                                     );
6885         l_available_list(J).available_quantity       := x_availability(loop_count).available_quantity;
6886         x_availability(loop_count).revision          := l_available_list(J).revision;
6887 
6888         IF x_availability(loop_count).source_org_id = l_temp_org_id THEN
6889           IF p_need_by_date IS NOT NULL THEN
6890             x_availability(loop_count).arraival_date := p_need_by_date;
6891             x_availability(loop_count).order_by_date := get_order_by_date(x_availability(loop_count).source_org_id,
6892                                                                           x_availability(loop_count).shipping_methode,
6893                                                                           x_availability(loop_count).arraival_date,
6894                                                                           l_available_list(I).intransit_time,
6895                                                                           l_temp_org_id);
6896           ELSE
6897             x_availability(loop_count).arraival_date := sysdate ;
6898             x_availability(loop_count).order_by_date := sysdate ;
6899           END IF;
6900         END IF;
6901 
6902         IF l_available_list(J).shipping_methode IS NOT NULL OR l_available_list(J).sub_inventory IS NULL OR l_available_list(J).replenishment_source IS NOT NULL THEN
6903           x_availability(loop_count).source_type := 'IO' ;
6904           IF p_need_by_date IS NOT NULL THEN
6905             x_availability(loop_count).arraival_date := get_arrival_date(l_available_list(J).available_date, l_available_list(J).intransit_time, l_temp_org_id) ;
6906             -- Modified for bug 3925273
6907             IF p_need_by_date - x_availability(loop_count).arraival_date >= 1 THEN
6908               l_no_of_days := ROUND((p_need_by_date - x_availability(loop_count).arraival_date) - 0.5);
6909               x_availability(loop_count).arraival_date := x_availability(loop_count).arraival_date + l_no_of_days;
6910             END IF;
6911             /* x_availability(loop_count).order_by_date    := x_availability(loop_count).arraival_date
6912             - l_available_list(J).intransit_time/24 ;*/
6913             x_availability(loop_count).order_by_date := get_order_by_date(x_availability(loop_count).source_org_id,
6914                                                                           x_availability(loop_count).shipping_methode,
6915                                                                           x_availability(loop_count).arraival_date,
6916                                                                           l_available_list(J).intransit_time,
6917                                                                           l_temp_org_id);
6918           ELSE
6919             x_availability(loop_count).arraival_date := get_arrival_date(l_available_list(J).available_date, l_available_list(J).intransit_time, l_temp_org_id);
6920             x_availability(loop_count).order_by_date := SYSDATE;
6921           END IF;
6922         ELSE
6923           x_availability(loop_count).source_type := 'RES' ;
6924         END IF;
6925 
6926         IF NOT quantity_fullfilled THEN
6927           IF l_required_quantity > l_available_list(J).available_quantity THEN
6928             x_availability(loop_count).recommended_option := 'Y';
6929             quantity_fullfilled                           := FALSE;
6930             l_required_quantity                           := l_required_quantity - l_available_list(J).available_quantity;
6931           ELSE
6932             x_availability(loop_count).recommended_option := 'Y';
6933             x_availability(loop_count).ordered_quantity   := l_required_quantity;
6934             quantity_fullfilled                           := TRUE ;
6935           END IF;
6936         END IF;
6937         loop_count := loop_count + 1;
6938       END IF;
6939     END LOOP;
6940     IF NOT quantity_fullfilled THEN
6941       l_assignment_set_id := FND_PROFILE.value(name => 'MRP_ATP_ASSIGN_SET');
6942       log('check_parts_availability', 'l_assignment_set_id: '||l_assignment_set_id);
6943       OPEN check_buy_from(p_parts_list(I).item_id, l_assignment_set_id,l_temp_org_id);
6944       LOOP
6945         FETCH check_buy_from INTO l_vendor_id, l_vendor_site_id;
6946         EXIT
6947       WHEN check_buy_from%notfound;
6948         x_availability(loop_count).item_id            := p_parts_list(I).item_id ;
6949         x_availability(loop_count).source_type        := 'POREQ' ;
6950         x_availability(loop_count).ordered_quantity   := l_required_quantity;
6951         x_availability(loop_count).line_id            := p_parts_list(I).line_id ;
6952         x_availability(loop_count).recommended_option := 'Y';
6953         x_availability(loop_count).item_uom           := p_parts_list(I).item_uom ;
6954         x_availability(loop_count).shipping_methode   := NULL;
6955         l_no_of_options                               := 1;
6956         loop_count                                    := loop_count+ 1;
6957         EXIT;
6958       END LOOP;
6959       CLOSE check_buy_from;
6960     END IF;
6961     log('check_parts_availability', 'l_no_of_options: '||l_no_of_options);
6962     IF l_no_of_options                               = 0 THEN
6963       x_availability(loop_count).line_id            := p_parts_list(I).line_id ;
6964       x_availability(loop_count).item_id            := p_parts_list(I).item_id ;
6965       x_availability(loop_count).source_org_id      := NULL;
6966       x_availability(loop_count).shipping_methode   := NULL;
6967       x_availability(loop_count).ordered_quantity   := NULL;
6968       x_availability(loop_count).item_type          := NULL;
6969       x_availability(loop_count).source_type        := NULL;
6970       x_availability(loop_count).sub_inventory_code := NULL;
6971       x_availability(loop_count).arraival_date      := NULL;
6972       x_availability(loop_count).order_by_date      := NULL;
6973       loop_count                                    := loop_count+ 1;
6974     END IF;
6975   END LOOP;
6976   log('check_parts_availability', 'END');
6977 EXCEPTION
6978 WHEN OTHERS THEN
6979   FND_MESSAGE.SET_NAME('CSP', 'CSP_UNEXPECTED_EXEC_ERRORS');
6980   FND_MESSAGE.SET_TOKEN('ROUTINE', l_api_name, FALSE);
6981   FND_MESSAGE.SET_TOKEN('SQLERRM', sqlerrm, FALSE);
6982   FND_MSG_PUB.ADD;
6983   fnd_msg_pub.count_and_get ( p_count => x_msg_count , p_data => x_msg_data);
6984   x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
6985   RETURN;
6986 END check_parts_availability;
6987 
6988     PROCEDURE CHECK_LOCAL_INVENTORY(  p_org_id        IN   NUMBER
6989                                       ,p_revision      IN   varchar2
6990                                      ,p_subinv_code   IN   VARCHAR2
6991                                      ,p_item_id       IN   NUMBER
6992                                      ,x_att           OUT NOCOPY  NUMBER
6993                                      ,x_onhand        OUT NOCOPY  NUMBER
6994                                      ,x_return_status OUT NOCOPY  VARCHAR2
6995                                      ,x_msg_data      OUT NOCOPY  VARCHAR2
6996                                      ,x_msg_count     OUT NOCOPY  NUMBER) IS
6997     /*CURSOR reservation_check(org_id NUMBER, sub_inv_code VARCHAR2,item_id NUMBER)
6998     IS
6999     SELECT (REQUIRED_QUANTITY-ORDERED_QUANTITY)
7000     FROM   CSP_REQUIREMENT_LINES
7001     WHERE  REQUIREMENT_HEADER_ID = (SELECT REQUIREMENT_HEADER_ID
7002                                     FROM   CSP_REQUIREMENT_HEADERS
7003                                     WHERE  OPEN_REQUIREMENT = 'Yes'
7004                                     AND    DESTINATION_ORGANIZATION_ID = org_id)
7005     AND   SOURCE_SUBINVENTORY =  sub_inv_code
7006     AND   INVENTORY_ITEM_ID = item_id
7007     AND   ORDER_LINE_ID IS NOT NULL ;*/
7008 
7009     l_onhand            NUMBER;
7010     l_available         NUMBER;
7011     l_rqoh              NUMBER;
7012    -- l_msg_data          VARCHAR2(2000);
7013    -- l_msg_count         NUMBER;
7014     l_return_status     VARCHAR2(128);
7015     l_qr                NUMBER;
7016     l_qs                NUMBER;
7017     l_temp_reserv_quantity NUMBER;
7018     l_api_name varchar2(60) := 'CSP_SCH_INT_PVT.CHECK_LOCAl_INVENTORY';
7019     l_is_revision_control boolean := null;
7020   BEGIN
7021         IF p_revision IS NOT NULL THEN
7022                 l_is_revision_control  := TRUE;
7023         END IF;
7024                 x_return_status := FND_API.G_RET_STS_SUCCESS ;
7025                 x_att := 0;
7026                 inv_quantity_tree_pub.clear_quantity_cache;
7027                 inv_quantity_tree_pub.query_quantities(p_api_version_number => 1.0
7028                                                      , p_organization_id  =>  p_org_id
7029                                                      , p_inventory_item_id => p_item_id
7030                                                      , p_subinventory_code => p_subinv_code
7031                                                      , x_qoh     => x_onhand
7032                                                      , x_atr     => l_available
7033                                                      , p_init_msg_lst   => fnd_api.g_false
7034                                                      , p_tree_mode   => inv_quantity_tree_pvt.g_transaction_mode
7035                                                      , p_is_revision_control => l_is_revision_control
7036                                                      , p_is_lot_control  => NULL
7037                                                      , p_is_serial_control => NULL
7038                                                      , p_revision    => p_revision
7039                                                      , p_lot_number   => NULL
7040                                                      , p_locator_id   => NULL
7041                                                      , x_rqoh     => l_rqoh
7042                                                      , x_qr     => l_qr
7043                                                      , x_qs     => l_qs
7044                                                      , x_att     => x_att
7045                                                      , x_return_status  => l_return_status
7046                                                      , x_msg_count   => x_msg_count
7047                                                      , x_msg_data    => x_msg_data
7048                                                      );
7049 
7050                /* OPEN reservation_check(p_org_id, p_subinv_code,p_item_id );
7051                 LOOP
7052                     FETCH reservation_check INTO l_temp_reserv_quantity;
7053                     EXIT WHEN reservation_check% NOTFOUND;
7054                      x_att := x_att - l_temp_reserv_quantity ;
7055                  END LOOP;
7056                  CLOSE reservation_check;*/
7057             EXCEPTION
7058             WHEN OTHERS THEN
7059             FND_MESSAGE.SET_NAME('CSP', 'CSP_UNEXPECTED_EXEC_ERRORS');
7060             FND_MESSAGE.SET_TOKEN('ROUTINE', l_api_name, FALSE);
7061             FND_MESSAGE.SET_TOKEN('SQLERRM', sqlerrm, FALSE);
7062             FND_MSG_PUB.ADD;
7063             fnd_msg_pub.count_and_get
7064               ( p_count => x_msg_count
7065               , p_data  => x_msg_data);
7066             x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
7067             return;
7068       END CHECK_LOCAL_INVENTORY;
7069       PROCEDURE TASKS_POST_INSERT( x_return_status out nocopy varchar2) IS
7070         p_task_id NUMBER;
7071         l_msg_data varchar2(3000);
7072         l_msg_count NUMBER;
7073         l_header_id NUMBER;
7074         p_task_template_id NUMBER;
7075       BEGIN
7076             p_task_id := jtf_tasks_pub.p_task_user_hooks.task_id;
7077              CSP_REQUIREMENT_POPULATE_PVT.POPULATE_REQUIREMENTS(p_task_id       => p_task_id
7078                                                               ,p_api_version   => 1.0
7079                                                               ,p_Init_Msg_List => FND_API.G_FALSE
7080                                                               ,p_commit        => FND_API.G_FALSE
7081                                                               ,x_return_status => x_return_status
7082                                                               ,x_msg_data      => l_msg_data
7083                                                               ,x_msg_count     => l_msg_count
7084                                                               ,px_header_id    => l_header_id
7085                                                               ,p_called_by     => 1);
7086 
7087 
7088       END TASKS_POST_INSERT;
7089       PROCEDURE strip_into_lines(px_options          IN OUT NOCOPY      CSP_SCH_INT_PVT.CSP_SHIP_PARAMETERS_TBL_TYPE
7090                                  ,p_ship_count      IN      CSP_SCH_INT_PVT.CSP_SHIP_METHOD_COUNT_TBL_TYP
7091                                  ,p_res_ship_parameters IN  CSP_SCH_INT_PVT.CSP_ORGS_SHIP_PARAM_TBL_TYPE
7092                                  ,px_available_list     IN OUT NOCOPY CSP_SCH_INT_PVT.CSP_AVAILABILITY_TBL_TYPE
7093                                  ,x_msg_data           OUT NOCOPY varchar2
7094                                  ,x_return_status      OUT NOCOPY varchar2
7095                                  ,x_msg_count          OUT NOCOPY NUMBER) IS
7096 
7097 
7098         l_org_ship_methode        org_ship_methodes_tbl_type ;
7099         l_final_option            CSP_SCH_INT_PVT.CSP_SHIP_PARAMETERS_TBL_TYPE ;
7100         min_cost number;
7101         previous_position NUMBER;
7102         str_length NUMBER;
7103         l_ship_methode_count NUMBER;
7104         g_arrival_date            DATE;
7105         current_position NUMBER;
7106 
7107       BEGIN
7108          l_final_option   :=         CSP_SCH_INT_PVT.CSP_SHIP_PARAMETERS_TBL_TYPE() ;
7109          l_org_ship_methode :=       org_ship_methodes_tbl_type() ;
7110           FOR I IN 1..px_options.count LOOP
7111                IF I =1 THEN
7112                     min_cost := px_options(I).transfer_cost;
7113                     l_final_option.extend;
7114                     l_final_option(l_final_option.count).resource_id       :=  px_options(I).resource_id;
7115                     l_final_option(l_final_option.count).resource_type     :=  px_options(I).resource_type;
7116                     l_final_option(l_final_option.count).lead_time         :=  px_options(I).lead_time   ;
7117                     l_final_option(l_final_option.count).transfer_cost     :=  px_options(I).transfer_cost;
7118                     IF px_options(I).shipping_methodes IS NOT NULL THEN
7119                         px_options(I).shipping_methodes := px_options(I).shipping_methodes || '$' ;
7120                     END IF;
7121                     l_final_option(l_final_option.count).shipping_methodes :=  px_options(I).shipping_methodes;
7122                     l_final_option(l_final_option.count).arrival_date      :=  px_options(I).arrival_date ;
7123                ELSE
7124                     SELECT LEAST(min_cost, px_options(I).transfer_cost) INTO min_cost
7125                     FROM   DUAL;
7126                     IF min_cost = px_options(I).transfer_cost THEN
7127                        l_final_option.trim(l_final_option.count);
7128                        l_final_option.extend;
7129                        l_final_option(l_final_option.count).resource_id       :=  px_options(I).resource_id;
7130                        l_final_option(l_final_option.count).resource_type     :=  px_options(I).resource_type;
7131                        l_final_option(l_final_option.count).lead_time         :=  px_options(I).lead_time   ;
7132                        l_final_option(l_final_option.count).transfer_cost     :=  px_options(I).transfer_cost;
7133                         IF px_options(I).shipping_methodes IS NOT NULL THEN
7134                             px_options(I).shipping_methodes := px_options(I).shipping_methodes || '$' ;
7135                         END IF;
7136                             l_final_option(l_final_option.count).shipping_methodes :=  px_options(I).shipping_methodes;
7137                             l_final_option(l_final_option.count).arrival_date      :=  px_options(I).arrival_date ;
7138                      END IF;
7139                END IF;
7140                g_arrival_date := l_final_option(l_final_option.count).arrival_date;
7141         END LOOP;
7142         previous_position :=1;
7143         str_length := 0;
7144         l_ship_methode_count := 1;
7145         IF p_ship_count.count > 1 THEN
7146             FOR I IN 1..p_ship_count.count LOOP
7147                IF p_ship_count(I).from_org_id <> p_ship_count(I).to_org_id  THEN
7148                     --IF I <> p_ship_count.count THEN
7149                         l_org_ship_methode.extend;
7150                         SELECT INSTR(l_final_option(1).shipping_methodes,'$',1,l_ship_methode_count ) INTO current_position
7151                         FROM   DUAL;
7152                         SELECT SUBSTR(l_final_option(1).shipping_methodes,previous_position,(current_position-previous_position))
7153                         INTO   l_org_ship_methode(l_org_ship_methode.count).shipping_methode
7154                         FROM   DUAL;
7155                         l_org_ship_methode(l_org_ship_methode.count).from_org := p_ship_count(I).from_org_id;
7156                         l_org_ship_methode(l_org_ship_methode.count).to_org   := p_ship_count(I).to_org_id ;
7157                         previous_position := current_position+1;
7158                         current_position := 1;
7159                         l_ship_methode_count := l_ship_methode_count + 1;
7160                  ELSE
7161                         l_org_ship_methode.extend;
7162                         l_org_ship_methode(l_org_ship_methode.count).from_org := p_ship_count(I).from_org_id;
7163                         l_org_ship_methode(l_org_ship_methode.count).to_org   := p_ship_count(I).to_org_id ;
7164                         l_org_ship_methode(l_org_ship_methode.count).shipping_methode := NULL;
7165                  END IF;
7166             END LOOP;
7167          ELSE
7168             l_org_ship_methode.extend;
7169             SELECT INSTR(l_final_option(1).shipping_methodes,'$',1,l_ship_methode_count ) INTO current_position
7170             FROM   DUAL;
7171             SELECT SUBSTR(l_final_option(1).shipping_methodes,previous_position,(current_position-previous_position))
7172             INTO   l_org_ship_methode(l_org_ship_methode.count).shipping_methode
7173             FROM   DUAL;
7174             l_org_ship_methode(l_org_ship_methode.count).from_org := p_ship_count(1).from_org_id;
7175             l_org_ship_methode(l_org_ship_methode.count).to_org   := p_ship_count(1).to_org_id ;
7176           ---  l_org_ship_methode(l_org_ship_methode.count).shipping_methode := l_final_option(1).shipping_methodes;
7177          END IF;
7178         FOR I IN 1..px_available_list.count LOOP
7179            IF px_available_list(I).sub_inventory IS NULL  AND (px_available_list(I).organization_id <> px_available_list(I).source_org) THEN
7180                 FOR J IN 1..l_org_ship_methode.count LOOP
7181                     IF px_available_list(I).organization_id =l_org_ship_methode(J).to_org
7182                             AND  px_available_list(I).source_org =l_org_ship_methode(J).from_org THEN
7183                                 px_available_list(I).shipping_methode := l_org_ship_methode(J).shipping_methode;
7184                             FOR K In 1..p_res_ship_parameters.count LOOP
7185                                 IF p_res_ship_parameters(K).to_org_id = px_available_list(I).organization_id
7186                                     AND p_res_ship_parameters(K).from_org_id = px_available_list(I).source_org
7187                                     AND p_res_ship_parameters(K).shipping_method = px_available_list(I).shipping_methode THEN
7188                                     px_available_list(I).intransit_time := p_res_ship_parameters(K).lead_time ;
7189                                     exit;
7190                                 END IF;
7191                             END LOOP;
7192                         EXIT;
7193                     END IF;
7194                 END LOOP;
7195            END IF;
7196         END LOOP;
7197       END strip_into_lines;
7198        PROCEDURE ws_Check_engineers_subinv(p_resource_type IN varchar2
7199                                    ,p_resource_id  IN NUMBER
7200                                    ,p_parts_list    IN csp_sch_int_pvt.CSP_PARTS_TBL_TYP1
7201                                    ,p_include_alternate IN varchar2
7202                                    ,x_available_list   OUT NOCOPY csp_sch_int_pvt.ws_AVAILABLE_PARTS_tbl_TYP
7203                                    ,x_return_status   OUT NOCOPY varchar2
7204                                    ,x_msg_data      OUT NOCOPY varchar2
7205                                    ,x_msg_count      OUT NOCOPY  NUMBER) IS
7206             l_att NUMBER:=0;
7207             l_onhand NUMBER := 0;
7208             l_org_id NUMBER;
7209             l_subinv_code varchar2(30);
7210             l_items   csp_sch_int_pvt.alternate_items_table_type;
7211 
7212             CURSOR get_all_subinventories(l_resource_id number, l_resource_type varchar2) IS
7213             SELECT  cil.ORGANIZATION_ID, cil.SUBINVENTORY_CODE
7214             FROM    CSP_INV_LOC_ASSIGNMENTS cil,csp_sec_inventories csi
7215             WHERE   cil.RESOURCE_ID = l_resource_id
7216             AND     cil.RESOURCE_TYPE = l_resource_type
7217             AND     nvl(cil.EFFECTIVE_DATE_END,sysdate) >= sysdate
7218             AND     csi.organization_id = cil.organization_id
7219             and     csi.secondary_inventory_name = cil.subinventory_code
7220             and     csi.condition_type = 'G' ;
7221 
7222             CURSOR get_default_subinventory(l_resource_id number, l_resource_type varchar2) IS
7223             SELECT  ORGANIZATION_ID, SUBINVENTORY_CODE
7224             FROM    CSP_INV_LOC_ASSIGNMENTS
7225             WHERE   RESOURCE_ID = l_resource_id
7226             AND     RESOURCE_TYPE = l_resource_type
7227             AND     DEFAULT_CODE = 'IN' ;
7228 
7229             CURSOR get_source_meaning(l_type varchar2) IS
7230             select meaning
7231             from fnd_lookups
7232             where lookup_type = 'CSP_REQ_SOURCE_TYPE'
7233             and lookup_code = l_type;
7234 
7235             CURSOR get_item_type_meaning(l_item_type number) IS
7236             select meaning
7237             from mfg_lookups
7238             where lookup_type
7239             like 'MTL_RELATIONSHIP_TYPES'
7240             and lookup_code = l_item_type;
7241 
7242             CURSOR get_item_number(c_item_id NUMBER, c_org_id NUMBER) IS
7243             select CONCATENATED_SEGMENTS
7244             FROM   mtl_system_items_kfv
7245             where inventory_item_id = c_item_id
7246             and   organization_id = c_org_id;
7247 
7248             -- bug # 4618899
7249             CURSOR primary_uom_code(item_id NUMBER,org_id NUMBER) IS
7250             SELECT PRIMARY_UOM_CODE
7251             FROM   MTL_SYSTEM_ITEMS_B
7252             WHERE  INVENTORY_ITEM_ID = item_id
7253             AND    organization_id  = org_id;
7254             l_primary_uom varchar2(500);
7255 
7256       BEGIN
7257             l_items  := csp_sch_int_pvt.alternate_items_table_type();
7258             x_available_list   := csp_sch_int_pvt.ws_AVAILABLE_PARTS_tbl_TYP();
7259             OPEN get_default_subinventory(p_resource_id,p_resource_type);
7260             FETCH get_default_subinventory INTO l_org_id, l_subinv_code;
7261             CLOSE get_default_subinventory;
7262                  l_items.extend;
7263                  l_items(l_items.count).item                     := p_parts_list(1).item_id;
7264                  l_items(l_items.count).item_quantity            := p_parts_list(1).quantity;
7265                  l_items(l_items.count).item_uom                 := p_parts_list(1).item_uom;
7266                  l_items(l_items.count).alternate_item           := p_parts_list(1).item_id;
7267                  l_items(l_items.count).alternate_item_quantity  := p_parts_list(1).quantity;
7268                  l_items(l_items.count).alternate_item_uom       := p_parts_list(1).item_uom;
7269                  l_items(l_items.count).relation_type            := NULL;
7270                  l_items(l_items.count).revision                 := p_parts_list(1).revision;
7271               IF p_include_alternate = 'Y' THEN
7272                  get_alternates(p_parts_rec   => p_parts_list(1)
7273                                ,p_org_id      => l_org_id
7274                                ,px_alternate_items => l_items
7275                                ,x_return_status => x_return_status
7276                                ,x_msg_data      => x_msg_data
7277                                ,x_msg_count    => x_msg_count);
7278               END IF;
7279 
7280                 open get_all_subinventories(p_resource_id,p_resource_type);
7281                 LOOP
7282                     FETCH get_all_subinventories INTO l_org_id, l_subinv_code;
7283                     EXIT WHEN get_all_subinventories% NOTFOUND;
7284                     l_onhand := 0;
7285                     l_att := 0;
7286                     FOR I IN 1..l_items.count LOOP
7287                         CHECK_LOCAL_INVENTORY(p_org_id        => l_org_id
7288                                      ,p_revision     => l_items(I).revision
7289                                      ,p_subinv_code   => l_subinv_code
7290                                      ,p_item_id       => l_items(I).alternate_item
7291                                      ,x_att           => l_att
7292                                      ,x_onhand        => l_onhand
7293                                      ,x_return_status => x_return_status
7294                                      ,x_msg_data      => x_msg_data
7295                                      ,x_msg_count     => x_msg_count);
7296                        IF l_att > 0 or l_onhand > 0 THEN
7297                           x_available_list.extend;
7298                           x_available_list(x_available_list.count).item_id       := l_items(I).alternate_item;
7299                           x_available_list(x_available_list.count).item_uom      := l_items(I).alternate_item_uom;
7300                           x_available_list(x_available_list.count).revision      := l_items(I).revision;
7301 
7302                           -- bug # 6955417
7303                           if l_items(I).relation_type is not NULL then
7304                             OPEN get_item_type_meaning(l_items(I).relation_type);
7305                             FETCH get_item_type_meaning INTO x_available_list(x_available_list.count).item_type ;
7306                             CLOSE get_item_type_meaning;
7307                           end if;
7308 
7309                           x_available_list(x_available_list.count).source_org_id := l_org_id;
7310                           OPEN get_item_number(x_available_list(x_available_list.count).item_id ,x_available_list(x_available_list.count).source_org_id);
7311                           FETCH  get_item_number INTO x_available_list(x_available_list.count).item_number;
7312                           CLOSE get_item_number;
7313                           x_available_list(x_available_list.count).sub_inventory_code  := l_subinv_code;
7314 
7315                           -- bug # 4618899
7316                           --x_available_list(x_available_list.count).available_quantity  := l_att;
7317                           --x_available_list(x_available_list.count).on_hand_quantity    := l_onhand;
7318 
7319                           open primary_uom_code(x_available_list(x_available_list.count).item_id ,x_available_list(x_available_list.count).source_org_id);
7320                           fetch primary_uom_code into l_primary_uom;
7321                           close primary_uom_code;
7322 
7323                           -- for available_quantity
7324                           x_available_list(x_available_list.count).available_quantity :=
7325                                 inv_convert.inv_um_convert(item_id => x_available_list(x_available_list.count).item_id
7326                                  , precision     => NULL  -- use default precision
7327                                  , from_quantity => l_att
7328                                  , from_unit     => l_primary_uom
7329                                  , to_unit       => x_available_list(x_available_list.count).item_uom
7330                                  , from_name     => NULL  -- from uom name
7331                                  , to_name       => NULL  -- to uom name
7332                                  );
7333 
7334                           -- for on_hand_quantity
7335                           x_available_list(x_available_list.count).on_hand_quantity :=
7336                                 inv_convert.inv_um_convert(item_id => x_available_list(x_available_list.count).item_id
7337                                  , precision     => NULL  -- use default precision
7338                                  , from_quantity => l_onhand
7339                                  , from_unit     => l_primary_uom
7340                                  , to_unit       => x_available_list(x_available_list.count).item_uom
7341                                  , from_name     => NULL  -- from uom name
7342                                  , to_name       => NULL  -- to uom name
7343                                  );
7344 
7345 
7346                           x_available_list(x_available_list.count).arraival_date       := sysdate;
7347                           OPEN  get_source_meaning('RES');
7348                           FETCH get_source_meaning INTO x_available_list(x_available_list.count).source_type;
7349                           CLOSE get_source_meaning;
7350                        END IF;
7351                    END LOOP;
7352                 END LOOP;
7353                 CLOSE get_all_subinventories;
7354       END ws_Check_engineers_subinv;
7355       PROCEDURE ws_Check_other_eng_subinv(p_resource_list IN csp_sch_int_pvt.csp_ws_resource_table_type
7356                                    ,p_parts_list    IN csp_sch_int_pvt.CSP_PARTS_TBL_TYP1
7357                                    ,p_include_alternate IN varchar2
7358                                    ,x_available_list   OUT NOCOPY csp_sch_int_pvt.ws_AVAILABLE_PARTS_tbl_TYP
7359                                    ,x_return_status   OUT NOCOPY varchar2
7360                                    ,x_msg_data      OUT NOCOPY varchar2
7361                                    ,x_msg_count      OUT NOCOPY  NUMBER) IS
7362 
7363             l_att NUMBER:=0;
7364             l_onhand NUMBER := 0;
7365             l_org_id NUMBER;
7366             l_subinv_code varchar2(30);
7367             l_items   csp_sch_int_pvt.alternate_items_table_type;
7368 
7369             CURSOR get_default_subinventory(l_resource_id number, l_resource_type varchar2) IS
7370             SELECT  ORGANIZATION_ID, SUBINVENTORY_CODE
7371             FROM    CSP_INV_LOC_ASSIGNMENTS
7372             WHERE   RESOURCE_ID = l_resource_id
7373             AND     RESOURCE_TYPE = l_resource_type
7374             AND     DEFAULT_CODE = 'IN' ;
7375 
7376              CURSOR get_source_meaning(l_type varchar2) IS
7377             select meaning
7378             from fnd_lookups
7379             where lookup_type = 'CSP_REQ_SOURCE_TYPE'
7380             and lookup_code = l_type;
7381 
7382             CURSOR get_item_type_meaning(l_item_type number) IS
7383             select meaning
7384             from mfg_lookups
7385             where lookup_type
7386             like 'MTL_RELATIONSHIP_TYPES'
7387             and lookup_code = l_item_type;
7388 
7389             CURSOR get_item_number(c_item_id NUMBER, c_org_id NUMBER) IS
7390             select CONCATENATED_SEGMENTS
7391             FROM   mtl_system_items_kfv
7392             where inventory_item_id = c_item_id
7393             and   organization_id = c_org_id;
7394 
7395             -- bug # 4618899
7396             CURSOR primary_uom_code(item_id NUMBER,org_id NUMBER) IS
7397             SELECT PRIMARY_UOM_CODE
7398             FROM   MTL_SYSTEM_ITEMS_B
7399             WHERE  INVENTORY_ITEM_ID = item_id
7400             AND    organization_id  = org_id;
7401             l_primary_uom varchar2(500);
7402 
7403       BEGIN
7404             l_items   := csp_sch_int_pvt.alternate_items_table_type();
7405             x_available_list   := csp_sch_int_pvt.ws_AVAILABLE_PARTS_tbl_TYP();
7406             --null;
7407         /*    OPEN get_default_subinventory(p_resource_list(1).resource_id,p_resource_list(1).resource_type);
7408             FETCH get_default_subinventory INTO l_org_id, l_subinv_code;
7409             CLOSE get_default_subinventory;
7410                  l_items.extend;
7411                  l_items(l_items.count).item                     := p_parts_list(1).item_id;
7412                  l_items(l_items.count).item_quantity            := p_parts_list(1).quantity;
7413                  l_items(l_items.count).item_uom                 := p_parts_list(1).item_uom;
7414                  l_items(l_items.count).alternate_item           := p_parts_list(1).item_id;
7415                  l_items(l_items.count).alternate_item_quantity  := p_parts_list(1).quantity;
7416                  l_items(l_items.count).alternate_item_uom       := p_parts_list(1).item_uom;
7417                  l_items(l_items.count).relation_type            := NULL;
7418               IF p_include_alternate = 'Y' THEN
7419                  get_alternates(p_parts_rec   => p_parts_list(1)
7420                                ,p_org_id      => l_org_id
7421                                ,px_alternate_items => l_items
7422                                ,x_return_status => x_return_status
7423                                ,x_msg_data      => x_msg_data
7424                                ,x_msg_count    => x_msg_count);
7425               END IF;*/
7426                 FOR J IN 1..p_resource_list.count LOOP
7427                     l_org_id := null;
7428                     l_subinv_code := null;
7429                     OPEN get_default_subinventory(p_resource_list(J).resource_id,p_resource_list(J).resource_type);
7430                     FETCH get_default_subinventory INTO l_org_id, l_subinv_code;
7431                     CLOSE get_default_subinventory;
7432                     IF l_org_id IS NOT NULL AND l_subinv_code IS NOT NULL THEN
7433                         IF l_items.count = 0 THEN
7434                             l_items.extend;
7435                             l_items(l_items.count).item                     := p_parts_list(1).item_id;
7436                             l_items(l_items.count).item_quantity            := p_parts_list(1).quantity;
7437                             l_items(l_items.count).item_uom                 := p_parts_list(1).item_uom;
7438                             l_items(l_items.count).alternate_item           := p_parts_list(1).item_id;
7439                             l_items(l_items.count).alternate_item_quantity  := p_parts_list(1).quantity;
7440                             l_items(l_items.count).alternate_item_uom       := p_parts_list(1).item_uom;
7441                             l_items(l_items.count).revision                 := p_parts_list(1).revision;
7442                             l_items(l_items.count).relation_type            := NULL;
7443                             IF p_include_alternate = 'Y' THEN
7444                                 get_alternates(p_parts_rec   => p_parts_list(1)
7445                                ,p_org_id      => l_org_id
7446                                ,px_alternate_items => l_items
7447                                ,x_return_status => x_return_status
7448                                ,x_msg_data      => x_msg_data
7449                                ,x_msg_count    => x_msg_count);
7450                             END IF;
7451                         END IF;
7452                     l_att := 0;
7453                         FOR I IN 1..l_items.count LOOP
7454                             CHECK_LOCAL_INVENTORY(p_org_id        => l_org_id
7455                                      ,p_subinv_code   => l_subinv_code
7456                                      ,p_item_id       => l_items(I).alternate_item
7457                                      ,p_revision      => l_items(I).revision
7458                                      ,x_att           => l_att
7459                                      ,x_onhand        => l_onhand
7460                                      ,x_return_status => x_return_status
7461                                      ,x_msg_data      => x_msg_data
7462                                      ,x_msg_count     => x_return_status);
7463                             IF l_att > 0  THEN
7464                                 x_available_list.extend;
7465                                 x_available_list(x_available_list.count).resource_id   :=   p_resource_list(J).resource_id;
7466                                 x_available_list(x_available_list.count).resource_type :=   p_resource_list(J).resource_type;
7467                                 x_available_list(x_available_list.count).distance      :=   p_resource_list(J).distance;
7468                                 x_available_list(x_available_list.count).unit          :=   p_resource_list(J).unit;
7469                                 x_available_list(x_available_list.count).phone_number  :=  p_resource_list(J).phone_number;
7470                                 x_available_list(x_available_list.count).name          :=   p_resource_list(J).name;
7471                                 x_available_list(x_available_list.count).item_id       := l_items(I).alternate_item;
7472                                 x_available_list(x_available_list.count).item_uom      := l_items(I).alternate_item_uom;
7473 
7474                               -- bug # 6955417
7475                               if l_items(I).relation_type is not NULL then
7476                                 OPEN get_item_type_meaning(l_items(I).relation_type);
7477                                 FETCH get_item_type_meaning INTO x_available_list(x_available_list.count).item_type ;
7478                                 CLOSE get_item_type_meaning;
7479                               end if;
7480 
7481                                 x_available_list(x_available_list.count).source_org_id := l_org_id;
7482                                 OPEN get_item_number(x_available_list(x_available_list.count).item_id ,x_available_list(x_available_list.count).source_org_id);
7483                                 FETCH  get_item_number INTO x_available_list(x_available_list.count).item_number;
7484                                 CLOSE get_item_number;
7485                                 x_available_list(x_available_list.count).sub_inventory_code  := l_subinv_code;
7486 
7487                           -- bug # 4618899
7488                           --x_available_list(x_available_list.count).available_quantity  := l_att;
7489                           --x_available_list(x_available_list.count).on_hand_quantity    := l_onhand;
7490 
7491 
7492                           open primary_uom_code(x_available_list(x_available_list.count).item_id ,x_available_list(x_available_list.count).source_org_id);
7493                           fetch primary_uom_code into l_primary_uom;
7494                           close primary_uom_code;
7495 
7496                           -- for available_quantity
7497                           x_available_list(x_available_list.count).available_quantity :=
7498                                 inv_convert.inv_um_convert(item_id => x_available_list(x_available_list.count).item_id
7499                                  , precision     => NULL  -- use default precision
7500                                  , from_quantity => l_att
7501                                  , from_unit     => l_primary_uom
7502                                  , to_unit       => x_available_list(x_available_list.count).item_uom
7503                                  , from_name     => NULL  -- from uom name
7504                                  , to_name       => NULL  -- to uom name
7505                                  );
7506 
7507                           -- for on_hand_quantity
7508                           x_available_list(x_available_list.count).on_hand_quantity :=
7509                                 inv_convert.inv_um_convert(item_id => x_available_list(x_available_list.count).item_id
7510                                  , precision     => NULL  -- use default precision
7511                                  , from_quantity => l_onhand
7512                                  , from_unit     => l_primary_uom
7513                                  , to_unit       => x_available_list(x_available_list.count).item_uom
7514                                  , from_name     => NULL  -- from uom name
7515                                  , to_name       => NULL  -- to uom name
7516                                  );
7517 
7518                                 x_available_list(x_available_list.count).arraival_date       := sysdate;
7519                                 OPEN  get_source_meaning('RES');
7520                                 FETCH get_source_meaning INTO x_available_list(x_available_list.count).source_type;
7521                                 CLOSE get_source_meaning;
7522                             END IF;
7523                           END LOOP;
7524                     END IF;
7525                 END LOOP;
7526       END ws_Check_other_eng_subinv;
7527 
7528        PROCEDURE ws_Check_organizations(p_resource_type IN varchar2
7529                                    ,p_resource_id  IN NUMBER
7530                                    ,p_parts_list    IN csp_sch_int_pvt.CSP_PARTS_TBL_TYP1
7531                                    ,p_include_alternate IN varchar2
7532                                    ,x_available_list   OUT NOCOPY csp_sch_int_pvt.ws_AVAILABLE_PARTS_tbl_TYP
7533                                    ,x_return_status   OUT NOCOPY varchar2
7534                                    ,x_msg_data      OUT NOCOPY varchar2
7535                                    ,x_msg_count      OUT NOCOPY  NUMBER) IS
7536 
7537             l_att NUMBER:=0;
7538             l_onhand NUMBER := 0;
7539             l_org_id NUMBER;
7540             l_subinv_code varchar2(30);
7541             l_items   csp_sch_int_pvt.alternate_items_table_type;
7542             l_unavailable_list        CSP_SCH_INT_PVT.CSP_UNAVAILABILITY_TBL_TYPE ;
7543             l_interval                CSP_SCH_INT_PVT.csp_sch_interval_rec_typ;
7544             l_available_list          CSP_SCH_INT_PVT.CSP_AVAILABILITY_TBL_TYPE ;
7545             l_temp_avail_list          CSP_SCH_INT_PVT.CSP_AVAILABILITY_TBL_TYPE ;
7546             l_final_unavailable_list  CSP_SCH_INT_PVT.CSP_UNAVAILABILITY_TBL_TYPE ;
7547             l_options                 CSP_SCH_INT_PVT.CSP_SHIP_PARAMETERS_TBL_TYPE;
7548              l_ship_count              CSP_SCH_INT_PVT.CSP_SHIP_METHOD_COUNT_TBL_TYP;
7549              l_res_ship_parameters      CSP_SCH_INT_PVT.CSP_ORGS_SHIP_PARAM_TBL_TYPE;
7550              l_temp_options            CSP_SCH_INT_PVT.CSP_SHIP_PARAMETERS_TBL_TYPE;
7551              l_final_option            CSP_SCH_INT_PVT.CSP_SHIP_PARAMETERS_TBL_TYPE;
7552              l_return_status           varchar2(10);
7553              p_need_by_date             date := null ;
7554              l_atleast_one_rec          BOOLEAN;
7555              min_cost                   NUMBER;
7556              min_arrival_date           DATE;
7557              rec_pointer                NUMBER;
7558 
7559             CURSOR get_default_subinventory(l_resource_id number, l_resource_type varchar2) IS
7560             SELECT  ORGANIZATION_ID, SUBINVENTORY_CODE
7561             FROM    CSP_INV_LOC_ASSIGNMENTS
7562             WHERE   RESOURCE_ID = l_resource_id
7563             AND     RESOURCE_TYPE = l_resource_type
7564             AND     DEFAULT_CODE = 'IN' ;
7565 
7566              CURSOR get_source_meaning(l_type varchar2) IS
7567             select meaning
7568             from fnd_lookups
7569             where lookup_type = 'CSP_REQ_SOURCE_TYPE'
7570             and lookup_code = l_type;
7571 
7572             CURSOR get_item_type_meaning(l_item_type number) IS
7573             select meaning
7574             from mfg_lookups
7575             where lookup_type
7576             like 'MTL_RELATIONSHIP_TYPES'
7577             and lookup_code = l_item_type;
7578 
7579             CURSOR get_location_id(c_org_id NUMBER) IS
7580             select location_id
7581             from HR_ALL_ORGANIZATION_UNITS
7582             where organization_id = c_org_id;
7583 
7584             CURSOR get_item_number(c_item_id NUMBER, c_org_id NUMBER) IS
7585             select CONCATENATED_SEGMENTS
7586             FROM   mtl_system_items_kfv
7587             where inventory_item_id = c_item_id
7588             and   organization_id = c_org_id;
7589 
7590             CURSOR get_shpping_method_meaning(c_ship_method varchar2) IS
7591             select meaning
7592             from   OE_SHIP_METHODS_V
7593             where  lookup_code = c_ship_method;
7594 
7595       BEGIN
7596 
7597             l_unavailable_list  :=     CSP_SCH_INT_PVT.CSP_UNAVAILABILITY_TBL_TYPE() ;
7598             l_available_list    :=     CSP_SCH_INT_PVT.CSP_AVAILABILITY_TBL_TYPE();
7599             l_final_unavailable_list := CSP_SCH_INT_PVT.CSP_UNAVAILABILITY_TBL_TYPE() ;
7600 
7601              l_ship_count            :=  CSP_SCH_INT_PVT.CSP_SHIP_METHOD_COUNT_TBL_TYP();
7602              l_res_ship_parameters   :=  CSP_SCH_INT_PVT.CSP_ORGS_SHIP_PARAM_TBL_TYPE();
7603              l_temp_options          := CSP_SCH_INT_PVT.CSP_SHIP_PARAMETERS_TBL_TYPE ();
7604              l_final_option          := CSP_SCH_INT_PVT.CSP_SHIP_PARAMETERS_TBL_TYPE ();
7605              x_available_list   := csp_sch_int_pvt.ws_AVAILABLE_PARTS_tbl_TYP();
7606              l_items           := csp_sch_int_pvt.alternate_items_table_type();
7607             l_temp_avail_list   :=  CSP_SCH_INT_PVT.CSP_AVAILABILITY_TBL_TYPE() ;
7608             OPEN get_default_subinventory(p_resource_id,p_resource_type);
7609             FETCH get_default_subinventory INTO l_org_id, l_subinv_code;
7610             CLOSE get_default_subinventory;
7611                  l_items.extend;
7612                  l_items(l_items.count).item                     := p_parts_list(1).item_id;
7613                  l_items(l_items.count).item_quantity            := p_parts_list(1).quantity;
7614                  l_items(l_items.count).item_uom                 := p_parts_list(1).item_uom;
7615                  l_items(l_items.count).alternate_item           := p_parts_list(1).item_id;
7616                  l_items(l_items.count).alternate_item_quantity  := p_parts_list(1).quantity;
7617                  l_items(l_items.count).alternate_item_uom       := p_parts_list(1).item_uom;
7618                  l_items(l_items.count).relation_type            := NULL;
7619               IF p_include_alternate = 'Y' THEN
7620                  get_alternates(p_parts_rec   => p_parts_list(1)
7621                                ,p_org_id      => l_org_id
7622                                ,px_alternate_items => l_items
7623                                ,x_return_status => x_return_status
7624                                ,x_msg_data      => x_msg_data
7625                                ,x_msg_count    => x_msg_count);
7626               END IF;
7627             FOR J IN 1..l_items.count LOOP
7628                     l_unavailable_list.extend;
7629                     l_unavailable_list(l_unavailable_list.count).resource_type     := p_resource_type;
7630                     l_unavailable_list(l_unavailable_list.count).resource_id       := p_resource_id;
7631                     l_unavailable_list(l_unavailable_list.count).organization_id   := l_org_id;
7632                     l_unavailable_list(l_unavailable_list.count).item_id           := l_items(J).alternate_item;
7633                     l_unavailable_list(l_unavailable_list.count).item_uom          := l_items(J).alternate_item_uom;
7634                     l_unavailable_list(l_unavailable_list.count).quantity          := l_items(J).alternate_item_quantity;
7635                    -- l_unavailable_list(l_unavailable_list.count).ship_set_name     := p_parts_list(I).ship_set_name;
7636                     l_unavailable_list(l_unavailable_list.count).item_type         := l_items(J).relation_type ;
7637                     l_unavailable_list(l_unavailable_list.count).line_id          := 1;
7638             END LOOP;
7639         IF l_unavailable_list.count >=1 THEN
7640             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);
7641         END IF;
7642      IF l_available_list.count > 0 THEN
7643              l_atleast_one_rec := FALSE;
7644          FOR J IN 1..l_available_list.count LOOP
7645             l_temp_avail_list.extend;
7646             l_temp_avail_list(1) := l_available_list(J);
7647             l_options                := CSP_SCH_INT_PVT.CSP_SHIP_PARAMETERS_TBL_TYPE();
7648             l_temp_options          := CSP_SCH_INT_PVT.CSP_SHIP_PARAMETERS_TBL_TYPE ();
7649             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);
7650             l_temp_avail_list.trim;
7651             min_cost := null;
7652             min_arrival_date := null;
7653             rec_pointer := null;
7654             FOR I IN 1..l_options.count LOOP
7655                 IF ROUND(((l_options(I).arrival_date - sysdate) * 24),2) <=  ROUND(((p_need_by_date - sysdate) * 24),2)
7656                 OR p_need_by_date IS NULL THEN
7657                 l_temp_options.extend;
7658                 l_temp_options(l_temp_options.count).resource_id       :=  l_options(I).resource_id;
7659                 l_temp_options(l_temp_options.count).resource_type     :=  l_options(I).resource_type;
7660                 l_temp_options(l_temp_options.count).lead_time         :=  l_options(I).lead_time   ;
7661                 l_temp_options(l_temp_options.count).transfer_cost     :=  l_options(I).transfer_cost;
7662                 l_temp_options(l_temp_options.count).shipping_methodes :=  l_options(I).shipping_methodes;
7663                 l_temp_options(l_temp_options.count).arrival_date      :=  l_options(I).arrival_date ;
7664                 l_atleast_one_rec := TRUE;
7665                 IF p_need_by_date is not null then
7666                  IF min_cost is null then
7667                     min_cost :=  l_temp_options(l_temp_options.count).transfer_cost;
7668                     rec_pointer := l_temp_options.count;
7669                  ELSE
7670                     IF min_cost > l_temp_options(l_temp_options.count).transfer_cost THEN
7671                        min_cost := l_temp_options(l_temp_options.count).transfer_cost;
7672                        rec_pointer := l_temp_options.count;
7673                     END IF;
7674                  END IF;
7675                 ELSE
7676                    if  min_arrival_date is null then
7677                         min_arrival_date := l_temp_options(l_temp_options.count).arrival_date;
7678                         rec_pointer := l_temp_options.count;
7679                    ELSE
7680                         IF min_arrival_date > l_temp_options(l_temp_options.count).arrival_date THEN
7681                             min_arrival_date := l_temp_options(l_temp_options.count).arrival_date;
7682                             rec_pointer := l_temp_options.count;
7683                         END IF;
7684                    END IF;
7685                   END IF;
7686                 END IF;
7687              END LOOP;
7688                IF l_temp_options.count > 0 THEN
7689                     l_available_list(J).shipping_methode := l_temp_options(rec_pointer).shipping_methodes;
7690                     l_available_list(J).intransit_time := l_temp_options(rec_pointer).lead_time  ;
7691                ELSE
7692                     l_available_list(J).item_id := NULL;
7693                END IF;
7694            END LOOP;
7695                IF not l_atleast_one_rec THEN
7696                     FND_MESSAGE.SET_NAME('CSP', 'CSP_UNABLE_NEED_BY_DATE');
7697                     FND_MSG_PUB.ADD;
7698                     fnd_msg_pub.count_and_get
7699                     ( p_count => x_msg_count
7700                     , p_data  => x_msg_data);
7701                END IF;
7702      END IF;
7703          FOR J IN 1..l_available_list.count LOOP
7704                 x_available_list.extend;
7705                 x_available_list(x_available_list.count).item_uom          :=  p_parts_list(1).item_uom ;
7706 
7707                 x_available_list(x_available_list.count).item_id          :=  l_available_list(J).item_id ;
7708                 x_available_list(x_available_list.count).source_org_id    :=  l_available_list(J).source_org;
7709                 OPEN get_item_number(x_available_list(x_available_list.count).item_id ,x_available_list(x_available_list.count).source_org_id);
7710                 FETCH  get_item_number INTO x_available_list(x_available_list.count).item_number;
7711                 CLOSE get_item_number;
7712                 OPEN get_location_id(x_available_list(x_available_list.count).source_org_id);
7713                 FETCH get_location_id INTO x_available_list(x_available_list.count).location_id;
7714                 CLOSE get_location_id;
7715                 OPEN get_shpping_method_meaning(l_available_list(J).shipping_methode);
7716                 FETCH get_shpping_method_meaning INTO x_available_list(x_available_list.count).shipping_methode;
7717                 CLOSE get_shpping_method_meaning;
7718                  x_available_list(x_available_list.count).shipping_method_code := l_available_list(J).shipping_methode;
7719               --  x_available_list(x_available_list.count).shipping_methode :=  l_available_list(J).shipping_methode;
7720                 OPEN get_item_type_meaning(l_available_list(J).item_type);
7721                 FETCH get_item_type_meaning INTO x_available_list(x_available_list.count).item_type;
7722                 CLOSE get_item_type_meaning;
7723                --x_available_list(x_available_list.count).item_type        :=  l_available_list(J).item_type ;
7724                 x_available_list(x_available_list.count).sub_inventory_code := l_available_list(J).sub_inventory;
7725                 x_available_list(x_available_list.count).available_quantity := l_available_list(J).available_quantity;
7726                     IF l_available_list(J).shipping_methode IS NOT NULL THEN
7727                         x_available_list(x_available_list.count).source_type      := 'IO' ;
7728                         IF p_need_by_date IS NOT NULL THEN
7729                             x_available_list(x_available_list.count).arraival_date    := p_need_by_date ;
7730                             x_available_list(x_available_list.count).order_by_date    := x_available_list(x_available_list.count).arraival_date
7731                                                                    - l_available_list(J).intransit_time/24 ;
7732                         ELSE
7733                             x_available_list(x_available_list.count).arraival_date    := get_arrival_date(SYSDATE,
7734                                                                                         l_available_list(J).intransit_time,
7735                                                                                         l_org_id);
7736                             x_available_list(x_available_list.count).order_by_date    := SYSDATE;
7737                         END IF;
7738                    ELSE
7739                         x_available_list(x_available_list.count).source_type      := 'RES' ;
7740                    END IF;
7741          END LOOP;
7742 
7743       END ws_Check_organizations;
7744       PROCEDURE get_alternates(p_parts_rec    IN csp_sch_int_pvt.CSP_PARTS_REC_TYPE
7745                                ,p_org_id      IN  NUMBER
7746                                ,px_alternate_items IN OUT NOCOPY csp_sch_int_pvt.alternate_items_table_type
7747                                ,x_return_status OUT NOCOPY varchar2
7748                                ,x_msg_data      OUT NOCOPY varchar2
7749                                ,x_msg_count     OUT NOCOPY NUMBER)  IS
7750 
7751        l_temp_quantity NUMBER := 0;
7752        l_uom_code     varchar2(10);
7753        l_supersede_items  CSP_SUPERSESSIONS_PVT.NUMBER_ARR;
7754        l_substitute_item NUMBER;
7755 
7756         CURSOR primary_uom_code(item_id NUMBER,org_id NUMBER) IS
7757         SELECT PRIMARY_UOM_CODE
7758         FROM   MTL_SYSTEM_ITEMS_B
7759         WHERE  INVENTORY_ITEM_ID = item_id
7760         AND    organization_id  = org_id;
7761 
7762         CURSOR substitutes(item_id NUMBER,org_id NUMBER) IS
7763        /* SELECT mri.RELATED_ITEM_ID
7764         FROM   MTL_RELATED_ITEMS_VIEW mri, mtl_parameters mp
7765         WHERE  mp.organization_id = org_id
7766         AND    mri.INVENTORY_ITEM_ID = item_id
7767         AND    mri.RELATIONSHIP_TYPE_ID = 2
7768         AND    mri.ORGANIZATION_ID  = MP.MASTER_ORGANIZATION_ID;*/
7769         SELECT mri.RELATED_ITEM_ID
7770         FROM   MTL_RELATED_ITEMS mri, mtl_parameters mp
7771         WHERE  mp.organization_id = org_id
7772         AND    mri.INVENTORY_ITEM_ID = item_id
7773         AND    mri.RELATIONSHIP_TYPE_ID = 2
7774         AND    mri.ORGANIZATION_ID  = MP.MASTER_ORGANIZATION_ID;
7775 
7776 
7777 
7778       BEGIN
7779                     CSP_SUPERSESSIONS_PVT.get_supersede_bilateral_items(p_inventory_item_id => p_parts_rec.item_id
7780                                                     ,p_organization_id => p_org_id
7781                                                     ,x_supersede_items => l_supersede_items);
7782                     FOR J IN 1..l_supersede_items.count LOOP
7783                         l_uom_code := null;
7784                         OPEN primary_uom_code(l_supersede_items(J),p_org_id);
7785                         LOOP
7786                         FETCH primary_uom_code INTO l_uom_code;
7787                         EXIT WHEN primary_uom_code% NOTFOUND;
7788                         END LOOP;
7789                         CLOSE primary_uom_code;
7790 
7791                         l_temp_quantity :=
7792                         inv_convert.inv_um_convert(item_id       => l_supersede_items(J)
7793                                                  , precision     => NULL  -- use default precision
7794                                                  , from_quantity => p_parts_rec.quantity
7795                                                  , from_unit     => p_parts_rec.item_uom
7796                                                  , to_unit       => l_uom_code
7797                                                  , from_name     => NULL  -- from uom name
7798                                                  , to_name       => NULL  -- to uom name
7799                                                  );
7800                         px_alternate_items.extend;
7801                         px_alternate_items(px_alternate_items.count).item                     := p_parts_rec.item_id;
7802                         px_alternate_items(px_alternate_items.count).item_quantity            := p_parts_rec.quantity;
7803                         px_alternate_items(px_alternate_items.count).item_uom                 := p_parts_rec.item_uom;
7804                         px_alternate_items(px_alternate_items.count).alternate_item           := l_supersede_items(J);
7805                         px_alternate_items(px_alternate_items.count).alternate_item_quantity  := l_temp_quantity;
7806                         px_alternate_items(px_alternate_items.count).alternate_item_uom       := l_uom_code;
7807                         px_alternate_items(px_alternate_items.count).relation_type            := 8;
7808                         l_temp_quantity := 0;
7809                         l_uom_code := NULL;
7810                     END LOOP;
7811                     OPEN substitutes(p_parts_rec.item_id, p_org_id);
7812                     LOOP
7813                     FETCH substitutes INTO l_substitute_item;
7814                     EXIT WHEN substitutes % NOTFOUND;
7815                          l_uom_code := null;
7816                         OPEN primary_uom_code(l_substitute_item,p_org_id);
7817                         LOOP
7818                         FETCH primary_uom_code INTO l_uom_code;
7819                         EXIT WHEN primary_uom_code% NOTFOUND;
7820                         END LOOP;
7821                         CLOSE primary_uom_code;
7822                         l_temp_quantity :=
7823                         inv_convert.inv_um_convert(item_id       => l_substitute_item
7824                                                  , precision     => NULL  -- use default precision
7825                                                  , from_quantity => p_parts_rec.quantity
7826                                                  , from_unit     => p_parts_rec.item_uom
7827                                                  , to_unit       => l_uom_code
7828                                                  , from_name     => NULL  -- from uom name
7829                                                  , to_name       => NULL  -- to uom name
7830                                                  );
7831                         px_alternate_items.extend;
7832                         px_alternate_items(px_alternate_items.count).item                     := p_parts_rec.item_id;
7833                         px_alternate_items(px_alternate_items.count).item_quantity            := p_parts_rec.quantity;
7834                         px_alternate_items(px_alternate_items.count).item_uom                 := p_parts_rec.item_uom;
7835                         px_alternate_items(px_alternate_items.count).alternate_item           := l_substitute_item;
7836                         px_alternate_items(px_alternate_items.count).alternate_item_quantity  := l_temp_quantity;
7837                         px_alternate_items(px_alternate_items.count).alternate_item_uom       := l_uom_code;
7838                         px_alternate_items(px_alternate_items.count).relation_type            := 2;
7839                         l_temp_quantity := 0;
7840                         l_uom_code := NULL;
7841                     END LOOP;
7842                     CLOSE substitutes;
7843       END get_alternates;
7844        FUNCTION get_arrival_date(p_ship_date IN DATE,
7845                                 p_lead_time IN NUMBER,
7846                                 p_org_id IN NUMBER) return  DATE IS
7847 
7848         l_lead_time number;
7849         l_calendar_code varchar2(10);
7850         l_exception_set_id number;
7851         l_expected_arrival_date date;
7852         l_arrival_date date;
7853         l_no_of_days number;
7854         l_lead_time_in_days number;
7855 
7856 
7857         CURSOR csp_resource_calendar  IS
7858         SELECT  mp.calendar_code,mp.calendar_exception_set_id
7859         FROM    mtl_parameters mp
7860         where     mp.organization_id = p_org_id;
7861 
7862 
7863         cursor get_arrival_seq_number(c_calendar_code varchar2,
7864                                        c_exception_set_id number,
7865                                        c_calendar_date date,
7866                                        c_lead_time number) IS
7867         select bcd1.calendar_date
7868         from bom_calendar_dates bcd,
7869              bom_calendar_dates bcd1
7870         where bcd.calendar_code = c_calendar_code
7871         and   bcd.exception_set_id = c_exception_set_id
7872         and   bcd.calendar_date = c_calendar_date
7873         and   bcd1.calendar_code = bcd.calendar_code
7874         and   bcd1.exception_set_id = bcd.exception_set_id
7875         and   bcd1.seq_num = (bcd.seq_num + c_lead_time);
7876 
7877         cursor get_seq_number(c_calendar_code varchar2,
7878                                        c_exception_set_id number,
7879                                        c_calendar_date date)
7880                                       IS
7881           select bcd.seq_num
7882           from bom_calendar_dates bcd
7883           where   bcd.calendar_code = c_calendar_code
7884             and   bcd.exception_set_id = c_exception_set_id
7885             and   bcd.calendar_date = c_calendar_date;
7886 
7887      BEGIN
7888         OPEN csp_resource_calendar;
7889         FETCH csp_resource_calendar INTO l_calendar_code,l_exception_set_id ;
7890         CLOSE csp_resource_calendar;
7891         IF l_calendar_code is null then
7892             l_arrival_date := p_ship_date +  (p_lead_time * (1/24));
7893             return l_arrival_date;
7894         END IF;
7895         l_lead_time_in_days :=    p_lead_time * (1/24);
7896 -- bug 3925273        l_expected_arrival_date := p_ship_date + l_lead_time_in_days;
7897         l_expected_arrival_date := trunc(p_ship_date) + (sysdate - trunc(sysdate)) + l_lead_time_in_days;
7898         l_no_of_days := trunc(l_expected_arrival_date) - trunc(p_ship_date);
7899         IF  l_no_of_days  >  0  THEN
7900             OPEN get_arrival_seq_number(l_calendar_code,
7901                                         l_exception_set_id,
7902                                        trunc(p_ship_date),
7903                                        trunc(l_no_of_days));
7904             FETCH get_arrival_seq_number INTO l_arrival_date;
7905             CLOSE get_arrival_seq_number;
7906             l_arrival_date := l_arrival_date + (l_expected_arrival_date - trunc(l_expected_arrival_date));
7907         ELSE
7908             l_arrival_date  := l_expected_arrival_date;
7909         END IF;
7910         return   trunc(l_arrival_date,'MI');
7911      END;
7912   FUNCTION get_order_by_date(p_org_id IN NUMBER,
7913                                 p_ship_method varchar2,
7914                                 p_need_by_date IN DATE,
7915                                 p_lead_time IN NUMBER,
7916                                 p_to_org_id IN NUMBER) return  DATE IS
7917 
7918         l_lead_time number;
7919         l_calendar_code varchar2(10);
7920         l_exception_set_id number;
7921         l_expected_arrival_date date;
7922         l_order_by_date date;
7923         l_no_of_days number;
7924         l_lead_time_in_days number;
7925         l_cutoff_time   date;
7926         l_server_cutoff_time date;
7927         l_server_cutoff_hours number;
7928         l_timezone_id number;
7929         l_server_time_zone_id number;
7930         l_return_status varchar2(10);
7931         l_msg_count number;
7932         l_msg_data  varchar2(2000);
7933 
7934         CURSOR csp_resource_calendar  IS
7935         SELECT  mp.calendar_code,mp.calendar_exception_set_id
7936         FROM    mtl_parameters mp
7937         WHERE   mp.organization_id = p_to_org_id ;
7938 
7939 
7940         cursor get_arrival_seq_number(c_calendar_code varchar2,
7941                                        c_exception_set_id number,
7942                                        c_calendar_date date,
7943                                        c_lead_time number) IS
7944         select bcd1.calendar_date
7945         from bom_calendar_dates bcd,
7946              bom_calendar_dates bcd1
7947         where bcd.calendar_code = c_calendar_code
7948         and   bcd.exception_set_id = c_exception_set_id
7949         and   bcd.calendar_date = c_calendar_date
7950         and   bcd1.calendar_code = bcd.calendar_code
7951         and   bcd1.exception_set_id = bcd.exception_set_id
7952         and   bcd1.seq_num = (bcd.seq_num - c_lead_time);
7953 
7954         cursor get_seq_number(c_calendar_code varchar2,
7955                                        c_exception_set_id number,
7956                                        c_calendar_date date)
7957                                       IS
7958           select bcd.seq_num
7959           from bom_calendar_dates bcd
7960           where   bcd.calendar_code = c_calendar_code
7961             and   bcd.exception_set_id = c_exception_set_id
7962             and   bcd.calendar_date = c_calendar_date;
7963 
7964         cursor get_cutoff_time(c_org_id number,
7965                                c_ship_method_code varchar2) IS
7966             select cutoff_time,timezone_id
7967             from CSP_CARRIER_DELIVERY_TIMES
7968             where  ORGANIZATION_ID = c_org_id
7969             and    SHIPPING_METHOD = c_ship_method_code;
7970 
7971      BEGIN
7972         l_server_time_zone_id   := FND_PROFILE.VALUE(NAME => 'SERVER_TIMEZONE_ID');
7973         OPEN csp_resource_calendar;
7974         FETCH csp_resource_calendar INTO l_calendar_code,l_exception_set_id ;
7975         CLOSE csp_resource_calendar;
7976         IF l_calendar_code is null then
7977             l_order_by_date := p_need_by_date -  (p_lead_time * (1/24));
7978             return l_order_by_date;
7979         END IF;
7980         l_lead_time_in_days :=    p_lead_time * (1/24);
7981         l_expected_arrival_date := p_need_by_date - l_lead_time_in_days;
7982         l_no_of_days :=  trunc(p_need_by_date) - trunc(l_expected_arrival_date);
7983         IF  l_no_of_days  >  0  THEN
7984             OPEN get_arrival_seq_number(l_calendar_code,
7985                                         l_exception_set_id,
7986                                        trunc(p_need_by_date),
7987                                        trunc(l_no_of_days));
7988             FETCH get_arrival_seq_number INTO l_order_by_date;
7989             CLOSE get_arrival_seq_number;
7990             l_order_by_date := l_order_by_date + (l_expected_arrival_date - trunc(l_expected_arrival_date));
7991         ELSE
7992             l_order_by_date  := l_expected_arrival_date;
7993         END IF;
7994         OPEN get_cutoff_time(p_org_id,p_ship_method);
7995         FETCH get_cutoff_time INTO l_cutoff_time ,  l_timezone_id;
7996         CLOSE get_cutoff_time;
7997         IF l_cutoff_time IS NOT NULL and l_server_time_zone_id IS NOT NULL THEN
7998             HZ_TIMEZONE_PUB.Get_Time(   p_api_version  => 1.0,
7999                                     p_init_msg_list  => FND_API.G_FALSE,
8000                                     p_source_tz_id   => l_timezone_id,
8001                                     p_dest_tz_id     => l_server_time_zone_id,
8002                                     p_source_day_time  => l_cutoff_time,
8003                                     x_dest_day_time    => l_server_cutoff_time,
8004                                     x_return_status    => l_return_status ,
8005                                     x_msg_count        => l_msg_count ,
8006                                     x_msg_data         => l_msg_data);
8007             IF l_return_status <> 'S' THEN
8008                 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);
8009             ELSE
8010                 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);
8011             END IF;
8012            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
8013                 l_order_by_date := trunc(l_order_by_date) + round(((l_server_cutoff_hours -60)/(24*60)),2);
8014             END IF;
8015         END IF;
8016         return l_order_by_date;
8017      END;
8018       procedure get_session_id(p_database_link IN varchar2, x_sesssion_id OUT NOCOPY NUMBER) IS
8019      PRAGMA AUTONOMOUS_TRANSACTION;
8020         l_statement varchar2(1000);
8021         l_statement1 varchar2(1000);
8022      BEGIN
8023         BEGIN
8024         l_statement := 'Select MRP_ATP_SCHEDULE_TEMP_S.NextVal From   Dual@'
8025                          || p_database_link;
8026                 EXECUTE IMMEDIATE l_statement
8027                 INTO x_sesssion_id;
8028         END;
8029         commit;
8030         Begin
8031         l_statement1 := 'alter session close database link ' ||p_database_link;
8032                 EXECUTE IMMEDIATE l_statement1;
8033         END;
8034      END;
8035 
8036       PROCEDURE TASK_POST_CANCEL( x_return_status out nocopy varchar2) IS
8037 
8038            l_task_id NUMBER;
8039            l_task_status_id NUMBER;
8040             l_order_id  NUMBER;
8041             l_req_details_line_id NUMBER;
8042             l_reserv_id NUMBER;
8043             l_status varchar2(30);
8044             l_return_status varchar2(3);
8045             x_msg_data varchar2(4000);
8046             x_msg_count NUMBER;
8047             l_cleanup_needed Varchar2(1) := 'N';
8048 
8049     CURSOR get_reservations is
8050     select crld.source_id , crld.req_line_detail_id
8051     from  csp_req_line_details crld
8052          ,csp_requirement_lines crl
8053          ,csp_requirement_headers crh
8054     where  crh.task_id = l_task_id
8055     and crl.requirement_header_id = crh.requirement_header_id
8056     and crld.requirement_line_id = crl.requirement_line_id
8057     and crld.source_type = 'RES' ;
8058 
8059     CURSOR get_orders is
8060     select oeh.header_id, crld.req_line_detail_id
8061     from  csp_req_line_details crld
8062          ,csp_requirement_lines crl
8063          ,csp_requirement_headers crh
8064          ,oe_order_lines_all oel
8065          ,oe_order_headers_all oeh
8066     where  crh.task_id = l_task_id
8067     and crl.requirement_header_id = crh.requirement_header_id
8068     and crld.requirement_line_id = crl.requirement_line_id
8069     and crld.source_type = 'IO'
8070     and oel.line_id = crld.source_id
8071     and oeh.header_id =  oel.header_id
8072     order by oeh.header_id;
8073 
8074     CURSOR get_order_status(c_header_id NUMBER) IS
8075     select flow_status_code
8076     from   oe_order_headers_all
8077     where  header_id =  c_header_id;
8078 
8079     cursor cleanup_needed IS
8080     select 'Y'
8081     from jtf_task_statuses_vl
8082     where task_status_id = l_task_status_id
8083     and ( CANCELLED_FLAG = 'Y' or rejected_flag = 'Y');
8084 
8085     cursor get_line_details(c_order_header_id Number) is
8086     select REQ_LINE_DETAIL_ID
8087     from  csp_req_line_details crld,oe_order_lines_all oel
8088     where crld.source_id = oel.line_id
8089     and crld.source_type = 'IO'
8090     and oel.header_id = c_order_header_id;
8091 
8092      BEGIN
8093         x_return_status :=  FND_API.G_RET_STS_SUCCESS;
8094         l_return_status := FND_API.G_RET_STS_SUCCESS;
8095          l_task_id := jtf_tasks_pub.p_task_user_hooks.task_id;
8096          l_task_status_id := jtf_tasks_pub.p_task_user_hooks.task_status_id;
8097          OPEN cleanup_needed;
8098          FETCH cleanup_needed INTO l_cleanup_needed;
8099          CLOSE cleanup_needed;
8100        IF l_cleanup_needed = 'Y' THEN
8101          OPEN get_reservations ;
8102          LOOP
8103             FETCH get_reservations INTO l_reserv_id,l_req_details_line_id;
8104             EXIT WHEN  get_reservations%NOTFOUND;
8105                 CSP_SCH_INT_PVT.CANCEL_RESERVATION(l_reserv_id,l_return_status,x_msg_data,x_msg_count);
8106                 IF l_return_status = FND_API.G_RET_STS_UNEXP_ERROR  THEN
8107                      x_return_status := FND_API.G_RET_STS_SUCCESS;
8108                 ELSIF l_return_status = FND_API.G_RET_STS_SUCCESS THEN
8109                     delete from csp_req_line_details where req_line_detail_id = l_req_details_line_id;
8110                 END IF;
8111          END LOOP;
8112          close get_reservations;
8113             OPEN get_orders;
8114             LOOP
8115                 FETCH get_orders INTO l_order_id ,l_req_details_line_id ;
8116                 EXIT WHEN get_orders% NOTFOUND;
8117                 OPEN get_order_status(l_order_id);
8118                 FETCH get_order_status INTO l_status;
8119                 CLOSE get_order_status;
8120                 IF l_status <> 'CANCELLED' THEN
8121                    CSP_SCH_INT_PVT.CANCEL_ORDER(l_order_id,l_return_status,x_msg_data,x_msg_count);
8122                    IF l_return_status = FND_API.G_RET_STS_UNEXP_ERROR THEN
8123                        x_return_status := FND_API.G_RET_STS_SUCCESS;
8124                    ELSIF l_return_status =  FND_API.G_RET_STS_SUCCESS THEN
8125                      open get_line_details(l_order_id);
8126                      LOOP
8127                          FETCH get_line_details INTO l_req_details_line_id;
8128                          EXIT WHEN get_line_details% NOTFOUND;
8129                             delete from csp_req_line_details where req_line_detail_id = l_req_details_line_id;
8130                      END LOOP;
8131                      CLOSE get_line_details;
8132                    END IF;
8133                 END IF;
8134             END LOOP;
8135             CLOSE get_orders;
8136         END IF;
8137      END;
8138       PROCEDURE   CREATE_RES_FOR_RCV_TRANXS(p_transaction_id IN NUMBER
8139                                            ,x_return_Status  OUT NOCOPY varchar2
8140                                            ,x_msg_data OUT NOCOPY varchar2) IS
8141 
8142         CURSOR get_res_detail IS
8143         select mmt.transaction_quantity transaction_quantity ,mmt.inventory_item_id  item_id,
8144                mmt.revision revision, mmt.organization_id org_id,mmt.subinventory_code subinv_code,
8145                crld.source_id line_id, mmt.transaction_uom uom,crh.need_by_date need_by_date,
8146                crld.requirement_line_id requirement_line_id,rcl.quantity_shipped quantity_shipped,
8147                rcl.quantity_received quantity_received,crld.req_line_detail_id req_line_detail_id
8148         from mtl_material_transactions mmt,RCV_SHIPMENT_headers rsh,
8149             rcv_shipment_lines rcl,
8150             oe_order_lines_all oola,csp_req_line_details crld,
8151             csp_requirement_lines crl,
8152             csp_requirement_headers crh
8153         where mmt.transaction_id = p_transaction_id
8154         and mmt.shipment_number = rsh.shipment_num
8155         and rsh.shipment_header_id = rcl.shipment_header_id
8156         and oola.source_document_line_id = rcl.requisition_line_id
8157         and crld.source_id = oola.line_id
8158         and mmt.source_code = 'RCV'
8159         and crld.source_type = 'IO'
8160         and crld.requirement_line_id = crl.requirement_line_id
8161         and crh.requirement_header_id = crl.requirement_header_id
8162            and crh.task_id is not null
8163          UNION
8164          select mmt.transaction_quantity transaction_quantity ,mmt.inventory_item_id  item_id,
8165                mmt.revision revision, mmt.organization_id org_id,mmt.subinventory_code subinv_code,
8166                crld.source_id line_id, mmt.transaction_uom uom,crh.need_by_date need_by_date,
8167                crld.requirement_line_id requirement_line_id, mmt.transaction_quantity quantity_shipped,
8168                mmt.transaction_quantity quantity_received,crld.req_line_detail_id req_line_detail_id
8169          from mtl_material_transactions mmt,
8170             oe_order_lines_all oola,csp_req_line_details crld,
8171             csp_requirement_lines crl,csp_requirement_headers crh
8172           where mmt.transaction_id = p_transaction_id
8173           and  oola.source_document_id = mmt.transaction_source_id
8174            and crld.source_id = oola.line_id
8175         and (mmt.source_code = 'ORDER ENTRY')
8176         and TRANSACTION_QUANTITY > 0
8177         and crld.source_type = 'IO'
8178         and crld.requirement_line_id = crl.requirement_line_id
8179         and crh.requirement_header_id = crl.requirement_header_id
8180            and crh.task_id is not null;
8181 
8182          l_reservation_parts CSP_SCH_INT_PVT.RESERVATION_REC_TYP;
8183          l_reservation_id NUMBER;
8184          l_req_line_detali_id NUMBER;
8185 
8186       BEGIN
8187         FOR grd in get_res_detail LOOP
8188                 l_reservation_id := NULL;
8189                 l_reservation_parts.need_by_date       := nvl(grd.need_by_date,sysdate);
8190                 l_reservation_parts.organization_id    := grd.org_id ;
8191                 l_reservation_parts.item_id            := grd.item_id;
8192                 l_reservation_parts.item_uom_code      := grd.uom;
8193                 l_reservation_parts.quantity_needed    := grd.transaction_quantity ;
8194                 l_reservation_parts.sub_inventory_code := grd.subinv_code ;
8195                 l_reservation_parts.line_id            := p_transaction_id;
8196                 l_reservation_parts.revision           := grd.revision;
8197                 l_reservation_id := csp_sch_int_pvt.CREATE_RESERVATION(l_reservation_parts
8198                                                                         ,x_return_status
8199                                                                         ,x_msg_data );
8200                 l_req_line_detali_id := NULL;
8201                 IF l_reservation_id IS NOT NULL AND l_reservation_id >0 THEN
8202                         csp_req_line_details_pkg.insert_row(px_req_line_detail_id => l_req_line_detali_id
8203                                               ,p_requirement_line_id => grd.requirement_line_id
8204                                               ,p_created_by => FND_GLOBAL.user_id
8205                                               ,p_creation_date => sysdate
8206                                               ,p_last_updated_by =>  FND_GLOBAL.user_id
8207                                               ,p_last_update_date => sysdate
8208                                               ,p_last_update_login => FND_GLOBAL.login_id
8209                                               ,p_source_type => 'RES'
8210                                               ,p_source_id => l_reservation_id );
8211 
8212                 IF grd.quantity_shipped = grd.quantity_received THEN
8213                  csp_req_line_details_pkg.delete_row(grd.req_line_detail_id);
8214                END IF;
8215            END IF;
8216         END LOOP;
8217       END CREATE_RES_FOR_RCV_TRANXS;
8218        PROCEDURE cancel_order_line(
8219               p_order_line_id IN NUMBER,
8220               p_cancel_reason IN Varchar2,
8221               x_return_status OUT NOCOPY VARCHAR2,
8222               x_msg_count     OUT NOCOPY NUMBER,
8223               x_msg_data      OUT NOCOPY VARCHAR2) IS
8224        BEGIN
8225             csp_parts_order.cancel_order_line(p_order_line_id
8226                                         ,p_cancel_reason
8227                                         ,x_return_status
8228                                         ,x_msg_count
8229                                         ,x_msg_data);
8230        END;
8231      PROCEDURE DELETE_RESERVATION(p_reservation_id IN NUMBER
8232                                 ,x_return_status     OUT NOCOPY VARCHAR2
8233                                 ,x_msg_data         OUT NOCOPY VARCHAR2)
8234     IS
8235           CURSOR csp_transactions IS
8236           SELECT TRANSACTION_SOURCE_TYPE_ID,TRANSACTION_SOURCE_TYPE_NAME
8237           FROM   MTL_TXN_SOURCE_TYPES
8238           WHERE  transaction_source_type_id = 13;
8239           I NUMBER;
8240           l_api_version_number number :=1;
8241           l_init_msg_lst  varchar2(1) := fnd_api.g_true;
8242           x_msg_count number;
8243          -- x_msg_data  varchar2(128);
8244           l_rsv_rec  inv_reservation_global.mtl_reservation_rec_type;
8245           l_serial_number inv_reservation_global.serial_number_tbl_type;
8246           x_serial_number inv_reservation_global.serial_number_tbl_type;
8247           l_partial_reservation_flag varchar2(1):= fnd_api.g_false;
8248           l_force_reservation_flag varchar2(1) := fnd_api.g_true;
8249           l_validation_flag    varchar2(1) := fnd_api.g_true;
8250           l_source_type_id     NUMBER;
8251           l_source_name        varchar2(30);
8252           x_quantity_reserved  number;
8253           x_reservation_id number;
8254           l_msg varchar2(2000);
8255           --x_return_status varchar(128);
8256      BEGIN
8257           x_return_status  := FND_API.G_RET_STS_SUCCESS;
8258           OPEN csp_transactions;
8259             LOOP
8260                 FETCH csp_transactions INTO l_source_type_id, l_source_name;
8261                 EXIT WHEN csp_transactions%NOTFOUND;
8262             END LOOP;
8263           CLOSE csp_transactions;
8264                 IF l_source_type_id IS NULL THEN
8265                     raise NO_DATA_FOUND ;
8266                 END IF;
8267                 l_rsv_rec.reservation_id   :=  p_reservation_id;
8268                 /*l_rsv_rec.requirement_date := p_reservation_parts.need_by_date  ;
8269                 l_rsv_rec.organization_id  := p_reservation_parts.organization_id  ;
8270                 l_rsv_rec.inventory_item_id := p_reservation_parts.item_id   ;
8271                 l_rsv_rec.demand_source_type_id  := l_source_type_id ;
8272                 l_rsv_rec.demand_source_name     := l_source_name ;
8273                 l_rsv_rec.demand_source_header_id   := NULL;
8274                 l_rsv_rec.demand_source_line_id     := p_reservation_parts.line_id;
8275                 l_rsv_rec.demand_source_delivery    := NULL;
8276                 l_rsv_rec.primary_uom_code          := p_reservation_parts.item_UOM_code ;
8277                 l_rsv_rec.primary_uom_id            := NULL;
8278                 l_rsv_rec.reservation_uom_code      := p_reservation_parts.item_UOM_code;
8279                 l_rsv_rec.reservation_uom_id        := NULL;
8280                 l_rsv_rec.reservation_quantity      := p_reservation_parts.quantity_needed;
8281                 l_rsv_rec.primary_reservation_quantity  := NUll;
8282                 l_rsv_rec.detailed_quantity         := null;
8283                 l_rsv_rec.autodetail_group_id       := NULL;
8284                 l_rsv_rec.external_source_code       := NULL;
8285                 l_rsv_rec.external_source_line_id     := NULL;
8286                 l_rsv_rec.supply_source_type_id        := 13; --inv_reservation_global.g_source_type_internal_req;
8287                 l_rsv_rec.supply_source_header_id      := NULL;
8288                 l_rsv_rec.supply_source_line_id        := NULL;
8289                 l_rsv_rec.supply_source_name           := NULL;
8290                 l_rsv_rec.supply_source_line_detail    := NULL;
8291                 l_rsv_rec.revision                     := p_reservation_parts.revision ;
8292                 l_rsv_rec.subinventory_code            := p_reservation_parts.sub_inventory_code ;
8293                 l_rsv_rec.subinventory_id              := NULL ;
8294                 l_rsv_rec.locator_id                   := NULL;
8295                 l_rsv_rec.lot_number                   := NULL;
8296                 l_rsv_rec.lot_number_id                := NULL;
8297                 l_rsv_rec.pick_slip_number            := NULL;
8298                 l_rsv_rec.lpn_id                      := NULL;
8299                 l_rsv_rec.attribute_category       := NULL;
8300                 l_rsv_rec.attribute1               := NULL;
8301                 l_rsv_rec.attribute2               := NULL;
8302                 l_rsv_rec.attribute3               := NULL;
8303                 l_rsv_rec.attribute4               := NULL;
8304                 l_rsv_rec.attribute5               := NULL;
8305                 l_rsv_rec.attribute6               := NULL;
8306                 l_rsv_rec.attribute7               := NULL;
8307                 l_rsv_rec.attribute8               := NULL;
8308                 l_rsv_rec.attribute9               := NULL;
8309                 l_rsv_rec.attribute10              := NULL;
8310                 l_rsv_rec.attribute11              := NULL;
8311                 l_rsv_rec.attribute12              := NULL;
8312                 l_rsv_rec.attribute13              := NULL;
8313                 l_rsv_rec.attribute14              := NULL;
8314                 l_rsv_rec.attribute15              := NULL;
8315                 l_rsv_rec.ship_ready_flag          := NULL;*/
8316                 INV_RESERVATION_PUB.delete_reservation(l_api_version_number
8317                                                  , l_init_msg_lst
8318                                                  , x_return_status
8319                                                  , x_msg_count
8320                                                  , x_msg_data
8321                                                  , l_rsv_rec
8322                                                  , l_serial_number);
8323            EXCEPTION
8324         WHEN NO_DATA_FOUND THEN
8325             FND_MESSAGE.SET_NAME('CSP', 'CSP_SCH_TRANSACTION');
8326             FND_MSG_PUB.ADD;
8327             fnd_msg_pub.count_and_get
8328               ( p_count => x_msg_count
8329               , p_data  => x_msg_data);
8330             x_return_status := FND_API.G_RET_STS_ERROR;
8331         WHEN OTHERS THEN
8332             x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
8333 
8334      END DELETE_RESERVATION;
8335 
8336         -- first find out all RES created after receiving
8337         -- read item, qty and src org/subinv information from the RES
8338         -- release the RES
8339         -- do part transfer using direct inter-org transfer or subinv transfer
8340         -- create a new reservation for new destination org/subinv
8341         -- link the RES to req_line
8342         -- update req_header with new dest org/subinv, resource
8343 
8344          procedure move_parts_on_reassign(
8345                 p_task_id in number,
8346                 p_task_asgn_id in number,
8347                 p_new_task_asgn_id in number,
8348                 p_new_need_by_date in date,
8349                 p_new_resource_id in number,
8350                 p_new_resource_type in varchar2,
8351                 x_return_status OUT NOCOPY VARCHAR2,
8352                 x_msg_count     OUT NOCOPY NUMBER,
8353                 x_msg_data      OUT NOCOPY VARCHAR2
8354         ) is
8355 
8356         cursor old_res_details is
8357         SELECT dres.source_id,
8358           mr.inventory_item_id,
8359           mr.reservation_quantity,
8360           mr.reservation_uom_code,
8361           mr.organization_id,
8362           mr.subinventory_code,
8363           dres.requirement_line_id,
8364           dres.req_line_detail_id,
8365           h.requirement_header_id
8366         FROM csp_requirement_headers h,
8367           csp_requirement_lines l,
8368           csp_req_line_details dio,
8369           csp_req_line_details dres,
8370           oe_order_lines_all oola,
8371           mtl_reservations mr
8372         WHERE h.task_id             = p_task_id
8373         AND h.task_assignment_id    = p_task_asgn_id
8374         AND h.address_type         IN ('T', 'C', 'P')
8375         AND h.requirement_header_id = l.requirement_header_id
8376         AND l.requirement_line_id   = dio.requirement_line_id
8377         AND dio.source_type        = 'IO'
8378         AND dio.source_id = oola.line_id
8379         AND csp_pick_utils.get_order_status(oola.line_id,oola.flow_status_code)      = 'FULLY RECEIVED'
8380         AND dio.requirement_line_id = dres.requirement_line_id
8381         AND oola.inventory_item_id    = mr.inventory_item_id
8382         AND oola.ordered_quantity   = mr.reservation_quantity
8383         AND dres.source_type       = 'RES'
8384         AND dres.source_id = mr.reservation_id;
8385 
8386         l_trans_record csp_transactions_pub.trans_items_rec_type;
8387         l_trans_tbl csp_transactions_pub.trans_items_tbl_type;
8388         l_reservation_rec   csp_sch_int_pvt.reservation_rec_typ;
8389         l_requirement_header      csp_requirement_headers_pvt.requirement_header_rec_type;
8390         l_new_reservation_id number;
8391         l_req_line_detail_id number;
8392         l_new_dest_org number := -999;
8393         l_new_dest_subinv varchar2(30) := null;
8394         l_resource_name varchar2(2000);
8395         l_resource_type_name varchar2(2000);
8396 
8397         cursor req_line_dtl_rows (v_req_line_id number) is
8398         SELECT req_line_detail_id
8399         FROM csp_req_line_details
8400         WHERE requirement_line_id = v_req_line_id
8401         AND source_type = 'RES';
8402 
8403         CURSOR  resource_org IS
8404         SELECT ORGANIZATION_ID,
8405           SUBINVENTORY_CODE
8406         FROM CSP_INV_LOC_ASSIGNMENTS
8407         WHERE RESOURCE_ID = p_new_resource_id
8408         AND RESOURCE_TYPE = p_new_resource_type
8409         AND DEFAULT_CODE  = 'IN';
8410 
8411         begin
8412                 log('move_parts_on_reassign', 'begin...');
8413                 log('move_parts_on_reassign', 'p_task_id=' || p_task_id);
8414                 log('move_parts_on_reassign', 'p_task_asgn_id=' || p_task_asgn_id);
8415                 log('move_parts_on_reassign', 'p_new_task_asgn_id=' || p_new_task_asgn_id);
8416                 log('move_parts_on_reassign', 'p_new_need_by_date=' || to_char(p_new_need_by_date, 'dd-MON-YYYY HH24:MI'));
8417                 log('move_parts_on_reassign', 'p_new_resource_id=' || p_new_resource_id);
8418                 log('move_parts_on_reassign', 'p_new_resource_type=' || p_new_resource_type);
8419 
8420                 x_return_status  := FND_API.G_RET_STS_SUCCESS;
8421 
8422                 open resource_org;
8423                 fetch resource_org into l_new_dest_org, l_new_dest_subinv;
8424                 close resource_org;
8425 
8426                 log('move_parts_on_reassign', 'l_new_dest_org=' || l_new_dest_org);
8427                 log('move_parts_on_reassign', 'l_new_dest_subinv=' || l_new_dest_subinv);
8428 
8429                 if l_new_dest_org = -999 then
8430                         x_return_status := FND_API.G_RET_STS_ERROR;
8431                         l_resource_name := csp_pick_utils.get_object_name(p_new_resource_type, p_new_resource_id);
8432                         SELECT NAME
8433                         into l_resource_type_name
8434                         FROM JTF_OBJECTS_VL
8435                         WHERE OBJECT_CODE = p_new_resource_type;
8436                         FND_MESSAGE.SET_NAME('CSP', 'CSP_SCH_DEFAULT_SUBINV');
8437                         FND_MESSAGE.SET_TOKEN('RESOURCE_TYPE',l_resource_type_name,FALSE);
8438                         FND_MESSAGE.SET_TOKEN('RESOURCE_NAME',l_resource_name, FALSE);
8439                         FND_MSG_PUB.ADD;
8440                         fnd_msg_pub.count_and_get
8441                                         ( p_count => x_msg_count
8442                                         , p_data  => x_msg_data);
8443                         return;
8444                 end if;
8445 
8446                 for old_res_record in old_res_details
8447                 loop
8448                         log('move_parts_on_reassign', 'old_res_record.source_id=' || old_res_record.source_id);
8449                         log('move_parts_on_reassign', 'old_res_record.inventory_item_id=' || old_res_record.inventory_item_id);
8450                         log('move_parts_on_reassign', 'old_res_record.reservation_quantity=' || old_res_record.reservation_quantity);
8451                         log('move_parts_on_reassign', 'old_res_record.reservation_uom_code=' || old_res_record.reservation_uom_code);
8452                         log('move_parts_on_reassign', 'old_res_record.organization_id=' || old_res_record.organization_id);
8453                         log('move_parts_on_reassign', 'old_res_record.subinventory_code=' || old_res_record.subinventory_code);
8454                         log('move_parts_on_reassign', 'old_res_record.requirement_line_id=' || old_res_record.requirement_line_id);
8455                         log('move_parts_on_reassign', 'old_res_record.req_line_detail_id=' || old_res_record.req_line_detail_id);
8456                         log('move_parts_on_reassign', 'old_res_record.requirement_header_id=' || old_res_record.requirement_header_id);
8457 
8458                         CSP_SCH_INT_PVT.CANCEL_RESERVATION(old_res_record.source_id, x_return_status, x_msg_data, x_msg_count);
8459 
8460                         log('move_parts_on_reassign', 'x_return_status=' || x_return_status);
8461 
8462                         if x_return_status <> FND_API.G_RET_STS_SUCCESS then
8463                                 x_return_status := FND_API.G_RET_STS_ERROR;
8464                                 FND_MESSAGE.SET_NAME('CSP', 'CSP_SCH_NOT_CANCEL_ORDER');
8465                                 FND_MSG_PUB.ADD;
8466                                 fnd_msg_pub.count_and_get
8467                                                 ( p_count => x_msg_count
8468                                                 , p_data  => x_msg_data);
8469                                 return;
8470                         end if;
8471 
8472                         l_trans_record.INVENTORY_ITEM_ID := old_res_record.inventory_item_id;
8473                         l_trans_record.QUANTITY := old_res_record.reservation_quantity;
8474                         l_trans_record.UOM_CODE := old_res_record.reservation_uom_code;
8475                         l_trans_record.FRM_ORGANIZATION_ID := old_res_record.organization_id;
8476                         l_trans_record.FRM_SUBINVENTORY_CODE := old_res_record.subinventory_code;
8477                         l_trans_record.TO_ORGANIZATION_ID := l_new_dest_org;
8478                         l_trans_record.TO_SUBINVENTORY_CODE := l_new_dest_subinv;
8479                         l_trans_tbl(1) := l_trans_record;
8480 
8481                         if old_res_record.organization_id <> l_new_dest_org then
8482                                 log('move_parts_on_reassign', 'before calling transact_intorg_transfer...');
8483                                 csp_transactions_pub.transact_intorg_transfer(
8484                                         P_Api_Version_Number => 1.0,
8485                                         p_Trans_Items => l_trans_tbl,
8486                                         p_if_intransit => false,
8487                                         X_Return_Status => x_return_status,
8488                                         X_Msg_Count => x_msg_count,
8489                                         X_Msg_Data => x_msg_data
8490                                 );
8491                                 log('move_parts_on_reassign', 'after calling transact_intorg_transfer... x_return_status=' || x_return_status);
8492                                 if x_return_status <> FND_API.G_RET_STS_SUCCESS then
8493                                         x_return_status := FND_API.G_RET_STS_ERROR;
8494                                         FND_MESSAGE.SET_NAME('CSP', 'CSP_SCH_NOT_CANCEL_ORDER');
8495                                         FND_MSG_PUB.ADD;
8496                                         fnd_msg_pub.count_and_get
8497                                                         ( p_count => x_msg_count
8498                                                         , p_data  => x_msg_data);
8499                                         return;
8500                                 end if;
8501                         else
8502                                 log('move_parts_on_reassign', 'before calling transact_subinv_transfer...');
8503                                 csp_transactions_pub.transact_subinv_transfer(
8504                                         P_Api_Version_Number => 1.0,
8505                                         p_Trans_Items => l_trans_tbl,
8506                                         X_Return_Status => x_return_status,
8507                                         X_Msg_Count => x_msg_count,
8508                                         X_Msg_Data => x_msg_data
8509                                 );
8510                                 log('move_parts_on_reassign', 'after calling transact_subinv_transfer... x_return_status=' || x_return_status);
8511                                 if x_return_status <> FND_API.G_RET_STS_SUCCESS then
8512                                         x_return_status := FND_API.G_RET_STS_ERROR;
8513                                         FND_MESSAGE.SET_NAME('CSP', 'CSP_SCH_NOT_CANCEL_ORDER');
8514                                         FND_MSG_PUB.ADD;
8515                                         fnd_msg_pub.count_and_get
8516                                                         ( p_count => x_msg_count
8517                                                         , p_data  => x_msg_data);
8518                                         return;
8519                                 end if;
8520                         end if;
8521 
8522                         l_reservation_rec.need_by_date := sysdate;
8523                         l_reservation_rec.organization_id := l_new_dest_org;
8524                         l_reservation_rec.sub_inventory_code := l_new_dest_subinv;
8525                         l_reservation_rec.item_id := old_res_record.inventory_item_id;
8526                         l_reservation_rec.item_uom_code := old_res_record.reservation_uom_code;
8527                         l_reservation_rec.quantity_needed := old_res_record.reservation_quantity;
8528                         l_reservation_rec.line_id := old_res_record.requirement_line_id;
8529 
8530                         log('move_parts_on_reassign', 'before creating a new reservation...');
8531 
8532                         l_new_reservation_id := CSP_SCH_INT_PVT.CREATE_RESERVATION(
8533                                           p_reservation_parts => l_reservation_rec,
8534                                           x_return_status => x_return_status,
8535                                           x_msg_data => x_msg_data);
8536 
8537                         log('move_parts_on_reassign', 'after creating a new reservation...x_return_status=' || x_return_status);
8538                         log('move_parts_on_reassign', 'l_new_reservation_id=' || l_new_reservation_id);
8539 
8540                         if x_return_status <> FND_API.G_RET_STS_SUCCESS then
8541                                 x_return_status := FND_API.G_RET_STS_ERROR;
8542                                 FND_MESSAGE.SET_NAME('CSP', 'CSP_SCH_NOT_CANCEL_ORDER');
8543                                 FND_MSG_PUB.ADD;
8544                                 fnd_msg_pub.count_and_get
8545                                                 ( p_count => x_msg_count
8546                                                 , p_data  => x_msg_data);
8547                                 return;
8548                         end if;
8549 
8550                         for r_req_line_dtl_rec in req_line_dtl_rows(old_res_record.requirement_line_id)
8551                         loop
8552                                 log('move_parts_on_reassign', 'deleting req_line_detail_id=' || r_req_line_dtl_rec.req_line_detail_id);
8553                                 csp_req_line_details_pkg.delete_row(r_req_line_dtl_rec.req_line_detail_id);
8554                         end loop;
8555 
8556                         log('move_parts_on_reassign', 'before inserting a new req_line_detail...');
8557                         l_req_line_detail_id := null;
8558                         csp_req_line_details_pkg.Insert_Row(
8559                           px_REQ_LINE_DETAIL_ID => l_req_line_detail_id,
8560                           p_REQUIREMENT_LINE_ID => old_res_record.requirement_line_id,
8561                           p_CREATED_BY => FND_GLOBAL.user_id,
8562                           p_CREATION_DATE => sysdate,
8563                           p_LAST_UPDATED_BY => FND_GLOBAL.user_id,
8564                           p_LAST_UPDATE_DATE => sysdate,
8565                           p_LAST_UPDATE_LOGIN => FND_GLOBAL.user_id,
8566                           p_SOURCE_TYPE => 'RES',
8567                           p_SOURCE_ID => l_new_reservation_id);
8568 
8569                         l_requirement_header.requirement_header_id := old_res_record.requirement_header_id;
8570                         l_requirement_header.need_by_date := p_new_need_by_date;
8571                         l_requirement_header.task_assignment_id := p_new_task_asgn_id ;
8572                         l_requirement_header.last_update_date := sysdate;
8573                         l_requirement_header.destination_organization_id := l_new_dest_org;
8574                         l_requirement_header.destination_subinventory := l_new_dest_subinv;
8575                         l_requirement_header.resource_type := p_new_resource_type;
8576                         l_requirement_header.resource_id := p_new_resource_id;
8577 
8578                         log('move_parts_on_reassign','task_assignment_id:'||l_requirement_header.task_assignment_id);
8579                         log('move_parts_on_reassign','dest_organization_id:'||l_requirement_header.destination_organization_id);
8580                         log('move_parts_on_reassign','dest_subinventory:'||l_requirement_header.destination_subinventory);
8581                         log('move_parts_on_reassign','resource_type:'||l_requirement_header.resource_type);
8582                         log('move_parts_on_reassign','resource_id:'||l_requirement_header.resource_id);
8583                         log('move_parts_on_reassign','start_time:'||to_char(l_requirement_header.need_by_date,'dd-mon-yyyy hh24:mi:ss'));
8584 
8585                         log('move_parts_on_reassign', 'before calling Update_requirement_headers...');
8586                         CSP_Requirement_Headers_PVT.Update_requirement_headers(
8587                                                         P_Api_Version_Number         => 1.0,
8588                                                         P_Init_Msg_List              => FND_API.G_FALSE,
8589                                                         P_Commit                     => FND_API.G_FALSE,
8590                                                         p_validation_level           => FND_API.G_VALID_LEVEL_FULL,
8591                                                         P_REQUIREMENT_HEADER_Rec     => l_requirement_header,
8592                                                         X_Return_Status              => x_return_status,
8593                                                         X_Msg_Count                  => x_msg_count,
8594                                                         x_msg_data                   => x_msg_data
8595                                                         );
8596                         log('move_parts_on_reassign', 'before calling Update_requirement_headers...x_return_status=' || x_return_status);
8597 
8598                         if x_return_status <> FND_API.G_RET_STS_SUCCESS then
8599                                 x_return_status := FND_API.G_RET_STS_ERROR;
8600                                 FND_MESSAGE.SET_NAME('CSP', 'CSP_SCH_NOT_CANCEL_ORDER');
8601                                 FND_MSG_PUB.ADD;
8602                                 fnd_msg_pub.count_and_get
8603                                                 ( p_count => x_msg_count
8604                                                 , p_data  => x_msg_data);
8605                                 return;
8606                         end if;
8607 
8608                 end loop;
8609 
8610                 log('move_parts_on_reassign', 'returning...');
8611         end move_parts_on_reassign;
8612  END CSP_SCH_INT_PVT;