[Home] [Help]
PACKAGE BODY: APPS.OKE_ACTION_VALIDATIONS_PKG
Source
1 PACKAGE BODY OKE_ACTION_VALIDATIONS_PKG AS
2 /* $Header: OKEVDATB.pls 120.0 2005/05/25 17:47:01 appldev noship $ */
3
4 G_Yes CONSTANT VARCHAR2(1) := 'Y';
5 G_No CONSTANT VARCHAR2(1) := 'N';
6
7 L_req_list VARCHAR2(2000);
8 PROCEDURE Add_Attr_To_Required_List( name VARCHAR2 ) IS
9 l_msg VARCHAR2(2000) := NULL;
10 BEGIN
11 IF name LIKE 'OKE%' THEN
12 FND_MESSAGE.Set_Name ( 'OKE', name );
13 l_msg := FND_MESSAGE.Get;
14 ELSE
15 l_msg := name;
16 END IF;
17 IF L_req_list IS NOT NULL THEN
18 FND_MESSAGE.Set_Name ( 'OKE', 'OKE_LIST' ); -- 'START, END' for left2right and reverse for right2left
19 FND_MESSAGE.Set_Token ( 'START', L_req_list );
20 FND_MESSAGE.Set_Token ( 'END', L_msg );
21 L_req_list := FND_MESSAGE.Get;
22 ELSE
23 L_req_list := l_msg ;
24 END IF;
25 END Add_Attr_To_Required_List;
26
27
28 FUNCTION Check_Pjm ( P_Action_ID NUMBER
29 , P_Organization_ID NUMBER
30 , P_Project_ID NUMBER )
31 RETURN BOOLEAN IS
32
33 L_Value VARCHAR2(25);
34 L_ID NUMBER;
35 L_Prj_ID NUMBER;
36 L_Result BOOLEAN;
37 L_Msg VARCHAR2(2000);
38
39 CURSOR Org_C IS
40 SELECT 'X' FROM pjm_org_parameters
41 WHERE Organization_ID = L_ID
42 AND PROJECT_REFERENCE_ENABLED = 'Y';
43
44 CURSOR Prj_C IS
45 SELECT 'X' FROM pjm_project_parameters
46 WHERE Organization_ID = L_ID
47 AND Project_ID = L_Prj_ID;
48
49
50 BEGIN
51
52 -- Validate inventory org against pjm
53 L_ID := P_Organization_ID;
54 OPEN Org_C;
55 FETCH Org_C INTO L_Value;
56 CLOSE Org_C;
57
58 IF L_Value IS NULL THEN
59
60 L_Result := TRUE;
61 ELSE
62
63 L_Value := NULL;
64 -- Validate project with pjm
65 IF P_Project_ID IS NOT NULL THEN
66 L_Prj_ID := P_Project_ID;
67
68 OPEN Prj_C;
69 FETCH Prj_C INTO L_Value;
70 CLOSE Prj_C;
71
72 IF L_Value IS NULL THEN
73 --FND_MESSAGE.Set_Name('OKE', 'OKE_PROJECT_NOT_SETUP');
74 --L_Msg := FND_MESSAGE.Get;
75 -- l_msg := 'Project is not set up in project manufacturing';
76 -- Add_Msg ( P_Action_ID, L_Msg );
77 L_Result := FALSE;
78 ELSE
79 L_Result := TRUE;
80 END IF;
81 END IF;
82 END IF;
83
84
85 RETURN L_Result;
86
87 END Check_Pjm;
88
89 PROCEDURE Add_Msg ( P_Action_ID NUMBER
90 , P_Msg VARCHAR2 ) IS
91
92 L_ID NUMBER;
93 L_Name VARCHAR2(120);
94 L_Number VARCHAR2(120);
95
96 CURSOR c IS
97 SELECT pa_action_id
98 FROM oke_deliverable_actions
99 WHERE action_id = p_action_id;
100
101 BEGIN
102 OPEN c;
103 FETCH c INTO L_ID;
104 CLOSE c;
105
106 PA_DELIVERABLE_UTILS.Get_Action_Detail ( p_dlvr_action_ver_id => L_ID
107 , x_name => L_Name
108 , x_number => L_Number );
109 FND_MESSAGE.Set_Name ( 'PA', 'PA_ACTION_NAME_ERR');
110 FND_MESSAGE.Set_Token ( 'ACTION_NAME', L_Name );
111 FND_MESSAGE.Set_Token ( 'MESSAGE', P_Msg );
112 FND_MSG_PUB.Add;
113
114 END Add_Msg;
115
116
117 FUNCTION Validate_Mds ( P_Action_ID NUMBER
118 , P_Deliverable_ID NUMBER
119 , P_Task_ID NUMBER
120 , P_Ship_From_Org_ID NUMBER
121 , P_Ship_From_Location_ID NUMBER
122 , P_Ship_To_Org_ID NUMBER
123 , P_Ship_To_Location_ID NUMBER
124 , P_Schedule_Designator VARCHAR2
125 , P_Expected_Date DATE
126 , P_Quantity NUMBER
127 , P_Uom_Code VARCHAR2 ) RETURN VARCHAR2 IS
128
129 l_ret VARCHAR2(1) := G_YES;
130 L_Item_ID NUMBER;
131 L_Org_ID NUMBER;
132 L_Qty NUMBER;
133 L_Project_ID NUMBER;
134 l_dummy VARCHAR2(1);
135 L_Uom_Code VARCHAR2(30);
136 L_Msg VARCHAR2(2000);
137
138 CURSOR c1 IS
139 SELECT b.item_id
140 , b.inventory_org_id
141 , b.quantity
142 , b.uom_code
143 , b.project_id
144 FROM oke_deliverables_b b
145 WHERE b.deliverable_id = p_deliverable_id;
146
147 CURSOR c2 IS
148 SELECT '!'
149 FROM oke_system_items_v
150 WHERE id1 = l_item_id
151 AND organization_id = l_org_id
152 AND NVL(shippable_item_flag, 'N') = 'Y';
153
154 CURSOR c3 IS
155 SELECT '!'
156 FROM oke_deliverable_actions b
157 WHERE b.Action_ID = p_Action_ID
158 AND (b.deliverable_id = p_deliverable_id or b.deliverable_id is null and p_deliverable_id is null)
159 AND (b.Task_ID = p_Task_ID or b.Task_ID is null and p_Task_ID is null)
160 AND (b.Ship_From_Org_ID = p_Ship_From_Org_ID or b.Ship_From_Org_ID is null and p_Ship_From_Org_ID is null)
161 AND (b.Ship_From_Location_ID = p_Ship_From_Location_ID or b.Ship_From_Location_ID is null and p_Ship_From_Location_ID is null)
162 AND (b.Ship_To_Org_ID = p_Ship_To_Org_ID or b.Ship_To_Org_ID is null and p_Ship_To_Org_ID is null)
163 AND (b.Ship_To_Location_ID = p_Ship_To_Location_ID or b.Ship_To_Location_ID is null and p_Ship_To_Location_ID is null)
164 AND (b.Expected_Date = p_Expected_Date or b.Expected_Date is null and p_Expected_Date is null)
165 AND (b.Schedule_Designator = p_Schedule_Designator or b.Schedule_Designator is null and p_Schedule_Designator is null)
166 AND (b.Quantity = p_Quantity or b.Quantity is null and p_Quantity is null)
167 AND (b.Uom_Code = p_Uom_Code or b.Uom_Code is null and p_Uom_Code is null)
168 ;
169
170 BEGIN
171
172 FND_MSG_PUB.Initialize;
173 L_req_list := NULL;
174
175 l_dummy := NULL;
176 OPEN c3;
177 FETCH c3 INTO l_dummy;
178 CLOSE c3;
179
180 IF l_dummy IS NULL THEN
181 FND_MESSAGE.Set_Name ( 'OKE', 'OKE_SAVE_BEFORE_PROCEED' );
182 FND_MSG_PUB.Add;
183 RETURN G_NO;
184 END IF;
185
186 OPEN c1;
187 FETCH c1 INTO L_Item_ID, L_Org_ID, L_Qty, L_Uom_Code, L_Project_ID;
188 CLOSE c1;
189
190 IF P_Task_ID IS NULL THEN
191 Add_Attr_To_Required_List('OKE_DTS_REQ_TASK');
192 END IF;
193
194 IF L_Item_ID IS NULL THEN
195 Add_Attr_To_Required_List('OKE_DTS_REQ_ITEM');
196 END IF;
197
198 IF NVL ( L_Org_ID, P_Ship_From_Org_ID ) IS NULL THEN
199 Add_Attr_To_Required_List('OKE_DTS_REQ_ORG');
200 END IF;
201
202 IF L_Qty IS NULL THEN
203 Add_Attr_To_Required_List('OKE_DTS_REQ_QTY');
204 END IF;
205
206 IF L_Uom_Code IS NULL THEN
207 Add_Attr_To_Required_List('OKE_DTS_REQ_UOM');
208 END IF;
209
210 IF NOT Check_Pjm ( P_Action_ID, L_Org_ID, L_Project_ID ) THEN
211 -- l_msg := 'PJM setup is required';
212 FND_MESSAGE.Set_Name('OKE', 'OKE_DTS_NO_PJM_SETUP');
213 L_Msg := FND_MESSAGE.Get;
214 Add_Msg ( P_Action_ID, L_Msg );
215 l_ret := G_NO;
216 END IF;
217
218 IF P_Expected_Date IS NULL THEN
219 Add_Attr_To_Required_List('OKE_DTS_REQ_DATE');
220 ELSIF P_Expected_Date < Trunc( SYSDATE ) THEN
221 -- l_msg := 'The date is past due';
222 FND_MESSAGE.Set_Name('OKE', 'OKE_DTS_EXP_DATE_PAST' );
223 L_Msg := FND_MESSAGE.Get;
224 Add_Msg ( P_Action_ID, L_Msg );
225 l_ret := G_NO;
226 END IF;
227
228 IF P_Schedule_Designator IS NULL THEN
229 Add_Attr_To_Required_List('OKE_DTS_DATA_PLAN');
230 END IF;
231
232 IF L_req_list IS NOT NULL THEN
233 -- l_msg := 'The following data are required: ' || L_req_list;
234 FND_MESSAGE.Set_Name('OKE', 'OKE_DTS_MISS_REQ_DATA');
235 FND_MESSAGE.Set_Token ( 'DATA', L_req_list );
236 L_Msg := FND_MESSAGE.Get;
237 Add_Msg ( P_Action_ID, L_Msg );
238 l_ret := G_NO;
239 END IF;
240
241 RETURN l_ret;
242
243 EXCEPTION
244 WHEN OTHERS THEN
245 Add_Msg ( P_Action_ID, sqlerrm );
246 RETURN G_NO;
247
248 END Validate_MDS;
249
250 FUNCTION Validate_WSH ( P_Action_ID NUMBER
251 , P_Deliverable_ID NUMBER
252 , P_Task_ID NUMBER
253 , P_Ship_From_Org_ID NUMBER
254 , P_Ship_From_Location_ID NUMBER
255 , P_Ship_To_Org_ID NUMBER
256 , P_Ship_To_Location_ID NUMBER
257 , P_Expected_Date DATE
258 , P_Volume NUMBER
259 , P_Volume_Uom VARCHAR2
260 , P_Weight NUMBER
261 , P_Weight_Uom VARCHAR2
262 , P_Quantity NUMBER
263 , P_Uom_Code VARCHAR2 )
264 RETURN VARCHAR2 IS
265
266 L_Item_ID NUMBER;
267 L_Org_ID NUMBER;
268 L_Qty NUMBER;
269 l_Dummy VARCHAR2(1);
270 l_ret VARCHAR2(1) := G_YES;
271 L_Uom_Code VARCHAR2(30);
272 L_Msg VARCHAR2(2000);
273 L_Desc VARCHAR2(2000);
274 Item_Based BOOLEAN := TRUE;
275 L_ID NUMBER;
276 L_Project_ID NUMBER;
277
278 CURSOR c1 IS
279 SELECT b.item_id
280 , b.inventory_org_id
281 , b.source_deliverable_id
282 , b.project_id, 'x'
283 FROM oke_deliverables_b b
284 WHERE b.deliverable_id = p_deliverable_id
285 AND b.source_code = 'PA';
286
287 CURSOR c2 IS
288 SELECT 'x'
289 FROM oke_system_items_v
290 WHERE id1 = l_item_id
291 AND organization_id = l_org_id
292 AND NVL(shippable_item_flag, 'N') = 'Y';
293
294 BEGIN
295
296 FND_MSG_PUB.Initialize;
297 L_req_list := NULL;
298
299 l_dummy := NULL;
300 OPEN c1;
301 FETCH c1 INTO L_Item_ID, L_Org_ID, L_ID, L_Project_ID, l_dummy;
302 CLOSE c1;
303
304 IF l_dummy IS NULL THEN
305 FND_MESSAGE.Set_Name ( 'OKE', 'OKE_SAVE_BEFORE_PROCEED' );
306 FND_MSG_PUB.Add;
307 RETURN G_NO;
308 END IF;
309
310 IF P_Quantity IS NULL THEN
311 Add_Attr_To_Required_List('OKE_DTS_REQ_QTY');
312 END IF;
313
314 IF P_Uom_Code IS NULL THEN
315 Add_Attr_To_Required_List('OKE_DTS_REQ_UOM');
316 END IF;
317
318 IF P_Task_ID IS NULL THEN
319 Add_Attr_To_Required_List('OKE_DTS_REQ_TASK');
320 END IF;
321
322 IF PA_DELIVERABLE_UTILS.Is_Dlvr_Item_Based ( p_deliverable_id => L_ID ) = 'Y' THEN
323
324 IF L_Item_ID IS NULL THEN
325 Add_Attr_To_Required_List('OKE_DTS_REQ_ITEM');
326 END IF;
327
328 IF NVL ( L_Org_ID, P_Ship_From_Org_ID ) IS NULL THEN
329 Add_Attr_To_Required_List('OKE_DTS_REQ_ORG');
330 ELSE
331 l_dummy := NULL;
332 OPEN c2;
333 FETCH c2 INTO l_dummy;
334 CLOSE c2;
335
336 IF l_Dummy IS NULL THEN
337 -- l_msg := 'Item is not shippable';
338 FND_MESSAGE.Set_Name ( 'OKE', 'OKE_DTS_ITEM_NOSHIP');
339 L_Msg := FND_MESSAGE.Get;
340 Add_Msg ( P_Action_ID, L_Msg );
341 l_ret := G_NO;
342 END IF;
343 END IF;
344
345 ELSE
346 IF P_Volume IS NULL OR P_Volume_UOM IS NULL OR P_Weight IS NULL OR P_Weight_UOM IS NULL THEN
347 Add_Attr_To_Required_List('OKE_DTS_REQ_VOLUME');
348 END IF;
349
350 L_Desc := PA_DELIVERABLE_UTILS.Get_Deliverable_Description ( P_Deliverable_ID => L_ID );
351 IF L_Desc IS NULL THEN
352 Add_Attr_To_Required_List('OKE_DTS_REQ_DESC');
353 END IF;
354 END IF;
355
356
357 IF P_Ship_To_Location_ID IS NULL THEN
358 Add_Attr_To_Required_List('OKE_DTS_REQ_SHIPTO');
359 END IF;
360
361 IF P_Ship_From_Location_ID IS NULL THEN
362 Add_Attr_To_Required_List('OKE_DTS_REQ_SHIPFROM');
363 END IF;
364
365 IF P_Expected_Date IS NULL THEN
366 Add_Attr_To_Required_List('OKE_DTS_REQ_DATE');
367 ELSIF P_Expected_Date < Trunc( SYSDATE ) THEN
368 -- l_msg := 'The date is past due';
369 FND_MESSAGE.Set_Name('OKE', 'OKE_DTS_EXP_DATE_PAST_WSH' );
370 L_Msg := FND_MESSAGE.Get;
371 Add_Msg ( P_Action_ID, L_Msg );
372 l_ret := G_NO;
373 END IF;
374
375 IF NOT Check_Pjm ( P_Action_ID, L_Org_ID, L_Project_ID ) THEN
376 -- l_msg := 'PJM setup is required';
377 FND_MESSAGE.Set_Name('OKE', 'OKE_DTS_NO_PJM_SETUP');
378 L_Msg := FND_MESSAGE.Get;
379 Add_Msg ( P_Action_ID, L_Msg );
380 l_ret := G_NO;
381 END IF;
382
383 IF L_req_list IS NOT NULL THEN
384 -- l_msg := 'The following data are required: ' || L_req_list;
385 FND_MESSAGE.Set_Name('OKE', 'OKE_DTS_MISS_REQ_DATA');
386 FND_MESSAGE.Set_Token ( 'DATA', L_req_list );
387 L_Msg := FND_MESSAGE.Get;
388 Add_Msg ( P_Action_ID, L_Msg );
389 l_ret := G_NO;
390 END IF;
391
392 RETURN l_ret;
393
394 EXCEPTION
395 WHEN OTHERS THEN
396 Add_Msg ( P_Action_ID, sqlerrm );
397 RETURN G_NO;
398
399 END Validate_Wsh;
400
404 , P_Ship_From_Org_ID NUMBER
401 FUNCTION Validate_Req ( P_Action_ID NUMBER
402 , P_Deliverable_ID NUMBER
403 , P_Task_ID NUMBER
405 , P_Ship_From_Location_ID NUMBER
406 , P_Ship_To_Org_ID NUMBER
407 , P_Ship_To_Location_ID NUMBER
408 , P_Expected_Date DATE
409 , P_Destination_Type_Code VARCHAR2
410 , P_Requisition_Line_Type_ID NUMBER
411 , P_Category_ID NUMBER
412 , P_Currency_Code VARCHAR2
413 , P_Quantity NUMBER
414 , P_UOM_Code VARCHAR2
415 , P_Unit_Price NUMBER
416 , P_Rate_Type VARCHAR2
417 , P_Rate_Date DATE
418 , P_Exchange_Rate NUMBER
419 , P_Expenditure_Type_Code VARCHAR2
420 , P_Expenditure_Organization_Id NUMBER
421 , P_Expenditure_Item_Date DATE )
422 RETURN VARCHAR2 IS
423
424 L_Item_ID NUMBER;
425 L_Org_ID NUMBER;
426 L_Qty NUMBER;
427 l_Dummy VARCHAR2(1);
428 l_ret VARCHAR2(1) := G_YES;
429 L_Uom_Code VARCHAR2(30);
430 L_Msg VARCHAR2(2000);
431 L_Desc VARCHAR2(2000);
432 Item_Based BOOLEAN := TRUE;
433 L_ID NUMBER;
434 L_Error_Code VARCHAR2(2000);
435 L_Currency_Code VARCHAR2(30);
436 L_Project_ID NUMBER;
437 L_Task_ID NUMBER;
438
439 -- PATC variables
440 l_msg_application VARCHAR2(5);
441 l_msg_type VARCHAR2(1);
442 l_msg_token1 VARCHAR2(200);
443 l_msg_token2 VARCHAR2(200);
444 l_msg_token3 VARCHAR2(200);
445 l_msg_count NUMBER;
446 l_billable_flag VARCHAR2(1);
447
448 CURSOR c1 IS
449 SELECT b.item_id ,
450 nvl(b.inventory_org_id,act.ship_to_org_id) org_id ,
451 b.project_id ,
452 b.source_deliverable_id, 'x'
453 FROM oke_deliverables_b b , oke_deliverable_actions act
454 WHERE b.deliverable_id = P_Deliverable_ID
455 and b.deliverable_id = act.Deliverable_ID
456 and act.action_id = p_action_id
457 AND b.source_code = 'PA' ;
458
459 CURSOR c2 IS
460 SELECT 'x'
461 FROM oke_system_items_v
462 WHERE id1 = l_item_id
463 AND organization_id = l_org_id
464 AND NVL(purchasing_enabled_flag, 'N') = 'Y';
465
466 cursor pi is
467 select 'OKE_DTS_EXP_PROJECT_INVALID'
468 from dual
469 where not exists (
470 select 'Project is valid'
471 from pa_projects_expend_v
472 where project_id = l_project_id )
473 union all
474 select 'OKE_PROJECT_NOT_SETUP'
475 from dual
476 where not exists (
477 select 'Project valid for PJM'
478 from pjm_project_parameters
479 where organization_id = l_org_id
480 and project_id = l_project_id )
481 union all
482 select 'OKE_DTS_EXP_TASK_INVALID'
483 from dual
484 where not exists (
485 select 'Task valid and chargeable'
486 from pa_tasks_expend_v t
487 where project_id = l_project_id
488 and task_id = l_task_id
489 and chargeable_flag = 'Y' )
490 union all
491 select 'OKE_TASK_REQUIRED'
492 from dual
493 where not exists (
494 select 'Task Reference OK'
495 from pjm_org_parameters
496 where organization_id = l_org_id
497 and not ( project_control_level = 2
498 and l_task_id is null )
499 );
500
501 cursor pe is
502 select 'OKE_DTS_EXP_PROJECT_INVALID'
503 from dual
504 where not exists (
505 select 'Project is valid'
506 from pa_projects_expend_v
507 where project_id = l_project_id )
508 union all
509 select 'OKE_DTS_EXP_TASK_INVALID'
510 from dual
511 where not exists (
512 select 'Task is valid and chargeable'
513 from pa_tasks_expend_v
514 where project_id = l_project_id
515 and task_id = l_task_id
516 and chargeable_flag = 'Y' )
517 union all
518 select 'OKE_DTS_EXP_DATE_INVALID'
519 from dual
520 where not exists (
521 select 'Date is valid for task'
522 from pa_tasks t
523 , pa_projects_all p
524 where t.project_id = l_project_id
525 and t.task_id = l_task_id
526 and p.project_id = t.project_id
527 and p_expenditure_item_date
528 between nvl(t.start_date , nvl(p.start_date , p_expenditure_item_date - 1))
529 and nvl(t.completion_date , nvl(p.completion_date , p_expenditure_item_date + 1)) )
530 union all
531 select 'OKE_DTS_EXP_TYPE_INVALID'
532 from dual
533 where not exists (
534 select 'Expenditure Type exists and is valid'
535 from pa_expenditure_types_expend_v
536 where expenditure_type = p_expenditure_type_code
537 and system_linkage_function = 'VI' )
538 union all
539 select 'OKE_DTS_EXP_ORG_INVALID'
540 from dual
541 where not exists (
542 select 'Expenditure Org exists and is valid'
543 from pa_organizations_expend_v
544 where organization_id = p_expenditure_organization_id );
545
546 CURSOR c3 ( P_ID NUMBER ) IS
547 SELECT 'x'
548 FROM gl_sets_of_books gl, org_organization_definitions org
549 WHERE org.organization_id = P_ID
550 AND gl.Set_Of_Books_ID = org.Set_Of_Books_ID
551 AND gl.currency_code = p_currency_code;
552
553 BEGIN
554
555 FND_MSG_PUB.Initialize;
556 L_req_list := NULL;
557
558 l_dummy := NULL;
559 OPEN c1;
560 FETCH c1 INTO L_Item_ID, L_Org_ID, L_Project_ID, L_ID, l_dummy;
561 CLOSE c1;
562
563 IF l_dummy IS NULL THEN
564 FND_MESSAGE.Set_Name ( 'OKE', 'OKE_SAVE_BEFORE_PROCEED' );
565 FND_MSG_PUB.Add;
566 RETURN G_NO;
570 Add_Attr_To_Required_List('OKE_DTS_DEST_TYPE');
567 END IF;
568
569 IF P_Destination_Type_Code IS NULL THEN
571 END IF;
572
573 IF P_Task_ID IS NULL THEN
574 Add_Attr_To_Required_List('OKE_DTS_REQ_TASK');
575 END IF;
576
577 IF P_Uom_Code IS NULL THEN
578 Add_Attr_To_Required_List('OKE_DTS_REQ_UOM');
579 END IF;
580
581 Item_Based := PA_DELIVERABLE_UTILS.Is_Dlvr_Item_Based ( p_deliverable_id => L_ID ) = 'Y';
582 IF Item_Based THEN
583
584 IF L_Item_ID IS NULL THEN
585 Add_Attr_To_Required_List('OKE_DTS_REQ_ITEM');
586 ELSE
587 l_dummy := NULL;
588 OPEN c2;
589 FETCH c2 INTO l_dummy;
590 CLOSE c2;
591 IF l_dummy IS NULL THEN
592 -- l_msg := 'Item not purchasable';
593 FND_MESSAGE.Set_Name ( 'OKE', 'OKE_DTS_ITEM_NOPO');
594 L_Msg := FND_MESSAGE.Get;
595 Add_Msg ( P_Action_ID, L_Msg );
596 l_ret := G_NO;
597 END IF;
598
599 END IF;
600
601 IF NVL ( L_Org_ID, P_Ship_From_Org_ID ) IS NULL THEN
602 Add_Attr_To_Required_List('OKE_DTS_REQ_ORG');
603 END IF;
604
605 ELSE -- if Non Item Based
606
607 IF P_Requisition_Line_Type_ID IS NULL THEN
608 Add_Attr_To_Required_List('OKE_DTS_REQ_LINE_TYPE');
609 END IF;
610
611 IF P_Category_ID IS NULL THEN
612 Add_Attr_To_Required_List('OKE_DTS_REQ_CATEGORY');
613 END IF;
614
615 L_Desc := PA_DELIVERABLE_UTILS.Get_Deliverable_Description ( p_deliverable_id => L_ID );
616 IF L_Desc IS NULL THEN
617 Add_Attr_To_Required_List('OKE_DTS_REQ_DESC');
618 END IF;
619
620 END IF;
621
622 IF P_Quantity IS NULL THEN
623 Add_Attr_To_Required_List('OKE_DTS_REQ_QTY');
624 END IF;
625
626 IF P_Ship_To_Location_ID IS NULL THEN
627 Add_Attr_To_Required_List('OKE_DTS_REQ_RECLOC');
628 END IF;
629
630 IF P_Expected_Date IS NULL THEN
631 Add_Attr_To_Required_List('OKE_DTS_REQ_DATE');
632 ELSIF P_Expected_Date < Trunc( SYSDATE ) THEN
633 -- l_msg := 'The date is past due';
634 FND_MESSAGE.Set_Name('OKE', 'OKE_DTS_EXP_DATE_PAST_REQ' );
635 L_Msg := FND_MESSAGE.Get;
636 Add_Msg ( P_Action_ID, L_Msg );
637 l_ret := G_NO;
638 END IF;
639
640 IF P_Destination_Type_Code = 'EXPENSE' AND L_Item_ID > 0 THEN
641 IF P_Expenditure_Organization_ID IS NULL THEN
642 Add_Attr_To_Required_List('OKE_DTS_REQ_EXP_ORG');
643 END IF;
644 IF P_Expenditure_Item_Date IS NULL THEN
645 Add_Attr_To_Required_List('OKE_DTS_REQ_EXP_DATE');
646 END IF;
647 IF P_Expenditure_Type_Code IS NULL THEN
648 Add_Attr_To_Required_List('OKE_DTS_REQ_EXP_TYPE');
649 END IF;
650 END IF;
651
652 l_dummy := null;
653 OPEN c3 ( L_Org_ID );
654 FETCH c3 INTO l_dummy;
655 CLOSE c3;
656
657 IF l_dummy IS NULL THEN
658 IF P_Exchange_Rate IS NULL THEN
659 Add_Attr_To_Required_List('OKE_DTS_REQ_RATE');
660 END IF;
661 END IF;
662
663 IF L_req_list IS NOT NULL THEN
664 -- l_msg := 'The following data are required: ' || L_req_list;
665 FND_MESSAGE.Set_Name('OKE', 'OKE_DTS_MISS_REQ_DATA');
666 FND_MESSAGE.Set_Token ( 'DATA', L_req_list );
667 L_Msg := FND_MESSAGE.Get;
668 Add_Msg ( P_Action_ID, L_Msg );
669 l_ret := G_NO;
670 END IF;
671
672 L_Task_ID := P_Task_ID;
673 IF ( P_Destination_Type_Code = 'INVENTORY' ) then
674
675 l_error_code := NULL;
676 open pi;
677 loop
678 fetch pi into l_error_code;
679 exit when pi%notfound;
680 FND_MESSAGE.Set_Name('OKE' , l_error_code);
681 FND_MSG_PUB.Add;
682 end loop;
683 close pi;
684 if ( l_error_code is not null ) then
685 l_ret := G_NO;
686 end if;
687
688 IF NOT Check_Pjm ( P_Action_ID, L_Org_ID, L_Project_ID ) THEN
689 -- l_msg := 'PJM setup is required';
690 FND_MESSAGE.Set_Name('OKE', 'OKE_DTS_NO_PJM_SETUP');
691 L_Msg := FND_MESSAGE.Get;
692 Add_Msg ( P_Action_ID, L_Msg );
693 l_ret := G_NO;
694 END IF;
695
696 ELSE -- Destination_Type_Code = 'EXPENSE'
697
698 l_error_code := NULL;
699 open pe;
700 loop
701 fetch pe into l_error_code;
702 exit when pe%notfound;
703 FND_MESSAGE.Set_Name('OKE' , l_error_code);
704 L_Msg := FND_MESSAGE.Get;
705 Add_Msg ( P_Action_ID, L_Msg );
706 end loop;
707 close pe;
708 if ( l_error_code is not null ) then
709 l_ret := G_NO;
710 end if;
711
712 END IF;
713
714 IF l_ret = G_YES AND P_Destination_Type_Code = 'EXPENSE' THEN
715 PATC.get_status(
716 X_project_id => L_Project_ID
717 , X_task_id => P_Task_ID
718 , X_ei_date => p_expenditure_item_date
719 , X_expenditure_type => P_Expenditure_Type_Code
720 , X_non_labor_resource => NULL --X_non_labor_resource --?
721 , X_person_id => NULL --X_person_id --?
722 , X_quantity => P_Quantity
723 , X_denom_currency_code => P_Currency_Code
724 -- , X_acct_currency_code => X_acct_currency_code --?
725 , X_denom_raw_cost => P_Unit_Price
726 -- , X_acct_raw_cost => X_acct_raw_cost --?
727 , X_acct_rate_type => P_Rate_Type
728 , X_acct_rate_date => P_RATE_DATE
729 , X_acct_exchange_rate =>P_EXCHANGE_RATE
730 -- , X_transfer_ei => X_transfer_ei
731 , X_incurred_by_org_id => P_Expenditure_Organization_ID
732 , X_msg_application => l_msg_application
733 , X_msg_type => l_msg_type
734 , X_msg_token1 => l_msg_token1
735 , X_msg_token2 => l_msg_token2
736 , X_msg_token3 => l_msg_token3
737 , X_msg_count => l_msg_count
738 , X_status => l_msg
739 , X_billable_flag => l_billable_flag
740 );
741
742 IF l_msg IS NOT NULL THEN
743 FND_MESSAGE.SET_NAME(l_Msg_Application, l_msg);
744 IF l_Msg_Token1 IS NOT NULL THEN
745 FND_MESSAGE.SET_TOKEN('patc_msg_token1', l_Msg_Token1);
746 END IF;
747 IF l_Msg_Token2 IS NOT NULL THEN
748 FND_MESSAGE.SET_TOKEN('patc_msg_token2', l_Msg_Token2);
749 END IF;
750 IF l_Msg_Token3 IS NOT NULL THEN
751 FND_MESSAGE.SET_TOKEN('patc_msg_token3', l_Msg_Token3);
752 END IF;
753 FND_MSG_PUB.Add;
754 l_ret := G_NO;
755 END IF;
756 END IF;
757
758 RETURN l_ret;
759
760 EXCEPTION
761 WHEN OTHERS THEN
762 Add_Msg ( P_Action_ID, sqlerrm );
763 RETURN G_NO;
764
765 END Validate_Req;
766
767 FUNCTION Exchange_Rate ( P_Orig_Code VARCHAR2
768 , P_Target_Code VARCHAR2
769 , P_Rate_Type VARCHAR2
770 , P_Date DATE ) RETURN NUMBER IS
771 ConvAmt number;
772 Numerator number;
773 Denom number;
774 Rate number;
775 Func_Code varchar2(30);
776 Unit_Price number := 0;
777
778 BEGIN
779 IF P_Orig_Code <> P_Target_Code THEN
780 GL_CURRENCY_API.Convert_Amount
781 ( X_From_Currency => P_Orig_Code
782 , X_To_Currency => P_Target_Code
783 , X_Conversion_Date => P_Date
784 , X_Conversion_Type => P_Rate_Type
785 , X_Amount => Unit_Price
786 , X_Converted_Amount => ConvAmt
787 , X_Denominator => Denom
788 , X_Numerator => Numerator
789 , X_Rate => Rate
790 );
791 RETURN Rate;
792 ELSE
793 RETURN NULL;
794 END IF;
795
796 EXCEPTION
797 WHEN OTHERS THEN
798 RETURN NULL;
799 END Exchange_Rate;
800
801 FUNCTION Functional_Currency ( P_Org_ID NUMBER ) RETURN VARCHAR2 IS
802
803 L_Currency_Code VARCHAR2(30);
804 CURSOR c IS
805 SELECT gl.Currency_Code
806 FROM gl_sets_of_books gl, org_organization_definitions org
807 WHERE org.ORGANIZATION_ID = P_Org_ID
808 AND gl.Set_Of_Books_ID = org.Set_Of_Books_ID;
809
810 BEGIN
811
812 OPEN c;
813 FETCH c INTO L_Currency_Code;
814 CLOSE c;
815
816 RETURN L_Currency_Code;
817
818 EXCEPTION
819 WHEN OTHERS THEN
820 RETURN NULL;
821 END Functional_Currency;
822
823 FUNCTION Get_Location_Description ( P_ID NUMBER ) RETURN VARCHAR2 IS
824 l_return_val VARCHAR2(240);
825
826 CURSOR c_hr IS
827 SELECT nvl(description,'')
828 FROM hr_locations_all
829 WHERE location_id=p_id;
830
831 CURSOR c_hz IS
832 SELECT substr(address1,1,240)
833 FROM hz_locations
834 WHERE location_id=p_id;
835
836 CURSOR c_both IS
837 SELECT description
838 FROM hr_locations
839 WHERE location_id=p_id;
840
841 BEGIN
842
843 OPEN c_hr;
844 FETCH c_hr INTO l_return_val;
845 IF c_hr%NOTFOUND THEN
846 OPEN c_hz;
847 FETCH c_hz INTO l_return_val;
848 IF c_hz%NOTFOUND THEN
849 l_return_val:='ERROR-NO SUCH LOCATION_ID';
850 END IF;
851 CLOSE c_hz;
852 END IF;
853 CLOSE c_hr;
854 RETURN l_return_val;
855
856 END;
857
858 END;
859