DBA Data[Home] [Help]

PACKAGE BODY: APPS.DPP_PRICING_PVT

Source


1 PACKAGE BODY DPP_PRICING_PVT AS
2 /* $Header: dppvqpnb.pls 120.7.12010000.3 2010/04/26 07:09:09 pvaramba ship $ */
3 -- ===============================================================
4 -- Start of Comments
5 -- Package name
6 --          DPP_PRICING_PVT
7 -- Purpose
8 --					Contains all APIs for Pricing Notifications
9 -- History
10 --
11 -- NOTE
12 --
13 -- End of Comments
14 -- ===============================================================
15 
16   G_PKG_NAME CONSTANT VARCHAR2(30) := 'DPP_PRICING_PVT';
17 
18   G_DEBUG BOOLEAN := FND_MSG_PUB.check_msg_level(FND_MSG_PUB.g_msg_lvl_debug_high);
19   G_FILE_NAME     CONSTANT VARCHAR2(14) := 'dppvqpnb.pls';
20   g_trunc_sysdate  DATE := trunc(sysdate);
21 
22 --   ==============================================================================
23 --    Start of Comments
24 --   ==============================================================================
25 --   API Name :   Notify_OutboundPricelists
26 --   Type     :   Private
27 --   Pre-Req  :		None
28 --	 Function :		Derives outbound pricelists information for pricing notification
29 --   Parameters
30 --
31 --   IN
32 --       p_api_version_number      IN   NUMBER     Required
33 --       p_init_msg_list           IN   VARCHAR2   Optional  Default = FND_API_G_FALSE
34 --       p_commit                  IN   VARCHAR2   Optional  Default = FND_API.G_FALSE
35 --       p_validation_level        IN   NUMBER     Optional  Default = FND_API.G_VALID_LEVEL_NONE
36 --       p_pl_notify_line_tbl      IN OUT  dpp_pl_notify_line_tbl_type  Required
37 --
38 --   OUT
39 --       x_return_status           OUT  VARCHAR2
40 --       x_msg_count               OUT  NUMBER
41 --       x_msg_data                OUT  VARCHAR2
42 --   Version : Current version 1.0
43 --
44 --   End of Comments
45 --   ==============================================================================
46 
47   PROCEDURE Notify_OutboundPricelists(
48                                        p_api_version IN NUMBER
49                                        , p_init_msg_list IN VARCHAR2 := FND_API.G_FALSE
50                                        , p_commit IN VARCHAR2 := FND_API.G_FALSE
51                                        , p_validation_level IN NUMBER := FND_API.G_VALID_LEVEL_NONE
52                                        , x_return_status OUT NOCOPY VARCHAR2
53                                        , x_msg_count OUT NOCOPY NUMBER
54                                        , x_msg_data OUT NOCOPY VARCHAR2
55                                        , p_pl_notify_hdr_rec IN OUT NOCOPY dpp_pl_notify_rec_type
56                                        , p_pl_notify_line_tbl IN OUT NOCOPY dpp_pl_notify_line_tbl_type
57                                        )
58   IS
59   l_api_name CONSTANT VARCHAR2(30) := 'Notify_OutboundPricelists';
60   l_api_version CONSTANT NUMBER := 1.0;
61   l_full_name CONSTANT VARCHAR2(60) := G_PKG_NAME || '.' || l_api_name;
62 
63   l_result NUMBER;
64   l_return_status VARCHAR2(30);
65   l_pl_notify_hdr_rec    dpp_pl_notify_rec_type := p_pl_notify_hdr_rec;
66   l_pl_notify_line_tbl DPP_PRICING_PVT.dpp_pl_notify_line_tbl_type := p_pl_notify_line_tbl;
67   l_pricelist_tbl DPP_PRICING_PVT.dpp_object_name_tbl_type;
68 
69   CURSOR get_pricelist_csr(p_inventory_item_id IN NUMBER, p_org_id IN NUMBER)
70   IS
71 
72   SELECT
73         qlh.name Pricelist_Name
74   FROM
75         qp_secu_list_headers_v qlh,
76         qp_list_lines_v qll
77   WHERE
78 				qlh.active_flag = 'Y' AND
79 				g_trunc_sysdate BETWEEN nvl(qlh.start_date_active, g_trunc_sysdate) AND
80 				nvl(qlh.end_date_active, g_trunc_sysdate) AND
81 				qlh.source_system_code = 'QP' AND
82 				qll.product_id = p_inventory_item_id AND
83 				qll.list_header_id = qlh.list_header_id AND
84 				qll.product_attribute_context = 'ITEM' AND
85 				qll.list_line_type_code = 'PLL' AND
86 				g_trunc_sysdate BETWEEN nvl(qll.start_date_active, g_trunc_sysdate) AND
87 				nvl(qll.end_date_active, g_trunc_sysdate) AND
88 				(qlh.orig_org_id = p_org_id OR NVL(qlh.global_flag,'N') = 'Y');
89 
90   CURSOR get_item_number_csr(p_inventory_item_id IN NUMBER)
91   IS
92   SELECT
93 			msi.concatenated_segments
94   FROM
95 			mtl_system_items_kfv msi
96   WHERE
97 			inventory_item_id = p_inventory_item_id
98 		AND ROWNUM = 1;
99 
100 
101   CURSOR get_vendor_csr(p_vendor_id IN NUMBER)
102   IS
103   SELECT
104 	  vendor_name,
105 	  segment1 vendor_num
106 	FROM
107 	  ap_suppliers
108 	WHERE
109   vendor_id = p_vendor_id;
110 
111 CURSOR get_vendor_site_csr(p_vendor_id IN NUMBER, p_vendor_site_id IN NUMBER, p_org_id IN NUMBER)
112 	  IS
113   SELECT
114 	  vendor_site_code
115 	FROM
116 	  ap_supplier_sites_all
117 	WHERE
118 	  vendor_site_id = p_vendor_site_id    and
119 	  vendor_id = p_vendor_id   and
120     org_id = p_org_id;
121 
122 CURSOR get_ou_csr(p_org_id IN NUMBER)
123 	  IS
124   SELECT
125 	  name
126 	FROM
127 	  hr_operating_units
128 	WHERE
129 	  organization_id = p_org_id;
130 
131   BEGIN
132 
133 -- Standard call to check for call compatibility.
134    IF NOT FND_API.Compatible_API_Call ( l_api_version,
135       p_api_version,
136       l_api_name,
137       G_PKG_NAME)
138    THEN
139       RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
140    END IF;
141 -- Initialize message list if p_init_msg_list is set to TRUE.
142    IF FND_API.to_Boolean( p_init_msg_list )
143    THEN
144       FND_MSG_PUB.initialize;
145    END IF;
146 
147 
148    DPP_UTILITY_PVT.DEBUG_MESSAGE( FND_LOG.LEVEL_PROCEDURE, 'dpp.plsql.' || L_FULL_NAME,  'Private API: ' || l_api_name || 'start');
149 
150 -- Initialize API return status to sucess
151     l_return_status := FND_API.G_RET_STS_SUCCESS;
152 --
153 -- API body
154 --
155     IF l_pl_notify_hdr_rec.vendor_id IS NULL THEN
156          DPP_UTILITY_PVT.DEBUG_MESSAGE( FND_LOG.LEVEL_STATEMENT, 'dpp.plsql.' || L_FULL_NAME,  'Vendor ID cannot be NULL');
157 	               FND_MESSAGE.set_name('DPP', 'DPP_API_INPUT_ID_MISSING');
158 					 FND_MESSAGE.set_token('ID', 'Vendor ID');
159 		       FND_MSG_PUB.add;
160            RAISE FND_API.G_EXC_ERROR;
161     ELSIF l_pl_notify_hdr_rec.vendor_site_id IS NULL THEN
162             DPP_UTILITY_PVT.DEBUG_MESSAGE( FND_LOG.LEVEL_STATEMENT, 'dpp.plsql.' || L_FULL_NAME,  'Vendor Site ID cannot be NULL');
163 		       FND_MESSAGE.set_name('DPP', 'DPP_API_INPUT_ID_MISSING');
164 					 FND_MESSAGE.set_token('ID', 'Vendor Site ID');
165 		       FND_MSG_PUB.add;
166            RAISE FND_API.G_EXC_ERROR;
167     ELSE
168         FOR get_vendor_rec IN get_vendor_csr(p_pl_notify_hdr_rec.vendor_id)
169           LOOP
170 
171           p_pl_notify_hdr_rec.vendor_name := get_vendor_rec.vendor_name;
172           p_pl_notify_hdr_rec.vendor_number := get_vendor_rec.vendor_num;
173 
174         END LOOP;
175 
176         FOR get_vendor_site_rec IN get_vendor_site_csr(p_pl_notify_hdr_rec.vendor_id, p_pl_notify_hdr_rec.vendor_site_id,
177         p_pl_notify_hdr_rec.org_id)
178           LOOP
179 
180           p_pl_notify_hdr_rec.vendor_site_code := get_vendor_site_rec.vendor_site_code;
181 
182         END LOOP;
183 
184 				FOR get_ou_rec IN get_ou_csr(p_pl_notify_hdr_rec.org_id)
185 					LOOP
186 
187 					p_pl_notify_hdr_rec.operating_unit := get_ou_rec.name;
188 
189         END LOOP;
190 
191     END IF;
192 
193       FOR i IN l_pl_notify_line_tbl.FIRST..l_pl_notify_line_tbl.LAST
194         LOOP
195 
196        IF l_pl_notify_line_tbl(i).inventory_item_id IS NULL THEN
197 	                  DPP_UTILITY_PVT.DEBUG_MESSAGE( FND_LOG.LEVEL_STATEMENT, 'dpp.plsql.' || L_FULL_NAME,  'Inventory Item ID cannot be NULL');
198 
199 	 		       FND_MESSAGE.set_name('DPP', 'DPP_API_INPUT_ID_MISSING');
200 	 					 FND_MESSAGE.set_token('ID', 'Inventory Item ID');
201 	 		       FND_MSG_PUB.add;
202 	           RAISE FND_API.G_EXC_ERROR;
203 
204        ELSE
205         OPEN get_pricelist_csr(l_pl_notify_line_tbl(i).inventory_item_id, l_pl_notify_hdr_rec.org_id);
206         LOOP
207           FETCH get_pricelist_csr BULK COLLECT INTO l_pricelist_tbl;
208           EXIT WHEN get_pricelist_csr%NOTFOUND;
209         END LOOP;
210         CLOSE get_pricelist_csr;
211 
212         -- Initializing Nested Table
213         IF NOT l_pricelist_tbl.EXISTS(1) THEN
214            l_pricelist_tbl(1) := NULL;
215         END IF;
216 
217         p_pl_notify_line_tbl(i).object_name_tbl := l_pricelist_tbl;
218 
219         FOR get_item_number_rec IN get_item_number_csr(l_pl_notify_line_tbl(i).inventory_item_id)
220           LOOP
221 
222           p_pl_notify_line_tbl(i).item_number := get_item_number_rec.concatenated_segments;
223 
224         END LOOP;
225 
226        END IF;
227 
228       END LOOP;
229 
230     DPP_UTILITY_PVT.DEBUG_MESSAGE( FND_LOG.LEVEL_STATEMENT, 'dpp.plsql.' || L_FULL_NAME,  'return status for API =>'||l_return_status);
231 
232 
233     DPP_UTILITY_PVT.DEBUG_MESSAGE( FND_LOG.LEVEL_STATEMENT, 'dpp.plsql.' || L_FULL_NAME,  'Private API: ' || l_api_name || 'end');
234 
235    -- Standard call to get message count and if count is 1, get message info.
236     FND_MSG_PUB.Count_And_Get
237     (p_count => x_msg_count,
238      p_data => x_msg_data
239      );
240 
241    x_return_status := l_return_status;
242 
243   EXCEPTION
244 
245     WHEN FND_API.G_EXC_ERROR THEN
246 
247     x_return_status := FND_API.G_RET_STS_ERROR;
248    -- Standard call to get message count and if count=1, get the message
249     FND_MSG_PUB.Count_And_Get (
250                                p_encoded => FND_API.G_FALSE,
251                                p_count => x_msg_count,
252                                p_data => x_msg_data
253                                );
254  IF x_msg_count > 1 THEN
255    FOR I IN 1..x_msg_count LOOP
256        x_msg_data := SUBSTR((x_msg_data||' '|| FND_MSG_PUB.GET(P_MSG_INDEX => I, P_ENCODED => 'F')), 1, 4000);
257    END LOOP;
258 END IF;
259 
260 
261     WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
262 
263     x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
264    -- Standard call to get message count and if count=1, get the message
265     FND_MSG_PUB.Count_And_Get (
266                                p_encoded => FND_API.G_FALSE,
267                                p_count => x_msg_count,
268                                p_data => x_msg_data
269                                );
270  IF x_msg_count > 1 THEN
271    FOR I IN 1..x_msg_count LOOP
272        x_msg_data := SUBSTR((x_msg_data||' '|| FND_MSG_PUB.GET(P_MSG_INDEX => I, P_ENCODED => 'F')), 1, 4000);
273    END LOOP;
274 END IF;
275 
276 
277     WHEN OTHERS THEN
278 
279     x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
280    IF fnd_msg_pub.check_msg_level(fnd_msg_pub.g_msg_lvl_unexp_error) THEN
281 			fnd_message.set_name('FND', 'SQL_PLSQL_ERROR');
282 			fnd_message.set_token('ROUTINE', 'DPP_PRICING_PVT.Notify_OutboundPricelists');
283 			fnd_message.set_token('ERRNO', sqlcode);
284 			fnd_message.set_token('REASON', sqlerrm);
285     END IF;
286    -- Standard call to get message count and if count=1, get the message
287     FND_MSG_PUB.Count_And_Get (
288                                p_encoded => FND_API.G_FALSE,
289                                p_count => x_msg_count,
290                                p_data => x_msg_data
291                                );
292 IF x_msg_count > 1 THEN
293    FOR I IN 1..x_msg_count LOOP
294        x_msg_data := SUBSTR((x_msg_data||' '|| FND_MSG_PUB.GET(P_MSG_INDEX => I, P_ENCODED => 'F')), 1, 4000);
295    END LOOP;
296 END IF;
297 
298 
299   END Notify_OutboundPricelists;
300 
301 --   ==============================================================================
302 --    Start of Comments
303 --   ==============================================================================
304 --   API Name :   Notify_InboundPricelists
305 --   Type     :   Private
306 --   Pre-Req  :		None
307 --	 Function :		Derives inbound pricelists information for pricing notification
308 --   Parameters
309 --
310 --   IN
311 --       p_api_version_number      IN   NUMBER     Required
312 --       p_init_msg_list           IN   VARCHAR2   Optional  Default = FND_API_G_FALSE
313 --       p_commit                  IN   VARCHAR2   Optional  Default = FND_API.G_FALSE
314 --       p_validation_level        IN   NUMBER     Optional  Default = FND_API.G_VALID_LEVEL_NONE
315 --       p_pl_notify_hdr_rec       IN OUT  dpp_pl_notify_rec_type  Required
316 --       p_pl_notify_line_tbl      IN OUT  dpp_pl_notify_line_tbl_type  Required
317 --
318 --   OUT
319 --       x_return_status           OUT  VARCHAR2
320 --       x_msg_count               OUT  NUMBER
321 --       x_msg_data                OUT  VARCHAR2
322 --   Version : Current version 1.0
323 --
324 --   End of Comments
325 --   ==============================================================================
326 
327   PROCEDURE Notify_InboundPricelists(
328                                       p_api_version IN NUMBER
329                                       , p_init_msg_list IN VARCHAR2 := FND_API.G_FALSE
330                                       , p_commit IN VARCHAR2 := FND_API.G_FALSE
331                                       , p_validation_level IN NUMBER := FND_API.G_VALID_LEVEL_NONE
332                                       , x_return_status OUT NOCOPY VARCHAR2
333                                       , x_msg_count OUT NOCOPY NUMBER
334                                       , x_msg_data OUT NOCOPY VARCHAR2
335                                       , p_pl_notify_hdr_rec IN OUT NOCOPY dpp_pl_notify_rec_type
336                                       , p_pl_notify_line_tbl IN OUT NOCOPY dpp_pl_notify_line_tbl_type
337                                       )
338   IS
339   l_api_name CONSTANT VARCHAR2(30) := 'Notify_InboundPricelists';
340   l_api_version CONSTANT NUMBER := 1.0;
341   l_full_name CONSTANT VARCHAR2(60) := G_PKG_NAME || '.' || l_api_name;
342 
343   l_result NUMBER;
344   l_pl_notify_hdr_rec DPP_PRICING_PVT.dpp_pl_notify_rec_type := p_pl_notify_hdr_rec;
345   l_pl_notify_line_tbl DPP_PRICING_PVT.dpp_pl_notify_line_tbl_type := p_pl_notify_line_tbl;
346   l_pricelist_tbl DPP_PRICING_PVT.dpp_object_name_tbl_type;
347 
348     CURSOR get_pricelist_csr(p_inventory_item_id IN NUMBER, p_vendor_id IN NUMBER,p_vendor_site_id IN NUMBER, p_org_id IN NUMBER)
349 	  IS
350 		SELECT	qlh.name Pricelist_Name
351 		FROM	qp_secu_list_headers_v qlh,
352 			qp_qualifiers_v qqv,
353 			qp_list_lines_v qll
354 		WHERE	qlh.active_flag='Y'
355                   and	g_trunc_sysdate between nvl(qlh.start_date_active,g_trunc_sysdate)
356                   and	nvl(qlh.end_date_active,g_trunc_sysdate)
357                   and	qlh.list_header_id=qqv.list_header_id
358                   and	qlh.source_system_code='PO'
359                   and	qqv.qualifier_context='PO_SUPPLIER'
360                   and	(qualifier_attribute = 'QUALIFIER_ATTRIBUTE1' and qqv.qualifier_attr_value=NVL(p_vendor_id,qqv.qualifier_attr_value))
361                   and	qll.product_id = p_inventory_item_id
362                   and	qll.list_header_id=qlh.list_header_id
363                   and	qll.product_attribute_context='ITEM'
364                   and	qll.list_line_type_code='PLL'
365                   and	g_trunc_sysdate between nvl(qll.start_date_active,g_trunc_sysdate)
366                   and	nvl(qll.end_date_active,g_trunc_sysdate)
367                   AND  (qlh.orig_org_id = p_org_id OR NVL(qlh.global_flag,'N') = 'Y')
368                 UNION
369                 SELECT	qlh.name Pricelist_Name
370 		FROM	qp_secu_list_headers_v qlh,
371 			qp_qualifiers_v qqv,
372 			qp_list_lines_v qll
373 		WHERE	qlh.active_flag='Y'
374                   and	g_trunc_sysdate between nvl(qlh.start_date_active,g_trunc_sysdate)
375                   and	nvl(qlh.end_date_active,g_trunc_sysdate)
376                   and	qlh.list_header_id=qqv.list_header_id
377                   and	qlh.source_system_code='PO'
378                   and	qqv.qualifier_context='PO_SUPPLIER'
379                   and    (qualifier_attribute = 'QUALIFIER_ATTRIBUTE2' and qqv.qualifier_attr_value=NVL(p_vendor_site_id,qqv.qualifier_attr_value))             and	qll.product_id = p_inventory_item_id
380                   and	qll.list_header_id=qlh.list_header_id
381                   and	qll.product_attribute_context='ITEM'
382                   and	qll.list_line_type_code='PLL'
383                   and	g_trunc_sysdate between nvl(qll.start_date_active,g_trunc_sysdate)
384                   and	nvl(qll.end_date_active,g_trunc_sysdate)
385                   AND  (qlh.orig_org_id = p_org_id OR NVL(qlh.global_flag,'N') = 'Y');
386 
387     CURSOR get_item_number_csr(p_inventory_item_id IN NUMBER)
388 	  IS
389 	  SELECT
390 				msi.concatenated_segments
391 	  FROM
392 				mtl_system_items_kfv msi
393 	  WHERE
394 				inventory_item_id = p_inventory_item_id
395 		AND ROWNUM = 1;
396 
397 
398   CURSOR get_vendor_csr(p_vendor_id IN NUMBER)
399   IS
400   SELECT
401 	  vendor_name,
402 	  segment1 vendor_num
403 	FROM
404 	  ap_suppliers
405 	WHERE
406   vendor_id = p_vendor_id;
407 
408 CURSOR get_vendor_site_csr(p_vendor_id IN NUMBER, p_vendor_site_id IN NUMBER, p_org_id IN NUMBER)
409 	  IS
410   SELECT
411 	  vendor_site_code
412 	FROM
413 	  ap_supplier_sites_all
414 	WHERE
415 	  vendor_site_id = p_vendor_site_id    and
416 	  vendor_id = p_vendor_id   and
417     org_id = p_org_id;
418 
419 CURSOR get_ou_csr(p_org_id IN NUMBER)
420 	  IS
421   SELECT
422 	  name
423 	FROM
424 	  hr_operating_units
425 	WHERE
426 	  organization_id = p_org_id;
427 
428   BEGIN
429 
430 -- Standard call to check for call compatibility.
431   IF NOT FND_API.Compatible_API_Call ( l_api_version,
432       p_api_version,
433       l_api_name,
434       G_PKG_NAME)
435    THEN
436       RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
437    END IF;
438 -- Initialize message list if p_init_msg_list is set to TRUE.
439    IF FND_API.to_Boolean( p_init_msg_list )
440    THEN
441       FND_MSG_PUB.initialize;
442    END IF;
443 
444 
445    DPP_UTILITY_PVT.DEBUG_MESSAGE( FND_LOG.LEVEL_PROCEDURE, 'dpp.plsql.' || L_FULL_NAME,  'Private API: ' || l_full_name || 'start');
446 
447 -- Initialize API return status to sucess
448     x_return_status := FND_API.G_RET_STS_SUCCESS;
449 
450 --
451 -- API body
452 --
453     IF l_pl_notify_hdr_rec.vendor_id IS NULL THEN
454            DPP_UTILITY_PVT.DEBUG_MESSAGE( FND_LOG.LEVEL_STATEMENT, 'dpp.plsql.' || L_FULL_NAME,  'Vendor ID cannot be NULL');
455 		       FND_MESSAGE.set_name('DPP', 'DPP_API_INPUT_ID_MISSING');
456 					 FND_MESSAGE.set_token('ID', 'Vendor ID');
457 		       FND_MSG_PUB.add;
458            RAISE FND_API.G_EXC_ERROR;
459     ELSIF l_pl_notify_hdr_rec.vendor_site_id IS NULL THEN
460            DPP_UTILITY_PVT.DEBUG_MESSAGE( FND_LOG.LEVEL_STATEMENT, 'dpp.plsql.' || L_FULL_NAME,  'Vendor Site ID cannot be NULL');
461 		       FND_MESSAGE.set_name('DPP', 'DPP_API_INPUT_ID_MISSING');
462 					 FND_MESSAGE.set_token('ID', 'Vendor Site ID');
463 		       FND_MSG_PUB.add;
464            RAISE FND_API.G_EXC_ERROR;
465     ELSE
466         FOR get_vendor_rec IN get_vendor_csr(p_pl_notify_hdr_rec.vendor_id)
467           LOOP
468 
469           p_pl_notify_hdr_rec.vendor_name := get_vendor_rec.vendor_name;
470           p_pl_notify_hdr_rec.vendor_number := get_vendor_rec.vendor_num;
471 
472         END LOOP;
473 
474         FOR get_vendor_site_rec IN get_vendor_site_csr(p_pl_notify_hdr_rec.vendor_id, p_pl_notify_hdr_rec.vendor_site_id,
475         p_pl_notify_hdr_rec.org_id)
476           LOOP
477 
478           p_pl_notify_hdr_rec.vendor_site_code := get_vendor_site_rec.vendor_site_code;
479 
480         END LOOP;
481 
482 				FOR get_ou_rec IN get_ou_csr(p_pl_notify_hdr_rec.org_id)
483 					LOOP
484 
485 					p_pl_notify_hdr_rec.operating_unit := get_ou_rec.name;
486 
487         END LOOP;
488 
489       FOR i IN l_pl_notify_line_tbl.FIRST..l_pl_notify_line_tbl.LAST
490         LOOP
491 
492        IF l_pl_notify_line_tbl(i).inventory_item_id IS NULL THEN
493            DPP_UTILITY_PVT.DEBUG_MESSAGE( FND_LOG.LEVEL_STATEMENT, 'dpp.plsql.' || L_FULL_NAME,  'Inventory Item ID cannot be NULL');
494 		       FND_MESSAGE.set_name('DPP', 'DPP_API_INPUT_ID_MISSING');
495 					 FND_MESSAGE.set_token('ID', 'Inventory Item ID');
496 		       FND_MSG_PUB.add;
497            RAISE FND_API.G_EXC_ERROR;
498 
499        ELSE
500 
501         OPEN get_pricelist_csr(l_pl_notify_line_tbl(i).inventory_item_id, l_pl_notify_hdr_rec.vendor_id,l_pl_notify_hdr_rec.vendor_site_id, l_pl_notify_hdr_rec.org_id);
502         LOOP
503           FETCH get_pricelist_csr BULK COLLECT INTO l_pricelist_tbl;
504           EXIT WHEN get_pricelist_csr%NOTFOUND;
505         END LOOP;
506         CLOSE get_pricelist_csr;
507 
508         -- Initializing Nested Table
509 				IF NOT l_pricelist_tbl.EXISTS(1) THEN
510 				   l_pricelist_tbl(1) := NULL;
511         END IF;
512 
513         p_pl_notify_line_tbl(i).object_name_tbl := l_pricelist_tbl;
514 
515         FOR get_item_number_rec IN get_item_number_csr(l_pl_notify_line_tbl(i).inventory_item_id)
516           LOOP
517 
518           p_pl_notify_line_tbl(i).item_number := get_item_number_rec.concatenated_segments;
519 
520         END LOOP;
521 
522         END IF;
523 
524       END LOOP;
525 
526     END IF;
527 
528     DPP_UTILITY_PVT.DEBUG_MESSAGE( FND_LOG.LEVEL_STATEMENT, 'dpp.plsql.' || L_FULL_NAME,  'return status for API =>'||x_return_status);
529 
530     DPP_UTILITY_PVT.DEBUG_MESSAGE( FND_LOG.LEVEL_STATEMENT, 'dpp.plsql.' || L_FULL_NAME,  'Private API: ' || l_full_name || 'end');
531 
532    -- Standard call to get message count and if count is 1, get message info.
533     FND_MSG_PUB.Count_And_Get
534     (p_count => x_msg_count,
535      p_data => x_msg_data
536      );
537 
538   EXCEPTION
539 
540     WHEN FND_API.G_EXC_ERROR THEN
541 
542     x_return_status := FND_API.G_RET_STS_ERROR;
543    -- Standard call to get message count and if count=1, get the message
544     FND_MSG_PUB.Count_And_Get (
545                                p_encoded => FND_API.G_FALSE,
546                                p_count => x_msg_count,
547                                p_data => x_msg_data
548                                );
549 IF x_msg_count > 1 THEN
550    FOR I IN 1..x_msg_count LOOP
551        x_msg_data := SUBSTR((x_msg_data||' '|| FND_MSG_PUB.GET(P_MSG_INDEX => I, P_ENCODED => 'F')), 1, 4000);
552    END LOOP;
553 END IF;
554 
555     WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
556 
557     x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
558    -- Standard call to get message count and if count=1, get the message
559     FND_MSG_PUB.Count_And_Get (
560                                p_encoded => FND_API.G_FALSE,
561                                p_count => x_msg_count,
562                                p_data => x_msg_data
563                                );
564 IF x_msg_count > 1 THEN
565    FOR I IN 1..x_msg_count LOOP
566        x_msg_data := SUBSTR((x_msg_data||' '|| FND_MSG_PUB.GET(P_MSG_INDEX => I, P_ENCODED => 'F')), 1, 4000);
567    END LOOP;
568 END IF;
569 
570     WHEN OTHERS THEN
571 
572     x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
573     IF FND_MSG_PUB.Check_Msg_Level ( FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR)
574       THEN
575          fnd_message.set_name('FND', 'SQL_PLSQL_ERROR');
576 			   fnd_message.set_token('ROUTINE', 'DPP_PRICING_PVT.Notify_InboundPricelists');
577 			   fnd_message.set_token('ERRNO', sqlcode);
578          fnd_message.set_token('REASON', sqlerrm);
579          FND_MSG_PUB.ADD;
580          DPP_UTILITY_PVT.DEBUG_MESSAGE( FND_LOG.LEVEL_EXCEPTION, 'dpp.plsql.' || L_FULL_NAME,  'Error in notify inbound pricelists: '||SQLERRM);
581     END IF;
582    -- Standard call to get message count and if count=1, get the message
583     FND_MSG_PUB.Count_And_Get (
584                                p_encoded => FND_API.G_FALSE,
585                                p_count => x_msg_count,
586                                p_data => x_msg_data
587                                );
588 IF x_msg_count > 1 THEN
589    FOR I IN 1..x_msg_count LOOP
590        x_msg_data := SUBSTR((x_msg_data||' '|| FND_MSG_PUB.GET(P_MSG_INDEX => I, P_ENCODED => 'F')), 1, 4000);
591    END LOOP;
592 END IF;
593 
594   END Notify_InboundPricelists;
595 
596 --   ==============================================================================
597 --    Start of Comments
598 --   ==============================================================================
599 --   API Name :   Notify_Promotions
600 --   Type     :   Private
601 --   Pre-Req  :		None
602 --	 Function :		Derives information for promotions notification
603 --   Parameters
604 --
605 --   IN
606 --       p_api_version_number      IN   NUMBER     Required
607 --       p_init_msg_list           IN   VARCHAR2   Optional  Default = FND_API_G_FALSE
608 --       p_commit                  IN   VARCHAR2   Optional  Default = FND_API.G_FALSE
609 --       p_validation_level        IN   NUMBER     Optional  Default = FND_API.G_VALID_LEVEL_NONE
610 --       p_pl_notify_line_tbl            IN OUT  dpp_pl_notify_line_tbl_type  Required
611 --
612 --   OUT
613 --       x_return_status           OUT  VARCHAR2
614 --       x_msg_count               OUT  NUMBER
615 --       x_msg_data                OUT  VARCHAR2
616 --   Version : Current version 1.0
617 --
618 --   End of Comments
619 --   ==============================================================================
620 
621   PROCEDURE Notify_Promotions(
622                                p_api_version IN NUMBER
623                                , p_init_msg_list IN VARCHAR2 := FND_API.G_FALSE
624                                , p_commit IN VARCHAR2 := FND_API.G_FALSE
625                                , p_validation_level IN NUMBER := FND_API.G_VALID_LEVEL_NONE
626                                , x_return_status OUT NOCOPY VARCHAR2
627                                , x_msg_count OUT NOCOPY NUMBER
628                                , x_msg_data OUT NOCOPY VARCHAR2
629                                , p_pl_notify_hdr_rec IN OUT NOCOPY dpp_pl_notify_rec_type
630                                , p_pl_notify_line_tbl IN OUT NOCOPY dpp_pl_notify_line_tbl_type
631                                )
632   IS
633   l_api_name CONSTANT VARCHAR2(30) := 'Notify_Promotions';
634   l_api_version CONSTANT NUMBER := 1.0;
635   l_full_name CONSTANT VARCHAR2(60) := G_PKG_NAME || '.' || l_api_name;
636 
637   l_result NUMBER;
638   l_count  NUMBER;
639 
640   l_pl_notify_hdr_rec DPP_PRICING_PVT.dpp_pl_notify_rec_type := p_pl_notify_hdr_rec;
641   l_pl_notify_line_tbl   DPP_PRICING_PVT.dpp_pl_notify_line_tbl_type := p_pl_notify_line_tbl;
642   l_offer_tbl            DPP_PRICING_PVT.dpp_object_name_tbl_type;
643 
644 CURSOR get_offers_csr(p_inventory_item_id IN NUMBER) IS
645     SELECT oov.name offer_name
646       FROM ozf_offers_v oov,
647            qp_modifier_summary_v qmsv
648      WHERE qmsv.list_header_id = oov.list_header_id
649        AND g_trunc_sysdate between nvl(oov.start_date_active,g_trunc_sysdate)  AND  nvl(oov.end_date_active,g_trunc_sysdate)
650        AND g_trunc_sysdate between nvl(qmsv.start_date_active,g_trunc_sysdate) AND  nvl(qmsv.end_date_active,g_trunc_sysdate)
651        AND product_attribute_context = 'ITEM'
652        AND qmsv.prod_attr_segment_name = 'INVENTORY_ITEM_ID'
653        AND qmsv.product_attr_val = to_char(p_inventory_item_id)
654        AND oov.active_flag = 'Y'
655   GROUP BY oov.name
656 UNION
657  SELECT oov.name offer_name
658    FROM ozf_offers_v oov,
659         qp_modifier_summary_v qmsv,
660         mtl_item_categories mic
661   WHERE qmsv.list_header_id = oov.list_header_id
662     AND g_trunc_sysdate between nvl(oov.start_date_active,g_trunc_sysdate) AND nvl(oov.end_date_active,g_trunc_sysdate)
663     AND product_attribute_context = 'ITEM'
664     AND qmsv.prod_attr_segment_name = 'PRODUCT_CATEGORY'
665     AND mic.inventory_item_id = p_inventory_item_id
666     AND mic.category_id= product_attr_value
667     AND oov.active_flag = 'Y'
668 GROUP BY oov.name
669 UNION
670 SELECT NVL(qpl.description, qpl.name) offer_name
671   FROM ozf_activity_products oap,
672        qp_list_headers_all qpl
673  WHERE oap.OBJECT_TYPE IN('SCAN_DATA','LUMPSUM','NET_ACCRUAL','VOLUME_OFFER')
674    AND oap.ITEM = p_inventory_item_id
675    AND oap.object_id =  qpl.list_header_id
676    AND g_trunc_sysdate between nvl(oap.start_date,g_trunc_sysdate)   AND  nvl(oap.end_date,g_trunc_sysdate)
677    AND oap.active_flag = 'Y'
678    GROUP BY NVL(qpl.description, qpl.name)
679  UNION
680  SELECT NVL(qpl.description, qpl.name) offer_name
681    FROM ams_act_products oap,
682         qp_list_headers_all qpl,
683         ozf_offers oo
684 WHERE oap.arc_act_product_used_by ='OFFR'
685  AND  oap.inventory_item_id = p_inventory_item_id
686  AND  oap.act_product_used_by_id =  qpl.list_header_id
687  AND  oap.enabled_flag = 'Y'
688  AND  oo.offer_code = qpl.name
689  AND  oo.status_code = 'ACTIVE'
690  AND  trunc(nvl(oo.start_date,sysdate)) <= trunc(sysdate)
691  GROUP BY NVL(qpl.description, qpl.name);
692 
693 CURSOR get_item_number_csr(p_inventory_item_id IN NUMBER)
694   IS
695   SELECT msi.concatenated_segments
696     FROM mtl_system_items_kfv msi
697    WHERE inventory_item_id = p_inventory_item_id
698      AND ROWNUM = 1;
699 
700   CURSOR get_vendor_csr(p_vendor_id IN NUMBER)
701   IS
702   SELECT
703 	  vendor_name,
704 	  segment1 vendor_num
705 	FROM
706 	  ap_suppliers
707 	WHERE
708   vendor_id = p_vendor_id;
709 
710 CURSOR get_vendor_site_csr(p_vendor_id IN NUMBER, p_vendor_site_id IN NUMBER, p_org_id IN NUMBER)
711 	  IS
712   SELECT
713 	  vendor_site_code
714 	FROM
715 	  ap_supplier_sites_all
716 	WHERE
717 	  vendor_site_id = p_vendor_site_id    and
718 	  vendor_id = p_vendor_id   and
719     org_id = p_org_id;
720 
721 CURSOR get_ou_csr(p_org_id IN NUMBER)
722 	  IS
723   SELECT
724 	  name
725 	FROM
726 	  hr_operating_units
727 	WHERE
728 	  organization_id = p_org_id;
729 
730   BEGIN
731 
732 -- Standard call to check for call compatibility.
733    IF NOT FND_API.Compatible_API_Call ( l_api_version,
734       p_api_version,
735       l_api_name,
736       G_PKG_NAME)
737    THEN
738       RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
739    END IF;
740 -- Initialize message list if p_init_msg_list is set to TRUE.
741    IF FND_API.to_Boolean( p_init_msg_list )
742    THEN
743       FND_MSG_PUB.initialize;
744    END IF;
745 
746 
747    DPP_UTILITY_PVT.DEBUG_MESSAGE( FND_LOG.LEVEL_PROCEDURE, 'dpp.plsql.' || L_FULL_NAME,  'Private API: ' || l_api_name || 'start');
748 
749 -- Initialize API return status to sucess
750     x_return_status := FND_API.G_RET_STS_SUCCESS;
751 
752 --
753 -- API body
754 --
755 
756     IF l_pl_notify_hdr_rec.vendor_id IS NULL THEN
757        DPP_UTILITY_PVT.DEBUG_MESSAGE( FND_LOG.LEVEL_STATEMENT, 'dpp.plsql.' || L_FULL_NAME,  'Vendor ID cannot be NULL');
758 		       FND_MESSAGE.set_name('DPP', 'DPP_API_INPUT_ID_MISSING');
759 					 FND_MESSAGE.set_token('ID', 'Vendor ID');
760 		       FND_MSG_PUB.add;
761            RAISE FND_API.G_EXC_ERROR;
762     ELSIF l_pl_notify_hdr_rec.vendor_site_id IS NULL THEN
763            DPP_UTILITY_PVT.DEBUG_MESSAGE( FND_LOG.LEVEL_STATEMENT, 'dpp.plsql.' || L_FULL_NAME,  'Vendor Site ID cannot be NULL');
764 		       FND_MESSAGE.set_name('DPP', 'DPP_API_INPUT_ID_MISSING');
765 					 FND_MESSAGE.set_token('ID', 'Vendor Site ID');
766 		       FND_MSG_PUB.add;
767            RAISE FND_API.G_EXC_ERROR;
768     ELSIF l_pl_notify_hdr_rec.org_id IS NULL THEN
769            DPP_UTILITY_PVT.DEBUG_MESSAGE( FND_LOG.LEVEL_STATEMENT, 'dpp.plsql.' || L_FULL_NAME,  'Org ID cannot be NULL');
770 		       FND_MESSAGE.set_name('DPP', 'DPP_API_INPUT_ID_MISSING');
771 					 FND_MESSAGE.set_token('ID', 'Org ID');
772 		       FND_MSG_PUB.add;
773            RAISE FND_API.G_EXC_ERROR;
774     ELSE
775         FOR get_vendor_rec IN get_vendor_csr(p_pl_notify_hdr_rec.vendor_id) LOOP
776           p_pl_notify_hdr_rec.vendor_name := get_vendor_rec.vendor_name;
777           p_pl_notify_hdr_rec.vendor_number := get_vendor_rec.vendor_num;
778         END LOOP;
779 
780         FOR get_vendor_site_rec IN get_vendor_site_csr(p_pl_notify_hdr_rec.vendor_id, p_pl_notify_hdr_rec.vendor_site_id,
781         p_pl_notify_hdr_rec.org_id)  LOOP
782           p_pl_notify_hdr_rec.vendor_site_code := get_vendor_site_rec.vendor_site_code;
783         END LOOP;
784 
785         FOR get_ou_rec IN get_ou_csr(p_pl_notify_hdr_rec.org_id) LOOP
786                	p_pl_notify_hdr_rec.operating_unit := get_ou_rec.name;
787         END LOOP;
788     IF l_pl_notify_line_tbl.EXISTS(1) THEN
789        FOR i in l_pl_notify_line_tbl.FIRST..l_pl_notify_line_tbl.LAST LOOP
790            IF l_pl_notify_line_tbl(i).inventory_item_id IS NULL THEN
791                  DPP_UTILITY_PVT.DEBUG_MESSAGE( FND_LOG.LEVEL_STATEMENT, 'dpp.plsql.' || L_FULL_NAME,  'Inventory Item ID cannot be NULL');
792               FND_MESSAGE.set_name('DPP', 'DPP_API_INPUT_ID_MISSING');
793               FND_MESSAGE.set_token('ID', 'Inventory Item ID');
794               FND_MSG_PUB.add;
795               RAISE FND_API.G_EXC_ERROR;
796            ELSE
797               FOR get_item_number_rec IN get_item_number_csr(l_pl_notify_line_tbl(i).Inventory_Item_ID) LOOP
798                  l_pl_notify_line_tbl(i).Item_Number := get_item_number_rec.concatenated_segments ;
799               END LOOP;
800 
801               OPEN get_offers_csr(l_pl_notify_line_tbl(i).inventory_item_id);  LOOP
802                 FETCH get_offers_csr BULK COLLECT INTO l_offer_tbl;
803                 EXIT WHEN get_offers_csr%NOTFOUND;
804               END LOOP;
805               CLOSE get_offers_csr;
806               -- Initializing Nested Table
807 	      IF NOT l_offer_tbl.EXISTS(1) THEN
808 	         l_offer_tbl(1) := NULL;
809               END IF;
810               l_pl_notify_line_tbl(i).object_name_tbl := l_offer_tbl;
811            END IF;
812        END LOOP;
813     ELSE
814          DPP_UTILITY_PVT.DEBUG_MESSAGE( FND_LOG.LEVEL_STATEMENT, 'dpp.plsql.' || L_FULL_NAME,  'Line detals cannot be NULL');
815       FND_MESSAGE.set_name('DPP', 'DPP_API_INPUT_ID_MISSING');
816       FND_MESSAGE.set_token('ID', 'Line Details');
817       FND_MSG_PUB.add;
818       RAISE FND_API.G_EXC_ERROR;
819     END IF;
820   END IF;
821 
822   --Reassign the local variable to the out variable
823   p_pl_notify_line_tbl := l_pl_notify_line_tbl  ;
824 
825    DPP_UTILITY_PVT.DEBUG_MESSAGE( FND_LOG.LEVEL_STATEMENT, 'dpp.plsql.' || L_FULL_NAME,  'return status for API =>'||x_return_status);
826 
827    DPP_UTILITY_PVT.DEBUG_MESSAGE( FND_LOG.LEVEL_STATEMENT, 'dpp.plsql.' || L_FULL_NAME,  'Private API: ' || l_api_name || 'end');
828    -- Standard call to get message count and if count is 1, get message info.
829     FND_MSG_PUB.Count_And_Get
830     (p_count => x_msg_count,
831      p_data => x_msg_data
832      );
833  EXCEPTION
834 
835     WHEN FND_API.G_EXC_ERROR THEN
836 
837     x_return_status := FND_API.G_RET_STS_ERROR;
838    -- Standard call to get message count and if count=1, get the message
839     FND_MSG_PUB.Count_And_Get (
840                                p_encoded => FND_API.G_FALSE,
841                                p_count => x_msg_count,
842                                p_data => x_msg_data
843                                );
844 IF x_msg_count > 1 THEN
845    FOR I IN 1..x_msg_count LOOP
846        x_msg_data := SUBSTR((x_msg_data||' '|| FND_MSG_PUB.GET(P_MSG_INDEX => I, P_ENCODED => 'F')), 1, 4000);
847    END LOOP;
848 END IF;
849 
850 
851     WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
852 
853     x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
854    -- Standard call to get message count and if count=1, get the message
855     FND_MSG_PUB.Count_And_Get (
856                                p_encoded => FND_API.G_FALSE,
857                                p_count => x_msg_count,
858                                p_data => x_msg_data
859                                );
860 IF x_msg_count > 1 THEN
861    FOR I IN 1..x_msg_count LOOP
862        x_msg_data := SUBSTR((x_msg_data||' '|| FND_MSG_PUB.GET(P_MSG_INDEX => I, P_ENCODED => 'F')), 1, 4000);
863    END LOOP;
864 END IF;
865 
866     WHEN OTHERS THEN
867 
868     x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
869     IF FND_MSG_PUB.Check_Msg_Level ( FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR)
870       THEN
871          fnd_message.set_name('FND', 'SQL_PLSQL_ERROR');
872 			   fnd_message.set_token('ROUTINE', 'DPP_PRICING_PVT.Notify_Promotions');
873 			   fnd_message.set_token('ERRNO', sqlcode);
874          fnd_message.set_token('REASON', sqlerrm);
875          FND_MSG_PUB.ADD;
876          DPP_UTILITY_PVT.DEBUG_MESSAGE( FND_LOG.LEVEL_EXCEPTION, 'dpp.plsql.' || L_FULL_NAME,  'Error in notify promotions: '||SQLERRM);
877     END IF;
878    -- Standard call to get message count and if count=1, get the message
879     FND_MSG_PUB.Count_And_Get (
880                                p_encoded => FND_API.G_FALSE,
881                                p_count => x_msg_count,
882                                p_data => x_msg_data
883                                );
884 IF x_msg_count > 1 THEN
885    FOR I IN 1..x_msg_count LOOP
886        x_msg_data := SUBSTR((x_msg_data||' '|| FND_MSG_PUB.GET(P_MSG_INDEX => I, P_ENCODED => 'F')), 1, 4000);
887    END LOOP;
888 END IF;
889 
890   END Notify_Promotions;
891 
892 END DPP_PRICING_PVT;