1 PACKAGE BODY WSH_SC_DELIVERY_PVT as
2 /* $Header: WSHSDELB.pls 115.7 99/10/18 18:46:56 porting ship $ */
3
4 -- Function Name : Close_Delivery
5
6 -- Purpose :
7 -- To process Ship_all and Ship_entered actions on a Delivery
8
9 -- Parameters :
10 -- 1. Del_Id IN NUMBER
11 -- - delivery id we are working with
12 -- 2. Action_Code IN VARCHAR2
13 -- -ALL for Ship All
14 -- -ENTERED for Ship Entered
15
16 -- Return Value : BOOLEAN
17 --
18 FUNCTION Close_Delivery(Del_Id IN NUMBER,
19 Action_Code IN VARCHAR2,
20 default_fcc IN VARCHAR2,
21 default_bol IN VARCHAR2,
22 p_vehicle_item_id IN NUMBER DEFAULT NULL,
23 p_vehicle_number IN VARCHAR2 DEFAULT NULL,
24 p_seal_code IN VARCHAR2 DEFAULT NULL,
25 p_volume_uom IN VARCHAR2 DEFAULT NULL,
26 p_volume_total IN NUMBER DEFAULT NULL,
27 p_weight_uom IN VARCHAR2 DEFAULT NULL,
28 p_gross_wt IN NUMBER DEFAULT NULL,
29 p_tare_wt IN NUMBER DEFAULT NULL,
30 p_pack_instr IN VARCHAR2 DEFAULT NULL,
31 default_actual_date IN DATE DEFAULT SYSDATE)
32 RETURN BOOLEAN IS
33
34 --go ahead and declare some local variables to be used in the function
35
36 dep_id NUMBER;
37 org_id NUMBER;
38 freight_carrier VARCHAR2(30);
39 dep_freight_carrier VARCHAR2(30);
40 weight_uom VARCHAR2(3);
41 volume_uom VARCHAR2(3);
42 weight_of_delivery NUMBER;
43 volume_of_delivery NUMBER;
44 trans_temp_id NUMBER;
45 x_waybill VARCHAR2(30);
46 X_net_weight NUMBER;
47 X_tare_weight NUMBER;
48 X_volume NUMBER;
49 X_status NUMBER;
50 weight_volume_sc_flag VARCHAR2(1);
51 close_date DATE;
52 auto_created_dep BOOLEAN :=FALSE;
53 industry VARCHAR2(30);
54 status VARCHAR2(30);
55 return_msg1 VARCHAR2(2000);
56 BEGIN
57
58 -- If we have delivery lines that are not assicated with this delivery
59 -- associated with picking headers or picking lines that we are working
60 -- with then we need to first split these picking headers and picking lines
61 -- to kinda get rid of these delivery lines.
62 -- So go ahead and call the routine which splits the picking headers
63 -- and picking lines, if necessary
64
65 Split_Picking_Headers (del_id);
66
67
68 -- If a serial number range has been entered for the shipped quantity of the
69 -- item, then we need to explode the picking line details.
70 -- wsh_sc_pld_pkg (WShSCPDB.pls) is our guy to do this. He takes care
71 -- of exploding only those lines that need to be.
72
73 WSH_SC_PLD_PKG.Close_Details(del_id);
74
75 -- We are now ready to update the delivery status to closed
76 select sysdate into close_date from sys.dual;
77 UPDATE wsh_deliveries
78 SET status_code = 'CL',
79 date_closed = close_date
80 WHERE delivery_id = del_id;
81
82 -- if this delivery has not been associated with a departure yet
83 -- then we need to do an 'auto create departure' ie create a
84 -- departure for this delivery to be able to actually 'depart' !
85 -- so call Auto_Create_Departure
86
87 -- first check if we need to do it
88 SELECT actual_departure_id
89 ,organization_id
90 ,freight_carrier_code
91 ,weight_uom_code
92 ,volume_uom_code
93 ,gross_weight
94 ,volume
95 ,waybill
96 INTO dep_id
97 ,org_id
98 ,freight_carrier
99 ,weight_uom
100 ,volume_uom
101 ,weight_of_delivery
102 ,volume_of_delivery
103 ,x_waybill
104 FROM wsh_deliveries
105 WHERE delivery_id = del_id;
106 -- if freight carrier at the delivery is null, update it from the departure
107 IF freight_carrier IS NULL and dep_id IS NOT NULL THEN
108 SELECT freight_carrier_code
109 INTO dep_freight_carrier
110 FROM wsh_departures
111 WHERE departure_id = dep_id;
112
113 UPDATE wsh_deliveries
114 SET freight_carrier_code = dep_freight_carrier
115 WHERE delivery_id = del_id;
116 END IF;
117
118 IF dep_id is NULL THEN
119
120 dep_id := Auto_Create_Departure ( org_id,
121 NVL( default_fcc, freight_carrier),
122 NVL( p_weight_uom, weight_uom),
123 NVL( p_volume_uom, volume_uom),
124 NVL( p_gross_wt, weight_of_delivery),
125 p_tare_wt,
126 NVL( p_volume_total, volume_of_delivery),
127 p_vehicle_item_id,
128 p_vehicle_number,
129 p_seal_code,
130 p_pack_instr,
131 default_bol,
132 default_actual_date );
133
134 -- now update the actual departure id on this delivery with the new departure created
135 -- and the departure id on the delivery lines. Also call the ASN API for ASN integration
136
137 IF dep_id > 0 THEN
138
139 UPDATE wsh_deliveries
140 SET actual_departure_id = dep_id,
141 freight_carrier_code = NVL(default_fcc, freight_carrier)
142 WHERE delivery_id = del_id;
143
144 auto_created_dep := TRUE;
145 WSH_PARAMETERS_PVT.get_param_value(org_id, 'WEIGHT_VOLUME_SC_FLAG',
146 weight_volume_sc_flag);
147 if (weight_volume_sc_flag = 'A') then
148 wsh_wv_pvt.departure_weight_volume(
149 source => 'SC',
150 departure_id => dep_id,
151 organization_id => org_id,
152 wv_flag => 'ALWAYS',
153 update_flag => 'Y',
154 menu_flag => 'N',
155 dpw_pack_flag => 'N',
156 master_weight_uom => weight_uom,
157 net_weight => X_net_weight,
158 tare_weight => X_tare_weight,
159 master_volume_uom => volume_uom,
160 volume => X_volume,
161 status => X_status);
162 if (X_status = 0) then
163
164 update wsh_departures
165 set net_weight = X_net_weight,
166 fill_percent = 0
167 where departure_id = dep_id;
168 end if;
169
170 end if;
171
172
173 -- check if EDI product is installed
174 IF (edi_installed_flag = 'U') THEN
175 edi_installed_flag := 'N';
176 IF (fnd_installation.get(175, 175, status, industry)) THEN
177 IF (status = 'I') THEN
178 edi_installed_flag := 'Y';
179 END IF;
180 END IF;
181 END IF;
182
183 /*now call the ASN package
184 IF (edi_installed_flag = 'Y') THEN
185 ece_dsno.export_deliveries_api(dep_id);
186 END IF;
187 */
188
189 END IF;
190 END IF;
191
192 --We will delay the update the status of the picking_header_id
193 --in so_picking_headers_all until the departure is closed
194
195 IF ( auto_created_dep ) THEN
196 UPDATE so_picking_headers_all
197 SET waybill_num = x_waybill,
198 STATUS_CODE = 'PENDING'
199 WHERE delivery_id = del_id;
200 ELSE
201 UPDATE so_picking_headers_all
202 SET waybill_num = x_waybill
203 WHERE delivery_id = del_id;
204 END IF;
205
206 -- make departure id in so_picking_line_details in correct
207 UPDATE so_picking_line_details
208 SET departure_id = dep_id
209 WHERE delivery_id = del_id;
210
211 -- clear any serial number entered in MTL_SERIAL_NUMBERS_TEMP
212 wsh_sc_pld_pkg.delete_from_msnt(del_id);
213
214
215 -- if we come here with no errors then we are ready to return back to the client
216 -- with a value of 'True'
217 RETURN TRUE;
218
219 -- Handle any exceptions
220 Exception
221
222 WHEN OTHERS THEN
223 return_msg1 := FND_MESSAGE.get;
224 wsh_del_oi_core.println('msg ='|| return_msg1);
225 FND_MESSAGE.Set_Name('OE','OE_QUERY_ERROR');
226 FND_MESSAGE.Set_Token('PACKAGE','WSH_SC_DELIVERY_PVT.Close_Delivery');
227 FND_MESSAGE.Set_Token('ORA_ERROR',to_char(sqlcode));
228 FND_MESSAGE.Set_Token('ORA_TEXT',SQLERRM);
229 APP_EXCEPTION.Raise_Exception;
230 return FALSE;
231
232 END Close_Delivery;
233
234 FUNCTION Print_Shipping_Doc_Set( x_del_id IN NUMBER,
235 x_doc_set_id IN NUMBER,
236 x_return_msg OUT VARCHAR2 )
237 RETURN BOOLEAN IS
238 return_code BOOLEAN;
239 return_message VARCHAR2(2000);
240 return_msg1 VARCHAR2(2000);
241 x_org_id NUMBER DEFAULT NULL;
242 x_report_set_id NUMBER;
243 CURSOR c1( x_del_id NUMBER) IS
244 SELECT report_set_id, organization_id
245 FROM wsh_deliveries
246 WHERE delivery_id = x_del_id;
247 invalid_parameters EXCEPTION;
248 BEGIN
249 IF ( x_del_id IS NULL ) THEN
250 RAISE invalid_parameters;
251 END IF;
252 x_report_set_id := x_doc_set_id;
253 IF ( NVL(x_report_set_id,-1) <= 0) THEN
254 OPEN c1( x_del_id);
255 FETCH c1 INTO x_report_set_id, x_org_id;
256 IF ( c1%NOTFOUND ) THEN
257 RAISE invalid_parameters;
258 END IF;
259 IF ( c1%ISOPEN) THEN
260 CLOSE c1;
261 END IF;
262 END IF;
263 IF ( x_report_set_id IS NULL ) THEN
264 FND_MESSAGE.SET_NAME('OE','WSH_NO_DOCS');
265 return_message := FND_MESSAGE.GET;
266 x_return_msg := return_message;
267 RETURN TRUE;
268 END IF;
269
270 WSH_DOC_SETS.Print_Document_Sets (
271 X_report_set_id => x_report_set_id,
272 P_DELIVERY_ID => TO_CHAR(x_del_id),
273 P_ORGANIZATION_ID => TO_CHAR(x_org_id),
274 P_WAREHOUSE_ID => TO_CHAR(x_org_id),
275 message_string => return_message,
276 status => return_code );
277 x_return_msg := return_message;
278 RETURN return_code;
279 EXCEPTION
280 WHEN invalid_parameters THEN
281 IF ( c1%ISOPEN) THEN
282 CLOSE c1;
283 END IF;
284 FND_MESSAGE.SET_NAME('OE','WSH_SC_INVALID_PARA');
285 return_message := FND_MESSAGE.GET;
286 x_return_msg := return_message;
287 RETURN FALSE;
288 WHEN others THEN
289 return_msg1 := FND_MESSAGE.get;
290 wsh_del_oi_core.println('msg ='|| return_msg1);
291 IF ( c1%ISOPEN) THEN
292 CLOSE c1;
293 END IF;
294 x_return_msg := return_message;
295 RETURN FALSE;
296 END Print_Shipping_Doc_Set;
297
298 -- Function Name : Backorder_Delivery
299
300 -- Purpose :
301 -- To process Backorder_all action on a Delivery
302
303 -- Parameters :
304 -- 1. Del_Id IN NUMBER
305 -- - delivery id we are working with
306 -- 2. Process_Online IN VARCHAR2
307 -- Y - run Update Shipping and Inventory Interface Online
308 -- N - do not run Update Shipping and Inventory Interface Online
309
310 -- Return Value : BOOLEAN
311 --
312 FUNCTION Backorder_Delivery( Del_Id IN NUMBER)
313 RETURN BOOLEAN IS
314 CURSOR c1( x_del_id NUMBER) IS
315 SELECT actual_departure_id
316 FROM wsh_deliveries
317 WHERE delivery_id = x_del_id;
318
319 dep_id NUMBER;
320 return_msg1 varchar2(2000);
321 BEGIN
322
323 -- update shipped quantity in so_picking_line_details
324 wsh_sc_del_lines.update_shp_qty (del_id, 'BACKORDER_ALL');
325
326 -- clear any charges entered in SO_FREIGHT_CHARGES
327 delete from so_freight_charges
328 where delivery_id = del_id;
329
330 -- clear any container entered in WSH_PACKED_CONTAINERS
331 delete from wsh_packed_containers
332 where delivery_id = del_id;
333
334 OPEN c1(del_id);
335 FETCH c1 INTO dep_id;
336 IF ( c1%ISOPEN) THEN
337 CLOSE c1;
338 END IF;
339
340 UPDATE so_picking_line_details
341 SET departure_id = dep_id,
342 container_id = NULL,
343 shipped_quantity = 0
344 WHERE delivery_id = del_id;
345
346 --call the server routine to unassign the unreleased delivery
347 --lines from this delivery
348 wsh_sc_del_lines.update_unrel_lines(del_id);
349
350 -- Split the picking headers, picking lines and update the
351 -- shipped quantity in picking lines
352
353 split_picking_headers (del_id);
354
355
356 -- update the delivery as 'CB' /* close backordered - is it CB or BO ? -open issue */
357
358 UPDATE so_picking_headers_all
359 SET status_code = 'PENDING'
360 WHERE picking_header_id in
361 (SELECT distinct pl.picking_header_id
362 FROM so_picking_lines_all pl, so_picking_line_details pld
363 WHERE pld.delivery_id = del_id
364 AND pl.picking_line_id = pld.picking_line_id
365 AND pl.picking_header_id+0 > 0);
366
367 update wsh_deliveries
368 set status_code = 'CB'
369 where delivery_id = del_id;
370
371 return TRUE;
372
373 Exception
374 WHEN OTHERS THEN
375 return_msg1 := FND_MESSAGE.get;
376 wsh_del_oi_core.println('msg ='|| return_msg1);
377 IF ( c1%ISOPEN) THEN
378 CLOSE c1;
379 END IF;
380 FND_MESSAGE.Set_Name('OE','OE_QUERY_ERROR');
381 FND_MESSAGE.Set_Token('PACKAGE','WSH_SC_DELIVERY_PVT.Backorder_Delivery');
382 FND_MESSAGE.Set_Token('ORA_ERROR',to_char(sqlcode));
383 FND_MESSAGE.Set_Token('ORA_TEXT',SQLERRM);
384 APP_EXCEPTION.Raise_Exception;
385 return FALSE;
386
387 END Backorder_Delivery;
388
389 -- Function Name : Unpack_Delivery
390
391 -- Purpose :
392 -- To process the unpacking action on a Delivery
393
394 -- Parameters :
395 -- 1. Del_Id IN NUMBER
396 -- - delivery id we are working with
397
398 -- Return Value : BOOLEAN
399 --
400 FUNCTION Unpack_Delivery (Del_Id IN NUMBER) RETURN BOOLEAN IS
401
402 Source Varchar2(1);
403
404 BEGIN
405
406 --We need to take out the containers off the Delivery Lines and set the Shipped
407 --quantity to null on them.
408
409 UPDATE so_picking_line_details
410 SET container_id = null
411 WHERE delivery_id = Del_Id;
412
413 --Now look at the souce code of the delivery ie who created it - DPW or SC
414 SELECT source_code
415 INTO Source
416 FROM wsh_deliveries
417 WHERE delivery_id = Del_Id;
418
419 --Depending on the source, update the delivery status
420
421 IF Source = 'D' THEN
422 UPDATE wsh_deliveries
423 SET status_code = 'PL'
424 WHERE delivery_id = Del_Id;
425 ELSIF Source = 'S' THEN
426 UPDATE wsh_deliveries
427 SET status_code = 'OP'
428 WHERE delivery_id = Del_Id;
429 END IF;
430
431 RETURN TRUE;
432
433 --handle any exceptions
434 Exception
435
436 WHEN OTHERS THEN
437 FND_MESSAGE.Set_Name('OE','OE_QUERY_ERROR');
438 FND_MESSAGE.Set_Token('PACKAGE','WSH_SC_DELIVERY_PVT.Unpack_Delivery');
439 FND_MESSAGE.Set_Token('ORA_ERROR',to_char(sqlcode));
440 FND_MESSAGE.Set_Token('ORA_TEXT',SQLERRM);
441 APP_EXCEPTION.Raise_Exception;
442 return FALSE;
443
444 END Unpack_Delivery;
445
446 -- Procedure Name : Update_Del_Status
447
448 -- Purpose :
449 -- Updates the status code on a delivery to the required value
450
451 -- Parameters :
452 -- 1. Del_Id IN NUMBER
453 -- - delivery id we are working with
454 -- 2. Del_Status_Code
455 -- - status to which we want the delivery to be updated
456
457 PROCEDURE Update_Del_Status( Del_Id IN NUMBER,
458 Del_Status_Code IN VARCHAR2) IS
459 BEGIN
460
461 --just a simple and stupid statement to update the delivery status
462 UPDATE wsh_deliveries
463 SET status_code = del_status_code
464 WHERE delivery_id = Del_Id;
465
466 END Update_Del_Status;
467
468
469 -- Procedure Name : Insert_Ph_Row
470
471 -- Purpose :
472 -- Inserts a New Picking Header record in so_picking_headers
473
474 -- Parameters :
475 -- 1. Ph_Id IN NUMBER
476 -- - Picking Header record from which the new picking header
477 -- record is to be created
478 -- 2. New_Ph_Id IN NUMBER
479 -- - Picking Header Id for the New picking header record
480 PROCEDURE Insert_Ph_Row ( Ph_Id IN NUMBER,
481 New_Ph_Id IN NUMBER) IS
482 BEGIN
483
484 --Go ahead and insert a record in so_picking_headers_all
485 INSERT INTO so_picking_headers_all
486 ( PICKING_HEADER_ID
487 ,CREATION_DATE
488 ,CREATED_BY
489 ,LAST_UPDATE_DATE
490 ,LAST_UPDATED_BY
491 ,LAST_UPDATE_LOGIN
492 ,PROGRAM_APPLICATION_ID
493 ,PROGRAM_ID
494 ,PROGRAM_UPDATE_DATE
495 ,REQUEST_ID
496 ,BATCH_ID
497 ,ORDER_HEADER_ID
498 ,WAREHOUSE_ID
499 ,SHIP_TO_SITE_USE_ID
500 ,STATUS_CODE
501 ,PICK_SLIP_NUMBER
502 ,WAYBILL_NUM
503 ,PICKED_BY_ID
504 ,PACKED_BY_ID
505 ,WEIGHT
506 ,WEIGHT_UNIT_CODE
507 ,NUMBER_OF_BOXES
508 ,SHIP_METHOD_CODE
509 ,DATE_RELEASED
510 ,DATE_SHIPPED
511 ,DATE_CONFIRMED
512 ,CONTEXT
513 ,ATTRIBUTE1
514 ,ATTRIBUTE2
515 ,ATTRIBUTE3
516 ,ATTRIBUTE4
517 ,ATTRIBUTE5
518 ,ATTRIBUTE6
519 ,ATTRIBUTE7
520 ,ATTRIBUTE8
521 ,ATTRIBUTE9
522 ,ATTRIBUTE10
523 ,ATTRIBUTE11
524 ,ATTRIBUTE12
525 ,ATTRIBUTE13
526 ,ATTRIBUTE14
527 ,ATTRIBUTE15
528 ,EXPECTED_ARRIVAL_DATE
529 ,ORG_ID
530 ,SHIP_NOTICE_SENT_DATE
531 ,SHIP_NOTICE_SENT_FLAG
532 ,DELIVERY_ID
533 ,ARRIVED_FLAG )
534 SELECT
535 new_ph_id
536 ,SYSDATE
537 ,fnd_global.user_id
538 ,SYSDATE
539 ,fnd_global.user_id
540 ,fnd_global.login_id
541 ,PROGRAM_APPLICATION_ID
542 ,PROGRAM_ID
543 ,PROGRAM_UPDATE_DATE
544 ,REQUEST_ID
545 ,BATCH_ID
546 ,ORDER_HEADER_ID
547 ,WAREHOUSE_ID
548 ,SHIP_TO_SITE_USE_ID
549 ,STATUS_CODE
550 ,PICK_SLIP_NUMBER
551 ,WAYBILL_NUM
552 ,PICKED_BY_ID
553 ,PACKED_BY_ID
554 ,WEIGHT
555 ,WEIGHT_UNIT_CODE
556 ,NUMBER_OF_BOXES
557 ,SHIP_METHOD_CODE
558 ,DATE_RELEASED
559 ,DATE_SHIPPED
560 ,DATE_CONFIRMED
561 ,CONTEXT
562 ,ATTRIBUTE1
563 ,ATTRIBUTE2
564 ,ATTRIBUTE3
565 ,ATTRIBUTE4
566 ,ATTRIBUTE5
567 ,ATTRIBUTE6
568 ,ATTRIBUTE7
569 ,ATTRIBUTE8
570 ,ATTRIBUTE9
571 ,ATTRIBUTE10
572 ,ATTRIBUTE11
573 ,ATTRIBUTE12
574 ,ATTRIBUTE13
575 ,ATTRIBUTE14
576 ,ATTRIBUTE15
577 ,EXPECTED_ARRIVAL_DATE
578 ,ORG_ID
579 ,SHIP_NOTICE_SENT_DATE
580 ,SHIP_NOTICE_SENT_FLAG
581 ,DELIVERY_ID
582 ,ARRIVED_FLAG
583 FROM so_picking_headers_all
584 WHERE picking_header_id = Ph_Id;
585
586 END Insert_Ph_Row;
587
588 -- Procedure Name : Insert_Pl_Row
589
590 -- Purpose :
591 -- Inserts a new picking line record in so_picking_lines_all
592
593 -- Parameters :
594 -- 1. Pl_Id IN NUMBER
595 -- - picking line record from which the new picking line
596 -- record is created
597 -- 2. New_Pl_Id IN NUMBER
598 -- - picking line id for the new picking line record
599 -- 3. New_Ph_Id IN NUMBER
600 -- - Picking Header Id for the New picking header record
601 PROCEDURE Insert_Pl_Row ( Pl_Id IN NUMBER,
602 New_Pl_Id IN NUMBER,
603 New_Ph_Id IN NUMBER) IS
604 BEGIN
605
606 --Insert a row in so_picking_lines_all
607 INSERT INTO so_picking_lines_all
608 ( PICKING_LINE_ID
609 ,CREATION_DATE
610 ,CREATED_BY
611 ,LAST_UPDATE_DATE
612 ,LAST_UPDATED_BY
613 ,LAST_UPDATE_LOGIN
614 ,PROGRAM_APPLICATION_ID
615 ,PROGRAM_ID
616 ,PROGRAM_UPDATE_DATE
617 ,REQUEST_ID
618 ,PICKING_HEADER_ID
619 ,SEQUENCE_NUMBER
620 ,ORDER_LINE_ID
621 ,COMPONENT_CODE
622 ,LINE_DETAIL_ID
623 ,COMPONENT_RATIO
624 ,REQUESTED_QUANTITY
625 ,INVENTORY_ITEM_ID
626 ,INCLUDED_ITEM_FLAG
627 ,DATE_REQUESTED
628 ,ORIGINAL_REQUESTED_QUANTITY
629 ,WAREHOUSE_ID
630 ,SHIPPED_QUANTITY
631 ,CANCELLED_QUANTITY
632 ,SHIP_TO_SITE_USE_ID
633 ,SHIP_TO_CONTACT_ID
634 ,SHIPMENT_PRIORITY_CODE
635 ,SHIP_METHOD_CODE
636 ,DATE_CONFIRMED
637 ,RA_INTERFACE_STATUS
638 ,INVOICED_QUANTITY
639 ,INVENTORY_STATUS
640 ,UNIT_CODE
641 ,CONTEXT
642 ,ATTRIBUTE1
643 ,ATTRIBUTE2
644 ,ATTRIBUTE3
645 ,ATTRIBUTE4
646 ,ATTRIBUTE5
647 ,ATTRIBUTE6
648 ,ATTRIBUTE7
649 ,ATTRIBUTE8
650 ,ATTRIBUTE9
651 ,ATTRIBUTE10
652 ,ATTRIBUTE11
653 ,ATTRIBUTE12
654 ,ATTRIBUTE13
655 ,ATTRIBUTE14
656 ,ATTRIBUTE15
657 ,SCHEDULE_DATE
658 ,DEMAND_CLASS_CODE
659 ,COMPONENT_SEQUENCE_ID
660 ,CONFIGURATION_ITEM_FLAG
661 ,LATEST_ACCEPTABLE_DATE
662 ,MOVEMENT_ID
663 ,ORG_ID
664 ,TRANSACTION_HEADER_ID
665 ,SERVICE_INTERFACE_STATUS
666 ,BO_PICKING_LINE_ID
667 ,DEP_PLAN_REQUIRED_FLAG
668 ,CUSTOMER_ITEM_ID )
669 SELECT
670 new_pl_id
671 ,SYSDATE
672 ,fnd_global.user_id
673 ,SYSDATE
674 ,fnd_global.user_id
675 ,fnd_global.login_id
676 ,PROGRAM_APPLICATION_ID
677 ,PROGRAM_ID
678 ,PROGRAM_UPDATE_DATE
679 ,REQUEST_ID
680 ,new_ph_id
681 ,SEQUENCE_NUMBER
682 ,ORDER_LINE_ID
683 ,COMPONENT_CODE
684 ,LINE_DETAIL_ID
685 ,COMPONENT_RATIO
686 ,REQUESTED_QUANTITY
687 ,INVENTORY_ITEM_ID
688 ,INCLUDED_ITEM_FLAG
689 ,DATE_REQUESTED
690 ,ORIGINAL_REQUESTED_QUANTITY
691 ,WAREHOUSE_ID
692 ,SHIPPED_QUANTITY
693 ,CANCELLED_QUANTITY
694 ,SHIP_TO_SITE_USE_ID
695 ,SHIP_TO_CONTACT_ID
696 ,SHIPMENT_PRIORITY_CODE
697 ,SHIP_METHOD_CODE
698 ,DATE_CONFIRMED
699 ,RA_INTERFACE_STATUS
700 ,INVOICED_QUANTITY
701 ,INVENTORY_STATUS
702 ,UNIT_CODE
703 ,CONTEXT
704 ,ATTRIBUTE1
705 ,ATTRIBUTE2
706 ,ATTRIBUTE3
707 ,ATTRIBUTE4
708 ,ATTRIBUTE5
709 ,ATTRIBUTE6
710 ,ATTRIBUTE7
711 ,ATTRIBUTE8
712 ,ATTRIBUTE9
713 ,ATTRIBUTE10
714 ,ATTRIBUTE11
715 ,ATTRIBUTE12
716 ,ATTRIBUTE13
717 ,ATTRIBUTE14
718 ,ATTRIBUTE15
719 ,SCHEDULE_DATE
720 ,DEMAND_CLASS_CODE
721 ,COMPONENT_SEQUENCE_ID
722 ,CONFIGURATION_ITEM_FLAG
723 ,LATEST_ACCEPTABLE_DATE
724 ,MOVEMENT_ID
725 ,ORG_ID
726 ,TRANSACTION_HEADER_ID
727 ,SERVICE_INTERFACE_STATUS
728 ,BO_PICKING_LINE_ID
729 ,DEP_PLAN_REQUIRED_FLAG
730 ,CUSTOMER_ITEM_ID
731 FROM so_picking_lines_all
732 WHERE picking_line_id = Pl_Id;
733
734 END Insert_Pl_Row;
735
736 -- Procedure Name : Split_Picking_Headers
737
738 -- Purpose :
739 -- Splits Picking Headers and associated Picking Lines if
740 -- necessary while closing a delivery.
741
742 -- Parameters :
743 -- 1. Del_Id IN NUMBER
744 -- - delivery id we are working with
745 PROCEDURE Split_Picking_Headers (Del_Id IN NUMBER) IS
746
747 --declare some local variables
748 ph_id NUMBER;
749 new_ph_id NUMBER;
750 pl_id NUMBER;
751 new_pl_id NUMBER;
752 num_found NUMBER;
753 shp_qty NUMBER;
754 req_qty NUMBER;
755
756 --declare the picking header cursor
757 CURSOR c1(del_id NUMBER) IS
758 SELECT distinct pl.picking_header_id picking_header_id
759 FROM so_picking_lines_all pl, so_picking_line_details pld
760 WHERE pld.delivery_id = del_id
761 AND pld.picking_line_id = pl.picking_line_id
762 AND pl.picking_header_id > 0;
763
764 --declare the picking_lines_cursor
765 CURSOR c2(ph_id NUMBER) IS
766 SELECT picking_line_id
767 FROM so_picking_lines_all
768 WHERE picking_header_id = ph_id;
769
770 BEGIN
771
772 -- Split the picking headers, picking lines and update the shipped
773 -- quantity in picking lines
774
775 OPEN c1 (del_id);
776 Fetch c1 into ph_id ;
777
778 WHILE c1%FOUND LOOP
779 --begin picking header id loop
780
781 --update the delivery_id on so_picking_headers_all
782 UPDATE so_picking_headers_all
783 SET delivery_id = del_id
784 WHERE picking_header_id = ph_id;
785
786 SELECT COUNT(*)
787 into num_found
788 FROM so_picking_line_details pld, so_picking_lines_all pl
789 WHERE pl.picking_header_id = ph_id
790 AND pl.picking_line_id = pld.picking_line_id
791 AND ( pld.delivery_id <> del_id OR
792 pld.delivery_id IS NULL ) ;
793
794 IF num_found > 0 then
795 --insert a new row into so_picking_headers_all by using the row with
796 --picking_header_id = ph_id - except who info.
797
798 --store the new picking header id as new_ph_id
799 select so_picking_headers_s.nextval
800 into new_ph_id
801 from dual;
802
803 insert_ph_row (ph_id, new_ph_id);
804
805 UPDATE so_picking_headers_all
806 set delivery_id = NULL
807 where picking_header_id = ph_id;
808
809 OPEN c2 (ph_id);
810 Fetch c2 into pl_id;
811
812 WHILE c2%FOUND LOOP
813 -- begin picking line loop
814
815 SELECT COUNT(*)
816 INTO num_found
817 FROM so_picking_line_details
818 WHERE picking_line_id = pl_id
819 AND ( delivery_id <> del_id OR
820 delivery_id IS NULL ) ;
821
822 IF num_found > 0 then -- outer if condition
823
824 SELECT COUNT(*)
825 INTO num_found
826 FROM so_picking_line_details
827 WHERE picking_line_id = pl_id
828 AND delivery_id = del_id;
829
830 IF num_found > 0 then -- inner if condition
831
832 --insert a new row into so_picking_lines_all by using the row with
833 --picking_line_id = pl_id and ph_id = new ph id (except the
834 --requested_quantity, shipped_quantity, and who info).
835
836 --get the new picking line id
837 select so_picking_lines_s.nextval
838 into new_pl_id
839 from dual;
840
841 insert_pl_row (pl_id, new_pl_id, new_ph_id);
842
843
844 UPDATE so_picking_line_details
845 SET picking_line_id = new_pl_id
846 WHERE picking_line_id = pl_id
847 AND delivery_id = del_id;
848
849 -- now update the shipped and requested quantities on this new picking line
850 SELECT sum(nvl(shipped_quantity,0)), sum(nvl(requested_quantity,0))
851 INTO shp_qty, req_qty
852 FROM so_picking_line_details
853 WHERE picking_line_id = new_pl_id
854 GROUP BY picking_line_id;
855
856 UPDATE so_picking_lines_all
857 SET shipped_quantity = shp_qty,
858 requested_quantity = req_qty,
859 original_requested_quantity = req_qty
860 where picking_line_id = new_pl_id;
861
862 -- also update the shipped and requested quantities on the old picking line
863 SELECT sum(nvl(shipped_quantity,0)), sum(nvl(requested_quantity,0))
864 INTO shp_qty, req_qty
865 FROM so_picking_line_details
866 WHERE picking_line_id = pl_id
867 GROUP BY picking_line_id;
868
869 UPDATE so_picking_lines_all
870 SET shipped_quantity = shp_qty,
871 requested_quantity = req_qty,
872 original_requested_quantity = req_qty
873 where picking_line_id = pl_id;
874
875 -- ELSE
876
877 -- UPDATE so_picking_lines_all
878 -- SET picking_header_id = new_ph_id
879 -- WHERE picking_line_id = pl_id;
880
881
882 END IF; -- inner if condition
883 ELSE
884
885 UPDATE so_picking_lines_all
886 SET picking_header_id = new_ph_id
887 WHERE picking_line_id = pl_id;
888
889 END IF; -- outer if condition
890
891 -- fetch the next record
892 Fetch c2 into pl_id;
893
894 END LOOP ; -- picking lines loop
895
896 Close c2; -- close the picking line id cursor
897
898 END IF;
899
900 -- fetch the next record
901 Fetch c1 into ph_id ;
902 END LOOP; -- picking header id loop
903
904 Close c1; -- close the picking header id cursor
905
906 END Split_Picking_Headers;
907
908 -- Function Name : Auto_Create_Departure
909
910 -- Purpose :
911 -- To Create a departure and assign it to a delivery if the
912 -- delivery is not already associated with a departure
913
914 -- Parameters :
915 -- All the parameters refer to the values on the delivery
916 -- for which we are creating the departure
917 -- 1. Org_Id IN Number
918 -- 2. Freight_Carrier IN Varchar2(30)
919 -- 3. Weight_UOM IN Varchar2(3)
920 -- 4. Volume_UOM IN Varchar2(3)
921 -- 5. Weight_of_Delivery IN Number
922 -- 6. Volume_of_Delivery IN Number
923
924 -- Return Value : Number - the departure id of the created
925 -- departure
926 --
927 FUNCTION Auto_Create_Departure (
928 Org_Id IN Number,
929 Freight_Carrier IN Varchar2,
930 Weight_UOM IN Varchar2,
931 Volume_UOM IN Varchar2,
932 Weight_of_Delivery IN Number,
933 p_tare_wt IN Number,
934 Volume_of_Delivery IN Number,
935 p_vehicle_item_id IN Number,
936 p_vehicle_number IN Varchar2,
937 p_seal_code IN Varchar2,
938 p_pack_instr IN Varchar2,
939 bol IN VARCHAR2,
940 actual_date IN DATE DEFAULT SYSDATE,
941 dep_name IN VARCHAR2 DEFAULT NULL)
942 RETURN NUMBER IS
943
944 -- declare local variables
945 dep_id Number;
946 x_bol WSH_DEPARTURES.BILL_OF_LADING%TYPE;
947 rep_id number;
948 BEGIN
949
950 -- Get the new departure id from the sequence
951 select WSH_DEPARTURES_S.nextval into dep_id
952 FROM DUAL;
953
954 IF ( bol IS NULL) THEN
955 x_bol := WSH_External_Custom.Bill_Of_Lading( dep_id);
956 ELSE
957 x_bol := bol;
958 END IF;
959
960 wsh_parameters_pvt.get_param_value_num(org_id,'DEPARTURE_REPORT_SET_ID',rep_id);
961
962
963 -- Now go ahead and to the Insert
964
965 INSERT INTO WSH_DEPARTURES (
966 ORGANIZATION_ID
967 ,DEPARTURE_ID
968 ,NAME
969 ,SOURCE_CODE
970 ,ARRIVE_AFTER_DEPARTURE_ID
971 ,STATUS_CODE
972 ,REPORT_SET_ID
973 ,DATE_CLOSED
974 ,VEHICLE_ITEM_ID
975 ,VEHICLE_NUMBER
976 ,FREIGHT_CARRIER_CODE
977 ,PLANNED_DEPARTURE_DATE
978 ,ACTUAL_DEPARTURE_DATE
979 ,BILL_OF_LADING
980 ,GROSS_WEIGHT
981 ,NET_WEIGHT
982 ,WEIGHT_UOM_CODE
983 ,VOLUME
984 ,VOLUME_UOM_CODE
985 ,FILL_PERCENT
986 ,SEAL_CODE
987 ,ROUTING_INSTRUCTIONS
988 ,ATTRIBUTE_CATEGORY
989 ,ATTRIBUTE1
990 ,ATTRIBUTE2
991 ,ATTRIBUTE3
992 ,ATTRIBUTE4
993 ,ATTRIBUTE5
994 ,ATTRIBUTE6
995 ,ATTRIBUTE7
996 ,ATTRIBUTE8
997 ,ATTRIBUTE9
998 ,ATTRIBUTE10
999 ,ATTRIBUTE11
1000 ,ATTRIBUTE12
1001 ,ATTRIBUTE13
1002 ,ATTRIBUTE14
1003 ,ATTRIBUTE15
1004 ,CREATION_DATE
1005 ,CREATED_BY
1006 ,LAST_UPDATE_DATE
1007 ,LAST_UPDATED_BY
1008 ,LAST_UPDATE_LOGIN
1009 ,PROGRAM_APPLICATION_ID
1010 ,PROGRAM_ID
1011 ,PROGRAM_UPDATE_DATE
1012 ,REQUEST_ID )
1013 VALUES
1014 (
1015 Org_Id /*ORGANIZATION_ID */
1016 ,dep_id /* DEPARTURE_ID */
1017 ,NVL( dep_name, to_char(dep_id)) /* NAME */
1018 ,'S' /* SOURCE_CODE */
1019 ,NULL /* ARRIVE_AFTER_DEPARTURE_ID */
1020 ,'CL' /* STATUS_CODE */
1021 ,rep_id /* REPORT_SET_ID */
1022 ,SYSDATE /* DATE_CLOSED */
1023 ,p_vehicle_item_id /* VEHICLE_ITEM_ID */
1024 ,p_vehicle_number /* VEHICLE_NUMBER */
1025 ,Freight_Carrier /* FREIGHT_CARRIER_CODE */
1026 ,SYSDATE /* PLANNED_DEPARTURE_DATE */
1027 ,NVL( actual_date, SYSDATE) /* ACTUAL_DEPARTURE_DATE */
1028 ,x_bol
1029 ,Weight_of_Delivery /* GROSS_WEIGHT */
1030 ,Weight_of_delivery - p_tare_wt /* NET_WEIGHT */
1031 ,Weight_UOM /* WEIGHT_UOM_CODE */
1032 ,Volume_of_Delivery /* VOLUME */
1033 ,Volume_UOM /* VOLUME_UOM_CODE */
1034 ,NULL /* FILL_PERCENT */
1035 ,p_seal_code /* SEAL_CODE */
1036 ,p_pack_instr /* ROUTING_INSTRUCTIONS */
1037 ,NULL /* ATTRIBUTE_CATEGORY */
1038 ,NULL /* ATTRIBUTE1 */
1039 ,NULL /* ATTRIBUTE2 */
1040 ,NULL /* ATTRIBUTE3 */
1041 ,NULL /* ATTRIBUTE4 */
1042 ,NULL /* ATTRIBUTE5 */
1043 ,NULL /* ATTRIBUTE6 */
1044 ,NULL /* ATTRIBUTE7 */
1045 ,NULL /* ATTRIBUTE8 */
1046 ,NULL /* ATTRIBUTE9 */
1047 ,NULL /* ATTRIBUTE10 */
1048 ,NULL /* ATTRIBUTE11 */
1049 ,NULL /* ATTRIBUTE12 */
1050 ,NULL /* ATTRIBUTE13 */
1051 ,NULL /* ATTRIBUTE14 */
1052 ,NULL /* ATTRIBUTE15 */
1053 ,SYSDATE /* CREATION_DATE */
1054 ,FND_GLOBAL.User_Id /* CREATED_BY */
1055 ,SYSDATE /* LAST_UPDATE_DATE */
1056 ,FND_GLOBAL.User_Id /* LAST_UPDATED_BY */
1057 ,FND_GLOBAL.Login_Id /* LAST_UPDATE_LOGIN */
1058 ,300 /* PROGRAM_APPLICATION_ID - 300 for order entry */
1059 ,NULL /* PROGRAM_ID */
1060 ,SYSDATE /* PROGRAM_UPDATE_DATE */
1061 ,NULL /* REQUEST_ID */
1062 );
1063
1064 Return Dep_Id;
1065
1066 --handle any exceptions
1067
1068 Exception
1069
1070 WHEN OTHERS THEN
1071 FND_MESSAGE.Set_Name('OE','OE_QUERY_ERROR');
1072 FND_MESSAGE.Set_Token('PACKAGE','WSH_SC_DELIVERY_PVT.Auto_Create_Departure');
1073 FND_MESSAGE.Set_Token('ORA_ERROR',to_char(sqlcode));
1074 FND_MESSAGE.Set_Token('ORA_TEXT',SQLERRM);
1075 APP_EXCEPTION.Raise_Exception;
1076 Return -1;
1077
1078 END Auto_Create_Departure;
1079
1080 -- Function Name : Delete_Container_Contents
1081
1082 -- Purpose :
1083
1084 -- Parameters : X_Contaier_Id IN Number
1085
1086 -- Return Value : Boolean
1087
1088 FUNCTION Delete_Container_Contents( x_container_id IN NUMBER)
1089 RETURN BOOLEAN IS
1090
1091 CURSOR c1( x_cid NUMBER) IS
1092 SELECT container_id FROM so_picking_line_details
1093 WHERE container_id = x_cid
1094 FOR UPDATE OF picking_line_detail_id NOWAIT;
1095 dummy_id NUMBER;
1096 record_locked EXCEPTION;
1097 PRAGMA EXCEPTION_INIT( record_locked, -54);
1098 BEGIN
1099 SAVEPOINT before_lock;
1100 OPEN c1(x_container_id);
1101 FETCH c1 INTO dummy_id;
1102 CLOSE c1;
1103
1104 UPDATE so_picking_line_details
1105 SET container_id = NULL
1106 WHERE container_id = x_container_id;
1107
1108 RETURN TRUE;
1109 EXCEPTION
1110 WHEN others THEN
1111 ROLLBACK TO before_lock;
1112 IF c1%ISOPEN THEN
1113 CLOSE c1;
1114 END IF;
1115 FND_MESSAGE.SET_NAME('OE', 'WSH_FAIL_TO_LOCK_PLD');
1116 RETURN FALSE;
1117 END Delete_Container_Contents;
1118
1119
1120
1121 END WSH_SC_DELIVERY_PVT;