DBA Data[Home] [Help]

PACKAGE BODY: APPS.ENG_RELATED_ENTITY_PKG

Source


1 package body ENG_RELATED_ENTITY_PKG as
2 /*$Header: ENGRENTB.pls 120.15 2006/09/05 09:32:46 rnarveka noship $ */
3 --  Global constant holding the package name
4 
5 G_PKG_NAME                    CONSTANT VARCHAR2(30) :=
6                               'ENG_RELATED_ENTITY_PKG' ;
7 -- For Debug
8   g_debug_file      UTL_FILE.FILE_TYPE ;
9   g_debug_flag      BOOLEAN      := FALSE ;  -- For TEST : FALSE ;
10   g_output_dir      VARCHAR2(80) := NULL ;
11   g_debug_filename  VARCHAR2(30) := 'eng.chgmt.relationship.log' ;
12   g_debug_errmesg   VARCHAR2(240);
13 
14 
15 change_policy_defined EXCEPTION;
16 duplicate_related_doc EXCEPTION;
17 
18   -- Seeded approval_status_type for change header
19   /********************************************************************
20   * Debug APIs    : Open_Debug_Session, Close_Debug_Session,
21   *                 Write_Debug
22   * Parameters IN :
23   * Parameters OUT:
24   * Purpose       : These procedures are for test and debug
25   *********************************************************************/
26   -- Open_Debug_Session
27   Procedure Open_Debug_Session
28   (  p_output_dir IN VARCHAR2 := NULL
29   ,  p_file_name  IN VARCHAR2 := NULL
30   )
31   IS
32        l_found NUMBER := 0;
33        l_utl_file_dir    VARCHAR2(2000);
34 
35   BEGIN
36 
37        IF p_output_dir IS NOT NULL THEN
38           g_output_dir := p_output_dir ;
39 
40        END IF ;
41 
42        IF p_file_name IS NOT NULL THEN
43           g_debug_filename := p_file_name ;
44        END IF ;
45 
46        IF g_output_dir IS NULL
47        THEN
48 
49            g_output_dir := FND_PROFILE.VALUE('ECX_UTL_LOG_DIR') ;
50 
51        END IF;
52 
53        select  value
54        INTO l_utl_file_dir
55        FROM v$parameter
56        WHERE name = 'utl_file_dir';
57 
58        l_found := INSTR(l_utl_file_dir, g_output_dir);
59 
60        IF l_found = 0
61        THEN
62             RETURN;
63        END IF;
64 
65        g_debug_file := utl_file.fopen(  g_output_dir
66                                       , g_debug_filename
67                                       , 'w');
68        g_debug_flag := TRUE ;
69 
70   EXCEPTION
71       WHEN OTHERS THEN
72          g_debug_errmesg := Substr(To_Char(SQLCODE)||'/'||SQLERRM,1,240);
73          g_debug_flag := FALSE;
74 
75   END Open_Debug_Session ;
76 
77   -- Close Debug_Session
78   Procedure Close_Debug_Session
79   IS
80   BEGIN
81       IF utl_file.is_open(g_debug_file)
82       THEN
83         utl_file.fclose(g_debug_file);
84       END IF ;
85 
86   EXCEPTION
87       WHEN OTHERS THEN
88          g_debug_errmesg := Substr(To_Char(SQLCODE)||'/'||SQLERRM,1,240);
89          g_debug_flag := FALSE;
90 
91   END Close_Debug_Session ;
92 
93   -- Test Debug
94   Procedure Write_Debug
95   (  p_debug_message      IN  VARCHAR2 )
96   IS
97   BEGIN
98 
99       IF utl_file.is_open(g_debug_file)
100       THEN
101        utl_file.put_line(g_debug_file, p_debug_message);
102       END IF ;
103 
104   EXCEPTION
105       WHEN OTHERS THEN
106          g_debug_errmesg := Substr(To_Char(SQLCODE)||'/'||SQLERRM,1,240);
107          g_debug_flag := FALSE;
108 
109   END Write_Debug;
110 --added l_to_current _value as defination change from DOm side.
111 Procedure Implement_Relationship_Changes
112 (
113        p_api_version                IN   NUMBER                             --
114        ,p_init_msg_list             IN   VARCHAR2 := FND_API.G_FALSE        --
115        ,p_commit                    IN   VARCHAR2 := FND_API.G_FALSE        --
116        ,p_validation_level          IN   NUMBER   := FND_API.G_VALID_LEVEL_FULL
117        ,p_debug                     IN   VARCHAR2 := FND_API.G_FALSE        --
118        ,p_output_dir                IN   VARCHAR2 := NULL                   --
119        ,p_debug_filename            IN   VARCHAR2 := 'ENGRENTB.Implement_Relationship_Changes.log'
120        ,x_return_status             OUT  NOCOPY  VARCHAR2                   --
121        ,x_msg_count                 OUT  NOCOPY  NUMBER                     --
122        ,x_msg_data                  OUT  NOCOPY  VARCHAR2                   --
123        ,p_change_id                 IN   NUMBER                             -- header's change_id
124        ,p_entity_id                 IN   NUMBER        --   ed item sequence id
125 )
126 IS
127 l_action_type           VARCHAR2(30);
128 l_from_entity_name      VARCHAR2(40);
129 l_from_pk1_value        VARCHAR2(100);
130 l_from_pk2_value        VARCHAR2(100);
131 l_from_pk3_value        VARCHAR2(100);
132 l_from_pk4_value        VARCHAR2(100);
133 l_from_pk5_value        VARCHAR2(100);
134 l_to_entity_name        VARCHAR2(40);
135 l_to_pk1_value          VARCHAR2(100);
136 l_to_pk2_value          VARCHAR2(100);
137 l_to_current_value     VARCHAR2(100);
138 l_to_pk3_value          VARCHAR2(100);
139 l_to_pk4_value          VARCHAR2(100);
140 l_to_pk5_value          VARCHAR2(100);
141 l_relationship_code     VARCHAR2(30);
142 l_created_by            NUMBER;
143 l_last_update_login     NUMBER;
144 
145 cursor C IS
146    select association_id,action, relationship_code, from_entity_name, from_pk1_value,
147           from_pk2_value, from_pk3_value, from_pk4_value, from_pk5_value,
148           to_entity_name, to_pk1_value, to_pk2_value, to_pk3_value,
149           to_pk4_value, to_pk5_value, created_by, last_update_login,to_current_value
150    from   eng_relationship_changes
151    where  change_id = p_change_id
152    and    entity_id = p_entity_id;
153 
154 
155 l_api_name           CONSTANT VARCHAR2(30)  := 'Implement_Relationship_Changes';
156 l_api_version        CONSTANT NUMBER := 1.0;
157 l_return_status      VARCHAR2(1);
158 l_msg_count          NUMBER;
159 l_msg_data           VARCHAR2(2000);
160 l_message            VARCHAR2(4000);
161 
162 BEGIN
163     -- Standard Start of API savepoint
164     SAVEPOINT   Implement_Relationship_Changes;
165 
166     --If BIS_COLLECTION_UTILITIES.SETUP(p_object_name => 'ENI_OLTP_ITEM_STAR')=false then
167     --RAISE_APPLICATION_ERROR(-20000,errbuf);
168     --End if;
169 
170 
171     -- Standard call to check for call compatibility
172     IF NOT FND_API.Compatible_API_Call ( l_api_version
173                                         ,p_api_version
174                                         ,l_api_name
175                                         ,G_PKG_NAME )
176     THEN
177       RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
178     END IF;
179 
180     -- Initialize message list if p_init_msg_list is set to TRUE.
181     IF FND_API.to_Boolean( p_init_msg_list ) THEN
182        FND_MSG_PUB.initialize;
183     END IF ;
184     -- For Test/Debug
185     IF FND_API.to_Boolean( p_debug ) THEN
186        Open_Debug_Session(p_output_dir, p_debug_filename ) ;
187     END IF ;
188 
189     -- Write debug message if debug mode is on
190     IF g_debug_flag THEN
191        Write_Debug('ENG_RELATED_ENTITY_PKG.Implement_Relationship_Change_log');
192        Write_Debug('-----------------------------------------------------');
193        Write_Debug('p_change_id   : ' || p_change_id );
194        Write_Debug('p_entity_id   : ' || p_entity_id );
195        Write_Debug('-----------------------------------------------------');
196        Write_Debug('Initializing return status... ' );
197     END IF ;
198     -- Initialize API return status to success
199     x_return_status := FND_API.G_RET_STS_SUCCESS;
200 
201 
202     -- Real code starts here -----------------------------------------------
203 
204     -- First check if there are floating versions in the CO to be implemented.
205     -- if there are flaoting version, check its change policy and ensure that
206     -- it is not under CO Required. If it is CO required, the implementation
207     -- should fail.
208 
209     --BIS_COLLECTION_UTILITIES.log('Before Validation');
210     FND_FILE.PUT_LINE(FND_FILE.LOG, 'Checking for floating revision');
211     Validate_floating_revision (
212        p_api_version     => 1
213       ,p_change_id       => p_change_id
214       ,p_rev_item_seq_id => p_entity_id
215       , x_return_status  => l_return_status
216       , x_msg_count      => l_msg_count
217       , x_msg_data       => l_msg_data
218     );
219     FND_FILE.PUT_LINE(FND_FILE.LOG, 'Completed validation');
220     --BIS_COLLECTION_UTILITIES.log('After Validation');
221     --In C cursor l_created_by was getting selected.that was causing un-expected error.
222     FOR REL_CHANGES IN C  LOOP
223 
224         -- Call DOM API with the action
225         -- if action = 'ADD' then the API will add the record in the DOM
226         --   relationship table
227         -- if action = 'DELETE' then the record will be deleted
228         -- If action = 'CHANGE_REVISION' then the revision id will be modified
229         --   for that related document
230         --  added assocaition id for dom changes.
231         FND_FILE.PUT_LINE(FND_FILE.LOG, 'Creating record in DOM tables');
232         DOM_ASSOCIATIONS_UTIL.Implement_Pending_Association(
233 	    p_ASSOCIATION_ID      => REL_CHANGES.association_id,
234             P_ACTION                    =>  REL_CHANGES.action,
235             P_FROM_ENTITY_NAME  =>  REL_CHANGES.from_entity_name,
236             P_FROM_PK1_VALUE     =>  REL_CHANGES.from_pk1_value,
237             P_FROM_PK2_VALUE     =>  REL_CHANGES.from_pk2_value,
238             P_FROM_PK3_VALUE     =>  REL_CHANGES.from_pk3_value,
239             P_FROM_PK4_VALUE     =>  REL_CHANGES.from_pk4_value,
240             P_FROM_PK5_VALUE     =>  REL_CHANGES.from_pk5_value,
241             P_TO_ENTITY_NAME     =>  REL_CHANGES.to_entity_name,
242             P_TO_PK1_VALUE       =>  REL_CHANGES.to_pk1_value,
243             P_TO_PK2_VALUE       =>  REL_CHANGES.to_pk2_value,
244             P_TO_PK3_VALUE       =>  REL_CHANGES.to_pk3_value,
245             P_TO_PK4_VALUE       =>  REL_CHANGES.to_pk4_value,
246             P_TO_PK5_VALUE       =>  REL_CHANGES.to_pk5_value,
247             P_RELATIONSHIP_CODE  =>  REL_CHANGES.relationship_code,
248 	    P_CURRENT_VALUE =>  REL_CHANGES.to_current_value,
249             P_CREATED_BY	 =>  REL_CHANGES.created_by,
250             P_LAST_UPDATE_LOGIN  =>  REL_CHANGES.last_update_login,
251             X_RETURN_STATUS      => l_return_status,
252             X_MSG_COUNT          =>  l_msg_count,
253             X_MSG_DATA           =>  l_msg_data
254          );
255 
256         IF (l_return_status = FND_API.G_RET_STS_UNEXP_ERROR ) THEN
257            RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
258            EXIT;
259         END IF;
260 
261 	 IF ( l_return_status = FND_API.G_RET_STS_ERROR) THEN
262            RAISE duplicate_related_doc;
263            EXIT;
264         END IF;
265        END LOOP;
266 
267   -- Standard ending code ------------------------------------------------
268     FND_MSG_PUB.Count_And_Get
269     ( p_count        =>      x_msg_count,
270       p_data         =>      x_msg_data );
271 
272     IF g_debug_flag THEN
273       Write_Debug('Finish. End Of Proc') ;
274       Close_Debug_Session ;
275     END IF ;
276 
277   EXCEPTION
278    WHEN change_policy_defined THEN
279         ROLLBACK TO Implement_Relationship_Changes;
280         x_return_status := FND_API.G_RET_STS_ERROR;
281         x_msg_count := 1;
282         x_msg_data := 'Error: This Change Order has documents with floating revision that are under change required change policy. Such CO cannot be implemented';
283         -- BIS_COLLECTION_UTILITIES.log('In exception'|| x_msg_data);
284         FND_FILE.PUT_LINE(FND_FILE.LOG, l_msg_data);
285      WHEN duplicate_related_doc THEN
286         ROLLBACK TO Implement_Relationship_Changes;
287         x_return_status := FND_API.G_RET_STS_ERROR;
288         x_msg_count := 1;
289         x_msg_data := 'Error: Duplicate operation on same related document of item . ';
290         FND_FILE.PUT_LINE(FND_FILE.LOG, l_msg_data);
291     WHEN FND_API.G_EXC_ERROR THEN
292           ROLLBACK TO Implement_Relationship_Changes;
293           x_return_status := FND_API.G_RET_STS_ERROR;
294       FND_MSG_PUB.Count_And_Get
295         ( p_count        =>      l_msg_count
296        ,p_data         =>      l_msg_data );
297         --BIS_COLLECTION_UTILITIES.log('In exception'|| l_msg_data);
298         FND_FILE.PUT_LINE(FND_FILE.LOG, l_msg_data);
299       IF g_debug_flag THEN
300         Write_Debug('Error Msg ' || l_msg_data);
301         Write_Debug('Rollback and Finish with expected error.') ;
302         Close_Debug_Session ;
303       END IF ;
304     WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
305             ROLLBACK TO Implement_Relationship_Changes;
306             x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
307       FND_MSG_PUB.Count_And_Get
308         ( p_count        =>      l_msg_count
309        ,p_data         =>      l_msg_data );
310         FND_FILE.PUT_LINE(FND_FILE.LOG, l_msg_data);
311       IF g_debug_flag THEN
312         Write_Debug('Error Msg ' || l_msg_data);
313         Write_Debug('Rollback and Finish with unexpected error.') ;
314         Close_Debug_Session ;
315       END IF ;
316     WHEN OTHERS THEN
317           ROLLBACK TO Implement_Relationship_Changes;
318             x_return_status := FND_API.G_RET_STS_UNEXP_ERROR ;
319           IF FND_MSG_PUB.Check_Msg_Level ( FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR )
320       THEN
321         FND_MSG_PUB.Add_Exc_Msg (       G_PKG_NAME, l_api_name );
322                   END IF;
323       FND_MSG_PUB.Count_And_Get
324         ( p_count        =>      l_msg_count
325        ,p_data         =>      l_msg_data );
326         FND_FILE.PUT_LINE(FND_FILE.LOG, l_msg_data);
327       IF g_debug_flag THEN
328         Write_Debug('Error Msg ' || l_msg_data);
329         Write_Debug('Rollback and Finish with other error.') ;
330         Close_Debug_Session ;
331       END IF ;
332 
333   END Implement_Relationship_Changes;
334 
335 -- Procedure to check if the floating revision is under change control
336 -- change policy.
337 
338 Procedure Validate_floating_revision (
339     p_api_version               IN   NUMBER
340    ,p_change_id                 IN   NUMBER
341    ,p_rev_item_seq_id           IN   NUMBER  := NULL
342    ,x_return_status             OUT  NOCOPY  VARCHAR2
343    ,x_msg_count                 OUT  NOCOPY  NUMBER
344    ,x_msg_data                  OUT  NOCOPY  VARCHAR2
345 )
346 IS
347    Cursor get_floating_revisions(l_change_id NUMBER,
348                                  l_revised_item_seq_id NUMBER) is
349    select change_id, entity_id, b.category_id,
350           from_pk1_value pk1_value, from_pk2_value pk2_value,
351           from_pk3_value pk3_value
352      from eng_relationship_changes a, dom_documents b
353     where a.change_id = l_change_id
354       and a.to_pk1_value = b.document_id
355       and to_pk2_value = -1                 -- for floating revision documents
356       and action in ('ADD','CHANGE_REVISION')
357       and entity_id in (select decode(l_revised_item_seq_id,null,                                       (select revised_item_sequence_id
358                                           from eng_revised_items
359                                          where change_id = a.change_id),
360                                              l_revised_item_seq_id)  from dual);
361 
362    l_change_id           NUMBER;
363    l_revised_item_seq_id NUMBER;
364    l_change_policy       VARCHAR2(100);
365    l_api_name            VARCHAR2(100) := 'Validate_floating_revision';
366 
367 BEGIN
368    SAVEPOINT Implement_Relationship_Changes;
369 
370     -- Initialize API return status to success
371     x_return_status := FND_API.G_RET_STS_SUCCESS;
372 
373    l_change_id := p_change_id;
374    l_revised_item_seq_id := p_rev_item_seq_id;
375 
376    FND_FILE.PUT_LINE(FND_FILE.LOG, 'Validating floating revision');
377 
378    FOR c2 in get_floating_revisions(l_change_id, l_revised_item_seq_id)
379    LOOP
380 
381      BEGIN
382 
383      -- The foll. SQL checks if the category passed has changepolicy defined
384      -- on it or not
385      SELECT ecp.policy_char_value INTO l_change_policy
386        FROM
387     (select nvl(mirb.lifecycle_id, msi.lifecycle_id) as lifecycle_id,
388        nvl(mirb.current_phase_id , msi.current_phase_id) as phase_id,
389        msi.item_catalog_group_id item_catalog_group_id,
390        msi.inventory_item_id, msi.organization_id , mirb.revision_id
391      from mtl_item_revisions_b mirb,
392           MTL_SYSTEM_ITEMS msi
393      where mirb.INVENTORY_ITEM_ID(+) = msi.INVENTORY_ITEM_ID
394        and mirb.ORGANIZATION_ID(+)= msi.ORGANIZATION_ID
395        and mirb.revision_id(+) = c2.pk3_value
396        and msi.INVENTORY_ITEM_ID = c2.pk2_value
397        and msi.ORGANIZATION_ID = c2.pk1_value) ITEM_DTLS,
398       ENG_CHANGE_POLICIES_V ECP
399     WHERE
400      ecp.policy_object_pk1_value =
401          (SELECT TO_CHAR(ic.item_catalog_group_id)
402             FROM mtl_item_catalog_groups_b ic
403            WHERE EXISTS (SELECT olc.object_classification_code CatalogId
404                            FROM EGO_OBJ_TYPE_LIFECYCLES olc
405                           WHERE olc.object_id = (SELECT OBJECT_ID
406                                                    FROM fnd_objects
407                                                   WHERE obj_name = 'EGO_ITEM')
408                             AND  olc.lifecycle_id = ITEM_DTLS.lifecycle_id
409                             AND olc.object_classification_code = ic.item_catalog_group_id
410                          )
411             AND ROWNUM = 1
412             CONNECT BY PRIOR parent_catalog_group_id = item_catalog_group_id
413             START WITH item_catalog_group_id = ITEM_DTLS.item_catalog_group_id)
414      AND ecp.policy_object_pk2_value = ITEM_DTLS.lifecycle_id
415      AND ecp.policy_object_pk3_value = ITEM_DTLS.phase_id
416      and ecp.policy_object_name = 'CATALOG_LIFECYCLE_PHASE'
417      and ecp.attribute_object_name = 'EGO_CATALOG_GROUP'
418      and ecp.attribute_code = 'AML_RULE'
419      and ecp.attribute_number_value = 2;
420 
421      IF l_change_policy = 'CHANGE_ORDER_REQUIRED' THEN
422         RAISE change_policy_defined;
423         ROLLBACK TO Implement_Relationship_Changes;
424         FND_FILE.PUT_LINE(FND_FILE.LOG, 'Change policy required exception');
425      END IF;
426 
427      EXCEPTION
428        WHEN NO_DATA_FOUND THEN -- no data found means there are no change
429                                -- policy defined for the category
430          null;
431      END;
432 
433    END LOOP;
434 
435 END Validate_floating_revision;
436 
437 END ENG_RELATED_ENTITY_PKG;