DBA Data[Home] [Help]

PACKAGE BODY: APPS.CSM_SERIAL_NUMBERS_EVENT_PKG

Source


1 PACKAGE BODY CSM_SERIAL_NUMBERS_EVENT_PKG AS
2 /* $Header: csmeslnb.pls 120.6.12020000.2 2013/04/09 11:07:41 saradhak ship $*/
3 --
4 -- To modify this template, edit file PKGBODY.TXT in TEMPLATE
5 -- directory of SQL Navigator
6 --
7 -- Purpose: Briefly explain the functionality of the package body
8 --
9 -- MODIFICATION HISTORY
10 -- Person      Date    Comments
11 -- ---------   ------  ------------------------------------------
12    -- Enter procedure, function bodies as shown below
13 
14 g_pub_item varchar2(30) := 'CSM_MTL_SERIAL_NUMBERS';
15 
16 PROCEDURE insert_mtl_serial_numbers(p_organization_id IN number, p_last_run_date IN date, p_resource_id IN number, p_user_id IN number)
17 IS
18 TYPE inventory_items_tbl_typ IS TABLE OF mtl_serial_numbers.inventory_item_id%TYPE INDEX BY binary_integer;
19 TYPE serial_numbers_tbl_typ IS TABLE OF mtl_serial_numbers.serial_number%TYPE INDEX BY binary_integer;
20 TYPE organizations_tbl_typ IS TABLE OF mtl_serial_numbers.current_organization_id%TYPE INDEX BY binary_integer;
21 TYPE access_id_tbl_typ IS TABLE OF csm_mtl_serial_numbers_acc.access_id%TYPE INDEX BY binary_integer;
22 
23 l_inventory_items_tbl  inventory_items_tbl_typ;
24 l_serial_numbers_tbl   serial_numbers_tbl_typ;
25 l_organizations_tbl    organizations_tbl_typ;
26 l_access_id_tbl        access_id_tbl_typ;
27 l_run_date             DATE;
28 l_markdirty            boolean;
29 l_sqlerrno             varchar2(20);
30 l_sqlerrmsg            varchar2(2000);
31 
32 -- update counter of records that may already exist in acc table
33 CURSOR l_upd_mtl_serial_numbers_csr(p_organization_id in number, p_resourceid IN number, p_userid in number, p_lastrundate IN date)
34 IS
35 SELECT acc.access_id
36 FROM   csm_mtl_serial_numbers_acc acc
37 WHERE  acc.user_id = p_userid
38 --AND acc.current_organization_id = p_organization_id
39 AND   (acc.inventory_item_id, acc.serial_number, acc.current_organization_id) IN (
40         SELECT inventory_item_id, serial_number, current_organization_id
41     	FROM mtl_serial_numbers
42     	WHERE creation_date >= NVL(p_lastrundate, creation_date)
43     	AND current_status =3
44     	AND (current_subinventory_code, current_organization_id) IN (
45      		SELECT subinventory_code
46      		,organization_id
47      		FROM csp_inv_loc_assignments
48      		WHERE resource_id = p_resourceid
49      		AND SYSDATE BETWEEN nvl( effective_date_start, SYSDATE )
50                      AND nvl( effective_date_end , SYSDATE ))
51     		 );
52 
53 -- get all new serial numbers that do not exist in acc table
54 CURSOR l_ins_mtl_serial_numbers_csr(p_organization_id in number, p_resourceid IN number, p_userid in number, p_lastrundate IN date)
55 IS--select  serial numbers in status 3 for both ib non ib items
56  SELECT  csm_mtl_serial_numbers_acc_s.nextval, inventory_item_id, serial_number, current_organization_id
57  FROM 	 mtl_serial_numbers
58  WHERE   current_status =3 -- resides in stores + issued out of subinv
59  AND   	 ( current_subinventory_code, current_organization_id ) IN (
60        	   SELECT subinventory_code
61        	   ,organization_id
62        		FROM csp_inv_loc_assignments
63        		WHERE resource_id = p_resourceid
64        		AND SYSDATE BETWEEN nvl( effective_date_start, SYSDATE )
65                      AND nvl( effective_date_end , SYSDATE ))
66  AND  	 ( inventory_item_id, serial_number, current_organization_id ) NOT IN (
67            SELECT inventory_item_id, serial_number, current_organization_id
68        	   FROM csm_mtl_serial_numbers_acc
69        	   WHERE user_id = p_userid );
70 
71 CURSOR l_ins_mtl_ser_num_fornonib_csr(p_organization_id in number, p_resourceid IN number, p_userid in number, p_lastrundate IN date)
72 IS--select  serial numbers in status 1,4 for non ib items only
73 SELECT   csm_mtl_serial_numbers_acc_s.nextval,
74  		 ser.inventory_item_id,
75 		 ser.serial_number,
76   		 ser.current_organization_id
77 FROM   	 mtl_serial_numbers ser
78 WHERE 	 ser.current_status IN (1,4)     --Not assigned and out of subinv
79 AND 	 EXISTS (
80 	  		   SELECT  'x'
81 			   FROM	   csm_mtl_onhand_qty_acc ohqacc,
82 			   		   mtl_system_items sys
83 			   WHERE   ohqacc.inventory_item_id 	 = ser.inventory_item_id
84 			   AND 	   ohqacc.organization_id 		 = ser.current_organization_id
85 			   AND	   ohqacc.user_id 				 = p_userid
86 			   AND     ohqacc.inventory_item_id    	 = sys.inventory_item_id
87 			   AND     ohqacc.ORGANIZATION_ID 		 = sys.ORGANIZATION_ID
88 			   AND     NVL(sys.COMMS_NL_TRACKABLE_FLAG,'N') ='N'
89    			  )
90 AND    NOT EXISTS (
91                SELECT 'x'
92                FROM   csm_mtl_serial_numbers_acc sacc
93        		   WHERE  user_id 					   = p_userid
94       		   AND    sacc.inventory_item_id 	   = ser.inventory_item_id
95       		   AND    sacc.serial_number  	 	   = ser.serial_number
96       		   AND    sacc.current_organization_id = ser.current_organization_id);
97 
98 BEGIN
99  CSM_UTIL_PKG.LOG('Entering CSM_SERIAL_NUMBERS_EVENT_PKG.INSERT_MTL_SERIAL_NUMBERS ',
100                          'CSM_SERIAL_NUMBERS_EVENT_PKG.INSERT_MTL_SERIAL_NUMBERS',FND_LOG.LEVEL_PROCEDURE);
101 
102  IF l_access_id_tbl.count > 0 THEN
103     l_access_id_tbl.DELETE;
104  END IF;
105 
106  l_run_date := SYSDATE;
107 
108  -- update counter of serial numbers that already exist for user in acc table
109  OPEN l_upd_mtl_serial_numbers_csr(p_organization_id, p_resource_id, p_user_id, p_last_run_date);
110  FETCH l_upd_mtl_serial_numbers_csr BULK COLLECT INTO l_access_id_tbl;
111  CLOSE l_upd_mtl_serial_numbers_csr;
112 
113  IF l_access_id_tbl.count > 0 THEN
114     FORALL i IN 1..l_access_id_tbl.count
115         UPDATE csm_mtl_serial_numbers_acc
116         SET    counter = counter + 1
117               ,last_update_date = SYSDATE
118               ,last_updated_by = fnd_global.user_id
119         WHERE access_id = l_access_id_tbl(i);
120 
121    l_access_id_tbl.delete;
122  END IF;
123 
124  -- BULK collect all new inserted serial numbers with STatus 3
125  OPEN l_ins_mtl_serial_numbers_csr(p_organization_id, p_resource_id, p_user_id, p_last_run_date);
126  FETCH l_ins_mtl_serial_numbers_csr BULK COLLECT INTO l_access_id_tbl, l_inventory_items_tbl, l_serial_numbers_tbl, l_organizations_tbl;
127  CLOSE l_ins_mtl_serial_numbers_csr;
128 
129  -- bulk insert into acc tables
130  IF l_access_id_tbl.count > 0 THEN
131    FORALL i IN 1..l_access_id_tbl.count
132       INSERT INTO csm_mtl_serial_numbers_acc(access_id, user_id, serial_number, inventory_item_id, current_organization_id,
133                                counter, created_by, creation_date, last_updated_by, last_update_date, last_update_login)
134                         VALUES (l_access_id_tbl(i), p_user_id, l_serial_numbers_tbl(i), l_inventory_items_tbl(i), l_organizations_tbl(i),
135                                 1, fnd_global.user_id, l_run_date, fnd_global.user_id, l_run_date, fnd_global.login_id);
136 
137     CSM_UTIL_PKG.LOG('Bulk inserted ' || l_access_id_tbl.count || ' records into csm_mtl_serial_numbers_acc for resource ' || p_resource_id ,
138                          'CSM_SERIAL_NUMBERS_EVENT_PKG.INSERT_MTL_SERIAL_NUMBERS',FND_LOG.LEVEL_STATEMENT);
139 
140    -- make dirty calls
141    FOR i IN 1..l_access_id_tbl.count LOOP
142       l_markdirty := csm_util_pkg.MakeDirtyForResource(g_pub_item,
143                                                        l_access_id_tbl(i),
144                                                        p_resource_id,
145                                                        asg_download.ins,
146                                                        l_run_date);
147    END LOOP;
148  END IF;
149 
150 
151   IF CSM_UTIL_PKG.is_html5_user(p_user_id) THEN  --non ib serial numbers not reqd
152    CSM_UTIL_PKG.LOG('Leaving CSM_SERIAL_NUMBERS_EVENT_PKG.INSERT_MTL_SERIAL_NUMBERS for html5 user',
153                          'CSM_SERIAL_NUMBERS_EVENT_PKG.INSERT_MTL_SERIAL_NUMBERS',FND_LOG.LEVEL_PROCEDURE);
154    RETURN;
155   END IF;
156 
157  ---Insert for non ib items
158  IF l_access_id_tbl.count > 0 THEN
159  	l_access_id_tbl.delete;
160  	l_inventory_items_tbl.delete;
161  	l_serial_numbers_tbl.delete;
162     l_organizations_tbl.delete;
163  END IF;
164 
165   -- BULK collect all new inserted serial numbers with STatus 1 and 4 for Non ib items
166  OPEN l_ins_mtl_ser_num_fornonib_csr(p_organization_id, p_resource_id, p_user_id, p_last_run_date);
167  FETCH l_ins_mtl_ser_num_fornonib_csr BULK COLLECT INTO l_access_id_tbl, l_inventory_items_tbl, l_serial_numbers_tbl, l_organizations_tbl;
168  CLOSE l_ins_mtl_ser_num_fornonib_csr;
169 
170  -- bulk insert into acc tables
171  IF l_access_id_tbl.count > 0 THEN
172    FORALL i IN 1..l_access_id_tbl.count
173       INSERT INTO csm_mtl_serial_numbers_acc(access_id, user_id, serial_number, inventory_item_id, current_organization_id,
174                                counter, created_by, creation_date, last_updated_by, last_update_date, last_update_login)
175                         VALUES (l_access_id_tbl(i), p_user_id, l_serial_numbers_tbl(i), l_inventory_items_tbl(i), l_organizations_tbl(i),
176                                 1, fnd_global.user_id, l_run_date, fnd_global.user_id, l_run_date, fnd_global.login_id);
177 
178     CSM_UTIL_PKG.LOG('Bulk inserted ' || l_access_id_tbl.count || ' records into csm_mtl_serial_numbers_acc for resource ' || p_resource_id ,
179                          'CSM_SERIAL_NUMBERS_EVENT_PKG.INSERT_MTL_SERIAL_NUMBERS',FND_LOG.LEVEL_STATEMENT);
180 
181    -- make dirty calls
182    FOR i IN 1..l_access_id_tbl.count LOOP
183       l_markdirty := csm_util_pkg.MakeDirtyForResource(g_pub_item,
184                                                        l_access_id_tbl(i),
185                                                        p_resource_id,
186                                                        asg_download.ins,
187                                                        l_run_date);
188    END LOOP;
189  END IF;
190 
191  CSM_UTIL_PKG.LOG('Leaving CSM_SERIAL_NUMBERS_EVENT_PKG.INSERT_MTL_SERIAL_NUMBERS ',
192                          'CSM_SERIAL_NUMBERS_EVENT_PKG.INSERT_MTL_SERIAL_NUMBERS',FND_LOG.LEVEL_PROCEDURE);
193 
194  EXCEPTION
195   WHEN others THEN
196      l_sqlerrno := to_char(SQLCODE);
197      l_sqlerrmsg := substr(SQLERRM, 1,2000);
198      CSM_UTIL_PKG.LOG('Exception in CSM_SERIAL_NUMBERS_EVENT_PKG.INSERT_MTL_SERIAL_NUMBERS: ' || l_sqlerrno || ':' || l_sqlerrmsg,
199                          'CSM_SERIAL_NUMBERS_EVENT_PKG.INSERT_MTL_SERIAL_NUMBERS',FND_LOG.LEVEL_EXCEPTION);
200 
201 END INSERT_MTL_SERIAL_NUMBERS;
202 
203 PROCEDURE update_mtl_serial_numbers(p_organization_id IN number, p_last_run_date IN date, p_resource_id IN number, p_user_id IN number)
204 IS
205 TYPE access_id_tbl_typ IS TABLE OF csm_mtl_serial_numbers_acc.access_id%TYPE INDEX BY binary_integer;
206 l_access_id_tbl        access_id_tbl_typ;
207 l_run_date DATE;
208 l_markdirty            boolean;
209 l_sqlerrno             varchar2(20);
210 l_sqlerrmsg            varchar2(2000);
211 
212 -- upd serial numbers whose locations have changed within the org to locations user has access to
213 CURSOR l_upd_mtl_serial_numbers_csr(p_lastrundate IN date, p_resourceid IN number, p_userid IN number)
214 IS
215 SELECT access_id
216 FROM csm_mtl_serial_numbers_acc acc
217 ,    mtl_serial_numbers msn
218 WHERE msn.inventory_item_id = acc.inventory_item_id
219 AND   msn.serial_number = acc.serial_number
220 AND   msn.current_organization_id = acc.current_organization_id
221 AND   msn.last_update_date  >= p_lastrundate
222 AND   acc.user_id = p_userid;
223 /*AND ( msn.current_subinventory_code, msn.current_organization_id ) IN (
224      SELECT subinventory_code
225      ,      organization_id
226      FROM csp_inv_loc_assignments
227      WHERE resource_id = p_resourceid
228      AND SYSDATE BETWEEN nvl( effective_date_start, SYSDATE )
229                      AND nvl( effective_date_end , SYSDATE ));*/
230 
231 -- decrement counter of serial numbers whose locations have changed within the org or that reside in a diff org
232 CURSOR l_del_mtl_serial_numbers_csr(p_resourceid IN number, p_userid IN number)
233 IS
234 SELECT access_id
235 FROM csm_mtl_serial_numbers_acc acc
236 ,    mtl_serial_numbers msn
237 WHERE msn.inventory_item_id = acc.inventory_item_id
238 AND   msn.serial_number = acc.serial_number
239 AND   msn.current_organization_id = acc.current_organization_id
240 AND   acc.user_id = p_userid
241 AND   msn.current_status =3
242 AND ( msn.current_subinventory_code, msn.current_organization_id ) NOT IN (
243      SELECT subinventory_code
244      ,      organization_id
245      FROM csp_inv_loc_assignments
246      WHERE resource_id = p_resourceid
247      AND SYSDATE BETWEEN nvl( effective_date_start, SYSDATE )
248                      AND nvl( effective_date_end , SYSDATE ))
249 UNION
250 SELECT access_id
251 FROM  csm_mtl_serial_numbers_acc acc
252 WHERE acc.user_id = p_user_id
253 AND NOT EXISTS
254  	(SELECT 1
255   	  FROM mtl_serial_numbers msn
256   	  WHERE msn.serial_number = acc.serial_number
257   	  AND  msn.inventory_item_id = acc.inventory_item_id
258   	  AND msn.current_organization_id = acc.current_organization_id
259   	  AND msn.CURRENT_STATUS =3
260  	  )
261 AND NOT EXISTS
262  	( SELECT 1
263  	  FROM   mtl_serial_numbers ser,
264  	    	 csm_mtl_onhand_qty_acc ohqacc,
265 	    	 mtl_system_items sys
266 	  WHERE  ser.current_status in (1,4)
267 	  AND	 ohqacc.user_id = acc.user_id
268 	  AND    ser.serial_number  = acc.serial_number
269   	  AND	 ser.inventory_item_id =acc.inventory_item_id
270 	  AND	 ser.inventory_item_id =sys.inventory_item_id
271 	  AND    ser.CURRENT_ORGANIZATION_ID =  sys.ORGANIZATION_ID
272 	  AND 	 NVL(sys.COMMS_NL_TRACKABLE_FLAG,'N') ='N'
273 	  AND 	 ohqacc.inventory_item_id = ser.inventory_item_id
274 	  AND 	 ohqacc.organization_id = ser.current_organization_id
275 
276  	  );
277 
278 
279 CURSOR l_del_mtl_serial_numbers_csr5(p_resourceid IN number, p_userid IN number) --htm5 users only status=3 i.e no non-ib items
280 IS
281 SELECT access_id
282 FROM csm_mtl_serial_numbers_acc acc , mtl_serial_numbers msn
283 WHERE msn.inventory_item_id = acc.inventory_item_id
284 AND   msn.serial_number = acc.serial_number
285 AND   msn.current_organization_id = acc.current_organization_id
286 AND   acc.user_id = p_userid
287 AND   msn.current_status =3
288 AND ( msn.current_subinventory_code, msn.current_organization_id ) NOT IN (
289      SELECT subinventory_code,  organization_id
290      FROM csp_inv_loc_assignments      WHERE resource_id = p_resourceid
291      AND SYSDATE BETWEEN nvl( effective_date_start, SYSDATE )AND nvl( effective_date_end , SYSDATE ))
292 UNION
293 SELECT access_id
294 FROM  csm_mtl_serial_numbers_acc acc
295 WHERE acc.user_id = p_user_id
296 AND NOT EXISTS
297  	(SELECT 1 FROM mtl_serial_numbers msn
298   	  WHERE msn.serial_number = acc.serial_number
299   	  AND  msn.inventory_item_id = acc.inventory_item_id
300   	  AND msn.current_organization_id = acc.current_organization_id
301   	  AND msn.CURRENT_STATUS =3 );
302 
303 
304 
305 CURSOR l_delete_serial_number_acc(p_userid IN number)
306 IS
307 SELECT access_id
308 FROM csm_mtl_serial_numbers_acc
309 WHERE user_id = p_userid
310 AND counter = 0;
311 
312 BEGIN
313  CSM_UTIL_PKG.LOG('Entering CSM_SERIAL_NUMBERS_EVENT_PKG.UPDATE_MTL_SERIAL_NUMBERS ',
314                          'CSM_SERIAL_NUMBERS_EVENT_PKG.UPDATE_MTL_SERIAL_NUMBERS',FND_LOG.LEVEL_PROCEDURE);
315 
316  l_run_date := SYSDATE;
317 
318  IF l_access_id_tbl.count > 0 THEN
319     l_access_id_tbl.DELETE;
320  END IF;
321 
322 -- bulk collect all updated serial_numbers
323  OPEN l_upd_mtl_serial_numbers_csr(p_last_run_date, p_resource_id, p_user_id);
324  FETCH l_upd_mtl_serial_numbers_csr BULK COLLECT INTO l_access_id_tbl;
325  CLOSE l_upd_mtl_serial_numbers_csr;
326 
327  IF l_access_id_tbl.count > 0 THEN
328    CSM_UTIL_PKG.LOG(l_access_id_tbl.count || ' records marked update on csm_mtl_serial_numbers for resource ' || p_resource_id ,
329                          'CSM_SERIAL_NUMBERS_EVENT_PKG.UPDATE_MTL_SERIAL_NUMBERS',FND_LOG.LEVEL_STATEMENT);
330 
331    -- make dirty calls
332    FOR i IN 1..l_access_id_tbl.count LOOP
333       l_markdirty := csm_util_pkg.MakeDirtyForResource(g_pub_item,
334                                                        l_access_id_tbl(i),
335                                                        p_resource_id,
336                                                        asg_download.upd,
337                                                        l_run_date);
338    END LOOP;
339 
340    l_access_id_tbl.DELETE;
341  END IF;
342 
343 
344  IF CSM_UTIL_PKG.IS_HTML5_USER(p_user_id) THEN
345      -- bulk collect all serial numbers to be deleted
346 	 OPEN l_del_mtl_serial_numbers_csr5(p_resource_id, p_user_id);
347 	 FETCH l_del_mtl_serial_numbers_csr5 BULK COLLECT INTO l_access_id_tbl;
348 	 CLOSE l_del_mtl_serial_numbers_csr5;
349  ELSE
350      -- bulk collect all serial numbers to be deleted
351 	 OPEN l_del_mtl_serial_numbers_csr(p_resource_id, p_user_id);
352 	 FETCH l_del_mtl_serial_numbers_csr BULK COLLECT INTO l_access_id_tbl;
353 	 CLOSE l_del_mtl_serial_numbers_csr;
354  END IF;
355 
356  -- update counter for records to be deleted
357  IF l_access_id_tbl.count > 0 THEN
358     FORALL i IN 1..l_access_id_tbl.count
359         UPDATE csm_mtl_serial_numbers_acc
360         SET    counter = counter - 1
361               ,last_update_date = SYSDATE
362               ,last_updated_by = fnd_global.user_id
363         WHERE access_id = l_access_id_tbl(i);
364 
365    l_access_id_tbl.delete;
366  END IF;
367 
368  -- delete all access_id's that have counter = 0
369  OPEN l_delete_serial_number_acc(p_user_id);
370  FETCH l_delete_serial_number_acc BULK COLLECT INTO l_access_id_tbl;
371  CLOSE l_delete_serial_number_acc;
372 
373  IF l_access_id_tbl.count > 0 THEN
374    CSM_UTIL_PKG.LOG(l_access_id_tbl.count || ' records marked delete on csm_mtl_serial_numbers for resource ' || p_resource_id ,
375                          'CSM_SERIAL_NUMBERS_EVENT_PKG.UPDATE_MTL_SERIAL_NUMBERS',FND_LOG.LEVEL_STATEMENT);
376 
377    -- make dirty calls
378    FOR i IN 1..l_access_id_tbl.count LOOP
379       l_markdirty := csm_util_pkg.MakeDirtyForResource(g_pub_item,
380                                                        l_access_id_tbl(i),
381                                                        p_resource_id,
382                                                        asg_download.del,
383                                                        l_run_date);
384    END LOOP;
385 
386    FORALL i IN 1..l_access_id_tbl.count
387       DELETE csm_mtl_serial_numbers_acc WHERE ACCESS_ID = l_access_id_tbl(i);
388 
389    l_access_id_tbl.DELETE;
390  END IF;
391 
392  CSM_UTIL_PKG.LOG('Leaving CSM_SERIAL_NUMBERS_EVENT_PKG.UPDATE_MTL_SERIAL_NUMBERS ',
393                          'CSM_SERIAL_NUMBERS_EVENT_PKG.UPDATE_MTL_SERIAL_NUMBERS',FND_LOG.LEVEL_PROCEDURE);
394 
395  EXCEPTION
396   WHEN others THEN
397      l_sqlerrno := to_char(SQLCODE);
398      l_sqlerrmsg := substr(SQLERRM, 1,2000);
399      CSM_UTIL_PKG.LOG('Exception in CSM_SERIAL_NUMBERS_EVENT_PKG.UPDATE_MTL_SERIAL_NUMBERS: ' || l_sqlerrno || ':' || l_sqlerrmsg,
400                          'CSM_SERIAL_NUMBERS_EVENT_PKG.UPDATE_MTL_SERIAL_NUMBERS',FND_LOG.LEVEL_EXCEPTION);
401 
402 END UPDATE_MTL_SERIAL_NUMBERS;
403 
404 PROCEDURE refresh_mtl_serial_numbers_acc(p_status OUT NOCOPY VARCHAR2,
405                                        p_message OUT NOCOPY VARCHAR2)
406 IS
407 PRAGMA AUTONOMOUS_TRANSACTION;
408 l_prog_update_date 			   jtm_con_request_data.last_run_date%TYPE;
409 l_all_omfs_palm_resource_list  asg_download.user_list;
410 l_valid_omfs_resource_list 	   asg_download.user_list;
411 l_null_palm_omfs_resource_list asg_download.user_list;
412 l_user_palm_organization_id    mtl_system_items.organization_id%TYPE;
413 l_usr_list_for_serial 		   asg_download.user_list;
414 l_rsrc_list_for_serial 		   asg_download.user_list;
415 l_last_run_date 			   jtm_con_request_data.last_run_date%TYPE;
416 l_run_date DATE;
417 l_user_id  fnd_user.user_id%TYPE;
418 l_sqlerrno varchar2(20);
419 l_sqlerrmsg varchar2(2000);
420 
421 CURSOR l_last_run_date_csr
422 IS
423 SELECT nvl(last_run_date, (sysdate - 365*50))
424 FROM jtm_con_request_data
425 WHERE package_name = 'CSM_SERIAL_NUMBERS_EVENT_PKG'
426 AND procedure_name = 'REFRESH_MTL_SERIAL_NUMBERS_ACC';
427 
428 CURSOR l_user_id_csr (p_resourceid IN number)
429 IS
430 SELECT user_id
431 FROM asg_user
432 WHERE resource_id = p_resourceid;
433 
434 CURSOR l_usr_rsrc_list_serial
435 IS
436 SELECT
437 au.resource_id,
438 au.user_id
439 FROM asg_user_pub_resps aupr,
440      asg_user au
441 WHERE aupr.pub_name = 'SERVICEP'
442 AND  au.user_name = aupr.user_name
443 AND  au.owner_id  = au.user_id
444 AND  au.enabled   = 'Y';
445 
446 BEGIN
447  l_run_date := SYSDATE;
448 
449  CSM_UTIL_PKG.LOG('Entering CSM_SERIAL_NUMBERS_EVENT_PKG.refresh_mtl_serial_numbers_acc ',
450                          'CSM_SERIAL_NUMBERS_EVENT_PKG.refresh_mtl_serial_numbers_acc',FND_LOG.LEVEL_PROCEDURE);
451 
452  -- R12 Serial Number implementation
453  IF l_usr_list_for_serial.COUNT > 0 THEN
454  	l_usr_list_for_serial.DELETE;
455  END IF;
456 
457  IF l_rsrc_list_for_serial.COUNT > 0 THEN
458  	l_rsrc_list_for_serial.DELETE;
459  END IF;
460 
461  OPEN l_last_run_date_csr;
462  FETCH l_last_run_date_csr INTO l_last_run_date;
463  CLOSE l_last_run_date_csr;
464 
465  OPEN l_usr_rsrc_list_serial;
466  FETCH l_usr_rsrc_list_serial BULK COLLECT INTO l_rsrc_list_for_serial,l_usr_list_for_serial;
467  CLOSE l_usr_rsrc_list_serial;
468  IF l_usr_list_for_serial.COUNT > 0 THEN
469   FOR l_count in 1..l_usr_list_for_serial.COUNT LOOP
470     l_user_palm_organization_id:=csm_profile_pkg.get_organization_id(l_usr_list_for_serial(l_count));
471     --updating/deleting serial numbers already present in the ACC
472     update_mtl_serial_numbers(l_user_palm_organization_id,l_last_run_date,l_rsrc_list_for_serial(l_count),l_usr_list_for_serial(l_count));
473     COMMIT;
474        --inserting new serial numbers
475     insert_mtl_serial_numbers(l_user_palm_organization_id,l_last_run_date,l_rsrc_list_for_serial(l_count),l_usr_list_for_serial(l_count));
476     COMMIT;
477   END LOOP;
478  END IF;
479 
480  -- update last_run_date
481  UPDATE jtm_con_request_data
482  SET last_run_date = l_run_date
483  WHERE package_name = 'CSM_SERIAL_NUMBERS_EVENT_PKG'
484  AND procedure_name = 'REFRESH_MTL_SERIAL_NUMBERS_ACC';
485 
486  COMMIT;
487 
488  CSM_UTIL_PKG.LOG('Leaving CSM_SERIAL_NUMBERS_EVENT_PKG.refresh_mtl_serial_numbers_acc ',
489                          'CSM_SERIAL_NUMBERS_EVENT_PKG.refresh_mtl_serial_numbers_acc',FND_LOG.LEVEL_PROCEDURE);
490 
491  p_status := 'FINE';
492  p_message :=  'CSM_SERIAL_NUMBERS_EVENT_PKG.REFRESH_MTL_SERIAL_NUMBERS_ACC executed successfully';
493 
494  EXCEPTION
495   WHEN others THEN
496      l_sqlerrno := to_char(SQLCODE);
497      l_sqlerrmsg := substr(SQLERRM, 1,2000);
498      ROLLBACK;
499      p_status := 'ERROR';
500      p_message := 'Error in CSM_SERIAL_NUMBERS_EVENT_PKG.REFRESH_MTL_SERIAL_NUMBERS_ACC: ' || l_sqlerrno || ':' || l_sqlerrmsg;
501      CSM_UTIL_PKG.LOG('Exception in CSM_SERIAL_NUMBERS_EVENT_PKG.REFRESH_MTL_SERIAL_NUMBERS_ACC: ' || l_sqlerrno || ':' || l_sqlerrmsg,
502                          'CSM_SERIAL_NUMBERS_EVENT_PKG.REFRESH_MTL_SERIAL_NUMBERS_ACC',FND_LOG.LEVEL_EXCEPTION);
503 
504 END REFRESH_MTL_SERIAL_NUMBERS_ACC;
505 
506 PROCEDURE DELETE_OLD_ORG_SERIAL_NUMBERS(p_organization_id IN number
507                                         , p_user_id     IN number
508                                         , p_resource_id IN number)
509 IS
510 TYPE access_id_tbl_typ  IS TABLE OF csm_mtl_serial_numbers_acc.access_id%TYPE INDEX BY BINARY_INTEGER;
511 l_access_id_tbl  access_id_tbl_typ;
512 l_mark_dirty boolean;
513 l_run_date date;
514 l_sqlerrno  varchar2(20);
515 l_sqlerrmsg varchar2(2000);
516 
517 -- make delete dirty calls for serial numbers with counter=1; do not delete from acc
518 -- since delete will be done based on csp_inv_loc_assignment data
519 CURSOR l_del_mtl_serial_numbers_csr(p_organizationid IN number,
520                                     p_userid IN number)
521 IS
522 SELECT access_id
523 FROM csm_mtl_serial_numbers_acc
524 WHERE user_id = p_userid
525 AND current_organization_id = p_organizationid
526 AND counter = 0;
527 
528 BEGIN
529  CSM_UTIL_PKG.LOG('Entering CSM_MTL_SERIAL_NUMBERS_EVENT_PKG.DELETE_OLD_ORG_SERIAL_NUMBERS ',
530                          'CSM_MTL_SERIAL_NUMBERS_EVENT_PKG.DELETE_OLD_ORG_SERIAL_NUMBERS',FND_LOG.LEVEL_PROCEDURE);
531 
532  l_run_date := SYSDATE;
533 
534 
535  CSM_UTIL_PKG.LOG('Leaving CSM_MTL_SERIAL_NUMBERS_EVENT_PKG.DELETE_OLD_ORG_SERIAL_NUMBERS ',
536                          'CSM_MTL_SERIAL_NUMBERS_EVENT_PKG.DELETE_OLD_ORG_SERIAL_NUMBERS',FND_LOG.LEVEL_PROCEDURE);
537 
538  EXCEPTION
539   WHEN others THEN
540      l_sqlerrno := to_char(SQLCODE);
541      l_sqlerrmsg := substr(SQLERRM, 1,2000);
542 --logm('Exception ' || l_sqlerrmsg);
543      CSM_UTIL_PKG.LOG('Exception in CSM_MTL_SERIAL_NUMBERS_EVENT_PKG.DELETE_OLD_ORG_SERIAL_NUMBERS: ' || l_sqlerrno || ':' || l_sqlerrmsg,
544                          'CSM_MTL_SERIAL_NUMBERS_EVENT_PKG.DELETE_OLD_ORG_SERIAL_NUMBERS',FND_LOG.LEVEL_EXCEPTION);
545 
546 END DELETE_OLD_ORG_SERIAL_NUMBERS;
547 
548 
549 PROCEDURE GET_NEW_ORG_SERIAL_NUMBERS(p_organization_id IN number
550                                         , p_user_id     IN number
551                                         , p_resource_id IN number)
552 IS
553 TYPE access_id_tbl_typ  IS TABLE OF csm_mtl_serial_numbers_acc.access_id%TYPE INDEX BY BINARY_INTEGER;
554 l_access_id_tbl  access_id_tbl_typ;
555 l_mark_dirty boolean;
556 l_run_date date;
557 l_sqlerrno  varchar2(20);
558 l_sqlerrmsg varchar2(2000);
559 
560 -- make insert dirty calls for serial numbers with counter=1;
561 -- since data with counter>1 would already be existing on the palm
562 CURSOR l_del_mtl_serial_numbers_csr(p_organizationid IN number,
563                                     p_userid IN number)
564 IS
565 SELECT access_id
566 FROM csm_mtl_serial_numbers_acc
567 WHERE user_id = p_userid
568 AND current_organization_id = p_organizationid
569 AND counter = 1;
570 
571 BEGIN
572  CSM_UTIL_PKG.LOG('Entering CSM_MTL_SERIAL_NUMBERS_EVENT_PKG.GET_NEW_ORG_SERIAL_NUMBERS ',
573                          'CSM_MTL_SERIAL_NUMBERS_EVENT_PKG.GET_NEW_ORG_SERIAL_NUMBERS',FND_LOG.LEVEL_PROCEDURE);
574 
575  l_run_date := SYSDATE;
576 
577 
578  CSM_UTIL_PKG.LOG('Leaving CSM_MTL_SERIAL_NUMBERS_EVENT_PKG.GET_NEW_ORG_SERIAL_NUMBERS ',
579                          'CSM_MTL_SERIAL_NUMBERS_EVENT_PKG.GET_NEW_ORG_SERIAL_NUMBERS',FND_LOG.LEVEL_PROCEDURE);
580 
581  EXCEPTION
582   WHEN others THEN
583      l_sqlerrno := to_char(SQLCODE);
584      l_sqlerrmsg := substr(SQLERRM, 1,2000);
585      CSM_UTIL_PKG.LOG('Exception in CSM_MTL_SERIAL_NUMBERS_EVENT_PKG.GET_NEW_ORG_SERIAL_NUMBERS: ' || l_sqlerrno || ':' || l_sqlerrmsg,
586                          'CSM_MTL_SERIAL_NUMBERS_EVENT_PKG.GET_NEW_ORG_SERIAL_NUMBERS',FND_LOG.LEVEL_EXCEPTION);
587 
588 
589 END GET_NEW_ORG_SERIAL_NUMBERS;
590 
591 -- currently not being used as serial numbers are not downloaded
592 PROCEDURE INV_LOC_ASS_MSN_MAKE_DIRTY_I(p_csp_inv_loc_assignment_id IN NUMBER, p_user_id IN NUMBER)
593 IS
594 l_sqlerrno VARCHAR2(20);
595 l_sqlerrmsg VARCHAR2(4000);
596 l_error_msg VARCHAR2(4000);
597 l_return_status VARCHAR2(2000);
598 
599 BEGIN
600    CSM_UTIL_PKG.LOG('Entering INV_LOC_ASS_MSN_MAKE_DIRTY_I for csp_inv_loc_assignment_id: ' || p_csp_inv_loc_assignment_id,
601                                    'CSM_SERIAL_NUMBERS_EVENT_PKG.INV_LOC_ASS_MSN_MAKE_DIRTY_I',FND_LOG.LEVEL_PROCEDURE);
602 
603    CSM_UTIL_PKG.LOG('Leaving INV_LOC_ASS_MSN_MAKE_DIRTY_I for csp_inv_loc_assignment_id: ' || p_csp_inv_loc_assignment_id,
604                                    'CSM_SERIAL_NUMBERS_EVENT_PKG.INV_LOC_ASS_MSN_MAKE_DIRTY_I',FND_LOG.LEVEL_PROCEDURE);
605 
606 EXCEPTION
607   	WHEN OTHERS THEN
608         l_sqlerrno := to_char(SQLCODE);
609         l_sqlerrmsg := substr(SQLERRM, 1,2000);
610         l_error_msg := ' Exception in  INV_LOC_ASS_MSN_MAKE_DIRTY_I for csp_inv_loc_assignment_id:'
611                        || to_char(p_csp_inv_loc_assignment_id) || ':' || l_sqlerrno || ':' || l_sqlerrmsg;
612         CSM_UTIL_PKG.LOG(l_error_msg, 'CSM_SERIAL_NUMBERS_EVENT_PKG.INV_LOC_ASS_MSN_MAKE_DIRTY_I',FND_LOG.LEVEL_EXCEPTION);
613         RAISE;
614 END INV_LOC_ASS_MSN_MAKE_DIRTY_I;
615 
616 -- currently not being used as serial numbers are not downloaded
617 PROCEDURE INV_LOC_ASS_MSN_MAKE_DIRTY_D(p_csp_inv_loc_assignment_id IN NUMBER,
618                                        p_user_id IN NUMBER)
619 IS
620 l_sqlerrno VARCHAR2(20);
621 l_sqlerrmsg VARCHAR2(4000);
622 l_error_msg VARCHAR2(4000);
623 l_return_status VARCHAR2(2000);
624 
625 BEGIN
626    CSM_UTIL_PKG.LOG('Entering INV_LOC_ASS_MSN_MAKE_DIRTY_D for csp_inv_loc_assignment_id: ' || p_csp_inv_loc_assignment_id,
627                                    'CSM_SERIAL_NUMBERS_EVENT_PKG.INV_LOC_ASS_MSN_MAKE_DIRTY_D',FND_LOG.LEVEL_PROCEDURE);
628 
629    CSM_UTIL_PKG.LOG('Leaving INV_LOC_ASS_MSN_MAKE_DIRTY_D for csp_inv_loc_assignment_id: ' || p_csp_inv_loc_assignment_id,
630                                    'CSM_SERIAL_NUMBERS_EVENT_PKG.INV_LOC_ASS_MSN_MAKE_DIRTY_D',FND_LOG.LEVEL_PROCEDURE);
631 EXCEPTION
632   	WHEN OTHERS THEN
633         l_sqlerrno := to_char(SQLCODE);
634         l_sqlerrmsg := substr(SQLERRM, 1,2000);
635         l_error_msg := ' Exception in  INV_LOC_ASS_MSN_MAKE_DIRTY_D for csp_inv_loc_assignment_id:'
636                        || to_char(p_csp_inv_loc_assignment_id) || ':' || l_sqlerrno || ':' || l_sqlerrmsg;
637         CSM_UTIL_PKG.LOG(l_error_msg, 'CSM_SERIAL_NUMBERS_EVENT_PKG.INV_LOC_ASS_MSN_MAKE_DIRTY_D',FND_LOG.LEVEL_EXCEPTION);
638         RAISE;
639 END INV_LOC_ASS_MSN_MAKE_DIRTY_D;
640 
641 PROCEDURE RECEIVED_MTL_SERIAL_NUM(p_org_id IN NUMBER,p_subinv_code IN VARCHAR2, p_item_id IN NUMBER,p_serial_number IN VARCHAR2,p_user_id IN NUMBER)
642 IS
643 CURSOR received_srl_item
644 IS
645  SELECT  csm_mtl_serial_numbers_acc_s.nextval, inventory_item_id, serial_number, current_organization_id,au.user_id
646  FROM 	 mtl_serial_numbers,asg_user au
647  WHERE   current_status =3         -- html5 supports only 3
648  AND     current_organization_id=p_org_id
649  AND     current_subinventory_code = p_subinv_code
650  AND     inventory_item_id = p_item_id
651  AND     serial_number = p_serial_number
652  AND     au.user_id = p_user_id
653  AND   	( current_subinventory_code, current_organization_id )
654        IN ( SELECT subinventory_code ,organization_id
655        		FROM csp_inv_loc_assignments
656        		WHERE resource_id = au.resource_id
657 			AND   resource_type='RS_EMPLOYEE'
658        		AND SYSDATE BETWEEN nvl( effective_date_start, SYSDATE ) AND nvl( effective_date_end , SYSDATE ))
659  AND  	 ( inventory_item_id, serial_number, current_organization_id ) NOT IN (
660            SELECT inventory_item_id, serial_number, current_organization_id
661        	   FROM csm_mtl_serial_numbers_acc
662        	   WHERE user_id = au.user_id );
663 
664 l_tab_access_id   		ASG_DOWNLOAD.ACCESS_LIST;
665 l_tab_user_id 			ASG_DOWNLOAD.USER_LIST;
666 l_tab_item_id 			ASG_DOWNLOAD.ACCESS_LIST;
667 l_tab_org_id 			ASG_DOWNLOAD.ACCESS_LIST;
668 l_markdirty             BOOLEAN;
669 
670 TYPE serial_numbers_tbl_typ IS TABLE OF mtl_serial_numbers.serial_number%TYPE INDEX BY binary_integer;
671 l_tab_srl serial_numbers_tbl_typ;
672 
673 BEGIN
674 
675    CSM_UTIL_PKG.LOG('Entered RECEIVED_MTL_SERIAL_NUM', 'CSM_SERIAL_NUMBERS_EVENT_PKG.RECEIVED_MTL_SERIAL_NUM',FND_LOG.LEVEL_STATEMENT);
676 
677 OPEN received_srl_item;
678 FETCH received_srl_item BULK COLLECT INTO  l_tab_access_id,l_tab_item_id,l_tab_srl,l_tab_org_id,l_tab_user_id;
679 CLOSE received_srl_item;
680 
681 IF l_tab_access_id.COUNT > 0 THEN
682    FORALL i IN 1..l_tab_access_id.count
683       INSERT INTO csm_mtl_serial_numbers_acc(access_id, user_id, serial_number, inventory_item_id, current_organization_id,
684                                counter, created_by, creation_date, last_updated_by, last_update_date, last_update_login)
685                         VALUES (l_tab_access_id(i), l_tab_user_id(i), l_tab_srl(i), l_tab_item_id(i), l_tab_org_id(i),
686                                 1, fnd_global.user_id, sysdate, fnd_global.user_id, sysdate, fnd_global.login_id);
687 
688     CSM_UTIL_PKG.LOG('Bulk inserted ' || l_tab_access_id.count || ' records into csm_mtl_serial_numbers_acc ',
689                          'CSM_SERIAL_NUMBERS_EVENT_PKG.RECEIVED_MTL_SERIAL_NUM',FND_LOG.LEVEL_STATEMENT);
690 
691 	l_markdirty := asg_download.mark_dirty(
692 			  P_PUB_ITEM         => g_pub_item
693 			, p_accessList       => l_tab_access_id
694 			, p_userid_list      => l_tab_user_id
695 			, p_dml_type         => 'I'
696 			, P_TIMESTAMP        => sysdate
697 			);
698 END IF;
699    CSM_UTIL_PKG.LOG('Leaving RECEIVED_MTL_SERIAL_NUM ', 'CSM_SERIAL_NUMBERS_EVENT_PKG.RECEIVED_MTL_SERIAL_NUM',FND_LOG.LEVEL_STATEMENT);
700 END RECEIVED_MTL_SERIAL_NUM;
701 
702 END CSM_SERIAL_NUMBERS_EVENT_PKG;