DBA Data[Home] [Help]

PACKAGE BODY: APPS.CSM_LOBS_PKG

Source


1 PACKAGE BODY CSM_LOBS_PKG AS
2 /* $Header: csmulobb.pls 120.15 2008/01/25 06:53:17 saradhak ship $ */
3 
4 -- MODIFICATION HISTORY
5 -- Person      Date    Comments
6 -- Ravi        06/11/2002
7 -- ---------   ------  ------------------------------------------
8    -- Enter procedure, function bodies as shown below
9 
10 error EXCEPTION;
11 
12 /*** Globals ***/
13 g_object_name  CONSTANT VARCHAR2(30) := 'CSM_LOBS_PKG';  -- package name
14 g_pub_name     CONSTANT VARCHAR2(30) := 'CSF_M_LOBS';  -- publication item name
15 g_debug_level           NUMBER; -- debug level
16 
17 CURSOR c_FND_LOBS( b_user_name VARCHAR2, b_tranid NUMBER) is
18   SELECT
19      CLID$$CS,
20  	 FILE_ID,
21   	 TASK_ASSIGNMENT_ID,
22   	 DESCRIPTION,
23   	 LANGUAGE,
24   	 DMLTYPE$$,
25 	 SEQNO$$,
26 	 TRANID$$,
27 	 VERSION$$,
28 	 ENTITY_NAME,
29 	 PK1_VALUE,
30 	 PK2_VALUE,
31 	 SEQ_NUM,
32 	 FILE_NAME,
33 	 FILE_CONTENT_TYPE,
34 	 USER_NAME,
35 	 LAST_UPDATE_DATE,
36 	 LAST_UPDATED_BY,
37 	 UPDATE_USER,
38 	 CATEGORY,
39 	 USAGE_TYPE,
40 	 DATA_TYPE,
41 	 URL,
42 	 SHORT_TEXT,
43 	 DATA_TYPE_ID,
44 	 DOCUMENT_ID,
45 	 TITLE
46   FROM
47 	 csf_m_lobs_inq
48   WHERE   tranid$$ = b_tranid
49   AND     clid$$cs = b_user_name;
50 
51 /***
52   This procedure is called by APPLY_RECORD when an inserted record is to be processed.
53 ***/
54 
55 PROCEDURE APPLY_INSERT
56          (
57            p_record        IN c_FND_LOBS%ROWTYPE,
58            p_error_msg     OUT NOCOPY    VARCHAR2,
59            x_return_status IN OUT NOCOPY VARCHAR2
60          ) IS
61 
62   -- Variables needed for public API
63   l_seq_num			NUMBER;
64   l_category_id		NUMBER;
65   l_file_id			NUMBER;
66   l_task_assignment_id	NUMBER;--This column in the table has the SR or TASK id
67   l_msg_count 		NUMBER;
68   l_msg_data  		VARCHAR2(240);
69   l_file_access_id 	NUMBER;
70   l_error_msg 		VARCHAR(1024);
71   l_signature_loc 	BLOB;
72   l_signature_raw 	LONG RAW(32000);
73   l_signature_size 	NUMBER;
74   l_language 		asg_user.LANGUAGE%TYPE;
75   l_dummy 			NUMBER;
76   l_category_name   VARCHAR2(240);--need to add value
77   l_file_name		p_record.FILE_NAME%TYPE;
78   l_file_content_type p_record.FILE_CONTENT_TYPE%TYPE;
79   l_entity_name		p_record.ENTITY_NAME%TYPE;
80   l_function_name 	VARCHAR2(240);
81   l_user_id			ASG_USER.USER_ID%TYPE;
82   l_dodirty			BOOLEAN;
83   l_title           VARCHAR2(80);
84   l_schema_name		FND_ORACLE_USERID.ORACLE_USERNAME%TYPE;
85   l_data_type       all_tab_columns.data_type%TYPE;
86   l_data_type_id NUMBER;
87   l_dsql 			VARCHAR2(4000);
88   l_cursorid 		NUMBER;
89   l_result 			NUMBER;
90 
91   -- get the debrief header id for the task_assignment
92   -- use the first debrief header id
93   CURSOR l_debrief_header_id_csr(p_task_assignment_id IN number)
94   IS
95   SELECT debrief_header_id
96   FROM   csf_debrief_headers
97   WHERE  task_assignment_id = p_task_assignment_id
98   ORDER BY debrief_header_id;
99 
100   -- get max seq no for the debrief_header_id
101   CURSOR l_max_seq_no_csr(p_task_assignment_id IN NUMBER, p_language IN VARCHAR2,p_category_name IN VARCHAR2,c_entity_name IN VARCHAR2)
102   IS
103   SELECT nvl(max(fad.seq_num),0)+10
104   FROM   fnd_attached_documents fad,
105          fnd_documents fd
106   WHERE  fad.pk1_value   = to_char(p_task_assignment_id)
107   AND    fd.document_id  = fad.document_id
108   AND    fad.entity_name = c_entity_name
109   AND EXISTS
110          (SELECT 1
111           FROM 	fnd_document_categories_tl cat_tl
112           WHERE cat_tl.category_id 	= fd.category_id
113           AND 	cat_tl.name 		= p_category_name
114           AND 	cat_tl.LANGUAGE 	= p_language
115           );
116 
117 
118   -- get the category_id
119   CURSOR l_category_id_csr(p_language IN VARCHAR2, p_category_name IN VARCHAR2)
120   IS
121   SELECT category_id
122   FROM 	 fnd_document_categories_tl
123   WHERE  name 	  = p_category_name
124   AND 	 LANGUAGE = p_language;
125 
126 --to check if the record exists in the database
127  CURSOR l_lobs_fileid_csr (p_file_id fnd_lobs.file_id%TYPE)
128  IS
129  SELECT 1
130  FROM 	fnd_lobs
131  WHERE 	file_id = p_file_id;
132 
133  CURSOR l_get_language(p_user_name IN VARCHAR2)
134  IS
135  SELECT au.LANGUAGE,au.USER_ID
136  FROM 	asg_user au
137  WHERE 	au.user_name = p_user_name;
138 
139  CURSOR l_get_schema
140  IS
141  SELECT ORACLE_USERNAME from  FND_ORACLE_USERID
142  WHERE ORACLE_ID =883;
143 
144  CURSOR l_get_datatype (c_schema IN FND_ORACLE_USERID.ORACLE_USERNAME%TYPE)
145  IS
146  select data_type from all_tab_columns
147  where table_name 	= 'CSF_M_LOBS_INQ'
148  and   column_name  = 'FILE_DATA'
149  and   OWNER        = c_schema;
150 
151 BEGIN
152 
153   x_return_status := FND_API.G_RET_STS_SUCCESS;
154   l_dodirty		  := FALSE;--mark dirty for datatypeid =6 is not necessary
155 
156   l_error_msg := 'Entering ' || g_object_name || '.APPLY_INSERT'|| ' for PK ' || to_char( p_record.file_id);
157   CSM_UTIL_PKG.LOG   ( l_error_msg ,
158                            'CSM_LOBS_PKG.APPLY_INSERT',
159                            FND_LOG.LEVEL_PROCEDURE );
160 
161   --if attachments are not part of what we support then we leave
162   IF p_record.entity_name NOT IN('JTF_TASKS_B','CS_INCIDENTS','CSF_DEBRIEF_HEADERS') THEN
163 
164   	l_error_msg := 'Leaving ' || g_object_name || '.APPLY_INSERT'||
165 	  			   ' as we are not supporting  Attachment for the entity' || TO_CHAR(p_record.entity_name);
166   	CSM_UTIL_PKG.LOG   ( l_error_msg ,'CSM_LOBS_PKG.APPLY_INSERT',FND_LOG.LEVEL_PROCEDURE );
167   	RETURN;
168 
169   END IF;
170 
171   l_title:=p_record.title;
172   l_data_type_id :=p_record.data_type_id;
173   -- get the language of the user
174   OPEN  l_get_language(p_record.clid$$cs);
175   FETCH l_get_language INTO l_language,l_user_id;
176   CLOSE l_get_language;
177 
178   IF p_record.entity_name = 'JTF_TASKS_B' OR p_record.entity_name = 'CS_INCIDENTS'	THEN
179   	l_category_name   	 := 'MISC';
180   	l_file_name		  	 := p_record.file_name;
181   	l_file_content_type  := p_record.file_content_type;
182   	l_entity_name		 := p_record.entity_name;
183    	l_task_assignment_id := TO_NUMBER (p_record.pk1_value);
184 
185   	IF p_record.entity_name = 'JTF_TASKS_B' THEN --function name is the Name of the Form in which the attachment is displayed
186   		l_function_name		:= 'JTFTKMAN';
187   	ELSIF p_record.entity_name = 'CS_INCIDENTS' THEN
188   		l_function_name		:= 'CSXSRISR';
189   	END IF;
190 
191   ELSIF p_record.entity_name = 'CSF_DEBRIEF_HEADERS'	THEN
192   	--Else is for signature upload for debrief
193   	l_category_name   	:= 'SIGNATURE';
194   	l_file_name		  	:= 'INTERNAL';
195   	l_file_content_type := 'image/bmp';
196   	l_entity_name		:= 'CSF_DEBRIEF_HEADERS';
197   	l_function_name		:= 'CSFFEDBF';
198 -- Bug 5726888
199     l_data_type_id :=6;
200   --required only for signature...
201   -- if debrief_header_id is not passed get the debrief header id using task assignment id
202     l_task_assignment_id:=p_record.pk1_value;
203 
204   	IF ( (p_record.pk1_value IS NULL) AND
205         (p_record.task_assignment_id IS NOT NULL) )
206   	THEN
207      	OPEN l_debrief_header_id_csr(p_record.task_assignment_id);
208      	FETCH l_debrief_header_id_csr INTO l_task_assignment_id;
209      	CLOSE l_debrief_header_id_csr;
210   	END IF;
211   END IF;
212 
213 
214   --setting file id
215   --For lobs we require file id to insert data into fnd_lobs.So we get the file_id from the client
216   --For LOBS we give fileid to the server so that we can avoid the lobs getting downloaded in the client
217   --twice when its uploaded
218   IF l_data_type_id = 6 THEN
219   	   l_file_id := p_record.file_id;
220 
221 -- Bug 5726888
222            IF l_file_id IS NULL AND l_category_name = 'SIGNATURE' THEN
223             l_file_id := p_record.document_id;
224            END IF;
225 	     --verify that the record does not already exist.If already present then pass null so that the api will create the own id
226   		 OPEN 	l_lobs_fileid_csr(l_file_id) ;
227   		 FETCH l_lobs_fileid_csr into l_dummy;
228 
229 		 IF  l_lobs_fileid_csr%FOUND THEN
230 			p_error_msg 	:= 'Duplicate Record: File id ' || to_char(l_file_id)|| ' already exists in fnd_lobs table.So generating a new from fnd sequence';
231        		CSM_UTIL_PKG.LOG( p_error_msg ,'CSM_LOBS_PKG.UPLOAD_SR_TASK_LOB', FND_LOG.LEVEL_ERROR );
232 		    l_file_id := NULL;
233 			--get the file id from the sequence diretly.As the client sent file id is not proper.
234 		    SELECT fnd_lobs_s.nextval
235 			INTO l_file_id
236    			FROM dual;
237 			l_dodirty := TRUE;
238 	     END IF;
239 
240 		 CLOSE l_lobs_fileid_csr;
241   ELSE
242 	   l_file_id := NULL;
243   END IF;
244 
245   -- get the max seq no
246   open  l_max_seq_no_csr(l_task_assignment_id, l_language,l_category_name,l_entity_name);
247   FETCH l_max_seq_no_csr INTO l_seq_num;
248   CLOSE l_max_seq_no_csr;
249 
250   -- get the category id for Signature
251   OPEN  l_category_id_csr(l_language,l_category_name);
252   FETCH l_category_id_csr INTO l_category_id;
253   CLOSE l_category_id_csr;
254 
255   IF l_data_type_id = 6 THEN
256 
257     BEGIN
258   	-- get shema
259   	OPEN  l_get_schema;
260   	FETCH l_get_schema INTO l_schema_name;
261   	CLOSE l_get_schema;
262 
263   	-- get datatype
264   	OPEN  l_get_datatype(l_schema_name);
265   	FETCH l_get_datatype INTO l_data_type;
266   	CLOSE l_get_datatype;
267 
268    /* INSERT INTO fnd_lobs(file_id,
269 						file_name,
270 						file_content_type,
271 						file_data,
272         				upload_date,
273 						language,
274 						file_format)
275      			SELECT	l_file_id AS FILE_ID,
276 						l_file_name AS FILE_NAME,
277 						l_file_content_type AS FILE_CONTENT_TYPE,
278 						file_data AS FILE_DATA,
279         				SYSDATE as UPLOAD_DATE,
280 						l_language as LANGUAGE,
281 						'binary' AS FILE_FORMAT
282 				FROM	csf_m_lobs_inq
283 				WHERE 	file_id = l_file_id
284 				AND 	tranid$$ = p_record.tranid$$
285     			AND     clid$$cs = p_record.clid$$cs;*/
286 		IF l_data_type ='BLOB' THEN
287 			l_dsql :=  'INSERT INTO fnd_lobs(file_id,'
288 				||		'file_name,'
289 				||		'file_content_type,'
290 				||		'file_data,'
291         		||		'upload_date,'
292 				||		'language, '
293 				||		'file_format)'
294      			|| 'SELECT ' ||	l_file_id   || ' AS FILE_ID,'
295 						   	 || '''' || l_file_name || ''' AS FILE_NAME,'
296 							 || '''' || l_file_content_type || ''' AS FILE_CONTENT_TYPE, '
297 							 || 'file_data    AS FILE_DATA, '
298         					 ||' SYSDATE 	  AS UPLOAD_DATE,'
299 							 ||'''' || l_language 	|| ''' AS LANGUAGE,'
300 							 ||'''binary'''     || ' AS FILE_FORMAT '
301 							 ||' FROM	csf_m_lobs_inq'
302 				|| ' WHERE 	file_id  = ' || l_file_id
303 				|| ' AND 	tranid$$ = ' || p_record.tranid$$
304     			|| ' AND     clid$$cs = ''' || p_record.clid$$cs || '''';
305 
306 		ELSE
307 			l_dsql :=  'INSERT INTO fnd_lobs(file_id,'
308 				||		'file_name,'
309 				||		'file_content_type,'
310 				||		'file_data,'
311         		||		'upload_date,'
312 				||		'language, '
313 				||		'file_format)'
314      			|| 'SELECT ' ||	l_file_id   || ' AS FILE_ID,'
315 						   	 || '''' || l_file_name || ''' AS FILE_NAME,'
316 							 || '''' || l_file_content_type || ''' AS FILE_CONTENT_TYPE, '
317 							 || 'TO_LOB(file_data)    AS FILE_DATA, '
318         					 ||' SYSDATE   AS UPLOAD_DATE,'
319 							 ||'''' || l_language 	|| ''' AS LANGUAGE,'
320 							 ||'''binary'''     || ' AS FILE_FORMAT '
321 							 ||' FROM	csf_m_lobs_inq'
322 				|| ' WHERE 	file_id  = ' || l_file_id
323 				|| ' AND 	tranid$$ = ' || p_record.tranid$$
324     			|| ' AND     clid$$cs = ''' || p_record.clid$$cs || '''';
325 
326 		END IF;
327 
328   		l_cursorid := DBMS_SQL.open_cursor;
329    		--parse and execute the sql
330    		DBMS_SQL.parse(l_cursorid, l_dsql, DBMS_SQL.v7);
331    		l_result := DBMS_SQL.execute(l_cursorid);
332    		DBMS_SQL.close_cursor (l_cursorid);
333 
334 
335 
336     EXCEPTION
337       WHEN OTHERS THEN
338       -- check if the record exists
339           OPEN  l_lobs_fileid_csr(l_file_id) ;
340 	      FETCH l_lobs_fileid_csr into l_dummy;
341 	      IF l_lobs_fileid_csr%found THEN
342 	         --the record exists. Dont show any error.
343              null;
344           ELSE
345              --record could not be inserted, throw the exception
346              x_return_status := FND_API.G_RET_STS_ERROR;
347              raise;
348           END IF;
349 	      CLOSE l_lobs_fileid_csr;
350     END;
351 
352   END IF;--this is execulted only for lobs
353 
354   --After inserting the lobs into fnd_lobs table the attachment is added to the corresponding
355   --Entity ie to task or Debrief or SR we need to call the following API
356   fnd_webattch.add_attachment(
357     seq_num 			=> l_seq_num,
358     category_id 		=> l_category_id,
359     document_description=> p_record.description,  --l_signed_date||' '||l_signed_by,
360     datatype_id 		=> l_data_type_id,
361     text			    => p_record.short_text,
362     file_name 		    => l_file_name,
363     url                 => p_record.url,
364     function_name 		=> l_function_name,
365     entity_name 		=> l_entity_name,
366     pk1_value 		    => l_task_assignment_id,
367    	pk2_value		    => NULL,
368    	pk3_value		    => NULL,
369    	pk4_value		    => NULL,
370    	pk5_value		    => NULL,
371     media_id 			=> l_file_id,
372     user_id 			=> l_user_id, --fnd_global.login_id
373 	title               => l_title);
374 
375 	--Inserting data into the Access table to have the record in the client immd.Without running JTM progmram
376 
377 	CSM_LOBS_EVENT_PKG.INSERT_ACC_ON_UPLOAD(l_task_assignment_id,l_user_id,l_entity_name,l_data_type_id,l_dodirty);
378 
379 	l_error_msg			:= 'The record is going to get rejected as its successfully inserted into the Base Table.';
380 
381     CSM_UTIL_PKG.LOG   ( l_error_msg , 'CSM_LOBS_PKG.APPLY_INSERT',
382                      FND_LOG.LEVEL_PROCEDURE );
383 
384 	--The attachment is added successfully to the apps.so deferring the original record
385     IF l_data_type_id =5 OR l_data_type_id =1 OR (l_data_type_id = 6 AND l_dodirty = TRUE) THEN
386 	   --Reject the record for url,short text and for lobs which has new file id
387 	   --from server instead of one from the client
388 	   CSM_UTIL_PKG.REJECT_RECORD        (
389            p_user_name     => p_record.CLID$$CS,
390            p_tranid        => p_record.TRANID$$,
391            p_seqno         => p_record.SEQNO$$,
392            p_pk            => p_record.document_id,
393            p_object_name   => g_object_name,
394            p_pub_name      => g_pub_name,
395            p_error_msg     => l_error_msg,
396            x_return_status => x_return_status
397          );
398 
399 	END IF;
400 
401     l_error_msg :=  'Leaving ' || g_object_name || '.APPLY_INSERT' || ' for PK ' || to_char (p_record.file_id);
402     CSM_UTIL_PKG.LOG   ( l_error_msg , 'CSM_LOBS_PKG.APPLY_INSERT',
403                      FND_LOG.LEVEL_PROCEDURE );
404 
405 
406 EXCEPTION WHEN OTHERS THEN
407 
408   l_error_msg :=  'Exception occurred in ' || g_object_name || '.APPLY_INSERT and hence leaving it:' || ' ' || sqlerrm
409                || ' for PK ' || to_char (p_record.file_id );
410   CSM_UTIL_PKG.LOG   ( l_error_msg ,'CSM_LOBS_PKG.APPLY_INSERT',FND_LOG.LEVEL_ERROR );
411   fnd_msg_pub.Add_Exc_Msg( g_object_name, 'APPLY_INSERT', sqlerrm);
412 
413   p_error_msg := CSM_UTIL_PKG.GET_ERROR_MESSAGE_TEXT(p_api_error => TRUE );
414   x_return_status := FND_API.G_RET_STS_ERROR;
415 
416 END APPLY_INSERT;
417 
418 /***
419   This procedure is called by APPLY_CLIENT_CHANGES for every record in in-queue that needs to be processed.
420 ***/
421 PROCEDURE APPLY_RECORD
422          (
423            p_record        IN     c_FND_LOBS%ROWTYPE,
424            p_error_msg     OUT NOCOPY    VARCHAR2,
425            x_return_status IN OUT NOCOPY VARCHAR2
426          ) IS
427 l_error_msg varchar(1024);
428 BEGIN
429   /*** initialize return status and message list ***/
430   x_return_status := FND_API.G_RET_STS_SUCCESS;
431   FND_MSG_PUB.INITIALIZE;
432 
433 
434   l_error_msg :=  'Entering ' || g_object_name || '.APPLY_RECORD'
435                || ' for PK ' || to_char (p_record.FILE_ID );
436   CSM_UTIL_PKG.LOG   ( l_error_msg ,
437                      'CSM_LOBS_PKG.APPLY_RECORD',
438                     FND_LOG.LEVEL_PROCEDURE );
439 
440   l_error_msg := 'Processing ' || g_object_name || ' for PK ' || to_char (p_record.FILE_ID) || ' ' ||
441        'DMLTYPE = ' || p_record.dmltype$$ ;
442 
443    CSM_UTIL_PKG.LOG ( l_error_msg ,
444             'CSM_LOBS_PKG.APPLY_RECORD',
445              FND_LOG.LEVEL_EVENT  );
446 
447   IF p_record.dmltype$$='I' THEN
448     -- Process insert
449     APPLY_INSERT
450       (
451         p_record,
452         p_error_msg,
453         x_return_status
454       );
455   ELSIF p_record.dmltype$$='U' THEN
456 
457     -- Process update; not supported for this entity
458 
459       l_error_msg := 'Update is not supported for this entity ' || g_object_name;
460       CSM_UTIL_PKG.LOG  (l_error_msg,
461         'CSM_LOBS_PKG.APPLY_RECORD',
462          FND_LOG.LEVEL_EVENT );
463 
464         p_error_msg := CSM_UTIL_PKG.GET_ERROR_MESSAGE_TEXT
465       (
466         p_message        => 'CSM_DML_OPERATION'
467       , p_token_name1    => 'DML'
468       , p_token_value1   => p_record.dmltype$$
469       );
470 
471     x_return_status := FND_API.G_RET_STS_ERROR;
472 
473   ELSIF p_record.dmltype$$='D' THEN
474     -- Process delete; not supported for this entity
475 
476       l_error_msg := 'Delete is not supported for this entity ' || g_object_name ;
477       CSM_UTIL_PKG.LOG( l_error_msg,
478                 'CSM_LOBS_PKG.APPLY_RECORD',
479                 FND_LOG.LEVEL_EVENT );
480 
481 
482     p_error_msg := CSM_UTIL_PKG.GET_ERROR_MESSAGE_TEXT
483       (
484         p_message        => 'CSM_DML_OPERATION'
485       , p_token_name1    => 'DML'
486       , p_token_value1   => p_record.dmltype$$
487       );
488 
489     x_return_status := FND_API.G_RET_STS_ERROR;
490   ELSE
491     -- invalid dml type
492 
493        CSM_UTIL_PKG.LOG
494       ( 'Invalid DML type: ' || p_record.dmltype$$ || ' for this entity '
495                             || g_object_name,  'CSM_LOBS_PKG.APPLY_RECORD', FND_LOG.LEVEL_ERROR);
496 
497     p_error_msg := CSM_UTIL_PKG.GET_ERROR_MESSAGE_TEXT
498       (
499         p_message        => 'CSM_DML_OPERATION'
500       , p_token_name1    => 'DML'
501       , p_token_value1   => p_record.dmltype$$
502       );
503 
504     x_return_status := FND_API.G_RET_STS_ERROR;
505   END IF;
506 
507     CSM_UTIL_PKG.LOG ( 'Leaving ' || g_object_name || '.APPLY_RECORD'   || ' for PK ' || p_record.FILE_ID,
508                         'CSM_LOBS_LOBS.APPLY_RECORD',
509                         FND_LOG.LEVEL_PROCEDURE  );
510 
511 
512 EXCEPTION WHEN OTHERS THEN
513   /*** defer record when any process exception occurs ***/
514 
515    CSM_UTIL_PKG.LOG
516     ( 'Exception occurred in ' || g_object_name || '.APPLY_RECORD:' || ' ' || sqlerrm
517                || ' for PK ' || p_record.FILE_ID,'CSM_LOBS_LOBS.APPLY_RECORD',FND_LOG.LEVEL_ERROR );
518 
519 
520   fnd_msg_pub.Add_Exc_Msg( g_object_name, 'APPLY_RECORD', sqlerrm);
521   p_error_msg := CSM_UTIL_PKG.GET_ERROR_MESSAGE_TEXT
522     (
523       p_api_error      => TRUE
524     );
525 
526 
527     CSM_UTIL_PKG.LOG
528     ( 'Leaving ' || g_object_name || '.APPLY_RECORD'|| ' for PK ' || p_record.FILE_ID,
529             'CSM_LOBS_LOBS.APPLY_RECORD',
530             FND_LOG.LEVEL_ERROR );
531 
532 
533   x_return_status := FND_API.G_RET_STS_ERROR;
534 END APPLY_RECORD;
535 
536 /***
537   This procedure is called by CSM_SERVICEP_WRAPPER_PKG when publication item CSF_M_LOBS
538   is dirty. This happens when a mobile field service device executed DML on an updatable table and did
539   a fast sync. This procedure will insert the data that came from mobile into the backend tables using
540   public APIs.
541 ***/
542 PROCEDURE APPLY_CLIENT_CHANGES
543          (
544            p_user_name     IN VARCHAR2,
545            p_tranid        IN NUMBER,
546            p_debug_level   IN NUMBER,
547            x_return_status IN OUT NOCOPY VARCHAR2
548          ) IS
549 
550   l_process_status VARCHAR2(1);
551   l_error_msg      VARCHAR2(4000);
552 BEGIN
553   g_debug_level := p_debug_level;
554   x_return_status := FND_API.G_RET_STS_SUCCESS;
555 
556   CSM_UTIL_PKG.LOG   ( 'Entering ' || g_object_name || '.Apply_Client_Changes',
557             'CSM_LOBS_LOBS.APPLY_CLIENT_CHANGES',
558              FND_LOG.LEVEL_PROCEDURE);
559 
560 
561   /*** loop through CSF_M_LOBS records in inqueue ***/
562   FOR r_FND_LOBS IN c_FND_LOBS( p_user_name, p_tranid) LOOP
563 
564     SAVEPOINT save_rec;
565 
566     /*** apply record ***/
567     APPLY_RECORD
568       (
569         r_FND_LOBS
570       , l_error_msg
571       , l_process_status
572       );
573 
574 
575     /*** was record processed successfully? ***/
576     IF l_process_status = FND_API.G_RET_STS_SUCCESS THEN
577       /*** Yes -> delete record from inqueue ***/
578         CSM_UTIL_PKG.LOG
579         ( 'Record successfully processed, deleting from inqueue ' || g_object_name
580                || ' for PK ' || r_FND_LOBS.FILE_ID,
581                'CSM_LOBS_LOBS.APPLY_CLIENT_CHANGES',
582                FND_LOG.LEVEL_EVENT );
583 
584 
585       CSM_UTIL_PKG.DELETE_RECORD
586         (
587           p_user_name,
588           p_tranid,
589           r_FND_LOBS.seqno$$,
590           r_FND_LOBS.FILE_ID, -- put PK column here
591           g_object_name,
592           g_pub_name,
593           l_error_msg,
594           l_process_status
595         );
596 
597       /*** was delete successful? ***/
598       IF l_process_status <> FND_API.G_RET_STS_SUCCESS THEN
599         /*** no -> rollback ***/
600           CSM_UTIL_PKG.LOG
601           ( 'Deleting from inqueue failed, rolling back to savepoint for entity ' || g_object_name
602                || ' and  PK ' || r_FND_LOBS.FILE_ID,
603                'CSM_LOBS_LOBS.APPLY_CLIENT_CHANGES' ,
604                FND_LOG.LEVEL_EVENT);
605 
606         ROLLBACK TO save_rec;
607       END IF;
608     END IF;
609 
610     IF l_process_Status <> FND_API.G_RET_STS_SUCCESS THEN
611       /*** Record was not processed successfully or delete failed -> defer and reject record ***/
612 
613         CSM_UTIL_PKG.LOG
614         ( 'Record not processed successfully, deferring and rejecting record for entity ' || g_object_name
615                || ' and PK ' || r_FND_LOBS.FILE_ID,
616                'CSM_LOBS_LOBS.APPLY_CLIENT_CHANGES',
617                FND_LOG.LEVEL_EVENT );
618 
619 
620       CSM_UTIL_PKG.DEFER_RECORD
621        (
622          p_user_name
623        , p_tranid
624        , r_FND_LOBS.seqno$$
625        , r_FND_LOBS.FILE_ID -- put PK column here
626        , g_object_name
627        , g_pub_name
628        , l_error_msg
629        , l_process_status
630        , r_FND_LOBS.dmltype$$
631        );
632 
633       /*** Was defer successful? ***/
634       IF l_process_status <> FND_API.G_RET_STS_SUCCESS THEN
635         /*** no -> rollback ***/
636           CSM_UTIL_PKG.LOG
637           ( 'Defer record failed, rolling back to savepoint for entity ' || g_object_name
638                || ' and PK ' || r_FND_LOBS.FILE_ID,
639                'CSM_LOBS_LOBS.APPLY_CLIENT_CHANGES',
640                FND_LOG.LEVEL_EVENT );
641 
642         ROLLBACK TO save_rec;
643       END IF;
644     END IF;
645 
646   END LOOP;
647 
648 
649     CSM_UTIL_PKG.LOG( 'Leaving ' || g_object_name || '.Apply_Client_Changes',
650     'CSM_LOBS_LOBS.APPLY_CLIENT_CHANGES',
651     FND_LOG.LEVEL_PROCEDURE);
652 
653 
654 EXCEPTION WHEN OTHERS THEN
655   /*** catch and log exceptions ***/
656     CSM_UTIL_PKG.LOG  ( 'Exception occurred in ' || g_object_name || '.APPLY_CLIENT_CHANGES:' || ' ' || sqlerrm ,
657         'CSM_LOBS_LOBS.APPLY_CLIENT_CHANGES', FND_LOG.LEVEL_ERROR);
658 
659   x_return_status := FND_API.G_RET_STS_ERROR;
660 END APPLY_CLIENT_CHANGES;
661 
662 
663 END CSM_LOBS_PKG;