DBA Data[Home] [Help]

PACKAGE BODY: APPS.AHL_UMP_FORECAST_REQ_PVT

Source


1 PACKAGE BODY AHL_UMP_FORECAST_REQ_PVT AS
2 /* $Header: AHLVURQB.pls 120.3.12020000.2 2012/12/11 03:22:05 prakkum ship $ */
3 
4 -----------------------
5 -- Declare Constants --
6 -----------------------
7 G_PKG_NAME          CONSTANT VARCHAR2(30) := 'AHL_UMP_FORECAST_REQ_PVT';
8 --G_APP_MODULE        CONSTANT VARCHAR2(30) := 'AHL';
9 G_APP_MODULE        CONSTANT VARCHAR2(30) := RTRIM(LTRIM(FND_PROFILE.VALUE('AHL_APPLN_USAGE')));
10 
11 -- UMP Statuses
12 G_REQ_TYPE_FORECAST CONSTANT VARCHAR2(30) := 'FORECAST';
13 
14 G_IS_PM_INSTALLED   CONSTANT VARCHAR2(1) := AHL_UTIL_PKG.IS_PM_INSTALLED;
15 
16 -- FND Logging Constants
17 G_DEBUG_LEVEL       CONSTANT NUMBER := FND_LOG.G_CURRENT_RUNTIME_LEVEL;
18 G_DEBUG_PROC        CONSTANT NUMBER := FND_LOG.LEVEL_PROCEDURE;
19 G_DEBUG_STMT        CONSTANT NUMBER := FND_LOG.LEVEL_STATEMENT;
20 G_DEBUG_UEXP        CONSTANT NUMBER := FND_LOG.LEVEL_UNEXPECTED;
21 
22 ------------------------------
23 -- Declare Global Variables --
24 ------------------------------
25 G_previous_route_id    NUMBER;
26 G_previous_req_date    DATE;
27 
28 
29 ------------------------
30 -- Define Table Types --
31 ------------------------
32 -- number table.
33 TYPE nbr_tbl_type IS TABLE OF NUMBER INDEX BY BINARY_INTEGER;
34 
35 -- varchar2 table.
36 TYPE vchar_tbl_type IS TABLE OF VARCHAR2(400) INDEX BY BINARY_INTEGER;
37 
38 -- date table
39 TYPE date_tbl_type IS TABLE OF DATE INDEX BY BINARY_INTEGER;
40 
41 --------------------------------------
42 -- Declare Procedures and Functions --
43 --------------------------------------
44 -- To get the root item instance for the input item instance if exists.
45 FUNCTION Get_RootInstanceID(p_csi_item_instance_id IN NUMBER)
46 RETURN NUMBER;
47 
48 -- Build the item instance tree containing root nodes and its components.
49 PROCEDURE Build_Config_Tree(p_csi_root_instance_id  IN         NUMBER,
50                             p_master_config_id      IN         NUMBER,
51                             x_config_node_tbl       OUT NOCOPY AHL_UMP_PROCESSUNIT_PVT.config_node_tbl_type);
52 
53 -- process material requirement for a UE.
54 PROCEDURE Process_Material_Req (p_unit_effectivity_id  IN NUMBER,
55                       p_csi_item_instance_id IN NUMBER,
56                       p_due_date             IN DATE,
57                       p_mr_route_id          IN NUMBER,
58                       p_route_id             IN NUMBER,
59                       p_r_start_date_active  IN DATE,
60                       p_r_end_date_active    IN DATE);
61 
62 -- log error messages into concurrent log.
63 PROCEDURE log_error_messages;
64 -------------------------------------
65 -- Define Procedures and Functions --
66 -------------------------------------
67 -- Start of Comments --
68 --  Procedure name    : Process_Mrl_Req_Forecast
69 --  Type              : Private
70 --  Function          : Private API to collect the material requirements for unit effectivities of a given set of item instances.
71 --                      Insert these material requirements into AHL_SCHEDULE_MATERIALS for ASCP/DP to pick up and plan the
72 --                      forecasted material requirements.
73 --                      If a unit effectivity does not have due date, the material forecast is not done.
74 --  Pre-reqs    :
75 --  Parameters  :
76 --
77 --  Standard IN  Parameters :
78 --      p_api_version                   IN      NUMBER       Required
79 --      p_init_msg_list                 IN      VARCHAR2     Default  FND_API.G_FALSE
80 --      p_validation_level              IN      NUMBER       Default  FND_API.G_VALID_LEVEL_FULL
81 --
82 --  Standard OUT Parameters :
83 --      x_return_status                 OUT     VARCHAR2     Required
84 --      x_msg_count                     OUT     NUMBER       Required
85 --      x_msg_data                      OUT     VARCHAR2     Required
86 --
87 --  Get_Route_Mtl_Req Parameters:
88 --      P_applicable_instances_tbl      IN     AHL_UMP_PROCESSUNIT_PVT.config_node_tbl_type  Required
89 --                                             The table of records containing list of item instances for which the due
90 --                                             date calculation process is being performed.
91 --
92 --  Version :
93 --      Initial Version   1.0
94 --  Create By : Sunil Kumar
95 --  End of Comments.
96 
97 PROCEDURE Process_Mrl_Req_Forecast
98 (
99    p_api_version                IN            NUMBER,
100    p_init_msg_list              IN            VARCHAR2  := FND_API.G_FALSE,
101    p_commit                     IN            VARCHAR2  := FND_API.G_FALSE,
102    p_validation_level           IN            NUMBER    := FND_API.G_VALID_LEVEL_FULL,
103    x_return_status              OUT  NOCOPY   VARCHAR2,
104    x_msg_count                  OUT  NOCOPY   NUMBER,
105    x_msg_data                   OUT  NOCOPY   VARCHAR2,
106    P_applicable_instances_tbl   IN            AHL_UMP_PROCESSUNIT_PVT.config_node_tbl_type
107 ) IS
108 
109    l_Route_Mtl_Req_Tbl          AHL_LTP_MTL_REQ_PVT.Route_Mtl_Req_Tbl_Type;
110 
111    /* Delete orphan forecast record in AHL_SCHEDULE_MATERIALS table for
112     * deleted unit effectivities
113     * unit effectivities where due date is null after the re-calculation
114    */
115    /*CURSOR delete_schedule_mtl_csr IS
116    SELECT scheduled_material_id FROM AHL_SCHEDULE_MATERIALS SM
117    WHERE SM.material_request_type = G_REQ_TYPE_FORECAST
118    AND SM.unit_effectivity_id IS NOT NULL
119    AND NOT EXISTS(SELECT 'x' FROM AHL_UNIT_EFFECTIVITIES_APP_V UE WHERE UE.unit_effectivity_id = SM.unit_effectivity_id)
120    UNION ALL
121    SELECT scheduled_material_id FROM AHL_SCHEDULE_MATERIALS SM, AHL_UNIT_EFFECTIVITIES_APP_V UE
122    WHERE (UE.status_code IS NULL OR UE.status_code = 'INIT-DUE')
123    AND UE.due_date IS NULL
124    AND SM.unit_effectivity_id IS NOT NULL
125    AND SM.material_request_type = G_REQ_TYPE_FORECAST
126    AND SM.unit_effectivity_id = UE.unit_effectivity_id;*/
127 
128    /* Finds out all
129     * open(means with status null or init-due) unit effectivities applicable to item instances - with not null due date
130     * mr routes for these unit effectitivities
131    */
132    CURSOR ue_mr_routes_csr (p_item_indtance_id IN NUMBER) IS
133    SELECT UE.unit_effectivity_id, UE.due_date, MR.mr_route_id, R.route_id, R.start_date_active, R.end_date_active
134    -- FROM AHL_UNIT_EFFECTIVITIES_APP_V UE, AHL_MR_ROUTES_V MR
135    FROM AHL_UNIT_EFFECTIVITIES_B UE, AHL_ROUTES_B R, AHL_MR_ROUTES MR
136    WHERE UE.mr_header_id = MR.mr_header_id
137    AND R.route_id = MR.ROUTE_ID
138    --AND MR.APPLICATION_USG_CODE = RTRIM(LTRIM(FND_PROFILE.VALUE('AHL_APPLN_USAGE')))
139    AND UE.APPLICATION_USG_CODE = G_APP_MODULE
140    AND (UE.status_code IS NULL OR UE.status_code = 'INIT-DUE')
141    AND UE.due_date IS NOT NULL
142    AND UE.csi_item_instance_id = p_item_indtance_id
143    ORDER BY MR.route_id, UE.due_date;
144 
145    /*
146     * Find out the schedule material records for expired routes
147    */
148    CURSOR del_exp_route_schedule_mtl_csr(p_unit_effectivity_id IN NUMBER, p_mr_route_id IN NUMBER) IS
149    SELECT scheduled_material_id FROM AHL_SCHEDULE_MATERIALS SM
150    WHERE SM.material_request_type = G_REQ_TYPE_FORECAST
151    AND SM.mr_route_id = p_mr_route_id
152    AND SM.unit_effectivity_id IS NOT NULL
153    AND SM.unit_effectivity_id = p_unit_effectivity_id;
154 
155    /* Validates whether a forecast record with unique key combination exisits
156     * in AHL_SCHEDULE_MATERIALS table
157     * output record used for DML update operation
158    */
159    CURSOR schedule_mtl_exists_csr(p_unit_effectivity_id IN NUMBER, p_mr_route_id IN NUMBER, p_inventory_item_id IN NUMBER, p_rt_oper_material_id IN NUMBER) IS
160    SELECT * FROM AHL_SCHEDULE_MATERIALS SM
161    WHERE SM.material_request_type = G_REQ_TYPE_FORECAST
162    AND NVL(SM.rt_oper_material_id,-1) = NVL(p_rt_oper_material_id,-1)
163    AND SM.inventory_item_id = p_inventory_item_id
164    AND SM.mr_route_id = p_mr_route_id
165    AND SM.unit_effectivity_id = p_unit_effectivity_id
166    FOR UPDATE OF REQUESTED_DATE NOWAIT;
167 
168    -- Added by SURRKUMA for Service Bulletin on 17-Jun-11
169    -- Fetches the Visit ID for the given ue_id
170    CURSOR get_visit_id_csr(p_unit_effectivity_id IN NUMBER) IS
171     SELECT DISTINCT visit_id
172     FROM   ahl_visit_tasks_b
173     WHERE  unit_effectivity_id = p_unit_effectivity_id;
174 
175    l_Schedule_Mtl_Req_rec       AHL_SCHEDULE_MATERIALS%ROWTYPE;
176 
177    l_requirement_date DATE;
178    l_previous_route_id NUMBER;
179    l_previous_req_date DATE;
180    l_visit_id          NUMBER;
181 
182    l_debug_module   varchar2(400) := 'AHL_UMP_FORECAST_REQ_PVT.Process_Mrl_Req_Forecast';
183 
184 BEGIN
185      IF (G_DEBUG_PROC >= G_DEBUG_LEVEL) THEN
186 		fnd_log.string
187 		(
188 			G_DEBUG_PROC,
189 			'ahl.plsql.AHL_UMP_FORECAST_REQ_PVT.Process_Mrl_Req_Forecast.begin',
190 			'At the start of PLSQL procedure'
191 		);
192      END IF;
193 
194      -- Standard start of API savepoint
195      SAVEPOINT Process_Mrl_Req_Forecast;
196 
197      -- Initialize message list if p_init_msg_list is set to TRUE
198      IF FND_API.To_Boolean( p_init_msg_list) THEN
199         FND_MSG_PUB.Initialize;
200      END IF;
201 
202      -- Initialize API return status to success
203      x_return_status := FND_API.G_RET_STS_SUCCESS;
204 
205      -- perform orphan forcast delete. Which ones? refer to comments for cursor.
206      -- delete operation transferred to due date calculation API
207      /*FOR delete_mtl_forecast_rec IN delete_schedule_mtl_csr LOOP
208          AHL_SCHEDULE_MATERIALS_PKG.delete_row(x_scheduled_material_id => delete_mtl_forecast_rec.scheduled_material_id);
209      END LOOP;*/
210 
211      IF (G_DEBUG_STMT >= G_DEBUG_LEVEL)THEN
212 		fnd_log.string
213 		(
214 			G_DEBUG_STMT,
215 			'ahl.plsql.AHL_UMP_FORECAST_REQ_PVT.Process_Mrl_Req_Forecast',
216 			'Have succesfully deleted the orphan forecasts'
217 		);
218      END IF;
219 
220      --Collect the material requirements and forecast them
221      IF(P_applicable_instances_tbl IS NOT NULL AND P_applicable_instances_tbl.COUNT > 0)THEN
222        FOR i IN P_applicable_instances_tbl.FIRST..P_applicable_instances_tbl.LAST  LOOP
223          IF (G_DEBUG_STMT >= G_DEBUG_LEVEL)THEN
224 		    fnd_log.string
225 		    (
226 			    G_DEBUG_STMT,
227 			    'ahl.plsql.AHL_UMP_FORECAST_REQ_PVT.Process_Mrl_Req_Forecast',
228 			    'Processing unit effectivities for csi_item_instance_id : ' || P_applicable_instances_tbl(i).csi_item_instance_id
229 		    );
230          END IF;
231          FOR ue_mr_routes_rec IN ue_mr_routes_csr (P_applicable_instances_tbl(i).csi_item_instance_id) LOOP
232             IF (G_DEBUG_STMT >= G_DEBUG_LEVEL)THEN
233 	       fnd_log.string
234 		        (
235 			        G_DEBUG_STMT ,
236 			        'ahl.plsql.AHL_UMP_FORECAST_REQ_PVT.Process_Mrl_Req_Forecast',
237 			        'AHL_LTP_MTL_REQ_PVT.Get_Route_Mtl_Req API :p_route_id :p_mr_route_id : p_item_instance_id : p_requirement_date'
238                     || ue_mr_routes_rec.route_id || ':' || ue_mr_routes_rec.mr_route_id || ':' ||P_applicable_instances_tbl(i).csi_item_instance_id
239                     || ':' ||ue_mr_routes_rec.due_date
240 		        );
241                -- log into concurrent log file.
242                fnd_file.put_line(fnd_file.log,l_debug_module || ':p_route_id :p_mr_route_id : p_item_instance_id : p_requirement_date' || ue_mr_routes_rec.route_id || ':' || ue_mr_routes_rec.mr_route_id
243               || ':' ||P_applicable_instances_tbl(i).csi_item_instance_id || ':' ||ue_mr_routes_rec.due_date);
244            END IF;
245 
246            IF NOT(TRUNC(NVL(ue_mr_routes_rec.start_date_active,SYSDATE)) <= TRUNC(SYSDATE)
247                   AND TRUNC(NVL(ue_mr_routes_rec.end_date_active,SYSDATE+1))>TRUNC(SYSDATE))THEN
248               -- route is expired so delete forecast
249               IF (G_DEBUG_STMT >= G_DEBUG_LEVEL)THEN
250 		        fnd_log.string
251 		        (
252 			        G_DEBUG_STMT ,
253 			        'ahl.plsql.AHL_UMP_FORECAST_REQ_PVT.Process_Mrl_Req_Forecast',
254 			        'AHL_LTP_MTL_REQ_PVT.Get_Route_Mtl_Req API :p_route_id :p_mr_route_id : '
255                     || ue_mr_routes_rec.route_id || ':' || ue_mr_routes_rec.mr_route_id
256 		        );
257               END IF;
258               FOR del_exp_route_rec IN del_exp_route_schedule_mtl_csr(ue_mr_routes_rec.unit_effectivity_id, ue_mr_routes_rec.mr_route_id) LOOP
259                 AHL_SCHEDULE_MATERIALS_PKG.delete_row(x_scheduled_material_id => del_exp_route_rec.scheduled_material_id);
260               END LOOP;
261            ELSE
262              -- route is valid and proceed to forecast
263              IF(TRUNC(ue_mr_routes_rec.due_date) < TRUNC(SYSDATE))THEN
264                 l_requirement_date := SYSDATE;
265              ELSE
266                 l_requirement_date := ue_mr_routes_rec.due_date;
267              END IF;
268 
269              IF( NVL(l_previous_route_id,-1) <> ue_mr_routes_rec.route_id OR
270                TRUNC(NVL(l_previous_req_date,l_requirement_date - 1)) <> TRUNC(l_requirement_date))THEN
271 
272                -- Added by SURRKUMA for Service Bulletin on 17-Jun-11
273                OPEN get_visit_id_csr(ue_mr_routes_rec.unit_effectivity_id);
274                FETCH get_visit_id_csr INTO l_visit_id;
275                CLOSE get_visit_id_csr;
276 
277                AHL_LTP_MTL_REQ_PVT.Get_Route_Mtl_Req
278                (
279                 p_api_version           => 1.0,
280                 p_init_msg_list         => FND_API.G_FALSE,
281                 p_validation_level      => FND_API.G_VALID_LEVEL_FULL,
282                 x_return_status         => x_return_status,
283                 x_msg_count             => x_msg_count,
284                 x_msg_data              => x_msg_data,
285                 p_route_id              => ue_mr_routes_rec.route_id,
286                 p_mr_route_id           => ue_mr_routes_rec.mr_route_id,
287                 p_item_instance_id      => P_applicable_instances_tbl(i).csi_item_instance_id,
288                 p_visit_id              => l_visit_id, -- Added by SURRKUMA on 07-Jun-2011 for Service Bulletin
289                 p_requirement_date      => l_requirement_date,
290                 p_request_type          => G_REQ_TYPE_FORECAST,
291                 x_route_mtl_req_tbl     => l_Route_Mtl_Req_Tbl
292                );
293                l_previous_route_id := ue_mr_routes_rec.route_id;
294                l_previous_req_date := l_requirement_date;
295 
296                IF(x_return_status <> FND_API.G_RET_STS_SUCCESS)THEN
297                  IF(fnd_log.level_error >= G_DEBUG_LEVEL)THEN
298 		           fnd_log.string
299 		           (
300 			          fnd_log.level_error,
301 			          'ahl.plsql.AHL_UMP_FORECAST_REQ_PVT.Process_Mrl_Req_Forecast',
302 			          'AHL_LTP_MTL_REQ_PVT.Get_Route_Mtl_Req Threw error'
303 		           );
304                  END IF;
305                  RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
306                END IF;
307               END IF;
308 
309               IF (l_Route_Mtl_Req_Tbl IS NOT NULL AND l_Route_Mtl_Req_Tbl.COUNT > 0)THEN
310               IF (G_DEBUG_STMT >= G_DEBUG_LEVEL)THEN
311 		          fnd_log.string
312 		          (
313 			        G_DEBUG_STMT,
314 			        'ahl.plsql.AHL_UMP_FORECAST_REQ_PVT.Process_Mrl_Req_Forecast',
315 			        'After call AHL_LTP_MTL_REQ_PVT.Get_Route_Mtl_Req API : l_Route_Mtl_Req_Tbl.COUNT : ' || l_Route_Mtl_Req_Tbl.COUNT
316 		          );
317               END IF;
318               FOR j IN l_Route_Mtl_Req_Tbl.FIRST..l_Route_Mtl_Req_Tbl.LAST LOOP
319                   OPEN schedule_mtl_exists_csr(ue_mr_routes_rec.unit_effectivity_id,
320                            ue_mr_routes_rec.mr_route_id, l_Route_Mtl_Req_Tbl(j).inventory_item_id, l_Route_Mtl_Req_Tbl(j).rt_oper_material_id);
321                   FETCH schedule_mtl_exists_csr INTO l_Schedule_Mtl_Req_rec;
322                   IF(schedule_mtl_exists_csr%NOTFOUND)THEN
323                     IF (G_DEBUG_STMT >= G_DEBUG_LEVEL)THEN
324 		                fnd_log.string
325 		                (
326 			                G_DEBUG_STMT,
327 			                'ahl.plsql.AHL_UMP_FORECAST_REQ_PVT.Process_Mrl_Req_Forecast',
328 			                'Inserting record in AHL_SCHEDULE_MATERIALS '
329 		                );
330                         fnd_log.string
331 		                (
332 			                G_DEBUG_STMT,
333 			                'ahl.plsql.AHL_UMP_FORECAST_REQ_PVT.Process_Mrl_Req_Forecast',
334 			                'unit_effectivity_id :  ' || ue_mr_routes_rec.unit_effectivity_id
335 		                );
336                         fnd_log.string
337 		                (
338 			                G_DEBUG_STMT,
339 			                'ahl.plsql.AHL_UMP_FORECAST_REQ_PVT.Process_Mrl_Req_Forecast',
340 			                'requested_date :  ' || ue_mr_routes_rec.due_date
341 		                );
342                         fnd_log.string
343 		                (
344 			                G_DEBUG_STMT,
345 			                'ahl.plsql.AHL_UMP_FORECAST_REQ_PVT.Process_Mrl_Req_Forecast',
346 			                'mr_route_id : '|| ue_mr_routes_rec.mr_route_id
347 		                );
348                         fnd_log.string
349 		                (
350 			                G_DEBUG_STMT,
351 			                'ahl.plsql.AHL_UMP_FORECAST_REQ_PVT.Process_Mrl_Req_Forecast',
352 			                'inventory_item_id :  ' || l_Route_Mtl_Req_Tbl(j).inventory_item_id
353 		                );
354                         fnd_log.string
355 		                (
356 			                G_DEBUG_STMT,
357 			                'ahl.plsql.AHL_UMP_FORECAST_REQ_PVT.Process_Mrl_Req_Forecast',
358 			                'quantity :  ' || l_Route_Mtl_Req_Tbl(j).quantity
359 		                );
360                         fnd_log.string
361 		                (
362 			                G_DEBUG_STMT,
363 			                'ahl.plsql.AHL_UMP_FORECAST_REQ_PVT.Process_Mrl_Req_Forecast',
364 			                'uom :  ' || l_Route_Mtl_Req_Tbl(j).uom_code
365 		                );
366                     END IF;
367                     AHL_SCHEDULE_MATERIALS_PKG.INSERT_ROW
368                     (
369                         X_SCHEDULED_MATERIAL_ID  => NULL,
370                         X_OBJECT_VERSION_NUMBER  => 1,
371                         X_LAST_UPDATE_DATE       => SYSDATE,
372                         X_LAST_UPDATED_BY        => fnd_global.user_id,
373                         X_CREATION_DATE          => SYSDATE,
374                         X_CREATED_BY             => fnd_global.user_id,
375                         X_LAST_UPDATE_LOGIN      => fnd_global.user_id,
376                         X_INVENTORY_ITEM_ID      => l_Route_Mtl_Req_Tbl(j).inventory_item_id,
377                         X_SCHEDULE_DESIGNATOR    => NULL,
378                         X_VISIT_ID               => NULL,
379                         X_VISIT_START_DATE       => NULL,
380                         X_VISIT_TASK_ID          => NULL,
381                         X_ORGANIZATION_ID        => NULL,
382                         X_SCHEDULED_DATE         => NULL,
383                         X_REQUEST_ID             => NULL,
384                         -- AnRaj: truncating Requested Date for Material Requirement based on discussions with PM
385                         X_REQUESTED_DATE         => trunc(ue_mr_routes_rec.due_date),
386                         X_SCHEDULED_QUANTITY     => NULL,
387                         X_PROCESS_STATUS         => NULL,
388                         X_ERROR_MESSAGE          => NULL,
389                         X_TRANSACTION_ID         => NULL,
390                         X_UOM                    => l_Route_Mtl_Req_Tbl(j).uom_code,
391                         X_RT_OPER_MATERIAL_ID    => l_Route_Mtl_Req_Tbl(j).rt_oper_material_id,
392                         X_OPERATION_CODE         => NULL,
393                         X_OPERATION_SEQUENCE     => NULL,
394                         X_ITEM_GROUP_ID          => l_Route_Mtl_Req_Tbl(j).item_group_id,
395                         X_REQUESTED_QUANTITY     => l_Route_Mtl_Req_Tbl(j).quantity,
396                         X_PROGRAM_ID             => NULL,
397                         X_PROGRAM_UPDATE_DATE    => NULL,
398                         X_LAST_UPDATED_DATE      => NULL,
399                         X_WORKORDER_OPERATION_ID => NULL,
400                         X_POSITION_PATH_ID       => l_Route_Mtl_Req_Tbl(j).position_path_id,
401                         X_RELATIONSHIP_ID        => l_Route_Mtl_Req_Tbl(j).relationship_id,
402                         X_UNIT_EFFECTIVITY_ID    => ue_mr_routes_rec.unit_effectivity_id,
403                         X_MR_ROUTE_ID            => ue_mr_routes_rec.mr_route_id,
404                         X_MATERIAL_REQUEST_TYPE  => G_REQ_TYPE_FORECAST,
405                         -- Added MC_HEADER_ID and POSITION_KEY by surrkuma on 07-Jun-2011 for Service Bulletin
406                         X_MC_HEADER_ID           => l_Route_Mtl_Req_Tbl(j).mc_header_id,
407                         X_POSITION_KEY           => l_Route_Mtl_Req_Tbl(j).position_key,
408                         X_ATTRIBUTE_CATEGORY     => NULL,
409                         X_ATTRIBUTE1             => NULL,
410                         X_ATTRIBUTE2             => NULL,
411                         X_ATTRIBUTE3             => NULL,
412                         X_ATTRIBUTE4             => NULL,
413                         X_ATTRIBUTE5             => NULL,
414                         X_ATTRIBUTE6             => NULL,
415                         X_ATTRIBUTE7             => NULL,
416                         X_ATTRIBUTE8             => NULL,
417                         X_ATTRIBUTE9             => NULL,
418                         X_ATTRIBUTE10            => NULL,
419                         X_ATTRIBUTE11            => NULL,
420                         X_ATTRIBUTE12            => NULL,
421                         X_ATTRIBUTE13            => NULL,
422                         X_ATTRIBUTE14            => NULL,
423                         X_ATTRIBUTE15            => NULL
424                     );
425                   ELSE
426                     IF (G_DEBUG_STMT >= G_DEBUG_LEVEL)THEN
427 		                fnd_log.string
428 		                (
429 			                G_DEBUG_STMT,
430 			                'ahl.plsql.AHL_UMP_FORECAST_REQ_PVT.Process_Mrl_Req_Forecast',
431 			                'Updating record in AHL_SCHEDULE_MATERIALS '
432 		                );
433                         fnd_log.string
434 		                (
435 			                G_DEBUG_STMT,
436 			                'ahl.plsql.AHL_UMP_FORECAST_REQ_PVT.Process_Mrl_Req_Forecast',
437 			                'unit_effectivity_id :  ' || ue_mr_routes_rec.unit_effectivity_id
438 		                );
439                         fnd_log.string
440 		                (
441 			                G_DEBUG_STMT,
442 			                'ahl.plsql.AHL_UMP_FORECAST_REQ_PVT.Process_Mrl_Req_Forecast',
443 			                'requested_date :  ' || ue_mr_routes_rec.due_date
444 		                );
445                         fnd_log.string
446 		                (
447 			                G_DEBUG_STMT,
448 			                'ahl.plsql.AHL_UMP_FORECAST_REQ_PVT.Process_Mrl_Req_Forecast',
449 			                'mr_route_id : '|| ue_mr_routes_rec.mr_route_id
450 		                );
451                         fnd_log.string
452 		                (
453 			                G_DEBUG_STMT,
454 			                'ahl.plsql.AHL_UMP_FORECAST_REQ_PVT.Process_Mrl_Req_Forecast',
455 			                'inventory_item_id :  ' || l_Route_Mtl_Req_Tbl(j).inventory_item_id
456 		                );
457                         fnd_log.string
458 		                (
459 			                G_DEBUG_STMT,
460 			                'ahl.plsql.AHL_UMP_FORECAST_REQ_PVT.Process_Mrl_Req_Forecast',
461 			                'quantity :  ' || l_Route_Mtl_Req_Tbl(j).quantity
462 		                );
463                         fnd_log.string
464 		                (
465 			                G_DEBUG_STMT,
466 			                'ahl.plsql.AHL_UMP_FORECAST_REQ_PVT.Process_Mrl_Req_Forecast',
467 			                'uom :  ' || l_Route_Mtl_Req_Tbl(j).uom_code
468 		                );
469                     END IF;
470                     AHL_SCHEDULE_MATERIALS_PKG.UPDATE_ROW
471                     (
472                         X_SCHEDULED_MATERIAL_ID  => l_Schedule_Mtl_Req_rec.SCHEDULED_MATERIAL_ID,
473                         X_OBJECT_VERSION_NUMBER  => l_Schedule_Mtl_Req_rec.OBJECT_VERSION_NUMBER,--Update Column
474                         X_LAST_UPDATE_DATE       => SYSDATE,
475                         X_LAST_UPDATED_BY        => fnd_global.user_id,
476                         X_LAST_UPDATE_LOGIN      => fnd_global.user_id,
477                         X_INVENTORY_ITEM_ID      => l_Schedule_Mtl_Req_rec.INVENTORY_ITEM_ID,
478                         X_SCHEDULE_DESIGNATOR    => l_Schedule_Mtl_Req_rec.SCHEDULE_DESIGNATOR,
479                         X_VISIT_ID               => l_Schedule_Mtl_Req_rec.VISIT_ID,
480                         X_VISIT_START_DATE       => l_Schedule_Mtl_Req_rec.VISIT_START_DATE,
481                         X_VISIT_TASK_ID          => l_Schedule_Mtl_Req_rec.VISIT_TASK_ID,
482                         X_ORGANIZATION_ID        => l_Schedule_Mtl_Req_rec.ORGANIZATION_ID,
483                         X_SCHEDULED_DATE         => l_Schedule_Mtl_Req_rec.SCHEDULED_DATE,
484                         X_REQUEST_ID             => l_Schedule_Mtl_Req_rec.REQUEST_ID,
485                         -- AnRaj: truncating Requested Date for Material Requirement based on discussions with PM
486                         X_REQUESTED_DATE         => trunc(ue_mr_routes_rec.due_date),--Update Column
487                         X_SCHEDULED_QUANTITY     => l_Schedule_Mtl_Req_rec.SCHEDULED_QUANTITY,
488                         X_PROCESS_STATUS         => l_Schedule_Mtl_Req_rec.PROCESS_STATUS,
489                         X_ERROR_MESSAGE          => l_Schedule_Mtl_Req_rec.ERROR_MESSAGE,
490                         X_TRANSACTION_ID         => l_Schedule_Mtl_Req_rec.TRANSACTION_ID,
491                         X_UOM                    => l_Route_Mtl_Req_Tbl(j).uom_code,--Update Column
492                         X_RT_OPER_MATERIAL_ID    => l_Route_Mtl_Req_Tbl(j).rt_oper_material_id,--Update Column
493                         X_OPERATION_CODE         => l_Schedule_Mtl_Req_rec.OPERATION_CODE,
494                         X_OPERATION_SEQUENCE     => l_Schedule_Mtl_Req_rec.OPERATION_SEQUENCE,
495                         X_ITEM_GROUP_ID          => l_Route_Mtl_Req_Tbl(j).item_group_id,--Update Column
496                         X_REQUESTED_QUANTITY     => l_Route_Mtl_Req_Tbl(j).quantity,--Update Column
497                         X_PROGRAM_ID             => l_Schedule_Mtl_Req_rec.PROGRAM_ID,
498                         X_PROGRAM_UPDATE_DATE    => l_Schedule_Mtl_Req_rec.PROGRAM_UPDATE_DATE,
499                         X_LAST_UPDATED_DATE      => l_Schedule_Mtl_Req_rec.LAST_UPDATED_DATE,
500                         X_WORKORDER_OPERATION_ID => l_Schedule_Mtl_Req_rec.WORKORDER_OPERATION_ID,
501                         X_POSITION_PATH_ID       => l_Route_Mtl_Req_Tbl(j).position_path_id,--Update Column
502                         X_RELATIONSHIP_ID        => l_Route_Mtl_Req_Tbl(j).relationship_id,--Update Column
503                         X_UNIT_EFFECTIVITY_ID    => l_Schedule_Mtl_Req_rec.UNIT_EFFECTIVITY_ID,
504                         X_MR_ROUTE_ID            => l_Schedule_Mtl_Req_rec.MR_ROUTE_ID,
505                         X_MATERIAL_REQUEST_TYPE  => l_Schedule_Mtl_Req_rec.MATERIAL_REQUEST_TYPE,
506                         -- Added MC_HEADER_ID and POSITION_KEY by surrkuma on 07-Jun-2011 for Service Bulletin
507                         X_MC_HEADER_ID           => l_Route_Mtl_Req_Tbl(j).mc_header_id,
508                         X_POSITION_KEY           => l_Route_Mtl_Req_Tbl(j).position_key,
509                         X_ATTRIBUTE_CATEGORY     => l_Schedule_Mtl_Req_rec.ATTRIBUTE_CATEGORY,
510                         X_ATTRIBUTE1             => l_Schedule_Mtl_Req_rec.ATTRIBUTE1,
511                         X_ATTRIBUTE2             => l_Schedule_Mtl_Req_rec.ATTRIBUTE2,
512                         X_ATTRIBUTE3             => l_Schedule_Mtl_Req_rec.ATTRIBUTE3,
513                         X_ATTRIBUTE4             => l_Schedule_Mtl_Req_rec.ATTRIBUTE4,
514                         X_ATTRIBUTE5             => l_Schedule_Mtl_Req_rec.ATTRIBUTE5,
515                         X_ATTRIBUTE6             => l_Schedule_Mtl_Req_rec.ATTRIBUTE6,
516                         X_ATTRIBUTE7             => l_Schedule_Mtl_Req_rec.ATTRIBUTE7,
517                         X_ATTRIBUTE8             => l_Schedule_Mtl_Req_rec.ATTRIBUTE8,
518                         X_ATTRIBUTE9             => l_Schedule_Mtl_Req_rec.ATTRIBUTE9,
519                         X_ATTRIBUTE10            => l_Schedule_Mtl_Req_rec.ATTRIBUTE10,
520                         X_ATTRIBUTE11            => l_Schedule_Mtl_Req_rec.ATTRIBUTE11,
521                         X_ATTRIBUTE12            => l_Schedule_Mtl_Req_rec.ATTRIBUTE12,
522                         X_ATTRIBUTE13            => l_Schedule_Mtl_Req_rec.ATTRIBUTE13,
523                         X_ATTRIBUTE14            => l_Schedule_Mtl_Req_rec.ATTRIBUTE14,
524                         X_ATTRIBUTE15            => l_Schedule_Mtl_Req_rec.ATTRIBUTE15
525                     );
526                   END IF;
527                   CLOSE schedule_mtl_exists_csr;
528               END LOOP; -- Finished forecasting for single mr route in a unit effectivity
529             END IF;-- if route material requirement has a list to be forecasted
530           END IF;
531          END LOOP;-- For all unit effectivities
532        END LOOP;-- for all item instances
533      END IF;-- if there is a list of item instances
534 
535      IF (G_DEBUG_STMT >= G_DEBUG_LEVEL)THEN
536 		fnd_log.string
537 		(
538 			G_DEBUG_STMT,
539 			'ahl.plsql.AHL_UMP_FORECAST_REQ_PVT.Process_Mrl_Req_Forecast',
540 			'Have succesfully finished forecasting'
541 		);
542      END IF;
543      -- Check Error Message stack.
544      x_msg_count := FND_MSG_PUB.count_msg;
545      IF x_msg_count > 0 THEN
546         RAISE  FND_API.G_EXC_ERROR;
547      END IF;
548 
549      -- Standard check of p_commit
550      IF FND_API.TO_BOOLEAN(p_commit) THEN
551       COMMIT WORK;
552      END IF;
553 
554      IF (G_DEBUG_PROC >= G_DEBUG_LEVEL)THEN
555 		fnd_log.string
556 		(
557 			G_DEBUG_PROC,
558 			'ahl.plsql.AHL_UMP_FORECAST_REQ_PVT.Process_Mrl_Req_Forecast.end',
559 			'At the end of PLSQL procedure'
560 		);
561      END IF;
562 
563 EXCEPTION
564  WHEN FND_API.G_EXC_ERROR THEN
565    x_return_status := FND_API.G_RET_STS_ERROR;
566    ROLLBACK TO Process_Mrl_Req_Forecast;
567    FND_MSG_PUB.count_and_get( p_count => x_msg_count,
568                               p_data  => x_msg_data,
569                               p_encoded => fnd_api.g_false);
570 
571 
572  WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
573    x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
574    ROLLBACK TO Process_Mrl_Req_Forecast;
575    FND_MSG_PUB.count_and_get( p_count => x_msg_count,
576                               p_data  => x_msg_data,
577                               p_encoded => fnd_api.g_false);
578 
579 
580  WHEN OTHERS THEN
581     x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
582     ROLLBACK TO Process_Mrl_Req_Forecast;
583     IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR) THEN
584        fnd_msg_pub.add_exc_msg(p_pkg_name       => G_PKG_NAME,
585                                p_procedure_name => 'Process_Mrl_Req_Forecast',
586                                p_error_text     => SUBSTR(SQLERRM,1,500));
587     END IF;
588     FND_MSG_PUB.count_and_get( p_count => x_msg_count,
589                                p_data  => x_msg_data,
590                                p_encoded => fnd_api.g_false);
591 
592 END Process_Mrl_Req_Forecast;
593 
594 ---
595 -- Called from concurrent program. This will create/update the material
596 -- forecast stream.
597 PROCEDURE Build_Mat_Forecast_Stream (
598     errbuf                  OUT NOCOPY  VARCHAR2,
599     retcode                 OUT NOCOPY  NUMBER,
600     p_unit_config_hdr_id    IN          NUMBER,
601     p_item_instance_id      IN          NUMBER)
602 IS
603 
604    -- To validate instance.
605   CURSOR csi_item_instances_csr(p_csi_item_instance_id IN  NUMBER) IS
606     SELECT instance_number, active_end_date
607     FROM csi_item_instances
608     WHERE instance_id = p_csi_item_instance_id;
609 
610   -- To validate unit.
611   CURSOR ahl_unit_config_headers_csr (p_uc_header_id IN NUMBER) IS
612     SELECT name, csi_item_instance_id, master_config_id, unit_config_status_code
613     FROM  ahl_unit_config_headers
614     WHERE unit_config_header_id = p_uc_header_id;
615 
616   -- To get unit config id.
617   CURSOR ahl_unit_config_header_csr (p_item_instance_id IN NUMBER) IS
618     SELECT name, master_config_id, unit_config_status_code
619     FROM  ahl_unit_config_headers
620     WHERE csi_item_instance_id = p_item_instance_id
621       AND parent_uc_header_id IS NULL;
622 
623   -- get mr_route and route_id for a mr_header.
624   CURSOR ahl_mr_route_csr(p_mr_header_id IN NUMBER) IS
625     SELECT rt.mr_route_id, rt.route_id, R.start_date_active, R.end_date_active
626     FROM AHL_MR_ROUTES rt, ahl_routes_b R
627     WHERE rt.route_id = r.route_id
628       AND rt.mr_header_id = p_mr_header_id;
629 
630   -- get mr headers
631   CURSOR ahl_mr_header_csr(appln_usg_code IN VARCHAR2) IS
632     SELECT mr_header_id
633       FROM ahl_mr_headers_b mr
634       WHERE application_usg_code = appln_usg_code
635       AND mr_status_code = 'COMPLETE'
636       AND EXISTS (SELECT 1
637                   FROM ahl_unit_effectivities_b
638                   WHERE mr_header_id = mr.mr_header_id
639                     AND (status_code IS NULL OR status_code = 'INIT-DUE')
640                  );
641 
642   -- get open UE IDs for the MR header.
643   -- check if instance expired to fix bug# 8543402.
644   CURSOR get_ue_csr (p_mr_header_id IN NUMBER) IS
645     SELECT unit_effectivity_id, due_date, csi_item_instance_id
646       FROM ahl_unit_effectivities_b UE, csi_item_instances II
647      WHERE UE.mr_header_id = p_mr_header_id
648        AND UE.csi_item_instance_id = II.instance_id
649        AND nvl(ii.active_end_date, sysdate+1) > sysdate
650        AND UE.due_date IS NOT NULL
651        AND (UE.status_code IS NULL OR UE.status_code = 'INIT-DUE');
652      --ORDER BY csi_item_instance_id, due_date;
653 
654   l_debug_module          VARCHAR2(400) := 'ahl.plsql.AHL_UMP_FORECAST_REQ_PVT.Build_Mat_Forecast_Stream';
655 
656   l_csi_item_instance_id  NUMBER;
657   l_name                  ahl_unit_config_headers.name%TYPE;
658   l_instance_number       csi_item_instances.instance_number%TYPE;
659   l_active_end_date       DATE;
660 
661   l_config_node_tbl       AHL_UMP_PROCESSUNIT_PVT.config_node_tbl_type;
662   l_master_config_id      NUMBER;
663   l_config_status_code    fnd_lookup_values_vl.lookup_code%TYPE;
664 
665   l_msg_data              VARCHAR2(2000);
666   l_msg_count             NUMBER;
667   l_return_status         VARCHAR2(1);
668 
669   l_mr_route_id_tbl       nbr_tbl_type;
670   l_route_id_tbl          nbr_tbl_type;
671   l_mr_header_id_tbl      nbr_tbl_type;
672   l_r_start_date_tbl      date_tbl_type;
673   l_r_end_date_tbl        date_tbl_type;
674 
675   l_ue_id_tbl             nbr_tbl_type;
676   l_ue_due_date_tbl       date_tbl_type;
677   l_ue_ii_id_tbl          nbr_tbl_type;
678 
679   l_buffer_limit          NUMBER := 1000;
680 
681 BEGIN
682 
683   IF (G_DEBUG_PROC >= G_DEBUG_LEVEL) THEN
684      fnd_log.string ( G_DEBUG_PROC, l_debug_module, 'Start Build_Mat_Forecast_Stream');
685      fnd_log.string ( G_DEBUG_PROC, l_debug_module,
686                       'Input Parameter: p_unit_config_hdr_id:' || p_unit_config_hdr_id);
687      fnd_log.string ( G_DEBUG_PROC, l_debug_module,
688                       'Input Parameter: p_item_instance_id:' || p_item_instance_id);
689   END IF;
690 
691    -- initialize return status.
692    retcode := 0;
693 
694    IF (G_IS_PM_INSTALLED <> 'N') THEN
695      -- only valid for application usg code - AHL
696      RETURN;
697    END IF;
698 
699    IF (p_unit_config_hdr_id IS NOT NULL OR p_item_instance_id IS NOT NULL) THEN
700       IF (p_item_instance_id IS NOT NULL) THEN
701          -- validate item instance.
702          OPEN csi_item_instances_csr (p_item_instance_id);
703          FETCH csi_item_instances_csr INTO l_instance_number, l_active_end_date;
704          IF (csi_item_instances_csr%NOTFOUND) THEN
705             FND_MESSAGE.Set_Name('AHL','AHL_UMP_PUE_INSTID_NOTFOUND');
706             FND_MESSAGE.Set_Token('INST_ID', p_item_instance_id);
707             FND_MSG_PUB.ADD;
708             CLOSE csi_item_instances_csr;
709             --dbms_output.put_line('Instance not found');
710             errbuf := FND_MSG_PUB.GET;
711             retcode := 2;
712          ELSIF (trunc(l_active_end_date) < trunc(sysdate)) THEN
713            FND_MESSAGE.Set_Name('AHL','AHL_UMP_PUE_INST_EXPIRED');
714            FND_MESSAGE.Set_Token('NUMBER', l_instance_number);
715            FND_MSG_PUB.ADD;
716            --dbms_output.put_line('Instance has expired');
717            errbuf := FND_MSG_PUB.GET;
718            retcode := 2;
719          ELSE
720            l_csi_item_instance_id := p_item_instance_id;
721 
722            -- If item instance is not top node, find the root item instance.
723            l_csi_item_instance_id := Get_RootInstanceID(l_csi_item_instance_id);
724 
725            -- get master Config ID if root instance is a UC.
726            OPEN ahl_unit_config_header_csr(l_csi_item_instance_id);
727            FETCH ahl_unit_config_header_csr INTO l_name, l_master_config_id, l_config_status_code;
728            IF (ahl_unit_config_header_csr%FOUND) THEN
729               IF (l_config_status_code = 'DRAFT') THEN
730                  FND_MESSAGE.Set_Name('AHL','AHL_UMP_PUE_STATUS_INVALID');
731                  FND_MESSAGE.Set_Token('NAME',l_name);
732                  FND_MSG_PUB.ADD;
733                  errbuf := FND_MSG_PUB.GET;
734                  retcode := 2;
735               END IF;
736            ELSE
737               l_master_config_id := NULL;
738            END IF; -- ahl_unit_config_header_csr%FOUND
739            CLOSE ahl_unit_config_header_csr;
740 
741          END IF; -- csi_item_instances_csr%NOTFOUND
742          CLOSE csi_item_instances_csr;
743 
744       END IF; -- p_item_instance_id
745 
746       IF (p_unit_config_hdr_id IS NOT NULL) THEN
747           -- Validate unit config id.
748           OPEN ahl_unit_config_headers_csr (p_unit_config_hdr_id);
749           FETCH ahl_unit_config_headers_csr INTO l_name, l_csi_item_instance_id, l_master_config_id,
750                                                  l_config_status_code ;
751           IF (ahl_unit_config_headers_csr%NOTFOUND) THEN
752               FND_MESSAGE.Set_Name('AHL','AHL_UMP_PUE_UNIT_NOTFOUND');
753               FND_MESSAGE.Set_Token('UNIT_ID',p_unit_config_hdr_id);
754               FND_MSG_PUB.ADD;
755               errbuf := FND_MSG_PUB.GET;
756               retcode := 2;
757               --dbms_output.put_line('Unit not found');
758           ELSE
759             IF (l_config_status_code = 'DRAFT') THEN
760                FND_MESSAGE.Set_Name('AHL','AHL_UMP_PUE_STATUS_INVALID');
761                FND_MESSAGE.Set_Token('NAME',l_name);
762                FND_MSG_PUB.ADD;
763                CLOSE ahl_unit_config_headers_csr;
764 
765                errbuf := FND_MSG_PUB.GET;
766                retcode := 2;
767             END IF;
768           END IF;
769       END IF; -- p_unit_config_hdr_id
770 
771       -- Check error code.
772       IF (retcode = 2) THEN
773         RETURN;
774       END IF;
775 
776       IF (G_DEBUG_PROC >= G_DEBUG_LEVEL) THEN
777         fnd_log.string ( G_DEBUG_PROC, l_debug_module, 'Master Config ID:' || l_master_config_id);
778         fnd_log.string ( G_DEBUG_PROC, l_debug_module, 'Root Instance ID:' || l_csi_item_instance_id);
779       END IF;
780 
781       -- Build the Configuration tree structure.(G_config_node_tbl).
782       Build_Config_Tree(l_csi_item_instance_id, l_master_config_id, l_config_node_tbl);
783 
784       SAVEPOINT Build_Mrl_Forecast_Stream_s;
785 
786       --call for material requirement forecast
787       AHL_UMP_FORECAST_REQ_PVT.process_mrl_req_forecast
788       (
789        p_api_version                => 1.0,
790        p_init_msg_list              => FND_API.G_TRUE,
791        p_commit                     => FND_API.G_FALSE,
792        p_validation_level           => FND_API.G_VALID_LEVEL_FULL,
793        x_return_status              => l_return_status,
794        x_msg_count                  => l_msg_count,
795        x_msg_data                   => l_msg_data,
796        p_applicable_instances_tbl   => l_config_node_tbl
797       );
798 
799       l_msg_count := FND_MSG_PUB.Count_Msg;
800       IF (l_return_status <> FND_API.G_RET_STS_SUCCESS)
801       THEN
802         retcode := 2;  -- error based only on return status
803       ELSIF (l_msg_count > 0 AND l_return_status = FND_API.G_RET_STS_SUCCESS)
804       THEN
805          retcode := 1;  -- warning based on return status + msg count
806       END IF;
807 
808       -- success.
809       IF (l_return_status = FND_API.G_RET_STS_SUCCESS) THEN
810         COMMIT WORK;
811       END IF;
812 
813    END IF; -- p_unit_config_hdr_id IS NOT NULL OR p_item_instance_id IS NOT NULL
814 
815    IF (p_unit_config_hdr_id IS NULL AND p_item_instance_id IS NULL) THEN
816       -- process all UEs.
817       OPEN ahl_mr_header_csr(G_APP_MODULE);
818       LOOP
819         FETCH ahl_mr_header_csr BULK COLLECT INTO l_mr_header_id_tbl LIMIT l_buffer_limit;
820         EXIT WHEN (l_mr_header_id_tbl.count = 0);
821 
822         FOR j IN l_mr_header_id_tbl.FIRST..l_mr_header_id_tbl.LAST LOOP
823 
824           -- set savepoint for MR and commit after processing MR.
825           SAVEPOINT Build_Mrl_Forecast_Stream_s;
826 
827           IF (G_DEBUG_STMT >= G_DEBUG_LEVEL) THEN
828             fnd_log.string ( G_DEBUG_STMT, l_debug_module, 'MR Header ID:' || l_mr_header_id_tbl(j));
829           END IF;
830 
831           OPEN ahl_mr_route_csr(l_mr_header_id_tbl(j));
832           FETCH ahl_mr_route_csr BULK COLLECT INTO l_mr_route_id_tbl, l_route_id_tbl,
833                                                    l_r_start_date_tbl, l_r_end_date_tbl;
834           CLOSE ahl_mr_route_csr;
835 
836           -- get UE IDs and due dates for the MR.
837           OPEN get_ue_csr(l_mr_header_id_tbl(j));
838           LOOP
839             FETCH get_ue_csr BULK COLLECT INTO l_ue_id_tbl, l_ue_due_date_tbl, l_ue_ii_id_tbl LIMIT l_buffer_limit;
840             EXIT WHEN (l_ue_id_tbl.COUNT = 0);
841             FOR i IN l_ue_id_tbl.FIRST..l_ue_id_tbl.LAST LOOP
842                IF (l_mr_route_id_tbl.COUNT > 0) THEN
843                   FOR k IN l_mr_route_id_tbl.FIRST..l_mr_route_id_tbl.LAST LOOP
844                      -- validate and update/insert into schedule materials for
845                      -- every combination of UE and mr_route_id.
846                      AHL_UMP_FORECAST_REQ_PVT.Process_Material_Req
847                               (p_unit_effectivity_id  => l_ue_id_tbl(i),
848                                p_csi_item_instance_id => l_ue_ii_id_tbl(i),
849                                p_due_date             => l_ue_due_date_tbl(i),
850                                p_mr_route_id          => l_mr_route_id_tbl(k),
851                                p_route_id             => l_route_id_tbl(k),
852                                p_r_start_date_active  => l_r_start_date_tbl(k),
853                                p_r_end_date_active    => l_r_end_date_tbl(k)
854                               );
855                   END LOOP; -- l_mr_route_id_tbl.FIRST
856                END IF; -- l_mr_route_id_tbl.COUNT
857             END LOOP; -- l_ue_id_tbl.FIRST
858           END LOOP;
859           CLOSE  get_ue_csr;
860 
861           COMMIT WORK;  -- commit after processing MR.
862 
863         END LOOP; -- l_mr_header_id_tbl.FIRST
864       END LOOP;  -- ahl_mr_header_csr
865       CLOSE ahl_mr_header_csr;
866 
867    END IF; -- p_unit_config_hdr_id IS NULL AND p_item_instance_id IS NULL
868 
869 
870    IF (G_DEBUG_PROC >= G_DEBUG_LEVEL) THEN
871      fnd_log.string ( G_DEBUG_PROC, l_debug_module, 'Out Parameter: retcode:' || retcode);
872      fnd_log.string ( G_DEBUG_PROC, l_debug_module, 'Out Parameter: errbuf:' || errbuf);
873      fnd_log.string ( G_DEBUG_PROC, l_debug_module, 'End Build_Mat_Forecast_Stream');
874    END IF;
875 
876 
877 EXCEPTION
878  WHEN FND_API.G_EXC_ERROR THEN
879    ROLLBACK TO Build_Mrl_Forecast_Stream_s;
880    retcode := 2;
881    log_error_messages;
882 
883  WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
884    ROLLBACK TO Build_Mrl_Forecast_Stream_s;
885    retcode := 2;
886    log_error_messages;
887 
888 
889  WHEN OTHERS THEN
890     ROLLBACK TO Build_Mrl_Forecast_Stream_s;
891    retcode := 2;
892    log_error_messages;
893     IF FND_MSG_PUB.check_msg_level(FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR) THEN
894        fnd_msg_pub.add_exc_msg(p_pkg_name       => G_PKG_NAME,
895                                p_procedure_name => 'Build_Mrl_Forecast_Stream',
896                                p_error_text     => SUBSTR(SQLERRM,1,500));
897     END IF;
898 
899 END Build_Mat_Forecast_Stream;
900 
901 -----------------------------------------------------------------------
902 -- To get the root item instance for the input item instance if exists.
903 
904 FUNCTION Get_RootInstanceID(p_csi_item_instance_id IN NUMBER)
905 RETURN NUMBER
906 IS
907 
908   CURSOR csi_root_instance_csr (p_instance_id IN NUMBER) IS
909     SELECT root.object_id
910     FROM csi_ii_relationships root
911     WHERE NOT EXISTS (SELECT 'x'
912                       FROM csi_ii_relationships
913                       WHERE subject_id = root.object_id
914                         AND trunc(sysdate) < trunc(nvl(active_end_date, sysdate+1))
915                       )
916     START WITH root.subject_id = p_instance_id
917                AND root.relationship_type_code = 'COMPONENT-OF'
918                AND trunc(nvl(root.active_start_date,sysdate)) <= trunc(sysdate)
919                AND trunc(sysdate) < trunc(nvl(root.active_end_date, sysdate+1))
920     CONNECT BY PRIOR root.object_id = root.subject_id
921                      AND root.relationship_type_code = 'COMPONENT-OF'
922                      AND trunc(nvl(root.active_start_date,sysdate)) <= trunc(sysdate)
923                      AND trunc(sysdate) < trunc(nvl(root.active_end_date, sysdate+1));
924 
925   l_csi_instance_id  NUMBER;
926 
927 BEGIN
928 
929   -- get root instance given an item instance_id.
930   OPEN csi_root_instance_csr (p_csi_item_instance_id);
931   FETCH csi_root_instance_csr INTO l_csi_instance_id;
932   IF (csi_root_instance_csr%NOTFOUND) THEN
933      -- input id is root instance.
934      l_csi_instance_id := p_csi_item_instance_id;
935   END IF;
936   CLOSE csi_root_instance_csr;
937   --dbms_output.put_line ('root instance' || l_csi_instance_id);
938 
939   RETURN  l_csi_instance_id;
940 
941 END Get_RootInstanceID;
942 
943 -------------------------------------------------------------
944 -- Build the item instance tree containing root nodes and its components.
945 PROCEDURE Build_Config_Tree(p_csi_root_instance_id IN         NUMBER,
946                             p_master_config_id     IN         NUMBER,
947                             x_config_node_tbl      OUT NOCOPY AHL_UMP_PROCESSUNIT_PVT.config_node_tbl_type)
948 
949 IS
950 
951   CURSOR csi_config_tree_csr ( p_csi_root_instance_id IN NUMBER) IS
952     SELECT subject_id , object_id, position_reference
953     FROM csi_ii_relationships
954     START WITH object_id = p_csi_root_instance_id
955                AND relationship_type_code = 'COMPONENT-OF'
956                AND trunc(nvl(active_start_date,sysdate)) <= trunc(sysdate)
957                AND trunc(sysdate) < trunc(nvl(active_end_date, sysdate+1))
958     CONNECT BY PRIOR subject_id = object_id
959                      AND relationship_type_code = 'COMPONENT-OF'
960                      AND trunc(nvl(active_start_date,sysdate)) <= trunc(sysdate)
961                      AND trunc(sysdate) < trunc(nvl(active_end_date, sysdate+1))
962     ORDER BY level;
963 
964   i  NUMBER;
965   l_config_node_tbl   AHL_UMP_PROCESSUNIT_PVT.config_node_tbl_type := x_config_node_tbl;
966 
967   -- added for perf fix for bug# 6893404.
968   l_buffer_limit      number := 1000;
969 
970   l_subj_id_tbl       nbr_tbl_type;
971   l_obj_id_tbl        nbr_tbl_type;
972   l_posn_ref_tbl      vchar_tbl_type;
973 
974 BEGIN
975 
976   IF (G_DEBUG_PROC >= G_DEBUG_LEVEL)THEN
977      fnd_log.string ( G_DEBUG_PROC, 'ahl.plsql.AHL_UMP_FORECAST_REQ_PVT.Build_Config_Tree',
978                       'Start Build_Config_Tree');
979   END IF;
980 
981    -- For top node.
982   l_config_node_tbl(1).csi_item_instance_id := p_csi_root_instance_id;
983 
984   -- For position reference.
985   IF (p_master_config_id IS NOT NULL) THEN
986     l_config_node_tbl(1).position_reference := to_char(p_master_config_id);
987   END IF;
988 
989   i := 1;
990 
991   -- add child nodes.
992   -- added for perf fix for bug# 6893404.
993   OPEN csi_config_tree_csr(p_csi_root_instance_id);
994   LOOP
995     FETCH csi_config_tree_csr BULK COLLECT INTO l_subj_id_tbl, l_obj_id_tbl, l_posn_ref_tbl
996                               LIMIT l_buffer_limit;
997 
998     EXIT WHEN (l_subj_id_tbl.count = 0);
999 
1000     FOR j IN l_subj_id_tbl.FIRST..l_subj_id_tbl.LAST LOOP
1001 
1002       -- Loop through to get all components of the configuration.
1003       i := i + 1;
1004 
1005       l_config_node_tbl(i).csi_item_instance_id := l_subj_id_tbl(j);
1006       l_config_node_tbl(i).object_id            := l_obj_id_tbl(j);
1007       l_config_node_tbl(i).position_reference   := l_posn_ref_tbl(j);
1008 
1009     END LOOP; -- l_subj_id_tbl.FIRST
1010 
1011     -- reset tables and get the next batch of nodes.
1012     l_subj_id_tbl.DELETE;
1013     l_obj_id_tbl.DELETE;
1014     l_posn_ref_tbl.DELETE;
1015 
1016   END LOOP; -- FETCH csi_config_tree_csr
1017   CLOSE csi_config_tree_csr;
1018 
1019   X_CONFIG_NODE_TBL := l_config_node_tbl;
1020 
1021   IF (G_DEBUG_PROC >= G_DEBUG_LEVEL)THEN
1022       fnd_log.string (G_DEBUG_PROC, 'ahl.plsql.AHL_UMP_FORECAST_REQ_PVT.Build_Config_Tree',
1023                       'Count on config' || x_config_node_tbl.COUNT);
1024 
1025       fnd_log.string (G_DEBUG_PROC, 'ahl.plsql.AHL_UMP_FORECAST_REQ_PVT.Build_Config_Tree',
1026                       'End Build_Config_Tree');
1027   END IF;
1028 
1029 END Build_Config_Tree;
1030 ---
1031 PROCEDURE Process_Material_Req (p_unit_effectivity_id  IN NUMBER,
1032                       p_csi_item_instance_id IN NUMBER,
1033                       p_due_date             IN DATE,
1034                       p_mr_route_id          IN NUMBER,
1035                       p_route_id             IN NUMBER,
1036                       p_r_start_date_active  IN DATE,
1037                       p_r_end_date_active    IN DATE)
1038 IS
1039 
1040    -- Find out the schedule material records for expired routes
1041    CURSOR del_exp_route_schedule_mtl_csr(p_unit_effectivity_id IN NUMBER, p_mr_route_id IN NUMBER) IS
1042    SELECT scheduled_material_id FROM AHL_SCHEDULE_MATERIALS SM
1043    WHERE SM.material_request_type = G_REQ_TYPE_FORECAST
1044    AND SM.mr_route_id = p_mr_route_id
1045    AND SM.unit_effectivity_id IS NOT NULL
1046    AND SM.unit_effectivity_id = p_unit_effectivity_id;
1047 
1048    -- Validates whether a forecast record with unique key combination exisits
1049    -- in AHL_SCHEDULE_MATERIALS table
1050    -- output record used for DML update operation
1051    CURSOR schedule_mtl_exists_csr(p_unit_effectivity_id IN NUMBER,
1052                                   p_mr_route_id IN NUMBER,
1053                                   p_inventory_item_id IN NUMBER,
1054                                   p_rt_oper_material_id IN NUMBER) IS
1055    SELECT * FROM AHL_SCHEDULE_MATERIALS SM
1056    WHERE SM.material_request_type = G_REQ_TYPE_FORECAST
1057    AND NVL(SM.rt_oper_material_id,-1) = NVL(p_rt_oper_material_id,-1)
1058    AND SM.inventory_item_id = p_inventory_item_id
1059    AND SM.mr_route_id = p_mr_route_id
1060    AND SM.unit_effectivity_id = p_unit_effectivity_id
1061    FOR UPDATE OF REQUESTED_DATE NOWAIT;
1062 
1063    -- Added by SURRKUMA for Service Bulletin on 17-Jun-11
1064    -- Fetches the Visit ID for the given ue_id
1065    CURSOR get_visit_id_csr(p_unit_effectivity_id IN NUMBER) IS
1066     SELECT DISTINCT visit_id
1067     FROM   ahl_visit_tasks_b
1068     WHERE  unit_effectivity_id = p_unit_effectivity_id;
1069 
1070    l_debug_module               VARCHAR2(1000) := 'ahl.plsql.AHL_UMP_FORECAST_REQ_PVT.Process_Material_Req';
1071    l_Schedule_Mtl_Req_rec       AHL_SCHEDULE_MATERIALS%ROWTYPE;
1072    l_requirement_date           DATE;
1073    l_Route_Mtl_Req_Tbl          AHL_LTP_MTL_REQ_PVT.Route_Mtl_Req_Tbl_Type;
1074    l_visit_id                   NUMBER;
1075 
1076    l_msg_data                   VARCHAR2(2000);
1077    l_msg_count                  NUMBER;
1078    l_return_status              VARCHAR2(1);
1079 
1080 BEGIN
1081 
1082   IF (G_DEBUG_STMT >= G_DEBUG_LEVEL) THEN
1083     fnd_log.string (G_DEBUG_STMT , l_debug_module,
1084                     'p_route_id:p_mr_route_id:p_item_instance_id:p_requirement_date:' || p_route_id || ':' || p_mr_route_id || ':' ||p_csi_item_instance_id || ':' || p_due_date);
1085 
1086     -- log into concurrent log file.
1087     fnd_file.put_line(fnd_file.log,l_debug_module || ':p_route_id :p_mr_route_id : p_item_instance_id : p_requirement_date' || p_route_id || ':' || p_mr_route_id || ':' ||p_csi_item_instance_id || ':' || p_due_date);
1088 
1089   END IF;
1090 
1091 
1092 
1093   IF NOT(TRUNC(NVL(p_r_start_date_active,SYSDATE)) <= TRUNC(SYSDATE)
1094      AND TRUNC(NVL(p_r_end_date_active,SYSDATE+1))>TRUNC(SYSDATE)) THEN
1095      -- route is expired so delete forecast
1096      IF (G_DEBUG_STMT >= G_DEBUG_LEVEL) THEN
1097        fnd_log.string (G_DEBUG_STMT ,l_debug_module,
1098                       'p_route_id :p_mr_route_id : ' || p_route_id || ':' || p_mr_route_id);
1099      END IF;
1100 
1101      FOR del_exp_route_rec IN del_exp_route_schedule_mtl_csr(p_unit_effectivity_id,p_mr_route_id) LOOP
1102         AHL_SCHEDULE_MATERIALS_PKG.delete_row(x_scheduled_material_id => del_exp_route_rec.scheduled_material_id);
1103      END LOOP;
1104 
1105   ELSE
1106      -- route is valid and proceed to forecast
1107      IF(TRUNC(p_due_date) < TRUNC(SYSDATE)) THEN
1108         l_requirement_date := SYSDATE;
1109      ELSE
1110         l_requirement_date := p_due_date;
1111      END IF;
1112 
1113 --     IF (NVL(G_previous_route_id,-1) <> p_route_id OR
1114 --        TRUNC(NVL(G_previous_req_date,l_requirement_date - 1)) <> TRUNC(l_requirement_date))THEN
1115 
1116          -- Added by SURRKUMA for Service Bulletin on 17-Jun-11
1117          OPEN get_visit_id_csr(p_unit_effectivity_id);
1118          FETCH get_visit_id_csr INTO l_visit_id;
1119          CLOSE get_visit_id_csr;
1120 
1121          AHL_LTP_MTL_REQ_PVT.Get_Route_Mtl_Req
1122           (
1123            p_api_version           => 1.0,
1124            p_init_msg_list         => FND_API.G_FALSE,
1125            p_validation_level      => FND_API.G_VALID_LEVEL_FULL,
1126            x_return_status         => l_return_status,
1127            x_msg_count             => l_msg_count,
1128            x_msg_data              => l_msg_data,
1129            p_route_id              => p_route_id,
1130            p_mr_route_id           => p_mr_route_id,
1131            p_item_instance_id      => p_csi_item_instance_id,
1132            p_visit_id              => l_visit_id, -- Added by SURRKUMA on 07-Jun-2011 for Service Bulletin
1133            p_requirement_date      => l_requirement_date,
1134            p_request_type          => G_REQ_TYPE_FORECAST,
1135            x_route_mtl_req_tbl     => l_Route_Mtl_Req_Tbl
1136           );
1137 
1138          --G_previous_route_id := p_route_id;
1139          --G_previous_req_date := l_requirement_date;
1140 
1141          IF (l_return_status <> FND_API.G_RET_STS_SUCCESS) THEN
1142             IF (fnd_log.level_error >= G_DEBUG_LEVEL) THEN
1143               fnd_log.string(fnd_log.level_error, l_debug_module,
1144                              'AHL_LTP_MTL_REQ_PVT.Get_Route_Mtl_Req Threw error');
1145             END IF;
1146             RAISE FND_API.G_EXC_ERROR;
1147          END IF;
1148 
1149 --     END IF; -- (NVL(G_previous_route_id,-1)
1150 
1151      IF (l_Route_Mtl_Req_Tbl IS NOT NULL AND l_Route_Mtl_Req_Tbl.COUNT > 0) THEN
1152         IF (G_DEBUG_STMT >= G_DEBUG_LEVEL) THEN
1153           fnd_log.string ( G_DEBUG_STMT,l_debug_module,
1154                'After call AHL_LTP_MTL_REQ_PVT.Get_Route_Mtl_Req API : l_Route_Mtl_Req_Tbl.COUNT : ' ||
1155                 l_Route_Mtl_Req_Tbl.COUNT);
1156         END IF;
1157 
1158         FOR j IN l_Route_Mtl_Req_Tbl.FIRST..l_Route_Mtl_Req_Tbl.LAST LOOP
1159             OPEN schedule_mtl_exists_csr(p_unit_effectivity_id,
1160                                          p_mr_route_id,
1161                                          l_Route_Mtl_Req_Tbl(j).inventory_item_id,
1162                                          l_Route_Mtl_Req_Tbl(j).rt_oper_material_id);
1163             FETCH schedule_mtl_exists_csr INTO l_Schedule_Mtl_Req_rec;
1164             IF(schedule_mtl_exists_csr%NOTFOUND)THEN
1165                 IF (G_DEBUG_STMT >= G_DEBUG_LEVEL)THEN
1166                    fnd_log.string (G_DEBUG_STMT, l_debug_module,
1167 	             'Inserting record in AHL_SCHEDULE_MATERIALS ');
1168                    fnd_log.string (G_DEBUG_STMT,l_debug_module,
1169 	             'unit_effectivity_id :  ' || p_unit_effectivity_id);
1170                    fnd_log.string (G_DEBUG_STMT,l_debug_module,
1171 	             'requested_date :  ' || p_due_date);
1172                    fnd_log.string ( G_DEBUG_STMT,l_debug_module,
1173 	              'mr_route_id : '|| p_mr_route_id);
1174                    fnd_log.string ( G_DEBUG_STMT,l_debug_module,
1175 	              'inventory_item_id :  ' || l_Route_Mtl_Req_Tbl(j).inventory_item_id);
1176                    fnd_log.string ( G_DEBUG_STMT,l_debug_module,
1177 	              'quantity :  ' || l_Route_Mtl_Req_Tbl(j).quantity);
1178                    fnd_log.string ( G_DEBUG_STMT,l_debug_module,
1179 	              'uom :  ' || l_Route_Mtl_Req_Tbl(j).uom_code);
1180                 END IF;
1181                 AHL_SCHEDULE_MATERIALS_PKG.INSERT_ROW
1182                 (
1183                     X_SCHEDULED_MATERIAL_ID  => NULL,
1184                     X_OBJECT_VERSION_NUMBER  => 1,
1185                     X_LAST_UPDATE_DATE       => SYSDATE,
1186                     X_LAST_UPDATED_BY        => fnd_global.user_id,
1187                     X_CREATION_DATE          => SYSDATE,
1188                     X_CREATED_BY             => fnd_global.user_id,
1189                     X_LAST_UPDATE_LOGIN      => fnd_global.user_id,
1190                     X_INVENTORY_ITEM_ID      => l_Route_Mtl_Req_Tbl(j).inventory_item_id,
1191                     X_SCHEDULE_DESIGNATOR    => NULL,
1192                     X_VISIT_ID               => NULL,
1193                     X_VISIT_START_DATE       => NULL,
1194                     X_VISIT_TASK_ID          => NULL,
1195                     X_ORGANIZATION_ID        => NULL,
1196                     X_SCHEDULED_DATE         => NULL,
1197                     X_REQUEST_ID             => NULL,
1198                     -- AnRaj: truncating Requested Date for Material Requirement based on discussions with PM
1199                     X_REQUESTED_DATE         => trunc(p_due_date),
1200                     X_SCHEDULED_QUANTITY     => NULL,
1201                     X_PROCESS_STATUS         => NULL,
1202                     X_ERROR_MESSAGE          => NULL,
1203                     X_TRANSACTION_ID         => NULL,
1204                     X_UOM                    => l_Route_Mtl_Req_Tbl(j).uom_code,
1205                     X_RT_OPER_MATERIAL_ID    => l_Route_Mtl_Req_Tbl(j).rt_oper_material_id,
1206                     X_OPERATION_CODE         => NULL,
1207                     X_OPERATION_SEQUENCE     => NULL,
1208                     X_ITEM_GROUP_ID          => l_Route_Mtl_Req_Tbl(j).item_group_id,
1209                     X_REQUESTED_QUANTITY     => l_Route_Mtl_Req_Tbl(j).quantity,
1210                     X_PROGRAM_ID             => NULL,
1211                     X_PROGRAM_UPDATE_DATE    => NULL,
1212                     X_LAST_UPDATED_DATE      => NULL,
1213                     X_WORKORDER_OPERATION_ID => NULL,
1214                     X_POSITION_PATH_ID       => l_Route_Mtl_Req_Tbl(j).position_path_id,
1215                     X_RELATIONSHIP_ID        => l_Route_Mtl_Req_Tbl(j).relationship_id,
1216                     X_UNIT_EFFECTIVITY_ID    => p_unit_effectivity_id,
1217                     X_MR_ROUTE_ID            => p_mr_route_id,
1218                     X_MATERIAL_REQUEST_TYPE  => G_REQ_TYPE_FORECAST,
1219                     -- Added MC_HEADER_ID and POSITION_KEY by surrkuma on 07-Jun-2011 for Service Bulletin
1220                     X_MC_HEADER_ID           => l_Route_Mtl_Req_Tbl(j).mc_header_id,
1221                     X_POSITION_KEY           => l_Route_Mtl_Req_Tbl(j).position_key,
1222                     X_ATTRIBUTE_CATEGORY     => NULL,
1223                     X_ATTRIBUTE1             => NULL,
1224                     X_ATTRIBUTE2             => NULL,
1225                     X_ATTRIBUTE3             => NULL,
1226                     X_ATTRIBUTE4             => NULL,
1227                     X_ATTRIBUTE5             => NULL,
1228                     X_ATTRIBUTE6             => NULL,
1229                     X_ATTRIBUTE7             => NULL,
1230                     X_ATTRIBUTE8             => NULL,
1231                     X_ATTRIBUTE9             => NULL,
1232                     X_ATTRIBUTE10            => NULL,
1233                     X_ATTRIBUTE11            => NULL,
1234                     X_ATTRIBUTE12            => NULL,
1235                     X_ATTRIBUTE13            => NULL,
1236                     X_ATTRIBUTE14            => NULL,
1237                     X_ATTRIBUTE15            => NULL
1238                 );
1239             ELSE -- schedule_mtl_exists
1240                 IF (G_DEBUG_STMT >= G_DEBUG_LEVEL)THEN
1241                    fnd_log.string ( G_DEBUG_STMT, l_debug_module,
1242                                    'Updating record in AHL_SCHEDULE_MATERIALS ');
1243                    fnd_log.string ( G_DEBUG_STMT, l_debug_module,
1244 	               'unit_effectivity_id :  ' || p_unit_effectivity_id);
1245                    fnd_log.string ( G_DEBUG_STMT, l_debug_module,
1246 	               'requested_date :  ' || p_due_date);
1247                    fnd_log.string ( G_DEBUG_STMT,l_debug_module,
1248 	              'mr_route_id : '|| p_mr_route_id);
1249                    fnd_log.string ( G_DEBUG_STMT,l_debug_module,
1250 	              'inventory_item_id :  ' || l_Route_Mtl_Req_Tbl(j).inventory_item_id);
1251                    fnd_log.string ( G_DEBUG_STMT,l_debug_module,
1252 	              'quantity :  ' || l_Route_Mtl_Req_Tbl(j).quantity);
1253                    fnd_log.string ( G_DEBUG_STMT, l_debug_module,
1254 	              'uom :  ' || l_Route_Mtl_Req_Tbl(j).uom_code);
1255                    fnd_log.string ( G_DEBUG_STMT, l_debug_module,
1256                                     'SCHEDULED_MATERIAL_ID:' || l_Schedule_Mtl_Req_rec.SCHEDULED_MATERIAL_ID);
1257                 END IF;
1258                 AHL_SCHEDULE_MATERIALS_PKG.UPDATE_ROW
1259                 (
1260                     X_SCHEDULED_MATERIAL_ID  => l_Schedule_Mtl_Req_rec.SCHEDULED_MATERIAL_ID,
1261                     X_OBJECT_VERSION_NUMBER  => l_Schedule_Mtl_Req_rec.OBJECT_VERSION_NUMBER,--Update Column
1262                     X_LAST_UPDATE_DATE       => SYSDATE,
1263                     X_LAST_UPDATED_BY        => fnd_global.user_id,
1264                     X_LAST_UPDATE_LOGIN      => fnd_global.user_id,
1265                     X_INVENTORY_ITEM_ID      => l_Schedule_Mtl_Req_rec.INVENTORY_ITEM_ID,
1266                     X_SCHEDULE_DESIGNATOR    => l_Schedule_Mtl_Req_rec.SCHEDULE_DESIGNATOR,
1267                     X_VISIT_ID               => l_Schedule_Mtl_Req_rec.VISIT_ID,
1268                     X_VISIT_START_DATE       => l_Schedule_Mtl_Req_rec.VISIT_START_DATE,
1269                     X_VISIT_TASK_ID          => l_Schedule_Mtl_Req_rec.VISIT_TASK_ID,
1270                     X_ORGANIZATION_ID        => l_Schedule_Mtl_Req_rec.ORGANIZATION_ID,
1271                     X_SCHEDULED_DATE         => l_Schedule_Mtl_Req_rec.SCHEDULED_DATE,
1272                     X_REQUEST_ID             => l_Schedule_Mtl_Req_rec.REQUEST_ID,
1273                     -- AnRaj: truncating Requested Date for Material Requirement based on discussions with PM
1274                     X_REQUESTED_DATE         => trunc(p_due_date),--Update Column
1275                     X_SCHEDULED_QUANTITY     => l_Schedule_Mtl_Req_rec.SCHEDULED_QUANTITY,
1276                     X_PROCESS_STATUS         => l_Schedule_Mtl_Req_rec.PROCESS_STATUS,
1277                     X_ERROR_MESSAGE          => l_Schedule_Mtl_Req_rec.ERROR_MESSAGE,
1278                     X_TRANSACTION_ID         => l_Schedule_Mtl_Req_rec.TRANSACTION_ID,
1279                     X_UOM                    => l_Route_Mtl_Req_Tbl(j).uom_code,--Update Column
1280                     X_RT_OPER_MATERIAL_ID    => l_Route_Mtl_Req_Tbl(j).rt_oper_material_id,--Update Column
1281                     X_OPERATION_CODE         => l_Schedule_Mtl_Req_rec.OPERATION_CODE,
1282                     X_OPERATION_SEQUENCE     => l_Schedule_Mtl_Req_rec.OPERATION_SEQUENCE,
1283                     X_ITEM_GROUP_ID          => l_Route_Mtl_Req_Tbl(j).item_group_id,--Update Column
1284                     X_REQUESTED_QUANTITY     => l_Route_Mtl_Req_Tbl(j).quantity,--Update Column
1285                     X_PROGRAM_ID             => l_Schedule_Mtl_Req_rec.PROGRAM_ID,
1286                     X_PROGRAM_UPDATE_DATE    => l_Schedule_Mtl_Req_rec.PROGRAM_UPDATE_DATE,
1287                     X_LAST_UPDATED_DATE      => l_Schedule_Mtl_Req_rec.LAST_UPDATED_DATE,
1288                     X_WORKORDER_OPERATION_ID => l_Schedule_Mtl_Req_rec.WORKORDER_OPERATION_ID,
1289                     X_POSITION_PATH_ID       => l_Route_Mtl_Req_Tbl(j).position_path_id,--Update Column
1290                     X_RELATIONSHIP_ID        => l_Route_Mtl_Req_Tbl(j).relationship_id,--Update Column
1291                     X_UNIT_EFFECTIVITY_ID    => l_Schedule_Mtl_Req_rec.UNIT_EFFECTIVITY_ID,
1292                     X_MR_ROUTE_ID            => l_Schedule_Mtl_Req_rec.MR_ROUTE_ID,
1293                     X_MATERIAL_REQUEST_TYPE  => l_Schedule_Mtl_Req_rec.MATERIAL_REQUEST_TYPE,
1294                     -- Added MC_HEADER_ID and POSITION_KEY by surrkuma on 07-Jun-2011 for Service Bulletin
1295                     X_MC_HEADER_ID           => l_Route_Mtl_Req_Tbl(j).mc_header_id,
1296                     X_POSITION_KEY           => l_Route_Mtl_Req_Tbl(j).position_key,
1297                     X_ATTRIBUTE_CATEGORY     => l_Schedule_Mtl_Req_rec.ATTRIBUTE_CATEGORY,
1298                     X_ATTRIBUTE1             => l_Schedule_Mtl_Req_rec.ATTRIBUTE1,
1299                     X_ATTRIBUTE2             => l_Schedule_Mtl_Req_rec.ATTRIBUTE2,
1300                     X_ATTRIBUTE3             => l_Schedule_Mtl_Req_rec.ATTRIBUTE3,
1301                     X_ATTRIBUTE4             => l_Schedule_Mtl_Req_rec.ATTRIBUTE4,
1302                     X_ATTRIBUTE5             => l_Schedule_Mtl_Req_rec.ATTRIBUTE5,
1303                     X_ATTRIBUTE6             => l_Schedule_Mtl_Req_rec.ATTRIBUTE6,
1304                     X_ATTRIBUTE7             => l_Schedule_Mtl_Req_rec.ATTRIBUTE7,
1305                     X_ATTRIBUTE8             => l_Schedule_Mtl_Req_rec.ATTRIBUTE8,
1306                     X_ATTRIBUTE9             => l_Schedule_Mtl_Req_rec.ATTRIBUTE9,
1307                     X_ATTRIBUTE10            => l_Schedule_Mtl_Req_rec.ATTRIBUTE10,
1308                     X_ATTRIBUTE11            => l_Schedule_Mtl_Req_rec.ATTRIBUTE11,
1309                     X_ATTRIBUTE12            => l_Schedule_Mtl_Req_rec.ATTRIBUTE12,
1310                     X_ATTRIBUTE13            => l_Schedule_Mtl_Req_rec.ATTRIBUTE13,
1311                     X_ATTRIBUTE14            => l_Schedule_Mtl_Req_rec.ATTRIBUTE14,
1312                     X_ATTRIBUTE15            => l_Schedule_Mtl_Req_rec.ATTRIBUTE15
1313                 );
1314             END IF; -- schedule_mtl_exists_csr%NOTFOUND
1315             CLOSE schedule_mtl_exists_csr;
1316         END LOOP; -- l_Route_Mtl_Req_Tbl(j)
1317      END IF; -- l_Route_Mtl_Req_Tbl.COUNT > 0
1318   END IF; -- NOT(TRUNC(NVL(p_r_start_date_active
1319 END Process_Material_Req;
1320 
1321 ---------------------------------------------------------------------------
1322 -- To log error messages into a log file if called from concurrent process.
1323 
1324 PROCEDURE log_error_messages IS
1325 
1326   l_msg_count      NUMBER;
1327   l_msg_index_out  NUMBER;
1328   l_msg_data       VARCHAR2(2000);
1329 
1330 BEGIN
1331 
1332   IF (G_DEBUG_PROC >= G_DEBUG_LEVEL)THEN
1333       fnd_log.string (G_DEBUG_PROC, 'ahl.plsql.AHL_UMP_FORECAST_REQ_PVT.log_error_messages',
1334                       'Start log error messages');
1335   END IF;
1336 
1337   -- Standard call to get message count.
1338   l_msg_count := FND_MSG_PUB.Count_Msg;
1339 
1340   FOR i IN 1..l_msg_count LOOP
1341     FND_MSG_PUB.get (
1342       p_msg_index      => i,
1343       p_encoded        => FND_API.G_FALSE,
1344       p_data           => l_msg_data,
1345       p_msg_index_out  => l_msg_index_out );
1346 
1347     fnd_file.put_line(FND_FILE.LOG, 'Err message-'||l_msg_index_out||':' || l_msg_data);
1348     IF (G_DEBUG_STMT >= G_DEBUG_LEVEL)THEN
1349       fnd_log.string (G_DEBUG_STMT, 'ahl.plsql.AHL_UMP_FORECAST_REQ_PVT.log_error_messages',
1350                       'Err message-'||l_msg_index_out||':' || substr(l_msg_data,1,240));
1351     END IF;
1352 
1353   END LOOP;
1354 
1355   IF (G_DEBUG_PROC >= G_DEBUG_LEVEL)THEN
1356       fnd_log.string (G_DEBUG_PROC, 'ahl.plsql.AHL_UMP_FORECAST_REQ_PVT.log_error_messages',
1357                       'End log error messages');
1358   END IF;
1359 
1360 END log_error_messages;
1361 
1362 END AHL_UMP_FORECAST_REQ_PVT;