DBA Data[Home] [Help]

PACKAGE BODY: APPS.AHL_UMP_UF_PVT

Source


4   --G_DEBUG varchar2(1) := FND_PROFILE.VALUE('AHL_API_FILE_DEBUG_ON');
1 PACKAGE BODY AHL_UMP_UF_PVT AS
2 /* $Header: AHLVUMFB.pls 120.2.12020000.2 2012/12/07 16:13:15 sareepar ship $ */
3 
5   G_DEBUG                VARCHAR2(1)   := AHL_DEBUG_PUB.is_log_enabled;
6   G_PKG_NAME         CONSTANT  VARCHAR2(30) := 'AHL_UMP_UF_PVT';
7   G_APP_NAME         CONSTANT  VARCHAR2(3) := 'AHL';
8 
9 
10 ------------------------------
11 -- Declare Local Procedures --
12 ------------------------------
13 PROCEDURE process_uf_header(
14     p_validation_level IN   NUMBER    := FND_API.G_VALID_LEVEL_FULL,
15     p_x_uf_header_rec  IN OUT NOCOPY AHL_UMP_UF_PVT.uf_header_Rec_type
16     );
17 
18 PROCEDURE convert_uf_header_val_to_id(
22 PROCEDURE convert_unit_header_val_to_id(
19     p_x_uf_header_rec  IN OUT NOCOPY AHL_UMP_UF_PVT.uf_header_rec_type
20     );
21 
23     p_x_uf_header_rec  IN OUT NOCOPY AHL_UMP_UF_PVT.uf_header_rec_type
24     );
25 
26 PROCEDURE convert_part_header_val_to_id(
27     p_x_uf_header_rec  IN OUT NOCOPY AHL_UMP_UF_PVT.uf_header_rec_type
28     );
29 
30 PROCEDURE convert_node_header_val_to_id(
31     p_x_uf_header_rec  IN OUT NOCOPY AHL_UMP_UF_PVT.uf_header_rec_type
32     );
33 
34 PROCEDURE validate_uf_header(
35     p_uf_header_rec    IN AHL_UMP_UF_PVT.uf_header_Rec_type
36     );
37 PROCEDURE validate_uf_header_pm(
38     p_uf_header_rec    IN AHL_UMP_UF_PVT.uf_header_Rec_type
39     );
40 
41 PROCEDURE default_unchanged_uf_header(
42     p_x_uf_header_rec           IN OUT NOCOPY     AHL_UMP_UF_PVT.uf_header_Rec_type
43     );
44 
45 PROCEDURE process_uf_details(
46     p_validation_level IN       NUMBER    := FND_API.G_VALID_LEVEL_FULL,
47     p_uf_header_rec    IN AHL_UMP_UF_PVT.uf_header_Rec_type,
48     p_x_uf_details_tbl IN OUT NOCOPY AHL_UMP_UF_PVT.uf_details_tbl_type
49     );
50 
51 
52 PROCEDURE validate_uf_details(
53     p_uf_header_rec    IN AHL_UMP_UF_PVT.uf_header_Rec_type,
54     p_x_uf_details_tbl IN OUT NOCOPY AHL_UMP_UF_PVT.uf_details_tbl_type
55     );
56 
57 PROCEDURE default_unchanged_uf_details(
58     p_x_uf_details_tbl           IN OUT NOCOPY     AHL_UMP_UF_PVT.uf_details_tbl_type
59     );
60 
61 PROCEDURE validate_utilization_forecast(
62     p_uf_header_rec  IN AHL_UMP_UF_PVT.uf_header_rec_type,
63     x_uf_details_tbl OUT NOCOPY AHL_UMP_UF_PVT.uf_details_tbl_type
64     );
65 
66 PROCEDURE post_process_uf_header(
67     p_uf_header_rec    IN AHL_UMP_UF_PVT.uf_header_Rec_type
68     );
69 
70 ------------------------
71 -- Declare Procedures --
72 ------------------------
73 
74 -- Start of Comments --
75 --  Procedure name    : process_utilization_forecast
76 --  Type              : Public
77 --  Function          : For a given set of utilization forecast header and details, will validate and insert/update
78 --                      the utilization forecast information.
79 --  Pre-reqs    :
80 --  Parameters  :
81 --
82 --  Standard IN  Parameters :
83 --      p_api_version                   IN      NUMBER       Default  1.0
84 --      p_init_msg_list                 IN      VARCHAR2     Default  FND_API.G_TRUE
85 --      p_commit                        IN      VARCHAR2     Default  FND_API.G_FALSE
86 --      p_validation_level              IN      NUMBER       Default  FND_API.G_VALID_LEVEL_FULL
87 --  Standard OUT Parameters :
88 --      x_return_status                 OUT     VARCHAR2               Required
89 --      x_msg_count                     OUT     NUMBER                 Required
90 --      x_msg_data                      OUT     VARCHAR2               Required
91 --
92 --  p_module_type                       IN      VARCHAR2               Required.
93 --
94 --      This parameter indicates the front-end form interface. The default value is 'JSP'. If the value
95 --      is JSP, then this API clears out all id columns and validations are done using the values based
96 --      on which the Id's are populated.
97 --
98 --  process_utilization_forecast Parameters:
99 --
100 --       p_x_uf_header_rec         IN OUT  AHL_UMP_UF_PVT.uf_header_rec_type    Required
101 --         Utilization Forecast Header Details
102 --       p_x_uf_detail_tbl        IN OUT  AHL_UMP_UF_PVT.uf_detail_tbl_type   Required
103 --         Utilization Forecast details
104 --
105 --
106 --  Version :
107 --               Initial Version   1.0
108 --
109 --  End of Comments.
110 
111 PROCEDURE process_utilization_forecast (
112     p_api_version           IN              NUMBER    := 1.0,
113     p_init_msg_list         IN              VARCHAR2  := FND_API.G_FALSE,
114     p_commit                IN              VARCHAR2  := FND_API.G_FALSE,
115     p_validation_level      IN              NUMBER    := FND_API.G_VALID_LEVEL_FULL,
116     p_module_type           IN              VARCHAR2  := NULL,
117     p_x_uf_header_rec       IN OUT  NOCOPY  AHL_UMP_UF_PVT.uf_header_rec_type,
118     p_x_uf_details_tbl      IN OUT  NOCOPY  AHL_UMP_UF_PVT.uf_details_tbl_type,
119     x_return_status         OUT NOCOPY      VARCHAR2,
120     x_msg_count             OUT NOCOPY      NUMBER,
121     x_msg_data              OUT NOCOPY      VARCHAR2)  IS
122 
123   l_api_version      CONSTANT NUMBER := 1.0;
124   l_api_name         CONSTANT VARCHAR2(30) := 'process_utilization_forecast';
125   l_return_status  VARCHAR2(1) := FND_API.G_RET_STS_SUCCESS;
126 
127 BEGIN
128 
129   -- Standard start of API savepoint
130   SAVEPOINT process_uf_pvt;
131 
132   -- Standard call to check for call compatibility
133   IF NOT FND_API.Compatible_API_Call( l_api_version, p_api_version,l_api_name, G_PKG_NAME )
134   THEN
135     RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
136   END IF;
137 
138     -- Initialize message list if p_init_msg_list is set to TRUE
139   IF FND_API.To_Boolean( p_init_msg_list)
140   THEN
141     FND_MSG_PUB.Initialize;
142   END IF;
143 
144   -- Initialize API return status to success
145   x_return_status := FND_API.G_RET_STS_SUCCESS;
146 
147   -- Enable Debug.
148   IF G_DEBUG = 'Y' THEN
149     AHL_DEBUG_PUB.enable_debug;
150   END IF;
151 
152   IF G_DEBUG = 'Y' THEN
153      AHL_DEBUG_PUB.debug('Started processing UF');
154   END IF;
155   -------
156   process_uf_header(
157               p_validation_level => p_validation_level,
158               p_x_uf_header_rec  => p_x_uf_header_rec
159   );
160   -- Check Error Message stack.
164   END IF;
161   x_msg_count := FND_MSG_PUB.count_msg;
162   IF x_msg_count > 0 THEN
163      RAISE  FND_API.G_EXC_ERROR;
165 
166   -- PROCESS UF details
167   IF (p_x_uf_details_tbl.count > 0) THEN
168     process_uf_details(
172     );
169         p_validation_level => p_validation_level,
170         p_uf_header_rec    => p_x_uf_header_rec,
171         p_x_uf_details_tbl => p_x_uf_details_tbl
173   END IF;
174 
175   -- Check Error Message stack.
176   x_msg_count := FND_MSG_PUB.count_msg;
177   IF x_msg_count > 0 THEN
178      RAISE  FND_API.G_EXC_ERROR;
179   END IF;
180 
181 
182   -- post processing to delete header if use unit forecast is 'N' and there are no uf_details.
183   post_process_uf_header(p_uf_header_rec  => p_x_uf_header_rec);
184 
185   -- Check Error Message stack.
186   x_msg_count := FND_MSG_PUB.count_msg;
187   IF x_msg_count > 0 THEN
188      RAISE  FND_API.G_EXC_ERROR;
189   END IF;
190 
191   -- Standard check of p_commit
192   IF FND_API.TO_BOOLEAN(p_commit) THEN
193       COMMIT WORK;
194   END IF;
195 
196   -- Standard call to get message count and if count is 1, get message info
197   FND_MSG_PUB.Count_And_Get
198     ( p_count => x_msg_count,
199       p_data  => x_msg_data,
200       p_encoded => fnd_api.g_false
201     );
202 
203   IF G_DEBUG = 'Y' THEN
204      AHL_DEBUG_PUB.debug('Successfully ending processing UF');
205   END IF;
206 
207   -- Disable debug
208   IF G_DEBUG = 'Y' THEN
209      AHL_DEBUG_PUB.disable_debug;
210   END IF;
211 
212 EXCEPTION
213  WHEN FND_API.G_EXC_ERROR THEN
214    Rollback to process_uf_pvt;
215    x_return_status := FND_API.G_RET_STS_ERROR;
216    FND_MSG_PUB.count_and_get( p_count => x_msg_count,
217                               p_data  => x_msg_data,
218                               p_encoded => fnd_api.g_false);
219    -- Disable debug
220   IF G_DEBUG = 'Y' THEN
221      AHL_DEBUG_PUB.disable_debug;
222   END IF;
223 
224 
225  WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
226    Rollback to process_uf_pvt;
227    x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
228    FND_MSG_PUB.count_and_get( p_count => x_msg_count,
229                               p_data  => x_msg_data,
230                               p_encoded => fnd_api.g_false);
231    -- Disable debug
232   IF G_DEBUG = 'Y' THEN
233      AHL_DEBUG_PUB.disable_debug;
234   END IF;
235 
236  WHEN OTHERS THEN
237     Rollback to process_uf_pvt;
238     x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
239     IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR) THEN
240        fnd_msg_pub.add_exc_msg(p_pkg_name       => G_PKG_NAME,
241                                p_procedure_name => l_api_name,
242                                p_error_text     => SUBSTR(SQLERRM,1,500));
243     END IF;
244     FND_MSG_PUB.count_and_get( p_count => x_msg_count,
245                                p_data  => x_msg_data,
246                                p_encoded => fnd_api.g_false);
247     -- Disable debug
248     IF G_DEBUG = 'Y' THEN
249        AHL_DEBUG_PUB.disable_debug;
250     END IF;
251 
252 
253 END process_utilization_forecast;
254 
255 ----------------------------------------------------------
256 -- This procedure processes uf_header_rec
257 ----------------------------------------------------------
258 PROCEDURE process_uf_header(
259     p_validation_level IN   NUMBER    := FND_API.G_VALID_LEVEL_FULL,
263     -- Convert values to ID's for header rec
260     p_x_uf_header_rec  IN OUT NOCOPY AHL_UMP_UF_PVT.uf_header_Rec_type
261     ) IS
262 BEGIN
264     IF (p_validation_level = FND_API.G_VALID_LEVEL_FULL )
265     THEN
266         convert_uf_header_val_to_id(p_x_uf_header_rec => p_x_uf_header_rec);
267     END IF;
268 
269     IF (AHL_UTIL_PKG.is_pm_installed() = 'N')
270     THEN
271         validate_uf_header(p_uf_header_rec => p_x_uf_header_rec);
272     ELSE
273         validate_uf_header_pm(p_uf_header_rec => p_x_uf_header_rec);
274     END IF;
275     default_unchanged_uf_header(p_x_uf_header_rec => p_x_uf_header_rec);
276 
277     --save uf header now
278     IF(p_x_uf_header_rec.operation_flag = AHL_UMP_UF_PVT.G_OP_CREATE) THEN
279         --setting object version number for create
280         p_x_uf_header_rec.object_version_number := 1;
281         --setting up user/create/update information
282         p_x_uf_header_rec.created_by := fnd_global.user_id;
283         p_x_uf_header_rec.creation_date := SYSDATE;
284         p_x_uf_header_rec.last_updated_by := fnd_global.user_id;
285         p_x_uf_header_rec.last_update_date := SYSDATE;
286         p_x_uf_header_rec.last_update_login := fnd_global.user_id;
287 
288         AHL_UF_HEADERS_PKG.insert_row(
289         x_uf_header_id => p_x_uf_header_rec.uf_header_id,
290         x_object_version_number => p_x_uf_header_rec.object_version_number,
291         x_created_by => p_x_uf_header_rec.created_by,
292         x_creation_date => p_x_uf_header_rec.creation_date,
293         x_last_updated_by => p_x_uf_header_rec.last_updated_by,
294         x_last_update_date => p_x_uf_header_rec.last_update_date,
295         x_last_update_login => p_x_uf_header_rec.last_update_login,
296         x_unit_config_header_id => p_x_uf_header_rec.unit_config_header_id,
297         x_pc_node_id => p_x_uf_header_rec.pc_node_id,
298         x_inventory_item_id => p_x_uf_header_rec.inventory_item_id,
299         x_inventory_org_id => p_x_uf_header_rec.inventory_org_id,
300         x_csi_item_instance_id => p_x_uf_header_rec.csi_item_instance_id,
301         x_use_unit_flag => p_x_uf_header_rec.use_unit_flag,
302         x_attribute_category => p_x_uf_header_rec.attribute_category,
303         x_attribute1 => p_x_uf_header_rec.attribute1,
304         x_attribute2 => p_x_uf_header_rec.attribute2,
305         x_attribute3 => p_x_uf_header_rec.attribute3,
306         x_attribute4 => p_x_uf_header_rec.attribute4,
307         x_attribute5 => p_x_uf_header_rec.attribute5,
308         x_attribute6 => p_x_uf_header_rec.attribute6,
309         x_attribute7 => p_x_uf_header_rec.attribute7,
310         x_attribute8 => p_x_uf_header_rec.attribute8,
311         x_attribute9 => p_x_uf_header_rec.attribute9,
312         x_attribute10 => p_x_uf_header_rec.attribute10,
313         x_attribute11 => p_x_uf_header_rec.attribute11,
314         x_attribute12 => p_x_uf_header_rec.attribute12,
315         x_attribute13 => p_x_uf_header_rec.attribute13,
316         x_attribute14 => p_x_uf_header_rec.attribute14,
317         x_attribute15 => p_x_uf_header_rec.attribute15
318         );
319     ELSIF (p_x_uf_header_rec.operation_flag = AHL_UMP_UF_PVT.G_OP_UPDATE) THEN
320 
321         -- setting up object version number
322         p_x_uf_header_rec.object_version_number := p_x_uf_header_rec.object_version_number + 1;
323         --setting up user/create/update information
324         p_x_uf_header_rec.last_updated_by := fnd_global.user_id;
325         p_x_uf_header_rec.last_update_date := SYSDATE;
329         x_uf_header_id => p_x_uf_header_rec.uf_header_id,
326         p_x_uf_header_rec.last_update_login := fnd_global.user_id;
327 
328         AHL_UF_HEADERS_PKG.update_row(
330         x_object_version_number => p_x_uf_header_rec.object_version_number,
331         x_last_updated_by => p_x_uf_header_rec.last_updated_by,
332         x_last_update_date => p_x_uf_header_rec.last_update_date,
333         x_last_update_login => p_x_uf_header_rec.last_update_login,
334         x_unit_config_header_id => p_x_uf_header_rec.unit_config_header_id,
335         x_pc_node_id => p_x_uf_header_rec.pc_node_id,
336         x_inventory_item_id => p_x_uf_header_rec.inventory_item_id,
337         x_inventory_org_id => p_x_uf_header_rec.inventory_org_id,
338         x_csi_item_instance_id => p_x_uf_header_rec.csi_item_instance_id,
339         x_use_unit_flag => p_x_uf_header_rec.use_unit_flag,
340         x_attribute_category => p_x_uf_header_rec.attribute_category,
341         x_attribute1 => p_x_uf_header_rec.attribute1,
342         x_attribute2 => p_x_uf_header_rec.attribute2,
343         x_attribute3 => p_x_uf_header_rec.attribute3,
344         x_attribute4 => p_x_uf_header_rec.attribute4,
345         x_attribute5 => p_x_uf_header_rec.attribute5,
346         x_attribute6 => p_x_uf_header_rec.attribute6,
347         x_attribute7 => p_x_uf_header_rec.attribute7,
348         x_attribute8 => p_x_uf_header_rec.attribute8,
349         x_attribute9 => p_x_uf_header_rec.attribute9,
350         x_attribute10 => p_x_uf_header_rec.attribute10,
351         x_attribute11 => p_x_uf_header_rec.attribute11,
352         x_attribute12 => p_x_uf_header_rec.attribute12,
353         x_attribute13 => p_x_uf_header_rec.attribute13,
354         x_attribute14 => p_x_uf_header_rec.attribute14,
355         x_attribute15 => p_x_uf_header_rec.attribute15
356         );
357     END IF;
358 
359 
360 END process_uf_header;
361 
362 ----------------------------------------------------------
363 -- This procedure converts values to ids for uf_header_rec
364 ----------------------------------------------------------
365 PROCEDURE convert_uf_header_val_to_id(
366     p_x_uf_header_rec  IN OUT NOCOPY AHL_UMP_UF_PVT.uf_header_rec_type
367     ) IS
368 
369 BEGIN
370     -- conversion between uf_header_id : unit_config_header_id, inventory_item_id, pc_node_id
371 
372     IF(p_x_uf_header_rec.forecast_type = AHL_UMP_UF_PVT.G_UF_TYPE_UNIT)THEN
373         convert_unit_header_val_to_id(p_x_uf_header_rec);
374     ELSIF (p_x_uf_header_rec.forecast_type = AHL_UMP_UF_PVT.G_UF_TYPE_PART)THEN
375         convert_part_header_val_to_id(p_x_uf_header_rec);
376     ELSIF (p_x_uf_header_rec.forecast_type = AHL_UMP_UF_PVT.G_UF_TYPE_PC_NODE)THEN
377         convert_node_header_val_to_id(p_x_uf_header_rec);
378     END IF;
379 
380     IF FND_MSG_PUB.count_msg > 0 THEN
381         RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
382     END IF;
383 
384 END convert_uf_header_val_to_id;
385 
386 ----------------------------------------------------------------------------------------
387 -- This procedure converts values to ids for uf_header_rec for unit utilization forecast
388 ----------------------------------------------------------------------------------------
389 PROCEDURE convert_unit_header_val_to_id(
390     p_x_uf_header_rec  IN OUT NOCOPY AHL_UMP_UF_PVT.uf_header_rec_type
391     )IS
392 
393 l_uf_header_id          NUMBER;
394 l_unit_config_header_id NUMBER;
395 
396 CURSOR unit_config_header_id_csr(p_unit_name IN VARCHAR2) IS
397 SELECT unit_config_header_id
398 FROM ahl_unit_config_headers
399 WHERE name = p_unit_name;
400 
401 CURSOR uf_header_id_uid_csr(p_unit_config_header_id IN NUMBER) IS
402 SELECT uf_header_id
403 FROM ahl_uf_headers
404 WHERE unit_config_header_id = p_unit_config_header_id;
405 
406 BEGIN
407 
408     IF(p_x_uf_header_rec.uf_header_id IS NULL) THEN
409         IF(p_x_uf_header_rec.unit_config_header_id IS NULL AND p_x_uf_header_rec.unit_name IS NULL) THEN
410             FND_MESSAGE.Set_Name(G_APP_NAME,'AHL_UMP_UF_UFHID_UCHID_NLL');
411             FND_MSG_PUB.ADD;
412         ELSIF (p_x_uf_header_rec.unit_config_header_id IS NULL AND p_x_uf_header_rec.unit_name IS NOT NULL) THEN
413             OPEN unit_config_header_id_csr(p_x_uf_header_rec.unit_name);
414             FETCH unit_config_header_id_csr INTO l_unit_config_header_id;
415             IF(unit_config_header_id_csr%NOTFOUND) THEN
416                FND_MESSAGE.Set_Name(G_APP_NAME,'AHL_UMP_UF_UNIT_INV');
417                FND_MSG_PUB.ADD;
418             ELSE
419                p_x_uf_header_rec.unit_config_header_id := l_unit_config_header_id;
420             END IF;
421             CLOSE unit_config_header_id_csr;
422         END IF;
423         --fetching uf_header_id based on unit_config_header_id
424         IF (p_x_uf_header_rec.unit_config_header_id IS NOT NULL AND
425                 p_x_uf_header_rec.operation_flag <> AHL_UMP_UF_PVT.G_OP_CREATE) THEN
426             OPEN uf_header_id_uid_csr(p_x_uf_header_rec.unit_config_header_id);
427             FETCH uf_header_id_uid_csr INTO l_uf_header_id;
428             IF(uf_header_id_uid_csr%NOTFOUND)THEN
429                FND_MESSAGE.Set_Name(G_APP_NAME,'AHL_UMP_UF_INVOP_HREC_NOTINDB');
430                FND_MSG_PUB.ADD;
431             ELSE
432                p_x_uf_header_rec.uf_header_id := l_uf_header_id;
436     END IF;
433             END IF;
434             CLOSE uf_header_id_uid_csr;
435         END IF;
437 
438 END convert_unit_header_val_to_id;
439 
440 ----------------------------------------------------------------------------------------
441 -- This procedure converts values to ids for uf_header_rec for part/item utilization forecast
442 ----------------------------------------------------------------------------------------
443 PROCEDURE convert_part_header_val_to_id(
444     p_x_uf_header_rec  IN OUT NOCOPY AHL_UMP_UF_PVT.uf_header_rec_type
445     )IS
446 
447 l_uf_header_id          NUMBER;
448 l_inventory_item_id     NUMBER;
449 
450 CURSOR inventory_item_id_csr(p_inventory_item_name IN VARCHAR2) IS
451 SELECT inventory_item_id
452 FROM mtl_system_items_kfv
453 WHERE concatenated_segments = p_inventory_item_name;
454 
455 
456 CURSOR uf_header_id_pid_csr(p_inventory_item_id IN NUMBER) IS
457 SELECT uf_header_id
458 FROM ahl_uf_headers
459 WHERE inventory_item_id = p_inventory_item_id;
460 
461 
462 BEGIN
463     IF(p_x_uf_header_rec.uf_header_id IS NULL) THEN
464         IF(p_x_uf_header_rec.inventory_item_id IS NULL AND p_x_uf_header_rec.inventory_item_name IS NULL) THEN
465             FND_MESSAGE.Set_Name(G_APP_NAME,'AHL_UMP_UF_UFH_INVID_NLL');
466             FND_MSG_PUB.ADD;
467         ELSIF (p_x_uf_header_rec.inventory_item_id IS NULL AND p_x_uf_header_rec.inventory_item_name IS NOT NULL) THEN
468             OPEN inventory_item_id_csr(p_x_uf_header_rec.inventory_item_name);
469             FETCH inventory_item_id_csr INTO l_inventory_item_id;
470             IF(inventory_item_id_csr%NOTFOUND) THEN
471                FND_MESSAGE.Set_Name(G_APP_NAME,'AHL_UMP_UF_PART_INV');
472                FND_MSG_PUB.ADD;
473             ELSE
474                p_x_uf_header_rec.inventory_item_id := l_inventory_item_id;
475             END IF;
476             CLOSE inventory_item_id_csr;
477         END IF;
478         --fetching uf_header_id based on inventory_item_id
479         IF (p_x_uf_header_rec.inventory_item_id IS NOT NULL AND
480                 p_x_uf_header_rec.operation_flag <> AHL_UMP_UF_PVT.G_OP_CREATE) THEN
481             OPEN uf_header_id_pid_csr(p_x_uf_header_rec.inventory_item_id);
482             FETCH uf_header_id_pid_csr INTO l_uf_header_id;
483             IF(uf_header_id_pid_csr%NOTFOUND)THEN
484                FND_MESSAGE.Set_Name(G_APP_NAME,'AHL_UMP_UF_INVOP_HREC_NOTINDB');
485                FND_MSG_PUB.ADD;
486             ELSE
487                p_x_uf_header_rec.uf_header_id := l_uf_header_id;
488             END IF;
489             CLOSE uf_header_id_pid_csr;
490         END IF;
491     END IF;
492 END convert_part_header_val_to_id;
493 
494 ----------------------------------------------------------------------------------------
495 -- This procedure converts values to ids for uf_header_rec for pc node utilization forecast
496 ----------------------------------------------------------------------------------------
497 PROCEDURE convert_node_header_val_to_id(
498     p_x_uf_header_rec  IN OUT NOCOPY AHL_UMP_UF_PVT.uf_header_rec_type
499     )IS
500 
501 CURSOR uf_header_id_nid_csr(p_pc_node_id IN NUMBER) IS
502 SELECT uf_header_id
503 FROM ahl_uf_headers
504 WHERE pc_node_id = p_pc_node_id;
505 
506 l_uf_header_id          NUMBER;
507 
508 
509 BEGIN
510     IF p_x_uf_header_rec.operation_flag <> AHL_UMP_UF_PVT.G_OP_CREATE THEN
511         IF(p_x_uf_header_rec.uf_header_id IS NULL) THEN
512             IF(p_x_uf_header_rec.pc_node_id IS NULL) THEN
513                 FND_MESSAGE.Set_Name(G_APP_NAME,'AHL_UMP_UF_UFH_NODEID_NLL');
514                 FND_MSG_PUB.ADD;
515             ELSE
516                 OPEN uf_header_id_nid_csr(p_x_uf_header_rec.pc_node_id);
517                 FETCH uf_header_id_nid_csr INTO l_uf_header_id;
518                 IF(uf_header_id_nid_csr%NOTFOUND)THEN
519                    FND_MESSAGE.Set_Name(G_APP_NAME,'AHL_UMP_UF_INVOP_HREC_NOTINDB');
520                    FND_MSG_PUB.ADD;
521                 ELSE
522                     p_x_uf_header_rec.uf_header_id := l_uf_header_id;
523                 END IF;
524                 CLOSE uf_header_id_nid_csr;
525             END IF;
526         END IF;
527     END IF;
528 
529 END convert_node_header_val_to_id;
530 
531 ------------------------------------------------------------------------
532 -- This procedure does the following validations for uf_header_rec
533 -- check whether forecast type is AHL_UMP_UF_PVT.G_UF_TYPE_UNIT,AHL_UMP_UF_PVT.G_UF_TYPE_PART or AHL_UMP_UF_PVT.G_UF_TYPE_PC_NODE
534 -- check of uf_header_id , if null, verify operation flag is create AHL_UMP_UF_PVT.G_OP_CREATE, else AHL_UMP_UF_PVT.G_UF_TYPE_UNIT
535 -- check for object version number if latest. If uf_header_id is null, it should be null too.
536 -- for forecast type U : Unit
537 --        validate whether this unit is a complete Unit Configuration.
538 --        validate whether this unit is attached to a complete primary PC.
539 --        validate whether use unit flag is not null
540 -- for forecast type P : Part
541 --        validate whether this part is in inventory.A VALID Part
542 --        validate whether this part is attached to a complete primary PC.
543 --        use unit flag should be null.
544 -- for forecast type N : Node
545 --        validate whether this node is defined in PC nodes table.
546 --        validate whether this node is attached to a complete primary PC.
547 --        use unit flag should be null.
548 -------------------------------------------------------------------------
549 PROCEDURE validate_uf_header(
550     p_uf_header_rec    IN AHL_UMP_UF_PVT.uf_header_Rec_type
551     ) IS
552 
556     WHERE uf_header_id = p_uf_header_id;
553     CURSOR uf_header_csr (p_uf_header_id  IN  NUMBER) IS
554     SELECT object_version_number, unit_config_header_id,pc_node_id,inventory_item_id,inventory_org_id,use_unit_flag
555     FROM ahl_uf_headers
557 
558 
559     l_object_version_number NUMBER;
560     l_unit_config_header_id NUMBER;
561     l_pc_node_id NUMBER;
562     l_inventory_item_id NUMBER;
563     l_inventory_org_id NUMBER;
564     l_use_unit_flag ahl_uf_headers.use_unit_flag%TYPE;
565 
566     CURSOR unit_status_check_csr(p_unit_config_header_id IN NUMBER) IS
567     SELECT UCH.unit_config_status_code
568     FROM ahl_unit_config_headers UCH
569     WHERE (UCH.active_end_date IS NULL OR TRUNC(UCH.active_end_date) > TRUNC(SYSDATE))
570     AND UCH.unit_config_header_id = p_unit_config_header_id;
571 
572     l_unit_config_status_code ahl_unit_header_details_v.unit_config_status_code%TYPE;
573 
574     CURSOR part_check_csr(p_inventory_item_id IN NUMBER) IS
575     SELECT 'x'
576     FROM mtl_system_items_kfv
577     WHERE inventory_item_id = p_inventory_item_id;
578 
579     l_exists VARCHAR2(1);
580 
581     CURSOR pc_status_check_up_csr(p_unit_item_id IN NUMBER,p_association_type IN VARCHAR2) IS
582     SELECT a.primary_flag,a.status
583     FROM ahl_pc_headers_b a, ahl_pc_nodes_b b, ahl_pc_associations c
584     WHERE a.pc_header_id = b.pc_header_id AND b.pc_node_id = c.pc_node_id AND
585     a.primary_flag = G_PC_PRIMARY_FLAG AND
586     a.status = G_COMPLETE_STATUS AND
587     c.association_type_flag = p_association_type AND
588     c.unit_item_id = p_unit_item_id;
589 
590     CURSOR pc_status_check_n_csr(p_pc_node_id IN NUMBER) IS
591     SELECT a.primary_flag,a.status
592     FROM ahl_pc_headers_b a, ahl_pc_nodes_b b
593     WHERE a.pc_header_id = b.pc_header_id
594     AND b.pc_node_id = p_pc_node_id;
595 
596     l_pc_primary_flag ahl_pc_headers_b.primary_flag%TYPE;
597     l_pc_status ahl_pc_headers_b.status%TYPE;
598 
599 BEGIN
600 
601     -- Operation Flag and Header ID validation.
602     IF (p_uf_header_rec.forecast_type NOT IN(AHL_UMP_UF_PVT.G_UF_TYPE_UNIT,AHL_UMP_UF_PVT.G_UF_TYPE_PART,AHL_UMP_UF_PVT.G_UF_TYPE_PC_NODE))THEN
603         FND_MESSAGE.Set_Name(G_APP_NAME,'AHL_UMP_UF_INV_UF_TYPE');
604         FND_MSG_PUB.ADD;
605     ELSIF (p_uf_header_rec.operation_flag IS NOT NULL AND p_uf_header_rec.operation_flag NOT IN(AHL_UMP_UF_PVT.G_OP_CREATE,AHL_UMP_UF_PVT.G_OP_UPDATE,AHL_UMP_UF_PVT.G_OP_DELETE))THEN
606         FND_MESSAGE.Set_Name(G_APP_NAME,'AHL_UMP_UF_INVOP_HEADER');
607         FND_MSG_PUB.ADD;
611         FND_MSG_PUB.ADD;
608     ELSIF ((p_uf_header_rec.uf_header_id IS NULL)
609             AND (p_uf_header_rec.operation_flag IS NULL OR p_uf_header_rec.operation_flag = AHL_UMP_UF_PVT.G_OP_UPDATE)) THEN
610         FND_MESSAGE.Set_Name(G_APP_NAME,'AHL_UMP_UF_INVOP_UFHID_NLL');
612     ELSIF(p_uf_header_rec.operation_flag = AHL_UMP_UF_PVT.G_OP_CREATE AND
613           p_uf_header_rec.uf_header_id IS NOT NULL ) THEN
614         FND_MESSAGE.Set_Name(G_APP_NAME,'AHL_UMP_UF_INVOP_UFHID_N_NLL');
615         FND_MSG_PUB.ADD;
616     END IF;
617 
618 
619 
620     IF(FND_MSG_PUB.count_msg > 0)THEN
621         RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
622     END IF;
623 
624     IF (( p_uf_header_rec.operation_flag IS NULL OR p_uf_header_rec.operation_flag <> AHL_UMP_UF_PVT.G_OP_CREATE) AND p_uf_header_rec.uf_header_id IS NOT NULL)THEN
625         OPEN  uf_header_csr(p_uf_header_rec.uf_header_id);
626         FETCH uf_header_csr INTO l_object_version_number, l_unit_config_header_id,l_pc_node_id,l_inventory_item_id,l_inventory_org_id,l_use_unit_flag;
627         IF (uf_header_csr%NOTFOUND) THEN
628             FND_MESSAGE.Set_Name(G_APP_NAME,'AHL_UMP_UF_INVOP_HREC_NOTINDB');
629             FND_MSG_PUB.ADD;
630         ELSIF (l_object_version_number <> p_uf_header_rec.object_version_number)THEN
631             FND_MESSAGE.Set_Name(G_APP_NAME,'AHL_UMP_UF_HREC_OBJV_MIS');
632             FND_MSG_PUB.ADD;
633         END IF;
634         CLOSE uf_header_csr;
635 
636         IF(FND_MSG_PUB.count_msg > 0)THEN
637             RAISE  FND_API.G_EXC_ERROR;
638         END IF;
639 
640         IF(p_uf_header_rec.forecast_type = AHL_UMP_UF_PVT.G_UF_TYPE_UNIT) THEN
641             IF(p_uf_header_rec.unit_config_header_id = FND_API.G_MISS_NUM)THEN
642                FND_MESSAGE.Set_Name(G_APP_NAME,'AHL_UMP_UF_UFHID_UCHID_NLL');
643                FND_MSG_PUB.ADD;
644             ELSIF (p_uf_header_rec.unit_config_header_id IS NOT NULL AND
645                    p_uf_header_rec.unit_config_header_id <> l_unit_config_header_id )THEN                FND_MESSAGE.Set_Name(G_APP_NAME,'AHL_UMP_UF_UCHID_MIS');
646                FND_MSG_PUB.ADD;
647             ELSE
648                 OPEN unit_status_check_csr(l_unit_config_header_id);
652                     FND_MSG_PUB.ADD;
649                 FETCH unit_status_check_csr INTO l_unit_config_status_code;
650                 IF (unit_status_check_csr%NOTFOUND) THEN
651                     FND_MESSAGE.Set_Name(G_APP_NAME,'AHL_UMP_UF_UNIT_INV');
653                 ELSIF (l_unit_config_status_code = AHL_UMP_UF_PVT.G_DRAFT_STATUS)THEN
654                     FND_MESSAGE.Set_Name(G_APP_NAME,'AHL_UMP_UF_UC_STATUS_DRAFT');
655                     FND_MSG_PUB.ADD;
656                 END IF;
657                 CLOSE unit_status_check_csr;
658 
659                 OPEN pc_status_check_up_csr(l_unit_config_header_id,AHL_UMP_UF_PVT.G_PC_UNIT_ASSOCIATION);
660                 FETCH pc_status_check_up_csr INTO l_pc_primary_flag,l_pc_status;
661                 IF (pc_status_check_up_csr%NOTFOUND) THEN
662                     FND_MESSAGE.Set_Name(G_APP_NAME,'AHL_UMP_UF_UNIT_PC_INV');
663                     FND_MSG_PUB.ADD;
664                 ELSIF (l_pc_primary_flag <> AHL_UMP_UF_PVT.G_PC_PRIMARY_FLAG OR l_pc_status <> AHL_UMP_UF_PVT.G_COMPLETE_STATUS) THEN
665                     FND_MESSAGE.Set_Name(G_APP_NAME,'AHL_UMP_UF_UNIT_PC_INV');
666                     FND_MSG_PUB.ADD;
667                 END IF;
668                 CLOSE pc_status_check_up_csr;
669 
670 
671             END IF;
672         ELSIF(p_uf_header_rec.forecast_type = AHL_UMP_UF_PVT.G_UF_TYPE_PART) THEN
673             IF(p_uf_header_rec.inventory_item_id = FND_API.G_MISS_NUM)THEN
674                FND_MESSAGE.Set_Name(G_APP_NAME,'AHL_UMP_UF_UFH_INVID_NLL');
675                FND_MSG_PUB.ADD;
676             ELSIF (p_uf_header_rec.inventory_item_id IS NOT NULL AND
677                    p_uf_header_rec.inventory_item_id <> l_inventory_item_id )THEN
678                FND_MESSAGE.Set_Name(G_APP_NAME,'AHL_UMP_UF_INVID_MIS');
679                FND_MSG_PUB.ADD;
680             ELSE
681                 OPEN part_check_csr(l_inventory_item_id);
682                 FETCH part_check_csr INTO l_exists;
683                 IF (part_check_csr%NOTFOUND) THEN
684                     FND_MESSAGE.Set_Name(G_APP_NAME,'AHL_UMP_UF_PART_INV');
685                     FND_MSG_PUB.ADD;
686                 END IF;
687                 CLOSE part_check_csr;
688 
689                 OPEN pc_status_check_up_csr(l_inventory_item_id,AHL_UMP_UF_PVT.G_PC_ITEM_ASSOCIATION);
690                 FETCH pc_status_check_up_csr INTO l_pc_primary_flag,l_pc_status;
691                 IF (pc_status_check_up_csr%NOTFOUND) THEN
692                     FND_MESSAGE.Set_Name(G_APP_NAME,'AHL_UMP_UF_PART_PC_INV');
693                     FND_MSG_PUB.ADD;
694                 ELSIF (l_pc_primary_flag <> AHL_UMP_UF_PVT.G_PC_PRIMARY_FLAG OR l_pc_status <> AHL_UMP_UF_PVT.G_COMPLETE_STATUS) THEN
695                     FND_MESSAGE.Set_Name(G_APP_NAME,'AHL_UMP_UF_PART_PC_INV');
696                     FND_MSG_PUB.ADD;
697                 END IF;
698                 CLOSE pc_status_check_up_csr;
699 
700             END IF;
701         ELSIF(p_uf_header_rec.forecast_type = AHL_UMP_UF_PVT.G_UF_TYPE_PC_NODE) THEN
702             IF(p_uf_header_rec.pc_node_id = FND_API.G_MISS_NUM)THEN
703                FND_MESSAGE.Set_Name(G_APP_NAME,'AHL_UMP_UF_UFH_NODEID_NLL');
704                FND_MSG_PUB.ADD;
705             ELSIF (p_uf_header_rec.pc_node_id IS NOT NULL AND
706                    p_uf_header_rec.pc_node_id <> l_pc_node_id )THEN
707                FND_MESSAGE.Set_Name(G_APP_NAME,'AHL_UMP_UF_NODEID_MIS');
708                FND_MSG_PUB.ADD;
709             ELSE
710                 OPEN pc_status_check_n_csr(l_pc_node_id);
711                 FETCH pc_status_check_n_csr INTO l_pc_primary_flag,l_pc_status;
712                 IF (pc_status_check_n_csr%NOTFOUND) THEN
713                     FND_MESSAGE.Set_Name(G_APP_NAME,'AHL_UMP_UF_NODE_PC_INV');
714                     FND_MSG_PUB.ADD;
715                 ELSIF (l_pc_primary_flag <> AHL_UMP_UF_PVT.G_PC_PRIMARY_FLAG OR l_pc_status <> AHL_UMP_UF_PVT.G_COMPLETE_STATUS) THEN
716                     FND_MESSAGE.Set_Name(G_APP_NAME,'AHL_UMP_UF_NODE_PC_INV');
717                     FND_MSG_PUB.ADD;
718                 END IF;
719                 CLOSE pc_status_check_n_csr;
720 
721             END IF;
722         END IF;
723     ELSIF (p_uf_header_rec.operation_flag = AHL_UMP_UF_PVT.G_OP_CREATE AND
724             p_uf_header_rec.uf_header_id IS NULL)THEN
725         IF(p_uf_header_rec.forecast_type = AHL_UMP_UF_PVT.G_UF_TYPE_UNIT) THEN
726             IF(p_uf_header_rec.unit_config_header_id IS NULL OR
727                p_uf_header_rec.unit_config_header_id = FND_API.G_MISS_NUM) THEN
728                FND_MESSAGE.Set_Name(G_APP_NAME,'AHL_UMP_UF_UFHID_UCHID_NLL');
729                FND_MSG_PUB.ADD;
730             ELSE
734                    FND_MESSAGE.Set_Name(G_APP_NAME,'AHL_UMP_UF_UNIT_INV');
731                OPEN unit_status_check_csr(p_uf_header_rec.unit_config_header_id);
732                FETCH unit_status_check_csr INTO l_unit_config_status_code;
733                IF (unit_status_check_csr%NOTFOUND) THEN
735                    FND_MSG_PUB.ADD;
736                ELSIF (l_unit_config_status_code = AHL_UMP_UF_PVT.G_DRAFT_STATUS)THEN
737                    FND_MESSAGE.Set_Name(G_APP_NAME,'AHL_UMP_UF_UC_STATUS_DRAFT');
738                    FND_MSG_PUB.ADD;
739                END IF;
740                CLOSE unit_status_check_csr;
741 
742                OPEN pc_status_check_up_csr(p_uf_header_rec.unit_config_header_id, AHL_UMP_UF_PVT.G_PC_UNIT_ASSOCIATION);
743                FETCH pc_status_check_up_csr INTO l_pc_primary_flag,l_pc_status;
744                IF (pc_status_check_up_csr%NOTFOUND) THEN
745                    FND_MESSAGE.Set_Name(G_APP_NAME,'AHL_UMP_UF_UNIT_PC_INV');
746                    FND_MSG_PUB.ADD;
747                ELSIF (l_pc_primary_flag <> AHL_UMP_UF_PVT.G_PC_PRIMARY_FLAG OR l_pc_status <> AHL_UMP_UF_PVT.G_COMPLETE_STATUS) THEN
748                    FND_MESSAGE.Set_Name(G_APP_NAME,'AHL_UMP_UF_UNIT_PC_INV');
749                    FND_MSG_PUB.ADD;
750                END IF;
751                CLOSE pc_status_check_up_csr;
752 
753             END IF;
754         ELSIF (p_uf_header_rec.forecast_type = AHL_UMP_UF_PVT.G_UF_TYPE_PART) THEN
755             IF(p_uf_header_rec.inventory_item_id IS NULL OR
756                p_uf_header_rec.inventory_item_id = FND_API.G_MISS_NUM) THEN
757                FND_MESSAGE.Set_Name(G_APP_NAME,'AHL_UMP_UF_UFH_INVID_NLL');
758                FND_MSG_PUB.ADD;
759             ELSE
760                 OPEN part_check_csr(p_uf_header_rec.inventory_item_id);
761                 FETCH part_check_csr INTO l_exists;
762                 IF (part_check_csr%NOTFOUND) THEN
763                     FND_MESSAGE.Set_Name(G_APP_NAME,'AHL_UMP_UF_PART_INV');
764                     FND_MSG_PUB.ADD;
765                 END IF;
766                 CLOSE part_check_csr;
767 
768                 OPEN pc_status_check_up_csr(p_uf_header_rec.inventory_item_id, AHL_UMP_UF_PVT.G_PC_ITEM_ASSOCIATION);
769                 FETCH pc_status_check_up_csr INTO l_pc_primary_flag,l_pc_status;
770                 IF (pc_status_check_up_csr%NOTFOUND) THEN
771                     FND_MESSAGE.Set_Name(G_APP_NAME,'AHL_UMP_UF_PART_PC_INV');
772                     FND_MSG_PUB.ADD;
773                 ELSIF (l_pc_primary_flag <> AHL_UMP_UF_PVT.G_PC_PRIMARY_FLAG OR l_pc_status <> AHL_UMP_UF_PVT.G_COMPLETE_STATUS) THEN
774                     FND_MESSAGE.Set_Name(G_APP_NAME,'AHL_UMP_UF_PART_PC_INV');
775                     FND_MSG_PUB.ADD;
776                 END IF;
777                 CLOSE pc_status_check_up_csr;
778 
779             END IF;
780         ELSIF (p_uf_header_rec.forecast_type = AHL_UMP_UF_PVT.G_UF_TYPE_PC_NODE) THEN
781             IF(p_uf_header_rec.pc_node_id IS NULL OR
782                p_uf_header_rec.pc_node_id = FND_API.G_MISS_NUM) THEN
783                FND_MESSAGE.Set_Name(G_APP_NAME,'AHL_UMP_UF_UFH_NODEID_NLL');
784                FND_MSG_PUB.ADD;
785             ELSE
786                 OPEN pc_status_check_n_csr(p_uf_header_rec.pc_node_id);
787                 FETCH pc_status_check_n_csr INTO l_pc_primary_flag,l_pc_status;
788                 IF (pc_status_check_n_csr%NOTFOUND) THEN
789                     FND_MESSAGE.Set_Name(G_APP_NAME,'AHL_UMP_UF_NODE_PC_INV');
790                     FND_MSG_PUB.ADD;
791                 ELSIF (l_pc_primary_flag <> AHL_UMP_UF_PVT.G_PC_PRIMARY_FLAG OR l_pc_status <> AHL_UMP_UF_PVT.G_COMPLETE_STATUS) THEN
792                     FND_MESSAGE.Set_Name(G_APP_NAME,'AHL_UMP_UF_NODE_PC_INV');
793                     FND_MSG_PUB.ADD;
794                 END IF;
795                 CLOSE pc_status_check_n_csr;
796             END IF;
797         END IF;
798     ELSE
799         FND_MESSAGE.Set_Name(G_APP_NAME,'AHL_UMP_UF_INV_HEADER');
800         FND_MSG_PUB.ADD;
804         RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
801     END IF;
802 
803     IF(FND_MSG_PUB.count_msg > 0)THEN
805     END IF;
806 
807     IF((p_uf_header_rec.use_unit_flag IS NOT NULL OR p_uf_header_rec.use_unit_flag <> FND_API.G_MISS_CHAR)
808         AND p_uf_header_rec.use_unit_flag NOT IN (AHL_UMP_UF_PVT.G_UF_USE_UNIT_DEFAULT,AHL_UMP_UF_PVT.G_UF_USE_UNIT_YES)) THEN
809         FND_MESSAGE.Set_Name(G_APP_NAME,'AHL_UMP_UF_INV_UNT_FLG');
810         FND_MSG_PUB.ADD;
811     END IF;
812 
813     IF(FND_MSG_PUB.count_msg > 0)THEN
814        RAISE  FND_API.G_EXC_ERROR;
815     END IF;
816 
817 
818 END validate_uf_header;
819 ----------------------------------------------------------
820 ------------------------------------------------------------------------
821 -- This procedure does the following validations for uf_header_rec when preventive maintenance is installed
822 -- check whether forecast type is AHL_UMP_UF_PVT.G_UF_TYPE_PART or AHL_UMP_UF_PVT.G_UF_TYPE_INSTANCE
823 -- check of uf_header_id , if null, verify operation flag is create AHL_UMP_UF_PVT.G_OP_CREATE
824 -- check for object version number if latest. If uf_header_id is null, it should be null too.
825 -- for forecast type P : Part
826 --        validate whether this part is in inventory.A VALID Part--
827 --        use unit flag should be "N" or null.
828 -- for forecast type C : Instance
829 --        validate whether this instance is defined in csi instance tables
830 --        validate whether this is an instanc of a valid part.
831 --        use unit flag should be valid.
832 -------------------------------------------------------------------------
833 PROCEDURE validate_uf_header_pm(
834     p_uf_header_rec    IN AHL_UMP_UF_PVT.uf_header_Rec_type
835     ) IS
836 
837     CURSOR uf_header_csr (p_uf_header_id  IN  NUMBER) IS
838     SELECT object_version_number, inventory_item_id,csi_item_instance_id,use_unit_flag
839     FROM ahl_uf_headers
840     WHERE uf_header_id = p_uf_header_id;
841 
842 
843     l_object_version_number NUMBER;
844     l_inventory_item_id NUMBER;
845     l_csi_item_instance_id NUMBER;
846     l_use_unit_flag ahl_uf_headers.use_unit_flag%TYPE;
847 
848     --l_part_number mtl_system_items_kfv.concatenated_segments%TYPE;
849 
850     CURSOR part_check_csr(p_inventory_item_id IN NUMBER) IS
851     SELECT 'x'
852     FROM mtl_system_items_kfv
853     WHERE inventory_item_id = p_inventory_item_id;
854 
855     l_exists VARCHAR2(1);
856 
857     CURSOR instance_check_csr(p_csi_item_instance_id IN NUMBER) IS
858     SELECT 'x'
859     FROM csi_item_instances
860     WHERE instance_id = p_csi_item_instance_id;
861 
862 
863 BEGIN
864     -- Operation Flag and Header ID validation.
865     IF (p_uf_header_rec.forecast_type NOT IN(AHL_UMP_UF_PVT.G_UF_TYPE_PART,AHL_UMP_UF_PVT.G_UF_TYPE_INSTANCE))THEN
866         FND_MESSAGE.Set_Name(G_APP_NAME,'AHL_UMP_UF_INV_UF_TYPE');
867         FND_MSG_PUB.ADD;
868     ELSIF (p_uf_header_rec.operation_flag IS NOT NULL AND p_uf_header_rec.operation_flag NOT IN(AHL_UMP_UF_PVT.G_OP_CREATE,AHL_UMP_UF_PVT.G_OP_UPDATE,AHL_UMP_UF_PVT.G_OP_DELETE))THEN
869         FND_MESSAGE.Set_Name(G_APP_NAME,'AHL_UMP_UF_INVOP_HEADER');
870         FND_MSG_PUB.ADD;
871     ELSIF ((p_uf_header_rec.uf_header_id IS NULL)
872             AND (p_uf_header_rec.operation_flag IS NULL OR p_uf_header_rec.operation_flag = AHL_UMP_UF_PVT.G_OP_UPDATE)) THEN
873         FND_MESSAGE.Set_Name(G_APP_NAME,'AHL_UMP_UF_INVOP_UFHID_NLL');
874         FND_MSG_PUB.ADD;
875     ELSIF(p_uf_header_rec.operation_flag = AHL_UMP_UF_PVT.G_OP_CREATE AND
876           p_uf_header_rec.uf_header_id IS NOT NULL ) THEN
877         FND_MESSAGE.Set_Name(G_APP_NAME,'AHL_UMP_UF_INVOP_UFHID_N_NLL');
878         FND_MSG_PUB.ADD;
879     END IF;
880 
881 
882 
883     IF(FND_MSG_PUB.count_msg > 0)THEN
884         RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
885     END IF;
886 
887     IF (( p_uf_header_rec.operation_flag IS NULL OR p_uf_header_rec.operation_flag <> AHL_UMP_UF_PVT.G_OP_CREATE) AND p_uf_header_rec.uf_header_id IS NOT NULL)THEN
888         OPEN  uf_header_csr(p_uf_header_rec.uf_header_id);
889         FETCH uf_header_csr INTO l_object_version_number, l_inventory_item_id,l_csi_item_instance_id,l_use_unit_flag;
890         IF (uf_header_csr%NOTFOUND) THEN
891             FND_MESSAGE.Set_Name(G_APP_NAME,'AHL_UMP_UF_INVOP_HREC_NOTINDB');
892             FND_MSG_PUB.ADD;
893         ELSIF (l_object_version_number <> p_uf_header_rec.object_version_number)THEN
894             FND_MESSAGE.Set_Name(G_APP_NAME,'AHL_UMP_UF_HREC_OBJV_MIS');
895             FND_MSG_PUB.ADD;
896         END IF;
897         CLOSE uf_header_csr;
898 
899         IF(FND_MSG_PUB.count_msg > 0)THEN
900             RAISE  FND_API.G_EXC_ERROR;
901         END IF;
902 
903         IF(p_uf_header_rec.forecast_type = AHL_UMP_UF_PVT.G_UF_TYPE_PART) THEN
904             IF(p_uf_header_rec.inventory_item_id = FND_API.G_MISS_NUM)THEN
905                FND_MESSAGE.Set_Name(G_APP_NAME,'AHL_UMP_UF_UFH_INVID_NLL');
906                FND_MSG_PUB.ADD;
907             ELSIF (p_uf_header_rec.inventory_item_id IS NOT NULL AND
908                    p_uf_header_rec.inventory_item_id <> l_inventory_item_id )THEN
909                FND_MESSAGE.Set_Name(G_APP_NAME,'AHL_UMP_UF_INVID_MIS');
910                FND_MSG_PUB.ADD;
911             ELSE
912                 OPEN part_check_csr(l_inventory_item_id);
913                 FETCH part_check_csr INTO l_exists;
914                 IF (part_check_csr%NOTFOUND) THEN
915                     FND_MESSAGE.Set_Name(G_APP_NAME,'AHL_UMP_UF_PART_INV');
916                     FND_MSG_PUB.ADD;
917                 END IF;
918                 CLOSE part_check_csr;
919             END IF;
920         ELSIF(p_uf_header_rec.forecast_type = AHL_UMP_UF_PVT.G_UF_TYPE_INSTANCE) THEN
921             IF(p_uf_header_rec.csi_item_instance_id = FND_API.G_MISS_NUM)THEN
925                    p_uf_header_rec.csi_item_instance_id <> l_csi_item_instance_id )THEN
922                FND_MESSAGE.Set_Name(G_APP_NAME,'AHL_UMP_UF_UFH_INSTID_NLL');
923                FND_MSG_PUB.ADD;
924             ELSIF (p_uf_header_rec.csi_item_instance_id IS NOT NULL AND
926                FND_MESSAGE.Set_Name(G_APP_NAME,'AHL_UMP_UF_INSTID_MIS');
927                FND_MSG_PUB.ADD;
928             ELSE
929                 OPEN instance_check_csr(l_csi_item_instance_id);
930                 FETCH instance_check_csr INTO l_exists;
931                 IF (instance_check_csr%NOTFOUND) THEN
932                     FND_MESSAGE.Set_Name(G_APP_NAME,'AHL_UMP_UF_INST_INV');
933                     FND_MSG_PUB.ADD;
934                 END IF;
935                 CLOSE instance_check_csr;
936             END IF;
937         END IF;
938     ELSIF (p_uf_header_rec.operation_flag = AHL_UMP_UF_PVT.G_OP_CREATE AND
939             p_uf_header_rec.uf_header_id IS NULL)THEN
940         IF (p_uf_header_rec.forecast_type = AHL_UMP_UF_PVT.G_UF_TYPE_PART) THEN
941             IF(p_uf_header_rec.inventory_item_id IS NULL OR
942                p_uf_header_rec.inventory_item_id = FND_API.G_MISS_NUM) THEN
943                FND_MESSAGE.Set_Name(G_APP_NAME,'AHL_UMP_UF_UFH_INVID_NLL');
944                FND_MSG_PUB.ADD;
945             ELSE
946                 OPEN part_check_csr(p_uf_header_rec.inventory_item_id);
947                 FETCH part_check_csr INTO l_exists;
948                 IF (part_check_csr%NOTFOUND) THEN
949                     FND_MESSAGE.Set_Name(G_APP_NAME,'AHL_UMP_UF_PART_INV');
950                     FND_MSG_PUB.ADD;
951                 END IF;
952                 CLOSE part_check_csr;
953             END IF;
954         ELSIF (p_uf_header_rec.forecast_type = AHL_UMP_UF_PVT.G_UF_TYPE_INSTANCE) THEN
955             IF(p_uf_header_rec.csi_item_instance_id IS NULL OR
956                p_uf_header_rec.csi_item_instance_id = FND_API.G_MISS_NUM) THEN
957                FND_MESSAGE.Set_Name(G_APP_NAME,'AHL_UMP_UF_UFH_INSTID_NLL');
958                FND_MSG_PUB.ADD;
959             ELSE
960                 OPEN instance_check_csr(p_uf_header_rec.csi_item_instance_id);
961                 FETCH instance_check_csr INTO l_exists;
962                 IF (instance_check_csr%NOTFOUND) THEN
963                     FND_MESSAGE.Set_Name(G_APP_NAME,'AHL_UMP_UF_INST_INV');
964                     FND_MSG_PUB.ADD;
965                 END IF;
966                 CLOSE instance_check_csr;
967             END IF;
968         END IF;
969     ELSE
970         FND_MESSAGE.Set_Name(G_APP_NAME,'AHL_UMP_UF_INV_HEADER');
971         FND_MSG_PUB.ADD;
972     END IF;
973 
974     IF(FND_MSG_PUB.count_msg > 0)THEN
975         RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
976     END IF;
977 
978     IF((p_uf_header_rec.use_unit_flag IS NOT NULL OR p_uf_header_rec.use_unit_flag <> FND_API.G_MISS_CHAR)
979         AND p_uf_header_rec.use_unit_flag NOT IN (AHL_UMP_UF_PVT.G_UF_USE_UNIT_DEFAULT,AHL_UMP_UF_PVT.G_UF_USE_UNIT_YES)) THEN
980         FND_MESSAGE.Set_Name(G_APP_NAME,'AHL_UMP_UF_INV_UNT_FLG');
981         FND_MSG_PUB.ADD;
982     END IF;
983 
984     IF(FND_MSG_PUB.count_msg > 0)THEN
985        RAISE  FND_API.G_EXC_ERROR;
986     END IF;
987 
988 
989 END validate_uf_header_pm;
990 
991 ----------------------------------------------------------
992 -- This procedure processes defaults unchanged attribute in uf header record
993 ----------------------------------------------------------
994 PROCEDURE default_unchanged_uf_header(
995     p_x_uf_header_rec           IN OUT NOCOPY     AHL_UMP_UF_PVT.uf_header_Rec_type
996     ) IS
997 
998 CURSOR uf_header_csr(p_uf_header_id IN NUMBER, p_object_version_number IN NUMBER) IS
999 SELECT  unit_config_header_id, inventory_item_id, pc_node_id, inventory_org_id,csi_item_instance_id,
1000         use_unit_flag, attribute_category, attribute1,attribute2, attribute3,
1001         attribute4, attribute5, attribute6, attribute7, attribute8, attribute9,
1002         attribute10, attribute11, attribute12, attribute13, attribute14, attribute15
1003 FROM ahl_uf_headers
1004 WHERE object_version_number= p_object_version_number
1005 AND uf_header_id = p_uf_header_id;
1006 
1007 l_uf_header_rec AHL_UMP_UF_PVT.uf_header_Rec_type;
1008 
1009 BEGIN
1010     IF(p_x_uf_header_rec.operation_flag = AHL_UMP_UF_PVT.G_OP_UPDATE) THEN
1011         OPEN uf_header_csr(p_x_uf_header_rec.uf_header_id, p_x_uf_header_rec.object_version_number);
1012         FETCH uf_header_csr INTO l_uf_header_rec.unit_config_header_id, l_uf_header_rec.inventory_item_id,l_uf_header_rec.csi_item_instance_id,
1013          l_uf_header_rec.pc_node_id, l_uf_header_rec.inventory_org_id, l_uf_header_rec.use_unit_flag,
1014          l_uf_header_rec.attribute_category,l_uf_header_rec.attribute1,l_uf_header_rec.attribute2,
1015          l_uf_header_rec.attribute3, l_uf_header_rec.attribute4, l_uf_header_rec.attribute5,
1016          l_uf_header_rec.attribute6, l_uf_header_rec.attribute7, l_uf_header_rec.attribute8,
1017          l_uf_header_rec.attribute9, l_uf_header_rec.attribute10, l_uf_header_rec.attribute11,
1018          l_uf_header_rec.attribute12, l_uf_header_rec.attribute13, l_uf_header_rec.attribute14,
1019          l_uf_header_rec.attribute15;
1020         IF (uf_header_csr%NOTFOUND) THEN
1021             FND_MESSAGE.Set_Name(G_APP_NAME,'AHL_UMP_UF_INVOP_HREC_NOTINDB');
1022             FND_MSG_PUB.ADD;
1023         ELSE
1024             IF (p_x_uf_header_rec.unit_config_header_id is null) THEN
1025                 p_x_uf_header_rec.unit_config_header_id := l_uf_header_rec.unit_config_header_id;
1026             ELSIF(p_x_uf_header_rec.unit_config_header_id = FND_API.G_MISS_NUM) THEN
1027                 p_x_uf_header_rec.unit_config_header_id := null;
1028             END IF;
1029 
1030             IF (p_x_uf_header_rec.inventory_item_id is null) THEN
1031                 p_x_uf_header_rec.inventory_item_id := l_uf_header_rec.inventory_item_id;
1035 
1032             ELSIF(p_x_uf_header_rec.inventory_item_id = FND_API.G_MISS_NUM) THEN
1033                 p_x_uf_header_rec.inventory_item_id := null;
1034             END IF;
1036             IF (p_x_uf_header_rec.pc_node_id is null) THEN
1037                 p_x_uf_header_rec.pc_node_id := l_uf_header_rec.pc_node_id;
1038             ELSIF(p_x_uf_header_rec.pc_node_id = FND_API.G_MISS_NUM) THEN
1039                 p_x_uf_header_rec.pc_node_id := null;             END IF;
1040 
1041             IF (p_x_uf_header_rec.inventory_org_id is null) THEN
1042                 p_x_uf_header_rec.inventory_org_id := l_uf_header_rec.inventory_org_id;
1043             ELSIF(p_x_uf_header_rec.inventory_org_id = FND_API.G_MISS_NUM) THEN
1044                 p_x_uf_header_rec.inventory_org_id := null;
1045             END IF;
1046 
1047             IF (p_x_uf_header_rec.csi_item_instance_id is null) THEN
1048                 p_x_uf_header_rec.csi_item_instance_id := l_uf_header_rec.csi_item_instance_id;
1049             ELSIF(p_x_uf_header_rec.csi_item_instance_id = FND_API.G_MISS_NUM) THEN
1050                 p_x_uf_header_rec.csi_item_instance_id := null;
1051             END IF;
1052 
1053             IF (p_x_uf_header_rec.use_unit_flag is null) THEN
1054                 p_x_uf_header_rec.use_unit_flag := l_uf_header_rec.use_unit_flag;
1055             ELSIF(p_x_uf_header_rec.use_unit_flag = FND_API.G_MISS_CHAR) THEN
1056                 p_x_uf_header_rec.use_unit_flag := AHL_UMP_UF_PVT.G_UF_USE_UNIT_DEFAULT;
1057             END IF;
1058 
1059             IF (p_x_uf_header_rec.attribute_category is null) THEN
1060                 p_x_uf_header_rec.attribute_category := l_uf_header_rec.attribute_category;
1061             ELSIF(p_x_uf_header_rec.attribute_category = FND_API.G_MISS_CHAR) THEN
1062                 p_x_uf_header_rec.attribute_category := null;
1063             END IF;
1064 
1065             IF (p_x_uf_header_rec.attribute1 is null) THEN
1066                 p_x_uf_header_rec.attribute1 := l_uf_header_rec.attribute1;
1067             ELSIF(p_x_uf_header_rec.attribute1 = FND_API.G_MISS_CHAR) THEN
1068                 p_x_uf_header_rec.attribute1 := null;
1069             END IF;
1070 
1071             IF (p_x_uf_header_rec.attribute2 is null) THEN
1072                 p_x_uf_header_rec.attribute2 := l_uf_header_rec.attribute2;
1073             ELSIF(p_x_uf_header_rec.attribute2 = FND_API.G_MISS_CHAR) THEN
1074                 p_x_uf_header_rec.attribute2 := null;
1075             END IF;
1076 
1077             IF (p_x_uf_header_rec.attribute3 is null) THEN
1078                 p_x_uf_header_rec.attribute3 := l_uf_header_rec.attribute3;
1079             ELSIF(p_x_uf_header_rec.attribute3 = FND_API.G_MISS_CHAR) THEN
1080                 p_x_uf_header_rec.attribute3 := null;
1081             END IF;
1082 
1083             IF (p_x_uf_header_rec.attribute4 is null) THEN
1084                 p_x_uf_header_rec.attribute4 := l_uf_header_rec.attribute4;
1085             ELSIF(p_x_uf_header_rec.attribute4 = FND_API.G_MISS_CHAR) THEN
1086                 p_x_uf_header_rec.attribute4 := null;
1087             END IF;
1088 
1089             IF (p_x_uf_header_rec.attribute5 is null) THEN
1090                 p_x_uf_header_rec.attribute5 := l_uf_header_rec.attribute5;
1091             ELSIF(p_x_uf_header_rec.attribute5 = FND_API.G_MISS_CHAR) THEN
1092                 p_x_uf_header_rec.attribute5 := null;
1093             END IF;
1094 
1095             IF (p_x_uf_header_rec.attribute6 is null) THEN
1096                 p_x_uf_header_rec.attribute6 := l_uf_header_rec.attribute6;
1097             ELSIF(p_x_uf_header_rec.attribute6 = FND_API.G_MISS_CHAR) THEN
1098                 p_x_uf_header_rec.attribute6 := null;
1099             END IF;
1100 
1101             IF (p_x_uf_header_rec.attribute7 is null) THEN
1102                 p_x_uf_header_rec.attribute7 := l_uf_header_rec.attribute7;
1103             ELSIF(p_x_uf_header_rec.attribute7 = FND_API.G_MISS_CHAR) THEN
1104                 p_x_uf_header_rec.attribute7 := null;
1105             END IF;
1106 
1107             IF (p_x_uf_header_rec.attribute8 is null) THEN
1108                 p_x_uf_header_rec.attribute8 := l_uf_header_rec.attribute8;
1112 
1109             ELSIF(p_x_uf_header_rec.attribute8 = FND_API.G_MISS_CHAR) THEN
1110                 p_x_uf_header_rec.attribute8 := null;
1111             END IF;
1113             IF (p_x_uf_header_rec.attribute9 is null) THEN
1114                 p_x_uf_header_rec.attribute9 := l_uf_header_rec.attribute9;
1115             ELSIF(p_x_uf_header_rec.attribute9 = FND_API.G_MISS_CHAR) THEN
1116                 p_x_uf_header_rec.attribute9 := null;
1117             END IF;
1118 
1119             IF (p_x_uf_header_rec.attribute10 is null) THEN
1120                 p_x_uf_header_rec.attribute10 := l_uf_header_rec.attribute10;
1121             ELSIF(p_x_uf_header_rec.attribute10 = FND_API.G_MISS_CHAR) THEN
1125             IF (p_x_uf_header_rec.attribute11 is null) THEN
1122                 p_x_uf_header_rec.attribute10 := null;
1123             END IF;
1124 
1126                 p_x_uf_header_rec.attribute11 := l_uf_header_rec.attribute11;
1127             ELSIF(p_x_uf_header_rec.attribute11 = FND_API.G_MISS_CHAR) THEN
1128                 p_x_uf_header_rec.attribute11 := null;
1132                 p_x_uf_header_rec.attribute12 := l_uf_header_rec.attribute12;
1129             END IF;
1130 
1131             IF (p_x_uf_header_rec.attribute12 is null) THEN
1133             ELSIF(p_x_uf_header_rec.attribute12 = FND_API.G_MISS_CHAR) THEN
1134                 p_x_uf_header_rec.attribute12 := null;
1135             END IF;
1136 
1137             IF (p_x_uf_header_rec.attribute13 is null) THEN
1138                 p_x_uf_header_rec.attribute13 := l_uf_header_rec.attribute13;
1139             ELSIF(p_x_uf_header_rec.attribute13 = FND_API.G_MISS_CHAR) THEN
1140                 p_x_uf_header_rec.attribute13 := null;
1141             END IF;
1142 
1143             IF (p_x_uf_header_rec.attribute14 is null) THEN
1144                 p_x_uf_header_rec.attribute14 := l_uf_header_rec.attribute14;
1145             ELSIF(p_x_uf_header_rec.attribute14 = FND_API.G_MISS_CHAR) THEN
1146                 p_x_uf_header_rec.attribute14 := null;
1147             END IF;
1148 
1149             IF (p_x_uf_header_rec.attribute15 is null) THEN
1150                 p_x_uf_header_rec.attribute15 := l_uf_header_rec.attribute15;
1151             ELSIF(p_x_uf_header_rec.attribute15 = FND_API.G_MISS_CHAR) THEN
1152                 p_x_uf_header_rec.attribute15 := null;
1153             END IF;
1154 
1155         END IF;
1156         CLOSE uf_header_csr;
1157     ELSIF (p_x_uf_header_rec.operation_flag = AHL_UMP_UF_PVT.G_OP_CREATE) THEN
1158 
1159         IF (p_x_uf_header_rec.unit_config_header_id = FND_API.G_MISS_NUM) THEN
1160             p_x_uf_header_rec.unit_config_header_id := null;
1161         END IF;
1162 
1163         IF (p_x_uf_header_rec.inventory_item_id = FND_API.G_MISS_NUM) THEN
1164             p_x_uf_header_rec.inventory_item_id := null;
1165         END IF;
1166 
1167         IF (p_x_uf_header_rec.csi_item_instance_id = FND_API.G_MISS_NUM) THEN
1168             p_x_uf_header_rec.csi_item_instance_id := null;
1169         END IF;
1170 
1171         IF (p_x_uf_header_rec.pc_node_id = FND_API.G_MISS_NUM) THEN
1172             p_x_uf_header_rec.pc_node_id := null;
1173         END IF;
1174 
1175         IF (p_x_uf_header_rec.inventory_org_id = FND_API.G_MISS_NUM) THEN
1176             p_x_uf_header_rec.inventory_org_id := null;
1177         END IF;
1178 
1179         IF (p_x_uf_header_rec.use_unit_flag is null) THEN
1180                 p_x_uf_header_rec.use_unit_flag := AHL_UMP_UF_PVT.G_UF_USE_UNIT_DEFAULT;
1181         ELSIF(p_x_uf_header_rec.use_unit_flag = FND_API.G_MISS_CHAR) THEN
1182             p_x_uf_header_rec.use_unit_flag := AHL_UMP_UF_PVT.G_UF_USE_UNIT_DEFAULT;
1183         END IF;
1184 
1185         IF (p_x_uf_header_rec.attribute_category = FND_API.G_MISS_CHAR) THEN
1186             p_x_uf_header_rec.attribute_category := null;
1187         END IF;
1188         IF (p_x_uf_header_rec.attribute1 = FND_API.G_MISS_CHAR) THEN
1189             p_x_uf_header_rec.attribute1 := null;
1190         END IF;
1191         IF (p_x_uf_header_rec.attribute2 = FND_API.G_MISS_CHAR) THEN
1192             p_x_uf_header_rec.attribute2 := null;
1193         END IF;
1194         IF (p_x_uf_header_rec.attribute3 = FND_API.G_MISS_CHAR) THEN
1195             p_x_uf_header_rec.attribute3 := null;
1196         END IF;
1197         IF (p_x_uf_header_rec.attribute4 = FND_API.G_MISS_CHAR) THEN
1198             p_x_uf_header_rec.attribute4 := null;
1199         END IF;
1200         IF (p_x_uf_header_rec.attribute5 = FND_API.G_MISS_CHAR) THEN
1201             p_x_uf_header_rec.attribute5 := null;
1202         END IF;
1203         IF (p_x_uf_header_rec.attribute6 = FND_API.G_MISS_CHAR) THEN
1204             p_x_uf_header_rec.attribute6 := null;
1205         END IF;
1206         IF (p_x_uf_header_rec.attribute7 = FND_API.G_MISS_CHAR) THEN             p_x_uf_header_rec.attribute7 := null;
1207         END IF;
1208         IF (p_x_uf_header_rec.attribute8 = FND_API.G_MISS_CHAR) THEN
1209             p_x_uf_header_rec.attribute8 := null;
1210         END IF;
1211         IF (p_x_uf_header_rec.attribute9 = FND_API.G_MISS_CHAR) THEN
1212             p_x_uf_header_rec.attribute9 := null;
1213         END IF;
1214         IF (p_x_uf_header_rec.attribute10 = FND_API.G_MISS_CHAR) THEN
1215             p_x_uf_header_rec.attribute10 := null;
1216         END IF;
1217         IF (p_x_uf_header_rec.attribute11 = FND_API.G_MISS_CHAR) THEN
1218             p_x_uf_header_rec.attribute11 := null;
1219         END IF;
1220         IF (p_x_uf_header_rec.attribute12 = FND_API.G_MISS_CHAR) THEN
1221             p_x_uf_header_rec.attribute12 := null;
1222         END IF;
1223         IF (p_x_uf_header_rec.attribute13 = FND_API.G_MISS_CHAR) THEN
1224             p_x_uf_header_rec.attribute13 := null;
1225         END IF;
1226         IF (p_x_uf_header_rec.attribute14 = FND_API.G_MISS_CHAR) THEN
1227             p_x_uf_header_rec.attribute14 := null;
1228         END IF;
1229         IF (p_x_uf_header_rec.attribute15 = FND_API.G_MISS_CHAR) THEN
1230             p_x_uf_header_rec.attribute15 := null;
1231         END IF;
1232      END IF;
1233 END default_unchanged_uf_header;
1234 
1235 
1236 ----------------------------------------------------------
1237 -- This procedure processes uf_detail_rec
1238 ----------------------------------------------------------
1239 PROCEDURE process_uf_details(
1240     p_validation_level IN   NUMBER    := FND_API.G_VALID_LEVEL_FULL,
1241     p_uf_header_rec    IN AHL_UMP_UF_PVT.uf_header_Rec_type,
1242     p_x_uf_details_tbl IN OUT NOCOPY AHL_UMP_UF_PVT.uf_details_tbl_type
1243     ) IS
1244 
1245 BEGIN
1246     --no value to id conversion involved here
1247 
1248     validate_uf_details(
1249     p_uf_header_rec    => p_uf_header_rec,
1250     p_x_uf_details_tbl => p_x_uf_details_tbl
1251     );
1252 
1253     default_unchanged_uf_details(p_x_uf_details_tbl => p_x_uf_details_tbl);
1254     --save details now
1258         END IF;
1255     FOR i IN p_x_uf_details_tbl.FIRST..p_x_uf_details_tbl.LAST  LOOP
1256         IF(p_x_uf_details_tbl(i).operation_flag = AHL_UMP_UF_PVT.G_OP_DELETE) THEN
1257             AHL_UF_DETAILS_PKG.delete_row(p_x_uf_details_tbl(i).uf_detail_id);
1259     END LOOP;
1260 
1261     FOR i IN p_x_uf_details_tbl.FIRST..p_x_uf_details_tbl.LAST  LOOP
1262         IF (p_x_uf_details_tbl(i).operation_flag = AHL_UMP_UF_PVT.G_OP_UPDATE) THEN
1263 
1264            --setting object version number for create
1265            p_x_uf_details_tbl(i).object_version_number := p_x_uf_details_tbl(i).object_version_number + 1;
1266            --setting up user/create/update information
1270 
1267            p_x_uf_details_tbl(i).last_updated_by := fnd_global.user_id;
1268            p_x_uf_details_tbl(i).last_update_date := SYSDATE;
1269            p_x_uf_details_tbl(i).last_update_login := fnd_global.user_id;
1271            AHL_UF_DETAILS_PKG.update_row(
1272            x_uf_detail_id => p_x_uf_details_tbl(i).uf_detail_id,
1273            x_object_version_number => p_x_uf_details_tbl(i).object_version_number,
1274            x_last_updated_by => p_x_uf_details_tbl(i).last_updated_by,
1275            x_last_update_date => p_x_uf_details_tbl(i).last_update_date,
1276            x_last_update_login => p_x_uf_details_tbl(i).last_update_login,
1277            x_uf_header_id => p_x_uf_details_tbl(i).uf_header_id,
1278            x_uom_code => p_x_uf_details_tbl(i).uom_code,
1279            x_start_date => p_x_uf_details_tbl(i).start_date,
1280            x_end_date => p_x_uf_details_tbl(i).end_date,
1281            x_usage_per_day => p_x_uf_details_tbl(i).usage_per_day,
1282            x_attribute_category => p_x_uf_details_tbl(i).attribute_category,
1283            x_attribute1 => p_x_uf_details_tbl(i).attribute1,
1284            x_attribute2 => p_x_uf_details_tbl(i).attribute2,
1285            x_attribute3 => p_x_uf_details_tbl(i).attribute3,
1286            x_attribute4 => p_x_uf_details_tbl(i).attribute4,
1287            x_attribute5 => p_x_uf_details_tbl(i).attribute5,
1288            x_attribute6 => p_x_uf_details_tbl(i).attribute6,
1289            x_attribute7 => p_x_uf_details_tbl(i).attribute7,
1290            x_attribute8 => p_x_uf_details_tbl(i).attribute8,
1291            x_attribute9 => p_x_uf_details_tbl(i).attribute9,
1292            x_attribute10 => p_x_uf_details_tbl(i).attribute10,
1293            x_attribute11 => p_x_uf_details_tbl(i).attribute11,
1294            x_attribute12 => p_x_uf_details_tbl(i).attribute12,
1295            x_attribute13 => p_x_uf_details_tbl(i).attribute13,
1299         END IF;
1296            x_attribute14 => p_x_uf_details_tbl(i).attribute14,
1297            x_attribute15 => p_x_uf_details_tbl(i).attribute15
1298            );
1300     END LOOP;
1301     FOR i IN p_x_uf_details_tbl.FIRST..p_x_uf_details_tbl.LAST  LOOP
1302         IF(p_x_uf_details_tbl(i).operation_flag = AHL_UMP_UF_PVT.G_OP_CREATE) THEN
1303            --setting object version number for create
1304            p_x_uf_details_tbl(i).object_version_number := 1;
1305            --setting up user/create/update information
1306            p_x_uf_details_tbl(i).created_by := fnd_global.user_id;
1307            p_x_uf_details_tbl(i).creation_date := SYSDATE;
1308            p_x_uf_details_tbl(i).last_updated_by := fnd_global.user_id;
1309            p_x_uf_details_tbl(i).last_update_date := SYSDATE;
1310            p_x_uf_details_tbl(i).last_update_login := fnd_global.user_id;
1311 
1312            p_x_uf_details_tbl(i).uf_header_id := p_uf_header_rec.uf_header_id;
1313 
1314            AHL_UF_DETAILS_PKG.insert_row(
1315            x_uf_detail_id => p_x_uf_details_tbl(i).uf_detail_id,
1316            x_object_version_number => p_x_uf_details_tbl(i).object_version_number,
1317            x_created_by => p_x_uf_details_tbl(i).created_by,
1318            x_creation_date => p_x_uf_details_tbl(i).creation_date,
1319            x_last_updated_by => p_x_uf_details_tbl(i).last_updated_by,
1320            x_last_update_date => p_x_uf_details_tbl(i).last_update_date,
1321            x_last_update_login => p_x_uf_details_tbl(i).last_update_login,
1322            x_uf_header_id => p_x_uf_details_tbl(i).uf_header_id,
1323            x_uom_code => p_x_uf_details_tbl(i).uom_code,
1324            x_start_date => p_x_uf_details_tbl(i).start_date,
1325            x_end_date => p_x_uf_details_tbl(i).end_date,
1326            x_usage_per_day => p_x_uf_details_tbl(i).usage_per_day,
1327            x_attribute_category => p_x_uf_details_tbl(i).attribute_category,
1328            x_attribute1 => p_x_uf_details_tbl(i).attribute1,
1329            x_attribute2 => p_x_uf_details_tbl(i).attribute2,
1330            x_attribute3 => p_x_uf_details_tbl(i).attribute3,
1331            x_attribute4 => p_x_uf_details_tbl(i).attribute4,
1332            x_attribute5 => p_x_uf_details_tbl(i).attribute5,
1333            x_attribute6 => p_x_uf_details_tbl(i).attribute6,
1334            x_attribute7 => p_x_uf_details_tbl(i).attribute7,
1335            x_attribute8 => p_x_uf_details_tbl(i).attribute8,
1336            x_attribute9 => p_x_uf_details_tbl(i).attribute9,
1337            x_attribute10 => p_x_uf_details_tbl(i).attribute10,
1338            x_attribute11 => p_x_uf_details_tbl(i).attribute11,
1339            x_attribute12 => p_x_uf_details_tbl(i).attribute12,
1340            x_attribute13 => p_x_uf_details_tbl(i).attribute13,
1341            x_attribute14 => p_x_uf_details_tbl(i).attribute14,
1342            x_attribute15 => p_x_uf_details_tbl(i).attribute15
1343            );
1344         END IF;
1345     END LOOP;
1346 
1347     --validate saved data.. check for gaps etc
1348     validate_utilization_forecast(
1349     p_uf_header_rec    => p_uf_header_rec,
1350     x_uf_details_tbl  => p_x_uf_details_tbl
1351     );
1352 
1353     IF(FND_MSG_PUB.count_msg > 0)THEN
1354         RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
1355     END IF;
1356 
1357 END process_uf_details;
1358 
1359 
1360 ---------------------------------------------------------------------------------------------------------------------------------------------------
1361 -- This procedure does the following validations for uf_details_tbl
1362 -- verify operation flag is not null for all records
1363 -- check if uf_header_id , if null, verify operation flag is create AHL_UMP_UF_PVT.G_OP_CREATE for all records in details
1364 -- check if uf_detail_id is not null then operation flag is update AHL_UMP_UF_PVT.G_UF_TYPE_UNIT or 'D' and uf_header_id is not null
1365 -- Validate that for every record in p_x_uf_details_tbl, start_date is < end_date(IF not null) and start_date is not null.
1366 -- Validate that for every record in p_x_uf_details_tbl, usage_per_day is a valid number +ve,-ve or 0 .
1367 -- Validate that for every record in p_x_uf_details_tbl, uom  is valid.
1368 -- If operation_flag is "U" or "D" verfiy object version number if they are same as in database.
1369 -- If operation_flag is "U", if start_date < SYSDATE, split this record and
1370 --                  update current record with UOM for this record in DB and end date as SYSDATE - 1
1371 --                  add a new one with with start date as SYSDATE and operation flag as AHL_UMP_UF_PVT.G_OP_CREATE
1372 -- If operation_flag is "D", if start_date < SYSDATE, put end date as SYSDATE -1 (yesterday's date).set operation_flag as AHL_UMP_UF_PVT.G_UF_TYPE_UNIT
1373 -- update x_return_status on error , break if required
1374 ---------------------------------------------------------------------------------------------------------------------------------------------------
1375 PROCEDURE validate_uf_details(
1376     p_uf_header_rec    IN AHL_UMP_UF_PVT.uf_header_Rec_type,
1377     p_x_uf_details_tbl IN OUT NOCOPY AHL_UMP_UF_PVT.uf_details_tbl_type
1378     ) IS
1379 
1383  WHERE uf_detail_id = p_uf_detail_id;
1380  CURSOR uf_details_csr (p_uf_detail_id  IN  NUMBER) IS
1381  SELECT object_version_number, uf_header_id,uom_code,start_date,end_date,usage_per_day
1382  FROM ahl_uf_details
1384 
1385  l_object_version_number NUMBER;
1386  l_uf_header_id NUMBER;
1387  l_uom_code ahl_uf_details.uom_code%TYPE;
1388  l_start_date DATE;
1389  l_end_date DATE;
1390  l_usage_per_day NUMBER;
1391 
1392  l_total NUMBER;
1393  l_last NUMBER;
1394 
1395  CURSOR part_uom_code_ckeck_csr(p_uom_code IN VARCHAR2) IS
1396  select 'x'
1397  from mtl_units_of_measure_vl
1398  where uom_code = p_uom_code;
1399 
1400  CURSOR node_uom_code_ckeck_csr(p_uom_code IN VARCHAR2) IS
1401  select 'x'
1402  from mtl_units_of_measure_vl
1403  where uom_code = p_uom_code;
1404 
1405  CURSOR unit_uom_code_ckeck_csr(p_uom_code IN VARCHAR2) IS
1406  select 'x'
1407  from mtl_units_of_measure_vl
1408  where uom_code = p_uom_code;
1409 
1410  l_exists VARCHAR2(1);
1411 
1412 BEGIN
1413     l_total := p_x_uf_details_tbl.count;
1414     FOR i IN p_x_uf_details_tbl.FIRST..l_total  LOOP
1415        --checking for unexpected errors
1416        IF ( p_x_uf_details_tbl(i).operation_flag IS NOT NULL AND p_x_uf_details_tbl(i).operation_flag NOT IN(AHL_UMP_UF_PVT.G_OP_CREATE,AHL_UMP_UF_PVT.G_OP_UPDATE,AHL_UMP_UF_PVT.G_OP_DELETE))THEN
1417            FND_MESSAGE.Set_Name(G_APP_NAME,'AHL_UMP_UF_INVOP_DETAIL');
1418            FND_MSG_PUB.ADD;
1419        ELSIF (p_uf_header_rec.operation_flag = AHL_UMP_UF_PVT.G_OP_CREATE AND p_x_uf_details_tbl(i).operation_flag <> AHL_UMP_UF_PVT.G_OP_CREATE) THEN
1420            FND_MESSAGE.Set_Name(G_APP_NAME,'AHL_UMP_UF_INV_OP_DET_HED');
1421            FND_MSG_PUB.ADD;
1422        ELSIF ((p_x_uf_details_tbl(i).operation_flag <> AHL_UMP_UF_PVT.G_OP_CREATE AND p_x_uf_details_tbl(i).uf_detail_id IS NULL) OR
1423               (p_x_uf_details_tbl(i).operation_flag = AHL_UMP_UF_PVT.G_OP_CREATE AND p_x_uf_details_tbl(i).uf_detail_id IS NOT NULL))  THEN
1424            FND_MESSAGE.Set_Name(G_APP_NAME,'AHL_UMP_UF_INVOP_DETAIL');
1425            FND_MSG_PUB.ADD;
1426        END IF;
1427        -- Raise if unexpected errors
1428        IF FND_MSG_PUB.count_msg > 0 THEN
1429             RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
1430        END IF;
1431 
1432        IF (p_x_uf_details_tbl(i).operation_flag = AHL_UMP_UF_PVT.G_OP_CREATE AND
1433            p_x_uf_details_tbl(i).end_date = FND_API.G_MISS_DATE) THEN
1434            p_x_uf_details_tbl(i).end_date := NULL;
1435 
1436        -- checking for expected error if record is modified
1437        ELSIF (p_x_uf_details_tbl(i).operation_flag <> AHL_UMP_UF_PVT.G_OP_CREATE AND p_x_uf_details_tbl(i).uf_detail_id IS NOT NULL)THEN
1438            OPEN  uf_details_csr(p_x_uf_details_tbl(i).uf_detail_id);
1439            FETCH uf_details_csr INTO l_object_version_number, l_uf_header_id,l_uom_code,l_start_date,l_end_date,l_usage_per_day;
1440            IF (uf_details_csr%NOTFOUND) THEN
1441                FND_MESSAGE.Set_Name(G_APP_NAME,'AHL_UMP_UF_DET_INV_NOTINDB');
1442                FND_MSG_PUB.ADD;
1443            ELSIF l_object_version_number <> p_x_uf_details_tbl(i).object_version_number THEN
1444                FND_MESSAGE.Set_Name(G_APP_NAME,'AHL_UMP_UF_DET_OBJV_MIS');
1445                FND_MSG_PUB.ADD;
1446            ELSE
1447             IF p_x_uf_details_tbl(i).end_date IS NULL THEN
1448                p_x_uf_details_tbl(i).end_date := l_end_date;
1452             IF p_x_uf_details_tbl(i).uf_header_id IS NULL THEN
1449             ELSIF p_x_uf_details_tbl(i).end_date = FND_API.G_MISS_DATE THEN
1450                p_x_uf_details_tbl(i).end_date := NULL;
1451             END IF;
1453                 p_x_uf_details_tbl(i).uf_header_id := l_uf_header_id;
1454             ELSIF p_x_uf_details_tbl(i).uf_header_id = FND_API.G_MISS_NUM THEN
1455                 FND_MESSAGE.Set_Name(G_APP_NAME,'AHL_UMP_UF_INV_DET_UFHID');
1456                 FND_MSG_PUB.ADD;
1457             ELSIF (p_x_uf_details_tbl(i).uf_header_id <> l_uf_header_id) THEN
1458                 FND_MESSAGE.Set_Name(G_APP_NAME,'AHL_UMP_UF_INV_DET_UFHID');
1459                 FND_MSG_PUB.ADD;
1460             END IF;
1461            END IF;
1462           CLOSE uf_details_csr;
1463        END IF;
1464 
1465        IF(FND_MSG_PUB.count_msg > 0)THEN
1466            RAISE  FND_API.G_EXC_ERROR;
1467        END IF;
1468 
1469        -- checking for expected error if start date , end date,UOM are invalid
1470        IF(p_x_uf_details_tbl(i).operation_flag IN (AHL_UMP_UF_PVT.G_OP_CREATE,AHL_UMP_UF_PVT.G_OP_UPDATE))THEN
1471          -- checking for start and end dates
1472          IF(p_x_uf_details_tbl(i).start_date IS NULL) THEN
1473             FND_MESSAGE.Set_Name(G_APP_NAME,'AHL_UMP_UF_INV_SDATE_NLL');
1474             FND_MESSAGE.Set_Token('START_DATE',p_x_uf_details_tbl(i).start_date);
1475             FND_MESSAGE.Set_Token('END_DATE',p_x_uf_details_tbl(i).end_date);
1476             FND_MESSAGE.Set_Token('UOM_CODE',p_x_uf_details_tbl(i).uom_code);
1477             FND_MESSAGE.Set_Token('USAGE_PER_DAY',p_x_uf_details_tbl(i).usage_per_day);
1478             FND_MSG_PUB.ADD;
1479          ELSIF (p_x_uf_details_tbl(i).end_date IS NOT NULL) THEN
1480             IF ((TRUNC(p_x_uf_details_tbl(i).end_date) < TRUNC(p_x_uf_details_tbl(i).start_date)) OR
1481                 (TRUNC(p_x_uf_details_tbl(i).end_date) < TRUNC(SYSDATE)))THEN
1482               FND_MESSAGE.Set_Name(G_APP_NAME,'AHL_UMP_UF_INV_EDATE');
1483               FND_MESSAGE.Set_Token('START_DATE',p_x_uf_details_tbl(i).start_date);
1484               FND_MESSAGE.Set_Token('END_DATE',p_x_uf_details_tbl(i).end_date);
1485               FND_MESSAGE.Set_Token('UOM_CODE',p_x_uf_details_tbl(i).uom_code);
1486               FND_MESSAGE.Set_Token('USAGE_PER_DAY',p_x_uf_details_tbl(i).usage_per_day);
1487               FND_MSG_PUB.ADD;
1488             ELSIF (p_x_uf_details_tbl(i).operation_flag = AHL_UMP_UF_PVT.G_OP_CREATE) THEN
1489               IF(TRUNC(p_x_uf_details_tbl(i).start_date) < TRUNC(SYSDATE))THEN
1490                 FND_MESSAGE.Set_Name(G_APP_NAME,'AHL_UMP_UF_INV_SDATE');
1491                 FND_MESSAGE.Set_Token('START_DATE',p_x_uf_details_tbl(i).start_date);
1492                 FND_MESSAGE.Set_Token('END_DATE',p_x_uf_details_tbl(i).end_date);
1493                 FND_MESSAGE.Set_Token('UOM_CODE',p_x_uf_details_tbl(i).uom_code);
1494                 FND_MESSAGE.Set_Token('USAGE_PER_DAY',p_x_uf_details_tbl(i).usage_per_day);
1495                 FND_MSG_PUB.ADD;
1496               END IF;
1497             ELSIF (p_x_uf_details_tbl(i).operation_flag = AHL_UMP_UF_PVT.G_OP_UPDATE) THEN
1498               IF ( TRUNC(p_x_uf_details_tbl(i).start_date) < TRUNC(SYSDATE) AND
1499                   (TRUNC(p_x_uf_details_tbl(i).start_date) <> TRUNC(l_start_date) OR
1500                  p_x_uf_details_tbl(i).uom_code <> l_uom_code))  THEN
1501                  FND_MESSAGE.Set_Name(G_APP_NAME,'AHL_UMP_UF_DONCHG_STD_UOM');
1502                  FND_MESSAGE.Set_Token('START_DATE',p_x_uf_details_tbl(i).start_date);
1506                  FND_MSG_PUB.ADD;
1503                  FND_MESSAGE.Set_Token('END_DATE',p_x_uf_details_tbl(i).end_date);
1504                  FND_MESSAGE.Set_Token('UOM_CODE',p_x_uf_details_tbl(i).uom_code);
1505                  FND_MESSAGE.Set_Token('USAGE_PER_DAY',p_x_uf_details_tbl(i).usage_per_day);
1507               END IF;
1508             END IF;
1509          ELSIF (p_x_uf_details_tbl(i).end_date IS NULL) THEN
1510             IF (p_x_uf_details_tbl(i).operation_flag = AHL_UMP_UF_PVT.G_OP_CREATE) THEN
1511               IF(TRUNC(p_x_uf_details_tbl(i).start_date) < TRUNC(SYSDATE))THEN
1512                 FND_MESSAGE.Set_Name(G_APP_NAME,'AHL_UMP_UF_INV_SDATE');
1513                 FND_MESSAGE.Set_Token('START_DATE',p_x_uf_details_tbl(i).start_date);
1514                 FND_MESSAGE.Set_Token('END_DATE',p_x_uf_details_tbl(i).end_date);
1515                 FND_MESSAGE.Set_Token('UOM_CODE',p_x_uf_details_tbl(i).uom_code);
1516                 FND_MESSAGE.Set_Token('USAGE_PER_DAY',p_x_uf_details_tbl(i).usage_per_day);
1517                 FND_MSG_PUB.ADD;
1518               END IF;
1519             ELSIF (p_x_uf_details_tbl(i).operation_flag = AHL_UMP_UF_PVT.G_OP_UPDATE) THEN
1520               IF ( TRUNC(p_x_uf_details_tbl(i).start_date) < TRUNC(SYSDATE) AND
1521                   (TRUNC(p_x_uf_details_tbl(i).start_date) <> TRUNC(l_start_date) OR
1522                  p_x_uf_details_tbl(i).uom_code <> l_uom_code))  THEN
1523                  FND_MESSAGE.Set_Name(G_APP_NAME,'AHL_UMP_UF_DONCHG_STD_UOM');
1524                  FND_MESSAGE.Set_Token('START_DATE',p_x_uf_details_tbl(i).start_date);
1525                  FND_MESSAGE.Set_Token('END_DATE',p_x_uf_details_tbl(i).end_date);
1526                  FND_MESSAGE.Set_Token('UOM_CODE',p_x_uf_details_tbl(i).uom_code);
1527                  FND_MESSAGE.Set_Token('USAGE_PER_DAY',p_x_uf_details_tbl(i).usage_per_day);
1528                  FND_MSG_PUB.ADD;
1529               END IF;
1530             END IF;
1531          END IF;
1532 
1533         --checking for expected error if UOM is invalid
1534         IF(p_x_uf_details_tbl(i).uom_code IS NULL) THEN
1535            FND_MESSAGE.Set_Name(G_APP_NAME,'AHL_UMP_UF_UOMCD_NLL');
1536            FND_MESSAGE.Set_Token('START_DATE',p_x_uf_details_tbl(i).start_date);
1537            FND_MESSAGE.Set_Token('END_DATE',p_x_uf_details_tbl(i).end_date);
1538            FND_MESSAGE.Set_Token('UOM_CODE',p_x_uf_details_tbl(i).uom_code);
1539            FND_MESSAGE.Set_Token('USAGE_PER_DAY',p_x_uf_details_tbl(i).usage_per_day);
1540            FND_MSG_PUB.ADD;
1541         ELSE
1542            IF (p_uf_header_rec.forecast_type = AHL_UMP_UF_PVT.G_OP_UPDATE)THEN
1543                 OPEN unit_uom_code_ckeck_csr(p_x_uf_details_tbl(i).uom_code);
1544                 FETCH unit_uom_code_ckeck_csr into l_exists;
1545                 IF (unit_uom_code_ckeck_csr%NOTFOUND) THEN
1546                     FND_MESSAGE.Set_Name(G_APP_NAME,'AHL_UMP_UF_INV_UOMCD');
1547                     FND_MESSAGE.Set_Token('START_DATE',p_x_uf_details_tbl(i).start_date);
1548                     FND_MESSAGE.Set_Token('END_DATE',p_x_uf_details_tbl(i).end_date);
1549                     FND_MESSAGE.Set_Token('UOM_CODE',p_x_uf_details_tbl(i).uom_code);
1550                     FND_MESSAGE.Set_Token('USAGE_PER_DAY',p_x_uf_details_tbl(i).usage_per_day);
1551                     FND_MSG_PUB.ADD;
1552                 END IF;
1553                 CLOSE unit_uom_code_ckeck_csr;
1554            ELSIF (p_uf_header_rec.forecast_type = AHL_UMP_UF_PVT.G_UF_TYPE_PART)THEN
1555                 OPEN part_uom_code_ckeck_csr(p_x_uf_details_tbl(i).uom_code);
1556                 FETCH part_uom_code_ckeck_csr into l_exists;
1557                 IF (part_uom_code_ckeck_csr%NOTFOUND) THEN
1558                     FND_MESSAGE.Set_Name(G_APP_NAME,'AHL_UMP_UF_INV_UOMCD');
1559                     FND_MESSAGE.Set_Token('START_DATE',p_x_uf_details_tbl(i).start_date);
1560                     FND_MESSAGE.Set_Token('END_DATE',p_x_uf_details_tbl(i).end_date);
1561                     FND_MESSAGE.Set_Token('UOM_CODE',p_x_uf_details_tbl(i).uom_code);
1562                     FND_MESSAGE.Set_Token('USAGE_PER_DAY',p_x_uf_details_tbl(i).usage_per_day);
1563                     FND_MSG_PUB.ADD;
1564                 END IF;
1565                 CLOSE part_uom_code_ckeck_csr;
1566            ELSIF (p_uf_header_rec.forecast_type = AHL_UMP_UF_PVT.G_UF_TYPE_PC_NODE)THEN
1567                 OPEN node_uom_code_ckeck_csr(p_x_uf_details_tbl(i).uom_code);
1568                 FETCH node_uom_code_ckeck_csr into l_exists;
1569                 IF (node_uom_code_ckeck_csr%NOTFOUND) THEN
1570                     FND_MESSAGE.Set_Name(G_APP_NAME,'AHL_UMP_UF_INV_UOMCD');
1571                     FND_MESSAGE.Set_Token('START_DATE',p_x_uf_details_tbl(i).start_date);
1572                     FND_MESSAGE.Set_Token('END_DATE',p_x_uf_details_tbl(i).end_date);
1573                     FND_MESSAGE.Set_Token('UOM_CODE',p_x_uf_details_tbl(i).uom_code);
1574                     FND_MESSAGE.Set_Token('USAGE_PER_DAY',p_x_uf_details_tbl(i).usage_per_day);
1575                     FND_MSG_PUB.ADD;
1576                 END IF;
1577                 CLOSE node_uom_code_ckeck_csr;
1581 
1578            END IF;
1579         END IF;--UOM code check
1580       END IF;
1582       --spliting and end-dating
1583       IF (FND_MSG_PUB.count_msg = 0) THEN
1584        IF(p_x_uf_details_tbl(i).operation_flag = AHL_UMP_UF_PVT.G_OP_UPDATE)THEN
1585            IF TRUNC(p_x_uf_details_tbl(i).start_date) < TRUNC(SYSDATE) THEN
1586                IF((TRUNC(p_x_uf_details_tbl(i).start_date) <> TRUNC(l_start_date))OR
1587                    (p_x_uf_details_tbl(i).uom_code <> l_uom_code))  THEN
1588                     FND_MESSAGE.Set_Name(G_APP_NAME,'AHL_UMP_UF_DONCHG_STD_UOM');
1589                     FND_MESSAGE.Set_Token('START_DATE',p_x_uf_details_tbl(i).start_date);
1590                     FND_MESSAGE.Set_Token('END_DATE',p_x_uf_details_tbl(i).end_date);
1591                     FND_MESSAGE.Set_Token('UOM_CODE',p_x_uf_details_tbl(i).uom_code);
1592                     FND_MESSAGE.Set_Token('USAGE_PER_DAY',p_x_uf_details_tbl(i).usage_per_day);
1593                     FND_MSG_PUB.ADD;
1594                ELSIF ((TRUNC(p_x_uf_details_tbl(i).end_date) <> TRUNC(l_end_date))OR
1595                    (p_x_uf_details_tbl(i).usage_per_day <> l_usage_per_day))  THEN
1596                    -- adding new record
1597                    l_last := p_x_uf_details_tbl.count + 1;
1598                    p_x_uf_details_tbl(l_last).start_date := SYSDATE;
1599                    p_x_uf_details_tbl(l_last).end_date := p_x_uf_details_tbl(i).end_date;
1600                    p_x_uf_details_tbl(l_last).usage_per_day := p_x_uf_details_tbl(i).usage_per_day;
1601                    p_x_uf_details_tbl(l_last).uom_code := p_x_uf_details_tbl(i).uom_code;
1602                    p_x_uf_details_tbl(l_last).operation_flag := AHL_UMP_UF_PVT.G_OP_CREATE;
1603                    p_x_uf_details_tbl(l_last).uf_header_id := p_x_uf_details_tbl(i).uf_header_id;
1604                    -- Modifying and end-dating existing record.
1605                    p_x_uf_details_tbl(i).end_date := TRUNC(SYSDATE - 1);
1609                 END IF;
1606                    p_x_uf_details_tbl(i).uom_code := l_uom_code;
1607                    p_x_uf_details_tbl(i).usage_per_day := l_usage_per_day;
1608 
1610            END IF;
1611        -- end dating if start date < sysdate
1612        ELSIF (p_x_uf_details_tbl(i).operation_flag = AHL_UMP_UF_PVT.G_OP_DELETE)THEN
1613            IF(TRUNC(l_start_date) < TRUNC(SYSDATE))THEN
1617                 p_x_uf_details_tbl(i).usage_per_day := l_usage_per_day;
1614                 p_x_uf_details_tbl(i).start_date := l_start_date;
1615                 p_x_uf_details_tbl(i).end_date := SYSDATE - 1;
1616                 p_x_uf_details_tbl(i).uom_code := l_uom_code;
1618                 p_x_uf_details_tbl(i).operation_flag := AHL_UMP_UF_PVT.G_OP_UPDATE;
1619           END IF;
1620        END IF;
1621       END IF; --end splitting and end dating
1622 
1623     END LOOP;
1624 
1625     IF FND_MSG_PUB.count_msg > 0 THEN
1626         RAISE  FND_API.G_EXC_ERROR;
1627     END IF;
1628 
1629 END validate_uf_details;
1630 
1631 ---------------------------------------------------------------------------------------------------------------------------------------------------
1632 -- This procedure verfies whether saved utilization forecast was validate_uf_detailsand had no gaps.
1633 -- fetch details table records for this uf_header_id ordered by UOM, start date where endt_date >= Sysdate - 1.
1634 -- for same UOM, end date of one record should always be one less than the start date of next record
1635 -- update x_return_status on error , break if required
1636 -----------------------------------------------------------------------------------------------------------------------------------------------------
1637 
1638 
1639 PROCEDURE validate_utilization_forecast(
1640     p_uf_header_rec  IN AHL_UMP_UF_PVT.uf_header_rec_type,
1641     x_uf_details_tbl OUT NOCOPY AHL_UMP_UF_PVT.uf_details_tbl_type
1642     ) IS
1643 
1644     CURSOR uf_sorted_details_csr (p_uf_header_id  IN  NUMBER) IS
1645     SELECT object_version_number, uf_detail_id, uf_header_id,uom_code,start_date,end_date,usage_per_day
1646     FROM ahl_uf_details
1647     WHERE uf_header_id = p_uf_header_id
1648     AND (end_date IS NULL OR TRUNC(end_date) >= TRUNC(SYSDATE))
1649     ORDER BY uom_code,start_date;
1650 
1651     i NUMBER;
1652 
1653 BEGIN
1654     i:= 1;
1655 
1656     OPEN  uf_sorted_details_csr(p_uf_header_rec.uf_header_id);
1657     LOOP
1658         FETCH uf_sorted_details_csr INTO x_uf_details_tbl(i).object_version_number,
1659                          x_uf_details_tbl(i).uf_detail_id,
1660                          x_uf_details_tbl(i).uf_header_id,
1661                          x_uf_details_tbl(i).uom_code,
1662                          x_uf_details_tbl(i).start_date,
1663                          x_uf_details_tbl(i).end_date,
1664                          x_uf_details_tbl(i).usage_per_day;
1665         exit when uf_sorted_details_csr%notfound;
1666         i := i + 1;
1667     END LOOP;
1668 
1669     CLOSE uf_sorted_details_csr;
1670     IF(x_uf_details_tbl.COUNT > 0) THEN
1671      FOR i IN x_uf_details_tbl.FIRST..x_uf_details_tbl.LAST  LOOP
1672         IF(x_uf_details_tbl.LAST > i) THEN
1673             IF(x_uf_details_tbl(i).uom_code = x_uf_details_tbl(i+1).uom_code) THEN
1674                IF(x_uf_details_tbl(i).end_date IS NULL) THEN
1675                 FND_MESSAGE.Set_Name('AHL','AHL_UMP_UF_OLAPS_IN_UF');
1676                 FND_MESSAGE.Set_Token('FSTART_DATE',x_uf_details_tbl(i).start_date);
1677                 FND_MESSAGE.Set_Token('FEND_DATE',x_uf_details_tbl(i).end_date);
1678                 FND_MESSAGE.Set_Token('FUOM_CODE',x_uf_details_tbl(i).uom_code);
1679                 FND_MESSAGE.Set_Token('FUSAGE_PER_DAY',x_uf_details_tbl(i).usage_per_day);
1680                 FND_MESSAGE.Set_Token('NSTART_DATE',x_uf_details_tbl(i+1).start_date);
1681                 FND_MESSAGE.Set_Token('NEND_DATE',x_uf_details_tbl(i+1).end_date);
1682                 FND_MESSAGE.Set_Token('NUOM_CODE',x_uf_details_tbl(i+1).uom_code);
1683                 FND_MESSAGE.Set_Token('NUSAGE_PER_DAY',x_uf_details_tbl(i+1).usage_per_day);
1684                 FND_MSG_PUB.ADD;
1685                ELSIF TRUNC(x_uf_details_tbl(i+1).start_date) <> TRUNC(x_uf_details_tbl(i).end_date + 1) THEN
1686                 IF(TRUNC(x_uf_details_tbl(i+1).start_date) > TRUNC(x_uf_details_tbl(i).end_date + 1)) THEN
1687                     FND_MESSAGE.Set_Name('AHL','AHL_UMP_UF_GAPS_IN_UF');
1688                 ELSE
1689                     FND_MESSAGE.Set_Name('AHL','AHL_UMP_UF_OLAPS_IN_UF');
1690                 END IF;
1691                 FND_MESSAGE.Set_Token('FSTART_DATE',x_uf_details_tbl(i).start_date);
1692                 FND_MESSAGE.Set_Token('FEND_DATE',x_uf_details_tbl(i).end_date);
1693                 FND_MESSAGE.Set_Token('FUOM_CODE',x_uf_details_tbl(i).uom_code);
1694                 FND_MESSAGE.Set_Token('FUSAGE_PER_DAY',x_uf_details_tbl(i).usage_per_day);
1695                 FND_MESSAGE.Set_Token('NSTART_DATE',x_uf_details_tbl(i+1).start_date);
1696                 FND_MESSAGE.Set_Token('NEND_DATE',x_uf_details_tbl(i+1).end_date);
1697                 FND_MESSAGE.Set_Token('NUOM_CODE',x_uf_details_tbl(i+1).uom_code);
1698                 FND_MESSAGE.Set_Token('NUSAGE_PER_DAY',x_uf_details_tbl(i+1).usage_per_day);
1699                 FND_MSG_PUB.ADD;
1700                END IF;
1701             END IF;
1702         END IF;
1703      END LOOP;
1704     END IF;
1705 
1706     IF FND_MSG_PUB.count_msg > 0 THEN
1707         RAISE  FND_API.G_EXC_ERROR;
1708     END IF;
1709 
1710 END validate_utilization_forecast;
1711 
1712 --------------------------------------------------------------------------------
1713 -- This procedure writes message.
1714 --------------------------------------------------------------------------------
1715 PROCEDURE default_unchanged_uf_details(
1716     p_x_uf_details_tbl           IN OUT NOCOPY     AHL_UMP_UF_PVT.uf_details_tbl_type
1717     ) IS
1718 
1719 CURSOR uf_details_csr(p_uf_detail_id IN NUMBER, p_object_version_number IN NUMBER) IS
1720 SELECT uf_header_id,end_date,attribute_category, attribute1,attribute2, attribute3, attribute4,
1724 WHERE object_version_number= p_object_version_number
1721      attribute5, attribute6, attribute7, attribute8, attribute9, attribute10, attribute11,
1722      attribute12, attribute13, attribute14, attribute15
1723 FROM ahl_uf_details
1725 AND uf_detail_id = p_uf_detail_id;
1726 
1727 l_uf_details_rec AHL_UMP_UF_PVT.uf_details_rec_type;
1728 
1729 BEGIN
1730     FOR i IN p_x_uf_details_tbl.FIRST..p_x_uf_details_tbl.LAST  LOOP
1731     IF(p_x_uf_details_tbl(i).operation_flag = AHL_UMP_UF_PVT.G_OP_UPDATE) THEN
1732         OPEN uf_details_csr(p_x_uf_details_tbl(i).uf_detail_id, p_x_uf_details_tbl(i).object_version_number);
1733         FETCH uf_details_csr INTO l_uf_details_rec.uf_header_id,l_uf_details_rec.end_date,l_uf_details_rec.attribute_category,l_uf_details_rec.attribute1,l_uf_details_rec.attribute2,
1737         IF (uf_details_csr%NOTFOUND) THEN
1734          l_uf_details_rec.attribute3, l_uf_details_rec.attribute4, l_uf_details_rec.attribute5, l_uf_details_rec.attribute6, l_uf_details_rec.attribute7,
1735          l_uf_details_rec.attribute8, l_uf_details_rec.attribute9, l_uf_details_rec.attribute10, l_uf_details_rec.attribute11, l_uf_details_rec.attribute12,
1736          l_uf_details_rec.attribute13, l_uf_details_rec.attribute14, l_uf_details_rec.attribute15;
1738             FND_MESSAGE.Set_Name(G_APP_NAME,'AHL_UMP_UF_DET_OBJV_MIS');
1739             FND_MSG_PUB.ADD;
1740         ELSE
1741             IF (p_x_uf_details_tbl(i).uf_header_id is null) THEN
1742                 p_x_uf_details_tbl(i).uf_header_id := l_uf_details_rec.uf_header_id;
1743             ELSIF(p_x_uf_details_tbl(i).uf_header_id = FND_API.G_MISS_NUM) THEN
1744                 p_x_uf_details_tbl(i).uf_header_id := null;
1745             END IF;
1746 
1747             IF (p_x_uf_details_tbl(i).end_date is null) THEN
1748                 p_x_uf_details_tbl(i).end_date := l_uf_details_rec.end_date;
1749             ELSIF(p_x_uf_details_tbl(i).end_date = FND_API.G_MISS_DATE) THEN
1750                 p_x_uf_details_tbl(i).end_date := null;
1751             END IF;
1752 
1753             IF (p_x_uf_details_tbl(i).attribute_category is null) THEN
1757             END IF;
1754                 p_x_uf_details_tbl(i).attribute_category := l_uf_details_rec.attribute_category;
1755             ELSIF(p_x_uf_details_tbl(i).attribute_category = FND_API.G_MISS_CHAR) THEN
1756                 p_x_uf_details_tbl(i).attribute_category := null;
1758 
1759             IF (p_x_uf_details_tbl(i).attribute1 is null) THEN
1760                 p_x_uf_details_tbl(i).attribute1 := l_uf_details_rec.attribute1;
1761             ELSIF(p_x_uf_details_tbl(i).attribute1 = FND_API.G_MISS_CHAR) THEN
1762                 p_x_uf_details_tbl(i).attribute1 := null;
1763             END IF;
1764 
1765             IF (p_x_uf_details_tbl(i).attribute2 is null) THEN
1766                 p_x_uf_details_tbl(i).attribute2 := l_uf_details_rec.attribute2;
1767             ELSIF(p_x_uf_details_tbl(i).attribute2 = FND_API.G_MISS_CHAR) THEN
1768                 p_x_uf_details_tbl(i).attribute2 := null;
1769             END IF;
1770 
1771             IF (p_x_uf_details_tbl(i).attribute3 is null) THEN
1772                 p_x_uf_details_tbl(i).attribute3 := l_uf_details_rec.attribute3;
1773             ELSIF(p_x_uf_details_tbl(i).attribute3 = FND_API.G_MISS_CHAR) THEN
1774                 p_x_uf_details_tbl(i).attribute3 := null;
1775             END IF;
1776 
1777             IF (p_x_uf_details_tbl(i).attribute4 is null) THEN
1778                 p_x_uf_details_tbl(i).attribute4 := l_uf_details_rec.attribute4;
1779             ELSIF(p_x_uf_details_tbl(i).attribute4 = FND_API.G_MISS_CHAR) THEN
1780                 p_x_uf_details_tbl(i).attribute4 := null;
1781             END IF;
1782 
1783             IF (p_x_uf_details_tbl(i).attribute5 is null) THEN
1784                 p_x_uf_details_tbl(i).attribute5 := l_uf_details_rec.attribute5;
1785             ELSIF(p_x_uf_details_tbl(i).attribute5 = FND_API.G_MISS_CHAR) THEN
1786                 p_x_uf_details_tbl(i).attribute5 := null;
1787             END IF;
1788 
1789             IF (p_x_uf_details_tbl(i).attribute6 is null) THEN
1790                 p_x_uf_details_tbl(i).attribute6 := l_uf_details_rec.attribute6;
1791             ELSIF(p_x_uf_details_tbl(i).attribute6 = FND_API.G_MISS_CHAR) THEN
1792                 p_x_uf_details_tbl(i).attribute6 := null;
1793             END IF;
1794 
1795             IF (p_x_uf_details_tbl(i).attribute7 is null) THEN
1796                 p_x_uf_details_tbl(i).attribute7 := l_uf_details_rec.attribute7;
1797             ELSIF(p_x_uf_details_tbl(i).attribute7 = FND_API.G_MISS_CHAR) THEN
1798                 p_x_uf_details_tbl(i).attribute7 := null;
1799             END IF;
1800 
1801             IF (p_x_uf_details_tbl(i).attribute8 is null) THEN
1802                 p_x_uf_details_tbl(i).attribute8 := l_uf_details_rec.attribute8;
1803             ELSIF(p_x_uf_details_tbl(i).attribute8 = FND_API.G_MISS_CHAR) THEN
1804                 p_x_uf_details_tbl(i).attribute8 := null;
1805             END IF;
1806 
1807             IF (p_x_uf_details_tbl(i).attribute9 is null) THEN
1808                 p_x_uf_details_tbl(i).attribute9 := l_uf_details_rec.attribute9;
1809             ELSIF(p_x_uf_details_tbl(i).attribute9 = FND_API.G_MISS_CHAR) THEN
1810                 p_x_uf_details_tbl(i).attribute9 := null;
1811             END IF;
1812 
1813             IF (p_x_uf_details_tbl(i).attribute10 is null) THEN
1814                 p_x_uf_details_tbl(i).attribute10 := l_uf_details_rec.attribute10;
1815             ELSIF(p_x_uf_details_tbl(i).attribute10 = FND_API.G_MISS_CHAR) THEN
1816                 p_x_uf_details_tbl(i).attribute10 := null;
1817             END IF;
1818 
1819             IF (p_x_uf_details_tbl(i).attribute11 is null) THEN
1820                 p_x_uf_details_tbl(i).attribute11 := l_uf_details_rec.attribute11;
1821             ELSIF(p_x_uf_details_tbl(i).attribute11 = FND_API.G_MISS_CHAR) THEN
1822                 p_x_uf_details_tbl(i).attribute11 := null;
1823             END IF;
1824 
1825             IF (p_x_uf_details_tbl(i).attribute12 is null) THEN
1826                 p_x_uf_details_tbl(i).attribute12 := l_uf_details_rec.attribute12;
1827             ELSIF(p_x_uf_details_tbl(i).attribute12 = FND_API.G_MISS_CHAR) THEN
1828                 p_x_uf_details_tbl(i).attribute12 := null;
1829             END IF;
1830 
1831             IF (p_x_uf_details_tbl(i).attribute13 is null) THEN
1832                 p_x_uf_details_tbl(i).attribute13 := l_uf_details_rec.attribute13;
1833             ELSIF(p_x_uf_details_tbl(i).attribute13 = FND_API.G_MISS_CHAR) THEN
1834                 p_x_uf_details_tbl(i).attribute13 := null;
1835             END IF;
1836 
1837             IF (p_x_uf_details_tbl(i).attribute14 is null) THEN
1838                 p_x_uf_details_tbl(i).attribute14 := l_uf_details_rec.attribute14;
1839             ELSIF(p_x_uf_details_tbl(i).attribute14 = FND_API.G_MISS_CHAR) THEN
1840                 p_x_uf_details_tbl(i).attribute14 := null;
1841             END IF;
1842 
1843             IF (p_x_uf_details_tbl(i).attribute15 is null) THEN
1844                 p_x_uf_details_tbl(i).attribute15 := l_uf_details_rec.attribute15;
1845             ELSIF(p_x_uf_details_tbl(i).attribute15 = FND_API.G_MISS_CHAR) THEN
1846                 p_x_uf_details_tbl(i).attribute15 := null;
1847             END IF;
1848 
1849         END IF;
1850         CLOSE uf_details_csr;
1851     ELSIF (p_x_uf_details_tbl(i).operation_flag = AHL_UMP_UF_PVT.G_OP_CREATE) THEN
1852 
1853         IF(p_x_uf_details_tbl(i).uf_header_id = FND_API.G_MISS_NUM) THEN
1854                 p_x_uf_details_tbl(i).uf_header_id := null;
1855         END IF;
1856 
1857         IF(p_x_uf_details_tbl(i).end_date = FND_API.G_MISS_DATE) THEN
1858             p_x_uf_details_tbl(i).end_date := null;
1859         END IF;
1863         IF (p_x_uf_details_tbl(i).attribute1 = FND_API.G_MISS_CHAR) THEN
1860         IF (p_x_uf_details_tbl(i).attribute_category = FND_API.G_MISS_CHAR) THEN
1861             p_x_uf_details_tbl(i).attribute_category := null;
1862         END IF;
1864             p_x_uf_details_tbl(i).attribute1 := null;
1865         END IF;
1866         IF (p_x_uf_details_tbl(i).attribute2 = FND_API.G_MISS_CHAR) THEN
1867             p_x_uf_details_tbl(i).attribute2 := null;
1868         END IF;
1869         IF (p_x_uf_details_tbl(i).attribute3 = FND_API.G_MISS_CHAR) THEN
1870             p_x_uf_details_tbl(i).attribute3 := null;
1871         END IF;
1872         IF (p_x_uf_details_tbl(i).attribute4 = FND_API.G_MISS_CHAR) THEN
1873             p_x_uf_details_tbl(i).attribute4 := null;
1874         END IF;
1875         IF (p_x_uf_details_tbl(i).attribute5 = FND_API.G_MISS_CHAR) THEN
1876             p_x_uf_details_tbl(i).attribute5 := null;
1877         END IF;
1878         IF (p_x_uf_details_tbl(i).attribute6 = FND_API.G_MISS_CHAR) THEN
1879             p_x_uf_details_tbl(i).attribute6 := null;
1880         END IF;
1881         IF (p_x_uf_details_tbl(i).attribute7 = FND_API.G_MISS_CHAR) THEN
1882             p_x_uf_details_tbl(i).attribute7 := null;
1883         END IF;
1884         IF (p_x_uf_details_tbl(i).attribute8 = FND_API.G_MISS_CHAR) THEN
1888             p_x_uf_details_tbl(i).attribute9 := null;
1885             p_x_uf_details_tbl(i).attribute8 := null;
1886         END IF;
1887         IF (p_x_uf_details_tbl(i).attribute9 = FND_API.G_MISS_CHAR) THEN
1889         END IF;
1890         IF (p_x_uf_details_tbl(i).attribute10 = FND_API.G_MISS_CHAR) THEN
1891             p_x_uf_details_tbl(i).attribute10 := null;
1892         END IF;
1893         IF (p_x_uf_details_tbl(i).attribute11 = FND_API.G_MISS_CHAR) THEN
1894             p_x_uf_details_tbl(i).attribute11 := null;
1895         END IF;
1896         IF (p_x_uf_details_tbl(i).attribute12 = FND_API.G_MISS_CHAR) THEN
1897             p_x_uf_details_tbl(i).attribute12 := null;
1898         END IF;
1899         IF (p_x_uf_details_tbl(i).attribute13 = FND_API.G_MISS_CHAR) THEN
1900             p_x_uf_details_tbl(i).attribute13 := null;
1901         END IF;
1902         IF (p_x_uf_details_tbl(i).attribute14 = FND_API.G_MISS_CHAR) THEN
1903             p_x_uf_details_tbl(i).attribute14 := null;
1904         END IF;
1905         IF (p_x_uf_details_tbl(i).attribute15 = FND_API.G_MISS_CHAR) THEN
1906             p_x_uf_details_tbl(i).attribute15 := null;
1907         END IF;
1908 
1909     END IF;
1910     END LOOP;
1911 
1912 END default_unchanged_uf_details;
1913 -------------------------------------------------------------------------------------
1914 -- This procedure deletes header if no forecast detials and use unit flag is also 'N'
1915 -------------------------------------------------------------------------------------
1916 PROCEDURE post_process_uf_header(
1917     p_uf_header_rec    IN AHL_UMP_UF_PVT.uf_header_Rec_type
1918     ) IS
1919 
1920     CURSOR uf_details_csr (p_uf_header_id  IN  NUMBER) IS
1921     SELECT 'x'
1922     FROM ahl_uf_details WHERE uf_header_id = p_uf_header_id;
1923 
1924     l_exist VARCHAR2(1);
1925 
1926 
1927 BEGIN
1928     IF(p_uf_header_rec.use_unit_flag IS NULL OR p_uf_header_rec.use_unit_flag = G_UF_USE_UNIT_DEFAULT) THEN
1929       OPEN uf_details_csr (p_uf_header_rec.uf_header_id);
1930       FETCH uf_details_csr INTO l_exist;
1931       IF(uf_details_csr%NOTFOUND) THEN
1932          AHL_UF_HEADERS_PKG.delete_row(p_uf_header_rec.uf_header_id);
1933       END IF;
1934       CLOSE uf_details_csr;
1935     END IF;
1936 END post_process_uf_header;
1937 
1938 
1939 
1940 ----------------------------------------------------------------------
1941 -- Procedure to get Utilzation Forecast from Product Classification --
1942 ----------------------------------------------------------------------
1943 -- added parameter p_add_unit_item_forecast to fix bug# 6749351.
1944 -- This flag is currently being applied to only item based forecasts.
1945 PROCEDURE get_uf_from_pc (
1946                           p_init_msg_list               IN            VARCHAR2  := FND_API.G_FALSE,
1947                           p_pc_node_id                  IN            NUMBER := NULL,
1948                           p_inventory_item_id           IN            NUMBER := NULL,
1949                           p_inventory_org_id            IN            NUMBER := NULL,
1950                           p_unit_config_header_id       IN            NUMBER := NULL,
1951                           p_unit_name                   IN            VARCHAR2:=NULL,
1952                           p_part_number                 IN            VARCHAR2 :=NULL,
1953                           p_onward_end_date             IN            DATE     := NULL,
1954                           p_add_unit_item_forecast IN  VARCHAR2  := 'N',
1955                           x_UF_details_tbl              OUT NOCOPY    AHL_UMP_UF_PVT.uf_details_tbl_type,
1956                           x_return_status               OUT NOCOPY    VARCHAR2)
1957 IS
1958 --
1959  CURSOR ahl_get_config_header_id_csr(c_unit_name  IN   VARCHAR2) IS
1960    SELECT  unit_config_header_id
1961     FROM    ahl_unit_config_headers
1962     WHERE   name = c_unit_name;
1963 --
1964  CURSOR ahl_get_inv_item_id_csr(c_part_number  IN   mtl_system_items_kfv.concatenated_segments%TYPE) IS
1965    SELECT  inventory_item_id
1966     FROM    mtl_system_items_kfv
1967     WHERE   concatenated_segments = c_part_number;
1968 --
1969  CURSOR ahl_pc_id_from_assoc_csr(c_unit_config_header_id  IN NUMBER,
1970                 c_type IN VARCHAR2,
1971                 c_primary_flag IN VARCHAR2,
1972                 c_complete_status IN VARCHAR2 ) IS
1973    SELECT a.pc_node_id
1974     FROM  ahl_pc_associations a, ahl_pc_nodes_b b, ahl_pc_headers_b c
1975     WHERE   a.unit_item_id = c_unit_config_header_id
1976       AND   a.association_type_flag = c_type
1977       AND   a.pc_node_id = b.pc_node_id
1978       AND   b.pc_header_id = c.pc_header_id
1979       AND   c.primary_flag = c_primary_flag
1980       AND   c.status = c_complete_status;
1981 --
1982  CURSOR ahl_item_id_from_uc_header_csr(c_uc_header_id IN NUMBER) IS
1983     SELECT a.inventory_item_id
1984       FROM csi_item_instances a, ahl_unit_config_headers b
1985      WHERE a.instance_id = b.csi_item_instance_id
1986        AND b.unit_config_header_id = c_uc_header_id;
1987 --
1988  CURSOR ahl_check_pc_id_csr(p_pc_node_id  IN NUMBER,
1989                 c_primary_flag IN VARCHAR2,
1990                 c_complete_status IN VARCHAR2 ) IS
1991   SELECT 'x'
1992     FROM   ahl_pc_nodes_b a, ahl_pc_headers_b b
1993     WHERE   a.pc_node_id = p_pc_node_id
1994       AND   a.pc_header_id = b.pc_header_id
1995       AND   b.primary_flag = c_primary_flag
1996       AND   b.status = c_complete_status;
1997 --
1998  CURSOR ahl_trav_pc_nodes_csr (c_pc_id  IN   NUMBER) IS
1999    SELECT  pc_node_id
2005    SELECT  distinct a.uom_code
2000     FROM    ahl_pc_nodes_b
2001     START WITH pc_node_id = c_pc_id
2002     CONNECT BY pc_node_id = PRIOR parent_node_id;
2003 --
2004  CURSOR ahl_uf_uom_nodes_csr (c_pc_id  IN   NUMBER) IS
2006     FROM    ahl_uf_details a, ahl_uf_headers b
2007     WHERE a.uf_header_id = b.uf_header_id
2008      AND  b.pc_node_id = c_pc_id
2009      -- JKJain, NR Analysis and Forecasting
2010      order by uom_code;
2011 --
2012  CURSOR ahl_uf_details_csr (c_pc_id  IN   NUMBER, p_uom_code IN VARCHAR2) IS
2013    SELECT  a.UF_DETAIL_ID,
2014         a.OBJECT_VERSION_NUMBER,
2015            a.LAST_UPDATE_DATE   ,
2016            a.LAST_UPDATED_BY    ,
2017            a.CREATION_DATE      ,
2018            a.CREATED_BY         ,
2019            a.LAST_UPDATE_LOGIN  ,
2020            a.UF_HEADER_ID       ,
2021            a.UOM_CODE           ,
2022            a.START_DATE         ,
2023            a.END_DATE           ,
2024            a.USAGE_PER_DAY      ,
2025            a.ATTRIBUTE_CATEGORY ,
2026            a.ATTRIBUTE1  ,
2027            a.ATTRIBUTE2  ,
2028            a.ATTRIBUTE3  ,
2029            a.ATTRIBUTE4  ,
2030            a.ATTRIBUTE5  ,
2031            a.ATTRIBUTE6  ,
2032            a.ATTRIBUTE7  ,
2033            a.ATTRIBUTE8  ,
2034            a.ATTRIBUTE9  ,
2035            a.ATTRIBUTE10 ,
2036            a.ATTRIBUTE11 ,
2037            a.ATTRIBUTE12 ,
2038            a.ATTRIBUTE13 ,
2039            a.ATTRIBUTE14 ,
2040            a.ATTRIBUTE15
2041     FROM    ahl_uf_details a, ahl_uf_headers b
2042     WHERE a.uom_code = p_uom_code
2043      AND  b.pc_node_id = c_pc_id
2044      AND a.uf_header_id = b.uf_header_id;
2045 --
2046    CURSOR ahl_uf_details_date_csr (p_pc_id  IN   NUMBER, p_uom_code IN VARCHAR2,p_onward_end_date IN DATE) IS
2047    SELECT  a.UF_DETAIL_ID,
2048         a.OBJECT_VERSION_NUMBER,
2049            a.LAST_UPDATE_DATE   ,
2050            a.LAST_UPDATED_BY    ,
2051            a.CREATION_DATE      ,
2052            a.CREATED_BY         ,
2053            a.LAST_UPDATE_LOGIN  ,
2054            a.UF_HEADER_ID       ,
2055            a.UOM_CODE           ,
2056            a.START_DATE         ,
2057            a.END_DATE           ,
2058            a.USAGE_PER_DAY      ,
2059            a.ATTRIBUTE_CATEGORY ,
2060            a.ATTRIBUTE1  ,
2061            a.ATTRIBUTE2  ,
2062            a.ATTRIBUTE3  ,
2063            a.ATTRIBUTE4  ,
2064            a.ATTRIBUTE5  ,
2065            a.ATTRIBUTE6  ,
2066            a.ATTRIBUTE7  ,
2067            a.ATTRIBUTE8  ,
2068            a.ATTRIBUTE9  ,
2069            a.ATTRIBUTE10 ,
2070            a.ATTRIBUTE11 ,
2071            a.ATTRIBUTE12 ,
2072            a.ATTRIBUTE13 ,
2073            a.ATTRIBUTE14 ,
2074            a.ATTRIBUTE15
2075     FROM    ahl_uf_details a, ahl_uf_headers b
2076     WHERE (a.end_date IS NULL OR TRUNC(a.end_date) >= TRUNC(p_onward_end_date))
2077      AND a.uf_header_id = b.uf_header_id
2078      AND a.uom_code = p_uom_code
2079      AND  b.pc_node_id = p_pc_id;
2080 
2081    -- added to fix bug# 6749351
2082    CURSOR ahl_uf_uom_item_csr (p_inventory_item_id  IN   NUMBER) IS
2083    SELECT  distinct a.uom_code
2084    FROM    ahl_uf_details a, ahl_uf_headers b
2085    WHERE a.uf_header_id = b.uf_header_id
2086       AND  b.inventory_item_id = p_inventory_item_id
2087    -- JKJain, NR Analysis and Forecasting
2088       order by uom_code;
2089 
2090    -- get uf details for item for all dates.
2091    CURSOR ahl_uf_item_details_csr(p_inventory_item_id IN   NUMBER,
2092                                   p_uom_code          IN   VARCHAR2) IS
2093    SELECT  a.UF_DETAIL_ID,
2094         a.OBJECT_VERSION_NUMBER,
2095            a.LAST_UPDATE_DATE   ,
2096            a.LAST_UPDATED_BY    ,
2097            a.CREATION_DATE      ,
2098            a.CREATED_BY         ,
2099            a.LAST_UPDATE_LOGIN  ,
2100            a.UF_HEADER_ID       ,
2101            a.UOM_CODE           ,
2102            a.START_DATE         ,
2103            a.END_DATE           ,
2104            a.USAGE_PER_DAY      ,
2105            a.ATTRIBUTE_CATEGORY ,
2106            a.ATTRIBUTE1  ,
2107            a.ATTRIBUTE2  ,
2108            a.ATTRIBUTE3  ,
2109            a.ATTRIBUTE4  ,
2110            a.ATTRIBUTE5  ,
2111            a.ATTRIBUTE6  ,
2112            a.ATTRIBUTE7  ,
2113            a.ATTRIBUTE8  ,
2114            a.ATTRIBUTE9  ,
2115            a.ATTRIBUTE10 ,
2116            a.ATTRIBUTE11 ,
2117            a.ATTRIBUTE12 ,
2118            a.ATTRIBUTE13 ,
2119            a.ATTRIBUTE14 ,
2120            a.ATTRIBUTE15
2121     FROM    ahl_uf_details a, ahl_uf_headers b
2122     WHERE a.uf_header_id = b.uf_header_id
2123      AND a.uom_code = p_uom_code
2124      AND  b.inventory_item_id = p_inventory_item_id;
2125 
2126    -- get uf details for item based on p_onward_end_date.
2127    CURSOR ahl_uf_item_details_date_csr(p_inventory_item_id IN   NUMBER,
2128                                        p_uom_code          IN   VARCHAR2,
2129                                        p_onward_end_date   IN   DATE) IS
2130    SELECT  a.UF_DETAIL_ID,
2131         a.OBJECT_VERSION_NUMBER,
2135            a.CREATED_BY         ,
2132            a.LAST_UPDATE_DATE   ,
2133            a.LAST_UPDATED_BY    ,
2134            a.CREATION_DATE      ,
2136            a.LAST_UPDATE_LOGIN  ,
2137            a.UF_HEADER_ID       ,
2138            a.UOM_CODE           ,
2139            a.START_DATE         ,
2140            a.END_DATE           ,
2141            a.USAGE_PER_DAY      ,
2142            a.ATTRIBUTE_CATEGORY ,
2143            a.ATTRIBUTE1  ,
2144            a.ATTRIBUTE2  ,
2145            a.ATTRIBUTE3  ,
2146            a.ATTRIBUTE4  ,
2147            a.ATTRIBUTE5  ,
2148            a.ATTRIBUTE6  ,
2149            a.ATTRIBUTE7  ,
2150            a.ATTRIBUTE8  ,
2151            a.ATTRIBUTE9  ,
2152            a.ATTRIBUTE10 ,
2153            a.ATTRIBUTE11 ,
2154            a.ATTRIBUTE12 ,
2155            a.ATTRIBUTE13 ,
2156            a.ATTRIBUTE14 ,
2157            a.ATTRIBUTE15
2158     FROM    ahl_uf_details a, ahl_uf_headers b
2159     WHERE (a.end_date IS NULL OR TRUNC(a.end_date) >= TRUNC(p_onward_end_date))
2160     AND a.uf_header_id = b.uf_header_id
2161      AND a.uom_code = p_uom_code
2162      AND  b.inventory_item_id = p_inventory_item_id;
2163 
2164    -- added to fix bug# 6749351
2165    CURSOR ahl_uf_uom_unit_csr (p_unit_config_id IN  NUMBER) IS
2166    SELECT  distinct a.uom_code
2167    FROM    ahl_uf_details a, ahl_uf_headers b
2168    WHERE a.uf_header_id = b.uf_header_id
2169       AND  b.unit_config_header_id = p_unit_config_id
2170       order by uom_code;
2171 
2172    -- get uf details for item for all dates.
2176         a.OBJECT_VERSION_NUMBER,
2173    CURSOR ahl_uf_unit_details_csr(p_unit_config_id IN   NUMBER,
2174                                   p_uom_code          IN   VARCHAR2) IS
2175    SELECT  a.UF_DETAIL_ID,
2177            a.LAST_UPDATE_DATE   ,
2178            a.LAST_UPDATED_BY    ,
2179            a.CREATION_DATE      ,
2180            a.CREATED_BY         ,
2181            a.LAST_UPDATE_LOGIN  ,
2182            a.UF_HEADER_ID       ,
2183            a.UOM_CODE           ,
2184            a.START_DATE         ,
2185            a.END_DATE           ,
2186            a.USAGE_PER_DAY      ,
2187            a.ATTRIBUTE_CATEGORY ,
2188            a.ATTRIBUTE1  ,
2189            a.ATTRIBUTE2  ,
2190            a.ATTRIBUTE3  ,
2191            a.ATTRIBUTE4  ,
2192            a.ATTRIBUTE5  ,
2193            a.ATTRIBUTE6  ,
2194            a.ATTRIBUTE7  ,
2195            a.ATTRIBUTE8  ,
2196            a.ATTRIBUTE9  ,
2197            a.ATTRIBUTE10 ,
2198            a.ATTRIBUTE11 ,
2199            a.ATTRIBUTE12 ,
2200            a.ATTRIBUTE13 ,
2201            a.ATTRIBUTE14 ,
2202            a.ATTRIBUTE15
2203     FROM    ahl_uf_details a, ahl_uf_headers b
2204     WHERE a.uf_header_id = b.uf_header_id
2205      AND a.uom_code = p_uom_code
2206      AND  b.unit_config_header_id = p_unit_config_id;
2207 
2208    -- get uf details for item based on p_onward_end_date.
2209    CURSOR ahl_uf_unit_details_date_csr(p_unit_config_id    IN   NUMBER,
2210                                        p_uom_code          IN   VARCHAR2,
2211                                        p_onward_end_date   IN   DATE) IS
2212    SELECT  a.UF_DETAIL_ID,
2213         a.OBJECT_VERSION_NUMBER,
2214            a.LAST_UPDATE_DATE   ,
2215            a.LAST_UPDATED_BY    ,
2216            a.CREATION_DATE      ,
2217            a.CREATED_BY         ,
2221            a.START_DATE         ,
2218            a.LAST_UPDATE_LOGIN  ,
2219            a.UF_HEADER_ID       ,
2220            a.UOM_CODE           ,
2222            a.END_DATE           ,
2223            a.USAGE_PER_DAY      ,
2224            a.ATTRIBUTE_CATEGORY ,
2225            a.ATTRIBUTE1  ,
2226            a.ATTRIBUTE2  ,
2227            a.ATTRIBUTE3  ,
2228            a.ATTRIBUTE4  ,
2229            a.ATTRIBUTE5  ,
2230            a.ATTRIBUTE6  ,
2231            a.ATTRIBUTE7  ,
2232            a.ATTRIBUTE8  ,
2233            a.ATTRIBUTE9  ,
2234            a.ATTRIBUTE10 ,
2235            a.ATTRIBUTE11 ,
2236            a.ATTRIBUTE12 ,
2237            a.ATTRIBUTE13 ,
2238            a.ATTRIBUTE14 ,
2239            a.ATTRIBUTE15
2240     FROM    ahl_uf_details a, ahl_uf_headers b
2241     WHERE (a.end_date IS NULL OR TRUNC(a.end_date) >= TRUNC(p_onward_end_date))
2242     AND a.uf_header_id = b.uf_header_id
2243     AND a.uom_code = p_uom_code
2244     AND  b.unit_config_header_id = p_unit_config_id;
2245 --
2246     l_UF_details_tbl         AHL_UMP_UF_PVT.uf_details_tbl_type;
2247     l_UF_details_rec         AHL_UMP_UF_PVT.uf_details_rec_type;
2248     l_temp_details_rec         ahl_uf_details_csr%ROWTYPE;
2249     l_unit_config_header_id     NUMBER DEFAULT p_unit_config_header_id;
2250     l_inventory_item_id         NUMBER DEFAULT p_inventory_item_id;
2251     l_pc_node_id           NUMBER DEFAULT p_PC_node_id;
2252     l_pc_id          NUMBER;
2253     l_uom_code       AHL_UF_DETAILS.UOM_CODE%TYPE;
2254     l_msg_count      NUMBER;
2255     l_duplicate      VARCHAR2(1);
2256     l_junk           VARCHAR2(1);
2257     j                NUMBER;
2258 --
2259 BEGIN
2260 
2261   -- Initialize Procedure return status to success
2262    -- Initialize message list if p_init_msg_list is set to TRUE
2263   IF FND_API.To_Boolean( p_init_msg_list)
2264   THEN
2265     FND_MSG_PUB.Initialize;
2266   END IF;
2267 
2268   -- Initialize API return status to success
2269   x_return_status := FND_API.G_RET_STS_SUCCESS;   j := 0;
2270 
2271   --Part 1. Resolve all possible inputs to l_pc_node_id
2272 
2273   --Resolve unit name into unit config header id
2274   IF (p_unit_config_header_id IS NULL AND p_unit_name IS NOT NULL) THEN
2275      OPEN ahl_get_config_header_id_csr(p_unit_name);
2276      FETCH ahl_get_config_header_id_csr INTO l_unit_config_header_id;
2277      CLOSE ahl_get_config_header_id_csr;
2278   END IF;
2279 
2280   --Resolve part number into inventory item id
2281   IF (p_inventory_item_id IS NULL AND p_part_number IS NOT NULL) THEN
2282      OPEN ahl_get_inv_item_id_csr(p_part_number);
2283      FETCH ahl_get_inv_item_id_csr INTO l_inventory_item_id;
2284      CLOSE ahl_get_inv_item_id_csr;
2285   END IF;
2286 
2287   --Verify that exactly one of the IDs is defined.
2288   IF ((l_pc_node_id IS NULL AND
2289        l_inventory_item_id IS NULL AND
2290        l_unit_config_header_id IS NULL)
2291       OR (l_pc_node_id IS NOT NULL AND
2292           l_inventory_item_id IS NOT NULL)
2293       OR (l_pc_node_id IS NOT NULL AND
2294           l_unit_config_header_id IS NOT NULL)
2295       OR (l_unit_config_header_id IS NOT NULL AND
2296           l_inventory_item_id IS NOT NULL) ) THEN
2297          FND_MESSAGE.Set_Name('AHL','AHL_UMP_UTIL_ONLY_ONE_ID');
2298          FND_MSG_PUB.ADD;
2299   END IF;
2300 
2301   l_msg_count := FND_MSG_PUB.count_msg;
2302   IF l_msg_count > 0 THEN
2303      x_return_status := FND_API.G_RET_STS_ERROR;
2304      RETURN;
2305   END IF;
2306 
2307   --Now verify pc node id is in 'COMPLETE' and 'PRIMARY' PC tree
2308   IF (l_pc_node_id IS NOT NULL) THEN
2309       OPEN ahl_check_pc_id_csr(l_pc_node_id,
2310                       AHL_UMP_UF_PVT.G_PC_PRIMARY_FLAG,
2311                       AHL_UMP_UF_PVT.G_COMPLETE_STATUS);
2312       FETCH ahl_check_pc_id_csr INTO l_junk;
2313       IF (ahl_check_pc_id_csr%NOTFOUND) THEN
2314       l_pc_node_id := NULL;
2315   --       FND_MESSAGE.Set_Name('AHL','AHL_UMP_UTIL_NO_PRIM_PC');
2316   --       FND_MESSAGE.Set_Token('UID',l_pc_node_id);
2317   --      FND_MSG_PUB.ADD;
2318       END IF;
2319       CLOSE ahl_check_pc_id_csr;
2320   END IF;
2321 
2322   --Resolve unit_config_header_id into a pc node id
2323   IF (l_unit_config_header_id IS NOT NULL) THEN
2324      OPEN ahl_pc_id_from_assoc_csr(l_unit_config_header_id,
2325                  AHL_UMP_UF_PVT.G_PC_UNIT_ASSOCIATION,
2326                  AHL_UMP_UF_PVT.G_PC_PRIMARY_FLAG,
2327                  AHL_UMP_UF_PVT.G_COMPLETE_STATUS);
2328      FETCH ahl_pc_id_from_assoc_csr INTO l_pc_node_id;
2329      IF (ahl_pc_id_from_assoc_csr%NOTFOUND) THEN
2330         l_pc_node_id := NULL;
2331 
2332         --If can not find PC as unit, then try it with item
2333         OPEN ahl_item_id_from_uc_header_csr(l_unit_config_header_id);
2334         FETCH ahl_item_id_from_uc_header_csr INTO l_inventory_item_id;
2335     CLOSE ahl_item_id_from_uc_header_csr;
2336 
2337      --   FND_MESSAGE.Set_Name('AHL','AHL_UMP_UTIL_NO_PRIM_PC');
2338      --   FND_MESSAGE.Set_Token('UID',l_unit_config_header_id);
2339      --   FND_MSG_PUB.ADD;
2340      END IF;
2341      CLOSE ahl_pc_id_from_assoc_csr;
2342 
2343      /*
2344      -- Added to fix bug# 6749351
2345      IF (p_add_unit_item_forecast = 'Y') THEN
2346       OPEN ahl_uf_uom_unit_csr(l_unit_config_header_id);
2347       LOOP
2348          FETCH ahl_uf_uom_unit_csr INTO l_uom_code;
2349          EXIT WHEN ahl_uf_uom_unit_csr%NOTFOUND;
2350          IF(p_onward_end_date IS NULL) THEN
2351             OPEN ahl_uf_unit_details_csr(l_unit_config_header_id, l_uom_code);
2352             LOOP
2353               FETCH ahl_uf_unit_details_csr INTO l_temp_details_rec;
2354               EXIT WHEN ahl_uf_unit_details_csr%NOTFOUND;
2355 
2359               l_UF_details_rec.LAST_UPDATED_BY    := l_temp_details_rec.LAST_UPDATED_BY ;
2356               l_UF_details_rec.UF_DETAIL_ID  := l_temp_details_rec.UF_DETAIL_ID;
2357               l_UF_details_rec.OBJECT_VERSION_NUMBER := l_temp_details_rec.OBJECT_VERSION_NUMBER ;
2358               l_UF_details_rec.LAST_UPDATE_DATE   := l_temp_details_rec.LAST_UPDATE_DATE ;
2360               l_UF_details_rec.CREATION_DATE      := l_temp_details_rec.CREATION_DATE ;
2361               l_UF_details_rec.CREATED_BY         := l_temp_details_rec.CREATED_BY ;
2362               l_UF_details_rec.LAST_UPDATE_LOGIN  := l_temp_details_rec.LAST_UPDATE_LOGIN ;
2363               l_UF_details_rec.UF_HEADER_ID       := l_temp_details_rec.UF_HEADER_ID ;
2364               l_UF_details_rec.UOM_CODE           := l_temp_details_rec.UOM_CODE ;
2365               l_UF_details_rec.START_DATE         := l_temp_details_rec.START_DATE ;
2366               l_UF_details_rec.END_DATE           := l_temp_details_rec.END_DATE ;
2367               l_UF_details_rec.USAGE_PER_DAY      := l_temp_details_rec.USAGE_PER_DAY ;
2368               l_UF_details_rec.ATTRIBUTE_CATEGORY := l_temp_details_rec.ATTRIBUTE_CATEGORY ;
2369               l_UF_details_rec.ATTRIBUTE1  := l_temp_details_rec.ATTRIBUTE1 ;
2370               l_UF_details_rec.ATTRIBUTE2  := l_temp_details_rec.ATTRIBUTE2 ;
2371               l_UF_details_rec.ATTRIBUTE3  := l_temp_details_rec.ATTRIBUTE3 ;
2372               l_UF_details_rec.ATTRIBUTE4  := l_temp_details_rec.ATTRIBUTE4 ;
2373               l_UF_details_rec.ATTRIBUTE5  := l_temp_details_rec.ATTRIBUTE5 ;
2374               l_UF_details_rec.ATTRIBUTE6  := l_temp_details_rec.ATTRIBUTE6 ;
2375               l_UF_details_rec.ATTRIBUTE7  := l_temp_details_rec.ATTRIBUTE7 ;
2376               l_UF_details_rec.ATTRIBUTE8  := l_temp_details_rec.ATTRIBUTE8 ;
2377               l_UF_details_rec.ATTRIBUTE9  := l_temp_details_rec.ATTRIBUTE9 ;
2378               l_UF_details_rec.ATTRIBUTE10 := l_temp_details_rec.ATTRIBUTE10 ;
2379               l_UF_details_rec.ATTRIBUTE11 := l_temp_details_rec.ATTRIBUTE11 ;
2380               l_UF_details_rec.ATTRIBUTE12 := l_temp_details_rec.ATTRIBUTE12 ;
2381               l_UF_details_rec.ATTRIBUTE13 := l_temp_details_rec.ATTRIBUTE13 ;
2382               l_UF_details_rec.ATTRIBUTE14 := l_temp_details_rec.ATTRIBUTE14 ;
2383               l_UF_details_rec.ATTRIBUTE15 := l_temp_details_rec.ATTRIBUTE15 ;
2384               l_UF_details_tbl(j) := l_UF_details_rec;
2385               j := j+1;
2386             END LOOP;
2387             CLOSE ahl_uf_unit_details_csr;
2388         ELSE
2389             OPEN ahl_uf_unit_details_date_csr(l_unit_config_header_id, l_uom_code,p_onward_end_date);
2390             LOOP
2391               FETCH ahl_uf_unit_details_date_csr INTO l_temp_details_rec;
2392               EXIT WHEN ahl_uf_unit_details_date_csr%NOTFOUND;
2393 
2394               l_UF_details_rec.UF_DETAIL_ID  := l_temp_details_rec.UF_DETAIL_ID;
2395               l_UF_details_rec.OBJECT_VERSION_NUMBER := l_temp_details_rec.OBJECT_VERSION_NUMBER ;
2396               l_UF_details_rec.LAST_UPDATE_DATE   := l_temp_details_rec.LAST_UPDATE_DATE ;
2397               l_UF_details_rec.LAST_UPDATED_BY    := l_temp_details_rec.LAST_UPDATED_BY ;
2398               l_UF_details_rec.CREATION_DATE      := l_temp_details_rec.CREATION_DATE ;
2399               l_UF_details_rec.CREATED_BY         := l_temp_details_rec.CREATED_BY ;
2400               l_UF_details_rec.LAST_UPDATE_LOGIN  := l_temp_details_rec.LAST_UPDATE_LOGIN ;
2401               l_UF_details_rec.UF_HEADER_ID       := l_temp_details_rec.UF_HEADER_ID ;
2402               l_UF_details_rec.UOM_CODE           := l_temp_details_rec.UOM_CODE ;
2403               l_UF_details_rec.START_DATE         := l_temp_details_rec.START_DATE ;
2404               l_UF_details_rec.END_DATE           := l_temp_details_rec.END_DATE ;
2405               l_UF_details_rec.USAGE_PER_DAY      := l_temp_details_rec.USAGE_PER_DAY ;
2406               l_UF_details_rec.ATTRIBUTE_CATEGORY := l_temp_details_rec.ATTRIBUTE_CATEGORY ;
2407               l_UF_details_rec.ATTRIBUTE1  := l_temp_details_rec.ATTRIBUTE1 ;
2408               l_UF_details_rec.ATTRIBUTE2  := l_temp_details_rec.ATTRIBUTE2 ;
2409               l_UF_details_rec.ATTRIBUTE3  := l_temp_details_rec.ATTRIBUTE3 ;
2410               l_UF_details_rec.ATTRIBUTE4  := l_temp_details_rec.ATTRIBUTE4 ;
2411               l_UF_details_rec.ATTRIBUTE5  := l_temp_details_rec.ATTRIBUTE5 ;
2412               l_UF_details_rec.ATTRIBUTE6  := l_temp_details_rec.ATTRIBUTE6 ;
2413               l_UF_details_rec.ATTRIBUTE7  := l_temp_details_rec.ATTRIBUTE7 ;
2414               l_UF_details_rec.ATTRIBUTE8  := l_temp_details_rec.ATTRIBUTE8 ;
2415               l_UF_details_rec.ATTRIBUTE9  := l_temp_details_rec.ATTRIBUTE9 ;
2416               l_UF_details_rec.ATTRIBUTE10 := l_temp_details_rec.ATTRIBUTE10 ;
2417               l_UF_details_rec.ATTRIBUTE11 := l_temp_details_rec.ATTRIBUTE11 ;
2418               l_UF_details_rec.ATTRIBUTE12 := l_temp_details_rec.ATTRIBUTE12 ;
2419               l_UF_details_rec.ATTRIBUTE13 := l_temp_details_rec.ATTRIBUTE13 ;
2420               l_UF_details_rec.ATTRIBUTE14 := l_temp_details_rec.ATTRIBUTE14 ;
2421               l_UF_details_rec.ATTRIBUTE15 := l_temp_details_rec.ATTRIBUTE15 ;
2422 
2423               l_UF_details_tbl(j) := l_UF_details_rec;
2424               j := j+1;
2425             END LOOP;
2426             CLOSE ahl_uf_unit_details_date_csr;
2427          END IF; --p_onward_date
2428       END LOOP;
2429       CLOSE ahl_uf_uom_unit_csr;
2430      END IF; -- p_unit_item_forecast
2431      */
2432   END IF; -- l_unit_config header_id.
2433 
2434   --Or resolve inventory item id into l_pc_node_id
2435   IF (l_inventory_item_id IS NOT NULL) THEN
2436      OPEN ahl_pc_id_from_assoc_csr(l_inventory_item_id,
2437                  AHL_UMP_UF_PVT.G_PC_ITEM_ASSOCIATION,
2438                  AHL_UMP_UF_PVT.G_PC_PRIMARY_FLAG,
2439                  AHL_UMP_UF_PVT.G_COMPLETE_STATUS);
2440      FETCH ahl_pc_id_from_assoc_csr INTO l_pc_node_id;
2441      IF (ahl_pc_id_from_assoc_csr%NOTFOUND) THEN
2442           l_pc_node_id := NULL;
2443      -- FND_MESSAGE.Set_Name('AHL','AHL_UMP_UTIL_NO_PRIM_PC');
2444      --   FND_MESSAGE.Set_Token('UID',l_inventory_item_id);
2448 
2445      --   FND_MSG_PUB.ADD;
2446      END IF;
2447      CLOSE ahl_pc_id_from_assoc_csr;
2449      -- Added to fix bug# 6749351
2450      IF (p_add_unit_item_forecast = 'Y') THEN
2451       OPEN ahl_uf_uom_item_csr(l_inventory_item_id);
2452       LOOP
2453          FETCH ahl_uf_uom_item_csr INTO l_uom_code;
2454          EXIT WHEN ahl_uf_uom_item_csr%NOTFOUND;
2455          IF(p_onward_end_date IS NULL) THEN
2456             OPEN ahl_uf_item_details_csr(l_inventory_item_id, l_uom_code);
2457             LOOP
2458               FETCH ahl_uf_item_details_csr INTO l_temp_details_rec;
2459               EXIT WHEN ahl_uf_item_details_csr%NOTFOUND;
2460 
2461               l_UF_details_rec.UF_DETAIL_ID  := l_temp_details_rec.UF_DETAIL_ID;
2462               l_UF_details_rec.OBJECT_VERSION_NUMBER := l_temp_details_rec.OBJECT_VERSION_NUMBER ;
2463               l_UF_details_rec.LAST_UPDATE_DATE   := l_temp_details_rec.LAST_UPDATE_DATE ;
2464               l_UF_details_rec.LAST_UPDATED_BY    := l_temp_details_rec.LAST_UPDATED_BY ;
2465               l_UF_details_rec.CREATION_DATE      := l_temp_details_rec.CREATION_DATE ;
2466               l_UF_details_rec.CREATED_BY         := l_temp_details_rec.CREATED_BY ;
2467               l_UF_details_rec.LAST_UPDATE_LOGIN  := l_temp_details_rec.LAST_UPDATE_LOGIN ;
2468               l_UF_details_rec.UF_HEADER_ID       := l_temp_details_rec.UF_HEADER_ID ;
2469               l_UF_details_rec.UOM_CODE           := l_temp_details_rec.UOM_CODE ;
2470               l_UF_details_rec.START_DATE         := l_temp_details_rec.START_DATE ;
2471               l_UF_details_rec.END_DATE           := l_temp_details_rec.END_DATE ;
2472               l_UF_details_rec.USAGE_PER_DAY      := l_temp_details_rec.USAGE_PER_DAY ;
2473               l_UF_details_rec.ATTRIBUTE_CATEGORY := l_temp_details_rec.ATTRIBUTE_CATEGORY ;
2474               l_UF_details_rec.ATTRIBUTE1  := l_temp_details_rec.ATTRIBUTE1 ;
2475               l_UF_details_rec.ATTRIBUTE2  := l_temp_details_rec.ATTRIBUTE2 ;
2476               l_UF_details_rec.ATTRIBUTE3  := l_temp_details_rec.ATTRIBUTE3 ;
2477               l_UF_details_rec.ATTRIBUTE4  := l_temp_details_rec.ATTRIBUTE4 ;
2478               l_UF_details_rec.ATTRIBUTE5  := l_temp_details_rec.ATTRIBUTE5 ;
2479               l_UF_details_rec.ATTRIBUTE6  := l_temp_details_rec.ATTRIBUTE6 ;
2480               l_UF_details_rec.ATTRIBUTE7  := l_temp_details_rec.ATTRIBUTE7 ;
2481               l_UF_details_rec.ATTRIBUTE8  := l_temp_details_rec.ATTRIBUTE8 ;
2482               l_UF_details_rec.ATTRIBUTE9  := l_temp_details_rec.ATTRIBUTE9 ;
2483               l_UF_details_rec.ATTRIBUTE10 := l_temp_details_rec.ATTRIBUTE10 ;
2484               l_UF_details_rec.ATTRIBUTE11 := l_temp_details_rec.ATTRIBUTE11 ;
2485               l_UF_details_rec.ATTRIBUTE12 := l_temp_details_rec.ATTRIBUTE12 ;
2486               l_UF_details_rec.ATTRIBUTE13 := l_temp_details_rec.ATTRIBUTE13 ;
2487               l_UF_details_rec.ATTRIBUTE14 := l_temp_details_rec.ATTRIBUTE14 ;
2488               l_UF_details_rec.ATTRIBUTE15 := l_temp_details_rec.ATTRIBUTE15 ;
2489               l_UF_details_tbl(j) := l_UF_details_rec;
2490               j := j+1;
2491             END LOOP;
2492             CLOSE ahl_uf_item_details_csr;
2493         ELSE
2494             OPEN ahl_uf_item_details_date_csr(l_inventory_item_id, l_uom_code,p_onward_end_date);
2495             LOOP
2496               FETCH ahl_uf_item_details_date_csr INTO l_temp_details_rec;
2497               EXIT WHEN ahl_uf_item_details_date_csr%NOTFOUND;
2498 
2499               l_UF_details_rec.UF_DETAIL_ID  := l_temp_details_rec.UF_DETAIL_ID;
2503               l_UF_details_rec.CREATION_DATE      := l_temp_details_rec.CREATION_DATE ;
2500               l_UF_details_rec.OBJECT_VERSION_NUMBER := l_temp_details_rec.OBJECT_VERSION_NUMBER ;
2501               l_UF_details_rec.LAST_UPDATE_DATE   := l_temp_details_rec.LAST_UPDATE_DATE ;
2502               l_UF_details_rec.LAST_UPDATED_BY    := l_temp_details_rec.LAST_UPDATED_BY ;
2504               l_UF_details_rec.CREATED_BY         := l_temp_details_rec.CREATED_BY ;
2505               l_UF_details_rec.LAST_UPDATE_LOGIN  := l_temp_details_rec.LAST_UPDATE_LOGIN ;
2506               l_UF_details_rec.UF_HEADER_ID       := l_temp_details_rec.UF_HEADER_ID ;
2507               l_UF_details_rec.UOM_CODE           := l_temp_details_rec.UOM_CODE ;
2508               l_UF_details_rec.START_DATE         := l_temp_details_rec.START_DATE ;
2509               l_UF_details_rec.END_DATE           := l_temp_details_rec.END_DATE ;
2510               l_UF_details_rec.USAGE_PER_DAY      := l_temp_details_rec.USAGE_PER_DAY ;
2511               l_UF_details_rec.ATTRIBUTE_CATEGORY := l_temp_details_rec.ATTRIBUTE_CATEGORY ;
2512               l_UF_details_rec.ATTRIBUTE1  := l_temp_details_rec.ATTRIBUTE1 ;
2513               l_UF_details_rec.ATTRIBUTE2  := l_temp_details_rec.ATTRIBUTE2 ;
2514               l_UF_details_rec.ATTRIBUTE3  := l_temp_details_rec.ATTRIBUTE3 ;
2515               l_UF_details_rec.ATTRIBUTE4  := l_temp_details_rec.ATTRIBUTE4 ;
2516               l_UF_details_rec.ATTRIBUTE5  := l_temp_details_rec.ATTRIBUTE5 ;
2517               l_UF_details_rec.ATTRIBUTE6  := l_temp_details_rec.ATTRIBUTE6 ;
2518               l_UF_details_rec.ATTRIBUTE7  := l_temp_details_rec.ATTRIBUTE7 ;
2519               l_UF_details_rec.ATTRIBUTE8  := l_temp_details_rec.ATTRIBUTE8 ;
2520               l_UF_details_rec.ATTRIBUTE9  := l_temp_details_rec.ATTRIBUTE9 ;
2521               l_UF_details_rec.ATTRIBUTE10 := l_temp_details_rec.ATTRIBUTE10 ;
2522               l_UF_details_rec.ATTRIBUTE11 := l_temp_details_rec.ATTRIBUTE11 ;
2523               l_UF_details_rec.ATTRIBUTE12 := l_temp_details_rec.ATTRIBUTE12 ;
2524               l_UF_details_rec.ATTRIBUTE13 := l_temp_details_rec.ATTRIBUTE13 ;
2525               l_UF_details_rec.ATTRIBUTE14 := l_temp_details_rec.ATTRIBUTE14 ;
2526               l_UF_details_rec.ATTRIBUTE15 := l_temp_details_rec.ATTRIBUTE15 ;
2527 
2528               l_UF_details_tbl(j) := l_UF_details_rec;
2529               j := j+1;
2530             END LOOP;
2531             CLOSE ahl_uf_item_details_date_csr;
2532          END IF; --p_onward_date
2533       END LOOP;
2534       CLOSE ahl_uf_uom_item_csr;
2535      END IF; -- p_unit_item_forecast
2536   END IF; -- l_inventory_item_id
2537 
2538   --Return if the l_pc_node_id is NULL
2539   IF (l_pc_node_id IS NULL) THEN
2540     x_UF_details_tbl := l_UF_details_tbl;
2541     RETURN;
2542   END IF;
2543 
2544  --Part 2. With l_pc_node_id, build forecast data.
2545  --Now traverse up the pc tree.
2546  OPEN ahl_trav_pc_nodes_csr(l_pc_node_id);
2547  LOOP
2548    FETCH ahl_trav_pc_nodes_csr INTO l_pc_id;
2549    EXIT WHEN ahl_trav_pc_nodes_csr%NOTFOUND;
2550    --Now fetch all unique UOM_code for given pc
2551    OPEN ahl_uf_uom_nodes_csr(l_pc_id);
2552    LOOP
2553      FETCH ahl_uf_uom_nodes_csr INTO l_uom_code;
2554      EXIT WHEN ahl_uf_uom_nodes_csr%NOTFOUND;
2555 
2556      l_duplicate := 'N';
2557      IF (l_UF_details_tbl.COUNT > 0) THEN
2558        FOR i IN l_UF_details_tbl.FIRST..l_UF_details_tbl.LAST LOOP
2559          IF (l_UF_details_tbl(i).uom_code = l_uom_code) THEN
2560              l_duplicate := 'Y';
2561         EXIT;
2562          END IF;
2563        END LOOP;
2564      END IF;
2565 
2566      -- If no duplicates are found for given uom, add to table all dates
2567      IF (l_duplicate = 'N') THEN
2568         IF(p_onward_end_date IS NULL) THEN
2569             OPEN ahl_uf_details_csr(l_pc_id, l_uom_code);
2570             LOOP
2571             FETCH ahl_uf_details_csr INTO l_temp_details_rec;
2572              EXIT WHEN ahl_uf_details_csr%NOTFOUND;
2573 
2574             l_UF_details_rec.UF_DETAIL_ID  := l_temp_details_rec.UF_DETAIL_ID;
2575              l_UF_details_rec.OBJECT_VERSION_NUMBER := l_temp_details_rec.OBJECT_VERSION_NUMBER ;
2576             l_UF_details_rec.LAST_UPDATE_DATE   := l_temp_details_rec.LAST_UPDATE_DATE ;
2577             l_UF_details_rec.LAST_UPDATED_BY    := l_temp_details_rec.LAST_UPDATED_BY ;
2578             l_UF_details_rec.CREATION_DATE      := l_temp_details_rec.CREATION_DATE ;
2579             l_UF_details_rec.CREATED_BY         := l_temp_details_rec.CREATED_BY ;
2580             l_UF_details_rec.LAST_UPDATE_LOGIN  := l_temp_details_rec.LAST_UPDATE_LOGIN ;
2581             l_UF_details_rec.UF_HEADER_ID       := l_temp_details_rec.UF_HEADER_ID ;
2582             l_UF_details_rec.UOM_CODE           := l_temp_details_rec.UOM_CODE ;
2583             l_UF_details_rec.START_DATE         := l_temp_details_rec.START_DATE ;
2584             l_UF_details_rec.END_DATE           := l_temp_details_rec.END_DATE ;
2585             l_UF_details_rec.USAGE_PER_DAY      := l_temp_details_rec.USAGE_PER_DAY ;
2586             l_UF_details_rec.ATTRIBUTE_CATEGORY := l_temp_details_rec.ATTRIBUTE_CATEGORY ;
2587             l_UF_details_rec.ATTRIBUTE1  := l_temp_details_rec.ATTRIBUTE1 ;
2588             l_UF_details_rec.ATTRIBUTE2  := l_temp_details_rec.ATTRIBUTE2 ;
2589             l_UF_details_rec.ATTRIBUTE3  := l_temp_details_rec.ATTRIBUTE3 ;
2590             l_UF_details_rec.ATTRIBUTE4  := l_temp_details_rec.ATTRIBUTE4 ;
2591             l_UF_details_rec.ATTRIBUTE5  := l_temp_details_rec.ATTRIBUTE5 ;
2592             l_UF_details_rec.ATTRIBUTE6  := l_temp_details_rec.ATTRIBUTE6 ;
2593             l_UF_details_rec.ATTRIBUTE7  := l_temp_details_rec.ATTRIBUTE7 ;
2594             l_UF_details_rec.ATTRIBUTE8  := l_temp_details_rec.ATTRIBUTE8 ;
2595             l_UF_details_rec.ATTRIBUTE9  := l_temp_details_rec.ATTRIBUTE9 ;
2596             l_UF_details_rec.ATTRIBUTE10 := l_temp_details_rec.ATTRIBUTE10 ;
2597             l_UF_details_rec.ATTRIBUTE11 := l_temp_details_rec.ATTRIBUTE11 ;
2598             l_UF_details_rec.ATTRIBUTE12 := l_temp_details_rec.ATTRIBUTE12 ;
2602             l_UF_details_tbl(j) := l_UF_details_rec;
2599             l_UF_details_rec.ATTRIBUTE13 := l_temp_details_rec.ATTRIBUTE13 ;
2600             l_UF_details_rec.ATTRIBUTE14 := l_temp_details_rec.ATTRIBUTE14 ;
2601             l_UF_details_rec.ATTRIBUTE15 := l_temp_details_rec.ATTRIBUTE15 ;
2603             j := j+1;
2604             END LOOP;
2605             CLOSE ahl_uf_details_csr;
2606         ELSE
2607             OPEN ahl_uf_details_date_csr(l_pc_id, l_uom_code, p_onward_end_date);
2608             LOOP
2609             FETCH ahl_uf_details_date_csr INTO l_temp_details_rec;
2610              EXIT WHEN ahl_uf_details_date_csr%NOTFOUND;
2611 
2612             l_UF_details_rec.UF_DETAIL_ID  := l_temp_details_rec.UF_DETAIL_ID;
2613              l_UF_details_rec.OBJECT_VERSION_NUMBER := l_temp_details_rec.OBJECT_VERSION_NUMBER ;
2614             l_UF_details_rec.LAST_UPDATE_DATE   := l_temp_details_rec.LAST_UPDATE_DATE ;
2615             l_UF_details_rec.LAST_UPDATED_BY    := l_temp_details_rec.LAST_UPDATED_BY ;
2616             l_UF_details_rec.CREATION_DATE      := l_temp_details_rec.CREATION_DATE ;
2617             l_UF_details_rec.CREATED_BY         := l_temp_details_rec.CREATED_BY ;
2618             l_UF_details_rec.LAST_UPDATE_LOGIN  := l_temp_details_rec.LAST_UPDATE_LOGIN ;
2619             l_UF_details_rec.UF_HEADER_ID       := l_temp_details_rec.UF_HEADER_ID ;
2620             l_UF_details_rec.UOM_CODE           := l_temp_details_rec.UOM_CODE ;
2621             l_UF_details_rec.START_DATE         := l_temp_details_rec.START_DATE ;
2622             l_UF_details_rec.END_DATE           := l_temp_details_rec.END_DATE ;
2623             l_UF_details_rec.USAGE_PER_DAY      := l_temp_details_rec.USAGE_PER_DAY ;
2624             l_UF_details_rec.ATTRIBUTE_CATEGORY := l_temp_details_rec.ATTRIBUTE_CATEGORY ;
2625             l_UF_details_rec.ATTRIBUTE1  := l_temp_details_rec.ATTRIBUTE1 ;
2626             l_UF_details_rec.ATTRIBUTE2  := l_temp_details_rec.ATTRIBUTE2 ;
2627             l_UF_details_rec.ATTRIBUTE3  := l_temp_details_rec.ATTRIBUTE3 ;
2628             l_UF_details_rec.ATTRIBUTE4  := l_temp_details_rec.ATTRIBUTE4 ;
2629             l_UF_details_rec.ATTRIBUTE5  := l_temp_details_rec.ATTRIBUTE5 ;
2630             l_UF_details_rec.ATTRIBUTE6  := l_temp_details_rec.ATTRIBUTE6 ;
2631             l_UF_details_rec.ATTRIBUTE7  := l_temp_details_rec.ATTRIBUTE7 ;
2632             l_UF_details_rec.ATTRIBUTE8  := l_temp_details_rec.ATTRIBUTE8 ;
2633             l_UF_details_rec.ATTRIBUTE9  := l_temp_details_rec.ATTRIBUTE9 ;
2634             l_UF_details_rec.ATTRIBUTE10 := l_temp_details_rec.ATTRIBUTE10 ;
2635             l_UF_details_rec.ATTRIBUTE11 := l_temp_details_rec.ATTRIBUTE11 ;
2636             l_UF_details_rec.ATTRIBUTE12 := l_temp_details_rec.ATTRIBUTE12 ;
2637             l_UF_details_rec.ATTRIBUTE13 := l_temp_details_rec.ATTRIBUTE13 ;
2638             l_UF_details_rec.ATTRIBUTE14 := l_temp_details_rec.ATTRIBUTE14 ;
2639             l_UF_details_rec.ATTRIBUTE15 := l_temp_details_rec.ATTRIBUTE15 ;
2640             l_UF_details_tbl(j) := l_UF_details_rec;
2641             j := j+1;
2642             END LOOP;
2643             CLOSE ahl_uf_details_date_csr;
2644         END IF;
2645      END IF;
2646 
2647    END LOOP;
2648    CLOSE ahl_uf_uom_nodes_csr;
2649 
2650 
2651  END LOOP;
2652  CLOSE ahl_trav_pc_nodes_csr;
2653 
2654  x_UF_details_tbl := l_UF_details_tbl;
2655 
2656 END get_uf_from_pc;
2657 
2658 PROCEDURE get_uf_from_part (
2659 
2660     p_init_msg_list          IN           VARCHAR2  := FND_API.G_FALSE,
2661     p_csi_item_instance_id   IN           NUMBER,
2662     p_onward_end_date        IN           DATE      := NULL,
2663     x_UF_details_tbl       OUT NOCOPY   AHL_UMP_UF_PVT.uf_details_tbl_type,
2664     x_return_status          OUT NOCOPY   VARCHAR2)
2665     IS
2666 
2667 --
2668 CURSOR ahl_uf_details_csr (p_csi_item_instance_id  IN   NUMBER) IS
2669    SELECT  a.UF_DETAIL_ID,
2670         a.OBJECT_VERSION_NUMBER,
2671            a.LAST_UPDATE_DATE   ,
2672            a.LAST_UPDATED_BY    ,
2673            a.CREATION_DATE      ,
2674            a.CREATED_BY         ,
2675            a.LAST_UPDATE_LOGIN  ,
2676            a.UF_HEADER_ID       ,
2677            a.UOM_CODE           ,
2678            a.START_DATE         ,
2679            a.END_DATE           ,
2680            a.USAGE_PER_DAY      ,
2681            a.ATTRIBUTE_CATEGORY ,
2682            a.ATTRIBUTE1  ,
2683            a.ATTRIBUTE2  ,
2684            a.ATTRIBUTE3  ,
2685            a.ATTRIBUTE4  ,
2686            a.ATTRIBUTE5  ,
2687            a.ATTRIBUTE6  ,
2688            a.ATTRIBUTE7  ,
2689            a.ATTRIBUTE8  ,
2690            a.ATTRIBUTE9  ,
2691            a.ATTRIBUTE10 ,
2692            a.ATTRIBUTE11 ,
2693            a.ATTRIBUTE12 ,
2694            a.ATTRIBUTE13 ,
2695            a.ATTRIBUTE14 ,
2696            a.ATTRIBUTE15
2697     FROM    ahl_uf_details a, ahl_uf_headers b,csi_item_instances c
2698     WHERE a.uf_header_id = b.uf_header_id
2699      AND  b.inventory_item_id = c.inventory_item_id
2700      AND  c.instance_id = p_csi_item_instance_id;
2701 
2702 CURSOR ahl_uf_details_date_csr (p_csi_item_instance_id  IN   NUMBER, p_onward_end_date IN DATE) IS
2703    SELECT  a.UF_DETAIL_ID,
2704         a.OBJECT_VERSION_NUMBER,
2705            a.LAST_UPDATE_DATE   ,
2706            a.LAST_UPDATED_BY    ,
2707            a.CREATION_DATE      ,
2708            a.CREATED_BY         ,
2709            a.LAST_UPDATE_LOGIN  ,
2710            a.UF_HEADER_ID       ,
2711            a.UOM_CODE           ,
2712            a.START_DATE         ,
2713            a.END_DATE           ,
2714            a.USAGE_PER_DAY      ,
2715            a.ATTRIBUTE_CATEGORY ,
2716            a.ATTRIBUTE1  ,
2717            a.ATTRIBUTE2  ,
2718            a.ATTRIBUTE3  ,
2719            a.ATTRIBUTE4  ,
2720            a.ATTRIBUTE5  ,
2721            a.ATTRIBUTE6  ,
2722            a.ATTRIBUTE7  ,
2723            a.ATTRIBUTE8  ,
2727            a.ATTRIBUTE12 ,
2724            a.ATTRIBUTE9  ,
2725            a.ATTRIBUTE10 ,
2726            a.ATTRIBUTE11 ,
2728            a.ATTRIBUTE13 ,
2729            a.ATTRIBUTE14 ,
2730            a.ATTRIBUTE15
2731     FROM    ahl_uf_details a, ahl_uf_headers b,csi_item_instances c
2732     WHERE (a.end_date IS NULL OR TRUNC(a.end_date) >= TRUNC(p_onward_end_date))
2733      AND a.uf_header_id = b.uf_header_id
2734      AND  b.inventory_item_id = c.inventory_item_id
2735      AND  c.instance_id = p_csi_item_instance_id;
2736 
2737 
2738     l_UF_details_tbl         AHL_UMP_UF_PVT.uf_details_tbl_type;
2739     l_UF_details_rec         AHL_UMP_UF_PVT.uf_details_rec_type;
2740     l_temp_details_rec         ahl_uf_details_csr%ROWTYPE;
2741     j NUMBER;
2742 
2743 
2744 BEGIN
2745 
2746     IF FND_API.To_Boolean( p_init_msg_list)
2747     THEN
2748     FND_MSG_PUB.Initialize;
2749     END IF;
2750 
2751     -- Initialize API return status to success
2752     x_return_status := FND_API.G_RET_STS_SUCCESS;
2753     j := 0;
2754     IF(p_onward_end_date IS NULL) THEN
2755        OPEN ahl_uf_details_csr(p_csi_item_instance_id);
2756        LOOP
2757        FETCH ahl_uf_details_csr INTO l_temp_details_rec;
2758         EXIT WHEN ahl_uf_details_csr%NOTFOUND;
2759 
2760        l_UF_details_rec.UF_DETAIL_ID  := l_temp_details_rec.UF_DETAIL_ID;
2761         l_UF_details_rec.OBJECT_VERSION_NUMBER := l_temp_details_rec.OBJECT_VERSION_NUMBER ;
2762        l_UF_details_rec.LAST_UPDATE_DATE   := l_temp_details_rec.LAST_UPDATE_DATE ;
2763        l_UF_details_rec.LAST_UPDATED_BY    := l_temp_details_rec.LAST_UPDATED_BY ;
2764        l_UF_details_rec.CREATION_DATE      := l_temp_details_rec.CREATION_DATE ;
2765        l_UF_details_rec.CREATED_BY         := l_temp_details_rec.CREATED_BY ;
2766        l_UF_details_rec.LAST_UPDATE_LOGIN  := l_temp_details_rec.LAST_UPDATE_LOGIN ;
2767        l_UF_details_rec.UF_HEADER_ID       := l_temp_details_rec.UF_HEADER_ID ;
2768        l_UF_details_rec.UOM_CODE           := l_temp_details_rec.UOM_CODE ;
2769        l_UF_details_rec.START_DATE         := l_temp_details_rec.START_DATE ;
2770        l_UF_details_rec.END_DATE           := l_temp_details_rec.END_DATE ;
2771        l_UF_details_rec.USAGE_PER_DAY      := l_temp_details_rec.USAGE_PER_DAY ;
2772        l_UF_details_rec.ATTRIBUTE_CATEGORY := l_temp_details_rec.ATTRIBUTE_CATEGORY ;
2773        l_UF_details_rec.ATTRIBUTE1  := l_temp_details_rec.ATTRIBUTE1 ;
2774        l_UF_details_rec.ATTRIBUTE2  := l_temp_details_rec.ATTRIBUTE2 ;
2775        l_UF_details_rec.ATTRIBUTE3  := l_temp_details_rec.ATTRIBUTE3 ;
2776        l_UF_details_rec.ATTRIBUTE4  := l_temp_details_rec.ATTRIBUTE4 ;
2777        l_UF_details_rec.ATTRIBUTE5  := l_temp_details_rec.ATTRIBUTE5 ;
2778        l_UF_details_rec.ATTRIBUTE6  := l_temp_details_rec.ATTRIBUTE6 ;
2779        l_UF_details_rec.ATTRIBUTE7  := l_temp_details_rec.ATTRIBUTE7 ;
2780        l_UF_details_rec.ATTRIBUTE8  := l_temp_details_rec.ATTRIBUTE8 ;
2781        l_UF_details_rec.ATTRIBUTE9  := l_temp_details_rec.ATTRIBUTE9 ;
2782        l_UF_details_rec.ATTRIBUTE10 := l_temp_details_rec.ATTRIBUTE10 ;
2783        l_UF_details_rec.ATTRIBUTE11 := l_temp_details_rec.ATTRIBUTE11 ;
2784        l_UF_details_rec.ATTRIBUTE12 := l_temp_details_rec.ATTRIBUTE12 ;
2785        l_UF_details_rec.ATTRIBUTE13 := l_temp_details_rec.ATTRIBUTE13 ;
2786        l_UF_details_rec.ATTRIBUTE14 := l_temp_details_rec.ATTRIBUTE14 ;
2787        l_UF_details_rec.ATTRIBUTE15 := l_temp_details_rec.ATTRIBUTE15 ;
2788        l_UF_details_tbl(j) := l_UF_details_rec;
2789        j := j+1;
2790        END LOOP;
2791        CLOSE ahl_uf_details_csr;
2792     ELSE
2793        OPEN ahl_uf_details_date_csr(p_csi_item_instance_id, p_onward_end_date);
2794        LOOP
2795        FETCH ahl_uf_details_date_csr INTO l_temp_details_rec;
2796         EXIT WHEN ahl_uf_details_date_csr%NOTFOUND;
2797 
2798        l_UF_details_rec.UF_DETAIL_ID  := l_temp_details_rec.UF_DETAIL_ID;
2799        l_UF_details_rec.OBJECT_VERSION_NUMBER := l_temp_details_rec.OBJECT_VERSION_NUMBER ;
2800        l_UF_details_rec.LAST_UPDATE_DATE   := l_temp_details_rec.LAST_UPDATE_DATE ;
2801        l_UF_details_rec.LAST_UPDATED_BY    := l_temp_details_rec.LAST_UPDATED_BY ;
2802        l_UF_details_rec.CREATION_DATE      := l_temp_details_rec.CREATION_DATE ;
2803        l_UF_details_rec.CREATED_BY         := l_temp_details_rec.CREATED_BY ;
2804        l_UF_details_rec.LAST_UPDATE_LOGIN  := l_temp_details_rec.LAST_UPDATE_LOGIN ;
2805        l_UF_details_rec.UF_HEADER_ID       := l_temp_details_rec.UF_HEADER_ID ;
2806        l_UF_details_rec.UOM_CODE           := l_temp_details_rec.UOM_CODE ;
2807        l_UF_details_rec.START_DATE         := l_temp_details_rec.START_DATE ;
2808        l_UF_details_rec.END_DATE           := l_temp_details_rec.END_DATE ;
2809        l_UF_details_rec.USAGE_PER_DAY      := l_temp_details_rec.USAGE_PER_DAY ;
2810        l_UF_details_rec.ATTRIBUTE_CATEGORY := l_temp_details_rec.ATTRIBUTE_CATEGORY ;
2811        l_UF_details_rec.ATTRIBUTE1  := l_temp_details_rec.ATTRIBUTE1 ;
2812        l_UF_details_rec.ATTRIBUTE2  := l_temp_details_rec.ATTRIBUTE2 ;
2813        l_UF_details_rec.ATTRIBUTE3  := l_temp_details_rec.ATTRIBUTE3 ;
2814        l_UF_details_rec.ATTRIBUTE4  := l_temp_details_rec.ATTRIBUTE4 ;
2815        l_UF_details_rec.ATTRIBUTE5  := l_temp_details_rec.ATTRIBUTE5 ;
2816        l_UF_details_rec.ATTRIBUTE6  := l_temp_details_rec.ATTRIBUTE6 ;
2817        l_UF_details_rec.ATTRIBUTE7  := l_temp_details_rec.ATTRIBUTE7 ;
2818        l_UF_details_rec.ATTRIBUTE8  := l_temp_details_rec.ATTRIBUTE8 ;
2819        l_UF_details_rec.ATTRIBUTE9  := l_temp_details_rec.ATTRIBUTE9 ;
2820        l_UF_details_rec.ATTRIBUTE10 := l_temp_details_rec.ATTRIBUTE10 ;
2821        l_UF_details_rec.ATTRIBUTE11 := l_temp_details_rec.ATTRIBUTE11 ;
2822        l_UF_details_rec.ATTRIBUTE12 := l_temp_details_rec.ATTRIBUTE12 ;
2823        l_UF_details_rec.ATTRIBUTE13 := l_temp_details_rec.ATTRIBUTE13 ;
2824        l_UF_details_rec.ATTRIBUTE14 := l_temp_details_rec.ATTRIBUTE14 ;
2825        l_UF_details_rec.ATTRIBUTE15 := l_temp_details_rec.ATTRIBUTE15 ;
2829        CLOSE ahl_uf_details_date_csr;
2826        l_UF_details_tbl(j) := l_UF_details_rec;
2827        j := j+1;
2828        END LOOP;
2830     END IF;
2831 
2832     x_UF_details_tbl := l_UF_details_tbl;
2833 
2834 
2835 END get_uf_from_part;
2836 -----------------------------------
2837 END AHL_UMP_UF_PVT;