[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;