[Home] [Help]
PACKAGE BODY: APPS.CSL_MTL_SERIAL_NUMBERS_ACC_PKG
Source
1 PACKAGE BODY CSL_MTL_SERIAL_NUMBERS_ACC_PKG AS
2 /* $Header: cslsnacb.pls 115.6 2004/09/30 22:10:00 appldev ship $ */
3
4 /*** Globals ***/
5 g_debug_level NUMBER; -- debug level
6
7 g_publication_item_name CONSTANT JTM_HOOK_UTIL_PKG.t_publication_item_list :=
8 JTM_HOOK_UTIL_PKG.t_publication_item_list('MTL_SERIAL_NUMBERS');
9 g_table_name CONSTANT VARCHAR2(30) := 'MTL_SERIAL_NUMBERS';
10
11
12
13 /**/
14 PROCEDURE INSERT_SERIAL_NUMBERS( p_resource_id IN NUMBER )
15 IS
16 TYPE item_Tab IS TABLE OF mtl_serial_numbers.inventory_item_id%TYPE INDEX BY BINARY_INTEGER;
17 TYPE serial_Tab IS TABLE OF mtl_serial_numbers.serial_number%TYPE INDEX BY BINARY_INTEGER;
18
19 sequences ASG_DOWNLOAD.ACCESS_LIST;
20 resources ASG_DOWNLOAD.USER_LIST;
21 items item_Tab;
22 serials serial_Tab;
23
24 l_dummy BOOLEAN;
25
26 BEGIN
27 /*** get debug level ***/
28 g_debug_level := JTM_HOOK_UTIL_PKG.Get_Debug_Level;
29 IF g_debug_level = JTM_HOOK_UTIL_PKG.G_DEBUG_LEVEL_FULL THEN
30 jtm_message_log_pkg.Log_Msg
31 ( p_resource_id
32 , g_table_name
33 , 'Entering INSERT_SERIAL_NUMBERS'
34 , JTM_HOOK_UTIL_PKG.G_DEBUG_LEVEL_FULL
35 );
36 END IF;
37
38 IF g_debug_level >= JTM_HOOK_UTIL_PKG.G_DEBUG_LEVEL_MEDIUM THEN
39 jtm_message_log_pkg.Log_Msg
40 ( p_resource_id
41 , g_table_name
42 , 'Inserting records for resource: '||p_resource_id
43 , JTM_HOOK_UTIL_PKG.G_DEBUG_LEVEL_MEDIUM);
44 END IF;
45
46 /*Block insert every item from given subinventory/org not yet in acc table*/
47 SELECT JTM_ACC_TABLE_S.NEXTVAL, INVENTORY_ITEM_ID, SERIAL_NUMBER, p_resource_id
48 BULK COLLECT INTO sequences, items, serials, resources
49 FROM MTL_SERIAL_NUMBERS
50 WHERE CURRENT_STATUS IN (1,3)
51 AND ( CURRENT_SUBINVENTORY_CODE, CURRENT_ORGANIZATION_ID ) IN (
52 SELECT SUBINVENTORY_CODE
53 , ORGANIZATION_ID
54 FROM CSP_INV_LOC_ASSIGNMENTS
55 WHERE RESOURCE_ID = p_resource_id
56 AND RESOURCE_TYPE = 'RS_EMPLOYEE'
57 AND SYSDATE BETWEEN NVL( EFFECTIVE_DATE_START, SYSDATE )
58 AND NVL( EFFECTIVE_DATE_END , SYSDATE ))
59 AND ( INVENTORY_ITEM_ID, SERIAL_NUMBER ) NOT IN (
60 SELECT INVENTORY_ITEM_ID, SERIAL_NUMBER
61 FROM JTM_MTL_SERIAL_NUMBERS_ACC
62 WHERE RESOURCE_ID = p_resource_id );
63
64 IF sequences.COUNT > 0 THEN
65 FORALL i IN sequences.FIRST..sequences.LAST
66 INSERT INTO JTM_MTL_SERIAL_NUMBERS_ACC(
67 ACCESS_ID, LAST_UPDATE_DATE, LAST_UPDATED_BY, CREATION_DATE, CREATED_BY
68 , COUNTER, RESOURCE_ID, INVENTORY_ITEM_ID, SERIAL_NUMBER ) VALUES (
69 sequences(i), sysdate, 1, sysdate, 1, 1, p_resource_id, items(i), serials(i));
70
71 /*** 1 or more acc rows retrieved -> push to resource ***/
72 IF g_debug_level >= JTM_HOOK_UTIL_PKG.G_DEBUG_LEVEL_MEDIUM THEN
73 jtm_message_log_pkg.Log_Msg
74 ( p_resource_id
75 , g_table_name
76 , 'Pushing ' || sequences.COUNT || ' inserted record(s) to resource: '||p_resource_id
77 , JTM_HOOK_UTIL_PKG.G_DEBUG_LEVEL_MEDIUM
78 );
79 END IF;
80 l_dummy := asg_download.markdirty(
81 P_PUB_ITEM => g_publication_item_name(1)
82 , P_ACCESSLIST => sequences
83 , P_RESOURCELIST => resources
84 , P_DML_TYPE => 'I'
85 , P_TIMESTAMP => SYSDATE
86 );
87
88 END IF;
89 IF g_debug_level = JTM_HOOK_UTIL_PKG.G_DEBUG_LEVEL_FULL THEN
90 jtm_message_log_pkg.Log_Msg
91 ( p_resource_id
92 , g_table_name
93 , 'Leaving INSERT_SERIAL_NUMBERS'
94 , JTM_HOOK_UTIL_PKG.G_DEBUG_LEVEL_FULL
95 );
96 END IF;
97 EXCEPTION
98 WHEN OTHERS THEN
99 jtm_message_log_pkg.Log_Msg
100 ( p_resource_id
101 , g_table_name
102 , 'INSERT_SERIAL_NUMBERS'||fnd_global.local_chr(10)||
103 'Error: '||sqlerrm
104 , JTM_HOOK_UTIL_PKG.g_debug_level_error);
105 RAISE;
106 END INSERT_SERIAL_NUMBERS;
107
108 /**/
109 PROCEDURE DELETE_SERIAL_NUMBERS
110 IS
111 l_tab_access_id ASG_DOWNLOAD.ACCESS_LIST;
112 l_tab_resource_id ASG_DOWNLOAD.USER_LIST;
113 l_dummy BOOLEAN;
114
115 /*Delete all serial numbers from acc table for which the assigned subinventory is no more,
116 or for which the status has changed*/
117 CURSOR c_remove IS
118 /* Performance bug (3920090)fixing */
119 /*
120 SELECT acc.ACCESS_ID, acc.RESOURCE_ID
121 FROM JTM_MTL_SERIAL_NUMBERS_ACC acc
122 , MTL_SERIAL_NUMBERS msn
123 WHERE msn.INVENTORY_ITEM_ID = acc.INVENTORY_ITEM_ID
124 AND msn.SERIAL_NUMBER = acc.SERIAL_NUMBER
125 AND ( msn.CURRENT_SUBINVENTORY_CODE, msn.CURRENT_ORGANIZATION_ID ) NOT IN (
126 SELECT SUBINVENTORY_CODE
127 , ORGANIZATION_ID
128 FROM CSP_INV_LOC_ASSIGNMENTS
129 WHERE RESOURCE_ID = acc.RESOURCE_ID
130 AND SYSDATE BETWEEN NVL( EFFECTIVE_DATE_START, SYSDATE )
131 AND NVL( EFFECTIVE_DATE_END , SYSDATE ))
132 UNION
133 SELECT acc.ACCESS_ID, acc.RESOURCE_ID
134 FROM JTM_MTL_SERIAL_NUMBERS_ACC acc
135 , MTL_SERIAL_NUMBERS msn
136 WHERE msn.INVENTORY_ITEM_ID = acc.INVENTORY_ITEM_ID
137 AND msn.SERIAL_NUMBER = acc.SERIAL_NUMBER
138 AND msn.CURRENT_STATUS NOT IN (1,3);
139 */
140 SELECT /*+ INDEX (msn MTL_SERIAL_NUMBERS_U1) */
141 acc.ACCESS_ID, acc.RESOURCE_ID
142 FROM JTM_MTL_SERIAL_NUMBERS_ACC acc
143 , MTL_SERIAL_NUMBERS msn
144 WHERE msn.SERIAL_NUMBER = acc.SERIAL_NUMBER
145 AND msn.INVENTORY_ITEM_ID = acc.INVENTORY_ITEM_ID
146 AND (NOT EXISTS
147 (SELECT 1
148 FROM CSP_INV_LOC_ASSIGNMENTS cila
149 WHERE cila.RESOURCE_ID = acc.RESOURCE_ID
150 AND cila.organization_id = msn.current_organization_id
151 AND cila.subinventory_code = msn.current_subinventory_code
152 AND SYSDATE BETWEEN NVL( cila.EFFECTIVE_DATE_START, SYSDATE )
153 AND NVL( cila.EFFECTIVE_DATE_END , SYSDATE)
154 )
155 OR msn.CURRENT_STATUS NOT IN (1,3)
156 );
157
158 BEGIN
159 /*** get debug level ***/
160 g_debug_level := JTM_HOOK_UTIL_PKG.Get_Debug_Level;
161 IF g_debug_level = JTM_HOOK_UTIL_PKG.G_DEBUG_LEVEL_FULL THEN
162 jtm_message_log_pkg.Log_Msg
163 ( 0
164 , g_table_name
165 , 'Entering DELETE_SERIAL_NUMBERS'
166 , JTM_HOOK_UTIL_PKG.G_DEBUG_LEVEL_FULL
167 );
168 END IF;
169
170 /*Delete not used records*/
171 OPEN c_remove;
172 FETCH c_remove BULK COLLECT INTO l_tab_access_id, l_tab_resource_id;
173 /*Call oracle lite*/
174 IF l_tab_access_id.COUNT > 0 THEN
175 /*** 1 or more acc rows retrieved -> push to resource ***/
176 IF g_debug_level >= JTM_HOOK_UTIL_PKG.G_DEBUG_LEVEL_MEDIUM THEN
177 jtm_message_log_pkg.Log_Msg
178 ( 0
179 , g_table_name
180 , 'Deleting ' || l_tab_access_id.COUNT || ' invalid record(s)'
181 , JTM_HOOK_UTIL_PKG.G_DEBUG_LEVEL_MEDIUM
182 );
183 END IF;
184 /*** push to oLite using asg_download ***/
185 l_dummy := asg_download.markdirty(
186 P_PUB_ITEM => g_publication_item_name(1)
187 , P_ACCESSLIST => l_tab_access_id
188 , P_RESOURCELIST => l_tab_resource_id
189 , P_DML_TYPE => 'D'
190 , P_TIMESTAMP => SYSDATE
191 );
192
193 /*To avoid a mismatch only delete records which are marked dirty*/
194 FORALL i IN l_tab_access_id.FIRST..l_tab_access_id.LAST
195 DELETE JTM_MTL_SERIAL_NUMBERS_ACC
196 WHERE ACCESS_ID = l_tab_access_id(i);
197 END IF;
198 CLOSE c_remove;
199
200 IF g_debug_level = JTM_HOOK_UTIL_PKG.G_DEBUG_LEVEL_FULL THEN
201 jtm_message_log_pkg.Log_Msg
202 ( 0
203 , g_table_name
204 , 'Leaving DELETE_SERIAL_NUMBERS'
205 , JTM_HOOK_UTIL_PKG.G_DEBUG_LEVEL_FULL
206 );
207 END IF;
208
209 EXCEPTION
210 WHEN OTHERS THEN
211 jtm_message_log_pkg.Log_Msg
212 ( 0
213 , g_table_name
214 , 'DELETE_SERIAL_NUMBERS'||fnd_global.local_chr(10)||
215 'Error: '||sqlerrm
216 , JTM_HOOK_UTIL_PKG.g_debug_level_error);
217 RAISE;
218 END DELETE_SERIAL_NUMBERS;
219
220 PROCEDURE UPDATE_SERIAL_NUMBERS( p_date IN DATE )
221 IS
222 /*Get all existing and valid records which are changed*/
223 CURSOR c_changed( b_date DATE ) IS
224 SELECT acc.ACCESS_ID, acc.RESOURCE_ID
225 FROM JTM_MTL_SERIAL_NUMBERS_ACC acc
226 , MTL_SERIAL_NUMBERS msn
227 WHERE msn.INVENTORY_ITEM_ID = acc.INVENTORY_ITEM_ID
228 AND msn.SERIAL_NUMBER = acc.SERIAL_NUMBER
229 AND msn.LAST_UPDATE_DATE >= p_date
230 AND ( msn.CURRENT_SUBINVENTORY_CODE, msn.CURRENT_ORGANIZATION_ID ) IN (
231 SELECT SUBINVENTORY_CODE
232 , ORGANIZATION_ID
233 FROM CSP_INV_LOC_ASSIGNMENTS
234 WHERE RESOURCE_ID = acc.RESOURCE_ID
235 AND SYSDATE BETWEEN NVL( EFFECTIVE_DATE_START, SYSDATE )
236 AND NVL( EFFECTIVE_DATE_END , SYSDATE ));
237
238 l_tab_access_id ASG_DOWNLOAD.ACCESS_LIST;
239 l_tab_resource_id ASG_DOWNLOAD.USER_LIST;
240 l_dummy BOOLEAN;
241
242 BEGIN
243 /*** get debug level ***/
244 g_debug_level := JTM_HOOK_UTIL_PKG.Get_Debug_Level;
245 IF g_debug_level = JTM_HOOK_UTIL_PKG.G_DEBUG_LEVEL_FULL THEN
246 jtm_message_log_pkg.Log_Msg
247 ( 0
248 , g_table_name
249 , 'Entering UPDATE_SERIAL_NUMBERS'
250 , JTM_HOOK_UTIL_PKG.G_DEBUG_LEVEL_FULL
251 );
252 END IF;
253
254 /*Fetch all changed system items that are in the acc table*/
255 OPEN c_changed( p_date );
256 FETCH c_changed BULK COLLECT INTO l_tab_access_id, l_tab_resource_id;
257 /*Call oracle lite*/
258 IF l_tab_access_id.COUNT > 0 THEN
259 /*** 1 or more acc rows retrieved -> push to resource ***/
260 IF g_debug_level >= JTM_HOOK_UTIL_PKG.G_DEBUG_LEVEL_MEDIUM THEN
261 jtm_message_log_pkg.Log_Msg
262 ( 0
263 , g_table_name
264 , 'Updating ' || l_tab_access_id.COUNT || ' changed record(s)'
265 , JTM_HOOK_UTIL_PKG.G_DEBUG_LEVEL_MEDIUM
266 );
267 END IF;
268 l_dummy := asg_download.markdirty(
269 P_PUB_ITEM => g_publication_item_name(1)
270 , P_ACCESSLIST => l_tab_access_id
271 , P_RESOURCELIST => l_tab_resource_id
272 , P_DML_TYPE => 'U'
273 , P_TIMESTAMP => SYSDATE
274 );
275
276 END IF;
277 CLOSE c_changed;
278
279 IF g_debug_level = JTM_HOOK_UTIL_PKG.G_DEBUG_LEVEL_FULL THEN
280 jtm_message_log_pkg.Log_Msg
281 ( 0
282 , g_table_name
283 , 'Leaving UPDATE_SERIAL_NUMBERS'
284 , JTM_HOOK_UTIL_PKG.G_DEBUG_LEVEL_FULL
285 );
286 END IF;
287
288 EXCEPTION
289 WHEN OTHERS THEN
290 jtm_message_log_pkg.Log_Msg
291 ( 0
292 , g_table_name
293 , 'UPDATE_SERIAL_NUMBERS'||fnd_global.local_chr(10)||
294 'Error: '||sqlerrm
295 , JTM_HOOK_UTIL_PKG.g_debug_level_error);
296 RAISE;
297 END UPDATE_SERIAL_NUMBERS;
298
299 /**/
300 PROCEDURE CON_REQUEST_SERIAL_NUMBERS
301 IS
302 PRAGMA AUTONOMOUS_TRANSACTION;
303 l_date DATE;
304 l_subinventory_code VARCHAR2(30);
305
306 /*** cursor retrieving list of resources subscribed to publication item ***/
307 CURSOR c_mobile_users
308 IS
309 SELECT res.resource_id
310 FROM asg_pub pub
311 , asg_pub_responsibility pubresp
312 , fnd_user_resp_groups usrresp
313 , fnd_user usr
314 , jtf_rs_resource_extns res
315 , asg_user au
316 WHERE res.resource_id = au.resource_id
317 AND pub.name = 'SERVICEL'
318 AND pub.enabled='Y'
319 AND pub.status='Y'
320 AND pub.pub_id = pubresp.pub_id
321 AND pubresp.responsibility_id = usrresp.responsibility_id
322 AND TRUNC(sysdate) BETWEEN TRUNC(NVL(usrresp.start_date,sysdate))
323 AND TRUNC(NVL(usrresp.end_date,sysdate))
324 AND usrresp.user_id = usr.user_id
325 AND TRUNC(sysdate) BETWEEN TRUNC(NVL(usr.start_date,sysdate))
326 AND TRUNC(NVL(usr.end_date,sysdate))
327 AND usr.user_id = res.user_id
328 AND TRUNC(sysdate) BETWEEN TRUNC(NVL(res.start_date_active,sysdate))
329 AND TRUNC(NVL(res.end_date_active,sysdate));
330
331 /*** get the last run date of the concurent program ***/
332 CURSOR c_LastRundate
333 IS
334 select LAST_RUN_DATE
335 from JTM_CON_REQUEST_DATA
336 where package_name = 'CSL_MTL_SERIAL_NUMBERS_ACC_PKG'
337 AND procedure_name = 'CON_REQUEST_SERIAL_NUMBERS';
338
339 BEGIN
340 /*** get debug level ***/
341 g_debug_level := JTM_HOOK_UTIL_PKG.Get_Debug_Level;
342 IF g_debug_level = JTM_HOOK_UTIL_PKG.G_DEBUG_LEVEL_FULL THEN
343 jtm_message_log_pkg.Log_Msg
344 ( 0
345 , g_table_name
346 , 'Entering CON_REQUEST_SERIAL_NUMBERS'
347 , JTM_HOOK_UTIL_PKG.G_DEBUG_LEVEL_FULL
348 );
349 END IF;
350
351 /*** First retrieve last run date of the conccurent program ***/
352 OPEN c_LastRundate;
353 FETCH c_LastRundate INTO l_date;
354 IF c_LastRundate%FOUND THEN
355 /*Record is seeded so program should run*/
356 IF g_debug_level >= JTM_HOOK_UTIL_PKG.G_DEBUG_LEVEL_MEDIUM THEN
357 jtm_message_log_pkg.Log_Msg
358 ( 0
359 , g_table_name
360 , 'Updating LAST_RUN_DATE from '||l_date||' to '||sysdate
361 , JTM_HOOK_UTIL_PKG.G_DEBUG_LEVEL_MEDIUM
362 );
363 END IF;
364
365 /*Update the last run date*/
366 UPDATE JTM_CON_REQUEST_DATA
367 SET LAST_RUN_DATE = SYSDATE
368 WHERE package_name = 'CSL_MTL_SERIAL_NUMBERS_ACC_PKG'
369 AND procedure_name = 'CON_REQUEST_SERIAL_NUMBERS';
370
371 COMMIT;
372 /*First remove all records no longer required*/
373 DELETE_SERIAL_NUMBERS;
374 COMMIT;
375 /*Second, check for updated serial numbers*/
376 UPDATE_SERIAL_NUMBERS( l_date);
377 COMMIT;
378 FOR r_mobile_user IN c_mobile_users LOOP
379 /*Third, insert all serial numbers that are not yet in the acc table*/
380 INSERT_SERIAL_NUMBERS( r_mobile_user.resource_id );
381 COMMIT;
382 END LOOP;
383 END IF;--c_LastRundate%FOUND
384 CLOSE c_LastRundate;
385
386 IF g_debug_level = JTM_HOOK_UTIL_PKG.G_DEBUG_LEVEL_FULL THEN
387 jtm_message_log_pkg.Log_Msg
388 ( 0
389 , g_table_name
390 , 'Leaving CON_REQUEST_SERIAL_NUMBERS'
391 , JTM_HOOK_UTIL_PKG.G_DEBUG_LEVEL_FULL
392 );
393 END IF;
394 COMMIT;
395 EXCEPTION
396 WHEN OTHERS THEN
397 jtm_message_log_pkg.Log_Msg
398 ( 0
399 , g_table_name
400 , 'CON_REQUEST_SERIAL_NUMBERS'||fnd_global.local_chr(10)||
401 'Error: '||sqlerrm
402 , JTM_HOOK_UTIL_PKG.g_debug_level_error);
403 ROLLBACK;
404 RETURN;
405 END CON_REQUEST_SERIAL_NUMBERS;
406
407 END CSL_MTL_SERIAL_NUMBERS_ACC_PKG;