DBA Data[Home] [Help]

PACKAGE BODY: APPS.CSM_DEBRIEF_PARTS_PKG

Source


1 PACKAGE BODY CSM_DEBRIEF_PARTS_PKG AS
2 /* $Header: csmudbpb.pls 120.6.12020000.3 2013/04/09 11:03:41 saradhak ship $ */
3 
4 -- MODIFICATION HISTORY
5 -- Person      Date    Comments
6 -- Anurag     06/10/02 Created
7 -- ---------   ------  ------------------------------------------
8    -- Enter procedure, function bodies as shown below
9 
10 
11 /*** Globals ***/
12 g_object_name  CONSTANT VARCHAR2(30) := 'CSM_DEBRIEF_PARTS_PKG';  -- package name
13 g_pub_name     CONSTANT VARCHAR2(30) := 'CSF_M_DEBRIEF_PARTS';  -- publication item name
14 G_DEBUG_LEVEL           number; -- debug level
15 G_REJECT_ROW    BOOLEAN := false;
16 g_processed_assignment_list ASG_DOWNLOAD.ACCESS_LIST;
17 
18 CURSOR c_debrief_parts( b_user_name VARCHAR2, b_tranid NUMBER) is
19   SELECT *
20   FROM  csf_m_debrief_parts_inq
21   WHERE tranid$$ = b_tranid
22   AND   clid$$cs = b_user_name;
23 
24 CURSOR 	c_csm_user_details(b_user VARCHAR2)
25 is
26 SELECT 	USER_ID,RESPONSIBILITY_ID,APP_ID FROM asg_user WHERE user_name = b_user;
27 
28 CURSOR 	c_get_item_id(c_item_name VARCHAR2, c_org_id NUMBER)
29 IS
30 SELECT 	INVENTORY_ITEM_ID,MATERIAL_BILLABLE_FLAG,PRIMARY_UOM_CODE
31 FROM 	  MTL_SYSTEM_ITEMS_B
32 WHERE 	UPPER(SEGMENT1) = UPPER(c_item_name)
33 AND     ORGANIZATION_ID = c_org_id;
34 
35 CURSOR 	c_serial_item(c_serial_number VARCHAR2, c_org_id NUMBER)
36 IS
37 SELECT 	cii.INSTANCE_ID,
38         cii.SERIAL_NUMBER,
39         cii.LOT_NUMBER,
40         cii.INVENTORY_REVISION,
41         msi.INVENTORY_ITEM_ID,
42         msi.MATERIAL_BILLABLE_FLAG,
43         msi.PRIMARY_UOM_CODE
44 FROM 	  CSI_ITEM_INSTANCES cii,
45         MTL_SYSTEM_ITEMS_B msi
46 WHERE 	UPPER(SERIAL_NUMBER) = UPPER(c_serial_number)
47 AND     msi.inventory_item_id = cii.inventory_item_id
48 AND     msi.organization_id   = c_org_id;
49 
50 CURSOR 	c_instance_item(c_inst_number VARCHAR2, c_org_id NUMBER)
51 IS
52 SELECT 	cii.instance_id,
53         cii.SERIAL_NUMBER,
54         cii.LOT_NUMBER,
55         cii.INVENTORY_REVISION,
56         msi.INVENTORY_ITEM_ID,
57         msi.MATERIAL_BILLABLE_FLAG,
58         msi.PRIMARY_UOM_CODE
59 FROM 	  CSI_ITEM_INSTANCES cii,
60         MTL_SYSTEM_ITEMS_B msi
61 WHERE 	UPPER(INSTANCE_NUMBER) = UPPER(c_inst_number)
62 AND     msi.inventory_item_id = cii.inventory_item_id
63 AND     msi.organization_id   = c_org_id;
64 
65 CURSOR 	c_get_txn_billing_type_id(c_buss_proc_id NUMBER, c_txn_type_id NUMBER, c_billing_type VARCHAR2)
66 IS
67 SELECT tbt.txn_billing_type_id
68 FROM
69 csm_txn_billing_types_acc acc,
70 cs_txn_billing_types tbt,
71 cs_transaction_types_b ttb,
72 cs_business_processes bpr, cs_bus_process_txns bpt, CS_BILLING_TYPE_CATEGORIES cbtc
73 WHERE acc.txn_billing_type_id = tbt.txn_billing_type_id
74 AND acc.business_process_id = bpt.business_process_id
75 AND tbt.transaction_type_id = ttb.transaction_type_id
76 AND tbt.billing_type = cbtc.billing_type
77 AND cbtc.billing_category IN ('M')
78 AND bpt.transaction_type_id = tbt.transaction_type_id
79 AND bpr.business_process_id = bpt.business_process_id
80 AND bpr.field_service_flag = 'Y'
81 AND bpr.business_process_id = c_buss_proc_id
82 AND bpt.transaction_type_id = c_txn_type_id
83 AND cbtc.billing_type  = c_billing_type;
84 
85 CURSOR c_material_transaction ( b_transaction_type_id NUMBER )
86 IS
87 SELECT ttb.line_order_category_code
88 FROM   CS_TRANSACTION_TYPES_B ttb
89 WHERE ttb.transaction_type_id = b_transaction_type_id;
90 
91 
92 -- Cursor to check if the Assignment Status is either of the
93 -- following rejected, on_hold, cancelled, closed or completed
94 CURSOR c_chk_task_status(p_debrief_header_id NUMBER)
95 IS
96   SELECT tst.rejected_flag, tst.on_hold_flag, tst.cancelled_flag,
97        tst.closed_flag, tst.completed_flag
98   FROM   csf_debrief_headers dh, jtf_task_assignments tas,
99        jtf_task_statuses_b tst
100   WHERE  dh.task_assignment_id    = tas.task_assignment_id
101   AND    tas.assignment_status_id = tst.task_status_id
102   AND    dh.debrief_header_id     = p_debrief_header_id;
103 
104 r_instance_item          c_instance_item%ROWTYPE;
105 r_material_transaction   c_material_transaction%ROWTYPE;
106 r_serial_item            c_serial_item%ROWTYPE;
107 
108 /***
109   This procedure is called by APPLY_CLIENT_CHANGES when an inserted record is to be processed.
110 ***/
111 PROCEDURE APPLY_INSERT
112          (
113            p_record        IN c_debrief_parts%ROWTYPE,
114            p_error_msg     out nocopy    VARCHAR2,
115            x_return_status IN out nocopy VARCHAR2
116          ) IS
117 
118 cursor c_deb_head ( b_task_assignment_id number )
119 is
120 select debrief_header_id
121 ,      task_assignment_id
122 ,      debrief_number
123 from   csf_debrief_headers
124 where  task_assignment_id = b_task_assignment_id;
125 
126 cursor c_task_obj_code ( b_task_assignment_id number)
127 is
128 select source_object_type_code
129 from   jtf_tasks_b jtb
130 ,      jtf_task_assignments jta
131 where  jtb.task_id = jta.task_id
132 and    jta.task_assignment_id = b_task_assignment_id;
133 
134 r_deb_head c_deb_head%rowtype;
135 r_task_obj_code c_task_obj_code%rowtype;
136 
137 l_rejected_flag          VARCHAR2(1);
138 l_on_hold_flag           VARCHAR2(1);
139 l_cancelled_flag         VARCHAR2(1);
140 l_closed_flag            VARCHAR2(1);
141 l_completed_flag         VARCHAR2(1);
142 
143 l_deb_rec                csf_debrief_pub.debrief_rec_type;
144 
145 l_line_rec               csf_debrief_pub.debrief_line_rec_type;
146 l_line_tbl               csf_debrief_pub.debrief_line_tbl_type;
147 
148 
149 l_debrief_header_id      number;
150 l_debrief_number         number;
151 l_date                   date           := sysdate;
152 
153 l_issuing_inventory_org_id   csf_debrief_lines.issuing_inventory_org_id%TYPE;
154 
155 l_msg_data               varchar2(1024);
156 l_msg_count              number;
157 
158 l_transaction_id           number;
159 l_transaction_header_id    number;
160 l_transaction_type_id    NUMBER;
161 l_line_order_category_code VARCHAR2(100);
162 
163 l_spare_update_status      csf_debrief_lines.spare_update_status%TYPE;
164 l_freeform              VARCHAR2(255);
165 l_responsibility_id     NUMBER;
166 l_csm_appl_id           fnd_application.application_id%TYPE;
167 l_CS_INV_ORG_ID         NUMBER;
168 l_inventory_item_id     NUMBER;
169 l_user_id               NUMBER;
170 l_txn_bill_type_id      NUMBER;
171 l_mat_billable_flag     VARCHAR2(30);
172 l_uom_code              VARCHAR2(3);
173 BEGIN
174 
175 CSM_UTIL_PKG.log( 'Entered APPLY_INSERT for debrief_line_id'|| p_record.DEBRIEF_LINE_ID,'CSM_DEBRIEF_PARTS_PKG.APPLY_INSERT',FND_LOG.LEVEL_ERROR);
176 
177 X_RETURN_STATUS := FND_API.G_RET_STS_SUCCESS;
178 G_REJECT_ROW    := true;
179 
180 -- validate to check if subinventory code is present
181   IF p_record.issuing_sub_inventory_code IS NULL THEN
182     p_error_msg := 'Issuing Subinventory Code not present';
183     CSM_UTIL_PKG.log( 'Error in ' || g_object_name || '.APPLY_INSERT:'|| ' ROOT ERROR: ' || p_error_msg|| ' for PK ' ||
184 p_record.DEBRIEF_LINE_ID,'CSM_DEBRIEF_PARTS_PKG.APPLY_INSERT',FND_LOG.LEVEL_ERROR);
185 
186     x_return_status := FND_API.G_RET_STS_ERROR;
187     RETURN;
188   END IF;
189 
190 
191 -- Start with some initialization.
192 -- We need to know if a debrief header record has been made
193 -- form this task_assignment_id. In that case we have to
194 -- reuse it instead of creating one.
195 -- Prerequisite: at most one record exist with the
196 -- task_assignment_id we're looking for.
197 open c_deb_head ( p_record.task_assignment_id );
198 fetch c_deb_head into r_deb_head;
199 if c_deb_head%found then
200    l_debrief_header_id := r_deb_head.debrief_header_id;
201 else
202    l_debrief_header_id := null;
203 end if;
204 close c_deb_head;
205 
206 -- Create a debrief header record.
207 l_deb_rec.debrief_date       := l_date;
208 --l_deb_rec.debrief_number     := To_Char( l_debrief_header_id );
209 l_deb_rec.task_assignment_id := p_record.task_assignment_id;
210 l_deb_rec.debrief_header_id  := l_debrief_header_id;
211 l_deb_rec.debrief_status_id  := NULL;
212 l_deb_rec.last_update_date   := l_date;
213 l_deb_rec.last_updated_by    :=  NVL(p_record.last_updated_by,FND_GLOBAL.USER_ID); --12.1
214 l_deb_rec.creation_date      := l_date;
215 l_deb_rec.created_by         :=  NVL(p_record.created_by,FND_GLOBAL.USER_ID); --12.1
216 l_deb_rec.last_update_login  := FND_GLOBAL.LOGIN_ID;
217 
218 if l_debrief_header_id is null
219 then
220    -- Create a debrief header.
221    l_deb_rec.debrief_number     := null ;
222 
223    csf_debrief_pub.create_debrief
224    ( p_api_version_number => 1.0
225    , p_init_msg_list      => FND_API.G_TRUE
226    , p_commit             => FND_API.G_FALSE
227    , p_debrief_rec        => l_deb_rec
228    , p_debrief_line_tbl   => l_line_tbl
229    , x_debrief_header_id  => l_debrief_header_id
230    , x_return_status      => x_return_status
231    , x_msg_count          => l_msg_count
232    , x_msg_data           => l_msg_data
233    );
234    -- This could have failed, so we need to check.
235    if x_return_status <> FND_API.G_RET_STS_SUCCESS
236    then
237       /*** exception occurred in API -> return errmsg ***/
238       p_error_msg := CSM_UTIL_PKG.GET_ERROR_MESSAGE_TEXT
239       (
240         p_api_error      => TRUE
241       );
242       CSM_UTIL_PKG.log( 'Error in ' || g_object_name || '.APPLY_INSERT:'
243                || ' ROOT ERROR: csf_debrief_pub.create_debrief'
244                || ' for PK ' || p_record.DEBRIEF_LINE_ID,'CSM_DEBRIEF_PARTS_PKG.APPLY_INSERT',FND_LOG.LEVEL_ERROR);
245       x_return_status := FND_API.G_RET_STS_ERROR;
246       return;
247    end if;
248 end if;
249 
250   OPEN c_material_transaction(p_record.transaction_type_id);
251   FETCH c_material_transaction INTO r_material_transaction;
252   IF c_material_transaction%FOUND THEN
253      IF r_material_transaction.line_order_category_code = 'ORDER' THEN
254      				l_transaction_type_id := 93;  --ISSUING
255                     l_line_order_category_code := 'ORDER';
256   	 ELSE
257 		     		l_transaction_type_id := 94;  --RECEIVING
258                     l_line_order_category_code := 'RETURN';
259    	 END IF;
260   ELSE
261      l_transaction_type_id := 93;  --ISSUING
262      l_line_order_category_code := 'ORDER';
263   END IF;
264   CLOSE c_material_transaction;
265 
266 -- get the debrief number
267 open c_deb_head ( p_record.task_assignment_id );
268 fetch c_deb_head into r_deb_head;
269 if c_deb_head%found
270 then
271    l_debrief_number := r_deb_head.debrief_number;
272 end if;
273 close c_deb_head;
274 
275 -- bug 3853406 :commented out since the material transaction will be done by the CSF conc program
276 -- when the assignment status is closed
277 /*
278   -- Call the transact-material API. This API will update
279   -- the on-hand quantity.
280   csp_transactions_pub.transact_material
281     ( p_api_version              => 1.0
282     , p_init_msg_list            => FND_API.G_TRUE
283     , p_commit                   => FND_API.G_FALSE
284     , px_transaction_id          => l_transaction_id
285     , px_transaction_header_id   => l_transaction_header_id
286     , p_inventory_item_id        => p_record.inventory_item_id
287     , p_organization_id          => p_record.issuing_inventory_org_id
288     , p_subinventory_code        => p_record.issuing_sub_inventory_code
289     , p_locator_id               => p_record.issuing_locator_id
290     , p_lot_number               => p_record.item_lotnumber
291     , p_revision                 => p_record.item_revision
292     , p_serial_number            => p_record.item_serial_number
293     , p_quantity                 => p_record.quantity
294     , p_uom                      => p_record.uom_code
295     , p_source_id                => NULL
296     , p_source_line_id           => NULL
297     , p_transaction_type_id      => l_transaction_type_id
298     , p_transfer_to_subinventory => NULL
299     , p_transfer_to_locator      => NULL
300     , p_transfer_to_organization => NULL
301     , p_transaction_source_id    => NULL
302     , p_transaction_source_name  => l_debrief_number
303     , p_trx_source_line_id       => NULL
304     , x_return_status            => x_return_status
305     , x_msg_count                => l_msg_count
306     , x_msg_data                 => l_msg_data
307     );
308 
309   -- This could have failed, so we need to log the error.
310   if x_return_status <> FND_API.G_RET_STS_SUCCESS
311   then
312     -- exception occurred in API -> return errmsg
313     p_error_msg := CSM_UTIL_PKG.GET_ERROR_MESSAGE_TEXT
314       (
315         p_api_error      => TRUE
316       );
317     CSM_UTIL_PKG.log('Error in CSF_DEBRIEF_PARTS_PKG.APPLY_INSERT: '
318       || 'Root cause csp_transactions_pub.transact_material failed: '
319       || 'for Debrief Line Id: ' || p_record.debrief_line_id,'CSM_DEBRIEF_PARTS_PKG.APPLY_INSERT',FND_LOG.LEVEL_ERROR);
320 
321     l_spare_update_status := 'FAILED';
322   else
323     l_spare_update_status := 'SUCCEEDED';
324   end if;
325 */
326 l_spare_update_status := NULL;
327 
328 
329 OPEN c_csm_user_details(p_record.CLID$$CS);
330 FETCH c_csm_user_details INTO l_user_id,l_responsibility_id,l_csm_appl_id;
331 CLOSE c_csm_user_details;
332 
333 --Get the value for Free Form  profile
334 --For HTML5 user profile value defaulted to 'Y'
335 IF (CSM_UTIL_PKG.is_html5_user(p_record.clid$$cs)) THEN
336   l_freeform := 'Y';
337 ELSE
338   l_freeform := fnd_profile.value_specific('CSM_FREE_FORM_ITEM');
339 END IF;
340 
341 l_CS_INV_ORG_ID     := fnd_profile.value_specific('CS_INV_VALIDATION_ORG' , l_user_id , l_responsibility_id , l_csm_appl_id);
342 
343 IF ((NVL(l_freeform,'N') = 'Y') AND
344    ((p_record.FREE_FORM_ITEM IS NOT NULL) OR (l_line_order_category_code<>'RETURN' AND p_record.ITEM_SERIAL_NUMBER IS NOT NULL))) THEN
345 
346 	  IF (p_record.FREE_FORM_ITEM IS NULL) THEN
347 
348 		-- If Free Form Serial Number is present
349 		OPEN  c_serial_item(p_record.ITEM_SERIAL_NUMBER, l_CS_INV_ORG_ID);
350 		FETCH c_serial_item INTO r_serial_item;
351 		CLOSE c_serial_item;
352 
353 		l_inventory_item_id                 := r_serial_item.inventory_item_id;
354 		l_line_rec.instance_id              := r_serial_item.instance_id;
355 		l_line_rec.uom_code                 := r_serial_item.PRIMARY_UOM_CODE;
356 		l_line_rec.item_serial_number       := r_serial_item.SERIAL_NUMBER;
357 		l_line_rec.item_revision            := r_serial_item.INVENTORY_REVISION;
358 		l_line_rec.item_lotnumber           := r_serial_item.LOT_NUMBER ;
359 		l_mat_billable_flag                 := r_serial_item.MATERIAL_BILLABLE_FLAG;
360 
361 	  ELSE    -- If Free Form Item is present
362 
363 	   IF (CSM_UTIL_PKG.is_html5_user(p_record.clid$$cs)) THEN   --for html5 INSTANCE  NUMBER is passed in free form item.
364 		 OPEN  c_instance_item(p_record.FREE_FORM_ITEM, l_CS_INV_ORG_ID);
365 		 FETCH c_instance_item INTO r_instance_item;
366 		 CLOSE c_instance_item;
367 			l_inventory_item_id                 := r_instance_item.inventory_item_id;
368 			l_line_rec.instance_id              := r_instance_item.instance_id;
369 			l_line_rec.uom_code                 := r_instance_item.PRIMARY_UOM_CODE;
370 			l_line_rec.item_serial_number       := r_instance_item.SERIAL_NUMBER;
371 			l_line_rec.item_revision            := r_instance_item.INVENTORY_REVISION;
372 			l_line_rec.item_lotnumber           := r_instance_item.LOT_NUMBER ;
373 			l_mat_billable_flag                 := r_instance_item.MATERIAL_BILLABLE_FLAG;
374 
375 	   ELSE  --item name is passed in free form
376 		OPEN  c_get_item_id(p_record.FREE_FORM_ITEM, l_CS_INV_ORG_ID);
377 		FETCH c_get_item_id INTO l_inventory_item_id, l_mat_billable_flag, l_uom_code;
378 		CLOSE c_get_item_id;
379 		l_line_rec.uom_code                 := l_uom_code;
380 	   END IF;
381 
382 	END IF;
383 
384 	 --Return if the item is invalid
385 	  IF l_inventory_item_id IS NULL THEN
386 		p_error_msg := 'Item entered through Free form is Invalid.Please check if the item is valid in the Service Inventory Validation org.';
387 		CSM_UTIL_PKG.log( 'Error in ' || g_object_name || '.APPLY_INSERT:'
388 				   || ' ROOT ERROR: ' || p_error_msg
389 				   || ' for PK ' ||p_record.DEBRIEF_LINE_ID,
390 				   'CSM_DEBRIEF_PARTS_PKG.APPLY_INSERT',FND_LOG.LEVEL_ERROR);
391 
392 		x_return_status := FND_API.G_RET_STS_ERROR;
393 		RETURN;
394 	  END IF;
395 
396 	  l_line_rec.inventory_item_id        := l_inventory_item_id;
397 
398 	  OPEN  c_get_txn_billing_type_id (p_record.business_process_id, p_record.transaction_type_id, l_mat_billable_flag);
399 	  FETCH c_get_txn_billing_type_id INTO l_txn_bill_type_id;
400 	  CLOSE c_get_txn_billing_type_id;
401 	  l_line_rec.txn_billing_type_id      := l_txn_bill_type_id;
402 
403 
404 ELSE   --not free form
405 	  l_line_rec.inventory_item_id        := p_record.inventory_item_id;
406 	  l_line_rec.txn_billing_type_id      := p_record.txn_billing_type_id;
407 	  l_line_rec.uom_code                 := p_record.uom_code;
408 	  l_line_rec.instance_id              := p_record.instance_id;
409 	  l_line_rec.item_serial_number       := p_record.item_serial_number;
410 	  l_line_rec.item_revision            := p_record.item_revision;
411 	  l_line_rec.item_lotnumber           := p_record.item_lotnumber;
412 END IF;
413 
414 
415 --l_line_rec.debrief_line_id          := p_record.debrief_line_id;
416 l_line_rec.debrief_header_id        := l_debrief_header_id;
417 IF l_line_order_category_code = 'ORDER' THEN
418   l_line_rec.issuing_inventory_org_id := p_record.issuing_inventory_org_id;
419   l_line_rec.receiving_inventory_org_id := NULL;
420   l_line_rec.receiving_sub_inventory_code := NULL;
421   l_line_rec.receiving_locator_id         := NULL;
422   l_line_rec.issuing_sub_inventory_code   := p_record.issuing_sub_inventory_code;
423   l_line_rec.issuing_locator_id           := p_record.issuing_locator_id;
424 ELSE
425   l_line_rec.receiving_inventory_org_id   := p_record.issuing_inventory_org_id;
426   l_line_rec.issuing_inventory_org_id := NULL;
427   l_line_rec.issuing_sub_inventory_code := NULL;
428   l_line_rec.issuing_locator_id         := NULL;
429   l_line_rec.receiving_sub_inventory_code := p_record.issuing_sub_inventory_code;
430   l_line_rec.receiving_locator_id         := p_record.issuing_locator_id;
431 END IF;
432 l_line_rec.last_update_date         := l_date;
433 l_line_rec.last_updated_by          :=  NVL(p_record.last_updated_by,FND_GLOBAL.USER_ID); --12.1
434 l_line_rec.creation_date            := l_date;
435 l_line_rec.created_by               := NVL(p_record.created_by,FND_GLOBAL.USER_ID); --12.1
436 l_line_rec.last_update_login        := FND_GLOBAL.LOGIN_ID;
437 l_line_rec.spare_update_status      := l_spare_update_status;
438 
439 L_LINE_REC.SERVICE_DATE             := NVL(P_RECORD.SERVICE_DATE,L_DATE);
440 l_line_rec.debrief_line_number      := p_record.debrief_line_number;
441 l_line_rec.quantity                 := p_record.quantity;
442 l_line_rec.business_process_id      := p_record.business_process_id;
443 l_line_rec.channel_code		    	:= 'CSF_MFS';
444 l_line_rec.transaction_type_id      := p_record.transaction_type_id;
445 l_line_rec.material_reason_code      := p_record.material_reason_code;
446 l_line_rec.attribute1               := p_record.attribute1;
447 l_line_rec.attribute2               := p_record.attribute2;
448 l_line_rec.attribute3               := p_record.attribute3;
449 l_line_rec.attribute4               := p_record.attribute4;
450 l_line_rec.attribute5               := p_record.attribute5;
451 l_line_rec.attribute6               := p_record.attribute6;
452 l_line_rec.attribute7               := p_record.attribute7;
453 l_line_rec.attribute8               := p_record.attribute8;
454 l_line_rec.attribute9               := p_record.attribute9;
455 l_line_rec.attribute10              := p_record.attribute10;
456 l_line_rec.attribute11              := p_record.attribute11;
457 l_line_rec.attribute12              := p_record.attribute12;
458 l_line_rec.attribute13              := p_record.attribute13;
459 l_line_rec.attribute14              := p_record.attribute14;
460 l_line_rec.attribute15              := p_record.attribute15;
461 l_line_rec.attribute_category       := p_record.attribute_category;
462 l_line_rec.disposition_code         := p_record.disposition_code;
463 l_line_rec.return_reason_code       := p_record.return_reason_code;
464 l_line_rec.parent_product_id        := p_record.parent_product_id;
465 l_line_rec.removed_product_id       := p_record.removed_product_id;
466 l_line_rec.RETURN_DATE       		:= p_record.RETURN_DATE;
467 l_line_rec.USAGE_TYPE       		:= p_record.USAGE_TYPE;
468 l_line_rec.DEST_ORGANIZATION_ID     := p_record.RETURN_ORGANIZATION_ID;
469 l_line_rec.DEST_SUBINVENTORY_NAME   := p_record.RETURN_SUBINVENTORY_NAME;
470 l_line_rec.CARRIER_CODE             := p_record.CARRIER_CODE;
471 l_line_rec.SHIPPING_METHOD          := p_record.SHIPPING_METHOD;
472 l_line_rec.SHIPMENT_NUMBER          := p_record.SHIPPING_NUMBER;
473 l_line_rec.WAYBILL                  := p_record.WAYBILL;
474 l_line_tbl(1) := l_line_rec;
475 
476 -- Fetch SOURCE_OBJECT_TYPE_CODE from task record
477 open c_task_obj_code ( p_record.task_assignment_id );
478 fetch c_task_obj_code into r_task_obj_code;
479 close c_task_obj_code;
480 
481 csf_debrief_pub.create_debrief_lines
482 ( p_api_version_number      => 1.0
483 , p_init_msg_list           => FND_API.G_TRUE
484 , p_commit                  => FND_API.G_FALSE
485 , x_return_status           => x_return_status
486 , x_msg_count               => l_msg_count
487 , x_msg_data                => l_msg_data
488 , p_debrief_header_id       => l_debrief_header_id
489 , p_debrief_line_tbl        => l_line_tbl
490 , p_source_object_type_code => r_task_obj_code.source_object_type_code
491 );
492 if x_return_status <> FND_API.G_RET_STS_SUCCESS
493 then
494     /*** exception occurred in API -> return errmsg ***/
495     p_error_msg := CSM_UTIL_PKG.GET_ERROR_MESSAGE_TEXT
496       (
497         p_api_error      => TRUE
498       );
499     CSM_UTIL_PKG.log( 'Error in ' || g_object_name || '.APPLY_INSERT:'
500                || ' ROOT ERROR: csf_debrief_pub.create_debrief_lines'
501                || ' for PK ' || p_record.DEBRIEF_LINE_ID, 'CSM_DEBRIEF_PARTS_PKG.APPLY_INSERT',FND_LOG.LEVEL_ERROR );
502    x_return_status := FND_API.G_RET_STS_ERROR;
503    return;
504 end if;
505 
506 -- For a given debrief header check the task Assignment status.
507 -- If it is one of the following -
508 -- rejected, on_hold, cancelled, closed or completed then call the api
509 --  csf_debrief_update_pkg.form_Call for processing charges
510 
511     OPEN c_chk_task_status ( l_debrief_header_id );
512     FETCH c_chk_task_status INTO l_rejected_flag, l_on_hold_flag,
513        l_cancelled_flag, l_closed_flag, l_completed_flag;
514 
515     IF c_chk_task_status%FOUND THEN
516        IF ( (l_rejected_flag='Y') OR (l_on_hold_flag='Y') OR (l_cancelled_flag='Y')
517           OR (l_closed_flag='Y') OR (l_completed_flag='Y') ) THEN
518 
519 		  fnd_global.apps_initialize(l_user_id , l_responsibility_id , l_csm_appl_id);	--Bug 16192129/14262923
520 
521           csf_debrief_update_pkg.form_Call (1.0, l_debrief_header_id );
522        END IF;
523     END IF;
524 
525     CLOSE c_chk_task_status;
526 
527 exception
528   when others then
529      fnd_msg_pub.Add_Exc_Msg( g_object_name, 'APPLY_INSERT', sqlerrm);
530      p_error_msg := CSM_UTIL_PKG.GET_ERROR_MESSAGE_TEXT
531      (
532        p_api_error      => TRUE
533      );
534 
535      CSM_UTIL_PKG.log( 'Exception in ' || g_object_name || '.APPLY_INSERT:'
536                || ' for PK ' || p_record.DEBRIEF_LINE_ID,'CSM_DEBRIEF_PARTS_PKG.APPLY_INSERT',FND_LOG.LEVEL_EXCEPTION );
537      x_return_status := FND_API.G_RET_STS_ERROR;
538 END APPLY_INSERT;
539 
540 /***
541   This procedure is called by APPLY_CLIENT_CHANGES when an inserted record is to be processed.
542 ***/
543 PROCEDURE APPLY_UPDATE
544          (
545            p_record        IN c_debrief_parts%ROWTYPE,
546            p_error_msg     out nocopy    VARCHAR2,
547            x_return_status IN out nocopy VARCHAR2
548          ) IS
549 
550 --CURSOR Declarations
551 CURSOR c_cdl( b_debrief_line_number csf_debrief_lines.debrief_line_number%TYPE )
552 IS
553     SELECT cdl.debrief_header_id
554     ,      cdl.debrief_line_id
555     ,      cdl.last_update_date
556     ,      cdl.issuing_inventory_org_id
557     from   CSF_DEBRIEF_LINES CDL
558     WHERE  cdl.debrief_line_number = b_debrief_line_number;
559 
560 CURSOR c_cdline( b_debrief_line_num csf_debrief_lines.debrief_line_number%TYPE )
561 IS
562     SELECT cdl.debrief_line_id
563     from   CSF_DEBRIEF_LINES CDL
564     where  CDL.DEBRIEF_LINE_NUMBER = b_debrief_line_num;
565 
566 --VARIABLE Declarations
567 r_cdl c_cdl%ROWTYPE;
568 
569 l_line_rec               csf_debrief_pub.debrief_line_rec_type;
570 l_issuing_inventory_org_id   csf_debrief_lines.issuing_inventory_org_id%TYPE;
571 l_spare_update_status      csf_debrief_lines.spare_update_status%TYPE;
572 
573 l_debrief_header_id      NUMBER;
574 l_debrief_number         NUMBER;
575 l_date                   DATE           := SYSDATE;
576 l_msg_data               VARCHAR2(1024);
577 l_msg_count              NUMBER;
578 l_transaction_type_id    NUMBER;
579 l_rejected_flag          VARCHAR2(1);
580 l_on_hold_flag           VARCHAR2(1);
581 l_cancelled_flag         VARCHAR2(1);
582 l_closed_flag            VARCHAR2(1);
583 l_completed_flag         VARCHAR2(1);
584 l_line_order_category_code VARCHAR2(100);
585 l_freeform              VARCHAR2(255);
586 l_responsibility_id     NUMBER;
587 l_csm_appl_id           fnd_application.application_id%TYPE;
588 l_CS_INV_ORG_ID         NUMBER;
589 l_inventory_item_id     NUMBER;
590 l_user_id               NUMBER;
591 l_txn_bill_type_id      NUMBER;
592 l_mat_billable_flag     VARCHAR2(30);
593 L_UOM_CODE              varchar2(3);
594 l_debrief_line_id       NUMBER;
595 BEGIN
596 CSM_UTIL_PKG.log( 'Entered APPLY_UPDATE for debrief_line_id'|| p_record.DEBRIEF_LINE_ID,'CSM_DEBRIEF_PARTS_PKG.APPLY_INSERT',FND_LOG.LEVEL_ERROR);
597 
598 X_RETURN_STATUS := FND_API.G_RET_STS_SUCCESS;
599 G_REJECT_ROW    := FALSE;
600 
601 -- validate to check if subinventory code is present
602   IF p_record.issuing_sub_inventory_code IS NULL THEN
603     p_error_msg := 'Issuing Subinventory Code not present';
604     CSM_UTIL_PKG.log( 'Error in ' || g_object_name || '.APPLY_UPDATE:'
605                || ' ROOT ERROR: ' || p_error_msg
606                || ' for PK ' ||
607             p_record.DEBRIEF_LINE_ID,'CSM_DEBRIEF_PARTS_PKG.APPLY_UPDATE',FND_LOG.LEVEL_ERROR);
608 
609     x_return_status := FND_API.G_RET_STS_ERROR;
610     RETURN;
611   END IF;
612 
613   if P_RECORD.DEBRIEF_HEADER_ID is null then
614     OPEN c_cdl( p_record.debrief_line_number);
615     FETCH c_cdl into r_cdl;
616     IF c_cdl%found THEN
617       l_debrief_header_id := r_cdl.debrief_header_id;
618     ELSE
619        l_debrief_header_id := NULL;
620     END IF;
621     CLOSE c_cdl;
622   ELSE
623     l_debrief_header_id  :=p_record.debrief_header_id;
624   END IF;
625 
626 -- validation for valid Debrief header id
627   IF l_debrief_header_id IS NULL THEN
628     p_error_msg := 'The Debrief Header is Missing for the Given Debrief lind id.Please verify';
629     CSM_UTIL_PKG.log( 'Error in ' || g_object_name || '.APPLY_UPDATE:'
630                || ' ROOT ERROR: ' || p_error_msg
631                || ' for PK ' ||
632             p_record.DEBRIEF_LINE_ID,'CSM_DEBRIEF_PARTS_PKG.APPLY_UPDATE',FND_LOG.LEVEL_ERROR);
633     x_return_status := FND_API.G_RET_STS_ERROR;
634     RETURN;
635   END IF;
636 --check for the stale data
637   -- SERVER_WINS profile value
638   IF(fnd_profile.value(csm_profile_pkg.g_JTM_APPL_CONFLICT_RULE)
639        = csm_profile_pkg.g_SERVER_WINS) THEN
640     IF(r_cdl.last_update_date <> p_record.server_last_update_date) THEN
641        x_return_status := FND_API.G_RET_STS_ERROR;
642        p_error_msg :=
643           'UPWARD SYNC CONFLICT: CLIENT LOST: CSM_DEBRIEF_PARTS_PKG.APPLY_UPDATE: P_KEY = '
644           || p_record.debrief_line_id;
645        csm_util_pkg.log(p_error_msg,'CSM_DEBRIEF_PARTS_PKG.APPLY_UPDATE',FND_LOG.LEVEL_ERROR);
646        RETURN;
647     END IF;
648   END IF;
649 
650   --CLIENT_WINS (or client is allowd to update the record)
651 
652   OPEN c_material_transaction(p_record.transaction_type_id);
653   FETCH c_material_transaction INTO r_material_transaction;
654   IF c_material_transaction%FOUND THEN
655      IF r_material_transaction.line_order_category_code = 'ORDER' THEN
656      				l_transaction_type_id := 93;  --ISSUING
657                     l_line_order_category_code := 'ORDER';
658   	 ELSE
659 		     		l_transaction_type_id := 94;  --RECEIVING
660                     l_line_order_category_code := 'RETURN';
661    	 END IF;
662   ELSE
663      				l_transaction_type_id := 93;  --ISSUING
664                     l_line_order_category_code := 'ORDER';
665   END IF;
666   CLOSE c_material_transaction;
667 
668 l_spare_update_status := NULL;
669 
670 OPEN c_csm_user_details(p_record.CLID$$CS);
671 FETCH c_csm_user_details INTO l_user_id,l_responsibility_id,l_csm_appl_id;
672 CLOSE c_csm_user_details;
673 
674 --Get the value for Free Form  profile
675 --For HTML5 user profile value defaulted to 'Y'
676 IF (CSM_UTIL_PKG.is_html5_user(p_record.clid$$cs)) THEN
677   l_freeform := 'Y';
678 ELSE
679   l_freeform := fnd_profile.value_specific('CSM_FREE_FORM_ITEM');
680 END IF;
681 
682 l_CS_INV_ORG_ID     := fnd_profile.value_specific('CS_INV_VALIDATION_ORG' , l_user_id , l_responsibility_id , l_csm_appl_id);
683 
684 
685 IF ((NVL(l_freeform,'N') = 'Y') AND
686    ((p_record.FREE_FORM_ITEM IS NOT NULL) OR (l_line_order_category_code<>'RETURN' AND p_record.ITEM_SERIAL_NUMBER IS NOT NULL))) THEN
687 
688 	  IF (p_record.FREE_FORM_ITEM IS NULL) THEN
689 
690 		-- If Free Form Serial Number is present
691 		OPEN  c_serial_item(p_record.ITEM_SERIAL_NUMBER, l_CS_INV_ORG_ID);
692 		FETCH c_serial_item INTO r_serial_item;
693 		CLOSE c_serial_item;
694 
695 		l_inventory_item_id                 := r_serial_item.inventory_item_id;
696 		l_line_rec.instance_id              := r_serial_item.instance_id;
697 		l_line_rec.uom_code                 := r_serial_item.PRIMARY_UOM_CODE;
698 		l_line_rec.item_serial_number       := r_serial_item.SERIAL_NUMBER;
699 		l_line_rec.item_revision            := r_serial_item.INVENTORY_REVISION;
700 		l_line_rec.item_lotnumber           := r_serial_item.LOT_NUMBER ;
701 		l_mat_billable_flag                 := r_serial_item.MATERIAL_BILLABLE_FLAG;
702 
703 	  ELSE    -- If Free Form Item is present
704 
705 	   IF (CSM_UTIL_PKG.is_html5_user(p_record.clid$$cs)) THEN   --for html5 INSTANCE  NUMBER is passed in free form item.
706 		 OPEN  c_instance_item(p_record.FREE_FORM_ITEM, l_CS_INV_ORG_ID);
707 		 FETCH c_instance_item INTO r_instance_item;
708 		 CLOSE c_instance_item;
709 			l_inventory_item_id                 := r_instance_item.inventory_item_id;
710 			l_line_rec.instance_id              := r_instance_item.instance_id;
711 			l_line_rec.uom_code                 := r_instance_item.PRIMARY_UOM_CODE;
712 			l_line_rec.item_serial_number       := r_instance_item.SERIAL_NUMBER;
713 			l_line_rec.item_revision            := r_instance_item.INVENTORY_REVISION;
714 			l_line_rec.item_lotnumber           := r_instance_item.LOT_NUMBER ;
715 			l_mat_billable_flag                 := r_instance_item.MATERIAL_BILLABLE_FLAG;
716 
717 	   ELSE  --item name is passed in free form
718 		OPEN  c_get_item_id(p_record.FREE_FORM_ITEM, l_CS_INV_ORG_ID);
719 		FETCH c_get_item_id INTO l_inventory_item_id, l_mat_billable_flag, l_uom_code;
720 		CLOSE c_get_item_id;
721 		l_line_rec.uom_code                 := l_uom_code;
722 	   END IF;
723 
724 	END IF;
725 
726 	 --Return if the item is invalid
727 	  IF l_inventory_item_id IS NULL THEN
728 		p_error_msg := 'Item entered through Free form is Invalid.Please check if the item is valid in the Service Inventory Validation org.';
729 		CSM_UTIL_PKG.log( 'Error in ' || g_object_name || '.APPLY_INSERT:'
730 				   || ' ROOT ERROR: ' || p_error_msg
731 				   || ' for PK ' ||p_record.DEBRIEF_LINE_ID,
732 				   'CSM_DEBRIEF_PARTS_PKG.APPLY_INSERT',FND_LOG.LEVEL_ERROR);
733 
734 		x_return_status := FND_API.G_RET_STS_ERROR;
735 		RETURN;
736 	  END IF;
737 
738 	  l_line_rec.inventory_item_id        := l_inventory_item_id;
739 
740 	  OPEN  c_get_txn_billing_type_id (p_record.business_process_id, p_record.transaction_type_id, l_mat_billable_flag);
741 	  FETCH c_get_txn_billing_type_id INTO l_txn_bill_type_id;
742 	  CLOSE c_get_txn_billing_type_id;
743 	  l_line_rec.txn_billing_type_id      := l_txn_bill_type_id;
744 
745 
746 ELSE   --not free form
747   l_line_rec.inventory_item_id        := p_record.inventory_item_id;
748   l_line_rec.txn_billing_type_id      := p_record.txn_billing_type_id;
749   l_line_rec.uom_code                 := p_record.uom_code;
750   l_line_rec.instance_id              := p_record.instance_id;
751   l_line_rec.item_serial_number       := p_record.item_serial_number;
752   l_line_rec.item_revision            := p_record.item_revision;
753   l_line_rec.item_lotnumber           := p_record.item_lotnumber;
754 END IF;
755 
756 l_line_rec.debrief_line_id          := p_record.debrief_line_id;
757 l_line_rec.debrief_header_id        := l_debrief_header_id;
758 
759 IF l_line_order_category_code = 'ORDER' THEN
760   l_line_rec.issuing_inventory_org_id     := p_record.issuing_inventory_org_id;
761   l_line_rec.receiving_inventory_org_id   := NULL;
762   l_line_rec.receiving_sub_inventory_code := NULL;
763   l_line_rec.receiving_locator_id         := NULL;
764   l_line_rec.issuing_sub_inventory_code   := p_record.issuing_sub_inventory_code;
765   l_line_rec.issuing_locator_id           := p_record.issuing_locator_id;
766 ELSE
767   l_line_rec.receiving_inventory_org_id   := p_record.issuing_inventory_org_id;
768   l_line_rec.issuing_inventory_org_id     := NULL;
769   l_line_rec.issuing_sub_inventory_code   := NULL;
770   l_line_rec.issuing_locator_id           := NULL;
771   l_line_rec.receiving_sub_inventory_code := p_record.issuing_sub_inventory_code;
772   l_line_rec.receiving_locator_id         := p_record.issuing_locator_id;
773 END IF;
774 
775 l_line_rec.last_update_date         := l_date;
776 l_line_rec.last_updated_by          :=  NVL(p_record.last_updated_by,FND_GLOBAL.USER_ID); --12.1
777 l_line_rec.last_update_login        := FND_GLOBAL.LOGIN_ID;
778 l_line_rec.spare_update_status      := l_spare_update_status;
779 l_line_rec.service_date             := nvl(p_record.service_date,l_date);
780 l_line_rec.quantity                 := p_record.quantity;
781 l_line_rec.business_process_id      := p_record.business_process_id;
782 l_line_rec.channel_code		    	    := 'CSF_MFS';
783 l_line_rec.transaction_type_id      := p_record.transaction_type_id;
784 l_line_rec.material_reason_code     := p_record.material_reason_code;
785 l_line_rec.attribute1               := p_record.attribute1;
786 l_line_rec.attribute2               := p_record.attribute2;
787 l_line_rec.attribute3               := p_record.attribute3;
788 l_line_rec.attribute4               := p_record.attribute4;
789 l_line_rec.attribute5               := p_record.attribute5;
790 l_line_rec.attribute6               := p_record.attribute6;
791 l_line_rec.attribute7               := p_record.attribute7;
792 l_line_rec.attribute8               := p_record.attribute8;
793 l_line_rec.attribute9               := p_record.attribute9;
794 l_line_rec.attribute10              := p_record.attribute10;
795 l_line_rec.attribute11              := p_record.attribute11;
796 l_line_rec.attribute12              := p_record.attribute12;
797 l_line_rec.attribute13              := p_record.attribute13;
798 l_line_rec.attribute14              := p_record.attribute14;
799 l_line_rec.attribute15              := p_record.attribute15;
800 l_line_rec.attribute_category       := p_record.attribute_category;
801 l_line_rec.disposition_code         := p_record.disposition_code;
802 l_line_rec.return_reason_code       := p_record.return_reason_code;
803 l_line_rec.parent_product_id        := p_record.parent_product_id;
804 l_line_rec.removed_product_id       := p_record.removed_product_id;
805 l_line_rec.RETURN_DATE       		:= p_record.RETURN_DATE;
806 l_line_rec.USAGE_TYPE       		:= p_record.USAGE_TYPE;
807 l_line_rec.DEST_ORGANIZATION_ID     := p_record.RETURN_ORGANIZATION_ID;
808 l_line_rec.DEST_SUBINVENTORY_NAME   := p_record.RETURN_SUBINVENTORY_NAME;
809 l_line_rec.CARRIER_CODE             := p_record.CARRIER_CODE;
810 l_line_rec.SHIPPING_METHOD          := p_record.SHIPPING_METHOD;
811 l_line_rec.SHIPMENT_NUMBER          := p_record.SHIPPING_NUMBER;
812 l_line_rec.WAYBILL                  := p_record.WAYBILL;
813 --Get valid line id from Server for update
814 
815 IF p_record.debrief_line_id = NVL(p_record.debrief_line_number,-1) THEN
816   --get Debrief line id from server
817   open  C_CDLINE(P_RECORD.DEBRIEF_LINE_NUMBER);
818   FETCH C_CDLINE into l_debrief_line_id;
819   close C_CDLINE;
820   l_line_rec.debrief_line_id          := l_debrief_line_id;
821 END IF;
822 
823 
824 -- Update the debrief line
825 csf_debrief_pub.update_debrief_line
826 ( p_api_version_number      => 1.0
827 , p_init_msg_list           => FND_API.G_TRUE
828 , p_commit                  => FND_API.G_FALSE
829 , x_return_status           => x_return_status
830 , x_msg_count               => l_msg_count
831 , x_msg_data                => l_msg_data
832 , p_debrief_line_rec        => l_line_rec
833 );
834 
835 IF  x_return_status <> FND_API.G_RET_STS_SUCCESS
836 THEN
837     /*** exception occurred in API -> return errmsg ***/
838     p_error_msg := CSM_UTIL_PKG.GET_ERROR_MESSAGE_TEXT(p_api_error=> TRUE);
839     CSM_UTIL_PKG.log( 'Error in ' || g_object_name || '.APPLY_UPDATE:'
840                || ' ROOT ERROR: csf_debrief_pub.update_debrief_line'
841                || ' for PK ' || p_record.DEBRIEF_LINE_ID, 'CSM_DEBRIEF_PARTS_PKG.APPLY_UPDATE',FND_LOG.LEVEL_ERROR );
842    x_return_status := FND_API.G_RET_STS_ERROR;
843    RETURN;
844 END IF;
845 
846 -- For a given debrief header check the task Assignment status.
847 -- If it is one of the following -
848 -- rejected, on_hold, cancelled, closed or completed then call the api
849 --  csf_debrief_update_pkg.form_Call for processing charges
850 
851     OPEN c_chk_task_status ( l_debrief_header_id );
852     FETCH c_chk_task_status INTO l_rejected_flag, l_on_hold_flag,
853        l_cancelled_flag, l_closed_flag, l_completed_flag;
854 
855     IF c_chk_task_status%FOUND THEN
856        IF ( (l_rejected_flag='Y') OR (l_on_hold_flag='Y') OR (l_cancelled_flag='Y')
857           OR (l_closed_flag='Y') OR (l_completed_flag='Y') ) THEN
858           csf_debrief_update_pkg.form_Call (1.0, l_debrief_header_id );
859        END IF;
860     END IF;
861     CLOSE c_chk_task_status;
862 
863 EXCEPTION
864 WHEN OTHERS THEN
865      fnd_msg_pub.Add_Exc_Msg( g_object_name, 'APPLY_UPDATE', sqlerrm);
866      p_error_msg := CSM_UTIL_PKG.GET_ERROR_MESSAGE_TEXT(p_api_error => TRUE);
867      CSM_UTIL_PKG.log( 'Exception in ' || g_object_name || '.APPLY_UPDATE:'
868                || ' for PK ' || p_record.DEBRIEF_LINE_ID,'CSM_DEBRIEF_PARTS_PKG.APPLY_UPDATE',FND_LOG.LEVEL_EXCEPTION );
869      x_return_status := FND_API.G_RET_STS_ERROR;
870 END APPLY_UPDATE;
871 
872 
873 /***
874   This procedure is called by APPLY_CLIENT_CHANGES for every record in in-queue that needs to be processed.
875 ***/
876 PROCEDURE APPLY_RECORD
877          (
878            p_record        IN     c_debrief_parts%ROWTYPE,
879            p_error_msg     out nocopy    VARCHAR2,
880            x_return_status IN out nocopy VARCHAR2
881          ) IS
882 BEGIN
883   /*** initialize return status and message list ***/
884   x_return_status := FND_API.G_RET_STS_SUCCESS;
885   FND_MSG_PUB.INITIALIZE;
886 
887   IF p_record.dmltype$$='I' THEN
888     -- Process insert
889     APPLY_INSERT
890       (
891         p_record,
892         p_error_msg,
893         x_return_status
894       );
895   ELSIF p_record.dmltype$$='U' THEN
896     -- Process update
897     APPLY_UPDATE
898       (
899         p_record,
900         p_error_msg,
901         x_return_status
902       );
903   ELSE
904     -- Process delete ; not supported for this entity
905       CSM_UTIL_PKG.LOG
906         ( 'Delete is not supported for this entity'
907       || ' for PK ' || p_record.debrief_line_id ,'CSM_DEBRIEF_PARTS_PKG.APPLY_RECORD',FND_LOG.LEVEL_ERROR);
908 
909     p_error_msg := CSM_UTIL_PKG.GET_ERROR_MESSAGE_TEXT
910       (
911         p_message        => 'CSM_DML_OPERATION'
912       , p_token_name1    => 'DML'
913       , p_token_value1   => p_record.dmltype$$
914       );
915 
916     x_return_status := FND_API.G_RET_STS_SUCCESS;
917   END IF;
918 
919 EXCEPTION WHEN OTHERS THEN
920   /*** defer record when any process exception occurs ***/
921     CSM_UTIL_PKG.LOG
922     ( 'Exception occurred in CSM_DEBRIEF_parts_PKG.APPLY_RECORD:' || ' ' || sqlerrm
923       || ' for PK ' || p_record.debrief_line_id,'CSM_DEBRIEF_PARTS_PKG.APPLY_RECORD',FND_LOG.LEVEL_EXCEPTION );
924 
925   fnd_msg_pub.Add_Exc_Msg( g_object_name, 'APPLY_RECORD', sqlerrm);
926   p_error_msg := CSM_UTIL_PKG.GET_ERROR_MESSAGE_TEXT
927     (
928       p_api_error      => TRUE
929     );
930 
931   x_return_status := FND_API.G_RET_STS_ERROR;
932 END APPLY_RECORD;
933 
934 /***
935   This procedure is called by CSM_UTIL_PKG when publication item <replace>
936   is dirty. This happens when a mobile field service device executed DML on an updatable table and did
937   a fast sync. This procedure will insert the data that came from mobile into the backend tables using
938   public APIs.
939 ***/
940 PROCEDURE APPLY_CLIENT_CHANGES
941          (
942            p_user_name     IN VARCHAR2,
943            p_tranid        IN NUMBER,
944            p_debug_level   IN NUMBER,
945            x_return_status IN out nocopy VARCHAR2,
946 		   p_task_assignment_id IN NUMBER
947          ) IS
948 
949   L_PROCESS_STATUS varchar2(1);
950   l_error_msg      VARCHAR2(4000);
951   TYPE c_curtype is ref cursor;
952   c_cur c_curtype;
953   r_debrief_parts c_debrief_parts%rowtype;
954 BEGIN
955 
956   csm_util_pkg.log('csm_debrief_parts_pkg.apply_client_changes entered','CSM_DEBRIEF_PARTS_PKG.APPLY_CLIENT_CHANGES',FND_LOG.LEVEL_ERROR);
957 
958   g_debug_level := p_debug_level;
959   x_return_status := FND_API.G_RET_STS_SUCCESS;
960 
961   /*** loop through debrief parts records in inqueue ***/
962   IF p_task_assignment_id IS NULL THEN
963    OPEN c_cur FOR 'SELECT * FROM  csf_m_debrief_parts_inq inq WHERE tranid$$ = '||p_tranid||' AND   clid$$cs = '''||p_user_name
964     ||''' AND  TASK_ASSIGNMENT_ID NOT IN  ('||CSM_UTIL_PKG.get_String_fromList(g_processed_assignment_list)||')';
965   ELSE
966    g_processed_assignment_list(g_processed_assignment_list.COUNT+1):=p_task_assignment_id;
967    OPEN c_cur FOR 'SELECT * FROM  csf_m_debrief_parts_inq WHERE tranid$$ = '||p_tranid||' AND   clid$$cs = '''||p_user_name
968                    ||''' AND TASK_ASSIGNMENT_ID='||p_task_assignment_id;
969   END IF;
970 
971   LOOP
972     FETCH c_cur INTO r_debrief_parts;
973 	EXIT WHEN c_cur%NOTFOUND;
974 
975     SAVEPOINT save_rec;
976 
977     /*** apply record ***/
978     APPLY_RECORD
979       (
980         r_debrief_parts
981       , l_error_msg
982       , l_process_status
983       );
984 
985     /*** was record processed successfully? ***/
986     IF l_process_status = FND_API.G_RET_STS_SUCCESS THEN
987       /*** Yes -> delete record from inqueue ***/
988       if G_REJECT_ROW then  --IF insert then reject the record as new line id has to be downloaded
989         CSM_UTIL_PKG.REJECT_RECORD
990           ( p_user_name,
991             p_tranid,
992             r_debrief_parts.seqno$$,
993             r_debrief_parts.debrief_line_id,
994             g_object_name,
995             g_pub_name,
996             l_error_msg,
997             l_process_status
998             );
999         IF (l_process_status = FND_API.G_RET_STS_SUCCESS AND --When reapplying rejet row will not call delete
1000           ASG_DEFER.is_deferred(p_user_name,p_tranid,g_pub_name,r_debrief_parts.seqno$$)=FND_API.G_TRUE) THEN
1001           CSM_UTIL_PKG.DELETE_RECORD
1002             ( p_user_name,
1003               p_tranid,
1004               r_debrief_parts.seqno$$,
1005               r_debrief_parts.debrief_line_id,
1006               g_object_name,
1007               g_pub_name,
1008               l_error_msg,
1009               l_process_status
1010             );
1011         end if;
1012       ELSE
1013         CSM_UTIL_PKG.DELETE_RECORD
1014           ( p_user_name,
1015             p_tranid,
1016             r_debrief_parts.seqno$$,
1017             r_debrief_parts.debrief_line_id,
1018             g_object_name,
1019             g_pub_name,
1020             l_error_msg,
1021             l_process_status
1022           );
1023       END IF;
1024       /*** was delete successful? ***/
1025       IF l_process_status <> FND_API.G_RET_STS_SUCCESS THEN
1026         /*** no -> rollback ***/
1027           CSM_UTIL_PKG.LOG
1028           ( 'Deleting from inqueue failed, rolling back to savepoint'
1029       || ' for PK ' || r_debrief_parts.debrief_line_id,'CSM_DEBRIEF_PARTS_PKG.APPLY_CLIENT_CHANGES',FND_LOG.LEVEL_ERROR ); -- put PK column here
1030         ROLLBACK TO save_rec;
1031         x_return_status := FND_API.G_RET_STS_ERROR;
1032       END IF;
1033     END IF;
1034 
1035     IF l_process_Status <> FND_API.G_RET_STS_SUCCESS THEN
1036       /*** Record was not processed successfully or delete failed -> defer and reject record ***/
1037         CSM_UTIL_PKG.LOG
1038         ( 'Record not processed successfully, deferring and rejecting record'
1039       || ' for PK ' || r_debrief_parts.debrief_line_id,'CSM_DEBRIEF_PARTS_PKG.APPLY_CLIENT_CHANGES',FND_LOG.LEVEL_ERROR ); -- put PK column here
1040 
1041       CSM_UTIL_PKG.DEFER_RECORD
1042        (
1043          p_user_name
1044        , p_tranid
1045        , r_debrief_parts.seqno$$
1046        , r_debrief_parts.debrief_line_id
1047        , g_object_name
1048        , g_pub_name
1049        , l_error_msg
1050        , l_process_status
1051        , r_debrief_parts.dmltype$$
1052        );
1053 
1054       /*** Was defer successful? ***/
1055       IF l_process_status <> FND_API.G_RET_STS_SUCCESS THEN
1056         /*** no -> rollback ***/
1057           CSM_UTIL_PKG.LOG
1058           ( 'Defer record failed, rolling back to savepoint'
1059       || ' for PK ' || r_debrief_parts.debrief_line_id ,'CSM_DEBRIEF_PARTS_PKG.APPLY_CLIENT_CHANGES',FND_LOG.LEVEL_ERROR); -- put PK column here
1060         ROLLBACK TO save_rec;
1061         x_return_status := FND_API.G_RET_STS_ERROR;
1062       END IF;
1063     END IF;
1064 
1065   END LOOP;
1066   CLOSE c_cur;
1067 
1068 EXCEPTION WHEN OTHERS THEN
1069   /*** catch and log exceptions ***/
1070     CSM_UTIL_PKG.LOG
1071     ( 'Exception occurred in APPLY_CLIENT_CHANGES:' || ' ' || sqlerrm
1072     ,'CSM_DEBRIEF_PARTS_PKG.APPLY_CLIENT_CHANGES',FND_LOG.LEVEL_EXCEPTION);
1073   x_return_status := FND_API.G_RET_STS_ERROR;
1074 END APPLY_CLIENT_CHANGES;
1075 END CSM_DEBRIEF_PARTS_PKG;