DBA Data[Home] [Help]

PACKAGE BODY: APPS.PA_IC_INV_CNL

Source


1 PACKAGE BODY  PA_IC_INV_CNL as
2 /* $Header: PAICCNLB.pls 120.5 2006/04/05 14:18:41 rmarcel noship $ */
3 --
4 -- This procedure will perform cancellation of a specified invoice
5 -- for a project
6 -- Input parameters
7 -- Parameter           Type       Required Description
8 -- P_PROJECT_ID        NUMBER      Yes      Identifier of the Project
9 -- P_DRAFT_INV_NUM     NUMBER      Yes      Identifier of the Invoice to be
10 --                                          Cancelled
11 --
12 g1_debug_mode varchar2(1) := NVL(FND_PROFILE.value('PA_DEBUG_MODE'), 'N');
13 
14 PROCEDURE cancel_invoice
15 	   (P_PROJECT_ID   IN  NUMBER,
16             P_DRAFT_INV_NUM IN NUMBER) IS
17 
18    l_request_id  number ;
19    l_program_application_id number;
20    l_program_id  number;
21    l_user_id     number;
22 
23    l_new_draft_inv_num number;
24    l_agreement_id      number;
25 
26    l_lock_status       number;
27    l_EI_upd_cnt        number;
28 
29    l_draft_invoice_detail_id    PA_PLSQL_DATATYPES.IdTabTyp;
30    l_new_draft_inv_detail_id    PA_PLSQL_DATATYPES.IdTabTyp;
31    l_expenditure_item_id        PA_PLSQL_DATATYPES.IdTabTyp;
32    l_EI_date                    PA_PLSQL_DATATYPES.Char30TabTyp;
33    l_sys_linkage                PA_PLSQL_DATATYPES.Char30TabTyp; /*Bug 3857986 */
34    l_DENOM_TP_CURRENCY_CODE     PA_PLSQL_DATATYPES.Char30TabTyp;
35    l_DENOM_TRANSFER_PRICE       PA_PLSQL_DATATYPES.NumTabTyp;
36    l_ACCT_TP_RATE_TYPE          PA_PLSQL_DATATYPES.Char30TabTyp;
37    l_ACCT_TP_RATE_DATE          PA_PLSQL_DATATYPES.Char30TabTyp;
38    l_ACCT_TP_EXCHANGE_RATE      PA_PLSQL_DATATYPES.NumTabTyp;
39    l_ACCT_TRANSFER_PRICE        PA_PLSQL_DATATYPES.NumTabTyp;
40    l_PROJACCT_TRANSFER_PRICE    PA_PLSQL_DATATYPES.NumTabTyp;
41    l_CC_MARKUP_BASE_CODE        PA_PLSQL_DATATYPES.Char30TabTyp;
42    l_TP_BASE_AMOUNT             PA_PLSQL_DATATYPES.NumTabTyp;
43    l_TP_IND_COMPILED_SET_ID     PA_PLSQL_DATATYPES.IdTabTyp;
44    l_TP_BILL_RATE               PA_PLSQL_DATATYPES.NumTabTyp;
45    l_TP_BILL_MARKUP_PERCENTAGE  PA_PLSQL_DATATYPES.NumTabTyp;
46    l_TP_SCHEDULE_LINE_PERCENTAGE PA_PLSQL_DATATYPES.NumTabTyp;
47    l_TP_RULE_PERCENTAGE          PA_PLSQL_DATATYPES.NumTabTyp;
48 
49    l_inv_detail_rec  pa_draft_invoice_details%rowtype;
50 
51 
52   /* Bug 5082249 : Performance Issue : FTS
53          Fix : Added the project_id in the subquery */
54 
55    cursor c_invoice_detail (p_proj_id number,
56                             p_inv_num number) is
57    select *
58    from   pa_draft_invoice_details did
59    where  project_id = p_proj_id
60      and  draft_invoice_num = p_inv_num
61      and  not exists
62           ( select 'x'
63             from pa_draft_invoice_details did1
64             where did1.project_id = p_proj_id
65               and did1.detail_id_reversed = did.draft_invoice_detail_id) ;
66 
67    CANNOT_ACQUIRE_LOCK exception;
68    INV_CANCELED_OR_CREDIT_MEMO exception;
69 
70 BEGIN
71 
72     IF g1_debug_mode  = 'Y' THEN
73     	pa_ic_inv_utils.log_message('Entered pa_ic_inv_cancel.cancel_invoice');
74     	pa_ic_inv_utils.log_message('cancel_invoice: ' || 'Project Id :'||P_PROJECT_ID);
75     	pa_ic_inv_utils.log_message('cancel_invoice: ' || 'Invoice Num :'||P_DRAFT_INV_NUM);
76     END IF;
77 
78     l_user_id := pa_ic_inv_utils.g_last_update_login;
79     l_program_id := pa_ic_inv_utils.g_program_id;
80     l_program_application_id := pa_ic_inv_utils.g_program_application_id;
81     l_request_id := pa_ic_inv_utils.g_request_id;
82 
83 /*
84  Obtain the User Lock with name as provider project _id ,
85  this lock will solve the concurrency issues with similar
86  Invoice generation process and other processes that  update invoice details.
87 */
88 
89 IF (pa_ic_inv_utils.Set_User_Lock (P_Project_Id) <> 0) THEN
90    IF g1_debug_mode  = 'Y' THEN
91    	pa_ic_inv_utils.log_message('cancel_invoice: ' || 'unable to acquire lock');
92    END IF;
93    raise CANNOT_ACQUIRE_LOCK;
94 END IF;
95 
96 /*
97   Mark the current Invoice as canceled and
98   update the Invoice comment to indicate that Invoice is canceled
99   provided it satisfies the following criteria
100 + Invoice has not been canceled earlier
101 + Credit memo has not been generated for the Invoice
102 */
103 
104 -- This update statement also returns the agreement_id
105 --
106  Update pa_draft_invoices
107  Set canceled_flag = 'Y',
108      invoice_comment =
109                      (select rtrim(upper(l.meaning)||' '||
110                              rtrim(substrb(i.invoice_comment,1,232)))
111                       from   pa_lookups l,
112                              pa_draft_invoices i
113                       where  i.project_id = p_project_id
114                       and    i.draft_invoice_num = p_draft_inv_num
115                       and    l.lookup_type = 'INVOICE_CREDIT_TYPE'
116                       AND    l.lookup_code = 'CANCEL'
117                      ) ,
118     last_update_date = SYSDATE,
119     last_update_login = l_user_id,
120     request_id        = l_request_id,
121     program_application_id = l_program_application_id,
122     program_id        = l_program_id
123  where project_id = P_PROJECT_ID
124  and draft_invoice_num = P_DRAFT_INV_NUM
125  and nvl(canceled_flag, 'N') <> 'Y'
126  and not exists
127      (
128          select null
129          from pa_draft_invoices di
130          where di.project_id = P_PROJECT_ID
131          and di.draft_invoice_num_credited = P_DRAFT_INV_NUM
132       )
133  returning agreement_id into l_agreement_id;
134 
135 
136 /* If no rows are updated then raise the exception
137    so that the ineligibility criteria is reported.
138 */
139 
140 if SQL%ROWCOUNT = 0 then
141     IF g1_debug_mode  = 'Y' THEN
142     	pa_ic_inv_utils.log_message('cancel_invoice: ' || 'raising error');
143     END IF;
144     RAISE INV_CANCELED_OR_CREDIT_MEMO ;
145 end if;
146 
147     IF g1_debug_mode  = 'Y' THEN
148         pa_ic_inv_utils.log_message('Updating pa_draft_invoices rows = '||
149                                  SQL%ROWCOUNT);
150     	pa_ic_inv_utils.log_message('cancel_invoice: ' || 'Agreement id returned = '||
151                                  l_agreement_id);
152     END IF;
153 -- Get the new Invoice number to be used for the crediting Invoice
154 
155     pa_ic_inv_utils.Get_Next_Draft_Inv_Num(P_PROJECT_ID,
156                                            l_request_id,
157                                            l_new_draft_inv_num );
158 
159 /* Create the new invoice header for the crediting invoice ,
160    most of the information is obtained from the original Invoice.
161 */
162     IF g1_debug_mode  = 'Y' THEN
163     	pa_ic_inv_utils.log_message('cancel_invoice: ' || 'New invoice num = '||l_new_draft_inv_num);
164     END IF;
165 
166     /* Bug#5137884 : INTERCOMP INVOICES ERRORING OUT WITH ORA-06512:
167               Issue: As part of the MOAC changes, the org_id insertion is missing
168                Fix : Org Id is inserted for the new invoices */
169 
170 
171      INSERT INTO PA_DRAFT_INVOICES
172      (
173         DRAFT_INVOICE_NUM,
174         PROJECT_ID,
175         AGREEMENT_ID,
176         LAST_UPDATE_DATE,
177         LAST_UPDATED_BY,
178         CREATION_DATE,
179         CREATED_BY,
180         TRANSFER_STATUS_CODE,
181         PA_DATE,
182         REQUEST_ID,
183         PROGRAM_APPLICATION_ID,
184         PROGRAM_ID,
185         PROGRAM_UPDATE_DATE,
186         BILL_THROUGH_DATE,
187         WRITE_OFF_FLAG,
188         UNEARNED_REVENUE_CR,
189         UNBILLED_RECEIVABLE_DR,
190         INVOICE_COMMENT,
191         DRAFT_INVOICE_NUM_CREDITED,
192         CANCEL_CREDIT_MEMO_FLAG,
193         APPROVED_BY_PERSON_ID,
194         APPROVED_DATE,
195         GENERATION_ERROR_FLAG,
196         TRANSFER_REJECTION_REASON,
197         RETENTION_PERCENTAGE,
198         INV_CURRENCY_CODE,
199         INV_RATE_TYPE,
200         INV_RATE_DATE,
201         INV_EXCHANGE_RATE,
202         BILL_TO_ADDRESS_ID,
203         SHIP_TO_ADDRESS_ID,
204         LANGUAGE,
205         CC_PROJECT_ID,
206         CC_INVOICE_GROUP_CODE  ,
207 	INVPROC_CURRENCY_CODE,
208         CUSTOMER_ID,
209         BILL_TO_CUSTOMER_ID,
210         SHIP_TO_CUSTOMER_ID,
211         BILL_TO_CONTACT_ID,
212         SHIP_TO_CONTACT_ID   /*Added for 2760630*/,
213         PROJFUNC_INVTRANS_RATE_TYPE, /* Added below columns for bug 4500281*/
214         PROJFUNC_INVTRANS_RATE_DATE,
215         PROJFUNC_INVTRANS_EX_RATE,
216         ORG_ID
217       )
218       SELECT l_new_draft_inv_num,
219              I2.PROJECT_ID,
220              I2.AGREEMENT_ID,
221              TRUNC(SYSDATE),
222              l_user_id,
223              TRUNC(SYSDATE),
224              l_user_id,
225              'P',
226              TRUNC(SYSDATE),
227              l_request_id,
228              l_program_application_id,
229              l_program_id,
230              TRUNC(SYSDATE),
231              I2.BILL_THROUGH_DATE,
232              NULL,
233              0,
234              0,
235              P.INVOICE_COMMENT,
236              I2.DRAFT_INVOICE_NUM,
237              'Y',
238              NULL,
239              TRUNC(SYSDATE),
240              'N',
241              NULL,
242              I2.RETENTION_PERCENTAGE,
243              I2.INV_CURRENCY_CODE,
244              I2.INV_RATE_TYPE,
245              I2.INV_RATE_DATE,
246              I2.INV_EXCHANGE_RATE,
247              I2.BILL_TO_ADDRESS_ID,
248              I2.SHIP_TO_ADDRESS_ID,
249              I2.LANGUAGE,
250              I2.CC_PROJECT_ID,
251              I2.CC_INVOICE_GROUP_CODE,
252 	     I2.INVPROC_CURRENCY_CODE,
253              I2.CUSTOMER_ID,
254              I2.BILL_TO_CUSTOMER_ID,
255              I2.SHIP_TO_CUSTOMER_ID,
256              I2.BILL_TO_CONTACT_ID,
257              I2.SHIP_TO_CONTACT_ID,
258              I2.PROJFUNC_INVTRANS_RATE_TYPE, /* Added below columns for bug 4500281*/
259              I2.PROJFUNC_INVTRANS_RATE_DATE,
260              I2.PROJFUNC_INVTRANS_EX_RATE,
261              I2.ORG_ID
262       FROM   PA_DRAFT_INVOICES I2, PA_PROJECTS P
263       WHERE  I2.DRAFT_INVOICE_NUM = P_DRAFT_INV_NUM
264       AND    I2.PROJECT_ID = P_PROJECT_ID
265       AND    P.PROJECT_ID = P_PROJECT_ID;
266 
267     IF g1_debug_mode  = 'Y' THEN
268         pa_ic_inv_utils.log_message('Inserting pa_draft_invoices rows = '||
269                                  SQL%ROWCOUNT);
270     END IF;
271 
272 /* A new line will be created in the canceling Invoice for every line
273    in the original canceled invoice.
274    The following insert statement will create all the crediting invoice
275    lines.
276 */
277 
278 INSERT INTO PA_DRAFT_INVOICE_ITEMS
279        (LINE_NUM,
280         DRAFT_INVOICE_NUM,
281         PROJECT_ID,
282         TASK_ID,
283         AMOUNT,
284         INV_AMOUNT,
285         LAST_UPDATE_DATE,
286         LAST_UPDATED_BY,
287         CREATION_DATE,
288         CREATED_BY,
289         TEXT,
290         EVENT_TASK_ID,
291         EVENT_NUM,
292         REQUEST_ID,
293         PROGRAM_APPLICATION_ID,
294         PROGRAM_ID,
295         PROGRAM_UPDATE_DATE,
296         UNEARNED_REVENUE_CR,
297         UNBILLED_RECEIVABLE_DR,
298         DRAFT_INV_LINE_NUM_CREDITED,
299         INVOICE_LINE_TYPE,
300         TAXABLE_FLAG,
301         SHIP_TO_ADDRESS_ID,
302         OUTPUT_TAX_CLASSIFICATION_CODE,
303         OUTPUT_TAX_EXEMPT_FLAG,
304         OUTPUT_TAX_EXEMPT_REASON_CODE,
305         OUTPUT_TAX_EXEMPT_NUMBER,
306         CC_PROJECT_ID,
307         CC_TAX_TASK_ID,
308         CC_REV_CODE_COMBINATION_ID,
309         TRANSLATED_TEXT,
310 	invproc_currency_code,
311 	projfunc_currency_code,
312 	projfunc_bill_amount,
313 	project_currency_code,
314 	project_bill_amount,
315 	funding_currency_code,
316 	funding_bill_amount
317         )
318  SELECT I2.LINE_NUM,
319         l_new_draft_inv_num,
320         I2.PROJECT_ID,
321         I2.TASK_ID,
322         -1 * AMOUNT,
323         -1 * INV_AMOUNT,
324         TRUNC(SYSDATE),
325         l_user_id,
326         TRUNC(SYSDATE),
327         l_user_id,
328         I2.TEXT,
329         I2.EVENT_TASK_ID,
330         NULL,
331         l_request_id,
332         l_program_application_id,
333         l_program_id,
334         TRUNC(SYSDATE),
335         0,
336         0,
337         I2.LINE_NUM,
338         I2.INVOICE_LINE_TYPE,
339         I2.TAXABLE_FLAG,
340         I2.SHIP_TO_ADDRESS_ID,
341         I2.OUTPUT_TAX_CLASSIFICATION_CODE,
342         I2.OUTPUT_TAX_EXEMPT_FLAG,
343         I2.OUTPUT_TAX_EXEMPT_REASON_CODE,
344         I2.OUTPUT_TAX_EXEMPT_NUMBER,
345         I2.CC_PROJECT_ID,
346         I2.CC_TAX_TASK_ID,
347         I2.CC_REV_CODE_COMBINATION_ID,
348         I2.TRANSLATED_TEXT,
349 	I2.invproc_currency_code,
350 	I2.projfunc_currency_code,
351 	-1 * I2.projfunc_bill_amount,
352 	I2.project_currency_code,
353 	-1 * I2.project_bill_amount,
354 	I2.funding_currency_code,
355 	-1 * I2.funding_bill_amount
356 FROM    PA_DRAFT_INVOICE_ITEMS  I2
357 WHERE  I2.PROJECT_ID = P_PROJECT_ID
358 AND    I2.DRAFT_INVOICE_NUM = P_DRAFT_INV_NUM;
359 
360     IF g1_debug_mode  = 'Y' THEN
361        pa_ic_inv_utils.log_message('Inserting pa_draft_invoice_items rows = '||
362                                  SQL%ROWCOUNT);
363     END IF;
364 
365 /* For each reversing invoice line create new Invoice details ,
366    the new rows in the Invoice details will be reversing the Invoice details
367    belonging to the Original canceled Invoice line ,
368    except in the case when reversing invoice details already exists due
369    to adjustments then new invoice details will not be created
370    but the reversing  invoice details will be updated with the new Invoice
371    number and line number.
372 */
373 
374 /* Open the cursor to fetch the non reversed invoice details of
375    the original invoice .
376    For each row create reversing invoice details using the table
377    handlers.
378 */
379 
380    l_EI_upd_cnt := 0;
381 
382    PA_INVOICE_DETAIL_PROCESS.init;
383 
384    Open  c_invoice_detail(p_project_id , p_draft_inv_num);
385 
386    loop
387 
388    fetch c_invoice_detail into l_inv_detail_rec;
389 
390    if c_invoice_detail%notfound  then exit;
391    end if;
392 
393 
394    l_EI_upd_cnt := l_EI_upd_cnt + 1;
395 
396    IF g1_debug_mode  = 'Y' THEN
397    	pa_ic_inv_utils.log_message ('cancel_invoice: ' || 'Reversing row number '|| l_EI_upd_cnt);
398    	pa_ic_inv_utils.log_message ('cancel_invoice: ' || 'Reversing EI id , line num '||
399              l_inv_detail_rec.expenditure_item_id ||','
400              ||l_inv_detail_rec.line_num);
401    END IF;
402 
403 
404    /* Store the values in local tables to be used later for EI update */
405 
406    l_expenditure_item_id (l_EI_upd_cnt)
407                      := l_inv_detail_rec.expenditure_item_id;
408    l_draft_invoice_detail_id (l_EI_upd_cnt)
409                      := l_inv_detail_rec.draft_invoice_detail_id;
410    l_DENOM_TP_CURRENCY_CODE(l_EI_upd_cnt)
411                      := l_inv_detail_rec.DENOM_CURRENCY_CODE;
412    l_DENOM_TRANSFER_PRICE(l_EI_upd_cnt)
413                      := l_inv_detail_rec.DENOM_BILL_AMOUNT;
414    l_ACCT_TP_RATE_TYPE(l_EI_upd_cnt) := l_inv_detail_rec.ACCT_RATE_TYPE;
415    l_ACCT_TP_RATE_DATE(l_EI_upd_cnt) := l_inv_detail_rec.ACCT_RATE_DATE;
419                      := l_inv_detail_rec.BILL_AMOUNT;
416    l_ACCT_TP_EXCHANGE_RATE(l_EI_upd_cnt)
417                      := l_inv_detail_rec.ACCT_EXCHANGE_RATE;
418    l_ACCT_TRANSFER_PRICE(l_EI_upd_cnt)
420    l_PROJACCT_TRANSFER_PRICE(l_EI_upd_cnt)
421                      := l_inv_detail_rec.PROJACCT_BILL_AMOUNT;
422    l_CC_MARKUP_BASE_CODE(l_EI_upd_cnt)
423                      := l_inv_detail_rec.MARKUP_CALC_BASE_CODE;
424    l_TP_BASE_AMOUNT(l_EI_upd_cnt)
425                      := l_inv_detail_rec.BASE_AMOUNT;
426    l_TP_IND_COMPILED_SET_ID(l_EI_upd_cnt)
427                      := l_inv_detail_rec.IND_COMPILED_SET_ID;
428    l_TP_BILL_RATE(l_EI_upd_cnt)
429                      := l_inv_detail_rec.BILL_RATE;
430    l_TP_BILL_MARKUP_PERCENTAGE(l_EI_upd_cnt)
431                      := l_inv_detail_rec.BILL_MARKUP_PERCENTAGE;
432    l_TP_SCHEDULE_LINE_PERCENTAGE(l_EI_upd_cnt)
433                      := l_inv_detail_rec.SCHEDULE_LINE_PERCENTAGE;
434    l_TP_RULE_PERCENTAGE(l_EI_upd_cnt)
435                      := l_inv_detail_rec.RULE_PERCENTAGE;
436 
437    /* Reverse row will create reversing invoice details */
438    PA_INVOICE_DETAIL_PROCESS.reverse_row(l_inv_detail_rec);
439 
440    l_new_draft_inv_detail_id(l_EI_upd_cnt)
441                 := l_inv_detail_rec.draft_invoice_detail_id;
442    end loop;
443 
444    close c_invoice_detail;
445 
446    PA_INVOICE_DETAIL_PROCESS.apply_ins_changes;
447 
448 /* Update the existing reversing invoice details ,
449    these rows will already have the columns orig_draft_invoice_num
450    and orig_draft_invoice_line_num populated */
451 
452    UPDATE PA_DRAFT_INVOICE_DETAILS
453       SET DRAFT_INVOICE_NUM = l_new_draft_inv_num ,
454 	  DRAFT_INVOICE_LINE_NUM = ORIG_DRAFT_INVOICE_LINE_NUM,
455           INVOICED_FLAG = 'Y',
456           last_update_date = SYSDATE,
457           last_update_login = l_user_id,
458           request_id        = l_request_id,
459           program_application_id = l_program_application_id,
460           program_id        = l_program_id
461     WHERE ORIG_DRAFT_INVOICE_NUM = P_DRAFT_INV_NUM
462       AND INVOICED_FLAG = 'N'
463       AND PROJECT_ID = P_PROJECT_ID;
464 
465    IF g1_debug_mode  = 'Y' THEN
466        pa_ic_inv_utils.log_message('Updating invoice details rows  = '
467                                                  || SQL%rowcount);
468    END IF;
469 
470 
471 /* Update the project summary fundings to reflect the cancellation */
472 
473    pa_ic_inv_utils.update_SPF(l_new_draft_inv_num,
474                               l_agreement_id,
475                               P_DRAFT_INV_NUM,
476                               'CANCEL');
477 
478 /* Update the EI's with the transfer price attributes.
479    Only those EI's corresponding to Invoice details
480    that have been reversed in the procedure will be Updated.
481    The others are not updated since the other processes
482    must have updated the appropriate TP attributes
483 */
484 
485 /* For bug 2968292 Assigned a value of NULL to denom_transfer_price,
486    acct_transfer_price and projacct_transfer_price */
487 /* For bug 3857986, added system_linkage_fuction in returning clause of this update statement */
488   FORALL I IN 1..l_EI_upd_cnt
489   UPDATE PA_EXPENDITURE_ITEMS
490   SET    DENOM_TP_CURRENCY_CODE = l_DENOM_TP_CURRENCY_CODE(I),
491          DENOM_TRANSFER_PRICE   = NULL ,
492          ACCT_TP_RATE_TYPE      = l_ACCT_TP_RATE_TYPE(I),
493          ACCT_TP_RATE_DATE      = l_ACCT_TP_RATE_DATE(I),
494          ACCT_TP_EXCHANGE_RATE  = l_ACCT_TP_EXCHANGE_RATE(I),
495          ACCT_TRANSFER_PRICE    = NULL,
496          PROJACCT_TRANSFER_PRICE = NULL,
497          CC_MARKUP_BASE_CODE     = l_CC_MARKUP_BASE_CODE(I),
498          TP_BASE_AMOUNT         = l_TP_BASE_AMOUNT(I),
499          TP_IND_COMPILED_SET_ID = l_TP_IND_COMPILED_SET_ID(I),
500          TP_BILL_RATE           = l_TP_BILL_RATE(I),
501          TP_BILL_MARKUP_PERCENTAGE = l_TP_BILL_MARKUP_PERCENTAGE(I),
502          TP_SCHEDULE_LINE_PERCENTAGE = l_TP_SCHEDULE_LINE_PERCENTAGE(I),
503          TP_RULE_PERCENTAGE     = l_TP_RULE_PERCENTAGE(I),
504          cc_ic_processed_code = decode(cc_cross_charge_code,'I','N','X'),
505          last_update_date = SYSDATE,
506          last_update_login = l_user_id,
507          request_id        = l_request_id,
508          program_application_id = l_program_application_id,
509          program_id        = l_program_id
510    WHERE  EXPENDITURE_ITEM_ID = L_EXPENDITURE_ITEM_ID(I)
511    RETURNING expenditure_item_date , system_linkage_function
512    BULK COLLECT INTO l_ei_date, l_sys_linkage;
513 
514    IF g1_debug_mode  = 'Y' THEN
515        pa_ic_inv_utils.log_message('Updating EI rows  = ' || SQL%rowcount);
516    END IF;
517 
518  /** do provider reclass for reversed rows **/
519 
520    pa_invoice_detail_process.reverse_preclass
521                              (l_draft_invoice_detail_id,
522                               l_new_draft_inv_detail_id,
523                               l_expenditure_item_id,
524                               l_EI_date,
525                               l_sys_linkage, /* Bug 3857986 */
526                               l_EI_upd_cnt
527                              );
528 
529  /** To trigger MRC for draft invoice items **/
530 
531    PA_IC_INV_UTILS.Commit_Invoice ();
532 
533 -- Release the user lock once the cancellation for the Invoice is complete.
534    l_lock_status := PA_IC_INV_UTILS.Release_User_Lock (P_Project_Id);
535 
536 EXCEPTION
537 
538          WHEN INV_CANCELED_OR_CREDIT_MEMO THEN
539          IF g1_debug_mode  = 'Y' THEN
540          	pa_ic_inv_utils.log_message('cancel_invoice: ' || 'Invoice Cancelled or Credit memo exists');
541          END IF;
542          l_lock_status := PA_IC_INV_UTILS.Release_User_Lock (P_Project_Id);
543 --         raise;
544          WHEN CANNOT_ACQUIRE_LOCK THEN
545           IF g1_debug_mode  = 'Y' THEN
546           	pa_ic_inv_utils.log_message('cancel_invoice: ' || 'Cannot acquire lock for project ' ||
547                                        P_project_id);
548           END IF;
549          WHEN OTHERS THEN
550           raise;
551 END cancel_invoice;
552 
553 end pa_ic_inv_cnl;