DBA Data[Home] [Help]

PACKAGE BODY: APPS.WIP_MOVPROC_PRIV

Source


1 PACKAGE BODY wip_movProc_priv AS
2 /* $Header: wipmovpb.pls 120.66.12020000.8 2013/03/14 07:46:02 akuppa ship $*/
3 
4 TYPE move_profile_rec_t IS RECORD(
5           child_txn_id   NUMBER,
6           cmp_txn_id     NUMBER,
7           org_id         NUMBER,
8           wip_id         NUMBER,
9           entity_type    NUMBER,
10           fmOp           NUMBER,
11           fmStep         NUMBER,
12           toOp           NUMBER,
13           toStep         NUMBER,
14           scrapTxn       NUMBER,      -- Scrap txn?
15           easyComplete   NUMBER,      -- Completion txn?
16           easyReturn     NUMBER,      -- Return txn?
17           jobTxn         NUMBER,      -- Any move txns on a job?
18           scheTxn        NUMBER,      -- Any move txns on a schedule?
19           rsrcItem       NUMBER,      -- Existence of auto resource per item?
20           rsrcLot        NUMBER,      -- Existence of auto resource per lot?
21           poReqItem      NUMBER,      -- Existence of po requisition per item?
22           poReqLot       NUMBER);     -- Existence of po requisition per lot?
23 
24 TYPE group_rec_t IS RECORD(
25           group_id       NUMBER,
26           assy_header_id NUMBER,        -- Assembly header ID
27           mtl_header_id  NUMBER,        -- Material header ID (component)
28           move_mode      NUMBER,        -- Move processing mode
29           bf_mode        NUMBER,        -- Backflush processing mode
30           mtl_mode       NUMBER,        -- Material processing mode
31           txn_date       DATE,          -- Transactions date
32           process_phase  NUMBER,
33           process_status NUMBER,
34           time_out       NUMBER,        -- Processing time out in seconds
35           intf_tbl_name  VARCHAR2(240), -- Interface table name
36           user_id        NUMBER,
37           login_id       NUMBER,
38           request_id     NUMBER,
39           application_id NUMBER,
40           program_id     NUMBER,
41           move_profile   move_profile_rec_t,
42           seq_move       NUMBER);       -- Sequencing move or not
43 
44 -- this record used to store all necessary info need to change in
45 -- wip_operations for repetitive schedule allocation
46 TYPE update_rsa_rec_t IS RECORD(scheID      NUMBER,
47                                 scheQty     NUMBER,
48                                 loginID     NUMBER,
49                                 reqID       NUMBER,
50                                 appID       NUMBER,
51                                 progID      NUMBER,
52                                 createdBy   NUMBER,
53                                 updatedBy   NUMBER,
54                                 orgID       NUMBER,
55                                 wipID       NUMBER,
56                                 fmOp        NUMBER,
57                                 fmStep      NUMBER,
58                                 toOp        NUMBER,
59                                 toStep      NUMBER);
60 TYPE update_rsa_tbl_t IS TABLE OF update_rsa_rec_t INDEX BY binary_integer;
61 TVE_NO_MOVE_ALLOC CONSTANT NUMBER := -5; -- Cannot execute move allocation
62 TVE_OVERCOMPLETION_MISMATCH CONSTANT NUMBER := -6; -- Cannot execute move alloc
63 
64 -- transaction_source_type_id used to insert into MMTT
65 TPS_INV_JOB_OR_SCHED CONSTANT NUMBER := 5;
66 
67 /*****************************************************************************
68  * This procedure will be used to backflush assembly pull component for
69  * EZ Completion an EZ Return transaction.
70  ****************************************************************************/
71 PROCEDURE backflush_assy_pull(p_gib          IN OUT NOCOPY group_rec_t,
72                               p_move_txn_id  IN            NUMBER,
73                               p_entity_type  IN            NUMBER) IS
74 
75 CURSOR c_repAssembly IS
76   SELECT mmt.completion_transaction_id cpl_txn_id,
77          mmt.transaction_action_id txn_action_id,
78          mmt.transaction_source_id txn_src_id,
79          mmt.repetitive_line_id rep_line_id,
80          mmt.organization_id org_id,
81          mmt.transaction_date txn_date,
82          ABS(mmt.primary_quantity) primary_qty,
83          mmt.reason_id reason_id,
84          mmt.transaction_reference reference,
85          /* Fixed bug 4628893 */
86          mmt.move_transaction_id move_txn_id,
87          wmti.transaction_type txn_type
88     FROM mtl_material_transactions mmt,
89          wip_move_txn_interface wmti
90    /* Bug 4891549 - Modified where clause to improve performance. */
91    WHERE mmt.transaction_source_type_id = TPS_INV_JOB_OR_SCHED
92      AND mmt.transaction_source_id = wmti.wip_entity_id
93      AND mmt.organization_id = wmti.organization_id
94    /* End fix for bug 4891549 */
95      AND mmt.move_transaction_id = wmti.transaction_id
96      AND wmti.transaction_id = p_move_txn_id /* Fixed bug 4916939 */
97      AND wmti.group_id = p_gib.group_id
98      AND wmti.entity_type = WIP_CONSTANTS.REPETITIVE
99      AND wmti.transaction_date = mmt.transaction_date   /*Bug 5581147 - Added to improve selectivity*/
100      AND mmt.transaction_action_id IN (WIP_CONSTANTS.RETASSY_ACTION,
101                                        WIP_CONSTANTS.CPLASSY_ACTION);
102 
103 CURSOR c_discAssembly IS
104   SELECT mmt.completion_transaction_id cpl_txn_id,
105          mmt.transaction_action_id txn_action_id,
106          mmt.transaction_source_id txn_src_id,
107          mmt.organization_id org_id,
108          mmt.transaction_date txn_date,
109          ABS(mmt.primary_quantity) primary_qty,
110          wmti.entity_type entity_type,
111          mmt.reason_id reason_id,
112          mmt.transaction_reference reference,
113          /* Fixed bug 4628893 */
114          mmt.move_transaction_id move_txn_id,
115          wmti.transaction_type txn_type
116     FROM mtl_material_transactions mmt,
117          wip_move_txn_interface wmti
118     /* Bug 4891549 - Modified where clause to improve performance. */
119    WHERE mmt.transaction_source_type_id = TPS_INV_JOB_OR_SCHED
120      AND mmt.transaction_source_id = wmti.wip_entity_id
121      AND mmt.organization_id = wmti.organization_id
122    /* End fix for bug 4891549 */
123      AND mmt.move_transaction_id = wmti.transaction_id
124      AND wmti.transaction_id = p_move_txn_id /* Fixed bug 4916939 */
125      AND wmti.group_id = p_gib.group_id
126      AND wmti.transaction_date = mmt.transaction_date   /*Bug 5581147 - Added to improve selectivity*/
127      AND wmti.entity_type = WIP_CONSTANTS.DISCRETE
128      AND mmt.transaction_action_id IN (WIP_CONSTANTS.RETASSY_ACTION,
129                                        WIP_CONSTANTS.CPLASSY_ACTION);
130 
131 	/*Bug 12942986: Because of fix 4343850 in wipmovpb.pls asembly completion record gets committed in MMTT.
132  	 Now if process fails after that, then MMTT will have that record and everything else will be rollback.
133  	 Thus when the process is re-submitted assy_pull components need to be backflushed. Before this fix they
134  	 are backflushed based on MMT. After this cursor is implemented they will be backflushed based on MMTT
135  	 as well. The assy_completion record will either be in MMTT or MMT (not both), for a particular
136  	 move_transaction_id*/
137  	 CURSOR c_discAssembly_mmtt IS
138  	   SELECT mmtt.completion_transaction_id cpl_txn_id,
139  	          mmtt.transaction_action_id txn_action_id,
140  	          mmtt.transaction_source_id txn_src_id,
141  	          mmtt.organization_id org_id,
142  	          mmtt.transaction_date txn_date,
143  	          ABS(mmtt.primary_quantity) primary_qty,
144  	          wmti.entity_type entity_type,
145  	          mmtt.reason_id reason_id,
146  	          mmtt.transaction_reference reference,
147  	          /* Fixed bug 4604021 */
148  	          mmtt.move_transaction_id move_txn_id,
149  	          wmti.transaction_type txn_type
150  	     FROM mtl_material_transactions_temp mmtt,
151  	          wip_move_txn_interface wmti
152  	    WHERE mmtt.move_transaction_id = wmti.transaction_id
153  	      AND mmtt.transaction_source_type_id = 5 /* Bug 4886889 - improve performance fetching from MMT. */
154  	      AND mmtt.transaction_source_id = wmti.wip_entity_id
155  	      AND mmtt.organization_id = wmti.organization_id
156  	      AND wmti.transaction_id = p_move_txn_id
157  	      AND wmti.group_id = p_gib.group_id /* Fixed bug 4744110 */
158  	      AND wmti.transaction_date = mmtt.transaction_date  /*Bug 5466203 - Added to improve selectivity*/
159  	      AND wmti.entity_type IN (WIP_CONSTANTS.DISCRETE,
160  	                               WIP_CONSTANTS.LOTBASED)
161  	      AND mmtt.transaction_action_id IN (WIP_CONSTANTS.RETASSY_ACTION,
162  	                                        WIP_CONSTANTS.CPLASSY_ACTION);
163 
164 CURSOR c_OSFMAssembly IS
165   SELECT mmt.completion_transaction_id cpl_txn_id,
166          mmt.transaction_action_id txn_action_id,
167          mmt.transaction_source_id txn_src_id,
168          mmt.organization_id org_id,
169          mmt.transaction_date txn_date,
170          ABS(mmt.primary_quantity) primary_qty,
171          wmti.entity_type entity_type,
172          mmt.reason_id reason_id,
173          mmt.transaction_reference reference,
174          /* Fixed bug 4628893 */
175          mmt.move_transaction_id move_txn_id,
176          wmti.transaction_type txn_type,
177          /* Fixed bug 5014211 */
178          wmti.fm_operation_seq_num fm_op,
179          wmti.fm_intraoperation_step_type fm_step,
180          wmti.to_operation_seq_num to_op,
181          wmti.to_intraoperation_step_type to_step
182          /* End fix of bug 5014211 */
183     FROM mtl_material_transactions mmt,
184          wip_move_txn_interface wmti
185     /* Bug 4891549 - Modified where clause to improve performance. */
186    WHERE mmt.transaction_source_type_id = TPS_INV_JOB_OR_SCHED
187      AND mmt.transaction_source_id = wmti.wip_entity_id
188      AND mmt.organization_id = wmti.organization_id
189    /* End fix for bug 4891549 */
190      AND mmt.move_transaction_id = wmti.transaction_id
191      AND wmti.transaction_id = p_move_txn_id /* Fixed bug 4916939 */
192      AND wmti.group_id = p_gib.group_id
193      AND wmti.transaction_date = mmt.transaction_date   /*Bug 5581147 - Added to improve selectivity*/
194      AND wmti.entity_type = WIP_CONSTANTS.LOTBASED
195      AND mmt.transaction_action_id IN (WIP_CONSTANTS.RETASSY_ACTION,
196                                        WIP_CONSTANTS.CPLASSY_ACTION);
197 
198 l_repAssembly      c_repAssembly%ROWTYPE;
199 l_discAssembly     c_discAssembly%ROWTYPE;
200 l_OSFMAssembly     c_OSFMAssembly%ROWTYPE;
201 l_params           wip_logger.param_tbl_t;
202 l_returnStatus     VARCHAR2(1);
203 l_errMsg           VARCHAR(240);
204 l_msg              VARCHAR(240);
205 l_logLevel         NUMBER := fnd_log.g_current_runtime_level;
206 l_bf_required      NUMBER; -- throw away value
207 l_ls_required      NUMBER;
208 -- New variable to pass to OSFM new backflush API.
209 l_error_msg        VARCHAR2(1000);
210 l_error_count      NUMBER;
211 BEGIN
212   -- write parameter value to log file
213   IF (l_logLevel <= wip_constants.trace_logging) THEN
214     l_params(1).paramName  := 'p_group_id';
215     l_params(1).paramValue :=  p_gib.group_id;
216     l_params(2).paramName  := 'p_mtl_header_id';
217     l_params(2).paramValue :=  p_gib.mtl_header_id;
218     l_params(3).paramName  := 'p_mtl_mode';
219     l_params(3).paramValue :=  p_gib.mtl_mode;
220     /* Fixed bug 4916939 */
221     l_params(4).paramName  := 'p_move_txn_id';
222     l_params(4).paramValue :=  p_move_txn_id;
223     l_params(5).paramName  := 'p_entity_type';
224     l_params(5).paramValue :=  p_entity_type;
225 
226     wip_logger.entryPoint(p_procName =>'wip_movProc_priv.backflush_assy_pull',
227                           p_params => l_params,
228                           x_returnStatus => l_returnStatus);
229   END IF;
230   IF(p_entity_type = WIP_CONSTANTS.REPETITIVE) THEN
231     FOR l_repAssembly IN c_repAssembly LOOP
232       wip_bflProc_priv.backflush(
233         p_wipEntityID     => l_repAssembly.txn_src_id,
234         p_orgID           => l_repAssembly.org_id,
235         p_primaryQty      => l_repAssembly.primary_qty,
236         p_txnDate         => l_repAssembly.txn_date,
237         p_txnHdrID        => p_gib.mtl_header_id,
238         -- Fixed bug 5056289. Pass move_id as a batch_id because we want
239         -- inventory to fail only components related to a specific move record.
240         p_batchID         => p_move_txn_id,
241         p_txnType         => l_repAssembly.txn_type,
242         p_entityType      => WIP_CONSTANTS.REPETITIVE,
243         p_tblName         => WIP_CONSTANTS.MTI_TBL,
244         p_lineID          => l_repAssembly.rep_line_id,
245         p_cplTxnID        => l_repAssembly.cpl_txn_id,
246         -- Fixed bug 5014211. Stamp move_transaction_id for assembly
247         -- pull components so that we will have a link if component
248         -- records fail inventory validation.
249         p_movTxnID        => l_repAssembly.move_txn_id,
250         -- End fix of 5014211.
251         p_fmMoveProcessor => WIP_CONSTANTS.YES,
252         p_mtlTxnMode      => p_gib.mtl_mode,
253         p_reasonID        => l_repAssembly.reason_id,
254         p_reference       => l_repAssembly.reference,
255         -- Set lock_flag to 1 to prevent inventory worker pick up the record.
256         -- Need this change because we will commit after each TM call.
257         p_lockFlag        => WIP_CONSTANTS.YES,
258         x_lotSerRequired  => l_ls_required,
259         x_bfRequired      => l_bf_required,
260         x_returnStatus    => l_returnStatus);
261 
262       IF(l_returnStatus <> fnd_api.g_ret_sts_success) THEN
263         raise fnd_api.g_exc_unexpected_error;
264       ELSE
265         IF(l_ls_required = WIP_CONSTANTS.YES) THEN
266           -- If we need to gather more lot/serial, error out because
267           -- we cannot gather lot/serial for background transaction.
268           fnd_message.set_name('WIP', 'WIP_NO_LOT_SER_COMP_BKGND');
269           fnd_msg_pub.add;
270           raise fnd_api.g_exc_unexpected_error;
271         END IF;
272       END IF; -- check return status
273     END LOOP; -- repetitive schedule
274   ELSIF(p_entity_type = WIP_CONSTANTS.DISCRETE) THEN
275     FOR l_discAssembly IN c_discAssembly LOOP
276 	  wip_logger.log('Backflush from MMT for txn_src_id: ' || l_discAssembly.txn_src_id, l_returnStatus);
277       wip_bflProc_priv.backflush(
278         p_wipEntityID     => l_discAssembly.txn_src_id,
279         p_orgID           => l_discAssembly.org_id,
280         p_primaryQty      => l_discAssembly.primary_qty,
281         p_txnDate         => l_discAssembly.txn_date,
282         p_txnHdrID        => p_gib.mtl_header_id,
283         -- Fixed bug 5056289. Pass move_id as a batch_id because we want
284         -- inventory to fail only components related to a specific move record.
285         p_batchID         => p_move_txn_id,
286         p_txnType         => l_discAssembly.txn_type,
287         p_entityType      => l_discAssembly.entity_type,
288         p_tblName         => WIP_CONSTANTS.MTI_TBL,
289         p_cplTxnID        => l_discAssembly.cpl_txn_id,
290         -- Fixed bug 5014211. Stamp move_transaction_id for assembly
291         -- pull components so that we will have a link if component
292         -- records fail inventory validation.
293         p_movTxnID        => l_discAssembly.move_txn_id,
294         -- End fix of 5014211.
295         p_fmMoveProcessor => WIP_CONSTANTS.YES,
296         p_mtlTxnMode      => p_gib.mtl_mode,
297         p_reasonID        => l_discAssembly.reason_id,
298         p_reference       => l_discAssembly.reference,
299         -- Set lock_flag to 1 to prevent inventory worker pick up the record.
300         -- Need this change because we will commit after each TM call.
301         p_lockFlag        => WIP_CONSTANTS.YES,
302         x_lotSerRequired  => l_ls_required,
303         x_bfRequired      => l_bf_required,
304         x_returnStatus    => l_returnStatus);
305 
306       IF(l_returnStatus <> fnd_api.g_ret_sts_success) THEN
307         raise fnd_api.g_exc_unexpected_error;
308       ELSE
309         IF(l_ls_required = WIP_CONSTANTS.YES) THEN
310           -- If we need to gather more lot/serial, error out because
311           -- we cannot gather lot/serial for background transaction.
312           fnd_message.set_name('WIP', 'WIP_NO_LOT_SER_COMP_BKGND');
313           fnd_msg_pub.add;
314           raise fnd_api.g_exc_unexpected_error;
315         END IF;
316       END IF; -- check return status
317     END LOOP; -- Discrete (MMT)
318 	/*Bug 12942986: Because of fix 4343850 in wipmovpb.pls asembly completion record gets committed in MMTT.
319  	 Now if process fails after that, then MMTT will have that record and everything else will be rollback.
320  	 Thus when the process is re-submitted assy_pull components need to be backflushed. Before this fix they
321  	 are backflushed based on MMT. After this LOOP is implemented they will be backflushed based on MMTT
322  	 as well. The assy_completion record will either be in MMTT or MMT (not both), for a particular
323  	 move_transaction_id*/
324  	   FOR l_discAssembly IN c_discAssembly_mmtt LOOP
325 		wip_logger.log('Backflush from MMTT for txn_src_id: ' || l_discAssembly.txn_src_id, l_returnStatus);
326 		 wip_bflProc_priv.backflush(
327  	         p_wipEntityID     => l_discAssembly.txn_src_id,
328  	         p_orgID           => l_discAssembly.org_id,
329  	         p_primaryQty      => l_discAssembly.primary_qty,
330  	         p_txnDate         => l_discAssembly.txn_date,
331  	         p_txnHdrID        => p_gib.mtl_header_id,
332  	         -- Fixed bug 4917331. Pass move_id as a batch_id because we want
333  	         -- inventory to fail only components related to a specific move record.
334  	         p_batchID         => p_move_txn_id,
335  	         p_txnType         => l_discAssembly.txn_type,
336  	         p_entityType      => l_discAssembly.entity_type,
337  	         p_tblName         => WIP_CONSTANTS.MTI_TBL,
338  	         p_cplTxnID        => l_discAssembly.cpl_txn_id,
339  	         -- Fixed bug 4865234. Stamp move_transaction_id for assembly
340  	         -- pull components so that we will have a link if component
341  	         -- records fail inventory validation.
342  	         p_movTxnID        => l_discAssembly.move_txn_id,
343  	         p_fmMoveProcessor => WIP_CONSTANTS.YES,
344  	         p_mtlTxnMode      => p_gib.mtl_mode,
345  	         p_reasonID        => l_discAssembly.reason_id,
346  	         p_reference       => l_discAssembly.reference,
347  	         -- Set lock_flag to 1 to prevent inventory worker pick up the record.
348  	         -- Need this change because we will commit after each TM call.
349  	         p_lockFlag        => WIP_CONSTANTS.YES,
350  	         x_lotSerRequired  => l_ls_required,
351  	         x_bfRequired      => l_bf_required,
352  	         x_returnStatus    => l_returnStatus);
353 
354  	     IF(l_returnStatus <> fnd_api.g_ret_sts_success) THEN
355  	       raise fnd_api.g_exc_unexpected_error;
356  	     ELSE
357  	       IF(l_ls_required = WIP_CONSTANTS.YES) THEN
358  	         -- If we need to gather more lot/serial, error out because
359  	         -- we cannot gather lot/serial for background transaction.
360  	         fnd_message.set_name('WIP', 'WIP_NO_LOT_SER_COMP_BKGND');
361  	         fnd_msg_pub.add;
362  	         raise fnd_api.g_exc_unexpected_error;
363  	       END IF;
364  	     END IF; -- check return status
365  	   END LOOP; -- Discrete (MMTT)
366   ELSIF(p_entity_type = WIP_CONSTANTS.LOTBASED) THEN
367     FOR l_OSFMAssembly IN c_OSFMAssembly LOOP
368       wsm_serial_support_grp.backflush_comp(
369         p_wipEntityID     => l_OSFMAssembly.txn_src_id,
370         p_orgID           => l_OSFMAssembly.org_id,
371         p_primaryQty      => l_OSFMAssembly.primary_qty,
372         p_txnDate         => l_OSFMAssembly.txn_date,
373         p_txnHdrID        => p_gib.mtl_header_id,
374         p_txnType         => l_OSFMAssembly.txn_type,
375         -- Fixed bug 5014211. Stamp move_transaction_id for assembly
376         -- pull components so that we will have a link if component
377         -- records fail inventory validation.
378         p_fmOp            => l_OSFMAssembly.fm_op,
379         p_fmStep          => l_OSFMAssembly.fm_step,
380         p_toOp            => l_OSFMAssembly.to_op,
381         p_toStep          => l_OSFMAssembly.to_step,
382         p_movTxnID        => l_OSFMAssembly.move_txn_id,
383         -- End fix of 5014211.
384         p_cplTxnID        => l_OSFMAssembly.cpl_txn_id,
385         p_mtlTxnMode      => p_gib.mtl_mode,
386         p_reasonID        => l_OSFMAssembly.reason_id,
387         p_reference       => l_OSFMAssembly.reference,
388         p_init_msg_list   => fnd_api.g_true,
389         x_lotSerRequired  => l_ls_required,
390         x_returnStatus    => l_returnStatus,
391         x_error_msg       => l_error_msg,      -- throw away value
392         x_error_count     => l_error_count);   -- throw away value
393 
394       IF(l_returnStatus <> fnd_api.g_ret_sts_success) THEN
395         raise fnd_api.g_exc_unexpected_error;
396       ELSE
397         IF(l_ls_required = WIP_CONSTANTS.YES) THEN
398           -- If we need to gather more lot/serial, error out because
399           -- we cannot gather lot/serial for background transaction.
400           fnd_message.set_name('WIP', 'WIP_NO_LOT_SER_COMP_BKGND');
401           fnd_msg_pub.add;
402           raise fnd_api.g_exc_unexpected_error;
403         END IF;
404       END IF; -- check return status
405     END LOOP; -- OSFM
406   END IF; -- entity_type check
407   -- write to the log file
408   IF (l_logLevel <= wip_constants.trace_logging) THEN
409     wip_logger.exitPoint(p_procName => 'wip_movProc_priv.backflush_assy_pull',
410                          p_procReturnStatus => 'S',
411                          p_msg => 'procedure complete',
412                          x_returnStatus => l_returnStatus);
413   END IF;
414 END backflush_assy_pull;
415 
416 
417 /*****************************************************************************
418  * This procedure will delete record from MTI and MTLI if the components fail
419  * inventory validation. It will also update a corresponding move record to
420  * error status.
421  ****************************************************************************/
422 PROCEDURE component_cleanup(p_mtl_header_id IN NUMBER,
423                             p_group_id      IN NUMBER) IS
424 
425 l_params        wip_logger.param_tbl_t;
426 l_returnStatus  VARCHAR(1);
427 l_msg           VARCHAR(240);
428 l_logLevel      NUMBER := fnd_log.g_current_runtime_level;
429 BEGIN
430   -- write parameter value to log file
431   IF (l_logLevel <= wip_constants.trace_logging) THEN
432     l_params(1).paramName   := 'p_mtl_header_id';
433     l_params(1).paramValue  :=  p_mtl_header_id;
434     l_params(2).paramName   := 'p_group_id';
435     l_params(2).paramValue  :=  p_group_id;
436     wip_logger.entryPoint(p_procName =>'wip_movProc_priv.component_cleanup',
437                           p_params => l_params,
438                           x_returnStatus => l_returnStatus);
439   END IF;
440   -- Update status of move record to error if components fail inventory
441   -- validation.
442   UPDATE wip_move_txn_interface wmti
443      SET wmti.process_status = WIP_CONSTANTS.ERROR
444    WHERE wmti.group_id = p_group_id
445      AND EXISTS
446          (SELECT 1
447             FROM mtl_transactions_interface mti
448            WHERE mti.transaction_header_id = p_mtl_header_id
449              AND mti.move_transaction_id = wmti.transaction_id
450              AND mti.error_explanation IS NOT NULL);
451 
452   IF (l_logLevel <= wip_constants.full_logging) THEN
453     fnd_message.set_name('WIP', 'WIP_UPDATED_ROWS');
454     fnd_message.set_token('ENTITY1', SQL%ROWCOUNT);
455     fnd_message.set_token('ENTITY2', 'WIP_MOVE_TXN_INTERFACE');
456     l_msg := fnd_message.get;
457     wip_logger.log(p_msg          => l_msg,
458                    x_returnStatus => l_returnStatus);
459   END IF;
460 
461   /*Bug 9813601 (FP of 9760758)
462      After bug fix 8663842, when transaction_batch_id is not populated,
463      records that pass inventory validation can be moved to MMTT and MTLT,
464      we need to delete them also for the same transaction_header_id*/
465      -- Delete error records from MTLT
466    DELETE FROM mtl_transaction_lots_temp mtlt
467     WHERE mtlt.transaction_temp_id  IN
468          (SELECT mmtt.transaction_temp_id
469             FROM mtl_material_transactions_temp mmtt
470            WHERE mmtt.transaction_header_id = p_mtl_header_id
471            AND EXISTS
472            (SELECT *
473              FROM mtl_transactions_interface mti
474            WHERE mti.move_transaction_id = mmtt.move_transaction_id
475            AND mti.transaction_header_id = p_mtl_header_id));
476 
477    IF (l_logLevel <= wip_constants.full_logging) THEN
478      l_msg := SQL%ROWCOUNT ||
479               ' rows deleted from mtl_transaction_lots_temp';
480      wip_logger.log(p_msg          => l_msg,
481                     x_returnStatus => l_returnStatus);
482    END IF;
483 
484     -- Delete error records from MTTT
485    DELETE FROM mtl_material_transactions_temp mmtt
486     WHERE mmtt.transaction_header_id = p_mtl_header_id
487     AND EXISTS
488      (SELECT *
489        FROM mtl_transactions_interface mti
490       WHERE mti.move_transaction_id = mmtt.move_transaction_id
491       AND mti.transaction_header_id = p_mtl_header_id);
492 
493    IF (l_logLevel <= wip_constants.full_logging) THEN
494      l_msg := SQL%ROWCOUNT ||
495               ' rows deleted from mtl_material_transactions_temp';
496      wip_logger.log(p_msg          => l_msg,
497                     x_returnStatus => l_returnStatus);
498    END IF;
499 
500   -- Delete error records from MTLI
501   DELETE FROM mtl_transaction_lots_interface mtli
502    WHERE mtli.transaction_interface_id IN
503         (SELECT mti.transaction_interface_id
504            FROM mtl_transactions_interface mti
505           WHERE mti.transaction_header_id = p_mtl_header_id);
506 
507   IF (l_logLevel <= wip_constants.full_logging) THEN
508     l_msg := SQL%ROWCOUNT ||
509              ' rows deleted from mtl_transaction_lots_interface';
510     wip_logger.log(p_msg          => l_msg,
511                    x_returnStatus => l_returnStatus);
512   END IF;
513 
514   -- Delete error records from MTI
515   DELETE FROM mtl_transactions_interface
516    WHERE transaction_header_id = p_mtl_header_id;
517 
518   IF (l_logLevel <= wip_constants.full_logging) THEN
519     l_msg := SQL%ROWCOUNT ||
520              ' rows deleted from mtl_transactions_interface';
521     wip_logger.log(p_msg          => l_msg,
522                    x_returnStatus => l_returnStatus);
523   END IF;
524 
525   l_returnStatus := fnd_api.g_ret_sts_success;
526   IF (l_logLevel <= wip_constants.trace_logging) THEN
527     wip_logger.exitPoint(p_procName => 'wip_movProc_priv.component_cleanup',
528                          p_procReturnStatus => l_returnStatus,
529                          p_msg => 'procedure complete',
530                          x_returnStatus => l_returnStatus);
531   END IF;
532 
533 END component_cleanup;
534 
535 
536 /*****************************************************************************
537  * This is an autonomous procedure that will move an error message from MTI to
538  * WMTI.
539  ****************************************************************************/
540 PROCEDURE write_mtl_error(p_move_id                NUMBER,
541                           p_error_msg              VARCHAR2,
542                           p_last_update_date       DATE,
543                           p_last_updated_by        NUMBER,
544                           p_creation_date          DATE,
545                           p_created_by             NUMBER,
546                           p_last_update_login      NUMBER,
547                           p_request_id             NUMBER,
548                           p_program_application_id NUMBER,
549                           p_program_id             NUMBER,
550                           p_program_update_date    DATE) IS
551 
552  PRAGMA AUTONOMOUS_TRANSACTION;
553 
554 BEGIN
555 
556   INSERT INTO wip_txn_interface_errors
557    (transaction_id,
558     error_column,
559     error_message,
560     last_update_date,
561     last_updated_by,
562     creation_date,
563     created_by,
564     last_update_login,
565     request_id,
566     program_application_id,
567     program_id,
568     program_update_date
569    )
570    VALUES(p_move_id,                  -- transaction_id
571           NULL,                       -- error_column
572           p_error_msg,                -- error_message
573           p_last_update_date,
574           p_last_updated_by,
575           p_creation_date,
576           p_created_by,
577           p_last_update_login,
578           p_request_id,
579           p_program_application_id,
580           p_program_id,
581           p_program_update_date);
582 
583   COMMIT;
584 END write_mtl_error;
585 
586 /*****************************************************************************
587  * This procedure will be used to record error messages from
588  * MTL_TRANSACTIONS_INTERFACE into WIP_TXN_INTERFACE_ERRORS
589  ****************************************************************************/
590 PROCEDURE write_mtl_errors(p_mtl_header_id IN NUMBER) IS
591 
592 CURSOR c_mtl_errors IS
593   SELECT mti.move_transaction_id,
594          substrb(msik.concatenated_segments || ':' ||
595                   mti.error_explanation,1,240) error_msg,  -- error_message
596          mti.last_update_date,
597          mti.last_updated_by,
598          mti.creation_date,
599          mti.created_by,
600          mti.last_update_login,
601          mti.request_id,
602          mti.program_application_id,
603          mti.program_id,
604          mti.program_update_date
605     FROM mtl_transactions_interface mti,
606          mtl_system_items_kfv msik
607    WHERE mti.transaction_header_id = p_mtl_header_id
608      AND mti.inventory_item_id = msik.inventory_item_id
609      AND mti.organization_id = msik.organization_id
610      AND mti.error_explanation IS NOT NULL;
611 
612 l_mtl_errors    c_mtl_errors%ROWTYPE;
613 l_params        wip_logger.param_tbl_t;
614 l_returnStatus  VARCHAR(1);
615 l_errMsg        VARCHAR2(240);
616 l_logLevel      NUMBER := fnd_log.g_current_runtime_level;
617 l_count         NUMBER;
618 BEGIN
619   -- write parameter value to log file
620   IF (l_logLevel <= wip_constants.trace_logging) THEN
621     l_params(1).paramName   := 'p_mtl_header_id';
622     l_params(1).paramValue  :=  p_mtl_header_id;
623     wip_logger.entryPoint(p_procName =>'wip_movProc_priv.write_mtl_errors',
624                           p_params => l_params,
625                           x_returnStatus => l_returnStatus);
626   END IF;
627   l_count := 0;
628   FOR l_mtl_errors IN c_mtl_errors LOOP
629     l_count := l_count + 1;
630     write_mtl_error(
631       p_move_id                => l_mtl_errors.move_transaction_id,
632       p_error_msg              => l_mtl_errors.error_msg,
633       p_last_update_date       => l_mtl_errors.last_update_date,
634       p_last_updated_by        => l_mtl_errors.last_updated_by,
635       p_creation_date          => l_mtl_errors.creation_date,
636       p_created_by             => l_mtl_errors.created_by,
637       p_last_update_login      => l_mtl_errors.last_update_login,
638       p_request_id             => l_mtl_errors.request_id,
639       p_program_application_id => l_mtl_errors.program_application_id,
640       p_program_id             => l_mtl_errors.program_id,
641       p_program_update_date    => l_mtl_errors.program_update_date);
642   END LOOP;
643   -- Clear inventory message from the stack because inventory always put
644   -- quantity tree error into message stack, but did not error out the
645   -- transactions. This will mislead both customer and developer if transaction
646   -- fail inventory validation code.
647   fnd_msg_pub.initialize;
648 
649   IF (l_logLevel <= wip_constants.full_logging) THEN
650     wip_logger.log(p_msg          => l_count || ' records inserted',
651                    x_returnStatus => l_returnStatus);
652   END IF;
653 
654   l_returnStatus := fnd_api.g_ret_sts_success;
655   IF (l_logLevel <= wip_constants.trace_logging) THEN
656     wip_logger.exitPoint(p_procName => 'wip_movProc_priv.write_mtl_errors',
657                          p_procReturnStatus => l_returnStatus,
658                          p_msg => 'procedure complete',
659                          x_returnStatus => l_returnStatus);
660   END IF;
661   EXCEPTION
662     WHEN others THEN
663       l_returnStatus := fnd_api.g_ret_sts_unexp_error;
664       l_errMsg := 'unexpected error: ' || SQLERRM || 'SQLCODE = ' || SQLCODE;
665 
666     IF (l_logLevel <= wip_constants.trace_logging) THEN
667       wip_logger.exitPoint(p_procName => 'wip_movProc_priv.write_mtl_errors',
668                            p_procReturnStatus => l_returnStatus,
669                            p_msg => l_errMsg,
670                            x_returnStatus => l_returnStatus);
671     END IF;
672     fnd_message.set_name('FND', 'FND_GENERIC_MESSAGE');
673     fnd_message.set_token('MESSAGE', l_errMsg);
674     fnd_msg_pub.add;
675 END write_mtl_errors;
676 
677 /*****************************************************************************
678  * This procedure is equivalent to witpslw_lock_wipops in wiltps.ppc
679  * This procedure is used to lock a record in WIP_OPERATIONS
680  ****************************************************************************/
681 PROCEDURE lock_wipops(p_gib           IN        group_rec_t,
682                       x_returnStatus OUT NOCOPY VARCHAR2) IS
683 
684 CURSOR c_wipops(p_group_id  NUMBER,
685                 p_txn_date  DATE) IS
686   SELECT wop.wip_entity_id,
687          wop.operation_seq_num,
688          wop.organization_id,
689          wop.repetitive_schedule_id
690     FROM wip_operations wop,
691          wip_repetitive_schedules wrs,
692          wip_move_txn_interface wmti
693    WHERE wop.organization_id = wmti.organization_id
694      AND wop.wip_entity_id = wmti.wip_entity_id
695      AND wmti.group_id = p_group_id
696      AND TRUNC(wmti.transaction_date) = TRUNC(p_txn_date)
697      AND wmti.process_phase = WIP_CONSTANTS.MOVE_PROC
698      AND wmti.process_status = WIP_CONSTANTS.RUNNING
699      AND ((wop.operation_seq_num BETWEEN
700          wmti.fm_operation_seq_num AND wmti.to_operation_seq_num)
701          OR (wop.operation_seq_num BETWEEN
702          wmti.to_operation_seq_num AND wmti.fm_operation_seq_num))
703      AND wop.organization_id = wrs.organization_id (+)
704      AND wop.repetitive_schedule_id = wrs.repetitive_schedule_id(+)
705      AND NVL(wrs.status_type,-999) IN (-999, WIP_CONSTANTS.RELEASED,
706                                        WIP_CONSTANTS.COMP_CHRG)
707      AND (( wmti.line_id = wrs.line_id
708            AND wmti.line_id IS NOT NULL
709            AND wop.repetitive_schedule_id IS NOT NULL)
710            OR (wmti.line_id IS NULL))
711      FOR UPDATE OF wop.quantity_completed NOWAIT;
712 
713 l_wipops       c_wipops%ROWTYPE;
714 l_returnStatus VARCHAR(1);
715 l_errMsg       VARCHAR2(240);
716 l_params       wip_logger.param_tbl_t;
717 l_logLevel     NUMBER := fnd_log.g_current_runtime_level;
718 
719 BEGIN
720   -- write parameter value to log file
721   IF (l_logLevel <= wip_constants.trace_logging) THEN
722     l_params(1).paramName  := 'p_group_id';
723     l_params(1).paramValue :=  p_gib.group_id;
724     l_params(2).paramName  := 'p_txn_date';
725     l_params(2).paramValue :=  p_gib.txn_date;
726     wip_logger.entryPoint(p_procName => 'wip_movProc_priv.lock_wipops',
727                           p_params => l_params,
728                           x_returnStatus => l_returnStatus);
729   END IF;
730 
731   OPEN c_wipops(p_group_id  => p_gib.group_id,
732                 p_txn_date  => p_gib.txn_date);
733 
734   IF(c_wipops%ISOPEN) THEN
735     CLOSE c_wipops;
736   END IF;
737   x_returnStatus := fnd_api.g_ret_sts_success;
738 
739   -- write to the log file
740   IF (l_logLevel <= wip_constants.trace_logging) THEN
741     wip_logger.exitPoint(p_procName => 'wip_movProc_priv.lock_wipops',
742                          p_procReturnStatus => x_returnStatus,
743                          p_msg => 'procedure complete',
744                          x_returnStatus => l_returnStatus);
745   END IF;
746 
747 EXCEPTION
748   WHEN wip_constants.records_locked THEN
749     IF(c_wipops%ISOPEN) THEN
750       CLOSE c_wipops;
751     END IF;
752     x_returnStatus := fnd_api.g_ret_sts_unexp_error;
753     l_errMsg := 'Unable to lock the record in wip_operations';
754 
755     IF (l_logLevel <= wip_constants.trace_logging) THEN
756       wip_logger.exitPoint(p_procName => 'wip_movProc_priv.lock_wipops',
757                            p_procReturnStatus => x_returnStatus,
758                            p_msg => l_errMsg,
759                            x_returnStatus => l_returnStatus);
760     END IF;
761     fnd_message.set_name('INV','INV_WIP_WORK_ORDER_LOCKED');
762     fnd_msg_pub.add;
763 
764   WHEN others THEN
765     IF(c_wipops%ISOPEN) THEN
766       CLOSE c_wipops;
767     END IF;
768     x_returnStatus := fnd_api.g_ret_sts_unexp_error;
769     l_errMsg := 'unexpected error: ' || SQLERRM || 'SQLCODE = ' || SQLCODE;
770 
771     IF (l_logLevel <= wip_constants.trace_logging) THEN
772       wip_logger.exitPoint(p_procName => 'wip_movProc_priv.lock_wipops',
773                            p_procReturnStatus => x_returnStatus,
774                            p_msg => l_errMsg,
775                            x_returnStatus => l_returnStatus);
776     END IF;
777     fnd_message.set_name('FND', 'FND_GENERIC_MESSAGE');
778     fnd_message.set_token('MESSAGE', l_errMsg);
779     fnd_msg_pub.add;
780 END lock_wipops;
781 
782 /*****************************************************************************
783  * This procedure is equivalent to witpssa_sched_alloc in wiltps.ppc
784  * This procedure is used to allocate quantity to multiple reptitive schedule
785  * it work for both regular and over move transaction
786  ****************************************************************************/
787 PROCEDURE schedule_alloc(p_org_id        IN        NUMBER,
788                          p_wip_id        IN        NUMBER,
789                          p_line_id       IN        NUMBER,
790                          p_quantity      IN        NUMBER,
791                          p_fm_op         IN        NUMBER,
792                          p_fm_step       IN        NUMBER,
793                          p_to_op         IN        NUMBER,
794                          p_to_step       IN        NUMBER,
795                          p_oc_txn_type   IN        NUMBER,
796                          p_txnType       IN        NUMBER,
797                          p_fm_form       IN        NUMBER,
798                          p_comp_alloc    IN        NUMBER,
799                          p_txn_date      IN        DATE, /* bug 5373061 */
800                          x_proc_status  OUT NOCOPY NUMBER,
801                          x_sche_count   OUT NOCOPY NUMBER,
802                          x_rsa          OUT NOCOPY rsa_tbl_t,
803                          x_returnStatus OUT NOCOPY VARCHAR2) IS
804 
805 /* Fix for bug 5373061: Added date_released condition to allocate back-dated
806 transactions correctly */
807 CURSOR c_rsa(p_forward NUMBER) IS
808   SELECT wrs.repetitive_schedule_id scheID,
809          (wo2.quantity_waiting_to_move - NVL(SUM(wmat.primary_quantity),0))
810             toMoveQty,
811          (wrs.quantity_completed + NVL(SUM(wmat.primary_quantity),0))
812             completedQty,
813          wo1.operation_seq_num op_seq,
814          wo1.quantity_in_queue queue_qty,
815          wo1.quantity_running run_qty,
816          wo1.quantity_waiting_to_move tomove_qty,
817          wo1.quantity_rejected reject_qty,
818          wo1.quantity_scrapped scrap_qty
819     FROM wip_operations wo1,
820          wip_operations wo2,
821          wip_repetitive_schedules wrs,
822          wip_mtl_allocations_temp wmat
823    WHERE wrs.repetitive_schedule_id = wmat.repetitive_schedule_id(+)
824      AND wrs.organization_id = wmat.organization_id(+)
825      AND wrs.organization_id = wo1.organization_id
826      AND wrs.wip_entity_id = wo1.wip_entity_id
827      AND wrs.repetitive_schedule_id = wo1.repetitive_schedule_id
828      AND wo1.operation_seq_num = p_fm_op
829      AND wrs.organization_id = wo2.organization_id
830      AND wrs.wip_entity_id = wo2.wip_entity_id
831      AND wrs.repetitive_schedule_id = wo2.repetitive_schedule_id
832      AND wo2.operation_seq_num = p_to_op
833      AND wrs.organization_id = p_org_id
834      AND wrs.wip_entity_id = p_wip_id
835      AND wrs.line_id = p_line_id
836      AND wrs.status_type in (WIP_CONSTANTS.RELEASED, WIP_CONSTANTS.COMP_CHRG)
837      AND wrs.date_released < p_txn_date
838 GROUP BY wrs.repetitive_schedule_id,
839          wo2.quantity_waiting_to_move,
840          wrs.quantity_completed,
841          wo1.operation_seq_num,
842          wo1.quantity_in_queue,
843          wo1.quantity_running,
844          wo1.quantity_waiting_to_move,
845          wo1.quantity_rejected,
846          wo1.quantity_scrapped,
847          wo1.first_unit_start_date,
848          wrs.first_unit_start_date
849 ORDER BY DECODE(p_forward,
850            WIP_CONSTANTS.YES,NVL(wo1.first_unit_start_date,
851                                  wrs.first_unit_start_date), -- no routing
852            NULL) ASC,
853          DECODE(p_forward,
854            WIP_CONSTANTS.NO, NVL(wo1.first_unit_start_date,
855                                  wrs.first_unit_start_date), -- no routing
856            NULL) DESC;
857 
858 l_rsa          c_rsa%ROWTYPE;
859 l_params       wip_logger.param_tbl_t;
860 l_returnStatus VARCHAR(1);
861 l_errMsg       VARCHAR2(240);
862 l_forward      NUMBER;
863 l_cur_qty      NUMBER;
864 l_scheID       NUMBER;
865 l_quantity     NUMBER := p_quantity;
866 l_recordFound  NUMBER := 0;
867 l_need_more    BOOLEAN := TRUE;
868 l_dummy        NUMBER := 0;
869 l_logLevel     NUMBER := fnd_log.g_current_runtime_level;
870 
871 BEGIN
872   -- write parameter value to log file
873   IF (l_logLevel <= wip_constants.trace_logging) THEN
874     l_params(1).paramName   := 'p_org_id';
875     l_params(1).paramValue  :=  p_org_id;
876     l_params(2).paramName   := 'p_wip_id';
877     l_params(2).paramValue  :=  p_wip_id;
878     l_params(3).paramName   := 'p_line_id';
879     l_params(3).paramValue  :=  p_line_id;
880     l_params(4).paramName   := 'p_quantity';
881     l_params(4).paramValue  :=  p_quantity;
882     l_params(5).paramName   := 'p_fm_op';
883     l_params(5).paramValue  :=  p_fm_op;
884     l_params(6).paramName   := 'p_fm_step';
885     l_params(6).paramValue  :=  p_fm_step;
886     l_params(7).paramName   := 'p_to_op';
887     l_params(7).paramValue  :=  p_to_op;
888     l_params(8).paramName   := 'p_to_step';
889     l_params(8).paramValue  :=  p_to_step;
890     l_params(9).paramName   := 'p_oc_txn_type';
891     l_params(9).paramValue  :=  p_oc_txn_type;
892     l_params(10).paramName  := 'p_txnType';
893     l_params(10).paramValue :=  p_txnType;
894     l_params(11).paramName  := 'p_fm_form';
895     l_params(11).paramValue :=  p_fm_form;
896     l_params(12).paramName  := 'p_comp_alloc';
897     l_params(12).paramValue :=  p_comp_alloc;
898     wip_logger.entryPoint(p_procName => 'wip_movProc_priv.schedule_alloc',
899                           p_params => l_params,
900                           x_returnStatus => l_returnStatus);
901   END IF;
902 
903   -- initialize x_sche_count
904   x_sche_count := 0;
905 
906   IF(p_fm_op < p_to_op) OR
907     (p_fm_op = p_to_op AND p_fm_step <= p_to_step) THEN
908     l_forward := WIP_CONSTANTS.YES;
909   ELSE
910     l_forward := WIP_CONSTANTS.NO;
911   END IF;
912 
913   OPEN c_rsa(l_forward);
914   WHILE l_need_more LOOP
915     FETCH c_rsa INTO l_rsa;
916 
917     IF(c_rsa%NOTFOUND) THEN
918       GOTO no_data;
919     ELSE
920       l_recordFound := l_recordFound + 1;
921       l_scheID      := l_rsa.scheID;
922 
923       IF(p_txnType = WIP_CONSTANTS.RET_TXN AND
924          p_fm_form = WIP_CONSTANTS.YES) THEN
925         l_cur_qty := l_rsa.completedQty;
926       ELSE
927         IF (p_fm_step = WIP_CONSTANTS.QUEUE) THEN
928           l_cur_qty := NVL(l_rsa.queue_qty, 0);
929         ELSIF (p_fm_step = WIP_CONSTANTS.RUN) THEN
930           l_cur_qty := NVL(l_rsa.run_qty, 0);
931         ELSIF (p_fm_step = WIP_CONSTANTS.TOMOVE) THEN
932           l_cur_qty := NVL(l_rsa.tomove_qty, 0);
933         ELSIF (p_fm_step = WIP_CONSTANTS.REJECT) THEN
934           l_cur_qty := NVL(l_rsa.reject_qty, 0);
935         ELSIF (p_fm_step = WIP_CONSTANTS.SCRAP) THEN
936           l_cur_qty := NVL(l_rsa.scrap_qty, 0);
937         END IF;
938 
939         IF (p_comp_alloc = WIP_CONSTANTS.YES) THEN
940           -- completion allocation from Tomove of the last op. This logic
941           -- will be used in completion part of EZ Completion transactions
942           l_cur_qty := l_cur_qty + l_rsa.toMoveQty;
943         END IF;
944       END IF; -- Return transactions from form
945 
946       IF (p_oc_txn_type = WIP_CONSTANTS.child_txn) THEN
947         NULL;  -- just allocate everything to the last schedule
948       ELSE
949         IF (l_cur_qty > 0) THEN
950           l_quantity := l_quantity - l_cur_qty;
951           IF (l_quantity <= 0) THEN
952             l_cur_qty := l_cur_qty + l_quantity;
953             l_need_more := FALSE;
954           END IF;
955           -- increase schedule count by 1 IF found record
956           x_sche_count := x_sche_count + 1;
957           x_rsa(x_sche_count).scheID := l_scheID;
958           x_rsa(x_sche_count).scheQty := l_cur_qty;
959         END IF; -- l_cur_qty > 0
960       END IF; -- child txn
961     END IF; -- c_rsa%NOTFOUND
962   END LOOP; -- while
963 
964   IF(p_oc_txn_type = WIP_CONSTANTS.parent_txn) THEN
965     -- IF parent and came here, it means that the whole quantity was
966     -- fulfilled without needing overcompletion. In that case it must be
967     -- an error
968     x_proc_status := TVE_OVERCOMPLETION_MISMATCH;
969     l_errMsg := 'Overcompletion mismatch';
970     raise fnd_api.g_exc_unexpected_error;
971   END IF;
972 
973   -- for parent transaction, it always come here because the available
974   -- qty is not enough. Child transaction also come here
975 <<no_data>>
976 
977   IF (l_recordFound = 0) THEN -- no schedule found
978     l_errMsg := 'No repetitive schedule found';
979     raise fnd_api.g_exc_unexpected_error;
980   ELSIF((p_oc_txn_type =  WIP_CONSTANTS.parent_txn OR
981         (p_txnType = WIP_CONSTANTS.RET_TXN AND
982          p_fm_form = WIP_CONSTANTS.YES)) AND
983          l_quantity > 0) THEN
984     -- parent may have some allocation already made or none
985     IF (x_sche_count = 0) THEN -- no allocation made yet
986       x_sche_count := 1;
987       x_rsa(x_sche_count).scheID  := l_scheID;
988       x_rsa(x_sche_count).scheQty := l_quantity;
989     ELSE
990       IF (x_rsa(x_sche_count).scheID = l_scheID) THEN
991         -- there is an allocation made to the last schedule already
992         x_rsa(x_sche_count).scheQty :=  x_rsa(x_sche_count).scheQty +
993                                         l_quantity;
994       ELSE
995         -- all allocation were made to schedules other than the last schedule
996         x_sche_count := x_sche_count + 1;
997         x_rsa(x_sche_count).scheID  := l_scheID;
998         x_rsa(x_sche_count).scheQty := l_quantity;
999       END IF;
1000     END IF; -- x_sche_count = 0
1001   ELSIF(p_oc_txn_type = WIP_CONSTANTS.child_txn) THEN
1002     -- no allocation should be there yet
1003     x_sche_count := 1;
1004     x_rsa(x_sche_count).scheID  := l_scheID;
1005     x_rsa(x_sche_count).scheQty := l_quantity;
1006 
1007   ELSE -- IF normal txn
1008     IF(p_fm_form = WIP_CONSTANTS.YES) THEN
1009       -- skip this validation if call from from because there may be
1010       -- a case that completed quantity is negative for repetitive
1011       NULL;
1012     ELSE
1013       IF(l_quantity > 0) THEN
1014         -- user insert incorrect value for normal transaction txn qty must
1015         -- be less than or equal to available qty
1016         x_proc_status := TVE_NO_MOVE_ALLOC;
1017         l_errMsg := 'Not enough qty to move';
1018         raise fnd_api.g_exc_unexpected_error;
1019       END IF;
1020     END IF;
1021   END IF; -- no schedule found
1022 
1023   IF(c_rsa%ISOPEN) THEN
1024     CLOSE c_rsa;
1025   END IF;
1026   x_returnStatus := fnd_api.g_ret_sts_success;
1027   x_proc_status  := WIP_CONSTANTS.RUNNING;
1028   -- write to the log file
1029   IF (l_logLevel <= wip_constants.trace_logging) THEN
1030     wip_logger.exitPoint(p_procName => 'wip_movProc_priv.schedule_alloc',
1031                          p_procReturnStatus => x_returnStatus,
1032                          p_msg => 'procedure complete',
1033                          x_returnStatus => l_returnStatus);
1034   END IF;
1035 
1036 EXCEPTION
1037   WHEN fnd_api.g_exc_unexpected_error THEN
1038     IF(c_rsa%ISOPEN) THEN
1039       CLOSE c_rsa;
1040     END IF;
1041     x_returnStatus := fnd_api.g_ret_sts_unexp_error;
1042 
1043     IF (l_logLevel <= wip_constants.trace_logging) THEN
1044       wip_logger.exitPoint(p_procName => 'wip_movProc_priv.schedule_alloc',
1045                            p_procReturnStatus => x_returnStatus,
1046                            p_msg => l_errMsg,
1047                            x_returnStatus => l_returnStatus);
1048     END IF;
1049 
1050     /* Fix for bug 5373061: Passed missing token */
1051     fnd_message.set_name('WIP','WIP_INT_ERROR_NO_SCHED');
1052     fnd_message.set_token('ROUTINE', 'wip_movProc_priv.schedule_alloc');
1053     fnd_msg_pub.add;
1054 
1055   WHEN others THEN
1056     IF(c_rsa%ISOPEN) THEN
1057       CLOSE c_rsa;
1058     END IF;
1059     x_returnStatus := fnd_api.g_ret_sts_unexp_error;
1060     x_proc_status  := WIP_CONSTANTS.ERROR;
1061     l_errMsg := 'unexpected error: ' || SQLERRM || 'SQLCODE = ' || SQLCODE;
1062 
1063     IF (l_logLevel <= wip_constants.trace_logging) THEN
1064       wip_logger.exitPoint(p_procName => 'wip_movProc_priv.schedule_alloc',
1065                            p_procReturnStatus => x_returnStatus,
1066                            p_msg => l_errMsg,
1067                            x_returnStatus => l_returnStatus);
1068     END IF;
1069     fnd_message.set_name('FND', 'FND_GENERIC_MESSAGE');
1070     fnd_message.set_token('MESSAGE', l_errMsg);
1071     fnd_msg_pub.add;
1072 END schedule_alloc;
1073 
1074 /*****************************************************************************
1075  * This procedure is equivalent to witoc_insert_alloc_child in wiltps.ppc
1076  * This procedure is used to insert child record into WIP_MOVE_TXN_INTERFACE
1077  * and WIP_MOVE_TXN_ALLOCATIONS
1078  ****************************************************************************/
1079 PROCEDURE insert_alloc_child(p_org_id        IN        NUMBER,
1080                              p_scheID        IN        NUMBER,
1081                              p_oc_pri_qty    IN        NUMBER,
1082                              p_parent_txn_id IN        NUMBER,
1083                              p_gib       IN OUT NOCOPY group_rec_t,
1084                              x_oc_fm_op     OUT NOCOPY NUMBER,
1085                              x_returnStatus OUT NOCOPY VARCHAR2) IS
1086 
1087 l_params           wip_logger.param_tbl_t;
1088 l_returnStatus     VARCHAR(1);
1089 l_errMsg           VARCHAR2(240);
1090 l_msgData          VARCHAR2(240);
1091 l_first_op_code    VARCHAR2(4);
1092 l_first_dept_code  VARCHAR2(10);
1093 l_first_dept_id    NUMBER := 0;
1094 l_first_op_seq_num NUMBER := 0;
1095 l_oc_txn_id        NUMBER := 0;
1096 l_logLevel         NUMBER := fnd_log.g_current_runtime_level;
1097 
1098 BEGIN
1099   -- write parameter value to log file
1100   IF (l_logLevel <= wip_constants.trace_logging) THEN
1101     l_params(1).paramName   := 'p_org_id';
1102     l_params(1).paramValue  :=  p_org_id;
1103     l_params(2).paramName   := 'p_scheID';
1104     l_params(2).paramValue  :=  p_scheID;
1105     l_params(3).paramName   := 'p_oc_pri_qty';
1106     l_params(3).paramValue  :=  p_oc_pri_qty;
1107     l_params(4).paramName   := 'p_parent_txn_id';
1108     l_params(4).paramValue  :=  p_parent_txn_id;
1109     l_params(5).paramName   := 'child_txn_id';
1110     l_params(5).paramValue  :=  p_gib.move_profile.child_txn_id;
1111     wip_logger.entryPoint(p_procName => 'wip_movProc_priv.insert_alloc_child',
1112                           p_params => l_params,
1113                           x_returnStatus => l_returnStatus);
1114   END IF;
1115 
1116   -- call PL/SQL api to insert to WMTI
1117   WIP_OVERCOMPLETION.insert_child_move_txn
1118       (p_primary_quantity             => p_oc_pri_qty,
1119        p_parent_txn_id                => p_parent_txn_id,
1120        -- pass move_profile equal to background so that it will always insert
1121        -- parent group_id to child group_id
1122        p_move_profile                 => WIP_CONSTANTS.BACKGROUND,
1123        p_sched_id                     => p_scheID,
1124        p_user_id                      => p_gib.user_id,
1125        p_login_id                     => p_gib.login_id,
1126        p_req_id                       => p_gib.request_id,
1127        p_appl_id                      => p_gib.application_id,
1128        p_prog_id                      => p_gib.program_id,
1129        p_child_txn_id                 => p_gib.move_profile.child_txn_id,
1130        p_oc_txn_id                    => l_oc_txn_id,
1131        p_first_operation_seq_num      => l_first_op_seq_num,
1132        p_first_operation_code         => l_first_op_code,
1133        p_first_department_id          => l_first_dept_id,
1134        p_first_department_code        => l_first_dept_code,
1135        p_err_mesg                     => l_msgData);
1136 
1137   IF(p_gib.move_profile.child_txn_id IS NULL) THEN
1138     l_errMsg := 'WIP_OVERCOMPLETION.insert_child_move_txn failed';
1139     raise fnd_api.g_exc_unexpected_error;
1140   END IF;
1141 
1142   IF(l_first_op_seq_num IS NOT NULL) THEN
1143     x_oc_fm_op := l_first_op_seq_num;
1144   ELSE
1145     l_errMsg := 'wip_operations_INFO.first_operation failed';
1146     raise fnd_api.g_exc_unexpected_error;
1147   END IF;
1148 
1149   IF(p_scheID > 0) THEN
1150     -- this is a repetitvie schedule, hence must insert allocation records
1151     -- to wip_move_txn_allocations as well
1152     INSERT INTO wip_move_txn_allocations
1153       (transaction_id,
1154        repetitive_schedule_id,
1155        organization_id,
1156        last_update_date,
1157        last_updated_by,
1158        creation_date,
1159        created_by,
1160        last_update_login,
1161        request_id,
1162        program_application_id,
1163        program_id,
1164        program_update_date,
1165        transaction_quantity,
1166        primary_quantity)
1167        (SELECT p_gib.move_profile.child_txn_id,
1168                repetitive_schedule_id,
1169                organization_id,
1170                SYSDATE,               /* last_update_date, */
1171                last_updated_by,
1172                SYSDATE,               /* creation_date */
1173                created_by,
1174                last_update_login,
1175                request_id,
1176                program_application_id,
1177                program_id,
1178                SYSDATE,               /* program_update_date */
1179                p_oc_pri_qty,
1180                p_oc_pri_qty
1181           FROM wip_move_txn_allocations wmta
1182          WHERE wmta.transaction_id = p_parent_txn_id
1183            AND wmta.organization_id = p_org_id
1184            AND wmta.repetitive_schedule_id =
1185        (SELECT MAX(wmta1.repetitive_schedule_id)
1186           FROM wip_move_txn_allocations wmta1
1187          WHERE wmta1.transaction_id = wmta.transaction_id
1188            AND wmta1.organization_id = wmta.organization_id));
1189   END IF; -- p_scheID > 0
1190   x_returnStatus := fnd_api.g_ret_sts_success;
1191 
1192   -- write to the log file
1193   IF (l_logLevel <= wip_constants.trace_logging) THEN
1194     wip_logger.exitPoint(p_procName => 'wip_movProc_priv.insert_alloc_child',
1195                          p_procReturnStatus => x_returnStatus,
1196                          p_msg => 'procedure complete',
1197                          x_returnStatus => l_returnStatus);
1198   END IF;
1199 
1200 EXCEPTION
1201    WHEN fnd_api.g_exc_unexpected_error THEN
1202 
1203     x_returnStatus := fnd_api.g_ret_sts_unexp_error;
1204 
1205     IF (l_logLevel <= wip_constants.trace_logging) THEN
1206       wip_logger.exitPoint(p_procName => 'wip_movProc_priv.insert_alloc_child',
1207                            p_procReturnStatus => x_returnStatus,
1208                            p_msg => l_errMsg,
1209                            x_returnStatus => l_returnStatus);
1210     END IF;
1211 
1212     fnd_message.set_name('FND', 'FND_GENERIC_MESSAGE');
1213     fnd_message.set_token('MESSAGE', l_msgData);
1214     fnd_msg_pub.add;
1215 
1216   WHEN others THEN
1217     x_returnStatus := fnd_api.g_ret_sts_unexp_error;
1218     l_errMsg := 'unexpected error: ' || SQLERRM || 'SQLCODE = ' || SQLCODE;
1219 
1220     IF (l_logLevel <= wip_constants.trace_logging) THEN
1221       wip_logger.exitPoint(p_procName => 'wip_movProc_priv.insert_alloc_child',
1222                            p_procReturnStatus => x_returnStatus,
1223                            p_msg => l_errMsg,
1224                            x_returnStatus => l_returnStatus);
1225     END IF;
1226     fnd_message.set_name('FND', 'FND_GENERIC_MESSAGE');
1227     fnd_message.set_token('MESSAGE', l_errMsg);
1228     fnd_msg_pub.add;
1229 END insert_alloc_child;
1230 
1231 /*****************************************************************************
1232  * This procedure is equivalent to wip_update_wo_rs  in wiltps.ppc
1233  * This procedure is used to update WIP_OPERATIONS table for repetitive sche
1234  ****************************************************************************/
1235 PROCEDURE update_wo_rs(p_scheCount     IN        NUMBER,
1236                        p_rsa_rec       IN        update_rsa_tbl_t,
1237                        p_txn_date      IN        DATE,
1238                        x_returnStatus OUT NOCOPY VARCHAR2) IS
1239 
1240 l_params           wip_logger.param_tbl_t;
1241 l_returnStatus     VARCHAR(1);
1242 l_errMsg           VARCHAR2(240);
1243 l_logLevel         NUMBER := fnd_log.g_current_runtime_level;
1244 l_forward_move     NUMBER;
1245 BEGIN
1246   FOR i IN  1..p_scheCount LOOP
1247     -- write parameter value to log file
1248     IF (l_logLevel <= wip_constants.trace_logging) THEN
1249       l_params(1).paramName    := 'p_scheID';
1250       l_params(1).paramValue   :=  p_rsa_rec(i).scheID;
1251       l_params(2).paramName    := 'p_scheQty';
1252       l_params(2).paramValue   :=  p_rsa_rec(i).scheQty;
1253       l_params(3).paramName    := 'p_scheCount';
1254       l_params(3).paramValue   :=  p_scheCount;
1255       l_params(4).paramName    := 'p_wip_id';
1256       l_params(4).paramValue   :=  p_rsa_rec(i).wipID;
1257       l_params(5).paramName    := 'p_org_id';
1258       l_params(5).paramValue   :=  p_rsa_rec(i).orgID;
1259       l_params(6).paramName    := 'p_fm_op';
1260       l_params(6).paramValue   :=  p_rsa_rec(i).fmOp;
1261       l_params(7).paramName    := 'p_fm_step';
1262       l_params(7).paramValue   :=  p_rsa_rec(i).fmStep;
1263       l_params(8).paramName    := 'p_to_op';
1264       l_params(8).paramValue   :=  p_rsa_rec(i).toOp;
1265       l_params(9).paramName    := 'p_to_step';
1266       l_params(9).paramValue   :=  p_rsa_rec(i).toStep;
1267       l_params(10).paramName   := 'p_txn_date';
1268       l_params(10).paramValue  :=  p_txn_date;
1269       wip_logger.entryPoint(p_procName => 'wip_movProc_priv.update_wo_rs',
1270                             p_params => l_params,
1271                             x_returnStatus => l_returnStatus);
1272     END IF;
1273 
1274   END LOOP;
1275 
1276   FOR i IN  1..p_scheCount LOOP
1277 
1278     UPDATE wip_operations wop
1279       SET (date_last_moved,
1280            last_updated_by,
1281            last_update_date,
1282            last_update_login,
1283            request_id,
1284            program_application_id,
1285            program_id,
1286            program_update_date,
1287            quantity_in_queue,
1288            quantity_running,
1289            quantity_waiting_to_move,
1290            quantity_rejected,
1291            quantity_scrapped) =
1292 
1293            (SELECT DECODE(wop.operation_seq_num, p_rsa_rec(i).fmOp,
1294                    p_txn_date,wop.date_last_moved),
1295                    p_rsa_rec(i).updatedBy,
1296                    SYSDATE,
1297                    DECODE(p_rsa_rec(i).loginID, -1, NULL,p_rsa_rec(i).loginID),
1298                    DECODE(p_rsa_rec(i).reqID, -1, NULL, p_rsa_rec(i).reqID),
1299                    DECODE(p_rsa_rec(i).appID, -1, NULL, p_rsa_rec(i).appID),
1300                    DECODE(p_rsa_rec(i).progID, -1, NULL, p_rsa_rec(i).progID),
1301                    DECODE(p_rsa_rec(i).reqID, -1, NULL, SYSDATE),
1302                    wop.quantity_in_queue + SUM(
1303                      DECODE(wop.operation_seq_num, p_rsa_rec(i).fmOp,
1304                        -1 * DECODE(p_rsa_rec(i).fmStep,
1305                               1, ROUND(p_rsa_rec(i).scheQty,
1306                                        WIP_CONSTANTS.INV_MAX_PRECISION),0),0) +
1307                      DECODE(wop.operation_seq_num,  p_rsa_rec(i).toOp,
1308                        DECODE(p_rsa_rec(i).toStep,
1309                          1, ROUND(p_rsa_rec(i).scheQty,
1310                                   WIP_CONSTANTS.INV_MAX_PRECISION), 0), 0)),
1311                    wop.quantity_running + SUM(
1312                      DECODE(wop.operation_seq_num, p_rsa_rec(i).fmOp,
1313                        -1 * DECODE(p_rsa_rec(i).fmStep,
1314                               2, ROUND(p_rsa_rec(i).scheQty,
1315                                        WIP_CONSTANTS.INV_MAX_PRECISION),0),0) +
1316                      DECODE(wop.operation_seq_num, p_rsa_rec(i).toOp,
1317                        DECODE(p_rsa_rec(i).toStep,
1318                          2, ROUND(p_rsa_rec(i).scheQty,
1319                                   WIP_CONSTANTS.INV_MAX_PRECISION), 0), 0)),
1320                    wop.quantity_waiting_to_move + SUM(
1321                      DECODE(wop.operation_seq_num, p_rsa_rec(i).fmOp,
1322                        -1 * DECODE(p_rsa_rec(i).fmStep,
1323                               3, ROUND(p_rsa_rec(i).scheQty,
1324                                        WIP_CONSTANTS.INV_MAX_PRECISION),0),0) +
1325                      DECODE(wop.operation_seq_num, p_rsa_rec(i).toOp,
1326                        DECODE(p_rsa_rec(i).toStep,
1327                          3, ROUND(p_rsa_rec(i).scheQty,
1328                                   WIP_CONSTANTS.INV_MAX_PRECISION), 0), 0)),
1329                    wop.quantity_rejected + SUM(
1330                      DECODE(wop.operation_seq_num, p_rsa_rec(i).fmOp,
1331                        -1*DECODE(p_rsa_rec(i).fmStep,
1332                             4, ROUND(p_rsa_rec(i).scheQty,
1333                                      WIP_CONSTANTS.INV_MAX_PRECISION), 0), 0) +
1334                      DECODE(wop.operation_seq_num, p_rsa_rec(i).toOp,
1335                        DECODE(p_rsa_rec(i).toStep,
1336                          4, ROUND(p_rsa_rec(i).scheQty,
1337                                   WIP_CONSTANTS.INV_MAX_PRECISION), 0), 0)),
1338                    wop.quantity_scrapped + SUM(
1339                      DECODE(wop.operation_seq_num, p_rsa_rec(i).fmOp,
1340                        -1*DECODE(p_rsa_rec(i).fmStep,
1341                             5, ROUND(p_rsa_rec(i).scheQty,
1342                                      WIP_CONSTANTS.INV_MAX_PRECISION), 0), 0) +
1343                      DECODE(wop.operation_seq_num, p_rsa_rec(i).toOp,
1344                        DECODE(p_rsa_rec(i).toStep,
1345                          5, ROUND(p_rsa_rec(i).scheQty,
1346                                   WIP_CONSTANTS.INV_MAX_PRECISION), 0), 0))
1347               FROM wip_operations wop1
1348              WHERE wop1.rowid = wop.rowid
1349                AND wop1.organization_id = p_rsa_rec(i).orgID
1350                AND wop1.wip_entity_id = p_rsa_rec(i).wipID
1351                AND wop1.repetitive_schedule_id = p_rsa_rec(i).scheID
1352                AND (wop1.operation_seq_num = p_rsa_rec(i).fmOp
1353                 OR wop1.operation_seq_num = p_rsa_rec(i).toOp))
1354      WHERE wop.rowid IN
1355            (SELECT wop2.rowid
1356               FROM wip_operations wop2
1357              WHERE wop2.organization_id = p_rsa_rec(i).orgID
1358                AND wop2.wip_entity_id = p_rsa_rec(i).wipID
1359                AND wop2.repetitive_schedule_id = p_rsa_rec(i).scheID
1360                AND (wop2.operation_seq_num = p_rsa_rec(i).fmOp
1361                     OR wop2.operation_seq_num = p_rsa_rec(i).toOp));
1362 
1363  /* Enhancement 2864382*/
1364   IF(p_rsa_rec(i).fmStep = WIP_CONSTANTS.SCRAP AND p_rsa_rec(i).toStep = WIP_CONSTANTS.SCRAP) THEN
1365       l_forward_move := WIP_CONSTANTS.NO;
1366       IF(p_rsa_rec(i).fmOp < p_rsa_rec(i).toOp) THEN
1367         l_forward_move := WIP_CONSTANTS.YES;
1368       END IF;
1369 
1370       UPDATE WIP_OPERATIONS wop
1371          SET wop.cumulative_scrap_quantity = wop.cumulative_scrap_quantity +
1372                                              DECODE(l_forward_move,
1373                                                     WIP_CONSTANTS.YES,p_rsa_rec(i).scheQty,
1374                                                     WIP_CONSTANTS.NO,-1 * p_rsa_rec(i).scheQty,
1375                                                     0)
1376       WHERE wop.rowid in
1377             (SELECT wop1.rowid
1378                FROM WIP_OPERATIONS wop1
1379               WHERE wop1.organization_id  = p_rsa_rec(i).orgID
1380                 AND wop1.wip_entity_id    = p_rsa_rec(i).wipID
1381                 AND wop1.repetitive_schedule_id = p_rsa_rec(i).scheID
1382                 AND wop1.operation_seq_num > LEAST(p_rsa_rec(i).fmOp,p_rsa_rec(i).toOp)
1383                 AND wop1.operation_seq_num <= GREATEST(p_rsa_rec(i).fmOp,p_rsa_rec(i).toOp));
1384    ELSIF(p_rsa_rec(i).fmStep=WIP_CONSTANTS.SCRAP OR p_rsa_rec(i).toStep=WIP_CONSTANTS.SCRAP) THEN
1385      UPDATE WIP_OPERATIONS wop
1386         SET wop.cumulative_scrap_quantity = wop.cumulative_scrap_quantity +
1387                                             DECODE(p_rsa_rec(i).toStep,
1388                                                    WIP_CONSTANTS.SCRAP,p_rsa_rec(i).scheQty,
1389                                                    0)  +
1390                                             DECODE(p_rsa_rec(i).fmStep,
1391                                                    WIP_CONSTANTS.SCRAP,-1*p_rsa_rec(i).scheQty,
1392                                                    0)
1393      WHERE wop.rowid in
1394            (SELECT wop1.rowid
1395               FROM WIP_OPERATIONS wop1
1396              WHERE wop1.organization_id        = p_rsa_rec(i).orgID
1397                AND wop1.wip_entity_id          = p_rsa_rec(i).wipID
1398                AND wop1.repetitive_schedule_id = p_rsa_rec(i).scheID
1399                AND wop1.operation_seq_num      > DECODE(p_rsa_rec(i).fmStep,
1400                                                         WIP_CONSTANTS.SCRAP,p_rsa_rec(i).fmOp,
1401                                                         p_rsa_rec(i).toOp));
1402     END IF;
1403 
1404 
1405   END LOOP; -- END for loop
1406 
1407   x_returnStatus := fnd_api.g_ret_sts_success;
1408 
1409   -- write to the log file
1410   IF (l_logLevel <= wip_constants.trace_logging) THEN
1411     wip_logger.exitPoint(p_procName => 'wip_movProc_priv.update_wo_rs',
1412                          p_procReturnStatus => x_returnStatus,
1413                          p_msg => 'procedure complete',
1414                          x_returnStatus => l_returnStatus);
1415   END IF;
1416 
1417 EXCEPTION
1418   WHEN others THEN
1419     x_returnStatus := fnd_api.g_ret_sts_unexp_error;
1420     l_errMsg := 'unexpected error: ' || SQLERRM || 'SQLCODE = ' || SQLCODE;
1421 
1422     IF (l_logLevel <= wip_constants.trace_logging) THEN
1423       wip_logger.exitPoint(p_procName => 'wip_movProc_priv.update_wo_rs',
1424                            p_procReturnStatus => x_returnStatus,
1425                            p_msg => l_errMsg,
1426                            x_returnStatus => l_returnStatus);
1427     END IF;
1428     fnd_message.set_name('FND', 'FND_GENERIC_MESSAGE');
1429     fnd_message.set_token('MESSAGE', l_errMsg);
1430     fnd_msg_pub.add;
1431 END update_wo_rs;
1432 
1433 
1434 /*****************************************************************************
1435  * This procedure is equivalent to witoc_update_wo  in wiltps5.ppc
1436  * This procedure is used to update qty in the queue step of the from
1437  * operatio for child move txns.
1438  ****************************************************************************/
1439 PROCEDURE  update_wipops(p_txn_id        IN        NUMBER,
1440                          p_gib           IN        group_rec_t,
1441                          x_returnStatus OUT NOCOPY VARCHAR2) IS
1442 
1443 l_params       wip_logger.param_tbl_t;
1444 l_returnStatus VARCHAR2(1);
1445 l_errMsg       VARCHAR2(240);
1446 l_logLevel     NUMBER := fnd_log.g_current_runtime_level;
1447 
1448 BEGIN
1449   -- write parameter values to log file
1450   IF (l_logLevel <= wip_constants.trace_logging) THEN
1451     l_params(1).paramName   := 'p_txn_id';
1452     l_params(1).paramValue  :=  p_txn_id;
1453     l_params(2).paramName   := 'p_group_id';
1454     l_params(2).paramValue  :=  p_gib.group_id;
1455     l_params(3).paramName   := 'p_txn_date';
1456     l_params(3).paramValue  :=  p_gib.txn_date;
1457     wip_logger.entryPoint(p_procName => 'wip_movProc_priv.update_wipops',
1458                           p_params => l_params,
1459                           x_returnStatus => l_returnStatus);
1460   END IF;
1461 
1462   UPDATE wip_operations wop
1463      SET (quantity_in_queue,
1464           last_updated_by,
1465           last_update_date,
1466           last_update_login,
1467           request_id,
1468           program_application_id,
1469           program_id,
1470           program_update_date
1471          ) =
1472          (SELECT wop.quantity_in_queue + wmti1.primary_quantity,
1473                  p_gib.user_id,
1474                  SYSDATE,
1475                  DECODE(p_gib.login_id, -1, NULL, p_gib.login_id),
1476                  DECODE(p_gib.request_id, -1, NULL, p_gib.request_id),
1477                  DECODE(p_gib.application_id, -1, NULL, p_gib.application_id),
1478                  DECODE(p_gib.program_id, -1, NULL, p_gib.program_id),
1479                  DECODE(p_gib.request_id, -1, NULL, SYSDATE)
1480             FROM wip_operations wop1,
1481                  wip_move_txn_interface wmti1,
1482                  wip_move_txn_allocations wma1
1483            WHERE wop1.rowid = wop.rowid
1484            -- The WO rows to be updated are identIFied by the rowids.
1485            -- For each such row, go back and sum the quantities from WMTI
1486              AND wmti1.group_id = p_gib.group_id
1487              AND TRUNC(wmti1.transaction_date) = TRUNC(p_gib.txn_date)
1488              AND wmti1.transaction_id = p_txn_id
1489              AND wop1.wip_entity_id = wmti1.wip_entity_id
1490              AND wop1.organization_id = wmti1.organization_id
1491              AND wop1.operation_seq_num = wmti1.fm_operation_seq_num
1492              AND wmti1.organization_id = wma1.organization_id (+)
1493              AND wmti1.transaction_id = wma1.transaction_id (+)
1494              AND NVL(wma1.repetitive_schedule_id,0) =
1495                  NVL(wop1.repetitive_schedule_id,0))
1496          -- the select below must return just 1 row. When Online, group_id
1497          -- is the same as transaction_id. When in BG, THEN the transaction_id
1498          -- must be passed.
1499    WHERE wop.rowid =
1500          (SELECT wop2.rowid
1501             FROM wip_operations wop2,
1502                  wip_move_txn_interface wmti2,
1503                  wip_move_txn_allocations wma2
1504            WHERE wmti2.group_id = p_gib.group_id
1505              AND TRUNC(wmti2.transaction_date) = TRUNC(p_gib.txn_date)
1506              AND wmti2.transaction_id = p_txn_id
1507                  -- Picked a Move txn
1508              AND wop2.wip_entity_id = wmti2.wip_entity_id
1509              AND wop2.organization_id = wmti2.organization_id
1510              AND wop2.operation_seq_num = wmti2.fm_operation_seq_num
1511              AND wmti2.organization_id = wma2.organization_id (+)
1512              AND wmti2.transaction_id = wma2.transaction_id (+)
1513              AND NVL(wma2.repetitive_schedule_id,0) =
1514                  NVL(wop2.repetitive_schedule_id,0));
1515    -- Picked the row corresponding to the txn. 1 each for such txns
1516    -- Rowids can be duplicate because there might be 2 wmti records with
1517    -- the same fm_op
1518 
1519   x_returnStatus := fnd_api.g_ret_sts_success;
1520 
1521   -- write to the log file
1522   IF (l_logLevel <= wip_constants.trace_logging) THEN
1523     wip_logger.exitPoint(p_procName => 'wip_movProc_priv.update_wipops',
1524                          p_procReturnStatus => x_returnStatus,
1525                          p_msg => 'procedure complete',
1526                         x_returnStatus => l_returnStatus);
1527   END IF;
1528 
1529 EXCEPTION
1530   WHEN OTHERS THEN
1531     x_returnStatus := fnd_api.g_ret_sts_unexp_error;
1532     l_errMsg := 'unexpected error: ' || SQLERRM || 'SQLCODE = ' || SQLCODE;
1533 
1534     IF (l_logLevel <= wip_constants.trace_logging) THEN
1535       wip_logger.exitPoint(p_procName => 'wip_movProc_priv.update_wipops',
1536                            p_procReturnStatus => x_returnStatus,
1537                            p_msg => l_errMsg,
1538                            x_returnStatus => l_returnStatus);
1539     END IF;
1540     fnd_message.set_name('FND', 'FND_GENERIC_MESSAGE');
1541     fnd_message.set_token('MESSAGE', l_errMsg);
1542     fnd_msg_pub.add;
1543 END update_wipops;
1544 
1545 /*****************************************************************************
1546  * This procedure is equivalent to witpsma_move_alloc in wiltps.ppc
1547  * This procedure is used to allocate repetitive schedule.
1548  * Need to check the negative quantities and make sure schedule is still
1549  * Released.
1550  ****************************************************************************/
1551 PROCEDURE rep_move_alloc(p_gib       IN OUT NOCOPY group_rec_t,
1552                          x_returnStatus OUT NOCOPY VARCHAR2) IS
1553 
1554 CURSOR c_rs_txn(p_timeout  NUMBER,
1555                 p_group_id NUMBER,
1556                 p_txn_date DATE) IS
1557 
1558   SELECT created_by,
1559          last_updated_by last_upd_by,
1560          transaction_id txn_id,
1561          organization_id org_id,
1562          wip_entity_id wip_id,
1563          line_id,
1564          transaction_uom txn_uom,
1565          transaction_quantity txn_qty,
1566          primary_quantity primary_qty,
1567          fm_operation_seq_num fm_op,
1568          fm_intraoperation_step_type fm_step,
1569          to_operation_seq_num to_op,
1570          to_intraoperation_step_type to_step,
1571          DECODE(SIGN(86400*(SYSDATE - creation_date) - p_timeout),
1572            1,1,0,0,-1,0) past_timeout,
1573          NVL(overcompletion_primary_qty,0) oc_pri_qty,
1574          DECODE(NVL(overcompletion_primary_qty,-1),
1575            -1,DECODE(NVL(overcompletion_transaction_id,-1),
1576                 -1,WIP_CONSTANTS.normal_txn,
1577                  WIP_CONSTANTS.child_txn),
1578            WIP_CONSTANTS.parent_txn) oc_txn_type,
1579          transaction_type txn_type,
1580          transaction_date txn_date
1581     FROM wip_move_txn_interface
1582    WHERE group_id = p_group_id
1583      AND TRUNC(transaction_date) = TRUNC(p_txn_date)
1584      AND process_phase = WIP_CONSTANTS.MOVE_PROC
1585      AND process_status = WIP_CONSTANTS.RUNNING
1586      AND entity_type = WIP_CONSTANTS.REPETITIVE
1587 ORDER BY transaction_date, organization_id, wip_entity_id, line_id,
1588          fm_operation_seq_num, to_operation_seq_num,
1589          fm_intraoperation_step_type, to_intraoperation_step_type,
1590          creation_date;
1591 
1592 l_rs_txn         c_rs_txn%ROWTYPE;
1593 l_params         wip_logger.param_tbl_t;
1594 l_rsa            rsa_tbl_t;
1595 l_update_rsa     update_rsa_tbl_t;
1596 l_returnStatus   VARCHAR(1);
1597 l_errMsg         VARCHAR2(240);
1598 l_msg            VARCHAR(2000);
1599 l_sche_count     NUMBER;
1600 l_oc_fm_op       NUMBER;
1601 l_rec_count      NUMBER :=0;
1602 l_proc_status    NUMBER;
1603 l_logLevel       NUMBER := fnd_log.g_current_runtime_level;
1604 l_msg_data       VARCHAR2(2000);
1605 l_propagate_job_change_to_po NUMBER;
1606 BEGIN
1607   -- write parameter value to log file
1608   IF (l_logLevel <= wip_constants.trace_logging) THEN
1609     l_params(1).paramName   := 'p_group_id';
1610     l_params(1).paramValue  :=  p_gib.group_id;
1611     l_params(2).paramName   := 'p_timeout';
1612     l_params(2).paramValue  :=  p_gib.time_out;
1613     l_params(3).paramName   := 'p_txn_date';
1614     l_params(3).paramValue  :=  p_gib.txn_date;
1615     l_params(4).paramName   := 'p_login_id';
1616     l_params(4).paramValue  :=  p_gib.login_id;
1617     l_params(5).paramName   := 'p_request_id';
1618     l_params(5).paramValue  :=  p_gib.request_id;
1619     l_params(6).paramName   := 'p_application_id';
1620     l_params(6).paramValue  :=  p_gib.application_id;
1621     l_params(7).paramName   := 'p_program_id';
1622     l_params(7).paramValue  :=  p_gib.program_id;
1623     l_params(8).paramName   := 'p_move_mode';
1624     l_params(8).paramValue  :=  p_gib.move_mode;
1625     l_params(9).paramName   := 'p_backflush_mode';
1626     l_params(9).paramValue  :=  p_gib.bf_mode;
1627     wip_logger.entryPoint(p_procName => 'wip_movProc_priv.rep_move_alloc',
1628                           p_params => l_params,
1629                           x_returnStatus => l_returnStatus);
1630   END IF;
1631 
1632   OPEN c_rs_txn(p_timeout  => p_gib.time_out,
1633                 p_group_id => p_gib.group_id,
1634                 p_txn_date => p_gib.txn_date);
1635   LOOP
1636   BEGIN
1637     FETCH c_rs_txn INTO l_rs_txn;
1638 
1639     IF(c_rs_txn%NOTFOUND) THEN
1640       GOTO END_loop;
1641     ELSE
1642       l_rec_count := l_rec_count + 1;
1643       -- call schedule to allocate qty to schedule
1644       schedule_alloc(p_org_id         => l_rs_txn.org_id,
1645                      p_wip_id         => l_rs_txn.wip_id,
1646                      p_line_id        => l_rs_txn.line_id ,
1647                      p_quantity       => l_rs_txn.primary_qty,
1648                      p_fm_op          => l_rs_txn.fm_op,
1649                      p_fm_step        => l_rs_txn.fm_step,
1650                      p_to_op          => l_rs_txn.to_op,
1651                      p_to_step        => l_rs_txn.to_step,
1652                      p_oc_txn_type    => l_rs_txn.oc_txn_type,
1653                      p_txnType        => l_rs_txn.txn_type,
1654                      p_fm_form        => WIP_CONSTANTS.NO,
1655                      p_comp_alloc     => WIP_CONSTANTS.NO,
1656                      p_txn_date       => l_rs_txn.txn_date, /* Bug 5373061 */
1657                      x_proc_status    => l_proc_status,
1658                      x_sche_count     => l_sche_count,
1659                      x_rsa            => l_rsa,
1660                      x_returnStatus   => x_returnStatus);
1661       IF (l_logLevel <= wip_constants.full_logging) THEN
1662         wip_logger.log(p_msg          => 'l_proc_status = ' || l_proc_status,
1663                        x_returnStatus => l_returnStatus);
1664         wip_logger.log(p_msg          => 'l_sche_count = ' || l_sche_count,
1665                        x_returnStatus => l_returnStatus);
1666       END IF;
1667 
1668       IF(l_proc_status = WIP_CONSTANTS.RUNNING) THEN
1669 
1670         FOR i IN 1..l_sche_count LOOP
1671           INSERT INTO wip_move_txn_allocations
1672                  (transaction_id,
1673                   repetitive_schedule_id,
1674                   organization_id,
1675                   last_update_date,
1676                   last_updated_by,
1677                   creation_date,
1678                   created_by,
1679                   last_update_login,
1680                   request_id,
1681                   program_application_id,
1682                   program_id,
1683                   program_update_date,
1684                   transaction_quantity,
1685                   primary_quantity)
1686            VALUES(l_rs_txn.txn_id,
1687                   l_rsa(i).scheID,
1688                   l_rs_txn.org_id,
1689                   SYSDATE,
1690                   l_rs_txn.last_upd_by,
1691                   SYSDATE,
1692                   l_rs_txn.created_by,     -- Fix for bug 5195072
1693                   DECODE(p_gib.login_id,-1,NULL,p_gib.login_id),
1694                   DECODE(p_gib.request_id,-1,NULL,p_gib.request_id),
1695                   DECODE(p_gib.application_id,-1,NULL,p_gib.application_id),
1696                   DECODE(p_gib.program_id,-1,NULL,p_gib.program_id),
1697                   DECODE(p_gib.request_id,-1,NULL,SYSDATE),
1698                   l_rs_txn.txn_qty * l_rsa(i).scheQty /
1699                     l_rs_txn.primary_qty, -- transaction_quantity
1700                   ROUND(l_rsa(i).scheQty,
1701                         WIP_CONSTANTS.INV_MAX_PRECISION)); -- primary_quantity
1702         END LOOP; --END for loop
1703 
1704         IF(l_rs_txn.oc_txn_type = WIP_CONSTANTS.child_txn) THEN
1705 
1706           -- update qty in the queue step of the from operation
1707           -- for child move txns.
1708           update_wipops(p_txn_id         => l_rs_txn.txn_id,
1709                         p_gib            => p_gib,
1710                         x_returnStatus   => x_returnStatus);
1711 
1712           IF (x_returnStatus <> fnd_api.g_ret_sts_success) THEN
1713             l_errMsg := 'wip_movProc_priv.update_wipops failed';
1714             raise fnd_api.g_exc_unexpected_error;
1715           END IF;
1716 
1717         END IF; -- child txns
1718 
1719         IF(l_rs_txn.oc_txn_type = WIP_CONSTANTS.parent_txn) THEN
1720           -- all procedure in this loop is pretty much for child record
1721           -- IF it is over completion/move txn, insert child record to WMTI
1722           insert_alloc_child(p_org_id         => l_rs_txn.org_id,
1723                              p_scheID         => l_rsa(1).scheID,
1724                              p_oc_pri_qty     => l_rs_txn.oc_pri_qty,
1725                              p_parent_txn_id  => l_rs_txn.txn_id,
1726                              p_gib            => p_gib,
1727                              x_oc_fm_op       => l_oc_fm_op,
1728                              x_returnStatus   => x_returnStatus);
1729 
1730           IF (x_returnStatus <> fnd_api.g_ret_sts_success) THEN
1731 
1732             IF (l_rs_txn.past_timeout = 0) THEN -- not time out yet
1733               UPDATE wip_move_txn_interface
1734                  SET process_status = WIP_CONSTANTS.PENDING,
1735                      group_id       = NULL,
1736                      transaction_id = NULL
1737                WHERE transaction_id = l_rs_txn.txn_id
1738                  AND group_id = p_gib.group_id;
1739             END IF; -- time out check
1740 
1741             l_errMsg := 'wip_movProc_priv.insert_alloc_child failed';
1742             raise fnd_api.g_exc_unexpected_error;
1743 
1744           ELSE -- insert child success
1745             -- insert assemblies in the queue of the first operation after
1746             -- the child record is inserted
1747             update_wipops(p_txn_id         => p_gib.move_profile.child_txn_id,
1748                           p_gib            => p_gib,
1749                           x_returnStatus   => x_returnStatus);
1750 
1751             IF (x_returnStatus <> fnd_api.g_ret_sts_success) THEN
1752               l_errMsg := 'wip_movProc_priv.update_wipops failed';
1753               raise fnd_api.g_exc_unexpected_error;
1754             END IF;
1755 
1756             -- prepare data before calling update_wo_rs
1757             l_update_rsa(1).scheID    := l_rsa(l_sche_count).scheID;
1758             l_update_rsa(1).scheQty   := l_rs_txn.oc_pri_qty;
1759             l_update_rsa(1).loginID   := p_gib.login_id;
1760             l_update_rsa(1).reqID     := p_gib.request_id;
1761             l_update_rsa(1).appID     := p_gib.application_id;
1762             l_update_rsa(1).progID    := p_gib.program_id;
1763             l_update_rsa(1).createdBy := l_rs_txn.created_by;
1764             l_update_rsa(1).updatedBy := l_rs_txn.last_upd_by;
1765             l_update_rsa(1).orgID     := l_rs_txn.org_id;
1766             l_update_rsa(1).wipID     := l_rs_txn.wip_id;
1767             l_update_rsa(1).fmOp      := l_oc_fm_op;
1768             l_update_rsa(1).toOp      := l_rs_txn.fm_op;
1769             l_update_rsa(1).fmStep    := WIP_CONSTANTS.QUEUE;
1770             l_update_rsa(1).toStep    := l_rs_txn.fm_step;
1771 
1772             update_wo_rs(p_scheCount    => 1,
1773                          p_rsa_rec      => l_update_rsa,
1774                          p_txn_date     => l_rs_txn.txn_date,
1775                          x_returnStatus => x_returnStatus);
1776 
1777             IF (x_returnStatus <> fnd_api.g_ret_sts_success) THEN
1778               l_errMsg := 'wip_movProc_priv.update_wo_rs failed';
1779               raise fnd_api.g_exc_unexpected_error;
1780             END IF;
1781           END IF; -- insert_alloc_child check
1782 
1783           IF(l_rs_txn.oc_pri_qty <> 0 AND
1784              po_code_release_grp.Current_Release >=
1785              po_code_release_grp.PRC_11i_Family_Pack_J) THEN
1786 
1787             SELECT propagate_job_change_to_po
1788               INTO l_propagate_job_change_to_po
1789               FROM wip_parameters
1790              WHERE organization_id = l_rs_txn.org_id;
1791 
1792             IF(l_propagate_job_change_to_po = WIP_CONSTANTS.YES) THEN
1793               wip_osp.updatePOReqQuantity(
1794                 p_job_id        => l_rs_txn.wip_id,
1795                 p_repetitive_id => l_rsa(1).scheID,
1796                 p_org_id        => l_rs_txn.org_id,
1797                 p_changed_qty   => l_rs_txn.oc_pri_qty,
1798                /* Fix for Bug#4746495. PO linked to current Operation should
1799                 * not be updated. Only future PO should be updated.
1800                 */
1801                 p_fm_op         => l_rs_txn.fm_op,
1802                 x_return_status => x_returnStatus);
1803 
1804               IF(x_returnStatus <> fnd_api.g_ret_sts_success) THEN
1805                 l_errMsg := 'wip_osp.updatePOReqQuantity failed';
1806                 raise fnd_api.g_exc_unexpected_error;
1807               END IF; -- l_return_status
1808             END IF; -- l_propagate_job_change_to_po = WIP_CONSTANTS.YES
1809           END IF; -- l_rs_txn.oc_pri_qty <> 0 and customer have PO FPJ
1810         END IF; --  IF parent_txn
1811 
1812         -- prepare data before calling update_wo_rs
1813         FOR i IN 1..l_sche_count LOOP
1814           l_update_rsa(i).scheID    := l_rsa(i).scheID;
1815           l_update_rsa(i).scheQty   := l_rsa(i).scheQty;
1816           l_update_rsa(i).loginID   := p_gib.login_id;
1817           l_update_rsa(i).reqID     := p_gib.request_id;
1818           l_update_rsa(i).appID     := p_gib.application_id;
1819           l_update_rsa(i).progID    := p_gib.program_id;
1820           l_update_rsa(i).createdBy := l_rs_txn.created_by;
1821           l_update_rsa(i).updatedBy := l_rs_txn.last_upd_by;
1822           l_update_rsa(i).orgID     := l_rs_txn.org_id;
1823           l_update_rsa(i).wipID     := l_rs_txn.wip_id;
1824           l_update_rsa(i).fmOp      := l_rs_txn.fm_op;
1825           l_update_rsa(i).toOp      := l_rs_txn.to_op;
1826           l_update_rsa(i).fmStep    := l_rs_txn.fm_step;
1827           l_update_rsa(i).toStep    := l_rs_txn.to_step ;
1828         END LOOP;
1829         -- update wip_operations
1830         update_wo_rs(p_scheCount    => l_sche_count,
1831                      p_rsa_rec      => l_update_rsa,
1832                      p_txn_date     => l_rs_txn.txn_date,
1833                      x_returnStatus => x_returnStatus);
1834 
1835         IF (x_returnStatus <> fnd_api.g_ret_sts_success) THEN
1836           l_errMsg := 'wip_movProc_priv.update_wo_rs failed';
1837           raise fnd_api.g_exc_unexpected_error;
1838         END IF;
1839 
1840       ELSIF(l_proc_status = TVE_OVERCOMPLETION_MISMATCH OR
1841             l_proc_status = TVE_NO_MOVE_ALLOC) THEN
1842 
1843         IF(p_gib.move_mode = WIP_CONSTANTS.BACKGROUND) THEN
1844           IF (l_rs_txn.past_timeout = 0) THEN -- not time out yet
1845             UPDATE wip_move_txn_interface
1846                SET process_status = WIP_CONSTANTS.PENDING,
1847                    group_id       = NULL,
1848                    transaction_id = NULL
1849              WHERE transaction_id = l_rs_txn.txn_id
1850                AND group_id = p_gib.group_id;
1851           END IF; -- time out check
1852         END IF; -- BACKGROUND check
1853 
1854         IF(l_proc_status = TVE_OVERCOMPLETION_MISMATCH) THEN
1855           fnd_message.set_name('WIP', 'WIP_OVERCOMPLETION_MISMATCH');
1856           fnd_msg_pub.add;
1857           l_errMsg := 'parent txn is not really overcompletion txn';
1858           raise fnd_api.g_exc_unexpected_error;
1859         ELSE
1860           fnd_message.set_name('WIP', 'WIP_LESS_OR_EQUAL');
1861           fnd_message.set_token('ENTITY1', 'transaction quantity');
1862           fnd_message.set_token('ENTITY2', 'quantity available to move');
1863           fnd_msg_pub.add;
1864           l_errMsg := 'available qty is not enough to fullfill move txn';
1865           raise fnd_api.g_exc_unexpected_error;
1866         END IF;
1867 
1868       ELSIF(l_proc_status = WIP_CONSTANTS.ERROR) THEN
1869 
1870         -- update move_interface table
1871         UPDATE wip_move_txn_interface
1872            SET process_status = WIP_CONSTANTS.ERROR
1873          WHERE transaction_id = l_rs_txn.txn_id
1874            AND group_id = p_gib.group_id;
1875 
1876         l_errMsg := 'wip_movProc_priv.schedule_alloc failed';
1877         raise fnd_api.g_exc_unexpected_error;
1878 
1879       END IF; -- process_status
1880 
1881     END IF; -- c_rs_txn%NOTFOUND
1882     -- Fixed bug 4324706. Reset p_gib.move_profile.child_txn_id to null
1883     -- to prevent child move record got inserted with the same transaction_id.
1884     p_gib.move_profile.child_txn_id := null;
1885     -- Fixed bug 4406536. We should error out only problematic record and
1886     -- continue to process next record.
1887   EXCEPTION
1888     WHEN fnd_api.g_exc_unexpected_error THEN
1889       IF(p_gib.move_mode = WIP_CONSTANTS.BACKGROUND) THEN
1890         IF (l_rs_txn.past_timeout = 0) THEN -- not time out yet
1891           UPDATE wip_move_txn_interface
1892              SET process_status = WIP_CONSTANTS.PENDING,
1893                  group_id       = NULL,
1894                  transaction_id = NULL
1895            WHERE transaction_id = l_rs_txn.txn_id
1896              AND group_id = p_gib.group_id;
1897         ELSE -- already time out
1898           UPDATE wip_move_txn_interface
1899              SET process_status = WIP_CONSTANTS.ERROR
1900            WHERE transaction_id = l_rs_txn.txn_id
1901              AND group_id = p_gib.group_id;
1902 
1903           -- Get error from message stack
1904           wip_utilities.get_message_stack(p_msg =>l_msg);
1905           IF(l_msg IS NULL) THEN
1906             -- initialize message to something because we cannot insert
1907             -- null into WIP_TXN_INTERFACE_ERRORS
1908             fnd_message.set_name('WIP', 'WIP_SOME_RECORDS_ERROR');
1909             l_msg := fnd_message.get;
1910           END IF;
1911 
1912           INSERT INTO WIP_TXN_INTERFACE_ERRORS
1913                   (transaction_id,
1914                    error_column,
1915                    error_message,
1916                    last_update_date,
1917                    last_updated_by,
1918                    creation_date,
1919                    created_by,
1920                    last_update_login,
1921                    request_id,
1922                    program_application_id,
1923                    program_id,
1924                    program_update_date)
1925                 SELECT  wmti.transaction_id,
1926                         'TRANSACTION_QUANTITY', -- error_column
1927                         substrb(l_msg,1,240),   -- error_message
1928                         SYSDATE,                -- last_update_date
1929                         wmti.last_updated_by,   -- last_update_by
1930                         SYSDATE,                -- creation_date
1931                         wmti.created_by,        -- created_by
1932                         p_gib.login_id,
1933                         p_gib.request_id,
1934                         p_gib.application_id,
1935                         p_gib.program_id,
1936                         SYSDATE                 -- program_update_date
1937                    FROM wip_move_txn_interface wmti
1938                   WHERE wmti.transaction_id = l_rs_txn.txn_id
1939                     AND wmti.group_id = p_gib.group_id;
1940         END IF; -- time out check
1941       ELSE--Online processing
1942       --Bug 5210073: Raise an exception to rollback the changes in online mode.
1943         raise fnd_api.g_exc_unexpected_error;
1944       END IF; -- background check
1945   END;
1946   END LOOP;
1947 
1948 <<END_loop>>
1949   IF (l_rec_count = 0) THEN -- no record found
1950     l_errMsg := 'No reptitive move record found';
1951     raise fnd_api.g_exc_unexpected_error;
1952 
1953   ELSE
1954     IF(c_rs_txn%ISOPEN) THEN
1955       CLOSE c_rs_txn;
1956     END IF;
1957     x_returnStatus := fnd_api.g_ret_sts_success;
1958 
1959     -- write to the log file
1960     IF (l_logLevel <= wip_constants.trace_logging) THEN
1961       wip_logger.exitPoint(p_procName => 'wip_movProc_priv.rep_move_alloc',
1962                            p_procReturnStatus => x_returnStatus,
1963                            p_msg => 'procedure complete',
1964                            x_returnStatus => l_returnStatus);
1965     END IF;
1966 
1967   END IF;
1968 
1969 EXCEPTION
1970 
1971   WHEN fnd_api.g_exc_unexpected_error THEN
1972     IF(c_rs_txn%ISOPEN) THEN
1973       CLOSE c_rs_txn;
1974     END IF;
1975     x_returnStatus := fnd_api.g_ret_sts_unexp_error;
1976 
1977     IF (l_logLevel <= wip_constants.trace_logging) THEN
1978       wip_logger.exitPoint(p_procName => 'wip_movProc_priv.rep_move_alloc',
1979                            p_procReturnStatus => x_returnStatus,
1980                            p_msg => l_errMsg,
1981                            x_returnStatus => l_returnStatus);
1982     END IF;
1983   WHEN others THEN
1984     IF(c_rs_txn%ISOPEN) THEN
1985       CLOSE c_rs_txn;
1986     END IF;
1987     x_returnStatus := fnd_api.g_ret_sts_unexp_error;
1988     l_errMsg := 'unexpected error: ' || SQLERRM || 'SQLCODE = ' || SQLCODE;
1989 
1990     IF (l_logLevel <= wip_constants.trace_logging) THEN
1991       wip_logger.exitPoint(p_procName => 'wip_movProc_priv.rep_move_alloc',
1992                            p_procReturnStatus => x_returnStatus,
1993                            p_msg => l_errMsg,
1994                            x_returnStatus => l_returnStatus);
1995     END IF;
1996     fnd_message.set_name('FND', 'FND_GENERIC_MESSAGE');
1997     fnd_message.set_token('MESSAGE', l_errMsg);
1998     fnd_msg_pub.add;
1999 END rep_move_alloc;
2000 
2001 /*****************************************************************************
2002  * This procedure is equivalent to wip_update_wo_dj in wiltps.ppc
2003  * This procedure is used to update WIP_OPERATIONS table for discrete and
2004  * lotbased jobs.
2005  ****************************************************************************/
2006 PROCEDURE update_wo_dj(p_fm_op         IN        NUMBER,
2007                        p_fm_step       IN        NUMBER,
2008                        p_to_op         IN        NUMBER,
2009                        p_to_step       IN        NUMBER,
2010                        p_qty           IN        NUMBER,
2011                        p_org_id        IN        NUMBER,
2012                        p_wip_id        IN        NUMBER,
2013                        p_txn_date      IN        DATE,
2014                        p_gib           IN        group_rec_t,
2015                        x_returnStatus OUT NOCOPY VARCHAR2) IS
2016 
2017 l_params       wip_logger.param_tbl_t;
2018 l_returnStatus VARCHAR(1);
2019 l_errMsg       VARCHAR2(240);
2020 l_logLevel     NUMBER := fnd_log.g_current_runtime_level;
2021 l_forward_move NUMBER;
2022 
2023 BEGIN
2024   -- write parameter value to log file
2025   IF (l_logLevel <= wip_constants.trace_logging) THEN
2026     l_params(1).paramName   := 'p_txn_date';
2027     l_params(1).paramValue  :=  p_txn_date;
2028     l_params(2).paramName   := 'p_fm_op';
2029     l_params(2).paramValue  :=  p_fm_op;
2030     l_params(3).paramName   := 'p_fm_step';
2031     l_params(3).paramValue  :=  p_fm_step;
2032     l_params(4).paramName   := 'p_to_op';
2033     l_params(4).paramValue  :=  p_to_op;
2034     l_params(5).paramName   := 'p_to_step';
2035     l_params(5).paramValue  :=  p_to_step;
2036     l_params(6).paramName   := 'p_qty';
2037     l_params(6).paramValue  :=  p_qty;
2038     l_params(7).paramName   := 'p_org_id';
2039     l_params(7).paramValue  :=  p_org_id;
2040     l_params(8).paramName   := 'p_wip_id';
2041     l_params(8).paramValue  :=  p_wip_id;
2042     wip_logger.entryPoint(p_procName => 'wip_movProc_priv.update_wo_dj',
2043                           p_params => l_params,
2044                           x_returnStatus => l_returnStatus);
2045   END IF;
2046 
2047   UPDATE wip_operations wop
2048      SET (date_last_moved,
2049           last_updated_by,
2050           last_update_date,
2051           last_update_login,
2052           request_id,
2053           program_application_id,
2054           program_id,
2055           program_update_date,
2056           quantity_in_queue,
2057           quantity_running,
2058           quantity_waiting_to_move,
2059           quantity_rejected,
2060           quantity_scrapped) =
2061 
2062           (SELECT DECODE(wop.operation_seq_num,
2063                   p_fm_op,p_txn_date, wop.date_last_moved),
2064                   p_gib.user_id,
2065                   SYSDATE,
2066                   DECODE(p_gib.login_id,-1,NULL,p_gib.login_id),
2067                   DECODE(p_gib.request_id,-1,NULL,p_gib.request_id),
2068                   DECODE(p_gib.application_id,-1,NULL,p_gib.application_id),
2069                   DECODE(p_gib.program_id,-1,NULL,p_gib.program_id),
2070                   DECODE(p_gib.request_id,-1,NULL,SYSDATE),
2071                   wop.quantity_in_queue + SUM(
2072                     DECODE(wop.operation_seq_num,
2073                       p_fm_op, -1 * DECODE(p_fm_step,
2074                                       1,ROUND(p_qty,
2075                                               WIP_CONSTANTS.INV_MAX_PRECISION),
2076                                       0),
2077                       0) +
2078                     DECODE(wop.operation_seq_num,
2079                       p_to_op,DECODE(p_to_step,
2080                                 1,ROUND(p_qty,WIP_CONSTANTS.INV_MAX_PRECISION),
2081                                 0),
2082                       0)),
2083                   wop.quantity_running + SUM(
2084                     DECODE(wop.operation_seq_num,
2085                       p_fm_op, -1 * DECODE(p_fm_step,
2086                                       2,ROUND(p_qty,
2087                                               WIP_CONSTANTS.INV_MAX_PRECISION),
2088                                       0),
2089                       0) +
2090                     DECODE(wop.operation_seq_num,
2091                       p_to_op,DECODE(p_to_step,
2092                                 2,ROUND(p_qty,WIP_CONSTANTS.INV_MAX_PRECISION),
2093                                 0),
2094                       0)),
2095                   wop.quantity_waiting_to_move + SUM(
2096                     DECODE(wop.operation_seq_num,
2097                       p_fm_op, -1 * DECODE(p_fm_step,
2098                                       3,ROUND(p_qty,
2099                                               WIP_CONSTANTS.INV_MAX_PRECISION),
2100                                       0),
2101                       0) +
2102                     DECODE(wop.operation_seq_num,
2103                       p_to_op,DECODE(p_to_step,
2104                                 3,ROUND(p_qty,WIP_CONSTANTS.INV_MAX_PRECISION),
2105                                 0),
2106                       0)),
2107                   wop.quantity_rejected + SUM(
2108                     DECODE(wop.operation_seq_num,
2109                       p_fm_op,-1 * DECODE(p_fm_step,
2110                                      4,ROUND(p_qty,
2111                                              WIP_CONSTANTS.INV_MAX_PRECISION),
2112                                      0),
2113                       0) +
2114                     DECODE(wop.operation_seq_num,
2115                       p_to_op,DECODE(p_to_step,
2116                                 4,ROUND(p_qty,WIP_CONSTANTS.INV_MAX_PRECISION),
2117                                 0),
2118                       0)),
2119                   wop.quantity_scrapped + SUM(
2120                     DECODE(wop.operation_seq_num,
2121                       p_fm_op,-1 * DECODE(p_fm_step,
2122                                      5,ROUND(p_qty,
2123                                              WIP_CONSTANTS.INV_MAX_PRECISION),
2124                                      0),
2125                       0) +
2126                     DECODE(wop.operation_seq_num,
2127                       p_to_op,DECODE(p_to_step,
2128                                 5,ROUND(p_qty,WIP_CONSTANTS.INV_MAX_PRECISION),
2129                                 0),
2130                       0))
2131              FROM wip_operations wop1
2132             WHERE wop1.rowid = wop.rowid
2133               AND wop1.organization_id = p_org_id
2134               AND wop1.wip_entity_id = p_wip_id
2135               AND (wop1.operation_seq_num = p_fm_op
2136                    OR wop1.operation_seq_num = p_to_op))
2137    WHERE wop.rowid IN
2138          (SELECT wop2.rowid
2139             FROM wip_operations wop2
2140            WHERE wop2.organization_id = p_org_id
2141              AND wop2.wip_entity_id = p_wip_id
2142              AND (wop2.operation_seq_num = p_fm_op
2143                   OR wop2.operation_seq_num = p_to_op));
2144 
2145  /*Enh#2864382.Update wip_operations.cumulative_scrap_quantity after each
2146    scrap or return from scrap txn*/
2147    IF(p_fm_step = WIP_CONSTANTS.SCRAP AND p_to_step = WIP_CONSTANTS.SCRAP) THEN
2148      l_forward_move  := WIP_CONSTANTS.NO;
2149      IF(p_fm_op<p_to_op) THEN
2150        l_forward_move := WIP_CONSTANTS.YES;
2151      END IF;
2152 
2153      UPDATE WIP_OPERATIONS  wo
2154        SET  wo.cumulative_scrap_quantity = wo.cumulative_scrap_quantity +
2155                                            DECODE(l_forward_move,
2156                                                   WIP_CONSTANTS.YES, -1*p_qty,
2157                                                   WIP_CONSTANTS.NO, p_qty,
2158                                                   0)
2159      WHERE  wo.rowid in
2160             ( SELECT wo1.rowid
2161                 FROM WIP_OPERATIONS wo1
2162                WHERE wo1.organization_id = p_org_id
2163                  AND wo1.wip_entity_id = p_wip_id
2164                  AND wo1.operation_seq_num > LEAST(p_fm_op,p_to_op)
2165                  AND wo1.operation_seq_num <= GREATEST(p_fm_op,p_to_op));
2166   ELSIF(p_fm_step=WIP_CONSTANTS.SCRAP OR p_to_step=WIP_CONSTANTS.SCRAP)THEN
2167     UPDATE WIP_OPERATIONS wo
2168        SET wo.cumulative_scrap_quantity = wo.cumulative_scrap_quantity +
2169                                           DECODE(p_to_step,
2170                                                  WIP_CONSTANTS.SCRAP,p_qty,
2171                                                  0)   +
2172                                           DECODE(p_fm_step,
2173                                                  WIP_CONSTANTS.SCRAP,-1*p_qty,
2174                                                  0)
2175     WHERE wo.rowid in
2176           (SELECT wo1.rowid
2177              FROM WIP_OPERATIONS wo1
2178             WHERE wo1.organization_id = p_org_id
2179               AND wo1.wip_entity_id   = p_wip_id
2180               AND wo1.operation_seq_num > DECODE(p_fm_step,
2181                                                  WIP_CONSTANTS.SCRAP,p_fm_op,
2182                                                  p_to_op));
2183   END IF;
2184 
2185   x_returnStatus := fnd_api.g_ret_sts_success;
2186 
2187   -- write to the log file
2188   IF (l_logLevel <= wip_constants.trace_logging) THEN
2189     wip_logger.exitPoint(p_procName => 'wip_movProc_priv.update_wo_dj',
2190                          p_procReturnStatus => x_returnStatus,
2191                          p_msg => 'procedure complete',
2192                          x_returnStatus => l_returnStatus);
2193   END IF;
2194 
2195 EXCEPTION
2196   WHEN others THEN
2197     x_returnStatus := fnd_api.g_ret_sts_unexp_error;
2198     l_errMsg := 'unexpected error: ' || SQLERRM || 'SQLCODE = ' || SQLCODE;
2199 
2200     IF (l_logLevel <= wip_constants.trace_logging) THEN
2201       wip_logger.exitPoint(p_procName => 'wip_movProc_priv.update_wo_dj',
2202                            p_procReturnStatus => x_returnStatus,
2203                            p_msg => l_errMsg,
2204                            x_returnStatus => l_returnStatus);
2205     END IF;
2206     fnd_message.set_name('FND', 'FND_GENERIC_MESSAGE');
2207     fnd_message.set_token('MESSAGE', l_errMsg);
2208     fnd_msg_pub.add;
2209 END update_wo_dj;
2210 
2211 /*****************************************************************************
2212  * This procedure is equivalent to witpssq_step_qtys_dj in wiltps.ppc
2213  * This procedure is used to check whether the quantity is enough to move or
2214  * not. IF it is enough, update WIP_OPERATIONS.
2215  ****************************************************************************/
2216 PROCEDURE check_qty_dj(p_gib       IN OUT NOCOPY group_rec_t,
2217                        x_returnStatus OUT NOCOPY VARCHAR2) IS
2218 
2219 CURSOR c_dj_txn(p_timeout  NUMBER,
2220                 p_group_id NUMBER,
2221                 p_txn_date DATE) IS
2222 
2223   SELECT wmti.transaction_id txn_id,
2224          wmti.organization_id org_id,
2225          wmti.wip_entity_id wip_id,
2226          wmti.primary_quantity qty,
2227          wmti.fm_operation_seq_num fm_op,
2228          wmti.fm_intraoperation_step_type fm_step,
2229          wmti.to_operation_seq_num to_op,
2230          wmti.to_intraoperation_step_type to_step,
2231          DECODE(SIGN(86400*(SYSDATE - wmti.creation_date) - p_timeout),
2232            1,1,0) past_timeout,
2233          NVL(wmti.overcompletion_primary_qty,0) oc_pri_qty,
2234          DECODE(NVL(wmti.overcompletion_primary_qty,-1),
2235            -1,DECODE(NVL(wmti.overcompletion_transaction_id,-1),
2236            -1,WIP_CONSTANTS.normal_txn, WIP_CONSTANTS.child_txn)
2237            ,WIP_CONSTANTS.parent_txn) oc_txn_type,
2238          -- new columns added for serial location check
2239          wmti.transaction_type txn_type,
2240          wmti.primary_item_id item_id,
2241          NVL(wdj.serialization_start_op, 0) sn_start_op,
2242          wmti.transaction_date txn_date
2243     FROM wip_move_txn_interface wmti,
2244          wip_discrete_jobs wdj
2245    WHERE wmti.wip_entity_id = wdj.wip_entity_id
2246      AND wmti.group_id = p_group_id
2247      AND TRUNC(wmti.transaction_date) = TRUNC(p_txn_date)
2248      AND wmti.process_phase = WIP_CONSTANTS.MOVE_PROC
2249      AND wmti.process_status = WIP_CONSTANTS.RUNNING
2250      /* Now checks for lotbased entity type also */
2251      AND (wmti.entity_type = WIP_CONSTANTS.DISCRETE
2252          OR wmti.entity_type = WIP_CONSTANTS.LOTBASED)
2253 ORDER BY wmti.transaction_date,
2254          wmti.organization_id,
2255          wmti.wip_entity_id,
2256          wmti.processing_order,
2257          wmti.fm_operation_seq_num,
2258          wmti.to_operation_seq_num,
2259          wmti.fm_intraoperation_step_type,
2260          wmti.to_intraoperation_step_type,
2261          wmti.creation_date;
2262 
2263 CURSOR c_ser_loc(p_start_op NUMBER,
2264                  p_move_id  NUMBER) IS
2265 
2266   SELECT msn.serial_number serial,
2267          NVL(msn.operation_seq_num, p_start_op) sn_op,
2268          NVL(msn.intraoperation_step_type, WIP_CONSTANTS.QUEUE) sn_step
2269     FROM mtl_serial_numbers msn,
2270          wip_serial_move_interface wsmi,
2271          wip_move_txn_interface wmti
2272    WHERE msn.inventory_item_id = wmti.primary_item_id
2273      AND msn.current_organization_id = wmti.organization_id
2274      -- msn.wip_entity_id will be null after complete to inventory. Need this
2275      -- check to support return transaction.
2276      AND (msn.wip_entity_id is null OR
2277           msn.wip_entity_id = wmti.wip_entity_id)
2278      AND msn.serial_number = wsmi.assembly_serial_number
2279      AND wmti.transaction_id = wsmi.transaction_id
2280      AND wmti.transaction_id = p_move_id
2281      AND wmti.group_id = p_gib.group_id;
2282 
2283 l_dj_txn         c_dj_txn%ROWTYPE;
2284 l_ser_loc        c_ser_loc%ROWTYPE;
2285 l_params         wip_logger.param_tbl_t;
2286 l_returnStatus   VARCHAR(1);
2287 l_errMsg         VARCHAR2(240);
2288 l_msg            VARCHAR(2000);
2289 l_rec_count      NUMBER :=0;
2290 l_queue_qty      NUMBER;
2291 l_run_qty        NUMBER;
2292 l_tomove_qty     NUMBER;
2293 l_reject_qty     NUMBER;
2294 l_scrap_qty      NUMBER;
2295 l_oc_fm_op       NUMBER;
2296 -- Fixed bug 4406536. We should initialized l_notenough at the beginning of
2297 -- for loop, not the declaration part.
2298 -- l_notenough      BOOLEAN := FALSE;
2299 l_notenough      BOOLEAN;
2300 l_logLevel       NUMBER := fnd_log.g_current_runtime_level;
2301 -- new variables added for serial location check
2302 l_opSeq          NUMBER;
2303 l_step           NUMBER;
2304 l_msg_data       VARCHAR2(2000);
2305 l_propagate_job_change_to_po NUMBER;
2306 BEGIN
2307   -- write parameter value to log file
2308   IF (l_logLevel <= wip_constants.trace_logging) THEN
2309     l_params(1).paramName   := 'p_group_id';
2310     l_params(1).paramValue  :=  p_gib.group_id;
2311     l_params(2).paramName   := 'p_timeout';
2312     l_params(2).paramValue  :=  p_gib.time_out;
2313     l_params(3).paramName   := 'p_txn_date';
2314     l_params(3).paramValue  :=  p_gib.txn_date;
2315     l_params(4).paramName   := 'p_move_mode';
2316     l_params(4).paramValue  :=  p_gib.move_mode;
2317     wip_logger.entryPoint(p_procName => 'wip_movProc_priv.check_qty_dj',
2318                           p_params => l_params,
2319                           x_returnStatus => l_returnStatus);
2320   END IF;
2321 
2322   OPEN c_dj_txn(p_timeout  => p_gib.time_out,
2323                 p_group_id => p_gib.group_id,
2324                 p_txn_date => p_gib.txn_date);
2325   LOOP
2326   BEGIN
2327     FETCH c_dj_txn INTO l_dj_txn;
2328     IF(c_dj_txn%NOTFOUND) THEN
2329       GOTO end_loop;
2330     ELSE
2331     /*Bug 10379152: when there is exception happenes after serial update, we want to rollback
2332       to this point to avoid serial number being updated for failed move transaction*/
2333      savepoint check_qty_dj_savepoint;
2334 
2335       l_rec_count := l_rec_count + 1;
2336       -- Fixed bug 4406536. We should initialized l_notenough at the beginning
2337       -- of for loop, not the declaration part.
2338       l_notenough := FALSE;
2339       -- validate serial location if serialized job, and serialized move
2340       IF(l_dj_txn.sn_start_op <> 0 AND
2341          l_dj_txn.fm_op >= l_dj_txn.sn_start_op AND
2342          l_dj_txn.to_op >= l_dj_txn.sn_start_op) THEN
2343         -- Only check serial locationtion if transaction_type is either
2344         -- Move or Move and Complete. We already check that serial has valid
2345         -- status to do Return and Move in Move Validation code, so no need to
2346         -- check serial location because both MSN.OPERATION_SEQ_NUM and
2347         -- MSN.INTRAOPERATION_STEP_TYPE will be null, anyway.
2348         FOR l_ser_loc IN c_ser_loc(p_start_op => l_dj_txn.sn_start_op,
2349                                    p_move_id  => l_dj_txn.txn_id) LOOP
2350 
2351           -- get MSN.OPERATION_SEQ_NUM and MSN.INTRAOPERATION_STEP_TYPE
2352 
2353           IF(l_dj_txn.txn_type IN (WIP_CONSTANTS.COMP_TXN,
2354                                    WIP_CONSTANTS.MOVE_TXN) AND
2355              (l_ser_loc.sn_op <> l_dj_txn.fm_op OR
2356               l_ser_loc.sn_step <> l_dj_txn.fm_step)) THEN
2357             fnd_message.set_name('WIP', 'WIP_SERIAL_LOCATION_MISSMATCH');
2358             fnd_msg_pub.add;
2359             l_errMsg := 'current serial location missmatch';
2360             raise fnd_api.g_exc_unexpected_error;
2361           ELSE -- serial location is valid to move
2362             -- If user move back to Queue of serialization start op, we clear
2363             -- operation_seq_num and intraoperation_step_type in MSNT
2364             IF (l_dj_txn.to_op   = l_dj_txn.sn_start_op AND
2365                 l_dj_txn.to_step = WIP_CONSTANTS.QUEUE) THEN
2366               l_opSeq := null;
2367               l_step  := null;
2368             ELSE
2369               l_opSeq := l_dj_txn.to_op;
2370               l_step  := l_dj_txn.to_step;
2371             END IF;
2372             -- update current serial location to WMTI.TO_OPERATION_SEQ_NUM and
2373             -- WMTI.INTRAOPERATION_STEP_TYPE
2374             wip_utilities.update_serial(
2375               p_serial_number            => l_ser_loc.serial,
2376               p_inventory_item_id        => l_dj_txn.item_id,
2377               p_organization_id          => l_dj_txn.org_id,
2378               p_wip_entity_id            => l_dj_txn.wip_id,
2379               p_line_mark_id             => null,
2380               p_operation_seq_num        => l_opSeq,
2381               p_intraoperation_step_type => l_step,
2382               x_return_status            => l_returnStatus);
2383 
2384             IF(l_returnStatus <> fnd_api.g_ret_sts_success) THEN
2385               l_errMsg := 'wip_utilities.update_serial failed';
2386               raise fnd_api.g_exc_unexpected_error;
2387             END IF;
2388           END IF; -- IF(l_dj_txn.txn_type
2389         END LOOP; -- l_ser_loc IN c_ser_loc
2390       END IF; -- serialized move
2391 
2392       SELECT wop.quantity_in_queue,
2393              wop.quantity_running,
2394              wop.quantity_waiting_to_move,
2395              wop.quantity_rejected,
2396              wop.quantity_scrapped
2397         INTO l_queue_qty,
2398              l_run_qty,
2399              l_tomove_qty,
2400              l_reject_qty,
2401              l_scrap_qty
2402         FROM wip_operations wop
2403        WHERE wop.organization_id = l_dj_txn.org_id
2404          AND wop.wip_entity_id = l_dj_txn.wip_id
2405          AND wop.operation_seq_num = l_dj_txn.fm_op;
2406 
2407       IF(l_dj_txn.oc_txn_type = WIP_CONSTANTS.child_txn) THEN
2408          -- update qty in queue step for child txn
2409         update_wipops(p_txn_id         => l_dj_txn.txn_id,
2410                       p_gib            => p_gib,
2411                       x_returnStatus   => x_returnStatus);
2412 
2413         IF(x_returnStatus <> fnd_api.g_ret_sts_success) THEN
2414           l_errMsg := 'wip_movProc_priv.update_wipops failed';
2415           raise fnd_api.g_exc_unexpected_error;
2416         END IF; -- check return status
2417 
2418       ELSE   -- IF it is parent or normal txn, validate qty
2419 
2420         IF(l_dj_txn.fm_step = WIP_CONSTANTS.QUEUE) THEN
2421           IF(l_dj_txn.qty > l_queue_qty + l_dj_txn.oc_pri_qty + 0.00001) THEN
2422             l_notenough := TRUE;
2423           END IF;
2424         ELSIF(l_dj_txn.fm_step = WIP_CONSTANTS.RUN) THEN
2425           IF(l_dj_txn.qty > l_run_qty + l_dj_txn.oc_pri_qty + 0.00001) THEN
2426             l_notenough := TRUE;
2427           END IF;
2428         ELSIF(l_dj_txn.fm_step = WIP_CONSTANTS.TOMOVE) THEN
2429           IF(l_dj_txn.qty > l_tomove_qty + l_dj_txn.oc_pri_qty + 0.00001) THEN
2430             l_notenough := TRUE;
2431           END IF;
2432         ELSIF(l_dj_txn.fm_step = WIP_CONSTANTS.REJECT) THEN
2433           IF(l_dj_txn.qty > l_reject_qty + l_dj_txn.oc_pri_qty + 0.00001) THEN
2434             l_notenough := TRUE;
2435           END IF;
2436         ELSIF(l_dj_txn.fm_step = WIP_CONSTANTS.SCRAP) THEN
2437           IF(l_dj_txn.qty > l_scrap_qty + l_dj_txn.oc_pri_qty + 0.00001) THEN
2438             l_notenough := TRUE;
2439           END IF;
2440         END IF; -- fm_step check
2441       END IF; -- child txn check
2442 
2443       IF(l_notenough) THEN
2444         IF(p_gib.move_mode = WIP_CONSTANTS.BACKGROUND) THEN
2445           IF (l_dj_txn.past_timeout = 0) THEN -- not time out yet
2446             UPDATE wip_move_txn_interface
2447                SET process_status = WIP_CONSTANTS.PENDING,
2448                    group_id       = NULL,
2449                    transaction_id = NULL
2450              WHERE transaction_id = l_dj_txn.txn_id
2451                AND group_id = p_gib.group_id;
2452           END IF; -- time out check
2453         END IF; -- BACKGROUND check
2454         fnd_message.set_name('WIP', 'WIP_LESS_OR_EQUAL');
2455         fnd_message.set_token('ENTITY1', 'transaction quantity');
2456         fnd_message.set_token('ENTITY2', 'quantity available to move');
2457         fnd_msg_pub.add;
2458         l_errMsg := 'available qty is not enough to fullfill move txn';
2459         raise fnd_api.g_exc_unexpected_error;
2460       ELSE -- enough qty to move
2461         IF(l_dj_txn.oc_txn_type = WIP_CONSTANTS.parent_txn) THEN
2462 
2463           -- all procedure in this loop is pretty much for child record
2464           -- IF it is over completion/move txn, insert child record to WMTI
2465           insert_alloc_child(p_org_id         => l_dj_txn.org_id,
2466                              p_scheID         => -1,
2467                              p_oc_pri_qty     => l_dj_txn.oc_pri_qty,
2468                              p_parent_txn_id  => l_dj_txn.txn_id,
2469                              p_gib            => p_gib,
2470                              x_oc_fm_op       => l_oc_fm_op,
2471                              x_returnStatus   => x_returnStatus);
2472 
2473           IF (x_returnStatus <> fnd_api.g_ret_sts_success) THEN
2474             IF (l_dj_txn.past_timeout = 0) THEN -- not time out yet
2475               UPDATE wip_move_txn_interface
2476                  SET process_status = WIP_CONSTANTS.PENDING,
2477                      group_id       = NULL,
2478                      transaction_id = NULL
2479                WHERE transaction_id = l_dj_txn.txn_id
2480                  AND group_id = p_gib.group_id;
2481             END IF; -- time out check
2482 
2483             l_errMsg := 'wip_movProc_priv.insert_alloc_child failed';
2484             raise fnd_api.g_exc_unexpected_error;
2485 
2486           ELSE -- insert child success
2487             -- insert assemblies in the queue of the first operation after
2488             -- the child record is inserted
2489             update_wipops(p_txn_id         => p_gib.move_profile.child_txn_id,
2490                           p_gib            => p_gib,
2491                           x_returnStatus   => x_returnStatus);
2492 
2493             IF (x_returnStatus <> fnd_api.g_ret_sts_success) THEN
2494               l_errMsg := 'wip_movProc_priv.update_wipops failed';
2495               raise fnd_api.g_exc_unexpected_error;
2496             END IF;
2497 
2498             -- update wip_operations for child move txns
2499             update_wo_dj(p_gib             => p_gib,
2500                          p_fm_op           => l_oc_fm_op,
2501                          p_fm_step         => WIP_CONSTANTS.QUEUE,
2502                          p_to_op           => l_dj_txn.fm_op,
2503                          p_to_step         => l_dj_txn.fm_step,
2504                          p_qty             => l_dj_txn.oc_pri_qty,
2505                          p_org_id          => l_dj_txn.org_id,
2506                          p_wip_id          => l_dj_txn.wip_id,
2507                          p_txn_date        => l_dj_txn.txn_date,
2508                          x_returnStatus    => x_returnStatus);
2509 
2510             IF (x_returnStatus <> fnd_api.g_ret_sts_success) THEN
2511               l_errMsg := 'wip_movProc_priv.update_wo_dj failed';
2512               raise fnd_api.g_exc_unexpected_error;
2513             END IF;
2514           END IF; -- insert_alloc_child check
2515 
2516           -- Increase PO/requisition quantity if overmove
2517           IF(l_dj_txn.oc_pri_qty <> 0 AND
2518              po_code_release_grp.Current_Release >=
2519              po_code_release_grp.PRC_11i_Family_Pack_J) THEN
2520 
2521             SELECT propagate_job_change_to_po
2522               INTO l_propagate_job_change_to_po
2523               FROM wip_parameters
2524              WHERE organization_id = l_dj_txn.org_id;
2525 
2526             IF(l_propagate_job_change_to_po = WIP_CONSTANTS.YES) THEN
2527               wip_osp.updatePOReqQuantity(
2528                 p_job_id        => l_dj_txn.wip_id,
2529                 p_org_id        => l_dj_txn.org_id,
2530                 p_changed_qty   => l_dj_txn.oc_pri_qty,
2531                /* Fix for Bug#4746495. PO linked to current Operation should
2532                 * not be updated. Only future PO should be updated.
2533                 */
2534                 p_fm_op         => l_dj_txn.fm_op,
2535                 x_return_status => x_returnStatus);
2536 
2537               IF(x_returnStatus <> fnd_api.g_ret_sts_success) THEN
2538                 l_errMsg := 'wip_osp.updatePOReqQuantity failed';
2539                 raise fnd_api.g_exc_unexpected_error;
2540               END IF; -- x_returnStatus
2541             END IF; -- l_propagate_job_change_to_po = WIP_CONSTANTS.YES
2542           END IF; -- l_dj_txn.oc_pri_qty <> 0 and customer have PO FPJ
2543         END IF; --  IF parent_txn
2544 
2545         -- update wip_operations for parent and normal move txns
2546         update_wo_dj(p_gib             => p_gib,
2547                      p_fm_op           => l_dj_txn.fm_op,
2548                      p_fm_step         => l_dj_txn.fm_step,
2549                      p_to_op           => l_dj_txn.to_op,
2550                      p_to_step         => l_dj_txn.to_step,
2551                      p_qty             => l_dj_txn.qty,
2552                      p_org_id          => l_dj_txn.org_id,
2553                      p_wip_id          => l_dj_txn.wip_id,
2554                      p_txn_date        => l_dj_txn.txn_date,
2555                      x_returnStatus    => x_returnStatus);
2556 
2557         IF (x_returnStatus <> fnd_api.g_ret_sts_success) THEN
2558           l_errMsg := 'wip_movProc_priv.update_wo_dj failed';
2559           raise fnd_api.g_exc_unexpected_error;
2560         END IF;
2561 
2562       END IF; -- check enough qty
2563 
2564     END IF; --c_dj_txn%NOTFOUND
2565     -- Fixed bug 4324706. Reset p_gib.move_profile.child_txn_id to null
2566     -- to prevent child move record got inserted with the same transaction_id.
2567     p_gib.move_profile.child_txn_id := null;
2568     -- Fixed bug 4406536. We should error out only problematic record and
2569     -- continue to process next record.
2570   EXCEPTION
2571     WHEN fnd_api.g_exc_unexpected_error THEN
2572       IF(p_gib.move_mode = WIP_CONSTANTS.BACKGROUND) THEN
2573       /*Bug 10379152: when there is exception happenes after serial update, we want to rollback
2574       to this savepoint check_qty_dj_savepoint to avoid serial number being updated for failed move transaction*/
2575        rollback to check_qty_dj_savepoint;
2576 
2577         IF (l_dj_txn.past_timeout = 0) THEN -- not time out yet
2578           UPDATE wip_move_txn_interface
2579              SET process_status = WIP_CONSTANTS.PENDING,
2580                  group_id       = NULL,
2581                  transaction_id = NULL
2582            WHERE transaction_id = l_dj_txn.txn_id
2583              AND group_id = p_gib.group_id;
2584         ELSE -- already time out
2585           UPDATE wip_move_txn_interface
2586              SET process_status = WIP_CONSTANTS.ERROR
2587            WHERE transaction_id = l_dj_txn.txn_id
2588              AND group_id = p_gib.group_id;
2589           -- Get error from message stack
2590           wip_utilities.get_message_stack(p_msg =>l_msg);
2591           IF(l_msg IS NULL) THEN
2592             -- initialize message to something because we cannot insert
2593             -- null into WIP_TXN_INTERFACE_ERRORS
2594             fnd_message.set_name('WIP', 'WIP_SOME_RECORDS_ERROR');
2595             l_msg := fnd_message.get;
2596           END IF;
2597 
2598           INSERT INTO WIP_TXN_INTERFACE_ERRORS
2599                   (transaction_id,
2600                    error_column,
2601                    error_message,
2602                    last_update_date,
2603                    last_updated_by,
2604                    creation_date,
2605                    created_by,
2606                    last_update_login,
2607                    request_id,
2608                    program_application_id,
2609                    program_id,
2610                    program_update_date)
2611                 SELECT  wmti.transaction_id,
2612                         'TRANSACTION_QUANTITY', -- error_column
2613                         substrb(l_msg,1,240),   -- error_message
2614                         SYSDATE,                -- last_update_date
2615                         wmti.last_updated_by,   -- last_update_by
2616                         SYSDATE,                -- creation_date
2617                         wmti.created_by,        -- created_by
2618                         p_gib.login_id,
2619                         p_gib.request_id,
2620                         p_gib.application_id,
2621                         p_gib.program_id,
2622                         SYSDATE                 -- program_update_date
2623                    FROM wip_move_txn_interface wmti
2624                   WHERE wmti.transaction_id = l_dj_txn.txn_id
2625                     AND wmti.group_id = p_gib.group_id;
2626         END IF; -- time out check
2627       ELSE--Online processing
2628       --Bug 5210073: Raise an exception to rollback the changes in online mode.
2629         raise fnd_api.g_exc_unexpected_error;
2630       END IF; -- background check
2631   END;
2632   END LOOP; -- c_dj_txn
2633 
2634 <<end_loop>>
2635   IF(c_dj_txn%ISOPEN) THEN
2636     CLOSE c_dj_txn;
2637   END IF;
2638   x_returnStatus := fnd_api.g_ret_sts_success;
2639 
2640   -- write to the log file
2641   IF (l_logLevel <= wip_constants.trace_logging) THEN
2642     wip_logger.exitPoint(p_procName => 'wip_movProc_priv.check_qty_dj',
2643                          p_procReturnStatus => x_returnStatus,
2644                          p_msg => 'procedure complete',
2645                          x_returnStatus => l_returnStatus);
2646   END IF;
2647 
2648 EXCEPTION
2649 
2650   WHEN fnd_api.g_exc_unexpected_error THEN
2651     IF(c_dj_txn%ISOPEN) THEN
2652       CLOSE c_dj_txn;
2653     END IF;
2654     x_returnStatus := fnd_api.g_ret_sts_unexp_error;
2655 
2656     IF (l_logLevel <= wip_constants.trace_logging) THEN
2657       wip_logger.exitPoint(p_procName => 'wip_movProc_priv.check_qty_dj',
2658                            p_procReturnStatus => x_returnStatus,
2659                            p_msg => l_errMsg,
2660                            x_returnStatus => l_returnStatus);
2661     END IF;
2662 
2663   WHEN others THEN
2664     IF(c_dj_txn%ISOPEN) THEN
2665       CLOSE c_dj_txn;
2666     END IF;
2667     x_returnStatus := fnd_api.g_ret_sts_unexp_error;
2668     l_errMsg := 'unexpected error: ' || SQLERRM || 'SQLCODE = ' || SQLCODE;
2669 
2670     IF (l_logLevel <= wip_constants.trace_logging) THEN
2671       wip_logger.exitPoint(p_procName => 'wip_movProc_priv.check_qty_dj',
2672                            p_procReturnStatus => x_returnStatus,
2673                            p_msg => l_errMsg,
2674                            x_returnStatus => l_returnStatus);
2675     END IF;
2676     fnd_message.set_name('FND', 'FND_GENERIC_MESSAGE');
2677     fnd_message.set_token('MESSAGE', l_errMsg);
2678     fnd_msg_pub.add;
2679 END check_qty_dj;
2680 
2681 /*****************************************************************************
2682  * This procedure is equivalent to witvemp_move_profile in wiltve.ppc
2683  * This procedure is used to get move profile
2684  ****************************************************************************/
2685 PROCEDURE get_move_profile(p_gib       IN OUT NOCOPY group_rec_t,
2686                            x_returnStatus OUT NOCOPY VARCHAR2) IS
2687 
2688 l_params       wip_logger.param_tbl_t;
2689 l_returnStatus VARCHAR(1);
2690 l_errMsg       VARCHAR2(240);
2691 l_mv_item  NUMBER;
2692 l_mv_lot   NUMBER;
2693 l_po_item  NUMBER;
2694 l_po_lot   NUMBER;
2695 l_completion   NUMBER;
2696 l_return       NUMBER;
2697 l_move         move_profile_rec_t;
2698 l_logLevel     NUMBER := fnd_log.g_current_runtime_level;
2699 
2700 BEGIN
2701   -- initialize l_move
2702   l_move := p_gib.move_profile;
2703 
2704   -- write parameter value to log file
2705   IF (l_logLevel <= wip_constants.trace_logging) THEN
2706     l_params(1).paramName   := 'p_group_id';
2707     l_params(1).paramValue  :=  p_gib.group_id;
2708     l_params(2).paramName   := 'p_txn_date';
2709     l_params(2).paramValue  :=  p_gib.txn_date;
2710     l_params(3).paramName   := 'p_move_mode';
2711     l_params(3).paramValue  :=  p_gib.move_mode;
2712     l_params(4).paramName   := 'org_id';
2713     l_params(4).paramValue  :=  l_move.org_id;
2714     l_params(5).paramName   := 'wip_id';
2715     l_params(5).paramValue  :=  l_move.wip_id;
2716     l_params(6).paramName   := 'fmOp';
2717     l_params(6).paramValue  :=  l_move.fmOp;
2718     l_params(7).paramName   := 'fmStep';
2719     l_params(7).paramValue  :=  l_move.fmStep;
2720     l_params(8).paramName   := 'toOp';
2721     l_params(8).paramValue  :=  l_move.toOp;
2722     l_params(9).paramName   := 'toStep';
2723     l_params(9).paramValue  :=  l_move.toStep;
2724     l_params(10).paramName  := 'scrapTxn';
2725     l_params(10).paramValue :=  l_move.scrapTxn;
2726     l_params(11).paramName  := 'easyComplete';
2727     l_params(11).paramValue :=  l_move.easyComplete;
2728     l_params(12).paramName  := 'easyReturn';
2729     l_params(12).paramValue :=  l_move.easyReturn;
2730     l_params(13).paramName  := 'jobTxn';
2731     l_params(13).paramValue :=  l_move.jobTxn;
2732     l_params(14).paramName  := 'scheTxn';
2733     l_params(14).paramValue :=  l_move.scheTxn;
2734     l_params(15).paramName  := 'rsrcItem';
2735     l_params(15).paramValue :=  l_move.rsrcItem;
2736     l_params(16).paramName  := 'rsrcLot';
2737     l_params(16).paramValue :=  l_move.rsrcLot;
2738     l_params(17).paramName  := 'poReqItem';
2739     l_params(17).paramValue :=  l_move.poReqItem;
2740     l_params(18).paramName  := 'poRegLot';
2741     l_params(18).paramValue :=  l_move.poReqLot;
2742     wip_logger.entryPoint(p_procName => 'wip_movProc_priv.get_move_profile',
2743                           p_params => l_params,
2744                           x_returnStatus => l_returnStatus);
2745   END IF;
2746 
2747   IF(p_gib.move_mode = WIP_CONSTANTS.ONLINE) THEN
2748 
2749     /* Fix for FP bug 5246228 base bug 5227706:
2750      *  Modified following query to consider autocharge
2751      *  resources in previous operation for overcompletion cases */
2752     SELECT SUM(DECODE(basis_type,1,DECODE(autocharge_type,1,1,0),0)),
2753            SUM(DECODE(basis_type,2,DECODE(autocharge_type,1,1,0),0)),
2754            SUM(DECODE(to_intraoperation_step_type,1,DECODE(basis_type,1,
2755              DECODE(autocharge_type,3,1,4,1,0),0))),
2756            SUM(DECODE(to_intraoperation_step_type,1,DECODE(basis_type,2,
2757              DECODE(autocharge_type,3,1,4,1,0),0)))
2758       INTO l_mv_item,
2759            l_mv_lot,
2760            l_po_item,
2761            l_po_lot
2762       FROM wip_move_txn_interface wmti,
2763            wip_operation_resources wor
2764      WHERE wmti.transaction_id = p_gib.group_id
2765        AND wmti.group_id = p_gib.group_id
2766        AND wor.organization_id = l_move.org_id
2767        AND wor.wip_entity_id = l_move.wip_id
2768        AND ((wmti.overcompletion_primary_qty IS NULL
2769              AND (wor.operation_seq_num BETWEEN l_move.fmOp AND l_move.toOp
2770                  OR
2771                  wor.operation_seq_num BETWEEN l_move.toOp AND l_move.fmOp))
2772             OR wor.operation_seq_num <= l_move.toOp);
2773             /* Fix for Bug#5552530, which is an FP of Bug#5509016.
2774                Changed < to <= in above condition */
2775 
2776   ELSE   -- move_mode is background
2777 
2778     SELECT SUM(DECODE(transaction_type, WIP_CONSTANTS.COMP_TXN, 1, 0)),
2779            SUM(DECODE(transaction_type, WIP_CONSTANTS.RET_TXN, 1, 0))
2780       INTO l_completion,
2781            l_return
2782       FROM wip_move_txn_interface wmti
2783      WHERE wmti.group_id = p_gib.group_id
2784        AND TRUNC(wmti.transaction_date) = TRUNC(p_gib.txn_date)
2785        AND wmti.process_phase = WIP_CONSTANTS.MOVE_PROC
2786        AND wmti.process_status = WIP_CONSTANTS.RUNNING;
2787 
2788     -- set completion and return flag
2789     IF(l_completion > 0) THEN
2790       l_move.easyComplete := WIP_CONSTANTS.YES;
2791     ELSE
2792       l_move.easyComplete := WIP_CONSTANTS.NO;
2793     END IF;
2794 
2795     IF(l_return > 0) THEN
2796       l_move.easyReturn := WIP_CONSTANTS.YES;
2797     ELSE
2798       l_move.easyReturn := WIP_CONSTANTS.NO;
2799     END IF;
2800     /* Fix for bug 3902908: Added hints as per suggestion of appsperf team. */
2801     /* Fix for FP bug 5246228 base bug 5227706: Modified following query to consider autocharge
2802        resources in previous operation for overcompletion cases */
2803     SELECT /*+ leading(wti) use_nl(wti wor) index(wor WIP_OPERATION_RESOURCES_U1) */
2804            SUM(DECODE(basis_type,1,DECODE(autocharge_type,1,1,0),0)),
2805            SUM(DECODE(basis_type,2,DECODE(autocharge_type,1,1,0),0)),
2806            SUM(DECODE(to_intraoperation_step_type,1,DECODE(basis_type,1,
2807              DECODE(autocharge_type,3,1,4,1,0),0))),
2808            SUM(DECODE(to_intraoperation_step_type,1,DECODE(basis_type,2,
2809              DECODE(autocharge_type,3,1,4,1,0),0)))
2810       INTO l_mv_item,
2811            l_mv_lot,
2812            l_po_item,
2813            l_po_lot
2814       FROM wip_move_txn_interface wmti,
2815            wip_operation_resources wor
2816      WHERE wmti.group_id = p_gib.group_id
2817        AND TRUNC(wmti.transaction_date) = TRUNC(p_gib.txn_date)
2818        AND wmti.process_phase = WIP_CONSTANTS.MOVE_PROC
2819        AND wmti.process_status = WIP_CONSTANTS.RUNNING
2820        AND wor.organization_id = wmti.organization_id
2821        AND wor.wip_entity_id = wmti.wip_entity_id
2822        AND ((wmti.overcompletion_primary_qty IS NULL
2823              AND (wor.operation_seq_num BETWEEN wmti.fm_operation_seq_num
2824                     AND wmti.to_operation_seq_num
2825                   OR
2826                   wor.operation_seq_num BETWEEN wmti.to_operation_seq_num
2827                     AND wmti.fm_operation_seq_num))
2828             OR wor.operation_seq_num <= wmti.to_operation_seq_num);
2829             /* Fix for Bug#5552530, which is an FP of Bug#5509016.
2830                Changed < to <= in above condition */
2831 
2832   END IF; -- move_mode is online
2833 
2834   -- set the rest of move_profile flag
2835   IF(l_mv_item > 0) THEN -- auto resource per item
2836     l_move.rsrcItem :=  WIP_CONSTANTS.YES;
2837   ELSE
2838     l_move.rsrcItem :=  WIP_CONSTANTS.NO;
2839   END IF;
2840 
2841   IF(l_mv_lot > 0) THEN -- auto resource per lot
2842     l_move.rsrcLot :=  WIP_CONSTANTS.YES;
2843   ELSE
2844     l_move.rsrcLot :=  WIP_CONSTANTS.NO;
2845   END IF;
2846 
2847   IF(l_po_item > 0) THEN  -- po requisition per item
2848     l_move.poReqItem :=  WIP_CONSTANTS.YES;
2849   ELSE
2850     l_move.poReqItem :=  WIP_CONSTANTS.NO;
2851   END IF;
2852 
2853   IF(l_po_lot > 0) THEN  -- po requisition per lot
2854     l_move.poReqLot :=  WIP_CONSTANTS.YES;
2855   ELSE
2856     l_move.poReqLot :=  WIP_CONSTANTS.NO;
2857   END IF;
2858 
2859   -- return move profile back
2860   p_gib.move_profile := l_move;
2861 
2862   x_returnStatus := fnd_api.g_ret_sts_success;
2863 
2864   -- write to the log file
2865   IF (l_logLevel <= wip_constants.trace_logging) THEN
2866     wip_logger.exitPoint(p_procName => 'wip_movProc_priv.get_move_profile',
2867                          p_procReturnStatus => x_returnStatus,
2868                          p_msg => 'procedure complete',
2869                          x_returnStatus => l_returnStatus);
2870   END IF;
2871 
2872 EXCEPTION
2873   WHEN others THEN
2874     x_returnStatus := fnd_api.g_ret_sts_unexp_error;
2875     l_errMsg := 'unexpected error: ' || SQLERRM || 'SQLCODE = ' || SQLCODE;
2876 
2877     IF (l_logLevel <= wip_constants.trace_logging) THEN
2878       wip_logger.exitPoint(p_procName => 'wip_movProc_priv.get_move_profile',
2879                            p_procReturnStatus => x_returnStatus,
2880                            p_msg => l_errMsg,
2881                            x_returnStatus => l_returnStatus);
2882     END IF;
2883     fnd_message.set_name('FND', 'FND_GENERIC_MESSAGE');
2884     fnd_message.set_token('MESSAGE', l_errMsg);
2885     fnd_msg_pub.add;
2886 END get_move_profile;
2887 
2888 /*****************************************************************************
2889  * This procedure is equivalent to witpsth_txn_history in wiltps5.ppc
2890  * This procedure is used to insert history move records into
2891  * WIP_MOVE_TRANSACTIONS.
2892  ****************************************************************************/
2893 PROCEDURE insert_txn_history(p_gib           IN        group_rec_t,
2894                              x_returnStatus OUT NOCOPY VARCHAR2) IS
2895 
2896 l_params       wip_logger.param_tbl_t;
2897 l_returnStatus VARCHAR(1);
2898 l_msg          VARCHAR(240);
2899 l_errMsg       VARCHAR2(240);
2900 l_logLevel     NUMBER := fnd_log.g_current_runtime_level;
2901 
2902 BEGIN
2903   -- write parameter value to log file
2904   IF (l_logLevel <= wip_constants.trace_logging) THEN
2905     l_params(1).paramName   := 'p_group_id';
2906     l_params(1).paramValue  :=  p_gib.group_id;
2907     l_params(2).paramName   := 'p_txn_date';
2908     l_params(2).paramValue  :=  p_gib.txn_date;
2909     wip_logger.entryPoint(p_procName => 'wip_movProc_priv.insert_txn_history',
2910                           p_params => l_params,
2911                           x_returnStatus => l_returnStatus);
2912   END IF;
2913 
2914   -- insert history serial move record into WIP_SERIAL_MOVE_TRANSACTIONS
2915   INSERT INTO wip_serial_move_transactions
2916          (transaction_id,
2917           assembly_serial_number,
2918           creation_date,
2919           created_by,
2920           created_by_name,
2921           last_update_date,
2922           last_updated_by,
2923           last_updated_by_name,
2924           last_update_login,
2925           request_id,
2926           program_application_id,
2927           program_id,
2928           program_update_date,
2929           -- Add this column for OSFM serial support project.
2930           gen_object_id
2931           )
2932           SELECT wsmi.transaction_id,
2933                  wsmi.assembly_serial_number,
2934                  wsmi.creation_date,
2935                  wsmi.created_by,
2936                  wsmi.created_by_name,
2937                  wsmi.last_update_date,
2938                  wsmi.last_updated_by,
2939                  wsmi.last_updated_by_name,
2940                  wsmi.last_update_login,
2941                  wsmi.request_id,
2942                  wsmi.program_application_id,
2943                  wsmi.program_id,
2944                  wsmi.program_update_date,
2945                  -- Add this column for OSFM serial support project.
2946                  wsmi.gen_object_id
2947             FROM wip_serial_move_interface wsmi,
2948                  wip_move_txn_interface wmti
2949            WHERE wsmi.transaction_id = wmti.transaction_id
2950              AND wmti.group_id = p_gib.group_id
2951              AND TRUNC(wmti.transaction_date) = TRUNC(p_gib.txn_date)
2952              AND wmti.process_phase = WIP_CONSTANTS.MOVE_PROC
2953              AND wmti.process_status = WIP_CONSTANTS.RUNNING;
2954 
2955   -- IF debug message level = 2, write statement below to log file
2956   IF (l_logLevel <= wip_constants.full_logging) THEN
2957     fnd_message.set_name('WIP', 'WIP_INSERTED_ROWS');
2958     fnd_message.set_token('ENTITY1', SQL%ROWCOUNT);
2959     fnd_message.set_token('ENTITY2', 'WIP_SERIAL_MOVE_TRANSACTIONS');
2960     l_msg := fnd_message.get;
2961     wip_logger.log(p_msg          => l_msg,
2962                    x_returnStatus => l_returnStatus);
2963   END IF;
2964 
2965   -- insert history move record into WIP_MOVE_TRANSACTIONS
2966   -- Discrete/OSFM
2967   INSERT INTO wip_move_transactions
2968          (transaction_id,
2969           last_updated_by,
2970           last_update_date,
2971           last_update_login,
2972           created_by,
2973           creation_date,
2974           request_id,
2975           program_application_id,
2976           program_id,
2977           program_update_date,
2978           group_id,
2979           source_code,
2980           source_line_id,
2981           organization_id,
2982           wip_entity_id,
2983           primary_item_id,
2984           line_id,
2985           transaction_date,
2986           acct_period_id,
2987           fm_operation_seq_num,
2988           fm_operation_code,
2989           fm_department_id,
2990           fm_intraoperation_step_type,
2991           to_operation_seq_num,
2992           to_operation_code,
2993           to_department_id,
2994           to_intraoperation_step_type,
2995           transaction_quantity,
2996           transaction_uom,
2997           primary_quantity,
2998           primary_uom,
2999           reason_id,
3000           reference,
3001           scrap_account_id,
3002           attribute_category,
3003           attribute1,
3004           attribute2,
3005           attribute3,
3006           attribute4,
3007           attribute5,
3008           attribute6,
3009           attribute7,
3010           attribute8,
3011           attribute9,
3012           attribute10,
3013           attribute11,
3014           attribute12,
3015           attribute13,
3016           attribute14,
3017           attribute15,
3018           qa_collection_id,
3019           overcompletion_transaction_qty,
3020           overcompletion_primary_qty,
3021           overcompletion_transaction_id,
3022           job_quantity_snapshot,
3023           batch_id,
3024           employee_id,
3025           completed_instructions
3026           )
3027           SELECT wmti.transaction_id,
3028                  wmti.last_updated_by,  -- last_updated_by --Fix for bug 5195072
3029                  SYSDATE,       -- last_update_date
3030                  DECODE(p_gib.login_id,
3031                    -1,NULL,p_gib.login_id), -- last_update_login
3032                  wmti.created_by,    -- created_by  --Fix for bug 5195072
3033                  SYSDATE,       -- creation_date
3034                  DECODE(p_gib.request_id,-1,NULL,p_gib.request_id),
3035                  DECODE(p_gib.application_id,-1,NULL,p_gib.application_id),
3036                  DECODE(p_gib.program_id,-1,NULL,p_gib.program_id),
3037                  DECODE(p_gib.request_id,
3038                    -1,NULL,SYSDATE), -- program_update_date
3039                  p_gib.group_id,
3040                  wmti.source_code,
3041                  wmti.source_line_id,
3042                  wmti.organization_id,
3043                  wmti.wip_entity_id,
3044                  wmti.primary_item_id,
3045                  wmti.line_id,
3046                  wmti.transaction_date,
3047                  wmti.acct_period_id,
3048                  wmti.fm_operation_seq_num,
3049                  wmti.fm_operation_code,
3050                  wmti.fm_department_id,
3051                  wmti.fm_intraoperation_step_type,
3052                  wmti.to_operation_seq_num,
3053                  wmti.to_operation_code,
3054                  wmti.to_department_id,
3055                  wmti.to_intraoperation_step_type,
3056                  wmti.transaction_quantity,
3057                  wmti.transaction_uom,
3058                  wmti.primary_quantity,
3059                  wmti.primary_uom,
3060                  wmti.reason_id,
3061                  wmti.reference,
3062                  wmti.scrap_account_id,
3063                  wmti.attribute_category,
3064                  wmti.attribute1,
3065                  wmti.attribute2,
3066                  wmti.attribute3,
3067                  wmti.attribute4,
3068                  wmti.attribute5,
3069                  wmti.attribute6,
3070                  wmti.attribute7,
3071                  wmti.attribute8,
3072                  wmti.attribute9,
3073                  wmti.attribute10,
3074                  wmti.attribute11,
3075                  wmti.attribute12,
3076                  wmti.attribute13,
3077                  wmti.attribute14,
3078                  wmti.attribute15,
3079                  wmti.qa_collection_id,
3080                  wmti.overcompletion_transaction_qty,
3081                  wmti.overcompletion_primary_qty,
3082                  wmti.overcompletion_transaction_id,
3083                  wdj.start_quantity,
3084                  wmti.batch_id,
3085                  wmti.employee_id,
3086                  wmti.completed_instructions
3087             FROM wip_move_txn_interface wmti,
3088                  wip_discrete_jobs wdj
3089            WHERE wmti.group_id = p_gib.group_id
3090              AND TRUNC(wmti.transaction_date) = TRUNC(p_gib.txn_date)
3091              AND wmti.process_phase = WIP_CONSTANTS.MOVE_PROC
3092              AND wmti.process_status = WIP_CONSTANTS.RUNNING
3093              AND wmti.entity_type IN (WIP_CONSTANTS.DISCRETE,
3094                                       WIP_CONSTANTS.LOTBASED)
3095              AND wdj.wip_entity_id = wmti.wip_entity_id
3096              AND wdj.organization_id = wmti.organization_id;
3097 
3098    -- IF debug message level = 2, write statement below to log file
3099   IF (l_logLevel <= wip_constants.full_logging) THEN
3100     fnd_message.set_name('WIP', 'WIP_INSERTED_ROWS');
3101     fnd_message.set_token('ENTITY1', SQL%ROWCOUNT);
3102     fnd_message.set_token('ENTITY2', 'WIP_MOVE_TRANSACTIONS');
3103     l_msg := fnd_message.get;
3104     wip_logger.log(p_msg          => l_msg,
3105                    x_returnStatus => l_returnStatus);
3106   END IF;
3107 
3108   -- Repetitive Schedule
3109   INSERT INTO wip_move_transactions
3110          (transaction_id,
3111           last_updated_by,
3112           last_update_date,
3113           last_update_login,
3114           created_by,
3115           creation_date,
3116           request_id,
3117           program_application_id,
3118           program_id,
3119           program_update_date,
3120           group_id,
3121           source_code,
3122           source_line_id,
3123           organization_id,
3124           wip_entity_id,
3125           primary_item_id,
3126           line_id,
3127           transaction_date,
3128           acct_period_id,
3129           fm_operation_seq_num,
3130           fm_operation_code,
3131           fm_department_id,
3132           fm_intraoperation_step_type,
3133           to_operation_seq_num,
3134           to_operation_code,
3135           to_department_id,
3136           to_intraoperation_step_type,
3137           transaction_quantity,
3138           transaction_uom,
3139           primary_quantity,
3140           primary_uom,
3141           reason_id,
3142           reference,
3143           scrap_account_id,
3144           attribute_category,
3145           attribute1,
3146           attribute2,
3147           attribute3,
3148           attribute4,
3149           attribute5,
3150           attribute6,
3151           attribute7,
3152           attribute8,
3153           attribute9,
3154           attribute10,
3155           attribute11,
3156           attribute12,
3157           attribute13,
3158           attribute14,
3159           attribute15,
3160           qa_collection_id,
3161           overcompletion_transaction_qty,
3162           overcompletion_primary_qty,
3163           overcompletion_transaction_id
3164           )
3165           SELECT wmti.transaction_id,
3166                  wmti.last_updated_by,  -- last_updated_by --Fix for bug 5195072
3167                  SYSDATE,       -- last_update_date
3168                  DECODE(p_gib.login_id,
3169                    -1,NULL,p_gib.login_id), -- last_update_login
3170                  wmti.created_by,    -- created_by --Fix for bug 5195072
3171                  SYSDATE,       -- creation_date
3172                  DECODE(p_gib.request_id,-1,NULL,p_gib.request_id),
3173                  DECODE(p_gib.application_id,-1,NULL,p_gib.application_id),
3174                  DECODE(p_gib.program_id,-1,NULL,p_gib.program_id),
3175                  DECODE(p_gib.request_id,
3176                    -1,NULL,SYSDATE), -- program_update_date
3177                  p_gib.group_id,
3178                  wmti.source_code,
3179                  wmti.source_line_id,
3180                  wmti.organization_id,
3181                  wmti.wip_entity_id,
3182                  wmti.primary_item_id,
3183                  wmti.line_id,
3184                  wmti.transaction_date,
3185                  wmti.acct_period_id,
3186                  wmti.fm_operation_seq_num,
3187                  wmti.fm_operation_code,
3188                  wmti.fm_department_id,
3189                  wmti.fm_intraoperation_step_type,
3190                  wmti.to_operation_seq_num,
3191                  wmti.to_operation_code,
3192                  wmti.to_department_id,
3193                  wmti.to_intraoperation_step_type,
3194                  wmti.transaction_quantity,
3195                  wmti.transaction_uom,
3196                  wmti.primary_quantity,
3197                  wmti.primary_uom,
3198                  wmti.reason_id,
3199                  wmti.reference,
3200                  wmti.scrap_account_id,
3201                  wmti.attribute_category,
3202                  wmti.attribute1,
3203                  wmti.attribute2,
3204                  wmti.attribute3,
3205                  wmti.attribute4,
3206                  wmti.attribute5,
3207                  wmti.attribute6,
3208                  wmti.attribute7,
3209                  wmti.attribute8,
3210                  wmti.attribute9,
3211                  wmti.attribute10,
3212                  wmti.attribute11,
3213                  wmti.attribute12,
3214                  wmti.attribute13,
3215                  wmti.attribute14,
3216                  wmti.attribute15,
3217                  wmti.qa_collection_id,
3218                  wmti.overcompletion_transaction_qty,
3219                  wmti.overcompletion_primary_qty,
3220                  wmti.overcompletion_transaction_id
3221             FROM wip_move_txn_interface wmti
3222            WHERE wmti.group_id = p_gib.group_id
3223              AND TRUNC(wmti.transaction_date) = TRUNC(p_gib.txn_date)
3224              AND wmti.process_phase = WIP_CONSTANTS.MOVE_PROC
3225              AND wmti.process_status = WIP_CONSTANTS.RUNNING
3226              AND wmti.entity_type = WIP_CONSTANTS.REPETITIVE;
3227 
3228   -- IF debug message level = 2, write statement below to log file
3229   IF (l_logLevel <= wip_constants.full_logging) THEN
3230     fnd_message.set_name('WIP', 'WIP_INSERTED_ROWS');
3231     fnd_message.set_token('ENTITY1', SQL%ROWCOUNT);
3232     fnd_message.set_token('ENTITY2', 'WIP_MOVE_TRANSACTIONS');
3233     l_msg := fnd_message.get;
3234     wip_logger.log(p_msg          => l_msg,
3235                    x_returnStatus => l_returnStatus);
3236   END IF;
3237 
3238   x_returnStatus := fnd_api.g_ret_sts_success;
3239 
3240   -- write to the log file
3241   IF (l_logLevel <= wip_constants.trace_logging) THEN
3242     wip_logger.exitPoint(p_procName => 'wip_movProc_priv.insert_txn_history',
3243                          p_procReturnStatus => x_returnStatus,
3244                          p_msg => 'procedure complete',
3245                          x_returnStatus => l_returnStatus);
3246   END IF;
3247 
3248 EXCEPTION
3249   WHEN others THEN
3250     x_returnStatus := fnd_api.g_ret_sts_unexp_error;
3251     l_errMsg := 'unexpected error: ' || SQLERRM || 'SQLCODE = ' || SQLCODE;
3252 
3253     IF (l_logLevel <= wip_constants.trace_logging) THEN
3254       wip_logger.exitPoint(p_procName => 'wip_movProc_priv.insert_txn_history',
3255                            p_procReturnStatus => x_returnStatus,
3256                            p_msg => l_errMsg,
3257                            x_returnStatus => l_returnStatus);
3258     END IF;
3259     fnd_message.set_name('FND', 'FND_GENERIC_MESSAGE');
3260     fnd_message.set_token('MESSAGE', l_errMsg);
3261     fnd_msg_pub.add;
3262 END insert_txn_history;
3263 
3264 /*****************************************************************************
3265  * This procedure is equivalent to witoc_delete_child in wiltps5.ppc
3266  * This procedure is used to delete child record from WIP_MOVE_TXN_INTERFACE
3267  * table where the child rows have fm_op and to_op to be the first operation
3268  * and the step types to be Queue
3269  ****************************************************************************/
3270 PROCEDURE delete_child_txn(p_gib           IN        group_rec_t,
3271                            x_returnStatus OUT NOCOPY VARCHAR2) IS
3272 
3273 l_params       wip_logger.param_tbl_t;
3274 l_returnStatus VARCHAR(1);
3275 l_errMsg       VARCHAR2(240);
3276 l_outcome      NUMBER := -1;
3277 l_logLevel     NUMBER := fnd_log.g_current_runtime_level;
3278 
3279 BEGIN
3280   -- write parameter value to log file
3281   IF (l_logLevel <= wip_constants.trace_logging) THEN
3282     l_params(1).paramName   := 'p_group_id';
3283     l_params(1).paramValue  :=  p_gib.group_id;
3284     l_params(2).paramName   := 'p_txn_date';
3285     l_params(2).paramValue  :=  p_gib.txn_date;
3286     wip_logger.entryPoint(p_procName => 'wip_movProc_priv.delete_child_txn',
3287                           p_params => l_params,
3288                           x_returnStatus => l_returnStatus);
3289   END IF;
3290 
3291   -- delete child records from WIP
3292   DELETE FROM wip_move_txn_interface wmti
3293          WHERE wmti.group_id = p_gib.group_id
3294            AND TRUNC(wmti.transaction_date) = TRUNC(p_gib.txn_date)
3295            AND wmti.process_phase = WIP_CONSTANTS.MOVE_PROC
3296            AND wmti.process_status = WIP_CONSTANTS.RUNNING
3297            AND wmti.overcompletion_transaction_id IS NOT NULL
3298            AND wmti.overcompletion_primary_qty IS NULL
3299            AND wmti.fm_operation_seq_num = wmti.to_operation_seq_num
3300            AND wmti.fm_intraoperation_step_type =
3301                wmti.to_intraoperation_step_type
3302            AND wmti.fm_intraoperation_step_type = WIP_CONSTANTS.QUEUE;
3303 
3304   x_returnStatus := fnd_api.g_ret_sts_success;
3305 
3306   -- write to the log file
3307   IF (l_logLevel <= wip_constants.trace_logging) THEN
3308     wip_logger.exitPoint(p_procName => 'wip_movProc_priv.delete_child_txn',
3309                          p_procReturnStatus => x_returnStatus,
3310                          p_msg => 'procedure complete',
3311                          x_returnStatus => l_returnStatus);
3312   END IF;
3313 
3314 EXCEPTION
3315   WHEN others THEN
3316     x_returnStatus := fnd_api.g_ret_sts_unexp_error;
3317     l_errMsg := 'unexpected error: ' || SQLERRM || 'SQLCODE = ' || SQLCODE;
3318     IF (l_logLevel <= wip_constants.trace_logging) THEN
3319       wip_logger.exitPoint(p_procName => 'wip_movProc_priv.delete_child_txn',
3320                            p_procReturnStatus => x_returnStatus,
3321                            p_msg => l_errMsg,
3322                            x_returnStatus => l_returnStatus);
3323     END IF;
3324     fnd_message.set_name('FND', 'FND_GENERIC_MESSAGE');
3325     fnd_message.set_token('MESSAGE', l_errMsg);
3326     fnd_msg_pub.add;
3327 END delete_child_txn;
3328 
3329 /*****************************************************************************
3330  * This procedure is equivalent to witpsar_auto_resources in wiltps2.ppc
3331  * This procedure is used to insert auto-resources associated with move txn
3332  * This procedure insert the record into WIP_COST_TXN_INTERFACE and
3333  * WIP_TXN_ALLOCATIONS IF needed
3334  ****************************************************************************/
3335 PROCEDURE insert_auto_resource(p_gib           IN        group_rec_t,
3336                                x_returnStatus OUT NOCOPY VARCHAR2) IS
3337 
3338 l_params       wip_logger.param_tbl_t;
3339 l_returnStatus VARCHAR(1);
3340 l_msg          VARCHAR(240);
3341 l_errMsg       VARCHAR2(240);
3342 l_move         move_profile_rec_t;
3343 l_logLevel     NUMBER := fnd_log.g_current_runtime_level;
3344 
3345 BEGIN
3346   l_move := p_gib.move_profile;
3347 
3348   -- write parameter value to log file
3349   IF (l_logLevel <= wip_constants.trace_logging) THEN
3350     l_params(1).paramName   := 'p_group_id';
3351     l_params(1).paramValue  :=  p_gib.group_id;
3352     l_params(2).paramName   := 'p_txn_date';
3353     l_params(2).paramValue  :=  p_gib.txn_date;
3354     l_params(3).paramName   := 'org_id';
3355     l_params(3).paramValue  :=  l_move.org_id;
3356     l_params(4).paramName   := 'wip_id';
3357     l_params(4).paramValue  :=  l_move.wip_id;
3358     l_params(5).paramName   := 'fmOp';
3359     l_params(5).paramValue  :=  l_move.fmOp;
3360     l_params(6).paramName   := 'fmStep';
3361     l_params(6).paramValue  :=  l_move.fmStep;
3362     l_params(7).paramName   := 'toOp';
3363     l_params(7).paramValue  :=  l_move.toOp;
3364     l_params(8).paramName   := 'toStep';
3365     l_params(8).paramValue  :=  l_move.toStep;
3366     l_params(9).paramName   := 'scrapTxn';
3367     l_params(9).paramValue  :=  l_move.scrapTxn;
3368     l_params(10).paramName  := 'easyComplete';
3369     l_params(10).paramValue :=  l_move.easyComplete;
3370     l_params(11).paramName  := 'easyReturn';
3371     l_params(11).paramValue :=  l_move.easyReturn;
3372     l_params(12).paramName  := 'jobTxn';
3373     l_params(12).paramValue :=  l_move.jobTxn;
3374     l_params(13).paramName  := 'scheTxn';
3375     l_params(13).paramValue :=  l_move.scheTxn;
3376     l_params(14).paramName  := 'rsrcItem';
3377     l_params(14).paramValue :=  l_move.rsrcItem;
3378     l_params(15).paramName  := 'rsrcLot';
3379     l_params(15).paramValue :=  l_move.rsrcLot;
3380     l_params(16).paramName  := 'poReqItem';
3381     l_params(16).paramValue :=  l_move.poReqItem;
3382     l_params(17).paramName  := 'poRegLot';
3383     l_params(17).paramValue :=  l_move.poReqLot;
3384     wip_logger.entryPoint(p_procName =>'wip_movProc_priv.insert_auto_resource',
3385                           p_params => l_params,
3386                           x_returnStatus => l_returnStatus);
3387   END IF;
3388 
3389   -- Per item basis type for discrete jobs
3390   IF(l_move.jobTxn = WIP_CONSTANTS.YES AND
3391      l_move.rsrcItem = WIP_CONSTANTS.YES) THEN
3392     /* Fix for bug 4036149: Added leading hint to drive from the table
3393      wip_move_txn_interface to improve performance */
3394     INSERT INTO wip_cost_txn_interface
3395       (transaction_id,
3396        last_update_date,
3397        last_updated_by,
3398        last_updated_by_name,
3399        creation_date,
3400        created_by,
3401        created_by_name,
3402        last_update_login,
3403        request_id,
3404        program_application_id,
3405        program_id,
3406        program_update_date,
3407        group_id,
3408        source_code,
3409        source_line_id,
3410        process_phase,
3411        process_status,
3412        transaction_type,
3413        organization_id,
3414        organization_code,
3415        wip_entity_id,
3416        entity_type,
3417        primary_item_id,
3418        line_id,
3419        line_code,
3420        transaction_date,
3421        acct_period_id,
3422        operation_seq_num,
3423        department_id,
3424        department_code,
3425        employee_id,
3426        resource_seq_num,
3427        resource_id,
3428        resource_code,
3429        phantom_flag,
3430        usage_rate_or_amount,
3431        basis_type,
3432        autocharge_type,
3433        standard_rate_flag,
3434        transaction_quantity,
3435        transaction_uom,
3436        primary_quantity,
3437        primary_uom,
3438        actual_resource_rate,
3439        activity_id,
3440        activity_name,
3441        reason_id,
3442        reason_name,
3443        reference,
3444        move_transaction_id,
3445        po_header_id,
3446        po_line_id,
3447        repetitive_schedule_id,
3448        project_id,
3449        task_id
3450        )
3451        SELECT /*+ leading(wmti) */
3452               NULL,                     -- transaction_id
3453               SYSDATE,                  -- last_update_date
3454               wmti.last_updated_by,      -- last_updated_by --Fix for bug 5195072
3455               wmti.last_updated_by_name, -- last_updated_by_name --fix for bug 5195072
3456               SYSDATE,                  -- creation_date
3457               wmti.created_by,           -- created_by --Fix for bug 5195072
3458               wmti.created_by_name,      -- created_by_name --Fix for bug 5195072
3459               DECODE(p_gib.login_id,-1,NULL,p_gib.login_id),
3460               DECODE(p_gib.request_id,-1,NULL,p_gib.request_id),
3461               DECODE(p_gib.application_id,-1,NULL,p_gib.application_id),
3462               DECODE(p_gib.program_id,-1,NULL,p_gib.program_id),
3463               DECODE(p_gib.request_id,-1,NULL,SYSDATE),  -- program_update_date
3464               p_gib.group_id,
3465               wmti.source_code,
3466               wmti.source_line_id,
3467               WIP_CONSTANTS.RES_PROC,   -- process_phase
3468               WIP_CONSTANTS.PENDING,    -- process_status
3469               WIP_CONSTANTS.RES_TXN,    -- transaction_type
3470               wmti.organization_id,
3471               wmti.organization_code,
3472               wmti.wip_entity_id,
3473               wmti.entity_type,
3474               wmti.primary_item_id,
3475               wmti.line_id,
3476               wmti.line_code,
3477               wmti.transaction_date,
3478               wmti.acct_period_id,
3479               wop.operation_seq_num,
3480               NVL(wor.department_id, wop.department_id),
3481               bd.department_code,
3482               NULL,                      -- employee_id
3483               wor.resource_seq_num,
3484               wor.resource_id,
3485               br.resource_code,
3486               wor.phantom_flag,
3487               wor.usage_rate_or_amount,
3488               wor.basis_type,
3489               wor.autocharge_type,
3490               wor.standard_rate_flag,
3491               wor.usage_rate_or_amount * NVL(wmti.primary_quantity *
3492                 DECODE(
3493                   SIGN(wmti.to_operation_seq_num - wmti.fm_operation_seq_num),
3494                   0,DECODE(SIGN(wmti.fm_intraoperation_step_type -
3495                                 WIP_CONSTANTS.RUN),
3496                     0,DECODE(SIGN(wmti.to_intraoperation_step_type -
3497                                   WIP_CONSTANTS.RUN),1,1,-1),
3498                    -1,DECODE(SIGN(wmti.to_intraoperation_step_type -
3499                                   WIP_CONSTANTS.RUN),1,1,-1),
3500                     1,-1),
3501                   1, 1,
3502                  -1,-1),
3503                 0),                      -- transaction_quantity
3504               wor.uom_code,              -- transaction_uom
3505               wor.usage_rate_or_amount * NVL(wmti.primary_quantity *
3506                 DECODE(
3507                   SIGN(wmti.to_operation_seq_num - wmti.fm_operation_seq_num),
3508                   0,DECODE(SIGN(wmti.fm_intraoperation_step_type -
3509                                 WIP_CONSTANTS.RUN),
3510                     0,DECODE(SIGN(wmti.to_intraoperation_step_type -
3511                                   WIP_CONSTANTS.RUN),1,1,-1),
3512                    -1,DECODE(SIGN(wmti.to_intraoperation_step_type -
3513                                   WIP_CONSTANTS.RUN),1,1,-1),
3514                     1,-1),
3515                   1, 1,
3516                  -1,-1),
3517                 0),                      -- primary_quantity
3518               wor.uom_code,              -- primary_uom
3519               NULL,                      -- actual_resource_rate
3520               wor.activity_id,
3521               ca.activity,               -- activity_name
3522               wmti.reason_id,
3523               wmti.reason_name,
3524               wmti.reference,
3525               wmti.transaction_id,        -- move_transaction_id
3526               NULL,                      -- po_header_id
3527               NULL,                      -- po_line_id
3528               NULL,                      -- repetitive_schedule_id
3529               wdj.project_id,
3530               wdj.task_id
3531          FROM bom_departments bd,
3532               bom_resources br,
3533               cst_activities ca,
3534               wip_operation_resources wor,
3535               wip_discrete_jobs wdj,
3536               wip_operations wop,
3537               wip_move_txn_interface wmti
3538         WHERE wmti.group_id = p_gib.group_id
3539           AND TRUNC(wmti.transaction_date) = TRUNC(p_gib.txn_date)
3540           AND wmti.process_phase = WIP_CONSTANTS.MOVE_PROC
3541           AND wmti.process_status = WIP_CONSTANTS.RUNNING
3542           AND (wmti.entity_type = WIP_CONSTANTS.DISCRETE
3543                OR wmti.entity_type = WIP_CONSTANTS.LOTBASED) /* WSM */
3544           AND wop.organization_id = wmti.organization_id
3545           AND wop.wip_entity_id = wmti.wip_entity_id
3546           AND wop.organization_id = wor.organization_id
3547           AND wop.wip_entity_id = wor.wip_entity_id
3548           AND wop.operation_seq_num = wor.operation_seq_num
3549           /* added for OSFM jump enhancement 2541431 */
3550           AND NVL(wop.skip_flag, WIP_CONSTANTS.NO) <> WIP_CONSTANTS.YES
3551           AND wor.autocharge_type = WIP_CONSTANTS.WIP_MOVE
3552           AND wor.basis_type = WIP_CONSTANTS.PER_ITEM
3553           AND wop.organization_id = bd.organization_id
3554           AND NVL(wor.department_id, wop.department_id) = bd.department_id
3555           AND wor.organization_id = br.organization_id
3556           AND wor.resource_id = br.resource_id
3557           AND wor.usage_rate_or_amount <> 0
3558           AND wor.activity_id = ca.activity_id (+)
3559           AND wdj.wip_entity_id = wmti.wip_entity_id
3560           AND wdj.organization_id = wmti.organization_id
3561           AND (
3562               (wop.operation_seq_num >= wmti.fm_operation_seq_num
3563                + DECODE(SIGN(wmti.fm_intraoperation_step_type -
3564                              WIP_CONSTANTS.RUN), 1,1,0)
3565               AND wop.operation_seq_num < wmti.to_operation_seq_num
3566                 + DECODE(SIGN(wmti.to_intraoperation_step_type -
3567                               WIP_CONSTANTS.RUN),1,1,0)
3568               AND (wmti.to_operation_seq_num > wmti.fm_operation_seq_num
3569                    OR (wmti.to_operation_seq_num = wmti.fm_operation_seq_num
3570                       AND wmti.fm_intraoperation_step_type <= WIP_CONSTANTS.RUN
3571                       AND wmti.to_intraoperation_step_type > WIP_CONSTANTS.RUN))
3572               AND (wop.count_point_type < WIP_CONSTANTS.NO_MANUAL
3573                    OR wop.operation_seq_num = wmti.fm_operation_seq_num
3574                    OR (wop.operation_seq_num = wmti.to_operation_seq_num
3575                        AND wmti.to_intraoperation_step_type >
3576                            WIP_CONSTANTS.RUN)))
3577             OR
3578               (wop.operation_seq_num < wmti.fm_operation_seq_num
3579                + DECODE(SIGN(wmti.fm_intraoperation_step_type -
3580                              WIP_CONSTANTS.RUN),1,1,0)
3581               AND wop.operation_seq_num >= wmti.to_operation_seq_num
3582                + DECODE(SIGN(wmti.to_intraoperation_step_type -
3583                              WIP_CONSTANTS.RUN),1,1,0)
3584               AND (wmti.fm_operation_seq_num > wmti.to_operation_seq_num
3585                   OR (wmti.fm_operation_seq_num = wmti.to_operation_seq_num
3586                       AND wmti.to_intraoperation_step_type <= WIP_CONSTANTS.RUN
3587                       AND wmti.fm_intraoperation_step_type > WIP_CONSTANTS.RUN))
3588               AND (wop.count_point_type < WIP_CONSTANTS.NO_MANUAL
3589                   OR wop.operation_seq_num = wmti.to_operation_seq_num
3590                   OR (wop.operation_seq_num = wmti.fm_operation_seq_num
3591                       AND wmti.fm_intraoperation_step_type >
3592                           WIP_CONSTANTS.RUN)))
3593     );
3594 
3595     -- IF debug message level = 2, write statement below to log file
3596     IF (l_logLevel <= wip_constants.full_logging) THEN
3597       fnd_message.set_name('WIP', 'WIP_INSERTED_ROWS');
3598       fnd_message.set_token('ENTITY1', SQL%ROWCOUNT);
3599       fnd_message.set_token('ENTITY2', 'WIP_COST_TXN_INTERFACE');
3600       l_msg := fnd_message.get;
3601       wip_logger.log(p_msg          => l_msg,
3602                      x_returnStatus => l_returnStatus);
3603     END IF;
3604 
3605   END IF; -- Per item basis type for discrete jobs
3606 
3607   -- Per item basis type for repetitive schedule
3608   IF(l_move.scheTxn = WIP_CONSTANTS.YES AND
3609      l_move.rsrcItem = WIP_CONSTANTS.YES) THEN
3610 
3611     INSERT INTO wip_cost_txn_interface
3612       (transaction_id,
3613        last_update_date,
3614        last_updated_by,
3615        last_updated_by_name,
3616        creation_date,
3617        created_by,
3618        created_by_name,
3619        last_update_login,
3620        request_id,
3621        program_application_id,
3622        program_id,
3623        program_update_date,
3624        group_id,
3625        source_code,
3626        source_line_id,
3627        process_phase,
3628        process_status,
3629        transaction_type,
3630        organization_id,
3631        organization_code,
3632        wip_entity_id,
3633        entity_type,
3634        primary_item_id,
3635        line_id,
3636        line_code,
3637        transaction_date,
3638        acct_period_id,
3639        operation_seq_num,
3640        department_id,
3641        department_code,
3642        employee_id,
3643        resource_seq_num,
3644        resource_id,
3645        resource_code,
3646        phantom_flag,
3647        usage_rate_or_amount,
3648        basis_type,
3649        autocharge_type,
3650        standard_rate_flag,
3651        transaction_quantity,
3652        transaction_uom,
3653        primary_quantity,
3654        primary_uom,
3655        actual_resource_rate,
3656        activity_id,
3657        activity_name,
3658        reason_id,
3659        reason_name,
3660        reference,
3661        move_transaction_id,
3662        po_header_id,
3663        po_line_id,
3664        repetitive_schedule_id
3665        )
3666        SELECT NULL,                          -- transaction_id
3667               SYSDATE,                       -- last_update_date
3668               MAX(wmti.last_updated_by),      -- last_updated_by --Fix for bug 5195072
3669               MAX(wmti.last_updated_by_name), -- last_updated_by_name --Fix for bug 5195072
3670               SYSDATE,                       -- creation_date
3671               MAX(wmti.created_by),           -- created_by -- Fix for bug 5195072
3672               MAX(wmti.created_by_name),      -- created_by_name --Fix for bug 5195072
3673               DECODE(p_gib.login_id,-1,NULL,p_gib.login_id),
3674               DECODE(p_gib.request_id,-1,NULL,p_gib.request_id),
3675               DECODE(p_gib.application_id,-1,NULL,p_gib.application_id),
3676               DECODE(p_gib.program_id,-1,NULL,p_gib.program_id),
3677               DECODE(p_gib.request_id,-1,NULL,SYSDATE), -- program_update_date
3678               p_gib.group_id,
3679               MAX(wmti.source_code),
3680               MAX(wmti.source_line_id),
3681               WIP_CONSTANTS.RES_PROC,        -- process_phase
3682               WIP_CONSTANTS.PENDING,         -- process_status
3683               WIP_CONSTANTS.RES_TXN,         -- transaction_type
3684               wmti.organization_id,
3685               MAX(wmti.organization_code),
3686               wmti.wip_entity_id,
3687               MAX(wmti.entity_type),
3688               MAX(wmti.primary_item_id),
3689               wmti.line_id,
3690               MAX(wmti.line_code),
3691               MAX(wmti.transaction_date),
3692               MAX(wmti.acct_period_id),
3693               wop.operation_seq_num,
3694               NVL(MAX(wor.department_id), MAX(wop.department_id)),
3695               MAX(bd.department_code),
3696               NULL,                           -- employee_id
3697               wor.resource_seq_num,
3698               wor.resource_id,
3699               MAX(br.resource_code),
3700               MAX(wor.phantom_flag),
3701               wor.usage_rate_or_amount,
3702               MAX(wor.basis_type),
3703               MAX(wor.autocharge_type),
3704               wor.standard_rate_flag,
3705               SUM(wor.usage_rate_or_amount * NVL(wma.primary_quantity *
3706                 DECODE(
3707                   SIGN(wmti.to_operation_seq_num-wmti.fm_operation_seq_num),
3708                   0, DECODE(SIGN(wmti.fm_intraoperation_step_type -
3709                                  WIP_CONSTANTS.RUN),
3710                     0,DECODE(SIGN(wmti.to_intraoperation_step_type -
3711                                   WIP_CONSTANTS.RUN),1,1,-1),
3712                    -1,DECODE(SIGN(wmti.to_intraoperation_step_type -
3713                                   WIP_CONSTANTS.RUN),1,1,-1),
3714                     1,-1),
3715                   1, 1,
3716                  -1,-1)
3717                 ,0)),                       -- transaction_quantity
3718               MAX(wor.uom_code),            -- transaction_uom
3719               SUM(wor.usage_rate_or_amount * NVL(wma.primary_quantity *
3720                 DECODE(
3721                   SIGN(wmti.to_operation_seq_num-wmti.fm_operation_seq_num),
3722                   0, DECODE(SIGN(wmti.fm_intraoperation_step_type -
3723                                  WIP_CONSTANTS.RUN),
3724                     0,DECODE(SIGN(wmti.to_intraoperation_step_type -
3725                                   WIP_CONSTANTS.RUN),1,1,-1),
3726                    -1,DECODE(SIGN(wmti.to_intraoperation_step_type -
3727                                   WIP_CONSTANTS.RUN),1,1,-1),
3728                     1,-1),
3729                   1, 1,
3730                  -1,-1)
3731                 ,0)),                        -- primary_quantity
3732               MAX(wor.uom_code),             -- primary_uom
3733               NULL,                          -- acutual_resource_rate
3734               wor.activity_id,
3735               MAX(ca.activity),              -- activity_name
3736               MAX(wmti.reason_id),
3737               MAX(wmti.reason_name),
3738               MAX(wmti.reference),
3739               MAX(wmti.transaction_id),       -- move_transaction_id
3740               NULL,                          -- po_header_id
3741               NULL,                          -- po_line_id
3742               NULL                           -- repetitive_schedule_id
3743          FROM bom_departments bd,
3744               bom_resources br,
3745               cst_activities ca,
3746               wip_operation_resources wor,
3747               wip_move_txn_allocations wma,
3748               wip_operations wop,
3749               wip_move_txn_interface wmti
3750         WHERE wmti.group_id = p_gib.group_id
3751           AND TRUNC(wmti.transaction_date) = TRUNC(p_gib.txn_date)
3752           AND wmti.process_phase = WIP_CONSTANTS.MOVE_PROC
3753           AND wmti.process_status = WIP_CONSTANTS.RUNNING
3754           AND wmti.entity_type = WIP_CONSTANTS.REPETITIVE
3755           AND wop.organization_id = wmti.organization_id
3756           AND wop.wip_entity_id = wmti.wip_entity_id
3757           AND wop.wip_entity_id = wor.wip_entity_id
3758           AND wop.operation_seq_num = wor.operation_seq_num
3759           AND wop.organization_id = wor.organization_id
3760           AND wop.repetitive_schedule_id = wma.repetitive_schedule_id
3761           AND wor.repetitive_schedule_id = wma.repetitive_schedule_id
3762           AND wmti.organization_id = wma.organization_id
3763           AND wmti.transaction_id = wma.transaction_id
3764           AND wor.autocharge_type = WIP_CONSTANTS.WIP_MOVE
3765           AND wor.basis_type = WIP_CONSTANTS.PER_ITEM
3766           AND wop.organization_id = bd.organization_id
3767           AND NVL(wor.department_id, wop.department_id) = bd.department_id
3768           AND wor.organization_id = br.organization_id
3769           AND wor.resource_id = br.resource_id
3770           AND wor.usage_rate_or_amount <> 0
3771           AND wor.activity_id = ca.activity_id (+)
3772           AND (
3773               (wop.operation_seq_num >= wmti.fm_operation_seq_num
3774               + DECODE(SIGN(wmti.fm_intraoperation_step_type -
3775                             WIP_CONSTANTS.RUN),1,1,0)
3776               AND wop.operation_seq_num < wmti.to_operation_seq_num
3777               + DECODE(SIGN(wmti.to_intraoperation_step_type -
3778                             WIP_CONSTANTS.RUN),1,1,0)
3779               AND (wmti.to_operation_seq_num > wmti.fm_operation_seq_num
3780                    OR (wmti.to_operation_seq_num = wmti.fm_operation_seq_num
3781                       AND wmti.fm_intraoperation_step_type <= WIP_CONSTANTS.RUN
3782                       AND wmti.to_intraoperation_step_type > WIP_CONSTANTS.RUN))
3783               AND (wop.count_point_type < WIP_CONSTANTS.NO_MANUAL
3784                    OR wop.operation_seq_num = wmti.fm_operation_seq_num
3785                    OR (wop.operation_seq_num = wmti.to_operation_seq_num
3786                        AND wmti.to_intraoperation_step_type >
3787                            WIP_CONSTANTS.RUN)))
3788             OR
3789               (wop.operation_seq_num < wmti.fm_operation_seq_num
3790               + DECODE(SIGN(wmti.fm_intraoperation_step_type -
3791                             WIP_CONSTANTS.RUN),1,1,0)
3792               AND wop.operation_seq_num >= wmti.to_operation_seq_num
3793               + DECODE(SIGN(wmti.to_intraoperation_step_type -
3794                             WIP_CONSTANTS.RUN),1,1,0)
3795               AND (wmti.fm_operation_seq_num > wmti.to_operation_seq_num
3796                   OR (wmti.fm_operation_seq_num = wmti.to_operation_seq_num
3797                       AND wmti.to_intraoperation_step_type <= WIP_CONSTANTS.RUN
3798                       AND wmti.fm_intraoperation_step_type > WIP_CONSTANTS.RUN))
3799               AND (wop.count_point_type < WIP_CONSTANTS.NO_MANUAL
3800                   OR wop.operation_seq_num = wmti.to_operation_seq_num
3801                   OR (wop.operation_seq_num = wmti.fm_operation_seq_num
3802                       AND wmti.fm_intraoperation_step_type >
3803                           WIP_CONSTANTS.RUN))))
3804      GROUP BY wmti.organization_id,
3805               wmti.wip_entity_id,
3806               wmti.line_id,
3807               wop.operation_seq_num,
3808               wor.resource_seq_num,
3809               wor.resource_id,
3810               wor.activity_id,
3811               wor.standard_rate_flag,
3812               wor.usage_rate_or_amount,
3813               wmti.transaction_id;
3814 
3815     -- IF debug message level = 2, write statement below to log file
3816     IF (l_logLevel <= wip_constants.full_logging) THEN
3817       fnd_message.set_name('WIP', 'WIP_INSERTED_ROWS');
3818       fnd_message.set_token('ENTITY1', SQL%ROWCOUNT);
3819       fnd_message.set_token('ENTITY2', 'WIP_COST_TXN_INTERFACE');
3820       l_msg := fnd_message.get;
3821       wip_logger.log(p_msg          => l_msg,
3822                      x_returnStatus => l_returnStatus);
3823     END IF;
3824 
3825   END IF;  -- Per item basis type for repetitive schedule
3826 
3827    /*------------------------------------------------------------+
3828    |  Per order basis type for discrete jobs
3829       department_id cannot be changed so we can take the MAX,
3830       also columns such as usage_rate_or_amount are not part of
3831       the transaction they are looked up in wip_operation_resources
3832    +------------------------------------------------------------*/
3833   IF(l_move.jobTxn = WIP_CONSTANTS.YES AND
3834      l_move.rsrcLot = WIP_CONSTANTS.YES) THEN
3835 
3836     INSERT INTO wip_cost_txn_interface
3837       (transaction_id,
3838        last_update_date,
3839        last_updated_by,
3840        last_updated_by_name,
3841        creation_date,
3842        created_by,
3843        created_by_name,
3844        last_update_login,
3845        request_id,
3846        program_application_id,
3847        program_id,
3848        program_update_date,
3849        group_id,
3850        source_code,
3851        source_line_id,
3852        process_phase,
3853        process_status,
3854        transaction_type,
3855        organization_id,
3856        organization_code,
3857        wip_entity_id,
3858        entity_type,
3859        primary_item_id,
3860        line_id,
3861        line_code,
3862        transaction_date,
3863        acct_period_id,
3864        operation_seq_num,
3865        department_id,
3866        department_code,
3867        employee_id,
3868        resource_seq_num,
3869        resource_id,
3870        resource_code,
3871        phantom_flag,
3872        usage_rate_or_amount,
3873        basis_type,
3874        autocharge_type,
3875        standard_rate_flag,
3876        transaction_quantity,
3877        transaction_uom,
3878        primary_quantity,
3879        primary_uom,
3880        actual_resource_rate,
3881        activity_id,
3882        activity_name,
3883        reason_id,
3884        reason_name,
3885        reference,
3886        move_transaction_id,
3887        po_header_id,
3888        po_line_id,
3889        repetitive_schedule_id,
3890        project_id,
3891        task_id
3892        )
3893        SELECT NULL,                          -- transaction_id
3894               SYSDATE,                       -- last_update_date
3895               MAX(wmti.last_updated_by),      -- last_updated_by --Fix for bug 5195072
3896               MAX(wmti.last_updated_by_name), -- last_updated_by_name --Fix for bug 5195072
3897               SYSDATE,                       -- creation_date
3898               MAX(wmti.created_by),           -- created_by --Fix for bug 5195072
3899               MAX(wmti.created_by_name),      -- created_by_name --Fix for bug 5195072
3900               DECODE(p_gib.login_id,-1,NULL,p_gib.login_id),
3901               DECODE(p_gib.request_id,-1,NULL,p_gib.request_id),
3902               DECODE(p_gib.application_id,-1,NULL,p_gib.application_id),
3903               DECODE(p_gib.program_id,-1,NULL,p_gib.program_id),
3904               DECODE(p_gib.request_id,-1,NULL,SYSDATE), -- program_update_date
3905               p_gib.group_id,
3906               MAX(wmti.source_code),          -- source_code
3907               -- Fixed bug 2465148
3908               MAX(wmti.source_line_id),       -- source_line_id
3909               WIP_CONSTANTS.RES_PROC,        -- process_phase
3910               WIP_CONSTANTS.PENDING,         -- process_status
3911               WIP_CONSTANTS.RES_TXN,         -- transaction_type
3912               wop.organization_id,
3913               MAX(wmti.organization_code),
3914               wop.wip_entity_id,
3915               MAX(entity_type),
3916               MAX(wmti.primary_item_id),
3917               MAX(wmti.line_id),
3918               MAX(wmti.line_code),
3919               MAX(wmti.transaction_date),
3920               MAX(wmti.acct_period_id),
3921               wop.operation_seq_num,
3922               NVL(MAX(wor.department_id), MAX(wop.department_id)),
3923               MAX(bd.department_code),
3924               NULL,                          -- employee_id
3925               wor.resource_seq_num,
3926               MAX(wor.resource_id),
3927               MAX(br.resource_code),
3928               MAX(wor.phantom_flag),
3929               MAX(wor.usage_rate_or_amount),
3930               MAX(wor.basis_type),
3931               MAX(wor.autocharge_type),
3932               MAX(wor.standard_rate_flag),
3933               MAX(wor.usage_rate_or_amount) * -- transaction_quantity
3934                 DECODE(SIGN(MAX(wop.quantity_completed) +
3935                                 NVL(SUM(wmti.primary_quantity *
3936                   DECODE(SIGN(wmti.to_operation_seq_num -
3937                               wmti.fm_operation_seq_num),
3938                   0,DECODE(SIGN(wmti.fm_intraoperation_step_type -
3939                                   WIP_CONSTANTS.RUN),
3940                     0,DECODE(SIGN(wmti.to_intraoperation_step_type -
3941                                     WIP_CONSTANTS.RUN),1,1,-1),
3942                     -1,DECODE(SIGN(wmti.to_intraoperation_step_type -
3943                                     WIP_CONSTANTS.RUN),1,1,-1),
3944                     1,-1),
3945                   1, 1,
3946                  -1,-1)
3947                  ),0)),   -- NVL
3948                 0, DECODE(SIGN(MAX(wop.quantity_completed)),1,-1,0),
3949                 1, DECODE(SIGN(MAX(wop.quantity_completed)),1,0,1),
3950                -1, DECODE(SIGN(MAX(wop.quantity_completed)),1,-1,0)),
3951               MAX(wor.uom_code),              -- transaction_uom
3952               MAX(wor.usage_rate_or_amount) * -- primary_quantity
3953                 DECODE(SIGN(MAX(wop.quantity_completed) +
3954                                 NVL(SUM(wmti.primary_quantity *
3955                   DECODE(SIGN(wmti.to_operation_seq_num -
3956                               wmti.fm_operation_seq_num),
3957                   0,DECODE(SIGN(wmti.fm_intraoperation_step_type -
3958                                   WIP_CONSTANTS.RUN),
3959                     0,DECODE(SIGN(wmti.to_intraoperation_step_type -
3960                                     WIP_CONSTANTS.RUN),1,1,-1),
3961                     -1,DECODE(SIGN(wmti.to_intraoperation_step_type -
3962                                     WIP_CONSTANTS.RUN),1,1,-1),
3963                     1,-1),
3964                   1, 1,
3965                  -1,-1)
3966                  ),0)),   -- NVL
3967                 0, DECODE(SIGN(MAX(wop.quantity_completed)),1,-1,0),
3968                 1, DECODE(SIGN(MAX(wop.quantity_completed)),1,0,1),
3969                -1, DECODE(SIGN(MAX(wop.quantity_completed)),1,-1,0)),
3970               MAX(wor.uom_code),               -- primary_uom
3971               NULL,                            -- actual_resource_rate
3972               MAX(wor.activity_id),
3973               MAX(ca.activity),                -- activity_name
3974               NULL,                            -- reason_id
3975               NULL,                            -- reason_name
3976               -- Fixed bug 2506653
3977               MAX(wmti.reference),              -- reference
3978               MAX(wmti.transaction_id),         -- move_transaction_id
3979               NULL,                            -- po_header_id
3980               NULL,                            -- po_line_id
3981               NULL,                            -- repetitive_schedule_id
3982               MAX(wdj.project_id),
3983               MAX(wdj.task_id)
3984          FROM bom_departments bd,
3985               bom_resources br,
3986               cst_activities ca,
3987               wip_operation_resources wor,
3988               wip_discrete_jobs wdj,
3989               wip_operations wop,
3990               wip_move_txn_interface wmti
3991         WHERE wmti.group_id = p_gib.group_id
3992           AND TRUNC(wmti.transaction_date) = TRUNC(p_gib.txn_date)
3993           AND wmti.process_phase = WIP_CONSTANTS.MOVE_PROC
3994           AND wmti.process_status = WIP_CONSTANTS.RUNNING
3995           AND (wmti.entity_type = WIP_CONSTANTS.DISCRETE
3996                OR wmti.entity_type = WIP_CONSTANTS.LOTBASED) /* WSM */
3997           AND wop.organization_id = wmti.organization_id
3998           AND wop.wip_entity_id = wmti.wip_entity_id
3999           AND wop.wip_entity_id = wor.wip_entity_id
4000           AND wop.operation_seq_num = wor.operation_seq_num
4001           /* added for OSFM jump enhancement 2541431 */
4002           AND NVL(wop.skip_flag, WIP_CONSTANTS.NO) <> WIP_CONSTANTS.YES
4003           AND wop.organization_id = wor.organization_id
4004           AND wor.autocharge_type = WIP_CONSTANTS.WIP_MOVE
4005           AND wor.basis_type = WIP_CONSTANTS.PER_LOT
4006           AND wop.organization_id = bd.organization_id
4007           AND NVL(wor.department_id, wop.department_id) = bd.department_id
4008           AND wor.organization_id = br.organization_id
4009           AND wor.resource_id = br.resource_id
4010           AND wor.usage_rate_or_amount <> 0
4011           AND wor.activity_id = ca.activity_id (+)
4012           AND wdj.wip_entity_id = wmti.wip_entity_id
4013           AND wdj.organization_id = wmti.organization_id
4014           AND (
4015               (wop.operation_seq_num >= wmti.fm_operation_seq_num
4016               + DECODE(SIGN(wmti.fm_intraoperation_step_type -
4017                             WIP_CONSTANTS.RUN),1,1,0)
4018               AND wop.operation_seq_num < wmti.to_operation_seq_num
4019               + DECODE(SIGN(wmti.to_intraoperation_step_type -
4020                             WIP_CONSTANTS.RUN),1,1,0)
4021               AND (wmti.to_operation_seq_num > wmti.fm_operation_seq_num
4022                    OR (wmti.to_operation_seq_num = wmti.fm_operation_seq_num
4023                       AND wmti.fm_intraoperation_step_type <= WIP_CONSTANTS.RUN
4024                       AND wmti.to_intraoperation_step_type > WIP_CONSTANTS.RUN))
4025               AND (wop.count_point_type < WIP_CONSTANTS.NO_MANUAL
4026                    OR wop.operation_seq_num = wmti.fm_operation_seq_num
4027                    OR (wop.operation_seq_num = wmti.to_operation_seq_num
4028                        AND wmti.to_intraoperation_step_type >
4029                            WIP_CONSTANTS.RUN)))
4030             OR
4031               (wop.operation_seq_num < wmti.fm_operation_seq_num
4032               + DECODE(SIGN(wmti.fm_intraoperation_step_type -
4033                             WIP_CONSTANTS.RUN),1,1,0)
4034               AND wop.operation_seq_num >= wmti.to_operation_seq_num
4035               + DECODE(SIGN(wmti.to_intraoperation_step_type -
4036                             WIP_CONSTANTS.RUN),1,1,0)
4037               AND (wmti.fm_operation_seq_num > wmti.to_operation_seq_num
4038                   OR (wmti.fm_operation_seq_num = wmti.to_operation_seq_num
4039                       AND wmti.to_intraoperation_step_type <= WIP_CONSTANTS.RUN
4040                       AND wmti.fm_intraoperation_step_type > WIP_CONSTANTS.RUN))
4041               AND (wop.count_point_type < WIP_CONSTANTS.NO_MANUAL
4042                   OR wop.operation_seq_num = wmti.to_operation_seq_num
4043                   OR (wop.operation_seq_num = wmti.fm_operation_seq_num
4044                      AND wmti.fm_intraoperation_step_type >
4045                          WIP_CONSTANTS.RUN))))
4046      GROUP BY wop.organization_id,
4047               wop.wip_entity_id,
4048               wop.operation_seq_num,
4049               wor.resource_seq_num
4050        HAVING 0 <>
4051               DECODE(SIGN(MAX(wop.quantity_completed) +
4052                               NVL(SUM(wmti.primary_quantity *
4053                 DECODE(SIGN(wmti.to_operation_seq_num -
4054                             wmti.fm_operation_seq_num),
4055                 0,DECODE(SIGN(wmti.fm_intraoperation_step_type -
4056                               WIP_CONSTANTS.RUN),
4057                   0,DECODE(SIGN(wmti.to_intraoperation_step_type -
4058                                 WIP_CONSTANTS.RUN),1,1,-1),
4059                  -1,DECODE(SIGN(wmti.to_intraoperation_step_type -
4060                                 WIP_CONSTANTS.RUN),1,1,-1),
4061                   1,-1),
4062                 1, 1,
4063                -1,-1)
4064                 ),0)),    -- NVL
4065               0, DECODE(SIGN(MAX(wop.quantity_completed)),1,-1,0),
4066               1, DECODE(SIGN(MAX(wop.quantity_completed)),1,0,1),
4067              -1, DECODE(SIGN(MAX(wop.quantity_completed)),1,-1,0));
4068 
4069     -- IF debug message level = 2, write statement below to log file
4070     IF (l_logLevel <= wip_constants.full_logging) THEN
4071       fnd_message.set_name('WIP', 'WIP_INSERTED_ROWS');
4072       fnd_message.set_token('ENTITY1', SQL%ROWCOUNT);
4073       fnd_message.set_token('ENTITY2', 'WIP_COST_TXN_INTERFACE');
4074       l_msg := fnd_message.get;
4075       wip_logger.log(p_msg          => l_msg,
4076                      x_returnStatus => l_returnStatus);
4077     END IF;
4078 
4079   END IF; -- Per order basis type for discrete jobs
4080 
4081   -- Per order basis type for repetitive
4082   IF(l_move.scheTxn = WIP_CONSTANTS.YES AND
4083      l_move.rsrcLot = WIP_CONSTANTS.YES) THEN
4084 
4085     INSERT INTO wip_cost_txn_interface
4086       (transaction_id,
4087        last_update_date,
4088        last_updated_by,
4089        last_updated_by_name,
4090        creation_date,
4091        created_by,
4092        created_by_name,
4093        last_update_login,
4094        request_id,
4095        program_application_id,
4096        program_id,
4097        program_update_date,
4098        group_id,
4099        source_code,
4100        source_line_id,
4101        process_phase,
4102        process_status,
4103        transaction_type,
4104        organization_id,
4105        organization_code,
4106        wip_entity_id,
4107        entity_type,
4108        primary_item_id,
4109        line_id,
4110        line_code,
4111        transaction_date,
4112        acct_period_id,
4113        operation_seq_num,
4114        department_id,
4115        department_code,
4116        employee_id,
4117        resource_seq_num,
4118        resource_id,
4119        resource_code,
4120        phantom_flag,
4121        usage_rate_or_amount,
4122        basis_type,
4123        autocharge_type,
4124        standard_rate_flag,
4125        transaction_quantity,
4126        transaction_uom,
4127        primary_quantity,
4128        primary_uom,
4129        actual_resource_rate,
4130        activity_id,
4131        activity_name,
4132        reason_id,
4133        reason_name,
4134        reference,
4135        move_transaction_id,
4136        po_header_id,
4137        po_line_id,
4138        repetitive_schedule_id
4139        )
4140        SELECT NULL,                          -- transaction_id
4141               SYSDATE,                       -- last_update_date
4142               MAX(wmti.last_updated_by),      -- last_updated_by --Fix for bug 5195072
4143               MAX(wmti.last_updated_by_name), -- last_updated_by_name --Fix for bug 5195072
4144               SYSDATE,                       -- creation_date
4145               MAX(wmti.created_by),           -- created_by --Fix for bug 5195072
4146               MAX(wmti.created_by_name),      -- created_by_name --Fix for bug 5195072
4147               DECODE(p_gib.login_id,-1,NULL,p_gib.login_id),
4148               DECODE(p_gib.request_id,-1,NULL,p_gib.request_id),
4149               DECODE(p_gib.application_id,-1,NULL,p_gib.application_id),
4150               DECODE(p_gib.program_id,-1,NULL,p_gib.program_id),
4151               DECODE(p_gib.request_id,-1,NULL,SYSDATE), -- program_update_date
4152               p_gib.group_id,
4153               MAX(wmti.source_code),          -- source_code
4154               -- Fixed bug 2465148
4155               MAX(wmti.source_line_id),       -- source_line_id
4156               WIP_CONSTANTS.RES_PROC,        -- process_phase
4157               WIP_CONSTANTS.PENDING,         -- process_status
4158               WIP_CONSTANTS.RES_TXN,         -- transaction_type
4159               wop.organization_id,
4160               MAX(wmti.organization_code),
4161               wop.wip_entity_id,
4162               MAX(entity_type),
4163               MAX(wmti.primary_item_id),
4164               wmti.line_id,
4165               MAX(wmti.line_code),
4166               MAX(wmti.transaction_date),
4167               MAX(wmti.acct_period_id),
4168               wop.operation_seq_num,
4169               NVL(MAX(wor.department_id), MAX(wop.department_id)),
4170               MAX(bd.department_code),
4171               NULL,                           -- employee_id
4172               wor.resource_seq_num,
4173               wor.resource_id,
4174               MAX(br.resource_code),
4175               MAX(wor.phantom_flag),
4176               wor.usage_rate_or_amount,
4177               MAX(wor.basis_type),
4178               MAX(wor.autocharge_type),
4179               wor.standard_rate_flag,
4180               1,                              -- transaction_quantity
4181               MAX(wor.uom_code),              -- transaction_uom
4182               1,                              -- primary_quantity
4183               MAX(wor.uom_code),              -- primary_uom
4184               NULL,                           -- actual_resource_rate
4185               wor.activity_id,
4186               MAX(ca.activity),               -- activity_name
4187               NULL,                           -- reason_id
4188               NULL,                           -- reason_name
4189               -- Fixed bug 2506653
4190               MAX(wmti.reference),             -- reference
4191               MAX(wmti.transaction_id),        -- move_transaction_id
4192               NULL,                           -- po_header_id
4193               NULL,                           -- po_line_id
4194               wma.repetitive_schedule_id
4195          FROM bom_departments bd,
4196               bom_resources br,
4197               cst_activities ca,
4198               wip_operation_resources wor,
4199               wip_move_txn_allocations wma,
4200               wip_operations wop,
4201               wip_move_txn_interface wmti
4202         WHERE wmti.group_id = p_gib.group_id
4203           AND TRUNC(wmti.transaction_date) = TRUNC(p_gib.txn_date)
4204           AND wmti.process_phase = WIP_CONSTANTS.MOVE_PROC
4205           AND wmti.process_status = WIP_CONSTANTS.RUNNING
4206           AND wmti.entity_type = WIP_CONSTANTS.REPETITIVE
4207           AND wop.organization_id = wmti.organization_id
4208           AND wop.wip_entity_id = wmti.wip_entity_id
4209           AND wop.wip_entity_id = wor.wip_entity_id
4210           AND wop.operation_seq_num = wor.operation_seq_num
4211           AND wop.organization_id = wor.organization_id
4212           AND wop.repetitive_schedule_id = wma.repetitive_schedule_id
4213           AND wor.repetitive_schedule_id = wma.repetitive_schedule_id
4214           AND wmti.organization_id = wma.organization_id
4215           AND wmti.transaction_id = wma.transaction_id
4216           AND wor.autocharge_type = WIP_CONSTANTS.WIP_MOVE
4217           AND wor.basis_type = WIP_CONSTANTS.PER_LOT
4218           AND wop.organization_id = bd.organization_id
4219           AND NVL(wor.department_id, wop.department_id) = bd.department_id
4220           AND wor.organization_id = br.organization_id
4221           AND wor.resource_id = br.resource_id
4222           AND wor.usage_rate_or_amount <> 0
4223           AND wor.activity_id = ca.activity_id (+)
4224           AND (
4225               (wop.operation_seq_num >= wmti.fm_operation_seq_num
4226               + DECODE(SIGN(wmti.fm_intraoperation_step_type -
4227                             WIP_CONSTANTS.RUN),1,1,0)
4228               AND wop.operation_seq_num < wmti.to_operation_seq_num
4229               + DECODE(SIGN(wmti.to_intraoperation_step_type -
4230                             WIP_CONSTANTS.RUN),1,1,0)
4231               AND (wmti.to_operation_seq_num > wmti.fm_operation_seq_num
4232                    OR (wmti.to_operation_seq_num = wmti.fm_operation_seq_num
4233                       AND wmti.fm_intraoperation_step_type <= WIP_CONSTANTS.RUN
4234                       AND wmti.to_intraoperation_step_type > WIP_CONSTANTS.RUN))
4235               AND (wop.count_point_type < WIP_CONSTANTS.NO_MANUAL
4236                    OR wop.operation_seq_num = wmti.fm_operation_seq_num
4237                    OR (wop.operation_seq_num = wmti.to_operation_seq_num
4238                        AND wmti.to_intraoperation_step_type >
4239                            WIP_CONSTANTS.RUN)))
4240             OR
4241               (wop.operation_seq_num < wmti.fm_operation_seq_num
4242               + DECODE(SIGN(wmti.fm_intraoperation_step_type -
4243                             WIP_CONSTANTS.RUN),1,1,0)
4244               AND wop.operation_seq_num >= wmti.to_operation_seq_num
4245               + DECODE(SIGN(wmti.to_intraoperation_step_type -
4246                             WIP_CONSTANTS.RUN),1,1,0)
4247               AND (wmti.fm_operation_seq_num > wmti.to_operation_seq_num
4248                   OR (wmti.fm_operation_seq_num = wmti.to_operation_seq_num
4249                       AND wmti.to_intraoperation_step_type <= WIP_CONSTANTS.RUN
4250                       AND wmti.fm_intraoperation_step_type > WIP_CONSTANTS.RUN))
4251               AND (wop.count_point_type < WIP_CONSTANTS.NO_MANUAL
4252                   OR wop.operation_seq_num = wmti.to_operation_seq_num
4253                   OR (wop.operation_seq_num = wmti.fm_operation_seq_num
4254                      AND wmti.fm_intraoperation_step_type >
4255                          WIP_CONSTANTS.RUN))))
4256      GROUP BY wop.organization_id,
4257               wop.wip_entity_id,
4258               wmti.line_id,
4259               wma.repetitive_schedule_id,
4260               wop.operation_seq_num,
4261               wor.resource_seq_num,
4262               wor.resource_id,
4263               wor.activity_id,
4264               wor.standard_rate_flag,
4265               wor.usage_rate_or_amount
4266        HAVING 0 <>
4267               DECODE(SIGN(MAX(wop.quantity_completed) + NVL(SUM(
4268                   wma.primary_quantity *
4269                 DECODE(SIGN(wmti.to_operation_seq_num -
4270                             wmti.fm_operation_seq_num),
4271                 0,DECODE(SIGN(wmti.fm_intraoperation_step_type -
4272                               WIP_CONSTANTS.RUN),
4273                    0,DECODE(SIGN(wmti.to_intraoperation_step_type -
4274                                  WIP_CONSTANTS.RUN),1,1,-1),
4275                   -1,DECODE(SIGN(wmti.to_intraoperation_step_type -
4276                                  WIP_CONSTANTS.RUN),1,1,-1),
4277                    1,-1),
4278                 1, 1,
4279                -1,-1)
4280                 ),0)),      -- NVL
4281               0, DECODE(SIGN(MAX(wop.quantity_completed)),1,-1,0),
4282               1, DECODE(SIGN(MAX(wop.quantity_completed)),1,0,1),
4283              -1, DECODE(SIGN(MAX(wop.quantity_completed)),1,-1,0));
4284 
4285     -- IF debug message level = 2, write statement below to log file
4286     IF (l_logLevel <= wip_constants.full_logging) THEN
4287       fnd_message.set_name('WIP', 'WIP_INSERTED_ROWS');
4288       fnd_message.set_token('ENTITY1', SQL%ROWCOUNT);
4289       fnd_message.set_token('ENTITY2', 'WIP_COST_TXN_INTERFACE');
4290       l_msg := fnd_message.get;
4291       wip_logger.log(p_msg          => l_msg,
4292                      x_returnStatus => l_returnStatus);
4293     END IF;
4294 
4295   END IF; --  Per order basis type for repetitive
4296 
4297   -- IF resource per item or resource per lot, set transaction_id
4298   IF(l_move.rsrcItem = WIP_CONSTANTS.YES OR
4299      l_move.rsrcLot  = WIP_CONSTANTS.YES) THEN
4300 
4301    /*------------------------------------------------------------+
4302    |  Generate transaction_id for WIP_TXN_ALLOCATIONS     |
4303    +------------------------------------------------------------*/
4304    UPDATE wip_cost_txn_interface
4305       SET transaction_id = wip_transactions_s.nextval
4306     WHERE group_id = p_gib.group_id
4307       AND TRUNC(transaction_date) = TRUNC(p_gib.txn_date)
4308       AND transaction_type = WIP_CONSTANTS.RES_TXN;
4309 
4310     -- IF debug message level = 2, write statement below to log file
4311     IF (l_logLevel <= wip_constants.full_logging) THEN
4312       fnd_message.set_name('WIP', 'WIP_UPDATED_ROWS');
4313       fnd_message.set_token('ENTITY1', SQL%ROWCOUNT);
4314       fnd_message.set_token('ENTITY2', 'WIP_COST_TXN_INTERFACE');
4315       l_msg := fnd_message.get;
4316       wip_logger.log(p_msg          => l_msg,
4317                      x_returnStatus => l_returnStatus);
4318     END IF;
4319 
4320   END IF;  -- Either resource per item or resource per lot
4321 
4322   -- Per order basis type for repetitive
4323   IF(l_move.scheTxn = WIP_CONSTANTS.YES AND
4324      l_move.rsrcLot = WIP_CONSTANTS.YES) THEN
4325 
4326    /*------------------------------------------------------------+
4327    |  Insert into cost allocations for repetitive schedules     |
4328    |  per lot
4329    +------------------------------------------------------------*/
4330 
4331   /*------------------------------------------------------------+
4332    |  Columns to insert into WIP_TXN_ALLOCATIONS                |
4333    |                                                            |
4334    |  transaction_id,                                           |
4335    |  repetitive_schedule_id, organization_id,                  |
4336    |  last_update_date, last_updated_by, creation_date,         |
4337    |  created_by, last_update_login, request_id,                |
4338    |  program_application_id, program_id, program_update_date,  |
4339    |  transaction_quantity,                                     |
4340    |  primary_quantity,                                         |
4341    |                                                            |
4342    +------------------------------------------------------------*/
4343     INSERT INTO wip_txn_allocations
4344      (transaction_id,
4345       repetitive_schedule_id,
4346       organization_id,
4347       last_update_date,
4348       last_updated_by,
4349       creation_date,
4350       created_by,
4351       last_update_login,
4352       request_id,
4353       program_application_id,
4354       program_id,
4355       program_update_date,
4356       transaction_quantity,
4357       primary_quantity
4358       )
4359       SELECT wci.transaction_id,
4360              wma.repetitive_schedule_id,
4361              MAX(wmti.organization_id),
4362              SYSDATE,                      -- last_update_date
4363              MAX(wmti.last_updated_by),     -- last_updated_by --Fix for bug 5195072
4364              SYSDATE,                      -- creation_date
4365              MAX(wmti.created_by),          -- created_by --Fix for bug 5195072
4366              DECODE(p_gib.login_id,-1,NULL,p_gib.login_id),
4367              DECODE(p_gib.request_id,-1,NULL,p_gib.request_id),
4368              DECODE(p_gib.application_id,-1,NULL,p_gib.application_id),
4369              DECODE(p_gib.program_id,-1,NULL,p_gib.program_id),
4370              DECODE(p_gib.request_id,-1,NULL,SYSDATE), -- program_update_date
4371              MAX(wor.usage_rate_or_amount) *       -- transaction_quantity
4372                DECODE(SIGN(MAX(wop.quantity_completed) +
4373                                NVL(SUM(wma.primary_quantity *
4374                  DECODE(SIGN(wmti.to_operation_seq_num -
4375                              wmti.fm_operation_seq_num),
4376                  0,DECODE(SIGN(wmti.fm_intraoperation_step_type -
4377                                WIP_CONSTANTS.RUN),
4378                    0,DECODE(SIGN(wmti.to_intraoperation_step_type -
4379                                  WIP_CONSTANTS.RUN),1,1,-1),
4380                   -1,DECODE(SIGN(wmti.to_intraoperation_step_type -
4381                                  WIP_CONSTANTS.RUN),1,1,-1),
4382                    1,-1),
4383                  1, 1,
4384                 -1,-1)
4385                 ),0)),   -- NVL
4386                0, DECODE(SIGN(MAX(wop.quantity_completed)),1,-1,0),
4387                1, DECODE(SIGN(MAX(wop.quantity_completed)),1,0,1),
4388               -1, DECODE(SIGN(MAX(wop.quantity_completed)),1,-1,0)),
4389              MAX(wor.usage_rate_or_amount) *     -- primary_quantity
4390                DECODE(SIGN(MAX(wop.quantity_completed) +
4391                                NVL(SUM(wma.primary_quantity *
4392                  DECODE(SIGN(wmti.to_operation_seq_num -
4393                              wmti.fm_operation_seq_num),
4394                  0,DECODE(SIGN(wmti.fm_intraoperation_step_type -
4395                                WIP_CONSTANTS.RUN),
4396                    0,DECODE(SIGN(wmti.to_intraoperation_step_type -
4397                                  WIP_CONSTANTS.RUN),1,1,-1),
4398                   -1,DECODE(SIGN(wmti.to_intraoperation_step_type -
4399                                  WIP_CONSTANTS.RUN),1,1,-1),
4400                    1,-1),
4401                  1, 1,
4402                 -1,-1)
4403                 ),0)),   -- NVL
4404                0, DECODE(SIGN(MAX(wop.quantity_completed)),1,-1,0),
4405                1, DECODE(SIGN(MAX(wop.quantity_completed)),1,0,1),
4406               -1, DECODE(SIGN(MAX(wop.quantity_completed)),1,-1,0))
4407 
4408         FROM wip_operation_resources wor,
4409              wip_operations wop,
4410              wip_move_txn_allocations wma,
4411              wip_cost_txn_interface wci,
4412              wip_move_txn_interface wmti
4413        WHERE wmti.group_id = p_gib.group_id
4414          AND TRUNC(wmti.transaction_date) = TRUNC(p_gib.txn_date)
4415          AND wmti.process_phase = WIP_CONSTANTS.MOVE_PROC
4416          AND wmti.process_status = WIP_CONSTANTS.RUNNING
4417          AND wmti.entity_type = WIP_CONSTANTS.REPETITIVE
4418          AND wmti.group_id = wci.group_id
4419          AND wci.organization_id = wmti.organization_id
4420          AND wci.wip_entity_id = wmti.wip_entity_id
4421          AND wci.operation_seq_num = wop.operation_seq_num
4422          AND wci.basis_type = WIP_CONSTANTS.PER_LOT
4423          AND wci.transaction_type = WIP_CONSTANTS.RES_TXN
4424          AND wop.repetitive_schedule_id = wor.repetitive_schedule_id
4425          AND wci.organization_id = wor.organization_id
4426          AND wci.wip_entity_id = wor.wip_entity_id
4427          AND wci.operation_seq_num = wor.operation_seq_num
4428          AND wci.resource_seq_num = wor.resource_seq_num
4429          AND wci.resource_id = wor.resource_id
4430          AND wci.standard_rate_flag = wor.standard_rate_flag
4431          AND wci.usage_rate_or_amount = wor.usage_rate_or_amount
4432          AND NVL(wci.activity_id, -1) = NVL(wor.activity_id, -1)
4433          AND wor.autocharge_type = WIP_CONSTANTS.WIP_MOVE
4434          AND wor.basis_type = WIP_CONSTANTS.PER_LOT
4435          AND wop.organization_id = wmti.organization_id
4436          AND wop.wip_entity_id = wmti.wip_entity_id
4437          AND wop.repetitive_schedule_id = wma.repetitive_schedule_id
4438          AND wmti.organization_id = wma.organization_id
4439          AND wmti.transaction_id = wma.transaction_id
4440          AND wci.repetitive_schedule_id = wma.repetitive_schedule_id
4441     GROUP BY wci.transaction_id,
4442              wma.repetitive_schedule_id;
4443 
4444     -- IF debug message level = 2, write statement below to log file
4445     IF (l_logLevel <= wip_constants.full_logging) THEN
4446       fnd_message.set_name('WIP', 'WIP_INSERTED_ROWS');
4447       fnd_message.set_token('ENTITY1', SQL%ROWCOUNT);
4448       fnd_message.set_token('ENTITY2', 'WIP_TXN_ALLOCATIONS');
4449       l_msg := fnd_message.get;
4450       wip_logger.log(p_msg          => l_msg,
4451                      x_returnStatus => l_returnStatus);
4452     END IF;
4453 
4454   END IF; -- Per order basis type for repetitive
4455 
4456   x_returnStatus := fnd_api.g_ret_sts_success;
4457 
4458   -- write to the log file
4459   IF (l_logLevel <= wip_constants.trace_logging) THEN
4460     wip_logger.exitPoint(p_procName => 'wip_movProc_priv.insert_auto_resource',
4461                          p_procReturnStatus => x_returnStatus,
4462                          p_msg => 'procedure complete',
4463                          x_returnStatus => l_returnStatus);
4464   END IF;
4465 
4466 EXCEPTION
4467   WHEN others THEN
4468     x_returnStatus := fnd_api.g_ret_sts_unexp_error;
4469     l_errMsg := 'unexpected error: ' || SQLERRM || 'SQLCODE = ' || SQLCODE;
4470 
4471     IF (l_logLevel <= wip_constants.trace_logging) THEN
4472       wip_logger.exitPoint(p_procName=>'wip_movProc_priv.insert_auto_resource',
4473                            p_procReturnStatus => x_returnStatus,
4474                            p_msg => l_errMsg,
4475                            x_returnStatus => l_returnStatus);
4476     END IF;
4477     fnd_message.set_name('FND', 'FND_GENERIC_MESSAGE');
4478     fnd_message.set_token('MESSAGE', l_errMsg);
4479     fnd_msg_pub.add;
4480 END insert_auto_resource;
4481 
4482 /*****************************************************************************
4483  * This procedure is equivalent to wipiara in wiltca.ppc
4484  * This procedure is used to allocate per-item auto-resouce according to the
4485  * material allocation in the coresponding move transactions.
4486  * This procedure insert the record into WIP_TXN_ALLOCATIONS
4487  * This procedure must be called only after move allocation is successfully
4488  * completed
4489  ****************************************************************************/
4490 PROCEDURE insert_txn_alloc(p_gib           IN        group_rec_t,
4491                            x_returnStatus OUT NOCOPY VARCHAR2) IS
4492 
4493 l_params       wip_logger.param_tbl_t;
4494 l_returnStatus VARCHAR(1);
4495 l_msg          VARCHAR(240);
4496 l_errMsg       VARCHAR2(240);
4497 l_logLevel     NUMBER := fnd_log.g_current_runtime_level;
4498 
4499 BEGIN
4500   -- write parameter value to log file
4501   IF (l_logLevel <= wip_constants.trace_logging) THEN
4502     l_params(1).paramName   := 'p_group_id';
4503     l_params(1).paramValue  :=  p_gib.group_id;
4504     wip_logger.entryPoint(p_procName =>'wip_movProc_priv.insert_txn_alloc',
4505                           p_params => l_params,
4506                           x_returnStatus => l_returnStatus);
4507   END IF;
4508 
4509   /*---------------------------------------------------------------------+
4510     For each pENDing automatic per-item resource transaction in the group,
4511     the allocator uses the transaction associated material allocation in
4512     WIP_MOVE_TXN_ALLOCATION to insert one or more allocation records into
4513     WIP_TXN_ALLOCATIONS.
4514    +--------------------------------------------------------------------*/
4515   INSERT INTO wip_txn_allocations
4516     (transaction_id,
4517      repetitive_schedule_id,
4518      organization_id,
4519      last_update_date,
4520      last_updated_by,
4521      creation_date,
4522      created_by,
4523      last_update_login,
4524      request_id,
4525      program_application_id,
4526      program_id,
4527      program_update_date,
4528      transaction_quantity,
4529      primary_quantity
4530     )
4531     SELECT wcti.transaction_id,
4532            wmta.repetitive_schedule_id,
4533            wcti.organization_id,
4534            SYSDATE,                       -- last_update_date
4535            wcti.last_updated_by,
4536            SYSDATE,                       -- creation_date
4537            wcti.created_by,
4538            wcti.last_update_login,
4539            wcti.request_id,
4540            wcti.program_application_id,
4541            wcti.program_id,
4542            SYSDATE,                       -- program_update_date
4543            wmta.transaction_quantity * wor.usage_rate_or_amount
4544              * DECODE(SIGN(wmti.to_operation_seq_num -
4545                            wmti.fm_operation_seq_num),
4546                0, DECODE(SIGN(wmti.fm_intraoperation_step_type -
4547                               WIP_CONSTANTS.RUN),
4548                   1, -1, DECODE(SIGN(wmti.to_intraoperation_step_type -
4549                                      WIP_CONSTANTS.RUN),1, 1, -1)),
4550                1, 1,
4551               -1,-1),                      -- transaction_quantity
4552                        wmta.primary_quantity * wor.usage_rate_or_amount
4553              * DECODE(SIGN(wmti.to_operation_seq_num -
4554                            wmti.fm_operation_seq_num),
4555                0, DECODE(SIGN(wmti.fm_intraoperation_step_type -
4556                               WIP_CONSTANTS.RUN),
4557                   1, -1, DECODE(SIGN(wmti.to_intraoperation_step_type -
4558                                      WIP_CONSTANTS.RUN),1, 1, -1)),
4559                1, 1,
4560               -1,-1)                       -- primary_quantity
4561       FROM wip_operation_resources wor,
4562            wip_move_txn_allocations wmta,
4563            wip_move_txn_interface wmti,
4564            wip_cost_txn_interface wcti
4565      WHERE wcti.group_id = p_gib.group_id
4566        AND wcti.process_phase = WIP_CONSTANTS.RES_PROC
4567        AND wcti.process_status = WIP_CONSTANTS.PENDING
4568        AND wcti.transaction_type = WIP_CONSTANTS.RES_TXN
4569        AND wcti.move_transaction_id IS NOT NULL /* Automatic resource */
4570        AND wcti.entity_type = WIP_CONSTANTS.REPETITIVE
4571        AND wcti.basis_type = WIP_CONSTANTS.PER_ITEM
4572        AND wcti.group_id = wmti.group_id  /* Bug 938039, 979553*/
4573        AND wcti.move_transaction_id = wmti.transaction_id
4574        AND wcti.move_transaction_id = wmta.transaction_id
4575        AND wcti.organization_id = wmta.organization_id
4576        AND wor.organization_id = wcti.organization_id
4577        AND wor.wip_entity_id = wcti.wip_entity_id
4578        AND wor.repetitive_schedule_id = wmta.repetitive_schedule_id
4579        AND wor.operation_seq_num = wcti.operation_seq_num
4580        AND wor.resource_seq_num = wcti.resource_seq_num
4581        AND wor.resource_id = wcti.resource_id
4582        AND NVL(wor.activity_id, -1) = NVL(wcti.activity_id, -1)
4583        AND wor.standard_rate_flag = wcti.standard_rate_flag
4584        AND wor.usage_rate_or_amount = wcti.usage_rate_or_amount;
4585 
4586   -- IF debug message level = 2, write statement below to log file
4587   IF (l_logLevel <= wip_constants.full_logging) THEN
4588     fnd_message.set_name('WIP', 'WIP_INSERTED_ROWS');
4589     fnd_message.set_token('ENTITY1', SQL%ROWCOUNT);
4590     fnd_message.set_token('ENTITY2', 'WIP_TXN_ALLOCATIONS');
4591     l_msg := fnd_message.get;
4592     wip_logger.log(p_msg          => l_msg,
4593                    x_returnStatus => l_returnStatus);
4594   END IF;
4595 
4596   x_returnStatus := fnd_api.g_ret_sts_success;
4597 
4598   -- write to the log file
4599   IF (l_logLevel <= wip_constants.trace_logging) THEN
4600     wip_logger.exitPoint(p_procName => 'wip_movProc_priv.insert_txn_alloc',
4601                          p_procReturnStatus => x_returnStatus,
4602                          p_msg => 'procedure complete',
4603                          x_returnStatus => l_returnStatus);
4604   END IF;
4605 
4606 EXCEPTION
4607   WHEN others THEN
4608     x_returnStatus := fnd_api.g_ret_sts_unexp_error;
4609     l_errMsg := 'unexpected error: ' || SQLERRM || 'SQLCODE = ' || SQLCODE;
4610 
4611     IF (l_logLevel <= wip_constants.trace_logging) THEN
4612       wip_logger.exitPoint(p_procName=>'wip_movProc_priv.insert_txn_alloc',
4613                            p_procReturnStatus => x_returnStatus,
4614                            p_msg => l_errMsg,
4615                            x_returnStatus => l_returnStatus);
4616     END IF;
4617     fnd_message.set_name('FND', 'FND_GENERIC_MESSAGE');
4618     fnd_message.set_token('MESSAGE', l_errMsg);
4619     fnd_msg_pub.add;
4620 END insert_txn_alloc;
4621 
4622 /*****************************************************************************
4623  * This procedure is equivalent to witpsdo_dept_overheads in wiltps3.ppc
4624  * This procedure is used to insert department overhead info into
4625  * WIP_COST_TXN_INTERFACE and WIP_TXN_ALLOCATIONS IF needed
4626  ****************************************************************************/
4627 PROCEDURE insert_dept_overhead(p_gib           IN        group_rec_t,
4628                                x_returnStatus OUT NOCOPY VARCHAR2) IS
4629 
4630 l_params       wip_logger.param_tbl_t;
4631 l_returnStatus VARCHAR(1);
4632 l_msg          VARCHAR(240);
4633 l_errMsg       VARCHAR2(240);
4634 l_move         move_profile_rec_t;
4635 l_logLevel     NUMBER := fnd_log.g_current_runtime_level;
4636 
4637 BEGIN
4638   l_move  := p_gib.move_profile;
4639 
4640   -- write parameter value to log file
4641   IF (l_logLevel <= wip_constants.trace_logging) THEN
4642     l_params(1).paramName   := 'p_group_id';
4643     l_params(1).paramValue  :=  p_gib.group_id;
4644     l_params(2).paramName   := 'p_txn_date';
4645     l_params(2).paramValue  :=  p_gib.txn_date;
4646     l_params(3).paramName   := 'org_id';
4647     l_params(3).paramValue  :=  l_move.org_id;
4648     l_params(4).paramName   := 'wip_id';
4649     l_params(4).paramValue  :=  l_move.wip_id;
4650     l_params(5).paramName   := 'fmOp';
4651     l_params(5).paramValue  :=  l_move.fmOp;
4652     l_params(6).paramName   := 'fmStep';
4653     l_params(6).paramValue  :=  l_move.fmStep;
4654     l_params(7).paramName   := 'toOp';
4655     l_params(7).paramValue  :=  l_move.toOp;
4656     l_params(8).paramName   := 'toStep';
4657     l_params(8).paramValue  :=  l_move.toStep;
4658     l_params(9).paramName   := 'scrapTxn';
4659     l_params(9).paramValue  :=  l_move.scrapTxn;
4660     l_params(10).paramName  := 'easyComplete';
4661     l_params(10).paramValue :=  l_move.easyComplete;
4662     l_params(11).paramName  := 'easyReturn';
4663     l_params(11).paramValue :=  l_move.easyReturn;
4664     l_params(12).paramName  := 'jobTxn';
4665     l_params(12).paramValue :=  l_move.jobTxn;
4666     l_params(13).paramName  := 'scheTxn';
4667     l_params(13).paramValue :=  l_move.scheTxn;
4668     l_params(14).paramName  := 'rsrcItem';
4669     l_params(14).paramValue :=  l_move.rsrcItem;
4670     l_params(15).paramName  := 'rsrcLot';
4671     l_params(15).paramValue :=  l_move.rsrcLot;
4672     l_params(16).paramName  := 'poReqItem';
4673     l_params(16).paramValue :=  l_move.poReqItem;
4674     l_params(17).paramName  := 'poRegLot';
4675     l_params(17).paramValue :=  l_move.poReqLot;
4676     wip_logger.entryPoint(p_procName =>'wip_movProc_priv.insert_dept_overhead',
4677                           p_params => l_params,
4678                           x_returnStatus => l_returnStatus);
4679   END IF;
4680 
4681    -- Per item basis type for discrete jobs
4682   IF(l_move.jobTxn = WIP_CONSTANTS.YES) THEN
4683 
4684     INSERT INTO wip_cost_txn_interface
4685       (transaction_id,
4686        last_update_date,
4687        last_updated_by,
4688        last_updated_by_name,
4689        creation_date,
4690        created_by,
4691        created_by_name,
4692        last_update_login,
4693        request_id,
4694        program_application_id,
4695        program_id,
4696        program_update_date,
4697        group_id,
4698        source_code,
4699        source_line_id,
4700        process_phase,
4701        process_status,
4702        transaction_type,
4703        organization_id,
4704        organization_code,
4705        wip_entity_id,
4706        entity_type,
4707        primary_item_id,
4708        line_id,
4709        line_code,
4710        transaction_date,
4711        acct_period_id,
4712        operation_seq_num,
4713        department_id,
4714        department_code,
4715        employee_id,
4716        resource_seq_num,
4717        resource_id,
4718        resource_code,
4719        phantom_flag,
4720        usage_rate_or_amount,
4721        basis_type,
4722        autocharge_type,
4723        standard_rate_flag,
4724        transaction_quantity,
4725        transaction_uom,
4726        primary_quantity,
4727        primary_uom,
4728        actual_resource_rate,
4729        activity_id,
4730        activity_name,
4731        reason_id,
4732        reason_name,
4733        reference,
4734        move_transaction_id,
4735        po_header_id,
4736        po_line_id,
4737        repetitive_schedule_id,
4738        project_id,
4739        task_id
4740        )
4741        SELECT NULL,                          -- transaction_id
4742               SYSDATE,                       -- last_update_date
4743               MAX(wmti.last_updated_by),     -- last_updated_by --Fix for bug 5195072
4744               MAX(wmti.last_updated_by_name),-- last_updated_by_name --Fix for bug 5195072
4745               SYSDATE,                       -- creation_date
4746               MAX(wmti.created_by),          -- created_by --Fix for bug 5195072
4747               MAX(wmti.created_by_name),     -- created_by_name --Fix for bug 5195072
4748               DECODE(p_gib.login_id,-1,NULL,p_gib.login_id),
4749               DECODE(p_gib.request_id,-1,NULL,p_gib.request_id),
4750               DECODE(p_gib.application_id,-1,NULL,p_gib.application_id),
4751               DECODE(p_gib.program_id,-1,NULL,p_gib.program_id),
4752               DECODE(p_gib.request_id,-1,NULL,SYSDATE), -- program_update_date
4753               p_gib.group_id,
4754               MAX(wmti.source_code),
4755               MAX(wmti.source_line_id),
4756               WIP_CONSTANTS.RES_PROC,        -- process_phase
4757               WIP_CONSTANTS.PENDING,         -- process_status
4758               WIP_CONSTANTS.OVHD_TXN,        -- transaction_type
4759               MAX(wmti.organization_id),
4760               MAX(wmti.organization_code),
4761               MAX(wmti.wip_entity_id),
4762               MAX(wmti.entity_type),
4763               MAX(wmti.primary_item_id),
4764               MAX(wmti.line_id),
4765               MAX(wmti.line_code),
4766               MAX(wmti.transaction_date),
4767               MAX(wmti.acct_period_id),
4768               wop.operation_seq_num,
4769               NVL(wor.department_id, wop.department_id),
4770               MAX(bd.department_code),
4771               NULL,                          -- employee_id
4772               NULL,                          -- resource_seq_num
4773               NULL,                          -- resource_id
4774               NULL,                          -- resource_code
4775               MAX(wor.phantom_flag),
4776               NULL,                          -- usage_rate_or_amount
4777               WIP_CONSTANTS.PER_ITEM,        -- basis_type
4778               WIP_CONSTANTS.WIP_MOVE,        -- autocharge_type
4779               NULL,                          -- standard_rate_flag
4780               MAX(NVL(DECODE(wor.phantom_flag, 1, wro.quantity_per_assembly, 1)
4781                * wmti.primary_quantity *
4782                 DECODE(SIGN(wmti.to_operation_seq_num -
4783                             wmti.fm_operation_seq_num),
4784                 0,DECODE(SIGN(wmti.fm_intraoperation_step_type -
4785                               WIP_CONSTANTS.RUN),
4786                   0,DECODE(SIGN(wmti.to_intraoperation_step_type -
4787                                 WIP_CONSTANTS.RUN),1,1,-1),
4788                  -1,DECODE(SIGN(wmti.to_intraoperation_step_type -
4789                                 WIP_CONSTANTS.RUN),1,1,-1),
4790                   1,-1),
4791                 1, 1,
4792                -1,-1)
4793                ,0)),                         -- transaction_quantity
4794               MAX(wmti.primary_uom),         -- transaction_uom
4795               MAX(NVL(DECODE(wor.phantom_flag, 1, wro.quantity_per_assembly, 1)
4796                * wmti.primary_quantity *
4797                 DECODE(SIGN(wmti.to_operation_seq_num -
4798                             wmti.fm_operation_seq_num),
4799                 0,DECODE(SIGN(wmti.fm_intraoperation_step_type -
4800                               WIP_CONSTANTS.RUN),
4801                   0,DECODE(SIGN(wmti.to_intraoperation_step_type -
4802                                 WIP_CONSTANTS.RUN),1,1,-1),
4803                  -1,DECODE(SIGN(wmti.to_intraoperation_step_type -
4804                                 WIP_CONSTANTS.RUN),1,1,-1),
4805                   1,-1),
4806                 1, 1,
4807                -1,-1)
4808                ,0)),                         -- primary_quantity
4809               MAX(wmti.primary_uom),         -- primary_uom
4810               NULL,                          -- actual_resource_rate
4811               NULL,                          -- activity_id
4812               NULL,                          -- activity_name
4813               MAX(wmti.reason_id),
4814               MAX(wmti.reason_name),
4815               MAX(wmti.reference),
4816               MAX(wmti.transaction_id),      -- move_transaction_id
4817               NULL,                          -- po_header_id
4818               NULL,                          -- po_line_id
4819               NULL,                          -- repetitive_schedule_id
4820               MAX(wdj.project_id),
4821               MAX(wdj.task_id)
4822          FROM bom_departments bd,
4823               wip_operations wop,
4824               wip_operation_resources wor,
4825               wip_discrete_jobs wdj,
4826               wip_move_txn_interface wmti,
4827               wip_requirement_operations WRO
4828         WHERE wmti.group_id = p_gib.group_id
4829           AND TRUNC(wmti.transaction_date) = TRUNC(p_gib.txn_date)
4830           AND wdj.wip_entity_id = wmti.wip_entity_id
4831           AND wdj.organization_id = wmti.organization_id
4832           AND wmti.process_phase = WIP_CONSTANTS.MOVE_PROC
4833           AND wmti.process_status = WIP_CONSTANTS.RUNNING
4834           AND (wmti.entity_type = WIP_CONSTANTS.DISCRETE
4835               OR wmti.entity_type = WIP_CONSTANTS.LOTBASED)/* WSM */
4836           AND wop.organization_id = wmti.organization_id
4837           AND wop.wip_entity_id = wmti.wip_entity_id
4838           AND wop.organization_id = bd.organization_id
4839           AND NVL(wor.department_id, wop.department_id) = bd.department_id
4840           AND wop.organization_id = wor.organization_id(+)
4841           AND wop.wip_entity_id = wor.wip_entity_id(+)
4842           AND wop.operation_seq_num = wor.operation_seq_num(+)
4843           /* added for OSFM jump enhancement 2541431 */
4844           AND NVL(wop.skip_flag, WIP_CONSTANTS.NO) <> WIP_CONSTANTS.YES
4845           AND wor.wip_entity_id = wro.wip_entity_id (+)
4846           AND wor.organization_id = wro.organization_id (+)
4847           /* Fixed bug 3881663. Op seq in wro is a negative number,
4848            * but op seq in wor is a positive number.*/
4849           AND -wor.operation_seq_num = wro.operation_seq_num (+)
4850           AND wor.phantom_item_id = wro.inventory_item_id (+)
4851           /*bug 3930251 -> insert into WCTI only if there are records in CDO)*/
4852           AND EXISTS
4853              ( SELECT 1 FROM cst_department_overheads cdo
4854                 WHERE cdo.organization_id = bd.organization_id
4855                   AND cdo.department_id = bd.department_id
4856              )
4857           AND (
4858               (wop.operation_seq_num >= wmti.fm_operation_seq_num
4859               + DECODE(SIGN(wmti.fm_intraoperation_step_type -
4860                             WIP_CONSTANTS.RUN),1,1,0)
4861               AND wop.operation_seq_num < wmti.to_operation_seq_num
4862               + DECODE(SIGN(wmti.to_intraoperation_step_type -
4863                             WIP_CONSTANTS.RUN),1,1,0)
4864               AND(wmti.to_operation_seq_num > wmti.fm_operation_seq_num
4865                   OR (wmti.to_operation_seq_num = wmti.fm_operation_seq_num
4866                      AND wmti.fm_intraoperation_step_type <= WIP_CONSTANTS.RUN
4867                      AND wmti.to_intraoperation_step_type > WIP_CONSTANTS.RUN))
4868               AND (wop.count_point_type < WIP_CONSTANTS.NO_MANUAL
4869                    OR wop.operation_seq_num = wmti.fm_operation_seq_num
4870                    OR (wop.operation_seq_num = wmti.to_operation_seq_num
4871                        AND wmti.to_intraoperation_step_type >
4872                            WIP_CONSTANTS.RUN)))
4873             OR
4874               (wop.operation_seq_num < wmti.fm_operation_seq_num
4875               + DECODE(SIGN(wmti.fm_intraoperation_step_type -
4876                             WIP_CONSTANTS.RUN),1,1,0)
4877               AND wop.operation_seq_num >= wmti.to_operation_seq_num
4878               + DECODE(SIGN(wmti.to_intraoperation_step_type -
4879                             WIP_CONSTANTS.RUN),1,1,0)
4880               AND (wmti.fm_operation_seq_num > wmti.to_operation_seq_num
4881                   OR (wmti.fm_operation_seq_num = wmti.to_operation_seq_num
4882                       AND wmti.to_intraoperation_step_type <= WIP_CONSTANTS.RUN
4883                       AND wmti.fm_intraoperation_step_type > WIP_CONSTANTS.RUN))
4884               AND (wop.count_point_type < WIP_CONSTANTS.NO_MANUAL
4885                    OR wop.operation_seq_num = wmti.to_operation_seq_num
4886                    OR (wop.operation_seq_num = wmti.fm_operation_seq_num
4887                       AND wmti.fm_intraoperation_step_type >
4888                           WIP_CONSTANTS.RUN))))
4889      GROUP BY wop.wip_entity_id,
4890               wop.operation_seq_num,
4891               wor.department_id,/*Fixed bug 2834503*/
4892               wop.department_id,
4893               wor.phantom_item_id,
4894               wor.phantom_op_seq_num,
4895               wmti.transaction_id; /* 2821017 */
4896 
4897     -- IF debug message level = 2, write statement below to log file
4898     IF (l_logLevel <= wip_constants.full_logging) THEN
4899       fnd_message.set_name('WIP', 'WIP_INSERTED_ROWS');
4900       fnd_message.set_token('ENTITY1', SQL%ROWCOUNT);
4901       fnd_message.set_token('ENTITY2', 'WIP_COST_TXN_INTERFACE');
4902       l_msg := fnd_message.get;
4903       wip_logger.log(p_msg          => l_msg,
4904                      x_returnStatus => l_returnStatus);
4905     END IF;
4906 
4907   END IF;  --Per item basis type for discrete jobs
4908 
4909   -- Per item basis type for repetitive schedule
4910   IF(l_move.scheTxn = WIP_CONSTANTS.YES) THEN
4911 
4912     INSERT INTO wip_cost_txn_interface
4913       (transaction_id,
4914        last_update_date,
4915        last_updated_by,
4916        last_updated_by_name,
4917        creation_date,
4918        created_by,
4919        created_by_name,
4920        last_update_login,
4921        request_id,
4922        program_application_id,
4923        program_id,
4924        program_update_date,
4925        group_id,
4926        source_code,
4927        source_line_id,
4928        process_phase,
4929        process_status,
4930        transaction_type,
4931        organization_id,
4932        organization_code,
4933        wip_entity_id,
4934        entity_type,
4935        primary_item_id,
4936        line_id,
4937        line_code,
4938        transaction_date,
4939        acct_period_id,
4940        operation_seq_num,
4941        department_id,
4942        department_code,
4943        employee_id,
4944        resource_seq_num,
4945        resource_id,
4946        resource_code,
4947        phantom_flag,
4948        usage_rate_or_amount,
4949        basis_type,
4950        autocharge_type,
4951        standard_rate_flag,
4952        transaction_quantity,
4953        transaction_uom,
4954        primary_quantity,
4955        primary_uom,
4956        actual_resource_rate,
4957        activity_id,
4958        activity_name,
4959        reason_id,
4960        reason_name,
4961        reference,
4962        move_transaction_id,
4963        po_header_id,
4964        po_line_id,
4965        repetitive_schedule_id
4966        )
4967        SELECT NULL,                          -- transaction_id
4968               SYSDATE,                       -- last_update_date
4969               MAX(wmti.last_updated_by),      -- last_updated_by --Fix for bug 5195072
4970               MAX(wmti.last_updated_by_name), -- last_updated_by_name --Fix for bug 5195072
4971               SYSDATE,                       -- creation_date
4972               MAX(wmti.created_by),           -- created_by --Fix for bug 5195072
4973               MAX(wmti.created_by_name),      -- created_by_name --Fix for bug 5195072
4974               DECODE(p_gib.login_id,-1,NULL,p_gib.login_id),
4975               DECODE(p_gib.request_id,-1,NULL,p_gib.request_id),
4976               DECODE(p_gib.application_id,-1,NULL,p_gib.application_id),
4977               DECODE(p_gib.program_id,-1,NULL,p_gib.program_id),
4978               DECODE(p_gib.request_id,-1,NULL,SYSDATE), -- program_update_date
4979               p_gib.group_id,
4980               MAX(wmti.source_code),
4981               MAX(wmti.source_line_id),
4982               WIP_CONSTANTS.RES_PROC,        -- process_phase
4983               WIP_CONSTANTS.PENDING,         -- process_status
4984               WIP_CONSTANTS.OVHD_TXN,        -- transaction_type
4985               wmti.organization_id,
4986               MAX(wmti.organization_code),
4987               wmti.wip_entity_id,
4988               MAX(wmti.entity_type),
4989               MAX(wmti.primary_item_id),
4990               wmti.line_id,
4991               MAX(wmti.line_code),
4992               MAX(wmti.transaction_date),
4993               MAX(wmti.acct_period_id),
4994               wor.operation_seq_num,
4995               NVL(wor.department_id, wop.department_id),
4996               MAX(bd.department_code),
4997               NULL,                          -- employee_id
4998               NULL,                          -- resource_seq_num
4999               NULL,                          -- resource_id
5000               NULL,                          -- resource_code
5001               max(wor.phantom_flag),
5002               NULL,                          -- usage_rate_or_amount
5003               WIP_CONSTANTS.PER_ITEM,        -- basis_type
5004               WIP_CONSTANTS.WIP_MOVE,        -- autocharge_type
5005               NULL,                          -- standard_rate_flag
5006               SUM(NVL(wma.primary_quantity *
5007                 DECODE(SIGN(wmti.to_operation_seq_num -
5008                             wmti.fm_operation_seq_num),
5009                 0,DECODE(SIGN(wmti.fm_intraoperation_step_type -
5010                               WIP_CONSTANTS.RUN),
5011                   0,DECODE(SIGN(wmti.to_intraoperation_step_type -
5012                                 WIP_CONSTANTS.RUN),1,1,-1),
5013                  -1,DECODE(SIGN(wmti.to_intraoperation_step_type -
5014                                 WIP_CONSTANTS.RUN),1,1,-1),
5015                   1,-1),
5016                 1, 1,
5017                -1,-1)
5018                ,0)),                         -- transaction_quantity
5019               MAX(wmti.primary_uom),          -- transaction_uom
5020               SUM(NVL(wma.primary_quantity *
5021                 DECODE(SIGN(wmti.to_operation_seq_num -
5022                             wmti.fm_operation_seq_num),
5023                 0,DECODE(SIGN(wmti.fm_intraoperation_step_type -
5024                               WIP_CONSTANTS.RUN),
5025                   0,DECODE(SIGN(wmti.to_intraoperation_step_type -
5026                                 WIP_CONSTANTS.RUN),1,1,-1),
5027                  -1,DECODE(SIGN(wmti.to_intraoperation_step_type -
5028                                 WIP_CONSTANTS.RUN),1,1,-1),
5029                   1,-1),
5030                 1, 1,
5031                -1,-1)
5032                ,0)),                         -- primary_quantity
5033               MAX(wmti.primary_uom),          -- primary_uom
5034               NULL,                          -- actual_resource_rate
5035               NULL,                          -- activity_id
5036               NULL,                          -- activity_name
5037               MAX(wmti.reason_id),
5038               MAX(wmti.reason_name),
5039               MAX(wmti.reference),
5040               MAX(wmti.transaction_id),       -- move_transaction_id
5041               NULL,                          -- po_header_id
5042               NULL,                          -- po_line_id
5043               NULL                           -- repetitive_schedule_id
5044          FROM bom_departments bd,
5045               wip_move_txn_allocations wma,
5046               wip_operations wop,
5047               wip_move_txn_interface wmti,
5048               wip_operation_resources wor
5049         WHERE wmti.group_id = p_gib.group_id
5050           AND TRUNC(wmti.transaction_date) = TRUNC(p_gib.txn_date)
5051           AND wmti.process_phase = WIP_CONSTANTS.MOVE_PROC
5052           AND wmti.process_status = WIP_CONSTANTS.RUNNING
5053           AND wmti.entity_type = WIP_CONSTANTS.REPETITIVE
5054           AND wop.organization_id = wmti.organization_id
5055           AND wop.wip_entity_id = wmti.wip_entity_id
5056           AND wmti.organization_id = wma.organization_id
5057           AND wmti.transaction_id = wma.transaction_id
5058           AND wop.repetitive_schedule_id = wma.repetitive_schedule_id
5059           AND wop.organization_id = bd.organization_id
5060           AND NVL(wor.department_id, wop.department_id) = bd.department_id
5061           AND wor.organization_id = wop.organization_id
5062           AND wor.wip_entity_id = wop.wip_entity_id
5063           AND wor.operation_seq_num = wop.operation_seq_num
5064           AND wor.repetitive_schedule_id = wop.repetitive_schedule_id
5065           AND (
5066               (wop.operation_seq_num >= wmti.fm_operation_seq_num
5067               + DECODE(SIGN(wmti.fm_intraoperation_step_type -
5068                             WIP_CONSTANTS.RUN),1,1,0)
5069               AND wop.operation_seq_num < wmti.to_operation_seq_num
5070               + DECODE(SIGN(wmti.to_intraoperation_step_type -
5071                             WIP_CONSTANTS.RUN),1,1,0)
5072               AND (wmti.to_operation_seq_num > wmti.fm_operation_seq_num
5073                    OR (wmti.to_operation_seq_num = wmti.fm_operation_seq_num
5074                       AND wmti.fm_intraoperation_step_type <= WIP_CONSTANTS.RUN
5075                       AND wmti.to_intraoperation_step_type > WIP_CONSTANTS.RUN))
5076               AND (wop.count_point_type < WIP_CONSTANTS.NO_MANUAL
5077                    OR wop.operation_seq_num = wmti.fm_operation_seq_num
5078                    OR (wop.operation_seq_num = wmti.to_operation_seq_num
5079                        AND wmti.to_intraoperation_step_type >
5080                            WIP_CONSTANTS.RUN)))
5081             OR
5082               (wop.operation_seq_num < wmti.fm_operation_seq_num
5083               + DECODE(SIGN(wmti.fm_intraoperation_step_type -
5084                             WIP_CONSTANTS.RUN),1,1,0)
5085               AND wop.operation_seq_num >= wmti.to_operation_seq_num
5086               + DECODE(SIGN(wmti.to_intraoperation_step_type -
5087                             WIP_CONSTANTS.RUN),1,1,0)
5088               AND (wmti.fm_operation_seq_num > wmti.to_operation_seq_num
5089                   OR (wmti.fm_operation_seq_num = wmti.to_operation_seq_num
5090                       AND wmti.to_intraoperation_step_type <= WIP_CONSTANTS.RUN
5091                       AND wmti.fm_intraoperation_step_type > WIP_CONSTANTS.RUN))
5092               AND (wop.count_point_type < WIP_CONSTANTS.NO_MANUAL
5093                    OR wop.operation_seq_num = wmti.to_operation_seq_num
5094                    OR (wop.operation_seq_num = wmti.fm_operation_seq_num
5095                       AND wmti.fm_intraoperation_step_type >
5096                           WIP_CONSTANTS.RUN))))
5097      GROUP BY wmti.organization_id,
5098               wmti.wip_entity_id,
5099               wmti.line_id,
5100               wor.operation_seq_num,
5101               wmti.transaction_id,
5102               wor.department_id, /*fixed bug 2834503*/
5103               wop.department_id,
5104               wor.phantom_item_id,
5105               wor.phantom_op_seq_num;
5106 
5107     -- IF debug message level = 2, write statement below to log file
5108     IF (l_logLevel <= wip_constants.full_logging) THEN
5109       fnd_message.set_name('WIP', 'WIP_INSERTED_ROWS');
5110       fnd_message.set_token('ENTITY1', SQL%ROWCOUNT);
5111       fnd_message.set_token('ENTITY2', 'WIP_COST_TXN_INTERFACE');
5112       l_msg := fnd_message.get;
5113       wip_logger.log(p_msg          => l_msg,
5114                      x_returnStatus => l_returnStatus);
5115     END IF;
5116 
5117   END IF;  -- Per item basis type for repetitive schedule
5118 
5119   /*-----------------------------------------------------------------------+
5120    |  Per order basis type for discrete jobs
5121    +-----------------------------------------------------------------------*/
5122   /* Grouping wmti.source_line_id, wmti.source_code, wmti.primary_uom
5123    | wmti.reason_id, wmti.reference may not make sense since they are
5124    | tied to the transaction_id.  NULL them out [24-JUL-92, John, Djuki.
5125    | We have more than one record per op_seq because of quantity_completed
5126    +----------------------------------------------------------------------*/
5127   IF(l_move.jobTxn = WIP_CONSTANTS.YES) THEN
5128 
5129     INSERT INTO wip_cost_txn_interface
5130       (transaction_id,
5131        last_update_date,
5132        last_updated_by,
5133        last_updated_by_name,
5134        creation_date,
5135        created_by,
5136        created_by_name,
5137        last_update_login,
5138        request_id,
5139        program_application_id,
5140        program_id,
5141        program_update_date,
5142        group_id,
5143        source_code,
5144        source_line_id,
5145        process_phase,
5146        process_status,
5147        transaction_type,
5148        organization_id,
5149        organization_code,
5150        wip_entity_id,
5151        entity_type,
5152        primary_item_id,
5153        line_id,
5154        line_code,
5155        transaction_date,
5156        acct_period_id,
5157        operation_seq_num,
5158        department_id,
5159        department_code,
5160        employee_id,
5161        resource_seq_num,
5162        resource_id,
5163        resource_code,
5164        phantom_flag,
5165        usage_rate_or_amount,
5166        basis_type,
5167        autocharge_type,
5168        standard_rate_flag,
5169        transaction_quantity,
5170        transaction_uom,
5171        primary_quantity,
5172        primary_uom,
5173        actual_resource_rate,
5174        activity_id,
5175        activity_name,
5176        reason_id,
5177        reason_name,
5178        reference,
5179        move_transaction_id,
5180        po_header_id,
5181        po_line_id,
5182        repetitive_schedule_id,
5183        project_id,
5184        task_id
5185        )
5186        SELECT NULL,                          -- transaction_id
5187               SYSDATE,                       -- last_update_date
5188               MAX(wmti.last_updated_by),      -- last_updated_by --Fix for bug 5195072
5189               MAX(wmti.last_updated_by_name), -- last_updated_by_name --Fix for bug 5195072
5190               SYSDATE,                       -- creation_date
5191               MAX(wmti.created_by),           -- created_by --Fix for bug 5195072
5192               MAX(wmti.created_by_name),      -- created_by_name --Fix for bug 5195072
5193               DECODE(p_gib.login_id,-1,NULL,p_gib.login_id),
5194               DECODE(p_gib.request_id,-1,NULL,p_gib.request_id),
5195               DECODE(p_gib.application_id,-1,NULL,p_gib.application_id),
5196               DECODE(p_gib.program_id,-1,NULL,p_gib.program_id),
5197               DECODE(p_gib.request_id,-1,NULL,SYSDATE), -- program_update_date
5198               p_gib.group_id,
5199               MAX(wmti.source_code),          -- source_code
5200               MAX(wmti.source_line_id),       -- source_line_id
5201               WIP_CONSTANTS.RES_PROC,        -- process_phase
5202               WIP_CONSTANTS.PENDING,         -- process_status
5203               WIP_CONSTANTS.OVHD_TXN,        -- transaction_type
5204               wmti.organization_id,
5205               MAX(wmti.organization_code),
5206               wmti.wip_entity_id,
5207               MAX(entity_type),
5208               MAX(wmti.primary_item_id),
5209               MAX(wmti.line_id),
5210               MAX(wmti.line_code),
5211               MAX(wmti.transaction_date),
5212               MAX(wmti.acct_period_id),
5213               wop.operation_seq_num,
5214               NVL(wor.department_id, wop.department_id) ,
5215               MAX(bd.department_code),
5216               NULL,                           -- employee_id
5217               NULL,                           -- resource_seq_num
5218               NULL,                           -- resource_id
5219               NULL,                           -- resource_code
5220               MAX(wor.phantom_flag),
5221               NULL,                           -- usage_rate_or_amount
5222               WIP_CONSTANTS.PER_LOT,          -- basis_type
5223               WIP_CONSTANTS.WIP_MOVE,         -- autocharge_type
5224               NULL,                           -- standard_rate_flag
5225                 DECODE(SIGN(MAX(wop.quantity_completed) +
5226               /* Fixed bug 3740010 change from "NVL(SUM(wmti.primary_quantity"
5227                * to "NVL(MAX(wmti.primary_quantity" because there may be
5228                * multiple resources per operation.
5229                */
5230                   NVL(MAX(wmti.primary_quantity *
5231                   DECODE(SIGN(wmti.to_operation_seq_num -
5232                               wmti.fm_operation_seq_num),
5233                   0,DECODE(SIGN(wmti.fm_intraoperation_step_type -
5234                                 WIP_CONSTANTS.RUN),
5235                     0,DECODE(SIGN(wmti.to_intraoperation_step_type -
5236                                   WIP_CONSTANTS.RUN),1,1,-1),
5237                    -1,DECODE(SIGN(wmti.to_intraoperation_step_type -
5238                                   WIP_CONSTANTS.RUN),1,1,-1),
5239                     1,-1),
5240                   1, 1,
5241                  -1,-1)
5242                  ),0)),                       -- transaction_quantity
5243                 0, DECODE(SIGN(MAX(wop.quantity_completed)),1,-1,0),
5244                 1, DECODE(SIGN(MAX(wop.quantity_completed)),1,0,1),
5245                -1, DECODE(SIGN(MAX(wop.quantity_completed)),1,-1,0)),
5246               MAX(wmti.primary_uom),           -- transaction_uom
5247                  DECODE(SIGN(MAX(wop.quantity_completed) +
5248               /* Fixed bug 3740010 change from "NVL(SUM(wmti.primary_quantity"
5249                * to "NVL(MAX(wmti.primary_quantity" because there may be
5250                * multiple resources per operation.
5251                */
5252                   NVL(MAX(wmti.primary_quantity *
5253                   DECODE(SIGN(wmti.to_operation_seq_num -
5254                               wmti.fm_operation_seq_num),
5255                   0,DECODE(SIGN(wmti.fm_intraoperation_step_type -
5256                                 WIP_CONSTANTS.RUN),
5257                     0,DECODE(SIGN(wmti.to_intraoperation_step_type -
5258                                   WIP_CONSTANTS.RUN),1,1,-1),
5259                    -1,DECODE(SIGN(wmti.to_intraoperation_step_type -
5260                                   WIP_CONSTANTS.RUN),1,1,-1),
5261                     1,-1),
5262                   1, 1,
5263                  -1,-1)
5264                  ),0)),                        -- primary_quantity
5265                 0, DECODE(SIGN(MAX(wop.quantity_completed)),1,-1,0),
5266                 1, DECODE(SIGN(MAX(wop.quantity_completed)),1,0,1),
5267                -1, DECODE(SIGN(MAX(wop.quantity_completed)),1,-1,0)),
5268               MAX(wmti.primary_uom),            -- primary_uom
5269               NULL,                            -- actual_resource_rate
5270               NULL,                            -- activity_id
5271               NULL,                            -- activity_name
5272               NULL,                            -- reason_id
5273               NULL,                            -- reason_name
5274               NULL,                            -- reference
5275               MAX(wmti.transaction_id),         -- move_transaction_id
5276               NULL,                            -- po_header_id
5277               NULL,                            -- po_line_id
5278               NULL,                            -- repetitive_schedule_id
5279               MAX(wdj.project_id),
5280               MAX(wdj.task_id)
5281          FROM bom_departments bd,
5282               wip_operations wop,
5283               wip_operation_resources wor,
5284               wip_discrete_jobs wdj,
5285               wip_move_txn_interface wmti
5286         WHERE wmti.group_id = p_gib.group_id
5287           AND TRUNC(wmti.transaction_date) = TRUNC(p_gib.txn_date)
5288           AND wmti.process_phase = WIP_CONSTANTS.MOVE_PROC
5289           AND wmti.process_status = WIP_CONSTANTS.RUNNING
5290           AND (wmti.entity_type = WIP_CONSTANTS.DISCRETE
5291                OR wmti.entity_type = WIP_CONSTANTS.LOTBASED) /* WSM */
5292           AND wdj.wip_entity_id = wmti.wip_entity_id
5293           AND wdj.organization_id = wmti.organization_id
5294           AND wop.organization_id = wmti.organization_id
5295           AND wop.wip_entity_id = wmti.wip_entity_id
5296           AND wop.organization_id = bd.organization_id
5297           AND NVL(wor.department_id, wop.department_id) = bd.department_id
5298           AND wop.organization_id = wor.organization_id(+)
5299           AND wop.wip_entity_id = wor.wip_entity_id(+)
5300           AND wop.operation_seq_num = wor.operation_seq_num(+)
5301           /* added for OSFM jump enhancement 2541431 */
5302           AND NVL(wop.skip_flag, WIP_CONSTANTS.NO) <> WIP_CONSTANTS.YES
5303           /*bug 3930251 -> insert into WCTI only if there are records in CDO)*/
5304           AND EXISTS
5305              ( SELECT 1 FROM cst_department_overheads cdo
5306                 WHERE cdo.organization_id = bd.organization_id
5307                   AND cdo.department_id = bd.department_id
5308              )
5309           AND (
5310               (wop.operation_seq_num >= wmti.fm_operation_seq_num
5311               + DECODE(SIGN(wmti.fm_intraoperation_step_type -
5312                             WIP_CONSTANTS.RUN),1,1,0)
5313               AND wop.operation_seq_num < wmti.to_operation_seq_num
5314               + DECODE(SIGN(wmti.to_intraoperation_step_type -
5315                             WIP_CONSTANTS.RUN),1,1,0)
5316               AND (wmti.to_operation_seq_num > wmti.fm_operation_seq_num
5317                    OR (wmti.to_operation_seq_num = wmti.fm_operation_seq_num
5318                       AND wmti.fm_intraoperation_step_type <= WIP_CONSTANTS.RUN
5319                       AND wmti.to_intraoperation_step_type > WIP_CONSTANTS.RUN))
5320               AND (wop.count_point_type < WIP_CONSTANTS.NO_MANUAL
5321                    OR wop.operation_seq_num = wmti.fm_operation_seq_num
5322                    OR (wop.operation_seq_num = wmti.to_operation_seq_num
5323                        AND wmti.to_intraoperation_step_type >
5324                            WIP_CONSTANTS.RUN)))
5325             OR
5326               (wop.operation_seq_num < wmti.fm_operation_seq_num
5327               + DECODE(SIGN(wmti.fm_intraoperation_step_type -
5328                             WIP_CONSTANTS.RUN),1,1,0)
5329               AND wop.operation_seq_num >= wmti.to_operation_seq_num
5330               + DECODE(SIGN(wmti.to_intraoperation_step_type -
5331                             WIP_CONSTANTS.RUN),1,1,0)
5332               AND (wmti.fm_operation_seq_num > wmti.to_operation_seq_num
5333                    OR (wmti.fm_operation_seq_num = wmti.to_operation_seq_num
5334                       AND wmti.to_intraoperation_step_type <= WIP_CONSTANTS.RUN
5335                       AND wmti.fm_intraoperation_step_type > WIP_CONSTANTS.RUN))
5336               AND (wop.count_point_type < WIP_CONSTANTS.NO_MANUAL
5337                   OR wop.operation_seq_num = wmti.to_operation_seq_num
5338                   OR (wop.operation_seq_num = wmti.fm_operation_seq_num
5339                      AND wmti.fm_intraoperation_step_type >
5340                          WIP_CONSTANTS.RUN))))
5341      GROUP BY wmti.organization_id,
5342               wmti.wip_entity_id,
5343               wop.operation_seq_num,
5344               wor.phantom_item_id, --Bug 5213164:Added to take care of multiple phantoms
5345               wor.phantom_op_seq_num, --Bug 5213164
5346               wor.department_id, /*fixed bug 2834503*/
5347               wop.department_id
5348        HAVING 0 <>
5349               DECODE(SIGN(MAX(wop.quantity_completed) +
5350               /* Fixed bug 3740010 change from "NVL(SUM(wmti.primary_quantity"
5351                * to "NVL(MAX(wmti.primary_quantity" because there may be
5352                * multiple resources per operation.
5353                */
5354                               NVL(MAX(wmti.primary_quantity *
5355                 DECODE(SIGN(wmti.to_operation_seq_num -
5356                             wmti.fm_operation_seq_num),
5357                 0,DECODE(SIGN(wmti.fm_intraoperation_step_type -
5358                               WIP_CONSTANTS.RUN),
5359                   0,DECODE(SIGN(wmti.to_intraoperation_step_type -
5360                                 WIP_CONSTANTS.RUN),1,1,-1),
5361                  -1,DECODE(SIGN(wmti.to_intraoperation_step_type -
5362                                 WIP_CONSTANTS.RUN),1,1,-1),
5363                   1,-1),
5364                 1, 1,
5365                -1,-1)
5366                 ),0)),     -- NVL
5367               0, DECODE(SIGN(MAX(wop.quantity_completed)),1,-1,0),
5368               1, DECODE(sign(MAX(wop.quantity_completed)),1,0,1),
5369              -1, DECODE(sign(MAX(wop.quantity_completed)),1,-1,0));
5370 
5371     -- IF debug message level = 2, write statement below to log file
5372     IF (l_logLevel <= wip_constants.full_logging) THEN
5373       fnd_message.set_name('WIP', 'WIP_INSERTED_ROWS');
5374       fnd_message.set_token('ENTITY1', SQL%ROWCOUNT);
5375       fnd_message.set_token('ENTITY2', 'WIP_COST_TXN_INTERFACE');
5376       l_msg := fnd_message.get;
5377       wip_logger.log(p_msg          => l_msg,
5378                      x_returnStatus => l_returnStatus);
5379     END IF;
5380 
5381   END IF; -- Per order basis type for discrete jobs
5382 
5383   -- Per order basis type for repetitive
5384   IF(l_move.scheTxn = WIP_CONSTANTS.YES) THEN
5385 
5386     INSERT INTO wip_cost_txn_interface
5387       (transaction_id,
5388        last_update_date,
5389        last_updated_by,
5390        last_updated_by_name,
5391        creation_date,
5392        created_by,
5393        created_by_name,
5394        last_update_login,
5395        request_id,
5396        program_application_id,
5397        program_id,
5398        program_update_date,
5399        group_id,
5400        source_code,
5401        source_line_id,
5402        process_phase,
5403        process_status,
5404        transaction_type,
5405        organization_id,
5406        organization_code,
5407        wip_entity_id,
5408        entity_type,
5409        primary_item_id,
5410        line_id,
5411        line_code,
5412        transaction_date,
5413        acct_period_id,
5414        operation_seq_num,
5415        department_id,
5416        department_code,
5417        employee_id,
5418        resource_seq_num,
5419        resource_id,
5420        resource_code,
5421        phantom_flag,
5422        usage_rate_or_amount,
5423        basis_type,
5424        autocharge_type,
5425        standard_rate_flag,
5426        transaction_quantity,
5427        transaction_uom,
5428        primary_quantity,
5429        primary_uom,
5430        actual_resource_rate,
5431        activity_id,
5432        activity_name,
5433        reason_id,
5434        reason_name,
5435        reference,
5436        move_transaction_id,
5437        po_header_id,
5438        po_line_id,
5439        repetitive_schedule_id
5440        )
5441        SELECT NULL,                          -- transaction_id
5442               SYSDATE,                       -- last_update_date
5443               MAX(wmti.last_updated_by),      -- last_updated_by --Fix for bug 5195072
5444               MAX(wmti.last_updated_by_name), -- last_updated_by_name --Fix for bug 5195072
5445               SYSDATE,                       -- creation_date
5446               MAX(wmti.created_by),           -- created_by --Fix for bug 5195072
5447               MAX(wmti.created_by_name),      -- created_by_name --Fix for bug 5195072
5448               DECODE(p_gib.login_id,-1,NULL,p_gib.login_id),
5449               DECODE(p_gib.request_id,-1,NULL,p_gib.request_id),
5450               DECODE(p_gib.application_id,-1,NULL,p_gib.application_id),
5451               DECODE(p_gib.program_id,-1,NULL,p_gib.program_id),
5452               DECODE(p_gib.request_id,-1,NULL,SYSDATE), -- program_update_date
5453               p_gib.group_id,
5454               MAX(wmti.source_code),          -- source_code
5455               -- Fixed bug 2465148
5456               MAX(wmti.source_line_id),       -- source_line_id
5457               WIP_CONSTANTS.RES_PROC,        -- process_phase
5458               WIP_CONSTANTS.PENDING,         -- process_status
5459               WIP_CONSTANTS.OVHD_TXN,        -- transaction_type
5460               wmti.organization_id,
5461               MAX(wmti.organization_code),
5462               wmti.wip_entity_id,
5463               MAX(entity_type),
5464               MAX(wmti.primary_item_id),
5465               wmti.line_id,
5466               MAX(wmti.line_code),
5467               MAX(wmti.transaction_date),
5468               MAX(wmti.acct_period_id),
5469               wor.operation_seq_num,
5470               NVL(wor.department_id, wop.department_id),
5471               MAX(bd.department_code),
5472               NULL,                          -- employee_id
5473               NULL,                          -- resource_seq_num
5474               NULL,                          -- resource_id
5475               NULL,                          -- resource_code
5476               MAX(wor.phantom_flag),
5477               NULL,                          -- usage_rate_or_amount
5478               WIP_CONSTANTS.PER_LOT,         -- basis_type
5479               WIP_CONSTANTS.WIP_MOVE,        -- autocharge_type
5480               NULL,                          -- standard_rate_flag
5481               1,                             -- transaction_quantity
5482               MAX(wmti.primary_uom),          -- transaction_uom
5483               1,                             -- primary_quantity
5484               MAX(wmti.primary_uom),          -- primary_uom
5485               NULL,                          -- actual_resource_rate
5486               NULL,                          -- activity_id
5487               NULL,                          -- activity_name
5488               NULL,                          -- reason_id
5489               NULL,                          -- reason_name
5490               -- Fixed bug 2506653
5491               MAX(wmti.reference),            -- reference
5492               MAX(wmti.transaction_id),       -- move_transaction_id
5493               NULL,                          -- po_header_id
5494               NULL,                          -- po_line_id
5495               wma.repetitive_schedule_id
5496          FROM bom_departments bd,
5497               wip_move_txn_allocations wma,
5498               wip_operations wop,
5499               wip_move_txn_interface wmti,
5500               wip_operation_resources wor
5501         WHERE wmti.group_id = p_gib.group_id
5502           AND TRUNC(wmti.transaction_date) = TRUNC(p_gib.txn_date)
5503           AND wmti.process_phase = WIP_CONSTANTS.MOVE_PROC
5504           AND wmti.process_status = WIP_CONSTANTS.RUNNING
5505           AND wmti.entity_type = WIP_CONSTANTS.REPETITIVE
5506           AND wop.organization_id = wmti.organization_id
5507           AND wop.wip_entity_id = wmti.wip_entity_id
5508           AND wop.repetitive_schedule_id = wma.repetitive_schedule_id
5509           AND wmti.organization_id = wma.organization_id
5510           AND wmti.transaction_id = wma.transaction_id
5511           AND wop.organization_id = bd.organization_id
5512           AND NVL(wor.department_id, wop.department_id) = bd.department_id
5513           AND wor.organization_id = wop.organization_id
5514           AND wor.wip_entity_id = wop.wip_entity_id
5515           AND wor.operation_seq_num = wop.operation_seq_num
5516           AND wor.repetitive_schedule_id = wop.repetitive_schedule_id
5517           AND (
5518               (wop.operation_seq_num >= wmti.fm_operation_seq_num
5519               + DECODE(SIGN(wmti.fm_intraoperation_step_type -
5520                             WIP_CONSTANTS.RUN),1,1,0)
5521               AND wop.operation_seq_num < wmti.to_operation_seq_num
5522               + DECODE(SIGN(wmti.to_intraoperation_step_type -
5523                             WIP_CONSTANTS.RUN),1,1,0)
5524               AND (wmti.to_operation_seq_num > wmti.fm_operation_seq_num
5525                    OR (wmti.to_operation_seq_num = wmti.fm_operation_seq_num
5526                       AND wmti.fm_intraoperation_step_type <= WIP_CONSTANTS.RUN
5527                       AND wmti.to_intraoperation_step_type > WIP_CONSTANTS.RUN))
5528               AND (wop.count_point_type < WIP_CONSTANTS.NO_MANUAL
5529                    OR wop.operation_seq_num = wmti.fm_operation_seq_num
5530                    OR (wop.operation_seq_num = wmti.to_operation_seq_num
5531                        AND wmti.to_intraoperation_step_type >
5532                            WIP_CONSTANTS.RUN)))
5533             OR
5534               (wop.operation_seq_num < wmti.fm_operation_seq_num
5535               + DECODE(SIGN(wmti.fm_intraoperation_step_type -
5536                             WIP_CONSTANTS.RUN),1,1,0)
5537               AND wop.operation_seq_num >= wmti.to_operation_seq_num
5538               + DECODE(SIGN(wmti.to_intraoperation_step_type -
5539                             WIP_CONSTANTS.RUN),1,1,0)
5540               AND (wmti.fm_operation_seq_num > wmti.to_operation_seq_num
5541                    OR (wmti.fm_operation_seq_num = wmti.to_operation_seq_num
5542                       AND wmti.to_intraoperation_step_type <= WIP_CONSTANTS.RUN
5543                       AND wmti.fm_intraoperation_step_type > WIP_CONSTANTS.RUN))
5544               AND (wop.count_point_type < WIP_CONSTANTS.NO_MANUAL
5545                   OR wop.operation_seq_num = wmti.to_operation_seq_num
5546                   OR (wop.operation_seq_num = wmti.fm_operation_seq_num
5547                      AND wmti.fm_intraoperation_step_type >
5548                          WIP_CONSTANTS.RUN))))
5549      GROUP BY wmti.organization_id,
5550               wmti.wip_entity_id,
5551               wmti.line_id,
5552               wma.repetitive_schedule_id,
5553               wor.operation_seq_num,
5554               wor.department_id, /*fixed bug 2834503*/
5555               wop.department_id,
5556               wor.phantom_item_id,
5557               wor.phantom_op_seq_num
5558        HAVING 0 <>
5559               DECODE(SIGN(MAX(wop.quantity_completed) +
5560                               NVL(SUM(wma.primary_quantity *
5561                 DECODE(SIGN(wmti.to_operation_seq_num -
5562                             wmti.fm_operation_seq_num),
5563                 0,DECODE(SIGN(wmti.fm_intraoperation_step_type -
5564                               WIP_CONSTANTS.RUN),
5565                   0,DECODE(SIGN(wmti.to_intraoperation_step_type -
5566                                 WIP_CONSTANTS.RUN),1,1,-1),
5567                  -1,DECODE(SIGN(wmti.to_intraoperation_step_type -
5568                                 WIP_CONSTANTS.RUN),1,1,-1),
5569                   1,-1),
5570                 1, 1,
5571                -1,-1)
5572                ),0)),
5573               0, DECODE(SIGN(MAX(wop.quantity_completed)),1,-1,0),
5574               1, DECODE(sign(MAX(wop.quantity_completed)),1,0,1),
5575              -1, DECODE(sign(MAX(wop.quantity_completed)),1,-1,0));
5576 
5577     -- IF debug message level = 2, write statement below to log file
5578     IF (l_logLevel <= wip_constants.full_logging) THEN
5579       fnd_message.set_name('WIP', 'WIP_INSERTED_ROWS');
5580       fnd_message.set_token('ENTITY1', SQL%ROWCOUNT);
5581       fnd_message.set_token('ENTITY2', 'WIP_COST_TXN_INTERFACE');
5582       l_msg := fnd_message.get;
5583       wip_logger.log(p_msg          => l_msg,
5584                      x_returnStatus => l_returnStatus);
5585     END IF;
5586 
5587   END IF;   -- Per order basis type for repetitive
5588 
5589 
5590   /*------------------------------------------------------------+
5591    |  Generate transaction_id for WIP_TXN_ALLOCATIONS     |
5592    +------------------------------------------------------------*/
5593   UPDATE wip_cost_txn_interface
5594      SET transaction_id = wip_transactions_s.nextval
5595    WHERE group_id = p_gib.group_id
5596      AND TRUNC(transaction_date) = TRUNC(p_gib.txn_date)
5597      AND transaction_type = WIP_CONSTANTS.OVHD_TXN;
5598 
5599   -- IF debug message level = 2, write statement below to log file
5600   IF (l_logLevel <= wip_constants.full_logging) THEN
5601     fnd_message.set_name('WIP', 'WIP_UPDATED_ROWS');
5602     fnd_message.set_token('ENTITY1', SQL%ROWCOUNT);
5603     fnd_message.set_token('ENTITY2', 'WIP_COST_TXN_INTERFACE');
5604     l_msg := fnd_message.get;
5605     wip_logger.log(p_msg          => l_msg,
5606                      x_returnStatus => l_returnStatus);
5607   END IF;
5608 
5609   -- For repetitive
5610   IF(l_move.scheTxn = WIP_CONSTANTS.YES) THEN
5611 
5612    /*------------------------------------------------------------+
5613     |  Insert into cost allocations for repetitive schedules     |
5614     |  per lot
5615     +------------------------------------------------------------*/
5616 
5617    /*------------------------------------------------------------+
5618     |  Columns to insert into WIP_TXN_ALLOCATIONS                |
5619     |                                                            |
5620     |  transaction_id,                                           |
5621     |  repetitive_schedule_id, organization_id,                  |
5622     |  last_update_date, last_updated_by, creation_date,         |
5623     |  created_by, last_update_login, request_id,                |
5624     |  program_application_id, program_id, program_update_date,  |
5625     |  transaction_quantity,                                     |
5626     |  primary_quantity,                                         |
5627     |                                                            |
5628     +------------------------------------------------------------*/
5629     INSERT INTO wip_txn_allocations
5630       (transaction_id,
5631        repetitive_schedule_id,
5632        organization_id,
5633        last_update_date,
5634        last_updated_by,
5635        creation_date,
5636        created_by,
5637        last_update_login,
5638        request_id,
5639        program_application_id,
5640        program_id,
5641        program_update_date,
5642        transaction_quantity,
5643        primary_quantity
5644        )
5645        SELECT wci.transaction_id,
5646               wma.repetitive_schedule_id,
5647               MAX(wmti.organization_id),
5648               SYSDATE,                         -- last_update_date
5649               MAX(wmti.last_updated_by),        -- last_updated_by --Fix for bug 5195072
5650               SYSDATE,                         -- creation_date
5651               MAX(wmti.created_by),             -- created_by --Fix for bug 5195072
5652               DECODE(p_gib.login_id,-1,NULL,p_gib.login_id),
5653               DECODE(p_gib.request_id,-1,NULL,p_gib.request_id),
5654               DECODE(p_gib.application_id,-1,NULL,p_gib.application_id),
5655               DECODE(p_gib.program_id,-1,NULL,p_gib.program_id),
5656               DECODE(p_gib.request_id,-1,NULL,SYSDATE), -- program_update_date
5657               DECODE(SIGN(MAX(wop.quantity_completed) +
5658                               NVL(SUM(wma.primary_quantity *
5659                 DECODE(SIGN(wmti.to_operation_seq_num -
5660                             wmti.fm_operation_seq_num),
5661                 0,DECODE(SIGN(wmti.fm_intraoperation_step_type -
5662                               WIP_CONSTANTS.RUN),
5663                   0,DECODE(SIGN(wmti.to_intraoperation_step_type -
5664                                 WIP_CONSTANTS.RUN),1,1,-1),
5665                  -1,DECODE(SIGN(wmti.to_intraoperation_step_type -
5666                                 WIP_CONSTANTS.RUN),1,1,-1),
5667                   1,-1),
5668                 1, 1,
5669                -1,-1)
5670                 ),0)),                   -- transaction_quantity
5671               0, DECODE(SIGN(MAX(wop.quantity_completed)),1,-1,0),
5672               1, DECODE(SIGN(MAX(wop.quantity_completed)),1,0,1),
5673              -1, DECODE(SIGN(MAX(wop.quantity_completed)),1,-1,0)),
5674                DECODE(SIGN(MAX(wop.quantity_completed) +
5675                               NVL(SUM(wma.primary_quantity *
5676                 DECODE(SIGN(wmti.to_operation_seq_num -
5677                             wmti.fm_operation_seq_num),
5678                 0,DECODE(SIGN(wmti.fm_intraoperation_step_type -
5679                               WIP_CONSTANTS.RUN),
5680                   0,DECODE(SIGN(wmti.to_intraoperation_step_type -
5681                                 WIP_CONSTANTS.RUN),1,1,-1),
5682                  -1,DECODE(SIGN(wmti.to_intraoperation_step_type -
5683                                 WIP_CONSTANTS.RUN),1,1,-1),
5684                   1,-1),
5685                 1, 1,
5686                -1,-1)
5687                 ),0)),                   -- primary_quantity
5688               0, DECODE(SIGN(MAX(wop.quantity_completed)),1,-1,0),
5689               1, DECODE(SIGN(MAX(wop.quantity_completed)),1,0,1),
5690              -1, DECODE(SIGN(MAX(wop.quantity_completed)),1,-1,0))
5691          FROM wip_move_txn_allocations wma,
5692               wip_operations wop,
5693               wip_cost_txn_interface wci,
5694               wip_move_txn_interface wmti
5695         WHERE wmti.group_id = p_gib.group_id
5696           AND TRUNC(wmti.transaction_date) = TRUNC(p_gib.txn_date)
5697           AND wmti.process_phase = WIP_CONSTANTS.MOVE_PROC
5698           AND wmti.process_status = WIP_CONSTANTS.RUNNING
5699           AND wmti.entity_type = WIP_CONSTANTS.REPETITIVE
5700           AND wmti.group_id = wci.group_id
5701           AND wci.organization_id = wmti.organization_id
5702           AND wci.wip_entity_id = wmti.wip_entity_id
5703           AND wci.operation_seq_num = wop.operation_seq_num
5704           AND wci.basis_type = WIP_CONSTANTS.PER_LOT
5705           AND wci.transaction_type = WIP_CONSTANTS.OVHD_TXN
5706           AND wop.organization_id = wmti.organization_id
5707           AND wop.wip_entity_id = wmti.wip_entity_id
5708           AND wop.repetitive_schedule_id = wma.repetitive_schedule_id
5709           AND wmti.organization_id = wma.organization_id
5710           AND wmti.transaction_id = wma.transaction_id
5711           AND wci.repetitive_schedule_id = wma.repetitive_schedule_id
5712      GROUP BY wci.transaction_id,
5713               wma.repetitive_schedule_id;
5714 
5715     -- IF debug message level = 2, write statement below to log file
5716     IF (l_logLevel <= wip_constants.full_logging) THEN
5717       fnd_message.set_name('WIP', 'WIP_INSERTED_ROWS');
5718       fnd_message.set_token('ENTITY1', SQL%ROWCOUNT);
5719       fnd_message.set_token('ENTITY2', 'WIP_TXN_ALLOCATIONS');
5720       l_msg := fnd_message.get;
5721       wip_logger.log(p_msg          => l_msg,
5722                      x_returnStatus => l_returnStatus);
5723     END IF;
5724 
5725   END IF;   -- For repetitive
5726 
5727   x_returnStatus := fnd_api.g_ret_sts_success;
5728 
5729   -- write to the log file
5730   IF (l_logLevel <= wip_constants.trace_logging) THEN
5731     wip_logger.exitPoint(p_procName => 'wip_movProc_priv.insert_dept_overhead',
5732                          p_procReturnStatus => x_returnStatus,
5733                          p_msg => 'procedure complete',
5734                          x_returnStatus => l_returnStatus);
5735   END IF;
5736 
5737 EXCEPTION
5738   WHEN others THEN
5739     x_returnStatus := fnd_api.g_ret_sts_unexp_error;
5740     l_errMsg := 'unexpected error: ' || SQLERRM || 'SQLCODE = ' || SQLCODE;
5741 
5742     IF (l_logLevel <= wip_constants.trace_logging) THEN
5743       wip_logger.exitPoint(p_procName=>'wip_movProc_priv.insert_dept_overhead',
5744                            p_procReturnStatus => x_returnStatus,
5745                            p_msg => l_errMsg,
5746                            x_returnStatus => l_returnStatus);
5747     END IF;
5748     fnd_message.set_name('FND', 'FND_GENERIC_MESSAGE');
5749     fnd_message.set_token('MESSAGE', l_errMsg);
5750     fnd_msg_pub.add;
5751 END insert_dept_overhead;
5752 
5753 /*****************************************************************************
5754  * This procedure is equivalent to witpsrt_release_cost_txns in wiltps3.ppc
5755  * This procedure is used to set group_id in wip_cost_txn_interface to be NULL
5756  * so that Costing Manager will pick up the records.
5757  ****************************************************************************/
5758 PROCEDURE release_cost_txn(p_gib           IN        group_rec_t,
5759                            x_returnStatus OUT NOCOPY VARCHAR2) IS
5760 
5761 l_params       wip_logger.param_tbl_t;
5762 l_returnStatus VARCHAR(1);
5763 l_msg          VARCHAR(240);
5764 l_errMsg       VARCHAR2(240);
5765 l_logLevel     NUMBER := fnd_log.g_current_runtime_level;
5766 
5767 BEGIN
5768   -- write parameter value to log file
5769   IF (l_logLevel <= wip_constants.trace_logging) THEN
5770     l_params(1).paramName   := 'p_group_id';
5771     l_params(1).paramValue  :=  p_gib.group_id;
5772     l_params(2).paramName   := 'p_txn_date';
5773     l_params(2).paramValue  :=  p_gib.txn_date;
5774     wip_logger.entryPoint(p_procName =>'wip_movProc_priv.release_cost_txn',
5775                           p_params => l_params,
5776                           x_returnStatus => l_returnStatus);
5777   END IF;
5778 
5779   UPDATE wip_cost_txn_interface
5780      SET group_id = NULL
5781    WHERE group_id = p_gib.group_id
5782      AND TRUNC(transaction_date) = TRUNC(p_gib.txn_date);
5783 
5784   -- IF debug message level = 2, write statement below to log file
5785   IF (l_logLevel <= wip_constants.full_logging) THEN
5786     fnd_message.set_name('WIP', 'WIP_UPDATED_ROWS');
5787     fnd_message.set_token('ENTITY1', SQL%ROWCOUNT);
5788     fnd_message.set_token('ENTITY2', 'WIP_COST_TXN_INTERFACE');
5789     l_msg := fnd_message.get;
5790     wip_logger.log(p_msg          => l_msg,
5791                    x_returnStatus => l_returnStatus);
5792   END IF;
5793 
5794   x_returnStatus := fnd_api.g_ret_sts_success;
5795 
5796   -- write to the log file
5797   IF (l_logLevel <= wip_constants.trace_logging) THEN
5798     wip_logger.exitPoint(p_procName => 'wip_movProc_priv.release_cost_txn',
5799                          p_procReturnStatus => x_returnStatus,
5800                          p_msg => 'procedure complete',
5801                          x_returnStatus => l_returnStatus);
5802   END IF;
5803 
5804 EXCEPTION
5805   WHEN others THEN
5806     x_returnStatus := fnd_api.g_ret_sts_unexp_error;
5807     l_errMsg := 'unexpected error: ' || SQLERRM || 'SQLCODE = ' || SQLCODE;
5808 
5809     IF (l_logLevel <= wip_constants.trace_logging) THEN
5810       wip_logger.exitPoint(p_procName=>'wip_movProc_priv.release_cost_txn',
5811                            p_procReturnStatus => x_returnStatus,
5812                            p_msg => l_errMsg,
5813                            x_returnStatus => l_returnStatus);
5814     END IF;
5815     fnd_message.set_name('FND', 'FND_GENERIC_MESSAGE');
5816     fnd_message.set_token('MESSAGE', l_errMsg);
5817     fnd_msg_pub.add;
5818 END release_cost_txn;
5819 
5820 /*****************************************************************************
5821  * This procedure is equivalent to witpspr_po_req in wiltps4.ppc
5822  * This procedure is used to insert purchase order requisition into
5823  * PO_REQUISITIONS_INTERFACE_ALL
5824  * NOTES:
5825  *  IF the purchase item lead time falls outside of BOM_CALENDAR_DATES
5826  *  THEN no PO req will be created
5827  ****************************************************************************/
5828 PROCEDURE insert_po_req(p_gib           IN        group_rec_t,
5829                         x_returnStatus OUT NOCOPY VARCHAR2) IS
5830 
5831 CURSOR c_additional_reqs(p_group_id NUMBER) IS
5832   SELECT distinct wmti.wip_entity_id wip_id,
5833          wmti.repetitive_schedule_id rep_sched_id,
5834          wmti.organization_id org_id,
5835          wo.operation_seq_num op_seq_num,
5836          wmti.overcompletion_primary_qty oc_qty
5837     FROM wip_move_txn_interface wmti,
5838          wip_operations wo,
5839          wip_operation_resources wor,
5840          wip_discrete_jobs wdj
5841    WHERE wmti.group_id = p_group_id
5842      AND wmti.process_phase = WIP_CONSTANTS.MOVE_PROC
5843      AND wmti.process_status = WIP_CONSTANTS.RUNNING
5844      AND wmti.overcompletion_transaction_qty IS NOT NULL
5845      AND wdj.wip_entity_id = wmti.wip_entity_id
5846      AND wdj.organization_id = wmti.organization_id
5847      AND wdj.po_creation_time = WIP_CONSTANTS.AT_JOB_SCHEDULE_RELEASE
5848      AND wo.wip_entity_id = wmti.wip_entity_id
5849      AND wo.organization_id = wmti.organization_id
5850      AND wo.operation_seq_num > wmti.fm_operation_seq_num
5851      AND wo.count_point_type <> WIP_CONSTANTS.NO_MANUAL
5852      AND wor.wip_entity_id = wo.wip_entity_id
5853      AND wor.organization_id = wo.organization_id
5854      AND wor.operation_seq_num = wo.operation_seq_num
5855      AND wor.autocharge_type in (WIP_CONSTANTS.PO_RECEIPT,
5856                                  WIP_CONSTANTS.PO_MOVE)
5857      AND wor.basis_type = WIP_CONSTANTS.PER_ITEM
5858 
5859    UNION
5860 
5861   SELECT distinct wmti.wip_entity_id wip_id,
5862                wmti.repetitive_schedule_id rep_sched_id,
5863          wmti.organization_id org_id,
5864          wo.operation_seq_num op_seq_num,
5865          wmti.overcompletion_primary_qty oc_qty
5866     FROM wip_move_txn_interface wmti,
5867          wip_operations wo,
5868          wip_operation_resources wor,
5869          wip_repetitive_schedules wrs
5870    WHERE wmti.group_id = p_group_id
5871      AND wmti.process_phase = WIP_CONSTANTS.MOVE_PROC
5872      AND wmti.process_status = WIP_CONSTANTS.RUNNING
5873      AND wmti.overcompletion_transaction_qty IS NOT NULL
5874      AND wrs.wip_entity_id = wmti.wip_entity_id
5875      AND wrs.repetitive_schedule_id = wmti.repetitive_schedule_id
5876      AND wrs.organization_id = wmti.organization_id
5877      AND wrs.po_creation_time = WIP_CONSTANTS.AT_JOB_SCHEDULE_RELEASE
5878      AND wo.wip_entity_id = wmti.wip_entity_id
5879      AND wo.repetitive_schedule_id = wmti.repetitive_schedule_id
5880      AND wo.organization_id = wmti.organization_id
5881      AND wo.operation_seq_num > wmti.fm_operation_seq_num
5882      AND wo.count_point_type <> WIP_CONSTANTS.NO_MANUAL
5883      AND wor.wip_entity_id = wo.wip_entity_id
5884      AND wor.organization_id = wo.organization_id
5885      AND wor.repetitive_schedule_id = wmti.repetitive_schedule_id
5886      AND wor.operation_seq_num = wo.operation_seq_num
5887      AND wor.autocharge_type in (WIP_CONSTANTS.PO_RECEIPT,
5888                                  WIP_CONSTANTS.PO_MOVE)
5889      AND wor.basis_type = WIP_CONSTANTS.PER_ITEM ;
5890 
5891 
5892 l_params       wip_logger.param_tbl_t;
5893 l_returnStatus VARCHAR(1);
5894 l_msg          VARCHAR(240);
5895 l_errMsg       VARCHAR2(240);
5896 l_additional_reqs c_additional_reqs%ROWTYPE;
5897 l_move         move_profile_rec_t;
5898 l_logLevel     NUMBER := fnd_log.g_current_runtime_level;
5899 
5900 BEGIN
5901   l_move := p_gib.move_profile;
5902 
5903   -- write parameter value to log file
5904   IF (l_logLevel <= wip_constants.trace_logging) THEN
5905     l_params(1).paramName   := 'p_group_id';
5906     l_params(1).paramValue  :=  p_gib.group_id;
5907     l_params(2).paramName   := 'p_txn_date';
5908     l_params(2).paramValue  :=  p_gib.txn_date;
5909     l_params(3).paramName   := 'org_id';
5910     l_params(3).paramValue  :=  l_move.org_id;
5911     l_params(4).paramName   := 'wip_id';
5912     l_params(4).paramValue  :=  l_move.wip_id;
5913     l_params(5).paramName   := 'fmOp';
5914     l_params(5).paramValue  :=  l_move.fmOp;
5915     l_params(6).paramName   := 'fmStep';
5916     l_params(6).paramValue  :=  l_move.fmStep;
5917     l_params(7).paramName   := 'toOp';
5918     l_params(7).paramValue  :=  l_move.toOp;
5919     l_params(8).paramName   := 'toStep';
5920     l_params(8).paramValue  :=  l_move.toStep;
5921     l_params(9).paramName   := 'scrapTxn';
5922     l_params(9).paramValue  :=  l_move.scrapTxn;
5923     l_params(10).paramName  := 'easyComplete';
5924     l_params(10).paramValue :=  l_move.easyComplete;
5925     l_params(11).paramName  := 'easyReturn';
5926     l_params(11).paramValue :=  l_move.easyReturn;
5927     l_params(12).paramName  := 'jobTxn';
5928     l_params(12).paramValue :=  l_move.jobTxn;
5929     l_params(13).paramName  := 'scheTxn';
5930     l_params(13).paramValue :=  l_move.scheTxn;
5931     l_params(14).paramName  := 'rsrcItem';
5932     l_params(14).paramValue :=  l_move.rsrcItem;
5933     l_params(15).paramName  := 'rsrcLot';
5934     l_params(15).paramValue :=  l_move.rsrcLot;
5935     l_params(16).paramName  := 'poReqItem';
5936     l_params(16).paramValue :=  l_move.poReqItem;
5937     l_params(17).paramName  := 'poRegLot';
5938     l_params(17).paramValue :=  l_move.poReqLot;
5939 
5940     wip_logger.entryPoint(p_procName =>'wip_movProc_priv.insert_po_req',
5941                           p_params => l_params,
5942                           x_returnStatus => l_returnStatus);
5943   END IF;
5944 
5945   /*------------------------------------------------------------+
5946    |  Insert into PO_REQUISITIONS_INTERFACE_ALL table for per item for jobs
5947    +------------------------------------------------------------*/
5948   IF(l_move.jobTxn    = WIP_CONSTANTS.YES AND
5949      l_move.poReqItem = WIP_CONSTANTS.YES) THEN
5950 
5951     -- Fixed bug 5144659. Insert into po_requisitions_interface_all instead of
5952     -- po_requisitions_interface as part of MOAC change.
5953     INSERT INTO po_requisitions_interface_all
5954       (last_update_date,
5955        last_updated_by,
5956        creation_date,
5957        created_by,
5958        last_update_login,
5959        request_id,
5960        program_application_id,
5961        program_id,
5962        program_update_date,
5963        org_id,  /* Operating unit org */
5964        preparer_id,
5965        interface_source_code,
5966        authorization_status,
5967        source_type_code,
5968        destination_organization_id,
5969        destination_type_code,
5970        item_id,
5971        item_revision,
5972        uom_code,
5973        quantity,
5974        line_type_id,
5975        charge_account_id,
5976        deliver_to_location_id,
5977        deliver_to_requestor_id,
5978        wip_entity_id,
5979        wip_line_id,
5980        wip_operation_seq_num,
5981        wip_resource_seq_num,
5982        bom_resource_id,
5983        wip_repetitive_schedule_id,
5984        need_by_date,
5985        autosource_flag,
5986        group_code,
5987        suggested_buyer_id,
5988        project_id,
5989        task_id,
5990        project_accounting_context
5991        )
5992        SELECT /*bugfix 5345712 : performance fix. removed hint */
5993               SYSDATE,                   -- last_update_date
5994               wmti.last_updated_by,      -- last_updated_by --Fix for bug 5195072
5995               SYSDATE,                   -- creation_date
5996               wmti.created_by,           -- created_by --Fix for bug 5195072
5997               DECODE(p_gib.login_id,-1,NULL,p_gib.login_id),
5998               DECODE(p_gib.request_id,-1,NULL,p_gib.request_id),
5999               DECODE(p_gib.application_id,-1,NULL,p_gib.application_id),
6000               DECODE(p_gib.program_id,-1,NULL,p_gib.program_id),
6001               DECODE(p_gib.request_id,-1,NULL,SYSDATE), -- program_update_date
6002               to_number(hoi.org_information3),        -- ou_org_id
6003               fu.employee_id,            -- preparer_id
6004               'WIP',                     -- interface_source_code
6005               NVL(wp.po_creation_status, 'APPROVED'),  -- authorization_status  /*ER 4276433*/
6006               'VENDOR',                  -- source_type_code
6007               wor.organization_id,       -- destination_organization_id
6008               'SHOP FLOOR',              -- destination_type_code
6009               br.purchase_item_id,       -- item_id
6010               DECODE(msi.revision_qty_control_code, -- item_revision
6011                1, NULL,
6012                2, DECODE(br.purchase_item_id,
6013                         wdj.primary_item_id, wdj.bom_revision,
6014                         BOM_revisions.GET_ITEM_REVISION_FN
6015                                ('EXCLUDE_OPEN_HOLD',        -- eco_status
6016                                 'ALL',                      -- examine_type
6017                                  br.ORGANIZATION_ID,        -- org_id
6018                                  br.purchase_item_id,       -- item_id
6019                                  wmti.transaction_date   -- rev_date /*Bug 14286109*/
6020                                       ))), /* Fixed Bug# 1623063 */
6021               msi.primary_uom_code,       -- uom_code
6022               DECODE(msi.outside_operation_uom_type, -- quantity
6023                'RESOURCE',ROUND(wor.usage_rate_or_amount*wmti.primary_quantity,
6024                                 WIP_CONSTANTS.INV_MAX_PRECISION),
6025                'ASSEMBLY',wmti.primary_quantity),
6026               3,                          -- line_type_id
6027               wdj.outside_processing_account, -- charge_account_id
6028               bd.location_id,             -- deliver_to_location_id
6029               fu.employee_id,             -- deliver_to_requestor_id
6030               wor.wip_entity_id,
6031               wmti.line_id,
6032               wor.operation_seq_num,
6033               wor.resource_seq_num,
6034               wor.resource_id,
6035               wor.repetitive_schedule_id,
6036               /* Bug 4398047 commented following portion of the sql
6037               DECODE(wmti.entity_type, --  Fix for 2374334
6038                 WIP_CONSTANTS.LOTBASED, bcd1.calendar_date, */
6039                 /*Bug 14687249: when post processing leadtime is 0, use operation date directly to populate need_by_date, so it will not flip to the next working date.*/
6040                 Decode(NVL(msi.postprocessing_lead_time,0),
6041                    0, DECODE(wo1.next_operation_seq_num,
6042                           NULL, wo1.last_unit_completion_date,
6043                           wo2.first_unit_start_date),
6044                   (bcd3.calendar_date +
6045                        (DECODE(wo1.next_operation_seq_num,
6046                           NULL, wo1.last_unit_completion_date,
6047                           wo2.first_unit_start_date) -
6048                         TRUNC(DECODE(wo1.next_operation_seq_num,
6049                                 NULL, wo1.last_unit_completion_date,
6050                                 wo2.first_unit_start_date))))),  -- need_by_date  /* Bug 4398047 removed one matching bracket for decode */
6051              'Y',                         -- autosource_flag
6052               NULL,                       -- group_code
6053               msi.buyer_id,               -- suggested_buyer_id
6054               wdj.project_id,
6055               wdj.task_id,
6056               DECODE(wdj.project_id,NULL,NULL,'Y')-- project_accounting_context
6057         FROM      /* bugfix 5129403: modified the order in the from clause */
6058               wip_move_txn_interface wmti,
6059               wip_operation_resources wor,
6060               bom_resources br,
6061               mtl_system_items msi,
6062               mtl_parameters mp,
6063            -- bom_calendar_dates bcd2,  Bug 4398047 join to bcd2 not required
6064               bom_calendar_dates bcd4,
6065            -- bom_calendar_dates bcd1,  Bug 4398047 join to bcd1 not required
6066               bom_calendar_dates bcd3,
6067               fnd_user fu,
6068               bom_departments bd,
6069               hr_organization_information hoi,
6070               wip_discrete_jobs wdj,
6071               wip_operations wo1,
6072               wip_operations wo2,
6073 			        wip_parameters wp /*ER 4276433*/
6074         WHERE wmti.group_id = p_gib.group_id
6075           AND TRUNC(wmti.transaction_date) = TRUNC(p_gib.txn_date)
6076           AND wmti.process_phase = WIP_CONSTANTS.MOVE_PROC
6077           AND wmti.process_status = WIP_CONSTANTS.RUNNING
6078           AND (wmti.entity_type = WIP_CONSTANTS.DISCRETE
6079                OR wmti.entity_type = WIP_CONSTANTS.LOTBASED) /* WSM */
6080           AND (wmti.overcompletion_transaction_id IS NULL
6081                OR ( wmti.overcompletion_transaction_id IS NOT NULL
6082                     AND wmti.overcompletion_transaction_qty IS NOT NULL))
6083 --Bugfix 6679124: Join to wor using wdj rather than wmti to get better execution plan.
6084 --          AND wmti.organization_id = wor.organization_id
6085 --          AND wmti.wip_entity_id = wor.wip_entity_id
6086 	    AND wdj.organization_id = wor.organization_id     --6679124
6087             AND wdj.wip_entity_id = wor.wip_entity_id         -- 6679124
6088           AND wmti.to_operation_seq_num = wor.operation_seq_num
6089           AND wmti.fm_operation_seq_num < wmti.to_operation_seq_num
6090           AND wmti.to_intraoperation_step_type = WIP_CONSTANTS.QUEUE
6091           AND wo1.organization_id = wmti.organization_id
6092           AND wo1.wip_entity_id = wmti.wip_entity_id
6093           AND wo1.operation_seq_num = wmti.to_operation_seq_num
6094           AND wo2.organization_id = wo1.organization_id
6095           AND wo2.wip_entity_id = wo1.wip_entity_id
6096       -- Fixed bug 2259661
6097       --    AND ((wor.autocharge_type = WIP_CONSTANTS.PO_RECEIPT
6098       --          AND wo2.operation_seq_num = wmti.to_operation_seq_num)
6099       --      OR (wor.autocharge_type = WIP_CONSTANTS.PO_MOVE
6100           AND ((wor.autocharge_type IN (WIP_CONSTANTS.PO_RECEIPT,
6101                                         WIP_CONSTANTS.PO_MOVE))
6102                 AND ((wo1.next_operation_seq_num IS NOT NULL
6103                       AND wo1.next_operation_seq_num = wo2.operation_seq_num)
6104                   OR (wo1.next_operation_seq_num IS NULL
6105                       AND wo2.operation_seq_num = wmti.to_operation_seq_num)))
6106           AND wdj.organization_id = wmti.organization_id
6107           AND wdj.wip_entity_id = wmti.wip_entity_id
6108           AND (wdj.po_creation_time = WIP_CONSTANTS.AT_OPERATION
6109             OR (wo1.count_point_type = WIP_CONSTANTS.NO_MANUAL
6110                       AND wdj.po_creation_time <> WIP_CONSTANTS.MANUAL_CREATION))
6111           AND wor.basis_type = WIP_CONSTANTS.PER_ITEM
6112           AND wor.organization_id = br.organization_id
6113           AND wor.resource_id = br.resource_id
6114           AND br.organization_id = msi.organization_id
6115           AND br.purchase_item_id = msi.inventory_item_id
6116           AND wmti.created_by = fu.user_id
6117           AND wmti.organization_id = bd.organization_id
6118           /*  Fix for bug 3609023: Corrected condition to ensure we insert
6119               correct deliver_to_location_id for PO_RECEIPT */
6120           AND ((wor.autocharge_type = WIP_CONSTANTS.PO_RECEIPT AND
6121                 wo1.department_id = bd.department_id)
6122                 OR
6123                (wor.autocharge_type = WIP_CONSTANTS.PO_MOVE AND
6124                 wo2.department_id = bd.department_id))
6125           AND mp.organization_id = wmti.organization_id
6126           AND hoi.organization_id = wmti.organization_id
6127           AND hoi.org_information_context = 'Accounting Information'
6128           /*Bug 4398047 commenting out following portion of the sql
6129           AND bcd2.calendar_code = mp.calendar_code -- Fix for Bug#2374334
6130           AND bcd2.exception_set_id = mp.calendar_exception_set_id
6131           AND bcd2.calendar_date = trunc(SYSDATE)
6132           AND bcd1.calendar_code = mp.calendar_code
6133           AND bcd1.exception_set_id = mp.calendar_exception_set_id
6134           AND bcd1.seq_num = (bcd2.next_seq_num +
6135                 CEIL(NVL(msi.preprocessing_lead_time,0) +
6136                      NVL(msi.fixed_lead_time,0) +
6137                     (NVL(msi.variable_lead_time,0) *
6138                        DECODE(msi.outside_operation_uom_type,
6139                         'RESOURCE',
6140                          wor.usage_rate_or_amount * wmti.primary_quantity,
6141                         'ASSEMBLY',
6142                          wmti.primary_quantity
6143                          )
6144                      ) +
6145                      NVL(msi.postprocessing_lead_time,0))) Bug 4398047 end of commented portion of sql */
6146           -- consider post processing lead time before inserting need-by-date
6147           AND bcd4.calendar_code = mp.calendar_code
6148           AND bcd4.exception_set_id = mp.calendar_exception_set_id
6149           AND bcd4.calendar_date =
6150               TRUNC(DECODE(wo1.next_operation_seq_num,
6151                       NULL, wo1.last_unit_completion_date,
6152                       wo2.first_unit_start_date))
6153           AND bcd3.calendar_code = mp.calendar_code
6154           AND bcd3.exception_set_id = mp.calendar_exception_set_id
6155           AND bcd3.seq_num = (bcd4.next_seq_num -
6156                               CEIL(NVL(msi.postprocessing_lead_time,0)))
6157 		      AND wp.organization_id = wmti.organization_id; /*ER 4276433*/
6158     -- IF debug message level = 2, write statement below to log file
6159     IF (l_logLevel <= wip_constants.full_logging) THEN
6160       fnd_message.set_name('WIP', 'WIP_INSERTED_ROWS');
6161       fnd_message.set_token('ENTITY1', SQL%ROWCOUNT);
6162       fnd_message.set_token('ENTITY2', 'PO_REQUISITIONS_INTERFACE_ALL');
6163       l_msg := fnd_message.get;
6164       wip_logger.log(p_msg          => l_msg,
6165                      x_returnStatus => l_returnStatus);
6166     END IF;
6167 
6168   END IF; -- po requisition per item for jobs
6169 
6170   /*------------------------------------------------------------+
6171    |Insert into po_req interface table for per item for schedule
6172    +------------------------------------------------------------*/
6173   IF(l_move.scheTxn    = WIP_CONSTANTS.YES AND
6174      l_move.poReqItem = WIP_CONSTANTS.YES) THEN
6175     -- Fixed bug 5144659. Insert into po_requisitions_interface_all instead of
6176     -- po_requisitions_interface as part of MOAC change.
6177     INSERT INTO po_requisitions_interface_all
6178       (last_update_date,
6179        last_updated_by,
6180        creation_date,
6181        created_by,
6182        last_update_login,
6183        request_id,
6184        program_application_id,
6185        program_id,
6186        program_update_date,
6187        org_id,  /* Operating unit org */
6188        preparer_id,
6189        interface_source_code,
6190        authorization_status,
6191        source_type_code,
6192        destination_organization_id,
6193        destination_type_code,
6194        item_id,
6195        item_revision,
6196        uom_code,
6197        quantity,
6198        line_type_id,
6199        charge_account_id,
6200        deliver_to_location_id,
6201        deliver_to_requestor_id,
6202        wip_entity_id,
6203        wip_line_id,
6204        wip_operation_seq_num,
6205        wip_resource_seq_num,
6206        bom_resource_id,
6207        wip_repetitive_schedule_id,
6208        need_by_date,
6209        autosource_flag,
6210        group_code,
6211        suggested_buyer_id
6212        )
6213        SELECT SYSDATE,                       -- last_update_date
6214               wmti.last_updated_by,           -- last_updated_by --Fix for bug 5195072
6215               SYSDATE,                       -- creation_date
6216               wmti.created_by,                -- created_by --Fix for bug 5195072
6217               DECODE(p_gib.login_id,-1,NULL,p_gib.login_id),
6218               DECODE(p_gib.request_id,-1,NULL,p_gib.request_id),
6219               DECODE(p_gib.application_id,-1,NULL,p_gib.application_id),
6220               DECODE(p_gib.program_id,-1,NULL,p_gib.program_id),
6221               DECODE(p_gib.request_id,-1,NULL,SYSDATE), -- program_update_date
6222               to_number(hoi.org_information3),        -- ou_org_id
6223               fu.employee_id,                -- preparer_id
6224               'WIP',                         -- interface_source_code
6225               NVL(wp.po_creation_status, 'APPROVED'),  -- authorization_status  /*ER 4276433*/
6226               'VENDOR',                      -- source_type_code
6227               wor.organization_id,           -- destination_organization_id
6228               'SHOP FLOOR',                  -- destination_type_code
6229               br.purchase_item_id,           -- item_id
6230               DECODE(msi.revision_qty_control_code, -- item_revision
6231                1, NULL,
6232                2, DECODE(br.purchase_item_id,
6233                   we.primary_item_id, wrs.bom_revision,
6234                         BOM_revisions.GET_ITEM_REVISION_FN
6235                                ('EXCLUDE_OPEN_HOLD',         -- eco_status
6236                                 'ALL',                       -- examine_type
6237                                  br.ORGANIZATION_ID,         -- org_id
6238                                  br.purchase_item_id,        -- item_id
6239                                  wmti.transaction_date       -- rev_date /*Bug 14286109*/
6240                                       ))), /* Fixed Bug# 1623063 */
6241               msi.primary_uom_code,          -- uom_code
6242               DECODE(msi.outside_operation_uom_type, -- quantity
6243                'RESOURCE',ROUND(wor.usage_rate_or_amount *wma.primary_quantity,
6244                                 WIP_CONSTANTS.INV_MAX_PRECISION),
6245                'ASSEMBLY',wma.primary_quantity),
6246               3,                             -- line_type_id
6247               wrs.outside_processing_account,-- charge_account_id
6248               bd.location_id,                -- deliver_to_location_id
6249               fu.employee_id,                -- deliver_to_requestor_id
6250               wor.wip_entity_id,
6251               wmti.line_id,
6252               wor.operation_seq_num,
6253               wor.resource_seq_num,
6254               wor.resource_id,
6255               wor.repetitive_schedule_id,
6256      /* consider post processing lead time before inserting need-by-date */
6257               /*Bug 14687249: when post processing leadtime is 0, use operation date directly to populate need_by_date, so it will not flip to the next working date.*/
6258                 Decode(NVL(msi.postprocessing_lead_time,0),
6259                    0, DECODE(wo1.next_operation_seq_num,
6260                           NULL, wo1.last_unit_completion_date,
6261                           wo2.first_unit_start_date),
6262                   (bcd1.calendar_date +
6263                        (DECODE(wo1.next_operation_seq_num,
6264                           NULL, wo1.last_unit_completion_date,
6265                           wo2.first_unit_start_date) -
6266                         TRUNC(DECODE(wo1.next_operation_seq_num,
6267                                 NULL, wo1.last_unit_completion_date,
6268                                 wo2.first_unit_start_date))))),  -- need_by_date  /* Bug 4398047 removed one matching bracket for decode */
6269               'Y',                           -- autosource_flag
6270               NULL,                          -- group_code
6271               msi.buyer_id                   -- suggested_buyer_id
6272          FROM bom_resources br,
6273               bom_departments bd,
6274               bom_calendar_dates bcd1,
6275               bom_calendar_dates bcd2,
6276               fnd_user fu,
6277               mtl_system_items msi,
6278               mtl_parameters mp,
6279               hr_organization_information hoi,
6280               wip_entities we,
6281               wip_repetitive_schedules wrs,
6282               wip_operation_resources wor,
6283               wip_operations wo1,
6284               wip_operations wo2,
6285               wip_move_txn_allocations wma,
6286               wip_move_txn_interface wmti,
6287 			        wip_parameters wp /*ER 4276433*/
6288         WHERE wmti.group_id = p_gib.group_id
6289           AND TRUNC(wmti.transaction_date) = TRUNC(p_gib.txn_date)
6290           AND wmti.process_phase = WIP_CONSTANTS.MOVE_PROC
6291           AND wmti.process_status = WIP_CONSTANTS.RUNNING
6292           AND wmti.entity_type = WIP_CONSTANTS.REPETITIVE
6293           AND (wmti.overcompletion_transaction_id IS NULL
6294                OR ( wmti.overcompletion_transaction_id IS NOT NULL
6295                     AND wmti.overcompletion_transaction_qty IS NOT NULL))
6296           AND wmti.organization_id = wor.organization_id
6297           AND wmti.wip_entity_id = wor.wip_entity_id
6298           AND wmti.to_operation_seq_num = wor.operation_seq_num
6299           AND wor.repetitive_schedule_id = wma.repetitive_schedule_id
6300           AND wmti.organization_id = wma.organization_id
6301           AND wmti.transaction_id = wma.transaction_id
6302           AND wmti.fm_operation_seq_num < wmti.to_operation_seq_num
6303           AND wmti.to_intraoperation_step_type = WIP_CONSTANTS.QUEUE
6304           AND wrs.organization_id = wor.organization_id
6305           AND wrs.repetitive_schedule_id = wor.repetitive_schedule_id
6306           AND (wrs.po_creation_time = WIP_CONSTANTS.AT_OPERATION
6307                OR (wo1.count_point_type = WIP_CONSTANTS.NO_MANUAL
6308                    AND wrs.po_creation_time <> WIP_CONSTANTS.MANUAL_CREATION))
6309           AND wo1.organization_id = wmti.organization_id
6310           AND wo1.wip_entity_id = wmti.wip_entity_id
6311           AND wo1.operation_seq_num = wmti.to_operation_seq_num
6312           AND wo1.repetitive_schedule_id = wor.repetitive_schedule_id
6313           AND wo2.organization_id = wo1.organization_id
6314           AND wo2.wip_entity_id = wo1.wip_entity_id
6315           AND wo2.repetitive_schedule_id = wo1.repetitive_schedule_id
6316        -- Fixed bug 2259661
6317        --   AND ((wor.autocharge_type = WIP_CONSTANTS.PO_RECEIPT
6318        --         AND wo2.operation_seq_num = wmti.to_operation_seq_num)
6319        --     OR (wor.autocharge_type = WIP_CONSTANTS.PO_MOVE
6320           AND ((wor.autocharge_type IN (WIP_CONSTANTS.PO_RECEIPT,
6321                                         WIP_CONSTANTS.PO_MOVE))
6322                 AND ((wo1.next_operation_seq_num IS NOT NULL
6323                       AND wo1.next_operation_seq_num = wo2.operation_seq_num)
6324                    OR (wo1.next_operation_seq_num IS NULL
6325                        AND wo2.operation_seq_num = wmti.to_operation_seq_num)))
6326           AND wor.basis_type = WIP_CONSTANTS.PER_ITEM
6327           AND wor.organization_id = br.organization_id
6328           AND wor.resource_id = br.resource_id
6329           AND br.organization_id = msi.organization_id
6330           AND br.purchase_item_id = msi.inventory_item_id
6331           AND wmti.created_by = fu.user_id
6332           AND wmti.organization_id = bd.organization_id
6333           /*  Fix for bug 3609023: Corrected condition to ensure we insert
6334               correct deliver_to_location_id for PO_RECEIPT */
6335           AND ((wor.autocharge_type = WIP_CONSTANTS.PO_RECEIPT AND
6336                 wo1.department_id = bd.department_id)
6337                 OR
6338                (wor.autocharge_type = WIP_CONSTANTS.PO_MOVE AND
6339                 wo2.department_id = bd.department_id))
6340           AND mp.organization_id = wmti.organization_id
6341           AND hoi.organization_id = wmti.organization_id
6342           AND hoi.org_information_context = 'Accounting Information'
6343           AND we.wip_entity_id = wrs.wip_entity_id
6344           AND we.organization_id = wrs.organization_id
6345           -- consider post processing lead time before inserting need-by-date
6346           AND bcd2.calendar_code = mp.calendar_code
6347           AND bcd2.exception_set_id = mp.calendar_exception_set_id
6348           AND bcd2.calendar_date =
6349               TRUNC(DECODE(wo1.next_operation_seq_num,
6350                       NULL, wo1.last_unit_completion_date,
6351                       wo2.first_unit_start_date))
6352           AND bcd1.calendar_code = mp.calendar_code
6353           AND bcd1.exception_set_id = mp.calendar_exception_set_id
6354           AND bcd1.seq_num = (bcd2.next_seq_num -
6355                               CEIL(NVL(msi.postprocessing_lead_time,0)))
6356           AND wp.organization_id = wmti.organization_id; /*ER 4276433*/
6357 
6358     -- IF debug message level = 2, write statement below to log file
6359     IF (l_logLevel <= wip_constants.full_logging) THEN
6360       fnd_message.set_name('WIP', 'WIP_INSERTED_ROWS');
6361       fnd_message.set_token('ENTITY1', SQL%ROWCOUNT);
6362       fnd_message.set_token('ENTITY2', 'PO_REQUISITIONS_INTERFACE_ALL');
6363       l_msg := fnd_message.get;
6364       wip_logger.log(p_msg          => l_msg,
6365                      x_returnStatus => l_returnStatus);
6366     END IF;
6367 
6368   END IF;  -- po requisition per item for schedule
6369 
6370   /*------------------------------------------------------------+
6371    |  Insert into po_req interface table for per lot for job
6372    +------------------------------------------------------------*/
6373   IF(l_move.jobTxn    = WIP_CONSTANTS.YES AND
6374      l_move.poReqLot = WIP_CONSTANTS.YES) THEN
6375     -- Fixed bug 5144659. Insert into po_requisitions_interface_all instead of
6376     -- po_requisitions_interface as part of MOAC change.
6377     INSERT INTO po_requisitions_interface_all
6378       (last_update_date,
6379        last_updated_by,
6380        creation_date,
6381        created_by,
6382        last_update_login,
6383        request_id,
6384        program_application_id,
6385        program_id,
6386        program_update_date,
6387        org_id,  /* Operating unit org */
6388        preparer_id,
6389        interface_source_code,
6390        authorization_status,
6391        source_type_code,
6392        destination_organization_id,
6393        destination_type_code,
6394        item_id,
6395        item_revision,
6396        uom_code,
6397        quantity,
6398        line_type_id,
6399        charge_account_id,
6400        deliver_to_location_id,
6401        deliver_to_requestor_id,
6402        wip_entity_id,
6403        wip_line_id,
6404        wip_operation_seq_num,
6405        wip_resource_seq_num,
6406        bom_resource_id,
6407        wip_repetitive_schedule_id,
6408        need_by_date,
6409        autosource_flag,
6410        group_code,
6411        suggested_buyer_id,
6412        project_id,
6413        task_id,
6414        project_accounting_context
6415        )
6416        SELECT /* bugfix 5250067 performance fix. removed hint */
6417               SYSDATE,                       -- last_update_date
6418               MAX(wmti.last_updated_by),      -- last_updated_by --Fix for bug 5195072
6419               SYSDATE,                       -- creation_date
6420               MAX(wmti.created_by),           -- created_by --Fix for bug 5195072
6421               DECODE(p_gib.login_id,-1,NULL,p_gib.login_id),
6422               DECODE(p_gib.request_id,-1,NULL,p_gib.request_id),
6423               DECODE(p_gib.application_id,-1,NULL,p_gib.application_id),
6424               DECODE(p_gib.program_id,-1,NULL,p_gib.program_id),
6425               DECODE(p_gib.request_id,-1,NULL,SYSDATE), -- program_update_date
6426               MAX(to_number(hoi.org_information3)),     -- ou_org_id
6427               MAX(fu.employee_id),           -- preparer_id
6428               'WIP',                         -- interface_source_code
6429               MAX(NVL(wp.po_creation_status, 'APPROVED')),  -- authorization_status  /*ER 4276433*/
6430               'VENDOR',                      -- source_type_code
6431               wor.organization_id,           -- destination_organization_id
6432               'SHOP FLOOR',                  -- destination_type_code
6433               MAX(br.purchase_item_id),      -- item_id
6434               DECODE(max(msi.revision_qty_control_code), -- item_revision
6435                1, NULL,
6436                2, DECODE(MAX(br.purchase_item_id),
6437                         MAX(wdj.primary_item_id), MAX(wdj.bom_revision),
6438                         MAX(BOM_revisions.GET_ITEM_REVISION_FN
6439                                    ('EXCLUDE_OPEN_HOLD',        -- eco_status
6440                                     'ALL',                      -- examine_type
6441                                      br.ORGANIZATION_ID,        -- org_id
6442                                      br.purchase_item_id,       -- item_id
6443                                      wmti.transaction_date      -- rev_date /*Bug 14286109*/
6444                                                )))), /* Fixed Bug# 1623063 */
6445               MAX(msi.primary_uom_code),     -- uom_code
6446               DECODE(MAX(msi.outside_operation_uom_type), -- quantity
6447                'RESOURCE',MAX(ROUND(wor.usage_rate_or_amount,
6448                                     WIP_CONSTANTS.INV_MAX_PRECISION)),
6449                'ASSEMBLY', 1),
6450               3,                             -- line_type_id
6451               MAX(wdj.outside_processing_account), -- charge_account_id
6452               MAX(bd.location_id),           -- deliver_to_location_id
6453               MAX(fu.employee_id),           -- deliver_to_requestor_id
6454               wor.wip_entity_id,
6455               MAX(wmti.line_id),
6456               wor.operation_seq_num,
6457               wor.resource_seq_num,
6458               MAX(wor.resource_id),
6459               wor.repetitive_schedule_id,
6460               /* Bug 4398047 commenting out this portion of the sql
6461               DECODE(MAX(wmti.entity_type), -- Fix for 2374334
6462                 WIP_CONSTANTS.LOTBASED, MAX(bcd1.calendar_date),*/
6463                /*Bug 14687249: when post processing leadtime is 0, use operation date directly to populate need_by_date, so it will not flip to the next working date.*/
6464               Decode(NVL(msi.postprocessing_lead_time,0),
6465                 0,DECODE(MAX(wo1.next_operation_seq_num),
6466                      NULL, MAX(wo1.last_unit_completion_date),
6467                      MAX(wo2.first_unit_start_date)),
6468                 (MAX(bcd3.calendar_date) +
6469                     (DECODE(MAX(wo1.next_operation_seq_num),
6470                        NULL, MAX(wo1.last_unit_completion_date),
6471                        MAX(wo2.first_unit_start_date)) -
6472                      TRUNC(DECODE(MAX(wo1.next_operation_seq_num),
6473                              NULL, MAX(wo1.last_unit_completion_date),
6474                              MAX(wo2.first_unit_start_date)))))), -- need_by_date /* Bug 4398047 removed one matching bracket */
6475               'Y',                           -- autosource_flag
6476               NULL,                          -- group_code
6477               MAX(msi.buyer_id),             -- suggested_buyer_id
6478               wdj.project_id,
6479               wdj.task_id,
6480               DECODE(wdj.project_id,NULL,NULL,'Y')-- project_accounting_context
6481         FROM        /* bugfix 5129403: modified the order in the from clause */
6482               wip_move_txn_interface wmti,
6483               wip_operation_resources wor,
6484               bom_resources br,
6485               mtl_system_items msi,
6486               mtl_parameters mp,
6487            -- bom_calendar_dates bcd2,  Bug 4398047 join no longer required
6488               bom_calendar_dates bcd4,
6489            -- bom_calendar_dates bcd1,  Bug 4398047 join no longer required
6490               bom_calendar_dates bcd3,
6491               fnd_user fu,
6492               bom_departments bd,
6493               hr_organization_information hoi,
6494               wip_discrete_jobs wdj,
6495               wip_operations wo1,
6496               wip_operations wo2,
6497 			        wip_parameters wp /*ER 4276433*/
6498         WHERE wmti.group_id = p_gib.group_id
6499           AND TRUNC(wmti.transaction_date) = TRUNC(p_gib.txn_date)
6500           AND wmti.process_phase = WIP_CONSTANTS.MOVE_PROC
6501           AND wmti.process_status = WIP_CONSTANTS.RUNNING
6502           AND (wmti.entity_type = WIP_CONSTANTS.DISCRETE
6503                OR wmti.entity_type = WIP_CONSTANTS.LOTBASED)/* WSM */
6504           AND (wmti.overcompletion_transaction_id IS NULL
6505                OR ( wmti.overcompletion_transaction_id IS NOT NULL
6506                     AND wmti.overcompletion_transaction_qty IS NOT NULL))
6507        --    Bugfix 6679124: Join to wor using wdj rather than wmti to get better execution plan
6508        --   AND wmti.organization_id = wor.organization_id
6509        --   AND wmti.wip_entity_id = wor.wip_entity_id
6510 	    AND wdj.organization_id = wor.organization_id       --6679124
6511             AND wdj.wip_entity_id = wor.wip_entity_id           -- 6679124
6512           AND wmti.to_operation_seq_num = wor.operation_seq_num
6513           AND wmti.fm_operation_seq_num < wmti.to_operation_seq_num
6514           AND wmti.to_intraoperation_step_type = WIP_CONSTANTS.QUEUE
6515           AND wo1.organization_id = wmti.organization_id
6516           AND wo1.wip_entity_id = wmti.wip_entity_id
6517           AND wo1.operation_seq_num = wmti.to_operation_seq_num
6518           AND wo2.organization_id = wo1.organization_id
6519           AND wo2.wip_entity_id = wo1.wip_entity_id
6520        -- Fixed bug 2259661
6521        --   AND ((wor.autocharge_type = WIP_CONSTANTS.PO_RECEIPT
6522        --         AND wo2.operation_seq_num = wmti.to_operation_seq_num)
6523        --     OR (wor.autocharge_type = WIP_CONSTANTS.PO_MOVE
6524           AND ((wor.autocharge_type IN (WIP_CONSTANTS.PO_RECEIPT,
6525                                         WIP_CONSTANTS.PO_MOVE))
6526                 AND ((wo1.next_operation_seq_num IS NOT NULL
6527                       AND wo1.next_operation_seq_num = wo2.operation_seq_num)
6528                    OR (wo1.next_operation_seq_num IS NULL
6529                        AND wo2.operation_seq_num = wmti.to_operation_seq_num)))
6530           AND wdj.organization_id = wmti.organization_id
6531           AND wdj.wip_entity_id = wmti.wip_entity_id
6532           AND (wdj.po_creation_time = WIP_CONSTANTS.AT_OPERATION
6533                OR (wo1.count_point_type = WIP_CONSTANTS.NO_MANUAL
6534                    AND wdj.po_creation_time <> WIP_CONSTANTS.MANUAL_CREATION))
6535           AND wor.basis_type = WIP_CONSTANTS.PER_LOT
6536           AND wor.organization_id = br.organization_id
6537           AND wor.resource_id = br.resource_id
6538           AND br.organization_id = msi.organization_id
6539           AND br.purchase_item_id = msi.inventory_item_id
6540           AND wmti.created_by = fu.user_id
6541           AND wmti.organization_id = bd.organization_id
6542           /*  Fix for bug 3609023: Corrected condition to ensure we insert
6543               correct deliver_to_location_id for PO_RECEIPT */
6544           AND ((wor.autocharge_type = WIP_CONSTANTS.PO_RECEIPT AND
6545                 wo1.department_id = bd.department_id)
6546                 OR
6547                (wor.autocharge_type = WIP_CONSTANTS.PO_MOVE AND
6548                 wo2.department_id = bd.department_id))
6549           AND mp.organization_id = wmti.organization_id
6550           AND hoi.organization_id = wmti.organization_id
6551           AND hoi.org_information_context = 'Accounting Information'
6552           /* Bug 4398047 removing the following portion of the sql
6553           AND bcd2.calendar_code = mp.calendar_code -- Fix for Bug#2374334
6554           AND bcd2.exception_set_id = mp.calendar_exception_set_id
6555           AND bcd2.calendar_date = trunc(SYSDATE)
6556           AND bcd1.calendar_code = mp.calendar_code
6557           AND bcd1.exception_set_id = mp.calendar_exception_set_id
6558           AND bcd1.seq_num = (bcd2.next_seq_num +
6559                 CEIL(NVL(msi.preprocessing_lead_time,0) + NVL(msi.fixed_lead_time,0) +
6560                 (NVL(msi.variable_lead_time,0) *
6561                   DECODE(msi.outside_operation_uom_type,
6562                         'RESOURCE',
6563                          wor.usage_rate_or_amount,
6564                         'ASSEMBLY',
6565                          1
6566                         )
6567                   )
6568                      +
6569                  NVL(msi.postprocessing_lead_time,0)))  Bug 4398047 end of commenting */
6570           -- consider post processing lead time before inserting need-by-date
6571           AND bcd4.calendar_code = mp.calendar_code
6572           AND bcd4.exception_set_id = mp.calendar_exception_set_id
6573           AND bcd4.calendar_date =
6574               TRUNC(DECODE(wo1.next_operation_seq_num,
6575                       NULL, wo1.last_unit_completion_date,
6576                       wo2.first_unit_start_date))
6577           AND bcd3.calendar_code = mp.calendar_code
6578           AND bcd3.exception_set_id = mp.calendar_exception_set_id
6579           AND bcd3.seq_num = (bcd4.next_seq_num -
6580                               CEIL(NVL(msi.postprocessing_lead_time,0)))
6581 	        AND wp.organization_id = wmti.organization_id /*ER 4276433*/
6582      GROUP BY wor.organization_id,
6583               wor.wip_entity_id,
6584               wor.repetitive_schedule_id,
6585               wor.operation_seq_num,
6586               wor.resource_seq_num,
6587               wdj.project_id,
6588               wdj.task_id
6589        HAVING 1 =
6590               DECODE(SIGN(MAX(wo1.quantity_in_queue) -
6591                               SUM(wmti.primary_quantity)),
6592               0, DECODE(SIGN(MAX(wo1.quantity_running +
6593                                  wo1.quantity_waiting_to_move +
6594                                  wo1.quantity_rejected +
6595                                  wo1.quantity_scrapped)),
6596                  0, DECODE(SIGN(MAX(wo1.quantity_completed)),0,1,0),
6597                  1, 0),
6598               1, 0);
6599 
6600     -- IF debug message level = 2, write statement below to log file
6601     IF (l_logLevel <= wip_constants.full_logging) THEN
6602       fnd_message.set_name('WIP', 'WIP_INSERTED_ROWS');
6603       fnd_message.set_token('ENTITY1', SQL%ROWCOUNT);
6604       fnd_message.set_token('ENTITY2', 'PO_REQUISITIONS_INTERFACE_ALL');
6605       l_msg := fnd_message.get;
6606       wip_logger.log(p_msg          => l_msg,
6607                      x_returnStatus => l_returnStatus);
6608     END IF;
6609 
6610   END IF;  -- po requisition per lot for job
6611 
6612   /*------------------------------------------------------------+
6613    | Insert into po_req interface table for per lot for schedule
6614    +------------------------------------------------------------*/
6615   IF(l_move.scheTxn  = WIP_CONSTANTS.YES AND
6616      l_move.poReqLot = WIP_CONSTANTS.YES) THEN
6617     -- Fixed bug 5144659. Insert into po_requisitions_interface_all instead of
6618     -- po_requisitions_interface as part of MOAC change.
6619     INSERT INTO po_requisitions_interface_all
6620       (last_update_date,
6621        last_updated_by,
6622        creation_date,
6623        created_by,
6624        last_update_login,
6625        request_id,
6626        program_application_id,
6627        program_id,
6628        program_update_date,
6629        org_id,  /* Operating unit org */
6630        preparer_id,
6631        interface_source_code,
6632        authorization_status,
6633        source_type_code,
6634        destination_organization_id,
6635        destination_type_code,
6636        item_id,
6637        item_revision,
6638        uom_code,
6639        quantity,
6640        line_type_id,
6641        charge_account_id,
6642        deliver_to_location_id,
6643        deliver_to_requestor_id,
6644        wip_entity_id,
6645        wip_line_id,
6646        wip_operation_seq_num,
6647        wip_resource_seq_num,
6648        bom_resource_id,
6649        wip_repetitive_schedule_id,
6650        need_by_date,
6651        autosource_flag,
6652        group_code,
6653        suggested_buyer_id
6654        )
6655        SELECT SYSDATE,                         -- last_update_date
6656               MAX(wmti.last_updated_by),        -- last_updated_by --Fix for bug 5195072
6657               SYSDATE,                         -- creation_date
6658               MAX(wmti.created_by),             -- created_by --Fix for bug 5195072
6659               DECODE(p_gib.login_id,-1,NULL,p_gib.login_id),
6660               DECODE(p_gib.request_id,-1,NULL,p_gib.request_id),
6661               DECODE(p_gib.application_id,-1,NULL,p_gib.application_id),
6662               DECODE(p_gib.program_id,-1,NULL,p_gib.program_id),
6663               DECODE(p_gib.request_id,-1,NULL,SYSDATE), -- program_update_date
6664               MAX(to_number(hoi.org_information3)),     -- ou_org_id
6665               MAX(fu.employee_id),             -- preparer_id
6666               'WIP',                           -- interface_source_code
6667                MAX(NVL(wp.po_creation_status, 'APPROVED')),  -- authorization_status  /*ER 4276433*/
6668               'VENDOR',                        -- source_type_code
6669               wor.organization_id,             -- destination_organization_id
6670               'SHOP FLOOR',                    -- destination_type_code
6671               MAX(br.purchase_item_id),        -- item_id
6672               DECODE(MAX(msi.revision_qty_control_code),  -- item_revision
6673                1, NULL,
6674                2, DECODE(MAX(br.purchase_item_id),
6675                         MAX(we.primary_item_id), MAX(wrs.bom_revision),
6676                         MAX(BOM_revisions.GET_ITEM_REVISION_FN
6677                                    ('EXCLUDE_OPEN_HOLD',       -- eco_status
6678                                     'ALL',                     -- examine_type
6679                                      br.ORGANIZATION_ID,       -- org_id
6680                                      br.purchase_item_id,      -- item_id
6681                                      wmti.transaction_date     -- rev_date /*Bug 14286109*/
6682                                                 )))), /* Fixed Bug# 1623063 */
6683               MAX(msi.primary_uom_code),       -- uom_code
6684               DECODE(MAX(msi.outside_operation_uom_type), -- quantity
6685                'RESOURCE',MAX(ROUND(wor.usage_rate_or_amount,
6686                                     WIP_CONSTANTS.INV_MAX_PRECISION)),
6687                'ASSEMBLY', 1),
6688               3,                                -- line_type_id
6689               MAX(wrs.outside_processing_account), -- charge_account_id
6690               MAX(bd.location_id),              -- deliver_to_location_id
6691               MAX(fu.employee_id),              -- deliver_to_requestor_id
6692               wor.wip_entity_id,
6693               MAX(wmti.line_id),
6694               wor.operation_seq_num,
6695               wor.resource_seq_num,
6696               MAX(wor.resource_id),
6697               wor.repetitive_schedule_id,
6698               /*Bug 14687249: when post processing leadtime is 0, use operation date directly to populate need_by_date, so it will not flip to the next working date.*/
6699               Decode(NVL(msi.postprocessing_lead_time,0),
6700                  0,DECODE(MAX(wo1.next_operation_seq_num),
6701                      NULL, MAX(wo1.last_unit_completion_date),
6702                      MAX(wo2.first_unit_start_date)),
6703                 (MAX(bcd1.calendar_date) +
6704                     (DECODE(MAX(wo1.next_operation_seq_num),
6705                        NULL, MAX(wo1.last_unit_completion_date),
6706                        MAX(wo2.first_unit_start_date)) -
6707                      TRUNC(DECODE(MAX(wo1.next_operation_seq_num),
6708                           NULL, MAX(wo1.last_unit_completion_date),
6709                           MAX(wo2.first_unit_start_date)))))), -- need_by_date
6710               'Y',                              -- autosource_flag
6711               NULL,                             -- group_code
6712               MAX(msi.buyer_id)                 -- suggested_buyer_id
6713          FROM bom_departments bd,
6714               bom_resources br,
6715               bom_calendar_dates bcd1,
6716               bom_calendar_dates bcd2,
6717               fnd_user fu,
6718               mtl_item_revisions mir,
6719               mtl_system_items msi,
6720               mtl_parameters mp,
6721               hr_organization_information hoi,
6722               wip_operation_resources wor,
6723               wip_repetitive_schedules wrs,
6724               wip_entities we,
6725               wip_operations wo1,
6726               wip_operations wo2,
6727               wip_move_txn_allocations wma,
6728               wip_move_txn_interface wmti,
6729 			        wip_parameters wp /*ER 4276433*/
6730         WHERE wmti.group_id = p_gib.group_id
6731           AND TRUNC(wmti.transaction_date) = TRUNC(p_gib.txn_date)
6732           AND wmti.process_phase = WIP_CONSTANTS.MOVE_PROC
6733           AND wmti.process_status = WIP_CONSTANTS.RUNNING
6734           AND wmti.entity_type = WIP_CONSTANTS.REPETITIVE
6735           AND (wmti.overcompletion_transaction_id IS NULL
6736                OR ( wmti.overcompletion_transaction_id IS NOT NULL
6737                     AND wmti.overcompletion_transaction_qty IS NOT NULL))
6738           AND wmti.organization_id = wor.organization_id
6739           AND wmti.wip_entity_id = wor.wip_entity_id
6740           AND wmti.to_operation_seq_num = wor.operation_seq_num
6741           AND wor.repetitive_schedule_id = wma.repetitive_schedule_id
6742           AND wmti.organization_id = wma.organization_id
6743           AND wmti.transaction_id = wma.transaction_id
6744           AND wmti.fm_operation_seq_num < wmti.to_operation_seq_num
6745           AND wmti.to_intraoperation_step_type = WIP_CONSTANTS.QUEUE
6746           AND wrs.organization_id = wor.organization_id
6747           AND wrs.repetitive_schedule_id = wor.repetitive_schedule_id
6748           AND (wrs.po_creation_time = WIP_CONSTANTS.AT_OPERATION
6749                OR (wo1.count_point_type = WIP_CONSTANTS.NO_MANUAL
6750                    AND wrs.po_creation_time <> WIP_CONSTANTS.MANUAL_CREATION))
6751           AND wo1.organization_id = wmti.organization_id
6752           AND wo1.wip_entity_id = wmti.wip_entity_id
6753           AND wo1.repetitive_schedule_id = wor.repetitive_schedule_id
6754           AND wo1.operation_seq_num = wmti.to_operation_seq_num
6755           AND wo2.organization_id = wo1.organization_id
6756           AND wo2.wip_entity_id = wo1.wip_entity_id
6757           AND wo2.repetitive_schedule_id = wo1.repetitive_schedule_id
6758        -- Fixed bug 2259661
6759        --   AND ((wor.autocharge_type = WIP_CONSTANTS.PO_RECEIPT
6760        --         AND wo2.operation_seq_num = wmti.to_operation_seq_num)
6761        --     OR (wor.autocharge_type = WIP_CONSTANTS.PO_MOVE
6762           AND ((wor.autocharge_type IN (WIP_CONSTANTS.PO_RECEIPT,
6763                                         WIP_CONSTANTS.PO_MOVE))
6764                 AND ((wo1.next_operation_seq_num IS NOT NULL
6765                       AND wo1.next_operation_seq_num = wo2.operation_seq_num)
6766                    OR (wo1.next_operation_seq_num IS NULL
6767                        AND wo2.operation_seq_num = wmti.to_operation_seq_num)))
6768           AND wor.basis_type = WIP_CONSTANTS.PER_LOT
6769           AND wor.organization_id = br.organization_id
6770           AND wor.resource_id = br.resource_id
6771           AND br.organization_id = msi.organization_id
6772           AND br.purchase_item_id = msi.inventory_item_id
6773           AND wmti.created_by = fu.user_id
6774           AND wmti.organization_id = bd.organization_id
6775           /*  Fix for bug 3609023: Corrected condition to ensure we insert
6776               correct deliver_to_location_id for PO_RECEIPT */
6777           AND ((wor.autocharge_type = WIP_CONSTANTS.PO_RECEIPT AND
6778                 wo1.department_id = bd.department_id)
6779                 OR
6780                (wor.autocharge_type = WIP_CONSTANTS.PO_MOVE AND
6781                 wo2.department_id = bd.department_id))
6782           AND mp.organization_id = wmti.organization_id
6783           AND hoi.organization_id = wmti.organization_id
6784           AND hoi.org_information_context = 'Accounting Information'
6785           AND we.wip_entity_id = wrs.wip_entity_id
6786           AND we.organization_id = wrs.organization_id
6787           AND mir.inventory_item_id = msi.inventory_item_id
6788           AND mir.organization_id = msi.organization_id
6789           AND mir.revision =
6790               (SELECT MAX(revision)
6791                  FROM mtl_item_revisions mir1,
6792                       eng_revised_items eri
6793                 WHERE mir1.inventory_item_id = mir.inventory_item_id
6794                   AND mir1.organization_id = mir.organization_id
6795                   AND mir1.effectivity_date <= wmti.transaction_date
6796                   AND mir1.revised_item_sequence_id =
6797                       eri.revised_item_sequence_id(+)
6798                   AND nvl(eri.status_type,0) not in (1,2)
6799               )
6800           -- consider post processing lead time before inserting need-by-date
6801           AND bcd2.calendar_code = mp.calendar_code
6802           AND bcd2.exception_set_id = mp.calendar_exception_set_id
6803           AND bcd2.calendar_date =
6804               TRUNC(DECODE (wo1.next_operation_seq_num,
6805                       NULL, wo1.last_unit_completion_date,
6806                       wo2.first_unit_start_date))
6807           AND bcd1.calendar_code = mp.calendar_code
6808           AND bcd1.exception_set_id = mp.calendar_exception_set_id
6809           AND bcd1.seq_num = (bcd2.next_seq_num -
6810                               CEIL(NVL(msi.postprocessing_lead_time,0)))
6811           AND wp.organization_id = wmti.organization_id /*ER 4276433*/
6812      GROUP BY wor.organization_id,
6813               wor.wip_entity_id,
6814               wor.repetitive_schedule_id,
6815               wor.operation_seq_num,
6816               wor.resource_seq_num
6817        HAVING 1 =
6818               DECODE(SIGN(MAX(wo1.quantity_in_queue) -
6819                               SUM(wma.primary_quantity)),
6820               0, DECODE(SIGN(MAX(wo1.quantity_running +
6821                                  wo1.quantity_waiting_to_move +
6822                                  wo1.quantity_rejected +
6823                                  wo1.quantity_scrapped)),
6824                  0, DECODE(SIGN(MAX(wo1.quantity_completed)),0,1,0),
6825                  1, 0),
6826               1, 0);
6827 
6828     -- IF debug message level = 2, write statement below to log file
6829     IF (l_logLevel <= wip_constants.full_logging) THEN
6830       fnd_message.set_name('WIP', 'WIP_INSERTED_ROWS');
6831       fnd_message.set_token('ENTITY1', SQL%ROWCOUNT);
6832       fnd_message.set_token('ENTITY2', 'PO_REQUISITIONS_INTERFACE_ALL');
6833       l_msg := fnd_message.get;
6834       wip_logger.log(p_msg          => l_msg,
6835                      x_returnStatus => l_returnStatus);
6836     END IF;
6837   END IF;  -- po requisition per lot for schedule
6838 
6839   IF(po_code_release_grp.Current_Release <
6840      po_code_release_grp.PRC_11i_Family_Pack_J) THEN
6841     -- Only cut new requisition if customer do not have PO patchset J,
6842     -- otherwise, try to update PO/requisition instead
6843     OPEN c_additional_reqs(p_group_id => p_gib.group_id);
6844     /* for overcompletions - create new reqs for subsequent operations IF
6845        an overmove has occurred */
6846     LOOP
6847       FETCH c_additional_reqs INTO l_additional_reqs;
6848       EXIT WHEN c_additional_reqs%NOTFOUND;
6849       -- call PL/SQL API to create additional_req
6850       wip_osp.create_additional_req
6851         (p_wip_entity_id          => l_additional_reqs.wip_id,
6852          p_organization_id        => l_additional_reqs.org_id,
6853          p_repetitive_schedule_id => l_additional_reqs.rep_sched_id,
6854          p_added_quantity         => l_additional_reqs.oc_qty,
6855          p_op_seq                 => l_additional_reqs.op_seq_num);
6856     END LOOP;
6857     IF(c_additional_reqs%ISOPEN) THEN
6858       CLOSE c_additional_reqs;
6859     END IF;
6860   END IF; -- check PO patchset
6861   x_returnStatus := fnd_api.g_ret_sts_success;
6862 
6863   -- write to the log file
6864   IF (l_logLevel <= wip_constants.trace_logging) THEN
6865     wip_logger.exitPoint(p_procName => 'wip_movProc_priv.insert_po_req',
6866                          p_procReturnStatus => x_returnStatus,
6867                          p_msg => 'procedure complete',
6868                          x_returnStatus => l_returnStatus);
6869   END IF;
6870 
6871 EXCEPTION
6872   WHEN others THEN
6873     IF(c_additional_reqs%ISOPEN) THEN
6874       CLOSE c_additional_reqs;
6875     END IF;
6876     x_returnStatus := fnd_api.g_ret_sts_unexp_error;
6877     l_errMsg := 'unexpected error: ' || SQLERRM || 'SQLCODE = ' || SQLCODE;
6878 
6879     IF (l_logLevel <= wip_constants.trace_logging) THEN
6880       wip_logger.exitPoint(p_procName=>'wip_movProc_priv.insert_po_req',
6881                            p_procReturnStatus => x_returnStatus,
6882                            p_msg => l_errMsg,
6883                            x_returnStatus => l_returnStatus);
6884     END IF;
6885     fnd_message.set_name('FND', 'FND_GENERIC_MESSAGE');
6886     fnd_message.set_token('MESSAGE', l_errMsg);
6887     fnd_msg_pub.add;
6888 END insert_po_req;
6889 
6890 /*****************************************************************************
6891  * This procedure is equivalent to wip_startwf in wiltps4.ppc
6892  * This procedure is used to start workflow for OSP stuff
6893  ****************************************************************************/
6894 PROCEDURE start_workflow(p_gib           IN        group_rec_t,
6895                          x_returnStatus OUT NOCOPY VARCHAR2) IS
6896 
6897 CURSOR c_wmti_txn(p_group_id  NUMBER,
6898                   p_txn_date  DATE) IS
6899   SELECT wmti.transaction_id txn_id,
6900          wmti.wip_entity_id  wip_id,
6901          wmti.repetitive_schedule_id sched_id,
6902          wmti.organization_id org_id,
6903          wmti.primary_quantity pri_qty,
6904          muom.unit_of_measure pri_uom,
6905          wmti.to_operation_seq_num op_seq_num,
6906          wor.autocharge_type autocharge_type
6907     FROM bom_resources br,
6908          mtl_units_of_measure muom,
6909          wip_operation_resources wor,
6910          wip_operations wo,
6911          wip_move_txn_interface wmti
6912    WHERE wmti.group_id = p_group_id
6913      AND wmti.process_phase = WIP_CONSTANTS.MOVE_PROC
6914      AND wmti.process_status = WIP_CONSTANTS.RUNNING
6915      AND TRUNC(wmti.transaction_date)= TRUNC(p_txn_date)
6916      AND (wmti.fm_operation_seq_num < wmti.to_operation_seq_num
6917          OR (wmti.fm_operation_seq_num = wmti.to_operation_seq_num
6918              AND wmti.fm_intraoperation_step_type <
6919                  wmti.to_intraoperation_step_type))
6920      AND wmti.to_intraoperation_step_type = WIP_CONSTANTS.QUEUE
6921      AND muom.uom_code = wmti.primary_uom
6922      AND wo.wip_entity_id = wmti.wip_entity_id
6923      AND wo.organization_id = wmti.organization_id
6924      AND NVL(wo.repetitive_schedule_id, -1) =
6925          NVL(wmti.repetitive_schedule_id, -1)
6926      AND wo.operation_seq_num = wmti.to_operation_seq_num
6927      AND NOT EXISTS
6928          (SELECT 'EXISTS'
6929             FROM po_distributions_all pd,
6930                  po_line_locations_all ps
6931            WHERE pd.wip_entity_id = wo.wip_entity_id
6932              AND NVL(pd.wip_repetitive_schedule_id, -1) =
6933                  NVL(wo.repetitive_schedule_id, -1)
6934              AND pd.wip_operation_seq_num = wo.previous_operation_seq_num
6935              AND ps.line_location_id = pd.line_location_id
6936              AND ps.ship_to_location_id IN
6937                 (SELECT location_id
6938                    FROM po_location_associations_all
6939                   WHERE vENDor_id IS NOT NULL
6940                     AND vENDor_site_id IS NOT NULL))
6941      AND wor.wip_entity_id = wo.wip_entity_id
6942      AND wor.organization_id = wo.organization_id
6943      AND NVL(wor.repetitive_schedule_id, -1) =
6944          NVL(wo.repetitive_schedule_id, -1)
6945      AND wor.operation_seq_num = wo.operation_seq_num
6946      AND wor.autocharge_type in(WIP_CONSTANTS.PO_MOVE, --Fix for 2393550
6947                                 WIP_CONSTANTS.PO_RECEIPT)
6948      AND br.resource_id = wor.resource_id
6949      AND br.organization_id = wor.organization_id
6950      AND br.purchase_item_id IS NOT NULL;
6951 
6952 l_params            wip_logger.param_tbl_t;
6953 l_returnStatus      VARCHAR(1);
6954 l_errMsg            VARCHAR2(240);
6955 l_wmti_txn          c_wmti_txn%ROWTYPE;
6956 l_itemkey           VARCHAR2(80) := NULL;
6957 l_logLevel          NUMBER := fnd_log.g_current_runtime_level;
6958 l_success           NUMBER := 0;
6959 l_org_id number;
6960 l_ou_id number;
6961 l_org_acct_ctxt VARCHAR2(30):= 'Accounting Information';
6962 l_req_import VARCHAR2(20); --8919025(Fp 8850950)
6963 
6964 -- new parameter used to determine whether we have to launch "Req Import"
6965 -- concurrent program or not
6966 l_osp_exist         NUMBER := WIP_CONSTANTS.NO;
6967 l_launch_req_import NUMBER := WIP_CONSTANTS.YES;
6968 l_po_receipt_exsit  NUMBER := WIP_CONSTANTS.NO; --Bug 13768020
6969 l_init_reqappr VARCHAR2(1);/*ER 4276433*/
6970 
6971 BEGIN
6972   -- write parameter value to log file
6973   IF (l_logLevel <= wip_constants.trace_logging) THEN
6974     l_params(1).paramName   := 'p_group_id';
6975     l_params(1).paramValue  :=  p_gib.group_id;
6976     l_params(2).paramName   := 'p_txn_date';
6977     l_params(2).paramValue  :=  p_gib.txn_date;
6978     wip_logger.entryPoint(p_procName =>'wip_movProc_priv.start_workflow',
6979                           p_params => l_params,
6980                           x_returnStatus => l_returnStatus);
6981   END IF;
6982   OPEN c_wmti_txn(p_group_id  => p_gib.group_id,
6983                   p_txn_date  => p_gib.txn_date);
6984   LOOP
6985     FETCH c_wmti_txn INTO l_wmti_txn;
6986     EXIT WHEN c_wmti_txn%NOTFOUND;
6987 
6988     l_osp_exist := WIP_CONSTANTS.YES;
6989     l_org_id := l_wmti_txn.org_id;
6990 
6991     IF(l_wmti_txn.autocharge_type = WIP_CONSTANTS.PO_MOVE) THEN
6992       -- Launch workflow only for PO_MOVE
6993       -- call PL/SQL API to start workflow
6994 
6995       -- Fixed bug 5333089. Need to set org context before launching workflow
6996       -- because Req Import need this information.
6997       -- get the OU, set context for MOAC. Need to set it for each PO Move
6998       -- record found.
6999       select to_number(ORG_INFORMATION3) into l_ou_id
7000         from HR_ORGANIZATION_INFORMATION
7001        where ORGANIZATION_ID = l_org_id
7002          and ORG_INFORMATION_CONTEXT = l_org_acct_ctxt;
7003       FND_REQUEST.SET_ORG_ID (l_ou_id);
7004 
7005       wip_osp_shp_i_wf.StartWFProcess
7006         (p_itemtype         => 'WIPISHPW',
7007          p_itemkey          => l_itemkey,
7008          p_workflow_process => 'INTERMEDIATE_SHIP',
7009          p_wip_entity_id    => l_wmti_txn.wip_id,
7010          p_rep_sched_id     => l_wmti_txn.sched_id,
7011          p_organization_id  => l_wmti_txn.org_id,
7012          p_primary_qty      => l_wmti_txn.pri_qty,
7013          p_primary_uom      => l_wmti_txn.pri_uom,
7014          p_op_seq_num       => l_wmti_txn.op_seq_num);
7015 
7016       IF l_itemkey IS NOT NULL THEN
7017         UPDATE wip_move_transactions
7018            SET wf_itemtype = 'WIPISHPW',
7019                wf_itemkey  = l_itemkey
7020          WHERE transaction_id = l_wmti_txn.txn_id;
7021       END IF;
7022       -- No need to lauch "Req Import" again if we already laucned the workflow
7023       -- because "Req Import" is part of the workflow itself.
7024       l_launch_req_import := WIP_CONSTANTS.NO;
7025       -- Fix for Bug#4369684. Need to reassign to null for multiple OSP Move.
7026       l_itemkey := NULL;
7027     END IF; -- PO_MOVE
7028 
7029 	/*Bug 13768020*/
7030 	IF(l_wmti_txn.autocharge_type = WIP_CONSTANTS.PO_RECEIPT) THEN
7031 	  l_po_receipt_exsit := WIP_CONSTANTS.YES;
7032 	END IF;
7033 
7034   END LOOP;
7035 
7036   /*Bug 13768020: Do not launch "Req Import" when there is po receipt resource and profile WIP_OSP_REQ is set to No.*/
7037     IF( l_po_receipt_exsit = WIP_CONSTANTS.YES AND
7038 	    fnd_profile.value('WIP_OSP_REQ') = WIP_CONSTANTS.NO) THEN
7039 			l_launch_req_import := WIP_CONSTANTS.NO;
7040 	END IF;
7041 
7042  /*Bug 13768020: Launch "Req Import" when there is po receipt resource, worflow is diabled and WIP_OSP_REQ is set to Yes*/
7043 	IF(l_launch_req_import = WIP_CONSTANTS.NO AND
7044      l_po_receipt_exsit = WIP_CONSTANTS.YES AND
7045 	   fnd_profile.value('WIP_OSP_REQ') = WIP_CONSTANTS.YES AND
7046      fnd_profile.value('WIP_OSP_WF') = WIP_CONSTANTS.NO) THEN
7047         l_launch_req_import := WIP_CONSTANTS.YES;
7048 	END IF;
7049 
7050   -- If OSP item exists, and there is no workflow launch yet, we have to launch
7051   -- "Req Import" concurrent program
7052   IF(l_osp_exist = WIP_CONSTANTS.YES AND
7053      l_launch_req_import = WIP_CONSTANTS.YES) THEN
7054 
7055     -- get the OU, set context for MOAC
7056     select to_number(ORG_INFORMATION3) into l_ou_id
7057       from HR_ORGANIZATION_INFORMATION
7058      where ORGANIZATION_ID = l_org_id
7059        and ORG_INFORMATION_CONTEXT = l_org_acct_ctxt;
7060     FND_REQUEST.SET_ORG_ID (l_ou_id);
7061 
7062     /*Fix for bug 8919025(Fp 8850950)*/
7063     BEGIN
7064       select reqimport_group_by_code
7065       into l_req_import
7066       from po_system_parameters_all
7067       where org_id = l_ou_id;
7068 
7069       EXCEPTION
7070         WHEN NO_DATA_FOUND THEN
7071  	       raise fnd_api.g_exc_unexpected_error;
7072     END;
7073 	/*ER 4276433*/
7074 	if(fnd_profile.value('WIP_OSP_INITIATE_REQAPPR') = WIP_CONSTANTS.NO) then
7075          l_init_reqappr := 'N';
7076 	else
7077          l_init_reqappr := 'Y';
7078 	end if;
7079 
7080     l_success := fnd_request.submit_request(
7081         'PO', 'REQIMPORT', NULL, NULL, FALSE,'WIP', NULL, l_req_import, --fix bug 8919025(Fp 8850950)
7082         NULL ,'N', l_init_reqappr, chr(0), NULL, NULL, NULL,
7083         NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
7084         NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
7085         NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
7086         NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
7087         NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
7088         NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
7089         NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
7090         NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
7091         NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL
7092         ) ;
7093     -- We can just ignore the return status
7094   END IF; -- all OSP are PO_RECEIPT
7095 
7096   IF(c_wmti_txn%ISOPEN) THEN
7097     CLOSE c_wmti_txn;
7098   END IF;
7099   x_returnStatus := fnd_api.g_ret_sts_success;
7100   -- write to the log file
7101   IF (l_logLevel <= wip_constants.trace_logging) THEN
7102     wip_logger.exitPoint(p_procName => 'wip_movProc_priv.start_workflow',
7103                          p_procReturnStatus => x_returnStatus,
7104                          p_msg => 'procedure complete',
7105                          x_returnStatus => l_returnStatus);
7106   END IF;
7107 
7108 EXCEPTION
7109 
7110   WHEN others THEN
7111     IF(c_wmti_txn%ISOPEN) THEN
7112       CLOSE c_wmti_txn;
7113     END IF;
7114     x_returnStatus := fnd_api.g_ret_sts_unexp_error;
7115     l_errMsg := 'unexpected error: ' || SQLERRM || 'SQLCODE = ' || SQLCODE;
7116 
7117     IF (l_logLevel <= wip_constants.trace_logging) THEN
7118       wip_logger.exitPoint(p_procName=>'wip_movProc_priv.start_workflow',
7119                            p_procReturnStatus => x_returnStatus,
7120                            p_msg => l_errMsg,
7121                            x_returnStatus => l_returnStatus);
7122     END IF;
7123     fnd_message.set_name('FND', 'FND_GENERIC_MESSAGE');
7124     fnd_message.set_token('MESSAGE', l_errMsg);
7125     fnd_msg_pub.add;
7126 END start_workflow;
7127 
7128 /*****************************************************************************
7129  * This procedure is equivalent to witpsuc_op_units_complete in wiltps5.ppc
7130  * This procedure is used to update operation unit complete in
7131  * WIP_OPERATIONS
7132  ****************************************************************************/
7133 PROCEDURE update_complete_qty(p_gib           IN        group_rec_t,
7134                               p_txn_id        IN        NUMBER := NULL,
7135                               x_returnStatus OUT NOCOPY VARCHAR2) IS
7136 
7137 l_params       wip_logger.param_tbl_t;
7138 l_returnStatus VARCHAR(1);
7139 l_msg          VARCHAR(240);
7140 l_errMsg       VARCHAR2(240);
7141 l_logLevel     NUMBER := fnd_log.g_current_runtime_level;
7142 
7143 BEGIN
7144   -- write parameter value to log file
7145   IF (l_logLevel <= wip_constants.trace_logging) THEN
7146     l_params(1).paramName   := 'p_group_id';
7147     l_params(1).paramValue  :=  p_gib.group_id;
7148     l_params(2).paramName   := 'p_txn_date';
7149     l_params(2).paramValue  :=  p_gib.txn_date;
7150     l_params(3).paramName   := 'p_txn_id';
7151     l_params(3).paramValue  :=  p_txn_id;
7152     wip_logger.entryPoint(p_procName =>'wip_movProc_priv.update_complete_qty',
7153                           p_params => l_params,
7154                           x_returnStatus => l_returnStatus);
7155   END IF;
7156 
7157   /*------------------------------------------------------------+
7158    |  Update quantity_completed
7159    +------------------------------------------------------------*/
7160    UPDATE wip_operations wop
7161      SET (quantity_completed,
7162           last_updated_by,
7163           last_update_date,
7164           last_update_login,
7165           request_id,
7166           program_application_id,
7167           program_id,
7168           program_update_date
7169          ) =
7170          (SELECT decode(wop.repetitive_schedule_id,null, /* Bugfix 6333820 FP for 5987013: decode between 4081320 fix (for discrete) and original code (for repetitive) to allow negative quantity_completed for repetitive and rail at 0 for discrete */
7171                 greatest(0, wop.quantity_completed + -- added greatest function to fix FP bug 4081320
7172                    NVL(SUM(NVL(wma1.primary_quantity, wmti.primary_quantity) *
7173                    DECODE(SIGN(wmti.to_operation_seq_num -
7174                                wmti.fm_operation_seq_num),
7175                    0,DECODE(SIGN(wmti.fm_intraoperation_step_type -
7176                                  WIP_CONSTANTS.RUN),
7177                      0,DECODE(SIGN(wmti.to_intraoperation_step_type -
7178                                    WIP_CONSTANTS.RUN),1,1,-1),
7179                     -1,DECODE(SIGN(wmti.to_intraoperation_step_type -
7180                                    WIP_CONSTANTS.RUN),1,1,-1),
7181                      1,-1),
7182                    1, 1,
7183                   -1,-1)
7184                    ),0)), /* for discrete */
7185 		wop.quantity_completed + -- added greatest function to fix FP bug 4081320
7186                    NVL(SUM(NVL(wma1.primary_quantity, wmti.primary_quantity) *
7187                    DECODE(SIGN(wmti.to_operation_seq_num -
7188                                wmti.fm_operation_seq_num),
7189                    0,DECODE(SIGN(wmti.fm_intraoperation_step_type -
7190                                  WIP_CONSTANTS.RUN),
7191                      0,DECODE(SIGN(wmti.to_intraoperation_step_type -
7192                                    WIP_CONSTANTS.RUN),1,1,-1),
7193                     -1,DECODE(SIGN(wmti.to_intraoperation_step_type -
7194                                    WIP_CONSTANTS.RUN),1,1,-1),
7195                      1,-1),
7196                    1, 1,
7197                   -1,-1)
7198                    ),0) /* for repetitive */
7199                    ),    -- quantity_completed
7200                  MAX(wmti.last_updated_by),
7201                  SYSDATE,              -- last_update_date
7202                  DECODE(p_gib.login_id,-1,NULL,p_gib.login_id),
7203                  DECODE(p_gib.request_id,-1,NULL,p_gib.request_id),
7204                  DECODE(p_gib.application_id,-1,NULL,p_gib.application_id),
7205                  DECODE(p_gib.program_id,-1,NULL,p_gib.program_id),
7206                  DECODE(p_gib.request_id,-1,NULL,SYSDATE)-- program_update_date
7207             FROM wip_operations wop1,
7208                  wip_move_txn_allocations wma1,
7209                  wip_move_txn_interface wmti
7210            WHERE wop1.rowid = wop.rowid
7211              AND wmti.group_id = p_gib.group_id
7212              AND (p_txn_id IS NULL OR wmti.transaction_id = p_txn_id)
7213              AND TRUNC(wmti.transaction_date) = TRUNC(p_gib.txn_date)
7214              AND wmti.process_phase = WIP_CONSTANTS.MOVE_PROC
7215              AND wmti.process_status = WIP_CONSTANTS.RUNNING
7216              AND wop1.organization_id = wmti.organization_id
7217              AND wop1.wip_entity_id = wmti.wip_entity_id
7218              AND wmti.organization_id = wma1.organization_id (+)
7219              AND wmti.transaction_id = wma1.transaction_id (+)
7220              AND NVL(wma1.repetitive_schedule_id,0) =
7221                  NVL(wop1.repetitive_schedule_id,0)
7222              AND ((wop1.operation_seq_num >= wmti.fm_operation_seq_num
7223                  + DECODE(SIGN(wmti.fm_intraoperation_step_type -
7224                                WIP_CONSTANTS.RUN),1,1,0)
7225                AND wop1.operation_seq_num < wmti.to_operation_seq_num
7226                    + DECODE(SIGN(wmti.to_intraoperation_step_type -
7227                                  WIP_CONSTANTS.RUN),1,1,0)
7228                AND (wmti.to_operation_seq_num > wmti.fm_operation_seq_num
7229                   OR (wmti.to_operation_seq_num = wmti.fm_operation_seq_num
7230                       AND wmti.fm_intraoperation_step_type <= WIP_CONSTANTS.RUN
7231                       AND wmti.to_intraoperation_step_type > WIP_CONSTANTS.RUN))
7232                AND (wop1.count_point_type < WIP_CONSTANTS.NO_MANUAL
7233                   OR wop1.operation_seq_num = wmti.fm_operation_seq_num
7234                   OR (wop1.operation_seq_num = wmti.to_operation_seq_num
7235                      AND wmti.to_intraoperation_step_type > WIP_CONSTANTS.RUN)))
7236                OR
7237                   (wop1.operation_seq_num < wmti.fm_operation_seq_num
7238                  + DECODE(SIGN(wmti.fm_intraoperation_step_type -
7239                                WIP_CONSTANTS.RUN),1,1,0)
7240                AND wop1.operation_seq_num >= wmti.to_operation_seq_num
7241                    + DECODE(SIGN(wmti.to_intraoperation_step_type -
7242                                  WIP_CONSTANTS.RUN),1,1,0)
7243                AND (wmti.fm_operation_seq_num > wmti.to_operation_seq_num
7244                   OR (wmti.fm_operation_seq_num = wmti.to_operation_seq_num
7245                       AND wmti.to_intraoperation_step_type <= WIP_CONSTANTS.RUN
7246                       AND wmti.fm_intraoperation_step_type > WIP_CONSTANTS.RUN))
7247                AND (wop1.count_point_type < WIP_CONSTANTS.NO_MANUAL
7248                   OR (wop1.operation_seq_num = wmti.to_operation_seq_num)
7249                   /*Fix bug 9538314(fp of 9344254) ,revert the fix of bug 1834450 as it caused regression*/
7250 --/*fix bug 1834450*/   AND wop1.count_point_type < WIP_CONSTANTS.NO_MANUAL )
7251                   OR (wop1.operation_seq_num = wmti.fm_operation_seq_num
7252                      AND wmti.fm_intraoperation_step_type > WIP_CONSTANTS.RUN)))
7253                  ))
7254     WHERE wop.rowid IN
7255          (SELECT wop2.rowid
7256             FROM wip_operations wop2,
7257                  wip_move_txn_allocations wma2,
7258                  wip_move_txn_interface wmti
7259            WHERE wop2.organization_id = wmti.organization_id
7260              AND wmti.group_id = p_gib.group_id
7261              AND (p_txn_id IS NULL OR wmti.transaction_id = p_txn_id)
7262              AND TRUNC(wmti.transaction_date) = TRUNC(p_gib.txn_date)
7263              AND wmti.process_phase = WIP_CONSTANTS.MOVE_PROC
7264              AND wmti.process_status = WIP_CONSTANTS.RUNNING
7265              AND wop2.organization_id = wmti.organization_id
7266              AND wop2.wip_entity_id = wmti.wip_entity_id
7267              AND wmti.organization_id = wma2.organization_id (+)
7268              AND wmti.transaction_id = wma2.transaction_id (+)
7269              AND NVL(wma2.repetitive_schedule_id,0) =
7270                  NVL(wop2.repetitive_schedule_id,0)
7271              AND ((wop2.operation_seq_num >= wmti.fm_operation_seq_num
7272                  + DECODE(SIGN(wmti.fm_intraoperation_step_type -
7273                                WIP_CONSTANTS.RUN),1,1,0)
7274                AND wop2.operation_seq_num < wmti.to_operation_seq_num
7275                   + DECODE(SIGN(wmti.to_intraoperation_step_type -
7276                                 WIP_CONSTANTS.RUN),1,1,0)
7277                AND (wmti.to_operation_seq_num > wmti.fm_operation_seq_num
7278                   OR (wmti.to_operation_seq_num = wmti.fm_operation_seq_num
7279                      AND wmti.fm_intraoperation_step_type <= WIP_CONSTANTS.RUN
7280                      AND wmti.to_intraoperation_step_type > WIP_CONSTANTS.RUN))
7281                AND (wop2.count_point_type < WIP_CONSTANTS.NO_MANUAL
7282                   OR wop2.operation_seq_num = wmti.fm_operation_seq_num
7283                   OR (wop2.operation_seq_num = wmti.to_operation_seq_num
7284                      AND wmti.to_intraoperation_step_type > WIP_CONSTANTS.RUN)))
7285              OR
7286                   (wop2.operation_seq_num < wmti.fm_operation_seq_num
7287                  + DECODE(SIGN(wmti.fm_intraoperation_step_type -
7288                                WIP_CONSTANTS.RUN),1,1,0)
7289                AND wop2.operation_seq_num >= wmti.to_operation_seq_num
7290                   + DECODE(SIGN(wmti.to_intraoperation_step_type -
7291                                 WIP_CONSTANTS.RUN),1,1,0)
7292                AND (wmti.fm_operation_seq_num > wmti.to_operation_seq_num
7293                   OR (wmti.fm_operation_seq_num = wmti.to_operation_seq_num
7294                      AND wmti.to_intraoperation_step_type <= WIP_CONSTANTS.RUN
7295                      AND wmti.fm_intraoperation_step_type > WIP_CONSTANTS.RUN))
7296                AND (wop2.count_point_type < WIP_CONSTANTS.NO_MANUAL
7297                   OR (wop2.operation_seq_num = wmti.to_operation_seq_num)
7298                   /*Fix bug 9538314(fp of 9344254) ,revert the fix of bug 1834450 as it caused regression*/
7299 --/*fix bug 1834450*/  AND wop2.count_point_type < WIP_CONSTANTS.NO_MANUAL)
7300                   OR (wop2.operation_seq_num = wmti.fm_operation_seq_num
7301                      AND wmti.fm_intraoperation_step_type > WIP_CONSTANTS.RUN)))
7302                  ));
7303 
7304   -- IF debug message level = 2, write statement below to log file
7305   IF (l_logLevel <= wip_constants.full_logging) THEN
7306     fnd_message.set_name('WIP', 'WIP_UPDATED_ROWS');
7307     fnd_message.set_token('ENTITY1', SQL%ROWCOUNT);
7308     fnd_message.set_token('ENTITY2', 'WIP_OPERATIONS');
7309     l_msg := fnd_message.get;
7310     wip_logger.log(p_msg          => l_msg,
7311                    x_returnStatus => l_returnStatus);
7312   END IF;
7313 
7314   x_returnStatus := fnd_api.g_ret_sts_success;
7315 
7316   -- write to the log file
7317   IF (l_logLevel <= wip_constants.trace_logging) THEN
7318     wip_logger.exitPoint(p_procName => 'wip_movProc_priv.update_complete_qty',
7319                          p_procReturnStatus => x_returnStatus,
7320                          p_msg => 'procedure complete',
7321                          x_returnStatus => l_returnStatus);
7322   END IF;
7323 
7324 EXCEPTION
7325   WHEN others THEN
7326     x_returnStatus := fnd_api.g_ret_sts_unexp_error;
7327     l_errMsg := 'unexpected error: ' || SQLERRM || 'SQLCODE = ' || SQLCODE;
7328 
7329     IF (l_logLevel <= wip_constants.trace_logging) THEN
7330       wip_logger.exitPoint(p_procName=>'wip_movProc_priv.update_complete_qty',
7331                            p_procReturnStatus => x_returnStatus,
7332                            p_msg => l_errMsg,
7333                            x_returnStatus => l_returnStatus);
7334     END IF;
7335     fnd_message.set_name('FND', 'FND_GENERIC_MESSAGE');
7336     fnd_message.set_token('MESSAGE', l_errMsg);
7337     fnd_msg_pub.add;
7338 END update_complete_qty;
7339 
7340 /*****************************************************************************
7341  * This procedure is equivalent to wit_op_snapshot in wiltps5.ppc
7342  * This procedure is used to call Costing snapshot CSTACOSN.op_snapshot
7343  ****************************************************************************/
7344 PROCEDURE op_snapshot(p_mtl_temp_id   IN        NUMBER,
7345                       x_returnStatus OUT NOCOPY VARCHAR2) IS
7346 
7347 l_params           wip_logger.param_tbl_t;
7348 l_returnStatus     VARCHAR(1);
7349 l_returnValue      NUMBER;
7350 l_msgCount         NUMBER;
7351 l_errCode          VARCHAR(240);
7352 l_errMsg           VARCHAR(240);
7353 l_logLevel         NUMBER := fnd_log.g_current_runtime_level;
7354 
7355 BEGIN
7356   -- write parameter value to log file
7357   IF (l_logLevel <= wip_constants.trace_logging) THEN
7358     l_params(1).paramName   := 'p_mtl_temp_id';
7359     l_params(1).paramValue  :=  p_mtl_temp_id;
7360     wip_logger.entryPoint(p_procName =>'wip_movProc_priv.op_snapshot',
7361                           p_params => l_params,
7362                           x_returnStatus => l_returnStatus);
7363   END IF;
7364 
7365   l_returnValue := CSTACOSN.op_snapshot
7366                            (i_txn_temp_id  => p_mtl_temp_id,
7367                             err_num        => l_msgCount,
7368                             err_code       => l_errCode,
7369                             err_msg        => l_errMsg);
7370   IF(l_returnValue <> 1) THEN
7371      l_errMsg := 'CSTACOSN.op_snapshot failed';
7372      raise fnd_api.g_exc_unexpected_error;
7373   END IF;
7374 
7375   x_returnStatus := fnd_api.g_ret_sts_success;
7376 
7377   -- write to the log file
7378   IF (l_logLevel <= wip_constants.trace_logging) THEN
7379     wip_logger.exitPoint(p_procName => 'wip_movProc_priv.op_snapshot',
7380                          p_procReturnStatus => x_returnStatus,
7381                          p_msg => 'procedure complete',
7382                          x_returnStatus => l_returnStatus);
7383   END IF;
7384 
7385 EXCEPTION
7386   WHEN fnd_api.g_exc_unexpected_error THEN
7387     x_returnStatus := fnd_api.g_ret_sts_unexp_error;
7388 
7389     IF (l_logLevel <= wip_constants.trace_logging) THEN
7390       wip_logger.exitPoint(p_procName => 'wip_movProc_priv.op_snapshot',
7391                            p_procReturnStatus => x_returnStatus,
7392                            p_msg => l_errMsg,
7393                            x_returnStatus => l_returnStatus);
7394     END IF;
7395 
7396     fnd_message.set_name('CST', l_errCode);
7397     fnd_msg_pub.add;
7398 
7399   WHEN others THEN
7400     x_returnStatus := fnd_api.g_ret_sts_unexp_error;
7401     l_errMsg := 'unexpected error: ' || SQLERRM || 'SQLCODE = ' || SQLCODE;
7402 
7403     IF (l_logLevel <= wip_constants.trace_logging) THEN
7404       wip_logger.exitPoint(p_procName=>'wip_movProc_priv.op_snapshot',
7405                            p_procReturnStatus => x_returnStatus,
7406                            p_msg => l_errMsg,
7407                            x_returnStatus => l_returnStatus);
7408     END IF;
7409     fnd_message.set_name('FND', 'FND_GENERIC_MESSAGE');
7410     fnd_message.set_token('MESSAGE', l_errMsg);
7411     fnd_msg_pub.add;
7412 END op_snapshot;
7413 
7414 /*****************************************************************************
7415  * This procedure is equivalent to wit_snapshot_online in wiltps5.ppc
7416  * This procedure is used to call Costing snapshot
7417  ****************************************************************************/
7418 PROCEDURE snapshot_online(p_mtl_header_id  IN        NUMBER,
7419                           p_org_id         IN        NUMBER,
7420                           p_txn_type       IN        NUMBER,
7421                           p_txn_type_id    IN        NUMBER,
7422                           p_txn_action_id  IN        NUMBER,
7423                           x_returnStatus  OUT NOCOPY VARCHAR2) IS
7424 
7425 CURSOR c_mmtt IS
7426   SELECT transaction_temp_id mtl_temp_id
7427     FROM mtl_material_transactions_temp
7428    WHERE transaction_header_id = p_mtl_header_id
7429      AND transaction_action_id = p_txn_action_id
7430      AND transaction_type_id = p_txn_type_id
7431      AND transaction_source_type_id = TPS_INV_JOB_OR_SCHED
7432      AND (wip_entity_type = WIP_CONSTANTS.DISCRETE
7433           OR wip_entity_type = WIP_CONSTANTS.LOTBASED)  /*WSM */
7434    ORDER BY transaction_date, transaction_source_id; /*Bug 7314913: Added order by clause*/
7435 
7436 l_params               wip_logger.param_tbl_t;
7437 l_returnStatus         VARCHAR(1);
7438 l_errMsg               VARCHAR(240);
7439 l_pri_cost_method      NUMBER;
7440 l_mandatory_scrap_flag NUMBER;
7441 l_mmtt                 c_mmtt%ROWTYPE;
7442 l_logLevel             NUMBER := fnd_log.g_current_runtime_level;
7443 
7444 BEGIN
7445   -- write parameter value to log file
7446   IF (l_logLevel <= wip_constants.trace_logging) THEN
7447     l_params(1).paramName   := 'p_mtl_header_id';
7448     l_params(1).paramValue  :=  p_mtl_header_id;
7449     l_params(2).paramName   := 'p_org_id';
7450     l_params(2).paramValue  :=  p_org_id;
7451     l_params(3).paramName   := 'p_txn_type';
7452     l_params(3).paramValue  :=  p_txn_type;
7453     l_params(4).paramName   := 'p_txn_type_id';
7454     l_params(4).paramValue  :=  p_txn_type_id;
7455     l_params(5).paramName   := 'p_txn_action_id';
7456     l_params(5).paramValue  :=  p_txn_action_id;
7457     wip_logger.entryPoint(p_procName =>'wip_movProc_priv.snapshot_online',
7458                           p_params => l_params,
7459                           x_returnStatus => l_returnStatus);
7460   END IF;
7461 
7462   -- get primary cost method
7463   SELECT mp.primary_cost_method
7464     INTO l_pri_cost_method
7465     FROM mtl_parameters mp
7466    WHERE mp.organization_id = p_org_id;
7467 
7468   -- get mandatoty scrap flag
7469   SELECT wp.mandatory_scrap_flag
7470     INTO l_mandatory_scrap_flag
7471     FROM wip_parameters wp
7472    WHERE wp.organization_id = p_org_id;
7473 
7474   IF((l_pri_cost_method = WIP_CONSTANTS.COST_AVG  OR
7475       l_pri_cost_method = WIP_CONSTANTS.COST_FIFO OR
7476       l_pri_cost_method = WIP_CONSTANTS.COST_LIFO)
7477      AND
7478      (p_txn_type = WIP_CONSTANTS.COMP_TXN OR
7479       p_txn_type = WIP_CONSTANTS.RET_TXN  OR
7480       p_txn_type = WIP_CONSTANTS.MOVE_TXN)) THEN
7481 
7482       -- Fix bug 2369642
7483       --(p_txn_type = WIP_CONSTANTS.MOVE_TXN AND
7484       -- l_mandatory_scrap_flag = WIP_CONSTANTS.YES))) THEN
7485 
7486     UPDATE mtl_material_transactions_temp
7487        SET transaction_temp_id = mtl_material_transactions_s.nextval
7488      WHERE transaction_header_id = p_mtl_header_id
7489        AND transaction_temp_id IS NULL
7490        AND transaction_action_id = p_txn_action_id
7491        AND transaction_type_id = p_txn_type_id
7492        AND transaction_source_type_id = TPS_INV_JOB_OR_SCHED
7493        AND (wip_entity_type = WIP_CONSTANTS.DISCRETE
7494             OR wip_entity_type = WIP_CONSTANTS.LOTBASED);  /*WSM*/
7495 
7496     FOR l_mmtt IN c_mmtt LOOP
7497       op_snapshot(p_mtl_temp_id   => l_mmtt.mtl_temp_id,
7498                   x_returnStatus  => x_returnStatus);
7499 
7500       IF(x_returnStatus <> fnd_api.g_ret_sts_success) THEN
7501         l_errMsg := 'wip_movProc_priv.op_snapshot failed';
7502         raise fnd_api.g_exc_unexpected_error;
7503       END IF; -- check return status
7504     END LOOP; -- END for loop
7505   END IF;
7506 
7507   x_returnStatus := fnd_api.g_ret_sts_success;
7508 
7509   -- write to the log file
7510   IF (l_logLevel <= wip_constants.trace_logging) THEN
7511     wip_logger.exitPoint(p_procName => 'wip_movProc_priv.snapshot_online',
7512                          p_procReturnStatus => x_returnStatus,
7513                          p_msg => 'procedure complete',
7514                          x_returnStatus => l_returnStatus);
7515   END IF;
7516 
7517 EXCEPTION
7518    WHEN fnd_api.g_exc_unexpected_error THEN
7519     x_returnStatus := fnd_api.g_ret_sts_unexp_error;
7520 
7521     IF (l_logLevel <= wip_constants.trace_logging) THEN
7522       wip_logger.exitPoint(p_procName => 'wip_movProc_priv.snapshot_online',
7523                            p_procReturnStatus => x_returnStatus,
7524                            p_msg => l_errMsg,
7525                            x_returnStatus => l_returnStatus);
7526     END IF;
7527 
7528   WHEN others THEN
7529     x_returnStatus := fnd_api.g_ret_sts_unexp_error;
7530     l_errMsg := 'unexpected error: ' || SQLERRM || 'SQLCODE = ' || SQLCODE;
7531 
7532     IF (l_logLevel <= wip_constants.trace_logging) THEN
7533       wip_logger.exitPoint(p_procName=>'wip_movProc_priv.snapshot_online',
7534                            p_procReturnStatus => x_returnStatus,
7535                            p_msg => l_errMsg,
7536                            x_returnStatus => l_returnStatus);
7537     END IF;
7538     fnd_message.set_name('FND', 'FND_GENERIC_MESSAGE');
7539     fnd_message.set_token('MESSAGE', l_errMsg);
7540     fnd_msg_pub.add;
7541 END snapshot_online;
7542 
7543 /*****************************************************************************
7544  * This procedure is equivalent to wit_snapshot_background in wiltps5.ppc
7545  * This procedure is used to call Costing snapshot
7546  ****************************************************************************/
7547 PROCEDURE snapshot_background(p_group_id      IN        NUMBER,
7548                               p_txn_id        IN        NUMBER := NULL,
7549                               p_txn_date      IN        DATE,
7550                               x_returnStatus OUT NOCOPY VARCHAR2) IS
7551 
7552  /* Fixed Bug# 1480410 -
7553     Added source_code field in following cursor.
7554     --
7555     This is applicable for only Average Costing case
7556     --
7557 
7558     The original condition was treating records inserted from the receiving
7559     transactions for osp item as records inserted from the open interface
7560     process and thus validating against cst_comp_snap_temp table and erroring
7561     out as there is no record. This fix would treat records inserted into
7562     wip_move_txn_interface by receiving transaction as created from the WIP
7563     and thus will create a record in the cst_comp_snap_temp.
7564 */
7565 
7566 CURSOR c_txns IS
7567    SELECT wmti.transaction_id txn_id,
7568           mmtt.transaction_temp_id mtl_temp_id,
7569           DECODE(NVL(wmti.source_line_id,-1),
7570            -1, 2,
7571             1) load_from_interface,
7572           DECODE(NVL(wmti.source_code,'WIP'),
7573            'WIP', -1,
7574            'RCV', -1,
7575             1) source_code,
7576           MMTT.PRIMARY_QUANTITY primary_quantity
7577      FROM wip_move_txn_interface wmti,
7578           mtl_material_transactions_temp mmtt,
7579           mtl_parameters mp
7580     WHERE wmti.group_id = p_group_id
7581       AND (p_txn_id IS NULL OR wmti.transaction_id = p_txn_id)
7582       AND TRUNC(wmti.transaction_date) = TRUNC(p_txn_date)
7583       AND wmti.process_phase = WIP_CONSTANTS.MOVE_PROC
7584       AND wmti.process_status = WIP_CONSTANTS.RUNNING
7585       AND mmtt.move_transaction_id = wmti.transaction_id
7586       /* Improve performance */
7587       AND mmtt.organization_id = wmti.organization_id
7588       AND mmtt.transaction_source_id = wmti.wip_entity_id
7589       AND mmtt.transaction_source_type_id = TPS_INV_JOB_OR_SCHED
7590       /* End Improve performance */
7591       AND mmtt.wip_entity_type IN (WIP_CONSTANTS.DISCRETE,
7592                                    WIP_CONSTANTS.LOTBASED)  /*WSM */
7593       -- Fixed bug2515712 (do not insert component related record)
7594       AND mmtt.transaction_action_id IN (WIP_CONSTANTS.SCRASSY_ACTION,
7595                                          WIP_CONSTANTS.RETASSY_ACTION,
7596                                          WIP_CONSTANTS.CPLASSY_ACTION)
7597       AND mp.organization_id = wmti.organization_id
7598       AND mp.primary_cost_method IN (WIP_CONSTANTS.COST_AVG,
7599                                      WIP_CONSTANTS.COST_FIFO,
7600                                      WIP_CONSTANTS.COST_LIFO)
7601       AND (((wmti.fm_intraoperation_step_type = WIP_CONSTANTS.SCRAP
7602              OR wmti.to_intraoperation_step_type = WIP_CONSTANTS.SCRAP)
7603              AND wmti.scrap_account_id IS NOT NULL)
7604              -- Fix bug 2369642
7605              -- AND wp.mandatory_scrap_flag = WIP_CONSTANTS.YES)
7606            OR
7607             (wmti.transaction_type IN (WIP_CONSTANTS.COMP_TXN,
7608                                       WIP_CONSTANTS.RET_TXN)));
7609 
7610 l_params          wip_logger.param_tbl_t;
7611 l_returnStatus    VARCHAR(1);
7612 l_errMsg          VARCHAR(240);
7613 l_errCode         VARCHAR(240);
7614 l_txns            c_txns%ROWTYPE;
7615 l_num_snapshot    NUMBER;
7616 l_returnValue     NUMBER;
7617 l_interface_table NUMBER;
7618 l_msgCount        NUMBER;
7619 l_logLevel        NUMBER := fnd_log.g_current_runtime_level;
7620 
7621 BEGIN
7622   -- write parameter value to log file
7623   IF (l_logLevel <= wip_constants.trace_logging) THEN
7624     l_params(1).paramName   := 'p_group_id';
7625     l_params(1).paramValue  :=  p_group_id;
7626     l_params(2).paramName   := 'p_txn_date';
7627     l_params(2).paramValue  :=  p_txn_date;
7628     l_params(3).paramName   := 'p_txn_id';
7629     l_params(3).paramValue  :=  p_txn_id;
7630     wip_logger.entryPoint(p_procName =>'wip_movProc_priv.snapshot_background',
7631                           p_params => l_params,
7632                           x_returnStatus => l_returnStatus);
7633   END IF;
7634 
7635   -- check for snapshot transactions through the interface
7636   SELECT COUNT(*)
7637     INTO l_num_snapshot
7638     FROM wip_move_txn_interface wmti,
7639          mtl_parameters mp
7640         -- wip_parameters wp
7641    WHERE wmti.group_id = p_group_id
7642      AND wmti.process_phase  = WIP_CONSTANTS.MOVE_PROC
7643      AND wmti.process_status = WIP_CONSTANTS.RUNNING
7644      AND wmti.organization_id = mp.organization_id
7645      AND mp.primary_cost_method IN (WIP_CONSTANTS.COST_AVG,
7646                                     WIP_CONSTANTS.COST_FIFO,
7647                                     WIP_CONSTANTS.COST_LIFO)
7648      --AND wp.organization_id = wmti.organization_id
7649      AND (((wmti.fm_intraoperation_step_type = WIP_CONSTANTS.SCRAP
7650             OR wmti.to_intraoperation_step_type = WIP_CONSTANTS.SCRAP)
7651             AND wmti.scrap_account_id IS NOT NULL)
7652           --  AND wp.mandatory_scrap_flag = WIP_CONSTANTS.YES)
7653           OR
7654            (wmti.transaction_type IN (WIP_CONSTANTS.COMP_TXN,
7655                                      WIP_CONSTANTS.RET_TXN)));
7656 
7657   IF(l_num_snapshot = 0) THEN
7658     GOTO END_txn;
7659   END IF;
7660 
7661   -- Modified Sql For Performance Bug 13798118. Used Exists instead of In Clause.
7662 
7663   UPDATE mtl_material_transactions_temp mmtt1
7664   SET mmtt1.transaction_temp_id = mtl_material_transactions_s.nextval
7665   WHERE exists ( SELECT 1
7666                  FROM wip_move_txn_interface wmti,
7667                       mtl_parameters mp,
7668                       mtl_material_transactions_temp mmtt2
7669                  WHERE wmti.group_id = p_group_id
7670                  AND TRUNC(wmti.transaction_date) = TRUNC(p_txn_date)
7671                  AND wmti.process_phase = WIP_CONSTANTS.MOVE_PROC
7672                  AND wmti.process_status = WIP_CONSTANTS.RUNNING
7673                  AND mmtt2.organization_id = wmti.organization_id
7674                  AND mmtt2.transaction_source_id = wmti.wip_entity_id
7675                  AND mmtt2.transaction_source_type_id = TPS_INV_JOB_OR_SCHED
7676                  AND mp.organization_id = wmti.organization_id
7677                  AND mp.primary_cost_method IN (WIP_CONSTANTS.COST_AVG,
7678                                                 WIP_CONSTANTS.COST_FIFO,
7679                                                 WIP_CONSTANTS.COST_LIFO)
7680                  AND (  (  (wmti.fm_intraoperation_step_type = WIP_CONSTANTS.SCRAP
7681                             OR wmti.to_intraoperation_step_type = WIP_CONSTANTS.SCRAP)
7682                          AND wmti.scrap_account_id IS NOT NULL)
7683                       OR (wmti.transaction_type IN (WIP_CONSTANTS.COMP_TXN,WIP_CONSTANTS.RET_TXN)))
7684                  AND MMTT1.ROWID = MMTT2.ROWID
7685                  AND ROWNUM = 1
7686                )
7687   AND mmtt1.transaction_source_type_id = TPS_INV_JOB_OR_SCHED
7688   AND mmtt1.transaction_temp_id IS NULL;
7689 
7690   l_interface_table := 2; -- MOVE_TXN_INTERFACE
7691 
7692   FOR l_txns IN c_txns LOOP
7693     IF(l_txns.load_from_interface = 1 AND
7694        l_txns.source_code = 1) THEN
7695       l_returnValue :=  CSTPACMS.validate_move_snap_to_temp
7696                               (l_txn_interface_id  => l_txns.txn_id,
7697                                l_txn_temp_id       => l_txns.mtl_temp_id,
7698                                l_interface_table   => l_interface_table,
7699                                l_primary_quantity  => l_txns.primary_quantity,
7700                                err_num             => l_msgCount,
7701                                err_code            => l_errCode,
7702                                err_msg             => l_errMsg);
7703 
7704       IF(l_returnValue <> 1) THEN
7705         fnd_message.set_name('CST', l_errCode);
7706         fnd_msg_pub.add;
7707         l_errMsg := 'CSTACOSN.validate_move_snap_to_temp failed';
7708         raise fnd_api.g_exc_unexpected_error;
7709       END IF; -- check return status
7710     ELSE
7711       op_snapshot(p_mtl_temp_id   => l_txns.mtl_temp_id,
7712                   x_returnStatus  => x_returnStatus);
7713 
7714       IF(x_returnStatus <> fnd_api.g_ret_sts_success) THEN
7715         l_errMsg := 'wip_movProc_priv.op_snapshot failed';
7716         raise fnd_api.g_exc_unexpected_error;
7717       END IF; -- check return status
7718     END IF; -- check load from interface and source code
7719   END LOOP;
7720 
7721 <<END_txn>>
7722   x_returnStatus := fnd_api.g_ret_sts_success;
7723 
7724   -- write to the log file
7725   IF (l_logLevel <= wip_constants.trace_logging) THEN
7726     wip_logger.exitPoint(p_procName => 'wip_movProc_priv.snapshot_background',
7727                          p_procReturnStatus => x_returnStatus,
7728                          p_msg => 'procedure complete',
7729                          x_returnStatus => l_returnStatus);
7730   END IF;
7731 
7732 EXCEPTION
7733   WHEN fnd_api.g_exc_unexpected_error THEN
7734     x_returnStatus := fnd_api.g_ret_sts_unexp_error;
7735 
7736     IF (l_logLevel <= wip_constants.trace_logging) THEN
7737       wip_logger.exitPoint(p_procName =>'wip_movProc_priv.snapshot_background',
7738                            p_procReturnStatus => x_returnStatus,
7739                            p_msg => l_errMsg,
7740                            x_returnStatus => l_returnStatus);
7741     END IF;
7742 
7743   WHEN others THEN
7744     x_returnStatus := fnd_api.g_ret_sts_unexp_error;
7745     l_errMsg := 'unexpected error: ' || SQLERRM || 'SQLCODE = ' || SQLCODE;
7746 
7747     IF (l_logLevel <= wip_constants.trace_logging) THEN
7748       wip_logger.exitPoint(p_procName=>'wip_movProc_priv.snapshot_background',
7749                            p_procReturnStatus => x_returnStatus,
7750                            p_msg => l_errMsg,
7751                            x_returnStatus => l_returnStatus);
7752     END IF;
7753     fnd_message.set_name('FND', 'FND_GENERIC_MESSAGE');
7754     fnd_message.set_token('MESSAGE', l_errMsg);
7755     fnd_msg_pub.add;
7756 END snapshot_background;
7757 
7758 /*****************************************************************************
7759  * This procedure will be used to update quantity_completed, and take snapshot
7760  * of wip_operations if applicable(LIFO, FIFO, and average costing)
7761  ****************************************************************************/
7762 PROCEDURE update_wo_and_snapshot(p_gib           IN        group_rec_t,
7763                                  x_returnStatus OUT NOCOPY VARCHAR2) IS
7764  CURSOR c_move_rec IS
7765    SELECT wmti.transaction_id txn_id
7766      FROM wip_move_txn_interface wmti
7767     WHERE wmti.group_id = p_gib.group_id
7768       AND TRUNC(wmti.transaction_date) = TRUNC(p_gib.txn_date)
7769       AND wmti.process_phase = WIP_CONSTANTS.MOVE_PROC
7770       AND wmti.process_status = WIP_CONSTANTS.RUNNING
7771  ORDER BY wmti.transaction_date;
7772 
7773 l_move_rec     c_move_rec%ROWTYPE;
7774 l_returnStatus VARCHAR(1);
7775 l_errMsg       VARCHAR(240);
7776 l_params       wip_logger.param_tbl_t;
7777 l_logLevel     NUMBER := fnd_log.g_current_runtime_level;
7778 BEGIN
7779   IF (l_logLevel <= wip_constants.trace_logging) THEN
7780     l_params(1).paramName   := 'p_gib.group_id';
7781     l_params(1).paramValue  :=  p_gib.group_id;
7782     l_params(2).paramName   := 'p_gib.txn_date';
7783     l_params(2).paramValue  :=  p_gib.txn_date;
7784     l_params(3).paramName   := 'p_gib.seq_move';
7785     l_params(3).paramValue  :=  p_gib.seq_move;
7786     wip_logger.entryPoint(p_procName =>'wip_movProc_priv.update_wo_and_snapshot',
7787                           p_params => l_params,
7788                           x_returnStatus => l_returnStatus);
7789   END IF;
7790 
7791   IF(p_gib.seq_move = WIP_CONSTANTS.YES) THEN
7792     -- update quantity_completed and take snapshot one record at a time
7793     FOR l_move_rec IN c_move_rec LOOP
7794       update_complete_qty(p_gib          => p_gib,
7795                           p_txn_id       => l_move_rec.txn_id,
7796                           x_returnStatus => x_returnStatus);
7797 
7798       IF(x_returnStatus <> fnd_api.g_ret_sts_success) THEN
7799         l_errMsg := 'wip_movProc_priv.update_complete_qty failed';
7800         raise fnd_api.g_exc_unexpected_error;
7801       END IF; -- check return status
7802 
7803       snapshot_background(p_group_id      => p_gib.group_id,
7804                           p_txn_id        => l_move_rec.txn_id,
7805                           p_txn_date      => p_gib.txn_date,
7806                           x_returnStatus  => x_returnStatus);
7807 
7808       IF(x_returnStatus <> fnd_api.g_ret_sts_success) THEN
7809         l_errMsg := 'wip_movProc_priv.snapshot_background failed';
7810         raise fnd_api.g_exc_unexpected_error;
7811       END IF; -- check return status
7812     END LOOP;
7813   ELSE
7814     -- update quantity_completed and take snapshot for the whole group
7815     update_complete_qty(p_gib          => p_gib,
7816                         x_returnStatus => x_returnStatus);
7817 
7818     IF(x_returnStatus <> fnd_api.g_ret_sts_success) THEN
7819       l_errMsg := 'wip_movProc_priv.update_complete_qty failed';
7820       raise fnd_api.g_exc_unexpected_error;
7821     END IF; -- check return status
7822 
7823     snapshot_background(p_group_id      => p_gib.group_id,
7824                         p_txn_date      => p_gib.txn_date,
7825                         x_returnStatus  => x_returnStatus);
7826 
7827     IF(x_returnStatus <> fnd_api.g_ret_sts_success) THEN
7828       l_errMsg := 'wip_movProc_priv.snapshot_background failed';
7829       raise fnd_api.g_exc_unexpected_error;
7830     END IF; -- check return status
7831   END IF;
7832 
7833   x_returnStatus := fnd_api.g_ret_sts_success;
7834   -- write to the log file
7835   IF (l_logLevel <= wip_constants.trace_logging) THEN
7836     wip_logger.exitPoint(p_procName =>'wip_movProc_priv.update_wo_and_snapshot',
7837                          p_procReturnStatus => x_returnStatus,
7838                          p_msg => 'procedure complete',
7839                          x_returnStatus => l_returnStatus);
7840   END IF;
7841 EXCEPTION
7842   WHEN fnd_api.g_exc_unexpected_error THEN
7843     x_returnStatus := fnd_api.g_ret_sts_unexp_error;
7844     IF (l_logLevel <= wip_constants.trace_logging) THEN
7845       wip_logger.exitPoint(p_procName =>'wip_movProc_priv.update_wo_and_snapshot',
7846                            p_procReturnStatus => x_returnStatus,
7847                            p_msg => l_errMsg,
7848                            x_returnStatus => l_returnStatus);
7849     END IF;
7850 
7851   WHEN others THEN
7852     x_returnStatus := fnd_api.g_ret_sts_unexp_error;
7853     l_errMsg := 'unexpected error: ' || SQLERRM || 'SQLCODE = ' || SQLCODE;
7854 
7855     IF (l_logLevel <= wip_constants.trace_logging) THEN
7856       wip_logger.exitPoint(p_procName=>'wip_movProc_priv.update_wo_and_snapshot',
7857                            p_procReturnStatus => x_returnStatus,
7858                            p_msg => l_errMsg,
7859                            x_returnStatus => l_returnStatus);
7860     END IF;
7861     fnd_message.set_name('FND', 'FND_GENERIC_MESSAGE');
7862     fnd_message.set_token('MESSAGE', l_errMsg);
7863     fnd_msg_pub.add;
7864 END update_wo_and_snapshot;
7865 
7866 /*****************************************************************************
7867  * This procedure is equivalent to witpsst_scrap_txns in wiltps5.ppc
7868  * This procedure is used to update scrap quantity in WIP_DISCRETE_JOBS for
7869  * discrete and OSFM jobs, and WIP_REPETITIVE_SCHEDULES for repetitive
7870  * schedules.
7871  * This procedure also insert into MTL_MATERIAL_TRANSACTIONS_TEMP for costing
7872  * purpose IF the user provide scrap account.
7873  ****************************************************************************/
7874 PROCEDURE scrap_txns(p_gib       IN OUT NOCOPY group_rec_t,
7875                      x_returnStatus OUT NOCOPY VARCHAR2) IS
7876 
7877 CURSOR c_mtl_alloc IS
7878   SELECT wmti.transaction_id txn_id,
7879          wmti.organization_id org_id,
7880          mmtt.material_allocation_temp_id alloc_id
7881     FROM wip_move_txn_interface wmti,
7882          mtl_material_transactions_temp mmtt
7883    WHERE wmti.transaction_id = mmtt.move_transaction_id
7884      /* Improve performance */
7885      AND mmtt.organization_id = wmti.organization_id
7886      AND mmtt.transaction_source_id = wmti.wip_entity_id
7887      AND mmtt.transaction_source_type_id = TPS_INV_JOB_OR_SCHED
7888      /* End Improve performance */
7889      AND wmti.group_id = p_gib.group_id
7890      AND TRUNC(wmti.transaction_date) = TRUNC(p_gib.txn_date)
7891      AND wmti.process_phase = WIP_CONSTANTS.MOVE_PROC
7892      AND wmti.process_status = WIP_CONSTANTS.RUNNING
7893      AND wmti.entity_type = WIP_CONSTANTS.REPETITIVE
7894      AND wmti.scrap_account_id IS NOT NULL
7895      AND (wmti.fm_intraoperation_step_type = WIP_CONSTANTS.SCRAP OR
7896           wmti.to_intraoperation_step_type = WIP_CONSTANTS.SCRAP);
7897 
7898 CURSOR c_update_po IS
7899   SELECT wmti.wip_entity_id job_id,
7900          DECODE(wmti.entity_type,
7901                 WIP_CONSTANTS.REPETITIVE, wmta.repetitive_schedule_id,
7902                 NULL) rep_id,
7903          wmti.organization_id org_id,
7904          DECODE (wmti.fm_intraoperation_step_type,
7905            WIP_CONSTANTS.SCRAP,DECODE(wmti.entity_type,
7906                                 WIP_CONSTANTS.REPETITIVE,wmta.primary_quantity,
7907                                 wmti.primary_quantity),
7908            -1 * DECODE(wmti.entity_type,
7909                   WIP_CONSTANTS.REPETITIVE, wmta.primary_quantity,
7910                   wmti.primary_quantity)) changed_qty,
7911          GREATEST(wmti.fm_operation_seq_num, wmti.to_operation_seq_num) fm_op
7912     FROM wip_move_txn_interface wmti,
7913          wip_move_txn_allocations wmta,
7914          wip_parameters mp
7915    WHERE wmti.transaction_id = wmta.transaction_id (+)
7916      AND wmti.organization_id = wmta.organization_id (+)
7917      AND wmti.group_id = p_gib.group_id
7918      AND TRUNC(wmti.transaction_date) = TRUNC(p_gib.txn_date)
7919      AND wmti.process_phase = WIP_CONSTANTS.MOVE_PROC
7920      AND wmti.process_status = WIP_CONSTANTS.RUNNING
7921      AND (wmti.fm_intraoperation_step_type = WIP_CONSTANTS.SCRAP OR
7922           wmti.to_intraoperation_step_type = WIP_CONSTANTS.SCRAP)
7923      AND NOT(wmti.fm_intraoperation_step_type = WIP_CONSTANTS.SCRAP AND
7924              wmti.to_intraoperation_step_type = WIP_CONSTANTS.SCRAP)
7925      AND mp.organization_id = wmti.organization_id
7926      AND mp.propagate_job_change_to_po = WIP_CONSTANTS.YES;
7927 
7928 
7929 l_params           wip_logger.param_tbl_t;
7930 l_mtl_alloc        c_mtl_alloc%ROWTYPE;
7931 l_returnStatus     VARCHAR(1);
7932 l_msg_count        NUMBER;
7933 l_msg_data         VARCHAR2(2000);
7934 l_errMsg           VARCHAR(240);
7935 l_msg              VARCHAR(2000);
7936 l_scrap_flag       NUMBER := -1;
7937 l_step             NUMBER;
7938 l_transaction_mode NUMBER;
7939 l_move             move_profile_rec_t;
7940 l_logLevel         NUMBER := fnd_log.g_current_runtime_level;
7941 l_update_po        c_update_po%ROWTYPE;
7942 l_osp_op_seq_num   NUMBER;      --fix bug 6607192
7943 l_update_po_qty    NUMBER;
7944 BEGIN
7945   l_move := p_gib.move_profile;
7946 
7947   -- write parameter value to log file
7948   IF (l_logLevel <= wip_constants.trace_logging) THEN
7949     l_params(1).paramName   := 'p_group_id';
7950     l_params(1).paramValue  :=  p_gib.group_id;
7951     l_params(2).paramName   := 'p_txn_date';
7952     l_params(2).paramValue  :=  p_gib.txn_date;
7953     l_params(3).paramName   := 'org_id';
7954     l_params(3).paramValue  :=  l_move.org_id;
7955     l_params(4).paramName   := 'wip_id';
7956     l_params(4).paramValue  :=  l_move.wip_id;
7957     l_params(5).paramName   := 'fmOp';
7958     l_params(5).paramValue  :=  l_move.fmOp;
7959     l_params(6).paramName   := 'fmStep';
7960     l_params(6).paramValue  :=  l_move.fmStep;
7961     l_params(7).paramName   := 'toOp';
7962     l_params(7).paramValue  :=  l_move.toOp;
7963     l_params(8).paramName   := 'toStep';
7964     l_params(8).paramValue  :=  l_move.toStep;
7965     l_params(9).paramName   := 'scrapTxn';
7966     l_params(9).paramValue  :=  l_move.scrapTxn;
7967     l_params(10).paramName  := 'easyComplete';
7968     l_params(10).paramValue :=  l_move.easyComplete;
7969     l_params(11).paramName  := 'easyReturn';
7970     l_params(11).paramValue :=  l_move.easyReturn;
7971     l_params(12).paramName  := 'jobTxn';
7972     l_params(12).paramValue :=  l_move.jobTxn;
7973     l_params(13).paramName  := 'scheTxn';
7974     l_params(13).paramValue :=  l_move.scheTxn;
7975     l_params(14).paramName  := 'rsrcItem';
7976     l_params(14).paramValue :=  l_move.rsrcItem;
7977     l_params(15).paramName  := 'rsrcLot';
7978     l_params(15).paramValue :=  l_move.rsrcLot;
7979     l_params(16).paramName  := 'poReqItem';
7980     l_params(16).paramValue :=  l_move.poReqItem;
7981     l_params(17).paramName  := 'poRegLot';
7982     l_params(17).paramValue :=  l_move.poReqLot;
7983     l_params(18).paramName  := 'p_mtl_header_id';
7984     l_params(18).paramValue :=  p_gib.mtl_header_id;
7985     l_params(19).paramName  := 'p_move_mode';
7986     l_params(19).paramValue :=  p_gib.move_mode;
7987     l_params(20).paramName  := 'p_mtl_mode';
7988     l_params(20).paramValue :=  p_gib.mtl_mode;
7989     wip_logger.entryPoint(p_procName =>'wip_movProc_priv.scrap_txns',
7990                           p_params => l_params,
7991                           x_returnStatus => l_returnStatus);
7992   END IF;
7993 
7994   -- Any scrap transaction?
7995   IF(l_move.scrapTxn <> WIP_CONSTANTS.YES AND
7996      l_move.scrapTxn <> WIP_CONSTANTS.NO) THEN -- Indeterminate
7997 
7998     SELECT COUNT(1)
7999       INTO l_scrap_flag
8000       FROM wip_move_txn_interface
8001      WHERE group_id = p_gib.group_id
8002        AND TRUNC(transaction_date) = TRUNC(p_gib.txn_date)
8003        AND process_phase = WIP_CONSTANTS.MOVE_PROC
8004        AND process_status = WIP_CONSTANTS.RUNNING
8005        AND (fm_intraoperation_step_type = WIP_CONSTANTS.SCRAP
8006             OR to_intraoperation_step_type = WIP_CONSTANTS.SCRAP);
8007 
8008     IF (l_scrap_flag > 0) THEN
8009       l_move.scrapTxn := WIP_CONSTANTS.YES;
8010     ELSE
8011       l_move.scrapTxn := WIP_CONSTANTS.NO;
8012     END IF;
8013 
8014   END IF; -- scrap txn indeterminate
8015 
8016   -- Scrap transaction
8017   IF(l_move.scrapTxn = WIP_CONSTANTS.YES) THEN
8018     /*------------------------------------------------------------+
8019      |  Update scrap quantity for discrete jobs
8020      +------------------------------------------------------------*/
8021     IF(l_move.jobTxn = WIP_CONSTANTS.YES) THEN
8022 
8023 /** 3050846 **/
8024        wip_so_reservations.scrap_txn_relieve_rsv ( p_group_id      =>   p_gib.group_id,
8025                                                  x_return_status =>   l_returnstatus,
8026                                                  x_msg_count     =>   l_msg_count,
8027                                                  x_msg_data      =>   l_msg_data
8028                                                  );
8029        IF (l_returnstatus <> fnd_api.g_ret_sts_success) THEN
8030          IF (l_returnstatus = fnd_api.g_ret_sts_error) THEN
8031              fnd_msg_pub.count_and_get(
8032                    p_encoded => fnd_api.g_false,
8033                    p_count   => l_msg_count,
8034                    p_data    => l_errmsg);
8035             RAISE fnd_api.g_exc_error;
8036          ELSE
8037              fnd_msg_pub.count_and_get(
8038                    p_encoded => fnd_api.g_false,
8039                    p_count   => l_msg_count,
8040                    p_data    => l_errmsg);
8041 
8042             RAISE fnd_api.g_exc_unexpected_error;
8043          END IF;
8044        END IF;
8045 
8046 
8047 
8048 /** 3050846 **/
8049 
8050       UPDATE wip_discrete_jobs wdj
8051          SET (quantity_scrapped,
8052               last_updated_by,
8053               last_update_date,
8054               last_update_login,
8055               request_id,
8056               program_application_id,
8057               program_id,
8058               program_update_date
8059              ) =
8060              (SELECT wdj.quantity_scrapped         -- quantity_scrapped
8061                      + SUM(DECODE(wmti.to_intraoperation_step_type,
8062                                   WIP_CONSTANTS.SCRAP, wmti.primary_quantity,0)
8063                      - DECODE(wmti.fm_intraoperation_step_type,
8064                               WIP_CONSTANTS.SCRAP,wmti.primary_quantity,0)),
8065                      MAX(wmti.last_updated_by),
8066                      SYSDATE,                      -- last_update_date
8067                      DECODE(p_gib.login_id,-1,NULL,p_gib.login_id),
8068                      DECODE(p_gib.request_id,-1,NULL,p_gib.request_id),
8069                      DECODE(p_gib.application_id,-1,NULL,p_gib.application_id),
8070                      DECODE(p_gib.program_id,-1,NULL,p_gib.program_id),
8071                      DECODE(p_gib.request_id,
8072                       -1,NULL,SYSDATE)-- program_update_date
8073                 FROM wip_discrete_jobs wdj1, wip_move_txn_interface wmti
8074                WHERE wdj1.rowid = wdj.rowid
8075                  AND wmti.group_id = p_gib.group_id
8076                  AND TRUNC(wmti.transaction_date) = TRUNC(p_gib.txn_date)
8077                  AND wmti.process_phase = WIP_CONSTANTS.MOVE_PROC
8078                  AND wmti.process_status = WIP_CONSTANTS.RUNNING
8079                  AND wmti.organization_id = wdj1.organization_id
8080                  AND wmti.wip_entity_id = wdj1.wip_entity_id
8081                  AND (wmti.entity_type = WIP_CONSTANTS.DISCRETE
8082                       OR wmti.entity_type = WIP_CONSTANTS.LOTBASED)/*WSM */
8083                  AND (wmti.fm_intraoperation_step_type = WIP_CONSTANTS.SCRAP
8084                       OR wmti.to_intraoperation_step_type = WIP_CONSTANTS.SCRAP)
8085              )
8086         WHERE wdj.rowid IN
8087              (SELECT wdj2.rowid
8088                 FROM wip_discrete_jobs wdj2,
8089                      wip_move_txn_interface wmti
8090                WHERE wmti.group_id = p_gib.group_id
8091                  AND TRUNC(wmti.transaction_date) = TRUNC(p_gib.txn_date)
8092                  AND wmti.process_phase = WIP_CONSTANTS.MOVE_PROC
8093                  AND wmti.process_status = WIP_CONSTANTS.RUNNING
8094                  AND wmti.organization_id = wdj2.organization_id
8095                  AND wmti.wip_entity_id = wdj2.wip_entity_id
8096                  AND (wmti.entity_type = WIP_CONSTANTS.DISCRETE
8097                       OR wmti.entity_type = WIP_CONSTANTS.LOTBASED)/* WSM*/
8098                  AND (wmti.fm_intraoperation_step_type = WIP_CONSTANTS.SCRAP
8099                       OR wmti.to_intraoperation_step_type = WIP_CONSTANTS.SCRAP)
8100              );
8101       /* Now we will also update the column status_type to "Complete" IF
8102       these scrap completions will finish off the remaining quantity to be
8103       completed, or update it to "Released" IF moving these assemblies back
8104       from Scrap will re-release a completed job.  We will also update the
8105       date_completed IF necessary.  See wiltct.ppc for a similar change.
8106       rkaiser, 7/15/98  */
8107 
8108       UPDATE wip_discrete_jobs wdj
8109          SET (status_type,
8110               date_completed
8111              ) =
8112             (SELECT WIP_CONSTANTS.COMP_CHRG,   -- status_type
8113                     SYSDATE                    -- date_completed
8114                FROM DUAL)
8115        WHERE wdj.rowid IN
8116             (SELECT wdj2.rowid
8117                FROM wip_discrete_jobs wdj2,
8118                     wip_move_txn_interface wmti
8119               WHERE wmti.group_id = p_gib.group_id
8120                 AND TRUNC(wmti.transaction_date) = TRUNC(p_gib.txn_date)
8121                 AND wmti.process_phase = WIP_CONSTANTS.MOVE_PROC
8122                 AND wmti.process_status = WIP_CONSTANTS.RUNNING
8123                 AND wmti.organization_id = wdj2.organization_id
8124                 AND wmti.wip_entity_id = wdj2.wip_entity_id
8125                 AND (wmti.entity_type = WIP_CONSTANTS.DISCRETE
8126                      OR wmti.entity_type = WIP_CONSTANTS.LOTBASED)/*WSM */
8127                 AND (wmti.fm_intraoperation_step_type = WIP_CONSTANTS.SCRAP
8128                      OR wmti.to_intraoperation_step_type = WIP_CONSTANTS.SCRAP)
8129                 AND (wdj2.start_quantity - wdj2.quantity_completed -
8130                      wdj2.quantity_scrapped) <= 0
8131                 -- Fix bug 13826369
8132                 AND (select sum(quantity_in_queue)
8133                           + sum(quantity_running)
8134                           + sum(quantity_waiting_to_move)
8135                           + sum(quantity_rejected)
8136                      from wip_operations
8137                      where wip_entity_id = wdj2.wip_entity_id
8138                      and organization_id = wdj2.organization_id) = 0);
8139 
8140       UPDATE wip_discrete_jobs wdj
8141          SET status_type = WIP_CONSTANTS.RELEASED,
8142 /*bug 3933240 -> nullify date_completed while changing the status of job to
8143   released */
8144              date_completed = null
8145        WHERE wdj.rowid IN
8146              (SELECT wdj2.rowid
8147                 FROM wip_discrete_jobs wdj2,
8148                      wip_move_txn_interface wmti
8149                WHERE wmti.group_id = p_gib.group_id
8150                  AND TRUNC(wmti.transaction_date) = TRUNC(p_gib.txn_date)
8151                  AND wmti.process_phase = WIP_CONSTANTS.MOVE_PROC
8152                  AND wmti.process_status = WIP_CONSTANTS.RUNNING
8153                  AND wmti.organization_id = wdj2.organization_id
8154                  AND wmti.wip_entity_id = wdj2.wip_entity_id
8155                  AND (wmti.entity_type = WIP_CONSTANTS.DISCRETE
8156                       OR wmti.entity_type = WIP_CONSTANTS.LOTBASED)/* WSM*/
8157                  AND (wmti.fm_intraoperation_step_type = WIP_CONSTANTS.SCRAP
8158                       OR wmti.to_intraoperation_step_type = WIP_CONSTANTS.SCRAP)
8159                  AND (wdj2.start_quantity - wdj2.quantity_completed -
8160                       wdj2.quantity_scrapped) > 0);
8161 
8162       -- IF debug message level = 2, write statement below to log file
8163       IF (l_logLevel <= wip_constants.full_logging) THEN
8164         fnd_message.set_name('WIP', 'WIP_UPDATED_ROWS');
8165         fnd_message.set_token('ENTITY1', SQL%ROWCOUNT);
8166         fnd_message.set_token('ENTITY2', 'WIP_DISCRETE_JOBS');
8167         l_msg := fnd_message.get;
8168         wip_logger.log(p_msg          => l_msg,
8169                        x_returnStatus => l_returnStatus);
8170       END IF;
8171     END IF; -- END job transactions
8172 
8173    /*------------------------------------------------------------+
8174     |  Update scrap quantity for repetitive schedule
8175     +------------------------------------------------------------*/
8176     IF(l_move.scheTxn = WIP_CONSTANTS.YES) THEN
8177       /*------------------------------------------------------------------+
8178        | For repetitive schedules, we do not set the date_closed, since this
8179        | is only done manually, via the form.  It is not set automatically for
8180        | regular completions, so we will not set it here.  rkaiser
8181        +------------------------------------------------------------------*/
8182       UPDATE wip_repetitive_schedules wrs
8183          SET (status_type) =
8184              (SELECT DECODE(SIGN(
8185                        (wrs.daily_production_rate * wrs.processing_work_days -
8186                         wrs.quantity_completed) -
8187                         SUM(NVL(wo.quantity_scrapped, 0))),
8188                      1, WIP_CONSTANTS.RELEASED,
8189                      WIP_CONSTANTS.COMP_CHRG)
8190                 FROM wip_operations wo
8191                WHERE wo.organization_id = wrs.organization_id
8192                  AND wo.repetitive_schedule_id = wrs.repetitive_schedule_id)
8193        WHERE wrs.status_type IN (WIP_CONSTANTS.RELEASED,
8194                                  WIP_CONSTANTS.COMP_CHRG)
8195          AND wrs.rowid IN
8196             (SELECT wrs2.rowid
8197                FROM wip_repetitive_schedules wrs2,
8198                     wip_move_txn_interface wmti
8199               WHERE wmti.group_id = p_gib.group_id
8200                 AND TRUNC(wmti.transaction_date) = TRUNC(p_gib.txn_date)
8201                 AND wmti.process_phase = WIP_CONSTANTS.MOVE_PROC
8202                 AND wmti.process_status = WIP_CONSTANTS.RUNNING
8203                 AND wmti.entity_type = WIP_CONSTANTS.REPETITIVE
8204                 AND wrs2.wip_entity_id = wmti.wip_entity_id
8205                 AND wrs2.organization_id = wmti.organization_id
8206                 AND wrs2.line_id = wmti.line_id
8207                 AND (wmti.fm_intraoperation_step_type = WIP_CONSTANTS.SCRAP
8208                     OR wmti.to_intraoperation_step_type = WIP_CONSTANTS.SCRAP));
8209 
8210       -- IF debug message level = 2, write statement below to log file
8211       IF (l_logLevel <= wip_constants.full_logging) THEN
8212         fnd_message.set_name('WIP', 'WIP_UPDATED_ROWS');
8213         fnd_message.set_token('ENTITY1', SQL%ROWCOUNT);
8214         fnd_message.set_token('ENTITY2', 'WIP_REPETITIVE_SCHEDULES');
8215         l_msg := fnd_message.get;
8216         wip_logger.log(p_msg          => l_msg,
8217                        x_returnStatus => l_returnStatus);
8218       END IF;
8219     END IF; -- END repetitive schedule transactions
8220 
8221     /* Generate a mtl txn header id IF one has not already been generated */
8222     IF(p_gib.mtl_header_id IS NULL OR
8223        p_gib.mtl_header_id = -1) THEN
8224       SELECT mtl_material_transactions_s.nextval
8225         INTO p_gib.mtl_header_id
8226         FROM DUAL;
8227     END IF;
8228 
8229     -- initialize transaction mode
8230     IF(p_gib.move_mode = WIP_CONSTANTS.ONLINE AND
8231        p_gib.mtl_mode  = WIP_CONSTANTS.ONLINE) THEN
8232       l_transaction_mode := WIP_CONSTANTS.ONLINE;
8233     ELSE
8234       l_transaction_mode := WIP_CONSTANTS.BACKGROUND;
8235     END IF;
8236 
8237     FOR l_step IN WIP_CONSTANTS.QUEUE..WIP_CONSTANTS.RUN LOOP
8238 
8239       -- Discrete and Lotbased jobs
8240       IF(l_move.jobTxn = WIP_CONSTANTS.YES) THEN
8241         INSERT INTO mtl_material_transactions_temp
8242           (last_updated_by,
8243            last_update_date,
8244            last_update_login,
8245            created_by,
8246            creation_date,
8247            request_id,
8248            program_application_id,
8249            program_id,
8250            program_update_date,
8251            transaction_header_id,
8252            transaction_temp_id,
8253            source_code,
8254            source_line_id,
8255            transaction_mode,
8256            inventory_item_id,
8257            revision,
8258            organization_id,
8259            transaction_quantity,
8260            transaction_uom,
8261            primary_quantity,
8262            transaction_source_type_id,
8263            transaction_source_id,
8264            transaction_action_id,
8265            transaction_type_id,
8266            transaction_date,
8267            acct_period_id,
8268            distribution_account_id,
8269            transaction_cost,
8270            transaction_reference,
8271            reason_id,
8272            wip_entity_type,
8273            schedule_id,
8274            repetitive_line_id,
8275            operation_seq_num,
8276            move_transaction_id,
8277            process_flag,
8278            lock_flag,
8279            posting_flag,
8280            source_project_id,
8281            source_task_id,
8282            transaction_batch_id,
8283            qa_collection_id,        /*Added for Bug 	7136450 (FP of 7126588 )*/
8284            transaction_batch_seq
8285            )
8286            SELECT wmti.last_updated_by,       -- last_updated_by --Fix for bug 5195072
8287                   SYSDATE,                    -- last_update_date
8288                   DECODE(p_gib.login_id,-1,NULL,p_gib.login_id),
8289                   wmti.created_by,        -- created_by --Fix for bug 5195072
8290                   SYSDATE,                    -- creation_date
8291                   DECODE(p_gib.request_id,-1,NULL,p_gib.request_id),
8292                   DECODE(p_gib.application_id,-1,NULL,p_gib.application_id),
8293                   DECODE(p_gib.program_id,-1,NULL,p_gib.program_id),
8294                   DECODE(p_gib.request_id,
8295                    -1,NULL,SYSDATE), -- program_update_date
8296                   p_gib.mtl_header_id,        -- transaction_header_id
8297                   mtl_material_transactions_s.nextval,  -- transaction_temp_id
8298                   wmti.source_code,
8299                   wmti.source_line_id,
8300                   l_transaction_mode,         -- transaction_mode
8301                   wmti.primary_item_id,        -- inventory_item_id
8302                   -- Fixed bug 2387630
8303                   DECODE(msi.revision_qty_control_code,
8304                     WIP_CONSTANTS.REV, NVL(wdj.bom_revision,
8305                       bom_revisions.get_item_revision_fn
8306                         ('EXCLUDE_OPEN_HOLD',        -- eco_status
8307                          'ALL',                      -- examine_type
8308                           wmti.organization_id,       -- org_id
8309                           wmti.primary_item_id,       -- item_id
8310                           wmti.transaction_date       -- rev_date
8311                         )),
8312                     NULL),                    -- revision
8313                   wmti.organization_id,
8314                   DECODE(l_step,              -- transaction_quantity
8315                     WIP_CONSTANTS.QUEUE, -1 * wmti.transaction_quantity,
8316                     wmti.transaction_quantity),
8317                   wmti.transaction_uom,        -- transaction_uom
8318                   DECODE(l_step,              -- primary_quantity
8319                     WIP_CONSTANTS.QUEUE, -1 * wmti.primary_quantity,
8320                     wmti.primary_quantity),
8321                   TPS_INV_JOB_OR_SCHED,       -- transaction_source_type_id
8322                   wmti.wip_entity_id,          -- transaction_source_id
8323                   WIP_CONSTANTS.SCRASSY_ACTION, -- transaction_action_id
8324                   WIP_CONSTANTS.SCRASSY_TYPE,   -- transaction_type_id
8325                   wmti.transaction_date,
8326                   wmti.acct_period_id,
8327                   wmti.scrap_account_id,       -- distribution_account_id
8328                   NULL,                       -- transaction_cost
8329                   wmti.reference,
8330                   wmti.reason_id,
8331                   wmti.entity_type,            -- wip_entity_type
8332                   NULL,                       -- schedule_id
8333                   wmti.line_id,                -- repetitive_line_id
8334                   DECODE(l_step,              -- operation_seq_num
8335                     WIP_CONSTANTS.QUEUE, wmti.fm_operation_seq_num,
8336                     wmti.to_operation_seq_num),
8337                   wmti.transaction_id,         -- move_transaction_id
8338                   'Y',                        -- process_flag
8339                   'N',                        -- lock_flag
8340                   'Y',                        -- posting_flag
8341                   wdj.project_id,
8342                   wdj.task_id,
8343                   p_gib.mtl_header_id,         -- transaction_batch_id
8344                   wmti.qa_collection_id,        /*Added for Bug 7136450 (FP of 7126588 )*/
8345                   WIP_CONSTANTS.ASSY_BATCH_SEQ -- transaction_batch_seq
8346              FROM wip_move_txn_interface wmti,
8347                   mtl_system_items msi,
8348                   wip_discrete_jobs wdj
8349             WHERE wmti.group_id = p_gib.group_id
8350               AND TRUNC(wmti.transaction_date) = TRUNC(p_gib.txn_date)
8351               AND wmti.process_phase = WIP_CONSTANTS.MOVE_PROC
8352               AND wmti.process_status = WIP_CONSTANTS.RUNNING
8353               AND wmti.scrap_account_id IS NOT NULL
8354               AND (wmti.entity_type = WIP_CONSTANTS.DISCRETE
8355                    OR wmti.entity_type = WIP_CONSTANTS.LOTBASED)/*WSM*/
8356               AND wdj.wip_entity_id = wmti.wip_entity_id
8357               AND wdj.organization_id = wmti.organization_id
8358               AND DECODE(l_step,
8359                     WIP_CONSTANTS.QUEUE, wmti.fm_intraoperation_step_type,
8360                     wmti.to_intraoperation_step_type) = WIP_CONSTANTS.SCRAP
8361               AND msi.organization_id = wmti.organization_id
8362               AND msi.inventory_item_id = wmti.primary_item_id;
8363 
8364         -- IF debug message level = 2, write statement below to log file
8365         IF (l_logLevel <= wip_constants.full_logging) THEN
8366           fnd_message.set_name('WIP', 'WIP_INSERTED_ROWS');
8367           fnd_message.set_token('ENTITY1', SQL%ROWCOUNT);
8368           fnd_message.set_token('ENTITY2', 'MTL_MATERIAL_TRANSACTIONS_TEMP');
8369           l_msg := fnd_message.get;
8370           wip_logger.log(p_msg          => l_msg,
8371                          x_returnStatus => l_returnStatus);
8372         END IF;
8373 
8374       END IF; -- discrete jobs
8375 
8376       -- Repetitive schedules
8377       IF(l_move.scheTxn = WIP_CONSTANTS.YES) THEN
8378 
8379         INSERT INTO mtl_material_transactions_temp
8380           (material_allocation_temp_id,
8381            last_updated_by,
8382            last_update_date,
8383            last_update_login,
8384            created_by,
8385            creation_date,
8386            request_id,
8387            program_application_id,
8388            program_id,
8389            program_update_date,
8390            transaction_header_id,
8391            transaction_temp_id,
8392            source_code,
8393            source_line_id,
8394            transaction_mode,
8395            inventory_item_id,
8396            revision,
8397            organization_id,
8398            transaction_quantity,
8399            transaction_uom,
8400            primary_quantity,
8401            transaction_source_type_id,
8402            transaction_source_id,
8403            transaction_action_id,
8404            transaction_type_id,
8405            transaction_date,
8406            acct_period_id,
8407            distribution_account_id,
8408            transaction_cost,
8409            transaction_reference,
8410            reason_id,
8411            wip_entity_type,
8412            schedule_id,
8413            repetitive_line_id,
8414            operation_seq_num,
8415            move_transaction_id,
8416            process_flag,
8417            lock_flag,
8418            posting_flag,
8419            transaction_batch_id,
8420            transaction_batch_seq
8421            )
8422            SELECT mtl_material_transactions_s.nextval, -- material_alloc_id
8423                   wmti.last_updated_by,       -- last_updated_by --Fix for bug 5195072
8424                   SYSDATE,                   -- last_update_date
8425                   DECODE(p_gib.login_id,-1,NULL,p_gib.login_id),
8426                   wmti.created_by,            -- created_by --Fix for bug 5195072
8427                   SYSDATE,                   -- creation_date
8428                   DECODE(p_gib.request_id,-1,NULL,p_gib.request_id),
8429                   DECODE(p_gib.application_id,-1,NULL,p_gib.application_id),
8430                   DECODE(p_gib.program_id,-1,NULL,p_gib.program_id),
8431                   DECODE(p_gib.request_id,
8432                     -1,NULL,SYSDATE), -- program_update_date
8433                   p_gib.mtl_header_id,       -- transaction_header_id
8434                   mtl_material_transactions_s.nextval, -- transaction_temp_id
8435                   wmti.source_code,
8436                   wmti.source_line_id,
8437                   l_transaction_mode,        -- transaction_mode
8438                   wmti.primary_item_id,       -- inventory_item_id
8439                   -- Fixed bug 2387630
8440                   DECODE(msi.revision_qty_control_code, -- revision
8441                     WIP_CONSTANTS.REV, NVL(wrs.bom_revision,
8442                       bom_revisions.get_item_revision_fn
8443                         ('EXCLUDE_OPEN_HOLD',        -- eco_status
8444                          'ALL',                      -- examine_type
8445                           wmti.organization_id,       -- org_id
8446                           wmti.primary_item_id,       -- item_id
8447                           wmti.transaction_date       -- rev_date
8448                         )),
8449                     NULL),
8450                   wmti.organization_id,
8451                   DECODE(l_step,             -- transaction_quantity
8452                     WIP_CONSTANTS.QUEUE, -1 * wmti.transaction_quantity,
8453                     wmti.transaction_quantity),
8454                   wmti.transaction_uom,
8455                   DECODE(l_step,             -- primary_quantity
8456                     WIP_CONSTANTS.QUEUE, -1 * wmti.primary_quantity,
8457                     wmti.primary_quantity),
8458                   TPS_INV_JOB_OR_SCHED,      -- transaction_source_type_id
8459                   wmti.wip_entity_id,         -- transaction_source_id
8460                   WIP_CONSTANTS.SCRASSY_ACTION, -- transaction_action_id
8461                   WIP_CONSTANTS.SCRASSY_TYPE,   -- transaction_type_id
8462                   wmti.transaction_date,
8463                   wmti.acct_period_id,
8464                   wmti.scrap_account_id,      -- distribution_account_id
8465                   NULL,                      -- transaction_cost
8466                   wmti.reference,
8467                   wmti.reason_id,
8468                   wmti.entity_type,           -- wip_entity_type
8469                   NULL,                      -- schedule_id
8470                   wmti.line_id,               -- repetitive_line_id
8471                   DECODE(l_step,             -- operation_seq_num
8472                     WIP_CONSTANTS.QUEUE, wmti.fm_operation_seq_num,
8473                     wmti.to_operation_seq_num),
8474                   wmti.transaction_id,        -- move_transaction_id
8475                   'Y',                       -- process_flag
8476                   'N',                       -- lock_flag
8477                   'Y',                       -- posting_flag
8478                   p_gib.mtl_header_id,         -- transaction_batch_id
8479                   WIP_CONSTANTS.ASSY_BATCH_SEQ -- transaction_batch_seq
8480              FROM wip_move_txn_interface wmti,
8481                   mtl_system_items msi,
8482                   wip_repetitive_schedules wrs
8483             WHERE wmti.group_id = p_gib.group_id
8484               AND TRUNC(wmti.transaction_date) = TRUNC(p_gib.txn_date)
8485               AND wmti.process_phase = WIP_CONSTANTS.MOVE_PROC
8486               AND wmti.process_status = WIP_CONSTANTS.RUNNING
8487               AND wmti.scrap_account_id IS NOT NULL
8488               AND wmti.entity_type = WIP_CONSTANTS.REPETITIVE
8489               AND wrs.wip_entity_id = wmti.wip_entity_id
8490               AND wrs.organization_id = wmti.organization_id
8491               AND wrs.line_id = wmti.line_id
8492               AND wrs.repetitive_schedule_id = wmti.repetitive_schedule_id
8493               AND DECODE(l_step,
8494                     WIP_CONSTANTS.QUEUE, wmti.fm_intraoperation_step_type,
8495                     wmti.to_intraoperation_step_type) = WIP_CONSTANTS.SCRAP
8496               AND msi.organization_id = wmti.organization_id
8497               AND msi.inventory_item_id = wmti.primary_item_id;
8498 
8499          -- IF debug message level = 2, write statement below to log file
8500          IF (l_logLevel <= wip_constants.full_logging) THEN
8501            fnd_message.set_name('WIP', 'WIP_INSERTED_ROWS');
8502            fnd_message.set_token('ENTITY1', SQL%ROWCOUNT);
8503            fnd_message.set_token('ENTITY2', 'MTL_MATERIAL_TRANSACTIONS_TEMP');
8504            l_msg := fnd_message.get;
8505            wip_logger.log(p_msg          => l_msg,
8506                           x_returnStatus => l_returnStatus);
8507          END IF;
8508       END IF; -- Repetitive schedules
8509     END LOOP; -- FOR l_step
8510 
8511     IF(l_move.jobTxn = WIP_CONSTANTS.YES) THEN
8512       /* Call snapshot for Discrete jobs and only in Avg costing Org. */
8513             IF(p_gib.move_mode = WIP_CONSTANTS.ONLINE) THEN
8514         snapshot_online(p_mtl_header_id => p_gib.mtl_header_id,
8515                         p_org_id        => l_move.org_id,
8516                         p_txn_type      => WIP_CONSTANTS.MOVE_TXN,
8517                         p_txn_type_id   => WIP_CONSTANTS.SCRASSY_TYPE,
8518                         p_txn_action_id => WIP_CONSTANTS.SCRASSY_ACTION,
8519                         x_returnStatus  => x_returnStatus);
8520 
8521         IF(x_returnStatus <> fnd_api.g_ret_sts_success) THEN
8522           l_errMsg := 'wip_movProc_priv.snapshot_online failed';
8523           raise fnd_api.g_exc_unexpected_error;
8524         END IF; -- check return status
8525       END IF; -- move mode check
8526     END IF; -- IF job txns
8527   END IF; -- scrap transactions
8528 
8529   -- Update PO quantity for scrap transactions
8530   IF (po_code_release_grp.Current_Release >=
8531       po_code_release_grp.PRC_11i_Family_Pack_J) THEN
8532     FOR l_update_po IN c_update_po LOOP
8533 
8534     /* fix bug 6607192(FP 6348222):  Cancel the attached PO with the job when Scrap Txn
8535        is happening for all the job qty */
8536                  SELECT (scheduled_quantity - quantity_scrapped - cumulative_scrap_quantity)
8537  	                into  l_update_po_qty
8538  	                FROM  wip_operations
8539  	                WHERE wip_entity_id = l_update_po.job_id
8540  	                AND   nvl(repetitive_schedule_id,0) = nvl(l_update_po.rep_id,0)
8541  	                AND   operation_seq_num = l_update_po.fm_op
8542  	                AND   organization_id = l_update_po.org_id;
8543 
8544                  SELECT NVL(Min(operation_seq_num),0)
8545  	                into   l_osp_op_seq_num
8546  	                FROM   wip_operation_resources
8547  	                WHERE  wip_entity_id = l_update_po.job_id
8548  	                AND    organization_id = l_update_po.org_id
8549  	                AND    autocharge_type IN (WIP_CONSTANTS.PO_RECEIPT, WIP_CONSTANTS.PO_MOVE);
8550 
8551                  IF(l_update_po_qty = 0 AND l_update_po.fm_op < l_osp_op_seq_num) then
8552                     wip_osp.cancelPOReq(
8553  	                    p_job_id          => l_update_po.job_id,
8554  	                    p_org_id          => l_update_po.org_id,
8555  	                    x_return_status => x_returnStatus);
8556  	                  IF(x_returnStatus <> fnd_api.g_ret_sts_success) THEN
8557  	                   l_errMsg := 'wip_osp.cancelPOReq failed';
8558  	                   raise fnd_api.g_exc_unexpected_error;
8559  	                 END IF;
8560  	         ELSE
8561     /* end of fix 6607192 */
8562 
8563       wip_osp.updatePOReqQuantity(
8564         p_job_id        => l_update_po.job_id,
8565         p_repetitive_id => l_update_po.rep_id,
8566         p_org_id        => l_update_po.org_id,
8567         p_changed_qty   => l_update_po.changed_qty,
8568         p_fm_op         => l_update_po.fm_op,
8569         /* Fix for Bug#4734309 */
8570         p_is_scrap_txn  => WIP_CONSTANTS.YES,
8571         x_return_status => x_returnStatus);
8572 
8573       IF(x_returnStatus <> fnd_api.g_ret_sts_success) THEN
8574         l_errMsg := 'wip_osp.updatePOReqQuantity failed';
8575         raise fnd_api.g_exc_unexpected_error;
8576       END IF;
8577     END IF;
8578 
8579     END LOOP;
8580   END IF; -- have PO patchset J onward
8581 
8582 
8583   -- assign l_move back to move profile
8584   p_gib.move_profile := l_move;
8585   x_returnStatus := fnd_api.g_ret_sts_success;
8586 
8587   -- write to the log file
8588   IF (l_logLevel <= wip_constants.trace_logging) THEN
8589     wip_logger.exitPoint(p_procName => 'wip_movProc_priv.scrap_txns',
8590                          p_procReturnStatus => x_returnStatus,
8591                          p_msg => 'procedure complete',
8592                          x_returnStatus => l_returnStatus);
8593   END IF;
8594 
8595 EXCEPTION
8596   WHEN fnd_api.g_exc_unexpected_error THEN
8597     x_returnStatus := fnd_api.g_ret_sts_unexp_error;
8598     IF (l_logLevel <= wip_constants.trace_logging) THEN
8599       wip_logger.exitPoint(p_procName =>'wip_movProc_priv.scrap_txns',
8600                            p_procReturnStatus => x_returnStatus,
8601                            p_msg => l_errMsg,
8602                            x_returnStatus => l_returnStatus);
8603     END IF;
8604 
8605   WHEN others THEN
8606     x_returnStatus := fnd_api.g_ret_sts_unexp_error;
8607     l_errMsg := 'unexpected error: ' || SQLERRM || 'SQLCODE = ' || SQLCODE;
8608 
8609     IF (l_logLevel <= wip_constants.trace_logging) THEN
8610       wip_logger.exitPoint(p_procName=>'wip_movProc_priv.scrap_txns',
8611                            p_procReturnStatus => x_returnStatus,
8612                            p_msg => l_errMsg,
8613                            x_returnStatus => l_returnStatus);
8614     END IF;
8615     fnd_message.set_name('FND', 'FND_GENERIC_MESSAGE');
8616     fnd_message.set_token('MESSAGE', l_errMsg);
8617     fnd_msg_pub.add;
8618 END scrap_txns;
8619 
8620 /*****************************************************************************
8621  * This procedure is equivalent to witpscp_completion in wiltps5.ppc
8622  * This procedure is used to do easy completion and easy return
8623  * This procedure insert into MTL_MATERIAL_TRANSACTIONS_TEMP and
8624  * MTL_TRANSACTION_LOTS_TEMP
8625  ****************************************************************************/
8626 PROCEDURE ez_completion(p_gib       IN OUT NOCOPY group_rec_t,
8627                         p_txn_type     IN         NUMBER,
8628                         x_returnStatus OUT NOCOPY VARCHAR2) IS
8629 
8630 CURSOR c_repAssembly(p_header_id NUMBER) IS
8631   SELECT completion_transaction_id cpl_txn_id,
8632          transaction_action_id txn_action_id,
8633          transaction_source_id txn_src_id,
8634          repetitive_line_id rep_line_id,
8635          organization_id org_id,
8636          transaction_date txn_date,
8637          ABS(primary_quantity) primary_qty,
8638          reason_id reason_id,
8639          transaction_reference reference
8640     FROM mtl_material_transactions_temp
8641    WHERE transaction_header_id = p_header_id
8642      AND wip_entity_type = WIP_CONSTANTS.REPETITIVE
8643      AND transaction_action_id IN (WIP_CONSTANTS.RETASSY_ACTION,
8644                                    WIP_CONSTANTS.CPLASSY_ACTION);
8645 
8646 l_repAssembly      c_repAssembly%ROWTYPE;
8647 l_params           wip_logger.param_tbl_t;
8648 l_returnStatus     VARCHAR(1);
8649 l_errMsg           VARCHAR(240);
8650 l_msg              VARCHAR(240);
8651 l_step             NUMBER;
8652 l_transaction_mode NUMBER;
8653 l_txn_action_id    NUMBER;
8654 l_txn_type_id      NUMBER;
8655 l_txn_direction    NUMBER;
8656 l_mti_lot_rec      NUMBER; -- number of record under lot control
8657 l_mti_ser_rec      NUMBER; -- number of record under serial control
8658 l_move             move_profile_rec_t;
8659 l_logLevel         NUMBER := fnd_log.g_current_runtime_level;
8660 l_bf_required      NUMBER; -- throw away value
8661 l_ls_required      NUMBER;
8662 l_addMsgToStack    VARCHAR2(1);
8663 BEGIN
8664   l_move := p_gib.move_profile;
8665 
8666   -- write parameter value to log file
8667   IF (l_logLevel <= wip_constants.trace_logging) THEN
8668     l_params(1).paramName   := 'p_group_id';
8669     l_params(1).paramValue  :=  p_gib.group_id;
8670     l_params(2).paramName   := 'p_txn_date';
8671     l_params(2).paramValue  :=  p_gib.txn_date;
8672     l_params(3).paramName   := 'org_id';
8673     l_params(3).paramValue  :=  l_move.org_id;
8674     l_params(4).paramName   := 'wip_id';
8675     l_params(4).paramValue  :=  l_move.wip_id;
8676     l_params(5).paramName   := 'fmOp';
8677     l_params(5).paramValue  :=  l_move.fmOp;
8678     l_params(6).paramName   := 'fmStep';
8679     l_params(6).paramValue  :=  l_move.fmStep;
8680     l_params(7).paramName   := 'toOp';
8681     l_params(7).paramValue  :=  l_move.toOp;
8682     l_params(8).paramName   := 'toStep';
8683     l_params(8).paramValue  :=  l_move.toStep;
8684     l_params(9).paramName   := 'scrapTxn';
8685     l_params(9).paramValue  :=  l_move.scrapTxn;
8686     l_params(10).paramName  := 'easyComplete';
8687     l_params(10).paramValue :=  l_move.easyComplete;
8688     l_params(11).paramName  := 'easyReturn';
8689     l_params(11).paramValue :=  l_move.easyReturn;
8690     l_params(12).paramName  := 'jobTxn';
8691     l_params(12).paramValue :=  l_move.jobTxn;
8692     l_params(13).paramName  := 'scheTxn';
8693     l_params(13).paramValue :=  l_move.scheTxn;
8694     l_params(14).paramName  := 'rsrcItem';
8695     l_params(14).paramValue :=  l_move.rsrcItem;
8696     l_params(15).paramName  := 'rsrcLot';
8697     l_params(15).paramValue :=  l_move.rsrcLot;
8698     l_params(16).paramName  := 'poReqItem';
8699     l_params(16).paramValue :=  l_move.poReqItem;
8700     l_params(17).paramName  := 'poRegLot';
8701     l_params(17).paramValue :=  l_move.poReqLot;
8702     l_params(18).paramName  := 'p_mtl_header_id';
8703     l_params(18).paramValue :=  p_gib.mtl_header_id;
8704     l_params(19).paramName  := 'p_move_mode';
8705     l_params(19).paramValue :=  p_gib.move_mode;
8706     l_params(20).paramName  := 'p_mtl_mode';
8707     l_params(20).paramValue :=  p_gib.mtl_mode;
8708     l_params(21).paramName  := 'p_txn_type';
8709     l_params(21).paramValue :=  p_txn_type;
8710     l_params(22).paramName  := 'p_assy_header_id';
8711     l_params(22).paramValue :=  p_gib.assy_header_id;
8712 
8713     wip_logger.entryPoint(p_procName =>'wip_movProc_priv.ez_completion',
8714                           p_params => l_params,
8715                           x_returnStatus => l_returnStatus);
8716   END IF;
8717 
8718   /* Generate a mtl txn header id IF one has not already been generated */
8719   IF(p_gib.mtl_header_id IS NULL OR
8720      p_gib.mtl_header_id = -1) THEN
8721     SELECT mtl_material_transactions_s.nextval
8722       INTO p_gib.mtl_header_id
8723       FROM DUAL;
8724   END IF;
8725 
8726   IF(p_gib.assy_header_id IS NULL OR
8727      p_gib.assy_header_id = -1) THEN
8728     -- Generate new header ID for assembly records because we want inventory
8729     -- to process assembly records, but not component records.
8730     SELECT mtl_material_transactions_s.nextval
8731       INTO p_gib.assy_header_id
8732       FROM DUAL;
8733   END IF;
8734 
8735   /* set transaction type */
8736   IF (p_txn_type = WIP_CONSTANTS.RET_TXN) THEN
8737     l_txn_action_id := WIP_CONSTANTS.RETASSY_ACTION;
8738     l_txn_type_id   := WIP_CONSTANTS.RETASSY_TYPE;
8739     l_txn_direction := -1;
8740   ELSE
8741     l_txn_action_id := WIP_CONSTANTS.CPLASSY_ACTION;
8742     l_txn_type_id   := WIP_CONSTANTS.CPLASSY_TYPE;
8743     l_txn_direction := 1;
8744   END IF;
8745 
8746   -- initialize transaction mode
8747   IF(p_gib.move_mode = WIP_CONSTANTS.ONLINE AND
8748     p_gib.mtl_mode  = WIP_CONSTANTS.ONLINE) THEN
8749     l_transaction_mode := WIP_CONSTANTS.ONLINE;
8750   ELSE
8751     l_transaction_mode := WIP_CONSTANTS.BACKGROUND;
8752   END IF;
8753 
8754   /*------------------------------------------------------------+
8755    |  Insert completion transaction record                      |
8756    +------------------------------------------------------------*/
8757   IF(l_move.jobTxn = WIP_CONSTANTS.YES) THEN
8758     INSERT INTO mtl_transactions_interface
8759        (completion_transaction_id,
8760 transaction_interface_id,
8761 last_updated_by,
8762         last_update_date,
8763         last_update_login,
8764         created_by,
8765         creation_date,
8766         request_id,
8767         program_application_id,
8768         program_id,
8769         program_update_date,
8770         transaction_header_id,
8771         source_code,
8772 --        completion_transaction_id,
8773         move_transaction_id,
8774         inventory_item_id,
8775         subinventory_code,
8776         locator_id,
8777         transaction_quantity,
8778         transaction_uom,
8779         primary_quantity,
8780         transaction_date,
8781         organization_id,
8782         acct_period_id,
8783         transaction_action_id,
8784         transaction_source_id,
8785         transaction_source_type_id,
8786         transaction_type_id,
8787         wip_entity_type,
8788         repetitive_line_id,
8789         transaction_reference,
8790         operation_seq_num,
8791         reason_id,
8792         revision,
8793         kanban_card_id,
8794         source_project_id,
8795         source_task_id,
8796         transaction_mode,
8797         process_flag,
8798 --        lock_flag,
8799 --        posting_flag,
8800 --        item_lot_control_code,
8801 --        item_serial_control_code,
8802 --        project_id,
8803 --        task_id,
8804         source_header_id,
8805         source_line_id,
8806         transaction_batch_id,
8807         transaction_batch_seq,
8808 --        transaction_interface_id,
8809         -- populate this value for EZ completion/return because material
8810         -- processor need this value to enable quality
8811         qa_collection_id,
8812 	FINAL_COMPLETION_FLAG -- FP bug 7315664 for bug 7281164
8813         )/*7314913: Inserting into MTI based on order of transaction_date*/
8814 	/*Sequence and order by cannot exist in the same level of select, thus re-writing the select statement as sub-query*/
8815 select NVL(p_gib.move_profile.cmp_txn_id,mtl_material_transactions_s.nextval), mtl_material_transactions_s.nextval, t.*
8816         from
8817 	(SELECT wmti.last_updated_by last_updated_by,             -- last_update_by --Fix for bug 5195072
8818                SYSDATE last_update_date,                     -- last_update_date
8819                DECODE(p_gib.login_id, -1, NULL, p_gib.login_id) login_id,
8820                wmti.created_by created_by, --Fix for bug 5195072
8821                SYSDATE creation_date,
8822                DECODE(p_gib.request_id, -1, NULL, p_gib.request_id) request_id,
8823                DECODE(p_gib.application_id, -1, NULL, p_gib.application_id) application_id,
8824                DECODE(p_gib.program_id, -1, NULL, p_gib.program_id) program_id,
8825                DECODE(p_gib.request_id, -1, NULL, SYSDATE) program_update_date,
8826                p_gib.assy_header_id transaction_header_id,
8827                'WIP Completion' source_code,
8828 --               NVL(p_gib.move_profile.cmp_txn_id,-- completion_transaction_id
8829 --                   mtl_material_transactions_s.nextval),
8830                wmti.transaction_id move_transaction_id,
8831                wmti.primary_item_id inventory_item_id,
8832                wdj.completion_subinventory subinventory_code,
8833                wdj.completion_locator_id locator_id,
8834                l_txn_direction * wmti.transaction_quantity transaction_qty,
8835                wmti.transaction_uom transaction_uom,
8836                l_txn_direction * wmti.primary_quantity primary_quantity,
8837                wmti.transaction_date transaction_date,
8838                wmti.organization_id organization_id,
8839                wmti.acct_period_id acct_period_id,
8840                l_txn_action_id transaction_action_id,
8841                wmti.wip_entity_id transaction_source_id,
8842                TPS_INV_JOB_OR_SCHED transaction_source_type_id,
8843                l_txn_type_id transaction_type_id,
8844                wmti.entity_type wip_entity_type,
8845                wmti.line_id repetitive_line_id,
8846                wmti.reference transaction_reference,
8847                wop.operation_seq_num operation_seq_num,
8848                wmti.reason_id reason_id,
8849                  -- Fixed bug 2387630
8850                DECODE(msi.revision_qty_control_code, -- revision
8851                  WIP_CONSTANTS.REV, NVL(wdj.bom_revision,
8852                   bom_revisions.get_item_revision_fn
8853                     ('EXCLUDE_OPEN_HOLD',        -- eco_status
8854                      'ALL',                      -- examine_type
8855                       wmti.organization_id,       -- org_id
8856                       wmti.primary_item_id,       -- item_id
8857                       wmti.transaction_date       -- rev_date
8858                      )),
8859                  NULL) revision_qty_control_code,
8860                DECODE(l_txn_direction,      -- kanban_card_id
8861                 -1,NULL,wdj.kanban_card_id) kanban_card_id,
8862                wdj.project_id source_project_id,
8863                wdj.task_id source_task_id,
8864                l_transaction_mode transaction_mode,
8865                WIP_CONSTANTS.MTI_INVENTORY process_flag, -- process_flag for WIP
8866 --               'N',                         -- lock_flag
8867 --               'Y',                         -- posting_flag
8868 --               msi.lot_control_code,        -- item_lot_control_code
8869 --               msi.serial_number_control_code,-- item_serial_control_code
8870 --               mil.project_id,              -- project_id
8871 --               mil.task_id,                 -- task_id
8872                wmti.wip_entity_id source_header_id,
8873                wop.operation_seq_num source_line_id,
8874                p_gib.assy_header_id transaction_batch_id,
8875                WIP_CONSTANTS.ASSY_BATCH_SEQ transaction_batch_seq,
8876 --               mtl_material_transactions_s.nextval, -- transaction_interface_id
8877                -- populate this value for EZ completion/return because
8878                -- material processor need this value to enable quality
8879                wmti.qa_collection_id qa_collection_id,
8880 	       Decode(wmti.entity_type,5,'Y')   -- FP bug 7315664 for bug 7281164
8881           FROM wip_move_txn_interface wmti,
8882                mtl_item_locations mil,
8883                wip_operations wop,
8884                mtl_system_items msi,
8885                wip_discrete_jobs wdj
8886          WHERE wmti.group_id = p_gib.group_id
8887            AND TRUNC(wmti.transaction_date) = TRUNC(p_gib.txn_date)
8888            AND wmti.process_phase = WIP_CONSTANTS.MOVE_PROC
8889            AND wmti.process_status = WIP_CONSTANTS.RUNNING
8890            AND wmti.transaction_type = p_txn_type
8891            AND (wmti.entity_type = WIP_CONSTANTS.DISCRETE
8892                 OR wmti.entity_type = WIP_CONSTANTS.LOTBASED)/*WSM*/
8893            AND wdj.wip_entity_id = wmti.wip_entity_id
8894            AND wdj.organization_id = wmti.organization_id
8895            AND wop.organization_id = wmti.organization_id
8896            AND wop.wip_entity_id = wmti.wip_entity_id
8897            AND NVL(wop.repetitive_schedule_id,-1) =
8898                NVL(wmti.repetitive_schedule_id,-1)
8899            AND wop.next_operation_seq_num IS NULL
8900            AND msi.organization_id = wmti.organization_id
8901            AND msi.inventory_item_id = wmti.primary_item_id
8902            AND wdj.completion_locator_id = mil.inventory_location_id (+)
8903            AND wdj.organization_id = mil.organization_id (+)
8904 	order by wmti.transaction_date, wmti.wip_entity_id) t
8905 ;
8906 
8907   END IF; -- discrete jobs
8908 
8909   IF(l_move.scheTxn = WIP_CONSTANTS.YES) THEN
8910 
8911     INSERT INTO mtl_transactions_interface
8912        (completion_transaction_id,
8913 	transaction_interface_id,
8914 	last_updated_by,
8915         last_update_date,
8916         last_update_login,
8917         created_by,
8918         creation_date,
8919         request_id,
8920         program_application_id,
8921         program_id,
8922         program_update_date,
8923         transaction_header_id,
8924         source_code,
8925         --completion_transaction_id,
8926         move_transaction_id,
8927         inventory_item_id,
8928         subinventory_code,
8929         locator_id,
8930         transaction_quantity,
8931         transaction_uom,
8932         primary_quantity,
8933         transaction_date,
8934         organization_id,
8935         acct_period_id,
8936         transaction_action_id,
8937         transaction_source_id,
8938         transaction_source_type_id,
8939         transaction_type_id,
8940         wip_entity_type,
8941         repetitive_line_id,
8942         transaction_reference,
8943         operation_seq_num,
8944         reason_id,
8945         revision,
8946         transaction_mode,
8947         process_flag,
8948 --        lock_flag,
8949 --        posting_flag,
8950 --        item_lot_control_code,
8951 --        item_serial_control_code,
8952         source_header_id,
8953         source_line_id,
8954         transaction_batch_id,
8955         transaction_batch_seq,
8956 --        transaction_interface_id,
8957         -- populate this value for EZ completion/return because material
8958         -- processor need this value to enable quality
8959         qa_collection_id
8960         )/*7314913: Inserting into MTI based on order of transaction_date*/
8961 	/*Sequence and order by cannot exist in the same level of select, thus re-writing the select statement as sub-query*/
8962 	select NVL(p_gib.move_profile.cmp_txn_id,mtl_material_transactions_s.nextval), mtl_material_transactions_s.nextval, t.*
8963         from
8964 	(SELECT wmti.last_updated_by last_update_by, --Fix for bug 5195072
8965                SYSDATE last_update_date,
8966                DECODE(p_gib.login_id, -1, NULL, p_gib.login_id) login_id,
8967                wmti.created_by created_by, --Fix for bug 5195072
8968                SYSDATE  creation_date,
8969                DECODE(p_gib.request_id, -1, NULL, p_gib.request_id) request_id,
8970                DECODE(p_gib.application_id, -1, NULL, p_gib.application_id) application_id,
8971                DECODE(p_gib.program_id, -1, NULL, p_gib.program_id) program_id,
8972                DECODE(p_gib.request_id, -1, NULL, SYSDATE) program_update_date,
8973                p_gib.assy_header_id transaction_header_id,
8974                'WIP Completion' source_code,
8975 --               NVL(p_gib.move_profile.cmp_txn_id, -- completion_transaction_id
8976 --                   mtl_material_transactions_s.nextval),
8977                wmti.transaction_id move_transaction_id,
8978                wmti.primary_item_id inventory_item_id,
8979                wri.completion_subinventory subinventory_code,
8980                wri.completion_locator_id locator_id,
8981                l_txn_direction * wmti.transaction_quantity transaction_qty,
8982                wmti.transaction_uom transaction_uom,
8983                l_txn_direction * wmti.primary_quantity primary_quantity,
8984                wmti.transaction_date transaction_date,
8985                wmti.organization_id organization_id,
8986                wmti.acct_period_id acct_period_id,
8987                l_txn_action_id transaction_action_id,
8988                wmti.wip_entity_id transaction_source_id,
8989                TPS_INV_JOB_OR_SCHED  trsnsaction_source_type_id,
8990                l_txn_type_id transaction_type_id,
8991                wmti.entity_type entity_type,
8992                wmti.line_id repetitive_line_id,
8993                wmti.reference transaction_reference,
8994                wop.operation_seq_num operation_seq_num,
8995                wmti.reason_id reason_id,
8996                -- Fixed bug 2387630
8997                DECODE(msi.revision_qty_control_code, -- revision
8998                  WIP_CONSTANTS.REV, NVL(wrs.bom_revision,
8999                    bom_revisions.get_item_revision_fn
9000                     ('EXCLUDE_OPEN_HOLD',        -- eco_status
9001                      'ALL',                      -- examine_type
9002                       wmti.organization_id,       -- org_id
9003                       wmti.primary_item_id,       -- item_id
9004                       wmti.transaction_date       -- rev_date
9005                      )),
9006                  NULL) revision_qty_control_code,
9007                l_transaction_mode transaction_mode,
9008                WIP_CONSTANTS.MTI_INVENTORY process_flag, -- process_flag for WIP
9009 --               'N',                        -- lock_flag
9010 --               'Y',                        -- posting_flag
9011 --               msi.lot_control_code,       -- item_lot_control_code
9012 --               msi.serial_number_control_code, -- item_serial_control_code
9013                wmti.wip_entity_id source_header_id,
9014                wop.operation_seq_num source_line_id,
9015                p_gib.assy_header_id transaction_batch_id,
9016                WIP_CONSTANTS.ASSY_BATCH_SEQ transaction_batch_seq,
9017 --               mtl_material_transactions_s.nextval, -- transaction_interface_id
9018                -- populate this value for EZ completion/return because
9019                -- material processor need this value to enable quality
9020                wmti.qa_collection_id qa_collection_id
9021           FROM wip_move_txn_interface wmti,
9022                wip_operations wop,
9023                mtl_system_items msi,
9024                wip_repetitive_schedules wrs,
9025                wip_repetitive_items wri
9026          WHERE wmti.group_id = p_gib.group_id
9027            AND TRUNC(wmti.transaction_date) = TRUNC(p_gib.txn_date)
9028            AND wmti.process_phase = WIP_CONSTANTS.MOVE_PROC
9029            AND wmti.process_status = WIP_CONSTANTS.RUNNING
9030            AND wmti.transaction_type = p_txn_type
9031            AND wmti.entity_type = WIP_CONSTANTS.REPETITIVE
9032            AND wrs.wip_entity_id = wmti.wip_entity_id
9033            AND wrs.organization_id = wmti.organization_id
9034            AND wrs.line_id = wmti.line_id
9035            AND wrs.repetitive_schedule_id = wmti.repetitive_schedule_id
9036            AND wri.organization_id = wmti.organization_id
9037            AND wri.wip_entity_id = wmti.wip_entity_id
9038            AND wri.line_id = wmti.line_id
9039            AND wop.organization_id = wmti.organization_id
9040            AND wop.wip_entity_id = wmti.wip_entity_id
9041            AND NVL(wop.repetitive_schedule_id,-1) =
9042                NVL(wmti.repetitive_schedule_id,-1)
9043            AND wop.next_operation_seq_num IS NULL
9044            AND msi.organization_id = wmti.organization_id
9045            AND msi.inventory_item_id = wmti.primary_item_id
9046 	order by wmti.transaction_date, wmti.wip_entity_id) t;
9047   END IF; -- Repetitive schedules
9048 
9049   -- IF debug message level = 2, write statement below to log file
9050   IF (l_logLevel <= wip_constants.full_logging) THEN
9051     fnd_message.set_name('WIP', 'WIP_INSERTED_ROWS');
9052     fnd_message.set_token('ENTITY1', SQL%ROWCOUNT);
9053     fnd_message.set_token('ENTITY2', 'MTL_TRANSACTIONS_INTERFACE');
9054     l_msg := fnd_message.get;
9055     wip_logger.log(p_msg          => l_msg,
9056                    x_returnStatus => l_returnStatus);
9057   END IF;
9058 
9059   /* Only allow lot control for discrete/OSFM jobs */
9060   IF(l_move.jobTxn = WIP_CONSTANTS.YES) THEN
9061 
9062     SELECT COUNT(*)
9063       INTO l_mti_lot_rec
9064       FROM mtl_transactions_interface mti,
9065            mtl_system_items msi
9066      WHERE mti.organization_id = msi.organization_id
9067        AND mti.inventory_item_id = msi.inventory_item_id
9068        AND mti.transaction_header_id = p_gib.assy_header_id
9069        AND mti.transaction_action_id = l_txn_action_id
9070        AND mti.transaction_type_id   = l_txn_type_id
9071        AND mti.transaction_source_type_id = TPS_INV_JOB_OR_SCHED
9072        AND mti.wip_entity_type IN (WIP_CONSTANTS.DISCRETE,
9073                                    WIP_CONSTANTS.LOTBASED) /*WSM*/
9074        AND msi.lot_control_code = WIP_CONSTANTS.LOT;
9075 
9076     -- IF debug message level = 2, write statement below to log file
9077     IF (l_logLevel <= wip_constants.full_logging) THEN
9078       l_msg := 'No. of records in mti updated for lot controlled ' ||
9079                'assemblies : ' || l_mti_lot_rec;
9080       wip_logger.log(p_msg          => l_msg,
9081                      x_returnStatus => l_returnStatus);
9082     END IF;
9083 
9084     /* IF records under lot control THEN continue */
9085     IF(l_mti_lot_rec > 0) THEN
9086       /* Insert lot records into lot interface table */
9087       /*----------------------------------------------------------------------
9088        |The NOT EXISTS statement in the where clause is added for fixing
9089        | bug 1813824. Duplicate records could be inserted in the following
9090        | senario. The first around, the first record get inserted into mtt
9091        | and THEN temp id is update for that record, so one record get
9092        | inserted into mtlt. The second round, the second record get inserted
9093        | into mtt and temp id is THEN updated accordingly. But when doing the
9094        | insertion, since the where clause is not selective enough, the record
9095        | that is inserted into mtlt for the first record is inserted again.
9096        | Since there is no other way to indicate that the corresponding record
9097        | in mtlt is already inserted for record in mtt and the fact that
9098        | we only insert one row into mtlt here for one row in mtt, we could
9099        | add a NOT EXISTS statment to prevent duplicate record being inserted
9100        +---------------------------------------------------------------------*/
9101       INSERT INTO mtl_transaction_lots_interface
9102         (transaction_interface_id,
9103          lot_number,
9104          primary_quantity,
9105          transaction_quantity,
9106          lot_expiration_date,
9107          creation_date,
9108          created_by,
9109          last_update_date,
9110          last_updated_by,
9111          last_update_login,
9112          serial_transaction_temp_id,
9113 		 -- Bug 13734082 FP
9114 		 origination_type,
9115 		 origination_date
9116          )
9117          SELECT mti.transaction_interface_id,
9118                 wdj.lot_number,
9119                 mti.primary_quantity,
9120                 mti.transaction_quantity,
9121                 NULL,                     -- lot_expiration_date
9122                 mti.creation_date,
9123                 mti.created_by,
9124                 mti.last_update_date,
9125                 mti.last_updated_by,
9126                 mti.last_update_login,
9127                 DECODE(msi.serial_number_control_code,
9128                   WIP_CONSTANTS.FULL_SN, mtl_material_transactions_s.nextval,
9129                   WIP_CONSTANTS.DYN_RCV_SN,mtl_material_transactions_s.nextval,
9130                   NULL),
9131 				  1,  -- Bug 13734082 ,FP Bug for Populating orignation type as 'Production'
9132 				  mti.transaction_date
9133            FROM mtl_transactions_interface mti,
9134                 mtl_system_items msi,
9135                 wip_discrete_jobs wdj
9136           WHERE mti.organization_id = msi.organization_id
9137             AND mti.inventory_item_id = msi.inventory_item_id
9138             AND mti.transaction_header_id = p_gib.assy_header_id
9139             AND mti.transaction_action_id = l_txn_action_id
9140             AND mti.transaction_type_id   = l_txn_type_id
9141             AND mti.transaction_source_type_id = TPS_INV_JOB_OR_SCHED
9142             AND mti.wip_entity_type IN (WIP_CONSTANTS.DISCRETE,
9143                                         WIP_CONSTANTS.LOTBASED)/*WSM */
9144             AND msi.lot_control_code = WIP_CONSTANTS.LOT
9145             AND mti.organization_id = wdj.organization_id
9146             AND mti.transaction_source_id = wdj.wip_entity_id
9147             AND NOT EXISTS
9148                (SELECT 1
9149                   FROM mtl_transaction_lots_interface mtli
9150                  WHERE mtli.transaction_interface_id =
9151                        mti.transaction_interface_id);
9152 
9153       -- IF debug message level = 2, write statement below to log file
9154       IF (l_logLevel <= wip_constants.full_logging) THEN
9155         fnd_message.set_name('WIP', 'WIP_INSERTED_ROWS');
9156         fnd_message.set_token('ENTITY1', SQL%ROWCOUNT);
9157         fnd_message.set_token('ENTITY2', 'MTL_TRANSACTION_LOTS_INTERFACE');
9158         l_msg := fnd_message.get;
9159         wip_logger.log(p_msg          => l_msg,
9160                        x_returnStatus => l_returnStatus);
9161       END IF;
9162 
9163       /* Update lot records with an expiration date */
9164       /* Use expiration date in MTL_LOT_NUMBERS. */
9165       /* IF no expiration date THEN calculate based on SHELF_LIFE_DAYS */
9166 
9167       UPDATE mtl_transaction_lots_interface mtli
9168          SET lot_expiration_date =
9169              (SELECT MIN(mln.expiration_date)
9170                 FROM mtl_transactions_interface mti,
9171                      mtl_system_items msi,
9172                      mtl_lot_numbers  mln
9173                WHERE mti.organization_id = msi.organization_id
9174                  AND mti.inventory_item_id = msi.inventory_item_id
9175                  AND mti.transaction_header_id = p_gib.assy_header_id
9176                  AND mti.transaction_action_id = l_txn_action_id
9177                  AND mti.transaction_type_id   = l_txn_type_id
9178                  AND mti.transaction_source_type_id = TPS_INV_JOB_OR_SCHED
9179                  AND mti.wip_entity_type IN (WIP_CONSTANTS.DISCRETE,
9180                                              WIP_CONSTANTS.LOTBASED)/*WSM */
9181                  AND msi.lot_control_code = WIP_CONSTANTS.LOT
9182                  AND mln.lot_number = mtli.lot_number
9183                  AND mln.inventory_item_id = mti.inventory_item_id
9184                  AND mln.organization_id = mti.organization_id)
9185        WHERE mtli.transaction_interface_id IN
9186              (SELECT mti.transaction_interface_id
9187                 FROM mtl_transactions_interface mti,
9188                      mtl_system_items msi
9189                WHERE mti.organization_id = msi.organization_id
9190                  AND mti.inventory_item_id = msi.inventory_item_id
9191                  AND mti.transaction_header_id = p_gib.assy_header_id
9192                  AND mti.transaction_action_id = l_txn_action_id
9193                  AND mti.transaction_type_id   = l_txn_type_id
9194                  AND mti.transaction_source_type_id = TPS_INV_JOB_OR_SCHED
9195                  /* AND mti.wip_entity_type IN (WIP_CONSTANTS.DISCRETE,
9196                                              WIP_CONSTANTS.LOTBASED) WSM */
9197                  AND msi.lot_control_code = WIP_CONSTANTS.LOT
9198                  -- Bug 8847539. Update lot_expiration_date for osfm jobs if on hand of existing lot is not zero.
9199                  -- For Lots with zero onhand it will be recalculated based on shelf life in next sql.
9200                  AND ( mti.wip_entity_type = WIP_CONSTANTS.DISCRETE or
9201                        (mti.wip_entity_type = WIP_CONSTANTS.LOTBASED and
9202                         0 <> (select nvl(sum(primary_transaction_quantity),0)
9203                               FROM mtl_onhand_quantities_detail moqd
9204                               WHERE moqd.inventory_item_id = mti.inventory_item_id
9205                               AND moqd.organization_id = mti.organization_id
9206                               AND moqd.lot_number = mtli.lot_number
9207                              )
9208                        )
9209                      ));
9210 
9211       -- IF debug message level = 2, write statement below to log file
9212       IF (l_logLevel <= wip_constants.full_logging) THEN
9213         fnd_message.set_name('WIP', 'WIP_UPDATED_ROWS');
9214         fnd_message.set_token('ENTITY1', SQL%ROWCOUNT);
9215         fnd_message.set_token('ENTITY2', 'MTL_TRANSACTION_LOTS_INTERFACE');
9216         l_msg := fnd_message.get;
9217         wip_logger.log(p_msg          => l_msg,
9218                        x_returnStatus => l_returnStatus);
9219       END IF;
9220 
9221       /* IF Exp date null in MTL_LOT_NUMBERS should I leave it null */
9222       /* Or should I just decode based on exp date null in the temp table? */
9223       /* Removed group by and modIFied select and where conditions to avoid
9224          oracle error 1427.  See bugs 866408 and 938422. */
9225       UPDATE mtl_transaction_lots_interface mtli
9226          SET lot_expiration_date =
9227              (SELECT mti.transaction_date + NVL(msi.shelf_life_days,0)
9228                 FROM mtl_transactions_interface mti,
9229                      mtl_system_items msi
9230                WHERE mti.transaction_header_id = p_gib.assy_header_id
9231                  AND mti.transaction_action_id = l_txn_action_id
9232                  AND mti.transaction_type_id   = l_txn_type_id
9233                  AND mti.transaction_source_type_id = TPS_INV_JOB_OR_SCHED
9234                  AND mti.wip_entity_type IN (WIP_CONSTANTS.DISCRETE,
9235                                              WIP_CONSTANTS.LOTBASED) /*WSM */
9236                  AND msi.lot_control_code = WIP_CONSTANTS.LOT
9237                  AND msi.organization_id = mti.organization_id
9238                  AND msi.inventory_item_id = mti.inventory_item_id
9239                  AND msi.shelf_life_code = WIP_CONSTANTS.SHELF_LIFE
9240                  AND mtli.transaction_interface_id =
9241                      mti.transaction_interface_id)
9242        WHERE mtli.lot_expiration_date IS NULL
9243          AND mtli.transaction_interface_id IN
9244              (SELECT mti.transaction_interface_id
9245                 FROM mtl_transactions_interface mti,
9246                      mtl_system_items msi
9247                WHERE mti.organization_id = msi.organization_id
9248                  AND mti.inventory_item_id = msi.inventory_item_id
9249                  AND mti.transaction_header_id = p_gib.assy_header_id
9250                  AND mti.transaction_action_id = l_txn_action_id
9251                  AND mti.transaction_type_id   = l_txn_type_id
9252                  AND mti.transaction_source_type_id = TPS_INV_JOB_OR_SCHED
9253                  AND mti.wip_entity_type IN (WIP_CONSTANTS.DISCRETE,
9254                                              WIP_CONSTANTS.LOTBASED)/* WSM */
9255                  AND msi.lot_control_code = WIP_CONSTANTS.LOT);
9256 
9257       -- IF debug message level = 2, write statement below to log file
9258       IF (l_logLevel <= wip_constants.full_logging) THEN
9259         fnd_message.set_name('WIP', 'WIP_UPDATED_ROWS');
9260         fnd_message.set_token('ENTITY1', SQL%ROWCOUNT);
9261         fnd_message.set_token('ENTITY2', 'MTL_TRANSACTION_LOTS_INTERFACE');
9262         l_msg := fnd_message.get;
9263         wip_logger.log(p_msg          => l_msg,
9264                        x_returnStatus => l_returnStatus);
9265       END IF;
9266 
9267     END IF; -- (l_mti_lot_rec > 0)
9268   END IF; -- Discrete and Lotbased jobs
9269 
9270   SELECT COUNT(*)
9271     INTO l_mti_ser_rec
9272     FROM mtl_transactions_interface mti,
9273          mtl_system_items msi
9274    WHERE mti.organization_id = msi.organization_id
9275      AND mti.inventory_item_id = msi.inventory_item_id
9276      AND mti.transaction_header_id = p_gib.assy_header_id
9277      AND mti.transaction_action_id = l_txn_action_id
9278      AND mti.transaction_type_id   = l_txn_type_id
9279      AND mti.transaction_source_type_id = TPS_INV_JOB_OR_SCHED
9280      AND mti.wip_entity_type IN (WIP_CONSTANTS.DISCRETE,
9281                                  WIP_CONSTANTS.LOTBASED) /*WSM*/
9282      AND msi.serial_number_control_code IN (WIP_CONSTANTS.FULL_SN,
9283                                             WIP_CONSTANTS.DYN_RCV_SN);
9284 
9285   -- IF debug message level = 2, write statement below to log file
9286   IF (l_logLevel <= wip_constants.full_logging) THEN
9287     l_msg := 'No. of records in mti updated for serial controlled ' ||
9288              'assemblies : ' || l_mti_ser_rec;
9289     wip_logger.log(p_msg          => l_msg,
9290                    x_returnStatus => l_returnStatus);
9291   END IF;
9292 
9293   /* IF records under serial control THEN continue */
9294   IF(l_mti_ser_rec > 0) THEN
9295     /* Insert serial records into serial interface table */
9296 
9297     INSERT INTO mtl_serial_numbers_interface
9298         (transaction_interface_id,
9299          creation_date,
9300          created_by,
9301          last_update_date,
9302          last_updated_by,
9303          last_update_login,
9304          fm_serial_number,
9305          to_serial_number
9306          )
9307          SELECT DECODE(msi.lot_control_code,
9308                   WIP_CONSTANTS.LOT, mtli.serial_transaction_temp_id,
9309                   mti.transaction_interface_id),
9310                 mti.creation_date,
9311                 mti.created_by,
9312                 mti.last_update_date,
9313                 mti.last_updated_by,
9314                 mti.last_update_login,
9315                 wsmi.assembly_serial_number,
9316                 wsmi.assembly_serial_number
9317            FROM mtl_transactions_interface mti,
9318                 mtl_system_items msi,
9319                 mtl_transaction_lots_interface mtli,
9320                 wip_serial_move_interface wsmi
9321           WHERE mti.organization_id = msi.organization_id
9322             AND mti.inventory_item_id = msi.inventory_item_id
9323             AND mti.transaction_header_id = p_gib.assy_header_id
9324             AND mti.transaction_action_id = l_txn_action_id
9325             AND mti.transaction_type_id   = l_txn_type_id
9326             AND mti.transaction_source_type_id = TPS_INV_JOB_OR_SCHED
9327             AND mti.wip_entity_type IN (WIP_CONSTANTS.DISCRETE,
9328                                         WIP_CONSTANTS.LOTBASED)/*WSM */
9329             AND msi.serial_number_control_code IN (WIP_CONSTANTS.FULL_SN,
9330                                                    WIP_CONSTANTS.DYN_RCV_SN)
9331             AND mti.transaction_interface_id = mtli.transaction_interface_id(+)
9332             AND mti.move_transaction_id = wsmi.transaction_id;
9333 
9334     -- IF debug message level = 2, write statement below to log file
9335     IF (l_logLevel <= wip_constants.full_logging) THEN
9336       fnd_message.set_name('WIP', 'WIP_INSERTED_ROWS');
9337       fnd_message.set_token('ENTITY1', SQL%ROWCOUNT);
9338       fnd_message.set_token('ENTITY2', 'MTL_SERIAL_NUMBERS_INTERFACE');
9339       l_msg := fnd_message.get;
9340       wip_logger.log(p_msg          => l_msg,
9341                      x_returnStatus => l_returnStatus);
9342     END IF;
9343   END IF; -- Discrete or OSFM jobs
9344 
9345   IF(p_gib.move_mode = WIP_CONSTANTS.ONLINE) THEN
9346     l_addMsgToStack := fnd_api.g_true;
9347   ELSE
9348     -- Message stack is only useful for online transaction. For background,
9349     -- we never used message stack.
9350     l_addMsgToStack := fnd_api.g_false;
9351   END IF;
9352   -- Move all assembly records from mti to mmtt
9353   wip_mtlTempProc_priv.validateInterfaceTxns(
9354     p_txnHdrID      => p_gib.assy_header_id,
9355     p_addMsgToStack => l_addMsgToStack,
9356     p_rollbackOnErr => fnd_api.g_false,
9357     x_returnStatus  => x_returnStatus);
9358 
9359   IF(x_returnStatus <> fnd_api.g_ret_sts_success) THEN
9360         --FP bug 5752485 (base bug 4128207) Added the IF condition below since write_mtl_errors
9361         --is not applicable for ONLINE completions. Otherwise the fnd_msg_pub stack is initialized
9362         --inside write_mtl_errors which suppresses messages to be shown to the user in the UI
9363         IF (l_transaction_mode <> WIP_CONSTANTS.ONLINE) THEN
9364                 -- write mtl error message into WIP_TXN_INTERFACE_ERRORS
9365                 write_mtl_errors(p_mtl_header_id => p_gib.assy_header_id);
9366         END IF;
9367         l_errMsg := 'wip_mtlTempProc_priv.validateInterfaceTxns failed' ||
9368                 ' (assembly records)' ;
9369         raise fnd_api.g_exc_unexpected_error;
9370   END IF;
9371 
9372   FOR l_repAssembly IN c_repAssembly(p_header_id => p_gib.assy_header_id) LOOP
9373     -- Preallocate if repetitive schedule. This API will allocate primary
9374     -- quantity to appropriate schedules.
9375     wip_cplProc_priv.preAllocateSchedules(
9376       p_txnHdrID     => p_gib.assy_header_id,
9377       p_cplTxnID     => l_repAssembly.cpl_txn_id,
9378       p_txnActionID  => l_repAssembly.txn_action_id,
9379       p_wipEntityID  => l_repAssembly.txn_src_id,
9380       p_repLineID    => l_repAssembly.rep_line_id,
9381       p_tblName      => WIP_CONSTANTS.MMTT_TBL,
9382       p_endDebug     => fnd_api.g_false,
9383       x_returnStatus => x_returnStatus);
9384 
9385     IF(x_returnStatus <> fnd_api.g_ret_sts_success) THEN
9386       l_errMsg := 'wip_cplProc_priv.preAllocateSchedules failed' ;
9387       raise fnd_api.g_exc_unexpected_error;
9388     END IF;
9389   END LOOP;
9390 
9391   IF(p_gib.move_mode = WIP_CONSTANTS.ONLINE) THEN
9392     snapshot_online(p_mtl_header_id => p_gib.assy_header_id,
9393                     p_org_id        => l_move.org_id,
9394                     p_txn_type      => p_txn_type,
9395                     p_txn_type_id   => l_txn_type_id,
9396                     p_txn_action_id => l_txn_action_id,
9397                     x_returnStatus  => x_returnStatus);
9398 
9399     IF(x_returnStatus <> fnd_api.g_ret_sts_success) THEN
9400       l_errMsg := 'wip_movProc_priv.snapshot_online failed';
9401       raise fnd_api.g_exc_unexpected_error;
9402     END IF; -- check return status
9403   ELSE -- move is background
9404     IF(p_txn_type = WIP_CONSTANTS.RET_TXN) THEN
9405       snapshot_background(p_group_id      => p_gib.group_id,
9406                           p_txn_date      => p_gib.txn_date,
9407                           x_returnStatus  => x_returnStatus);
9408 
9409       IF(x_returnStatus <> fnd_api.g_ret_sts_success) THEN
9410         l_errMsg := 'wip_movProc_priv.snapshot_background failed';
9411         raise fnd_api.g_exc_unexpected_error;
9412       END IF; -- check return status
9413     END IF; -- return transaction
9414   END IF; -- move mode check
9415 
9416   x_returnStatus := fnd_api.g_ret_sts_success;
9417 
9418   -- write to the log file
9419   IF (l_logLevel <= wip_constants.trace_logging) THEN
9420     wip_logger.exitPoint(p_procName => 'wip_movProc_priv.ez_completion',
9421                          p_procReturnStatus => x_returnStatus,
9422                          p_msg => 'procedure complete',
9423                          x_returnStatus => l_returnStatus);
9424   END IF;
9425 
9426 EXCEPTION
9427    WHEN fnd_api.g_exc_unexpected_error THEN
9428     x_returnStatus := fnd_api.g_ret_sts_unexp_error;
9429     IF (l_logLevel <= wip_constants.trace_logging) THEN
9430       wip_logger.exitPoint(p_procName =>'wip_movProc_priv.ez_completion',
9431                            p_procReturnStatus => x_returnStatus,
9432                            p_msg => l_errMsg,
9433                            x_returnStatus => l_returnStatus);
9434     END IF;
9435 
9436   WHEN others THEN
9437     x_returnStatus := fnd_api.g_ret_sts_unexp_error;
9438     l_errMsg := 'unexpected error: ' || SQLERRM || 'SQLCODE = ' || SQLCODE;
9439 
9440     IF (l_logLevel <= wip_constants.trace_logging) THEN
9441       wip_logger.exitPoint(p_procName=>'wip_movProc_priv.ez_completion',
9442                            p_procReturnStatus => x_returnStatus,
9443                            p_msg => l_errMsg,
9444                            x_returnStatus => l_returnStatus);
9445     END IF;
9446     fnd_message.set_name('FND', 'FND_GENERIC_MESSAGE');
9447     fnd_message.set_token('MESSAGE', l_errMsg);
9448     fnd_msg_pub.add;
9449 END ez_completion;
9450 
9451 /*****************************************************************************
9452  * This procedure is equivalent to witoc_update_wro in wiltps5.ppc
9453  * This update statement in this procedure is equivalent to the one in
9454  * WIP_OVERCOMPLETION.update_wip_req_operations. This procedure is used to
9455  * update WIP_REQUIREMENT_OPERATIONS table
9456  ****************************************************************************/
9457 PROCEDURE update_wro(p_gib           IN        group_rec_t,
9458                      x_returnStatus OUT NOCOPY VARCHAR2) IS
9459 
9460 l_params           wip_logger.param_tbl_t;
9461 l_returnStatus     VARCHAR(1);
9462 l_errMsg           VARCHAR2(240);
9463 l_logLevel         NUMBER := fnd_log.g_current_runtime_level;
9464 
9465 BEGIN
9466   IF (l_logLevel <= wip_constants.trace_logging) THEN
9467     l_params(1).paramName   := 'p_group_id';
9468     l_params(1).paramValue  :=  p_gib.group_id;
9469     l_params(2).paramName   := 'p_txn_date';
9470     l_params(2).paramValue  :=  p_gib.txn_date;
9471     wip_logger.entryPoint(p_procName =>'wip_movProc_priv.update_wro',
9472                         p_params => l_params,
9473                         x_returnStatus => l_returnStatus);
9474   END IF;
9475 
9476   UPDATE wip_requirement_operations wro
9477      SET (wro.required_quantity,
9478           last_updated_by,
9479           last_update_date,
9480           last_update_login,
9481           request_id,
9482           program_application_id,
9483           program_id,
9484           program_update_date) =
9485          (SELECT MIN(required_quantity) + (NVL(SUM(
9486                    NVL(wma1.primary_quantity, wmti1.primary_quantity)),0)
9487           --Bug 5476966:Division by yield is added.
9488                    * MIN(quantity_per_assembly)/min(nvl(component_yield_factor,
9489                                                1))),
9490                  p_gib.user_id,
9491                  SYSDATE,
9492                  DECODE(p_gib.login_id,-1,NULL,p_gib.login_id),
9493                  DECODE(p_gib.request_id,-1,NULL,p_gib.request_id),
9494                  DECODE(p_gib.application_id,-1,NULL,p_gib.application_id),
9495                  DECODE(p_gib.program_id,-1,NULL,p_gib.program_id),
9496                  DECODE(p_gib.request_id,-1,NULL,SYSDATE)
9497             FROM wip_requirement_operations wro1,
9498                  wip_move_txn_interface wmti1,
9499                  wip_move_txn_allocations wma1
9500            WHERE wro1.rowid = wro.rowid
9501            -- The WO rows to be updated are identIFied by the rowids.
9502            -- For each such row, go back and sum the quantities from WMTI
9503              AND wmti1.group_id = p_gib.group_id
9504              AND wmti1.process_phase = WIP_CONSTANTS.MOVE_PROC
9505              AND wmti1.process_status = WIP_CONSTANTS.RUNNING
9506              AND TRUNC(wmti1.transaction_date) = TRUNC(p_gib.txn_date)
9507              AND wmti1.overcompletion_transaction_id IS NOT NULL
9508              AND wmti1.overcompletion_primary_qty IS NULL
9509              AND wro1.wip_entity_id = wmti1.wip_entity_id
9510              AND wro1.organization_id = wmti1.organization_id
9511              AND wmti1.organization_id = wma1.organization_id (+)
9512              AND wmti1.transaction_id = wma1.transaction_id (+)
9513              AND NVL(wma1.repetitive_schedule_id,0)
9514                  = NVL(wro1.repetitive_schedule_id,0)
9515                )
9516          WHERE wro.rowid in
9517                (SELECT wro2.rowid
9518                   FROM wip_requirement_operations wro2,
9519                        wip_move_txn_interface wmti2,
9520                        wip_move_txn_allocations wma2
9521                  WHERE wmti2.group_id = p_gib.group_id
9522                    AND wmti2.process_phase = WIP_CONSTANTS.MOVE_PROC
9523                    AND wmti2.process_status = WIP_CONSTANTS.RUNNING
9524                    AND TRUNC(wmti2.transaction_date) = TRUNC(p_gib.txn_date)
9525                    AND wmti2.overcompletion_transaction_id IS NOT NULL
9526                    AND wmti2.overcompletion_primary_qty IS NULL
9527                    -- Picked a Move txn
9528                    AND wro2.wip_entity_id = wmti2.wip_entity_id
9529                    AND wro2.organization_id = wmti2.organization_id
9530                    AND wmti2.organization_id = wma2.organization_id (+)
9531                    AND wmti2.transaction_id = wma2.transaction_id (+)
9532                    AND NVL(wma2.repetitive_schedule_id,0)
9533                        = NVL(wro2.repetitive_schedule_id,0))
9534                    AND nvl(wro.basis_type,1) <> WIP_CONSTANTS.LOT_BASED_MTL; /* LBM Project */
9535 
9536   x_returnStatus := fnd_api.g_ret_sts_success;
9537 
9538   -- write to the log file
9539   IF (l_logLevel <= wip_constants.trace_logging) THEN
9540     wip_logger.exitPoint(p_procName => 'wip_movProc_priv.update_wro',
9541                          p_procReturnStatus => x_returnStatus,
9542                          p_msg => 'procedure complete',
9543                          x_returnStatus => l_returnStatus);
9544   END IF;
9545 
9546 EXCEPTION
9547   WHEN others THEN
9548     x_returnStatus := fnd_api.g_ret_sts_unexp_error;
9549     l_errMsg := 'unexpected error: ' || SQLERRM || 'SQLCODE = ' || SQLCODE;
9550 
9551     IF (l_logLevel <= wip_constants.trace_logging) THEN
9552       wip_logger.exitPoint(p_procName=>'wip_movProc_priv.update_wro',
9553                            p_procReturnStatus => x_returnStatus,
9554                            p_msg => l_errMsg,
9555                            x_returnStatus => l_returnStatus);
9556     END IF;
9557     fnd_message.set_name('FND', 'FND_GENERIC_MESSAGE');
9558     fnd_message.set_token('MESSAGE', l_errMsg);
9559     fnd_msg_pub.add;
9560 END update_wro;
9561 
9562 /*****************************************************************************
9563  * This procedure is equivalent to wiltps in wiltps5.ppc
9564  * This is the main api to do move transactions
9565  ****************************************************************************/
9566 
9567 PROCEDURE move_txns(p_gib       IN OUT NOCOPY group_rec_t,
9568                     x_returnStatus OUT NOCOPY VARCHAR2) IS
9569 
9570 l_params           wip_logger.param_tbl_t;
9571 l_returnStatus     VARCHAR(1);
9572 l_errMsg           VARCHAR(240);
9573 l_move             move_profile_rec_t;
9574 l_po               BOOLEAN;
9575 l_poStatus         VARCHAR(1);
9576 l_poIndustry       VARCHAR(1);
9577 l_poSchema         VARCHAR(10);
9578 l_logLevel         NUMBER := fnd_log.g_current_runtime_level;
9579 
9580 BEGIN
9581   l_move := p_gib.move_profile;
9582 
9583   IF (l_logLevel <= wip_constants.trace_logging) THEN
9584     l_params(1).paramName   := 'p_group_id';
9585     l_params(1).paramValue  :=  p_gib.group_id;
9586     l_params(2).paramName   := 'p_mtl_header_id';
9587     l_params(2).paramValue  :=  p_gib.mtl_header_id;
9588     l_params(3).paramName   := 'p_move_mode';
9589     l_params(3).paramValue  :=  p_gib.move_mode;
9590     l_params(4).paramName   := 'p_bf_mode';
9591     l_params(4).paramValue  :=  p_gib.bf_mode;
9592     l_params(5).paramName   := 'p_mtl_mode';
9593     l_params(5).paramValue  :=  p_gib.mtl_mode;
9594     l_params(6).paramName   := 'p_txn_date';
9595     l_params(6).paramValue  :=  p_gib.txn_date;
9596     l_params(7).paramName   := 'p_process_phase';
9597     l_params(7).paramValue  :=  p_gib.process_phase;
9598     l_params(8).paramName   := 'p_process_status';
9599     l_params(8).paramValue  :=  p_gib.process_status;
9600     l_params(9).paramName   := 'p_time_out';
9601     l_params(9).paramValue  :=  p_gib.time_out;
9602     l_params(10).paramName  := 'p_intf_tbl_name';
9603     l_params(10).paramValue :=  p_gib.intf_tbl_name;
9604     l_params(11).paramName  := 'p_user_id';
9605     l_params(11).paramValue :=  p_gib.user_id;
9606     l_params(12).paramName  := 'p_login_id';
9607     l_params(12).paramValue :=  p_gib.login_id;
9608     l_params(13).paramName  := 'p_request_id';
9609     l_params(13).paramValue :=  p_gib.request_id;
9610     l_params(14).paramName  := 'p_application_id';
9611     l_params(14).paramValue :=  p_gib.application_id;
9612     l_params(15).paramName  := 'p_program_id';
9613     l_params(15).paramValue :=  p_gib.program_id;
9614     l_params(16).paramName  := 'p_org_id';
9615     l_params(16).paramValue :=  l_move.org_id;
9616     l_params(17).paramName  := 'p_wip_id';
9617     l_params(17).paramValue :=  l_move.wip_id;
9618     l_params(18).paramName  := 'p_entity_type';
9619     l_params(18).paramValue :=  l_move.entity_type;
9620     l_params(19).paramName  := 'p_fmOp';
9621     l_params(19).paramValue :=  l_move.fmOp;
9622     l_params(20).paramName  := 'p_fmStep';
9623     l_params(20).paramValue :=  l_move.fmStep;
9624     l_params(21).paramName  := 'p_toOp';
9625     l_params(21).paramValue :=  l_move.toOp;
9626     l_params(22).paramName  := 'p_toStep';
9627     l_params(22).paramValue :=  l_move.toStep;
9628     l_params(23).paramName  := 'p_scrapTxn';
9629     l_params(23).paramValue :=  l_move.scrapTxn;
9630     l_params(24).paramName  := 'p_easyComplete';
9631     l_params(24).paramValue :=  l_move.easyComplete;
9632     l_params(25).paramName  := 'p_easyReturn';
9633     l_params(25).paramValue :=  l_move.easyReturn;
9634     l_params(26).paramName  := 'p_jobTxn';
9635     l_params(26).paramValue :=  l_move.jobTxn;
9636     l_params(27).paramName  := 'p_scheTxn';
9637     l_params(27).paramValue :=  l_move.scheTxn;
9638     l_params(28).paramName  := 'p_rsrcItem';
9639     l_params(28).paramValue :=  l_move.rsrcItem;
9640     l_params(29).paramName  := 'p_rsrcLot';
9641     l_params(29).paramValue :=  l_move.rsrcLot;
9642     l_params(30).paramName  := 'p_poReqItem';
9643     l_params(30).paramValue :=  l_move.poReqItem;
9644     l_params(31).paramName  := 'p_poReqLot';
9645     l_params(31).paramValue :=  l_move.poReqLot;
9646     wip_logger.entryPoint(p_procName =>'wip_movProc_priv.move_txns',
9647                           p_params => l_params,
9648                           x_returnStatus => l_returnStatus);
9649   END IF;
9650 
9651   -- Lock record in WIP_OPERATIONS table
9652   lock_wipops(p_gib          => p_gib,
9653               x_returnStatus => x_returnStatus);
9654 
9655   IF(x_returnStatus <> fnd_api.g_ret_sts_success) THEN
9656      l_errMsg := 'wip_movProc_priv.lock_wipops failed';
9657      raise fnd_api.g_exc_unexpected_error;
9658   END IF; -- check return status
9659 
9660   -- Call repetitive allocatioin for repetitive schedule
9661   IF(l_move.scheTxn = WIP_CONSTANTS.YES) THEN
9662     rep_move_alloc(p_gib          => p_gib,
9663                    x_returnStatus => x_returnStatus);
9664 
9665     IF(x_returnStatus <> fnd_api.g_ret_sts_success) THEN
9666       l_errMsg := 'wip_movProc_priv.rep_move_alloc failed';
9667       raise fnd_api.g_exc_unexpected_error;
9668     END IF; -- check return status
9669   END IF; -- check repetitive schedules
9670 
9671   -- Check for the step unit quantities for discrete and OSFM jobs
9672   IF(l_move.jobTxn = WIP_CONSTANTS.YES) THEN
9673     check_qty_dj(p_gib          => p_gib,
9674                  x_returnStatus => x_returnStatus);
9675 
9676     IF(x_returnStatus <> fnd_api.g_ret_sts_success) THEN
9677       l_errMsg := 'wip_movProc_priv.check_qty_dj failed';
9678       raise fnd_api.g_exc_unexpected_error;
9679     END IF; -- check return status
9680   END IF; -- check discrete and OSFM jobs
9681 
9682   -- Lock record in WIP_OPERATIONS table
9683   -- Update the WRO quantities for the Overcompletion
9684   update_wro(p_gib          => p_gib,
9685              x_returnStatus => x_returnStatus);
9686 
9687   IF(x_returnStatus <> fnd_api.g_ret_sts_success) THEN
9688     l_errMsg := 'wip_movProc_priv.update_wro failed';
9689     raise fnd_api.g_exc_unexpected_error;
9690   END IF; -- check return status
9691 
9692   -- Record move transactions history in WIP_MOVE_TRANSACTIONS
9693   insert_txn_history(p_gib          => p_gib,
9694                      x_returnStatus => x_returnStatus);
9695 
9696   IF(x_returnStatus <> fnd_api.g_ret_sts_success) THEN
9697     l_errMsg := 'wip_movProc_priv.insert_txn_history failed';
9698     raise fnd_api.g_exc_unexpected_error;
9699   END IF; -- check return status
9700 
9701   -- Delete child record (overmove/overcompletion/overreturn)
9702   delete_child_txn(p_gib          => p_gib,
9703                    x_returnStatus => x_returnStatus);
9704 
9705   -- Delete child record (overmove/overcompletion/overreturn)
9706   IF(x_returnStatus <> fnd_api.g_ret_sts_success) THEN
9707     l_errMsg := 'wip_movProc_priv.delete_child_txn failed';
9708     raise fnd_api.g_exc_unexpected_error;
9709   END IF; -- check return status
9710 
9711   -- Delete child record (overmove/overcompletion/overreturn)
9712   -- Insert auto-resources associated with move
9713   -- (insert into WIP_COST_TXN_INTERFACE)
9714   insert_auto_resource(p_gib          => p_gib,
9715                        x_returnStatus => x_returnStatus);
9716 
9717   IF(x_returnStatus <> fnd_api.g_ret_sts_success) THEN
9718     l_errMsg := 'wip_movProc_priv.insert_auto_resource failed';
9719     raise fnd_api.g_exc_unexpected_error;
9720   END IF; -- check return status
9721 
9722   -- Only call the cost allocation IF schedule transactions and auto resource
9723   -- per item exist (insert into WIP_TXN_ALLOCATIONS)
9724   IF(l_move.scheTxn = WIP_CONSTANTS.YES AND
9725      l_move.rsrcItem = WIP_CONSTANTS.YES) THEN
9726 
9727     insert_txn_alloc(p_gib          => p_gib,
9728                      x_returnStatus => x_returnStatus);
9729 
9730     IF(x_returnStatus <> fnd_api.g_ret_sts_success) THEN
9731       l_errMsg := 'wip_movProc_priv.insert_txn_alloc failed';
9732       raise fnd_api.g_exc_unexpected_error;
9733     END IF; -- check return status
9734   END IF; -- repetitive schedule and resource per item exist
9735 
9736   -- Insert department overhead into WIP_COST_TXN_INTERFACE
9737   insert_dept_overhead(p_gib          => p_gib,
9738                        x_returnStatus => x_returnStatus);
9739 
9740   IF(x_returnStatus <> fnd_api.g_ret_sts_success) THEN
9741     l_errMsg := 'wip_movProc_priv.insert_dept_overhead failed';
9742     raise fnd_api.g_exc_unexpected_error;
9743   END IF; -- check return status
9744 
9745   -- Release costing transactions
9746   release_cost_txn(p_gib          => p_gib,
9747                    x_returnStatus => x_returnStatus);
9748 
9749   IF(x_returnStatus <> fnd_api.g_ret_sts_success) THEN
9750     l_errMsg := 'wip_movProc_priv.release_cost_txn failed';
9751     raise fnd_api.g_exc_unexpected_error;
9752   END IF; -- check return status
9753 
9754   -- IF PO installed and PO, insert PO info into PO_REQUISITIONS_INTERFACE_ALL
9755   l_po := fnd_installation.get_app_info
9756                           (application_short_name => 'PO',
9757                            status                 => l_poStatus,
9758                            industry               => l_poIndustry,
9759                            oracle_schema          => l_poSchema);
9760 
9761   IF(l_po = FALSE) THEN -- there is an error calling fnd_installion package
9762     l_errMsg := 'fnd_installation.get_app_info failed';
9763     raise fnd_api.g_exc_unexpected_error;
9764   ELSE  -- no error
9765     IF(l_poStatus = 'I') THEN -- IF PO installed, insert PO info
9766       insert_po_req(p_gib          => p_gib,
9767                     x_returnStatus => x_returnStatus);
9768 
9769       IF(x_returnStatus <> fnd_api.g_ret_sts_success) THEN
9770         l_errMsg := 'wip_movProc_priv.insert_po_req failed';
9771         raise fnd_api.g_exc_unexpected_error;
9772       END IF; -- check return status
9773     END IF;
9774   END IF;
9775 
9776   IF(p_gib.move_mode = WIP_CONSTANTS.ONLINE) THEN
9777     -- Only update quantity_completed if online. For background, we will update
9778     -- quantity completed in update_wo_and_snapshot
9779     update_complete_qty(p_gib          => p_gib,
9780                         x_returnStatus => x_returnStatus);
9781 
9782     IF(x_returnStatus <> fnd_api.g_ret_sts_success) THEN
9783       l_errMsg := 'wip_movProc_priv.update_complete_qty failed';
9784       raise fnd_api.g_exc_unexpected_error;
9785     END IF; -- check return status
9786   END IF;
9787 
9788   -- Update scrap quantity in WIP_DISCRETE_JOBS and insert into MMTT IF
9789   -- scrap account provided
9790   scrap_txns(p_gib          => p_gib,
9791              x_returnStatus => x_returnStatus);
9792 
9793   IF(x_returnStatus <> fnd_api.g_ret_sts_success) THEN
9794     l_errMsg := 'wip_movProc_priv.scrap_txns failed';
9795     raise fnd_api.g_exc_unexpected_error;
9796   END IF; -- check return status
9797 
9798   -- Start workflow for OSP stuff
9799   start_workflow(p_gib          => p_gib,
9800                  x_returnStatus => x_returnStatus);
9801 
9802   IF(x_returnStatus <> fnd_api.g_ret_sts_success) THEN
9803     l_errMsg := 'wip_movProc_priv.start_workflow failed';
9804     raise fnd_api.g_exc_unexpected_error;
9805   END IF; -- check return status
9806 
9807   x_returnStatus := fnd_api.g_ret_sts_success;
9808 
9809   -- write to the log file
9810   IF (l_logLevel <= wip_constants.trace_logging) THEN
9811     wip_logger.exitPoint(p_procName => 'wip_movProc_priv.move_txns',
9812                          p_procReturnStatus => x_returnStatus,
9813                          p_msg => 'procedure complete',
9814                          x_returnStatus => l_returnStatus);
9815   END IF;
9816 
9817 EXCEPTION
9818   WHEN fnd_api.g_exc_unexpected_error THEN
9819     x_returnStatus := fnd_api.g_ret_sts_unexp_error;
9820     IF (l_logLevel <= wip_constants.trace_logging) THEN
9821       wip_logger.exitPoint(p_procName =>'wip_movProc_priv.move_txns',
9822                            p_procReturnStatus => x_returnStatus,
9823                            p_msg => l_errMsg,
9824                            x_returnStatus => l_returnStatus);
9825     END IF;
9826 
9827   WHEN others THEN
9828     x_returnStatus := fnd_api.g_ret_sts_unexp_error;
9829     l_errMsg := 'unexpected error: ' || SQLERRM || 'SQLCODE = ' || SQLCODE;
9830 
9831     IF (l_logLevel <= wip_constants.trace_logging) THEN
9832       wip_logger.exitPoint(p_procName=>'wip_movProc_priv.move_txns',
9833                            p_procReturnStatus => x_returnStatus,
9834                            p_msg => l_errMsg,
9835                            x_returnStatus => l_returnStatus);
9836     END IF;
9837     fnd_message.set_name('FND', 'FND_GENERIC_MESSAGE');
9838     fnd_message.set_token('MESSAGE', l_errMsg);
9839     fnd_msg_pub.add;
9840 END move_txns;
9841 
9842 /*****************************************************************************
9843  * This procedure is equivalent to SF_MOVE in wiutps.ppc + EASY_COMPLETE in
9844  * wiutez.ppc for ON-LINE transactions. It is also equivalent to wiltws in
9845  * wiltws.ppc for BACKGROUND transactions.
9846  *
9847  * This is the main api to do move, scrap, easy complete, and easy return.
9848  ****************************************************************************/
9849 
9850 PROCEDURE processIntf(p_group_id             IN        NUMBER,
9851                       p_proc_phase           IN        NUMBER,
9852                       p_time_out             IN        NUMBER,
9853                       p_move_mode            IN        NUMBER,
9854                       p_bf_mode              IN        NUMBER,
9855                       p_mtl_mode             IN        NUMBER,
9856                       p_ENDDebug             IN        VARCHAR2,
9857                       p_initMsgList          IN        VARCHAR2,
9858                       p_insertAssy           IN        VARCHAR2,
9859                       p_do_backflush         IN        VARCHAR2,
9860                       p_child_txn_id         IN        NUMBER := NULL,
9861                       p_assy_header_id       IN        NUMBER := NULL,
9862                       p_mtl_header_id        IN        NUMBER := NULL,
9863                       p_cmp_txn_id           IN        NUMBER := NULL,
9864                       p_seq_move             IN        NUMBER := NULL,
9865                       -- Fixed bug 4361566.
9866                       p_allow_partial_commit IN  NUMBER := NULL,
9867                       x_returnStatus         OUT NOCOPY VARCHAR2) IS
9868 
9869 CURSOR c_backflush(p_txn_date DATE) IS
9870    SELECT  wmti.wip_entity_id wip_id,
9871            wmti.organization_id org_id,
9872            wmti.transaction_date txn_date,
9873            wmti.primary_quantity primary_qty,
9874            wmti.transaction_type txn_type,
9875            wmti.entity_type ent_type,
9876            wmti.line_id line_id,
9877            wmti.fm_operation_seq_num fm_op,
9878            wmti.to_operation_seq_num to_op,
9879            wmti.fm_intraoperation_step_type fm_step,
9880            wmti.to_intraoperation_step_type to_step,
9881            wmti.transaction_id txn_id,
9882            wmti.reason_id reason_id,
9883            wmti.reference reference
9884       FROM wip_move_txn_interface wmti
9885      WHERE wmti.group_id = p_group_id
9886        AND TRUNC(wmti.transaction_date)= TRUNC(p_txn_date)
9887        AND wmti.process_phase = WIP_CONSTANTS.BF_SETUP
9888        AND wmti.process_status = WIP_CONSTANTS.RUNNING;
9889 
9890 CURSOR c_move_online IS
9891   SELECT NVL(last_updated_by, -1) user_id,
9892          NVL(last_update_login, -1) login_id,
9893          NVL(request_id, -1) req_id,
9894          NVL(program_application_id, -1) appl_id,
9895          NVL(program_id, -1) prog_id,
9896          transaction_type txn_type,
9897          organization_id org_id,
9898          wip_entity_id wip_id,
9899          entity_type,
9900          transaction_date txn_date,
9901          process_status proc_status,
9902          fm_operation_seq_num fm_op,
9903          fm_intraoperation_step_type fm_step,
9904          to_operation_seq_num to_op,
9905          to_intraoperation_step_type to_step
9906     FROM wip_move_txn_interface
9907    WHERE group_id = p_group_id
9908 /* Comment out the check below because UI may need to use validation logic */
9909 --     AND process_phase = WIP_CONSTANTS.MOVE_PROC
9910      AND process_status = WIP_CONSTANTS.RUNNING;
9911 
9912 CURSOR c_qa_id(p_txn_date DATE) IS
9913  SELECT qa_collection_id
9914    FROM wip_move_txn_interface
9915   WHERE group_id = p_group_id
9916     AND process_phase = WIP_CONSTANTS.MOVE_PROC
9917     AND process_status = WIP_CONSTANTS.RUNNING
9918     AND TRUNC(transaction_date)= TRUNC(p_txn_date)
9919  -- Only enable QA for move, scrap and reject. For EZ completion/return,
9920  -- material processor will call it.
9921     AND transaction_type = WIP_CONSTANTS.MOVE_TXN
9922     AND qa_collection_id IS NOT NULL;
9923 
9924 CURSOR c_txn_date IS
9925   SELECT DISTINCT TRUNC(transaction_date)
9926     FROM wip_move_txn_interface
9927    WHERE group_id = p_group_id
9928      AND process_status = WIP_CONSTANTS.RUNNING
9929    order by 1; /*Bug 7314913: Added order by clause*/
9930 
9931 /*Bug 13992087: This cursor returns jobs submitted for EZ_Completion (Move & Complete)*/
9932 /*Bug 16483751: Added the check so that EZ completions for repetetive schedules do not error out */
9933 CURSOR c_jobs IS
9934   select wmti.wip_entity_id, wmti.transaction_id txn_id, wmti.transaction_type txn_type
9935   from wip_move_txn_interface wmti,wip_entities we
9936   where wmti.group_id = p_group_id
9937     AND wmti.process_status = WIP_CONSTANTS.RUNNING
9938 	AND wmti.transaction_type = WIP_CONSTANTS.COMP_TXN
9939 	AND we.wip_entity_id=wmti.wip_entity_id
9940 	AND we.entity_type <>WIP_CONSTANTS.REPETITIVE;
9941 
9942 l_gib              group_rec_t;
9943 l_move_online      c_move_online%ROWTYPE;
9944 l_backflush        c_backflush%ROWTYPE;
9945 l_jobs			   c_jobs%ROWTYPE;
9946 l_params           wip_logger.param_tbl_t;
9947 l_returnStatus     VARCHAR(1);
9948 l_errMsg           VARCHAR(2000);
9949 l_msg              VARCHAR(240);
9950 l_bf_mode          NUMBER;
9951 l_mtl_mode         NUMBER;
9952 l_job              NUMBER;
9953 l_sche             NUMBER;
9954 l_qa_collection_id NUMBER;
9955 l_err_record       NUMBER := 0;
9956 l_txn_tmp_id       NUMBER;
9957 l_msgCount         NUMBER;
9958 l_MMTT_record      NUMBER;
9959 l_returnCode       NUMBER;
9960 l_first_bf_op      NUMBER := -1;
9961 l_last_bf_op       NUMBER := -1;
9962 l_bf_qty           NUMBER;
9963 l_forward          NUMBER;
9964 l_mov_txn_id       NUMBER;
9965 l_logLevel         NUMBER := fnd_log.g_current_runtime_level;
9966 l_bf_required      NUMBER; -- throw away value
9967 l_ls_required      NUMBER;
9968 -- New variable to pass to OSFM new backflush API.
9969 l_error_msg        VARCHAR2(1000);
9970 l_error_count      NUMBER;
9971 -- Fixed bug 4361566
9972 l_return_hdr_id    NUMBER := -1;
9973 l_wip_entity_id	   NUMBER;
9974 l_job_name VARCHAR2(240);
9975 BEGIN
9976 
9977   IF(fnd_api.to_boolean(p_initMsgList)) THEN
9978     fnd_msg_pub.initialize;
9979   END IF;
9980 
9981   IF (l_logLevel <= wip_constants.trace_logging) THEN
9982     l_params(1).paramName   := 'p_group_id';
9983     l_params(1).paramValue  :=  p_group_id;
9984     l_params(2).paramName   := 'p_child_txn_id';
9985     l_params(2).paramValue  :=  p_child_txn_id;
9986     l_params(3).paramName   := 'p_mtl_header_id';
9987     l_params(3).paramValue  :=  p_mtl_header_id;
9988     l_params(4).paramName   := 'p_proc_phase';
9989     l_params(4).paramValue  :=  p_proc_phase;
9990     l_params(5).paramName   := 'p_time_out';
9991     l_params(5).paramValue  :=  p_time_out;
9992     l_params(6).paramName   := 'p_move_mode';
9993     l_params(6).paramValue  :=  p_move_mode;
9994     l_params(7).paramName   := 'p_bf_mode';
9995     l_params(7).paramValue  :=  p_bf_mode;
9996     l_params(8).paramName   := 'p_mtl_mode';
9997     l_params(8).paramValue  :=  p_mtl_mode;
9998     l_params(9).paramName   := 'p_insertAssy';
9999     l_params(9).paramValue  :=  p_insertAssy;
10000     l_params(10).paramName  := 'p_do_backflush';
10001     l_params(10).paramValue :=  p_do_backflush;
10002     l_params(11).paramName  := 'p_cmp_txn_id';
10003     l_params(11).paramValue :=  p_cmp_txn_id;
10004     l_params(11).paramName  := 'p_seq_move';
10005     l_params(11).paramValue :=  p_seq_move;
10006     l_params(12).paramName  := 'p_assy_header_id';
10007     l_params(12).paramValue :=  p_assy_header_id;
10008     l_params(13).paramName  := 'p_allow_partial_commit';
10009     l_params(13).paramValue :=  p_allow_partial_commit;
10010 
10011     wip_logger.entryPoint(p_procName =>'wip_movProc_priv.processIntf',
10012                           p_params => l_params,
10013                           x_returnStatus => l_returnStatus);
10014   END IF;
10015 
10016   IF(p_move_mode = WIP_CONSTANTS.ONLINE) THEN
10017 
10018     -- this cursor suppose to return only one record because transaction_id
10019     -- is primary_key
10020     FOR l_move_online IN  c_move_online LOOP
10021 
10022       -- initialize value for l_move
10023       l_gib.move_profile.child_txn_id  := p_child_txn_id;
10024       l_gib.move_profile.cmp_txn_id    := p_cmp_txn_id;
10025       l_gib.move_profile.org_id        := l_move_online.org_id;
10026       l_gib.move_profile.wip_id        := l_move_online.wip_id;
10027       l_gib.move_profile.entity_type   := l_move_online.entity_type;
10028       l_gib.move_profile.fmOp          := l_move_online.fm_op;
10029       l_gib.move_profile.fmStep        := l_move_online.fm_step;
10030       l_gib.move_profile.toOp          := l_move_online.to_op;
10031       l_gib.move_profile.toStep        := l_move_online.to_step;
10032 
10033       IF(l_move_online.txn_type = WIP_CONSTANTS.COMP_TXN) THEN
10034         l_gib.move_profile.easyComplete  := WIP_CONSTANTS.YES;
10035       ELSE
10036         l_gib.move_profile.easyComplete  := WIP_CONSTANTS.NO;
10037       END IF;
10038 
10039       IF(l_move_online.txn_type = WIP_CONSTANTS.RET_TXN) THEN
10040         l_gib.move_profile.easyReturn  := WIP_CONSTANTS.YES;
10041       ELSE
10042         l_gib.move_profile.easyReturn  := WIP_CONSTANTS.NO;
10043       END IF;
10044 
10045       IF(l_move_online.entity_type = WIP_CONSTANTS.DISCRETE OR
10046          l_move_online.entity_type = WIP_CONSTANTS.LOTBASED) THEN
10047         l_gib.move_profile.jobTxn := WIP_CONSTANTS.YES;
10048       ELSE
10049         l_gib.move_profile.jobTxn := WIP_CONSTANTS.NO;
10050       END IF;
10051 
10052       IF(l_move_online.entity_type = WIP_CONSTANTS.REPETITIVE) THEN
10053         l_gib.move_profile.scheTxn := WIP_CONSTANTS.YES;
10054       ELSE
10055         l_gib.move_profile.scheTxn := WIP_CONSTANTS.NO;
10056       END IF;
10057       -- the others 4 parameters will be initialized in get_move_profile()
10058       -- rsrcItem, rsrcLot, poReqItem, poReqLot
10059 
10060       -- initialize value for l_gib
10061       l_gib.group_id       := p_group_id;
10062       l_gib.assy_header_id := p_assy_header_id;
10063       l_gib.mtl_header_id  := p_mtl_header_id;
10064       l_gib.move_mode      := WIP_CONSTANTS.ONLINE;
10065       l_gib.bf_mode        := p_bf_mode; -- l_bf_mode;
10066       l_gib.mtl_mode       := p_mtl_mode; -- l_mtl_mode;
10067       l_gib.process_phase  := WIP_CONSTANTS.MOVE_PROC;
10068       l_gib.process_status := WIP_CONSTANTS.RUNNING;
10069       l_gib.time_out       := p_time_out;
10070       l_gib.intf_tbl_name  := 'WIP_MOVE_TXN_INTERFACE';
10071       l_gib.user_id        := l_move_online.user_id;
10072       l_gib.login_id       := l_move_online.login_id;
10073       l_gib.request_id     := l_move_online.req_id;
10074       l_gib.application_id := l_move_online.appl_id;
10075       l_gib.program_id     := l_move_online.prog_id;
10076       l_gib.seq_move       := WIP_CONSTANTS.NO;
10077     END LOOP; -- c_move_online
10078   ELSE -- move mode is background
10079     l_gib.group_id       := p_group_id;
10080     l_gib.assy_header_id := p_assy_header_id;
10081     l_gib.mtl_header_id  := p_mtl_header_id;
10082     l_gib.move_mode      := WIP_CONSTANTS.BACKGROUND;
10083     l_gib.bf_mode        := p_bf_mode; -- l_bf_mode;
10084     l_gib.mtl_mode       := p_mtl_mode; -- l_mtl_mode;
10085     l_gib.process_phase  := p_proc_phase;
10086     l_gib.process_status := WIP_CONSTANTS.RUNNING;
10087     l_gib.time_out       := p_time_out;
10088     l_gib.intf_tbl_name  := 'WIP_MOVE_TXN_INTERFACE';
10089     l_gib.user_id        := fnd_global.user_id;
10090     l_gib.login_id       := fnd_global.conc_login_id;
10091     l_gib.request_id     := fnd_global.conc_request_id;
10092     l_gib.application_id := fnd_global.prog_appl_id;
10093     l_gib.program_id     := fnd_global.conc_program_id;
10094     l_gib.seq_move       := NVL(p_seq_move, WIP_CONSTANTS.NO);
10095   END IF; -- move is online
10096 
10097   /*Bug 13992087: Check if the job associated to any EZ Completion record is locked. If yes, then error that transaction*/
10098   wip_logger.log('Check to see if job associated to any EZ Completion WMTI record is locked', l_returnStatus);
10099   FOR l_jobs IN c_jobs LOOP
10100 	wip_logger.log('Looking at job id: ' || l_jobs.wip_entity_id || ' txn id: ' || l_jobs.txn_id || ' txn_type: ' || l_jobs.txn_type, l_returnStatus);
10101 	begin
10102 		select wip_entity_id into l_wip_entity_id
10103 		from wip_discrete_jobs
10104 		where wip_entity_id = l_jobs.wip_entity_id
10105 		for update nowait;
10106 		wip_logger.log('no lock existed for this job', l_returnStatus);
10107 	exception
10108 		when wip_constants.records_locked then
10109 			wip_logger.log('Job is locked', l_returnStatus);
10110 			IF(p_move_mode = WIP_CONSTANTS.BACKGROUND) THEN
10111 			  wip_logger.log('background mode is ON', l_returnStatus);
10112 			  /* Update process status to error */
10113 			  UPDATE wip_move_txn_interface
10114 				 SET process_status = WIP_CONSTANTS.ERROR
10115 			   WHERE group_id = p_group_id
10116 				 AND process_status = WIP_CONSTANTS.RUNNING
10117 				 AND transaction_id = l_jobs.txn_id;
10118 			  wip_logger.log('Updated WMTI record to error', l_returnStatus);
10119 
10120 			  select WIP_ENTITY_NAME into l_job_name from wip_entities where WIP_ENTITY_ID = l_jobs.wip_entity_id;
10121 			  fnd_message.set_name('WIP', 'WIP_WORK_ORDER_LOCKED');
10122 			  fnd_message.set_token('JOBNAME', l_job_name);
10123 			  l_errMsg := fnd_message.get;
10124 			  wip_logger.log(l_errMsg, l_returnStatus);
10125 			  /* insert error messages */
10126 			  INSERT INTO wip_txn_interface_errors
10127 			   (transaction_id,
10128 				error_column,
10129 				error_message,
10130 				last_update_date,
10131 				last_updated_by,
10132 				creation_date,
10133 				created_by,
10134 				last_update_login,
10135 				request_id,
10136 				program_application_id,
10137 				program_id,
10138 				program_update_date
10139 			   )
10140 			  SELECT wmti.transaction_id,
10141 					 NULL,                       -- error_column
10142 					 substrb(l_errMsg,1,240),    -- error_message
10143 					 SYSDATE,                    -- last_update_date
10144 					 l_gib.user_id,              -- last_update_by
10145 					 SYSDATE,                    -- creation_date
10146 					 l_gib.user_id,              -- created_by
10147 					 l_gib.login_id,
10148 					 l_gib.request_id,
10149 					 l_gib.application_id,
10150 					 l_gib.program_id,
10151 					 SYSDATE                     -- program_update_date
10152 				FROM wip_move_txn_interface wmti
10153 			   WHERE wmti.group_id = p_group_id
10154 				 AND transaction_id = l_jobs.txn_id;
10155 			  wip_logger.log('Inserted error message into WTIE', l_returnStatus);
10156 			END IF;
10157 	end;
10158   END LOOP;
10159   wip_logger.log('Completed the check for Jobs being locked', l_returnStatus);
10160   /*END 13992087*/
10161 
10162   IF(p_proc_phase = WIP_CONSTANTS.MOVE_VAL) THEN
10163     /*----------------+
10164      | Move Validation |
10165      +-----------------*/
10166     -- derive and validate all necessary info
10167     wip_move_validator.validate(p_group_id    => p_group_id,
10168                                 p_initMsgList => fnd_api.g_true);
10169 
10170     -- There is no return status from this routine. IF some record error out,
10171     -- just neglect it and continue validating other records. The error record
10172     -- will have process_status in WIP_MOVE_TXN_INTERFACE equal to (3) or
10173     -- WIP_CONSTANTS.ERROR, and those error records will not be picked up by
10174     -- move_txns. The error message also show up in WIP_TXN_INTERFACE_ERRORS
10175   END IF; -- Move Validation
10176 
10177   OPEN c_txn_date;
10178   LOOP
10179   BEGIN
10180     FETCH c_txn_date INTO l_gib.txn_date;
10181     EXIT WHEN c_txn_date%NOTFOUND;
10182     SAVEPOINT s_move_proc;
10183     IF(p_proc_phase = WIP_CONSTANTS.MOVE_VAL OR
10184        p_proc_phase = WIP_CONSTANTS.MOVE_PROC) THEN
10185 
10186       IF(p_move_mode = WIP_CONSTANTS.BACKGROUND) THEN
10187 
10188         SELECT SUM(DECODE(entity_type,
10189                      WIP_CONSTANTS.DISCRETE, 1,
10190                      WIP_CONSTANTS.LOTBASED, 1,
10191                    0)),
10192                SUM(DECODE(entity_type,WIP_CONSTANTS.REPETITIVE,1,0))
10193           INTO l_job,
10194                l_sche
10195           FROM wip_move_txn_interface wmti
10196          WHERE wmti.group_id = l_gib.group_id
10197            AND TRUNC(transaction_date)= TRUNC(l_gib.txn_date)
10198            AND process_phase = WIP_CONSTANTS.MOVE_PROC
10199            AND process_status = WIP_CONSTANTS.RUNNING;
10200 
10201         IF(l_job > 0 AND l_sche > 0) THEN
10202           l_gib.move_profile.jobTxn  := WIP_CONSTANTS.YES;
10203           l_gib.move_profile.scheTxn := WIP_CONSTANTS.YES;
10204         ELSIF(l_job > 0) THEN
10205           l_gib.move_profile.entity_type  := WIP_CONSTANTS.DISCRETE;
10206           l_gib.move_profile.jobTxn  := WIP_CONSTANTS.YES;
10207           l_gib.move_profile.scheTxn := WIP_CONSTANTS.NO;
10208         ELSIF(l_sche > 0) THEN
10209           l_gib.move_profile.entity_type  := WIP_CONSTANTS.REPETITIVE;
10210           l_gib.move_profile.jobTxn  := WIP_CONSTANTS.NO;
10211           l_gib.move_profile.scheTxn := WIP_CONSTANTS.YES;
10212         END IF; -- move profile check
10213         -- the others 6 parameters will be initialized in get_move_profile()
10214         -- rsrcItem, rsrcLot, poReqItem, poReqLot, easyComplete, easyReturn
10215       END IF; -- Background transactions
10216 
10217       /* get profile of this group of transactions */
10218       get_move_profile(p_gib          => l_gib,
10219                        x_returnStatus => x_returnStatus);
10220 
10221       IF(x_returnStatus <> fnd_api.g_ret_sts_success) THEN
10222         l_errMsg := 'wip_movProc_priv.get_move_profile failed';
10223         raise fnd_api.g_exc_unexpected_error;
10224       END IF; -- check return status
10225 
10226       -- check IF easy return txns
10227       IF(l_gib.move_profile.easyReturn = WIP_CONSTANTS.YES) THEN
10228         IF(p_insertAssy = fnd_api.g_true) THEN
10229           ez_completion(p_gib          => l_gib,
10230                         p_txn_type     => WIP_CONSTANTS.RET_TXN,
10231                         x_returnStatus => x_returnStatus);
10232 
10233           IF(x_returnStatus <> fnd_api.g_ret_sts_success) THEN
10234             l_errMsg := 'wip_movProc_priv.ez_completion (return) failed';
10235             raise fnd_api.g_exc_unexpected_error;
10236           END IF; -- check return status
10237         ELSE /* Bug fix 5026797 (base 4901865) - Assembly completion/return transaction through Discrete Workstation are
10238                 processed with p_insertAssy = fnd_api.g_false. Added the following call to snapshot
10239                 for assembly return transaction.*/
10240           snapshot_online(p_mtl_header_id => l_gib.assy_header_id,
10241                           p_org_id        => l_gib.move_profile.org_id,
10242                           p_txn_type      => WIP_CONSTANTS.RET_TXN,
10243                           p_txn_type_id   => WIP_CONSTANTS.RETASSY_TYPE,
10244                           p_txn_action_id => WIP_CONSTANTS.RETASSY_ACTION,
10245                           x_returnStatus  => x_returnStatus);
10246 
10247            IF(x_returnStatus <> fnd_api.g_ret_sts_success) THEN
10248               l_errMsg := 'wip_movProc_priv.snapshot_online (return) failed';
10249               raise fnd_api.g_exc_unexpected_error;
10250            END IF; -- check return status
10251         END IF; -- p_insertAssy = fnd_api.g_true
10252         /* End of bug fix 5026797 */
10253 
10254         IF(l_gib.assy_header_id IS NOT NULL AND
10255            l_gib.assy_header_id <> -1) THEN
10256           -- Process assembly return record
10257           wip_mtlTempProc_priv.processTemp
10258            (p_initMsgList   => fnd_api.g_true,
10259             p_txnHdrID      => l_gib.assy_header_id,
10260             p_txnMode       => WIP_CONSTANTS.ONLINE,
10261             x_returnStatus  => x_returnStatus,
10262             x_errorMsg      => l_errMsg);
10263 
10264           IF(x_returnStatus <> fnd_api.g_ret_sts_success) THEN
10265             fnd_message.set_name('FND', 'FND_GENERIC_MESSAGE');
10266             fnd_message.set_token('MESSAGE', l_errMsg);
10267             fnd_msg_pub.add;
10268             l_errMsg := 'wip_mtlTempProc_priv.processTemp failed' ;
10269             raise fnd_api.g_exc_unexpected_error;
10270           END IF;
10271           l_return_hdr_id := l_gib.assy_header_id;
10272           -- reset l_gib.assy_header_id to null
10273           l_gib.assy_header_id := null;
10274         END IF; -- check l_gib.assy_header_id
10275       END IF; -- easy return txn
10276 
10277       -- initialize scrap txns to be indeterminate
10278       l_gib.move_profile.scrapTxn := -1;
10279 
10280       -- call main move processor
10281       move_txns(p_gib          => l_gib,
10282                 x_returnStatus => x_returnStatus);
10283 
10284       IF(x_returnStatus <> fnd_api.g_ret_sts_success) THEN
10285         l_errMsg := 'wip_movProc_priv.move_txns failed';
10286         raise fnd_api.g_exc_unexpected_error;
10287       END IF; -- check return status
10288 
10289       -- check IF easy completion txns
10290       IF(l_gib.move_profile.easyComplete = WIP_CONSTANTS.YES) THEN
10291         IF( p_insertAssy = fnd_api.g_true) THEN
10292           ez_completion(p_gib          => l_gib,
10293                         p_txn_type     => WIP_CONSTANTS.COMP_TXN,
10294                         x_returnStatus => x_returnStatus);
10295 
10296           IF(x_returnStatus <> fnd_api.g_ret_sts_success) THEN
10297             l_errMsg := 'wip_movProc_priv.ez_completion (complete) failed';
10298             raise fnd_api.g_exc_unexpected_error;
10299           END IF; -- check return status
10300         ELSE /*  Bug fix 5026797 (base 4901865) - Assembly completion/return transaction through Discrete Workstation are
10301                 processed with p_insertAssy = fnd_api.g_false. Added the following call to snapshot for assembly completion transaction.*/
10302             snapshot_online(p_mtl_header_id => l_gib.assy_header_id,
10303                             p_org_id        => l_gib.move_profile.org_id,
10304                             p_txn_type      => WIP_CONSTANTS.COMP_TXN,
10305                             p_txn_type_id   => WIP_CONSTANTS.CPLASSY_TYPE,
10306                             p_txn_action_id => WIP_CONSTANTS.CPLASSY_ACTION,
10307                             x_returnStatus  => x_returnStatus);
10308 
10309            IF(x_returnStatus <> fnd_api.g_ret_sts_success) THEN
10310               l_errMsg := 'wip_movProc_priv.snapshot_online(complete) failed';
10311               raise fnd_api.g_exc_unexpected_error;
10312            END IF; -- check return status
10313         END IF; -- p_insertAssy = fnd_api.g_true
10314         /* End of bug fix 5026797 */
10315       END IF; -- easy complete txn
10316 
10317       -- update completed quantity and take snapshot before calling inventory
10318       -- to process aseembly completion record
10319       IF(l_gib.move_mode = WIP_CONSTANTS.BACKGROUND) THEN
10320         update_wo_and_snapshot(p_gib          => l_gib,
10321                                x_returnStatus => x_returnStatus);
10322         IF(x_returnStatus <> fnd_api.g_ret_sts_success) THEN
10323           l_errMsg := 'wip_movProc_priv.update_wo_and_snapshot';
10324           raise fnd_api.g_exc_unexpected_error;
10325         END IF; -- check return status
10326       END IF;
10327 
10328       /* call qualtiy to enable results */
10329       OPEN c_qa_id(p_txn_date => l_gib.txn_date);
10330       LOOP
10331         FETCH c_qa_id INTO l_qa_collection_id;
10332         EXIT WHEN c_qa_id%NOTFOUND;
10333 
10334         QA_RESULT_GRP.ENABLE(
10335                       p_api_version => 1.0,
10336                       p_init_msg_list => fnd_api.g_true,
10337                       p_commit => fnd_api.g_false,
10338                       p_validation_level => 0,
10339                       p_collection_id => l_qa_collection_id,
10340                       p_return_status => x_returnStatus,
10341                       p_msg_count => l_msgCount,
10342                       p_msg_data => l_errMsg);
10343 
10344         IF(x_returnStatus <> fnd_api.g_ret_sts_success) THEN
10345           fnd_message.set_name('FND', 'FND_GENERIC_MESSAGE');
10346           fnd_message.set_token('MESSAGE', l_errMsg);
10347           fnd_msg_pub.add;
10348           l_errMsg   := 'QA Failed. Collection ID:' || l_qa_collection_id;
10349           raise fnd_api.g_exc_unexpected_error;
10350         END IF;
10351       END LOOP; -- c_qa_id FETCH
10352 
10353       CLOSE c_qa_id; /* Bug 4204892 - Close the cursor c_qa_id to avoid ORA-6511. */
10354 
10355       IF (l_logLevel <= wip_constants.full_logging) THEN
10356         wip_logger.log(p_msg          => 'QA enable success',
10357                        x_returnStatus => l_returnStatus);
10358       END IF;
10359 
10360       UPDATE wip_move_txn_interface
10361          SET process_phase = WIP_CONSTANTS.BF_SETUP
10362        WHERE group_id = p_group_id
10363          AND process_phase = WIP_CONSTANTS.MOVE_PROC
10364          AND process_status = WIP_CONSTANTS.RUNNING
10365          AND TRUNC(transaction_date) = TRUNC(l_gib.txn_date);
10366 
10367       -- IF debug message level = 2, write statement below to log file
10368       IF (l_logLevel <= wip_constants.full_logging) THEN
10369         fnd_message.set_name('WIP', 'WIP_UPDATED_ROWS');
10370         fnd_message.set_token('ENTITY1', SQL%ROWCOUNT);
10371         fnd_message.set_token('ENTITY2', 'WIP_MOVE_TXN_INTERFACE');
10372         l_msg := fnd_message.get;
10373         wip_logger.log(p_msg          => l_msg,
10374                        x_returnStatus => l_returnStatus);
10375       END IF;
10376 
10377       IF(p_allow_partial_commit = WIP_CONSTANTS.YES) THEN
10378         IF(l_gib.assy_header_id IS NOT NULL AND
10379            l_gib.assy_header_id <> -1) THEN
10380           -- Update lock_flag to 'Y' to prevent inventory worker pick up these
10381           -- records. After we commit, assembly completion record will be in
10382           -- MMTT. There is a slim chance that inventory worker may pick up
10383           -- these records after we commit, and before we call processTemp.
10384           UPDATE mtl_material_transactions_temp
10385              SET lock_flag ='Y'
10386            WHERE transaction_header_id = l_gib.assy_header_id;
10387         END IF;
10388         -- Fixed bug 4361566. Commit to prevent dead lock from calling
10389         -- inventory TM mulitple times in the same commit cycle.
10390         COMMIT;
10391         IF(l_return_hdr_id IS NOT NULL AND l_return_hdr_id <> -1) THEN
10392           -- Release user lock on assembly return records per inventory
10393           -- request.
10394           inv_table_lock_pvt.release_locks(p_header_id => l_return_hdr_id);
10395         END IF;
10396         -- Set savepoint again because commit will clear savepoint.
10397         SAVEPOINT s_move_proc;
10398       END IF;
10399 
10400       -- Calling inventory to process assembly completion records.
10401       IF(l_gib.assy_header_id IS NOT NULL AND
10402          l_gib.assy_header_id <> -1) THEN
10403         -- Process assembly completion record
10404         wip_mtlTempProc_priv.processTemp
10405          (p_initMsgList   => fnd_api.g_true,
10406           p_txnHdrID      => l_gib.assy_header_id,
10407           p_txnMode       => WIP_CONSTANTS.ONLINE,
10408           x_returnStatus  => x_returnStatus,
10409           x_errorMsg      => l_errMsg);
10410 
10411         IF(x_returnStatus <> fnd_api.g_ret_sts_success) THEN
10412           fnd_message.set_name('FND', 'FND_GENERIC_MESSAGE');
10413           fnd_message.set_token('MESSAGE', l_errMsg);
10414           fnd_msg_pub.add;
10415           l_errMsg := 'wip_mtlTempProc_priv.processTemp failed' ;
10416           raise fnd_api.g_exc_unexpected_error;
10417         END IF;
10418       END IF; -- check l_gib.assy_header_id
10419 
10420       IF(p_allow_partial_commit = WIP_CONSTANTS.YES) THEN
10421         -- Fixed bug 4361566. Commit to prevent dead lock from calling
10422         -- inventory TM mulitple times in the same commit cycle.
10423         COMMIT;
10424         IF(l_gib.assy_header_id IS NOT NULL AND
10425            l_gib.assy_header_id <> -1) THEN
10426           -- Release user lock on assembly completion records per inventory
10427           -- request.
10428           inv_table_lock_pvt.release_locks(p_header_id => l_gib.assy_header_id);
10429         END IF;
10430         -- Set savepoint again because commit will clear savepoint.
10431         SAVEPOINT s_move_proc;
10432       END IF;
10433 
10434     END IF; -- Move Processing
10435 
10436     /* Backflush processing */
10437     IF(p_proc_phase = WIP_CONSTANTS.MOVE_VAL OR
10438        p_proc_phase = WIP_CONSTANTS.MOVE_PROC OR
10439        p_proc_phase = WIP_CONSTANTS.BF_SETUP) THEN
10440 
10441       IF(l_gib.bf_mode = WIP_CONSTANTS.ONLINE) THEN
10442         IF(p_do_backflush = fnd_api.g_true) THEN
10443           IF(l_gib.mtl_header_id IS NULL OR
10444              l_gib.mtl_header_id = -1) THEN
10445             SELECT mtl_material_transactions_s.nextval
10446               INTO l_gib.mtl_header_id
10447               FROM DUAL;
10448           END IF;
10449 
10450           -- backflush operation pull, and assembly pull for scrap.
10451           OPEN c_backflush(p_txn_date => l_gib.txn_date);
10452           LOOP
10453             FETCH c_backflush INTO l_backflush;
10454             EXIT WHEN c_backflush%NOTFOUND;
10455             BEGIN
10456               SAVEPOINT s_backflush_proc;
10457               /* Changes for bug 4916939 */
10458               -- Backflush assembly pull component for EZ Completion and
10459               -- EZ Return
10460               backflush_assy_pull(p_gib         => l_gib,
10461                                   p_move_txn_id => l_backflush.txn_id,
10462                                   p_entity_type => l_backflush.ent_type);
10463               /* End changes for bug 4916939 */
10464               -- Call OSFM new backflush API for OSFM job.
10465               IF(l_backflush.ent_type = WIP_CONSTANTS.LOTBASED) THEN
10466                 wsm_serial_support_grp.backflush_comp(
10467                   p_wipEntityID     => l_backflush.wip_id,
10468                   p_orgID           => l_backflush.org_id,
10469                   p_primaryQty      => l_backflush.primary_qty,
10470                   p_txnDate         => l_backflush.txn_date,
10471                   p_txnHdrID        => l_gib.mtl_header_id,
10472                   p_txnType         => l_backflush.txn_type,
10473                   p_fmOp            => l_backflush.fm_op,
10474                   p_fmStep          => l_backflush.fm_step,
10475                   p_toOp            => l_backflush.to_op,
10476                   p_toStep          => l_backflush.to_step,
10477                   p_movTxnID        => l_backflush.txn_id,
10478                   p_mtlTxnMode      => l_gib.mtl_mode,
10479                   p_reasonID        => l_backflush.reason_id,
10480                   p_reference       => l_backflush.reference,
10481                   p_init_msg_list   => fnd_api.g_true,
10482                   x_lotSerRequired  => l_ls_required,
10483                   x_returnStatus    => l_returnStatus,
10484                   x_error_msg       => l_error_msg,      -- throw away value
10485                   x_error_count     => l_error_count);   -- throw away value
10486 
10487                 IF(l_returnStatus <> fnd_api.g_ret_sts_success) THEN
10488                   l_errMsg := 'wsm_serial_support_grp.backflush_comp failed' ;
10489                   raise fnd_api.g_exc_unexpected_error;
10490                 ELSE
10491                   IF(l_ls_required = WIP_CONSTANTS.YES) THEN
10492                     -- If we need to gather more lot/serial, error out because
10493                     -- we cannot gather lot/serial for background transaction.
10494                     fnd_message.set_name('WIP', 'WIP_NO_LOT_SER_COMP_BKGND');
10495                     fnd_msg_pub.add;
10496                     raise fnd_api.g_exc_unexpected_error;
10497                   END IF;
10498                 END IF; -- check return status
10499               ELSE -- discrete job or repetitive schedule
10500                 wip_bflProc_priv.backflush(
10501                   p_wipEntityID     => l_backflush.wip_id,
10502                   p_orgID           => l_backflush.org_id,
10503                   p_primaryQty      => l_backflush.primary_qty,
10504                   p_txnDate         => l_backflush.txn_date,
10505                   p_txnHdrID        => l_gib.mtl_header_id,
10506         -- Fixed bug 5056289. Pass move_id as a batch_id because we want
10507         -- inventory to fail only components related to a specific move record.
10508                   p_batchID         => l_backflush.txn_id,
10509                   p_txnType         => l_backflush.txn_type,
10510                   p_entityType      => l_backflush.ent_type,
10511                   p_tblName         => WIP_CONSTANTS.MTI_TBL,
10512                   p_lineID          => l_backflush.line_id,
10513                   p_fmOp            => l_backflush.fm_op,
10514                   p_fmStep          => l_backflush.fm_step,
10515                   p_toOp            => l_backflush.to_op,
10516                   p_toStep          => l_backflush.to_step,
10517                   p_movTxnID        => l_backflush.txn_id,
10518                   p_fmMoveProcessor => WIP_CONSTANTS.YES,
10519                   p_mtlTxnMode      => l_gib.mtl_mode,
10520                   p_reasonID        => l_backflush.reason_id,
10521                   p_reference       => l_backflush.reference,
10522                   x_lotSerRequired  => l_ls_required,
10523                   x_bfRequired      => l_bf_required,
10524                   x_returnStatus    => l_returnStatus);
10525 
10526                 IF(l_returnStatus <> fnd_api.g_ret_sts_success) THEN
10527                   l_errMsg := 'wip_bflProc_priv.backflush failed' ;
10528                   raise fnd_api.g_exc_unexpected_error;
10529                 ELSE
10530                   IF(l_ls_required = WIP_CONSTANTS.YES) THEN
10531                    -- If we need to gather more lot/serial, error out because
10532                     -- we cannot gather lot/serial for background transaction.
10533                     fnd_message.set_name('WIP', 'WIP_NO_LOT_SER_COMP_BKGND');
10534                     fnd_msg_pub.add;
10535                     raise fnd_api.g_exc_unexpected_error;
10536                   END IF;
10537                 END IF; -- check return status
10538               END IF; -- check entity type
10539             EXCEPTION
10540               WHEN fnd_api.g_exc_unexpected_error THEN
10541                 ROLLBACK TO SAVEPOINT s_backflush_proc;
10542                 wip_utilities.get_message_stack(p_msg =>l_errMsg);
10543                 IF(l_errMsg IS NULL) THEN
10544                   -- initialize message to something because we cannot
10545                   -- insert null into WIP_TXN_INTERFACE_ERRORS
10546                   fnd_message.set_name('WIP', 'WIP_SOME_RECORDS_ERROR');
10547                   l_errMsg := fnd_message.get;
10548                 END IF;
10549                 IF(p_move_mode = WIP_CONSTANTS.BACKGROUND) THEN
10550                   /* Update process status to error */
10551                   UPDATE wip_move_txn_interface
10552                      SET process_status = WIP_CONSTANTS.ERROR
10553                    WHERE group_id = p_group_id
10554                      AND process_status = WIP_CONSTANTS.RUNNING
10555                      AND transaction_id = l_backflush.txn_id;
10556 
10557                   /* insert error messages */
10558                   INSERT INTO wip_txn_interface_errors
10559                    (transaction_id,
10560                     error_column,
10561                     error_message,
10562                     last_update_date,
10563                     last_updated_by,
10564                     creation_date,
10565                     created_by,
10566                     last_update_login,
10567                     request_id,
10568                     program_application_id,
10569                     program_id,
10570                     program_update_date
10571                    )
10572                   SELECT wmti.transaction_id,
10573                          NULL,                       -- error_column
10574                          substrb(l_errMsg,1,240),    -- error_message
10575                          SYSDATE,                    -- last_update_date
10576                          l_gib.user_id,              -- last_update_by
10577                          SYSDATE,                    -- creation_date
10578                          l_gib.user_id,              -- created_by
10579                          l_gib.login_id,
10580                          l_gib.request_id,
10581                          l_gib.application_id,
10582                          l_gib.program_id,
10583                          SYSDATE                     -- program_update_date
10584                     FROM wip_move_txn_interface wmti
10585                    WHERE wmti.group_id = p_group_id
10586                      AND transaction_id = l_backflush.txn_id;
10587 
10588                 ELSE -- move mode is online, write to log file
10589                   IF(x_returnStatus = fnd_api.g_ret_sts_error) THEN
10590                     -- let the user know that more lot/serial info required
10591                     x_returnStatus := fnd_api.g_ret_sts_error;
10592                   END IF;
10593                   IF (l_logLevel <= wip_constants.trace_logging) THEN
10594                     l_errMsg := 'move_txn_id: ' || l_backflush.txn_id ||
10595                                 ' failed because ' || l_errMsg;
10596                     wip_logger.log(p_msg          => l_errMsg,
10597                                    x_returnStatus => l_returnStatus);
10598                   END IF;
10599                 END IF;
10600             END;
10601           /* End of Changes for bug 4628893 */
10602           END LOOP; -- c_backflush
10603 
10604           CLOSE c_backflush; /* Bug 4204892 - Close the cursor c_backflush to avoid ORA-6511. */
10605 
10606           -- Move assembly pull and operation pull records from mti to mmtt
10607           -- pass fnd_api.g_false to p_addMsgToStack because we never used
10608           -- message stack for background transaction. Moreover, this will
10609           -- improve performance if there are lots of errors.
10610           wip_mtlTempProc_priv.validateInterfaceTxns(
10611             p_txnHdrID      => l_gib.mtl_header_id,
10612             p_addMsgToStack => fnd_api.g_false,
10613             p_rollbackOnErr => fnd_api.g_false,
10614             x_returnStatus  => x_returnStatus);
10615 
10616           IF(x_returnStatus <> fnd_api.g_ret_sts_success) THEN
10617             -- write error into WIP_TXN_INTERFACE_ERRORS
10618             write_mtl_errors(p_mtl_header_id => l_gib.mtl_header_id);
10619             IF (l_logLevel <= wip_constants.full_logging) THEN
10620               l_errMsg := 'wip_mtlTempProc_priv.validateInterfaceTxns failed'||
10621                           ' (component records)' ;
10622               wip_logger.log(p_msg          => l_errMsg,
10623                              x_returnStatus => l_returnStatus);
10624             END IF;
10625             -- Fixed bug 5056289. We will not raise exception because we still
10626             -- want to process the components that pass validation.
10627             -- raise fnd_api.g_exc_unexpected_error;
10628 
10629             -- Call component_cleanup to set the status of corresponding move
10630             -- records to error and delete error records from MTI and MTLI.
10631             component_cleanup(p_mtl_header_id => l_gib.mtl_header_id,
10632                               p_group_id      => p_group_id);
10633 
10634           END IF;
10635         END IF; -- p_do_backflush
10636       /*---------------------+
10637        | Inventory processing |
10638        +---------------------*/
10639         SELECT count(*)
10640             INTO l_MMTT_record
10641             FROM mtl_material_transactions_temp
10642            WHERE transaction_header_id = l_gib.mtl_header_id;
10643 
10644         IF(l_MMTT_record > 0 AND
10645            l_gib.mtl_mode <> WIP_CONSTANTS.NO_PROCESSING) THEN
10646           -- Call material processor to process backflush components, and
10647           -- scrap assembly.
10648           wip_mtlTempProc_priv.processTemp
10649            (p_initMsgList   => fnd_api.g_true,
10650             p_txnHdrID      => l_gib.mtl_header_id,
10651             p_txnMode       => l_gib.mtl_mode,
10652             x_returnStatus  => x_returnStatus,
10653             x_errorMsg      => l_errMsg);
10654 
10655           IF(x_returnStatus <> fnd_api.g_ret_sts_success) THEN
10656             fnd_message.set_name('FND', 'FND_GENERIC_MESSAGE');
10657             fnd_message.set_token('MESSAGE', l_errMsg);
10658             fnd_msg_pub.add;
10659             l_errMsg := 'wip_mtlTempProc_priv.processTemp failed' ;
10660             raise fnd_api.g_exc_unexpected_error;
10661           END IF;
10662         END IF; -- there is the records in MMTT with this header_id
10663       ELSE -- backflush is background
10664         UPDATE wip_move_txn_interface
10665            SET group_id = NULL,
10666                process_phase = WIP_CONSTANTS.BF_SETUP,
10667                process_status = WIP_CONSTANTS.PENDING
10668          WHERE group_id = p_group_id
10669            AND process_status = WIP_CONSTANTS.RUNNING;
10670       END IF; -- backflush is online
10671     END IF; -- Backflush Setup
10672 
10673     IF(p_allow_partial_commit = WIP_CONSTANTS.YES) THEN
10674       -- Fixed bug 4361566. Commit to prevent dead lock from calling
10675       -- inventory TM mulitple times in the same commit cycle.
10676       COMMIT;
10677       IF(l_MMTT_record > 0 AND
10678          l_gib.mtl_mode <> WIP_CONSTANTS.NO_PROCESSING) THEN
10679         -- Release user lock on backflush records per inventory request.
10680         inv_table_lock_pvt.release_locks(p_header_id => l_gib.mtl_header_id);
10681       END IF;
10682       -- Set savepoint again because commit will clear savepoint.
10683       SAVEPOINT s_move_proc;
10684     END IF;
10685 
10686     -- initialize transaction_header_id for each group on each day
10687     l_gib.mtl_header_id := -1;
10688 
10689   EXCEPTION
10690 
10691     WHEN fnd_api.g_exc_unexpected_error THEN
10692 
10693       IF(p_move_mode = WIP_CONSTANTS.BACKGROUND) THEN
10694 
10695         ROLLBACK TO SAVEPOINT s_move_proc;
10696         /*Fix for bug 8473023(FP 8358813)*/
10697         /*Update the lock_flag in MMTT to be 'N' if failed in Move Processing Phase*/
10698         clean_up(p_assy_header_id => l_gib.assy_header_id);
10699 
10700         /* Update process status to error */
10701         UPDATE wip_move_txn_interface
10702            SET process_status = WIP_CONSTANTS.ERROR
10703          WHERE group_id = p_group_id
10704            AND process_status = WIP_CONSTANTS.RUNNING
10705            AND TRUNC(transaction_date)= TRUNC(l_gib.txn_date);
10706 
10707         wip_utilities.get_message_stack(p_msg =>l_errMsg);
10708         IF(l_errMsg IS NULL) THEN
10709           -- initialize message to something because we cannot insert null
10710           -- into WIP_TXN_INTERFACE_ERRORS
10711           fnd_message.set_name('WIP', 'WIP_SOME_RECORDS_ERROR');
10712           l_errMsg := fnd_message.get;
10713         END IF;
10714 
10715         /* insert error messages */
10716         INSERT INTO wip_txn_interface_errors
10717           (transaction_id,
10718            error_column,
10719            error_message,
10720            last_update_date,
10721            last_updated_by,
10722            creation_date,
10723            created_by,
10724            last_update_login,
10725            request_id,
10726            program_application_id,
10727            program_id,
10728            program_update_date
10729           )
10730           SELECT wmti.transaction_id,
10731                  NULL,                       -- error_column
10732                  substrb(l_errMsg,1,240),    -- error_message
10733                  SYSDATE,                    -- last_update_date
10734                  l_gib.user_id,              -- last_update_by
10735                  SYSDATE,                    -- creation_date
10736                  l_gib.user_id,              -- created_by
10737                  l_gib.login_id,
10738                  l_gib.request_id,
10739                  l_gib.application_id,
10740                  l_gib.program_id,
10741                  SYSDATE                     -- program_update_date
10742             FROM wip_move_txn_interface wmti
10743            WHERE wmti.group_id = p_group_id
10744              AND TRUNC(wmti.transaction_date) = TRUNC(l_gib.txn_date)
10745              AND NOT EXISTS (SELECT 1
10746                                FROM wip_txn_interface_errors wtie
10747                               WHERE wtie.transaction_id = wmti.transaction_id);
10748 
10749       ELSE -- move mode is online, write to log file
10750         IF(x_returnStatus = fnd_api.g_ret_sts_error) THEN
10751           -- let the user know that more lot/serial info required
10752           x_returnStatus := fnd_api.g_ret_sts_error;
10753         ELSE
10754            ROLLBACK TO SAVEPOINT s_move_proc;
10755            x_returnStatus := fnd_api.g_ret_sts_unexp_error;
10756         END IF;
10757         IF (l_logLevel <= wip_constants.trace_logging) THEN
10758           wip_logger.exitPoint(p_procName =>'wip_movProc_priv.processIntf',
10759                                p_procReturnStatus => x_returnStatus,
10760                                p_msg => l_errMsg,
10761                                x_returnStatus => l_returnStatus);
10762         END IF;
10763         -- close log file
10764         IF (p_ENDDebug = fnd_api.g_true) THEN
10765           wip_logger.cleanUp(x_returnStatus => l_returnStatus);
10766         END IF;
10767         GOTO END_program;
10768       END IF; -- move mode is background
10769 
10770     WHEN others THEN
10771       ROLLBACK TO SAVEPOINT s_move_proc;
10772       IF(p_move_mode = WIP_CONSTANTS.BACKGROUND) THEN
10773 
10774          /* Update process status to error */
10775         UPDATE wip_move_txn_interface
10776            SET process_status = WIP_CONSTANTS.ERROR
10777          WHERE group_id = p_group_id
10778            AND process_status = WIP_CONSTANTS.RUNNING
10779            AND TRUNC(transaction_date)= TRUNC(l_gib.txn_date);
10780 
10781         l_errMsg := 'unexpected error: ' || SQLERRM;
10782 
10783         /* insert error messages */
10784         INSERT INTO wip_txn_interface_errors
10785           (transaction_id,
10786            error_column,
10787            error_message,
10788            last_update_date,
10789            last_updated_by,
10790            creation_date,
10791            created_by,
10792            last_update_login,
10793            request_id,
10794            program_application_id,
10795            program_id,
10796            program_update_date
10797           )
10798           SELECT wmti.transaction_id,
10799                  NULL,                       -- error_column
10800                  substrb(l_errMsg,1,240),    -- error_message
10801                  SYSDATE,                    -- last_update_date
10802                  l_gib.user_id,              -- last_update_by
10803                  SYSDATE,                    -- creation_date
10804                  l_gib.user_id,              -- created_by
10805                  l_gib.login_id,
10806                  l_gib.request_id,
10807                  l_gib.application_id,
10808                  l_gib.program_id,
10809                  SYSDATE                     -- program_update_date
10810             FROM wip_move_txn_interface wmti
10811            WHERE wmti.group_id = p_group_id
10812              AND TRUNC(wmti.transaction_date) = TRUNC(l_gib.txn_date)
10813              AND NOT EXISTS (SELECT 1
10814                                FROM wip_txn_interface_errors wtie
10815                               WHERE wtie.transaction_id = wmti.transaction_id);
10816       ELSE -- move mode is online
10817         x_returnStatus := fnd_api.g_ret_sts_unexp_error;
10818         IF (l_logLevel <= wip_constants.trace_logging) THEN
10819           wip_logger.exitPoint(p_procName=>'wip_movProc_priv.processIntf',
10820                            p_procReturnStatus => x_returnStatus,
10821                            p_msg => 'unexpected error: ' || SQLERRM,
10822                            x_returnStatus => l_returnStatus);
10823         END IF;
10824         -- close log file
10825         IF (p_ENDDebug = fnd_api.g_true) THEN
10826           wip_logger.cleanUp(x_returnStatus => l_returnStatus);
10827         END IF;
10828         GOTO END_program;
10829       END IF; -- move mode is background
10830   END;
10831 
10832   END LOOP; -- c_txn_date FETCH
10833   /*---------------------------------------------------------------------+
10834    | Set group_mark_id to wip_entity_id for Return and Move transactions |
10835    +---------------------------------------------------------------------*/
10836   UPDATE mtl_serial_numbers msn1
10837      SET msn1.group_mark_id = msn1.wip_entity_id
10838    WHERE msn1.gen_object_id =
10839          (SELECT msn2.gen_object_id
10840             FROM wip_move_txn_interface wmti,
10841                  wip_serial_move_interface wsmi,
10842                  mtl_serial_numbers msn2
10843            WHERE wmti.transaction_id = wsmi.transaction_id
10844              AND wsmi.assembly_serial_number = msn2.serial_number
10845              AND wmti.primary_item_id = msn2.inventory_item_id
10846              AND wmti.organization_id = msn2.current_organization_id
10847              AND wmti.wip_entity_id = msn2.wip_entity_id
10848              AND msn2.group_mark_id IS NULL
10849              AND wmti.group_id = p_group_id
10850              AND wmti.process_phase = WIP_CONSTANTS.BF_SETUP
10851              AND wmti.process_status = WIP_CONSTANTS.RUNNING
10852              AND wmti.transaction_type = WIP_CONSTANTS.RET_TXN);
10853 
10854   /*--------------------------------------+
10855    | Delete serial move interface records |
10856    +--------------------------------------*/
10857   DELETE FROM wip_serial_move_interface
10858   WHERE transaction_id IN
10859        (SELECT transaction_id
10860           FROM wip_move_txn_interface
10861          WHERE group_id = p_group_id
10862            AND process_phase = WIP_CONSTANTS.BF_SETUP
10863            AND process_status = WIP_CONSTANTS.RUNNING);
10864 
10865   /*-------------------------------+
10866    | Delete move interface records |
10867    +-------------------------------*/
10868   DELETE FROM wip_move_txn_interface
10869   WHERE group_id = p_group_id
10870     AND process_phase = WIP_CONSTANTS.BF_SETUP
10871     AND process_status = WIP_CONSTANTS.RUNNING;
10872 
10873   /*--------------------------------+
10874    |  check for failed transactions |
10875    +--------------------------------*/
10876   SELECT COUNT(1)
10877     INTO l_err_record
10878     FROM WIP_MOVE_TXN_INTERFACE
10879    WHERE GROUP_ID = p_group_id
10880      AND process_status in (WIP_CONSTANTS.ERROR, WIP_CONSTANTS.RUNNING);
10881 
10882   IF(l_err_record > 0) THEN
10883     /*===========================================================*/
10884     /*  transactions in current group left in interface table -  */
10885     /*  worker exit with warning signal                          */
10886     /*===========================================================*/
10887     x_returnStatus := fnd_api.g_ret_sts_unexp_error;
10888     -- Fixed bug 5355443. We should not always put WIP_SOME_RECORDS_ERROR in
10889     -- the message stack because this API will be called for both online and
10890     -- background transaction. However, WIP_SOME_RECORDS_ERROR is only
10891     -- applicable for background transaction.
10892     --fnd_message.set_name('WIP', 'WIP_SOME_RECORDS_ERROR');
10893     --fnd_msg_pub.add;
10894     IF (l_logLevel <= wip_constants.trace_logging) THEN
10895       wip_logger.exitPoint(p_procName => 'wip_movProc_priv.processIntf',
10896                            p_procReturnStatus => x_returnStatus,
10897                            p_msg => 'some records error out',
10898                            x_returnStatus => l_returnStatus);
10899     END IF;
10900     -- close log file
10901     IF (p_ENDDebug = fnd_api.g_true) THEN
10902       wip_logger.cleanUp(x_returnStatus => l_returnStatus);
10903     END IF;
10904     /*Bug 5727221 (FP of 5580093): Mobile WIP Transaction seems to be leaving
10905       transaction in WMTI in some exception case. However there is no error
10906       message propagated back to UI. As a result transaction goes through fine
10907       with no UI error but record remains in WMTI. x_returnStatus is changed
10908       to sucess by cleanup procedure after closing file . Hence repopulate
10909       x_returnStatus to error  again  */
10910     x_returnStatus := fnd_api.g_ret_sts_unexp_error;
10911   ELSE
10912     x_returnStatus := fnd_api.g_ret_sts_success;
10913     IF (l_logLevel <= wip_constants.trace_logging) THEN
10914       wip_logger.exitPoint(p_procName => 'wip_movProc_priv.processIntf',
10915                            p_procReturnStatus => x_returnStatus,
10916                            p_msg => 'no record in this group error out',
10917                            x_returnStatus => l_returnStatus);
10918     END IF;
10919     -- close log file
10920     IF (p_ENDDebug = fnd_api.g_true) THEN
10921       wip_logger.cleanUp(x_returnStatus => l_returnStatus);
10922     END IF;
10923   END IF;
10924 
10925 <<END_program>>
10926   IF(c_backflush%ISOPEN) THEN
10927     CLOSE c_backflush;
10928   END IF;
10929   IF (c_qa_id%ISOPEN) THEN
10930     CLOSE c_qa_id;
10931   END IF;
10932   IF (c_txn_date%ISOPEN) THEN
10933     CLOSE c_txn_date;
10934   END IF;
10935 END processIntf;
10936 
10937 PROCEDURE move_worker(errbuf       OUT NOCOPY VARCHAR2,
10938                       retcode      OUT NOCOPY NUMBER,
10939                       p_group_id   IN         NUMBER,
10940                       p_proc_phase IN         NUMBER,
10941                       p_time_out   IN         NUMBER,
10942                       p_seq_move   IN         NUMBER) IS
10943 
10944 l_returnStatus VARCHAR2(1);
10945 BEGIN
10946   retcode := 0; -- success
10947   /* Set process phase to 'Running' */
10948   UPDATE wip_move_txn_interface
10949      SET process_status = WIP_CONSTANTS.RUNNING,
10950          last_update_date = SYSDATE,
10951          last_update_login = fnd_global.conc_login_id,
10952          request_id = fnd_global.conc_request_id,
10953          program_application_id = fnd_global.prog_appl_id,
10954          program_id = fnd_global.conc_program_id,
10955          program_update_date = SYSDATE
10956    WHERE group_id = p_group_id;
10957 
10958    -- Fixed bug 4361566. Set global variable to let inventory know that they
10959    -- should not delete lock record from their temp table. These lock records
10960    -- will be deleted when wip call inv_table_lock_pvt.release_locks.
10961    WIP_CONSTANTS.WIP_MOVE_WORKER := 'Y';
10962 
10963    wip_movProc_priv.processIntf
10964     (p_group_id             => p_group_id,
10965      p_proc_phase           => p_proc_phase,
10966      p_time_out             => p_time_out,
10967      p_move_mode            => WIP_CONSTANTS.BACKGROUND,
10968      p_bf_mode              => WIP_CONSTANTS.ONLINE,
10969      p_mtl_mode             => WIP_CONSTANTS.ONLINE,
10970      p_endDebug             => FND_API.G_TRUE,
10971      p_initMsgList          => FND_API.G_TRUE,
10972      p_insertAssy           => FND_API.G_TRUE,
10973      p_do_backflush         => FND_API.G_TRUE,
10974      p_seq_move             => p_seq_move,
10975      p_allow_partial_commit => WIP_CONSTANTS.YES, -- Fixed bug 4361566.
10976      x_returnStatus         => l_returnStatus);
10977 
10978    -- Fixed bug 4361566. Reset global variable WIP_MOVE_WORKER to its original
10979    -- value.
10980    WIP_CONSTANTS.WIP_MOVE_WORKER := 'N';
10981 
10982    IF(l_returnStatus <> fnd_api.g_ret_sts_success) THEN
10983      retcode := 2; -- error
10984      -- Fixed bug 5355443. Since WIP_SOME_RECORDS_ERROR message is only
10985      -- applicable to background transaction, we should set error message here
10986      -- instead of wip_movProc_priv.processIntf().
10987      --wip_utilities.get_message_stack(p_msg =>errbuf);
10988      fnd_message.set_name('WIP', 'WIP_SOME_RECORDS_ERROR');
10989      errbuf := fnd_message.get;
10990    END IF;
10991    COMMIT; -- To prevent Move Worker concurrent program rollback.
10992 EXCEPTION
10993   WHEN others THEN
10994     retcode := 2; -- error
10995     errbuf := SQLERRM;
10996 END move_worker;
10997 
10998 PROCEDURE repetitive_scrap(p_tmp_id       IN         NUMBER,
10999                            x_returnStatus OUT NOCOPY VARCHAR2) IS
11000 
11001 l_params       wip_logger.param_tbl_t;
11002 l_returnStatus VARCHAR2(1);
11003 l_msg          VARCHAR(240);
11004 l_logLevel     NUMBER := fnd_log.g_current_runtime_level;
11005 BEGIN
11006   -- write parameter value to log file
11007   IF (l_logLevel <= wip_constants.trace_logging) THEN
11008     l_params(1).paramName   := 'p_tmp_id';
11009     l_params(1).paramValue  :=  p_tmp_id;
11010     wip_logger.entryPoint(p_procName => 'wip_movProc_priv.repetitive_scrap',
11011                           p_params   => l_params,
11012                           x_returnStatus => l_returnStatus);
11013   END IF;
11014   -- insert into mtl_material_txn_allocations for repetitive schedule
11015   INSERT INTO mtl_material_txn_allocations
11016      (transaction_id,
11017       repetitive_schedule_id,
11018       organization_id,
11019       last_update_date,
11020       last_updated_by,
11021       creation_date,
11022       created_by,
11023       last_update_login,
11024       request_id,
11025       program_application_id,
11026       program_id,
11027       program_update_date,
11028       primary_quantity,
11029       transaction_quantity,
11030       transaction_date
11031      )
11032      SELECT mmtt.material_allocation_temp_id,  -- transaction_id
11033             wmta.repetitive_schedule_id,
11034             wmta.organization_id,
11035             SYSDATE,                           -- last_update_date
11036             wmta.last_updated_by,
11037             SYSDATE,                           -- creation_date
11038             wmta.created_by,
11039             wmta.last_update_login,
11040             wmta.request_id,
11041             wmta.program_application_id,
11042             wmta.program_id,
11043             wmta.program_update_date,
11044             wmta.primary_quantity *
11045               sign(mmtt.primary_quantity),     -- primary_quantity
11046             wmta.transaction_quantity *
11047               sign(mmtt.transaction_quantity), -- transaction_quantity
11048             wmti.transaction_date
11049        FROM wip_move_txn_allocations wmta,
11050             wip_move_txn_interface wmti,
11051             mtl_material_transactions_temp mmtt
11052       WHERE wmti.transaction_id = wmta.transaction_id
11053         AND wmti.organization_id = wmta.organization_id
11054         AND wmti.transaction_id = mmtt.move_transaction_id
11055         AND mmtt.transaction_temp_id = p_tmp_id
11056         AND mmtt.transaction_action_id = WIP_CONSTANTS.SCRASSY_ACTION;
11057 
11058   -- IF debug message level = 2, write statement below to log file
11059   IF (l_logLevel <= wip_constants.full_logging) THEN
11060     fnd_message.set_name('WIP', 'WIP_INSERTED_ROWS');
11061     fnd_message.set_token('ENTITY1', SQL%ROWCOUNT);
11062     fnd_message.set_token('ENTITY2', 'MTL_MATERIAL_TXN_ALLOCATIONS');
11063     l_msg := fnd_message.get;
11064     wip_logger.log(p_msg          => l_msg,
11065                    x_returnStatus => l_returnStatus);
11066   END IF;
11067   x_returnStatus := fnd_api.g_ret_sts_success;
11068 
11069 EXCEPTION
11070   WHEN others THEN
11071     x_returnStatus := fnd_api.g_ret_sts_unexp_error;
11072     l_msg := 'unexpected error: ' || SQLERRM || 'SQLCODE = ' || SQLCODE;
11073 
11074     IF (l_logLevel <= wip_constants.trace_logging) THEN
11075       wip_logger.exitPoint(p_procName=>'wip_movProc_priv.repetitive_scrap',
11076                            p_procReturnStatus => x_returnStatus,
11077                            p_msg => l_msg,
11078                            x_returnStatus => l_returnStatus);
11079     END IF;
11080     fnd_message.set_name('FND', 'FND_GENERIC_MESSAGE');
11081     fnd_message.set_token('MESSAGE', l_msg);
11082     fnd_msg_pub.add;
11083 END repetitive_scrap;
11084 
11085 /*****************************************************************************
11086  * This procedure will be used by WIP OA Transaction page to insert record
11087  * into WIP_MOVE_TXN_INTERFACE.
11088  ****************************************************************************/
11089 PROCEDURE insert_record(p_transaction_id                 IN NUMBER,
11090                         p_last_update_date               IN DATE,
11091                         p_last_updated_by                IN NUMBER,
11092                         p_last_updated_by_name           IN VARCHAR2,
11093                         p_creation_date                  IN DATE,
11094                         p_created_by                     IN NUMBER,
11095                         p_created_by_name                IN VARCHAR2,
11096                         p_last_update_login              IN NUMBER,
11097                         p_request_id                     IN NUMBER,
11098                         p_program_application_id         IN NUMBER,
11099                         p_program_id                     IN NUMBER,
11100                         p_program_update_date            IN DATE,
11101                         p_group_id                       IN NUMBER,
11102                         p_source_code                    IN VARCHAR2,
11103                         p_source_line_id                 IN NUMBER,
11104                         p_process_phase                  IN NUMBER,
11105                         p_process_status                 IN NUMBER,
11106                         p_transaction_type               IN NUMBER,
11107                         p_organization_id                IN NUMBER,
11108                         p_organization_code              IN VARCHAR2,
11109                         p_wip_entity_id                  IN NUMBER,
11110                         p_wip_entity_name                IN VARCHAR2,
11111                         p_entity_type                    IN NUMBER,
11112                         p_primary_item_id                IN NUMBER,
11113                         p_line_id                        IN NUMBER,
11114                         p_line_code                      IN VARCHAR2,
11115                         p_repetitive_schedule_id         IN NUMBER,
11116                         p_transaction_date               IN DATE,
11117                         p_acct_period_id                 IN NUMBER,
11118                         p_fm_operation_seq_num           IN NUMBER,
11119                         p_fm_operation_code              IN VARCHAR2,
11120                         p_fm_department_id               IN NUMBER,
11121                         p_fm_department_code             IN VARCHAR2,
11122                         p_fm_intraoperation_step_type    IN NUMBER,
11123                         p_to_operation_seq_num           IN NUMBER,
11124                         p_to_operation_code              IN VARCHAR2,
11125                         p_to_department_id               IN NUMBER,
11126                         p_to_department_code             IN VARCHAR2,
11127                         p_to_intraoperation_step_type    IN NUMBER,
11128                         p_transaction_quantity           IN NUMBER,
11129                         p_transaction_uom                IN VARCHAR2,
11130                         p_primary_quantity               IN NUMBER,
11131                         p_primary_uom                    IN VARCHAR2,
11132                         p_scrap_account_id               IN NUMBER,
11133                         p_reason_id                      IN NUMBER,
11134                         p_reason_name                    IN VARCHAR2,
11135                         p_reference                      IN VARCHAR2,
11136                         p_attribute_category             IN VARCHAR2,
11137                         p_attribute1                     IN VARCHAR2,
11138                         p_attribute2                     IN VARCHAR2,
11139                         p_attribute3                     IN VARCHAR2,
11140                         p_attribute4                     IN VARCHAR2,
11141                         p_attribute5                     IN VARCHAR2,
11142                         p_attribute6                     IN VARCHAR2,
11143                         p_attribute7                     IN VARCHAR2,
11144                         p_attribute8                     IN VARCHAR2,
11145                         p_attribute9                     IN VARCHAR2,
11146                         p_attribute10                    IN VARCHAR2,
11147                         p_attribute11                    IN VARCHAR2,
11148                         p_attribute12                    IN VARCHAR2,
11149                         p_attribute13                    IN VARCHAR2,
11150                         p_attribute14                    IN VARCHAR2,
11151                         p_attribute15                    IN VARCHAR2,
11152                         p_qa_collection_id               IN NUMBER,
11153                         p_kanban_card_id                 IN NUMBER,
11154                         p_oc_transaction_qty             IN NUMBER,
11155                         p_oc_primary_qty                 IN NUMBER,
11156                         p_oc_transaction_id              IN NUMBER,
11157                         p_xml_document_id                IN VARCHAR2,
11158                         p_processing_order               IN NUMBER,
11159                         p_batch_id                       IN NUMBER,
11160                         p_employee_id                    IN NUMBER,
11161                         p_completed_instructions         IN NUMBER) IS
11162 BEGIN
11163   INSERT INTO wip_move_txn_interface
11164     (transaction_id,
11165      last_update_date,
11166      last_updated_by,
11167      last_updated_by_name,
11168      creation_date,
11169      created_by,
11170      created_by_name,
11171      last_update_login,
11172      request_id,
11173      program_application_id,
11174      program_id,
11175      program_update_date,
11176      group_id,
11177      source_code,
11178      source_line_id,
11179      process_phase,
11180      process_status,
11181      transaction_type,
11182      organization_id,
11183      organization_code,
11184      wip_entity_id,
11185      wip_entity_name,
11186      entity_type,
11187      primary_item_id,
11188      line_id,
11189      line_code,
11190      repetitive_schedule_id,
11191      transaction_date,
11192      acct_period_id,
11193      fm_operation_seq_num,
11194      fm_operation_code,
11195      fm_department_id,
11196      fm_department_code,
11197      fm_intraoperation_step_type,
11198      to_operation_seq_num,
11199      to_operation_code,
11200      to_department_id,
11201      to_department_code,
11202      to_intraoperation_step_type,
11203      transaction_quantity,
11204      transaction_uom,
11205      primary_quantity,
11206      primary_uom,
11207      scrap_account_id,
11208      reason_id,
11209      reason_name,
11210      reference,
11211      attribute_category,
11212      attribute1,
11213      attribute2,
11214      attribute3,
11215      attribute4,
11216      attribute5,
11217      attribute6,
11218      attribute7,
11219      attribute8,
11220      attribute9,
11221      attribute10,
11222      attribute11,
11223      attribute12,
11224      attribute13,
11225      attribute14,
11226      attribute15,
11227      qa_collection_id,
11228      kanban_card_id,
11229      overcompletion_transaction_qty,
11230      overcompletion_primary_qty,
11231      overcompletion_transaction_id,
11232      xml_document_id,
11233      processing_order,
11234      batch_id,
11235      employee_id,
11236      completed_instructions)
11237    VALUES
11238     (p_transaction_id,
11239      p_last_update_date,
11240      p_last_updated_by,
11241      p_last_updated_by_name,
11242      p_creation_date,
11243      p_created_by,
11244      p_created_by_name,
11245      p_last_update_login,
11246      p_request_id,
11247      p_program_application_id,
11248      p_program_id,
11249      p_program_update_date,
11250      p_group_id,
11251      p_source_code,
11252      p_source_line_id,
11253      p_process_phase,
11254      p_process_status,
11255      p_transaction_type,
11256      p_organization_id,
11257      p_organization_code,
11258      p_wip_entity_id,
11259      p_wip_entity_name,
11260      p_entity_type,
11261      p_primary_item_id,
11262      p_line_id,
11263      p_line_code,
11264      p_repetitive_schedule_id,
11265      p_transaction_date,
11266      p_acct_period_id,
11267      p_fm_operation_seq_num,
11268      p_fm_operation_code,
11269      p_fm_department_id,
11270      p_fm_department_code,
11271      p_fm_intraoperation_step_type,
11272      p_to_operation_seq_num,
11273      p_to_operation_code,
11274      p_to_department_id,
11275      p_to_department_code,
11276      p_to_intraoperation_step_type,
11277      p_transaction_quantity,
11278      p_transaction_uom,
11279      p_primary_quantity,
11280      p_primary_uom,
11281      p_scrap_account_id,
11282      p_reason_id,
11283      p_reason_name,
11284      p_reference,
11285      p_attribute_category,
11286      p_attribute1,
11287      p_attribute2,
11288      p_attribute3,
11289      p_attribute4,
11290      p_attribute5,
11291      p_attribute6,
11292      p_attribute7,
11293      p_attribute8,
11294      p_attribute9,
11295      p_attribute10,
11296      p_attribute11,
11297      p_attribute12,
11298      p_attribute13,
11299      p_attribute14,
11300      p_attribute15,
11301      p_qa_collection_id,
11302      p_kanban_card_id,
11303      p_oc_transaction_qty,
11304      p_oc_primary_qty,
11305      p_oc_transaction_id,
11306      p_xml_document_id,
11307      p_processing_order,
11308      p_batch_id,
11309      p_employee_id,
11310      p_completed_instructions);
11311 
11312 END insert_record;
11313 
11314 PROCEDURE processOATxn(p_group_id         IN        NUMBER,
11315                        p_child_txn_id     IN        NUMBER,
11316                        p_mtl_header_id    IN        NUMBER,
11317                        p_do_backflush     IN        VARCHAR2,
11318                        p_assySerial       IN        VARCHAR2:= NULL,
11319 		                   p_print_label      IN        NUMBER default null, /* VJ Label Printing */
11320                        p_print_cmpl_label IN        NUMBER default null, /*Bug 13103060 print completion label for ez completion*/
11321                        x_returnStatus     OUT NOCOPY VARCHAR2) IS
11322 
11323 CURSOR c_errors IS
11324   SELECT wtie.error_column,
11325          wtie.error_message
11326     FROM wip_txn_interface_errors wtie,
11327          wip_move_txn_interface wmti
11328    WHERE wtie.transaction_id = wmti.transaction_id
11329      AND wmti.group_id = p_group_id;
11330 
11331 CURSOR c_move_records IS
11332   SELECT wmt.wip_entity_id wip_id,
11333          wmt.fm_operation_seq_num fm_op,
11334          wmt.to_operation_seq_num to_op
11335     FROM wip_move_transactions wmt
11336    WHERE wmt.transaction_id = p_group_id;
11337 
11338 l_log_level     NUMBER := fnd_log.g_current_runtime_level;
11339 l_error_msg     VARCHAR2(1000);
11340 l_mti_lot_rec   NUMBER;
11341 l_process_phase VARCHAR2(3);
11342 l_return_status VARCHAR(1);
11343 l_errors        c_errors%ROWTYPE;
11344 l_move_records  c_move_records%ROWTYPE;
11345 l_params        wip_logger.param_tbl_t;
11346 l_msg_count     NUMBER; /* VJ Label Printing */
11347 l_msg_stack     VARCHAR2(2000); /* VJ Label Printing */
11348 L_LABEL_STATUS  varchar2(1); /*Bug 13103060 print completion label for ez completion*/
11349 l_msg           VARCHAR2(2000);
11350 BEGIN
11351 
11352   /* Fix for bug 5518780. Initialize msg stack here instead of exception handler
11353      so that messages from INV are not deleted */
11354   fnd_msg_pub.initialize;
11355 
11356   l_process_phase := '1';
11357   IF (l_log_level <= wip_constants.trace_logging) THEN
11358     l_params(1).paramName   := 'p_group_id';
11359     l_params(1).paramValue  :=  p_group_id;
11360     l_params(2).paramName   := 'p_child_txn_id';
11361     l_params(2).paramValue  :=  p_child_txn_id;
11362     l_params(3).paramName   := 'p_mtl_header_id';
11363     l_params(3).paramValue  :=  p_mtl_header_id;
11364     l_params(4).paramName   := 'p_do_backflush';
11365     l_params(4).paramValue  :=  p_do_backflush;
11366     l_params(5).paramName   := 'p_assySerial';
11367     l_params(5).paramValue  :=  p_assySerial;
11368     l_params(6).paramName   := 'p_print_label'; /* VJ Label Printing */
11369     l_params(6).paramValue  :=  p_print_label;  /* VJ Label Printing */
11370     l_params(7).paramName   := 'p_print_cmpl_label'; /*Bug 13103060*/
11371     l_params(7).paramValue  :=  p_print_cmpl_label; /*Bug 13103060*/
11372 
11373     wip_logger.entryPoint(p_procName     => 'wip_movProc_priv.processOATxn',
11374                           p_params       => l_params,
11375                           x_returnStatus => l_return_status);
11376   END IF;
11377   l_process_phase := '2';
11378   SAVEPOINT s_oa_txn_proc;
11379 
11380   IF(p_assySerial IS NOT NULL) THEN
11381     -- serial txns, so need to insert record into WIP_SERIAL_MOVE_INTERFACE too
11382     IF(wma_move.insertSerial(groupID       => p_group_id,
11383                              transactionID => p_group_id,
11384                              serialNumber  => p_assySerial,
11385                              errMessage    => l_error_msg) = FALSE) THEN
11386       -- insert statement error out
11387       raise fnd_api.g_exc_unexpected_error;
11388     END IF;
11389   END IF; -- from serialized page
11390   l_process_phase := '2.5';
11391    --Bug#16274722: Added the below code to default the lot expiration date
11392       SELECT COUNT(1)
11393       INTO l_mti_lot_rec
11394       FROM mtl_transaction_lots_interface mtli,
11395            mtl_transactions_interface mti
11396      WHERE mtli.transaction_interface_id = mti.transaction_interface_id
11397        AND mti.transaction_header_id = p_mtl_header_id
11398        AND mti.transaction_action_id in (WIP_CONSTANTS.RETASSY_ACTION,WIP_CONSTANTS.CPLASSY_ACTION)
11399        and MTI.TRANSACTION_TYPE_ID    in (WIP_CONSTANTS.RETASSY_TYPE,WIP_CONSTANTS.CPLASSY_TYPE)
11400        AND mti.transaction_source_type_id = TPS_INV_JOB_OR_SCHED  ;
11401 
11402        IF l_mti_lot_rec>0 THEN
11403                --ProcesOATxn is used only for Discrete jobs
11404 
11405               UPDATE mtl_transaction_lots_interface mtli
11406                  SET lot_expiration_date =
11407                      (SELECT MIN(mln.expiration_date)
11408                         FROM mtl_transactions_interface mti,
11409                              mtl_system_items msi,
11410                              mtl_lot_numbers  mln
11411                        WHERE mti.organization_id = msi.organization_id
11412                          AND mti.inventory_item_id = msi.inventory_item_id
11413                          AND mti.transaction_header_id = p_mtl_header_id
11414                          AND mti.transaction_action_id in (WIP_CONSTANTS.RETASSY_ACTION,WIP_CONSTANTS.CPLASSY_ACTION)
11415                          AND mti.transaction_type_id   in (WIP_CONSTANTS.RETASSY_TYPE,WIP_CONSTANTS.CPLASSY_TYPE)
11416                          AND mti.transaction_source_type_id = TPS_INV_JOB_OR_SCHED
11417                          AND mti.wip_entity_type =WIP_CONSTANTS.DISCRETE
11418                          AND msi.lot_control_code = WIP_CONSTANTS.LOT
11419                          AND mln.lot_number = mtli.lot_number
11420                          AND mln.inventory_item_id = mti.inventory_item_id
11421                          AND mln.organization_id = mti.organization_id)
11422                WHERE mtli.transaction_interface_id IN
11423                      (SELECT mti.transaction_interface_id
11424                         FROM mtl_transactions_interface mti,
11425                              mtl_system_items msi
11426                        WHERE mti.organization_id = msi.organization_id
11427                          AND mti.inventory_item_id = msi.inventory_item_id
11428                          AND mti.transaction_header_id = p_mtl_header_id
11429                          AND mti.transaction_action_id in (WIP_CONSTANTS.RETASSY_ACTION,WIP_CONSTANTS.CPLASSY_ACTION)
11430                          AND mti.transaction_type_id    in (WIP_CONSTANTS.RETASSY_TYPE,WIP_CONSTANTS.CPLASSY_TYPE)
11431                          AND mti.transaction_source_type_id = TPS_INV_JOB_OR_SCHED
11432                          AND msi.lot_control_code = WIP_CONSTANTS.LOT
11433                          AND mti.wip_entity_type = WIP_CONSTANTS.DISCRETE
11434                                )
11435                   AND mtli.lot_expiration_date is null;
11436 
11437               -- IF debug message level = 2, write statement below to log file
11438               IF (l_log_level <= wip_constants.full_logging) THEN
11439                 fnd_message.set_name('WIP', 'WIP_UPDATED_ROWS');
11440                 fnd_message.set_token('ENTITY1', SQL%ROWCOUNT);
11441                 fnd_message.set_token('ENTITY2', 'MTL_TRANSACTION_LOTS_INTERFACE');
11442                 l_msg := fnd_message.get;
11443                 wip_logger.log(p_msg          => l_msg,
11444                                x_returnStatus => l_return_status);
11445               END IF;
11446 
11447               /* IF Exp date null in MTL_LOT_NUMBERS should I leave it null */
11448               /* Or should I just decode based on exp date null in the temp table? */
11449               /* Removed group by and modIFied select and where conditions to avoid
11450                  oracle error 1427.  See bugs 866408 and 938422. */
11451               UPDATE mtl_transaction_lots_interface mtli
11452                  SET lot_expiration_date =
11453                      (SELECT mti.transaction_date + NVL(msi.shelf_life_days,0)
11454                         FROM mtl_transactions_interface mti,
11455                              mtl_system_items msi
11456                        WHERE mti.transaction_header_id =p_mtl_header_id
11457                          AND mti.transaction_action_id in (WIP_CONSTANTS.RETASSY_ACTION,WIP_CONSTANTS.CPLASSY_ACTION)
11458                          AND mti.transaction_type_id   in (WIP_CONSTANTS.RETASSY_TYPE,WIP_CONSTANTS.CPLASSY_TYPE)
11459                          AND mti.transaction_source_type_id = TPS_INV_JOB_OR_SCHED
11460                          AND mti.wip_entity_type =WIP_CONSTANTS.DISCRETE
11461                          AND msi.lot_control_code = WIP_CONSTANTS.LOT
11462                          AND msi.organization_id = mti.organization_id
11463                          AND msi.inventory_item_id = mti.inventory_item_id
11464                          AND msi.shelf_life_code = WIP_CONSTANTS.SHELF_LIFE
11465                          AND mtli.transaction_interface_id =
11466                              mti.transaction_interface_id)
11467                WHERE mtli.lot_expiration_date IS NULL
11468                  AND mtli.transaction_interface_id IN
11469                      (SELECT mti.transaction_interface_id
11470                         FROM mtl_transactions_interface mti,
11471                              mtl_system_items msi
11472                        WHERE mti.organization_id = msi.organization_id
11473                          AND mti.inventory_item_id = msi.inventory_item_id
11474                          AND mti.transaction_header_id = p_mtl_header_id
11475                          AND mti.transaction_action_id in (WIP_CONSTANTS.RETASSY_ACTION,WIP_CONSTANTS.CPLASSY_ACTION)
11476                          AND mti.transaction_type_id  in (WIP_CONSTANTS.RETASSY_TYPE,WIP_CONSTANTS.CPLASSY_TYPE)
11477                          AND mti.transaction_source_type_id = TPS_INV_JOB_OR_SCHED
11478                          AND mti.wip_entity_type =WIP_CONSTANTS.DISCRETE
11479                          AND msi.lot_control_code = WIP_CONSTANTS.LOT);
11480 
11481               -- IF debug message level = 2, write statement below to log file
11482               IF (l_log_level <= wip_constants.full_logging) THEN
11483                 fnd_message.set_name('WIP', 'WIP_UPDATED_ROWS');
11484                 fnd_message.set_token('ENTITY1', SQL%ROWCOUNT);
11485                 fnd_message.set_token('ENTITY2', 'MTL_TRANSACTION_LOTS_INTERFACE');
11486                 l_msg := fnd_message.get;
11487                 wip_logger.log(p_msg          => l_msg,
11488                                x_returnStatus => l_return_status);
11489               END IF;
11490 
11491     END IF; -- (l_mti_lot_rec > 0)
11492 
11493   -- Validate and move records from MTI to MMTT. This will move both assembly
11494   -- and component records because we use the same header Id.
11495 
11496 
11497   wip_mtlTempProc_priv.validateInterfaceTxns(
11498     p_txnHdrID      => p_mtl_header_id,
11499     p_addMsgToStack => fnd_api.g_true, -- So that we can display to user
11500     p_rollbackOnErr => fnd_api.g_false,
11501     x_returnStatus  => x_returnStatus);
11502 
11503   IF(x_returnStatus <> fnd_api.g_ret_sts_success) THEN
11504     raise fnd_api.g_exc_unexpected_error;
11505   END IF;
11506   l_process_phase := '3';
11507 
11508   /*Start: Bug 13103060 print completion label for ez completion*/
11509    IF (p_print_cmpl_label = 1) THEN
11510            wip_utilities.print_label(p_txn_id       => p_mtl_header_id,
11511                                      p_table_type   => 2, --MMTT
11512                                      p_ret_status   => l_return_status,
11513                                      p_msg_count    => l_msg_count,
11514                                      p_msg_data     => l_error_msg,
11515                                      p_label_status => l_label_status,
11516                                      p_business_flow_code => 26); -- discrete business flow code
11517            -- do not error out if label printing, only put warning message in log
11518            IF(x_returnStatus <> fnd_api.g_ret_sts_success) THEN
11519              wip_utilities.get_message_stack(p_msg => l_msg_stack);
11520              IF (l_log_level <= wip_constants.full_logging) then
11521                wip_logger.log(p_msg => 'An error has occurred with label printing.\n' ||
11522                                      'The following error has occurred during ' ||
11523                                      'printing: ' || l_msg_stack || '\n' ||
11524                                      'Please check the Inventory log file for more ' ||
11525                                      'information.',
11526                               x_returnStatus =>l_return_status);
11527              END IF;
11528            END IF;
11529          END IF;
11530 
11531   /*End: Bug 13103060 print completion label for ez completion*/
11532 
11533   -- Perform some validations that have not done in the UI
11534   wip_move_validator.validateOATxn(p_group_id => p_group_id);
11535   l_process_phase := '4';
11536 
11537   -- Process move and material records.
11538   wip_movProc_priv.processIntf
11539    (p_group_id       => p_group_id,
11540     p_child_txn_id   => p_child_txn_id,
11541     p_mtl_header_id  => p_mtl_header_id,
11542     p_assy_header_id => p_mtl_header_id,
11543     p_proc_phase     => WIP_CONSTANTS.MOVE_PROC,
11544     p_time_out       => 0,
11545     p_move_mode      => WIP_CONSTANTS.ONLINE,
11546     p_bf_mode        => WIP_CONSTANTS.ONLINE,
11547     p_mtl_mode       => WIP_CONSTANTS.ONLINE,
11548     p_endDebug       => FND_API.G_FALSE,
11549     p_initMsgList    => FND_API.G_TRUE,
11550     p_insertAssy     => FND_API.G_FALSE,
11551     p_do_backflush   => p_do_backflush,
11552     x_returnStatus   => x_returnStatus);
11553 
11554   IF(x_returnStatus <> fnd_api.g_ret_sts_success) THEN
11555     l_process_phase := '5';
11556     raise fnd_api.g_exc_unexpected_error;
11557   ELSE
11558     l_process_phase := '6';
11559     -- If move success, call time entry API to clock off operator if there
11560     -- is no quantity left at the operation.
11561     FOR l_move_records IN c_move_records LOOP
11562       wip_ws_time_entry.process_time_records_move(
11563         p_wip_entity_id => l_move_records.wip_id,
11564         p_from_op       => l_move_records.fm_op,
11565         p_to_op         => l_move_records.to_op);
11566     END LOOP;
11567     l_process_phase := '7';
11568   END IF;
11569 
11570   /* Start: VJ Label Printing */
11571   IF (p_print_label = 1) THEN
11572     wip_utilities.print_move_txn_label(p_txn_id  => p_group_id,
11573 				       x_status  => l_return_status,
11574 				       x_msg_count => l_msg_count,
11575 				       x_msg  => l_error_msg);
11576     -- do not error out if label printing, only put warning message in log
11577     IF(l_return_status <> fnd_api.g_ret_sts_success) THEN
11578       wip_utilities.get_message_stack(p_msg => l_msg_stack);
11579       IF (l_log_level <= wip_constants.full_logging) THEN
11580         wip_logger.log(p_msg => 'An error has occurred with label printing.\n' ||
11581                                 'The following error has occurred during ' ||
11582                                 'printing: ' || l_msg_stack || '\n' ||
11583                                 'Please check the Inventory log file for more ' ||
11584                                 'information.',
11585                        x_returnStatus =>l_return_status);
11586       END IF;
11587     END IF;
11588   END IF;
11589 
11590   l_process_phase := '8';
11591   /* End: VJ Label Printing */
11592 
11593   x_returnStatus := fnd_api.g_ret_sts_success;
11594 
11595   -- write to the log file
11596   IF (l_log_level <= wip_constants.trace_logging) THEN
11597     wip_logger.exitPoint(p_procName => 'wip_movProc_priv.processOATxn',
11598                          p_procReturnStatus => x_returnStatus,
11599                          p_msg => 'procedure complete',
11600                          x_returnStatus => l_return_status);
11601   END IF;
11602   -- close log file
11603   wip_logger.cleanUp(x_returnStatus => l_return_status);
11604 EXCEPTION
11605   WHEN fnd_api.g_exc_unexpected_error THEN
11606     -- Fixed bug 5518780. We should not clear message from the stack.
11607     -- If it fails inventory validation, no error will be recorded in WTIE.
11608     -- Instead, error message will be put in message stack.
11609     -- fnd_msg_pub.initialize;
11610     FOR l_errors IN c_errors LOOP
11611       fnd_message.set_name('FND', 'FND_GENERIC_MESSAGE');
11612       fnd_message.set_token('MESSAGE', l_errors.error_message);
11613       fnd_msg_pub.add;
11614     END LOOP;
11615     ROLLBACK TO SAVEPOINT s_oa_txn_proc;
11616     x_returnStatus := fnd_api.g_ret_sts_error;
11617     IF (l_log_level <= wip_constants.trace_logging) THEN
11618       wip_logger.exitPoint(p_procName => 'wip_movProc_priv.processOATxn',
11619                            p_procReturnStatus => x_returnStatus,
11620                            p_msg => 'wip_movProc_priv.processOATxn failed : '
11621                                      || l_process_phase,
11622                            x_returnStatus => l_return_status);
11623     END IF;
11624     -- close log file
11625     wip_logger.cleanUp(x_returnStatus => l_return_status);
11626   WHEN others THEN
11627     ROLLBACK TO SAVEPOINT s_oa_txn_proc;
11628     x_returnStatus := fnd_api.g_ret_sts_error;
11629     l_error_msg := ' unexpected error: ' || SQLERRM || 'SQLCODE = ' || SQLCODE;
11630 
11631     fnd_message.set_name('FND', 'FND_GENERIC_MESSAGE');
11632     fnd_message.set_token('MESSAGE', l_error_msg);
11633     fnd_msg_pub.add;
11634 
11635     IF (l_log_level <= wip_constants.trace_logging) THEN
11636       wip_logger.exitPoint(p_procName => 'wip_movProc_priv.processOATxn',
11637                            p_procReturnStatus => x_returnStatus,
11638                            p_msg => l_error_msg || ' : ' || l_process_phase,
11639                            x_returnStatus => l_return_status);
11640     END IF;
11641     -- close log file
11642     wip_logger.cleanUp(x_returnStatus => l_return_status);
11643 END processOATxn;
11644 
11645 /*****************************************************************************
11646  * This procedure update the lock_flag value to 'N' in MMTT if the move
11647  * transaction failed during Move Processing Phase so that no records will
11648  * will stuck in MMTT. Added this procedure for fix of bug 8473023(FP 8358813)
11649  ****************************************************************************/
11650  PROCEDURE clean_up(p_assy_header_id  IN     NUMBER) IS
11651 
11652  BEGIN
11653  	  UPDATE mtl_material_transactions_temp
11654  	  SET lock_flag ='N'
11655  	  WHERE transaction_header_id = p_assy_header_id;
11656 
11657  END clean_up;
11658 
11659 END wip_movProc_priv;