DBA Data[Home] [Help]

PACKAGE BODY: APPS.CSM_LOBS_PKG

Source


1 PACKAGE BODY CSM_LOBS_PKG AS
2 /* $Header: csmulobb.pls 120.15.12020000.2 2012/11/29 06:57:55 ravir 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       dba_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 /* Bug 15932265
145  CURSOR l_get_datatype (c_schema IN FND_ORACLE_USERID.ORACLE_USERNAME%TYPE)
146  IS
147  select data_type from all_tab_columns
148  where table_name 	= 'CSF_M_LOBS_INQ'
149  and   column_name  = 'FILE_DATA'
150  and   OWNER        = c_schema;
151 */
152 
153   CURSOR l_get_datatype (c_schema IN FND_ORACLE_USERID.ORACLE_USERNAME%TYPE)
154   IS
155   select data_type from user_synonyms syn, dba_tab_columns col
156   where syn.table_owner = c_schema
157   and	syn.synonym_name = 'CSF_M_LOBS_INQ'
158   and   col.owner = syn.table_owner
159   and 	col.table_name = syn.table_name
160   and   col.column_name  = 'FILE_DATA';
161 
162 BEGIN
163 
164   x_return_status := FND_API.G_RET_STS_SUCCESS;
165   l_dodirty		  := FALSE;--mark dirty for datatypeid =6 is not necessary
166 
167   l_error_msg := 'Entering ' || g_object_name || '.APPLY_INSERT'|| ' for PK ' || to_char( p_record.file_id);
168   CSM_UTIL_PKG.LOG   ( l_error_msg ,
169                            'CSM_LOBS_PKG.APPLY_INSERT',
170                            FND_LOG.LEVEL_PROCEDURE );
171 
172   --if attachments are not part of what we support then we leave
173   IF p_record.entity_name NOT IN('JTF_TASKS_B','CS_INCIDENTS','CSF_DEBRIEF_HEADERS') THEN
174 
175   	l_error_msg := 'Leaving ' || g_object_name || '.APPLY_INSERT'||
176 	  			   ' as we are not supporting  Attachment for the entity' || TO_CHAR(p_record.entity_name);
177   	CSM_UTIL_PKG.LOG   ( l_error_msg ,'CSM_LOBS_PKG.APPLY_INSERT',FND_LOG.LEVEL_PROCEDURE );
178   	RETURN;
179 
180   END IF;
181 
182   l_title:=p_record.title;
183   l_data_type_id :=p_record.data_type_id;
184   -- get the language of the user
185   OPEN  l_get_language(p_record.clid$$cs);
186   FETCH l_get_language INTO l_language,l_user_id;
187   CLOSE l_get_language;
188 
189   IF p_record.entity_name = 'JTF_TASKS_B' OR p_record.entity_name = 'CS_INCIDENTS'	THEN
190   	l_category_name   	 := 'MISC';
191   	l_file_name		  	 := p_record.file_name;
192   	l_file_content_type  := p_record.file_content_type;
193   	l_entity_name		 := p_record.entity_name;
194    	l_task_assignment_id := TO_NUMBER (p_record.pk1_value);
195 
196   	IF p_record.entity_name = 'JTF_TASKS_B' THEN --function name is the Name of the Form in which the attachment is displayed
197   		l_function_name		:= 'JTFTKMAN';
198   	ELSIF p_record.entity_name = 'CS_INCIDENTS' THEN
199   		l_function_name		:= 'CSXSRISR';
200   	END IF;
201 
202   ELSIF p_record.entity_name = 'CSF_DEBRIEF_HEADERS'	THEN
203   	--Else is for signature upload for debrief
204   	l_category_name   	:= 'SIGNATURE';
205   	l_file_name		  	:= 'INTERNAL';
206   	l_file_content_type := 'image/bmp';
207   	l_entity_name		:= 'CSF_DEBRIEF_HEADERS';
208   	l_function_name		:= 'CSFFEDBF';
209 -- Bug 5726888
210     l_data_type_id :=6;
211   --required only for signature...
212   -- if debrief_header_id is not passed get the debrief header id using task assignment id
213     l_task_assignment_id:=p_record.pk1_value;
214 
215   	IF ( (p_record.pk1_value IS NULL) AND
216         (p_record.task_assignment_id IS NOT NULL) )
217   	THEN
218      	OPEN l_debrief_header_id_csr(p_record.task_assignment_id);
219      	FETCH l_debrief_header_id_csr INTO l_task_assignment_id;
220      	CLOSE l_debrief_header_id_csr;
221   	END IF;
222   END IF;
223 
224 
225   --setting file id
226   --For lobs we require file id to insert data into fnd_lobs.So we get the file_id from the client
227   --For LOBS we give fileid to the server so that we can avoid the lobs getting downloaded in the client
228   --twice when its uploaded
229   IF l_data_type_id = 6 THEN
230   	   l_file_id := p_record.file_id;
231 
232 -- Bug 5726888
233            IF l_file_id IS NULL AND l_category_name = 'SIGNATURE' THEN
234             l_file_id := p_record.document_id;
235            END IF;
236 	     --verify that the record does not already exist.If already present then pass null so that the api will create the own id
237   		 OPEN 	l_lobs_fileid_csr(l_file_id) ;
238   		 FETCH l_lobs_fileid_csr into l_dummy;
239 
240 		 IF  l_lobs_fileid_csr%FOUND THEN
241 			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';
242        		CSM_UTIL_PKG.LOG( p_error_msg ,'CSM_LOBS_PKG.UPLOAD_SR_TASK_LOB', FND_LOG.LEVEL_ERROR );
243 		    l_file_id := NULL;
244 			--get the file id from the sequence diretly.As the client sent file id is not proper.
245 		    SELECT fnd_lobs_s.nextval
246 			INTO l_file_id
247    			FROM dual;
248 			l_dodirty := TRUE;
249 	     END IF;
250 
251 		 CLOSE l_lobs_fileid_csr;
252   ELSE
253 	   l_file_id := NULL;
254   END IF;
255 
256   -- get the max seq no
257   open  l_max_seq_no_csr(l_task_assignment_id, l_language,l_category_name,l_entity_name);
258   FETCH l_max_seq_no_csr INTO l_seq_num;
259   CLOSE l_max_seq_no_csr;
260 
261   -- get the category id for Signature
262   OPEN  l_category_id_csr(l_language,l_category_name);
263   FETCH l_category_id_csr INTO l_category_id;
264   CLOSE l_category_id_csr;
265 
266   IF l_data_type_id = 6 THEN
267 
268     BEGIN
269   	-- get shema
270   	OPEN  l_get_schema;
271   	FETCH l_get_schema INTO l_schema_name;
272   	CLOSE l_get_schema;
273 
274   	-- get datatype
275   	OPEN  l_get_datatype(l_schema_name);
276   	FETCH l_get_datatype INTO l_data_type;
277   	CLOSE l_get_datatype;
278 
279    /* INSERT INTO fnd_lobs(file_id,
280 						file_name,
281 						file_content_type,
282 						file_data,
283         				upload_date,
284 						language,
285 						file_format)
286      			SELECT	l_file_id AS FILE_ID,
287 						l_file_name AS FILE_NAME,
288 						l_file_content_type AS FILE_CONTENT_TYPE,
289 						file_data AS FILE_DATA,
290         				SYSDATE as UPLOAD_DATE,
291 						l_language as LANGUAGE,
292 						'binary' AS FILE_FORMAT
293 				FROM	csf_m_lobs_inq
294 				WHERE 	file_id = l_file_id
295 				AND 	tranid$$ = p_record.tranid$$
296     			AND     clid$$cs = p_record.clid$$cs;*/
297 		IF l_data_type ='BLOB' THEN
298 			l_dsql :=  'INSERT INTO fnd_lobs(file_id,'
299 				||		'file_name,'
300 				||		'file_content_type,'
301 				||		'file_data,'
302         		||		'upload_date,'
303 				||		'language, '
304 				||		'file_format)'
305      			|| 'SELECT ' ||	l_file_id   || ' AS FILE_ID,'
306 						   	 || '''' || l_file_name || ''' AS FILE_NAME,'
307 							 || '''' || l_file_content_type || ''' AS FILE_CONTENT_TYPE, '
308 							 || 'file_data    AS FILE_DATA, '
309         					 ||' SYSDATE 	  AS UPLOAD_DATE,'
310 							 ||'''' || l_language 	|| ''' AS LANGUAGE,'
311 							 ||'''binary'''     || ' AS FILE_FORMAT '
312 							 ||' FROM	csf_m_lobs_inq'
313 				|| ' WHERE 	file_id  = ' || l_file_id
314 				|| ' AND 	tranid$$ = ' || p_record.tranid$$
315     			|| ' AND     clid$$cs = ''' || p_record.clid$$cs || '''';
316 
317 		ELSE
318 			l_dsql :=  'INSERT INTO fnd_lobs(file_id,'
319 				||		'file_name,'
320 				||		'file_content_type,'
321 				||		'file_data,'
322         		||		'upload_date,'
323 				||		'language, '
324 				||		'file_format)'
325      			|| 'SELECT ' ||	l_file_id   || ' AS FILE_ID,'
326 						   	 || '''' || l_file_name || ''' AS FILE_NAME,'
327 							 || '''' || l_file_content_type || ''' AS FILE_CONTENT_TYPE, '
328 							 || 'TO_LOB(file_data)    AS FILE_DATA, '
329         					 ||' SYSDATE   AS UPLOAD_DATE,'
330 							 ||'''' || l_language 	|| ''' AS LANGUAGE,'
331 							 ||'''binary'''     || ' AS FILE_FORMAT '
332 							 ||' FROM	csf_m_lobs_inq'
333 				|| ' WHERE 	file_id  = ' || l_file_id
334 				|| ' AND 	tranid$$ = ' || p_record.tranid$$
335     			|| ' AND     clid$$cs = ''' || p_record.clid$$cs || '''';
336 
337 		END IF;
338 
339   		l_cursorid := DBMS_SQL.open_cursor;
340    		--parse and execute the sql
341    		DBMS_SQL.parse(l_cursorid, l_dsql, DBMS_SQL.v7);
342    		l_result := DBMS_SQL.execute(l_cursorid);
343    		DBMS_SQL.close_cursor (l_cursorid);
344 
345 
346 
347     EXCEPTION
348       WHEN OTHERS THEN
349       -- check if the record exists
350           OPEN  l_lobs_fileid_csr(l_file_id) ;
351 	      FETCH l_lobs_fileid_csr into l_dummy;
352 	      IF l_lobs_fileid_csr%found THEN
353 	         --the record exists. Dont show any error.
354              null;
355           ELSE
356              --record could not be inserted, throw the exception
357              x_return_status := FND_API.G_RET_STS_ERROR;
358              raise;
359           END IF;
360 	      CLOSE l_lobs_fileid_csr;
361     END;
362 
363   END IF;--this is execulted only for lobs
364 
365   --After inserting the lobs into fnd_lobs table the attachment is added to the corresponding
366   --Entity ie to task or Debrief or SR we need to call the following API
367   fnd_webattch.add_attachment(
368     seq_num 			=> l_seq_num,
369     category_id 		=> l_category_id,
370     document_description=> p_record.description,  --l_signed_date||' '||l_signed_by,
371     datatype_id 		=> l_data_type_id,
372     text			    => p_record.short_text,
373     file_name 		    => l_file_name,
374     url                 => p_record.url,
375     function_name 		=> l_function_name,
376     entity_name 		=> l_entity_name,
377     pk1_value 		    => l_task_assignment_id,
378    	pk2_value		    => NULL,
379    	pk3_value		    => NULL,
380    	pk4_value		    => NULL,
381    	pk5_value		    => NULL,
382     media_id 			=> l_file_id,
383     user_id 			=> l_user_id, --fnd_global.login_id
384 	title               => l_title);
385 
386 	--Inserting data into the Access table to have the record in the client immd.Without running JTM progmram
387 
388 	CSM_LOBS_EVENT_PKG.INSERT_ACC_ON_UPLOAD(l_task_assignment_id,l_user_id,l_entity_name,l_data_type_id,l_dodirty);
389 
390 	l_error_msg			:= 'The record is going to get rejected as its successfully inserted into the Base Table.';
391 
392     CSM_UTIL_PKG.LOG   ( l_error_msg , 'CSM_LOBS_PKG.APPLY_INSERT',
393                      FND_LOG.LEVEL_PROCEDURE );
394 
395 	--The attachment is added successfully to the apps.so deferring the original record
396     IF l_data_type_id =5 OR l_data_type_id =1 OR (l_data_type_id = 6 AND l_dodirty = TRUE) THEN
397 	   --Reject the record for url,short text and for lobs which has new file id
398 	   --from server instead of one from the client
399 	   CSM_UTIL_PKG.REJECT_RECORD        (
400            p_user_name     => p_record.CLID$$CS,
401            p_tranid        => p_record.TRANID$$,
402            p_seqno         => p_record.SEQNO$$,
403            p_pk            => p_record.document_id,
404            p_object_name   => g_object_name,
405            p_pub_name      => g_pub_name,
406            p_error_msg     => l_error_msg,
407            x_return_status => x_return_status
408          );
409 
410 	END IF;
411 
412     l_error_msg :=  'Leaving ' || g_object_name || '.APPLY_INSERT' || ' for PK ' || to_char (p_record.file_id);
413     CSM_UTIL_PKG.LOG   ( l_error_msg , 'CSM_LOBS_PKG.APPLY_INSERT',
414                      FND_LOG.LEVEL_PROCEDURE );
415 
416 
417 EXCEPTION WHEN OTHERS THEN
418 
419   l_error_msg :=  'Exception occurred in ' || g_object_name || '.APPLY_INSERT and hence leaving it:' || ' ' || sqlerrm
420                || ' for PK ' || to_char (p_record.file_id );
421   CSM_UTIL_PKG.LOG   ( l_error_msg ,'CSM_LOBS_PKG.APPLY_INSERT',FND_LOG.LEVEL_ERROR );
422   fnd_msg_pub.Add_Exc_Msg( g_object_name, 'APPLY_INSERT', sqlerrm);
423 
424   p_error_msg := CSM_UTIL_PKG.GET_ERROR_MESSAGE_TEXT(p_api_error => TRUE );
425   x_return_status := FND_API.G_RET_STS_ERROR;
426 
427 END APPLY_INSERT;
428 
429 /***
430   This procedure is called by APPLY_CLIENT_CHANGES for every record in in-queue that needs to be processed.
431 ***/
432 PROCEDURE APPLY_RECORD
433          (
434            p_record        IN     c_FND_LOBS%ROWTYPE,
435            p_error_msg     OUT NOCOPY    VARCHAR2,
436            x_return_status IN OUT NOCOPY VARCHAR2
437          ) IS
438 l_error_msg varchar(1024);
439 BEGIN
440   /*** initialize return status and message list ***/
441   x_return_status := FND_API.G_RET_STS_SUCCESS;
442   FND_MSG_PUB.INITIALIZE;
443 
444 
445   l_error_msg :=  'Entering ' || g_object_name || '.APPLY_RECORD'
446                || ' for PK ' || to_char (p_record.FILE_ID );
447   CSM_UTIL_PKG.LOG   ( l_error_msg ,
448                      'CSM_LOBS_PKG.APPLY_RECORD',
449                     FND_LOG.LEVEL_PROCEDURE );
450 
451   l_error_msg := 'Processing ' || g_object_name || ' for PK ' || to_char (p_record.FILE_ID) || ' ' ||
452        'DMLTYPE = ' || p_record.dmltype$$ ;
453 
454    CSM_UTIL_PKG.LOG ( l_error_msg ,
455             'CSM_LOBS_PKG.APPLY_RECORD',
456              FND_LOG.LEVEL_EVENT  );
457 
458   IF p_record.dmltype$$='I' THEN
459     -- Process insert
460     APPLY_INSERT
461       (
462         p_record,
463         p_error_msg,
464         x_return_status
465       );
466   ELSIF p_record.dmltype$$='U' THEN
467 
468     -- Process update; not supported for this entity
469 
470       l_error_msg := 'Update is not supported for this entity ' || g_object_name;
471       CSM_UTIL_PKG.LOG  (l_error_msg,
472         'CSM_LOBS_PKG.APPLY_RECORD',
473          FND_LOG.LEVEL_EVENT );
474 
475         p_error_msg := CSM_UTIL_PKG.GET_ERROR_MESSAGE_TEXT
476       (
477         p_message        => 'CSM_DML_OPERATION'
478       , p_token_name1    => 'DML'
479       , p_token_value1   => p_record.dmltype$$
480       );
481 
482     x_return_status := FND_API.G_RET_STS_ERROR;
483 
484   ELSIF p_record.dmltype$$='D' THEN
485     -- Process delete; not supported for this entity
486 
487       l_error_msg := 'Delete is not supported for this entity ' || g_object_name ;
488       CSM_UTIL_PKG.LOG( l_error_msg,
489                 'CSM_LOBS_PKG.APPLY_RECORD',
490                 FND_LOG.LEVEL_EVENT );
491 
492 
493     p_error_msg := CSM_UTIL_PKG.GET_ERROR_MESSAGE_TEXT
494       (
495         p_message        => 'CSM_DML_OPERATION'
496       , p_token_name1    => 'DML'
497       , p_token_value1   => p_record.dmltype$$
498       );
499 
500     x_return_status := FND_API.G_RET_STS_ERROR;
501   ELSE
502     -- invalid dml type
503 
504        CSM_UTIL_PKG.LOG
505       ( 'Invalid DML type: ' || p_record.dmltype$$ || ' for this entity '
506                             || g_object_name,  'CSM_LOBS_PKG.APPLY_RECORD', FND_LOG.LEVEL_ERROR);
507 
508     p_error_msg := CSM_UTIL_PKG.GET_ERROR_MESSAGE_TEXT
509       (
510         p_message        => 'CSM_DML_OPERATION'
511       , p_token_name1    => 'DML'
512       , p_token_value1   => p_record.dmltype$$
513       );
514 
515     x_return_status := FND_API.G_RET_STS_ERROR;
516   END IF;
517 
518     CSM_UTIL_PKG.LOG ( 'Leaving ' || g_object_name || '.APPLY_RECORD'   || ' for PK ' || p_record.FILE_ID,
519                         'CSM_LOBS_LOBS.APPLY_RECORD',
520                         FND_LOG.LEVEL_PROCEDURE  );
521 
522 
523 EXCEPTION WHEN OTHERS THEN
524   /*** defer record when any process exception occurs ***/
525 
526    CSM_UTIL_PKG.LOG
527     ( 'Exception occurred in ' || g_object_name || '.APPLY_RECORD:' || ' ' || sqlerrm
528                || ' for PK ' || p_record.FILE_ID,'CSM_LOBS_LOBS.APPLY_RECORD',FND_LOG.LEVEL_ERROR );
529 
530 
531   fnd_msg_pub.Add_Exc_Msg( g_object_name, 'APPLY_RECORD', sqlerrm);
532   p_error_msg := CSM_UTIL_PKG.GET_ERROR_MESSAGE_TEXT
533     (
534       p_api_error      => TRUE
535     );
536 
537 
538     CSM_UTIL_PKG.LOG
539     ( 'Leaving ' || g_object_name || '.APPLY_RECORD'|| ' for PK ' || p_record.FILE_ID,
540             'CSM_LOBS_LOBS.APPLY_RECORD',
541             FND_LOG.LEVEL_ERROR );
542 
543 
544   x_return_status := FND_API.G_RET_STS_ERROR;
545 END APPLY_RECORD;
546 
547 /***
548   This procedure is called by CSM_SERVICEP_WRAPPER_PKG when publication item CSF_M_LOBS
549   is dirty. This happens when a mobile field service device executed DML on an updatable table and did
550   a fast sync. This procedure will insert the data that came from mobile into the backend tables using
551   public APIs.
552 ***/
553 PROCEDURE APPLY_CLIENT_CHANGES
554          (
555            p_user_name     IN VARCHAR2,
556            p_tranid        IN NUMBER,
557            p_debug_level   IN NUMBER,
558            x_return_status IN OUT NOCOPY VARCHAR2
559          ) IS
560 
561   l_process_status VARCHAR2(1);
562   l_error_msg      VARCHAR2(4000);
563 BEGIN
564   g_debug_level := p_debug_level;
565   x_return_status := FND_API.G_RET_STS_SUCCESS;
566 
567   CSM_UTIL_PKG.LOG   ( 'Entering ' || g_object_name || '.Apply_Client_Changes',
568             'CSM_LOBS_LOBS.APPLY_CLIENT_CHANGES',
569              FND_LOG.LEVEL_PROCEDURE);
570 
571 
572   /*** loop through CSF_M_LOBS records in inqueue ***/
573   FOR r_FND_LOBS IN c_FND_LOBS( p_user_name, p_tranid) LOOP
574 
575     SAVEPOINT save_rec;
576 
577     /*** apply record ***/
578     APPLY_RECORD
579       (
580         r_FND_LOBS
581       , l_error_msg
582       , l_process_status
583       );
584 
585 
586     /*** was record processed successfully? ***/
587     IF l_process_status = FND_API.G_RET_STS_SUCCESS THEN
588       /*** Yes -> delete record from inqueue ***/
589         CSM_UTIL_PKG.LOG
590         ( 'Record successfully processed, deleting from inqueue ' || g_object_name
591                || ' for PK ' || r_FND_LOBS.FILE_ID,
592                'CSM_LOBS_LOBS.APPLY_CLIENT_CHANGES',
593                FND_LOG.LEVEL_EVENT );
594 
595 
596       CSM_UTIL_PKG.DELETE_RECORD
597         (
598           p_user_name,
599           p_tranid,
600           r_FND_LOBS.seqno$$,
601           r_FND_LOBS.FILE_ID, -- put PK column here
602           g_object_name,
603           g_pub_name,
604           l_error_msg,
605           l_process_status
606         );
607 
608       /*** was delete successful? ***/
609       IF l_process_status <> FND_API.G_RET_STS_SUCCESS THEN
610         /*** no -> rollback ***/
611           CSM_UTIL_PKG.LOG
612           ( 'Deleting from inqueue failed, rolling back to savepoint for entity ' || g_object_name
613                || ' and  PK ' || r_FND_LOBS.FILE_ID,
614                'CSM_LOBS_LOBS.APPLY_CLIENT_CHANGES' ,
615                FND_LOG.LEVEL_EVENT);
616 
617         ROLLBACK TO save_rec;
618       END IF;
619     END IF;
620 
621     IF l_process_Status <> FND_API.G_RET_STS_SUCCESS THEN
622       /*** Record was not processed successfully or delete failed -> defer and reject record ***/
623 
624         CSM_UTIL_PKG.LOG
625         ( 'Record not processed successfully, deferring and rejecting record for entity ' || g_object_name
626                || ' and PK ' || r_FND_LOBS.FILE_ID,
627                'CSM_LOBS_LOBS.APPLY_CLIENT_CHANGES',
628                FND_LOG.LEVEL_EVENT );
629 
630 
631       CSM_UTIL_PKG.DEFER_RECORD
632        (
633          p_user_name
634        , p_tranid
635        , r_FND_LOBS.seqno$$
636        , r_FND_LOBS.FILE_ID -- put PK column here
637        , g_object_name
638        , g_pub_name
639        , l_error_msg
640        , l_process_status
641        , r_FND_LOBS.dmltype$$
642        );
643 
644       /*** Was defer successful? ***/
645       IF l_process_status <> FND_API.G_RET_STS_SUCCESS THEN
646         /*** no -> rollback ***/
647           CSM_UTIL_PKG.LOG
648           ( 'Defer record failed, rolling back to savepoint for entity ' || g_object_name
649                || ' and PK ' || r_FND_LOBS.FILE_ID,
650                'CSM_LOBS_LOBS.APPLY_CLIENT_CHANGES',
651                FND_LOG.LEVEL_EVENT );
652 
653         ROLLBACK TO save_rec;
654       END IF;
655     END IF;
656 
657   END LOOP;
658 
659 
660     CSM_UTIL_PKG.LOG( 'Leaving ' || g_object_name || '.Apply_Client_Changes',
661     'CSM_LOBS_LOBS.APPLY_CLIENT_CHANGES',
662     FND_LOG.LEVEL_PROCEDURE);
663 
664 
665 EXCEPTION WHEN OTHERS THEN
666   /*** catch and log exceptions ***/
667     CSM_UTIL_PKG.LOG  ( 'Exception occurred in ' || g_object_name || '.APPLY_CLIENT_CHANGES:' || ' ' || sqlerrm ,
668         'CSM_LOBS_LOBS.APPLY_CLIENT_CHANGES', FND_LOG.LEVEL_ERROR);
669 
670   x_return_status := FND_API.G_RET_STS_ERROR;
671 END APPLY_CLIENT_CHANGES;
672 
673 
674 END CSM_LOBS_PKG;