4 ------------------------------------
1 PACKAGE BODY AHL_OSP_ACCOMP_PVT AS
2 /* $Header: AHLVOSAB.pls 120.0.12020000.2 2012/12/11 07:48:17 sareepar noship $ */
3
5 -- Common constants and variables --
6 ------------------------------------
7 G_PKG_NAME CONSTANT VARCHAR2(30) := 'AHL_OSP_ACCOMP_PVT';
8 G_APP_NAME CONSTANT VARCHAR2(3) := 'AHL';
9 G_LOG_PREFIX CONSTANT VARCHAR2(60) := 'ahl.plsql.'||G_PKG_NAME;
10
11 l_log_current_level NUMBER := fnd_log.g_current_runtime_level;
12 l_log_statement NUMBER := fnd_log.level_statement;
13 l_log_procedure NUMBER := fnd_log.level_procedure;
14
15
16 ------------------------
17 -- Declare Local Functions --
18 ------------------------
19
20 ------------------------
21 -- Declare Procedures --
22 ------------------------
26 p_accomplishment_date IN DATE,
23 PROCEDURE Create_And_Accomplish_Mr(
24 p_instance_id IN NUMBER,
25 p_mr_header_id IN NUMBER,
27 x_ue_id OUT NOCOPY NUMBER,
28 x_return_status OUT NOCOPY VARCHAR2,
29 x_msg_count OUT NOCOPY NUMBER,
30 x_msg_data OUT NOCOPY VARCHAR2
31 );
32
33 PROCEDURE Accomplish_UMP(
34 p_unit_effectivity_id IN NUMBER,
35 p_accomplishment_date IN DATE,
36 x_return_status OUT NOCOPY VARCHAR2,
37 x_msg_count OUT NOCOPY NUMBER,
38 x_msg_data OUT NOCOPY VARCHAR2
39 );
40
41
42 ------------------------------------------------------------------
43 ----------- BEGIN DEFINITION OF PROCEDURES AND FUNCTIONS ---------
44 ------------------------------------------------------------------
45 ----------------------------------------------------------------------------------------
46 -- Procedure Create_And_Accomplish_Mr
47 -- This API is used to create a single unit effectivity and accomplish it.
48 ----------------------------------------------------------------------------------------
49 PROCEDURE Create_And_Accomplish_Mr(
50 p_instance_id IN NUMBER,
51 p_mr_header_id IN NUMBER,
52 p_accomplishment_date IN DATE,
53 x_ue_id OUT NOCOPY NUMBER,
54 x_return_status OUT NOCOPY VARCHAR2,
55 x_msg_count OUT NOCOPY NUMBER,
56 x_msg_data OUT NOCOPY VARCHAR2)
57 IS
58
59 L_API_NAME CONSTANT VARCHAR2(30) := 'Create_And_Accomplish_Mr';
60 L_FULL_NAME CONSTANT VARCHAR2(100) := G_LOG_PREFIX || '.' || L_API_NAME;
61
62 l_return_status VARCHAR2(1);
63 l_msg_count NUMBER;
64 l_msg_data VARCHAR2(2000);
65 l_ue_id NUMBER;
66
67 CURSOR get_instance_attrs(c_instance_id NUMBER) IS
68 SELECT serial_number,
69 lot_number,
70 inventory_item_id,
71 last_vld_organization_id,
72 inv_master_organization_id
73 FROM csi_item_instances
74 WHERE instance_id = c_instance_id;
75
76 --Modification by JROTICH for bug#13798727 BEGIN
77 CURSOR get_mr_dtls_csr(c_mr_header_id NUMBER) IS
78 SELECT MR_HEADER_ID,
79 MR_STATUS_CODE,
80 EFFECTIVE_FROM,
81 EFFECTIVE_TO,
82 TITLE
83 FROM AHL_MR_HEADERS_VL
84 WHERE MR_HEADER_ID = c_mr_header_id;
85 l_mr_dtls get_mr_dtls_csr%ROWTYPE;
86 --Modification by JROTICH for bug#13798727 END
87
88
89 BEGIN
90 --Initialize API return status to success
91 x_return_status := FND_API.G_RET_STS_SUCCESS;
92
93 IF (l_log_procedure >= l_log_current_level) THEN
94 FND_LOG.STRING(l_log_procedure, L_FULL_NAME || '.begin',
95 'At the start of the procedure. p_instance_id = ' || p_instance_id ||
96 ', p_mr_header_id = ' || p_mr_header_id ||
97 ', p_accomplishment_date = ' || p_accomplishment_date);
98 END IF;
99
100 --Modification by JROTICH for bug#13798727 BEGIN
101 OPEN get_mr_dtls_csr(c_mr_header_id => p_mr_header_id);
102 FETCH get_mr_dtls_csr INTO l_mr_dtls;
103 CLOSE get_mr_dtls_csr;
104
105 IF (l_log_statement >= l_log_current_level) THEN
106 FND_LOG.STRING(l_log_statement, L_FULL_NAME, 'Validating accomplishment date.');
107 END IF;
108 --Validate that the date accomplishment date is between the effective to and from dates of the MR
109 IF (p_accomplishment_date < l_mr_dtls.effective_from OR p_accomplishment_date > nvl(l_mr_dtls.effective_to,SYSDATE)) THEN
110 IF (l_log_statement >= l_log_current_level) THEN
111 FND_LOG.STRING(l_log_statement, L_FULL_NAME, 'Invalid accomplishment date.');
112 END IF;
113 FND_MESSAGE.set_name('AHL','AHL_OSP_ACC_INV_DATE');
114 FND_MESSAGE.set_token('TITLE',l_mr_dtls.title);
115 FND_MSG_PUB.add;
116 RAISE FND_API.G_EXC_ERROR;
117 END IF;
118
119 IF (l_log_statement >= l_log_current_level) THEN
120 FND_LOG.STRING(l_log_statement, L_FULL_NAME, 'Validating MR status.');
121 END IF;
122 --Validate that the mr is in the complete status
123 IF (l_mr_dtls.mr_status_code <> 'COMPLETE' ) THEN
124 IF (l_log_statement >= l_log_current_level) THEN
125 FND_LOG.STRING(l_log_statement, L_FULL_NAME, 'Invalid MR Status.');
126 END IF;
127 FND_MESSAGE.set_name('AHL','AHL_OSP_ACC_INV_STATUS');
128 FND_MESSAGE.set_token('TITLE',l_mr_dtls.title);
129 FND_MSG_PUB.add;
130 RAISE FND_API.G_EXC_ERROR;
131 END IF;
132 --Modification by JROTICH for bug#13798727 END
133
134
135
136
137 IF (l_log_statement >= l_log_current_level) THEN
138 FND_LOG.STRING(l_log_statement, L_FULL_NAME, 'About to call AHL_UMP_UNPLANNED_PVT.CREATE_UNIT_EFFECTIVITY.');
139 END IF;
140 AHL_UMP_UNPLANNED_PVT.CREATE_UNIT_EFFECTIVITY(
141 p_api_version => 1.0,
142 x_return_status => l_return_status,
143 x_msg_count => l_msg_count,
144 x_msg_data => l_msg_data,
145 p_mr_header_id => p_mr_header_id,
146 p_instance_id => p_instance_id,
147 x_orig_ue_id => l_ue_id);
148 IF (l_log_statement >= l_log_current_level) THEN
152 IF l_msg_count > 0 OR NVL(l_return_status,'X') <> Fnd_Api.G_RET_STS_SUCCESS THEN
149 fnd_log.string(l_log_statement, L_FULL_NAME, 'Returned from call to AHL_UMP_UNPLANNED_PVT.CREATE_UNIT_EFFECTIVITY. x_return_status = ' || l_return_status || ' and x_orig_ue_id = ' || l_ue_id);
150 END IF;
151
153 x_msg_count := l_msg_count;
154 IF l_return_status = FND_API.G_RET_STS_ERROR THEN
155 x_return_status := l_return_status;
156 ELSE
160 RETURN;
157 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
158 END IF;
159 -- Unable to create UMP successfully. Return early
161 END IF;
162
163 IF (l_log_statement >= l_log_current_level) THEN
164 FND_LOG.STRING(l_log_statement, L_FULL_NAME, 'About to call Accomplish_UMP');
165 END IF;
166 Accomplish_UMP(
167 p_unit_effectivity_id => l_ue_id,
168 p_accomplishment_date => p_accomplishment_date,
169 x_return_status => l_return_status,
170 x_msg_count => l_msg_count,
171 x_msg_data => l_msg_data
172 );
173 IF (l_log_statement >= l_log_current_level) THEN
174 FND_LOG.STRING(l_log_statement, L_FULL_NAME, 'Returned from call to Accomplish_UMP. x_return_status = ' || l_return_status);
175 END IF;
176
177 IF l_msg_count > 0 OR NVL(l_return_status,'X') <> Fnd_Api.G_RET_STS_SUCCESS THEN
178 x_msg_count := l_msg_count;
179 IF l_return_status = FND_API.G_RET_STS_ERROR THEN
180 x_return_status := l_return_status;
181 ELSE
182 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
183 END IF;
184 ELSE
185 x_return_status := l_return_status; -- Success
186 END IF;
187 -- Return the UE Id created and accomplished
188 x_ue_id := l_ue_id;
189
190 IF (l_log_procedure >= l_log_current_level) THEN
191 FND_LOG.STRING(l_log_procedure, L_FULL_NAME||'.end', 'At the end of the procedure. Returning x_ue_id as ' || x_ue_id);
192 END IF;
193
194 END Create_And_Accomplish_Mr;
195
196 ----------------------------------------------------------------------------------------
197 -- Procedure Accomplish_UMP
198 -- This is a recursive procedure
199 -- It is used accomplish a UMP. It takes care of hierarchies and reset MRs.
200 ----------------------------------------------------------------------------------------
201 PROCEDURE Accomplish_UMP(
202 p_unit_effectivity_id IN NUMBER,
203 p_accomplishment_date IN DATE,
204 x_return_status OUT NOCOPY VARCHAR2,
205 x_msg_count OUT NOCOPY NUMBER,
206 x_msg_data OUT NOCOPY VARCHAR2)
207 IS
208
209 L_API_NAME CONSTANT VARCHAR2(30) := 'Accomplish_UMP';
210 L_FULL_NAME CONSTANT VARCHAR2(100) := G_LOG_PREFIX || '.' || L_API_NAME;
211
212 l_return_status VARCHAR2(1);
213 l_msg_count NUMBER;
214 l_msg_data VARCHAR2(2000);
215 l_mr_id NUMBER;
216 l_instance_id NUMBER;
217 l_ue_ovn NUMBER;
218 i NUMBER;
219
220 l_reset_counter_tbl AHL_COMPLETIONS_PVT.counter_tbl_type;
221 l_mr_rec AHL_COMPLETIONS_PVT.mr_rec_type;
222 l_counter_tbl AHL_COMPLETIONS_PVT.counter_tbl_type;
223
224 TYPE NUM_TBL_TYPE IS TABLE OF NUMBER INDEX BY BINARY_INTEGER;
225 l_child_ue_ids_tbl NUM_TBL_TYPE;
226
227 CURSOR get_descendant_UEs_csr IS
228 SELECT related_ue_id
229 FROM AHL_UE_RELATIONSHIPS
230 START WITH ue_id = p_unit_effectivity_id
231 AND relationship_code = 'PARENT'
232 CONNECT BY ue_id = PRIOR related_ue_id
233 AND relationship_code = 'PARENT'
234 ORDER BY LEVEL DESC;
235
236 CURSOR get_ue_dtls_csr(c_unit_effectivity_id IN NUMBER) IS
237 SELECT MR_HEADER_ID,
238 CSI_ITEM_INSTANCE_ID,
239 OBJECT_VERSION_NUMBER
240 FROM ahl_unit_effectivities_b
241 WHERE UNIT_EFFECTIVITY_ID = c_unit_effectivity_id;
242
243 BEGIN
244 --Initialize API return status to success
245 x_return_status := FND_API.G_RET_STS_SUCCESS;
246
247 IF (l_log_procedure >= l_log_current_level) THEN
248 FND_LOG.STRING(l_log_procedure, L_FULL_NAME || '.begin',
249 'At the start of the procedure. p_unit_effectivity_id = ' || p_unit_effectivity_id ||
250 ', p_accomplishment_date = ' || p_accomplishment_date);
251 END IF;
252
253 OPEN get_descendant_UEs_csr;
254 FETCH get_descendant_UEs_csr BULK COLLECT INTO l_child_ue_ids_tbl;
255 CLOSE get_descendant_UEs_csr;
256
257 IF (l_log_statement >= l_log_current_level) THEN
258 FND_LOG.STRING(l_log_statement, L_FULL_NAME, 'l_child_ue_ids_tbl.COUNT = ' || l_child_ue_ids_tbl.COUNT);
259 END IF;
260 -- Append the current (root) UE Id at the end
261 i := NVL(l_child_ue_ids_tbl.LAST, 0) + 1;
265 i := l_child_ue_ids_tbl.FIRST;
262 l_child_ue_ids_tbl(i) := p_unit_effectivity_id;
263
264 -- Process each Unit Effectivity in the hierarchy (order by descending LEVEL)
266 WHILE (i IS NOT NULL) LOOP
267 IF (l_log_statement >= l_log_current_level) THEN
268 FND_LOG.STRING(l_log_statement, L_FULL_NAME, 'Processing index ' || i || ', Unit Effectivity Id = ' || l_child_ue_ids_tbl(i));
269 END IF;
270
271 OPEN get_ue_dtls_csr(c_unit_effectivity_id => l_child_ue_ids_tbl(i));
272 FETCH get_ue_dtls_csr INTO l_mr_id, l_instance_id, l_ue_ovn;
273 CLOSE get_ue_dtls_csr;
274
275 -- Get the Reset Counter Readings for all Counters associted with the MR and the Item Instance.
276 IF (l_mr_id IS NOT NULL) THEN
277 l_return_status := AHL_COMPLETIONS_PVT.get_reset_counters(p_mr_header_id => l_mr_id,
278 p_item_instance_id => l_instance_id,
279 p_actual_date => p_accomplishment_date,
280 x_counter_tbl => l_reset_counter_tbl);
281 END IF;
282
283 IF (l_return_status = FND_API.G_RET_STS_ERROR) THEN
284 RAISE FND_API.G_EXC_ERROR;
285 ELSIF (l_return_status = FND_API.G_RET_STS_UNEXP_ERROR) THEN
286 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
287 END IF;
288
289 IF (l_reset_counter_tbl IS NOT NULL AND l_reset_counter_tbl.COUNT > 0) THEN
290 IF (l_log_statement >= l_log_current_level) THEN
291 FND_LOG.STRING(l_log_statement, L_FULL_NAME, 'Resetting Counters...');
292 END IF;
293 -- Reset all the Counters with Reset Values specified in FMP
294 l_mr_rec.mr_header_id := l_mr_id;
295 l_mr_rec.unit_effectivity_id := l_child_ue_ids_tbl(i);
296 l_return_status := AHL_COMPLETIONS_PVT.reset_counters(p_mr_rec => l_mr_rec,
297 p_x_counter_tbl => l_reset_counter_tbl,
298 p_actual_end_date => p_accomplishment_date,
299 x_msg_count => l_msg_count,
300 x_msg_data => l_msg_data);
301
302 IF (l_return_status = FND_API.G_RET_STS_ERROR) THEN
306 x_msg_data := l_msg_data;
303 IF (l_msg_data IS NOT NULL) THEN
304 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
305 x_msg_count := l_msg_count;
307 END IF;
308 RAISE FND_API.G_EXC_ERROR;
309 ELSIF (l_return_status = FND_API.G_RET_STS_UNEXP_ERROR) THEN
310 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
311 END IF;
312 END IF; -- There are reset counters
313 l_reset_counter_tbl.DELETE;
314
315 IF (l_log_statement >= l_log_current_level) THEN
316 FND_LOG.STRING(l_log_statement, L_FULL_NAME, 'Getting CP Counters...');
317 END IF;
318 -- Get the Current Counter Readings for all Counters associted with the Item Instance.
319 l_return_status := AHL_COMPLETIONS_PVT.get_cp_counters(p_item_instance_id => l_instance_id,
320 p_wip_entity_id => null,
321 p_actual_date => p_accomplishment_date,
322 x_counter_tbl => l_counter_tbl);
323 IF (l_return_status = FND_API.G_RET_STS_ERROR) THEN
324 RAISE FND_API.G_EXC_ERROR;
325 ELSIF (l_return_status = FND_API.G_RET_STS_UNEXP_ERROR) THEN
326 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
327 END IF;
328
332 -- Record Accomplishment in UMP
329 IF (l_log_statement >= l_log_current_level) THEN
330 FND_LOG.STRING(l_log_statement, L_FULL_NAME, 'Updating UMP...');
331 END IF;
333 l_return_status := AHL_COMPLETIONS_PVT.update_ump(p_unit_effectivity_id => l_child_ue_ids_tbl(i),
334 p_ue_object_version => l_ue_ovn,
335 p_actual_end_date => p_accomplishment_date,
336 p_counter_tbl => l_counter_tbl,
337 p_dml_flag => 'C',
338 x_msg_count => l_msg_count,
339 x_msg_data => l_msg_data);
340
341 IF (l_return_status = FND_API.G_RET_STS_ERROR) THEN
342 IF (l_msg_data IS NOT NULL) THEN
343 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
344 x_msg_count := l_msg_count;
345 x_msg_data := l_msg_data;
346 END IF;
347 RAISE FND_API.G_EXC_ERROR;
348 ELSIF ( l_return_status = FND_API.G_RET_STS_UNEXP_ERROR ) THEN
349 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
350 END IF;
351 l_counter_tbl.DELETE;
352
353 i := l_child_ue_ids_tbl.NEXT(i);
354
355 END LOOP; -- For all Unit Effectivities
356
357 IF (l_log_procedure >= l_log_current_level) THEN
358 FND_LOG.STRING(l_log_procedure, L_FULL_NAME||'.end', 'At the end of the procedure.');
359 END IF;
360
361 END Accomplish_UMP;
362
363 ----------------------------------------------------------------------------------------
364 -- Start of Comments --
365 -- Procedure name : accomplish_osp_mrs
366 -- Type : Private
367 -- Function : Procedure to Accomplish one or more MRs associated to a OSP Line.
368 -- The records in the AHL_OSP_ACCOMPLISHMENTS will also be updated
369 -- Will be called from the Service Details UI.
370 -- Pre-reqs :
371 -- Parameters :
372 --
373 -- Standard IN Parameters :
374 -- p_api_version IN NUMBER Default 1.0
375 -- p_init_msg_list IN VARCHAR2 Default FND_API.G_TRUE
376 -- p_commit IN VARCHAR2 Default FND_API.G_FALSE
377 -- Standard OUT Parameters :
378 -- x_return_status OUT VARCHAR2 Required
379 -- x_msg_count OUT NUMBER Required
380 -- x_msg_data OUT VARCHAR2 Required
381 -- process_disposition Parameters:
382 --
383 -- p_accomplishment_id IN NUMBER
384 -- If this parameter is passed, only a single UMP record is created and accomplished.
385 -- p_osp_order_line_id IN NUMBER
386 -- If this parameter is passed without passing the p_accomplishment_id parameter,
387 -- All the unaccomplished MRs assigned to the the OSP Line (and return line)
388 -- will be processed: UMP record created and immediately accomplished
389 --
390 -- Version :
391 -- Initial Version 1.0
392 --
393 -- End of Comments.
394 ----------------------------------------------------------------------------------------
395 PROCEDURE accomplish_osp_mrs(
396 p_api_version IN NUMBER := 1.0,
397 p_init_msg_list IN VARCHAR2 := FND_API.G_TRUE,
398 p_commit IN VARCHAR2 := FND_API.G_FALSE,
399 p_accomplishment_id IN NUMBER,
400 p_osp_order_line_id IN NUMBER,
401 x_return_status OUT NOCOPY VARCHAR2,
402 x_msg_count OUT NOCOPY NUMBER,
403 x_msg_data OUT NOCOPY VARCHAR2)
404 IS
405
406 L_API_NAME CONSTANT VARCHAR2(30) := 'Accomplish_Osp_Mrs';
407 L_API_VERSION CONSTANT NUMBER := 1.0;
408 L_FULL_NAME CONSTANT VARCHAR2(100) := G_LOG_PREFIX || '.' || L_API_NAME;
409 l_return_status VARCHAR2(1) := FND_API.G_RET_STS_SUCCESS;
410 l_dummy VARCHAR2(1);
411 l_osp_order_line_id NUMBER;
412 i NUMBER;
413 j NUMBER;
414 l_unit_effectivity_id NUMBER;
415 l_msg_count NUMBER;
416 l_msg_data VARCHAR2(2000);
417 l_received_quantity NUMBER;
418
419 TYPE NUM_TBL_TYPE IS TABLE OF NUMBER INDEX BY BINARY_INTEGER;
420 l_accomplishment_ids_tbl NUM_TBL_TYPE;
421 l_child_ue_ids_tbl NUM_TBL_TYPE;
422 l_instance_ids_tbl NUM_TBL_TYPE;
423 l_mr_ids_tbl NUM_TBL_TYPE;
424
425 TYPE DATE_TBL_TYPE IS TABLE OF DATE INDEX BY BINARY_INTEGER;
426 l_accomp_dates_tbl DATE_TBL_TYPE;
427
428 CURSOR chk_accomplishment_csr(c_accomplishment_id NUMBER) IS
429 SELECT osp_order_line_id
430 FROM ahl_osp_accomplishments
431 WHERE accomplishment_id = c_accomplishment_id
432 AND status_code = 'OPEN'
433 AND accomplished_date is not null;
434
435 CURSOR chk_osp_line_csr(c_osp_order_line_id NUMBER) IS
436 SELECT 'X'
440 CURSOR get_accomplishments_csr(c_osp_order_line_id NUMBER) IS
437 FROM ahl_osp_order_lines
438 WHERE osp_order_line_id = c_osp_order_line_id;
439
441 SELECT accomplishment_id
442 FROM ahl_osp_accomplishments
443 WHERE osp_order_line_id = c_osp_order_line_id
444 AND status_code = 'OPEN'
445 AND accomplished_date is not null;
446
447 CURSOR get_accomplishment_dtls_csr(c_accomplishment_id NUMBER) IS
448 SELECT item_instance_id,
449 mr_header_id,
450 accomplished_date,
451 object_version_number
452 FROM ahl_osp_accomplishments
453 WHERE accomplishment_id = c_accomplishment_id
454 AND status_code = 'OPEN'
455 AND accomplished_date is not null
456 FOR UPDATE of object_version_number;
457 l_accomplishment_dtls get_accomplishment_dtls_csr%ROWTYPE;
458
459 CURSOR get_received_quantity_csr(c_osp_order_line_id IN NUMBER) IS
460 SELECT OEL.shipped_quantity
461 FROM AHL_OSP_ORDER_LINES OSPL, OE_ORDER_LINES_ALL OEL
462 WHERE OSPL.OSP_ORDER_LINE_ID = c_osp_order_line_id
463 AND OEL.line_id = OSPL.OE_RETURN_LINE_ID;
464
465 CURSOR get_descendant_UEs_csr (c_ue_id IN NUMBER) IS
466 SELECT UER.related_ue_id, UEB.CSI_ITEM_INSTANCE_ID, UEB.MR_HEADER_ID, UEB.ACCOMPLISHED_DATE
467 FROM AHL_UE_RELATIONSHIPS UER,
468 AHL_UNIT_EFFECTIVITIES_B UEB
469 WHERE UER.related_ue_id = UEB.UNIT_EFFECTIVITY_ID
470 START WITH ue_id = c_ue_id
471 AND relationship_code = 'PARENT'
472 CONNECT BY ue_id = PRIOR related_ue_id
473 AND relationship_code = 'PARENT'
474 ORDER BY LEVEL DESC;
475
476
477 BEGIN
478
479 -- Standard start of API savepoint
480 SAVEPOINT accomplish_osp_mrs_pvt;
481 IF (l_log_procedure >= l_log_current_level) THEN
482 FND_LOG.STRING(l_log_procedure, L_FULL_NAME || '.begin', 'Entering Procedure. p_accomplishment_id = ' || p_accomplishment_id ||
483 ', p_osp_order_line_id = ' || p_osp_order_line_id);
484 END IF;
485
486 -- Standard call to check for call compatibility
487 IF NOT FND_API.Compatible_API_Call(L_API_VERSION, p_api_version, L_API_NAME, G_PKG_NAME) THEN
488 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
489 END IF;
490
491 -- Initialize message list if p_init_msg_list is set to TRUE
492 IF FND_API.To_Boolean(p_init_msg_list) THEN
493 FND_MSG_PUB.Initialize;
494 END IF;
495
496 -- Initialize API return status to success
497 x_return_status := FND_API.G_RET_STS_SUCCESS;
498
499 -- Begin Processing
500
501 IF (p_accomplishment_id IS NOT NULL) THEN
502 -- Validate that p_accomplishment_id corresponds to an unaccomplished record.
503 OPEN chk_accomplishment_csr(c_accomplishment_id => p_accomplishment_id);
504 FETCH chk_accomplishment_csr INTO l_osp_order_line_id;
505 IF (chk_accomplishment_csr%NOTFOUND) THEN
506 CLOSE chk_accomplishment_csr;
507 FND_MESSAGE.set_name(G_APP_NAME, 'AHL_OSP_INV_ACCOM_ID');
508 FND_MESSAGE.set_token('ACCOM_ID', p_accomplishment_id);
509 FND_MSG_PUB.ADD;
510 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
511 END IF;
512 CLOSE chk_accomplishment_csr;
513
514 -- If OSP Order Line Id is also passed, validate it to ensure that it matches the Accomplishment Id
515 IF ((p_osp_order_line_id IS NOT NULL) AND (l_osp_order_line_id <> p_osp_order_line_id)) THEN
516 FND_MESSAGE.set_name(G_APP_NAME, 'AHL_OSP_ACCOM_ID_MISMATCH');
517 FND_MESSAGE.set_token('ACCOM_ID', p_accomplishment_id);
518 FND_MESSAGE.set_token('OSP_LINE_ID', p_osp_order_line_id);
519 FND_MSG_PUB.ADD;
520 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
521 END IF;
522
523 -- Validate that the part has been received against the OSP Line
524 OPEN get_received_quantity_csr(l_osp_order_line_id);
525 FETCH get_received_quantity_csr INTO l_received_quantity;
526 CLOSE get_received_quantity_csr;
527
528 IF (l_received_quantity IS NULL OR l_received_quantity < 1) THEN
529 FND_MESSAGE.set_name(G_APP_NAME, 'AHL_OSP_NOT_RECEIVED');
530 FND_MSG_PUB.ADD;
531 RAISE FND_API.G_EXC_ERROR;
532 END IF;
533
534 -- Populate a table of Numbers with the single Accomplishment Id (will have only one record)
535 l_accomplishment_ids_tbl(1) := p_accomplishment_id;
536 ELSE
537 -- Ensure that p_osp_order_line_id is not null.
538 IF (p_osp_order_line_id IS NULL) THEN
539 FND_MESSAGE.set_name(G_APP_NAME, 'AHL_OSP_MISSING_PARAMS');
540 FND_MSG_PUB.ADD;
541 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
542 END IF;
543
544 -- Validate that the OSP Order Line Id is valid
545 OPEN chk_osp_line_csr(c_osp_order_line_id => p_osp_order_line_id);
546 FETCH chk_osp_line_csr INTO l_dummy;
547 IF (chk_osp_line_csr%NOTFOUND) THEN
548 CLOSE chk_osp_line_csr;
549 FND_MESSAGE.set_name(G_APP_NAME, 'AHL_OSP_INV_OSP_LINE_ID');
550 FND_MESSAGE.set_token('OSP_LINE_ID', p_osp_order_line_id);
551 FND_MSG_PUB.ADD;
552 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
553 END IF;
554 CLOSE chk_osp_line_csr;
555
556 -- Validate that the part has been received against the OSP Line
557 OPEN get_received_quantity_csr(p_osp_order_line_id);
558 FETCH get_received_quantity_csr INTO l_received_quantity;
559 CLOSE get_received_quantity_csr;
560
561 IF (l_received_quantity IS NULL OR l_received_quantity < 1) THEN
562 FND_MESSAGE.set_name(G_APP_NAME, 'AHL_OSP_NOT_RECIEVED');
563 FND_MSG_PUB.ADD;
564 RAISE FND_API.G_EXC_ERROR;
565 END IF;
566
567 -- Populate a table of Numbers with the Id of the Open Accomplishments assigned to this OSP Line
571
568 OPEN get_accomplishments_csr(c_osp_order_line_id => p_osp_order_line_id);
569 FETCH get_accomplishments_csr BULK COLLECT INTO l_accomplishment_ids_tbl;
570 CLOSE get_accomplishments_csr;
572 -- Ensure that there is at least one accomplishment to signoff
573 IF (l_accomplishment_ids_tbl.COUNT = 0) THEN
574 FND_MESSAGE.set_name(G_APP_NAME, 'AHL_OSP_NO_ACCOMS');
575 FND_MESSAGE.set_token('OSP_LINE_ID', p_osp_order_line_id);
576 FND_MSG_PUB.ADD;
577 RAISE FND_API.G_EXC_ERROR;
578 END IF;
579 END IF; -- Else (p_accomplishment_id is null)
580
581 i := l_accomplishment_ids_tbl.FIRST;
582 WHILE (i IS NOT NULL) LOOP
583 IF (l_log_statement >= l_log_current_level) THEN
584 FND_LOG.STRING(l_log_statement, L_FULL_NAME, 'Processing index ' || i || ', Accomplishment Id = ' || l_accomplishment_ids_tbl(i));
585 END IF;
586 -- Retrieve details from AHL_OSP_ACCOMPLISHMENTS and lock the row for update
587 OPEN get_accomplishment_dtls_csr(c_accomplishment_id => l_accomplishment_ids_tbl(i));
588 FETCH get_accomplishment_dtls_csr INTO l_accomplishment_dtls;
589
590 -- Call the helper procedure Create_And_Accomplish_Mr
591 Create_And_Accomplish_Mr(p_instance_id => l_accomplishment_dtls.item_instance_id,
592 p_mr_header_id => l_accomplishment_dtls.mr_header_id,
593 p_accomplishment_date => l_accomplishment_dtls.accomplished_date,
594 x_ue_id => l_unit_effectivity_id,
595 x_return_status => l_return_status,
596 x_msg_count => l_msg_count,
597 x_msg_data => l_msg_data);
598
599 IF (l_log_statement >= l_log_current_level) THEN
600 FND_LOG.STRING(l_log_statement, L_FULL_NAME, 'Returned from call to Create_And_Accomplish_Mr. x_return_status = ' || l_return_status);
601 END IF;
602
603 IF l_msg_count > 0 OR NVL(l_return_status,'X') <> Fnd_Api.G_RET_STS_SUCCESS THEN
604 IF l_return_status = FND_API.G_RET_STS_ERROR THEN
605 RAISE FND_API.G_EXC_ERROR;
606 ELSE
607 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
608 END IF;
609 END IF;
610
611 IF (l_log_statement >= l_log_current_level) THEN
612 FND_LOG.STRING(l_log_statement, L_FULL_NAME, 'About to update Accomplishments table for row with accomplishment_id ' || l_accomplishment_ids_tbl(i) ||
613 ' : Setting UNIT_EFFECTIVITY_ID as ' || l_unit_effectivity_id);
614 END IF;
615
616 UPDATE AHL_OSP_ACCOMPLISHMENTS
617 SET UNIT_EFFECTIVITY_ID = l_unit_effectivity_id,
618 STATUS_CODE = 'ACCOMPLISHED',
619 OBJECT_VERSION_NUMBER = OBJECT_VERSION_NUMBER + 1,
620 LAST_UPDATE_DATE = SYSDATE,
621 LAST_UPDATED_BY = FND_GLOBAL.user_id,
622 LAST_UPDATE_LOGIN = FND_GLOBAL.login_id
623 WHERE ACCOMPLISHMENT_ID = l_accomplishment_ids_tbl(i);
624
625 CLOSE get_accomplishment_dtls_csr;
626
627 -- If this is a Group MR, insert the additional records into the AHL_OSP_ACCOMPLISHMENTS table
628 OPEN get_descendant_UEs_csr(l_unit_effectivity_id);
629 FETCH get_descendant_UEs_csr BULK COLLECT INTO l_child_ue_ids_tbl, l_instance_ids_tbl, l_mr_ids_tbl, l_accomp_dates_tbl;
630 CLOSE get_descendant_UEs_csr;
631 IF (l_child_ue_ids_tbl IS NOT NULL AND l_child_ue_ids_tbl.COUNT > 0) THEN
632 IF (l_log_statement >= l_log_current_level) THEN
633 FND_LOG.STRING(l_log_statement, L_FULL_NAME, 'Accomplishment for Group MR. l_child_ue_ids_tbl.COUNT = ' || l_child_ue_ids_tbl.COUNT);
634 FND_LOG.STRING(l_log_statement, L_FULL_NAME, 'About to insert additional records into AHL_OSP_ACCOMPLISHMENTS.');
635 END IF;
636 FOR j IN l_child_ue_ids_tbl.FIRST..l_child_ue_ids_tbl.LAST LOOP
637 INSERT INTO AHL_OSP_ACCOMPLISHMENTS(ACCOMPLISHMENT_ID,
638 OBJECT_VERSION_NUMBER,
639 LAST_UPDATE_DATE,
640 LAST_UPDATED_BY,
641 CREATION_DATE,
642 CREATED_BY,
643 LAST_UPDATE_LOGIN,
644 OSP_ORDER_LINE_ID,
645 ITEM_INSTANCE_ID,
646 UNIT_EFFECTIVITY_ID,
647 MR_HEADER_ID,
648 PLANNING_TYPE_CODE,
649 STATUS_CODE,
650 ACCOMPLISHED_DATE)
651 VALUES (AHL_OSP_ACCOMPLISHMENTS_S.NEXTVAL,
652 1,
653 SYSDATE,
654 FND_GLOBAL.user_id,
655 SYSDATE,
656 FND_GLOBAL.user_id,
657 FND_GLOBAL.login_id,
658 NVL(p_osp_order_line_id, l_osp_order_line_id),
659 l_instance_ids_tbl(j),
660 l_child_ue_ids_tbl(j),
661 l_mr_ids_tbl(j),
662 'MANUALLY_PLANNED',
663 'ACCOMPLISHED',
664 l_accomp_dates_tbl(j));
665 END LOOP;
666 END IF;
667 l_child_ue_ids_tbl.DELETE;
668 l_instance_ids_tbl.DELETE;
669 l_mr_ids_tbl.DELETE;
670 l_accomp_dates_tbl.DELETE;
674
671 i := l_accomplishment_ids_tbl.NEXT(i);
672
673 END LOOP; -- For all Open Accomplishments
675 -- Standard check of p_commit
676 IF FND_API.TO_BOOLEAN(p_commit) THEN
677 COMMIT WORK;
678 END IF;
679
680 -- Standard call to get message count and if count is 1, get message info
681 FND_MSG_PUB.Count_And_Get
682 ( p_count => x_msg_count,
683 p_data => x_msg_data,
684 p_encoded => fnd_api.g_false
685 );
686
687 IF (l_log_procedure >= l_log_current_level) THEN
688 FND_LOG.STRING(l_log_procedure, L_FULL_NAME || '.end', 'End Procedure');
689 END IF;
690
691 EXCEPTION
692 WHEN FND_API.G_EXC_ERROR THEN
693 Rollback to accomplish_osp_mrs_pvt;
694 x_return_status := FND_API.G_RET_STS_ERROR;
695 FND_MSG_PUB.count_and_get( p_count => x_msg_count,
696 p_data => x_msg_data,
697 p_encoded => fnd_api.g_false);
698 IF (FND_LOG.LEVEL_EXCEPTION >= l_log_current_level) THEN
699 FND_LOG.STRING(FND_LOG.LEVEL_EXCEPTION, L_FULL_NAME, 'Execution Exception: ' || x_msg_data);
700 END IF;
701
702 WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
703 Rollback to accomplish_osp_mrs_pvt;
704 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
705 FND_MSG_PUB.count_and_get( p_count => x_msg_count,
706 p_data => x_msg_data,
707 p_encoded => fnd_api.g_false);
708
709 IF (FND_LOG.LEVEL_UNEXPECTED >= l_log_current_level) THEN
710 FND_LOG.STRING(FND_LOG.LEVEL_UNEXPECTED, L_FULL_NAME, 'Unexpected Exception: ' || x_msg_data);
711 END IF;
712
713 WHEN OTHERS THEN
714 Rollback to accomplish_osp_mrs_pvt;
715 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
716 IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR) THEN
717 fnd_msg_pub.add_exc_msg(p_pkg_name => G_PKG_NAME,
718 p_procedure_name => l_api_name,
719 p_error_text => SUBSTR(SQLERRM,1,500));
720 END IF;
721 FND_MSG_PUB.count_and_get( p_count => x_msg_count,
722 p_data => x_msg_data,
723 p_encoded => fnd_api.g_false);
724
725 IF (FND_LOG.LEVEL_UNEXPECTED >= l_log_current_level) THEN
726 FND_LOG.STRING(FND_LOG.LEVEL_UNEXPECTED, L_FULL_NAME, 'Other Exception: ' || x_msg_data);
727 END IF;
728
729 END accomplish_osp_mrs;
730
731 ----------------------------------------------------------------------------------------
732 -- Start of Comments --
733 -- Function name : Is_Received_Inst_Same
734 -- Type : Public
735 -- Functionality : Function to determine if the received instance is same as the recorded accomplishment instance.
736 -- It returns FND_API.G_TRUE if same and FND_API.G_FALSE if different.
737 -- It returns FND_API.G_TRUE if there has been no receipt also.
738 -- Pre-reqs :
739 --
740 -- Parameters:
741 --
742 -- p_osp_order_line_id IN NUMBER OSP Order Line Id
743 --
744 -- Version:
745 --
746 -- Initial Version 1.0
747 --
748 -- End of Comments --
749 ----------------------------------------------------------------------------------------
750 FUNCTION Is_Received_Inst_Same (
751 p_osp_order_line_id IN NUMBER
752 )
753 RETURN VARCHAR2 IS
754
755 -- Cursor to get the instances for which accomplishments are recorded
756 CURSOR get_recorded_instances_csr IS
757 SELECT distinct ITEM_INSTANCE_ID
758 FROM AHL_OSP_ACCOMPLISHMENTS
759 WHERE osp_order_line_id = p_osp_order_line_id;
760
761 CURSOR get_received_quantity_csr IS
762 SELECT OEL.shipped_quantity
763 FROM AHL_OSP_ORDER_LINES OSPL, OE_ORDER_LINES_ALL OEL
764 WHERE OSPL.OSP_ORDER_LINE_ID = p_osp_order_line_id
765 AND OEL.line_id = OSPL.OE_RETURN_LINE_ID;
766
767 CURSOR get_received_instance_csr IS
768 SELECT tld.instance_id
769 FROM csi_t_transaction_lines tl,
770 csi_t_txn_line_details tld,
771 ahl_osp_order_lines ospl
772 WHERE ospl.osp_order_line_id = p_osp_order_line_id
773 AND tl.source_transaction_id = ospl.oe_return_line_id
774 AND tl.source_transaction_table = 'OE_ORDER_LINES_ALL'
775 AND tld.transaction_line_id = tl.transaction_line_id;
776
777 CURSOR get_instance_descendants_csr (c_instance_id NUMBER) IS
778 SELECT c_instance_id from DUAL
779 UNION
780 SELECT subject_id from csi_ii_relationships
781 WHERE relationship_type_code = 'COMPONENT-OF'
782 AND NVL(ACTIVE_START_DATE, SYSDATE - 1) <= SYSDATE
783 AND NVL(ACTIVE_END_DATE, SYSDATE + 1) > SYSDATE
784 START WITH object_id = c_instance_id
788 connect by object_id = prior subject_id
785 AND relationship_type_code = 'COMPONENT-OF'
786 AND NVL(ACTIVE_START_DATE, SYSDATE - 1) <= SYSDATE
787 AND NVL(ACTIVE_END_DATE, SYSDATE + 1) > SYSDATE
789 AND relationship_type_code = 'COMPONENT-OF'
790 AND NVL(ACTIVE_START_DATE, SYSDATE - 1) <= SYSDATE
791 AND NVL(ACTIVE_END_DATE, SYSDATE + 1) > SYSDATE;
792
793
794 --
795 L_API_NAME CONSTANT VARCHAR2(30) := 'Is_Received_Inst_Same';
796 L_FULL_NAME CONSTANT VARCHAR2(100) := G_LOG_PREFIX || '.' || L_API_NAME;
797
798 l_received_quantity NUMBER;
799 l_received_instance_id NUMBER;
800 TYPE NUM_TBL_TYPE IS TABLE OF NUMBER INDEX BY BINARY_INTEGER;
801 l_instance_ids_tbl NUM_TBL_TYPE;
802 l_rcv_instance_ids_tbl NUM_TBL_TYPE;
803 i NUMBER;
804 j NUMBER;
805 l_curr_inst_id NUMBER;
806 l_found_flag BOOLEAN;
807
808 oe_header_id AHL_OSP_ORDERS_B.oe_header_id%TYPE;
809 l_oe_line_id OE_ORDER_LINES_ALL.line_id%TYPE;
810 l_dummy VARCHAR2(1);
811 --
812
813 BEGIN
814 IF (l_log_procedure >= l_log_current_level) THEN
815 FND_LOG.string(l_log_procedure, L_FULL_NAME||'.begin', 'Function called with p_osp_order_line_id: ' || p_osp_order_line_id);
816 END IF;
817
818 OPEN get_received_quantity_csr;
819 FETCH get_received_quantity_csr INTO l_received_quantity;
820 CLOSE get_received_quantity_csr;
821
822 IF (l_received_quantity IS NULL OR l_received_quantity < 1) THEN
823 IF (l_log_statement >= l_log_current_level) THEN
824 FND_LOG.string(l_log_statement, L_FULL_NAME, 'Returned quantity for OSP Order Line is ' || l_received_quantity);
825 END IF;
826 -- Return True if there is no receipt
827 RETURN FND_API.G_TRUE;
828 END IF;
829
830 OPEN get_recorded_instances_csr;
831 FETCH get_recorded_instances_csr BULK COLLECT INTO l_instance_ids_tbl;
832 CLOSE get_recorded_instances_csr;
833
834 IF (l_log_statement >= l_log_current_level) THEN
835 FND_LOG.string(l_log_statement, L_FULL_NAME, 'Recorded instances l_instance_ids_tbl.COUNT = ' || l_instance_ids_tbl.COUNT);
836 END IF;
837 IF (l_instance_ids_tbl.COUNT = 0) THEN
838 IF (l_log_statement >= l_log_current_level) THEN
839 FND_LOG.string(l_log_statement, L_FULL_NAME, 'No recorded accomplishments for the OSP Order Line.');
840 END IF;
841 -- Return True if there is no recorded accomplishments
842 RETURN FND_API.G_TRUE;
843 END IF;
844
845 -- Get the received instance
846 OPEN get_received_instance_csr;
847 FETCH get_received_instance_csr INTO l_received_instance_id;
848 CLOSE get_received_instance_csr;
849 IF (l_log_statement >= l_log_current_level) THEN
850 FND_LOG.string(l_log_statement, L_FULL_NAME, 'Received instance for OSP Order Line is ' || l_received_instance_id);
851 END IF;
852 IF (l_received_instance_id IS NULL) THEN
853 -- Return True if there is no receipt
854 RETURN FND_API.G_TRUE;
855 END IF;
856
857 -- Get the tree of the received instance
858 OPEN get_instance_descendants_csr(l_received_instance_id);
859 FETCH get_instance_descendants_csr BULK COLLECT INTO l_rcv_instance_ids_tbl;
860 CLOSE get_instance_descendants_csr;
861 IF (l_log_statement >= l_log_current_level) THEN
862 FND_LOG.string(l_log_statement, L_FULL_NAME, 'Received Instances l_rcv_instance_ids_tbl.COUNT = ' || l_rcv_instance_ids_tbl.COUNT);
863 END IF;
864
865 IF (l_rcv_instance_ids_tbl.COUNT = 1) THEN
866 IF ((l_instance_ids_tbl.COUNT = 1) AND (l_instance_ids_tbl(l_instance_ids_tbl.FIRST)) = l_received_instance_id) THEN
867 RETURN FND_API.G_TRUE;
868 ELSE
869 RETURN FND_API.G_FALSE;
870 END IF;
871 END IF;
872
873 -- Received instance is an IB Tree
874 i := l_instance_ids_tbl.FIRST;
875 WHILE (i IS NOT NULL) LOOP
876 l_curr_inst_id := l_instance_ids_tbl(i);
877 -- Search for this in the receive instances
878 l_found_flag := false;
879 j := l_rcv_instance_ids_tbl.FIRST;
880 WHILE ((j IS NOT NULL) AND (l_found_flag = false)) LOOP
881 IF (l_rcv_instance_ids_tbl(j) = l_curr_inst_id) THEN
882 l_found_flag := true;
883 END IF;
884 j := l_rcv_instance_ids_tbl.NEXT(j);
885 END LOOP; -- For all received instances
886 IF (l_found_flag = false) THEN
887 IF (l_log_statement >= l_log_current_level) THEN
888 FND_LOG.string(l_log_statement, L_FULL_NAME, 'The instance ' || l_curr_inst_id || ' was not received.');
889 END IF;
890 RETURN FND_API.G_FALSE;
891 END IF;
892
893 i := l_instance_ids_tbl.NEXT(i);
894
895 END LOOP; -- For all recorded instances
896
897 -- All recorded instances were matched
898 RETURN FND_API.G_TRUE;
899
900 END Is_Received_Inst_Same;
901
902
903 END AHL_OSP_ACCOMP_PVT;