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