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 2005/12/09 01:57:19 makulkar 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     --dbms_output.put_line('Input quote access is null ');
2116     FOR rec_get_recipients in c_get_recipients(p_quote_header_id) LOOP
2117       l_quote_access_tbl(tbl_counter).quote_sharee_id     := rec_get_recipients.quote_sharee_id;
2118       l_quote_access_tbl(tbl_counter).party_id            := rec_get_recipients.party_id;
2119        --dbms_output.put_line('found party_id:  '||rec_get_recipient_info.party_id);
2120       l_quote_access_tbl(tbl_counter).cust_account_id     := rec_get_recipients.cust_account_id;
2121       l_quote_access_tbl(tbl_counter).contact_point_id    := rec_get_recipients.contact_point_id;
2122       l_quote_access_tbl(tbl_counter).quote_header_id     := p_quote_header_id;
2123       l_quote_access_tbl(tbl_counter).quote_sharee_number := rec_get_recipients.quote_sharee_number;
2124       l_quote_access_tbl(tbl_counter).email_contact_address := rec_get_recipients.email_address;
2125       l_quote_access_tbl(tbl_counter).shared_by_party_id  := rec_get_recipients.shared_by_party_id;
2126       tbl_counter := tbl_counter+1;
2127       EXIT when c_get_recipients%notfound;
2128     END LOOP;
2129   ELSE
2130     --dbms_output.put_line('Input quote access table is not null');
2131 
2132     FOR tbl_counter in 1..p_quote_access_tbl.count LOOP
2133        --dbms_output.put_line('p_quote_access_tbl(tbl_counter).quote_sharee_id: '||p_quote_access_tbl(tbl_counter).quote_sharee_id);
2134       FOR rec_get_recipient_info in c_get_recipient_info(l_quote_access_tbl(tbl_counter).quote_sharee_id) LOOP
2135         IF l_sharing_party_id <> rec_get_recipient_info.party_id THEN
2136 
2137           l_quote_access_tbl(tbl_counter).quote_sharee_id     := p_quote_access_tbl(tbl_counter).quote_sharee_id;
2138           l_quote_access_tbl(tbl_counter).notify_flag         := p_quote_access_tbl(tbl_counter).notify_flag;
2139           l_quote_access_tbl(tbl_counter).party_id            := rec_get_recipient_info.party_id;
2140           --dbms_output.put_line('found party_id:  '||rec_get_recipient_info.party_id);
2141           l_quote_access_tbl(tbl_counter).cust_account_id     := rec_get_recipient_info.cust_account_id;
2142           l_quote_access_tbl(tbl_counter).contact_point_id    := rec_get_recipient_info.contact_point_id;
2143           l_quote_access_tbl(tbl_counter).quote_header_id     := p_quote_header_id;
2144           l_quote_access_tbl(tbl_counter).quote_sharee_number := rec_get_recipient_info.quote_sharee_number;
2145           l_quote_access_tbl(tbl_counter).email_contact_address := rec_get_recipient_info.email_address;
2146           l_quote_access_tbl(tbl_counter).shared_by_party_id  := rec_get_recipient_info.shared_by_party_id;
2147         END IF;
2148         EXIT when c_get_recipient_info%notfound;
2149       END LOOP;
2150     END LOOP;
2151   END IF;
2152   IF (IBE_UTIL.G_DEBUGON = l_true) THEN
2153     IBE_UTIL.DEBUG('STOP_SHARING:calling delete_recipient on the following recipients:');
2154   END IF;
2155   --dbms_output.put_line('STOP_SHARING:calling delete_recipient on the following recipients:');
2156   FOR i in 1.. l_quote_access_tbl.count LOOP
2157     IF (IBE_UTIL.G_DEBUGON = l_true) THEN
2158        IBE_UTIL.DEBUG('STOP_SHARING:calling delete_recipient');
2159        IBE_UTIL.DEBUG('STOP_SHARING:l_quote_access_tbl:'||i||':quote_sharee_id: '||l_quote_access_tbl(i).quote_sharee_id);
2160        IBE_UTIL.DEBUG('STOP_SHARING:l_quote_access_tbl:'||i||':contact_point_id: '||l_quote_access_tbl(i).contact_point_id);
2161        IBE_UTIL.DEBUG('STOP_SHARING:l_quote_access_tbl:'||i||':party_id: '||l_quote_access_tbl(i).party_id);
2162        IBE_UTIL.DEBUG('STOP_SHARING:l_quote_access_tbl:'||i||':cust_account_id: '||l_quote_access_tbl(i).cust_account_id);
2163     END IF;
2164     --dbms_output.put_line('STOP_SHARING:l_quote_access_tbl:'||i||':quote_sharee_id: '||l_quote_access_tbl(i).quote_sharee_id);
2165     --dbms_output.put_line('Calling delete recipient for the recipient record ');
2166     IBE_QUOTE_SAVESHARE_V2_PVT.DELETE_RECIPIENT(
2167             P_Quote_access_rec  => l_quote_access_tbl(i) ,
2168             p_minisite_id       => p_minisite_id         ,
2169             p_delete_code       => p_delete_context      ,
2170             p_notes             => p_notes               ,
2171             x_return_status     => x_return_status       ,
2172             x_msg_count         => x_msg_count           ,
2173             x_msg_data          => x_msg_data            );
2174 
2175       IF (x_return_status = FND_API.G_RET_STS_ERROR) THEN
2176         RAISE FND_API.G_EXC_ERROR;
2177       END IF;
2178       IF (x_return_status = FND_API.G_RET_STS_UNEXP_ERROR) THEN
2179         RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
2180       END IF;
2181 
2182   END LOOP;
2183   --This is to delete any new recipients who got added while we were trying to delete existing recipients.
2184   --This code is to handle issues arising out of concurrency among multiple admins of a shared cart
2185   tbl_counter := 1;
2186 
2187   FOR rec_get_recipients in c_get_recipients(p_quote_header_id) LOOP
2188     l_quote_access_tbl_tmp(tbl_counter).quote_sharee_id       := rec_get_recipients.quote_sharee_id;
2189     l_quote_access_tbl_tmp(tbl_counter).party_id              := rec_get_recipients.party_id;
2190     --dbms_output.put_line('found party_id:  '||rec_get_recipient_info.party_id);
2191     l_quote_access_tbl_tmp(tbl_counter).cust_account_id       := rec_get_recipients.cust_account_id;
2192     l_quote_access_tbl_tmp(tbl_counter).contact_point_id      := rec_get_recipients.contact_point_id;
2193     l_quote_access_tbl_tmp(tbl_counter).quote_header_id       := p_quote_header_id;
2194     l_quote_access_tbl_tmp(tbl_counter).quote_sharee_number   := rec_get_recipients.quote_sharee_number;
2195     l_quote_access_tbl_tmp(tbl_counter).email_contact_address := rec_get_recipients.email_address;
2196     l_quote_access_tbl_tmp(tbl_counter).shared_by_party_id    := rec_get_recipients.shared_by_party_id;
2197     l_quote_access_tbl_tmp(tbl_counter).notify_flag           := FND_API.G_FALSE;
2198     tbl_counter := tbl_counter+1;
2199     EXIT when c_get_recipients%notfound;
2200   END LOOP;
2201 
2202   FOR i in 1.. l_quote_access_tbl_tmp.count LOOP
2203     IF (IBE_UTIL.G_DEBUGON = l_true) THEN
2204        IBE_UTIL.DEBUG('STOP_SHARING: Concurrency part begins');
2205        IBE_UTIL.DEBUG('STOP_SHARING:l_quote_access_tbl:'||i||':quote_sharee_id: '||l_quote_access_tbl_tmp(i).quote_sharee_id);
2206        IBE_UTIL.DEBUG('STOP_SHARING:l_quote_access_tbl:'||i||':contact_point_id: '||l_quote_access_tbl_tmp(i).contact_point_id);
2207        IBE_UTIL.DEBUG('STOP_SHARING:l_quote_access_tbl:'||i||':party_id: '||l_quote_access_tbl_tmp(i).party_id);
2208        IBE_UTIL.DEBUG('STOP_SHARING:l_quote_access_tbl:'||i||':cust_account_id: '||l_quote_access_tbl_tmp(i).cust_account_id);
2209     END IF;
2210     --dbms_output.put_line('STOP_SHARING:l_quote_access_tbl:'||i||':quote_sharee_id: '||l_quote_access_tbl_tmp(i).quote_sharee_id);
2211     --dbms_output.put_line('Calling delete recipient for the recipient record ');
2212     IBE_QUOTE_SAVESHARE_V2_PVT.DELETE_RECIPIENT(
2213             P_Quote_access_rec  => l_quote_access_tbl_tmp(i) ,
2214             p_minisite_id       => p_minisite_id         ,
2215             p_delete_code       => p_delete_context      ,
2216             p_notes             => FND_API.G_MISS_CHAR   ,
2217             x_return_status     => x_return_status       ,
2218             x_msg_count         => x_msg_count           ,
2219             x_msg_data          => x_msg_data            );
2220 
2221       IF (x_return_status = FND_API.G_RET_STS_ERROR) THEN
2222         RAISE FND_API.G_EXC_ERROR;
2223       END IF;
2224       IF (x_return_status = FND_API.G_RET_STS_UNEXP_ERROR) THEN
2225         RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
2226       END IF;
2227   END LOOP;
2228   IF (IBE_UTIL.G_DEBUGON = l_true) THEN
2229     IBE_UTIL.DEBUG('STOP_SHARING: Concurrency part ends');
2230   END IF;
2231 
2232   IF (IBE_UTIL.G_DEBUGON = l_true) THEN
2233      IBE_UTIL.DEBUG('IBE_QUOTE_SAVESHARE_V2_PVT.STOP_SHARING: END');
2234   END IF;
2235 
2236 EXCEPTION
2237 
2238    WHEN FND_API.G_EXC_ERROR THEN
2239       ROLLBACK TO STOPSHARING_V2;
2240       x_return_status := FND_API.G_RET_STS_ERROR;
2241 	  FND_Msg_Pub.Count_And_Get(p_encoded => FND_API.G_FALSE,
2242                                 p_count   => x_msg_count    ,
2243                                 p_data    => x_msg_data);
2244       IF (IBE_UTIL.G_DEBUGON = l_true) THEN
2245          IBE_Util.Debug('Expected error in IBE_QUOTE_SAVESHARE_V2_PVT.STOPSHARING_V2');
2246       END IF;
2247 
2248    WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
2249       ROLLBACK TO STOPSHARING_V2;
2250       x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
2251 	  FND_Msg_Pub.Count_And_Get(p_encoded => FND_API.G_FALSE,
2252                                 p_count   => x_msg_count    ,
2253                                 p_data    => x_msg_data);
2254       IF (IBE_UTIL.G_DEBUGON = l_true) THEN
2255          IBE_Util.Debug('Unexpected error in  IBE_QUOTE_SAVESHARE_V2_PVT.STOPSHARING_V2');
2256       END IF;
2257 
2258    WHEN OTHERS THEN
2259       ROLLBACK TO STOPSHARING_V2;
2260       x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
2261 	  IF FND_Msg_Pub.Check_Msg_Level(FND_Msg_Pub.G_MSG_LVL_UNEXP_ERROR) THEN
2262          FND_Msg_Pub.Add_Exc_Msg(G_PKG_NAME,
2263                                  l_api_name);
2264       END IF;
2265       FND_Msg_Pub.Count_And_Get(p_encoded => FND_API.G_FALSE,
2266                                 p_count   => x_msg_count    ,
2267                                 p_data    => x_msg_data);
2268       IF (IBE_UTIL.G_DEBUGON = l_true) THEN
2269          IBE_Util.Debug('Unknown error in IBE_QUOTE_SAVESHARE_V2_PVT.STOPSHARING_V2');
2270       END IF;
2271 
2272 END;
2273 
2274 /*To handle the specific removing of a recipients from one cartId
2275 *Usages:
2276 -"End Working" button
2277 */
2278 Procedure end_working (
2279     p_quote_access_tbl  IN  IBE_QUOTE_SAVESHARE_pvt.QUOTE_ACCESS_Tbl_Type
2280                             := IBE_QUOTE_SAVESHARE_pvt.G_miss_quote_access_Tbl ,
2281     P_Quote_header_id   IN  Number                                           ,
2282     P_Party_id          IN  Number         := FND_API.G_MISS_NUM             ,
2283     P_Cust_account_id   IN  Number         := FND_API.G_MISS_NUM             ,
2284     p_retrieval_number  IN  Number         := FND_API.G_MISS_NUM             ,
2285     P_URL               IN  Varchar2       := FND_API.G_MISS_CHAR            ,
2286     P_minisite_id       IN  Number         := FND_API.G_MISS_NUM             ,
2287     p_notes             IN  Varchar2       := FND_API.G_MISS_CHAR            ,
2288     p_api_version       IN  NUMBER         := 1                              ,
2289     p_init_msg_list     IN  VARCHAR2       := FND_API.G_TRUE                 ,
2290     p_commit            IN  VARCHAR2       := FND_API.G_FALSE                ,
2291     x_return_status     OUT NOCOPY VARCHAR2                                  ,
2292     x_msg_count         OUT NOCOPY NUMBER                                    ,
2293     x_msg_data          OUT NOCOPY VARCHAR2                                  ) is
2294 
2295     l_api_name         CONSTANT VARCHAR2(30)   := 'ENDWORKING_V2';
2296     l_api_version      CONSTANT NUMBER         := 1.0;
2297     l_recip_id         NUMBER;
2298     l_initiator_id     NUMBER;
2299     l_quote_access_tbl IBE_QUOTE_SAVESHARE_pvt.QUOTE_ACCESS_Tbl_Type
2300                        := IBE_QUOTE_SAVESHARE_pvt.G_miss_quote_access_Tbl;
2301     END_WORKING              NUMBER := 4;
2302 
2303     CURSOR c_get_recip_id(c_retrieval_num   NUMBER,
2304                           c_party_id        NUMBER,
2305                           c_cust_account_id NUMBER,
2306                           c_quote_header_id NUMBER) is
2307       SELECT quote_sharee_id, quote_header_id
2308       FROM IBE_SH_QUOTE_ACCESS
2309       WHERE quote_sharee_number = c_retrieval_num
2310       OR (party_id = c_party_id and cust_account_id = c_cust_account_id)
2311       AND quote_header_id = c_quote_header_id
2312       AND nvl(end_date_active, sysdate+1) > sysdate;
2313 
2314     rec_get_recip_id   c_get_recip_id%rowtype;
2315     l_quote_access_rec       IBE_QUOTE_SAVESHARE_pvt.QUOTE_ACCESS_REC_TYPE
2316                              := IBE_QUOTE_SAVESHARE_pvt.G_MISS_QUOTE_ACCESS_REC;
2317     l_quote_access_rec_recip IBE_QUOTE_SAVESHARE_pvt.QUOTE_ACCESS_REC_TYPE
2318                              := IBE_QUOTE_SAVESHARE_pvt.G_MISS_QUOTE_ACCESS_REC;
2319 
2320    cursor c_get_recipient_party(c_recipient_id NUMBER) is
2321      SELECT party_id,
2322             quote_sharee_number,
2323             quote_header_id,
2324             update_privilege_type_code,
2325             contact_point_id
2326      FROM ibe_sh_quote_access
2327      where quote_sharee_id = c_recipient_id;
2328 
2329    rec_get_recipient_party c_get_recipient_party%rowtype;
2330 
2331 BEGIN
2332   SAVEPOINT  ENDWORKING_V2;
2333   -- Standard call to check for call compatibility.
2334   IF NOT FND_API.Compatible_API_Call (	l_api_version,
2335                              			P_Api_Version,
2336                                    		l_api_name,
2337                        					G_PKG_NAME )
2338   THEN
2339       RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
2340   END IF;
2341    -- Initialize message list IF p_init_msg_list is set to TRUE.
2342   IF FND_API.to_Boolean( p_init_msg_list ) THEN
2343       FND_MSG_PUB.initialize;
2344   END IF;
2345 
2346    --  Initialize API return status to success
2347   x_return_status := FND_API.G_RET_STS_SUCCESS;
2348 -----------------------------------------------------------------------------------------
2349 --API Body start
2350 -----------------------------------------------------------------------------------------
2351 --  l_quote_access_rec := p_quote_access_rec;
2352   FOR rec_userenv_partyid in c_userenv_partyid LOOP
2353     l_initiator_id  := rec_userenv_partyid.customer_id;
2354     EXIT when c_userenv_partyid%notfound;
2355   END LOOP;
2356 
2357   IF (IBE_UTIL.G_DEBUGON = l_true) THEN
2358      IBE_UTIL.DEBUG('IBE_QUOTE_SAVESHARE_V2_PVT.END_WORKING: START');
2359   END IF;
2360   --DBMS_OUTPUT.PUT_LINE('IBE_QUOTE_SAVESHARE_V2_PVT.END_WORKING: START');
2361   IF (IBE_UTIL.G_DEBUGON = l_true) THEN
2362      IBE_UTIL.DEBUG('Opening cursor to retrieve the recipient_id');
2363   END IF;
2364   --DBMS_OUTPUT.PUT_LINE('Opening cursor to retrieve the recipient_id');
2365   --DBMS_OUTPUT.PUT_LINE('p_quote_access_rec.quote_sharee_number: '||p_quote_access_rec.quote_sharee_number);
2366   --DBMS_OUTPUT.PUT_LINE('p_quote_access_rec.party_id: '||p_quote_access_rec.party_id);
2367   --DBMS_OUTPUT.PUT_LINE('p_quote_access_rec.cust_account_id: '||p_quote_access_rec.cust_account_id);
2368   --DBMS_OUTPUT.PUT_LINE('p_quote_access_rec.quote_header_id: '||p_quote_access_rec.quote_header_id);
2369 
2370   l_quote_access_tbl:= p_quote_access_tbl;
2371   FOR rec_get_recip_id in c_get_recip_id(p_retrieval_number,
2372                                          p_party_id,
2373                                          p_cust_account_id,
2374                                          p_quote_header_id) LOOP
2375     l_quote_access_rec.quote_sharee_id     := rec_get_recip_id.quote_sharee_id;
2376     l_quote_access_rec.quote_sharee_number := p_retrieval_number;
2377     l_quote_access_rec.party_id            := p_party_id;
2378     l_quote_access_rec.cust_account_id     := p_cust_account_id;
2379     l_quote_access_rec.quote_header_id     := rec_get_recip_id.quote_header_id;
2380     EXIT WHEN c_get_recip_id%NOTFOUND;
2381   END LOOP;
2382   IF (IBE_UTIL.G_DEBUGON = l_true) THEN
2383      IBE_UTIL.DEBUG('Recipient id obtained is: '||l_quote_access_rec.quote_sharee_id);
2384   END IF;
2385 
2386 --DBMS_OUTPUT.PUT_LINE('Recipient id obtained is: '||l_quote_access_rec.quote_sharee_id);
2387   IBE_QUOTE_SAVESHARE_V2_PVT.DELETE_RECIPIENT(
2388         P_Quote_access_rec  => l_quote_access_rec ,
2389         p_minisite_id       => p_minisite_id      ,
2390         p_delete_code       => 'END_WORKING'      ,
2391         p_url               => p_url              ,
2392         p_notes             => p_notes            ,
2393         x_return_status     => x_return_status    ,
2394         x_msg_count         => x_msg_count        ,
2395         x_msg_data          => x_msg_data         );
2396 
2397       IF (x_return_status = FND_API.G_RET_STS_ERROR) THEN
2398         RAISE FND_API.G_EXC_ERROR;
2399       END IF;
2400       IF (x_return_status = FND_API.G_RET_STS_UNEXP_ERROR) THEN
2401         RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
2402       END IF;
2403 
2404   FOR counter in 1..p_quote_access_tbl.count LOOP
2405     IF ((l_quote_access_tbl(counter).notify_flag = FND_API.G_TRUE) AND
2406          (l_quote_access_rec.quote_sharee_id <> l_quote_access_tbl(counter).quote_sharee_id)) THEN
2407 
2408       FOR rec_get_recipient_party in c_get_recipient_party(p_quote_access_tbl(counter).quote_sharee_id) LOOP
2409         l_quote_access_rec_recip.party_id                   := rec_get_recipient_party.party_id;
2410         l_quote_access_rec_recip.quote_sharee_number        := rec_get_recipient_party.quote_sharee_number;
2411         l_quote_access_rec_recip.quote_header_id            := rec_get_recipient_party.quote_header_id;
2412         l_quote_access_rec_recip.update_privilege_type_code := rec_get_recipient_party.update_privilege_type_code;
2413         -- As part of bug fix 3349991 getting contact_point_id to the notification api.
2414         l_quote_access_rec_recip.contact_point_id := rec_get_recipient_party.contact_point_id;
2415         EXIT when c_get_recipient_party%NOTFOUND;
2416       END LOOP;
2417 
2418       -- Assign the quote_sharee_id to l_quote_access_rec (value needed in the notification api,3349991)
2419       l_quote_access_rec_recip.quote_sharee_id := p_quote_access_tbl(counter).quote_sharee_id;
2420 
2421      IF (IBE_UTIL.G_DEBUGON = l_true) THEN
2422         IBE_UTIL.DEBUG('IBE_QUOTE_SAVESHARE_V2_PVT.END_WORKING: Ready to call view shared cart');
2423         IBE_UTIL.DEBUG('IBE_QUOTE_SAVESHARE_V2_PVT.END_WORKING:initiator_party_id: '||l_initiator_id);
2424         IBE_UTIL.DEBUG('IBE_QUOTE_SAVESHARE_V2_PVT.END_WORKING:recipient party_id: '||l_quote_access_rec_recip.party_id);
2425         IBE_UTIL.DEBUG('IBE_QUOTE_SAVESHARE_V2_PVT.END_WORKING:recipient number: '||l_quote_access_rec_recip.quote_sharee_number);
2426         IBE_UTIL.DEBUG('IBE_QUOTE_SAVESHARE_V2_PVT.END_WORKING:recipient id: '||l_quote_access_rec_recip.quote_sharee_id);
2427         IBE_UTIL.DEBUG('IBE_QUOTE_SAVESHARE_V2_PVT.END_WORKING:contact_point_id: '||l_quote_access_rec_recip.contact_point_id);
2428       END IF;
2429 
2430       IBE_WORKFLOW_PVT.Notify_view_shared_cart(
2431           p_api_version       => p_api_version
2432           ,p_init_msg_list    => p_init_msg_list
2433           ,p_quote_access_rec => l_quote_access_rec_recip
2434           ,p_minisite_id      => p_minisite_id
2435           ,p_url              => p_url
2436           ,p_notes            => p_notes
2437           ,p_sent_by_party_id => l_initiator_id
2438           ,x_return_status    => x_return_status
2439           ,x_msg_count        => x_msg_count
2440           ,x_msg_data         => x_msg_data         );
2441         IF (x_return_status = FND_API.G_RET_STS_ERROR) THEN
2442           RAISE FND_API.G_EXC_ERROR;
2443         END IF;
2444         IF (x_return_status = FND_API.G_RET_STS_UNEXP_ERROR) THEN
2445           RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
2446         END IF;
2447     END IF;
2448   END LOOP;
2449 
2450   IF (IBE_UTIL.G_DEBUGON = l_true) THEN
2451      IBE_UTIL.DEBUG('IBE_QUOTE_SAVESHARE_V2_PVT.END_WORKING: END');
2452   END IF;
2453   --DBMS_OUTPUT.PUT_LINE('IBE_QUOTE_SAVESHARE_V2_PVT.END_WORKING: END ');
2454 EXCEPTION
2455    WHEN FND_API.G_EXC_ERROR THEN
2456       ROLLBACK TO ENDWORKING_V2;
2457       x_return_status := FND_API.G_RET_STS_ERROR;
2458 	  FND_Msg_Pub.Count_And_Get(p_encoded => FND_API.G_FALSE,
2459                                 p_count   => x_msg_count    ,
2460                                 p_data    => x_msg_data);
2461       IF (IBE_UTIL.G_DEBUGON = l_true) THEN
2462          IBE_Util.Debug('Expected error in IBE_QUOTE_SAVESHARE_V2_PVT.ENDWORKING');
2463       END IF;
2464 
2465    WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
2466       ROLLBACK TO ENDWORKING_V2;
2467       x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
2468 	  FND_Msg_Pub.Count_And_Get(p_encoded => FND_API.G_FALSE,
2469                                 p_count   => x_msg_count    ,
2470                                 p_data    => x_msg_data);
2471       IF (IBE_UTIL.G_DEBUGON = l_true) THEN
2472          IBE_Util.Debug('Unexpected error in IBE_QUOTE_SAVESHARE_V2_PVT.ENDWORKING)');
2473       END IF;
2474 
2475    WHEN OTHERS THEN
2476       ROLLBACK TO ENDWORKING_V2;
2477       x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
2478 	  IF FND_Msg_Pub.Check_Msg_Level(FND_Msg_Pub.G_MSG_LVL_UNEXP_ERROR) THEN
2479          FND_Msg_Pub.Add_Exc_Msg(G_PKG_NAME,
2480                                  l_api_name);
2481       END IF;
2482       FND_Msg_Pub.Count_And_Get(p_encoded => FND_API.G_FALSE,
2483                                 p_count   => x_msg_count    ,
2484                                 p_data    => x_msg_data);
2485       IF (IBE_UTIL.G_DEBUGON = l_true) THEN
2486          IBE_Util.Debug('Unknown error in IBE_QUOTE_SAVESHARE_V2_PVT.ENDWORKING');
2487       END IF;
2488 
2489 
2490 END;
2491 /*updates all recipients' access levels to readonly
2492 *Usages:
2493 -Status changes from "cart" to"quote" - request sales assistance, contract cart
2494 */
2495 Procedure share_readonly  (
2496     p_quote_header_id  IN  Number                      ,
2497     P_minisite_id      IN  Number := FND_API.G_MISS_NUM,
2498     p_url              IN  Varchar2 := FND_API.G_MISS_CHAR,
2499     p_api_version      IN  NUMBER   := 1               ,
2500     p_init_msg_list    IN  VARCHAR2 := FND_API.G_TRUE  ,
2501     p_commit           IN  VARCHAR2 := FND_API.G_FALSE ,
2502     x_return_status    OUT NOCOPY VARCHAR2             ,
2503     x_msg_count        OUT NOCOPY NUMBER               ,
2504     x_msg_data         OUT NOCOPY VARCHAR2             ) is
2505 
2506   l_api_name         CONSTANT VARCHAR2(30)   := 'SHAREREADONLY_V2';
2507   l_api_version      CONSTANT NUMBER         := 1.0;
2508   tbl_counter        NUMBER                  := 1;
2509   l_initiator_id     NUMBER;
2510 
2511   l_quote_access_tbl IBE_QUOTE_SAVESHARE_pvt.QUOTE_ACCESS_Tbl_Type
2512                      := IBE_QUOTE_SAVESHARE_pvt.g_miss_quote_access_tbl;
2513 
2514   cursor c_get_recipients(c_qte_hdr_id NUMBER) is
2515     select quote_sharee_id,
2516            party_id,
2517            cust_account_id,
2518            quote_header_id
2519     from IBE_SH_QUOTE_ACCESS
2520     where quote_header_id = c_qte_hdr_id
2521     and nvl(end_date_active,sysdate+1) > sysdate;
2522 
2523   rec_get_recipients c_get_recipients%rowtype;
2524 
2525 BEGIN
2526 
2527   SAVEPOINT  SHAREREADONLY_V2;
2528   -- Standard call to check for call compatibility.
2529   IF NOT FND_API.Compatible_API_Call (	l_api_version,
2530                              			P_Api_Version,
2531                                    		l_api_name,
2532                        					G_PKG_NAME )
2533   THEN
2534       RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
2535   END IF;
2536    -- Initialize message list IF p_init_msg_list is set to TRUE.
2537   IF FND_API.to_Boolean( p_init_msg_list ) THEN
2538       FND_MSG_PUB.initialize;
2539   END IF;
2540 
2541    --  Initialize API return status to success
2542   x_return_status := FND_API.G_RET_STS_SUCCESS;
2543 -------------------------------------------------------------------------------------------------------------
2544 --API Body start
2545 -------------------------------------------------------------------------------------------------------------
2546 
2547   IF (IBE_UTIL.G_DEBUGON = l_true) THEN
2548     IBE_UTIL.DEBUG('IBE_QUOTE_SAVESHARE_V2_PVT.SHARE_READONLY: START');
2549     IBE_UTIL.DEBUG('IBE_QUOTE_SAVESHARE_V2_PVT.SHARE_READONLY:quote_header_id: '||p_quote_header_id);
2550     IBE_UTIL.DEBUG('IBE_QUOTE_SAVESHARE_V2_PVT.SHARE_READONLY: Querying initiator party id');
2551   END IF;
2552 
2553   FOR rec_userenv_partyid in c_userenv_partyid LOOP
2554     l_initiator_id := rec_userenv_partyid.customer_id;
2555     EXIT when c_userenv_partyid%notfound;
2556   END LOOP;
2557 
2558   IF (IBE_UTIL.G_DEBUGON = l_true) THEN
2559     IBE_UTIL.DEBUG('Building quote access table');
2560   END IF;
2561 
2562   FOR rec_get_recipients in c_get_recipients(p_quote_header_id) LOOP
2563 
2564     --Omitting the initiator's details as initiator is not required to get the notification
2565     IF (l_initiator_id <> nvl(rec_get_recipients.party_id,-1) ) THEN
2566       l_quote_access_tbl(tbl_counter).quote_sharee_id            := rec_get_recipients.quote_sharee_id;
2567 
2568       IF (IBE_UTIL.G_DEBUGON = l_true) THEN
2569         IBE_UTIL.DEBUG('Added sharee quote_sharee_id: '||rec_get_recipients.quote_sharee_id);
2570       END IF;
2571 
2572       l_quote_access_tbl(tbl_counter).update_privilege_type_code := 'R';
2573       l_quote_access_tbl(tbl_counter).party_id                   := rec_get_recipients.party_id;
2574       l_quote_access_tbl(tbl_counter).cust_account_id            := rec_get_recipients.cust_account_id;
2575       l_quote_access_tbl(tbl_counter).quote_header_id            := rec_get_recipients.quote_header_id;
2576       l_quote_access_tbl(tbl_counter).operation_code             := 'UPDATE';
2577       tbl_counter := tbl_counter+1;
2578     END IF;
2579     EXIT when c_get_recipients%notfound;
2580   END LOOP;
2581   IF (IBE_UTIL.G_DEBUGON = l_true) THEN
2582      IBE_UTIL.DEBUG('Done building quote access table');
2583   END IF;
2584 
2585   IF (IBE_UTIL.G_DEBUGON = l_true) THEN
2586      IBE_UTIL.DEBUG('Calling save_recipients to update recipient access level');
2587   END IF;
2588   IBE_QUOTE_SAVESHARE_V2_PVT.save_recipients(
2589       P_Quote_access_tbl => l_quote_access_tbl ,
2590       P_Quote_header_id  => P_Quote_header_id  ,
2591       P_minisite_id      => p_minisite_id      ,
2592       p_url              => p_url              ,
2593       p_api_version      => p_api_version      ,
2594       p_init_msg_list    => fnd_api.g_false    ,
2595       p_commit           => fnd_api.g_false    ,
2596       x_return_status    => x_return_status    ,
2597       x_msg_count        => x_msg_count        ,
2598       x_msg_data         => x_msg_data         );
2599 
2600   IF (IBE_UTIL.G_DEBUGON = l_true) THEN
2601      IBE_UTIL.DEBUG('Done calling save_recipients to update recipient access level');
2602      IBE_UTIL.DEBUG('IBE_QUOTE_SAVESHARE_V2_PVT.SHARE_READONLY: END');
2603   END IF;
2604 
2605 EXCEPTION
2606 
2607    WHEN FND_API.G_EXC_ERROR THEN
2608       ROLLBACK TO STOPSHARING_V2;
2609       x_return_status := FND_API.G_RET_STS_ERROR;
2610 	  FND_Msg_Pub.Count_And_Get(p_encoded => FND_API.G_FALSE,
2611                                 p_count   => x_msg_count    ,
2612                                 p_data    => x_msg_data);
2613       IF (IBE_UTIL.G_DEBUGON = l_true) THEN
2614          IBE_Util.Debug('Expected error in IBE_QUOTE_SAVESHARE_V2_PVT.SHAREREADONLY_V2');
2615       END IF;
2616 
2617    WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
2618       ROLLBACK TO STOPSHARING_V2;
2619       x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
2620 	  FND_Msg_Pub.Count_And_Get(p_encoded => FND_API.G_FALSE,
2621                                 p_count   => x_msg_count    ,
2622                                 p_data    => x_msg_data);
2623       IF (IBE_UTIL.G_DEBUGON = l_true) THEN
2624          IBE_Util.Debug('Unexpected error in IBE_QUOTE_SAVESHARE_V2_PVT.SHAREREADONLY_V2');
2625       END IF;
2626 
2627    WHEN OTHERS THEN
2628       ROLLBACK TO STOPSHARING_V2;
2629       x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
2630 	  IF FND_Msg_Pub.Check_Msg_Level(FND_Msg_Pub.G_MSG_LVL_UNEXP_ERROR) THEN
2631          FND_Msg_Pub.Add_Exc_Msg(G_PKG_NAME,
2632                                  l_api_name);
2633       END IF;
2634       FND_Msg_Pub.Count_And_Get(p_encoded => FND_API.G_FALSE,
2635                                 p_count   => x_msg_count    ,
2636                                 p_data    => x_msg_data);
2637       IF (IBE_UTIL.G_DEBUGON = l_true) THEN
2638          IBE_Util.Debug('Unknown error in IBE_QUOTE_SAVESHARE_V2_PVT.SHAREREADONLY_V2');
2639       END IF;
2640 END;
2641 
2642 /*To delete a recipient (a sort of wrapper around the "raw" delete table hander)
2643 *Usages:
2644 -To remove a recipient from the list of persons to whom a cart is shared.
2645 -All deletes for a recipient should be done using this api.
2646 -As of IBE.P - p_quote_access_rec must have the shared_by_party_id set
2647 */
2648 Procedure DELETE_RECIPIENT  (
2649     P_Quote_access_rec  IN  IBE_QUOTE_SAVESHARE_pvt.QUOTE_ACCESS_REC_TYPE
2650                             := IBE_QUOTE_SAVESHARE_pvt.G_MISS_QUOTE_ACCESS_REC ,
2651     P_minisite_id       IN  NUMBER                                             ,
2652     p_delete_code       IN  VARCHAR2 := 'IBE_SC_CART_STOPSHARING'            ,
2653     p_url               IN  VARCHAR2 := FND_API.G_MISS_CHAR                    ,
2654     p_notes             IN  VARCHAR2 := FND_API.G_MISS_CHAR                    ,
2655     p_api_version       IN  NUMBER   := 1                                      ,
2656     p_init_msg_list     IN  VARCHAR2 := FND_API.G_TRUE                         ,
2657     p_commit            IN  VARCHAR2 := FND_API.G_FALSE                        ,
2658     x_return_status     OUT NOCOPY VARCHAR2                                    ,
2659     x_msg_count         OUT NOCOPY NUMBER                                      ,
2660     x_msg_data          OUT NOCOPY VARCHAR2                                    ) is
2661 
2662     l_api_name         CONSTANT VARCHAR2(30)   := 'DELETERECIPIENT_V2';
2663     l_api_version      CONSTANT NUMBER         := 1.0;
2664     l_url                     VARCHAR2(2000);
2665     l_owner_partyid           NUMBER;
2666     l_owner_accountid         NUMBER;
2667     l_contact_point_rec     HZ_CONTACT_POINT_V2PUB.CONTACT_POINT_REC_TYPE;
2668     l_party_id              NUMBER;
2669     l_contact_point_id      NUMBER;
2670     l_object_version_number NUMBER;
2671 
2672 
2673 /* Fixed the query for the bug 4860734 */
2674      cursor c_find_active_cart is
2675        select a.quote_header_id, a.party_id ,a.cust_account_id
2676        from   IBE_ACTIVE_QUOTES a, ibe_sh_quote_access b
2677        where a.party_id = b.party_id
2678        and a.cust_account_id = b.cust_account_id
2679        and b.quote_sharee_id = P_Quote_access_rec.quote_sharee_id
2680        and nvl(b.end_date_active, sysdate+1) > sysdate
2681        and a.quote_header_id = p_quote_access_rec.quote_header_id
2682        and record_type= 'CART';
2683 
2684     cursor c_get_owner_ids(c_quote_id number) is
2685       select party_id, cust_account_id
2686       from ASO_QUOTE_HEADERS_ALL
2687       where quote_header_id = c_quote_id;
2688 
2689     cursor c_get_contact_point_ovn(c_quote_sharee_id Number) IS
2690       select QUOTE_ACCESS.party_id, CNTCT_POINTS.contact_point_id, CNTCT_POINTS.object_version_number
2691       from  hz_contact_points CNTCT_POINTS, ibe_sh_quote_access QUOTE_ACCESS
2692       where CNTCT_POINTS.contact_point_id  = QUOTE_ACCESS.contact_point_id
2693         and quote_sharee_id = c_quote_sharee_id;
2694 
2695     rec_find_active_cart c_find_active_cart%rowtype;
2696     rec_get_owner_ids c_get_owner_ids%rowtype;
2697 
2698     l_delete_context     VARCHAR2(2000);
2699     l_shared_by_party_id  NUMBER;
2700 
2701 BEGIN
2702 
2703   SAVEPOINT  DELETERECIPIENT_V2;
2704   -- Standard call to check for call compatibility.
2705   IF NOT FND_API.Compatible_API_Call (	l_api_version,
2706                              			P_Api_Version,
2707                                    		l_api_name,
2708                        					G_PKG_NAME )
2709   THEN
2710       RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
2711   END IF;
2712    -- Initialize message list IF p_init_msg_list is set to TRUE.
2713   IF FND_API.to_Boolean( p_init_msg_list ) THEN
2714       FND_MSG_PUB.initialize;
2715   END IF;
2716 
2717    --  Initialize API return status to success
2718   x_return_status := FND_API.G_RET_STS_SUCCESS;
2719 -------------------------------------------------------------------------------------------------------------
2720 --API Body start
2721 -------------------------------------------------------------------------------------------------------------
2722 
2723   IF (IBE_UTIL.G_DEBUGON = l_true) THEN
2724      IBE_UTIL.DEBUG('IBE_QUOTE_SAVESHARE_V2_PVT.DELETE_RECIPIENT: START');
2725   END IF;
2726   FOR rec_find_active_cart in c_find_active_cart loop
2727     IF(rec_find_active_cart.quote_header_id is not null) THEN
2728     IF (IBE_UTIL.G_DEBUGON = l_true) THEN
2729        IBE_UTIL.DEBUG('IBE_QUOTE_SAVESHARE_V2_PVT.DELETE_RECIPIENT:user has an active cart');
2730        IBE_UTIL.DEBUG('Calling update row handler to deactivate the cart');
2731     END IF;
2732     --DBMS_OUTPUT.PUT_LINE('IBE_QUOTE_SAVESHARE_V2_PVT.DELETE_RECIPIENT:user has an active cart');
2733 
2734     IBE_ACTIVE_QUOTES_ALL_PKG.UPDATE_ROW(
2735            X_OBJECT_VERSION_NUMBER => 1                                   ,
2736            X_QUOTE_HEADER_ID       => null                                ,
2737            X_PARTY_ID              => rec_find_active_cart.party_id       ,
2738            X_CUST_ACCOUNT_ID       => rec_find_active_cart.cust_account_id,
2739            X_RECORD_TYPE           => 'CART'                             ,
2740            X_CURRENCY_CODE         => null                                ,
2741            x_last_update_date      => sysdate                             ,
2742            x_last_updated_by       => fnd_global.user_id                  ,
2743            x_last_update_login     => 1);
2744     IF (IBE_UTIL.G_DEBUGON = l_true) THEN
2745        IBE_UTIL.DEBUG('Done calling update row handler to deactivate the cart');
2746     END IF;
2747     END IF;
2748     EXIT WHEN c_find_active_cart%NOTFOUND;
2749   END LOOP;
2750   IF (IBE_UTIL.G_DEBUGON = l_true) THEN
2751      IBE_UTIL.DEBUG('Calling Update row handler on sh_quote_access table to end-date recipient row');
2752   END IF;
2753   --DBMS_OUTPUT.PUT_LINE('Calling Update row handler on sh_quote_access table to end-date recipient row');
2754 
2755   open c_get_contact_point_ovn(P_Quote_access_rec.quote_sharee_id);
2756   fetch c_get_contact_point_ovn into l_party_id, l_contact_point_id, l_object_version_number;
2757 
2758   if(l_party_id is NULL) THEN
2759      l_contact_point_rec.contact_point_id := l_contact_point_id;
2760      l_contact_point_rec.status := 'I';
2761      l_contact_point_rec.primary_flag := 'N';
2762      HZ_CONTACT_POINT_V2PUB.update_contact_point(
2763         			p_init_msg_list	     	=>  FND_API.G_FALSE,
2764 				    p_contact_point_rec  	=>  l_contact_point_rec,
2765 				    p_object_version_number =>  l_object_version_number,
2766 				    x_return_status		    =>  x_return_status,
2767 				    x_msg_count		        =>  x_msg_count,
2768      				x_msg_data		        =>  x_msg_data);
2769 
2770      IF x_return_status <> FND_API.G_RET_STS_SUCCESS THEN
2771          RAISE FND_API.G_EXC_ERROR;
2772      END IF;
2773   END IF;
2774 
2775   IBE_SH_QUOTE_ACCESS_PKG.update_Row(
2776                      p_quote_sharee_id   => P_Quote_access_rec.quote_sharee_id
2777                      ,p_end_date_active  => sysdate);
2778   IF (IBE_UTIL.G_DEBUGON = l_true) THEN
2779     IBE_UTIL.DEBUG('Done calling Update row handler on sh_quote_access table to end-date recipient row');
2780   END IF;
2781   IF (IBE_UTIL.G_DEBUGON = l_true) THEN
2782     IBE_UTIL.DEBUG('IBE_QUOTE_SAVESHARE_V2_PVT.DELETE_RECIPIENT: END');
2783     IBE_UTIL.DEBUG('delete_code is: '||p_delete_code);
2784   END IF;
2785 
2786   IF (p_quote_access_rec.notify_flag = FND_API.G_TRUE) THEN
2787     --Notify_finish_sharing API with the appropriate delete_code
2788     IF (p_delete_code = 'END_WORKING') THEN
2789       /*obtain the owner party_id and acctid of the cart/quote being dealt with*/
2790       FOR rec_get_owner_ids in c_get_owner_ids(p_quote_access_rec.quote_header_id) LOOP
2791         l_owner_partyid := rec_get_owner_ids.party_id;
2792         l_owner_accountid := rec_get_owner_ids.cust_account_id;
2793         EXIT when c_get_owner_ids%notfound;
2794       END LOOP;
2795 
2796       -- notification that goes to the owner (so and so has finished working this cart)
2797       -- for generic email to owner, we need to add some special parameters since we will not have a retrieval number
2798       l_url := p_url || '&opid=' || l_owner_partyid || '&oaid=' || l_owner_accountid;
2799       IF (IBE_UTIL.G_DEBUGON = l_true) THEN
2800         IBE_UTIL.DEBUG('url for generic email to OWNER: '||l_url);
2801       END IF;
2802 
2803       IF (IBE_UTIL.G_DEBUGON = l_true) THEN
2804         IBE_UTIL.DEBUG('Calling notify_end_working API');
2805       END IF;
2806       IBE_WORKFLOW_PVT.Notify_End_Working(
2807         p_api_version      => p_api_version                         ,
2808         p_init_msg_list    => p_init_msg_list                       ,
2809         p_quote_header_id  => p_quote_access_rec.quote_header_id    ,
2810         p_party_id         => p_quote_access_rec.party_id           ,
2811         p_Cust_Account_Id  => p_quote_access_rec.cust_account_id    ,
2812         p_retrieval_number => p_quote_access_rec.quote_sharee_number,
2813         p_minisite_id      => p_minisite_id                         ,
2814         p_url              => l_url                                 ,
2815         p_notes            => p_notes                               ,
2816         x_return_status    => x_return_status                       ,
2817         x_msg_count        => x_msg_count                           ,
2818         x_msg_data         => x_msg_data                            );
2819 
2820          IF (x_return_status = FND_API.G_RET_STS_ERROR) THEN
2821            RAISE FND_API.G_EXC_ERROR;
2822          END IF;
2823          IF (x_return_status = FND_API.G_RET_STS_UNEXP_ERROR) THEN
2824            RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
2825          END IF;
2826       IF (IBE_UTIL.G_DEBUGON = l_true) THEN
2827         IBE_UTIL.DEBUG('Done calling notify_end_working API');
2828       END IF;
2829     ELSE
2830       IF (IBE_UTIL.G_DEBUGON = l_true) THEN
2831         IBE_UTIL.DEBUG('Calling notify_finish_sharing API');
2832       END IF;
2833       --DBMS_OUTPUT.PUT_LINE('Calling notify_stop_sharing API ');
2834       -- notification that goes to the member (you no longer have access to this cart)
2835       IBE_WORKFLOW_PVT.Notify_Finish_Sharing(
2836          p_api_version      => p_api_version      ,
2837          p_init_msg_list    => p_init_msg_list    ,
2838          p_quote_access_rec => p_quote_access_rec ,  --of the recepient
2839          p_minisite_id      => p_minisite_id      ,
2840          p_url              => p_url              ,
2841          p_context_code     => p_delete_code      ,
2842          p_shared_by_partyid=> p_quote_access_rec.shared_by_party_id,
2843          p_notes            => p_notes            ,
2844          x_return_status    => x_return_status    ,
2845          x_msg_count        => x_msg_count        ,
2846          x_msg_data         => x_msg_data         );
2847 
2848          IF (x_return_status = FND_API.G_RET_STS_ERROR) THEN
2849            RAISE FND_API.G_EXC_ERROR;
2850          END IF;
2851          IF (x_return_status = FND_API.G_RET_STS_UNEXP_ERROR) THEN
2852            RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
2853          END IF;
2854       IF (IBE_UTIL.G_DEBUGON = l_true) THEN
2855         IBE_UTIL.DEBUG('Done calling notify_finish_sharing API');
2856       END IF;
2857     END IF; --end working or finish sharing
2858   END IF; --IF notify_flag is true
2859 
2860 EXCEPTION
2861    WHEN FND_API.G_EXC_ERROR THEN
2862       ROLLBACK TO DELETERECIPIENT_V2;
2863       x_return_status := FND_API.G_RET_STS_ERROR;
2864 	  FND_Msg_Pub.Count_And_Get(p_encoded => FND_API.G_FALSE,
2865                                 p_count   => x_msg_count    ,
2866                                 p_data    => x_msg_data);
2867       IF (IBE_UTIL.G_DEBUGON = l_true) THEN
2868          IBE_Util.Debug('Expected error in IBE_QUOTE_SAVESHARE_V2_PVT.DELETE_RECIPIENT()');
2869       END IF;
2870 
2871    WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
2872       ROLLBACK TO DELETERECIPIENT_V2;
2873       x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
2874 	  FND_Msg_Pub.Count_And_Get(p_encoded => FND_API.G_FALSE,
2875                                 p_count   => x_msg_count    ,
2876                                 p_data    => x_msg_data);
2877       IF (IBE_UTIL.G_DEBUGON = l_true) THEN
2878          IBE_Util.Debug('Unexpected error in IBE_QUOTE_SAVESHARE_V2_PVT.DELETE_RECIPIENT()');
2879       END IF;
2880 
2881    WHEN OTHERS THEN
2882       ROLLBACK TO DELETERECIPIENT_V2;
2883       x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
2884 	  IF FND_Msg_Pub.Check_Msg_Level(FND_Msg_Pub.G_MSG_LVL_UNEXP_ERROR) THEN
2885          FND_Msg_Pub.Add_Exc_Msg(G_PKG_NAME,
2886                                  l_api_name);
2887       END IF;
2888       FND_Msg_Pub.Count_And_Get(p_encoded => FND_API.G_FALSE,
2889                                 p_count   => x_msg_count    ,
2890                                 p_data    => x_msg_data);
2891       IF (IBE_UTIL.G_DEBUGON = l_true) THEN
2892          IBE_Util.Debug('Unknown error in IBE_QUOTE_SAVESHARE_V2_PVT.DELETE_RECIPIENT()');
2893       END IF;
2894 
2895 END;
2896 
2897 PROCEDURE Validate_share_Update(
2898  p_api_version_number         IN NUMBER   := 1.0
2899 ,p_init_msg_list              IN VARCHAR2 := FND_API.G_FALSE
2900 ,p_quote_header_rec           IN ASO_QUOTE_PUB.Qte_Header_Rec_Type
2901 ,p_quote_access_tbl           IN IBE_QUOTE_SAVESHARE_pvt.QUOTE_ACCESS_Tbl_Type
2902                                 := IBE_QUOTE_SAVESHARE_pvt.G_miss_quote_access_Tbl
2903 -- partyid and accountid cannot be gmiss coming in
2904 ,p_party_id                   IN NUMBER
2905 ,p_cust_account_id            IN NUMBER
2906 ,p_retrieval_number           IN NUMBER     := FND_API.G_MISS_NUM
2907 ,p_operation_code             IN VARCHAR2
2908 ,x_return_status              OUT NOCOPY VARCHAR2
2909 ,x_msg_count                  OUT NOCOPY NUMBER
2910 ,x_msg_data                   OUT NOCOPY VARCHAR2
2911 )
2912 
2913 is
2914 
2915 l_api_name    CONSTANT VARCHAR2(30) := 'Validate_share_Update';
2916 l_api_version CONSTANT NUMBER       := 1.0;
2917 l_check_updates        VARCHAR2(1)  := FND_API.G_FALSE; -- checks timestamps and if updates are really necessary
2918 l_check_onlynotify     VARCHAR2(1)  := FND_API.G_FALSE;
2919 l_is_owner             VARCHAR2(1)  := FND_API.G_TRUE;
2920 l_owner_party_id       NUMBER;
2921 l_userenv_party_id     NUMBER;
2922 l_access_level         VARCHAR2(30) := null;
2923 l_db_last_update_date  DATE;
2924 l_db_end_date_active   DATE;
2925 l_db_access_level    VARCHAR2(30) := null;
2926 l_db_quote_access_tbl  IBE_QUOTE_SAVESHARE_pvt.QUOTE_ACCESS_Tbl_Type;
2927 l_env_user_id NUMBER;
2928 
2929 cursor c_get_owner_partyid(c_quote_id number) is
2930   select party_id
2931   from ASO_QUOTE_HEADERS_ALL
2932   where quote_header_id = c_quote_id;
2933 
2934 rec_get_owner_partyid c_get_owner_partyid%rowtype;
2935 
2936 cursor c_get_role_by_retr_num(c_retrieval_number number, c_party_id number, c_acct_id number) is
2937   select update_privilege_type_code
2938   from ibe_sh_quote_access
2939   where quote_sharee_number = c_retrieval_number
2940   and (party_id is null or party_id = c_party_id)
2941   and (cust_account_id is null or cust_account_id = c_acct_id);
2942 
2943 rec_get_role_by_retr_num c_get_role_by_retr_num%rowtype;
2944 
2945 cursor c_get_role_by_user(c_party_id number, c_account_id number, c_qte_hdr_id number) is
2946   select update_privilege_type_code
2947   from ibe_sh_quote_access
2948   where quote_header_id = c_qte_hdr_id
2949   and party_id = c_party_id
2950   and cust_account_id = c_account_id
2951   AND nvl(end_date_active, sysdate+1) > sysdate;
2952 
2953 
2954 rec_get_role_by_user c_get_role_by_user%rowtype;
2955 
2956 cursor c_get_recipient_info(c_recipient_id number) is
2957   select last_update_date, last_updated_by, end_date_active, update_privilege_type_code
2958   from ibe_sh_quote_access
2959   where quote_sharee_id = c_recipient_id;
2960 
2961 rec_get_recipient_info c_get_recipient_info%rowtype;
2962 
2963 BEGIN
2964 
2965   IF (IBE_UTIL.G_DEBUGON = l_true) THEN
2966      IBE_UTIL.DEBUG('Begin validate_share_update : ' || to_char(sysdate, 'mm/dd/yyyy:hh24:MI:SS'));
2967   END IF;
2968 
2969   -- Standard call to check for call compatibility.
2970   IF NOT FND_API.Compatible_API_Call (l_api_version,
2971 			       p_api_version_number,
2972 			       l_api_name,
2973 			       G_PKG_NAME )
2974   THEN
2975     RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
2976   END IF;
2977 
2978   -- Initialize message list if p_init_msg_list is set to TRUE.
2979 
2980   IF FND_API.To_Boolean( p_init_msg_list ) THEN
2981 	FND_Msg_Pub.initialize;
2982   END IF;
2983 
2984   --  Initialize API return status to success
2985   x_return_status := FND_API.G_RET_STS_SUCCESS;
2986 
2987   -- API body
2988   -- start by returning the input
2989 
2990   IF (IBE_UTIL.G_DEBUGON = l_true) THEN
2991      IBE_UTIL.DEBUG('Incoming quote_header_id is  :'||p_quote_header_rec.quote_header_id);
2992      IBE_UTIL.DEBUG('Incoming operation_code is   :'||p_operation_code);
2993      IBE_UTIL.DEBUG('Incoming party_id is         :'||p_party_id);
2994      IBE_UTIL.DEBUG('Incoming account_id is       :'||p_cust_account_id);
2995      IBE_UTIL.DEBUG('Incoming retrieval_number is :'||p_retrieval_number);
2996   END IF;
2997 
2998 /*  FOR rec_userenv_partyid in c_userenv_partyid LOOP
2999     l_userenv_party_id := rec_userenv_partyid.customer_id;
3000   EXIT when c_userenv_partyid%notfound;
3001   END LOOP;
3002 */
3003   FOR rec_get_owner_partyid in c_get_owner_partyid(p_quote_header_rec.quote_header_id) LOOP
3004     l_owner_party_id := rec_get_owner_partyid.party_id;
3005   EXIT when c_get_owner_partyid%notfound;
3006   END LOOP;
3007 ------------ USER VALIDATION - must be either owner or valid recipient ------------------------------
3008   if (l_owner_party_id <> p_party_id) then
3009     l_is_owner := FND_API.G_FALSE;
3010   else
3011     IF (IBE_UTIL.G_DEBUGON = l_true) THEN
3012       IBE_Util.Debug('Initiator is OWNER');
3013     END IF;
3014   end if;
3015 
3016 --  if ((l_is_owner = FND_API.G_FALSE) and (p_operation_code <> OP_END_WORKING)) then
3017   if (l_is_owner = FND_API.G_FALSE) then
3018   -- if user is not the owner then we need to make sure he is a valid member
3019     IF (IBE_UTIL.G_DEBUGON = l_true) THEN
3020       IBE_Util.Debug('Initiator may be RECIPIENT');
3021     END IF;
3022     if ((p_retrieval_number is not null) and (p_retrieval_number <> FND_API.G_MISS_NUM)) then
3023       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
3024         l_access_level := rec_get_role_by_retr_num.update_privilege_type_code;
3025       EXIT when c_get_role_by_retr_num%notfound;
3026       END LOOP;
3027     else
3028       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
3029         l_access_level := rec_get_role_by_user.update_privilege_type_code;
3030       EXIT when c_get_role_by_user%notfound;
3031       END LOOP;
3032     end if;
3033     IF (IBE_UTIL.G_DEBUGON = l_true) THEN
3034       IBE_Util.Debug('RECIPIENT access level: ' || l_access_level);
3035     END IF;
3036     if (l_access_level is null) then
3037       IF FND_Msg_Pub.Check_Msg_Level (FND_Msg_Pub.G_MSG_LVL_ERROR) THEN
3038         FND_Message.Set_Name('IBE', 'IBE_SC_ERR_USERACCESS');
3039         FND_Msg_Pub.Add;
3040       END IF;
3041       -- need to raise an error that the user no longer has access to this cart
3042       RAISE FND_API.G_EXC_ERROR;
3043     end if;
3044   end if;
3045 
3046 ------------ DETERMINE WHICH VALIDATIONS TO DO BASED ON OP CODE ------------------------------
3047   -- owner only operations
3048   if (p_operation_code in (OP_APPEND, OP_NAME_CART, OP_SAVE_CART_AND_RECIPIENTS)) then
3049     if (l_is_owner = FND_API.G_FALSE) then
3050       IF FND_Msg_Pub.Check_Msg_Level (FND_Msg_Pub.G_MSG_LVL_ERROR) THEN
3051         FND_Message.Set_Name('IBE', 'IBE_SC_ERR_PRIVILEGE');
3052         FND_Msg_Pub.Add;
3053       END IF;
3054       -- raise an error that the user does not have this privilege
3055       RAISE FND_API.G_EXC_ERROR;
3056     end if;
3057     if (p_operation_code = OP_SAVE_CART_AND_RECIPIENTS) then
3058       l_check_updates := FND_API.G_TRUE;
3059     end if;
3060   -- owner or admin operations
3061   elsif (p_operation_code in (OP_STOP_SHARING, OP_DELETE_CART)) then
3062     if ((l_is_owner = FND_API.G_FALSE) and (l_access_level <> 'A')) then
3063       IF FND_Msg_Pub.Check_Msg_Level (FND_Msg_Pub.G_MSG_LVL_ERROR) THEN
3064         FND_Message.Set_Name('IBE', 'IBE_SC_ERR_PRIVILEGE');
3065         FND_Msg_Pub.Add;
3066       END IF;
3067       -- raise an error that the user does not have this privilege
3068       RAISE FND_API.G_EXC_ERROR;
3069     end if;
3070     l_check_onlynotify := FND_API.G_TRUE;
3071     l_check_updates := FND_API.G_TRUE;
3072   -- any role, but different checks depending on role
3073   elsif (p_operation_code = OP_SAVE_RECIPIENTS) then
3074     if ((l_is_owner = FND_API.G_FALSE) and (l_access_level <> 'A')) then
3075       -- if not the owner or not admin, then make sure user is only notifying
3076       l_check_onlynotify := FND_API.G_TRUE;
3077     end if;
3078     l_check_updates := FND_API.G_TRUE;
3079   elsif ((p_operation_code = OP_ACTIVATE_QUOTE) or (p_operation_code = OP_DEACTIVATE)) then
3080     l_check_updates := FND_API.G_FALSE; -- no validations to do here that have not already been done
3081   end if; -- end if else over operation_code
3082 
3083   IF (IBE_UTIL.G_DEBUGON = l_true) THEN
3084      IBE_UTIL.DEBUG('l_check_onlynotify is  :'||l_check_onlynotify);
3085      IBE_UTIL.DEBUG('l_check_updates is     :'||l_check_updates);
3086   END IF;
3087 
3088 ------------ VALIDATIONS ON THE INPUT QUOTE ACCESS TABLE ------------------------------
3089   if ((l_check_updates = FND_API.G_TRUE) or (l_check_onlynotify = FND_API.G_TRUE)) then
3090     l_env_user_id := FND_GLOBAL.USER_ID;
3091     FOR i in 1..p_quote_access_tbl.count LOOP
3092       IF (IBE_UTIL.G_DEBUGON = l_true) THEN
3093         IBE_UTIL.DEBUG('current quote_sharee_id : '||p_quote_access_tbl(i).quote_sharee_id);
3094       end if;
3095       -- populate a local table with all the db data - but index it according to the input table
3096       -- in this loop, we will check every opcode if necessary
3097       -- down below, we will end up only checking the ones that have a shareeid
3098       l_db_quote_access_tbl(i).operation_code := p_quote_access_tbl(i).operation_code;
3099       if ((p_quote_access_tbl(i).quote_sharee_id is not null)
3100           and (p_quote_access_tbl(i).quote_sharee_id <> fnd_api.g_miss_num)) then
3101         --cursor query to get last_update_date, contact_point_id, end_date_active
3102         FOR rec_get_recipient_info in c_get_recipient_info(p_quote_access_tbl(i).quote_sharee_id) LOOP
3103           l_db_quote_access_tbl(i).last_update_date := rec_get_recipient_info.last_update_date;
3104           l_db_quote_access_tbl(i).last_updated_by := rec_get_recipient_info.last_updated_by;
3105           l_db_quote_access_tbl(i).end_date_active := rec_get_recipient_info.end_date_active;
3106           l_db_quote_access_tbl(i).update_privilege_type_code := rec_get_recipient_info.update_privilege_type_code;
3107         EXIT when c_get_recipient_info%notfound;
3108         END LOOP;
3109         IF (IBE_UTIL.G_DEBUGON = l_true) THEN
3110           IBE_UTIL.DEBUG('input op_code           : '||p_quote_access_tbl(i).operation_code);
3111           IBE_UTIL.DEBUG('input last_update_date  : '||to_char(p_quote_access_tbl(i).last_update_date,'mm/dd/yyyy:hh24:MI:SS'));
3112           IBE_UTIL.DEBUG('db    last_update_date  : '||to_char(l_db_quote_access_tbl(i).last_update_date,'mm/dd/yyyy:hh24:MI:SS'));
3113           IBE_UTIL.DEBUG('input access_level      : '||p_quote_access_tbl(i).update_privilege_type_code);
3114           IBE_UTIL.DEBUG('db    access_level      : '||l_db_quote_access_tbl(i).update_privilege_type_code);
3115         end if;
3116         -- do the opcode permissions check as we loop
3117         if (l_check_onlynotify = FND_API.G_TRUE) then
3118           -- make sure we are not creating, deleting, or doing any real updates
3119           if ((p_quote_access_tbl(i).operation_code = 'DELETE')
3120                or(p_quote_access_tbl(i).operation_code = 'CREATE')
3121                or ((p_quote_access_tbl(i).operation_code = 'UPDATE')
3122                    and (p_quote_access_tbl(i).update_privilege_type_code is not null)
3123                    and (p_quote_access_tbl(i).update_privilege_type_code <> FND_API.G_MISS_CHAR)
3124                    and (p_quote_access_tbl(i).update_privilege_type_code <> l_db_quote_access_tbl(i).update_privilege_type_code))) then
3125             IF FND_Msg_Pub.Check_Msg_Level (FND_Msg_Pub.G_MSG_LVL_ERROR) THEN
3126               FND_Message.Set_Name('IBE', 'IBE_SC_ERR_PRIVILEGE');
3127               FND_Msg_Pub.Add;
3128             END IF;
3129             RAISE FND_API.G_EXC_ERROR;
3130           end if;
3131         end if; -- end check onlynotify
3132       end if;  -- end if we have a quote_sharee_id
3133     end loop; -- end loop over input access tbl
3134     -- second loop to check last update dates
3135     if (l_check_updates = FND_API.G_TRUE) then
3136       FOR i in 1..p_quote_access_tbl.count LOOP
3137         IF (IBE_UTIL.G_DEBUGON = l_true) THEN
3138           IBE_UTIL.DEBUG('current quote_sharee_id : '||p_quote_access_tbl(i).quote_sharee_id);
3139         end if;
3140         if ((p_quote_access_tbl(i).quote_sharee_id is not null)
3141             and (p_quote_access_tbl(i).quote_sharee_id <> fnd_api.g_miss_num)) then
3142 
3143           if ((p_quote_access_tbl(i).last_update_date <> FND_API.G_MISS_DATE) and
3144               (p_quote_access_tbl(i).last_update_date <> l_db_quote_access_tbl(i).last_update_date)) then
3145             -- i.e. don't throw exception if we want to end a row and it's already enddated.
3146             if ((p_quote_access_tbl(i).operation_code = 'DELETE') and (nvl(l_db_quote_access_tbl(i).end_date_active,sysdate-1) < sysdate)) then
3147               IF (IBE_UTIL.G_DEBUGON = l_true) THEN
3148                 IBE_UTIL.DEBUG('deleteing an end dated row, allowing it to pass through');
3149               end if;
3150             elsif (l_env_user_id = l_db_quote_access_tbl(i).last_updated_by) then
3151               IF (IBE_UTIL.G_DEBUGON = l_true) THEN
3152                 IBE_UTIL.DEBUG('timestamps do not match, but user was the last to update the row so allowing it to go through');
3153               end if;
3154             else
3155               IF FND_Msg_Pub.Check_Msg_Level (FND_Msg_Pub.G_MSG_LVL_ERROR) THEN
3156                 FND_Message.Set_Name('IBE', 'IBE_SC_ERR_MEMBERS_OUT_OF_SYNC');
3157                 FND_Msg_Pub.Add;
3158               END IF;
3159               -- need a new error msg that the row has been updated by another user and to try again
3160               RAISE FND_API.G_EXC_ERROR;
3161             end if;
3162           end if; -- end if last_update_dates dont match
3163         end if;  -- end if shareeid is not null
3164       end loop; -- end loop over input quote access tbl
3165     end if; -- end if doing check updates
3166   end if; -- end check of updates
3167 
3168   IF (IBE_UTIL.G_DEBUGON = l_true) THEN
3169     IBE_UTIL.DEBUG('End validate_share_update' || to_char(sysdate, 'mm/dd/yyyy:hh24:MI:SS'));
3170   END IF;
3171 
3172   EXCEPTION
3173   WHEN FND_API.G_EXC_ERROR THEN
3174    x_return_status := FND_API.G_RET_STS_ERROR;
3175    FND_Msg_Pub.Count_And_Get(p_encoded => FND_API.G_FALSE,
3176 		          p_count   => x_msg_count    ,
3177 			  p_data    => x_msg_data);
3178   IF (IBE_UTIL.G_DEBUGON = l_true) THEN
3179      IBE_Util.Debug('End  IBE_Quote_Misc_pvt.validate_share_update: expected error');
3180   END IF;
3181   WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
3182    x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
3183    FND_Msg_Pub.Count_And_Get(p_encoded => FND_API.G_FALSE,
3184 			  p_count   => x_msg_count    ,
3185 			  p_data    => x_msg_data);
3186    IF (IBE_UTIL.G_DEBUGON = l_true) THEN
3187       IBE_Util.Debug('End  IBE_Quote_Misc_pvt.validate_share_update: unexpected error');
3188    END IF;
3189   WHEN OTHERS THEN
3190   IF FND_Msg_Pub.Check_Msg_Level(FND_Msg_Pub.G_MSG_LVL_UNEXP_ERROR) THEN
3191     FND_Msg_Pub.Add_Exc_Msg(G_PKG_NAME,
3192 			   l_api_name);
3193   END IF;
3194   FND_Msg_Pub.Count_And_Get(p_encoded => FND_API.G_FALSE,
3195 			  p_count   => x_msg_count    ,
3196 			  p_data    => x_msg_data);
3197   IF (IBE_UTIL.G_DEBUGON = l_true) THEN
3198      IBE_Util.Debug('End IBE_Quote_Misc_pvt.validate_share_update: other exception');
3199   END IF;
3200 END validate_share_update;
3201 
3202 END IBE_QUOTE_SAVESHARE_V2_PVT;