DBA Data[Home] [Help]

PACKAGE BODY: APPS.AHL_VWP_PRICE_PVT

Source


1 PACKAGE BODY AHL_VWP_PRICE_PVT AS
2 /* $Header: AHLVVPRB.pls 120.5 2006/09/18 14:28:19 anraj noship $ */
3 
4 -- Define global internal variables
5 G_PKG_NAME VARCHAR2(30) := 'AHL_VWP_PRICE_PVT';
6 
7 /* $Header: AHLVVPRB.pls 120.5 2006/09/18 14:28:19 anraj noship $ */
8 -----------------------------------------------------------
9 -- PACKAGE
10 --    AHL_VWP_PRICE_PVT
11 --
12 -- PURPOSE
13 --    This package specification is a Private API for managing
14 --    APIs that integrate with Advanced Pricing
15 --    in Complex Maintainance, Repair and Overhauling(CMRO).
16 --
17 --    It defines the following APIs
18 --
19 --      Calculate_Totle_Price               (see below for specification)
20 --
21 -- NOTES
22 --
23 --
24 -- HISTORY
25 -- 02-Sep-2003    yazhou      Created.
26 --------------------------------------------------------------------
27 
28 PROCEDURE Calculate_Total_Price
29     (p_item_tbl             IN AHL_VWP_RULES_PVT.Item_Tbl_Type,
30      p_price_list_id        IN NUMBER,
31      p_customer_id          IN NUMBER,
32      p_currency_code        IN VARCHAR2,
33 
34      x_total_price          OUT NOCOPY NUMBER,
35      x_return_status        OUT NOCOPY VARCHAR2
36      );
37 
38 PROCEDURE Check_UOM_Class
39     (p_UOM_Code             IN VARCHAR2,
40      x_time_type_flag       OUT NOCOPY VARCHAR2
41      );
42 
43 --------------------------------------------------------------------
44 --  Procedure name    : Get_Task_Estimated_Price
45 --  Purpose           : To return estimated price for a given task.
46 --------------------------------------------------------------------
47 PROCEDURE Get_Task_Estimated_Price
48     (p_visit_task_id        IN NUMBER,
49      p_route_id             IN NUMBER,
50      p_price_list_id        IN NUMBER,
51      p_customer_id          IN NUMBER,
52      p_currency_code        IN VARCHAR2,
53      p_effective_date       IN DATE,
54      p_organization_id      IN NUMBER,
55 
56      x_estimated_price      OUT NOCOPY NUMBER,
57      x_return_status        OUT NOCOPY VARCHAR2
58      )
59 IS
60   -- Define local variables
61   l_x_return_status           VARCHAR2(240);
62   l_total_price               NUMBER := 0;   -- total price
63 
64   l_res_item_tbl              AHL_VWP_RULES_PVT.Item_Tbl_Type;
65   l_mat_item_tbl              AHL_VWP_RULES_PVT.Item_Tbl_Type;
66   l_x_item_tbl                AHL_VWP_RULES_PVT.Item_Tbl_Type;
67 
68   i                           NUMBER := 0;   -- table index
69   l_api_name       CONSTANT   VARCHAR2(30) := 'Get_Task_Estimated_Price';
70 
71 
72 BEGIN
73 
74   IF (FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
75 	FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE,
76                    'ahl.plsql.'||G_PKG_NAME||'.'||l_api_name||': Begin API',
77 			       'At the start of the procedure');
78 	FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE,
79                    'ahl.plsql.'||G_PKG_NAME||'.'||l_api_name||': End API',
80 			       'Visit Task ID: '|| p_visit_task_id);
81   END IF;
82 
83 --Initialize API return status to success
84   l_x_return_status := FND_API.G_RET_STS_SUCCESS;
85 
86 -- Get the items from Resource Requirements of the route
87 
88   Check_Item_for_Rt_Res_Req
89     (p_visit_task_id        =>p_visit_task_id ,
90      p_route_id             =>p_route_id ,
91      p_organization_id      =>p_organization_id ,
92      p_effective_date       =>p_effective_date,
93 
94      x_item_tbl             =>l_res_item_tbl ,
95      x_return_status        =>l_x_return_status
96      );
97 
98      IF (l_x_return_status <> FND_API.G_RET_STS_SUCCESS)  THEN
99           RAISE Fnd_Api.G_EXC_ERROR;
100      END IF;
101 
102      IF (FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
103 	     FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT,
104                    'ahl.plsql.'||G_PKG_NAME||'.'||l_api_name||': After Checking Items for Resource Requirements',
105 			       'Return Status is: '|| l_x_return_status);
106 	     FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT,
107                    'ahl.plsql.'||G_PKG_NAME||'.'||l_api_name||': After Checking Items for Resource Requirements',
108 			       'Number of Items: '||l_mat_item_tbl.COUNT );
109      END IF;
110 
111 -- Get the items from Material Requirements of the route
112 
113   Check_Item_for_Rt_Mat_Req
114     (p_visit_task_id        =>p_visit_task_id ,
115      p_route_id             =>p_route_id ,
116      p_effective_date       =>p_effective_date,
117 
118      x_item_tbl             =>l_mat_item_tbl ,
119      x_return_status        =>l_x_return_status
120      );
121 
122      IF (l_x_return_status <> FND_API.G_RET_STS_SUCCESS)  THEN
123           RAISE Fnd_Api.G_EXC_ERROR;
124      END IF;
125 
126      IF (FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
127 	     FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE,
128                    'ahl.plsql.'||G_PKG_NAME||'.'||l_api_name||': After Checking Items for Material Requirements',
129 			       'Return Status is: '|| l_x_return_status);
130 	     FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE,
131                    'ahl.plsql.'||G_PKG_NAME||'.'||l_api_name||': After Checking Items for Material Requirements',
132 			       'Number of Items: '||l_mat_item_tbl.COUNT );
133      END IF;
134 
135 -- Merge the two Item table to get the item table
136 -- that the same task, item and UOM combination appear only once
137 
138 
139     AHL_VWP_RULES_PVT.Merge_for_Unique_Items
140       (p_item_tbl1             =>l_res_item_tbl ,
141        p_item_tbl2             =>l_mat_item_tbl ,
142 
143        x_item_tbl              =>l_x_item_tbl
144       );
145 
146 
147      IF (FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
148 	     FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT,
149                    'ahl.plsql.'||G_PKG_NAME||'.'||l_api_name||': After Merge Items',
150 			       'Number of Items: '||l_x_item_tbl.COUNT );
151      END IF;
152 
153 -- Calculate the price for the items required by the route
154   IF l_x_item_tbl.count > 0 THEN
155 
156     Calculate_Total_Price
157       (p_item_tbl             =>l_x_item_tbl,
158        p_price_list_id        =>p_price_list_id ,
159        p_customer_id          =>p_customer_id ,
160        p_currency_code        =>p_currency_code ,
161 
162        x_total_price          =>l_total_price ,
163        x_return_status        =>l_x_return_status
164        );
165 
166   END IF;
167 
168   IF (l_x_return_status <> FND_API.G_RET_STS_SUCCESS)  THEN
169           RAISE Fnd_Api.G_EXC_ERROR;
170   END IF;
171 
172 -- Assign return status  and  Item without Price table
173   x_return_status:=l_x_return_status;
174   x_estimated_price := l_total_price;
175 
176   IF (FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
177 	FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE,
178                    'ahl.plsql.'||G_PKG_NAME||'.'||l_api_name||': End API',
179 			       'Return Status is: '|| x_return_status);
180 	FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE,
181                    'ahl.plsql.'||G_PKG_NAME||'.'||l_api_name||': End API',
182 			       'Total Price: '|| x_estimated_price);
183   END IF;
184 
185 
186 END Get_Task_Estimated_Price;
187 
188 --------------------------------------------------------------------
189 --  Procedure name    : Get_Job_Estimated_Price
190 --  Purpose           : To return estimated price for the job of a given task.
191 --------------------------------------------------------------------
192 PROCEDURE Get_Job_Estimated_Price
193     (p_visit_task_id        IN NUMBER,
194      p_price_list_id        IN NUMBER,
195      p_customer_id          IN NUMBER,
196      p_currency_code        IN VARCHAR2,
197 
198      x_estimated_price      OUT NOCOPY NUMBER,
199      x_return_status        OUT NOCOPY VARCHAR2
200      )
201 IS
202   -- Define local variables
203   l_x_return_status           VARCHAR2(240);
204   l_total_price               NUMBER := 0;   -- total price
205 
206   l_res_item_tbl              AHL_VWP_RULES_PVT.Item_Tbl_Type;
207   l_mat_item_tbl              AHL_VWP_RULES_PVT.Item_Tbl_Type;
208   l_x_item_tbl                AHL_VWP_RULES_PVT.Item_Tbl_Type;
209 
210   i                           NUMBER := 0;   -- table index
211   l_api_name       CONSTANT   VARCHAR2(30) := 'Get_Job_Estimated_Price';
212 
213 
214 BEGIN
215 
216   IF (FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
217 	FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE,
218                    'ahl.plsql.'||G_PKG_NAME||'.'||l_api_name||': Begin API',
219 			       'At the start of the procedure');
220 	FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE,
221                    'ahl.plsql.'||G_PKG_NAME||'.'||l_api_name||': End API',
222 			       'Visit Task ID: '|| p_visit_task_id);
223   END IF;
224 
225 --Initialize API return status to success
226   l_x_return_status := FND_API.G_RET_STS_SUCCESS;
227 
228 -- Get the items from Resource Requirements of the route
229 
230   Check_Item_for_Prod_Res_Req
231     (p_visit_task_id        =>p_visit_task_id ,
232 
233      x_item_tbl             =>l_res_item_tbl ,
234      x_return_status        =>l_x_return_status
235      );
236 
237      IF (FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
238 	     FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT,
239                    'ahl.plsql.'||G_PKG_NAME||'.'||l_api_name||': After Checking Items for Resource Requirements',
240 			       'Return Status is: '|| l_x_return_status);
241 	     FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT,
242                    'ahl.plsql.'||G_PKG_NAME||'.'||l_api_name||': After Checking Items for Resource Requirements',
243 			       'Number of Items: '||l_mat_item_tbl.COUNT );
244      END IF;
245 
246 -- Get the items from Material Requirements of the route
247 
248   Check_Item_for_Prod_Mat_Req
249     (p_visit_task_id        =>p_visit_task_id ,
250 
251      x_item_tbl             =>l_mat_item_tbl ,
252      x_return_status        =>l_x_return_status
253      );
254 
255      IF (FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
256 	     FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT,
257                    'ahl.plsql.'||G_PKG_NAME||'.'||l_api_name||': After Checking Items for Material Requirements',
258 			       'Return Status is: '|| l_x_return_status);
259 	     FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT,
260                    'ahl.plsql.'||G_PKG_NAME||'.'||l_api_name||': After Checking Items for Material Requirements',
261 			       'Number of Items: '||l_mat_item_tbl.COUNT );
262      END IF;
263 
264 -- Merge the two Item table to get the item table
265 -- that the same task, item and UOM combination appear only once
266 
267   AHL_VWP_RULES_PVT.Merge_for_Unique_Items
268     (p_item_tbl1             =>l_res_item_tbl ,
269      p_item_tbl2             =>l_mat_item_tbl ,
270 
271      x_item_tbl              =>l_x_item_tbl
272      );
273 
274 
275      IF (FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
276 	     FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT,
277                    'ahl.plsql.'||G_PKG_NAME||'.'||l_api_name||': After Merge Items',
278 			       'Number of Items: '||l_x_item_tbl.COUNT );
279      END IF;
280 
281 -- Calculate the price for the items required by the route
282 
283   IF l_x_item_tbl.count > 0 THEN
284 
285    Calculate_Total_Price
286     (p_item_tbl             =>l_x_item_tbl,
287      p_price_list_id        =>p_price_list_id ,
288      p_customer_id          =>p_customer_id ,
289      p_currency_code        =>p_currency_code ,
290 
291      x_total_price          =>l_total_price ,
292      x_return_status        =>l_x_return_status
293      );
294 
295   END IF;
296 
297 -- Assign return status  and  Item without Price table
298   x_return_status:=l_x_return_status;
299   x_estimated_price := l_total_price;
300 
301   IF (FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
302 	FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE,
303                    'ahl.plsql.'||G_PKG_NAME||'.'||l_api_name||': End API',
304 			       'Return Status is: '|| x_return_status);
305 	FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE,
306                    'ahl.plsql.'||G_PKG_NAME||'.'||l_api_name||': End API',
307 			       'Total Price: '|| x_estimated_price);
308   END IF;
309 
310 
311 END Get_Job_Estimated_Price;
312 
313 --------------------------------------------------------------------
314 --  Procedure name    : Get_Job_Actual_Price
315 --  Purpose           : To return actual price for the job of a given task.
316 --------------------------------------------------------------------
317 PROCEDURE Get_Job_Actual_Price
318     (p_visit_task_id        IN NUMBER,
319      p_price_list_id        IN NUMBER,
320      p_customer_id          IN NUMBER,
321      p_currency_code        IN VARCHAR2,
322 
323      x_actual_price         OUT NOCOPY NUMBER,
324      x_return_status        OUT NOCOPY VARCHAR2
325      )
326 IS
327   -- Define local variables
328   l_x_return_status           VARCHAR2(240);
329   l_total_price               NUMBER := 0;   -- total price
330 
331   l_res_item_tbl              AHL_VWP_RULES_PVT.Item_Tbl_Type;
332   l_mat_item_tbl              AHL_VWP_RULES_PVT.Item_Tbl_Type;
333   l_x_item_tbl                AHL_VWP_RULES_PVT.Item_Tbl_Type;
334 
335   i                           NUMBER := 0;   -- table index
336   l_api_name       CONSTANT   VARCHAR2(30) := 'Get_Task_Actual_Price';
337 
338 
339 BEGIN
340 
341   IF (FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
342 	FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE,
343                    'ahl.plsql.'||G_PKG_NAME||'.'||l_api_name||': Begin API',
344 			       'At the start of the procedure');
345 	FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE,
346                    'ahl.plsql.'||G_PKG_NAME||'.'||l_api_name||': End API',
347 			       'Visit Task ID: '|| p_visit_task_id);
348   END IF;
349 
350 --Initialize API return status to success
351   l_x_return_status := FND_API.G_RET_STS_SUCCESS;
352 
353 -- Get the items from Resource Transactions of the WIP job of this task
354 
355   Check_Item_for_Resource_Trans
356     (p_visit_task_id        =>p_visit_task_id ,
357 
358      x_item_tbl             =>l_res_item_tbl ,
359      x_return_status        =>l_x_return_status
360      );
361 
362      IF (FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
363 	     FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT,
364                    'ahl.plsql.'||G_PKG_NAME||'.'||l_api_name||': After Checking Items for Resource Transactions',
365 			       'Return Status is: '|| l_x_return_status);
366 	     FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT,
367                    'ahl.plsql.'||G_PKG_NAME||'.'||l_api_name||': After Checking Items for Resource Transactions',
368 			       'Number of Items: '||l_mat_item_tbl.COUNT );
369      END IF;
370 
371 -- Get the items from Material Transactions of the WIP job of this task
372 
373   Check_Item_for_Materials_Trans
374     (p_visit_task_id        =>p_visit_task_id ,
375 
376      x_item_tbl             =>l_mat_item_tbl ,
377      x_return_status        =>l_x_return_status
378      );
379 
380      IF (FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
381 	     FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT,
382                    'ahl.plsql.'||G_PKG_NAME||'.'||l_api_name||': After Checking Items for Material Transactions',
383 			       'Return Status is: '|| l_x_return_status);
384 	     FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT,
385                    'ahl.plsql.'||G_PKG_NAME||'.'||l_api_name||': After Checking Items for Material Transactions',
386 			       'Number of Items: '||l_mat_item_tbl.COUNT );
387      END IF;
388 
389 -- Merge the two Item table to get the item table
390 -- that the same task, item and UOM combination appear only once
391 
392   AHL_VWP_RULES_PVT.Merge_for_Unique_Items
393     (p_item_tbl1             =>l_res_item_tbl ,
394      p_item_tbl2             =>l_mat_item_tbl ,
395 
396      x_item_tbl              =>l_x_item_tbl
397      );
398 
399 
400      IF (FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
401 	     FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT,
402                    'ahl.plsql.'||G_PKG_NAME||'.'||l_api_name||': After Merge Items',
403 			       'Number of Items: '||l_x_item_tbl.COUNT );
404      END IF;
405 
406 -- Calculate the price for the items required by the WIP job
407 
408   IF l_x_item_tbl.count > 0 THEN
409 
410    Calculate_Total_Price
411     (p_item_tbl             =>l_x_item_tbl,
412      p_price_list_id        =>p_price_list_id ,
413      p_customer_id          =>p_customer_id ,
414      p_currency_code        =>p_currency_code ,
415 
416      x_total_price          =>l_total_price ,
417      x_return_status        =>l_x_return_status
418      );
419 
420   END IF;
421 
422 -- Assign return status  and  Item without Price table
423   x_return_status:=l_x_return_status;
424   x_actual_price := l_total_price;
425 
426   IF (FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
427 	FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE,
428                    'ahl.plsql.'||G_PKG_NAME||'.'||l_api_name||': End API',
429 			       'Return Status is: '|| x_return_status);
430 	FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE,
431                    'ahl.plsql.'||G_PKG_NAME||'.'||l_api_name||': End API',
432 			       'Total Price: '|| x_actual_price);
433   END IF;
434 
435 END Get_Job_Actual_Price;
436 
437 --------------------------------------------------------------------
438 --  Procedure name    : Get_Item_Price
439 --  Purpose           : To return price for a given item.
440 --------------------------------------------------------------------
441 PROCEDURE Get_Item_Price
442     (p_item_id              IN NUMBER,
443      p_price_list_id        IN NUMBER,
444      p_customer_id          IN NUMBER,
445      p_duration             IN NUMBER := 1,
446      p_currency_code        IN VARCHAR2,
447      p_effective_date       IN DATE,
448      p_UOM_code             IN VARCHAR2,
449 
450      x_item_price           OUT NOCOPY NUMBER,
451      x_return_status        OUT NOCOPY VARCHAR2
452      )
453 IS
454 
455   -- Define local variables
456 
457  l_p_line_tbl                  QP_PREQ_GRP.LINE_TBL_TYPE;
458  l_p_qual_tbl                  QP_PREQ_GRP.QUAL_TBL_TYPE;
459  l_p_line_attr_tbl             QP_PREQ_GRP.LINE_ATTR_TBL_TYPE;
460  l_p_LINE_DETAIL_tbl           QP_PREQ_GRP.LINE_DETAIL_TBL_TYPE;
461  l_p_LINE_DETAIL_qual_tbl      QP_PREQ_GRP.LINE_DETAIL_QUAL_TBL_TYPE;
462  l_p_LINE_DETAIL_attr_tbl      QP_PREQ_GRP.LINE_DETAIL_ATTR_TBL_TYPE;
463  l_p_related_lines_tbl         QP_PREQ_GRP.RELATED_LINES_TBL_TYPE;
464  l_p_control_rec               QP_PREQ_GRP.CONTROL_RECORD_TYPE;
465  l_x_line_tbl                  QP_PREQ_GRP.LINE_TBL_TYPE;
466  l_x_line_qual                 QP_PREQ_GRP.QUAL_TBL_TYPE;
467  l_x_line_attr_tbl             QP_PREQ_GRP.LINE_ATTR_TBL_TYPE;
468  l_x_line_detail_tbl           QP_PREQ_GRP.LINE_DETAIL_TBL_TYPE;
469  l_x_line_detail_qual_tbl      QP_PREQ_GRP.LINE_DETAIL_QUAL_TBL_TYPE;
470  l_x_line_detail_attr_tbl      QP_PREQ_GRP.LINE_DETAIL_ATTR_TBL_TYPE;
471  l_x_related_lines_tbl         QP_PREQ_GRP.RELATED_LINES_TBL_TYPE;
472  l_x_return_status             VARCHAR2(240);
473  l_x_return_status_text        VARCHAR2(240);
474  l_qual_rec                    QP_PREQ_GRP.QUAL_REC_TYPE;
475  l_line_attr_rec               QP_PREQ_GRP.LINE_ATTR_REC_TYPE;
476  l_line_rec                    QP_PREQ_GRP.LINE_REC_TYPE;
477 
478   l_duration                    NUMBER :=1; -- duration is default to 1
479   i                             NUMBER :=0;  -- loop index
480   l_api_name       CONSTANT   VARCHAR2(30) := 'Get_Item_Price';
481 
482 BEGIN
483 
484    -- Standard Start of API savepoint
485    SAVEPOINT Get_Item_Price;
486 
487   IF (FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
488 	FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE,
489                    'ahl.plsql.'||G_PKG_NAME||'.'||l_api_name||': Begin API',
490 			       'At the start of the procedure');
491   END IF;
492 
493 --Initialize API return status to success
494   l_x_return_status := FND_API.G_RET_STS_SUCCESS;
495 
496 -- If duration passed in is null then default to 1
497   IF p_duration is not NULL AND p_duration <> FND_API.G_MISS_NUM THEN
498      l_duration := p_duration;
499   END IF;
500 
501 -- Passing Information to the Pricing Engine
502 
503 -- Setting up the control record variables
504 
505  l_p_control_rec.pricing_event := 'LINE';
506  l_p_control_rec.calculate_flag := 'Y';
507  l_p_control_rec.simulation_flag := 'N';
508  l_p_control_rec.use_multi_currency := 'Y';
509 --Jerry added on 09/27/05 for MOAC change
510  l_p_control_rec.org_id := MO_GLOBAL.get_current_org_id;
511 
512 -- Request Line (Order Line) Information
513  l_line_rec.request_type_code :='AHL';
514  l_line_rec.line_id :=p_item_id;                  -- Order Line Id. This can be any thing for this script
515  l_line_rec.line_Index :='1';                    -- Request Line Index
516  l_line_rec.line_type_code := 'LINE';            -- LINE or ORDER(Summary Line)
517  l_line_rec.pricing_effective_date := p_effective_date;   -- Pricing as of what date ?
518  l_line_rec.line_quantity := 1;                  -- Ordered Quantity
519  l_line_rec.line_uom_code := p_UOM_code;               -- Ordered UOM Code
520  l_line_rec.currency_code := p_currency_code;              -- Currency Code
521  l_line_rec.price_flag := 'Y';                   -- Price Flag can have 'Y' , 'N'(No pricing) , 'P'(Phase)
522  l_p_line_tbl(1) := l_line_rec;
523 
524   IF (FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
525 	FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT,
526                    'ahl.plsql.'||G_PKG_NAME||'.'||l_api_name||': Request Line',
527 			       'Line ID: '||l_p_line_tbl(1).line_id );
528 	FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT,
529                    'ahl.plsql.'||G_PKG_NAME||'.'||l_api_name||': Request Line',
530 			       'Effective Dates: '||l_p_line_tbl(1).pricing_effective_date );
531 	FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT,
532                    'ahl.plsql.'||G_PKG_NAME||'.'||l_api_name||': Request Line',
533 			       'UOM Code: '||l_p_line_tbl(1).line_uom_code );
534 	FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT,
535                    'ahl.plsql.'||G_PKG_NAME||'.'||l_api_name||': Request Line',
536 			       'Currency: '||l_p_line_tbl(1).currency_code );
537   END IF;
538 -- Pricing Attributes Passed In
539 --- Item
540  l_line_attr_rec.LINE_INDEX := 1; -- Attributes for the above line. Attributes are attached with the line index
541  l_line_attr_rec.PRICING_CONTEXT :='ITEM';
542  l_line_attr_rec.PRICING_ATTRIBUTE :='PRICING_ATTRIBUTE1';
543  l_line_attr_rec.PRICING_ATTR_VALUE_FROM  := p_item_id; -- Inventory Item Id
544  l_line_attr_rec.VALIDATED_FLAG :='N';
545  l_p_line_attr_tbl(1):= l_line_attr_rec;
546 
547   IF (FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
548 	FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT,
549                    'ahl.plsql.'||G_PKG_NAME||'.'||l_api_name||': Pricing Attributes',
550 			       'Item ID: '||l_p_line_attr_tbl(1).PRICING_ATTR_VALUE_FROM );
551   END IF;
552 
553 --- Duration (pricing attribute required by formula)
554 -- If no formula is associated for the given item then unit price will be derived
555 
556  l_line_attr_rec.LINE_INDEX := 1; -- Attributes for the above line. Attributes are attached with the line index
557  l_line_attr_rec.PRICING_CONTEXT :='AHL_PRICING'; -- CMRO set up
558  l_line_attr_rec.PRICING_ATTRIBUTE :='PRICING_ATTRIBUTE1';
559  l_line_attr_rec.PRICING_ATTR_VALUE_FROM  := l_duration; -- resource duration
560  l_line_attr_rec.VALIDATED_FLAG :='N';
561  l_p_line_attr_tbl(2):= l_line_attr_rec;
562 
563   IF (FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
564 	FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT,
565                    'ahl.plsql.'||G_PKG_NAME||'.'||l_api_name||': Pricing Attributes',
566 			       'Duration: '||l_p_line_attr_tbl(2).PRICING_ATTR_VALUE_FROM );
567   END IF;
568 
569 -- Qualifiers Passed In
570 --- Price List
571  l_qual_rec.LINE_INDEX := 1; -- Attributes for the above line. Attributes are attached with the line index
572  l_qual_rec.QUALIFIER_CONTEXT :='MODLIST';
573  l_qual_rec.QUALIFIER_ATTRIBUTE :='QUALIFIER_ATTRIBUTE4';
574  l_qual_rec.QUALIFIER_ATTR_VALUE_FROM :=p_price_list_id; -- Price List Id
575  l_qual_rec.COMPARISON_OPERATOR_CODE := '=';
576  l_qual_rec.VALIDATED_FLAG :='N';
577  l_p_qual_tbl(1):= l_qual_rec;
578 
579   IF (FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
580 	FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT,
581                    'ahl.plsql.'||G_PKG_NAME||'.'||l_api_name||': Qualifiers',
582 			       'Price List ID: '||l_p_qual_tbl(1).QUALIFIER_ATTR_VALUE_FROM );
583   END IF;
584 --- Customer
585  l_qual_rec.LINE_INDEX := 1; -- Attributes for the above line. Attributes are attached with the line index
586  l_qual_rec.QUALIFIER_CONTEXT :='CUSTOMER';
587  l_qual_rec.QUALIFIER_ATTRIBUTE :='QUALIFIER_ATTRIBUTE16';
588  l_qual_rec.QUALIFIER_ATTR_VALUE_FROM :=p_customer_id; -- Customer Id
589  l_qual_rec.COMPARISON_OPERATOR_CODE := '=';
590  l_qual_rec.VALIDATED_FLAG :='N';
591  l_p_qual_tbl(2):= l_qual_rec;
592 
593   IF (FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
594 	FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT,
595                    'ahl.plsql.'||G_PKG_NAME||'.'||l_api_name||': Qualifiers',
596 			       'Customer ID: '||l_p_qual_tbl(2).QUALIFIER_ATTR_VALUE_FROM );
597   END IF;
598 -- Actual Call to the Pricing Engine
599  QP_PREQ_PUB.PRICE_REQUEST
600        (l_p_line_tbl,
601         l_p_qual_tbl,
602         l_p_line_attr_tbl,
603         l_p_line_detail_tbl,
604         l_p_line_detail_qual_tbl,
605         l_p_line_detail_attr_tbl,
606         l_p_related_lines_tbl,
607         l_p_control_rec,
608         l_x_line_tbl,
609         l_x_line_qual,
610         l_x_line_attr_tbl,
611         l_x_line_detail_tbl,
612         l_x_line_detail_qual_tbl,
613         l_x_line_detail_attr_tbl,
614         l_x_related_lines_tbl,
615         l_x_return_status,
616         l_x_return_status_text);
617 
618 -- Return Status Information ..
619   IF (FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
620 	FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT,
621                    'ahl.plsql.'||G_PKG_NAME||'.'||l_api_name||': After Pricing API call',
622 			       'Return Status: '||l_x_return_status );
623 	FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT,
624                    'ahl.plsql.'||G_PKG_NAME||'.'||l_api_name||': After Pricing API call',
625 			       'Return Status text: '||l_x_return_status_text );
626   END IF;
627 
628 
629  IF (l_x_return_status <> FND_API.G_RET_STS_SUCCESS) THEN
630     FND_MESSAGE.Set_Name('AHL','AHL_VWP_PRICE_API_ERROR');
631     FND_MESSAGE.Set_Token('ERROR', l_x_return_status_text);
632     FND_MSG_PUB.Add;
633     RAISE FND_API.G_EXC_ERROR;
634   END IF;
635 
636 
637 -- Unit Price returned
638 
639 I := l_x_line_tbl.FIRST;
640 IF I IS NOT NULL THEN
641  LOOP
642 
643   IF (FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
644 	FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT,
645                    'ahl.plsql.'||G_PKG_NAME||'.'||l_api_name||': After Pricing API call',
646 			       'Line Index: '||l_x_line_tbl(I).line_index );
647 	FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT,
648                    'ahl.plsql.'||G_PKG_NAME||'.'||l_api_name||': After Pricing API call',
649 			       'Unit Price: '||l_x_line_tbl(I).unit_price );
650 	FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT,
651                    'ahl.plsql.'||G_PKG_NAME||'.'||l_api_name||': After Pricing API call',
652 			       'Adjusted Unit Price: '||l_x_line_tbl(I).adjusted_unit_price );
653 	FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT,
654                    'ahl.plsql.'||G_PKG_NAME||'.'||l_api_name||': After Pricing API call',
655 			       'Line Status Code: '||l_x_line_tbl(I).status_code );
656 	FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT,
657                    'ahl.plsql.'||G_PKG_NAME||'.'||l_api_name||': After Pricing API call',
658 			       'Line Status Text: '||l_x_line_tbl(I).status_text );
659   END IF;
660 
661   x_item_price := l_x_line_tbl(I).adjusted_unit_price;
662 
663   EXIT WHEN I = l_x_line_tbl.LAST;
664   I := l_x_line_tbl.NEXT(I);
665  END LOOP;
666 END IF;
667 
668 -- Assign return status
669   x_return_status:=l_x_return_status;
670 
671   IF (FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
672 	FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE,
673                    'ahl.plsql.'||G_PKG_NAME||'.'||l_api_name||': End API',
674 			       'Return Status is: '|| x_return_status);
675   END IF;
676 
677 EXCEPTION
678 WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
679     ROLLBACK TO Get_Item_Price;
680     X_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
681 
682 WHEN FND_API.G_EXC_ERROR THEN
683     ROLLBACK TO Get_Item_Price;
684     X_return_status := FND_API.G_RET_STS_ERROR;
685 
686 WHEN OTHERS THEN
687     ROLLBACK TO Get_Item_Price;
688     X_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
689 
690 END Get_Item_Price;
691 
692 --------------------------------------------------------------------
693 --  Procedure name    : Get_Items_without_Price
694 --  Purpose           : To return items which are not set up in price list.
695 --------------------------------------------------------------------
696 PROCEDURE Get_Items_without_Price
697     (p_item_tbl             IN AHL_VWP_RULES_PVT.Item_Tbl_Type,
698      p_price_list_id        IN NUMBER,
699      p_customer_id          IN NUMBER,
700      p_currency_code        IN VARCHAR2,
701 
702      x_item_tbl             OUT NOCOPY AHL_VWP_RULES_PVT.Item_Tbl_Type,
703      x_return_status        OUT NOCOPY VARCHAR2
704      )
705 IS
706 
707   -- Define local variables
708   l_x_return_status           VARCHAR2(240);
709   l_item_tbl                  AHL_VWP_RULES_PVT.Item_Tbl_Type;
710   l_x_item_price              NUMBER := 0;
711 
712   i                           NUMBER :=0;  -- loop index
713   j                           NUMBER :=0;  -- loop index
714 
715   l_api_name       CONSTANT   VARCHAR2(30) := 'Get_Items_without_Price';
716 
717 BEGIN
718 
719   IF (FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
720 	FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE,
721                    'ahl.plsql.'||G_PKG_NAME||'.'||l_api_name||': Begin API',
722 			       'At the start of the procedure');
723 	FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE,
724                    'ahl.plsql.'||G_PKG_NAME||'.'||l_api_name||': End API',
725 			       'Number of Items to check: '|| p_item_tbl.count);
726   END IF;
727 
728 --Initialize API return status to success
729   l_x_return_status := FND_API.G_RET_STS_SUCCESS;
730 
731 -- For each item in p_item_tbl, check for price
732 -- If price is not set up in price list
733 -- Add this item to output item table
734 
735 I := p_item_tbl.FIRST;
736 IF I IS NOT NULL THEN
737  LOOP
738 
739   IF (FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
740 	FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT,
741                    'ahl.plsql.'||G_PKG_NAME||'.'||l_api_name||': In Loop',
742 			       'Loop Index: '||I );
743   END IF;
744 
745 -- Check the price of the item
746   Get_Item_Price
747     (p_item_id              =>p_item_tbl(I).Item_Id ,
748      p_price_list_id        =>p_price_list_id ,
749      p_customer_id          =>p_customer_id ,
750      p_duration             =>p_item_tbl(I).Duration ,
751      p_currency_code        =>p_currency_code ,
752      p_effective_date       =>p_item_tbl(I).Effective_Date ,
753      p_UOM_code             =>p_item_tbl(I).UOM_Code ,
754 
755      x_item_price           =>l_x_item_price ,
756      x_return_status        =>l_x_return_status
757      );
758 
759  -- Add the item to output table if returned item price is null
760   IF (l_x_item_price IS NULL) THEN
761 
762        l_item_tbl(J) := p_item_tbl(I);
763 
764        J:= J+1;
765   END IF;
766 
767   EXIT WHEN I = p_item_tbl.LAST;
768   I := p_item_tbl.NEXT(I);
769  END LOOP;
770 END IF;
771 
772 -- Assign return status  and  Item without Price table
773   x_return_status:=l_x_return_status;
774   x_item_tbl:= l_item_tbl;
775 
776   IF (FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
777 	FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE,
778                    'ahl.plsql.'||G_PKG_NAME||'.'||l_api_name||': End API',
779 			       'Return Status is: '|| x_return_status);
780 	FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE,
781                    'ahl.plsql.'||G_PKG_NAME||'.'||l_api_name||': End API',
782 			       'Number of Items without Price: '|| x_item_tbl.count);
783   END IF;
784 
785 END Get_Items_without_Price;
786 
787 --------------------------------------------------------------------
788 --  Procedure name    : Check_Item_for_Prod_Mat_Req
789 --  Purpose           : To return items required for Material requirements of a given task.
790 --                      when job is not in draft status
791 --------------------------------------------------------------------
792 PROCEDURE Check_Item_for_Prod_Mat_Req
793     (p_visit_task_id        IN NUMBER,
794 
795      x_item_tbl             OUT NOCOPY AHL_VWP_RULES_PVT.Item_Tbl_Type,
796      x_return_status        OUT NOCOPY VARCHAR2
797      )
798 IS
799  -- Define local Cursors
800 
801 -- Get job material requirements
802 
803   CURSOR get_prod_materials_csr (c_visit_task_id NUMBER)
804   IS
805 /*
806 SELECT MAT.inventory_item_id,
807          MAT.requested_date,
808          SUM(NVL(MAT.requested_quantity,0)) quantity,
809          MAT.uom_code
810   FROM AHL_SCHEDULE_MATERIALS_V MAT
811   WHERE  MAT.visit_task_id =c_visit_task_id
812   AND MAT.JOB_STATUS_CODE <> 22  -- 'deleted' status
813   AND MAT.JOB_STATUS_CODE <> 7  -- 'cancelled' status
814   AND MAT.inventory_item_id is not null
815   AND MAT.uom_code is not null
816   GROUP BY MAT.inventory_item_id,
817          MAT.requested_date,
818          MAT.uom_code;
819 */
820 -- AnRaj: Changed query for fixing the perf issue #2, bug:4919487
821 -- AnRaj: 5532023, added further WHERE clauses which were missed out during fixing 4919487
822 SELECT   asm.inventory_item_id,
823          wiro.DATE_REQUIRED requested_date,
824          sum(nvl(wiro.REQUIRED_QUANTITY,0)) quantity,
825          mtl.primary_uom_code uom_code
826 FROM     ahl_workorders awo,
827          ahl_schedule_materials asm,
828          wip_requirement_operations wiro,
829          mtl_system_items_b mtl
830 WHERE    awo.visit_task_id = c_visit_task_id
831 AND      awo.visit_task_id = asm.visit_task_id
832 AND      asm.inventory_item_id = mtl.inventory_item_id
833 AND      asm.organization_id   = mtl.organization_id
834 AND      awo.wip_entity_id = wiro.wip_entity_id
835 AND      awo.STATUS_CODE NOT IN (22,7)
836 AND      ASM.inventory_item_id is not null
837 AND      mtl.primary_uom_code is not null
838 AND      ASM.OPERATION_SEQUENCE = WIRO.OPERATION_SEQ_NUM
839 AND      ASM.INVENTORY_ITEM_ID = WIRO.INVENTORY_ITEM_ID
840 AND      ASM.ORGANIZATION_ID = WIRO.ORGANIZATION_ID
841 GROUP BY asm.inventory_item_id,
842          wiro.DATE_REQUIRED,
843          mtl.primary_uom_code;
844   l_prod_material_req_rec  get_prod_materials_csr%ROWTYPE;
845 
846 
847   -- Define local variables
848   l_x_return_status           VARCHAR2(240);
849   l_x_item_tbl                AHL_VWP_RULES_PVT.Item_Tbl_Type;
850 
851   i                           NUMBER :=0;  -- loop index
852 
853   l_api_name       CONSTANT   VARCHAR2(30) := 'Check_Item_for_Prod_Mat_Req';
854 
855 BEGIN
856 
857   IF (FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
858 	FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE,
859                    'ahl.plsql.'||G_PKG_NAME||'.'||l_api_name||': Begin API',
860 			       'At the start of the procedure');
861 	FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE,
862                    'ahl.plsql.'||G_PKG_NAME||'.'||l_api_name||': Begin API',
863 			       'Visit Task ID: '|| p_visit_task_id);
864 
865   END IF;
866 
867 --Initialize API return status to success
868   l_x_return_status := FND_API.G_RET_STS_SUCCESS;
869 
870 -- Get all material requirements for the job
871 
872   Open get_prod_materials_csr(p_visit_task_id);
873 
874   LOOP
875       FETCH get_prod_materials_csr INTO l_prod_material_req_rec;
876       EXIT WHEN get_prod_materials_csr%NOTFOUND;
877 
878          l_x_item_tbl(I).item_id :=l_prod_material_req_rec.inventory_item_id;
879          l_x_item_tbl(I).quantity :=l_prod_material_req_rec.quantity;
880          l_x_item_tbl(I).UOM_code :=l_prod_material_req_rec.uom_code;
881          l_x_item_tbl(I).effective_date :=l_prod_material_req_rec.requested_date;
882          l_x_item_tbl(I).Visit_Task_Id :=p_visit_task_id;
883 
884          I := I + 1;
885 
886   END LOOP;
887 
888   CLOSE get_prod_materials_csr;
889 
890 
891 -- Assign return status  and  Item without Price table
892   x_return_status:=l_x_return_status;
893   x_item_tbl:= l_x_item_tbl;
894 
895   IF (FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
896 	FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE,
897                    'ahl.plsql.'||G_PKG_NAME||'.'||l_api_name||': End API',
898 			       'Return Status is: '|| x_return_status);
899 	FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE,
900                    'ahl.plsql.'||G_PKG_NAME||'.'||l_api_name||': End API',
901 			       'Number of Items for material requirements: '|| x_item_tbl.count);
902   END IF;
903 
904 END Check_Item_for_Prod_Mat_Req;
905 
906 --------------------------------------------------------------------
907 --  Procedure name    : Check_Item_for_Prod_Res_Req
908 --  Purpose           : To return items required for Resource requirements of a given task
909 --                      when job is not in draft status
910 --------------------------------------------------------------------
911 PROCEDURE Check_Item_for_Prod_Res_Req
912     (p_visit_task_id        IN NUMBER,
913 
914      x_item_tbl             OUT NOCOPY AHL_VWP_RULES_PVT.Item_Tbl_Type,
915      x_return_status        OUT NOCOPY VARCHAR2
916      )
917 IS
918  -- Define local Cursors
919 
920 -- Get job resource requirements
921 
922   CURSOR get_prod_res_req_csr (c_visit_task_id NUMBER)
923   IS
924   SELECT sum(NVL(AR.TOTAL_REQUIRED,0)) duration,
925 --         sum(NVL(AR.quantity,0)) quantity,
926 --       sum(NVL(AR.TOTAL_REQUIRED,0)) total_quantity,
927          BR.BILLABLE_ITEM_ID,
928          AR.REQUIRED_START_DATE,
929          MSIV.concatenated_segments item_name,
930          MSIV.primary_uom_code uom_code
931   FROM   AHL_PP_REQUIREMENT_V AR,
932          MTL_SYSTEM_ITEMS_VL MSIV,
933          AHL_VISITS_B V,
934          AHL_VISIT_TASKS_B VT,
935          BOM_RESOURCES BR
936   WHERE  BR.resource_id=AR.resource_id
937   AND    BR.BILLABLE_ITEM_ID is not null
938   AND    AR.visit_task_id = c_visit_task_id
939   AND    V.visit_id = VT.visit_id
940   AND    VT.visit_task_id = c_visit_task_id
941   AND    MSIV.inventory_item_id = BR.BILLABLE_ITEM_ID
942   AND    MSIV.organization_id = V.organization_id
943   AND    AR.JOB_STATUS_CODE <> 22  -- 'deleted' status
944   AND    AR.JOB_STATUS_CODE <> 7  -- 'cancelled' status
945   Group By BR.BILLABLE_ITEM_ID,
946            MSIV.concatenated_segments,
947            MSIV.primary_uom_code,
948            AR.REQUIRED_START_DATE;
949 
950   l_prod_res_req_rec  get_prod_res_req_csr%ROWTYPE;
951 
952 
953   -- Define local variables
954   l_x_return_status           VARCHAR2(240);
955   l_x_item_tbl                AHL_VWP_RULES_PVT.Item_Tbl_Type;
956 
957   l_x_time_type_flag          VARCHAR2(1);
958   i                           NUMBER :=0;  -- loop index
959 
960   l_api_name       CONSTANT   VARCHAR2(30) := 'Check_Item_for_Prod_Res_Req';
961 
962 BEGIN
963 
964   IF (FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
965 	FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE,
966                    'ahl.plsql.'||G_PKG_NAME||'.'||l_api_name||': Begin API',
967 			       'At the start of the procedure');
968 	FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE,
969                    'ahl.plsql.'||G_PKG_NAME||'.'||l_api_name||': Begin API',
970 			       'Visit Task ID: '|| p_visit_task_id);
971 
972   END IF;
973 
974 --Initialize API return status to success
975   l_x_return_status := FND_API.G_RET_STS_SUCCESS;
976 
977 -- Get all material requirements for the job
978 
979   Open get_prod_res_req_csr(p_visit_task_id);
980 
981   LOOP
982       FETCH get_prod_res_req_csr INTO l_prod_res_req_rec;
983       EXIT WHEN get_prod_res_req_csr%NOTFOUND;
984 
985         -- Verify to see if the Item UOM is of Time type
986         Check_UOM_Class
987         (p_UOM_code             =>l_prod_res_req_rec.uom_code,
988          x_time_type_flag       =>l_x_time_type_flag
989         );
990 
991         IF l_x_time_type_flag <>'Y' THEN
992 
993           Fnd_Message.SET_NAME('AHL','AHL_VWP_WRONG_ITEM_UOM');
994           Fnd_Message.SET_TOKEN('INV_ITEM',l_prod_res_req_rec.item_name);
995           Fnd_Msg_Pub.ADD;
996           CLOSE get_prod_res_req_csr;
997           RAISE Fnd_Api.G_EXC_ERROR;
998 
999         END IF;
1000 
1001          l_x_item_tbl(I).item_id :=l_prod_res_req_rec.BILLABLE_ITEM_ID;
1002          l_x_item_tbl(I).quantity :=1;
1003          l_x_item_tbl(I).duration :=l_prod_res_req_rec.duration;
1004          l_x_item_tbl(I).UOM_code :=l_prod_res_req_rec.uom_code;
1005          l_x_item_tbl(I).effective_date :=l_prod_res_req_rec.REQUIRED_START_DATE;
1006          l_x_item_tbl(I).Visit_Task_Id :=p_visit_task_id;
1007 
1008          I := I + 1;
1009 
1010   END LOOP;
1011 
1012   CLOSE get_prod_res_req_csr;
1013 
1014 -- Assign return status  and  Item without Price table
1015   x_return_status:=l_x_return_status;
1016   x_item_tbl:= l_x_item_tbl;
1017 
1018   IF (FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
1019 	FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE,
1020                    'ahl.plsql.'||G_PKG_NAME||'.'||l_api_name||': End API',
1021 			       'Return Status is: '|| x_return_status);
1022 	FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE,
1023                    'ahl.plsql.'||G_PKG_NAME||'.'||l_api_name||': End API',
1024 			       'Number of Items for resource requirements: '|| x_item_tbl.count);
1025   END IF;
1026 
1027 END Check_Item_for_Prod_Res_Req;
1028 
1029 
1030 --------------------------------------------------------------------
1031 --  Procedure name    : Check_Item_for_Rt_Mat_Req
1032 --  Purpose           : To return items required for Material requirements of a given task.
1033 --                      when job is in draft status
1034 --------------------------------------------------------------------
1035 PROCEDURE Check_Item_for_Rt_Mat_Req
1036     (p_visit_task_id        IN NUMBER,
1037      p_route_id             IN NUMBER,
1038      p_effective_date       IN DATE,
1039 
1040      x_item_tbl             OUT NOCOPY AHL_VWP_RULES_PVT.Item_Tbl_Type,
1041      x_return_status        OUT NOCOPY VARCHAR2
1042      )
1043 IS
1044  -- Define local Cursors
1045 -- Get route material requirements
1046 
1047   CURSOR get_rt_materials_csr (c_route_id NUMBER, c_visit_task_id NUMBER)
1048   IS
1049   SELECT MAT.rt_oper_material_id,
1050          MAT.inventory_item_id,
1051          MAT.quantity,
1052          MSIV.primary_uom_code uom_code
1053 --         MAT.uom_code
1054   FROM AHL_RT_OPER_MATERIALS MAT,
1055        AHL_VISITS_B V,
1056        AHL_VISIT_TASKS_B VT,
1057        MTL_SYSTEM_ITEMS_VL MSIV
1058   WHERE  MAT.association_type_code='ROUTE'
1059   AND  MSIV.organization_id = V.organization_id
1060   AND  V.visit_id = VT.visit_id
1061   AND  VT.visit_task_id = c_visit_task_id
1062   AND  MAT.inventory_item_id = MSIV.inventory_item_id
1063   AND  MAT.object_id=c_route_id;
1064 
1065   l_rt_material_req_rec  get_rt_materials_csr%ROWTYPE;
1066 
1067 -- Get operation material requirements
1068 
1069   CURSOR get_oper_materials_csr (c_route_id NUMBER, c_visit_task_id NUMBER)
1070   IS
1071   SELECT MAT.inventory_item_id,
1072          sum(NVL(MAT.quantity,0)) quantity,
1073          MSIV.primary_uom_code uom_code
1074 --         MAT.uom_code
1075   FROM   MTL_SYSTEM_ITEMS_VL MSIV,
1076          AHL_VISITS_B V,
1077          AHL_VISIT_TASKS_B VT,
1078          AHL_RT_OPER_MATERIALS MAT
1079   WHERE  MAT.association_type_code='OPERATION'
1080 --  AND MAT.inventory_item_id is not null
1081   AND  MSIV.organization_id = V.organization_id
1082   AND  V.visit_id = VT.visit_id
1083   AND  VT.visit_task_id = c_visit_task_id
1084   AND  MSIV.inventory_item_id = MAT.inventory_item_id
1085   AND  MAT.object_id in
1086     (  SELECT   RO.operation_id
1087        FROM     AHL_OPERATIONS_VL OP,
1088            AHL_ROUTE_OPERATIONS RO
1089        WHERE    OP.operation_id=RO.operation_id
1090        AND      OP.revision_status_code='COMPLETE'
1091        AND      RO.route_id=c_route_id
1092        AND      OP.revision_number IN
1093            ( SELECT MAX(revision_number)
1094              FROM   AHL_OPERATIONS_B_KFV
1095              WHERE  concatenated_segments=OP.concatenated_segments
1096              AND    TRUNC(SYSDATE) BETWEEN TRUNC(start_date_active) AND
1097                                            TRUNC(NVL(end_date_active,SYSDATE+1))
1098            )
1099     )
1100   Group By MAT.inventory_item_id,
1101            MSIV.primary_uom_code;
1102 --           MAT.uom_code;
1103 
1104   l_oper_material_req_rec  get_oper_materials_csr%ROWTYPE;
1105 
1106   -- Define local variables
1107   l_x_return_status           VARCHAR2(240);
1108   l_x_item_tbl                AHL_VWP_RULES_PVT.Item_Tbl_Type;
1109 
1110   l_route_mat_found           BOOLEAN := FALSE;
1111 
1112   i                           NUMBER :=0;  -- loop index
1113 
1114   l_api_name       CONSTANT   VARCHAR2(30) := 'Check_Item_for_Rt_Mat_Req';
1115 
1116 BEGIN
1117 
1118   IF (FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
1119 	FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE,
1120                    'ahl.plsql.'||G_PKG_NAME||'.'||l_api_name||': Begin API',
1121 			       'At the start of the procedure');
1122 	FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE,
1123                    'ahl.plsql.'||G_PKG_NAME||'.'||l_api_name||': Begin API',
1124 			       'Visit Task ID: '|| p_visit_task_id);
1125 	FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE,
1126                    'ahl.plsql.'||G_PKG_NAME||'.'||l_api_name||': Begin API',
1127 			       'Route ID: '|| p_route_id);
1128   END IF;
1129 
1130 --Initialize API return status to success
1131   l_x_return_status := FND_API.G_RET_STS_SUCCESS;
1132 
1133 -- Check to see if material requirements are defined at route level
1134 
1135   Open get_rt_materials_csr(p_route_id,p_visit_task_id);
1136 
1137   LOOP
1138       FETCH get_rt_materials_csr INTO l_rt_material_req_rec;
1139       EXIT WHEN get_rt_materials_csr%NOTFOUND;
1140 
1141      -- Atleast One Material Requirement defined for the Route
1142       l_route_mat_found := TRUE;
1143 
1144       -- The Material Requirement is based on an Item
1145       -- Ignore if requirement is based on item group
1146       -- Do not consider alternate items
1147 
1148       IF ( l_rt_material_req_rec.inventory_item_id IS NOT NULL ) THEN
1149 
1150          l_x_item_tbl(I).item_id :=l_rt_material_req_rec.inventory_item_id;
1151          l_x_item_tbl(I).quantity :=l_rt_material_req_rec.quantity;
1152          l_x_item_tbl(I).UOM_code :=l_rt_material_req_rec.uom_code;
1153          l_x_item_tbl(I).effective_date :=p_effective_date;
1154          l_x_item_tbl(I).Visit_Task_Id :=p_visit_task_id;
1155 
1156          IF (FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
1157 	         FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT,
1158                    'ahl.plsql.'||G_PKG_NAME||'.'||l_api_name||': In Loop',
1159 			       'Item Quantity: '||I||'...'||l_x_item_tbl(I).quantity );
1160          END IF;
1161 
1162          I := I + 1;
1163 
1164       End IF;
1165 
1166   END LOOP;
1167 
1168   CLOSE get_rt_materials_csr;
1169 
1170 -- If material requirements are not defined at route level
1171 -- Then sum up the requirements for associated operations
1172  IF ( l_route_mat_found = FALSE ) THEN
1173 
1174    Open get_oper_materials_csr(p_route_id,p_visit_task_id);
1175 
1176    LOOP
1177       FETCH get_oper_materials_csr INTO l_oper_material_req_rec;
1178       EXIT WHEN get_oper_materials_csr%NOTFOUND;
1179 
1180 
1181       -- The Material Requirement is based on an Item
1182       -- Ignore if requirement is based on item group
1183       -- Do not consider alternate items
1184 
1185       IF ( l_oper_material_req_rec.inventory_item_id IS NOT NULL ) THEN
1186 
1187          l_x_item_tbl(I).item_id :=l_oper_material_req_rec.inventory_item_id;
1188          l_x_item_tbl(I).quantity :=l_oper_material_req_rec.quantity;
1189          l_x_item_tbl(I).UOM_code :=l_oper_material_req_rec.uom_code;
1190          l_x_item_tbl(I).effective_date :=p_effective_date;
1191          l_x_item_tbl(I).Visit_Task_Id :=p_visit_task_id;
1192 
1193          IF (FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
1194 	         FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT,
1195                     'ahl.plsql.'||G_PKG_NAME||'.'||l_api_name||': In Loop',
1196 			       'Item Quantity: '||I||'...'||l_x_item_tbl(I).quantity );
1197          END IF;
1198 
1199          I := I + 1;
1200 
1201       End IF;
1202 
1203    END LOOP;
1204 
1205    CLOSE get_oper_materials_csr;
1206 
1207  END IF;
1208 
1209 -- Assign return status  and  Item without Price table
1210   x_return_status:=l_x_return_status;
1211   x_item_tbl:= l_x_item_tbl;
1212 
1213   IF (FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
1214 	FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE,
1215                    'ahl.plsql.'||G_PKG_NAME||'.'||l_api_name||': End API',
1216 			       'Return Status is: '|| x_return_status);
1217 	FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE,
1218                    'ahl.plsql.'||G_PKG_NAME||'.'||l_api_name||': End API',
1219 			       'Number of Items for material requirements: '|| x_item_tbl.count);
1220   END IF;
1221 
1222 
1223 END Check_Item_for_Rt_Mat_Req;
1224 
1225 --------------------------------------------------------------------
1226 --  Procedure name    : Check_Item_for_Rt_Res_Req
1227 --  Purpose           : To return items required for Resource requirements of a given task
1228 --                      when job is in draft status
1229 --------------------------------------------------------------------
1230 PROCEDURE Check_Item_for_Rt_Res_Req
1231     (p_visit_task_id        IN NUMBER,
1232      p_route_id             IN NUMBER,
1233      p_organization_id      IN NUMBER,
1234      p_effective_date       IN DATE,
1235 
1236      x_item_tbl             OUT NOCOPY AHL_VWP_RULES_PVT.Item_Tbl_Type,
1237      x_return_status        OUT NOCOPY VARCHAR2
1238      )
1239 IS
1240  -- Define local Cursors
1241   -- For checking if Resource Requirements are defined for Route
1242   CURSOR check_rt_resources_csr(c_route_id NUMBER)
1243   IS
1244   SELECT AR.rt_oper_resource_id
1245   FROM   AHL_RT_OPER_RESOURCES AR
1246   WHERE  AR.association_type_code='ROUTE'
1247   AND    AR.object_id=c_route_id;
1248 
1249   -- Bug # : 5532390, regression issues caused by fix for bug number 5258334
1250   --
1251   -- For Getting the BOM Resource for the ASO Resource and the Visit's
1252   -- Organization. Merge rows with same item defined.
1253   CURSOR get_rt_resources_csr(c_route_id NUMBER,
1254                           c_org_id NUMBER)
1255   IS
1256 SELECT sum(NVL(AR.duration,0)* NVL(AR.quantity,0)) duration,
1257          BR.BILLABLE_ITEM_ID,
1258          MSIV.concatenated_segments item_name,
1259          MSIV.primary_uom_code uom_code
1260   FROM   AHL_RT_OPER_RESOURCES AR,
1261          BOM_RESOURCES BR,
1262          MTL_SYSTEM_ITEMS_VL MSIV,
1263          AHL_RESOURCE_MAPPINGS MAP
1264   WHERE  AR.association_type_code='ROUTE'
1265   AND    BR.resource_id=MAP.bom_resource_id
1266   AND    AR.object_id=c_route_id
1267   AND    BR.organization_id=c_org_id
1268   AND    MAP.aso_resource_id=AR.aso_resource_id
1269   AND    BR.BILLABLE_ITEM_ID is not null
1270   AND    MSIV.organization_id = c_org_id
1271   AND    MSIV.inventory_item_id = BR.BILLABLE_ITEM_ID
1272   Group By BR.BILLABLE_ITEM_ID,
1273            MSIV.concatenated_segments,
1274            MSIV.primary_uom_code;
1275 
1276   l_rt_resource_rec  get_rt_resources_csr%ROWTYPE;
1277 
1278 
1279 -- Get operation material requirements
1280 -- Bug # : 5532390, regression issues caused by fix for bug number 5258334
1281   CURSOR get_oper_resources_csr (c_route_id NUMBER,c_org_id NUMBER)
1282   IS
1283   /*  SELECT sum(NVL(AR.duration,0)* NVL(AR.quantity,0)) duration,
1284          MSIV.primary_uom_code uom_code,
1285          MSIV.concatenated_segments item_name,
1286          BR.BILLABLE_ITEM_ID
1287   FROM   AHL_RT_OPER_RESOURCES AR,
1288          BOM_RESOURCES BR,
1289          MTL_SYSTEM_ITEMS_VL MSIV,
1290          AHL_RESOURCE_MAPPINGS MAP
1291   WHERE  AR.association_type_code='OPERATION'
1292   AND    BR.resource_id=MAP.bom_resource_id
1293   AND    BR.organization_id=c_org_id
1294   AND    MAP.aso_resource_id=AR.aso_resource_id
1295   AND    BR.BILLABLE_ITEM_ID is not null
1296   AND    MSIV.inventory_item_id = BR.BILLABLE_ITEM_ID
1297   AND    MSIV.organization_id = c_org_id
1298   AND  AR.object_id in
1299     (  SELECT   RO.operation_id
1300        FROM     AHL_OPERATIONS_VL OP,
1301            AHL_ROUTE_OPERATIONS RO
1302        WHERE    OP.operation_id=RO.operation_id
1303        AND      OP.revision_status_code='COMPLETE'
1304        AND      RO.route_id=c_route_id
1305        AND      OP.revision_number IN
1306            ( SELECT MAX(revision_number)
1307              FROM   AHL_OPERATIONS_B_KFV
1308              WHERE  concatenated_segments=OP.concatenated_segments
1309              AND    TRUNC(SYSDATE) BETWEEN TRUNC(start_date_active) AND
1310                                            TRUNC(NVL(end_date_active,SYSDATE+1))
1311            )
1312     )
1313   Group By BR.BILLABLE_ITEM_ID,
1314            MSIV.concatenated_segments,
1315            MSIV.primary_uom_code;
1316 */
1317    select   sum(nvl(ar.duration,0)* nvl(ar.quantity,0)) duration,
1318             msiv.primary_uom_code uom_code,
1319             msiv.concatenated_segments item_name,
1320             br.billable_item_id
1321    from     ahl_rt_oper_resources ar,
1322             bom_resources br,
1323             mtl_system_items_kfv msiv,
1324             ahl_resource_mappings map
1325    where    ar.association_type_code='OPERATION'
1326    and      br.resource_id=map.bom_resource_id
1327    and      br.organization_id=c_org_id
1328    and      map.aso_resource_id=ar.aso_resource_id
1329    and      br.billable_item_id is not null
1330    and      msiv.inventory_item_id = br.billable_item_id
1331    and      msiv.organization_id = c_org_id
1332    and      ar.object_id in
1333                (  select   ro.operation_id
1334                   from     ahl_operations_b_kfv op,
1335                            ahl_route_operations ro
1336                   where    op.operation_id=ro.operation_id
1337                   and      op.revision_status_code='COMPLETE'
1338                   and      ro.route_id=c_route_id
1339                   and      op.revision_number in
1340                               (  select   max(revision_number)
1341                                  from     ahl_operations_b_kfv
1342                                  where    concatenated_segments=op.concatenated_segments
1343                                  and      trunc(sysdate) between trunc(start_date_active)
1344                                  and      trunc(nvl(end_date_active,sysdate+1))
1345                               )
1346                )
1347    group by    br.billable_item_id,
1348                msiv.concatenated_segments,
1349                msiv.primary_uom_code;
1350 
1351   l_oper_resource_req_rec  get_oper_resources_csr%ROWTYPE;
1352 
1353   -- Define local variables
1354   l_x_return_status           VARCHAR2(240);
1355   l_x_item_tbl                AHL_VWP_RULES_PVT.Item_Tbl_Type;
1356   l_x_time_type_flag          VARCHAR2(1);
1357 
1358   l_rt_resource_id            NUMBER;
1359 
1360   i                           NUMBER :=0;  -- loop index
1361 
1362   l_api_name       CONSTANT   VARCHAR2(30) := 'Check_Item_for_Rt_Res_Req';
1363 
1364 BEGIN
1365 
1366   IF (FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
1367 	FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE,
1368                    'ahl.plsql.'||G_PKG_NAME||'.'||l_api_name||': Begin API',
1369 			       'At the start of the procedure');
1370 	FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE,
1371                    'ahl.plsql.'||G_PKG_NAME||'.'||l_api_name||': Begin API',
1372 			       'Visit Task ID: '|| p_visit_task_id);
1373 	FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE,
1374                    'ahl.plsql.'||G_PKG_NAME||'.'||l_api_name||': Begin API',
1375 			       'Route ID: '|| p_route_id);
1376 	FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE,
1377                    'ahl.plsql.'||G_PKG_NAME||'.'||l_api_name||': Begin API',
1378 			       'Organization ID: '|| p_organization_id);
1379   END IF;
1380 
1381 --Initialize API return status to success
1382   l_x_return_status := FND_API.G_RET_STS_SUCCESS;
1383 
1384 -- Check to see if resource requirements are defined at route level
1385 
1386   Open check_rt_resources_csr(p_route_id);
1387 
1388   FETCH check_rt_resources_csr INTO l_rt_resource_id;
1389 
1390   IF check_rt_resources_csr%NOTFOUND THEN  -- no resource requirements defined for route
1391 
1392     Open get_oper_resources_csr(p_route_id,p_organization_id);
1393 
1394     LOOP
1395       FETCH get_oper_resources_csr INTO l_oper_resource_req_rec;
1396       EXIT WHEN get_oper_resources_csr%NOTFOUND;
1397 
1398       -- The Material Requirement is based on an Item
1399       -- Ignore if requirement is based on item group
1400       -- Do not consider alternate items
1401 
1402       IF ( l_oper_resource_req_rec.BILLABLE_ITEM_ID IS NOT NULL ) AND
1403         ( l_oper_resource_req_rec.uom_code IS NOT NULL )  THEN
1404 
1405         -- Verify to see if the Item UOM is of Time type
1406         Check_UOM_Class
1407         (p_UOM_code             =>l_oper_resource_req_rec.uom_code,
1408          x_time_type_flag       =>l_x_time_type_flag
1409         );
1410 
1411         IF l_x_time_type_flag <>'Y' THEN
1412 
1413           Fnd_Message.SET_NAME('AHL','AHL_VWP_WRONG_ITEM_UOM');
1414           Fnd_Message.SET_TOKEN('INV_ITEM',l_oper_resource_req_rec.item_name);
1415           Fnd_Msg_Pub.ADD;
1416           CLOSE get_oper_resources_csr;
1417           CLOSE check_rt_resources_csr;
1418           RAISE Fnd_Api.G_EXC_ERROR;
1419 
1420         END IF;
1421 
1422          l_x_item_tbl(I).item_id :=l_oper_resource_req_rec.BILLABLE_ITEM_ID;
1423          l_x_item_tbl(I).quantity :=1;
1424          l_x_item_tbl(I).duration :=l_oper_resource_req_rec.duration;
1425          l_x_item_tbl(I).UOM_code :=l_oper_resource_req_rec.uom_code;
1426          l_x_item_tbl(I).effective_date :=p_effective_date;
1427          l_x_item_tbl(I).Visit_Task_Id :=p_visit_task_id;
1428 
1429          I := I + 1;
1430       End IF;
1431 
1432     END LOOP;
1433 
1434     CLOSE get_oper_resources_csr;
1435 
1436   ELSE      ---- resource requirements are defined for route
1437 
1438      Open get_rt_resources_csr(p_route_id,p_organization_id);
1439 
1440      LOOP
1441       FETCH get_rt_resources_csr INTO l_rt_resource_rec;
1442       EXIT WHEN get_rt_resources_csr%NOTFOUND;
1443 
1444       -- The Material Requirement is based on an Item
1445       -- Ignore if requirement is based on item group
1446       -- Do not consider alternate items
1447 
1448       IF ( l_rt_resource_rec.BILLABLE_ITEM_ID IS NOT NULL ) AND
1449         ( l_rt_resource_rec.uom_code IS NOT NULL )  THEN
1450 
1451         -- Verify to see if the Item UOM is of Time type
1452         Check_UOM_Class
1453         (p_UOM_code             =>l_rt_resource_rec.uom_code,
1454          x_time_type_flag       =>l_x_time_type_flag
1455         );
1456 
1457         IF l_x_time_type_flag <>'Y' THEN
1458 
1459           Fnd_Message.SET_NAME('AHL','AHL_VWP_WRONG_ITEM_UOM');
1460           Fnd_Message.SET_TOKEN('INV_ITEM',l_rt_resource_rec.item_name);
1461           Fnd_Msg_Pub.ADD;
1462           CLOSE get_rt_resources_csr;
1463           CLOSE check_rt_resources_csr;
1464           RAISE Fnd_Api.G_EXC_ERROR;
1465 
1466         END IF;
1467 
1468          l_x_item_tbl(I).item_id :=l_rt_resource_rec.BILLABLE_ITEM_ID;
1469          l_x_item_tbl(I).quantity :=1;
1470          l_x_item_tbl(I).duration :=l_rt_resource_rec.duration;
1471          l_x_item_tbl(I).UOM_code :=l_rt_resource_rec.uom_code;
1472          l_x_item_tbl(I).effective_date :=p_effective_date;
1473          l_x_item_tbl(I).Visit_Task_Id :=p_visit_task_id;
1474 
1475          I := I + 1;
1476       End IF;
1477 
1478     END LOOP;
1479 
1480     CLOSE get_rt_resources_csr;
1481 
1482   END IF;
1483 
1484   CLOSE check_rt_resources_csr;
1485 
1486 
1487 -- Assign return status  and  Item without Price table
1488   x_return_status:=l_x_return_status;
1489   x_item_tbl:= l_x_item_tbl;
1490 
1491   IF (FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
1492 	FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE,
1493                    'ahl.plsql.'||G_PKG_NAME||'.'||l_api_name||': End API',
1494 			       'Return Status is: '|| x_return_status);
1495 	FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE,
1496                    'ahl.plsql.'||G_PKG_NAME||'.'||l_api_name||': End API',
1497 			       'Number of Items for resource requirements: '|| x_item_tbl.count);
1498   END IF;
1499 
1500 END Check_Item_for_Rt_Res_Req;
1501 
1502 
1503 --------------------------------------------------------------------
1504 --  Procedure name    : Check_Item_for_Resource_Trans
1505 --  Purpose           : To return items required for Resource transactions of a given task.
1506 --------------------------------------------------------------------
1507 PROCEDURE Check_Item_for_Resource_Trans
1508     (p_visit_task_id        IN NUMBER,
1509 
1510      x_item_tbl             OUT NOCOPY AHL_VWP_RULES_PVT.Item_Tbl_Type,
1511      x_return_status        OUT NOCOPY VARCHAR2
1512      )
1513 IS
1514  -- Define local Cursors
1515 
1516 -- Get job resource requirements
1517 
1518   CURSOR get_resource_trans_csr (c_visit_task_id NUMBER)
1519   IS
1520   SELECT sum(NVL(AR.USAGE_RATE_OR_AMOUNT,0)) duration,
1521        --sum(NVL(AR.QUANTITY,0)) quantity,
1522 --         AR.primary_uom uom_code,
1523          BR.BILLABLE_ITEM_ID,
1524          AR.TRANSACTION_DATE,
1525          MSIV.concatenated_segments item_name,
1526          MSIV.primary_uom_code uom_code
1527   FROM   AHL_WIP_RESOURCE_TXNS_V AR,
1528          MTL_SYSTEM_ITEMS_VL MSIV,
1529          AHL_VISITS_B V,
1530          AHL_VISIT_TASKS_B VT,
1531          BOM_RESOURCES BR
1532   WHERE  BR.resource_id=AR.resource_id
1533   AND    BR.BILLABLE_ITEM_ID is not null
1534   AND    AR.visit_task_id = c_visit_task_id
1535   AND    MSIV.organization_id = V.organization_id
1536   AND    V.visit_id = VT.visit_id
1537   AND    VT.visit_task_id = c_visit_task_id
1538   AND    MSIV.inventory_item_id = BR.BILLABLE_ITEM_ID
1539   AND    AR.JOB_STATUS_CODE <> 22  -- 'deleted' status
1540   AND    AR.JOB_STATUS_CODE <> 7  -- 'cancelled' status
1541   Group By BR.BILLABLE_ITEM_ID,
1542            MSIV.concatenated_segments,
1543            MSIV.primary_uom_code,
1544            AR.TRANSACTION_DATE;
1545 
1546   l_resource_trans_rec  get_resource_trans_csr%ROWTYPE;
1547 
1548 
1549   -- Define local variables
1550   l_x_return_status           VARCHAR2(240);
1551   l_x_item_tbl                AHL_VWP_RULES_PVT.Item_Tbl_Type;
1552 
1553   l_x_time_type_flag          VARCHAR2(1);
1554   i                           NUMBER :=0;  -- loop index
1555 
1556   l_api_name       CONSTANT   VARCHAR2(30) := 'Check_Item_for_Resource_Trans';
1557 
1558 BEGIN
1559 
1560   IF (FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
1561 	FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE,
1562                    'ahl.plsql.'||G_PKG_NAME||'.'||l_api_name||': Begin API',
1563 			       'At the start of the procedure');
1564 	FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE,
1565                    'ahl.plsql.'||G_PKG_NAME||'.'||l_api_name||': Begin API',
1566 			       'Visit Task ID: '|| p_visit_task_id);
1567 
1568   END IF;
1569 
1570 --Initialize API return status to success
1571   l_x_return_status := FND_API.G_RET_STS_SUCCESS;
1572 
1573 -- Get all material requirements for the job
1574 
1575   Open get_resource_trans_csr(p_visit_task_id);
1576 
1577   LOOP
1578       FETCH get_resource_trans_csr INTO l_resource_trans_rec;
1579       EXIT WHEN get_resource_trans_csr%NOTFOUND;
1580 
1581          l_x_item_tbl(I).item_id :=l_resource_trans_rec.BILLABLE_ITEM_ID;
1582          l_x_item_tbl(I).quantity :=1;
1583          l_x_item_tbl(I).duration :=l_resource_trans_rec.duration;
1584          l_x_item_tbl(I).UOM_code :=l_resource_trans_rec.uom_code;
1585          l_x_item_tbl(I).effective_date :=l_resource_trans_rec.TRANSACTION_DATE;
1586          l_x_item_tbl(I).Visit_Task_Id :=p_visit_task_id;
1587 
1588          I := I + 1;
1589 
1590   END LOOP;
1591 
1592   CLOSE get_resource_trans_csr;
1593 
1594 -- Assign return status  and  Item without Price table
1595   x_return_status:=l_x_return_status;
1596   x_item_tbl:= l_x_item_tbl;
1597 
1598   IF (FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
1599 	FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE,
1600                    'ahl.plsql.'||G_PKG_NAME||'.'||l_api_name||': End API',
1601 			       'Return Status is: '|| x_return_status);
1602 	FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE,
1603                    'ahl.plsql.'||G_PKG_NAME||'.'||l_api_name||': End API',
1604 			       'Number of Items for resource transactions: '|| x_item_tbl.count);
1605   END IF;
1606 
1607 END Check_Item_for_Resource_Trans;
1608 
1609 --------------------------------------------------------------------
1610 --  Procedure name    : Check_Item_for_Material_Trans
1611 --  Purpose           : To return items required for Mateiral transactions of a given task.
1612 --------------------------------------------------------------------
1613 PROCEDURE Check_Item_for_Materials_Trans
1614     (p_visit_task_id        IN NUMBER,
1615 
1616      x_item_tbl             OUT NOCOPY AHL_VWP_RULES_PVT.Item_Tbl_Type,
1617      x_return_status        OUT NOCOPY VARCHAR2
1618      )
1619 IS
1620  -- Define local Cursors
1621 
1622 -- Get job material requirements
1623 
1624   CURSOR get_materials_trans_csr (c_visit_task_id NUMBER)
1625   IS
1626 /*
1627 SELECT MAT.inventory_item_id,
1628          MAT.creation_date,
1629          SUM(NVL(MAT.quantity,0)) quantity,
1630          MSIV.primary_uom_code uom_code
1631  --        MAT.uom uom_code
1632   FROM AHL_WORKORDER_MTL_TXNS MAT,
1633        AHL_WORKORDERS_V AWOS,
1634        MTL_SYSTEM_ITEMS_VL MSIV,
1635        AHL_VISITS_B V,
1636        AHL_VISIT_TASKS_B VT,
1637        AHL_WORKORDER_OPERATIONS_V AWOP
1638   WHERE AWOP.WORKORDER_ID = AWOS.WORKORDER_ID
1639   AND  AWOP.WORKORDER_OPERATION_ID = MAT.WORKORDER_OPERATION_ID
1640   AND  MAT.inventory_item_id = MSIV.inventory_item_id
1641   AND  MSIV.organization_id = V.organization_id
1642   AND  V.visit_id = VT.visit_id
1643   AND  VT.visit_task_id = c_visit_task_id
1644   AND  AWOS.visit_task_id = c_visit_task_id
1645   AND  AWOS.job_status_code <> 22  -- 'deleted' status
1646   AND  AWOS.JOB_STATUS_CODE <> 7  -- 'cancelled' status
1647   GROUP BY MAT.inventory_item_id,
1648          MAT.creation_date,
1649          MSIV.primary_uom_code;
1650 --         MAT.uom;
1651 */
1652 -- AnRaj: Changed query for fixing the perf issue #1, bug:4919487
1653 SELECT   MAT.inventory_item_id,
1654          MAT.creation_date,
1655          SUM(NVL(MAT.quantity,0)) quantity,
1656          MSIV.primary_uom_code uom_code
1657 FROM     AHL_WORKORDER_MTL_TXNS MAT,
1658          AHL_WORKORDERS AWOS,
1659          MTL_SYSTEM_ITEMS_B MSIV,
1660          AHL_VISITS_B V,
1661          AHL_VISIT_TASKS_B VT,
1662          AHL_WORKORDER_OPERATIONS_V AWOP
1663 WHERE    AWOP.WORKORDER_ID = AWOS.WORKORDER_ID
1664 AND      AWOP.WORKORDER_OPERATION_ID = MAT.WORKORDER_OPERATION_ID
1665 AND      MAT.inventory_item_id = MSIV.inventory_item_id
1666 AND      MSIV.organization_id = V.organization_id
1667 AND      V.visit_id = VT.visit_id
1668 AND      VT.visit_task_id = c_visit_task_id
1669 AND      AWOS.visit_task_id = c_visit_task_id
1670 AND      AWOS.status_code <> 22  -- 'deleted' status
1671 AND      AWOS.STATUS_CODE <> 7  -- 'cancelled' status
1672 GROUP BY MAT.inventory_item_id,
1673          MAT.creation_date,
1674          MSIV.primary_uom_code;
1675 
1676 l_materials_trans_rec  get_materials_trans_csr%ROWTYPE;
1677 
1678 
1679   -- Define local variables
1680   l_x_return_status           VARCHAR2(240);
1681   l_x_item_tbl                AHL_VWP_RULES_PVT.Item_Tbl_Type;
1682 
1683   i                           NUMBER :=0;  -- loop index
1684 
1685   l_api_name       CONSTANT   VARCHAR2(30) := 'Check_Item_for_Prod_Mat_Req';
1686 
1687 BEGIN
1688 
1689   IF (FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
1690 	FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE,
1691                    'ahl.plsql.'||G_PKG_NAME||'.'||l_api_name||': Begin API',
1692 			       'At the start of the procedure');
1693 	FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE,
1694                    'ahl.plsql.'||G_PKG_NAME||'.'||l_api_name||': Begin API',
1695 			       'Visit Task ID: '|| p_visit_task_id);
1696 
1697   END IF;
1698 
1699 --Initialize API return status to success
1700   l_x_return_status := FND_API.G_RET_STS_SUCCESS;
1701 
1702 -- Get all material requirements for the job
1703 
1704   Open get_materials_trans_csr(p_visit_task_id);
1705 
1706   LOOP
1707       FETCH get_materials_trans_csr INTO l_materials_trans_rec;
1708       EXIT WHEN get_materials_trans_csr%NOTFOUND;
1709 
1710          l_x_item_tbl(I).item_id :=l_materials_trans_rec.inventory_item_id;
1711          l_x_item_tbl(I).quantity :=l_materials_trans_rec.quantity;
1712          l_x_item_tbl(I).UOM_code :=l_materials_trans_rec.uom_code;
1713          l_x_item_tbl(I).effective_date :=l_materials_trans_rec.creation_date;
1714          l_x_item_tbl(I).Visit_Task_Id :=p_visit_task_id;
1715 
1716          I := I + 1;
1717 
1718   END LOOP;
1719 
1720   CLOSE get_materials_trans_csr;
1721 
1722 
1723 -- Assign return status  and  Item without Price table
1724   x_return_status:=l_x_return_status;
1725   x_item_tbl:= l_x_item_tbl;
1726 
1727   IF (FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
1728 	FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE,
1729                    'ahl.plsql.'||G_PKG_NAME||'.'||l_api_name||': End API',
1730 			       'Return Status is: '|| x_return_status);
1731 	FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE,
1732                    'ahl.plsql.'||G_PKG_NAME||'.'||l_api_name||': End API',
1733 			       'Number of Items for material transactions: '|| x_item_tbl.count);
1734   END IF;
1735 
1736 END Check_Item_for_Materials_Trans;
1737 
1738 
1739 --------------------------------------------------------------------
1740 --  Procedure name    : Calculate_Total_Price
1741 --  Purpose           : To return total price of the item table with quantity.
1742 --------------------------------------------------------------------
1743 PROCEDURE Calculate_Total_Price
1744     (p_item_tbl             IN AHL_VWP_RULES_PVT.Item_Tbl_Type,
1745      p_price_list_id        IN NUMBER,
1746      p_customer_id          IN NUMBER,
1747      p_currency_code        IN VARCHAR2,
1748 
1749      x_total_price          OUT NOCOPY NUMBER,
1750      x_return_status        OUT NOCOPY VARCHAR2
1751      )
1752 IS
1753   -- Define local variables
1754   l_x_return_status           VARCHAR2(240);
1755   l_x_item_price              NUMBER := 0;
1756   i                      NUMBER := 0;   -- table index
1757   l_total_price          NUMBER := 0;   -- total price
1758   l_api_name       CONSTANT   VARCHAR2(30) := 'Calculate_Total_Price';
1759 
1760 
1761 BEGIN
1762 
1763   IF (FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
1764 	FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE,
1765                    'ahl.plsql.'||G_PKG_NAME||'.'||l_api_name||': Begin API',
1766 			       'At the start of the procedure');
1767 	FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE,
1768                    'ahl.plsql.'||G_PKG_NAME||'.'||l_api_name||': End API',
1769 			       'Number of Items to calculate: '|| p_item_tbl.count);
1770   END IF;
1771 
1772 --Initialize API return status to success
1773   l_x_return_status := FND_API.G_RET_STS_SUCCESS;
1774 
1775 -- For each item in p_item_tbl, check for price
1776 
1777 I := p_item_tbl.FIRST;
1778 IF I IS NOT NULL THEN
1779  LOOP
1780 
1781   IF (FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
1782 	FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE,
1783                    'ahl.plsql.'||G_PKG_NAME||'.'||l_api_name||': In Loop',
1784 			       'Loop Index: '||I );
1785   END IF;
1786 
1787 -- Check the price of the item
1788   Get_Item_Price
1789     (p_item_id              =>p_item_tbl(I).Item_Id ,
1790      p_price_list_id        =>p_price_list_id ,
1791      p_customer_id          =>p_customer_id ,
1792      p_duration             =>p_item_tbl(I).Duration ,
1793      p_currency_code        =>p_currency_code ,
1794      p_effective_date       =>p_item_tbl(I).Effective_Date ,
1795      p_UOM_code             =>p_item_tbl(I).UOM_Code ,
1796 
1797      x_item_price           =>l_x_item_price ,
1798      x_return_status        =>l_x_return_status
1799      );
1800 
1801  -- Multiply the item price with quantity
1802  -- And add the result to total price
1803  -- Consider the item price as 0 if item is not set up in price list
1804   IF (l_x_item_price IS NOT NULL) THEN
1805 
1806      IF (FND_LOG.LEVEL_STATEMENT >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
1807 	     FND_LOG.STRING(FND_LOG.LEVEL_STATEMENT,
1808                    'ahl.plsql.'||G_PKG_NAME||'.'||l_api_name||': In Loop',
1809 			       'Item Quantity: '||p_item_tbl(I).quantity );
1810      END IF;
1811 
1812      l_total_price  := l_total_price + l_x_item_price * p_item_tbl(I).quantity;
1813 
1814      IF (FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
1815 	     FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE,
1816                    'ahl.plsql.'||G_PKG_NAME||'.'||l_api_name||': In Loop',
1817 			       'Current Total Price: '||l_total_price );
1818      END IF;
1819   END IF;
1820 
1821   EXIT WHEN I = p_item_tbl.LAST;
1822   I := p_item_tbl.NEXT(I);
1823  END LOOP;
1824 END IF;
1825 
1826 -- Assign return status  and  Item without Price table
1827   x_return_status:=l_x_return_status;
1828   x_total_price := l_total_price;
1829 
1830   IF (FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
1831 	FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE,
1832                    'ahl.plsql.'||G_PKG_NAME||'.'||l_api_name||': End API',
1833 			       'Return Status is: '|| x_return_status);
1834 	FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE,
1835                    'ahl.plsql.'||G_PKG_NAME||'.'||l_api_name||': End API',
1836 			       'Total Price: '|| x_total_price);
1837   END IF;
1838 END Calculate_Total_Price;
1839 
1840 
1841 --------------------------------------------------------------------
1842 --  Procedure name    : Check_UOM_Class
1843 --  Purpose           : To check if the Item UOM is of type TIME.
1844 --------------------------------------------------------------------
1845 
1846 PROCEDURE Check_UOM_Class
1847     (p_UOM_code             IN VARCHAR2,
1848      x_time_type_flag       OUT NOCOPY VARCHAR2
1849      )
1850 IS
1851  -- Define local Cursors
1852 
1853 -- Get job material requirements
1854 
1855   CURSOR get_uom_csr (c_UOM_code VARCHAR2)
1856   IS
1857   SELECT UOM_CODE
1858   FROM mtl_units_of_measure_vl
1859   WHERE UOM_CLASS = 'Time'
1860   AND UOM_CODE = c_UOM_code;
1861 
1862   -- Define local variables
1863   l_UOM_code                  VARCHAR2(3);
1864 
1865   l_api_name       CONSTANT   VARCHAR2(30) := 'Check_UOM_Class';
1866 
1867 BEGIN
1868 
1869   IF (FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
1870 	FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE,
1871                    'ahl.plsql.'||G_PKG_NAME||'.'||l_api_name||': Begin API',
1872 			       'At the start of the procedure');
1873 	FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE,
1874                    'ahl.plsql.'||G_PKG_NAME||'.'||l_api_name||': Begin API',
1875 			       'UOM Code: '|| p_UOM_code);
1876 
1877   END IF;
1878 
1879 -- Check to see if the uom code passed in is of Time type
1880 
1881   Open get_uom_csr(p_UOM_code);
1882 
1883   FETCH get_uom_csr INTO l_UOM_code;
1884 
1885   IF get_uom_csr%NOTFOUND THEN
1886         x_time_type_flag := 'N';
1887   ELSE
1888         x_time_type_flag := 'Y';
1889   END IF;
1890 
1891   CLOSE get_uom_csr;
1892 
1893   IF (FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
1894 	FND_LOG.STRING(FND_LOG.LEVEL_PROCEDURE,
1895                    'ahl.plsql.'||G_PKG_NAME||'.'||l_api_name||': End API',
1896 			       'Time Type flag is: '|| x_time_type_flag);
1897   END IF;
1898 
1899 END Check_UOM_Class;
1900 
1901 
1902 END AHL_VWP_PRICE_PVT;
1903