DBA Data[Home] [Help]

PACKAGE BODY: APPS.AP_WEB_PAYMENTS_PKG

Source


1 PACKAGE BODY AP_WEB_PAYMENTS_PKG AS
2 /* $Header: apwxpayb.pls 120.5.12010000.2 2008/08/06 10:19:25 rveliche ship $ */
3 
4     -----------------------------------------------------------------------
5     -- Declare record type used to hold records returned from generic cursor
6     --
7     TYPE PAYMENT_RECORD IS
8     RECORD (check_number    ap_checks.check_number%TYPE,
9             check_id        ap_checks.check_id%TYPE,
10             check_date      ap_checks.check_date%TYPE,
11             invoice_num     ap_invoices.invoice_num%TYPE,
12             invoice_id      ap_invoices.invoice_id%TYPE,
13             gl_date         ap_invoice_payments.accounting_date%TYPE,
14             type            ap_invoice_payments.invoice_payment_type%TYPE,
15             method          ap_checks.payment_method_lookup_code%TYPE,
16             method_trans    ap_lookup_codes.displayed_field%TYPE);
17 
18     -----------------------------------------------------------------------
19     -- Declare generic cursor to get check number, check id, invoice number
20     -- invoice id, payment type, payment method lookup code, and translated
21     -- payment method
22     --
23     CURSOR payment_cursor (l_invoice_id NUMBER, l_payment_num NUMBER)
24     RETURN payment_record IS
25     SELECT ac.check_number,
26            ac.check_id,
27            ac.check_date,
28            ai.invoice_num,
29            ai.invoice_id,
30            aip.accounting_date,
31            aip.invoice_payment_type,
32            ac.payment_method_lookup_code,
33            alc2.displayed_field
34     FROM   ap_invoice_payments aip,
35            ap_checks           ac,
36            ap_invoices         ai,
37            ap_lookup_codes     alc2
38     WHERE  aip.invoice_id       = l_invoice_id
39     AND    aip.payment_num      = l_payment_num
40     AND    aip.check_id         = ac.check_id
41     AND    aip.other_invoice_id = ai.invoice_id (+)
42     AND    alc2.lookup_type     = 'PAYMENT METHOD'
43     AND    alc2.lookup_code     = ac.payment_method_code
44     UNION ALL
45     SELECT ac.check_number,
46            ac.check_id,
47            ac.check_date,
48            ai.invoice_num,
49            ai.invoice_id,
50            aip.accounting_date,
51            aip.invoice_payment_type,
52            ac.payment_method_lookup_code,
53            alc2.displayed_field
54     FROM   ap_invoice_payments aip,
55            ap_checks           ac,
56            ap_invoices         ai,
57            ap_lookup_codes     alc2,
58 	   ap_invoice_lines ail1,
59 	   ap_invoice_lines ail2,
60            ap_invoice_distributions aid1,
61            ap_invoice_distributions aid2
62     WHERE  aip.invoice_id       = ail2.invoice_id
63     AND    ail1.invoice_id      = l_invoice_id
64     AND    aip.payment_num      = l_payment_num
65     AND    aid1.invoice_id = ail1.invoice_id
66     AND    aid1.invoice_line_number = ail1.line_number
67     AND    aid2.invoice_id = ail2.invoice_id
68     AND    aid2.invoice_line_number = ail2.line_number
69     AND    aip.check_id         = ac.check_id
70     AND    aip.other_invoice_id = ai.invoice_id (+)
71     AND    alc2.lookup_type     = 'PAYMENT METHOD'
72     AND    alc2.lookup_code     = ac.payment_method_code
73     AND   (ail1.line_type_lookup_code = 'PREPAY' OR
74            ail1.line_type_lookup_code = 'TAX'    AND
75            aid1.prepay_tax_parent_id IS NOT NULL
76            )
77     AND aid2.INVOICE_DISTRIBUTION_ID = aid1.prepay_distribution_id;
78 
79     -----------------------------------------------------------------------
80     -- Function concat_document_num_type concatenates the document number
81     -- to the document type
82     --
83     FUNCTION concat_document_num_type(l_payment_record IN PAYMENT_RECORD)
84         RETURN VARCHAR2
85     IS
86         l_paid_by  VARCHAR2(80);
87         type_trans ap_lookup_codes.displayed_field%TYPE;
88     BEGIN
89 
90         IF (l_payment_record.type = 'PREPAY') THEN
91 
92             SELECT displayed_field
93             INTO type_trans
94             FROM ap_lookup_codes
95             WHERE lookup_type     = 'NLS TRANSLATION'
96             AND lookup_code     = 'PREPAY';
97 
98             -------------------------------------------------------
99             -- Get prepayment number concatenated to prepayment type
100             --
101             l_paid_by := type_trans ||' #'||
102                          l_payment_record.invoice_num;
103         ELSE
104             -------------------------------------------------------
105             -- Get payment number concatenated to payment method type
106             --
107             l_paid_by := l_payment_record.method_trans ||' #'||
108                          l_payment_record.check_number;
109         END IF;
110 
111         RETURN(l_paid_by);
112 
113     END concat_document_num_type;
114 
115 
116     -----------------------------------------------------------------------
117     -- Function get_paid_by_list returns a list of document numbers
118     -- concatenated to the document type used to pay this payment schedule
119     -- or NULL if unpaid.
120     --
121     FUNCTION get_paid_by_list(l_invoice_id IN NUMBER, l_payment_num IN NUMBER)
122         RETURN VARCHAR2
123     IS
124         l_paid_by        VARCHAR2(80);
125         l_paid_by_list   VARCHAR2(2000) := NULL;
126         l_payment_record PAYMENT_RECORD;
127 
128     BEGIN
129 
130         OPEN payment_cursor(l_invoice_id, l_payment_num);
131 
132         LOOP
133             FETCH payment_cursor INTO l_payment_record;
134             EXIT WHEN payment_cursor%NOTFOUND;
135 
136             l_paid_by := AP_WEB_PAYMENTS_PKG.CONCAT_DOCUMENT_NUM_TYPE(l_payment_record);
137 
138             IF (l_paid_by_list IS NOT NULL) THEN
139                 l_paid_by_list := l_paid_by_list || ', ';
140             END IF;
141 
142             l_paid_by_list := l_paid_by_list || l_paid_by;
143 
144         END LOOP;
145 
146         l_paid_by_list := payment_cursor%ROWCOUNT||'*'||l_paid_by_list;
147 
148         CLOSE payment_cursor;
149 
150         RETURN(l_paid_by_list);
151 
152     END get_paid_by_list;
153 
154     -----------------------------------------------------------------------
155     -- Function get_paid_by_list returns a list of document numbers
156     -- concatenated to the document type used to pay this payment schedule
157     -- or NULL if unpaid.
158     --
159     FUNCTION get_total_payments_made(l_invoice_id IN NUMBER)
160         RETURN VARCHAR2
161     IS
162         l_total_payment_made   VARCHAR2(80);
163 
164     BEGIN
165 	SELECT SUM(AIP.AMOUNT)
166 	INTO l_total_payment_made
167 	FROM AP_INVOICE_PAYMENTS AIP, AP_INVOICES AI
168 	WHERE AIP.INVOICE_ID = AI.INVOICE_ID
169 	AND AI.INVOICE_ID = l_invoice_id;
170 
171         RETURN(l_total_payment_made);
172 
173 	EXCEPTION
174 	 WHEN no_data_found  THEN
175 	  return(null);
176 	 WHEN OTHERS THEN
177 	  raise;
178     END get_total_payments_made;
179 
180     -----------------------------------------------------------------------
181     -- Function get_checkid returns the first Check ID for a
182     -- given Invoice ID.
183     FUNCTION get_checkid(l_invoice_id IN NUMBER)
184         RETURN NUMBER
185     IS
186         l_check_id   NUMBER;
187 
188     BEGIN
189 
190         SELECT check_id
191         INTO   l_check_id
192         FROM
193         (   SELECT ac.check_id check_id
194             FROM ap_invoice_payments aip,
195                  ap_checks ac
196             WHERE aip.check_id = ac.check_id
197             AND   aip.invoice_id = l_invoice_id
198             UNION ALL
199             SELECT ac.check_id check_id
200             FROM ap_invoice_payments aip,
201                  ap_checks ac,
202 	         ap_invoice_lines ail1,
203  	         ap_invoice_lines ail2,
204                  ap_invoice_distributions aid1,
205                  ap_invoice_distributions aid2
206             WHERE aip.check_id = ac.check_id
207             AND   ail1.invoice_id = l_invoice_id
208             AND   ail2.invoice_id = aip.invoice_id
209 	    AND   aid1.invoice_id = ail1.invoice_id
210 	    AND   aid1.invoice_line_number = ail1.line_number
211 	    AND   aid2.invoice_id = ail2.invoice_id
212 	    AND   aid2.invoice_line_number = ail2.line_number
213             AND  (ail1.line_type_lookup_code = 'PREPAY'  OR
214                   ail1.line_type_lookup_code = 'TAX'  AND
215                   aid1.prepay_tax_parent_id IS NOT NULL
216                  )
217             AND aid2.invoice_distribution_id = aid1.prepay_distribution_id
218         )
219         WHERE ROWNUM = 1;
220 
221 
222         RETURN(l_check_id);
223 
224 	EXCEPTION
225 	 WHEN no_data_found  THEN
226 	  return(null);
227 	 WHEN OTHERS THEN
228 	  raise;
229     END get_checkid;
230 
231     -----------------------------------------------------------------------
232     -- Function get_last_payment_date returns the Payment Date. If multiple
233     -- payments and advances are made for a particular invoice, then it
234     -- returns the most recent Payment Date
235     FUNCTION get_last_payment_date(l_invoice_id IN NUMBER)
236         RETURN DATE
237     IS
238         l_last_payment_date   DATE;
239 
240     BEGIN
241         SELECT MAX(check_date)
242 	INTO l_last_payment_date
243         FROM
244         (   SELECT ac.check_date check_date
245             FROM ap_invoice_payments aip,
246                  ap_checks ac
247             WHERE aip.check_id = ac.check_id
248             AND   aip.invoice_id = l_invoice_id
249             UNION ALL
250             SELECT ac.check_date check_date
251             FROM ap_invoice_payments aip,
252                  ap_checks ac,
253 	         ap_invoice_lines ail1,
254  	         ap_invoice_lines ail2,
255                  ap_invoice_distributions aid1,
256                  ap_invoice_distributions aid2
257             WHERE aip.check_id = ac.check_id
258             AND   ail1.invoice_id = l_invoice_id
259             AND   ail2.invoice_id = aip.invoice_id
260 	    AND   aid1.invoice_id = ail1.invoice_id
261 	    AND   aid1.invoice_line_number = ail1.line_number
262 	    AND   aid2.invoice_id = ail2.invoice_id
263 	    AND   aid2.invoice_line_number = ail2.line_number
264             AND  (ail1.line_type_lookup_code = 'PREPAY'  OR
265                   ail1.line_type_lookup_code = 'TAX'  AND
266                   aid1.prepay_tax_parent_id IS NOT NULL
267                  )
268             AND aid2.invoice_distribution_id = aid1.prepay_distribution_id
269         );
270 
271 
272         RETURN(l_last_payment_date);
273 
274 	EXCEPTION
275 	 WHEN no_data_found  THEN
276 	  return(null);
277 	 WHEN OTHERS THEN
278 	  raise;
279     END get_last_payment_date;
280 
281 FUNCTION get_prepay_amount_remaining(P_invoice_id IN number,
282                                      p_Invoice_num IN VARCHAR2,
283                                      p_employee_id IN NUMBER,
284                                      p_currency IN VARCHAR2,
285                                      P_header_id IN NUMBER DEFAULT NULL,
286                                      p_resp_id IN NUMBER DEFAULT NULL,
287                                      p_apps_id NUMBER DEFAULT NULL)
288 			       RETURN number
289 IS
290 
291 l_prepay_amt_invoiced NUMBER;
292 l_prepay_amt_expensed NUMBER;
293 l_prepay_amt_available NUMBER;
294 
295 BEGIN
296 
297      BEGIN
298         IF (nvl(FND_PROFILE.VALUE_SPECIFIC('OIE_CARRY_ADVANCES_FORWARD',NULL,p_resp_id,p_apps_id),'Y') = 'Y' )THEN
299 
300             SELECT SUM(nvl(prepay_amount_remaining,amount))
301             INTO  l_prepay_amt_invoiced
302             FROM  ap_invoice_distributions aid,ap_invoices ai
303             WHERE aid.invoice_id = P_invoice_id
304             AND   aid.line_type_lookup_code IN ('ITEM','TAX')
305             AND   nvl(aid.reversal_flag,'N') <> 'Y'
306             AND  ai.invoice_id = P_invoice_id
307             AND  ai.earliest_settlement_date IS NOT NULL
308             AND  ai.earliest_settlement_date <= trunc(SYSDATE);
309 
310 
311         ELSE
312             SELECT SUM(nvl(prepay_amount_remaining,amount))
313             INTO  l_prepay_amt_invoiced
314             FROM  ap_invoice_distributions aid,ap_invoices ai
315             WHERE aid.invoice_id = P_invoice_id
316             AND   aid.line_type_lookup_code IN ('ITEM','TAX')
317             AND   nvl(aid.reversal_flag,'N') <> 'Y'
318             AND  ai.invoice_id = P_invoice_id
319             AND  ai.earliest_settlement_date IS NOT NULL
320             AND  ai.earliest_settlement_date <= trunc(SYSDATE)
321             AND  nvl(prepay_amount_remaining,amount) = aid.amount;
322 
323         END IF;
324 
325      EXCEPTION WHEN NO_DATA_FOUND THEN
326         l_prepay_amt_invoiced := 0;
327      END;
328 
329      BEGIN
330 
331       IF(P_header_id IS NULL) THEN
332 
333         select nvl(sum(maximum_amount_to_apply),0)
334         INTO l_prepay_amt_expensed
335         from ap_expense_report_headers
336         where employee_id = p_employee_id
337         and vouchno = 0
338         and default_currency_code = p_currency
339         AND prepay_num = p_Invoice_num
340         AND advance_invoice_to_apply = P_invoice_id;
341 
342     ELSE
343 
344         select nvl(sum(maximum_amount_to_apply),0)
345         INTO l_prepay_amt_expensed
346         from ap_expense_report_headers
347         where employee_id = p_employee_id
348         and vouchno = 0
349         and default_currency_code = p_currency
350         AND prepay_num = p_Invoice_num
351         AND advance_invoice_to_apply = P_invoice_id
352         AND report_header_id <> P_header_id;
353 
354     END IF;
355 
356      EXCEPTION WHEN NO_DATA_FOUND THEN
357         l_prepay_amt_expensed :=0;
358      END ;
359 
360      l_prepay_amt_available := l_prepay_amt_invoiced - l_prepay_amt_expensed;
361 
362      IF l_prepay_amt_available < 0 OR (nvl(FND_PROFILE.VALUE_SPECIFIC('OIE_CARRY_ADVANCES_FORWARD',NULL,p_resp_id,p_apps_id),'Y') = 'N' AND l_prepay_amt_expensed > 0)THEN
363         l_prepay_amt_available := 0;
364      END IF;
365 
366      RETURN l_prepay_amt_available;
367 
368 EXCEPTION WHEN OTHERS THEN
369      RETURN 0;
370 END get_prepay_amount_remaining;
371 
372 FUNCTION get_prepay_balance(P_invoice_id IN number,
373                             p_Invoice_num IN VARCHAR2,
374                             p_employee_id IN NUMBER,
375                             p_currency IN VARCHAR2)
376 		       RETURN number
377 IS
378 
379 l_prepay_amt_invoiced NUMBER;
380 l_prepay_amt_expensed NUMBER;
381 l_prepay_amt_available NUMBER;
382 
383 BEGIN
384 
385      BEGIN
386          SELECT SUM(NVL(prepay_amount_remaining,amount))
387          INTO  l_prepay_amt_invoiced
388          FROM  ap_invoice_distributions aid,ap_invoices ai
389          WHERE aid.invoice_id = P_invoice_id
390          AND   aid.line_type_lookup_code IN ('ITEM','TAX')
391          AND   NVL(aid.reversal_flag,'N') <> 'Y'
392          AND  ai.invoice_id = P_invoice_id
393          AND  ai.earliest_settlement_date IS NOT NULL
394          AND  ai.earliest_settlement_date <= TRUNC(SYSDATE);
395 
396 
397          EXCEPTION WHEN NO_DATA_FOUND THEN
398             l_prepay_amt_invoiced := 0;
399      END;
400 
401      BEGIN
402 
403         SELECT NVL(SUM(maximum_amount_to_apply),0)
404         INTO l_prepay_amt_expensed
405         FROM ap_expense_report_headers
406         WHERE employee_id = p_employee_id
407         AND vouchno = 0
408         AND default_currency_code = p_currency
409         AND prepay_num = p_Invoice_num
410         AND advance_invoice_to_apply = P_invoice_id;
411 
412         EXCEPTION WHEN NO_DATA_FOUND THEN
413             l_prepay_amt_expensed :=0;
414      END ;
415 
416      l_prepay_amt_available := l_prepay_amt_invoiced - l_prepay_amt_expensed;
417 
418      RETURN l_prepay_amt_available;
419 
420      EXCEPTION WHEN OTHERS THEN
421      RETURN 0;
422 END get_prepay_balance;
423 
424 
425 FUNCTION get_line_prepay_balance(P_invoice_id IN number,
426                                  line_id IN NUMBER)
427 		       RETURN number
428 IS
429 
430 l_prepay_amt_available NUMBER;
431 
432 BEGIN
433 
434      BEGIN
435          SELECT SUM(NVL(aid.prepay_amount_remaining,aid.amount))
436          INTO  l_prepay_amt_available
437          FROM  ap_invoice_distributions aid,ap_invoice_lines al
438          WHERE aid.invoice_id = al.invoice_id
439          AND aid.invoice_line_number= al.line_number
440 	 and al.line_number=line_id
441          AND   aid.line_type_lookup_code IN ('ITEM','TAX')
442          AND   NVL(aid.reversal_flag,'N') <> 'Y'
443          AND  al.invoice_id = P_invoice_id;
444 
445 
446      END;
447 
448 
449       RETURN l_prepay_amt_available;
450 
451      EXCEPTION WHEN OTHERS THEN
452      RETURN 0;
453 END get_line_prepay_balance;
454 
455 
456 END AP_WEB_PAYMENTS_PKG;
457 
458