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