DBA Data[Home] [Help]

PACKAGE BODY: APPS.IBE_QUOTE_SAVESHARE_V2_PVT

Source


1 package body IBE_QUOTE_SAVESHARE_V2_PVT as
2 /*$Header: IBEVSS2B.pls 120.2.12020000.2 2012/09/10 06:46:57 nsatyava ship $ */
3 l_true VARCHAR2(1)               := FND_API.G_TRUE;
4 
5 cursor c_check_active_cart(c_party_id        number,
6                            c_cust_account_id number) is
7        select quote_header_id
8        from   IBE_ACTIVE_QUOTES
9        where party_id        = c_party_id
10        and   cust_account_id = c_cust_account_id
11        and   record_type     = 'CART';
12 
13 
14 cursor  c_get_cart_name(c_q_hdr_id        number,
15                         c_party_id        number,
16                         c_cust_account_id number) is
17        select quote_name
18        from   aso_quote_headers_all
19        where  party_id = c_party_id
20        and    cust_account_id = c_cust_account_id
21        and    quote_header_id = c_q_hdr_id;
22 rec_get_cart_name        c_get_cart_name%rowtype;
23 rec_check_active_cart    c_check_active_cart%rowtype;
24 cursor c_userenv_partyid is
25        select customer_id
26        from FND_USER
27        where user_id = FND_GLOBAL.USER_ID;
28 rec_userenv_partyid      c_userenv_partyid%rowtype;
29 
30 /*This procedure is used to save the missing party_id and cust_account_id
31 of the recipient before cart activation*/
32 PROCEDURE save_party_id(
33           p_party_id         NUMBER,
34           p_cust_account_id  NUMBER,
35           p_retrieval_number NUMBER) is
36 
37   cursor c_find_party(c_retrieval_num NUMBER) is
38   select quote_sharee_id,quote_header_id,party_id, cust_account_id
39   from   ibe_sh_quote_access
40   where  quote_sharee_number = c_retrieval_num ;
41 
42   cursor c_get_sold_to(c_quote_header_id NUMBER) is
43   select cust_account_id, party_type
44   from aso_quote_headers_all a, hz_parties p
45   where a.party_id = p.party_id
46   and quote_header_id = c_quote_header_id;
47 
48   rec_get_sold_to c_get_sold_to%rowtype;
49   rec_find_party  c_find_party%rowtype;
50   l_recip_id        NUMBER := NULL;
51   l_cust_account_id NUMBER := NULL;
52   l_party_id        NUMBER := NULL;
53   l_sold_to_cust    NUMBER := NULL;
54   l_quote_header_id NUMBER;
55   l_party_type      VARCHAR2(2000);
56 
57   BEGIN
58 
59     FOR rec_find_party in c_find_party(p_retrieval_number) LOOP
60       l_recip_id        := rec_find_party.quote_sharee_id;
61       l_party_id        := rec_find_party.party_id;
62       l_cust_account_id := rec_find_party.cust_account_id;
63       l_quote_header_id := rec_find_party.quote_header_id;
64       exit when c_find_party%notfound;
65     END LOOP;
66     IF(l_party_id is null and l_cust_account_id is null) THEN
67 	  FOR rec_get_sold_to in c_get_sold_to(l_quote_header_id) LOOP
68 	    l_sold_to_cust := rec_get_sold_to.cust_account_id;
69         l_party_type   := rec_get_sold_to.party_type;
70 	    exit when c_get_sold_to%NOTFOUND;
71 	  END LOOP;
72       IF(((l_party_type = 'PARTY_RELATIONSHIP')
73          and (p_cust_account_id = l_sold_to_cust))or (l_party_type = 'PERSON')) THEN
74 
75         IBE_SH_QUOTE_ACCESS_PKG.update_Row(
76             p_QUOTE_SHAREE_ID => l_recip_id
77            ,p_party_id        => p_party_id
78            ,p_cust_account_id => p_cust_account_id);
79       ELSE
80         IF (IBE_UTIL.G_DEBUGON = l_true) THEN
81            IBE_UTIL.DEBUG('Not saving party and cust_account_id because account_ids do not match');
82         END IF;
83         IF FND_Msg_Pub.Check_Msg_Level (FND_Msg_Pub.G_MSG_LVL_ERROR) THEN
84           FND_Message.Set_Name('IBE', 'IBE_SC_ERR_USERACCESS');
85           FND_Msg_Pub.Add;
86         END IF;
87   	    RAISE FND_API.G_EXC_ERROR;
88       END IF;
89     END IF;
90   END;
91 
92 /*The "Main" api; a sort of counterpart to IBE_Quote_Save_pvt.save where this api will be the single point
93 of entry for all of the new save, share, append, and active cart operations
94 Usages:
95 One for each operation_code:
96 "APPEND", "ACTIVATE", "DEACTIVATE", "NAME_CART", "SAVE_RECIPIENTS",
97 "STOP_SHARING", "SAVE_CART_AND_RECIPIENTS", "END_WORKING"*/
98 Procedure save_share_v2 (
99     P_saveshare_control_rec   IN  SAVESHARE_CONTROL_REC_TYPE
100                                   := G_MISS_saveshare_control_rec              ,
101     P_party_id                IN  Number                                       ,
102     P_cust_account_id         IN  Number                                       ,
103     P_retrieval_number        IN  Number                                       ,
104     P_Quote_header_rec        IN  ASO_QUOTE_PUB.Qte_Header_Rec_Type            ,
105     P_quote_access_tbl        IN  IBE_QUOTE_SAVESHARE_pvt.QUOTE_ACCESS_Tbl_Type
106                                   := IBE_QUOTE_SAVESHARE_pvt.G_miss_quote_access_Tbl,
107     P_source_quote_header_id  IN  NUMBER   := FND_API.G_MISS_NUM               ,
108     P_source_last_update_date IN  Date     := FND_API.G_MISS_DATE              ,
109     p_minisite_id             IN  NUMBER                                       ,
110     p_URL                     IN  VARCHAR2                                     ,
111     p_notes                   IN  VARCHAR2 := FND_API.G_MISS_CHAR              ,
112     p_api_version             IN  NUMBER   := 1                                ,
113     p_init_msg_list           IN  VARCHAR2 := FND_API.G_TRUE                   ,
114     p_commit                  IN  VARCHAR2 := FND_API.G_FALSE                  ,
115     x_return_status           OUT NOCOPY VARCHAR2                              ,
116     x_msg_count               OUT NOCOPY NUMBER                                ,
117     x_msg_data                OUT NOCOPY VARCHAR2                              ) is
118 
119     L_control_rec      aso_quote_pub.control_rec_type;
120     l_quote_header_id  NUMBER;
121     l_api_name         CONSTANT VARCHAR2(30)   := 'SAVESHARE_V2';
122     l_api_version      CONSTANT NUMBER         := 1.0;
123     l_last_update_date DATE                    ;
124 
125 BEGIN
126     SAVEPOINT  SAVESHARE_V2;
127   -- Standard call to check for call compatibility.
128   IF NOT FND_API.Compatible_API_Call (	l_api_version,
129                              			P_Api_Version,
130                                    		l_api_name,
131                        					G_PKG_NAME )
132   THEN
133       RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
134   END IF;
135    -- Initialize message list IF p_init_msg_list is set to TRUE.
136   IF FND_API.to_Boolean( p_init_msg_list ) THEN
137       FND_MSG_PUB.initialize;
138   END IF;
139 
140    --  Initialize API return status to success
141   x_return_status := FND_API.G_RET_STS_SUCCESS;
142 -------------------------------------------------------------------------------------------------------------
143 --API Body start
144 -------------------------------------------------------------------------------------------------------------
145   IF (IBE_UTIL.G_DEBUGON = l_true) THEN
146      IBE_UTIL.DEBUG('IBE_QUOTE_SAVESHARE_V2_PVT.save_share_v2: START');
147      IBE_UTIL.DEBUG('saveshare_control_rec.operation_code is '||p_saveshare_control_rec.operation_code);
148   END IF;
149 
150   Validate_share_Update(
151     p_api_version_number  => 1.0
152    ,p_init_msg_list       => FND_API.G_FALSE
153    ,p_quote_header_rec    => P_Quote_header_rec
154    ,p_quote_access_tbl    => p_quote_access_tbl
155    ,p_party_id            => P_party_id
156    ,p_cust_account_id     => P_cust_account_id
157    ,p_retrieval_number    => p_retrieval_number
158    ,p_operation_code      => p_saveshare_control_rec.operation_code
159    ,x_return_status       => x_return_status
160    ,x_msg_count           => x_msg_count
161    ,x_msg_data            => x_msg_data)  ;
162 
163   IF (x_return_status = FND_API.G_RET_STS_ERROR) THEN
164     RAISE FND_API.G_EXC_ERROR;
165   END IF;
166   IF (x_return_status = FND_API.G_RET_STS_UNEXP_ERROR) THEN
167     RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
168   END IF;
169 
170   --DBMS_OUTPUT.PUT_LINE('saveshare_control_rec.operation_code is '||p_saveshare_control_rec.operation_code);
171     IF ((p_saveshare_control_rec.operation_code = OP_NAME_CART)
172        OR (p_saveshare_control_rec.operation_code = OP_SAVE_CART_AND_RECIPIENTS)) THEN
173       IF (IBE_UTIL.G_DEBUGON = l_true) THEN
174          IBE_UTIL.DEBUG('calling IBE_Quote_Save_pvt.SAVE to save the quote name');
175       END IF;
176       --DBMS_OUTPUT.PUT_LINE_LINE('calling IBE_Quote_Save_pvt.SAVE to save the quote name');
177       --DBMS_OUTPUT.PUT_LINE_LINE('incoming quote_name :'||P_Quote_header_rec.quote_name);
178       --DBMS_OUTPUT.PUT_LINE_LINE('incoming quote_headeR_id :'||P_Quote_header_rec.quote_header_id);
179       IBE_Quote_Save_pvt.save(
180         p_api_version_number => p_api_version                      ,
181         p_init_msg_list      => fnd_api.g_false                    ,
182         p_commit             => fnd_api.g_false                    ,
183 
184         p_qte_header_rec     => P_Quote_header_rec                 ,
185         p_control_rec        => P_saveshare_control_rec.control_rec,
186         x_quote_header_id    => l_quote_header_id                  ,
187         x_last_update_date   => l_last_update_date                 ,
188 
189         x_return_status      => x_return_status                    ,
190         x_msg_count          => x_msg_count                        ,
191         x_msg_data           => x_msg_data);
192 
193       IF (x_return_status = FND_API.G_RET_STS_ERROR) THEN
194         RAISE FND_API.G_EXC_ERROR;
195       END IF;
196 
197       IF (x_return_status = FND_API.G_RET_STS_UNEXP_ERROR) THEN
198         RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
199       END IF;
200     END IF;
201 
202     IF ((p_saveshare_control_rec.operation_code = OP_SAVE_RECIPIENTS)
203        OR (p_saveshare_control_rec.operation_code = OP_SAVE_CART_AND_RECIPIENTS)) THEN
204       IF (IBE_UTIL.G_DEBUGON = l_true) THEN
205          IBE_UTIL.DEBUG('Calling save_recipients to save recipient information');
206       END IF;
207       --DBMS_OUTPUT.PUT_LINE('Calling save_recipients to save recipient information ');
208       --dbms_output.put_line('Comments passed :  '||p_notes);
209       IF(nvl(p_quote_access_tbl.count,0) > 0) THEN
210         IBE_QUOTE_SAVESHARE_V2_PVT.save_recipients(
211               p_quote_access_tbl   => p_quote_access_tbl                ,
212               p_quote_header_id    => p_quote_header_rec.quote_header_id,
213               p_party_id           => p_party_id                        ,
214               p_cust_account_id    => p_cust_account_id                 ,
215               p_url                => p_url                             ,
216               p_minisite_id        => p_minisite_id                     ,
217               p_notes              => p_notes                           ,
218               p_api_version        => p_api_version                     ,
219               p_init_msg_list      => fnd_api.g_false                   ,
220               p_commit             => fnd_api.g_false                   ,
221               x_return_status      => x_return_status                   ,
222               x_msg_count          => x_msg_count                       ,
223               x_msg_data           => x_msg_data);
224 
225         IF (x_return_status = FND_API.G_RET_STS_ERROR) THEN
226           RAISE FND_API.G_EXC_ERROR;
227         END IF;
228 
229         IF (x_return_status = FND_API.G_RET_STS_UNEXP_ERROR) THEN
230           RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
231         END IF;
232       END IF; -- IF(nvl(p_quote_access_tbl.count,0)
233     END IF;
234 
235 
236     IF(p_saveshare_control_rec.operation_code = OP_APPEND) THEN
237       IF (IBE_UTIL.G_DEBUGON = l_true) THEN
238          IBE_UTIL.DEBUG('cALLING APPEND_QUOTE');
239       END IF;
240       IBE_QUOTE_SAVESHARE_V2_PVT.APPEND_QUOTE(
241         P_source_quote_header_id  => P_source_quote_header_id,
242         P_source_last_update_date => P_source_last_update_date,
243         P_target_header_rec       => P_Quote_header_rec,
244         P_control_rec             => P_saveshare_control_rec.control_rec,
245         P_delete_source_cart      => P_saveshare_control_rec.delete_source_cart,
246         P_combinesameitem         => P_saveshare_control_rec.combinesameitem,
247         P_minisite_id             => p_minisite_id,
248         p_api_version             => 1,
249         p_init_msg_list           => FND_API.G_FALSE,
250         p_commit                  => FND_API.G_FALSE,
251         x_return_status           => x_return_status,
252         x_msg_count               => x_msg_count,
253         x_msg_data                => x_msg_data);
254       IF (x_return_status = FND_API.G_RET_STS_ERROR) THEN
255         RAISE FND_API.G_EXC_ERROR;
256       END IF;
257 
258       IF (x_return_status = FND_API.G_RET_STS_UNEXP_ERROR) THEN
259         RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
260       END IF;
261 
262 
263     ELSIF(p_saveshare_control_rec.operation_code = OP_ACTIVATE_QUOTE) THEN
264       IF (IBE_UTIL.G_DEBUGON = l_true) THEN
265          IBE_UTIL.DEBUG('OPERATION_CODE IS: '||p_saveshare_control_rec.operation_code||'CALLING ACTIVATE_QUOTE');
266       END IF;
267       --DBMS_OUTPUT.PUT_LINE_LINE('OPERATION_CODE IS: '||p_saveshare_control_rec.operation_code||'CALLING ACTIVATE_QUOTE');
268       IBE_QUOTE_SAVESHARE_V2_PVT.ACTIVATE_QUOTE(
269                P_Quote_header_rec => P_Quote_header_rec ,
270                P_Party_id         => P_party_id                         ,
271                P_Cust_account_id  => P_cust_account_id                  ,
272                P_control_rec      => P_saveshare_control_rec.control_rec,
273                p_retrieval_number => p_retrieval_number                 ,
274                P_api_version      => P_api_version                      ,
275                P_init_msg_list    => FND_API.G_FALSE                    ,
276                P_commit           => FND_API.G_FALSE                    ,
277                x_return_status    => x_return_status                    ,
278                x_msg_count        => x_msg_count                        ,
279                x_msg_data         => x_msg_data);
280 
281       IF (x_return_status = FND_API.G_RET_STS_ERROR) THEN
282         RAISE FND_API.G_EXC_ERROR;
283       END IF;
284 
285       IF (x_return_status = FND_API.G_RET_STS_UNEXP_ERROR) THEN
286         RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
287       END IF;
288       --DBMS_OUTPUT.PUT_LINE_LINE('Finished calling ACTIVATE_QUOTE ');
289       IF (IBE_UTIL.G_DEBUGON = l_true) THEN
290          IBE_UTIL.DEBUG('Finished calling ACTIVATE_QUOTE');
291       END IF;
292 
293     ELSIF(p_saveshare_control_rec.operation_code = OP_END_WORKING) THEN
294       IF (IBE_UTIL.G_DEBUGON = l_true) THEN
295          IBE_UTIL.DEBUG(' Calling IBE_QUOTE_SAVE_SHARE_V2_PVT.END_WORKING');
296       END IF;
297       IBE_QUOTE_SAVESHARE_V2_PVT.END_WORKING(
298            P_Quote_access_tbl => p_quote_access_tbl ,
299            p_quote_header_id  => p_quote_header_rec.quote_header_id,
300            p_party_id         => p_party_id         ,
301            p_cust_account_id  => p_cust_account_id  ,
302            p_retrieval_number => p_retrieval_number ,
303            P_URL              => p_url              ,
304            P_minisite_id      => p_minisite_id      ,
305            p_notes            => p_notes            ,
306            p_api_version      => p_api_version      ,
307            p_init_msg_list    => fnd_api.g_false    ,
308            p_commit           => fnd_api.g_false    ,
309            x_return_status    => x_return_status    ,
310            x_msg_count        => x_msg_count        ,
311            x_msg_data         => x_msg_data         );
312       IF (x_return_status = FND_API.G_RET_STS_ERROR) THEN
313         RAISE FND_API.G_EXC_ERROR;
314       END IF;
315 
316       IF (x_return_status = FND_API.G_RET_STS_UNEXP_ERROR) THEN
317         RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
318       END IF;
319 
320       IF (IBE_UTIL.G_DEBUGON = l_true) THEN
321          IBE_UTIL.DEBUG('Done calling IBE_QUOTE_SAVE_SHARE_V2_PVT.END_WORKING');
322       END IF;
323 
324     ELSIF(p_saveshare_control_rec.operation_code = OP_STOP_SHARING) THEN
325       IBE_QUOTE_SAVESHARE_V2_PVT.STOP_SHARING (
326         p_quote_header_id  => P_Quote_header_rec.quote_header_id ,
327         P_minisite_id      => p_minisite_id                      ,
328         p_notes            => p_notes                            ,
329         p_quote_access_tbl => p_quote_access_tbl                 ,
330         p_api_version      => p_api_version                      ,
331         p_init_msg_list    => fnd_api.g_false                    ,
332         p_commit           => fnd_api.g_false                    ,
333         x_return_status    => x_return_status                    ,
334         x_msg_count        => x_msg_count                        ,
335         x_msg_data         => x_msg_data                         );
336 
337       IF (x_return_status = FND_API.G_RET_STS_ERROR) THEN
338         RAISE FND_API.G_EXC_ERROR;
339       END IF;
340 
341       IF (x_return_status = FND_API.G_RET_STS_UNEXP_ERROR) THEN
342         RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
343       END IF;
344     END IF;--Check for p_saveshare_control_rec.operation_code
345     IF (IBE_UTIL.G_DEBUGON = l_true) THEN
346        IBE_UTIL.DEBUG('P_saveshare_control_rec.deactivate_cart: '||P_saveshare_control_rec.deactivate_cart);
347     END IF;
348     IF ((P_saveshare_control_rec.deactivate_cart = FND_API.G_TRUE)
349        OR (p_saveshare_control_rec.operation_code = OP_DEACTIVATE)) THEN
350 
351       IF (IBE_UTIL.G_DEBUGON = l_true) THEN
352          IBE_UTIL.DEBUG('Calling deactivate API');
353       END IF;
354       --DBMS_OUTPUT.PUT_LINE_LINE('Calling deactivate API');
355       IBE_QUOTE_SAVESHARE_V2_PVT.DEACTIVATE_QUOTE  (
356           P_Quote_header_id  => P_Quote_header_rec.quote_header_id ,
357           P_Party_id         => p_party_id                         ,
358           P_Cust_account_id  => p_cust_account_id                  ,
359           P_minisite_id      => p_minisite_id                      ,
360           p_api_version      => p_api_version                      ,
361           p_init_msg_list    => fnd_api.g_false                    ,
362           p_commit           => fnd_api.g_false                    ,
363           x_return_status    => x_return_status                    ,
364           x_msg_count        => x_msg_count                        ,
365           x_msg_data         => x_msg_data                         );
366       IF (x_return_status = FND_API.G_RET_STS_ERROR) THEN
367         RAISE FND_API.G_EXC_ERROR;
368       END IF;
369 
370       IF (x_return_status = FND_API.G_RET_STS_UNEXP_ERROR) THEN
371         RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
372       END IF;
373       IF (IBE_UTIL.G_DEBUGON = l_true) THEN
374         IBE_UTIL.DEBUG('Deactivate owner cart after sharing:Done');
375       END IF;
376     END IF; --op_code = name_cart with deactivate
377 
378     IF (p_saveshare_control_rec.operation_code = OP_DELETE_CART) THEN
379       IF (IBE_UTIL.G_DEBUGON = l_true) THEN
380         IBE_UTIL.DEBUG('Save_share_v2:Op_code in p_saveshare_control_rec.operation_code: '||p_saveshare_control_rec.operation_code);
381         IBE_UTIL.DEBUG('Save_share_v2:Ready to call IBE_QUOTE_SAVE_PVT.Delete on: '||P_Quote_header_rec.quote_header_id);
382         IBE_UTIL.DEBUG('save_share_v2:Expunge flag passed to delete_cart is: '||p_saveshare_control_rec.delete_source_cart);
383         IBE_UTIL.DEBUG('save_share_v2:P_Quote_header_rec.last_update_date: '||P_Quote_header_rec.last_update_date);
384       END IF;
385       --dbms_output.put_line('Save_share_v2:Op_code in p_saveshare_control_rec.operation_code: '||p_saveshare_control_rec.operation_code);
386       --dbms_output.put_line('Save_share_v2:Ready to call IBE_QUOTE_SAVE_PVT.Delete on: '||P_Quote_header_rec.quote_header_id);
387 
388       IBE_QUOTE_SAVE_PVT.Delete(
389            p_api_version_number => p_api_version
390            ,p_init_msg_list      => fnd_api.g_false
391            ,p_commit             => fnd_api.g_false
392            ,x_return_status      => x_return_status
393            ,x_msg_count          => x_msg_count
394            ,x_msg_data           => x_msg_data
395            ,p_quote_header_id    => P_Quote_header_rec.quote_header_id
396            ,p_expunge_flag       => FND_API.G_FALSE
397            ,p_minisite_id        => p_minisite_id
398            ,p_last_update_date   => P_Quote_header_rec.last_update_date
399            ,p_Quote_access_tbl   => p_quote_access_tbl
400            ,p_notes              => p_notes
401            ,p_initiator_party_id => p_party_id
402            ,p_initiator_account_id => p_cust_account_id );
403         IF (x_return_status = FND_API.G_RET_STS_ERROR) THEN
404           RAISE FND_API.G_EXC_ERROR;
405         END IF;
406 
407         IF (x_return_status = FND_API.G_RET_STS_UNEXP_ERROR) THEN
408           RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
409         END IF;
410         IF (IBE_UTIL.G_DEBUGON = l_true) THEN
411           IBE_UTIL.DEBUG('Delete owner cart :Done');
412         END IF;
413     END IF; --op_code = OP_DELETE_CART
414 
415     IF (IBE_UTIL.G_DEBUGON = l_true) THEN
416        IBE_UTIL.DEBUG('IBE_QUOTE_SAVESHARE_V2_PVT.save_share_v2: END');
417     END IF;
418 EXCEPTION
419    WHEN FND_API.G_EXC_ERROR THEN
420       ROLLBACK TO SAVESHARE_V2;
421       x_return_status := FND_API.G_RET_STS_ERROR;
422 	  FND_Msg_Pub.Count_And_Get(p_encoded => FND_API.G_FALSE,
423                                 p_count   => x_msg_count    ,
424                                 p_data    => x_msg_data);
425       IF (IBE_UTIL.G_DEBUGON = l_true) THEN
426          IBE_Util.Debug('Expected Error in IBE_QUOTE_SAVESHARE_V2_PVT.save_share_v2()');
427       END IF;
428 
429    WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
430       ROLLBACK TO SAVESHARE_V2;
431       x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
432 	  FND_Msg_Pub.Count_And_Get(p_encoded => FND_API.G_FALSE,
433                                 p_count   => x_msg_count    ,
434                                 p_data    => x_msg_data);
435       IF (IBE_UTIL.G_DEBUGON = l_true) THEN
436          IBE_Util.Debug('Unexpected Error in IBE_QUOTE_SAVESHARE_V2_PVT.save_share_v2()');
437       END IF;
438 
439    WHEN OTHERS THEN
440       ROLLBACK TO SAVESHARE_V2;
441       x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
442 	  IF FND_Msg_Pub.Check_Msg_Level(FND_Msg_Pub.G_MSG_LVL_UNEXP_ERROR) THEN
443          FND_Msg_Pub.Add_Exc_Msg(G_PKG_NAME,
444                                  l_api_name);
445       END IF;
446       FND_Msg_Pub.Count_And_Get(p_encoded => FND_API.G_FALSE,
447                                 p_count   => x_msg_count    ,
448                                 p_data    => x_msg_data);
449       IF (IBE_UTIL.G_DEBUGON = l_true) THEN
450          IBE_Util.Debug('Unknown error  IBE_QUOTE_SAVESHARE_V2_PVT.save_share_v2()');
451       END IF;
452 
453 
454 END;
455 
456 /*To handle creating, updating, and removing of recipients.
457 *Usages:
458 -Add new set of recipients in first visit to Share Cart Details page
459 -Handling all possible updates to recipient info from Share Cart Details page in subsequent
460 updates from "Add/Modify Recipients" - this includes adding recipients, changing recipient
461 info (access level), and removing recipients.
462 -"End Working" button from recipient pages
463 -"Remove" button on the "List of Saved Carts" page for recipients.
464 -Possibly other api's to do single removes, adds, or updates. */
465 
466 Procedure save_recipients  (
467     P_Quote_access_tbl IN  IBE_QUOTE_SAVESHARE_pvt.QUOTE_ACCESS_TBL_TYPE
468                            := IBE_QUOTE_SAVESHARE_pvt.G_miss_quote_access_Tbl     ,
469     P_Quote_header_id  IN  Number                                          ,
470     P_Party_id         IN  Number                := FND_API.G_MISS_NUM     ,
471     P_Cust_account_id  IN  Number                := FND_API.G_MISS_NUM     ,
472     P_URL              IN  Varchar2              := FND_API.G_MISS_CHAR    ,
473     P_minisite_id      IN  Number                := FND_API.G_MISS_NUM     ,
474     p_send_notif       IN  Varchar2              := FND_API.G_TRUE         ,
475     p_notes            IN  Varchar2              := FND_API.G_MISS_CHAR    ,
476     p_api_version      IN  Number                := 1                      ,
477     p_init_msg_list    IN  varchar2              := FND_API.G_TRUE         ,
478     p_commit           IN  Varchar2              := FND_API.G_FALSE        ,
479     x_return_status    OUT NOCOPY Varchar2                                 ,
480     x_msg_count        OUT NOCOPY Number                                   ,
481     x_msg_data         OUT NOCOPY Varchar2                                 ) is
482 
483 cursor c_check_recip_row(c_quote_hdr_id    number,
484                          c_party_id        number,
485                          c_cust_account_id number) is
486   select quote_header_id, quote_sharee_id, quote_sharee_number
487   from ibe_sh_quote_access
488   where party_id        = c_party_id
489   and   cust_account_id = c_cust_account_id
490   and   quote_header_id = c_quote_hdr_id
491   and   nvl(end_date_active, sysdate+1) > sysdate;
492 
493 cursor c_recip_details(c_recip_id        NUMBER,
494                        c_quote_header_id NUMBER,
495                        c_party_id        NUMBER) is
496   select nvl(update_privilege_type_code, fnd_api.g_miss_char) access_level,
497          party_id,
498          cust_account_id,
499          contact_point_id,
500          quote_header_id,
501          quote_sharee_number,
502          quote_sharee_id,
503          fnd.customer_id shared_by_party_id
504   from  ibe_sh_quote_access ibe, fnd_user fnd
505   where ibe.created_by = fnd.user_id
506   and (quote_sharee_id    = c_recip_id
507       or (quote_header_id = c_quote_header_id
508       and party_id        = c_party_id));
509 
510 cursor c_get_owner_ids(c_quote_id number) is
511   select party_id, cust_account_id
512   from ASO_QUOTE_HEADERS_ALL
513   where quote_header_id = c_quote_id;
514 
515 cursor c_get_created_recip(c_quote_header_id number,
516                            c_party_id        number,
517                            c_created_by      number) is
518   select quote_sharee_id
519   from   ibe_sh_quote_access
520   where  party_id        = c_party_id
521   and    quote_header_id = c_quote_header_id
522   and    created_by      = c_created_by;
523 
524 rec_check_recip_row   c_check_recip_row%rowtype;
525 rec_recip_details     c_recip_details%rowtype;
526 rec_get_owner_ids c_get_owner_ids%rowtype;
527 rec_get_created_recip c_get_created_recip%rowtype;
528 
529 l_url                     VARCHAR2(2000);
530 l_quote_present           NUMBER := NULL;
531 l_retrieval_number        NUMBER;
532 l_quote_recip_id          NUMBER;
533 t_counter                 NUMBER := 1;
534 
535 l_old_access_level        VARCHAR2(1);
536 l_contact_point_id        NUMBER;
537 l_api_name                CONSTANT VARCHAR2(30)   := 'SAVERECIPIENTS_V2';
538 l_api_version             CONSTANT NUMBER         := 1.0;
539 l_call_save_contact_point VARCHAR2(1) := FND_API.G_FALSE;
540 l_quote_access_rec        IBE_QUOTE_SAVESHARE_pvt.QUOTE_ACCESS_rec_TYPE;
541 l_quote_access_rec_owr    IBE_QUOTE_SAVESHARE_pvt.QUOTE_ACCESS_rec_TYPE;
542 l_call_insert_handler     VARCHAR2(1) := FND_API.G_FALSE;
543 l_recip_party_id          NUMBER;
544 l_recip_cust_account_id   NUMBER;
545 l_sharing_partyid         NUMBER;
546 l_owner_partyid           NUMBER;
547 l_owner_accountid         NUMBER;
548 l_created_by              NUMBER;
549 
550 BEGIN
551 
552   SAVEPOINT  SAVERECIPIENTS_V2;
553   -- Standard call to check for call compatibility.
554   IF NOT FND_API.Compatible_API_Call (	l_api_version,
555                              			P_Api_Version,
556                                    		l_api_name,
557                        					G_PKG_NAME )
558   THEN
559       RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
560   END IF;
561    -- Initialize message list IF p_init_msg_list is set to TRUE.
562   IF FND_API.to_Boolean( p_init_msg_list ) THEN
563       FND_MSG_PUB.initialize;
564   END IF;
565 
566    --  Initialize API return status to success
567  x_return_status := FND_API.G_RET_STS_SUCCESS;
568 -------------------------------------------------------------------------------------------------------------
569 --API Body start
570 -------------------------------------------------------------------------------------------------------------
571 
572 
573   IF (IBE_UTIL.G_DEBUGON = l_true) THEN
574      IBE_UTIL.DEBUG('IBE_QUOTE_SAVESHARE_V2_PVT.save_recipients: START');
575   END IF;
576       /*Obtain the party id of the user performing the action on the UI from the env*/
577       FOR rec_userenv_partyid in c_userenv_partyid LOOP
578         l_sharing_partyid := rec_userenv_partyid.customer_id;
579         EXIT when c_userenv_partyid%notfound;
580       END LOOP;
581 
582       /*obtain the owner party_id of the cart/quote being dealt with*/
583       FOR rec_get_owner_ids in c_get_owner_ids(p_quote_header_id) LOOP
584         l_owner_partyid := rec_get_owner_ids.party_id;
585         l_owner_accountid := rec_get_owner_ids.cust_account_id;
586         EXIT when c_get_owner_ids%notfound;
587       END LOOP;
588       --Loop around the input quote_access table
589       FOR counter IN 1..P_quote_access_tbl.COUNT LOOP
590 	   l_call_insert_handler     := FND_API.G_FALSE;
591 	   l_call_save_contact_point := FND_API.G_FALSE;
592        l_quote_access_rec := P_Quote_access_tbl(counter);
593 
594         /*Obtaining the recipient details here when there is a recipient_id or a combnation of party_id
595         and quote_hdr_id available in the input quote access record.
596         This query will tell us if there is already a recipiet record avialable to re-use.*/
597         --Old_access_level will be relevant only when the Op-code in P_Quote_access_tbl(counter) is UPDATE
598         --Old_access_level will be passed to notify_access_change API
599         IF (IBE_UTIL.G_DEBUGON = l_true) THEN
600            IBE_UTIL.DEBUG('Incoming Quote_sharee_id = '||P_Quote_access_tbl(counter).quote_sharee_id);
601            IBE_UTIL.DEBUG('Incoming Quote_header_id = '||P_Quote_access_tbl(counter).quote_header_id);
602            IBE_UTIL.DEBUG('Incoming party_id = '||P_Quote_access_tbl(counter).party_id);
603         END IF;
604 
605         IF(((P_Quote_access_tbl(counter).quote_sharee_id is not null) and
606            (P_Quote_access_tbl(counter).quote_sharee_id <> FND_API.G_MISS_NUM))or
607            ((p_quote_access_tbl(counter).party_id is not null) and
608             (p_quote_access_tbl(counter).party_id <> FND_API.G_MISS_NUM))) THEN
609           FOR rec_recip_details in c_recip_details(P_Quote_access_tbl(counter).quote_sharee_id,
610                                                    P_Quote_access_tbl(counter).quote_header_id,
611                                                    P_Quote_access_tbl(counter).party_id) LOOP
612 
613             l_old_access_level                     := rec_recip_details.access_level;
614             l_quote_access_rec.contact_point_id    := rec_recip_details.contact_point_id;
615             l_quote_access_rec.quote_header_id     := rec_recip_details.quote_header_id;
616             l_quote_access_rec.quote_sharee_number := rec_recip_details.quote_sharee_number;
617 
618             --Use the incoming quote sharee id
619             IF ((P_Quote_access_tbl(counter).quote_sharee_id is null) OR
620                (P_Quote_access_tbl(counter).quote_sharee_id = FND_API.G_MISS_NUM)) THEN
621               l_quote_access_rec.quote_sharee_id := rec_recip_details.quote_sharee_id;
622             ELSE
623               l_quote_access_rec.quote_sharee_id := P_Quote_access_tbl(counter).quote_sharee_id;
624             END IF;
625 
626             l_quote_access_rec.shared_by_party_id  := rec_recip_details.shared_by_party_id;
627             /*If no party_id and cust_account_id are passed in then query them from the database
628             using the quote sharee id*/
629             IF (((p_quote_access_tbl(counter).party_id       is null ) OR
630              (p_quote_access_tbl(counter).party_id         = FND_API.G_MISS_NUM))AND
631              ((p_quote_access_tbl(counter).cust_account_id   is null ) OR
632              (p_quote_access_tbl(counter).cust_account_id  = FND_API.G_MISS_NUM))) THEN
633 
634               l_quote_access_rec.party_id         := rec_recip_details.party_id;
635               l_quote_access_rec.cust_account_id  := rec_recip_details.cust_account_id;
636 
637             ELSE
638 
639               l_quote_access_rec.party_id        := p_quote_access_tbl(counter).party_id;
640               l_quote_access_rec.cust_account_id := p_quote_access_tbl(counter).cust_account_id;
641 
642             END IF;
643             EXIT WHEN c_recip_details%notfound;
644           END LOOP;
645         ELSE
646           IF (IBE_UTIL.G_DEBUGON = l_true) THEN
647              IBE_UTIL.DEBUG('Cannot query recipient details ,recipient_id is null or g_miss');
648              IBE_UTIL.DEBUG('Saving recipients for first time?!');
649           END IF;
650         END IF; --if p_quote_access_tbl(counter).quote_sharee_id is not null and g_miss
651 
652         /*Processing the recipients in the input access table according to the op-codes
653         corresponding to each recipient record*/
654         --Start with 'CREATE' op_code
655         IF( p_quote_access_tbl(counter).operation_code = 'CREATE') THEN
656 
657           IF (IBE_UTIL.G_DEBUGON = l_true) THEN
658              IBE_UTIL.DEBUG('Operation code in quote_access_tbl is '||p_quote_access_tbl(counter).operation_code);
659           END IF;
660           /*Open this cursor to check if there are any inactive(end-dated) rows existing in sh_quote_access
661           for this party, cust and quote combination */
662           /*If there is an end-dated record present for the given combination of party, cust_account,
663             quote_hdr in quote_access then use this record, else insert a new record*/
664           IF (IBE_UTIL.G_DEBUGON = l_true) THEN
665             IBE_UTIL.DEBUG('Save_recipients: Opening c_get_created_recip');
666             IBE_UTIL.DEBUG('Save_recipients: FND_GLOBAL.USER_ID: '||FND_GLOBAL.USER_ID);
667           END IF;
668           l_quote_access_rec.quote_sharee_id := FND_API.G_MISS_NUM;
669           FOR rec_get_created_recip in c_get_created_recip(p_quote_access_tbl(counter).quote_header_id,
670                                                            p_quote_access_tbl(counter).party_id,
671                                                            FND_GLOBAL.USER_ID) LOOP
672             l_quote_access_rec.quote_sharee_id := rec_get_created_recip.quote_sharee_id;
673             IF (IBE_UTIL.G_DEBUGON = l_true) THEN
674              IBE_UTIL.DEBUG('Save_recipients: rec_get_created_recip found quote_sharee_id: '||l_quote_access_rec.quote_sharee_id);
675             END IF;
676 
677             EXIT when c_get_created_recip%NOTFOUND;
678           END LOOP;
679           IF (l_quote_access_rec.quote_sharee_id is not null AND
680               l_quote_access_rec.quote_sharee_id <> FND_API.G_MISS_NUM) THEN
681             IF (IBE_UTIL.G_DEBUGON = l_true) THEN
682                IBE_UTIL.DEBUG('Record found for the recipient in quote_access table, need to update it');
683             END IF;
684 
685             IBE_SH_QUOTE_ACCESS_PKG.update_Row(
686                       p_quote_sharee_id            => l_quote_access_rec.quote_sharee_id
687                      ,p_quote_header_id            => p_quote_header_id
688                      ,p_party_id                   => p_quote_access_tbl(counter).party_id
689                      ,p_cust_account_id            => p_quote_access_tbl(counter).cust_account_id
690                      ,p_update_privilege_type_code => p_quote_access_tbl(counter).update_privilege_type_code
691                      ,p_contact_point_id           => p_quote_access_tbl(counter).contact_point_id
692                      ,p_start_date_active          => sysdate
693                      ,p_end_date_active            => null);
694             IF (IBE_UTIL.G_DEBUGON = l_true) THEN
695                IBE_UTIL.DEBUG('Finsihed calling update handler of quote_access table');
696             END IF;
697             --Calling save_contact_point for the updated recipient record just in case the
698             --contact point has changed
699             IF(p_quote_access_tbl(counter).contact_point_id is null and
700                p_quote_access_tbl(counter).EMAIL_CONTACT_ADDRESS is not null) THEN
701               l_call_save_contact_point := FND_API.G_TRUE;
702             END IF;
703 
704           ELSE --Need to create a new record
705             IF (IBE_UTIL.G_DEBUGON = l_true) THEN
706                IBE_UTIL.DEBUG('Record not found for this recipient in quote_access table');
707             END IF;
708             --Obtain the recipient number here
709             select IBE_SH_QUOTE_ACCESS_s1.nextval into l_quote_recip_id
710             from dual;
711             IF (IBE_UTIL.G_DEBUGON = l_true) THEN
712                IBE_UTIL.DEBUG('sharee id from the sequence is '||l_quote_recip_id );
713             END IF;
714 
715             IBE_QUOTE_SAVESHARE_pvt.GenerateShareeNumber(
716                               p_quote_header_id => p_quote_header_id,
717                               p_recip_id        => l_quote_recip_id,
718                               x_sharee_number   => l_quote_access_rec.quote_sharee_number);
719 
720             IF (IBE_UTIL.G_DEBUGON = l_true) THEN
721                IBE_UTIL.DEBUG('sharee number is '||l_quote_access_rec.quote_sharee_number );
722             END IF;
723 
724             --Deal with saving the contact point here
725             /*A contact point is created when there is an input e-mail address and a null
726             input contact point id*/
727             IF (p_quote_access_tbl(counter).EMAIL_CONTACT_ADDRESS is not null
728               and p_quote_access_tbl(counter).EMAIL_CONTACT_ADDRESS <> fnd_api.g_miss_char
729               and (p_quote_access_tbl(counter).contact_point_id is null or
730                    p_quote_access_tbl(counter).contact_point_id = FND_API.G_MISS_NUM)) THEN
731               IF (IBE_UTIL.G_DEBUGON = l_true) THEN
732                  IBE_UTIL.DEBUG('saving contact point for the current recipient record');
733               END IF;
734               l_call_save_contact_point := FND_API.G_TRUE;
735 
736             --This is the case when the incoming B2B record has a valid contact_point_id
737             ELSIF((p_quote_access_tbl(counter).contact_point_id is not null )
738                   and (p_quote_access_tbl(counter).contact_point_id <> FND_API.G_MISS_NUM)) THEN
739               IF (IBE_UTIL.G_DEBUGON = l_true) THEN
740                  IBE_UTIL.DEBUG('Contact point Id found in the input quote access record');
741               END IF;
742               l_contact_point_id :=  p_quote_access_tbl(counter).contact_point_id;
743 
744             END IF;--save_contact_point
745             l_call_insert_handler :=  FND_API.G_TRUE;
746 
747           END IF;-- existing recip or new recip
748 
749           --Constructing the URL here
750           l_url := p_url||l_quote_access_rec.quote_sharee_number;
751           IF (IBE_UTIL.G_DEBUGON = l_true) THEN
752              IBE_UTIL.DEBUG('URL of shared cart is: '||l_url);
753           END IF;
754 
755           --Saving the contact_point here
756           IF l_call_save_contact_point = FND_API.G_TRUE THEN
757             save_contact_point
758                 (  p_api_version_number => P_Api_Version
759                   ,p_init_msg_list      => FND_API.G_FALSE
760                   ,p_commit             => FND_API.G_FALSE
761                   ,P_EMAIL              => p_quote_access_tbl(counter).EMAIL_CONTACT_ADDRESS
762                   ,p_owner_table_id     => l_quote_recip_id
763                   ,p_mode               => 'EMAIL'
764                   ,x_contact_point_id   => l_contact_point_id
765                   ,x_return_status      => x_return_status
766                   ,x_msg_count          => x_msg_count
767                   ,x_msg_data           => x_msg_data );
768               IF (x_return_status = FND_API.G_RET_STS_ERROR) THEN
769                 RAISE FND_API.G_EXC_ERROR;
770               END IF;
771               IF (x_return_status = FND_API.G_RET_STS_UNEXP_ERROR) THEN
772                 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
773               END IF;
774 
775               IF (IBE_UTIL.G_DEBUGON = l_true) THEN
776                  IBE_UTIL.DEBUG('Done saving contact point: '||l_contact_point_id);
777               END IF;
778               l_quote_access_rec.contact_point_id := l_contact_point_id;
779 
780           END IF;-- l_call_save_contact_point
781 
782           IF (l_call_insert_handler = FND_API.G_TRUE) THEN
783             IF (IBE_UTIL.G_DEBUGON = l_true) THEN
784                IBE_UTIL.DEBUG('calling ins handler ');
785                IBE_UTIL.DEBUG('p_quote_access_tbl(counter).recipient_name: '||p_quote_access_tbl(counter).recipient_name);
786             END IF;
787             IBE_SH_QUOTE_ACCESS_PKG.Insert_Row(
788                   p_quote_sharee_id            => l_quote_recip_id,
789                   p_quote_header_id            => p_quote_header_id,
790                   p_quote_sharee_number		   => l_quote_access_rec.quote_sharee_number,
791                   p_update_privilege_type_code => p_quote_access_tbl(counter).update_privilege_type_code,
792                   p_party_id                   => p_quote_access_tbl(counter).party_id,
793                   p_cust_account_id            => p_quote_access_tbl(counter).cust_account_id,
794                   p_recipient_name             => p_quote_access_tbl(counter).recipient_name,
795                   p_contact_point_id           => l_contact_point_id);
796             IF (IBE_UTIL.G_DEBUGON = l_true) THEN
797                IBE_UTIL.DEBUG('finished inserting ');
798             END IF;
799           END IF;
800           l_quote_access_rec.quote_sharee_id := l_quote_recip_id;
801           --calling the new shared cart notification API here
802 
803           IF ((p_send_notif = FND_API.G_TRUE) AND (p_quote_access_tbl(counter).notify_flag = FND_API.G_TRUE)) THEN
804             IBE_WORKFLOW_PVT.Notify_Shared_Cart(
805                 p_api_version        => p_api_version      ,
806                 p_init_msg_list      => p_init_msg_list    ,
807                 p_quote_access_rec   => l_quote_access_rec ,
808                 p_minisite_id        => p_minisite_id      ,
809                 p_url                => l_url              ,
810                 p_shared_by_party_id => l_sharing_partyid  ,
811                 p_notes              => p_notes            ,
812                 x_return_status      => x_return_status    ,
813                 x_msg_count          => x_msg_count        ,
814                 x_msg_data           => x_msg_data         );
815 
816               IF (x_return_status = FND_API.G_RET_STS_ERROR) THEN
817                 RAISE FND_API.G_EXC_ERROR;
818               END IF;
819 
820               IF (x_return_status = FND_API.G_RET_STS_UNEXP_ERROR) THEN
821                 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
822               END IF;
823           END IF;
824 
825           --DBMS_OUTPUT.PUT_LINE('Done calling the new shared cart notification API ');
826 
827         ELSIF(p_quote_access_tbl(counter).operation_code = 'UPDATE') THEN
828 
829           IF (IBE_UTIL.G_DEBUGON = l_true) THEN
830              IBE_UTIL.DEBUG('Operation code in quote_access_table is UPDATE');
831           END IF;
832           IF((l_quote_access_rec.update_privilege_type_code is not null) and
833              (l_quote_access_rec.update_privilege_type_code <> FND_API.G_MISS_CHAR) and
834              (l_old_access_level <> l_quote_access_rec.update_privilege_type_code)) then
835             IF (IBE_UTIL.G_DEBUGON = l_true) THEN
836               IBE_UTIL.DEBUG('Calling IBE_SH_QUOTE_ACCESS_PKG.Update_Row to update the recip record');
837               IBE_UTIL.DEBUG('p_quote_access_tbl(counter).quote_sharee_id: '||p_quote_access_tbl(counter).quote_sharee_id);
838             END IF;
839 
840             IBE_SH_QUOTE_ACCESS_PKG.Update_Row(
841               p_QUOTE_HEADER_ID               => p_quote_header_id,
842               p_quote_sharee_id               => p_quote_access_tbl(counter).quote_sharee_id,
843               p_UPDATE_PRIVILEGE_TYPE_CODE    => p_quote_access_tbl(counter).update_privilege_type_code);
844 
845             IF (IBE_UTIL.G_DEBUGON = l_true) THEN
846                IBE_UTIL.DEBUG('Done IBE_SH_QUOTE_ACCESS_PKG.Update_Row ');
847             END IF;
848 
849             /*If access level is being downgraded to 'read-only' */
850             IF(p_quote_access_tbl(counter).UPDATE_PRIVILEGE_TYPE_CODE = 'R') THEN
851               IF (IBE_UTIL.G_DEBUGON = l_true) THEN
852                  IBE_UTIL.DEBUG('Update privilege type is downgraded to read-only');
853               END IF;
854               FOR rec_check_active_cart in c_check_active_cart(l_quote_access_rec.party_id ,
855                                                              l_quote_access_rec.cust_account_id) loop
856                 l_quote_present := rec_check_active_cart.quote_header_id;
857                 IF (IBE_UTIL.G_DEBUGON = l_true) THEN
858                   IBE_UTIL.DEBUG('Recipient has '||l_quote_present||'as active cart');
859                 END IF;
860                 IF((l_quote_present is not null) AND (p_quote_header_id = l_quote_present)) THEN
861                   IF (IBE_UTIL.G_DEBUGON = l_true) THEN
862                     IBE_UTIL.DEBUG('Recipient has '||l_quote_present||' shared cart as the active-cart , delete this while downgrading level');
863                   END IF;
864                   --if this recipient has this shared cart as the active cart , then need to delete this
865                   IF (IBE_UTIL.G_DEBUGON = l_true) THEN
866                     IBE_UTIL.DEBUG('Calling delete handler of active_quotes_all table');
867                   END IF;
868 
869                   IBE_ACTIVE_QUOTES_ALL_PKG.UPDATE_ROW(
870                           x_object_version_number => 1,
871                           x_quote_header_id       => null,
872                           x_party_id              => l_quote_access_rec.party_id       ,
873                           x_cust_account_id       => l_quote_access_rec.cust_account_id,
874                           X_RECORD_TYPE           => 'CART',
875                           X_CURRENCY_CODE         => null,
876                           x_last_update_date      => sysdate,
877                           x_last_updated_by       => fnd_global.user_id,
878                           x_last_update_login     => 1);
879                   IF (IBE_UTIL.G_DEBUGON = l_true) THEN
880                     IBE_UTIL.DEBUG('Done calling Update handler of active_quotes_all table to erase the quote header id' );
881                   END IF;
882                 END IF;
883                 EXIT WHEN c_check_active_cart%NOTFOUND;
884               END LOOP; -- for c_check_active_cart
885             END IF; -- when privelege is read_only
886 
887             -- new access level is available in the quote access record
888             IF(p_quote_access_tbl(counter).notify_flag = FND_API.G_TRUE) THEN
889               IF (IBE_UTIL.G_DEBUGON = l_true) THEN
890                 IBE_UTIL.DEBUG('Save_recipients: Ready to call Notify_access_change' );
891               END IF;
892               --dbms_output.put_line('Save_recipients: Ready to call Notify_access_change ');
893               IBE_WORKFLOW_PVT.Notify_access_change(
894                 p_api_version        => p_api_version      ,
895                 p_init_msg_list      => p_init_msg_list    ,
896                 p_quote_access_rec   => l_quote_access_rec ,
897                 p_minisite_id        => p_minisite_id      ,
898                 p_url                => p_url              ,
899                 p_old_accesslevel    => l_old_access_level ,
900                 p_notes              => p_notes            ,
901                 p_shared_by_party_id => l_sharing_partyid  ,
902                 x_return_status      => x_return_status    ,
903                 x_msg_count          => x_msg_count        ,
904                 x_msg_data           => x_msg_data         );
905 
906                 IF (x_return_status = FND_API.G_RET_STS_ERROR) THEN
907                   RAISE FND_API.G_EXC_ERROR;
908                 END IF;
909 
910                 IF (x_return_status = FND_API.G_RET_STS_UNEXP_ERROR) THEN
911                   RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
912                 END IF;
913             END IF; -- end if notify flag = true for notify access change email
914           ELSE
915             IF (IBE_UTIL.G_DEBUGON = l_true) THEN
916               IBE_UTIL.DEBUG('Opcode was update but access level has not changed. Consider generic email');
917               IBE_UTIL.DEBUG('view_shared_cart: l_sharing_partyid : ' || l_sharing_partyid);
918               IBE_UTIL.DEBUG('view_shared_cart: l_owner_partyid   : ' || l_owner_partyid);
919               IBE_UTIL.DEBUG('view_shared_cart: p_notes           : ' || p_notes);
920               IBE_UTIL.DEBUG('view_shared_cart: l_quote_access_rec.qute_sharee_num: '||l_quote_access_rec.quote_sharee_number);
921               IBE_UTIL.DEBUG('view_shared_cart: l_quote_access_rec.party_id: '||l_quote_access_rec.party_id);
922             END IF;
923             IF ((p_quote_access_tbl(counter).notify_flag = FND_API.G_TRUE) AND
924                  (nvl(l_quote_access_rec.party_id,-1) <> l_sharing_partyid)) THEN
925               l_quote_access_rec.UPDATE_PRIVILEGE_TYPE_CODE := l_old_access_level;
926 	      IF (IBE_UTIL.G_DEBUGON = l_true) THEN
927                  IBE_UTIL.DEBUG('l_quote_access_rec.UPDATE_PRIVILEGE_TYPE_CODE '||l_quote_access_rec.UPDATE_PRIVILEGE_TYPE_CODE);
928               END IF;
929               IBE_WORKFLOW_PVT.Notify_view_shared_cart(
930                 p_api_version       => p_api_version      ,
931                 p_init_msg_list     => p_init_msg_list    ,
932                 p_quote_access_rec  => l_quote_access_rec ,
933                 p_minisite_id       => p_minisite_id      ,
934                 p_url               => p_url              ,
935                 p_notes             => p_notes            ,
936                 p_sent_by_party_id  => l_sharing_partyid  ,
937                 x_return_status     => x_return_status    ,
938                 x_msg_count         => x_msg_count        ,
939                 x_msg_data          => x_msg_data         );
940               IF (x_return_status = FND_API.G_RET_STS_ERROR) THEN
941                 RAISE FND_API.G_EXC_ERROR;
942               END IF;
943               IF (x_return_status = FND_API.G_RET_STS_UNEXP_ERROR) THEN
944                 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
945               END IF;
946             END IF; -- end if notify_flag = true for generic email
947           END IF; -- end if old access level is not diff from new access level
948         ELSIF(p_quote_access_tbl(counter).operation_code = 'DELETE') then
949         --ELSE --orig functionality was to default to delete, so we've got to keep it that way
950 --IF(p_quote_access_tbl(counter).operation_code = 'DELETE') THEN  --OPERATION_CODE IS DELETE
951           --DBMS_OUTPUT.PUT_LINE('Operation code in save recip is delete: Caling delete_recipient');
952           IF (IBE_UTIL.G_DEBUGON = l_true) THEN
953              IBE_UTIL.DEBUG('Operation code in save recip is delete');
954              IBE_UTIL.DEBUG('Calling delete_recipient');
955              IBE_UTIL.DEBUG('l_quote_access_rec.quote_sharee_id: '||l_quote_access_rec.quote_sharee_id);
956           END IF;
957 
958           IBE_QUOTE_SAVESHARE_V2_PVT.DELETE_RECIPIENT(
959             P_Quote_access_rec  => l_quote_access_rec ,
960             p_minisite_id       => p_minisite_id      ,
961             p_url               => p_url              ,
962             p_notes             => p_notes            ,
963             x_return_status     => x_return_status    ,
964             x_msg_count         => x_msg_count        ,
965             x_msg_data          => x_msg_data         );
966 
967             IF (x_return_status = FND_API.G_RET_STS_ERROR) THEN
968               RAISE FND_API.G_EXC_ERROR;
969             END IF;
970             IF (x_return_status = FND_API.G_RET_STS_UNEXP_ERROR) THEN
971               RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
972             END IF;
973           IF (IBE_UTIL.G_DEBUGON = l_true) THEN
974              IBE_UTIL.DEBUG('Done calling delete_recipient');
975           END IF;
976         END IF ;--FOR OPERATION CODE
977       END LOOP; -- end loop over input table of recipients
978 
979       --To send a generic notification to the owner of the cart
980       l_quote_access_rec_owr.party_id        := l_owner_partyid;
981       l_quote_access_rec_owr.quote_header_id := P_Quote_header_id;
982 
983       IF (IBE_UTIL.G_DEBUGON = l_true) THEN
984         IBE_UTIL.DEBUG('l_sharing_partyid: '||l_sharing_partyid);
985         IBE_UTIL.DEBUG('l_owner_partyid: '||l_owner_partyid);
986         IBE_UTIL.DEBUG('l_owner_partyid: '||l_owner_accountid);
987       END IF;
988 
989       IF (l_sharing_partyid <> l_owner_partyid) THEN
990         -- for generic email to owner, we need to add some special parameters since we will not have a retrieval number
991         l_url := p_url || '&opid=' || l_owner_partyid || '&oaid=' || l_owner_accountid;
992         IF (IBE_UTIL.G_DEBUGON = l_true) THEN
993           IBE_UTIL.DEBUG('url for generic email to OWNER: '||l_url);
994         END IF;
995         IBE_WORKFLOW_PVT.Notify_view_shared_cart(
996                p_api_version       => p_api_version
997               ,p_init_msg_list     => p_init_msg_list
998               ,p_quote_access_rec  => l_quote_access_rec_owr
999               ,p_minisite_id       => p_minisite_id
1000               ,p_url               => l_url
1001               ,p_notes             => p_notes
1002               ,p_sent_by_party_id  => l_sharing_partyid
1003               ,p_owner_party_id    => l_owner_partyid
1004               ,x_return_status     => x_return_status
1005               ,x_msg_count         => x_msg_count
1006               ,x_msg_data          => x_msg_data         );
1007              IF (x_return_status = FND_API.G_RET_STS_ERROR) THEN
1008               RAISE FND_API.G_EXC_ERROR;
1009             END IF;
1010             IF (x_return_status = FND_API.G_RET_STS_UNEXP_ERROR) THEN
1011               RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
1012             END IF;
1013       END IF;
1014 
1015   --DBMS_OUTPUT.PUT_LINE('IBE_QUOTE_SAVESHARE_V2_PVT.save_recipients: END ');
1016 
1017      -- Standard check of p_commit.
1018   IF FND_API.To_Boolean( p_commit ) THEN
1019     COMMIT WORK;
1020   END IF;
1021 
1022   -- Standard call to get message count and if count is 1, get message info.
1023   FND_Msg_Pub.Count_And_Get(p_encoded => FND_API.G_FALSE,
1024                             p_count   => x_msg_count    ,
1025                             p_data    => x_msg_data);
1026   IF (IBE_UTIL.G_DEBUGON = l_true) THEN
1027      IBE_UTIL.DEBUG('IBE_QUOTE_SAVESHARE_V2_PVT.save_recipients: END');
1028   END IF;
1029 
1030 EXCEPTION
1031    WHEN FND_API.G_EXC_ERROR THEN
1032       ROLLBACK TO SAVERECIPIENTS_V2;
1033       x_return_status := FND_API.G_RET_STS_ERROR;
1034 	  FND_Msg_Pub.Count_And_Get(p_encoded => FND_API.G_FALSE,
1035                                 p_count   => x_msg_count    ,
1036                                 p_data    => x_msg_data);
1037       IF (IBE_UTIL.G_DEBUGON = l_true) THEN
1038          IBE_Util.Debug('Expected error in IBE_QUOTE_SAVESHARE_V2_PVT.SAVE_RECIPIENTS()');
1039       END IF;
1040 
1041    WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
1042       ROLLBACK TO SAVERECIPIENTS_V2;
1043       x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
1044 	  FND_Msg_Pub.Count_And_Get(p_encoded => FND_API.G_FALSE,
1045                                 p_count   => x_msg_count    ,
1046                                 p_data    => x_msg_data);
1047       IF (IBE_UTIL.G_DEBUGON = l_true) THEN
1048          IBE_Util.Debug('Unxpected error in  IBE_QUOTE_SAVESHARE_V2_PVT.SAVE_RECIPIENTS()');
1049       END IF;
1050 
1051    WHEN OTHERS THEN
1052       ROLLBACK TO SAVERECIPIENTS_V2;
1053       x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
1054 	  IF FND_Msg_Pub.Check_Msg_Level(FND_Msg_Pub.G_MSG_LVL_UNEXP_ERROR) THEN
1055          FND_Msg_Pub.Add_Exc_Msg(G_PKG_NAME,
1056                                  l_api_name);
1057       END IF;
1058       FND_Msg_Pub.Count_And_Get(p_encoded => FND_API.G_FALSE,
1059                                 p_count   => x_msg_count    ,
1060                                 p_data    => x_msg_data);
1061       IF (IBE_UTIL.G_DEBUGON = l_true) THEN
1062          IBE_Util.Debug('Unknown exception IBE_QUOTE_SAVESHARE_V2_PVT.SAVE_RECIPIENTS()');
1063       END IF;
1064 
1065 END;
1066 
1067 /*To handle new Active Cart Definition
1068 *Usages:
1069 -"Edit" button called from List of Saved Carts, List of Shared Out Carts, List of Recipient Carts,
1070 or Cart Details */
1071 
1072 Procedure activate_quote  (
1073     P_Quote_header_rec IN  ASO_QUOTE_PUB.Qte_Header_Rec_Type ,
1074     P_Party_id         IN  NUMBER := FND_API.G_MISS_NUM      ,
1075     P_Cust_account_id  IN  NUMBER := FND_API.G_MISS_NUM      ,
1076     P_control_rec      IN ASO_QUOTE_PUB.control_rec_type
1077                           := ASO_QUOTE_PUB.G_MISS_Control_Rec,
1078     p_retrieval_number IN  NUMBER := FND_API.G_MISS_NUM      ,
1079     p_api_version      IN  NUMBER   := 1                     ,
1080     p_init_msg_list    IN  VARCHAR2 := FND_API.G_TRUE        ,
1081     p_commit           IN  VARCHAR2 := FND_API.G_FALSE       ,
1082     x_return_status    OUT NOCOPY VARCHAR2                   ,
1083     x_msg_count        OUT NOCOPY NUMBER                     ,
1084     x_msg_data         OUT NOCOPY VARCHAR2                   ) is
1085 
1086 l_current_cartname            VARCHAR2(2000);
1087 l_new_cartname                VARCHAR2(2000);
1088 l_quote_header_rec            ASO_QUOTE_PUB.Qte_header_rec_type;
1089 l_quote_header_id             NUMBER;
1090 l_last_update_date            date;
1091 l_control_rec                 ASO_Quote_Pub.Control_Rec_Type
1092                               := ASO_Quote_Pub.G_Miss_Control_Rec;
1093 l_ac_present                  NUMBER         := null;   --active cart present in active carts table or not
1094 l_ac_party_id                 NUMBER         := null;
1095 l_qhac_present                NUMBER         := null;   --active cart present in quote headers or not
1096 l_qhac_quote_name             VARCHAR2(2000) := null;
1097 l_cart_type                   VARCHAR2(2000) ;
1098 l_api_name                    CONSTANT VARCHAR2(30)   := 'ACTIVATEQUOTE_V2';
1099 l_api_version                 CONSTANT NUMBER         := 1.0;
1100 l_sharee_party_id             NUMBER := FND_API.G_MISS_NUM;
1101 l_sharee_acct_id              NUMBER := FND_API.G_MISS_NUM;
1102 l_sharee_number               NUMBER := FND_API.G_MISS_NUM;
1103 
1104 
1105 cursor c_check_ac_aqa(c_party_id number,
1106                       c_cust_account_id number) is
1107   select aq.quote_header_id ,aq.party_id
1108   from ibe_active_quotes aq
1109   where party_id      = c_party_id
1110   and cust_account_id = c_cust_account_id
1111   and record_type     = 'CART';
1112 
1113 cursor c_check_guest_oneclk(c_qte_hdr_id NUMBER) is
1114   select quote_source_code
1115   from aso_quote_headers
1116   where quote_header_id = c_qte_hdr_id;
1117 
1118 cursor c_check_ac_qh(c_qh_id NUMBER) is
1119   select quote_header_id, quote_name
1120   from aso_quote_headers
1121   where quote_header_id = c_qh_id;
1122 
1123 rec_check_ac_qh           c_check_ac_qh%rowtype;
1124 rec_check_ac_aqa          c_check_ac_aqa%rowtype;
1125 rec_check_guest_oneclk    c_check_guest_oneclk%rowtype;
1126 
1127 
1128 BEGIN
1129 
1130   SAVEPOINT  ACTIVATEQUOTE_V2;
1131   -- Standard call to check for call compatibility.
1132   IF (IBE_UTIL.G_DEBUGON = l_true) THEN
1133      IBE_UTIL.DEBUG('Activate_quote:Before caling the compatible_api_call API');
1134   END IF;
1135   IF NOT FND_API.Compatible_API_Call (	l_api_version,
1136                              			P_Api_Version,
1137                                    		l_api_name,
1138                        					G_PKG_NAME )
1139   THEN
1140       RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
1141   END IF;
1142    -- Initialize message list IF p_init_msg_list is set to TRUE.
1143   IF FND_API.to_Boolean( p_init_msg_list ) THEN
1144       FND_MSG_PUB.initialize;
1145   END IF;
1146 
1147    --  Initialize API return status to success
1148   x_return_status := FND_API.G_RET_STS_SUCCESS;
1149 
1150 
1151   IF (IBE_UTIL.G_DEBUGON = l_true) THEN
1152      IBE_UTIL.DEBUG('IBE_QUOTE_SAVESHARE_V2_PVT.activate_quote: START');
1153      IBE_UTIL.DEBUG('p_party_id : '||p_party_id);
1154      IBE_UTIL.DEBUG('p_cust_account_id: '||p_cust_account_id);
1155 	IBE_UTIL.DEBUG('p_retrieval_number: '||p_retrieval_number);
1156 	IBE_UTIL.DEBUG('p_quote_header_id: '||p_quote_header_rec.quote_header_id);
1157   END IF;
1158   --DBMS_OUTPUT.PUT_LINE('IBE_QUOTE_SAVESHARE_V2_PVT.activate_quote: START');
1159   FOR rec_check_guest_oneclk in c_check_guest_oneclk(p_quote_header_rec.quote_header_id) LOOP
1160     l_cart_type := rec_check_guest_oneclk.quote_source_code;
1161     EXIT WHEN c_check_guest_oneclk%notfound;
1162   END LOOP;
1163   --DBMS_OUTPUT.PUT_LINE('l_cart_type: '||nvl(l_cart_type,'Null'));
1164   --Cannot activate a guest cart, Installbase cart, Punchout cart
1165   IF ((l_cart_type <> 'IStore Walkin')and
1166       (l_cart_type <> 'IStore Oneclick')and
1167       (l_cart_type <> 'IStore InstallBase')and
1168       (l_cart_type <> 'IStore ProcPunchout'))THEN
1169      IBE_Quote_Misc_pvt.validate_user_update
1170       (p_quote_header_id        => p_quote_header_rec.quote_header_id,
1171        p_party_id               => p_party_id,
1172        p_cust_account_id        => p_cust_account_id,
1173        p_quote_retrieval_number => p_retrieval_number,
1174        p_validate_user          => FND_API.G_TRUE,
1175        p_last_update_date       => p_quote_header_rec.last_update_date,
1176        x_return_status          => x_return_status,
1177        x_msg_count              => x_msg_count,
1178        x_msg_data               => x_msg_data);
1179 
1180       IF (x_return_status = FND_API.G_RET_STS_ERROR) THEN
1181         RAISE FND_API.G_EXC_ERROR;
1182       END IF;
1183 
1184       IF (x_return_status = FND_API.G_RET_STS_UNEXP_ERROR) THEN
1185         RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
1186       END IF;
1187     --DBMS_OUTPUT.PUT_LINE('Opening the cursor to check  active cart present in active carts table');
1188     IF (IBE_UTIL.G_DEBUGON = l_true) THEN
1189        IBE_UTIL.DEBUG('Opening the cursor to check  active cart present in active carts table');
1190     END IF;
1191     /*c_check_ac_aqa will query to check if p_party_id already has an active cart in active_quotes table
1192     If yes then update the quote_header_id of this record to p_quote_header_rec.quote_header_id(new active_cart hdr_id)
1193     else insert a record into the active_quotes table*/
1194 
1195     for rec_check_ac_aqa in c_check_ac_aqa( p_party_id,
1196                                             p_cust_account_id) loop
1197       l_ac_present  := rec_check_ac_aqa.quote_header_id;
1198       l_ac_party_id := rec_check_ac_aqa.party_id;
1199       exit when c_check_ac_aqa%notfound;
1200     end loop;
1201 
1202     IF (l_ac_present is not null) THEN
1203       --There already an active cart for p_party_id in active_quotes_table
1204       --DBMS_OUTPUT.PUT_LINE('active cart present in active carts table for: '||l_quote_header_rec.quote_header_id);
1205       IF (IBE_UTIL.G_DEBUGON = l_true) THEN
1206          IBE_UTIL.DEBUG('active cart present in active carts table l_ac_present: '||l_ac_present);
1207       END IF;
1208 
1209       IF(FND_API.G_TRUE=IBE_QUOTE_MISC_PVT.is_quote_usable(l_ac_present,p_party_id,p_cust_account_id)) THEN
1210         IF (IBE_UTIL.G_DEBUGON = l_true) THEN
1211            IBE_UTIL.DEBUG('current active cart is still validate.');
1212            IBE_UTIL.DEBUG('checking if it is a unnamed cart.');
1213         END IF;
1214       for rec_check_ac_qh in c_check_ac_qh(l_ac_present) loop
1215         --Openin this cursor to check if the active cart name is IBEUNNAMED
1216         --DBMS_OUTPUT.PUT_LINE('Opened cursor c_check_ac_qh ');
1217         l_qhac_present    := rec_check_ac_qh.quote_header_id;
1218         l_qhac_quote_name := rec_check_ac_qh.quote_name;
1219         exit when c_check_ac_qh%notfound;
1220 
1221         IF (IBE_UTIL.G_DEBUGON = l_true) THEN
1222            IBE_UTIL.DEBUG('l_qhac_present: '||l_qhac_present);
1223            IBE_UTIL.DEBUG('l_qhac_quote_name: '||l_qhac_quote_name);
1224         END IF;
1225 
1226       end loop;
1227       --DBMS_OUTPUT.PUT_LINE('after end loop of c_check_ac_qh ');
1228 
1229       IF (l_qhac_quote_name = 'IBE_PRMT_SC_UNNAMED') THEN
1230 
1231         --change the IBEUNNAMED cart to IBEDEFAULTNAMED and save it by calling IBE_Quote_Save_pvt.SAVE
1232         l_quote_header_rec.quote_header_id := l_qhac_present;
1233         l_quote_header_rec.quote_name      := 'IBE_PRMT_SC_DEFAULTNAMED';
1234         --reasons for calling save here
1235         --to save the IBEUNNAMED cart to IBEDEFAULTNAMED
1236         IF (IBE_UTIL.G_DEBUGON = l_true) THEN
1237            IBE_UTIL.DEBUG('Unnamed cart found for: '||l_quote_header_rec.quote_header_id);
1238            IBE_UTIL.DEBUG('renaming it to IBEDEFAULTNAMED...');
1239         END IF;
1240         IBE_Quote_Save_pvt.save(
1241                   p_api_version_number => p_api_version      ,
1242                   p_init_msg_list      => fnd_api.g_false    ,
1243                   p_commit             => fnd_api.g_false    ,
1244 
1245                   p_qte_header_rec     => l_Quote_header_rec ,
1246                   --p_control_rec        => l_control_rec      ,
1247                   x_quote_header_id    => l_quote_header_id  ,
1248                   x_last_update_date   => l_last_update_date ,
1249 
1250                   x_return_status      => x_return_status    ,
1251                   x_msg_count          => x_msg_count        ,
1252                   x_msg_data           => x_msg_data);
1253         IF (x_return_status = FND_API.G_RET_STS_ERROR) THEN
1254           IF (IBE_UTIL.G_DEBUGON = l_true) THEN
1255              IBE_UTIL.DEBUG('failed to rename the cart.');
1256           END IF;
1257           RAISE FND_API.G_EXC_ERROR;
1258         END IF;
1259 
1260         IF (x_return_status = FND_API.G_RET_STS_UNEXP_ERROR) THEN
1261           IF (IBE_UTIL.G_DEBUGON = l_true) THEN
1262              IBE_UTIL.DEBUG('failed to rename the cart, unexpected error.');
1263           END IF;
1264           RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
1265         END IF;
1266 
1267       END IF;--l_qhac_quote_name = 'IBEUNNAMED'
1268       ELSE
1269         IF (IBE_UTIL.G_DEBUGON = l_true) THEN
1270            IBE_UTIL.DEBUG('invalid or expired active cart ignored.');
1271         END IF;
1272       END IF; -- end of is_quote_usable
1273     END IF;  --l_ac_present
1274 
1275     IF (l_ac_party_id is not null) THEN
1276       IF (IBE_UTIL.G_DEBUGON = l_true) THEN
1277          IBE_UTIL.DEBUG('IBE_QUOTE_SAVESHARE_V2_PVT.activate_quote:User already has a row in active_quotes table');
1278          IBE_UTIL.DEBUG('IBE_QUOTE_SAVESHARE_V2_PVT.activate_quote:Calling update row hdlr');
1279       END IF;
1280       --DBMS_OUTPUT.PUT_LINE('Calling update row handler for active carts');
1281 
1282       IBE_ACTIVE_QUOTES_ALL_PKG.update_row(
1283                   X_OBJECT_VERSION_NUMBER  => 1,
1284                   x_last_update_date       => sysdate,
1285                   x_last_updated_by        => fnd_global.user_id,
1286                   x_last_update_login      => 1,
1287 		        X_RECORD_TYPE            => 'CART',
1288                   X_CURRENCY_CODE          => null,
1289                   x_party_id               => p_party_id,
1290                   x_cust_account_id        => p_cust_account_id,
1291                   x_quote_header_id        => p_quote_header_rec.quote_header_id);
1292 
1293     ELSE
1294 
1295       --no previous active carts present for p_party_id hence inserting a new record
1296       --DBMS_OUTPUT.PUT_LINE('no active carts present for p_party_id hence inserting a new record');
1297       IF (IBE_UTIL.G_DEBUGON = l_true) THEN
1298          IBE_UTIL.DEBUG('no active carts present for p_party_id hence inserting a new record');
1299          IBE_UTIL.DEBUG('Quote header id of new active active cart is: '||p_quote_header_rec.quote_header_id);
1300       END IF;
1301       IBE_ACTIVE_QUOTES_ALL_PKG.Insert_row(
1302                 X_OBJECT_VERSION_NUMBER  => 1,
1303                 X_QUOTE_HEADER_ID        => p_quote_header_rec.quote_header_id,
1304                 X_PARTY_ID               => p_party_id,
1305                 X_CUST_ACCOUNT_ID        => p_cust_account_id,
1306                 X_LAST_UPDATE_DATE       => sysdate,
1307                 X_CREATION_DATE          => sysdate,
1308 		      X_RECORD_TYPE            => 'CART',
1309                 X_CURRENCY_CODE          => null,
1310                 X_CREATED_BY             => fnd_global.USER_ID,
1311                 X_LAST_UPDATED_BY        => fnd_global.USER_ID,
1312                 X_LAST_UPDATE_LOGIN      => fnd_global.conc_login_id,
1313                 X_ORG_ID                 => MO_GLOBAL.get_current_org_id());
1314     END IF;
1315 
1316     if ((P_control_rec.pricing_request_type <> FND_API.G_MISS_CHAR) or
1317         (P_control_rec.header_pricing_event <> FND_API.G_MISS_CHAR) or
1318         (P_control_rec.line_pricing_event <> FND_API.G_MISS_CHAR) or
1319         (P_control_rec.CALCULATE_TAX_FLAG <> FND_API.G_MISS_CHAR) or
1320         (P_control_rec.CALCULATE_FREIGHT_CHARGE_FLAG <> FND_API.G_MISS_CHAR))
1321     then
1322       --1. re-price cart based on the state of control_rec
1323       IF (IBE_UTIL.G_DEBUGON = l_true) THEN
1324         IBE_UTIL.DEBUG('Calling SAVE');
1325         IBE_UTIL.DEBUG('reprice cart based on the state of control_rec');
1326       END IF;
1327       if (p_retrieval_number <> FND_API.G_MISS_NUM) then
1328         IF (IBE_UTIL.G_DEBUGON = l_true) THEN
1329             IBE_UTIL.DEBUG('repricing as recipient; retrieval num: ' || p_retrieval_number);
1330         END IF;
1331 
1332         l_sharee_number := p_retrieval_number;
1333         l_sharee_party_id := p_party_id;
1334         l_sharee_acct_id  := p_cust_account_id;
1335       end if;
1336       IBE_Quote_Save_pvt.save(
1337                   p_api_version_number => p_api_version             ,
1338                   p_init_msg_list      => fnd_api.g_false           ,
1339                   p_commit             => fnd_api.g_false           ,
1340 
1341                   p_qte_header_rec     => p_Quote_header_rec        ,
1342                   p_control_rec        => P_control_rec              ,
1343 
1344                   p_sharee_number      => l_sharee_number           ,
1345                   p_sharee_party_id      => l_sharee_party_id       ,
1346                   p_sharee_cust_account_id  => l_sharee_acct_id        ,
1347 
1348                   x_quote_header_id    => l_quote_header_id          ,
1349                   x_last_update_date   => l_last_update_date         ,
1350 
1351                   x_return_status      => x_return_status            ,
1352                   x_msg_count          => x_msg_count                ,
1353                   x_msg_data           => x_msg_data);
1354       IF (x_return_status = FND_API.G_RET_STS_ERROR) THEN
1355         RAISE FND_API.G_EXC_ERROR;
1356       END IF;
1357 
1358       IF (x_return_status = FND_API.G_RET_STS_UNEXP_ERROR) THEN
1359         RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
1360       END IF;
1361     end if;
1362   ELSE
1363     IF (IBE_UTIL.G_DEBUGON = l_true) THEN
1364        IBE_UTIL.DEBUG('Cannot activate a '||nvl(l_cart_type,'Invalid ')||' Cart');
1365     END IF;
1366     --DBMS_OUTPUT.PUT_LINE('Cannot activate a '||nvl(l_cart_type,'Invalid ')||' Cart');
1367 
1368   END IF; --qute source code check
1369   IF (IBE_UTIL.G_DEBUGON = l_true) THEN
1370      IBE_UTIL.DEBUG('IBE_QUOTE_SAVESHARE_V2_PVT.activate_quote: END');
1371   END IF;
1372 
1373 EXCEPTION
1374    WHEN FND_API.G_EXC_ERROR THEN
1375       ROLLBACK TO ACTIVATEQUOTE_V2;
1376       x_return_status := FND_API.G_RET_STS_ERROR;
1377 	  FND_Msg_Pub.Count_And_Get(p_encoded => FND_API.G_FALSE,
1378                                 p_count   => x_msg_count    ,
1379                                 p_data    => x_msg_data);
1380       IF (IBE_UTIL.G_DEBUGON = l_true) THEN
1381          IBE_Util.Debug('Expected error in  IBE_QUOTE_SAVESHARE_V2_PVT.activate_quote()');
1382       END IF;
1383 
1384    WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
1385       ROLLBACK TO ACTIVATEQUOTE_V2;
1386       x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
1387 	  FND_Msg_Pub.Count_And_Get(p_encoded => FND_API.G_FALSE,
1388                                 p_count   => x_msg_count    ,
1389                                 p_data    => x_msg_data);
1390       IF (IBE_UTIL.G_DEBUGON = l_true) THEN
1391          IBE_Util.Debug('Unexpected error in  IBE_QUOTE_SAVESHARE_V2_PVT.activate_quote()');
1392       END IF;
1393 
1394    WHEN OTHERS THEN
1395       ROLLBACK TO ACTIVATEQUOTE_V2;
1396       x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
1397 	  IF FND_Msg_Pub.Check_Msg_Level(FND_Msg_Pub.G_MSG_LVL_UNEXP_ERROR) THEN
1398          FND_Msg_Pub.Add_Exc_Msg(G_PKG_NAME,
1399                                  l_api_name);
1400       END IF;
1401       FND_Msg_Pub.Count_And_Get(p_encoded => FND_API.G_FALSE,
1402                                 p_count   => x_msg_count    ,
1403                                 p_data    => x_msg_data);
1404       IF (IBE_UTIL.G_DEBUGON = l_true) THEN
1405          IBE_Util.Debug('Unknown error IBE_QUOTE_SAVESHARE_V2_PVT.activate_quote()');
1406       END IF;
1407 
1408 END;
1409 
1410 PROCEDURE save_contact_point(
1411   p_api_version_number IN  NUMBER
1412   ,p_init_msg_list     IN  VARCHAR2 := FND_API.G_FALSE
1413   ,p_commit            IN  VARCHAR2 := FND_API.G_FALSE
1414   ,P_URL               IN  VARCHAR2 := FND_API.G_MISS_char
1415   ,P_EMAIL             IN  VARCHAR2 := FND_API.G_MISS_char
1416   ,p_owner_table_id    IN  NUMBER
1417   ,p_mode              IN  VARCHAR2
1418   ,x_contact_point_id  OUT NOCOPY NUMBER
1419   ,X_Return_Status     OUT NOCOPY VARCHAR2
1420   ,X_Msg_Count         OUT NOCOPY NUMBER
1421   ,X_Msg_Data          OUT NOCOPY VARCHAR2
1422 )
1423 IS
1424   l_api_name             CONSTANT VARCHAR2(30)  := 'SaveContactPoint';
1425   l_api_version          CONSTANT NUMBER  := 1.0;
1426   l_application_id       CONSTANT NUMBER  := 671;
1427   l_object_version_number NUMBER          := 1;
1428   l_created_by_module VARCHAR2(30)        := 'SHARED CARTS';
1429 
1430   l_test                  number;
1431 
1432   l_contact_points_rec       hz_CONTACT_POINT_V2PUB.CONTACT_POINT_REC_TYPE;
1433 
1434   l_email_rec                hz_CONTACT_POINT_V2PUB.EMAIL_REC_TYPE
1435                              := hz_CONTACT_POINT_V2PUB.g_miss_EMAIL_REC;
1436   l_web_rec                  hz_CONTACT_POINT_V2PUB.web_REC_TYPE
1437                              := hz_CONTACT_POINT_V2PUB.g_miss_web_REC;
1438 
1439   Cursor c_getContactInfo(c_owner_table_id Number
1440                        ,c_contact_point_type varchar2
1441                        ,c_owner_table_name  varchar2) IS
1442   Select contact_point_id, object_version_number
1443   From  hz_contact_points
1444   Where OWNER_TABLE_NAME   = c_owner_table_name
1445   AND  CONTACT_POINT_TYPE  = c_CONTACT_POINT_TYPE
1446   AND OWNER_TABLE_ID       = c_owner_table_id;
1447 
1448 
1449 
1450 BEGIN
1451    -- Standard Start of API savepoint
1452   SAVEPOINT    SAVECONTACTPOINT_PVT;
1453   -- Standard call to check for call compatibility.
1454   IF NOT FND_API.Compatible_API_Call (l_api_version,
1455                                       P_Api_Version_Number,
1456                                       l_api_name,
1457                                       G_PKG_NAME )
1458   THEN
1459       RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
1460   END IF;
1461    -- Initialize message list IF p_init_msg_list is set to TRUE.
1462   IF FND_API.to_Boolean( p_init_msg_list ) THEN
1463       FND_MSG_PUB.initialize;
1464   END IF;
1465 
1466    --  Initialize API return status to success
1467   x_return_status := FND_API.G_RET_STS_SUCCESS;
1468 
1469   IF (IBE_UTIL.G_DEBUGON = l_true) THEN
1470      IBE_UTIL.debug('Inside Save_contact_point API');
1471   END IF;
1472   --DBMS_OUTPUT.PUT_LINE('Inside Save_contact_point API');
1473   l_contact_points_rec.status             := 'A';
1474   l_contact_points_rec.owner_table_id     := p_owner_table_id;
1475   l_contact_points_rec.created_by_module  := l_created_by_module;
1476   l_contact_points_rec.application_id     := l_application_id;
1477 
1478   IF (p_mode = 'EMAIL') THEN
1479        --DBMS_OUTPUT.PUT_LINE('Mode of contact point is EMAIL');
1480        IF (IBE_UTIL.G_DEBUGON = l_true) THEN
1481           IBE_UTIL.debug('Mode of contact point is EMAIL');
1482        END IF;
1483        l_contact_points_rec.contact_point_type := 'EMAIL';
1484        l_contact_points_rec.owner_table_name   := 'IBE_SH_QUOTE_ACCESS';
1485        l_email_rec.email_address               := P_EMAIL;
1486   elsif (p_mode = 'WEB') THEN
1487        IF (IBE_UTIL.G_DEBUGON = l_true) THEN
1488           IBE_UTIL.debug('Mode of contact point is WEB');
1489        END IF;
1490 
1491        l_contact_points_rec.contact_point_type := 'WEB';
1492        l_contact_points_rec.owner_table_name   := 'IBE_SH_QUOTE_ACCESS';
1493        l_web_rec.url                           := P_URL;
1494        l_web_rec.web_type                      := 'com';
1495   END IF;
1496 
1497 
1498   SELECT COUNT(contact_point_id)
1499   INTO l_test
1500   FROM hz_contact_points
1501   WHERE owner_table_name = l_contact_points_rec.owner_table_name
1502     AND owner_table_id   = l_contact_points_rec.owner_table_id;
1503 
1504   IF l_test = 0 THEN
1505        IF (IBE_UTIL.G_DEBUGON = l_true) THEN
1506           IBE_UTIL.DEBUG('call hz_conteact_point_pub.create_contact_points at'
1507                      || to_char(sysdate, 'mm/dd/yyyy:hh24:MI:SS'));
1508        END IF;
1509 
1510        --DBMS_OUTPUT.PUT_LINE('Create contact point ');
1511        hz_contact_point_v2pub.create_contact_point
1512        (    p_init_msg_list      => FND_API.G_FALSE
1513            ,p_contact_point_rec => l_contact_points_rec
1514            ,p_web_rec            => l_web_rec
1515            ,p_email_rec          => l_email_rec
1516            ,x_contact_point_id   => x_contact_point_id
1517            ,x_return_status      => x_return_status
1518            ,x_msg_count          => x_msg_count
1519            ,x_msg_data           => x_msg_data
1520        );
1521        IF (x_return_status = FND_API.G_RET_STS_ERROR) THEN
1522          RAISE FND_API.G_EXC_ERROR;
1523        END IF;
1524        IF (x_return_status = FND_API.G_RET_STS_UNEXP_ERROR) THEN
1525          RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
1526        END IF;
1527        IF (IBE_UTIL.G_DEBUGON = l_true) THEN
1528           IBE_UTIL.DEBUG('done hz_conteact_point_pub.create_contact_points at'
1529                      || to_char(sysdate, 'mm/dd/yyyy:hh24:MI:SS'));
1530        END IF;
1531 
1532   else
1533        --DBMS_OUTPUT.PUT_LINE('Updating contact point ');
1534        open c_getContactInfo(l_contact_points_rec.owner_table_id
1535                              ,l_contact_points_rec.contact_point_type
1536                              ,l_contact_points_rec.owner_table_name);
1537        fetch c_getContactInfo into  l_contact_points_rec.contact_point_id
1538                                     ,l_object_version_number;
1539        close c_getContactInfo;
1540        IF (IBE_UTIL.G_DEBUGON = l_true) THEN
1541           IBE_UTIL.DEBUG('call hz_conteact_point_pub.update_contact_points at'
1542                       || to_char(sysdate, 'mm/dd/yyyy:hh24:MI:SS'));
1543        END IF;
1544 
1545        hz_contact_point_v2pub.update_contact_point(
1546            p_init_msg_list      => FND_API.G_FALSE
1547           ,p_contact_point_rec => l_contact_points_rec
1548           ,p_web_rec            => l_web_rec
1549           ,p_email_rec          => l_email_rec
1550           ,p_object_version_number   => l_object_version_number
1551           ,x_return_status      => x_return_status
1552           ,x_msg_count          => x_msg_count
1553           ,x_msg_data           => x_msg_data);
1554 
1555        IF (x_return_status = FND_API.G_RET_STS_ERROR) THEN
1556               RAISE FND_API.G_EXC_ERROR;
1557        END IF;
1558 
1559        IF (x_return_status = FND_API.G_RET_STS_UNEXP_ERROR) THEN
1560               RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
1561        END IF;
1562        IF (IBE_UTIL.G_DEBUGON = l_true) THEN
1563           IBE_UTIL.DEBUG('done hz_conteact_point_pub.update_contact_points at'
1564                       || to_char(sysdate, 'mm/dd/yyyy:hh24:MI:SS'));
1565        END IF;
1566   END IF;
1567 
1568    -- Standard check of p_commit.
1569   IF FND_API.To_Boolean( p_commit ) THEN
1570     COMMIT WORK;
1571   END IF;
1572 
1573    -- Standard call to get message count and IF count is 1, get message info.
1574    FND_MSG_PUB.Count_And_Get(p_encoded => FND_API.G_FALSE,
1575                              p_count   => x_msg_count,
1576                              p_data    => x_msg_data);
1577 EXCEPTION
1578    WHEN FND_API.G_EXC_ERROR THEN
1579       ROLLBACK TO SAVECONTACTPOINT_PVT;
1580       IF (IBE_UTIL.G_DEBUGON = l_true) THEN
1581         IBE_UTIL.DEBUG('Expected exception in Ibe_quote_saveshare_v2_pvt.SaveContactPoint');
1582       end if;
1583       x_return_status := FND_API.G_RET_STS_ERROR;
1584       FND_MSG_PUB.Count_And_Get(p_encoded => FND_API.G_FALSE,
1585                                 p_count   => x_msg_count,
1586                                 p_data    => x_msg_data);
1587    WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
1588       IF (IBE_UTIL.G_DEBUGON = l_true) THEN
1589         IBE_UTIL.DEBUG('Unexpected exception in Ibe_quote_saveshare_v2_pvt.SaveContactPoint');
1590       end if;
1591 
1592       ROLLBACK TO SAVECONTACTPOINT_PVT;
1593       x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
1594       FND_MSG_PUB.Count_And_Get(p_encoded => FND_API.G_FALSE,
1595                                 p_count   => x_msg_count,
1596                                 p_data    => x_msg_data);
1597    WHEN OTHERS THEN
1598       IF (IBE_UTIL.G_DEBUGON = l_true) THEN
1599         IBE_UTIL.DEBUG('Unknown exception in Ibe_quote_saveshare_v2_pvt.SaveContactPoint');
1600       end if;
1601 
1602       ROLLBACK TO SAVECONTACTPOINT_PVT;
1603       x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
1604 
1605       IF FND_MSG_PUB.Check_Msg_Level(FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR) THEN
1606          FND_MSG_PUB.Add_Exc_Msg(G_PKG_NAME,
1607                                  l_api_name);
1608       END IF;
1609 
1610       FND_MSG_PUB.Count_And_Get(p_encoded => FND_API.G_FALSE,
1611                                 p_count   => x_msg_count,
1612                                 p_data    => x_msg_data);
1613 END SAVE_CONTACT_POINT;
1614 
1615 /*To mark an active cart as no longer active for the submitted user (either owner or recipient as identified
1616   by party_id  and account_id) and/or all of that cart's recipients.
1617 *Usages:
1618 -User clicks "save" on a saved active cart
1619 -Other api's where the quote is no longer active (submit quote, request sales assistance, etc)*/
1620 
1621 Procedure deactivate_quote  (
1622     P_Quote_header_id  IN  Number                       ,
1623     P_Party_id         IN  Number := FND_API.G_MISS_NUM ,
1624     P_Cust_account_id  IN  Number := FND_API.G_MISS_NUM ,
1625     P_minisite_id      IN  Number := FND_API.G_MISS_NUM ,
1626     p_api_version      IN  NUMBER   := 1                ,
1627     p_init_msg_list    IN  VARCHAR2 := FND_API.G_TRUE   ,
1628     p_commit           IN  VARCHAR2 := FND_API.G_FALSE ,
1629     x_return_status    OUT NOCOPY VARCHAR2             ,
1630     x_msg_count        OUT NOCOPY NUMBER               ,
1631     x_msg_data         OUT NOCOPY VARCHAR2             ) is
1632 
1633     l_api_name                 CONSTANT VARCHAR2(30)   := 'DEACTIVATEQUOTE_V2';
1634     l_api_version              CONSTANT NUMBER         := 1.0;
1635 
1636 cursor c_select_recip(c_qte_hdr_id number) is
1637   select party_id, cust_account_id
1638   from ibe_sh_quote_access
1639   where quote_header_id = c_qte_hdr_id
1640   and nvl(end_date_active, sysdate+1) > sysdate ;
1641 
1642 rec_select_recip  c_select_recip%rowtype;
1643 l_party_cust_tbl  IBE_QUOTE_SAVESHARE_pvt.QUOTE_ACCESS_Tbl_Type
1644                   := IBE_QUOTE_SAVESHARE_pvt.g_miss_QUOTE_ACCESS_Tbl;
1645 counter           NUMBER := 1;
1646 
1647 BEGIN
1648 
1649   SAVEPOINT  DEACTIVATEQUOTE_V2;
1650   -- Standard call to check for call compatibility.
1651   IF NOT FND_API.Compatible_API_Call (	l_api_version,
1652                              			P_Api_Version,
1653                                    		l_api_name,
1654                        					G_PKG_NAME )
1655   THEN
1656       RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
1657   END IF;
1658    -- Initialize message list IF p_init_msg_list is set to TRUE.
1659   IF FND_API.to_Boolean( p_init_msg_list ) THEN
1660       FND_MSG_PUB.initialize;
1661   END IF;
1662 
1663    --  Initialize API return status to success
1664   x_return_status := FND_API.G_RET_STS_SUCCESS;
1665   -------------------------------------------------------------------------------------------------------------
1666   --API Body start
1667   -------------------------------------------------------------------------------------------------------------
1668 --dbms_output.put_line(' Deactivate API: Trying to deactivate: '||rec_check_active_cart.quote_header_id);
1669     FOR rec_check_active_cart in c_check_active_cart(p_party_id,
1670                                                      p_cust_account_id) LOOP
1671       IF(rec_check_active_cart.quote_header_id is not null) THEN
1672         IF (IBE_UTIL.G_DEBUGON = l_true) THEN
1673            IBE_UTIL.DEBUG('Deactivate API: Trying to deactivate: '||rec_check_active_cart.quote_header_id);
1674            --dbms_output.put_line(' Deactivate API: Trying to deactivate: '||rec_check_active_cart.quote_header_id);
1675         END IF;
1676 
1677         --DBMS_OUTPUT.PUT_LINE('rec_check_active_cart.quote_header_id '||rec_check_active_cart.quote_header_id );
1678         IF (IBE_UTIL.G_DEBUGON = l_true) THEN
1679            IBE_UTIL.DEBUG('Calling update handler of active_quotes_all table');
1680         END IF;
1681         --DBMS_OUTPUT.PUT_LINE('Calling update handler of active_quotes_all table');
1682 
1683         --DBMS_OUTPUT.PUT_LINE('P_quote_header_id '||P_quote_header_id);
1684         --DBMS_OUTPUT.PUT_LINE('p_quote_access_tbl(counter).party_id '||p_party_id);
1685         --DBMS_OUTPUT.PUT_LINE('p_quote_access_tbl(counter).cust_account_id '||p_cust_account_id);
1686 
1687          IBE_ACTIVE_QUOTES_ALL_PKG.UPDATE_ROW(
1688                           X_OBJECT_VERSION_NUMBER => 1,
1689                           X_QUOTE_HEADER_ID       => null,
1690                           X_PARTY_ID              => p_party_id       ,
1691                           X_CUST_ACCOUNT_ID       => p_cust_account_id,
1692 			           X_RECORD_TYPE           => 'CART',
1693                           X_CURRENCY_CODE         => null,
1694                           x_last_update_date      => sysdate,
1695                           x_last_updated_by       => fnd_global.user_id,
1696                           x_last_update_login     => 1);
1697         IF (IBE_UTIL.G_DEBUGON = l_true) THEN
1698            IBE_UTIL.DEBUG('Done calling Update handler of active_quotes_all table to erase the quote header id' );
1699         END IF;
1700         --DBMS_OUTPUT.PUT_LINE('Done calling delete handler of active_quotes_all table');
1701       END IF;
1702     EXIT when c_check_active_cart%notfound;
1703     END LOOP; --for c_check_active_cart
1704 
1705     -- Standard check of p_commit.
1706     IF FND_API.To_Boolean( p_commit ) THEN
1707       COMMIT WORK;
1708     END IF;
1709 
1710     IF (IBE_UTIL.G_DEBUGON = l_true) THEN
1711        IBE_UTIL.DEBUG('IBE_QUOTE_SAVESHARE_V2_PVT.deactivate_quote: END');
1712     END IF;
1713 
1714 EXCEPTION
1715    WHEN FND_API.G_EXC_ERROR THEN
1716       ROLLBACK TO DEACTIVATEQUOTE_V2;
1717       IF (IBE_UTIL.G_DEBUGON = l_true) THEN
1718         IBE_UTIL.DEBUG('Expected exception in Ibe_quote_saveshare_v2_pvt.Deactivate_quote');
1719       end if;
1720 
1721       x_return_status := FND_API.G_RET_STS_ERROR;
1722 	  FND_Msg_Pub.Count_And_Get(p_encoded => FND_API.G_FALSE,
1723                                 p_count   => x_msg_count    ,
1724                                 p_data    => x_msg_data);
1725       IF (IBE_UTIL.G_DEBUGON = l_true) THEN
1726          IBE_Util.Debug('Unexpected error in  IBE_QUOTE_SAVESHARE_V2_PVT.deactivate_quote');
1727       END IF;
1728 
1729    WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
1730       ROLLBACK TO DEACTIVATEQUOTE_V2;
1731       x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
1732 	  FND_Msg_Pub.Count_And_Get(p_encoded => FND_API.G_FALSE,
1733                                 p_count   => x_msg_count    ,
1734                                 p_data    => x_msg_data);
1735       IF (IBE_UTIL.G_DEBUGON = l_true) THEN
1736          IBE_Util.Debug('Unknown error in  IBE_QUOTE_SAVESHARE_V2_PVT.deactivate_quote');
1737       END IF;
1738 
1739    WHEN OTHERS THEN
1740       ROLLBACK TO DEACTIVATEQUOTE_V2;
1741       x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
1742 	  IF FND_Msg_Pub.Check_Msg_Level(FND_Msg_Pub.G_MSG_LVL_UNEXP_ERROR) THEN
1743          FND_Msg_Pub.Add_Exc_Msg(G_PKG_NAME,
1744                                  l_api_name);
1745       END IF;
1746       FND_Msg_Pub.Count_And_Get(p_encoded => FND_API.G_FALSE,
1747                                 p_count   => x_msg_count    ,
1748                                 p_data    => x_msg_data);
1749       IF (IBE_UTIL.G_DEBUGON = l_true) THEN
1750          IBE_Util.Debug('Abnormal end   IBE_QUOTE_SAVESHARE_V2_PVT.deactivate_quote');
1751       END IF;
1752 
1753 END;
1754 
1755 /*to handle new Active Cart Definition (may be able to use original version w/ updates to handle new
1756 active cart definition)
1757 *Usages:
1758 -Saving active cart and selecting a previously saved cart to append to.
1759 */
1760 Procedure APPEND_QUOTE(
1761     P_source_quote_header_id  IN Number                             ,
1762     P_source_last_update_date IN Date                               ,
1763     P_target_header_rec       IN ASO_QUOTE_PUB.Qte_Header_Rec_Type  ,
1764     P_control_rec             IN ASO_QUOTE_PUB.control_rec_type
1765                                := ASO_QUOTE_PUB.G_MISS_Control_Rec  ,
1766     P_delete_source_cart      IN Varchar2  := FND_API.G_TRUE         ,
1767     P_combinesameitem         IN Varchar2  := FND_API.G_TRUE         ,
1768     P_minisite_id             IN Number    := FND_API.G_MISS_NUM     ,
1769     p_api_version             IN  NUMBER   := 1                      ,
1770     p_init_msg_list           IN  VARCHAR2 := FND_API.G_TRUE         ,
1771     p_commit                  IN  VARCHAR2 := FND_API.G_FALSE        ,
1772     x_return_status           OUT NOCOPY VARCHAR2                    ,
1773     x_msg_count               OUT NOCOPY NUMBER                      ,
1774     x_msg_data                OUT NOCOPY VARCHAR2                           ) is
1775 
1776     l_api_name                 CONSTANT VARCHAR2(30)   := 'APPENDQUOTE_V2';
1777     l_api_version              CONSTANT NUMBER         := 1.0;
1778 
1779 
1780     l_qte_line_tbl             ASO_QUOTE_PUB.qte_line_tbl_type;
1781     l_qte_line_dtl_tbl         ASO_QUOTE_PUB.qte_line_dtl_tbl_type;
1782     l_line_attr_ext_tbl        ASO_Quote_Pub.Line_Attribs_Ext_tbl_Type;
1783     l_line_rltship_tbl         ASO_QUOTE_PUB.line_rltship_tbl_type;
1784     l_ln_price_attributes_tbl  ASO_Quote_Pub.Price_Attributes_Tbl_Type;
1785     l_hd_shipment_tbl          ASO_Quote_Pub.Shipment_rec_Type
1786                                    := ASO_Quote_Pub.G_MISS_SHIPMENT_rec;
1787     l_last_update_date         DATE;
1788     l_qte_header_id            NUMBER;
1789 
1790     -- added 12/22/03: PRG, no line merge
1791     l_Price_Adjustment_Tbl       ASO_Quote_Pub.Price_Adj_Tbl_Type;
1792     l_Price_Adj_Rltship_Tbl      ASO_Quote_Pub.Price_Adj_Rltship_Tbl_Type;
1793 
1794 BEGIN
1795 
1796   SAVEPOINT  APPENDQUOTE_V2;
1797   -- Standard call to check for call compatibility.
1798   IF NOT FND_API.Compatible_API_Call (	l_api_version,
1799                              			P_Api_Version,
1800                                    		l_api_name,
1801                        					G_PKG_NAME )
1802   THEN
1803       RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
1804   END IF;
1805    -- Initialize message list IF p_init_msg_list is set to TRUE.
1806   IF FND_API.to_Boolean( p_init_msg_list ) THEN
1807       FND_MSG_PUB.initialize;
1808   END IF;
1809 
1810    --  Initialize API return status to success
1811   x_return_status := FND_API.G_RET_STS_SUCCESS;
1812 -------------------------------------------------------------------------------------------------------------
1813 --API Body start
1814 -------------------------------------------------------------------------------------------------------------
1815   IF (IBE_UTIL.G_DEBUGON = l_true) THEN
1816      IBE_UTIL.DEBUG('IBE_QUOTE_SAVESHARE_V2_PVT.APPEND_QUOTE: START');
1817   END IF;
1818 
1819   IBE_Quote_Misc_pvt.validate_user_update
1820       (p_quote_header_id  => P_source_quote_header_id,
1821        p_validate_user    => FND_API.G_TRUE,
1822        x_return_status    => x_return_status,
1823        x_msg_count        => x_msg_count,
1824        x_msg_data         => x_msg_data);
1825 
1826     IF (x_return_status = FND_API.G_RET_STS_ERROR) THEN
1827       RAISE FND_API.G_EXC_ERROR;
1828     END IF;
1829 
1830     IF (x_return_status = FND_API.G_RET_STS_UNEXP_ERROR) THEN
1831       RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
1832     END IF;
1833 
1834   IF (IBE_UTIL.G_DEBUGON = l_true) THEN
1835      IBE_UTIL.DEBUG('IBE_QUOTE_SAVESHARE_V2_PVT.APPEND_QUOTE:Calling IBE_QUOTE_SAVESHARE_pvt.Copy_lines');
1836   END IF;
1837   --DBMS_OUTPUT.PUT_LINE('IBE_QUOTE_SAVESHARE_V2_PVT.APPEND_QUOTE:Calling IBE_QUOTE_SAVESHARE_pvt.Copy_lines ');
1838 
1839   IBE_QUOTE_SAVESHARE_pvt.COPY_LINES(
1840       p_api_version_number      => p_api_version                      ,
1841       p_init_msg_list           => FND_API.G_FALSE                    ,
1842       p_commit                  => FND_API.G_FALSE                    ,
1843 
1844       X_Return_Status           => X_Return_Status                    ,
1845       X_Msg_Count               => X_Msg_Count                        ,
1846       X_Msg_Data                => X_Msg_Data                         ,
1847 
1848       p_from_quote_header_id    => P_source_quote_header_id           ,
1849       p_to_quote_header_id      => p_target_header_rec.quote_header_id,
1850       x_qte_line_tbl            => l_qte_line_tbl                     ,
1851       x_qte_line_dtl_tbl        => l_qte_line_dtl_tbl                 ,
1852       x_line_attr_ext_tbl       => l_line_attr_ext_tbl                ,
1853       x_line_rltship_tbl        => l_line_rltship_tbl                 ,
1854       x_ln_price_attributes_tbl => l_ln_price_attributes_tbl          ,
1855       x_Price_Adjustment_tbl    => l_Price_Adjustment_tbl             ,
1856       x_Price_Adj_Rltship_tbl   => l_Price_Adj_Rltship_tbl          );
1857 
1858     IF (x_return_status = FND_API.G_RET_STS_ERROR) THEN
1859       RAISE FND_API.G_EXC_ERROR;
1860     END IF;
1861     IF (x_return_status = FND_API.G_RET_STS_UNEXP_ERROR) THEN
1862       RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
1863     END IF;
1864     --DBMS_OUTPUT.PUT_LINE('copy_lines done ');
1865     --DBMS_OUTPUT.PUT_LINE('immediately after copy_lines p_target_header_rec.quote_header_id '||p_target_header_rec.quote_header_id);
1866 
1867   --l_hd_shipment_tbl(1) 					:= p_hd_shipment_rec; $$ Verify this part. Ned to pass
1868                                                                          --p_to_hd_shipment_rec?? $$
1869  -- l_hd_shipment_tbl(1).quote_header_id 	:= P_target_header_rec.quote_header_id;
1870 
1871   IF (IBE_UTIL.G_DEBUGON = l_true) THEN
1872      IBE_UTIL.DEBUG('IBE_QUOTE_SAVESHARE_V2_PVT.APPEND_QUOTE:IBE_QUOTE_SAVESHARE_pvt.Copy_lines End');
1873      IBE_UTIL.DEBUG('IBE_QUOTE_SAVESHARE_V2_PVT.APPEND_QUOTE: Calling IBE_Quote_Save_pvt.Save to save target cart');
1874   END IF;
1875   --DBMS_OUTPUT.PUT_LINE('IBE_QUOTE_SAVESHARE_V2_PVT.APPEND_QUOTE: Calling IBE_Quote_Save_pvt.Save to save target cart ');
1876   --DBMS_OUTPUT.PUT_LINE('before save p_target_header_rec.quote_header_id '||p_target_header_rec.quote_header_id);
1877   IBE_Quote_Save_pvt.SAVE
1878   (   p_api_version_number => p_api_version
1879       ,p_init_msg_list     => FND_API.G_FALSE
1880       ,p_commit            => FND_API.G_FALSE
1881       ,p_qte_header_rec    => p_target_header_rec
1882       ,p_Qte_Line_Tbl      => l_qte_line_tbl
1883       ,p_Qte_Line_Dtl_Tbl  => l_qte_line_dtl_tbl
1884       ,p_Line_Attr_Ext_Tbl => l_line_attr_ext_tbl
1885       ,p_Line_rltship_tbl  => l_line_rltship_tbl
1886       ,p_control_rec       => P_control_rec
1887       ,p_Price_Adjustment_tbl     => l_Price_Adjustment_tbl
1888       ,p_Price_Adj_Rltship_tbl    => l_Price_Adj_Rltship_tbl
1889      -- ,p_hd_shipment_tbl   => l_hd_shipment_tbl
1890       ,x_quote_header_id   => l_qte_header_id
1891       ,x_last_update_date  => l_last_update_date
1892       ,x_return_status     => x_return_status
1893       ,x_msg_count         => x_msg_count
1894       ,x_msg_data          => x_msg_data) ;
1895     --DBMS_OUTPUT.PUT_LINE('IBE_QUOTE_SAVESHARE_V2_PVT.APPEND_QUOTE: Done save ');
1896     IF (x_return_status = FND_API.G_RET_STS_ERROR) THEN
1897       RAISE FND_API.G_EXC_ERROR;
1898     END IF;
1899     IF (x_return_status = FND_API.G_RET_STS_UNEXP_ERROR) THEN
1900       RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
1901     END IF;
1902     IF (IBE_UTIL.G_DEBUGON = l_true) THEN
1903        IBE_UTIL.DEBUG('IBE_QUOTE_SAVESHARE_V2_PVT.APPEND_QUOTE: P_delete_source_cart: '||P_delete_source_cart);
1904     END IF;
1905     IF (P_delete_source_cart = FND_API.G_TRUE ) THEN
1906       IF (IBE_UTIL.G_DEBUGON = l_true) THEN
1907          IBE_UTIL.DEBUG('IBE_QUOTE_SAVESHARE_V2_PVT.APPEND_QUOTE: P_delete_source_cart is true');
1908       END IF;
1909       IBE_Quote_Save_pvt.Delete(
1910          p_api_version_number => p_api_version
1911         ,p_init_msg_list      => FND_API.G_FALSE
1912         ,p_commit             => FND_API.G_FALSE
1913         ,x_return_status      => x_return_status
1914         ,x_msg_count          => x_msg_count
1915         ,x_msg_data           => x_msg_data
1916         ,p_quote_header_id    => P_source_quote_header_id
1917         ,p_expunge_flag       => FND_API.G_FALSE
1918         ,p_minisite_id        => p_minisite_id
1919         ,p_last_update_date   => P_source_last_update_date);
1920 
1921       IF (x_return_status = FND_API.G_RET_STS_ERROR) THEN
1922         RAISE FND_API.G_EXC_ERROR;
1923       END IF;
1924       IF (x_return_status = FND_API.G_RET_STS_UNEXP_ERROR) THEN
1925         RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
1926       END IF;
1927       IF (IBE_UTIL.G_DEBUGON = l_true) THEN
1928          IBE_UTIL.DEBUG('IBE_QUOTE_SAVESHARE_V2_PVT.APPEND_QUOTE:Delete on source cart done');
1929       END IF;
1930     END IF;
1931 
1932   IF (IBE_UTIL.G_DEBUGON = l_true) THEN
1933      IBE_UTIL.DEBUG('IBE_QUOTE_SAVESHARE_V2_PVT.APPEND_QUOTE: END');
1934   END IF;
1935 
1936 EXCEPTION
1937    WHEN FND_API.G_EXC_ERROR THEN
1938       ROLLBACK TO APPENDQUOTE_V2;
1939       x_return_status := FND_API.G_RET_STS_ERROR;
1940 	  FND_Msg_Pub.Count_And_Get(p_encoded => FND_API.G_FALSE,
1941                                 p_count   => x_msg_count    ,
1942                                 p_data    => x_msg_data);
1943       IF (IBE_UTIL.G_DEBUGON = l_true) THEN
1944          IBE_Util.Debug('Expected error in IBE_QUOTE_SAVESHARE_V2_PVT.append_quote()');
1945       END IF;
1946 
1947    WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
1948       ROLLBACK TO APPENDQUOTE_V2;
1949       x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
1950 	  FND_Msg_Pub.Count_And_Get(p_encoded => FND_API.G_FALSE,
1951                                 p_count   => x_msg_count    ,
1952                                 p_data    => x_msg_data);
1953       IF (IBE_UTIL.G_DEBUGON = l_true) THEN
1954          IBE_Util.Debug('Unexpected error in IBE_QUOTE_SAVESHARE_V2_PVT.append_quote()');
1955       END IF;
1956 
1957    WHEN OTHERS THEN
1958       ROLLBACK TO APPENDQUOTE_V2;
1959       x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
1960 	  IF FND_Msg_Pub.Check_Msg_Level(FND_Msg_Pub.G_MSG_LVL_UNEXP_ERROR) THEN
1961          FND_Msg_Pub.Add_Exc_Msg(G_PKG_NAME,
1962                                  l_api_name);
1963       END IF;
1964       FND_Msg_Pub.Count_And_Get(p_encoded => FND_API.G_FALSE,
1965                                 p_count   => x_msg_count    ,
1966                                 p_data    => x_msg_data);
1967       IF (IBE_UTIL.G_DEBUGON = l_true) THEN
1968          IBE_Util.Debug('Abnormal end   IBE_QUOTE_SAVESHARE_V2_PVT.append_quote()');
1969       END IF;
1970 
1971 END;
1972 
1973 /*to handle removing of all recipients of one cartId
1974 *Usages:
1975 -"Stop Sharing" button from List of Shared Out Carts, List of Shared Out Quotes
1976 -Other apis where cart becomes "unusable" - submit quote and delete on the shared cart.
1977 */
1978 
1979 Procedure stop_sharing (
1980     p_quote_header_id  IN  Number                                 ,
1981     p_delete_context   IN  VARCHAR2 := 'IBE_SC_CART_STOPSHARING'  ,
1982     P_minisite_id      IN  Number := FND_API.G_MISS_NUM           ,
1983     p_notes            IN  Varchar2 := FND_API.G_MISS_CHAR        ,
1984     p_quote_access_tbl IN  IBE_QUOTE_SAVESHARE_pvt.QUOTE_ACCESS_Tbl_Type
1985                            := IBE_QUOTE_SAVESHARE_pvt.G_miss_quote_access_Tbl,
1986     p_api_version      IN  NUMBER   := 1                          ,
1987     p_init_msg_list    IN  VARCHAR2 := FND_API.G_TRUE             ,
1988     p_commit           IN  VARCHAR2 := FND_API.G_FALSE            ,
1989     x_return_status    OUT NOCOPY VARCHAR2                        ,
1990     x_msg_count        OUT NOCOPY NUMBER                          ,
1991     x_msg_data         OUT NOCOPY VARCHAR2                               ) is
1992 
1993     l_api_name         CONSTANT VARCHAR2(30)   := 'STOPSHARING_V2';
1994     l_api_version      CONSTANT NUMBER         := 1.0;
1995     tbl_counter        NUMBER                  := 1;
1996 
1997     l_quote_access_tbl     IBE_QUOTE_SAVESHARE_pvt.QUOTE_ACCESS_Tbl_Type
1998                            := IBE_QUOTE_SAVESHARE_pvt.g_miss_quote_access_tbl;
1999     l_quote_access_tbl_tmp IBE_QUOTE_SAVESHARE_pvt.QUOTE_ACCESS_Tbl_Type
2000                            := IBE_QUOTE_SAVESHARE_pvt.g_miss_quote_access_tbl;
2001     l_owner_party_id   NUMBER;
2002     l_owner_cust_account_id  NUMBER;
2003     l_sharing_party_id NUMBER;
2004 
2005     cursor c_get_recipients(c_qte_hdr_id NUMBER) is
2006       select quote_sharee_id,
2007              party_id,
2008              cust_account_id,
2009              SH.contact_point_id,
2010              quote_sharee_number,
2011              HZ.EMAIL_ADDRESS,
2012              FND.customer_id shared_by_party_id
2013       from IBE_SH_QUOTE_ACCESS SH,
2014            HZ_CONTACT_POINTS HZ,
2015            FND_USER FND
2016       where SH.contact_point_id = HZ.Contact_point_id
2017       and quote_header_id = c_qte_hdr_id
2018       and nvl(end_date_active, sysdate+1) > sysdate
2019       and sh.created_by = fnd.user_id;
2020 
2021     cursor c_get_recipient_info(c_recipient_id NUMBER) is
2022       select quote_sharee_id,
2023              party_id,
2024              cust_account_id,
2025              SH.contact_point_id,
2026              quote_sharee_number,
2027              HZ.EMAIL_ADDRESS,
2028              FND.customer_id shared_by_party_id
2029       from IBE_SH_QUOTE_ACCESS SH,
2030            HZ_CONTACT_POINTS HZ,
2031            FND_USER FND
2032       where SH.contact_point_id = HZ.Contact_point_id
2033       and quote_sharee_id = c_recipient_id
2034       and nvl(end_date_active, sysdate+1) > sysdate
2035       and sh.created_by = fnd.user_id;
2036 
2037     CURSOR c_get_owner(c_quote_header_id NUMBER) is
2038       select party_id, cust_account_id
2039       from aso_quote_headers
2040       where quote_header_id = c_quote_header_id;
2041 
2042 
2043     rec_get_recipients     c_get_recipients%rowtype;
2044     rec_get_owner          c_get_owner%rowtype;
2045     rec_get_recipient_info c_get_recipient_info%rowtype;
2046 
2047 BEGIN
2048   SAVEPOINT  STOPSHARING_V2;
2049   -- Standard call to check for call compatibility.
2050   IF NOT FND_API.Compatible_API_Call (	l_api_version,
2051                              			P_Api_Version,
2052                                    		l_api_name,
2053                        					G_PKG_NAME )
2054   THEN
2055       RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
2056   END IF;
2057    -- Initialize message list IF p_init_msg_list is set to TRUE.
2058   IF FND_API.to_Boolean( p_init_msg_list ) THEN
2059       FND_MSG_PUB.initialize;
2060   END IF;
2061 
2062    --  Initialize API return status to success
2063   x_return_status := FND_API.G_RET_STS_SUCCESS;
2064 -------------------------------------------------------------------------------------------------------------
2065 --API Body start
2066 -------------------------------------------------------------------------------------------------------------
2067   IF (IBE_UTIL.G_DEBUGON = l_true) THEN
2068     IBE_UTIL.DEBUG('IBE_QUOTE_SAVESHARE_V2_PVT.STOP_SHARING: START');
2069   END IF;
2070   -- Stop sharing should deactivate owner's active cart if any.
2071   --dbms_output.put_line('p_quote_header_id: '||p_quote_header_id);
2072   FOR rec_get_owner in c_get_owner(p_quote_header_id) LOOP
2073     l_owner_party_id        := rec_get_owner.party_id;
2074     l_owner_cust_account_id := rec_get_owner.cust_account_id;
2075     --dbms_output.put_line('loop one in cursor ');
2076     EXIT when c_get_owner%NOTFOUND;
2077   END LOOP;
2078   IF (IBE_UTIL.G_DEBUGON = l_true) THEN
2079     IBE_UTIL.DEBUG('STOP_SHARING:Calling deactivate API');
2080   END IF;
2081   --DBMS_OUTPUT.PUT_LINE('Calling deactivate API to deactivate owner''s cart');
2082   --dbms_output.put_line('PARTY_ID: '||l_owner_party_id);
2083   --dbms_output.put_line('CUST_ACCOUNT_ID: '||l_owner_cust_account_id );
2084 
2085   IBE_QUOTE_SAVESHARE_V2_PVT.DEACTIVATE_QUOTE  (
2086           P_Quote_header_id  => p_quote_header_id       ,
2087           P_Party_id         => l_owner_party_id        ,
2088           P_Cust_account_id  => l_owner_cust_account_id ,
2089           P_minisite_id      => p_minisite_id           ,
2090           p_api_version      => p_api_version           ,
2091           p_init_msg_list    => fnd_api.g_false         ,
2092           p_commit           => fnd_api.g_false         ,
2093           x_return_status    => x_return_status         ,
2094           x_msg_count        => x_msg_count             ,
2095           x_msg_data         => x_msg_data              );
2096       IF (x_return_status = FND_API.G_RET_STS_ERROR) THEN
2097         RAISE FND_API.G_EXC_ERROR;
2098       END IF;
2099 
2100       IF (x_return_status = FND_API.G_RET_STS_UNEXP_ERROR) THEN
2101         RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
2102       END IF;
2103   IF (IBE_UTIL.G_DEBUGON = l_true) THEN
2104     IBE_UTIL.DEBUG('STOP_SHARING:Deactivation of owner cart :Done');
2105   END IF;
2106   --dbms_output.put_line('STOP_SHARING:Deactivation of owner cart :Done');
2107   --If there is no input quote access tbl then send notification to all recipients.
2108   --dbms_output.put_line('p_quote_access_tbl(1).quote_sharee_id: '||nvl(p_quote_access_tbl(1).quote_sharee_id,0));
2109   IF ((p_quote_access_tbl is not null) or (p_quote_access_tbl.count = 0) ) THEN
2110     FOR rec_userenv_partyid in c_userenv_partyid LOOP
2111       l_sharing_party_id := rec_userenv_partyid.customer_id;
2112       exit when c_userenv_partyid%NOTFOUND;
2113     END LOOP;
2114 
2115    IF (IBE_UTIL.G_DEBUGON = l_true) THEN
2116     IBE_UTIL.DEBUG('STOP_SHARING: :: l_sharing_party_id: '|| l_sharing_party_id  );
2117   END IF;
2118 
2119     --dbms_output.put_line('Input quote access is null ');
2120     FOR rec_get_recipients in c_get_recipients(p_quote_header_id) LOOP
2121      IF (IBE_UTIL.G_DEBUGON = l_true) THEN
2122     IBE_UTIL.DEBUG('STOP_SHARING:: '||tbl_counter||'. quote_sharee_id:'||rec_get_recipients.quote_sharee_id||', party_id:' || rec_get_recipients.party_id );
2123   END IF;
2124 
2125       l_quote_access_tbl(tbl_counter).quote_sharee_id     := rec_get_recipients.quote_sharee_id;
2126       l_quote_access_tbl(tbl_counter).party_id            := rec_get_recipients.party_id;
2127        --dbms_output.put_line('found party_id:  '||rec_get_recipient_info.party_id);
2128       l_quote_access_tbl(tbl_counter).cust_account_id     := rec_get_recipients.cust_account_id;
2129       l_quote_access_tbl(tbl_counter).contact_point_id    := rec_get_recipients.contact_point_id;
2130       l_quote_access_tbl(tbl_counter).quote_header_id     := p_quote_header_id;
2131       l_quote_access_tbl(tbl_counter).quote_sharee_number := rec_get_recipients.quote_sharee_number;
2132       l_quote_access_tbl(tbl_counter).email_contact_address := rec_get_recipients.email_address;
2133       l_quote_access_tbl(tbl_counter).shared_by_party_id  := rec_get_recipients.shared_by_party_id;
2134       -- 14109131 - STOP SHARED CART NOTIFICATION SENT WHEN RECIPIENT PLACES ORDER
2135       IF (l_sharing_party_id = rec_get_recipients.party_id) THEN
2136     IF (IBE_UTIL.G_DEBUGON = l_true) THEN
2137     IBE_UTIL.DEBUG('STOP_SHARING :: sharee party id is party id so making notify flag false ');
2138 
2139   END IF;
2140    l_quote_access_tbl(tbl_counter).notify_flag     := FND_API.G_FALSE;
2141    End IF;
2142    -- 14109131 - STOP SHARED CART NOTIFICATION SENT WHEN RECIPIENT PLACES ORDER
2143       tbl_counter := tbl_counter+1;
2144       EXIT when c_get_recipients%notfound;
2145     END LOOP;
2146   ELSE
2147     --dbms_output.put_line('Input quote access table is not null');
2148 
2149     FOR tbl_counter in 1..p_quote_access_tbl.count LOOP
2150        --dbms_output.put_line('p_quote_access_tbl(tbl_counter).quote_sharee_id: '||p_quote_access_tbl(tbl_counter).quote_sharee_id);
2151       FOR rec_get_recipient_info in c_get_recipient_info(l_quote_access_tbl(tbl_counter).quote_sharee_id) LOOP
2152         IF l_sharing_party_id <> rec_get_recipient_info.party_id THEN
2153    IF (IBE_UTIL.G_DEBUGON = l_true) THEN
2154     IBE_UTIL.DEBUG('STOP_SHARING: '||tbl_counter||'. quote_sharee_id:'||p_quote_access_tbl(tbl_counter).quote_sharee_id||', party_id:' || rec_get_recipient_info.party_id ||', notify_flag:' || p_quote_access_tbl(tbl_counter).notify_flag  );
2155   END IF;
2156 
2157 
2158           l_quote_access_tbl(tbl_counter).quote_sharee_id     := p_quote_access_tbl(tbl_counter).quote_sharee_id;
2159           l_quote_access_tbl(tbl_counter).notify_flag         := p_quote_access_tbl(tbl_counter).notify_flag;
2160           l_quote_access_tbl(tbl_counter).party_id            := rec_get_recipient_info.party_id;
2161           --dbms_output.put_line('found party_id:  '||rec_get_recipient_info.party_id);
2162           l_quote_access_tbl(tbl_counter).cust_account_id     := rec_get_recipient_info.cust_account_id;
2163           l_quote_access_tbl(tbl_counter).contact_point_id    := rec_get_recipient_info.contact_point_id;
2164           l_quote_access_tbl(tbl_counter).quote_header_id     := p_quote_header_id;
2165           l_quote_access_tbl(tbl_counter).quote_sharee_number := rec_get_recipient_info.quote_sharee_number;
2166           l_quote_access_tbl(tbl_counter).email_contact_address := rec_get_recipient_info.email_address;
2167           l_quote_access_tbl(tbl_counter).shared_by_party_id  := rec_get_recipient_info.shared_by_party_id;
2168         END IF;
2169         EXIT when c_get_recipient_info%notfound;
2170       END LOOP;
2171     END LOOP;
2172   END IF;
2173   IF (IBE_UTIL.G_DEBUGON = l_true) THEN
2174     IBE_UTIL.DEBUG('STOP_SHARING:calling delete_recipient on the following recipients:');
2175   END IF;
2176   --dbms_output.put_line('STOP_SHARING:calling delete_recipient on the following recipients:');
2177   FOR i in 1.. l_quote_access_tbl.count LOOP
2178     IF (IBE_UTIL.G_DEBUGON = l_true) THEN
2179        IBE_UTIL.DEBUG('STOP_SHARING:calling delete_recipient');
2180        IBE_UTIL.DEBUG('STOP_SHARING:l_quote_access_tbl:'||i||':quote_sharee_id: '||l_quote_access_tbl(i).quote_sharee_id);
2181        IBE_UTIL.DEBUG('STOP_SHARING:l_quote_access_tbl:'||i||':contact_point_id: '||l_quote_access_tbl(i).contact_point_id);
2182        IBE_UTIL.DEBUG('STOP_SHARING:l_quote_access_tbl:'||i||':party_id: '||l_quote_access_tbl(i).party_id);
2183        IBE_UTIL.DEBUG('STOP_SHARING:l_quote_access_tbl:'||i||':cust_account_id: '||l_quote_access_tbl(i).cust_account_id);
2184     END IF;
2185     --dbms_output.put_line('STOP_SHARING:l_quote_access_tbl:'||i||':quote_sharee_id: '||l_quote_access_tbl(i).quote_sharee_id);
2186     --dbms_output.put_line('Calling delete recipient for the recipient record ');
2187     IBE_QUOTE_SAVESHARE_V2_PVT.DELETE_RECIPIENT(
2188             P_Quote_access_rec  => l_quote_access_tbl(i) ,
2189             p_minisite_id       => p_minisite_id         ,
2190             p_delete_code       => p_delete_context      ,
2191             p_notes             => p_notes               ,
2192             x_return_status     => x_return_status       ,
2193             x_msg_count         => x_msg_count           ,
2194             x_msg_data          => x_msg_data            );
2195 
2196       IF (x_return_status = FND_API.G_RET_STS_ERROR) THEN
2197         RAISE FND_API.G_EXC_ERROR;
2198       END IF;
2199       IF (x_return_status = FND_API.G_RET_STS_UNEXP_ERROR) THEN
2200         RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
2201       END IF;
2202 
2203   END LOOP;
2204   --This is to delete any new recipients who got added while we were trying to delete existing recipients.
2205   --This code is to handle issues arising out of concurrency among multiple admins of a shared cart
2206   tbl_counter := 1;
2207 
2208   FOR rec_get_recipients in c_get_recipients(p_quote_header_id) LOOP
2209     l_quote_access_tbl_tmp(tbl_counter).quote_sharee_id       := rec_get_recipients.quote_sharee_id;
2210     l_quote_access_tbl_tmp(tbl_counter).party_id              := rec_get_recipients.party_id;
2211     --dbms_output.put_line('found party_id:  '||rec_get_recipient_info.party_id);
2212     l_quote_access_tbl_tmp(tbl_counter).cust_account_id       := rec_get_recipients.cust_account_id;
2213     l_quote_access_tbl_tmp(tbl_counter).contact_point_id      := rec_get_recipients.contact_point_id;
2214     l_quote_access_tbl_tmp(tbl_counter).quote_header_id       := p_quote_header_id;
2215     l_quote_access_tbl_tmp(tbl_counter).quote_sharee_number   := rec_get_recipients.quote_sharee_number;
2216     l_quote_access_tbl_tmp(tbl_counter).email_contact_address := rec_get_recipients.email_address;
2217     l_quote_access_tbl_tmp(tbl_counter).shared_by_party_id    := rec_get_recipients.shared_by_party_id;
2218     l_quote_access_tbl_tmp(tbl_counter).notify_flag           := FND_API.G_FALSE;
2219     tbl_counter := tbl_counter+1;
2220     EXIT when c_get_recipients%notfound;
2221   END LOOP;
2222 
2223   FOR i in 1.. l_quote_access_tbl_tmp.count LOOP
2224     IF (IBE_UTIL.G_DEBUGON = l_true) THEN
2225        IBE_UTIL.DEBUG('STOP_SHARING: Concurrency part begins');
2226        IBE_UTIL.DEBUG('STOP_SHARING:l_quote_access_tbl:'||i||':quote_sharee_id: '||l_quote_access_tbl_tmp(i).quote_sharee_id);
2227        IBE_UTIL.DEBUG('STOP_SHARING:l_quote_access_tbl:'||i||':contact_point_id: '||l_quote_access_tbl_tmp(i).contact_point_id);
2228        IBE_UTIL.DEBUG('STOP_SHARING:l_quote_access_tbl:'||i||':party_id: '||l_quote_access_tbl_tmp(i).party_id);
2229        IBE_UTIL.DEBUG('STOP_SHARING:l_quote_access_tbl:'||i||':cust_account_id: '||l_quote_access_tbl_tmp(i).cust_account_id);
2230     END IF;
2231     --dbms_output.put_line('STOP_SHARING:l_quote_access_tbl:'||i||':quote_sharee_id: '||l_quote_access_tbl_tmp(i).quote_sharee_id);
2232     --dbms_output.put_line('Calling delete recipient for the recipient record ');
2233     IBE_QUOTE_SAVESHARE_V2_PVT.DELETE_RECIPIENT(
2234             P_Quote_access_rec  => l_quote_access_tbl_tmp(i) ,
2235             p_minisite_id       => p_minisite_id         ,
2236             p_delete_code       => p_delete_context      ,
2237             p_notes             => FND_API.G_MISS_CHAR   ,
2238             x_return_status     => x_return_status       ,
2239             x_msg_count         => x_msg_count           ,
2240             x_msg_data          => x_msg_data            );
2241 
2242       IF (x_return_status = FND_API.G_RET_STS_ERROR) THEN
2243         RAISE FND_API.G_EXC_ERROR;
2244       END IF;
2245       IF (x_return_status = FND_API.G_RET_STS_UNEXP_ERROR) THEN
2246         RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
2247       END IF;
2248   END LOOP;
2249   IF (IBE_UTIL.G_DEBUGON = l_true) THEN
2250     IBE_UTIL.DEBUG('STOP_SHARING: Concurrency part ends');
2251   END IF;
2252 
2253   IF (IBE_UTIL.G_DEBUGON = l_true) THEN
2254      IBE_UTIL.DEBUG('IBE_QUOTE_SAVESHARE_V2_PVT.STOP_SHARING: END');
2255   END IF;
2256 
2257 EXCEPTION
2258 
2259    WHEN FND_API.G_EXC_ERROR THEN
2260       ROLLBACK TO STOPSHARING_V2;
2261       x_return_status := FND_API.G_RET_STS_ERROR;
2262 	  FND_Msg_Pub.Count_And_Get(p_encoded => FND_API.G_FALSE,
2263                                 p_count   => x_msg_count    ,
2264                                 p_data    => x_msg_data);
2265       IF (IBE_UTIL.G_DEBUGON = l_true) THEN
2266          IBE_Util.Debug('Expected error in IBE_QUOTE_SAVESHARE_V2_PVT.STOPSHARING_V2');
2267       END IF;
2268 
2269    WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
2270       ROLLBACK TO STOPSHARING_V2;
2271       x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
2272 	  FND_Msg_Pub.Count_And_Get(p_encoded => FND_API.G_FALSE,
2273                                 p_count   => x_msg_count    ,
2274                                 p_data    => x_msg_data);
2275       IF (IBE_UTIL.G_DEBUGON = l_true) THEN
2276          IBE_Util.Debug('Unexpected error in  IBE_QUOTE_SAVESHARE_V2_PVT.STOPSHARING_V2');
2277       END IF;
2278 
2279    WHEN OTHERS THEN
2280       ROLLBACK TO STOPSHARING_V2;
2281       x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
2282 	  IF FND_Msg_Pub.Check_Msg_Level(FND_Msg_Pub.G_MSG_LVL_UNEXP_ERROR) THEN
2283          FND_Msg_Pub.Add_Exc_Msg(G_PKG_NAME,
2284                                  l_api_name);
2285       END IF;
2286       FND_Msg_Pub.Count_And_Get(p_encoded => FND_API.G_FALSE,
2287                                 p_count   => x_msg_count    ,
2288                                 p_data    => x_msg_data);
2289       IF (IBE_UTIL.G_DEBUGON = l_true) THEN
2290          IBE_Util.Debug('Unknown error in IBE_QUOTE_SAVESHARE_V2_PVT.STOPSHARING_V2');
2291       END IF;
2292 
2293 END;
2294 
2295 /*To handle the specific removing of a recipients from one cartId
2296 *Usages:
2297 -"End Working" button
2298 */
2299 Procedure end_working (
2300     p_quote_access_tbl  IN  IBE_QUOTE_SAVESHARE_pvt.QUOTE_ACCESS_Tbl_Type
2301                             := IBE_QUOTE_SAVESHARE_pvt.G_miss_quote_access_Tbl ,
2302     P_Quote_header_id   IN  Number                                           ,
2303     P_Party_id          IN  Number         := FND_API.G_MISS_NUM             ,
2304     P_Cust_account_id   IN  Number         := FND_API.G_MISS_NUM             ,
2305     p_retrieval_number  IN  Number         := FND_API.G_MISS_NUM             ,
2306     P_URL               IN  Varchar2       := FND_API.G_MISS_CHAR            ,
2307     P_minisite_id       IN  Number         := FND_API.G_MISS_NUM             ,
2308     p_notes             IN  Varchar2       := FND_API.G_MISS_CHAR            ,
2309     p_api_version       IN  NUMBER         := 1                              ,
2310     p_init_msg_list     IN  VARCHAR2       := FND_API.G_TRUE                 ,
2311     p_commit            IN  VARCHAR2       := FND_API.G_FALSE                ,
2312     x_return_status     OUT NOCOPY VARCHAR2                                  ,
2313     x_msg_count         OUT NOCOPY NUMBER                                    ,
2314     x_msg_data          OUT NOCOPY VARCHAR2                                  ) is
2315 
2316     l_api_name         CONSTANT VARCHAR2(30)   := 'ENDWORKING_V2';
2317     l_api_version      CONSTANT NUMBER         := 1.0;
2318     l_recip_id         NUMBER;
2319     l_initiator_id     NUMBER;
2320     l_quote_access_tbl IBE_QUOTE_SAVESHARE_pvt.QUOTE_ACCESS_Tbl_Type
2321                        := IBE_QUOTE_SAVESHARE_pvt.G_miss_quote_access_Tbl;
2322     END_WORKING              NUMBER := 4;
2323 
2324     CURSOR c_get_recip_id(c_retrieval_num   NUMBER,
2325                           c_party_id        NUMBER,
2326                           c_cust_account_id NUMBER,
2327                           c_quote_header_id NUMBER) is
2328       SELECT quote_sharee_id, quote_header_id
2329       FROM IBE_SH_QUOTE_ACCESS
2330       WHERE quote_sharee_number = c_retrieval_num
2331       OR (party_id = c_party_id and cust_account_id = c_cust_account_id)
2332       AND quote_header_id = c_quote_header_id
2333       AND nvl(end_date_active, sysdate+1) > sysdate;
2334 
2335     rec_get_recip_id   c_get_recip_id%rowtype;
2336     l_quote_access_rec       IBE_QUOTE_SAVESHARE_pvt.QUOTE_ACCESS_REC_TYPE
2337                              := IBE_QUOTE_SAVESHARE_pvt.G_MISS_QUOTE_ACCESS_REC;
2338     l_quote_access_rec_recip IBE_QUOTE_SAVESHARE_pvt.QUOTE_ACCESS_REC_TYPE
2339                              := IBE_QUOTE_SAVESHARE_pvt.G_MISS_QUOTE_ACCESS_REC;
2340 
2341    cursor c_get_recipient_party(c_recipient_id NUMBER) is
2342      SELECT party_id,
2343             quote_sharee_number,
2344             quote_header_id,
2345             update_privilege_type_code,
2346             contact_point_id
2347      FROM ibe_sh_quote_access
2348      where quote_sharee_id = c_recipient_id;
2349 
2350    rec_get_recipient_party c_get_recipient_party%rowtype;
2351 
2352 BEGIN
2353   SAVEPOINT  ENDWORKING_V2;
2354   -- Standard call to check for call compatibility.
2355   IF NOT FND_API.Compatible_API_Call (	l_api_version,
2356                              			P_Api_Version,
2357                                    		l_api_name,
2358                        					G_PKG_NAME )
2359   THEN
2360       RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
2361   END IF;
2362    -- Initialize message list IF p_init_msg_list is set to TRUE.
2363   IF FND_API.to_Boolean( p_init_msg_list ) THEN
2364       FND_MSG_PUB.initialize;
2365   END IF;
2366 
2367    --  Initialize API return status to success
2368   x_return_status := FND_API.G_RET_STS_SUCCESS;
2369 -----------------------------------------------------------------------------------------
2370 --API Body start
2371 -----------------------------------------------------------------------------------------
2372 --  l_quote_access_rec := p_quote_access_rec;
2373   FOR rec_userenv_partyid in c_userenv_partyid LOOP
2374     l_initiator_id  := rec_userenv_partyid.customer_id;
2375     EXIT when c_userenv_partyid%notfound;
2376   END LOOP;
2377 
2378   IF (IBE_UTIL.G_DEBUGON = l_true) THEN
2379      IBE_UTIL.DEBUG('IBE_QUOTE_SAVESHARE_V2_PVT.END_WORKING: START');
2380   END IF;
2381   --DBMS_OUTPUT.PUT_LINE('IBE_QUOTE_SAVESHARE_V2_PVT.END_WORKING: START');
2382   IF (IBE_UTIL.G_DEBUGON = l_true) THEN
2383      IBE_UTIL.DEBUG('Opening cursor to retrieve the recipient_id');
2384   END IF;
2385   --DBMS_OUTPUT.PUT_LINE('Opening cursor to retrieve the recipient_id');
2386   --DBMS_OUTPUT.PUT_LINE('p_quote_access_rec.quote_sharee_number: '||p_quote_access_rec.quote_sharee_number);
2387   --DBMS_OUTPUT.PUT_LINE('p_quote_access_rec.party_id: '||p_quote_access_rec.party_id);
2388   --DBMS_OUTPUT.PUT_LINE('p_quote_access_rec.cust_account_id: '||p_quote_access_rec.cust_account_id);
2389   --DBMS_OUTPUT.PUT_LINE('p_quote_access_rec.quote_header_id: '||p_quote_access_rec.quote_header_id);
2390 
2391   l_quote_access_tbl:= p_quote_access_tbl;
2392   FOR rec_get_recip_id in c_get_recip_id(p_retrieval_number,
2393                                          p_party_id,
2394                                          p_cust_account_id,
2395                                          p_quote_header_id) LOOP
2396     l_quote_access_rec.quote_sharee_id     := rec_get_recip_id.quote_sharee_id;
2397     l_quote_access_rec.quote_sharee_number := p_retrieval_number;
2398     l_quote_access_rec.party_id            := p_party_id;
2399     l_quote_access_rec.cust_account_id     := p_cust_account_id;
2400     l_quote_access_rec.quote_header_id     := rec_get_recip_id.quote_header_id;
2401     EXIT WHEN c_get_recip_id%NOTFOUND;
2402   END LOOP;
2403   IF (IBE_UTIL.G_DEBUGON = l_true) THEN
2404      IBE_UTIL.DEBUG('Recipient id obtained is: '||l_quote_access_rec.quote_sharee_id);
2405   END IF;
2406 
2407 --DBMS_OUTPUT.PUT_LINE('Recipient id obtained is: '||l_quote_access_rec.quote_sharee_id);
2408   IBE_QUOTE_SAVESHARE_V2_PVT.DELETE_RECIPIENT(
2409         P_Quote_access_rec  => l_quote_access_rec ,
2410         p_minisite_id       => p_minisite_id      ,
2411         p_delete_code       => 'END_WORKING'      ,
2412         p_url               => p_url              ,
2413         p_notes             => p_notes            ,
2414         x_return_status     => x_return_status    ,
2415         x_msg_count         => x_msg_count        ,
2416         x_msg_data          => x_msg_data         );
2417 
2418       IF (x_return_status = FND_API.G_RET_STS_ERROR) THEN
2419         RAISE FND_API.G_EXC_ERROR;
2420       END IF;
2421       IF (x_return_status = FND_API.G_RET_STS_UNEXP_ERROR) THEN
2422         RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
2423       END IF;
2424 
2425   FOR counter in 1..p_quote_access_tbl.count LOOP
2426     IF ((l_quote_access_tbl(counter).notify_flag = FND_API.G_TRUE) AND
2427          (l_quote_access_rec.quote_sharee_id <> l_quote_access_tbl(counter).quote_sharee_id)) THEN
2428 
2429       FOR rec_get_recipient_party in c_get_recipient_party(p_quote_access_tbl(counter).quote_sharee_id) LOOP
2430         l_quote_access_rec_recip.party_id                   := rec_get_recipient_party.party_id;
2431         l_quote_access_rec_recip.quote_sharee_number        := rec_get_recipient_party.quote_sharee_number;
2432         l_quote_access_rec_recip.quote_header_id            := rec_get_recipient_party.quote_header_id;
2433         l_quote_access_rec_recip.update_privilege_type_code := rec_get_recipient_party.update_privilege_type_code;
2434         -- As part of bug fix 3349991 getting contact_point_id to the notification api.
2435         l_quote_access_rec_recip.contact_point_id := rec_get_recipient_party.contact_point_id;
2436         EXIT when c_get_recipient_party%NOTFOUND;
2437       END LOOP;
2438 
2439       -- Assign the quote_sharee_id to l_quote_access_rec (value needed in the notification api,3349991)
2440       l_quote_access_rec_recip.quote_sharee_id := p_quote_access_tbl(counter).quote_sharee_id;
2441 
2442      IF (IBE_UTIL.G_DEBUGON = l_true) THEN
2443         IBE_UTIL.DEBUG('IBE_QUOTE_SAVESHARE_V2_PVT.END_WORKING: Ready to call view shared cart');
2444         IBE_UTIL.DEBUG('IBE_QUOTE_SAVESHARE_V2_PVT.END_WORKING:initiator_party_id: '||l_initiator_id);
2445         IBE_UTIL.DEBUG('IBE_QUOTE_SAVESHARE_V2_PVT.END_WORKING:recipient party_id: '||l_quote_access_rec_recip.party_id);
2446         IBE_UTIL.DEBUG('IBE_QUOTE_SAVESHARE_V2_PVT.END_WORKING:recipient number: '||l_quote_access_rec_recip.quote_sharee_number);
2447         IBE_UTIL.DEBUG('IBE_QUOTE_SAVESHARE_V2_PVT.END_WORKING:recipient id: '||l_quote_access_rec_recip.quote_sharee_id);
2448         IBE_UTIL.DEBUG('IBE_QUOTE_SAVESHARE_V2_PVT.END_WORKING:contact_point_id: '||l_quote_access_rec_recip.contact_point_id);
2449       END IF;
2450 
2451       IBE_WORKFLOW_PVT.Notify_view_shared_cart(
2452           p_api_version       => p_api_version
2453           ,p_init_msg_list    => p_init_msg_list
2454           ,p_quote_access_rec => l_quote_access_rec_recip
2455           ,p_minisite_id      => p_minisite_id
2456           ,p_url              => p_url
2457           ,p_notes            => p_notes
2458           ,p_sent_by_party_id => l_initiator_id
2459           ,x_return_status    => x_return_status
2460           ,x_msg_count        => x_msg_count
2461           ,x_msg_data         => x_msg_data         );
2462         IF (x_return_status = FND_API.G_RET_STS_ERROR) THEN
2463           RAISE FND_API.G_EXC_ERROR;
2464         END IF;
2465         IF (x_return_status = FND_API.G_RET_STS_UNEXP_ERROR) THEN
2466           RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
2467         END IF;
2468     END IF;
2469   END LOOP;
2470 
2471   IF (IBE_UTIL.G_DEBUGON = l_true) THEN
2472      IBE_UTIL.DEBUG('IBE_QUOTE_SAVESHARE_V2_PVT.END_WORKING: END');
2473   END IF;
2474   --DBMS_OUTPUT.PUT_LINE('IBE_QUOTE_SAVESHARE_V2_PVT.END_WORKING: END ');
2475 EXCEPTION
2476    WHEN FND_API.G_EXC_ERROR THEN
2477       ROLLBACK TO ENDWORKING_V2;
2478       x_return_status := FND_API.G_RET_STS_ERROR;
2479 	  FND_Msg_Pub.Count_And_Get(p_encoded => FND_API.G_FALSE,
2480                                 p_count   => x_msg_count    ,
2481                                 p_data    => x_msg_data);
2482       IF (IBE_UTIL.G_DEBUGON = l_true) THEN
2483          IBE_Util.Debug('Expected error in IBE_QUOTE_SAVESHARE_V2_PVT.ENDWORKING');
2484       END IF;
2485 
2486    WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
2487       ROLLBACK TO ENDWORKING_V2;
2488       x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
2489 	  FND_Msg_Pub.Count_And_Get(p_encoded => FND_API.G_FALSE,
2490                                 p_count   => x_msg_count    ,
2491                                 p_data    => x_msg_data);
2492       IF (IBE_UTIL.G_DEBUGON = l_true) THEN
2493          IBE_Util.Debug('Unexpected error in IBE_QUOTE_SAVESHARE_V2_PVT.ENDWORKING)');
2494       END IF;
2495 
2496    WHEN OTHERS THEN
2497       ROLLBACK TO ENDWORKING_V2;
2498       x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
2499 	  IF FND_Msg_Pub.Check_Msg_Level(FND_Msg_Pub.G_MSG_LVL_UNEXP_ERROR) THEN
2500          FND_Msg_Pub.Add_Exc_Msg(G_PKG_NAME,
2501                                  l_api_name);
2502       END IF;
2503       FND_Msg_Pub.Count_And_Get(p_encoded => FND_API.G_FALSE,
2504                                 p_count   => x_msg_count    ,
2505                                 p_data    => x_msg_data);
2506       IF (IBE_UTIL.G_DEBUGON = l_true) THEN
2507          IBE_Util.Debug('Unknown error in IBE_QUOTE_SAVESHARE_V2_PVT.ENDWORKING');
2508       END IF;
2509 
2510 
2511 END;
2512 /*updates all recipients' access levels to readonly
2513 *Usages:
2514 -Status changes from "cart" to"quote" - request sales assistance, contract cart
2515 */
2516 Procedure share_readonly  (
2517     p_quote_header_id  IN  Number                      ,
2518     P_minisite_id      IN  Number := FND_API.G_MISS_NUM,
2519     p_url              IN  Varchar2 := FND_API.G_MISS_CHAR,
2520     p_api_version      IN  NUMBER   := 1               ,
2521     p_init_msg_list    IN  VARCHAR2 := FND_API.G_TRUE  ,
2522     p_commit           IN  VARCHAR2 := FND_API.G_FALSE ,
2523     x_return_status    OUT NOCOPY VARCHAR2             ,
2524     x_msg_count        OUT NOCOPY NUMBER               ,
2525     x_msg_data         OUT NOCOPY VARCHAR2             ) is
2526 
2527   l_api_name         CONSTANT VARCHAR2(30)   := 'SHAREREADONLY_V2';
2528   l_api_version      CONSTANT NUMBER         := 1.0;
2529   tbl_counter        NUMBER                  := 1;
2530   l_initiator_id     NUMBER;
2531 
2532   l_quote_access_tbl IBE_QUOTE_SAVESHARE_pvt.QUOTE_ACCESS_Tbl_Type
2533                      := IBE_QUOTE_SAVESHARE_pvt.g_miss_quote_access_tbl;
2534 
2535   cursor c_get_recipients(c_qte_hdr_id NUMBER) is
2536     select quote_sharee_id,
2537            party_id,
2538            cust_account_id,
2539            quote_header_id
2540     from IBE_SH_QUOTE_ACCESS
2541     where quote_header_id = c_qte_hdr_id
2542     and nvl(end_date_active,sysdate+1) > sysdate;
2543 
2544   rec_get_recipients c_get_recipients%rowtype;
2545 
2546 BEGIN
2547 
2548   SAVEPOINT  SHAREREADONLY_V2;
2549   -- Standard call to check for call compatibility.
2550   IF NOT FND_API.Compatible_API_Call (	l_api_version,
2551                              			P_Api_Version,
2552                                    		l_api_name,
2553                        					G_PKG_NAME )
2554   THEN
2555       RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
2556   END IF;
2557    -- Initialize message list IF p_init_msg_list is set to TRUE.
2558   IF FND_API.to_Boolean( p_init_msg_list ) THEN
2559       FND_MSG_PUB.initialize;
2560   END IF;
2561 
2562    --  Initialize API return status to success
2563   x_return_status := FND_API.G_RET_STS_SUCCESS;
2564 -------------------------------------------------------------------------------------------------------------
2565 --API Body start
2566 -------------------------------------------------------------------------------------------------------------
2567 
2568   IF (IBE_UTIL.G_DEBUGON = l_true) THEN
2569     IBE_UTIL.DEBUG('IBE_QUOTE_SAVESHARE_V2_PVT.SHARE_READONLY: START');
2570     IBE_UTIL.DEBUG('IBE_QUOTE_SAVESHARE_V2_PVT.SHARE_READONLY:quote_header_id: '||p_quote_header_id);
2571     IBE_UTIL.DEBUG('IBE_QUOTE_SAVESHARE_V2_PVT.SHARE_READONLY: Querying initiator party id');
2572   END IF;
2573 
2574   FOR rec_userenv_partyid in c_userenv_partyid LOOP
2575     l_initiator_id := rec_userenv_partyid.customer_id;
2576     EXIT when c_userenv_partyid%notfound;
2577   END LOOP;
2578 
2579   IF (IBE_UTIL.G_DEBUGON = l_true) THEN
2580     IBE_UTIL.DEBUG('Building quote access table');
2581   END IF;
2582 
2583   FOR rec_get_recipients in c_get_recipients(p_quote_header_id) LOOP
2584 
2585     --Omitting the initiator's details as initiator is not required to get the notification
2586     IF (l_initiator_id <> nvl(rec_get_recipients.party_id,-1) ) THEN
2587       l_quote_access_tbl(tbl_counter).quote_sharee_id            := rec_get_recipients.quote_sharee_id;
2588 
2589       IF (IBE_UTIL.G_DEBUGON = l_true) THEN
2590         IBE_UTIL.DEBUG('Added sharee quote_sharee_id: '||rec_get_recipients.quote_sharee_id);
2591       END IF;
2592 
2593       l_quote_access_tbl(tbl_counter).update_privilege_type_code := 'R';
2594       l_quote_access_tbl(tbl_counter).party_id                   := rec_get_recipients.party_id;
2595       l_quote_access_tbl(tbl_counter).cust_account_id            := rec_get_recipients.cust_account_id;
2596       l_quote_access_tbl(tbl_counter).quote_header_id            := rec_get_recipients.quote_header_id;
2597       l_quote_access_tbl(tbl_counter).operation_code             := 'UPDATE';
2598       tbl_counter := tbl_counter+1;
2599     END IF;
2600     EXIT when c_get_recipients%notfound;
2601   END LOOP;
2602   IF (IBE_UTIL.G_DEBUGON = l_true) THEN
2603      IBE_UTIL.DEBUG('Done building quote access table');
2604   END IF;
2605 
2606   IF (IBE_UTIL.G_DEBUGON = l_true) THEN
2607      IBE_UTIL.DEBUG('Calling save_recipients to update recipient access level');
2608   END IF;
2609   IBE_QUOTE_SAVESHARE_V2_PVT.save_recipients(
2610       P_Quote_access_tbl => l_quote_access_tbl ,
2611       P_Quote_header_id  => P_Quote_header_id  ,
2612       P_minisite_id      => p_minisite_id      ,
2613       p_url              => p_url              ,
2614       p_api_version      => p_api_version      ,
2615       p_init_msg_list    => fnd_api.g_false    ,
2616       p_commit           => fnd_api.g_false    ,
2617       x_return_status    => x_return_status    ,
2618       x_msg_count        => x_msg_count        ,
2619       x_msg_data         => x_msg_data         );
2620 
2621   IF (IBE_UTIL.G_DEBUGON = l_true) THEN
2622      IBE_UTIL.DEBUG('Done calling save_recipients to update recipient access level');
2623      IBE_UTIL.DEBUG('IBE_QUOTE_SAVESHARE_V2_PVT.SHARE_READONLY: END');
2624   END IF;
2625 
2626 EXCEPTION
2627 
2628    WHEN FND_API.G_EXC_ERROR THEN
2629       ROLLBACK TO STOPSHARING_V2;
2630       x_return_status := FND_API.G_RET_STS_ERROR;
2631 	  FND_Msg_Pub.Count_And_Get(p_encoded => FND_API.G_FALSE,
2632                                 p_count   => x_msg_count    ,
2633                                 p_data    => x_msg_data);
2634       IF (IBE_UTIL.G_DEBUGON = l_true) THEN
2635          IBE_Util.Debug('Expected error in IBE_QUOTE_SAVESHARE_V2_PVT.SHAREREADONLY_V2');
2636       END IF;
2637 
2638    WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
2639       ROLLBACK TO STOPSHARING_V2;
2640       x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
2641 	  FND_Msg_Pub.Count_And_Get(p_encoded => FND_API.G_FALSE,
2642                                 p_count   => x_msg_count    ,
2643                                 p_data    => x_msg_data);
2644       IF (IBE_UTIL.G_DEBUGON = l_true) THEN
2645          IBE_Util.Debug('Unexpected error in IBE_QUOTE_SAVESHARE_V2_PVT.SHAREREADONLY_V2');
2646       END IF;
2647 
2648    WHEN OTHERS THEN
2649       ROLLBACK TO STOPSHARING_V2;
2650       x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
2651 	  IF FND_Msg_Pub.Check_Msg_Level(FND_Msg_Pub.G_MSG_LVL_UNEXP_ERROR) THEN
2652          FND_Msg_Pub.Add_Exc_Msg(G_PKG_NAME,
2653                                  l_api_name);
2654       END IF;
2655       FND_Msg_Pub.Count_And_Get(p_encoded => FND_API.G_FALSE,
2656                                 p_count   => x_msg_count    ,
2657                                 p_data    => x_msg_data);
2658       IF (IBE_UTIL.G_DEBUGON = l_true) THEN
2659          IBE_Util.Debug('Unknown error in IBE_QUOTE_SAVESHARE_V2_PVT.SHAREREADONLY_V2');
2660       END IF;
2661 END;
2662 
2663 /*To delete a recipient (a sort of wrapper around the "raw" delete table hander)
2664 *Usages:
2665 -To remove a recipient from the list of persons to whom a cart is shared.
2666 -All deletes for a recipient should be done using this api.
2667 -As of IBE.P - p_quote_access_rec must have the shared_by_party_id set
2668 */
2669 Procedure DELETE_RECIPIENT  (
2670     P_Quote_access_rec  IN  IBE_QUOTE_SAVESHARE_pvt.QUOTE_ACCESS_REC_TYPE
2671                             := IBE_QUOTE_SAVESHARE_pvt.G_MISS_QUOTE_ACCESS_REC ,
2672     P_minisite_id       IN  NUMBER                                             ,
2673     p_delete_code       IN  VARCHAR2 := 'IBE_SC_CART_STOPSHARING'            ,
2674     p_url               IN  VARCHAR2 := FND_API.G_MISS_CHAR                    ,
2675     p_notes             IN  VARCHAR2 := FND_API.G_MISS_CHAR                    ,
2676     p_api_version       IN  NUMBER   := 1                                      ,
2677     p_init_msg_list     IN  VARCHAR2 := FND_API.G_TRUE                         ,
2678     p_commit            IN  VARCHAR2 := FND_API.G_FALSE                        ,
2679     x_return_status     OUT NOCOPY VARCHAR2                                    ,
2680     x_msg_count         OUT NOCOPY NUMBER                                      ,
2681     x_msg_data          OUT NOCOPY VARCHAR2                                    ) is
2682 
2683     l_api_name         CONSTANT VARCHAR2(30)   := 'DELETERECIPIENT_V2';
2684     l_api_version      CONSTANT NUMBER         := 1.0;
2685     l_url                     VARCHAR2(2000);
2686     l_owner_partyid           NUMBER;
2687     l_owner_accountid         NUMBER;
2688     l_contact_point_rec     HZ_CONTACT_POINT_V2PUB.CONTACT_POINT_REC_TYPE;
2689     l_party_id              NUMBER;
2690     l_contact_point_id      NUMBER;
2691     l_object_version_number NUMBER;
2692 
2693 
2694 /* Fixed the query for the bug 4860734 */
2695      cursor c_find_active_cart is
2696        select a.quote_header_id, a.party_id ,a.cust_account_id
2697        from   IBE_ACTIVE_QUOTES a, ibe_sh_quote_access b
2698        where a.party_id = b.party_id
2699        and a.cust_account_id = b.cust_account_id
2700        and b.quote_sharee_id = P_Quote_access_rec.quote_sharee_id
2701        and nvl(b.end_date_active, sysdate+1) > sysdate
2702        and a.quote_header_id = p_quote_access_rec.quote_header_id
2703        and record_type= 'CART';
2704 
2705     cursor c_get_owner_ids(c_quote_id number) is
2706       select party_id, cust_account_id
2707       from ASO_QUOTE_HEADERS_ALL
2708       where quote_header_id = c_quote_id;
2709 
2710     cursor c_get_contact_point_ovn(c_quote_sharee_id Number) IS
2711       select QUOTE_ACCESS.party_id, CNTCT_POINTS.contact_point_id, CNTCT_POINTS.object_version_number
2712       from  hz_contact_points CNTCT_POINTS, ibe_sh_quote_access QUOTE_ACCESS
2713       where CNTCT_POINTS.contact_point_id  = QUOTE_ACCESS.contact_point_id
2714         and quote_sharee_id = c_quote_sharee_id;
2715 
2716     rec_find_active_cart c_find_active_cart%rowtype;
2717     rec_get_owner_ids c_get_owner_ids%rowtype;
2718 
2719     l_delete_context     VARCHAR2(2000);
2720     l_shared_by_party_id  NUMBER;
2721 
2722 BEGIN
2723 
2724   SAVEPOINT  DELETERECIPIENT_V2;
2725   -- Standard call to check for call compatibility.
2726   IF NOT FND_API.Compatible_API_Call (	l_api_version,
2727                              			P_Api_Version,
2728                                    		l_api_name,
2729                        					G_PKG_NAME )
2730   THEN
2731       RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
2732   END IF;
2733    -- Initialize message list IF p_init_msg_list is set to TRUE.
2734   IF FND_API.to_Boolean( p_init_msg_list ) THEN
2735       FND_MSG_PUB.initialize;
2736   END IF;
2737 
2738    --  Initialize API return status to success
2739   x_return_status := FND_API.G_RET_STS_SUCCESS;
2740 -------------------------------------------------------------------------------------------------------------
2741 --API Body start
2742 -------------------------------------------------------------------------------------------------------------
2743 
2744   IF (IBE_UTIL.G_DEBUGON = l_true) THEN
2745      IBE_UTIL.DEBUG('IBE_QUOTE_SAVESHARE_V2_PVT.DELETE_RECIPIENT: START');
2746   END IF;
2747   FOR rec_find_active_cart in c_find_active_cart loop
2748     IF(rec_find_active_cart.quote_header_id is not null) THEN
2749     IF (IBE_UTIL.G_DEBUGON = l_true) THEN
2750        IBE_UTIL.DEBUG('IBE_QUOTE_SAVESHARE_V2_PVT.DELETE_RECIPIENT:user has an active cart');
2751        IBE_UTIL.DEBUG('Calling update row handler to deactivate the cart');
2752     END IF;
2753     --DBMS_OUTPUT.PUT_LINE('IBE_QUOTE_SAVESHARE_V2_PVT.DELETE_RECIPIENT:user has an active cart');
2754 
2755     IBE_ACTIVE_QUOTES_ALL_PKG.UPDATE_ROW(
2756            X_OBJECT_VERSION_NUMBER => 1                                   ,
2757            X_QUOTE_HEADER_ID       => null                                ,
2758            X_PARTY_ID              => rec_find_active_cart.party_id       ,
2759            X_CUST_ACCOUNT_ID       => rec_find_active_cart.cust_account_id,
2760            X_RECORD_TYPE           => 'CART'                             ,
2761            X_CURRENCY_CODE         => null                                ,
2762            x_last_update_date      => sysdate                             ,
2763            x_last_updated_by       => fnd_global.user_id                  ,
2764            x_last_update_login     => 1);
2765     IF (IBE_UTIL.G_DEBUGON = l_true) THEN
2766        IBE_UTIL.DEBUG('Done calling update row handler to deactivate the cart');
2767     END IF;
2768     END IF;
2769     EXIT WHEN c_find_active_cart%NOTFOUND;
2770   END LOOP;
2771   IF (IBE_UTIL.G_DEBUGON = l_true) THEN
2772      IBE_UTIL.DEBUG('Calling Update row handler on sh_quote_access table to end-date recipient row');
2773   END IF;
2774   --DBMS_OUTPUT.PUT_LINE('Calling Update row handler on sh_quote_access table to end-date recipient row');
2775 
2776   open c_get_contact_point_ovn(P_Quote_access_rec.quote_sharee_id);
2777   fetch c_get_contact_point_ovn into l_party_id, l_contact_point_id, l_object_version_number;
2778 
2779   if(l_party_id is NULL) THEN
2780      l_contact_point_rec.contact_point_id := l_contact_point_id;
2781      l_contact_point_rec.status := 'I';
2782      l_contact_point_rec.primary_flag := 'N';
2783      HZ_CONTACT_POINT_V2PUB.update_contact_point(
2784         			p_init_msg_list	     	=>  FND_API.G_FALSE,
2785 				    p_contact_point_rec  	=>  l_contact_point_rec,
2786 				    p_object_version_number =>  l_object_version_number,
2787 				    x_return_status		    =>  x_return_status,
2788 				    x_msg_count		        =>  x_msg_count,
2789      				x_msg_data		        =>  x_msg_data);
2790 
2791      IF x_return_status <> FND_API.G_RET_STS_SUCCESS THEN
2792          RAISE FND_API.G_EXC_ERROR;
2793      END IF;
2794   END IF;
2795 
2796   IBE_SH_QUOTE_ACCESS_PKG.update_Row(
2797                      p_quote_sharee_id   => P_Quote_access_rec.quote_sharee_id
2798                      ,p_end_date_active  => sysdate);
2799   IF (IBE_UTIL.G_DEBUGON = l_true) THEN
2800     IBE_UTIL.DEBUG('Done calling Update row handler on sh_quote_access table to end-date recipient row');
2801   END IF;
2802   IF (IBE_UTIL.G_DEBUGON = l_true) THEN
2803     IBE_UTIL.DEBUG('IBE_QUOTE_SAVESHARE_V2_PVT.DELETE_RECIPIENT: END');
2804     IBE_UTIL.DEBUG('delete_code is: '||p_delete_code);
2805   END IF;
2806 
2807   IF (p_quote_access_rec.notify_flag = FND_API.G_TRUE) THEN
2808     --Notify_finish_sharing API with the appropriate delete_code
2809     IF (p_delete_code = 'END_WORKING') THEN
2810       /*obtain the owner party_id and acctid of the cart/quote being dealt with*/
2811       FOR rec_get_owner_ids in c_get_owner_ids(p_quote_access_rec.quote_header_id) LOOP
2812         l_owner_partyid := rec_get_owner_ids.party_id;
2813         l_owner_accountid := rec_get_owner_ids.cust_account_id;
2814         EXIT when c_get_owner_ids%notfound;
2815       END LOOP;
2816 
2817       -- notification that goes to the owner (so and so has finished working this cart)
2818       -- for generic email to owner, we need to add some special parameters since we will not have a retrieval number
2819       l_url := p_url || '&opid=' || l_owner_partyid || '&oaid=' || l_owner_accountid;
2820       IF (IBE_UTIL.G_DEBUGON = l_true) THEN
2821         IBE_UTIL.DEBUG('url for generic email to OWNER: '||l_url);
2822       END IF;
2823 
2824       IF (IBE_UTIL.G_DEBUGON = l_true) THEN
2825         IBE_UTIL.DEBUG('Calling notify_end_working API');
2826       END IF;
2827       IBE_WORKFLOW_PVT.Notify_End_Working(
2828         p_api_version      => p_api_version                         ,
2829         p_init_msg_list    => p_init_msg_list                       ,
2830         p_quote_header_id  => p_quote_access_rec.quote_header_id    ,
2831         p_party_id         => p_quote_access_rec.party_id           ,
2832         p_Cust_Account_Id  => p_quote_access_rec.cust_account_id    ,
2833         p_retrieval_number => p_quote_access_rec.quote_sharee_number,
2834         p_minisite_id      => p_minisite_id                         ,
2835         p_url              => l_url                                 ,
2836         p_notes            => p_notes                               ,
2837         x_return_status    => x_return_status                       ,
2838         x_msg_count        => x_msg_count                           ,
2839         x_msg_data         => x_msg_data                            );
2840 
2841          IF (x_return_status = FND_API.G_RET_STS_ERROR) THEN
2842            RAISE FND_API.G_EXC_ERROR;
2843          END IF;
2844          IF (x_return_status = FND_API.G_RET_STS_UNEXP_ERROR) THEN
2845            RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
2846          END IF;
2847       IF (IBE_UTIL.G_DEBUGON = l_true) THEN
2848         IBE_UTIL.DEBUG('Done calling notify_end_working API');
2849       END IF;
2850     ELSE
2851       IF (IBE_UTIL.G_DEBUGON = l_true) THEN
2852         IBE_UTIL.DEBUG('Calling notify_finish_sharing API');
2853       END IF;
2854       --DBMS_OUTPUT.PUT_LINE('Calling notify_stop_sharing API ');
2855       -- notification that goes to the member (you no longer have access to this cart)
2856       IBE_WORKFLOW_PVT.Notify_Finish_Sharing(
2857          p_api_version      => p_api_version      ,
2858          p_init_msg_list    => p_init_msg_list    ,
2859          p_quote_access_rec => p_quote_access_rec ,  --of the recepient
2860          p_minisite_id      => p_minisite_id      ,
2861          p_url              => p_url              ,
2862          p_context_code     => p_delete_code      ,
2863          p_shared_by_partyid=> p_quote_access_rec.shared_by_party_id,
2864          p_notes            => p_notes            ,
2865          x_return_status    => x_return_status    ,
2866          x_msg_count        => x_msg_count        ,
2867          x_msg_data         => x_msg_data         );
2868 
2869          IF (x_return_status = FND_API.G_RET_STS_ERROR) THEN
2870            RAISE FND_API.G_EXC_ERROR;
2871          END IF;
2872          IF (x_return_status = FND_API.G_RET_STS_UNEXP_ERROR) THEN
2873            RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
2874          END IF;
2875       IF (IBE_UTIL.G_DEBUGON = l_true) THEN
2876         IBE_UTIL.DEBUG('Done calling notify_finish_sharing API');
2877       END IF;
2878     END IF; --end working or finish sharing
2879   END IF; --IF notify_flag is true
2880 
2881 EXCEPTION
2882    WHEN FND_API.G_EXC_ERROR THEN
2883       ROLLBACK TO DELETERECIPIENT_V2;
2884       x_return_status := FND_API.G_RET_STS_ERROR;
2885 	  FND_Msg_Pub.Count_And_Get(p_encoded => FND_API.G_FALSE,
2886                                 p_count   => x_msg_count    ,
2887                                 p_data    => x_msg_data);
2888       IF (IBE_UTIL.G_DEBUGON = l_true) THEN
2889          IBE_Util.Debug('Expected error in IBE_QUOTE_SAVESHARE_V2_PVT.DELETE_RECIPIENT()');
2890       END IF;
2891 
2892    WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
2893       ROLLBACK TO DELETERECIPIENT_V2;
2894       x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
2895 	  FND_Msg_Pub.Count_And_Get(p_encoded => FND_API.G_FALSE,
2896                                 p_count   => x_msg_count    ,
2897                                 p_data    => x_msg_data);
2898       IF (IBE_UTIL.G_DEBUGON = l_true) THEN
2899          IBE_Util.Debug('Unexpected error in IBE_QUOTE_SAVESHARE_V2_PVT.DELETE_RECIPIENT()');
2900       END IF;
2901 
2902    WHEN OTHERS THEN
2903       ROLLBACK TO DELETERECIPIENT_V2;
2904       x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
2905 	  IF FND_Msg_Pub.Check_Msg_Level(FND_Msg_Pub.G_MSG_LVL_UNEXP_ERROR) THEN
2906          FND_Msg_Pub.Add_Exc_Msg(G_PKG_NAME,
2907                                  l_api_name);
2908       END IF;
2909       FND_Msg_Pub.Count_And_Get(p_encoded => FND_API.G_FALSE,
2910                                 p_count   => x_msg_count    ,
2911                                 p_data    => x_msg_data);
2912       IF (IBE_UTIL.G_DEBUGON = l_true) THEN
2913          IBE_Util.Debug('Unknown error in IBE_QUOTE_SAVESHARE_V2_PVT.DELETE_RECIPIENT()');
2914       END IF;
2915 
2916 END;
2917 
2918 PROCEDURE Validate_share_Update(
2919  p_api_version_number         IN NUMBER   := 1.0
2920 ,p_init_msg_list              IN VARCHAR2 := FND_API.G_FALSE
2921 ,p_quote_header_rec           IN ASO_QUOTE_PUB.Qte_Header_Rec_Type
2922 ,p_quote_access_tbl           IN IBE_QUOTE_SAVESHARE_pvt.QUOTE_ACCESS_Tbl_Type
2923                                 := IBE_QUOTE_SAVESHARE_pvt.G_miss_quote_access_Tbl
2924 -- partyid and accountid cannot be gmiss coming in
2925 ,p_party_id                   IN NUMBER
2926 ,p_cust_account_id            IN NUMBER
2927 ,p_retrieval_number           IN NUMBER     := FND_API.G_MISS_NUM
2928 ,p_operation_code             IN VARCHAR2
2929 ,x_return_status              OUT NOCOPY VARCHAR2
2930 ,x_msg_count                  OUT NOCOPY NUMBER
2931 ,x_msg_data                   OUT NOCOPY VARCHAR2
2932 )
2933 
2934 is
2935 
2936 l_api_name    CONSTANT VARCHAR2(30) := 'Validate_share_Update';
2937 l_api_version CONSTANT NUMBER       := 1.0;
2938 l_check_updates        VARCHAR2(1)  := FND_API.G_FALSE; -- checks timestamps and if updates are really necessary
2939 l_check_onlynotify     VARCHAR2(1)  := FND_API.G_FALSE;
2940 l_is_owner             VARCHAR2(1)  := FND_API.G_TRUE;
2941 l_owner_party_id       NUMBER;
2942 l_userenv_party_id     NUMBER;
2943 l_access_level         VARCHAR2(30) := null;
2944 l_db_last_update_date  DATE;
2945 l_db_end_date_active   DATE;
2946 l_db_access_level    VARCHAR2(30) := null;
2947 l_db_quote_access_tbl  IBE_QUOTE_SAVESHARE_pvt.QUOTE_ACCESS_Tbl_Type;
2948 l_env_user_id NUMBER;
2949 
2950 cursor c_get_owner_partyid(c_quote_id number) is
2951   select party_id
2952   from ASO_QUOTE_HEADERS_ALL
2953   where quote_header_id = c_quote_id;
2954 
2955 rec_get_owner_partyid c_get_owner_partyid%rowtype;
2956 
2957 cursor c_get_role_by_retr_num(c_retrieval_number number, c_party_id number, c_acct_id number) is
2958   select update_privilege_type_code
2959   from ibe_sh_quote_access
2960   where quote_sharee_number = c_retrieval_number
2961   and (party_id is null or party_id = c_party_id)
2962   and (cust_account_id is null or cust_account_id = c_acct_id);
2963 
2964 rec_get_role_by_retr_num c_get_role_by_retr_num%rowtype;
2965 
2966 cursor c_get_role_by_user(c_party_id number, c_account_id number, c_qte_hdr_id number) is
2967   select update_privilege_type_code
2968   from ibe_sh_quote_access
2969   where quote_header_id = c_qte_hdr_id
2970   and party_id = c_party_id
2971   and cust_account_id = c_account_id
2972   AND nvl(end_date_active, sysdate+1) > sysdate;
2973 
2974 
2975 rec_get_role_by_user c_get_role_by_user%rowtype;
2976 
2977 cursor c_get_recipient_info(c_recipient_id number) is
2978   select last_update_date, last_updated_by, end_date_active, update_privilege_type_code
2979   from ibe_sh_quote_access
2980   where quote_sharee_id = c_recipient_id;
2981 
2982 rec_get_recipient_info c_get_recipient_info%rowtype;
2983 
2984 BEGIN
2985 
2986   IF (IBE_UTIL.G_DEBUGON = l_true) THEN
2987      IBE_UTIL.DEBUG('Begin validate_share_update : ' || to_char(sysdate, 'mm/dd/yyyy:hh24:MI:SS'));
2988   END IF;
2989 
2990   -- Standard call to check for call compatibility.
2991   IF NOT FND_API.Compatible_API_Call (l_api_version,
2992 			       p_api_version_number,
2993 			       l_api_name,
2994 			       G_PKG_NAME )
2995   THEN
2996     RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
2997   END IF;
2998 
2999   -- Initialize message list if p_init_msg_list is set to TRUE.
3000 
3001   IF FND_API.To_Boolean( p_init_msg_list ) THEN
3002 	FND_Msg_Pub.initialize;
3003   END IF;
3004 
3005   --  Initialize API return status to success
3006   x_return_status := FND_API.G_RET_STS_SUCCESS;
3007 
3008   -- API body
3009   -- start by returning the input
3010 
3011   IF (IBE_UTIL.G_DEBUGON = l_true) THEN
3012      IBE_UTIL.DEBUG('Incoming quote_header_id is  :'||p_quote_header_rec.quote_header_id);
3013      IBE_UTIL.DEBUG('Incoming operation_code is   :'||p_operation_code);
3014      IBE_UTIL.DEBUG('Incoming party_id is         :'||p_party_id);
3015      IBE_UTIL.DEBUG('Incoming account_id is       :'||p_cust_account_id);
3016      IBE_UTIL.DEBUG('Incoming retrieval_number is :'||p_retrieval_number);
3017   END IF;
3018 
3019 /*  FOR rec_userenv_partyid in c_userenv_partyid LOOP
3020     l_userenv_party_id := rec_userenv_partyid.customer_id;
3021   EXIT when c_userenv_partyid%notfound;
3022   END LOOP;
3023 */
3024   FOR rec_get_owner_partyid in c_get_owner_partyid(p_quote_header_rec.quote_header_id) LOOP
3025     l_owner_party_id := rec_get_owner_partyid.party_id;
3026   EXIT when c_get_owner_partyid%notfound;
3027   END LOOP;
3028 ------------ USER VALIDATION - must be either owner or valid recipient ------------------------------
3029   if (l_owner_party_id <> p_party_id) then
3030     l_is_owner := FND_API.G_FALSE;
3031   else
3032     IF (IBE_UTIL.G_DEBUGON = l_true) THEN
3033       IBE_Util.Debug('Initiator is OWNER');
3034     END IF;
3035   end if;
3036 
3037 --  if ((l_is_owner = FND_API.G_FALSE) and (p_operation_code <> OP_END_WORKING)) then
3038   if (l_is_owner = FND_API.G_FALSE) then
3039   -- if user is not the owner then we need to make sure he is a valid member
3040     IF (IBE_UTIL.G_DEBUGON = l_true) THEN
3041       IBE_Util.Debug('Initiator may be RECIPIENT');
3042     END IF;
3043     if ((p_retrieval_number is not null) and (p_retrieval_number <> FND_API.G_MISS_NUM)) then
3044       FOR rec_get_role_by_retr_num in c_get_role_by_retr_num(p_retrieval_number, p_party_id, p_cust_account_id) LOOP
3045         l_access_level := rec_get_role_by_retr_num.update_privilege_type_code;
3046       EXIT when c_get_role_by_retr_num%notfound;
3047       END LOOP;
3048     else
3049       FOR rec_get_role_by_user in c_get_role_by_user(p_party_id, p_cust_account_id,p_quote_header_rec.quote_header_id) LOOP
3050         l_access_level := rec_get_role_by_user.update_privilege_type_code;
3051       EXIT when c_get_role_by_user%notfound;
3052       END LOOP;
3053     end if;
3054     IF (IBE_UTIL.G_DEBUGON = l_true) THEN
3055       IBE_Util.Debug('RECIPIENT access level: ' || l_access_level);
3056     END IF;
3057     if (l_access_level is null) then
3058       IF FND_Msg_Pub.Check_Msg_Level (FND_Msg_Pub.G_MSG_LVL_ERROR) THEN
3059         FND_Message.Set_Name('IBE', 'IBE_SC_ERR_USERACCESS');
3060         FND_Msg_Pub.Add;
3061       END IF;
3062       -- need to raise an error that the user no longer has access to this cart
3063       RAISE FND_API.G_EXC_ERROR;
3064     end if;
3065   end if;
3066 
3067 ------------ DETERMINE WHICH VALIDATIONS TO DO BASED ON OP CODE ------------------------------
3068   -- owner only operations
3069   if (p_operation_code in (OP_APPEND, OP_NAME_CART, OP_SAVE_CART_AND_RECIPIENTS)) then
3070     if (l_is_owner = FND_API.G_FALSE) then
3071       IF FND_Msg_Pub.Check_Msg_Level (FND_Msg_Pub.G_MSG_LVL_ERROR) THEN
3072         FND_Message.Set_Name('IBE', 'IBE_SC_ERR_PRIVILEGE');
3073         FND_Msg_Pub.Add;
3074       END IF;
3075       -- raise an error that the user does not have this privilege
3076       RAISE FND_API.G_EXC_ERROR;
3077     end if;
3078     if (p_operation_code = OP_SAVE_CART_AND_RECIPIENTS) then
3079       l_check_updates := FND_API.G_TRUE;
3080     end if;
3081   -- owner or admin operations
3082   elsif (p_operation_code in (OP_STOP_SHARING, OP_DELETE_CART)) then
3083     if ((l_is_owner = FND_API.G_FALSE) and (l_access_level <> 'A')) then
3084       IF FND_Msg_Pub.Check_Msg_Level (FND_Msg_Pub.G_MSG_LVL_ERROR) THEN
3085         FND_Message.Set_Name('IBE', 'IBE_SC_ERR_PRIVILEGE');
3086         FND_Msg_Pub.Add;
3087       END IF;
3088       -- raise an error that the user does not have this privilege
3089       RAISE FND_API.G_EXC_ERROR;
3090     end if;
3091     l_check_onlynotify := FND_API.G_TRUE;
3092     l_check_updates := FND_API.G_TRUE;
3093   -- any role, but different checks depending on role
3094   elsif (p_operation_code = OP_SAVE_RECIPIENTS) then
3095     if ((l_is_owner = FND_API.G_FALSE) and (l_access_level <> 'A')) then
3096       -- if not the owner or not admin, then make sure user is only notifying
3097       l_check_onlynotify := FND_API.G_TRUE;
3098     end if;
3099     l_check_updates := FND_API.G_TRUE;
3100   elsif ((p_operation_code = OP_ACTIVATE_QUOTE) or (p_operation_code = OP_DEACTIVATE)) then
3101     l_check_updates := FND_API.G_FALSE; -- no validations to do here that have not already been done
3102   end if; -- end if else over operation_code
3103 
3104   IF (IBE_UTIL.G_DEBUGON = l_true) THEN
3105      IBE_UTIL.DEBUG('l_check_onlynotify is  :'||l_check_onlynotify);
3106      IBE_UTIL.DEBUG('l_check_updates is     :'||l_check_updates);
3107   END IF;
3108 
3109 ------------ VALIDATIONS ON THE INPUT QUOTE ACCESS TABLE ------------------------------
3110   if ((l_check_updates = FND_API.G_TRUE) or (l_check_onlynotify = FND_API.G_TRUE)) then
3111     l_env_user_id := FND_GLOBAL.USER_ID;
3112     FOR i in 1..p_quote_access_tbl.count LOOP
3113       IF (IBE_UTIL.G_DEBUGON = l_true) THEN
3114         IBE_UTIL.DEBUG('current quote_sharee_id : '||p_quote_access_tbl(i).quote_sharee_id);
3115       end if;
3116       -- populate a local table with all the db data - but index it according to the input table
3117       -- in this loop, we will check every opcode if necessary
3118       -- down below, we will end up only checking the ones that have a shareeid
3119       l_db_quote_access_tbl(i).operation_code := p_quote_access_tbl(i).operation_code;
3120       if ((p_quote_access_tbl(i).quote_sharee_id is not null)
3121           and (p_quote_access_tbl(i).quote_sharee_id <> fnd_api.g_miss_num)) then
3122         --cursor query to get last_update_date, contact_point_id, end_date_active
3123         FOR rec_get_recipient_info in c_get_recipient_info(p_quote_access_tbl(i).quote_sharee_id) LOOP
3124           l_db_quote_access_tbl(i).last_update_date := rec_get_recipient_info.last_update_date;
3125           l_db_quote_access_tbl(i).last_updated_by := rec_get_recipient_info.last_updated_by;
3126           l_db_quote_access_tbl(i).end_date_active := rec_get_recipient_info.end_date_active;
3127           l_db_quote_access_tbl(i).update_privilege_type_code := rec_get_recipient_info.update_privilege_type_code;
3128         EXIT when c_get_recipient_info%notfound;
3129         END LOOP;
3130         IF (IBE_UTIL.G_DEBUGON = l_true) THEN
3131           IBE_UTIL.DEBUG('input op_code           : '||p_quote_access_tbl(i).operation_code);
3132           IBE_UTIL.DEBUG('input last_update_date  : '||to_char(p_quote_access_tbl(i).last_update_date,'mm/dd/yyyy:hh24:MI:SS'));
3133           IBE_UTIL.DEBUG('db    last_update_date  : '||to_char(l_db_quote_access_tbl(i).last_update_date,'mm/dd/yyyy:hh24:MI:SS'));
3134           IBE_UTIL.DEBUG('input access_level      : '||p_quote_access_tbl(i).update_privilege_type_code);
3135           IBE_UTIL.DEBUG('db    access_level      : '||l_db_quote_access_tbl(i).update_privilege_type_code);
3136         end if;
3137         -- do the opcode permissions check as we loop
3138         if (l_check_onlynotify = FND_API.G_TRUE) then
3139           -- make sure we are not creating, deleting, or doing any real updates
3140           if ((p_quote_access_tbl(i).operation_code = 'DELETE')
3141                or(p_quote_access_tbl(i).operation_code = 'CREATE')
3142                or ((p_quote_access_tbl(i).operation_code = 'UPDATE')
3143                    and (p_quote_access_tbl(i).update_privilege_type_code is not null)
3144                    and (p_quote_access_tbl(i).update_privilege_type_code <> FND_API.G_MISS_CHAR)
3145                    and (p_quote_access_tbl(i).update_privilege_type_code <> l_db_quote_access_tbl(i).update_privilege_type_code))) then
3146             IF FND_Msg_Pub.Check_Msg_Level (FND_Msg_Pub.G_MSG_LVL_ERROR) THEN
3147               FND_Message.Set_Name('IBE', 'IBE_SC_ERR_PRIVILEGE');
3148               FND_Msg_Pub.Add;
3149             END IF;
3150             RAISE FND_API.G_EXC_ERROR;
3151           end if;
3152         end if; -- end check onlynotify
3153       end if;  -- end if we have a quote_sharee_id
3154     end loop; -- end loop over input access tbl
3155     -- second loop to check last update dates
3156     if (l_check_updates = FND_API.G_TRUE) then
3157       FOR i in 1..p_quote_access_tbl.count LOOP
3158         IF (IBE_UTIL.G_DEBUGON = l_true) THEN
3159           IBE_UTIL.DEBUG('current quote_sharee_id : '||p_quote_access_tbl(i).quote_sharee_id);
3160         end if;
3161         if ((p_quote_access_tbl(i).quote_sharee_id is not null)
3162             and (p_quote_access_tbl(i).quote_sharee_id <> fnd_api.g_miss_num)) then
3163 
3164           if ((p_quote_access_tbl(i).last_update_date <> FND_API.G_MISS_DATE) and
3165               (p_quote_access_tbl(i).last_update_date <> l_db_quote_access_tbl(i).last_update_date)) then
3166             -- i.e. don't throw exception if we want to end a row and it's already enddated.
3167             if ((p_quote_access_tbl(i).operation_code = 'DELETE') and (nvl(l_db_quote_access_tbl(i).end_date_active,sysdate-1) < sysdate)) then
3168               IF (IBE_UTIL.G_DEBUGON = l_true) THEN
3169                 IBE_UTIL.DEBUG('deleteing an end dated row, allowing it to pass through');
3170               end if;
3171             elsif (l_env_user_id = l_db_quote_access_tbl(i).last_updated_by) then
3172               IF (IBE_UTIL.G_DEBUGON = l_true) THEN
3173                 IBE_UTIL.DEBUG('timestamps do not match, but user was the last to update the row so allowing it to go through');
3174               end if;
3175             else
3176               IF FND_Msg_Pub.Check_Msg_Level (FND_Msg_Pub.G_MSG_LVL_ERROR) THEN
3177                 FND_Message.Set_Name('IBE', 'IBE_SC_ERR_MEMBERS_OUT_OF_SYNC');
3178                 FND_Msg_Pub.Add;
3179               END IF;
3180               -- need a new error msg that the row has been updated by another user and to try again
3181               RAISE FND_API.G_EXC_ERROR;
3182             end if;
3183           end if; -- end if last_update_dates dont match
3184         end if;  -- end if shareeid is not null
3185       end loop; -- end loop over input quote access tbl
3186     end if; -- end if doing check updates
3187   end if; -- end check of updates
3188 
3189   IF (IBE_UTIL.G_DEBUGON = l_true) THEN
3190     IBE_UTIL.DEBUG('End validate_share_update' || to_char(sysdate, 'mm/dd/yyyy:hh24:MI:SS'));
3191   END IF;
3192 
3193   EXCEPTION
3194   WHEN FND_API.G_EXC_ERROR THEN
3195    x_return_status := FND_API.G_RET_STS_ERROR;
3196    FND_Msg_Pub.Count_And_Get(p_encoded => FND_API.G_FALSE,
3197 		          p_count   => x_msg_count    ,
3198 			  p_data    => x_msg_data);
3199   IF (IBE_UTIL.G_DEBUGON = l_true) THEN
3200      IBE_Util.Debug('End  IBE_Quote_Misc_pvt.validate_share_update: expected error');
3201   END IF;
3202   WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
3203    x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
3204    FND_Msg_Pub.Count_And_Get(p_encoded => FND_API.G_FALSE,
3205 			  p_count   => x_msg_count    ,
3206 			  p_data    => x_msg_data);
3207    IF (IBE_UTIL.G_DEBUGON = l_true) THEN
3208       IBE_Util.Debug('End  IBE_Quote_Misc_pvt.validate_share_update: unexpected error');
3209    END IF;
3210   WHEN OTHERS THEN
3211   IF FND_Msg_Pub.Check_Msg_Level(FND_Msg_Pub.G_MSG_LVL_UNEXP_ERROR) THEN
3212     FND_Msg_Pub.Add_Exc_Msg(G_PKG_NAME,
3213 			   l_api_name);
3214   END IF;
3215   FND_Msg_Pub.Count_And_Get(p_encoded => FND_API.G_FALSE,
3216 			  p_count   => x_msg_count    ,
3217 			  p_data    => x_msg_data);
3218   IF (IBE_UTIL.G_DEBUGON = l_true) THEN
3219      IBE_Util.Debug('End IBE_Quote_Misc_pvt.validate_share_update: other exception');
3220   END IF;
3221 END validate_share_update;
3222 
3223 END IBE_QUOTE_SAVESHARE_V2_PVT;