DBA Data[Home] [Help]

PACKAGE BODY: APPS.AP_ACCTG_PAY_DIST_PKG

Source


1 PACKAGE BODY AP_ACCTG_PAY_DIST_PKG AS
2 /* $Header: appaydib.pls 120.121.12020000.2 2012/07/13 12:14:28 mkmeda ship $ */
3 
4   G_Total_Dist_Amt             NUMBER := 0;
5   G_Total_Prorated_Amt         NUMBER := 0;
6   G_Total_Prorated_Disc_Amt    NUMBER := 0;
7   G_Total_Inv_Dist_Amt         NUMBER := 0;
8   G_Total_Inv_Dist_Disc_Amt    NUMBER := 0;
9   G_Total_Bank_Curr_Amt        NUMBER := 0;
10   G_Total_Bank_Curr_Disc_Amt   NUMBER := 0;
11   G_Total_Dist_Amount          NUMBER := 0; --BUG 7308385
12   G_Proration_Divisor          NUMBER := 0; --BUG 7308385
13   G_Last_NonExcluded_Dist_ID   NUMBER := 0; --BUG 8202856
14 
15   G_Pay_AWT_Total_amt          NUMBER := 0; --Bug 8524600
16   G_Inv_Adj_Amount             NUMBER := 0; --BUG 9495429
17   -- Logging Infra
18   G_CURRENT_RUNTIME_LEVEL      NUMBER                := FND_LOG.G_CURRENT_RUNTIME_LEVEL;
19   G_LEVEL_UNEXPECTED           CONSTANT NUMBER       := FND_LOG.LEVEL_UNEXPECTED;
20   G_LEVEL_ERROR                CONSTANT NUMBER       := FND_LOG.LEVEL_ERROR;
21   G_LEVEL_EXCEPTION            CONSTANT NUMBER       := FND_LOG.LEVEL_EXCEPTION;
22   G_LEVEL_EVENT                CONSTANT NUMBER       := FND_LOG.LEVEL_EVENT;
23   G_LEVEL_PROCEDURE            CONSTANT NUMBER       := FND_LOG.LEVEL_PROCEDURE;
24   G_LEVEL_STATEMENT            CONSTANT NUMBER       := FND_LOG.LEVEL_STATEMENT;
25   G_MODULE_NAME                CONSTANT VARCHAR2(50) := 'AP.PLSQL.AP_ACCTG_PAY_DIST_PKG.';
26   -- Logging Infra
27 
28 -------------------------------------------------------------------------------
29 -- PROCEDURE  UPDATE_GAIN_LOSS_IND
30 -- The purpose of this procedure is to update the gain_loss_indicator on the
31 -- payment history table based on the exchange rates of payment transactions.
32 --
33 --------------------------------------------------------------------------------
34 PROCEDURE Update_Gain_Loss_Ind
35      (P_XLA_Event_Rec      IN   ap_accounting_pay_pkg.r_xla_event_info
36      ,P_Pay_Hist_Rec       IN   ap_accounting_pay_pkg.r_pay_hist_info
37      ,P_Calling_Sequence   IN   VARCHAR2
38      ) IS
39 
40   l_curr_calling_sequence    VARCHAR2(2000);
41   l_pay_mat_count            NUMBER;
42   l_when_to_account_gain_loss ap_system_parameters_all.when_to_account_gain_loss%TYPE;
43 
44   -- Logging Infra:
45   l_procedure_name CONSTANT VARCHAR2(30) := 'Update_Gain_Loss_Ind';
46   l_log_msg        FND_LOG_MESSAGES.MESSAGE_TEXT%TYPE;
47     CURSOR gain_loss_cur( p_payment_history_id NUMBER, p_accounting_event_id NUMBER )
48     IS
49       SELECT SUM( NVL( aphd.paid_base_amount, 0 ) ) inv_pay_amt
50            , SUM( NVL( aphd.invoice_dist_base_amount, 0 ) ) inv_amt
51            , SUM( NVL( aphd.cleared_base_amount, 0 ) ) inv_clr_amt
52            , SUM( NVL( aphd.matured_base_amount, 0 ) ) inv_mat_amt
53            , aid.invoice_id
54         FROM ap_invoice_distributions_all aid
55            , ap_payment_hist_dists aphd
56        WHERE aid.invoice_distribution_id    = aphd.invoice_distribution_id
57          AND aphd.payment_history_id        = p_payment_history_id
58          AND aphd.accounting_event_id       = p_accounting_event_id
59          AND aphd.pay_dist_lookup_code NOT IN( 'FINAL CASH ROUNDING'
60                                              , 'FINAL PAYMENT ROUNDING'
61                                              , 'BANK CHARGE'
62                                              , 'BANK ERROR'
63                                              , 'EXCHANGE RATE VARIANCE'
64                                              , 'TAX EXCHANGE RATE VARIANCE' ) -- Bug 13783723
65     GROUP BY aid.invoice_id ;
66     GAIN_LOSS_REC GAIN_LOSS_CUR%ROWTYPE;
67     TYPE GAIN_LOSS_TBL_T IS TABLE OF GAIN_LOSS_CUR%ROWTYPE  INDEX BY BINARY_INTEGER;
68     GAIN_LOSS_TBL GAIN_LOSS_TBL_T;
69 BEGIN
70 
71     l_curr_calling_sequence := 'AP_Acctg_Pay_Dist_Pkg.Update_Gain_Loss_Ind<- '||
72                                       p_calling_sequence;
73 
74     -- Logging Infra: Setting up runtime level
75     G_CURRENT_RUNTIME_LEVEL := FND_LOG.G_CURRENT_RUNTIME_LEVEL;
76 
77     -- Logging Infra: Procedure level
78     IF (G_LEVEL_PROCEDURE >= G_CURRENT_RUNTIME_LEVEL ) THEN
79       l_log_msg := 'Begin of procedure '|| l_procedure_name;
80       FND_LOG.STRING(G_LEVEL_PROCEDURE, G_MODULE_NAME||l_procedure_name||'.begin', l_log_msg);
81     END IF;
82 
83     OPEN  GAIN_LOSS_CUR(P_PAY_HIST_REC.PAYMENT_HISTORY_ID,P_XLA_EVENT_REC.EVENT_ID) ;
84     FETCH GAIN_LOSS_CUR BULK COLLECT INTO GAIN_LOSS_TBL ;
85     CLOSE GAIN_LOSS_CUR  ;
86 
87     --Manual payment adusted event added in the list below for bug 7244022
88     --MANUAL PAYMENT ADJUSTED event is commented for bug 7445576
89     --bug 10336668
90     IF(GAIN_LOSS_TBL.COUNT>0) THEN  -- for bug 9734049
91       FOR I in  GAIN_LOSS_TBL.FIRST..GAIN_LOSS_TBL.LAST
92       LOOP
93       IF P_XLA_Event_Rec.Event_Type_Code IN ('PAYMENT CREATED'
94                                         , 'PAYMENT ADJUSTED'
95                                         , 'MANUAL PAYMENT ADJUSTED'
96                                         , 'REFUND ADJUSTED'
97                                         , 'REFUND RECORDED'
98                                         , 'MANUAL REFUND ADJUSTED') THEN
99 
100          IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
101              l_log_msg := 'Updating Gain Loss Indicator for Events ' ||
102                                    P_XLA_Event_Rec.Event_Type_Code;
103              FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME || l_procedure_name, l_log_msg);
104          END IF;
105 
106            UPDATE AP_PAYMENT_HIST_DISTS APHD
107               SET APHD.GAIN_LOSS_INDICATOR      =
108                              DECODE(SIGN( GAIN_LOSS_TBL(I).INV_AMT-GAIN_LOSS_TBL(I).INV_PAY_AMT)--BUG 8276839
109                                     ,  1, 'G'
110                                     , -1, 'L'
111                                     , NULL)
112             WHERE APHD.ACCOUNTING_EVENT_ID      =P_XLA_EVENT_REC.EVENT_ID
113               AND APHD.INVOICE_DISTRIBUTION_ID  IN
114                      (SELECT INVOICE_DISTRIBUTION_ID
115                         FROM AP_INVOICE_DISTRIBUTIONS_ALL AID
116                        WHERE AID.INVOICE_ID=GAIN_LOSS_TBL(I).INVOICE_ID) ;
117 
118       /*Commented code removed*/
119       ELSIF P_XLA_Event_Rec.Event_Type_Code IN ('PAYMENT MATURED'
120                                                 ,'PAYMENT MATURITY ADJUSTED') THEN
121         /*Commented code removed*/
122 
123          IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
124              l_log_msg := 'Updating Gain Loss Indicator for Events: Event_ID = ' ||
125                                    P_XLA_Event_Rec.Event_ID;
126              FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME || l_procedure_name, l_log_msg);
127          END IF;
128 
129       UPDATE AP_PAYMENT_HIST_DISTS APHD
130          SET APHD.GAIN_LOSS_INDICATOR           =
131                             DECODE(SIGN( GAIN_LOSS_TBL(I).INV_PAY_AMT-GAIN_LOSS_TBL(I).INV_MAT_AMT) --BUG 8276839
132                                 , 1, 'G'
133                                 ,-1, 'L'
134                                 , NULL)
135        WHERE APHD.ACCOUNTING_EVENT_ID           =P_XLA_EVENT_REC.EVENT_ID
136          AND APHD.INVOICE_DISTRIBUTION_ID IN
137                     (SELECT INVOICE_DISTRIBUTION_ID
138                        FROM AP_INVOICE_DISTRIBUTIONS_ALL AID
139                       WHERE AID.INVOICE_ID=GAIN_LOSS_TBL(I).INVOICE_ID) ;
140 
141         /*Commented code removed*/
142         ELSIF P_XLA_Event_Rec.Event_Type_Code IN ('PAYMENT CLEARED',
143                                                 'PAYMENT CLEARING ADJUSTED') THEN
144 
145          IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
146              l_log_msg := 'Updating Gain Loss Indicator for Events: Event_ID = ' ||
147                                    P_XLA_Event_Rec.Event_ID;
148              FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME || l_procedure_name, l_log_msg);
149          END IF;
150 
151           SELECT COUNT( * )
152             INTO l_pay_mat_count
153             FROM AP_Payment_History_All APH
154                , AP_Payment_History_All APH1
155            WHERE APH.Payment_History_Id = p_pay_hist_rec.payment_history_id
156              AND APH.Check_ID           = APH1.Check_ID
157              AND APH.Transaction_Type  IN( 'PAYMENT CLEARING', 'PAYMENT CLEARING ADJUSTED' )
158              AND APH1.Transaction_Type  = 'PAYMENT MATURITY';
159 
160               SELECT ASP.when_to_account_gain_loss
161                 INTO l_when_to_account_gain_loss
162                 FROM ap_system_parameters_all ASP
163                    , AP_Payment_History_All APH
164                WHERE APH.org_id             = ASP.org_id
165                  AND APH.Payment_History_Id = p_pay_hist_rec.payment_history_id;
166 
167 
168          IF l_pay_mat_count > 0 AND NOT (  l_when_to_account_gain_loss IS NOT NULL AND
169                   l_when_to_account_gain_loss = 'CLEARING ONLY' )  THEN  -- bug 13257091
170 
171             IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
172                 l_log_msg := 'Updating Gain Loss between maturity and clearing events';
173                 FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME || l_procedure_name, l_log_msg);
174             END IF;
175 
176           UPDATE AP_PAYMENT_HIST_DISTS APHD
177              SET APHD.GAIN_LOSS_INDICATOR       =
178                                 DECODE(SIGN( GAIN_LOSS_TBL(I).INV_MAT_AMT-GAIN_LOSS_TBL(I).INV_CLR_AMT)--BUG 8276839
179                                     ,1, 'G'
180                                     ,-1, 'L'
181                                     , NULL)
182            WHERE APHD.ACCOUNTING_EVENT_ID      =P_XLA_EVENT_REC.EVENT_ID
183              AND APHD.INVOICE_DISTRIBUTION_ID IN
184                (SELECT INVOICE_DISTRIBUTION_ID
185                  FROM AP_INVOICE_DISTRIBUTIONS_ALL AID
186                 WHERE AID.INVOICE_ID=GAIN_LOSS_TBL(I).INVOICE_ID
187                 ) ;
188         /*Commented code removed*/
189          ELSE
190 
191             IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
192                 l_log_msg := 'Updating Gain Loss between invoice/payment and clearing events';
193                 FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME || l_procedure_name, l_log_msg);
194             END IF;
195 
196             --bug 5257209
197 -- commented for the bug 13257091 and the select statement moved to above
198 
199 /*              SELECT ASP.when_to_account_gain_loss
200                 INTO l_when_to_account_gain_loss
201                 FROM ap_system_parameters_all ASP
202                    , AP_Payment_History_All APH
203                WHERE APH.org_id             = ASP.org_id
204                  AND APH.Payment_History_Id = p_pay_hist_rec.payment_history_id;
205 */
206 
207             IF (  l_when_to_account_gain_loss IS NOT NULL AND
208                   l_when_to_account_gain_loss = 'CLEARING ONLY' ) THEN
209 
210               IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
211                 l_log_msg := 'Update Gain/Loss between invoice and clearing for gain/loss at clear only';
212                 FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME || l_procedure_name, l_log_msg);
213               END IF;
214 
215               -- Bug 6678474. Backing out the fix for bug 6621586 since it is incorrect.
216                 UPDATE AP_PAYMENT_HIST_DISTS APHD
217                    SET APHD.GAIN_LOSS_INDICATOR     =
218                                         DECODE(SIGN( GAIN_LOSS_TBL(I).INV_AMT-GAIN_LOSS_TBL(I).INV_CLR_AMT) --BUG 8276839
219                                             ,1, 'G'
220                                             , -1,'L'
221                                             , NULL)
222                  WHERE APHD.ACCOUNTING_EVENT_ID=P_XLA_EVENT_REC.EVENT_ID
223                    AND APHD.INVOICE_DISTRIBUTION_ID IN
224                       (SELECT INVOICE_DISTRIBUTION_ID
225                         FROM AP_INVOICE_DISTRIBUTIONS_ALL AID
226                        WHERE AID.INVOICE_ID=GAIN_LOSS_TBL(I).INVOICE_ID) ;
227             /*Commented code removed*/
228             ELSE
229 
230                IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
231                 l_log_msg := 'Update Gain/Loss between payment and clearing for gain/loss at always';
232                 FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME || l_procedure_name, l_log_msg);
233               END IF;
234 
235               -- Bug 6678474. Backing out the fix for bug 6621586 since it is incorrect.
236               UPDATE AP_PAYMENT_HIST_DISTS APHD
237                  SET APHD.GAIN_LOSS_INDICATOR       =
238                                     DECODE(SIGN( GAIN_LOSS_TBL(I).INV_PAY_AMT-GAIN_LOSS_TBL(I).INV_CLR_AMT)--BUG 8276839
239                                         ,1 ,'G'
240                                         ,-1,'L'
241                                         , NULL)
242                WHERE APHD.ACCOUNTING_EVENT_ID       =P_XLA_EVENT_REC.EVENT_ID
243                  AND APHD.INVOICE_DISTRIBUTION_ID IN
244                        (SELECT INVOICE_DISTRIBUTION_ID
245                           FROM AP_INVOICE_DISTRIBUTIONS_ALL AID
246                          WHERE AID.INVOICE_ID=GAIN_LOSS_TBL(I).INVOICE_ID) ;
247             /*Commented code removed*/
248             END IF;
249          END IF;
250 
251       -- elsif added for bug 11721100
252       ELSIF (P_XLA_Event_Rec.Event_Type_Code IN ('PAYMENT CANCELLED','REFUND CANCELLED')
253             AND NVL(fnd_profile.value('FV_ENABLED'), 'N') = 'Y' )THEN
254 
255            IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
256               l_log_msg := 'Update Gain/Loss for Payment Cancellation';
257               FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME || l_procedure_name, l_log_msg);
258            END IF;
259 
260            UPDATE AP_PAYMENT_HIST_DISTS APHD
261               SET APHD.GAIN_LOSS_INDICATOR      =
262                              DECODE(SIGN( GAIN_LOSS_TBL(I).INV_PAY_AMT-GAIN_LOSS_TBL(I).INV_AMT)--BUG 8276839
263                                     ,  1, 'G'
264                                     , -1, 'L'
265                                     , NULL)
266             WHERE APHD.ACCOUNTING_EVENT_ID      =P_XLA_EVENT_REC.EVENT_ID
267               AND APHD.INVOICE_DISTRIBUTION_ID  IN
268                      (SELECT INVOICE_DISTRIBUTION_ID
269                         FROM AP_INVOICE_DISTRIBUTIONS_ALL AID
270                        WHERE AID.INVOICE_ID=GAIN_LOSS_TBL(I).INVOICE_ID);
271 
272       END IF;
273     /*Commented code removed*/
274     END LOOP ;
275   END IF ;
276       -- Logging Infra: Procedure level
277   IF (G_LEVEL_PROCEDURE >= G_CURRENT_RUNTIME_LEVEL ) THEN
278       l_log_msg := 'End of procedure '|| l_procedure_name;
279       FND_LOG.STRING(G_LEVEL_PROCEDURE, G_MODULE_NAME||l_procedure_name||'.end', l_log_msg);
280   END IF;
281 
282 
283 EXCEPTION
284   WHEN OTHERS THEN
285     IF (SQLCODE <> -20001) THEN
286       FND_MESSAGE.SET_NAME('SQLAP','AP_DEBUG');
287       FND_MESSAGE.SET_TOKEN('ERROR',SQLERRM);
288       FND_MESSAGE.SET_TOKEN('CALLING_SEQUENCE', l_curr_calling_sequence);
289     END IF;
290     APP_EXCEPTION.RAISE_EXCEPTION;
291 
292 END Update_Gain_Loss_Ind;
293 
294 
295 -------------------------------------------------------------------------------
296 -- PROCEDURE  Primary_Pay_Events
297 -- The purpose of this procedure is to prorate the payment amount for all the
298 -- distributions of the invoice and generate the payment history distribution.
299 --
300 --------------------------------------------------------------------------------
301 PROCEDURE Primary_Pay_Events
302      (P_XLA_Event_Rec      IN   ap_accounting_pay_pkg.r_xla_event_info
303      ,P_Calling_Sequence   IN   VARCHAR2
304      ) IS
305 
306   l_curr_calling_sequence    VARCHAR2(2000);
307   l_event_id                 NUMBER;
308   l_total_paid_amt           NUMBER;
309   l_final_payment            BOOLEAN := FALSE;
310   l_pay_history_id           NUMBER;
311   l_mat_history_id           NUMBER;
312 
313   l_inv_pay_rec            r_inv_pay_info;
314   l_pay_hist_rec           ap_accounting_pay_pkg.r_pay_hist_info;
315   l_inv_rec                ap_accounting_pay_pkg.r_invoices_info;
316   l_inv_dist_rec           ap_accounting_pay_pkg.r_inv_dist_info;
317 
318   -- Logging Infra:
319   l_procedure_name CONSTANT VARCHAR2(30) := 'Primary_Pay_Events';
320   l_log_msg        FND_LOG_MESSAGES.MESSAGE_TEXT%TYPE;
321 
322   -- bug fix 6674279
323   b_generate_pay_dist   BOOLEAN;
324   l_sum_per_event       NUMBER;
325   l_dist_count_per_event       NUMBER;
326 
327   -- bug 6900582
328   -- commented below for bug10183934
329   --l_upg_pmt_hist        NUMBER;
330   --l_upg_inv_pmts        NUMBER;
331   --l_upg_prepay_app      NUMBER;
332   l_upg_event           BOOLEAN;
333 
334   --Bug 8524600
335   l_curr_pay_awt_tot    NUMBER  :=0;
336   l_inv_time_awt        NUMBER  :=0;
337   l_inv_time_dist_total NUMBER  :=0;
338   l_inv_time_awt_tot    NUMBER  :=0;
339   l_exec_final_pay      VARCHAR2(1) := 'Y';--9962345
340   l_cross_txn_amt       NUMBER; --bug 9936620
341   l_txn_curr_code       AP_PAYMENT_HISTORY_ALL.PMT_CURRENCY_CODE%TYPE;  --11698822
342 
343   --Bug 8524600
344   -- condition: historical_flag =Y
345   --         and event is 'INVOICE ADJUSTMENT'
346   --         and ap_system_parameter.auto_offset_flag ='N'
347   --         and sum of the distributions in the invoice adjustment event is 0
348 
349   CURSOR c_sum_per_event(p_acct_event_id  NUMBER) IS
350   SELECT SUM(amount), count(1)
351     FROM ap_invoice_distributions_all aid,
352          xla_events evnt,
353          ap_system_parameters_all asp
354    WHERE aid.accounting_event_id = p_acct_event_id
355      AND aid.accounting_event_id = evnt.event_id
356      AND evnt.event_type_code in ('INVOICE ADJUSTED', 'CREDIT MEMO ADJUSTED',
357                                   'DEBIT MEMO ADJUSTED','PREPAYMENT ADJUSTED')  --7630203 12731687
358      AND aid.org_id = asp.org_id
359      AND automatic_offsets_flag = 'N'
360      AND aid.historical_flag = 'Y'
361 	 AND evnt.application_id=200;  --7623562
362 
363 
364 BEGIN
365 
366   l_curr_calling_sequence := 'AP_Acctg_Pay_Dist_Pkg.Primary_Pay_Events<- ' ||
367                                       p_calling_sequence;
368 
369 
370   -- Logging Infra: Setting up runtime level
371   G_CURRENT_RUNTIME_LEVEL := FND_LOG.G_CURRENT_RUNTIME_LEVEL;
372 
373   -- Logging Infra: Procedure level
374   IF (G_LEVEL_PROCEDURE >= G_CURRENT_RUNTIME_LEVEL ) THEN
375       l_log_msg := 'Begin of procedure '|| l_procedure_name;
376       FND_LOG.STRING(G_LEVEL_PROCEDURE, G_MODULE_NAME||l_procedure_name||'.begin', l_log_msg);
377   END IF;
378 
379 
380   OPEN Payment_History(P_XLA_Event_Rec.Event_ID);
381   FETCH Payment_History INTO l_pay_hist_rec;
382   CLOSE Payment_History;
383 
384 
385   IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
386       l_log_msg := 'CUR: Payment_History: Payment_History_ID = '||
387                     l_pay_hist_rec.payment_history_id ||
388                     'and event type for payment is: ' ||
389                     P_XLA_Event_Rec.Event_Type_Code;
390       FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME || l_procedure_name, l_log_msg);
391   END IF;
392 
393   /* We need payment hist information for the prior events in order
394      to calculate the base amounts for the prior events using the
395      exchange rate info from the payment hist table */
396 
397   -- Null out Global Variable 9849243 start
398   ap_accounting_pay_pkg.g_mat_to_base_xrate_type := NULL;
399   ap_accounting_pay_pkg.g_mat_to_base_xrate_date := NULL;
400   ap_accounting_pay_pkg.g_mat_to_base_xrate := NULL; -- 9849243 End
401 
402   --11698822, added l_txn_curr_code
403   IF (P_XLA_Event_Rec.Event_Type_Code IN ('PAYMENT MATURED')) THEN
404 
405       IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
406         l_log_msg := 'inside logic of payment matured event and event type'||
407                     P_XLA_Event_Rec.Event_Type_Code;
408         FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME || l_procedure_name, l_log_msg);
409       END IF;
410 
411       SELECT APH.Payment_History_ID,
412              APH.Pmt_To_Base_XRate_Type,
413              APH.Pmt_To_Base_XRate_Date,
414              APH.Pmt_To_Base_XRate
415       INTO   l_pay_history_id,
416              ap_accounting_pay_pkg.g_pmt_to_base_xrate_type,
417              ap_accounting_pay_pkg.g_pmt_to_base_xrate_date,
418              ap_accounting_pay_pkg.g_pmt_to_base_xrate
419       FROM   AP_Payment_History_All APH
420       WHERE  APH.Payment_History_ID =
421                         (SELECT MAX(APH1.Payment_History_ID)
422                          FROM   AP_Payment_History_All APH1
423                          WHERE  APH1.Check_ID = p_xla_event_rec.source_id_int_1
424                          AND    APH1.Transaction_Type IN ('PAYMENT CREATED', 'REFUND RECORDED'));
425 
426 
427       IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
428           l_log_msg := 'Payment_History_ID for payment = '|| l_pay_history_id
429                        || 'ap_accounting_pay_pkg.g_pmt_to_base_xrate_type'
430                        || ap_accounting_pay_pkg.g_pmt_to_base_xrate_type
431                        || 'ap_accounting_pay_pkg.g_pmt_to_base_xrate_date'
432                        || ap_accounting_pay_pkg.g_pmt_to_base_xrate_date
433                        || 'ap_accounting_pay_pkg.g_pmt_to_base_xrate'
434                        || ap_accounting_pay_pkg.g_pmt_to_base_xrate;
435 
436           FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME || l_procedure_name, l_log_msg);
437       END IF;
438 
439       ap_accounting_pay_pkg.g_pay_pmt_history_id := l_pay_history_id;
440 
441       ap_accounting_pay_pkg.g_mat_pmt_history_id := l_pay_hist_rec.payment_history_id;
442       ap_accounting_pay_pkg.g_mat_to_base_xrate_type :=
443                                 l_pay_hist_rec.pmt_to_base_xrate_type;
444       ap_accounting_pay_pkg.g_mat_to_base_xrate_date :=
445                                 l_pay_hist_rec.pmt_to_base_xrate_date;
446       ap_accounting_pay_pkg.g_mat_to_base_xrate := l_pay_hist_rec.pmt_to_base_xrate;
447       l_txn_curr_code := l_pay_hist_rec.pmt_currency_code;
448 
449       IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
450           l_log_msg := 'After assign maturity related global variables and ' ||
451                        'ap_accounting_pay_pkg.g_pay_pmt_history_id '||
452                        ap_accounting_pay_pkg.g_pay_pmt_history_id ||
453                        'ap_accounting_pay_pkg.g_mat_to_base_xrate_type' ||
454                        ap_accounting_pay_pkg.g_mat_to_base_xrate_type ||
455                        'ap_accounting_pay_pkg.g_mat_to_base_xrate_date' ||
456                        ap_accounting_pay_pkg.g_mat_to_base_xrate_date ||
457                        'ap_accounting_pay_pkg.g_mat_to_base_xrate' ||
458                        ap_accounting_pay_pkg.g_mat_to_base_xrate;
459 
460           FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME || l_procedure_name, l_log_msg);
461       END IF;
462 
463   ELSIF (P_XLA_Event_Rec.Event_Type_Code IN ('PAYMENT CLEARED')) THEN
464 
465       IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
466         l_log_msg := 'inside logic of payment cleared event and event type'||
467                     P_XLA_Event_Rec.Event_Type_Code;
468         FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME || l_procedure_name, l_log_msg);
469       END IF;
470 
471       SELECT APH.Payment_History_ID,
472              APH.Pmt_To_Base_XRate_Type,
473              APH.Pmt_To_Base_XRate_Date,
474              APH.Pmt_To_Base_XRate
475       INTO   l_pay_history_id,
476              ap_accounting_pay_pkg.g_pmt_to_base_xrate_type,
477              ap_accounting_pay_pkg.g_pmt_to_base_xrate_date,
478              ap_accounting_pay_pkg.g_pmt_to_base_xrate
479       FROM   AP_Payment_History_All APH
480       WHERE  APH.Payment_History_ID =
481                         (SELECT MAX(APH1.Payment_History_ID)
482                          FROM   AP_Payment_History_All APH1
483                          WHERE  APH1.Check_ID = p_xla_event_rec.source_id_int_1
484                          AND    APH1.Transaction_Type IN ('PAYMENT CREATED', 'REFUND RECORDED'));
485 
486       IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
487           l_log_msg := 'Payment_History_ID for payment = '
488                        || l_pay_history_id
489                        || 'Payment_History_ID for maturity ='
490                        || l_mat_history_id;
491           FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME || l_procedure_name, l_log_msg);
492       END IF;
493 
494       SELECT MAX(APH.Payment_History_ID)
495       INTO   l_mat_history_id
496       FROM   AP_Payment_History_All APH
497       WHERE  APH.Check_ID = p_xla_event_rec.source_id_int_1
498       AND    APH.Transaction_Type IN ('PAYMENT MATURITY');
499 
500 
501       IF l_mat_history_id IS NOT NULL THEN
502 
503          SELECT APH.Pmt_To_Base_XRate_Type,
504                 APH.Pmt_To_Base_XRate_Date,
505                 APH.Pmt_To_Base_XRate
506          INTO   ap_accounting_pay_pkg.g_mat_to_base_xrate_type,
507                 ap_accounting_pay_pkg.g_mat_to_base_xrate_date,
508                 ap_accounting_pay_pkg.g_mat_to_base_xrate
509          FROM   AP_Payment_History_All APH
510          WHERE  APH.Payment_History_ID = l_mat_history_id;
511 
512       END IF;
513 
514 
515       ap_accounting_pay_pkg.g_pay_pmt_history_id := l_pay_history_id;
516       ap_accounting_pay_pkg.g_mat_pmt_history_id := l_mat_history_id;
517 
518       ap_accounting_pay_pkg.g_clr_pmt_history_id := l_pay_hist_rec.payment_history_id;
519       ap_accounting_pay_pkg.g_clr_to_base_xrate_type :=
520                                 l_pay_hist_rec.pmt_to_base_xrate_type;
521       ap_accounting_pay_pkg.g_clr_to_base_xrate_date :=
522                                 l_pay_hist_rec.pmt_to_base_xrate_date;
523       ap_accounting_pay_pkg.g_clr_to_base_xrate := l_pay_hist_rec.pmt_to_base_xrate;
524       --l_txn_curr_code := l_pay_hist_rec.bank_currency_code;
525       IF ( l_pay_hist_rec.pmt_currency_code <> l_pay_hist_rec.bank_currency_code
526            AND l_pay_hist_rec.bank_currency_code is not NULL )  THEN	--   12328487
527 		    l_txn_curr_code := l_pay_hist_rec.pmt_currency_code;
528        ELSE  l_txn_curr_code := l_pay_hist_rec.bank_currency_code;
529       END IF; --l_pay_hist_rec.pmt_currency_code <> l_pay_hist_rec.bank_currency_code
530 
531       IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
532           l_log_msg := 'after set clearing global varaiables, they are'||
533                         'ap_accounting_pay_pkg.g_pay_pmt_history_id=' ||
534                          ap_accounting_pay_pkg.g_pay_pmt_history_id ||
535                         'ap_accounting_pay_pkg.g_mat_pmt_history_id =' ||
536                         ap_accounting_pay_pkg.g_mat_pmt_history_id ||
537                         ' ap_accounting_pay_pkg.g_clr_pmt_history_id =' ||
538                          ap_accounting_pay_pkg.g_clr_pmt_history_id  ||
539                         'ap_accounting_pay_pkg.g_clr_to_base_xrate_type=' ||
540                         ap_accounting_pay_pkg.g_clr_to_base_xrate_type ||
541                         'ap_accounting_pay_pkg.g_clr_to_base_xrate_date=' ||
542                         ap_accounting_pay_pkg.g_clr_to_base_xrate_date ||
543                         'ap_accounting_pay_pkg.g_clr_to_base_xrate=' ||
544                         ap_accounting_pay_pkg.g_clr_to_base_xrate;
545 
546           FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME || l_procedure_name, l_log_msg);
547       END IF;
548 
549   ELSE
550 
551       IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
552         l_log_msg := 'inside logic of other payment event and event type'||
553                      P_XLA_Event_Rec.Event_Type_Code;
554         FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME || l_procedure_name, l_log_msg);
555       END IF;
556 
557       ap_accounting_pay_pkg.g_pay_pmt_history_id := l_pay_hist_rec.payment_history_id;
558       ap_accounting_pay_pkg.g_pmt_to_base_xrate_type :=
559                                 l_pay_hist_rec.pmt_to_base_xrate_type;
560       ap_accounting_pay_pkg.g_pmt_to_base_xrate_date :=
561                                 l_pay_hist_rec.pmt_to_base_xrate_date;
562       ap_accounting_pay_pkg.g_pmt_to_base_xrate := l_pay_hist_rec.pmt_to_base_xrate;
563       l_txn_curr_code := l_pay_hist_rec.pmt_currency_code;
564 
565       IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
566           l_log_msg := 'Payment_History_ID for payment = '||
567                                         l_pay_hist_rec.payment_history_id;
568           FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME || l_procedure_name, l_log_msg);
569       END IF;
570 
571   END IF;
572 
573 
574   -- Bug6900582
575   -- Get the count of historical payment history records for this check.
576   -- We should not do final and total rounding for payments that have been
577   -- upgraded to R12, since during upgrade the amounts are not populated for
578   -- some exchange rates in the ap_payment_hist_dists table and trying to
579   -- calculate the rounding for such payments will result in incorrect
580   -- accounting.
581   --
582   -- Bug 9492002, added the Join with XAH/ASP so as to ensure that
583   -- event has been Marked as P with Accounting Lines in R12
584   --
585 
586   -- commenting below for bug10183934
587   --SELECT count(*)
588   --INTO   l_upg_pmt_hist
589   --FROM   AP_Payment_History_All APH,
590   --       AP_System_Parameters_ALL ASP,
591   --       XLA_AE_Headers XAH
592   --WHERE  APH.Check_ID = p_xla_event_rec.source_id_int_1
593   --AND    APH.Historical_Flag = 'Y'
594   --AND    APH.Posted_Flag = 'Y'
595   --AND    APH.Org_ID = ASP.Org_ID
596   --AND    APH.Accounting_Event_ID = XAH.Event_ID
597   --AND    XAH.Ledger_id = ASP.Set_Of_Books_ID
598   --AND    XAH.Application_ID = 200
599   --AND    XAH.Accounting_Entry_Status_Code = 'F'
600   --AND    XAH.upg_batch_id IS NOT NULL
601   --AND    XAH.upg_batch_id <> -9999;
602 
603 
604   /* For Clearing and Maturity events we need to get all the invoice payments, but for the
605      Payment event we only need to get the invoice payments stamped with that event id */
606 
607   IF (P_XLA_Event_Rec.Event_Type_Code IN ('PAYMENT CLEARED', 'PAYMENT MATURED')) THEN
608       OPEN Clrg_Invoice_Payments(P_XLA_Event_Rec.Source_ID_Int_1);
609   ELSE
610       OPEN Invoice_Payments(P_XLA_Event_Rec.Event_ID);
611   END IF;
612 
613   LOOP
614 
615       IF (P_XLA_Event_Rec.Event_Type_Code IN ('PAYMENT CLEARED', 'PAYMENT MATURED')) THEN
616            FETCH Clrg_Invoice_Payments INTO l_inv_pay_rec;
617            EXIT WHEN Clrg_Invoice_Payments%NOTFOUND OR
618                      Clrg_Invoice_Payments%NOTFOUND IS NULL;
619 
620            IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
621                l_log_msg := 'loop through CUR: Clrg_Invoice_Payments: Invoice_ID = '||
622                                         l_inv_pay_rec.invoice_id;
623                FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME || l_procedure_name, l_log_msg);
624            END IF;
625 
626       ELSE
627            FETCH Invoice_Payments INTO l_inv_pay_rec;
628            EXIT WHEN Invoice_Payments%NOTFOUND OR
629                      Invoice_Payments%NOTFOUND IS NULL;
630 
631            IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
632                l_log_msg := 'loop through CUR: Invoice_Payments: Invoice_ID = '||
633                                         l_inv_pay_rec.invoice_id;
634                FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME || l_procedure_name, l_log_msg);
635            END IF;
636 
637       END IF;
638 
639 
640        OPEN Invoice_Header(l_inv_pay_rec.invoice_id);
641        FETCH Invoice_Header INTO l_inv_rec;
642        CLOSE Invoice_Header;
643 
644        IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
645            l_log_msg := 'inside payment cursor loop, after open CUR:Invoice_Header: Invoice_ID= '
646                          || l_inv_rec.invoice_id;
647            FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME || l_procedure_name, l_log_msg);
648        END IF;
649 
650        --bug 9936620
651        IF (l_inv_rec.invoice_currency_code <> l_inv_rec.payment_currency_code) THEN
652            l_cross_txn_amt := GL_Currency_API.Convert_Amount(
653                                 l_inv_rec.invoice_currency_code,
654                                 l_inv_rec.payment_currency_code,
655                                 l_inv_rec.payment_cross_rate_date,
656                                 'EMU FIXED',
657                                 l_inv_pay_rec.amount);
658            IF l_cross_txn_amt IS NULL THEN
659               RAISE_APPLICATION_ERROR(-20100, 'null_derive_factor');
660            END IF;
661        END IF;
662 
663        -- Bug 6900582. While upgrading the payment hist dists table during R12
664        -- upgrade, the invoice, paid, matured and cleared base amounts are not
665        -- populated since the exchange rates are not available in a single table
666        -- and even if we can get exchange rates there is no guarantee that the
667        -- amounts are equal to the accounted amounts due to proration.
668 
669        -- In order to fix bug 6900582, when there is a partial payment to an
670        -- invoice and the invoice has upgraded payments or when an upgraded
671        -- payment is matured or cleared, we will not calculate the final payment
672        -- rounding or any other roundings to avoid creating huge gain and loss.
673 
674        -- If there is a rounding due to proration, instead of rounding the
675        -- the difference can go to gain loss account.
676 
677        -- Bug 9492002, added the Join with XAH and ASP in the subquery so as to
678        -- ensure that the event has been Accounted in R12
679        --
680        -- commented below for bug10183934
681        --SELECT count(*)
682        --INTO   l_upg_inv_pmts
683        --FROM   AP_Invoice_Payments_All AIP
684        --WHERE  Invoice_ID = l_inv_pay_rec.invoice_id
685        --AND    EXISTS (SELECT 'Upg Payment'
686        --               FROM   AP_Payment_History_All APH,
687        --                      AP_System_Parameters_All ASP,
688        --                      XLA_AE_Headers XAH
689        --               WHERE  APH.Check_ID = AIP.Check_ID
690        --               AND    APH.Historical_Flag = 'Y'
691        --               AND    APH.Posted_Flag = 'Y'
692        --               AND    APH.Org_id = ASP.Org_id
693        --               AND    APH.Accounting_Event_ID = XAH.Event_ID
694        --               AND    XAH.Ledger_id = ASP.Set_of_Books_ID
695        --               AND    XAH.Application_ID = 200
696        --               AND    XAH.Accounting_Entry_Status_Code = 'F'
697        --               AND    XAH.Upg_Batch_ID <> -9999
698        --               AND    XAH.Upg_Batch_ID IS NOT NULL
699        --               AND    Rownum = 1);
700 
701       -- Bug9492002, checking if there are any upgaded prepay applications
702       -- or Unapplication for the Invoice, which are Historical and have
703       -- been accounted in 11i
704       --
705       -- commented below for bug10183934
706       --SELECT count(*)
707       --  INTO l_upg_prepay_app
708       --  FROM AP_Invoice_Distributions_ALL AID,
709       --       XLA_AE_Headers XAH
710       -- WHERE AID.accounting_event_id = XAH.Event_ID
711       --   AND XAH.Application_ID = 200
712       --   AND XAH.Event_type_Code IN ('PREPAYMENT APPLIED', 'PREPAYMENT UNAPPLIED')
713       --   AND XAH.Upg_batch_ID IS NOT NULL
714       --   AND XAH.Upg_batch_ID <> -9999
715       --   AND XAH.Ledger_ID = AID.Set_of_Books_ID
716       --   AND XAH.Accounting_Entry_Status_Code = 'F'
717       --   AND NVL(AID.Historical_Flag, 'N') = 'Y'
718       --   AND AID.Invoice_id = l_inv_pay_rec.Invoice_id
719       --   AND rownum = 1;
720 
721       -- commented below condition for bug10183934
722       -- IF l_upg_inv_pmts = 0 AND l_upg_prepay_app = 0 THEN
723           /* Check if the invoice is fully paid */
724       -- bug 9850638, removed change for bug 8987496, l_inv_pay_rec.amount <> 0
725       -- 9011207 Added l_count_bank_curr to the condition
726       -- bug 9108925, added the call to Is_Final_Event
727 	  IF AP_Accounting_Pay_Pkg.Is_Final_Payment
728 						 (l_inv_rec,
729 						  l_inv_pay_rec.amount,
730 						  l_inv_pay_rec.discount_taken,
731 						  0, -- prepay amount
732 						  p_xla_event_rec.event_type_code,
733 						  l_curr_calling_sequence) THEN
734 		 IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
735 			l_log_msg := 'Final payment of Invoice_ID '||l_inv_rec.invoice_id;
736 			FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME || l_procedure_name, l_log_msg);
737 		  END IF;
738 
739 		  l_final_payment := AP_ACCOUNTING_PAY_PKG.Is_Final_Event
740 							 (l_inv_rec,
741 							  p_xla_event_rec,
742 							  NULL,
743 							  l_curr_calling_sequence);
744 	  ELSE
745 		 IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
746 			l_log_msg := 'Not final payment of Invoice_ID '||l_inv_rec.invoice_id;
747 			FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME || l_procedure_name, l_log_msg);
748 		 END IF;
749 		 l_final_payment := FALSE;
750 	  END IF;
751 	 -- bug7247744
752 
753        IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
754           IF l_final_payment THEN
755              l_log_msg := 'Final pay/prepay event for Invoice_ID '||l_inv_rec.invoice_id;
756           ELSE
757              l_log_msg := 'Not final pay/prepay event for Invoice_ID '||l_inv_rec.invoice_id;
758           END IF;
759           FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME || l_procedure_name, l_log_msg);
760        END IF;
761 
762        --bug 9962345, modified the logic implemented in bug 9011207
763        --and moved it to after determination of l_final_payment.
764        --Final payment logic will not be applied to payment clearing events
765        --if at least two unreversed clearing transactions exist with different
766        --pay or clearing exchange rates
767        IF (P_XLA_Event_Rec.Event_Type_Code IN ('PAYMENT CLEARED')
768                                       AND l_final_payment = TRUE) THEN
769            BEGIN
770 	      SELECT 'N'
771               INTO l_exec_final_pay
772               FROM dual
773               WHERE EXISTS(
774                     SELECT 'Unreversed clearing txns with different xrates'
775                     FROM ap_payment_history_all aph,
776                          ap_invoice_payments_all aip
777                     WHERE aip.invoice_id     = l_inv_pay_rec.invoice_id
778                     AND aip.check_id         = aph.check_id
779                     AND aph.transaction_type = 'PAYMENT CLEARING'
780                     AND EXISTS(
781                         SELECT 'Unreversed clearing txn with different xrate'
782                         FROM ap_payment_history_all aph_sub,
783                              ap_invoice_payments_all aip_sub
784                         WHERE aip_sub.invoice_id                 = aip.invoice_id
785                         AND aip_sub.check_id                     = aph_sub.check_id
786                         AND aph_sub.check_id                    <> aph.check_id
787                         AND aph_sub.transaction_type             = 'PAYMENT CLEARING'
788                         AND (NVL(aph_sub.bank_to_base_xrate, -1) <> NVL(aph.bank_to_base_xrate, -1)
789                              OR NVL(aph_sub.pmt_to_base_xrate, -1) <> NVL(aph.pmt_to_base_xrate, -1))
790                         AND aph_sub.rev_pmt_hist_id             IS NULL
791                         AND NOT EXISTS(
792                                 SELECT 'reversal txn'
793                                 FROM ap_payment_history_all aph_rev
794                                 WHERE aph_rev.REV_PMT_HIST_ID = aph_sub.payment_history_id)));
795            EXCEPTION
796               WHEN OTHERS THEN
797                  l_exec_final_pay := 'Y';
798            END;
799 
800            IF l_exec_final_pay = 'N' THEN
801               l_final_payment := FALSE;
802 
803               IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
804                  l_log_msg := 'Not executing final pay logic for the current clearing txn';
805                  FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME || l_procedure_name, l_log_msg);
806               END IF;
807            END IF;
808        END IF ;
809        --9962345 end
810 
811        IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
812          l_log_msg := 'Ready to open Invoice_Dists cursor after final payment check';
813          FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME || l_procedure_name, l_log_msg);
814        END IF;
815 
816        -- Perfomance Fix 7308385
817        -- Same query is used 3 different places in Pkg. when
818        -- ever the query is modified pls do the same in reamining 2 places.
819        -- Bug 7636427 Start
820       SELECT SUM(decode(aid.prepay_tax_parent_id, NULL, nvl(aid.amount, 0), 0)),
821              SUM(decode(aid.line_type_lookup_code, 'AWT', 0, nvl(aid.amount, 0))),
822 	     SUM(decode(aid.awt_invoice_payment_id, Null, nvl(aid.amount, 0),0)),
823 	     SUM(decode(aid.awt_invoice_payment_id, Null, 0,nvl(aid.amount, 0))),
824 	     SUM(decode(aid.line_type_lookup_code, 'AWT',decode(aid.awt_invoice_payment_id, Null, nvl(aid.amount, 0),0), 0))
825         INTO G_Total_Dist_Amount,
826 	     G_Proration_Divisor,
827 	     l_inv_time_dist_total,
828 	     l_curr_pay_awt_tot,
829 	     l_inv_time_awt_tot
830         FROM ap_invoice_distributions_all aid
831        WHERE aid.invoice_id = l_inv_pay_rec.invoice_id
832          AND aid.line_type_lookup_code <> 'PREPAY'
833          AND aid.prepay_distribution_id IS NULL
834          AND (aid.awt_invoice_payment_id IS NULL    OR
835               aid.awt_invoice_payment_id = l_inv_pay_rec.invoice_payment_id) -- bug fix: 6725866
836          AND NOT EXISTS
837               (SELECT 1 FROM xla_events
838                WHERE event_id = aid.accounting_event_id
839                AND application_id = 200
840                AND event_type_code IN('INVOICE CANCELLED', 'PREPAYMENT CANCELLED',
841                       'CREDIT MEMO CANCELLED', 'DEBIT MEMO CANCELLED'));
842 -- Bug 8524600
843 
844         l_curr_pay_awt_tot:= nvl(l_curr_pay_awt_tot,0);
845         l_inv_time_awt_tot:= nvl(l_inv_time_awt_tot,0);
846         l_inv_time_dist_total:= nvl(l_inv_time_dist_total,0);
847 
848         if (l_inv_time_dist_total <> 0 ) then
849 		G_Pay_AWT_Total_Amt    := nvl(l_curr_pay_awt_tot,0)
850 			+ nvl( (l_inv_time_awt_tot
851 			/  l_inv_time_dist_total
852 			* (GL_Currency_API.Convert_Amount(
853 				l_inv_rec.payment_currency_code,
854 				l_inv_rec.invoice_currency_code,
855 				l_inv_rec.payment_cross_rate_date,
856 				'EMU FIXED',
857 				l_inv_pay_rec.amount)-l_curr_pay_awt_tot)),0);
858 	else
859 	    G_Pay_AWT_Total_Amt := nvl(l_curr_pay_awt_tot,0) + nvl(l_inv_time_awt_tot,0);
860 	end if;
861 	-- Bug 7636427 End
862         -- Bug 8524600 End
863 
864 
865       --Bug 8202856.  Find the last distribution for which discount will be calculated.
866       --This is necessary where some distributions are excluded from the discount calculation.
867       --This one will be adjusted to compensate for rounding differences.
868 
869       IF l_inv_pay_rec.Discount_Taken > 0 AND (l_inv_rec.Disc_Is_Inv_Less_Tax_Flag = 'Y'
870                 OR  l_inv_rec.Exclude_Freight_From_Discount = 'Y') THEN
871 
872       --Exception handling added for bug 8406754
873       BEGIN
874 
875         SELECT Sub.Invoice_Distribution_ID
876         INTO G_Last_NonExcluded_Dist_ID
877         FROM     (SELECT AID.Invoice_Distribution_ID
878             FROM   AP_Invoice_Distributions_All AID,
879             Financials_System_Params_All FSP,
880             AP_Invoices_All AI,
881             AP_System_Parameters_All ASP
882             WHERE  AID.Invoice_ID = l_inv_rec.Invoice_ID
883             AND    AI.Invoice_ID = AID.Invoice_ID
884             AND    ASP.Org_ID = AI.Org_ID
885             AND    AID.Line_Type_Lookup_Code NOT IN ('PREPAY', 'ERV', 'TERV'
886             , 'AWT'  --Pay_Dist_Discount is only called for non-AWT line types
887             , decode(AI.Exclude_Freight_From_Discount,'Y', 'FREIGHT', 'DUMMY')
888             , decode(NVL(AI.Disc_Is_Inv_Less_Tax_Flag, ASP.Disc_Is_Inv_Less_Tax_Flag)
889                     , 'Y', 'TRV', 'DUMMY')
890             , decode(NVL(AI.Disc_Is_Inv_Less_Tax_Flag, ASP.Disc_Is_Inv_Less_Tax_Flag)
891                     , 'Y', 'TIPV', 'DUMMY')
892             , decode(NVL(AI.Disc_Is_Inv_Less_Tax_Flag, ASP.Disc_Is_Inv_Less_Tax_Flag)
893                     , 'Y', 'NONREC_TAX', 'DUMMY')
894             , decode(NVL(AI.Disc_Is_Inv_Less_Tax_Flag, ASP.Disc_Is_Inv_Less_Tax_Flag)
895                     , 'Y', 'REC_TAX', 'DUMMY')
896             )
897             AND    AID.Prepay_Distribution_ID IS NULL
898             AND    AID.Prepay_Tax_Parent_ID IS NULL  -- For tax dists created in R11.5
899             AND    AID.Org_ID = FSP.Org_ID
900             AND NOT EXISTS (SELECT 1
901                 FROM   xla_events
902                 WHERE  event_id = AID.accounting_event_id
903                 AND    application_id = 200 --bug 7308385
904                 AND    event_type_code IN ('INVOICE CANCELLED', 'PREPAYMENT CANCELLED',
905                 'CREDIT MEMO CANCELLED',
906                 'DEBIT MEMO CANCELLED'))
907             AND  ((NVL(FSP.Purch_Encumbrance_Flag,'N') = 'N'
908                     AND AID.Match_Status_Flag IN ('T','A'))
909                 OR
910                 ((NVL(FSP.Purch_Encumbrance_Flag,'N') = 'Y'
911                 AND AID.Match_Status_Flag = 'A')))
912             ORDER  BY abs(AID.Amount) desc, AID.Invoice_Distribution_ID desc) Sub
913         WHERE rownum = 1;
914 
915 	EXCEPTION
916 
917 	WHEN OTHERS THEN
918         G_Last_NonExcluded_Dist_ID := 0;
919 
920 	END;
921 
922       END IF;
923 
924 
925        OPEN Invoice_Dists(l_inv_pay_rec.invoice_id);
926        LOOP
927 
928             FETCH Invoice_Dists INTO l_inv_dist_rec;
929             EXIT WHEN Invoice_Dists%NOTFOUND OR
930                       Invoice_Dists%NOTFOUND IS NULL;
931 
932 
933             IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
934                 l_log_msg := 'Loop start for cur Invoice_Dists : Invoice_Dists: Invoice_Distribution_ID = '
935                                      ||l_inv_dist_rec.invoice_distribution_id;
936       	        FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME || l_procedure_name, l_log_msg);
937             END IF;
938 
939 
940             IF (G_LEVEL_PROCEDURE >= G_CURRENT_RUNTIME_LEVEL ) THEN
941                 l_log_msg := 'Calling procedure Pay_Dist_Proc for dist: '
942                                   || l_inv_dist_rec.invoice_distribution_id;
943                 FND_LOG.STRING(G_LEVEL_PROCEDURE, G_MODULE_NAME||l_procedure_name, l_log_msg);
944             END IF;
945 
946             -- bugfix 6674279
947             -- for upgraded invoice adjustment event, if the distributions in the adjustment event
948             -- have sum amount of 0, then don't create the payment distribution, this will avoid the
949             -- accounting failure when payment liability line using Business flow to derive the
950             -- accounting ccid from invoice liability as for such case in 11i, there is no liability
951             -- accounting line generated.
952 
953             -- condition: historical_flag =Y
954             --         and event is 'INVOICE ADJUSTED'
955             --         and ap_system_parameter.auto_offset_flag ='N'
956             --         and sum of the distributions in the invoice adjustment event is 0
957 
958             b_generate_pay_dist := TRUE;
959             IF  l_inv_dist_rec.historical_flag ='Y' THEN
960               OPEN c_sum_per_event(l_inv_dist_rec.accounting_event_id);
961               FETCH c_sum_per_event into l_sum_per_event, l_dist_count_per_event;
962 
963               -- > 0 case is to handled the case that only  1 line in adjustment event and itself amount is 0
964               If l_dist_count_per_event > 0 AND l_sum_per_event = 0 THEN
965                 b_generate_pay_dist := FALSE;
966               END IF;
967 
968               CLOSE c_sum_per_event;
969 
970             END IF;
971 
972             IF b_generate_pay_dist AND
973                ((l_inv_dist_rec.awt_invoice_payment_id IS NULL) OR
974                (l_inv_dist_rec.awt_invoice_payment_id = l_inv_pay_rec.invoice_payment_id)) THEN
975               -- Create awt distributions only when the awt is created during invoice time or
976               -- if the awt is created during the payment time then only those awt distributions
977               -- created during this payment
978                -- Create cash distribution lines
979                Pay_Dist_Proc(p_xla_event_rec,
980                              l_inv_pay_rec,
981                              l_pay_hist_rec,
982                              l_inv_rec,
983                              l_inv_dist_rec,
984                              'P',
985                              l_final_payment,
986                              l_curr_calling_sequence);
987             END IF;
988 
989 
990             IF (G_LEVEL_PROCEDURE >= G_CURRENT_RUNTIME_LEVEL ) THEN
991                 l_log_msg := 'Inside loop Invoice_Dists: After Procedure Pay_Dist_Proc executed';
992                 FND_LOG.STRING(G_LEVEL_PROCEDURE, G_MODULE_NAME||l_procedure_name, l_log_msg);
993             END IF;
994 
995        END LOOP;
996        CLOSE Invoice_Dists;
997 
998        IF (G_LEVEL_PROCEDURE >= G_CURRENT_RUNTIME_LEVEL ) THEN
999          l_log_msg := 'cursor Invoice_Dists is closed ';
1000          FND_LOG.STRING(G_LEVEL_PROCEDURE, G_MODULE_NAME||l_procedure_name, l_log_msg);
1001        END IF;
1002 
1003        G_Total_Dist_Amt := 0;
1004        G_Total_Prorated_Amt := 0;
1005        G_Total_Prorated_Disc_Amt := 0;
1006        G_Total_Inv_Dist_Amt := 0;
1007        G_Total_Inv_Dist_Disc_Amt := 0;
1008        G_Total_Bank_Curr_Amt := 0;
1009        G_Total_Bank_Curr_Disc_Amt := 0;
1010        G_Last_NonExcluded_Dist_ID := 0; --Bug 8202856
1011 
1012 
1013        IF (G_LEVEL_PROCEDURE >= G_CURRENT_RUNTIME_LEVEL ) THEN
1014            l_log_msg := 'Calling procedure P_Acctg_Pay_Round_Pkg.Do_Rounding for Invoice_ID: '
1015                                     || l_inv_rec.invoice_id;
1016            FND_LOG.STRING(G_LEVEL_PROCEDURE, G_MODULE_NAME||l_procedure_name, l_log_msg);
1017        END IF;
1018 
1019 
1020        -- Bug 6900582. Do not do rounding calculation if the payment is upgraded
1021        -- or invoice has other upgraded payments
1022        --
1023        -- Bug 9492002. Do not do rounding calculations if the invoice being paid
1024        -- has an Upgraded prepayment Applications
1025        --
1026        -- commenting this for the bug10183934
1027        --IF l_upg_inv_pmts = 0 AND
1028        --   l_upg_pmt_hist = 0 AND
1029        --   l_upg_prepay_app = 0 THEN
1030 
1031           -- Create total and final rounding lines
1032           AP_Acctg_Pay_Round_Pkg.Do_Rounding
1033                      (p_xla_event_rec,
1034                       l_pay_hist_rec,
1035                       NULL, -- clr hist rec
1036                       l_inv_rec,
1037                       l_inv_pay_rec,
1038                       NULL, -- prepay inv rec
1039                       NULL, -- prepay hist rec
1040                       NULL, -- prepay dist rec
1041                       l_curr_calling_sequence);
1042 
1043        --END IF;
1044 
1045        IF (G_LEVEL_PROCEDURE >= G_CURRENT_RUNTIME_LEVEL ) THEN
1046            l_log_msg := 'Procedure P_Acctg_Pay_Round_Pkg.Do_Rounding executed';
1047            FND_LOG.STRING(G_LEVEL_PROCEDURE, G_MODULE_NAME||l_procedure_name, l_log_msg);
1048        END IF;
1049 
1050         l_final_payment := FALSE; --9011207 Resetting the flag
1051 
1052   END LOOP;
1053 
1054   IF (P_XLA_Event_Rec.Event_Type_Code IN ('PAYMENT CLEARED', 'PAYMENT MATURED')) THEN
1055     CLOSE Clrg_Invoice_Payments;
1056     IF (G_LEVEL_PROCEDURE >= G_CURRENT_RUNTIME_LEVEL ) THEN
1057       l_log_msg := 'after close cursor Clrg_Invoice_Payments ';
1058       FND_LOG.STRING(G_LEVEL_PROCEDURE, G_MODULE_NAME||l_procedure_name, l_log_msg);
1059     END IF;
1060   ELSE
1061     CLOSE Invoice_Payments;
1062     IF (G_LEVEL_PROCEDURE >= G_CURRENT_RUNTIME_LEVEL ) THEN
1063       l_log_msg := 'after close cursor Invoice_Payment ';
1064       FND_LOG.STRING(G_LEVEL_PROCEDURE, G_MODULE_NAME||l_procedure_name, l_log_msg);
1065     END IF;
1066   END IF;
1067 
1068 
1069   IF l_pay_hist_rec.Errors_Bank_Amount <> 0 THEN
1070 
1071      IF (G_LEVEL_PROCEDURE >= G_CURRENT_RUNTIME_LEVEL ) THEN
1072          l_log_msg := 'Calling procedure Pay_Dist_Err_Chrg for errors bank amount and '
1073                       || 'l_pay_hist_rec.Errors_Bank_Amount'
1074                       || l_pay_hist_rec.Errors_Bank_Amount;
1075          FND_LOG.STRING(G_LEVEL_PROCEDURE, G_MODULE_NAME||l_procedure_name, l_log_msg);
1076      END IF;
1077 
1078 
1079      -- Create error distribution lines
1080      --bug 5659368
1081      Pay_Dist_Err_Chrg
1082           ( p_xla_event_rec     => p_xla_event_rec
1083             ,p_pay_hist_rec     => l_pay_hist_rec
1084             ,p_distribute_mode  => 'BANK_ERROR'
1085             ,p_calling_sequence => l_curr_calling_sequence);
1086 
1087      IF (G_LEVEL_PROCEDURE >= G_CURRENT_RUNTIME_LEVEL ) THEN
1088          l_log_msg := 'Procedure Pay_Dist_Err_Chrg for errors bank amount executed';
1089          FND_LOG.STRING(G_LEVEL_PROCEDURE, G_MODULE_NAME||l_procedure_name, l_log_msg);
1090      END IF;
1091 
1092   END IF;
1093 
1094   IF l_pay_hist_rec.Charges_Bank_Amount <> 0 THEN
1095 
1096      IF (G_LEVEL_PROCEDURE >= G_CURRENT_RUNTIME_LEVEL ) THEN
1097          l_log_msg := 'Calling procedure Pay_Dist_Err_Chrg for charges bank amount =' ||
1098                       'l_pay_hist_rec.Charges_Bank_Amount' ||
1099                       l_pay_hist_rec.Charges_Bank_Amount;
1100          FND_LOG.STRING(G_LEVEL_PROCEDURE, G_MODULE_NAME||l_procedure_name, l_log_msg);
1101      END IF;
1102 
1103 
1104      -- Create charge distribution lines
1105      --bug 5659368
1106 
1107      Pay_Dist_Err_Chrg
1108           ( p_xla_event_rec     => p_xla_event_rec
1109             ,p_pay_hist_rec     => l_pay_hist_rec
1110             ,p_distribute_mode  => 'BANK_CHARGE'
1111             ,p_calling_sequence => l_curr_calling_sequence);
1112 
1113      IF (G_LEVEL_PROCEDURE >= G_CURRENT_RUNTIME_LEVEL ) THEN
1114          l_log_msg := 'Procedure Pay_Dist_Err_Chrg for charges bank amount executed';
1115          FND_LOG.STRING(G_LEVEL_PROCEDURE, G_MODULE_NAME||l_procedure_name, l_log_msg);
1116      END IF;
1117 
1118   END IF;
1119 
1120   IF (G_LEVEL_PROCEDURE >= G_CURRENT_RUNTIME_LEVEL ) THEN
1121       l_log_msg := 'Calling procedure Update_Gain_Loss_Ind for payments';
1122       FND_LOG.STRING(G_LEVEL_PROCEDURE, G_MODULE_NAME||l_procedure_name, l_log_msg);
1123   END IF;
1124 
1125   --11698822, call update_gain_loss_ind only for foreign currency txns
1126   IF l_txn_curr_code <> ap_accounting_pay_pkg.g_base_currency_code THEN
1127      Update_Gain_Loss_Ind
1128         (p_xla_event_rec,
1129          l_pay_hist_rec,
1130          l_curr_calling_sequence);
1131   END IF;
1132 
1133   IF (G_LEVEL_PROCEDURE >= G_CURRENT_RUNTIME_LEVEL ) THEN
1134       l_log_msg := 'Procedure Update_Gain_Loss_Ind executed';
1135       FND_LOG.STRING(G_LEVEL_PROCEDURE, G_MODULE_NAME||l_procedure_name, l_log_msg);
1136   END IF;
1137 
1138   -- Logging Infra: Procedure level
1139   IF (G_LEVEL_PROCEDURE >= G_CURRENT_RUNTIME_LEVEL ) THEN
1140       l_log_msg := 'End of procedure '|| l_procedure_name;
1141       FND_LOG.STRING(G_LEVEL_PROCEDURE, G_MODULE_NAME||l_procedure_name||'.end', l_log_msg);
1142   END IF;
1143 
1144 
1145 EXCEPTION
1146   WHEN OTHERS THEN
1147     IF SQLCODE = -20100 THEN
1148        RAISE_APPLICATION_ERROR(-20100, SQLERRM);
1149     ELSIF (SQLCODE <> -20001) THEN
1150        FND_MESSAGE.SET_NAME('SQLAP','AP_DEBUG');
1151        FND_MESSAGE.SET_TOKEN('ERROR',SQLERRM);
1152        FND_MESSAGE.SET_TOKEN('CALLING_SEQUENCE', l_curr_calling_sequence);
1153     END IF;
1154     APP_EXCEPTION.RAISE_EXCEPTION;
1155 END Primary_Pay_Events;
1156 
1157 
1158 
1159 -------------------------------------------------------------------------------
1160 -- PROCEDURE Manual_Pay_Adj_Events
1161 -- The purpose of this procedure is to prorate the payment amount for all the
1162 -- distributions of the invoice for the manual adjustment event and
1163 -- generate the payment history distribution.
1164 --
1165 --------------------------------------------------------------------------------
1166 PROCEDURE Manual_Pay_Adj_Events
1167      (P_XLA_Event_Rec      IN   ap_accounting_pay_pkg.r_xla_event_info
1168      ,P_Calling_Sequence   IN   VARCHAR2
1169      ) IS
1170 
1171   l_curr_calling_sequence    VARCHAR2(2000);
1172   l_total_paid_amt           NUMBER;
1173   l_final_payment            BOOLEAN := FALSE;
1174 
1175   l_inv_pay_rec              r_inv_pay_info;
1176   l_pay_hist_rec             ap_accounting_pay_pkg.r_pay_hist_info;
1177   l_inv_rec                  ap_accounting_pay_pkg.r_invoices_info;
1178   l_inv_dist_rec             ap_accounting_pay_pkg.r_inv_dist_info;
1179   --Bug 8524600
1180   l_curr_pay_awt_tot    NUMBER :=0;
1181   l_inv_time_awt        NUMBER :=0;
1182   l_inv_time_dist_total NUMBER :=0;
1183   l_inv_time_awt_tot    NUMBER :=0;
1184   --Bug 8524600
1185   l_cross_txn_amt       NUMBER; --bug 9936620
1186   -- Logging Infra:
1187   l_procedure_name CONSTANT VARCHAR2(30) := 'Manual_Pay_Adj_Events';
1188   l_log_msg        FND_LOG_MESSAGES.MESSAGE_TEXT%TYPE;
1189 
1190 BEGIN
1191 
1192   l_curr_calling_sequence := 'AP_ACCTG_PAY_DIST_PKG.Manual_Pay_Adj_Events<-' ||
1193                                            p_calling_sequence;
1194 
1195   -- Logging Infra: Setting up runtime level
1196   G_CURRENT_RUNTIME_LEVEL := FND_LOG.G_CURRENT_RUNTIME_LEVEL;
1197 
1198   -- Logging Infra: Procedure level
1199   IF (G_LEVEL_PROCEDURE >= G_CURRENT_RUNTIME_LEVEL ) THEN
1200       l_log_msg := 'Begin of procedure '|| l_procedure_name;
1201       FND_LOG.STRING(G_LEVEL_PROCEDURE, G_MODULE_NAME||l_procedure_name||'.begin', l_log_msg);
1202   END IF;
1203 
1204 
1205   -- Get the payment hist info of the payment event
1206   OPEN Payment_History(p_xla_event_rec.event_id);
1207   FETCH Payment_History INTO l_pay_hist_rec;
1208   CLOSE Payment_History;
1209 
1210   IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
1211       l_log_msg := 'CUR: Payment_History: Payment_History_ID = '||
1212                                           l_pay_hist_rec.payment_history_id;
1213       FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME || l_procedure_name, l_log_msg);
1214   END IF;
1215 
1216 
1217   OPEN Invoice_Payments(p_xla_event_rec.event_id);
1218   LOOP
1219 
1220        Fetch Invoice_Payments INTO l_inv_pay_rec;
1221        EXIT WHEN Invoice_Payments%NOTFOUND OR
1222                  Invoice_Payments%NOTFOUND IS NULL;
1223 
1224        IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
1225            l_log_msg := 'CUR: Invoice_Payments: Invoice_ID = '||l_inv_pay_rec.invoice_id
1226                            || 'Reversal_Flag = '||l_inv_pay_rec.reversal_flag;
1227            FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME || l_procedure_name, l_log_msg);
1228        END IF;
1229 
1230        /* If this invoice payment is a reversal the payment distributions will be created
1231           by reversing the original distributions */
1232        --bug 10336668
1233        IF l_inv_pay_rec.reversal_flag = 'Y' and l_inv_pay_rec.reversal_inv_pmt_id IS NOT NULL THEN
1234 
1235 
1236           IF (G_LEVEL_PROCEDURE >= G_CURRENT_RUNTIME_LEVEL ) THEN
1237               l_log_msg := 'Calling procedure Pay_Dist_Reverse for invoice: '
1238                                 || l_inv_pay_rec.invoice_id;
1239               FND_LOG.STRING(G_LEVEL_PROCEDURE, G_MODULE_NAME||l_procedure_name, l_log_msg);
1240           END IF;
1241 
1242           -- Create payment hist distributions by reversing the
1243           -- original payment hist dists.
1244           Pay_Dist_Reverse
1245                (p_xla_event_rec,
1246                 l_inv_pay_rec,
1247                 l_pay_hist_rec,
1248                 l_inv_pay_rec.reversal_inv_pmt_id,
1249                 NULL, -- related_Event_id
1250                 NULL, -- inv dist id
1251                 NULL, -- inv dist rec
1252                 l_curr_calling_sequence);
1253 
1254           IF (G_LEVEL_PROCEDURE >= G_CURRENT_RUNTIME_LEVEL ) THEN
1255               l_log_msg := 'Procedure Pay_Dist_Reverse executed';
1256               FND_LOG.STRING(G_LEVEL_PROCEDURE, G_MODULE_NAME||l_procedure_name, l_log_msg);
1257           END IF;
1258 
1259        ELSE
1260 
1261           OPEN Invoice_Header(l_inv_pay_rec.invoice_id);
1262           FETCH Invoice_Header INTO l_inv_rec;
1263           CLOSE Invoice_Header;
1264 
1265 
1266           IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
1267               l_log_msg := 'CUR: Invoice_Header: Invoice_ID= '|| l_inv_rec.invoice_id;
1268               FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME || l_procedure_name, l_log_msg);
1269           END IF;
1270 
1271           --bug 9936620
1272           IF (l_inv_rec.invoice_currency_code <> l_inv_rec.payment_currency_code) THEN
1273              l_cross_txn_amt := GL_Currency_API.Convert_Amount(
1274                                   l_inv_rec.invoice_currency_code,
1275                                   l_inv_rec.payment_currency_code,
1276                                   l_inv_rec.payment_cross_rate_date,
1277                                   'EMU FIXED',
1278                                   l_inv_pay_rec.amount);
1279              IF l_cross_txn_amt IS NULL THEN
1280                 RAISE_APPLICATION_ERROR(-20100, 'null_derive_factor');
1281              END IF;
1282           END IF;
1283 
1284           /* Check if the invoice is fully paid */
1285 	  -- bug 9108925, added the call to Is_Final_Event
1286 	     IF l_inv_pay_rec.amount <> 0 THEN    --bug 8987496
1287 
1288              IF AP_Accounting_Pay_Pkg.Is_Final_Payment
1289                                  (l_inv_rec,
1290                                   l_inv_pay_rec.amount,
1291                                   l_inv_pay_rec.discount_taken,
1292                                   0, -- prepay amount
1293                                   p_xla_event_rec.event_type_code,
1294                                   l_curr_calling_sequence) THEN
1295                 IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
1296                    l_log_msg := 'Final payment of Invoice_ID '||l_inv_rec.invoice_id;
1297                    FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME || l_procedure_name, l_log_msg);
1298                 END IF;
1299 
1300                 l_final_payment := AP_ACCOUNTING_PAY_PKG.Is_Final_Event
1301                                    (l_inv_rec,
1302                                     p_xla_event_rec,
1303                                     NULL,
1304                                     l_curr_calling_sequence);
1305              ELSE
1306                 IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
1307                    l_log_msg := 'Not final payment of Invoice_ID '||l_inv_rec.invoice_id;
1308                    FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME || l_procedure_name, l_log_msg);
1309                 END IF;
1310                 l_final_payment := FALSE;
1311                 -- added in bug 12594419
1312            END IF;
1313          END IF;  --bug 8987496
1314 
1315           IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
1316               IF l_final_payment THEN
1317                  l_log_msg := 'Final pay/prepay event for Invoice_ID '||l_inv_rec.invoice_id;
1318               ELSE
1319                  l_log_msg := 'Not final pay/prepay event for Invoice_ID '||l_inv_rec.invoice_id;
1320               END IF;
1321               FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME || l_procedure_name, l_log_msg);
1322           END IF;
1323 
1324        -- Perfomance Fix 7308385
1325 	   -- Bug 7636427 Start
1326       SELECT SUM(decode(aid.prepay_tax_parent_id, NULL, nvl(aid.amount, 0), 0)),
1327              SUM(decode(aid.line_type_lookup_code, 'AWT', 0, nvl(aid.amount, 0))),
1328 	     SUM(decode(aid.awt_invoice_payment_id, Null, nvl(aid.amount, 0),0)),
1329 	     SUM(decode(aid.awt_invoice_payment_id, Null, 0,nvl(aid.amount, 0))),
1330 	     SUM(decode(aid.line_type_lookup_code, 'AWT',decode(aid.awt_invoice_payment_id, Null, nvl(aid.amount, 0),0), 0))
1331         INTO G_Total_Dist_Amount,
1332 	     G_Proration_Divisor,
1333 	     l_inv_time_dist_total,
1334  	     l_curr_pay_awt_tot,
1335 	     l_inv_time_awt_tot
1336         FROM ap_invoice_distributions_all aid
1337        WHERE aid.invoice_id = l_inv_pay_rec.invoice_id
1338          AND aid.line_type_lookup_code <> 'PREPAY'
1339          AND aid.prepay_distribution_id IS NULL
1340          AND (aid.awt_invoice_payment_id IS NULL    OR
1341               aid.awt_invoice_payment_id = l_inv_pay_rec.invoice_payment_id) -- bug fix: 6725866
1342          AND NOT EXISTS
1343               (SELECT 1 FROM xla_events
1344                WHERE event_id = aid.accounting_event_id
1345                AND application_id = 200
1346                AND event_type_code IN('INVOICE CANCELLED', 'PREPAYMENT CANCELLED',
1347                       'CREDIT MEMO CANCELLED', 'DEBIT MEMO CANCELLED'));
1348 
1349  -- Bug 8524600
1350         l_curr_pay_awt_tot:= nvl(l_curr_pay_awt_tot,0);
1351         l_inv_time_awt_tot:= nvl(l_inv_time_awt_tot,0);
1352         l_inv_time_dist_total:= nvl(l_inv_time_dist_total,0);
1353 
1354         if (l_inv_time_dist_total <> 0 ) then
1355 		G_Pay_AWT_Total_Amt    := nvl(l_curr_pay_awt_tot,0)
1356 			+ nvl( (l_inv_time_awt_tot
1357 			/  l_inv_time_dist_total
1358 			* (GL_Currency_API.Convert_Amount(
1359 				l_inv_rec.payment_currency_code,
1360 				l_inv_rec.invoice_currency_code,
1361 				l_inv_rec.payment_cross_rate_date,
1362 				'EMU FIXED',
1363 				l_inv_pay_rec.amount)-l_curr_pay_awt_tot)),0);
1364 	else
1365 	    G_Pay_AWT_Total_Amt := nvl(l_curr_pay_awt_tot,0) + nvl(l_inv_time_awt_tot,0);
1366 	end if;
1367 	-- Bug 7636427 End
1368         -- Bug 8524600 End
1369 
1370           OPEN Invoice_Dists(l_inv_pay_rec.invoice_id);
1371           LOOP
1372 
1373                FETCH Invoice_Dists INTO l_inv_dist_rec;
1374                EXIT WHEN Invoice_Dists%NOTFOUND OR
1375                          Invoice_Dists%NOTFOUND IS NULL;
1376 
1377                IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
1378                    l_log_msg := 'CUR: Invoice_Dists: Invoice_Distribution_ID = '
1379                                         ||l_inv_dist_rec.invoice_distribution_id;
1380                    FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME || l_procedure_name, l_log_msg);
1381                END IF;
1382 
1383 
1384                IF (G_LEVEL_PROCEDURE >= G_CURRENT_RUNTIME_LEVEL ) THEN
1385                    l_log_msg := 'Calling procedure Pay_Dist_Proc for dist: '
1386                                      || l_inv_dist_rec.invoice_distribution_id;
1387                    FND_LOG.STRING(G_LEVEL_PROCEDURE, G_MODULE_NAME||l_procedure_name, l_log_msg);
1388                END IF;
1389 
1390                -- Create awt distributions only when the awt is created during invoice time or
1391                -- if the awt is created during the payment time then only those awt distributions
1392                -- created during this payment
1393                IF (l_inv_dist_rec.awt_invoice_payment_id IS NULL) OR
1394                   (l_inv_dist_rec.awt_invoice_payment_id = l_inv_pay_rec.invoice_payment_id) THEN
1395                   -- Create cash distribution lines for the new invoice payment
1396                   Pay_Dist_Proc(p_xla_event_rec,
1397                                 l_inv_pay_rec,
1398                                 l_pay_hist_rec,
1399                                 l_inv_rec,
1400                                 l_inv_dist_rec,
1401                                 'M',
1402                                 l_final_payment,
1403                                 l_curr_calling_sequence);
1404 
1405                END IF;
1406 
1407 
1408                IF (G_LEVEL_PROCEDURE >= G_CURRENT_RUNTIME_LEVEL ) THEN
1409                    l_log_msg := 'Procedure Pay_Dist_Proc executed';
1410                    FND_LOG.STRING(G_LEVEL_PROCEDURE, G_MODULE_NAME||l_procedure_name, l_log_msg);
1411                END IF;
1412 
1413 
1414           END LOOP;
1415           CLOSE Invoice_Dists;
1416 
1417           G_Total_Dist_Amt := 0;
1418           G_Total_Prorated_Amt := 0;
1419           G_Total_Prorated_Disc_Amt := 0;
1420           G_Total_Inv_Dist_Amt := 0;
1421           G_Total_Inv_Dist_Disc_Amt := 0;
1422           G_Total_Bank_Curr_Amt := 0;
1423           G_Total_Bank_Curr_Disc_Amt := 0;
1424 
1425 
1426           IF (G_LEVEL_PROCEDURE >= G_CURRENT_RUNTIME_LEVEL ) THEN
1427               l_log_msg := 'Calling procedure P_Acctg_Pay_Round_Pkg.Do_Rounding for Invoice_ID: '
1428                                        || l_inv_rec.invoice_id;
1429               FND_LOG.STRING(G_LEVEL_PROCEDURE, G_MODULE_NAME||l_procedure_name, l_log_msg);
1430           END IF;
1431 
1432           -- Create total and final payment roundings
1433           AP_Acctg_Pay_Round_Pkg.Do_Rounding
1434                      (p_xla_event_rec,
1435                       l_pay_hist_rec,
1436                       NULL, -- clr hist rec
1437                       l_inv_rec,
1438                       l_inv_pay_rec,
1439                       NULL, -- prepay inv rec
1440                       NULL, -- prepay hist rec
1441                       NULL, -- prepay dist rec
1442                       l_curr_calling_sequence);
1443 
1444           IF (G_LEVEL_PROCEDURE >= G_CURRENT_RUNTIME_LEVEL ) THEN
1445               l_log_msg := 'Procedure P_Acctg_Pay_Round_Pkg.Do_Rounding executed';
1446               FND_LOG.STRING(G_LEVEL_PROCEDURE, G_MODULE_NAME||l_procedure_name, l_log_msg);
1447           END IF;
1448 
1449 
1450       END IF;
1451 
1452   END LOOP;
1453   CLOSE Invoice_Payments;
1454 
1455 
1456 
1457   IF l_pay_hist_rec.Errors_Bank_Amount <> 0 THEN
1458 
1459      IF (G_LEVEL_PROCEDURE >= G_CURRENT_RUNTIME_LEVEL ) THEN
1460          l_log_msg := 'Calling procedure Pay_Dist_Err_Chrg for errors bank amount';
1461          FND_LOG.STRING(G_LEVEL_PROCEDURE, G_MODULE_NAME||l_procedure_name, l_log_msg);
1462      END IF;
1463 
1464      --bug 5659368
1465      Pay_Dist_Err_Chrg
1466           ( p_xla_event_rec     => p_xla_event_rec
1467             ,p_pay_hist_rec     => l_pay_hist_rec
1468             ,p_distribute_mode  => 'BANK_ERROR'
1469             ,p_calling_sequence => l_curr_calling_sequence);
1470 
1471      IF (G_LEVEL_PROCEDURE >= G_CURRENT_RUNTIME_LEVEL ) THEN
1472          l_log_msg := 'Procedure Pay_Dist_Err_Chrg for errors bank amount executed';
1473          FND_LOG.STRING(G_LEVEL_PROCEDURE, G_MODULE_NAME||l_procedure_name, l_log_msg);
1474      END IF;
1475 
1476   END IF;
1477 
1478 
1479   IF l_pay_hist_rec.Charges_Bank_Amount <> 0 THEN
1480 
1481      IF (G_LEVEL_PROCEDURE >= G_CURRENT_RUNTIME_LEVEL ) THEN
1482          l_log_msg := 'Calling procedure Pay_Dist_Err_Chrg for charges bank amount';
1483          FND_LOG.STRING(G_LEVEL_PROCEDURE, G_MODULE_NAME||l_procedure_name, l_log_msg);
1484      END IF;
1485 
1486      --bug 5659368
1487      Pay_Dist_Err_Chrg
1488           ( p_xla_event_rec     => p_xla_event_rec
1489             ,p_pay_hist_rec     => l_pay_hist_rec
1490             ,p_distribute_mode  => 'BANK_CHARGE'
1491             ,p_calling_sequence => l_curr_calling_sequence);
1492 
1493      IF (G_LEVEL_PROCEDURE >= G_CURRENT_RUNTIME_LEVEL ) THEN
1494          l_log_msg := 'Procedure Pay_Dist_Err_Chrg for charges bank amount executed';
1495          FND_LOG.STRING(G_LEVEL_PROCEDURE, G_MODULE_NAME||l_procedure_name, l_log_msg);
1496      END IF;
1497 
1498   END IF;
1499 
1500   IF (G_LEVEL_PROCEDURE >= G_CURRENT_RUNTIME_LEVEL ) THEN
1501       l_log_msg := 'Calling procedure Update_Gain_Loss_Ind for payments';
1502       FND_LOG.STRING(G_LEVEL_PROCEDURE, G_MODULE_NAME||l_procedure_name, l_log_msg);
1503   END IF;
1504 
1505   --11698822, call update_gain_loss_ind only for foreign currency txns
1506   IF l_pay_hist_rec.pmt_currency_code <> ap_accounting_pay_pkg.g_base_currency_code THEN
1507      Update_Gain_Loss_Ind
1508         (p_xla_event_rec,
1509          l_pay_hist_rec,
1510          l_curr_calling_sequence);
1511   END IF;
1512 
1513   IF (G_LEVEL_PROCEDURE >= G_CURRENT_RUNTIME_LEVEL ) THEN
1514       l_log_msg := 'Procedure Update_Gain_Loss_Ind executed';
1515       FND_LOG.STRING(G_LEVEL_PROCEDURE, G_MODULE_NAME||l_procedure_name, l_log_msg);
1516   END IF;
1517 
1518   -- Logging Infra: Procedure level
1519   IF (G_LEVEL_PROCEDURE >= G_CURRENT_RUNTIME_LEVEL ) THEN
1520       l_log_msg := 'End of procedure '|| l_procedure_name;
1521       FND_LOG.STRING(G_LEVEL_PROCEDURE, G_MODULE_NAME||l_procedure_name||'.end', l_log_msg);
1522   END IF;
1523 
1524 
1525 EXCEPTION
1526   WHEN OTHERS THEN
1527     IF SQLCODE = -20100 THEN
1528        RAISE_APPLICATION_ERROR(-20100, SQLERRM);
1529     ELSIF (SQLCODE <> -20001) THEN
1530        FND_MESSAGE.SET_NAME('SQLAP','AP_DEBUG');
1531        FND_MESSAGE.SET_TOKEN('ERROR',SQLERRM);
1532        FND_MESSAGE.SET_TOKEN('CALLING_SEQUENCE', l_curr_calling_sequence);
1533     END IF;
1534     APP_EXCEPTION.RAISE_EXCEPTION;
1535 
1536 
1537 END Manual_Pay_Adj_Events;
1538 
1539 
1540 
1541 -------------------------------------------------------------------------------
1542 -- PROCEDURE Cancel_Primary_Pay_Events
1543 -- The purpose of this procedure is to reverse the payment distributions
1544 -- for the payment transactions that have been cancelled, uncleared or
1545 -- unmatured and insert into the payment hist distribution table.
1546 --
1547 --------------------------------------------------------------------------------
1548 PROCEDURE Cancel_Primary_Pay_Events
1549      (P_XLA_Event_Rec      IN   ap_accounting_pay_pkg.r_xla_event_info
1550      ,P_Calling_Sequence   IN   VARCHAR2
1551      ) IS
1552 
1553   l_curr_calling_sequence    VARCHAR2(2000);
1554 
1555   l_pay_hist_rec             ap_accounting_pay_pkg.r_pay_hist_info;
1556 
1557   -- Logging Infra:
1558   l_procedure_name CONSTANT VARCHAR2(30) := 'Cancel_Primary_Pay_Events';
1559   l_log_msg        FND_LOG_MESSAGES.MESSAGE_TEXT%TYPE;
1560 
1561 BEGIN
1562 
1563   l_curr_calling_sequence := 'AP_ACCTG_PAY_DIST_PKG.Cancel_Primary_Pay_Events<-' ||
1564                                            p_calling_sequence;
1565 
1566   -- Logging Infra: Setting up runtime level
1567   G_CURRENT_RUNTIME_LEVEL := FND_LOG.G_CURRENT_RUNTIME_LEVEL;
1568 
1569   -- Logging Infra: Procedure level
1570   IF (G_LEVEL_PROCEDURE >= G_CURRENT_RUNTIME_LEVEL ) THEN
1571       l_log_msg := 'Begin of procedure '|| l_procedure_name;
1572       FND_LOG.STRING(G_LEVEL_PROCEDURE, G_MODULE_NAME||l_procedure_name||'.begin', l_log_msg);
1573   END IF;
1574 
1575 
1576   OPEN Payment_History(p_xla_event_rec.event_id);
1577   FETCH Payment_History INTO l_pay_hist_rec;
1578   CLOSE Payment_History;
1579 
1580   IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
1581       l_log_msg := 'CUR: Payment_History: Payment_History_ID = '||
1582                                           l_pay_hist_rec.payment_history_id;
1583       FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME || l_procedure_name, l_log_msg);
1584   END IF;
1585 
1586 
1587   IF (G_LEVEL_PROCEDURE >= G_CURRENT_RUNTIME_LEVEL ) THEN
1588       l_log_msg := 'Calling procedure Pay_Dist_Reverse for related event: '
1589                             || l_pay_hist_rec.related_event_id;
1590       FND_LOG.STRING(G_LEVEL_PROCEDURE, G_MODULE_NAME||l_procedure_name, l_log_msg);
1591   END IF;
1592 
1593 
1594   -- Create payment hist dists by reversing the original payment hist
1595   -- distributions
1596   Pay_Dist_Reverse
1597         (p_xla_event_rec,
1598          NULL,
1599          l_pay_hist_rec,
1600          NULL, -- reversal_inv_pmt_id,
1601          l_pay_hist_rec.related_event_id,
1602          NULL, -- invoice_dist_id
1603          NULL, -- inv_dist_rec
1604          l_curr_calling_sequence);
1605 
1606   IF (G_LEVEL_PROCEDURE >= G_CURRENT_RUNTIME_LEVEL ) THEN
1607       l_log_msg := 'Procedure Pay_Dist_Reverse executed';
1608       FND_LOG.STRING(G_LEVEL_PROCEDURE, G_MODULE_NAME||l_procedure_name, l_log_msg);
1609   END IF;
1610 
1611     -- If Validation is added for 11721100
1612   IF l_pay_hist_rec.pmt_currency_code <> ap_accounting_pay_pkg.g_base_currency_code THEN
1613 
1614   IF (G_LEVEL_PROCEDURE >= G_CURRENT_RUNTIME_LEVEL ) THEN
1615       l_log_msg := 'Calling procedure Update_Gain_Loss_Ind for payments';
1616       FND_LOG.STRING(G_LEVEL_PROCEDURE, G_MODULE_NAME||l_procedure_name, l_log_msg);
1617   END IF;
1618 
1619   Update_Gain_Loss_Ind
1620         (p_xla_event_rec,
1621          l_pay_hist_rec,
1622          l_curr_calling_sequence);
1623 
1624   IF (G_LEVEL_PROCEDURE >= G_CURRENT_RUNTIME_LEVEL ) THEN
1625       l_log_msg := 'Procedure Update_Gain_Loss_Ind executed';
1626       FND_LOG.STRING(G_LEVEL_PROCEDURE, G_MODULE_NAME||l_procedure_name, l_log_msg);
1627   END IF;
1628 
1629   END IF; -- l_pay_hist_rec.pmt_currency_code..
1630 
1631 EXCEPTION
1632   WHEN OTHERS THEN
1633     IF (SQLCODE <> -20001) THEN
1634       FND_MESSAGE.SET_NAME('SQLAP','AP_DEBUG');
1635       FND_MESSAGE.SET_TOKEN('ERROR',SQLERRM);
1636       FND_MESSAGE.SET_TOKEN('CALLING_SEQUENCE', l_curr_calling_sequence);
1637     END IF;
1638     APP_EXCEPTION.RAISE_EXCEPTION;
1639 
1640 END Cancel_Primary_Pay_Events;
1641 
1642 
1643 -------------------------------------------------------------------------------
1644 -- PROCEDURE  Pay_Dist_Cascade_Adj_Events
1645 -- The purpose of this procedure is to prorate the payment amount for all the
1646 -- distributions of the invoice that has been adjusted and generate the
1647 -- payment history distribution.
1648 --
1649 --------------------------------------------------------------------------------
1650 PROCEDURE Pay_Dist_Cascade_Adj_Events
1651      (P_XLA_Event_Rec      IN   ap_accounting_pay_pkg.r_xla_event_info
1652      ,P_Calling_Sequence   IN   VARCHAR2
1653      ) IS
1654 
1655   l_curr_calling_sequence    VARCHAR2(2000);
1656   l_event_id                 NUMBER;
1657   l_inv_adj_amount           NUMBER := 0;
1658   l_invoice_id               NUMBER;
1659   l_sum_paid_amount          NUMBER := 0;
1660   l_sum_disc_amount          NUMBER := 0;
1661   l_sum_error_amount         NUMBER := 0;
1662   l_sum_charge_amount        NUMBER := 0;
1663   l_pay_history_id           NUMBER;
1664   l_mat_history_id           NUMBER;
1665 
1666   l_inv_pay_rec            r_inv_pay_info;
1667   l_pay_hist_rec           ap_accounting_pay_pkg.r_pay_hist_info;
1668   l_inv_rec                ap_accounting_pay_pkg.r_invoices_info;
1669   l_inv_dist_rec           ap_accounting_pay_pkg.r_inv_dist_info;
1670   --Bug 8524600
1671   l_curr_pay_awt_tot         NUMBER :=0;
1672   l_inv_time_awt             NUMBER :=0;
1673   l_inv_time_dist_total      NUMBER :=0;
1674   l_inv_time_awt_tot         NUMBER :=0;
1675   --Bug 8524600
1676   l_pay_dist_cnt           NUMBER;
1677   l_do_round               NUMBER; --7454170 contains payment_history_id
1678   l_tech_round_amt         NUMBER; --9414219
1679   l_tech_disc_rnd_amt      NUMBER; --10170636
1680   l_final_payment BOOLEAN := FALSE; -- bug 9495429
1681   l_txn_curr_code          AP_PAYMENT_HISTORY_ALL.PMT_CURRENCY_CODE%TYPE; --11698822
1682   --Bug 13081266
1683   l_sum_disc_dist_amount        NUMBER;
1684   l_sum_disc_bank_curr_amount   NUMBER;
1685   l_sum_disc_dist_base_amount   NUMBER;
1686   l_sum_disc_paid_base_amount   NUMBER;
1687   l_sum_disc_clr_base_amount    NUMBER;
1688   l_max_disc_dist_id            NUMBER;
1689 
1690   CURSOR Inv_Adj_Dists
1691         (P_Event_ID             NUMBER
1692         ,P_Invoice_ID           NUMBER
1693         ,P_Related_Event_ID     NUMBER) IS
1694   SELECT Distinct AID.Invoice_Distribution_ID,
1695          AID.Line_Type_Lookup_Code,
1696          AID.Amount,
1697          AID.Base_Amount,
1698          AID.PO_Distribution_ID,
1699          AID.RCV_Transaction_ID,
1700          NVL(AID.Reversal_Flag,'N'),
1701          AID.Parent_Reversal_ID,
1702          AID.AWT_Related_ID,
1703          AID.AWT_Invoice_Payment_ID,
1704          AID.Quantity_Variance,
1705          AID.Base_Quantity_Variance,
1706          AID.Amount_Variance,
1707          AID.Base_Amount_Variance,
1708          AID.historical_flag,   -- bug fix 6674279
1709          AID.accounting_event_id  -- bug fix 6674279
1710   FROM   AP_Invoice_Distributions_All AID,
1711          AP_Payment_History_All APH,
1712          AP_Payment_Hist_Dists APHD
1713   WHERE  AID.Invoice_ID = P_Invoice_ID
1714   AND    NVL(AID.Reversal_Flag,'N') <> 'Y'
1715   AND    AID.Invoice_Distribution_ID = APHD.Invoice_Distribution_ID
1716   AND    APH.Payment_History_ID = APHD.Payment_History_ID
1717   AND    APH.Related_Event_ID = P_Related_Event_ID
1718   AND    NVL(AID.Accounting_Event_ID,-99) <> P_Event_ID
1719   AND    APHD.Pay_Dist_Lookup_Code IN ('CASH', 'AWT')
1720   ORDER  BY DECODE(AID.Line_Type_Lookup_Code, 'AWT', 1, 2),
1721   abs(AID.Amount), AID.Invoice_Distribution_ID;
1722 
1723   CURSOR Adj_Invoice_Payments
1724         (P_Check_ID     NUMBER
1725         ,P_Invoice_ID   NUMBER
1726         ) IS
1727   SELECT AIP.Invoice_ID,
1728          AIP.Invoice_Payment_ID,
1729          AIP.Amount,
1730          AIP.Discount_Taken,
1731          AIP.Payment_Base_Amount,
1732          AIP.Invoice_Base_Amount,
1733          AIP.Exchange_Rate_Type,
1734          AIP.Exchange_Date,
1735          AIP.Exchange_Rate,
1736          NVL(AIP.Reversal_Flag,'N'),
1737          AIP.Reversal_Inv_Pmt_ID
1738   FROM   AP_Invoice_Payments_All AIP
1739   WHERE  AIP.Check_ID = P_Check_ID
1740   AND    AIP.Invoice_ID = P_Invoice_ID
1741   AND    AIP.REVERSAL_INV_PMT_ID IS NULL;  --bug 9005225
1742 
1743   -- Logging Infra:
1744   l_procedure_name CONSTANT VARCHAR2(30) := 'Pay_Dist_Cascade_Adj_Events';
1745   l_log_msg        FND_LOG_MESSAGES.MESSAGE_TEXT%TYPE;
1746 
1747 
1748 BEGIN
1749 
1750   l_curr_calling_sequence := 'AP_Acctg_Pay_Dist_Pkg.Pay_Dist_Cascade_Adj_Events<- ' ||
1751                                       p_calling_sequence;
1752 
1753   -- Logging Infra: Setting up runtime level
1754   G_CURRENT_RUNTIME_LEVEL := FND_LOG.G_CURRENT_RUNTIME_LEVEL;
1755 
1756   -- Logging Infra: Procedure level
1757   IF (G_LEVEL_PROCEDURE >= G_CURRENT_RUNTIME_LEVEL ) THEN
1758       l_log_msg := 'Begin of procedure '|| l_procedure_name;
1759       FND_LOG.STRING(G_LEVEL_PROCEDURE, G_MODULE_NAME||l_procedure_name||'.begin', l_log_msg);
1760   END IF;
1761 
1762 
1763   OPEN Payment_History(p_xla_event_rec.event_id);
1764   FETCH Payment_History INTO l_pay_hist_rec;
1765   CLOSE Payment_History;
1766 
1767 
1768   IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
1769       l_log_msg := 'CUR: Payment_History: Payment_History_ID = '||
1770                                           l_pay_hist_rec.payment_history_id;
1771       FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME || l_procedure_name, l_log_msg);
1772   END IF;
1773 
1774 
1775   /* We need payment hist information for the prior events in order
1776      to calculate the base amounts for the prior events using the
1777      exchange rate info from the payment hist table */
1778   --11698822, added l_txn_curr_code
1779 
1780   IF (P_XLA_Event_Rec.Event_Type_Code IN ('PAYMENT MATURITY ADJUSTED')) THEN
1781 
1782       SELECT MAX(APH.Payment_History_ID)
1783       INTO   l_pay_history_id
1784       FROM   AP_Payment_History_All APH
1785       WHERE  APH.Check_ID = p_xla_event_rec.source_id_int_1
1786       AND    APH.Transaction_Type IN ('PAYMENT CREATED', 'REFUND RECORDED');
1787 
1788       SELECT APH.Pmt_To_Base_XRate_Type,
1789              APH.Pmt_To_Base_XRate_Date,
1790              APH.Pmt_To_Base_XRate
1791       INTO   ap_accounting_pay_pkg.g_pmt_to_base_xrate_type,
1792              ap_accounting_pay_pkg.g_pmt_to_base_xrate_date,
1793              ap_accounting_pay_pkg.g_pmt_to_base_xrate
1794       FROM   AP_Payment_History_All APH
1795       WHERE  APH.Payment_History_ID = l_pay_history_id;
1796 
1797       IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
1798           l_log_msg := 'Payment_History_ID for payment = '|| l_pay_history_id;
1799           FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME || l_procedure_name, l_log_msg);
1800       END IF;
1801 
1802 
1803       ap_accounting_pay_pkg.g_pay_pmt_history_id := l_pay_history_id;
1804 
1805       ap_accounting_pay_pkg.g_mat_pmt_history_id := l_pay_hist_rec.payment_history_id;
1806       ap_accounting_pay_pkg.g_mat_to_base_xrate_type :=
1807                                 l_pay_hist_rec.pmt_to_base_xrate_type;
1808       ap_accounting_pay_pkg.g_mat_to_base_xrate_date :=
1809                                 l_pay_hist_rec.pmt_to_base_xrate_date;
1810       ap_accounting_pay_pkg.g_mat_to_base_xrate := l_pay_hist_rec.pmt_to_base_xrate;
1811       l_txn_curr_code := l_pay_hist_rec.pmt_currency_code;
1812 
1813       IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
1814           l_log_msg := 'Payment_History_ID for maturity = '||
1815                                     l_pay_hist_rec.payment_history_id;
1816           FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME || l_procedure_name, l_log_msg);
1817       END IF;
1818 
1819 
1820   ELSIF (P_XLA_Event_Rec.Event_Type_Code IN ('PAYMENT CLEARING ADJUSTED')) THEN
1821 
1822       SELECT MAX(APH.Payment_History_ID)
1823       INTO   l_pay_history_id
1824       FROM   AP_Payment_History_All APH
1825       WHERE  APH.Check_ID = p_xla_event_rec.source_id_int_1
1826       AND    APH.Transaction_Type IN ('PAYMENT CREATED', 'REFUND RECORDED');
1827 
1828       SELECT APH.Pmt_To_Base_XRate_Type,
1829              APH.Pmt_To_Base_XRate_Date,
1830              APH.Pmt_To_Base_XRate
1831       INTO   ap_accounting_pay_pkg.g_pmt_to_base_xrate_type,
1832              ap_accounting_pay_pkg.g_pmt_to_base_xrate_date,
1833              ap_accounting_pay_pkg.g_pmt_to_base_xrate
1834       FROM   AP_Payment_History_All APH
1835       WHERE  APH.Payment_History_ID = l_pay_history_id;
1836 
1837       SELECT MAX(APH.Payment_History_ID)
1838       INTO   l_mat_history_id
1839       FROM   AP_Payment_History_All APH
1840       WHERE  APH.Check_ID = p_xla_event_rec.source_id_int_1
1841       AND    APH.Transaction_Type IN ('PAYMENT MATURITY');
1842 
1843 
1844       IF l_mat_history_id IS NOT NULL THEN
1845 
1846          SELECT APH.Pmt_To_Base_XRate_Type,
1847                 APH.Pmt_To_Base_XRate_Date,
1848                 APH.Pmt_To_Base_XRate
1849          INTO   ap_accounting_pay_pkg.g_mat_to_base_xrate_type,
1850                 ap_accounting_pay_pkg.g_mat_to_base_xrate_date,
1851                 ap_accounting_pay_pkg.g_mat_to_base_xrate
1852          FROM   AP_Payment_History_All APH
1853          WHERE  APH.Payment_History_ID = l_mat_history_id;
1854 
1855       END IF;
1856 
1857       IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
1858           l_log_msg := 'Payment_History_ID for payment = '|| l_pay_history_id;
1859           FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME || l_procedure_name, l_log_msg);
1860       END IF;
1861 
1862       IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
1863           l_log_msg := 'Payment_History_ID for maturity = '|| l_mat_history_id;
1864           FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME || l_procedure_name, l_log_msg);
1865       END IF;
1866 
1867 
1868       ap_accounting_pay_pkg.g_pay_pmt_history_id := l_pay_history_id;
1869       ap_accounting_pay_pkg.g_mat_pmt_history_id := l_mat_history_id;
1870 
1871       ap_accounting_pay_pkg.g_clr_pmt_history_id := l_pay_hist_rec.payment_history_id;
1872       ap_accounting_pay_pkg.g_clr_to_base_xrate_type :=
1873                                 l_pay_hist_rec.pmt_to_base_xrate_type;
1874       ap_accounting_pay_pkg.g_clr_to_base_xrate_date :=
1875                                 l_pay_hist_rec.pmt_to_base_xrate_date;
1876       ap_accounting_pay_pkg.g_clr_to_base_xrate := l_pay_hist_rec.pmt_to_base_xrate;
1877       l_txn_curr_code := l_pay_hist_rec.bank_currency_code;
1878 
1879       IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
1880           l_log_msg := 'Payment_History_ID for clearing = '||
1881                                          l_pay_hist_rec.payment_history_id;
1882           FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME || l_procedure_name, l_log_msg);
1883       END IF;
1884 
1885   ELSE
1886 
1887       ap_accounting_pay_pkg.g_pay_pmt_history_id := l_pay_hist_rec.payment_history_id;
1888       ap_accounting_pay_pkg.g_pmt_to_base_xrate_type :=
1889                                 l_pay_hist_rec.pmt_to_base_xrate_type;
1890       ap_accounting_pay_pkg.g_pmt_to_base_xrate_date :=
1891                                 l_pay_hist_rec.pmt_to_base_xrate_date;
1892       ap_accounting_pay_pkg.g_pmt_to_base_xrate := l_pay_hist_rec.pmt_to_base_xrate;
1893       l_txn_curr_code := l_pay_hist_rec.pmt_currency_code;
1894 
1895       IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
1896           l_log_msg := 'Payment_History_ID for payment = '||
1897                                         l_pay_hist_rec.payment_history_id;
1898           FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME || l_procedure_name, l_log_msg);
1899       END IF;
1900 
1901 
1902   END IF;
1903 
1904   BEGIN
1905      SELECT AID.Invoice_ID
1906      INTO   l_invoice_id
1907      FROM   AP_Invoice_Distributions_All AID
1908      WHERE  AID.Accounting_Event_ID = l_pay_hist_rec.invoice_adjustment_event_id
1909      AND    Rownum = 1;
1910   EXCEPTION
1911      WHEN NO_DATA_FOUND THEN
1912         RAISE_APPLICATION_ERROR(-20100, 'invalid_invoice_adjustment_event_id');
1913   END; --bug 9936620
1914 
1915   OPEN Invoice_Header(l_invoice_id);
1916   FETCH Invoice_Header INTO l_inv_rec;
1917   CLOSE Invoice_Header;
1918 
1919   IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
1920       l_log_msg := 'CUR: Invoice_Header: Invoice_ID= '|| l_inv_rec.invoice_id;
1921       FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME || l_procedure_name, l_log_msg);
1922   END IF;
1923 
1924 
1925   /* Get the invoice payments that need to be adjusted */
1926   OPEN Adj_Invoice_Payments(p_xla_event_rec.source_id_int_1,
1927                             l_invoice_id);
1928   LOOP
1929 
1930        Fetch Adj_Invoice_Payments INTO l_inv_pay_rec;
1931        EXIT WHEN Adj_Invoice_Payments%NOTFOUND OR
1932                  Adj_Invoice_Payments%NOTFOUND IS NULL;
1933 
1934 
1935        IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
1936            l_log_msg := 'CUR: Invoice_Payments: Invoice_ID = '||
1937                                    l_inv_pay_rec.invoice_id;
1938            FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME || l_procedure_name, l_log_msg);
1939        END IF;
1940 
1941        -- Perfomance Fix 7308385
1942        -- Bug 7636427 Start
1943       SELECT SUM(decode(aid.prepay_tax_parent_id, NULL, nvl(aid.amount, 0), 0)),
1944              SUM(decode(aid.line_type_lookup_code, 'AWT', 0, nvl(aid.amount, 0))),
1945  	     SUM(decode(aid.awt_invoice_payment_id, Null, nvl(aid.amount, 0),0)),
1946 	     SUM(decode(aid.awt_invoice_payment_id, Null, 0,nvl(aid.amount, 0))),
1947 	     SUM(decode(aid.line_type_lookup_code, 'AWT',decode(aid.awt_invoice_payment_id, Null, nvl(aid.amount, 0),0), 0))
1948         INTO G_Total_Dist_Amount,
1949 	     G_Proration_Divisor,
1950 	     l_inv_time_dist_total,
1951              l_curr_pay_awt_tot,
1952 	     l_inv_time_awt_tot
1953         FROM ap_invoice_distributions_all aid
1954        WHERE aid.invoice_id = l_inv_pay_rec.invoice_id
1955          AND aid.line_type_lookup_code <> 'PREPAY'
1956          AND aid.prepay_distribution_id IS NULL
1957          AND (aid.awt_invoice_payment_id IS NULL    OR
1958               aid.awt_invoice_payment_id = l_inv_pay_rec.invoice_payment_id) -- bug fix: 6725866
1959          AND NOT EXISTS
1960               (SELECT 1 FROM xla_events
1961                WHERE event_id = aid.accounting_event_id
1962                AND application_id = 200
1963                AND event_type_code IN('INVOICE CANCELLED', 'PREPAYMENT CANCELLED',
1964                       'CREDIT MEMO CANCELLED', 'DEBIT MEMO CANCELLED'));
1965 
1966    -- Bug 8524600
1967         l_curr_pay_awt_tot:= nvl(l_curr_pay_awt_tot,0);
1968         l_inv_time_awt_tot:= nvl(l_inv_time_awt_tot,0);
1969         l_inv_time_dist_total:= nvl(l_inv_time_dist_total,0);
1970 
1971         if (l_inv_time_dist_total <> 0 ) then
1972 		G_Pay_AWT_Total_Amt    := nvl(l_curr_pay_awt_tot,0)
1973 			+ nvl( (l_inv_time_awt_tot
1974 			/  l_inv_time_dist_total
1975 			* (GL_Currency_API.Convert_Amount(
1976 				l_inv_rec.payment_currency_code,
1977 				l_inv_rec.invoice_currency_code,
1978 				l_inv_rec.payment_cross_rate_date,
1979 				'EMU FIXED',
1980 				l_inv_pay_rec.amount)-l_curr_pay_awt_tot)),0);
1981 	else
1982 	    G_Pay_AWT_Total_Amt := nvl(l_curr_pay_awt_tot,0) + nvl(l_inv_time_awt_tot,0);
1983 	end if;
1984 	-- Bug 7636427 End
1985         -- Bug 8524600 End
1986 
1987         --bug 9495429 start
1988        IF (l_inv_pay_rec.amount <> 0 ) THEN
1989            IF AP_Accounting_Pay_Pkg.Is_Final_Payment (l_inv_rec,
1990                                                  0, --l_inv_pay_rec.amount
1991                                                  0, -- l_inv_pay_rec.discount_taken,  Bug 13081266
1992                                                  0, -- prepay amount
1993                                                  p_xla_event_rec.event_type_code,
1994                                                  l_curr_calling_sequence) THEN
1995               IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
1996                  l_log_msg           := 'Final payment of Invoice_ID '||l_inv_rec.invoice_id;
1997                  FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME || l_procedure_name, l_log_msg);
1998               END IF;
1999            l_final_payment := AP_ACCOUNTING_PAY_PKG.Is_Final_Event (l_inv_rec,
2000                                                                  p_xla_event_rec,
2001                                                                  NULL,
2002                                                                  l_curr_calling_sequence);
2003            ELSE
2004               IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
2005                  l_log_msg           := 'Not final payment of Invoice_ID '||l_inv_rec.invoice_id;
2006                  FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME || l_procedure_name, l_log_msg);
2007               END IF;
2008            END IF;
2009        END IF;
2010        IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
2011           IF l_final_payment THEN
2012              l_log_msg := 'Final pay/prepay event for Invoice_ID '||l_inv_rec.invoice_id;
2013           ELSE
2014              l_log_msg := 'Not final pay/prepay event for Invoice_ID '||l_inv_rec.invoice_id;
2015           END IF;
2016           FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME || l_procedure_name, l_log_msg);
2017        END IF;
2018 
2019        SELECT SUM(AID.Amount)
2020        INTO   l_inv_adj_amount
2021        FROM   AP_Invoice_Distributions_All AID
2022        WHERE  AID.Accounting_Event_ID = l_pay_hist_rec.invoice_adjustment_event_id;
2023 
2024        G_Inv_Adj_Amount := l_inv_adj_amount;
2025        --bug 9495429 end
2026 
2027        -- Get the new or reversed invoice dists
2028        OPEN Invoice_Dists(l_invoice_id,
2029                           l_pay_hist_rec.invoice_adjustment_event_id);
2030        LOOP
2031 
2032             FETCH Invoice_Dists INTO l_inv_dist_rec;
2033             EXIT WHEN Invoice_Dists%NOTFOUND OR
2034                       Invoice_Dists%NOTFOUND IS NULL;
2035 
2036 
2037             IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
2038                 l_log_msg := 'CUR: Invoice_Dists: Invoice_Distribution_ID = '
2039                                 ||l_inv_dist_rec.invoice_distribution_id
2040                                 ||'Reversal_Flag = '||l_inv_dist_rec.reversal_flag;
2041                 FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME || l_procedure_name, l_log_msg);
2042             END IF;
2043 
2044             -- Bug 7384943. Get the count of payment dists for the parent invoice dist
2045             l_pay_dist_cnt :=0; --7602927 Intialising
2046             IF l_inv_dist_rec.parent_reversal_id IS NOT NULL THEN
2047 
2048                SELECT count(*)
2049                INTO   l_pay_dist_cnt
2050                FROM   ap_payment_hist_dists
2051                WHERE  invoice_distribution_id = l_inv_dist_rec.parent_reversal_id;
2052 
2053             END IF;
2054 
2055             -- Bug 7384943. Call pay_dist_reverse only if there exists payment
2056             -- dists for the parent invoice dist otherwise create payment dists
2057             -- by calculating the prorated amounts
2058 
2059             IF l_inv_dist_rec.reversal_flag = 'Y' AND
2060                l_inv_dist_rec.parent_reversal_id IS NOT NULL AND -- Bug 7602927
2061                l_pay_dist_cnt > 0 THEN
2062 
2063                IF (G_LEVEL_PROCEDURE >= G_CURRENT_RUNTIME_LEVEL ) THEN
2064                    l_log_msg := 'Calling procedure Pay_Dist_Reverse for dist: '
2065                                      || l_inv_dist_rec.invoice_distribution_id;
2066                    FND_LOG.STRING(G_LEVEL_PROCEDURE, G_MODULE_NAME||l_procedure_name, l_log_msg);
2067                END IF;
2068 
2069                Pay_Dist_Reverse
2070                          (p_xla_event_rec,
2071                           l_inv_pay_rec, -- passing the parameter for Bug 13107915
2072                           l_pay_hist_rec, -- pay_hist_rec
2073                           NULL, -- reversal_inv_pmt_id,
2074                           NULL, -- related_event_id,
2075                           l_inv_dist_rec.parent_reversal_id, -- invoice_dist_id
2076                           l_inv_dist_rec, -- Bug6887295
2077                           l_curr_calling_sequence);
2078 
2079                IF (G_LEVEL_PROCEDURE >= G_CURRENT_RUNTIME_LEVEL ) THEN
2080                    l_log_msg := 'Procedure Pay_Dist_Reverse executed';
2081                    FND_LOG.STRING(G_LEVEL_PROCEDURE, G_MODULE_NAME||l_procedure_name, l_log_msg);
2082                END IF;
2083 
2084 
2085             ELSE
2086 
2087                IF (G_LEVEL_PROCEDURE >= G_CURRENT_RUNTIME_LEVEL ) THEN
2088                    l_log_msg := 'Calling procedure Pay_Dist_Proc for dist: '
2089                                      || l_inv_dist_rec.invoice_distribution_id;
2090                    FND_LOG.STRING(G_LEVEL_PROCEDURE, G_MODULE_NAME||l_procedure_name, l_log_msg);
2091                END IF;
2092 
2093 
2094                -- Create awt distributions only when the awt is created during invoice time or
2095                -- if the awt is created during the payment time then only those awt distributions
2096                -- created during this payment
2097                IF (l_inv_dist_rec.awt_invoice_payment_id IS NULL) OR
2098                   (l_inv_dist_rec.awt_invoice_payment_id = l_inv_pay_rec.invoice_payment_id) THEN
2099                   Pay_Dist_Proc(p_xla_event_rec,
2100                                 l_inv_pay_rec,
2101                                 l_pay_hist_rec,
2102                                 l_inv_rec,
2103                                 l_inv_dist_rec,
2104                                 'C',
2105                                 l_final_payment, --bug 9495429
2106                                 l_curr_calling_sequence);
2107 
2108                END IF;
2109 
2110                IF (G_LEVEL_PROCEDURE >= G_CURRENT_RUNTIME_LEVEL ) THEN
2111                    l_log_msg := 'Procedure Pay_Dist_Proc executed';
2112                    FND_LOG.STRING(G_LEVEL_PROCEDURE, G_MODULE_NAME||l_procedure_name, l_log_msg);
2113                END IF;
2114 
2115 
2116            END IF;
2117 
2118        END LOOP;
2119        CLOSE Invoice_Dists;
2120 
2121        IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
2122            l_log_msg := 'l_inv_adj_amount = ' || l_inv_adj_amount;
2123            FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME || l_procedure_name, l_log_msg);
2124        END IF;
2125 
2126        /* Check if there is any change to the invoice liability. If there is
2127           a change then we need to adjust the payment hist distributions for the
2128           old invoice distributions */
2129 
2130 /* uncommenting the code for bug 7560247.
2131    For partially paid invoices are adjusted, for the payment's
2132    adjustment events, the values are populating wrongly.
2133    Due to commenting the below code, it is inserting the data
2134    in payment hist dist only for the adjusted distributions and not for all
2135    the distributions. But it should do for all the distributions */
2136 
2137  --/*  commented the code for bug 7147610
2138  -- For the Payment Adjustments we are populating the
2139  -- Payment Hists Dists in the cursor loop Invoice_Dists
2140  -- This Inv_Adj_Dists is not required.
2141        IF l_inv_adj_amount <> 0 THEN
2142 
2143           OPEN Inv_Adj_Dists(l_pay_hist_rec.invoice_adjustment_event_id,
2144                              l_inv_rec.invoice_id,
2145                              l_pay_hist_rec.related_event_id);
2146           LOOP
2147 
2148                FETCH Inv_Adj_Dists INTO l_inv_dist_rec;
2149                EXIT WHEN Inv_Adj_Dists%NOTFOUND OR
2150                          Inv_Adj_Dists%NOTFOUND IS NULL;
2151 
2152 
2153                IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
2154                    l_log_msg := 'CUR: Inv_Adj_Dists: Invoice_Distribution_ID = '
2155                                         ||l_inv_dist_rec.invoice_distribution_id;
2156                    FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME || l_procedure_name, l_log_msg);
2157                END IF;
2158 
2159 
2160                IF (G_LEVEL_PROCEDURE >= G_CURRENT_RUNTIME_LEVEL ) THEN
2161                    l_log_msg := 'Calling procedure Pay_Dist_Proc for dist: '
2162                                      || l_inv_dist_rec.invoice_distribution_id;
2163                    FND_LOG.STRING(G_LEVEL_PROCEDURE, G_MODULE_NAME||l_procedure_name, l_log_msg);
2164                END IF;
2165 
2166                Pay_Dist_Proc(p_xla_event_rec,
2167                              l_inv_pay_rec,
2168                              l_pay_hist_rec,
2169                              l_inv_rec,
2170                              l_inv_dist_rec,
2171                              'C',
2172                              l_final_payment, --bug 9495429
2173                              l_curr_calling_sequence);
2174 
2175                IF (G_LEVEL_PROCEDURE >= G_CURRENT_RUNTIME_LEVEL ) THEN
2176                    l_log_msg := 'Procedure Pay_Dist_Proc executed';
2177                    FND_LOG.STRING(G_LEVEL_PROCEDURE, G_MODULE_NAME||l_procedure_name, l_log_msg);
2178                END IF;
2179 
2180 
2181           END LOOP;
2182           CLOSE Inv_Adj_Dists;
2183        END IF;
2184   /* code changes end for the bug 7560247 */
2185 
2186        --bug 9495429, resetting global variables to 0
2187        G_Total_Dist_Amt           := 0;
2188        G_Total_Prorated_Amt       := 0;
2189        G_Total_Prorated_Disc_Amt  := 0;
2190        G_Total_Inv_Dist_Amt       := 0;
2191        G_Total_Inv_Dist_Disc_Amt  := 0;
2192        G_Total_Bank_Curr_Amt      := 0;
2193        G_Total_Bank_Curr_Disc_Amt := 0;
2194        G_Last_NonExcluded_Dist_ID := 0;
2195        G_Inv_Adj_Amount           := 0;
2196 
2197     -- BUG 7454170 and BUG 7489271
2198     -- Calling rounding only once for all payment adjsument events
2199     -- for each invoice payment level.
2200 
2201     SELECT max(aph2.payment_history_id) into l_do_round
2202       FROM ap_payment_history_all aph1,
2203            ap_payment_history_all aph2
2204      WHERE aph1.payment_history_id = l_pay_hist_rec.payment_history_id
2205        AND aph2.check_id = aph1.check_id
2206        AND aph2.posted_flag <> 'Y'
2207 	   AND aph1.posted_flag <> 'Y'
2208        AND aph1.transaction_type = aph2.transaction_type
2209        AND l_invoice_id = (SELECT invoice_id
2210                            FROM ap_invoice_distributions_all d
2211                            WHERE d.accounting_event_id = aph2.invoice_adjustment_event_id
2212                            AND rownum = 1);
2213 
2214     IF ( l_do_round = l_pay_hist_rec.payment_history_id ) Then
2215 
2216 
2217        SELECT SUM(DECODE(APHD.Pay_Dist_Lookup_Code, 'CASH', APHD.Amount, 0)),
2218               SUM(DECODE(APHD.Pay_Dist_Lookup_Code, 'DISCOUNT', APHD.Amount, 0)),
2219               SUM(DECODE(APHD.Pay_Dist_Lookup_Code, 'BANK ERROR', APHD.Amount, 0)),
2220               SUM(DECODE(APHD.Pay_Dist_Lookup_Code, 'BANK CHARGE', APHD.Amount, 0))
2221        INTO   l_sum_paid_amount,
2222               l_sum_disc_amount,
2223               l_sum_error_amount,
2224               l_sum_charge_amount
2225        FROM   AP_Payment_Hist_Dists APHD,
2226               AP_Invoice_Distributions_All AID,
2227               AP_Payment_History_All APH
2228        WHERE  APH.Related_Event_ID = l_pay_hist_rec.related_event_id
2229        AND    APHD.Invoice_Payment_ID = l_inv_pay_rec.invoice_payment_id
2230        AND    APH.Payment_History_ID = APHD.Payment_History_ID
2231        AND    APHD.Invoice_Distribution_ID = AID.Invoice_Distribution_ID
2232        AND    AID.Invoice_ID = l_invoice_id;
2233 
2234        --bug 9495429, removed updates for technical rounding, now being handled
2235        --in Pay_Dist_Proc
2236 
2237        IF (l_inv_pay_rec.discount_taken <> 0) THEN
2238 
2239            IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
2240                l_log_msg := 'Adjusting discount amount for technical rounding';
2241                FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME || l_procedure_name, l_log_msg);
2242            END IF;
2243 
2244            /* Adjust the discount amount for technical rounding */
2245           IF (P_XLA_Event_Rec.Event_Type_Code IN ('PAYMENT CLEARING ADJUSTED')
2246              AND l_pay_hist_rec.bank_currency_code = l_pay_hist_rec.pmt_currency_code) THEN
2247              UPDATE AP_Payment_Hist_Dists APD
2248              SET   APD.Amount = APD.amount + l_tech_disc_rnd_amt,
2249                    APD.bank_curr_amount = APD.bank_curr_amount + l_tech_disc_rnd_amt,
2250                    APD.Cleared_Base_Amount = Decode(l_pay_hist_rec.bank_currency_code,
2251                                                     ap_accounting_pay_pkg.g_base_currency_code,
2252                                                     APD.Cleared_Base_Amount + l_tech_disc_rnd_amt,
2253                                                     APD.Cleared_Base_Amount),
2254                    APD.Paid_Base_Amount = Decode(l_pay_hist_rec.bank_currency_code,
2255                                                  ap_accounting_pay_pkg.g_base_currency_code,
2256                                                  APD.Paid_Base_Amount + l_tech_disc_rnd_amt,
2257                                                  APD.Paid_Base_Amount),
2258                    APD.Matured_Base_Amount = Decode(l_pay_hist_rec.bank_currency_code,
2259                                                     ap_accounting_pay_pkg.g_base_currency_code,
2260                                                     APD.Matured_Base_Amount + l_tech_disc_rnd_amt,
2261                                                     APD.Matured_Base_Amount),
2262                    APD.Invoice_Dist_Base_Amount = Decode(l_pay_hist_rec.bank_currency_code,
2263                                                        ap_accounting_pay_pkg.g_base_currency_code,
2264                                                      Decode(l_pay_hist_rec.bank_currency_code,
2265                                                         l_inv_rec.invoice_currency_code,
2266                                                         APD.Invoice_Dist_Base_Amount + l_tech_disc_rnd_amt,
2267                                                         APD.Invoice_Dist_Base_Amount),
2268                                                      APD.Invoice_Dist_Base_Amount),
2269                    APD.Invoice_Dist_Amount = Decode(l_pay_hist_rec.bank_currency_code,
2270                                                     l_inv_rec.invoice_currency_code,
2271                                                     APD.Invoice_Dist_Amount + l_tech_disc_rnd_amt,
2272                                                     APD.Invoice_Dist_Amount)
2273              WHERE  APD.Invoice_Distribution_ID =
2274                     (SELECT MAX(APD1.Invoice_Distribution_ID)
2275                      FROM   AP_Payment_Hist_Dists APD1
2276                      WHERE  APD1.Accounting_Event_ID = p_xla_event_rec.event_id
2277                      AND    APD1.Invoice_Payment_ID = l_inv_pay_rec.invoice_payment_id
2278                      AND    APD1.Pay_Dist_Lookup_Code = 'DISCOUNT'
2279                      AND    ABS(APD1.Amount) =
2280                            (SELECT MAX(APD2.Amount)
2281                             FROM   AP_Payment_Hist_Dists APD2
2282                             WHERE  APD2.Accounting_Event_ID = p_xla_event_rec.event_id
2283                             AND    APD2.Invoice_Payment_ID = l_inv_pay_rec.invoice_payment_id
2284                             AND    APD2.Pay_Dist_Lookup_Code = 'DISCOUNT'))
2285              AND    APD.Pay_Dist_Lookup_Code = 'DISCOUNT'
2286              AND    APD.Invoice_Payment_ID = l_inv_pay_rec.invoice_payment_id
2287              AND    APD.Payment_History_ID = l_pay_hist_rec.payment_history_id
2288              AND    APD.Accounting_Event_ID = p_xla_event_rec.event_id;
2289           ELSIF P_XLA_Event_Rec.Event_Type_Code IN ('PAYMENT ADJUSTED') THEN
2290 
2291           -- Bug 13081266 start
2292           /*This selection and update statemen massage last big distribution of discount distribution */
2293 
2294               SELECT SUM (DECODE (APHD.Pay_Dist_Lookup_Code, 'DISCOUNT', APHD.Amount, 0))
2295                    , SUM (DECODE (APHD.Pay_Dist_Lookup_Code, 'DISCOUNT', APHD.invoice_dist_amount, 0))
2296                    , SUM (DECODE (APHD.Pay_Dist_Lookup_Code, 'DISCOUNT', APHD.bank_curr_amount, 0))
2297                    , SUM (DECODE (APHD.Pay_Dist_Lookup_Code, 'DISCOUNT', APHD.invoice_dist_base_amount, 0))
2298                    , SUM (DECODE (APHD.Pay_Dist_Lookup_Code, 'DISCOUNT', APHD.paid_base_amount, 0))
2299                    , SUM (DECODE (APHD.Pay_Dist_Lookup_Code, 'DISCOUNT', APHD.cleared_base_amount, 0))
2300                 INTO l_sum_disc_amount
2301                    , l_sum_disc_dist_amount
2302                    , l_sum_disc_bank_curr_amount
2303                    , l_sum_disc_dist_base_amount
2304                    , l_sum_disc_paid_base_amount
2305                    , l_sum_disc_clr_base_amount
2306                 FROM AP_Payment_Hist_Dists APHD
2307                WHERE APHD.Invoice_Payment_ID = l_inv_pay_rec.invoice_payment_id
2308                  AND APHD.Payment_History_ID = l_pay_hist_rec.Payment_History_ID;
2309 
2310 
2311               SELECT MAX (APD1.Invoice_Distribution_ID)
2312                 INTO l_max_disc_dist_id
2313                 FROM AP_Payment_Hist_Dists APD1
2314                WHERE APD1.Accounting_Event_ID  = p_xla_event_rec.event_id
2315                  AND APD1.Invoice_Payment_ID   = l_inv_pay_rec.invoice_payment_id
2316                  AND APD1.Pay_Dist_Lookup_Code = 'DISCOUNT'
2317                  AND ABS (APD1.Amount)         =
2318                      (SELECT ABS (MAX (APD2.Amount))
2319                          FROM AP_Payment_Hist_Dists APD2
2320                         WHERE APD2.Accounting_Event_ID  = p_xla_event_rec.event_id
2321                           AND APD2.Invoice_Payment_ID   = l_inv_pay_rec.invoice_payment_id
2322                           AND APD2.Pay_Dist_Lookup_Code = 'DISCOUNT') ;
2323 
2324               UPDATE AP_Payment_Hist_Dists APD
2325                  SET APD.Amount                   = APD.Amount - l_sum_disc_amount
2326                    , APD.Invoice_Dist_Amount      = APD.Invoice_Dist_Amount - l_sum_disc_dist_amount
2327                    , APD.bank_curr_amount         = APD.bank_curr_amount - l_sum_disc_bank_curr_amount
2328                    , APD.Invoice_Dist_Base_Amount = APD.Invoice_Dist_Base_Amount - l_sum_disc_dist_base_amount
2329                    , APD.Paid_Base_Amount         = APD.Paid_Base_Amount - l_sum_disc_paid_base_amount
2330                    , apd.cleared_base_amount      = apd.cleared_base_amount - l_sum_disc_clr_base_amount
2331                WHERE APD.Invoice_Distribution_ID  = l_max_disc_dist_id
2332                  AND APD.Pay_Dist_Lookup_Code     = 'DISCOUNT'
2333                  AND APD.Invoice_Payment_ID       = l_inv_pay_rec.invoice_payment_id
2334                  AND APD.Payment_History_ID       = l_pay_hist_rec.payment_history_id
2335                  AND APD.Accounting_Event_ID      = p_xla_event_rec.event_id;
2336 
2337              /*This update statement massage last big distribution of CASH distribution
2338              because when this code reaches here, pay_dist_proc call is already over as above update adjusted
2339              discount amount after all technical rounding so the same amount for same distribution id we are
2340              adjusting here. */
2341 
2342               UPDATE AP_Payment_Hist_Dists APD
2343                  SET APD.Amount                   = APD.Amount + l_sum_disc_amount
2344                    , APD.Invoice_Dist_Amount      = APD.Invoice_Dist_Amount + l_sum_disc_dist_amount
2345                    , APD.bank_curr_amount         = APD.bank_curr_amount + l_sum_disc_bank_curr_amount
2346                    , APD.Invoice_Dist_Base_Amount = APD.Invoice_Dist_Base_Amount + l_sum_disc_dist_base_amount
2347                    , APD.Paid_Base_Amount         = APD.Paid_Base_Amount + l_sum_disc_paid_base_amount
2348                    , apd.cleared_base_amount      = apd.cleared_base_amount + l_sum_disc_clr_base_amount
2349                WHERE APD.Invoice_Distribution_ID  = l_max_disc_dist_id
2350                  AND APD.Pay_Dist_Lookup_Code     = 'CASH'
2351                  AND APD.Invoice_Payment_ID       = l_inv_pay_rec.invoice_payment_id
2352                  AND APD.Payment_History_ID       = l_pay_hist_rec.payment_history_id
2353                  AND APD.Accounting_Event_ID      = p_xla_event_rec.event_id;
2354            -- Bug 13081266 end
2355 
2356           END IF;
2357        END IF;
2358 
2359        IF (l_pay_hist_rec.errors_bank_amount <> 0) THEN
2360 
2361            IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
2362                l_log_msg := 'Adjusting errors bank amount for technical rounding';
2363                FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME || l_procedure_name, l_log_msg);
2364            END IF;
2365 
2366 
2367            /* Adjust the bank errors amount for technical rounding */
2368            UPDATE AP_Payment_Hist_Dists APD
2369            SET    APD.Amount = APD.Amount -  NVL(l_sum_error_amount,0)
2370                                      + l_pay_hist_rec.errors_bank_amount
2371            WHERE  APD.Invoice_Distribution_ID =
2372                  (SELECT MAX(APD1.Invoice_Distribution_ID)
2373                   FROM   AP_Payment_Hist_Dists APD1
2374                   WHERE  APD1.Accounting_Event_ID = p_xla_event_rec.event_id
2375                   AND    APD1.Invoice_Payment_ID = l_inv_pay_rec.invoice_payment_id
2376                   AND    APD1.Pay_Dist_Lookup_Code = 'BANK ERROR'
2377                   AND    ABS(APD1.Amount) =
2378                         (SELECT MAX(APD2.Amount)
2379                          FROM   AP_Payment_Hist_Dists APD2
2380                          WHERE  APD2.Accounting_Event_ID = p_xla_event_rec.event_id
2381                          AND    APD2.Invoice_Payment_ID = l_inv_pay_rec.invoice_payment_id
2382                          AND    APD2.Pay_Dist_Lookup_Code = 'BANK ERROR'))
2383           AND    APD.Pay_Dist_Lookup_Code = 'BANK ERROR'
2384           AND    APD.Invoice_Payment_ID = l_inv_pay_rec.invoice_payment_id
2385           AND    APD.Payment_History_ID = l_pay_hist_rec.payment_history_id
2386           AND    APD.Accounting_Event_ID = p_xla_event_rec.event_id;
2387 
2388        END IF;
2389 
2390        IF (l_pay_hist_rec.charges_bank_amount <> 0) THEN
2391 
2392 
2393            IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
2394                l_log_msg := 'Adjusting charges bank amount for technical rounding';
2395                FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME || l_procedure_name, l_log_msg);
2396            END IF;
2397 
2398            /* Adjust the bank charges amount for technical rounding */
2399            UPDATE AP_Payment_Hist_Dists APD
2400            SET    APD.Amount = APD.Amount -  NVL(l_sum_charge_amount,0)
2401                                      + l_pay_hist_rec.charges_bank_amount
2402            WHERE  APD.Invoice_Distribution_ID =
2403                  (SELECT MAX(APD1.Invoice_Distribution_ID)
2404                   FROM   AP_Payment_Hist_Dists APD1
2405                   WHERE  APD1.Accounting_Event_ID = p_xla_event_rec.event_id
2406                   AND    APD1.Invoice_Payment_ID = l_inv_pay_rec.invoice_payment_id
2407                   AND    APD1.Pay_Dist_Lookup_Code = 'BANK CHARGE'
2408                   AND    ABS(APD1.Amount) =
2409                         (SELECT MAX(APD2.Amount)
2410                          FROM   AP_Payment_Hist_Dists APD2
2411                          WHERE  APD2.Accounting_Event_ID = p_xla_event_rec.event_id
2412                          AND    APD2.Invoice_Payment_ID = l_inv_pay_rec.invoice_payment_id
2413                          AND    APD2.Pay_Dist_Lookup_Code = 'BANK CHARGE'))
2414           AND    APD.Pay_Dist_Lookup_Code = 'BANK CHARGE'
2415           AND    APD.Invoice_Payment_ID = l_inv_pay_rec.invoice_payment_id
2416           AND    APD.Payment_History_ID = l_pay_hist_rec.payment_history_id
2417           AND    APD.Accounting_Event_ID = p_xla_event_rec.event_id;
2418 
2419        END IF;
2420 
2421 
2422        IF (G_LEVEL_PROCEDURE >= G_CURRENT_RUNTIME_LEVEL ) THEN
2423            l_log_msg := 'Calling procedure P_Acctg_Pay_Round_Pkg.Do_Rounding for Invoice_ID: '
2424                                     || l_inv_rec.invoice_id;
2425            FND_LOG.STRING(G_LEVEL_PROCEDURE, G_MODULE_NAME||l_procedure_name, l_log_msg);
2426        END IF;
2427 
2428        -- Create total and final payment rounding lines
2429        AP_Acctg_Pay_Round_Pkg.Do_Rounding
2430                      (p_xla_event_rec,
2431                       l_pay_hist_rec,
2432                       NULL, -- clr hist rec
2433                       l_inv_rec,
2434                       l_inv_pay_rec,
2435                       NULL, -- prepay inv rec
2436                       NULL, -- prepay hist rec
2437                       NULL, -- prepay dist rec
2438                       l_curr_calling_sequence);
2439 
2440        IF (G_LEVEL_PROCEDURE >= G_CURRENT_RUNTIME_LEVEL ) THEN
2441            l_log_msg := 'Procedure P_Acctg_Pay_Round_Pkg.Do_Rounding executed';
2442            FND_LOG.STRING(G_LEVEL_PROCEDURE, G_MODULE_NAME||l_procedure_name, l_log_msg);
2443        END IF;
2444     END IF; --l_do_round = l_pay_hist_rec.payment_history_id 7489271
2445 
2446   END LOOP;
2447   CLOSE Adj_Invoice_Payments;
2448 
2449 
2450   IF l_pay_hist_rec.Errors_Bank_Amount <> 0 THEN
2451 
2452      IF (G_LEVEL_PROCEDURE >= G_CURRENT_RUNTIME_LEVEL ) THEN
2453          l_log_msg := 'Calling procedure Pay_Dist_Err_Chrg for errors bank amount';
2454          FND_LOG.STRING(G_LEVEL_PROCEDURE, G_MODULE_NAME||l_procedure_name, l_log_msg);
2455      END IF;
2456 
2457      --bug 5659368
2458      Pay_Dist_Err_Chrg
2459           ( p_xla_event_rec     => p_xla_event_rec
2460             ,p_pay_hist_rec     => l_pay_hist_rec
2461             ,p_distribute_mode  => 'BANK_ERROR'
2462             ,p_calling_sequence => l_curr_calling_sequence);
2463 
2464      IF (G_LEVEL_PROCEDURE >= G_CURRENT_RUNTIME_LEVEL ) THEN
2465          l_log_msg := 'Procedure Pay_Dist_Err_Chrg for errors bank amount executed';
2466          FND_LOG.STRING(G_LEVEL_PROCEDURE, G_MODULE_NAME||l_procedure_name, l_log_msg);
2467      END IF;
2468 
2469 
2470   END IF;
2471 
2472 
2473   IF l_pay_hist_rec.Charges_Bank_Amount <> 0 THEN
2474 
2475      IF (G_LEVEL_PROCEDURE >= G_CURRENT_RUNTIME_LEVEL ) THEN
2476          l_log_msg := 'Calling procedure Pay_Dist_Err_Chrg for charges bank amount';
2477          FND_LOG.STRING(G_LEVEL_PROCEDURE, G_MODULE_NAME||l_procedure_name, l_log_msg);
2478      END IF;
2479 
2480      --bug 5659368
2481      Pay_Dist_Err_Chrg
2482           ( p_xla_event_rec     => p_xla_event_rec
2483             ,p_pay_hist_rec     => l_pay_hist_rec
2484             ,p_distribute_mode  => 'BANK_CHARGE'
2485             ,p_calling_sequence => l_curr_calling_sequence);
2486 
2487      IF (G_LEVEL_PROCEDURE >= G_CURRENT_RUNTIME_LEVEL ) THEN
2488          l_log_msg := 'Procedure Pay_Dist_Err_Chrg for charges bank amount executed';
2489          FND_LOG.STRING(G_LEVEL_PROCEDURE, G_MODULE_NAME||l_procedure_name, l_log_msg);
2490      END IF;
2491 
2492   END IF;
2493 
2494   IF (G_LEVEL_PROCEDURE >= G_CURRENT_RUNTIME_LEVEL ) THEN
2495       l_log_msg := 'Calling procedure Update_Gain_Loss_Ind for payments';
2496       FND_LOG.STRING(G_LEVEL_PROCEDURE, G_MODULE_NAME||l_procedure_name, l_log_msg);
2497   END IF;
2498 
2499   --11698822, call update_gain_loss_ind only for foreign currency txns
2500   IF l_txn_curr_code <> ap_accounting_pay_pkg.g_base_currency_code THEN
2501      Update_Gain_Loss_Ind
2502         (p_xla_event_rec,
2503          l_pay_hist_rec,
2504          l_curr_calling_sequence);
2505   END IF;
2506 
2507   IF (G_LEVEL_PROCEDURE >= G_CURRENT_RUNTIME_LEVEL ) THEN
2508       l_log_msg := 'Procedure Update_Gain_Loss_Ind executed';
2509       FND_LOG.STRING(G_LEVEL_PROCEDURE, G_MODULE_NAME||l_procedure_name, l_log_msg);
2510   END IF;
2511 
2512 
2513   -- Logging Infra: Procedure level
2514   IF (G_LEVEL_PROCEDURE >= G_CURRENT_RUNTIME_LEVEL ) THEN
2515       l_log_msg := 'End of procedure '|| l_procedure_name;
2516       FND_LOG.STRING(G_LEVEL_PROCEDURE, G_MODULE_NAME||l_procedure_name||'.end', l_log_msg);
2517   END IF;
2518 
2519 
2520 EXCEPTION
2521   WHEN OTHERS THEN
2522     IF SQLCODE = -20100 THEN
2523        RAISE_APPLICATION_ERROR(-20100, SQLERRM);
2524     ELSIF (SQLCODE <> -20001) THEN
2525       FND_MESSAGE.SET_NAME('SQLAP','AP_DEBUG');
2526       FND_MESSAGE.SET_TOKEN('ERROR',SQLERRM);
2527       FND_MESSAGE.SET_TOKEN('CALLING_SEQUENCE', l_curr_calling_sequence);
2528     END IF;
2529     APP_EXCEPTION.RAISE_EXCEPTION;
2530 
2531 END Pay_Dist_Cascade_Adj_Events;
2532 
2533 ---------------------------------------------------------------------
2534 -- Procedure Pay_Dist_Proc
2535 -- This procedure prorates the payment amounts for each distribution
2536 -- and inserts the calculated values into payment hist dists table
2537 -- Also calculates discounts and ERV
2538 ---------------------------------------------------------------------
2539 
2540 PROCEDURE Pay_Dist_Proc
2541       (p_xla_event_rec      IN    ap_accounting_pay_pkg.r_xla_event_info
2542       ,p_inv_pay_rec        IN    r_inv_pay_info
2543       ,p_pay_hist_rec       IN    ap_accounting_pay_pkg.r_pay_hist_info
2544       ,p_inv_rec            IN    ap_accounting_pay_pkg.r_invoices_info
2545       ,p_inv_dist_rec       IN    ap_accounting_pay_pkg.r_inv_dist_info
2546       ,p_calc_mode          IN    VARCHAR2
2547       ,p_final_payment      IN    BOOLEAN
2548       ,p_calling_sequence   IN    VARCHAR2
2549       ) IS
2550 
2551 
2552   l_curr_calling_sequence       VARCHAR2(2000);
2553   l_dist_amt_pay_curr           NUMBER;
2554   l_dist_amt_bank_curr          NUMBER;
2555   l_pay_amount_inv_curr         NUMBER;
2556   l_pay_amount_bank_curr        NUMBER;
2557   l_prorated_amount             NUMBER;
2558   l_prorated_base_amount        NUMBER;
2559   l_inv_dist_amount             NUMBER;
2560   l_bank_curr_amount            NUMBER;
2561 
2562   l_disc_pay_amount             NUMBER := 0;
2563   l_disc_dist_amount            NUMBER := 0;
2564   l_disc_bank_amount            NUMBER := 0;
2565 
2566   l_total_paid_amt              NUMBER;
2567   l_total_prepaid_amt           NUMBER;
2568   l_tot_paid_amt_inv_curr       NUMBER;
2569   l_tot_paid_amt_bank_curr      NUMBER;
2570   l_tot_prepaid_amt_pay_curr    NUMBER;
2571   l_tot_prepaid_amt_bank_curr   NUMBER;
2572   l_proration_divisor           NUMBER;
2573   l_total_dist_amount           NUMBER;
2574 
2575   l_qty_variance                NUMBER;
2576   l_base_qty_variance           NUMBER;
2577   l_amt_variance                NUMBER;
2578   l_base_amt_variance           NUMBER;
2579 
2580   l_pd_rec                      AP_PAYMENT_HIST_DISTS%ROWTYPE;
2581 
2582 --Bug 9282465  start
2583   l_total_paid_base_amt         NUMBER;
2584   l_tot_paid_inv_base_amt       NUMBER;
2585   l_tot_paid_cleared_base_amt   NUMBER;
2586   l_total_prepaid_base_amt      NUMBER;
2587   l_total_prepaid_inv_base_amt  NUMBER;
2588   l_total_prepaid_clr_base_amt  NUMBER;
2589   l_inv_dist_base_amount        NUMBER;
2590   l_cleared_base_amount         NUMBER;
2591   l_paid_base_amount            NUMBER;
2592 --Bug 9282465 end
2593   l_inv_adj_amount     NUMBER       := 0; --bug 9495429
2594   -- Logging Infra:
2595   l_procedure_name CONSTANT VARCHAR2(30) := 'Pay_Dist_Proc';
2596   l_log_msg        FND_LOG_MESSAGES.MESSAGE_TEXT%TYPE;
2597 
2598 BEGIN
2599 
2600   l_curr_calling_sequence := 'AP_ACCTG_PAY_DIST_PKG.Pay_Dist_Proc<- ' ||
2601                                               p_calling_sequence;
2602 
2603   -- Logging Infra: Procedure level
2604   IF (G_LEVEL_PROCEDURE >= G_CURRENT_RUNTIME_LEVEL ) THEN
2605       l_log_msg := 'Begin of procedure '|| l_procedure_name;
2606       FND_LOG.STRING(G_LEVEL_PROCEDURE, G_MODULE_NAME||l_procedure_name||'.begin', l_log_msg);
2607   END IF;
2608 
2609 
2610   IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
2611       l_log_msg := 'Parameters: Invoice_ID = '|| p_inv_rec.invoice_id
2612                    ||'Invoice_Dist_ID = '|| p_inv_dist_rec.invoice_distribution_id;
2613       FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME || l_procedure_name, l_log_msg);
2614   END IF;
2615     /*Commented code removed*/
2616     /* Performance Fix 7308385 starts */
2617   --bug 9495429 start
2618   IF p_calc_mode IN ('P', 'M') THEN
2619      l_total_dist_amount := G_Total_Dist_Amount;
2620   ELSE
2621      IF (G_Inv_Adj_Amount  <> 0) THEN
2622         l_total_dist_amount := G_Total_Dist_Amount;
2623         -- Performance Fix 7308385 ends
2624      ELSE
2625         l_total_dist_amount := 0;
2626      END IF;
2627   END IF;
2628   --bug 9495429 end
2629 
2630   IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
2631       FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME || l_procedure_name,
2632       'l_total_dist_amount: '||l_total_dist_amount||
2633       ' p_inv_pay_rec.invoice_payment_id: '||p_inv_pay_rec.invoice_payment_id);
2634   END IF;
2635 
2636   IF p_inv_dist_rec.Line_Type_Lookup_Code = 'AWT' THEN
2637     l_proration_divisor := G_Total_Dist_Amount; --bug 9495429
2638     IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
2639       l_log_msg := 'p_inv_dist_rec.Line_Type_Lookup_Code = AWT' ||
2640                    'including AWT and l_proration_divisor =' || NVL(l_proration_divisor,0);
2641       FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME || l_procedure_name, l_log_msg);
2642     END IF;
2643 
2644   ELSE
2645   /*Commented code removed*/
2646   /* Performance Fix 7308385 starts*/
2647    l_proration_divisor := G_Proration_Divisor;
2648 
2649     IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
2650       l_log_msg := 'p_inv_dist_rec.Line_Type_Lookup_Code <> AWT' ||
2651                    'exclude AWT and l_proration_divisor =' || NVL(l_proration_divisor,0);
2652       FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME || l_procedure_name, l_log_msg);
2653     END IF;
2654   END IF;
2655 
2656   -- Converting the distribution amount into payment currency for
2657   -- cross currency invoices.
2658   IF (p_inv_rec.invoice_currency_code <> p_inv_rec.payment_currency_code) THEN
2659 
2660       IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
2661         l_log_msg := 'this is cross currency';
2662         FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME || l_procedure_name, l_log_msg);
2663       END IF;
2664       l_dist_amt_pay_curr := GL_Currency_API.Convert_Amount(
2665                                 p_inv_rec.invoice_currency_code,
2666                                 p_inv_rec.payment_currency_code,
2667                                 p_inv_rec.payment_cross_rate_date,
2668                                 'EMU FIXED',
2669                                 p_inv_dist_rec.amount);
2670 
2671       l_pay_amount_inv_curr := GL_Currency_API.Convert_Amount(
2672                                 p_inv_rec.payment_currency_code,
2673                                 p_inv_rec.invoice_currency_code,
2674                                 p_inv_rec.payment_cross_rate_date,
2675                                 'EMU FIXED',
2676                                 p_inv_pay_rec.amount);
2677 
2678   ELSE
2679 
2680      l_dist_amt_pay_curr := p_inv_dist_rec.amount;
2681      l_pay_amount_inv_curr := p_inv_pay_rec.amount;
2682 
2683   END IF;
2684 
2685   IF (p_xla_event_rec.event_type_code IN ('PAYMENT CLEARED',
2686                                           'PAYMENT CLEARING ADJUSTED')) THEN
2687 
2688       IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
2689           l_log_msg := 'Calculating payment and dist amt in bank currency for event type:'
2690                        ||p_xla_event_rec.event_type_code;
2691           FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME || l_procedure_name, l_log_msg);
2692       END IF;
2693 
2694 
2695       /* Converting the payment and distribution amount into bank currency */
2696       IF ( p_pay_hist_rec.pmt_currency_code <> p_pay_hist_rec.bank_currency_code
2697            AND p_pay_hist_rec.bank_currency_code is not NULL )  THEN
2698 
2699           IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
2700             l_log_msg := '1. payment currency code <> bank_currency_code and' ||
2701                          'p_pay_hist_rec.pmt_currency_code = ' || p_pay_hist_rec.pmt_currency_code ||
2702                          'p_pay_hist_rec.bank_currency_code = ' || p_pay_hist_rec.bank_currency_code ||
2703                          'p_inv_pay_rec.amount = ' || p_inv_pay_rec.amount ||
2704                          'l_dist_amt_pay_curr =' || l_dist_amt_pay_curr ||
2705                          'p_pay_hist_rec.pmt_to_base_xrate = ' || p_pay_hist_rec.pmt_to_base_xrate ||
2706                          'p_pay_hist_rec.bank_to_base_xrate' || p_pay_hist_rec.bank_to_base_xrate;
2707             FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME || l_procedure_name, l_log_msg);
2708           END IF;
2709 
2710 
2711          l_pay_amount_bank_curr := AP_Utilities_Pkg.AP_Round_Currency(
2712                                        p_inv_pay_rec.amount * p_pay_hist_rec.pmt_to_base_xrate
2713                                             /p_pay_hist_rec.bank_to_base_xrate,
2714                                        p_pay_hist_rec.bank_currency_code);
2715 
2716          l_dist_amt_bank_curr := AP_Utilities_Pkg.AP_Round_Currency(
2717                                       l_dist_amt_pay_curr *  p_pay_hist_rec.pmt_to_base_xrate
2718                                             /p_pay_hist_rec.bank_to_base_xrate,
2719                                       p_pay_hist_rec.bank_currency_code);
2720 
2721          IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
2722             l_log_msg := 'after calculation and' ||
2723                          'l_dist_amt_bank_curr = ' || l_dist_amt_bank_curr||
2724                          'l_pay_amount_bank_curr = ' || l_pay_amount_bank_curr;
2725             FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME || l_procedure_name, l_log_msg);
2726          END IF;
2727 
2728       -- Added for bug fix 5694577
2729       ELSE  -- p_pay_hist_rec.pmt_currency_code = p_pay_hist_rec.bank_currency_code
2730 
2731            l_pay_amount_bank_curr := p_inv_pay_rec.amount;
2732            l_dist_amt_bank_curr := l_dist_amt_pay_curr;
2733 
2734          IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
2735             FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME || l_procedure_name,
2736                          'l_pay_amount_bank_curr = ' || l_pay_amount_bank_curr||
2737                          'l_dist_amt_bank_curr = ' || l_dist_amt_bank_curr);
2738          END IF;
2739 
2740       END IF;  -- end of checking  p_pay_hist_rec.pmt_currency_code <> p_pay_hist_rec.bank_currency_code
2741 
2742   ELSE
2743 
2744      IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
2745           l_log_msg := 'assign some bank related variables for other event type=>'
2746                        ||p_xla_event_rec.event_type_code;
2747           FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME || l_procedure_name, l_log_msg);
2748      END IF;
2749 
2750      l_pay_amount_bank_curr := p_inv_pay_rec.amount;
2751      l_dist_amt_bank_curr := l_dist_amt_pay_curr;
2752 
2753      IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
2754         l_log_msg := 'payment currency code = bank currency code for event type '||
2755                          'l_dist_amt_bank_curr = ' || l_dist_amt_bank_curr||
2756                          'l_pay_amount_bank_curr = ' || l_pay_amount_bank_curr;
2757         FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME || l_procedure_name, l_log_msg);
2758      END IF;
2759 
2760   END IF; -- end of check event type
2761 
2762 
2763   g_total_dist_amt := g_total_dist_amt + p_inv_dist_rec.amount;
2764 
2765   IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
2766     l_log_msg := 'this run  p_inv_dist_rec.amount = ' ||
2767                   p_inv_dist_rec.amount ||
2768                   'Up to now ->g_total_dist_amt = '||g_total_dist_amt;
2769     FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME || l_procedure_name, l_log_msg);
2770   END IF;
2771 
2772   /* We should distribute the discount amount first so that during the final payment
2773      this discount amount is also considered for adjusting the distribution */
2774   IF p_inv_pay_rec.Discount_Taken <> 0 and
2775      p_inv_dist_rec.Line_Type_Lookup_Code <> 'AWT' THEN
2776 
2777      IF (G_LEVEL_PROCEDURE >= G_CURRENT_RUNTIME_LEVEL ) THEN
2778          l_log_msg := 'Calling procedure Pay_Dist_Discount for dist: '
2779                        || p_inv_dist_rec.invoice_distribution_id;
2780          FND_LOG.STRING(G_LEVEL_PROCEDURE, G_MODULE_NAME||l_procedure_name, l_log_msg);
2781      END IF;
2782 
2783      Pay_Dist_Discount
2784           (p_xla_event_rec,
2785            p_inv_pay_rec,
2786            p_pay_hist_rec,
2787            p_inv_rec,
2788            p_inv_dist_rec,
2789            p_calc_mode,
2790            l_disc_pay_amount,
2791            l_disc_dist_amount,
2792            l_disc_bank_amount,
2793            l_curr_calling_sequence);
2794 
2795      IF (G_LEVEL_PROCEDURE >= G_CURRENT_RUNTIME_LEVEL ) THEN
2796          l_log_msg := 'Procedure Pay_Dist_Discount executed and ' ||
2797                       'p_disc_pay_amount =' || l_disc_pay_amount ||
2798                       'p_disc_dist_amount ='|| l_disc_dist_amount ||
2799                       'p_disc_bank_amount ='|| l_disc_bank_amount;
2800 
2801          FND_LOG.STRING(G_LEVEL_PROCEDURE, G_MODULE_NAME||l_procedure_name, l_log_msg);
2802      END IF;
2803   END IF;
2804 
2805 --  IF (p_calc_mode IN ('P', 'M')) THEN  --bug 9495429
2806 
2807     IF (G_LEVEL_PROCEDURE >= G_CURRENT_RUNTIME_LEVEL ) THEN
2808        l_log_msg := 'calculation mode p_calc_mode =' || p_calc_mode ;
2809        FND_LOG.STRING(G_LEVEL_PROCEDURE, G_MODULE_NAME||l_procedure_name, l_log_msg);
2810     END IF;
2811 
2812       -- If this payment is a final payment for the invoice then we should make sure
2813       -- that the sum of payment distributions amount should be equal to the distribution
2814       -- total. This way the liability is fully relieved.
2815 
2816       IF p_final_payment = TRUE THEN
2817 
2818          IF (G_LEVEL_PROCEDURE >= G_CURRENT_RUNTIME_LEVEL ) THEN
2819              l_log_msg := 'This is a final payment and now calling AP_Accounting_Pay_Pkg.Get_Pay_Sum';
2820              FND_LOG.STRING(G_LEVEL_PROCEDURE, G_MODULE_NAME||l_procedure_name, l_log_msg);
2821          END IF;
2822 
2823          AP_Accounting_Pay_Pkg.Get_Pay_Sum
2824                           (p_inv_dist_rec.invoice_distribution_id,
2825                            p_xla_event_rec.event_type_code,
2826                            l_total_paid_amt,
2827                            l_tot_paid_amt_inv_curr,
2828                            l_tot_paid_amt_bank_curr,
2829                            l_curr_calling_sequence);
2830 
2831          IF (G_LEVEL_PROCEDURE >= G_CURRENT_RUNTIME_LEVEL ) THEN
2832              l_log_msg := 'After Calling function AP_Accounting_Pay_Pkg.Get_Pay_Sum' ||
2833                           'l_total_paid_amt==' || nvl(l_total_paid_amt,0) ||
2834                           'l_tot_paid_amt_inv_curr=' || nvl(l_tot_paid_amt_inv_curr,0) ||
2835                           'l_tot_paid_amt_bank_curr =' || nvl(l_tot_paid_amt_bank_curr,0);
2836              FND_LOG.STRING(G_LEVEL_PROCEDURE, G_MODULE_NAME||l_procedure_name, l_log_msg);
2837          END IF;
2838 
2839 --Bug 9282465
2840 /* 14121992 . re-placed the below function call in the AWT Block
2841          AP_Accounting_Pay_Pkg.Get_Pay_Base_Sum
2842                           (p_inv_dist_rec.invoice_distribution_id,
2843                            p_xla_event_rec.event_type_code,
2844                            l_total_paid_base_amt,
2845                            l_tot_paid_inv_base_amt,
2846                            l_tot_paid_cleared_base_amt,
2847                            l_curr_calling_sequence);
2848 
2849          IF (G_LEVEL_PROCEDURE >= G_CURRENT_RUNTIME_LEVEL ) THEN
2850              l_log_msg := 'After Calling function AP_Accounting_Pay_Pkg.Get_Pay_Base_Sum' ||
2851                           'l_total_paid_base_amt==' || nvl(l_total_paid_base_amt,0) ||
2852                           'l_tot_paid_inv_base_amt=' || nvl(l_tot_paid_inv_base_amt,0) ||
2853                           'l_tot_paid_cleared_base_amt =' || nvl(l_tot_paid_cleared_base_amt,0);
2854              FND_LOG.STRING(G_LEVEL_PROCEDURE, G_MODULE_NAME||l_procedure_name, l_log_msg);
2855          END IF;
2856 */
2857          l_total_prepaid_amt          := AP_Accounting_Pay_Pkg.Get_Prepay_Sum
2858                                              (p_inv_dist_rec.invoice_distribution_id,
2859                                              l_curr_calling_sequence);
2860 
2861          IF (G_LEVEL_PROCEDURE >= G_CURRENT_RUNTIME_LEVEL ) THEN
2862            l_log_msg := 'get pay sum and its amount = ' ||
2863                           l_total_paid_amt ||
2864                         'get prepay sum and its amount = '||
2865                           l_total_prepaid_amt;
2866            FND_LOG.STRING(G_LEVEL_PROCEDURE, G_MODULE_NAME||l_procedure_name, l_log_msg);
2867          END IF;
2868 
2869 --Bug 9282465
2870 /* 14121992 . re-placed the below function call in the AWT Block
2871          AP_Accounting_Pay_Pkg.Get_Prepay_Base_Sum(
2872                            p_inv_dist_rec.invoice_distribution_id,
2873                            l_total_prepaid_base_amt,
2874                            l_total_prepaid_inv_base_amt,
2875                            l_total_prepaid_clr_base_amt,
2876                            l_curr_calling_sequence);
2877 
2878          IF (G_LEVEL_PROCEDURE >= G_CURRENT_RUNTIME_LEVEL ) THEN
2879            l_log_msg := 'get pay base sum and its amount = ' ||
2880                           l_total_paid_base_amt ||
2881                         'get prepay base sum and its amount = '||
2882                           l_total_prepaid_base_amt;
2883            FND_LOG.STRING(G_LEVEL_PROCEDURE, G_MODULE_NAME||l_procedure_name, l_log_msg);
2884          END IF;
2885 */
2886 
2887          -- Converting the distribution and prepaid amount into payment currency for
2888          -- cross currency invoices.
2889          IF (p_inv_rec.invoice_currency_code <> p_inv_rec.payment_currency_code) THEN
2890 
2891              IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
2892                  l_log_msg := 'Converting prepaid amount into payment currency';
2893                  FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME || l_procedure_name, l_log_msg);
2894              END IF;
2895 
2896              l_tot_prepaid_amt_pay_curr := GL_Currency_API.Convert_Amount(
2897                                              p_inv_rec.invoice_currency_code,
2898                                              p_inv_rec.payment_currency_code,
2899                                              p_inv_rec.payment_cross_rate_date,
2900                                              'EMU FIXED',
2901                                              l_total_prepaid_amt);
2902 
2903 
2904          ELSE
2905             l_tot_prepaid_amt_pay_curr := l_total_prepaid_amt;
2906          END IF;
2907 
2908          IF (p_xla_event_rec.event_type_code IN ('PAYMENT CLEARED',
2909                                                  'PAYMENT CLEARING ADJUSTED')) THEN
2910 
2911              IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
2912                  l_log_msg := 'Converting prepaid amount into bank currency';
2913                  FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME || l_procedure_name, l_log_msg);
2914              END IF;
2915 
2916              IF ( p_pay_hist_rec.pmt_currency_code <> p_pay_hist_rec.bank_currency_code
2917                  AND p_pay_hist_rec.bank_currency_code is not NULL )  THEN
2918 
2919                 l_tot_prepaid_amt_bank_curr :=
2920                            AP_Utilities_Pkg.AP_Round_Currency(
2921                                 l_tot_prepaid_amt_pay_curr * p_pay_hist_rec.pmt_to_base_xrate
2922                                         /p_pay_hist_rec.bank_to_base_xrate,
2923                                 p_pay_hist_rec.bank_currency_code);
2924 
2925              ELSE
2926 
2927                 l_tot_prepaid_amt_bank_curr := l_tot_prepaid_amt_pay_curr;
2928              END IF;
2929          END IF;
2930 
2931 
2932          /* If this payment is a final payment then we should make sure that the
2933             distributed payment amount equals the distribution amount. This way the
2934             the liability for the distribution is relieved completely */
2935 
2936          -- use NVL to make sure the following amt won't be NULL
2937          /*bug 8975671, removed l_disc_pay_amount from the equations below as the total paid amounts in all
2938            all currencies is inclusive of the discount amount in APHD*/
2939 
2940 --Bug 9282465
2941          IF p_inv_dist_rec.line_type_lookup_code = 'AWT' THEN --bug9059910
2942             l_prorated_amount       := NVL(l_dist_amt_pay_curr, 0) + NVL(l_total_paid_amt, 0)
2943                                              - NVL(l_tot_prepaid_amt_pay_curr, 0);
2944             l_inv_dist_amount       := NVL(p_inv_dist_rec.amount, 0) + NVL(l_tot_paid_amt_inv_curr, 0)
2945                                              - NVL(l_total_prepaid_amt, 0);
2946 
2947          AP_Accounting_Pay_Pkg.Get_Pay_Base_Sum
2948                           (p_inv_dist_rec.invoice_distribution_id,
2949                            p_xla_event_rec.event_type_code,
2950                            l_total_paid_base_amt,
2951                            l_tot_paid_inv_base_amt,
2952                            l_tot_paid_cleared_base_amt,
2953                            l_curr_calling_sequence);
2954 
2955          IF (G_LEVEL_PROCEDURE >= G_CURRENT_RUNTIME_LEVEL ) THEN
2956              l_log_msg := 'After Calling function AP_Accounting_Pay_Pkg.Get_Pay_Base_Sum' ||
2957                           'l_total_paid_base_amt==' || nvl(l_total_paid_base_amt,0) ||
2958                           'l_tot_paid_inv_base_amt=' || nvl(l_tot_paid_inv_base_amt,0) ||
2959                           'l_tot_paid_cleared_base_amt =' || nvl(l_tot_paid_cleared_base_amt,0);
2960              FND_LOG.STRING(G_LEVEL_PROCEDURE, G_MODULE_NAME||l_procedure_name, l_log_msg);
2961          END IF;
2962 
2963          AP_Accounting_Pay_Pkg.Get_Prepay_Base_Sum(
2964                            p_inv_dist_rec.invoice_distribution_id,
2965                            l_total_prepaid_base_amt,
2966                            l_total_prepaid_inv_base_amt,
2967                            l_total_prepaid_clr_base_amt,
2968                            l_curr_calling_sequence);
2969 
2970          IF (G_LEVEL_PROCEDURE >= G_CURRENT_RUNTIME_LEVEL ) THEN
2971            l_log_msg := 'get pay base sum and its amount = ' ||
2972                           l_total_paid_base_amt ||
2973                         'get prepay base sum and its amount = '||
2974                           l_total_prepaid_base_amt;
2975            FND_LOG.STRING(G_LEVEL_PROCEDURE, G_MODULE_NAME||l_procedure_name, l_log_msg);
2976          END IF;
2977 
2978 
2979 
2980             --bug 10179705
2981             IF p_inv_dist_rec.awt_invoice_payment_id IS NOT NULL THEN
2982                l_inv_dist_base_amount := AP_Utilities_Pkg.AP_Round_Currency(
2983                                       NVL((p_inv_dist_rec.base_amount * nvl(p_inv_rec.exchange_rate, 1)
2984                                          / (nvl(p_pay_hist_rec.pmt_to_base_xrate,1) * nvl(p_inv_rec.payment_cross_rate ,1)))
2985                                       + NVL(l_tot_paid_inv_base_amt,0) - NVL(l_total_prepaid_inv_base_amt,0),
2986                                       l_inv_dist_amount),
2987                                       ap_accounting_pay_pkg.g_base_currency_code);
2988                l_paid_base_amount     := NVL(p_inv_dist_rec.base_amount, 0) + NVL(l_total_paid_base_amt, 0); --bug 11066774
2989             ELSE
2990                l_inv_dist_base_amount := NVL(p_inv_dist_rec.base_amount + NVL(l_tot_paid_inv_base_amt,0)
2991                                          - NVL(l_total_prepaid_inv_base_amt,0),l_inv_dist_amount);
2992                l_paid_base_amount     := NVL(l_inv_dist_base_amount * NVL(p_inv_rec.payment_cross_rate ,1)
2993                                          * NVL(p_pay_hist_rec.pmt_to_base_xrate,1) / NVL(p_inv_rec.exchange_rate,1),l_prorated_amount);
2994             END IF;
2995 
2996             --11698822
2997             IF p_inv_dist_rec.awt_invoice_payment_id IS NULL OR
2998                   p_pay_hist_rec.pmt_currency_code = p_pay_hist_rec.bank_currency_code THEN
2999                l_bank_curr_amount      := NVL(l_dist_amt_bank_curr, 0) + NVL(l_tot_paid_amt_bank_curr, 0)
3000                                           - NVL(l_tot_prepaid_amt_bank_curr, 0);
3001             ELSE  --only for pay time awt dists for ledger currency clearing txns
3002                l_bank_curr_amount := l_paid_base_amount;
3003             END IF;
3004 
3005             --This logic needs to modify when we are getting issues.
3006             IF ( p_pay_hist_rec.pmt_currency_code = p_pay_hist_rec.bank_currency_code) THEN
3007                  l_cleared_base_amount   := l_paid_base_amount * nvl(p_pay_hist_rec.bank_to_base_xrate,1)
3008                                              /nvl(p_pay_hist_rec.pmt_to_base_xrate,1);
3009             ELSE
3010                  l_cleared_base_amount   := l_bank_curr_amount;
3011             END IF;
3012 
3013          ELSE
3014             l_prorated_amount := NVL(l_dist_amt_pay_curr, 0) - NVL(l_total_paid_amt, 0)
3015                               + NVL(l_tot_prepaid_amt_pay_curr, 0);
3016             l_inv_dist_amount := NVL(p_inv_dist_rec.amount, 0) - NVL(l_tot_paid_amt_inv_curr, 0)
3017                               + NVL(l_total_prepaid_amt, 0);
3018             IF (p_pay_hist_rec.pmt_currency_code <> p_pay_hist_rec.bank_currency_code
3019                 and p_pay_hist_rec.bank_currency_code is not null )  THEN --12328487 start
3020 
3021               IF ((g_total_dist_amt = l_total_dist_amount) AND
3022                 NOT (((g_proration_divisor + g_pay_awt_total_amt) = 0)
3023                      AND (l_pay_amount_inv_curr = 0)
3024                      AND (p_inv_dist_rec.line_type_lookup_code ='AWT'))) THEN --Bug 9078285
3025 
3026                IF (G_LEVEL_PROCEDURE >= G_CURRENT_RUNTIME_LEVEL ) THEN
3027                   l_log_msg := 'g_total_dist_amt equal l_total_dist_amount =' ||
3028                                 l_total_dist_amount;
3029                   FND_LOG.STRING(G_LEVEL_PROCEDURE, G_MODULE_NAME||l_procedure_name, l_log_msg);
3030                END IF;
3031 
3032                -- To avoid rounding in case bank currency is same as ledger curreny, massage the last (biggest) line
3033                l_bank_curr_amount := l_pay_amount_bank_curr - g_total_bank_curr_amt;
3034 
3035                IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
3036                    l_log_msg := 'l_bank_curr_amount = ' || l_bank_curr_amount;
3037                    FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME || l_procedure_name, l_log_msg);
3038                END IF;
3039 
3040               ELSE
3041                 l_bank_curr_amount   := AP_Utilities_Pkg.AP_Round_Currency(
3042                                                         l_prorated_amount
3043                                                              * nvl(p_pay_hist_rec.pmt_to_base_xrate,1)
3044                                                              / nvl(p_pay_hist_rec.bank_to_base_xrate,1)
3045                                                         ,p_pay_hist_rec.bank_currency_code);
3046               END IF; -- g_total_dist_amt = l_total_dist_amount
3047 
3048              ELSE
3049                 l_bank_curr_amount := NVL(l_dist_amt_bank_curr, 0) - NVL(l_tot_paid_amt_bank_curr, 0)
3050                                       + NVL(l_tot_prepaid_amt_bank_curr, 0);
3051             END IF;	-- p_pay_hist_rec.pmt_currency_code <> p_pay_hist_rec.bank_currency_code 12328487 END
3052 
3053            /* l_bank_curr_amount := NVL(l_dist_amt_bank_curr, 0) - NVL(l_tot_paid_amt_bank_curr, 0)
3054                               + NVL(l_tot_prepaid_amt_bank_curr, 0);*/
3055          END IF;
3056 
3057          IF (G_LEVEL_PROCEDURE >= G_CURRENT_RUNTIME_LEVEL ) THEN
3058            l_log_msg := 'Value for l_prorated_amount = ' || l_prorated_amount ||
3059                         'Value for l_inv_dist_amount = ' || l_inv_dist_amount ||
3060                         'Value for l_bank_curr_amount =' || l_bank_curr_amount;
3061 
3062            FND_LOG.STRING(G_LEVEL_PROCEDURE, G_MODULE_NAME||l_procedure_name, l_log_msg);
3063          END IF;
3064 
3065       ELSE
3066 
3067          IF (G_LEVEL_PROCEDURE >= G_CURRENT_RUNTIME_LEVEL ) THEN
3068            l_log_msg := 'this is NOT a final payment';
3069            FND_LOG.STRING(G_LEVEL_PROCEDURE, G_MODULE_NAME||l_procedure_name, l_log_msg);
3070          END IF;
3071 
3072          IF (p_calc_mode IN ('P', 'M')) THEN
3073 
3074             IF ((g_total_dist_amt = l_total_dist_amount) AND
3075               NOT (((g_proration_divisor + g_pay_awt_total_amt) = 0)
3076               AND (l_pay_amount_inv_curr = 0)
3077               AND (p_inv_dist_rec.line_type_lookup_code ='AWT'))) THEN --Bug 9078285
3078 
3079                IF (G_LEVEL_PROCEDURE >= G_CURRENT_RUNTIME_LEVEL ) THEN
3080                   l_log_msg := 'g_total_dist_amt equal l_total_dist_amount =' ||
3081                                 l_total_dist_amount;
3082                   FND_LOG.STRING(G_LEVEL_PROCEDURE, G_MODULE_NAME||l_procedure_name, l_log_msg);
3083                END IF;
3084 
3085                -- To avoid rounding, massage the last (biggest) line
3086                l_prorated_amount := p_inv_pay_rec.amount - g_total_prorated_amt;
3087                l_inv_dist_amount := l_pay_amount_inv_curr - g_total_inv_dist_amt;
3088                -- bug 5638490
3089                l_bank_curr_amount := l_pay_amount_bank_curr - g_total_bank_curr_amt;
3090 
3091                IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
3092                    l_log_msg := 'Value for l_prorated_amount = ' || l_prorated_amount ||
3093                                 'Value for l_inv_dist_amoun = ' || l_inv_dist_amount ||
3094                                 'l_bank_curr_amount = ' || l_bank_curr_amount;
3095                    FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME || l_procedure_name, l_log_msg);
3096                END IF;
3097 
3098             ELSE
3099 
3100                IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
3101                    l_log_msg := 'This is not the last invoice distribution for proration';
3102                    FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME || l_procedure_name, l_log_msg);
3103                END IF;
3104 
3105                IF ( NVL(G_Proration_Divisor,0) = 0 )THEN  -- Bug 7636427
3106                   l_prorated_amount := 0;
3107                   l_inv_dist_amount := 0;
3108                   l_bank_curr_amount := 0;
3109                ELSE
3110 
3111                   IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
3112                      l_log_msg := 'l_proration_divisor is not 0 it is =>'
3113                                   || l_proration_divisor;
3114                      FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME || l_procedure_name, l_log_msg);
3115                   END IF;
3116 
3117                   -- We do not need to prorate the AWT amounts for the AWT distributions
3118                   -- that are created during payment time
3119 
3120                   IF p_inv_dist_rec.awt_invoice_payment_id IS NOT NULL THEN
3121 
3122                      IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
3123                         l_log_msg := 'AWT at payment time and should not prorate to awt pmt distribution';
3124                         FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME || l_procedure_name, l_log_msg);
3125                      END IF;
3126 --Bug 9282465
3127 --bug 10179705
3128                      l_inv_dist_base_amount := AP_Utilities_Pkg.AP_Round_Currency(
3129                                              NVL(p_inv_dist_rec.base_amount * nvl(p_inv_rec.exchange_rate, 1)
3130                                              / (nvl(p_pay_hist_rec.pmt_to_base_xrate, 1) * nvl(p_inv_rec.payment_cross_rate , 1))
3131                                               , l_inv_dist_amount),
3132                                             ap_accounting_pay_pkg.g_base_currency_code);
3133                      l_paid_base_amount     := p_inv_dist_rec.base_amount;
3134                      l_prorated_amount      := GL_Currency_API.Convert_Amount(
3135                                                 p_inv_rec.invoice_currency_code,
3136                                                 p_inv_rec.payment_currency_code,
3137                                                 p_inv_rec.payment_cross_rate_date,
3138                                                 'EMU FIXED',
3139                                                 p_inv_dist_rec.amount);
3140                      l_inv_dist_amount      := p_inv_dist_rec.amount;
3141 
3142                      --11698822, corrected the assignments in the following IF-END_IF
3143                      --1. logic used is based on the premise that clearing can only be in either
3144                      --payment or ledger currency
3145                      --2. p_inv_dist_rec.base_amount is at pay xrate for pay time awt dists
3146                      IF (p_pay_hist_rec.pmt_currency_code <> p_pay_hist_rec.bank_currency_code
3147                          AND p_pay_hist_rec.bank_currency_code IS NOT NULL )  THEN
3148 --Bug 9282465
3149                         l_bank_curr_amount     := p_inv_dist_rec.base_amount;
3150                         l_cleared_base_amount  :=  l_bank_curr_amount;
3151                      ELSE
3152 --Bug 9282465
3153                         l_bank_curr_amount     := l_prorated_amount;
3154                         l_cleared_base_amount  := l_bank_curr_amount
3155                                                      * nvl(p_pay_hist_rec.bank_to_base_xrate,1);
3156                      END IF;
3157 
3158                      IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
3159                         l_log_msg := 'AWT at payment time and ' ||
3160                                      ' l_prorated_amount = ' || l_prorated_amount ||
3161                                      'l_bank_curr_amount = ' || l_bank_curr_amount;
3162                         FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME || l_procedure_name, l_log_msg);
3163                      END IF;
3164 
3165                   ELSE
3166 
3167 -- Bug 7636427 Start
3168                  /* We need to calculate the payment amount and invoice dist amount
3169                     seperately to avoid rounding when calculating the base amounts */
3170 /*Commented code removed*/
3171 -- Bug 8524600 Start
3172 -- Bug 9282465
3173                      IF p_inv_dist_rec.line_type_lookup_code ='AWT' AND p_inv_dist_rec.base_amount IS NOT NULL THEN
3174 
3175                         l_inv_dist_base_amount  := p_inv_dist_rec.base_amount
3176                                                    /g_proration_divisor
3177                                                    * ( l_pay_amount_inv_curr- g_pay_awt_total_amt);
3178                         l_inv_dist_amount       :=  l_inv_dist_base_amount / nvl(p_inv_rec.exchange_rate,1);
3179                         l_paid_base_amount      := nvl(l_inv_dist_base_amount,l_inv_dist_amount)
3180                                                          * nvl(p_inv_rec.payment_cross_rate ,1)
3181                                                          * nvl(p_pay_hist_rec.pmt_to_base_xrate,1)
3182                                                          / nvl(p_inv_rec.exchange_rate,1);
3183 
3184                         IF (p_pay_hist_rec.pmt_currency_code = p_pay_hist_rec.bank_currency_code) THEN
3185                            l_cleared_base_amount   :=  l_paid_base_amount
3186                                                      * nvl(p_pay_hist_rec.bank_to_base_xrate,1)
3187                                                      /nvl(p_pay_hist_rec.pmt_to_base_xrate,1);
3188                         ELSE
3189                            l_cleared_base_amount   := l_bank_curr_amount;
3190                         END IF;
3191                      ELSE
3192 
3193                      SELECT
3194                             (p_inv_dist_rec.amount
3195                               / g_proration_divisor
3196                               * ( l_pay_amount_inv_curr
3197                                    - g_pay_awt_total_amt
3198                                  )
3199                              + nvl
3200                                  (
3201                                   (SELECT sum(amount)
3202                                    FROM ap_invoice_distributions_all aid
3203                                    WHERE aid.invoice_id                 =p_inv_pay_rec.invoice_id
3204                                    AND aid.awt_invoice_payment_id     =p_inv_pay_rec.invoice_payment_id
3205                                    AND aid.line_type_lookup_code      ='AWT'
3206                                    AND aid.awt_related_id             =p_inv_dist_rec.invoice_distribution_id
3207                                   )
3208                                    ,0
3209                                  )
3210                              + nvl
3211                                  (
3212                                   (SELECT  sum(amount) / g_proration_divisor *  (l_pay_amount_inv_curr - g_pay_awt_total_amt)
3213                                    FROM ap_invoice_distributions_all aid
3214                                    WHERE aid.invoice_id                 =p_inv_pay_rec.invoice_id
3215                                    AND aid.line_type_lookup_code      ='AWT'
3216                                    AND awt_invoice_payment_id         is null
3217                                    AND awt_related_id                 =p_inv_dist_rec.invoice_distribution_id
3218                                   )
3219                                    ,0
3220                                  )
3221                             )
3222                      INTO l_inv_dist_amount
3223                      FROM sys.dual;
3224 
3225                      END IF;
3226 
3227                      l_prorated_amount     := GL_Currency_API.Convert_Amount(
3228                                                       p_inv_rec.invoice_currency_code
3229                                                      ,p_inv_rec.payment_currency_code
3230                                                      ,p_inv_rec.payment_cross_rate_date
3231                                                      ,'EMU FIXED'
3232                                                      ,l_inv_dist_amount);
3233 
3234                      l_prorated_amount     := AP_UTILITIES_PKG.AP_ROUND_CURRENCY (
3235                                                       l_prorated_amount
3236                                                      ,p_pay_hist_rec.pmt_currency_code);
3237 
3238                      l_inv_dist_amount     := AP_UTILITIES_PKG.AP_ROUND_CURRENCY (
3239                                                       l_inv_dist_amount
3240                                                      ,p_inv_rec.invoice_currency_code);
3241 
3242 
3243                      IF (p_pay_hist_rec.pmt_currency_code <> p_pay_hist_rec.bank_currency_code
3244                          and p_pay_hist_rec.bank_currency_code is not null )  THEN
3245 
3246                         l_bank_curr_amount   := AP_Utilities_Pkg.AP_Round_Currency(
3247                                                         l_prorated_amount
3248                                                              * nvl(p_pay_hist_rec.pmt_to_base_xrate,1)
3249                                                              / nvl(p_pay_hist_rec.bank_to_base_xrate,1)
3250                                                         ,p_pay_hist_rec.bank_currency_code);
3251 -- Bug 8524600 End
3252                      ELSE
3253                         l_bank_curr_amount := l_prorated_amount;
3254                      END IF;
3255 
3256                   END IF; -- If AWT created at payment time
3257 
3258                   IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
3259                      l_log_msg := 'Value for l_prorated_amount = ' || l_prorated_amount;
3260                      FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME || l_procedure_name, l_log_msg);
3261                   END IF;
3262                END IF;
3263             END IF;
3264          ELSE    -- p_calc_mode = 'C'
3265 
3266   /* If this is a cascade event then we will create new payment distributions
3267      for the existing invoice distributions that have already been distributed to
3268      this payment in order to adjust the payments as a result of adjusting the
3269      invoice */
3270 
3271             IF (G_LEVEL_PROCEDURE >= G_CURRENT_RUNTIME_LEVEL ) THEN
3272                l_log_msg := 'calculation mode p_calc_mode (cascade?) =' || p_calc_mode ;
3273                FND_LOG.STRING(G_LEVEL_PROCEDURE, G_MODULE_NAME||l_procedure_name, l_log_msg);
3274             END IF;
3275 
3276             IF ((g_total_dist_amt = l_total_dist_amount) AND
3277                NOT (((g_proration_divisor + g_pay_awt_total_amt) = 0)
3278                AND (l_pay_amount_inv_curr = 0)
3279                AND (p_inv_dist_rec.line_type_lookup_code ='AWT'))) THEN --Bug 9078285
3280 
3281                IF (G_LEVEL_PROCEDURE >= G_CURRENT_RUNTIME_LEVEL ) THEN
3282                   l_log_msg := 'g_total_dist_amt equal l_total_dist_amount =' ||
3283                                 l_total_dist_amount;
3284                   FND_LOG.STRING(G_LEVEL_PROCEDURE, G_MODULE_NAME||l_procedure_name, l_log_msg);
3285                END IF;
3286 
3287             SELECT -NVL(SUM(aphd.amount), 0)       ,
3288                    -NVL(SUM(aphd.invoice_dist_amount), 0),
3289                    -NVL(SUM(aphd.bank_curr_amount), 0)
3290             INTO l_prorated_amount,
3291                  l_inv_dist_amount  ,
3292                  l_bank_curr_amount
3293             FROM ap_payment_hist_dists aphd
3294             WHERE aphd.invoice_distribution_id IN
3295                  (SELECT invoice_distribution_id
3296                   FROM ap_invoice_distributions_all aid
3297                   WHERE aid.invoice_id = p_inv_rec.invoice_id
3298                  )
3299             AND aphd.payment_history_id IN
3300                 (SELECT aph.payment_history_id
3301                  FROM ap_payment_history_all aph,
3302                       ap_invoice_distributions_all aid
3303                  WHERE aph.check_id                = p_xla_event_rec.source_id_int_1
3304                  AND aid.invoice_id                  = p_inv_rec.invoice_id
3305                  AND aph.invoice_adjustment_event_id = aid.accounting_event_id
3306                  AND aph.transaction_type =
3307                         (SELECT transaction_type
3308                          FROM ap_payment_history_all aph_evt
3309                          WHERE aph_evt.payment_history_id = p_pay_hist_rec.payment_history_id)
3310                          AND aph.posted_flag                 = 'S');
3311 
3312                IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
3313                   l_log_msg := 'Value for l_prorated_amount = ' || l_prorated_amount ||
3314                                'Value for l_inv_dist_amoun = ' || l_inv_dist_amount ||
3315                                'l_bank_curr_amount = ' || l_bank_curr_amount;
3316                     FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME || l_procedure_name, l_log_msg);
3317                END IF;
3318 
3319             ELSE
3320 --bug 9850638, if invoice and invoice payment amount are zero
3321                IF NVL(l_proration_divisor, 0) = 0 THEN
3322                   IF p_inv_pay_rec.amount = 0 THEN
3323                      l_prorated_amount := NVL(l_dist_amt_pay_curr, 0);
3324                      l_inv_dist_amount := NVL(p_inv_dist_rec.amount, 0);
3325                      l_bank_curr_amount := NVL(l_dist_amt_bank_curr, 0);
3326                   ELSE
3327                      l_prorated_amount := 0;
3328                      l_inv_dist_amount := 0;
3329                      l_bank_curr_amount := 0;
3330                   END IF;
3331                ELSE
3332 
3333         -- We do not need to prorate the AWT amounts for the AWT distributions
3334         -- that are created during payment time
3335                   IF p_inv_dist_rec.awt_invoice_payment_id IS NOT NULL THEN
3336 
3337                      l_prorated_amount := GL_Currency_API.Convert_Amount(
3338                                              p_inv_rec.invoice_currency_code,
3339                                              p_inv_rec.payment_currency_code,
3340                                              p_inv_rec.payment_cross_rate_date,
3341                                              'EMU FIXED',
3342                                              p_inv_dist_rec.amount) +
3343                                            AP_Accounting_Pay_Pkg.get_casc_pay_sum
3344                                             (p_inv_dist_rec.invoice_distribution_id,
3345                                              p_pay_hist_rec.related_event_id,
3346                                              p_inv_pay_rec.invoice_payment_id,
3347                                              l_curr_calling_sequence);
3348 
3349                      l_inv_dist_amount := p_inv_dist_rec.amount +
3350                                           AP_Accounting_Pay_Pkg.get_casc_inv_dist_sum
3351                                            (p_inv_dist_rec.invoice_distribution_id,
3352                                             p_pay_hist_rec.related_event_id,
3353                                             p_inv_pay_rec.invoice_payment_id,
3354                                             l_curr_calling_sequence);
3355 
3356                      IF p_xla_event_rec.event_type_code = 'PAYMENT CLEARING ADJUSTED' THEN
3357                         IF (p_pay_hist_rec.pmt_currency_code <> p_pay_hist_rec.bank_currency_code and
3358                             p_pay_hist_rec.bank_currency_code is not NULL ) THEN
3359 
3360                             l_bank_curr_amount := AP_Utilities_Pkg.AP_Round_Currency(
3361                                                    l_prorated_amount * p_pay_hist_rec.pmt_to_base_xrate
3362                                                      /p_pay_hist_rec.bank_to_base_xrate,
3363                                                    p_pay_hist_rec.bank_currency_code) -
3364                                                   AP_Accounting_Pay_Pkg.get_casc_bank_curr_sum(
3365                                                    p_inv_dist_rec.invoice_distribution_id,
3366                                                    p_pay_hist_rec.related_event_id,
3367                                                    p_inv_pay_rec.invoice_payment_id,
3368                                                    l_curr_calling_sequence);
3369 
3370                         ELSE
3371 
3372                            l_bank_curr_amount := l_prorated_amount -
3373                                                  AP_Accounting_Pay_Pkg.get_casc_bank_curr_sum(
3374                                                   p_inv_dist_rec.invoice_distribution_id,
3375                                                   p_pay_hist_rec.related_event_id,
3376                                                   p_inv_pay_rec.invoice_payment_id,
3377                                                   l_curr_calling_sequence);
3378 
3379                         END IF;
3380                      END IF;
3381 
3382                   ELSE
3383 
3384                      SELECT
3385                             (p_inv_dist_rec.amount
3386                               / g_proration_divisor
3387                               * ( l_pay_amount_inv_curr
3388                                    - g_pay_awt_total_amt
3389                                  )
3390                              + nvl
3391                                  (
3392                                   (SELECT sum(amount)
3393                                    FROM ap_invoice_distributions_all aid
3394                                    WHERE aid.invoice_id                 =p_inv_pay_rec.invoice_id
3395                                    AND aid.awt_invoice_payment_id     =p_inv_pay_rec.invoice_payment_id
3396                                    AND aid.line_type_lookup_code      ='AWT'
3397                                    AND aid.awt_related_id             =p_inv_dist_rec.invoice_distribution_id
3398                                   )
3399                                    ,0
3400                                  )
3401                              + nvl
3402                                  (
3403                                   (SELECT  sum(amount) / g_proration_divisor *  (l_pay_amount_inv_curr - g_pay_awt_total_amt)
3404                                    FROM ap_invoice_distributions_all aid
3405                                    WHERE aid.invoice_id                 =p_inv_pay_rec.invoice_id
3406                                    AND aid.line_type_lookup_code      ='AWT'
3407                                    AND awt_invoice_payment_id         is null
3408                                    AND awt_related_id                 =p_inv_dist_rec.invoice_distribution_id
3409                                   )
3410                                    ,0
3411                                  )
3412                             )
3413                      INTO l_inv_dist_amount
3414                      FROM sys.dual;
3415 
3416                    --Need to recalculate the l_inv_dist_amount as the difference between the amount to be prorated for the
3417                    -- distribution and the already prorated amount
3418 
3419                      IF p_inv_dist_rec.line_type_lookup_code ='AWT' THEN
3420                         l_inv_dist_amount := AP_Accounting_Pay_Pkg.get_casc_inv_dist_sum
3421                                              (p_inv_dist_rec.invoice_distribution_id,
3422                                               p_pay_hist_rec.related_event_id,
3423                                               p_inv_pay_rec.invoice_payment_id,
3424                                               l_curr_calling_sequence) + l_inv_dist_amount;
3425                      ELSE
3426                         l_inv_dist_amount := l_inv_dist_amount- AP_Accounting_Pay_Pkg.get_casc_inv_dist_sum
3427                                              (p_inv_dist_rec.invoice_distribution_id,
3428                                               p_pay_hist_rec.related_event_id,
3429                                               p_inv_pay_rec.invoice_payment_id,
3430                                               l_curr_calling_sequence);
3431                      END IF;
3432 
3433                      l_prorated_amount     := GL_Currency_API.Convert_Amount(
3434                                                         p_inv_rec.invoice_currency_code
3435                                                        ,p_inv_rec.payment_currency_code
3436                                                        ,p_inv_rec.payment_cross_rate_date
3437                                                        ,'EMU FIXED'
3438                                                        ,l_inv_dist_amount);
3439                      l_prorated_amount     := AP_UTILITIES_PKG.AP_ROUND_CURRENCY (
3440                                                         l_prorated_amount
3441                                                        ,p_pay_hist_rec.pmt_currency_code);
3442                      l_inv_dist_amount     := AP_UTILITIES_PKG.AP_ROUND_CURRENCY (
3443                                                         l_inv_dist_amount
3444                                                        ,p_inv_rec.invoice_currency_code);
3445 
3446                      IF (p_pay_hist_rec.pmt_currency_code <> p_pay_hist_rec.bank_currency_code
3447                          and p_pay_hist_rec.bank_currency_code is not null )  THEN
3448 
3449                         l_bank_curr_amount   := AP_Utilities_Pkg.AP_Round_Currency(
3450                                                         l_prorated_amount
3451                                                              * nvl(p_pay_hist_rec.pmt_to_base_xrate,1)
3452                                                              / nvl(p_pay_hist_rec.bank_to_base_xrate,1)
3453                                                         ,p_pay_hist_rec.bank_currency_code);
3454 -- Bug 8524600 End
3455                      ELSE
3456 		        l_bank_curr_amount := l_prorated_amount;
3457                      END IF;
3458                   END IF; -- If AWT created at payment time
3459                END IF;
3460             END IF; --If final dist
3461          END IF; -- If p_calc_mode
3462       END IF;  -- If final payment
3463 
3464       -- We should not include the AWT prorated amount int the total prorated amt used
3465       -- for the technical proration rounding
3466       IF p_inv_dist_rec.line_type_lookup_code <> 'AWT' THEN
3467          g_total_prorated_amt := g_total_prorated_amt + l_prorated_amount;
3468          g_total_inv_dist_amt := g_total_inv_dist_amt + l_inv_dist_amount;
3469          g_total_bank_curr_amt := g_total_bank_curr_amt + l_bank_curr_amount;
3470       END IF;
3471 
3472       IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
3473         l_log_msg := 'After final payment check/process and' ||
3474                      'g_total_prorated_amt = ' || nvl(g_total_prorated_amt,0) ||
3475                      'g_total_inv_dist_amt = ' || nvl(g_total_inv_dist_amt,0) ||
3476                      'g_total_bank_curr_amt = ' ||nvl(g_total_bank_curr_amt,0);
3477         FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME || l_procedure_name, l_log_msg);
3478       END IF;
3479 
3480         IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
3481             l_log_msg := 'Value for l_prorated_amount = ' || l_prorated_amount;
3482             FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME || l_procedure_name, l_log_msg);
3483         END IF;
3484 
3485   IF (G_LEVEL_PROCEDURE >= G_CURRENT_RUNTIME_LEVEL ) THEN
3486        l_log_msg := 'Now calling AP_Accounting_Pay_Pkg.Get_Base_Amount before insert';
3487        FND_LOG.STRING(G_LEVEL_PROCEDURE, G_MODULE_NAME||l_procedure_name, l_log_msg);
3488   END IF;
3489 
3490   l_prorated_base_amount := AP_Accounting_Pay_Pkg.Get_Base_Amount
3491                                    (l_prorated_amount,
3492                                     p_pay_hist_rec.pmt_currency_code,
3493                                     ap_accounting_pay_pkg.g_base_currency_code,
3494                                     p_pay_hist_rec.pmt_to_base_xrate_type,
3495                                     p_pay_hist_rec.pmt_to_base_xrate_date,
3496                                     p_pay_hist_rec.pmt_to_base_xrate,
3497                                     l_curr_calling_sequence);
3498 
3499   IF (G_LEVEL_PROCEDURE >= G_CURRENT_RUNTIME_LEVEL ) THEN
3500     l_log_msg := 'after call AP_Accounting_Pay_Pkg.Get_Base_Amoun and ' ||
3501                  'l_prorated_base_amount=' || nvl(l_prorated_base_amount,0) ||
3502                  'l_prorated_amount= ' || nvl(l_prorated_amount,0);
3503     FND_LOG.STRING(G_LEVEL_PROCEDURE, G_MODULE_NAME||l_procedure_name, l_log_msg);
3504   END IF;
3505 
3506   -- populate the payment distribution record
3507 
3508   l_pd_rec.accounting_event_id := p_xla_event_rec.event_id;
3509   l_pd_rec.invoice_distribution_id := p_inv_dist_rec.invoice_distribution_id;
3510 
3511   IF (G_LEVEL_PROCEDURE >= G_CURRENT_RUNTIME_LEVEL ) THEN
3512     l_log_msg := 'Start to populate the l_pd_rec for event id' ||
3513                   l_pd_rec.accounting_event_id;
3514     FND_LOG.STRING(G_LEVEL_PROCEDURE, G_MODULE_NAME||l_procedure_name, l_log_msg);
3515   END IF;
3516 
3517 --Bug 9282465
3518   IF p_inv_dist_rec.line_type_lookup_code = 'AWT' THEN
3519      l_pd_rec.pay_dist_lookup_code  := 'AWT';
3520      l_pd_rec.awt_related_id        := p_inv_dist_rec.awt_related_id;
3521      l_prorated_base_amount         := nvl(l_paid_base_amount
3522                                       ,nvl(l_inv_dist_base_amount
3523                                              * p_pay_hist_rec.pmt_to_base_xrate
3524                                              / p_inv_rec.exchange_rate
3525                                       ,l_prorated_amount));
3526      l_inv_dist_base_amount         := -1 * l_inv_dist_base_amount;
3527      l_prorated_amount              := -1 * l_prorated_amount;
3528      l_prorated_base_amount         := -1 * ap_utilities_pkg.ap_round_currency
3529                                       (l_prorated_base_amount,ap_accounting_pay_pkg.g_base_currency_code);
3530      l_inv_dist_amount              := -1 * l_inv_dist_amount;
3531      l_bank_curr_amount             := -1 * l_bank_curr_amount;
3532      l_cleared_base_amount          := -1 * l_cleared_base_amount;  --11698822
3533   ELSE
3534      l_pd_rec.pay_dist_lookup_code := 'CASH';
3535   END IF;
3536 
3537   l_pd_rec.amount := l_prorated_amount;
3538   l_pd_rec.payment_history_id := p_pay_hist_rec.payment_history_id;
3539   l_pd_rec.invoice_payment_id := p_inv_pay_rec.invoice_payment_id;
3540 
3541   l_pd_rec.bank_curr_amount := l_bank_curr_amount;
3542 
3543   IF p_xla_event_rec.event_type_code IN
3544          ('PAYMENT CLEARED', 'PAYMENT CLEARING ADJUSTED') THEN
3545 --Bug 9282465
3546          IF (p_inv_dist_rec.line_type_lookup_code = 'AWT' AND l_cleared_base_amount is not null) THEN
3547          l_pd_rec.cleared_base_amount := ap_utilities_pkg.ap_round_currency
3548                                          (l_cleared_base_amount,ap_accounting_pay_pkg.g_base_currency_code);
3549          ELSE
3550 
3551          l_pd_rec.cleared_base_amount := AP_Accounting_Pay_Pkg.Get_Base_Amount
3552                                       (l_bank_curr_amount,
3553                                        p_pay_hist_rec.bank_currency_code,
3554                                        ap_accounting_pay_pkg.g_base_currency_code,
3555                                        p_pay_hist_rec.bank_to_base_xrate_type,
3556                                        p_pay_hist_rec.bank_to_base_xrate_date,
3557                                        p_pay_hist_rec.bank_to_base_xrate,
3558                                        l_curr_calling_sequence);
3559          END IF;
3560 
3561 --Bug 9282465
3562          IF (p_inv_dist_rec.line_type_lookup_code = 'AWT' AND (l_inv_dist_base_amount is not null or l_inv_dist_amount is not null) ) THEN
3563          l_pd_rec.paid_base_amount :=ap_utilities_pkg.ap_round_currency
3564                                      ( nvl(l_inv_dist_base_amount,l_inv_dist_amount)
3565                                              * nvl(p_inv_rec.payment_cross_rate ,1)
3566                                              * nvl(ap_accounting_pay_pkg.g_pmt_to_base_xrate,1)
3567                                              / nvl(p_inv_rec.exchange_rate,1),ap_accounting_pay_pkg.g_base_currency_code);
3568          ELSE
3569 
3570          l_pd_rec.paid_base_amount := AP_Accounting_Pay_Pkg.Get_Base_Amount
3571                                       (l_prorated_amount,
3572                                        p_pay_hist_rec.pmt_currency_code,
3573                                        ap_accounting_pay_pkg.g_base_currency_code,
3574                                        ap_accounting_pay_pkg.g_pmt_to_base_xrate_type,
3575                                        ap_accounting_pay_pkg.g_pmt_to_base_xrate_date,
3576                                        ap_accounting_pay_pkg.g_pmt_to_base_xrate,
3577                                        l_curr_calling_sequence);
3578          END IF;
3579 
3580      IF ap_accounting_pay_pkg.g_mat_to_base_xrate IS NOT NULL THEN
3581 
3582         l_pd_rec.matured_base_amount := AP_Accounting_Pay_Pkg.Get_Base_Amount
3583                                           (l_prorated_amount,
3584                                            p_pay_hist_rec.pmt_currency_code,
3585                                            ap_accounting_pay_pkg.g_base_currency_code,
3586                                            ap_accounting_pay_pkg.g_mat_to_base_xrate_type,
3587                                            ap_accounting_pay_pkg.g_mat_to_base_xrate_date,
3588                                            ap_accounting_pay_pkg.g_mat_to_base_xrate,
3589                                            l_curr_calling_sequence);
3590      END IF ;
3591 
3592   ELSIF p_xla_event_rec.event_type_code IN
3593                   ('PAYMENT MATURED', 'PAYMENT MATURITY ADJUSTED') THEN
3594      l_pd_rec.matured_base_amount := l_prorated_base_amount;
3595 
3596      l_pd_rec.paid_base_amount := AP_Accounting_Pay_Pkg.Get_Base_Amount
3597                                       (l_prorated_amount,
3598                                        p_pay_hist_rec.pmt_currency_code,
3599                                        ap_accounting_pay_pkg.g_base_currency_code,
3600                                        ap_accounting_pay_pkg.g_pmt_to_base_xrate_type,
3601                                        ap_accounting_pay_pkg.g_pmt_to_base_xrate_date,
3602                                        ap_accounting_pay_pkg.g_pmt_to_base_xrate,
3603                                        l_curr_calling_sequence);
3604 
3605   ELSE
3606      l_pd_rec.paid_base_amount := l_prorated_base_amount;
3607   END IF;
3608 
3609   l_pd_rec.invoice_dist_amount := l_inv_dist_amount;
3610 
3611 
3612   /* If the exchange rates between the invoice and payment have not changed then
3613      the invoice and payment base amounts should be the same. Assigning the
3614      payment base amount to the invoice base amount instead of recalculating the
3615      invoice base amount */
3616          IF (p_inv_dist_rec.line_type_lookup_code = 'AWT' AND l_cleared_base_amount is not null) THEN
3617               l_pd_rec.invoice_dist_base_amount:=l_inv_dist_base_amount;
3618          ELSE
3619 
3620            IF (p_pay_hist_rec.pmt_to_base_xrate =
3621                         p_inv_rec.exchange_rate / p_inv_rec.payment_cross_rate) THEN
3622 
3623                IF (G_LEVEL_PROCEDURE >= G_CURRENT_RUNTIME_LEVEL ) THEN
3624                  l_log_msg := 'pmt to base rate = inv to base rate';
3625                  FND_LOG.STRING(G_LEVEL_PROCEDURE, G_MODULE_NAME||l_procedure_name, l_log_msg);
3626                END IF;
3627 
3628                l_pd_rec.invoice_dist_base_amount := l_prorated_base_amount;
3629 
3630            ELSE
3631 
3632                l_pd_rec.invoice_dist_base_amount :=
3633                                              AP_Accounting_Pay_Pkg.Get_Base_Amount
3634                                                   (l_inv_dist_amount,
3635                                                    p_inv_rec.invoice_currency_code,
3636                                                    ap_accounting_pay_pkg.g_base_currency_code,
3637                                                    p_inv_rec.exchange_rate_type,
3638                                                    p_inv_rec.exchange_date,
3639                                                    p_inv_rec.exchange_rate,
3640                                                    l_curr_calling_sequence);
3641 
3642                IF (G_LEVEL_PROCEDURE >= G_CURRENT_RUNTIME_LEVEL ) THEN
3643                  l_log_msg := 'pmt to base rate <> inv to base rate and ' ||
3644                               'l_pd_rec.invoice_dist_base_amount =' ||
3645                               nvl(l_pd_rec.invoice_dist_base_amount,0) ||
3646                               'l_prorated_base_amount =' || nvl(l_prorated_base_amount,0);
3647                  FND_LOG.STRING(G_LEVEL_PROCEDURE, G_MODULE_NAME||l_procedure_name, l_log_msg);
3648                END IF;
3649 
3650            END IF;
3651 END IF;
3652 
3653   IF p_inv_dist_rec.quantity_variance IS NOT NULL THEN
3654 
3655      IF (G_LEVEL_PROCEDURE >= G_CURRENT_RUNTIME_LEVEL ) THEN
3656         l_log_msg := 'Invoice has quantity variance';
3657         FND_LOG.STRING(G_LEVEL_PROCEDURE, G_MODULE_NAME||l_procedure_name, l_log_msg);
3658      END IF;
3659 
3660      IF p_inv_dist_rec.amount = 0 THEN
3661         l_qty_variance := 0;
3662      ELSE
3663         l_qty_variance := AP_Utilities_PKG.AP_Round_Currency(
3664                           ((p_inv_dist_rec.quantity_variance * l_inv_dist_amount) /
3665                                   p_inv_dist_rec.amount),
3666                             p_inv_rec.invoice_currency_code);
3667      END IF;
3668 
3669      IF p_inv_dist_rec.base_amount = 0 THEN
3670         l_base_qty_variance := 0;
3671      ELSE
3672         l_base_qty_variance := AP_Utilities_PKG.AP_Round_Currency(
3673                                ((p_inv_dist_rec.base_quantity_variance
3674                                     * l_pd_rec.invoice_dist_base_amount)
3675                                     / p_inv_dist_rec.base_amount),
3676                                  ap_accounting_pay_pkg.g_base_currency_code);
3677      END IF;
3678   END IF;
3679 
3680   IF p_inv_dist_rec.amount_variance IS NOT NULL THEN
3681 
3682      IF (G_LEVEL_PROCEDURE >= G_CURRENT_RUNTIME_LEVEL ) THEN
3683         l_log_msg := 'Invoice has amount variance';
3684         FND_LOG.STRING(G_LEVEL_PROCEDURE, G_MODULE_NAME||l_procedure_name, l_log_msg);
3685      END IF;
3686 
3687      IF p_inv_dist_rec.amount = 0 THEN
3688         l_amt_variance := 0;
3689      ELSE
3690         l_amt_variance := AP_Utilities_PKG.AP_Round_Currency(
3691                           ((p_inv_dist_rec.amount_variance * l_inv_dist_amount) /
3692                                   p_inv_dist_rec.amount),
3693                             p_inv_rec.invoice_currency_code);
3694      END IF;
3695 
3696      IF p_inv_dist_rec.base_amount = 0 THEN
3697         l_base_amt_variance := 0;
3698      ELSE
3699         l_base_amt_variance := AP_Utilities_PKG.AP_Round_Currency(
3700                                ((p_inv_dist_rec.base_amount_variance
3701                                     * l_pd_rec.invoice_dist_base_amount)
3702                                     / p_inv_dist_rec.base_amount),
3703                                  ap_accounting_pay_pkg.g_base_currency_code);
3704      END IF;
3705   END IF;
3706 
3707   l_pd_rec.quantity_variance := l_qty_variance;
3708   l_pd_rec.invoice_base_qty_variance := l_base_qty_variance;
3709   l_pd_rec.amount_variance := l_amt_variance;
3710   l_pd_rec.invoice_base_amt_variance := l_base_amt_variance;
3711 
3712 
3713   IF (G_LEVEL_PROCEDURE >= G_CURRENT_RUNTIME_LEVEL ) THEN
3714       l_log_msg := 'Calling procedure Pay_Dist_Insert';
3715       FND_LOG.STRING(G_LEVEL_PROCEDURE, G_MODULE_NAME||l_procedure_name, l_log_msg);
3716   END IF;
3717 
3718 
3719   -- Insert the payment hist distribution
3720 
3721   Pay_Dist_Insert
3722           (l_pd_rec,
3723            l_curr_calling_sequence);
3724 
3725  --bug7446229
3726 IF (G_LEVEL_PROCEDURE >= G_CURRENT_RUNTIME_LEVEL ) THEN
3727       l_log_msg := 'Procedure Pay_Dist_Insert executed';
3728       FND_LOG.STRING(G_LEVEL_PROCEDURE, G_MODULE_NAME||l_procedure_name, l_log_msg);
3729   END IF;
3730 
3731 
3732   IF ((p_xla_event_rec.event_type_code NOT IN
3733              ('PAYMENT MATURED', 'PAYMENT MATURITY ADJUSTED')) AND
3734       (p_inv_rec.payment_currency_code <> ap_accounting_pay_pkg.g_base_currency_code) AND
3735        p_inv_dist_rec.po_distribution_id IS NOT NULL AND
3736        p_inv_dist_rec.line_type_lookup_code <> 'AWT') THEN
3737 
3738        -----------------------------------------------------------------------------
3739        -- Bug 5570002
3740        -- The ERV/TERV calculated did not consider the discount portion as part
3741        -- of this payment, this will make a difference between the original
3742        -- invoice distribution base amount and the paid invoice base amount
3743        -- due to this, unnecessary big amount Final payment is created
3744        -----------------------------------------------------------------------------
3745 
3746        IF (G_LEVEL_PROCEDURE >= G_CURRENT_RUNTIME_LEVEL ) THEN
3747            l_log_msg := 'Calling procedure Pay_Dist_ERV for dist:' ||
3748                         p_inv_dist_rec.invoice_distribution_id ||
3749                         'and pmt l_prorated_amount =' || l_prorated_amount ||
3750                         'and discount amout prorated = ' || l_disc_pay_amount ;
3751            FND_LOG.STRING(G_LEVEL_PROCEDURE, G_MODULE_NAME||l_procedure_name, l_log_msg);
3752        END IF;
3753 
3754        Pay_Dist_ERV
3755             (p_xla_event_rec,
3756              p_inv_pay_rec,
3757              p_pay_hist_rec,
3758              p_inv_rec,
3759              p_inv_dist_rec,
3760              l_prorated_amount + l_disc_pay_amount,
3761              l_curr_calling_sequence);
3762 
3763        IF (G_LEVEL_PROCEDURE >= G_CURRENT_RUNTIME_LEVEL ) THEN
3764            l_log_msg := 'Procedure Pay_Dist_ERV executed';
3765            FND_LOG.STRING(G_LEVEL_PROCEDURE, G_MODULE_NAME||l_procedure_name, l_log_msg);
3766        END IF;
3767 
3768 
3769   END IF;
3770 
3771    IF (G_LEVEL_PROCEDURE >= G_CURRENT_RUNTIME_LEVEL ) THEN
3772      l_log_msg := 'End of pay_dist_proc';
3773      FND_LOG.STRING(G_LEVEL_PROCEDURE, G_MODULE_NAME||l_procedure_name, l_log_msg);
3774    END IF;
3775 
3776 EXCEPTION
3777   WHEN OTHERS THEN
3778     IF (SQLCODE <> -20001) THEN
3779       FND_MESSAGE.SET_NAME('SQLAP','AP_DEBUG');
3780       FND_MESSAGE.SET_TOKEN('ERROR',SQLERRM);
3781       FND_MESSAGE.SET_TOKEN('CALLING_SEQUENCE', l_curr_calling_sequence);
3782     END IF;
3783     APP_EXCEPTION.RAISE_EXCEPTION;
3784 
3785 END Pay_Dist_Proc;
3786 
3787 
3788 ---------------------------------------------------------------------
3789 -- Procedure Pay_Dist_Discount
3790 -- This procedure prorates the discount amounts for each distribution
3791 -- and inserts the calculated values into payment hist dists table
3792 ---------------------------------------------------------------------
3793 
3794 PROCEDURE Pay_Dist_Discount
3795       (p_xla_event_rec    IN    ap_accounting_pay_pkg.r_xla_event_info
3796       ,p_inv_pay_rec      IN    r_inv_pay_info
3797       ,p_pay_hist_rec     IN    ap_accounting_pay_pkg.r_pay_hist_info
3798       ,p_inv_rec          IN    ap_accounting_pay_pkg.r_invoices_info
3799       ,p_inv_dist_rec     IN    ap_accounting_pay_pkg.r_inv_dist_info
3800       ,p_calc_mode        IN    VARCHAR2
3801       ,p_disc_pay_amount  IN    OUT NOCOPY    NUMBER
3802       ,p_disc_dist_amount IN    OUT NOCOPY    NUMBER
3803       ,p_disc_bank_amount IN    OUT NOCOPY    NUMBER
3804       ,p_calling_sequence IN    VARCHAR2
3805       ) IS
3806 
3807   l_curr_calling_sequence          VARCHAR2(2000);
3808   l_invoice_amount                 NUMBER;
3809   l_prorated_disc_amt              NUMBER;
3810   l_prorated_base_amount           NUMBER;
3811   l_exclude_tax_from_disc          VARCHAR2(1);
3812   l_exclude_frt_from_disc          VARCHAR2(1);
3813   l_inv_dist_amount                NUMBER;
3814   l_bank_curr_amount               NUMBER;
3815   l_disc_amt_inv_curr              NUMBER;
3816   l_disc_amt_bank_curr             NUMBER;
3817 
3818   l_pd_rec                         AP_PAYMENT_HIST_DISTS%ROWTYPE;
3819 
3820   -- Logging Infra:
3821   l_procedure_name CONSTANT VARCHAR2(30) := 'Pay_Dist_Discount';
3822   l_log_msg        FND_LOG_MESSAGES.MESSAGE_TEXT%TYPE;
3823   l_total_dist_amount  NUMBER; -- Added for bug 7577312
3824 
3825 BEGIN
3826 
3827 
3828   l_curr_calling_sequence := 'AP_ACCTG_PAY_DIST_PKG.Pay_Dist_Discount<- ' ||
3829                                                  p_calling_sequence;
3830 
3831 
3832   -- Logging Infra: Procedure level
3833   IF (G_LEVEL_PROCEDURE >= G_CURRENT_RUNTIME_LEVEL ) THEN
3834       l_log_msg := 'Begin of procedure '|| l_procedure_name;
3835       FND_LOG.STRING(G_LEVEL_PROCEDURE, G_MODULE_NAME||l_procedure_name||'.begin', l_log_msg);
3836   END IF;
3837 
3838 
3839   l_exclude_tax_from_disc := p_inv_rec.Disc_Is_Inv_Less_Tax_Flag;
3840   l_exclude_frt_from_disc := p_inv_rec.exclude_freight_from_discount;
3841 
3842   IF (G_LEVEL_PROCEDURE >= G_CURRENT_RUNTIME_LEVEL ) THEN
3843       l_log_msg := 'l_exclude_tax_from_disc =' || l_exclude_tax_from_disc ||
3844                    'l_exclude_frt_from_disc = ' || l_exclude_frt_from_disc;
3845       FND_LOG.STRING(G_LEVEL_PROCEDURE, G_MODULE_NAME||l_procedure_name, l_log_msg);
3846   END IF;
3847 
3848   -- Bug 7577312: Assigning the value of the l_total_dist_amount
3849   l_total_dist_amount := G_Total_Dist_Amount;
3850 
3851   /* Get the remaining invoice amount to be paid. Exclude the Tax and
3852      Freight amounts based on the system options to exclude tax and freight
3853      from discount */
3854 
3855   --added exception handling for bug 8406754
3856   BEGIN
3857 
3858   SELECT GL_Currency_API.Convert_Amount(
3859               p_inv_rec.invoice_currency_code,
3860               p_inv_rec.payment_currency_code,
3861               p_inv_rec.payment_cross_rate_date,
3862               'EMU FIXED',
3863               SUM(NVL(AID.Amount,0)))
3864   INTO   l_invoice_amount
3865   FROM   AP_Invoice_Distributions_All AID
3866   WHERE  AID.Invoice_ID =  p_inv_pay_rec.Invoice_ID
3867   AND    AID.Line_Type_Lookup_Code NOT IN ('PREPAY', 'AWT')
3868   AND    AID.Prepay_Tax_Parent_ID IS NULL -- For tax dists created in R11.5
3869   AND    AID.Prepay_Distribution_ID IS NULL
3870   AND    ( l_exclude_tax_from_disc = 'Y' and
3871            AID.Line_Type_Lookup_Code NOT IN ('REC_TAX', 'NONREC_TAX') or
3872            nvl(l_exclude_tax_from_disc, 'N') = 'N' )
3873   AND    AID.Line_Type_Lookup_Code <>
3874              DECODE(l_exclude_frt_from_disc, 'Y', 'FREIGHT', 'DUMMY')
3875   GROUP  BY AID.Invoice_ID;
3876 
3877   EXCEPTION
3878 
3879   WHEN OTHERS THEN
3880   l_invoice_amount := 0;
3881 
3882   END;
3883 
3884   IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
3885       l_log_msg := 'Total invoice amount excluding tax or freight = '||
3886                                           l_invoice_amount;
3887       FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME || l_procedure_name, l_log_msg);
3888   END IF;
3889 
3890 
3891   /* If the options exclude_tax_from_disc and exclude_frt_from_disc
3892      are set to 'Y' then we do not need to distribution the payment
3893      to the Tax and Freight type of invoice distribution */
3894   IF (l_exclude_tax_from_disc = 'Y'
3895             AND ( p_inv_dist_rec.line_type_lookup_code = 'REC_TAX' or
3896                   p_inv_dist_rec.line_type_lookup_code = 'NONREC_TAX') ) THEN
3897       IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
3898         l_log_msg := 'l_exclude_tax_from_disc= Y so this procedure do nothing for tax line';
3899         FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME || l_procedure_name, l_log_msg);
3900       END IF;
3901 
3902       RETURN;
3903 
3904   ELSIF (l_exclude_frt_from_disc = 'Y'
3905             AND p_inv_dist_rec.line_type_lookup_code = 'FREIGHT') THEN
3906 
3907       IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
3908         l_log_msg := 'l_exclude_frt_from_disc= Y so this procedure do nothing';
3909         FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME || l_procedure_name, l_log_msg);
3910       END IF;
3911 
3912       RETURN;
3913 
3914   ELSE
3915 
3916       IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
3917         l_log_msg := 'consider discount prorate to frieight';
3918         FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME || l_procedure_name, l_log_msg);
3919       END IF;
3920 
3921       IF (p_inv_rec.invoice_currency_code <> p_inv_rec.payment_currency_code) THEN
3922 
3923           l_disc_amt_inv_curr := GL_Currency_API.Convert_Amount(
3924                                           p_inv_rec.payment_currency_code,
3925                                           p_inv_rec.invoice_currency_code,
3926                                           p_inv_rec.payment_cross_rate_date,
3927                                           'EMU FIXED',
3928                                           p_inv_pay_rec.discount_taken);
3929 
3930       ELSE
3931 
3932          l_disc_amt_inv_curr := p_inv_pay_rec.discount_taken;
3933 
3934       END IF;
3935 
3936       IF (p_xla_event_rec.event_type_code IN ('PAYMENT CLEARED',
3937                                               'PAYMENT CLEARING ADJUSTED')) THEN
3938 
3939           IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
3940                  l_log_msg := 'assigning the disc_amt_bank_curr for event type' ||
3941                               p_xla_event_rec.event_type_code;
3942                  FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME || l_procedure_name, l_log_msg);
3943           END IF;
3944 
3945           IF p_pay_hist_rec.pmt_currency_code <> p_pay_hist_rec.bank_currency_code THEN
3946 
3947              IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
3948                  l_log_msg := 'Converting discount amt into bank currency';
3949                  FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME || l_procedure_name, l_log_msg);
3950              END IF;
3951 
3952 
3953              l_disc_amt_bank_curr :=
3954                        AP_Utilities_Pkg.AP_Round_Currency(
3955                             p_inv_pay_rec.discount_taken * p_pay_hist_rec.pmt_to_base_xrate
3956                                      /p_pay_hist_rec.bank_to_base_xrate,
3957                             p_pay_hist_rec.bank_currency_code);
3958 
3959           ELSE
3960 
3961              l_disc_amt_bank_curr := p_inv_pay_rec.discount_taken;
3962 
3963           END IF;
3964 
3965       ELSE
3966 
3967            -- bug 5652032
3968            -- due to record were inserted into payment history.
3969            -- often we don't need to have bank currency and bank amount
3970            -- related information, we need to take care of this case
3971            -- when transaction type is not clearing/unclearing
3972 
3973            IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
3974                  l_log_msg := 'assigning the disc_amt_bank_curr for event type' ||
3975                               p_xla_event_rec.event_type_code;
3976                  FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME || l_procedure_name, l_log_msg);
3977            END IF;
3978 
3979           l_disc_amt_bank_curr := p_inv_pay_rec.discount_taken;
3980 
3981       END IF;
3982 
3983 
3984       IF (p_calc_mode IN ('P','M')) THEN
3985 
3986           IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
3987               l_log_msg := 'not cascade mode - p_calc_mode = ' || p_calc_mode;
3988               FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME || l_procedure_name, l_log_msg);
3989           END IF;
3990 
3991           -- Bug 7577312: Changed the logic here to refer to l_total_dist_amount
3992           -- Bug 8202856. Added check for G_Last_NonExcluded_Dist_ID to cover cases
3993           -- where no discount amount is prorated to the last distribution.
3994           IF g_total_dist_amt = l_total_dist_amount OR
3995             p_inv_dist_rec.invoice_distribution_id = G_Last_NonExcluded_Dist_ID THEN -- last dist rec
3996 
3997              -- To avoid rounding, massage the last (biggest) line
3998              l_prorated_disc_amt := p_inv_pay_rec.discount_taken - g_total_prorated_disc_amt;
3999              l_inv_dist_amount := l_disc_amt_inv_curr - g_total_inv_dist_disc_amt;
4000              l_bank_curr_amount := l_disc_amt_bank_curr - g_total_bank_curr_disc_amt;
4001 
4002              IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
4003                  l_log_msg := 'Value of l_prorated_disc_amt = '||l_prorated_disc_amt;
4004                  FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME || l_procedure_name, l_log_msg);
4005              END IF;
4006 
4007 
4008           ELSE
4009 
4010              IF l_invoice_amount = 0 THEN
4011 
4012                 l_prorated_disc_amt := 0;
4013                 l_inv_dist_amount := 0;
4014                 l_bank_curr_amount := 0;
4015 
4016              ELSE
4017 
4018                 l_prorated_disc_amt := AP_UTILITIES_PKG.AP_ROUND_CURRENCY
4019                                         (p_inv_pay_rec.discount_taken * p_inv_dist_rec.amount
4020                                               / l_invoice_amount,
4021                                          p_pay_hist_rec.pmt_currency_code);
4022 
4023                 l_inv_dist_amount := AP_UTILITIES_PKG.AP_ROUND_CURRENCY
4024                                         (l_disc_amt_inv_curr * p_inv_dist_rec.amount
4025                                               / l_invoice_amount,
4026                                          p_inv_rec.invoice_currency_code);
4027 
4028 
4029                IF ( p_pay_hist_rec.bank_currency_code is not NULL ) THEN
4030                  l_bank_curr_amount := AP_UTILITIES_PKG.AP_ROUND_CURRENCY
4031                                         (l_disc_amt_bank_curr * p_inv_dist_rec.amount
4032                                               / l_invoice_amount,
4033                                          p_pay_hist_rec.bank_currency_code);
4034 
4035                END IF;
4036 
4037              END IF;
4038 
4039              IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
4040                  l_log_msg := 'Value of l_prorated_disc_amt = '||l_prorated_disc_amt;
4041                  FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME || l_procedure_name, l_log_msg);
4042              END IF;
4043 
4044           END IF;
4045 
4046           g_total_prorated_disc_amt := g_total_prorated_disc_amt + l_prorated_disc_amt;
4047           g_total_inv_dist_disc_amt := g_total_inv_dist_disc_amt + l_inv_dist_amount;
4048           g_total_bank_curr_disc_amt := g_total_bank_curr_disc_amt + l_bank_curr_amount;
4049 
4050       ELSE
4051 
4052           IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
4053               l_log_msg := 'seems cascade mode - p_calc_mode = ' || p_calc_mode;
4054               FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME || l_procedure_name, l_log_msg);
4055           END IF;
4056 
4057           IF l_invoice_amount = 0 THEN --bug13681089
4058 
4059                 l_prorated_disc_amt := 0;
4060                 l_inv_dist_amount := 0;
4061                 l_bank_curr_amount := 0;
4062 
4063           ELSE
4064 
4065           l_prorated_disc_amt := AP_UTILITIES_PKG.AP_ROUND_CURRENCY
4066                                     (p_inv_pay_rec.discount_taken * p_inv_dist_rec.amount
4067                                           / l_invoice_amount,
4068                                      p_pay_hist_rec.pmt_currency_code)
4069                                  - ap_accounting_pay_pkg.get_casc_discount_sum
4070                                         (p_inv_dist_rec.invoice_distribution_id,
4071                                          p_pay_hist_rec.related_event_id,
4072                                          p_inv_pay_rec.invoice_payment_id,
4073                                          l_curr_calling_sequence);
4074 
4075           l_inv_dist_amount := AP_UTILITIES_PKG.AP_ROUND_CURRENCY
4076                                     (l_disc_amt_inv_curr * p_inv_dist_rec.amount
4077                                           / l_invoice_amount,
4078                                      p_inv_rec.invoice_currency_code)
4079                                  - ap_accounting_pay_pkg.get_casc_inv_dist_disc_sum
4080                                         (p_inv_dist_rec.invoice_distribution_id,
4081                                          p_pay_hist_rec.related_event_id,
4082                                          p_inv_pay_rec.invoice_payment_id,
4083                                          l_curr_calling_sequence);
4084 
4085           /* bug 11056722 Changed the below assignment to assign to l_bank_curr_amount */
4086           IF ( p_pay_hist_rec.bank_currency_code is not NULL ) THEN
4087             l_bank_curr_amount := AP_UTILITIES_PKG.AP_ROUND_CURRENCY
4088                                     (l_disc_amt_bank_curr * p_inv_dist_rec.amount
4089                                           / l_invoice_amount,
4090                                      p_pay_hist_rec.bank_currency_code)
4091                                  - ap_accounting_pay_pkg.get_casc_bank_curr_disc_sum
4092                                         (p_inv_dist_rec.invoice_distribution_id,
4093                                          p_pay_hist_rec.related_event_id,
4094                                          p_inv_pay_rec.invoice_payment_id,
4095                                          l_curr_calling_sequence);
4096           END IF;
4097          END IF; --bug13681089
4098           IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
4099               l_log_msg := 'Value of l_prorated_disc_amt = '||l_prorated_disc_amt;
4100               FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME || l_procedure_name, l_log_msg);
4101           END IF;
4102 
4103 
4104       END IF; -- If calc_mode in ('P,'M')
4105 
4106   END IF;
4107 
4108 
4109   -- Populate payment dist rec
4110   l_pd_rec.accounting_event_id := p_xla_event_rec.event_id;
4111   l_pd_rec.pay_dist_lookup_code := 'DISCOUNT';
4112   l_pd_rec.invoice_distribution_id := p_inv_dist_rec.invoice_distribution_id;
4113   l_pd_rec.amount := l_prorated_disc_amt;
4114 
4115   l_pd_rec.payment_history_id := p_pay_hist_rec.payment_history_id;
4116   l_pd_rec.invoice_payment_id := p_inv_pay_rec.invoice_payment_id;
4117 
4118   l_pd_rec.bank_curr_amount :=  l_bank_curr_amount;
4119 
4120   l_prorated_base_amount := AP_Accounting_Pay_Pkg.Get_Base_Amount
4121                                    (l_prorated_disc_amt,
4122                                     p_pay_hist_rec.pmt_currency_code,
4123                                     ap_accounting_pay_pkg.g_base_currency_code,
4124                                     p_pay_hist_rec.pmt_to_base_xrate_type,
4125                                     p_pay_hist_rec.pmt_to_base_xrate_date,
4126                                     p_pay_hist_rec.pmt_to_base_xrate,
4127                                     l_curr_calling_sequence);
4128 
4129   IF p_xla_event_rec.event_type_code IN
4130                   ('PAYMENT CLEARED', 'PAYMENT CLEARING ADJUSTED') THEN
4131 
4132      l_pd_rec.cleared_base_amount := AP_Accounting_Pay_Pkg.Get_Base_Amount
4133                                       (l_bank_curr_amount,
4134                                        p_pay_hist_rec.bank_currency_code,
4135                                        ap_accounting_pay_pkg.g_base_currency_code,
4136                                        p_pay_hist_rec.bank_to_base_xrate_type,
4137                                        p_pay_hist_rec.bank_to_base_xrate_date,
4138                                        p_pay_hist_rec.bank_to_base_xrate,
4139                                        l_curr_calling_sequence);
4140 
4141      l_pd_rec.paid_base_amount := AP_Accounting_Pay_Pkg.Get_Base_Amount
4142                                       (l_prorated_disc_amt,
4143                                        p_pay_hist_rec.pmt_currency_code,
4144                                        ap_accounting_pay_pkg.g_base_currency_code,
4145                                        ap_accounting_pay_pkg.g_pmt_to_base_xrate_type,
4146                                        ap_accounting_pay_pkg.g_pmt_to_base_xrate_date,
4147                                        ap_accounting_pay_pkg.g_pmt_to_base_xrate,
4148                                        l_curr_calling_sequence);
4149 
4150      IF ap_accounting_pay_pkg.g_mat_to_base_xrate IS NOT NULL THEN
4151 
4152         l_pd_rec.matured_base_amount := AP_Accounting_Pay_Pkg.Get_Base_Amount
4153                                           (l_prorated_disc_amt,
4154                                            p_pay_hist_rec.pmt_currency_code,
4155                                            ap_accounting_pay_pkg.g_base_currency_code,
4156                                            ap_accounting_pay_pkg.g_mat_to_base_xrate_type,
4157                                            ap_accounting_pay_pkg.g_mat_to_base_xrate_date,
4158                                            ap_accounting_pay_pkg.g_mat_to_base_xrate,
4159                                            l_curr_calling_sequence);
4160      END IF ;
4161 
4162   ELSIF p_xla_event_rec.event_type_code IN
4163                   ('PAYMENT MATURED', 'PAYMENT MATURITY ADJUSTED') THEN
4164      l_pd_rec.matured_base_amount := l_prorated_base_amount;
4165 
4166      l_pd_rec.paid_base_amount := AP_Accounting_Pay_Pkg.Get_Base_Amount
4167                                       (l_prorated_disc_amt,
4168                                        p_pay_hist_rec.pmt_currency_code,
4169                                        ap_accounting_pay_pkg.g_base_currency_code,
4170                                        ap_accounting_pay_pkg.g_pmt_to_base_xrate_type,
4171                                        ap_accounting_pay_pkg.g_pmt_to_base_xrate_date,
4172                                        ap_accounting_pay_pkg.g_pmt_to_base_xrate,
4173                                        l_curr_calling_sequence);
4174 
4175   ELSE
4176      l_pd_rec.paid_base_amount := l_prorated_base_amount;
4177   END IF;
4178 
4179 
4180   l_pd_rec.invoice_dist_amount := l_inv_dist_amount;
4181 
4182   /* If the exchange rates between the invoice and payment have not changed then
4183      the invoice and payment base amounts should be the same. Assigning the
4184      payment base amount to the invoice base amount instead of recalculating the
4185      invoice base amount */
4186 
4187   IF (p_pay_hist_rec.pmt_to_base_xrate =
4188                p_inv_rec.exchange_rate / p_inv_rec.payment_cross_rate) THEN
4189 
4190       l_pd_rec.invoice_dist_base_amount := l_prorated_base_amount;
4191 
4192   ELSE
4193 
4194       l_pd_rec.invoice_dist_base_amount :=
4195                                     AP_Accounting_Pay_Pkg.Get_Base_Amount
4196                                          (l_inv_dist_amount,
4197                                           p_inv_rec.invoice_currency_code,
4198                                           ap_accounting_pay_pkg.g_base_currency_code,
4199                                           p_inv_rec.exchange_rate_type,
4200                                           p_inv_rec.exchange_date,
4201                                           p_inv_rec.exchange_rate,
4202                                           l_curr_calling_sequence);
4203 
4204   END IF;
4205 
4206   IF (G_LEVEL_PROCEDURE >= G_CURRENT_RUNTIME_LEVEL ) THEN
4207       l_log_msg := 'Calling procedure Pay_Dist_Insert';
4208       FND_LOG.STRING(G_LEVEL_PROCEDURE, G_MODULE_NAME||l_procedure_name, l_log_msg);
4209   END IF;
4210 
4211 
4212   Pay_Dist_Insert
4213           (l_pd_rec,
4214            l_curr_calling_sequence);
4215 
4216 
4217   p_disc_pay_amount := NVL(l_prorated_disc_amt,0);
4218   p_disc_dist_amount := NVL(l_inv_dist_amount,0);
4219   p_disc_bank_amount := NVL(l_bank_curr_amount,0);
4220 
4221 
4222   IF (G_LEVEL_PROCEDURE >= G_CURRENT_RUNTIME_LEVEL ) THEN
4223       l_log_msg := 'Procedure Pay_Dist_Insert executed';
4224       FND_LOG.STRING(G_LEVEL_PROCEDURE, G_MODULE_NAME||l_procedure_name, l_log_msg);
4225   END IF;
4226 
4227 
4228 EXCEPTION
4229   WHEN OTHERS THEN
4230     IF (SQLCODE <> -20001) THEN
4231       FND_MESSAGE.SET_NAME('SQLAP','AP_DEBUG');
4232       FND_MESSAGE.SET_TOKEN('ERROR',SQLERRM);
4233       FND_MESSAGE.SET_TOKEN('CALLING_SEQUENCE', l_curr_calling_sequence);
4234     END IF;
4235     APP_EXCEPTION.RAISE_EXCEPTION;
4236 
4237 END Pay_Dist_Discount;
4238 
4239 
4240 ---------------------------------------------------------------------
4241 -- Procedure Pay_Dist_ERV
4242 -- This procedure calculates the ERV base amounts for the ERV distributions
4243 -- and inserts the calculated values into payment hist dists table
4244 ---------------------------------------------------------------------
4245 
4246 PROCEDURE Pay_Dist_ERV
4247       (p_xla_event_rec    IN    ap_accounting_pay_pkg.r_xla_event_info
4248       ,p_inv_pay_rec      IN    r_inv_pay_info
4249       ,p_pay_hist_rec     IN    ap_accounting_pay_pkg.r_pay_hist_info
4250       ,p_inv_rec          IN    ap_accounting_pay_pkg.r_invoices_info
4251       ,p_inv_dist_rec     IN    ap_accounting_pay_pkg.r_inv_dist_info
4252       ,p_prorated_amount  IN    NUMBER
4253       ,p_calling_sequence IN    VARCHAR2
4254       ) IS
4255 
4256   l_curr_calling_sequence          VARCHAR2(2000);
4257   l_po_exchange_rate               NUMBER;
4258   l_po_pay_exchange_rate           NUMBER;
4259   l_erv_amount                     NUMBER;
4260   l_inv_erv_amount                 NUMBER;
4261   l_pd_rec                         AP_PAYMENT_HIST_DISTS%ROWTYPE;
4262 
4263   -- Logging Infra:
4264   l_procedure_name CONSTANT VARCHAR2(30) := 'Pay_Dist_ERV';
4265   l_log_msg        FND_LOG_MESSAGES.MESSAGE_TEXT%TYPE;
4266 
4267 BEGIN
4268 
4269 
4270   l_curr_calling_sequence := 'AP_ACCTG_PAY_DIST_PKG.Pay_Dist_ERV<- ' ||
4271                                                  p_calling_sequence;
4272 
4273 
4274   -- Logging Infra: Procedure level
4275   IF (G_LEVEL_PROCEDURE >= G_CURRENT_RUNTIME_LEVEL ) THEN
4276       l_log_msg := 'Begin of procedure '|| l_procedure_name;
4277       FND_LOG.STRING(G_LEVEL_PROCEDURE, G_MODULE_NAME||l_procedure_name||'.begin', l_log_msg);
4278   END IF;
4279 
4280   IF p_inv_dist_rec.rcv_transaction_id IS NOT NULL THEN
4281 
4282      SELECT Currency_Conversion_Rate
4283      INTO   l_po_exchange_rate
4284      FROM   rcv_transactions
4285      WHERE  transaction_id = p_inv_dist_rec.rcv_transaction_id;
4286 
4287      IF (G_LEVEL_PROCEDURE >= G_CURRENT_RUNTIME_LEVEL ) THEN
4288       l_log_msg := 'receipt matching and exchange rate = ' ||
4289                     l_po_exchange_rate;
4290       FND_LOG.STRING(G_LEVEL_PROCEDURE, G_MODULE_NAME||l_procedure_name||'.begin', l_log_msg);
4291      END IF;
4292 
4293   ELSE
4294 
4295      SELECT Rate
4296      INTO   l_po_exchange_rate
4297      FROM   PO_Distributions_All
4298      WHERE  PO_Distribution_ID = p_inv_dist_rec.PO_Distribution_ID;
4299 
4300      IF (G_LEVEL_PROCEDURE >= G_CURRENT_RUNTIME_LEVEL ) THEN
4301       l_log_msg := 'po matching and exchange rate = ' ||
4302                     l_po_exchange_rate;
4303       FND_LOG.STRING(G_LEVEL_PROCEDURE, G_MODULE_NAME||l_procedure_name||'.begin', l_log_msg);
4304      END IF;
4305 
4306   END IF;
4307 
4308   IF p_inv_rec.invoice_currency_code <> p_inv_rec.payment_currency_code THEN
4309 
4310      l_po_pay_exchange_rate := l_po_exchange_rate / p_inv_rec.payment_cross_rate;
4311 
4312   ELSE
4313      l_po_pay_exchange_rate := l_po_exchange_rate;
4314   END IF;
4315 
4316   IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
4317       l_log_msg := 'Value of l_po_pay_exchange_rate = '||l_po_pay_exchange_rate ||
4318                    'value of p_prorated_amount=' ||  p_prorated_amount;
4319       FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME || l_procedure_name, l_log_msg);
4320   END IF;
4321 
4322 
4323   /* For Cash Basis ERV is Difference between Payment Exchange Rate and
4324      either Receipt Exchange rate or PO distributions exchange rate */
4325 
4326   l_erv_amount := AP_UTILITIES_PKG.AP_ROUND_CURRENCY(
4327                       (p_pay_hist_rec.pmt_to_base_xrate - l_po_pay_exchange_rate) *
4328                            p_prorated_amount, p_pay_hist_rec.pmt_currency_code);
4329 
4330 
4331   /* In order to back out the encumbrance entries correctly during cash basis
4332      we need to calculate ERV based on the difference between the Invoice
4333      Exchange Rate and either Receipt Exchange rate or PO distributions
4334      exchange rate. This calculated ERV amount will be stored in the
4335      invoice_dist_base_amount column */
4336 
4337   l_inv_erv_amount := AP_UTILITIES_PKG.AP_ROUND_CURRENCY(
4338                          (p_inv_rec.exchange_rate - l_po_pay_exchange_rate) *
4339                               p_prorated_amount, p_inv_rec.invoice_currency_code);
4340 
4341 
4342   -- Populate payment dist rec
4343   l_pd_rec.accounting_event_id := p_xla_event_rec.event_id;
4344 
4345   IF (p_inv_dist_rec.line_type_lookup_code IN ('NONREC_TAX', 'REC_TAX')) THEN
4346       l_pd_rec.pay_dist_lookup_code := 'TAX EXCHANGE RATE VARIANCE';
4347   ELSE
4348       l_pd_rec.pay_dist_lookup_code := 'EXCHANGE RATE VARIANCE';
4349   END IF;
4350 
4351   l_pd_rec.invoice_distribution_id := p_inv_dist_rec.invoice_distribution_id;
4352   l_pd_rec.amount := 0;
4353 
4354   l_pd_rec.payment_history_id := p_pay_hist_rec.payment_history_id;
4355   l_pd_rec.invoice_payment_id := p_inv_pay_rec.invoice_payment_id;
4356   l_pd_rec.bank_curr_amount := 0;
4357   l_pd_rec.invoice_dist_amount := 0;
4358 
4359   IF (p_xla_event_rec.event_type_code IN ('PAYMENT CLEARED',
4360                                          'PAYMENT CLEARING ADJUSTED')) THEN
4361       l_pd_rec.cleared_base_amount := l_erv_amount;
4362   ELSE
4363       l_pd_rec.paid_base_amount := l_erv_amount;
4364   END IF;
4365 
4366   l_pd_rec.invoice_dist_base_amount := l_inv_erv_amount;
4367 
4368   IF (G_LEVEL_PROCEDURE >= G_CURRENT_RUNTIME_LEVEL ) THEN
4369       l_log_msg := 'Calling procedure Pay_Dist_Insert';
4370       FND_LOG.STRING(G_LEVEL_PROCEDURE, G_MODULE_NAME||l_procedure_name, l_log_msg);
4371   END IF;
4372 
4373   IF (G_LEVEL_PROCEDURE >= G_CURRENT_RUNTIME_LEVEL ) THEN
4374       l_log_msg := 'before callining erv/terv insert -' ||
4375                    'l_pd_rec.invoice_dist_base_amount = ' ||
4376                    l_pd_rec.invoice_dist_base_amount ||
4377                    'l_pd_rec.paid_base_amount or cleared_base_amount =' ||
4378                    l_erv_amount;
4379       FND_LOG.STRING(G_LEVEL_PROCEDURE, G_MODULE_NAME||l_procedure_name, l_log_msg);
4380   END IF;
4381 
4382   --9081055, Not inserting Exchange rate variance when the exchange rates
4383   -- at PO, Invoice and Payments are equal . Added condition to call
4384   -- Pay_dist_insert procedure.
4385 
4386   IF ( l_erv_amount <>0 OR l_inv_erv_amount <>0) THEN
4387     Pay_Dist_Insert
4388           (l_pd_rec,
4389            l_curr_calling_sequence);
4390   END IF ;
4391 
4392   IF (G_LEVEL_PROCEDURE >= G_CURRENT_RUNTIME_LEVEL ) THEN
4393       l_log_msg := 'Procedure Pay_Dist_Insert executed';
4394       FND_LOG.STRING(G_LEVEL_PROCEDURE, G_MODULE_NAME||l_procedure_name, l_log_msg);
4395   END IF;
4396 
4397   IF (G_LEVEL_PROCEDURE >= G_CURRENT_RUNTIME_LEVEL ) THEN
4398       l_log_msg := 'end of procedure Pay_Dist_ERV';
4399       FND_LOG.STRING(G_LEVEL_PROCEDURE, G_MODULE_NAME||l_procedure_name, l_log_msg);
4400   END IF;
4401 
4402 EXCEPTION
4403   WHEN OTHERS THEN
4404     IF (SQLCODE <> -20001) THEN
4405       FND_MESSAGE.SET_NAME('SQLAP','AP_DEBUG');
4406       FND_MESSAGE.SET_TOKEN('ERROR',SQLERRM);
4407       FND_MESSAGE.SET_TOKEN('CALLING_SEQUENCE', l_curr_calling_sequence);
4408     END IF;
4409     APP_EXCEPTION.RAISE_EXCEPTION;
4410 
4411 END Pay_Dist_ERV;
4412 
4413 
4414 ---------------------------------------------------------------------
4415 -- Procedure Pay_Dist_Err_Chrg
4416 -- This procedure prorates the errors and charge amounts for each distribution
4417 -- and inserts the calculated values into payment hist dists table
4418 ---------------------------------------------------------------------
4419 
4420 PROCEDURE Pay_Dist_Err_Chrg
4421       (p_xla_event_rec    IN    ap_accounting_pay_pkg.r_xla_event_info
4422       ,p_pay_hist_rec     IN    ap_accounting_pay_pkg.r_pay_hist_info
4423       ,p_distribute_mode  IN    VARCHAR2
4424       ,p_calling_sequence IN    VARCHAR2
4425       ) IS
4426 
4427   l_curr_calling_sequence          VARCHAR2(2000);
4428   l_err_chrg_amount                NUMBER;
4429   l_prorated_amt                   NUMBER;
4430   l_prorated_base_amount           NUMBER;
4431   l_total_pay_amt                  NUMBER;
4432   l_pay_dist_type                  VARCHAR2(30);
4433   l_total_dist_amt                 NUMBER := 0;
4434   l_total_prorated_amt             NUMBER := 0;
4435   l_inv_dist_amount                NUMBER;
4436 
4437   l_pd_rec                         AP_PAYMENT_HIST_DISTS%ROWTYPE;
4438 
4439   CURSOR clearing_pay_dists
4440         (P_Event_ID    NUMBER)
4441         IS
4442   SELECT Accounting_Event_ID,
4443          Invoice_Distribution_ID,
4444          Amount,
4445          Payment_History_ID,
4446          Invoice_Payment_ID
4447   FROM   AP_Payment_Hist_Dists APHD
4448   WHERE  APHD.Accounting_Event_ID = P_Event_ID
4449   AND    APHD.Pay_Dist_Lookup_Code = 'CASH'
4450    AND NOT EXISTS
4451   (SELECT 1 FROM AP_PAYMENT_HIST_DISTS APHD1
4452   WHERE APHD1.ACCOUNTING_EVENT_ID=P_Event_ID
4453   AND APHD1.INVOICE_DISTRIBUTION_ID = APHD.INVOICE_DISTRIBUTION_ID
4454   AND APHD1.PAY_DIST_LOOKUP_CODE ='BANK CHARGE')
4455   ORDER  BY Amount; /* Bug13385106 */
4456 
4457   -- Logging Infra:
4458   l_procedure_name CONSTANT VARCHAR2(30) := 'Pay_Dist_Err_Chrg';
4459   l_log_msg        FND_LOG_MESSAGES.MESSAGE_TEXT%TYPE;
4460 
4461 
4462 BEGIN
4463 
4464 
4465   l_curr_calling_sequence := 'AP_ACCTG_PAY_DIST_PKG.Pay_Dist_Err_Chrg<- ' ||
4466                                                  p_calling_sequence;
4467 
4468   -- Logging Infra: Procedure level
4469   IF (G_LEVEL_PROCEDURE >= G_CURRENT_RUNTIME_LEVEL ) THEN
4470       l_log_msg := 'Begin of procedure '|| l_procedure_name;
4471       FND_LOG.STRING(G_LEVEL_PROCEDURE, G_MODULE_NAME||l_procedure_name||'.begin', l_log_msg);
4472   END IF;
4473 
4474 
4475   IF (G_LEVEL_PROCEDURE >= G_CURRENT_RUNTIME_LEVEL ) THEN
4476       l_log_msg := 'Passing Parameters are ' ||
4477                    'p_distribute_mode=' || p_distribute_mode ||
4478                    'event_id = ' || p_xla_event_rec.event_id;
4479       FND_LOG.STRING(G_LEVEL_PROCEDURE, G_MODULE_NAME||l_procedure_name, l_log_msg);
4480   END IF;
4481 
4482 
4483   IF ( p_distribute_mode = 'BANK_ERROR' AND
4484        NVL(p_pay_hist_rec.errors_bank_amount,0) <> 0) THEN
4485 
4486       l_err_chrg_amount := p_pay_hist_rec.errors_bank_amount;
4487       l_pay_dist_type := 'BANK ERROR';
4488 
4489   ELSIF (  p_distribute_mode = 'BANK_CHARGE' AND
4490             NVL(p_pay_hist_rec.charges_bank_amount,0) <> 0 ) THEN
4491 
4492       l_err_chrg_amount := p_pay_hist_rec.charges_bank_amount;
4493       l_pay_dist_type := 'BANK CHARGE';
4494 
4495   ELSE
4496       IF (G_LEVEL_PROCEDURE >= G_CURRENT_RUNTIME_LEVEL ) THEN
4497         l_log_msg := 'No need to prorate charge or error when amount=0 - return';
4498         FND_LOG.STRING(G_LEVEL_PROCEDURE, G_MODULE_NAME||l_procedure_name, l_log_msg);
4499       END IF;
4500       return;
4501   END IF;
4502 
4503    IF (G_LEVEL_PROCEDURE >= G_CURRENT_RUNTIME_LEVEL ) THEN
4504         l_log_msg := 'l_err_chrg_amount= ' || l_err_chrg_amount;
4505         FND_LOG.STRING(G_LEVEL_PROCEDURE, G_MODULE_NAME||l_procedure_name, l_log_msg);
4506    END IF;
4507 
4508 
4509   SELECT SUM(Amount)
4510   INTO   l_total_pay_amt
4511   FROM   AP_Payment_Hist_Dists
4512   WHERE  accounting_event_id = nvl(p_pay_hist_rec.related_event_id,P_XLA_Event_Rec.event_id)/* Bug13385106 */
4513   AND    Pay_Dist_Lookup_Code = 'CASH';
4514 
4515   FOR l_clr_rec IN clearing_pay_dists(p_xla_event_rec.event_id)
4516   LOOP
4517 
4518       IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
4519           l_log_msg := 'CUR: clearing_pay_dists: Invoice_Dist_ID = '
4520                        ||l_clr_rec.invoice_distribution_id;
4521           FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME || l_procedure_name, l_log_msg);
4522       END IF;
4523 
4524       l_total_dist_amt := l_total_dist_amt + l_clr_rec.amount;
4525 
4526       IF l_total_dist_amt = l_total_pay_amt THEN
4527          l_prorated_amt := l_err_chrg_amount - l_total_prorated_amt;
4528       ELSE
4529          l_prorated_amt := AP_UTILITIES_PKG.AP_ROUND_CURRENCY(
4530                                   l_err_chrg_amount * l_clr_rec.amount
4531                                     / l_total_pay_amt, p_pay_hist_rec.pmt_currency_code);
4532       END IF;
4533 
4534       l_total_prorated_amt := l_total_prorated_amt + l_prorated_amt;
4535 
4536 
4537       -- Populate payment dist rec
4538       l_pd_rec.accounting_event_id := p_xla_event_rec.event_id;
4539 
4540       l_pd_rec.pay_dist_lookup_code := l_pay_dist_type;
4541       l_pd_rec.invoice_distribution_id := l_clr_rec.invoice_distribution_id;
4542       l_pd_rec.amount := l_prorated_amt;
4543 
4544       l_pd_rec.payment_history_id := p_pay_hist_rec.payment_history_id;
4545       l_pd_rec.invoice_payment_id := l_clr_rec.invoice_payment_id;
4546 
4547       -- Bug#8790270 l_prorated_amt is in bank currency
4548        l_pd_rec.bank_curr_amount := l_prorated_amt; --10409166
4549 
4550 
4551       /*Commented code removed*/
4552       -- Bug6901436. l_prorated_amount is in bank currency. Bank to base
4553       -- exchange rate details needs to be provided to Get_Base_Amount
4554       -- procedure.
4555        l_prorated_base_amount := AP_Accounting_Pay_Pkg.Get_Base_Amount
4556                                          (l_prorated_amt,
4557                                           p_pay_hist_rec.bank_currency_code,
4558                                           ap_accounting_pay_pkg.g_base_currency_code,
4559                                           p_pay_hist_rec.bank_to_base_xrate_type,
4560                                           p_pay_hist_rec.bank_to_base_xrate_date,
4561                                           p_pay_hist_rec.bank_to_base_xrate,
4562                                           l_curr_calling_sequence);
4563 
4564       -- End bug6901436
4565 
4566       IF p_xla_event_rec.event_type_code IN
4567                       ('PAYMENT CLEARED', 'PAYMENT CLEARING ADJUSTED') THEN
4568          l_pd_rec.cleared_base_amount := l_prorated_base_amount;
4569 
4570          l_pd_rec.paid_base_amount := AP_Accounting_Pay_Pkg.Get_Base_Amount
4571                                           (l_prorated_amt,
4572                                            p_pay_hist_rec.pmt_currency_code,
4573                                            ap_accounting_pay_pkg.g_base_currency_code,
4574                                            ap_accounting_pay_pkg.g_pmt_to_base_xrate_type,
4575                                            ap_accounting_pay_pkg.g_pmt_to_base_xrate_date,
4576                                            ap_accounting_pay_pkg.g_pmt_to_base_xrate,
4577                                            l_curr_calling_sequence);
4578 
4579          IF ap_accounting_pay_pkg.g_mat_to_base_xrate IS NOT NULL THEN
4580 
4581             l_pd_rec.matured_base_amount := AP_Accounting_Pay_Pkg.Get_Base_Amount
4582                                               (l_prorated_amt,
4583                                                p_pay_hist_rec.pmt_currency_code,
4584                                                ap_accounting_pay_pkg.g_base_currency_code,
4585                                                ap_accounting_pay_pkg.g_mat_to_base_xrate_type,
4586                                                ap_accounting_pay_pkg.g_mat_to_base_xrate_date,
4587                                                ap_accounting_pay_pkg.g_mat_to_base_xrate,
4588                                                l_curr_calling_sequence);
4589          END IF ;
4590       ELSIF p_xla_event_rec.event_type_code IN
4591                       ('PAYMENT MATURED', 'PAYMENT MATURITY ADJUSTED') THEN
4592          l_pd_rec.matured_base_amount := l_prorated_base_amount;
4593 
4594          l_pd_rec.paid_base_amount := AP_Accounting_Pay_Pkg.Get_Base_Amount
4595                                       (l_prorated_amt,
4596                                        p_pay_hist_rec.pmt_currency_code,
4597                                        ap_accounting_pay_pkg.g_base_currency_code,
4598                                        ap_accounting_pay_pkg.g_pmt_to_base_xrate_type,
4599                                        ap_accounting_pay_pkg.g_pmt_to_base_xrate_date,
4600                                        ap_accounting_pay_pkg.g_pmt_to_base_xrate,
4601                                        l_curr_calling_sequence);
4602 
4603       ELSE
4604          l_pd_rec.paid_base_amount := l_prorated_base_amount;
4605       END IF;
4606 
4607       l_pd_rec.invoice_dist_amount := NULL;
4608       l_pd_rec.invoice_dist_base_amount := NULL;
4609 
4610 
4611       IF (G_LEVEL_PROCEDURE >= G_CURRENT_RUNTIME_LEVEL ) THEN
4612           l_log_msg := 'Calling procedure Pay_Dist_Insert';
4613           FND_LOG.STRING(G_LEVEL_PROCEDURE, G_MODULE_NAME||l_procedure_name, l_log_msg);
4614       END IF;
4615 
4616       -- Insert the payment hist distribution
4617       Pay_Dist_Insert
4618               (l_pd_rec,
4619                l_curr_calling_sequence);
4620 
4621       IF (G_LEVEL_PROCEDURE >= G_CURRENT_RUNTIME_LEVEL ) THEN
4622           l_log_msg := 'Procedure Pay_Dist_Insert executed';
4623           FND_LOG.STRING(G_LEVEL_PROCEDURE, G_MODULE_NAME||l_procedure_name, l_log_msg);
4624       END IF;
4625 
4626 
4627   END LOOP;
4628 
4629 
4630 EXCEPTION
4631   WHEN OTHERS THEN
4632     IF (SQLCODE <> -20001) THEN
4633       FND_MESSAGE.SET_NAME('SQLAP','AP_DEBUG');
4634       FND_MESSAGE.SET_TOKEN('ERROR',SQLERRM);
4635       FND_MESSAGE.SET_TOKEN('CALLING_SEQUENCE', l_curr_calling_sequence);
4636     END IF;
4637     APP_EXCEPTION.RAISE_EXCEPTION;
4638 
4639 END Pay_Dist_Err_Chrg;
4640 
4641 
4642 
4643 ---------------------------------------------------------------------
4644 -- Procedure Pay_Dist_Reverse
4645 -- This procedure reverses the payment distributions of the invoice
4646 -- payments that have been reversed.
4647 --
4648 ---------------------------------------------------------------------
4649 
4650 -- Bug 6887295. Added parameter p_inv_dist_rec
4651 PROCEDURE Pay_Dist_Reverse
4652       (p_xla_event_rec           IN    ap_accounting_pay_pkg.r_xla_event_info
4653       ,p_inv_pay_rec             IN    r_inv_pay_info
4654       ,p_pay_hist_rec            IN    ap_accounting_pay_pkg.r_pay_hist_info
4655       ,p_reversal_inv_pmt_id     IN    NUMBER
4656       ,p_related_event_id        IN    NUMBER
4657       ,p_invoice_dist_id         IN    NUMBER
4658       ,p_inv_dist_rec            IN    ap_accounting_pay_pkg.r_inv_dist_info
4659       ,p_calling_sequence        IN    VARCHAR2
4660       ) IS
4661 
4662   l_curr_calling_sequence          VARCHAR2(2000);
4663 
4664   -- Logging Infra:
4665   l_procedure_name CONSTANT VARCHAR2(30) := 'Pay_Dist_Reverse';
4666   l_log_msg        FND_LOG_MESSAGES.MESSAGE_TEXT%TYPE;
4667 
4668   l_transaction_type      AP_PAYMENT_HISTORY_ALL.TRANSACTION_TYPE%TYPE;
4669   l_payment_history_id    AP_PAYMENT_HISTORY_ALL.PAYMENT_HISTORY_ID%TYPE;
4670   l_accounting_event_id   AP_PAYMENT_HISTORY_ALL.ACCOUNTING_EVENT_ID%TYPE;
4671   l_historical_flag       AP_PAYMENT_HISTORY_ALL.HISTORICAL_FLAG%TYPE;
4672   l_reversed_in_R12       VARCHAR2(1) := 'N';
4673   l_upg_batch_id          XLA_AE_HEADERS.UPG_BATCH_ID%TYPE;
4674 
4675 
4676 BEGIN
4677 
4678   l_curr_calling_sequence := 'AP_ACCTG_PAY_DIST_PKG.Pay_Dist_Reverse<-' ||
4679                                            p_calling_sequence;
4680 
4681 
4682   -- Logging Infra: Procedure level
4683   IF (G_LEVEL_PROCEDURE >= G_CURRENT_RUNTIME_LEVEL ) THEN
4684       l_log_msg := 'Begin of procedure '|| l_procedure_name;
4685       FND_LOG.STRING(G_LEVEL_PROCEDURE, G_MODULE_NAME||l_procedure_name||'.begin', l_log_msg);
4686   END IF;
4687 
4688   IF p_reversal_inv_pmt_id IS NOT NULL THEN
4689 
4690 
4691      IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
4692          l_log_msg := 'Reversing based on reversal_inv_pmt_id '||
4693                                              p_reversal_inv_pmt_id;
4694          FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME || l_procedure_name, l_log_msg);
4695      END IF;
4696 
4697      INSERT INTO ap_payment_hist_dists
4698            (Payment_Hist_Dist_ID,
4699             Accounting_Event_ID,
4700             Amount,
4701             Pay_Dist_Lookup_Code,
4702             Payment_History_ID,
4703             Invoice_Distribution_ID,
4704             Invoice_Payment_ID,
4705             Bank_Curr_Amount,
4706             Cleared_Base_Amount,
4707             Invoice_Dist_Amount,
4708             Invoice_Dist_Base_Amount,
4709             Invoice_Adjustment_Event_ID,
4710             Matured_Base_Amount,
4711             Paid_Base_Amount,
4712             Reversal_Flag,
4713             Reversed_Pay_Hist_Dist_ID,
4714             AWT_Related_ID,
4715             PA_Addition_Flag,
4716             Quantity_Variance,
4717             Invoice_Base_Qty_Variance,
4718             Amount_Variance,
4719             Invoice_Base_Amt_Variance,
4720             Created_By,
4721             Creation_Date,
4722             Last_Update_Date,
4723             Last_Updated_By,
4724             Last_Update_Login,
4725             Program_Application_ID,
4726             Program_ID,
4727             Program_Login_ID,
4728             Program_Update_Date,
4729             Request_ID
4730            )
4731      SELECT AP_Payment_Hist_Dists_S.nextval,
4732             p_xla_event_rec.event_id,
4733             -1 * APHD.Amount,
4734             APHD.Pay_Dist_Lookup_Code,
4735             p_pay_hist_rec.Payment_History_ID,
4736             APHD.Invoice_Distribution_ID,
4737             p_inv_pay_rec.invoice_payment_id,
4738             -1 * APHD.Bank_Curr_Amount,
4739             -1 * APHD.Cleared_Base_Amount,
4740             -1 * APHD.Invoice_Dist_Amount,
4741             -1 * APHD.Invoice_Dist_Base_Amount,
4742             APHD.Invoice_Adjustment_Event_ID,
4743             -1 * APHD.Matured_Base_Amount,
4744             -1 * APHD.Paid_Base_Amount,
4745             'Y',
4746             APHD.Payment_Hist_Dist_ID,
4747             APHD.AWT_Related_ID,
4748             'N',
4749             APHD.Quantity_Variance,
4750             APHD.Invoice_Base_Qty_Variance,
4751             APHD.Amount_Variance,
4752             APHD.Invoice_Base_Amt_Variance,
4753             FND_GLOBAL.User_ID,
4754             SYSDATE,
4755             SYSDATE,
4756             FND_GLOBAL.User_ID,
4757             FND_GLOBAL.User_ID,
4758             FND_GLOBAL.Prog_Appl_ID,
4759             FND_GLOBAL.Conc_Program_ID,
4760             NULL,
4761             SYSDATE,
4762             FND_GLOBAL.Conc_Request_ID
4763      FROM   AP_Payment_Hist_Dists APHD,
4764             AP_Invoice_Payments_All AIP,
4765             AP_Invoice_Distributions_All AID
4766      WHERE  AIP.Invoice_Payment_ID = p_reversal_inv_pmt_id
4767      AND    AIP.Accounting_Event_ID = APHD.Accounting_Event_ID
4768      AND    AIP.Invoice_ID = AID.Invoice_ID
4769      AND    AID.Invoice_Distribution_ID = APHD.Invoice_Distribution_ID;
4770 
4771 
4772   ELSIF p_related_event_id IS NOT NULL THEN
4773 
4774 
4775      IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
4776          l_log_msg := 'Reversing based on related_event_id '||
4777                                              p_related_event_id;
4778          FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME || l_procedure_name, l_log_msg);
4779      END IF;
4780 
4781      -- Bug 5015973. We will insert the new invoice_payment_id only for the
4782      -- cancelled event.
4783      IF p_xla_event_rec.event_type_code IN ('PAYMENT CANCELLED',
4784                                             'REFUND CANCELLED') THEN
4785 
4786         INSERT INTO ap_payment_hist_dists
4787               (Payment_Hist_Dist_ID,
4788                Accounting_Event_ID,
4789                Amount,
4790                Pay_Dist_Lookup_Code,
4791                Payment_History_ID,
4792                Invoice_Distribution_ID,
4793                Invoice_Payment_ID,
4794                Bank_Curr_Amount,
4795                Cleared_Base_Amount,
4796                Invoice_Dist_Amount,
4797                Invoice_Dist_Base_Amount,
4798                Invoice_Adjustment_Event_ID,
4799                Matured_Base_Amount,
4800                Paid_Base_Amount,
4801                Reversal_Flag,
4802                Reversed_Pay_Hist_Dist_ID,
4803                AWT_Related_ID,
4804                PA_Addition_Flag,
4805                Quantity_Variance,
4806                Invoice_Base_Qty_Variance,
4807                Amount_Variance,
4808                Invoice_Base_Amt_Variance,
4809                Created_By,
4810                Creation_Date,
4811                Last_Update_Date,
4812                Last_Updated_By,
4813                Last_Update_Login,
4814                Program_Application_ID,
4815                Program_ID,
4816                Program_Login_ID,
4817                Program_Update_Date,
4818                Request_ID,
4819                Gain_Loss_Indicator --11681786
4820               )
4821         SELECT AP_Payment_Hist_Dists_S.nextval,
4822                p_xla_event_rec.event_id,
4823                -1 * APHD.Amount,
4824                APHD.Pay_Dist_Lookup_Code,
4825                p_pay_hist_rec.Payment_History_ID,
4826                APHD.Invoice_Distribution_ID,
4827                AIP.Invoice_Payment_ID,
4828                -1 * APHD.Bank_Curr_Amount,
4829                -1 * APHD.Cleared_Base_Amount,
4830                -1 * APHD.Invoice_Dist_Amount,
4831                -1 * APHD.Invoice_Dist_Base_Amount,
4832                APHD.Invoice_Adjustment_Event_ID,
4833                -1 * APHD.Matured_Base_Amount,
4834                -1 * APHD.Paid_Base_Amount,
4835                'Y',
4836                APHD.Payment_Hist_Dist_ID,
4837                APHD.AWT_Related_ID,
4838                'N',
4839                APHD.Quantity_Variance,
4840                APHD.Invoice_Base_Qty_Variance,
4841                APHD.Amount_Variance,
4842                APHD.Invoice_Base_Amt_Variance,
4843                FND_GLOBAL.User_ID,
4844                SYSDATE,
4845                SYSDATE,
4846                FND_GLOBAL.User_ID,
4847                FND_GLOBAL.User_ID,
4848                FND_GLOBAL.Prog_Appl_ID,
4849                FND_GLOBAL.Conc_Program_ID,
4850                NULL,
4851                SYSDATE,
4852                FND_GLOBAL.Conc_Request_ID,
4853                APHD.Gain_Loss_Indicator --11681786
4854         FROM   AP_Payment_Hist_Dists APHD,
4855                AP_Payment_History_All APH,
4856                AP_Invoice_Payments_All AIP,
4857                AP_Invoice_Distributions_All AID   -- 6804379
4858         WHERE  nvl(APH.Related_Event_ID, APH.Accounting_Event_ID) = p_related_event_id
4859         AND    APHD.Payment_History_ID = APH.Payment_History_ID
4860         AND    NVL(APHD.Reversal_Flag,'N') <> 'Y'
4861         AND    AID.Invoice_Distribution_ID = APHD.Invoice_Distribution_ID
4862 	AND    AIP.Reversal_inv_pmt_id = APHD.invoice_payment_id --Bug 6881085
4863         AND    AIP.Accounting_Event_ID = p_xla_event_rec.event_id
4864         AND    AIP.Check_ID = APH.Check_ID -- Bug 6856694
4865         AND    AIP.Invoice_ID = AID.Invoice_ID
4866         AND    NOT EXISTS (SELECT 'Reversal Payment Dists'
4867                            FROM   AP_Payment_Hist_Dists APHD1,
4868                                   AP_Invoice_Distributions_ALL AID1 --Bug11681786
4869                            WHERE  APHD1.Reversed_Pay_Hist_Dist_ID  = APHD.Payment_Hist_Dist_ID     -- Bug 6856694
4870                            AND    APHD1.Invoice_Distribution_ID  IN (AID1.Invoice_Distribution_id, APHD.Invoice_Distribution_ID)
4871                            AND    AID1.Parent_Reversal_ID (+) = APHD.Invoice_Distribution_ID );
4872 
4873      ELSE
4874         INSERT INTO ap_payment_hist_dists
4875               (Payment_Hist_Dist_ID,
4876                Accounting_Event_ID,
4877                Amount,
4878                Pay_Dist_Lookup_Code,
4879                Payment_History_ID,
4880                Invoice_Distribution_ID,
4881                Invoice_Payment_ID,
4882                Bank_Curr_Amount,
4883                Cleared_Base_Amount,
4884                Invoice_Dist_Amount,
4885                Invoice_Dist_Base_Amount,
4886                Invoice_Adjustment_Event_ID,
4887                Matured_Base_Amount,
4888                Paid_Base_Amount,
4889                Reversal_Flag,
4890                Reversed_Pay_Hist_Dist_ID,
4891                AWT_Related_ID,
4892                PA_Addition_Flag,
4893                Quantity_Variance,
4894                Invoice_Base_Qty_Variance,
4895                Amount_Variance,
4896                Invoice_Base_Amt_Variance,
4897                Created_By,
4898                Creation_Date,
4899                Last_Update_Date,
4900                Last_Updated_By,
4901                Last_Update_Login,
4902                Program_Application_ID,
4903                Program_ID,
4904                Program_Login_ID,
4905                Program_Update_Date,
4906                Request_ID
4907               )
4908         SELECT AP_Payment_Hist_Dists_S.nextval,
4909                p_xla_event_rec.event_id,
4910                -1 * APHD.Amount,
4911                APHD.Pay_Dist_Lookup_Code,
4912                p_pay_hist_rec.Payment_History_ID,
4913                APHD.Invoice_Distribution_ID,
4914                APHD.Invoice_Payment_ID,
4915                -1 * APHD.Bank_Curr_Amount,
4916                -1 * APHD.Cleared_Base_Amount,
4917                -1 * APHD.Invoice_Dist_Amount,
4918                -1 * APHD.Invoice_Dist_Base_Amount,
4919                APHD.Invoice_Adjustment_Event_ID,
4920                -1 * APHD.Matured_Base_Amount,
4921                -1 * APHD.Paid_Base_Amount,
4922                'Y',
4923                APHD.Payment_Hist_Dist_ID,
4924                APHD.AWT_Related_ID,
4925                'N',
4926                APHD.Quantity_Variance,
4927                APHD.Invoice_Base_Qty_Variance,
4928                APHD.Amount_Variance,
4929                APHD.Invoice_Base_Amt_Variance,
4930                FND_GLOBAL.User_ID,
4931                SYSDATE,
4932                SYSDATE,
4933                FND_GLOBAL.User_ID,
4934                FND_GLOBAL.User_ID,
4935                FND_GLOBAL.Prog_Appl_ID,
4936                FND_GLOBAL.Conc_Program_ID,
4937                NULL,
4938                SYSDATE,
4939                FND_GLOBAL.Conc_Request_ID
4940         FROM   AP_Payment_Hist_Dists APHD,
4941                AP_Payment_History_All APH -- 6804379
4942         WHERE  APH.Check_ID = p_xla_event_rec.Source_ID_Int_1 -- Bug 6856694
4943         AND    NVL(APH.Related_Event_ID, APH.Accounting_Event_ID) = p_related_event_id
4944         AND    APHD.Payment_History_ID = APH.Payment_History_ID
4945         AND    NVL(APHD.Reversal_Flag,'N') <> 'Y'
4946         AND    NOT EXISTS (SELECT 'Reversal Payment Dists'
4947                            FROM   AP_Payment_Hist_Dists APHD1,
4948                                   AP_Invoice_Distributions_ALL AID1  --Bug11681786
4949                            WHERE  APHD1.Reversed_Pay_Hist_Dist_ID  = APHD.Payment_Hist_Dist_ID     -- Bug 6856694
4950                            AND    APHD1.Invoice_Distribution_ID  IN (AID1.Invoice_Distribution_id, APHD.Invoice_Distribution_ID)
4951                            AND    AID1.Parent_Reversal_ID (+) = APHD.Invoice_Distribution_ID );
4952 
4953      END IF;
4954 
4955   ELSE
4956 
4957      IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
4958          l_log_msg := 'Reversing based on invoice_distribution_id '||
4959                                              p_invoice_dist_id;
4960          FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME || l_procedure_name, l_log_msg);
4961      END IF;
4962 
4963      INSERT INTO ap_payment_hist_dists
4964            (Payment_Hist_Dist_ID,
4965             Accounting_Event_ID,
4966             Amount,
4967             Pay_Dist_Lookup_Code,
4968             Payment_History_ID,
4969             Invoice_Distribution_ID,
4970             Invoice_Payment_ID,
4971             Bank_Curr_Amount,
4972             Cleared_Base_Amount,
4973             Invoice_Dist_Amount,
4974             Invoice_Dist_Base_Amount,
4975             Invoice_Adjustment_Event_ID,
4976             Matured_Base_Amount,
4977             Paid_Base_Amount,
4978             Reversal_Flag,
4979             Reversed_Pay_Hist_Dist_ID,
4980             AWT_Related_ID,
4981             PA_Addition_Flag,
4982             Quantity_Variance,
4983             Invoice_Base_Qty_Variance,
4984             Amount_Variance,
4985             Invoice_Base_Amt_Variance,
4986             Created_By,
4987             Creation_Date,
4988             Last_Update_Date,
4989             Last_Updated_By,
4990             Last_Update_Login,
4991             Program_Application_ID,
4992             Program_ID,
4993             Program_Login_ID,
4994             Program_Update_Date,
4995             Request_ID
4996            )
4997      SELECT AP_Payment_Hist_Dists_S.nextval,
4998             p_xla_event_rec.event_id,
4999             -1 * APHD.Amount,
5000             APHD.Pay_Dist_Lookup_Code,
5001             p_pay_hist_rec.Payment_History_ID,
5002             p_inv_dist_rec.Invoice_Distribution_ID, -- Bug 6887295
5003             APHD.Invoice_Payment_ID,
5004             -1 * APHD.Bank_Curr_Amount,
5005             -1 * APHD.Cleared_Base_Amount,
5006             -1 * APHD.Invoice_Dist_Amount,
5007             -1 * APHD.Invoice_Dist_Base_Amount,
5008             p_pay_hist_rec.Invoice_Adjustment_Event_ID,
5009             -1 * APHD.Matured_Base_Amount,
5010             -1 * APHD.Paid_Base_Amount,
5011             'Y',
5012             APHD.Payment_Hist_Dist_ID,
5013             APHD.AWT_Related_ID,
5014             'N',
5015             APHD.Quantity_Variance,
5016             APHD.Invoice_Base_Qty_Variance,
5017             APHD.Amount_Variance,
5018             APHD.Invoice_Base_Amt_Variance,
5019             FND_GLOBAL.User_ID,
5020             SYSDATE,
5021             SYSDATE,
5022             FND_GLOBAL.User_ID,
5023             FND_GLOBAL.User_ID,
5024             FND_GLOBAL.Prog_Appl_ID,
5025             FND_GLOBAL.Conc_Program_ID,
5026             NULL,
5027             SYSDATE,
5028             FND_GLOBAL.Conc_Request_ID
5029      FROM   AP_Payment_Hist_Dists APHD,
5030             AP_Payment_History_All APH
5031      WHERE  APHD.Invoice_Distribution_ID = p_invoice_dist_id
5032      AND    APHD.Payment_History_ID = APH.Payment_History_ID
5033      AND    APH.Check_ID = p_xla_event_rec.source_id_int_1 -- Bug 6887295
5034      AND    APH.Related_Event_ID = p_pay_hist_rec.related_event_id
5035      AND    APHD.invoice_payment_id = p_inv_pay_rec.invoice_payment_id ; -- Bug 13107915
5036 
5037   END IF;
5038 
5039 
5040   IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
5041       l_log_msg := 'Done reversing the payment dists';
5042       FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME || l_procedure_name, l_log_msg);
5043   END IF;
5044 
5045 
5046   -- Bug 6839052. Payment Cancellation cannot account for upgraded payments
5047   -- since the amounts are not populated in the pay dists table or in the
5048   -- xla distribution links table and XLA depends on these amounts for
5049   -- creating reversal accounting.
5050   --bug 10336668
5051   IF p_xla_event_rec.event_type_code IN
5052                  ('PAYMENT CANCELLED','REFUND CANCELLED',
5053                   'PAYMENT MATURITY REVERSED', 'PAYMENT UNCLEARED',
5054                   'MANUAL PAYMENT ADJUSTED', 'MANUAL REFUND ADJUSTED') THEN
5055   -- Bug 8708433 If payment Creation and Payment cleared are accounted in 11i
5056   -- and upgraded, then we need to do the repopulation for the accounting
5057   -- entries of these events also, when we account the payment cancellation in R12
5058   -- As such I have called the api Upg_Dist_Links_Insert in a loop so that we can
5059   -- reinsert the dist links for the other events as well
5060   -- If the event_type_code is other than cancellation, then the same logic as before
5061   -- applies
5062 
5063      IF p_xla_event_rec.event_type_code IN ('PAYMENT CANCELLED','REFUND CANCELLED') THEN
5064        FOR aph_events in (
5065          SELECT Payment_History_ID,
5066                 Accounting_Event_ID,
5067                 NVL(Historical_Flag, 'N') Historical_Flag,
5068                 XAH.upg_batch_id
5069            FROM ap_payment_history_all APH,
5070                 xla_ae_headers XAH,
5071                 ap_system_parameters_all ASP
5072           WHERE  APH.Check_ID = p_xla_event_rec.source_id_int_1
5073             -- AND    APH.rev_pmt_hist_id is null   bug9448974
5074             AND    APH.Posted_Flag = 'Y'
5075             AND    XAH.application_id = 200
5076             AND    XAH.event_id = APH.accounting_event_id
5077             AND    ASP.org_id = APH.org_id
5078             AND    ASP.set_of_books_id = XAH.ledger_id)
5079        LOOP
5080 
5081        IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
5082            l_log_msg := 'Inside loop for upgrading dist links for '||
5083 	                'PAYMENT CANCELLED,REFUND CANCELLED ';
5084            FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME || l_procedure_name, l_log_msg);
5085        END IF;
5086 
5087          IF (aph_events.Historical_Flag = 'Y' AND
5088              aph_events.upg_batch_id IS NOT NULL AND
5089              aph_events.upg_batch_id <> -9999) THEN
5090            IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
5091              l_log_msg := 'Calling Upg_Dist_Links_Insert for payment_history_id '||
5092 	                   aph_events.payment_history_id;
5093              FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME || l_procedure_name, l_log_msg);
5094            END IF;
5095 
5096 
5097            -- We should not be recreating the distribution links for the historical
5098            -- event which has already been reversed in R12, say a PAYMENT CLEARING
5099            -- event (historical) for which unclearing has already been Accounted in R12
5100            -- (bug9492684)
5101            BEGIN
5102              l_reversed_in_R12 := 'N';
5103 
5104              SELECT 'Y'
5105                INTO l_reversed_in_R12
5106                FROM dual
5107               WHERE EXISTS
5108                     (SELECT 'reversed in R12'
5109                        FROM ap_payment_history_all aph,
5110                             xla_ae_headers xah,
5111                             ap_system_parameters_all asp
5112                       WHERE aph.rev_pmt_hist_id = aph_events.payment_history_id
5113                         AND xah.application_id = 200
5114                         AND aph.accounting_event_id = xah.event_id
5115                         AND aph.posted_flag = 'Y'
5116                         AND xah.accounting_entry_status_code = 'F'
5117                         AND xah.ledger_id = asp.set_of_books_id
5118                         AND aph.org_id = asp.org_id --bug13814470
5119                         AND (xah.upg_batch_id IS NULL OR
5120                              xah.upg_batch_id = -9999));
5121 
5122            EXCEPTION
5123              WHEN OTHERS THEN
5124                l_reversed_in_R12 := 'N';
5125 
5126            END;
5127 
5128            IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
5129              l_log_msg := 'Event reversed in R12 already '||l_reversed_in_R12;
5130              FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME || l_procedure_name, l_log_msg);
5131            END IF;
5132 
5133            IF l_reversed_in_R12 = 'N' THEN
5134 
5135    	     Upg_Dist_Links_Insert
5136                     (p_xla_event_rec,
5137                      aph_events.payment_history_id,
5138                      aph_events.accounting_event_id,
5139                      l_curr_calling_sequence);
5140            END IF;
5141 
5142 	   IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
5143                l_log_msg := 'Procedure Upg_Dist_Link_Insert complete';
5144                FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME || l_procedure_name, l_log_msg);
5145            END IF;
5146 
5147          END IF;
5148        END LOOP;
5149      ELSE
5150   -- Bug 8708433 If event is any other than cancellation, then the same logic as before
5151   --- applies
5152   --bug 10336668
5153        IF p_xla_event_rec.event_type_code = 'MANUAL PAYMENT ADJUSTED' THEN
5154          l_transaction_type := 'PAYMENT CREATED';
5155        ELSIF p_xla_event_rec.event_type_code = 'MANUAL REFUND ADJUSTED' THEN
5156          l_transaction_type := 'REFUND RECORDED';
5157        ELSIF p_xla_event_rec.event_type_code = 'PAYMENT UNCLEARED' THEN
5158          l_transaction_type := 'PAYMENT CLEARING';
5159        ELSIF p_xla_event_rec.event_type_code = 'PAYMENT MATURITY REVERSED' THEN
5160          l_transaction_type := 'PAYMENT MATURITY';
5161        END IF;
5162 
5163        IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
5164            l_log_msg := 'Transaction Type based on the event type is '||
5165                                                l_transaction_type;
5166            FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME || l_procedure_name, l_log_msg);
5167        END IF;
5168 
5169        BEGIN
5170        -- bug8911872
5171          SELECT Payment_History_ID,
5172                 Accounting_Event_ID,
5173                 NVL(Historical_Flag, 'N'),
5174                 XAH.upg_batch_id
5175            INTO l_payment_history_id,
5176                 l_accounting_event_id,
5177                 l_historical_flag,
5178                 l_upg_batch_id
5179            FROM ap_payment_history_all APH,
5180                 xla_ae_headers XAH,
5181                 ap_system_parameters_all ASP
5182           WHERE APH.Check_ID = p_xla_event_rec.source_id_int_1
5183             AND APH.Transaction_Type = l_transaction_type
5184             AND APH.payment_history_id =
5185                         DECODE(l_transaction_type,
5186                                'PAYMENT CLEARING', p_pay_hist_rec.rev_pmt_hist_id,
5187                                'PAYMENT MATURITY', p_pay_hist_rec.rev_pmt_hist_id,
5188                                 APH.payment_history_id)
5189             AND APH.Posted_Flag = 'Y'
5190             AND XAH.application_id = 200
5191             AND XAH.event_id = APH.accounting_event_id
5192             AND ASP.org_id = APH.org_id
5193             AND ASP.set_of_books_id = XAH.ledger_id;
5194 
5195          IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
5196              l_log_msg := 'Accounting Event ID of the related event '||
5197                                                  l_accounting_event_id;
5198              FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME || l_procedure_name, l_log_msg);
5199          END IF;
5200 
5201          IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
5202              l_log_msg := 'Historical Flag of the related event '||
5203                                                l_historical_flag;
5204              FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME || l_procedure_name, l_log_msg);
5205          END IF;
5206 
5207          IF (l_historical_flag = 'Y' AND
5208              l_upg_batch_id IS NOT NULL AND
5209              l_upg_batch_id <> -9999) THEN
5210 
5211            IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
5212                l_log_msg := 'Calling procedure Upg_Dist_Link_Insert';
5213                FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME || l_procedure_name, l_log_msg);
5214            END IF;
5215 
5216            Upg_Dist_Links_Insert
5217                     (p_xla_event_rec,
5218                      l_payment_history_id,
5219                      l_accounting_event_id,
5220                      l_curr_calling_sequence);
5221            IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
5222                l_log_msg := 'Procedure Upg_Dist_Link_Insert complete';
5223                FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME || l_procedure_name, l_log_msg);
5224            END IF;
5225          END IF;
5226 
5227        EXCEPTION
5228          WHEN others THEN
5229            IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
5230                l_log_msg := 'Procedure Pay_Dist_Reverse raised exceptions';
5231                FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME || l_procedure_name, l_log_msg);
5232            END IF;
5233            NULL;
5234        END;
5235     END IF;
5236   END IF;
5237 
5238   -- Logging Infra: Procedure level
5239   IF (G_LEVEL_PROCEDURE >= G_CURRENT_RUNTIME_LEVEL ) THEN
5240       l_log_msg := 'End of procedure '|| l_procedure_name;
5241       FND_LOG.STRING(G_LEVEL_PROCEDURE, G_MODULE_NAME||l_procedure_name||'.end', l_log_msg);
5242   END IF;
5243 
5244 
5245 EXCEPTION
5246   WHEN OTHERS THEN
5247     IF (SQLCODE <> -20001) THEN
5248       FND_MESSAGE.SET_NAME('SQLAP','AP_DEBUG');
5249       FND_MESSAGE.SET_TOKEN('ERROR',SQLERRM);
5250       FND_MESSAGE.SET_TOKEN('CALLING_SEQUENCE', l_curr_calling_sequence);
5251     END IF;
5252     APP_EXCEPTION.RAISE_EXCEPTION;
5253 
5254 END Pay_Dist_Reverse;
5255 
5256 
5257 ----------------------------------------------------------------------------------
5258 -- PROCEDURE Pay_Dist_Insert
5259 -- This procedure is used to insert the payment hist distributions into the
5260 -- ap_payment_hist_dists table
5261 ----------------------------------------------------------------------------------
5262 
5263 PROCEDURE Pay_Dist_Insert
5264      (P_PD_Rec            IN     AP_PAYMENT_HIST_DISTS%ROWTYPE
5265      ,P_Calling_Sequence  IN     VARCHAR2
5266      ) IS
5267 
5268   l_curr_calling_sequence      VARCHAR2(2000);
5269 
5270   -- Logging Infra:
5271   l_procedure_name CONSTANT VARCHAR2(30) := 'Pay_Dist_Insert';
5272   l_log_msg        FND_LOG_MESSAGES.MESSAGE_TEXT%TYPE;
5273 
5274 
5275 BEGIN
5276 
5277   l_curr_calling_sequence := 'AP_ACCTG_PAY_DIST_PKG.Pay_Dist_Insert<- ' ||
5278                                      P_Calling_Sequence;
5279 
5280 
5281   -- Logging Infra: Procedure level
5282   IF (G_LEVEL_PROCEDURE >= G_CURRENT_RUNTIME_LEVEL ) THEN
5283       l_log_msg := 'Begin of procedure '|| l_procedure_name;
5284       FND_LOG.STRING(G_LEVEL_PROCEDURE, G_MODULE_NAME||l_procedure_name||'.begin', l_log_msg);
5285   END IF;
5286 
5287 
5288   INSERT INTO AP_Payment_Hist_Dists
5289         (Payment_Hist_Dist_ID,
5290          Accounting_Event_ID,
5291          Amount,
5292          Pay_Dist_Lookup_Code,
5293          Payment_History_ID,
5294          Invoice_Distribution_ID,
5295          Invoice_Payment_ID,
5296          Bank_Curr_Amount,
5297          Cleared_Base_Amount,
5298          Invoice_Dist_Amount,
5299          Invoice_Dist_Base_Amount,
5300          Invoice_Adjustment_Event_ID,
5301          Matured_Base_Amount,
5302          Paid_Base_Amount,
5303          Reversal_Flag,
5304          Reversed_Pay_Hist_Dist_ID,
5305          AWT_Related_ID,
5306          PA_Addition_Flag,
5307          Quantity_Variance,
5308          Invoice_Base_Qty_Variance,
5309          Amount_Variance,
5310          Invoice_Base_Amt_Variance,
5311          Created_By,
5312          Creation_Date,
5313          Last_Update_Date,
5314          Last_Updated_By,
5315          Last_Update_Login,
5316          Program_Application_ID,
5317          Program_ID,
5318          Program_Login_ID,
5319          Program_Update_Date,
5320          Request_ID
5321          )
5322   VALUES (AP_Payment_Hist_Dists_S.nextval,
5323          P_PD_Rec.Accounting_Event_ID,
5324          P_PD_Rec.Amount,
5325          P_PD_Rec.Pay_Dist_Lookup_Code,
5326          P_PD_Rec.Payment_History_ID,
5327          P_PD_Rec.Invoice_Distribution_ID,
5328          P_PD_Rec.Invoice_Payment_ID,
5329          P_PD_Rec.Bank_Curr_Amount,
5330          P_PD_Rec.Cleared_Base_Amount,
5331          P_PD_Rec.Invoice_Dist_Amount,
5332          P_PD_Rec.Invoice_Dist_Base_Amount,
5333          P_PD_Rec.Invoice_Adjustment_Event_ID,
5334          P_PD_Rec.Matured_Base_Amount,
5335          P_PD_Rec.Paid_Base_Amount,
5336          P_PD_Rec.Reversal_Flag,
5337          P_PD_Rec.Reversed_Pay_Hist_Dist_ID,
5338          P_PD_Rec.AWT_Related_ID,
5339          'N',
5340          P_PD_Rec.Quantity_Variance,
5341          P_PD_Rec.Invoice_Base_Qty_Variance,
5342          P_PD_Rec.Amount_Variance,
5343          P_PD_Rec.Invoice_Base_Amt_Variance,
5344          FND_GLOBAL.User_ID,
5345          SYSDATE,
5346          SYSDATE,
5347          FND_GLOBAL.User_ID,
5348          FND_GLOBAL.User_ID,
5349          FND_GLOBAL.Prog_Appl_ID,
5350          FND_GLOBAL.Conc_Program_ID,
5351          NULL,
5352          SYSDATE,
5353          FND_GLOBAL.Conc_Request_ID
5354          );
5355 
5356   -- Logging Infra: Procedure level
5357   IF (G_LEVEL_PROCEDURE >= G_CURRENT_RUNTIME_LEVEL ) THEN
5358       l_log_msg := 'End of procedure '|| l_procedure_name;
5359       FND_LOG.STRING(G_LEVEL_PROCEDURE, G_MODULE_NAME||l_procedure_name||'.end', l_log_msg);
5360   END IF;
5361 
5362 
5363 EXCEPTION
5364   WHEN OTHERS THEN
5365     IF (SQLCODE <> -20001) THEN
5366       FND_MESSAGE.SET_NAME('SQLAP','AP_DEBUG');
5367       FND_MESSAGE.SET_TOKEN('ERROR',SQLERRM);
5368       FND_MESSAGE.SET_TOKEN('CALLING_SEQUENCE', l_curr_calling_sequence);
5369     END IF;
5370     APP_EXCEPTION.RAISE_EXCEPTION;
5371 
5372 END Pay_Dist_Insert;
5373 
5374 
5375 
5376 -- Bug 6839052. Added this procedure to delete and recreate the distribution
5377 -- links by prorating the line amount to all the payment distributions
5378 -- so that the transaction and distribution reversals use these new
5379 -- distribution links with the right amounts
5380 ----------------------------------------------------------------------------------
5381 -- PROCEDURE Upg_Dist_Links_Insert
5382 -- This procedure is used to insert the payment hist distributions into the
5383 -- ap_payment_hist_dists table
5384 ----------------------------------------------------------------------------------
5385 
5386 PROCEDURE Upg_Dist_Links_Insert
5387            (p_xla_event_rec       IN  ap_accounting_pay_pkg.r_xla_event_info
5388            ,p_payment_history_id  IN  NUMBER
5389            ,p_accounting_event_id IN  NUMBER
5390            ,p_calling_sequence    IN  VARCHAR2
5391            ) IS
5392 
5393   l_curr_calling_sequence      VARCHAR2(2000);
5394 
5395   -- Logging Infra:
5396   l_procedure_name CONSTANT VARCHAR2(30) := 'Upg_Dist_Links_Insert';
5397   l_log_msg        FND_LOG_MESSAGES.MESSAGE_TEXT%TYPE;
5398 
5399 
5400 BEGIN
5401 
5402   l_curr_calling_sequence := 'AP_ACCTG_PAY_DIST_PKG.Upg_Dist_Links_Insert<- ' ||
5403                                      P_Calling_Sequence;
5404 
5405 
5406   -- Logging Infra: Procedure level
5407   IF (G_LEVEL_PROCEDURE >= G_CURRENT_RUNTIME_LEVEL ) THEN
5408       l_log_msg := 'Begin of procedure '|| l_procedure_name;
5409       FND_LOG.STRING(G_LEVEL_PROCEDURE, G_MODULE_NAME||l_procedure_name||
5410                       '.begin', l_log_msg);
5411   END IF;
5412 
5413   IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
5414       l_log_msg := 'Deleting xla_distribution_links';
5415       FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME || l_procedure_name, l_log_msg);
5416   END IF;
5417 
5418   DELETE FROM xla_distribution_links
5419   WHERE  application_id = 200
5420   AND    ae_header_id IN
5421               (SELECT ae_header_id
5422                FROM   xla_ae_headers aeh,
5423                       ap_payment_history_all aph
5424                WHERE  aeh.event_id = aph.accounting_event_id
5425                AND    aph.accounting_event_id = p_accounting_event_id
5426                AND    aph.check_id = p_xla_event_rec.source_id_int_1
5427                AND    aph.historical_flag = 'Y'
5428                AND    aeh.upg_batch_id IS NOT NULL)
5429   AND    upg_batch_id IS NOT NULL;
5430 
5431 
5432   IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
5433       l_log_msg := 'Inserting xla_distribution_links for event '||
5434                                p_accounting_event_id;
5435       FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME || l_procedure_name, l_log_msg);
5436   END IF;
5437 
5438 -- Bug 8708433 This insert is for primary ledger id , hence the new join condition
5439 -- AND    AEH.ledger_id = ASP.Set_Of_Books_ID
5440 -- In this insert, we are prorating the amounts on the basis of the table
5441 -- ap_invoice_distributions_all
5442 
5443   INSERT INTO XLA_Distribution_Links t1
5444         (APPLICATION_ID,
5445          EVENT_ID,
5446          AE_HEADER_ID,
5447          AE_LINE_NUM,
5448          SOURCE_DISTRIBUTION_TYPE,
5449          SOURCE_DISTRIBUTION_ID_NUM_1,
5450          UNROUNDED_ENTERED_CR,
5451          UNROUNDED_ENTERED_DR,
5452          UNROUNDED_ACCOUNTED_CR,
5453          UNROUNDED_ACCOUNTED_DR,
5454          REF_AE_HEADER_ID,
5455          ACCOUNTING_LINE_CODE,
5456          ACCOUNTING_LINE_TYPE_CODE,
5457          MERGE_DUPLICATE_CODE,
5458          TEMP_LINE_NUM,
5459          REF_EVENT_ID,
5460          UPG_BATCH_ID,
5461          LINE_DEFINITION_OWNER_CODE,
5462          LINE_DEFINITION_CODE,
5463          EVENT_CLASS_CODE,
5464          EVENT_TYPE_CODE,
5465 	 --- changed for bug#7293021 start
5466 	 APPLIED_TO_APPLICATION_ID,
5467          APPLIED_TO_ENTITY_ID,
5468          APPLIED_TO_DIST_ID_NUM_1,
5469          APPLIED_TO_DISTRIBUTION_TYPE
5470 	 --- changed for bug#7293021 end
5471 	 )
5472   SELECT 200,
5473          Accounting_Event_ID,
5474          AE_Header_ID,
5475          AE_Line_Num,
5476          'AP_PMT_DIST',
5477          Source_Distribution_ID_Num_1,
5478          --Bug 12619564 start
5479          (
5480          CASE
5481          WHEN (Line_Entered_cr is not null
5482                   and sign(DECODE( Rank_Num, Dist_Count,( Line_Entered_Amt - Sum_Entered_Amt ) + Entered_Amt, Entered_Amt )) <> -1)
5483               or (Line_Entered_dr is not null
5484                   and sign(DECODE( Rank_Num, Dist_Count,( Line_Entered_Amt - Sum_Entered_Amt ) + Entered_Amt, Entered_Amt )) =-1)
5485          THEN abs(DECODE( Rank_Num, Dist_Count,( Line_Entered_Amt - Sum_Entered_Amt ) + Entered_Amt, Entered_Amt ))
5486          ELSE NULL
5487          END )
5488          ,(
5489          CASE
5490          WHEN (Line_Entered_dr is not null
5491                   and sign(DECODE( Rank_Num, Dist_Count,( Line_Entered_Amt - Sum_Entered_Amt ) + Entered_Amt, Entered_Amt )) <> -1)
5492               or (Line_Entered_cr is not null
5493                   and sign(DECODE( Rank_Num, Dist_Count,( Line_Entered_Amt - Sum_Entered_Amt ) + Entered_Amt, Entered_Amt )) =-1)
5494          THEN abs(DECODE( Rank_Num, Dist_Count,( Line_Entered_Amt - Sum_Entered_Amt ) + Entered_Amt, Entered_Amt ))
5495          ELSE NULL
5496          END )
5497          ,(
5498          CASE
5499          WHEN (Line_Accounted_cr is not null
5500                   and sign(DECODE( Rank_Num, Dist_Count,( Line_Accounted_Amt - Sum_Accounted_Amt ) + Accounted_Amt, Accounted_Amt ))<> -1)
5501               or (Line_Accounted_dr is not null
5502                   and sign(DECODE( Rank_Num, Dist_Count,( Line_Accounted_Amt - Sum_Accounted_Amt ) + Accounted_Amt, Accounted_Amt ))=-1)
5503          THEN abs(DECODE( Rank_Num, Dist_Count,( Line_Accounted_Amt - Sum_Accounted_Amt ) + Accounted_Amt, Accounted_Amt ))
5504          ELSE NULL
5505          END )
5506          ,(
5507          CASE
5508          WHEN (Line_Accounted_dr is not null
5509                   and sign(DECODE( Rank_Num, Dist_Count,( Line_Accounted_Amt - Sum_Accounted_Amt ) + Accounted_Amt, Accounted_Amt ))<> -1)
5510               or (Line_Accounted_cr is not null
5511                   and sign(DECODE( Rank_Num, Dist_Count,( Line_Accounted_Amt - Sum_Accounted_Amt ) + Accounted_Amt, Accounted_Amt ))=-1)
5512          THEN abs(DECODE( Rank_Num, Dist_Count,( Line_Accounted_Amt - Sum_Accounted_Amt ) + Accounted_Amt, Accounted_Amt ))
5513          ELSE NULL
5514          END ),
5515          --Bug 12619564 end
5516          Ref_AE_Header_ID,
5517         (CASE
5518              WHEN Payment_Type_Flag = 'R' THEN
5519                   DECODE(Accounting_Class_Code,
5520                          'CASH_CLEARING', 'AP_CASH_CLEAR_REF', 'CASH', 'AP_CASH_REF',
5521                          'ACCRUAL', 'AP_ACCRUAL_REF', 'DISCOUNT', 'AP_DISCOUNT_ACCR_REF',
5522                          'EXCHANGE_RATE_VARIANCE', 'AP_EX_RATE_VAR_REF',
5523                          'ROUNDING', 'AP_FINAL_PMT_ROUNDING_REF',
5524                          'GAIN', 'AP_GAIN_REF', 'FREIGHT', 'AP_FREIGHT_EXPENSE_REF',
5525                          'IPV', 'AP_INV_PRICE_VAR_REF', 'ITEM EXPENSE', 'AP_ITEM_EXPENSE_REF',
5526                          'LOSS', 'AP_LOSS_REF', 'LIABILITY', 'AP_LIAB_REF',
5527                          'NRTAX', 'AP_NON_RECOV_TAX_REF',
5528                          'PREPAID_EXPENSE', 'AP_PREPAID_EXP_REF', 'RTAX','AP_RECOV_TAX_REF',
5529                          'AWT', 'AP_WITHHOLD_TAX_ACCR_REF')
5530              WHEN Transaction_Type = 'PAYMENT MATURITY' THEN
5531                   DECODE(Accounting_Class_Code, 'FUTURE_DATED_PMT', 'AP_FUTURE_DATED_PMT_MAT',
5532                          'CASH_CLEARING', 'AP_CASH_CLEAR_PMT_MAT',
5533                          'CASH', 'AP_CASH_PMT_MAT', 'GAIN', 'AP_GAIN_PMT_MAT',
5534                          'LOSS', 'AP_LOSS_PMT_MAT', 'ROUNDING', 'AP_FUTURE_PMT_ROUNDING_MAT')
5535              WHEN Transaction_Type IN ('PAYMENT CREATED', 'PAYMENT CANCELLED') THEN
5536                   DECODE(Accounting_Class_Code, 'FUTURE_DATED_PMT', 'AP_FUTURE_DATED_PMT',
5537                          'CASH_CLEARING', 'AP_CASH_CLEAR_PMT', 'CASH', 'AP_CASH_PMT',
5538                          'ACCRUAL', 'AP_ACCRUAL_PMT', 'DISCOUNT', 'AP_DISCOUNT_ACCR_PMT',
5539                          'EXCHANGE_RATE_VARIANCE', 'AP_EX_RATE_VAR_PMT',
5540                          'ROUNDING', 'AP_FINAL_PMT_ROUNDING_PMT',
5541                          'GAIN', 'AP_GAIN_PMT', 'FREIGHT', 'AP_FREIGHT_EXPENSE_PMT',
5542                          'IPV', 'AP_INV_PRICE_VAR_PMT', 'ITEM EXPENSE', 'AP_ITEM_EXPENSE_PMT',
5543                          'LOSS', 'AP_LOSS_PMT', 'LIABILITY', 'AP_LIAB_PMT',
5544                          'NRTAX', 'AP_NON_RECOV_TAX_PMT',
5545                          'PREPAID_EXPENSE', 'AP_PREPAID_EXP_PMT', 'RTAX','AP_RECOV_TAX_PMT',
5546                          'AWT', 'AP_WITHHOLD_TAX_ACCR_PMT')
5547              WHEN Transaction_Type IN ('PAYMENT CLEARING', 'PAYMENT UNCLEARING') THEN
5548                   DECODE(Accounting_Class_Code, 'BANK_CHG', 'AP_BANK_CHARGES_CLEAR',
5549                          'CASH_CLEARING', 'AP_CASH_CLEAR_CLEAR', 'CASH', 'AP_CASH_CLEAR',
5550                          'ACCRUAL', 'AP_ACCRUAL_CLEAR', 'DISCOUNT', 'AP_DISCOUNT_ACCR_CLEAR',
5551                          'EXCHANGE_RATE_VARIANCE', 'AP_EX_RATE_VAR_CLEAR',
5552                          'BANK_ERROR', 'AP_BANK_ERROR_CLEAR',
5553                          'ROUNDING', 'AP_FINAL_PMT_ROUNDING_CLEAR',
5554                          'GAIN', 'AP_GAIN_PMT_CLEAR', 'FREIGHT', 'AP_FREIGHT_EXPENSE_CLEAR',
5555                          'IPV', 'AP_INV_PRICE_VAR_CLEAR', 'ITEM EXPENSE', 'AP_ITEM_EXPENSE_CLEAR',
5556                          'LOSS', 'AP_LOSS_PMT_CLEAR', 'LIABILITY', 'AP_LIAB_CLEAR',
5557                          'NRTAX', 'AP_NON_RECOV_TAX_CLEAR', 'RTAX','AP_RECOV_TAX_CLEAR',
5558                          'AWT', 'AP_WITHHOLD_TAX_ACCR_CLEAR')
5559          END),
5560          'S',
5561          'A',  --changed by abhsaxen for bug#9073033
5562          Row_Number() OVER (PARTITION BY AE_Header_ID
5563                       ORDER BY AE_Line_Num,
5564                                Invoice_Distribution_ID,
5565                                Invoice_Payment_ID,
5566                                Payment_History_ID) Temp_Line_Num,
5567          Accounting_Event_ID,
5568          Upg_Batch_ID,
5569          'S',
5570          'ACCRUAL_PAYMENTS_ALL',
5571          'PAYMENTS',
5572          'PAYMENTS_ALL',
5573          -- changed for bug#7293021 start
5574          DECODE(Accounting_Class_Code, 'LIABILITY' ,200, null),
5575          DECODE(Accounting_Class_Code, 'LIABILITY' ,aid_Entity_id, null),
5576          DECODE(Accounting_Class_Code, 'LIABILITY' ,Invoice_Distribution_ID, null),
5577          'AP_INV_DIST'
5578          -- changed for bug#7293021 end
5579   FROM (
5580   SELECT Accounting_Event_ID,
5581          AE_Header_ID,
5582          AE_Line_Num,
5583          Line_Entered_Cr,
5584          Line_Entered_Dr,
5585          Line_Accounted_Cr,
5586          Line_Accounted_Dr,
5587          Invoice_Distribution_ID,
5588          Invoice_Payment_ID,
5589          Payment_History_ID,
5590          Upg_Batch_ID,
5591          Base_Currency_Code,
5592          Source_Distribution_ID_Num_1,
5593          Line_Entered_Amt,
5594          Line_Accounted_Amt,
5595          DECODE(FC.Minimum_Accountable_Unit, NULL,
5596             ROUND((Line_Accounted_Amt * Dist_Base_Amount
5597                   / DECODE(PDivisor_Acct_Amt, 0, 1, PDivisor_Acct_Amt)),
5598               FC.Precision),
5599             ROUND((Line_Accounted_Amt * Dist_Base_Amount
5600                   / DECODE(PDivisor_Acct_Amt, 0, 1, PDivisor_Acct_Amt))
5601               /FC.Minimum_Accountable_Unit) * FC.Minimum_Accountable_Unit) Accounted_Amt,
5602          DECODE(FC.Minimum_Accountable_Unit, NULL,
5603             ROUND((Line_Entered_Amt * Dist_Amount
5604                   / DECODE(PDivisor_Ent_Amt, 0 ,1, PDivisor_Ent_Amt)), FC.Precision),
5605             ROUND((Line_Entered_Amt * Dist_Amount
5606                   / DECODE(PDivisor_Acct_Amt, 0 ,1, PDivisor_Ent_Amt))
5607               /FC.Minimum_Accountable_Unit) * FC.Minimum_Accountable_Unit) Entered_Amt,
5608          Dist_Count,
5609          Rank_Num,
5610          SUM(DECODE(FC.Minimum_Accountable_Unit, NULL,
5611             ROUND((Line_Accounted_Amt * Dist_Base_Amount
5612                    / DECODE(PDivisor_Acct_Amt, 0, 1, PDivisor_Acct_Amt)),
5613                    FC.Precision),
5614             ROUND((Line_Accounted_Amt * Dist_Base_Amount
5615                    / DECODE(PDivisor_Acct_Amt, 0, 1, PDivisor_Acct_Amt))
5616               /FC.Minimum_Accountable_Unit) * FC.Minimum_Accountable_Unit))
5617             OVER (PARTITION BY Check_ID, Part_Key1, Part_Key2, AE_Line_Num)
5618                  Sum_Accounted_Amt,
5619          SUM(DECODE(FC.Minimum_Accountable_Unit, NULL,
5620               ROUND((Line_Entered_Amt * Dist_Amount
5621                   / DECODE(PDivisor_Ent_Amt, 0 ,1, PDivisor_Ent_Amt)), FC.Precision),
5622               ROUND((Line_Entered_Amt * Dist_Amount
5623                   / DECODE(PDivisor_Ent_Amt, 0 ,1, PDivisor_Ent_Amt))
5624                /FC.Minimum_Accountable_Unit) * FC.Minimum_Accountable_Unit))
5625             OVER (PARTITION BY Check_ID, Part_Key1, Part_Key2, AE_Line_Num) Sum_Entered_Amt,
5626          Ref_AE_Header_ID,
5627          Payment_Type_Flag,
5628          Transaction_Type,
5629          Accounting_Class_Code,
5630         aid_Entity_id  -- changed for bug#7293021
5631   FROM (
5632   SELECT AC.Check_ID Check_ID,
5633          AEH.Event_ID Accounting_Event_ID,
5634          AEH.AE_Header_ID AE_Header_ID,
5635          AEL.AE_Line_Num AE_Line_Num,
5636          AEL.Entered_Cr Line_Entered_Cr,
5637          AEL.Entered_Dr Line_Entered_Dr,
5638          AEL.Accounted_Cr Line_Accounted_Cr,
5639          AEL.Accounted_Dr Line_Accounted_Dr,
5640          APHD.Invoice_Distribution_ID Invoice_Distribution_ID,
5641          APHD.Invoice_Payment_ID Invoice_Payment_ID,
5642          APHD.Payment_History_ID Payment_History_ID,
5643          AEL.Upg_Batch_ID Upg_Batch_ID,
5644          ASP.Base_Currency_Code Base_Currency_Code,
5645          APHD.Payment_Hist_Dist_ID Source_Distribution_ID_Num_1,
5646          NVL(AEL.Entered_Cr, AEL.Entered_Dr) Line_Entered_Amt,
5647          NVL(AEL.Accounted_Cr, AEL.Accounted_Dr) Line_Accounted_Amt,
5648          AID.Amount Dist_Amount,
5649          NVL(AID.Base_Amount, AID.Amount) Dist_Base_Amount,
5650          COUNT(*) OVER (PARTITION BY AI.Invoice_ID, AID1.Invoice_Distribution_ID,
5651                                      AEL.AE_Line_Num) Dist_Count,
5652          RANK() OVER (PARTITION BY AI.Invoice_ID, AID1.Invoice_Distribution_ID,
5653                                    AEL.AE_Line_Num
5654                         ORDER BY AID.Amount,
5655                                  APHD.Invoice_Payment_Id,    --bug9307438
5656                                  AID.Invoice_distribution_id --bug8774970
5657                                            /*AID.Distribution_Line_Number*/) Rank_Num,
5658          AID1.Amount PDivisor_Ent_Amt,
5659          NVL(AID1.Base_Amount, AID1.Amount) PDivisor_Acct_Amt,
5660          AI.Invoice_ID Part_Key1,
5661          AID1.Invoice_Distribution_ID Part_Key2,
5662          AEH.AE_Header_ID Ref_AE_Header_ID,
5663          AC.Payment_Type_Flag Payment_Type_Flag,
5664          APH.Transaction_Type Transaction_Type,
5665          AEL.Accounting_Class_Code Accounting_Class_Code,
5666 	 xte_inv.entity_id aid_Entity_id
5667   FROM   AP_Checks_All AC,
5668          AP_System_Parameters_All ASP,
5669          XLA_Transaction_Entities_Upg XTE,
5670          XLA_Events XLE,
5671          AP_Payment_History_All APH,
5672          XLA_AE_Headers AEH,
5673          XLA_AE_Lines AEL,
5674          AP_Inv_Dists_Source AID1,
5675          AP_Invoices_All AI,
5676          AP_Invoice_Distributions_All AID,
5677          AP_Payment_Hist_Dists APHD,
5678          XLA_Transaction_Entities_Upg XTE_INV --Bug7169843 Bug11071399
5679   WHERE  AC.Check_ID = p_xla_event_rec.source_id_int_1
5680   AND    AC.Org_ID = ASP.Org_ID
5681   AND    XLE.Event_ID = p_accounting_event_id
5682   AND    ASP.Set_Of_Books_ID = XTE.Ledger_ID
5683   AND    AEH.ledger_id       = ASP.Set_Of_Books_ID -- Bug#8708433
5684   AND    XTE.Entity_Code = 'AP_PAYMENTS'
5685   AND    AC.Check_ID = nvl(XTE.Source_ID_Int_1,-99)
5686   AND    XTE.Application_ID = 200
5687   AND    XTE.Entity_ID = XLE.Entity_ID
5688   AND    XLE.Application_ID = 200
5689   AND    XLE.Event_ID = AEH.Event_ID
5690   AND    XLE.Upg_Batch_ID IS NOT NULL
5691   AND    AEH.Application_ID = 200
5692   AND    AEL.AE_Header_ID = AEH.AE_Header_ID
5693   AND    AEL.Application_ID = 200
5694   AND    XLE.Event_ID = APH.Accounting_Event_ID
5695   AND    APH.Check_ID = AC.Check_ID
5696   AND    APH.Payment_History_ID = p_payment_history_id
5697   AND    APH.Payment_History_ID = APHD.Payment_History_ID
5698   AND    APHD.Invoice_Payment_ID = DECODE(AEL.Source_Table, 'AP_INVOICE_PAYMENTS',
5699                                             AEL.Source_ID, APHD.Invoice_Payment_ID)
5700   -- begin 8774970
5701   AND    NVL(AID.Old_Distribution_Id, AID.Invoice_Distribution_Id) =
5702               DECODE(AEL.Source_Table, 'AP_INVOICE_DISTRIBUTIONS',
5703                      AEL.Source_ID, NVL(AID.Old_Distribution_Id,APHD.Invoice_Distribution_Id))
5704   AND    AID.Invoice_Id = DECODE(AEL.Source_Table, 'AP_INVOICES',
5705                                  AEL.Source_ID, AID.Invoice_Id)
5706   AND    APH.Check_Id = DECODE(AEL.Source_Table, 'AP_CHECKS',
5707                                AEL.Source_ID, APH.Check_Id)
5708   -- end 8774970
5709   AND    APHD.Invoice_Distribution_ID = AID.Invoice_Distribution_ID
5710   AND    AEL.Account_Overlay_Source_ID = AID1.Invoice_Distribution_ID
5711   AND    AID1.Invoice_ID = AI.Invoice_ID
5712   AND    AID1.Invoice_Distribution_ID = AID.Old_Distribution_ID
5713   AND    XTE_INV.ledger_id = AID.Set_Of_Books_id -- Bug11071399 start
5714   AND    XTE_INV.Entity_Code = 'AP_INVOICES'
5715   AND    XTE_INV.Application_id = 200
5716   AND    NVL(XTE_INV.Source_id_int_1, -99) = AID.invoice_id -- Bug11071399 end
5717   --Bug 12619564 start
5718   /* AND DECODE(ael.accounting_class_code,'AWT','AWT','DISCOUNT','DISCOUNT',
5719 	      aphd.pay_dist_lookup_code) = aphd.pay_dist_lookup_code
5720    Commented by Bug 12619564
5721   */
5722   AND decode(AEL.source_table, 'AP_CHECKS', AEL.Accounting_Class_Code, APHD.Pay_Dist_Lookup_Code)
5723            = decode(AEL.source_table, 'AP_CHECKS'
5724                ,decode(APHD.Pay_Dist_Lookup_Code,'AWT','AWT','DISCOUNT','DISCOUNT',
5725                     AEL.Accounting_Class_Code) ,APHD.Pay_Dist_Lookup_Code)
5726   AND ael.accounting_class_code =
5727                 decode(aphd.pay_dist_lookup_code
5728                         , 'AWT', DECODE(ael.accounting_class_code
5729                                         ,'LIABILITY',ael.accounting_class_code
5730                                         ,aphd.pay_dist_lookup_code)
5731                         , 'DISCOUNT', aphd.pay_dist_lookup_code
5732                         , 'BANK_CHG', aphd.pay_dist_lookup_code
5733                         , 'BANK_ERROR', aphd.pay_dist_lookup_code
5734                         ,  DECODE(ael.accounting_class_code
5735                                  ,'BANK_CHG',aphd.pay_dist_lookup_code
5736                                  ,'BANK_ERROR',aphd.pay_dist_lookup_code
5737                                  ,'AWT',aphd.pay_dist_lookup_code
5738                                  ,'DISCOUNT',aphd.pay_dist_lookup_code
5739                                  ,ael.accounting_class_code)
5740                         ) --Bug 13533030
5741   UNION ALL
5742   SELECT AC.Check_ID Check_ID,
5743          AEH.Event_ID Accounting_Event_ID,
5744          AEH.AE_Header_ID AE_Header_ID,
5745          AEL.AE_Line_Num AE_Line_Num,
5746          AEL.Entered_Cr Line_Entered_Cr,
5747          AEL.Entered_Dr Line_Entered_Dr,
5748          AEL.Accounted_Cr Line_Accounted_Cr,
5749          AEL.Accounted_Dr Line_Accounted_Dr,
5750          APHD.Invoice_Distribution_ID Invoice_Distribution_ID,
5751          APHD.Invoice_Payment_ID Invoice_Payment_ID,
5752          APHD.Payment_History_ID Payment_History_ID,
5753          AEL.Upg_Batch_ID Upg_Batch_ID,
5754          ASP.Base_Currency_Code Base_Currency_Code,
5755          APHD.Payment_Hist_Dist_ID Source_Distribution_ID_Num_1,
5756          NVL(AEL.Entered_Cr, AEL.Entered_Dr) Line_Entered_Amt,
5757          NVL(AEL.Accounted_Cr, AEL.Accounted_Dr) Line_Accounted_Amt,
5758          AID.Amount Dist_Amount,
5759          NVL(AID.Base_Amount, AID.Amount) Dist_Base_Amount,
5760          COUNT(*) OVER (PARTITION BY AC.Check_ID,
5761                           DECODE(AEL.Source_Table, 'AP_CHECKS', 1, AI.Invoice_ID),
5762 		          AEL.AE_Line_Num) Dist_Count,
5763          RANK() OVER (PARTITION BY AC.Check_ID, aeh.ae_header_id, -- bug 8638413
5764                           DECODE(AEL.Source_Table, 'AP_CHECKS', AC.Check_ID, AI.Invoice_ID),
5765 		          AEL.AE_Line_Num
5766                       ORDER BY AID.Amount,
5767                                APHD.Invoice_Payment_Id,    --bug9307438
5768                                AID.Invoice_distribution_id --bug8774970
5769                                            /*AID.Distribution_Line_Number*/) Rank_Num,
5770          SUM(AID.Amount)
5771                 OVER (PARTITION BY AC.Check_ID, aeh.ae_header_id, -- bug 8638413
5772                           DECODE(AEL.Source_Table, 'AP_CHECKS', 1, AI.Invoice_ID),
5773 		          AEL.AE_Line_Num) PDivisor_Ent_Amt,
5774          SUM(NVL(AID.Base_Amount, AID.Amount))
5775                 OVER (PARTITION BY AC.Check_ID, aeh.ae_header_id, -- bug 8638413
5776                           DECODE(AEL.Source_Table, 'AP_CHECKS', 1, AI.Invoice_ID),
5777 		          AEL.AE_Line_Num) PDivisor_Acct_Amt,
5778          DECODE(AEL.Source_Table, 'AP_CHECKS', 1, AI.Invoice_ID) Part_Key1,
5779          1 Part_Key2,
5780          AEH.AE_Header_ID Ref_AE_Header_ID,
5781          AC.Payment_Type_Flag Payment_Type_Flag,
5782          APH.Transaction_Type Transaction_Type,
5783          AEL.Accounting_Class_Code Accounting_Class_Code,
5784 	 xte_inv.entity_id aid_Entity_id --- changed for bug#7293021
5785   FROM   AP_Checks_All AC,
5786          AP_System_Parameters_All ASP,
5787          XLA_Transaction_Entities_Upg XTE,
5788          XLA_Events XLE,
5789          AP_Payment_History_All APH,
5790          XLA_AE_Headers AEH,
5791          XLA_AE_Lines AEL,
5792          AP_Payment_Hist_Dists APHD,
5793          AP_Invoice_Distributions_All AID,
5794          AP_Invoices_All AI,
5795          XLA_Transaction_Entities_Upg XTE_INV --Bug7169843 Bug11071399
5796   WHERE  AC.Check_ID = p_xla_event_rec.source_id_int_1
5797   AND    AC.Org_ID = ASP.Org_ID
5798   AND    XLE.Event_ID = p_accounting_event_id
5799   AND    ASP.Set_Of_Books_ID = XTE.Ledger_ID
5800   AND    AEH.ledger_id       = ASP.Set_Of_Books_ID -- Bug#8708433
5801   AND    XTE.Entity_Code = 'AP_PAYMENTS'
5802   AND    AC.Check_ID = nvl(XTE.Source_ID_Int_1,-99)
5803   AND    XTE.Application_ID = 200
5804   AND    XTE.Entity_ID = XLE.Entity_ID
5805   AND    XLE.Application_ID = 200
5806   AND    XLE.Event_ID = AEH.Event_ID
5807   AND    XLE.Upg_Batch_ID IS NOT NULL
5808   AND    AEH.Application_ID = 200
5809   AND    AEL.AE_Header_ID = AEH.AE_Header_ID
5810   AND    AEL.Application_ID = 200
5811   AND    XLE.Event_ID = APH.Accounting_Event_ID
5812   AND    APH.Check_ID = AC.Check_ID
5813   AND    APH.Payment_History_ID = p_payment_history_id
5814   AND    APH.Payment_History_ID = APHD.Payment_History_ID
5815   AND    APHD.Invoice_Payment_ID = DECODE(AEL.Source_Table, 'AP_INVOICE_PAYMENTS',
5816                                             AEL.Source_ID, APHD.Invoice_Payment_ID)
5817   -- begin 8774970
5818   AND    NVL(AID.Old_Distribution_Id, AID.Invoice_Distribution_Id) =
5819               DECODE(AEL.Source_Table, 'AP_INVOICE_DISTRIBUTIONS',
5820                      AEL.Source_ID, NVL(AID.Old_Distribution_Id,APHD.Invoice_Distribution_Id))
5821   AND    AID.Invoice_Id = DECODE(AEL.Source_Table, 'AP_INVOICES',
5822                                  AEL.Source_ID, AID.Invoice_Id)
5823   AND    APH.Check_Id = DECODE(AEL.Source_Table, 'AP_CHECKS',
5824                                AEL.Source_ID, APH.Check_Id)
5825   -- end 8774970
5826   AND    AEL.Account_Overlay_Source_ID IS NULL
5827   AND    APHD.Invoice_Distribution_ID = AID.Invoice_Distribution_ID
5828   AND    AI.Invoice_ID = AID.Invoice_ID
5829   AND    XTE_INV.ledger_id = AID.Set_Of_Books_id -- Bug11071399 start
5830   AND    XTE_INV.Entity_Code = 'AP_INVOICES'
5831   AND    XTE_INV.Application_id = 200
5832   AND    NVL(XTE_INV.Source_id_int_1, -99) = AID.invoice_id
5833   /* AND DECODE(ael.accounting_class_code,'AWT','AWT','DISCOUNT','DISCOUNT', aphd.pay_dist_lookup_code)
5834   = aphd.pay_dist_lookup_code --8293590
5835   Commented by Bug 12619564
5836   */
5837   AND decode(AEL.source_table, 'AP_CHECKS', AEL.Accounting_Class_Code, APHD.Pay_Dist_Lookup_Code)
5838          = decode(AEL.source_table, 'AP_CHECKS'
5839                ,decode(APHD.Pay_Dist_Lookup_Code,'AWT','AWT','DISCOUNT','DISCOUNT',
5840                     AEL.Accounting_Class_Code) ,APHD.Pay_Dist_Lookup_Code) --8293590
5841   AND ael.accounting_class_code =
5842                 decode(aphd.pay_dist_lookup_code
5843                         , 'AWT', DECODE(ael.accounting_class_code
5844                                         ,'LIABILITY',ael.accounting_class_code
5845                                         ,aphd.pay_dist_lookup_code)
5846                         , 'DISCOUNT', aphd.pay_dist_lookup_code
5847                         , 'BANK_CHG', aphd.pay_dist_lookup_code
5848                         , 'BANK_ERROR', aphd.pay_dist_lookup_code
5849                         ,  DECODE(ael.accounting_class_code
5850                                  ,'BANK_CHG',aphd.pay_dist_lookup_code
5851                                  ,'BANK_ERROR',aphd.pay_dist_lookup_code
5852                                  ,'AWT',aphd.pay_dist_lookup_code
5853                                  ,'DISCOUNT',aphd.pay_dist_lookup_code
5854                                  ,ael.accounting_class_code)
5855                         ) --Bug 13533030
5856   ) ADL,
5857   FND_Currencies FC
5858   WHERE  FC.Currency_Code = ADL.Base_Currency_Code);
5859 
5860 
5861   IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
5862       l_log_msg := 'Done inserting into xla_distribution_links for primary ledger';
5863       FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME || l_procedure_name,
5864 l_log_msg);
5865   END IF;
5866 
5867 -- Bug 8708443 For all other non-primary ledgers, the proration of amounts
5868 -- while inserting into xla_distribution_links should happen on the basis of
5869 -- the amounts in the table ap_mc_invoice_dists, this is required becasue
5870 -- if the primary ledger and the secondary ledger have a different currency,
5871 -- then doing the proration for accounting entries of secondary ledger on the
5872 -- basis of the amounts in ap_invoice_distributions_all, which is in another
5873 -- currency would be wrong.
5874 
5875   INSERT INTO XLA_Distribution_Links t1
5876         (APPLICATION_ID,
5877          EVENT_ID,
5878          AE_HEADER_ID,
5879          AE_LINE_NUM,
5880          SOURCE_DISTRIBUTION_TYPE,
5881          SOURCE_DISTRIBUTION_ID_NUM_1,
5882          UNROUNDED_ENTERED_CR,
5883          UNROUNDED_ENTERED_DR,
5884          UNROUNDED_ACCOUNTED_CR,
5885          UNROUNDED_ACCOUNTED_DR,
5886          REF_AE_HEADER_ID,
5887          ACCOUNTING_LINE_CODE,
5888          ACCOUNTING_LINE_TYPE_CODE,
5889          MERGE_DUPLICATE_CODE,
5890          TEMP_LINE_NUM,
5891          REF_EVENT_ID,
5892          UPG_BATCH_ID,
5893          LINE_DEFINITION_OWNER_CODE,
5894          LINE_DEFINITION_CODE,
5895          EVENT_CLASS_CODE,
5896          EVENT_TYPE_CODE,
5897 	 --- changed for bug#7293021 start
5898 	 APPLIED_TO_APPLICATION_ID,
5899          APPLIED_TO_ENTITY_ID,
5900          APPLIED_TO_DIST_ID_NUM_1,
5901          APPLIED_TO_DISTRIBUTION_TYPE
5902 	 --- changed for bug#7293021 end
5903 	 )
5904  SELECT 200,
5905         Accounting_Event_ID,
5906         AE_Header_ID,
5907         AE_Line_Num,
5908         'AP_PMT_DIST',
5909         Source_Distribution_ID_Num_1,
5910         --Bug 12619564 start
5911          (
5912          CASE
5913          WHEN (Line_Entered_cr is not null
5914                   and sign(DECODE( Rank_Num, Dist_Count,( Line_Entered_Amt - Sum_Entered_Amt ) + Entered_Amt, Entered_Amt )) <> -1)
5915               or (Line_Entered_dr is not null
5916                   and sign(DECODE( Rank_Num, Dist_Count,( Line_Entered_Amt - Sum_Entered_Amt ) + Entered_Amt, Entered_Amt )) =-1)
5917          THEN abs(DECODE( Rank_Num, Dist_Count,( Line_Entered_Amt - Sum_Entered_Amt ) + Entered_Amt, Entered_Amt ))
5918          ELSE NULL
5919          END )
5920          ,(
5921          CASE
5922          WHEN (Line_Entered_dr is not null
5923                   and sign(DECODE( Rank_Num, Dist_Count,( Line_Entered_Amt - Sum_Entered_Amt ) + Entered_Amt, Entered_Amt )) <> -1)
5924                or (Line_Entered_cr is not null
5925                   and sign(DECODE( Rank_Num, Dist_Count,( Line_Entered_Amt - Sum_Entered_Amt ) + Entered_Amt, Entered_Amt )) =-1)
5926          THEN abs(DECODE( Rank_Num, Dist_Count,( Line_Entered_Amt - Sum_Entered_Amt ) + Entered_Amt, Entered_Amt ))
5927          ELSE NULL
5928          END )
5929          ,(
5930          CASE
5931          WHEN (Line_Accounted_cr is not null
5932                   and sign(DECODE( Rank_Num, Dist_Count,( Line_Accounted_Amt - Sum_Accounted_Amt ) + Accounted_Amt, Accounted_Amt ))<> -1)
5933               or (Line_Accounted_dr is not null
5934                   and sign(DECODE( Rank_Num, Dist_Count,( Line_Accounted_Amt - Sum_Accounted_Amt ) + Accounted_Amt, Accounted_Amt ))=-1)
5935          THEN abs(DECODE( Rank_Num, Dist_Count,( Line_Accounted_Amt - Sum_Accounted_Amt ) + Accounted_Amt, Accounted_Amt ))
5936          ELSE NULL
5937          END )
5938          ,(
5939          CASE
5940          WHEN (Line_Accounted_dr is not null
5941                   and sign(DECODE( Rank_Num, Dist_Count,( Line_Accounted_Amt - Sum_Accounted_Amt ) + Accounted_Amt, Accounted_Amt ))<> -1)
5942               or (Line_Accounted_cr is not null
5943                   and sign(DECODE( Rank_Num, Dist_Count,( Line_Accounted_Amt - Sum_Accounted_Amt ) + Accounted_Amt, Accounted_Amt ))=-1)
5944          THEN abs(DECODE( Rank_Num, Dist_Count,( Line_Accounted_Amt - Sum_Accounted_Amt ) + Accounted_Amt, Accounted_Amt ))
5945          ELSE NULL
5946          END ),
5947          --Bug 12619564 end
5948         Ref_AE_Header_ID,
5949        (CASE
5950             WHEN Payment_Type_Flag = 'R' THEN
5951                  DECODE(Accounting_Class_Code,
5952                         'CASH_CLEARING', 'AP_CASH_CLEAR_REF', 'CASH', 'AP_CASH_REF',
5953                         'ACCRUAL', 'AP_ACCRUAL_REF', 'DISCOUNT', 'AP_DISCOUNT_ACCR_REF',
5954                         'EXCHANGE_RATE_VARIANCE', 'AP_EX_RATE_VAR_REF',
5955                         'ROUNDING', 'AP_FINAL_PMT_ROUNDING_REF',
5956                         'GAIN', 'AP_GAIN_REF', 'FREIGHT', 'AP_FREIGHT_EXPENSE_REF',
5957                         'IPV', 'AP_INV_PRICE_VAR_REF', 'ITEM EXPENSE', 'AP_ITEM_EXPENSE_REF',
5958                         'LOSS', 'AP_LOSS_REF', 'LIABILITY', 'AP_LIAB_REF',
5959                         'NRTAX', 'AP_NON_RECOV_TAX_REF',
5960                         'PREPAID_EXPENSE', 'AP_PREPAID_EXP_REF', 'RTAX','AP_RECOV_TAX_REF',
5961                         'AWT', 'AP_WITHHOLD_TAX_ACCR_REF')
5962             WHEN Transaction_Type = 'PAYMENT MATURITY' THEN
5963                  DECODE(Accounting_Class_Code, 'FUTURE_DATED_PMT', 'AP_FUTURE_DATED_PMT_MAT',
5964                         'CASH_CLEARING', 'AP_CASH_CLEAR_PMT_MAT',
5965                         'CASH', 'AP_CASH_PMT_MAT', 'GAIN', 'AP_GAIN_PMT_MAT',
5966                         'LOSS', 'AP_LOSS_PMT_MAT', 'ROUNDING', 'AP_FUTURE_PMT_ROUNDING_MAT')
5967             WHEN Transaction_Type IN ('PAYMENT CREATED', 'PAYMENT CANCELLED') THEN
5968                  DECODE(Accounting_Class_Code, 'FUTURE_DATED_PMT', 'AP_FUTURE_DATED_PMT',
5969                         'CASH_CLEARING', 'AP_CASH_CLEAR_PMT', 'CASH', 'AP_CASH_PMT',
5970                         'ACCRUAL', 'AP_ACCRUAL_PMT', 'DISCOUNT', 'AP_DISCOUNT_ACCR_PMT',
5971                         'EXCHANGE_RATE_VARIANCE', 'AP_EX_RATE_VAR_PMT',
5972                         'ROUNDING', 'AP_FINAL_PMT_ROUNDING_PMT',
5973                         'GAIN', 'AP_GAIN_PMT', 'FREIGHT', 'AP_FREIGHT_EXPENSE_PMT',
5974                         'IPV', 'AP_INV_PRICE_VAR_PMT', 'ITEM EXPENSE', 'AP_ITEM_EXPENSE_PMT',
5975                         'LOSS', 'AP_LOSS_PMT', 'LIABILITY', 'AP_LIAB_PMT',
5976                         'NRTAX', 'AP_NON_RECOV_TAX_PMT',
5977                         'PREPAID_EXPENSE', 'AP_PREPAID_EXP_PMT', 'RTAX','AP_RECOV_TAX_PMT',
5978                         'AWT', 'AP_WITHHOLD_TAX_ACCR_PMT')
5979             WHEN Transaction_Type IN ('PAYMENT CLEARING', 'PAYMENT UNCLEARING') THEN
5980                  DECODE(Accounting_Class_Code, 'BANK_CHG', 'AP_BANK_CHARGES_CLEAR',
5981                         'CASH_CLEARING', 'AP_CASH_CLEAR_CLEAR', 'CASH', 'AP_CASH_CLEAR',
5982                         'ACCRUAL', 'AP_ACCRUAL_CLEAR', 'DISCOUNT', 'AP_DISCOUNT_ACCR_CLEAR',
5983                         'EXCHANGE_RATE_VARIANCE', 'AP_EX_RATE_VAR_CLEAR',
5984                         'BANK_ERROR', 'AP_BANK_ERROR_CLEAR',
5985                         'ROUNDING', 'AP_FINAL_PMT_ROUNDING_CLEAR',
5986                         'GAIN', 'AP_GAIN_PMT_CLEAR', 'FREIGHT', 'AP_FREIGHT_EXPENSE_CLEAR',
5987                         'IPV', 'AP_INV_PRICE_VAR_CLEAR', 'ITEM EXPENSE', 'AP_ITEM_EXPENSE_CLEAR',
5988                         'LOSS', 'AP_LOSS_PMT_CLEAR', 'LIABILITY', 'AP_LIAB_CLEAR',
5989                         'NRTAX', 'AP_NON_RECOV_TAX_CLEAR', 'RTAX','AP_RECOV_TAX_CLEAR',
5990                         'AWT', 'AP_WITHHOLD_TAX_ACCR_CLEAR')
5991         END),
5992         'S',
5993          'A',  --changed by abhsaxen for bug#9073033
5994         Row_Number() OVER (PARTITION BY AE_Header_ID
5995                      ORDER BY AE_Line_Num,
5996                               Invoice_Distribution_ID,
5997                               Invoice_Payment_ID,
5998                               Payment_History_ID) Temp_Line_Num,
5999         Accounting_Event_ID,
6000         Upg_Batch_ID,
6001         'S',
6002         'ACCRUAL_PAYMENTS_ALL',
6003         'PAYMENTS',
6004         'PAYMENTS_ALL',
6005         -- changed for bug#7293021 start
6006         DECODE(Accounting_Class_Code, 'LIABILITY' ,200, null),
6007         DECODE(Accounting_Class_Code, 'LIABILITY' ,aid_Entity_id, null),
6008         DECODE(Accounting_Class_Code, 'LIABILITY' ,Invoice_Distribution_ID, null),
6009         'AP_INV_DIST'
6010 FROM
6011   (
6012   SELECT Accounting_Event_ID,
6013          AE_Header_ID,
6014          AE_Line_Num,
6015          Line_Entered_Cr,
6016          Line_Entered_Dr,
6017          Line_Accounted_Cr,
6018          Line_Accounted_Dr,
6019          Invoice_Distribution_ID,
6020          Invoice_Payment_ID,
6021          Payment_History_ID,
6022          Upg_Batch_ID,
6023          Base_Currency_Code,
6024          Source_Distribution_ID_Num_1,
6025          Line_Entered_Amt,
6026          Line_Accounted_Amt,
6027          DECODE(FC.Minimum_Accountable_Unit, NULL,
6028             ROUND((Line_Accounted_Amt * Dist_Base_Amount
6029                   / DECODE(PDivisor_Acct_Amt, 0, 1, PDivisor_Acct_Amt)),
6030               FC.Precision),
6031             ROUND((Line_Accounted_Amt * Dist_Base_Amount
6032                   / DECODE(PDivisor_Acct_Amt, 0, 1, PDivisor_Acct_Amt))
6033               /FC.Minimum_Accountable_Unit) * FC.Minimum_Accountable_Unit) Accounted_Amt,
6034          DECODE(FC.Minimum_Accountable_Unit, NULL,
6035             ROUND((Line_Entered_Amt * Dist_Amount
6036                   / DECODE(PDivisor_Ent_Amt, 0 ,1, PDivisor_Ent_Amt)), FC.Precision),
6037             ROUND((Line_Entered_Amt * Dist_Amount
6038                   / DECODE(PDivisor_Acct_Amt, 0 ,1, PDivisor_Ent_Amt))
6039               /FC.Minimum_Accountable_Unit) * FC.Minimum_Accountable_Unit) Entered_Amt,
6040          Dist_Count,
6041          Rank_Num,
6042          SUM(DECODE(FC.Minimum_Accountable_Unit, NULL,
6043             ROUND((Line_Accounted_Amt * Dist_Base_Amount
6044                    / DECODE(PDivisor_Acct_Amt, 0, 1, PDivisor_Acct_Amt)),
6045                    FC.Precision),
6046             ROUND((Line_Accounted_Amt * Dist_Base_Amount
6047                    / DECODE(PDivisor_Acct_Amt, 0, 1, PDivisor_Acct_Amt))
6048               /FC.Minimum_Accountable_Unit) * FC.Minimum_Accountable_Unit))
6049             OVER (PARTITION BY Check_ID, Part_Key1, Part_Key2, AE_Line_Num)
6050                  Sum_Accounted_Amt,
6051          SUM(DECODE(FC.Minimum_Accountable_Unit, NULL,
6052               ROUND((Line_Entered_Amt * Dist_Amount
6053                   / DECODE(PDivisor_Ent_Amt, 0 ,1, PDivisor_Ent_Amt)), FC.Precision),
6054               ROUND((Line_Entered_Amt * Dist_Amount
6055                   / DECODE(PDivisor_Ent_Amt, 0 ,1, PDivisor_Ent_Amt))
6056                /FC.Minimum_Accountable_Unit) * FC.Minimum_Accountable_Unit))
6057             OVER (PARTITION BY Check_ID, Part_Key1, Part_Key2, AE_Line_Num) Sum_Entered_Amt,
6058          Ref_AE_Header_ID,
6059          Payment_Type_Flag,
6060          Transaction_Type,
6061          Accounting_Class_Code,
6062         aid_Entity_id
6063 FROM
6064 (
6065   SELECT AC.Check_ID Check_ID,--13520870 added the select query
6066          AEH.Event_ID Accounting_Event_ID,
6067          AEH.AE_Header_ID AE_Header_ID,
6068          AEL.AE_Line_Num AE_Line_Num,
6069          AEL.Entered_Cr Line_Entered_Cr,
6070          AEL.Entered_Dr Line_Entered_Dr,
6071          AEL.Accounted_Cr Line_Accounted_Cr,
6072          AEL.Accounted_Dr Line_Accounted_Dr,
6073          APHD.Invoice_Distribution_ID Invoice_Distribution_ID,
6074          APHD.Invoice_Payment_ID Invoice_Payment_ID,
6075          APHD.Payment_History_ID Payment_History_ID,
6076          AEL.Upg_Batch_ID Upg_Batch_ID,
6077          ASP.Base_Currency_Code Base_Currency_Code,
6078          APHD.Payment_Hist_Dist_ID Source_Distribution_ID_Num_1,
6079          NVL(AEL.Entered_Cr, AEL.Entered_Dr) Line_Entered_Amt,
6080          NVL(AEL.Accounted_Cr, AEL.Accounted_Dr) Line_Accounted_Amt,
6081          COALESCE(AID_MC.Amount, AID.Amount) Dist_Amount,
6082          COALESCE(AID_MC.Base_Amount, AID_MC.Amount, AID.Base_Amount, AID.Amount) Dist_Base_Amount,
6083          COUNT(*) OVER (PARTITION BY AI.Invoice_ID, AID1.Invoice_Distribution_ID,
6084                                      AEL.AE_Line_Num) Dist_Count,
6085          RANK() OVER (PARTITION BY AI.Invoice_ID, AID1.Invoice_Distribution_ID,
6086                                    AEL.AE_Line_Num
6087                         ORDER BY AID.Amount,
6088                                  APHD.Invoice_Payment_Id,    --bug9307438
6089                                  AID.Invoice_distribution_id --bug8774970
6090                                            /*AID.Distribution_Line_Number*/) Rank_Num,
6091          COALESCE(AID_MC.Amount, AID.Amount) PDivisor_Ent_Amt,
6092          COALESCE(AID_MC.Base_Amount, AID_MC.Amount, AID.Base_Amount, AID.Amount) PDivisor_Acct_Amt,
6093          AI.Invoice_ID Part_Key1,
6094          AID1.Invoice_Distribution_ID Part_Key2,
6095          AEH.AE_Header_ID Ref_AE_Header_ID,
6096          AC.Payment_Type_Flag Payment_Type_Flag,
6097          APH.Transaction_Type Transaction_Type,
6098          AEL.Accounting_Class_Code Accounting_Class_Code,
6099 	     xte_inv.entity_id aid_Entity_id
6100   FROM   AP_Checks_All AC,
6101          AP_System_Parameters_All ASP,
6102          XLA_Transaction_Entities_Upg XTE,
6103          XLA_Events XLE,
6104          AP_Payment_History_All APH,
6105          XLA_AE_Headers AEH,
6106          XLA_AE_Lines AEL,
6107          AP_Inv_Dists_Source AID1,
6108          AP_Invoices_All AI,
6109          AP_Invoice_Distributions_All AID,
6110          AP_Payment_Hist_Dists APHD,
6111          XLA_Transaction_Entities_Upg XTE_INV, --Bug7169843 Bug11071399
6112          AP_MC_Invoice_Dists AID_MC
6113   WHERE  AC.Check_ID = p_xla_event_rec.source_id_int_1
6114   AND    AC.Org_ID = ASP.Org_ID
6115   AND    XLE.Event_ID = p_accounting_event_id
6116   AND    ASP.Set_Of_Books_ID = XTE.Ledger_ID
6117   AND    AEH.ledger_id <> ASP.Set_Of_Books_ID -- Bug#8708433
6118   AND    XTE.Entity_Code = 'AP_PAYMENTS'
6119   AND    AC.Check_ID = nvl(XTE.Source_ID_Int_1,-99)
6120   AND    XTE.Application_ID = 200
6121   AND    XTE.Entity_ID = XLE.Entity_ID
6122   AND    XLE.Application_ID = 200
6123   AND    XLE.Event_ID = AEH.Event_ID
6124   AND    XLE.Upg_Batch_ID IS NOT NULL
6125   AND    AEH.Application_ID = 200
6126   AND    AEL.AE_Header_ID = AEH.AE_Header_ID
6127   AND    AEL.Application_ID = 200
6128   AND    XLE.Event_ID = APH.Accounting_Event_ID
6129   AND    APH.Check_ID = AC.Check_ID
6130   AND    APH.Payment_History_ID = p_payment_history_id
6131   AND    APH.Payment_History_ID = APHD.Payment_History_ID
6132   AND    APHD.Invoice_Payment_ID = DECODE(AEL.Source_Table, 'AP_INVOICE_PAYMENTS',
6133                                             AEL.Source_ID, APHD.Invoice_Payment_ID)
6134   -- begin 8774970
6135   AND    NVL(AID.Old_Distribution_Id, AID.Invoice_Distribution_Id) =
6136               DECODE(AEL.Source_Table, 'AP_INVOICE_DISTRIBUTIONS',
6137                      AEL.Source_ID, NVL(AID.Old_Distribution_Id,APHD.Invoice_Distribution_Id))
6138   AND    AID.Invoice_Id = DECODE(AEL.Source_Table, 'AP_INVOICES',
6139                                  AEL.Source_ID, AID.Invoice_Id)
6140   AND    APH.Check_Id = DECODE(AEL.Source_Table, 'AP_CHECKS',
6141                                AEL.Source_ID, APH.Check_Id)
6142   -- end 8774970
6143   AND    APHD.Invoice_Distribution_ID = AID.Invoice_Distribution_ID
6144   AND    AEL.Account_Overlay_Source_ID = AID1.Invoice_Distribution_ID
6145   AND    AID.Invoice_ID = AI.Invoice_ID
6146   AND    AID1.Invoice_ID = AID.Invoice_ID
6147   AND    AID1.Invoice_Distribution_ID = AID.Old_Distribution_ID
6148   AND    XTE_INV.ledger_id = AID.Set_Of_Books_id -- Bug11071399 start
6149   AND    XTE_INV.Entity_Code = 'AP_INVOICES'
6150   AND    XTE_INV.Application_id = 200
6151   AND    NVL(XTE_INV.Source_id_int_1, -99) = AID.invoice_id -- Bug11071399 end
6152   AND    AID1.Invoice_Distribution_ID = AID_MC.Invoice_Distribution_ID(+)
6153   AND    AID1.Invoice_id = AID_MC.Invoice_id(+)
6154   AND    AEH.ledger_id = NVL(AID_MC.Set_Of_Books_ID,AEH.ledger_id)
6155   UNION ALL
6156   SELECT AC.Check_ID Check_ID,
6157          AEH.Event_ID Accounting_Event_ID,
6158          AEH.AE_Header_ID AE_Header_ID,
6159          AEL.AE_Line_Num AE_Line_Num,
6160          AEL.Entered_Cr Line_Entered_Cr,
6161          AEL.Entered_Dr Line_Entered_Dr,
6162          AEL.Accounted_Cr Line_Accounted_Cr,
6163          AEL.Accounted_Dr Line_Accounted_Dr,
6164          APHD.Invoice_Distribution_ID Invoice_Distribution_ID,
6165          APHD.Invoice_Payment_ID Invoice_Payment_ID,
6166          APHD.Payment_History_ID Payment_History_ID,
6167          AEL.Upg_Batch_ID Upg_Batch_ID,
6168          ASP.Base_Currency_Code Base_Currency_Code,
6169          APHD.Payment_Hist_Dist_ID Source_Distribution_ID_Num_1,
6170          NVL(AEL.Entered_Cr, AEL.Entered_Dr) Line_Entered_Amt,
6171          NVL(AEL.Accounted_Cr, AEL.Accounted_Dr) Line_Accounted_Amt,
6172          COALESCE(AID_MC.Amount, AID.Amount) Dist_Amount ,--13520870
6173          COALESCE(AID_MC.Base_Amount, AID_MC.Amount, AID.Base_Amount, AID.Amount) Dist_Base_Amount,--13520870
6174          COUNT(*) OVER (PARTITION BY AC.Check_ID,
6175                           DECODE(AEL.Source_Table, 'AP_CHECKS', 1, AI.Invoice_ID),
6176 		          AEL.AE_Line_Num) Dist_Count,
6177          RANK() OVER (PARTITION BY AC.Check_ID, aeh.ae_header_id, -- bug 8638413
6178                           DECODE(AEL.Source_Table, 'AP_CHECKS', AC.Check_ID, AI.Invoice_ID),
6179 		          AEL.AE_Line_Num
6180                       ORDER BY AID.Amount, --13520870
6181                                APHD.Invoice_Payment_Id,   --bug9307438
6182                                AID.Invoice_distribution_id) Rank_Num,--13520870
6183          SUM(COALESCE(AID_MC.Amount, AID.Amount))  --13520870
6184                 OVER (PARTITION BY AC.Check_ID, aeh.ae_header_id, -- bug 8638413
6185                           DECODE(AEL.Source_Table, 'AP_CHECKS', 1, AI.Invoice_ID),
6186 		          AEL.AE_Line_Num) PDivisor_Ent_Amt,
6187          SUM(COALESCE(AID_MC.Base_Amount, AID_MC.Amount, AID.Base_Amount, AID.Amount)) --13520870
6188                 OVER (PARTITION BY AC.Check_ID, aeh.ae_header_id, -- bug 8638413
6189                           DECODE(AEL.Source_Table, 'AP_CHECKS', 1, AI.Invoice_ID),
6190 		          AEL.AE_Line_Num) PDivisor_Acct_Amt,
6191          DECODE(AEL.Source_Table, 'AP_CHECKS', 1, AI.Invoice_ID) Part_Key1,
6192          1 Part_Key2,
6193          AEH.AE_Header_ID Ref_AE_Header_ID,
6194          AC.Payment_Type_Flag Payment_Type_Flag,
6195          APH.Transaction_Type Transaction_Type,
6196          AEL.Accounting_Class_Code Accounting_Class_Code,
6197 	 xte_inv.entity_id AID_Entity_id --- changed for bug#7293021
6198   FROM   AP_Checks_All AC,
6199          AP_System_Parameters_All ASP,
6200          XLA_Transaction_Entities_Upg XTE,
6201          XLA_Events XLE,
6202          AP_Payment_History_All APH,
6203          XLA_AE_Headers AEH,
6204          XLA_AE_Lines AEL,
6205          AP_Payment_Hist_Dists APHD,
6206          ap_mc_invoice_dists AID_MC,
6207          AP_Invoices_All AI,
6208          XLA_Transaction_Entities_Upg XTE_INV, --Bug7169843 Bug11071399
6209 	     AP_Invoice_Distributions_All AID,
6210 		 AP_Inv_Dists_Source AID1 --13520870
6211   WHERE  AC.Check_ID = p_xla_event_rec.source_id_int_1
6212   AND    AC.Org_ID = ASP.Org_ID
6213   AND    XLE.Event_ID = p_accounting_event_id
6214   AND    ASP.Set_Of_Books_ID = XTE.Ledger_ID
6215   AND    AEH.ledger_id <> ASP.Set_Of_Books_ID
6216   AND    XTE.Entity_Code = 'AP_PAYMENTS'
6217   AND    AC.Check_ID = nvl(XTE.Source_ID_Int_1,-99)
6218   AND    XTE.Application_ID = 200
6219   AND    XTE.Entity_ID = XLE.Entity_ID
6220   AND    XLE.Application_ID = 200
6221   AND    XLE.Event_ID = AEH.Event_ID
6222   AND    XLE.Upg_Batch_ID IS NOT NULL
6223   AND    AEH.Application_ID = 200
6224   AND    AEL.AE_Header_ID = AEH.AE_Header_ID
6225   AND    AEL.Application_ID = 200
6226   AND    XLE.Event_ID = APH.Accounting_Event_ID
6227   AND    APH.Check_ID = AC.Check_ID
6228   AND    APH.Payment_History_ID = p_payment_history_id
6229   AND    APH.Payment_History_ID = APHD.Payment_History_ID
6230   AND    APHD.Invoice_Payment_ID = DECODE(AEL.Source_Table, 'AP_INVOICE_PAYMENTS',
6231                                             AEL.Source_ID, APHD.Invoice_Payment_ID)
6232   -- begin 8774970
6233   AND    NVL(AID.Old_Distribution_Id, AID.Invoice_Distribution_Id) =
6234               DECODE(AEL.Source_Table, 'AP_INVOICE_DISTRIBUTIONS',
6235                      AEL.Source_ID, NVL(AID.Old_Distribution_Id,APHD.Invoice_Distribution_Id))
6236   AND    AID.Invoice_Id = DECODE(AEL.Source_Table, 'AP_INVOICES',
6237                                  AEL.Source_ID, AID.Invoice_Id)
6238   AND    APH.Check_Id = DECODE(AEL.Source_Table, 'AP_CHECKS',
6239                                AEL.Source_ID, APH.Check_Id)
6240   -- end 8774970
6241   AND    AEL.Account_Overlay_Source_ID IS NULL
6242   AND    APHD.Invoice_Distribution_ID = AID.invoice_distribution_id   --13520870
6243   AND    AID1.Invoice_ID = AID.Invoice_ID  --13520870
6244   AND    AID1.Invoice_Distribution_ID = AID.Old_Distribution_ID --13520870
6245   AND    AID1.Invoice_Distribution_ID = AID_MC.Invoice_Distribution_ID(+) --13520870
6246   AND    AID1.Invoice_ID = AID_MC.Invoice_ID(+) --13520870
6247   AND    AEH.ledger_id = NVL(AID_MC.set_of_books_id, AEH.ledger_id)  --13520870
6248   AND    AI.Invoice_ID = AID.Invoice_ID   --13520870
6249   AND    XTE_INV.ledger_id = AID.Set_Of_Books_id -- Bug11071399 start
6250   AND    XTE_INV.Entity_Code = 'AP_INVOICES'
6251   AND    XTE_INV.Application_id = 200
6252   AND    NVL(XTE_INV.Source_id_int_1, -99) = AID.invoice_id -- Bug11071399 end
6253 --  AND    AID.invoice_distribution_id = AID_MC.Invoice_Distribution_ID --13520870
6254   /*  AND DECODE(ael.accounting_class_code,'AWT','AWT','DISCOUNT','DISCOUNT',
6255 	      aphd.pay_dist_lookup_code) = aphd.pay_dist_lookup_code --8293590
6256   Commented by Bug 12619564
6257   */
6258   AND decode(AEL.source_table, 'AP_CHECKS', AEL.Accounting_Class_Code, APHD.Pay_Dist_Lookup_Code)
6259          = decode(AEL.source_table, 'AP_CHECKS'
6260                ,decode(APHD.Pay_Dist_Lookup_Code,'AWT','AWT','DISCOUNT','DISCOUNT',
6261                     AEL.Accounting_Class_Code) ,APHD.Pay_Dist_Lookup_Code)
6262   AND DECODE(ael.accounting_class_code,'AWT','AWT','DISCOUNT','DISCOUNT','True')
6263          =DECODE(aphd.pay_dist_lookup_code,'AWT','AWT','DISCOUNT','DISCOUNT','True') -- Bug 12619564
6264 
6265 ) ADL,
6266   FND_Currencies FC
6267 WHERE  FC.Currency_Code = ADL.Base_Currency_Code );
6268 
6269   IF (G_LEVEL_STATEMENT >= G_CURRENT_RUNTIME_LEVEL) THEN
6270       l_log_msg := 'Done inserting into xla_distribution_links for non-primary ledgers';
6271       FND_LOG.STRING(G_LEVEL_STATEMENT,G_MODULE_NAME || l_procedure_name,
6272 l_log_msg);
6273   END IF;
6274 
6275   -- 11721100 Update stmt to populate IDA and IDBA for payment created events --
6276   IF  (NVL(fnd_profile.value('FV_ENABLED'), 'N') = 'Y')  THEN --Custom code for FV
6277 
6278     BEGIN
6279      /* Added MERGE inplace of update statement for bug13437260 */
6280 
6281       MERGE
6282        INTO ap_payment_hist_dists aphd
6283       USING ( SELECT aphd.payment_hist_dist_id,
6284                      aphd.invoice_dist_base_amount,
6285                 NVL(xdl.unrounded_accounted_cr,0) - NVL(xdl.unrounded_accounted_dr,0) xdl_acctd_amt,
6286                      aphd.invoice_dist_amount ,
6287                 NVL(xdl.unrounded_entered_cr,0) - NVL(xdl.unrounded_entered_dr,0) xdl_ent_amt
6288                FROM ap_payment_hist_dists aphd,
6289                     ap_payment_history_all aph,
6290                     xla_ae_headers xh,
6291                     ap_system_parameters_all asp,
6292                     xla_distribution_links xdl
6293               WHERE aphd.payment_history_id        = aph.payment_history_id
6294                 AND aph.related_event_id             = xh.event_id
6295                 AND xh.application_id                = 200
6296                 AND aphd.accounting_event_id         = p_xla_event_rec.event_id --event_id of cancellation_event
6297                 AND aph.org_id                       = asp.org_id
6298                 AND xh.ledger_id                     = asp.set_of_books_id
6299                 AND xh.upg_batch_id                  > 0
6300                 AND xh.ae_header_id                  = xdl.ae_header_id
6301                 AND xdl.application_id               = xh.application_id
6302                 AND xdl.event_id                     = xh.event_id
6303                 AND xdl.source_distribution_type     = 'AP_PMT_DIST'
6304                 AND xdl.SOURCE_DISTRIBUTION_ID_NUM_1 = aphd.REVERSED_PAY_HIST_DIST_ID
6305                 AND (xdl.accounting_line_code LIKE 'AP%LIAB%' or xdl.accounting_line_code LIKE 'AP%ITEM%EXP%')
6306                 AND (aphd.invoice_dist_base_amount IS NULL or aphd.invoice_dist_amount IS NULL)) src
6307        ON (aphd.payment_hist_dist_id = src.payment_hist_dist_id)
6308       WHEN MATCHED
6309       THEN
6310        UPDATE
6311        SET aphd.invoice_dist_base_amount = src.xdl_acctd_amt,
6312            aphd.invoice_dist_amount = src.xdl_ent_amt ;
6313 
6314 
6315 
6316     EXCEPTION
6317       WHEN OTHERS THEN
6318          IF (G_LEVEL_PROCEDURE >= G_CURRENT_RUNTIME_LEVEL ) THEN
6319              l_log_msg := 'Error while running Merge stmt for event id'||p_xla_event_rec.event_id;
6320 
6321              FND_LOG.STRING(G_LEVEL_PROCEDURE, G_MODULE_NAME||l_procedure_name||'.end', l_log_msg);
6322          END IF;
6323          NULL;
6324 
6325     END;
6326   END IF; --Update End 11721100
6327 
6328   -- Logging Infra: Procedure level
6329   IF (G_LEVEL_PROCEDURE >= G_CURRENT_RUNTIME_LEVEL ) THEN
6330       l_log_msg := 'End of procedure '|| l_procedure_name;
6331       FND_LOG.STRING(G_LEVEL_PROCEDURE, G_MODULE_NAME||l_procedure_name||'.end',
6332 l_log_msg);
6333   END IF;
6334 
6335 
6336 EXCEPTION
6337   WHEN OTHERS THEN
6338     IF (SQLCODE <> -20001) THEN
6339       FND_MESSAGE.SET_NAME('SQLAP','AP_DEBUG');
6340       FND_MESSAGE.SET_TOKEN('ERROR',SQLERRM);
6341       FND_MESSAGE.SET_TOKEN('CALLING_SEQUENCE', l_curr_calling_sequence);
6342     END IF;
6343     APP_EXCEPTION.RAISE_EXCEPTION;
6344 
6345 END Upg_Dist_Links_Insert;
6346 
6347 END AP_ACCTG_PAY_DIST_PKG;