DBA Data[Home] [Help]

PACKAGE BODY: APPS.EGO_ITEM_LC_IMP_PC_PUB

Source


1 PACKAGE BODY EGO_ITEM_LC_IMP_PC_PUB AS
2 /* $Header: EGOCIPSB.pls 120.6.12020000.2 2012/07/13 01:27:02 mshirkol ship $ */
3 
4 G_SUCCESS            CONSTANT  NUMBER  :=  0;
5 G_WARNING            CONSTANT  NUMBER  :=  1;
6 G_ERROR              CONSTANT  NUMBER  :=  2;
7 
8 G_PKG_NAME           CONSTANT  VARCHAR2(30)  := 'EGO_ITEM_LC_IMP_PC_PUB';
9 G_APP_NAME           CONSTANT  VARCHAR2(3)   := 'EGO';
10 G_PKG_NAME_TOKEN     CONSTANT  VARCHAR2(8)   := 'PKG_NAME';
11 G_API_NAME_TOKEN     CONSTANT  VARCHAR2(8)   := 'API_NAME';
12 G_SQL_ERR_MSG_TOKEN  CONSTANT  VARCHAR2(11)  := 'SQL_ERR_MSG';
13 G_PLSQL_ERR          CONSTANT  VARCHAR2(17)  := 'EGO_PLSQL_ERR';
14 
15 G_EGO_ITEM           CONSTANT  VARCHAR2(20) := 'EGO_ITEM';
16 G_CURRENT_USER_ID    NUMBER                := FND_GLOBAL.User_Id;
17 G_CURRENT_LOGIN_ID   NUMBER                := FND_GLOBAL.Login_Id;
18 
19 
20 ----------------------------------------------------------------------
21 -- Private Procedures / Functions
22 ----------------------------------------------------------------------
23 
24 -- Developer debugging
25 PROCEDURE code_debug (p_msg  IN  VARCHAR2) IS
26 BEGIN
27   --sri_debug (' EGOCIPSB - EGO_ITEM_LC_IMP_PC_PUB.'||p_msg);
28   RETURN;
29 EXCEPTION
30   WHEN OTHERS THEN
31   NULL;
32 END;
33 
34 
35 /***
36 -------------------------------------------------------
37 -- fix as a part of bug 3696801
38 -- this is no more used.  replaced by
39 -- EGO_INV_ITEM_CATALOG_PVT.check_pending_change_orders
40 -------------------------------------------------------
41 PROCEDURE Check_Pending_Change_Orders
42 (
43    p_inventory_item_id   IN  NUMBER
44   ,p_organization_id     IN  NUMBER
45   ,p_revision_id         IN  NUMBER
46   ,x_return_status       OUT  NOCOPY VARCHAR2
47   ,x_msg_data            OUT  NOCOPY VARCHAR2
48 )
49 IS
50 
51   CURSOR c_pending_changes (cp_item_id  IN NUMBER
52                            ,cp_org_id   IN NUMBER
53                            ,cp_rev_id   IN NUMBER
54                            )  IS
55   SELECT change.organization_id
56   FROM  eng_revised_items change
57   WHERE change.revised_item_id = cp_item_id
58     AND change.organization_id = cp_org_id
59     AND nvl(change.current_item_revision_id, -1) = nvl(cp_rev_id, nvl(change.current_item_revision_id,-1))
60     AND change.status_type NOT IN (5, -- CANCELLED
61                                    6  -- IMPLEMENTED
62                                   )
63     AND
64       ( EXISTS
65         (SELECT 'X'
66         FROM  ego_mfg_part_num_chgs
67         WHERE change_line_id = change.revised_item_sequence_id )
68       OR EXISTS
69         (SELECT 'X'
70         FROM  ego_items_attrs_changes_vl
71         WHERE change_line_id = change.revised_item_sequence_id )
72       OR EXISTS
73         (SELECT 'X'
74         FROM  eng_attachment_changes
75         WHERE revised_item_sequence_id = change.revised_item_sequence_id )
76       );
77 
78   CURSOR c_pending_org_changes (cp_item_id  IN NUMBER
79                                ,cp_org_id   IN NUMBER
80                                ,cp_rev_id   IN NUMBER
81                                )  IS
82   SELECT organization_id
83   FROM  eng_revised_items change
84   WHERE revised_item_id = cp_item_id
85     AND organization_id IN
86              (SELECT P2.ORGANIZATION_ID
87               FROM   MTL_PARAMETERS P1,
88                      MTL_PARAMETERS P2
89               WHERE  P1.ORGANIZATION_ID = cp_org_id
90               AND    P1.MASTER_ORGANIZATION_ID = P2.MASTER_ORGANIZATION_ID
91               )
92     AND nvl(current_item_revision_id, -1) = nvl(cp_rev_id, nvl(current_item_revision_id,-1))
93     AND status_type NOT IN (5, -- CANCELLED
94                             6  -- IMPLEMENTED
95                            )
96     AND
97       ( EXISTS
98         (SELECT 'X'
99         FROM  ego_mfg_part_num_chgs
100         WHERE change_line_id = change.revised_item_sequence_id )
101       OR EXISTS
102         (SELECT 'X'
103         FROM  ego_items_attrs_changes_vl
104         WHERE change_line_id = change.revised_item_sequence_id )
105       OR EXISTS
106         (SELECT 'X'
107         FROM  eng_attachment_changes
108         WHERE revised_item_sequence_id = change.revised_item_sequence_id )
109       );
110 
111   l_organization_id              MTL_SYSTEM_ITEMS_B.ORGANIZATION_ID%TYPE;
112   l_item_number                  VARCHAR2(999);
113   l_org_name                     VARCHAR2(999);
114   l_is_master_org                VARCHAR2(100);
115   l_status_master_controlled     VARCHAR2(100);
116   l_pending_change_found         VARCHAR2(100);
117 
118 BEGIN
119   code_debug(' Check_Pending_Change_Orders  Started ');
120   code_debug(' item id '||p_inventory_item_id||' org id '||p_organization_id||' revision id '||p_revision_id);
121   IF (p_inventory_item_id IS NULL
122       OR
123       p_organization_id is NULL) THEN
124     code_debug(' invalid params ');
125     x_return_status := FND_API.G_RET_STS_SUCCESS;
126     RETURN;
127   END IF;
128   l_pending_change_found := FND_API.G_FALSE;
129   l_is_master_org  := get_master_org_status(p_organization_id => p_organization_id);
130   l_status_master_controlled  := get_master_controlled_status();
131   IF p_revision_id IS NULL THEN
132     IF (FND_API.TO_BOOLEAN(l_status_master_controlled)) THEN
133       IF (FND_API.TO_BOOLEAN(l_is_master_org)) THEN
134         OPEN c_pending_changes(cp_item_id => p_inventory_item_id
135                               ,cp_org_id  => p_organization_id
136                               ,cp_rev_id  => p_revision_id
137                               );
138         FETCH c_pending_changes INTO l_organization_id;
139         IF c_pending_changes%FOUND THEN
140           l_pending_change_found := FND_API.G_TRUE;
141         END IF;
142         CLOSE c_pending_changes;
143       ELSE
144         --
145         -- check if there are any changes in org hierarchy
146         --
147         OPEN c_pending_org_changes(cp_item_id => p_inventory_item_id
148                                   ,cp_org_id  => p_organization_id
149                                   ,cp_rev_id  => p_revision_id
150                                   );
151         FETCH c_pending_org_changes INTO l_organization_id;
152         IF c_pending_org_changes%FOUND THEN
153           l_pending_change_found := FND_API.G_TRUE;
154         END IF;
155         CLOSE c_pending_org_changes;
156       END IF; -- in master org
157     ELSE
158       -- status is not master controlled
159         OPEN c_pending_changes(cp_item_id => p_inventory_item_id
160                               ,cp_org_id  => p_organization_id
161                               ,cp_rev_id  => p_revision_id
162                               );
163         FETCH c_pending_changes INTO l_organization_id;
164         IF c_pending_changes%FOUND THEN
165           l_pending_change_found := FND_API.G_TRUE;
166         END IF;
167         CLOSE c_pending_changes;
168     END IF; -- status is master controlled
169   ELSE
170     --
171     -- revision is present
172     -- revision is never master controlled, only org control
173     --
174     OPEN c_pending_changes(cp_item_id => p_inventory_item_id
175                           ,cp_org_id  => p_organization_id
176                           ,cp_rev_id  => p_revision_id
177                           );
178     FETCH c_pending_changes INTO l_organization_id;
179     IF c_pending_changes%FOUND THEN
180       l_pending_change_found := FND_API.G_TRUE;
181     END IF;
182     CLOSE c_pending_changes;
183   END IF; -- p_revision_id IS NULL
184 
185   IF (FND_API.TO_BOOLEAN(l_pending_change_found)) THEN
186     code_debug(' pending changes exist ');
187     x_return_status := FND_API.G_RET_STS_ERROR;
188     --
189     -- get item name
190     --
191     SELECT concatenated_segments
192     INTO l_item_number
193     FROM mtl_system_items_kfv
194     WHERE inventory_item_id = p_inventory_item_id
195       AND organization_id = l_organization_id;
196     --
197     -- get organiation name
198     --
199     SELECT organization_name
200     INTO  l_org_name
201     FROM  org_organization_definitions
202     WHERE organization_id = l_organization_id;
203     fnd_message.set_name('EGO', 'EGO_ITEM_PENDING_CHANGES_EXIST');
204     fnd_message.set_token('ITEM_NUMBER', l_item_number);
205     fnd_message.set_token('ORG_NAME', l_org_name);
206     x_msg_data := fnd_message.get();
207     code_debug(' error msg '|| x_msg_data);
208   ELSE
209     code_debug(' no pending changes ');
210     x_return_status := FND_API.G_RET_STS_SUCCESS;
211   END IF;
212 
213 EXCEPTION
214   WHEN OTHERS THEN
215     code_debug(' EXCEPTION in Check_Pending_Change_Orders ');
216     x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
217     IF c_pending_changes%ISOPEN THEN
218       CLOSE c_pending_changes;
219     END IF;
220     IF c_pending_org_changes%ISOPEN THEN
221       CLOSE c_pending_org_changes;
222     END IF;
223 END Check_Pending_Change_Orders;
224 ***/
225 
226 --
227 -- function to determine what action is being done
228 -- during phase / status change. returned values are
229 -- 'EGO_PRO_ITEM_LIFE_CYCLE' if user is trying to promote
230 -- 'EGO_DEM_ITEM_LIFE_CYCLE' if user is trying to demote
231 -- 'EGO_EDIT_ITEM_STATUS' if user is trying to change status
232 -- these are the data security function names.
233 --
234   FUNCTION get_privlige_name_for_action
235      (p_curr_item_id     IN  NUMBER
236      ,p_curr_org_id      IN  NUMBER
237      ,p_curr_rev_id      IN  NUMBER
238      ,p_curr_lc_id       IN  NUMBER
239      ,p_curr_phase_id    IN  NUMBER
240      ,p_curr_status_code IN  VARCHAR2
241      ,p_new_lc_id        IN  NUMBER
242      ,p_new_phase_id     IN  NUMBER
243      ,p_new_status_code  IN  VARCHAR2
244      ) RETURN VARCHAR2 IS
245     l_curr_lc_id         mtl_system_items_b.lifecycle_id%TYPE;
246     l_curr_phase_id      mtl_system_items_b.current_phase_id%TYPE;
247     l_curr_status_code   mtl_system_items_b.inventory_item_status_code%TYPE;
248     l_curr_phase_seq     NUMBER;
249     l_new_lc_id          mtl_system_items_b.lifecycle_id%TYPE;
250     l_new_phase_id       mtl_system_items_b.current_phase_id%TYPE;
251     l_new_status_code    mtl_system_items_b.inventory_item_status_code%TYPE;
252     l_new_phase_seq      NUMBER;
253 
254     -- data securiry functions supported
255     l_fn_name_promote         VARCHAR2(50);
256     l_fn_name_demote          VARCHAR2(50);
257     l_fn_name_change_status   VARCHAR2(50);
258 
259 
260   CURSOR c_get_item_det (cp_inventory_item_id  IN  NUMBER
261                         ,cp_organization_id    IN  NUMBER) IS
262     SELECT lifecycle_id, current_phase_id, inventory_item_status_code
263     FROM   mtl_system_items_b
264     WHERE  inventory_item_id = cp_inventory_item_id
265       AND  organization_id = cp_organization_id;
266 
267   CURSOR c_get_item_rev_det (cp_inventory_item_id  IN  NUMBER
268                             ,cp_organization_id    IN  NUMBER
269                             ,cp_revision_id        IN  NUMBER) IS
270     SELECT rev.lifecycle_id, rev.current_phase_id, itm.inventory_item_status_code
271     FROM  mtl_system_items_b itm, mtl_item_revisions_b rev
272     WHERE itm.inventory_item_id = cp_inventory_item_id
273       AND itm.organization_id = cp_organization_id
274       AND rev.inventory_item_id = itm.inventory_item_id
275       AND rev.organization_id = rev.organization_id
276       AND rev.revision_id = rev.revision_id;
277 
278   CURSOR c_get_phase_seq (cp_phase_id IN  NUMBER ) IS
279     SELECT display_sequence
280     FROM   pa_proj_element_versions
281     WHERE  proj_element_id = cp_phase_id;
282 
283   BEGIN
284     code_debug (' Get_privilege_name_for_action started');
285     l_fn_name_promote         := 'EGO_PRO_ITEM_LIFE_CYCLE';
286     l_fn_name_demote          := 'EGO_DEM_ITEM_LIFE_CYCLE';
287     l_fn_name_change_status   := 'EGO_EDIT_ITEM_STATUS';
288     IF p_curr_status_code IS NULL THEN
289       IF (p_curr_rev_id IS NOT NULL) THEN
290         --
291         -- context of item revision
292         --
293         OPEN c_get_item_rev_det (cp_inventory_item_id => p_curr_item_id
294                                 ,cp_organization_id   => p_curr_org_id
295                                 ,cp_revision_id       => p_curr_rev_id
296                                 );
297         FETCH c_get_item_rev_det
298         INTO l_curr_lc_id, l_curr_phase_id, l_curr_status_code;
299         CLOSE c_get_item_rev_det;
300       ELSE
301         --
302         -- context of item
303         --
304         OPEN c_get_item_det (cp_inventory_item_id => p_curr_item_id
305                             ,cp_organization_id   => p_curr_org_id
306                             );
307         FETCH c_get_item_det
308         INTO l_curr_lc_id, l_curr_phase_id, l_curr_status_code;
309         CLOSE c_get_item_det;
310       END IF;
311     ELSE
312       l_curr_lc_id       := p_curr_lc_id;
313       l_curr_phase_id    := p_curr_phase_id;
314       l_curr_status_code := p_curr_status_code;
315     END IF;
316     code_debug (' curr details  lc '||l_curr_lc_id||' phase '||l_curr_phase_id||' status '||l_curr_status_code);
317     code_debug ('  new details  lc '||p_new_lc_id||' phase '||p_new_phase_id||' status '||p_new_status_code);
318     IF ( (p_new_lc_id IS NULL OR p_new_lc_id = l_curr_lc_id)
319           AND
320          (p_new_phase_id IS NULL OR p_new_phase_id = l_curr_phase_id)
321           AND
322          (l_curr_status_code <> NVL(p_new_status_code,l_curr_status_code))
323        ) THEN
324       -- user is trying to change status
325       RETURN l_fn_name_change_status;
326     ELSE
327       OPEN c_get_phase_seq(cp_phase_id => l_curr_phase_id);
328       FETCH c_get_phase_seq INTO l_curr_phase_seq;
329       IF c_get_phase_seq%NOTFOUND THEN
330         l_curr_phase_seq := -1;
331       END IF;
332       CLOSE c_get_phase_seq;
333       OPEN c_get_phase_seq(cp_phase_id => p_new_phase_id);
334       FETCH c_get_phase_seq INTO l_new_phase_seq;
335       IF c_get_phase_seq%NOTFOUND THEN
336         l_new_phase_seq := -1;
337       END IF;
338       CLOSE c_get_phase_seq;
339       IF l_curr_phase_seq < l_new_phase_seq THEN
340         RETURN l_fn_name_promote;
341       ELSIF l_curr_phase_seq > l_new_phase_seq THEN
342         RETURN l_fn_name_demote;
343       ELSE
344         RETURN l_fn_name_change_status;
345       END IF;
346     END IF;
347     RETURN NULL;
348   END  get_privlige_name_for_action;
349 
350 --
351 -- procedure to implement all pending changes
352 --
353   PROCEDURE Implement_All_Pending_Changes
354   (
355      p_api_version                 IN   NUMBER
356    , p_commit                      IN   VARCHAR2
357    , p_inventory_item_id           IN   NUMBER
358    , p_organization_id             IN   NUMBER
359    , p_revision_id                 IN   NUMBER
360    , p_change_id                   IN   NUMBER
361    , p_change_line_id              IN   NUMBER
362    , p_revision_master_controlled  IN   VARCHAR2
363    , p_status_master_controlled    IN   VARCHAR2
364    , p_perform_security_check      IN   VARCHAR2
365    , p_is_master_org               IN   VARCHAR2
366    , x_return_status               OUT  NOCOPY VARCHAR2
367    , x_errorcode                   OUT  NOCOPY NUMBER
368    , x_msg_count                   OUT  NOCOPY NUMBER
369    , x_msg_data                    OUT  NOCOPY VARCHAR2
370 ) IS
371 
372   CURSOR l_pending_revision_statuses  IS
373   SELECT
374     inventory_item_id
375    ,revision_id
376    ,organization_id
377    ,phase_id
378    ,lifecycle_id
379    ,status_code
380    ,effective_date
381   FROM
382     MTL_PENDING_ITEM_STATUS
383   WHERE inventory_item_id = p_inventory_item_id
384     AND organization_id = p_organization_id
385     AND revision_id = p_revision_id
386     AND pending_flag = 'Y'
387     AND implemented_date IS NULL
388     AND effective_date <= SYSDATE
389     AND NVL(change_id,-1) = NVL(p_change_id, NVL(change_id,-1))
390     AND NVL(change_line_id,-1) = NVL(p_change_line_id, NVL(change_line_id,-1))
391   ORDER BY effective_date ASC
392   FOR UPDATE OF IMPLEMENTED_DATE, PENDING_FLAG;
393 
394   CURSOR l_phase_ids IS
395     SELECT lifecycle_id, phase_id, status_code
396     FROM MTL_PENDING_ITEM_STATUS
397     WHERE INVENTORY_ITEM_ID = p_inventory_item_id
398       AND ORGANIZATION_ID = p_organization_id
399       AND REVISION_ID IS NULL
400       AND PENDING_FLAG = 'Y'
401       AND IMPLEMENTED_DATE IS NULL
402       AND STATUS_CODE IS NOT NULL
403       AND EFFECTIVE_DATE <= SYSDATE
404       AND NVL(change_id,-1) = NVL(p_change_id, NVL(change_id,-1))
405       AND NVL(change_line_id,-1) = NVL(p_change_line_id, NVL(change_line_id,-1))
406       ORDER BY EFFECTIVE_DATE, LAST_UPDATE_DATE, ROWID;
407 
408   CURSOR c_item_pending_phase_change IS
409     SELECT pending_status.phase_id
410     FROM MTL_PENDING_ITEM_STATUS pending_status, mtl_system_items_b item
411     WHERE pending_status.INVENTORY_ITEM_ID = p_inventory_item_id
412       AND pending_status.ORGANIZATION_ID = p_organization_id
413       AND pending_status.PENDING_FLAG = 'Y'
414       AND pending_status.IMPLEMENTED_DATE IS NULL
415       AND pending_status.EFFECTIVE_DATE <= SYSDATE
416       AND pending_status.inventory_item_id = item.inventory_item_id
417       AND pending_status.organization_id = item.organization_id
418       AND ( NVL(pending_status.lifecycle_id,NVL(item.lifecycle_id,-1)) <> NVL(item.lifecycle_id,-1)
419             OR
420             NVL(pending_status.phase_id,NVL(item.current_phase_id,-1)) <> NVL(item.current_phase_id,-1)
421            );
422 
423   -- bug 3833932
424   CURSOR c_rev_pending_phase_change IS
425     SELECT pending_status.phase_id
426     FROM MTL_PENDING_ITEM_STATUS pending_status, mtl_item_revisions_b rev
427     WHERE pending_status.INVENTORY_ITEM_ID = p_inventory_item_id
428       AND pending_status.ORGANIZATION_ID = p_organization_id
429       AND pending_status.PENDING_FLAG = 'Y'
430       AND pending_status.IMPLEMENTED_DATE IS NULL
431       AND pending_status.EFFECTIVE_DATE <= SYSDATE
432       AND pending_status.inventory_item_id = rev.inventory_item_id
433       AND pending_status.organization_id = rev.organization_id
434       AND pending_status.revision_id = rev.revision_id
435       AND ( NVL(pending_status.lifecycle_id,NVL(rev.lifecycle_id,-1)) <> NVL(rev.lifecycle_id,-1)
436             OR
437             NVL(pending_status.phase_id,NVL(rev.current_phase_id,-1)) <> NVL(rev.current_phase_id,-1)
438            );
439 
440   --Start: 4105841 Business Event Enhancement
441 
442   Cursor c_get_item_details(p_inventory_item_id NUMBER,
443                             p_organization_id   NUMBER) IS
444     SELECT   MSI.organization_id,
445              MSI.description,
446              MSI.concatenated_segments,
447              MP.ORGANIZATION_CODE
448      FROM MTL_SYSTEM_ITEMS_KFV MSI,
449           MTL_PARAMETERS    MP
450      WHERE
451           MSI.INVENTORY_ITEM_ID   = p_inventory_item_id
452           AND MSI.ORGANIZATION_ID = p_organization_id
453           AND MSI.Organization_ID = MP.Organization_ID;
454 
455   l_event_return_status   VARCHAR2(1);
456   l_phase_update          VARCHAR2(1);
457   l_msg_data              VARCHAR2(2000);
458   l_old_status            MTL_SYSTEM_ITEMS_B.INVENTORY_ITEM_STATUS_CODE%TYPE;
459   l_new_status            MTL_SYSTEM_ITEMS_B.INVENTORY_ITEM_STATUS_CODE%TYPE;
460   --End 4105841
461 
462   l_api_version           NUMBER;
463   l_api_name              VARCHAR2(30);
464   l_current_phase_id      MTL_SYSTEM_ITEMS_B.CURRENT_PHASE_ID%TYPE;
465   l_current_revision      MTL_ITEM_REVISIONS_B.REVISION%TYPE;
466   l_perform_policy_check  BOOLEAN;
467   l_priv_name_to_check    VARCHAR2(100);
468 
469 
470 
471 BEGIN
472   l_api_version          := 1.0;
473   l_api_name             := 'Implement_All_Pending_Changes';
474   l_perform_policy_check := FALSE;
475   l_phase_update         := NULL;
476   code_debug(' Implement All Pending Changes called with params ');
477   code_debug('  p_api_version : '||p_api_version||' p_commit : '|| p_commit);
478   code_debug('  p_inventory_item_id :'||p_inventory_item_id||' p_organization_id : '||p_organization_id);
479   code_debug('  p_revision_id : '||p_revision_id||' p_revision_master_controlled: '||p_revision_master_controlled);
480   code_debug('  p_status_master_controlled : '||p_status_master_controlled||' p_is_master_org: '||p_is_master_org);
481 
482 
483   -- Bug 13495593
484   --IF FND_API.To_Boolean(p_commit) THEN
485     SAVEPOINT Implement_All_Pending_Changes;
486   --END IF;
487 
488   --Standard checks
489   IF NOT FND_API.Compatible_API_Call (l_api_version
490                                      ,p_api_version
491                                      ,l_api_name
492                                      ,g_pkg_name)
493   THEN
494     RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
495   END IF;
496 
497   IF Nvl(FND_GLOBAL.User_Id,-1) <> Nvl(G_CURRENT_USER_ID,-1)
498   THEN
499       G_CURRENT_USER_ID  := FND_GLOBAL.User_Id;
500       G_CURRENT_LOGIN_ID := FND_GLOBAL.Login_Id;
501   END IF;
502 
503 --
504 -- replaced call to  EGO_INV_ITEM_CATALOG_PVT.Check_pending_Change_Orders
505 -- as a part of bug 3696801
506 --  Check_Pending_Change_Orders (p_inventory_item_id => p_inventory_item_id
507 --                              ,p_organization_id   => p_organization_id
508 --                              ,p_revision_id       => p_revision_id
509 --                              ,x_return_status     => x_return_status
510 --                              ,x_msg_data          => x_msg_data
511 --                              );
512   -- bug 3833932 doing pending phase change only on the corresponding item/rev
513   IF p_revision_id IS NULL THEN
514     OPEN c_item_pending_phase_change;
515     FETCH c_item_pending_phase_change INTO l_current_Phase_id;
516     IF c_item_pending_phase_change%FOUND THEN
517       l_perform_policy_check := TRUE;
518     END IF;
519     CLOSE c_item_pending_phase_change;
520   ELSE
521     OPEN c_rev_pending_phase_change;
522     FETCH c_rev_pending_phase_change INTO l_current_Phase_id;
523     IF c_rev_pending_phase_change%FOUND THEN
524       l_perform_policy_check := TRUE;
525     END IF;
526     CLOSE c_rev_pending_phase_change;
527   END IF;
528 
529   IF l_perform_policy_check THEN
530     code_debug (' performing policy check ');
531     EGO_INV_ITEM_CATALOG_PVT.Check_pending_Change_Orders (
532          p_inventory_item_id        => p_inventory_item_id
533         ,p_organization_id          => p_organization_id
534         ,p_revision_id              => p_revision_id
535         ,p_lifecycle_changed        => FND_API.G_FALSE
536         ,p_lifecycle_phase_changed  => FND_API.G_TRUE
537         ,p_change_id                => p_change_id
538         ,p_change_line_id           => p_change_line_id
539         ,x_return_status            => x_return_status
540         ,x_msg_count                => x_msg_count
541         ,x_msg_data                 => x_msg_data
542         );
543     IF (x_return_status <> FND_API.G_RET_STS_SUCCESS) THEN
544       code_debug (' pending co exist  '|| x_msg_data);
545       IF FND_API.To_Boolean(p_commit) THEN
546         ROLLBACK TO Implement_All_Pending_Changes;
547       END IF;
548       RETURN;
549     END IF;
550   END IF;
551 
552   code_debug (' no pending change orders exist ');
553 
554   IF FND_API.TO_BOOLEAN(p_is_master_org) THEN
555     code_debug (' in context of master org ');
556   ELSE
557     code_debug (' in context of child org ');
558   END IF;
559 
560   IF FND_API.TO_BOOLEAN(p_status_master_controlled) THEN
561     code_debug (' status is master controlled ');
562   ELSE
563     code_debug (' status is controlled at org level ');
564   END IF;
565 
566   --
567   -- to be removed after bug 3874132 is resoloved.
568   --
569   IF x_return_status <> FND_API.G_RET_STS_SUCCESS THEN
570         IF FND_API.To_Boolean( p_commit ) THEN
571                 ROLLBACK TO Implement_All_Pending_Changes;
572         END IF;
573         RETURN;
574   END IF;
575 
576   IF (p_revision_id IS NULL) THEN
577 
578     code_debug (' processing changes for item ');
579         code_debug ('p_revision_id is null ');
580 
581     --
582     -- If it's at the master and status is master controlled,
583     -- then do it for all assigned orgs
584     --
585     IF (FND_API.TO_BOOLEAN(p_is_master_org)
586         OR
587         FND_API.TO_BOOLEAN(p_status_master_controlled) = FALSE
588        ) THEN
589       IF (FND_API.TO_BOOLEAN(p_is_master_org)
590           AND
591           FND_API.TO_BOOLEAN(p_status_master_controlled) = TRUE
592          ) THEN
593         -- Get the most recent phase id
594         code_debug(' before the loop' );
595 
596         FOR l_phase_id IN l_phase_ids LOOP
597           IF FND_API.To_boolean(p_perform_security_check) THEN
598             -- 4052565 perform security check
599             l_priv_name_to_check := get_privlige_name_for_action
600                               (p_curr_item_id     => p_inventory_item_id
601                               ,p_curr_org_id      => p_organization_id
602                               ,p_curr_rev_id      => p_revision_id
603                               ,p_curr_lc_id       => NULL
604                               ,p_curr_phase_id    => NULL
605                               ,p_curr_status_code => NULL
606                               ,p_new_lc_id        => l_phase_id.lifecycle_id
607                               ,p_new_phase_id     => l_phase_id.phase_id
608                               ,p_new_status_code  => l_phase_id.status_code
609                               );
610             IF l_priv_name_to_check IS NOT NULL THEN
611               IF NOT EGO_ITEM_PVT.has_role_on_item
612                                (p_function_name      => l_priv_name_to_check
613                                ,p_inventory_item_id  => p_inventory_item_id
614                                ,p_item_number        => NULL
615                                ,p_organization_id    => p_organization_id
616                                ,p_organization_name  => NULL
617                                ,p_user_id            => G_CURRENT_USER_ID
618                                ,p_party_id           => NULL
619                                ,p_set_message        => FND_API.G_TRUE
620                                ) THEN
621                 RAISE FND_API.G_EXC_ERROR;
622               END IF;
623             END IF;
624           END IF;
625 
626           code_debug(' before check_floating_attachments 1');
627           EGO_DOM_UTIL_PUB.check_floating_attachments (  p_inventory_item_id  => p_inventory_item_id
628                                                          ,p_revision_id        => p_revision_id
629                                                          ,p_organization_id    => p_organization_id
630                                                          ,p_lifecycle_id       => NULL
631                                                          ,p_new_phase_id       => l_phase_id.phase_id
632                                                          ,x_return_status      => x_return_status
633                                                          ,x_msg_count          => x_msg_count
634                                                          ,x_msg_data           => x_msg_data );
635 
636           code_debug(' after check_floating_attachments 1 ' || x_return_status);
637           IF x_return_status <> FND_API.G_RET_STS_SUCCESS THEN
638                 IF FND_API.To_Boolean( p_commit ) THEN
639                         ROLLBACK TO Implement_All_Pending_Changes;
640                 END IF;
641                 RETURN;
642           END IF;
643           UPDATE MTL_SYSTEM_ITEMS_B
644           SET CURRENT_PHASE_ID = NVL(l_phase_id.PHASE_ID,current_phase_id)
645           WHERE
646             INVENTORY_ITEM_ID = p_inventory_item_id
647             AND ORGANIZATION_ID IN
648                  (SELECT P2.ORGANIZATION_ID
649                   FROM   MTL_PARAMETERS P1, MTL_PARAMETERS P2
650                   WHERE  P1.ORGANIZATION_ID = p_organization_id
651                   AND    P1.MASTER_ORGANIZATION_ID = P2.MASTER_ORGANIZATION_ID);
652           l_phase_update := 'Y';
653         END LOOP;
654           code_debug(' out side the loop ');
655       --
656       -- Otherwise, either we are not at master or not master controlled.
657       -- So if not master controlled, do it for the current org
658       --
659       ELSIF (FND_API.TO_BOOLEAN(p_status_master_controlled) = FALSE) THEN
660         --
661         -- Get the most recent phase id
662         --
663         FOR l_phase_id IN l_phase_ids LOOP
664 
665           IF FND_API.To_boolean(p_perform_security_check) THEN
666             -- 4052565 perform security check
667             l_priv_name_to_check := get_privlige_name_for_action
668                               (p_curr_item_id     => p_inventory_item_id
669                               ,p_curr_org_id      => p_organization_id
670                               ,p_curr_rev_id      => p_revision_id
671                               ,p_curr_lc_id       => NULL
672                               ,p_curr_phase_id    => NULL
673                               ,p_curr_status_code => NULL
674                               ,p_new_lc_id        => l_phase_id.lifecycle_id
675                               ,p_new_phase_id     => l_phase_id.phase_id
676                               ,p_new_status_code  => l_phase_id.status_code
677                               );
678             IF l_priv_name_to_check IS NOT NULL THEN
679               IF NOT EGO_ITEM_PVT.has_role_on_item
680                                (p_function_name      => l_priv_name_to_check
681                                ,p_inventory_item_id  => p_inventory_item_id
682                                ,p_item_number        => NULL
683                                ,p_organization_id    => p_organization_id
684                                ,p_organization_name  => NULL
685                                ,p_user_id            => G_CURRENT_USER_ID
686                                ,p_party_id           => NULL
687                                ,p_set_message        => FND_API.G_TRUE
688                                ) THEN
689                 RAISE FND_API.G_EXC_ERROR;
690               END IF;
691             END IF;
692           END IF;
693 
694           code_debug(' before check_floating_attachments 2');
695           EGO_DOM_UTIL_PUB.check_floating_attachments (  p_inventory_item_id  => p_inventory_item_id
696                                                          ,p_revision_id        => p_revision_id
697                                                          ,p_organization_id    => p_organization_id
698                                                          ,p_lifecycle_id       => NULL
699                                                          ,p_new_phase_id       => l_phase_id.phase_id
700                                                          ,x_return_status      => x_return_status
701                                                          ,x_msg_count          => x_msg_count
702                                                          ,x_msg_data           => x_msg_data );
703 
704           code_debug(' after check_floating_attachments 2 ' || x_return_status);
705           IF x_return_status <> FND_API.G_RET_STS_SUCCESS THEN
706                 IF FND_API.To_Boolean( p_commit ) THEN
707                         ROLLBACK TO Implement_All_Pending_Changes;
708                 END IF;
709                 RETURN;
710           END IF;
711 
712           UPDATE MTL_SYSTEM_ITEMS_B
713           SET CURRENT_PHASE_ID = NVL(l_phase_id.PHASE_ID, current_phase_id)
714           WHERE INVENTORY_ITEM_ID = p_inventory_item_id
715           AND ORGANIZATION_ID = p_organization_id;
716           l_phase_update := 'Y';
717         END LOOP;
718       END IF;
719       --
720       -- Now call another api to update statuses,
721       -- but only if we are at the master org or status is org controlled
722       --
723       ---Start 4105841 Business events
724       SELECT inventory_item_status_code INTO l_old_status
725       FROM  mtl_system_items_b msi
726       WHERE msi.inventory_item_id = p_inventory_item_id
727       AND msi.organization_id = p_organization_id
728       AND    rownum < 2;
729       ---End 4105841
730 
731       INV_ITEM_STATUS_PUB.Update_Pending_Status (1.0
732                                                 ,p_organization_id
733                                                 ,p_inventory_item_id
734                                                 ,NULL
735                                                 ,NULL
736                                                 ,x_return_status
737                                                 ,x_msg_count
738                                                 ,x_msg_data
739                                                 );
740       --Added for bug 5230594
741       IF x_return_status <> FND_API.G_RET_STS_SUCCESS THEN
742          ROLLBACK TO Implement_All_Pending_Changes;
743          RETURN;
744       END IF;
745 
746 
747       ---Start 4105841 Business events
748       SELECT inventory_item_status_code INTO l_new_status
749       FROM  mtl_system_items_b msi
750       WHERE msi.inventory_item_id = p_inventory_item_id
751       AND msi.organization_id = p_organization_id
752       AND    rownum < 2;
753 
754       IF l_phase_update = 'Y' OR
755          NVL(l_old_status,-1) <> NVL(l_new_status,-1) THEN
756           FOR Item_Rec IN c_get_item_details(p_inventory_item_id
757 	                                    ,p_organization_id) LOOP
758              EGO_WF_WRAPPER_PVT.Raise_Item_Create_Update_Event(
759                   p_event_name        => EGO_WF_WRAPPER_PVT.G_ITEM_UPDATE_EVENT
760                  ,p_organization_id   => p_organization_id
761                  ,p_organization_code => Item_Rec.organization_code
762                  ,p_item_number       => Item_Rec.concatenated_segments
763                  ,p_item_description  => Item_Rec.DESCRIPTION
764                  ,p_inventory_item_id => p_inventory_item_id
765                  ,x_msg_data          => l_msg_data
766                  ,x_return_status     => l_event_return_status);
767 
768                 --Call ICX APIs
769                 BEGIN
770                    INV_ITEM_EVENTS_PVT.Invoke_ICX_APIs(
771                       p_entity_type       => 'ITEM'
772                      ,p_dml_type          => 'UPDATE'
773                      ,p_inventory_item_id => p_inventory_item_id
774                      ,p_item_number       => Item_Rec.concatenated_segments
775                      ,p_item_description  => Item_Rec.DESCRIPTION
776                      ,p_organization_id   => p_organization_id
777                      ,p_organization_code => Item_Rec.organization_code );
778                 EXCEPTION
779                    WHEN OTHERS THEN
780                       NULL;
781                 END;
782                 --R12: Business Event Enhancement
783           END LOOP;
784       END IF;
785       --End 4105841 Business Event
786 
787     END IF;
788 
789   ELSE
790     code_debug (' processing changes for item revision ');
791     --
792     -- Get all of the pending records
793     --
794     FOR l_pending_record IN l_pending_revision_statuses LOOP
795       code_debug (' processing revision '||l_pending_record.REVISION_ID);
796       IF NVL(p_perform_security_check,FND_API.G_FALSE) = FND_API.G_TRUE THEN
797         -- 4052565 perform security check
798         l_priv_name_to_check := get_privlige_name_for_action
799                               (p_curr_item_id     => p_inventory_item_id
800                               ,p_curr_org_id      => p_organization_id
801                               ,p_curr_rev_id      => p_revision_id
802                               ,p_curr_lc_id       => NULL
803                               ,p_curr_phase_id    => NULL
804                               ,p_curr_status_code => NULL
805                               ,p_new_lc_id        => l_pending_record.lifecycle_id
806                               ,p_new_phase_id     => l_pending_record.phase_id
807                               ,p_new_status_code  => l_pending_record.status_code
808                               );
809         IF l_priv_name_to_check IS NOT NULL THEN
810           IF NOT EGO_ITEM_PVT.has_role_on_item
811                                (p_function_name      => l_priv_name_to_check
812                                ,p_inventory_item_id  => p_inventory_item_id
813                                ,p_item_number        => NULL
814                                ,p_organization_id    => p_organization_id
815                                ,p_organization_name  => NULL
816                                ,p_user_id            => G_CURRENT_USER_ID
817                                ,p_party_id           => NULL
818                                ,p_set_message        => FND_API.G_TRUE
819                                ) THEN
820             RAISE FND_API.G_EXC_ERROR;
821           END IF;
822         END IF;
823       END IF;
824 
825       IF l_pending_record.PHASE_ID IS NOT NULL THEN
826         --
827         -- If master controlled and we are at master
828         --
829         IF (FND_API.TO_BOOLEAN(p_revision_master_controlled)
830             AND
831             FND_API.TO_BOOLEAN(p_is_master_org)
832            ) THEN
833           code_debug (' rev is master controlled and we are at master org ');
834           --
835           -- First get the revision code
836           --
837           SELECT REVISION INTO l_current_revision
838           FROM MTL_ITEM_REVISIONS_B
839           WHERE
840             INVENTORY_ITEM_ID = l_pending_record.INVENTORY_ITEM_ID
841             AND REVISION_ID = l_pending_record.REVISION_ID
842             AND ORGANIZATION_ID = l_pending_record.ORGANIZATION_ID;
843           --
844           -- Update for all orgs
845           --
846 
847           code_debug(' before check_floating_attachments 3');
848           EGO_DOM_UTIL_PUB.check_floating_attachments (  p_inventory_item_id   => l_pending_record.INVENTORY_ITEM_ID
849                                                          ,p_revision_id        => l_pending_record.REVISION_ID
850                                                          ,p_organization_id    => l_pending_record.ORGANIZATION_ID
851                                                          ,p_lifecycle_id       => NULL
852                                                          ,p_new_phase_id       => l_pending_record.PHASE_ID
853                                                          ,x_return_status      => x_return_status
854                                                          ,x_msg_count          => x_msg_count
855                                                          ,x_msg_data           => x_msg_data );
856 
857           code_debug(' after check_floating_attachments 3 ' || x_return_status);
858           IF x_return_status <> FND_API.G_RET_STS_SUCCESS THEN
859                 IF FND_API.To_Boolean( p_commit ) THEN
860                         ROLLBACK TO Implement_All_Pending_Changes;
861                 END IF;
862                 RETURN;
863           END IF;
864 
865           UPDATE MTL_ITEM_REVISIONS_B
866           SET CURRENT_PHASE_ID = l_pending_record.PHASE_ID
867           WHERE
868             INVENTORY_ITEM_ID = l_pending_record.INVENTORY_ITEM_ID
869             AND REVISION = l_current_revision
870             AND ORGANIZATION_ID IN
871                             (SELECT P2.ORGANIZATION_ID
872                              FROM   MTL_PARAMETERS P1,
873                                     MTL_PARAMETERS P2
874                              WHERE  P1.ORGANIZATION_ID = p_organization_id
875                              AND    P1.MASTER_ORGANIZATION_ID = P2.MASTER_ORGANIZATION_ID);
876 
877         ELSIF (FND_API.TO_BOOLEAN(p_revision_master_controlled) = FALSE) THEN
878           code_debug (' rev is org controlled and we are at master org ');
879           --
880           -- Just update for the current one
881           --
882           code_debug(' before check_floating_attachments 4##########');
883           EGO_DOM_UTIL_PUB.check_floating_attachments (  p_inventory_item_id   => l_pending_record.INVENTORY_ITEM_ID
884                                                          ,p_revision_id        => l_pending_record.REVISION_ID
885                                                          ,p_organization_id    => l_pending_record.ORGANIZATION_ID
886                                                          ,p_lifecycle_id       => NULL
887                                                          ,p_new_phase_id       => l_pending_record.PHASE_ID
888                                                          ,x_return_status      => x_return_status
889                                                          ,x_msg_count          => x_msg_count
890                                                          ,x_msg_data           => x_msg_data );
891 
892           code_debug(' after check_floating_attachments 4 ' || x_return_status);
893           IF x_return_status <> FND_API.G_RET_STS_SUCCESS THEN
894                 IF FND_API.To_Boolean( p_commit ) THEN
895                         ROLLBACK TO Implement_All_Pending_Changes;
896                 END IF;
897                 RETURN;
898           END IF;
899 
900           UPDATE MTL_ITEM_REVISIONS_B
901           SET CURRENT_PHASE_ID = l_pending_record.PHASE_ID
902           WHERE
903             INVENTORY_ITEM_ID = l_pending_record.INVENTORY_ITEM_ID
904             AND REVISION_ID = l_pending_record.REVISION_ID
905             AND ORGANIZATION_ID = l_pending_record.ORGANIZATION_ID;
906         END IF;
907 
908         code_debug (' modifying the pending status table now ');
909         IF (FND_API.TO_BOOLEAN(p_is_master_org)
910             OR
911             FND_API.TO_BOOLEAN(p_revision_master_controlled) = FALSE
912            ) THEN
913           UPDATE MTL_PENDING_ITEM_STATUS
914           SET
915             PENDING_FLAG = 'N'
916            ,IMPLEMENTED_DATE = SYSDATE
917           WHERE CURRENT OF l_pending_revision_statuses;
918         END IF;
919 
920       END IF;
921 
922     END LOOP;
923 
924   END IF;
925 
926   IF FND_API.To_Boolean(p_commit) THEN
927     COMMIT WORK;
928     -- Call IP Intermedia Sync
929     INV_ITEM_EVENTS_PVT.Sync_IP_IM_Index;
930   END IF;
931   x_return_status := FND_API.G_RET_STS_SUCCESS;
932 
933 EXCEPTION
934     WHEN FND_API.G_EXC_ERROR THEN
935       IF FND_API.To_Boolean( p_commit ) THEN
936         ROLLBACK TO Implement_All_Pending_Changes;
937       END IF;
938       x_return_status := FND_API.G_RET_STS_ERROR;
939       FND_MSG_PUB.Count_And_Get(
940         p_encoded        => FND_API.G_FALSE,
941         p_count          => x_msg_count,
942         p_data           => x_msg_data
943       );
944   WHEN OTHERS THEN
945     IF FND_API.To_Boolean(p_commit) THEN
946       ROLLBACK TO Implement_All_Pending_Changes;
947     END IF;
948     IF c_item_pending_phase_change%ISOPEN THEN
949       CLOSE c_item_pending_phase_change;
950     END IF;
951     IF c_rev_pending_phase_change%ISOPEN THEN
952       CLOSE c_rev_pending_phase_change;
953     END IF;
954     x_return_status :=  FND_API.G_RET_STS_UNEXP_ERROR;
955     FND_MESSAGE.Set_Name(G_APP_NAME, G_PLSQL_ERR);
956     FND_MESSAGE.Set_Token(G_PKG_NAME_TOKEN, G_PKG_NAME);
957     FND_MESSAGE.Set_Token(G_API_NAME_TOKEN, 'IMPLEMENT_ALL_PENDING_CHANGES');
958     FND_MESSAGE.Set_Token(G_SQL_ERR_MSG_TOKEN, SQLERRM);
959     x_msg_count := 1;
960     x_msg_data := FND_MESSAGE.GET;
961 --    x_return_status := FND_API.G_RET_STS_ERROR;
962 --    x_msg_data := FND_MESSAGE.Get_String('EGO', 'EGO_EXT_EXCEPTION_OCCURED');
963 
964 END Implement_All_Pending_Changes;
965 
966 
967 
968 ----------------------------------------------------------------------
969 -- Public Procedures / Functions
970 ----------------------------------------------------------------------
971 
972 FUNCTION get_master_controlled_status RETURN VARCHAR2 IS
973   l_status_master_controlled  VARCHAR2(100);
974 BEGIN
975   l_status_master_controlled := FND_API.G_FALSE;
976   SELECT DECODE(LOOKUP_CODE2,
977                 1, FND_API.G_TRUE,
978                 2, FND_API.G_FALSE,
979                 FND_API.G_FALSE)
980   INTO l_status_master_controlled
981   FROM MTL_ITEM_ATTRIBUTES_V
982   WHERE ATTRIBUTE_NAME = 'MTL_SYSTEM_ITEMS.INVENTORY_ITEM_STATUS_CODE';
983 
984   RETURN l_status_master_controlled;
985 EXCEPTION
986   WHEN OTHERS THEN
987     RETURN l_status_master_controlled;
988 END get_master_controlled_status;
989 
990 
991 -------------------------------------------------------
992 FUNCTION get_master_org_status (p_organization_id  IN  NUMBER)
993 RETURN VARCHAR2 IS
994   l_is_master_org  VARCHAR2(100);
995 BEGIN
996   l_is_master_org := FND_API.G_FALSE;
997   SELECT DECODE(MP.ORGANIZATION_ID,
998                 MP.MASTER_ORGANIZATION_ID, FND_API.G_TRUE,
999                 FND_API.G_FALSE)
1000   INTO l_is_master_org
1001   FROM MTL_PARAMETERS MP
1002   WHERE MP.ORGANIZATION_ID = p_organization_id;
1003 
1004   RETURN l_is_master_org;
1005 
1006 EXCEPTION
1007   WHEN OTHERS THEN
1008     RETURN l_is_master_org;
1009 END get_master_org_status;
1010 
1011 
1012 -------------------------------------------------------
1013 FUNCTION get_revision_id (p_inventory_item_id  IN  NUMBER
1014                          ,p_organization_id    IN  NUMBER
1015                          ,p_revision           IN  VARCHAR2)
1016 RETURN NUMBER IS
1017   l_revision_id  NUMBER;
1018 BEGIN
1019   l_revision_id := NULL;
1020   SELECT REVISION_ID
1021   INTO   l_revision_id
1022   FROM   MTL_ITEM_REVISIONS
1023   WHERE  INVENTORY_ITEM_ID = p_inventory_item_id
1024     AND  ORGANIZATION_ID = p_organization_id
1025     AND  revision = p_revision;
1026   RETURN l_revision_id;
1027 
1028 EXCEPTION
1029   WHEN OTHERS THEN
1030     RETURN l_revision_id;
1031 END get_revision_id;
1032 
1033 
1034 -------------------------------------------------------
1035 PROCEDURE Create_Pending_Phase_Change
1036 (
1037   p_api_version                     IN   NUMBER
1038  ,p_commit                          IN   VARCHAR2
1039  ,p_inventory_item_id               IN   NUMBER
1040  ,p_item_number                     IN   VARCHAR2  DEFAULT NULL
1041  ,p_organization_id                 IN   NUMBER
1042  ,p_effective_date                  IN   DATE
1043  ,p_pending_flag                    IN   VARCHAR2
1044  ,p_revision                        IN   VARCHAR2
1045  ,p_revision_id                     IN   NUMBER    DEFAULT NULL
1046  ,p_lifecycle_id                    IN   NUMBER
1047  ,p_phase_id                        IN   NUMBER
1048  ,p_status_code                     IN   VARCHAR2  DEFAULT NULL
1049  ,p_change_id                       IN   NUMBER
1050  ,p_change_line_id                  IN   NUMBER
1051  ,p_perform_security_check          IN   VARCHAR2  DEFAULT 'F'
1052  ,x_return_status                   OUT  NOCOPY VARCHAR2
1053  ,x_errorcode                       OUT  NOCOPY NUMBER
1054  ,x_msg_count                       OUT  NOCOPY NUMBER
1055  ,x_msg_data                        OUT  NOCOPY VARCHAR2
1056  ) IS
1057 
1058   l_api_version        NUMBER;
1059   l_api_name           VARCHAR2(50);
1060   l_sysdate            DATE;
1061   l_revision           mtl_item_revisions_b.revision%TYPE;
1062   l_revision_id        mtl_pending_item_status.revision_id%TYPE;
1063   l_phase_id           mtl_pending_item_status.phase_id%TYPE;
1064   l_lifecycle_id       mtl_pending_item_status.lifecycle_id%TYPE;
1065   l_status_code        mtl_pending_item_status.status_code%TYPE;
1066   l_phase_id_curr      mtl_pending_item_status.phase_id%TYPE;
1067   phase_id              mtl_pending_item_status.phase_id%TYPE; -- Bug 14076356
1068   l_lifecycle_id_itm   mtl_pending_item_status.lifecycle_id%TYPE;
1069   l_status_code_itm    mtl_pending_item_status.status_code%TYPE;
1070   l_status_code_def    mtl_pending_item_status.status_code%TYPE;
1071   l_pending_rec_count  NUMBER;
1072   l_item_number        MTL_SYSTEM_ITEMS_KFV.CONCATENATED_SEGMENTS%TYPE;
1073   l_org_name           HR_ALL_ORGANIZATION_UNITS_VL.NAME%TYPE;
1074   l_dummy_char         VARCHAR2(32767);
1075   l_approval_status    mtl_system_items_b.approval_status%TYPE;
1076   l_priv_name_to_check VARCHAR2(100);
1077 
1078   l_revision_master_controlled    VARCHAR2(1);
1079   l_status_master_controlled      VARCHAR2(1);
1080   l_is_master_org                 VARCHAR2(1);
1081 
1082   CURSOR c_get_rev_details (cp_item_id      IN  NUMBER
1083                            ,cp_org_id       IN  NUMBER
1084                            ,cp_revision     IN  VARCHAR2
1085                            ,cp_revision_id  IN  NUMBER) IS
1086   SELECT rev.current_phase_id, rev.lifecycle_id, rev.revision, rev.revision_id, item.approval_status
1087   FROM mtl_item_revisions_b rev, mtl_system_items_b item
1088   WHERE rev.inventory_item_id = cp_item_id
1089     AND rev.organization_id = cp_org_id
1090     AND rev.revision = NVL(cp_revision, rev.revision)
1091     AND rev.revision_id = NVL(cp_revision_id, rev.revision_id)
1092     AND item.inventory_item_id = rev.inventory_item_id
1093     AND item.organization_id = rev.organization_id;
1094 
1095   CURSOR c_get_item_details (cp_item_id  IN  NUMBER
1096                             ,cp_org_id   IN  NUMBER) IS
1097   SELECT current_phase_id, lifecycle_id, inventory_item_status_code, approval_status
1098   FROM mtl_system_items_b
1099   WHERE inventory_item_id = cp_item_id
1100     AND organization_id = cp_org_id;
1101 
1102   CURSOR c_get_def_status_code (cp_phase_id IN NUMBER) IS
1103   SELECT status.item_status_code
1104   FROM   ego_lcphase_item_status status, pa_proj_elements lc_phases
1105   WHERE  lc_phases.proj_element_id = cp_phase_id
1106     AND  status.phase_code = lc_phases.phase_code
1107     AND  status.default_flag = 'Y'
1108     AND  lc_phases.PROJECT_ID = 0 AND lc_phases.OBJECT_TYPE = 'PA_TASKS';
1109 
1110   CURSOR c_validate_status_code (cp_phase_id     IN NUMBER
1111                                 ,cp_status_code  IN  VARCHAR2) IS
1112   SELECT status.item_status_code
1113   FROM   ego_lcphase_item_status status, pa_ego_phases_v lc_phases
1114   WHERE  lc_phases.proj_element_id = cp_phase_id
1115     AND  status.phase_code = lc_phases.phase_code
1116     AND  status.item_status_code = cp_status_code;
1117  --Bug 14076356 , Added to validate the Item status
1118  CURSOR c_item_validate_status_code (cp_status_code  IN  VARCHAR2) IS
1119   SELECT status.INVENTORY_ITEM_STATUS_CODE
1120   FROM   mtl_item_status status
1121   WHERE  status.INVENTORY_ITEM_STATUS_CODE = cp_status_code;
1122 
1123 
1124 BEGIN
1125 
1126   l_api_version  := 1.0;
1127   l_api_name     := 'Create_Pending_Phase_Change';
1128 
1129   IF FND_API.To_Boolean(p_commit) THEN
1130     SAVEPOINT Create_Pending_Phase_Change_SP;
1131   END IF;
1132   code_debug( l_api_name ||' started with params');
1133   code_debug( l_api_name ||' p_inventory_item_id '|| p_inventory_item_id ||' p_organization_id '|| p_organization_id || ' p_revision '|| p_revision);
1134   code_debug( l_api_name ||' p_lifecycle_id '|| p_lifecycle_id ||' p_phase_id '|| p_phase_id ||' p_status_code '|| p_status_code);
1135   code_debug( l_api_name ||' p_pending_flag '|| p_pending_flag ||' p_change_id '|| p_change_id ||' p_change_line_id '|| p_change_line_id);
1136 
1137   --Standard checks
1138   IF NOT FND_API.Compatible_API_Call (l_api_version
1139                                      ,p_api_version
1140                                      ,l_api_name
1141                                      ,g_pkg_name)
1142   THEN
1143     RAISE FND_API.G_EXC_ERROR;
1144   END IF;
1145 
1146   IF Nvl(FND_GLOBAL.User_Id,-1) <> Nvl(G_CURRENT_USER_ID,-1)
1147   THEN
1148       G_CURRENT_USER_ID  := FND_GLOBAL.User_Id;
1149       G_CURRENT_LOGIN_ID := FND_GLOBAL.Login_Id;
1150   END IF;
1151 
1152   IF (p_inventory_item_id IS NULL
1153       OR
1154       p_organization_id IS NULL
1155       OR
1156       ( (p_revision IS NOT NULL OR p_revision_id IS NOT NULL) AND p_status_code IS NOT NULL)
1157       OR
1158       (p_phase_id IS NULL AND p_status_code IS NULL)
1159       ) THEN
1160     fnd_message.Set_Name(G_APP_NAME, 'EGO_API_INVALID_PARAMS');
1161     fnd_message.Set_Token(G_PKG_NAME_TOKEN, G_PKG_NAME);
1162     fnd_message.Set_Token(G_API_NAME_TOKEN, l_api_name);
1163     FND_MSG_PUB.Add;
1164     RAISE FND_API.G_EXC_ERROR;
1165   END IF;
1166 
1167   l_revision := p_revision;
1168   l_revision_id := p_revision_id;
1169 
1170   IF (l_revision IS NULL AND l_revision_id IS NULL) THEN
1171     OPEN c_get_item_details (cp_item_id => p_inventory_item_id
1172                             ,cp_org_id  => p_organization_id);
1173     FETCH c_get_item_details
1174     INTO l_phase_id_curr, l_lifecycle_id_itm, l_status_code_itm, l_approval_status;
1175     IF c_get_item_details%NOTFOUND THEN
1176       l_phase_id_curr := NULL;
1177       l_lifecycle_id_itm := NULL;
1178     END IF;
1179     CLOSE c_get_item_details;
1180   ELSE
1181     l_status_code_itm := NULL;
1182     OPEN c_get_rev_details (cp_item_id      => p_inventory_item_id
1183                            ,cp_org_id       => p_organization_id
1184                            ,cp_revision     => l_revision
1185                            ,cp_revision_id  => l_revision_id);
1186     FETCH c_get_rev_details
1187     INTO l_phase_id_curr, l_lifecycle_id_itm, l_revision, l_revision_id, l_approval_status;
1188     IF c_get_rev_details%NOTFOUND THEN
1189       l_phase_id_curr := NULL;
1190       l_lifecycle_id_itm := NULL;
1191       l_revision_id := NULL;
1192     END IF;
1193     CLOSE c_get_rev_details;
1194   END IF;
1195 
1196   code_debug( l_api_name ||' curr values - current_phase_id '||l_phase_id_curr||' lifecycle_id '||l_lifecycle_id_itm||' status_code '||l_status_code_itm );
1197 
1198   -- bug 3909677
1199   IF NVL(l_approval_status,'A') <> 'A' THEN
1200     fnd_message.Set_Name(G_APP_NAME, 'EGO_ITEM_NOT_READY_FOR_CHANGE');
1201     SELECT CONCATENATED_SEGMENTS
1202       INTO l_dummy_char
1203       FROM MTL_SYSTEM_ITEMS_KFV
1204      WHERE INVENTORY_ITEM_ID = p_inventory_item_id
1205        AND ORGANIZATION_ID = p_organization_id;
1206     fnd_message.set_token('ITEM_NUMBER', l_dummy_char);
1207     SELECT name
1208       INTO l_dummy_char
1209       FROM hr_all_organization_units_vl
1210      WHERE organization_id = p_organization_id;
1211     fnd_message.set_token('ORGANIZATION', l_dummy_char);
1212     fnd_msg_pub.Add;
1213     RAISE FND_API.G_EXC_ERROR;
1214   END IF;
1215 
1216   IF FND_API.To_Boolean(p_perform_security_check) THEN
1217     code_debug( l_api_name ||' need to perform security check ');
1218     -- 4052565 perform security check
1219     l_priv_name_to_check := get_privlige_name_for_action
1220                       (p_curr_item_id     => p_inventory_item_id
1221                       ,p_curr_org_id      => p_organization_id
1222                       ,p_curr_rev_id      => l_revision_id
1223                       ,p_curr_lc_id       => l_lifecycle_id_itm
1224                       ,p_curr_phase_id    => l_phase_id_curr
1225                       ,p_curr_status_code => l_status_code_itm
1226                       ,p_new_lc_id        => p_lifecycle_id
1227                       ,p_new_phase_id     => p_phase_id
1228                       ,p_new_status_code  => p_status_code
1229                       );
1230     code_debug( l_api_name ||' priv check name '||l_priv_name_to_check);
1231     IF l_priv_name_to_check IS NOT NULL THEN
1232       IF NOT EGO_ITEM_PVT.has_role_on_item
1233                        (p_function_name      => l_priv_name_to_check
1234                        ,p_inventory_item_id  => p_inventory_item_id
1235                        ,p_item_number        => p_item_number
1236                        ,p_organization_id    => p_organization_id
1237                        ,p_organization_name  => NULL
1238                        ,p_user_id            => G_CURRENT_USER_ID
1239                        ,p_party_id           => NULL
1240                        ,p_set_message        => FND_API.G_TRUE
1241                        ) THEN
1242         code_debug( l_api_name ||' user does not have privilege for '||l_priv_name_to_check);
1243         RAISE FND_API.G_EXC_ERROR;
1244       ELSE
1245         code_debug( l_api_name ||' user can perform the action '||l_priv_name_to_check);
1246       END IF;
1247     END IF;
1248   ELSE
1249     code_debug( l_api_name ||' NO need to perform security check ');
1250   END IF;
1251 
1252   IF p_phase_id IS NOT NULL THEN
1253     --
1254     -- if status is not passed, get the default status code
1255     --
1256     l_phase_id := p_phase_id;
1257     l_lifecycle_id := NVL(p_lifecycle_id, l_lifecycle_id_itm);
1258     IF p_status_code IS NULL THEN
1259       -- get the default phase for the new phase
1260       OPEN c_get_def_status_code (cp_phase_id => p_phase_id);
1261       FETCH c_get_def_status_code INTO l_status_code_def;
1262       IF c_get_def_status_code%NOTFOUND THEN
1263         CLOSE c_get_def_status_code;
1264         SELECT name
1265         INTO l_dummy_char
1266         FROM PA_EGO_PHASES_V
1267         WHERE proj_element_id = p_phase_id;
1268         fnd_message.Set_Name(G_APP_NAME, 'EGO_NO_STATUS_FOR_PHASE_ERR');
1269         fnd_message.Set_Token('PHASE', l_dummy_char);
1270         FND_MSG_PUB.Add;
1271         RAISE FND_API.G_EXC_ERROR;
1272       ELSE
1273         CLOSE c_get_def_status_code;
1274       END IF;
1275     ELSE
1276       l_status_code_def := NULL;
1277     END IF;  -- p_status_code IS NULL
1278     --
1279     -- user trying to do a phase change
1280     --
1281     IF (NVL(l_phase_id_curr,-1) <> p_phase_id) THEN
1282       SELECT count(*)
1283       INTO l_pending_rec_count
1284       FROM mtl_pending_item_status
1285       WHERE inventory_item_id = p_inventory_item_id
1286         AND organization_id = p_organization_id
1287         AND pending_flag = 'Y'
1288         AND implemented_date IS NULL
1289         AND NVL(revision_id,-1) = NVL(l_revision_id,-1)
1290         AND lifecycle_id IS NOT NULL
1291         AND phase_id IS NOT NULL;
1292       IF l_pending_rec_count <> 0 THEN
1293         --
1294         -- pending chanes already exist
1295         --
1296         IF p_item_number IS NULL THEN
1297           SELECT concatenated_segments
1298           INTO l_dummy_char
1299           FROM mtl_system_items_b_kfv
1300           WHERE inventory_item_id = p_inventory_item_id
1301           AND   organization_id = p_organization_id;
1302         ELSE
1303           l_dummy_char := p_item_number;
1304         END IF;
1305         IF l_revision_id IS NULL THEN
1306           fnd_message.Set_Name(G_APP_NAME, 'EGO_ITEM_PENDING_PHASE_CHANGE');
1307           fnd_message.Set_Token('ITEM_NUMBER', l_dummy_char);
1308           FND_MSG_PUB.Add;
1309           RAISE FND_API.G_EXC_ERROR;
1310         ELSE
1311           fnd_message.Set_Name(G_APP_NAME, 'EGO_REV_PENDING_PHASE_CHANGE');
1312           fnd_message.Set_Token('ITEM_NUMBER', l_dummy_char);
1313           fnd_message.Set_Token('REVISION', l_revision);
1314           FND_MSG_PUB.Add;
1315           RAISE FND_API.G_EXC_ERROR;
1316         END IF;
1317       END IF;  -- l_pending_rec_count
1318     END IF;    -- NVL(l_phase_id_curr,-1) <> p_phase_id
1319   ELSE
1320    /*
1321    Bug 14076356: swuppala: the phase and life cycle attached
1322    to the item is not captured in the Pending Item Status change record
1323     --l_phase_id := NULL;
1324    -- l_lifecycle_id := NULL;
1325    Hence setting the Items current phase and lifecycle in case of Status Change
1326     */
1327    l_phase_id := l_phase_id_curr;
1328     l_lifecycle_id := l_lifecycle_id_itm;
1329 
1330   END IF;      -- phase id is not null
1331   code_debug( l_api_name ||' no pending phase changes ');
1332 
1333   IF l_revision IS NULL THEN
1334   /*Bug 14076356: swuppala:
1335    Get the phase id START
1336   */
1337   phase_id :=   NVL(p_phase_id,l_phase_id_curr);
1338     IF(phase_id IS NOT NULL) THEN
1339 
1340     -- check if the current status is valid for the item phase
1341       OPEN c_validate_status_code (cp_phase_id    => NVL(p_phase_id,l_phase_id_curr)
1342                                   ,cp_status_code => NVL(p_status_code,l_status_code_def)
1343                                   );
1344       FETCH c_validate_status_code INTO l_status_code;
1345       IF c_validate_status_code%NOTFOUND THEN
1346         CLOSE c_validate_status_code;
1347         fnd_message.Set_Name(G_APP_NAME, 'EGO_ITEM_INVALID_STATUS');
1348         fnd_message.Set_Token('STATUS', p_status_code);
1349         SELECT name
1350         INTO l_dummy_char
1351         FROM PA_EGO_PHASES_V
1352         WHERE proj_element_id = NVL(p_phase_id,l_phase_id_curr);
1353         fnd_message.Set_Token('PHASE', l_dummy_char);
1354         FND_MSG_PUB.Add;
1355         RAISE FND_API.G_EXC_ERROR;
1356       ELSE
1357         code_debug (l_api_name ||' checking for master controlled status ');
1358         l_is_master_org := get_master_org_status(p_organization_id);
1359         l_revision_master_controlled := FND_API.g_false;
1360         l_status_master_controlled := get_master_controlled_status();
1361         IF ('T' = l_status_master_controlled) AND NOT ('T' = l_is_master_org) THEN
1362           IF l_status_code_itm <> l_status_code THEN
1363             code_debug (l_api_name ||' status changes controlled at master cannot change ');
1364             fnd_message.Set_Name(G_APP_NAME,'EGO_ITEM_STATUS_MC');
1365             fnd_msg_pub.Add;
1366             RAISE FND_API.G_EXC_ERROR;
1367           END IF;
1368         END IF; -- status is master controlled and we are in context of child org
1369       END IF;  -- status is valid
1370    ELSE -- phase id null
1371    /*
1372     Bug 14076356: swuppala:
1373     If there is no phase associated to item, check if the status is
1374     valid item status.
1375    */
1376        OPEN c_item_validate_status_code (cp_status_code => NVL(p_status_code,l_status_code_def)
1377                                   );
1378       FETCH c_item_validate_status_code INTO l_status_code;
1379       IF c_item_validate_status_code%NOTFOUND THEN
1380         CLOSE c_item_validate_status_code;
1381         fnd_message.Set_Name(G_APP_NAME, 'EGO_STATUS_INVALID');
1382     --    fnd_message.Set_Token('STATUS', p_status_code);
1383       --  SELECT name
1384       --  INTO l_dummy_char
1385       --  FROM PA_EGO_PHASES_V
1386     --    WHERE proj_element_id = NVL(p_phase_id,l_phase_id_curr);
1387       --  fnd_message.Set_Token('PHASE', l_dummy_char);
1388         FND_MSG_PUB.Add;
1389         RAISE FND_API.G_EXC_ERROR;
1390       ELSE
1391         code_debug (l_api_name ||' checking for master controlled status ');
1392         l_is_master_org := get_master_org_status(p_organization_id);
1393         l_revision_master_controlled := FND_API.g_false;
1394         l_status_master_controlled := get_master_controlled_status();
1395         IF ('T' = l_status_master_controlled) AND NOT ('T' = l_is_master_org) THEN
1396           IF l_status_code_itm <> l_status_code THEN
1397             code_debug (l_api_name ||' status changes controlled at master cannot change ');
1398             fnd_message.Set_Name(G_APP_NAME,'EGO_ITEM_STATUS_MC');
1399             fnd_msg_pub.Add;
1400             RAISE FND_API.G_EXC_ERROR;
1401           END IF;
1402         END IF; -- status is master controlled and we are in context of child org
1403       END IF;  -- status is valid
1404        /*Bug 14076356: swuppala:
1405    Get the phase id END
1406   */
1407     END IF;
1408 
1409     ELSE
1410       -- context of revision
1411       l_status_code := NULL;
1412     END IF;    -- revision IS NULL
1413     code_debug(' comparing values before insert p_lifecycle_id '||p_lifecycle_id ||' l_lifecycle_id '||l_lifecycle_id);
1414     --
1415     -- to be removed after bug 3874132 is resoloved.
1416     --
1417     l_sysdate := SYSDATE;
1418     INSERT INTO MTL_PENDING_ITEM_STATUS
1419     (
1420       inventory_item_id
1421      ,organization_id
1422      ,status_code
1423      ,effective_date
1424      ,implemented_date
1425      ,pending_flag
1426      ,last_update_date
1427      ,last_updated_by
1428      ,creation_date
1429      ,created_by
1430      ,last_update_login
1431 --     ,request_id
1432 --     ,program_update_date
1433      ,revision_id
1434      ,lifecycle_id
1435      ,phase_id
1436      ,change_id
1437      ,change_line_id
1438     )
1439     VALUES
1440     (
1441       p_inventory_item_id
1442      ,p_organization_id
1443      ,l_status_code
1444      ,NVL(p_effective_date,l_sysdate)
1445      ,NULL
1446      ,NVL(p_pending_flag,'Y')
1447      ,l_sysdate
1448      ,G_CURRENT_USER_ID
1449      ,l_sysdate
1450      ,G_CURRENT_USER_ID
1451      ,G_CURRENT_LOGIN_ID
1452 --     ,NULL
1453 --     ,l_sysdate
1454      ,l_revision_id
1455      ,l_lifecycle_id
1456      ,l_phase_id
1457      ,p_change_id
1458      ,p_change_line_id
1459     );
1460 
1461   IF FND_API.To_Boolean(p_commit) THEN
1462     COMMIT WORK;
1463   END IF;
1464   x_return_status := FND_API.G_RET_STS_SUCCESS;
1465   EXCEPTION
1466     WHEN FND_API.G_EXC_ERROR THEN
1467       IF FND_API.To_Boolean( p_commit ) THEN
1468         ROLLBACK TO Create_Pending_Phase_Change_SP;
1469       END IF;
1470       IF  c_get_rev_details%ISOPEN THEN
1471         CLOSE c_get_rev_details;
1472       END IF;
1473       IF  c_get_item_details%ISOPEN THEN
1474         CLOSE c_get_item_details;
1475       END IF;
1476       IF  c_get_def_status_code%ISOPEN THEN
1477         CLOSE c_get_def_status_code;
1478       END IF;
1479       IF  c_validate_status_code%ISOPEN THEN
1480         CLOSE c_validate_status_code;
1481       END IF;
1482       x_return_status := FND_API.G_RET_STS_ERROR;
1483     WHEN OTHERS THEN
1484       IF FND_API.To_Boolean(p_commit) THEN
1485         ROLLBACK TO Create_Pending_Phase_Change_SP;
1486       END IF;
1487       IF  c_get_rev_details%ISOPEN THEN
1488         CLOSE c_get_rev_details;
1489       END IF;
1490       IF  c_get_item_details%ISOPEN THEN
1491         CLOSE c_get_item_details;
1492       END IF;
1493       IF  c_get_def_status_code%ISOPEN THEN
1494         CLOSE c_get_def_status_code;
1495       END IF;
1496       IF  c_validate_status_code%ISOPEN THEN
1497         CLOSE c_validate_status_code;
1498       END IF;
1499       x_return_status :=  FND_API.G_RET_STS_UNEXP_ERROR;
1500       FND_MESSAGE.Set_Name(g_app_name, g_plsql_err);
1501       FND_MESSAGE.Set_Token(g_pkg_name_token, g_pkg_name);
1502       FND_MESSAGE.Set_Token(g_api_name_token, l_api_name);
1503       FND_MESSAGE.Set_Token(g_sql_err_msg_token, SQLERRM);
1504       FND_MSG_PUB.Add;
1505 END Create_Pending_Phase_Change;
1506 
1507 
1508 -------------------------------------------------------
1509 PROCEDURE Modify_Pending_Phase_Change
1510   (p_api_version                    IN   NUMBER
1511   ,p_commit                         IN   VARCHAR2
1512   ,p_transaction_type               IN   VARCHAR2
1513   ,p_inventory_item_id              IN   NUMBER
1514   ,p_organization_id                IN   NUMBER
1515   ,p_revision_id                    IN   NUMBER
1516   ,p_lifecycle_id                   IN   NUMBER
1517   ,p_phase_id                       IN   NUMBER
1518   ,p_status_code                    IN   VARCHAR2
1519   ,p_change_id                      IN   NUMBER
1520   ,p_change_line_id                 IN   NUMBER
1521   ,p_effective_date                 IN   DATE
1522   ,p_new_effective_date             IN   DATE
1523   ,p_perform_security_check         IN   VARCHAR2
1524   ,x_return_status                  OUT  NOCOPY VARCHAR2
1525   ,x_errorcode                      OUT  NOCOPY NUMBER
1526   ,x_msg_count                      OUT  NOCOPY NUMBER
1527   ,x_msg_data                       OUT  NOCOPY VARCHAR2
1528   ) IS
1529 
1530   l_api_version         NUMBER;
1531   l_api_name            VARCHAR2(50);
1532   l_miss_num            NUMBER;
1533   l_miss_char           VARCHAR2(1);
1534   l_priv_name_to_check  VARCHAR2(100);
1535 
1536 
1537   BEGIN
1538     l_api_version      := 1.0;
1539     l_api_name         := 'Modify_Pending_Phase_Change';
1540     l_miss_num         := FND_API.G_MISS_NUM;
1541     l_miss_char        := FND_API.G_MISS_CHAR;
1542 
1543     IF FND_API.To_Boolean(p_commit) THEN
1544       SAVEPOINT Modify_Pending_Phase_Change_SP;
1545     END IF;
1546 
1547     --Standard checks
1548     IF NOT FND_API.Compatible_API_Call (l_api_version
1549                                        ,p_api_version
1550                                        ,l_api_name
1551                                        ,g_pkg_name)
1552     THEN
1553       RAISE FND_API.G_EXC_ERROR;
1554     END IF;
1555 
1556     IF Nvl(FND_GLOBAL.User_Id,-1) <> Nvl(G_CURRENT_USER_ID,-1)
1557     THEN
1558       G_CURRENT_USER_ID  := FND_GLOBAL.User_Id;
1559       G_CURRENT_LOGIN_ID := FND_GLOBAL.Login_Id;
1560     END IF;
1561 
1562 
1563     IF ( p_inventory_item_id IS NULL
1564          OR
1565          p_organization_id IS NULL
1566          OR
1567          p_effective_date IS NULL
1568          OR
1569          p_transaction_type NOT IN (EGO_ITEM_PUB.G_TTYPE_UPDATE, EGO_ITEM_PUB.G_TTYPE_DELETE)
1570       ) THEN
1571       fnd_message.Set_Name(G_APP_NAME, 'EGO_API_INVALID_PARAMS');
1572       fnd_message.Set_Token(G_PKG_NAME_TOKEN, G_PKG_NAME);
1573       fnd_message.Set_Token(G_API_NAME_TOKEN, l_api_name);
1574       FND_MSG_PUB.Add;
1575       RAISE FND_API.G_EXC_ERROR;
1576     END IF;
1577 
1578     IF FND_API.To_Boolean(p_perform_security_check) THEN
1579       -- 4052565 perform security check
1580       l_priv_name_to_check := get_privlige_name_for_action
1581                         (p_curr_item_id     => p_inventory_item_id
1582                         ,p_curr_org_id      => p_organization_id
1583                         ,p_curr_rev_id      => p_revision_id
1584                         ,p_curr_lc_id       => NULL
1585                         ,p_curr_phase_id    => NULL
1586                         ,p_curr_status_code => NULL
1587                         ,p_new_lc_id        => p_lifecycle_id
1588                         ,p_new_phase_id     => p_phase_id
1589                         ,p_new_status_code  => p_status_code
1590                         );
1591       IF l_priv_name_to_check IS NOT NULL THEN
1592         IF NOT EGO_ITEM_PVT.has_role_on_item
1593                             (p_function_name      => l_priv_name_to_check
1594                             ,p_inventory_item_id  => p_inventory_item_id
1595                             ,p_item_number        => NULL
1596                             ,p_organization_id    => p_organization_id
1597                             ,p_organization_name  => NULL
1598                             ,p_user_id            => G_CURRENT_USER_ID
1599                             ,p_party_id           => NULL
1600                             ,p_set_message        => FND_API.G_TRUE
1601                             ) THEN
1602           RAISE FND_API.G_EXC_ERROR;
1603         END IF;
1604       END IF;
1605     END IF;
1606 
1607     IF p_transaction_type = EGO_ITEM_PUB.G_TTYPE_UPDATE THEN
1608       --
1609       -- to be removed after bug 3874132 is resoloved.
1610       --
1611       code_debug(l_api_name|| ' Updating pending change record ');
1612       UPDATE mtl_pending_item_status
1613       SET    effective_date     = p_new_effective_date,
1614              last_update_date   = SYSDATE,
1615              last_updated_by    = G_CURRENT_USER_ID,
1616              last_update_login  = G_CURRENT_LOGIN_ID
1617       WHERE  inventory_item_id                 = p_inventory_item_id
1618         AND  organization_id                   = p_organization_id
1619         AND  NVL(revision_id,l_miss_num)       = NVL(p_revision_id, l_miss_num)
1620         AND  NVL(lifecycle_id, l_miss_num)     = NVL(p_lifecycle_id, l_miss_num)
1621         AND  NVL(phase_id, l_miss_num)         = NVL(p_phase_id, l_miss_num)
1622         AND  NVL(status_code,l_miss_char)      = NVL(p_status_code, l_miss_char)
1623         AND  NVL(p_change_id, l_miss_num)      = NVL(p_change_id, l_miss_num)
1624         AND  NVL(p_change_line_id, l_miss_num) = NVL(p_change_line_id, l_miss_num)
1625         AND  effective_date                    = p_effective_date
1626         AND  pending_flag                      = 'Y'
1627         AND  implemented_date IS NULL;
1628       IF SQL%ROWCOUNT = 0 THEN
1629         code_debug(l_api_name|| ' cannot update record!! ');
1630         -- no records found for update
1631         fnd_message.Set_Name(G_APP_NAME, 'EGO_NO_REC_UPDATE');
1632         FND_MSG_PUB.Add;
1633         RAISE FND_API.G_EXC_ERROR;
1634       END IF;
1635 
1636     ELSIF p_transaction_type = EGO_ITEM_PUB.G_TTYPE_DELETE THEN
1637       --
1638       -- to be removed after bug 3874132 is resoloved.
1639       --
1640       code_debug(l_api_name|| ' Deleting pending change record ');
1641       DELETE mtl_pending_item_status
1642       WHERE  inventory_item_id                 = p_inventory_item_id
1643         AND  organization_id                   = p_organization_id
1644         AND  NVL(revision_id,l_miss_num)       = NVL(p_revision_id, l_miss_num)
1645         AND  NVL(lifecycle_id, l_miss_num)     = NVL(p_lifecycle_id, l_miss_num)
1646         AND  NVL(phase_id, l_miss_num)         = NVL(p_phase_id, l_miss_num)
1647         AND  NVL(status_code,l_miss_char)      = NVL(p_status_code, l_miss_char)
1648         AND  NVL(p_change_id, l_miss_num)      = NVL(p_change_id, l_miss_num)
1649         AND  NVL(p_change_line_id, l_miss_num) = NVL(p_change_line_id, l_miss_num)
1650         AND  effective_date                    = p_effective_date
1651         AND  pending_flag                      = 'Y'
1652         AND  implemented_date IS NULL;
1653       IF SQL%ROWCOUNT = 0 THEN
1654         -- no records found for delete
1655         fnd_message.Set_Name(G_APP_NAME, 'EGO_NO_REC_DELETE');
1656         FND_MSG_PUB.Add;
1657         RAISE FND_API.G_EXC_ERROR;
1658       END IF;
1659 
1660     END IF;
1661 
1662   EXCEPTION
1663     WHEN FND_API.G_EXC_ERROR THEN
1664       IF FND_API.To_Boolean( p_commit ) THEN
1665         ROLLBACK TO Create_Pending_Phase_Change_SP;
1666       END IF;
1667       x_return_status := FND_API.G_RET_STS_ERROR;
1668 
1669 END Modify_Pending_Phase_change;
1670 
1671 
1672 
1673 /***
1674 PROCEDURE Delete_Pending_Phase_Change
1675 (
1676   p_api_version                     IN   NUMBER
1677  ,p_commit                          IN   VARCHAR2
1678  ,p_inventory_item_id               IN   NUMBER
1679  ,p_organization_id                 IN   NUMBER
1680  ,p_change_id                       IN   NUMBER
1681  ,p_change_line_id                  IN   NUMBER
1682  ,x_return_status                   OUT  NOCOPY VARCHAR2
1683  ,x_errorcode                       OUT  NOCOPY NUMBER
1684  ,x_msg_count                       OUT  NOCOPY NUMBER
1685  ,x_msg_data                        OUT  NOCOPY VARCHAR2
1686  ) IS
1687 
1688   l_api_version      NUMBER;
1689   l_api_name         VARCHAR2(50);
1690 
1691 BEGIN
1692   l_api_version      := 1.0;
1693   l_api_name         := 'Delete_Pending_Phase_Change';
1694   --Standard checks
1695   IF NOT FND_API.Compatible_API_Call (l_api_version
1696                                      ,p_api_version
1697                                      ,l_api_name
1698                                      ,g_pkg_name)
1699   THEN
1700     RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
1701   END IF;
1702 
1703   IF ( (p_inventory_item_id IS NULL
1704         AND
1705         p_change_id IS NULL
1706         AND
1707         p_change_line_id IS NULL
1708         )
1709       OR
1710       p_organization_id IS NULL
1711       ) THEN
1712     x_return_status :=  FND_API.G_RET_STS_ERROR;
1713     RETURN;
1714   END IF;
1715 
1716   IF FND_API.To_Boolean(p_commit) THEN
1717     SAVEPOINT Delete_Pending_Phase_Change_SP;
1718   END IF;
1719 
1720   IF p_change_id IS NOT NULL THEN
1721     IF p_change_line_id IS NOT NULL THEN
1722       IF p_inventory_item_id IS NOT NULL THEN
1723         --
1724         -- change_id, change_line_id, inventory_item_id present
1725         --
1726         DELETE MTL_PENDING_ITEM_STATUS
1727         WHERE  organization_id   = p_organization_id
1728           AND  inventory_item_id = p_inventory_item_id
1729           AND  change_id         = p_change_id
1730           AND  change_line_id    = p_change_line_id
1731           AND  implemented_date IS NULL
1732           AND  pending_flag = 'Y';
1733       ELSE
1734         --
1735         -- change_id, change_line_id present
1736         --
1737         DELETE MTL_PENDING_ITEM_STATUS
1738         WHERE  organization_id   = p_organization_id
1739           AND  change_id         = p_change_id
1740           AND  change_line_id    = p_change_line_id
1741           AND  implemented_date IS NULL
1742           AND  pending_flag = 'Y';
1743       END IF;
1744     ELSE  -- change line id is null
1745       IF p_inventory_item_id IS NOT NULL THEN
1746         --
1747         -- change_id, inventory_item_id present
1748         --
1749         DELETE MTL_PENDING_ITEM_STATUS
1750         WHERE  organization_id   = p_organization_id
1751           AND  inventory_item_id = p_inventory_item_id
1752           AND  change_id         = p_change_id
1753           AND  implemented_date IS NULL
1754           AND  pending_flag = 'Y';
1755       ELSE
1756         --
1757         -- only change_id present
1758         --
1759         DELETE MTL_PENDING_ITEM_STATUS
1760         WHERE  organization_id   = p_organization_id
1761           AND  change_id         = p_change_id
1762           AND  implemented_date IS NULL
1763           AND  pending_flag = 'Y';
1764       END IF;
1765     END IF;
1766   ELSE   -- change id is null
1767     IF p_change_line_id IS NOT NULL THEN
1768       IF p_inventory_item_id IS NOT NULL THEN
1769         --
1770         -- change_line_id, inventory_item_id present
1771         --
1772         DELETE MTL_PENDING_ITEM_STATUS
1773         WHERE  organization_id   = p_organization_id
1774           AND  inventory_item_id = p_inventory_item_id
1775           AND  change_line_id    = p_change_line_id
1776           AND  implemented_date IS NULL
1777           AND  pending_flag = 'Y';
1778       ELSE
1779         --
1780         -- only change_line_id present
1781         --
1782         DELETE MTL_PENDING_ITEM_STATUS
1783         WHERE  organization_id   = p_organization_id
1784           AND  change_line_id    = p_change_line_id
1785           AND  implemented_date IS NULL
1786           AND  pending_flag = 'Y';
1787       END IF;
1788     ELSE  -- change line id is null
1789       IF p_inventory_item_id IS NOT NULL THEN
1790         --
1791         -- only inventory_item_id present
1792         -- delete where change_id and change_line_id are null
1793         --
1794         DELETE MTL_PENDING_ITEM_STATUS
1795         WHERE  organization_id   = p_organization_id
1796           AND  inventory_item_id = p_inventory_item_id
1797           AND  change_id        IS NULL
1798           AND  change_line_id   IS NULL
1799           AND  implemented_date IS NULL
1800           AND  pending_flag = 'Y';
1801       END IF;
1802     END IF;
1803   END IF;
1804 
1805   IF FND_API.To_Boolean(p_commit) THEN
1806     COMMIT WORK;
1807   END IF;
1808   x_return_status :=  FND_API.G_RET_STS_SUCCESS;
1809 
1810   EXCEPTION
1811     WHEN OTHERS THEN
1812       IF FND_API.To_Boolean(p_commit) THEN
1813         ROLLBACK TO Delete_Pending_Phase_Change_SP;
1814       END IF;
1815       x_return_status :=  FND_API.G_RET_STS_UNEXP_ERROR;
1816       FND_MESSAGE.Set_Name(g_app_name, g_plsql_err);
1817       FND_MESSAGE.Set_Token(g_pkg_name_token, g_pkg_name);
1818       FND_MESSAGE.Set_Token(g_api_name_token, l_api_name);
1819       FND_MESSAGE.Set_Token(g_sql_err_msg_token, SQLERRM);
1820       FND_MSG_PUB.Add;
1821 
1822 END Delete_Pending_Phase_Change;
1823 ***/
1824 
1825 PROCEDURE Implement_Pending_Changes
1826 (
1827      p_api_version                 IN   NUMBER
1828    , p_inventory_item_id           IN   NUMBER
1829    , p_organization_id             IN   NUMBER
1830    , p_revision_id                 IN   NUMBER
1831    , p_revision_master_controlled  IN   VARCHAR2
1832    , p_status_master_controlled    IN   VARCHAR2
1833    , p_is_master_org               IN   VARCHAR2
1834    , p_perform_security_check      IN   VARCHAR2   DEFAULT 'F'
1835    , x_return_status               OUT  NOCOPY VARCHAR2
1836    , x_errorcode                   OUT  NOCOPY NUMBER
1837    , x_msg_count                   OUT  NOCOPY NUMBER
1838    , x_msg_data                    OUT  NOCOPY VARCHAR2
1839 ) IS
1840 
1841   l_commit  VARCHAR2(1);
1842 
1843 BEGIN
1844   --
1845   -- existing functionality is doing a commit always
1846   --
1847   code_debug(' Implement Pending Changes from Projects area item id '||p_inventory_item_id||' org id '||p_organization_id||' rev id '||p_revision_id);
1848 /* Fix for bug 11660573 - commenting the below code that hardcodes l_commit =
1849  * TRUE.
1850  *    Hardcoding it to true was causing 'SAVEPOINT NEVER ESTABLISHED' exception
1851  *       when any error was occuring in Implement_All_Pending_Changes() api.
1852  *         l_commit := FND_API.G_TRUE;
1853  *         */
1854   Implement_All_Pending_Changes
1855        (p_api_version                  => p_api_version
1856        ,p_commit                       => l_commit
1857        ,p_inventory_item_id            => p_inventory_item_id
1858        ,p_organization_id              => p_organization_id
1859        ,p_revision_id                  => p_revision_id
1860        ,p_change_id                    => NULL
1861        ,p_change_line_id               => NULL
1862        ,p_revision_master_controlled   => p_revision_master_controlled
1863        ,p_status_master_controlled     => p_status_master_controlled
1864        ,p_is_master_org                => p_is_master_org
1865        ,p_perform_security_check       => p_perform_security_check
1866        ,x_return_status                => x_return_status
1867        ,x_errorcode                    => x_errorcode
1868        ,x_msg_count                    => x_msg_count
1869        ,x_msg_data                     => x_msg_data
1870        );
1871 
1872 END Implement_Pending_Changes;
1873 
1874 --
1875 -- Created as a part of Fix for 3371749
1876 --
1877 PROCEDURE Implement_Pending_Changes
1878 (
1879      p_api_version                 IN   NUMBER
1880    , p_commit                      IN   VARCHAR2
1881    , p_change_id                   IN   NUMBER
1882    , p_change_line_id              IN   NUMBER
1883    , p_perform_security_check      IN   VARCHAR2  DEFAULT 'F'
1884    , x_return_status               OUT  NOCOPY VARCHAR2
1885    , x_errorcode                   OUT  NOCOPY NUMBER
1886    , x_msg_count                   OUT  NOCOPY NUMBER
1887    , x_msg_data                    OUT  NOCOPY VARCHAR2
1888 )
1889 IS
1890 
1891   l_api_version      NUMBER;
1892   l_api_name         VARCHAR2(50);
1893 
1894   l_revision_master_controlled    VARCHAR2(1);
1895   l_status_master_controlled      VARCHAR2(1);
1896   l_is_master_org                 VARCHAR2(1);
1897 
1898   CURSOR c_get_pending_items (cp_change_id       IN  NUMBER
1899                            ,cp_change_line_id  IN  NUMBER) IS
1900   SELECT *
1901   FROM  mtl_pending_item_status
1902   WHERE implemented_date IS NULL
1903     AND pending_flag = 'Y'
1904     AND change_id = NVL(cp_change_id, change_id)
1905     AND change_line_id = NVL(cp_change_line_id, change_line_id);
1906 
1907 BEGIN
1908 
1909   l_api_version      := 1.0;
1910   l_api_name         := 'Implement_Pending_Changes';
1911   code_debug(' Implement Pending Changes from Change area ');
1912   --Standard checks
1913   IF NOT FND_API.Compatible_API_Call (l_api_version
1914                                      ,p_api_version
1915                                      ,l_api_name
1916                                      ,g_pkg_name)
1917   THEN
1918     RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
1919   END IF;
1920 
1921   IF (p_change_id IS NULL AND p_change_line_id IS NULL) THEN
1922     FND_MESSAGE.Set_name(G_APP_NAME, 'EGO_API_INVALID_PARAMS');
1923     FND_MESSAGE.Set_token('PKG_NAME', G_PKG_NAME);
1924     FND_MESSAGE.Set_Token('PROC_NAME', l_api_name);
1925     x_msg_data := FND_MESSAGE.get();
1926     x_msg_count := 1;
1927     x_return_status := FND_API.G_RET_STS_ERROR;
1928     RETURN;
1929   END IF;
1930 
1931   IF FND_API.To_Boolean(p_commit) THEN
1932     SAVEPOINT Implement_Pending_Changes_SP;
1933   END IF;
1934 
1935   l_revision_master_controlled := FND_API.g_false;
1936   l_status_master_controlled := EGO_ITEM_LC_IMP_PC_PUB.get_master_controlled_status();
1937 
1938   FOR l_item_record IN
1939            c_get_pending_items (cp_change_id      => p_change_id
1940                                ,cp_change_line_id => p_change_line_id)
1941   LOOP
1942 
1943       l_is_master_org := get_master_org_status(l_item_record.ORGANIZATION_ID);
1944       Implement_All_Pending_Changes
1945               (p_api_version                  => p_api_version
1946               ,p_commit                       => FND_API.G_FALSE
1947               ,p_inventory_item_id            => l_item_record.INVENTORY_ITEM_ID
1948               ,p_organization_id              => l_item_record.ORGANIZATION_ID
1949               ,p_revision_id                  => l_item_record.REVISION_ID
1950               ,p_change_id                    => p_change_id
1951               ,p_change_line_id               => p_change_line_id
1952               ,p_revision_master_controlled   => l_revision_master_controlled
1953               ,p_status_master_controlled     => l_status_master_controlled
1954               ,p_is_master_org                => l_is_master_org
1955               ,p_perform_security_check       => p_perform_security_check
1956               ,x_return_status                => x_return_status
1957               ,x_errorcode                    => x_errorcode
1958               ,x_msg_count                    => x_msg_count
1959               ,x_msg_data                     => x_msg_data
1960               );
1961       EXIT WHEN x_return_status <> FND_API.G_RET_STS_SUCCESS;
1962   END LOOP;
1963 
1964   IF x_return_status = FND_API.G_RET_STS_SUCCESS THEN
1965     IF FND_API.To_Boolean(p_commit) THEN
1966       COMMIT WORK;
1967     END IF;
1968   ELSE
1969     IF x_msg_count <>1 THEN
1970       FND_MSG_PUB.Count_And_Get(
1971          p_encoded        => FND_API.G_FALSE,
1972          p_count          => x_msg_count,
1973          p_data           => x_msg_data
1974          );
1975     END IF;
1976   END IF;
1977 
1978 EXCEPTION
1979   WHEN OTHERS THEN
1980     IF c_get_pending_items%ISOPEN THEN
1981       CLOSE c_get_pending_items;
1982     END IF;
1983     IF FND_API.To_Boolean(p_commit) THEN
1984       ROLLBACK TO Implement_Pending_Changes_SP;
1985     END IF;
1986     x_return_status :=  FND_API.G_RET_STS_UNEXP_ERROR;
1987     FND_MESSAGE.Set_Name(g_app_name, g_plsql_err);
1988     FND_MESSAGE.Set_Token(g_pkg_name_token, g_pkg_name);
1989     FND_MESSAGE.Set_Token(g_api_name_token, l_api_name);
1990     FND_MESSAGE.Set_Token(g_sql_err_msg_token, SQLERRM);
1991     FND_MSG_PUB.Add;
1992     FND_MSG_PUB.Count_And_Get(
1993        p_encoded        => FND_API.G_FALSE,
1994        p_count          => x_msg_count,
1995        p_data           => x_msg_data
1996        );
1997 
1998 END Implement_Pending_Changes;
1999 
2000 
2001 PROCEDURE Implement_Pending_Changes_CP
2002 (
2003      ERRBUF                        OUT  NOCOPY VARCHAR2
2004    , RETCODE                       OUT  NOCOPY NUMBER
2005    , p_organization_id             IN   MTL_SYSTEM_ITEMS_B.ORGANIZATION_ID%TYPE
2006    , p_inventory_item_id           IN   MTL_SYSTEM_ITEMS_B.INVENTORY_ITEM_ID%TYPE
2007    , p_revision_code               IN   MTL_ITEM_REVISIONS_B.REVISION%TYPE
2008 )
2009 IS
2010 
2011   TYPE ORG_TABLE IS TABLE OF MTL_SYSTEM_ITEMS_B.ORGANIZATION_ID%TYPE;
2012   TYPE ITEM_TABLE IS TABLE OF MTL_SYSTEM_ITEMS_B.INVENTORY_ITEM_ID%TYPE;
2013   TYPE REV_TABLE IS TABLE OF MTL_ITEM_REVISIONS_B.REVISION%TYPE;
2014 
2015   l_revision_master_controlled    VARCHAR2(1);
2016   l_status_master_controlled      VARCHAR2(1);
2017   l_is_master_org                 VARCHAR2(1);
2018 
2019   l_return_status                 VARCHAR2(1);
2020   l_errorcode                     NUMBER;
2021   l_msg_count                     NUMBER;
2022   l_msg_data                      VARCHAR2(4000);
2023 
2024   l_orgs                          ORG_TABLE;
2025   l_items                         ITEM_TABLE;
2026   l_revs                          REV_TABLE;
2027   l_revision_id                   MTL_ITEM_REVISIONS_B.REVISION_ID%TYPE;
2028   l_master_org                    MTL_ITEM_REVISIONS_B.ORGANIZATION_ID%TYPE;
2029 
2030 l_ret VARCHAR2(1);
2031 l_error_mesg VARCHAR2(4000);
2032 
2033 
2034 BEGIN
2035 
2036   code_debug(' Implement Pending Changes from Concurrent Program ');
2037   SELECT
2038     DECODE(LOOKUP_CODE2, 1, FND_API.G_TRUE, 2, FND_API.G_FALSE, FND_API.G_FALSE) INTO l_status_master_controlled
2039   FROM
2040     MTL_ITEM_ATTRIBUTES_V
2041   WHERE
2042     ATTRIBUTE_NAME = 'MTL_SYSTEM_ITEMS.INVENTORY_ITEM_STATUS_CODE';
2043 
2044   l_revision_master_controlled := FND_API.G_FALSE;
2045 
2046   --If there is no organization id, then do everything
2047   IF p_organization_id IS NULL
2048   THEN
2049 
2050     SELECT
2051       ORGANIZATION_ID BULK COLLECT INTO l_orgs
2052     FROM
2053       ORG_ACCESS_VIEW
2054     WHERE RESPONSIBILITY_ID = FND_GLOBAL.RESP_ID
2055     AND RESP_APPLICATION_ID = FND_GLOBAL.RESP_APPL_ID;
2056 
2057   ELSE
2058 
2059     l_orgs := ORG_TABLE(p_organization_id);
2060 
2061   END IF;
2062 
2063   --For each org
2064   IF (l_orgs IS NOT NULL AND l_orgs.COUNT > 0)
2065   THEN
2066 
2067     FOR org_index IN l_orgs.FIRST..l_orgs.LAST
2068     LOOP
2069 
2070       BEGIN
2071 
2072         --Select the master org
2073         SELECT
2074           MP.MASTER_ORGANIZATION_ID INTO l_master_org
2075         FROM
2076           MTL_PARAMETERS MP
2077         WHERE
2078           MP.ORGANIZATION_ID = l_orgs(org_index);
2079 
2080         l_is_master_org := FND_API.G_FALSE;
2081 
2082         IF l_master_org = l_orgs(org_index)
2083         THEN
2084           l_is_master_org := FND_API.G_TRUE;
2085         END IF;
2086 
2087         --If item is null, then get them all
2088         IF p_inventory_item_id IS NULL
2089         THEN
2090 
2091           SELECT
2092             INVENTORY_ITEM_ID BULK COLLECT INTO l_items
2093           FROM
2094             MTL_SYSTEM_ITEMS_B
2095           WHERE
2096             ORGANIZATION_ID = l_orgs(org_index);
2097 
2098         ELSE
2099 
2100           l_items := ITEM_TABLE(p_inventory_item_id);
2101 
2102         END IF;
2103 
2104         IF (l_items IS NOT NULL AND l_items.COUNT > 0)
2105         THEN
2106 
2107           --For each item
2108           FOR item_index IN l_items.FIRST..l_items.LAST
2109           LOOP
2110 
2111             BEGIN
2112 
2113               IF p_revision_code = 'ALL' OR p_revision_code is NULL
2114               THEN
2115 
2116                 SELECT
2117                   REVISION BULK COLLECT INTO l_revs
2118                 FROM
2119                   MTL_ITEM_REVISIONS_B
2120                 WHERE ORGANIZATION_ID = l_orgs(org_index)
2121                       AND INVENTORY_ITEM_ID = l_items(item_index);
2122 
2123                 --If it's all, then also add a null entry to mean no revision
2124                 --(NULL will do the work of 'ALL' plus 'NONE')
2125                 l_revs.EXTEND();
2126 
2127               ELSIF p_revision_code = 'NONE'
2128               THEN
2129 
2130                 l_revs := REV_TABLE(NULL);
2131 
2132               ELSE
2133 
2134                 l_revs := REV_TABLE(p_revision_code);
2135 
2136               END IF;
2137 
2138               IF (l_revs IS NOT NULL AND l_revs.COUNT > 0)
2139               THEN
2140 
2141                 FOR rev_index IN l_revs.FIRST..l_revs.LAST
2142                 LOOP
2143 
2144                   BEGIN
2145 
2146                     --First we need to get the revision_id
2147                     l_revision_id := NULL;
2148 
2149                     IF l_revs(rev_index) IS NOT NULL
2150                     THEN
2151 
2152                       --Either the master or current
2153                       IF FND_API.To_Boolean(l_revision_master_controlled)
2154                       THEN
2155 
2156                         SELECT
2157                           REVISION_ID INTO l_revision_id
2158                         FROM
2159                           MTL_ITEM_REVISIONS_B
2160                         WHERE
2161                           ORGANIZATION_ID = l_master_org
2162                           AND INVENTORY_ITEM_ID = l_items(item_index)
2163                           AND REVISION = l_revs(rev_index);
2164 
2165                       ELSE
2166 
2167                         SELECT
2168                           REVISION_ID INTO l_revision_id
2169                         FROM
2170                           MTL_ITEM_REVISIONS_B
2171                         WHERE
2172                           ORGANIZATION_ID = l_orgs(org_index)
2173                           AND INVENTORY_ITEM_ID = l_items(item_index)
2174                           AND REVISION = l_revs(rev_index);
2175 
2176                       END IF; -- select rev id
2177 
2178                     END IF; -- if revision is not null
2179 
2180                     Implement_Pending_Changes
2181                     (
2182                           p_api_version                 => 1.0
2183                         , p_inventory_item_id           => l_items(item_index)
2184                         , p_organization_id             => l_orgs(org_index)
2185                         , p_revision_id                 => l_revision_id
2186                         , p_revision_master_controlled  => l_revision_master_controlled
2187                         , p_status_master_controlled    => l_status_master_controlled
2188                         , p_is_master_org               => l_is_master_org
2189                         , p_perform_security_check      => FND_API.G_FALSE
2190                         , x_return_status               => l_return_status
2191                         , x_errorcode                   => l_errorcode
2192                         , x_msg_count                   => l_msg_count
2193                         , x_msg_data                    => l_msg_data
2194                     );
2195 
2196                   EXCEPTION
2197 
2198                     WHEN OTHERS
2199                     THEN
2200                       NULL;
2201 
2202                   END; -- rev block
2203 
2204                 END LOOP; -- for each rev
2205 
2206               END IF;
2207 
2208             EXCEPTION
2209 
2210               WHEN OTHERS
2211               THEN
2212                 NULL;
2213 
2214             END; -- item block
2215 
2216           END LOOP; -- for each item
2217 
2218         END IF; -- if there are any items
2219 
2220       EXCEPTION
2221 
2222         WHEN OTHERS
2223         THEN
2224           NULL;
2225 
2226       END; -- org block
2227 
2228     END LOOP; -- for each org
2229 
2230   END IF; -- if there are any orgs
2231 
2232   RETCODE := G_SUCCESS;
2233   ERRBUF := FND_MESSAGE.Get_String('EGO', 'EGO_IPC_SUCCESS');
2234 
2235 END Implement_Pending_Changes_CP;
2236 
2237 END EGO_ITEM_LC_IMP_PC_PUB;
2238