[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;