1 PACKAGE BODY IGC_CC_COMMON_UTILS_PVT AS
2 /*$Header: IGCUTILB.pls 120.2.12010000.3 2009/01/10 04:55:45 vensubra ship $*/
3
4 -- -----------------------------------------------------------------------
5 -- Declare global variables.
6 -- -----------------------------------------------------------------------
7 G_PKG_NAME CONSTANT VARCHAR2(30):= 'IGC_CC_COMMON_UTILS_PVT';
8 l_debug_mode VARCHAR2(1) := NVL(FND_PROFILE.VALUE('IGC_DEBUG_ENABLED'),'N');
9
10 PROCEDURE Put_Debug_Msg (
11 p_debug_msg IN VARCHAR2
12 );
13
14 /*=======================================================================+
15 | PROCEDURE Put_Debug_Msg |
16 | |
17 | Note : This is a private function to output any debug information if |
18 | debug is enabled for the system to determine any issue that |
19 | may be happening at customer site. |
20 | |
21 | Parameters : |
22 | |
23 | Parameters for Procedure to process properly. |
24 | |
25 | p_debug_msg This is the message that is to be output to log for |
26 | debugging purposes. |
27 | |
28 +=======================================================================*/
29 PROCEDURE Put_Debug_Msg (
30 p_debug_msg IN VARCHAR2
31 ) IS
32
33 -- Constants :
34
35 l_Return_Status VARCHAR2(1);
36 l_api_name CONSTANT VARCHAR2(30) := 'Put_Debug_Msg';
37 l_prod VARCHAR2(3) := 'IGC';
38 l_sub_comp VARCHAR2(3) := 'CC';
39 l_profile_name VARCHAR2(255) := 'IGC_DEBUG_LOG_DIRECTORY';
40
41 BEGIN
42
43 IGC_MSGS_PKG.Put_Debug_Msg (p_debug_message => p_debug_msg,
44 p_profile_log_name => l_profile_name,
45 p_prod => l_prod,
46 p_sub_comp => l_sub_comp,
47 p_filename_val => NULL,
48 x_Return_Status => l_Return_Status
49 );
50 IF (l_Return_Status <> FND_API.G_RET_STS_SUCCESS) THEN
51 raise FND_API.G_EXC_ERROR;
52 END IF;
53
54 RETURN;
55
56 -- --------------------------------------------------------------------
57 -- Exception handler section for the Put_Debug_Msg procedure.
58 -- --------------------------------------------------------------------
59 EXCEPTION
60
61 WHEN FND_API.G_EXC_ERROR THEN
62 RETURN;
63
64 WHEN OTHERS THEN
65 IF (FND_MSG_PUB.Check_Msg_Level (FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR)) THEN
66 FND_MSG_PUB.Add_Exc_Msg (G_PKG_NAME, l_api_name);
67 END IF;
68 RETURN;
69
70 END Put_Debug_Msg;
71
72 /*=======================================================================+
73 | PROCEDURE Get_Header_Desc
74 | |
75 | Note : This procedure is designed to get the descriptions of all the |
76 | coded fields stored at the header level in igc_cc_headers |
77 | It is used by forms like IGCCSUMM to get the descriptions |
78 | of the field to be displayed to the user. |
79 | |
80 | |
81 | Parameters : |
82 | |
83 | Standard header params for Public Procedures. |
84 | |
85 | p_api_version Version number for API to run |
86 | p_init_msg_list Message stack to be initialized flag |
87 | p_commit Is work to be commited here flag |
88 | p_validation_level Validation Level to be performed |
89 | p_return_status Status returned from Procedure |
90 | p_msg_count Number of messages on stack returned |
91 | p_msg_data Message text information returned |
92 | |
93 | Parameters for Procedure to process properly. |
94 | p_cc_header_id igc_cc_headers.cc_header_id |
95 | |
96 +=======================================================================*/
97 PROCEDURE Get_Header_Desc
98 (
99 p_api_version IN NUMBER,
100 p_init_msg_list IN VARCHAR2 := FND_API.G_FALSE,
101 p_commit IN VARCHAR2 := FND_API.G_FALSE,
102 p_validation_level IN NUMBER := FND_API.G_VALID_LEVEL_FULL,
103 p_return_status OUT NOCOPY VARCHAR2,
104 p_msg_count OUT NOCOPY NUMBER,
105 p_msg_data OUT NOCOPY VARCHAR2,
106
107 p_cc_header_id IN NUMBER,
108 p_type_desc OUT NOCOPY VARCHAR2,
109 p_state_desc OUT NOCOPY VARCHAR2,
110 p_apprvl_status_desc OUT NOCOPY VARCHAR2,
111 p_ctrl_status_desc OUT NOCOPY VARCHAR2,
112 p_cc_owner_name OUT NOCOPY VARCHAR2,
113 p_cc_preparer_name OUT NOCOPY VARCHAR2,
114 p_cc_access_level OUT NOCOPY VARCHAR2,
115 p_vendor_name OUT NOCOPY VARCHAR2,
116 p_bill_to_location OUT NOCOPY VARCHAR2,
117 p_vendor_site_code OUT NOCOPY VARCHAR2,
118 p_vendor_contact OUT NOCOPY VARCHAR2,
119 p_vendor_number OUT NOCOPY VARCHAR2,
120 p_term_name OUT NOCOPY VARCHAR2,
121 p_parent_cc_num OUT NOCOPY VARCHAR2,
122 p_vendor_hold_flag OUT NOCOPY VARCHAR2)
123 IS
124
125 CURSOR c_get_header (p_cc_header_id IN NUMBER)
126 IS
127 SELECT cc_header_id,
128 cc_type,
129 cc_state,
130 cc_ctrl_status,
131 cc_encmbrnc_status,
132 cc_apprvl_status,
133 vendor_id,
134 vendor_site_id,
135 vendor_contact_id,
136 term_id,
137 location_id,
138 cc_owner_user_id,
139 cc_preparer_user_id,
140 parent_header_id
141 FROM igc_cc_headers_all
142 WHERE cc_header_id = p_cc_header_id;
143
144
145 l_header_rec c_get_header%ROWTYPE;
146
147 l_msg_count NUMBER;
148 l_msg_data VARCHAR2(2000);
149 l_Return_Status VARCHAR2(1);
150 l_validation_error BOOLEAN := FALSE;
151 l_api_name CONSTANT VARCHAR2(30) := 'Get_Header_Desc';
152 l_api_version CONSTANT NUMBER := 1.0;
153
154 BEGIN
155
156 IF NOT FND_API.Compatible_API_Call ( l_api_version,
157 p_api_version,
158 l_api_name,
159 G_PKG_NAME )
160 THEN
161 RAISE FND_API.G_EXC_UNEXPECTED_ERROR ;
162 END IF;
163
164 IF FND_API.to_Boolean ( p_init_msg_list ) THEN
165 FND_MSG_PUB.initialize ;
166 END IF;
167
168 -- --------------------------------------------------------------------
169 -- Initialize Return status
170 -- --------------------------------------------------------------------
171 p_return_status := FND_API.G_RET_STS_SUCCESS;
172
173 OPEN c_get_header (p_cc_header_id);
174 FETCH c_get_header INTO l_header_rec;
175 CLOSE c_get_header;
176
177 -- CC Type
178 BEGIN
179 SELECT lkpt.meaning
180 INTO p_type_desc
181 FROM fnd_lookups lkpt
182 WHERE lkpt.lookup_code = l_header_rec.cc_type
183 AND lkpt.lookup_type = 'IGC_CC_TYPE';
184 EXCEPTION
185 WHEN NO_DATA_FOUND THEN
186 p_type_desc := NULL ;
187 END;
188
189 -- CC State
190 BEGIN
191 SELECT lkpt.meaning
192 INTO p_state_desc
193 FROM fnd_lookups lkpt
194 WHERE lkpt.lookup_code = l_header_rec.cc_state
195 AND lkpt.lookup_type = 'IGC_CC_STATE';
196 EXCEPTION
197 WHEN NO_DATA_FOUND THEN
198 p_state_desc := NULL;
199 END;
200
201 -- CC Apprvl Status
202 BEGIN
203 SELECT lkpt.meaning
204 INTO p_apprvl_status_desc
205 FROM fnd_lookups lkpt
206 WHERE lkpt.lookup_code = l_header_rec.cc_apprvl_status
207 AND lkpt.lookup_type = 'IGC_CC_APPROVAL_STATUS';
208 EXCEPTION
209 WHEN NO_DATA_FOUND THEN
210 p_apprvl_status_desc := NULL;
211 END;
212
213 -- CC Ctrl Status
214 BEGIN
215 SELECT lkpt.meaning
216 INTO p_ctrl_status_desc
217 FROM fnd_lookups lkpt
218 WHERE lkpt.lookup_code = l_header_rec.cc_ctrl_status
219 AND lkpt.lookup_type = 'IGC_CC_CONTROL_STATUS';
220 EXCEPTION
221 WHEN NO_DATA_FOUND THEN
222 p_ctrl_status_desc := NULL;
223 END;
224
225 -- Vendor Name
226 -- Vendor Number
227 -- Vendor Site Code
228 BEGIN
229 SELECT pv.vendor_name,
230 pv.segment1,
231 pv.hold_flag,
232 pvs.vendor_site_code
233 INTO p_vendor_name,
234 p_vendor_number,
235 p_vendor_hold_flag,
236 p_vendor_site_code
237 FROM po_vendors pv,
238 po_vendor_sites_all pvs
239 WHERE pv.vendor_id = l_header_rec.vendor_id
240 AND pvs.vendor_site_id = l_header_rec.vendor_site_id
241 AND pvs.vendor_id = pv.vendor_id;
242 EXCEPTION
243 WHEN NO_DATA_FOUND THEN
244 p_vendor_name := NULL;
245 p_vendor_number := NULL;
246 p_vendor_site_code := NULL;
247 p_vendor_hold_flag := NULL;
248 END;
249
250 -- Vendor Contact
251 BEGIN
252 SELECT pvc.first_name ||' '|| pvc.last_name
253 INTO p_vendor_contact
254 FROM po_vendor_contacts pvc
255 WHERE pvc.vendor_contact_id (+) = l_header_rec.vendor_contact_id;
256 EXCEPTION
257 WHEN NO_DATA_FOUND THEN
258 p_vendor_contact := NULL;
259 END;
260
261 -- Preparer User Name
262 BEGIN
263 SELECT fup.user_name
264 INTO p_cc_preparer_name
265 FROM fnd_user fup
266 WHERE fup.user_id = l_header_rec.cc_preparer_user_id;
267 EXCEPTION
268 WHEN NO_DATA_FOUND THEN
269 p_cc_preparer_name := NULL;
270 END;
271
272 -- Owner User Name
273 BEGIN
274 SELECT fuo.user_name
275 INTO p_cc_owner_name
276 FROM fnd_user fuo
277 WHERE fuo.user_id = l_header_rec.cc_owner_user_id;
278 EXCEPTION
279 WHEN NO_DATA_FOUND THEN
280 p_cc_owner_name := NULL;
281 END;
282
283 -- Term Name
284 BEGIN
285 SELECT apt.name
286 INTO p_term_name
287 FROM ap_terms apt
288 WHERE apt.term_id = l_header_rec.term_id;
289 EXCEPTION
290 WHEN NO_DATA_FOUND THEN
291 p_term_name := NULL;
292 END;
293
294 -- Bill to Location
295 BEGIN
296 SELECT hrl.location_code
297 INTO p_bill_to_location
298 FROM hr_locations hrl
299 WHERE hrl.location_id = l_header_rec.location_id;
300 EXCEPTION
301 WHEN NO_DATA_FOUND THEN
302 p_bill_to_location := NULL;
303 END;
304
305 -- Parent CC Num
306 BEGIN
307 SELECT cch.cc_num
308 INTO p_parent_cc_num
309 FROM igc_cc_headers_all cch
310 WHERE cch.cc_header_id = l_header_rec.parent_header_id;
311 EXCEPTION
312 WHEN NO_DATA_FOUND THEN
313 p_parent_cc_num := NULL;
314 END;
315
316 -- Access Level
317 p_cc_access_level := SUBSTR(IGC_CC_ACCESS_PKG.get_access_level
318 (l_header_rec.cc_header_id,
319 FND_GLOBAL.USER_ID,
320 l_header_rec.cc_preparer_user_id,
321 l_header_rec.cc_owner_user_id), 1, 1);
322
323 FND_MSG_PUB.Count_And_Get ( p_count => p_msg_count,
324 p_data => p_msg_data );
325
326 RETURN;
327
328 -- -------------------------------------------------------------------------
329 -- Exception handler section for the Validate_CCID procedure.
330 -- -------------------------------------------------------------------------
331 EXCEPTION
332
333 WHEN FND_API.G_EXC_ERROR THEN
334
335 p_return_status := FND_API.G_RET_STS_ERROR;
336 FND_MSG_PUB.Count_And_Get ( p_count => p_msg_count,
337 p_data => p_msg_data );
338 RETURN;
339
340 WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
341
342 p_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
343 FND_MSG_PUB.Count_And_Get ( p_count => p_msg_count,
344 p_data => p_msg_data );
345 RETURN;
346
347 WHEN OTHERS THEN
348
349 p_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
350 IF FND_MSG_PUB.Check_Msg_Level (FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR) THEN
351 FND_MSG_PUB.Add_Exc_Msg ( G_PKG_NAME,
352 l_api_name);
353 END IF;
354
355 FND_MSG_PUB.Count_And_Get ( p_count => p_msg_count,
356 p_data => p_msg_data );
357 RETURN;
358
359 END Get_Header_Desc;
360
361
362 FUNCTION DATE_IS_VALID(x_form_name VARCHAR2,
363 x_gl_date gl_period_statuses.start_date%type,
364 x_po_header_id po_headers_all.po_header_id%type,
365 x_po_line_id po_lines_all.po_line_id%type,
366 x_line_location_id po_line_locations_all.line_location_id%type,
367 x_po_distribution_id po_distributions_all.po_distribution_id%type,
368 x_po_dist_num po_distributions_all.distribution_num%type,
369 x_shipment_num po_line_locations_all.shipment_num%type,
370 x_line_num po_lines_all.line_num%type)
371 RETURN BOOLEAN
372 IS
373
374 l_cc_num po_headers.segment1%type; /* cc number */
375 l_pf_date igc_cc_det_pf.cc_det_pf_date%type; /* Payment forecast date */
376 l_CC_STATE igc_cc_headers.cc_state%type;
377 l_CC_CTRL_STATUS igc_cc_headers.CC_CTRL_STATUS%type;
378 l_CC_ENCMBRNC_STATUS igc_cc_headers.CC_ENCMBRNC_STATUS%type;
379 l_CC_APPRVL_STATUS igc_cc_headers.CC_APPRVL_STATUS%type;
380 l_status BOOLEAN; /* holds value whether the CC can be matched or not */
381 l_fiscal_year_invoice gl_period_statuses.period_year%type; /* fiscal year of invoice */
382 l_fiscal_year_pf gl_period_statuses.period_year%type; /* fiscal year of specific Payment Forecast line */
383 l_period gl_period_statuses.period_name%TYPE;
384 l_open_gl_date gl_period_statuses.start_date%type; /* Holds the next open gl date */
385 l_gl_date gl_period_statuses.start_date%type;
386 l_cc_det_pf_date igc_cc_det_pf.cc_det_pf_date%type;
387 l_shipment_num po_line_locations_all.shipment_num%type;
388 l_line_location_id po_line_locations_all.line_location_id%type;
389
390 -- Cursor to get the account line id value
391 CURSOR c_acct_line(p_cc_num IN po_headers.segment1%type)
392 IS
393 SELECT CC_acct_LINE_ID
394 FROM IGC_CC_ACCT_LINES
395 WHERE cc_header_id = (SELECT cc_header_id
396 FROM IGC_CC_HEADERS
397 WHERE CC_NUM = p_cc_num)
398 AND CC_ACCT_LINE_NUM = x_shipment_num;
399
400 -- Cursor to get the distribution numbers of all the distributions for the CC
401 CURSOR for_each_dist_in_po(p_cc_num IN po_headers.segment1%type)
402 IS
403 SELECT distribution_num
404 FROM po_distributions
405 WHERE po_header_id = x_po_header_id
406 AND po_line_id = x_po_line_id
407 AND line_location_id = x_line_location_id;
408
409 -- Cursors for the call from Invoice Gateway
410 CURSOR c_get_po_line_id(p_po_header_id po_headers_all.po_header_id%type)
411 IS SELECT po_line_id
412 FROM po_lines
413 WHERE po_header_id = p_po_header_id;
414
415 CURSOR c_get_shipment_num(p_po_line_id po_lines_all.po_line_id%type)
416 IS SELECT line_location_id, shipment_num
417 FROM po_line_locations
418 WHERE po_line_id = p_po_line_id;
419
420 CURSOR c_get_cc_acct_line_id(p_shipment_num po_line_locations.shipment_num%type)
421 IS SELECT cc_acct_line_id
422 FROM igc_cc_acct_lines
423 WHERE cc_header_id = (SELECT cc_header_id
424 FROM IGC_CC_HEADERS
425 WHERE CC_NUM = l_cc_num)
426 AND cc_acct_line_num = p_shipment_num;
427
428 CURSOR c_get_distribution_num(p_po_line_id po_lines_all.po_line_id%type,
429 p_line_location_id po_line_locations.line_location_id%type)
430 IS SELECT distribution_num
431 FROM po_distributions
432 WHERE po_header_id = x_po_header_id
433 AND po_line_id = p_po_line_id
434 AND line_location_id = p_line_location_id;
435
436
437 BEGIN
438 l_status := TRUE;
439 l_open_gl_date := NULL;
440 l_gl_date := x_gl_date;
441
442 /* Get the GL period is open or not */
443 l_period := AP_UTILITIES_PKG.get_current_gl_date(l_gl_date);
444
445 IF (l_period IS NULL) THEN
446 ----------------------------------------------------------------------
447 -- Get gl_period and Date from a future period
448 ----------------------------------------------------------------------
449 AP_UTILITIES_PKG.get_open_gl_date
450 (l_gl_Date,
451 l_period,
452 l_open_gl_date
453 );
454 l_gl_date := l_open_gl_date;
455
456 IF (l_gl_date IS NULL) THEN
457 FND_MESSAGE.SET_NAME('SQLAP','AP_DISTS_NO_OPEN_FUT_PERIOD');
458 APP_EXCEPTION.RAISE_EXCEPTION;
459 END IF;
460 END IF;
461
462 /* cc number is stored in the segment1 so get it */
463 BEGIN
464 SELECT segment1
465 INTO l_cc_num
466 FROM po_headers
467 WHERE po_header_id = x_po_header_id;
468 EXCEPTION
469 WHEN OTHERS THEN
470 FND_MESSAGE.SET_NAME('IGC', 'IGC_LOGGING_UNEXP_ERROR');
471 FND_MESSAGE.SET_TOKEN('CODE', SQLCODE);
472 FND_MESSAGE.SET_TOKEN('MSG', SQLERRM);
473 APP_EXCEPTION.RAISE_EXCEPTION;
474 END;
475
476
477 /* Get the different status of the CC */
478 BEGIN
479 SELECT CC_STATE,
480 CC_CTRL_STATUS,
481 CC_ENCMBRNC_STATUS,
482 CC_APPRVL_STATUS
483 INTO l_CC_STATE,
484 l_CC_CTRL_STATUS,
485 l_CC_ENCMBRNC_STATUS,
486 l_CC_APPRVL_STATUS
487 FROM IGC_CC_HEADERS
488 WHERE CC_NUM = l_cc_num;
489 EXCEPTION
490 /* No need to check for validation if its a PO, bug # 5687596*/
491 WHEN NO_DATA_FOUND THEN
492 RETURN TRUE;
493 WHEN OTHERS THEN
494 FND_MESSAGE.SET_NAME('IGC', 'IGC_LOGGING_UNEXP_ERROR');
495 FND_MESSAGE.SET_TOKEN('CODE', SQLCODE);
496 FND_MESSAGE.SET_TOKEN('MSG', SQLERRM);
497 APP_EXCEPTION.RAISE_EXCEPTION;
498 END;
499
500
501 /* Check whether the status of the CC is valid to be matched */
502 IF l_CC_STATE = 'CM'
503 AND l_CC_CTRL_STATUS = 'O'
504 AND l_CC_ENCMBRNC_STATUS = 'C'
505 AND l_CC_APPRVL_STATUS = 'AP' THEN
506
507 /* Get the fiscal year of the invoice */
508 BEGIN
509 SELECT DISTINCT period_year
510 INTO l_fiscal_year_invoice
511 FROM gl_period_statuses
512 WHERE set_of_books_id = (SELECT set_of_books_id
513 FROM AP_SYSTEM_PARAMETERS)
514 AND l_gl_date BETWEEN START_DATE AND END_DATE;
515 EXCEPTION
516 WHEN OTHERS THEN
517 FND_MESSAGE.SET_NAME('IGC', 'IGC_LOGGING_UNEXP_ERROR');
518 FND_MESSAGE.SET_TOKEN('CODE', SQLCODE);
519 FND_MESSAGE.SET_TOKEN('MSG', SQLERRM);
520 APP_EXCEPTION.RAISE_EXCEPTION;
521 END;
522
523 IF x_form_name = 'APXINWKB' THEN
524 /* Check whether it is the Match button(dist id is NULL) that is pressed or the Distribute button */
525 IF x_po_dist_num IS NULL THEN
526
527 /*Loop through each account line */
528 FOR c_acct_line1 IN c_acct_line(l_cc_num)
529 LOOP
530 /*Loop through each of the distributions in PO */
531 FOR c_for_each_dist_in_po1 IN for_each_dist_in_po(l_cc_num)
532 LOOP
533 /*Loop and get the pf date of only those Payment Forecast lines which
534 * have corresponding distribution line in
535 * po_distributions*/
536 BEGIN
537 SELECT CC_DET_PF_DATE
538 INTO l_cc_det_pf_date
539 FROM IGC_CC_DET_PF
540 WHERE CC_acct_LINE_ID = c_acct_line1.cc_acct_line_id
541 AND cc_det_pf_line_num = c_for_each_dist_in_po1.distribution_num;
542
543 EXCEPTION
544 WHEN OTHERS THEN
545 FND_MESSAGE.SET_NAME('IGC', 'IGC_LOGGING_UNEXP_ERROR');
546 FND_MESSAGE.SET_TOKEN('CODE', SQLCODE);
547 FND_MESSAGE.SET_TOKEN('MSG', SQLERRM);
548 APP_EXCEPTION.RAISE_EXCEPTION;
549 END;
550
551 /* Get the fiscal year for the Payment Forecast Date */
552 BEGIN
553 SELECT DISTINCT period_year
554 INTO l_fiscal_year_pf
555 FROM gl_period_statuses
556 WHERE set_of_books_id = (SELECT set_of_books_id
557 FROM AP_SYSTEM_PARAMETERS)
558 AND l_CC_DET_PF_DATE BETWEEN START_DATE AND END_DATE;
559 EXCEPTION
560 WHEN OTHERS THEN
561 FND_MESSAGE.SET_NAME('IGC', 'IGC_LOGGING_UNEXP_ERROR');
562 FND_MESSAGE.SET_TOKEN('CODE', SQLCODE);
563 FND_MESSAGE.SET_TOKEN('MSG', SQLERRM);
564 APP_EXCEPTION.RAISE_EXCEPTION;
565 END;
566
567 /* Even if one Payment Forecast Date fiscal year does not match
568 the fiscal year of the invoice stop processing and return false */
569 IF (l_fiscal_year_invoice = l_fiscal_year_pf) THEN
570 l_status := TRUE;
571 ELSE
572 RETURN FALSE;
573 END IF;
574 END LOOP;
575
576 END LOOP;
577 ELSE
578 /* Distribute button is pressed and a specific Distribution line is being matched */
579 BEGIN
580 /* Get the Payment Forecast Date for that particular distribution line*/
581 SELECT CC_DET_PF_DATE
582 INTO l_pf_date
583 FROM IGC_CC_DET_PF
584 WHERE CC_acct_LINE_ID = (SELECT CC_acct_LINE_ID
585 FROM IGC_CC_ACCT_LINES
586 WHERE cc_header_id = (SELECT cc_header_id
587 FROM IGC_CC_HEADERS
588 WHERE CC_NUM = l_cc_num)
589 AND CC_ACCT_LINE_NUM = x_shipment_num)
590 AND CC_DET_PF_LINE_NUM = x_po_dist_num;
591 EXCEPTION
592 WHEN OTHERS THEN
593 FND_MESSAGE.SET_NAME('IGC', 'IGC_LOGGING_UNEXP_ERROR');
594 FND_MESSAGE.SET_TOKEN('CODE', SQLCODE);
595 FND_MESSAGE.SET_TOKEN('MSG', SQLERRM);
596 APP_EXCEPTION.RAISE_EXCEPTION;
597 END;
598
599
600 /* Get the fiscal year for the Payment Forecast Date */
601 BEGIN
602 SELECT DISTINCT period_year
603 INTO l_fiscal_year_pf
604 FROM gl_period_statuses
605 WHERE set_of_books_id = (SELECT set_of_books_id
606 FROM AP_SYSTEM_PARAMETERS)
607 AND l_pf_date BETWEEN START_DATE AND END_DATE;
608 EXCEPTION
609 WHEN OTHERS THEN
610 FND_MESSAGE.SET_NAME('IGC', 'IGC_LOGGING_UNEXP_ERROR');
611 FND_MESSAGE.SET_TOKEN('CODE', SQLCODE);
612 FND_MESSAGE.SET_TOKEN('MSG', SQLERRM);
613 APP_EXCEPTION.RAISE_EXCEPTION;
614 END;
615
616
617
618 IF (l_fiscal_year_invoice = l_fiscal_year_pf) THEN
619 l_status := TRUE;
620 ELSE
621 RETURN FALSE;
622 END IF;
623
624 END IF;
625 -- The function is called from Invoice Gateway form
626 -- Eight cases needs to be handled
627 -- a. Only PO number is entered so check the dates of the pf lines belonging to
628 -- each of the lines and their shipments
629 -- b. PO number and line number are entered so check the dates of the pf lines
630 -- belonging to that line number and its corresponding shipments
631 -- c. PO number,line number and shipment number is entered so check the dates of
632 -- pf lines belonging only to that shipment number and line number.
633 -- d. PO number, line number, shipment number and distribution is entered so check
634 -- date only for that specfic pf line
635 -- e. PO number and shipment number entered.
636 -- f. PO number and distribution number entered.
637 -- g. PO number, shipment number and distribution number entered.
638 -- h. PO number, line number and distribution number entered.
639 ELSIF x_form_name = 'APXIISIM' THEN
640 -- Case a: Only PO number is entered so check for all the lines,shipments and distributions
641 IF x_line_num IS NULL AND x_shipment_num IS NULL AND x_po_dist_num IS NULL THEN
642
643 FOR c_get_po_line_id1 IN c_get_po_line_id(x_po_header_id)
644 LOOP
645 FOR c_get_shipment_num1 IN c_get_shipment_num(c_get_po_line_id1.po_line_id)
646 LOOP
647 FOR c_get_cc_acct_line_id1 IN c_get_cc_acct_line_id(c_get_shipment_num1.shipment_num)
648 LOOP
649 FOR c_get_distribution_num1 IN c_get_distribution_num(c_get_po_line_id1.po_line_id,
650 c_get_shipment_num1.line_location_id)
651
652 LOOP
653 BEGIN
654 SELECT cc_det_pf_date
655 INTO l_cc_det_pf_date
656 FROM igc_cc_det_pf
657 WHERE cc_acct_line_id = c_get_cc_acct_line_id1.cc_acct_line_id
658 AND cc_det_pf_line_num = c_get_distribution_num1.distribution_num;
659 EXCEPTION
660 WHEN OTHERS THEN
661 FND_MESSAGE.SET_NAME('IGC', 'IGC_LOGGING_UNEXP_ERROR');
662 FND_MESSAGE.SET_TOKEN('CODE', SQLCODE);
663 FND_MESSAGE.SET_TOKEN('MSG', SQLERRM);
664 APP_EXCEPTION.RAISE_EXCEPTION;
665 END;
666
667
668 BEGIN
669 SELECT DISTINCT period_year
670 INTO l_fiscal_year_pf
671 FROM gl_period_statuses
672 WHERE set_of_books_id = (SELECT set_of_books_id
673 FROM AP_SYSTEM_PARAMETERS)
674 AND l_cc_det_pf_date BETWEEN START_DATE AND END_DATE;
675 EXCEPTION
676 WHEN OTHERS THEN
677 FND_MESSAGE.SET_NAME('IGC', 'IGC_LOGGING_UNEXP_ERROR');
678 FND_MESSAGE.SET_TOKEN('CODE', SQLCODE);
679 FND_MESSAGE.SET_TOKEN('MSG', SQLERRM);
680 APP_EXCEPTION.RAISE_EXCEPTION;
681 END;
682
683 IF (l_fiscal_year_invoice = l_fiscal_year_pf) THEN
684 l_status := TRUE;
685 ELSE
686 RETURN FALSE;
687 END IF;
688
689 END LOOP;
690 END LOOP;
691 END LOOP;
692 END LOOP;
693
694 -- Case b: Only PO number and line number is entered so check for all the shipments and its
695 -- distributions
696 ELSIF x_line_num IS NOT NULL AND x_shipment_num IS NULL AND x_po_dist_num IS NULL THEN
697
698 FOR c_get_shipment_num1 IN c_get_shipment_num(x_po_line_id)
699 LOOP
700 FOR c_get_cc_acct_line_id1 IN c_get_cc_acct_line_id(c_get_shipment_num1.shipment_num)
701 LOOP
702 FOR c_get_distribution_num1 IN c_get_distribution_num(x_po_line_id,
703 c_get_shipment_num1.line_location_id)
704
705 LOOP
706 BEGIN
707 SELECT cc_det_pf_date
708 INTO l_cc_det_pf_date
709 FROM igc_cc_det_pf
710 WHERE cc_acct_line_id = c_get_cc_acct_line_id1.cc_acct_line_id
711 AND cc_det_pf_line_num = c_get_distribution_num1.distribution_num;
712 EXCEPTION
713 WHEN OTHERS THEN
714 FND_MESSAGE.SET_NAME('IGC', 'IGC_LOGGING_UNEXP_ERROR');
715 FND_MESSAGE.SET_TOKEN('CODE', SQLCODE);
716 FND_MESSAGE.SET_TOKEN('MSG', SQLERRM);
717 APP_EXCEPTION.RAISE_EXCEPTION;
718 END;
719
720 BEGIN
721 SELECT DISTINCT period_year
722 INTO l_fiscal_year_pf
723 FROM gl_period_statuses
724 WHERE set_of_books_id = (SELECT set_of_books_id
725 FROM AP_SYSTEM_PARAMETERS)
726 AND l_cc_det_pf_date BETWEEN START_DATE AND END_DATE;
727 EXCEPTION
728 WHEN OTHERS THEN
729 FND_MESSAGE.SET_NAME('IGC', 'IGC_LOGGING_UNEXP_ERROR');
730 FND_MESSAGE.SET_TOKEN('CODE', SQLCODE);
731 FND_MESSAGE.SET_TOKEN('MSG', SQLERRM);
732 APP_EXCEPTION.RAISE_EXCEPTION;
733 END;
734
735
736 IF (l_fiscal_year_invoice = l_fiscal_year_pf) THEN
737 l_status := TRUE;
738 ELSE
739 RETURN FALSE;
740 END IF;
741
742 END LOOP;
743 END LOOP;
744 END LOOP;
745
746 -- Cases c and e : Po number, Line number(may or may not be entered), Shipment number is entered so
747 -- check for all the distributions
748
749 ELSIF x_shipment_num IS NOT NULL AND x_po_dist_num IS NULL THEN
750
751 FOR c_get_cc_acct_line_id1 IN c_get_cc_acct_line_id(x_shipment_num)
752 LOOP
753 FOR c_get_distribution_num1 IN c_get_distribution_num(x_po_line_id,
754 x_line_location_id)
755
756 LOOP
757 BEGIN
758 SELECT cc_det_pf_date
759 INTO l_cc_det_pf_date
760 FROM igc_cc_det_pf
761 WHERE cc_acct_line_id = c_get_cc_acct_line_id1.cc_acct_line_id
762 AND cc_det_pf_line_num = c_get_distribution_num1.distribution_num;
763 EXCEPTION
764 WHEN OTHERS THEN
765 FND_MESSAGE.SET_NAME('IGC', 'IGC_LOGGING_UNEXP_ERROR');
766 FND_MESSAGE.SET_TOKEN('CODE', SQLCODE);
767 FND_MESSAGE.SET_TOKEN('MSG', SQLERRM);
768 APP_EXCEPTION.RAISE_EXCEPTION;
769 END;
770
771 BEGIN
772 SELECT DISTINCT period_year
773 INTO l_fiscal_year_pf
774 FROM gl_period_statuses
775 WHERE set_of_books_id = (SELECT set_of_books_id
776 FROM AP_SYSTEM_PARAMETERS)
777 AND l_cc_det_pf_date BETWEEN START_DATE AND END_DATE;
778 EXCEPTION
779 WHEN OTHERS THEN
780 FND_MESSAGE.SET_NAME('IGC', 'IGC_LOGGING_UNEXP_ERROR');
781 FND_MESSAGE.SET_TOKEN('CODE', SQLCODE);
782 FND_MESSAGE.SET_TOKEN('MSG', SQLERRM);
783 APP_EXCEPTION.RAISE_EXCEPTION;
784 END;
785
786 IF (l_fiscal_year_invoice = l_fiscal_year_pf) THEN
787 l_status := TRUE;
788 ELSE
789 RETURN FALSE;
790 END IF;
791
792 END LOOP;
793 END LOOP;
794
795 -- Cases d, f, g and h:
796 ELSIF x_po_dist_num IS NOT NULL THEN
797
798 l_shipment_num := x_shipment_num;
799
800 IF x_shipment_num IS NULL THEN
801 BEGIN
802 SELECT line_location_id
803 INTO l_line_location_id
804 FROM po_distributions
805 WHERE po_distribution_id = x_po_distribution_id;
806
807
808 SELECT shipment_num
809 INTO l_shipment_num
810 FROM po_line_locations
811 WHERE line_location_id = l_line_location_id;
812 EXCEPTION
813 WHEN OTHERS THEN
814 FND_MESSAGE.SET_NAME('IGC', 'IGC_LOGGING_UNEXP_ERROR');
815 FND_MESSAGE.SET_TOKEN('CODE', SQLCODE);
816 FND_MESSAGE.SET_TOKEN('MSG', SQLERRM);
817 APP_EXCEPTION.RAISE_EXCEPTION;
818 END;
819
820 END IF;
821
822 FOR c_get_cc_acct_line_id1 IN c_get_cc_acct_line_id(l_shipment_num)
823 LOOP
824 BEGIN
825 SELECT cc_det_pf_date
826 INTO l_cc_det_pf_date
827 FROM igc_cc_det_pf
828 WHERE cc_acct_line_id = c_get_cc_acct_line_id1.cc_acct_line_id
829 AND cc_det_pf_line_num = x_po_dist_num;
830 EXCEPTION
831 WHEN OTHERS THEN
832 FND_MESSAGE.SET_NAME('IGC', 'IGC_LOGGING_UNEXP_ERROR');
833 FND_MESSAGE.SET_TOKEN('CODE', SQLCODE);
834 FND_MESSAGE.SET_TOKEN('MSG', SQLERRM);
835 APP_EXCEPTION.RAISE_EXCEPTION;
836 END;
837
838 BEGIN
839 SELECT DISTINCT period_year
840 INTO l_fiscal_year_pf
841 FROM gl_period_statuses
842 WHERE set_of_books_id = (SELECT set_of_books_id
843 FROM AP_SYSTEM_PARAMETERS)
844 AND l_cc_det_pf_date BETWEEN START_DATE AND END_DATE;
845 EXCEPTION
846 WHEN OTHERS THEN
847 FND_MESSAGE.SET_NAME('IGC', 'IGC_LOGGING_UNEXP_ERROR');
848 FND_MESSAGE.SET_TOKEN('CODE', SQLCODE);
849 FND_MESSAGE.SET_TOKEN('MSG', SQLERRM);
850 APP_EXCEPTION.RAISE_EXCEPTION;
851 END;
852
853 IF (l_fiscal_year_invoice = l_fiscal_year_pf) THEN
854 l_status := TRUE;
855 ELSE
856 RETURN FALSE;
857 END IF;
858
859 END LOOP;
860
861 END IF;
862 END IF;
863
864 END IF;
865 RETURN TRUE;
866
867 END DATE_IS_VALID;
868
869 /*=======================================================================+
870 | FUNCTION XML_REPORT_ENABLED
871 | |
872 | Note : This function is designed to decide if the xml report(s) is |
873 | to be triggered or not. Presently it returns true. In future |
874 | the function can be modified to incorporate profile options |
875 and return true/false based on conditions. |
876 +=======================================================================*/
877
878 FUNCTION XML_REPORT_ENABLED
879 RETURN BOOLEAN
880 IS
881 BEGIN
882 RETURN FALSE;
883 END XML_REPORT_ENABLED;
884
885 /*=======================================================================+
886 | PROCEDURE GET_XML_LAYOUT_INFO
887 | |
888 | Note : This procedure is designed to get layout information of the |
889 | xml report that is to be generated. |
890 | |
891 | Parameters : |
892 | |
893 | p_lang Language, takes the default value |
894 | when no value is obtained |
895 | p_terr Territory, takes the default value |
896 | when no value is obtained |
897 | p_lob_code BiPubllisher Code for the XML Report |
898 | p_application_short_name Short Name of the Application |
899 | p_template_code Template Code for the XML Report |
900 +=======================================================================*/
901
902 PROCEDURE GET_XML_LAYOUT_INFO(
903 p_lang IN OUT NOCOPY VARCHAR2,
904 p_terr IN OUT NOCOPY VARCHAR2,
905 p_lob_code IN VARCHAR2,
906 p_application_short_name IN VARCHAR2,
907 p_template_code IN VARCHAR2
908 )
909 IS
910 ls_lang VARCHAR2(10);
911 v_cnt NUMBER;
912 l_lang VARCHAR2(10);
913 CURSOR xml_cur
914 IS
915 SELECT LANGUAGE,
916 TERRITORY
917 FROM XDO_LOBS
918 WHERE LOB_CODE = p_lob_code
919 AND APPLICATION_SHORT_NAME = p_application_short_name
920 AND (LOB_TYPE = 'TEMPLATE'
921 OR LOB_TYPE = 'MLS_TEMPLATE')
922 AND LANGUAGE = p_lang
923 AND XDO_FILE_TYPE = 'XSL-FO';
924 BEGIN
925 SELECT SUBSTR(userenv('LANG'),1,4) INTO ls_lang FROM dual;
926 IF ls_lang = 'US' THEN
927 p_lang := 'en' ;
928 ELSE
929 p_lang := lower(ls_lang);
930 END IF;
931 OPEN xml_cur;
932 FETCH xml_cur INTO l_lang,p_terr;
933 v_cnt := xml_cur%rowcount;
934 CLOSE xml_cur;
935 IF v_cnt = 0 THEN
936 SELECT default_language,
937 default_territory
938 INTO l_lang,
939 p_terr
940 FROM XDO_TEMPLATES_B
941 WHERE TEMPLATE_CODE = p_template_code
942 AND APPLICATION_SHORT_NAME = p_application_short_name ;
943 END IF;
944 l_lang := p_lang;
945 END GET_XML_LAYOUT_INFO;
946
947
948
949 END IGC_CC_COMMON_UTILS_PVT;
950