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