DBA Data[Home] [Help]

PACKAGE BODY: APPS.OKC_MANAGE_DELIVERABLES_GRP

Source


1 PACKAGE BODY OKC_MANAGE_DELIVERABLES_GRP AS
2 /* $Header: OKCGMDLB.pls 120.1.12010000.4 2008/11/14 13:31:08 strivedi ship $ */
3 
4   ---------------------------------------------------------------------------
5   -- TYPE Definitions
6   ---------------------------------------------------------------------------
7   ---------------------------------------------------------------------------
8   -- Global VARIABLES
9   ---------------------------------------------------------------------------
10     G_PKG_NAME             CONSTANT VARCHAR2(200) := 'OKC_MANAGE_DELIVERABLES_GRP';
11     G_APP_NAME             CONSTANT VARCHAR2(3)   :=  OKC_API.G_APP_NAME;
12     g_module CONSTANT VARCHAR2(250) := 'okc.plsql.'||g_pkg_name||'.';
13     G_ENTITY_NAME             CONSTANT VARCHAR2(40)   :=  'OKC_DELIVERABLES';
14 
15   ------------------------------------------------------------------------------
16   -- GLOBAL CONSTANTS
17  ------------------------------------------------------------------------------
18     G_FALSE                      CONSTANT   VARCHAR2(1) := FND_API.G_FALSE;
19     G_TRUE                       CONSTANT   VARCHAR2(1) := FND_API.G_TRUE;
20     G_RET_STS_SUCCESS            CONSTANT   VARCHAR2(1) := FND_API.G_RET_STS_SUCCESS;
21     G_RET_STS_ERROR              CONSTANT   VARCHAR2(1) := FND_API.G_RET_STS_ERROR;
22     G_RET_STS_UNEXP_ERROR        CONSTANT   VARCHAR2(1) := FND_API.G_RET_STS_UNEXP_ERROR;
23     G_SQLERRM_TOKEN              CONSTANT   VARCHAR2(200) := 'ERROR_MESSAGE';
24     G_SQLCODE_TOKEN              CONSTANT   VARCHAR2(200) := 'ERROR_CODE';
25   ---------------------------------------------------------------------------
26   -- START: Helper Procedures and Functions
27   ---------------------------------------------------------------------------
28 
29    /**
30    * This helper procedure check for status history record already in
31    * okc_del_status_history table, if not, creates a new status history
32    * record for given Status.
33    */
34    PROCEDURE checkAndCreateStatusHistory (
35    p_deliverable_id            IN NUMBER,
36    p_deliverable_status        IN VARCHAR2,
37    x_msg_data                  OUT NOCOPY  VARCHAR2,
38    x_msg_count                 OUT NOCOPY  NUMBER,
39    x_return_status             OUT NOCOPY  VARCHAR2)
40    IS
41        l_api_version                CONSTANT NUMBER := 1;
42        l_api_name                   CONSTANT VARCHAR2(30) := 'checkAndCreateStatusHistory';
43        l_del_row_count PLS_INTEGER;
44     BEGIN
45 
46        l_del_row_count := 0;
47 
48        -- check for existing status history record
49        SELECT count(*) into l_del_row_count
50        FROM okc_del_status_history
51        WHERE deliverable_id = p_deliverable_id
52        AND   deliverable_status = p_deliverable_status;
53 
54        IF l_del_row_count = 0 THEN
55 
56            -- create status history record
57            OKC_DELIVERABLE_PROCESS_PVT.create_del_status_history(
58                 p_api_version => l_api_version,
59                 p_init_msg_list => G_FALSE,
60                 p_del_id        => p_deliverable_id,
61                 p_deliverable_status  =>  p_deliverable_status,
62                 x_msg_data      => x_msg_data,
63                 x_msg_count     => x_msg_count,
64                 x_return_status => x_return_status);
65 
66             IF ( FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
67                  FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE ,g_module||l_api_name,'701a: Finished OKC_DELIVERABLE_PROCESS_PVT.create_del_status_history'||x_return_status);
68             END IF;
69             IF (x_return_status = G_RET_STS_UNEXP_ERROR) THEN
70                  RAISE FND_API.G_EXC_UNEXPECTED_ERROR ;
71             ELSIF (x_return_status = G_RET_STS_ERROR) THEN
72                  RAISE FND_API.G_EXC_ERROR ;
73             END IF;
74        END IF;
75 
76     EXCEPTION
77     WHEN FND_API.G_EXC_ERROR THEN
78           IF ( FND_LOG.LEVEL_ERROR >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
79             FND_LOG.STRING( FND_LOG.LEVEL_ERROR ,g_module||l_api_name,'100: leaving with G_EXC_ERROR');
80           END IF;
81     x_return_status := G_RET_STS_ERROR;
82       FND_MSG_PUB.Count_And_Get(
83         p_count =>  x_msg_count,
84         p_data  =>  x_msg_data
85         );
86 
87     WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
88           IF ( FND_LOG.LEVEL_UNEXPECTED >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
89             FND_LOG.STRING( FND_LOG.LEVEL_UNEXPECTED ,g_module||l_api_name,'100: leaving with G_EXC_UNEXPECTED_ERROR');
90           END IF;
91     x_return_status := G_RET_STS_UNEXP_ERROR;
92       FND_MSG_PUB.Count_And_Get(
93         p_count =>  x_msg_count,
94         p_data  =>  x_msg_data
95         );
96 
97     WHEN OTHERS THEN
98           IF ( FND_LOG.LEVEL_UNEXPECTED >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
99             FND_LOG.STRING( FND_LOG.LEVEL_UNEXPECTED ,g_module||l_api_name,'100: leaving with G_EXC_UNEXPECTED_ERROR');
100           END IF;
101     x_return_status := G_RET_STS_UNEXP_ERROR;
102       IF FND_MSG_PUB.Check_Msg_Level(FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR) THEN                                 FND_MSG_PUB.Add_Exc_Msg(G_PKG_NAME,l_api_name);
103       END IF;
104       FND_MSG_PUB.Count_And_Get(
105         p_count =>  x_msg_count,
106         p_data  =>  x_msg_data
107         );
108     END; -- checkAndCreateStatusHistory
109 
110    /**
111     * Helper method to return proper number value for the day of month.
112     * the stored code returns like DOFMXX
113     */
114    FUNCTION getDayOfMonth(p_code IN VARCHAR2)
115    return NUMBER
116    IS
117         l_day_of_month number;
118    BEGIN
119      -- initialize
120      l_day_of_month := -1;
121 
122        -- if input code is not null
123        IF p_code is not null THEN
124         IF p_code = 'LDOFM' THEN
125          return 99;
126         ELSE
127          l_day_of_month := substr(p_code, 5);
128          return (l_day_of_month);
129         END IF;
130        END IF;
131        return NULL;
132    END;
133 
134    /**
135     * Helper method to return correct status of new deliverable instances
136     * This method checks, if status of any deliverable intance is 'INACTIVE', the case
137     * where Instances remain INACTIVE, hence new generated instances should be of
138     * same status.
139     */
140    FUNCTION checkStatusOfExistingInstances(p_bus_doc_id IN NUMBER,
141                                            p_bus_doc_type IN VARCHAR2,
142                                            p_bus_doc_version IN NUMBER,
143                                            p_del_id IN NUMBER)
144    return VARCHAR2
145    IS
146      l_api_name CONSTANT VARCHAR2(50) := 'checkStatusOfExistingInstances';
147      l_del_status OKC_DELIVERABLES.deliverable_status%TYPE;
148    BEGIN
149 
150     -- initialize
151     l_del_status := null;
152 
153         IF ( FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
154             FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE ,g_module||l_api_name,'100: INTO '||G_PKG_NAME ||'.'||l_api_name);
155             FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE ,g_module||l_api_name,'101: doc id '||p_bus_doc_id);
156             FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE ,g_module||l_api_name,'102: doc type '||p_bus_doc_type);
157             FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE ,g_module||l_api_name,'103: doc version '||p_bus_doc_version);
158             FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE ,g_module||l_api_name,'104: del id '||p_del_id);
159         END IF;
160 
161        SELECT deliverable_status into l_del_status
162        FROM okc_deliverables
163        WHERE business_document_id = p_bus_doc_id
164        AND   business_document_type = p_bus_doc_type
165        AND   business_document_version = p_bus_doc_version
166        AND   recurring_del_parent_id = p_del_id
167        AND   rownum = 1;
168 
169        IF l_del_status is not null THEN
170             IF ( FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
171                 FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE ,g_module||l_api_name,'105: Status returning '||l_del_status);
172             END IF;
173 
174          IF l_del_status = 'INACTIVE' THEN
175             return 'INACTIVE';
176          ELSE
177            return 'OPEN';
178          END IF;
179        END IF;
180        return NULL;
181 
182     EXCEPTION
183         WHEN OTHERS THEN
184         IF ( FND_LOG.LEVEL_UNEXPECTED >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
185             FND_LOG.STRING( FND_LOG.LEVEL_UNEXPECTED ,g_module||l_api_name,'1000: Leaving '||G_PKG_NAME ||'.'||l_api_name);
186         END IF;
187       Okc_Api.Set_Message(G_APP_NAME,
188                         'OKC_DEL_ERR_CHK_INSTS_STS');
189         RAISE FND_API.G_EXC_ERROR;
190    END;
191 
192    /**
193     * Helper method to return 'Y' if recurring deliverable definition already
194     * has instances in place for given bus doc version.
195     */
196    FUNCTION hasInstances(p_bus_doc_id IN NUMBER,
197                          p_bus_doc_type IN VARCHAR2,
198                          p_bus_doc_version IN NUMBER,
199                          p_del_id IN NUMBER)
200    return VARCHAR2
201    IS
202      l_del_row_count number;
203    BEGIN
204        -- initialize
205        l_del_row_count := 0;
206        SELECT count(*) into l_del_row_count
207        FROM okc_deliverables
208        WHERE business_document_id = p_bus_doc_id
209        AND   business_document_type = p_bus_doc_type
210        AND   business_document_version = p_bus_doc_version
211        AND   recurring_del_parent_id = p_del_id;
212 
213        IF l_del_row_count > 0 THEN
214         return 'Y';
215        ELSE
216         return 'N';
217        END IF;
218        return NULL;
219    END;
220 
221    /**
222     * Helper method to generate recurring deliverable instances and return
223     * table of records containing deliverable details
224     */
225    PROCEDURE generate_del_instances(
226                                    p_recurr_start_date IN DATE,
227                                    p_recurr_end_date IN DATE,
228                                    p_repeat_duration IN NUMBER,
229                                    p_repeat_day_of_month IN NUMBER,
230                                    p_repeat_day_of_week IN NUMBER,
231                                    delRecord okc_deliverables%ROWTYPE,
232                                    p_change_status_to IN VARCHAR2)
233    IS
234 
235    --- for recurring dates
236    l_recurring_dates OKC_DELIVERABLE_PROCESS_PVT.recurring_dates_tab_type;
237    delInstanceRecTab OKC_DELIVERABLE_PROCESS_PVT.delRecTabType;
238 
239    l_api_version     CONSTANT VARCHAR2(30) := 1;
240    l_api_name        CONSTANT VARCHAR2(30) := 'generate_del_instances';
241 
242    l_msg_data VARCHAR2(30);
243    l_msg_count NUMBER;
244    l_return_status VARCHAR2(1);
245    l_manage_yn VARCHAR2(1);
246 
247    j PLS_INTEGER;
248    st_hist_count PLS_INTEGER;
249    st_hist_count1 PLS_INTEGER;
250    del_count PLS_INTEGER;
251 
252    TYPE DelIdList IS TABLE OF NUMBER
253    INDEX BY BINARY_INTEGER;
254    deliverableIds DelIdList;
255 
256    delStsTab OKC_DELIVERABLE_PROCESS_PVT.delHistTabType;
257    delStsTab1 OKC_DELIVERABLE_PROCESS_PVT.delHistTabType;
258 
259    BEGIN
260 
261     -- initialize
262     l_manage_yn := 'N';
263     j := 0;
264     del_count := 0;
265     st_hist_count := 0;
266     st_hist_count1 := 0;
267 
268     IF ( FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
269         FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE ,g_module||l_api_name,'100: Entered '||G_PKG_NAME ||'.'||l_api_name);
270         FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE ,g_module||l_api_name,'200: Recurr start date'||p_recurr_start_date);
271         FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE ,g_module||l_api_name,'300: p_recurr_end_date'||p_recurr_end_date);
272         FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE ,g_module||l_api_name,'400: p_repeat_day_of_month'||p_repeat_day_of_month);
273         FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE ,g_module||l_api_name,'500: p_change_status_to'||p_change_status_to);
274     END IF;
275 
276        IF ( FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
277            FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE ,g_module||l_api_name,'501: Calling getRecurringDates');
278        END IF;
279         --- Calculate recurring instances
280         OKC_DELIVERABLE_PROCESS_PVT.get_recurring_dates(
281                       p_api_version => l_api_version,
282                       p_init_msg_list => G_FALSE,
283                       p_start_date => p_recurr_start_date,
284                       p_end_date => p_recurr_end_date,
285                       p_frequency => p_repeat_duration,
286                       p_recurr_day_of_month => p_repeat_day_of_month,
287                       p_recurr_day_of_week => p_repeat_day_of_week,
288                       x_recurr_dates => l_recurring_dates,
289                       x_msg_data => l_msg_data,
290                       x_msg_count => l_msg_count,
291                       x_return_status => l_return_status);
292        IF ( FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
293            FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE ,g_module||l_api_name,'600: Finished recurring dates api'||l_return_status);
294        END IF;
295 
296        -- check status
297        IF (l_return_status = G_RET_STS_UNEXP_ERROR) THEN
298            RAISE FND_API.G_EXC_UNEXPECTED_ERROR ;
299        ELSIF (l_return_status = G_RET_STS_ERROR) THEN
300            RAISE FND_API.G_EXC_ERROR ;
301        END IF;
302 
303        IF ( FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
304            FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE ,g_module||l_api_name,'601: Recurr Dates Count'||l_recurring_dates.count);
305        END IF;
306 
307       IF l_recurring_dates.count > 0 THEN
308         --- loop through returned dates
309         FOR m IN l_recurring_dates.FIRST..l_recurring_dates.LAST LOOP
310 
311             j := j+1;
312             --- Set the deliverable definition to the new instance
313             delInstanceRecTab(j) := delRecord;
314 
315             --- set the deliverable id
316             select okc_deliverable_id_s.nextval
317             INTO delInstanceRecTab(j).deliverable_id from dual;
318 
319             --- set the actual due date to the new instance
320             delInstanceRecTab(j).actual_due_date :=
321                                 l_recurring_dates(m);
322 
323             --- set/reset other deliverable attributes
324             delInstanceRecTab(j).recurring_yn := 'N';
325 
326             -- NULL out definition columns
327             delInstanceRecTab(j).amendment_operation := NULL;
328             delInstanceRecTab(j).amendment_notes := NULL;
329             delInstanceRecTab(j).summary_amend_operation_code := NULL;
330             delInstanceRecTab(j).last_amendment_date := NULL;
331             delInstanceRecTab(j).start_event_date := NULL;
332             delInstanceRecTab(j).end_event_date := NULL;
333 
334             -- set the original deliverable id as the original deliverable id
335             -- on recurring deliverable definition
336             delInstanceRecTab(j).original_deliverable_id :=
337                                delRecord.original_deliverable_id;
338 
339             -- set the recurring del parent id as the deliverable id
340             -- of recurring deliverable definition
341             delInstanceRecTab(j).recurring_del_parent_id :=
342                                           delRecord.deliverable_id;
343 
344             -- copy attachments from the definition, if any
345             -- check if attachments exists
346             IF OKC_DELIVERABLE_PROCESS_PVT.attachment_exists(
347                                         p_entity_name => G_ENTITY_NAME,
351                  FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE ,g_module||l_api_name,'6011: Call Copy Attachments ');
348                                         p_pk1_value   =>  delRecord.deliverable_id ) THEN
349 
350               IF ( FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
352               END IF;
353 
354                -- copy attachments
355                -- bug#3667712 added X_CREATED_BY,X_LAST_UPDATE_LOGIN params
356                fnd_attached_documents2_pkg.copy_attachments(
357                      X_from_entity_name =>  G_ENTITY_NAME,
358                      X_from_pk1_value   =>  delRecord.deliverable_id,
359                      X_to_entity_name   =>  G_ENTITY_NAME,
360                      X_to_pk1_value     =>  to_char(delInstanceRecTab(j).deliverable_id),
361                      X_CREATED_BY       =>  FND_GLOBAL.User_id,
362                      X_LAST_UPDATE_LOGIN => Fnd_Global.Login_Id);
363               IF ( FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
364                  FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE ,g_module||l_api_name,'6012: Done Copy Attachments ');
365               END IF;
366 
367             END IF;
368 
369             -- set status history record for INACTIVE status
370             st_hist_count := st_hist_count+1;
371             delStsTab(st_hist_count).deliverable_id := delInstanceRecTab(j).deliverable_id;
372             delStsTab(st_hist_count).deliverable_status:= 'INACTIVE';
373             delStsTab(st_hist_count).status_change_date:= sysdate;
374             delStsTab(st_hist_count).status_change_notes:= null;
375             delStsTab(st_hist_count).object_version_number:= 1;
376             delStsTab(st_hist_count).created_by:= Fnd_Global.User_Id;
377             delStsTab(st_hist_count).creation_date := sysdate;
378             delStsTab(st_hist_count).last_updated_by:= Fnd_Global.User_Id;
379             delStsTab(st_hist_count).last_update_date := sysdate;
380             delStsTab(st_hist_count).last_update_login := Fnd_Global.Login_Id;
381 
382             --- set the status, if required from updateDeliverables
383             IF (p_change_status_to is not null) AND (p_change_status_to = 'OPEN') THEN
384 
385               --- change status of this new deliverable and add new status history
386               --- record
387               IF ( FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
388                  FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE ,g_module||l_api_name,'602: Change status of this new deliverable '||delInstanceRecTab(j).deliverable_id);
389               END IF;
390 
391               delInstanceRecTab(j).deliverable_status := p_change_status_to;
392               delInstanceRecTab(j).manage_yn := 'Y';
393 
394               IF ( FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
395                    FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE ,g_module||l_api_name,'607: Set Deliverable status history record to OPEN ');
396               END IF;
397 
398               -- set status history record for OPEN status
399               st_hist_count1 := st_hist_count1+1;
400               delStsTab1(st_hist_count1).deliverable_id := delInstanceRecTab(j).deliverable_id;
401               delStsTab1(st_hist_count1).deliverable_status:= p_change_status_to;
402               delStsTab1(st_hist_count1).status_change_date:= sysdate;
403               delStsTab1(st_hist_count1).status_change_notes:= null;
404               delStsTab1(st_hist_count1).object_version_number:= 1;
405               delStsTab1(st_hist_count1).created_by:= Fnd_Global.User_Id;
406               delStsTab1(st_hist_count1).creation_date := sysdate;
407               delStsTab1(st_hist_count1).last_updated_by:= Fnd_Global.User_Id;
408               delStsTab1(st_hist_count1).last_update_date := sysdate;
409               delStsTab1(st_hist_count1).last_update_login := Fnd_Global.Login_Id;
410 
411              END IF;
412             --- set object version number
413             delInstanceRecTab(j).object_version_number:= 1;
414 
415             --- set who columns
416             delInstanceRecTab(j).created_by:= Fnd_Global.User_Id;
417             delInstanceRecTab(j).creation_date := sysdate;
418             delInstanceRecTab(j).last_updated_by:= Fnd_Global.User_Id;
419             delInstanceRecTab(j).last_update_date := sysdate;
420             delInstanceRecTab(j).last_update_login := Fnd_Global.Login_Id;
421        END LOOP;
422        END IF;
423 
424        IF ( FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
425            FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE ,g_module||l_api_name,'603: END of Loop, creating Instances -- count '||delInstanceRecTab.count);
426            FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE ,g_module||l_api_name,'604: Bulk Inserting Instances Records ');
427        END IF;
428         --- bulk insert for deliverable's recurring instances and
429       --- actual due date
430           IF delInstanceRecTab.count > 0 THEN
431 
432          FOR i IN delInstanceRecTab.FIRST..delInstanceRecTab.LAST LOOP
433          INSERT INTO okc_deliverables
434          (DELIVERABLE_ID,
435           BUSINESS_DOCUMENT_TYPE      ,
436           BUSINESS_DOCUMENT_ID        ,
437           BUSINESS_DOCUMENT_NUMBER    ,
438           DELIVERABLE_TYPE            ,
439           RESPONSIBLE_PARTY           ,
440           INTERNAL_PARTY_CONTACT_ID   ,
441           EXTERNAL_PARTY_CONTACT_ID   ,
442           DELIVERABLE_NAME            ,
443           DESCRIPTION                 ,
444           COMMENTS                    ,
445           DISPLAY_SEQUENCE            ,
446           FIXED_DUE_DATE_YN           ,
447           ACTUAL_DUE_DATE             ,
448           PRINT_DUE_DATE_MSG_NAME     ,
449           RECURRING_YN                ,
450           NOTIFY_PRIOR_DUE_DATE_VALUE ,
451           NOTIFY_PRIOR_DUE_DATE_UOM   ,
452           NOTIFY_PRIOR_DUE_DATE_YN    ,
453           NOTIFY_COMPLETED_YN         ,
454           NOTIFY_OVERDUE_YN           ,
455           NOTIFY_ESCALATION_YN        ,
456           NOTIFY_ESCALATION_VALUE     ,
457           NOTIFY_ESCALATION_UOM       ,
458           ESCALATION_ASSIGNEE         ,
459           AMENDMENT_OPERATION         ,
460           PRIOR_NOTIFICATION_ID       ,
461           AMENDMENT_NOTES             ,
462           COMPLETED_NOTIFICATION_ID   ,
463           OVERDUE_NOTIFICATION_ID     ,
464           ESCALATION_NOTIFICATION_ID  ,
465           LANGUAGE                    ,
466           ORIGINAL_DELIVERABLE_ID     ,
467           REQUESTER_ID                ,
468           EXTERNAL_PARTY_ID           ,
469           EXTERNAL_PARTY_ROLE         ,
470           RECURRING_DEL_PARENT_ID      ,
471           BUSINESS_DOCUMENT_VERSION   ,
472           RELATIVE_ST_DATE_DURATION   ,
473           RELATIVE_ST_DATE_UOM        ,
474           RELATIVE_ST_DATE_EVENT_ID   ,
475           RELATIVE_END_DATE_DURATION  ,
476           RELATIVE_END_DATE_UOM       ,
477           RELATIVE_END_DATE_EVENT_ID  ,
478           REPEATING_DAY_OF_MONTH      ,
479           REPEATING_DAY_OF_WEEK       ,
480           REPEATING_FREQUENCY_UOM     ,
481           REPEATING_DURATION          ,
482           FIXED_START_DATE            ,
483           FIXED_END_DATE              ,
484           MANAGE_YN                   ,
485           INTERNAL_PARTY_ID           ,
486           DELIVERABLE_STATUS          ,
487           STATUS_CHANGE_NOTES         ,
488           CREATED_BY                  ,
489           CREATION_DATE               ,
490           LAST_UPDATED_BY             ,
491           LAST_UPDATE_DATE            ,
492           LAST_UPDATE_LOGIN           ,
493           OBJECT_VERSION_NUMBER       ,
494           ATTRIBUTE_CATEGORY          ,
495           ATTRIBUTE1                  ,
496           ATTRIBUTE2                  ,
497           ATTRIBUTE3                  ,
498           ATTRIBUTE4                  ,
499           ATTRIBUTE5                  ,
500           ATTRIBUTE6                  ,
501           ATTRIBUTE7                  ,
502           ATTRIBUTE8                  ,
503           ATTRIBUTE9                  ,
504           ATTRIBUTE10                 ,
505           ATTRIBUTE11                 ,
506           ATTRIBUTE12                 ,
507           ATTRIBUTE13                 ,
508           ATTRIBUTE14                 ,
509           ATTRIBUTE15                 ,
510           DISABLE_NOTIFICATIONS_YN    ,
511           LAST_AMENDMENT_DATE         ,
512           BUSINESS_DOCUMENT_LINE_ID   ,
513           EXTERNAL_PARTY_SITE_ID      ,
514           START_EVENT_DATE            ,
515           END_EVENT_DATE              ,
516           SUMMARY_AMEND_OPERATION_CODE,
517           PAY_HOLD_PRIOR_DUE_DATE_VALUE,
518           PAY_HOLD_PRIOR_DUE_DATE_UOM,
519           PAY_HOLD_PRIOR_DUE_DATE_YN,
520           PAY_HOLD_OVERDUE_YN
521           )
522          VALUES (
523                 delInstanceRecTab(i).DELIVERABLE_ID,
524                 delInstanceRecTab(i).BUSINESS_DOCUMENT_TYPE      ,
525                 delInstanceRecTab(i).BUSINESS_DOCUMENT_ID        ,
526                 delInstanceRecTab(i).BUSINESS_DOCUMENT_NUMBER    ,
527                 delInstanceRecTab(i).DELIVERABLE_TYPE            ,
528                 delInstanceRecTab(i).RESPONSIBLE_PARTY           ,
529                 delInstanceRecTab(i).INTERNAL_PARTY_CONTACT_ID   ,
530                 delInstanceRecTab(i).EXTERNAL_PARTY_CONTACT_ID   ,
531                 delInstanceRecTab(i).DELIVERABLE_NAME            ,
535                 delInstanceRecTab(i).FIXED_DUE_DATE_YN           ,
532                 delInstanceRecTab(i).DESCRIPTION                 ,
533                 delInstanceRecTab(i).COMMENTS                    ,
534                 delInstanceRecTab(i).DISPLAY_SEQUENCE            ,
536                 delInstanceRecTab(i).ACTUAL_DUE_DATE             ,
537                 delInstanceRecTab(i).PRINT_DUE_DATE_MSG_NAME     ,
538                 delInstanceRecTab(i).RECURRING_YN                ,
539                 delInstanceRecTab(i).NOTIFY_PRIOR_DUE_DATE_VALUE ,
540                 delInstanceRecTab(i).NOTIFY_PRIOR_DUE_DATE_UOM   ,
541                 delInstanceRecTab(i).NOTIFY_PRIOR_DUE_DATE_YN    ,
542                 delInstanceRecTab(i).NOTIFY_COMPLETED_YN         ,
543                 delInstanceRecTab(i).NOTIFY_OVERDUE_YN           ,
544                 delInstanceRecTab(i).NOTIFY_ESCALATION_YN        ,
545                 delInstanceRecTab(i).NOTIFY_ESCALATION_VALUE     ,
546                 delInstanceRecTab(i).NOTIFY_ESCALATION_UOM       ,
547                 delInstanceRecTab(i).ESCALATION_ASSIGNEE         ,
548                 delInstanceRecTab(i).AMENDMENT_OPERATION         ,
549                 delInstanceRecTab(i).PRIOR_NOTIFICATION_ID       ,
550                 delInstanceRecTab(i).AMENDMENT_NOTES             ,
551                 delInstanceRecTab(i).COMPLETED_NOTIFICATION_ID   ,
552                 delInstanceRecTab(i).OVERDUE_NOTIFICATION_ID     ,
553                 delInstanceRecTab(i).ESCALATION_NOTIFICATION_ID  ,
554                 delInstanceRecTab(i).LANGUAGE                    ,
555                 delInstanceRecTab(i).ORIGINAL_DELIVERABLE_ID     ,
556                 delInstanceRecTab(i).REQUESTER_ID                ,
557                 delInstanceRecTab(i).EXTERNAL_PARTY_ID           ,
558                 delInstanceRecTab(i).EXTERNAL_PARTY_ROLE         ,
559                 delInstanceRecTab(i).RECURRING_DEL_PARENT_ID     ,
560                 delInstanceRecTab(i).BUSINESS_DOCUMENT_VERSION   ,
561                 delInstanceRecTab(i).RELATIVE_ST_DATE_DURATION   ,
562                 delInstanceRecTab(i).RELATIVE_ST_DATE_UOM        ,
563                 delInstanceRecTab(i).RELATIVE_ST_DATE_EVENT_ID   ,
564                 delInstanceRecTab(i).RELATIVE_END_DATE_DURATION  ,
565                 delInstanceRecTab(i).RELATIVE_END_DATE_UOM       ,
566                 delInstanceRecTab(i).RELATIVE_END_DATE_EVENT_ID  ,
567                 delInstanceRecTab(i).REPEATING_DAY_OF_MONTH      ,
568                 delInstanceRecTab(i).REPEATING_DAY_OF_WEEK       ,
569                 delInstanceRecTab(i).REPEATING_FREQUENCY_UOM     ,
570                 delInstanceRecTab(i).REPEATING_DURATION          ,
571                 delInstanceRecTab(i).FIXED_START_DATE            ,
572                 delInstanceRecTab(i).FIXED_END_DATE              ,
573                 delInstanceRecTab(i).MANAGE_YN                   ,
574                 delInstanceRecTab(i).INTERNAL_PARTY_ID           ,
575                 delInstanceRecTab(i).DELIVERABLE_STATUS          ,
576                 delInstanceRecTab(i).STATUS_CHANGE_NOTES         ,
577                 delInstanceRecTab(i).CREATED_BY                  ,
578                 delInstanceRecTab(i).CREATION_DATE               ,
579                 delInstanceRecTab(i).LAST_UPDATED_BY             ,
580                 delInstanceRecTab(i).LAST_UPDATE_DATE            ,
581                 delInstanceRecTab(i).LAST_UPDATE_LOGIN           ,
582                 delInstanceRecTab(i).OBJECT_VERSION_NUMBER       ,
583                 delInstanceRecTab(i).ATTRIBUTE_CATEGORY          ,
584                 delInstanceRecTab(i).ATTRIBUTE1                  ,
585                 delInstanceRecTab(i).ATTRIBUTE2                  ,
586                 delInstanceRecTab(i).ATTRIBUTE3                  ,
587                 delInstanceRecTab(i).ATTRIBUTE4                  ,
588                 delInstanceRecTab(i).ATTRIBUTE5                  ,
589                 delInstanceRecTab(i).ATTRIBUTE6                  ,
590                 delInstanceRecTab(i).ATTRIBUTE7                  ,
591                 delInstanceRecTab(i).ATTRIBUTE8                  ,
592                 delInstanceRecTab(i).ATTRIBUTE9                  ,
593                 delInstanceRecTab(i).ATTRIBUTE10                 ,
594                 delInstanceRecTab(i).ATTRIBUTE11                 ,
595                 delInstanceRecTab(i).ATTRIBUTE12                 ,
596                 delInstanceRecTab(i).ATTRIBUTE13                 ,
597                 delInstanceRecTab(i).ATTRIBUTE14                 ,
598                 delInstanceRecTab(i).ATTRIBUTE15                 ,
599                 delInstanceRecTab(i).DISABLE_NOTIFICATIONS_YN    ,
600                 delInstanceRecTab(i).LAST_AMENDMENT_DATE         ,
601                 delInstanceRecTab(i).BUSINESS_DOCUMENT_LINE_ID   ,
602                 delInstanceRecTab(i).EXTERNAL_PARTY_SITE_ID      ,
603                 delInstanceRecTab(i).START_EVENT_DATE            ,
604                 delInstanceRecTab(i).END_EVENT_DATE              ,
605                 delInstanceRecTab(i).SUMMARY_AMEND_OPERATION_CODE,
606                 delInstanceRecTab(i).PAY_HOLD_PRIOR_DUE_DATE_VALUE,
607                 delInstanceRecTab(i).PAY_HOLD_PRIOR_DUE_DATE_UOM,
608                 delInstanceRecTab(i).PAY_HOLD_PRIOR_DUE_DATE_YN,
609                 delInstanceRecTab(i).PAY_HOLD_OVERDUE_YN
610                 );
611                 END LOOP;
612 
613 ------------------------------------------------------------------------
614 
615            IF ( FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
619 
616                FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE ,g_module||l_api_name,'604a: Done Insterting DEL Records');
617                FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE ,g_module||l_api_name,'604b: Now inserting Status history records for INACTIVE');
618            END IF;
620            IF  delStsTab.count > 0 THEN
621                 --- set status history record to INACTIVE for each deliverable instance
622                 OKC_DELIVERABLE_PROCESS_PVT.create_del_status_history(
623                               p_api_version => l_api_version,
624                                 p_init_msg_list => G_FALSE,
625                                 p_del_st_hist_tab => delStsTab,
626                                 x_msg_data => l_msg_data,
627                                 x_msg_count => l_msg_count,
628                                 x_return_status => l_return_status);
629 
630                 IF ( FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
631                     FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE ,g_module||l_api_name,'701a: Finished OKC_DELIVERABLE_PROCESS_PVT.create_del_status_history'||l_return_status);
632                 END IF;
633 
634                 IF (l_return_status = G_RET_STS_UNEXP_ERROR) THEN
635                      RAISE FND_API.G_EXC_UNEXPECTED_ERROR ;
636                 ELSIF (l_return_status = G_RET_STS_ERROR) THEN
637                      RAISE FND_API.G_EXC_ERROR ;
638                 END IF;
639             END IF;
640 
641            IF ( FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
642                FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE ,g_module||l_api_name,'604b: Now inserting Status history records for OPEN');
643            END IF;
644 
645            -- insert status histiry records for OPEN status
646            IF  delStsTab1.count > 0 THEN
647                 --- set status history record to OPEN for each deliverable instance
648                 OKC_DELIVERABLE_PROCESS_PVT.create_del_status_history(
649                               p_api_version => l_api_version,
650                                 p_init_msg_list => G_FALSE,
651                                 p_del_st_hist_tab => delStsTab1,
652                                 x_msg_data => l_msg_data,
653                                 x_msg_count => l_msg_count,
654                                 x_return_status => l_return_status);
655 
656                 IF ( FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
657                     FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE ,g_module||l_api_name,'701a: Finished OKC_DELIVERABLE_PROCESS_PVT.create_del_status_history'||l_return_status);
658                 END IF;
659 
660                 IF (l_return_status = G_RET_STS_UNEXP_ERROR) THEN
661                      RAISE FND_API.G_EXC_UNEXPECTED_ERROR ;
662                 ELSIF (l_return_status = G_RET_STS_ERROR) THEN
663                      RAISE FND_API.G_EXC_ERROR ;
664                 END IF;
665             END IF;
666 
667            IF ( FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
668                FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE ,g_module||l_api_name,'605: Done Insterting Records');
669            END IF;
670 
671            IF ( FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
672                FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE ,g_module||l_api_name,'606: Do Status Change, if not NULL '||p_change_status_to);
673            END IF;
674 
675           END IF;
676 
677     EXCEPTION
678         WHEN OTHERS THEN
679         IF ( FND_LOG.LEVEL_UNEXPECTED >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
680             FND_LOG.STRING( FND_LOG.LEVEL_UNEXPECTED ,g_module||l_api_name,'1000: Leaving '||G_PKG_NAME ||'.'||l_api_name);
681         END IF;
682       Okc_Api.Set_Message(G_APP_NAME,
683                         'OKC_DEL_ERR_GEN_INSTS');
684         RAISE FND_API.G_EXC_ERROR;
685    END; -- generate_del_instances
686 
687    /**
688     * Helper method to return proper number value for the day of week.
689     * the stored code is as varchar value
690     */
691    FUNCTION getDayOfWeek(p_code IN VARCHAR2)
692    return NUMBER
693    IS
694    BEGIN
695        if p_code is not null then
696         return(to_number(p_code));
697        end if;
698        return NULL;
699    END;
700 
701    /**
702     * Helper method to return Event Code and Before After value for given
703     * event id, stored in OKC_DELIVERABLES
704     */
705    PROCEDURE getDelEventDetails(
706     p_event_id IN NUMBER,
707     p_end_event_yn IN varchar2,
708     x_event_name OUT NOCOPY VARCHAR2,
709     x_before_after OUT NOCOPY VARCHAR2)
710     IS
711     l_api_name        CONSTANT VARCHAR2(30) := 'getDelEventDetails';
712 
713     BEGIN
714 --       IF p_end_event_yn = 'Y' THEN
715 
716            SELECT business_event_code, before_after into x_event_name, x_before_after
717            FROM OKC_BUS_DOC_EVENTS_B
718            WHERE bus_doc_event_id = p_event_id;
719 
720 /*           AND   (start_end_qualifier = 'BOTH' or start_end_qualifier = 'END');
721         ELSE
722            SELECT business_event_code, before_after into x_event_name, x_before_after
723            FROM OKC_BUS_DOC_EVENTS_B
724            WHERE bus_doc_event_id = p_event_id
725            AND   (start_end_qualifier = 'BOTH' or start_end_qualifier = 'START');
726        END IF; */
727 
728     EXCEPTION
729         WHEN OTHERS THEN
733       Okc_Api.Set_Message(G_APP_NAME,
730         IF ( FND_LOG.LEVEL_UNEXPECTED >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
731             FND_LOG.STRING( FND_LOG.LEVEL_UNEXPECTED ,g_module||l_api_name,'1000: Leaving '||G_PKG_NAME ||'.'||l_api_name);
732         END IF;
734                         'OKC_DEL_ERR_EVT_DTLS');
735         RAISE FND_API.G_EXC_ERROR;
736 
737   END;
738 
739   ---------------------------------------------------------------------------
740   -- END: Helper Procedures and Functions
741   ---------------------------------------------------------------------------
742 
743   ---------------------------------------------------------------------------
744   -- START: Public Procedures and Functions
745   ---------------------------------------------------------------------------
746 
747  /**
748   *  Called by business document teams, to resolve and activate deliverables
749   */
750  PROCEDURE activateDeliverables (
751     p_api_version                 IN NUMBER,
752     p_init_msg_list               IN VARCHAR2,
753     p_commit                    IN Varchar2,
754     p_bus_doc_id                  IN NUMBER,
755     p_bus_doc_type                IN VARCHAR2,
756     p_bus_doc_version             IN NUMBER,
757     p_event_code                  IN VARCHAR2,
758     p_event_date                  IN DATE,
759     p_sync_flag                   IN VARCHAR2,
760     p_bus_doc_date_events_tbl   IN BUSDOCDATES_TBL_TYPE,
761     x_msg_data                    OUT NOCOPY  VARCHAR2,
762     x_msg_count                   OUT NOCOPY  NUMBER,
763     x_return_status               OUT NOCOPY  VARCHAR2)
764     IS
765        l_api_version                CONSTANT NUMBER := 1;
766        l_api_name                   CONSTANT VARCHAR2(30) := 'activateDeliverables';
767     BEGIN
768 
769     -- start procedure
770     IF ( FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
771         FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE ,g_module||l_api_name,'100: Entered '||G_PKG_NAME ||'.'||l_api_name);
772         FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE ,g_module||l_api_name,'200: Bus dod id'||p_bus_doc_id);
773         FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE ,g_module||l_api_name,'300: Bus dod type'||p_bus_doc_type);
774         FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE ,g_module||l_api_name,'400: Bus dod version'||p_bus_doc_version);
775         FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE ,g_module||l_api_name,'500: Bus dod event code'||p_event_code);
776         FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE ,g_module||l_api_name,'600: Bus dod event date'||p_event_date);
777     END IF;
778 
779     IF p_bus_doc_id = NULL THEN
780        Okc_Api.Set_Message(G_APP_NAME
781                        ,'OKC_DEL_NO_PARAMS');
782        RAISE FND_API.G_EXC_ERROR;
783     END IF;
784     IF p_bus_doc_type = NULL THEN
785        Okc_Api.Set_Message(G_APP_NAME
786                        ,'OKC_DEL_NO_PARAMS');
787        RAISE FND_API.G_EXC_ERROR;
788     END IF;
789     IF p_bus_doc_version = NULL THEN
790        Okc_Api.Set_Message(G_APP_NAME
791                        ,'OKC_DEL_NO_PARAMS');
792        RAISE FND_API.G_EXC_ERROR;
793     END IF;
794     IF p_event_code = NULL THEN
795        Okc_Api.Set_Message(G_APP_NAME
796                        ,'OKC_DEL_NO_PARAMS');
797        RAISE FND_API.G_EXC_ERROR;
798     END IF;
799     IF p_event_date = NULL THEN
800        Okc_Api.Set_Message(G_APP_NAME
801                        ,'OKC_DEL_NO_PARAMS');
802        RAISE FND_API.G_EXC_ERROR;
803     END IF;
804 
805     -- Standard Start of API savepoint
806     SAVEPOINT g_activate_del_GRP;
807 
808     -- Standard call to check for call compatibility.
809     IF NOT FND_API.Compatible_API_Call( l_api_version, p_api_version, l_api_name, G_PKG_NAME) THEN
810       RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
811     END IF;
812 
813     -- Initialize message list if p_init_msg_list is set to TRUE.
814     IF FND_API.to_Boolean( p_init_msg_list ) THEN
815       FND_MSG_PUB.initialize;
816     END IF;
817 
818     --  Initialize API return status to success
819     x_return_status := FND_API.G_RET_STS_SUCCESS;
820 
821     --- check if sync flag is TRUE
822     IF FND_API.To_Boolean( p_sync_flag ) THEN
823 
824         IF ( FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
825             FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE ,g_module||l_api_name,'700: Calling '||'syncDeliverables');
826         END IF;
827           --- call deliverables process PVT to sync the deliverables for given version
828           OKC_DELIVERABLE_PROCESS_PVT.sync_deliverables(
829                             p_api_version => l_api_version,
830                             p_init_msg_list => G_FALSE,
831                             p_current_docid => p_bus_doc_id,
832                             p_current_doctype => p_bus_doc_type,
833                             p_current_doc_version => p_bus_doc_version,
834                             x_msg_data => x_msg_data,
835                             x_msg_count => x_msg_count,
836                             x_return_status => x_return_status);
837 
838        IF ( FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
839            FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE ,g_module||l_api_name,'701: Finished resolveDeliverables'||x_return_status);
840        END IF;
841 
842        IF (x_return_status = G_RET_STS_UNEXP_ERROR) THEN
843            RAISE FND_API.G_EXC_UNEXPECTED_ERROR ;
847 
844        ELSIF (x_return_status = G_RET_STS_ERROR) THEN
845            RAISE FND_API.G_EXC_ERROR ;
846        END IF;
848     END IF;
849 
850     IF ( FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
851         FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE ,g_module||l_api_name,'702: Calling '||'resolveDeliverables');
852     END IF;
853 
854     --- resolve deliverables
855     resolveDeliverables(
856                         p_api_version => l_api_version,
857                         p_init_msg_list => G_FALSE,
858                         p_commit => G_FALSE,
859                         p_bus_doc_id => p_bus_doc_id,
860                         p_bus_doc_type => p_bus_doc_type,
861                         p_bus_doc_version => p_bus_doc_version,
862                         p_event_code => p_event_code,
863                         p_event_date => p_event_date,
864                         p_bus_doc_date_events_tbl => p_bus_doc_date_events_tbl,
865                         x_msg_data => x_msg_data,
866                         x_msg_count => x_msg_count,
867                         x_return_status => x_return_status,
868                         p_sync_flag => p_sync_flag,
869                         p_sync_recurr_instances_flag => FND_API.G_TRUE);
870 
871    IF ( FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
872        FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE ,g_module||l_api_name,'800: Finished resolveDeliverables'||x_return_status);
873    END IF;
874 
875    IF (x_return_status = G_RET_STS_UNEXP_ERROR) THEN
876            RAISE FND_API.G_EXC_UNEXPECTED_ERROR ;
877    ELSIF (x_return_status = G_RET_STS_ERROR) THEN
878            RAISE FND_API.G_EXC_ERROR ;
879    END IF;
880 
881     IF ( FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
882         FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE ,g_module||l_api_name,'900: Calling '||'OKC_DELIVERABLE_PROCESS_PVT.change_deliverable_status');
883     END IF;
884 
885     --- call change_deliverable_status, to change deliverable status from
886     --- INACTIVE to 'OPEN'
887         OKC_DELIVERABLE_PROCESS_PVT.change_deliverable_status(
888                               p_api_version => l_api_version,
889                                 p_init_msg_list => G_FALSE,
890                                 p_doc_id => p_bus_doc_id,
891                                 p_doc_version => p_bus_doc_version,
892                                 p_doc_type => p_bus_doc_type,
893                                 p_cancel_yn => 'N',
894                                 p_cancel_event_code => NULL,
895                                 p_current_status => 'INACTIVE',
896                                 p_new_status => 'OPEN',
897                                 p_manage_yn => 'Y',
898                                 x_msg_data => x_msg_data,
899                                 x_msg_count => x_msg_count,
900                                 x_return_status => x_return_status);
901 
902    IF ( FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
903        FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE ,g_module||l_api_name,'1000: Finished OKC_DELIVERABLE_PROCESS_PVT.change_deliverable_status'||x_return_status);
904    END IF;
905 
906    IF (x_return_status = G_RET_STS_UNEXP_ERROR) THEN
907            RAISE FND_API.G_EXC_UNEXPECTED_ERROR ;
908    ELSIF (x_return_status = G_RET_STS_ERROR) THEN
909            RAISE FND_API.G_EXC_ERROR ;
910    END IF;
911 
912    IF FND_API.To_Boolean( p_commit ) THEN
913       COMMIT WORK;
914    END IF;
915 
916    -- Standard call to get message count and if count is 1, get message info.
917    FND_MSG_PUB.Count_And_Get(p_encoded=>'F', p_count => x_msg_count, p_data => x_msg_data );
918 
919    IF ( FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
920         FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE ,g_module||l_api_name,'1100: Leaving activateDeliverables');
921    END IF;
922 
923     EXCEPTION
924     WHEN FND_API.G_EXC_ERROR THEN
925      IF ( FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
926         FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE ,g_module||l_api_name,'1200: Leaving activateDeliverables Unexpected ERROR');
927      END IF;
928      ROLLBACK TO g_activate_del_GRP;
929      x_return_status := G_RET_STS_ERROR ;
930      FND_MSG_PUB.Count_And_Get(p_encoded=>'F', p_count => x_msg_count, p_data => x_msg_data );
931 
932      WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
933      IF ( FND_LOG.LEVEL_UNEXPECTED >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
934         FND_LOG.STRING( FND_LOG.LEVEL_UNEXPECTED ,g_module||l_api_name,'1300: Leaving activateDeliverables Unexpected ERROR');
935      END IF;
936      ROLLBACK TO g_activate_del_GRP;
937      x_return_status := G_RET_STS_UNEXP_ERROR ;
938      FND_MSG_PUB.Count_And_Get(p_encoded=>'F', p_count => x_msg_count, p_data => x_msg_data );
939 
940     WHEN OTHERS THEN
941     IF ( FND_LOG.LEVEL_UNEXPECTED >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
942        FND_LOG.STRING( FND_LOG.LEVEL_UNEXPECTED ,g_module||l_api_name,'1400: Leaving activateDeliverables because of EXCEPTION: '||substr(sqlerrm,1,200));
943     END IF;
944     ROLLBACK TO g_activate_del_GRP;
945     x_return_status := G_RET_STS_UNEXP_ERROR ;
946     IF FND_MSG_PUB.Check_Msg_Level( FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR ) THEN
947          FND_MSG_PUB.Add_Exc_Msg( G_PKG_NAME, l_api_name );
948     END IF;
949     FND_MSG_PUB.Count_And_Get(p_encoded=>'F', p_count => x_msg_count, p_data => x_msg_data );
950 
951  END; -- activateDeliverables
952 
956                             p_event_code IN VARCHAR2,
953 
954     FUNCTION resolveRelativeDueEvents(
955                             p_bus_doc_date_events_tbl   IN BUSDOCDATES_TBL_TYPE,
957                             p_event_date IN DATE,
958                             p_event_id IN NUMBER,
959                             p_event_UOM IN VARCHAR2,
960                             p_event_duration IN NUMBER,
961                             p_end_event_yn IN VARCHAR2)
962     return DATE
963     IS
964          l_api_name CONSTANT VARCHAR2(30) := 'resolveRelativeDueEvents';
965          l_del_event_name OKC_BUS_DOC_EVENTS_B.business_event_code%TYPE;
966          l_del_before_after OKC_BUS_DOC_EVENTS_B.before_after%TYPE;
967          l_actual_date DATE;
968 
969     BEGIN
970 
971     -- initialize
972     l_actual_date := null;
973 
974       -- start procedure
975       IF ( FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
976          FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE ,g_module||l_api_name,'100: Entered '||G_PKG_NAME ||'.'||l_api_name);
977       END IF;
978 
979       IF p_event_id is NULL OR p_event_UOM is NULL OR p_event_duration is NULL THEN
980 
981            Okc_Api.Set_Message(G_APP_NAME,
982                           'OKC_DEL_NOT_RSLV_EVTS');
983            RAISE FND_API.G_EXC_ERROR;
984 
985       END IF;
986 
987       IF ( FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
988          FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE ,g_module||l_api_name,'101: Calling getDelEventDetails');
989       END IF;
990 
991       --- get current deliverable's end event details
992       getDelEventDetails(
993            p_event_id => p_event_id,
994            p_end_event_yn => p_end_event_yn,
995            x_event_name => l_del_event_name,
996            x_before_after => l_del_before_after);
997 
998       IF ( FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
999          FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE ,g_module||l_api_name,'101: Finished getDelEventDetails - Event Name'||l_del_event_name);
1000          FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE ,g_module||l_api_name,'102: Finished getDelEventDetails - Before After'||l_del_before_after);
1001       END IF;
1002 
1003       IF (p_event_code is not NULL AND p_event_code = l_del_event_name) THEN
1004           --- Calculate actual date
1005           l_actual_date :=
1006                OKC_DELIVERABLE_PROCESS_PVT.get_actual_date(
1007                p_start_date => p_event_date,
1008                p_timeunit => p_event_UOM,
1009                p_duration => p_event_duration,
1010                p_before_after => l_del_before_after);
1011 
1012            IF l_actual_date is NULL THEN
1013                Okc_Api.Set_Message(G_APP_NAME,
1014                                 'OKC_DEL_DT_NOT_RSLVD');
1015                RAISE FND_API.G_EXC_ERROR;
1016            END IF;
1017 
1018       END IF;
1019 
1020       --- if relative, check for event name with the given event names
1021       --- in table of records.
1022       IF p_bus_doc_date_events_tbl.count > 0 THEN
1023          FOR k IN
1024              p_bus_doc_date_events_tbl.FIRST..p_bus_doc_date_events_tbl.LAST LOOP
1025              IF p_bus_doc_date_events_tbl(k).event_code = l_del_event_name THEN
1026 
1027                 IF ( FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
1028                    FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE ,g_module||l_api_name,'103: Event Matched '||l_del_event_name);
1029                 END IF;
1030 
1031                 --- Calculate actual date
1032                 l_actual_date :=
1033                 OKC_DELIVERABLE_PROCESS_PVT.get_actual_date(
1034                                   p_start_date => p_bus_doc_date_events_tbl(k).event_date,
1035                                   p_timeunit => p_event_UOM,
1036                                   p_duration => p_event_duration,
1037                                   p_before_after => l_del_before_after);
1038 /*                IF l_actual_date is NULL THEN
1039                    Okc_Api.Set_Message(G_APP_NAME,
1040                                     'OKC_DEL_DT_NOT_RSLVD');
1041                    RAISE FND_API.G_EXC_ERROR;
1042                 END IF; */
1043 
1044               END IF;
1045          END LOOP;
1046       END IF;
1047 
1048       IF ( FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
1049           FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE ,g_module||l_api_name,'104: Returning Resolved Date as '||l_actual_date);
1050       END IF;
1051     return l_actual_date;
1052     END;
1053 
1054     /**
1055      * Resolve deliverable due date, recurring instances to OKC_DELIVERABLES
1056      */
1057     PROCEDURE resolveDeliverables (
1058         p_api_version                 IN NUMBER,
1059         p_init_msg_list               IN VARCHAR2,
1060         p_commit                    IN  Varchar2,
1061         p_bus_doc_id                  IN NUMBER,
1062         p_bus_doc_type                IN VARCHAR2,
1063         p_bus_doc_version             IN NUMBER,
1064         p_event_code                  IN VARCHAR2,
1065         p_event_date                  IN DATE,
1066         p_bus_doc_date_events_tbl   IN BUSDOCDATES_TBL_TYPE,
1067         x_msg_data                    OUT NOCOPY  VARCHAR2,
1068         x_msg_count                   OUT NOCOPY  NUMBER,
1069         x_return_status               OUT NOCOPY  VARCHAR2,
1070         p_sync_flag                   IN VARCHAR2,
1074          l_api_version                CONSTANT NUMBER := 1;
1071         p_sync_recurr_instances_flag  IN VARCHAR2,
1072         p_cancel_flag                 IN VARCHAR2)
1073         IS
1075          l_api_name      CONSTANT VARCHAR2(30) := 'resolveDeliverables';
1076     -- update cursor for bug#4069955
1077      CURSOR del_cur IS
1078             SELECT *
1079                 FROM  okc_deliverables del
1080                 WHERE del.business_document_id = p_bus_doc_id
1081                 AND   del.business_document_version = p_bus_doc_version
1082                 AND   del.business_document_type = p_bus_doc_type
1083                 AND   del.deliverable_status = 'INACTIVE'
1084                 AND   del.actual_due_date is NULL
1085                 AND   del.recurring_del_parent_id is NULL
1086                 AND   (del.amendment_operation is NULL OR del.amendment_operation <> 'DELETED')
1087                 AND   (del.summary_amend_operation_code is NULL OR del.summary_amend_operation_code <> 'DELETED')
1088                 AND    del.deliverable_type in (select delTypes.deliverable_type_code from
1089                                                 okc_bus_doc_types_b busDocTypes,
1090                                                 okc_del_bus_doc_combxns delTypes
1091                                                 WHERE busDocTypes.document_type = del.business_document_type
1092                                                 AND   delTypes.document_type_class = busDocTypes.document_type_class
1093                                                 AND   del.deliverable_type = delTypes.deliverable_type_code)
1094                 AND (G_FALSE = p_cancel_flag OR ( del.RELATIVE_ST_DATE_EVENT_ID in
1095                                             (select docEvents.BUS_DOC_EVENT_ID
1096                                              from okc_bus_doc_events_b docEvents
1097                                              where docEvents.BUSINESS_EVENT_CODE = p_event_code
1098                                             ))
1099                      );
1100       del_rec  del_cur%ROWTYPE;
1101 
1102       CURSOR get_del_ids_cur (p_del_id IN NUMBER, p_actual_date IN DATE) IS
1103        SELECT deliverable_id FROM OKC_DELIVERABLES
1104          WHERE business_document_id = p_bus_doc_id
1105        AND   business_document_type = p_bus_doc_type
1106          AND   business_document_version = p_bus_doc_version
1107        AND   recurring_del_parent_id = p_del_id
1108        AND   TRUNC(actual_due_date) > TRUNC(p_actual_date);
1109 
1110       -- this cursor has been introduced to fix bug 3574466. The cursor
1111       -- collectes deliverable_id's of all the instances for given recurring
1112       -- deliverable
1113       CURSOR get_del_ids_cur2 (p_del_id IN NUMBER) IS
1114        SELECT deliverable_id FROM OKC_DELIVERABLES
1115          WHERE business_document_id = p_bus_doc_id
1116        AND   business_document_type = p_bus_doc_type
1117          AND   business_document_version = p_bus_doc_version
1118        AND   recurring_del_parent_id = p_del_id;
1119 
1120          -- for storage of bulk Fetch
1121          delRecTab OKC_DELIVERABLE_PROCESS_PVT.delRecTabType;
1122 
1123          -- for storage recurrign instances
1124          delInstanceRecTab OKC_DELIVERABLE_PROCESS_PVT.delRecTabType;
1125 
1126          TYPE DelIdList IS TABLE OF NUMBER
1127          INDEX BY BINARY_INTEGER;
1128          deliverableIds DelIdList;
1129          TYPE DelDueDatetList IS TABLE OF DATE
1130          INDEX BY BINARY_INTEGER;
1131          deliverableDueDates DelDueDatetList;
1132          TYPE DelStartEventDateList IS TABLE OF DATE
1133          INDEX BY BINARY_INTEGER;
1134          deliverableStartEventDates DelStartEventDateList;
1135          TYPE DelEndEventDateList IS TABLE OF DATE
1136          INDEX BY BINARY_INTEGER;
1137          deliverableEndEventDates DelEndEventDateList;
1138 
1139          del_count PLS_INTEGER;
1140          j PLS_INTEGER;
1141          k PLS_INTEGER;
1142          l_actual_date DATE;
1143          l_recurr_start_date DATE;
1144          l_recurr_end_date DATE;
1145 
1146          l_repeat_day_of_month number;
1147          l_repeat_day_of_week number;
1148 
1149          l_has_instances_yn VARCHAR2(1);
1150 
1151          l_new_status OKC_DELIVERABLES.deliverable_status%TYPE;
1152 
1153          --- for deliverable ids
1154          delIds OKC_DELIVERABLE_PROCESS_PVT.delIdTabType;
1155 
1156          generate_new_instances_yn VARCHAR2(1);
1157          l_sync_flag VARCHAR2(1);
1158         BEGIN
1159 
1160       -- initialize
1161       del_count := 0;
1162       j := 0;
1163       k := 0;
1164       l_sync_flag := FND_API.G_FALSE;
1165 
1166         -- start procedure
1167         IF ( FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
1168             FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE ,g_module||l_api_name,'100: Entered '||G_PKG_NAME ||'.'||l_api_name);
1169         END IF;
1170 
1171         -- Standard Start of API savepoint
1172         SAVEPOINT g_resolve_del_GRP;
1173 
1174         -- Standard call to check for call compatibility.
1175         IF NOT FND_API.Compatible_API_Call( l_api_version, p_api_version, l_api_name, G_PKG_NAME) THEN
1176           RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
1177         END IF;
1178 
1179         -- Initialize message list if p_init_msg_list is set to TRUE.
1180         IF FND_API.to_Boolean( p_init_msg_list ) THEN
1181           FND_MSG_PUB.initialize;
1182         END IF;
1183 
1184         --  Initialize API return status to success
1188             l_sync_flag := FND_API.G_TRUE;
1185         x_return_status := FND_API.G_RET_STS_SUCCESS;
1186 
1187         IF FND_API.To_Boolean (p_sync_recurr_instances_flag) THEN
1189         ELSE
1190             l_sync_flag := p_sync_flag;
1191         END IF;
1192 
1193 
1194         --- open deliverables cursor and populate records of table
1195                 FOR del_rec IN del_cur LOOP
1196                         k := k+1;
1197                         delRecTab(k).deliverable_id := del_rec.deliverable_id;
1198                         delRecTab(k).BUSINESS_DOCUMENT_TYPE:= del_rec.BUSINESS_DOCUMENT_TYPE;
1199                         delRecTab(k).BUSINESS_DOCUMENT_ID:= del_rec.BUSINESS_DOCUMENT_ID;
1200                         delRecTab(k).BUSINESS_DOCUMENT_NUMBER:= del_rec.BUSINESS_DOCUMENT_NUMBER;
1201                         delRecTab(k).DELIVERABLE_TYPE:= del_rec.DELIVERABLE_TYPE;
1202                         delRecTab(k).RESPONSIBLE_PARTY:= del_rec.RESPONSIBLE_PARTY;
1203                         delRecTab(k).INTERNAL_PARTY_CONTACT_ID:= del_rec.INTERNAL_PARTY_CONTACT_ID;
1204                         delRecTab(k).EXTERNAL_PARTY_CONTACT_ID:= del_rec.EXTERNAL_PARTY_CONTACT_ID;
1205                         delRecTab(k).DELIVERABLE_NAME:= del_rec.DELIVERABLE_NAME;
1206                         delRecTab(k).DESCRIPTION:= del_rec.DESCRIPTION;
1207                         delRecTab(k).COMMENTS:= del_rec.COMMENTS;
1208                         delRecTab(k).DISPLAY_SEQUENCE:= del_rec.DISPLAY_SEQUENCE;
1209                         delRecTab(k).FIXED_DUE_DATE_YN:= del_rec.FIXED_DUE_DATE_YN;
1210                         delRecTab(k).ACTUAL_DUE_DATE:= del_rec.ACTUAL_DUE_DATE;
1211                         delRecTab(k).PRINT_DUE_DATE_MSG_NAME:= del_rec.PRINT_DUE_DATE_MSG_NAME;
1212                         delRecTab(k).RECURRING_YN:= del_rec.RECURRING_YN;
1213                         delRecTab(k).NOTIFY_PRIOR_DUE_DATE_VALUE:= del_rec.NOTIFY_PRIOR_DUE_DATE_VALUE;
1214                         delRecTab(k).NOTIFY_PRIOR_DUE_DATE_UOM:= del_rec.NOTIFY_PRIOR_DUE_DATE_UOM;
1215                         delRecTab(k).NOTIFY_PRIOR_DUE_DATE_YN:= del_rec.NOTIFY_PRIOR_DUE_DATE_YN;
1216                         delRecTab(k).NOTIFY_COMPLETED_YN:= del_rec.NOTIFY_COMPLETED_YN;
1217                         delRecTab(k).NOTIFY_OVERDUE_YN:= del_rec.NOTIFY_OVERDUE_YN;
1218                         delRecTab(k).NOTIFY_ESCALATION_YN:= del_rec.NOTIFY_ESCALATION_YN;
1219                         delRecTab(k).NOTIFY_ESCALATION_VALUE:= del_rec.NOTIFY_ESCALATION_VALUE;
1220                         delRecTab(k).NOTIFY_ESCALATION_UOM:= del_rec.NOTIFY_ESCALATION_UOM;
1221                         delRecTab(k).ESCALATION_ASSIGNEE:= del_rec.ESCALATION_ASSIGNEE;
1222                         delRecTab(k).AMENDMENT_OPERATION:= del_rec.AMENDMENT_OPERATION;
1223                         delRecTab(k).PRIOR_NOTIFICATION_ID:= del_rec.PRIOR_NOTIFICATION_ID;
1224                         delRecTab(k).AMENDMENT_NOTES:= del_rec.AMENDMENT_NOTES;
1225                         delRecTab(k).COMPLETED_NOTIFICATION_ID:= del_rec.COMPLETED_NOTIFICATION_ID;
1226                         delRecTab(k).OVERDUE_NOTIFICATION_ID:= del_rec.OVERDUE_NOTIFICATION_ID;
1227                         delRecTab(k).ESCALATION_NOTIFICATION_ID:= del_rec.ESCALATION_NOTIFICATION_ID;
1228                         delRecTab(k).LANGUAGE:= del_rec.LANGUAGE;
1229                         delRecTab(k).ORIGINAL_DELIVERABLE_ID:= del_rec.ORIGINAL_DELIVERABLE_ID;
1230                         delRecTab(k).REQUESTER_ID:= del_rec.REQUESTER_ID;
1231                         delRecTab(k).EXTERNAL_PARTY_ID:= del_rec.EXTERNAL_PARTY_ID;
1232                         delRecTab(k).EXTERNAL_PARTY_ROLE:= del_rec.EXTERNAL_PARTY_ROLE;
1233                         delRecTab(k).RECURRING_DEL_PARENT_ID:= del_rec.RECURRING_DEL_PARENT_ID;
1234                         delRecTab(k).BUSINESS_DOCUMENT_VERSION:= del_rec.BUSINESS_DOCUMENT_VERSION;
1235                         delRecTab(k).RELATIVE_ST_DATE_DURATION:= del_rec.RELATIVE_ST_DATE_DURATION;
1236                         delRecTab(k).RELATIVE_ST_DATE_UOM:= del_rec.RELATIVE_ST_DATE_UOM;
1237                         delRecTab(k).RELATIVE_ST_DATE_EVENT_ID:= del_rec.RELATIVE_ST_DATE_EVENT_ID;
1238                         delRecTab(k).RELATIVE_END_DATE_DURATION:= del_rec.RELATIVE_END_DATE_DURATION;
1239                         delRecTab(k).RELATIVE_END_DATE_UOM:= del_rec.RELATIVE_END_DATE_UOM;
1240                         delRecTab(k).RELATIVE_END_DATE_EVENT_ID:= del_rec.RELATIVE_END_DATE_EVENT_ID;
1241                         delRecTab(k).REPEATING_DAY_OF_MONTH:= del_rec.REPEATING_DAY_OF_MONTH;
1242                         delRecTab(k).REPEATING_DAY_OF_WEEK:= del_rec.REPEATING_DAY_OF_WEEK;
1243                         delRecTab(k).REPEATING_FREQUENCY_UOM:= del_rec.REPEATING_FREQUENCY_UOM;
1244                         delRecTab(k).REPEATING_DURATION:= del_rec.REPEATING_DURATION;
1245                         delRecTab(k).FIXED_START_DATE:= del_rec.FIXED_START_DATE;
1246                         delRecTab(k).FIXED_END_DATE:= del_rec.FIXED_END_DATE;
1247                         delRecTab(k).MANAGE_YN:= del_rec.MANAGE_YN;
1248                         delRecTab(k).INTERNAL_PARTY_ID:= del_rec.INTERNAL_PARTY_ID;
1249                         delRecTab(k).DELIVERABLE_STATUS:= del_rec.DELIVERABLE_STATUS;
1250                         delRecTab(k).STATUS_CHANGE_NOTES:= del_rec.STATUS_CHANGE_NOTES;
1251                         delRecTab(k).CREATED_BY:= del_rec.CREATED_BY;
1252                         delRecTab(k).CREATION_DATE:= del_rec.CREATION_DATE;
1253                         delRecTab(k).LAST_UPDATED_BY:= del_rec.LAST_UPDATED_BY;
1254                         delRecTab(k).LAST_UPDATE_DATE:= del_rec.LAST_UPDATE_DATE;
1255                         delRecTab(k).LAST_UPDATE_LOGIN:= del_rec.LAST_UPDATE_LOGIN;
1256                         delRecTab(k).OBJECT_VERSION_NUMBER:= del_rec.OBJECT_VERSION_NUMBER;
1260                         delRecTab(k).ATTRIBUTE3:= del_rec.ATTRIBUTE3;
1257                         delRecTab(k).ATTRIBUTE_CATEGORY:= del_rec.ATTRIBUTE_CATEGORY;
1258                         delRecTab(k).ATTRIBUTE1:= del_rec.ATTRIBUTE1;
1259                         delRecTab(k).ATTRIBUTE2:= del_rec.ATTRIBUTE2;
1261                         delRecTab(k).ATTRIBUTE4:= del_rec.ATTRIBUTE4;
1262                         delRecTab(k).ATTRIBUTE5:= del_rec.ATTRIBUTE5;
1263                         delRecTab(k).ATTRIBUTE6:= del_rec.ATTRIBUTE6;
1264                         delRecTab(k).ATTRIBUTE7:= del_rec.ATTRIBUTE7;
1265                         delRecTab(k).ATTRIBUTE8:= del_rec.ATTRIBUTE8;
1266                         delRecTab(k).ATTRIBUTE9:= del_rec.ATTRIBUTE9;
1267                         delRecTab(k).ATTRIBUTE10:= del_rec.ATTRIBUTE10;
1268                         delRecTab(k).ATTRIBUTE11:= del_rec.ATTRIBUTE11;
1269                         delRecTab(k).ATTRIBUTE12:= del_rec.ATTRIBUTE12;
1270                         delRecTab(k).ATTRIBUTE13:= del_rec.ATTRIBUTE13;
1271                         delRecTab(k).ATTRIBUTE14:= del_rec.ATTRIBUTE14;
1272                         delRecTab(k).ATTRIBUTE15:= del_rec.ATTRIBUTE15;
1273                         delRecTab(k).DISABLE_NOTIFICATIONS_YN:= del_rec.DISABLE_NOTIFICATIONS_YN;
1274                         delRecTab(k).LAST_AMENDMENT_DATE:= del_rec.LAST_AMENDMENT_DATE;
1275                         delRecTab(k).BUSINESS_DOCUMENT_LINE_ID:= del_rec.BUSINESS_DOCUMENT_LINE_ID;
1276                         delRecTab(k).EXTERNAL_PARTY_SITE_ID:= del_rec.EXTERNAL_PARTY_SITE_ID;
1277                         delRecTab(k).START_EVENT_DATE:= del_rec.START_EVENT_DATE;
1278                         delRecTab(k).END_EVENT_DATE:= del_rec.END_EVENT_DATE;
1279                         delRecTab(k).SUMMARY_AMEND_OPERATION_CODE:= del_rec.SUMMARY_AMEND_OPERATION_CODE;
1280                         delRecTab(k).PAY_HOLD_PRIOR_DUE_DATE_VALUE:=del_rec.PAY_HOLD_PRIOR_DUE_DATE_VALUE;
1281                         delRecTab(k).PAY_HOLD_PRIOR_DUE_DATE_UOM:=del_rec.PAY_HOLD_PRIOR_DUE_DATE_UOM;
1282                         delRecTab(k).PAY_HOLD_PRIOR_DUE_DATE_YN:=del_rec.PAY_HOLD_PRIOR_DUE_DATE_YN;
1283                         delRecTab(k).PAY_HOLD_OVERDUE_YN:=del_rec.PAY_HOLD_OVERDUE_YN;
1284 
1285                 END LOOP;
1286 
1287             -- commented as this is not supported by 8i PL/SQL Bug#3307941
1288             /*OPEN del_cur;
1289             FETCH del_cur BULK COLLECT INTO delRecTab;*/
1290 
1291         IF ( FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
1292             FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE ,g_module||l_api_name,'101: Got Deliverables -- Count '||delRecTab.count);
1293         END IF;
1294 
1295               IF delRecTab.count > 0 THEN
1296                 FOR i IN delRecTab.FIRST..delRecTab.LAST LOOP
1297 
1298                     --- if deliverable is not recurring and start due date is FIXED
1299                     IF delRecTab(i).FIXED_DUE_DATE_YN = 'Y' THEN
1300 
1301                         IF ( FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
1302                             FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE ,g_module||l_api_name,'102: Fixed Due Date Deliverable = '||delRecTab(i).deliverable_id);
1303                         END IF;
1304 
1305                         --- increment the count
1306                         del_count := del_count+1;
1307 
1308                         -- record the deliverable id to be updated at the end
1309                         deliverableIds(del_count) := delRecTab(i).deliverable_id;
1310 
1311                         -- set actual due date
1312                         deliverableDueDates(del_count) := delRecTab(i).fixed_start_date;
1313 
1314                         -- populate start event date as static date
1315                         deliverableStartEventDates(del_count) := delRecTab(i).fixed_start_date;
1316                         deliverableEndEventDates(del_count) := NULL;
1317 
1318                         -- check and create status history record for INACTIVE status
1319                         checkAndCreateStatusHistory(p_deliverable_id => delRecTab(i).deliverable_id,
1320                                                     p_deliverable_status => 'INACTIVE',
1321                                                     x_msg_data => x_msg_data,
1322                                                     x_msg_count => x_msg_count,
1323                                                     x_return_status => x_return_status);
1324                         IF (x_return_status = G_RET_STS_UNEXP_ERROR) THEN
1325                             RAISE FND_API.G_EXC_UNEXPECTED_ERROR ;
1326                         ELSIF (x_return_status = G_RET_STS_ERROR) THEN
1327                             RAISE FND_API.G_EXC_ERROR ;
1328                         END IF;
1329 
1330                     END IF;  -- fixed due date is 'Yes'
1331 
1332                     -- if deliverable is recurring
1333                     IF delRecTab(i).recurring_yn = 'Y' THEN
1334 
1335                         IF ( FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
1336                             FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE ,g_module||l_api_name,'103: Recurring Deliverable = '||delRecTab(i).deliverable_id);
1337                         END IF;
1338 
1339                         --- check if deliverable has recurring instances already in place
1340                         --- for given version of the document
1341                         l_has_instances_yn := hasInstances(
1342                                               p_bus_doc_id => p_bus_doc_id,
1343                                               p_bus_doc_type => p_bus_doc_type,
1347                         IF ( FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
1344                                               p_bus_doc_version => p_bus_doc_version,
1345                                               p_del_id => delRecTab(i).deliverable_id);
1346 
1348                             FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE ,g_module||l_api_name,'104: Recurring Deliverable, Has Instances = '||l_has_instances_yn);
1349                         END IF;
1350 
1351                         -- unexpected error
1352                         IF l_has_instances_yn is null THEN
1353                          Okc_Api.Set_Message(G_APP_NAME,
1354                                            'OKC_DEL_ERR_GET_INSTS');
1355                            RAISE FND_API.G_EXC_ERROR;
1356                         END IF;
1357 
1358                         -- by default this is N
1359                         generate_new_instances_yn := 'N';
1360 
1361                         --- if deliverable has recurring instances
1362                         IF l_has_instances_yn = 'Y' THEN
1363 
1364                             IF ( FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
1365                                 FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE ,g_module||l_api_name,'105: Checking already exploded Recurring Deliverable = '||delRecTab(i).deliverable_id);
1366                                 FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE ,g_module||l_api_name,'105a: Check if deliverable is Amended = '||delRecTab(i).deliverable_id);
1367                             END IF;
1368 
1369                             --- check if amendment operation is (R)evised
1370 /*                            IF ((delRecTab(i).amendment_operation is not null AND
1371                                 delRecTab(i).amendment_operation = 'UPDATED') OR
1372                                 (delRecTab(i).summary_amend_operation_code is not null AND
1373                                 delRecTab(i).summary_amend_operation_code = 'UPDATED')) THEN */
1374 
1375                                 IF ( FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
1376                                     FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE ,g_module||l_api_name,'106: Recurring Definition = '||delRecTab(i).deliverable_id||' with Amendment Operation as '||delRecTab(i).amendment_operation);
1377                                 END IF;
1378 
1379                                 -- fix Bug 3574466: If sync flag is true, generate only the
1380                                 -- delta instances.
1381                                 IF FND_API.To_Boolean( l_sync_flag ) THEN
1382 
1383                                 --- ASSUMPTION: In this case only end date can change
1384                                 --- get old start date
1385                                 l_recurr_start_date := delRecTab(i).start_event_date;
1386 
1387                                 --- check if end date is not FIXED, it is relative
1388                                 IF delRecTab(i).fixed_end_date is null THEN
1389 
1390                                    IF ( FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
1391                                        FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE ,g_module||l_api_name,'107: Recurring Definition = '||delRecTab(i).deliverable_id||' End Date is not Fixed ');
1392                                    END IF;
1393 
1394                                    --- initialize recurr end date
1395                                    l_recurr_end_date := null;
1396 
1397                                    IF ( FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
1398                                        FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE ,g_module||l_api_name,'107: Recurring Definition = '||delRecTab(i).deliverable_id||' Get Event Details ');
1399                                    END IF;
1400 
1401                                    -- to resolve relative end date check if due dates table is
1402                                    -- not empty
1403               /*--Commenting out as part of fix for bug 4030982--
1404                                    IF p_bus_doc_date_events_tbl.count = 0 THEN
1405                                      Okc_Api.Set_Message(G_APP_NAME,
1406                                                       'OKC_DEL_ERR_DTS_EMPY');
1407                                        RAISE FND_API.G_EXC_ERROR;
1408                                    END IF;
1409               */
1410 
1411                                    --- resolve relative end date
1412                                    l_recurr_end_date := resolveRelativeDueEvents(
1413                                        p_bus_doc_date_events_tbl => p_bus_doc_date_events_tbl,
1414                                        p_event_code => p_event_code,
1415                                        p_event_date => p_event_date,
1416                                        p_event_id => delRecTab(i).relative_end_date_event_id,
1417                                        p_event_UOM => delRecTab(i).relative_end_date_uom,
1418                                        p_event_duration => delRecTab(i).relative_end_date_duration,
1419                                        p_end_event_yn => 'Y');
1420 
1421                                    IF ( FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
1422                                       FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE ,g_module||l_api_name,'108: Recurring Definition = '||delRecTab(i).deliverable_id||' Recurring end date '||l_recurr_end_date);
1423                                    END IF;
1424 
1425                                 ELSE --- get the fixed end date, provided
1426 
1430 
1427                                     IF ( FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
1428                                        FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE ,g_module||l_api_name,'108: Recurring Definition = '||delRecTab(i).deliverable_id||' End Date is Fixed '||l_recurr_end_date);
1429                                     END IF;
1431                                     l_recurr_end_date := delRecTab(i).fixed_end_date;
1432 
1433                                 END IF; --- End Date is Evaluated
1434 
1435                                 -- By this time l_recurr_end_date should not be NULL
1436                                 IF l_recurr_end_date is NULL  THEN
1437                                    Okc_Api.Set_Message(G_APP_NAME,
1438                                                     'OKC_DEL_END_DT_NOT_FOUND');
1439                                     RAISE FND_API.G_EXC_ERROR;
1440                                 END IF;
1441 
1442                                 --- check if new date is less then old date
1443                                 --- delete instances where actual date is equal to or
1444                                 --- greater then new date
1445 
1446                                 IF TRUNC(l_recurr_end_date) < TRUNC(delRecTab(i).end_event_date) THEN
1447 
1448                                    IF ( FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
1449                                        FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE ,g_module||l_api_name,'108: Recurring Definition = '||delRecTab(i).deliverable_id||' New end Date is LESS then OLD End Date '||l_recurr_end_date);
1450                                        FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE ,g_module||l_api_name,'108: Recurring Definition = '||delRecTab(i).deliverable_id||' Hence Delete Remaining Instances '||l_recurr_end_date);
1451                                    END IF;
1452 
1453                                    --- hard Delete old instances from current version
1454                                    OPEN get_del_ids_cur(delRecTab(i).deliverable_id, l_recurr_end_date);
1455                                    FETCH get_del_ids_cur BULK COLLECT INTO delIds;
1456                                    CLOSE get_del_ids_cur;
1457 
1458                                    IF ( FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
1459                                        FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE ,g_module||l_api_name,'108: Recurring Definition = '||delRecTab(i).deliverable_id||' Calling OKC_DELIVERABLE_PROCESS_PVT.delete_del_instances for count '||delIds.count);
1460                                        FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE ,g_module||l_api_name,'108: Recurring Definition = '||delRecTab(i).deliverable_id||' Calling OKC_DELIVERABLE_PROCESS_PVT.delete_del_instances '||x_return_status);
1461                                    END IF;
1462 
1463                                    -- if there are any deliverable instances to be deleted
1464                                    IF delIds.count > 0 THEN
1465                                        --- call delete_del_instances or OKC_DELIVERABLE_PROCESS_PVT
1466                                        OKC_DELIVERABLE_PROCESS_PVT.delete_del_instances(
1467                                                p_api_version  => l_api_version,
1468                                                p_init_msg_list => G_FALSE,
1469                                                p_doc_id    => p_bus_doc_id,
1470                                                p_doc_type  => p_bus_doc_type,
1471                                                p_doc_version => p_bus_doc_version,
1472                     p_Conditional_Delete_Flag => 'Y',
1473                                                p_delid_tab => delIds,
1474                                                x_msg_data   => x_msg_data,
1475                                                x_msg_count  => x_msg_count,
1476                                                x_return_status  => x_return_status);
1477 
1478                                          IF ( FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
1479                                              FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE ,g_module||l_api_name
1480                                              ,'108: Recurring Definition = '||delRecTab(i).deliverable_id||
1481                                              ' Finished delete_del_instances for count '||delIds.count);
1482                                              FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE ,g_module||l_api_name
1483                                              ,'108: Recurring Definition = '||delRecTab(i).deliverable_id||
1484                                              ' Finished OKC_DELIVERABLE_PROCESS_PVT.delete_del_instances '
1485                                              ||x_return_status);
1486                                          END IF;
1487 
1488                                          IF (x_return_status = G_RET_STS_UNEXP_ERROR) THEN
1489                                             RAISE FND_API.G_EXC_UNEXPECTED_ERROR ;
1490                                          ELSIF (x_return_status = G_RET_STS_ERROR) THEN
1491                                             RAISE FND_API.G_EXC_ERROR ;
1492                                          END IF;
1493 
1494                                          IF ( FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
1495                                             FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE ,g_module||l_api_name
1496                                             ,'108: Recurring Definition = '||delRecTab(i).deliverable_id||
1497                                             ' Updating Definition ');
1498                                          END IF;
1502 
1499                                      END IF; -- delIds count  > 0
1500                                      --- increment the count
1501                                      del_count := del_count+1;
1503                                  -- record deliverable id to be updated at the end
1504                                      deliverableIds(del_count) := delRecTab(i).deliverable_id;
1505 
1506                          -- record actual date, start event date and end event date
1507                                      deliverableDueDates(del_count) := NULL;
1508                                      deliverableStartEventDates(del_count) := delRecTab(i).start_event_date;
1509                                      deliverableEndEventDates(del_count) := l_recurr_end_date;
1510 
1511                                 END IF; -- New end date is LESS
1512 
1513                                 --- check if new date is greater then old date
1514                                 --- generate new instances with start date as old end date
1515                                 --- and end date as new end date, us the same repeat frequency on
1516                                 --- the given deliverable and resolve it.
1517                                 IF TRUNC(l_recurr_end_date) > TRUNC(delRecTab(i).end_event_date) THEN
1518 
1519                                     IF ( FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
1520                                         FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE ,g_module||l_api_name,'108: Recurring Definition = '||delRecTab(i).deliverable_id||' New end Date is GREATER then OLD End Date '||l_recurr_end_date);
1521                                         FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE ,g_module||l_api_name,'108: Recurring Definition = '||delRecTab(i).deliverable_id||' Hence create new Instances '||l_recurr_end_date);
1522                                      END IF;
1523 
1524                                     --- get the repeat frequency and create new instances
1525                                     l_repeat_day_of_month := getDayOfMonth(
1526                                                              delRecTab(i).repeating_day_of_month);
1527                                     l_repeat_day_of_week  := getDayOfWeek(
1528                                                               delRecTab(i).repeating_day_of_week);
1529 
1530                                     --- check the status of exiting instances
1531                                     l_new_status :=
1532                                                checkStatusOfExistingInstances(
1533                                                    p_bus_doc_id => p_bus_doc_id,
1534                                                    p_bus_doc_type => p_bus_doc_type,
1535                                                    p_bus_doc_version => p_bus_doc_version,
1536                                                    p_del_id => delRecTab(i).deliverable_id);
1537                                      IF ( FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
1538                                          FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE ,g_module||l_api_name,'108: Recurring Definition = '||delRecTab(i).deliverable_id||' Got new Status '||l_new_status);
1539                                          FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE ,g_module||l_api_name,'108: Recurring Definition = '||delRecTab(i).deliverable_id||' Calling generate_del_instances ');
1540                                      END IF;
1541 
1542                                      -- generate recurring instances for
1543                                      -- given deliverable definition id
1544                                      generate_del_instances(
1545                                                  p_recurr_start_date => (delRecTab(i).end_event_date+1),
1546                                                  p_recurr_end_date => l_recurr_end_date,
1547                                                  p_repeat_duration => delRecTab(i).repeating_duration,
1548                                                  p_repeat_day_of_month => l_repeat_day_of_month,
1549                                                  p_repeat_day_of_week => l_repeat_day_of_week,
1550                                                  delRecord => delRecTab(i),
1551                                                  p_change_status_to => l_new_status);
1552 
1553                                       IF ( FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
1554                                            FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE ,g_module||l_api_name,'108: Recurring Definition = '||delRecTab(i).deliverable_id||' Finished generate_del_instances ');
1555                                       END IF;
1556                                       ----- Done Creating new deliverable instances ---
1557 
1558                                       IF ( FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
1559                                           FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE ,g_module||l_api_name,'108: Recurring Definition = '||delRecTab(i).deliverable_id||' Updating Definition ');
1560                                       END IF;
1561 
1562                                       --- increment the count
1563                                       del_count := del_count+1;
1564 
1565                                   -- record deliverable id to be updated at the end
1566                                       deliverableIds(del_count) := delRecTab(i).deliverable_id;
1567 
1568                          -- record actual date, start event date and end event date
1569                                       deliverableDueDates(del_count) := NULL;
1573                                 END IF; --- New End date is GREATER
1570                                       deliverableEndEventDates(del_count) := l_recurr_end_date;
1571                                       deliverableStartEventDates(del_count) := delRecTab(i).start_event_date;
1572 
1574                                 IF ( FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
1575                                     FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE ,g_module||l_api_name,'108: Recurring Definition = '||delRecTab(i).deliverable_id||' Finished generate_del_instances ');
1576                                 END IF;
1577 
1578                                 ELSE -- if sync flag is NOT true
1579                                     -- delete existing instances and re-generate new
1580                                     -- instances
1581 
1582                                    IF ( FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
1583                                        FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE ,g_module||l_api_name,'1080: Recurring Definition = '||delRecTab(i).deliverable_id||' As Sync Flag is N, Deleting existing instances ');
1584                                    END IF;
1585 
1586                                    --- hard Delete old instances from current version
1587                                    OPEN get_del_ids_cur2(delRecTab(i).deliverable_id);
1588                                    FETCH get_del_ids_cur2 BULK COLLECT INTO delIds;
1589                                    CLOSE get_del_ids_cur2;
1590 
1591                                    IF ( FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
1592                                        FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE ,g_module||l_api_name
1593                                        ,'1081: Recurring Definition = '||delRecTab(i).deliverable_id||
1594                                        ' Calling OKC_DELIVERABLE_PROCESS_PVT.delete_del_instances for count '
1595                                        ||delIds.count);
1596                                    END IF;
1597 
1598                                    -- if there are any deliverable instances to be deleted
1599                                    IF delIds.count > 0 THEN
1600                                        --- call delete_del_instances or OKC_DELIVERABLE_PROCESS_PVT
1601                                        OKC_DELIVERABLE_PROCESS_PVT.delete_del_instances(
1602                                                p_api_version  => l_api_version,
1603                                                p_init_msg_list => G_FALSE,
1604                                                p_doc_id    => p_bus_doc_id,
1605                                                p_doc_type  => p_bus_doc_type,
1606                                                p_doc_version => p_bus_doc_version,
1607                     p_Conditional_Delete_Flag => 'N',
1608                                                p_delid_tab => delIds,
1609                                                x_msg_data   => x_msg_data,
1610                                                x_msg_count  => x_msg_count,
1611                                                x_return_status  => x_return_status);
1612 
1613                                          IF (x_return_status = G_RET_STS_UNEXP_ERROR) THEN
1614                                             RAISE FND_API.G_EXC_UNEXPECTED_ERROR ;
1615                                          ELSIF (x_return_status = G_RET_STS_ERROR) THEN
1616                                             RAISE FND_API.G_EXC_ERROR ;
1617                                          END IF;
1618 
1619                                          IF ( FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
1620                                              FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE ,g_module||l_api_name
1621                                              ,'108: Recurring Definition = '||delRecTab(i).deliverable_id||
1622                                              ' Finished OKC_DELIVERABLE_PROCESS_PVT.delete_del_instances for count '||delIds.count);
1623                                          END IF;
1624                                     END IF;
1625                                     -- set the flag to generate new instances
1626                                     generate_new_instances_yn := 'Y';
1627                                 END IF;
1628 --                            END IF; --- check if amendment operation is (R)evised
1629                         END IF; -- hasInstances
1630 
1631                         --- recurring deliverable is newly created or instances are deleted
1632                         IF l_has_instances_yn ='N' OR generate_new_instances_yn = 'Y' THEN
1633 
1634                             IF ( FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
1635                                 FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE ,g_module||l_api_name,'108: Recurring Definition = '||delRecTab(i).deliverable_id||' New Recurring Definition ');
1636                             END IF;
1637 
1638                              --- get start date, if relative to an event, evaluate it
1639                             --- check if start event id is populated, if yes evaluate the start
1640                             --- date or actual date.
1641                             IF delRecTab(i).RELATIVE_ST_DATE_EVENT_ID is not null THEN
1642 
1643                                 IF ( FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
1644                                     FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE ,g_module||l_api_name,'108: Recurring Definition = '||delRecTab(i).deliverable_id||' Start date is Relative ');
1645                                 END IF;
1646 
1647                                 l_recurr_start_date := NULL;
1648 
1649                                 --- resolve relative end date
1653                                        p_event_date => p_event_date,
1650                                 l_recurr_start_date := resolveRelativeDueEvents(
1651                                        p_bus_doc_date_events_tbl => p_bus_doc_date_events_tbl,
1652                                        p_event_code => p_event_code,
1654                                        p_event_id => delRecTab(i).relative_st_date_event_id,
1655                                        p_event_UOM => delRecTab(i).relative_st_date_uom,
1656                                        p_event_duration => delRecTab(i).relative_st_date_duration,
1657                                        p_end_event_yn => 'N');
1658 
1659                             ELSE --- start date is Fixed
1660 
1661                                 IF ( FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
1662                                     FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE ,g_module||l_api_name,'108: Recurring Definition = '||delRecTab(i).deliverable_id||' Start date is fixed '||delRecTab(i).fixed_start_date);
1663                                 END IF;
1664 
1665                                 -- start date is FIXED
1666                                 l_recurr_start_date := delRecTab(i).fixed_start_date;
1667 
1668                                 -- By this time l_recurr_start_date should not be NULL
1669                                 IF l_recurr_start_date is NULL  THEN
1670                                    Okc_Api.Set_Message(G_APP_NAME,
1671                                                     'OKC_DEL_ST_DT_NOT_FOUND');
1672                                     RAISE FND_API.G_EXC_ERROR;
1673                                 END IF;
1674                             END IF; --- Start date resolved
1675 
1676                             IF ( FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
1677                                FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE ,g_module||l_api_name,'108: Recurring Definition = '||delRecTab(i).deliverable_id||' Start date is resolved  Now resolve End Date');
1678                             END IF;
1679 
1680                          --- if recurring start date is resolved, only in that case
1681                          --- go further, resolve end date and generate instances
1682                          IF l_recurr_start_date is not NULL THEN
1683 
1684                             --- get the end date
1685                             --- check if end date is fixed
1686                             IF delRecTab(i).fixed_end_date is not null THEN
1687 
1688                                IF ( FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
1689                                    FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE ,g_module||l_api_name,'108: Recurring Definition = '||delRecTab(i).deliverable_id||' End Date is Fixed'||delRecTab(i).fixed_end_date);
1690                                END IF;
1691 
1692                                -- recurring end date is FIXED
1693                                l_recurr_end_date := delRecTab(i).fixed_end_date;
1694 
1695                              ELSE --- is not fixed, resolve if relative
1696 
1697                                   --- initialize
1698                                   l_recurr_end_date := NULL;
1699 
1700                                   IF ( FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
1701                                       FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE ,g_module||l_api_name,'108: Recurring Definition = '||delRecTab(i).deliverable_id||' End Date is Relative');
1702                                   END IF;
1703 
1704                                   --- resolve relative end date
1705                                   l_recurr_end_date := resolveRelativeDueEvents(
1706                                        p_bus_doc_date_events_tbl => p_bus_doc_date_events_tbl,
1707                                        p_event_code => p_event_code,
1708                                        p_event_date => p_event_date,
1709                                        p_event_id => delRecTab(i).relative_end_date_event_id,
1710                                        p_event_UOM => delRecTab(i).relative_end_date_uom,
1711                                        p_event_duration => delRecTab(i).relative_end_date_duration,
1712                                        p_end_event_yn => 'Y');
1713 
1714                             END IF; --- get the end date
1715 
1716                             IF l_recurr_end_date is NULL THEN
1717                                Okc_Api.Set_Message(G_APP_NAME,
1718                                             'OKC_DEL_END_DT_NOT_FOUND');
1719                                 RAISE FND_API.G_EXC_ERROR;
1720                              END IF;
1721 
1722                              IF ( FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
1723                                  FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE ,g_module||l_api_name,'108: Recurring Definition = '||delRecTab(i).deliverable_id||' Get Recurring Frequency ');
1724                              END IF;
1725 
1726                              l_repeat_day_of_month := getDayOfMonth(
1727                                                   delRecTab(i).REPEATING_DAY_OF_MONTH);
1728                              l_repeat_day_of_week  := getDayOfWeek(
1729                                                   delRecTab(i).REPEATING_DAY_OF_WEEK);
1730 
1731                              -- if both frequency values ar null
1732                              IF (l_repeat_day_of_month is NULL AND l_repeat_day_of_week is NULL) THEN
1733                                  Okc_Api.Set_Message(G_APP_NAME,
1734                                       'OKC_DEL_RECUR_FRQ_NOT_FOUND');
1735                                     RAISE FND_API.G_EXC_ERROR;
1736                              END IF;
1737 
1741 
1738                              IF ( FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
1739                                   FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE ,g_module||l_api_name,'108: Recurring Definition = '||delRecTab(i).deliverable_id||' Generate Instances ');
1740                              END IF;
1742                              -- generate recurring instances
1743                              generate_del_instances(
1744                                                   p_recurr_start_date => l_recurr_start_date,
1745                                                   p_recurr_end_date => l_recurr_end_date,
1746                                                   p_repeat_duration => delRecTab(i).repeating_duration,
1747                                                   p_repeat_day_of_month => l_repeat_day_of_month,
1748                                                   p_repeat_day_of_week => l_repeat_day_of_week,
1749                                                   delRecord => delRecTab(i),
1750                                                   p_change_status_to => NULL);
1751 
1752                               IF ( FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
1753                                   FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE ,g_module||l_api_name,'108: Recurring Definition = '||delRecTab(i).deliverable_id||' Updating definition ');
1754                               END IF;
1755 
1756                               --- increment the count
1757                               del_count := del_count+1;
1758 
1759                             -- record deliverable id to be updated at the end
1760                               deliverableIds(del_count) := delRecTab(i).deliverable_id;
1761 
1762                   -- record actual date, start event date and end event date
1763                               deliverableDueDates(del_count) := NULL;
1764                               deliverableStartEventDates(del_count) := l_recurr_start_date;
1765                               deliverableEndEventDates(del_count) := l_recurr_end_date;
1766 
1767                          END IF; --- if recurring start date is resolved
1768 
1769                        END IF; --- recurring deliverable is newly created or instances are deleted
1770 
1771                      ELSE -- if not Recurring, deliverable is one time with relative start event
1772 
1773                         --- check if start event id is populated, if yes evaluate the start
1774                         --- date or actual date.
1775                   l_actual_date := NULL;
1776                         IF delRecTab(i).RELATIVE_ST_DATE_EVENT_ID is not null THEN
1777 
1778                            IF ( FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
1779                                FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE ,g_module||l_api_name,'110:Deliverable is One Time ');
1780                            END IF;
1781 
1782               -- check and create status history record for INACTIVE status
1783               checkAndCreateStatusHistory(p_deliverable_id => delRecTab(i).deliverable_id,
1784                             p_deliverable_status => 'INACTIVE',
1785                             x_msg_data => x_msg_data,
1786                             x_msg_count => x_msg_count,
1787                             x_return_status => x_return_status);
1788               IF (x_return_status = G_RET_STS_UNEXP_ERROR) THEN
1789                 RAISE FND_API.G_EXC_UNEXPECTED_ERROR ;
1790               ELSIF (x_return_status = G_RET_STS_ERROR) THEN
1791                 RAISE FND_API.G_EXC_ERROR ;
1792               END IF;
1793 
1794 
1795                            --- resolve relative end date
1796                            l_actual_date := resolveRelativeDueEvents(
1797                                        p_bus_doc_date_events_tbl => p_bus_doc_date_events_tbl,
1798                                        p_event_code => p_event_code,
1799                                        p_event_date => p_event_date,
1800                                        p_event_id => delRecTab(i).relative_st_date_event_id,
1801                                        p_event_UOM => delRecTab(i).relative_st_date_uom,
1802                                        p_event_duration => delRecTab(i).relative_st_date_duration,
1803                                        p_end_event_yn => 'N');
1804                             IF ( FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
1805                                 FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE ,g_module||l_api_name,'113: Updating Definition');
1806                             END IF;
1807 
1808                             --- if actual date is resolved
1809                             IF l_actual_date is not NULL THEN
1810 
1811                                 --- increment the count
1812                                 del_count := del_count+1;
1813 
1814                                 -- record deliverable id to be updated at the end
1815                                 deliverableIds(del_count) := delRecTab(i).deliverable_id;
1816 
1817                   -- record actual date, start event date and end event date
1818                                 deliverableDueDates(del_count) :=l_actual_date;
1819                                 deliverableStartEventDates(del_count) := l_actual_date;
1820                                 deliverableEndEventDates(del_count) := NULL;
1821                             END IF;
1822                         END IF; --- deliverable with Start due date event
1823                     END IF;
1824                 END LOOP;
1825               END IF;
1826 
1827               IF ( FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
1828                   FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE ,g_module||l_api_name,'113: Buld update started');
1832               --- bulk update for deliverables actual due date
1829               END IF;
1830 
1831 
1833               IF deliverableIds.count > 0 THEN
1834          FORALL i IN deliverableIds.FIRST..deliverableIds.LAST
1835           UPDATE okc_deliverables
1836           SET
1837           actual_due_date = deliverableDueDates(i),
1838           start_event_date = deliverableStartEventDates(i),
1839           end_event_date = deliverableEndEventDates(i),
1840           last_updated_by= Fnd_Global.User_Id,
1841           last_update_date = sysdate,
1842           last_update_login = Fnd_Global.Login_Id
1843           WHERE deliverable_id = deliverableIds(i);
1844                END IF;
1845                   IF del_cur %ISOPEN THEN
1846                      CLOSE del_cur ;
1847                   END IF;
1848 
1849    IF FND_API.To_Boolean( p_commit ) THEN
1850       COMMIT WORK;
1851    END IF;
1852 
1853    IF ( FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
1854         FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE ,g_module||l_api_name,'1000: Leaving resolveDeliverables');
1855    END IF;
1856 
1857     EXCEPTION
1858 
1859     WHEN FND_API.G_EXC_ERROR THEN
1860      IF ( FND_LOG.LEVEL_ERROR >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
1861         FND_LOG.STRING( FND_LOG.LEVEL_ERROR ,g_module||l_api_name,'800: Leaving resolveDeliverables Unexpected ERROR');
1862      END IF;
1863      IF del_cur %ISOPEN THEN
1864         CLOSE del_cur ;
1865      END IF;
1866      IF get_del_ids_cur %ISOPEN THEN
1867         CLOSE get_del_ids_cur;
1868      END IF;
1869 
1870      ROLLBACK TO g_resolve_del_GRP;
1871      x_return_status := G_RET_STS_ERROR ;
1872      FND_MSG_PUB.Count_And_Get(p_encoded=>'F', p_count => x_msg_count, p_data => x_msg_data );
1873 
1874      WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
1875      IF ( FND_LOG.LEVEL_UNEXPECTED >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
1876         FND_LOG.STRING( FND_LOG.LEVEL_UNEXPECTED ,g_module||l_api_name,'900: Leaving resolveDeliverables Unexpected ERROR');
1877      END IF;
1878      IF del_cur %ISOPEN THEN
1879         CLOSE del_cur ;
1880      END IF;
1881      IF get_del_ids_cur %ISOPEN THEN
1882         CLOSE get_del_ids_cur;
1883      END IF;
1884 
1885      ROLLBACK TO g_resolve_del_GRP;
1886      x_return_status := G_RET_STS_UNEXP_ERROR ;
1887      FND_MSG_PUB.Count_And_Get(p_encoded=>'F', p_count => x_msg_count, p_data => x_msg_data );
1888 
1889     WHEN OTHERS THEN
1890     IF ( FND_LOG.LEVEL_UNEXPECTED >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
1891        FND_LOG.STRING( FND_LOG.LEVEL_UNEXPECTED ,g_module||l_api_name,'1000: Leaving resolveDeliverables because of EXCEPTION: '||substr(sqlerrm,1,200));
1892     END IF;
1893     IF del_cur %ISOPEN THEN
1894        CLOSE del_cur ;
1895     END IF;
1896      IF get_del_ids_cur %ISOPEN THEN
1897         CLOSE get_del_ids_cur;
1898      END IF;
1899 
1900     ROLLBACK TO g_resolve_del_GRP;
1901     x_return_status := G_RET_STS_UNEXP_ERROR ;
1902     IF FND_MSG_PUB.Check_Msg_Level( FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR ) THEN
1903          FND_MSG_PUB.Add_Exc_Msg( G_PKG_NAME, l_api_name );
1904     END IF;
1905     FND_MSG_PUB.Count_And_Get(p_encoded=>'F', p_count => x_msg_count, p_data => x_msg_data );
1906 
1907    END; -- resolveDeliverables
1908 
1909    /**
1910     * Update deliverables, re-resolve deliverables for the dates passed by
1911     * bus doc api, assumed to be changed.
1912     */
1913    PROCEDURE updateDeliverables (
1914     p_api_version               IN NUMBER,
1915     p_init_msg_list             IN VARCHAR2,
1916     p_commit            IN  Varchar2,
1917     p_bus_doc_id                IN NUMBER,
1918     p_bus_doc_type              IN VARCHAR2,
1919     p_bus_doc_version           IN NUMBER,
1920     p_bus_doc_date_events_tbl IN BUSDOCDATES_TBL_TYPE,
1921     x_msg_data                  OUT NOCOPY  VARCHAR2,
1922     x_msg_count                 OUT NOCOPY  NUMBER,
1923     x_return_status             OUT NOCOPY  VARCHAR2)
1924     IS
1925 
1926        --- Define cursor to fetch already resolved deliverables
1927     -- update cursor for bug#4069955
1928     -- Updated the cusror bug 5018624
1929        CURSOR del_cur IS
1930         SELECT  *
1931         FROM    okc_deliverables del
1932         WHERE business_document_id = p_bus_doc_id
1933         AND   business_document_type = p_bus_doc_type
1934         AND   business_document_version = p_bus_doc_version
1935         AND   (
1936               (fixed_due_date_yn = 'N'
1937         AND    (amendment_operation is NULL OR amendment_operation <> 'DELETED')
1938 	AND    (summary_amend_operation_code is NULL OR summary_amend_operation_code <> 'DELETED')
1939         AND    recurring_YN ='N'
1940         AND    actual_due_date is not null
1941         AND    recurring_del_parent_id is null)
1942               OR
1943               (recurring_YN = 'Y'
1944         AND    recurring_del_parent_id is null
1945         AND    del.deliverable_type in ( select d.deliverable_type_code
1946                                          from okc_bus_doc_types_b bd,
1947                                               okc_del_bus_doc_combxns d
1948                                          WHERE bd.document_type = del.business_document_type
1949                                          AND d.document_type_class = bd.document_type_class
1950                                          AND del.deliverable_type = d.deliverable_type_code ))
1951               );
1952        del_rec   del_cur%ROWTYPE;
1953        k   PLS_INTEGER;
1954       CURSOR get_del_ids_cur1 (p_del_id IN NUMBER) IS
1958          AND   business_document_version = p_bus_doc_version
1955        SELECT deliverable_id FROM OKC_DELIVERABLES
1956          WHERE business_document_id = p_bus_doc_id
1957        AND   business_document_type = p_bus_doc_type
1959        AND   recurring_del_parent_id = p_del_id;
1960 
1961       CURSOR get_del_ids_cur2 (p_del_id IN NUMBER, p_actual_date IN DATE) IS
1962        SELECT deliverable_id FROM OKC_DELIVERABLES
1963          WHERE business_document_id = p_bus_doc_id
1964        AND   business_document_type = p_bus_doc_type
1965          AND   business_document_version = p_bus_doc_version
1966        AND   recurring_del_parent_id = p_del_id
1967        AND   TRUNC(actual_due_date) > TRUNC(p_actual_date);
1968 
1969        --- for deliverable ids
1970        delIds OKC_DELIVERABLE_PROCESS_PVT.delIdTabType;
1971 
1972        TYPE DelIdList IS TABLE OF NUMBER
1973        INDEX BY BINARY_INTEGER;
1974        deliverableIds DelIdList;
1975        TYPE DelDueDatetList IS TABLE OF DATE
1976        INDEX BY BINARY_INTEGER;
1977        deliverableDueDates DelDueDatetList;
1978        TYPE DelStartEventDateList IS TABLE OF DATE
1979        INDEX BY BINARY_INTEGER;
1980        deliverableStartEventDates DelStartEventDateList;
1981        TYPE DelEndEventDateList IS TABLE OF DATE
1982        INDEX BY BINARY_INTEGER;
1983        deliverableEndEventDates DelEndEventDateList;
1984 
1985        del_count PLS_INTEGER;
1986 
1987        l_api_name      CONSTANT VARCHAR2(30) := 'updateDeliverables';
1988        l_api_version     CONSTANT VARCHAR2(30) := 1;
1989 
1990        -- for storage of bulk Fetch
1991        delRecTab OKC_DELIVERABLE_PROCESS_PVT.delRecTabType;
1992 
1993        -- for storage recurrign instances
1994        delInstanceRecTab OKC_DELIVERABLE_PROCESS_PVT.delRecTabType;
1995 
1996        l_del_event_name OKC_BUS_DOC_EVENTS_B.business_event_code%TYPE;
1997        l_del_before_after OKC_BUS_DOC_EVENTS_B.before_after%TYPE;
1998        l_actual_date DATE;
1999        l_recurr_end_date DATE;
2000 
2001        l_repeat_day_of_month number;
2002        l_repeat_day_of_week number;
2003 
2004        l_new_status OKC_DELIVERABLES.deliverable_status%TYPE;
2005        l_has_instances_yn VARCHAR2(1);
2006 
2007     BEGIN
2008       -- initialize
2009       k := 0;
2010       del_count := 0;
2011       l_actual_date := null;
2012       l_recurr_end_date := null;
2013 
2014       --- if any dates have been changed on given business document, and
2015       --- selected deliverables are effected, re-resolve due dates and
2016       --- and carry forward statuses
2017 
2018         -- start procedure
2019         IF ( FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
2020             FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE ,g_module||l_api_name,'100: Entered '||G_PKG_NAME ||'.'||l_api_name);
2021         END IF;
2022         -- Standard Start of API savepoint
2023         SAVEPOINT g_update_del_GRP;
2024 
2025         -- Standard call to check for call compatibility.
2026         IF NOT FND_API.Compatible_API_Call( l_api_version, p_api_version, l_api_name, G_PKG_NAME) THEN
2027           RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
2028         END IF;
2029 
2030         -- Initialize message list if p_init_msg_list is set to TRUE.
2031         IF FND_API.to_Boolean( p_init_msg_list ) THEN
2032           FND_MSG_PUB.initialize;
2033         END IF;
2034 
2035         --  Initialize API return status to success
2036         x_return_status := FND_API.G_RET_STS_SUCCESS;
2037 
2038         --- open deliverables cursor and populate records of table
2039                 FOR del_rec IN del_cur LOOP
2040                         k := k+1;
2041                         delRecTab(k).deliverable_id := del_rec.deliverable_id;
2042                         delRecTab(k).BUSINESS_DOCUMENT_TYPE:= del_rec.BUSINESS_DOCUMENT_TYPE;
2043                         delRecTab(k).BUSINESS_DOCUMENT_ID:= del_rec.BUSINESS_DOCUMENT_ID;
2044                         delRecTab(k).BUSINESS_DOCUMENT_NUMBER:= del_rec.BUSINESS_DOCUMENT_NUMBER;
2045                         delRecTab(k).DELIVERABLE_TYPE:= del_rec.DELIVERABLE_TYPE;
2046                         delRecTab(k).RESPONSIBLE_PARTY:= del_rec.RESPONSIBLE_PARTY;
2047                         delRecTab(k).INTERNAL_PARTY_CONTACT_ID:= del_rec.INTERNAL_PARTY_CONTACT_ID;
2048                         delRecTab(k).EXTERNAL_PARTY_CONTACT_ID:= del_rec.EXTERNAL_PARTY_CONTACT_ID;
2049                         delRecTab(k).DELIVERABLE_NAME:= del_rec.DELIVERABLE_NAME;
2050                         delRecTab(k).DESCRIPTION:= del_rec.DESCRIPTION;
2051                         delRecTab(k).COMMENTS:= del_rec.COMMENTS;
2052                         delRecTab(k).DISPLAY_SEQUENCE:= del_rec.DISPLAY_SEQUENCE;
2053                         delRecTab(k).FIXED_DUE_DATE_YN:= del_rec.FIXED_DUE_DATE_YN;
2054                         delRecTab(k).ACTUAL_DUE_DATE:= del_rec.ACTUAL_DUE_DATE;
2055                         delRecTab(k).PRINT_DUE_DATE_MSG_NAME:= del_rec.PRINT_DUE_DATE_MSG_NAME;
2056                         delRecTab(k).RECURRING_YN:= del_rec.RECURRING_YN;
2057                         delRecTab(k).NOTIFY_PRIOR_DUE_DATE_VALUE:= del_rec.NOTIFY_PRIOR_DUE_DATE_VALUE;
2058                         delRecTab(k).NOTIFY_PRIOR_DUE_DATE_UOM:= del_rec.NOTIFY_PRIOR_DUE_DATE_UOM;
2059                         delRecTab(k).NOTIFY_PRIOR_DUE_DATE_YN:= del_rec.NOTIFY_PRIOR_DUE_DATE_YN;
2060                         delRecTab(k).NOTIFY_COMPLETED_YN:= del_rec.NOTIFY_COMPLETED_YN;
2061                         delRecTab(k).NOTIFY_OVERDUE_YN:= del_rec.NOTIFY_OVERDUE_YN;
2062                         delRecTab(k).NOTIFY_ESCALATION_YN:= del_rec.NOTIFY_ESCALATION_YN;
2066                         delRecTab(k).AMENDMENT_OPERATION:= del_rec.AMENDMENT_OPERATION;
2063                         delRecTab(k).NOTIFY_ESCALATION_VALUE:= del_rec.NOTIFY_ESCALATION_VALUE;
2064                         delRecTab(k).NOTIFY_ESCALATION_UOM:= del_rec.NOTIFY_ESCALATION_UOM;
2065                         delRecTab(k).ESCALATION_ASSIGNEE:= del_rec.ESCALATION_ASSIGNEE;
2067                         delRecTab(k).PRIOR_NOTIFICATION_ID:= del_rec.PRIOR_NOTIFICATION_ID;
2068                         delRecTab(k).AMENDMENT_NOTES:= del_rec.AMENDMENT_NOTES;
2069                         delRecTab(k).COMPLETED_NOTIFICATION_ID:= del_rec.COMPLETED_NOTIFICATION_ID;
2070                         delRecTab(k).OVERDUE_NOTIFICATION_ID:= del_rec.OVERDUE_NOTIFICATION_ID;
2071                         delRecTab(k).ESCALATION_NOTIFICATION_ID:= del_rec.ESCALATION_NOTIFICATION_ID;
2072                         delRecTab(k).LANGUAGE:= del_rec.LANGUAGE;
2073                         delRecTab(k).ORIGINAL_DELIVERABLE_ID:= del_rec.ORIGINAL_DELIVERABLE_ID;
2074                         delRecTab(k).REQUESTER_ID:= del_rec.REQUESTER_ID;
2075                         delRecTab(k).EXTERNAL_PARTY_ID:= del_rec.EXTERNAL_PARTY_ID;
2076                         delRecTab(k).EXTERNAL_PARTY_ROLE:= del_rec.EXTERNAL_PARTY_ROLE;
2077                         delRecTab(k).RECURRING_DEL_PARENT_ID:= del_rec.RECURRING_DEL_PARENT_ID;
2078                         delRecTab(k).BUSINESS_DOCUMENT_VERSION:= del_rec.BUSINESS_DOCUMENT_VERSION;
2079                         delRecTab(k).RELATIVE_ST_DATE_DURATION:= del_rec.RELATIVE_ST_DATE_DURATION;
2080                         delRecTab(k).RELATIVE_ST_DATE_UOM:= del_rec.RELATIVE_ST_DATE_UOM;
2081                         delRecTab(k).RELATIVE_ST_DATE_EVENT_ID:= del_rec.RELATIVE_ST_DATE_EVENT_ID;
2082                         delRecTab(k).RELATIVE_END_DATE_DURATION:= del_rec.RELATIVE_END_DATE_DURATION;
2083                         delRecTab(k).RELATIVE_END_DATE_UOM:= del_rec.RELATIVE_END_DATE_UOM;
2084                         delRecTab(k).RELATIVE_END_DATE_EVENT_ID:= del_rec.RELATIVE_END_DATE_EVENT_ID;
2085                         delRecTab(k).REPEATING_DAY_OF_MONTH:= del_rec.REPEATING_DAY_OF_MONTH;
2086                         delRecTab(k).REPEATING_DAY_OF_WEEK:= del_rec.REPEATING_DAY_OF_WEEK;
2087                         delRecTab(k).REPEATING_FREQUENCY_UOM:= del_rec.REPEATING_FREQUENCY_UOM;
2088                         delRecTab(k).REPEATING_DURATION:= del_rec.REPEATING_DURATION;
2089                         delRecTab(k).FIXED_START_DATE:= del_rec.FIXED_START_DATE;
2090                         delRecTab(k).FIXED_END_DATE:= del_rec.FIXED_END_DATE;
2091                         delRecTab(k).MANAGE_YN:= del_rec.MANAGE_YN;
2092                         delRecTab(k).INTERNAL_PARTY_ID:= del_rec.INTERNAL_PARTY_ID;
2093                         delRecTab(k).DELIVERABLE_STATUS:= del_rec.DELIVERABLE_STATUS;
2094                         delRecTab(k).STATUS_CHANGE_NOTES:= del_rec.STATUS_CHANGE_NOTES;
2095                         delRecTab(k).CREATED_BY:= del_rec.CREATED_BY;
2096                         delRecTab(k).CREATION_DATE:= del_rec.CREATION_DATE;
2097                         delRecTab(k).LAST_UPDATED_BY:= del_rec.LAST_UPDATED_BY;
2098                         delRecTab(k).LAST_UPDATE_DATE:= del_rec.LAST_UPDATE_DATE;
2099                         delRecTab(k).LAST_UPDATE_LOGIN:= del_rec.LAST_UPDATE_LOGIN;
2100                         delRecTab(k).OBJECT_VERSION_NUMBER:= del_rec.OBJECT_VERSION_NUMBER;
2101                         delRecTab(k).ATTRIBUTE_CATEGORY:= del_rec.ATTRIBUTE_CATEGORY;
2102                         delRecTab(k).ATTRIBUTE1:= del_rec.ATTRIBUTE1;
2103                         delRecTab(k).ATTRIBUTE2:= del_rec.ATTRIBUTE2;
2104                         delRecTab(k).ATTRIBUTE3:= del_rec.ATTRIBUTE3;
2105                         delRecTab(k).ATTRIBUTE4:= del_rec.ATTRIBUTE4;
2106                         delRecTab(k).ATTRIBUTE5:= del_rec.ATTRIBUTE5;
2107                         delRecTab(k).ATTRIBUTE6:= del_rec.ATTRIBUTE6;
2108                         delRecTab(k).ATTRIBUTE7:= del_rec.ATTRIBUTE7;
2109                         delRecTab(k).ATTRIBUTE8:= del_rec.ATTRIBUTE8;
2110                         delRecTab(k).ATTRIBUTE9:= del_rec.ATTRIBUTE9;
2111                         delRecTab(k).ATTRIBUTE10:= del_rec.ATTRIBUTE10;
2112                         delRecTab(k).ATTRIBUTE11:= del_rec.ATTRIBUTE11;
2113                         delRecTab(k).ATTRIBUTE12:= del_rec.ATTRIBUTE12;
2114                         delRecTab(k).ATTRIBUTE13:= del_rec.ATTRIBUTE13;
2115                         delRecTab(k).ATTRIBUTE14:= del_rec.ATTRIBUTE14;
2116                         delRecTab(k).ATTRIBUTE15:= del_rec.ATTRIBUTE15;
2117                         delRecTab(k).DISABLE_NOTIFICATIONS_YN:= del_rec.DISABLE_NOTIFICATIONS_YN;
2118                         delRecTab(k).LAST_AMENDMENT_DATE:= del_rec.LAST_AMENDMENT_DATE;
2119                         delRecTab(k).BUSINESS_DOCUMENT_LINE_ID:= del_rec.BUSINESS_DOCUMENT_LINE_ID;
2120                         delRecTab(k).EXTERNAL_PARTY_SITE_ID:= del_rec.EXTERNAL_PARTY_SITE_ID;
2121                         delRecTab(k).START_EVENT_DATE:= del_rec.START_EVENT_DATE;
2122                         delRecTab(k).END_EVENT_DATE:= del_rec.END_EVENT_DATE;
2123                         delRecTab(k).SUMMARY_AMEND_OPERATION_CODE:= del_rec.SUMMARY_AMEND_OPERATION_CODE;
2124                         delRecTab(k).PAY_HOLD_PRIOR_DUE_DATE_VALUE:=del_rec.PAY_HOLD_PRIOR_DUE_DATE_VALUE;
2125                         delRecTab(k).PAY_HOLD_PRIOR_DUE_DATE_UOM:=del_rec.PAY_HOLD_PRIOR_DUE_DATE_UOM;
2126                         delRecTab(k).PAY_HOLD_PRIOR_DUE_DATE_YN:=del_rec.PAY_HOLD_PRIOR_DUE_DATE_YN;
2127                         delRecTab(k).PAY_HOLD_OVERDUE_YN:=del_rec.PAY_HOLD_OVERDUE_YN;
2128 
2129                 END LOOP;
2130 
2131             -- commented as this is not supported by 8i PL/SQL Bug#3307941
2132             /*OPEN del_cur;
2133             FETCH del_cur BULK COLLECT INTO delRecTab;*/
2134 
2135 
2136         -- start procedure
2137         IF ( FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
2141         IF delRecTab.count > 0 THEN
2138             FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE ,g_module||l_api_name,'101: Got Deliverables records --- Count'||delRecTab.count);
2139         END IF;
2140 
2142 
2143             FOR i IN delRecTab.FIRST..delRecTab.LAST LOOP
2144 
2145               -- if there's no fixed start date, evaluate relative start date
2146               IF delRecTab(i).fixed_start_date is null THEN
2147 
2148                   -- start procedure
2149                   IF ( FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
2150                       FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE ,g_module||l_api_name,'102: Deliverable = '||delRecTab(i).deliverable_id||' is Not Fixed');
2151                   END IF;
2152 
2153                   --- initialize start date as NULL
2154                   l_actual_date := NULL;
2155 
2156                   --- if start date is relative, resolve the actual date
2157                   IF delRecTab(i).RELATIVE_ST_DATE_EVENT_ID is not NULL THEN
2158 
2159                       -- start procedure
2160                       IF ( FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
2161                           FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE ,g_module||l_api_name,'102: Deliverable = '||delRecTab(i).deliverable_id||' is Relative ');
2162                           FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE ,g_module||l_api_name,'103: Deliverable = '||delRecTab(i).deliverable_id||' Resolve Due Date Event ');
2163                       END IF;
2164 
2165                       --- resolve relative end date
2166                       l_actual_date := resolveRelativeDueEvents(
2167                                    p_bus_doc_date_events_tbl => p_bus_doc_date_events_tbl,
2168                                    p_event_code => NULL,
2169                                    p_event_date => NULL,
2170                                    p_event_id => delRecTab(i).relative_st_date_event_id,
2171                                    p_event_UOM => delRecTab(i).relative_st_date_uom,
2172                                    p_event_duration => delRecTab(i).relative_st_date_duration,
2173                                    p_end_event_yn => 'N');
2174                        -- start procedure
2175                        IF ( FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
2176                            FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE ,g_module||l_api_name,'104: Deliverable = '||delRecTab(i).deliverable_id||' Got actual date as '||l_actual_date);
2177                        END IF;
2178 
2179                        --- here if start date is not resolved, means there's not change
2180                        --- in start event date, so take the old start event date
2181                        IF l_actual_date is NULL THEN
2182 
2183                -- start procedure
2184                          IF ( FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
2185                               FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE ,g_module||l_api_name,'104: Deliverable = '||delRecTab(i).deliverable_id||' Get Start Event Date '||delRecTab(i).start_event_date);
2186                            END IF;
2187 
2188                  --- if Fixed start date
2189                            l_actual_date := delRecTab(i).start_event_date;
2190 
2191                        END IF;
2192           END IF; -- if start date is relative
2193 
2194                 ELSE -- if start date is fixed
2195 
2196                   --- initialize start date as NULL
2197                   l_actual_date := NULL;
2198 
2199                     -- start procedure
2200                     IF ( FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
2201                         FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE ,g_module||l_api_name,'104: Deliverable = '||delRecTab(i).deliverable_id||' Setting as START event Date ');
2202                     END IF;
2203 
2204                     --- if Fixed start date
2205                     l_actual_date := delRecTab(i).fixed_start_date;
2206 
2207                 END IF;
2208 
2209           --- If deliverable is One Time
2210             IF delRecTab(i).recurring_yn = 'N' THEN
2211 
2212                 IF ( FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
2213                     FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE ,g_module||l_api_name,'105: Deliverable = '||delRecTab(i).deliverable_id||' IS one time ');
2214                 END IF;
2215 
2216                 --- if resolved start date is not null, check if it is different
2217                 ---  from old start date
2218         IF l_actual_date is not NULL THEN
2219 
2220                   IF ( FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
2221                       FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE ,g_module||l_api_name,'105: Deliverable = '||delRecTab(i).deliverable_id||' Actual date is not NULL '||l_actual_date);
2222                   END IF;
2223                   IF ( FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
2224                       FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE ,g_module||l_api_name,'105a: Deliverable = '||delRecTab(i).deliverable_id||' Event date is  '||delRecTab(i).start_event_date);
2225                   END IF;
2226 
2227                   IF TRUNC(l_actual_date) <> TRUNC(delRecTab(i).start_event_date) THEN
2228 
2229                       IF ( FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
2230                           FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE ,g_module||l_api_name,'106: Deliverable = '||delRecTab(i).deliverable_id||' Actual date DOES not match existing start event date '||l_actual_date);
2231                       END IF;
2232 
2236                 -- record deliverable id to be updated at the end
2233                       --- increment the count
2234                       del_count := del_count+1;
2235 
2237               deliverableIds(del_count) := delRecTab(i).deliverable_id;
2238 
2239               -- record actual date, start event date and end event date
2240               deliverableDueDates(del_count) := l_actual_date;
2241               deliverableStartEventDates(del_count) := l_actual_date;
2242               deliverableEndEventDates(del_count) := NULL;
2243                    END IF; -- if resolved date is different then old resolved date
2244 
2245                  END IF; -- if resolved date is not null
2246 
2247             ELSE --- if deliverable is recurring
2248 
2249                     IF ( FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
2250                         FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE ,g_module||l_api_name,'108: Deliverable = '||delRecTab(i).deliverable_id||' is Recurring ');
2251                     END IF;
2252 
2253                     --- check if deliverable has recurring instances already in place
2254                     --- for given version of the document
2255                     l_has_instances_yn := hasInstances(
2256                                               p_bus_doc_id => p_bus_doc_id,
2257                                               p_bus_doc_type => p_bus_doc_type,
2258                                               p_bus_doc_version => p_bus_doc_version,
2259                                               p_del_id => delRecTab(i).deliverable_id);
2260 
2261                      IF ( FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
2262                          FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE ,g_module||l_api_name,'104: Recurring Deliverable, Has Instances = '||l_has_instances_yn);
2263                      END IF;
2264 
2265                 IF l_has_instances_yn = 'Y' THEN
2266 
2267                    --- check the status of exiting instances
2268                    l_new_status :=
2269                                 checkStatusOfExistingInstances(
2270                                     p_bus_doc_id => p_bus_doc_id,
2271                                     p_bus_doc_type => p_bus_doc_type,
2272                                     p_bus_doc_version => p_bus_doc_version,
2273                                     p_del_id => delRecTab(i).deliverable_id);
2274 
2275             --- Start date is changed, Re-resolve the deliverable completely.
2276             IF (l_actual_date is not NULL) AND (TRUNC(l_actual_date) <> TRUNC(delRecTab(i).start_event_date)) THEN
2277 
2278                         IF ( FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
2279                             FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE ,g_module||l_api_name,'109: Recurring Deliverable = '||delRecTab(i).deliverable_id||' Start date is changed -- new '||l_actual_date);
2280                             FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE ,g_module||l_api_name,'110: Recurring Deliverable = '||delRecTab(i).deliverable_id||' Start date is changed -- OLD '||delRecTab(i).start_event_date);
2281                         END IF;
2282 
2283                         OPEN get_del_ids_cur1(delRecTab(i).deliverable_id);
2284                         FETCH get_del_ids_cur1 BULK COLLECT INTO delIds;
2285                         CLOSE get_del_ids_cur1;
2286 
2287                         IF ( FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
2288                             FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE ,g_module||l_api_name,'111: Recurring Deliverable = '||delRecTab(i).deliverable_id||' instances to be Deleted Calling OKC_DELIVERABLE_PROCESS_PVT.delete_del_instances');
2289                         END IF;
2290 
2291                         IF delIds.count > 0 THEN
2292                             --- call delete_del_instances or OKC_DELIVERABLE_PROCESS_PVT
2293                   OKC_DELIVERABLE_PROCESS_PVT.delete_del_instances(
2294                      p_api_version  => l_api_version,
2295                    p_init_msg_list => G_FALSE,
2296                    p_doc_id    => p_bus_doc_id,
2297                    p_doc_type  => p_bus_doc_type,
2298                    p_doc_version => p_bus_doc_version,
2299                    p_Conditional_Delete_Flag => 'Y',
2300                    p_delid_tab => delIds,
2301                    x_msg_data   => x_msg_data,
2302                    x_msg_count  => x_msg_count,
2303                    x_return_status  => x_return_status);
2304 
2305                             IF ( FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
2306                                 FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE ,g_module||l_api_name,'112: Recurring Deliverable = '||delRecTab(i).deliverable_id||' FINISHED OKC_DELIVERABLE_PROCESS_PVT.delete_del_instances'||x_return_status);
2307                             END IF;
2308                             IF (x_return_status = G_RET_STS_UNEXP_ERROR) THEN
2309                                  RAISE FND_API.G_EXC_UNEXPECTED_ERROR ;
2310                             ELSIF (x_return_status = G_RET_STS_ERROR) THEN
2311                                  RAISE FND_API.G_EXC_ERROR ;
2312                             END IF;
2313                          END IF; -- end delIds > 0
2314                --- re-resolve the deliverable
2315                --- you have the start date.
2316                --- get end date, either fixed or relative
2317                          l_recurr_end_date := null;
2318                IF delRecTab(i).fixed_end_date is not null THEN
2319 
2320                             IF ( FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
2324                             --- set the end date as fixed end date
2321                                 FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE ,g_module||l_api_name,'112: Recurring Deliverable = '||delRecTab(i).deliverable_id||' End date is Fixed'||delRecTab(i).fixed_end_date);
2322                             END IF;
2323 
2325                 l_recurr_end_date := delRecTab(i).fixed_end_date;
2326 
2327                    ELSE -- end date is relative
2328 
2329                             IF ( FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
2330                                 FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE ,g_module||l_api_name,'113: Recurring Deliverable = '||delRecTab(i).deliverable_id||' End date is Relative, Resolve end data');
2331                             END IF;
2332 
2333                              --- resolve relative end date
2334                              l_recurr_end_date := resolveRelativeDueEvents(
2335                                    p_bus_doc_date_events_tbl => p_bus_doc_date_events_tbl,
2336                                    p_event_code => NULL,
2337                                    p_event_date => NULL,
2338                                    p_event_id => delRecTab(i).relative_end_date_event_id,
2339                                    p_event_UOM => delRecTab(i).relative_end_date_uom,
2340                                    p_event_duration => delRecTab(i).relative_end_date_duration,
2341                                    p_end_event_yn => 'Y');
2342 
2343                             IF ( FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
2344                                 FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE ,g_module||l_api_name,'114: Recurring Deliverable = '||delRecTab(i).deliverable_id||' Resolved End date '||l_recurr_end_date);
2345                             END IF;
2346 
2347                  END IF;
2348 
2349                          IF ( FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
2350                              FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE ,g_module||l_api_name,'115: Recurring Deliverable = '||delRecTab(i).deliverable_id||' Resolved End date '||l_recurr_end_date);
2351                          END IF;
2352 
2353                          --- if resolved end date comes out to be NULL, take the
2354                          --- old end event date
2355                         IF l_recurr_end_date is NULL THEN
2356 
2357                             IF ( FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
2358                               FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE ,g_module||l_api_name,'115: Recurring Deliverable = '||delRecTab(i).deliverable_id||' Getting End Event Date '||delRecTab(i).end_event_date);
2359                             END IF;
2360 
2361                             --- set the end date as fixed end date
2362                 l_recurr_end_date := delRecTab(i).end_event_date;
2363 
2364                         END IF;
2365 
2366                          --- raise exception if END is NULL
2367                          IF l_recurr_end_date is NULL THEN
2368                                    Okc_Api.Set_Message(G_APP_NAME,
2369                                     'OKC_DEL_END_DT_NOT_FOUND');
2370                                    RAISE FND_API.G_EXC_ERROR;
2371                          END IF;
2372 
2373 
2374                --- get the repeat frequency and create new instances
2375                l_repeat_day_of_month := getDayOfMonth(
2376                       delRecTab(i).REPEATING_DAY_OF_MONTH);
2377                l_repeat_day_of_week  := getDayOfWeek(
2378                       delRecTab(i).REPEATING_DAY_OF_WEEK);
2379 
2380                          -- if both frequency values ar null
2381                          IF (l_repeat_day_of_month is NULL AND l_repeat_day_of_week is NULL) THEN
2382                                  Okc_Api.Set_Message(G_APP_NAME,
2383                                       'OKC_DEL_RECUR_FRQ_NOT_FOUND');
2384                                     RAISE FND_API.G_EXC_ERROR;
2385                          END IF;
2386 
2387                         IF ( FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
2388                              FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE ,g_module||l_api_name,'116: Recurring Deliverable = '||delRecTab(i).deliverable_id||' Calling generated instances');
2389                         END IF;
2390 
2391                          -- generate recurring instances
2392                          generate_del_instances(
2393                                              p_recurr_start_date => l_actual_date,
2394                                              p_recurr_end_date => l_recurr_end_date,
2395                                              p_repeat_duration => delRecTab(i).repeating_duration,
2396                                              p_repeat_day_of_month => l_repeat_day_of_month,
2397                                              p_repeat_day_of_week => l_repeat_day_of_week,
2398                                              delRecord => delRecTab(i),
2399                                              p_change_status_to => l_new_status);
2400 
2401                         IF ( FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
2402                              FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE ,g_module||l_api_name,'117: Recurring Deliverable = '||delRecTab(i).deliverable_id||' Done generating instances');
2403                         END IF;
2404 
2405                          --- increment the count
2406                          del_count := del_count+1;
2407 
2408                -- record deliverable id to be updated at the end
2409                deliverableIds(del_count) := delRecTab(i).deliverable_id;
2410 
2411                -- record actual date, start event date and end event date
2415 
2412                deliverableDueDates(del_count) := NULL;
2413                deliverableStartEventDates(del_count) := l_actual_date;
2414                deliverableEndEventDates(del_count) := l_recurr_end_date;
2416            ELSE --- if start date is not changed
2417 
2418                     IF ( FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
2419                          FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE ,g_module||l_api_name,'118: Recurring Deliverable = '||delRecTab(i).deliverable_id||' Start date is not changed');
2420                     END IF;
2421 
2422                     -- initialize recurring end date
2423               l_recurr_end_date := null;
2424 
2425               --- check if end date is not FIXED, if it is Fixed, no more
2426             --- further operation.
2427             IF delRecTab(i).fixed_end_date is null THEN
2428 
2429                         IF ( FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
2430                              FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE ,g_module||l_api_name,'119: Recurring Deliverable = '||delRecTab(i).deliverable_id||' End date is relative, resolve end date');
2431                         END IF;
2432 
2433                         --- resolve relative end date
2434                         l_recurr_end_date := resolveRelativeDueEvents(
2435                                    p_bus_doc_date_events_tbl => p_bus_doc_date_events_tbl,
2436                                    p_event_code => NULL,
2437                                    p_event_date => NULL,
2438                                    p_event_id => delRecTab(i).relative_end_date_event_id,
2439                                    p_event_UOM => delRecTab(i).relative_end_date_uom,
2440                                    p_event_duration => delRecTab(i).relative_end_date_duration,
2441                                    p_end_event_yn => 'Y');
2442 
2443                         IF ( FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
2444                              FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE ,g_module||l_api_name,'120: Recurring Deliverable = '||delRecTab(i).deliverable_id||' Resolved end date '||l_recurr_end_date);
2445                         END IF;
2446 
2447                ELSE --- get the fixed end date, provided
2448 
2449                         IF ( FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
2450                              FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE ,g_module||l_api_name,'121: Recurring Deliverable = '||delRecTab(i).deliverable_id||' Take Fixed End date  '||delRecTab(i).fixed_end_date);
2451                         END IF;
2452 
2453                         -- set the fixed end date
2454                 l_recurr_end_date := delRecTab(i).fixed_end_date;
2455 
2456                      END IF;
2457 
2458                      --- raise exception if END is NULL
2459 /*                     IF l_recurr_end_date is NULL THEN
2460                                Okc_Api.Set_Message(G_APP_NAME,
2461                                 'OKC_DEL_END_DT_NOT_FOUND');
2462                                RAISE FND_API.G_EXC_ERROR;
2463                      END IF; */
2464 
2465                         IF ( FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
2466                              FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE ,g_module||l_api_name,'121a: new end date = '||l_recurr_end_date||' Old end date  '||delRecTab(i).end_event_date);
2467                         END IF;
2468 
2469              --- check if new date is less then old date
2470                    --- delete instances where actual date is equal to or
2471              --- greater then new date
2472 
2473              IF (l_recurr_end_date is not NULL) AND (TRUNC(l_recurr_end_date) < TRUNC(delRecTab(i).end_event_date)) THEN
2474 
2475                         IF ( FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
2476                              FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE ,g_module||l_api_name,'122: Recurring Deliverable = '||delRecTab(i).deliverable_id||'New End Date is less then old end date');
2477                         END IF;
2478 
2479                 --- hard Delete old instances from current version
2480                         OPEN get_del_ids_cur2(delRecTab(i).deliverable_id, l_recurr_end_date);
2481                         FETCH get_del_ids_cur2 BULK COLLECT INTO delIds;
2482                         CLOSE get_del_ids_cur2;
2483 
2484                         IF ( FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
2485                              FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE ,g_module||l_api_name,'123: Recurring Deliverable = '||delRecTab(i).deliverable_id||'Calling OKC_DELIVERABLE_PROCESS_PVT.delete_del_instances');
2486                         END IF;
2487 
2488                         IF delIds.count > 0 THEN
2489                     --- call delete_del_instances or OKC_DELIVERABLE_PROCESS_PVT
2490                 OKC_DELIVERABLE_PROCESS_PVT.delete_del_instances(
2491                  p_api_version  => l_api_version,
2492                  p_init_msg_list => G_FALSE,
2493                  p_doc_id    => p_bus_doc_id,
2494                  p_doc_type  => p_bus_doc_type,
2495                  p_doc_version => p_bus_doc_version,
2496                  p_Conditional_Delete_Flag => 'Y',
2497                  p_delid_tab => delIds,
2498                    x_msg_data   => x_msg_data,
2499                  x_msg_count  => x_msg_count,
2500                  x_return_status  => x_return_status);
2501 
2502                             IF ( FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
2503                                  FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE ,g_module||l_api_name,'124: Recurring Deliverable = '||delRecTab(i).deliverable_id||'Finished OKC_DELIVERABLE_PROCESS_PVT.delete_del_instances'||x_return_status);
2507                             ELSIF (x_return_status = G_RET_STS_ERROR) THEN
2504                             END IF;
2505                             IF (x_return_status = G_RET_STS_UNEXP_ERROR) THEN
2506                                  RAISE FND_API.G_EXC_UNEXPECTED_ERROR ;
2508                                  RAISE FND_API.G_EXC_ERROR ;
2509                             END IF;
2510 
2511                          END IF;
2512                             --- increment the count
2513                             del_count := del_count+1;
2514 
2515                ----- Done Creating new deliverable instances ---
2516                --- update current deliverable definition with start and end event date
2517                    -- record deliverable id to be updated at the end
2518               deliverableIds(del_count) := delRecTab(i).deliverable_id;
2519 
2520               -- record actual date, start event date and end event date
2521               deliverableDueDates(del_count) := NULL;
2522               deliverableStartEventDates(del_count) := delRecTab(i).start_event_date;
2523               deliverableEndEventDates(del_count) := l_recurr_end_date;
2524 
2525             END IF;
2526 
2527             --- check if new date is greater then old date
2528             --- generate new instances with start date as old end date
2529               --- and end date as new end date, us the same repeat frequency on
2530             --- the given deliverable and resolve it.
2531             IF (l_recurr_end_date is not NULL) AND TRUNC(l_recurr_end_date) > TRUNC(delRecTab(i).end_event_date) THEN
2532 
2533                         IF ( FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
2534                              FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE ,g_module||l_api_name,'125: Recurring Deliverable = '||delRecTab(i).deliverable_id||'New end date is greater then old end dates');
2535                         END IF;
2536 
2537              --- get the repeat frequency and create new instances
2538                    l_repeat_day_of_month := getDayOfMonth(
2539                         delRecTab(i).REPEATING_DAY_OF_MONTH);
2540              l_repeat_day_of_week  := getDayOfWeek(
2541                         delRecTab(i).REPEATING_DAY_OF_WEEK);
2542 
2543                          -- if both frequency values ar null
2544                          IF (l_repeat_day_of_month is NULL AND l_repeat_day_of_week is NULL) THEN
2545                                  Okc_Api.Set_Message(G_APP_NAME,
2546                                       'OKC_DEL_RECUR_FRQ_NOT_FOUND');
2547                                     RAISE FND_API.G_EXC_ERROR;
2548                          END IF;
2549 
2550                         IF ( FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
2551                              FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE ,g_module||l_api_name,'126: Recurring Deliverable = '||delRecTab(i).deliverable_id||'Calling generate_del_instances');
2552                         END IF;
2553                         IF ( FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
2554                              FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE ,g_module||l_api_name,'126a: Recurring Deliverable = '||delRecTab(i).deliverable_id||'Setting Status'||l_new_status);
2555                         END IF;
2556 
2557                         -- generate delta of recurring instances
2558                         generate_del_instances(
2559                                              p_recurr_start_date => delRecTab(i).end_event_date+1,
2560                                              p_recurr_end_date => l_recurr_end_date,
2561                                              p_repeat_duration => delRecTab(i).repeating_duration,
2562                                              p_repeat_day_of_month => l_repeat_day_of_month,
2563                                              p_repeat_day_of_week => l_repeat_day_of_week,
2564                                              delRecord => delRecTab(i),
2565                                              p_change_status_to => l_new_status);
2566 
2567                             IF ( FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
2568                                  FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE ,g_module||l_api_name,'127: Recurring Deliverable = '||delRecTab(i).deliverable_id||'Done generate_del_instances');
2569                             END IF;
2570 
2571                             --- increment the count
2572                             del_count := del_count+1;
2573 
2574                ----- Done Creating new deliverable instances ---
2575                --- update current deliverable definition with start and end event date
2576                    -- record deliverable id to be updated at the end
2577               deliverableIds(del_count) := delRecTab(i).deliverable_id;
2578 
2579               -- record actual date, start event date and end event date
2580               deliverableDueDates(del_count) := NULL;
2581               deliverableStartEventDates(del_count) := delRecTab(i).start_event_date;
2582               deliverableEndEventDates(del_count) := l_recurr_end_date;
2583              END IF; -- if new end date is greater then old end date
2584            END IF; -- if start date is not changed
2585              END IF;
2586        END IF; -- if deliverables is recurring or not
2587 
2588        END LOOP;
2589      END IF;
2590 
2591           IF ( FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
2592                FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE ,g_module||l_api_name,'128: Bulk Update Started');
2593           END IF;
2594 
2595           IF deliverableIds.count > 0 THEN
2596         --- bulk update for deliverables actual due date
2597        FORALL i IN deliverableIds.FIRST..deliverableIds.LAST
2598         UPDATE okc_deliverables
2599         SET
2603         last_updated_by= Fnd_Global.User_Id,
2600         actual_due_date = deliverableDueDates(i),
2601         start_event_date = deliverableStartEventDates(i),
2602         end_event_date = deliverableEndEventDates(i),
2604         last_update_date = sysdate,
2605         last_update_login = Fnd_Global.Login_Id
2606         WHERE deliverable_id = deliverableIds(i);
2607             END IF;
2608 
2609              IF del_cur %ISOPEN THEN
2610                CLOSE del_cur ;
2611              END IF;
2612 
2613    IF FND_API.To_Boolean( p_commit ) THEN
2614       COMMIT WORK;
2615    END IF;
2616 
2617    IF ( FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
2618         FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE ,g_module||l_api_name,'1000: Leaving updateDeliverables');
2619    END IF;
2620 
2621     EXCEPTION
2622 
2623     WHEN FND_API.G_EXC_ERROR THEN
2624      IF ( FND_LOG.LEVEL_ERROR >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
2625         FND_LOG.STRING( FND_LOG.LEVEL_ERROR ,g_module||l_api_name,'800: Leaving updateDeliverables Unexpected ERROR');
2626      END IF;
2627      IF del_cur %ISOPEN THEN
2628         CLOSE del_cur ;
2629      END IF;
2630      IF get_del_ids_cur2 %ISOPEN THEN
2631         CLOSE get_del_ids_cur2;
2632      END IF;
2633      IF get_del_ids_cur1 %ISOPEN THEN
2634         CLOSE get_del_ids_cur1;
2635      END IF;
2636 
2637      ROLLBACK TO g_update_del_GRP;
2638      x_return_status := G_RET_STS_ERROR ;
2639      FND_MSG_PUB.Count_And_Get(p_encoded=>'F', p_count => x_msg_count, p_data => x_msg_data );
2640 
2641      WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
2642      IF ( FND_LOG.LEVEL_UNEXPECTED >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
2643         FND_LOG.STRING( FND_LOG.LEVEL_UNEXPECTED ,g_module||l_api_name,'900: Leaving updateDeliverables Unexpected ERROR');
2644      END IF;
2645      IF del_cur %ISOPEN THEN
2646         CLOSE del_cur ;
2647      END IF;
2648      IF get_del_ids_cur2 %ISOPEN THEN
2649         CLOSE get_del_ids_cur2;
2650      END IF;
2651      IF get_del_ids_cur1 %ISOPEN THEN
2652         CLOSE get_del_ids_cur1;
2653      END IF;
2654 
2655      ROLLBACK TO g_update_del_GRP;
2656      x_return_status := G_RET_STS_UNEXP_ERROR ;
2657      FND_MSG_PUB.Count_And_Get(p_encoded=>'F', p_count => x_msg_count, p_data => x_msg_data );
2658 
2659     WHEN OTHERS THEN
2660     IF ( FND_LOG.LEVEL_UNEXPECTED >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
2661        FND_LOG.STRING( FND_LOG.LEVEL_UNEXPECTED ,g_module||l_api_name,'1000: Leaving updateDeliverables because of EXCEPTION: '||substr(sqlerrm,1,200));
2662     END IF;
2663     IF del_cur %ISOPEN THEN
2664        CLOSE del_cur ;
2665     END IF;
2666      IF get_del_ids_cur2 %ISOPEN THEN
2667         CLOSE get_del_ids_cur2;
2668      END IF;
2669      IF get_del_ids_cur1 %ISOPEN THEN
2670         CLOSE get_del_ids_cur1;
2671      END IF;
2672 
2673     ROLLBACK TO g_update_del_GRP;
2674     x_return_status := G_RET_STS_UNEXP_ERROR ;
2675     IF FND_MSG_PUB.Check_Msg_Level( FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR ) THEN
2676          FND_MSG_PUB.Add_Exc_Msg( G_PKG_NAME, l_api_name );
2677     END IF;
2678     FND_MSG_PUB.Count_And_Get(p_encoded=>'F', p_count => x_msg_count, p_data => x_msg_data );
2679 
2680    END; -- updateDeliverables
2681 
2682    /**
2683     * Enable Notifications flag of deliverables for given business document id
2684     * and type.
2685     */
2686    PROCEDURE enableNotifications (
2687         p_api_version  IN NUMBER,
2688         p_init_msg_list IN VARCHAR2,
2689         p_commit            IN  Varchar2,
2690         p_bus_doc_id IN NUMBER,
2691         p_bus_doc_type IN VARCHAR2,
2692         p_bus_doc_version             IN NUMBER,
2693         x_msg_data  OUT NOCOPY  VARCHAR2,
2694         x_msg_count OUT NOCOPY  NUMBER,
2695         x_return_status OUT NOCOPY  VARCHAR2)
2696         IS
2697         l_api_name CONSTANT VARCHAR2(30) := 'enableNotifications';
2698         l_api_version     CONSTANT VARCHAR2(30) := 1;
2699 
2700         BEGIN
2701 
2702         -- start procedure
2703         IF ( FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
2704             FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE ,g_module||l_api_name,'600: Entered '||G_PKG_NAME ||'.'||l_api_name);
2705         END IF;
2706 
2707         -- Standard Start of API savepoint
2708         SAVEPOINT g_enable_del_ntf_GRP;
2709 
2710         -- Standard call to check for call compatibility.
2711         IF NOT FND_API.Compatible_API_Call( l_api_version, p_api_version, l_api_name, G_PKG_NAME) THEN
2712           RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
2713         END IF;
2714 
2715         -- Initialize message list if p_init_msg_list is set to TRUE.
2716         IF FND_API.to_Boolean( p_init_msg_list ) THEN
2717           FND_MSG_PUB.initialize;
2718         END IF;
2719 
2720         --  Initialize API return status to success
2721         x_return_status := FND_API.G_RET_STS_SUCCESS;
2722 
2723             UPDATE OKC_DELIVERABLES set DISABLE_NOTIFICATIONS_YN = 'N'
2724             WHERE  business_document_id = p_bus_doc_id
2725             AND    business_document_type = p_bus_doc_type
2726             AND    business_document_version = p_bus_doc_version;
2727 
2728    IF FND_API.To_Boolean( p_commit ) THEN
2729       COMMIT WORK;
2730    END IF;
2731 
2732    IF ( FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
2733         FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE ,g_module||l_api_name,'1000: Leaving enableNotifications');
2734    END IF;
2735 
2736     EXCEPTION
2737 
2741      END IF;
2738     WHEN FND_API.G_EXC_ERROR THEN
2739      IF ( FND_LOG.LEVEL_ERROR >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
2740         FND_LOG.STRING( FND_LOG.LEVEL_ERROR ,g_module||l_api_name,'800: Leaving enableNotifications Unexpected ERROR');
2742      ROLLBACK TO g_enable_del_ntf_GRP;
2743      x_return_status := G_RET_STS_ERROR ;
2744      FND_MSG_PUB.Count_And_Get(p_encoded=>'F', p_count => x_msg_count, p_data => x_msg_data );
2745 
2746      WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
2747      IF ( FND_LOG.LEVEL_UNEXPECTED >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
2748         FND_LOG.STRING( FND_LOG.LEVEL_UNEXPECTED ,g_module||l_api_name,'900: Leaving enableNotifications Unexpected ERROR');
2749      END IF;
2750      ROLLBACK TO g_enable_del_ntf_GRP;
2751      x_return_status := G_RET_STS_UNEXP_ERROR ;
2752      FND_MSG_PUB.Count_And_Get(p_encoded=>'F', p_count => x_msg_count, p_data => x_msg_data );
2753 
2754     WHEN OTHERS THEN
2755     IF ( FND_LOG.LEVEL_UNEXPECTED >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
2756        FND_LOG.STRING( FND_LOG.LEVEL_UNEXPECTED ,g_module||l_api_name,'1000: Leaving enableNotifications because of EXCEPTION: '||substr(sqlerrm,1,200));
2757     END IF;
2758     ROLLBACK TO g_enable_del_ntf_GRP;
2759     x_return_status := G_RET_STS_UNEXP_ERROR ;
2760     IF FND_MSG_PUB.Check_Msg_Level( FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR ) THEN
2761          FND_MSG_PUB.Add_Exc_Msg( G_PKG_NAME, l_api_name );
2762     END IF;
2763     FND_MSG_PUB.Count_And_Get(p_encoded=>'F', p_count => x_msg_count, p_data => x_msg_data );
2764 
2765    END; -- enableNotifications
2766 
2767    /**
2768     * Cancel deliverables for given business document id and type, without
2769     * activating deliverables for given cancel event code
2770     */
2771    PROCEDURE  cancelDeliverables (
2772     p_api_version               IN NUMBER,
2773     p_init_msg_list             IN VARCHAR2,
2774     p_commit            IN  Varchar2,
2775     p_bus_doc_id                IN NUMBER,
2776     p_bus_doc_type              IN VARCHAR2,
2777     p_bus_doc_version           IN NUMBER,
2778     x_msg_data                  OUT NOCOPY  VARCHAR2,
2779     x_msg_count                 OUT NOCOPY  NUMBER,
2780     x_return_status             OUT NOCOPY  VARCHAR2)
2781         IS
2782         l_api_name CONSTANT VARCHAR2(30) := 'cancelDeliverables';
2783         l_api_version     CONSTANT VARCHAR2(30) := 1;
2784 
2785         BEGIN
2786 
2787         -- start procedure
2788         IF ( FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
2789             FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE ,g_module||l_api_name,'600: Entered '||G_PKG_NAME ||'.'||l_api_name);
2790         END IF;
2791 
2792         -- Standard Start of API savepoint
2793         SAVEPOINT g_cancel_del_GRP;
2794 
2795         -- Standard call to check for call compatibility.
2796         IF NOT FND_API.Compatible_API_Call( l_api_version, p_api_version, l_api_name, G_PKG_NAME) THEN
2797           RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
2798         END IF;
2799 
2800         -- Initialize message list if p_init_msg_list is set to TRUE.
2801         IF FND_API.to_Boolean( p_init_msg_list ) THEN
2802           FND_MSG_PUB.initialize;
2803         END IF;
2804 
2805         --  Initialize API return status to success
2806         x_return_status := FND_API.G_RET_STS_SUCCESS;
2807 
2808         -- start procedure
2809         IF ( FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
2810             FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE ,g_module||l_api_name,'600: Entered '||'change_deliverable_status');
2811         END IF;
2812 
2813             --- call change_deliverable_status, to change deliverable status
2814             --- to CANCELLED
2815             OKC_DELIVERABLE_PROCESS_PVT.change_deliverable_status(
2816                               p_api_version => l_api_version,
2817                                 p_init_msg_list => G_FALSE,
2818                                 p_doc_id => p_bus_doc_id,
2819                                 p_doc_version => p_bus_doc_version,
2820                                 p_doc_type => p_bus_doc_type,
2821                                 p_cancel_yn => 'Y',
2822                                 p_cancel_event_code => NULL,
2823                                 p_current_status => NULL,
2824                                 p_new_status => 'CANCELLED',
2825                                 p_manage_yn => 'N',
2826                                 x_msg_data => x_msg_data,
2827                                 x_msg_count => x_msg_count,
2828                                 x_return_status => x_return_status);
2829 
2830    IF ( FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
2831        FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE ,g_module||l_api_name,'600: Finished change_deliverable_status' ||x_return_status);
2832    END IF;
2833 
2834    IF (x_return_status = G_RET_STS_UNEXP_ERROR) THEN
2835            RAISE FND_API.G_EXC_UNEXPECTED_ERROR ;
2836    ELSIF (x_return_status = G_RET_STS_ERROR) THEN
2837            RAISE FND_API.G_EXC_ERROR ;
2838    END IF;
2839 
2840 
2841    IF FND_API.To_Boolean( p_commit ) THEN
2842       COMMIT WORK;
2843    END IF;
2844 
2845    -- Standard call to get message count and if count is 1, get message info.
2846    FND_MSG_PUB.Count_And_Get(p_encoded=>'F', p_count => x_msg_count, p_data => x_msg_data );
2847 
2848    IF ( FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
2849         FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE ,g_module||l_api_name,'1000: Leaving cancelDeliverables');
2850    END IF;
2851 
2852     EXCEPTION
2853 
2854     WHEN FND_API.G_EXC_ERROR THEN
2858      ROLLBACK TO g_cancel_del_GRP;
2855      IF ( FND_LOG.LEVEL_ERROR >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
2856         FND_LOG.STRING( FND_LOG.LEVEL_ERROR ,g_module||l_api_name,'800: Leaving cancelDeliverables Unexpected ERROR');
2857      END IF;
2859      x_return_status := G_RET_STS_ERROR ;
2860      FND_MSG_PUB.Count_And_Get(p_encoded=>'F', p_count => x_msg_count, p_data => x_msg_data );
2861 
2862      WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
2863      IF ( FND_LOG.LEVEL_UNEXPECTED >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
2864         FND_LOG.STRING( FND_LOG.LEVEL_UNEXPECTED ,g_module||l_api_name,'900: Leaving cancelDeliverables Unexpected ERROR');
2865      END IF;
2866      ROLLBACK TO g_cancel_del_GRP;
2867      x_return_status := G_RET_STS_UNEXP_ERROR ;
2868      FND_MSG_PUB.Count_And_Get(p_encoded=>'F', p_count => x_msg_count, p_data => x_msg_data );
2869 
2870     WHEN OTHERS THEN
2871     IF ( FND_LOG.LEVEL_UNEXPECTED >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
2872        FND_LOG.STRING( FND_LOG.LEVEL_UNEXPECTED ,g_module||l_api_name,'1000: Leaving cancelDeliverables because of EXCEPTION: '||substr(sqlerrm,1,200));
2873     END IF;
2874     ROLLBACK TO g_cancel_del_GRP;
2875     x_return_status := G_RET_STS_UNEXP_ERROR ;
2876     IF FND_MSG_PUB.Check_Msg_Level( FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR ) THEN
2877          FND_MSG_PUB.Add_Exc_Msg( G_PKG_NAME, l_api_name );
2878     END IF;
2879     FND_MSG_PUB.Count_And_Get(p_encoded=>'F', p_count => x_msg_count, p_data => x_msg_data );
2880 
2881    END;
2882 
2883    /**
2884     * Cancel deliverables for given business document id and type and
2885     * activate deliverables for given cancel event code
2886     */
2887    PROCEDURE  cancelDeliverables (
2888     p_api_version               IN NUMBER,
2889     p_init_msg_list             IN VARCHAR2,
2890     p_commit            IN  Varchar2,
2891     p_bus_doc_id                IN NUMBER,
2892     p_bus_doc_type              IN VARCHAR2,
2893     p_bus_doc_version           IN NUMBER,
2894     p_event_code                IN VARCHAR2,
2895     p_event_date                IN DATE,
2896     p_bus_doc_date_events_tbl IN BUSDOCDATES_TBL_TYPE,
2897     x_msg_data                  OUT NOCOPY  VARCHAR2,
2898     x_msg_count                 OUT NOCOPY  NUMBER,
2899     x_return_status             OUT NOCOPY  VARCHAR2)
2900     IS
2901         l_api_name CONSTANT VARCHAR2(30) := 'cancelDeliverables';
2902         l_api_version     CONSTANT VARCHAR2(30) := 1;
2903 
2904     BEGIN
2905 
2906         -- start procedure
2907         IF ( FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
2908             FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE ,g_module||l_api_name,'600: Entered '||G_PKG_NAME ||'.'||l_api_name);
2909         END IF;
2910 
2911         -- Standard Start of API savepoint
2912         SAVEPOINT g_cancel2_del_GRP;
2913 
2914         -- Standard call to check for call compatibility.
2915         IF NOT FND_API.Compatible_API_Call( l_api_version, p_api_version, l_api_name, G_PKG_NAME) THEN
2916           RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
2917         END IF;
2918 
2919         -- Initialize message list if p_init_msg_list is set to TRUE.
2920         IF FND_API.to_Boolean( p_init_msg_list ) THEN
2921           FND_MSG_PUB.initialize;
2922         END IF;
2923 
2924         --  Initialize API return status to success
2925         x_return_status := FND_API.G_RET_STS_SUCCESS;
2926 
2927         -- start procedure
2928         IF ( FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
2929             FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE ,g_module||l_api_name,'600: Entered '||'change_deliverable_status');
2930         END IF;
2931 
2932         --- call change_deliverable_status, to change deliverable status
2933         --- to CANCELLED
2934         OKC_DELIVERABLE_PROCESS_PVT.change_deliverable_status(
2935                               p_api_version => l_api_version,
2936                                 p_init_msg_list => G_FALSE,
2937                                 p_doc_id => p_bus_doc_id,
2938                                 p_doc_version => p_bus_doc_version,
2939                                 p_doc_type => p_bus_doc_type,
2940                                 p_cancel_yn => 'Y',
2941                                 p_cancel_event_code => p_event_code,
2942                                 p_current_status => null,
2943                                 p_new_status => 'CANCELLED',
2944                                 p_manage_yn => 'N',
2945                                 x_msg_data => x_msg_data,
2946                                 x_msg_count => x_msg_count,
2947                                 x_return_status => x_return_status);
2948 
2949        IF ( FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
2950            FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE ,g_module||l_api_name,'600: Finished change_deliverable_status' ||x_return_status);
2951        END IF;
2952 
2953        IF (x_return_status = G_RET_STS_UNEXP_ERROR) THEN
2954                RAISE FND_API.G_EXC_UNEXPECTED_ERROR ;
2955        ELSIF (x_return_status = G_RET_STS_ERROR) THEN
2956                RAISE FND_API.G_EXC_ERROR ;
2957        END IF;
2958 
2959         --  Initialize API return status to success
2960         x_return_status := FND_API.G_RET_STS_SUCCESS;
2961 
2962         IF ( FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
2963             FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE ,g_module||l_api_name,'600: Entered '||'resolveDeliverables');
2964         END IF;
2965 
2966         --- resolve deliverables
2967         resolveDeliverables(
2968                         p_api_version => l_api_version,
2972                         p_bus_doc_type => p_bus_doc_type,
2969                         p_init_msg_list => G_FALSE,
2970                         p_commit => G_FALSE,
2971                         p_bus_doc_id => p_bus_doc_id,
2973                         p_bus_doc_version => p_bus_doc_version,
2974                         p_event_code => p_event_code,
2975                         p_event_date => p_event_date,
2976                         p_bus_doc_date_events_tbl => p_bus_doc_date_events_tbl,
2977                         x_msg_data => x_msg_data,
2978                         x_msg_count => x_msg_count,
2979                         x_return_status => x_return_status,
2980                         p_cancel_flag => G_TRUE);
2981 
2982        IF ( FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
2983            FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE ,g_module||l_api_name,'600: Finished resolveDeliverables' ||x_return_status);
2984        END IF;
2985 
2986        IF (x_return_status = G_RET_STS_UNEXP_ERROR) THEN
2987                RAISE FND_API.G_EXC_UNEXPECTED_ERROR ;
2988        ELSIF (x_return_status = G_RET_STS_ERROR) THEN
2989                RAISE FND_API.G_EXC_ERROR ;
2990        END IF;
2991 
2992         --  Initialize API return status to success
2993         x_return_status := FND_API.G_RET_STS_SUCCESS;
2994 
2995         IF ( FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
2996             FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE ,g_module||l_api_name,'600: Entered '||'OKC_DELIVERABLE_PROCESS_PVT.change_deliverable_status');
2997         END IF;
2998 
2999         --- call change_deliverable_status, to change deliverable status from
3000         --- INACTIVE to 'OPEN'
3001         OKC_DELIVERABLE_PROCESS_PVT.change_deliverable_status(
3002                               p_api_version => l_api_version,
3003                                 p_init_msg_list => G_FALSE,
3004                                 p_doc_id => p_bus_doc_id,
3005                                 p_doc_version => p_bus_doc_version,
3006                                 p_doc_type => p_bus_doc_type,
3007                                 p_cancel_yn => 'N',
3008                                 p_cancel_event_code => NULL,
3009                                 p_current_status => 'INACTIVE',
3010                                 p_new_status => 'OPEN',
3011                                 p_manage_yn => 'Y',
3012                                 x_msg_data => x_msg_data,
3013                                 x_msg_count => x_msg_count,
3014                                 x_return_status => x_return_status);
3015 
3016        IF ( FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
3017            FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE ,g_module||l_api_name,'600: Finished OKC_DELIVERABLE_PROCESS_PVT.change_deliverable_status' ||x_return_status);
3018        END IF;
3019 
3020        IF (x_return_status = G_RET_STS_UNEXP_ERROR) THEN
3021                RAISE FND_API.G_EXC_UNEXPECTED_ERROR ;
3022        ELSIF (x_return_status = G_RET_STS_ERROR) THEN
3023                RAISE FND_API.G_EXC_ERROR ;
3024        END IF;
3025 
3026    IF FND_API.To_Boolean( p_commit ) THEN
3027       COMMIT WORK;
3028    END IF;
3029 
3030    -- Standard call to get message count and if count is 1, get message info.
3031    FND_MSG_PUB.Count_And_Get(p_encoded=>'F', p_count => x_msg_count, p_data => x_msg_data );
3032 
3033    IF ( FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
3034         FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE ,g_module||l_api_name,'1000: Leaving cancelDeliverables');
3035    END IF;
3036 
3037     EXCEPTION
3038 
3039     WHEN FND_API.G_EXC_ERROR THEN
3040      IF ( FND_LOG.LEVEL_ERROR >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
3041         FND_LOG.STRING( FND_LOG.LEVEL_ERROR ,g_module||l_api_name,'800: Leaving cancelDeliverables Unexpected ERROR');
3042      END IF;
3043      ROLLBACK TO g_cancel2_del_GRP;
3044      x_return_status := G_RET_STS_ERROR ;
3045      FND_MSG_PUB.Count_And_Get(p_encoded=>'F', p_count => x_msg_count, p_data => x_msg_data );
3046 
3047      WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
3048 
3049      IF ( FND_LOG.LEVEL_UNEXPECTED >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
3050         FND_LOG.STRING( FND_LOG.LEVEL_UNEXPECTED ,g_module||l_api_name,'900: Leaving cancelDeliverables Unexpected ERROR');
3051      END IF;
3052      ROLLBACK TO g_cancel2_del_GRP;
3053      x_return_status := G_RET_STS_UNEXP_ERROR ;
3054      FND_MSG_PUB.Count_And_Get(p_encoded=>'F', p_count => x_msg_count, p_data => x_msg_data );
3055 
3056     WHEN OTHERS THEN
3057     IF ( FND_LOG.LEVEL_UNEXPECTED >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
3058        FND_LOG.STRING( FND_LOG.LEVEL_UNEXPECTED ,g_module||l_api_name,'1000: Leaving cancelDeliverables because of EXCEPTION: '||substr(sqlerrm,1,200));
3059     END IF;
3060     ROLLBACK TO g_cancel2_del_GRP;
3061     x_return_status := G_RET_STS_UNEXP_ERROR ;
3062     IF FND_MSG_PUB.Check_Msg_Level( FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR ) THEN
3063          FND_MSG_PUB.Add_Exc_Msg( G_PKG_NAME, l_api_name );
3064     END IF;
3065     FND_MSG_PUB.Count_And_Get(p_encoded=>'F', p_count => x_msg_count, p_data => x_msg_data );
3066 
3067    END; -- cancelDeliverables
3068 
3069 
3070    /**
3071     * Update buyer on deliverables for given business document id and type.
3072     */
3073   PROCEDURE updateBuyerOnDeliverables (
3074     p_api_version               IN NUMBER,
3075     p_init_msg_list             IN VARCHAR2,
3076     p_commit            IN  Varchar2,
3077     p_bus_doc_id                IN NUMBER,
3078     p_bus_doc_type              IN VARCHAR2,
3079     p_bus_doc_version           IN NUMBER,
3080     p_original_buyer_id         IN NUMBER,
3084     x_return_status             OUT NOCOPY  VARCHAR2)
3081     p_new_buyer_id              IN NUMBER,
3082     x_msg_data                  OUT NOCOPY  VARCHAR2,
3083     x_msg_count                 OUT NOCOPY  NUMBER,
3085     IS
3086         l_api_name CONSTANT VARCHAR2(30) := 'updateBuyerOnDeliverables';
3087         l_api_version     CONSTANT VARCHAR2(30) := 1;
3088 
3089     BEGIN
3090 
3091         -- start procedure
3092         IF ( FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
3093             FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE ,g_module||l_api_name,'600: Entered '||G_PKG_NAME ||'.'||l_api_name);
3094         END IF;
3095 
3096         -- Standard Start of API savepoint
3097         SAVEPOINT g_update_del_GRP;
3098 
3099         -- Standard call to check for call compatibility.
3100         IF NOT FND_API.Compatible_API_Call( l_api_version, p_api_version, l_api_name, G_PKG_NAME) THEN
3101           RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
3102         END IF;
3103 
3104         -- Initialize message list if p_init_msg_list is set to TRUE.
3105         IF FND_API.to_Boolean( p_init_msg_list ) THEN
3106           FND_MSG_PUB.initialize;
3107         END IF;
3108 
3109         --  Initialize API return status to success
3110         x_return_status := FND_API.G_RET_STS_SUCCESS;
3111 
3112             UPDATE OKC_DELIVERABLES
3113             set internal_party_contact_id = p_new_buyer_id,
3114             last_updated_by= Fnd_Global.User_Id,
3115             last_update_date = sysdate,
3116             last_update_login=Fnd_Global.Login_Id
3117             WHERE  business_document_id = p_bus_doc_id
3118             AND    business_document_type = p_bus_doc_type
3119             AND    business_document_version = p_bus_doc_version
3120             AND    internal_party_contact_id = p_original_buyer_id;
3121 
3122    IF FND_API.To_Boolean( p_commit ) THEN
3123       COMMIT WORK;
3124    END IF;
3125 
3126    -- Standard call to get message count and if count is 1, get message info.
3127    FND_MSG_PUB.Count_And_Get(p_encoded=>'F', p_count => x_msg_count, p_data => x_msg_data );
3128 
3129    IF ( FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
3130         FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE ,g_module||l_api_name,'1000: Leaving updateDeliverables');
3131    END IF;
3132 
3133     EXCEPTION
3134 
3135     WHEN FND_API.G_EXC_ERROR THEN
3136      IF ( FND_LOG.LEVEL_ERROR >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
3137         FND_LOG.STRING( FND_LOG.LEVEL_ERROR ,g_module||l_api_name,'800: Leaving updateDeliverables Unexpected ERROR');
3138      END IF;
3139      ROLLBACK TO g_update_del_GRP;
3140      x_return_status := G_RET_STS_ERROR ;
3141      FND_MSG_PUB.Count_And_Get(p_encoded=>'F', p_count => x_msg_count, p_data => x_msg_data );
3142 
3143      WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
3144      IF ( FND_LOG.LEVEL_UNEXPECTED >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
3145         FND_LOG.STRING( FND_LOG.LEVEL_UNEXPECTED ,g_module||l_api_name,'900: Leaving updateDeliverables Unexpected ERROR');
3146      END IF;
3147      ROLLBACK TO g_update_del_GRP;
3148      x_return_status := G_RET_STS_UNEXP_ERROR ;
3149      FND_MSG_PUB.Count_And_Get(p_encoded=>'F', p_count => x_msg_count, p_data => x_msg_data );
3150 
3151     WHEN OTHERS THEN
3152     IF ( FND_LOG.LEVEL_UNEXPECTED >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
3153        FND_LOG.STRING( FND_LOG.LEVEL_UNEXPECTED ,g_module||l_api_name,'1000: Leaving updateDeliverables because of EXCEPTION: '||substr(sqlerrm,1,200));
3154     END IF;
3155     ROLLBACK TO g_update_del_GRP;
3156     x_return_status := G_RET_STS_UNEXP_ERROR ;
3157     IF FND_MSG_PUB.Check_Msg_Level( FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR ) THEN
3158          FND_MSG_PUB.Add_Exc_Msg( G_PKG_NAME, l_api_name );
3159     END IF;
3160     FND_MSG_PUB.Count_And_Get(p_encoded=>'F', p_count => x_msg_count, p_data => x_msg_data );
3161 
3162    END; -- updateDeliverables
3163 
3164    /**
3165     * Update buyer on deliverables for given business document id and type.
3166     */
3167   PROCEDURE updateBuyerOnDeliverables (
3168     p_api_version               IN NUMBER,
3169     p_init_msg_list             IN VARCHAR2,
3170     p_commit            IN  Varchar2,
3171     p_bus_docs_tbl              IN BUSDOCS_TBL_TYPE,
3172     p_original_buyer_id         IN NUMBER,
3173     p_new_buyer_id              IN NUMBER,
3174     x_msg_data                  OUT NOCOPY  VARCHAR2,
3175     x_msg_count                 OUT NOCOPY  NUMBER,
3176     x_return_status             OUT NOCOPY  VARCHAR2)
3177     IS
3178         l_api_name CONSTANT VARCHAR2(30) := 'updateBuyerDeliverables';
3179         l_api_version     CONSTANT VARCHAR2(30) := 1;
3180 
3181     TYPE BusDocIdList IS TABLE OF NUMBER
3182     INDEX BY BINARY_INTEGER;
3183     TYPE BusDocTypeList IS TABLE OF VARCHAR2(30)
3184     INDEX BY BINARY_INTEGER;
3185     TYPE BusDocVersionList IS TABLE OF NUMBER
3186     INDEX BY BINARY_INTEGER;
3187 
3188     l_bus_doc_ids BusDocIdList;
3189     l_bus_doc_types BusDocTypeList;
3190     l_bus_doc_versions BusDocVersionList;
3191 
3192     BEGIN
3193 
3194         -- start procedure
3195         IF ( FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
3196             FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE ,g_module||l_api_name,'600: Entered '||G_PKG_NAME ||'.'||l_api_name);
3197         END IF;
3198 
3199         -- Standard Start of API savepoint
3200         SAVEPOINT g_update2_del_GRP;
3201 
3202         -- Standard call to check for call compatibility.
3206 
3203         IF NOT FND_API.Compatible_API_Call( l_api_version, p_api_version, l_api_name, G_PKG_NAME) THEN
3204           RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
3205         END IF;
3207         -- Initialize message list if p_init_msg_list is set to TRUE.
3208         IF FND_API.to_Boolean( p_init_msg_list ) THEN
3209           FND_MSG_PUB.initialize;
3210         END IF;
3211 
3212         --  Initialize API return status to success
3213         x_return_status := FND_API.G_RET_STS_SUCCESS;
3214 
3215       IF p_bus_docs_tbl.count > 0 THEN
3216         FOR i IN p_bus_docs_tbl.FIRST..p_bus_docs_tbl.LAST LOOP
3217             l_bus_doc_ids(i) := p_bus_docs_tbl(i).bus_doc_id;
3218             l_bus_doc_types(i) := p_bus_docs_tbl(i).bus_doc_type;
3219             l_bus_doc_versions(i) := p_bus_docs_tbl(i).bus_doc_version;
3220         END LOOP;
3221       END IF;
3222         --- bulk update for deliverables actual due date
3223         FORALL j IN p_bus_docs_tbl.FIRST..p_bus_docs_tbl.LAST
3224         UPDATE OKC_DELIVERABLES
3225         set internal_party_contact_id = p_new_buyer_id,
3226             last_updated_by= Fnd_Global.User_Id,
3227             last_update_date = sysdate,
3228             last_update_login=Fnd_Global.Login_Id
3229         WHERE internal_party_contact_id = p_original_buyer_id
3230         AND   business_document_id = l_bus_doc_ids(j)
3231         AND   business_document_type = l_bus_doc_types(j)
3232         AND   business_document_version = l_bus_doc_versions(j);
3233 
3234    IF FND_API.To_Boolean( p_commit ) THEN
3235       COMMIT WORK;
3236    END IF;
3237 
3238    -- Standard call to get message count and if count is 1, get message info.
3239    FND_MSG_PUB.Count_And_Get(p_encoded=>'F', p_count => x_msg_count, p_data => x_msg_data );
3240 
3241    IF ( FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
3242         FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE ,g_module||l_api_name,'1000: Leaving updateBuyerDeliverables');
3243    END IF;
3244 
3245     EXCEPTION
3246 
3247     WHEN FND_API.G_EXC_ERROR THEN
3248      IF ( FND_LOG.LEVEL_ERROR >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
3249         FND_LOG.STRING( FND_LOG.LEVEL_ERROR ,g_module||l_api_name,'800: Leaving updateBuyerDeliverables Unexpected ERROR');
3250      END IF;
3251      ROLLBACK TO g_update2_del_GRP;
3252      x_return_status := G_RET_STS_ERROR ;
3253      FND_MSG_PUB.Count_And_Get(p_encoded=>'F', p_count => x_msg_count, p_data => x_msg_data );
3254 
3255 
3256      WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
3257      IF ( FND_LOG.LEVEL_UNEXPECTED >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
3258         FND_LOG.STRING( FND_LOG.LEVEL_UNEXPECTED ,g_module||l_api_name,'900: Leaving updateBuyerDeliverables Unexpected ERROR');
3259      END IF;
3260      ROLLBACK TO g_update2_del_GRP;
3261      x_return_status := G_RET_STS_UNEXP_ERROR ;
3262      FND_MSG_PUB.Count_And_Get(p_encoded=>'F', p_count => x_msg_count, p_data => x_msg_data );
3263 
3264     WHEN OTHERS THEN
3265     IF ( FND_LOG.LEVEL_UNEXPECTED >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
3266        FND_LOG.STRING( FND_LOG.LEVEL_UNEXPECTED ,g_module||l_api_name,'1000: Leaving updateBuyerDeliverables because of EXCEPTION: '||substr(sqlerrm,1,200));
3267     END IF;
3268     ROLLBACK TO g_update2_del_GRP;
3269     x_return_status := G_RET_STS_UNEXP_ERROR ;
3270     IF FND_MSG_PUB.Check_Msg_Level( FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR ) THEN
3271          FND_MSG_PUB.Add_Exc_Msg( G_PKG_NAME, l_api_name );
3272     END IF;
3273     FND_MSG_PUB.Count_And_Get(p_encoded=>'F', p_count => x_msg_count, p_data => x_msg_data );
3274 
3275    END; -- updateBuyerDeliverables
3276 
3277     /**
3278      * This procedure disables execution of deliverables for a given business document
3279      * version.
3280      */
3281     PROCEDURE disableDeliverables (
3282         p_api_version       IN  NUMBER,
3283         p_init_msg_list     IN VARCHAR2,
3284         p_commit          IN VARCHAR2,
3285         p_bus_doc_id    IN  NUMBER,
3286         p_bus_doc_type      IN VARCHAR2,
3287         p_bus_doc_version   IN  NUMBER,   -- -99 for Sourcing.
3288         x_msg_data      OUT NOCOPY  VARCHAR2,
3289         x_msg_count     OUT NOCOPY  NUMBER,
3290         x_return_status OUT NOCOPY  VARCHAR2)
3291     IS
3292         l_api_name CONSTANT VARCHAR2(30) := 'disableDeliverables';
3293         l_api_version      CONSTANT VARCHAR2(30) := 1;
3294 
3295     BEGIN
3296         -- start procedure
3297         IF ( FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
3298             FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE ,g_module||l_api_name,'100: Entered '||G_PKG_NAME ||'.'||l_api_name);
3299         END IF;
3300 
3301         -- Standard Start of API savepoint
3302         SAVEPOINT g_disable_del_GRP;
3303 
3304         -- Standard call to check for call compatibility.
3305         IF NOT FND_API.Compatible_API_Call( l_api_version, p_api_version, l_api_name, G_PKG_NAME) THEN
3306           RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
3307         END IF;
3308 
3309         -- Initialize message list if p_init_msg_list is set to TRUE.
3310         IF FND_API.to_Boolean( p_init_msg_list ) THEN
3311           FND_MSG_PUB.initialize;
3312         END IF;
3313 
3314         --  Initialize API return status to success
3315         x_return_status := FND_API.G_RET_STS_SUCCESS;
3316 
3317         -- start procedure
3318         IF ( FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
3319             FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE ,g_module||l_api_name,'200: Calling OKC_DELIVERABLE_PROCESS_PVT.disable_deliverables');
3323             --- to CANCELLED
3320         END IF;
3321 
3322             --- call change_deliverable_status, to change deliverable status
3324             OKC_DELIVERABLE_PROCESS_PVT.disable_deliverables(
3325                               p_api_version => l_api_version,
3326                                 p_init_msg_list => G_FALSE,
3327                                 p_doc_id => p_bus_doc_id,
3328                                 p_doc_version => p_bus_doc_version,
3329                                 p_doc_type => p_bus_doc_type,
3330                                 x_msg_data => x_msg_data,
3331                                 x_msg_count => x_msg_count,
3332                                 x_return_status => x_return_status);
3333 
3334        IF ( FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
3335            FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE ,g_module||l_api_name,'300: Finished disable_deliverables' ||x_return_status);
3336        END IF;
3337 
3338        IF (x_return_status = G_RET_STS_UNEXP_ERROR) THEN
3339                RAISE FND_API.G_EXC_UNEXPECTED_ERROR ;
3340        ELSIF (x_return_status = G_RET_STS_ERROR) THEN
3341                RAISE FND_API.G_EXC_ERROR ;
3342        END IF;
3343 
3344 
3345        IF FND_API.To_Boolean( p_commit ) THEN
3346           COMMIT WORK;
3347        END IF;
3348 
3349        -- Standard call to get message count and if count is 1, get message info.
3350        FND_MSG_PUB.Count_And_Get(p_encoded=>'F', p_count => x_msg_count, p_data => x_msg_data );
3351 
3352        IF ( FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
3353             FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE ,g_module||l_api_name,'400: Leaving disableDeliverables');
3354        END IF;
3355 
3356     EXCEPTION
3357 
3358     WHEN FND_API.G_EXC_ERROR THEN
3359      IF ( FND_LOG.LEVEL_ERROR >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
3360         FND_LOG.STRING( FND_LOG.LEVEL_ERROR ,g_module||l_api_name,'800: Leaving disableDeliverables Unexpected ERROR');
3361      END IF;
3362      ROLLBACK TO g_disable_del_GRP;
3363      x_return_status := G_RET_STS_ERROR ;
3364      FND_MSG_PUB.Count_And_Get(p_encoded=>'F', p_count => x_msg_count, p_data => x_msg_data );
3365 
3366      WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
3367      IF ( FND_LOG.LEVEL_UNEXPECTED >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
3368         FND_LOG.STRING( FND_LOG.LEVEL_UNEXPECTED ,g_module||l_api_name,'900: Leaving disableDeliverables Unexpected ERROR');
3369      END IF;
3370      ROLLBACK TO g_disable_del_GRP;
3371      x_return_status := G_RET_STS_UNEXP_ERROR ;
3372      FND_MSG_PUB.Count_And_Get(p_encoded=>'F', p_count => x_msg_count, p_data => x_msg_data );
3373 
3374     WHEN OTHERS THEN
3375     IF ( FND_LOG.LEVEL_UNEXPECTED >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
3376        FND_LOG.STRING( FND_LOG.LEVEL_UNEXPECTED ,g_module||l_api_name,'1000: Leaving disableDeliverables because of EXCEPTION: '||substr(sqlerrm,1,200));
3377     END IF;
3378     ROLLBACK TO g_disable_del_GRP;
3379     x_return_status := G_RET_STS_UNEXP_ERROR ;
3380     IF FND_MSG_PUB.Check_Msg_Level( FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR ) THEN
3381          FND_MSG_PUB.Add_Exc_Msg( G_PKG_NAME, l_api_name );
3382     END IF;
3383     FND_MSG_PUB.Count_And_Get(p_encoded=>'F', p_count => x_msg_count, p_data => x_msg_data );
3384 
3385     END; --disableDeliverables
3386 
3387 
3388 
3389 
3390    /**
3391     * Update internal contact on deliverables for given business document id and type.
3392     */
3393   PROCEDURE updateIntContactOnDeliverables (
3394     p_api_version               IN NUMBER,
3395     p_init_msg_list             IN VARCHAR2,
3396     p_commit            IN  Varchar2,
3397     p_bus_doc_id                IN NUMBER,
3398     p_bus_doc_type              IN VARCHAR2,
3399     p_bus_doc_version           IN NUMBER,
3400     p_original_internal_contact_id         IN NUMBER,
3401     p_new_internal_contact_id              IN NUMBER,
3402     x_msg_data                  OUT NOCOPY  VARCHAR2,
3403     x_msg_count                 OUT NOCOPY  NUMBER,
3404     x_return_status             OUT NOCOPY  VARCHAR2)
3405     IS
3406         l_api_name CONSTANT VARCHAR2(30) := 'updateIntContactOnDeliverables';
3407         l_api_version     CONSTANT VARCHAR2(30) := 1;
3408 
3409     BEGIN
3410 
3411         -- start procedure
3412         IF ( FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
3413             FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE ,g_module||l_api_name,'600: Entered '||G_PKG_NAME ||'.'||l_api_name);
3414         END IF;
3415 
3416         -- Standard Start of API savepoint
3417         SAVEPOINT g_update_del_GRP;
3418 
3419         -- Standard call to check for call compatibility.
3420         IF NOT FND_API.Compatible_API_Call( l_api_version, p_api_version, l_api_name, G_PKG_NAME) THEN
3421           RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
3422         END IF;
3423 
3424         -- Initialize message list if p_init_msg_list is set to TRUE.
3425         IF FND_API.to_Boolean( p_init_msg_list ) THEN
3426           FND_MSG_PUB.initialize;
3427         END IF;
3428 
3429         --  Initialize API return status to success
3430         x_return_status := FND_API.G_RET_STS_SUCCESS;
3431 
3432            --bug#4154567 update -99 version aswell
3433             UPDATE OKC_DELIVERABLES
3434             set internal_party_contact_id = p_new_internal_contact_id,
3435             last_updated_by= Fnd_Global.User_Id,
3436             last_update_date = sysdate,
3437             last_update_login=Fnd_Global.Login_Id
3441             AND    internal_party_contact_id = p_original_internal_contact_id;
3438             WHERE  business_document_id = p_bus_doc_id
3439             AND    business_document_type = p_bus_doc_type
3440             AND    business_document_version IN (-99, p_bus_doc_version)
3442 
3443    IF FND_API.To_Boolean( p_commit ) THEN
3444       COMMIT WORK;
3445    END IF;
3446 
3447    -- Standard call to get message count and if count is 1, get message info.
3448    FND_MSG_PUB.Count_And_Get(p_encoded=>'F', p_count => x_msg_count, p_data => x_msg_data );
3449 
3450    IF ( FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
3451         FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE ,g_module||l_api_name,'1000: Leaving updateIntContactOnDeliverables');
3452    END IF;
3453 
3454     EXCEPTION
3455 
3456     WHEN FND_API.G_EXC_ERROR THEN
3457      IF ( FND_LOG.LEVEL_ERROR >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
3458         FND_LOG.STRING( FND_LOG.LEVEL_ERROR ,g_module||l_api_name,'800: Leaving updateIntContactOnDeliverables Unexpected ERROR');
3459      END IF;
3460      ROLLBACK TO g_update_del_GRP;
3461      x_return_status := G_RET_STS_ERROR ;
3462      FND_MSG_PUB.Count_And_Get(p_encoded=>'F', p_count => x_msg_count, p_data => x_msg_data );
3463 
3464      WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
3465      IF ( FND_LOG.LEVEL_UNEXPECTED >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
3466         FND_LOG.STRING( FND_LOG.LEVEL_UNEXPECTED ,g_module||l_api_name,'900: Leaving updateIntContactOnDeliverables Unexpected ERROR');
3467      END IF;
3468      ROLLBACK TO g_update_del_GRP;
3469      x_return_status := G_RET_STS_UNEXP_ERROR ;
3470      FND_MSG_PUB.Count_And_Get(p_encoded=>'F', p_count => x_msg_count, p_data => x_msg_data );
3471 
3472     WHEN OTHERS THEN
3473     IF ( FND_LOG.LEVEL_UNEXPECTED >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
3474        FND_LOG.STRING( FND_LOG.LEVEL_UNEXPECTED ,g_module||l_api_name,'1000: Leaving updateIntContactOnDeliverables because of EXCEPTION: '||substr(sqlerrm,1,200));
3475     END IF;
3476     ROLLBACK TO g_update_del_GRP;
3477     x_return_status := G_RET_STS_UNEXP_ERROR ;
3478     IF FND_MSG_PUB.Check_Msg_Level( FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR ) THEN
3479          FND_MSG_PUB.Add_Exc_Msg( G_PKG_NAME, l_api_name );
3480     END IF;
3481     FND_MSG_PUB.Count_And_Get(p_encoded=>'F', p_count => x_msg_count, p_data => x_msg_data );
3482 
3483    END; -- updateIntContactOnDeliverables
3484 
3485 
3486    /**
3487     * Update internal contact on deliverables for given set of business document id and type.
3488     */
3489   PROCEDURE updateIntContactOnDeliverables (
3490     p_api_version               IN NUMBER,
3491     p_init_msg_list             IN VARCHAR2,
3492     p_commit            IN  Varchar2,
3493     p_bus_docs_tbl              IN BUSDOCS_TBL_TYPE,
3494     p_original_internal_contact_id         IN NUMBER,
3495     p_new_internal_contact_id              IN NUMBER,
3496     x_msg_data                  OUT NOCOPY  VARCHAR2,
3497     x_msg_count                 OUT NOCOPY  NUMBER,
3498     x_return_status             OUT NOCOPY  VARCHAR2)
3499     IS
3500         l_api_name CONSTANT VARCHAR2(30) := 'updateIntContactOnDeliverables';
3501         l_api_version     CONSTANT VARCHAR2(30) := 1;
3502 
3503     TYPE BusDocIdList IS TABLE OF NUMBER
3504     INDEX BY BINARY_INTEGER;
3505     TYPE BusDocTypeList IS TABLE OF VARCHAR2(30)
3506     INDEX BY BINARY_INTEGER;
3507     TYPE BusDocVersionList IS TABLE OF NUMBER
3508     INDEX BY BINARY_INTEGER;
3509 
3510     l_bus_doc_ids BusDocIdList;
3511     l_bus_doc_types BusDocTypeList;
3512     l_bus_doc_versions BusDocVersionList;
3513 
3514     BEGIN
3515 
3516         -- start procedure
3517         IF ( FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
3518             FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE ,g_module||l_api_name,'600: Entered '||G_PKG_NAME ||'.'||l_api_name);
3519         END IF;
3520 
3521         -- Standard Start of API savepoint
3522         SAVEPOINT g_update2_del_GRP;
3523 
3524         -- Standard call to check for call compatibility.
3525         IF NOT FND_API.Compatible_API_Call( l_api_version, p_api_version, l_api_name, G_PKG_NAME) THEN
3526           RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
3527         END IF;
3528 
3529         -- Initialize message list if p_init_msg_list is set to TRUE.
3530         IF FND_API.to_Boolean( p_init_msg_list ) THEN
3531           FND_MSG_PUB.initialize;
3532         END IF;
3533 
3534         --  Initialize API return status to success
3535         x_return_status := FND_API.G_RET_STS_SUCCESS;
3536 
3537       IF p_bus_docs_tbl.count > 0 THEN
3538         FOR i IN p_bus_docs_tbl.FIRST..p_bus_docs_tbl.LAST LOOP
3539             l_bus_doc_ids(i) := p_bus_docs_tbl(i).bus_doc_id;
3540             l_bus_doc_types(i) := p_bus_docs_tbl(i).bus_doc_type;
3541             l_bus_doc_versions(i) := p_bus_docs_tbl(i).bus_doc_version;
3542         END LOOP;
3543       END IF;
3544         --- bulk update for deliverables actual due date
3545         FORALL j IN p_bus_docs_tbl.FIRST..p_bus_docs_tbl.LAST
3546         --bug#4154567 update -99 version aswell
3547         UPDATE OKC_DELIVERABLES
3548         set internal_party_contact_id = p_new_internal_contact_id,
3549             last_updated_by= Fnd_Global.User_Id,
3550             last_update_date = sysdate,
3551             last_update_login=Fnd_Global.Login_Id
3552         WHERE internal_party_contact_id = p_original_internal_contact_id
3553         AND   business_document_id = l_bus_doc_ids(j)
3557    IF FND_API.To_Boolean( p_commit ) THEN
3554         AND   business_document_type = l_bus_doc_types(j)
3555         AND   business_document_version IN (l_bus_doc_versions(j),-99);
3556 
3558       COMMIT WORK;
3559    END IF;
3560 
3561    -- Standard call to get message count and if count is 1, get message info.
3562    FND_MSG_PUB.Count_And_Get(p_encoded=>'F', p_count => x_msg_count, p_data => x_msg_data );
3563 
3564    IF ( FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
3565         FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE ,g_module||l_api_name,'1000: Leaving updateIntContactOnDeliverables');
3566    END IF;
3567 
3568     EXCEPTION
3569 
3570     WHEN FND_API.G_EXC_ERROR THEN
3571      IF ( FND_LOG.LEVEL_ERROR >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
3572         FND_LOG.STRING( FND_LOG.LEVEL_ERROR ,g_module||l_api_name,'800: Leaving updateIntContactOnDeliverables Unexpected ERROR');
3573      END IF;
3574      ROLLBACK TO g_update2_del_GRP;
3575      x_return_status := G_RET_STS_ERROR ;
3576      FND_MSG_PUB.Count_And_Get(p_encoded=>'F', p_count => x_msg_count, p_data => x_msg_data );
3577 
3578 
3579      WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
3580      IF ( FND_LOG.LEVEL_UNEXPECTED >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
3581         FND_LOG.STRING( FND_LOG.LEVEL_UNEXPECTED ,g_module||l_api_name,'900: Leaving updateIntContactOnDeliverables Unexpected ERROR');
3582      END IF;
3583      ROLLBACK TO g_update2_del_GRP;
3584      x_return_status := G_RET_STS_UNEXP_ERROR ;
3585      FND_MSG_PUB.Count_And_Get(p_encoded=>'F', p_count => x_msg_count, p_data => x_msg_data );
3586 
3587     WHEN OTHERS THEN
3588     IF ( FND_LOG.LEVEL_UNEXPECTED >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
3589        FND_LOG.STRING( FND_LOG.LEVEL_UNEXPECTED ,g_module||l_api_name,'1000: Leaving updateIntContactOnDeliverables  because of EXCEPTION: '||substr(sqlerrm,1,200));
3590     END IF;
3591     ROLLBACK TO g_update2_del_GRP;
3592     x_return_status := G_RET_STS_UNEXP_ERROR ;
3593     IF FND_MSG_PUB.Check_Msg_Level( FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR ) THEN
3594          FND_MSG_PUB.Add_Exc_Msg( G_PKG_NAME, l_api_name );
3595     END IF;
3596     FND_MSG_PUB.Count_And_Get(p_encoded=>'F', p_count => x_msg_count, p_data => x_msg_data );
3597 
3598    END; -- updateIntContactOnDeliverables
3599 
3600    /**
3601    * This procedure updates external party id and site id
3602    * on deliverables for given draft version of business document.
3603    */
3604    PROCEDURE updateExtPartyOnDeliverables (
3605    p_api_version               IN NUMBER,
3606    p_init_msg_list             IN VARCHAR2,
3607    p_commit                    IN VARCHAR2,
3608    p_bus_doc_id                IN NUMBER,
3609    p_bus_doc_type              IN VARCHAR2,
3610    p_external_party_id         IN NUMBER,
3611    p_external_party_site_id    IN NUMBER,
3612    x_msg_data                  OUT NOCOPY  VARCHAR2,
3613    x_msg_count                 OUT NOCOPY  NUMBER,
3614    x_return_status             OUT NOCOPY  VARCHAR2)
3615    IS
3616 
3617         l_api_name CONSTANT VARCHAR2(30) := 'updateExtPartyOnDeliverables';
3618         l_api_version     CONSTANT VARCHAR2(30) := 1;
3619 
3620     BEGIN
3621 
3622         -- start procedure
3623         IF ( FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
3624             FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE ,g_module||l_api_name,'600: Entered '||G_PKG_NAME ||'.'||l_api_name);
3625         END IF;
3626 
3627         -- Standard Start of API savepoint
3628         SAVEPOINT g_update_del_GRP;
3629 
3630         -- Standard call to check for call compatibility.
3631         IF NOT FND_API.Compatible_API_Call( l_api_version, p_api_version, l_api_name, G_PKG_NAME) THEN
3632           RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
3633         END IF;
3634 
3635         -- Initialize message list if p_init_msg_list is set to TRUE.
3636         IF FND_API.to_Boolean( p_init_msg_list ) THEN
3637           FND_MSG_PUB.initialize;
3638         END IF;
3639 
3640         --  Initialize API return status to success
3641         x_return_status := FND_API.G_RET_STS_SUCCESS;
3642 
3643             UPDATE OKC_DELIVERABLES
3644             SET external_party_id = p_external_party_id,
3645             external_party_site_id = p_external_party_site_id,
3646             last_updated_by= Fnd_Global.User_Id,
3647             last_update_date = sysdate,
3648             last_update_login=Fnd_Global.Login_Id
3649             WHERE  business_document_id = p_bus_doc_id
3650             AND    business_document_type = p_bus_doc_type
3651             AND    business_document_version = -99;
3652 
3653 
3654    IF FND_API.To_Boolean( p_commit ) THEN
3655       COMMIT WORK;
3656    END IF;
3657 
3658    -- Standard call to get message count and if count is 1, get message info.
3659    FND_MSG_PUB.Count_And_Get(p_encoded=>'F', p_count => x_msg_count, p_data => x_msg_data );
3660 
3661    IF ( FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
3662         FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE ,g_module||l_api_name,'1000: Leaving updateExtPartyOnDeliverables ');
3663    END IF;
3664 
3665     EXCEPTION
3666 
3667     WHEN FND_API.G_EXC_ERROR THEN
3668      IF ( FND_LOG.LEVEL_ERROR >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
3669         FND_LOG.STRING( FND_LOG.LEVEL_ERROR ,g_module||l_api_name,'800: Leaving updateExtPartyOnDeliverables Unexpected ERROR');
3670      END IF;
3671      ROLLBACK TO g_update_del_GRP;
3672      x_return_status := G_RET_STS_ERROR ;
3676      IF ( FND_LOG.LEVEL_UNEXPECTED >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
3673      FND_MSG_PUB.Count_And_Get(p_encoded=>'F', p_count => x_msg_count, p_data => x_msg_data );
3674 
3675      WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
3677         FND_LOG.STRING( FND_LOG.LEVEL_UNEXPECTED ,g_module||l_api_name,'900: Leaving updateExtPartyOnDeliverables Unexpected ERROR');
3678      END IF;
3679      ROLLBACK TO g_update_del_GRP;
3680      x_return_status := G_RET_STS_UNEXP_ERROR ;
3681      FND_MSG_PUB.Count_And_Get(p_encoded=>'F', p_count => x_msg_count, p_data => x_msg_data );
3682 
3683     WHEN OTHERS THEN
3684     IF ( FND_LOG.LEVEL_UNEXPECTED >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
3685        FND_LOG.STRING( FND_LOG.LEVEL_UNEXPECTED ,g_module||l_api_name,'1000: Leaving updateExtPartyOnDeliverables because of EXCEPTION: '||substr(sqlerrm,1,200));
3686     END IF;
3687     ROLLBACK TO g_update_del_GRP;
3688     x_return_status := G_RET_STS_UNEXP_ERROR ;
3689     IF FND_MSG_PUB.Check_Msg_Level( FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR ) THEN
3690          FND_MSG_PUB.Add_Exc_Msg( G_PKG_NAME, l_api_name );
3691     END IF;
3692     FND_MSG_PUB.Count_And_Get(p_encoded=>'F', p_count => x_msg_count, p_data => x_msg_data );
3693 
3694    END; -- updateExtPartyOnDeliverables
3695 
3696    /**
3697    * This procedure updates external party id and site id
3698    * on deliverables for given version of business document.
3699    * Used for Supplier Merge
3700    * 15-JUN-2004 pnayani - bug#3691985 Supplier merge for Sourcing not working
3701    */
3702    PROCEDURE updateExtPartyOnDeliverables (
3703    p_api_version               IN NUMBER,
3704    p_init_msg_list             IN VARCHAR2,
3705    p_commit                    IN VARCHAR2,
3706    p_document_class            IN VARCHAR2,
3707    p_from_external_party_id         IN NUMBER,
3708    p_from_external_party_site_id    IN NUMBER,
3709    p_to_external_party_id           IN NUMBER,
3710    p_to_external_party_site_id      IN NUMBER,
3711    x_msg_data                  OUT NOCOPY  VARCHAR2,
3712    x_msg_count                 OUT NOCOPY  NUMBER,
3713    x_return_status             OUT NOCOPY  VARCHAR2)
3714    IS
3715 
3716    l_api_name CONSTANT VARCHAR2(30) := 'updateExtPartyOnDeliverables';
3717    l_api_version     CONSTANT VARCHAR2(30) := 1;
3718 
3719    CURSOR del_cur IS
3720    SELECT deliverable_id,external_party_site_id
3721    FROM okc_deliverables
3722    where external_party_id = p_from_external_party_id
3723    and business_document_type IN (select document_type
3724    from okc_bus_doc_types_b
3725    where document_type_class = p_document_class);
3726    del_rec  del_cur%ROWTYPE;
3727 
3728    TYPE delIdTabType IS TABLE OF NUMBER
3729    INDEX BY BINARY_INTEGER;
3730    j  PLS_INTEGER;
3731 
3732    delIdTab    delIdTabType;
3733    delExtSiteIdTab    delIdTabType;
3734 
3735 
3736     BEGIN
3737 
3738         -- start procedure
3739         IF ( FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
3740             FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE ,g_module||l_api_name,'600: Entered '||G_PKG_NAME ||'.'||l_api_name);
3741             FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE ,g_module||l_api_name,'600: p_from_external_party_id and p_from_external_party_site_id : '||p_from_external_party_site_id ||' and '||p_from_external_party_site_id);
3742             FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE ,g_module||l_api_name,'600: p_to_external_party_id and p_to_external_party_site_id : '||p_to_external_party_site_id ||' and '||p_to_external_party_site_id);
3743         END IF;
3744 
3745         -- Standard Start of API savepoint
3746         SAVEPOINT g_update_del_GRP;
3747 
3748         -- Standard call to check for call compatibility.
3749         IF NOT FND_API.Compatible_API_Call( l_api_version, p_api_version, l_api_name, G_PKG_NAME) THEN
3750           RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
3751         END IF;
3752 
3753         -- Initialize message list if p_init_msg_list is set to TRUE.
3754         IF FND_API.to_Boolean( p_init_msg_list ) THEN
3755           FND_MSG_PUB.initialize;
3756         END IF;
3757 
3758         --  Initialize API return status to success
3759         x_return_status := FND_API.G_RET_STS_SUCCESS;
3760 
3761       -- initialize the table with 0 rows
3762       j := 0;
3763       delIdTab.delete;
3764       delExtSiteIdTab.delete;
3765             FOR del_rec IN del_cur LOOP
3766     IF p_from_external_party_site_id is not null THEN
3767       j := j+1;
3768       delIdTab(j) := del_rec.deliverable_id;
3769       delExtSiteIdTab(j) := p_to_external_party_site_id;
3770     ELSE
3771       j := j+1;
3772       delIdTab(j) := del_rec.deliverable_id;
3773       IF del_rec.external_party_site_id = -1 THEN
3774               delExtSiteIdTab(j) := -1;
3775       ELSE
3776         delExtSiteIdTab(j) := p_to_external_party_site_id;
3777             END IF;
3778           END IF;
3779       END LOOP;
3780 
3781       IF delIdTab.COUNT <> 0 THEN
3782               -- bulk update deliverables external party
3783               FORALL i IN delIdTab.FIRST..delIdTab.LAST
3784               UPDATE okc_deliverables
3785               SET external_party_id = p_to_external_party_id,
3786               external_party_site_id = delExtSiteIdTab(i),
3787               last_updated_by= Fnd_Global.User_Id,
3788               last_update_date = sysdate,
3789               last_update_login=Fnd_Global.Login_Id
3790               WHERE deliverable_id = delIdTab(i);
3791       END IF;
3792              IF del_cur %ISOPEN THEN
3793                CLOSE del_cur ;
3794              END IF;
3795 
3796 
3800 
3797    IF FND_API.To_Boolean( p_commit ) THEN
3798       COMMIT WORK;
3799    END IF;
3801 
3802    IF ( FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
3803         FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE ,g_module||l_api_name,'1000: Leaving updateExtPartyOnDeliverables ');
3804    END IF;
3805 
3806     EXCEPTION
3807 
3808     WHEN FND_API.G_EXC_ERROR THEN
3809      IF ( FND_LOG.LEVEL_ERROR >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
3810         FND_LOG.STRING( FND_LOG.LEVEL_ERROR ,g_module||l_api_name,'800: Leaving updateExtPartyOnDeliverables Unexpected ERROR');
3811      END IF;
3812     -- close any open cursors
3813     IF del_cur %ISOPEN THEN
3814      CLOSE del_cur ;
3815     END IF;
3816      ROLLBACK TO g_update_del_GRP;
3817      x_return_status := G_RET_STS_ERROR ;
3818      FND_MSG_PUB.Count_And_Get(p_encoded=>'F', p_count => x_msg_count, p_data => x_msg_data );
3819 
3820      WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
3821      IF ( FND_LOG.LEVEL_UNEXPECTED >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
3822         FND_LOG.STRING( FND_LOG.LEVEL_UNEXPECTED ,g_module||l_api_name,'900: Leaving updateExtPartyOnDeliverables Unexpected ERROR');
3823      END IF;
3824      ROLLBACK TO g_update_del_GRP;
3825      x_return_status := G_RET_STS_UNEXP_ERROR ;
3826      FND_MSG_PUB.Count_And_Get(p_encoded=>'F', p_count => x_msg_count, p_data => x_msg_data );
3827 
3828     WHEN OTHERS THEN
3829     IF ( FND_LOG.LEVEL_UNEXPECTED >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
3830        FND_LOG.STRING( FND_LOG.LEVEL_UNEXPECTED ,g_module||l_api_name,'1000: Leaving updateExtPartyOnDeliverables because of EXCEPTION: '||substr(sqlerrm,1,200));
3831     END IF;
3832     -- close any open cursors
3833     IF del_cur %ISOPEN THEN
3834      CLOSE del_cur ;
3835     END IF;
3836 
3837     ROLLBACK TO g_update_del_GRP;
3838     x_return_status := G_RET_STS_UNEXP_ERROR ;
3839     IF FND_MSG_PUB.Check_Msg_Level( FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR ) THEN
3840          FND_MSG_PUB.Add_Exc_Msg( G_PKG_NAME, l_api_name );
3841     END IF;
3842     FND_MSG_PUB.Count_And_Get(p_encoded=>'F', p_count => x_msg_count, p_data => x_msg_data );
3843 
3844    END;
3845 
3846    /**
3847     * Create status history rows and send notifications for
3848     * deliverables on this business document whose status has changed since
3849     * last entry in status history.
3850     * Can be called by code that wants to post status changes that have not been reflected in the middle tier (e.g. Bid Submission)
3851   */
3852    PROCEDURE postDelStatusChanges (
3853         p_api_version  IN NUMBER,
3854         p_init_msg_list IN VARCHAR2,
3855         p_commit            IN  Varchar2,
3856         p_bus_doc_id IN NUMBER,
3857         p_bus_doc_type IN VARCHAR2,
3858         p_bus_doc_version             IN NUMBER,
3859         x_msg_data  OUT NOCOPY  VARCHAR2,
3860         x_msg_count OUT NOCOPY  NUMBER,
3861         x_return_status OUT NOCOPY  VARCHAR2)
3862         IS
3863         l_api_name CONSTANT VARCHAR2(30) := 'postDelStatusChanges';
3864         l_api_version     CONSTANT VARCHAR2(30) := 1;
3865 
3866 
3867   k PLS_INTEGER := 0;
3868   l_msg_code VARCHAR2(30);
3869   l_key number;
3870 
3871   --Cursor to select rows where status differs from most recent record in status history
3872   cursor del_cursor IS
3873   select
3874     deliverable.deliverable_status,
3875     deliverable.status_change_notes,
3876     deliverable.deliverable_id,
3877     deliverable.notify_completed_yn
3878   from okc_deliverables deliverable
3879   where
3880         deliverable.deliverable_status <> 'INACTIVE' and
3881         business_document_id = p_bus_doc_id and
3882         business_document_type = p_bus_doc_type and
3883             business_document_version = p_bus_doc_version and
3884         deliverable.deliverable_status <>
3885             (select status_history_inner.deliverable_status
3886              from okc_del_status_history status_history_inner
3887              where status_history_inner.deliverable_id = deliverable.deliverable_id
3888                  and status_history_inner.deliverable_status <> 'INACTIVE'
3889              and status_history_inner.status_change_date = (select max(status_change_date)
3890                                    from okc_del_status_history
3891                                    where deliverable_id = deliverable.deliverable_id and
3892                                    deliverable_status <> 'INACTIVE'));
3893 
3894 
3895   del_rec del_cursor%ROWTYPE;
3896   delStsTab OKC_DELIVERABLE_PROCESS_PVT.delHistTabType;
3897 
3898   cursor status_notes_cur IS
3899     select
3900       deliverable.deliverable_status,
3901       deliverable.status_change_notes,
3902       deliverable.deliverable_id,
3903       status_history.status_change_date
3904     from
3905       okc_deliverables deliverable,
3906       okc_del_status_history status_history
3907     where
3908       deliverable.deliverable_status <> 'INACTIVE' and
3909           business_document_id = p_bus_doc_id and
3910           business_document_type = p_bus_doc_type and
3911                 business_document_version = p_bus_doc_version and
3912       status_history.deliverable_status = deliverable.deliverable_status and
3913       status_history.deliverable_id = deliverable.deliverable_id and
3914       (deliverable.status_change_notes <> status_history.status_change_notes OR status_history.status_change_notes IS NULL) and
3915       status_history.status_change_date = (select max(status_history_inner.status_change_date)
3916                    from okc_del_status_history status_history_inner
3920         BEGIN
3917                    where status_history_inner.deliverable_id = deliverable.deliverable_id and status_history_inner.deliverable_status <> 'INACTIVE');
3918   status_notes_rec status_notes_cur%ROWTYPE;
3919 
3921 
3922         -- start procedure
3923         IF ( FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
3924             FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE ,g_module||l_api_name,'600: Entered '||G_PKG_NAME ||'.'||l_api_name);
3925         END IF;
3926 
3927         -- Standard Start of API savepoint
3928         SAVEPOINT g_createHistory_GRP;
3929 
3930         -- Standard call to check for call compatibility.
3931         IF NOT FND_API.Compatible_API_Call( l_api_version, p_api_version, l_api_name, G_PKG_NAME) THEN
3932           RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
3933         END IF;
3934 
3935         -- Initialize message list if p_init_msg_list is set to TRUE.
3936         IF FND_API.to_Boolean( p_init_msg_list ) THEN
3937           FND_MSG_PUB.initialize;
3938         END IF;
3939 
3940   --loop thru deliverables where only the notes have changed
3941   FOR status_notes_rec IN status_notes_cur LOOP
3942     update okc_del_status_history
3943     set status_change_notes = status_notes_rec.status_change_notes
3944     where status_change_date = status_notes_rec.status_change_date and
3945     deliverable_id = status_notes_rec.deliverable_id and
3946     deliverable_status = status_notes_rec.deliverable_status;
3947 
3948   END LOOP;
3949 
3950 
3951   --loop through all modified deliverables
3952   FOR del_rec IN del_cursor LOOP
3953     k:=k+1;
3954 
3955     --add to status history table
3956     delStsTab(k).deliverable_id := del_rec.deliverable_id;
3957     delStsTab(k).deliverable_status := del_rec.deliverable_status;
3958     delStsTab(k).status_changed_by := fnd_global.user_id;
3959     delStsTab(k).status_change_date := sysdate;
3960     delStsTab(k).status_change_notes := del_rec.status_change_notes;
3961     delStsTab(k).object_version_number := 1;
3962     delStsTab(k).created_by := fnd_global.user_id;
3963     delStsTab(k).creation_date := sysdate;
3964     delStsTab(k).last_update_date := sysdate;
3965     delStsTab(k).last_updated_by := fnd_global.user_id;
3966     delStsTab(k).last_update_login := fnd_global.login_Id;
3967 
3968     --if necessary, send notification
3969     if ('Y' = del_rec.notify_completed_yn) then
3970       select OKC_WF_NOTIFY_S1.nextval into l_key from dual;
3971 
3972       if ('COMPLETED' = del_rec.deliverable_status) then
3973           l_msg_code := 'OKC_DEL_COMPLETE_NTF_SUBJECT';
3974       elsif ('CANCELLED' = del_rec.deliverable_status) then
3975               l_msg_code := 'OKC_DEL_CANCEL_NTF_SUBJECT';
3976       elsif ('OPEN' = del_rec.deliverable_status) then
3977               l_msg_code := 'OKC_DEL_REOPEN_NTF_SUBJECT';
3978       elsif ('FAILED_TO_PERFORM' = del_rec.deliverable_status) then
3979               l_msg_code := 'OKC_DEL_FAILED_NTF_SUBJECT';
3980       elsif ('REJECTED' = del_rec.deliverable_status ) then
3981               l_msg_code := 'OKC_DEL_REJECT_NTF_SUBJECT';
3982       else
3983               l_msg_code := 'OKC_DEL_SUBMIT_NTF_SUBJECT';
3984       end if;
3985 
3986       begin
3987         --raise bus event to send notification
3988         WF_EVENT.raise2(p_event_name => 'oracle.apps.okc.deliverables.sendNotification',
3989                     p_event_key => to_char(l_key),
3990                     p_parameter_name1 => 'DELIVERABLE_ID',
3991                     p_parameter_value1 => del_rec.deliverable_id,
3992                     p_parameter_name2 => 'MSG_CODE',
3993                     p_parameter_value2 => l_msg_Code);          exception
3994       when others then
3995         IF ( FND_LOG.LEVEL_UNEXPECTED >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
3996               FND_LOG.STRING( FND_LOG.LEVEL_UNEXPECTED ,g_module||l_api_name,'1000: Leaving postDelStatusChanges because of EXCEPTION in WF_event.raise2:'||sqlerrm);
3997 
3998         END IF;
3999         raise;
4000       end;
4001 
4002     end if;
4003 
4004   END LOOP;
4005 
4006   begin
4007   --bulk create status history records
4008     if k > 0 then
4009     OKC_DELIVERABLE_PROCESS_PVT.create_del_status_history(p_api_version => 1.0,
4010     p_init_msg_list => FND_API.G_FALSE,
4011     p_del_st_hist_tab => delStsTab,
4012     x_msg_data => x_msg_data,
4013     x_msg_count => x_msg_count,
4014     x_return_status => x_return_status );
4015     end if;
4016 
4017   exception
4018   when others then
4019   IF ( FND_LOG.LEVEL_UNEXPECTED >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
4020           FND_LOG.STRING( FND_LOG.LEVEL_UNEXPECTED ,g_module||l_api_name,'1000: Leaving postDelStatusChanges because of EXCEPTION in OKC_DELIVERABLE_PROCESS_PVT.create_del_status_history:'||x_msg_data);
4021 
4022   END IF;
4023   raise;
4024   end;
4025 
4026    IF FND_API.To_Boolean( p_commit ) THEN
4027       COMMIT WORK;
4028    END IF;
4029 
4030 
4031    IF ( FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
4032         FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE ,g_module||l_api_name,'1000: Leaving create history');
4033    END IF;
4034 
4035     EXCEPTION
4036 
4037     WHEN FND_API.G_EXC_ERROR THEN
4038      IF ( FND_LOG.LEVEL_ERROR >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
4039         FND_LOG.STRING( FND_LOG.LEVEL_ERROR ,g_module||l_api_name,'800: Leaving postDelStatusChanges Unexpected ERROR');
4040      END IF;
4041      ROLLBACK TO g_createHistory_GRP;
4042      x_return_status := G_RET_STS_ERROR ;
4046      IF ( FND_LOG.LEVEL_UNEXPECTED >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
4043      FND_MSG_PUB.Count_And_Get(p_encoded=>'F', p_count => x_msg_count, p_data => x_msg_data );
4044 
4045      WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
4047         FND_LOG.STRING( FND_LOG.LEVEL_UNEXPECTED ,g_module||l_api_name,'900: Leaving postDelStatusChanges Unexpected ERROR');
4048      END IF;
4049      ROLLBACK TO g_createHistory_GRP;
4050      x_return_status := G_RET_STS_UNEXP_ERROR ;
4051      FND_MSG_PUB.Count_And_Get(p_encoded=>'F', p_count => x_msg_count, p_data => x_msg_data );
4052 
4053     WHEN OTHERS THEN
4054     IF ( FND_LOG.LEVEL_UNEXPECTED >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
4055        FND_LOG.STRING( FND_LOG.LEVEL_UNEXPECTED ,g_module||l_api_name,'1000: Leaving postDelStatusChanges because of EXCEPTION: '||substr(sqlerrm,1,200));
4056     END IF;
4057     ROLLBACK TO g_createHistory_GRP;
4058     x_return_status := G_RET_STS_UNEXP_ERROR ;
4059     IF FND_MSG_PUB.Check_Msg_Level( FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR ) THEN
4060          FND_MSG_PUB.Add_Exc_Msg( G_PKG_NAME, l_api_name );
4061     END IF;
4062     FND_MSG_PUB.Count_And_Get(p_encoded=>'F', p_count => x_msg_count, p_data => x_msg_data );
4063 
4064    END; -- postDelStatusChanges
4065 
4066     /** 11.5.10+ code
4067     Function to check if any deliverables exist for a given external
4068     party for a given contract. Invoked by Repository ContractDetailsAMImpl.java    API.
4069     Parameter Details:
4070     p_busdoc_id :           Business document Id
4071     p_busdoc_type :         Business document type
4072     p_external_party_id              ID of internal or external party
4073     p_external_party_role            Role of internal or external party
4074                             (valid values INTERNAL,SUPPLIER, CUSTOMER, PARTNER)
4075     Returns N or Y, if there is unexpected error then it returns NULL.
4076     **/
4077 
4078 FUNCTION deliverablesForExtPartyExist(
4079 p_api_version      IN  NUMBER,
4080 p_init_msg_list    IN  VARCHAR2 :=  FND_API.G_FALSE,
4081 x_return_status    OUT NOCOPY VARCHAR2,
4082 x_msg_data         OUT NOCOPY VARCHAR2,
4083 x_msg_count        OUT NOCOPY NUMBER,
4084 
4085 p_busdoc_id          IN  NUMBER,
4086 p_busdoc_type        IN  VARCHAR2,
4087 p_external_party_id           IN  NUMBER,
4088 p_external_party_role         IN  VARCHAR2)
4089 RETURN VARCHAR2
4090 IS
4091  --bug#4170483 removed check for responsible party. and added -99 version check
4092 CURSOR del_cur IS
4093 SELECT 'X'
4094 FROM   okc_deliverables
4095 WHERE  business_document_type = p_busdoc_type
4096 AND    business_document_id = p_busdoc_id
4097 AND    business_document_version =-99
4098 AND    UPPER(external_party_role) = UPPER(p_external_party_role)
4099 AND    external_party_id = p_external_party_id;
4100 
4101 del_rec del_cur%ROWTYPE;
4102 l_return_value  VARCHAR2(1);
4103 l_api_name VARCHAR2(30) := 'deliverablesForExtPartyExist';
4104 
4105 
4106 
4107 BEGIN
4108 
4109   --  Initialize API return status to success
4110   x_return_status := OKC_API.G_RET_STS_SUCCESS;
4111 
4112 
4113   l_return_value :=  'N';
4114 
4115   IF ( FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
4116      FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE ,g_module||l_api_name,'1000:Inside '||G_PKG_NAME ||'.'||l_api_name);
4117   END IF;
4118 
4119  -- check if deliverables exist for the given party on a contract.
4120  OPEN del_cur;
4121  FETCH del_cur INTO del_rec;
4122     IF del_cur%FOUND THEN
4123 
4124             l_return_value := 'Y';
4125 
4126     END IF;
4127  CLOSE del_cur;
4128     IF ( FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
4129          FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE ,g_module||l_api_name,'1000: Leaving '||G_PKG_NAME ||'.'||l_api_name);
4130     END IF;
4131 
4132     RETURN(l_return_value);
4133 
4134 EXCEPTION
4135   WHEN OTHERS THEN
4136     IF ( FND_LOG.LEVEL_UNEXPECTED >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
4137          FND_LOG.STRING( FND_LOG.LEVEL_UNEXPECTED ,g_module||l_api_name,'1000: Leaving '||G_PKG_NAME ||'.'||l_api_name||' with unexpected error');
4138     END IF;
4139     IF del_cur %ISOPEN THEN
4140       CLOSE del_cur ;
4141     END IF;
4142 
4143     x_return_status := G_RET_STS_UNEXP_ERROR ;
4144     IF FND_MSG_PUB.Check_Msg_Level( FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR ) THEN
4145       FND_MSG_PUB.Add_Exc_Msg( G_PKG_NAME, l_api_name );
4146     END IF;
4147       FND_MSG_PUB.Count_And_Get(p_encoded=>'F'
4148       , p_count => x_msg_count
4149       , p_data => x_msg_data );
4150 
4151       RETURN null;
4152 
4153 END deliverablesForExtPartyExist;
4154 
4155 
4156 /** 11.5.10+ code
4157 Function to check if any maneagable deliverables exist for a given contract.    Invoked by Repository ContractDetailsAMImpl.java.
4158 Parameter Details:
4159 p_busdoc_id :           Business document Id
4160 p_busdoc_type :         Business document type
4161 p_busdoc_version :      Business document version
4162 Returns N or Y, if there is unexpected error then it returns NULL.
4163 **/
4164 FUNCTION check_manageable_deliverables(
4165 p_api_version      IN  NUMBER,
4166 p_init_msg_list    IN  VARCHAR2 :=  FND_API.G_FALSE,
4167 x_return_status    OUT NOCOPY VARCHAR2,
4168 x_msg_data         OUT NOCOPY VARCHAR2,
4169 x_msg_count        OUT NOCOPY NUMBER,
4170 
4171 p_busdoc_id          IN  NUMBER,
4172 p_busdoc_type        IN  VARCHAR2,
4173 p_busdoc_version          IN  NUMBER)
4174 RETURN VARCHAR2
4178 FROM   okc_deliverables
4175 IS
4176 CURSOR del_cur IS
4177 SELECT 'X'
4179 WHERE  business_document_type = p_busdoc_type
4180 AND    business_document_id = p_busdoc_id
4181 AND    business_document_version = p_busdoc_version
4182 AND    manage_yn = 'Y';
4183 del_rec del_cur%ROWTYPE;
4184 l_return_value  VARCHAR2(1);
4185 l_api_name VARCHAR2(30) := 'check_manageable_deliverables';
4186 
4187 
4188 
4189 BEGIN
4190 
4191   --  Initialize API return status to success
4192   x_return_status := OKC_API.G_RET_STS_SUCCESS;
4193 
4194 
4195   l_return_value :=  'N';
4196 
4197   IF ( FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
4198      FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE ,g_module||l_api_name,'1000:Inside '||G_PKG_NAME ||'.'||l_api_name);
4199   END IF;
4200 
4201  -- check if maneagable deliverables exist for the given contract.
4202  OPEN del_cur;
4203  FETCH del_cur INTO del_rec;
4204     IF del_cur%FOUND THEN
4205 
4206             l_return_value := 'Y';
4207     END IF;
4208  CLOSE del_cur;
4209     RETURN(l_return_value);
4210     IF ( FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
4211          FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE ,g_module||l_api_name,'1000: Leaving '||G_PKG_NAME ||'.'||l_api_name);
4212     END IF;
4213 
4214 EXCEPTION
4215   WHEN OTHERS THEN
4216     IF ( FND_LOG.LEVEL_UNEXPECTED >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
4217          FND_LOG.STRING( FND_LOG.LEVEL_UNEXPECTED ,g_module||l_api_name,'1000: Leaving '||G_PKG_NAME ||'.'||l_api_name||' with unexpected error');
4218     END IF;
4219     IF del_cur %ISOPEN THEN
4220       CLOSE del_cur ;
4221     END IF;
4222 
4223     x_return_status := G_RET_STS_UNEXP_ERROR ;
4224     IF FND_MSG_PUB.Check_Msg_Level( FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR ) THEN
4225       FND_MSG_PUB.Add_Exc_Msg( G_PKG_NAME, l_api_name );
4226     END IF;
4227       FND_MSG_PUB.Count_And_Get(p_encoded=>'F'
4228       , p_count => x_msg_count
4229       , p_data => x_msg_data );
4230 
4231       RETURN null;
4232 
4233 END check_manageable_deliverables;
4234 
4235 
4236     /**
4237      * 11.5.10+ This procedure updates external party id and site id
4238      * on deliverables for given class of business document.
4239      * This API is for HZ party Merge process, it handles site merge
4240      * within a customer
4241      */
4242     PROCEDURE mergeExtPartyOnDeliverables (
4243     p_api_version               IN NUMBER,
4244     p_init_msg_list             IN VARCHAR2 DEFAULT FND_API.G_FALSE,
4245     p_commit                    IN VARCHAR2 DEFAULT FND_API.G_FALSE,
4246     p_document_class            IN VARCHAR2,
4247     p_from_external_party_id         IN NUMBER,
4248     p_from_external_party_site_id    IN NUMBER,
4249     p_to_external_party_id         IN NUMBER,
4250     p_to_external_party_site_id    IN NUMBER,
4251     x_msg_data                  OUT NOCOPY  VARCHAR2,
4252     x_msg_count                 OUT NOCOPY  NUMBER,
4253     x_return_status             OUT NOCOPY  VARCHAR2)
4254 
4255    IS
4256 
4257    l_api_name CONSTANT VARCHAR2(30) := 'mergeExtPartyOnDeliverables';
4258    l_api_version     CONSTANT VARCHAR2(30) := 1;
4259 
4260    CURSOR del_cur IS
4261    SELECT deliverable_id,external_party_site_id
4262    FROM okc_deliverables
4263    where external_party_id = NVL(p_from_external_party_id,external_party_id)
4264    and   external_party_role <> 'SUPPLIER_ORG'
4265    and business_document_type IN (select document_type
4266    from okc_bus_doc_types_b
4267    where document_type_class = p_document_class);
4268    del_rec  del_cur%ROWTYPE;
4269 
4270    TYPE delIdTabType IS TABLE OF NUMBER
4271    INDEX BY BINARY_INTEGER;
4272    j  PLS_INTEGER;
4273 
4274    delIdTab    delIdTabType;
4275 
4276 
4277     BEGIN
4278 
4279         -- start procedure
4280         IF ( FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
4281             FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE ,g_module||l_api_name,'600: Entered '||G_PKG_NAME ||'.'||l_api_name);
4282             FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE ,g_module||l_api_name,'600: p_from_external_party_id and p_from_external_party_site_id : '||p_from_external_party_site_id ||' and '||p_from_external_party_site_id);
4283             FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE ,g_module||l_api_name,'600: p_to_external_party_id and p_to_external_party_site_id : '||p_to_external_party_site_id ||' and '||p_to_external_party_site_id);
4284         END IF;
4285 
4286         -- Standard Start of API savepoint
4287         SAVEPOINT g_update_del_GRP;
4288 
4289         -- Standard call to check for call compatibility.
4290         IF NOT FND_API.Compatible_API_Call( l_api_version, p_api_version, l_api_name, G_PKG_NAME) THEN
4291           RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
4292         END IF;
4293 
4294         -- Initialize message list if p_init_msg_list is set to TRUE.
4295         IF FND_API.to_Boolean( p_init_msg_list ) THEN
4296           FND_MSG_PUB.initialize;
4297         END IF;
4298 
4299         --  Initialize API return status to success
4300         x_return_status := FND_API.G_RET_STS_SUCCESS;
4301 
4302       -- initialize the table with 0 rows
4303       j := 0;
4304       delIdTab.delete;
4305         FOR del_rec IN del_cur LOOP
4306               j := j+1;
4307               delIdTab(j) := del_rec.deliverable_id;
4308       END LOOP;
4309 
4313               UPDATE okc_deliverables
4310       IF delIdTab.COUNT <> 0 THEN
4311               -- bulk update deliverables external party
4312               FORALL i IN delIdTab.FIRST..delIdTab.LAST
4314               SET external_party_id = NVL(p_to_external_party_id,external_party_id),
4315               external_party_site_id = p_to_external_party_site_id,
4316               last_updated_by= Fnd_Global.User_Id,
4317               last_update_date = sysdate,
4318               last_update_login=Fnd_Global.Login_Id
4319               WHERE deliverable_id = delIdTab(i);
4320       END IF;
4321              IF del_cur %ISOPEN THEN
4322                CLOSE del_cur ;
4323              END IF;
4324 
4325 
4326    IF FND_API.To_Boolean( p_commit ) THEN
4327       COMMIT WORK;
4328    END IF;
4329 
4330 
4331    IF ( FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
4332         FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE ,g_module||l_api_name,'1000: Leaving mergeExtPartyOnDeliverables ');
4333    END IF;
4334 
4335     EXCEPTION
4336 
4337     WHEN FND_API.G_EXC_ERROR THEN
4338      IF ( FND_LOG.LEVEL_ERROR >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
4339         FND_LOG.STRING( FND_LOG.LEVEL_ERROR ,g_module||l_api_name,'800: Leaving mergeExtPartyOnDeliverables Unexpected ERROR');
4340      END IF;
4341     -- close any open cursors
4342     IF del_cur %ISOPEN THEN
4343      CLOSE del_cur ;
4344     END IF;
4345      ROLLBACK TO g_update_del_GRP;
4346      x_return_status := G_RET_STS_ERROR ;
4347      FND_MSG_PUB.Count_And_Get(p_encoded=>'F', p_count => x_msg_count, p_data => x_msg_data );
4348 
4349      WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
4350      IF ( FND_LOG.LEVEL_UNEXPECTED >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
4351         FND_LOG.STRING( FND_LOG.LEVEL_UNEXPECTED ,g_module||l_api_name,'900: Leaving mergeExtPartyOnDeliverables Unexpected ERROR');
4352      END IF;
4353      ROLLBACK TO g_update_del_GRP;
4354      x_return_status := G_RET_STS_UNEXP_ERROR ;
4355      FND_MSG_PUB.Count_And_Get(p_encoded=>'F', p_count => x_msg_count, p_data => x_msg_data );
4356 
4357     WHEN OTHERS THEN
4358     IF ( FND_LOG.LEVEL_UNEXPECTED >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
4359        FND_LOG.STRING( FND_LOG.LEVEL_UNEXPECTED ,g_module||l_api_name,'1000: Leaving mergeExtPartyOnDeliverables because of EXCEPTION: '||substr(sqlerrm,1,200));
4360     END IF;
4361     -- close any open cursors
4362     IF del_cur %ISOPEN THEN
4363      CLOSE del_cur ;
4364     END IF;
4365 
4366     ROLLBACK TO g_update_del_GRP;
4367     x_return_status := G_RET_STS_UNEXP_ERROR ;
4368     IF FND_MSG_PUB.Check_Msg_Level( FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR ) THEN
4369          FND_MSG_PUB.Add_Exc_Msg( G_PKG_NAME, l_api_name );
4370     END IF;
4371     FND_MSG_PUB.Count_And_Get(p_encoded=>'F', p_count => x_msg_count, p_data => x_msg_data );
4372 
4373     END; -- mergeExtPartyOnDeliverables
4374 
4375    /**
4376     * Activate closeout deliverables for given business document id and type
4377     */
4378    PROCEDURE  activateCloseoutDeliverables (
4379     p_api_version               IN NUMBER,
4380     p_init_msg_list             IN VARCHAR2,
4381     p_commit            IN  Varchar2,
4382     p_bus_doc_id                IN NUMBER,
4383     p_bus_doc_type              IN VARCHAR2,
4384     p_bus_doc_version           IN NUMBER,
4385     p_event_code                IN VARCHAR2,
4386     p_event_date                IN DATE,
4387     p_bus_doc_date_events_tbl IN BUSDOCDATES_TBL_TYPE,
4388     x_msg_data                  OUT NOCOPY  VARCHAR2,
4389     x_msg_count                 OUT NOCOPY  NUMBER,
4390     x_return_status             OUT NOCOPY  VARCHAR2)
4391     IS
4392         l_api_name CONSTANT VARCHAR2(30) := 'activateCloseoutDeliverables';
4393         l_api_version     CONSTANT VARCHAR2(30) := 1;
4394 
4395     BEGIN
4396 
4397         -- start procedure
4398         IF ( FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
4399             FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE ,g_module||l_api_name,'100: Entered '||G_PKG_NAME ||'.'||l_api_name);
4400         END IF;
4401 
4402         -- Standard Start of API savepoint
4403         SAVEPOINT g_activatecloseout_del_GRP;
4404 
4405         -- Standard call to check for call compatibility.
4406         IF NOT FND_API.Compatible_API_Call( l_api_version, p_api_version, l_api_name, G_PKG_NAME) THEN
4407           RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
4408         END IF;
4409 
4410         -- Initialize message list if p_init_msg_list is set to TRUE.
4411         IF FND_API.to_Boolean( p_init_msg_list ) THEN
4412           FND_MSG_PUB.initialize;
4413         END IF;
4414 
4415         --  Initialize API return status to success
4416         x_return_status := FND_API.G_RET_STS_SUCCESS;
4417 
4418         IF ( FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
4419             FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE ,g_module||l_api_name,'200: Calling '||'resolveDeliverables');
4420         END IF;
4421 
4422         --- resolve deliverables
4423         resolveDeliverables(
4424                         p_api_version => l_api_version,
4425                         p_init_msg_list => G_FALSE,
4426                         p_commit => G_FALSE,
4427                         p_bus_doc_id => p_bus_doc_id,
4428                         p_bus_doc_type => p_bus_doc_type,
4429                         p_bus_doc_version => p_bus_doc_version,
4430                         p_event_code => p_event_code,
4431                         p_event_date => p_event_date,
4432                         p_bus_doc_date_events_tbl => p_bus_doc_date_events_tbl,
4433                         x_msg_data => x_msg_data,
4434                         x_msg_count => x_msg_count,
4435                         x_return_status => x_return_status,
4436                         p_cancel_flag => G_TRUE);
4437 
4438        IF ( FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
4439            FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE ,g_module||l_api_name,'300: Finished resolveDeliverables' ||x_return_status);
4440        END IF;
4441 
4442        IF (x_return_status = G_RET_STS_UNEXP_ERROR) THEN
4443                RAISE FND_API.G_EXC_UNEXPECTED_ERROR ;
4444        ELSIF (x_return_status = G_RET_STS_ERROR) THEN
4445                RAISE FND_API.G_EXC_ERROR ;
4446        END IF;
4447 
4448         --  Initialize API return status to success
4449         x_return_status := FND_API.G_RET_STS_SUCCESS;
4450 
4451         IF ( FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
4452             FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE ,g_module||l_api_name,'400: Entered '||'OKC_DELIVERABLE_PROCESS_PVT.change_deliverable_status');
4453         END IF;
4454 
4455         --- call change_deliverable_status, to change deliverable status from
4456         --- INACTIVE to 'OPEN'
4457         OKC_DELIVERABLE_PROCESS_PVT.change_deliverable_status(
4458                               p_api_version => l_api_version,
4459                                 p_init_msg_list => G_FALSE,
4463                                 p_cancel_yn => 'N',
4460                                 p_doc_id => p_bus_doc_id,
4461                                 p_doc_version => p_bus_doc_version,
4462                                 p_doc_type => p_bus_doc_type,
4464                                 p_cancel_event_code => NULL,
4465                                 p_current_status => 'INACTIVE',
4466                                 p_new_status => 'OPEN',
4467                                 p_manage_yn => 'Y',
4468                                 x_msg_data => x_msg_data,
4469                                 x_msg_count => x_msg_count,
4470                                 x_return_status => x_return_status);
4471 
4472        IF ( FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
4473            FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE ,g_module||l_api_name,'500: Finished OKC_DELIVERABLE_PROCESS_PVT.change_deliverable_status' ||x_return_status);
4474        END IF;
4475 
4476        IF (x_return_status = G_RET_STS_UNEXP_ERROR) THEN
4477                RAISE FND_API.G_EXC_UNEXPECTED_ERROR ;
4478        ELSIF (x_return_status = G_RET_STS_ERROR) THEN
4479                RAISE FND_API.G_EXC_ERROR ;
4480        END IF;
4481 
4482    IF FND_API.To_Boolean( p_commit ) THEN
4483       COMMIT WORK;
4484    END IF;
4485 
4486    -- Standard call to get message count and if count is 1, get message info.
4487    FND_MSG_PUB.Count_And_Get(p_encoded=>'F', p_count => x_msg_count, p_data => x_msg_data );
4488 
4489    IF ( FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
4490         FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE ,g_module||l_api_name,'1000: Leaving activateCloseoutDeliverables');
4491    END IF;
4492 
4493     EXCEPTION
4494 
4495     WHEN FND_API.G_EXC_ERROR THEN
4496      IF ( FND_LOG.LEVEL_ERROR >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
4497         FND_LOG.STRING( FND_LOG.LEVEL_ERROR ,g_module||l_api_name,'800: Leaving activateCloseoutDeliverables Unexpected ERROR');
4498      END IF;
4499      ROLLBACK TO g_activatecloseout_del_GRP;
4500      x_return_status := G_RET_STS_ERROR ;
4501      FND_MSG_PUB.Count_And_Get(p_encoded=>'F', p_count => x_msg_count, p_data => x_msg_data );
4502 
4503      WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
4504 
4505      IF ( FND_LOG.LEVEL_UNEXPECTED >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
4506         FND_LOG.STRING( FND_LOG.LEVEL_UNEXPECTED ,g_module||l_api_name,'900: Leaving activateCloseoutDeliverables Unexpected ERROR');
4507      END IF;
4508      ROLLBACK TO g_activatecloseout_del_GRP;
4509      x_return_status := G_RET_STS_UNEXP_ERROR ;
4510      FND_MSG_PUB.Count_And_Get(p_encoded=>'F', p_count => x_msg_count, p_data => x_msg_data );
4511 
4512     WHEN OTHERS THEN
4513     IF ( FND_LOG.LEVEL_UNEXPECTED >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
4514        FND_LOG.STRING( FND_LOG.LEVEL_UNEXPECTED ,g_module||l_api_name,'1000: Leaving activateCloseoutDeliverables because of EXCEPTION: '||substr(sqlerrm,1,200));
4515     END IF;
4516     ROLLBACK TO g_activatecloseout_del_GRP;
4517     x_return_status := G_RET_STS_UNEXP_ERROR ;
4518     IF FND_MSG_PUB.Check_Msg_Level( FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR ) THEN
4519          FND_MSG_PUB.Add_Exc_Msg( G_PKG_NAME, l_api_name );
4520     END IF;
4521     FND_MSG_PUB.Count_And_Get(p_encoded=>'F', p_count => x_msg_count, p_data => x_msg_data );
4522 
4523    END; -- activateCloseoutDeliverables
4524 
4525 /*-- Start of comments
4526 --API name      : applyPaymentHolds
4527 --Type          : Private.
4528 --Function      : 1.  This API returns TRUE if the Invoices for the concerned PO need to be held.False otherwise
4529 --              : (The check will only be made for a Standard PO, and only for 'CONTRACTUAL' deliverables)
4530 --              : 2.  It runs through the pay_when_paid deliverables associated with the concerned PO.
4531 --              :     It returns true based on which checkbox is checked and by comparing the sysdate with the actual due date.
4532 --Usage         : This public API will be used only by the PO team to determine if invoices need to be held for the PO because of any deliverable
4533 --Pre-reqs      : None.
4534 --Parameters    :
4535 --IN            : p_api_version         IN NUMBER       Required
4536 --              : p_init_msg_list       IN VARCHAR2     Optional
4537 --                   Default = FND_API.G_FALSE
4538 --              : p_bus_doc_id          IN NUMBER       Required
4539 --                   Header ID of the Standard Purchase Order
4540 --              : p_bus_doc_version     IN NUMBER       Required
4541 --                   Version number of the Standard Purchase Order
4542 --OUT           : x_return_status       OUT  VARCHAR2
4543 --              : x_msg_count           OUT  NUMBER
4544 --              : x_msg_data            OUT  VARCHAR2(2000)
4545 --Note          :
4546 -- End of comments */
4547 PROCEDURE applyPaymentHolds(
4548         p_api_version           IN NUMBER,
4549         p_bus_doc_id            IN NUMBER,
4550         p_bus_doc_version       IN NUMBER,
4551         x_msg_data              OUT NOCOPY VARCHAR2,
4552         x_msg_count             OUT NOCOPY NUMBER,
4553         x_return_status         OUT NOCOPY VARCHAR2)
4554 IS
4555 
4556 CURSOR getDeliverables IS
4557 SELECT
4558 DELIVERABLE_ID,
4559 PAY_HOLD_PRIOR_DUE_DATE_YN,
4560 PAY_HOLD_PRIOR_DUE_DATE_VALUE,
4561 PAY_HOLD_PRIOR_DUE_DATE_UOM,
4562 PAY_HOLD_OVERDUE_YN,
4563 ACTUAL_DUE_DATE
4564 FROM okc_deliverables
4565 WHERE business_document_id = p_bus_doc_id
4566 AND business_document_version = p_bus_doc_version
4567 AND business_document_type = 'PO_STANDARD'
4568 AND deliverable_type = 'CONTRACTUAL'
4569 AND responsible_party = 'SUPPLIER_ORG'
4570 AND (PAY_HOLD_PRIOR_DUE_DATE_YN = 'Y' OR PAY_HOLD_OVERDUE_YN = 'Y')
4571 AND deliverable_status NOT IN ('COMPLETED','CANCELLED','INACTIVE');
4572 
4573 l_return_status_true  VARCHAR2(1)  := G_TRUE;
4574 l_return_status_false VARCHAR2(1)  := G_FALSE;
4575 l_effective_beforedue_date DATE;
4579 BEGIN
4576 l_api_name CONSTANT VARCHAR2(50) := 'applyPaymentHolds';
4577 
4578 
4580       IF ( FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
4581         FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE ,g_module||l_api_name,'Inside OKC_MANAGE_DELIVERABLES_GRP.payWhenPaidApplyHolds');
4582       END IF;
4583 x_return_status := l_return_status_false;
4584 
4585 
4586 FOR del_cur IN getDeliverables LOOP
4587 
4588    IF del_cur.PAY_HOLD_PRIOR_DUE_DATE_YN = 'Y' THEN
4589 
4590       IF UPPER(del_cur.PAY_HOLD_PRIOR_DUE_DATE_UOM) = 'DAY' THEN
4591           l_effective_beforedue_date := trunc(del_cur.actual_due_date)-del_cur.PAY_HOLD_PRIOR_DUE_DATE_VALUE;
4592       ELSIF UPPER(del_cur.PAY_HOLD_PRIOR_DUE_DATE_UOM) = 'WK' THEN
4593           l_effective_beforedue_date :=trunc(del_cur.actual_due_date)-7*del_cur.PAY_HOLD_PRIOR_DUE_DATE_VALUE;
4594       ELSIF UPPER(del_cur.PAY_HOLD_PRIOR_DUE_DATE_UOM) = 'MTH' THEN
4595           select add_months(del_cur.actual_due_date,-del_cur.PAY_HOLD_PRIOR_DUE_DATE_VALUE)
4596           INTO l_effective_beforedue_date from dual;
4597       END IF;
4598 
4599           IF trunc(l_effective_beforedue_date) = trunc(sysdate) OR
4600                    trunc(l_effective_beforedue_date) < trunc(sysdate) THEN
4601 
4602           x_return_status := l_return_status_true;
4603           RETURN;
4604           END IF;
4605 
4606    ELSIF del_cur.PAY_HOLD_OVERDUE_YN = 'Y' THEN
4607 
4608           IF trunc(sysdate) > trunc(del_cur.actual_due_date) THEN
4609           x_return_status := l_return_status_true;
4610           RETURN;
4611           END IF;
4612 
4613    END IF;
4614 
4615 END LOOP;
4616 
4617       IF ( FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
4618         FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE ,g_module||l_api_name,'leaving OKC_MANAGE_DELIVERABLES_GRP.payWhenPaidApplyHolds');
4619       END IF;
4620 
4621 EXCEPTION
4622     WHEN OTHERS THEN
4623        IF ( FND_LOG.LEVEL_UNEXPECTED >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
4624         FND_LOG.STRING( FND_LOG.LEVEL_UNEXPECTED ,g_module||l_api_name,'leaving OKC_MANAGE_DELIVERABLES_GRP.payWhenPaidApplyHolds in OTHERS');
4625        END IF;
4626         IF getDeliverables %ISOPEN THEN
4627         CLOSE getDeliverables ;
4628         END IF;
4629         IF FND_MSG_PUB.Check_Msg_Level(FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR) THEN
4630             FND_MSG_PUB.Add_Exc_Msg(G_PKG_NAME,l_api_name);
4631         END IF;
4632         x_return_status := G_RET_STS_ERROR;
4633         FND_MSG_PUB.Count_And_Get(
4634         p_count =>  x_msg_count,
4635         p_data  =>  x_msg_data
4636         );
4637 
4638 
4639 END applyPaymentHolds;
4640 
4641 /*-- Start of comments
4642 --Function name : checkDeliverablePayHold
4643 --Type          : Public.
4644 --Function      : This Function returns TRUE if the deliverable is holding invoices.False otherwise.
4645 --Usage         : This public API will be used only by the Projects team to determine if a
4646 --                particular deliverable is holding invoices or not.
4647 --Pre-reqs      : None.
4648 --Returns       :TRUE or FALSE, if there is unexpected error then it returns NULL.
4649 -- End of comments */
4650 
4651 FUNCTION checkDeliverablePayHold (
4652         p_deliverable_id        IN NUMBER)
4653 RETURN VARCHAR2
4654 IS
4655 
4656 CURSOR del_cur IS
4657 SELECT
4658 PAY_HOLD_PRIOR_DUE_DATE_YN,
4659 PAY_HOLD_PRIOR_DUE_DATE_VALUE,
4660 PAY_HOLD_PRIOR_DUE_DATE_UOM,
4661 PAY_HOLD_OVERDUE_YN,
4662 ACTUAL_DUE_DATE
4663 FROM okc_deliverables
4664 WHERE deliverable_id = p_deliverable_id
4665 AND business_document_type = 'PO_STANDARD'
4666 AND deliverable_type = 'CONTRACTUAL'
4667 AND responsible_party = 'SUPPLIER_ORG'
4668 AND (PAY_HOLD_PRIOR_DUE_DATE_YN = 'Y' OR PAY_HOLD_OVERDUE_YN = 'Y')
4669 AND deliverable_status NOT IN ('COMPLETED','CANCELLED','INACTIVE');
4670 
4671 del_rec del_cur%ROWTYPE;
4672 l_return_value  VARCHAR2(1);
4673 l_effective_beforedue_date DATE;
4674 l_api_name VARCHAR2(30) := 'checkDeliverablePayHold';
4675 
4676 BEGIN
4677   l_return_value :=  G_FALSE;
4678 
4679   IF ( FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
4680      FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE ,g_module||l_api_name,'Inside '||G_PKG_NAME ||'.'||l_api_name);
4681   END IF;
4682 
4683  OPEN del_cur;
4684  FETCH del_cur INTO del_rec;
4685 
4686   IF del_cur%FOUND THEN
4687    IF del_rec.PAY_HOLD_PRIOR_DUE_DATE_YN = 'Y' THEN
4688 
4689       IF UPPER(del_rec.PAY_HOLD_PRIOR_DUE_DATE_UOM) = 'DAY' THEN
4690           l_effective_beforedue_date := trunc(del_rec.actual_due_date)-del_rec.PAY_HOLD_PRIOR_DUE_DATE_VALUE;
4691       ELSIF UPPER(del_rec.PAY_HOLD_PRIOR_DUE_DATE_UOM) = 'WK' THEN
4692           l_effective_beforedue_date :=trunc(del_rec.actual_due_date)-7*del_rec.PAY_HOLD_PRIOR_DUE_DATE_VALUE;
4693       ELSIF UPPER(del_rec.PAY_HOLD_PRIOR_DUE_DATE_UOM) = 'MTH' THEN
4694           l_effective_beforedue_date:= add_months(del_rec.actual_due_date,-del_rec.PAY_HOLD_PRIOR_DUE_DATE_VALUE);
4695       END IF;
4696 
4697           IF trunc(l_effective_beforedue_date) = trunc(sysdate) OR
4698                    trunc(l_effective_beforedue_date) < trunc(sysdate) THEN
4699 
4700           l_return_value := G_TRUE;
4701           END IF;
4702 
4703    ELSIF del_rec.PAY_HOLD_OVERDUE_YN = 'Y' THEN
4704 
4705           IF trunc(sysdate) > trunc(del_rec.actual_due_date) THEN
4706           l_return_value := G_TRUE;
4707           END IF;
4708 
4709    END IF;
4710 
4711  END IF;
4712 
4713  CLOSE del_cur;
4714   IF ( FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
4715          FND_LOG.STRING( FND_LOG.LEVEL_PROCEDURE ,g_module||l_api_name,'Leaving '||G_PKG_NAME ||'.'||l_api_name);
4716   END IF;
4717 
4718 
4719 RETURN(l_return_value);
4720 
4721 EXCEPTION
4722     WHEN OTHERS THEN
4723        IF ( FND_LOG.LEVEL_UNEXPECTED >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
4724         FND_LOG.STRING( FND_LOG.LEVEL_UNEXPECTED ,g_module||l_api_name,'leaving OKC_MANAGE_DELIVERABLES_GRP.checkDeliverablePayHold in OTHERS');
4725        END IF;
4726         IF del_cur%ISOPEN THEN
4727         CLOSE del_cur ;
4728         END IF;
4729         IF FND_MSG_PUB.Check_Msg_Level(FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR) THEN
4730             FND_MSG_PUB.Add_Exc_Msg(G_PKG_NAME,l_api_name);
4731         END IF;
4732 RETURN null;
4733 
4734 END checkDeliverablePayHold;
4735 
4736 
4737   ---------------------------------------------------------------------------
4738   -- END: Public Procedures and Functions
4739   ---------------------------------------------------------------------------
4740 
4741 
4742 END;