[Home] [Help]
PACKAGE BODY: APPS.AP_APPROVAL_PKG
Source
1 PACKAGE BODY AP_APPROVAL_PKG AS
2 /* $Header: apaprvlb.pls 120.231.12020000.14 2013/03/14 07:44:25 cmaredup ship $ */
3
4 G_PKG_NAME CONSTANT VARCHAR2(30) := 'AP_APPROVAL_PKG';
5 G_MSG_UERROR CONSTANT NUMBER := FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR;
6 G_MSG_ERROR CONSTANT NUMBER := FND_MSG_PUB.G_MSG_LVL_ERROR;
7 G_MSG_SUCCESS CONSTANT NUMBER := FND_MSG_PUB.G_MSG_LVL_SUCCESS;
8 G_MSG_HIGH CONSTANT NUMBER := FND_MSG_PUB.G_MSG_LVL_DEBUG_HIGH;
9 G_MSG_MEDIUM CONSTANT NUMBER := FND_MSG_PUB.G_MSG_LVL_DEBUG_MEDIUM;
10 G_MSG_LOW CONSTANT NUMBER := FND_MSG_PUB.G_MSG_LVL_DEBUG_LOW;
11 G_LINES_PER_FETCH CONSTANT NUMBER := 1000;
12
13 G_CURRENT_RUNTIME_LEVEL CONSTANT NUMBER := FND_LOG.G_CURRENT_RUNTIME_LEVEL;
14 G_LEVEL_UNEXPECTED CONSTANT NUMBER := FND_LOG.LEVEL_UNEXPECTED;
15 G_LEVEL_ERROR CONSTANT NUMBER := FND_LOG.LEVEL_ERROR;
16 G_LEVEL_EXCEPTION CONSTANT NUMBER := FND_LOG.LEVEL_EXCEPTION;
17 G_LEVEL_EVENT CONSTANT NUMBER := FND_LOG.LEVEL_EVENT;
18 G_LEVEL_PROCEDURE CONSTANT NUMBER := FND_LOG.LEVEL_PROCEDURE;
19 G_LEVEL_STATEMENT CONSTANT NUMBER := FND_LOG.LEVEL_STATEMENT;
20 G_MODULE_NAME CONSTANT VARCHAR2(100) := 'AP.PLSQL.AP_APPROVAL_PKG.';
21
22 /*===========================================================================
23 | Private Global Variable specification
24 *==========================================================================*/
25 g_org_id NUMBER(15); /* Bug 3700128. MOAC Project */
26
27 /*============================================================================
28 | Private (Non Public) Procedure Specifications
29 *===========================================================================*/
30 FUNCTION Inv_Needs_Approving(
31 p_invoice_id IN NUMBER,
32 p_run_option IN VARCHAR2,
33 p_calling_sequence IN VARCHAR2) RETURN BOOLEAN;
34
35 FUNCTION Get_Inv_Matched_Status(
36 p_invoice_id IN NUMBER,
37 p_calling_sequence IN VARCHAR2) RETURN BOOLEAN;
38
39 PROCEDURE Get_Invoice_Statuses(
40 p_invoice_id IN NUMBER,
41 p_holds_count IN OUT NOCOPY NUMBER,
42 p_approval_status IN OUT NOCOPY VARCHAR2,
43 p_calling_sequence IN VARCHAR2);
44
45 PROCEDURE Update_Inv_Dists_To_Approved(
46 p_invoice_id IN NUMBER,
47 p_user_id IN NUMBER,
48 p_calling_sequence IN VARCHAR2);
49
50 PROCEDURE Update_Inv_Dists_To_Selected(
51 p_invoice_id IN NUMBER,
52 P_line_number IN NUMBER,
53 p_run_option IN VARCHAR2,
54 p_calling_sequence IN VARCHAR2);
55
56 PROCEDURE Approval_Init(
57 p_org_id IN NUMBER,
58 p_invoice_id IN NUMBER,
59 p_invoice_type IN VARCHAR2 DEFAULT NULL,
60 p_tolerance_id IN NUMBER,
61 p_services_tolerance_id IN NUMBER,
62 p_conc_flag IN VARCHAR2,
63 p_set_of_books_id IN OUT NOCOPY NUMBER,
64 p_recalc_pay_sched_flag IN OUT NOCOPY VARCHAR2,
65 p_sys_xrate_gain_ccid IN OUT NOCOPY NUMBER,
66 p_sys_xrate_loss_ccid IN OUT NOCOPY NUMBER,
67 p_base_currency_code IN OUT NOCOPY VARCHAR2,
68 p_inv_enc_type_id IN OUT NOCOPY NUMBER,
69 p_purch_enc_type_id IN OUT NOCOPY NUMBER,
70 p_gl_date_from_receipt_flag IN OUT NOCOPY VARCHAR2,
71 p_receipt_acc_days IN OUT NOCOPY NUMBER,
72 p_system_user IN OUT NOCOPY NUMBER,
73 p_user_id IN OUT NOCOPY NUMBER,
74 p_goods_ship_amt_tolerance IN OUT NOCOPY NUMBER,
75 p_goods_rate_amt_tolerance IN OUT NOCOPY NUMBER,
76 p_goods_total_amt_tolerance IN OUT NOCOPY NUMBER,
77 p_services_ship_amt_tolerance IN OUT NOCOPY NUMBER,
78 p_services_rate_amt_tolerance IN OUT NOCOPY NUMBER,
79 p_services_total_amt_tolerance IN OUT NOCOPY NUMBER,
80 p_price_tolerance IN OUT NOCOPY NUMBER,
81 p_qty_tolerance IN OUT NOCOPY NUMBER,
82 p_qty_rec_tolerance IN OUT NOCOPY NUMBER,
83 p_amt_tolerance IN OUT NOCOPY NUMBER,
84 p_amt_rec_tolerance IN OUT NOCOPY NUMBER,
85 p_max_qty_ord_tolerance IN OUT NOCOPY NUMBER,
86 p_max_qty_rec_tolerance IN OUT NOCOPY NUMBER,
87 p_max_amt_ord_tolerance IN OUT NOCOPY NUMBER,
88 p_max_amt_rec_tolerance IN OUT NOCOPY NUMBER,
89 p_invoice_line_count OUT NOCOPY NUMBER, --Bug 6684139
90 p_calling_sequence IN VARCHAR2);
91
92 PROCEDURE Set_Hold(
93 p_invoice_id IN NUMBER,
94 p_line_location_id IN NUMBER,
95 p_rcv_transaction_id IN NUMBER,
96 p_hold_lookup_code IN VARCHAR2,
97 p_hold_reason IN VARCHAR2,
98 p_holds IN OUT NOCOPY HOLDSARRAY,
99 p_holds_count IN OUT NOCOPY COUNTARRAY,
100 p_calling_sequence IN VARCHAR2);
101
102 PROCEDURE Count_Hold(
103 p_hold_lookup_code IN VARCHAR2,
104 p_holds IN OUT NOCOPY HOLDSARRAY,
105 p_count IN OUT NOCOPY COUNTARRAY,
106 p_calling_sequence IN VARCHAR2);
107
108 PROCEDURE Get_Release_Lookup_For_Hold(
109 p_hold_lookup_code IN VARCHAR2,
110 p_release_lookup_code IN OUT NOCOPY VARCHAR2,
111 p_calling_sequence IN VARCHAR2);
112
113 PROCEDURE Withhold_Tax_On(
114 p_invoice_id IN NUMBER,
115 p_gl_date_from_receipt IN VARCHAR2,
116 p_last_updated_by IN NUMBER,
117 p_last_update_login IN NUMBER,
118 p_program_application_id IN NUMBER,
119 p_program_id IN NUMBER,
120 p_request_id IN NUMBER,
121 p_system_user IN NUMBER,
122 p_holds IN OUT NOCOPY HOLDSARRAY,
123 p_holds_count IN OUT NOCOPY COUNTARRAY,
124 p_release_count IN OUT NOCOPY COUNTARRAY,
125 p_calling_sequence IN VARCHAR2);
126
127 PROCEDURE Line_Base_Amount_Calculation(
128 p_invoice_id IN NUMBER,
129 p_invoice_currency_code IN VARCHAR2,
130 p_base_currency_code IN VARCHAR2,
131 p_exchange_rate IN NUMBER,
132 p_need_to_round_flag IN VARCHAR2 DEFAULT 'N',
133 p_calling_sequence IN VARCHAR2);
134
135 PROCEDURE Dist_Base_Amount_Calculation(
136 p_invoice_id IN NUMBER,
137 p_invoice_line_number IN NUMBER,
138 p_invoice_currency_code IN VARCHAR2,
139 p_base_currency_code IN VARCHAR2,
140 p_invoice_exchange_rate IN NUMBER,
141 p_need_to_round_flag IN VARCHAR2 DEFAULT 'N',
142 p_calling_sequence IN VARCHAR2);
143
144 PROCEDURE Execute_General_Checks(
145 p_invoice_id IN NUMBER,
146 p_set_of_books_id IN NUMBER,
147 p_base_currency_code IN VARCHAR2,
148 p_invoice_amount IN NUMBER,
149 p_base_amount IN NUMBER,
150 p_invoice_currency_code IN VARCHAR2,
151 p_invoice_amount_limit IN NUMBER,
152 p_hold_future_payments_flag IN VARCHAR2,
153 p_system_user IN NUMBER,
154 p_holds IN OUT NOCOPY HOLDSARRAY,
155 p_holds_count IN OUT NOCOPY COUNTARRAY,
156 p_release_count IN OUT NOCOPY COUNTARRAY,
157 p_calling_sequence IN VARCHAR2);
158
159 PROCEDURE Check_Dist_Variance(
160 p_invoice_id IN NUMBER,
161 p_invoice_line_number IN NUMBER,
162 p_system_user IN NUMBER,
163 p_holds IN OUT NOCOPY HOLDSARRAY,
164 p_holds_count IN OUT NOCOPY COUNTARRAY,
165 p_release_count IN OUT NOCOPY COUNTARRAY,
166 p_distribution_variance_exist OUT NOCOPY BOOLEAN,
167 p_calling_sequence IN VARCHAR2);
168
169 PROCEDURE Check_Line_Variance(
170 p_invoice_id IN NUMBER,
171 p_system_user IN NUMBER,
172 p_holds IN OUT NOCOPY HOLDSARRAY,
173 p_holds_count IN OUT NOCOPY COUNTARRAY,
174 p_release_count IN OUT NOCOPY COUNTARRAY,
175 p_line_variance_hold_exist OUT NOCOPY BOOLEAN,
176 p_calling_sequence IN VARCHAR2,
177 p_base_currency_code IN VARCHAR2); --bug7271262
178
179 PROCEDURE Check_Prepaid_Amount(
180 p_invoice_id IN NUMBER,
181 p_system_user IN NUMBER,
182 p_holds IN OUT NOCOPY HOLDSARRAY,
183 p_holds_count IN OUT NOCOPY COUNTARRAY,
184 p_release_count IN OUT NOCOPY COUNTARRAY,
185 p_calling_sequence IN VARCHAR2);
186
187 PROCEDURE Check_No_Rate(
188 p_invoice_id IN NUMBER,
189 p_base_currency_code IN VARCHAR2,
190 p_system_user IN NUMBER,
191 p_holds IN OUT NOCOPY HOLDSARRAY,
192 p_holds_count IN OUT NOCOPY COUNTARRAY,
193 p_release_count IN OUT NOCOPY COUNTARRAY,
194 p_calling_sequence IN VARCHAR2);
195
196 --bug9296410
197 PROCEDURE CHECK_PROJECT_COMMITMENTS(
198 p_invoice_id IN NUMBER,
199 p_system_user IN NUMBER,
200 p_holds IN OUT NOCOPY HOLDSARRAY,
201 p_holds_count IN OUT NOCOPY COUNTARRAY,
202 p_release_count IN OUT NOCOPY COUNTARRAY,
203 p_calling_sequence IN VARCHAR2);
204
205 PROCEDURE Check_invoice_vendor(
206 p_invoice_id IN NUMBER,
207 p_base_currency_code IN VARCHAR2,
208 p_invoice_amount IN NUMBER,
209 p_base_amount IN NUMBER,
210 p_invoice_currency_code IN VARCHAR2,
211 p_invoice_amount_limit IN NUMBER,
212 p_hold_future_payments_flag IN VARCHAR2,
213 p_system_user IN NUMBER,
214 p_holds IN OUT NOCOPY HOLDSARRAY,
215 p_holds_count IN OUT NOCOPY COUNTARRAY,
216 p_release_count IN OUT NOCOPY COUNTARRAY,
217 p_calling_sequence IN VARCHAR2);
218
219 PROCEDURE Check_Manual_AWT_Segments(
220 p_invoice_id IN NUMBER,
221 p_system_user IN NUMBER,
222 p_holds IN OUT NOCOPY HOLDSARRAY,
223 p_holds_count IN OUT NOCOPY COUNTARRAY,
224 p_release_count IN OUT NOCOPY COUNTARRAY,
225 p_calling_sequence IN VARCHAR2);
226
227 PROCEDURE Check_PO_Required(
228 p_invoice_id IN NUMBER,
229 p_system_user IN NUMBER,
230 p_holds IN OUT NOCOPY HOLDSARRAY,
231 p_holds_count IN OUT NOCOPY COUNTARRAY,
232 p_release_count IN OUT NOCOPY COUNTARRAY,
233 p_calling_sequence IN VARCHAR2);
234
235 PROCEDURE Check_Invalid_Dist_Acct(
236 p_invoice_id IN NUMBER,
237 p_system_user IN NUMBER,
238 p_holds IN OUT NOCOPY HOLDSARRAY,
239 p_holds_count IN OUT NOCOPY COUNTARRAY,
240 p_release_count IN OUT NOCOPY COUNTARRAY,
241 p_calling_sequence IN VARCHAR2);
242
243 FUNCTION Check_hold_batch_releaseable(
244 p_hold_name IN VARCHAR2,
245 p_calling_sequence IN VARCHAR2) RETURN VARCHAR2;
246
247 PROCEDURE Generate_Account_Event(
248 p_invoice_id IN NUMBER,
249 p_calling_sequence IN VARCHAR2);
250
251 PROCEDURE Update_Total_Dist_Amount(
252 p_invoice_id IN NUMBER,
253 p_calling_sequence IN VARCHAR2);
254
255 PROCEDURE Exclude_Tax_Freight_From_Disc(
256 p_invoice_id IN NUMBER,
257 p_exclude_tax_from_discount IN VARCHAR2,
258 p_exclude_freight_from_disc IN VARCHAR2,
259 p_net_of_retainage_flag IN VARCHAR2, --9356460
260 p_invoice_type_lookup_code IN VARCHAR2,
261 p_curr_calling_sequence IN VARCHAR2) ;
262
263 PROCEDURE update_payment_schedule_prepay(
264 p_invoice_id IN NUMBER,
265 p_apply_amount IN NUMBER,
266 p_amount_positive IN VARCHAR2,
267 p_payment_currency_code IN VARCHAR2,
268 p_user_id IN NUMBER,
269 p_last_update_login IN NUMBER,
270 p_calling_sequence IN VARCHAR2);
271
272 FUNCTION validate_period (p_invoice_id IN NUMBER) RETURN BOOLEAN;
273
274 PROCEDURE Manual_Withhold_Tax(
275 p_invoice_id IN NUMBER,
276 p_last_updated_by IN NUMBER,
277 p_last_update_login IN NUMBER,
278 p_calling_sequence IN VARCHAR2);
279
280 /* Bug 7393338 added this procedure*/
281 PROCEDURE Update_Pay_Sched_For_Awt(p_invoice_id IN NUMBER,
282 p_last_updated_by IN NUMBER,
283 p_last_update_login IN NUMBER,
284 p_calling_sequence IN VARCHAR2);
285
286 PROCEDURE createPaymentSchedules(
287 p_invoice_id IN NUMBER,
288 p_calling_sequence IN VARCHAR2);
289
290 Procedure Print_Debug(
291 p_api_name IN VARCHAR2,
292 p_debug_info IN VARCHAR2);
293
294 /* added new procedure for the bug9553683 moved to spec 11659334 */
295 /* code removed (definition of Release_fund_holds from body )*/
296
297
298 CURSOR invoice_line_cur (c_invoice_id NUMBER) IS
299 SELECT INVOICE_ID,
300 LINE_NUMBER,
301 LINE_TYPE_LOOKUP_CODE,
302 REQUESTER_ID,
303 DESCRIPTION,
304 LINE_SOURCE,
305 ORG_ID,
306 LINE_GROUP_NUMBER,
307 INVENTORY_ITEM_ID,
308 ITEM_DESCRIPTION,
309 SERIAL_NUMBER,
310 MANUFACTURER,
311 MODEL_NUMBER,
312 WARRANTY_NUMBER,
313 GENERATE_DISTS,
314 MATCH_TYPE,
315 DISTRIBUTION_SET_ID,
316 ACCOUNT_SEGMENT,
317 BALANCING_SEGMENT,
318 COST_CENTER_SEGMENT,
319 OVERLAY_DIST_CODE_CONCAT,
320 DEFAULT_DIST_CCID,
321 PRORATE_ACROSS_ALL_ITEMS,
322 ACCOUNTING_DATE,
323 PERIOD_NAME ,
324 DEFERRED_ACCTG_FLAG ,
325 DEF_ACCTG_START_DATE ,
326 DEF_ACCTG_END_DATE,
327 DEF_ACCTG_NUMBER_OF_PERIODS,
328 DEF_ACCTG_PERIOD_TYPE ,
329 SET_OF_BOOKS_ID,
330 AMOUNT,
331 BASE_AMOUNT,
332 ROUNDING_AMT,
333 QUANTITY_INVOICED,
334 UNIT_MEAS_LOOKUP_CODE ,
335 UNIT_PRICE,
336 WFAPPROVAL_STATUS,
337 DISCARDED_FLAG,
338 ORIGINAL_AMOUNT,
339 ORIGINAL_BASE_AMOUNT ,
340 ORIGINAL_ROUNDING_AMT ,
341 CANCELLED_FLAG ,
342 INCOME_TAX_REGION,
343 TYPE_1099 ,
344 STAT_AMOUNT ,
345 PREPAY_INVOICE_ID ,
346 PREPAY_LINE_NUMBER ,
347 INVOICE_INCLUDES_PREPAY_FLAG ,
348 CORRECTED_INV_ID ,
349 CORRECTED_LINE_NUMBER ,
350 PO_HEADER_ID,
351 PO_LINE_ID ,
352 PO_RELEASE_ID ,
353 PO_LINE_LOCATION_ID ,
354 PO_DISTRIBUTION_ID,
355 RCV_TRANSACTION_ID,
356 FINAL_MATCH_FLAG,
357 ASSETS_TRACKING_FLAG ,
358 ASSET_BOOK_TYPE_CODE ,
359 ASSET_CATEGORY_ID ,
360 PROJECT_ID ,
361 TASK_ID ,
362 EXPENDITURE_TYPE ,
363 EXPENDITURE_ITEM_DATE ,
364 EXPENDITURE_ORGANIZATION_ID ,
365 PA_QUANTITY,
366 PA_CC_AR_INVOICE_ID ,
367 PA_CC_AR_INVOICE_LINE_NUM ,
368 PA_CC_PROCESSED_CODE ,
369 AWARD_ID,
370 AWT_GROUP_ID ,
371 REFERENCE_1 ,
372 REFERENCE_2 ,
373 RECEIPT_VERIFIED_FLAG ,
374 RECEIPT_REQUIRED_FLAG ,
375 RECEIPT_MISSING_FLAG ,
376 JUSTIFICATION ,
377 EXPENSE_GROUP ,
378 START_EXPENSE_DATE ,
379 END_EXPENSE_DATE ,
380 RECEIPT_CURRENCY_CODE ,
381 RECEIPT_CONVERSION_RATE,
382 RECEIPT_CURRENCY_AMOUNT ,
383 DAILY_AMOUNT ,
384 WEB_PARAMETER_ID ,
385 ADJUSTMENT_REASON ,
386 MERCHANT_DOCUMENT_NUMBER ,
387 MERCHANT_NAME ,
388 MERCHANT_REFERENCE ,
389 MERCHANT_TAX_REG_NUMBER,
390 MERCHANT_TAXPAYER_ID ,
391 COUNTRY_OF_SUPPLY,
392 CREDIT_CARD_TRX_ID ,
393 COMPANY_PREPAID_INVOICE_ID,
394 CC_REVERSAL_FLAG ,
395 CREATION_DATE ,
396 CREATED_BY,
397 LAST_UPDATED_BY ,
398 LAST_UPDATE_DATE ,
399 LAST_UPDATE_LOGIN ,
400 PROGRAM_APPLICATION_ID ,
401 PROGRAM_ID ,
402 PROGRAM_UPDATE_DATE,
403 REQUEST_ID ,
404 ATTRIBUTE_CATEGORY,
405 ATTRIBUTE1,
406 ATTRIBUTE2 ,
407 ATTRIBUTE3 ,
408 ATTRIBUTE4 ,
409 ATTRIBUTE5 ,
410 ATTRIBUTE6 ,
411 ATTRIBUTE7 ,
412 ATTRIBUTE8,
413 ATTRIBUTE9 ,
414 ATTRIBUTE10,
415 ATTRIBUTE11,
416 ATTRIBUTE12,
417 ATTRIBUTE13 ,
418 ATTRIBUTE14,
419 ATTRIBUTE15,
420 GLOBAL_ATTRIBUTE_CATEGORY,
421 GLOBAL_ATTRIBUTE1,
422 GLOBAL_ATTRIBUTE2,
423 GLOBAL_ATTRIBUTE3,
424 GLOBAL_ATTRIBUTE4 ,
425 GLOBAL_ATTRIBUTE5 ,
426 GLOBAL_ATTRIBUTE6 ,
427 GLOBAL_ATTRIBUTE7 ,
428 GLOBAL_ATTRIBUTE8 ,
429 GLOBAL_ATTRIBUTE9 ,
430 GLOBAL_ATTRIBUTE10,
431 GLOBAL_ATTRIBUTE11,
432 GLOBAL_ATTRIBUTE12 ,
433 GLOBAL_ATTRIBUTE13 ,
434 GLOBAL_ATTRIBUTE14 ,
435 GLOBAL_ATTRIBUTE15 ,
436 GLOBAL_ATTRIBUTE16 ,
437 GLOBAL_ATTRIBUTE17 ,
438 GLOBAL_ATTRIBUTE18 ,
439 GLOBAL_ATTRIBUTE19 ,
440 GLOBAL_ATTRIBUTE20 ,
441 INCLUDED_TAX_AMOUNT,
442 PRIMARY_INTENDED_USE,
443 APPLICATION_ID,
444 PRODUCT_TABLE,
445 REFERENCE_KEY1,
446 REFERENCE_KEY2,
447 REFERENCE_KEY3,
448 REFERENCE_KEY4,
449 REFERENCE_KEY5,
450 SHIP_TO_LOCATION_ID,
451 PAY_AWT_GROUP_ID --bug 7022001
452 FROM ap_invoice_lines_all
453 WHERE invoice_id = c_invoice_id
454 ORDER BY decode(line_type_lookup_code,'ITEM',1,2), line_number;
455
456 --Bug 8346277
457 CURSOR invoice_line_mawt_cur(c_invoice_id NUMBER)
458 IS
459 SELECT INVOICE_ID
460 , LINE_NUMBER
461 , LINE_TYPE_LOOKUP_CODE
462 , REQUESTER_ID
463 , DESCRIPTION
464 , LINE_SOURCE
465 , ORG_ID
466 , LINE_GROUP_NUMBER
467 , INVENTORY_ITEM_ID
468 , ITEM_DESCRIPTION
469 , SERIAL_NUMBER
470 , MANUFACTURER
471 , MODEL_NUMBER
472 , WARRANTY_NUMBER
473 , GENERATE_DISTS
474 , MATCH_TYPE
475 , DISTRIBUTION_SET_ID
476 , ACCOUNT_SEGMENT
477 , BALANCING_SEGMENT
478 , COST_CENTER_SEGMENT
479 , OVERLAY_DIST_CODE_CONCAT
480 , DEFAULT_DIST_CCID
481 , PRORATE_ACROSS_ALL_ITEMS
482 , ACCOUNTING_DATE
483 , PERIOD_NAME
484 , DEFERRED_ACCTG_FLAG
485 , DEF_ACCTG_START_DATE
486 , DEF_ACCTG_END_DATE
487 , DEF_ACCTG_NUMBER_OF_PERIODS
488 , DEF_ACCTG_PERIOD_TYPE
489 , SET_OF_BOOKS_ID
490 , AMOUNT
491 , BASE_AMOUNT
492 , ROUNDING_AMT
493 , QUANTITY_INVOICED
494 , UNIT_MEAS_LOOKUP_CODE
495 , UNIT_PRICE
496 , WFAPPROVAL_STATUS
497 , DISCARDED_FLAG
498 , ORIGINAL_AMOUNT
499 , ORIGINAL_BASE_AMOUNT
500 , ORIGINAL_ROUNDING_AMT
501 , CANCELLED_FLAG
502 , INCOME_TAX_REGION
503 , TYPE_1099
504 , STAT_AMOUNT
505 , PREPAY_INVOICE_ID
506 , PREPAY_LINE_NUMBER
507 , INVOICE_INCLUDES_PREPAY_FLAG
508 , CORRECTED_INV_ID
509 , CORRECTED_LINE_NUMBER
510 , PO_HEADER_ID
511 , PO_LINE_ID
512 , PO_RELEASE_ID
513 , PO_LINE_LOCATION_ID
514 , PO_DISTRIBUTION_ID
515 , RCV_TRANSACTION_ID
516 , FINAL_MATCH_FLAG
517 , ASSETS_TRACKING_FLAG
518 , ASSET_BOOK_TYPE_CODE
519 , ASSET_CATEGORY_ID
520 , PROJECT_ID
521 , TASK_ID
522 , EXPENDITURE_TYPE
523 , EXPENDITURE_ITEM_DATE
524 , EXPENDITURE_ORGANIZATION_ID
525 , PA_QUANTITY
526 , PA_CC_AR_INVOICE_ID
527 , PA_CC_AR_INVOICE_LINE_NUM
528 , PA_CC_PROCESSED_CODE
529 , AWARD_ID
530 , AWT_GROUP_ID
531 , REFERENCE_1
532 , REFERENCE_2
533 , RECEIPT_VERIFIED_FLAG
534 , RECEIPT_REQUIRED_FLAG
535 , RECEIPT_MISSING_FLAG
536 , JUSTIFICATION
537 , EXPENSE_GROUP
538 , START_EXPENSE_DATE
539 , END_EXPENSE_DATE
540 , RECEIPT_CURRENCY_CODE
541 , RECEIPT_CONVERSION_RATE
542 , RECEIPT_CURRENCY_AMOUNT
543 , DAILY_AMOUNT
544 , WEB_PARAMETER_ID
545 , ADJUSTMENT_REASON
546 , MERCHANT_DOCUMENT_NUMBER
547 , MERCHANT_NAME
548 , MERCHANT_REFERENCE
549 , MERCHANT_TAX_REG_NUMBER
550 , MERCHANT_TAXPAYER_ID
551 , COUNTRY_OF_SUPPLY
552 , CREDIT_CARD_TRX_ID
553 , COMPANY_PREPAID_INVOICE_ID
554 , CC_REVERSAL_FLAG
555 , CREATION_DATE
556 , CREATED_BY
557 , LAST_UPDATED_BY
558 , LAST_UPDATE_DATE
559 , LAST_UPDATE_LOGIN
560 , PROGRAM_APPLICATION_ID
561 , PROGRAM_ID
562 , PROGRAM_UPDATE_DATE
563 , REQUEST_ID
564 , ATTRIBUTE_CATEGORY
565 , ATTRIBUTE1
566 , ATTRIBUTE2
567 , ATTRIBUTE3
568 , ATTRIBUTE4
569 , ATTRIBUTE5
570 , ATTRIBUTE6
571 , ATTRIBUTE7
572 , ATTRIBUTE8
573 , ATTRIBUTE9
574 , ATTRIBUTE10
575 , ATTRIBUTE11
576 , ATTRIBUTE12
577 , ATTRIBUTE13
578 , ATTRIBUTE14
579 , ATTRIBUTE15
580 , GLOBAL_ATTRIBUTE_CATEGORY
581 , GLOBAL_ATTRIBUTE1
582 , GLOBAL_ATTRIBUTE2
583 , GLOBAL_ATTRIBUTE3
584 , GLOBAL_ATTRIBUTE4
585 , GLOBAL_ATTRIBUTE5
586 , GLOBAL_ATTRIBUTE6
587 , GLOBAL_ATTRIBUTE7
588 , GLOBAL_ATTRIBUTE8
589 , GLOBAL_ATTRIBUTE9
590 , GLOBAL_ATTRIBUTE10
591 , GLOBAL_ATTRIBUTE11
592 , GLOBAL_ATTRIBUTE12
593 , GLOBAL_ATTRIBUTE13
594 , GLOBAL_ATTRIBUTE14
595 , GLOBAL_ATTRIBUTE15
596 , GLOBAL_ATTRIBUTE16
597 , GLOBAL_ATTRIBUTE17
598 , GLOBAL_ATTRIBUTE18
599 , GLOBAL_ATTRIBUTE19
600 , GLOBAL_ATTRIBUTE20
601 , INCLUDED_TAX_AMOUNT
602 , PRIMARY_INTENDED_USE
603 , APPLICATION_ID
604 , PRODUCT_TABLE
605 , REFERENCE_KEY1
606 , REFERENCE_KEY2
607 , REFERENCE_KEY3
608 , REFERENCE_KEY4
609 , REFERENCE_KEY5
610 , SHIP_TO_LOCATION_ID
611 , PAY_AWT_GROUP_ID
612 FROM ap_invoice_lines_all
613 WHERE invoice_id = c_invoice_id
614 AND line_type_lookup_code = 'AWT'
615 AND line_source = 'MANUAL LINE ENTRY'
616 ORDER BY line_number;
617
618
619 PROCEDURE initialize_invoice_holds(
620 p_invoice_id IN NUMBER,
621 p_calling_sequence IN VARCHAR2);
622
623 TYPE holds_rec_type IS RECORD (
624 hold_lookup_code ap_holds_all.hold_lookup_code%type,
625 hold_status varchar2(30),
626 invoice_id ap_holds_all.invoice_id%type,
627 hold_reason ap_holds_all.hold_reason%type,
628 release_lookup_code ap_holds_all.release_lookup_code%type,
629 line_location_id ap_holds_all.line_location_id%type,
630 rcv_transaction_id ap_holds_all.rcv_transaction_id%type,
631 last_updated_by ap_holds_all.last_updated_by%type,
632 responsibility_id ap_holds_all.responsibility_id%type);
633
634 TYPE holds_tab_type IS TABLE OF holds_rec_type INDEX BY BINARY_INTEGER;
635
636 g_holds_tab holds_tab_type;
637
638 Procedure Count_Org_Hold(
639 p_org_id IN NUMBER,
640 p_hold_lookup_code IN VARCHAR2,
641 p_place_or_release IN VARCHAR2,
642 p_calling_sequence IN VARCHAR2);
643
644
645 /*============================================================================
646 | Procedure Definitions
647 *===========================================================================*/
648
649 /*=============================================================================
650 | PUBLIC PROCEDURE APPROVE
651 |
652 | Description
653 | Online Approval and later batch approval
654 |
655 | PARAMETERS
656 | p_run_option Run Option to indicate whether to approve
657 | only invoices with unapproved distributions
658 | or all invoices ('New' or 'All)
659 | p_invoice_batch_id Invoice Batch Id (For Batch Approval)
660 | p_begin_invoice_date Begin Invoice Date (Selection criteria)
661 | p_end_invoice_date End of Invoice Date (Selection criteria)
662 | p_pay_group Pay Group(Select criteria for Batch Approval)
663 | p_invoice_id Invoice_id
664 | p_entered_by Entered_by User id
665 | p_set_of_books_id Set of books id
666 | (Selection criteria for Batch Approval)
667 | p_trace_option
668 | p_conc_flag Indicate whether the approval process is a
669 | concurrent process or not or if it is online
670 | p_holds_count Return Hold Count of invoice (For Online
671 | Approval called by invoice workbench)
672 | p_approval_status Return Approval Status of invoice
673 | (For Online Approval called by form)
674 | p_calling_sequence Debugging string to indicate path of module
675 | calls to be printed out upon error.
676 | p_debug_switch Debug switch to be turned on or off
677 |
678 | PROGRAM FLOW
679 |
680 | Retrieve system variables to be used by Approval Program
681 | For each invoice
682 | IF invoice needs approving (i.e. not the case where run_option is 'New'
683 | and the invoice doesn't have any unapproved distributions)
684 | IF Accrual Basis is being used
685 | IF automatic offsets is enabled
686 | Populate Invoice Dist liability account
687 | Calculate Tax (Etax API) which will determine the tax amt and
688 | whether it is inclusive or exclusive...
689 | Check Line Variance
690 | Calculate Base Amount and round at Line level
691 | Call Etax api to 'Calculate Tax', which might return exclusive tax lines
692 | and/or inclusive tax amount.
693 | Open a Lines Cursor - loop for each Line
694 | If inclusive tax is returned by tax calculation api, then create taxable
695 | distributions for (line_amount - inclusive tax amount).
696 | If Line need to generate distributions
697 | check sufficient line data
698 | Generate distributions
699 | end if
700 | Update Invoice Distributions as selected for approval
701 | Execute Distribution variance check
702 | IPV/ERV creation and valid ERV ccid check
703 | Close Line Cursor if no more line to check
704 | Call Etax api 'Determine Recovery' to create Tax Distributions for the invoice.
705 | Open a Lines Cursor - loop for each Line
706 | Base amount calculation and rounding at Distribution Level for line
707 | Close Line Cursor if no more line to check
708 | Execute General Invoice Checks
709 | Get invoice matched status
710 | IF invoice is matched
711 | Execute Quantity Variance Check
712 | Execute Matched Checks
713 | Execute PO Final Close Check
714 | Validate Invoice for Tax (etax api), which will validate
715 | the document for tax information.
716 | IF invoice is not a matched prepayment
717 | Execute Funds Control (Funds Reservation)
718 | Execute Withholding Tax
719 | Update Invoice Dists to Appropriate Approval Status
720 | End Loop
721 | Accounting Event Generation
722 | IF Recalculate Payment Schedule Option is enabled
723 | Execute Due Date Sweeper
724 | If online approval then
725 | Calculate Invoice Hold Count and Release Count
726 | Print out appropriate Return Message
727 | End If
728 |
729 | KNOWN ISSUES:
730 | p_begin_invoice_date,
731 | p_end_invoice_date,
732 | p_pay_group,
733 | p_entered_by,
734 | p_set_of_books_id,
735 | p_trace_option
736 | are not needed here in this
737 | procedure. The logic of selecting all invoices included in a batch
738 | is in Invoice Validation Report. Code clean up should be done when
739 | invoice work bench form is being modified. Now is modified to have
740 | default value so that these two parameters can be omitted.
741 *============================================================================*/
742
743 PROCEDURE Approve(
744 p_run_option IN VARCHAR2,
745 p_invoice_batch_id IN NUMBER,
746 p_begin_invoice_date IN DATE DEFAULT NULL,
747 p_end_invoice_date IN DATE DEFAULT NULL,
748 p_vendor_id IN NUMBER,
749 p_pay_group IN VARCHAR2,
750 p_invoice_id IN NUMBER,
751 p_entered_by IN NUMBER,
752 p_set_of_books_id IN NUMBER,
753 p_trace_option IN VARCHAR2,
754 p_conc_flag IN VARCHAR2,
755 p_holds_count IN OUT NOCOPY NUMBER,
756 p_approval_status IN OUT NOCOPY VARCHAR2,
757 p_funds_return_code OUT NOCOPY VARCHAR2,
758 p_calling_mode IN VARCHAR2 DEFAULT 'APPROVE',
759 p_calling_sequence IN VARCHAR2,
760 p_debug_switch IN VARCHAR2 DEFAULT 'N',
761 p_budget_control IN VARCHAR2 DEFAULT 'Y',
762 p_commit IN VARCHAR2 DEFAULT 'Y') IS
763
764 CURSOR approve_invoice_cur IS
765 SELECT AI.invoice_id,
766 AI.invoice_num,
767 AI.invoice_amount,
768 AI.base_amount,
769 AI.exchange_rate,
770 AI.invoice_currency_code,
771 PVS.invoice_amount_limit,
772 nvl(PVS.hold_future_payments_flag,'N'),
773 AI.invoice_type_lookup_code,
774 AI.exchange_date,
775 AI.exchange_rate_type,
776 AI.vendor_id,
777 AI.invoice_date,
778 AI.org_id,
779 nvl(AI.disc_is_inv_less_tax_flag,'N'),
780 nvl(AI.exclude_freight_from_discount,'N'),
781 nvl(AI.net_of_retainage_flag,'N'), --9356460
782 nvl(pvs.tolerance_id,ASP.tolerance_id), --added nvl for bug 8425996
783 nvl(pvs.services_tolerance_id,ASP.services_tolerance_id) --added nvl for bug 8425996
784 FROM ap_invoices_all AI,
785 ap_suppliers PV,
786 ap_supplier_sites_all PVS,
787 ap_system_parameters_all ASP --added table for bug 8425996
788 WHERE AI.invoice_id = p_invoice_id
789 AND AI.vendor_id = PV.vendor_id
790 AND AI.vendor_site_id = PVS.vendor_site_id
791 AND ASP.org_id = AI.org_id;
792
793
794 -- Payment Requests: Cursor for payment request type of invoices
795 CURSOR approve_pay_request_cur IS
796 SELECT AI.invoice_id,
797 AI.invoice_num,
798 AI.invoice_amount,
799 AI.base_amount,
800 AI.exchange_rate,
801 AI.invoice_currency_code,
802 NULL, -- invoice_amount_limit,
803 'N', -- hold_future_payments_flag
804 AI.invoice_type_lookup_code,
805 AI.exchange_date,
806 AI.exchange_rate_type,
807 AI.vendor_id,
808 AI.invoice_date,
809 AI.org_id,
810 nvl(AI.disc_is_inv_less_tax_flag,'N'),
811 nvl(AI.exclude_freight_from_discount,'N'),
812 nvl(AI.net_of_retainage_flag,'N') --9356460
813 FROM ap_invoices_all AI
814 WHERE AI.invoice_id = p_invoice_id;
815
816 CURSOR invoice_type_cur IS
817 SELECT invoice_type_lookup_code
818 FROM ap_invoices_all
819 WHERE invoice_id = p_invoice_id;
820
821 l_unfreeze_count NUMBER:= 0; --Bug9021265
822 TAX_UNFREEZE_EXCEPTION EXCEPTION; --Bug9021265
823
824 l_chart_of_accounts_id NUMBER;
825 l_recalc_pay_schedule_flag VARCHAR2(1);
826 l_gl_date_from_receipt VARCHAR2(1);
827 l_cash_only BOOLEAN;
828 l_system_user NUMBER;
829
830 -- Tolerance Related Variables
831 l_goods_ship_amt_tolerance NUMBER;
832 l_goods_rate_amt_tolerance NUMBER;
833 l_goods_total_amt_tolerance NUMBER;
834 l_services_ship_amt_tolerance NUMBER;
835 l_services_rate_amt_tolerance NUMBER;
836 l_services_total_amt_tolerance NUMBER;
837 l_price_tol NUMBER;
838 l_qty_tol NUMBER;
839 l_qty_rec_tol NUMBER;
840 l_amt_tol NUMBER;
841 l_amt_rec_tol NUMBER;
842 l_max_qty_ord_tol NUMBER;
843 l_max_qty_rec_tol NUMBER;
844 l_max_amt_ord_tol NUMBER;
845 l_max_amt_rec_tol NUMBER;
846
847 l_flex_method VARCHAR2(25);
848 l_sys_xrate_gain_ccid NUMBER;
849 l_sys_xrate_loss_ccid NUMBER;
850 l_base_currency_code VARCHAR2(15);
851 l_inv_enc_type_id NUMBER;
852 l_purch_enc_type_id NUMBER;
853 l_user_id NUMBER;
854 l_invoice_id NUMBER;
855 l_invoice_num VARCHAR2(50);
856 l_holds HOLDSARRAY;
857 l_hold_count COUNTARRAY;
858 l_release_count COUNTARRAY;
859 l_total_hold_count NUMBER;
860 l_total_release_count NUMBER;
861 l_set_of_books_id NUMBER;
862 l_matched BOOLEAN;
863 l_receipt_acc_days NUMBER;
864 l_return_message_name VARCHAR2(100);
865 l_any_records_flag VARCHAR2(1) := 'N';
866 l_set_tokens VARCHAR2(1) := 'N';
867 num BINARY_INTEGER := 1;
868
869 l_debug_loc VARCHAR2(30) := 'Approval';
870 l_curr_calling_sequence VARCHAR2(2000);
871 l_debug_info VARCHAR2(2000);
872
873 l_exchange_rate AP_INVOICES.exchange_rate%TYPE;
874 l_exchange_rate_type AP_INVOICES.exchange_rate_type%TYPE;
875 l_exchange_date AP_INVOICES.exchange_date%TYPE;
876 l_invoice_amount AP_INVOICES.invoice_amount%TYPE;
877 l_invoice_base_amount AP_INVOICES.base_amount%TYPE;
878 l_vendor_id AP_INVOICES.vendor_id%TYPE;
879 l_invoice_date AP_INVOICES.invoice_date%TYPE;
880 l_invoice_currency_code AP_INVOICES.invoice_currency_code%TYPE;
881 l_invoice_type AP_INVOICES.invoice_type_lookup_code%TYPE;
882
883 t_inv_lines_table AP_INVOICES_PKG.t_invoice_lines_table;
884
885 l_insufficient_data_exist BOOLEAN := FALSE;
886 l_line_variance_hold_exist BOOLEAN := FALSE;
887 l_need_to_round_flag VARCHAR2(1) := 'Y';
888 l_distribution_variance_exist BOOLEAN;
889 l_result BOOLEAN;
890 l_org_id NUMBER;
891
892 /* Introduced to handle Consumption Tax */
893 l_invoice_amount_limit NUMBER;
894 l_hold_future_payments_flag VARCHAR2(1);
895 l_diff_flag VARCHAR2(1);
896 l_success BOOLEAN;
897 l_error_code VARCHAR2(4000);
898
899 Tax_Exception EXCEPTION;
900 Global_Exception EXCEPTION;
901 LCM_Exception EXCEPTION; --Bug 7718385
902 --Retropricing
903 l_invoice_type_lookup_code AP_INVOICES_ALL.invoice_type_lookup_code%TYPE;
904
905 l_invoice_type_pr AP_INVOICES_ALL.invoice_type_lookup_code%TYPE;
906 l_exclude_tax_from_discount VARCHAR2(1);
907 l_exclude_freight_from_disc VARCHAR2(1);
908 l_net_of_retainage_flag VARCHAR2(1); --9356460
909 l_cur_count NUMBER := 0;
910 l_prorate_across_all_items VARCHAR2(1);
911 l_debug_context VARCHAR2(2000);
912
913 l_prepay_dist_count NUMBER;
914 l_retained_amount NUMBER;
915 l_recouped_amount NUMBER;
916 l_tolerance_id NUMBER;
917 l_service_tolerance_id NUMBER;
918
919 l_invoice_rec AP_APPROVAL_PKG.Invoice_Rec;
920
921 l_api_name CONSTANT VARCHAR2(200) := 'Approve';
922
923 -- Bug 6648094
924 l_dist_total NUMBER;
925 l_base_dist_total NUMBER;
926 l_inv_amount NUMBER;
927 l_inv_base_amount NUMBER;
928 l_item_count NUMBER;
929 l_row_count NUMBER:=0;
930 -- Bug 6648094
931 l_invoice_line_count NUMBER :=0; --Bug 6684139
932 l_encumbrance_exists NUMBER := 0; -- Bug 6681580
933
934 l_inv_header_rec ap_invoices_all%rowtype;
935 l_event_class_code zx_trx_headers_gt.event_class_code%TYPE;
936
937 -- Project LCM 7588322
938 l_lcm_return_status VARCHAR2(30) := FND_API.G_RET_STS_SUCCESS;
939 l_lcm_msg_count NUMBER;
940 l_lcm_msg_data VARCHAR2(2000);
941 l_lcm_used VARCHAR2(1) := 'N';
942 l_unpostable_holds_exist VARCHAR2(1) := 'N';
943 l_manual_awt_exist number :=0; --Bug 8346277
944 l_zx_lines_det_fac_count NUMBER := 0; -- Bug16390854
945
946 BEGIN
947
948 l_curr_calling_sequence := 'AP_APPROVAL_PKG.'||l_debug_loc||'<-'||p_calling_sequence;
949
950 IF (p_debug_switch = 'Y') THEN
951 g_debug_mode := 'Y';
952 END IF;
953
954 -- Print_Debug (l_api_name, 'AP_APPROVAL_PKG.APPROVE.BEGIN');
955 IF g_debug_mode = 'Y' THEN
956 AP_Debug_Pkg.Print(g_debug_mode, 'AP_APPROVAL_PKG.APPROVE.BEGIN' );
957 END IF;
958
959 IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
960 FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME||l_api_name,'AP_APPROVAL_PKG.APPROVE.BEGIN');
961 END IF;
962
963
964 ----------------------------------------------------------------
965 l_debug_info := 'Approving INVOICE_ID: '|| p_invoice_id;
966 -- Print_Debug (l_api_name, l_debug_info);
967 IF g_debug_mode = 'Y' THEN
968 AP_Debug_Pkg.Print(g_debug_mode, l_debug_info );
969 END IF;
970
971 IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
972 FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME||l_api_name,l_debug_info);
973 END IF;
974 ----------------------------------------------------------------
975
976 IF nvl(p_conc_flag,'N') <> 'Y' THEN
977 g_org_holds.delete;
978 END IF;
979
980 IF p_calling_mode = 'CANCEL' THEN
981 ----------------------------------------------------------------
982 l_debug_info := 'Open Invoice_Type_Cur';
983 -- Print_Debug(l_api_name, l_debug_info);
984 IF g_debug_mode = 'Y' THEN
985 AP_Debug_Pkg.Print(g_debug_mode, l_debug_info );
986 END IF;
987
988 IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
989 FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME||l_api_name,l_debug_info);
990 END IF;
991 ----------------------------------------------------------------
992 OPEN Invoice_Type_Cur;
993 FETCH Invoice_Type_Cur
994 INTO l_invoice_type_pr;
995 CLOSE Invoice_Type_Cur;
996 END IF;
997
998
999 IF (p_calling_mode = 'PAYMENT REQUEST') OR
1000 (p_calling_mode = 'CANCEL' and l_invoice_type_pr = 'PAYMENT REQUEST') THEN
1001
1002 ----------------------------------------------------------------
1003 l_debug_info := 'Open Approve_Pay_Request_Cur';
1004 -- Print_Debug(l_api_name, l_debug_info);
1005 IF g_debug_mode = 'Y' THEN
1006 AP_Debug_Pkg.Print(g_debug_mode, l_debug_info );
1007 END IF;
1008
1009 IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
1010 FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME||l_api_name,l_debug_info);
1011 END IF;
1012 ----------------------------------------------------------------
1013 OPEN Approve_Pay_Request_Cur;
1014 FETCH Approve_Pay_Request_Cur
1015 INTO l_invoice_id,
1016 l_invoice_num,
1017 l_invoice_amount,
1018 l_invoice_base_amount,
1019 l_exchange_rate,
1020 l_invoice_currency_code,
1021 l_invoice_amount_limit,
1022 l_hold_future_payments_flag,
1023 l_invoice_type,
1024 l_exchange_date,
1025 l_exchange_rate_type,
1026 l_vendor_id,
1027 l_invoice_date,
1028 g_org_id,
1029 l_exclude_tax_from_discount,
1030 l_exclude_freight_from_disc,
1031 l_net_of_retainage_flag; --9356460
1032
1033 ELSE
1034 ----------------------------------------------------------------
1035 l_debug_info := 'Open Approve_Invoice_Cur';
1036 -- Print_Debug(l_api_name, l_debug_info);
1037 IF g_debug_mode = 'Y' THEN
1038 AP_Debug_Pkg.Print(g_debug_mode, l_debug_info );
1039 END IF;
1040
1041 IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
1042 FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME||l_api_name,l_debug_info);
1043 END IF;
1044 ----------------------------------------------------------------
1045 OPEN Approve_Invoice_Cur;
1046 FETCH Approve_Invoice_Cur
1047 INTO l_invoice_id,
1048 l_invoice_num,
1049 l_invoice_amount,
1050 l_invoice_base_amount,
1051 l_exchange_rate,
1052 l_invoice_currency_code,
1053 l_invoice_amount_limit,
1054 l_hold_future_payments_flag,
1055 l_invoice_type,
1056 l_exchange_date,
1057 l_exchange_rate_type,
1058 l_vendor_id,
1059 l_invoice_date,
1060 g_org_id,
1061 l_exclude_tax_from_discount,
1062 l_exclude_freight_from_disc,
1063 l_net_of_retainage_flag, --9356460
1064 l_tolerance_id,
1065 l_service_tolerance_id;
1066
1067 IF nvl(p_conc_flag,'N') <> 'Y' THEN
1068 ----------------------------------------------------------------
1069 l_debug_info := 'Cache Tolerance Templates';
1070 -- Print_Debug(l_api_name, l_debug_info);
1071 IF g_debug_mode = 'Y' THEN
1072 AP_Debug_Pkg.Print(g_debug_mode, l_debug_info );
1073 END IF;
1074
1075 IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
1076 FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME||l_api_name,l_debug_info);
1077 END IF;
1078 ----------------------------------------------------------------
1079 Cache_Tolerance_Templates(
1080 l_tolerance_id,
1081 l_service_tolerance_id,
1082 l_curr_calling_sequence);
1083
1084 END IF;
1085
1086 END IF;
1087
1088 ----------------------------------------------------------------
1089 l_debug_info := 'Retrieve System Options';
1090 -- Print_Debug(l_api_name, l_debug_info);
1091 IF g_debug_mode = 'Y' THEN
1092 AP_Debug_Pkg.Print(g_debug_mode, l_debug_info );
1093 END IF;
1094
1095 IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
1096 FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME||l_api_name,l_debug_info);
1097 END IF;
1098 ----------------------------------------------------------------
1099 Approval_Init(
1100 g_org_id,
1101 l_invoice_id,
1102 l_invoice_type,
1103 l_tolerance_id,
1104 l_service_tolerance_id,
1105 p_conc_flag,
1106 l_set_of_books_id,
1107 l_recalc_pay_schedule_flag,
1108 l_sys_xrate_gain_ccid,
1109 l_sys_xrate_loss_ccid,
1110 l_base_currency_code,
1111 l_inv_enc_type_id,
1112 l_purch_enc_type_id,
1113 l_gl_date_from_receipt,
1114 l_receipt_acc_days,
1115 l_system_user,
1116 l_user_id,
1117 l_goods_ship_amt_tolerance,
1118 l_goods_rate_amt_tolerance,
1119 l_goods_total_amt_tolerance,
1120 l_services_ship_amt_tolerance,
1121 l_services_rate_amt_tolerance,
1122 l_services_total_amt_tolerance,
1123 l_price_tol,
1124 l_qty_tol,
1125 l_qty_rec_tol,
1126 l_amt_tol,
1127 l_amt_rec_tol,
1128 l_max_qty_ord_tol,
1129 l_max_qty_rec_tol,
1130 l_max_amt_ord_tol,
1131 l_max_amt_rec_tol,
1132 l_invoice_line_count, --Bug 6684139
1133 l_curr_calling_sequence);
1134
1135 ----------------------------------------------------------------
1136 l_debug_info := 'Initialize Invoice Holds Array';
1137 -- Print_Debug(l_api_name, l_debug_info);
1138 IF g_debug_mode = 'Y' THEN
1139 AP_Debug_Pkg.Print(g_debug_mode, l_debug_info );
1140 END IF;
1141
1142 IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
1143 FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME||l_api_name,l_debug_info);
1144 END IF;
1145 ----------------------------------------------------------------
1146 Initialize_Invoice_Holds(
1147 p_invoice_id => p_invoice_id,
1148 p_calling_sequence => l_curr_calling_sequence);
1149
1150
1151 IF (p_calling_mode = 'PAYMENT REQUEST') OR
1152 (p_calling_mode = 'CANCEL' and l_invoice_type_pr = 'PAYMENT REQUEST') THEN
1153 l_cur_count := Approve_Pay_Request_Cur%ROWCOUNT;
1154 ELSE
1155 l_cur_count := Approve_Invoice_Cur%ROWCOUNT;
1156 END IF;
1157
1158 IF (l_cur_count <> 0 ) THEN
1159
1160 l_any_records_flag := 'Y';
1161
1162 -----------------------------------------------------------------------
1163 l_debug_info := 'Check run option, to determine whether ok to approve';
1164 -- Print_Debug(l_api_name, l_debug_info);
1165 IF g_debug_mode = 'Y' THEN
1166 AP_Debug_Pkg.Print(g_debug_mode, l_debug_info );
1167 END IF;
1168
1169 IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
1170 FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME||l_api_name,l_debug_info);
1171 END IF;
1172 -----------------------------------------------------------------------
1173
1174 IF Inv_Needs_Approving(
1175 p_invoice_id,
1176 p_run_option,
1177 l_curr_calling_sequence) THEN
1178
1179 l_matched := Get_Inv_Matched_Status(
1180 l_invoice_id,
1181 l_curr_calling_sequence);
1182
1183 IF (p_calling_mode = 'APPROVE'
1184 and nvl(p_conc_flag,'N') <> 'Y'
1185 and l_invoice_line_count >0 ) THEN --Bug 6684139
1186
1187 ----------------------------------------------------------------
1188 l_debug_info := 'Calculate Tax on the Invoice';
1189 -- Print_Debug(l_api_name, l_debug_info);
1190 IF g_debug_mode = 'Y' THEN
1191 AP_Debug_Pkg.Print(g_debug_mode, l_debug_info );
1192 END IF;
1193
1194 IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
1195 FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME||l_api_name,l_debug_info);
1196 END IF;
1197 ----------------------------------------------------------------
1198 l_success := ap_etax_pkg.calling_etax(
1199 p_invoice_id => l_invoice_id,
1200 p_calling_mode => 'CALCULATE',
1201 p_all_error_messages => 'N',
1202 p_error_code => l_error_code,
1203 p_calling_sequence => l_curr_calling_sequence);
1204
1205 IF (NOT l_success) THEN
1206 RAISE Tax_Exception;
1207 END IF;
1208 END IF;
1209
1210 ----------------------------------------------------------------
1211 l_debug_info := 'Fetch Invoice Lines';
1212 -- Print_Debug(l_api_name, l_debug_info);
1213 IF g_debug_mode = 'Y' THEN
1214 AP_Debug_Pkg.Print(g_debug_mode, l_debug_info );
1215 END IF;
1216
1217 IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
1218 FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME||l_api_name,l_debug_info);
1219 END IF;
1220 ----------------------------------------------------------------
1221 OPEN Invoice_Line_Cur(p_invoice_id);
1222 FETCH Invoice_Line_Cur
1223 BULK COLLECT INTO t_inv_lines_table;
1224 CLOSE Invoice_Line_Cur;
1225
1226 IF nvl(p_conc_flag, 'N') <> 'Y' THEN
1227
1228 l_invoice_rec.invoice_id := l_invoice_id;
1229 l_invoice_rec.invoice_date := l_invoice_date;
1230 l_invoice_rec.invoice_currency_code := l_invoice_currency_code;
1231 l_invoice_rec.exchange_rate := l_exchange_rate;
1232 l_invoice_rec.exchange_rate_type := l_exchange_rate_type;
1233 l_invoice_rec.exchange_date := l_exchange_date;
1234 l_invoice_rec.vendor_id := l_vendor_id;
1235 l_invoice_rec.org_id := l_org_id;
1236
1237 ----------------------------------------------------------------
1238 l_debug_info := 'Generate Distributions. Variance Checks';
1239 -- Print_Debug(l_api_name, l_debug_info);
1240 IF g_debug_mode = 'Y' THEN
1241 AP_Debug_Pkg.Print(g_debug_mode, l_debug_info );
1242 END IF;
1243
1244 IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
1245 FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME||l_api_name,l_debug_info);
1246 END IF;
1247 ----------------------------------------------------------------
1248
1249 --bugfix:6684139/6699825
1250 IF (l_invoice_line_count > 0) THEN
1251 AP_APPROVAL_PKG.Generate_Distributions
1252 (p_invoice_rec => l_invoice_rec,
1253 p_base_currency_code => l_base_currency_code,
1254 p_inv_batch_id => p_invoice_batch_id, /*Bug#7036685 : Passed p_invoice_batch_id to
1255 p_inv_batch_id parameter instead of NULL*/
1256 p_run_option => NULL,
1257 p_calling_sequence => l_curr_calling_sequence,
1258 x_error_code => l_error_code,
1259 p_calling_mode => p_calling_mode); /*bug6833543 added p_calling_mode*/
1260 END IF;
1261
1262 IF (p_calling_mode = 'APPROVE' and l_invoice_line_count >0 ) THEN --Bug 6684139
1263
1264 ----------------------------------------------------------------
1265 l_debug_info := 'Generate Tax Distributions';
1266 -- Print_Debug(l_api_name, l_debug_info);
1267 IF g_debug_mode = 'Y' THEN
1268 AP_Debug_Pkg.Print(g_debug_mode, l_debug_info );
1269 END IF;
1270
1271 IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
1272 FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME||l_api_name,l_debug_info);
1273 END IF;
1274 ----------------------------------------------------------------
1275 l_success := ap_etax_pkg.calling_etax(
1276 p_invoice_id => p_invoice_id,
1277 p_calling_mode => 'DISTRIBUTE',
1278 p_all_error_messages => 'N',
1279 p_error_code => l_error_code,
1280 p_calling_sequence => l_curr_calling_sequence);
1281
1282 IF (NOT l_success) THEN
1283 Raise Tax_Exception;
1284 END IF;
1285 END IF;
1286 -- Bug 8346277 start
1287 l_manual_awt_exist:=0;
1288 SELECT COUNT(*)
1289 INTO l_manual_awt_exist
1290 FROM ap_invoice_lines_all ail
1291 WHERE ail.invoice_id = l_invoice_rec.invoice_id
1292 AND ail.line_type_lookup_code = 'AWT'
1293 AND ail.line_source = 'MANUAL LINE ENTRY';
1294
1295 IF (l_manual_awt_exist > 0) THEN
1296 AP_APPROVAL_PKG.Generate_Manual_Awt_Dist
1297 (p_invoice_rec => l_invoice_rec,
1298 p_base_currency_code => l_base_currency_code,
1299 p_inv_batch_id => p_invoice_batch_id,
1300 p_run_option => NULL,
1301 p_calling_sequence => l_curr_calling_sequence,
1302 x_error_code => l_error_code,
1303 p_calling_mode => p_calling_mode);
1304 END IF;
1305 -- Bug 8346277 end
1306 END IF; /* nvl(p_conc_flag, 'N')... */
1307
1308 --GTAS Project Bug#13464635 Begin
1309 AP_APPROVAL_PKG.POPULATE_GDF_FOR_FV
1310 (p_invoice_id => p_invoice_id,
1311 P_curr_calling_sequence => l_curr_calling_sequence);
1312 --End Bug#13464635
1313
1314 IF (nvl(t_inv_lines_table.count,0) <> 0 ) THEN
1315
1316 -- Perf 6759699
1317 -- if p_run_option is not new then we can call this function
1318 -- for a invoice id
1319 IF (nvl(p_run_option,'Yes') <> 'New') THEN
1320 Update_Inv_Dists_To_Selected( l_invoice_id,
1321 null ,
1322 p_run_option,
1323 l_curr_calling_sequence);
1324 ELSE
1325 FOR i IN NVL(t_inv_lines_table.first,0)..NVL(t_inv_lines_table.last,0)
1326 LOOP
1327 ----------------------------------------------------------------
1328 l_debug_info := 'Update Invoice Distributions to SELECTED';
1329 -- Print_Debug(l_api_name, l_debug_info);
1330 IF g_debug_mode = 'Y' THEN
1331 AP_Debug_Pkg.Print(g_debug_mode, l_debug_info );
1332 END IF;
1333
1334 IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
1335 FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME||l_api_name,l_debug_info);
1336 END IF;
1337 ----------------------------------------------------------------
1338 -- Update distributions to SELECTED as new inclusive/exclusive
1339 -- tax distributions could have been created.
1340
1341 Update_Inv_Dists_To_Selected(
1342 l_invoice_id,
1343 t_inv_lines_table(i).line_number,
1344 p_run_option,
1345 l_curr_calling_sequence);
1346 END LOOP; --bug6661773
1347 END IF; --p_run_option
1348
1349 ----------------------------------------------------------------
1350 l_debug_info := 'Check Distribution Variance';
1351 -- Print_Debug(l_api_name, l_debug_info);
1352 IF g_debug_mode = 'Y' THEN
1353 AP_Debug_Pkg.Print(g_debug_mode, l_debug_info );
1354 END IF;
1355
1356 IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
1357 FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME||l_api_name,l_debug_info);
1358 END IF;
1359 ----------------------------------------------------------------
1360
1361 Check_Dist_Variance(
1362 l_invoice_id,
1363 null, --bug6661773
1364 l_system_user,
1365 l_holds,
1366 l_hold_count,
1367 l_release_count,
1368 l_distribution_variance_exist,
1369 l_curr_calling_sequence);
1370 --END LOOP;
1371 END IF;
1372
1373 ----------------------------------------------------------------
1374 l_debug_info := 'Create payment schedule for invoice request';
1375 -- Print_Debug(l_api_name, l_debug_info);
1376 IF g_debug_mode = 'Y' THEN
1377 AP_Debug_Pkg.Print(g_debug_mode, l_debug_info );
1378 END IF;
1379
1380 IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
1381 FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME||l_api_name,l_debug_info);
1382 END IF;
1383 ----------------------------------------------------------------
1384 createPaymentSchedules(l_invoice_id, l_curr_calling_sequence);
1385
1386
1387 FOR i IN nvl(t_inv_lines_table.first,0)..nvl(t_inv_lines_table.last,0) LOOP
1388
1389 IF (t_inv_lines_table.exists(i)) THEN
1390
1391 IF (l_base_currency_code <> l_invoice_currency_code) AND
1392 (t_inv_lines_table(i).match_type <> 'ADJUSTMENT_CORRECTION') AND
1393 (p_calling_mode <> 'CANCEL') THEN -- Bug 9178329.
1394
1395 ----------------------------------------------------------------
1396 l_debug_info := 'Distributions: Calculate Base Amount and Round';
1397 -- Print_Debug(l_api_name, l_debug_info);
1398 IF g_debug_mode = 'Y' THEN
1399 AP_Debug_Pkg.Print(g_debug_mode, l_debug_info );
1400 END IF;
1401
1402 IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
1403 FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME||l_api_name,l_debug_info);
1404 END IF;
1405 ----------------------------------------------------------------
1406
1407 IF ( l_line_variance_hold_exist = TRUE OR
1408 l_distribution_variance_exist = TRUE ) THEN
1409 l_need_to_round_flag := 'N';
1410 END IF;
1411
1412 IF (t_inv_lines_table(i).line_type_lookup_code <> 'TAX') THEN -- bug 9582952
1413 Dist_Base_Amount_Calculation(
1414 p_invoice_id => l_invoice_id,
1415 p_invoice_line_number => t_inv_lines_table(i).line_number,
1416 p_invoice_currency_code => l_invoice_currency_code,
1417 p_base_currency_code => l_base_currency_code,
1418 p_invoice_exchange_rate => l_exchange_rate,
1419 p_need_to_round_flag => l_need_to_round_flag,
1420 p_calling_sequence => l_curr_calling_sequence );
1421 END IF ;
1422
1423 END IF;
1424
1425 DECLARE
1426 l_awt_success Varchar2(1000);
1427 BEGIN
1428 ----------------------------------------------------------------
1429 l_debug_info := 'Call Extended Withholding Routine';
1430 -- Print_Debug(l_api_name, l_debug_info);
1431 IF g_debug_mode = 'Y' THEN
1432 AP_Debug_Pkg.Print(g_debug_mode, l_debug_info );
1433 END IF;
1434
1435 IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
1436 FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME||l_api_name,l_debug_info);
1437 END IF;
1438 ----------------------------------------------------------------
1439 Ap_Extended_Withholding_Pkg.Ap_Ext_Withholding_Default
1440 (p_invoice_id => p_invoice_id,
1441 p_inv_line_num => t_inv_lines_table(i).line_number,
1442 p_inv_dist_id => NULL,
1443 p_calling_module => l_curr_calling_sequence,
1444 p_parent_dist_id => NULL,
1445 p_awt_success => l_awt_success);
1446
1447 IF (l_awt_success <> 'SUCCESS') THEN
1448 RAISE Global_Exception;
1449 END IF;
1450 END;
1451
1452 END IF; /* t_inv_lines_table.exists ...*/
1453 END LOOP;
1454
1455 t_inv_lines_table.DELETE;
1456
1457 -- Bug 6648094
1458 -- Adjust distribution base amount if dist variance does not exist.
1459 -- Needed only for foreign currency invoices which have an exchange
1460 -- rate and the distribution base amts do not add up to invoice
1461 -- base amt.
1462 ---------------------------------------------------------------
1463 l_debug_info := 'Adjust Dists Base Amount for foreign currency rounding';
1464 -- Print_Debug(l_api_name, l_debug_info);
1465 IF g_debug_mode = 'Y' THEN
1466 AP_Debug_Pkg.Print(g_debug_mode, l_debug_info );
1467 END IF;
1468
1469 IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
1470 FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME||l_api_name,l_debug_info);
1471 END IF;
1472 ---------------------------------------------------------------
1473
1474 IF ( l_line_variance_hold_exist = FALSE AND
1475 l_distribution_variance_exist = FALSE ) THEN
1476
1477 IF (l_base_currency_code <> l_invoice_currency_code) THEN
1478
1479 SELECT SUM(amount)
1480 INTO l_dist_total
1481 FROM ap_invoice_distributions
1482 WHERE invoice_id = l_invoice_id
1483 AND ( (line_type_lookup_code NOT IN ('PREPAY','AWT') AND
1484 prepay_tax_parent_id IS NULL) OR
1485 (line_type_lookup_code = 'PREPAY' AND
1486 nvl(invoice_includes_prepay_flag,'N') = 'Y') OR
1487 (line_type_lookup_code IN ('REC_TAX', 'NONREC_TAX',
1488 'TERV','TIPV','TRV') AND
1489 nvl(invoice_includes_prepay_flag,'N') = 'Y' AND
1490 prepay_tax_parent_id IS NOT NULL)
1491 );
1492 ---------------------------------------------------------------
1493 l_debug_info := 'Sum of Distributions Amounts: '|| l_dist_total;
1494 -- Print_Debug(l_api_name, l_debug_info);
1495 IF g_debug_mode = 'Y' THEN
1496 AP_Debug_Pkg.Print(g_debug_mode, l_debug_info );
1497 END IF;
1498
1499 IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
1500 FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME||l_api_name,l_debug_info);
1501 END IF;
1502 ---------------------------------------------------------------
1503
1504 SELECT invoice_amount, base_amount
1505 INTO l_inv_amount , l_inv_base_amount
1506 FROM ap_invoices
1507 WHERE invoice_id = l_invoice_id;
1508
1509 ---------------------------------------------------------------
1510 l_debug_info := 'Invoice amount: '|| l_inv_amount ||
1511 ' Invoice base amount: '||l_inv_base_amount;
1512 -- Print_Debug(l_api_name, l_debug_info);
1513 IF g_debug_mode = 'Y' THEN
1514 AP_Debug_Pkg.Print(g_debug_mode, l_debug_info );
1515 END IF;
1516
1517 IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
1518 FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME||l_api_name,l_debug_info);
1519 END IF;
1520 ---------------------------------------------------------------
1521
1522 SELECT COUNT('X')
1523 INTO l_item_count
1524 FROM ap_invoice_distributions
1525 WHERE invoice_id = l_invoice_id AND
1526 line_type_lookup_code = 'ITEM';
1527
1528 IF (l_dist_total = l_inv_amount) THEN
1529
1530 SELECT SUM(base_amount)
1531 INTO l_base_dist_total
1532 FROM ap_invoice_distributions
1533 WHERE invoice_id = l_invoice_id
1534 AND (
1535 (line_type_lookup_code NOT IN ('PREPAY','AWT') AND
1536 prepay_tax_parent_id IS NULL) OR
1537 (line_type_lookup_code = 'PREPAY' AND
1538 nvl(invoice_includes_prepay_flag,'N') = 'Y') OR
1539 (line_type_lookup_code IN ('REC_TAX', 'NONREC_TAX',
1540 'TERV','TIPV','TRV') AND
1541 nvl(invoice_includes_prepay_flag,'N') = 'Y' AND
1542 prepay_tax_parent_id IS NOT NULL)
1543 );
1544 ---------------------------------------------------------------
1545 l_debug_info := 'Sum of Distributions Base Amounts: '||
1546 l_base_dist_total;
1547 -- Print_Debug(l_api_name, l_debug_info);
1548 IF g_debug_mode = 'Y' THEN
1549 AP_Debug_Pkg.Print(g_debug_mode, l_debug_info );
1550 END IF;
1551
1552 IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
1553 FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME||l_api_name,l_debug_info);
1554 END IF;
1555 ---------------------------------------------------------------
1556
1557 IF (l_inv_base_amount <> l_base_dist_total) THEN
1558
1559 ---------------------------------------------------------------
1560 l_debug_info := 'Adjust for rounding';
1561 ---------------------------------------------------------------
1562 IF (l_item_count > 0) THEN
1563 --Update ITEM Dists
1564 UPDATE ap_invoice_distributions
1565 SET base_amount = base_amount - (l_base_dist_total - l_inv_base_amount)
1566 WHERE invoice_id = l_invoice_id
1567 AND invoice_distribution_id = (
1568 SELECT MAX(AID1.invoice_distribution_id)
1569 FROM ap_invoice_distributions AID1
1570 WHERE AID1.invoice_id = l_invoice_id
1571 AND AID1.line_type_lookup_code = 'ITEM'
1572 /* Bug 3784909. Folowing two lines Added */
1573 AND NVL(AID1.reversal_flag, 'N') <> 'Y'
1574 AND NVL(AID1.posted_flag, 'N') = 'N'
1575 AND ABS(AID1.amount) = (
1576 SELECT MAX(ABS(AID2.amount))
1577 FROM ap_invoice_distributions AID2
1578 WHERE AID2.invoice_id = l_invoice_id
1579 AND AID2.line_type_lookup_code = 'ITEM'
1580 -- Bug 3784909. Folowing two lines Added
1581 AND NVL(AID2.reversal_flag, 'N') <> 'Y'
1582 AND NVL(AID2.posted_flag, 'N') = 'N'));
1583 ELSE
1584 -- Update FREIGHT or MISC Dists
1585 UPDATE ap_invoice_distributions
1586 SET base_amount = base_amount - (l_base_dist_total - l_inv_base_amount)
1587 WHERE invoice_id = l_invoice_id
1588 AND invoice_distribution_id = (
1589 SELECT MAX(AID3.invoice_distribution_id)
1590 FROM ap_invoice_distributions AID3
1591 WHERE AID3.invoice_id = l_invoice_id
1592 AND AID3.line_type_lookup_code
1593 IN ('FREIGHT','MISCELLANEOUS')
1594 AND
1595 /* Bug 3784909. Folowing two lines Added */
1596 NVL(AID3.reversal_flag, 'N') = 'N'
1597 AND NVL(AID3.posted_flag, 'N') = 'N'
1598 AND ABS(AID3.amount) = (
1599 SELECT MAX(ABS(AID4.amount))
1600 FROM ap_invoice_distributions AID4
1601 WHERE AID4.invoice_id = l_invoice_id
1602 AND AID4.line_type_lookup_code
1603 IN('FREIGHT','MISCELLANEOUS')
1604 --Bug 3784909. Folowing two lines Added
1605 AND NVL(AID4.reversal_flag, 'N') <> 'Y'
1606 AND NVL(AID4.posted_flag, 'N') = 'N'));
1607 END IF; --IF (l_item_count > 0)
1608
1609 l_row_count := SQL%ROWCOUNT;
1610 IF (l_row_count > 0) THEN
1611 ---------------------------------------------------------
1612 l_debug_info := l_row_count||' rows updated.';
1613 -- Print_Debug(l_api_name, l_debug_info);
1614 IF g_debug_mode = 'Y' THEN
1615 AP_Debug_Pkg.Print(g_debug_mode, l_debug_info );
1616 END IF;
1617
1618 IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
1619 FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME||l_api_name,l_debug_info);
1620 END IF;
1621 ---------------------------------------------------------
1622 ELSE
1623 ---------------------------------------------------------
1624 l_debug_info := 'No rows Updated';
1625 -- Print_Debug(l_api_name, l_debug_info);
1626 IF g_debug_mode = 'Y' THEN
1627 AP_Debug_Pkg.Print(g_debug_mode, l_debug_info );
1628 END IF;
1629
1630 IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
1631 FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME||l_api_name,l_debug_info);
1632 END IF;
1633 ---------------------------------------------------------
1634 END IF;
1635 END IF; -- IF (l_dist_total = l_inv_amount)
1636 END IF; -- IF (l_dist_total = l_inv_amount)
1637 END IF; -- If inv currency <> base currency
1638 END IF; -- If l_distribution_variance_exist = TRUE
1639 -- Bug 6648094 Ends
1640
1641 ----------------------------------------------------------------
1642 l_debug_info := 'Update Total Distribution Amount';
1643 -- Print_Debug(l_api_name, l_debug_info);
1644 IF g_debug_mode = 'Y' THEN
1645 AP_Debug_Pkg.Print(g_debug_mode, l_debug_info );
1646 END IF;
1647
1648 IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
1649 FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME||l_api_name,l_debug_info);
1650 END IF;
1651 ----------------------------------------------------------------
1652 Update_Total_Dist_Amount(l_invoice_id,
1653 l_curr_calling_sequence);
1654
1655 --Bug9436217
1656 /*
1657 SELECT invoice_type_lookup_code
1658 INTO l_invoice_type_lookup_code
1659 FROM ap_invoices_all
1660 WHERE invoice_id = l_invoice_id;
1661 */
1662 l_invoice_type_lookup_code := l_invoice_type;
1663 --Bug9436217
1664
1665 --Introduced retainage flag check for bug#9356460
1666 IF ((l_exclude_tax_from_discount = 'Y' OR l_exclude_freight_from_disc = 'Y' OR l_net_of_retainage_flag <> 'Y')
1667 OR (l_invoice_type_lookup_code IN ('PO PRICE ADJUST','ADJUSTMENT'))) THEN
1668
1669 ----------------------------------------------------------------
1670 l_debug_info := 'Exclude Tax/Freight: Recalculate Payment Schedules';
1671 -- Print_Debug(l_api_name, l_debug_info);
1672 IF g_debug_mode = 'Y' THEN
1673 AP_Debug_Pkg.Print(g_debug_mode, l_debug_info );
1674 END IF;
1675
1676 IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
1677 FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME||l_api_name,l_debug_info);
1678 END IF;
1679 ----------------------------------------------------------------
1680 Exclude_Tax_Freight_From_Disc(
1681 l_invoice_id,
1682 l_exclude_tax_from_discount,
1683 l_exclude_freight_from_disc,
1684 l_net_of_retainage_flag, --9356460
1685 l_invoice_type_lookup_code,
1686 l_curr_calling_sequence);
1687
1688 IF (l_invoice_type in ('PO PRICE ADJUST','ADJUSTMENT')) THEN
1689 ----------------------------------------------------------------
1690 l_debug_info := 'Retropricing: Check Line Variance';
1691 -- Print_Debug(l_api_name, l_debug_info);
1692 IF g_debug_mode = 'Y' THEN
1693 AP_Debug_Pkg.Print(g_debug_mode, l_debug_info );
1694 END IF;
1695
1696 IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
1697 FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME||l_api_name,l_debug_info);
1698 END IF;
1699 ----------------------------------------------------------------
1700 Check_Line_Variance(
1701 l_invoice_id,
1702 l_system_user,
1703 l_holds,
1704 l_hold_count,
1705 l_release_count,
1706 l_line_variance_hold_exist,
1707 l_curr_calling_sequence,
1708 l_base_currency_code); --bug 7271262
1709 END IF;
1710 END IF;
1711
1712 ----------------------------------------------------------------
1713 l_debug_info := 'Execute General Checks';
1714 -- Print_Debug(l_api_name, l_debug_info);
1715 IF g_debug_mode = 'Y' THEN
1716 AP_Debug_Pkg.Print(g_debug_mode, l_debug_info );
1717 END IF;
1718
1719 IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
1720 FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME||l_api_name,l_debug_info);
1721 END IF;
1722 ----------------------------------------------------------------
1723 Execute_General_Checks(
1724 l_invoice_id,
1725 l_set_of_books_id,
1726 l_base_currency_code,
1727 l_invoice_amount,
1728 l_invoice_base_amount,
1729 l_invoice_currency_code,
1730 l_invoice_amount_limit,
1731 l_hold_future_payments_flag,
1732 l_system_user,
1733 l_holds,
1734 l_hold_count,
1735 l_release_count,
1736 l_curr_calling_sequence);
1737
1738 IF (l_matched) THEN
1739
1740 ----------------------------------------------------------------
1741 l_debug_info := 'Execute Quantity Variance Check';
1742 -- Print_Debug(l_api_name, l_debug_info);
1743 IF g_debug_mode = 'Y' THEN
1744 AP_Debug_Pkg.Print(g_debug_mode, l_debug_info );
1745 END IF;
1746
1747 IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
1748 FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME||l_api_name,l_debug_info);
1749 END IF;
1750 ----------------------------------------------------------------
1751 IF l_invoice_type_lookup_code <> 'PO PRICE ADJUST' THEN
1752 AP_APPROVAL_MATCHED_PKG.Exec_Qty_Variance_Check(
1753 p_invoice_id => l_invoice_id,
1754 p_base_currency_code => l_base_currency_code,
1755 p_inv_currency_code => l_invoice_currency_code,
1756 p_system_user => l_system_user,
1757 p_calling_sequence => l_curr_calling_sequence);
1758 END IF;
1759
1760 ----------------------------------------------------------------
1761 l_debug_info := 'Execute Amount Variance Check';
1762 -- Print_Debug(l_api_name, l_debug_info);
1763 IF g_debug_mode = 'Y' THEN
1764 AP_Debug_Pkg.Print(g_debug_mode, l_debug_info );
1765 END IF;
1766
1767 IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
1768 FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME||l_api_name,l_debug_info);
1769 END IF;
1770 ----------------------------------------------------------------
1771 AP_APPROVAL_MATCHED_PKG.Exec_Amt_Variance_Check(
1772 p_invoice_id => l_invoice_id,
1773 p_base_currency_code => l_base_currency_code,
1774 p_inv_currency_code => l_invoice_currency_code,
1775 p_system_user => l_system_user,
1776 p_calling_sequence => l_curr_calling_sequence );
1777
1778 --for CLM project - bug 9494400
1779 ----------------------------------------------------------------
1780 l_debug_info := 'Execute CLM Partial Funds Check';
1781 -- Print_Debug(l_api_name, l_debug_info);
1782 IF g_debug_mode = 'Y' THEN
1783 AP_Debug_Pkg.Print(g_debug_mode, l_debug_info );
1784 END IF;
1785
1786 IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
1787 FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME||l_api_name,l_debug_info);
1788 END IF;
1789 ----------------------------------------------------------------
1790 AP_APPROVAL_MATCHED_PKG.exec_partial_funds_check(
1791 p_invoice_id => l_invoice_id,
1792 p_system_user => l_system_user,
1793 p_holds => l_holds,
1794 p_holds_count => l_hold_count,
1795 p_release_count => l_release_count,
1796 p_calling_sequence => l_curr_calling_sequence);
1797
1798 -- end for CLM project - bug 9494400
1799
1800 -- 7299826 EnC project
1801 ----------------------------------------------------------------
1802 l_debug_info := 'Execute Pay when paid Check';
1803 -- Print_Debug(l_api_name, l_debug_info);
1804 IF g_debug_mode = 'Y' THEN
1805 AP_Debug_Pkg.Print(g_debug_mode, l_debug_info );
1806 END IF;
1807
1808 IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
1809 FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME||l_api_name,l_debug_info);
1810 END IF;
1811 ----------------------------------------------------------------
1812 AP_APPROVAL_MATCHED_PKG.exec_pay_when_paid_check(
1813 p_invoice_id => l_invoice_id,
1814 p_system_user => l_system_user,
1815 p_holds => l_holds,
1816 p_holds_count => l_hold_count,
1817 p_release_count => l_release_count,
1818 p_calling_sequence => l_curr_calling_sequence);
1819
1820 -- 7299826 EnC project
1821 ----------------------------------------------------------------
1822 l_debug_info := 'Execute PO Deliverable Check';
1823 -- Print_Debug(l_api_name, l_debug_info);
1824 IF g_debug_mode = 'Y' THEN
1825 AP_Debug_Pkg.Print(g_debug_mode, l_debug_info );
1826 END IF;
1827
1828 IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
1829 FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME||l_api_name,l_debug_info);
1830 END IF;
1831 ----------------------------------------------------------------
1832 AP_APPROVAL_MATCHED_PKG.exec_po_deliverable_check(
1833 p_invoice_id => l_invoice_id,
1834 p_system_user => l_system_user,
1835 p_holds => l_holds,
1836 p_holds_count => l_hold_count,
1837 p_release_count => l_release_count,
1838 p_calling_sequence => l_curr_calling_sequence);
1839
1840 ----------------------------------------------------------------
1841 l_debug_info := 'Execute Matched Checks';
1842 -- Print_Debug(l_api_name, l_debug_info);
1843 IF g_debug_mode = 'Y' THEN
1844 AP_Debug_Pkg.Print(g_debug_mode, l_debug_info );
1845 END IF;
1846
1847 IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
1848 FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME||l_api_name,l_debug_info);
1849 END IF;
1850 ----------------------------------------------------------------
1851 AP_APPROVAL_MATCHED_PKG.Execute_Matched_Checks(
1852 p_invoice_id => l_invoice_id,
1853 p_base_currency_code => l_base_currency_code,
1854 p_price_tol => l_price_tol,
1855 p_qty_tol => l_qty_tol,
1856 p_qty_rec_tol => l_qty_rec_tol,
1857 p_amt_tol => l_amt_tol,
1858 p_amt_rec_tol => l_amt_rec_tol,
1859 p_max_qty_ord_tol => l_max_qty_ord_tol,
1860 p_max_qty_rec_tol => l_max_qty_rec_tol,
1861 p_max_amt_ord_tol => l_max_amt_ord_tol,
1862 p_max_amt_rec_tol => l_max_amt_rec_tol,
1863 p_goods_ship_amt_tolerance => l_goods_ship_amt_tolerance,
1864 p_goods_rate_amt_tolerance => l_goods_rate_amt_tolerance,
1865 p_goods_total_amt_tolerance => l_goods_total_amt_tolerance,
1866 p_services_ship_amt_tolerance => l_services_ship_amt_tolerance,
1867 p_services_rate_amt_tolerance => l_services_rate_amt_tolerance,
1868 p_services_total_amt_tolerance => l_services_total_amt_tolerance,
1869 p_system_user => l_system_user,
1870 p_conc_flag => p_conc_flag,
1871 p_holds => l_holds,
1872 p_holds_count => l_hold_count,
1873 p_release_count => l_release_count,
1874 p_calling_sequence => l_curr_calling_sequence);
1875
1876 ----------------------------------------------------------------
1877 l_debug_info := 'Execute PO Final Close';
1878 -- Print_Debug(l_api_name, l_debug_info);
1879 IF g_debug_mode = 'Y' THEN
1880 AP_Debug_Pkg.Print(g_debug_mode, l_debug_info );
1881 END IF;
1882
1883 IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
1884 FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME||l_api_name,l_debug_info);
1885 END IF;
1886 ----------------------------------------------------------------
1887 AP_APPROVAL_MATCHED_PKG.Exec_PO_Final_Close(
1888 l_invoice_id,
1889 l_system_user,
1890 p_conc_flag,
1891 l_holds,
1892 l_hold_count,
1893 l_release_count,
1894 l_curr_calling_sequence);
1895
1896 END IF; -- end of matched check
1897
1898 IF (p_calling_mode = 'APPROVE' and l_invoice_line_count >0 ) THEN --bug 6684139
1899 ----------------------------------------------------------------
1900 l_debug_info := 'Validate Invoice for Tax';
1901 -- Print_Debug(l_api_name, l_debug_info);
1902 IF g_debug_mode = 'Y' THEN
1903 AP_Debug_Pkg.Print(g_debug_mode, l_debug_info );
1904 END IF;
1905
1906 IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
1907 FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME||l_api_name,l_debug_info);
1908 END IF;
1909 ----------------------------------------------------------------
1910 -- Bug16390854: start
1911
1912 SELECT COUNT(1)
1913 INTO l_zx_lines_det_fac_count
1914 FROM zx_lines_det_factors
1915 WHERE application_id = 200
1916 AND entity_code = 'AP_INVOICES'
1917 AND trx_id = l_invoice_id
1918 AND event_class_code IN ('STANDARD INVOICES','PREPAYMENT INVOICES','EXPENSE REPORTS')
1919 AND ROWNUM = 1 ;
1920
1921 IF l_zx_lines_det_fac_count > 0 THEN
1922 -- Bug16390854: End
1923
1924 l_success := ap_etax_pkg.calling_etax(
1925 p_invoice_id => p_invoice_id,
1926 p_calling_mode => 'VALIDATE',
1927 p_all_error_messages => 'N',
1928 p_error_code => l_error_code,
1929 p_calling_sequence => l_curr_calling_sequence);
1930
1931 END IF; -- Bug16390854
1932
1933 IF (NOT l_success) THEN
1934 IF (nvl(p_conc_flag,'N') = 'N') THEN
1935 Raise Tax_Exception;
1936 ELSE
1937 NULL;
1938 END IF;
1939 END IF;
1940 END IF;
1941
1942 ----------------------------------------------------------------
1943 l_debug_info := 'Call GMS API to ensure missing ADLs are generated';
1944 -- Print_Debug(l_api_name, l_debug_info);
1945 IF g_debug_mode = 'Y' THEN
1946 AP_Debug_Pkg.Print(g_debug_mode, l_debug_info );
1947 END IF;
1948
1949 IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
1950 FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME||l_api_name,l_debug_info);
1951 END IF;
1952 ----------------------------------------------------------------
1953 GMS_AP_API2.verify_create_adls
1954 (l_invoice_id,
1955 l_curr_calling_sequence);
1956
1957 ----------------------------------------------------------------
1958 l_debug_info := 'Execute Withholding';
1959 -- Print_Debug(l_api_name, l_debug_info);
1960 IF g_debug_mode = 'Y' THEN
1961 AP_Debug_Pkg.Print(g_debug_mode, l_debug_info );
1962 END IF;
1963
1964 IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
1965 FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME||l_api_name,l_debug_info);
1966 END IF;
1967 ----------------------------------------------------------------
1968 Withhold_Tax_On(
1969 l_invoice_id,
1970 l_gl_date_from_receipt,
1971 l_system_user,
1972 l_system_user,
1973 -1,
1974 -1,
1975 -1,
1976 l_system_user,
1977 l_holds,
1978 l_hold_count,
1979 l_release_count,
1980 l_curr_calling_sequence);
1981
1982 ------------------------------------------------------------------
1983 l_debug_info := 'Calling Custom Validation Hook';
1984 ------------------------------------------------------------------
1985 AP_CUSTOM_INV_VALIDATION_PKG.AP_Custom_Validation_Hook
1986 (p_invoice_id,
1987 l_curr_calling_sequence);
1988
1989 ----------------------------------------------------------------
1990 l_debug_info := 'Create Prepayment Application Distributions';
1991 -- Print_Debug(l_api_name, l_debug_info);
1992 IF g_debug_mode = 'Y' THEN
1993 AP_Debug_Pkg.Print(g_debug_mode, l_debug_info );
1994 END IF;
1995
1996 IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
1997 FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME||l_api_name,l_debug_info);
1998 END IF;
1999 ----------------------------------------------------------------
2000
2001 -- bug9038462, changing the criteria for the regeneration of
2002 -- the Prepayment Application Distributions (APAD)
2003 --
2004 SELECT count(*)
2005 INTO l_prepay_dist_count
2006 FROM ap_invoice_distributions_all
2007 WHERE Invoice_ID = l_invoice_id
2008 AND Line_Type_Lookup_Code = 'PREPAY'
2009 --AND Accounting_Event_ID IS NULL;
2010 AND NVL(Posted_Flag, 'N') <> 'Y'
2011 AND NVL(Encumbered_Flag, 'N') <> 'Y';
2012
2013 IF l_prepay_dist_count > 0 THEN
2014 ap_acctg_prepay_dist_pkg.prepay_dist_appl(
2015 l_invoice_id,
2016 l_curr_calling_sequence);
2017 END IF;
2018
2019 ----------------------------------------------------------------
2020 l_debug_info := 'Execute Budgetary Control';
2021 -- Print_Debug(l_api_name, l_debug_info);
2022 IF g_debug_mode = 'Y' THEN
2023 AP_Debug_Pkg.Print(g_debug_mode, l_debug_info );
2024 END IF;
2025
2026 IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
2027 FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME||l_api_name,l_debug_info);
2028 END IF;
2029 ----------------------------------------------------------------
2030 --Bug 8260168 Start
2031 ----------------------------------------------------------------
2032 l_debug_info := 'Check Prepaid Amount Exceeds Invoice Amount';
2033 -- Print_Debug(l_api_name, l_debug_info);
2034 IF g_debug_mode = 'Y' THEN
2035 AP_Debug_Pkg.Print(g_debug_mode, l_debug_info );
2036 END IF;
2037
2038 IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
2039 FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME||l_api_name,l_debug_info);
2040 END IF;
2041 ----------------------------------------------------------------
2042 Check_Prepaid_Amount(
2043 l_invoice_id,
2044 l_system_user,
2045 l_holds,
2046 l_hold_count,
2047 l_release_count,
2048 l_curr_calling_sequence);
2049
2050 --Bug 8260168 End
2051
2052 IF p_budget_control = 'Y' THEN
2053
2054 l_debug_info := 'p_budget_control is Y';
2055 -- Print_Debug(l_api_name, l_debug_info);
2056 IF g_debug_mode = 'Y' THEN
2057 AP_Debug_Pkg.Print(g_debug_mode, l_debug_info );
2058 END IF;
2059
2060 IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
2061 FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME||l_api_name,l_debug_info);
2062 END IF;
2063 -- Bug 6681580
2064 select count(*)
2065 INTO l_encumbrance_exists
2066 FROM ap_invoice_distributions aid
2067 WHERE nvl(aid.encumbered_flag,'N') not in ('N','R') ----added check for 'R' due to bug 7264524
2068 AND aid.invoice_id = l_invoice_id;
2069
2070 -- Bug 6681580
2071 IF p_calling_mode = 'CANCEL' AND l_encumbrance_exists = 0 THEN
2072 l_debug_info := 'Calling Mode is CANCEL and No Prior Encumb';
2073 -- Print_Debug(l_api_name, l_debug_info);
2074 IF g_debug_mode = 'Y' THEN
2075 AP_Debug_Pkg.Print(g_debug_mode, l_debug_info );
2076 END IF;
2077
2078 IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
2079 FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME||l_api_name,l_debug_info);
2080 END IF;
2081
2082 -- bug9553683
2083 Release_fund_holds
2084 (P_Invoice_ID => l_Invoice_ID,
2085 p_system_user => l_system_user,
2086 p_calling_mode => 'CANCEL', --bug11659334
2087 p_holds => l_holds,
2088 p_holds_count => l_hold_count,
2089 p_release_count => l_release_count,
2090 p_calling_sequence => l_curr_calling_sequence);
2091
2092 ELSE
2093 l_debug_info := 'Calling AP_FUNDS_CONTROL_PKG.Funds_Reserve';
2094 -- Print_Debug(l_api_name, l_debug_info);
2095 IF g_debug_mode = 'Y' THEN
2096 AP_Debug_Pkg.Print(g_debug_mode, l_debug_info );
2097 END IF;
2098
2099 IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
2100 FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME||l_api_name,l_debug_info);
2101 END IF;
2102
2103 AP_FUNDS_CONTROL_PKG.Funds_Reserve(
2104 p_calling_mode,
2105 l_invoice_id,
2106 l_set_of_books_id,
2107 l_base_currency_code,
2108 p_conc_flag,
2109 l_system_user,
2110 l_holds,
2111 l_hold_count,
2112 l_release_count,
2113 p_funds_return_code,
2114 l_curr_calling_sequence);
2115 END IF; -- Bug 6681580
2116 END IF;
2117
2118
2119 -- Project LCM 7588322
2120 /*Check whether this invoice is matched to any LCM enabled receipt*/
2121 BEGIN
2122
2123 /* bug 11845564 starts */
2124
2125 /* SELECT 'Y'
2126 INTO l_lcm_used
2127 FROM DUAL
2128 WHERE EXISTS
2129 (SELECT 1 FROM AP_INVOICE_DISTRIBUTIONS aid, RCV_TRANSACTIONS rt
2130 WHERE aid.invoice_id = l_invoice_id
2131 AND aid.rcv_transaction_id = rt.transaction_id
2132 AND rt.lcm_shipment_line_id IS NOT NULL
2133 AND aid.match_status_flag = 'S'); */
2134
2135 SELECT 'Y'
2136 INTO l_lcm_used
2137 FROM DUAL
2138 WHERE EXISTS
2139 (SELECT 1
2140 FROM AP_INVOICE_DISTRIBUTIONS_ALL aid,
2141 RCV_TRANSACTIONS rt
2142 WHERE aid.invoice_id = l_invoice_id
2143 AND aid.rcv_transaction_id = rt.transaction_id
2144 AND rt.lcm_shipment_line_id IS NOT NULL
2145 AND aid.match_status_flag = 'S'
2146
2147 UNION ALL
2148
2149 SELECT 1
2150 FROM AP_INVOICE_DISTRIBUTIONS_ALL aid,
2151 RCV_TRANSACTIONS rt,
2152 AP_INVOICE_DISTRIBUTIONS_ALL aid2
2153 WHERE aid.invoice_id = l_invoice_id
2154 AND aid.corrected_invoice_dist_id = aid2.invoice_distribution_id
2155 AND aid2.rcv_transaction_id = rt.transaction_id
2156 AND rt.lcm_shipment_line_id IS NOT NULL
2157 AND aid.match_status_flag = 'S');
2158
2159 /* bug 11845564 ends */
2160
2161 EXCEPTION
2162 WHEN NO_DATA_FOUND THEN NULL;
2163 END;
2164
2165 /*Check if there are unpostable holds put on this invoice by now.
2166 If any such holds are there, we should not be calling LCM to
2167 pick this invoice to LCM.*/
2168 -- Added by 7641045, modified by 7678786, modification reverted by 7830298
2169 BEGIN
2170
2171 /* bug 12674049: Added "AND C.user_releaseable_flag = 'N' " condition to handle non postable-user releasable holds*/
2172
2173 SELECT 'Y'
2174 INTO l_unpostable_holds_exist
2175 FROM dual
2176 WHERE EXISTS (SELECT 1
2177 FROM ap_holds H, ap_hold_codes C
2178 WHERE H.invoice_id = l_invoice_id
2179 AND H.hold_lookup_code = C.hold_lookup_code
2180 AND ((H.release_lookup_code IS NULL)
2181 AND ((C.postable_flag = 'N') OR (C.postable_flag = 'X')) AND C.user_releaseable_flag = 'N'));
2182
2183 /* The condition above is same as the one used in Update_Inv_Dists_To_Approved
2184 procedure. However, we removed encumbrance checks.*/
2185
2186 EXCEPTION
2187 WHEN NO_DATA_FOUND THEN NULL;
2188 END;
2189
2190
2191
2192 IF(l_lcm_used = 'Y') THEN
2193 IF (l_unpostable_holds_exist <> 'Y') THEN -- Bug 7641045
2194
2195 ----------------------------------------------------------------
2196 l_debug_info := 'Call LCM API';
2197 -- Print_Debug(l_api_name, l_debug_info);
2198 IF g_debug_mode = 'Y' THEN
2199 AP_Debug_Pkg.Print(g_debug_mode, l_debug_info );
2200 END IF;
2201
2202 IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
2203 FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME||l_api_name,l_debug_info);
2204 END IF;
2205 ----------------------------------------------------------------
2206
2207 --EXECUTE IMMEDIATE
2208 INL_MATCH_GRP.Create_MatchesFromAP
2209 (p_api_version => 1.0, -- API version
2210 p_init_msg_list => FND_API.G_TRUE, -- This is to initialize the message list whenever the API is called, not cumulating messages from one execution to other
2211 p_commit => FND_API.G_FALSE, -- This is to not issue any commit inside the API, since commit cycle is managed by the calling program
2212 p_invoice_id => l_invoice_id,
2213 x_return_status => l_lcm_return_status, -- Returns "S", "E" or "U", i.e. FND_API.G_RET_STS_SUCCESS , FND_API.G_RET_STS_ERROR or FND_API.G_RET_STS_UNEXP_ERROR.
2214 x_msg_count => l_lcm_msg_count, -- Number of messages in the list
2215 x_msg_data => l_lcm_msg_data); -- Messages stored in encoded format
2216
2217 IF(l_lcm_return_status <> FND_API.G_RET_STS_SUCCESS) THEN
2218 -- Bug 7718385
2219 RAISE LCM_Exception;
2220 END IF;
2221 END IF; -- l_unpostable_holds_exist <> 'Y'
2222 END IF; -- l_lcm_used = 'Y'
2223
2224 -- End Project LCM 7588322
2225
2226 ----------------------------------------------------------------
2227 l_debug_info := 'Update Invoice Distributions to APPROVED';
2228 -- Print_Debug(l_api_name, l_debug_info);
2229 IF g_debug_mode = 'Y' THEN
2230 AP_Debug_Pkg.Print(g_debug_mode, l_debug_info );
2231 END IF;
2232
2233 IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
2234 FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME||l_api_name,l_debug_info);
2235 END IF;
2236 ----------------------------------------------------------------
2237 Update_Inv_Dists_To_Approved(
2238 l_invoice_id,
2239 l_user_id,
2240 l_curr_calling_sequence);
2241
2242 ----------------------------------------------------------------
2243 l_debug_info := 'Generate Accounting Events';
2244 -- Print_Debug(l_api_name, l_debug_info);
2245 IF g_debug_mode = 'Y' THEN
2246 AP_Debug_Pkg.Print(g_debug_mode, l_debug_info );
2247 END IF;
2248
2249 IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
2250 FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME||l_api_name,l_debug_info);
2251 END IF;
2252 ----------------------------------------------------------------
2253 Generate_Account_Event(
2254 l_invoice_id,
2255 l_curr_calling_sequence);
2256
2257
2258 END IF; -- end of Inv_Needs_Approving...
2259
2260 ----------------------------------------------------------------
2261 l_debug_info := 'Execute Due Date Sweeper after validation';
2262 -- Print_Debug(l_api_name, l_debug_info);
2263 IF g_debug_mode = 'Y' THEN
2264 AP_Debug_Pkg.Print(g_debug_mode, l_debug_info );
2265 END IF;
2266
2267 IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
2268 FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME||l_api_name,l_debug_info);
2269 END IF;
2270 ----------------------------------------------------------------
2271
2272 IF (l_recalc_pay_schedule_flag = 'Y') THEN
2273
2274 SELECT DECODE(NVL((MAX(aps.last_update_date)- MIN(aps.creation_date)),0),
2275 0,'N','Y')
2276 INTO l_diff_flag
2277 FROM ap_payment_schedules aps
2278 WHERE aps.invoice_id = l_invoice_id;
2279
2280 IF (l_diff_flag = 'N') THEN
2281 AP_PPA_PKG.Due_Date_Sweeper(
2282 l_invoice_id,
2283 l_matched,
2284 l_system_user,
2285 l_receipt_acc_days,
2286 l_curr_calling_sequence);
2287 END IF;
2288 END IF;
2289
2290 ----------------------------------------------------------------
2291 l_debug_info := 'Update force_revalidation_flag to No';
2292 -- Print_Debug(l_api_name, l_debug_info);
2293 IF g_debug_mode = 'Y' THEN
2294 AP_Debug_Pkg.Print(g_debug_mode, l_debug_info );
2295 END IF;
2296
2297 IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
2298 FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME||l_api_name,l_debug_info);
2299 END IF;
2300 ----------------------------------------------------------------
2301
2302 UPDATE ap_invoices_all
2303 SET force_revalidation_flag = 'N'
2304 WHERE invoice_id = l_invoice_id;
2305
2306 END IF; -- end of approve_invoice_cur cursor count check
2307
2308
2309 IF (p_calling_mode = 'PAYMENT REQUEST') OR
2310 (p_calling_mode = 'CANCEL' and l_invoice_type_pr = 'PAYMENT REQUEST') THEN
2311 ----------------------------------------------------------------
2312 l_debug_info := 'Close approve_pay_request_cur';
2313 -- Print_Debug(l_api_name, l_debug_info);
2314 IF g_debug_mode = 'Y' THEN
2315 AP_Debug_Pkg.Print(g_debug_mode, l_debug_info );
2316 END IF;
2317
2318 IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
2319 FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME||l_api_name,l_debug_info);
2320 END IF;
2321 ----------------------------------------------------------------
2322 CLOSE approve_pay_request_cur;
2323 ELSE
2324 ----------------------------------------------------------------
2325 l_debug_info := 'Close approve_invoice_cursor';
2326 -- Print_Debug(l_api_name, l_debug_info);
2327 IF g_debug_mode = 'Y' THEN
2328 AP_Debug_Pkg.Print(g_debug_mode, l_debug_info );
2329 END IF;
2330
2331 IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
2332 FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME||l_api_name,l_debug_info);
2333 END IF;
2334 ----------------------------------------------------------------
2335 CLOSE approve_invoice_cur;
2336 END IF;
2337
2338 ----------------------------------------------------------------
2339 l_debug_info := 'Retrieve total hold count and validation status';
2340 -- Print_Debug(l_api_name, l_debug_info);
2341 IF g_debug_mode = 'Y' THEN
2342 AP_Debug_Pkg.Print(g_debug_mode, l_debug_info );
2343 END IF;
2344
2345 IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
2346 FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME||l_api_name,l_debug_info);
2347 END IF;
2348 ----------------------------------------------------------------
2349 Get_Invoice_Statuses(
2350 l_invoice_id,
2351 p_holds_count,
2352 p_approval_status,
2353 l_curr_calling_sequence);
2354
2355 ----------------------------------------------------------------
2356 l_debug_info := 'Validation Status: '||p_approval_status;
2357 -- Print_Debug(l_api_name, l_debug_info);
2358 IF g_debug_mode = 'Y' THEN
2359 AP_Debug_Pkg.Print(g_debug_mode, l_debug_info );
2360 END IF;
2361
2362 IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
2363 FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME||l_api_name,l_debug_info);
2364 END IF;
2365 ----------------------------------------------------------------
2366
2367 IF p_calling_mode = 'APPROVE' THEN
2368
2369 IF l_invoice_line_count > 0 THEN
2370
2371 BEGIN
2372 SELECT *
2373 INTO l_inv_header_rec
2374 FROM ap_invoices_all
2375 WHERE invoice_id = P_Invoice_Id;
2376 END;
2377 --BUG 6974733
2378 IF (l_inv_header_rec.invoice_type_lookup_code NOT IN ('AWT', 'INTEREST')) THEN
2379 -------------------------------------------------------------------
2380 l_debug_info := 'Get event class code';
2381 -- Print_Debug(l_api_name, l_debug_info);
2382 IF g_debug_mode = 'Y' THEN
2383 AP_Debug_Pkg.Print(g_debug_mode, l_debug_info );
2384 END IF;
2385
2386 IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
2387 FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME||l_api_name,l_debug_info);
2388 END IF;
2389 -------------------------------------------------------------------
2390 IF NOT(AP_ETAX_UTILITY_PKG.Get_Event_Class_Code(
2391 P_Invoice_Type_Lookup_Code => l_inv_header_rec.invoice_type_lookup_code,
2392 P_Event_Class_Code => l_event_class_code,
2393 P_error_code => l_error_code,
2394 P_calling_sequence => l_curr_calling_sequence)) THEN
2395
2396 IF (nvl(p_conc_flag,'N') = 'N') THEN
2397 Raise Tax_Exception;
2398 ELSE
2399 NULL;
2400 END IF;
2401 END IF;
2402
2403 -----------------------------------------------------------------
2404 l_debug_info := 'Call Freeze Distributions';
2405 -- Print_Debug(l_api_name, l_debug_info);
2406 IF g_debug_mode = 'Y' THEN
2407 AP_Debug_Pkg.Print(g_debug_mode, l_debug_info );
2408 END IF;
2409
2410 IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
2411 FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME||l_api_name,l_debug_info);
2412 END IF;
2413 -----------------------------------------------------------------
2414 --Bug7592845
2415 IF NOT(AP_ETAX_SERVICES_PKG.Freeze_itm_Distributions(
2416 P_Invoice_Header_Rec => l_inv_header_rec,
2417 P_Calling_Mode => 'FREEZE DISTRIBUTIONS',
2418 P_Event_Class_Code => l_event_class_code,
2419 P_All_Error_Messages => 'N',
2420 P_Error_Code => l_error_code,
2421 P_Calling_Sequence => l_curr_calling_sequence)) THEN
2422
2423 IF (nvl(p_conc_flag,'N') = 'N') THEN
2424 Raise Tax_Exception;
2425 ELSE
2426 NULL;
2427 END IF;
2428 END IF;
2429 --Bug9021265
2430 --Checking the Freeze Flag Y by defauly as per discussion
2431 --Himesh,Atul,Venkat,Kiran,Ranjith,Taniya
2432 SELECT COUNT(1)
2433 INTO l_unfreeze_count
2434 FROM zx_rec_nrec_dist
2435 WHERE application_id = 200
2436 AND entity_code = 'AP_INVOICES'
2437 AND event_class_code IN ('STANDARD INVOICES', 'PREPAYMENT INVOICES', 'EXPENSE REPORTS')
2438 AND trx_id = l_inv_header_rec.invoice_id
2439 AND freeze_flag = 'N';
2440 -----------------------------------------------------------------
2441 l_debug_info := 'UnFrozen Dists Count '||l_unfreeze_count;
2442 -- Print_Debug(l_api_name, l_debug_info);
2443 IF g_debug_mode = 'Y' THEN
2444 AP_Debug_Pkg.Print(g_debug_mode, l_debug_info );
2445 END IF;
2446
2447 IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
2448 FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME||l_api_name,l_debug_info);
2449 END IF;
2450 -----------------------------------------------------------------
2451 IF l_unfreeze_count > 0 THEN
2452 RAISE TAX_UNFREEZE_EXCEPTION;
2453 END IF;
2454 --Bug9021265
2455 END IF;--BUG 6974733
2456 IF p_approval_status IN ('APPROVED','AVAILABLE','UNPAID','FULL') THEN
2457
2458 ----------------------------------------------------------------
2459 l_debug_info := 'Call API to freeze invoice in tax schema';
2460 -- Print_Debug(l_api_name, l_debug_info);
2461 IF g_debug_mode = 'Y' THEN
2462 AP_Debug_Pkg.Print(g_debug_mode, l_debug_info );
2463 END IF;
2464
2465 IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
2466 FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME||l_api_name,l_debug_info);
2467 END IF;
2468 ----------------------------------------------------------------
2469 l_success := ap_etax_pkg.calling_etax(
2470 p_invoice_id => p_invoice_id,
2471 p_calling_mode => 'FREEZE INVOICE',
2472 p_all_error_messages => 'N',
2473 p_error_code => l_error_code,
2474 p_calling_sequence => l_curr_calling_sequence);
2475
2476 IF (NOT l_success) THEN
2477 IF (nvl(p_conc_flag,'N') = 'N') THEN
2478 Raise Tax_Exception;
2479 ELSE
2480 NULL;
2481 END IF;
2482 END IF;
2483 END IF;
2484 END IF;
2485 END IF;
2486
2487 AP_INVOICE_DISTRIBUTIONS_PKG.Make_Distributions_Permanent
2488 (P_Invoice_Id => p_invoice_id,
2489 P_Invoice_Line_Number => NULL,
2490 P_Calling_Sequence => 'Invoice Validation'); --Bug6653070
2491
2492 --END IF;
2493
2494 IF (l_any_records_flag = 'Y') THEN
2495 IF NVL(p_commit, 'Y') = 'Y' THEN
2496 ----------------------------------------------------------------
2497 l_debug_info := 'Commit Data';
2498 -- Print_Debug(l_api_name, l_debug_info);
2499 IF g_debug_mode = 'Y' THEN
2500 AP_Debug_Pkg.Print(g_debug_mode, l_debug_info );
2501 END IF;
2502
2503 IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
2504 FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME||l_api_name,l_debug_info);
2505 END IF;
2506 ----------------------------------------------------------------
2507 COMMIT;
2508 END IF;
2509 END IF;
2510
2511 -- Print_Debug (l_api_name, 'AP_APPROVAL_PKG.APPROVE.END');
2512 IF g_debug_mode = 'Y' THEN
2513 AP_Debug_Pkg.Print(g_debug_mode, 'AP_APPROVAL_PKG.APPROVE.END' );
2514 END IF;
2515
2516 IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
2517 FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME||l_api_name,'AP_APPROVAL_PKG.APPROVE.END');
2518 END IF;
2519
2520 EXCEPTION
2521 --Bug9021265
2522 WHEN TAX_UNFREEZE_EXCEPTION THEN
2523 fnd_message.set_name( 'SQLAP', 'AP_UNFRZN_TAX_DIST' ); -- Bug 9777752
2524
2525 IF (approve_invoice_cur%ISOPEN) THEN
2526 CLOSE approve_invoice_cur;
2527 END IF;
2528 IF (approve_pay_request_cur%ISOPEN) THEN
2529 CLOSE approve_pay_request_cur;
2530 END IF;
2531 IF (invoice_line_cur%ISOPEN) THEN
2532 CLOSE invoice_line_cur;
2533 END IF;
2534
2535 APP_EXCEPTION.RAISE_EXCEPTION;
2536 -- Bug 7718385
2537 WHEN LCM_EXCEPTION THEN
2538
2539 -- Logging error messages
2540 FOR i in 1 ..l_lcm_msg_count
2541 LOOP
2542 l_lcm_msg_data := FND_MSG_PUB.get(i, FND_API.g_false);
2543 l_debug_info :='l_msg_data ('||i||'): '||l_lcm_msg_data;
2544 -- Print_Debug(l_api_name, l_debug_info);
2545 IF g_debug_mode = 'Y' THEN
2546 AP_Debug_Pkg.Print(g_debug_mode, l_debug_info );
2547 END IF;
2548
2549 IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
2550 FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME||l_api_name,l_debug_info);
2551 END IF;
2552 END LOOP;
2553
2554 -- Throwing error messages to form to display
2555 FND_MESSAGE.SET_NAME('SQLAP','AP_LCM_EXCEPTION');
2556 /* Error Text is
2557 -- An error occurred while interfacing the invoice to Landed Cost Management.
2558 -- Error: ERROR
2559 --
2560 */
2561 FND_MESSAGE.SET_TOKEN('ERROR', l_lcm_msg_data);
2562 APP_EXCEPTION.RAISE_EXCEPTION;
2563
2564 WHEN TAX_EXCEPTION THEN
2565
2566 FND_MESSAGE.SET_NAME('SQLAP','AP_TAX_EXCEPTION');
2567 IF l_error_code IS NOT NULL THEN
2568 FND_MESSAGE.SET_TOKEN('ERROR', l_error_code);
2569 ELSE
2570 FND_MESSAGE.SET_TOKEN('ERROR', SQLERRM);
2571 END IF;
2572
2573 IF (approve_invoice_cur%ISOPEN) THEN
2574 CLOSE approve_invoice_cur;
2575 END IF;
2576 IF (approve_pay_request_cur%ISOPEN) THEN
2577 CLOSE approve_pay_request_cur;
2578 END IF;
2579 IF (invoice_line_cur%ISOPEN) THEN
2580 CLOSE invoice_line_cur;
2581 END IF;
2582
2583 APP_EXCEPTION.RAISE_EXCEPTION;
2584
2585 WHEN OTHERS THEN
2586 IF (SQLCODE <> -20001) THEN
2587 FND_MESSAGE.SET_NAME('SQLAP','AP_DEBUG');
2588 FND_MESSAGE.SET_TOKEN('ERROR',SQLERRM);
2589 FND_MESSAGE.SET_TOKEN('CALLING_SEQUENCE', l_curr_calling_sequence);
2590 FND_MESSAGE.SET_TOKEN('PARAMETERS',
2591 'Run Option = '|| p_run_option
2592 ||', Batch Id = '|| to_char(p_invoice_batch_id)
2593 ||', Begin Date = '|| to_char(p_begin_invoice_date)
2594 ||', End Date = '|| to_char(p_end_invoice_date)
2595 ||', Vendor Id = '|| to_char(p_vendor_id)
2596 ||', Pay Group = '|| p_pay_group
2597 ||', Invoice Id = '|| to_char(p_invoice_id)
2598 ||', Entered By = '|| to_char(p_entered_by)
2599 ||', Set of Books Id = '|| to_char(p_set_of_books_id));
2600 FND_MESSAGE.SET_TOKEN('DEBUG_INFO',l_debug_info);
2601 END IF;
2602
2603 IF (approve_invoice_cur%ISOPEN) THEN
2604 CLOSE approve_invoice_cur;
2605 END IF;
2606 IF (approve_pay_request_cur%ISOPEN) THEN
2607 CLOSE approve_pay_request_cur;
2608 END IF;
2609 IF (invoice_line_cur%ISOPEN) THEN
2610 CLOSE invoice_line_cur;
2611 END IF;
2612
2613 APP_EXCEPTION.RAISE_EXCEPTION;
2614
2615 END Approve;
2616
2617 /*bug6858309 - modified the function to look for
2618 ap_invoice_lines instead of ap_invoic_distributions
2619 as dists are not created for freshly created
2620 recurring invoice in R12*/
2621 FUNCTION validate_period (p_invoice_id IN NUMBER)
2622 RETURN BOOLEAN IS
2623
2624 CURSOR get_gl_date IS
2625 SELECT distinct accounting_date acc_date
2626 FROM ap_invoice_lines_all
2627 WHERE invoice_id = p_invoice_id
2628 and NVL(generate_dists,'N') <> 'D';
2629
2630 CURSOR get_inv_source IS
2631 SELECT upper(nvl(source, 'X')), org_id
2632 FROM ap_invoices_all
2633 WHERE invoice_id = p_invoice_id;
2634
2635 l_source ap_invoices_all.source%TYPE;
2636 l_org_id ap_invoices_all.org_id%TYPE;
2637
2638 BEGIN
2639 OPEN get_inv_source;
2640 FETCH get_inv_source INTO l_source, l_org_id;
2641 CLOSE get_inv_source;
2642
2643 IF l_source <> 'RECURRING INVOICE' THEN
2644 return true;
2645 END IF;
2646
2647 FOR gl_date IN get_gl_date LOOP
2648 IF ap_utilities_pkg.period_status(gl_date.acc_date) ='N' then
2649 return false;
2650 END IF;
2651 END LOOP;
2652 return true;
2653 END validate_period;
2654
2655
2656 /*=============================================================================
2657 | PROCEDURE APPROVAL_INIT
2658 |
2659 | Procedure called by APPROVAL to retrieve system variables to be used by
2660 | the APPROVAL program
2661 |
2662 | PROGRAM FLOW
2663 | 1. Retrieve system parameters
2664 | 2. Determine if accounting method is Cash Only
2665 | 3. Retrieve profile option user_id
2666 | 4. Set approval system user_id value
2667 | 5. Retrieve system tolerances
2668 *============================================================================*/
2669
2670 PROCEDURE Approval_Init(
2671 p_org_id IN NUMBER,
2672 p_invoice_id IN NUMBER,
2673 p_invoice_type IN VARCHAR2 DEFAULT NULL,
2674 p_tolerance_id IN NUMBER,
2675 p_services_tolerance_id IN NUMBER,
2676 p_conc_flag IN VARCHAR2,
2677 p_set_of_books_id IN OUT NOCOPY NUMBER,
2678 p_recalc_pay_sched_flag IN OUT NOCOPY VARCHAR2,
2679 p_sys_xrate_gain_ccid IN OUT NOCOPY NUMBER,
2680 p_sys_xrate_loss_ccid IN OUT NOCOPY NUMBER,
2681 p_base_currency_code IN OUT NOCOPY VARCHAR2,
2682 p_inv_enc_type_id IN OUT NOCOPY NUMBER,
2683 p_purch_enc_type_id IN OUT NOCOPY NUMBER,
2684 p_gl_date_from_receipt_flag IN OUT NOCOPY VARCHAR2,
2685 p_receipt_acc_days IN OUT NOCOPY NUMBER,
2686 p_system_user IN OUT NOCOPY NUMBER,
2687 p_user_id IN OUT NOCOPY NUMBER,
2688 p_goods_ship_amt_tolerance IN OUT NOCOPY NUMBER,
2689 p_goods_rate_amt_tolerance IN OUT NOCOPY NUMBER,
2690 p_goods_total_amt_tolerance IN OUT NOCOPY NUMBER,
2691 p_services_ship_amt_tolerance IN OUT NOCOPY NUMBER,
2692 p_services_rate_amt_tolerance IN OUT NOCOPY NUMBER,
2693 p_services_total_amt_tolerance IN OUT NOCOPY NUMBER,
2694 p_price_tolerance IN OUT NOCOPY NUMBER,
2695 p_qty_tolerance IN OUT NOCOPY NUMBER,
2696 p_qty_rec_tolerance IN OUT NOCOPY NUMBER,
2697 p_amt_tolerance IN OUT NOCOPY NUMBER,
2698 p_amt_rec_tolerance IN OUT NOCOPY NUMBER,
2699 p_max_qty_ord_tolerance IN OUT NOCOPY NUMBER,
2700 p_max_qty_rec_tolerance IN OUT NOCOPY NUMBER,
2701 p_max_amt_ord_tolerance IN OUT NOCOPY NUMBER,
2702 p_max_amt_rec_tolerance IN OUT NOCOPY NUMBER,
2703 p_invoice_line_count OUT NOCOPY NUMBER, --Bug 6684139
2704 p_calling_sequence IN VARCHAR2) IS
2705
2706 l_debug_loc VARCHAR2(30) := 'Approval_Init';
2707 l_curr_calling_sequence VARCHAR2(2000);
2708 l_debug_info VARCHAR2(1000);
2709 BEGIN
2710
2711 l_curr_calling_sequence := 'AP_APPROVAL_PKG.'||l_debug_loc||'<-'||
2712 p_calling_sequence;
2713
2714 -- Select stmt added for bug 6684139
2715 SELECT count(*)
2716 into p_invoice_line_count
2717 from ap_invoice_lines
2718 where invoice_id = p_invoice_id;
2719
2720 IF nvl(p_conc_flag, 'N') <> 'Y' THEN
2721
2722 l_debug_info := 'Retrieving system parameters for validation';
2723 -- Print_Debug(l_debug_loc, l_debug_info);
2724 IF g_debug_mode = 'Y' THEN
2725 AP_Debug_Pkg.Print(g_debug_mode, l_debug_info );
2726 END IF;
2727
2728 IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
2729 FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME||l_debug_loc,l_debug_info);
2730 END IF;
2731
2732 SELECT nvl(sp.set_of_books_id, -1),
2733 nvl(recalc_pay_schedule_flag, 'N'),
2734 nvl(sp.rate_var_gain_ccid, -1),
2735 nvl(sp.rate_var_loss_ccid, -1),
2736 nvl(sp.base_currency_code, 'USD'),
2737 nvl(fp.inv_encumbrance_type_id, -1),
2738 nvl(fp.purch_encumbrance_type_id, -1),
2739 nvl(sp.receipt_acceptance_days, 0),
2740 nvl(gl_date_from_receipt_flag, 'S')
2741 INTO p_set_of_books_id,
2742 p_recalc_pay_sched_flag,
2743 p_sys_xrate_gain_ccid,
2744 p_sys_xrate_loss_ccid,
2745 p_base_currency_code,
2746 p_inv_enc_type_id,
2747 p_purch_enc_type_id,
2748 p_receipt_acc_days,
2749 p_gl_date_from_receipt_flag
2750 FROM ap_system_parameters_all sp,
2751 financials_system_params_all fp,
2752 gl_sets_of_books gls
2753 WHERE sp.org_id = p_org_id
2754 AND fp.org_id = sp.org_id
2755 AND sp.set_of_books_id = gls.set_of_books_id;
2756
2757 ELSE
2758
2759 l_debug_info := 'Set Options from Cache';
2760 -- Print_Debug (l_debug_loc, l_debug_info);
2761 IF g_debug_mode = 'Y' THEN
2762 AP_Debug_Pkg.Print(g_debug_mode, l_debug_info );
2763 END IF;
2764
2765 IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
2766 FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME||l_debug_loc,l_debug_info);
2767 END IF;
2768
2769 p_set_of_books_id := AP_APPROVAL_PKG.G_Options_Table(p_org_id).set_of_books_id;
2770 p_recalc_pay_sched_flag := AP_APPROVAL_PKG.G_Options_Table(p_org_id).recalc_pay_schedule_flag;
2771 p_sys_xrate_gain_ccid := AP_APPROVAL_PKG.G_Options_Table(p_org_id).rate_var_gain_ccid;
2772 p_sys_xrate_loss_ccid := AP_APPROVAL_PKG.G_Options_Table(p_org_id).rate_var_loss_ccid;
2773 p_base_currency_code := AP_APPROVAL_PKG.G_Options_Table(p_org_id).base_currency_code;
2774 p_inv_enc_type_id := AP_APPROVAL_PKG.G_Options_Table(p_org_id).inv_encumbrance_type_id;
2775 p_purch_enc_type_id := AP_APPROVAL_PKG.G_Options_Table(p_org_id).purch_encumbrance_type_id;
2776 p_receipt_acc_days := AP_APPROVAL_PKG.G_Options_Table(p_org_id).receipt_acceptance_days;
2777 p_gl_date_from_receipt_flag := AP_APPROVAL_PKG.G_Options_Table(p_org_id).gl_date_from_receipt_flag;
2778
2779 END IF;
2780
2781 p_system_user := 5;
2782 p_user_id := FND_GLOBAL.user_id;
2783
2784 l_debug_info := 'Retrieving tolerances for validation';
2785 -- Print_Debug(l_debug_loc, l_debug_info);
2786 IF g_debug_mode = 'Y' THEN
2787 AP_Debug_Pkg.Print(g_debug_mode, l_debug_info );
2788 END IF;
2789
2790 IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
2791 FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME||l_debug_loc,l_debug_info);
2792 END IF;
2793
2794 IF p_invoice_type <> 'PAYMENT REQUEST' THEN
2795
2796 IF p_tolerance_id IS NOT NULL THEN
2797 p_price_tolerance := AP_APPROVAL_PKG.G_GOODS_TOLERANCES(p_tolerance_id).price_tolerance;
2798 p_qty_tolerance := AP_APPROVAL_PKG.G_GOODS_TOLERANCES(p_tolerance_id).quantity_tolerance;
2799 p_qty_rec_tolerance := AP_APPROVAL_PKG.G_GOODS_TOLERANCES(p_tolerance_id).qty_received_tolerance;
2800 p_max_qty_ord_tolerance := AP_APPROVAL_PKG.G_GOODS_TOLERANCES(p_tolerance_id).max_qty_ord_tolerance;
2801 p_max_qty_rec_tolerance := AP_APPROVAL_PKG.G_GOODS_TOLERANCES(p_tolerance_id).max_qty_rec_tolerance;
2802 p_goods_ship_amt_tolerance := AP_APPROVAL_PKG.G_GOODS_TOLERANCES(p_tolerance_id).ship_amt_tolerance;
2803 p_goods_rate_amt_tolerance := AP_APPROVAL_PKG.G_GOODS_TOLERANCES(p_tolerance_id).rate_amt_tolerance;
2804 p_goods_total_amt_tolerance := AP_APPROVAL_PKG.G_GOODS_TOLERANCES(p_tolerance_id).total_amt_tolerance;
2805 END IF;
2806
2807 IF p_services_tolerance_id IS NOT NULL THEN
2808 p_amt_tolerance := AP_APPROVAL_PKG.G_SERVICES_TOLERANCES(p_services_tolerance_id).amount_tolerance;
2809 p_amt_rec_tolerance := AP_APPROVAL_PKG.G_SERVICES_TOLERANCES(p_services_tolerance_id).amt_received_tolerance;
2810 p_max_amt_ord_tolerance := AP_APPROVAL_PKG.G_SERVICES_TOLERANCES(p_services_tolerance_id).max_amt_ord_tolerance;
2811 p_max_amt_rec_tolerance := AP_APPROVAL_PKG.G_SERVICES_TOLERANCES(p_services_tolerance_id).max_amt_rec_tolerance;
2812 p_services_ship_amt_tolerance := AP_APPROVAL_PKG.G_SERVICES_TOLERANCES(p_services_tolerance_id).ser_ship_amt_tolerance;
2813 p_services_rate_amt_tolerance := AP_APPROVAL_PKG.G_SERVICES_TOLERANCES(p_services_tolerance_id).ser_rate_amt_tolerance;
2814 p_services_total_amt_tolerance := AP_APPROVAL_PKG.G_SERVICES_TOLERANCES(p_services_tolerance_id).ser_total_amt_tolerance;
2815 END IF;
2816
2817 END IF;
2818
2819 EXCEPTION
2820 WHEN OTHERS THEN
2821 IF (SQLCODE <> -20001) THEN
2822 FND_MESSAGE.SET_NAME('SQLAP','AP_DEBUG');
2823 FND_MESSAGE.SET_TOKEN('ERROR',SQLERRM);
2824 FND_MESSAGE.SET_TOKEN('CALLING_SEQUENCE', l_curr_calling_sequence);
2825 FND_MESSAGE.SET_TOKEN('DEBUG_INFO',l_debug_info);
2826 END IF;
2827 APP_EXCEPTION.RAISE_EXCEPTION;
2828 END Approval_Init;
2829
2830 /*=============================================================================
2831 | PROCEDURE Inv_Needs_Approving
2832 |
2833 | Function when given an invoice_id and run_option, it returns a boolean
2834 | to indicate whether to approve an invoice or not. Returns FALSE if the
2835 | run_option is 'New' and the invoice doesn't have any unapproved
2836 | distributions.
2837 |
2838 | PARAMETERS
2839 | p_invoice_id
2840 | p_run_option
2841 | p_calling_sequence
2842 |
2843 | PROGRAM FLOW
2844 |
2845 | KNOWN ISSUES
2846 |
2847 | NOTES:
2848 |
2849 | MODIFICATION HISTORY
2850 | Date Author Description of Change
2851 |
2852 *============================================================================*/
2853
2854 FUNCTION Inv_Needs_Approving(
2855 p_invoice_id IN NUMBER,
2856 p_run_option IN VARCHAR2,
2857 p_calling_sequence IN VARCHAR2) RETURN BOOLEAN
2858 IS
2859
2860 l_unapproved_dist_exists NUMBER;
2861 l_undistributed_line_exists VARCHAR2(30);
2862 l_debug_loc VARCHAR2(30) := 'Inv_Needs_Approving';
2863 l_curr_calling_sequence VARCHAR2(2000);
2864 l_debug_info VARCHAR2(1000);
2865 l_api_name CONSTANT VARCHAR2(200) := 'Approval_Init';
2866 BEGIN
2867
2868 l_curr_calling_sequence := 'AP_APPROVAL_PKG.'||l_debug_loc||'<-'||
2869 p_calling_sequence;
2870
2871 l_undistributed_line_exists := 'N';
2872
2873 IF (p_run_option = 'New') THEN
2874
2875 SELECT count(*)
2876 INTO l_unapproved_dist_exists
2877 FROM ap_invoice_distributions_all
2878 WHERE invoice_id = p_invoice_id
2879 AND (nvl(match_status_flag, 'N')) = 'N'
2880 AND rownum = 1;
2881
2882 --bugfix:4745464
2883 BEGIN
2884 SELECT 'Y'
2885 INTO l_undistributed_line_exists
2886 FROM ap_invoice_lines_all L
2887 WHERE L.invoice_id = p_invoice_id
2888 AND L.amount <>
2889 (SELECT NVL(SUM(NVL(aid.amount,0)),0)
2890 FROM ap_invoice_distributions_all aid
2891 WHERE aid.invoice_id = L.invoice_id
2892 AND aid.invoice_line_number = L.line_number);
2893 END;
2894
2895 IF (l_unapproved_dist_exists = 0 AND l_undistributed_line_exists = 'N') THEN
2896
2897 l_debug_info := 'Skip Validation: Invoice_Id: ' || p_invoice_id;
2898 -- Print_Debug(l_api_name, l_debug_info);
2899 IF g_debug_mode = 'Y' THEN
2900 AP_Debug_Pkg.Print(g_debug_mode, l_debug_info );
2901 END IF;
2902
2903 IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
2904 FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME||l_api_name,l_debug_info);
2905 END IF;
2906
2907 return(FALSE);
2908 END IF;
2909 END IF;
2910
2911 return(TRUE);
2912
2913 EXCEPTION
2914 WHEN OTHERS THEN
2915 IF (SQLCODE <> -20001) THEN
2916 FND_MESSAGE.SET_NAME('SQLAP','AP_DEBUG');
2917 FND_MESSAGE.SET_TOKEN('ERROR',SQLERRM);
2918 FND_MESSAGE.SET_TOKEN('CALLING_SEQUENCE', l_curr_calling_sequence);
2919 FND_MESSAGE.SET_TOKEN('PARAMETERS',
2920 'Invoice_id = '|| to_char(p_invoice_id)
2921 || 'Run Option = ' || p_run_option);
2922 END IF;
2923 APP_EXCEPTION.RAISE_EXCEPTION;
2924 END Inv_Needs_Approving;
2925
2926 /*=============================================================================
2927 | PROCEDURE Update_Inv_Dists_To_Selected
2928 |
2929 | Procedure given the invoice_id, invoice line number and run option,
2930 | updates the invoice distributions to be selected for approval depending
2931 | on the run option.
2932 | If the run_option is 'New' then we only select distributions that have
2933 | never been processed by approval, otherwise we select all distributions
2934 | that have not successfully been approved.
2935 |
2936 | PARAMETERS
2937 | p_invoice_id - invoice id
2938 | p_line_number - invoice line number
2939 | p_run_option
2940 | p_calling_sequence
2941 |
2942 | KNOWN ISSUES:
2943 |
2944 | NOTES:
2945 |
2946 | MODIFICATION HISTORY
2947 | Date Author Description of Change
2948 |
2949 *============================================================================*/
2950
2951 PROCEDURE Update_Inv_Dists_To_Selected(
2952 p_invoice_id IN NUMBER,
2953 p_line_number IN NUMBER,
2954 p_run_option IN VARCHAR2,
2955 p_calling_sequence IN VARCHAR2) IS
2956
2957 l_debug_loc VARCHAR2(30) := 'Update_Inv_Dists_To_Selected';
2958 l_curr_calling_sequence VARCHAR2(2000);
2959 l_debug_info VARCHAR2(1000);
2960 BEGIN
2961
2962 l_curr_calling_sequence := 'AP_APPROVAL_PKG.'||l_debug_loc||'<-'||
2963 p_calling_sequence;
2964
2965 IF (p_run_option = 'New') THEN
2966
2967 l_debug_info := 'Run Option: New: Set new distribution flag to S';
2968 -- Print_Debug (l_debug_loc,l_debug_info);
2969 IF g_debug_mode = 'Y' THEN
2970 AP_Debug_Pkg.Print(g_debug_mode, l_debug_info );
2971 END IF;
2972
2973 IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
2974 FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME||l_debug_loc,l_debug_info);
2975 END IF;
2976
2977 UPDATE ap_invoice_distributions_all D
2978 SET match_status_flag = 'S'
2979 WHERE NVL(match_status_flag, 'N') = 'N'
2980 AND NVL(D.posted_flag, 'N' ) = 'N' -- Bug 9777752
2981 AND D.invoice_id = p_invoice_id
2982 AND D.invoice_line_number = p_line_number;
2983
2984
2985 --Bug 6963908
2986 UPDATE ap_self_assessed_tax_dist_all D
2987 SET match_status_flag = 'S'
2988 WHERE NVL(match_status_flag, 'N') = 'N'
2989 AND NVL(D.posted_flag, 'N' ) = 'N' -- Bug 9777752
2990 AND D.invoice_id = p_invoice_id
2991 AND D.invoice_line_number = p_line_number;
2992 --Bug 6963908
2993
2994 ELSE
2995
2996 l_debug_info := 'Run Option: All: Set new distribution flag to S';
2997 -- Print_Debug (l_debug_loc,l_debug_info);
2998 IF g_debug_mode = 'Y' THEN
2999 AP_Debug_Pkg.Print(g_debug_mode, l_debug_info );
3000 END IF;
3001
3002 IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
3003 FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME||l_debug_loc,l_debug_info);
3004 END IF;
3005
3006 UPDATE ap_invoice_distributions_all D
3007 SET match_status_flag = 'S'
3008 WHERE NVL(match_status_flag, '!') <> 'A'
3009 AND NVL(D.posted_flag, 'N' ) = 'N' -- Bug 9777752
3010 AND D.invoice_id = p_invoice_id;
3011
3012 --Bug 6963908
3013 UPDATE ap_self_assessed_tax_dist_all D
3014 SET match_status_flag = 'S'
3015 WHERE NVL(match_status_flag, '!') <> 'A'
3016 AND NVL(D.posted_flag, 'N' ) = 'N' -- Bug 9777752
3017 AND D.invoice_id = p_invoice_id;
3018 --Bug 6963908
3019
3020 END IF;
3021
3022 EXCEPTION
3023 WHEN OTHERS THEN
3024 IF (SQLCODE <> -20001) THEN
3025 FND_MESSAGE.SET_NAME('SQLAP','AP_DEBUG');
3026 FND_MESSAGE.SET_TOKEN('ERROR',SQLERRM);
3027 FND_MESSAGE.SET_TOKEN('CALLING_SEQUENCE', l_curr_calling_sequence);
3028 FND_MESSAGE.SET_TOKEN('PARAMETERS',
3029 'Invoice_id = '|| to_char(p_invoice_id)
3030 || 'Run Option = ' || p_run_option);
3031 FND_MESSAGE.SET_TOKEN('DEBUG_INFO',l_debug_info);
3032 END IF;
3033 APP_EXCEPTION.RAISE_EXCEPTION;
3034 END Update_Inv_Dists_To_Selected;
3035
3036
3037 /*=============================================================================
3038 | PUBLIC PROCEDURE Check_Insufficient_Line_Data
3039 |
3040 | DESCRIPTION:
3041 | Check all the line information before Distribution generated
3042 | PARAMETERS
3043 | p_inv_line_rec
3044 | p_system_user
3045 | p_holds
3046 | p_holds_count
3047 | p_release_count
3048 | p_insufficent_data_exist - boolean indicates if a hold is existing
3049 | p_calling_sequence
3050 |
3051 | PROGRAM FLOW
3052 | Check for Sufficient Line Data in a priliminary level
3053 | KNOWN ISSUES:
3054 |
3055 | NOTES:
3056 |
3057 | MODIFICATION HISTORY
3058 | Date Author Description of Change
3059 |
3060 *============================================================================*/
3061
3062 PROCEDURE Check_Insufficient_Line_Data(
3063 p_inv_line_rec IN AP_INVOICES_PKG.r_invoice_line_rec,
3064 p_system_user IN NUMBER,
3065 p_holds IN OUT NOCOPY HOLDSARRAY,
3066 p_holds_count IN OUT NOCOPY COUNTARRAY,
3067 p_release_count IN OUT NOCOPY COUNTARRAY,
3068 p_insufficient_data_exist OUT NOCOPY BOOLEAN,
3069 p_calling_mode IN VARCHAR2,
3070 p_calling_sequence IN VARCHAR2)
3071 IS
3072
3073 CURSOR Alloc_Rule_Cur IS
3074 SELECT ALOC.rule_type
3075 FROM ap_invoice_lines AIL,
3076 ap_allocation_rules ALOC
3077 WHERE AIL.invoice_id = p_inv_line_rec.invoice_id
3078 AND AIL.line_number = p_inv_line_rec.line_number
3079 AND AIL.invoice_id = ALOC.invoice_id
3080 AND AIL.line_number = ALOC.chrg_invoice_line_number(+);
3081
3082 l_debug_loc VARCHAR2(30) := 'Check_Insufficient_Line_Data';
3083 l_curr_calling_sequence VARCHAR2(2000);
3084 l_debug_info VARCHAR2(1000);
3085 l_ret_val BOOLEAN;
3086 l_should_have_hold VARCHAR2(1) := 'N';
3087 l_alloc_rule_type ap_allocation_rules.rule_type%TYPE;
3088 l_product_registered BOOLEAN;
3089 l_dummy VARCHAR2(100);
3090
3091 BEGIN
3092
3093 l_curr_calling_sequence := 'AP_APPROVAL_PKG.'||l_debug_loc||
3094 '<-'||p_calling_sequence;
3095
3096 p_insufficient_data_exist := FALSE;
3097
3098 OPEN Alloc_Rule_Cur;
3099 FETCH Alloc_Rule_Cur INTO l_alloc_rule_type;
3100 IF (Alloc_Rule_Cur%NOTFOUND) THEN
3101 l_alloc_rule_type := NULL;
3102 END IF;
3103 CLOSE Alloc_Rule_Cur;
3104
3105 IF (Is_Product_Registered(
3106 P_application_id => p_inv_line_rec.application_id,
3107 X_registration_api => l_dummy,
3108 X_registration_view => l_dummy,
3109 P_calling_sequence => l_curr_calling_sequence)) THEN
3110 l_product_registered := TRUE;
3111 ELSE
3112 l_product_registered := FALSE;
3113 END IF;
3114
3115 ----
3116 l_debug_info := 'processing info for line number: '||p_inv_line_rec.line_number
3117 ||' l_alloc_rule_type: '||l_alloc_rule_type
3118 || ' project_id: '||p_inv_line_rec.project_id
3119 ||' generate_dists: '||p_inv_line_rec.generate_dists;
3120 -- Print_Debug(l_debug_loc, l_debug_info);
3121 IF g_debug_mode = 'Y' THEN
3122 AP_Debug_Pkg.Print(g_debug_mode, l_debug_info );
3123 END IF;
3124
3125 IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
3126 FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME||l_debug_loc,l_debug_info);
3127 END IF;
3128 ----
3129
3130 IF (p_inv_line_rec.generate_dists = 'Y'
3131 and p_inv_line_rec.distribution_set_id IS NULL
3132 and p_inv_line_rec.default_dist_ccid IS NULL
3133 and l_alloc_rule_type IS NULL
3134 and p_inv_line_rec.project_id IS NULL
3135 and NOT l_product_registered) THEN
3136
3137 l_debug_info := 'should have hold for line: '||p_inv_line_rec.line_number;
3138 -- Print_Debug(l_debug_loc, l_debug_info);
3139 IF g_debug_mode = 'Y' THEN
3140 AP_Debug_Pkg.Print(g_debug_mode, l_debug_info );
3141 END IF;
3142
3143 IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
3144 FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME||l_debug_loc,l_debug_info);
3145 END IF;
3146
3147 l_should_have_hold := 'Y';
3148 p_insufficient_data_exist := TRUE;
3149 END IF;
3150
3151 IF (p_calling_mode = 'PERMANENT_DISTRIBUTIONS') THEN
3152 Process_Inv_Hold_Status(
3153 p_inv_line_rec.invoice_id,
3154 null,
3155 null,
3156 'INSUFFICIENT LINE INFO',
3157 l_should_have_hold,
3158 null,
3159 p_system_user,
3160 p_holds,
3161 p_holds_count,
3162 p_release_count,
3163 l_curr_calling_sequence);
3164 END IF;
3165
3166 EXCEPTION
3167 WHEN OTHERS THEN
3168 IF (SQLCODE <> -20001) THEN
3169 FND_MESSAGE.SET_NAME('SQLAP','AP_DEBUG');
3170 FND_MESSAGE.SET_TOKEN('ERROR',SQLERRM);
3171 FND_MESSAGE.SET_TOKEN('CALLING_SEQUENCE', l_curr_calling_sequence);
3172 FND_MESSAGE.SET_TOKEN('PARAMETERS',
3173 'Invoice_id = '|| to_char(p_inv_line_rec.invoice_id));
3174 FND_MESSAGE.SET_TOKEN('DEBUG_INFO',l_debug_info);
3175 END IF;
3176
3177 IF ( Alloc_Rule_Cur%ISOPEN ) THEN
3178 CLOSE Alloc_Rule_Cur;
3179 END IF;
3180
3181 APP_EXCEPTION.RAISE_EXCEPTION;
3182 END Check_Insufficient_Line_Data;
3183
3184
3185 /*=============================================================================
3186 | PUBLIC PROCEDURE Execute_Dist_Generation_Check
3187 |
3188 | DESCRIPTION:
3189 | Call API to generate Distribution from distribution set or
3190 | generate distribution based on allocation/default account
3191 | information. Handle the error code detected during dist.
3192 | generation. Process/Release corresponding Hold.
3193 | PARAMETERS
3194 | p_batch_id
3195 | p_invoice_date
3196 | p_vendor_id
3197 | p_invoice_currency
3198 | p_exchange_rate
3199 | p_exchange_rate_type
3200 | p_exchange_date
3201 | p_inv_line_rec
3202 | p_system_user
3203 | p_holds
3204 | p_holds_count
3205 | p_release_count
3206 | p_curr_calling_sequence
3207 |
3208 | PROGRAM FLOW
3209 |
3210 | KNOWN ISSUES
3211 |
3212 | NOTES:
3213 |
3214 | MODIFICATION HISTORY
3215 | Date Author Description of Change
3216 |
3217 *============================================================================*/
3218
3219 FUNCTION Execute_Dist_Generation_Check(
3220 p_batch_id IN NUMBER,
3221 p_invoice_date IN DATE,
3222 p_vendor_id IN NUMBER,
3223 p_invoice_currency IN VARCHAR2,
3224 p_exchange_rate IN NUMBER,
3225 p_exchange_rate_type IN VARCHAR2,
3226 p_exchange_date IN DATE,
3227 p_inv_line_rec IN AP_INVOICES_PKG.r_invoice_line_rec,
3228 p_system_user IN NUMBER,
3229 p_holds IN OUT NOCOPY HOLDSARRAY,
3230 p_holds_count IN OUT NOCOPY COUNTARRAY,
3231 p_release_count IN OUT NOCOPY COUNTARRAY,
3232 p_generate_permanent IN VARCHAR2,
3233 p_calling_mode IN VARCHAR2 ,
3234 p_error_code OUT NOCOPY VARCHAR2,
3235 p_curr_calling_sequence IN VARCHAR2) RETURN BOOLEAN
3236 IS
3237
3238 CURSOR Alloc_Rule_Cur IS
3239 SELECT ALOC.rule_type
3240 FROM ap_invoice_lines AIL,
3241 ap_allocation_rules ALOC
3242 WHERE AIL.invoice_id = p_inv_line_rec.invoice_id
3243 AND AIL.line_number = p_inv_line_rec.line_number
3244 AND AIL.invoice_id = ALOC.invoice_id
3245 AND AIL.line_number = ALOC.chrg_invoice_line_number(+);
3246
3247 l_debug_loc VARCHAR2(30) := 'Execute_Dist_Generation_Check';
3248 l_curr_calling_sequence VARCHAR2(2000);
3249 l_debug_info VARCHAR2(2000);
3250 l_alloc_rule_type ap_allocation_rules.rule_type%TYPE;
3251
3252 l_debug_context VARCHAR2(2000);
3253 l_msg_application VARCHAR2(25);
3254 l_error_code VARCHAR2(4000);
3255 l_msg_data VARCHAR2(200); /*bug12612482 changed 30 to 200*/
3256 l_hold_code VARCHAR2(30);
3257 l_success BOOLEAN := FALSE;
3258 l_gen_dist_hold_exists VARCHAR2(1) := 'N';
3259
3260 --Bugfix:4673607
3261 l_registration_api VARCHAR2(1000);
3262 l_registration_view VARCHAR2(1000);
3263 l_reference_key1 ap_invoice_lines_all.reference_key1%type;
3264 l_reference_key2 ap_invoice_lines_all.reference_key2%type;
3265 l_reference_key3 ap_invoice_lines_all.reference_key3%type;
3266 l_reference_key4 ap_invoice_lines_all.reference_key4%type;
3267 l_reference_key5 ap_invoice_lines_all.reference_key5%type;
3268 l_err varchar2(2000);
3269
3270 BEGIN
3271
3272 l_curr_calling_sequence := 'AP_APPROVAL_PKG.'||l_debug_loc||'<-'||
3273 p_curr_calling_sequence;
3274
3275 ----------------------------------------------------------------------
3276 l_debug_info := 'Input Parameters: '||' invoice id: ' ||p_inv_line_rec.invoice_id
3277 ||' line_number: ' ||p_inv_line_rec.line_number
3278 ||' generate_dists: ' ||p_inv_line_rec.generate_dists
3279 ||' distribution_set_id: '||p_inv_line_rec.distribution_set_id
3280 ||' accouting_date: ' ||p_inv_line_rec.accounting_date
3281 ||' period_name: ' ||p_inv_line_rec.period_name;
3282 -- Print_Debug(l_debug_loc, l_debug_info);
3283 IF g_debug_mode = 'Y' THEN
3284 AP_Debug_Pkg.Print(g_debug_mode, l_debug_info );
3285 END IF;
3286
3287 IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
3288 FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME||l_debug_loc,l_debug_info);
3289 END IF;
3290 ----------------------------------------------------------------------
3291
3292 IF (Is_Product_Registered(P_application_id => p_inv_line_rec.application_id,
3293 X_registration_api => l_registration_api,
3294 X_registration_view => l_registration_view,
3295 P_calling_sequence => l_curr_calling_sequence)) THEN
3296
3297 ----------------------------------------------------------------------
3298 l_debug_info := 'Call the api that will create the distributions '||
3299 'based on the other products registered view/api';
3300 -- Print_Debug(l_debug_loc, l_debug_info);
3301 IF g_debug_mode = 'Y' THEN
3302 AP_Debug_Pkg.Print(g_debug_mode, l_debug_info );
3303 END IF;
3304
3305 IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
3306 FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME||l_debug_loc,l_debug_info);
3307 END IF;
3308 ----------------------------------------------------------------------
3309
3310 l_success := Gen_Dists_From_Registration(
3311 P_Batch_Id => p_batch_id,
3312 P_Invoice_Line_Rec => p_inv_line_rec,
3313 P_Registration_Api => l_registration_api,
3314 P_Registration_View => l_registration_view,
3315 P_Generate_Permanent => p_generate_permanent,
3316 X_Error_Code => l_error_code,
3317 P_Calling_Sequence => l_curr_calling_sequence);
3318
3319
3320 ELSIF ( p_inv_line_rec.distribution_set_id is not null) THEN
3321
3322 /*-----------------------------------------------------------------+
3323 | CASE 1 - Generate distribution from distribution set |
3324 +-----------------------------------------------------------------*/
3325
3326 l_debug_info := 'Execute_Dist_Generation_Check - insert from dist set';
3327 -- Print_Debug(l_debug_loc, l_debug_info);
3328 IF g_debug_mode = 'Y' THEN
3329 AP_Debug_Pkg.Print(g_debug_mode, l_debug_info );
3330 END IF;
3331
3332 IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
3333 FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME||l_debug_loc,l_debug_info);
3334 END IF;
3335
3336 l_success := AP_INVOICE_LINES_PKG.Insert_From_Dist_Set(
3337 X_invoice_id => p_inv_line_rec.invoice_id,
3338 X_line_number => p_inv_line_rec.line_number,
3339 X_GL_Date => p_inv_line_rec.accounting_date,
3340 X_Period_Name => p_inv_line_rec.period_name,
3341 X_Skeleton_Allowed => 'Y', -- Bug 4928285
3342 X_Generate_Dists => p_inv_line_rec.generate_dists,
3343 X_Generate_Permanent => p_generate_permanent,
3344 X_Error_Code => l_error_code,
3345 X_Debug_Info => l_debug_info,
3346 X_Debug_Context => l_debug_context,
3347 X_Msg_Application => l_msg_application,
3348 X_Msg_Data => l_msg_data,
3349 X_calling_sequence => l_curr_calling_sequence);
3350
3351 IF ( NOT l_success ) THEN
3352
3353 IF ( l_error_code is not null ) THEN
3354
3355 IF (p_calling_mode = 'PERMANENT_DISTRIBUTIONS') THEN
3356
3357 CASE l_error_code
3358 WHEN 'AP_VEN_DIST_SET_INVALID' THEN
3359 l_hold_code := 'DISTRIBUTION SET INACTIVE';
3360 WHEN 'AP_CANT_USE_SKELETON_DIST_SET' THEN
3361 l_hold_code := 'SKELETON DISTRIBUTION SET';
3362 WHEN 'AP_CANNOT_OVERLAY' THEN
3363 l_hold_code := 'CANNOT OVERLAY ACCOUNT';
3364 WHEN 'AP_INVALID_CCID' THEN
3365 l_hold_code := 'INVALID DEFAULT ACCOUNT';
3366 ELSE
3367 l_hold_code := null;
3368 END CASE;
3369
3370 ELSIF (p_calling_mode = 'CANDIDATE_DISTRIBUTIONS') THEN
3371
3372 p_error_code := l_error_code;
3373
3374 END IF;
3375
3376 l_debug_info := 'Execute_Dist_Generation_Check: Error Code: ' || l_error_code;
3377 -- Print_Debug(l_debug_loc, l_debug_info);
3378 IF g_debug_mode = 'Y' THEN
3379 AP_Debug_Pkg.Print(g_debug_mode, l_debug_info );
3380 END IF;
3381
3382 IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
3383 FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME||l_debug_loc,l_debug_info);
3384 END IF;
3385
3386 ELSE
3387
3388 IF (p_calling_mode = 'CANDIDATE_DISTRIBUTIONS') THEN
3389 p_error_code := l_debug_info;
3390
3391 END IF;
3392
3393 END IF; /*l_error_code is not null*/
3394
3395 END IF; -- end of check l_success
3396
3397 ELSE
3398
3399 /*-----------------------------------------------------------------+
3400 | CASE 2 - Generate distribution without distribution set info |
3401 +-----------------------------------------------------------------*/
3402
3403 OPEN Alloc_Rule_Cur;
3404 FETCH Alloc_Rule_Cur INTO l_alloc_rule_type;
3405 IF (Alloc_Rule_Cur%NOTFOUND) THEN
3406 l_alloc_rule_type := NULL;
3407 END IF;
3408 CLOSE Alloc_Rule_Cur;
3409
3410 IF ( p_inv_line_rec.line_type_lookup_code in ('FREIGHT', 'MISCELLANEOUS' ) and
3411 l_alloc_rule_type is not null ) THEN
3412
3413 /*-----------------------------------------------------------------+
3414 | CASE 2.1 - Generate distribution for charge line if there is an |
3415 | allocation rule |
3416 +-----------------------------------------------------------------*/
3417
3418 l_debug_info := 'Execute_Dist_Generation_Check - charge line with an allocation rule';
3419 -- Print_Debug(l_debug_loc, l_debug_info);
3420 IF g_debug_mode = 'Y' THEN
3421 AP_Debug_Pkg.Print(g_debug_mode, l_debug_info );
3422 END IF;
3423
3424 IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
3425 FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME||l_debug_loc,l_debug_info);
3426 END IF;
3427
3428 l_success := AP_INVOICE_DISTRIBUTIONS_PKG.Insert_Charge_From_Alloc(
3429 X_invoice_id => p_inv_line_rec.invoice_id,
3430 X_line_number => p_inv_line_rec.line_number,
3431 X_Generate_Permanent => p_generate_permanent,
3432 X_Validate_Info => TRUE,
3433 X_Error_Code => l_error_code,
3434 X_Debug_Info => l_debug_info,
3435 X_Debug_Context => l_debug_context,
3436 X_Msg_Application => l_msg_application,
3437 X_Msg_Data => l_msg_data,
3438 X_Calling_Sequence => l_curr_calling_sequence );
3439
3440 IF ( NOT l_success ) THEN
3441 IF ( l_error_code is not null ) THEN
3442
3443 IF (p_calling_mode = 'PERMANENT_DISTRIBUTIONS') THEN
3444 IF ( l_error_code IN ( 'AP_NO_ALLOCATION_RULE_FOUND',
3445 'AP_ALLOCATION_ALREADY_EXECUTED',
3446 'AP_NON_FULL_INVOICE',
3447 'AP_UNDISTRIBUTED_LINE_EXISTS',
3448 'AP_IMPROPER_LINE_IN_ALLOC_RULE',
3449 'AP_CANNOT_READ_EXP_DATE',
3450 'AP_INVALID_ACCOUNT',
3451 'AP_CANNOT_OVERLAY',
3452 'AP_NO_OPEN_PERIOD',
3453 'AP_GL_DATE_PA_NOT_OPEN' ) ) THEN
3454 l_hold_code := 'CANNOT EXECUTE ALLOCATION';
3455 ELSE
3456 l_hold_code := null;
3457 END IF;
3458
3459 ELSIF (p_calling_mode = 'CANDIDATE_DISTRIBUTIONS') THEN
3460 p_error_code := l_error_code;
3461 END IF;
3462
3463 l_debug_info := 'Execute_Dist_Generation_Check - ' ||
3464 'Insert_Charge_From_Alloc error ' || l_error_code;
3465 -- Print_Debug (l_debug_loc, l_debug_info);
3466 IF g_debug_mode = 'Y' THEN
3467 AP_Debug_Pkg.Print(g_debug_mode, l_debug_info );
3468 END IF;
3469
3470 IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
3471 FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME||l_debug_loc,l_debug_info);
3472 END IF;
3473
3474 END IF; -- end of check l_error_code
3475 END IF; -- end of check l_success
3476 --8346277
3477 ELSIF (p_inv_line_rec.line_type_lookup_code in ('AWT' )
3478 AND p_inv_line_rec.line_source ='MANUAL LINE ENTRY') THEN
3479
3480 /*-----------------------------------------------------------------+
3481 | CASE 2.2.1 - Generate distribution for non-match item line or no |
3482 | allocation rule charge line |
3483 +-----------------------------------------------------------------*/
3484
3485 l_debug_info := 'Execute_Dist_Generation_Check - Insert_AWT_Dist_From_Line';
3486 -- Print_Debug(l_debug_loc, l_debug_info);
3487 IF g_debug_mode = 'Y' THEN
3488 AP_Debug_Pkg.Print(g_debug_mode, l_debug_info );
3489 END IF;
3490
3491 IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
3492 FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME||l_debug_loc,l_debug_info);
3493 END IF;
3494
3495 l_success := AP_INVOICE_DISTRIBUTIONS_PKG.Insert_AWT_Dist_From_Line(
3496 X_batch_id => p_batch_id,
3497 X_invoice_id => p_inv_line_rec.invoice_id,
3498 X_invoice_date => p_invoice_date,
3499 X_vendor_id => p_vendor_id,
3500 X_invoice_currency => p_invoice_currency,
3501 X_exchange_rate => p_exchange_rate,
3502 X_exchange_rate_type => p_exchange_rate_type,
3503 X_exchange_date => p_exchange_date,
3504 X_line_number => p_inv_line_rec.line_number,
3505 X_invoice_lines_rec => NULL,
3506 X_line_source => 'VALIDATION',
3507 X_Generate_Permanent => p_generate_permanent,
3508 X_Validate_Info => TRUE,
3509 X_Error_Code => l_error_code,
3510 X_Debug_Info => l_debug_info,
3511 X_Debug_Context => l_debug_context,
3512 X_Msg_Application => l_msg_application,
3513 X_Msg_Data => l_msg_data,
3514 X_Calling_Sequence => l_curr_calling_sequence);
3515
3516
3517 IF l_success = FALSE THEN
3518
3519 FND_MESSAGE.SET_NAME('SQLAP','AP_DEBUG');
3520 FND_MESSAGE.SET_TOKEN('ERROR',SQLERRM);
3521 FND_MESSAGE.SET_TOKEN('CALLING_SEQUENCE', l_curr_calling_sequence);
3522 FND_MESSAGE.SET_TOKEN('DEBUG_INFO',l_debug_info);
3523 FND_MESSAGE.SET_TOKEN('l_error_code',l_error_code);
3524 FND_MESSAGE.SET_TOKEN('PARAMETERS','fail '|| 'Invoice_id = '|| to_char(p_inv_line_rec.invoice_id));
3525 FND_MESSAGE.SET_TOKEN('DEBUG_INFO',l_debug_info);
3526 APP_EXCEPTION.RAISE_EXCEPTION;
3527
3528 END IF;
3529 ELSE
3530
3531 /*-----------------------------------------------------------------+
3532 | CASE 2.2 - Generate distribution for non-match item line or no |
3533 | allocation rule charge line |
3534 +-----------------------------------------------------------------*/
3535
3536 l_debug_info := 'Execute_Dist_Generation_Check - Insert_Single_Dist_From_Line';
3537 -- Print_Debug(l_debug_loc, l_debug_info);
3538 IF g_debug_mode = 'Y' THEN
3539 AP_Debug_Pkg.Print(g_debug_mode, l_debug_info );
3540 END IF;
3541
3542 IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
3543 FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME||l_debug_loc,l_debug_info);
3544 END IF;
3545
3546 l_success := AP_INVOICE_DISTRIBUTIONS_PKG.Insert_Single_Dist_From_Line(
3547 X_batch_id => p_batch_id,
3548 X_invoice_id => p_inv_line_rec.invoice_id,
3549 X_invoice_date => p_invoice_date,
3550 X_vendor_id => p_vendor_id,
3551 X_invoice_currency => p_invoice_currency,
3552 X_exchange_rate => p_exchange_rate,
3553 X_exchange_rate_type => p_exchange_rate_type,
3554 X_exchange_date => p_exchange_date,
3555 X_line_number => p_inv_line_rec.line_number,
3556 X_invoice_lines_rec => NULL,
3557 X_line_source => 'VALIDATION',
3558 X_Generate_Permanent => p_generate_permanent,
3559 X_Validate_Info => TRUE,
3560 X_Error_Code => l_error_code,
3561 X_Debug_Info => l_debug_info,
3562 X_Debug_Context => l_debug_context,
3563 X_Msg_Application => l_msg_application,
3564 X_Msg_Data => l_msg_data,
3565 X_Calling_Sequence => l_curr_calling_sequence);
3566
3567 IF ( NOT l_success ) THEN
3568 IF ( l_error_code is not null ) THEN
3569
3570 IF (p_calling_mode = 'PERMANENT_DISTRIBUTIONS') THEN
3571
3572 CASE l_error_code
3573 WHEN 'INVALID_ACCOUNT' THEN
3574 l_hold_code := 'INVALID DEFAULT ACCT';
3575 WHEN 'CANNOT_OVERLAY' THEN
3576 l_hold_code := 'CANNOT OVERLAY ACCOUNT';
3577 WHEN 'NOT_OPEN_PERIOD' THEN
3578 -- attention: need to confirm later
3579 l_hold_code := 'PERIOD CLOSED';
3580 WHEN 'GL_DATE_PA_NOT_OPEN' THEN
3581 l_hold_code := 'PROJECT GL DATE CLOSED';
3582 ELSE
3583 l_hold_code := null;
3584 END CASE;
3585
3586 ELSIF (p_calling_mode = 'CANDIDATE_DISTRIBUTIONS') THEN
3587
3588 p_error_code := l_error_code;
3589
3590 END IF; /*p_calling_mode = 'PERMANENT_DISTRIBUTIONS' */
3591
3592 l_debug_info := 'Execute_Dist_Generation_Check-insert from dist'
3593 || ' set has error - ' || l_error_code ;
3594 -- Print_Debug(l_debug_loc, l_debug_info);
3595 IF g_debug_mode = 'Y' THEN
3596 AP_Debug_Pkg.Print(g_debug_mode, l_debug_info );
3597 END IF;
3598
3599 IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
3600 FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME||l_debug_loc,l_debug_info);
3601 END IF;
3602
3603 END IF; -- end of check l_error_code
3604 END IF; -- end of check l_success
3605 END IF; -- end of p_inv_line_rec.line_type_lookup_code check
3606 END IF; -- end of p_inv_line_rec.distribution_set_id check
3607
3608 /*-----------------------------------------------------------------+
3609 | To process the error code and the put hold if necessary |
3610 +-----------------------------------------------------------------*/
3611
3612 IF ( NOT l_success and l_hold_code is not null ) THEN
3613 l_gen_dist_hold_exists := 'Y';
3614
3615 l_debug_info := 'Execute_Dist_Generation_Check - Process hold code';
3616 -- Print_Debug(l_debug_loc, l_debug_info);
3617 IF g_debug_mode = 'Y' THEN
3618 AP_Debug_Pkg.Print(g_debug_mode, l_debug_info );
3619 END IF;
3620
3621 IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
3622 FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME||l_debug_loc,l_debug_info);
3623 END IF;
3624
3625 --BUGFIX:5685469
3626 --Need to release the holds (related to distribution generation) placed in earlier calls of
3627 --validation
3628 ELSIF (p_calling_mode = 'PERMANENT_DISTRIBUTIONS' AND l_success AND l_hold_code IS NULL) THEN
3629
3630 BEGIN
3631
3632 l_debug_info := 'Release any holds related to distribution generation which were placed earlier';
3633 -- Print_Debug(l_debug_loc, l_debug_info);
3634 IF g_debug_mode = 'Y' THEN
3635 AP_Debug_Pkg.Print(g_debug_mode, l_debug_info );
3636 END IF;
3637
3638 IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
3639 FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME||l_debug_loc,l_debug_info);
3640 END IF;
3641
3642 IF ( p_inv_line_rec.distribution_set_id is not null) THEN
3643
3644 SELECT hold_lookup_code
3645 INTO l_hold_code
3646 FROM ap_holds_all
3647 WHERE invoice_id = p_inv_line_rec.invoice_id
3648 AND hold_lookup_code in ('DISTRIBUTION SET INACTIVE','SKELETON DISTRIBUTION SET',
3649 'CANNOT OVERLAY ACCOUNT','INVALID DEFAULT ACCOUNT')
3650 AND release_lookup_code IS NULL;
3651
3652 ELSIF ( p_inv_line_rec.line_type_lookup_code in ('FREIGHT', 'MISCELLANEOUS' ) and
3653 l_alloc_rule_type is not null ) THEN
3654
3655 SELECT hold_lookup_code
3656 INTO l_hold_code
3657 FROM ap_holds_all
3658 WHERE invoice_id = p_inv_line_rec.invoice_id
3659 AND hold_lookup_code = 'CANNOT EXECUTE ALLOCATION'
3660 AND release_lookup_code IS NULL;
3661
3662 ELSE
3663
3664 SELECT hold_lookup_code
3665 INTO l_hold_code
3666 FROM ap_holds_all
3667 WHERE invoice_id = p_inv_line_rec.invoice_id
3668 AND hold_lookup_code in ('CANNOT OVERLAY ACCOUNT','INVALID DEFAULT ACCOUNT',
3669 'PERIOD CLOSED','PROJECT GL DATE CLOSED')
3670 AND release_lookup_code IS NULL;
3671
3672 END IF;
3673
3674 EXCEPTION WHEN OTHERS THEN
3675 /* l_err := sqlerrm;
3676 l_debug_info := 'in others exception '||l_err;
3677 Print_Debug(l_debug_loc, l_debug_info); */
3678
3679 NULL;
3680 END ;
3681
3682 END IF;
3683
3684
3685 --Etax: Validation. Added the IF condition so that when this
3686 --procedure is called from funds_check, we not process any holds.
3687 IF (p_calling_mode = 'PERMANENT_DISTRIBUTIONS') THEN
3688 Process_Inv_Hold_Status(
3689 p_inv_line_rec.invoice_id,
3690 null,
3691 null,
3692 l_hold_code,
3693 l_gen_dist_hold_exists,
3694 null,
3695 p_system_user,
3696 p_holds,
3697 p_holds_count,
3698 p_release_count,
3699 l_curr_calling_sequence);
3700 END IF;
3701
3702 RETURN ( l_success );
3703
3704 EXCEPTION
3705 WHEN OTHERS THEN
3706 IF (SQLCODE <> -20001) THEN
3707 FND_MESSAGE.SET_NAME('SQLAP','AP_DEBUG');
3708 FND_MESSAGE.SET_TOKEN('ERROR',SQLERRM);
3709 FND_MESSAGE.SET_TOKEN('CALLING_SEQUENCE', l_curr_calling_sequence);
3710 FND_MESSAGE.SET_TOKEN('PARAMETERS',
3711 'Invoice_id = '|| to_char(p_inv_line_rec.invoice_id));
3712 FND_MESSAGE.SET_TOKEN('DEBUG_INFO',l_debug_info);
3713 END IF;
3714
3715 IF ( Alloc_Rule_Cur%ISOPEN ) THEN
3716 CLOSE Alloc_Rule_Cur;
3717 END IF;
3718 APP_EXCEPTION.RAISE_EXCEPTION;
3719
3720 END Execute_Dist_Generation_Check;
3721
3722
3723 /*=============================================================================
3724 | PROCEDURE EXECUTE_GENERAL_CHECKS
3725 | Procedure that checks general information hold at invoice level and
3726 | invoice distribution level.
3727 |
3728 | PARAMETER
3729 | p_invoice_id
3730 | p_set_of_books_id
3731 | p_base_currency_code
3732 | p_invoice_amount
3733 | p_base_amount
3734 | p_invoice_currency_code
3735 | p_invoice_amount_limit
3736 | p_hold_future_payments_flag
3737 | p_system_user
3738 | p_holds
3739 | p_holds_count
3740 | p_release_count
3741 | p_calling_sequence
3742 |
3743 | PROGRAM FLOW
3744 | 1. Check for Invalid Dist Acct - set or release hold
3745 | 2. Check for PO Required - set or release hold
3746 | 3. Check for Missing Exchange Rate - set or release hold
3747 | 4. Check for UnOpen Future Period - set or release hold
3748 | 5. Check for Invoice Limit and vendor holds - set or release hold
3749 | 6. Check for project information
3750 | 7. Check for AWT manual segment - comment out for now
3751 | 8. Check for Prepayment amount - comment out for now
3752 |
3753 | KNOWN ISSUES:
3754 |
3755 | NOTES:
3756 |
3757 | MODIFICATION HISTORY
3758 | Date Author Description of Change
3759 ============================================================================*/
3760
3761
3762 PROCEDURE Execute_General_Checks(
3763 p_invoice_id IN NUMBER,
3764 p_set_of_books_id IN NUMBER,
3765 p_base_currency_code IN VARCHAR2,
3766 p_invoice_amount IN NUMBER,
3767 p_base_amount IN NUMBER,
3768 p_invoice_currency_code IN VARCHAR2,
3769 p_invoice_amount_limit IN NUMBER,
3770 p_hold_future_payments_flag IN VARCHAR2,
3771 p_system_user IN NUMBER,
3772 p_holds IN OUT NOCOPY HOLDSARRAY,
3773 p_holds_count IN OUT NOCOPY COUNTARRAY,
3774 p_release_count IN OUT NOCOPY COUNTARRAY,
3775 p_calling_sequence IN VARCHAR2) IS
3776
3777 l_debug_loc VARCHAR2(30) := 'Execute_General_Checks';
3778 l_curr_calling_sequence VARCHAR2(2000);
3779 l_debug_info VARCHAR2(1000);
3780
3781 -- 8691645
3782 l_vendor_id AP_INVOICES.VENDOR_ID%TYPE;
3783 l_vendor_site_id AP_INVOICES.VENDOR_SITE_ID%TYPE;
3784 l_remit_to_supplier_site_id AP_INVOICES.REMIT_TO_SUPPLIER_SITE_ID%TYPE;
3785 l_invoice_type_lookup_code AP_INVOICES.INVOICE_TYPE_LOOKUP_CODE%TYPE;
3786 l_vendor_site_reg_expired varchar2(1);
3787
3788 BEGIN
3789
3790 l_curr_calling_sequence := 'AP_APPROVAL_PKG.'||l_debug_loc||'<-'||
3791 p_calling_sequence;
3792
3793 ---------------------------------------------------
3794 l_debug_info := 'Execute_General_Checks: '
3795 ||' invoice id: ' ||p_invoice_id
3796 ||' set of books id: ' ||p_set_of_books_id
3797 ||' base currency code: ' ||p_base_currency_code
3798 ||' invoice amount: ' ||p_invoice_amount
3799 ||' inv base amount: ' ||p_base_amount
3800 ||' inv currency code: ' ||p_invoice_currency_code
3801 ||' invoice amount limit: '||p_invoice_amount_limit
3802 ||' hold future pay flag: '||p_hold_future_payments_flag;
3803
3804 -- Print_Debug(l_debug_loc, l_debug_info);
3805 IF g_debug_mode = 'Y' THEN
3806 AP_Debug_Pkg.Print(g_debug_mode, l_debug_info );
3807 END IF;
3808
3809 IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
3810 FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME||l_debug_loc,l_debug_info);
3811 END IF;
3812 ---------------------------------------------------
3813
3814 -- Bug 7158219
3815 ---------------------------------------------------
3816 l_debug_info := 'Check Invalid Distribution Account';
3817 -- Print_Debug(l_debug_loc, l_debug_info);
3818 IF g_debug_mode = 'Y' THEN
3819 AP_Debug_Pkg.Print(g_debug_mode, l_debug_info );
3820 END IF;
3821
3822 IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
3823 FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME||l_debug_loc,l_debug_info);
3824 END IF;
3825 ---------------------------------------------------
3826
3827 Check_Invalid_Dist_Acct(
3828 p_invoice_id,
3829 p_system_user,
3830 p_holds,
3831 p_holds_count,
3832 p_release_count,
3833 l_curr_calling_sequence);
3834
3835 ---------------------------------------------------
3836 l_debug_info := 'Check PO Required';
3837 -- Print_Debug(l_debug_loc, l_debug_info);
3838 IF g_debug_mode = 'Y' THEN
3839 AP_Debug_Pkg.Print(g_debug_mode, l_debug_info );
3840 END IF;
3841
3842 IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
3843 FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME||l_debug_loc,l_debug_info);
3844 END IF;
3845 ---------------------------------------------------
3846 Check_PO_Required(
3847 p_invoice_id,
3848 p_system_user,
3849 p_holds,
3850 p_holds_count,
3851 p_release_count,
3852 l_curr_calling_sequence);
3853
3854 ---------------------------------------------------
3855 l_debug_info := 'Check for Missing Exchange Rate';
3856 -- Print_Debug(l_debug_loc, l_debug_info);
3857 IF g_debug_mode = 'Y' THEN
3858 AP_Debug_Pkg.Print(g_debug_mode, l_debug_info );
3859 END IF;
3860
3861 IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
3862 FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME||l_debug_loc,l_debug_info);
3863 END IF;
3864 ---------------------------------------------------
3865 Check_No_Rate(
3866 p_invoice_id,
3867 p_base_currency_code,
3868 p_system_user,
3869 p_holds,
3870 p_holds_count,
3871 p_release_count,
3872 l_curr_calling_sequence);
3873
3874 --bug9296410
3875 ---------------------------------------------------
3876 l_debug_info := 'Check for Project Commitments For Retainage invoices ';
3877 -- Print_Debug(l_debug_loc, l_debug_info);
3878 IF g_debug_mode = 'Y' THEN
3879 AP_Debug_Pkg.Print(g_debug_mode, l_debug_info );
3880 END IF;
3881
3882 IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
3883 FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME||l_debug_loc,l_debug_info);
3884 END IF;
3885 ---------------------------------------------------
3886
3887 Select vendor_id,vendor_site_id,
3888 remit_to_supplier_site_id,invoice_type_lookup_code
3889 into l_vendor_id,l_vendor_site_id,
3890 l_remit_to_supplier_site_id,l_invoice_type_lookup_code
3891 from ap_invoices_all
3892 where invoice_id = p_invoice_id;
3893
3894 if ( l_invoice_type_lookup_code = 'RETAINAGE RELEASE') then
3895
3896
3897 Check_Project_Commitments(
3898 p_invoice_id,
3899 p_system_user,
3900 p_holds,
3901 p_holds_count,
3902 p_release_count,
3903 l_curr_calling_sequence);
3904 end if ;
3905
3906
3907 ---------------------------------------------------
3908 l_debug_info := 'Check for invoice limit and vendor holds';
3909 -- Print_Debug(l_debug_loc, l_debug_info);
3910 IF g_debug_mode = 'Y' THEN
3911 AP_Debug_Pkg.Print(g_debug_mode, l_debug_info );
3912 END IF;
3913
3914 IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
3915 FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME||l_debug_loc,l_debug_info);
3916 END IF;
3917 ---------------------------------------------------
3918 Check_invoice_vendor(
3919 p_invoice_id,
3920 p_base_currency_code,
3921 p_invoice_amount,
3922 p_base_amount,
3923 p_invoice_currency_code,
3924 p_invoice_amount_limit,
3925 p_hold_future_payments_flag,
3926 p_system_user,
3927 p_holds,
3928 p_holds_count,
3929 p_release_count,
3930 l_curr_calling_sequence);
3931 -- Bug 8260168 Removing this Redundant call
3932 /*
3933 ---------------------------------------------------
3934 l_debug_info := 'Check Prepaid Amount Exceeds Invoice Amount';
3935 Print_Debug(l_debug_loc, l_debug_info);
3936 ---------------------------------------------------
3937 Check_Prepaid_Amount(
3938 p_invoice_id,
3939 p_system_user,
3940 p_holds,
3941 p_holds_count,
3942 p_release_count,
3943 l_curr_calling_sequence);
3944 */
3945
3946 --Start of 8691645
3947 -----------------------------------------------------------------------------------
3948 l_debug_info := 'Check whether vendor is CCR registered and registration is active';
3949 -- Print_Debug(l_debug_loc, l_debug_info);
3950 IF g_debug_mode = 'Y' THEN
3951 AP_Debug_Pkg.Print(g_debug_mode, l_debug_info );
3952 END IF;
3953
3954 IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
3955 FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME||l_debug_loc,l_debug_info);
3956 END IF;
3957 ------------------------------------------------------------------------------------
3958 --bug9296410 the below code is commented here and moved above before the call to "Check_Project_Commitments" to reduce redundency
3959
3960 /* Select vendor_id,vendor_site_id,
3961 remit_to_supplier_site_id,invoice_type_lookup_code
3962 into l_vendor_id,l_vendor_site_id,
3963 l_remit_to_supplier_site_id,l_invoice_type_lookup_code
3964 from ap_invoices_all
3965 where invoice_id = p_invoice_id; */
3966
3967
3968
3969 if(upper(l_invoice_type_lookup_code) in ('STANDARD','PREPAYMENT'))then
3970
3971 CHECK_CCR_VENDOR(
3972 p_invoice_id,
3973 l_vendor_id,
3974 l_vendor_site_id,
3975 l_remit_to_supplier_site_id,
3976 p_system_user,
3977 p_holds,
3978 p_holds_count,
3979 p_release_count,
3980 l_vendor_site_reg_expired,
3981 l_curr_calling_sequence);
3982
3983 end if;
3984 --End of 8691645
3985
3986 --GTAS Project Bug#13464635 Begin
3987 -----------------------------------------------------------------------------------
3988 l_debug_info := 'Check GTAS info is valid or not';
3989 IF g_debug_mode = 'Y' THEN
3990 AP_Debug_Pkg.Print(g_debug_mode, l_debug_info );
3991 END IF;
3992 IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
3993 FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME||l_debug_loc,l_debug_info);
3994 END IF;
3995 ------------------------------------------------------------------------------------
3996 CHECK_GDF_VALID(
3997 P_INVOICE_ID,
3998 P_SYSTEM_USER,
3999 P_HOLDS,
4000 P_HOLDS_COUNT,
4001 P_RELEASE_COUNT,
4002 P_CALLING_SEQUENCE);
4003 --End Bug#13464635
4004
4005 EXCEPTION
4006 WHEN OTHERS THEN
4007 IF (SQLCODE <> -20001) THEN
4008 FND_MESSAGE.SET_NAME('SQLAP','AP_DEBUG');
4009 FND_MESSAGE.SET_TOKEN('ERROR',SQLERRM);
4010 FND_MESSAGE.SET_TOKEN('CALLING_SEQUENCE', l_curr_calling_sequence);
4011 FND_MESSAGE.SET_TOKEN('PARAMETERS',
4012 'Invoice_id = '|| to_char(p_invoice_id)
4013 ||', Set of Books Id = '|| to_char(p_set_of_books_id)
4014 ||', Base Currency Code = '|| p_base_currency_code);
4015 FND_MESSAGE.SET_TOKEN('DEBUG_INFO',l_debug_info);
4016 END IF;
4017 APP_EXCEPTION.RAISE_EXCEPTION;
4018 END Execute_General_Checks;
4019
4020 /*=============================================================================
4021 | PROCEDURE CHECK_INVALID_DIST_ACCT
4022 | Procedure that checks whether an invoice has a distribution with an
4023 | invalid distribution account and places or releases the
4024 | DIST ACCT INVALID hold depending on the condition.
4025 |
4026 | PARAMETER
4027 | p_invoice_id
4028 | p_system_user
4029 | p_holds
4030 | p_holds_count
4031 | p_release_count
4032 | p_calling_sequence
4033 |
4034 | PROGRAM FLOW
4035 |
4036 | KNOWN ISSUES:
4037 |
4038 | NOTES:
4039 |
4040 | MODIFICATION HISTORY
4041 | Date Author Description of Change
4042 ============================================================================*/
4043
4044 PROCEDURE Check_Invalid_Dist_Acct(
4045 p_invoice_id IN NUMBER,
4046 p_system_user IN NUMBER,
4047 p_holds IN OUT NOCOPY HOLDSARRAY,
4048 p_holds_count IN OUT NOCOPY COUNTARRAY,
4049 p_release_count IN OUT NOCOPY COUNTARRAY,
4050 p_calling_sequence IN VARCHAR2) IS
4051
4052 CURSOR Invalid_Dist_Acct_Cur IS
4053 SELECT D.dist_code_combination_id, D.accounting_date
4054 FROM ap_invoice_distributions D
4055 WHERE D.invoice_id = p_invoice_id
4056 AND D.posted_flag||'' in ('N', 'P')
4057 AND ((EXISTS (select 'x'
4058 from gl_code_combinations C
4059 where D.dist_code_combination_id = C.code_combination_id (+)
4060 and (C.code_combination_id is null
4061 or C.detail_posting_allowed_flag = 'N'
4062 or C.start_date_active > D.accounting_date
4063 or C.end_date_active < D.accounting_date
4064 or C.template_id is not null
4065 or C.enabled_flag <> 'Y'
4066 or C.summary_flag <> 'N'
4067 )))
4068 OR (D.dist_code_combination_id = -1))
4069 AND ROWNUM = 1;
4070
4071 CURSOR Alternate_Account_Cur (c_ccid NUMBER, c_acct_date DATE) IS
4072 SELECT 'Y'
4073 FROM gl_code_combinations glcc
4074 WHERE glcc.code_combination_id = c_ccid
4075 AND glcc.alternate_code_combination_id IS NOT NULL
4076 AND EXISTS
4077 (
4078 SELECT 'Account Valid'
4079 FROM gl_code_combinations a
4080 WHERE a.code_combination_id = glcc.alternate_code_combination_id
4081 AND a.enabled_flag = 'Y'
4082 AND a.detail_posting_allowed_flag = 'Y'
4083 AND c_acct_date BETWEEN NVL(a.start_date_active, c_acct_date)
4084 AND NVL(a.end_date_active, c_acct_date)
4085 );
4086
4087 l_ccid AP_INVOICE_DISTRIBUTIONS_ALL.dist_code_combination_id%TYPE;
4088 l_accounting_date AP_INVOICE_DISTRIBUTIONS_ALL.accounting_date%TYPE;
4089 l_alt_exists VARCHAR2(50) := 'N';
4090 l_invalid_dist_ccid_exists VARCHAR2(1) := 'N';
4091 l_test_var VARCHAR2(50);
4092 l_debug_loc VARCHAR2(30) := 'Check_Invalid_Dist';
4093 l_curr_calling_sequence VARCHAR2(2000);
4094 l_debug_info VARCHAR2(1000);
4095
4096 BEGIN
4097
4098 l_curr_calling_sequence := 'AP_APPROVAL_PKG.'||l_debug_loc||'<-'||
4099 p_calling_sequence;
4100
4101 IF (g_debug_mode = 'Y') THEN
4102 l_debug_info := 'General check - check invalid dist account';
4103 AP_Debug_Pkg.Print(g_debug_mode, l_debug_info );
4104 AP_Debug_Pkg.Print(g_debug_mode, 'invoice id :'||
4105 to_char(p_invoice_id) );
4106 END IF;
4107
4108 OPEN Invalid_Dist_Acct_Cur;
4109 LOOP
4110 FETCH Invalid_Dist_Acct_Cur INTO l_ccid, l_accounting_date;
4111 EXIT WHEN Invalid_DIst_Acct_Cur%NOTFOUND;
4112
4113 IF (g_debug_mode = 'Y') THEN
4114 l_debug_info := 'Inside loop of curser - Invalid_Dist_Acct_Cur';
4115 AP_Debug_Pkg.Print(g_debug_mode, l_debug_info );
4116 AP_Debug_Pkg.Print(g_debug_mode, 'invalid dist ccid hold'||
4117 l_invalid_dist_ccid_exists);
4118 END IF;
4119
4120 --
4121 -- Per discussion with Shelley/Enda we will not place a hold
4122 -- when the distribution account is invalid and there is a
4123 -- valid alternate account defined in GL.
4124 -- Create Accounting will use the alternate account to
4125 -- generate the journal entries. The invoice distribution
4126 -- will not be stamped back with the alternate account.
4127 --
4128 OPEN Alternate_Account_Cur(l_ccid, l_accounting_date);
4129 FETCH Alternate_Account_Cur
4130 INTO l_alt_exists;
4131 CLOSE Alternate_Account_Cur;
4132
4133 IF (g_debug_mode = 'Y') THEN
4134 AP_Debug_Pkg.Print(g_debug_mode, 'Alternate Account Exists: '||
4135 l_alt_exists);
4136 END IF;
4137
4138 IF l_alt_exists = 'Y' THEN
4139 l_invalid_dist_ccid_exists := 'N';
4140 ELSE
4141 l_invalid_dist_ccid_exists := 'Y';
4142 END IF;
4143
4144 END LOOP;
4145 CLOSE Invalid_Dist_Acct_Cur;
4146
4147 IF (g_debug_mode = 'Y') THEN
4148 l_debug_info := 'Process DIST ACCT INVALID hold status on invoice';
4149 AP_Debug_Pkg.Print(g_debug_mode, l_debug_info );
4150 END IF;
4151
4152 Process_Inv_Hold_Status(
4153 p_invoice_id,
4154 null,
4155 null,
4156 'DIST ACCT INVALID',
4157 l_invalid_dist_ccid_exists,
4158 null,
4159 p_system_user,
4160 p_holds,
4161 p_holds_count,
4162 p_release_count,
4163 l_curr_calling_sequence);
4164
4165 EXCEPTION
4166 WHEN OTHERS THEN
4167 IF (SQLCODE <> -20001) THEN
4168 FND_MESSAGE.SET_NAME('SQLAP','AP_DEBUG');
4169 FND_MESSAGE.SET_TOKEN('ERROR',SQLERRM);
4170 FND_MESSAGE.SET_TOKEN('CALLING_SEQUENCE', l_curr_calling_sequence);
4171 FND_MESSAGE.SET_TOKEN('PARAMETERS',
4172 'Invoice_id = '|| to_char(p_invoice_id));
4173 FND_MESSAGE.SET_TOKEN('DEBUG_INFO',l_debug_info);
4174 END IF;
4175
4176 IF ( Invalid_Dist_Acct_Cur%ISOPEN ) THEN
4177 CLOSE Invalid_Dist_Acct_Cur;
4178 END IF;
4179
4180 APP_EXCEPTION.RAISE_EXCEPTION;
4181 END Check_Invalid_Dist_Acct;
4182
4183 /*=============================================================================
4184 | PROCEDURE CHECK_PO_REQUIRED
4185 | Procedure that checks whether an invoice has a PO REQUIRED
4186 | condition and places or releases the hold depending on the condition
4187 | For those distribution lines which have "pa_additon_flag" = 'T', means
4188 | they are transferred from projects; Payables does not enforce po
4189 | information requirment.
4190 |
4191 | PARAMETER
4192 | p_invoice_id
4193 | p_system_user
4194 | p_holds
4195 | p_holds_count
4196 | p_release_count
4197 | p_calling_sequence
4198 |
4199 | PROGRAM FLOW
4200 |
4201 | KNOWN ISSUES:
4202 |
4203 | NOTES:
4204 |
4205 | MODIFICATION HISTORY
4206 | Date Author Description of Change
4207 ============================================================================*/
4208
4209 PROCEDURE Check_PO_Required(
4210 p_invoice_id IN NUMBER,
4211 p_system_user IN NUMBER,
4212 p_holds IN OUT NOCOPY HOLDSARRAY,
4213 p_holds_count IN OUT NOCOPY COUNTARRAY,
4214 p_release_count IN OUT NOCOPY COUNTARRAY,
4215 p_calling_sequence IN VARCHAR2) IS
4216
4217 CURSOR PO_Required_Cur IS
4218 -- Perf bug 5058995
4219 -- Modify below SQL to go to base tables : AP_INVOICES_ALL,
4220 -- AP_INVOICE_DISTRIBUTIONS_ALL and
4221 -- AP_SUPPLIER_SITES(instead of po_vendor_sites)
4222 /* Added the Hint index(apd AP_INVOICE_DISTRIBUTIONS_U1) for bug#7270053 */
4223 SELECT 'PO REQUIRED'
4224 FROM ap_invoices_all api, ap_supplier_sites pov
4225 WHERE EXISTS (select /*+ index(apd AP_INVOICE_DISTRIBUTIONS_U1) */ 'X'
4226 from ap_invoice_distributions_all apd
4227 where apd.invoice_id = api.invoice_id
4228 and apd.line_type_lookup_code in ( 'ITEM', 'ACCRUAL')
4229 and apd.po_distribution_id is null
4230 and apd.pa_addition_flag <> 'T'
4231 and nvl(apd.reversal_flag,'N')='N' --added for bug 16061729
4232 /*group by apd.dist_code_combination_id --commented for bug 16061729
4233 HAVING sum(apd.amount) <> 0*/)
4234 AND nvl(pov.hold_unmatched_invoices_flag, 'X') = 'Y'
4235 AND api.invoice_type_lookup_code not in ('PREPAYMENT', 'INTEREST')
4236 AND api.vendor_site_id = pov.vendor_site_id
4237 AND api.invoice_id = p_invoice_id;
4238
4239 l_po_required_exists VARCHAR2(1) := 'N';
4240 l_test_var VARCHAR2(30) :='';
4241 l_debug_loc VARCHAR2(30) := 'Check_PO_Required';
4242 l_curr_calling_sequence VARCHAR2(2000);
4243 l_debug_info VARCHAR2(1000);
4244
4245 BEGIN
4246
4247 l_curr_calling_sequence := 'AP_APPROVAL_PKG.'||l_debug_loc||'<-'||
4248 p_calling_sequence;
4249
4250 OPEN PO_Required_Cur;
4251 FETCH PO_Required_Cur INTO l_test_var;
4252 CLOSE PO_Required_Cur;
4253
4254 IF ( l_test_var is not NULL ) THEN
4255 l_po_required_exists := 'Y';
4256
4257 ---------------------------------------------------
4258 l_debug_info := 'PO REQUIRED hold placed. Invoice_ID: '||p_invoice_id;
4259 -- Print_Debug(l_debug_loc, l_debug_info);
4260 IF g_debug_mode = 'Y' THEN
4261 AP_Debug_Pkg.Print(g_debug_mode, l_debug_info );
4262 END IF;
4263
4264 IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
4265 FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME||l_debug_loc,l_debug_info);
4266 END IF;
4267 ---------------------------------------------------
4268 END IF;
4269
4270 Process_Inv_Hold_Status(
4271 p_invoice_id,
4272 null,
4273 null,
4274 'PO REQUIRED',
4275 l_po_required_exists,
4276 null,
4277 p_system_user,
4278 p_holds,
4279 p_holds_count,
4280 p_release_count,
4281 l_curr_calling_sequence);
4282
4283 EXCEPTION
4284 WHEN OTHERS THEN
4285 IF (SQLCODE <> -20001) THEN
4286 FND_MESSAGE.SET_NAME('SQLAP','AP_DEBUG');
4287 FND_MESSAGE.SET_TOKEN('ERROR',SQLERRM);
4288 FND_MESSAGE.SET_TOKEN('CALLING_SEQUENCE', l_curr_calling_sequence);
4289 FND_MESSAGE.SET_TOKEN('PARAMETERS',
4290 'Invoice_id = '|| to_char(p_invoice_id));
4291 FND_MESSAGE.SET_TOKEN('DEBUG_INFO',l_debug_info);
4292 END IF;
4293 IF ( PO_Required_Cur%ISOPEN ) THEN
4294 CLOSE PO_Required_Cur;
4295 END IF;
4296 APP_EXCEPTION.RAISE_EXCEPTION;
4297 END Check_PO_Required;
4298
4299 /*=============================================================================
4300 | PROCEDURE CHECK_NO_RATE
4301 | Procedure that checks if an invoice is a foreign invoice, missing an
4302 | exchange rate and places or releases the NO RATE' hold depending on
4303 | the condition.
4304 |
4305 | PARAMETER
4306 | p_invoice_id
4307 | p_base_currency_code
4308 | p_system_user
4309 | p_holds
4310 | p_holds_count
4311 | p_release_count
4312 | p_calling_sequence
4313 |
4314 | PROGRAM FLOW
4315 |
4316 | KNOWN ISSUES:
4317 |
4318 | NOTES:
4319 |
4320 | MODIFICATION HISTORY
4321 | Date Author Description of Change
4322 ============================================================================*/
4323 PROCEDURE Check_No_Rate(
4324 p_invoice_id IN NUMBER,
4325 p_base_currency_code IN VARCHAR2,
4326 p_system_user IN NUMBER,
4327 p_holds IN OUT NOCOPY HOLDSARRAY,
4328 p_holds_count IN OUT NOCOPY COUNTARRAY,
4329 p_release_count IN OUT NOCOPY COUNTARRAY,
4330 p_calling_sequence IN VARCHAR2) IS
4331
4332 CURSOR No_Rate_Cur IS
4333 SELECT 'Foreign Invoice without exchange rate'
4334 FROM ap_invoices I
4335 WHERE I.invoice_id = p_invoice_id
4336 AND I.invoice_currency_code <> p_base_currency_code
4337 AND I.exchange_rate is null;
4338
4339 l_no_rate_exists VARCHAR2(1) := 'N';
4340 l_test_var VARCHAR2(50) := '';
4341 l_debug_loc VARCHAR2(30) := 'Check_No_Rate';
4342 l_curr_calling_sequence VARCHAR2(2000);
4343 l_debug_info VARCHAR2(1000);
4344
4345 BEGIN
4346
4347 l_curr_calling_sequence := 'AP_APPROVAL_PKG.'||l_debug_loc||'<-'||
4348 p_calling_sequence;
4349
4350 OPEN No_Rate_Cur;
4351 FETCH No_Rate_Cur INTO l_test_var;
4352 CLOSE No_Rate_Cur;
4353
4354 IF ( l_test_var is not NULL ) THEN
4355 l_no_rate_exists := 'Y';
4356
4357 ---------------------------------------------------
4358 l_debug_info := 'NO RATE hold placed. Invoice_ID: '||p_invoice_id;
4359 -- Print_Debug(l_debug_loc, l_debug_info);
4360 IF g_debug_mode = 'Y' THEN
4361 AP_Debug_Pkg.Print(g_debug_mode, l_debug_info );
4362 END IF;
4363
4364 IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
4365 FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME||l_debug_loc,l_debug_info);
4366 END IF;
4367 ---------------------------------------------------
4368 END IF;
4369
4370 Process_Inv_Hold_Status(
4371 p_invoice_id,
4372 null,
4373 null,
4374 'NO RATE',
4375 l_no_rate_exists,
4376 null,
4377 p_system_user,
4378 p_holds,
4379 p_holds_count,
4380 p_release_count,
4381 l_curr_calling_sequence);
4382
4383 EXCEPTION
4384 WHEN OTHERS THEN
4385 IF (SQLCODE <> -20001) THEN
4386 FND_MESSAGE.SET_NAME('SQLAP','AP_DEBUG');
4387 FND_MESSAGE.SET_TOKEN('ERROR',SQLERRM);
4388 FND_MESSAGE.SET_TOKEN('CALLING_SEQUENCE', l_curr_calling_sequence);
4389 FND_MESSAGE.SET_TOKEN('PARAMETERS',
4390 'Invoice_id = '|| to_char(p_invoice_id)
4391 ||', Base Currency Code = '|| p_base_currency_code);
4392 FND_MESSAGE.SET_TOKEN('DEBUG_INFO',l_debug_info);
4393 END IF;
4394
4395 IF ( No_Rate_Cur%ISOPEN ) THEN
4396 CLOSE No_Rate_Cur;
4397 END IF;
4398
4399 APP_EXCEPTION.RAISE_EXCEPTION;
4400 END Check_No_Rate;
4401
4402 --Bug9296410
4403
4404 /*=============================================================================
4405 | PROCEDURE CHECK_PROJECT_COMMITMEMT
4406 | Procedure that checks if the project commitments are meeted on
4407 | time or not . We will give a call to project API which will return
4408 | TRUE if commitmemts are meet , if it returns FLASE will place a .
4409 | 'PROJECT HOLD '
4410 | PARAMETER
4411 | p_invoice_id
4412 | p_system_user
4413 | p_holds
4414 | p_holds_count
4415 | p_release_count
4416 | p_calling_sequence
4417 |
4418 | PROGRAM FLOW
4419 |
4420 | KNOWN ISSUES:
4421 |
4422 | NOTES:
4423 |
4424 | MODIFICATION HISTORY
4425 | Date Author Description of Change
4426 ============================================================================*/
4427 PROCEDURE Check_project_commitments(
4428 p_invoice_id IN NUMBER,
4429 p_system_user IN NUMBER,
4430 p_holds IN OUT NOCOPY HOLDSARRAY,
4431 p_holds_count IN OUT NOCOPY COUNTARRAY,
4432 p_release_count IN OUT NOCOPY COUNTARRAY,
4433 p_calling_sequence IN VARCHAR2) IS
4434
4435
4436
4437 l_proj_comm VARCHAR2(1) := 'N';
4438 l_test_var VARCHAR2(50) := '';
4439 l_debug_loc VARCHAR2(50) := 'Check_project_commitments'; --bug9296410
4440 l_curr_calling_sequence VARCHAR2(2000);
4441 l_debug_info VARCHAR2(1000);
4442
4443 BEGIN
4444
4445 l_curr_calling_sequence := 'AP_APPROVAL_PKG.'||l_debug_loc||'<-'||
4446 p_calling_sequence;
4447
4448 -- bug 9468749
4449 PA_AP_VAL_PKG.validate_unprocessed_ded(p_invoice_id , l_proj_comm );
4450
4451 l_debug_info := 'Call to Project API return flag '|| l_proj_comm ;
4452 -- Print_Debug(l_debug_loc, l_debug_info);
4453 IF g_debug_mode = 'Y' THEN
4454 AP_Debug_Pkg.Print(g_debug_mode, l_debug_info );
4455 END IF;
4456
4457 IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
4458 FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME||l_debug_loc,l_debug_info);
4459 END IF;
4460
4461 IF ( l_proj_comm = 'Y' ) THEN
4462
4463 ---------------------------------------------------
4464 l_debug_info := 'PROJECT HOLD placed. Invoice_ID: '|| p_invoice_id;
4465 -- Print_Debug(l_debug_loc, l_debug_info);
4466 IF g_debug_mode = 'Y' THEN
4467 AP_Debug_Pkg.Print(g_debug_mode, l_debug_info );
4468 END IF;
4469
4470 IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
4471 FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME||l_debug_loc,l_debug_info);
4472 END IF;
4473 ---------------------------------------------------
4474
4475 ELSE
4476 -- if the stubbed code return null for AP.A version we will stamp it as 'N'
4477 l_proj_comm := nvl(l_proj_comm , 'N');
4478
4479 END IF;
4480
4481 Process_Inv_Hold_Status(
4482 p_invoice_id,
4483 null,
4484 null,
4485 'Project Hold',
4486 l_proj_comm ,
4487 null,
4488 p_system_user,
4489 p_holds,
4490 p_holds_count,
4491 p_release_count,
4492 l_curr_calling_sequence);
4493
4494 EXCEPTION
4495 WHEN OTHERS THEN
4496 IF (SQLCODE <> -20001) THEN
4497 FND_MESSAGE.SET_NAME('SQLAP','AP_DEBUG');
4498 FND_MESSAGE.SET_TOKEN('ERROR',SQLERRM);
4499 FND_MESSAGE.SET_TOKEN('CALLING_SEQUENCE', l_curr_calling_sequence);
4500 FND_MESSAGE.SET_TOKEN('PARAMETERS',
4501 'Invoice_id = '|| to_char(p_invoice_id)
4502 );
4503 FND_MESSAGE.SET_TOKEN('DEBUG_INFO',l_debug_info);
4504 END IF;
4505
4506 APP_EXCEPTION.RAISE_EXCEPTION;
4507 END Check_project_commitments;
4508
4509
4510 /*=============================================================================
4511 | PROCEDURE CHECK_DIST_VARIANCE
4512 | Procedure that checks whether an invoice has a DIST VARIANCE condition,
4513 | i.e. distribution total does not equal to its invoice line amount and
4514 | places or releases the hold depending on the condition.
4515 |
4516 | PARAMETER
4517 | p_invoice_id
4518 | p_invoice_line_number
4519 | p_system_user
4520 | p_holds
4521 | p_holds_count
4522 | p_release_count
4523 | p_distribution_variance_exist
4524 | p_calling_sequence
4525 |
4526 | KNOWN ISSUES:
4527 |
4528 | NOTES:
4529 |
4530 | MODIFICATION HISTORY
4531 | Date Author Description of Change
4532 ============================================================================*/
4533
4534 PROCEDURE Check_Dist_Variance(
4535 p_invoice_id IN NUMBER,
4536 p_invoice_line_number IN NUMBER,
4537 p_system_user IN NUMBER,
4538 p_holds IN OUT NOCOPY HOLDSARRAY,
4539 p_holds_count IN OUT NOCOPY COUNTARRAY,
4540 p_release_count IN OUT NOCOPY COUNTARRAY,
4541 p_distribution_variance_exist OUT NOCOPY BOOLEAN,
4542 p_calling_sequence IN VARCHAR2) IS
4543
4544 CURSOR Dist_Var_Cur IS
4545 /* Modified by epajaril to fix bug 6729934 */
4546 SELECT 'Distribution needs to be verified. '
4547 FROM DUAL
4548 WHERE EXISTS (
4549 SELECT 'Dist Total <> Invoice Line Amount'
4550 FROM ap_invoice_lines_all AIL, ap_invoice_distributions_all D
4551 -- WHERE AIL.invoice_id = D.invoice_id
4552 WHERE AIL.invoice_id = D.invoice_id(+)
4553 AND AIL.line_number = nvl(p_invoice_line_number, AIL.line_number) --bug6661773
4554 AND AIL.invoice_id = p_invoice_id
4555 -- AND AIL.line_number = D.invoice_line_number
4556 AND AIL.line_number = D.invoice_line_number(+)
4557 -- AND (D.line_type_lookup_code <> 'RETAINAGE'
4558 AND (NVL(D.line_type_lookup_code, 'ITEM') <> 'RETAINAGE'
4559 OR (AIL.line_type_lookup_code = 'RETAINAGE RELEASE'
4560 and D.line_type_lookup_code = 'RETAINAGE'))
4561 AND (AIL.line_type_lookup_code
4562 NOT IN ('ITEM', 'RETAINAGE RELEASE')
4563 or (AIL.line_type_lookup_code
4564 IN ('ITEM', 'RETAINAGE RELEASE')
4565 and (D.prepay_distribution_id IS NULL
4566 or (D.prepay_distribution_id IS NOT NULL
4567 and D.line_type_lookup_code NOT IN ('PREPAY', 'REC_TAX', 'NONREC_TAX')))))
4568 /*
4569 AND (ail.line_type_lookup_code <> 'ITEM'
4570 OR (d.line_type_lookup_code <> 'PREPAY'
4571 and d.prepay_tax_parent_id IS NULL)
4572 )
4573 */
4574 GROUP BY AIL.invoice_id, AIL.line_number, AIL.amount
4575 HAVING AIL.amount <> nvl(SUM(nvl(D.amount,0)),0));
4576
4577 l_dist_var_exists VARCHAR2(1) := 'N';
4578 l_debug_loc VARCHAR2(30) := 'Check_Dist_Variance';
4579 l_curr_calling_sequence VARCHAR2(2000);
4580 l_debug_info VARCHAR2(1000);
4581 l_test_var VARCHAR2(50);
4582 l_inv_amount AP_INVOICES_ALL.INVOICE_AMOUNT%TYPE;
4583 l_dist_count NUMBER;
4584
4585 BEGIN
4586
4587 l_curr_calling_sequence := 'AP_APPROVAL_PKG.'||l_debug_loc||
4588 '<-'||p_calling_sequence;
4589
4590
4591 l_dist_count := 0;
4592 l_inv_amount := 0;
4593 p_distribution_variance_exist := FALSE;
4594
4595 -- Bug 4539514
4596 SELECT invoice_amount
4597 INTO l_inv_amount
4598 FROM ap_invoices_all ai
4599 WHERE ai.invoice_id = p_invoice_id;
4600
4601 SELECT count(*) INTO l_dist_count
4602 FROM ap_invoice_distributions_all aid
4603 WHERE aid.invoice_id = p_invoice_id
4604 AND ((aid.line_type_lookup_code <> 'PREPAY'
4605 AND aid.prepay_tax_parent_id IS NULL)
4606 OR nvl(invoice_includes_prepay_flag,'N') = 'Y')
4607 AND rownum =1; --Perf 6759699
4608
4609 IF (l_dist_count = 0 AND l_inv_amount <> 0) Then
4610 l_dist_var_exists := 'Y';
4611 p_distribution_variance_exist := TRUE;
4612
4613 --------------------------------------------------------
4614 l_debug_info := 'Distribution Variance Exists 1: '||l_dist_var_exists;
4615 -- Print_Debug(l_debug_loc, l_debug_info);
4616 IF g_debug_mode = 'Y' THEN
4617 AP_Debug_Pkg.Print(g_debug_mode, l_debug_info );
4618 END IF;
4619
4620 IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
4621 FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME||l_debug_loc,l_debug_info);
4622 END IF;
4623 --------------------------------------------------------
4624
4625 -- END IF;
4626 -- Perf 6759699
4627 -- If the variables l_dist_var_exists and p_distribution_variance_exists
4628 -- are set in the above if block then there is no need to open the
4629 -- cursor Dist_Var_Cur.
4630
4631 else
4632
4633 OPEN Dist_Var_Cur;
4634 FETCH Dist_Var_Cur
4635 INTO l_test_var;
4636
4637 IF (Dist_Var_Cur%ROWCOUNT > 0) THEN
4638 l_dist_var_exists := 'Y';
4639 p_distribution_variance_exist := TRUE;
4640
4641 --------------------------------------------------------
4642 l_debug_info := 'Distribution Variance Exists 2: '||l_dist_var_exists;
4643 -- Print_Debug(l_debug_loc, l_debug_info);
4644 IF g_debug_mode = 'Y' THEN
4645 AP_Debug_Pkg.Print(g_debug_mode, l_debug_info );
4646 END IF;
4647
4648 IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
4649 FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME||l_debug_loc,l_debug_info);
4650 END IF;
4651 --------------------------------------------------------
4652
4653 END IF;
4654 CLOSE Dist_Var_Cur;
4655 end if; -- l_dist_count Bug 6759699
4656
4657 Process_Inv_Hold_Status(p_invoice_id,
4658 null,
4659 null,
4660 'DIST VARIANCE',
4661 l_dist_var_exists,
4662 null,
4663 p_system_user,
4664 p_holds,
4665 p_holds_count,
4666 p_release_count,
4667 l_curr_calling_sequence);
4668
4669 EXCEPTION
4670 WHEN OTHERS THEN
4671 IF (SQLCODE <> -20001) THEN
4672 FND_MESSAGE.SET_NAME('SQLAP','AP_DEBUG');
4673 FND_MESSAGE.SET_TOKEN('ERROR',SQLERRM);
4674 FND_MESSAGE.SET_TOKEN('CALLING_SEQUENCE', l_curr_calling_sequence);
4675 FND_MESSAGE.SET_TOKEN('PARAMETERS',
4676 'Invoice_id = '|| to_char(p_invoice_id));
4677 FND_MESSAGE.SET_TOKEN('DEBUG_INFO',l_debug_info);
4678 END IF;
4679
4680 IF ( Dist_Var_Cur%ISOPEN ) THEN
4681 CLOSE Dist_Var_Cur;
4682 END IF;
4683
4684 APP_EXCEPTION.RAISE_EXCEPTION;
4685 END Check_Dist_Variance;
4686
4687
4688 --Start of 8691645
4689 /*=============================================================================
4690 -- PROCEDURE CHECK_CCR_VENDOR
4691 ============================================================================*/
4692
4693 PROCEDURE CHECK_CCR_VENDOR(
4694 P_INVOICE_ID IN AP_INVOICES.INVOICE_ID%TYPE,
4695 P_VENDOR_ID IN AP_INVOICES.VENDOR_ID%TYPE,
4696 P_VENDOR_SITE_ID IN AP_INVOICES.VENDOR_SITE_ID%TYPE,
4697 P_REMIT_TO_SUPPLIER_SITE_ID IN AP_INVOICES.REMIT_TO_SUPPLIER_SITE_ID%TYPE,
4698 P_SYSTEM_USER IN NUMBER,
4699 P_HOLDS IN OUT NOCOPY HOLDSARRAY,
4700 P_HOLDS_COUNT IN OUT NOCOPY COUNTARRAY,
4701 P_RELEASE_COUNT IN OUT NOCOPY COUNTARRAY,
4702 P_VENDOR_SITE_REG_EXPIRED OUT NOCOPY VARCHAR2,
4703 P_CALLING_SEQUENCE IN VARCHAR2) IS
4704
4705
4706 l_out_status VARCHAR2(6);
4707 l_vndr_ccr_status varchar2(1);
4708
4709 l_curr_calling_sequence VARCHAR2(2000);
4710 l_debug_info VARCHAR2(1000);
4711 l_api_name CONSTANT VARCHAR2(200) := 'CHECK_CCR_VENDOR';
4712
4713
4714 Begin
4715 l_curr_calling_sequence := 'AP_APPROVAL_PKG.CHECK_CCR_VENDOR <-'||p_calling_sequence;
4716
4717 l_debug_info := 'Before checking vendor is a CCR registered or not ';
4718
4719 IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
4720 FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME||l_api_name, l_debug_info );
4721 END IF;
4722
4723 P_Vendor_Site_Reg_Expired := 'N';
4724
4725 l_out_status := AP_UTILITIES_PKG.GET_CCR_STATUS(
4726 p_object_id => P_vendor_id,
4727 p_object_type => 'S');
4728
4729
4730 IF(l_out_status = FND_API.G_TRUE) THEN
4731
4732 initialize_invoice_holds
4733 (p_invoice_id => p_invoice_id,
4734 p_calling_sequence => l_curr_calling_sequence);
4735
4736 l_debug_info := 'Vendor is CCR registered';
4737 --Bug16247029: Start
4738 IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
4739 FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME||l_api_name, l_debug_info );
4740 END IF;
4741 --Bug16247029: End
4742
4743 l_vndr_ccr_status := AP_UTILITIES_PKG.GET_CCR_REG_STATUS(p_vendor_site_id);
4744
4745 l_debug_info := 'l_vndr_ccr_status = '|| l_vndr_ccr_status;
4746 --Bug16247029: Start
4747 IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
4748 FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME||l_api_name, l_debug_info );
4749 END IF;
4750 --Bug16247029: End
4751
4752 IF(l_vndr_ccr_status <> 'A') THEN
4753 P_Vendor_Site_Reg_Expired := 'Y';
4754 ELSE
4755 P_Vendor_Site_Reg_Expired := 'N';
4756 END IF;
4757
4758
4759
4760 IF(nvl(p_remit_to_supplier_site_id,p_vendor_site_id) <> p_vendor_site_id
4761 and P_Vendor_Site_Reg_Expired <> 'Y') THEN
4762
4763 l_vndr_ccr_status := AP_UTILITIES_PKG.GET_CCR_REG_STATUS
4764 (p_remit_to_supplier_site_id);
4765
4766 l_debug_info := 'l_rmt_vndr_ccr_status = '|| l_vndr_ccr_status;
4767 --Bug16247029: Start
4768 IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
4769 FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME||l_api_name, l_debug_info );
4770 END IF;
4771 --Bug16247029: End
4772
4773 IF(l_vndr_ccr_status <> 'A') THEN
4774 P_Vendor_Site_Reg_Expired := 'Y';
4775 ELSE
4776 P_Vendor_Site_Reg_Expired := 'N';
4777 END IF;
4778
4779 END IF;
4780
4781
4782 l_debug_info := 'Calling invoice hold process to
4783 put/release holds on invoice';
4784 --Bug16247029: Start
4785 IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
4786 FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME||l_api_name, l_debug_info );
4787 END IF;
4788 --Bug16247029: End
4789
4790 Process_Inv_Hold_Status(
4791 p_invoice_id,
4792 null,
4793 null,
4794 'Expired Registration',
4795 P_Vendor_Site_Reg_Expired,
4796 null,
4797 p_system_user,
4798 p_holds,
4799 p_holds_count,
4800 p_release_count,
4801 l_curr_calling_sequence);
4802
4803 END IF;
4804
4805
4806 EXCEPTION
4807
4808 WHEN OTHERS then
4809
4810 IF (SQLCODE <> -20001) THEN
4811 FND_MESSAGE.SET_NAME('SQLAP','AP_DEBUG');
4812 FND_MESSAGE.SET_TOKEN('ERROR',SQLERRM);
4813 FND_MESSAGE.SET_TOKEN('CALLING_SEQUENCE',l_curr_calling_sequence );
4814 FND_MESSAGE.SET_TOKEN('DEBUG_INFO', l_debug_info );
4815 FND_MESSAGE.SET_TOKEN('PARAMETERS',
4816 'Invoice_id = '|| to_char(p_invoice_id)
4817 ||', Vendor_id = '|| to_char(p_vendor_id)
4818 ||', Vendor_site_id = '|| to_char(p_vendor_site_id)
4819 ||', Remit_to_supplier_site_id = '||to_char(p_remit_to_supplier_site_id));
4820
4821 END IF;
4822 APP_EXCEPTION.RAISE_EXCEPTION;
4823 End CHECK_CCR_VENDOR;
4824
4825 --End of 8691645
4826
4827
4828 /*=============================================================================
4829 | PROCEDURE CHECK_LINE_VARIANCE
4830 | Procedure that checks whether an invoice has a LINE VARIANCE condition,
4831 | i.e. lines total does not equal to invoice amount and places or
4832 | releases the hold depending on the condition.
4833 |
4834 | PARAMETER
4835 | p_invoice_id
4836 | p_system_user
4837 | p_holds
4838 | p_holds_count
4839 | p_release_count
4840 | p_line_variance_hold_exist
4841 | p_calling_sequence
4842 |
4843 | KNOWN ISSUES:
4844 |
4845 | NOTES:
4846 |
4847 | MODIFICATION HISTORY
4848 | Date Author Description of Change
4849 ============================================================================*/
4850
4851 PROCEDURE Check_Line_Variance(
4852 p_invoice_id IN NUMBER,
4853 p_system_user IN NUMBER,
4854 p_holds IN OUT NOCOPY HOLDSARRAY,
4855 p_holds_count IN OUT NOCOPY COUNTARRAY,
4856 p_release_count IN OUT NOCOPY COUNTARRAY,
4857 p_line_variance_hold_exist OUT NOCOPY BOOLEAN,
4858 p_calling_sequence IN VARCHAR2,
4859 p_base_currency_code IN VARCHAR2) IS --bug7271262
4860
4861
4862 CURSOR Line_Var_Cur IS
4863 SELECT 'Line Total <> Invoice Amount'
4864 FROM ap_invoice_lines_all AIL, ap_invoices_all A
4865 WHERE AIL.invoice_id = A.invoice_id
4866 AND AIL.invoice_id = p_invoice_id
4867 AND ((AIL.line_type_lookup_code <> 'TAX'
4868 and (AIL.line_type_lookup_code NOT IN ('AWT','PREPAY')
4869 or NVL(AIL.invoice_includes_prepay_flag,'N') = 'Y') OR
4870 (AIL.line_type_lookup_code = 'TAX'
4871 /* bug 5222316 */
4872 and (AIL.prepay_invoice_id IS NULL
4873 or (AIL.prepay_invoice_id is not null
4874 and NVL(AIL.invoice_includes_prepay_flag, 'N') = 'Y')))))
4875 -- and AIL.prepay_invoice_id IS NULL)))
4876 GROUP BY A.invoice_id, A.invoice_amount, A.net_of_retainage_flag
4877 HAVING A.invoice_amount <>
4878 nvl(SUM(nvl(AIL.amount,0) + decode(A.net_of_retainage_flag,
4879 'Y', nvl(AIL.retained_amount,0),0)),0);
4880
4881 l_line_var_exists VARCHAR2(1) := 'N';
4882 l_test_var VARCHAR2(50);
4883 l_debug_loc VARCHAR2(30) := 'Check_Line_Variance';
4884 l_curr_calling_sequence VARCHAR2(2000);
4885 l_debug_info VARCHAR2(1000);
4886 l_inv_cur_code ap_invoices.invoice_currency_code%type;
4887 l_inv_amount ap_invoices_all.invoice_amount%TYPE;
4888 l_line_count number;
4889 l_org_id ap_invoices_all.org_id%TYPE; --bug 7271262
4890 l_set_of_books_id ap_invoices_all.set_of_books_id%TYPE; --bug 7271262
4891 l_return_code VARCHAR2(100); --bug 7271262
4892 l_return_message VARCHAR2(1000); --bug 7271262
4893
4894 BEGIN
4895
4896 l_curr_calling_sequence := 'AP_APPROVAL_PKG.'||l_debug_loc||
4897 '<-'||p_calling_sequence;
4898
4899 p_line_variance_hold_exist := FALSE;
4900 l_line_count := 0;
4901 l_inv_amount := 0;
4902
4903 --Bugfix:4539514, added the below code so that we place
4904 --LINE VARIANCE hold when the user validates a invoice
4905 --with no lines in it.
4906
4907 --Bug 7271262 Added the org_id and set_of_books_id parameters in the below
4908 --select, to pass as parameters for JAI hook jai_ap_tolerance_pkg.inv_holds_check
4909
4910 SELECT invoice_amount,org_id,set_of_books_id
4911 INTO l_inv_amount,l_org_id,l_set_of_books_id
4912 FROM ap_invoices ai
4913 WHERE ai.invoice_id = p_invoice_id;
4914
4915 --Added the below code hook for India Localization as part of bug7271262
4916
4917 l_debug_info := 'Calling code hook jai_ap_tolerance_pkg.inv_holds_check';
4918
4919 IF (p_base_currency_code = 'INR') Then
4920 jai_ap_tolerance_pkg.inv_holds_check(
4921 p_invoice_id => p_invoice_id,
4922 p_org_id => l_org_id,
4923 p_set_of_books_id => l_set_of_books_id,
4924 p_invoice_amount => l_inv_amount,
4925 p_invoice_currency_code => p_base_currency_code,
4926 p_return_code => l_return_code,
4927 p_return_message => l_return_message);
4928 End IF;
4929
4930 /* End of Bug 7271262 */
4931
4932 SELECT count(*)
4933 INTO l_line_count
4934 FROM ap_invoice_lines ail
4935 WHERE ail.invoice_id = p_invoice_id
4936 AND (ail.line_type_lookup_code NOT IN ('PREPAY','AWT')
4937 OR nvl(invoice_includes_prepay_flag,'N') = 'Y');
4938
4939 IF (l_line_count = 0 AND l_inv_amount <> 0) Then
4940 l_line_var_exists := 'Y';
4941 p_line_variance_hold_exist := TRUE;
4942 END IF;
4943
4944 --
4945
4946 OPEN Line_Var_Cur;
4947 FETCH Line_Var_Cur
4948 INTO l_test_var;
4949
4950 IF ( Line_Var_Cur%ROWCOUNT > 0 ) THEN
4951 l_line_var_exists := 'Y';
4952 p_line_variance_hold_exist := TRUE;
4953 END IF;
4954
4955 CLOSE Line_Var_Cur;
4956
4957 --------------------------------------------------------
4958 l_debug_info := 'Line Variance Exists: '||l_line_var_exists;
4959 -- Print_Debug(l_debug_loc, l_debug_info);
4960 IF g_debug_mode = 'Y' THEN
4961 AP_Debug_Pkg.Print(g_debug_mode, l_debug_info );
4962 END IF;
4963
4964 IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
4965 FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME||l_debug_loc,l_debug_info);
4966 END IF;
4967 --------------------------------------------------------
4968
4969 Process_Inv_Hold_Status(
4970 p_invoice_id,
4971 null,
4972 null,
4973 'LINE VARIANCE',
4974 l_line_var_exists,
4975 null,
4976 p_system_user,
4977 p_holds,
4978 p_holds_count,
4979 p_release_count,
4980 l_curr_calling_sequence);
4981
4982 EXCEPTION
4983 WHEN OTHERS THEN
4984 IF (SQLCODE <> -20001) THEN
4985 FND_MESSAGE.SET_NAME('SQLAP','AP_DEBUG');
4986 FND_MESSAGE.SET_TOKEN('ERROR',SQLERRM);
4987 FND_MESSAGE.SET_TOKEN('CALLING_SEQUENCE', l_curr_calling_sequence);
4988 FND_MESSAGE.SET_TOKEN('PARAMETERS',
4989 'Invoice_id = '|| to_char(p_invoice_id));
4990 FND_MESSAGE.SET_TOKEN('DEBUG_INFO',l_debug_info);
4991 END IF;
4992 IF ( Line_Var_Cur%ISOPEN ) THEN
4993 CLOSE Line_Var_Cur;
4994 END IF;
4995
4996 APP_EXCEPTION.RAISE_EXCEPTION;
4997 END Check_Line_Variance;
4998
4999 /*=============================================================================
5000 | PROCEDURE Line_BASE_AMOUNT_CALCULATION
5001 |
5002 | DESCRIPTION
5003 | Calculate the functional amount for all the lines which were not
5004 | partiallly or fully accounted. Populate the rounding amount for lines
5005 |
5006 | PARAMETERS
5007 | p_invoice_id
5008 | p_invoice_currency_code
5009 | p_base_currency_code
5010 | p_exchange_rate
5011 | p_need_to_round_flag
5012 | p_calling_sequence
5013 |
5014 | PROGRAM FLOW
5015 |
5016 | KNOWN ISSUES:
5017 |
5018 | NOTES:
5019 |
5020 | MODIFICATION HISTORY
5021 | Date Author Description of Change
5022 |
5023 *============================================================================*/
5024
5025 PROCEDURE Line_Base_Amount_Calculation(
5026 p_invoice_id IN NUMBER,
5027 p_invoice_currency_code IN VARCHAR2,
5028 p_base_currency_code IN VARCHAR2,
5029 p_exchange_rate IN NUMBER,
5030 p_need_to_round_flag IN VARCHAR2 DEFAULT 'N',
5031 p_calling_sequence IN VARCHAR2) IS
5032
5033 l_rounded_line_num ap_invoice_lines.line_number%TYPE;
5034 l_rounded_amt NUMBER;
5035 l_round_amt_exist BOOLEAN := FALSE;
5036 l_key_value NUMBER;
5037
5038 l_debug_loc VARCHAR2(30) := 'Line_Base_Amount_Calculation';
5039 l_curr_calling_sequence VARCHAR2(2000);
5040 l_debug_info VARCHAR2(100);
5041 l_debug_context VARCHAR2(2000);
5042
5043 l_modified_line_rounding_amt NUMBER; --6892789
5044 l_base_amt NUMBER; --6892789
5045 l_round_inv_line_numbers AP_INVOICES_UTILITY_PKG.inv_line_num_tab_type; --6892789
5046 l_amt NUMBER; -- Bug 12686348
5047 l_invoice_type AP_INVOICES.INVOICE_TYPE_LOOKUP_CODE%TYPE; --Bug#10416960
5048
5049 BEGIN
5050
5051 l_curr_calling_sequence := 'AP_APPROVAL_PKG.'||l_debug_loc||
5052 '<-'||p_calling_sequence;
5053
5054 -----------------------------------------------------
5055 l_debug_info := 'Update Invoice Lines Base Amount';
5056 -- Print_Debug(l_debug_loc, l_debug_info);
5057 IF g_debug_mode = 'Y' THEN
5058 AP_Debug_Pkg.Print(g_debug_mode, l_debug_info );
5059 END IF;
5060
5061 IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
5062 FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME||l_debug_loc,l_debug_info);
5063 END IF;
5064 -----------------------------------------------------
5065
5066 UPDATE AP_INVOICE_LINES AIL
5067 SET AIL.base_amount = DECODE(p_base_currency_code, p_invoice_currency_code,
5068 NULL,
5069 ap_utilities_pkg.ap_round_currency(
5070 amount * p_exchange_rate,
5071 p_base_currency_code)),
5072 AIL.last_update_date = SYSDATE,
5073 AIL.last_updated_by = FND_GLOBAL.user_id,
5074 AIL.last_update_login = FND_GLOBAL.login_id
5075 WHERE AIL.invoice_id = p_invoice_id
5076 AND AIL.LINE_TYPE_LOOKUP_CODE not in ('TAX', 'AWT') -- bug 9582952 --bug16090813
5077 -- Bug 6621883
5078 AND (EXISTS ( SELECT 'NOT POSTED'
5079 FROM ap_invoice_distributions_all D
5080 WHERE D.invoice_id = AIL.invoice_id
5081 AND D.invoice_line_number = AIL.line_number
5082 AND NVL(D.posted_flag, 'N') = 'N' )
5083 OR NOT EXISTS (SELECT 'DIST DOES NOT EXIST'
5084 FROM ap_invoice_distributions_all D1
5085 WHERE D1.invoice_id = AIL.invoice_id
5086 AND D1.invoice_line_number = AIL.line_number
5087 AND AIL.amount IS NOT NULL
5088 )
5089 )
5090 --Retropricing: Adjustment Correction lines on the PPA should be
5091 -- excluded. Base amounts on zero amount adjustment lines adjustment
5092 -- correction lines on the PPA is handled while creating PPA Docs.
5093 --Bugfix:4625349, modified the AND clause
5094 AND
5095 ( line_type_lookup_code <> 'RETROITEM' OR
5096 (line_type_lookup_code = 'RETROITEM' and
5097 match_type <> 'ADJUSTMENT_CORRECTION')
5098 );
5099
5100 -----------------------------------------------------
5101 l_debug_info := 'Round Invoice Lines Base Amount';
5102 -- Print_Debug(l_debug_loc, l_debug_info);
5103 IF g_debug_mode = 'Y' THEN
5104 AP_Debug_Pkg.Print(g_debug_mode, l_debug_info );
5105 END IF;
5106
5107 IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
5108 FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME||l_debug_loc,l_debug_info);
5109 END IF;
5110 -----------------------------------------------------
5111
5112 IF ( NVL(p_need_to_round_flag, 'N') = 'Y' ) THEN
5113 --Retropricing: Max of the largest invoice line should exclude
5114 -- Adjustment Correction lines on the PPA as well as the
5115 -- Zero Amt Adjustment line on the Original Invoice.
5116 -- Change needs to be done in apinvutb.pls.
5117
5118 /* modifying following code as per the bug 6892789 as there is a chance
5119 that line base amt goes to -ve value (line amount being +ve) so in such
5120 case, adjust line base amount upto zero and adjust the remaing amount in
5121 another line having next max amount */
5122
5123 --Bug#10416960
5124 SELECT INVOICE_TYPE_LOOKUP_CODE
5125 INTO l_invoice_type
5126 FROM AP_INVOICES_ALL
5127 WHERE INVOICE_ID=p_invoice_id;
5128
5129 IF(l_invoice_type <> 'PO PRICE ADJUST')THEN
5130 -- get the lines which can be adjusted
5131 l_round_amt_exist := AP_INVOICES_UTILITY_PKG.round_base_amts(
5132 X_Invoice_Id => p_invoice_id,
5133 X_Reporting_Ledger_Id => NULL,
5134 X_Rounded_Line_Numbers => l_round_inv_line_numbers,
5135 X_Rounded_Amt => l_rounded_amt,
5136 X_Debug_Info => l_debug_info,
5137 X_Debug_Context => l_debug_context,
5138 X_Calling_sequence => l_curr_calling_sequence);
5139
5140 --adjustment required and there exists line numbers that can be adjusted
5141 IF ( l_round_amt_exist AND l_round_inv_line_numbers.count > 0 ) THEN
5142 -- iterate throgh lines until there is no need to adjust
5143 for i in 1 .. l_round_inv_line_numbers.count
5144 loop
5145 IF l_rounded_amt <> 0 THEN
5146 -- get the existing base amount for the selected line
5147 select base_amount, amount -- Bug 12686348: Added column amount
5148 INTO l_base_amt, l_amt -- Bug 12686348: Added column amount
5149 FROM AP_INVOICE_LINES
5150 WHERE invoice_id = p_invoice_id
5151 AND line_number = l_round_inv_line_numbers(i);
5152
5153 -- get the calculated adjusted base amount and rounding amount
5154 -- get rounding amount for the next line if required
5155 l_base_amt := AP_APPROVAL_PKG.get_adjusted_base_amount(
5156 p_base_amount => l_base_amt,
5157 p_rounding_amt => l_modified_line_rounding_amt,
5158 p_next_line_rounding_amt => l_rounded_amt,
5159 p_amount => l_amt); -- Bug 12686348
5160
5161 -- update the calculatd base amount, rounding amount
5162 UPDATE AP_INVOICE_LINES
5163 SET base_amount = l_base_amt,
5164 rounding_amt = ABS( NVL(l_modified_line_rounding_amt, 0) ),
5165 last_update_date = SYSDATE,
5166 last_updated_by = FND_GLOBAL.user_id,
5167 last_update_login = FND_GLOBAL.login_id
5168 WHERE invoice_id = p_invoice_id
5169 AND line_number = l_round_inv_line_numbers(i)
5170 AND line_type_lookup_code <> 'TAX'; -- bug 9582952
5171 ELSE--adjustment not required or there are no lines that can be adjusted
5172 EXIT;
5173 END IF;
5174 end loop;
5175 END IF;
5176 END IF; --Bug#10416960
5177 END IF;
5178
5179 EXCEPTION
5180 WHEN OTHERS THEN
5181 IF (SQLCODE <> -20001) THEN
5182 FND_MESSAGE.SET_NAME('SQLAP','AP_DEBUG');
5183 FND_MESSAGE.SET_TOKEN('ERROR',SQLERRM);
5184 FND_MESSAGE.SET_TOKEN('CALLING_SEQUENCE', l_curr_calling_sequence);
5185 FND_MESSAGE.SET_TOKEN('PARAMETERS',
5186 'Invoice_id = '|| to_char(p_invoice_id));
5187 FND_MESSAGE.SET_TOKEN('DEBUG_INFO',l_debug_info);
5188 END IF;
5189 APP_EXCEPTION.RAISE_EXCEPTION;
5190 END Line_Base_Amount_Calculation;
5191
5192 /*=============================================================================
5193 | PROCEDURE Dist_BASE_AMOUNT_CALCULATION
5194 |
5195 | DESCRIPTION
5196 | Calculate the functional amount for all the lines and distributions
5197 | which were not partiallly or fully accounted. Populate the rounding
5198 | amount for lines and distribuitons
5199 |
5200 | PARAMETERS
5201 | p_invoice_id
5202 | p_invoice_line_number
5203 | p_invoice_currency_code
5204 | p_base_currency_code
5205 | p_invoice_exchange_rate
5206 |
5207 | p_calling_sequence
5208 |
5209 | PROGRAM FLOW
5210 |
5211 | KNOWN ISSUES:
5212 |
5213 | NOTES:
5214 |
5215 | MODIFICATION HISTORY
5216 | Date Author Description of Change
5217 |
5218 *============================================================================*/
5219
5220 PROCEDURE Dist_Base_Amount_Calculation(
5221 p_invoice_id IN NUMBER,
5222 p_invoice_line_number IN NUMBER,
5223 p_invoice_currency_code IN VARCHAR2,
5224 p_base_currency_code IN VARCHAR2,
5225 p_invoice_exchange_rate IN NUMBER,
5226 p_need_to_round_flag IN VARCHAR2 DEFAULT 'N',
5227 p_calling_sequence IN VARCHAR2) IS
5228
5229
5230 l_round_amt_exists BOOLEAN := FALSE;
5231 l_rounded_amt NUMBER;
5232 l_rounded_dist_id ap_invoice_distributions.INVOICE_DISTRIBUTION_ID%TYPE;
5233 l_debug_loc VARCHAR2(30) := 'Dist_Base_Amount_Calculation';
5234 l_curr_calling_sequence VARCHAR2(2000);
5235 l_debug_info VARCHAR2(1000);
5236 l_debug_context VARCHAR2(2000);
5237
5238 l_base_amt NUMBER; --6892789
5239 l_modified_dist_rounding_amt NUMBER; --6892789
5240 l_round_dist_id_list AP_INVOICE_LINES_PKG.distribution_id_tab_type; --6892789
5241 l_amt NUMBER; -- Bug 12686348
5242
5243 BEGIN
5244
5245 l_curr_calling_sequence := 'AP_APPROVAL_PKG.'||l_debug_loc||
5246 '<-'||p_calling_sequence;
5247
5248 ------------------------------------------------------
5249 l_debug_info := 'Update Distribution Base Amounts';
5250 -- Print_Debug(l_debug_loc, l_debug_info);
5251 IF g_debug_mode = 'Y' THEN
5252 AP_Debug_Pkg.Print(g_debug_mode, l_debug_info );
5253 END IF;
5254
5255 IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
5256 FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME||l_debug_loc,l_debug_info);
5257 END IF;
5258 ------------------------------------------------------
5259
5260 --Bugfix:4625771
5261 --Added the AND clause so as to not to overwrite the
5262 --base_amounts calculated on matched distributions
5263 --which either have an IPV or ERV or both, during the
5264 --earlier call to exec_matched_variance_checks.
5265 UPDATE AP_INVOICE_DISTRIBUTIONS
5266 SET base_amount = DECODE(p_base_currency_code, p_invoice_currency_code,
5267 NULL, ap_utilities_pkg.ap_round_currency(
5268 amount * p_invoice_exchange_rate,
5269 p_base_currency_code)),
5270 last_update_date = SYSDATE,
5271 last_updated_by = FND_GLOBAL.user_id,
5272 last_update_login = FND_GLOBAL.login_id
5273 WHERE invoice_id = p_invoice_id
5274 AND invoice_line_number = p_invoice_line_number
5275 AND NVL(posted_flag,'N') = 'N'
5276 AND NVL(reversal_flag, 'N') = 'N' -- Bug 9178329
5277 --Bugfix:4625771
5278 AND related_id IS NULL
5279 AND line_type_lookup_code NOT IN ('NONREC_TAX', 'REC_TAX', 'TRV', 'TERV', 'TIPV', 'AWT') -- bug 9582952 --bug16090813
5280 AND dist_match_type <> 'ADJUSTMENT_CORRECTION'; --Bug#10416960
5281 ------------------------------------------------------
5282 l_debug_info := 'Round Distribution Base Amounts';
5283 Print_Debug(l_debug_loc, l_debug_info);
5284 ------------------------------------------------------
5285
5286 IF ( NVL(p_need_to_round_flag, 'N') = 'Y' ) THEN
5287
5288 /* modifying following code as per the bug 6892789 as there is a chance that
5289 distribution base amt goes to -ve value (amount being +ve) so in such case,
5290 adjust dist base amount upto zero and adjust the remaing amount in another
5291 distribution having next max amount */
5292
5293 -- get the distributions which can be adjusted
5294 l_round_amt_exists := AP_INVOICE_LINES_PKG.round_base_amts(
5295 x_invoice_id => p_invoice_id,
5296 x_line_number => p_invoice_line_number,
5297 x_reporting_ledger_id => NULL,
5298 x_round_dist_id_list => l_round_dist_id_list,
5299 x_rounded_amt => l_rounded_amt,
5300 x_debug_info => l_debug_info,
5301 x_debug_context => l_debug_context,
5302 x_calling_sequence => l_curr_calling_sequence);
5303
5304 -- adjustment required and there exists dists that can be adjusted
5305 IF ( l_round_amt_exists AND l_round_dist_id_list.count > 0 ) THEN
5306 -- iterate through dists till there is no need to adjust
5307 for i in 1 .. l_round_dist_id_list.count
5308 loop
5309 IF l_rounded_amt <> 0 THEN
5310
5311 -- get the existing base amount for the selected distribution
5312 select base_amount, amount -- Bug 12686348: Added column amount
5313 INTO l_base_amt, l_amt -- Bug 12686348: Added column amount
5314 FROM AP_INVOICE_DISTRIBUTIONS
5315 WHERE invoice_id = p_invoice_id
5316 AND invoice_line_number = p_invoice_line_number
5317 AND invoice_distribution_id = l_round_dist_id_list(i);
5318
5319 -- get the calculated adjusted base amount and rounding amount
5320 -- get rounding amount for the next dist, if required
5321 l_base_amt := AP_APPROVAL_PKG.get_adjusted_base_amount(
5322 p_base_amount => l_base_amt,
5323 p_rounding_amt => l_modified_dist_rounding_amt,
5324 p_next_line_rounding_amt => l_rounded_amt,
5325 p_amount => l_amt); -- Bug 12686348
5326
5327 -- update the calculatd base amount, rounding amount
5328 UPDATE AP_INVOICE_DISTRIBUTIONS
5329 SET base_amount = l_base_amt,
5330 rounding_amt = ABS( l_modified_dist_rounding_amt ),
5331 last_update_date = SYSDATE,
5332 last_updated_by = FND_GLOBAL.user_id,
5333 last_update_login = FND_GLOBAL.login_id
5334 WHERE invoice_distribution_id = l_round_dist_id_list(i)
5335 AND line_type_lookup_code NOT IN ('NONREC_TAX','REC_TAX','TRV','TERV','TIPV'); -- bug 9582952
5336
5337 ELSE
5338 --adjustment not required or there are no dists that can be adjusted
5339 EXIT;
5340 END IF;
5341 end loop;
5342 END IF;
5343 END IF;
5344
5345 EXCEPTION
5346 WHEN OTHERS THEN
5347 IF (SQLCODE <> -20001) THEN
5348 FND_MESSAGE.SET_NAME('SQLAP','AP_DEBUG');
5349 FND_MESSAGE.SET_TOKEN('ERROR',SQLERRM);
5350 FND_MESSAGE.SET_TOKEN('CALLING_SEQUENCE', l_curr_calling_sequence);
5351 FND_MESSAGE.SET_TOKEN('PARAMETERS',
5352 'Invoice_id = '|| to_char(p_invoice_id));
5353 FND_MESSAGE.SET_TOKEN('DEBUG_INFO',l_debug_info);
5354 END IF;
5355 APP_EXCEPTION.RAISE_EXCEPTION;
5356 END Dist_Base_Amount_Calculation;
5357
5358 /*=============================================================================
5359 | PROCEDURE GENERATE_ACCOUNT_EVENT
5360 |
5361 | DESCRIPTION:
5362 | Generate Accounting Event
5363 |
5364 | PARAMETERS
5365 | p_invoice_id
5366 | p_calling_sequence
5367 |
5368 | KNOWN ISSUES:
5369 |
5370 | NOTES:
5371 | Events Project 5
5372 | Before creating new events, we need to check if there are any
5373 | events which have been created with the status 'INCOMPLETE'. If
5374 | there are, and the holds have now been removed, we may want to
5375 | change the status from 'INCOMPLETE' to 'CREATED' rather than
5376 | creating a new event.
5377 |
5378 | MODIFICATION HISTORY
5379 | Date Author Description of Change
5380 |
5381 *============================================================================*/
5382
5383 PROCEDURE Generate_Account_Event(
5384 p_invoice_id IN NUMBER,
5385 p_calling_sequence IN VARCHAR2) IS
5386
5387 l_accounting_event_id NUMBER; -- Events Project - 1
5388 l_null_event_id NUMBER; -- Events Project - 4
5389 l_null_event_id_self NUMBER; -- Bug 7421528
5390
5391 l_debug_loc VARCHAR2(30) := 'Generate_Account_Event';
5392 l_curr_calling_sequence VARCHAR2(2000);
5393 l_debug_info VARCHAR2(1000);
5394
5395 BEGIN
5396
5397 l_curr_calling_sequence := 'AP_APPROVAL_PKG.'||l_debug_loc||'<-'||
5398 p_calling_sequence;
5399
5400 -------------------------------------------------
5401 l_debug_info := 'Accounting Event Generation';
5402 -- Print_Debug(l_debug_loc, l_debug_info);
5403 IF g_debug_mode = 'Y' THEN
5404 AP_Debug_Pkg.Print(g_debug_mode, l_debug_info );
5405 END IF;
5406
5407 IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
5408 FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME||l_debug_loc,l_debug_info);
5409 END IF;
5410 -------------------------------------------------
5411
5412 SELECT count(*)
5413 INTO l_null_event_id
5414 FROM ap_invoice_distributions aid
5415 WHERE aid.invoice_id = P_invoice_id
5416 AND aid.accounting_event_id is NULL;
5417
5418 if(l_null_event_id = 0) then
5419
5420 SELECT count(*)
5421 INTO l_null_event_id_self
5422 FROM ap_self_assessed_tax_dist_all ast
5423 WHERE ast.invoice_id = P_invoice_id
5424 AND ast.accounting_event_id is NULL
5425 AND rownum = 1;
5426
5427 end if ;
5428
5429
5430 AP_ACCOUNTING_EVENTS_PKG.Update_Invoice_Events_Status(
5431 p_invoice_id => p_invoice_id,
5432 p_calling_sequence => l_curr_calling_sequence);
5433
5434 -- IF l_null_event_id > 0 then
5435
5436 --Bug7421528 Added an extra checking
5437
5438 IF (l_null_event_id > 0 or l_null_event_id_self > 0) then
5439
5440 -------------------------------------------------
5441 l_debug_info := 'Accounting Event - create event for null event rows';
5442 -- Print_Debug(l_debug_loc, l_debug_info);
5443 IF g_debug_mode = 'Y' THEN
5444 AP_Debug_Pkg.Print(g_debug_mode, l_debug_info );
5445 END IF;
5446
5447 IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
5448 FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME||l_debug_loc,l_debug_info);
5449 END IF;
5450 -------------------------------------------------
5451
5452 AP_Accounting_Events_Pkg.Create_Events(
5453 p_event_type => 'INVOICES',
5454 p_doc_type => NULL,
5455 p_doc_id => p_invoice_id,
5456 p_accounting_date => NULL,
5457 p_accounting_event_id => l_accounting_event_id,
5458 p_checkrun_name => NULL,
5459 p_calling_sequence => l_curr_calling_sequence);
5460
5461 END IF;
5462
5463 EXCEPTION
5464 WHEN OTHERS THEN
5465 IF (SQLCODE <> -20001) THEN
5466 FND_MESSAGE.SET_NAME('SQLAP','AP_DEBUG');
5467 FND_MESSAGE.SET_TOKEN('ERROR',SQLERRM);
5468 FND_MESSAGE.SET_TOKEN('CALLING_SEQUENCE', l_curr_calling_sequence);
5469 FND_MESSAGE.SET_TOKEN('PARAMETERS',
5470 'Invoice_id = '|| to_char(p_invoice_id));
5471 FND_MESSAGE.SET_TOKEN('DEBUG_INFO',l_debug_info);
5472 END IF;
5473 APP_EXCEPTION.RAISE_EXCEPTION;
5474 END Generate_Account_Event;
5475
5476 /*=============================================================================
5477 | PROCEDURE CHECK_PREPAID_AMOUNT
5478 | Procedure that checks whether the invoice amount is more than
5479 | the prepaid amount
5480 |
5481 | PARAMETERS
5482 | p_invoice_id
5483 | p_system_user
5484 | p_holds
5485 | p_holds_count
5486 | p_release_count
5487 | p_calling_sequence
5488 |
5489 | KNOWN ISSUES:
5490 |
5491 | NOTES:
5492 |
5493 | MODIFICATION HISTORY
5494 | Date Author Description of Change
5495 |
5496 *============================================================================*/
5497
5498 PROCEDURE Check_Prepaid_Amount(
5499 p_invoice_id IN NUMBER,
5500 p_system_user IN NUMBER,
5501 p_holds IN OUT NOCOPY HOLDSARRAY,
5502 p_holds_count IN OUT NOCOPY COUNTARRAY,
5503 p_release_count IN OUT NOCOPY COUNTARRAY,
5504 p_calling_sequence IN VARCHAR2) IS
5505
5506 -- This select modified to use the lines table instead of distributions
5507 -- to get the prepaid_amount, only if the prepayments are not included
5508 -- in the invoice. The prepaid amount will include taxes.
5509
5510 -- Bug 8260168
5511
5512 CURSOR Prepay_Var_Cur IS
5513 SELECT AI.invoice_amount +
5514 (SELECT NVL(SUM(nvl(ail1.amount,0)), 0) --Bug 13050996
5515 FROM ap_invoice_lines_all ail1
5516 WHERE ail1.invoice_id=ai.invoice_id
5517 AND ail1.line_type_lookup_code ='AWT')
5518 ,nvl(AI.amount_paid,0)
5519 , (0 - sum(nvl(AIL.amount,0))) -- taking the remaining amount to be paid on as part of bug 8339454
5520 FROM ap_invoices_all AI, ap_invoice_lines_all AIL
5521 WHERE AI.invoice_id = p_invoice_id
5522 AND AIL.invoice_id = AI.invoice_id
5523 AND AIL.invoice_includes_prepay_flag = 'N' --Bug 13050996: Uncommented out this line
5524 AND AIL.line_type_lookup_code IN ('PREPAY', 'TAX')
5525 AND AIL.prepay_invoice_id IS NOT NULL
5526 AND AIL.prepay_line_number IS NOT NULL
5527 GROUP BY AI.invoice_id, AI.invoice_amount,AI.amount_paid
5528 Having sum(nvl(AIL.amount,0)) <>0; --Bug5724818
5529
5530 l_invoice_amount NUMBER;
5531 l_prepaid_amount NUMBER;
5532 l_paid_amount NUMBER; --added as part of bug 833945 to check paid amount
5533 l_prepay_var_exists VARCHAR2(1) := 'N';
5534 l_debug_loc VARCHAR2(30) := 'Check_Prepaid_Amount';
5535 l_debug_info VARCHAR2(1000);
5536 l_curr_calling_sequence VARCHAR2(2000);
5537
5538 BEGIN
5539
5540 l_curr_calling_sequence := 'AP_APPROVAL_PKG.'||l_debug_loc||
5541 '<-'||p_calling_sequence;
5542
5543 OPEN Prepay_Var_Cur;
5544 LOOP
5545 FETCH Prepay_Var_Cur
5546 INTO l_invoice_amount, l_prepaid_amount,l_paid_amount ;
5547
5548 EXIT WHEN Prepay_Var_Cur%NOTFOUND;
5549
5550 IF l_invoice_amount < l_prepaid_amount THEN
5551 l_prepay_var_exists := 'Y';
5552
5553 -------------------------------------------------
5554 l_debug_info := 'PREPAY VARIANCE hold placed';
5555 -- Print_Debug(l_debug_loc, l_debug_info);
5556 IF g_debug_mode = 'Y' THEN
5557 AP_Debug_Pkg.Print(g_debug_mode, l_debug_info );
5558 END IF;
5559
5560 IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
5561 FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME||l_debug_loc,l_debug_info);
5562 END IF;
5563 -------------------------------------------------
5564 END IF;
5565 IF l_invoice_amount < l_paid_amount THEN -- added as part of bug 833945 to check paid amount should not be greater than invoice amount
5566 l_prepay_var_exists := 'Y';
5567
5568 -------------------------------------------------
5569 l_debug_info := 'PREPAY VARIANCE hold placed';
5570 -- Print_Debug(l_debug_loc, l_debug_info);
5571 IF g_debug_mode = 'Y' THEN
5572 AP_Debug_Pkg.Print(g_debug_mode, l_debug_info );
5573 END IF;
5574
5575 IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
5576 FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME||l_debug_loc,l_debug_info);
5577 END IF;
5578 -------------------------------------------------
5579 END IF; -- end of bug 833945
5580 END LOOP;
5581 CLOSE Prepay_Var_Cur;
5582
5583 Process_Inv_Hold_Status(
5584 p_invoice_id,
5585 null,
5586 null,
5587 'PREPAID AMOUNT',
5588 l_prepay_var_exists,
5589 null,
5590 p_system_user,
5591 p_holds,
5592 p_holds_count,
5593 p_release_count,
5594 l_curr_calling_sequence);
5595
5596 EXCEPTION
5597 WHEN OTHERS THEN
5598 IF (SQLCODE <> -20001) THEN
5599 FND_MESSAGE.SET_NAME('SQLAP','AP_DEBUG');
5600 FND_MESSAGE.SET_TOKEN('ERROR',SQLERRM);
5601 FND_MESSAGE.SET_TOKEN('CALLING_SEQUENCE', l_curr_calling_sequence);
5602 FND_MESSAGE.SET_TOKEN('PARAMETERS',
5603 'Invoice_id = '|| to_char(p_invoice_id));
5604 FND_MESSAGE.SET_TOKEN('DEBUG_INFO',l_debug_info);
5605 END IF;
5606 APP_EXCEPTION.RAISE_EXCEPTION;
5607 END Check_Prepaid_Amount;
5608
5609 /*=============================================================================
5610 | PROCEDURE CHECK_INVOICE_VENDOR
5611 | Procedure that checks if an invoice has any of the following
5612 | 1. Exceeds the invoice amount limit stated at the vendor site level
5613 | and places or releases the AMOUNT' hold
5614 | 2. The vendor site has set to hold future payments and places or
5615 | release the 'VENDOR' hold
5616 |
5617 | PARAMETERS
5618 | p_invoice_id
5619 | p_base_currency_code
5620 | p_invoice_amount
5621 | p_base_amount
5622 | p_invoice_currency_code
5623 | p_invoice_amount_limit
5624 | p_hold_future_payments_flag
5625 | p_system_user
5626 | p_holds
5627 | p_holds_count
5628 | p_release_count
5629 | p_calling_sequence
5630 |
5631 | KNOWN ISSUES:
5632 |
5633 | NOTES:
5634 |
5635 | MODIFICATION HISTORY
5636 | Date Author Description of Change
5637 |
5638 *============================================================================*/
5639
5640 PROCEDURE Check_invoice_vendor(
5641 p_invoice_id IN NUMBER,
5642 p_base_currency_code IN VARCHAR2,
5643 p_invoice_amount IN NUMBER,
5644 p_base_amount IN NUMBER,
5645 p_invoice_currency_code IN VARCHAR2,
5646 p_invoice_amount_limit IN NUMBER,
5647 p_hold_future_payments_flag IN VARCHAR2,
5648 p_system_user IN NUMBER,
5649 p_holds IN OUT NOCOPY HOLDSARRAY,
5650 p_holds_count IN OUT NOCOPY COUNTARRAY,
5651 p_release_count IN OUT NOCOPY COUNTARRAY,
5652 p_calling_sequence IN VARCHAR2) IS
5653
5654 l_amount_hold_required VARCHAR2(1) := 'N';
5655 l_debug_loc VARCHAR2(30) := 'Check_invoice_vendor';
5656 l_curr_calling_sequence VARCHAR2(2000);
5657 l_debug_info VARCHAR2(1000);
5658
5659 BEGIN
5660
5661
5662 l_curr_calling_sequence := 'AP_APPROVAL_PKG.'||l_debug_loc||
5663 '<-'||p_calling_sequence;
5664 /*-----------------------------------------------------------------+
5665 | Check invoice amount limit |
5666 +-----------------------------------------------------------------*/
5667
5668 IF (p_invoice_amount_limit is not null) THEN
5669
5670 IF ((p_invoice_currency_code = p_base_currency_code and
5671 p_invoice_amount > p_invoice_amount_limit) or
5672 (p_invoice_currency_code <> p_base_currency_code and
5673 p_base_amount > p_invoice_amount_limit)) THEN
5674 l_amount_hold_required := 'Y';
5675 ELSE
5676 l_amount_hold_required := 'N';
5677 END IF;
5678 END IF;
5679
5680 -------------------------------------------------------
5681 l_debug_info := 'AMOUNT hold placed: '||l_amount_hold_required;
5682 -- Print_Debug(l_debug_loc, l_debug_info);
5683 IF g_debug_mode = 'Y' THEN
5684 AP_Debug_Pkg.Print(g_debug_mode, l_debug_info );
5685 END IF;
5686
5687 IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
5688 FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME||l_debug_loc,l_debug_info);
5689 END IF;
5690 -------------------------------------------------------
5691
5692 Process_Inv_Hold_Status(
5693 p_invoice_id,
5694 null,
5695 null,
5696 'AMOUNT',
5697 l_amount_hold_required,
5698 null,
5699 p_system_user,
5700 p_holds,
5701 p_holds_count,
5702 p_release_count,
5703 l_curr_calling_sequence);
5704
5705 -------------------------------------------------------
5706 l_debug_info := 'Check_invoice_vendor - check hold future payment';
5707 -- Print_Debug(l_debug_loc, l_debug_info);
5708 IF g_debug_mode = 'Y' THEN
5709 AP_Debug_Pkg.Print(g_debug_mode, l_debug_info );
5710 END IF;
5711
5712 IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
5713 FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME||l_debug_loc,l_debug_info);
5714 END IF;
5715 -------------------------------------------------------
5716
5717 Process_Inv_Hold_Status(
5718 p_invoice_id,
5719 null,
5720 null,
5721 'VENDOR',
5722 p_hold_future_payments_flag,
5723 null,
5724 p_system_user,
5725 p_holds,
5726 p_holds_count,
5727 p_release_count,
5728 l_curr_calling_sequence);
5729
5730 EXCEPTION
5731 WHEN OTHERS THEN
5732 IF (SQLCODE <> -20001) THEN
5733 FND_MESSAGE.SET_NAME('SQLAP','AP_DEBUG');
5734 FND_MESSAGE.SET_TOKEN('ERROR',SQLERRM);
5735 FND_MESSAGE.SET_TOKEN('CALLING_SEQUENCE', l_curr_calling_sequence);
5736 FND_MESSAGE.SET_TOKEN('PARAMETERS',
5737 'Invoice_id = '|| to_char(p_invoice_id)
5738 ||', Base Currency Code = '|| p_base_currency_code
5739 ||', Invoice Currency Code = '|| p_invoice_currency_code
5740 ||', Invoice Amount = '|| to_char(p_invoice_amount)
5741 ||', Base Amount = '|| to_char(p_base_amount)
5742 ||', Invoice Amount Limit = '|| to_char(p_invoice_amount_limit)
5743 ||', Hold Future Payments Flag = '|| p_hold_future_payments_flag);
5744 FND_MESSAGE.SET_TOKEN('DEBUG_INFO',l_debug_info);
5745 END IF;
5746 APP_EXCEPTION.RAISE_EXCEPTION;
5747 END Check_invoice_vendor;
5748
5749
5750 /*=============================================================================
5751 | PROCEDURE Check_Manual_AWT_Segments
5752 | Procedure that checks AWT Account segments
5753 |
5754 |
5755 | PARAMETERS
5756 | p_invoice_id
5757 | p_system_user
5758 | p_holds
5759 | p_holds_count
5760 | p_release_count
5761 | p_calling_sequence
5762 |
5763 | KNOWN ISSUES:
5764 |
5765 | NOTES:
5766 | FOR NON-AWT LINES
5767 | 1. Excluding the tax line on the prepayment from the distributions
5768 | 2. Including the Prepayment and Prepayment Tax if
5769 | invoice_includes_prepay_flag = 'Y'
5770 | MODIFICATION HISTORY
5771 | Date Author Description of Change
5772 |
5773 *============================================================================*/
5774
5775 PROCEDURE Check_Manual_AWT_Segments(
5776 p_invoice_id IN NUMBER,
5777 p_system_user IN NUMBER,
5778 p_holds IN OUT NOCOPY HOLDSARRAY,
5779 p_holds_count IN OUT NOCOPY COUNTARRAY,
5780 p_release_count IN OUT NOCOPY COUNTARRAY,
5781 p_calling_sequence IN VARCHAR2) IS
5782
5783 CURSOR c_manual_awt_dist_segs is
5784 SELECT ap_utilities_pkg.get_auto_offsets_segments(
5785 aid.dist_code_combination_id)
5786 FROM ap_invoice_distributions aid
5787 WHERE aid.invoice_id = p_invoice_id
5788 AND aid.line_type_lookup_code = 'AWT'
5789 AND aid.awt_flag = 'M';
5790
5791 -- eTax Uptake. This select modified to use the
5792 -- prepay_distribution_id column to determine if a distribution
5793 -- is not created by a prepayment application
5794 -- and include the lines table to know if the prepayment was included
5795 -- in the invoice
5796 CURSOR c_non_awt_dists_segs is
5797 SELECT ap_utilities_pkg.get_auto_offsets_segments(
5798 aid.dist_code_combination_id)
5799 FROM ap_invoice_distributions_all aid, ap_invoice_lines_all ail
5800 WHERE ail.invoice_id = p_invoice_id
5801 AND ail.invoice_id = aid.invoice_id
5802 AND ail.line_number = aid.invoice_line_number
5803 AND ((aid.line_type_lookup_code not in ('AWT','PREPAY')
5804 AND aid.prepay_distribution_id IS NULL)
5805 OR NVL(ail.invoice_includes_prepay_flag,'N') = 'Y');
5806
5807
5808 l_manual_awt_dist_segs VARCHAR2(100);
5809 l_non_awt_dist_segs VARCHAR2(100);
5810 p_dist_segs_hold_required VARCHAR2(1);
5811 l_curr_calling_sequence VARCHAR2(2000);
5812 l_debug_info VARCHAR2(1000);
5813
5814
5815 BEGIN
5816
5817 l_curr_calling_sequence := 'AP_APPROVAL_PKG.Check_Manual_AWT_Segments'||'<-'
5818 ||p_calling_sequence;
5819
5820 OPEN c_manual_awt_dist_segs;
5821 LOOP
5822 FETCH c_manual_awt_dist_segs into l_manual_awt_dist_segs;
5823 EXIT WHEN c_manual_awt_dist_segs%NOTFOUND ;
5824 OPEN c_non_awt_dists_segs;
5825 LOOP
5826 FETCH c_non_awt_dists_segs into l_non_awt_dist_segs;
5827 EXIT WHEN c_non_awt_dists_segs%NOTFOUND ;
5828
5829 IF ( l_non_awt_dist_segs = l_manual_awt_dist_segs ) THEN
5830 p_dist_segs_hold_required := 'N' ;
5831 EXIT;
5832 ELSE
5833 p_dist_segs_hold_required := 'Y';
5834 END IF;
5835 END LOOP;
5836 CLOSE c_non_awt_dists_segs;
5837 END LOOP;
5838 CLOSE c_manual_awt_dist_segs;
5839
5840 /*-----------------------------------------------------------------+
5841 | Process Invoice Hold FUTURE PERIOD |
5842 +-----------------------------------------------------------------*/
5843
5844 Process_Inv_Hold_Status(
5845 p_invoice_id,
5846 null,
5847 null,
5848 'AWT ACCT INVALID',
5849 p_dist_segs_hold_required,
5850 null,
5851 p_system_user,
5852 p_holds,
5853 p_holds_count,
5854 p_release_count,
5855 l_curr_calling_sequence);
5856
5857 END Check_Manual_AWT_Segments;
5858
5859 /*=============================================================================
5860 | PROCEDURE GET_INV_MATCHED_STATUS
5861 | Function given an invoice_id returns TRUE ifthe invoice has any matched
5862 | distribution lines, otherwise FALSE
5863 |
5864 | PARAMETERS
5865 | p_invoice_id
5866 | p_calling_sequence
5867 |
5868 | KNOWN ISSUES:
5869 |
5870 | NOTES:
5871 |
5872 | MODIFICATION HISTORY
5873 | Date Author Description of Change
5874 |
5875 *============================================================================*/
5876
5877 FUNCTION Get_Inv_Matched_Status(
5878 p_invoice_id IN NUMBER,
5879 p_calling_sequence IN VARCHAR2) RETURN BOOLEAN
5880 IS
5881
5882 l_matched_count NUMBER;
5883 l_debug_loc VARCHAR2(30) := 'Get_Inv_Matched_Status';
5884 l_curr_calling_sequence VARCHAR2(2000);
5885 l_debug_info VARCHAR2(1000);
5886
5887 BEGIN
5888
5889 l_curr_calling_sequence := 'AP_APPROVAL_PKG.'||l_debug_loc||'<-'||
5890 p_calling_sequence;
5891
5892 SELECT count(*)
5893 INTO l_matched_count
5894 FROM ap_invoice_distributions
5895 WHERE invoice_id = p_invoice_id
5896 AND po_distribution_id is not null
5897 AND ( line_type_lookup_code in ( 'ITEM', 'ACCRUAL', 'IPV')
5898 OR /*Bug 9242891: Added below conditions for considering retainage release inv and return matched status*/
5899 (line_type_lookup_code = 'RETAINAGE'
5900 AND retained_invoice_dist_id is not NULL));
5901
5902 IF (l_matched_count > 0) THEN
5903 return(TRUE);
5904 ELSE
5905 return(FALSE);
5906 END IF;
5907
5908 EXCEPTION
5909 WHEN NO_DATA_FOUND THEN
5910 return(FALSE);
5911 WHEN OTHERS THEN
5912 IF (SQLCODE <> -20001) THEN
5913 FND_MESSAGE.SET_NAME('SQLAP','AP_DEBUG');
5914 FND_MESSAGE.SET_TOKEN('ERROR',SQLERRM);
5915 FND_MESSAGE.SET_TOKEN('CALLING_SEQUENCE', l_curr_calling_sequence);
5916 FND_MESSAGE.SET_TOKEN('PARAMETERS',
5917 'Invoice_id = '|| to_char(p_invoice_id));
5918 END IF;
5919 APP_EXCEPTION.RAISE_EXCEPTION;
5920 END Get_Inv_Matched_Status;
5921
5922
5923 /* ============================================================================
5924 | WITHHOLD_TAX_ON:
5925 |
5926 | Procedure that calls the withholding tax package on an invoice and checks
5927 | for any errors. Depending on whether an error exists or not, a hold gets
5928 | placed or released.
5929 |
5930 | Parameters:
5931 |
5932 | p_invoice_id : Invoice Id
5933 | p_gl_date_from_receipt : GL Date From Receipt Flag system option
5934 | p_last_updated_by : Column Who Info
5935 | p_last_update_login : Column Who Info
5936 | p_program_application_id : Column Who Info
5937 | p_program_id : Column Who Info
5938 | p_request_id : Column Who Info
5939 | p_system_user : Approval Program User Id
5940 | p_holds : Hold Array
5941 | p_holds_count : Holds Count Array
5942 | p_release_count : Release Count Array
5943 | p_calling_sequence : Debugging string to indicate path of module
5944 | calls to be printed out upon error.
5945 |
5946 | Program Flow:
5947 | -------------
5948 |
5949 | Check if okay to call Withholding Routine
5950 | invoice has at lease on distribution with a withholding tax group
5951 | invoice has not already been withheld by the system
5952 | invoice has no user non-releaseable holds (ther than AWT ERROR)
5953 | invoice has no manual withholding lines
5954 | IF okay then call AP_DO_WITHHOLDING package on the invoice
5955 | Depending on whether withholding is successful or not, place or
5956 | or release the 'AWT ERROR' with the new error reason.
5957 | (If the invoice already has the hold we want to release the old one and
5958 | replace the hold with the new error reason)
5959 |============================================================================ */
5960
5961 PROCEDURE Withhold_Tax_On(
5962 p_invoice_id IN NUMBER,
5963 p_gl_date_from_receipt IN VARCHAR2,
5964 p_last_updated_by IN NUMBER,
5965 p_last_update_login IN NUMBER,
5966 p_program_application_id IN NUMBER,
5967 p_program_id IN NUMBER,
5968 p_request_id IN NUMBER,
5969 p_system_user IN NUMBER,
5970 p_holds IN OUT NOCOPY HOLDSARRAY,
5971 p_holds_count IN OUT NOCOPY COUNTARRAY,
5972 p_release_count IN OUT NOCOPY COUNTARRAY,
5973 p_calling_sequence IN VARCHAR2)
5974 IS
5975 l_ok_to_withhold VARCHAR2(30);
5976 l_withholding_amount NUMBER;
5977 l_withholding_date DATE;
5978 l_invoice_num VARCHAR2(50);
5979 l_return_string VARCHAR2(2000);
5980 l_withhold_error_exists VARCHAR2(1);
5981 l_debug_loc VARCHAR2(30) := 'Withhold_Tax_On';
5982 l_curr_calling_sequence VARCHAR2(2000);
5983 l_debug_info VARCHAR2(1000);
5984 l_calling_sequence VARCHAR2(20);
5985 l_withhold_date_basis VARCHAR2(20); -- bug 9293773
5986
5987 BEGIN
5988
5989 l_curr_calling_sequence := 'AP_APPROVAL_PKG.'||l_debug_loc||'<-'||p_calling_sequence;
5990
5991 l_withhold_error_exists := 'N';
5992
5993 ----------------------------------------------------
5994 -- Execute Core Withholding Tax Calculation Routine
5995 ----------------------------------------------------
5996
5997 IF (NOT Ap_Extended_Withholding_Pkg.Ap_Extended_Withholding_Active) THEN
5998 BEGIN
5999 ------------------------------------------------------------------------
6000 l_debug_info := 'Check if okay to call Withholding Routine - Core';
6001 ------------------------------------------------------------------------
6002 -- invoice has at least one distribution with a withholding tax group --
6003 -- invoice has not already been withheld by the system --
6004 -- invoice has no user non-releaseable holds (ther than AWT ERROR) --
6005 -- invoice has no manual withholding lines --
6006 ------------------------------------------------------------------------
6007 -- Perf bug 5058995
6008 -- Modify below SQL to go to base tables : AP_INVOICES_ALL and
6009 -- AP_INVOICE_DISTRIBUTIONS_ALL
6010 SELECT 'OK to call Withholding Routine',
6011 (AI.invoice_amount * NVL(AI.exchange_rate, 1)),
6012 AI.invoice_num
6013 INTO l_ok_to_withhold,
6014 l_withholding_amount,
6015 l_invoice_num
6016 FROM ap_invoices_all AI
6017 WHERE AI.invoice_id = p_invoice_id
6018 AND EXISTS (SELECT 'At least 1 dist has an AWT Group'
6019 FROM ap_invoice_distributions_all AID1
6020 WHERE AID1.invoice_id = AI.invoice_id
6021 AND AID1.awt_group_id IS NOT NULL)
6022 AND NOT EXISTS (SELECT 'Unreleased System holds exist'
6023 FROM ap_holds AH,
6024 ap_hold_codes AHC
6025 WHERE AH.invoice_id = AI.invoice_id
6026 AND AH.release_lookup_code IS NULL
6027 AND AH.hold_lookup_code <> 'AWT ERROR'
6028 AND AH.hold_lookup_code = AHC.hold_lookup_code
6029 AND AHC.user_releaseable_flag = 'N')
6030 AND NOT EXISTS (SELECT 'Manual AWT lines exist'
6031 FROM ap_invoice_distributions_all AID
6032 WHERE AID.invoice_id = AI.invoice_id
6033 AND AID.line_type_lookup_code = 'AWT'
6034 AND AID.awt_flag IN ('M', 'O'));
6035
6036 /* SELECT MAX(accounting_date)
6037 INTO l_withholding_date
6038 FROM ap_invoice_distributions
6039 WHERE invoice_id = p_invoice_id
6040 AND awt_group_id IS NOT NULL; */
6041 /* 5886500 */
6042 --bug 9293773
6043 SELECT nvl(asp.withholding_date_basis,'INVOICEDATE')
6044 INTO l_withhold_date_basis
6045 FROM ap_system_parameters_all asp,
6046 ap_invoices_all ai
6047 WHERE ai.invoice_id = p_invoice_id
6048 AND ai.org_id = asp.org_id;
6049
6050 IF l_withhold_date_basis = 'INVOICEDATE' THEN
6051 SELECT invoice_date
6052 INTO l_withholding_date
6053 FROM ap_invoices
6054 WHERE invoice_id = p_invoice_id;
6055 ELSE
6056 SELECT gl_date
6057 INTO l_withholding_date
6058 FROM ap_invoices
6059 WHERE invoice_id = p_invoice_id;
6060 END IF;
6061 --bug 9293773
6062
6063 EXCEPTION
6064 WHEN NO_DATA_FOUND THEN
6065 RETURN;
6066 END;
6067
6068 --------------------------------------------------
6069 l_debug_info := 'Call the Withholding API - Core';
6070 --------------------------------------------------
6071
6072 AP_WITHHOLDING_PKG.AP_DO_WITHHOLDING(
6073 p_invoice_id,
6074 l_withholding_date,
6075 'AUTOAPPROVAL',
6076 l_withholding_amount,
6077 NULL,
6078 NULL,
6079 p_last_updated_by,
6080 p_last_update_login,
6081 p_program_application_id,
6082 p_program_id,
6083 p_request_id,
6084 l_return_string);
6085 ELSE
6086
6087 ---------------------------------------------------------
6088 -- Execute Extended Withholding Tax Calculation Routine
6089 ---------------------------------------------------------
6090
6091 BEGIN
6092 ------------------------------------------------------------------------
6093 l_debug_info := 'Check if okay to call Withholding Routine - Extended';
6094 ------------------------------------------------------------------------
6095 -- invoice has at least one distribution with a withholding tax group --
6096 -- invoice has not already been withheld by the system --
6097 -- invoice has no user non-releaseable holds (ther than AWT ERROR) --
6098 -- invoice has no manual withholding lines --
6099 ------------------------------------------------------------------------
6100
6101 -- Perf bug 5058995
6102 -- Modify below SQL to go to base tables : AP_INVOICES_ALL and
6103 -- AP_INVOICE_DISTRIBUTIONS_ALL
6104 SELECT 'OK to call Withholding Routine',
6105 (AI.invoice_amount * NVL(AI.exchange_rate,1)),
6106 AI.invoice_num
6107 INTO l_ok_to_withhold,
6108 l_withholding_amount,
6109 l_invoice_num
6110 FROM ap_invoices_all AI
6111 WHERE AI.invoice_id = p_invoice_id
6112 AND NOT EXISTS (SELECT 'Unreleased System holds exist'
6113 FROM ap_holds AH,
6114 ap_hold_codes AHC
6115 WHERE AH.invoice_id = AI.invoice_id
6116 AND AH.release_lookup_code IS NULL
6117 AND AH.hold_lookup_code <> 'AWT ERROR'
6118 AND AH.hold_lookup_code = AHC.hold_lookup_code
6119 AND AHC.user_releaseable_flag = 'N')
6120 AND NOT EXISTS (SELECT 'Manual AWT lines exist'
6121 FROM ap_invoice_distributions_all AID
6122 WHERE AID.invoice_id = AI.invoice_id
6123 AND AID.line_type_lookup_code = 'AWT'
6124 AND AID.awt_flag IN ('M', 'O'));
6125
6126 SELECT MAX(accounting_date)
6127 INTO l_withholding_date
6128 FROM ap_invoice_distributions
6129 WHERE invoice_id = p_invoice_id;
6130
6131 EXCEPTION
6132 WHEN NO_DATA_FOUND THEN
6133 RETURN;
6134 END;
6135
6136 ------------------------------------------------------
6137 l_debug_info := 'Call the Withholding API - Extended';
6138 ------------------------------------------------------
6139
6140 IF INSTR(p_calling_sequence, 'AP_CANCEL_PKG') > 0 THEN
6141 l_calling_sequence := 'INVOICE CANCEL';
6142 ELSE
6143 l_calling_sequence := 'AUTOAPPROVAL';
6144 END IF;
6145
6146 AP_WITHHOLDING_PKG.AP_DO_WITHHOLDING(
6147 p_invoice_id,
6148 l_withholding_date,
6149 l_calling_sequence,
6150 l_withholding_amount,
6151 NULL,
6152 NULL,
6153 p_last_updated_by,
6154 p_last_update_login,
6155 p_program_application_id,
6156 p_program_id,
6157 p_request_id,
6158 l_return_string);
6159
6160 END IF;
6161
6162 ----------------------------------------
6163 l_debug_info := 'Process Return String';
6164 ----------------------------------------
6165
6166 IF (l_return_string <> 'SUCCESS') THEN
6167
6168 l_withhold_error_exists := 'Y';
6169
6170 END IF;
6171
6172 -------------------------------------------------------------
6173 l_debug_info := 'Process Invoice Hold Status for AWT ERROR';
6174 -------------------------------------------------------------
6175
6176 Process_Inv_Hold_Status(
6177 p_invoice_id,
6178 NULL,
6179 NULL,
6180 'AWT ERROR',
6181 l_withhold_error_exists,
6182 l_return_string,
6183 p_system_user,
6184 p_holds,
6185 p_holds_count,
6186 p_release_count,
6187 p_calling_sequence);
6188
6189 EXCEPTION
6190 WHEN OTHERS THEN
6191 IF (SQLCODE <> -20001) THEN
6192 FND_MESSAGE.SET_NAME('SQLAP','AP_DEBUG');
6193 FND_MESSAGE.SET_TOKEN('ERROR',SQLERRM);
6194 FND_MESSAGE.SET_TOKEN('CALLING_SEQUENCE', l_curr_calling_sequence);
6195 FND_MESSAGE.SET_TOKEN('PARAMETERS',
6196 'Invoice_id = '|| to_char(p_invoice_id)
6197 ||', Dist_line_num = '|| p_gl_date_from_receipt
6198 ||', Packet_id = '|| p_last_updated_by
6199 ||', Fundscheck mode = '|| p_last_update_login
6200 ||', Dist_line_num = '|| to_char(p_program_application_id)
6201 ||', Dist_line_num = '|| to_char(p_program_id)
6202 ||', Dist_line_num = '|| to_char(p_request_id));
6203 FND_MESSAGE.SET_TOKEN('DEBUG_INFO',l_debug_info);
6204 END IF;
6205 APP_EXCEPTION.RAISE_EXCEPTION;
6206 END Withhold_Tax_On;
6207
6208
6209 /*=============================================================================
6210 | PROCEDURE UPDATE_INV_DISTS_TO_APPROVED
6211 | Procedure that updates the invoice distribution match_status_flag to
6212 | 'A' if encumbered or has no postable holds or is a reversal line,
6213 | otherwise if the invoice has postable holds then the match_status_flag
6214 | remains a 'T'.
6215 |
6216 | PARAMETERS
6217 | p_invoice_id
6218 | p_user_id
6219 | p_calling_sequence
6220 |
6221 | KNOWN ISSUES:
6222 |
6223 | NOTES:
6224 |
6225 | MODIFICATION HISTORY
6226 | Date Author Description of Change
6227 |
6228 *============================================================================*/
6229
6230 PROCEDURE Update_Inv_Dists_To_Approved(
6231 p_invoice_id IN NUMBER,
6232 p_user_id IN NUMBER,
6233 p_calling_sequence IN VARCHAR2) IS
6234
6235 l_debug_loc VARCHAR2(30) := 'Update_Inv_Dists_To_Approved';
6236 l_curr_calling_sequence VARCHAR2(2000);
6237 l_debug_info VARCHAR2(1000);
6238
6239 l_dbi_key_value_list1 ap_dbi_pkg.r_dbi_key_value_arr;
6240 l_dbi_key_value_list2 ap_dbi_pkg.r_dbi_key_value_arr;
6241
6242 BEGIN
6243
6244
6245 l_curr_calling_sequence := 'AP_APPROVAL_PKG.'||l_debug_loc||'<-'||
6246 p_calling_sequence;
6247
6248 ------------------------------------------------------------
6249 l_debug_info := 'Set selected dists match_status_flag to tested';
6250 -- Print_Debug(l_debug_loc, l_debug_info);
6251 IF g_debug_mode = 'Y' THEN
6252 AP_Debug_Pkg.Print(g_debug_mode, l_debug_info );
6253 END IF;
6254
6255 IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
6256 FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME||l_debug_loc,l_debug_info);
6257 END IF;
6258 ------------------------------------------------------------
6259 --Used the base table insead of secured synonym bug 10171820
6260
6261 UPDATE ap_invoice_distributions_all D
6262 SET match_status_flag = 'T',
6263 last_update_date = SYSDATE,
6264 last_updated_by = p_user_id,
6265 program_application_id = decode(fnd_global.prog_appl_id,
6266 -1,null,
6267 fnd_global.prog_appl_id),
6268 request_id = decode(fnd_global.conc_request_id,
6269 -1,null, fnd_global.conc_request_id),
6270 program_id = decode(fnd_global.conc_program_id,
6271 -1,null, fnd_global.conc_program_id),
6272 program_update_date = decode(fnd_global.conc_program_id,
6273 -1,null, SYSDATE)
6274 WHERE match_status_flag = 'S'
6275 AND D.invoice_id = p_invoice_id;
6276
6277 --Bug6963908
6278 UPDATE ap_self_assessed_tax_dist_all D
6279 SET match_status_flag = 'T',
6280 last_update_date = SYSDATE,
6281 last_updated_by = p_user_id,
6282 program_application_id = decode(fnd_global.prog_appl_id,
6283 -1,null,
6284 fnd_global.prog_appl_id),
6285 request_id = decode(fnd_global.conc_request_id,
6286 -1,null, fnd_global.conc_request_id),
6287 program_id = decode(fnd_global.conc_program_id,
6288 -1,null, fnd_global.conc_program_id),
6289 program_update_date = decode(fnd_global.conc_program_id,
6290 -1,null, SYSDATE)
6291 WHERE match_status_flag = 'S'
6292 AND D.invoice_id = p_invoice_id;
6293 --Bug6963908
6294
6295
6296 AP_DBI_PKG.Maintain_DBI_Summary
6297 (p_table_name => 'AP_INVOICE_DISTRIBUTIONS',
6298 p_operation => 'U',
6299 p_key_value1 => p_invoice_id,
6300 p_key_value_list => l_dbi_key_value_list1,
6301 p_calling_sequence => l_curr_calling_sequence);
6302
6303 ------------------------------------------------------------
6304 l_debug_info := 'Set Tested dists to Approved if no unpostable holds';
6305 -- Print_Debug(l_debug_loc, l_debug_info);
6306 IF g_debug_mode = 'Y' THEN
6307 AP_Debug_Pkg.Print(g_debug_mode, l_debug_info );
6308 END IF;
6309
6310 IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
6311 FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME||l_debug_loc,l_debug_info);
6312 END IF;
6313 ------------------------------------------------------------
6314
6315 -- BUG 4340061
6316 -- For the AWT lines we have encumbered_flag set to N in invoice-dist.
6317 --Used the base table insead of secured synonym bug 10171820
6318 UPDATE ap_invoice_distributions_all D
6319 SET match_status_flag = 'A',
6320 packet_id = ''
6321 WHERE match_status_flag = 'T'
6322 AND D.invoice_id = p_invoice_id
6323 AND ((NOT EXISTS
6324 (SELECT invoice_id
6325 FROM ap_holds H, ap_hold_codes C
6326 WHERE H.invoice_id = D.invoice_id
6327 AND H.hold_lookup_code = C.hold_lookup_code
6328 AND ((H.release_lookup_code IS NULL) AND
6329 ((C.postable_flag = 'N') OR
6330 (C.postable_flag = 'X')))))
6331 OR (D.line_type_lookup_code<>'AWT' and
6332 (nvl(D.encumbered_flag, 'N') in ('Y','W','D','X','R','T')))
6333 OR (D.line_type_lookup_code='AWT' and
6334 (nvl(D.encumbered_flag, 'N') in ('Y','W','D','X','R')))); -- BUG 4340061
6335
6336
6337 --Bug6963908
6338 UPDATE ap_self_assessed_tax_dist_all D
6339 SET match_status_flag = 'A',
6340 packet_id = ''
6341 WHERE match_status_flag = 'T'
6342 AND D.invoice_id = p_invoice_id
6343 AND ((NOT EXISTS
6344 (SELECT invoice_id
6345 FROM ap_holds H, ap_hold_codes C
6346 WHERE H.invoice_id = D.invoice_id
6347 AND H.hold_lookup_code = C.hold_lookup_code
6348 AND ((H.release_lookup_code IS NULL) AND
6349 ((C.postable_flag = 'N') OR
6350 (C.postable_flag = 'X')))))
6351 OR (D.line_type_lookup_code<>'AWT' and
6352 (nvl(D.encumbered_flag, 'N') in ('Y','W','D','X','R','T')))
6353 OR (D.line_type_lookup_code='AWT' and
6354 (nvl(D.encumbered_flag, 'N') in ('Y','W','D','X','R')))); -- BUG 4340061
6355 --Bug6963908
6356
6357 EXCEPTION
6358 WHEN OTHERS THEN
6359 IF (SQLCODE <> -20001) THEN
6360 FND_MESSAGE.SET_NAME('SQLAP','AP_DEBUG');
6361 FND_MESSAGE.SET_TOKEN('ERROR',SQLERRM);
6362 FND_MESSAGE.SET_TOKEN('CALLING_SEQUENCE', l_curr_calling_sequence);
6363 FND_MESSAGE.SET_TOKEN('PARAMETERS',
6364 'Invoice_id = '|| to_char(p_invoice_id)
6365 || 'Run Option = ' || p_user_id);
6366 FND_MESSAGE.SET_TOKEN('DEBUG_INFO',l_debug_info);
6367 END IF;
6368 APP_EXCEPTION.RAISE_EXCEPTION;
6369 END Update_Inv_Dists_To_Approved;
6370
6371 --============================================================================
6372 -- HOLD Processing Routines
6373 --============================================================================
6374
6375 /*=============================================================================
6376 | PROCEDURE PROCESS_INV_HOLD_STATUS
6377 | Procedure that process and invoice hold status. Determines whether to
6378 | place or release a given hold.
6379 |
6380 | PARAMETERS
6381 | p_invoice_id
6382 | p_line_location_id: Line Location Id
6383 | p_rcv_tansaction_id: rcv transaction id it is matched to
6384 | p_hold_lookup_code: Hold Lookup Code
6385 | p_should_have_hold: ('Y' or 'N') to indicate whether the invoice
6386 | should have the hold (previous parameter)
6387 | p_hold_reason: AWT ERROR parameter. The only hold whose hold reason
6388 | is not static.
6389 | p_system_user: Approval Program User Id
6390 | p_holds: Holds Array
6391 | p_holds_count: Holds Count Array
6392 | p_release_count: Release Count Array
6393 | p_calling_sequence: Debugging string to indicate path of module calls
6394 | to be printed out upon error.
6395 |
6396 | PROGRAM FLOW:
6397 | Retrieve current hold_status for current hold
6398 | IF already_on_hold
6399 | IF shoould_not_have_hold OR if p_hold_reason is different from the
6400 | exists hold reason
6401 | Release the hold
6402 | ELSIF should_have_hold and hold_status <> Released By User
6403 | IF p_hold_reason is null or existing_hold_reason id different from
6404 | p_hold_reason
6405 | Place the hold on the invoice
6406 |
6407 | KNOWN ISSUES:
6408 |
6409 | NOTES:
6410 |
6411 | MODIFICATION HISTORY
6412 | Date Author Description of Change
6413 |
6414 *============================================================================*/
6415
6416 PROCEDURE Process_Inv_Hold_Status(
6417 p_invoice_id IN NUMBER,
6418 p_line_location_id IN NUMBER,
6419 p_rcv_transaction_id IN NUMBER,
6420 p_hold_lookup_code IN VARCHAR2,
6421 p_should_have_hold IN VARCHAR2,
6422 p_hold_reason IN VARCHAR2,
6423 p_system_user IN NUMBER,
6424 p_holds IN OUT NOCOPY HOLDSARRAY,
6425 p_holds_count IN OUT NOCOPY COUNTARRAY,
6426 p_release_count IN OUT NOCOPY COUNTARRAY,
6427 p_calling_sequence IN VARCHAR2)IS
6428 l_inv_hold_status VARCHAR2(20);
6429 l_existing_hold_reason VARCHAR2(240);
6430 l_user_id NUMBER;
6431 l_resp_id NUMBER;
6432 l_debug_loc VARCHAR2(30) := 'Process_Inv_Hold_Status';
6433 l_curr_calling_sequence VARCHAR2(2000);
6434 l_debug_info VARCHAR2(1000);
6435 BEGIN
6436
6437 l_curr_calling_sequence := 'AP_APPROVAL_PKG.'||l_debug_loc||'<-'||
6438 p_calling_sequence;
6439
6440 l_debug_info := 'p_hold_lookup_code,p_should_have_hold,p_hold_reason,p_system_user '||p_hold_lookup_code||','||p_should_have_hold||','||p_hold_reason||','||p_system_user;
6441 -- Print_Debug(l_debug_loc, l_debug_info);
6442 IF g_debug_mode = 'Y' THEN
6443 AP_Debug_Pkg.Print(g_debug_mode, l_debug_info );
6444 END IF;
6445
6446 IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
6447 FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME||l_debug_loc,l_debug_info);
6448 END IF;
6449
6450
6451 Get_Hold_Status(
6452 p_invoice_id,
6453 p_line_location_id,
6454 p_rcv_transaction_id,
6455 p_hold_lookup_code,
6456 p_system_user,
6457 l_inv_hold_status,
6458 l_existing_hold_reason,
6459 l_user_id,
6460 l_resp_id,
6461 l_curr_calling_sequence);
6462
6463 IF (l_inv_hold_status = 'ALREADY ON HOLD') THEN
6464
6465 IF (p_should_have_hold = 'N') OR ((p_hold_reason IS NOT NULL) AND
6466 (l_existing_hold_reason <> p_hold_reason)) THEN
6467
6468 -------------------------------------------
6469 l_debug_info := 'Release hold if on hold and should not be on hold';
6470 -- Print_Debug(l_debug_loc, l_debug_info);
6471 IF g_debug_mode = 'Y' THEN
6472 AP_Debug_Pkg.Print(g_debug_mode, l_debug_info );
6473 END IF;
6474
6475 IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
6476 FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME||l_debug_loc,l_debug_info);
6477 END IF;
6478 -------------------------------------------
6479
6480 IF ( check_hold_batch_releaseable(
6481 p_hold_lookup_code,
6482 p_calling_sequence) = 'Y' ) THEN
6483
6484 Release_Hold(
6485 p_invoice_id,
6486 p_line_location_id,
6487 p_rcv_transaction_id,
6488 p_hold_lookup_code,
6489 p_holds,
6490 p_release_count,
6491 l_curr_calling_sequence);
6492 END IF;
6493 END IF;
6494
6495 ELSIF ((p_should_have_hold = 'Y') AND
6496 ((l_inv_hold_status <> 'RELEASED BY USER') OR
6497 ((p_hold_lookup_code = 'INSUFFICIENT FUNDS') AND
6498 (l_inv_hold_status <> 'ALREADY ON HOLD')))) THEN
6499
6500 -------------------------------------------
6501 l_debug_info := 'Set hold if it is not user released and needs hold';
6502 -- Print_Debug(l_debug_loc, l_debug_info);
6503 IF g_debug_mode = 'Y' THEN
6504 AP_Debug_Pkg.Print(g_debug_mode, l_debug_info );
6505 END IF;
6506
6507 IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
6508 FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME||l_debug_loc,l_debug_info);
6509 END IF;
6510 -------------------------------------------
6511
6512 IF ((p_hold_reason IS NULL) OR
6513 (nvl(l_existing_hold_reason,'dummy') <> p_hold_reason)) THEN
6514 IF (p_hold_lookup_code = 'INSUFFICIENT FUNDS') THEN
6515
6516 -------------------------------------------
6517 l_debug_info := 'Erase responsibility id from old insuff funds holds';
6518 -- Print_Debug(l_debug_loc, l_debug_info);
6519 IF g_debug_mode = 'Y' THEN
6520 AP_Debug_Pkg.Print(g_debug_mode, l_debug_info );
6521 END IF;
6522
6523 IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
6524 FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME||l_debug_loc,l_debug_info);
6525 END IF;
6526 -------------------------------------------
6527
6528 UPDATE ap_holds
6529 SET responsibility_id = NULL
6530 WHERE invoice_id = p_invoice_id
6531 AND hold_lookup_code = 'INSUFFICIENT FUNDS';
6532
6533 END IF;
6534
6535 -------------------------------------------
6536 l_debug_info := 'Set Hold';
6537 -- Print_Debug(l_debug_loc, l_debug_info);
6538 IF g_debug_mode = 'Y' THEN
6539 AP_Debug_Pkg.Print(g_debug_mode, l_debug_info );
6540 END IF;
6541
6542 IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
6543 FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME||l_debug_loc,l_debug_info);
6544 END IF;
6545 -------------------------------------------
6546
6547 Set_Hold(
6548 p_invoice_id,
6549 p_line_location_id,
6550 p_rcv_transaction_id,
6551 p_hold_lookup_code,
6552 p_hold_reason,
6553 p_holds,
6554 p_holds_count,
6555 l_curr_calling_sequence);
6556
6557 END IF; -- end of check p_hold_reason
6558 END IF; -- end of l_inv_hold_status
6559
6560 EXCEPTION
6561 WHEN OTHERS THEN
6562 IF (SQLCODE <> -20001) THEN
6563 FND_MESSAGE.SET_NAME('SQLAP','AP_DEBUG');
6564 FND_MESSAGE.SET_TOKEN('ERROR',SQLERRM);
6565 FND_MESSAGE.SET_TOKEN('CALLING_SEQUENCE', l_curr_calling_sequence);
6566 FND_MESSAGE.SET_TOKEN('PARAMETERS',
6567 'Invoice_id = '|| to_char(p_invoice_id)
6568 ||', Line_Location_id = '|| to_char(p_line_location_id)
6569 ||', Hold_code = '|| p_hold_lookup_code
6570 ||', Hold_reason = '|| p_hold_reason
6571 ||', Should_have_hold = '|| p_should_have_hold);
6572 FND_MESSAGE.SET_TOKEN('DEBUG_INFO',l_debug_info);
6573 END IF;
6574 APP_EXCEPTION.RAISE_EXCEPTION;
6575 END Process_Inv_Hold_Status;
6576
6577 /*=============================================================================
6578 | PROCEDURE GET_HOLD_STATUS
6579 | Procedure to return the hold information and status of an invoice,
6580 | whether it is ALREADY ON HOLD, RELEASED BY USER or NOT ON HOLD.
6581 |
6582 | PARAMETERS
6583 | p_invoice_id
6584 | p_line_location_id: Line Location Id
6585 | p_rcv_transaction_id
6586 | p_hold_lookup_code
6587 | p_system_user
6588 | p_status
6589 | p_return_hold_reason
6590 | p_user_id
6591 | p_resp_id
6592 | p_calling_sequence: Debugging string to indicate path of module calls
6593 | to be printed out upon error.
6594 |
6595 | KNOWN ISSUES:
6596 |
6597 | NOTES:
6598 |
6599 | MODIFICATION HISTORY
6600 | Date Author Description of Change
6601 |
6602 *============================================================================*/
6603 PROCEDURE Get_Hold_Status(p_invoice_id IN NUMBER,
6604 p_line_location_id IN NUMBER,
6605 p_rcv_transaction_id IN NUMBER,
6606 p_hold_lookup_code IN VARCHAR2,
6607 p_system_user IN NUMBER,
6608 p_status IN OUT NOCOPY VARCHAR2,
6609 p_return_hold_reason IN OUT NOCOPY VARCHAR2,
6610 p_user_id IN OUT NOCOPY VARCHAR2,
6611 p_resp_id IN OUT NOCOPY VARCHAR2,
6612 p_calling_sequence IN VARCHAR2) IS
6613
6614 l_debug_loc VARCHAR2(30) := 'Get_Hold_Status';
6615 l_curr_calling_sequence VARCHAR2(2000);
6616
6617 BEGIN
6618
6619 -- Update the calling sequence --
6620
6621 l_curr_calling_sequence := 'AP_APPROVAL_PKG.'||l_debug_loc||'<-'||p_calling_sequence;
6622
6623 p_status := 'NOT ON HOLD';
6624
6625 if g_holds_tab.count > 0 then
6626
6627 for i in g_holds_tab.first..g_holds_tab.last
6628 loop
6629 if (p_hold_lookup_code <> 'INSUFFICIENT FUNDS') then
6630
6631 if (g_holds_tab(i).invoice_id = p_invoice_id and
6632 g_holds_tab(i).hold_lookup_code = p_hold_lookup_code) then
6633
6634 if (p_line_location_id is null
6635 or g_holds_tab(i).line_location_id = p_line_location_id) and
6636 (p_rcv_transaction_id is null
6637 or g_holds_tab(i).rcv_transaction_id = p_rcv_transaction_id) and
6638 (g_holds_tab(i).release_lookup_code is null
6639 or (g_holds_tab(i).release_lookup_code is not null
6640 and g_holds_tab(i).last_updated_by <> p_system_user)) then
6641
6642 p_status := g_holds_tab(i).hold_status;
6643 p_return_hold_reason := g_holds_tab(i).hold_reason;
6644 p_user_id := g_holds_tab(i).last_updated_by;
6645 p_resp_id := g_holds_tab(i).responsibility_id;
6646
6647 end if;
6648 end if;
6649 else
6650 if (g_holds_tab(i).invoice_id = p_invoice_id and
6651 g_holds_tab(i).hold_lookup_code = p_hold_lookup_code) then
6652
6653 if (p_line_location_id is null
6654 or g_holds_tab(i).line_location_id = p_line_location_id) and
6655 (g_holds_tab(i).release_lookup_code is null
6656 or (g_holds_tab(i).release_lookup_code is not null
6657 and g_holds_tab(i).last_updated_by <> p_system_user
6658 and g_holds_tab(i).responsibility_id is not null)) then
6659
6660 p_status := g_holds_tab(i).hold_status;
6661 p_return_hold_reason := g_holds_tab(i).hold_reason;
6662 p_user_id := g_holds_tab(i).last_updated_by;
6663 p_resp_id := g_holds_tab(i).responsibility_id;
6664
6665 end if;
6666 end if;
6667 end if;
6668 end loop;
6669 end if;
6670
6671 EXCEPTION
6672 WHEN OTHERS THEN
6673 IF (SQLCODE <> -20001) THEN
6674 FND_MESSAGE.SET_NAME('SQLAP','AP_DEBUG');
6675 FND_MESSAGE.SET_TOKEN('ERROR',SQLERRM);
6676 FND_MESSAGE.SET_TOKEN('CALLING_SEQUENCE', l_curr_calling_sequence);
6677 FND_MESSAGE.SET_TOKEN('PARAMETERS',
6678 'Invoice_id = '|| to_char(p_invoice_id)
6679 ||', Line Location Id = '|| to_char(p_line_location_id)
6680 ||', System_User_id = '|| to_char(p_system_user)
6681 ||', Hold Code = '|| p_hold_lookup_code);
6682 END IF;
6683 APP_EXCEPTION.RAISE_EXCEPTION;
6684 END Get_Hold_Status;
6685
6686
6687 --Start 8691645
6688 /*=============================================================================
6689 | PROCEDURE UPDATE_SCHEDULES
6690 | This procedure updates/ recreates payment schedules whenever
6691 | 'Expired Registration' hold releases for an invoice.
6692 ============================================================================*/
6693
6694 PROCEDURE UPDATE_SCHEDULES(P_INVOICE_ID IN AP_INVOICES.INVOICE_ID%TYPE,
6695 P_CALLING_SEQUENCE IN VARCHAR2)IS
6696
6697 cursor invoice_cursor is
6698 select AI.terms_id,
6699 AI.last_updated_by,
6700 AI.created_by,
6701 AI.batch_id,
6702 AI.terms_date,
6703 AI.invoice_amount,
6704 nvl(AI.pay_curr_invoice_amount, invoice_amount),
6705 AI.payment_cross_rate,
6706 AI.amount_applicable_to_discount,
6707 AI.payment_method_code,
6708 AI.invoice_currency_code,
6709 AI.payment_currency_code
6710 from ap_invoices AI
6711 where AI.invoice_id = p_invoice_id;
6712
6713
6714 l_terms_id ap_invoices.terms_id%type;
6715 l_last_updated_by ap_invoices.last_updated_by%type;
6716 l_created_by ap_invoices.created_by%type;
6717 l_batch_id ap_invoices.batch_id%type;
6718 l_terms_date ap_invoices.terms_date%type;
6719 l_invoice_amount ap_invoices.invoice_amount%type;
6720 l_pay_curr_invoice_amount ap_invoices.pay_curr_invoice_amount%type;
6721 l_payment_cross_rate ap_invoices.payment_cross_rate%type;
6722 l_amt_applicable_to_discount ap_invoices.amount_applicable_to_discount%type;
6723 l_payment_method_code ap_invoices.payment_method_code%type;
6724 l_invoice_currency_code ap_invoices.invoice_currency_code%type;
6725 l_payment_currency_code ap_invoices.payment_currency_code%type;
6726
6727 l_paid_schd_count NUMBER;
6728 l_old_terms_date Date;
6729 l_current_calling_sequence VARCHAR2(2000);
6730 l_debug_info VARCHAR2(1000);
6731
6732 BEGIN
6733 l_current_calling_sequence := 'AP_APPROVAL_PKG.UPDATE_SCHEDULES <- '|| p_calling_sequence;
6734
6735 l_debug_info := 'Begin UPDATE_SCHEDULES procedure';
6736 IF (G_LEVEL_PROCEDURE >= G_CURRENT_RUNTIME_LEVEL) THEN
6737 fnd_file.put_line(FND_FILE.LOG,l_debug_info);
6738 END IF;
6739
6740 select terms_date
6741 into l_old_terms_date
6742 from ap_invoices_all
6743 where invoice_id = p_invoice_id;
6744
6745 l_debug_info := 'Before updating invoice terms_date';
6746 IF (G_LEVEL_PROCEDURE >= G_CURRENT_RUNTIME_LEVEL) THEN
6747 fnd_file.put_line(FND_FILE.LOG,l_debug_info);
6748 END IF;
6749
6750 Update ap_invoices_all
6751 set terms_date =trunc(sysdate),
6752 invoice_received_date = decode(invoice_received_date,null,null,trunc(sysdate)) --bug9148859
6753 where invoice_id = p_invoice_id;
6754
6755 select count(*)
6756 into l_paid_schd_count
6757 from ap_payment_schedules_all
6758 where invoice_id = p_invoice_id
6759 and nvl(payment_status_flag,'N') <> 'N';
6760
6761
6762 IF(l_paid_schd_count >0)THEN
6763
6764 --If Invoice contains paid schedules update terms date on existing
6765 --schedules.
6766
6767 l_debug_info := 'Invoice contains paid schedules.';
6768 IF (G_LEVEL_PROCEDURE >= G_CURRENT_RUNTIME_LEVEL) THEN
6769 fnd_file.put_line(FND_FILE.LOG,l_debug_info);
6770 END IF;
6771
6772 Update ap_payment_schedules_all
6773 set due_date = due_date +(sysdate-l_old_terms_date)
6774 where invoice_id = p_invoice_id
6775 and nvl(payment_status_flag,'N') <> 'Y';
6776
6777 ELSE
6778
6779 --If Invoice does not have paid schedules recreate payment schedules
6780
6781 l_debug_info := 'Invoice does not have paid schedules.';
6782 IF (G_LEVEL_PROCEDURE >= G_CURRENT_RUNTIME_LEVEL) THEN
6783 fnd_file.put_line(FND_FILE.LOG,l_debug_info);
6784 END IF;
6785
6786 OPEN invoice_cursor;
6787 FETCH invoice_cursor
6788 INTO l_terms_id,
6789 l_last_updated_by,
6790 l_created_by,
6791 l_batch_id,
6792 l_terms_date,
6793 l_invoice_amount,
6794 l_pay_curr_invoice_amount,
6795 l_payment_cross_rate,
6796 l_amt_applicable_to_discount,
6797 l_payment_method_code,
6798 l_invoice_currency_code,
6799 l_payment_currency_code;
6800 CLOSE invoice_cursor;
6801
6802
6803 l_debug_info := 'Create the payment schedules';
6804 IF (G_LEVEL_PROCEDURE >= G_CURRENT_RUNTIME_LEVEL) THEN
6805 fnd_file.put_line(FND_FILE.LOG,l_debug_info);
6806 END IF;
6807
6808 AP_CREATE_PAY_SCHEDS_PKG.AP_Create_From_Terms(
6809 p_invoice_id,
6810 l_terms_id,
6811 l_last_updated_by,
6812 l_created_by,
6813 null,
6814 l_batch_id,
6815 l_terms_date,
6816 l_invoice_amount,
6817 l_pay_curr_invoice_amount,
6818 l_payment_cross_rate,
6819 l_amt_applicable_to_discount,
6820 l_payment_method_code,
6821 l_invoice_currency_code,
6822 l_payment_currency_code,
6823 l_current_calling_sequence);
6824 END IF;
6825
6826 EXCEPTION
6827 WHEN OTHERS THEN
6828 IF (SQLCODE <> -20001) THEN
6829 FND_MESSAGE.SET_NAME ('SQLAP','AP_DEBUG');
6830 FND_MESSAGE.SET_TOKEN('ERROR',SQLERRM);
6831 FND_MESSAGE.SET_TOKEN('CALLING_SEQUENCE', l_current_calling_sequence);
6832 FND_MESSAGE.SET_TOKEN('DEBUG_INFO',l_debug_info);
6833 FND_MESSAGE.SET_TOKEN('PARAMETERS','Invoice Id = '|| P_INVOICE_ID);
6834 END IF;
6835 APP_EXCEPTION.RAISE_EXCEPTION;
6836 END UPDATE_SCHEDULES;
6837
6838 --End 8691645
6839
6840
6841
6842 /*=============================================================================
6843 | PROCEDURE RELEASE_HOLD
6844 | Procedure to release a hold from an invoice and update the release
6845 | count array.
6846 |
6847 | PARAMETERS
6848 | p_invoice_id
6849 | p_line_location_id: Line Location Id
6850 | p_rcv_transaction_id
6851 | p_hold_lookup_code
6852 | p_holds
6853 | p_release_count
6854 | p_calling_sequence: Debugging string to indicate path of module calls
6855 | to be printed out upon error.
6856 |
6857 | KNOWN ISSUES:
6858 |
6859 | NOTES:
6860 |
6861 | MODIFICATION HISTORY
6862 | Date Author Description of Change
6863 |
6864 *============================================================================*/
6865
6866 PROCEDURE Release_Hold(
6867 p_invoice_id IN NUMBER,
6868 p_line_location_id IN NUMBER,
6869 p_rcv_transaction_id IN NUMBER,
6870 p_hold_lookup_code IN VARCHAR2,
6871 p_holds IN OUT NOCOPY HOLDSARRAY,
6872 p_release_count IN OUT NOCOPY COUNTARRAY,
6873 p_calling_sequence IN VARCHAR2) IS
6874 l_release_lookup_code VARCHAR2(30);
6875 l_debug_loc VARCHAR2(30) := 'Release_Hold';
6876 l_curr_calling_sequence VARCHAR2(2000);
6877 l_debug_info VARCHAR2(1000);
6878 l_old_wf_status AP_HOLDS_ALL.WF_STATUS%TYPE ; -- Bug 8323412
6879 l_hold_id AP_HOLDS_ALL.HOLD_ID%TYPE ; -- Bug 8323412
6880 BEGIN
6881
6882 l_curr_calling_sequence := 'AP_APPROVAL_PKG.'||l_debug_loc||'<-'||
6883 p_calling_sequence;
6884
6885 -------------------------------------------
6886 l_debug_info := 'Getting Release Info For Hold';
6887 -- Print_Debug(l_debug_loc, l_debug_info);
6888 IF g_debug_mode = 'Y' THEN
6889 AP_Debug_Pkg.Print(g_debug_mode, l_debug_info );
6890 END IF;
6891
6892 IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
6893 FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME||l_debug_loc,l_debug_info);
6894 END IF;
6895 -------------------------------------------
6896
6897 Get_Release_Lookup_For_Hold(
6898 p_hold_lookup_code,
6899 l_release_lookup_code,
6900 l_curr_calling_sequence);
6901
6902 -------------------------------------------
6903 l_debug_info := 'Updating AP_HOLDS with release info';
6904 -- Print_Debug(l_debug_loc, l_debug_info);
6905 IF g_debug_mode = 'Y' THEN
6906 AP_Debug_Pkg.Print(g_debug_mode, l_debug_info );
6907 END IF;
6908
6909 IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
6910 FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME||l_debug_loc,l_debug_info);
6911 END IF;
6912 -------------------------------------------
6913 /* Commented this part to put this is a loop (8494768)
6914 -- Bug 8323412 begins
6915 SELECT wf_status,
6916 hold_id
6917 INTO l_old_wf_status,
6918 l_hold_id
6919 FROM ap_holds
6920 WHERE invoice_id = p_invoice_id
6921 AND nvl(line_location_id, -1) = nvl(p_line_location_id, -1)
6922 AND nvl(rcv_transaction_id, -1) = nvl(rcv_transaction_id, -1)
6923 AND hold_lookup_code = p_hold_lookup_code
6924 AND nvl(status_flag, 'x') <> 'x';
6925
6926 IF l_old_wf_status = 'STARTED' THEN
6927 AP_WORKFLOW_PKG.abort_holds_workflow( l_hold_id ) ;
6928 END IF ;
6929 -- Bug 8323412 ends
6930 */
6931 FOR c_wf_status IN ( SELECT hold_id
6932 FROM ap_holds
6933 WHERE invoice_id = p_invoice_id
6934 AND nvl(line_location_id, -1) = nvl(p_line_location_id, -1)
6935 AND nvl(rcv_transaction_id, -1) = nvl(rcv_transaction_id, -1)
6936 AND hold_lookup_code = p_hold_lookup_code
6937 AND nvl(status_flag, 'x') <> 'x'
6938 AND wf_status /* Bug 9691312 = 'STARTED' */ IN ( 'STARTED', 'NEGOTIATE' )
6939 )
6940 LOOP
6941 AP_WORKFLOW_PKG.abort_holds_workflow( c_wf_status.hold_id ) ;
6942 END LOOP ;
6943
6944
6945 UPDATE ap_holds
6946 SET release_lookup_code = l_release_lookup_code,
6947 release_reason = (SELECT description
6948 FROM ap_lookup_codes
6949 WHERE lookup_code = l_release_lookup_code
6950 AND lookup_type = 'HOLD CODE'),
6951 last_update_date = sysdate,
6952 last_updated_by = 5,
6953 status_flag = 'R'
6954 WHERE invoice_id = p_invoice_id
6955 AND nvl(line_location_id, -1) = nvl(p_line_location_id, -1)
6956 AND nvl(rcv_transaction_id, -1) = nvl(rcv_transaction_id, -1)
6957 AND hold_lookup_code = p_hold_lookup_code
6958 AND nvl(status_flag, 'x') <> 'x';
6959
6960 -------------------------------------------
6961 l_debug_info := 'Adjust the Release Count';
6962 -- Print_Debug(l_debug_loc, l_debug_info);
6963 IF g_debug_mode = 'Y' THEN
6964 AP_Debug_Pkg.Print(g_debug_mode, l_debug_info );
6965 END IF;
6966
6967 IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
6968 FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME||l_debug_loc,l_debug_info);
6969 END IF;
6970 -------------------------------------------
6971
6972 IF (sql%rowcount >0) THEN
6973 Count_Org_Hold(
6974 p_org_id => g_org_id
6975 ,p_hold_lookup_code => p_hold_lookup_code
6976 ,p_place_or_release => 'R'
6977 ,p_calling_sequence => l_curr_calling_sequence);
6978
6979 END IF;
6980
6981 -------------------------------------------
6982 l_debug_info := 'Sync Invoice Holds Cache';
6983 -- Print_Debug(l_debug_loc, l_debug_info);
6984 IF g_debug_mode = 'Y' THEN
6985 AP_Debug_Pkg.Print(g_debug_mode, l_debug_info );
6986 END IF;
6987
6988 IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
6989 FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME||l_debug_loc,l_debug_info);
6990 END IF;
6991 -------------------------------------------
6992
6993 initialize_invoice_holds
6994 (p_invoice_id => p_invoice_id,
6995 p_calling_sequence => l_curr_calling_sequence);
6996
6997 AP_DBI_PKG.Maintain_DBI_Summary
6998 (p_table_name => 'AP_HOLDS',
6999 p_operation => 'U',
7000 p_key_value1 => p_invoice_id,
7001 p_calling_sequence => l_curr_calling_sequence);
7002
7003 --Start 8691645
7004
7005 IF(l_release_lookup_code = 'Registration Activated')THEN
7006 UPDATE_SCHEDULES(p_invoice_id,p_calling_sequence);
7007 END IF;
7008
7009 --End 8691645
7010
7011 EXCEPTION
7012 WHEN OTHERS THEN
7013 IF (SQLCODE <> -20001) THEN
7014 FND_MESSAGE.SET_NAME('SQLAP','AP_DEBUG');
7015 FND_MESSAGE.SET_TOKEN('ERROR',SQLERRM);
7016 FND_MESSAGE.SET_TOKEN('CALLING_SEQUENCE', l_curr_calling_sequence);
7017 FND_MESSAGE.SET_TOKEN('PARAMETERS',
7018 'Invoice_id = '|| to_char(p_invoice_id)
7019 ||', Hold_Code = '|| p_hold_lookup_code
7020 ||', Line Location Id = '|| (p_line_location_id));
7021 FND_MESSAGE.SET_TOKEN('DEBUG_INFO',l_debug_info);
7022 END IF;
7023 APP_EXCEPTION.RAISE_EXCEPTION;
7024 END Release_Hold;
7025
7026 /*=============================================================================
7027 | PROCEDURE SET_HOLD
7028 | Procedure to Set an Invoice on Hold and update the hold count array.
7029 |
7030 | PARAMETERS
7031 | p_invoice_id
7032 | p_line_location_id: Line Location Id
7033 | p_rcv_transaction_id
7034 | p_hold_lookup_code
7035 | p_hold_reason
7036 | p_holds
7037 | p_hold_count
7038 | p_calling_sequence: Debugging string to indicate path of module calls
7039 | to be printed out upon error.
7040 |
7041 | KNOWN ISSUES:
7042 |
7043 | NOTES:
7044 |
7045 | MODIFICATION HISTORY
7046 | Date Author Description of Change
7047 |
7048 *============================================================================*/
7049
7050 PROCEDURE Set_Hold(
7051 p_invoice_id IN NUMBER,
7052 p_line_location_id IN NUMBER,
7053 p_rcv_transaction_id IN NUMBER,
7054 p_hold_lookup_code IN VARCHAR2,
7055 p_hold_reason IN VARCHAR2,
7056 p_holds IN OUT NOCOPY HOLDSARRAY,
7057 p_holds_count IN OUT NOCOPY COUNTARRAY,
7058 p_calling_sequence IN VARCHAR2) IS
7059 l_debug_loc VARCHAR2(30) := 'Set_Hold';
7060 l_curr_calling_sequence VARCHAR2(2000);
7061 l_debug_info VARCHAR2(1000);
7062 l_hold_id NUMBER(15);
7063 l_user_releaseable_flag VARCHAR2(1);
7064 l_initiate_workflow_flag VARCHAR2(1);
7065 l_org_id NUMBER(15); --8691645
7066
7067 BEGIN
7068
7069 l_curr_calling_sequence := 'AP_APPROVAL_PKG.'||l_debug_loc||'<-'||
7070 p_calling_sequence;
7071
7072 -------------------------------------------
7073 l_debug_info := 'Inserting Into AP_HOLDS';
7074 -- Print_Debug(l_debug_loc, l_debug_info);
7075 IF g_debug_mode = 'Y' THEN
7076 AP_Debug_Pkg.Print(g_debug_mode, l_debug_info );
7077 END IF;
7078
7079 IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
7080 FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME||l_debug_loc,l_debug_info);
7081 END IF;
7082 -------------------------------------------
7083
7084 SELECT ap_holds_s.nextval
7085 INTO l_hold_id
7086 FROM DUAL;
7087
7088 --Introduced select stmt for 8691645
7089
7090 select org_id into l_org_id
7091 from ap_invoices where invoice_id = p_invoice_id;
7092
7093 INSERT INTO ap_holds (
7094 invoice_id,
7095 line_location_id,
7096 rcv_transaction_id,
7097 hold_lookup_code,
7098 last_update_date,
7099 last_updated_by,
7100 creation_date,
7101 created_by,
7102 held_by,
7103 hold_date,
7104 hold_reason,
7105 status_flag,
7106 org_id, /* Bug 3700128. MOAC Project */
7107 hold_id) -- added for Negotiation Project
7108 (SELECT p_invoice_id,
7109 p_line_location_id,
7110 p_rcv_transaction_id,
7111 p_hold_lookup_code,
7112 sysdate,
7113 5,
7114 sysdate,
7115 5,
7116 5,
7117 sysdate,
7118 substrb(nvl(p_hold_reason, description),1,240),
7119 'S',
7120 nvl(g_org_id,l_org_id), /* Bug 3700128. MOAC Project */
7121 l_hold_id -- Added for Negotiation.
7122 FROM ap_lookup_codes
7123 WHERE lookup_code = p_hold_lookup_code
7124 AND lookup_type = 'HOLD CODE');
7125
7126 --
7127 -- Added for Negotiation Workflow
7128 -- The Holds workflow will be initiated if the placed hold is a system
7129 -- placed user releaseable hold.
7130 -- Check if the hold placed is a user releaseable hold
7131 --
7132
7133 -------------------------------------------
7134 l_debug_info := 'Select to see if the hold is user releaseable hold';
7135 -- Print_Debug(l_debug_loc, l_debug_info);
7136 IF g_debug_mode = 'Y' THEN
7137 AP_Debug_Pkg.Print(g_debug_mode, l_debug_info );
7138 END IF;
7139
7140 IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
7141 FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME||l_debug_loc,l_debug_info);
7142 END IF;
7143 -------------------------------------------
7144
7145 SELECT user_releaseable_flag,
7146 initiate_workflow_flag
7147 INTO l_user_releaseable_flag,
7148 l_initiate_workflow_flag
7149 FROM ap_hold_codes
7150 WHERE hold_lookup_code = p_hold_lookup_code;
7151
7152 --
7153 -- If the hold is a user releaseable hold then we will start the
7154 -- holds workflow.
7155 --
7156
7157 IF (l_user_releaseable_flag = 'Y' AND
7158 l_initiate_workflow_flag = 'Y') THEN
7159
7160 -------------------------------------------
7161 l_debug_info := 'Start the Holds Workflow';
7162 -- Print_Debug(l_debug_loc, l_debug_info);
7163 IF g_debug_mode = 'Y' THEN
7164 AP_Debug_Pkg.Print(g_debug_mode, l_debug_info );
7165 END IF;
7166
7167 IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
7168 FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME||l_debug_loc,l_debug_info);
7169 END IF;
7170 -------------------------------------------
7171
7172 AP_WORKFLOW_PKG.create_hold_wf_process(l_hold_id);
7173
7174 -------------------------------------------
7175 l_debug_info := 'Started the Holds Workflow';
7176 -- Print_Debug(l_debug_loc, l_debug_info);
7177 IF g_debug_mode = 'Y' THEN
7178 AP_Debug_Pkg.Print(g_debug_mode, l_debug_info );
7179 END IF;
7180
7181 IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
7182 FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME||l_debug_loc,l_debug_info);
7183 END IF;
7184 -------------------------------------------
7185
7186 END IF;
7187
7188 AP_DBI_PKG.Maintain_DBI_Summary
7189 (p_table_name => 'AP_HOLDS',
7190 p_operation => 'I',
7191 p_key_value1 => p_invoice_id,
7192 p_calling_sequence => l_curr_calling_sequence);
7193
7194 -------------------------------------------
7195 l_debug_info := 'Adjust the Holds Count';
7196 -- Print_Debug(l_debug_loc, l_debug_info);
7197 IF g_debug_mode = 'Y' THEN
7198 AP_Debug_Pkg.Print(g_debug_mode, l_debug_info );
7199 END IF;
7200
7201 IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
7202 FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME||l_debug_loc,l_debug_info);
7203 END IF;
7204 -------------------------------------------
7205 Count_Org_Hold(
7206 p_org_id => g_org_id
7207 ,p_hold_lookup_code => p_hold_lookup_code
7208 ,p_place_or_release => 'P'
7209 ,p_calling_sequence => l_curr_calling_sequence);
7210
7211 -------------------------------------------
7212 l_debug_info := 'Sync Invoice Holds Cache';
7213 -- Print_Debug(l_debug_loc, l_debug_info);
7214 IF g_debug_mode = 'Y' THEN
7215 AP_Debug_Pkg.Print(g_debug_mode, l_debug_info );
7216 END IF;
7217
7218 IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
7219 FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME||l_debug_loc,l_debug_info);
7220 END IF;
7221 -------------------------------------------
7222 initialize_invoice_holds
7223 (p_invoice_id => p_invoice_id,
7224 p_calling_sequence => l_curr_calling_sequence);
7225
7226
7227 EXCEPTION
7228 WHEN OTHERS THEN
7229 IF (SQLCODE <> -20001) THEN
7230 FND_MESSAGE.SET_NAME('SQLAP','AP_DEBUG');
7231 FND_MESSAGE.SET_TOKEN('ERROR',SQLERRM);
7232 FND_MESSAGE.SET_TOKEN('CALLING_SEQUENCE', l_curr_calling_sequence);
7233 FND_MESSAGE.SET_TOKEN('PARAMETERS',
7234 'Invoice_id = '|| to_char(p_invoice_id)
7235 ||', Hold_Code = '|| p_hold_lookup_code
7236 ||', Hold_Reason = '|| p_hold_reason);
7237 FND_MESSAGE.SET_TOKEN('DEBUG_INFO',l_debug_info);
7238 END IF;
7239 APP_EXCEPTION.RAISE_EXCEPTION;
7240 END Set_Hold;
7241
7242 /*=============================================================================
7243 | PROCEDURE COUNT_HOLD
7244 | Procedure given the hold_array and count_array, increments the
7245 | count for a given hold
7246 |
7247 | PARAMETERS
7248 | p_hold_lookup_code
7249 | p_holds
7250 | p_count
7251 | p_calling_sequence: Debugging string to indicate path of module calls
7252 | to be printed out upon error.
7253 |
7254 | KNOWN ISSUES:
7255 |
7256 | NOTES:
7257 |
7258 | MODIFICATION HISTORY
7259 | Date Author Description of Change
7260 |
7261 *============================================================================*/
7262
7263 PROCEDURE Count_Hold(
7264 p_hold_lookup_code IN VARCHAR2,
7265 p_holds IN OUT NOCOPY HOLDSARRAY,
7266 p_count IN OUT NOCOPY COUNTARRAY,
7267 p_calling_sequence IN VARCHAR2) IS
7268 l_num NUMBER;
7269 l_debug_loc VARCHAR2(30) := 'Count_Hold';
7270 l_curr_calling_sequence VARCHAR2(2000);
7271 l_debug_info VARCHAR2(1000);
7272 BEGIN
7273
7274 l_curr_calling_sequence := 'AP_APPROVAL_PKG.'||l_debug_loc||'<-'||
7275 p_calling_sequence;
7276
7277 FOR num IN 1..100 LOOP
7278
7279 IF ((p_holds(num) IS NULL) OR (p_holds(num) = p_hold_lookup_code)) THEN
7280
7281 l_num := to_number(num);
7282
7283 EXIT;
7284 END IF;
7285
7286 END LOOP;
7287
7288 p_holds(l_num) := p_hold_lookup_code;
7289 p_count(l_num) := nvl(p_count(l_num), 0) + 1;
7290
7291 EXCEPTION
7292 WHEN OTHERS THEN
7293 IF (SQLCODE <> -20001) THEN
7294 FND_MESSAGE.SET_NAME('SQLAP','AP_DEBUG');
7295 FND_MESSAGE.SET_TOKEN('ERROR',SQLERRM);
7296 FND_MESSAGE.SET_TOKEN('CALLING_SEQUENCE', l_curr_calling_sequence);
7297 FND_MESSAGE.SET_TOKEN('PARAMETERS',
7298 'Hold Code = '|| p_hold_lookup_code);
7299 FND_MESSAGE.SET_TOKEN('DEBUG_INFO',l_debug_info);
7300 END IF;
7301 APP_EXCEPTION.RAISE_EXCEPTION;
7302 END Count_Hold;
7303
7304
7305 /*=============================================================================
7306 | PROCEDURE GET_RELEASE_LOOKUP_FOR_HOLD
7307 | Procedure given a hold_lookup_code retunrs the associated
7308 | return_lookup_code
7309 |
7310 | PARAMETERS
7311 | p_hold_lookup_code
7312 | p_release_lookup_code
7313 | p_calling_sequence: Debugging string to indicate path of module calls
7314 | to be printed out upon error.
7315 |
7316 | KNOWN ISSUES:
7317 |
7318 | NOTES:
7319 |
7320 | MODIFICATION HISTORY
7321 | Date Author Description of Change
7322 |
7323 *============================================================================*/
7324
7325 PROCEDURE Get_Release_Lookup_For_Hold(
7326 p_hold_lookup_code IN VARCHAR2,
7327 p_release_lookup_code IN OUT NOCOPY VARCHAR2,
7328 p_calling_sequence IN VARCHAR2) IS
7329
7330 l_debug_loc VARCHAR2(30) := 'Get_Release_Lookup_For_Hold';
7331 l_curr_calling_sequence VARCHAR2(2000);
7332 l_debug_info VARCHAR2(1000);
7333 invalid_hold EXCEPTION;
7334 BEGIN
7335
7336 l_curr_calling_sequence := 'AP_APPROVAL_PKG.'||l_debug_loc||'<-'||
7337 p_calling_sequence;
7338
7339 -------------------------------------------
7340 l_debug_info := 'Check hold_code to retrieve release code';
7341 -- Print_Debug(l_debug_loc, l_debug_info);
7342 IF g_debug_mode = 'Y' THEN
7343 AP_Debug_Pkg.Print(g_debug_mode, l_debug_info );
7344 END IF;
7345
7346 IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
7347 FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME||l_debug_loc,l_debug_info);
7348 END IF;
7349 -------------------------------------------
7350
7351
7352 --added the lookup code MILESTONE in the if statement to
7353 --release the MILESTONE hold when PO quantity or amount
7354 --matched properly and invoice validated or when HOLD released manually
7355 --as per bug6768401
7356
7357
7358 IF (p_hold_lookup_code in ('CANT CLOSE PO', 'CANT TRY PO CLOSE',
7359 'PO REQUIRED', 'QTY ORD', 'QTY REC',
7360 'AMT ORD','AMT REC',
7361 'PRICE', 'QUALITY', 'CURRENCY DIFFERENCE',
7362 'TAX DIFFERENCE', 'REC EXCEPTION',
7363 'PO NOT APPROVED', 'MAX QTY ORD',
7364 'MAX QTY REC', 'MAX AMT ORD',
7365 'MAX AMT REC','FINAL MATCHING',
7366 'MAX SHIP AMOUNT', 'MAX RATE AMOUNT',
7367 'MAX TOTAL AMOUNT','MILESTONE',
7368 'Amount Funded', 'Quantity Funded' --for CLM project - bug 9494400
7369 )) THEN
7370
7371 p_release_lookup_code := 'MATCHED';
7372
7373 ELSIF (p_hold_lookup_code = 'CANT FUNDS CHECK') THEN
7374
7375 p_release_lookup_code := 'CAN FUNDS CHECK';
7376
7377 ELSIF (p_hold_lookup_code = 'INSUFFICIENT FUNDS') THEN
7378
7379 p_release_lookup_code := 'FUNDS NOW AVAILABLE';
7380
7381 ELSIF (p_hold_lookup_code = 'AWT ERROR') THEN
7382
7383 p_release_lookup_code := 'AWT OK';
7384
7385 ELSIF (p_hold_lookup_code in ('TAX VARIANCE', 'DIST VARIANCE',
7386 'TAX AMOUNT RANGE', 'LINE VARIANCE')) THEN
7387
7388 p_release_lookup_code := 'VARIANCE CORRECTED';
7389
7390 ELSIF (p_hold_lookup_code = 'NATURAL ACCOUNT TAX') THEN
7391
7392 p_release_lookup_code := 'NATURAL ACCOUNT TAX OK';
7393
7394 ELSIF (p_hold_lookup_code = 'NO RATE') THEN
7395
7396 p_release_lookup_code := 'RATE EXISTS';
7397
7398 --bug9296410
7399 ELSIF (p_hold_lookup_code = 'Project Hold') THEN
7400
7401 p_release_lookup_code := 'Project Manager Release';
7402
7403 ELSIF (p_hold_lookup_code = 'FUTURE PERIOD') THEN
7404
7405 p_release_lookup_code := 'FUTURE OPEN';
7406
7407 ELSIF (p_hold_lookup_code = 'DIST ACCT INVALID') THEN
7408
7409 p_release_lookup_code := 'DIST ACCT VALID';
7410
7411 ELSIF (p_hold_lookup_code = 'ERV ACCT INVALID') THEN
7412
7413 p_release_lookup_code := 'ERV ACCT VALID';
7414
7415 ELSIF (p_hold_lookup_code = 'AWT ACCT INVALID') THEN
7416
7417 p_release_lookup_code := 'AWT ACCT VALID';
7418
7419 ELSIF (p_hold_lookup_code in ('AMOUNT','PREPAID AMOUNT')) THEN
7420
7421 p_release_lookup_code := 'AMOUNT LOWERED';
7422
7423 ELSIF (p_hold_lookup_code = 'VENDOR') THEN
7424
7425 p_release_lookup_code := 'VENDOR UPDATED';
7426
7427 ELSIF (p_hold_lookup_code = 'PROJECT GL DATE CLOSED') THEN
7428
7429 p_release_lookup_code := 'PROJECT GL DATE OPENED';
7430
7431 ELSIF (p_hold_lookup_code in ( 'INSUFFICIENT LINE INFO',
7432 'INVALID DEFAULT ACCOUNT',
7433 'DISTRIBUTION SET INACTIVE',
7434 'SKELETON DISTRIBUTION SET',
7435 'CANNOT OVERLAY ACCOUNT',
7436 'CANNOT EXECUTE ALLOCATION' ) ) THEN
7437 p_release_lookup_code := 'APPROVED';
7438
7439 -- 7299826 EnC Project
7440 ELSIF (p_hold_lookup_code IN ('Pay When Paid', 'PO Deliverable')) THEN
7441
7442 p_release_lookup_code := 'Automatic Release';
7443
7444 --start 8691645
7445 ELSIF (p_hold_lookup_code = 'Expired Registration') THEN
7446
7447 p_release_lookup_code := 'Registration Activated';
7448 --end 8691645
7449
7450 -- Bug 9136390 Start
7451 ELSIF (p_hold_lookup_code = 'Encumbrance Acctg Fail') THEN
7452 p_release_lookup_code := 'Encumbrance Acctg Ok';
7453 -- Bug 9136390 End
7454
7455 --GTAS Project Bug#13464635 begin
7456 ELSIF (p_hold_lookup_code in ('GTAS Mandatory Fields','GTAS Data Validation')) THEN
7457 p_release_lookup_code := 'MATCHED';
7458 --End Bug#13464635
7459
7460 ELSE
7461 -------------------------------------------
7462 l_debug_info := 'Invalid Hold Code';
7463 -- Print_Debug(l_debug_loc, l_debug_info);
7464 IF g_debug_mode = 'Y' THEN
7465 AP_Debug_Pkg.Print(g_debug_mode, l_debug_info );
7466 END IF;
7467
7468 IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
7469 FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME||l_debug_loc,l_debug_info);
7470 END IF;
7471 -------------------------------------------
7472
7473 Raise Invalid_Hold;
7474 END IF;
7475
7476 EXCEPTION
7477 WHEN Invalid_Hold THEN
7478 FND_MESSAGE.SET_NAME('SQLAP','AP_DEBUG');
7479 FND_MESSAGE.SET_TOKEN('ERROR',SQLERRM);
7480 FND_MESSAGE.SET_TOKEN('CALLING_SEQUENCE', l_curr_calling_sequence);
7481 FND_MESSAGE.SET_TOKEN('PARAMETERS',
7482 'Hold Code = '|| p_hold_lookup_code
7483 ||', Release Code = '|| p_release_lookup_code);
7484 FND_MESSAGE.SET_TOKEN('DEBUG_INFO',l_debug_info);
7485 APP_EXCEPTION.RAISE_EXCEPTION;
7486 WHEN OTHERS THEN
7487 IF (SQLCODE <> -20001) THEN
7488 FND_MESSAGE.SET_NAME('SQLAP','AP_DEBUG');
7489 FND_MESSAGE.SET_TOKEN('ERROR',SQLERRM);
7490 FND_MESSAGE.SET_TOKEN('CALLING_SEQUENCE', l_curr_calling_sequence);
7491 FND_MESSAGE.SET_TOKEN('PARAMETERS',
7492 'Hold Code = '|| p_hold_lookup_code
7493 ||', Release Code = '|| p_release_lookup_code);
7494 FND_MESSAGE.SET_TOKEN('DEBUG_INFO',l_debug_info);
7495 END IF;
7496 APP_EXCEPTION.RAISE_EXCEPTION;
7497 END Get_Release_Lookup_For_Hold;
7498
7499
7500 /*=============================================================================
7501 | PROCEDURE GET_INVOICE_STATUSES:
7502 | Procedure given a hold_lookup_code retunrs the associated
7503 | return_lookup_code
7504 |
7505 | PARAMETERS
7506 | p_invoice_id
7507 | p_holds_count
7508 | p_approval_status
7509 | p_calling_sequence: Debugging string to indicate path of module calls
7510 | to be printed out upon error.
7511 |
7512 | KNOWN ISSUES:
7513 |
7514 | NOTES:
7515 |
7516 | MODIFICATION HISTORY
7517 | Date Author Description of Change
7518 |
7519 *============================================================================*/
7520
7521 PROCEDURE Get_Invoice_Statuses(
7522 p_invoice_id IN NUMBER,
7523 p_holds_count IN OUT NOCOPY NUMBER,
7524 p_approval_status IN OUT NOCOPY VARCHAR2,
7525 p_calling_sequence IN VARCHAR2) IS
7526
7527 CURSOR Invoice_Status_Cur IS
7528 SELECT AP_INVOICES_PKG.Get_Holds_Count(invoice_id),
7529 AP_INVOICES_PKG.Get_Approval_Status(
7530 invoice_id,
7531 invoice_amount,
7532 payment_status_flag,
7533 invoice_type_lookup_code)
7534 FROM ap_invoices
7535 WHERE invoice_id = p_invoice_id;
7536
7537 l_debug_loc VARCHAR2(30) := 'Get_Invoice_Statuses';
7538 l_curr_calling_sequence VARCHAR2(2000);
7539 l_debug_info VARCHAR2(1000);
7540 BEGIN
7541
7542 l_curr_calling_sequence := 'AP_APPROVAL_PKG.'||l_debug_loc||'<-'||
7543 p_calling_sequence;
7544
7545 -------------------------------------------
7546 l_debug_info := 'Retrieving new invoice statuses';
7547 -- Print_Debug(l_debug_loc, l_debug_info);
7548 IF g_debug_mode = 'Y' THEN
7549 AP_Debug_Pkg.Print(g_debug_mode, l_debug_info );
7550 END IF;
7551
7552 IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
7553 FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME||l_debug_loc,l_debug_info);
7554 END IF;
7555 -------------------------------------------
7556
7557 OPEN Invoice_Status_Cur;
7558 Fetch Invoice_Status_Cur
7559 INTO p_holds_count,
7560 p_approval_status;
7561
7562 CLOSE Invoice_Status_Cur;
7563
7564 EXCEPTION
7565 WHEN OTHERS THEN
7566 IF (SQLCODE <> -20001) THEN
7567 FND_MESSAGE.SET_NAME('SQLAP','AP_DEBUG');
7568 FND_MESSAGE.SET_TOKEN('ERROR',SQLERRM);
7569 FND_MESSAGE.SET_TOKEN('CALLING_SEQUENCE', l_curr_calling_sequence);
7570 FND_MESSAGE.SET_TOKEN('PARAMETERS',
7571 'Hold Code = '|| to_char(p_invoice_id));
7572 FND_MESSAGE.SET_TOKEN('DEBUG_INFO',l_debug_info);
7573 END IF;
7574 APP_EXCEPTION.RAISE_EXCEPTION;
7575 END Get_Invoice_Statuses;
7576
7577
7578 /*=============================================================================
7579 | PROCEDURE Check_hold_batch_releaseable
7580 | Function that returns if the hold batch is releasable.
7581 |
7582 | PARAMETERS
7583 | p_hold_name
7584 | p_calling_sequence: Debugging string to indicate path of module calls
7585 | to be printed out upon error.
7586 |
7587 | KNOWN ISSUES:
7588 |
7589 | NOTES:
7590 |
7591 | MODIFICATION HISTORY
7592 | Date Author Description of Change
7593 |
7594 *============================================================================*/
7595
7596 FUNCTION Check_hold_batch_releaseable(
7597 p_hold_name IN VARCHAR2,
7598 p_calling_sequence IN VARCHAR2) RETURN VARCHAR2
7599 IS
7600
7601 l_curr_calling_sequence VARCHAR2(2000);
7602
7603 BEGIN
7604
7605 IF ( p_hold_name = 'VENDOR' and
7606 p_calling_sequence like '%APXAPRVL%' ) THEN
7607 RETURN 'N';
7608 ELSE
7609 RETURN 'Y';
7610 END IF;
7611
7612 END Check_hold_batch_releaseable;
7613
7614 PROCEDURE Update_Total_Dist_Amount(
7615 p_invoice_id IN NUMBER,
7616 p_calling_sequence IN VARCHAR2) IS
7617
7618 l_debug_info VARCHAR2(1000);
7619 l_curr_calling_sequence VARCHAR2(2000);
7620 l_debug_loc VARCHAR2(30) := 'Update_Total_Dist_Amount';
7621
7622 BEGIN
7623
7624 -------------------------------------------
7625 l_debug_info := 'Update Total Dist Amount';
7626 -- Print_Debug(l_debug_loc, l_debug_info);
7627 IF g_debug_mode = 'Y' THEN
7628 AP_Debug_Pkg.Print(g_debug_mode, l_debug_info );
7629 END IF;
7630
7631 IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
7632 FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME||l_debug_loc,l_debug_info);
7633 END IF;
7634 -------------------------------------------
7635
7636 -- Fix for Bug #5107865. Replaced bulk update with single update for
7637 -- performance reasons.
7638 UPDATE ap_invoice_distributions_all id1
7639 SET (id1.total_dist_amount,
7640 id1.total_dist_base_amount) = (SELECT SUM(NVL(id2.amount,0)),
7641 SUM(NVL(id2.base_amount,0))
7642 FROM ap_invoice_distributions_all id2
7643 WHERE id2.invoice_distribution_id =
7644 id1.invoice_distribution_id
7645 OR id2.related_id =
7646 id1.invoice_distribution_id)
7647 WHERE id1.invoice_id = p_invoice_id
7648 AND id1.line_type_lookup_code NOT IN ('IPV','ERV','TIPV','TRV','TERV');
7649
7650 EXCEPTION
7651 WHEN OTHERS THEN
7652 NULL;
7653
7654 END Update_Total_Dist_Amount;
7655
7656
7657 PROCEDURE Exclude_Tax_Freight_From_Disc(
7658 p_invoice_id IN NUMBER,
7659 p_exclude_tax_from_discount IN VARCHAR2,
7660 p_exclude_freight_from_disc IN VARCHAR2,
7661 p_net_of_retainage_flag IN VARCHAR2, --9356460
7662 p_invoice_type_lookup_code IN VARCHAR2,
7663 p_curr_calling_sequence IN VARCHAR2) IS
7664
7665 l_debug_loc VARCHAR2(100);
7666 l_curr_calling_sequence VARCHAR2(2000);
7667 l_debug_info VARCHAR2(1000);
7668 l_purpose VARCHAR2(30);
7669 l_payment_status VARCHAR2(1);
7670 l_prepayment_app_exists VARCHAR2(1);
7671 l_discountable_amount NUMBER;
7672 l_total_tax_amount NUMBER;
7673 l_total_freight_amount NUMBER;
7674 l_validated_amount NUMBER;
7675 l_terms_id NUMBER;
7676 l_last_updated_by NUMBER;
7677 l_created_by NUMBER;
7678 l_payment_priority NUMBER;
7679 l_batch_id NUMBER;
7680 l_terms_date DATE;
7681 l_invoice_amount NUMBER;
7682 l_pay_curr_invoice_amount NUMBER;
7683 l_payment_cross_rate NUMBER;
7684 l_payment_method VARCHAR2(30);
7685 l_invoice_curr_code VARCHAR2(15);
7686 l_pay_curr_code VARCHAR2(15);
7687 l_new_amount_to_adjust NUMBER;
7688 l_new_discountable_amount NUMBER;
7689 l_total_amount_positive VARCHAR(1);
7690 l_total_amount NUMBER ;
7691 l_records_exist BOOLEAN;
7692 j NUMBER;
7693 l_invoice_date DATE;
7694 l_tmp_invoice_amount NUMBER;
7695 l_tmp_base_amount NUMBER;
7696 l_org_id NUMBER; --8405589
7697 l_retained_amount NUMBER; --8405589
7698 l_tmp_base_curr_code VARCHAR2(15); /* bug 13035539 */
7699 --Commented for bug#9356460
7700 -- l_net_of_retainage_flag VARCHAR2(1); --8405589 -- bug8515942 changed from NUMBER type to VARCHAR
7701
7702
7703 CURSOR Prepay_Distributions IS
7704 SELECT aid.invoice_id invoice_id,
7705 aid.amount*-1 amount,
7706 l_pay_curr_code pay_currency,
7707 aid.last_updated_by user_id,
7708 aid.last_update_login last_update_login,
7709 l_curr_calling_sequence calling_sequence
7710 FROM ap_invoice_distributions aid,
7711 ap_invoice_lines ail
7712 WHERE aid.invoice_id = p_invoice_id
7713 AND ail.invoice_id = aid.invoice_id
7714 AND ail.line_number = aid.invoice_line_number
7715 --bugfix:5609186
7716 --Bug8340784 Added ITEM to line_type_lookup_code to
7717 --include recoupment amount on an invoice
7718 AND ail.line_type_lookup_code IN ('PREPAY', 'ITEM')
7719 AND aid.amount <> 0
7720 AND (aid.line_type_lookup_code = 'PREPAY'
7721 OR aid.charge_applicable_to_dist_id in
7722 (SELECT invoice_distribution_id
7723 FROM ap_invoice_distributions
7724 WHERE line_type_lookup_code = 'PREPAY'
7725 AND invoice_id = p_invoice_id))
7726 AND NVL(aid.invoice_includes_prepay_flag, 'N') <> 'Y';
7727
7728 TYPE t_prepay_dist_rec IS TABLE OF Prepay_Distributions%ROWTYPE
7729 INDEX BY BINARY_INTEGER;
7730
7731 v_prepay_dist_rec t_prepay_dist_rec;
7732 l_prepay_excl_tax_amt number;
7733 BEGIN
7734
7735 l_debug_loc := 'Exclude_Tax_Freight_From_Disc';
7736 l_curr_calling_sequence := 'AP_APPROVAL_PKG.Exclude_Tax_From_Discount<-'||P_curr_calling_sequence;
7737
7738 l_payment_status := 'N';
7739 l_prepayment_app_exists := 'N';
7740 l_total_amount_positive := 'N';
7741 l_total_amount := 0;
7742 l_records_exist := FALSE;
7743 j :=1;
7744
7745 ------------------------------------------------------------
7746 l_debug_info := 'Verify the Parameters and set the purpose';
7747 ------------------------------------------------------------
7748 --Introduced retainage flag for bug#9356460
7749 IF (p_invoice_type_lookup_code in ('PO PRICE ADJUST','ADJUSTMENT')) THEN /*bug 13035539: Reordered the IF-ELSEIF*/
7750 l_purpose := 'RETROONLY';
7751 ELSIF p_exclude_tax_from_discount = 'Y' OR p_exclude_freight_from_disc = 'Y' OR
7752 p_net_of_retainage_flag <> 'Y' THEN
7753 l_purpose := 'EXCLUDE';
7754 END IF;
7755
7756 IF l_purpose = 'EXCLUDE' THEN
7757 ------------------------------------------------------------
7758 l_debug_info := 'Check if the Invoice is Paid/partially Paid';
7759 ------------------------------------------------------------
7760 BEGIN
7761 SELECT 'Y'
7762 INTO l_payment_status
7763 FROM ap_invoice_payments
7764 WHERE invoice_id = p_invoice_id
7765 AND nvl(reversal_flag,'N') <> 'Y'
7766 AND rownum<2;
7767
7768 EXCEPTION
7769 WHEN OTHERS THEN
7770 l_payment_status := 'N';
7771 END;
7772
7773 IF l_payment_status <> 'N' THEN
7774 RETURN;
7775 END IF;
7776
7777 ------------------------------------------------------------
7778 l_debug_info := 'Check if Prepayment Application Exists';
7779 ------------------------------------------------------------
7780 BEGIN
7781 --Bug8340784
7782 -- Query table ap_invoice_distributions instead of ap_invoice_lines
7783 -- This will include recoupment amount applied as prepayment
7784 SELECT 'Y'
7785 INTO l_prepayment_app_exists
7786 FROM ap_invoice_distributions aid
7787 WHERE aid.invoice_id = p_invoice_id
7788 AND aid.prepay_distribution_id is not null
7789 AND rownum < 2;
7790 --End of Bug8340784
7791 EXCEPTION
7792 WHEN OTHERS THEN
7793 l_prepayment_app_exists := 'N';
7794 END;
7795
7796 ------------------------------------------------------------
7797 l_debug_info := 'Get Required Info From Invoice Header';
7798 ------------------------------------------------------------
7799
7800 BEGIN
7801 SELECT amount_applicable_to_discount,
7802 decode(p_exclude_tax_from_discount,
7803 'Y',nvl(total_tax_amount,0),0),
7804 nvl(validated_tax_amount,0),
7805 terms_id,
7806 last_updated_by,
7807 created_by,
7808 batch_id,
7809 terms_date,
7810 invoice_amount,
7811 nvl(pay_curr_invoice_amount, invoice_amount),
7812 payment_cross_rate,
7813 payment_method_code, --4552701
7814 invoice_currency_code,
7815 payment_currency_code,
7816 invoice_date,
7817 org_id --8405589
7818 --Commented for bug#9356460
7819 -- net_of_retainage_flag --8405589
7820 INTO l_discountable_amount,
7821 l_total_tax_amount,
7822 l_validated_amount,
7823 l_terms_id,
7824 l_last_updated_by,
7825 l_created_by,
7826 l_batch_id,
7827 l_terms_date,
7828 l_invoice_amount,
7829 l_pay_curr_invoice_amount,
7830 l_payment_cross_rate,
7831 l_payment_method,
7832 l_invoice_curr_code,
7833 l_pay_curr_code,
7834 l_invoice_date,
7835 l_org_id --8405589
7836 --Commented for bug#9356460
7837 -- l_net_of_retainage_flag --8405589
7838 FROM ap_invoices
7839 WHERE invoice_id = p_invoice_id;
7840
7841 EXCEPTION
7842 WHEN OTHERS THEN
7843 RETURN;
7844 END;
7845
7846 IF (p_exclude_freight_from_disc = 'Y') THEN
7847 SELECT NVL(SUM(nvl(ail.amount,0)),0)
7848 INTO l_total_freight_amount
7849 FROM ap_invoice_lines ail
7850 WHERE ail.invoice_id = p_invoice_id
7851 AND ail.line_type_lookup_code = 'FREIGHT'
7852 AND nvl(ail.discarded_flag,'N') <> 'Y';
7853 ELSE
7854 l_total_freight_amount := 0;
7855 END IF;
7856
7857 ------------------------------------------------------------
7858 l_debug_info := 'Get the retained amount';
7859 ------------------------------------------------------------
7860
7861 --Introduced abs() for bug#9356460
7862 --8405589 Starts
7863
7864 if nvl(p_net_of_retainage_flag, 'N') <> 'Y' then
7865 l_retained_amount := abs(nvl(ap_invoices_utility_pkg.get_retained_total
7866 (p_invoice_id, l_org_id),0));
7867 end if;
7868 --8405589 Ends
7869
7870
7871 ------------------------------------------------------------
7872 l_debug_info := 'Get the net Tax Amount to Adjust';
7873 ------------------------------------------------------------
7874 --Reverted changes done in bug#8405589 for bug#9356460
7875
7876 l_new_amount_to_adjust := (l_total_tax_amount+l_total_freight_amount+l_retained_amount) - l_validated_amount;
7877
7878 -- l_new_amount_to_adjust := l_total_tax_amount + l_total_freight_amount - l_retained_amount;
7879
7880 IF l_new_amount_to_adjust <> 0 THEN
7881 ------------------------------------------------------------
7882 l_debug_info := 'Get new discountable Amount';
7883 ------------------------------------------------------------
7884
7885 l_new_discountable_amount := l_discountable_amount
7886 - l_new_amount_to_adjust;
7887
7888
7889 /* l_new_discountable_amount := l_invoice_amount
7890 - l_new_amount_to_adjust; */
7891
7892 ------------------------------------------------------------
7893 l_debug_info := 'Recreate the Payment Schedules';
7894 ------------------------------------------------------------
7895 /* bug 4931755. Procedure Create_Payment_Schedules was called before */
7896 AP_CREATE_PAY_SCHEDS_PKG.Ap_Create_From_Terms
7897 (p_invoice_id,
7898 l_terms_id,
7899 l_last_updated_by,
7900 l_created_by,
7901 null,
7902 l_batch_id,
7903 l_terms_date,
7904 l_invoice_amount,
7905 l_pay_curr_invoice_amount,
7906 l_payment_cross_rate,
7907 l_new_discountable_amount,
7908 l_payment_method,
7909 l_invoice_curr_code,
7910 l_pay_curr_code,
7911 l_curr_calling_sequence);
7912
7913 ---------------------------------------------------------------
7914 l_debug_info := 'Update Pay Schedules if Prepayment APP Exists';
7915 --------------------------------------------------------------
7916
7917 IF l_prepayment_app_exists = 'Y' THEN
7918
7919 OPEN Prepay_Distributions;
7920
7921 loop
7922 fetch Prepay_Distributions into v_prepay_dist_rec(j);
7923 exit when Prepay_Distributions%notfound;
7924 j:=j+1;
7925 end loop;
7926
7927 CLOSE Prepay_Distributions;
7928
7929 IF v_prepay_dist_rec.COUNT > 0 THEN
7930
7931 FOR i IN v_prepay_dist_rec.FIRST .. v_prepay_dist_rec.LAST LOOP
7932 l_total_amount := l_total_amount + v_prepay_dist_rec(i).amount;
7933 l_records_exist := TRUE;
7934 END LOOP;
7935
7936 IF l_records_exist THEN
7937
7938 --bugfix:5638734
7939 -- Get the exculusive tax amount for the prepay appln line.
7940 SELECT sum(aid.amount)
7941 INTO l_prepay_excl_tax_amt
7942 FROM ap_invoice_lines_all ail,ap_invoice_distributions_all aid
7943 WHERE ail.line_type_lookup_code='TAX'
7944 AND ail.invoice_id=p_invoice_id
7945 AND aid.invoice_id=ail.invoice_id
7946 AND aid.invoice_line_number=ail.line_number
7947 AND ail.prepay_line_number is not null;
7948
7949 l_total_amount:= l_total_amount - nvl(l_prepay_excl_tax_amt,0);
7950
7951 IF l_total_amount > 0 THEN
7952 l_total_amount_positive := 'Y';
7953 ELSE
7954 l_total_amount_positive := 'N';
7955 END IF;
7956
7957 IF l_total_amount <> 0 THEN
7958
7959 Update_Payment_Schedule_Prepay(
7960 p_invoice_id,
7961 l_total_amount,
7962 l_total_amount_positive,
7963 v_prepay_dist_rec(1).pay_currency,
7964 v_prepay_dist_rec(1).user_id,
7965 v_prepay_dist_rec(1).last_update_login,
7966 v_prepay_dist_rec(1).calling_sequence);
7967
7968 END IF;
7969
7970 END IF;
7971
7972 END IF;
7973
7974 END IF;
7975
7976 --Exclude the manual withholding tax from the payment schedules
7977 Manual_Withhold_tax( p_invoice_id,
7978 5,
7979 5,
7980 l_curr_calling_sequence);
7981
7982 --Bug 7393338 added the below call to update amount remaining on payment schedule
7983 Update_Pay_Sched_For_Awt( p_invoice_id,
7984 5,
7985 5,
7986 l_curr_calling_sequence);
7987 ------------------------------------------------------------
7988 l_debug_info := 'Update Invoice Header';
7989 ------------------------------------------------------------
7990
7991 --Introduced l_retained_amount for bug#9356460
7992 UPDATE ap_invoices
7993 SET amount_applicable_to_discount = l_new_discountable_amount,
7994 validated_tax_amount = l_total_tax_amount+l_total_freight_amount+l_retained_amount
7995 WHERE invoice_id = p_invoice_id;
7996
7997
7998 END IF;
7999
8000 ELSE -- Retro Price Case
8001
8002 l_debug_info := 'Retro price case';
8003 -- Print_Debug(l_debug_loc,l_debug_info);
8004 IF g_debug_mode = 'Y' THEN
8005 AP_Debug_Pkg.Print(g_debug_mode, l_debug_info );
8006 END IF;
8007
8008 IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
8009 FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME||l_debug_loc,l_debug_info);
8010 END IF;
8011
8012 --Bug9024044: Removed NVL condition from below SUM functions
8013 SELECT sum(amount),
8014 sum(base_amount)
8015 INTO l_tmp_invoice_amount,
8016 l_tmp_base_amount
8017 FROM ap_invoice_distributions_all
8018 WHERE invoice_id = p_invoice_id
8019 AND ((line_type_lookup_code NOT IN ('PREPAY', 'AWT')
8020 AND prepay_distribution_id IS NULL)
8021 OR nvl(invoice_includes_prepay_flag,'N') = 'Y');
8022
8023 /* bug 13035539 starts */
8024
8025 select BASE_CURRENCY_CODE
8026 into l_tmp_base_curr_code
8027 from ap_system_parameters_all asp, ap_invoices_all ai
8028 where asp.org_id = ai.org_id
8029 and ai.invoice_id = p_invoice_id;
8030
8031 /* bug 13035539 ends */
8032
8033 UPDATE ap_invoices
8034 SET invoice_amount = l_tmp_invoice_amount,
8035 amount_applicable_to_discount = l_tmp_invoice_amount,
8036 /* bug 13035539 starts */
8037 base_amount =
8038 ( CASE
8039 WHEN
8040 invoice_currency_code <> l_tmp_base_curr_code
8041 THEN
8042 l_tmp_base_amount
8043 ELSE
8044 NULL
8045 END),
8046 /* bug 13035539 ends */
8047 pay_curr_invoice_amount = decode(invoice_currency_code,
8048 nvl(payment_currency_code,invoice_currency_code), l_tmp_invoice_amount,
8049 gl_currency_api.convert_amount
8050 (invoice_currency_code,
8051 nvl(payment_currency_code,invoice_currency_code),
8052 payment_cross_rate_date,
8053 payment_cross_rate_type,
8054 l_tmp_invoice_amount))
8055 WHERE invoice_id = p_invoice_id;
8056
8057 ------------------------------------------------------------
8058 l_debug_info := 'Get Required Info From Invoice Header';
8059 ------------------------------------------------------------
8060 BEGIN
8061 SELECT amount_applicable_to_discount,
8062 nvl(total_tax_amount,0),
8063 nvl(validated_tax_amount,0),
8064 terms_id,
8065 last_updated_by,
8066 created_by,
8067 batch_id,
8068 terms_date,
8069 invoice_amount,
8070 pay_curr_invoice_amount,
8071 payment_cross_rate,
8072 payment_method_code, --4552701
8073 invoice_currency_code,
8074 payment_currency_code
8075 INTO l_discountable_amount,
8076 l_total_tax_amount,
8077 l_validated_amount,
8078 l_terms_id,
8079 l_last_updated_by,
8080 l_created_by,
8081 l_batch_id,
8082 l_terms_date,
8083 l_invoice_amount,
8084 l_pay_curr_invoice_amount,
8085 l_payment_cross_rate,
8086 l_payment_method,
8087 l_invoice_curr_code,
8088 l_pay_curr_code
8089 FROM ap_invoices
8090 WHERE invoice_id = p_invoice_id;
8091
8092 EXCEPTION
8093 WHEN OTHERS THEN
8094 RETURN;
8095 END;
8096
8097 ------------------------------------------------------------
8098 l_debug_info := 'Recreate the Payment Schedules: '|| l_invoice_amount;
8099 -- Print_Debug(l_debug_loc,l_debug_info);
8100 IF g_debug_mode = 'Y' THEN
8101 AP_Debug_Pkg.Print(g_debug_mode, l_debug_info );
8102 END IF;
8103
8104 IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
8105 FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME||l_debug_loc,l_debug_info);
8106 END IF;
8107 ------------------------------------------------------------
8108
8109 AP_CREATE_PAY_SCHEDS_PKG.AP_Create_From_Terms
8110 (p_invoice_id,
8111 l_terms_id,
8112 l_last_updated_by,
8113 l_created_by,
8114 null,
8115 l_batch_id,
8116 l_terms_date,
8117 l_invoice_amount,
8118 l_pay_curr_invoice_amount,
8119 l_payment_cross_rate,
8120 l_discountable_amount,
8121 l_payment_method,
8122 l_invoice_curr_code,
8123 l_pay_curr_code,
8124 l_curr_calling_sequence);
8125 END IF;
8126
8127 EXCEPTION
8128 WHEN OTHERS THEN
8129 IF (SQLCODE <> -20001) THEN
8130 FND_MESSAGE.SET_NAME('SQLAP','AP_DEBUG');
8131 FND_MESSAGE.SET_TOKEN('ERROR',SQLERRM);
8132 FND_MESSAGE.SET_TOKEN('CALLING_SEQUENCE', l_curr_calling_sequence);
8133 FND_MESSAGE.SET_TOKEN('PARAMETERS',
8134 ', Invoice Id = '|| to_char(p_invoice_id)
8135 ||', Exclude Tax from Discount = '|| p_exclude_tax_from_discount
8136 ||', Invoice Type = '|| p_invoice_type_lookup_code );
8137 FND_MESSAGE.SET_TOKEN('DEBUG_INFO',l_debug_info);
8138 END IF;
8139 APP_EXCEPTION.RAISE_EXCEPTION;
8140
8141 END Exclude_Tax_Freight_From_Disc;
8142
8143
8144
8145 -------------------------------------------------------------------------------
8146 --This procedure update payment schedules automatically for invoices
8147 --where prepayment is applied. This will be called from the prcedure
8148 -- Exclude_Tax_Freight_From_Discount for the feature as described in the description of
8149 -- the former procedure. A similar procedure exists in prepayment package
8150 -- however due to some restriction we are creating the procedure here. This
8151 -- procedure will not update ap_invoices, but will update payment schedule.
8152 -------------------------------------------------------------------------------
8153
8154 PROCEDURE update_payment_schedule_prepay(
8155 p_invoice_id IN NUMBER,
8156 p_apply_amount IN NUMBER,
8157 p_amount_positive IN VARCHAR2,
8158 p_payment_currency_code IN VARCHAR2,
8159 p_user_id IN NUMBER,
8160 p_last_update_login IN NUMBER,
8161 p_calling_sequence IN VARCHAR2) AS
8162 l_debug_info VARCHAR2(1000);
8163 l_current_calling_sequence VARCHAR2(2000);
8164 l_apply_amount_remaining NUMBER;
8165 l_cursor_payment_num NUMBER;
8166 l_cursor_amount NUMBER;
8167
8168 CURSOR Schedules IS
8169 SELECT payment_num,
8170 DECODE(p_amount_positive,
8171 'N', gross_amount - amount_remaining,
8172 amount_remaining)
8173 --
8174 -- If unapplying prepayment, we want to get the amount paid, else
8175 -- we want to get amount remaining so we won't overapply.
8176 --
8177 FROM ap_payment_schedules
8178 WHERE invoice_id = p_invoice_id
8179 AND (payment_status_flag||'' = 'P'
8180 OR payment_status_flag||'' = DECODE(p_amount_positive, 'N', 'Y', 'N'))
8181 ORDER BY DECODE(p_amount_positive,
8182 'N', DECODE(payment_status_flag,'P',1,'Y',2,3),
8183 DECODE(NVL(hold_flag,'N'),'N',1,2)),
8184 DECODE(p_amount_positive,
8185 'N', due_date,
8186 NULL) DESC,
8187 DECODE(p_amount_positive,
8188 'Y', due_date,
8189 NULL),
8190 DECODE(p_amount_positive,
8191 'N', DECODE(hold_flag,'N',1,'Y',2,3),
8192 DECODE(NVL(payment_status_flag,'N'),'P',1,'N',2,3));
8193 BEGIN
8194 -- Update the calling sequence
8195 l_current_calling_sequence := 'update_payment_schedule_prepay<-'||
8196 p_calling_sequence;
8197 IF (p_invoice_id IS NULL OR
8198 p_apply_amount IS NULL OR
8199 p_amount_positive IS NULL OR
8200 p_payment_currency_code IS NULL) THEN
8201
8202 RAISE NO_DATA_FOUND;
8203 END IF;
8204 --
8205 -- l_amount_apply_remaining will keep track of the apply amount that is
8206 -- remaining to be factored into amount remaining.
8207 --
8208
8209 l_apply_amount_remaining := p_apply_amount;
8210 --
8211 -- Open schedule ,fetch payment_num and amount into local variable array
8212 --
8213 l_debug_info := 'Open Payment Schedule Cursor';
8214
8215 OPEN SCHEDULES;
8216 LOOP
8217 l_debug_info := 'Fetch Schedules into local variables';
8218
8219 FETCH SCHEDULES INTO l_cursor_payment_num, l_cursor_amount;
8220
8221 EXIT WHEN SCHEDULES%NOTFOUND;
8222
8223 if ((((l_apply_amount_remaining - l_cursor_amount) <= 0) AND
8224 (p_amount_positive = 'Y')) OR
8225 (((l_apply_amount_remaining + l_cursor_amount) >= 0) AND
8226 (p_amount_positive = 'N'))) then
8227
8228 /*-----------------------------------------------------------------------+
8229 * Case 1 for *
8230 * 1. In apply prepayment(amount_positive = 'Y'), the amount remaining *
8231 * is greater than apply amount remaining. *
8232 * 2. In unapply prepayment, the apply amount (actually unapply amount *
8233 * here) is greater than amount_paid (gross amount-amount remaining).*
8234 * *
8235 * It means that this schedule line has enough amount to apply(unapply) *
8236 * the whole apply_amount. *
8237 * *
8238 * Update the amount remaining for this payment schedule line so that: *
8239 * (amount remaining - apply amount remaining). *
8240 +-----------------------------------------------------------------------*/
8241
8242 l_debug_info := 'Update ap_payment_schedule for the invoice, case 1';
8243
8244 UPDATE ap_payment_schedules
8245 SET amount_remaining = (amount_remaining -
8246 ap_utilities_pkg.ap_round_currency(
8247 l_apply_amount_remaining,
8248 p_payment_currency_code)),
8249 payment_status_flag =
8250 DECODE(amount_remaining -
8251 ap_utilities_pkg.ap_round_currency(
8252 l_apply_amount_remaining,
8253 p_payment_currency_code),
8254 0,'Y',
8255 gross_amount, 'N',
8256 'P'),
8257 last_update_date = SYSDATE,
8258 last_updated_by = p_user_id,
8259 last_update_login = p_last_update_login
8260 WHERE invoice_id = p_invoice_id
8261 AND payment_num = l_cursor_payment_num;
8262
8263 EXIT;
8264
8265 /* No more amount left */
8266
8267 else
8268
8269 /*----------------------------------------------------------------------*
8270 *Case 2 for this line don't have enough amount to apply(unapply). *
8271 * *
8272 * Update the amount_remaining to 0 and amount_apply_remaining become *
8273 * (amount_apply - amount_remaining(this line)), then go to next *
8274 * schedule line. *
8275 *----------------------------------------------------------------------*/
8276
8277 l_debug_info := 'Update ap_payment_schedule for the invoice, case 2';
8278
8279 UPDATE ap_payment_schedules
8280 SET amount_remaining = DECODE(p_amount_positive,
8281 'Y', 0,
8282 gross_amount),
8283 payment_status_flag = DECODE(p_amount_positive,
8284 'Y', 'Y',
8285 'N'),
8286 last_update_date = SYSDATE,
8287 last_updated_by = p_user_id,
8288 last_update_login = p_last_update_login
8289 WHERE invoice_id = p_invoice_id
8290 AND payment_num = l_cursor_payment_num;
8291
8292 if (p_amount_positive = 'Y') then
8293 l_apply_amount_remaining := l_apply_amount_remaining - l_cursor_amount;
8294 else
8295 l_apply_amount_remaining := l_apply_amount_remaining + l_cursor_amount;
8296 end if;
8297
8298 end if;
8299
8300 END LOOP;
8301
8302 l_debug_info := 'Close Schedule Cursor';
8303
8304 CLOSE SCHEDULES;
8305
8306 --Bug 4539462 DBI logging
8307 AP_DBI_PKG.Maintain_DBI_Summary
8308 (p_table_name => 'AP_INVOICES',
8309 p_operation => 'U',
8310 p_key_value1 => P_invoice_id,
8311 p_calling_sequence => l_current_calling_sequence);
8312
8313 EXCEPTION
8314 WHEN OTHERS then
8315 if (SQLCODE <> -20001 ) then
8316 FND_MESSAGE.SET_NAME('SQLAP','AP_DEBUG');
8317 FND_MESSAGE.SET_TOKEN('ERROR',SQLERRM);
8318 FND_MESSAGE.SET_TOKEN('CALLING_SEQUENCE',l_current_calling_sequence);
8319
8320 FND_MESSAGE.SET_TOKEN('PARAMETERS','Invoice_id = '||TO_CHAR(p_invoice_id)
8321 ||' Apply_amount = '||TO_CHAR(p_apply_amount)
8322 ||' Amount_positive = '||p_amount_positive
8323 ||' Apply_amount_remaining = '||
8324 TO_CHAR(l_apply_amount_remaining)
8325 ||' Cursor_amount = '||TO_CHAR(l_cursor_amount)
8326 ||' Cursor_Payment_num = '||TO_CHAR(l_cursor_payment_num)
8327 ||' User_id = '||TO_CHAR(p_user_id)
8328 ||' Last_update_login = '||TO_CHAR(p_last_update_login)
8329 ||' Payment_Currency_code = '||p_payment_currency_code);
8330
8331 FND_MESSAGE.SET_TOKEN('DEBUG_INFO',l_debug_info);
8332
8333 end if;
8334
8335 APP_EXCEPTION.RAISE_EXCEPTION;
8336
8337 END update_payment_schedule_prepay;
8338
8339
8340 --============================================================================
8341 -- MANUAL_WITHHOLD_TAX: Procedure that update payment schedules
8342 -- to reflect the manual withholding amount
8343 --============================================================================
8344 PROCEDURE Manual_Withhold_Tax(p_invoice_id IN NUMBER,
8345 p_last_updated_by IN NUMBER,
8346 p_last_update_login IN NUMBER,
8347 p_calling_sequence IN VARCHAR2) IS
8348 l_manual_awt_amount ap_invoice_distributions.amount%TYPE :=0;
8349 l_payment_cross_rate ap_invoices.payment_cross_rate%TYPE;
8350 l_pay_curr_code ap_invoices.payment_currency_code%TYPE;
8351 l_num_payments NUMBER := 0;
8352 l_invoice_type ap_invoices.invoice_type_lookup_code%TYPE;--1724924
8353 l_inv_amt_remaining ap_payment_schedules.amount_remaining%TYPE := 0;
8354 l_gross_amount ap_payment_schedules.gross_amount%TYPE := 0;
8355 l_debug_loc VARCHAR2(30) := 'Manual_Withhold_Tax';
8356 l_curr_calling_sequence VARCHAR2(2000);
8357
8358 BEGIN
8359
8360 -- AP_LOGGING_PKG.AP_Begin_Block(l_debug_loc);
8361
8362 -- Update the calling sequence --
8363
8364 l_curr_calling_sequence := 'AP_APPROVAL_PKG.'||l_debug_loc||'<-'||p_calling_sequence;
8365
8366 -- Initialize local variables
8367 -- BUG 4340061 : For the lines which have been already been validated but the invoice has been placed on hold.
8368
8369 --Commented match_status_flag condition for bug#8947048
8370 SELECT sum( nvl(amount, 0) )
8371 INTO l_manual_awt_amount
8372 FROM ap_invoice_distributions
8373 WHERE invoice_id = p_invoice_id
8374 -- AND nvl(match_status_flag, 'N') in ('N','T') -- BUG 4340061
8375 AND line_type_lookup_code = 'AWT'
8376 AND awt_flag in ('M', 'O');
8377
8378
8379 SELECT sum(nvl(amount_remaining,0)), sum(nvl(gross_amount,0))
8380 INTO l_inv_amt_remaining, l_gross_amount
8381 FROM ap_payment_schedules
8382 WHERE invoice_id = p_invoice_id;
8383
8384 SELECT payment_cross_rate,
8385 payment_currency_code,
8386 invoice_type_lookup_code --Bug 1724924
8387 INTO l_payment_cross_rate,
8388 l_pay_curr_code,
8389 l_invoice_type --Bug 1724924
8390 FROM ap_invoices
8391 WHERE invoice_id = p_invoice_id;
8392
8393 --===================================================================
8394 --Prorate the manual AWT against the invoice amount remaining
8395 --===================================================================
8396 --Bug 1985604 - Modified if condition
8397
8398 -- Bug 2636774. Checking if the manual_awt_amount is <> 0 instead of
8399 -- not null. This check will ensure that the payment schedule will not
8400 -- be updated for cancelled invoices.
8401
8402 -- BUG 4344086 : if condition added. If l_gross_amount = 0 means, the
8403 -- invoice is either cancelled or is of 0$
8404 if l_gross_amount = 0
8405 then
8406 update ap_payment_schedules
8407 set amount_remaining = 0
8408 where invoice_id = p_invoice_id;
8409
8410 elsif ((l_inv_amt_remaining <> 0) and (nvl(l_manual_awt_amount,0) <> 0))
8411 then
8412
8413 update ap_payment_schedules
8414 set amount_remaining = (amount_remaining +
8415 ap_utilities_pkg.ap_round_currency(
8416 (amount_remaining * (l_manual_awt_amount/l_inv_amt_remaining)
8417 * l_payment_cross_rate), l_pay_curr_code ) )
8418 where invoice_id = p_invoice_id;
8419
8420 elsif ((l_inv_amt_remaining = 0) and (nvl(l_manual_awt_amount,0) <> 0))
8421 then
8422
8423 update ap_payment_schedules
8424 set amount_remaining =
8425 (amount_remaining +
8426 ap_utilities_pkg.ap_round_currency(
8427 (gross_amount * (l_manual_awt_amount/l_gross_amount)
8428 * l_payment_cross_rate), l_pay_curr_code) ),
8429 payment_status_flag = DECODE(payment_status_flag,
8430 'Y','P',payment_status_flag)
8431 where invoice_id = p_invoice_id;
8432
8433 update ap_invoices
8434 set payment_status_flag = DECODE(payment_status_flag,
8435 'Y','P',payment_status_flag)
8436 where invoice_id = p_invoice_id;
8437
8438 end if;
8439
8440
8441 EXCEPTION
8442 when OTHERS then
8443 IF (SQLCODE <> -20001) THEN
8444 FND_MESSAGE.SET_NAME('SQLAP','AP_DEBUG');
8445 FND_MESSAGE.SET_TOKEN('ERROR',SQLERRM);
8446 FND_MESSAGE.SET_TOKEN('CALLING_SEQUENCE',p_calling_sequence);
8447 FND_MESSAGE.SET_TOKEN('PARAMETERS',
8448 ' Invoice Id = ' || to_char(P_Invoice_Id) ||
8449 ', Calling module = ' || 'Manual_withhold_tax' );
8450 END IF;
8451 APP_EXCEPTION.RAISE_EXCEPTION;
8452
8453 END Manual_Withhold_Tax;
8454
8455 /* Added the following procedure for 7393338 */
8456 --============================================================================
8457 -- Update_Pay_Sched_For_Awt: Procedure that update payment schedules
8458 -- to reflect the Automatic withholding amount
8459 --============================================================================
8460
8461
8462 PROCEDURE Update_Pay_Sched_For_Awt(p_invoice_id IN NUMBER,
8463 p_last_updated_by IN NUMBER,
8464 p_last_update_login IN NUMBER,
8465 p_calling_sequence IN VARCHAR2) IS
8466 CURSOR Update_payment_schedule IS
8467 SELECT payment_num,gross_amount,amount_remaining
8468 FROM ap_payment_schedules
8469 WHERE invoice_id=p_invoice_id;
8470 l_automatic_awt_amount ap_invoice_distributions.amount%TYPE :=0;
8471 l_payment_cross_rate ap_invoices.payment_cross_rate%TYPE;
8472 l_pay_curr_code ap_invoices.payment_currency_code%TYPE;
8473 l_num_payments NUMBER := 0;
8474 l_invoice_type ap_invoices.invoice_type_lookup_code%TYPE;
8475 l_inv_amt_remaining ap_payment_schedules.amount_remaining%TYPE := 0;
8476 l_gross_amount ap_payment_schedules.gross_amount%TYPE := 0;
8477 l_payment_num ap_payment_schedules.payment_num%TYPE;
8478 l_debug_loc VARCHAR2(30) := 'Update_Pay_Sched_For_Awt';
8479 l_curr_calling_sequence VARCHAR2(2000);
8480 l_wt_amt_to_subtract NUMBER := 0;
8481 BEGIN
8482
8483
8484 l_curr_calling_sequence := 'AP_APPROVAL_PKG.'||l_debug_loc||'<-'||p_calling_sequence;
8485
8486
8487 SELECT (0 - sum(nvl(amount,0)))
8488 INTO l_automatic_awt_amount
8489 FROM ap_invoice_distributions
8490 WHERE invoice_id = p_invoice_id
8491 AND line_type_lookup_code = 'AWT'
8492 AND awt_flag = 'A';
8493
8494 IF l_automatic_awt_amount <> 0 then
8495
8496 SELECT payment_cross_rate,
8497 payment_currency_code,
8498 invoice_type_lookup_code
8499 INTO l_payment_cross_rate,
8500 l_pay_curr_code,
8501 l_invoice_type
8502 FROM ap_invoices
8503 WHERE invoice_id = p_invoice_id;
8504
8505
8506 OPEN Update_payment_schedule;
8507
8508 LOOP
8509 FETCH Update_payment_schedule into l_payment_num,l_gross_amount,l_inv_amt_remaining;
8510 EXIT WHEN Update_payment_schedule%NOTFOUND;
8511 SELECT nvl(ap_utilities_pkg.ap_round_currency(
8512 l_automatic_awt_amount*
8513 ai.payment_cross_rate,l_pay_curr_code),0)*
8514 l_gross_amount/decode(ai.pay_curr_invoice_amount, 0, 1,
8515 nvl(ai.pay_curr_invoice_amount, 1))
8516 into l_wt_amt_to_subtract
8517 from ap_invoices ai
8518 where ai.invoice_id=p_invoice_id;
8519
8520 --===================================================================
8521 --Prorate the automatic AWT against the invoice amount remaining
8522 --===================================================================
8523 if l_gross_amount = 0 then
8524 update ap_payment_schedules
8525 set amount_remaining = 0
8526 where invoice_id = p_invoice_id
8527 and payment_num=l_payment_num;
8528
8529 elsif ((l_inv_amt_remaining <> 0) and (nvl(l_wt_amt_to_subtract,0) <> 0))
8530 then
8531
8532 update ap_payment_schedules
8533 set amount_remaining = (amount_remaining -
8534 ap_utilities_pkg.ap_round_currency(
8535 (amount_remaining * ( l_wt_amt_to_subtract/l_inv_amt_remaining)
8536 * l_payment_cross_rate), l_pay_curr_code ) )
8537 where invoice_id = p_invoice_id
8538 and payment_num=l_payment_num;
8539
8540 End If;
8541 update ap_payment_schedules
8542 set payment_status_flag ='Y'
8543 where invoice_id = p_invoice_id
8544 and payment_num=l_payment_num
8545 and amount_remaining = 0
8546 and nvl(payment_status_flag,'N') <> 'Y';
8547 END LOOP;
8548 CLOSE Update_payment_schedule;
8549
8550 END IF;
8551
8552 EXCEPTION
8553 when OTHERS then
8554 IF (SQLCODE <> -20001) THEN
8555 FND_MESSAGE.SET_NAME('SQLAP','AP_DEBUG');
8556 FND_MESSAGE.SET_TOKEN('ERROR',SQLERRM);
8557 FND_MESSAGE.SET_TOKEN('CALLING_SEQUENCE',p_calling_sequence);
8558 FND_MESSAGE.SET_TOKEN('PARAMETERS',
8559 ' Invoice Id = ' || to_char(P_Invoice_Id) ||
8560 ', Calling module = ' || 'Update_Pay_Sched_For_Awt' );
8561 END IF;
8562 APP_EXCEPTION.RAISE_EXCEPTION;
8563
8564 END Update_Pay_Sched_For_Awt;
8565
8566 --============================================================================
8567 -- createPaymentSchedules: Procedure that creates payment schedules
8568 -- for invoice (request) if not yet
8569 --============================================================================
8570 PROCEDURE createPaymentSchedules(p_invoice_id IN NUMBER,
8571 p_calling_sequence IN VARCHAR2) IS
8572 l_discountable_amount NUMBER;
8573 l_total_tax_amount NUMBER;
8574 l_total_freight_amount NUMBER;
8575 l_validated_amount NUMBER;
8576 l_terms_id NUMBER;
8577 l_last_updated_by NUMBER;
8578 l_created_by NUMBER;
8579 l_payment_priority NUMBER;
8580 l_batch_id NUMBER;
8581 l_terms_date DATE;
8582 l_invoice_amount NUMBER;
8583 l_pay_curr_invoice_amount NUMBER;
8584 l_payment_method VARCHAR2(30);
8585 l_payment_cross_rate ap_invoices.payment_cross_rate%TYPE;
8586 l_invoice_curr_code VARCHAR2(15);
8587 l_pay_curr_code VARCHAR2(15);
8588 l_debug_info VARCHAR2(200);
8589 l_debug_loc VARCHAR2(30) := 'createPaymentSchedules';
8590 l_schedule_count NUMBER := 0;
8591 l_curr_calling_sequence VARCHAR2(2000);
8592
8593 BEGIN
8594
8595 l_curr_calling_sequence := 'AP_APPROVAL_PKG.createPaymentSchedules <- '||P_calling_sequence;
8596
8597 select count(*)
8598 into l_schedule_count
8599 from ap_payment_schedules_all
8600 where invoice_id = p_invoice_id;
8601
8602 -------------------------------------------
8603 l_debug_info := 'createPaymentSchedules - payment schedule count = ' || l_schedule_count;
8604 -- Print_Debug(l_debug_loc, l_debug_info);
8605 IF g_debug_mode = 'Y' THEN
8606 AP_Debug_Pkg.Print(g_debug_mode, l_debug_info );
8607 END IF;
8608
8609 IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
8610 FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME||l_debug_loc,l_debug_info);
8611 END IF;
8612 -------------------------------------------
8613
8614 if ( l_schedule_count <= 0 ) then
8615
8616 -------------------------------------------
8617 l_debug_info := 'Get Required Info From Invoice Header';
8618 -- Print_Debug(l_debug_loc, l_debug_info);
8619 IF g_debug_mode = 'Y' THEN
8620 AP_Debug_Pkg.Print(g_debug_mode, l_debug_info );
8621 END IF;
8622
8623 IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
8624 FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME||l_debug_loc,l_debug_info);
8625 END IF;
8626 -------------------------------------------
8627
8628 BEGIN
8629 SELECT invoice_amount, -- TODO: amount_applicable_to_discount,
8630 terms_id,
8631 last_updated_by,
8632 created_by,
8633 batch_id,
8634 terms_date,
8635 invoice_amount,
8636 nvl(pay_curr_invoice_amount, invoice_amount),
8637 payment_cross_rate,
8638 payment_method_code, --4552701
8639 invoice_currency_code,
8640 payment_currency_code
8641 INTO l_discountable_amount,
8642 l_terms_id,
8643 l_last_updated_by,
8644 l_created_by,
8645 l_batch_id,
8646 l_terms_date,
8647 l_invoice_amount,
8648 l_pay_curr_invoice_amount,
8649 l_payment_cross_rate,
8650 l_payment_method,
8651 l_invoice_curr_code,
8652 l_pay_curr_code
8653 FROM ap_invoices
8654 WHERE invoice_id = p_invoice_id;
8655
8656 EXCEPTION
8657 WHEN OTHERS THEN
8658 RETURN;
8659 END;
8660
8661 -- create payment schedules
8662 AP_CREATE_PAY_SCHEDS_PKG.Create_Payment_Schedules
8663 (p_invoice_id,
8664 l_terms_id,
8665 l_last_updated_by,
8666 l_created_by,
8667 null, -- TODO: why payment_priority is null?
8668 l_batch_id,
8669 l_terms_date,
8670 l_invoice_amount,
8671 l_pay_curr_invoice_amount,
8672 l_payment_cross_rate,
8673 l_discountable_amount,
8674 l_payment_method,
8675 l_invoice_curr_code,
8676 l_pay_curr_code,
8677 l_curr_calling_sequence);
8678
8679 -------------------------------------------
8680 l_debug_info := 'createPaymentSchedules - payment schedule created.';
8681 -- Print_Debug(l_debug_loc, l_debug_info);
8682 IF g_debug_mode = 'Y' THEN
8683 AP_Debug_Pkg.Print(g_debug_mode, l_debug_info );
8684 END IF;
8685
8686 IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
8687 FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME||l_debug_loc,l_debug_info);
8688 END IF;
8689 -------------------------------------------
8690
8691 end if;
8692
8693 EXCEPTION
8694 when OTHERS then
8695 IF (SQLCODE <> -20001) THEN
8696 FND_MESSAGE.SET_NAME('SQLAP','AP_DEBUG');
8697 FND_MESSAGE.SET_TOKEN('ERROR',SQLERRM);
8698 FND_MESSAGE.SET_TOKEN('CALLING_SEQUENCE',l_curr_calling_sequence);
8699 FND_MESSAGE.SET_TOKEN('PARAMETERS',
8700 ' Invoice Id = ' || to_char(P_Invoice_Id) ||
8701 ', Calling module = ' || 'createPaymentSchedules' );
8702 END IF;
8703 APP_EXCEPTION.RAISE_EXCEPTION;
8704
8705 END createPaymentSchedules;
8706
8707
8708 FUNCTION Is_Product_Registered(P_Application_Id IN NUMBER,
8709 X_Registration_Api OUT NOCOPY VARCHAR2,
8710 X_Registration_View OUT NOCOPY VARCHAR2,
8711 P_Calling_Sequence IN VARCHAR2) RETURN BOOLEAN IS
8712
8713 l_debug_info VARCHAR2(1000);
8714 l_curr_calling_sequence VARCHAR2(2000);
8715
8716 BEGIN
8717
8718 l_curr_calling_sequence := 'Is_Product_Registered <-'||p_calling_sequence;
8719
8720 BEGIN
8721 SELECT registration_api,
8722 registration_view
8723 INTO x_registration_api,
8724 x_registration_view
8725 FROM ap_product_registrations
8726 WHERE application_id = 200
8727 AND reg_application_id = p_application_id
8728 AND registration_event_type = 'DISTRIBUTION_GENERATION';
8729
8730 EXCEPTION WHEN NO_DATA_FOUND THEN
8731 x_registration_view := NULL;
8732 x_registration_api := NULL;
8733 RETURN(FALSE);
8734 END;
8735
8736 RETURN(TRUE);
8737
8738 EXCEPTION
8739 WHEN OTHERS then
8740 IF (SQLCODE <> -20001) THEN
8741 FND_MESSAGE.SET_NAME('SQLAP','AP_DEBUG');
8742 FND_MESSAGE.SET_TOKEN('ERROR',SQLERRM);
8743 FND_MESSAGE.SET_TOKEN('CALLING_SEQUENCE',l_curr_calling_sequence);
8744 FND_MESSAGE.SET_TOKEN('PARAMETERS',
8745 ' Application Id = ' || to_char(P_Application_Id) );
8746 END IF;
8747 APP_EXCEPTION.RAISE_EXCEPTION;
8748
8749 END Is_Product_Registered;
8750
8751
8752 FUNCTION Gen_Dists_From_Registration(
8753 P_Batch_Id IN NUMBER,
8754 P_Invoice_Line_Rec IN AP_INVOICES_PKG.r_invoice_line_rec,
8755 P_Registration_Api IN VARCHAR2,
8756 P_Registration_View IN VARCHAR2,
8757 P_Generate_Permanent IN VARCHAR2,
8758 X_Error_Code OUT NOCOPY VARCHAR2,
8759 P_Calling_Sequence IN VARCHAR2) RETURN BOOLEAN IS
8760
8761 l_debug_info VARCHAR2(1000);
8762 l_curr_calling_sequence VARCHAR2(2000);
8763
8764 TYPE Invoice_Dists_Tab_Type IS TABLE OF ap_invoice_distributions_all%ROWTYPE;
8765 l_dist_tab Invoice_Dists_Tab_Type := Invoice_Dists_Tab_Type();
8766
8767 TYPE Expense_Report_Dists_Rec IS RECORD (
8768 Org_id ap_exp_report_dists_all.org_id%TYPE,
8769 Sequence_Num ap_exp_report_dists_all.sequence_num%TYPE,
8770 Code_Combination_Id ap_exp_report_dists_all.code_combination_id%TYPE,
8771 Amount ap_exp_report_dists_all.amount%TYPE,
8772 Project_Id ap_exp_report_dists_all.project_id%TYPE,
8773 Task_Id ap_exp_report_dists_all.task_id%TYPE,
8774 Award_Id ap_exp_report_dists_all.award_id%TYPE,
8775 pa_quantity ap_expense_report_lines_all.pa_quantity%TYPE, --bug6699834
8776 Expenditure_Organization_Id ap_exp_report_dists_all.expenditure_organization_id%TYPE,
8777 Expenditure_type ap_expense_report_lines_all.expenditure_type%TYPE,
8778 Expenditure_item_date ap_expense_report_lines_all.expenditure_item_date%TYPE,
8779 merchant_document_number ap_expense_report_lines_all.merchant_document_number%TYPE, --bug14335065 Adding below 5 merchant fields
8780 merchant_name ap_expense_report_lines_all.merchant_name%TYPE,
8781 merchant_reference ap_expense_report_lines_all.merchant_reference%TYPE,
8782 merchant_tax_reg_number ap_expense_report_lines_all.merchant_tax_reg_number%TYPE,
8783 merchant_taxpayer_id ap_expense_report_lines_all.merchant_taxpayer_id%TYPE,
8784 receipt_currency_amount ap_exp_report_dists_all.receipt_currency_amount%TYPE, --bug6520882
8785 receipt_currency_code ap_exp_report_dists_all.receipt_currency_code%TYPE,
8786 receipt_conversion_rate ap_exp_report_dists_all.receipt_conversion_rate%TYPE);
8787
8788 TYPE Expense_Report_Dists_Tab_Type IS TABLE OF Expense_Report_Dists_Rec
8789 index by BINARY_INTEGER;
8790
8791 l_exp_report_dists_tab Expense_Report_Dists_Tab_Type;
8792
8793 CURSOR c_expense_report_dists IS
8794 SELECT nvl(aerd.org_id,aerl.org_id), --Bug5867415
8795 aerd.sequence_num,
8796 aerd.code_combination_id,
8797 aerd.amount,
8798 aerd.project_id,
8799 aerd.task_id,
8800 aerd.award_id,
8801 aerl.pa_quantity, -- bug6699834
8802 aerd.expenditure_organization_id,
8803 --bugfix:4939074
8804 aerl.expenditure_type,
8805 aerl.expenditure_item_date,
8806 aerl.merchant_document_number,--bug14335065 Adding below 5 merchant fields
8807 aerl.merchant_name,
8808 aerl.merchant_reference,
8809 aerl.merchant_tax_reg_number,
8810 aerl.merchant_taxpayer_id,
8811 aerd.receipt_currency_amount, --bug6520882
8812 aerd.receipt_currency_code,
8813 aerd.receipt_conversion_rate
8814 FROM ap_exp_report_dists_all aerd,
8815 ap_expense_report_lines_all aerl
8816 WHERE aerd.report_header_id = p_invoice_line_rec.reference_key1
8817 AND aerd.report_line_id = p_invoice_line_rec.reference_key2
8818 AND aerd.report_line_id = aerl.report_line_id
8819 AND aerd.report_header_id = aerl.report_header_id
8820 ORDER BY report_distribution_id;
8821
8822 i NUMBER;
8823 j NUMBER;
8824 l_account_type VARCHAR2(10);
8825 l_distribution_line_number NUMBER;
8826 l_total_dist_amount NUMBER;
8827 l_api_name VARCHAR2(200) := 'Gen_Dists_From_Registration';
8828 l_copy_line_dff_flag VARCHAR2(1); -- Bug 14031967
8829
8830 BEGIN
8831
8832 i:= 0;
8833 l_distribution_line_number := 0;
8834 l_total_dist_amount := 0;
8835
8836 l_curr_calling_sequence := 'Gen_Dists_From_Registration <- '||p_calling_sequence;
8837
8838 -------------------------------------------
8839 l_debug_info := 'Generate Distributions as per the applications registered view';
8840 -- Print_Debug(l_api_name, l_debug_info);
8841 IF g_debug_mode = 'Y' THEN
8842 AP_Debug_Pkg.Print(g_debug_mode, l_debug_info );
8843 END IF;
8844
8845 IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
8846 FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME||l_api_name,l_debug_info);
8847 END IF;
8848 -------------------------------------------
8849
8850 -------------------------------------------
8851 l_debug_info := 'P_Registration_View: '||P_Registration_View;
8852 -- Print_Debug(l_api_name, l_debug_info);
8853 IF g_debug_mode = 'Y' THEN
8854 AP_Debug_Pkg.Print(g_debug_mode, l_debug_info );
8855 END IF;
8856
8857 IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
8858 FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME||l_api_name,l_debug_info);
8859 END IF;
8860 -------------------------------------------
8861
8862 IF (P_Registration_View = 'AP_EXP_REPORT_DISTS') THEN
8863
8864 -------------------------------------------
8865 l_debug_info := 'Open Cursor c_expense_report_dists';
8866 -- Print_Debug(l_api_name, l_debug_info);
8867 IF g_debug_mode = 'Y' THEN
8868 AP_Debug_Pkg.Print(g_debug_mode, l_debug_info );
8869 END IF;
8870
8871 IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
8872 FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME||l_api_name,l_debug_info);
8873 END IF;
8874 -------------------------------------------
8875
8876 OPEN c_expense_report_dists;
8877 FETCH c_expense_report_dists
8878 BULK COLLECT INTO l_exp_report_dists_tab;
8879 CLOSE c_expense_report_dists;
8880
8881 IF (l_exp_report_dists_tab.COUNT > 0) THEN
8882
8883 -------------------------------------------
8884 l_debug_info := 'Exp Report Dists more than zero - setting the amount';
8885 -- Print_Debug(l_api_name, l_debug_info);
8886 IF g_debug_mode = 'Y' THEN
8887 AP_Debug_Pkg.Print(g_debug_mode, l_debug_info );
8888 END IF;
8889
8890 IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
8891 FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME||l_api_name,l_debug_info);
8892 END IF;
8893 -------------------------------------------
8894
8895 FOR i IN l_exp_report_dists_tab.first .. l_exp_report_dists_tab.last LOOP
8896 l_total_dist_amount := l_total_dist_amount + l_exp_report_dists_tab(i).amount;
8897 END LOOP;
8898
8899 END IF;
8900
8901 IF (l_exp_report_dists_tab.COUNT > 0) THEN
8902
8903 /*bug14460127 : Reading the profile option value to check if the DFF info should be copied onto distributions*/
8904 l_copy_line_dff_flag := NVL(fnd_profile.value('AP_COPY_INV_LINE_DFF'),'N');
8905
8906 l_dist_tab.EXTEND(l_exp_report_dists_tab.COUNT);
8907
8908 -------------------------------------------
8909 l_debug_info := 'Exp Report Dists more than zero - setting other attributes';
8910 -- Print_Debug(l_api_name, l_debug_info);
8911 IF g_debug_mode = 'Y' THEN
8912 AP_Debug_Pkg.Print(g_debug_mode, l_debug_info );
8913 END IF;
8914
8915 IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
8916 FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME||l_api_name,l_debug_info);
8917 END IF;
8918 -------------------------------------------
8919
8920 FOR i IN l_exp_report_dists_tab.first .. l_exp_report_dists_tab.last LOOP
8921 l_distribution_line_number := l_distribution_line_number + 1;
8922
8923 l_dist_tab(i).org_id := l_exp_report_dists_tab(i).org_id;
8924 l_dist_tab(i).distribution_line_number := l_distribution_line_number;
8925 l_dist_tab(i).dist_code_combination_id := l_exp_report_dists_tab(i).code_combination_id;
8926 --bug6597595
8927 if l_total_dist_amount = 0 then
8928 l_dist_tab(i).amount := 0;
8929 else
8930 --bug6653070
8931 l_dist_tab(i).amount :=
8932 ((p_invoice_line_rec.amount) * l_exp_report_dists_tab(i).amount)/
8933 l_total_dist_amount;
8934 end if;
8935 l_dist_tab(i).project_id := l_exp_report_dists_tab(i).project_id;
8936 l_dist_tab(i).task_id := l_exp_report_dists_tab(i).task_id;
8937 l_dist_tab(i).award_id := l_exp_report_dists_tab(i).award_id;
8938 l_dist_tab(i).pa_quantity := l_exp_report_dists_tab(i).pa_quantity;-- bug6699834
8939
8940 l_dist_tab(i).expenditure_organization_id := l_exp_report_dists_tab(i).expenditure_organization_id;
8941 l_dist_tab(i).expenditure_type := l_exp_report_dists_tab(i).expenditure_type;
8942 l_dist_tab(i).expenditure_item_date := l_exp_report_dists_tab(i).expenditure_item_date;
8943 l_dist_tab(i).merchant_document_number := l_exp_report_dists_tab(i).merchant_document_number;--bug14335065 Adding below 5 merchant fields
8944 l_dist_tab(i).merchant_name := l_exp_report_dists_tab(i).merchant_name;
8945 l_dist_tab(i).merchant_reference := l_exp_report_dists_tab(i).merchant_reference;
8946 l_dist_tab(i).merchant_tax_reg_number := l_exp_report_dists_tab(i).merchant_tax_reg_number;
8947 l_dist_tab(i).merchant_taxpayer_id := l_exp_report_dists_tab(i).merchant_taxpayer_id;
8948 l_dist_tab(i).receipt_currency_amount:=l_exp_report_dists_tab(i).receipt_currency_amount;--bug6520882
8949 l_dist_tab(i).receipt_currency_code:= l_exp_report_dists_tab(i).receipt_currency_code;
8950 l_dist_tab(i).receipt_conversion_rate:= l_exp_report_dists_tab(i).receipt_conversion_rate;
8951 l_dist_tab(i).batch_id := p_batch_id;
8952 l_dist_tab(i).invoice_id := p_invoice_line_rec.invoice_id;
8953 l_dist_tab(i).invoice_line_number := p_invoice_line_rec.line_number;
8954
8955 SELECT ap_invoice_distributions_s.nextval
8956 INTO l_dist_tab(i).invoice_distribution_id
8957 FROM DUAL;
8958
8959 l_dist_tab(i).line_type_lookup_code := 'ITEM';
8960
8961 IF (nvl(p_generate_permanent,'N') = 'N') THEN
8962 l_dist_tab(i).distribution_class := 'CANDIDATE';
8963 ELSE
8964 l_dist_tab(i).distribution_class := 'PERMANENT';
8965 END IF;
8966
8967 /*Bug 14031967:start: Copying DFF values to the distributions*/
8968 /* l_copy_line_dff_flag := NVL(fnd_profile.value('AP_COPY_INV_LINE_DFF'),'N');*/ --bug14460127
8969 IF (l_copy_line_dff_flag = 'Y') THEN
8970 l_dist_tab(i).ATTRIBUTE_CATEGORY:= p_invoice_line_rec.ATTRIBUTE_CATEGORY;
8971 l_dist_tab(i).ATTRIBUTE1:= p_invoice_line_rec.ATTRIBUTE1;
8972 l_dist_tab(i).ATTRIBUTE2:= p_invoice_line_rec.ATTRIBUTE2;
8973 l_dist_tab(i).ATTRIBUTE3:= p_invoice_line_rec.ATTRIBUTE3;
8974 l_dist_tab(i).ATTRIBUTE4:= p_invoice_line_rec.ATTRIBUTE4;
8975 l_dist_tab(i).ATTRIBUTE5:= p_invoice_line_rec.ATTRIBUTE5;
8976 l_dist_tab(i).ATTRIBUTE6:= p_invoice_line_rec.ATTRIBUTE6;
8977 l_dist_tab(i).ATTRIBUTE7:= p_invoice_line_rec.ATTRIBUTE7;
8978 l_dist_tab(i).ATTRIBUTE8:= p_invoice_line_rec.ATTRIBUTE8;
8979 l_dist_tab(i).ATTRIBUTE9:= p_invoice_line_rec.ATTRIBUTE9;
8980 l_dist_tab(i).ATTRIBUTE10:= p_invoice_line_rec.ATTRIBUTE10;
8981 l_dist_tab(i).ATTRIBUTE11:= p_invoice_line_rec.ATTRIBUTE11;
8982 l_dist_tab(i).ATTRIBUTE12:= p_invoice_line_rec.ATTRIBUTE12;
8983 l_dist_tab(i).ATTRIBUTE13:= p_invoice_line_rec.ATTRIBUTE13;
8984 l_dist_tab(i).ATTRIBUTE14:= p_invoice_line_rec.ATTRIBUTE14;
8985 l_dist_tab(i).ATTRIBUTE15:= p_invoice_line_rec.ATTRIBUTE15;
8986 END IF;
8987 /*Bug 14031967: End */
8988
8989 l_dist_tab(i).description := p_invoice_line_rec.description;
8990 l_dist_tab(i).dist_match_type := 'NOT_MATCHED';
8991 l_dist_tab(i).accounting_date := p_invoice_line_rec.accounting_date;
8992 l_dist_tab(i).period_name := p_invoice_line_rec.period_name;
8993 l_dist_tab(i).accrual_posted_flag := 'N';
8994 l_dist_tab(i).cash_posted_flag := 'N';
8995 l_dist_tab(i).posted_flag := 'N';
8996 l_dist_tab(i).set_of_books_id := p_invoice_line_rec.set_of_books_id;
8997 l_dist_tab(i).encumbered_flag := 'N';
8998 l_dist_tab(i).reversal_flag := 'N';
8999 l_dist_tab(i).cancellation_flag := 'N';
9000 l_dist_tab(i).income_tax_region := p_invoice_line_rec.income_tax_region;
9001 l_dist_tab(i).type_1099 := p_invoice_line_rec.type_1099;
9002 l_dist_tab(i).assets_addition_flag := 'U';
9003 --Bug9296445
9004 l_dist_tab(i).reference_1 := p_invoice_line_rec.reference_1;
9005 l_dist_tab(i).reference_2 := p_invoice_line_rec.reference_2;
9006
9007 BEGIN
9008 SELECT account_type
9009 INTO l_account_type
9010 FROM gl_code_combinations
9011 WHERE code_combination_id = l_dist_tab(i).dist_code_combination_id;
9012
9013 EXCEPTION
9014 WHEN NO_DATA_FOUND THEN
9015
9016 l_debug_info := l_debug_info || ': cannot read account type information';
9017 -- Print_Debug(l_api_name,l_debug_info);
9018 IF g_debug_mode = 'Y' THEN
9019 AP_Debug_Pkg.Print(g_debug_mode, l_debug_info );
9020 END IF;
9021
9022 IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
9023 FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME||l_api_name,l_debug_info);
9024 END IF;
9025
9026 RETURN(FALSE);
9027
9028 END;
9029
9030 IF (l_account_type = 'A' OR
9031 (l_account_type = 'E' AND
9032 p_invoice_line_rec.assets_tracking_flag = 'Y')) then
9033
9034 l_dist_tab(i).assets_tracking_flag := 'Y';
9035 l_dist_tab(i).asset_book_type_code := p_invoice_line_rec.asset_book_type_code;
9036 l_dist_tab(i).asset_category_id := p_invoice_line_rec.asset_category_id;
9037 ELSE
9038 l_dist_tab(i).assets_tracking_flag := 'N';
9039 END IF;
9040
9041 IF (l_dist_tab(i).project_id IS NULL) THEN
9042 l_dist_tab(i).pa_addition_flag := 'E';
9043 ELSE
9044 l_dist_tab(i).pa_addition_flag := 'N';
9045 END IF;
9046
9047 l_dist_tab(i).awt_group_id := p_invoice_line_rec.awt_group_id;
9048 l_dist_tab(i).inventory_transfer_status := 'N';
9049 l_dist_tab(i).intended_use := p_invoice_line_rec.primary_intended_use;
9050 l_dist_tab(i).rcv_charge_addition_flag := 'N';
9051 l_dist_tab(i).created_by := FND_GLOBAL.user_id;
9052 l_dist_tab(i).creation_date := SYSDATE;
9053 l_dist_tab(i).last_update_date := SYSDATE;
9054 l_dist_tab(i).last_update_login := FND_GLOBAL.login_id;
9055 l_dist_tab(i).last_updated_by := FND_GLOBAL.user_id;
9056
9057 END LOOP;
9058
9059 END IF; /* If l_exp_report_dists_tab.count > 0 */
9060
9061 -------------------------------------------
9062 l_debug_info := 'Bulk Insert into ap_invoice_distributions';
9063 -- Print_Debug(l_api_name, l_debug_info);
9064 IF g_debug_mode = 'Y' THEN
9065 AP_Debug_Pkg.Print(g_debug_mode, l_debug_info );
9066 END IF;
9067
9068 IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
9069 FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME||l_api_name,l_debug_info);
9070 END IF;
9071 -------------------------------------------
9072 IF (nvl(l_dist_tab.count,0)<>0) THEN
9073
9074 FORALL j IN l_dist_tab.first .. l_dist_tab.last
9075 INSERT INTO ap_invoice_distributions
9076 VALUES l_dist_tab(j);
9077
9078 FOR j IN l_dist_tab.first .. l_dist_tab.last
9079 LOOP
9080 IF l_dist_tab(j).award_id is not null then
9081 gms_ap_api.CREATE_AWARD_DISTRIBUTIONS( l_dist_tab(j). invoice_id,
9082 l_dist_tab(j).distribution_line_number,
9083 l_dist_tab(j).invoice_distribution_id,
9084 l_dist_tab(j).award_id,
9085 'AP',
9086 NULL,
9087 NULL);
9088 End If ;
9089 END LOOP ;
9090
9091 END IF;
9092
9093 ELSIF (P_Registration_Api IS NOT NULL) THEN
9094 NULL;
9095
9096 END IF;
9097
9098 -------------------------------------------
9099 l_debug_info := 'Setting generate distributions flag to Done';
9100 -- Print_Debug(l_api_name, l_debug_info);
9101 IF g_debug_mode = 'Y' THEN
9102 AP_Debug_Pkg.Print(g_debug_mode, l_debug_info );
9103 END IF;
9104
9105 IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
9106 FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME||l_api_name,l_debug_info);
9107 END IF;
9108 -------------------------------------------
9109
9110 IF (nvl(p_generate_permanent,'N') = 'Y') then
9111 BEGIN
9112 UPDATE AP_INVOICE_LINES
9113 SET GENERATE_DISTS = 'D'
9114 WHERE invoice_id = p_invoice_line_rec.invoice_id
9115 AND line_number = p_invoice_line_rec.line_number;
9116 EXCEPTION
9117 WHEN OTHERS THEN
9118 l_debug_info := l_debug_info || ': Error encountered';
9119 return (FALSE);
9120 END;
9121 END IF;
9122
9123 RETURN(TRUE);
9124
9125
9126 EXCEPTION
9127 WHEN OTHERS then
9128 IF (SQLCODE <> -20001) THEN
9129 l_debug_info := 'In others exception '||sqlerrm;
9130 -- Print_Debug(l_api_name,l_debug_info);
9131 IF g_debug_mode = 'Y' THEN
9132 AP_Debug_Pkg.Print(g_debug_mode, l_debug_info );
9133 END IF;
9134
9135 IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
9136 FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME||l_api_name,l_debug_info);
9137 END IF;
9138
9139 FND_MESSAGE.SET_NAME('SQLAP','AP_DEBUG');
9140 FND_MESSAGE.SET_TOKEN('ERROR',SQLERRM);
9141 FND_MESSAGE.SET_TOKEN('CALLING_SEQUENCE',l_curr_calling_sequence);
9142 FND_MESSAGE.SET_TOKEN('PARAMETERS',
9143 ' Invoice Id = ' || to_char(P_invoice_line_rec.Invoice_Id) ||
9144 ', Invoice Line Number = '||to_char(p_invoice_line_rec.Line_Number) ||
9145 ', Registration Api = '||P_Registration_Api ||
9146 ', Registration View = '||P_Registration_View);
9147 END IF;
9148 APP_EXCEPTION.RAISE_EXCEPTION;
9149
9150 END Gen_Dists_From_Registration;
9151
9152 ------------------------------------------------------------------------
9153 -- Function Batch_Approval:
9154 -- It selects all invoices depending on the parameters given to it and
9155 -- calls the on-line PL/SQL approval package to approve each invoice
9156 -- individually.
9157 ------------------------------------------------------------------------
9158
9159 FUNCTION batch_approval
9160 (p_run_option IN VARCHAR2,
9161 p_sob_id IN NUMBER,
9162 p_inv_start_date IN DATE,
9163 p_inv_end_date IN DATE,
9164 p_inv_batch_id IN NUMBER,
9165 p_vendor_id IN NUMBER,
9166 p_pay_group IN VARCHAR2,
9167 p_invoice_id IN NUMBER,
9168 p_entered_by IN NUMBER,
9169 p_debug_switch IN VARCHAR2,
9170 p_conc_request_id IN NUMBER,
9171 p_commit_size IN NUMBER,
9172 p_org_id IN NUMBER,
9173 p_report_holds_count OUT NOCOPY NUMBER,
9174 p_transaction_num IN NUMBER) RETURN BOOLEAN -- Bug 8234569
9175
9176 IS
9177
9178 TYPE hold_codeTab IS TABLE OF ap_hold_codes.hold_lookup_code%Type;
9179 TYPE invoiceIDTab IS TABLE OF ap_invoices.invoice_id%Type INDEX BY BINARY_INTEGER;
9180 TYPE invoiceNUMTab IS TABLE OF ap_invoices.invoice_num%Type INDEX BY BINARY_INTEGER;
9181 TYPE procinvoiceIDTab IS TABLE OF ap_invoices.invoice_id%Type;
9182 TYPE hold_org_idTab IS TABLE OF ap_invoices.org_id%Type;
9183
9184 TYPE orgIDTab IS TABLE OF ap_invoices_all.org_id%Type INDEX BY BINARY_INTEGER;
9185 TYPE invtypeTab IS TABLE OF ap_invoices_all.invoice_type_lookup_code%Type INDEX BY BINARY_INTEGER;
9186
9187 l_inv_batch_id NUMBER(15);
9188 l_vendor_id NUMBER(15);
9189 l_pay_group VARCHAR2(25);
9190 l_invoice_id NUMBER(15);
9191 l_entered_by NUMBER(15);
9192 l_holds_count NUMBER(5);
9193 l_approval_status VARCHAR2(25);
9194
9195 l_status VARCHAR2(80);
9196 l_approval_error VARCHAR2(2000);
9197 l_org_id NUMBER(15);
9198 l_sel_org_id NUMBER(15);
9199 l_old_org_id NUMBER(15);
9200
9201 l_sel_invoice_type VARCHAR2(25);
9202 l_calling_mode VARCHAR2(25);
9203 l_funds_return_code VARCHAR2(30); --Bug6610937
9204
9205 --Bug9436217
9206 l_sql_stmt VARCHAR2(8000);
9207 --Bug9436217
9208 l_sql_stmt_cursor INTEGER;
9209 ignore INTEGER;
9210 no_of_rows_fetched INTEGER;
9211
9212 l_hold_code hold_codeTab;
9213 l_selected_invoice_ids invoiceIDTab; -- 7461423
9214 l_sel_invoice_num invoiceNUMTab;
9215
9216 lc_sel_org_id orgIDTab;
9217 lc_sel_invoice_type invtypeTab;
9218
9219 l_processed_inv_id procinvoiceIDTab;
9220 l_hold_org_id hold_org_idTab;
9221
9222 l_validation_request_id NUMBER;
9223 l_invoice_num VARCHAR2(50);
9224 l_commit_size NUMBER;
9225 l_curr_calling_sequence VARCHAR2(2000);
9226
9227 l_holds HOLDSARRAY;
9228 l_hold_count COUNTARRAY;
9229 l_release_count COUNTARRAY;
9230 l_total_hold_count NUMBER;
9231 l_total_release_count NUMBER;
9232 l_line_variance_hold_exist BOOLEAN := FALSE;
9233 l_need_to_round_flag VARCHAR2(1) := 'Y';
9234
9235 l_success BOOLEAN;
9236 l_error_code VARCHAR2(4000);
9237 l_prorate_across_all_items VARCHAR2(1);
9238 l_debug_context VARCHAR2(2000);
9239 l_insufficient_data_exist BOOLEAN := FALSE;
9240
9241 l_calling_sequence VARCHAR2(20);
9242
9243 l_retained_amount NUMBER;
9244 l_recouped_amount NUMBER;
9245 l_invoice_rec AP_APPROVAL_PKG.Invoice_Rec;
9246 l_invoice_date AP_INVOICES.invoice_date%TYPE;
9247 l_invoice_currency_code AP_INVOICES.invoice_currency_code%TYPE;
9248 l_exchange_rate AP_INVOICES.exchange_rate%TYPE;
9249 l_exchange_rate_type AP_INVOICES.exchange_rate_type%TYPE;
9250 l_exchange_date AP_INVOICES.exchange_date%TYPE;
9251 l_tolerance_id AP_SUPPLIER_SITES_ALL.TOLERANCE_ID%TYPE;
9252 l_services_tolerance_id AP_SUPPLIER_SITES_ALL.SERVICES_TOLERANCE_ID%TYPE;
9253
9254 Tax_Exception EXCEPTION;
9255
9256 CURSOR SELECTED_INVOICES_CURSOR IS
9257 SELECT
9258 I.invoice_id,
9259 I.invoice_num,
9260 I.org_id,
9261 I.invoice_amount,
9262 I.base_amount,
9263 I.exchange_rate,
9264 I.invoice_currency_code,
9265 S.invoice_amount_limit,
9266 nvl(S.hold_future_payments_flag,'N') hold_future_payments_flag,
9267 I.invoice_type_lookup_code,
9268 I.exchange_date,
9269 I.exchange_rate_type,
9270 I.vendor_id,
9271 I.invoice_date,
9272 nvl(I.disc_is_inv_less_tax_flag,'N') disc_is_inv_less_tax_flag,
9273 nvl(I.exclude_freight_from_discount,'N') exclude_freight_from_discount,
9274 nvl(S.tolerance_id,ASP.tolerance_id), --Bug8524767
9275 nvl(S.services_tolerance_id,ASP.services_tolerance_id) --Bug8524767
9276 FROM ap_invoices_all I,
9277 ap_supplier_sites_all S,
9278 ap_system_parameters_all ASP --Bug8524767
9279 WHERE I.vendor_site_id = S.vendor_site_id (+)
9280 AND I.validation_request_id = AP_APPROVAL_PKG.G_VALIDATION_REQUEST_ID
9281 AND ASP.org_id = I.org_id
9282 ORDER BY I.org_id;
9283
9284 --Bug9436217
9285 l_selected_invoices_cursor AP_APPROVAL_PKG.Invoices_Table;
9286 l_blk_err_dist varchar2(1):='N';
9287 --Bug9436217
9288
9289 l_api_name CONSTANT VARCHAR2(200) := 'Batch_Approval';
9290
9291 -- Start for bug 6511249
9292 --bug7902867 cusror modified removed ap_supplier_sites_all in join
9293 CURSOR SELC_INV_CURSOR_BULK_ERROR IS
9294 SELECT I.invoice_id, i.invoice_num, i.org_id
9295 FROM ap_invoices_all I
9296 WHERE I.validation_request_id = AP_APPROVAL_PKG.G_VALIDATION_REQUEST_ID
9297 ORDER BY I.org_id;
9298
9299 TYPE selc_inv_cursor_blk_err is table of selc_inv_cursor_bulk_error%rowtype;
9300
9301 --bug9738293
9302
9303 l_sql_tax_err varchar2(1000) := 'SELECT trx_id FROM zx_errors_gt UNION SELECT invoice_id from ap_errors_gt'; --bug10140354
9304
9305
9306
9307 TYPE c_inv_err IS REF CURSOR;
9308 r_inv_err c_inv_err ;
9309
9310 TYPE inv_err_ids IS TABLE OF zx_errors_gt.trx_id%Type INDEX BY BINARY_INTEGER;
9311 l_r_inv_err inv_err_ids;
9312
9313 --bug10140354 changed the below cursor
9314 CURSOR c_tx_err is
9315 SELECT trx_id, trx_line_id, message_text
9316 FROM zx_errors_gt
9317 UNION
9318 SELECT invoice_id , reference_key2 , message_text
9319 FROM ap_errors_gt;
9320
9321 TYPE r_tx_err is table of c_tx_err%rowtype;
9322 l_r_tx_err r_tx_err;
9323
9324
9325 --bug9738293
9326
9327 l_selc_inv_cursor_blk_err selc_inv_cursor_blk_err;
9328 l_blk_err varchar2(1):='N';
9329 l_errbuf varchar2(200);
9330 l_conc_status varchar2(10);
9331 l_set_status boolean;
9332 Tax_Exception_Handled Exception;
9333 Tax_Dist_Exception_Handled Exception;
9334 -- End for bug 6511249
9335
9336 -- 7461423
9337 TYPE var_cur IS REF CURSOR;
9338 bat_inv_ref_cursor var_cur;
9339
9340 -- bug 9304530 - start
9341 l_invoice_approval_status VARCHAR2(25);
9342
9343 CURSOR Invoice_Status_Cursor(p_invoice_id NUMBER) IS
9344 SELECT AP_INVOICES_PKG.Get_Approval_Status(
9345 invoice_id,
9346 invoice_amount,
9347 payment_status_flag,
9348 invoice_type_lookup_code)
9349 FROM ap_invoices_all
9350 WHERE invoice_id = p_invoice_id
9351 FOR UPDATE NOWAIT; -- Bug 13374062
9352 -- bug 9304530 - end
9353
9354 l_manual_awt_exist NUMBER; -- bug 11830074
9355 BEGIN
9356 IF (p_debug_switch = 'Y') THEN
9357 g_debug_mode := 'Y';
9358 END IF;
9359
9360 ---------------------------------------------------------------------
9361 -- Print_Debug(l_api_name, 'AP_APPROVAL_PKG.BATCH_APPROVAL.BEGIN');
9362 IF g_debug_mode = 'Y' THEN
9363 AP_Debug_Pkg.Print(g_debug_mode, 'AP_APPROVAL_PKG.BATCH_APPROVAL.BEGIN' );
9364 END IF;
9365
9366 IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
9367 FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME||l_api_name,'AP_APPROVAL_PKG.BATCH_APPROVAL.BEGIN');
9368 END IF;
9369 ---------------------------------------------------------------------
9370
9371 ap_approval_pkg.g_validation_request_id := p_conc_request_id;
9372 g_org_holds.delete;
9373
9374 ---------------------------------------------------------------------
9375 -- Print_Debug(l_api_name, 'Setting null input parameters');
9376 IF g_debug_mode = 'Y' THEN
9377 AP_Debug_Pkg.Print(g_debug_mode, 'Setting null input parameters' );
9378 END IF;
9379
9380 IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
9381 FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME||l_api_name,'Setting null input parameters');
9382 END IF;
9383 ---------------------------------------------------------------------
9384 l_inv_batch_id := NVL(p_inv_batch_id,-1);
9385 l_vendor_id := NVL(p_vendor_id,-1);
9386 l_pay_group := NVL(p_pay_group,'All');
9387 l_invoice_id := NVL(p_invoice_id,-1);
9388 l_entered_by := NVL(p_entered_by,-999);
9389 l_commit_size := NVL(p_commit_size,1000);
9390 l_org_id := NVL(p_org_id, -3115);
9391
9392 ---------------------------------------------------------------------
9393 -- Print_Debug(l_api_name, 'Clean-up validation_request_id');
9394 IF g_debug_mode = 'Y' THEN
9395 AP_Debug_Pkg.Print(g_debug_mode, 'Clean-up validation_request_id' );
9396 END IF;
9397
9398 IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
9399 FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME||l_api_name,'Clean-up validation_request_id');
9400 END IF;
9401 ---------------------------------------------------------------------
9402 /* Bug 9777752 : Sl No 4 Change
9403 UPDATE ap_invoices api
9404 SET validation_request_id = NULL
9405 WHERE validation_request_id IS NOT NULL
9406 AND EXISTS
9407 ( SELECT 'Request Completed'
9408 FROM fnd_concurrent_requests fcr
9409 WHERE fcr.request_id = api.validation_request_id
9410 AND fcr.phase_code = 'C' ); */
9411
9412 UPDATE ap_invoices api
9413 SET validation_request_id = NULL
9414 WHERE validation_request_id IN
9415 ( SELECT request_id
9416 FROM fnd_concurrent_requests fcr
9417 WHERE fcr.concurrent_program_id = ( SELECT concurrent_program_id
9418 FROM fnd_concurrent_programs fcp
9419 WHERE fcp.application_id = 200
9420 AND fcp.concurrent_program_name = 'APPRVL'
9421 )
9422 AND fcr.phase_code = 'C');
9423 /* Bug 12712125 starts */
9424
9425 /* Following are the status code in fnd_concurrent_requests
9426 'X' Terminated
9427 'S' Suspended
9428 'D' Cancelled
9429 'G' Warning
9430 If we can confirm 'S Suspended' is also a completed request and wont
9431 start again we can add following where clause
9432 AND fcr.status_code In ( 'X', 'E', 'G','D') to improve the perf of the query */
9433
9434 /* AND fcr.status_code not in ( 'X', 'E', 'G') ); */
9435
9436 /* Bug 12712125 ends */
9437
9438 ---------------------------------------------------------------------
9439 -- Print_Debug(l_api_name, 'Cache System Options');
9440 IF g_debug_mode = 'Y' THEN
9441 AP_Debug_Pkg.Print(g_debug_mode, 'Cache System Options' );
9442 END IF;
9443
9444 IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
9445 FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME||l_api_name,'Cache System Options');
9446 END IF;
9447 ---------------------------------------------------------------------
9448 AP_Approval_PKG.Cache_Options(l_curr_calling_sequence);
9449
9450
9451 IF (l_invoice_id <> -1) THEN
9452
9453 --Bug 9304530 - Added check to exclude already validated invoices
9454 ---------------------------------------------------------------------
9455 -- Print_Debug(l_api_name, 'Check Invoice Validation Status');
9456 IF g_debug_mode = 'Y' THEN
9457 AP_Debug_Pkg.Print(g_debug_mode, 'Check Invoice Validation Status' );
9458 END IF;
9459
9460 IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
9461 FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME||l_api_name,'Check Invoice Validation Status');
9462 END IF;
9463 ---------------------------------------------------------------------
9464
9465 BEGIN
9466 OPEN Invoice_Status_Cursor(l_invoice_id);
9467 FETCH Invoice_Status_Cursor
9468 INTO l_invoice_approval_status;
9469 CLOSE Invoice_Status_Cursor;
9470
9471 IF NVL(l_invoice_approval_status,'DUMMY') NOT IN ('APPROVED','AVAILABLE','UNPAID','FULL','CANCELLED') THEN
9472
9473 IF validate_period(l_invoice_id) THEN /*bug6858309 - changed location of the call*/
9474
9475 ---------------------------------------------------------------------
9476 -- Print_Debug(l_api_name, 'Begin Approving Single Invoice');
9477 IF g_debug_mode = 'Y' THEN
9478 AP_Debug_Pkg.Print(g_debug_mode, 'Begin Approving Single Invoice' );
9479 END IF;
9480
9481 IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
9482 FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME||l_api_name,'Begin Approving Single Invoice');
9483 END IF;
9484 ---------------------------------------------------------------------
9485
9486 /* 6699825/6684139: Added the AND condition to check if the invoice has any
9487 lines. Otherwise, we will not proceed with validating the invoice */
9488
9489 UPDATE ap_invoices_all ai
9490 SET ai.validation_request_id = p_conc_request_id
9491 WHERE ai.invoice_id = l_invoice_id
9492 AND ai.validation_request_id IS NULL
9493 /*bug 7029877 Invoice saved but not submitted*/
9494 AND ai.approval_ready_flag <>'S'
9495 AND EXISTS (select ail.invoice_id
9496 from ap_invoice_lines_all ail
9497 where ail.invoice_id = ai.invoice_id) ;
9498
9499 -- bug 6351170 -Added below if condition - Return if there are no invoices to process
9500 IF sql%rowcount = 0 THEN
9501 RETURN true;
9502 END IF;
9503
9504 COMMIT;
9505
9506 BEGIN
9507 --Modified SELECT statement for bug #8420964/8556734
9508 --Added ap_system_parameters_all table and nvl condition for
9509 --tolerance columns
9510
9511 SELECT
9512 ai.invoice_num, ai.org_id, ai.invoice_type_lookup_code, ai.validation_request_id,
9513 ai.invoice_id, ai.invoice_date, ai.invoice_currency_code, ai.exchange_rate,
9514 ai.exchange_rate_type, ai.exchange_date, ai.vendor_id, ai.org_id,
9515 nvl(s.tolerance_id,asp.tolerance_id),nvl(s.services_tolerance_id,asp.services_tolerance_id)
9516 INTO
9517 l_invoice_num, l_sel_org_id, l_sel_invoice_type, l_validation_request_id,
9518 l_invoice_id, l_invoice_date, l_invoice_currency_code, l_exchange_rate,
9519 l_exchange_rate_type, l_exchange_date, l_vendor_id, l_org_id, l_tolerance_id,
9520 l_services_tolerance_id
9521 FROM ap_invoices_all ai,
9522 ap_supplier_sites_all s,
9523 ap_system_parameters_all asp
9524 WHERE ai.invoice_id = l_invoice_id
9525 AND ai.vendor_site_id = s.vendor_site_id(+)
9526 AND ai.org_id = asp.org_id;
9527 EXCEPTION
9528 WHEN OTHERS THEN
9529 -- Print_Debug(l_api_name, 'Invoice Number Not Found');
9530 IF g_debug_mode = 'Y' THEN
9531 AP_Debug_Pkg.Print(g_debug_mode, 'Invoice Number Not Found' );
9532 END IF;
9533
9534 IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
9535 FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME||l_api_name,'Invoice Number Not Found');
9536 END IF;
9537 RETURN(FALSE);
9538 END;
9539
9540 mo_global.set_policy_context('S', l_sel_org_id);
9541
9542 ---------------------------------------------------------------------
9543 -- Print_Debug (l_api_name, 'Calculate Tax');
9544 IF g_debug_mode = 'Y' THEN
9545 AP_Debug_Pkg.Print(g_debug_mode, 'Calculate Tax' );
9546 END IF;
9547
9548 IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
9549 FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME||l_api_name,'Calculate Tax');
9550 END IF;
9551 ---------------------------------------------------------------------
9552 l_success := ap_etax_pkg.calling_etax(
9553 p_invoice_id => NULL,
9554 p_calling_mode => 'CALCULATE',
9555 p_all_error_messages => 'N',
9556 p_error_code => l_error_code,
9557 p_calling_sequence => l_curr_calling_sequence);
9558
9559 IF (NOT l_success) THEN
9560 RAISE Tax_Exception;
9561 END IF;
9562
9563 ----------------------------------------------------------------
9564 -- Print_Debug(l_api_name, 'Initialize Invoice Holds Array');
9565 IF g_debug_mode = 'Y' THEN
9566 AP_Debug_Pkg.Print(g_debug_mode, 'Initialize Invoice Holds Array' );
9567 END IF;
9568
9569 IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
9570 FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME||l_api_name,'Initialize Invoice Holds Array');
9571 END IF;
9572 ----------------------------------------------------------------
9573 Initialize_Invoice_Holds(
9574 p_invoice_id => l_invoice_id,
9575 p_calling_sequence => l_curr_calling_sequence);
9576
9577 ---------------------------------------------------------------------
9578 -- Print_Debug (l_api_name, 'Generate Distributions');
9579 IF g_debug_mode = 'Y' THEN
9580 AP_Debug_Pkg.Print(g_debug_mode, 'Generate Distributions' );
9581 END IF;
9582
9583 IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
9584 FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME||l_api_name,'Generate Distributions');
9585 END IF;
9586 ---------------------------------------------------------------------
9587
9588 l_invoice_rec.invoice_id := l_invoice_id;
9589 l_invoice_rec.invoice_date := l_invoice_date;
9590 l_invoice_rec.invoice_currency_code := l_invoice_currency_code;
9591 l_invoice_rec.exchange_rate := l_exchange_rate;
9592 l_invoice_rec.exchange_rate_type := l_exchange_rate_type;
9593 l_invoice_rec.exchange_date := l_exchange_date;
9594 l_invoice_rec.vendor_id := l_vendor_id;
9595 l_invoice_rec.org_id := l_org_id;
9596 g_org_id := l_org_id;
9597
9598
9599 AP_APPROVAL_PKG.Generate_Distributions
9600 (p_invoice_rec => l_invoice_rec,
9601 p_base_currency_code => AP_APPROVAL_PKG.G_OPTIONS_TABLE(l_org_id).base_currency_code,
9602 p_inv_batch_id => p_inv_batch_id,
9603 p_run_option => p_run_option,
9604 p_calling_sequence => l_curr_calling_sequence,
9605 x_error_code => l_error_code);
9606
9607 ---------------------------------------------------------------------
9608 -- Print_Debug (l_api_name, 'Generate Tax Distributions');
9609 IF g_debug_mode = 'Y' THEN
9610 AP_Debug_Pkg.Print(g_debug_mode, 'Generate Tax Distributions' );
9611 END IF;
9612
9613 IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
9614 FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME||l_api_name,'Generate Tax Distributions');
9615 END IF;
9616 ---------------------------------------------------------------------
9617 l_success := ap_etax_pkg.calling_etax (
9618 p_invoice_id => NULL,
9619 p_calling_mode => 'DISTRIBUTE',
9620 p_all_error_messages => 'N',
9621 p_error_code => l_error_code,
9622 p_calling_sequence => l_curr_calling_sequence);
9623
9624 IF (NOT l_success) THEN
9625 RAISE Tax_Exception;
9626 END IF;
9627
9628
9629 IF l_sel_invoice_type = 'PAYMENT REQUEST' THEN
9630 l_calling_mode := 'PAYMENT REQUEST';
9631 ELSE
9632 l_calling_mode := 'APPROVE';
9633 END IF;
9634
9635 ---------------------------------------------------------------------
9636 -- Print_Debug(l_api_name, 'Approving specified invoice : '||l_invoice_num);
9637 IF g_debug_mode = 'Y' THEN
9638 AP_Debug_Pkg.Print(g_debug_mode, 'Approving specified invoice : '||l_invoice_num );
9639 END IF;
9640
9641 IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
9642 FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME||l_api_name,'Approving specified invoice : '||l_invoice_num);
9643 END IF;
9644 ---------------------------------------------------------------------
9645
9646 IF l_validation_request_id = p_conc_request_id THEN
9647
9648 --IF validate_period(l_invoice_id) THEN /*commented for bug 6858309*/
9649
9650 -- Cache Templates
9651 Cache_Tolerance_Templates(
9652 l_tolerance_id,
9653 l_services_tolerance_id,
9654 l_calling_sequence);
9655 -- Bug 11830074 start
9656 l_manual_awt_exist:=0;
9657 SELECT COUNT(*)
9658 INTO l_manual_awt_exist
9659 FROM ap_invoice_lines_all ail
9660 WHERE ail.invoice_id = l_invoice_rec.invoice_id
9661 AND ail.line_type_lookup_code = 'AWT'
9662 AND ail.line_source = 'MANUAL LINE ENTRY';
9663
9664 IF (l_manual_awt_exist > 0) THEN
9665 AP_APPROVAL_PKG.Generate_Manual_Awt_Dist
9666 (p_invoice_rec => l_invoice_rec,
9667 p_base_currency_code => AP_APPROVAL_PKG.G_OPTIONS_TABLE(l_org_id).base_currency_code,
9668 p_inv_batch_id => p_inv_batch_id,
9669 p_run_option => p_run_option,
9670 p_calling_sequence => l_curr_calling_sequence,
9671 x_error_code => l_error_code,
9672 p_calling_mode => l_calling_mode);
9673 END IF;
9674 -- Bug 11830074 end
9675
9676 --Removed the hardcoded value of p_budget_control, bug6356402
9677 AP_APPROVAL_PKG.APPROVE(
9678 '',
9679 '',
9680 '',
9681 '',
9682 '',
9683 '',
9684 l_invoice_id,
9685 '',
9686 '',
9687 '',
9688 'Y',
9689 l_holds_count,
9690 l_approval_status,
9691 l_funds_return_code,
9692 l_calling_mode,
9693 'APXAPRVL',
9694 p_debug_switch
9695 );
9696 /*commented for bug 6858309
9697 ELSE
9698 fnd_message.set_name('SQLAP', 'AP_INV_NEVER_OPEN_PERIOD');
9699 fnd_message.set_token('INV_NUM', l_invoice_num);
9700 fnd_file.put_line(fnd_file.log, fnd_message.get);
9701 END IF; */
9702
9703 UPDATE ap_invoices_all
9704 SET validation_request_id = NULL
9705 WHERE invoice_id = l_invoice_id;
9706
9707 END IF;
9708
9709 ELSE /*bug6858309- changed location of the call*/
9710 fnd_message.set_name('SQLAP', 'AP_INV_NEVER_OPEN_PERIOD');
9711 fnd_message.set_token('INV_NUM', l_invoice_num);
9712 fnd_file.put_line(fnd_file.log, fnd_message.get);
9713
9714 END IF; --if validate_period(p_invoice_id)
9715
9716 ELSE /*Bug 9304530 - Exclude already validated invoices*/
9717 fnd_message.set_name('SQLAP', 'AP_APPRVL_INV_NOT_FOUND');
9718 fnd_file.put_line(fnd_file.log, fnd_message.get);
9719 -----------------------------------------------------------------
9720 -- Print_Debug(l_api_name, 'Invoice is already approved/cancelled');
9721 IF g_debug_mode = 'Y' THEN
9722 AP_Debug_Pkg.Print(g_debug_mode, 'Invoice is already approved/cancelled' );
9723 END IF;
9724
9725 IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
9726 FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME||l_api_name,'Invoice is already approved/cancelled');
9727 END IF;
9728 -----------------------------------------------------------------
9729 END IF; --if p_approval_status...
9730
9731 EXCEPTION -- Bug 13374062
9732 WHEN OTHERS THEN
9733 -- Print_Debug(l_api_name, 'Invoice is locked for update');
9734 IF g_debug_mode = 'Y' THEN
9735 AP_Debug_Pkg.Print(g_debug_mode, 'Invoice is locked for update: invoice_id = '|| l_invoice_id );
9736 END IF;
9737
9738 IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
9739 FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME||l_api_name,'Invoice is locked for update: invoice id = ' || l_invoice_id);
9740 END IF;
9741 RETURN(TRUE);
9742 END;
9743
9744 ---------------------------------------------------------------------
9745 -- Print_Debug(l_api_name, 'End Approving Single Invoice');
9746 IF g_debug_mode = 'Y' THEN
9747 AP_Debug_Pkg.Print(g_debug_mode, 'End Approving Single Invoice' );
9748 END IF;
9749
9750 IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
9751 FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME||l_api_name,'End Approving Single Invoice');
9752 END IF;
9753 ---------------------------------------------------------------------
9754
9755 ELSE -- Invoice_id is null case -- Marker 0
9756
9757 ---------------------------------------------------------------------
9758 -- Print_Debug(l_api_name, 'Batch Approval Start');
9759 IF g_debug_mode = 'Y' THEN
9760 AP_Debug_Pkg.Print(g_debug_mode, 'Batch Approval Start' );
9761 END IF;
9762
9763 IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
9764 FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME||l_api_name,'Batch Approval Start');
9765 END IF;
9766 ---------------------------------------------------------------------
9767
9768 /*bug6858309 modified this dynamic update to filter out
9769 recurring invoices havign GL DATE in never open period*/
9770 /* Added for bug#7270053 Start */
9771 --BUG7902867 replace view with base tables in sub queries
9772 -- AP_INVOICES_ALL is replace with ap_invoices
9773 /* BUG 8218038 added nvl condition for historical and payment status flags */
9774 /* Changed the Sql structure to replace the exists with UNION ALL for bug#7584153 */
9775
9776 -- Bug 9777752 : Restructured dynamic SQL
9777 l_sql_stmt :=l_sql_stmt||
9778 'SELECT /*+ dynamic_sampling(2) cardinality(ai,10) */ invoice_id from AP_INVOICES AI -- 7461423
9779 WHERE AI.VALIDATION_REQUEST_ID IS NULL
9780 AND AI.APPROVAL_READY_FLAG <> ''S''
9781 AND AI.INVOICE_TYPE_LOOKUP_CODE<>''INVOICE REQUEST'' /*Bug 16263597*/
9782 AND AI.CANCELLED_DATE IS NULL /* Bug 9777752 */
9783 AND NOT ( NVL(AI.PAYMENT_STATUS_FLAG,''N'') = ''Y'' AND
9784 NVL(AI.HISTORICAL_FLAG,''N'') = ''Y'' AND
9785 NVL(AI.FORCE_REVALIDATION_FLAG,''N'') = ''N'') /*Bug11934187*/
9786 AND EXISTS (
9787 SELECT /*+ PUSH_SUBQ */ 1
9788 FROM DUAL
9789 WHERE UPPER(NVL(AI.SOURCE, ''X'')) <> ''RECURRING INVOICE''
9790 UNION ALL
9791 SELECT 1
9792 FROM DUAL
9793 WHERE UPPER(NVL(AI.SOURCE, ''X'')) = ''RECURRING INVOICE''
9794 AND NOT EXISTS
9795 ( SELECT NULL
9796 FROM GL_PERIOD_STATUSES GLPS
9797 WHERE GLPS.APPLICATION_ID = ''200''
9798 AND GLPS.SET_OF_BOOKS_ID = AI.SET_OF_BOOKS_ID
9799 AND TRUNC(AI.GL_DATE) BETWEEN GLPS.START_DATE AND GLPS.END_DATE
9800 AND NVL(GLPS.ADJUSTMENT_PERIOD_FLAG, ''N'') = ''N''
9801 AND GLPS.CLOSING_STATUS = ''N''
9802 )
9803 )
9804 AND EXISTS (
9805 SELECT 1
9806 FROM DUAL
9807 WHERE AI.FORCE_REVALIDATION_FLAG = ''Y''
9808 UNION ALL
9809 SELECT 1
9810 FROM AP_INVOICE_DISTRIBUTIONS_ALL D,
9811 FINANCIALS_SYSTEM_PARAMS_ALL FSP
9812 WHERE D.INVOICE_ID = AI.INVOICE_ID
9813 AND FSP.ORG_ID = AI.ORG_ID
9814 AND FSP.SET_OF_BOOKS_ID = AI.SET_OF_BOOKS_ID
9815 AND (NVL(FSP.PURCH_ENCUMBRANCE_FLAG,''N'') = ''Y'' AND NVL(D.MATCH_STATUS_FLAG,''N'') <> ''A'' OR
9816 (NVL(FSP.PURCH_ENCUMBRANCE_FLAG,''N'') = ''N'' AND NVL(D.MATCH_STATUS_FLAG,''N'') NOT IN (''A'',''T'')))
9817 UNION ALL
9818 SELECT 1
9819 FROM AP_SELF_ASSESSED_TAX_DIST_ALL D,
9820 FINANCIALS_SYSTEM_PARAMS_ALL FSP
9821 WHERE D.INVOICE_ID = AI.INVOICE_ID
9822 AND FSP.ORG_ID = AI.ORG_ID
9823 AND FSP.SET_OF_BOOKS_ID = AI.SET_OF_BOOKS_ID
9824 AND (NVL(FSP.PURCH_ENCUMBRANCE_FLAG,''N'') = ''Y'' AND NVL(D.MATCH_STATUS_FLAG,''N'') <> ''A'' OR
9825 (NVL(FSP.PURCH_ENCUMBRANCE_FLAG,''N'') = ''N'' AND NVL(D.MATCH_STATUS_FLAG,''N'') NOT IN (''A'',''T'')))
9826 AND NOT EXISTS
9827 ( SELECT ''Cancelled distributions''
9828 FROM AP_SELF_ASSESSED_TAX_DIST_ALL D2
9829 WHERE D2.INVOICE_ID = D.INVOICE_ID
9830 AND D2.CANCELLATION_FLAG = ''Y''
9831 )
9832 UNION ALL
9833 SELECT 1
9834 FROM AP_HOLDS_ALL H
9835 WHERE H.INVOICE_ID = AI.INVOICE_ID
9836 AND ((H.HOLD_LOOKUP_CODE IN
9837 (''QTY ORD'', ''QTY REC'', ''AMT ORD'', ''AMT REC'', ''QUALITY'',
9838 ''PRICE'', ''TAX DIFFERENCE'', ''CURRENCY DIFFERENCE'',
9839 ''REC EXCEPTION'', ''TAX VARIANCE'', ''PO NOT APPROVED'',
9840 ''PO REQUIRED'', ''MAX SHIP AMOUNT'', ''MAX RATE AMOUNT'',
9841 ''MAX TOTAL AMOUNT'', ''TAX AMOUNT RANGE'', ''MAX QTY ORD'',
9842 ''MAX QTY REC'', ''MAX AMT ORD'', ''MAX AMT REC'',
9843 ''CANT CLOSE PO'', ''CANT TRY PO CLOSE'', ''LINE VARIANCE'',
9844 ''CANT FUNDS CHECK'',''Expired Registration'',''Amount Funded'',''Quantity Funded'',
9845 ''GTAS Mandatory Fields'',''GTAS Data Validation'')) OR /* Bug#13464635 */
9846 (H.HOLD_LOOKUP_CODE IN (SELECT HOLD_LOOKUP_CODE
9847 FROM AP_HOLD_CODES
9848 WHERE POSTABLE_FLAG = ''N''
9849 AND USER_RELEASEABLE_FLAG = ''N''))) /* Bug 14579876 */
9850 AND H.RELEASE_LOOKUP_CODE IS NULL
9851 AND EXISTS
9852 ( SELECT ''Lines''
9853 FROM AP_INVOICE_LINES_ALL L2
9854 WHERE L2.INVOICE_ID = H.INVOICE_ID ) --8580790,9112369
9855 UNION ALL
9856 SELECT 1
9857 FROM AP_INVOICE_LINES_ALL AIL
9858 WHERE AIL.INVOICE_ID = AI.INVOICE_ID
9859 /* Bug 9777752 AND AI.CANCELLED_DATE IS NULL */
9860 AND NVL(AIL.DISCARDED_FLAG, ''N'') <> ''Y''
9861 AND NVL(AIL.CANCELLED_FLAG, ''N'') <> ''Y''
9862 AND (AIL.AMOUNT <> 0 OR
9863 (AIL.AMOUNT = 0 AND AIL.GENERATE_DISTS = ''Y'')) --8580790
9864 AND NOT EXISTS
9865 ( SELECT /*+ NO_UNNEST */
9866 ''distributed line''
9867 FROM AP_INVOICE_DISTRIBUTIONS_ALL D5
9868 WHERE D5.INVOICE_ID = AIL.INVOICE_ID
9869 AND D5.INVOICE_LINE_NUMBER = AIL.LINE_NUMBER
9870 )
9871 )
9872 AND NOT EXISTS
9873 ( SELECT /*+ no_push_subq */ ''Cancelled distributions''
9874 FROM AP_INVOICE_DISTRIBUTIONS_ALL D3
9875 WHERE D3.INVOICE_ID = AI.INVOICE_ID
9876 AND D3.CANCELLATION_FLAG = ''Y''
9877 ) ' ;
9878
9879
9880
9881 --Bug9436217
9882
9883 IF P_org_id IS NOT NULL THEN
9884 l_sql_stmt := l_sql_stmt|| 'AND AI.org_id = :b_org_id ' ;
9885 END IF ;
9886 IF P_inv_batch_id IS NOT NULL THEN
9887 l_sql_stmt := l_sql_stmt|| 'AND AI.batch_id = :b_inv_batch_id ' ;
9888 END IF ;
9889
9890 --Bug9436217
9891
9892 IF P_vendor_id IS NOT NULL THEN
9893 l_sql_stmt := l_sql_stmt|| 'AND AI.vendor_id = ' || p_vendor_id || ' ' ;
9894 END IF ;
9895 IF P_inv_start_date IS NOT NULL AND P_inv_end_date IS NULL THEN
9896 l_sql_stmt := l_sql_stmt|| 'AND AI.invoice_date >= :b_start_date ' ;
9897 END IF ;
9898 IF P_inv_start_date IS NULL AND P_inv_end_date IS NOT NULL THEN
9899 l_sql_stmt := l_sql_stmt || 'AND AI.invoice_date <= :b_end_date ' ;
9900 END IF ;
9901 IF P_inv_start_date IS NOT NULL AND P_inv_end_date IS NOT NULL THEN
9902 IF P_inv_start_date <> P_inv_end_date THEN
9903 l_sql_stmt := l_sql_stmt || 'AND AI.invoice_date BETWEEN :b_start_date AND :b_end_date ' ;
9904 ELSE
9905 l_sql_stmt := l_sql_stmt || 'AND AI.invoice_date = :b_start_date ' ;
9906 END IF ;
9907 END IF ;
9908 IF P_entered_by IS NOT NULL THEN
9909 l_sql_stmt := l_sql_stmt || ' AND AI.created_by = ' || l_entered_by || ' ' ;
9910 END IF ;
9911 IF P_pay_group IS NOT NULL THEN
9912 l_sql_stmt := l_sql_stmt || ' and AI.pay_group_lookup_code = ' || '''' || l_pay_group || '''' || ' ' ;
9913 END IF ;
9914
9915
9916 --Bug8587494
9917 /*
9918 -- Added for bug 8234569
9919 IF P_transaction_num IS NOT NULL THEN
9920 l_sql_stmt := l_sql_stmt || ' and rownum <= '|| P_transaction_num || ' ';
9921 END IF ;
9922 -- Bug 8234569 ends
9923 */
9924 --Bug8587494
9925
9926
9927 l_sql_stmt :=l_sql_stmt || ' FOR UPDATE SKIP LOCKED';
9928 ---------------------------------------------------------------------
9929 -- bug 9054664: modify start
9930 -- split the string as fndlog cannot handle more than 4000 chars
9931 -- Print_Debug (l_api_name, substr(l_sql_stmt, 1, 4000));
9932 -- Print_Debug (l_api_name, substr(l_sql_stmt, 4001));
9933 IF g_debug_mode = 'Y' THEN
9934 AP_Debug_Pkg.Print(g_debug_mode, substr(l_sql_stmt, 1, 4000) );
9935 AP_Debug_Pkg.Print(g_debug_mode, substr(l_sql_stmt, 4001) );
9936 END IF;
9937
9938 IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
9939 FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME||l_api_name, substr(l_sql_stmt, 1, 4000));
9940 FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME||l_api_name, substr(l_sql_stmt, 4001));
9941 END IF;
9942 -- bug 9054664: modify end
9943 ---------------------------------------------------------------------
9944
9945 --Bug9436217
9946
9947 IF p_inv_start_date IS NOT NULL OR p_inv_end_date IS NOT NULL THEN
9948 IF (p_inv_start_date IS NOT NULL AND p_inv_end_date IS NOT NULL AND P_inv_start_date <> P_inv_end_date) THEN -- bug 7688696
9949
9950 IF P_org_id IS NOT NULL THEN
9951 IF P_inv_batch_id IS NOT NULL THEN
9952 OPEN bat_inv_ref_cursor FOR l_sql_stmt
9953 USING l_org_id, p_inv_batch_id, p_inv_start_date, p_inv_end_date;
9954 ELSE
9955 OPEN bat_inv_ref_cursor FOR l_sql_stmt
9956 USING l_org_id, p_inv_start_date, p_inv_end_date;
9957 END IF ;
9958 ELSE
9959 IF P_inv_batch_id IS NOT NULL THEN
9960 OPEN bat_inv_ref_cursor FOR l_sql_stmt
9961 USING p_inv_batch_id, p_inv_start_date, p_inv_end_date;
9962 ELSE
9963 OPEN bat_inv_ref_cursor FOR l_sql_stmt
9964 USING p_inv_start_date, p_inv_end_date;
9965 END IF ;
9966 END IF ;
9967
9968 ELSE
9969
9970 IF P_org_id IS NOT NULL THEN
9971 IF P_inv_batch_id IS NOT NULL THEN
9972 OPEN bat_inv_ref_cursor FOR l_sql_stmt
9973 USING l_org_id, p_inv_batch_id, NVL(p_inv_start_date, p_inv_end_date);
9974 ELSE
9975 OPEN bat_inv_ref_cursor FOR l_sql_stmt
9976 USING l_org_id, NVL(p_inv_start_date, p_inv_end_date);
9977 END IF ;
9978 ELSE
9979 IF P_inv_batch_id IS NOT NULL THEN
9980 OPEN bat_inv_ref_cursor FOR l_sql_stmt
9981 USING p_inv_batch_id, NVL(p_inv_start_date, p_inv_end_date);
9982 ELSE
9983 OPEN bat_inv_ref_cursor FOR l_sql_stmt
9984 USING NVL(p_inv_start_date, p_inv_end_date);
9985 END IF ;
9986 END IF ;
9987
9988 END IF;
9989
9990 ELSE
9991
9992 IF P_org_id IS NOT NULL THEN
9993 IF P_inv_batch_id IS NOT NULL THEN
9994 OPEN bat_inv_ref_cursor FOR l_sql_stmt
9995 USING l_org_id, p_inv_batch_id ;
9996 ELSE
9997 OPEN bat_inv_ref_cursor FOR l_sql_stmt
9998 USING l_org_id ;
9999 END IF ;
10000 ELSE
10001 IF P_inv_batch_id IS NOT NULL THEN
10002 OPEN bat_inv_ref_cursor FOR l_sql_stmt
10003 USING p_inv_batch_id ;
10004 ELSE
10005 OPEN bat_inv_ref_cursor FOR l_sql_stmt ;
10006 END IF ;
10007 END IF ;
10008 END IF;
10009
10010 --Bug9436217
10011
10012
10013 --Bug8587494
10014 IF P_transaction_num is NULL OR P_transaction_num = 0 THEN
10015 -- 7461423 to skip locked invoices
10016 FETCH bat_inv_ref_cursor
10017 BULK COLLECT INTO l_selected_invoice_ids;
10018 CLOSE bat_inv_ref_cursor;
10019 ELSIF P_transaction_num > 0 THEN
10020 -- 7461423 to skip locked invoices
10021 FETCH bat_inv_ref_cursor
10022 BULK COLLECT INTO l_selected_invoice_ids LIMIT P_transaction_num;
10023 CLOSE bat_inv_ref_cursor;
10024 END IF;
10025 --Bug8587494
10026
10027 -- Added debug msg for Bug 8234569
10028 ---------------------------------------------------------------------
10029 -- FND_FILE.PUT_LINE(FND_FILE.LOG,'No. of Invoices selected for Processing: '||l_selected_invoice_ids.count);
10030 -- Print_Debug (l_api_name,'No. of Invoices selected for Processing: '||l_selected_invoice_ids.count);
10031 IF g_debug_mode = 'Y' THEN
10032 AP_Debug_Pkg.Print(g_debug_mode, 'No. of Invoices selected for Processing: '||l_selected_invoice_ids.count );
10033 END IF;
10034
10035 IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
10036 FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME||l_api_name,'No. of Invoices selected for Processing: '||l_selected_invoice_ids.count);
10037 END IF;
10038 ---------------------------------------------------------------------
10039
10040 IF l_selected_invoice_ids.count > 0 THEN
10041
10042 --Bug9436217
10043
10044 FORALL k IN 1..l_selected_invoice_ids.COUNT
10045 UPDATE ap_invoices_all
10046 SET validation_request_id = AP_APPROVAL_PKG.G_VALIDATION_REQUEST_ID
10047 WHERE invoice_id = l_selected_invoice_ids(k)
10048 AND validation_request_id IS NULL;
10049
10050 --Bug9436217
10051
10052
10053 ELSE
10054
10055 RETURN true;
10056
10057 END IF;
10058
10059 COMMIT;
10060
10061 ---------------------------------------------------------------------
10062 -- Print_Debug (l_api_name, 'Calculate Tax');
10063 IF g_debug_mode = 'Y' THEN
10064 AP_Debug_Pkg.Print(g_debug_mode, 'No. of Invoices selected for Processing: '||'Calculate Tax' );
10065 END IF;
10066
10067 IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
10068 FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME||l_api_name,'Calculate Tax');
10069 END IF;
10070 ---------------------------------------------------------------------
10071
10072 SAVEPOINT AP_APPROVAL_PKG_SP_ETAX;
10073
10074 --bug 9738293
10075 --Changed the calling method for Bulk tax calulation . ETAX API will be called till there is no
10076 -- error in ZX error table or they return success.
10077
10078 LOOP
10079
10080 delete from zx_errors_gt; --Flusing the GT Table
10081 delete from ap_errors_gt; --Flusing the AP GT table --bug10140354
10082
10083 --Moved Logging inside loop
10084 FND_FILE.PUT_LINE(FND_FILE.LOG,'(Bulk CALCULATE) START SYSDATE '||to_char(sysdate,'DD-MON-YYYY HH24:MI:SS')); --Bug16390854
10085
10086 l_success := ap_etax_pkg.calling_etax(
10087 p_invoice_id => NULL,
10088 p_calling_mode => 'CALCULATE',
10089 p_all_error_messages => 'N',
10090 p_error_code => l_error_code,
10091 p_calling_sequence => l_curr_calling_sequence);
10092
10093 FND_FILE.PUT_LINE(FND_FILE.LOG,'(Bulk CALCULATE) END SYSDATE '||to_char(sysdate,'DD-MON-YYYY HH24:MI:SS')); --Bug16390854
10094 --Moved Logging inside loop
10095
10096 OPEN c_tx_err ;
10097 FETCH c_tx_err
10098 BULK COLLECT INTO l_r_tx_err;
10099 CLOSE c_tx_err;
10100
10101 IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
10102 FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME||l_api_name,' Rows fetched from GT is ' || l_r_tx_err.count );
10103 END IF ;
10104
10105 EXIT when (l_r_tx_err.count = 0 OR l_success);
10106
10107
10108 OPEN r_inv_err for l_sql_tax_err ;
10109 FETCH r_inv_err
10110 BULK COLLECT INTO l_r_inv_err;
10111 CLOSE r_inv_err;
10112
10113
10114 ROLLBACK TO SAVEPOINT AP_APPROVAL_PKG_SP_ETAX;
10115
10116
10117 FORALL i in 1..l_r_inv_err.count
10118 Update ap_invoices_all set validation_request_id = NULL where invoice_id = l_r_inv_err(i);
10119
10120 -- Bug 14579876: Moved FND_LOG.String() call above SAVEPOINT
10121 IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
10122 FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME||l_api_name,' Rows updated ' || sql%rowcount);
10123 END IF ;
10124
10125 SAVEPOINT AP_APPROVAL_PKG_SP_ETAX; --bug10140354 Added Savepoint
10126
10127
10128 l_conc_status := 'WARNING';
10129
10130 FOR i in 1..l_r_tx_err.count
10131 LOOP
10132
10133 fnd_file.put_line (fnd_file.log, l_approval_error
10134 || 'Invoice Validation did not process Invoice Id Due to Tax Error:' || l_r_tx_err(i).trx_id
10135 || ', Line Number: ' || l_r_tx_err(i).trx_line_id);
10136 fnd_file.put_line (fnd_file.log, l_r_tx_err(i).message_text);
10137
10138 IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
10139 FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME||l_api_name,' Invoice Validation did not process Invoice Id Due to Tax Error:'
10140 || l_r_tx_err(i).trx_id);
10141 END IF;
10142 END LOOP;
10143
10144 END LOOP;
10145 --bug 9738293
10146
10147 IF (NOT l_success) THEN -- Marker 1
10148
10149 ROLLBACK TO SAVEPOINT AP_APPROVAL_PKG_SP_ETAX;
10150
10151 -- Moved logging inside IF
10152 FND_FILE.PUT_LINE(FND_FILE.LOG,'(SERIAL CALCULATE) START SYSDATE '||to_char(sysdate,'DD-MON-YYYY HH24:MI:SS')); --Bug16390854
10153
10154 l_blk_err := 'Y';
10155
10156 ---------------------------------------------------------------------
10157 -- Print_Debug (l_api_name, 'Set Concurrent Request Warning');
10158 IF g_debug_mode = 'Y' THEN
10159 AP_Debug_Pkg.Print(g_debug_mode, 'Set Concurrent Request Warning' );
10160 END IF;
10161
10162 IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
10163 FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME||l_api_name,'Set Concurrent Request Warning');
10164 END IF;
10165 ---------------------------------------------------------------------
10166
10167 l_conc_status := 'WARNING';
10168 --bug 7512258 removed call to FND_CONCURRENT.SET_COMPLETION_STATUS
10169
10170 ---------------------------------------------------------------------
10171 -- Print_Debug (l_api_name, 'Begin Single Mode');
10172 IF g_debug_mode = 'Y' THEN
10173 AP_Debug_Pkg.Print(g_debug_mode, 'Begin Single Mode' );
10174 END IF;
10175
10176 IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
10177 FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME||l_api_name,'Begin Single Mode');
10178 END IF;
10179 ---------------------------------------------------------------------
10180 --Bug9436217
10181
10182 OPEN SELECTED_INVOICES_CURSOR ;
10183 FETCH SELECTED_INVOICES_CURSOR
10184 BULK COLLECT INTO l_selected_invoices_cursor ;
10185
10186 FOR i IN 1..l_selected_invoices_cursor.count
10187
10188 --Bug9436217
10189
10190 LOOP
10191
10192 SAVEPOINT AP_APPROVAL_PKG_SP_INV;
10193
10194 --Bug9436217
10195 BEGIN
10196 mo_global.set_policy_context('S', l_selected_invoices_cursor(i).org_id);
10197
10198 --Bug9436217
10199
10200 ---------------------------------------------------------------------
10201 -- Print_Debug (l_api_name, 'Calculate Tax');
10202 IF g_debug_mode = 'Y' THEN
10203 AP_Debug_Pkg.Print(g_debug_mode, 'Calculate Tax' );
10204 END IF;
10205
10206 IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
10207 FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME||l_api_name,'Calculate Tax');
10208 END IF;
10209 ---------------------------------------------------------------------
10210 l_success := ap_etax_pkg.calling_etax(
10211 --Bug9436217
10212 p_invoice_id => l_selected_invoices_cursor(i).invoice_id,
10213 --Bug9436217
10214 p_calling_mode => 'CALCULATE',
10215 p_all_error_messages => 'N',
10216 p_error_code => l_error_code,
10217 p_calling_sequence => l_curr_calling_sequence);
10218
10219 IF (NOT l_success) THEN
10220 RAISE Tax_Exception_Handled;
10221 END IF;
10222
10223 ----------------------------------------------------------------
10224 -- Print_Debug(l_api_name, 'Initialize Invoice Holds Array');
10225 IF g_debug_mode = 'Y' THEN
10226 AP_Debug_Pkg.Print(g_debug_mode, 'Initialize Invoice Holds Array' );
10227 END IF;
10228
10229 IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
10230 FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME||l_api_name,'Initialize Invoice Holds Array');
10231 END IF;
10232 ----------------------------------------------------------------
10233 Initialize_Invoice_Holds(
10234 --Bug9436217
10235 p_invoice_id => l_selected_invoices_cursor(i).invoice_id,
10236 --Bug9436217
10237 p_calling_sequence => l_curr_calling_sequence);
10238
10239 ---------------------------------------------------------------------
10240 -- Print_Debug (l_api_name, 'Generate Distributions');
10241 IF g_debug_mode = 'Y' THEN
10242 AP_Debug_Pkg.Print(g_debug_mode, 'Generate Distributions' );
10243 END IF;
10244
10245 IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
10246 FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME||l_api_name,'Generate Distributions');
10247 END IF;
10248 ---------------------------------------------------------------------
10249
10250 --Bug9436217
10251
10252 l_invoice_rec.invoice_id := l_selected_invoices_cursor(i).invoice_id;
10253 l_invoice_rec.invoice_date := l_selected_invoices_cursor(i).invoice_date;
10254 l_invoice_rec.invoice_currency_code := l_selected_invoices_cursor(i).invoice_currency_code;
10255 l_invoice_rec.exchange_rate := l_selected_invoices_cursor(i).exchange_rate;
10256 l_invoice_rec.exchange_rate_type := l_selected_invoices_cursor(i).exchange_rate_type;
10257 l_invoice_rec.exchange_date := l_selected_invoices_cursor(i).exchange_date;
10258 l_invoice_rec.vendor_id := l_selected_invoices_cursor(i).vendor_id;
10259 l_invoice_rec.org_id := l_selected_invoices_cursor(i).org_id;
10260 g_org_id := l_selected_invoices_cursor(i).org_id;
10261
10262 --Bug9436217
10263
10264
10265 AP_APPROVAL_PKG.Generate_Distributions
10266 (p_invoice_rec => l_invoice_rec,
10267 --Bug9436217
10268 p_base_currency_code => AP_APPROVAL_PKG.G_OPTIONS_TABLE(l_selected_invoices_cursor(i).org_id).base_currency_code,
10269 --Bug9436217
10270 p_inv_batch_id => p_inv_batch_id,
10271 p_run_option => p_run_option,
10272 p_calling_sequence => l_curr_calling_sequence,
10273 x_error_code => l_error_code);
10274
10275 ---------------------------------------------------------------------
10276 -- Print_Debug (l_api_name, 'Generate Tax Distributions');
10277 IF g_debug_mode = 'Y' THEN
10278 AP_Debug_Pkg.Print(g_debug_mode, 'Generate Tax Distributions' );
10279 END IF;
10280
10281 IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
10282 FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME||l_api_name,'Generate Tax Distributions');
10283 END IF;
10284 ---------------------------------------------------------------------
10285 l_success := ap_etax_pkg.calling_etax (
10286 --Bug9436217
10287 p_invoice_id => l_selected_invoices_cursor(i).invoice_id,
10288 --Bug9436217
10289 p_calling_mode => 'DISTRIBUTE',
10290 p_all_error_messages => 'N',
10291 p_error_code => l_error_code,
10292 p_calling_sequence => l_curr_calling_sequence);
10293
10294 IF (NOT l_success) THEN
10295 RAISE Tax_Exception_Handled;
10296 END IF;
10297
10298 --Bug9436217
10299 IF l_selected_invoices_cursor(i).invoice_type_lookup_code = 'PAYMENT REQUEST' THEN
10300 --Bug9436217
10301 l_calling_mode := 'PAYMENT REQUEST';
10302 ELSE
10303 l_calling_mode := 'APPROVE';
10304 END IF;
10305
10306 --Bug9436217
10307 ---------------------------------------------------------------------
10308 -- Print_Debug(l_api_name, 'Approving specified invoice : '||l_selected_invoices_cursor(i).invoice_num);
10309 IF g_debug_mode = 'Y' THEN
10310 AP_Debug_Pkg.Print(g_debug_mode, 'Approving specified invoice : '||l_selected_invoices_cursor(i).invoice_num );
10311 END IF;
10312
10313 IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
10314 FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME||l_api_name,'Approving specified invoice : '||l_selected_invoices_cursor(i).invoice_num);
10315 END IF;
10316 ---------------------------------------------------------------------
10317
10318
10319 --IF l_validation_request_id = p_conc_request_id THEN
10320
10321 IF validate_period(l_selected_invoices_cursor(i).invoice_id) THEN
10322 --Bug9436217
10323 -- Cache Templates
10324 Cache_Tolerance_Templates(
10325 --Bug9436217
10326 l_selected_invoices_cursor(i).tolerance_id,
10327 l_selected_invoices_cursor(i).services_tolerance_id,
10328 --Bug9436217
10329 l_calling_sequence);
10330
10331 -- Bug 11830074 start
10332 l_manual_awt_exist:=0;
10333 SELECT COUNT(*)
10334 INTO l_manual_awt_exist
10335 FROM ap_invoice_lines_all ail
10336 WHERE ail.invoice_id = l_selected_invoices_cursor(i).invoice_id
10337 AND ail.line_type_lookup_code = 'AWT'
10338 AND ail.line_source = 'MANUAL LINE ENTRY';
10339
10340 IF (l_manual_awt_exist > 0) THEN
10341 AP_APPROVAL_PKG.Generate_Manual_Awt_Dist
10342 (p_invoice_rec => l_selected_invoices_cursor(i),
10343 p_base_currency_code => AP_APPROVAL_PKG.G_OPTIONS_TABLE(l_selected_invoices_cursor(i).org_id).base_currency_code,
10344 p_inv_batch_id => p_inv_batch_id,
10345 p_run_option => p_run_option,
10346 p_calling_sequence => l_curr_calling_sequence,
10347 x_error_code => l_error_code,
10348 p_calling_mode => l_calling_mode);
10349 END IF;
10350 -- Bug 11830074 end
10351 --Removed the hardcoded value of p_budget_control, bug6356402
10352 AP_APPROVAL_PKG.APPROVE(
10353 '',
10354 '',
10355 '',
10356 '',
10357 '',
10358 '',
10359 --Bug9436217
10360 l_selected_invoices_cursor(i).invoice_id,
10361 --Bug9436217
10362 '',
10363 '',
10364 '',
10365 'Y',
10366 l_holds_count,
10367 l_approval_status,
10368 l_funds_return_code,
10369 l_calling_mode,
10370 'APXAPRVL',
10371 p_debug_switch
10372 );
10373 ELSE
10374 fnd_message.set_name('SQLAP', 'AP_INV_NEVER_OPEN_PERIOD');
10375 --Bug9436217
10376 fnd_message.set_token('INV_NUM', l_selected_invoices_cursor(i).invoice_num);
10377 --Bug9436217
10378 fnd_file.put_line(fnd_file.log, fnd_message.get);
10379 END IF;
10380 --Bug9436217
10381 --END IF;
10382 --Bug9436217
10383 ---------------------------------------------------------------------
10384 -- Print_Debug(l_api_name, 'End Approving Single Invoice');
10385 IF g_debug_mode = 'Y' THEN
10386 AP_Debug_Pkg.Print(g_debug_mode, 'End Approving Single Invoice' );
10387 END IF;
10388
10389 IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
10390 FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME||l_api_name,'End Approving Single Invoice');
10391 END IF;
10392 ---------------------------------------------------------------------
10393
10394 EXCEPTION
10395 WHEN TAX_EXCEPTION_HANDLED THEN
10396
10397 ROLLBACK TO SAVEPOINT AP_APPROVAL_PKG_SP_INV;
10398
10399 ap_utilities_pkg.ap_get_message(l_approval_error);
10400 fnd_file.put_line (fnd_file.log, ' ');
10401 --Bug9436217
10402 fnd_file.put_line (fnd_file.log, l_approval_error || 'Invoice Validation did not process Invoice Number: '|| l_selected_invoices_cursor(i).invoice_num);
10403 --Bug9436217
10404 fnd_file.put_line (fnd_file.log, l_error_code); --7392260
10405 fnd_file.put_line (fnd_file.log, ' Error: ' ||sqlerrm);
10406 --Bug9436217
10407 -- Print_Debug (l_api_name, 'Exception: '|| sqlerrm ||' Invoice Validation did not process Invoice Number: '||
10408 -- l_selected_invoices_cursor(i).invoice_num);
10409 IF g_debug_mode = 'Y' THEN
10410 AP_Debug_Pkg.Print(g_debug_mode, 'Exception: '|| sqlerrm ||' Invoice Validation did not process Invoice Number: '||
10411 l_selected_invoices_cursor(i).invoice_num);
10412 END IF;
10413
10414 IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
10415 FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME||l_api_name,'Exception: '|| sqlerrm ||' Invoice Validation did not process Invoice Number: '||
10416 l_selected_invoices_cursor(i).invoice_num);
10417 END IF;
10418 --Bug9436217
10419
10420
10421 WHEN OTHERS THEN
10422
10423 ROLLBACK TO SAVEPOINT AP_APPROVAL_PKG_SP_INV;
10424
10425 ap_utilities_pkg.ap_get_message(l_approval_error);
10426 fnd_file.put_line (fnd_file.log, ' ');
10427 --Bug9436217
10428 fnd_file.put_line (fnd_file.log, l_approval_error || 'Invoice Validation did not process Invoice Number: '|| l_selected_invoices_cursor(i).invoice_num);
10429 --Bug9436217
10430 fnd_file.put_line (fnd_file.log, ' Error: ' ||sqlerrm);
10431 --Bug9436217
10432 -- Print_Debug (l_api_name, 'Exception: '|| sqlerrm ||' Invoice Validation did not process Invoice Number: '||
10433 -- l_selected_invoices_cursor(i).invoice_num);
10434 IF g_debug_mode = 'Y' THEN
10435 AP_Debug_Pkg.Print(g_debug_mode, 'Exception: '|| sqlerrm ||' Invoice Validation did not process Invoice Number: '||
10436 l_selected_invoices_cursor(i).invoice_num);
10437 END IF;
10438
10439 IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
10440 FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME||l_api_name,'Exception: '|| sqlerrm ||' Invoice Validation did not process Invoice Number: '||
10441 l_selected_invoices_cursor(i).invoice_num);
10442 END IF;
10443 --Bug9436217
10444
10445 END;
10446 END LOOP;
10447
10448 --Bug9436217
10449
10450 UPDATE ap_invoices_all
10451 SET validation_request_id = NULL
10452 WHERE validation_request_id = AP_APPROVAL_PKG.G_VALIDATION_REQUEST_ID;
10453
10454
10455
10456 CLOSE SELECTED_INVOICES_CURSOR;
10457
10458 --Bug9436217
10459
10460 -- bug 7392260: add start
10461 ELSE -- bulk process succeded.
10462 -- we might still have errors in few invoices, even though
10463 -- ebtax returned success status for bulk process.
10464 -- Eg. control amount not null.
10465 -- We'll print these msgs to the concurrent log.
10466
10467 --bug9738293
10468 FOR i in 1..l_r_tx_err.count
10469 LOOP
10470
10471 fnd_file.put_line (fnd_file.log, l_approval_error
10472 || 'Invoice Validation did not process Invoice Id Due to Expected Tax Error :' || l_r_tx_err(i).trx_id
10473 || ', Line Number: ' || l_r_tx_err(i).trx_line_id);
10474 fnd_file.put_line (fnd_file.log, l_r_tx_err(i).message_text);
10475
10476 IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
10477 FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME||l_api_name,' Invoice Validation did not process Invoice Id Due to Expected Tax Error:'
10478 || l_r_tx_err(i).trx_id);
10479 END IF;
10480 END LOOP;
10481
10482 --bug9738293
10483
10484 /* DECLARE
10485 CURSOR c_tx_err is
10486 SELECT trx_id, trx_line_id, message_text
10487 FROM zx_errors_gt;
10488 r_tx_err c_tx_err%rowtype;
10489 BEGIN
10490 FOR r_tx_err IN c_tx_err LOOP
10491 fnd_file.put_line (fnd_file.log, l_approval_error
10492 || 'Invoice Validation did not process Invoice Id:' || r_tx_err.trx_id
10493 || ', Line Number: ' || r_tx_err.trx_line_id);
10494 fnd_file.put_line (fnd_file.log, r_tx_err.message_text);
10495 Print_Debug (l_api_name, ' Invoice Validation did not process Invoice Id: '
10496 || r_tx_err.trx_id);
10497 END LOOP;
10498 END; */
10499
10500 -- bug 7392260: add end
10501
10502 END IF; -- Marker 1
10503
10504
10505 IF l_blk_err = 'N' THEN -- Marker 2
10506
10507 ---------------------------------------------------------------------
10508 -- Print_Debug (l_api_name, 'Generate Distributions');
10509 IF g_debug_mode = 'Y' THEN
10510 AP_Debug_Pkg.Print(g_debug_mode, 'Generate Distributions' );
10511 END IF;
10512
10513 IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
10514 FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME||l_api_name,'Generate Distributions');
10515 END IF;
10516 ---------------------------------------------------------------------
10517
10518 OPEN SELECTED_INVOICES_CURSOR;
10519 LOOP
10520 FETCH SELECTED_INVOICES_CURSOR
10521 BULK COLLECT INTO AP_APPROVAL_PKG.G_SELECTED_INVOICES
10522 LIMIT l_commit_size;
10523
10524 EXIT WHEN SELECTED_INVOICES_CURSOR%NOTFOUND
10525 AND AP_APPROVAL_PKG.G_SELECTED_INVOICES.COUNT <= 0;
10526
10527 FOR i IN 1..AP_APPROVAL_PKG.G_SELECTED_INVOICES.COUNT
10528 LOOP
10529 -- Set Policy
10530 IF AP_APPROVAL_PKG.G_SELECTED_INVOICES(i).org_id <> nvl(l_old_org_id, -3115) THEN
10531
10532 mo_global.set_policy_context
10533 ('S', AP_APPROVAL_PKG.G_SELECTED_INVOICES(i).org_id);
10534
10535 l_old_org_id := AP_APPROVAL_PKG.G_SELECTED_INVOICES(i).org_id;
10536
10537 END IF;
10538
10539 -- Initialize Invoice Holds Array
10540 Initialize_Invoice_Holds(
10541 p_invoice_id => AP_APPROVAL_PKG.G_SELECTED_INVOICES(i).invoice_id,
10542 p_calling_sequence => l_curr_calling_sequence);
10543
10544 g_org_id := AP_APPROVAL_PKG.G_SELECTED_INVOICES(i).org_id;
10545
10546 AP_APPROVAL_PKG.Generate_Distributions
10547 (p_invoice_rec => AP_APPROVAL_PKG.G_SELECTED_INVOICES(i),
10548 p_base_currency_code => AP_APPROVAL_PKG.G_OPTIONS_TABLE(g_org_id).base_currency_code,
10549 p_inv_batch_id => p_inv_batch_id,
10550 p_run_option => p_run_option,
10551 p_calling_sequence => l_curr_calling_sequence,
10552 x_error_code => l_error_code);
10553
10554 END LOOP;
10555
10556 AP_APPROVAL_PKG.G_SELECTED_INVOICES.DELETE;
10557
10558 END LOOP;
10559 CLOSE SELECTED_INVOICES_CURSOR;
10560
10561 ---------------------------------------------------------------------
10562 -- Print_Debug (l_api_name, 'Generate Tax Distributions');
10563 IF g_debug_mode = 'Y' THEN
10564 AP_Debug_Pkg.Print(g_debug_mode, 'Generate Tax Distributions' );
10565 END IF;
10566
10567 IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
10568 FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME||l_api_name,'Generate Tax Distributions');
10569 END IF;
10570 ---------------------------------------------------------------------
10571
10572 SAVEPOINT AP_APPROVAL_PKG_SP_TAX_DIST;
10573
10574 --bug 9738293
10575 --Changed the calling method for Bulk tax distributions . ETAX API will be called till there is no
10576 -- error in ZX error table or they return success.
10577
10578 LOOP
10579 delete from zx_errors_gt; --Flusing GT table
10580 delete from ap_errors_gt; --Flusing the AP GT table --bug10140354
10581
10582 -- Moved logging inside loop
10583 FND_FILE.PUT_LINE(FND_FILE.LOG,'(Bulk DISTRIBUTE) START SYSDATE '||to_char(sysdate,'DD-MON-YYYY HH24:MI:SS')); --Bug16390854
10584
10585 l_success := ap_etax_pkg.calling_etax (
10586 p_invoice_id => NULL,
10587 p_calling_mode => 'DISTRIBUTE',
10588 p_all_error_messages => 'N',
10589 p_error_code => l_error_code,
10590 p_calling_sequence => l_curr_calling_sequence);
10591
10592 FND_FILE.PUT_LINE(FND_FILE.LOG,'(Bulk DISTRIBUTE) END SYSDATE '||to_char(sysdate,'DD-MON-YYYY HH24:MI:SS')); --Bug16390854
10593 -- Moved logging inside loop
10594
10595 OPEN c_tx_err ;
10596 FETCH c_tx_err
10597 BULK COLLECT INTO l_r_tx_err;
10598 CLOSE c_tx_err;
10599 EXIT when (l_r_tx_err.count = 0 OR l_success);
10600
10601 OPEN r_inv_err for l_sql_tax_err ;
10602 FETCH r_inv_err
10603 BULK COLLECT INTO l_r_inv_err;
10604 CLOSE r_inv_err;
10605
10606
10607 ROLLBACK TO SAVEPOINT AP_APPROVAL_PKG_SP_TAX_DIST ;
10608
10609 FORALL i in 1..l_r_inv_err.count
10610 Update ap_invoices_all set validation_request_id = NULL where invoice_id = l_r_inv_err(i);
10611
10612 -- Bug 14579876: Moved FND_LOG.String() call above SAVEPOINT
10613 IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
10614 FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME||l_api_name,' Rows updated ' || sql%rowcount);
10615 END IF ;
10616
10617 SAVEPOINT AP_APPROVAL_PKG_SP_TAX_DIST; --bug10140354 Added Savepoint
10618
10619
10620
10621 l_conc_status := 'WARNING';
10622 FOR i in 1..l_r_tx_err.count
10623 LOOP
10624
10625 fnd_file.put_line (fnd_file.log, l_approval_error
10626 || 'Invoice Validation did not process Invoice Id Due to Tax Error in Distribution :' || l_r_tx_err(i).trx_id
10627 || ', Line Number: ' || l_r_tx_err(i).trx_line_id);
10628 fnd_file.put_line (fnd_file.log, l_r_tx_err(i).message_text);
10629
10630 IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
10631 FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME||l_api_name,' Invoice Validation did not process Invoice Id Due to Tax Error in Distribution:'
10632 || l_r_tx_err(i).trx_id);
10633 END IF;
10634 END LOOP;
10635
10636 END LOOP;
10637 --bug 9738293
10638
10639 IF (NOT l_success) THEN -- Marker 3
10640
10641 ROLLBACK TO SAVEPOINT AP_APPROVAL_PKG_SP_TAX_DIST;
10642
10643 ---------------------------------------------------------------------
10644 -- Print_Debug (l_api_name, 'Set Concurrent Request Warning');
10645 IF g_debug_mode = 'Y' THEN
10646 AP_Debug_Pkg.Print(g_debug_mode, 'Set Concurrent Request Warning' );
10647 END IF;
10648
10649 IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
10650 FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME||l_api_name,'Set Concurrent Request Warning');
10651 END IF;
10652 ---------------------------------------------------------------------
10653
10654 l_conc_status := 'WARNING';
10655
10656 --Bug9436217
10657
10658 l_blk_err_dist := 'Y';
10659
10660 --Bug9436217
10661
10662 --bug 7512258 removed call to FND_CONCURRENT.SET_COMPLETION_STATUS
10663
10664 ---------------------------------------------------------------------
10665 -- Print_Debug (l_api_name, 'Begin Single Mode');
10666 IF g_debug_mode = 'Y' THEN
10667 AP_Debug_Pkg.Print(g_debug_mode, 'Begin Single Mode' );
10668 END IF;
10669
10670 IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
10671 FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME||l_api_name,'Begin Single Mode');
10672 END IF;
10673 ---------------------------------------------------------------------
10674
10675 --Bug9436217
10676
10677 FND_FILE.PUT_LINE(FND_FILE.LOG,'(SERIAL DISTRIBUTE) START SYSDATE '||to_char(sysdate,'DD-MON-YYYY HH24:MI:SS')); --Bug16390854
10678
10679 l_selected_invoices_cursor.DELETE ;
10680 OPEN SELECTED_INVOICES_CURSOR ;
10681 FETCH SELECTED_INVOICES_CURSOR
10682 BULK COLLECT INTO l_selected_invoices_cursor ;
10683
10684 FOR i IN 1..l_selected_invoices_cursor.COUNT LOOP
10685
10686 --Bug9436217
10687
10688 SAVEPOINT AP_APPROVAL_PKG_SP_TAX_DIST;
10689
10690 BEGIN
10691 --Bug9436217
10692 mo_global.set_policy_context('S',l_selected_invoices_cursor(i).org_id);
10693 --Bug9436217
10694
10695
10696 --Bug9436217
10697 ---------------------------------------------------------------------
10698 -- Print_Debug (l_api_name, 'Generate Tax Distributions: '||l_selected_invoices_cursor(i).invoice_id);
10699 IF g_debug_mode = 'Y' THEN
10700 AP_Debug_Pkg.Print(g_debug_mode, 'Generate Tax Distributions: '||l_selected_invoices_cursor(i).invoice_id );
10701 END IF;
10702
10703 IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
10704 FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME||l_api_name,'Generate Tax Distributions: '||l_selected_invoices_cursor(i).invoice_id);
10705 END IF;
10706 ---------------------------------------------------------------------
10707 --Bug9436217
10708 l_success := ap_etax_pkg.calling_etax (
10709 --Bug9436217
10710 p_invoice_id => l_selected_invoices_cursor(i).invoice_id,
10711 --Bug9436217
10712 p_calling_mode => 'DISTRIBUTE',
10713 p_all_error_messages => 'N',
10714 p_error_code => l_error_code,
10715 p_calling_sequence => l_curr_calling_sequence);
10716
10717 IF (NOT l_success) THEN
10718 RAISE Tax_Dist_Exception_Handled;
10719 END IF;
10720 --Bug 7509921
10721 --Bug9436217
10722 IF l_selected_invoices_cursor(i).invoice_type_lookup_code = 'PAYMENT REQUEST' THEN
10723 --Bug9436217
10724 l_calling_mode := 'PAYMENT REQUEST';
10725 ELSE
10726 l_calling_mode := 'APPROVE';
10727 END IF;
10728
10729
10730 --Bug9436217
10731 ---------------------------------------------------------------------
10732 -- Print_Debug(l_api_name, 'Approving specified invoice : '||l_selected_invoices_cursor(i).invoice_num);
10733 IF g_debug_mode = 'Y' THEN
10734 AP_Debug_Pkg.Print(g_debug_mode, 'Approving specified invoice : '||l_selected_invoices_cursor(i).invoice_num );
10735 END IF;
10736
10737 IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
10738 FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME||l_api_name,'Approving specified invoice : '||l_selected_invoices_cursor(i).invoice_num);
10739 END IF;
10740 ---------------------------------------------------------------------
10741 --Bug9436217
10742
10743 --Bug9436217
10744 --IF l_validation_request_id = p_conc_request_id THEN
10745 --Bug9436217
10746
10747 --Bug9436217
10748 IF validate_period(l_selected_invoices_cursor(i).invoice_id) THEN
10749 --Bug9436217
10750
10751 -- Cache Templates
10752 Cache_Tolerance_Templates(
10753 --Bug9436217
10754 l_selected_invoices_cursor(i).tolerance_id,
10755 l_selected_invoices_cursor(i).services_tolerance_id,
10756 --Bug9436217
10757 l_calling_sequence);
10758
10759 -- Bug 11830074 start
10760 l_manual_awt_exist:=0;
10761 SELECT COUNT(*)
10762 INTO l_manual_awt_exist
10763 FROM ap_invoice_lines_all ail
10764 WHERE ail.invoice_id = l_selected_invoices_cursor(i).invoice_id
10765 AND ail.line_type_lookup_code = 'AWT'
10766 AND ail.line_source = 'MANUAL LINE ENTRY';
10767
10768 IF (l_manual_awt_exist > 0) THEN
10769 AP_APPROVAL_PKG.Generate_Manual_Awt_Dist
10770 (p_invoice_rec => l_selected_invoices_cursor(i),
10771 p_base_currency_code => AP_APPROVAL_PKG.G_OPTIONS_TABLE(l_selected_invoices_cursor(i).org_id).base_currency_code,
10772 p_inv_batch_id => p_inv_batch_id,
10773 p_run_option => p_run_option,
10774 p_calling_sequence => l_curr_calling_sequence,
10775 x_error_code => l_error_code,
10776 p_calling_mode => l_calling_mode);
10777 END IF;
10778 -- Bug 11830074 end
10779 --Removed the hardcoded value of p_budget_control, bug6356402
10780 AP_APPROVAL_PKG.APPROVE(
10781 '',
10782 '',
10783 '',
10784 '',
10785 '',
10786 '',
10787 --Bug9436217
10788 l_selected_invoices_cursor(i).invoice_id,
10789 --Bug9436217
10790 '',
10791 '',
10792 '',
10793 'Y',
10794 l_holds_count,
10795 l_approval_status,
10796 l_funds_return_code,
10797 l_calling_mode,
10798 'APXAPRVL',
10799 p_debug_switch
10800 );
10801 ELSE
10802 fnd_message.set_name('SQLAP', 'AP_INV_NEVER_OPEN_PERIOD');
10803 --Bug9436217
10804 fnd_message.set_token('INV_NUM', l_selected_invoices_cursor(i).invoice_num);
10805 --Bug9436217
10806 fnd_file.put_line(fnd_file.log, fnd_message.get);
10807 END IF;
10808 --Bug9436217
10809 --END IF;
10810 --Bug9436217
10811 ---------------------------------------------------------------------
10812 -- Print_Debug(l_api_name, 'End Approving Single Invoice');
10813 IF g_debug_mode = 'Y' THEN
10814 AP_Debug_Pkg.Print(g_debug_mode, 'End Approving Single Invoice' );
10815 END IF;
10816
10817 IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
10818 FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME||l_api_name, 'End Approving Single Invoice');
10819 END IF;
10820 ---------------------------------------------------------------------
10821
10822
10823 EXCEPTION
10824 WHEN TAX_DIST_EXCEPTION_HANDLED THEN
10825
10826 ROLLBACK TO SAVEPOINT AP_APPROVAL_PKG_SP_TAX_DIST;
10827
10828 ap_utilities_pkg.ap_get_message(l_approval_error);
10829
10830 fnd_file.put_line (fnd_file.log, ' ');
10831
10832 --Bug9436217
10833
10834 fnd_file.put_line (fnd_file.log, l_approval_error || 'Invoice Validation did not process Invoice Number: '||
10835 l_selected_invoices_cursor(i).invoice_num);
10836 --Bug9436217
10837
10838 fnd_file.put_line (fnd_file.log, l_error_code); --7392260
10839 fnd_file.put_line (fnd_file.log, ' Error: ' ||sqlerrm);
10840
10841 --Bug9436217
10842
10843 -- Print_Debug (l_api_name, 'Exception: '|| sqlerrm ||' Invoice Validation did not process Invoice Number: '||
10844 -- l_selected_invoices_cursor(i).invoice_num);
10845 IF g_debug_mode = 'Y' THEN
10846 AP_Debug_Pkg.Print(g_debug_mode, 'Exception: '|| sqlerrm ||' Invoice Validation did not process Invoice Number: '||
10847 l_selected_invoices_cursor(i).invoice_num );
10848 END IF;
10849
10850 IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
10851 FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME||l_api_name, 'Exception: '|| sqlerrm ||' Invoice Validation did not process Invoice Number: '||
10852 l_selected_invoices_cursor(i).invoice_num);
10853 END IF;
10854
10855 --Bug9436217
10856
10857 WHEN OTHERS THEN
10858
10859 ROLLBACK TO SAVEPOINT AP_APPROVAL_PKG_SP_TAX_DIST;
10860
10861 ap_utilities_pkg.ap_get_message(l_approval_error);
10862
10863 fnd_file.put_line (fnd_file.log, ' ');
10864
10865 --Bug9436217
10866
10867 fnd_file.put_line (fnd_file.log, l_approval_error || 'Invoice Validation did not process Invoice Number: '||
10868 l_selected_invoices_cursor(i).invoice_num);
10869
10870 --Bug9436217
10871
10872
10873 fnd_file.put_line (fnd_file.log, ' Error: ' ||sqlerrm);
10874
10875 --Bug9436217
10876
10877 -- Print_Debug (l_api_name, 'Exception: '|| sqlerrm ||' Invoice Validation did not process Invoice Number: '||
10878 -- l_selected_invoices_cursor(i).invoice_num);
10879 IF g_debug_mode = 'Y' THEN
10880 AP_Debug_Pkg.Print(g_debug_mode, 'Exception: '|| sqlerrm ||' Invoice Validation did not process Invoice Number: '||
10881 l_selected_invoices_cursor(i).invoice_num );
10882 END IF;
10883
10884 IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
10885 FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME||l_api_name, 'Exception: '|| sqlerrm ||' Invoice Validation did not process Invoice Number: '||
10886 l_selected_invoices_cursor(i).invoice_num);
10887 END IF;
10888
10889 --Bug9436217
10890
10891 END;
10892 END LOOP;
10893
10894 --Bug9436217
10895
10896 UPDATE ap_invoices_all
10897 SET validation_request_id = NULL
10898 WHERE validation_request_id = AP_APPROVAL_PKG.G_VALIDATION_REQUEST_ID;
10899
10900 CLOSE SELECTED_INVOICES_CURSOR ;
10901
10902 --Bug9436217
10903
10904 -- bug 7392260: add start
10905 ELSE -- bulk process succeded.
10906 -- we might still have errors in few invoices, even though
10907 -- ebtax returned success status for bulk process.
10908 -- Eg. control amount not null.
10909 -- We'll print these msgs to the concurrent log.
10910
10911 --bug9738293
10912 FOR i in 1..l_r_tx_err.count
10913 LOOP
10914
10915 fnd_file.put_line (fnd_file.log, l_approval_error
10916 || 'Invoice Validation did not process Invoice Id Due to Expected Tax Error in Distribution :' || l_r_tx_err(i).trx_id
10917 || ', Line Number: ' || l_r_tx_err(i).trx_line_id);
10918 fnd_file.put_line (fnd_file.log, l_r_tx_err(i).message_text);
10919
10920 IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
10921 FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME||l_api_name,' Invoice Validation did not process Invoice Id Due to Expected Tax Error in Distribution:'
10922 || l_r_tx_err(i).trx_id);
10923 END IF;
10924 END LOOP;
10925
10926 --bug9738293
10927
10928 /* DECLARE
10929 CURSOR c_tx_err is
10930 SELECT trx_id, trx_line_id, message_text
10931 FROM zx_errors_gt;
10932 r_tx_err c_tx_err%rowtype;
10933 BEGIN
10934 FOR r_tx_err IN c_tx_err LOOP
10935 fnd_file.put_line (fnd_file.log, l_approval_error
10936 || 'Invoice Validation did not process Invoice Id:' || r_tx_err.trx_id
10937 || ', Line Number: ' || r_tx_err.trx_line_id);
10938 fnd_file.put_line (fnd_file.log, r_tx_err.message_text);
10939 Print_Debug (l_api_name, ' Invoice Validation did not process Invoice Id: '
10940 || r_tx_err.trx_id);
10941 END LOOP;
10942 END; */
10943
10944 -- bug 7392260: add end
10945
10946 END IF; -- Marker 3
10947
10948 ---------------------------------------------------------------------
10949 -- Print_Debug (l_api_name, 'Call Approve per invoice');
10950 IF g_debug_mode = 'Y' THEN
10951 AP_Debug_Pkg.Print(g_debug_mode, 'Call Approve per invoice' );
10952 END IF;
10953
10954 IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
10955 FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME||l_api_name,'Call Approve per invoice');
10956 END IF;
10957 ---------------------------------------------------------------------
10958
10959 --Bug9436217
10960 IF l_blk_err_dist = 'N' THEN --Marker 4
10961 AP_APPROVAL_PKG.G_SELECTED_INVOICES.DELETE;
10962 --Bug9436217
10963 OPEN SELECTED_INVOICES_CURSOR;
10964 LOOP
10965 FETCH SELECTED_INVOICES_CURSOR
10966 BULK COLLECT INTO AP_APPROVAL_PKG.G_SELECTED_INVOICES
10967 LIMIT l_commit_size;
10968
10969 EXIT WHEN SELECTED_INVOICES_CURSOR%NOTFOUND
10970 and AP_APPROVAL_PKG.G_SELECTED_INVOICES.COUNT <= 0;
10971
10972 FOR i IN 1..AP_APPROVAL_PKG.G_SELECTED_INVOICES.COUNT LOOP
10973
10974 -- Set Policy
10975 IF AP_APPROVAL_PKG.G_SELECTED_INVOICES(i).org_id <> nvl(l_old_org_id, -3115) THEN
10976
10977 mo_global.set_policy_context('S', AP_APPROVAL_PKG.G_SELECTED_INVOICES(i).org_id);
10978
10979 l_old_org_id := AP_APPROVAL_PKG.G_SELECTED_INVOICES(i).org_id;
10980
10981 END IF;
10982
10983 -- Set Calling Mode
10984 IF AP_APPROVAL_PKG.G_SELECTED_INVOICES(i).invoice_type_lookup_code = 'PAYMENT REQUEST' THEN
10985 l_calling_mode := 'PAYMENT REQUEST';
10986 ELSE
10987 l_calling_mode := 'APPROVE';
10988
10989 -- Cache Templates
10990 Cache_Tolerance_Templates(
10991 AP_APPROVAL_PKG.G_SELECTED_INVOICES(i).tolerance_id,
10992 AP_APPROVAL_PKG.G_SELECTED_INVOICES(i).services_tolerance_id,
10993 l_calling_sequence);
10994 END IF;
10995
10996 -- Call Approve
10997 IF validate_period(
10998 AP_APPROVAL_PKG.G_SELECTED_INVOICES(i).invoice_id) THEN
10999 -- Bug 11830074 start
11000 l_manual_awt_exist:=0;
11001 SELECT COUNT(*)
11002 INTO l_manual_awt_exist
11003 FROM ap_invoice_lines_all ail
11004 WHERE ail.invoice_id = AP_APPROVAL_PKG.G_SELECTED_INVOICES(i).invoice_id
11005 AND ail.line_type_lookup_code = 'AWT'
11006 AND ail.line_source = 'MANUAL LINE ENTRY';
11007
11008 IF (l_manual_awt_exist > 0) THEN
11009 AP_APPROVAL_PKG.Generate_Manual_Awt_Dist
11010 (p_invoice_rec => AP_APPROVAL_PKG.G_SELECTED_INVOICES(i),
11011 p_base_currency_code => AP_APPROVAL_PKG.G_OPTIONS_TABLE(AP_APPROVAL_PKG.G_SELECTED_INVOICES(i).org_id).base_currency_code,
11012 p_inv_batch_id => p_inv_batch_id,
11013 p_run_option => p_run_option,
11014 p_calling_sequence => l_curr_calling_sequence,
11015 x_error_code => l_error_code,
11016 p_calling_mode => l_calling_mode);
11017 END IF;
11018 -- Bug 11830074 end
11019
11020 --Removed the hardcoded value of p_budget_control, bug6356402
11021 AP_APPROVAL_PKG.approve(
11022 '',
11023 '',
11024 '',
11025 '',
11026 '',
11027 '',
11028 AP_APPROVAL_PKG.G_SELECTED_INVOICES(i).invoice_id,
11029 '',
11030 '',
11031 '',
11032 'Y',
11033 l_holds_count,
11034 l_approval_status,
11035 l_funds_return_code,
11036 l_calling_mode,
11037 'APXAPRVL',
11038 p_debug_switch
11039 );
11040
11041 ELSE
11042 fnd_message.set_name('SQLAP', 'AP_INV_NEVER_OPEN_PERIOD');
11043 fnd_message.set_token('INV_NUM', AP_APPROVAL_PKG.G_SELECTED_INVOICES(i).invoice_num);
11044 fnd_file.put_line(fnd_file.log, fnd_message.get);
11045 END IF;
11046
11047 END LOOP;
11048
11049 --Bug9436217
11050 -- table alias added for bug 13706647
11051 FORALL blk_upd IN 1..l_selected_invoice_ids.COUNT
11052 UPDATE /*+ index(a AP_INVOICES_U1) */ ap_invoices_all a --hint added for bug 13429649
11053 SET validation_request_id = NULL
11054 WHERE invoice_id = l_selected_invoice_ids( blk_upd )
11055 AND validation_request_id IS NOT NULL;
11056
11057 --Bug9436217
11058
11059 AP_APPROVAL_PKG.G_SELECTED_INVOICES.DELETE;
11060
11061 END LOOP;
11062
11063 CLOSE SELECTED_INVOICES_CURSOR;
11064
11065 --Bug9436217
11066 END IF ; --Marker 4
11067 --Bug9436217
11068 END IF; -- Marker 2
11069
11070 END IF; -- Marker 0
11071
11072 ---------------------------------------------------------------------
11073 -- Print_Debug (l_api_name, 'Populate ap_temp_approval_temp_gt');
11074 IF g_debug_mode = 'Y' THEN
11075 AP_Debug_Pkg.Print(g_debug_mode, 'Populate ap_temp_approval_temp_gt' );
11076 END IF;
11077
11078 IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
11079 FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME||l_api_name,'Populate ap_temp_approval_temp_gt');
11080 END IF;
11081 ---------------------------------------------------------------------
11082
11083 DELETE FROM ap_temp_approval_gt;
11084
11085 FORALL i in g_org_holds.first..g_org_holds.last
11086 INSERT INTO ap_temp_approval_gt VALUES g_org_holds(i);
11087
11088 COMMIT;
11089
11090 ---------------------------------------------------------------------
11091 -- Print_Debug (l_api_name, 'Get the count of rows that will be printed');
11092 IF g_debug_mode = 'Y' THEN
11093 AP_Debug_Pkg.Print(g_debug_mode, 'Get the count of rows that will be printed' );
11094 END IF;
11095
11096 IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
11097 FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME||l_api_name,'Get the count of rows that will be printed');
11098 END IF;
11099 ---------------------------------------------------------------------
11100
11101 SELECT count(*) into p_report_holds_count
11102 FROM ap_temp_approval_gt
11103 WHERE number_holds_placed <> 0
11104 OR number_holds_released <> 0;
11105
11106 -- 7512258
11107 -- moved the call to end of the approval process
11108 ---------------------------------------------------------------------
11109 -- Print_Debug (l_api_name, 'Set Concurrent Request Warning');
11110 IF g_debug_mode = 'Y' THEN
11111 AP_Debug_Pkg.Print(g_debug_mode, 'Set Concurrent Request Warning' );
11112 END IF;
11113
11114 IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
11115 FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME||l_api_name,'Set Concurrent Request Warning');
11116 END IF;
11117 ---------------------------------------------------------------------
11118 IF l_conc_status = 'WARNING' THEN
11119 l_errbuf := 'Warning/Error message to be displayed';
11120 l_set_status := FND_CONCURRENT.SET_COMPLETION_STATUS(l_conc_status,l_errbuf);
11121 END IF;
11122
11123
11124 ---------------------------------------------------------------------
11125 -- Print_Debug(l_api_name, 'AP_APPROVAL_PKG.BATCH_APPROVAL.END');
11126 IF g_debug_mode = 'Y' THEN
11127 AP_Debug_Pkg.Print(g_debug_mode, 'AP_APPROVAL_PKG.BATCH_APPROVAL.END' );
11128 END IF;
11129
11130 IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
11131 FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME||l_api_name,'AP_APPROVAL_PKG.BATCH_APPROVAL.END');
11132 END IF;
11133 ---------------------------------------------------------------------
11134
11135 RETURN(TRUE);
11136
11137 EXCEPTION
11138
11139 WHEN TAX_EXCEPTION THEN
11140 AP_UTILITIES_PKG.AP_GET_MESSAGE(l_approval_error);
11141 fnd_file.put_line(fnd_file.log,l_approval_error);
11142 fnd_file.put_line(fnd_file.log,sqlerrm);
11143 -- Print_Debug(l_api_name, 'Exception: '||sqlerrm);
11144 IF g_debug_mode = 'Y' THEN
11145 AP_Debug_Pkg.Print(g_debug_mode, 'Exception: '||sqlerrm );
11146 END IF;
11147
11148 IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
11149 FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME||l_api_name,'Exception: '||sqlerrm);
11150 END IF;
11151
11152 --Bug7246971
11153
11154 FND_MESSAGE.SET_NAME('SQLAP','AP_TAX_EXCEPTION');
11155 IF l_error_code IS NOT NULL THEN
11156 FND_MESSAGE.SET_TOKEN('ERROR', l_error_code);
11157 ELSE
11158 FND_MESSAGE.SET_TOKEN('ERROR', SQLERRM);
11159 END IF;
11160 FND_MESSAGE.SET_TOKEN('CALLING_SEQUENCE', l_curr_calling_sequence);
11161 FND_MESSAGE.SET_TOKEN('PARAMETERS',
11162 'Run Option = '|| p_run_option
11163 ||', Batch Id = '|| to_char(p_inv_batch_id)
11164 ||', Begin Date = '|| to_char(p_inv_start_date)
11165 ||', End Date = '|| to_char(p_inv_end_date)
11166 ||', Vendor Id = '|| to_char(p_vendor_id)
11167 ||', Pay Group = '|| p_pay_group
11168 ||', Invoice Id = '|| to_char(p_invoice_id)
11169 ||', Entered By = '|| to_char(p_entered_by)
11170 ||', Concurrent Request Id = '|| to_char(p_conc_request_id)
11171 ||', Org Id = '|| to_char(p_org_id));
11172 APP_EXCEPTION.RAISE_EXCEPTION;
11173
11174 --Bug7246971
11175
11176 RETURN (FALSE);
11177
11178 WHEN OTHERS THEN
11179 AP_UTILITIES_PKG.AP_GET_MESSAGE(l_approval_error);
11180 fnd_file.put_line(fnd_file.log,l_approval_error);
11181 fnd_file.put_line(fnd_file.log,sqlerrm);
11182 -- Print_Debug(l_api_name, 'Others: Exception: '||sqlerrm);
11183 IF g_debug_mode = 'Y' THEN
11184 AP_Debug_Pkg.Print(g_debug_mode, 'Others: Exception: '||sqlerrm );
11185 END IF;
11186
11187 IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
11188 FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME||l_api_name,'Others: Exception: '||sqlerrm);
11189 END IF;
11190
11191 --Bug7246971
11192
11193 IF (SQLCODE <> -20001) THEN
11194 FND_MESSAGE.SET_NAME('SQLAP','AP_DEBUG');
11195 FND_MESSAGE.SET_TOKEN('ERROR',SQLERRM);
11196 FND_MESSAGE.SET_TOKEN('CALLING_SEQUENCE', l_curr_calling_sequence);
11197 FND_MESSAGE.SET_TOKEN('PARAMETERS',
11198 'Run Option = '|| p_run_option
11199 ||', Batch Id = '|| to_char(p_inv_batch_id)
11200 ||', Begin Date = '|| to_char(p_inv_start_date)
11201 ||', End Date = '|| to_char(p_inv_end_date)
11202 ||', Vendor Id = '|| to_char(p_vendor_id)
11203 ||', Pay Group = '|| p_pay_group
11204 ||', Invoice Id = '|| to_char(p_invoice_id)
11205 ||', Entered By = '|| to_char(p_entered_by)
11206 ||', Concurrent Request Id = '|| to_char(p_conc_request_id)
11207 ||', Org Id = '|| to_char(p_org_id));
11208
11209 END IF;
11210 APP_EXCEPTION.RAISE_EXCEPTION;
11211
11212 --Bug7246971
11213
11214 RETURN (FALSE);
11215
11216 END BATCH_APPROVAL;
11217
11218 PROCEDURE Cache_Options
11219 (p_calling_sequence IN VARCHAR2) IS
11220
11221 CURSOR C_Options_Query IS
11222 SELECT nvl(gls.chart_of_accounts_id, -1) chart_of_accounts_id,
11223 nvl(sp.set_of_books_id, -1) set_of_books_id,
11224 nvl(sp.automatic_offsets_flag, 'N') automatic_offsets_flag,
11225 nvl(recalc_pay_schedule_flag, 'N') recalc_pay_schedule_flag,
11226 sp.liability_post_lookup_code liability_post_lookup_code,
11227 nvl(sp.rate_var_gain_ccid, -1) rate_var_gain_ccid,
11228 nvl(sp.rate_var_loss_ccid, -1) rate_var_loss_ccid,
11229 nvl(sp.base_currency_code, 'USD') base_currency_code,
11230 nvl(sp.match_on_tax_flag, 'N') match_on_tax_flag,
11231 nvl(sp.enforce_tax_from_account, 'N') enforce_tax_from_account,
11232 nvl(fp.inv_encumbrance_type_id, -1) inv_encumbrance_type_id,
11233 nvl(fp.purch_encumbrance_type_id, -1) purch_encumbrance_type_id,
11234 nvl(fp.receipt_acceptance_days, 0) receipt_acceptance_days,
11235 nvl(gl_date_from_receipt_flag, 'S') gl_date_from_receipt_flag,
11236 accounting_method_option,
11237 secondary_accounting_method,
11238 nvl(fp.cash_basis_enc_nr_tax, 'EXCLUDE RECOVERABLE TAX') cash_basis_enc_nr_tax,
11239 nvl(fp.non_recoverable_tax_flag, 'N') non_recoverable_tax_flag,
11240 nvl(disc_is_inv_less_tax_flag,'N') disc_is_inv_less_tax_flag,
11241 fp.org_id org_id,
11242 5 System_User,
11243 fnd_global.user_id User_Id
11244 FROM ap_system_parameters_all sp,
11245 financials_system_params_all fp,
11246 gl_sets_of_books gls,
11247 Mo_Glob_Org_Access_Tmp mo
11248 WHERE sp.set_of_books_id = gls.set_of_books_id
11249 AND sp.org_id = fp.org_id
11250 AND mo.organization_id = fp.org_id;
11251
11252 l_options_rec C_Options_Query%rowtype;
11253
11254 l_debug_loc VARCHAR2(30) := 'Cache_Options';
11255 l_curr_calling_sequence VARCHAR2(2000);
11256 l_debug_info VARCHAR2(1000);
11257 BEGIN
11258
11259 l_curr_calling_sequence := 'AP_APPROVAL_PKG.'||l_debug_loc||'<-'||p_calling_sequence;
11260
11261 ------------------------------------------------------------
11262 l_debug_info := 'Retrieving system parameters for approval';
11263 -- Print_Debug(l_debug_loc,l_debug_info);
11264 IF g_debug_mode = 'Y' THEN
11265 AP_Debug_Pkg.Print(g_debug_mode, l_debug_info );
11266 END IF;
11267
11268 IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
11269 FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME||l_debug_loc,l_debug_info);
11270 END IF;
11271 ------------------------------------------------------------
11272
11273 OPEN C_Options_Query;
11274 LOOP
11275 FETCH C_Options_Query INTO l_options_rec;
11276 EXIT WHEN C_Options_Query%NOTFOUND;
11277
11278 AP_APPROVAL_PKG.G_OPTIONS_TABLE(l_options_rec.org_id).chart_of_accounts_id
11279 := l_options_rec.chart_of_accounts_id;
11280 AP_APPROVAL_PKG.G_OPTIONS_TABLE(l_options_rec.org_id).set_of_books_id
11281 := l_options_rec.set_of_books_id;
11282 AP_APPROVAL_PKG.G_OPTIONS_TABLE(l_options_rec.org_id).automatic_offsets_flag
11283 := l_options_rec.automatic_offsets_flag;
11284 AP_APPROVAL_PKG.G_OPTIONS_TABLE(l_options_rec.org_id).recalc_pay_schedule_flag
11285 := l_options_rec.recalc_pay_schedule_flag;
11286 AP_APPROVAL_PKG.G_OPTIONS_TABLE(l_options_rec.org_id).liability_post_lookup_code
11287 := l_options_rec.liability_post_lookup_code;
11288 AP_APPROVAL_PKG.G_OPTIONS_TABLE(l_options_rec.org_id).rate_var_gain_ccid
11289 := l_options_rec.rate_var_gain_ccid;
11290 AP_APPROVAL_PKG.G_OPTIONS_TABLE(l_options_rec.org_id).rate_var_loss_ccid
11291 := l_options_rec.rate_var_loss_ccid;
11292 AP_APPROVAL_PKG.G_OPTIONS_TABLE(l_options_rec.org_id).base_currency_code
11293 := l_options_rec.base_currency_code;
11294 AP_APPROVAL_PKG.G_OPTIONS_TABLE(l_options_rec.org_id).match_on_tax_flag
11295 := l_options_rec.match_on_tax_flag;
11296 AP_APPROVAL_PKG.G_OPTIONS_TABLE(l_options_rec.org_id).enforce_tax_from_account
11297 := l_options_rec.enforce_tax_from_account;
11298 AP_APPROVAL_PKG.G_OPTIONS_TABLE(l_options_rec.org_id).inv_encumbrance_type_id
11299 := l_options_rec.inv_encumbrance_type_id;
11300 AP_APPROVAL_PKG.G_OPTIONS_TABLE(l_options_rec.org_id).purch_encumbrance_type_id
11301 := l_options_rec.purch_encumbrance_type_id;
11302 AP_APPROVAL_PKG.G_OPTIONS_TABLE(l_options_rec.org_id).receipt_acceptance_days
11303 := l_options_rec.receipt_acceptance_days;
11304 AP_APPROVAL_PKG.G_OPTIONS_TABLE(l_options_rec.org_id).gl_date_from_receipt_flag
11305 := l_options_rec.gl_date_from_receipt_flag;
11306 AP_APPROVAL_PKG.G_OPTIONS_TABLE(l_options_rec.org_id).accounting_method_option
11307 := l_options_rec.accounting_method_option;
11308 AP_APPROVAL_PKG.G_OPTIONS_TABLE(l_options_rec.org_id).secondary_accounting_method
11309 := l_options_rec.secondary_accounting_method;
11310 AP_APPROVAL_PKG.G_OPTIONS_TABLE(l_options_rec.org_id).cash_basis_enc_nr_tax
11311 := l_options_rec.cash_basis_enc_nr_tax;
11312 AP_APPROVAL_PKG.G_OPTIONS_TABLE(l_options_rec.org_id).non_recoverable_tax_flag
11313 := l_options_rec.non_recoverable_tax_flag;
11314 AP_APPROVAL_PKG.G_OPTIONS_TABLE(l_options_rec.org_id).disc_is_inv_less_tax_flag
11315 := l_options_rec.disc_is_inv_less_tax_flag;
11316 AP_APPROVAL_PKG.G_OPTIONS_TABLE(l_options_rec.org_id).org_id
11317 := l_options_rec.org_id;
11318 AP_APPROVAL_PKG.G_OPTIONS_TABLE(l_options_rec.org_id).System_User
11319 := l_options_rec.System_User;
11320 AP_APPROVAL_PKG.G_OPTIONS_TABLE(l_options_rec.org_id).user_id
11321 := l_options_rec.user_id;
11322
11323 END LOOP;
11324 CLOSE C_Options_Query;
11325
11326 EXCEPTION
11327 WHEN OTHERS THEN
11328 IF (SQLCODE <> -20001) THEN
11329 FND_MESSAGE.SET_NAME('SQLAP','AP_DEBUG');
11330 FND_MESSAGE.SET_TOKEN('ERROR',SQLERRM);
11331 FND_MESSAGE.SET_TOKEN('CALLING_SEQUENCE', l_curr_calling_sequence);
11332 FND_MESSAGE.SET_TOKEN('DEBUG_INFO',l_debug_info);
11333 END IF;
11334
11335 IF C_Options_Query%ISOPEN THEN
11336 CLOSE C_Options_Query;
11337 END IF;
11338
11339 APP_EXCEPTION.RAISE_EXCEPTION;
11340
11341 END Cache_Options;
11342
11343
11344 PROCEDURE Cache_Tolerance_Templates
11345 ( p_tolerance_id IN NUMBER,
11346 p_services_tolerance_id IN NUMBER,
11347 p_calling_sequence IN VARCHAR2) IS
11348 l_debug_loc VARCHAR2(30) := 'Cache_Tolerance_Templates';
11349 l_curr_calling_sequence VARCHAR2(2000);
11350 l_debug_info VARCHAR2(1000);
11351 BEGIN
11352
11353 l_curr_calling_sequence := 'AP_APPROVAL_PKG.'||l_debug_loc||'<-'||p_calling_sequence;
11354
11355 ------------------------------------------------------------
11356 l_debug_info := 'Retrieving Supplier Site Tolerances';
11357 -- Print_Debug(l_debug_loc,l_debug_info);
11358 IF g_debug_mode = 'Y' THEN
11359 AP_Debug_Pkg.Print(g_debug_mode, l_debug_info );
11360 END IF;
11361
11362 IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
11363 FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME||l_debug_loc,l_debug_info);
11364 END IF;
11365 ------------------------------------------------------------
11366
11367 IF p_tolerance_id IS NOT NULL THEN
11368
11369 IF NOT G_GOODS_TOLERANCES.exists(p_tolerance_id) THEN
11370
11371 SELECT decode( price_tolerance, NULL, NULL,
11372 (1 + (price_tolerance/100))),
11373 decode(quantity_tolerance, NULL, NULL,
11374 (1 + (quantity_tolerance/100))),
11375 decode( qty_received_tolerance, NULL, NULL,
11376 (1 + (qty_received_tolerance/100))),
11377 max_qty_ord_tolerance,
11378 max_qty_rec_tolerance,
11379 ship_amt_tolerance,
11380 rate_amt_tolerance,
11381 total_amt_tolerance
11382 INTO G_GOODS_TOLERANCES(p_tolerance_id).price_tolerance,
11383 G_GOODS_TOLERANCES(p_tolerance_id).quantity_tolerance,
11384 G_GOODS_TOLERANCES(p_tolerance_id).qty_received_tolerance,
11385 G_GOODS_TOLERANCES(p_tolerance_id).max_qty_ord_tolerance,
11386 G_GOODS_TOLERANCES(p_tolerance_id).max_qty_rec_tolerance,
11387 G_GOODS_TOLERANCES(p_tolerance_id).ship_amt_tolerance,
11388 G_GOODS_TOLERANCES(p_tolerance_id).rate_amt_tolerance,
11389 G_GOODS_TOLERANCES(p_tolerance_id).total_amt_tolerance
11390 FROM ap_tolerance_templates
11391 WHERE tolerance_id = p_tolerance_id;
11392
11393 END IF;
11394 END IF;
11395
11396 IF p_services_tolerance_id IS NOT NULL THEN
11397 IF NOT G_SERVICES_TOLERANCES.exists(p_services_tolerance_id) THEN
11398 SELECT decode(quantity_tolerance, NULL, NULL,
11399 (1 + (quantity_tolerance/100))),
11400 decode( qty_received_tolerance, NULL, NULL,
11401 (1 + (qty_received_tolerance/100))),
11402 max_qty_ord_tolerance,
11403 max_qty_rec_tolerance,
11404 ship_amt_tolerance,
11405 rate_amt_tolerance,
11406 total_amt_tolerance
11407 INTO G_SERVICES_TOLERANCES(p_services_tolerance_id).amount_tolerance,
11408 G_SERVICES_TOLERANCES(p_services_tolerance_id).amt_received_tolerance,
11409 G_SERVICES_TOLERANCES(p_services_tolerance_id).max_amt_ord_tolerance,
11410 G_SERVICES_TOLERANCES(p_services_tolerance_id).max_amt_rec_tolerance,
11411 G_SERVICES_TOLERANCES(p_services_tolerance_id).ser_ship_amt_tolerance,
11412 G_SERVICES_TOLERANCES(p_services_tolerance_id).ser_rate_amt_tolerance,
11413 G_SERVICES_TOLERANCES(p_services_tolerance_id).ser_total_amt_tolerance
11414 FROM ap_tolerance_templates
11415 WHERE tolerance_id = p_services_tolerance_id;
11416 END IF;
11417 END IF;
11418
11419 EXCEPTION
11420 WHEN OTHERS THEN
11421 IF (SQLCODE <> -20001) THEN
11422 FND_MESSAGE.SET_NAME('SQLAP','AP_DEBUG');
11423 FND_MESSAGE.SET_TOKEN('ERROR',SQLERRM);
11424 FND_MESSAGE.SET_TOKEN('CALLING_SEQUENCE', l_curr_calling_sequence);
11425 FND_MESSAGE.SET_TOKEN('DEBUG_INFO',l_debug_info);
11426 END IF;
11427 APP_EXCEPTION.RAISE_EXCEPTION;
11428 END Cache_Tolerance_Templates;
11429
11430 PROCEDURE Generate_Distributions
11431 (p_invoice_rec IN AP_APPROVAL_PKG.Invoice_Rec,
11432 p_base_currency_code IN VARCHAR2,
11433 p_inv_batch_id IN NUMBER,
11434 p_run_option IN VARCHAR2,
11435 p_calling_sequence IN VARCHAR2,
11436 x_error_code IN VARCHAR2,
11437 p_calling_mode IN VARCHAR2 ) IS /*bug 6833543 - added p_calling_mode*/
11438
11439 t_inv_lines_table AP_INVOICES_PKG.t_invoice_lines_table;
11440
11441 l_curr_calling_sequence VARCHAR2(2000);
11442 l_debug_info VARCHAR2(2000);
11443 l_debug_loc VARCHAR2(30) := 'Generate_Distributions';
11444
11445 l_prorate_across_all_items VARCHAR2(1);
11446 l_error_code VARCHAR2(4000);
11447 l_debug_context VARCHAR2(2000);
11448 l_success BOOLEAN;
11449
11450 l_system_user NUMBER := 5;
11451
11452 l_holds HOLDSARRAY;
11453 l_hold_count COUNTARRAY;
11454 l_release_count COUNTARRAY;
11455 l_insufficient_data_exist BOOLEAN := FALSE;
11456
11457 l_recouped_amount NUMBER;
11458 l_retained_amount NUMBER;
11459 l_result BOOLEAN;
11460
11461 l_line_variance_hold_exist BOOLEAN := FALSE;
11462 l_need_to_round_flag VARCHAR2(1) := 'Y';
11463
11464 l_not_exist_nond_line VARCHAR2(1); --bug6783517
11465 l_disc_chrge_line NUMBER := 0; --bug8820542
11466
11467 l_allocation_rule_type ap_allocation_rules.rule_type%TYPE; --10052153
11468 l_allocation_status ap_allocation_rules.status%TYPE; --10052153
11469
11470 -- bug6783517 starts
11471 CURSOR dist_gen_holds(p_invoice_id NUMBER)
11472 IS
11473 SELECT hold_lookup_code
11474 FROM ap_holds_all
11475 WHERE hold_lookup_code IN ('DISTRIBUTION SET INACTIVE',
11476 'SKELETON DISTRIBUTION SET',
11477 'CANNOT OVERLAY ACCOUNT',
11478 'INVALID DEFAULT ACCOUNT',
11479 'CANNOT EXECUTE ALLOCATION',
11480 'CANNOT OVERLAY ACCOUNT',
11481 'INVALID DEFAULT ACCOUNT',
11482 'PERIOD CLOSED',
11483 'PROJECT GL DATE CLOSED')
11484 AND release_lookup_code IS NULL
11485 AND invoice_id = p_invoice_id;
11486
11487 TYPE holds_tab_type IS
11488 TABLE OF AP_HOLDS_ALL.HOLD_LOOKUP_CODE%TYPE
11489 INDEX BY BINARY_INTEGER;
11490
11491 t_holds_tab holds_tab_type;
11492 -- bug6783517 ends
11493
11494 BEGIN
11495
11496 l_curr_calling_sequence := 'AP_APPROVAL_PKG.'||l_debug_loc||'<-'||p_calling_sequence;
11497
11498 ----------------------------------------------------------------
11499 l_debug_info := 'Check Line Variance at invoice header level';
11500 -- Print_Debug(l_debug_loc, l_debug_info);
11501 IF g_debug_mode = 'Y' THEN
11502 AP_Debug_Pkg.Print(g_debug_mode, l_debug_info );
11503 END IF;
11504
11505 IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
11506 FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME||l_debug_loc,l_debug_info);
11507 END IF;
11508
11509 ----------------------------------------------------------------
11510
11511 Check_Line_Variance(
11512 p_invoice_rec.invoice_id,
11513 l_system_user,
11514 l_holds,
11515 l_hold_count,
11516 l_release_count,
11517 l_line_variance_hold_exist,
11518 l_curr_calling_sequence,
11519 p_base_currency_code); --bug 7271262
11520
11521 IF ( p_invoice_rec.invoice_currency_code <> p_base_currency_code ) THEN
11522
11523 ----------------------------------------------------------------
11524 l_debug_info := 'Calculate Base Amount. Round if no line variance';
11525 -- Print_Debug(l_debug_loc, l_debug_info);
11526 IF g_debug_mode = 'Y' THEN
11527 AP_Debug_Pkg.Print(g_debug_mode, l_debug_info );
11528 END IF;
11529
11530 IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
11531 FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME||l_debug_loc,l_debug_info);
11532 END IF;
11533
11534 ----------------------------------------------------------------
11535
11536 IF ( l_line_variance_hold_exist ) THEN
11537 l_need_to_round_flag := 'N';
11538 END IF;
11539
11540 Line_Base_Amount_Calculation(
11541 p_invoice_id => p_invoice_rec.invoice_id,
11542 p_invoice_currency_code => p_invoice_rec.invoice_currency_code,
11543 p_base_currency_code => p_base_currency_code,
11544 p_exchange_rate => p_invoice_rec.exchange_rate,
11545 p_need_to_round_flag => l_need_to_round_flag,
11546 p_calling_sequence => l_curr_calling_sequence);
11547
11548 END IF;
11549
11550 ----------------------------------------------------------------
11551 l_debug_info := 'Bulk Collect Invoice Lines';
11552 -- Print_Debug(l_debug_loc, l_debug_info);
11553 IF g_debug_mode = 'Y' THEN
11554 AP_Debug_Pkg.Print(g_debug_mode, l_debug_info );
11555 END IF;
11556
11557 IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
11558 FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME||l_debug_loc,l_debug_info);
11559 END IF;
11560 ----------------------------------------------------------------
11561
11562 OPEN Invoice_Line_Cur (p_invoice_rec.invoice_id);
11563 FETCH Invoice_Line_Cur BULK COLLECT
11564 INTO t_inv_lines_table;
11565 CLOSE Invoice_Line_Cur;
11566
11567 /* There are some holds which are put on the invoice when */
11568 /* the distributions are generated for the Invoice */
11569 /* But even after the fix in the bug6731107, if a distribution */
11570 /* is inserted for the Invoice, then the generate_dist flag */
11571 /* for the line is set to 'D', and hence the code */
11572 /* Execute_Dist_Generation_Check would no longer be called */
11573 /*
11574 /* As such, when there are no lines on the invoice */
11575 /* for which the generate_dist flag is NOT 'D' then we would */
11576 /* release all the holds on the Invoice which are put during */
11577 /* the dist generation process : bug6783517 */
11578
11579
11580 l_debug_info := 'Checking if there exists a non d line';
11581
11582 BEGIN
11583
11584 SELECT 'Y'
11585 INTO l_not_exist_nond_line
11586 FROM ap_invoice_lines_all ail
11587 WHERE ail.invoice_id = p_invoice_rec.invoice_id
11588 AND nvl(ail.generate_dists, 'N') <> 'D'
11589 AND rownum < 2;
11590
11591 EXCEPTION
11592 WHEN NO_DATA_FOUND THEN
11593 l_not_exist_nond_line := 'N';
11594
11595 END;
11596
11597 /*bug 6833543: While cancelling an invoice that has a non D line
11598 and postable hold which is not user releasable like CANNOT EXECUTE
11599 ALLOCATION, the code failed to release the holds
11600 and the invoice gets stuck in a semi-cancelled state.Fix of
11601 6783517 has to take care of releasing holds in such scenario i.e
11602 when p_calling_mode is CANCEL*/
11603
11604 --Bug8820542 / 10295316
11605 BEGIN
11606 SELECT COUNT(1)
11607 INTO l_disc_chrge_line
11608 FROM ap_holds_all aha
11609 WHERE aha.invoice_id = p_invoice_rec.invoice_id
11610 AND aha.hold_lookup_code = 'CANNOT EXECUTE ALLOCATION'
11611 AND aha.release_lookup_code IS NULL
11612 AND NOT EXISTS ( SELECT 1
11613 FROM ap_invoice_lines_all ail, ap_allocation_rules ALR
11614 WHERE ail.invoice_id = p_invoice_rec.invoice_id
11615 AND ail.line_type_lookup_code in ('FREIGHT','MISCELLANEOUS')
11616 AND nvl(ail.discarded_flag,'N') ='N'
11617 AND ALR.invoice_id = AIL.invoice_id
11618 AND ALR.chrg_invoice_line_number = AIL.line_number
11619 AND ALR.status = 'PENDING')
11620 AND ROWNUM = 1;
11621 END;
11622
11623 --Bug8820542 / 10295316
11624
11625 l_debug_info := 'If there is no non d line or p_calling_mode is CANCEL, then fetch all the dist gen holds';
11626
11627 IF (l_not_exist_nond_line = 'N' OR p_calling_mode = 'CANCEL' OR l_disc_chrge_line > 0) THEN --Bug8820542
11628 OPEN dist_gen_holds (p_invoice_rec.invoice_id);
11629 FETCH dist_gen_holds BULK COLLECT INTO t_holds_tab;
11630 CLOSE dist_gen_holds;
11631 END IF;
11632
11633 l_debug_info := 'Release all the non D holds';
11634
11635 IF nvl(t_holds_tab.count, 0) > 0 THEN
11636
11637 FOR i IN NVL(t_holds_tab.first,0)..NVL(t_holds_tab.last,0)
11638 LOOP
11639
11640 l_debug_info := 'Inside the loop';
11641
11642 Process_Inv_Hold_Status(
11643 p_invoice_rec.invoice_id,
11644 null,
11645 null,
11646 t_holds_tab(i),
11647 'N',
11648 null,
11649 l_system_user,
11650 l_holds,
11651 l_hold_count,
11652 l_release_count,
11653 l_curr_calling_sequence);
11654
11655 END LOOP;
11656
11657 END IF;
11658 /* bug 6783517 ends */
11659
11660 -- Perf 6759699
11661 -- If the p_run_option is not new then the below function will be
11662 -- called once for a invoice id.
11663
11664 IF ( nvl(t_inv_lines_table.count,0) <> 0 AND
11665 (nvl(p_run_option,'Yes') <> 'New' ))THEN
11666
11667 Update_Inv_Dists_To_Selected( p_invoice_rec.invoice_id,
11668 null ,
11669 p_run_option,
11670 l_curr_calling_sequence);
11671 End IF; -- 6759699
11672
11673 FOR i IN NVL(t_inv_lines_table.first,0)..NVL(t_inv_lines_table.last,0)
11674 LOOP
11675 IF (t_inv_lines_table.exists(i)) THEN
11676
11677 IF t_inv_lines_table(i).line_type_lookup_code in ('FREIGHT', 'MISCELLANEOUS') THEN
11678
11679 ----------------------------------------------------------------
11680 l_debug_info := 'Create charge allocations ';
11681 -- Print_Debug(l_debug_loc, l_debug_info);
11682 IF g_debug_mode = 'Y' THEN
11683 AP_Debug_Pkg.Print(g_debug_mode, l_debug_info );
11684 END IF;
11685
11686 IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
11687 FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME||l_debug_loc,l_debug_info);
11688 END IF;
11689 ----------------------------------------------------------------
11690
11691 SELECT nvl(prorate_across_all_items,'N')
11692 INTO l_prorate_across_all_items
11693 FROM ap_invoice_lines_all
11694 WHERE invoice_id = t_inv_lines_table(i).invoice_id
11695 AND line_number = t_inv_lines_table(i).line_number;
11696
11697 --Bug10052153: Added below code to check if PRORATION rule is defined.
11698 --API Create_Proration_Rule is called if prorate_across_all_items flag
11699 -- is Y or Fully Prorate rule is defined from Allocations window
11700
11701 BEGIN
11702 SELECT rule_type, status
11703 INTO l_allocation_rule_type, l_allocation_status
11704 FROM ap_allocation_rules
11705 WHERE invoice_id = t_inv_lines_table(i).invoice_id
11706 AND chrg_invoice_line_number = t_inv_lines_table(i).line_number;
11707 EXCEPTION
11708 WHEN NO_DATA_FOUND THEN
11709 l_allocation_rule_type := NULL;
11710 l_allocation_status := NULL;
11711 END;
11712
11713 --Bug10052153:Added OR condition
11714 IF (l_prorate_across_all_items='Y'
11715 OR (l_allocation_rule_type = 'PRORATION' AND l_allocation_status='PENDING')) then
11716
11717 l_success := AP_ALLOCATION_RULES_PKG.Create_Proration_Rule(
11718 t_inv_lines_table(i).invoice_id,
11719 t_inv_lines_table(i).line_number,
11720 NULL,
11721 'APAPRVLB',
11722 l_error_code,
11723 l_debug_info,
11724 l_debug_context,
11725 'Execute_Dist_Generation_Check');
11726
11727 END IF;
11728 END IF;
11729
11730 -- Bug fix : 6731107: Added 'D' to the below if stmt
11731 IF (t_inv_lines_table(i).generate_dists IN ('D' , 'Y') ) THEN
11732 --Bug 8346277
11733 IF t_inv_lines_table(i).line_type_lookup_code <> 'TAX'
11734 AND t_inv_lines_table(i).line_type_lookup_code <> 'AWT' THEN
11735
11736
11737 ----------------------------------------------------------------
11738 l_debug_info := 'Check Insufficient Line Info: Number and Type: '||
11739 t_inv_lines_table(i).line_number ||' and '||
11740 t_inv_lines_table(i).line_type_lookup_code;
11741 -- Print_Debug(l_debug_loc, l_debug_info);
11742 IF g_debug_mode = 'Y' THEN
11743 AP_Debug_Pkg.Print(g_debug_mode, l_debug_info );
11744 END IF;
11745
11746 IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
11747 FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME||l_debug_loc,l_debug_info);
11748 END IF;
11749 ----------------------------------------------------------------
11750
11751 Check_Insufficient_Line_Data(
11752 p_inv_line_rec => t_inv_lines_table(i),
11753 p_system_user => l_system_user,
11754 p_holds => l_holds,
11755 p_holds_count => l_hold_count,
11756 p_release_count => l_release_count,
11757 p_insufficient_data_exist => l_insufficient_data_exist,
11758 p_calling_mode => 'PERMANENT_DISTRIBUTIONS',
11759 p_calling_sequence => l_curr_calling_sequence );
11760
11761 IF ( (NOT l_insufficient_data_exist)
11762 AND (t_inv_lines_table(i).generate_dists = 'Y') ) THEN
11763 --Bug fix 6731107 : added the AND condition to above IF stmt.
11764 --Invoice distributions should be generated only when generate_dists flag is set to 'Y'
11765
11766 ----------------------------------------------------------------
11767 l_debug_info := 'Generate Invoice Distributions';
11768 -- Print_Debug(l_debug_loc, l_debug_info);
11769 IF g_debug_mode = 'Y' THEN
11770 AP_Debug_Pkg.Print(g_debug_mode, l_debug_info );
11771 END IF;
11772
11773 IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
11774 FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME||l_debug_loc,l_debug_info);
11775 END IF;
11776 ----------------------------------------------------------------
11777
11778 l_result := Execute_Dist_Generation_Check(
11779 p_batch_id => p_inv_batch_id,
11780 p_invoice_date => p_invoice_rec.invoice_date,
11781 p_vendor_id => p_invoice_rec.vendor_id,
11782 p_invoice_currency => p_invoice_rec.invoice_currency_code,
11783 p_exchange_rate => p_invoice_rec.exchange_rate,
11784 p_exchange_rate_type => p_invoice_rec.exchange_rate_type,
11785 p_exchange_date => p_invoice_rec.exchange_date,
11786 p_inv_line_rec => t_inv_lines_table(i),
11787 p_system_user => l_system_user,
11788 p_holds => l_holds,
11789 p_holds_count => l_hold_count,
11790 p_release_count => l_release_count,
11791 p_generate_permanent => 'Y',
11792 p_calling_mode => 'PERMANENT_DISTRIBUTIONS',
11793 p_error_code => l_error_code,
11794 p_curr_calling_sequence => l_curr_calling_sequence);
11795
11796 ELSE
11797 ----------------------------------------------------------------
11798 l_debug_info := 'Insufficient info for invoice line number: '||
11799 t_inv_lines_table(i).line_number;
11800 -- Print_Debug(l_debug_loc, l_debug_info);
11801 IF g_debug_mode = 'Y' THEN
11802 AP_Debug_Pkg.Print(g_debug_mode, l_debug_info );
11803 END IF;
11804
11805 IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
11806 FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME||l_debug_loc,l_debug_info);
11807 END IF;
11808 ----------------------------------------------------------------
11809 END IF; -- end of sufficient data check
11810 END IF; -- end of line_type_lookup_code check
11811 END IF; -- end of generate_dists check
11812 -- Bug8414549
11813 -- Update of amount_paid for recouped amount will now be done
11814 -- during matching of invoice.
11815 /*IF (t_inv_lines_table(i).line_type_lookup_code IN ('ITEM', 'RETAINAGE RELEASE')) THEN
11816
11817 l_recouped_amount := AP_MATCHING_UTILS_PKG.Get_Inv_Line_Recouped_Amount
11818 (P_Invoice_Id => t_inv_lines_table(i).invoice_id,
11819 P_Invoice_Line_Number => t_inv_lines_table(i).line_number);
11820
11821 IF l_recouped_amount <> 0 THEN
11822 IF (ap_invoice_lines_utility_pkg.get_approval_status
11823 ( p_invoice_id => t_inv_lines_table(i).invoice_id
11824 ,p_line_number => t_inv_lines_table(i).line_number) = 'NEVER APPROVED') THEN
11825
11826 ----------------------------------------------------------------
11827 l_debug_info := 'Adjust Amount Paid if unapproved lines with recouped prepayments exist';
11828 Print_Debug(l_debug_loc, l_debug_info);
11829 ----------------------------------------------------------------
11830
11831 --bugfix:5609186 removed the l_recouped_amount from the pay_curr_invoice_amount
11832 --as pay_curr_invoice_amount has nothing to do with recouped amount. Recoupment
11833 --should effect only amount_paid on the invoice.
11834 update ap_invoices_all
11835 set amount_paid = nvl(amount_paid,0) + abs(l_recouped_amount)
11836 ,pay_curr_invoice_amount = ap_utilities_pkg.ap_round_currency
11837 (pay_curr_invoice_amount * payment_cross_rate,
11838 payment_currency_code)
11839 where invoice_id = t_inv_lines_table(i).invoice_id;
11840 END IF;
11841 END IF;
11842 END IF;*/
11843 --End of Bug8414549
11844 ----------------------------------------------------------------
11845 l_debug_info := 'Update Invoice Distributions to SELECTED';
11846 -- Print_Debug(l_debug_loc, l_debug_info);
11847 IF g_debug_mode = 'Y' THEN
11848 AP_Debug_Pkg.Print(g_debug_mode, l_debug_info );
11849 END IF;
11850
11851 IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
11852 FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME||l_debug_loc,l_debug_info);
11853 END IF;
11854 ----------------------------------------------------------------
11855 -- Perf 6759699
11856 -- All the reamining values for the p_run_option is handeled before
11857 -- the loop. If the line number is passed then it will use proper index.This will
11858 -- work only when the p_run_option is 'NEW'
11859 if ( p_run_option = 'NEW' ) then --6759699
11860
11861 Update_Inv_Dists_To_Selected(
11862 t_inv_lines_table(i).invoice_id,
11863 t_inv_lines_table(i).line_number,
11864 p_run_option,
11865 l_curr_calling_sequence);
11866 end if; -- p_run_option
11867 -----------------------------------------------------------------
11868 -- Print_Debug(l_debug_loc, 'Line Type : '|| t_inv_lines_table(i).line_type_lookup_code );
11869 -- Print_Debug(l_debug_loc, 'Match Type: '|| t_inv_lines_table(i).match_type );
11870 IF g_debug_mode = 'Y' THEN
11871 AP_Debug_Pkg.Print(g_debug_mode, 'Line Type : '|| t_inv_lines_table(i).line_type_lookup_code );
11872 AP_Debug_Pkg.Print(g_debug_mode, 'Match Type: '|| t_inv_lines_table(i).match_type );
11873 END IF;
11874
11875 IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
11876 FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME||l_debug_loc,'Line Type : '|| t_inv_lines_table(i).line_type_lookup_code);
11877 FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME||l_debug_loc,'Match Type: '|| t_inv_lines_table(i).match_type);
11878 END IF;
11879 -----------------------------------------------------------------
11880 --Bug#10416960. Added RETROITEM type
11881 IF ( t_inv_lines_table(i).line_type_lookup_code in ('ITEM','RETROITEM','RETAINAGE RELEASE') AND /*Bug 9242891:Added retainage release type*/
11882 t_inv_lines_table(i).match_type in ('ITEM_TO_PO',
11883 'ITEM_TO_RECEIPT',
11884 'PRICE_CORRECTION',
11885 'QTY_CORRECTION',
11886 'ITEM_TO_SERVICE_PO',
11887 'ITEM_TO_SERVICE_RECEIPT',
11888 'AMOUNT_CORRECTION',
11889 'PO_PRICE_ADJUSTMENT' ) ) THEN
11890
11891 ----------------------------------------------------------------
11892 l_debug_info := 'Calculate Exchange Rate and Invoice Price Variance';
11893 -- Print_Debug(l_debug_loc, l_debug_info);
11894 IF g_debug_mode = 'Y' THEN
11895 AP_Debug_Pkg.Print(g_debug_mode, l_debug_info );
11896 END IF;
11897
11898 IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
11899 FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME||l_debug_loc,l_debug_info);
11900 END IF;
11901 ----------------------------------------------------------------
11902
11903 AP_APPROVAL_MATCHED_PKG.Exec_Matched_Variance_Checks(
11904 p_invoice_id => t_inv_lines_table(i).invoice_id,
11905 p_inv_line_number => t_inv_lines_table(i).line_number,
11906 p_base_currency_code => p_base_currency_code,
11907 p_inv_currency_code => p_invoice_rec.invoice_currency_code,
11908 p_sys_xrate_gain_ccid => NULL,
11909 p_sys_xrate_loss_ccid => NULL,
11910 p_system_user => l_system_user,
11911 p_holds => l_holds,
11912 p_hold_count => l_hold_count,
11913 p_release_count => l_release_count,
11914 p_calling_sequence => l_curr_calling_sequence );
11915
11916 END IF;
11917 END IF;
11918 END LOOP;
11919
11920 /* Bug#14582311
11921 l_retained_amount := nvl(ap_invoices_utility_pkg.get_retained_total(p_invoice_rec.invoice_id, null),0);
11922
11923 IF l_retained_amount <> 0 THEN
11924
11925 ----------------------------------------------------------------
11926 l_debug_info := 'Adjust Amount Applicable To Discount with Retainage';
11927 -- Print_Debug(l_debug_loc, l_debug_info);
11928 IF g_debug_mode = 'Y' THEN
11929 AP_Debug_Pkg.Print(g_debug_mode, l_debug_info );
11930 END IF;
11931
11932 IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
11933 FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME||l_debug_loc,l_debug_info);
11934 END IF;
11935 ----------------------------------------------------------------
11936
11937 update ap_invoices_all
11938 set amount_applicable_to_discount = amount_applicable_to_discount + l_retained_amount
11939 ,pay_curr_invoice_amount = ap_utilities_pkg.ap_round_currency
11940 ((invoice_amount + l_retained_amount) * payment_cross_rate,
11941 payment_currency_code)
11942 where invoice_id = p_invoice_rec.invoice_id
11943 and nvl(net_of_retainage_flag, 'N') <> 'Y';
11944 END IF; End Bug#14582311*/
11945
11946 EXCEPTION
11947 WHEN OTHERS THEN
11948 IF (SQLCODE <> -20001) THEN
11949 FND_MESSAGE.SET_NAME('SQLAP','AP_DEBUG');
11950 FND_MESSAGE.SET_TOKEN('ERROR',SQLERRM);
11951 FND_MESSAGE.SET_TOKEN('CALLING_SEQUENCE', l_curr_calling_sequence);
11952 FND_MESSAGE.SET_TOKEN('DEBUG_INFO', l_debug_info);
11953 END IF;
11954 APP_EXCEPTION.RAISE_EXCEPTION;
11955 END Generate_Distributions;
11956
11957 PROCEDURE initialize_invoice_holds
11958 (p_invoice_id IN NUMBER,
11959 p_calling_sequence IN VARCHAR2) IS
11960
11961 Cursor c_invoice_holds (c_invoice_id NUMBER) Is
11962 Select hold_lookup_code,
11963 decode(release_lookup_code, NULL, 'ALREADY ON HOLD',
11964 'RELEASED BY USER') hold_status,
11965 invoice_id,
11966 hold_reason,
11967 release_lookup_code,
11968 line_location_id,
11969 rcv_transaction_id,
11970 last_updated_by,
11971 responsibility_id
11972 From ap_holds
11973 Where invoice_id = c_invoice_id
11974 Order By 1, 2 DESC;
11975
11976 j NUMBER := 1;
11977
11978 l_debug_info VARCHAR2(100);
11979 l_current_calling_sequence VARCHAR2(2000);
11980
11981 BEGIN
11982
11983 -- Update the calling sequence
11984 --
11985 l_current_calling_sequence := 'initialize_invoice_holds<-'||p_calling_sequence;
11986
11987 g_holds_tab.delete;
11988
11989 OPEN c_invoice_holds (p_invoice_id);
11990 LOOP
11991 FETCH c_invoice_holds
11992 INTO g_holds_tab(j);
11993 EXIT WHEN c_invoice_holds%notfound;
11994 j:=j+1;
11995 END LOOP;
11996 CLOSE c_invoice_holds;
11997
11998 EXCEPTION
11999 WHEN OTHERS then
12000 if (SQLCODE <> -20001 ) then
12001 FND_MESSAGE.SET_NAME('SQLAP','AP_DEBUG');
12002 FND_MESSAGE.SET_TOKEN('ERROR',SQLERRM);
12003 FND_MESSAGE.SET_TOKEN('CALLING_SEQUENCE',l_current_calling_sequence);
12004 FND_MESSAGE.SET_TOKEN('PARAMETERS','Invoice_id = '||TO_CHAR(p_invoice_id));
12005 FND_MESSAGE.SET_TOKEN('DEBUG_INFO',l_debug_info);
12006 end if;
12007
12008 APP_EXCEPTION.RAISE_EXCEPTION;
12009
12010 END initialize_invoice_holds;
12011
12012 Procedure Count_Org_Hold(
12013 p_org_id IN NUMBER,
12014 p_hold_lookup_code IN VARCHAR2,
12015 p_place_or_release IN VARCHAR2,
12016 p_calling_sequence IN VARCHAR2) IS
12017
12018 l_array_set VARCHAR2(1);
12019 l_array_count NUMBER;
12020
12021 l_debug_info VARCHAR2(100);
12022 l_current_calling_sequence VARCHAR2(2000);
12023
12024 Begin
12025
12026 -- Update the calling sequence
12027 --
12028 l_current_calling_sequence := 'count_org_hold<-'||p_calling_sequence;
12029
12030 l_array_set := 'N';
12031 l_array_count := g_org_holds.count;
12032
12033 l_debug_info := 'Update Org Hold Count';
12034
12035 if l_array_count > 0 then
12036
12037 for i in g_org_holds.first..g_org_holds.last loop
12038 if g_org_holds(i).org_id = p_org_id
12039 and g_org_holds(i).hold_lookup_code = p_hold_lookup_code then
12040 if p_place_or_release = 'P' then
12041 g_org_holds(i).holds_placed := g_org_holds(i).holds_placed + 1;
12042 l_array_set := 'Y';
12043 exit;
12044 elsif p_place_or_release = 'R' then
12045 g_org_holds(i).holds_released := g_org_holds(i).holds_released + 1;
12046 l_array_set := 'Y';
12047 exit;
12048 end if;
12049 end if;
12050 end loop;
12051
12052 end if;
12053
12054
12055 if l_array_set = 'N' then
12056
12057 l_debug_info := 'Set Org Hold Count';
12058
12059 if l_array_count = 0 then
12060 l_array_count := 1;
12061 else
12062 l_array_count := l_array_count + 1; --bug6370503
12063 end if;
12064
12065 if p_place_or_release = 'P' then
12066 g_org_holds(l_array_count).org_id := p_org_id;
12067 g_org_holds(l_array_count).hold_lookup_code := p_hold_lookup_code;
12068 g_org_holds(l_array_count).holds_placed := 1;
12069 g_org_holds(l_array_count).holds_released := 0;
12070 elsif p_place_or_release = 'R' then
12071 g_org_holds(l_array_count).org_id := p_org_id;
12072 g_org_holds(l_array_count).hold_lookup_code := p_hold_lookup_code;
12073 g_org_holds(l_array_count).holds_placed := 0;
12074 g_org_holds(l_array_count).holds_released := 1;
12075 end if;
12076 end if;
12077
12078 EXCEPTION
12079 WHEN OTHERS then
12080 if (SQLCODE <> -20001 ) then
12081 FND_MESSAGE.SET_NAME('SQLAP','AP_DEBUG');
12082 FND_MESSAGE.SET_TOKEN('ERROR',SQLERRM);
12083 FND_MESSAGE.SET_TOKEN('CALLING_SEQUENCE',l_current_calling_sequence);
12084 FND_MESSAGE.SET_TOKEN('PARAMETERS','Org_Id = '||to_char(p_org_id)
12085 ||' Hold = '||p_hold_lookup_code
12086 ||' Action = '||p_place_or_release);
12087 FND_MESSAGE.SET_TOKEN('DEBUG_INFO',l_debug_info);
12088 end if;
12089
12090 APP_EXCEPTION.RAISE_EXCEPTION;
12091 End Count_Org_Hold;
12092
12093 Procedure Print_Debug(
12094 p_api_name IN VARCHAR2,
12095 p_debug_info IN VARCHAR2) IS
12096 BEGIN
12097
12098 IF g_debug_mode = 'Y' THEN
12099
12100 AP_Debug_Pkg.Print(g_debug_mode, p_debug_info );
12101
12102 END IF;
12103
12104 IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
12105 FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME||p_api_name,p_debug_info);
12106 END IF;
12107 END Print_Debug;
12108
12109 /*=============================================================================
12110 | FUNCTION - get_adjusted_base_amount()
12111 |
12112 | DESCRIPTION
12113 | This function returns base amount after rouding.
12114 | Also calculates the rounding amount for the next line
12115 | For ex: before adjustment after adjustment
12116 | ---------------------------|----------------------------------------------
12117 | p_base_amount | 0.1 0 (since adjustment goes to -ve)
12118 | p_rounding_amt | -0.2 -0.1 (this much amount is adjusted)
12119 | p_next_line_rounding_amt| -0.1 (remaing amount..forward it to next line)
12120 |
12121 |
12122 | PARAMETERS
12123 | p_base_amount - entered base amount
12124 | p_rounding_amt - rounding amount for the base amount
12125 | p_next_line_rounding_amt - rounding amount calculate for the next line/distribution
12126 |
12127 | MODIFICATION HISTORY
12128 | DATE Author Action
12129 | 19-MAY-2008 KPASIKAN Created for the bug 6892789
12130 |
12131 *============================================================================*/
12132 FUNCTION get_adjusted_base_amount(p_base_amount IN NUMBER,
12133 p_rounding_amt OUT NOCOPY NUMBER,
12134 p_next_line_rounding_amt IN OUT NOCOPY NUMBER,
12135 p_amount IN NUMBER DEFAULT NULL) -- Bug 12686348
12136 RETURN NUMBER IS
12137 l_adjusted_base_amount NUMBER := 0;
12138 l_base_amount NUMBER := p_base_amount;
12139 l_next_line_rounding_amt NUMBER := p_next_line_rounding_amt;
12140 l_amount NUMBER := p_amount; -- Bug 12686348
12141 BEGIN
12142 l_adjusted_base_amount := l_base_amount + l_next_line_rounding_amt;
12143
12144 -- if adjusted base amount goes to -ve
12145 IF (l_base_amount > 0 AND l_adjusted_base_amount < 0)
12146 OR (l_base_amount < 0 AND l_adjusted_base_amount > 0)
12147 OR (l_amount IS NOT NULL and (l_amount > 0 and l_adjusted_base_amount < 0)) -- Bug 12686348
12148 OR (l_amount IS NOT NULL and (l_amount < 0 and l_adjusted_base_amount > 0)) THEN -- Bug 12686348
12149 -- rounding maount for the next line/dist
12150 p_next_line_rounding_amt := l_adjusted_base_amount;
12151
12152 -- rounding amt for the line/dist
12153 p_rounding_amt := -l_base_amount;
12154
12155 -- base amount will be adjusted to zero
12156 RETURN 0;
12157 ELSE
12158 -- rounding amt for the line/dist
12159 p_rounding_amt := l_next_line_rounding_amt;
12160
12161 -- no need to adjust next line/dist
12162 p_next_line_rounding_amt := 0;
12163
12164 -- base amount
12165 RETURN l_adjusted_base_amount;
12166 END IF;
12167 END;
12168
12169 --Bug 8346277
12170 --For Manual AWT Line Added new procedure.
12171 PROCEDURE Generate_Manual_Awt_Dist
12172 (p_invoice_rec IN AP_APPROVAL_PKG.Invoice_Rec,
12173 p_base_currency_code IN VARCHAR2,
12174 p_inv_batch_id IN NUMBER,
12175 p_run_option IN VARCHAR2,
12176 p_calling_sequence IN VARCHAR2,
12177 x_error_code IN VARCHAR2,
12178 p_calling_mode IN VARCHAR2 ) IS
12179
12180 t_inv_lines_table AP_INVOICES_PKG.t_invoice_lines_table;
12181
12182 l_curr_calling_sequence VARCHAR2(2000);
12183 l_debug_info VARCHAR2(2000);
12184 l_debug_loc VARCHAR2(30) := 'Generate_Distributions';
12185
12186 l_prorate_across_all_items VARCHAR2(1);
12187 l_error_code VARCHAR2(4000);
12188 l_debug_context VARCHAR2(2000);
12189 l_success BOOLEAN;
12190
12191 l_system_user NUMBER := 5;
12192
12193 l_holds HOLDSARRAY;
12194 l_hold_count COUNTARRAY;
12195 l_release_count COUNTARRAY;
12196 l_insufficient_data_exist BOOLEAN := FALSE;
12197
12198 l_recouped_amount NUMBER;
12199 l_retained_amount NUMBER;
12200 l_result BOOLEAN;
12201
12202 l_line_variance_hold_exist BOOLEAN := FALSE;
12203 l_need_to_round_flag VARCHAR2(1) := 'Y';
12204
12205 l_not_exist_nond_line VARCHAR2(1);
12206 l_regenerate_dist NUMBER:=0; /* 0 - Generate, 1 - Do not */
12207
12208 CURSOR dist_gen_holds(p_invoice_id NUMBER)
12209 IS
12210 SELECT hold_lookup_code
12211 FROM ap_holds_all
12212 WHERE hold_lookup_code IN ('DISTRIBUTION SET INACTIVE',
12213 'SKELETON DISTRIBUTION SET',
12214 'CANNOT OVERLAY ACCOUNT',
12215 'INVALID DEFAULT ACCOUNT',
12216 'CANNOT EXECUTE ALLOCATION',
12217 'PERIOD CLOSED',
12218 'PROJECT GL DATE CLOSED')
12219 AND release_lookup_code IS NULL
12220 AND invoice_id = p_invoice_id;
12221
12222 TYPE holds_tab_type IS
12223 TABLE OF AP_HOLDS_ALL.HOLD_LOOKUP_CODE%TYPE
12224 INDEX BY BINARY_INTEGER;
12225
12226 t_holds_tab holds_tab_type;
12227
12228 BEGIN
12229
12230 l_curr_calling_sequence := 'AP_APPROVAL_PKG.'||l_debug_loc||'<-'||p_calling_sequence;
12231
12232
12233 ----------------------------------------------------------------
12234 l_debug_info := 'Bulk Collect Invoice Lines';
12235 -- Print_Debug(l_debug_loc, l_debug_info);
12236 IF g_debug_mode = 'Y' THEN
12237 AP_Debug_Pkg.Print(g_debug_mode, l_debug_info );
12238 END IF;
12239
12240 IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
12241 FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME||l_debug_loc,l_debug_info);
12242 END IF;
12243 ----------------------------------------------------------------
12244
12245 OPEN invoice_line_mawt_cur (p_invoice_rec.invoice_id);
12246 FETCH invoice_line_mawt_cur BULK COLLECT
12247 INTO t_inv_lines_table;
12248 CLOSE invoice_line_mawt_cur;
12249
12250 l_debug_info := 'Checking if there exists a non d line';
12251
12252 BEGIN
12253
12254 SELECT 'Y'
12255 INTO l_not_exist_nond_line
12256 FROM ap_invoice_lines_all ail
12257 WHERE ail.invoice_id = p_invoice_rec.invoice_id
12258 AND nvl(ail.generate_dists, 'N') <> 'D'
12259 AND rownum < 2;
12260
12261 EXCEPTION
12262 WHEN NO_DATA_FOUND THEN
12263 l_not_exist_nond_line := 'N';
12264
12265 END;
12266
12267 l_debug_info := 'If there is no non d line or p_calling_mode is CANCEL, then fetch all the dist gen holds';
12268
12269 IF (l_not_exist_nond_line = 'N' OR p_calling_mode = 'CANCEL') THEN
12270 OPEN dist_gen_holds (p_invoice_rec.invoice_id);
12271 FETCH dist_gen_holds BULK COLLECT INTO t_holds_tab;
12272 CLOSE dist_gen_holds;
12273 END IF;
12274
12275 l_debug_info := 'Release all the non D holds';
12276
12277 IF nvl(t_holds_tab.count, 0) > 0 THEN
12278
12279 FOR i IN NVL(t_holds_tab.first,0)..NVL(t_holds_tab.last,0)
12280 LOOP
12281
12282 l_debug_info := 'Inside the loop';
12283
12284 Process_Inv_Hold_Status(
12285 p_invoice_rec.invoice_id,
12286 null,
12287 null,
12288 t_holds_tab(i),
12289 'N',
12290 null,
12291 l_system_user,
12292 l_holds,
12293 l_hold_count,
12294 l_release_count,
12295 l_curr_calling_sequence);
12296
12297 END LOOP;
12298
12299 END IF;
12300
12301
12302 IF ( nvl(t_inv_lines_table.count,0) <> 0 AND
12303 (nvl(p_run_option,'Yes') <> 'New' ))THEN
12304
12305 Update_Inv_Dists_To_Selected( p_invoice_rec.invoice_id,
12306 null ,
12307 p_run_option,
12308 l_curr_calling_sequence);
12309 End IF;
12310
12311 FOR i IN NVL(t_inv_lines_table.first,0)..NVL(t_inv_lines_table.last,0)
12312 LOOP
12313 IF (t_inv_lines_table.exists(i)) THEN
12314
12315 IF (t_inv_lines_table(i).generate_dists IN ('D' , 'Y') ) THEN
12316 IF t_inv_lines_table(i).line_type_lookup_code = 'AWT' THEN
12317
12318 ----------------------------------------------------------------
12319 l_debug_info := 'Check Insufficient Line Info: Number and Type: '||
12320 t_inv_lines_table(i).line_number ||' and '||
12321 t_inv_lines_table(i).line_type_lookup_code;
12322 -- Print_Debug(l_debug_loc, l_debug_info);
12323 IF g_debug_mode = 'Y' THEN
12324 AP_Debug_Pkg.Print(g_debug_mode, l_debug_info );
12325 END IF;
12326
12327 IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
12328 FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME||l_debug_loc,l_debug_info);
12329 END IF;
12330 ----------------------------------------------------------------
12331
12332 Check_Insufficient_Line_Data(
12333 p_inv_line_rec => t_inv_lines_table(i),
12334 p_system_user => l_system_user,
12335 p_holds => l_holds,
12336 p_holds_count => l_hold_count,
12337 p_release_count => l_release_count,
12338 p_insufficient_data_exist => l_insufficient_data_exist,
12339 p_calling_mode => 'PERMANENT_DISTRIBUTIONS',
12340 p_calling_sequence => l_curr_calling_sequence );
12341
12342 SELECT COUNT(*)
12343 INTO l_regenerate_dist
12344 FROM ap_invoice_distributions_all aid
12345 WHERE aid.invoice_id = t_inv_lines_table(i) .invoice_id
12346 AND aid.invoice_line_number = t_inv_lines_table(i) .line_number
12347 AND (NVL(posted_flag , 'N') <> 'N'
12348 OR NVL(encumbered_flag,'N') <>'N');
12349
12350 IF ( (NOT l_insufficient_data_exist)
12351 AND (l_regenerate_dist = 0 ) ) THEN
12352 ----------------------------------------------------------------
12353 l_debug_info := 'Generate Invoice Distributions';
12354 -- Print_Debug(l_debug_loc, l_debug_info);
12355 IF g_debug_mode = 'Y' THEN
12356 AP_Debug_Pkg.Print(g_debug_mode, l_debug_info );
12357 END IF;
12358
12359 IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
12360 FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME||l_debug_loc,l_debug_info);
12361 END IF;
12362 ----------------------------------------------------------------
12363
12364 l_result := Execute_Dist_Generation_Check(
12365 p_batch_id => p_inv_batch_id,
12366 p_invoice_date => p_invoice_rec.invoice_date,
12367 p_vendor_id => p_invoice_rec.vendor_id,
12368 p_invoice_currency => p_invoice_rec.invoice_currency_code,
12369 p_exchange_rate => p_invoice_rec.exchange_rate,
12370 p_exchange_rate_type => p_invoice_rec.exchange_rate_type,
12371 p_exchange_date => p_invoice_rec.exchange_date,
12372 p_inv_line_rec => t_inv_lines_table(i),
12373 p_system_user => l_system_user,
12374 p_holds => l_holds,
12375 p_holds_count => l_hold_count,
12376 p_release_count => l_release_count,
12377 p_generate_permanent => 'Y',
12378 p_calling_mode => 'PERMANENT_DISTRIBUTIONS',
12379 p_error_code => l_error_code,
12380 p_curr_calling_sequence => l_curr_calling_sequence);
12381
12382 ELSE
12383 ----------------------------------------------------------------
12384 l_debug_info := 'Insufficient info for invoice line number: '||
12385 t_inv_lines_table(i).line_number;
12386 -- Print_Debug(l_debug_loc, l_debug_info);
12387 IF g_debug_mode = 'Y' THEN
12388 AP_Debug_Pkg.Print(g_debug_mode, l_debug_info );
12389 END IF;
12390
12391 IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
12392 FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME||l_debug_loc,l_debug_info);
12393 END IF;
12394 ----------------------------------------------------------------
12395 END IF; -- end of sufficient data check
12396 END IF; -- end of line_type_lookup_code check
12397 END IF; -- end of generate_dists check
12398
12399
12400 ----------------------------------------------------------------
12401 l_debug_info := 'Update Invoice Distributions to SELECTED';
12402 -- Print_Debug(l_debug_loc, l_debug_info);
12403 IF g_debug_mode = 'Y' THEN
12404 AP_Debug_Pkg.Print(g_debug_mode, l_debug_info );
12405 END IF;
12406
12407 IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
12408 FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME||l_debug_loc,l_debug_info);
12409 END IF;
12410 ----------------------------------------------------------------
12411 -- All the reamining values for the p_run_option is handeled before
12412 -- the loop. If the line number is passed then it will use proper index.This will
12413 -- work only when the p_run_option is 'NEW'
12414 if ( p_run_option = 'New' ) then
12415
12416 Update_Inv_Dists_To_Selected(
12417 t_inv_lines_table(i).invoice_id,
12418 t_inv_lines_table(i).line_number,
12419 p_run_option,
12420 l_curr_calling_sequence);
12421 end if; -- p_run_option
12422 -----------------------------------------------------------------
12423 -- Print_Debug(l_debug_loc, 'Line Type : '|| t_inv_lines_table(i).line_type_lookup_code );
12424 -- Print_Debug(l_debug_loc, 'Match Type: '|| t_inv_lines_table(i).match_type );
12425 IF g_debug_mode = 'Y' THEN
12426 AP_Debug_Pkg.Print(g_debug_mode, 'Line Type : '|| t_inv_lines_table(i).line_type_lookup_code );
12427 AP_Debug_Pkg.Print(g_debug_mode, 'Match Type: '|| t_inv_lines_table(i).match_type );
12428 END IF;
12429
12430 IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
12431 FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME||l_debug_loc,'Line Type : '|| t_inv_lines_table(i).line_type_lookup_code);
12432 FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME||l_debug_loc,'Match Type: '|| t_inv_lines_table(i).match_type);
12433 END IF;
12434 -----------------------------------------------------------------
12435
12436 END IF;
12437 END LOOP;
12438
12439 /* Bug#14582311
12440 l_retained_amount := nvl(ap_invoices_utility_pkg.get_retained_total(p_invoice_rec.invoice_id, null),0);
12441
12442 IF l_retained_amount <> 0 THEN
12443
12444 ----------------------------------------------------------------
12445 l_debug_info := 'Adjust Amount Applicable To Discount with Retainage';
12446 -- Print_Debug(l_debug_loc, l_debug_info);
12447 IF g_debug_mode = 'Y' THEN
12448 AP_Debug_Pkg.Print(g_debug_mode, l_debug_info );
12449 END IF;
12450
12451 IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
12452 FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME||l_debug_loc,l_debug_info);
12453 END IF;
12454 ----------------------------------------------------------------
12455
12456 UPDATE ap_invoices_all
12457 SET amount_applicable_to_discount = amount_applicable_to_discount
12458 + l_retained_amount
12459 , pay_curr_invoice_amount = ap_utilities_pkg.ap_round_currency(
12460 (invoice_amount + l_retained_amount)
12461 * payment_cross_rate
12462 , payment_currency_code)
12463 WHERE invoice_id = p_invoice_rec.invoice_id
12464 AND NVL(net_of_retainage_flag , 'N') <> 'Y';
12465 END IF; End Bug#14582311 */
12466
12467 EXCEPTION
12468 WHEN OTHERS THEN
12469 IF (SQLCODE <> -20001) THEN
12470 FND_MESSAGE.SET_NAME('SQLAP','AP_DEBUG');
12471 FND_MESSAGE.SET_TOKEN('ERROR',SQLERRM);
12472 FND_MESSAGE.SET_TOKEN('CALLING_SEQUENCE', l_curr_calling_sequence);
12473 FND_MESSAGE.SET_TOKEN('DEBUG_INFO', l_debug_info);
12474 END IF;
12475 APP_EXCEPTION.RAISE_EXCEPTION;
12476 END Generate_Manual_Awt_Dist;
12477
12478
12479 -- Start 8691645
12480 /*=========================================================================
12481 | This procedure creates invoice validation concurrent request for the
12482 | given vendor and and for the vendors who contains given vendor
12483 | as third party vendor
12484 ===========================================================================*/
12485
12486 PROCEDURE BATCH_APPROVAL_FOR_VENDOR(P_VENDOR_ID IN AP_INVOICES.VENDOR_ID%type,
12487 P_CALLING_SEQUENCE IN VARCHAR2)is
12488
12489 l_request_id NUMBER;
12490 l_current_calling_sequence VARCHAR2(2000);
12491 l_debug_info VARCHAR2(1000);
12492
12493
12494 TYPE VendorIdTab IS TABLE OF ap_suppliers.vendor_id%TYPE INDEX BY BINARY_INTEGER;
12495 l_vendor_id_list VendorIdTab;
12496
12497 --cursor fetches vendors information
12498 CURSOR vndr_list_to_process IS
12499 select APS.vendor_id
12500 from IBY_EXT_PAYEE_RELATIONSHIPS IEPR,
12501 AP_SUPPLIERS APS
12502 where IEPR.remit_party_id in (select party_id from ap_suppliers
12503 where vendor_id = p_vendor_id)
12504 and IEPR.party_id = APS.party_id
12505 UNION
12506 select APS.vendor_id
12507 from AP_SUPPLIERS APS
12508 where APS.vendor_id = p_vendor_id;
12509
12510 Begin
12511
12512 l_current_calling_sequence := 'AP_APPROVAL_PKG.BATCH_APPROVAL_FOR_VENDOR <- '||
12513 P_CALLING_SEQUENCE;
12514 OPEN vndr_list_to_process;
12515 FETCH vndr_list_to_process
12516 BULK COLLECT INTO l_vendor_id_list;
12517 CLOSE vndr_list_to_process;
12518
12519 IF l_vendor_id_list.count > 0 THEN
12520
12521 FOR i IN 1..l_vendor_id_list.count LOOP
12522
12523 l_debug_info := 'Before Submitting Request for vendor id: '||l_vendor_id_list(i) ;
12524 IF (G_LEVEL_PROCEDURE >= G_CURRENT_RUNTIME_LEVEL) THEN
12525 fnd_file.put_line(FND_FILE.LOG,l_debug_info);
12526 END IF;
12527
12528
12529 l_request_id := FND_REQUEST.SUBMIT_REQUEST(
12530 'SQLAP',
12531 'APPRVL',
12532 '', --description
12533 '', --start time
12534 FALSE, --sub_request
12535 '', --org_id
12536 'All', --run option
12537 '', --invoice_batch_id,
12538 '', --start_date,
12539 '', --end_date,
12540 l_vendor_id_list(i), --VENDOR_ID,
12541 chr(0) --pay_group,
12542 );
12543
12544 l_debug_info := 'request_id ='||to_char(l_request_id);
12545 IF (G_LEVEL_PROCEDURE >= G_CURRENT_RUNTIME_LEVEL) THEN
12546 fnd_file.put_line(FND_FILE.LOG,l_debug_info);
12547 END IF;
12548
12549 COMMIT;
12550
12551 END LOOP;
12552
12553 END IF;
12554
12555 EXCEPTION
12556
12557 WHEN OTHERS then
12558
12559 IF (SQLCODE <> -20001) THEN
12560 FND_MESSAGE.SET_NAME('SQLAP','AP_DEBUG');
12561 FND_MESSAGE.SET_TOKEN('ERROR',SQLERRM);
12562 FND_MESSAGE.SET_TOKEN('CALLING_SEQUENCE',l_current_calling_sequence );
12563 FND_MESSAGE.SET_TOKEN('DEBUG_INFO', l_debug_info );
12564 FND_MESSAGE.SET_TOKEN('PARAMETERS','Vendor Id = '|| p_vendor_id);
12565 END IF;
12566 APP_EXCEPTION.RAISE_EXCEPTION;
12567
12568 End BATCH_APPROVAL_FOR_VENDOR;
12569 --End 8691645
12570
12571 -- bug9553683
12572 PROCEDURE release_fund_holds
12573 (P_Invoice_ID IN NUMBER,
12574 p_system_user IN NUMBER,
12575 p_calling_mode IN VARCHAR2, --bug11679334
12576 p_holds IN OUT NOCOPY HOLDSARRAY,
12577 p_holds_count IN OUT NOCOPY COUNTARRAY,
12578 p_release_count IN OUT NOCOPY COUNTARRAY,
12579 p_calling_sequence IN VARCHAR2)
12580 IS
12581 l_chk_encum NUMBER;
12582 l_check_encumbrance NUMBER;
12583 l_curr_calling_sequence VARCHAR2(4000);
12584 l_debug_info VARCHAR2(2000);
12585
12586 BEGIN
12587
12588 l_curr_calling_sequence := 'release_fund_holds <- '||p_calling_sequence;
12589
12590 l_debug_info := 'Before getting the count of unreleased fund holds';
12591 SELECT count(*)
12592 INTO l_chk_encum
12593 FROM ap_holds AH,
12594 ap_hold_codes AHC
12595 WHERE AH.invoice_id = P_invoice_id
12596 AND AH.hold_lookup_code = AHC.hold_lookup_code
12597 AND AH.release_lookup_code IS NULL
12598 AND AHC.postable_flag = 'N'
12599 AND AH.hold_lookup_code IN ('INSUFFICIENT FUNDS',
12600 'CANT FUNDS CHECK',
12601 'Encumbrance Acctg Fail')
12602 AND rownum < 2;
12603
12604 l_debug_info := 'Before getting the count of encumbered distributions';
12605 SELECT count(*)
12606 INTO l_check_encumbrance
12607 FROM ap_invoice_distributions_all
12608 WHERE invoice_id = P_invoice_id
12609 AND nvl(encumbered_flag, 'N') NOT IN ('N','R')
12610 AND rownum < 2;
12611
12612 IF (l_chk_encum <> 0 AND
12613 (p_calling_mode= 'NO DIST IN TAB' or
12614 (p_calling_mode='CANCEL' AND l_check_encumbrance = 0))) THEN --BUG11659334
12615
12616 l_debug_info := 'Before releasing any Insufficient funds holds';
12617 AP_APPROVAL_PKG.Process_Inv_Hold_Status(
12618 P_invoice_id,
12619 null,
12620 null,
12621 'INSUFFICIENT FUNDS',
12622 'N',
12623 null,
12624 p_system_user,
12625 p_holds,
12626 p_holds_count,
12627 p_release_count,
12628 p_calling_sequence);
12629
12630 l_debug_info := 'Before releasing any Cant Funds Check holds';
12631 AP_APPROVAL_PKG.Process_Inv_Hold_Status(
12632 P_invoice_id,
12633 null,
12634 null,
12635 'CANT FUNDS CHECK',
12636 'N',
12637 null,
12638 p_system_user,
12639 p_holds,
12640 p_holds_count,
12641 p_release_count,
12642 p_calling_sequence);
12643
12644 l_debug_info := 'Before releasing any Encumbrance Acctg Failed holds';
12645 AP_APPROVAL_PKG.Process_Inv_Hold_Status(
12646 P_invoice_id,
12647 null,
12648 null,
12649 'Encumbrance Acctg Fail',
12650 'N',
12651 null,
12652 p_system_user,
12653 p_holds,
12654 p_holds_count,
12655 p_release_count,
12656 p_calling_sequence);
12657
12658
12659 END IF;
12660
12661 EXCEPTION
12662 WHEN OTHERS then
12663 IF (SQLCODE <> -20001) THEN
12664 FND_MESSAGE.SET_NAME('SQLAP','AP_DEBUG');
12665 FND_MESSAGE.SET_TOKEN('ERROR',SQLERRM);
12666 FND_MESSAGE.SET_TOKEN('CALLING_SEQUENCE',l_curr_calling_sequence );
12667 FND_MESSAGE.SET_TOKEN('DEBUG_INFO', l_debug_info );
12668 END IF;
12669 APP_EXCEPTION.RAISE_EXCEPTION;
12670 END;
12671
12672 --GTAS Project Bug#13464635 Begin
12673
12674 PROCEDURE POPULATE_GDF_FOR_FV(
12675 P_invoice_id IN NUMBER,
12676 P_curr_calling_sequence IN VARCHAR2) IS
12677
12678
12679 l_curr_calling_sequence VARCHAR2(2000);
12680 l_debug_loc VARCHAR2(1000) := 'AP_APPROVAL_PKG.POPULATE_GDF_FOR_FV';
12681 l_debug_info VARCHAR2(1000);
12682 l_invoce_type AP_INVOICES.INVOICE_TYPE_LOOKUP_CODE%TYPE;
12683
12684 BEGIN
12685 l_curr_calling_sequence := l_debug_loc|| '<-' ||P_curr_calling_sequence;
12686
12687 l_debug_info := 'Check FV installed or not';
12688 IF g_debug_mode = 'Y' THEN
12689 AP_Debug_Pkg.Print(g_debug_mode, l_debug_info );
12690 END IF;
12691
12692 IF (AP_INVOICES_UTILITY_PKG.FV_ENABLED) THEN
12693
12694 ----------------------------------------------------------------
12695 l_debug_info := 'Select invoice type';
12696 IF g_debug_mode = 'Y' THEN
12697 AP_Debug_Pkg.Print(g_debug_mode, l_debug_info );
12698 END IF;
12699
12700 IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
12701 FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME||l_debug_loc,l_debug_info);
12702 END IF;
12703 ----------------------------------------------------------------
12704
12705 SELECT INVOICE_TYPE_LOOKUP_CODE
12706 INTO l_invoce_type
12707 FROM AP_INVOICES
12708 WHERE INVOICE_ID = P_invoice_id;
12709
12710 IF(l_invoce_type IN ('STANDARD','CREDIT','DEBIT','MIXED','PREPAYMENT'))THEN
12711
12712 ----------------------------------------------------------------
12713 l_debug_info := 'Update Global attributes on distributions';
12714 IF g_debug_mode = 'Y' THEN
12715 AP_Debug_Pkg.Print(g_debug_mode, l_debug_info );
12716 END IF;
12717
12718 IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
12719 FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME||l_debug_loc,l_debug_info);
12720 END IF;
12721 ----------------------------------------------------------------
12722
12723 UPDATE AP_INVOICE_DISTRIBUTIONS AID
12724 SET Global_Attribute1 =(CASE
12725 WHEN (AID.PO_DISTRIBUTION_ID IS NOT NULL AND
12726 AID. Global_Attribute1 IS NULL)THEN
12727 (SELECT Global_Attribute1
12728 FROM PO_DISTRIBUTIONS_ALL POD
12729 WHERE POD.PO_DISTRIBUTION_ID = AID.PO_DISTRIBUTION_ID)
12730 WHEN (AID. Global_Attribute1 IS NULL) THEN
12731 (SELECT Global_Attribute1
12732 FROM AP_INVOICE_LINES AIL
12733 WHERE AIL.INVOICE_ID = AID.INVOICE_ID
12734 AND AIL.LINE_NUMBER = AID.INVOICE_LINE_NUMBER
12735 AND AIL. Global_Attribute1 IS NOT NULL)
12736 END),
12737 Global_Attribute2=(CASE
12738 WHEN (AID.PO_DISTRIBUTION_ID IS NOT NULL AND
12739 AID.Global_Attribute2 IS NULL)THEN
12740 (SELECT Global_Attribute2
12741 FROM PO_DISTRIBUTIONS_ALL POD
12742 WHERE POD.PO_DISTRIBUTION_ID = AID.PO_DISTRIBUTION_ID)
12743 WHEN (AID. Global_Attribute2 IS NULL) THEN
12744 (SELECT Global_Attribute2
12745 FROM AP_INVOICE_LINES AIL
12746 WHERE AIL.INVOICE_ID = AID.INVOICE_ID
12747 AND AIL.LINE_NUMBER = AID.INVOICE_LINE_NUMBER
12748 AND AIL.Global_Attribute2 IS NOT NULL)
12749 END),
12750 Global_Attribute3=(CASE
12751 WHEN (AID.PO_DISTRIBUTION_ID IS NOT NULL AND
12752 AID. Global_Attribute3 IS NULL)THEN
12753 (SELECT Global_Attribute3
12754 FROM PO_DISTRIBUTIONS_ALL POD
12755 WHERE POD.PO_DISTRIBUTION_ID = AID.PO_DISTRIBUTION_ID)
12756 WHEN (AID. Global_Attribute3 IS NULL) THEN
12757 (SELECT Global_Attribute3
12758 FROM AP_INVOICE_LINES AIL
12759 WHERE AIL.INVOICE_ID = AID.INVOICE_ID
12760 AND AIL.LINE_NUMBER = AID.INVOICE_LINE_NUMBER
12761 AND AIL.Global_Attribute3 IS NOT NULL)
12762 END),
12763 /*Bug#15977829*/
12764 Global_Attribute_Category=(CASE
12765 WHEN (AID.PO_DISTRIBUTION_ID IS NOT NULL AND
12766 AID. Global_Attribute_Category IS NULL)THEN
12767 (SELECT Global_Attribute_Category
12768 FROM PO_DISTRIBUTIONS_ALL POD
12769 WHERE POD.PO_DISTRIBUTION_ID = AID.PO_DISTRIBUTION_ID)
12770 WHEN (AID. Global_Attribute_Category IS NULL) THEN
12771 (SELECT Global_Attribute_Category
12772 FROM AP_INVOICE_LINES AIL
12773 WHERE AIL.INVOICE_ID = AID.INVOICE_ID
12774 AND AIL.LINE_NUMBER = AID.INVOICE_LINE_NUMBER
12775 AND AIL.Global_Attribute_Category IS NOT NULL)
12776 END)
12777 WHERE AID.INVOICE_ID = P_invoice_id
12778 AND (AID.Global_Attribute1 IS NULL OR
12779 AID. Global_Attribute2 IS NULL OR
12780 AID. Global_Attribute3 IS NULL )
12781 AND AID.LINE_TYPE_LOOKUP_CODE IN ('ITEM','FREIGHT','MISCELLANEOUS','ACCRUAL');
12782 END IF;
12783 END IF;
12784 END POPULATE_GDF_FOR_FV;
12785
12786 PROCEDURE CHECK_GDF_VALID(
12787 P_INVOICE_ID IN NUMBER,
12788 P_SYSTEM_USER IN NUMBER,
12789 P_HOLDS IN OUT NOCOPY HOLDSARRAY,
12790 P_HOLDS_COUNT IN OUT NOCOPY COUNTARRAY,
12791 P_RELEASE_COUNT IN OUT NOCOPY COUNTARRAY,
12792 P_CALLING_SEQUENCE IN VARCHAR2) IS
12793
12794 l_curr_calling_sequence VARCHAR2(2000);
12795 l_debug_info VARCHAR2(1000);
12796 l_hold_reject_exists_flag VARCHAR2(1) := 'N';
12797 l_return_code VARCHAR2(100);
12798 l_api_name CONSTANT VARCHAR2(200) := 'CHECK_GDF_VALID'; --Bug16247029
12799
12800 BEGIN
12801
12802 l_curr_calling_sequence := 'AP_APPROVAL_PKG.CHECK_GDF_VALID <-'||p_calling_sequence;
12803 l_debug_info := 'Before initializing holds';
12804
12805 IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
12806 FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME||l_api_name, l_debug_info);
12807 END IF;
12808 INITIALIZE_INVOICE_HOLDS
12809 (p_invoice_id => p_invoice_id,
12810 p_calling_sequence => l_curr_calling_sequence);
12811
12812 l_debug_info := 'Before calling FV API to check GDF validity';
12813 IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
12814 FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME||l_api_name, l_debug_info );
12815 END IF;
12816
12817 AP_INVOICES_UTILITY_PKG.CHECK_GDF_VALID
12818 (P_INVOICE_ID, --P_id
12819 'INV_VLD', --P_calling_mode
12820 'AP_INVOICE_DISTRIBUTIONS', --P_table_name
12821 l_hold_reject_exists_flag, --P_hold_reject_exists_flag
12822 l_return_code,
12823 l_curr_calling_sequence);
12824
12825 l_debug_info := 'Calling invoice hold process to
12826 put/release holds on invoice';
12827 --Bug16247029: Start
12828 IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
12829 FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME||l_api_name, l_debug_info );
12830 END IF;
12831 --Bug16247029: End
12832
12833 PROCESS_INV_HOLD_STATUS(
12834 p_invoice_id,
12835 null,
12836 null,
12837 l_return_code, --hold name
12838 l_hold_reject_exists_flag, --hold should exist/release
12839 null,
12840 p_system_user,
12841 p_holds,
12842 p_holds_count,
12843 p_release_count,
12844 l_curr_calling_sequence);
12845
12846 EXCEPTION
12847 WHEN OTHERS then
12848 IF (SQLCODE <> -20001) THEN
12849 FND_MESSAGE.SET_NAME('SQLAP','AP_DEBUG');
12850 FND_MESSAGE.SET_TOKEN('ERROR',SQLERRM);
12851 FND_MESSAGE.SET_TOKEN('CALLING_SEQUENCE',l_curr_calling_sequence );
12852 FND_MESSAGE.SET_TOKEN('DEBUG_INFO', l_debug_info );
12853 FND_MESSAGE.SET_TOKEN('PARAMETERS',
12854 'Invoice_id = '|| to_char(p_invoice_id));
12855 END IF;
12856 APP_EXCEPTION.RAISE_EXCEPTION;
12857 End CHECK_GDF_VALID;
12858
12859 --End Bug#13464635
12860
12861 END AP_APPROVAL_PKG;