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