DBA Data[Home] [Help]

PACKAGE BODY: APPS.CS_CHARGE_DETAILS_PVT

Source


1 PACKAGE BODY CS_CHARGE_DETAILS_PVT AS
2 /* $Header: csxvestb.pls 120.101.12020000.7 2013/05/20 09:33:42 bkanimoz ship $ */
3 
4 --==========================================================
5 -- Global Variables Decalaration
6 --==========================================================
7 
8 RECORD_LOCK_EXCEPTION EXCEPTION ;
9 PRAGMA EXCEPTION_INIT(RECORD_LOCK_EXCEPTION,-0054);
10    G_WARNING                    EXCEPTION ;
11 
12 
13 -- Structure Definitions
14 TYPE REC_UOM IS RECORD
15  (
16    Unit_of_Measure NUMBER
17  );
18 
19 TYPE TBL_UOM IS TABLE OF REC_UOM INDEX BY BINARY_INTEGER ;
20 
21 
22 --===========================================================
23 -- Declaration of  Procedures and functions
24 --===========================================================
25 
26 PROCEDURE CURR_IN_CONVERSION_LIST(
27                  p_api_name        IN         VARCHAR2,
28                  p_price_list_id   IN         NUMBER ,
29                  p_currency_code   IN         VARCHAR2,
30                  X_MSG_DATA        OUT NOCOPY VARCHAR2,
31                  X_MSG_COUNT       OUT NOCOPY NUMBER,
32                  x_return_status   OUT NOCOPY VARCHAR2);
33 
34 PROCEDURE VALIDATE_CHARGE_DETAILS(
35                  P_API_NAME                  IN            VARCHAR2,
36                  P_CHARGES_DETAIL_REC        IN            CS_Charge_Details_PUB.Charges_Rec_Type,
37                  P_VALIDATION_MODE           IN            VARCHAR2,
38                  P_USER_ID                   IN            NUMBER,
39                  P_LOGIN_ID                  IN            NUMBER,
40                  X_CHARGES_DETAIL_REC        OUT NOCOPY    CS_Charge_Details_PUB.Charges_Rec_Type,
41                  X_MSG_DATA                  OUT NOCOPY    VARCHAR2,
42                  X_MSG_COUNT                 OUT NOCOPY    NUMBER,
43                  X_RETURN_STATUS             OUT NOCOPY    VARCHAR2);
44 
45 
46 PROCEDURE ADD_INVALID_ARGUMENT_MSG(
47                  P_TOKEN_AN	  VARCHAR2,
48                  P_TOKEN_V	  VARCHAR2,
49                  P_TOKEN_P	  VARCHAR2);
50 
51 PROCEDURE ADD_NULL_PARAMETER_MSG(
52                  P_TOKEN_AN   IN  VARCHAR2,
53                  P_TOKEN_NP   IN  VARCHAR2);
54 
55 PROCEDURE CANT_UPDATE_DETAIL_PARAM_MSG(
56                  P_TOKEN_AN            IN      VARCHAR2,
57                  P_TOKEN_CN            IN      VARCHAR2,
58                  P_TOKEN_V             IN      VARCHAR2 );
59 
60 PROCEDURE CANNOT_DELETE_LINE_MSG(
61                  P_TOKEN_AN    IN      VARCHAR2);
62 
63 PROCEDURE RECORD_IS_LOCKED_MSG(
64                  P_TOKEN_AN     IN  VARCHAR2);
65 
66 
67 PROCEDURE GET_SITE_FOR_PARTY(
68                  P_API_NAME          IN         VARCHAR2,
69                  P_SITE_USE_ID       IN         NUMBER,
70                  P_PARTY_ID          IN         NUMBER,
71                  P_VAL_MODE          IN         VARCHAR2,
72                  X_SITE_ID           OUT NOCOPY NUMBER,
73                  X_RETURN_STATUS     OUT NOCOPY VARCHAR2);
74 
75 PROCEDURE GET_SR_DEFAULTS(
76                  P_API_NAME               IN          VARCHAR2,
77                  P_INCIDENT_ID            IN          NUMBER,
78                  X_BUSINESS_PROCESS_ID    OUT NOCOPY  NUMBER,
79                  X_CUSTOMER_ID            OUT NOCOPY  NUMBER,
80                  X_CUSTOMER_SITE_ID       OUT NOCOPY  NUMBER,
81                  X_CUST_PO_NUMBER         OUT NOCOPY  VARCHAR2,
82                  X_CUSTOMER_PRODUCT_ID    OUT NOCOPY  NUMBER,
83                  X_SYSTEM_ID              OUT NOCOPY  NUMBER,
84                  X_INVENTORY_ITEM_ID      OUT NOCOPY  NUMBER,
85                  X_ACCOUNT_ID             OUT NOCOPY  NUMBER,
86                  X_BILL_TO_PARTY_ID       OUT NOCOPY  NUMBER,
87                  X_BILL_TO_ACCOUNT_ID     OUT NOCOPY  NUMBER,
88                  X_BILL_TO_CONTACT_ID     OUT NOCOPY  NUMBER,
89                  X_BILL_TO_SITE_ID        OUT NOCOPY  NUMBER,
90                  X_SHIP_TO_PARTY_ID       OUT NOCOPY  NUMBER,
91                  X_SHIP_TO_ACCOUNT_ID     OUT NOCOPY  NUMBER,
92                  X_SHIP_TO_CONTACT_ID     OUT NOCOPY  NUMBER,
93                  X_SHIP_TO_SITE_ID        OUT NOCOPY  NUMBER,
94                  X_CONTRACT_ID            OUT NOCOPY  NUMBER,
95                  X_CONTRACT_SERVICE_ID    OUT NOCOPY  NUMBER,
96                  X_INCIDENT_DATE          OUT NOCOPY  DATE,
97                  X_CREATION_DATE          OUT NOCOPY  DATE,
98                  X_MSG_DATA               OUT NOCOPY  VARCHAR2,
99                  X_MSG_COUNT              OUT NOCOPY  NUMBER,
100                  X_RETURN_STATUS          OUT NOCOPY  VARCHAR2);
101 
102 PROCEDURE VALIDATE_TXN_TYPE(
103                  P_API_NAME                  IN         VARCHAR2,
104                  P_BUSINESS_PROCESS_ID       IN         NUMBER,
105                  P_TXN_TYPE_ID               IN         NUMBER,
106                  P_SOURCE_CODE               IN         VARCHAR2,
107                  X_LINE_ORDER_CATEGORY_CODE  OUT NOCOPY VARCHAR2,
108                  X_NO_CHARGE_FLAG            OUT NOCOPY VARCHAR2,
109                  X_INTERFACE_TO_OE_FLAG      OUT NOCOPY VARCHAR2, -- Added a new parameter for R11.5.10
110                  X_UPDATE_IB_FLAG            OUT NOCOPY VARCHAR2,
111                  X_SRC_REFERENCE_REQD_FLAG   OUT NOCOPY VARCHAR2,
112                  X_SRC_RETURN_REQD_FLAG      OUT NOCOPY VARCHAR2,
113                  X_NON_SRC_REFERENCE_REQD    OUT NOCOPY VARCHAR2,
114                  X_NON_SRC_RETURN_REQD       OUT NOCOPY VARCHAR2,
115                  X_MSG_DATA                  OUT NOCOPY  VARCHAR2,
116                  X_MSG_COUNT                 OUT NOCOPY  NUMBER,
117                  X_RETURN_STATUS             OUT NOCOPY VARCHAR2);
118 
119 PROCEDURE VALIDATE_ITEM(
120                  P_API_NAME             IN         VARCHAR2,
121                  P_INV_ID               IN         NUMBER,
122                  P_UPDATE_IB_FLAG       IN         VARCHAR2,
123                  X_COMMS_TRACKABLE_FLAG OUT NOCOPY VARCHAR2,
124                  X_SERIAL_CONTROL_FLAG  OUT NOCOPY VARCHAR2,
125                  X_REV_CONTROL_FLAG     OUT NOCOPY VARCHAR2,
126                  X_MSG_DATA             OUT NOCOPY  VARCHAR2,
127                  X_MSG_COUNT            OUT NOCOPY  NUMBER,
128                  X_RETURN_STATUS        OUT NOCOPY VARCHAR2);
129 
130 PROCEDURE GET_BILLING_FLAG(
131                  P_API_NAME            IN         VARCHAR2,
132                  P_INV_ID              IN         NUMBER,
133                  P_TXN_TYPE_ID         IN         NUMBER,
134                  X_BILLING_FLAG        OUT NOCOPY VARCHAR2,
135                  X_MSG_DATA            OUT NOCOPY VARCHAR2,
136                  X_MSG_COUNT           OUT NOCOPY NUMBER,
137                  X_RETURN_STATUS       OUT NOCOPY VARCHAR2);
138 
139 PROCEDURE GET_TXN_BILLING_TYPE(
140                  P_API_NAME            IN         VARCHAR2,
141                  P_INV_ID              IN         NUMBER,
142                  P_TXN_TYPE_ID         IN         NUMBER,
143                  X_TXN_BILLING_TYPE_ID OUT NOCOPY NUMBER,
144                  X_MSG_DATA            OUT NOCOPY VARCHAR2,
145                  X_MSG_COUNT           OUT NOCOPY NUMBER,
146                  X_RETURN_STATUS       OUT NOCOPY VARCHAR2);
147 
148 PROCEDURE GET_UOM(
149                  P_INV_ID            IN NUMBER,
150                  X_TBL_UOM           OUT NOCOPY TBL_UOM,
151                  X_MSG_DATA          OUT NOCOPY VARCHAR2,
152                  X_MSG_COUNT         OUT NOCOPY NUMBER,
153                  X_RETURN_STATUS     OUT NOCOPY VARCHAR2);
154 
155 
156 PROCEDURE GET_PRIMARY_UOM(
157                  P_INV_ID            IN NUMBER,
158                  X_PRIMARY_UOM       OUT NOCOPY VARCHAR2,
159                  X_MSG_DATA          OUT NOCOPY VARCHAR2,
160                  X_MSG_COUNT         OUT NOCOPY NUMBER,
161                  X_RETURN_STATUS     OUT NOCOPY VARCHAR2) ;
162 
163 
164 PROCEDURE VALIDATE_SOURCE(
165                  P_API_NAME          IN         VARCHAR2,
166                  P_SOURCE_CODE       IN         VARCHAR2,
167                  P_SOURCE_ID         IN         NUMBER,
168                  P_ORG_ID            IN         NUMBER,
169                  X_SOURCE_ID         OUT NOCOPY NUMBER,
170                  X_MSG_DATA          OUT NOCOPY VARCHAR2,
171                  X_MSG_COUNT         OUT NOCOPY NUMBER,
172                  X_RETURN_STATUS     OUT NOCOPY VARCHAR2) ;
173 
174 PROCEDURE GET_CONTRACT_PRICE_LIST(
175                  p_api_name               IN         VARCHAR2,
176                  p_business_process_id    IN         NUMBER,
177                  p_request_date           IN         DATE,
178                  p_contract_line_id       IN         NUMBER,
179                  --p_coverage_id            IN         NUMBER,
180                  x_price_list_id          OUT NOCOPY NUMBER,
181                  x_currency_code          OUT NOCOPY VARCHAR2,
182                  X_MSG_DATA               OUT NOCOPY VARCHAR2,
183                  X_MSG_COUNT              OUT NOCOPY NUMBER,
184                  x_return_status          OUT NOCOPY VARCHAR2);
185 
186 PROCEDURE  GET_CURRENCY_CODE(
187                  p_api_name        IN         VARCHAR2,
188                  p_price_list_id   IN         NUMBER ,
189                  x_currency_code   OUT NOCOPY VARCHAR2,
190                  X_MSG_DATA        OUT NOCOPY VARCHAR2,
191                  X_MSG_COUNT       OUT NOCOPY NUMBER,
192                  x_return_status   OUT NOCOPY VARCHAR2);
193 
194 PROCEDURE DO_TXNS_EXIST(
195                  P_API_NAME            IN          VARCHAR2,
196                  P_ESTIMATE_DETAIL_ID  IN          NUMBER ,
197                  x_ORDER_LINE_ID       OUT NOCOPY  NUMBER,
198                  x_gen_bca_flag        OUT NOCOPY  VARCHAR2,
199                  x_charge_line_type    OUT NOCOPY  VARCHAR2,
200                  x_RETURN_STATUS       OUT NOCOPY  VARCHAR2);
201 
202 PROCEDURE  GET_CONVERSION_RATE(
203                  P_API_NAME       IN         VARCHAR2,
204                  P_FROM_CURRENCY  IN         VARCHAR2,
205                  P_TO_CURRENCY    IN         VARCHAR2,
206                  X_DENOMINATOR    OUT NOCOPY NUMBER,
207                  X_NUMERATOR      OUT NOCOPY NUMBER,
208                  X_RATE           OUT NOCOPY NUMBER,
209                  X_RETURN_STATUS  OUT NOCOPY VARCHAR);
210 
211 
212 PROCEDURE Validate_Who_Info(
213                  P_API_NAME                  IN            VARCHAR2,
214                  P_USER_ID                   IN            NUMBER,
215                  P_LOGIN_ID                  IN            NUMBER,
216                  X_RETURN_STATUS             OUT NOCOPY    VARCHAR2);
217 
218 
219 PROCEDURE GET_CHARGE_DETAIL_REC(
220                  P_API_NAME           IN         VARCHAR2,
221                  P_ESTIMATE_DETAIL_ID IN         NUMBER,
222                  x_CHARGE_DETAIL_REC  OUT NOCOPY CS_ESTIMATE_DETAILS%ROWTYPE ,
223                  x_MSG_DATA           OUT NOCOPY VARCHAR2,
224                  x_MSG_COUNT          OUT NOCOPY NUMBER,
225                  x_RETURN_STATUS      OUT NOCOPY VARCHAR2);
226 
227 --Fixed Bug # 3325667 added p_org_id to procedure get_line_type
228 Procedure Get_Line_Type(
229                  p_api_name              IN VARCHAR2,
230                  p_txn_billing_type_id   IN  NUMBER,
231                  p_org_id                IN  NUMBER,
232                  x_line_type_id          OUT NOCOPY  NUMBER,
233                  x_return_status         OUT NOCOPY VARCHAR2,
234                  x_msg_count             OUT NOCOPY NUMBER,
235                  x_msg_data              OUT NOCOPY VARCHAR2);
236 
237 --Bug Fix for Bug # 3086455
238 PROCEDURE get_charge_flags_from_sr(
239                  p_api_name                IN          VARCHAR2,
240                  p_incident_id             IN          NUMBER,
241                  x_disallow_new_charge     OUT NOCOPY  VARCHAR2,
242                  x_disallow_charge_update  OUT NOCOPY  VARCHAR2,
243                  x_msg_data                OUT NOCOPY  VARCHAR2,
244                  x_msg_count               OUT NOCOPY  NUMBER,
245                  x_return_status           OUT NOCOPY  NUMBER);
246 
247 --Added by bkanimoz on 15-dec-2007 --Service Costing Enh
248 
249 PROCEDURE get_charge_flag_from_sac
250 (
251 	  p_api_name                IN          VARCHAR2,
252           p_txn_type_id             IN          NUMBER,
253 	  x_create_charge_flag      OUT NOCOPY  VARCHAR2,
254 	  x_msg_data                OUT NOCOPY  VARCHAR2,
255 	  x_msg_count               OUT NOCOPY  NUMBER,
256           x_return_status           OUT NOCOPY  NUMBER
257 );
258 
259 
260 PROCEDURE Validate_Order(
261                  p_api_name              IN VARCHAR2,
262                  p_order_header_id       IN NUMBER,
263                  p_org_id                IN NUMBER,
264                  x_return_status         OUT NOCOPY VARCHAR2,
265                  x_msg_count             OUT NOCOPY NUMBER,
266                  x_msg_data              OUT NOCOPY VARCHAR2);
267 
268 PROCEDURE VALIDATE_ORG_ID(
269                  P_API_NAME       IN VARCHAR2,
270                  P_ORG_ID         IN NUMBER,
271                  X_RETURN_STATUS  OUT NOCOPY VARCHAR2,
272                  X_MSG_COUNT      OUT NOCOPY NUMBER,
273                  X_MSG_DATA       OUT NOCOPY VARCHAR2);
274 
275 
276 FUNCTION IS_INCIDENT_ID_VALID (
277                  p_incident_id   IN         NUMBER,
278                  x_msg_data      OUT NOCOPY VARCHAR2,
279                  x_msg_count     OUT NOCOPY NUMBER,
280                  x_return_status OUT NOCOPY VARCHAR2)
281 RETURN VARCHAR2;
282 
283 
284 FUNCTION IS_RETURN_REASON_VALID(
285                  P_RETURN_REASON_CODE IN         VARCHAR2,
286                  X_MSG_DATA           OUT NOCOPY VARCHAR2,
287                  X_MSG_COUNT          OUT NOCOPY NUMBER,
288                  X_RETURN_STATUS      OUT NOCOPY VARCHAR2)
289 RETURN VARCHAR2;
290 
291 FUNCTION IS_CHARGE_LINE_TYPE_VALID(
292                  p_charge_line_type IN         VARCHAR2,
293                  x_msg_data         OUT NOCOPY VARCHAR2,
294                  x_msg_count        OUT NOCOPY NUMBER,
295                  x_return_status    OUT NOCOPY VARCHAR2)
296 RETURN VARCHAR2;
297 
298 FUNCTION IS_BUSINESS_PROCESS_ID_VALID(
299                  p_business_process_id IN         NUMBER,
300                  x_msg_data            OUT NOCOPY VARCHAR2,
301                  x_msg_count           OUT NOCOPY NUMBER,
302                  x_return_status       OUT NOCOPY VARCHAR2)
303 RETURN VARCHAR2;
304 
305 FUNCTION IS_PARTY_VALID(
306                  p_party_id      IN         NUMBER,
307                  x_msg_data      OUT NOCOPY VARCHAR2,
308                  x_msg_count     OUT NOCOPY NUMBER,
309                  x_return_status OUT NOCOPY VARCHAR2)
310 RETURN VARCHAR2;
311 
312 FUNCTION IS_ACCOUNT_VALID(
313                  p_account_id    IN         NUMBER,
314                  p_party_id      IN         NUMBER,
315                  x_msg_data      OUT NOCOPY VARCHAR2,
316                  x_msg_count     OUT NOCOPY NUMBER,
317                  x_return_status OUT NOCOPY VARCHAR2)
318 RETURN VARCHAR2;
319 
320 FUNCTION IS_CONTACT_VALID(
321                  p_contact_id    IN         NUMBER,
322                  p_party_id      IN         NUMBER,
323                  x_msg_data      OUT NOCOPY VARCHAR2,
324                  x_msg_count     OUT NOCOPY NUMBER,
325                  x_return_status OUT NOCOPY VARCHAR2)
326 RETURN VARCHAR2;
327 
328 FUNCTION IS_PARTY_SITE_VALID(
329                  p_party_site_id IN         NUMBER,
330                  p_party_id      IN         NUMBER,
331                  p_val_mode      IN         VARCHAR2,
332                  x_msg_data      OUT NOCOPY VARCHAR2,
333                  x_msg_count     OUT NOCOPY NUMBER,
334                  x_return_status OUT NOCOPY VARCHAR2)
335 RETURN VARCHAR2;
336 
337 
338 FUNCTION IS_CONTRACT_VALID(
339                  p_contract_id           IN NUMBER,
340                  x_msg_data              OUT NOCOPY VARCHAR2,
341                  x_msg_count             OUT NOCOPY NUMBER,
342                  x_return_status         OUT NOCOPY VARCHAR2)
343 RETURN VARCHAR2;
344 
345 --Added for R12 implementation
346 
347 FUNCTION IS_CONTRACT_LINE_VALID(
348                  p_contract_line_id      IN NUMBER,
349                  x_contract_id           OUT NOCOPY NUMBER,
350                  x_msg_data              OUT NOCOPY VARCHAR2,
351                  x_msg_count             OUT NOCOPY NUMBER,
352                  x_return_status         OUT NOCOPY VARCHAR2)
353 RETURN VARCHAR2;
354 
355 FUNCTION IS_PRICE_LIST_VALID(
356                  p_price_list_id  IN         NUMBER,
357                  x_msg_data       OUT NOCOPY VARCHAR2,
358                  x_msg_count      OUT NOCOPY NUMBER,
359                  x_return_status  OUT NOCOPY VARCHAR2)
360 RETURN VARCHAR2;
361 
362 FUNCTION IS_UOM_VALID(
363                  p_uom_code       IN         VARCHAR2,
364                  p_inv_id         IN         NUMBER,
365                  x_msg_data       OUT NOCOPY VARCHAR2,
366                  x_msg_count      OUT NOCOPY NUMBER,
367                  x_return_status  OUT NOCOPY VARCHAR2)
368 RETURN VARCHAR2;
369 
370 
371 FUNCTION IS_INSTANCE_FOR_INVENTORY(
372                  p_instance_id    IN         NUMBER,
373                  p_inv_id         IN         NUMBER,
374                  x_msg_data       OUT NOCOPY VARCHAR2,
375                  x_msg_count      OUT NOCOPY NUMBER,
376                  x_return_status  OUT NOCOPY VARCHAR2)
377 RETURN VARCHAR2;
378 
379 FUNCTION IS_INSTANCE_VALID(
380                  p_instance_id    IN         NUMBER,
381                  p_party_id       IN         NUMBER,
382                  x_msg_data       OUT NOCOPY VARCHAR2,
383                  x_msg_count      OUT NOCOPY NUMBER,
384                  x_return_status  OUT NOCOPY VARCHAR2)
385 RETURN VARCHAR2;
386 
387 FUNCTION IS_INSTANCE_SERIAL_VALID  (
388                                    p_instance_id   IN         NUMBER
389                                   ,p_serial_number IN         VARCHAR
390                                   ,x_msg_data      OUT NOCOPY VARCHAR2
391                                   ,x_msg_count     OUT NOCOPY NUMBER
392                                   ,x_return_status OUT NOCOPY VARCHAR2)
393 
394 RETURN VARCHAR2;
395 
396 FUNCTION IS_TXN_INV_ORG_VALID(
397                  p_txn_inv_org    IN         NUMBER,
398                  p_inv_id         IN         NUMBER,
399                  x_msg_data       OUT NOCOPY VARCHAR2,
400                  x_msg_count      OUT NOCOPY NUMBER,
401                  x_return_status  OUT NOCOPY VARCHAR2)
402 RETURN VARCHAR2;
403 
404 -- 12.1.3 Charges Logistics Project
405 FUNCTION IS_PARENT_INSTANCE_VALID(
406                  p_cust_prod_id    IN         NUMBER,
407                  p_parent_inst_id  IN         NUMBER,
408                  x_msg_data       OUT NOCOPY VARCHAR2,
409                  x_msg_count      OUT NOCOPY NUMBER,
410                  x_return_status  OUT NOCOPY VARCHAR2)
411 RETURN VARCHAR2;
412 
413 FUNCTION IS_ESTIMATE_DETAIL_ID_VALID(
414                  p_estimate_detail_id IN         NUMBER,
415                  x_msg_data           OUT NOCOPY VARCHAR2,
416                  x_msg_count          OUT NOCOPY NUMBER,
417                  x_return_status      OUT NOCOPY VARCHAR2)
418 RETURN VARCHAR2;
419 
420 
421 FUNCTION GET_CONTRACT_LINE_ID(
422                  p_coverage_id        IN         NUMBER,
423                  x_msg_data           OUT NOCOPY VARCHAR2,
424                  x_msg_count          OUT NOCOPY NUMBER,
425                  x_return_status      OUT NOCOPY VARCHAR2)
426 RETURN NUMBER;
427 
428 -- Added fix for the bug:5125858
429 FUNCTION IS_ITEM_REVISION_VALID(
430                  p_inventory_item_id IN         NUMBER,
431                  p_item_revision     IN         VARCHAR2,
432                  x_msg_data           OUT NOCOPY VARCHAR2,
433                  x_msg_count          OUT NOCOPY NUMBER,
434                  x_return_status      OUT NOCOPY VARCHAR2)
435 RETURN VARCHAR2;
436 
437 -- Added fix for the bug:
438 FUNCTION IS_LINE_NUMBER_VALID(
439                  p_line_number       IN         NUMBER,
440                  p_incident_id       IN         NUMBER,
441                  x_msg_data           OUT NOCOPY VARCHAR2,
442                  x_msg_count          OUT NOCOPY NUMBER,
443                  x_return_status      OUT NOCOPY VARCHAR2)
444 RETURN VARCHAR2;
445 
446 --=================================================
447 -- Function Implementations
448 --=================================================
449 
450 --==================================================
451 -- IS_INCIDENT_ID_VALID - for Incident Id Validation
452 --==================================================
453 FUNCTION IS_INCIDENT_ID_VALID (p_incident_id   IN         NUMBER,
454                                x_msg_data      OUT NOCOPY VARCHAR2,
455                                x_msg_count     OUT NOCOPY NUMBER,
456                                x_return_status OUT NOCOPY VARCHAR2
457                                )
458 RETURN VARCHAR2
459 IS
460 
461 Cursor c_incident IS
462   SELECT 'Y'
463     FROM cs_incidents_all
464    WHERE incident_id = p_incident_id;
465 
466 lv_exists_flag VARCHAR2(1) := 'N';
467 
468 l_prog_name CONSTANT VARCHAR2(61) := G_PKG_NAME||'.'||'is_incident_id_valid';
469 
470 BEGIN
471 
472 x_return_status := FND_API.G_RET_STS_SUCCESS;
473 
474 OPEN c_incident;
475 FETCH c_incident INTO lv_exists_flag;
476 CLOSE c_incident;
477 
478 RETURN lv_exists_flag;
479 
480 EXCEPTION
481 
482       WHEN OTHERS THEN
483 
484         FND_MESSAGE.SET_NAME(G_APP_NAME, G_DB_ERROR);
485         FND_MESSAGE.SET_TOKEN(token => G_PROG_NAME_TOKEN, value => l_prog_name);
486         FND_MESSAGE.SET_TOKEN(token => G_SQLCODE_TOKEN, value => SQLCODE);
487         FND_MESSAGE.SET_TOKEN(token => G_SQLERRM_TOKEN, value => SQLERRM);
488         FND_MSG_PUB.add;
489 
490         x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
491         RETURN lv_exists_flag;
492 
493 END IS_INCIDENT_ID_VALID;
494 
495 --========================================================
496 -- IS_RETURN_RESON_VALID - For Return Reson Code Validation
497 --=========================================================
498 
499 FUNCTION IS_RETURN_REASON_VALID(P_RETURN_REASON_CODE IN         VARCHAR2,
500                                 X_MSG_DATA           OUT NOCOPY VARCHAR2,
501                                 X_MSG_COUNT          OUT NOCOPY NUMBER,
502                                 X_RETURN_STATUS      OUT NOCOPY VARCHAR2)
503 RETURN VARCHAR2
504 IS
505 
506 --Cursor to check return reason code
507 
508 CURSOR c_return_reason_cur(p_return_reason_code varchar2) is
509 SELECT meaning from ar_lookups
510 WHERE  lookup_type = 'CREDIT_MEMO_REASON'
511 and lookup_code = p_return_reason_code;
512 
513 lv_exists_flag VARCHAR2(1) := 'N';
514 
515 l_prog_name CONSTANT VARCHAR2(61) := G_PKG_NAME||'.'||'is_return_reason_valid';
516 
517 BEGIN
518 
519 x_return_status := FND_API.G_RET_STS_SUCCESS;
520 
521  FOR v_return_reason_cur IN c_return_reason_cur(p_return_reason_code)
522      LOOP
523        lv_exists_flag := 'Y' ;
524      END LOOP ;
525    RETURN lv_exists_flag;
526 
527 EXCEPTION
528 
529       WHEN OTHERS THEN
530 
531         FND_MESSAGE.SET_NAME(G_APP_NAME, G_DB_ERROR);
532         FND_MESSAGE.SET_TOKEN(token => G_PROG_NAME_TOKEN, value => l_prog_name);
533         FND_MESSAGE.SET_TOKEN(token => G_SQLCODE_TOKEN, value => SQLCODE);
534         FND_MESSAGE.SET_TOKEN(token => G_SQLERRM_TOKEN, value => SQLERRM);
535         FND_MSG_PUB.add;
536 
537         x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
538         RETURN lv_exists_flag;
539 
540 END IS_RETURN_REASON_VALID;
541 
542 --========================================================
543 --IS_CHARGE_LINE_TYPE_VALID - for Charge Line Type
544 --Validation
545 --========================================================
546 FUNCTION IS_CHARGE_LINE_TYPE_VALID(p_charge_line_type IN VARCHAR2,
547                                    x_msg_data         OUT NOCOPY VARCHAR2,
548                                    x_msg_count        OUT NOCOPY NUMBER,
549                                    x_return_status    OUT NOCOPY VARCHAR2)
550 RETURN VARCHAR2
551 IS
552 
553 --Cursor to check valid Incident Id
554 
555 Cursor c_charge_line_type (p_charge_line_type IN VARCHAR2) IS
556   SELECT lookup_code
557     FROM fnd_lookup_values
558    WHERE lookup_type = 'CS_CHG_LINE_TYPE' AND
559          lookup_code = p_charge_line_type;
560 
561 lv_exists_flag VARCHAR2(1) := 'N';
562 
563 l_prog_name CONSTANT VARCHAR2(61) := G_PKG_NAME||'.'||'is_charge_line_type_valid';
564 
565 BEGIN
566 
567 x_return_status := FND_API.G_RET_STS_SUCCESS;
568 
569    FOR v_charge_line_type IN c_charge_line_type(p_charge_line_type)
570      LOOP
571        lv_exists_flag := 'Y';
572      END LOOP ;
573    RETURN lv_exists_flag;
574 
575 EXCEPTION
576 
577       WHEN OTHERS THEN
578 
579         FND_MESSAGE.SET_NAME(G_APP_NAME, G_DB_ERROR);
580         FND_MESSAGE.SET_TOKEN(token => G_PROG_NAME_TOKEN, value => l_prog_name);
581         FND_MESSAGE.SET_TOKEN(token => G_SQLCODE_TOKEN, value => SQLCODE);
582         FND_MESSAGE.SET_TOKEN(token => G_SQLERRM_TOKEN, value => SQLERRM);
583         FND_MSG_PUB.add;
584 
585         x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
586         RETURN lv_exists_flag;
587 
588 
589 END IS_CHARGE_LINE_TYPE_VALID;
590 
591 --=========================================================
592 -- IS_BUSINESS_PROCESS_ID_VALID - for Business Process ID
593 -- Validation
594 --=========================================================
595 FUNCTION IS_BUSINESS_PROCESS_ID_VALID(p_business_process_id IN         NUMBER,
596                                       x_msg_data            OUT NOCOPY VARCHAR2,
597                                       x_msg_count           OUT NOCOPY NUMBER,
598                                       x_return_status       OUT NOCOPY VARCHAR2)
599 RETURN VARCHAR2
600 IS
601 
602 --Cursor to check valid Incident Id
603 
604 Cursor c_business_process_id (p_business_process_id IN NUMBER) IS
605 
606   SELECT business_process_id
607     FROM cs_business_processes
608    WHERE business_process_id = p_business_process_id;
609 
610 lv_exists_flag VARCHAR2(1) := 'N';
611 
612 l_prog_name CONSTANT VARCHAR2(61) := G_PKG_NAME||'.'||'is_business_process_id_valid';
613 
614 BEGIN
615 
616 x_return_status := FND_API.G_RET_STS_SUCCESS;
617 
618    FOR v_business_process_id IN c_business_process_id (p_business_process_id)
619      LOOP
620        lv_exists_flag := 'Y';
621      END LOOP ;
622    RETURN lv_exists_flag;
623 
624 EXCEPTION
625 
626       WHEN OTHERS THEN
627 
628         FND_MESSAGE.SET_NAME(G_APP_NAME, G_DB_ERROR);
629         FND_MESSAGE.SET_TOKEN(token => G_PROG_NAME_TOKEN, value => l_prog_name);
630         FND_MESSAGE.SET_TOKEN(token => G_SQLCODE_TOKEN, value => SQLCODE);
631         FND_MESSAGE.SET_TOKEN(token => G_SQLERRM_TOKEN, value => SQLERRM);
632         FND_MSG_PUB.add;
633 
634         x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
635         RETURN lv_exists_flag;
636 
637 END IS_BUSINESS_PROCESS_ID_VALID;
638 
639 --===============================================================
640 -- IS_PARTY_VALID - for Bill_To_Party and Ship_to_Party Validation
641 --===============================================================
642 
643 FUNCTION IS_PARTY_VALID(p_party_id      IN         NUMBER,
644                         x_msg_data      OUT NOCOPY VARCHAR2,
645                         x_msg_count     OUT NOCOPY NUMBER,
646                         x_return_status OUT NOCOPY VARCHAR2) RETURN VARCHAR2 IS
647 
648 lv_exists_flag VARCHAR2(1) := 'N';
649 
650 CURSOR c_party IS
651 SELECT 'Y'
652 FROM hz_parties
653 WHERE party_id = p_party_id
654 AND   nvl(status, 'A')  = 'A';
655 
656 l_prog_name CONSTANT VARCHAR2(61) := G_PKG_NAME||'.'||'is_party_valid';
657 
658 BEGIN
659 
660 x_return_status := FND_API.G_RET_STS_SUCCESS;
661 
662 OPEN c_party;
663 FETCH c_party INTO lv_exists_flag;
664 CLOSE c_party;
665 
666 RETURN lv_exists_flag;
667 
668 EXCEPTION
669 
670       WHEN OTHERS THEN
671 
672         FND_MESSAGE.SET_NAME(G_APP_NAME, G_DB_ERROR);
673         FND_MESSAGE.SET_TOKEN(token => G_PROG_NAME_TOKEN, value => l_prog_name);
674         FND_MESSAGE.SET_TOKEN(token => G_SQLCODE_TOKEN, value => SQLCODE);
675         FND_MESSAGE.SET_TOKEN(token => G_SQLERRM_TOKEN, value => SQLERRM);
676         FND_MSG_PUB.add;
677 
678         x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
679         RETURN lv_exists_flag;
680 
681 END IS_PARTY_VALID;
682 
683 
684 
685 --===============================================================
686 -- IS_ACCOUNT_VALID - for Bill_to_Accout and Ship_
687 --===============================================================
688 FUNCTION IS_ACCOUNT_VALID(p_account_id    IN         NUMBER,
689                           p_party_id      IN         NUMBER,
690                           x_msg_data      OUT NOCOPY VARCHAR2,
691                           x_msg_count     OUT NOCOPY NUMBER,
692                           x_return_status OUT NOCOPY VARCHAR2)
693 RETURN VARCHAR2
694 IS
695 
696 --Bug Fix for Bug # 2981195
697 --Added to the where
698 --Account_Activation_Date and Account_Termination_Date logic
699 --removed this from where clause Account_Activation_Date and Account_Termination_Date logic
700 
701 --Cursor to check Account Id
702 CURSOR c_account(p_account_id in number,
703                  p_party_id   in number) IS
704 SELECT cust_account_id
705 FROM   hz_cust_accounts
706 WHERE  cust_account_id = p_account_id
707   AND  party_id = p_party_id
708   AND  nvl(status, 'A') = 'A';
709 
710 
711 lv_exists_flag VARCHAR2(1) := 'N';
712 
713 l_prog_name CONSTANT VARCHAR2(61) := G_PKG_NAME||'.'||'is_account_valid';
714 
715 BEGIN
716 
717 x_return_status := FND_API.G_RET_STS_SUCCESS;
718 
719    FOR v_account IN c_account(p_account_id,
720                               p_party_id )
721      LOOP
722        lv_exists_flag := 'Y';
723      END LOOP ;
724    RETURN lv_exists_flag;
725 
726 EXCEPTION
727 
728       WHEN OTHERS THEN
729 
730         FND_MESSAGE.SET_NAME(G_APP_NAME, G_DB_ERROR);
731         FND_MESSAGE.SET_TOKEN(token => G_PROG_NAME_TOKEN, value => l_prog_name);
732         FND_MESSAGE.SET_TOKEN(token => G_SQLCODE_TOKEN, value => SQLCODE);
733         FND_MESSAGE.SET_TOKEN(token => G_SQLERRM_TOKEN, value => SQLERRM);
734         FND_MSG_PUB.add;
735 
736         x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
737         RETURN lv_exists_flag;
738 
739 END IS_ACCOUNT_VALID;
740 
741 --===============================================================
742 -- IS_CONTACT_VALID - for Bill_to_Contact and Ship_to_Contact
743 -- BKANIMOZ	09-Jul-2012   Bug fix for 13063222 .Modified the query used in the
744 --                           cursor c_contact_person so that it is less restrictive
745 
746 --===============================================================
747 FUNCTION IS_CONTACT_VALID(p_contact_id    IN         NUMBER,
748                           p_party_id      IN         NUMBER,
749                           x_msg_data      OUT NOCOPY VARCHAR2,
750                           x_msg_count     OUT NOCOPY NUMBER,
751                           x_return_status OUT NOCOPY VARCHAR2)
752 RETURN VARCHAR2
753 IS
754 
755 --Check the party_type for the given party
756 
757  CURSOR c_party_type(p_party_id in number) IS
758   SELECT party_type
759    FROM  hz_parties
760   WHERE  party_id = p_party_id;
761 
762 CURSOR  c_contact_org(p_party_id in number,
763                       p_contact_id in number) IS
764 SELECT  rel.party_id
765 FROM    hz_relationships party_rel,
766         hz_parties sub,
767         hz_parties rel,
768         ar_lookups ar,
769         ar_lookups relm,
770         hz_relationship_types typ,
771         hz_code_assignments asg
772 WHERE   party_rel.object_id = p_party_id
773         AND party_rel.party_id =  rel.party_id
774         AND rel.party_id = p_contact_id
775         AND party_rel.subject_id = sub.party_id
776         AND sub.party_type = 'PERSON'
777         AND sub.status = 'A'
778         AND ar.lookup_type(+) = 'CONTACT_TITLE'
779         AND sub.person_pre_name_adjunct = ar.lookup_code(+)
780         AND relm.lookup_type(+) = 'PARTY_RELATIONS_TYPE'
781         AND party_rel.relationship_code = relm.lookup_code(+)
782         AND nvl(party_rel.start_date, sysdate-1) < sysdate
783         AND nvl(party_rel.end_date  , sysdate+1) > sysdate
784         AND party_rel.status = 'A'
785         AND asg.owner_table_name = 'HZ_RELATIONSHIP_TYPES'
786         AND asg.owner_table_id = typ.relationship_type_id
787         AND asg.class_category = 'RELATIONSHIP_TYPE_GROUP'
788         AND asg.class_code = 'PARTY_REL_GRP_CONTACTS'
789         AND typ.relationship_type = party_rel.relationship_type
790         AND party_rel.subject_type = 'PERSON'
791         AND party_rel.subject_table_name = 'HZ_PARTIES'
792         AND party_rel.object_type = 'ORGANIZATION'
793         AND party_rel.object_table_name = 'HZ_PARTIES'
794         AND party_rel.relationship_code = typ.forward_rel_code;
795 
796 
797 CURSOR  c_contact_person(p_party_id number,p_contact_id number) IS
798 SELECT sub.party_id
799 FROM    Hz_Parties sub,
800         Hz_Relationships r
801 WHERE         r.object_id    = p_party_id
802         AND   r.party_id     = p_contact_id
803         AND   sub.status     = 'A'
804         AND   r.status       = 'A'
805         AND   r.subject_id   = sub.party_id
806         AND   sub.party_type = 'PERSON'
807         AND   NVL(r.start_date, SYSDATE-1) < SYSDATE
808         AND   NVL(r.end_date, SYSDATE+1) > SYSDATE;
809 
810 
811 /*CURSOR  c_contact_person(p_party_id number,p_contact_id number) IS
812 SELECT  rel.party_id
813 FROM    hz_relationships party_rel,
814         hz_parties sub,
815         hz_parties rel,
816         ar_lookups ar,
817         ar_lookups relm,
818         hz_relationship_types typ,
819         hz_code_assignments asg
820 WHERE   party_rel.object_id = p_party_id
821         AND party_rel.party_id = rel.party_id
822         AND rel.party_id = p_contact_id
823         AND party_rel.subject_id = sub.party_id
824         AND sub.party_type = 'PERSON'
825         AND ar.lookup_type(+) = 'CONTACT_TITLE'
826         AND sub.person_pre_name_adjunct = ar.lookup_code(+)
827         AND relm.lookup_type(+) = 'PARTY_RELATIONS_TYPE'
828         AND party_rel.relationship_code = relm.lookup_code(+)
829         AND nvl(party_rel.start_date, sysdate-1) < sysdate
830         AND nvl(party_rel.end_date  , sysdate+1) > sysdate
831         AND party_rel.status = 'A'
832         AND asg.owner_table_name = 'HZ_RELATIONSHIP_TYPES'
833         AND asg.owner_table_id = typ.relationship_type_id
834         AND asg.class_category = 'RELATIONSHIP_TYPE_GROUP'
835         AND asg.class_code = 'PARTY_REL_GRP_CONTACTS'
836         AND typ.relationship_type = party_rel.relationship_type
837         AND party_rel.subject_type = 'PERSON'
838         AND party_rel.subject_table_name = 'HZ_PARTIES'
839         AND party_rel.object_type = 'PERSON' -- added for bug # 4744186
840         AND party_rel.object_table_name = 'HZ_PARTIES'
841         AND party_rel.relationship_code = typ.forward_rel_code;
842 */
843 lv_exists_flag VARCHAR2(1) := 'N';
844 lv_party_type VARCHAR2(30);
845 lv_type_found VARCHAR2(1) := 'N';
846 
847 l_prog_name CONSTANT VARCHAR2(61) := G_PKG_NAME||'.'||'is_contact_valid';
848 
849 BEGIN
850 
851 x_return_status := FND_API.G_RET_STS_SUCCESS;
852 
853    FOR v_party_type IN c_party_type(p_party_id)
854      LOOP
855        lv_type_found := 'Y';
856        lv_party_type := v_party_type.party_type;
857      END LOOP ;
858 
859      IF lv_type_found = 'Y' THEN
860       IF lv_party_type = 'ORGANIZATION' THEN
861         FOR v_contact_org IN c_contact_org(p_party_id , p_contact_id)LOOP
862           lv_exists_flag := 'Y';
863         END LOOP;
864       ELSE
865          IF lv_party_type = 'PERSON'
866          THEN
867             /* Start : 4744186 */
868             IF p_party_id = p_contact_id
869             THEN
870             /*If Bill to/ship to Party id is same as Bill to/ship to contact id and Bill to/ship to
871             party type is PERSON, there will not be any relationship*/
872                lv_exists_flag := 'Y';
873             ELSE
874             /* End : 4744186 */
875                FOR v_contact_person IN c_contact_person(p_party_id,  p_contact_id)
876                LOOP
877                   lv_exists_flag := 'Y';
878                END LOOP;
879             END IF;
880          END IF;
881       END IF;
882    ELSE
883       --lv_type_found = 'N'
884       lv_exists_flag := 'N';
885    END IF;
886 
887      RETURN lv_exists_flag;
888 
889 EXCEPTION
890 
891       WHEN OTHERS THEN
892 
893         FND_MESSAGE.SET_NAME(G_APP_NAME, G_DB_ERROR);
894         FND_MESSAGE.SET_TOKEN(token => G_PROG_NAME_TOKEN, value => l_prog_name);
895         FND_MESSAGE.SET_TOKEN(token => G_SQLCODE_TOKEN, value => SQLCODE);
896         FND_MESSAGE.SET_TOKEN(token => G_SQLERRM_TOKEN, value => SQLERRM);
897         FND_MSG_PUB.add;
898 
899         x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
900         RETURN lv_exists_flag;
901 
902 END IS_CONTACT_VALID;
903 
904 
905 --===============================================================
906 -- IS_PARTY_SITE - for Bill_to_Accout and Ship_
907 --===============================================================
908 FUNCTION IS_PARTY_SITE_VALID(p_party_site_id IN         NUMBER,
909                              p_party_id      IN         NUMBER,
910                              p_val_mode      IN         VARCHAR2,
911                              x_msg_data      OUT NOCOPY VARCHAR2,
912                              x_msg_count     OUT NOCOPY NUMBER,
913                              x_return_status OUT NOCOPY VARCHAR2)
914 RETURN VARCHAR2
915 IS
916 
917 -- Cursor to check Bill To Party Site Id
918 
919 Cursor c_bill_to_party_site(p_party_site_id IN NUMBER,
920                             p_party_id      IN NUMBER) IS
921 SELECT site.party_site_id
922  FROM  HZ_PARTY_SITES site,
923        HZ_PARTY_SITE_USES site_use,
924        HZ_PARTIES party
925  WHERE site.party_site_id  = p_party_site_id
926        AND site.party_id   =  p_party_id
927        AND site.party_id   = party.party_id
928        AND site.party_site_id = site_use.party_site_id
929        AND nvl(site.status, 'A') = 'A'
930        AND site_use.site_use_type = 'BILL_TO';
931 
932 --Cursor to check Ship To Party Site Id
933 
934 Cursor c_ship_to_party_site(p_party_site_id IN NUMBER,
935                             p_party_id      IN NUMBER) IS
936 SELECT site.party_site_id
937  FROM  HZ_PARTY_SITES site,
938        HZ_PARTY_SITE_USES site_use,
939        HZ_PARTIES party
940  WHERE site.party_site_id  = p_party_site_id
941        AND site.party_id   =  p_party_id
942        AND site.party_id   = party.party_id
943        AND site.party_site_id = site_use.party_site_id
944        AND nvl(site.status, 'A') = 'A'
945        AND site_use.site_use_type = 'SHIP_TO';
946 
947 Cursor c_party_site(p_party_site_id IN NUMBER,
948                     p_party_id      IN NUMBER) IS
949 
950 SELECT site.party_site_id
951  FROM  HZ_PARTY_SITES site,
952        HZ_PARTIES party
953  WHERE site.party_site_id  = p_party_site_id
954        AND site.party_id   =  p_party_id
955        AND site.party_id   = party.party_id
956        AND nvl(site.status, 'A') = 'A';
957 
958 lv_exists_flag VARCHAR2(1) := 'N';
959 
960 l_prog_name CONSTANT VARCHAR2(61) := G_PKG_NAME||'.'||'is_party_site_valid';
961 
962 BEGIN
963 
964 x_return_status := FND_API.G_RET_STS_SUCCESS;
965 
966   IF p_val_mode = 'BILL_TO' THEN
967    FOR v_bill_to_party_site IN c_bill_to_party_site(p_party_site_id,
968                     p_party_id)
969      LOOP
970        lv_exists_flag := 'Y';
971      END LOOP ;
972   ELSIF  p_val_mode =  'SHIP_TO' THEN
973    FOR v_ship_to_party_site IN  c_ship_to_party_site(p_party_site_id,
974                      p_party_id)
975      LOOP
976        lv_exists_flag := 'Y';
977      END LOOP ;
978 
979   ELSE
980     -- the p_val_mode = 'NONE'
981     FOR v_party_site IN c_party_site(p_party_site_id,
982                                      p_party_id)
983       LOOP
984         lv_exists_flag := 'Y';
985       END LOOP;
986 
987   END IF;
988   RETURN lv_exists_flag;
989 
990 EXCEPTION
991 
992       WHEN OTHERS THEN
993 
994         FND_MESSAGE.SET_NAME(G_APP_NAME, G_DB_ERROR);
995         FND_MESSAGE.SET_TOKEN(token => G_PROG_NAME_TOKEN, value => l_prog_name);
996         FND_MESSAGE.SET_TOKEN(token => G_SQLCODE_TOKEN, value => SQLCODE);
997         FND_MESSAGE.SET_TOKEN(token => G_SQLERRM_TOKEN, value => SQLERRM);
998         FND_MSG_PUB.add;
999 
1000         x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
1001         RETURN lv_exists_flag;
1002 
1003 END IS_PARTY_SITE_VALID;
1004 
1005 --======================================================
1006 -- IS_CONTRACT_LINE VALID - for Contract Line Validation
1007 --======================================================
1008 
1009 FUNCTION IS_CONTRACT_LINE_VALID(
1010                  p_contract_line_id      IN NUMBER,
1011                  x_contract_id           OUT NOCOPY NUMBER,
1012                  x_msg_data              OUT NOCOPY VARCHAR2,
1013                  x_msg_count             OUT NOCOPY NUMBER,
1014                  x_return_status         OUT NOCOPY VARCHAR2)
1015 RETURN VARCHAR2
1016 IS
1017 
1018 Cursor c_check_contract_line IS
1019 select id, chr_id
1020 from okc_k_lines_b
1021 where id = p_contract_line_id;
1022 
1023 l_contract_line_id NUMBER;
1024 l_exists_flag VARCHAR2(1);
1025 
1026 l_prog_name CONSTANT VARCHAR2(61) := G_PKG_NAME||'.'||'is_contract_line_valid';
1027 
1028 
1029 BEGIN
1030    OPEN c_check_contract_line;
1031    FETCH c_check_contract_line INTO l_contract_line_id, x_contract_id;
1032    CLOSE c_check_contract_line;
1033 
1034    IF l_contract_line_id IS NOT NULL THEN
1035      l_exists_flag := 'Y';
1036    ELSE
1037      l_exists_flag := 'N';
1038    END IF;
1039 
1040   RETURN l_exists_flag;
1041 
1042 EXCEPTION
1043 
1044       WHEN OTHERS THEN
1045 
1046         FND_MESSAGE.SET_NAME(G_APP_NAME, G_DB_ERROR);
1047         FND_MESSAGE.SET_TOKEN(token => G_PROG_NAME_TOKEN, value => l_prog_name);
1048         FND_MESSAGE.SET_TOKEN(token => G_SQLCODE_TOKEN, value => SQLCODE);
1049         FND_MESSAGE.SET_TOKEN(token => G_SQLERRM_TOKEN, value => SQLERRM);
1050         FND_MSG_PUB.add;
1051 
1052         x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
1053         RETURN l_exists_flag;
1054 
1055 
1056 END;
1057 
1058 --======================================================
1059 -- IS_CONTRACT_VALID - for Contract Validation
1060 --======================================================
1061 
1062 -- Changed for R12 By mviswana
1063 FUNCTION IS_CONTRACT_VALID(
1064                  p_contract_id           IN         NUMBER,
1065                  x_msg_data              OUT NOCOPY VARCHAR2,
1066                  x_msg_count             OUT NOCOPY NUMBER,
1067                  x_return_status         OUT NOCOPY VARCHAR2)
1068 RETURN VARCHAR2
1069 IS
1070 
1071  --Commented this code AND PTY.OBJECT1_ID1 = p_customer_id
1072  --to resolve bug 3254006
1073 
1074  Cursor c_contract_check IS
1075   SELECT 'x'
1076   FROM OKC_K_HEADERS_ALL_B HDR
1077        --OKC_K_PARTY_ROLES_B PTY
1078   WHERE
1079   HDR.START_DATE IS NOT NULL AND
1080   HDR.END_DATE IS NOT NULL AND
1081   HDR.TEMPLATE_YN='N' AND
1082   -- HDR.ID=PTY.CHR_ID AND
1083   -- PTY.JTOT_OBJECT1_CODE='OKX_PARTY' AND
1084   HDR.ID = p_contract_id;
1085 
1086   -- Commented to Fix Bug # 3554509
1087 
1088   --AND
1089   --p_request_date between nvl(hdr.start_date,p_request_date) and
1090   --nvl(hdr.end_date,p_request_date);
1091   --AND PTY.OBJECT1_ID1 = p_customer_id  ;
1092 
1093 
1094 
1095 lv_exists_flag VARCHAR2(1) := 'N';
1096 lv_check_flag VARCHAR2(1) := 'N';
1097 
1098 
1099 l_prog_name CONSTANT VARCHAR2(61) := G_PKG_NAME||'.'||'is_contract_valid';
1100 
1101 BEGIN
1102 
1103 x_return_status := FND_API.G_RET_STS_SUCCESS;
1104 
1105 
1106   FOR v_contract_check in c_contract_check LOOP
1107     lv_check_flag := 'Y';
1108     ------DBMS_OUTPUT.PUT_LINE('Found contract');
1109 
1110   END LOOP;
1111 
1112   IF lv_check_flag = 'Y' THEN
1113     lv_exists_flag := 'Y';
1114   ELSE
1115     lv_exists_flag := 'N';
1116   END IF;
1117 
1118 
1119   RETURN lv_exists_flag;
1120 
1121 EXCEPTION
1122 
1123       WHEN OTHERS THEN
1124 
1125         FND_MESSAGE.SET_NAME(G_APP_NAME, G_DB_ERROR);
1126         FND_MESSAGE.SET_TOKEN(token => G_PROG_NAME_TOKEN, value => l_prog_name);
1127         FND_MESSAGE.SET_TOKEN(token => G_SQLCODE_TOKEN, value => SQLCODE);
1128         FND_MESSAGE.SET_TOKEN(token => G_SQLERRM_TOKEN, value => SQLERRM);
1129         FND_MSG_PUB.add;
1130 
1131         x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
1132         RETURN lv_exists_flag;
1133 
1134 END;
1135 
1136 --==============================================================
1137 -- FUNCTION GET_CONTRACT_LINE_ID
1138 --==============================================================
1139 
1140 FUNCTION GET_CONTRACT_LINE_ID(
1141                  p_coverage_id        IN         NUMBER,
1142                  x_msg_data           OUT NOCOPY VARCHAR2,
1143                  x_msg_count          OUT NOCOPY NUMBER,
1144                  x_return_status      OUT NOCOPY VARCHAR2) RETURN NUMBER IS
1145 
1146 CURSOR c_k_line IS
1147 SELECT cle_id
1148 FROM   okc_k_lines_b
1149 WHERE  id = p_coverage_id;
1150 
1151 lv_temp NUMBER := 0;
1152 
1153 l_prog_name CONSTANT VARCHAR2(61) := G_PKG_NAME||'.'||'get_contract_line_id';
1154 
1155 BEGIN
1156 
1157 x_return_status := FND_API.G_RET_STS_SUCCESS;
1158 
1159 OPEN c_k_line;
1160 FETCH c_k_line INTO lv_temp;
1161 CLOSE c_k_line;
1162 
1163 RETURN lv_temp;
1164 
1165 EXCEPTION
1166 
1167       WHEN OTHERS THEN
1168 
1169         FND_MESSAGE.SET_NAME(G_APP_NAME, G_DB_ERROR);
1170         FND_MESSAGE.SET_TOKEN(token => G_PROG_NAME_TOKEN, value => l_prog_name);
1171         FND_MESSAGE.SET_TOKEN(token => G_SQLCODE_TOKEN, value => SQLCODE);
1172         FND_MESSAGE.SET_TOKEN(token => G_SQLERRM_TOKEN, value => SQLERRM);
1173         FND_MSG_PUB.add;
1174 
1175         x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
1176         RETURN lv_temp;
1177 
1178 END GET_CONTRACT_LINE_ID;
1179 
1180 --========================================================
1181 -- IS_UOM_VALID - For Uom Validation
1182 --========================================================
1183 FUNCTION IS_UOM_VALID(p_uom_code       IN         VARCHAR2,
1184                       p_inv_id         IN         NUMBER,
1185                       x_msg_data       OUT NOCOPY VARCHAR2,
1186                       x_msg_count      OUT NOCOPY NUMBER,
1187                       x_return_status  OUT NOCOPY VARCHAR2)
1188 RETURN VARCHAR2
1189 IS
1190 
1191 
1192 Cursor c_uom_code(p_uom_code IN VARCHAR2,
1193                   p_inv_id IN NUMBER) IS
1194  SELECT   uom_code
1195    FROM   MTL_ITEM_UOMS_VIEW
1196    WHERE  uom_code = p_uom_code  AND
1197           inventory_item_id = P_INV_ID AND
1198           organization_id = cs_std.get_item_valdn_orgzn_id ;
1199 
1200 lv_exists_flag VARCHAR2(1) := 'N';
1201 
1202 l_prog_name CONSTANT VARCHAR2(61) := G_PKG_NAME||'.'||'is_uom_valid';
1203 
1204 BEGIN
1205 
1206 x_return_status := FND_API.G_RET_STS_SUCCESS;
1207 
1208   FOR v_uom_code IN c_uom_code(p_uom_code,
1209                                p_inv_id) LOOP
1210     lv_exists_flag := 'Y';
1211   END LOOP;
1212   RETURN lv_exists_flag;
1213 
1214 EXCEPTION
1215 
1216       WHEN OTHERS THEN
1217 
1218         FND_MESSAGE.SET_NAME(G_APP_NAME, G_DB_ERROR);
1219         FND_MESSAGE.SET_TOKEN(token => G_PROG_NAME_TOKEN, value => l_prog_name);
1220         FND_MESSAGE.SET_TOKEN(token => G_SQLCODE_TOKEN, value => SQLCODE);
1221         FND_MESSAGE.SET_TOKEN(token => G_SQLERRM_TOKEN, value => SQLERRM);
1222         FND_MSG_PUB.add;
1223 
1224         x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
1225         RETURN lv_exists_flag;
1226 END;
1227 
1228 --=========================================================
1229 -- IS_INSTANCE_FOR_INVENTORY
1230 --=========================================================
1231 FUNCTION IS_INSTANCE_FOR_INVENTORY(p_instance_id    IN         NUMBER,
1232                                    p_inv_id         IN         NUMBER,
1233                                    x_msg_data       OUT NOCOPY VARCHAR2,
1234                                    x_msg_count      OUT NOCOPY NUMBER,
1235                                    x_return_status  OUT NOCOPY VARCHAR2)
1236 RETURN VARCHAR2
1237 IS
1238 
1239 --Cursor to check valid instnace_id*
1240 
1241 Cursor c_instance(p_instance_id IN NUMBER,
1242                   p_inv_id      IN NUMBER) IS
1243   SELECT instance_id
1244     FROM csi_item_instances
1245    WHERE instance_id = p_instance_id
1246      AND inventory_item_id = p_inv_id;
1247      --AND INV_MASTER_ORGANIZATION_ID = cs_std.get_item_valdn_orgzn_id;
1248 
1249 lv_exists_flag VARCHAR2(1) := 'N';
1250 
1251 l_prog_name CONSTANT VARCHAR2(61) := G_PKG_NAME||'.'||'is_instance_for_inventory';
1252 
1253 BEGIN
1254 
1255 x_return_status := FND_API.G_RET_STS_SUCCESS;
1256 
1257   FOR v_instance IN c_instance(p_instance_id,
1258                                p_inv_id) LOOP
1259     lv_exists_flag := 'Y';
1260 
1261   END LOOP;
1262 
1263   RETURN lv_exists_flag;
1264 
1265 EXCEPTION
1266 
1267       WHEN OTHERS THEN
1268 
1269         FND_MESSAGE.SET_NAME(G_APP_NAME, G_DB_ERROR);
1270         FND_MESSAGE.SET_TOKEN(token => G_PROG_NAME_TOKEN, value => l_prog_name);
1271         FND_MESSAGE.SET_TOKEN(token => G_SQLCODE_TOKEN, value => SQLCODE);
1272         FND_MESSAGE.SET_TOKEN(token => G_SQLERRM_TOKEN, value => SQLERRM);
1273         FND_MSG_PUB.add;
1274 
1275         x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
1276         RETURN lv_exists_flag;
1277 END;
1278 
1279 --=========================================================
1280 -- IS_INSTANCE_VALID
1281 -- SSHILPAM	Bug 8552188: Should be able to validate the
1282 --	        instance against related parties also.
1283 --=========================================================
1284 FUNCTION IS_INSTANCE_VALID(p_instance_id    IN         NUMBER,
1285                            p_party_id       IN         NUMBER,
1286                            x_msg_data       OUT NOCOPY VARCHAR2,
1287                            x_msg_count      OUT NOCOPY NUMBER,
1288                            x_return_status  OUT NOCOPY VARCHAR2)
1289 RETURN VARCHAR2
1290 IS
1291 
1292 CURSOR c_instance IS
1293    SELECT 'Y'
1294     FROM  CSI_ITEM_INSTANCES cp,
1295           MTL_SYSTEM_ITEMS_KFV ITEMS
1296     WHERE cp.instance_id = p_instance_id AND
1297           CP.OWNER_PARTY_SOURCE_TABLE = 'HZ_PARTIES' AND
1298           -- cp.owner_party_id = p_party_id AND Commented for bug 8552188
1299           ITEMS.INVENTORY_ITEM_ID = CP.INVENTORY_ITEM_ID AND
1300           ITEMS.ORGANIZATION_ID = cs_std.get_item_valdn_orgzn_id AND
1301           exists (select 'x'
1302                     from csi_i_parties cip
1303                     where cip.party_id = p_party_id
1304                           and cip.instance_id = cp.instance_id
1305                           and cip.party_source_table = 'HZ_PARTIES')AND
1306                           (
1307                           (fnd_profile.value('CS_SR_RESTRICT_IB') = 'YES'
1308                            and CP.LOCATION_TYPE_CODE IN('HZ_PARTY_SITES','HZ_LOCATIONS'))
1309                            or (fnd_profile.value('CS_SR_RESTRICT_IB') <> 'YES'));
1310 
1311 lv_exists_flag VARCHAR2(1) := 'N';
1312 
1313 l_prog_name CONSTANT VARCHAR2(61) := G_PKG_NAME||'.'||'is_instance_valid';
1314 
1315 BEGIN
1316 
1317 x_return_status := FND_API.G_RET_STS_SUCCESS;
1318 
1319 OPEN c_instance;
1320 FETCH c_instance INTO lv_exists_flag;
1321 CLOSE c_instance;
1322 
1323   RETURN lv_exists_flag;
1324 
1325 EXCEPTION
1326 
1327       WHEN OTHERS THEN
1328 
1329         FND_MESSAGE.SET_NAME(G_APP_NAME, G_DB_ERROR);
1330         FND_MESSAGE.SET_TOKEN(token => G_PROG_NAME_TOKEN, value => l_prog_name);
1331         FND_MESSAGE.SET_TOKEN(token => G_SQLCODE_TOKEN, value => SQLCODE);
1332         FND_MESSAGE.SET_TOKEN(token => G_SQLERRM_TOKEN, value => SQLERRM);
1333         FND_MSG_PUB.add;
1334 
1335         x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
1336         RETURN lv_exists_flag;
1337 END;
1338 
1339 --==========================================================
1340 --IS_INSTANCE_SERIAL_VALID
1341 --==========================================================
1342 
1343 FUNCTION IS_INSTANCE_SERIAL_VALID( p_instance_id   IN         NUMBER
1344                                   ,p_serial_number IN         VARCHAR
1345                                   ,x_msg_data      OUT NOCOPY VARCHAR2
1346                                   ,x_msg_count     OUT NOCOPY NUMBER
1347                                   ,x_return_status OUT NOCOPY VARCHAR2)
1348 
1349 RETURN VARCHAR2
1350 IS
1351 
1352 Cursor c_instance_serial_number IS
1353   SELECT 'Y'
1354     FROM csi_item_instances
1355    WHERE instance_id = p_instance_id
1356      AND serial_number = p_serial_number;
1357 
1358 lv_exists_flag VARCHAR2(1) := 'N';
1359 l_prog_name CONSTANT VARCHAR2(61) := G_PKG_NAME||'.'||'is_instance_serial_number_valid';
1360 
1361 BEGIN
1362 
1363 x_return_status := FND_API.G_RET_STS_SUCCESS;
1364 
1365 --DBMS_OUTPUT.PUT_LINE('In IS_INSTANCE_SERIAL_VALID ');
1366 
1367 OPEN c_instance_serial_number;
1368 FETCH c_instance_serial_number INTO lv_exists_flag;
1369 CLOSE c_instance_serial_number;
1370 
1371 --DBMS_OUTPUT.PUT_LINE('lv_exists_flag');
1372 
1373 RETURN lv_exists_flag;
1374 
1375 EXCEPTION
1376 
1377       WHEN OTHERS THEN
1378         --DBMS_OUTPUT.PUT_LINE('MAYA');
1379 
1380         FND_MESSAGE.SET_NAME(G_APP_NAME, G_DB_ERROR);
1381         FND_MESSAGE.SET_TOKEN(token => G_PROG_NAME_TOKEN, value => l_prog_name);
1382         FND_MESSAGE.SET_TOKEN(token => G_SQLCODE_TOKEN, value => SQLCODE);
1383         FND_MESSAGE.SET_TOKEN(token => G_SQLERRM_TOKEN, value => SQLERRM);
1384         FND_MSG_PUB.add;
1385 
1386         x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
1387         RETURN lv_exists_flag;
1388 
1389 END IS_INSTANCE_SERIAL_VALID ;
1390 
1391 --==========================================================
1392 --IS_PRICE_LIST_VALID
1393 --=========================================================
1394 FUNCTION IS_PRICE_LIST_VALID(p_price_list_id  IN         NUMBER,
1395                              x_msg_data       OUT NOCOPY VARCHAR2,
1396                              x_msg_count      OUT NOCOPY NUMBER,
1397                              x_return_status  OUT NOCOPY VARCHAR2
1398                            )
1399 RETURN VARCHAR2
1400 IS
1401 
1402 Cursor c_price_list(p_price_list_id IN NUMBER) IS
1403 SELECT list_header_id
1404 FROM   QP_LIST_HEADERS_B
1405 WHERE  list_type_code in ('PRL','AGR')
1406 AND    list_header_id = p_price_list_id
1407 AND    sysdate between nvl(start_date_active,sysdate) and
1408        nvl(end_date_active,sysdate);
1409 
1410 lv_exists_flag VARCHAR2(1) := 'N';
1411 
1412 l_prog_name CONSTANT VARCHAR2(61) := G_PKG_NAME||'.'||'is_price_list_valid';
1413 
1414 BEGIN
1415 
1416 x_return_status := FND_API.G_RET_STS_SUCCESS;
1417 
1418   FOR v_price_list in c_price_list(p_price_list_id) LOOP
1419     lv_exists_flag := 'Y';
1420   END LOOP;
1421 
1422   RETURN lv_exists_flag;
1423 
1424 EXCEPTION
1425 
1426       WHEN OTHERS THEN
1427 
1428         FND_MESSAGE.SET_NAME(G_APP_NAME, G_DB_ERROR);
1429         FND_MESSAGE.SET_TOKEN(token => G_PROG_NAME_TOKEN, value => l_prog_name);
1430         FND_MESSAGE.SET_TOKEN(token => G_SQLCODE_TOKEN, value => SQLCODE);
1431         FND_MESSAGE.SET_TOKEN(token => G_SQLERRM_TOKEN, value => SQLERRM);
1432         FND_MSG_PUB.add;
1433 
1434         x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
1435         RETURN lv_exists_flag;
1436 END;
1437 
1438 --=========================================================
1439 --IS_TXN_INV_ORG_VALID - for transaction inv org validation
1440 --=========================================================
1441 
1442 FUNCTION IS_TXN_INV_ORG_VALID(p_txn_inv_org    IN         NUMBER,
1443                               p_inv_id         IN         NUMBER,
1444                               x_msg_data       OUT NOCOPY VARCHAR2,
1445                               x_msg_count      OUT NOCOPY NUMBER,
1446                               x_return_status  OUT NOCOPY VARCHAR2)
1447 RETURN VARCHAR2
1448 IS
1449 --Bug Fix for 9371992
1450 --Replaced cursor c_oper_unit_for_inv_org with c_inv_org_for_item
1451 
1452 /*CURSOR c_oper_unit_for_inv_org (p_txn_inv_org number) IS
1453 SELECT
1454 TO_NUMBER(hoi2.org_information3) OPERATING_UNIT
1455 FROM
1456 hr_organization_units hou,
1457 hr_organization_information hoi1,
1458 hr_organization_information hoi2,
1459 mtl_parameters mp
1460 WHERE
1461 mp.organization_id = p_txn_inv_org
1462 AND mp.organization_id = hou.organization_id
1463 AND hou.organization_id = hoi1.organization_id
1464 AND hoi1.org_information1 = 'INV'
1465 AND hoi1.org_information2 = 'Y'
1466 AND hoi1.org_information_context = 'CLASS'
1467 AND hou.organization_id = hoi2.organization_id
1468 AND hoi2.org_information_context = 'Accounting Information' ;*/
1469 CURSOR c_inv_org_for_item (p_inv_id number) IS
1470 SELECT  hou.organization_id inv_org_id
1471 FROM   hr_organization_units hou,
1472        hr_organization_information hoi1,
1473        mtl_parameters mp,
1474        mtl_system_items_b msi
1475 WHERE
1476        hou.organization_id = msi.organization_id
1477    AND hou.organization_id = hoi1.organization_id
1478    AND hoi1.org_information1 = 'INV'
1479    AND hoi1.org_information2 = 'Y'
1480    AND msi.organization_id = mp.organization_id
1481    AND to_date(sysdate) between hou.date_from and nvl(hou.date_to,to_date(sysdate))
1482    AND msi.inventory_item_id = p_inv_id;
1483 
1484 lv_exists_flag VARCHAR2(1) := 'N';
1485 
1486 l_prog_name CONSTANT VARCHAR2(61) := G_PKG_NAME||'.'||'is_txn_inv_org_valid';
1487 
1488 BEGIN
1489 
1490 x_return_status := FND_API.G_RET_STS_SUCCESS;
1491 
1492  FOR v_inv_org_for_item IN c_inv_org_for_item (p_inv_id) LOOP
1493 
1494   IF v_inv_org_for_item.inv_org_id = p_txn_inv_org THEN
1495      lv_exists_flag := 'Y';
1496      EXIT;
1497   END IF;
1498  END LOOP;
1499 
1500  RETURN lv_exists_flag;
1501 
1502 EXCEPTION
1503 
1504       WHEN OTHERS THEN
1505 
1506         FND_MESSAGE.SET_NAME(G_APP_NAME, G_DB_ERROR);
1507         FND_MESSAGE.SET_TOKEN(token => G_PROG_NAME_TOKEN, value => l_prog_name);
1508         FND_MESSAGE.SET_TOKEN(token => G_SQLCODE_TOKEN, value => SQLCODE);
1509         FND_MESSAGE.SET_TOKEN(token => G_SQLERRM_TOKEN, value => SQLERRM);
1510         FND_MSG_PUB.add;
1511 
1512         x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
1513         RETURN lv_exists_flag;
1514 
1515 END;
1516 
1517 -- 12.1.3 Charges Logistics Project
1518 --=========================================================
1519 --IS_PARENT_INSTANCE_VALID - for Parent Instance Id Validation
1520 --=========================================================
1521 
1522 FUNCTION IS_PARENT_INSTANCE_VALID(p_cust_prod_id    IN         NUMBER,
1523                                   p_parent_inst_id  IN         NUMBER,
1524                                   x_msg_data        OUT NOCOPY VARCHAR2,
1525                                   x_msg_count       OUT NOCOPY NUMBER,
1526                                   x_return_status   OUT NOCOPY VARCHAR2)
1527 RETURN VARCHAR2 IS
1528 
1529    Cursor get_parent_instance(p_customer_product_id Number, p_parent_instance_id Number) is
1530    SELECT 'Y'
1531    FROM csi_ii_relationships
1532    WHERE subject_id = p_customer_product_id
1533    and object_id = p_parent_instance_id;
1534 
1535    lv_exists_flag VARCHAR2(1) := 'N';
1536    l_prog_name CONSTANT VARCHAR2(61) := G_PKG_NAME||'.'||'is_parent_instance_valid';
1537 
1538 BEGIN
1539 
1540    x_return_status := FND_API.G_RET_STS_SUCCESS;
1541 
1542    FOR i IN get_parent_instance(p_cust_prod_id, p_parent_inst_id) LOOP
1543       lv_exists_flag := 'Y';
1544       EXIT;
1545    END LOOP;
1546 
1547    RETURN lv_exists_flag;
1548 
1549 EXCEPTION
1550 
1551       WHEN OTHERS THEN
1552 
1553         FND_MESSAGE.SET_NAME(G_APP_NAME, G_DB_ERROR);
1554         FND_MESSAGE.SET_TOKEN(token => G_PROG_NAME_TOKEN, value => l_prog_name);
1555         FND_MESSAGE.SET_TOKEN(token => G_SQLCODE_TOKEN, value => SQLCODE);
1556         FND_MESSAGE.SET_TOKEN(token => G_SQLERRM_TOKEN, value => SQLERRM);
1557         FND_MSG_PUB.add;
1558 
1559         x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
1560         RETURN lv_exists_flag;
1561 END;
1562 
1563 --------------------------------------------------------------------------------
1564 -- FUNCTION IS_ESTIMATE_DETAIL_ID_VALID
1565 --------------------------------------------------------------------------------
1566 FUNCTION IS_ESTIMATE_DETAIL_ID_VALID (p_estimate_detail_id IN         NUMBER,
1567                                       x_msg_data           OUT NOCOPY VARCHAR2,
1568                                       x_msg_count          OUT NOCOPY NUMBER,
1569                                       x_return_status      OUT NOCOPY VARCHAR2) RETURN VARCHAR2 IS
1570 
1571 Cursor c_estimate_detail_id IS
1572   SELECT 1
1573    FROM CS_ESTIMATE_DETAILS
1574   WHERE estimate_detail_id = p_estimate_detail_id;
1575 
1576   lv_exists_flag VARCHAR2(1) := 'N';
1577 
1578 l_prog_name CONSTANT VARCHAR2(61) := G_PKG_NAME||'.'||'is_estimate_detail_id_valid';
1579 
1580 BEGIN
1581 
1582 x_return_status := FND_API.G_RET_STS_SUCCESS;
1583 
1584   FOR v_estimate_detail_id IN c_estimate_detail_id LOOP
1585     lv_exists_flag := 'Y';
1586   END LOOP;
1587 
1588 RETURN lv_exists_flag;
1589 
1590 EXCEPTION
1591 
1592       WHEN OTHERS THEN
1593 
1594         FND_MESSAGE.SET_NAME(G_APP_NAME, G_DB_ERROR);
1595         FND_MESSAGE.SET_TOKEN(token => G_PROG_NAME_TOKEN, value => l_prog_name);
1596         FND_MESSAGE.SET_TOKEN(token => G_SQLCODE_TOKEN, value => SQLCODE);
1597         FND_MESSAGE.SET_TOKEN(token => G_SQLERRM_TOKEN, value => SQLERRM);
1598         FND_MSG_PUB.add;
1599 
1600         x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
1601         RETURN lv_exists_flag;
1602 
1603 END IS_ESTIMATE_DETAIL_ID_VALID;
1604 
1605 --------------------------------------------------------------------------------
1606 -- FUNCTION IS_ITEM_REVISION_VALID
1607 --------------------------------------------------------------------------------
1608 FUNCTION IS_ITEM_REVISION_VALID (p_inventory_item_id IN         NUMBER,
1609                                  p_item_revision     IN         VARCHAR2,
1610                                       x_msg_data           OUT NOCOPY VARCHAR2,
1611                                       x_msg_count          OUT NOCOPY NUMBER,
1612                                       x_return_status      OUT NOCOPY VARCHAR2) RETURN VARCHAR2 IS
1613 
1614 Cursor c_item_revision IS
1615   SELECT 1
1616   FROM MTL_ITEM_REVISIONS
1617   WHERE inventory_item_id = p_inventory_item_id and
1618         revision = p_item_revision and
1619         organization_id = cs_std.get_item_valdn_orgzn_id ;
1620 
1621   lv_exists_flag VARCHAR2(1) := 'N';
1622 
1623 l_prog_name CONSTANT VARCHAR2(61) := G_PKG_NAME||'.'||'is_item_revision_valid';
1624 
1625 BEGIN
1626 
1627 x_return_status := FND_API.G_RET_STS_SUCCESS;
1628 
1629   FOR v_item_revision IN c_item_revision LOOP
1630     lv_exists_flag := 'Y';
1631   END LOOP;
1632 
1633 RETURN lv_exists_flag;
1634 
1635 EXCEPTION
1636 
1637       WHEN OTHERS THEN
1638 
1639         FND_MESSAGE.SET_NAME(G_APP_NAME, G_DB_ERROR);
1640         FND_MESSAGE.SET_TOKEN(token => G_PROG_NAME_TOKEN, value => l_prog_name);
1641         FND_MESSAGE.SET_TOKEN(token => G_SQLCODE_TOKEN, value => SQLCODE);
1642         FND_MESSAGE.SET_TOKEN(token => G_SQLERRM_TOKEN, value => SQLERRM);
1643         FND_MSG_PUB.add;
1644 
1645         x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
1646         RETURN lv_exists_flag;
1647 
1648 END IS_ITEM_REVISION_VALID;
1649 
1650 --------------------------------------------------------------------------------
1651 -- FUNCTION IS_LINE_NUMBER_VALID
1652 --------------------------------------------------------------------------------
1653 FUNCTION IS_LINE_NUMBER_VALID(
1654                  p_line_number       IN         NUMBER,
1655                  p_incident_id       IN         NUMBER,
1656                  x_msg_data           OUT NOCOPY VARCHAR2,
1657                  x_msg_count          OUT NOCOPY NUMBER,
1658                  x_return_status      OUT NOCOPY VARCHAR2) RETURN VARCHAR2 IS
1659 
1660 Cursor c_line_number IS
1661   SELECT line_number
1662   FROM CS_ESTIMATE_DETAILS
1663   WHERE incident_id = p_incident_id and
1664         line_number = p_line_number;
1665 
1666 lv_exists_flag VARCHAR2(1) := 'N';
1667 
1668 l_prog_name CONSTANT VARCHAR2(61) := G_PKG_NAME||'.'||'is_line_number_valid';
1669 
1670 BEGIN
1671 
1672 x_return_status := FND_API.G_RET_STS_SUCCESS;
1673 
1674   IF p_line_number <= 0 THEN
1675      lv_exists_flag := 'Y';
1676   ELSE
1677      FOR v_line_number IN c_line_number LOOP
1678      lv_exists_flag := 'Y';
1679      END LOOP;
1680   END IF;
1681 
1682 RETURN lv_exists_flag;
1683 
1684 EXCEPTION
1685 
1686       WHEN OTHERS THEN
1687 
1688         FND_MESSAGE.SET_NAME(G_APP_NAME, G_DB_ERROR);
1689         FND_MESSAGE.SET_TOKEN(token => G_PROG_NAME_TOKEN, value => l_prog_name);
1690         FND_MESSAGE.SET_TOKEN(token => G_SQLCODE_TOKEN, value => SQLCODE);
1691         FND_MESSAGE.SET_TOKEN(token => G_SQLERRM_TOKEN, value => SQLERRM);
1692         FND_MSG_PUB.add;
1693 
1694         x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
1695         RETURN lv_exists_flag;
1696 
1697 END IS_LINE_NUMBER_VALID;
1698 
1699 --==========================================================
1700 --==========================================================
1701 --  API for upstream to Create Charge Details
1702 --==========================================================
1703 PROCEDURE Create_Charge_Details(
1704       p_api_version           IN  	  NUMBER,
1705       p_init_msg_list         IN 	  VARCHAR2 	:= FND_API.G_FALSE,
1706       p_commit                IN 	  VARCHAR2 	:= FND_API.G_FALSE,
1707       p_validation_level      IN  	  NUMBER 	:= FND_API.G_VALID_LEVEL_FULL,
1708       x_return_status         OUT NOCOPY  VARCHAR2,
1709       x_msg_count             OUT NOCOPY  NUMBER,
1710       x_object_version_number OUT NOCOPY  NUMBER,
1711       x_estimate_detail_id    OUT NOCOPY  NUMBER,
1712       x_line_number           OUT NOCOPY  NUMBER,
1713       x_msg_data              OUT NOCOPY  VARCHAR2,
1714       p_resp_appl_id          IN          NUMBER := FND_GLOBAL.RESP_APPL_ID,
1715       p_resp_id               IN          NUMBER := FND_GLOBAL.RESP_ID,
1716       p_user_id               IN          NUMBER := FND_GLOBAL.USER_ID,
1717       p_login_id              IN  	  NUMBER := NULL,
1718       p_transaction_control   IN          VARCHAR2      := FND_API.G_TRUE,
1719       p_est_detail_rec        IN          CS_Charge_Details_PUB.Charges_Rec_Type
1720 			) IS
1721 
1722 l_api_version       NUMBER                   :=  1.0 ;
1723 l_api_name          CONSTANT VARCHAR2(30)    := 'Create_Charge_Details' ;
1724 l_api_name_full     CONSTANT VARCHAR2(100)    :=  G_PKG_NAME || '.' || l_api_name ;
1725 l_log_module        CONSTANT VARCHAR2(255)   := 'cs.plsql.' || l_api_name_full || '.';
1726 l_return_status     VARCHAR2(1) ;
1727 l_est_detail_rec    CS_Charge_Details_PUB.Charges_Rec_Type;
1728 l_line_num          NUMBER               := 1 ;
1729 l_ed_id             NUMBER ;
1730 lx_org_id           NUMBER ;
1731 lx_profile          VARCHAR2(1);
1732 l_org_id            NUMBER ;
1733 
1734 l_prog_name CONSTANT VARCHAR2(61) := G_PKG_NAME||'.'||'create_charge_details';
1735 
1736 
1737 --DEBUG
1738 l_errm VARCHAR2(100);
1739 
1740 BEGIN
1741 
1742 --DBMS_OUTPUT.PUT_LINE('BEGIN create_charge_details');
1743 --DBMS_OUTPUT.PUT_LINE('submit_error_message is '||p_est_detail_rec.submit_error_message);
1744 
1745   -- Standard start of API savepoint
1746   IF FND_API.To_Boolean(p_transaction_control) THEN
1747     SAVEPOINT Create_Charge_Details_PVT;
1748   END IF ;
1749 
1750   -- Standard call to check for call compatibility
1751   IF NOT FND_API.Compatible_API_Call(l_api_version,
1752      p_api_version,
1753      l_api_name,
1754      G_PKG_NAME) THEN
1755     RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
1756   END IF;
1757 
1758   -- Initialize message list if p_init_msg_list is set to TRUE
1759   IF FND_API.To_Boolean(p_init_msg_list) THEN
1760     FND_MSG_PUB.Initialize;
1761   END IF;
1762 
1763   -- Initialize API return status to success
1764   x_return_status := FND_API.G_RET_STS_SUCCESS;
1765 
1766 ----------------------- FND Logging -----------------------------------
1767   IF FND_LOG.level_procedure >= FND_LOG.g_current_runtime_level
1768   THEN
1769     FND_LOG.String
1770     ( FND_LOG.level_procedure , L_LOG_MODULE || 'start'
1771     , 'Inside ' || L_API_NAME_FULL || ', called with parameters below:'
1772     );
1773     FND_LOG.String
1774     ( FND_LOG.level_procedure , L_LOG_MODULE || ''
1775     , 'p_api_version:' || p_api_version
1776     );
1777     FND_LOG.String
1778     ( FND_LOG.level_procedure , L_LOG_MODULE || ''
1779     , 'p_init_msg_list:' || p_init_msg_list
1780     );
1781     FND_LOG.String
1782     ( FND_LOG.level_procedure , L_LOG_MODULE || ''
1783     , 'p_commit:' || p_commit
1784     );
1785     FND_LOG.String
1786     ( FND_LOG.level_procedure , L_LOG_MODULE || ''
1787     , 'p_validation_level:' || p_validation_level
1788     );
1789     FND_LOG.String
1790     ( FND_LOG.level_procedure , L_LOG_MODULE || ''
1791     , 'p_resp_appl_id:' || p_resp_appl_id
1792     );
1793     FND_LOG.String
1794     ( FND_LOG.level_procedure , L_LOG_MODULE || ''
1795     , 'p_resp_id:' || p_resp_id
1796     );
1797     FND_LOG.String
1798     ( FND_LOG.level_procedure , L_LOG_MODULE || ''
1799     , 'p_user_id:' || p_user_id
1800     );
1801     FND_LOG.String
1802     ( FND_LOG.level_procedure , L_LOG_MODULE || ''
1803     , 'p_login_id:' || p_login_id
1804     );
1805     FND_LOG.String
1806     ( FND_LOG.level_procedure , L_LOG_MODULE || ''
1807     , 'p_transaction_control:' || p_transaction_control
1808     );
1809 
1810  -- --------------------------------------------------------------------------
1811  -- This procedure Logs the charges record paramters.
1812  -- --------------------------------------------------------------------------
1813     CS_Charge_Details_PUB.Log_Charges_Rec_Parameters
1814     ( p_Charges_Rec             =>  p_est_detail_rec
1815     );
1816 
1817   END IF;
1818 
1819   -- Make the preprocessing call to the user hooks
1820   --
1821   -- Pre call to the customer type user hook
1822   --
1823   IF jtf_usr_hks.Ok_To_Execute('CS_CHARGE_DETAILS_PVT',
1824                                'Create_Charge_Details',
1825 			       'B','C') THEN
1826 
1827     CS_CHARGE_DETAILS_CUHK.Create_Charge_Details_Pre(
1828 		p_api_version      	   => l_api_version,
1829 		p_init_msg_list    	   => FND_API.G_FALSE,
1830 		p_commit           	   => p_commit,
1831 		p_validation_level 	   => p_validation_level,
1832 		x_return_status    	   => l_return_status,
1833 		x_msg_count       	   => x_msg_count,
1834 		x_object_version_number    => x_object_version_number,
1835         	x_estimate_detail_id       => l_ed_id,
1836     	    	x_line_number              => l_line_num,
1837 		x_msg_data         	   => x_msg_data,
1838 		p_resp_appl_id    	   => p_resp_appl_id,
1839 		p_resp_id          	   => p_resp_id,
1840     		p_user_id          	   => p_user_id,
1841 		p_login_id         	   => p_login_id,
1842         	p_transaction_control      => p_transaction_control,
1843 		p_est_detail_rec           => p_est_detail_rec);
1844 
1845 
1846     IF (l_return_status <> FND_API.G_RET_STS_SUCCESS) THEN
1847       FND_MESSAGE.Set_Name('CS', 'CS_API_CHG_ERR_PRE_CUST_USR_HK');
1848       FND_MESSAGE.Set_Token('API_NAME', l_api_name_full);
1849       FND_MSG_PUB.Add;
1850       RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
1851     END IF;
1852 
1853   END IF;
1854 
1855   --
1856   -- Pre call to the Vertical Type User Hook
1857   --
1858   IF jtf_usr_hks.Ok_To_Execute('CS_CHARGE_DETAILS_PVT',
1859                                'Create_Charge_Details',
1860                                'B', 'V')  THEN
1861 
1862     CS_CHARGE_DETAILS_VUHK.Create_Charge_Details_Pre(
1863 		p_api_version      	   => l_api_version,
1864 		p_init_msg_list    	   => FND_API.G_FALSE,
1865 		p_commit           	   => p_commit,
1866 		p_validation_level 	   => p_validation_level,
1867 		x_return_status    	   => l_return_status,
1868 		x_msg_count       	   => x_msg_count,
1869 		x_object_version_number    => x_object_version_number,
1870                 x_estimate_detail_id       => l_ed_id,
1871                 x_line_number              => l_line_num,
1872 		x_msg_data         	   => x_msg_data,
1873 		p_resp_appl_id    	   => p_resp_appl_id,
1874 		p_resp_id          	   => p_resp_id,
1875     	        p_user_id          	   => p_user_id,
1876 		p_login_id         	   => p_login_id,
1877                 p_transaction_control      => p_transaction_control,
1878 		p_est_detail_rec           => p_est_detail_rec);
1879 
1880 
1881     IF (l_return_status <> FND_API.G_RET_STS_SUCCESS) THEN
1882       FND_MESSAGE.Set_Name('CS', 'CS_API_CHG_ERR_PRE_VERT_USR_HK');
1883       FND_MESSAGE.Set_Token('API_NAME', l_api_name_full);
1884       FND_MSG_PUB.Add;
1885       RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
1886     END IF;
1887 
1888   END IF;
1889 
1890   -- ======================================================================
1891   -- Apply business-rule validation to all required and passed parameters
1892   -- if validation level is set.
1893   -- ======================================================================
1894 
1895   IF (p_validation_level > FND_API.G_VALID_LEVEL_NONE) THEN
1896 
1897     --DBMS_OUTPUT.PUT_LINE('Calling VALIDATE_WHO_INFO');
1898     --DBMS_OUTPUT.PUT_LINE('p_user_id '|| p_user_id);
1899     --DBMS_OUTPUT.PUT_LINE('p_login_id '||p_login_id);
1900 
1901     Validate_Who_Info (p_api_name             => l_api_name_full,
1902                        p_user_id              => p_user_id,
1903                        p_login_id             => p_login_id,
1904                        x_return_status        => l_return_status);
1905 
1906     --DBMS_OUTPUT.PUT_LINE('Back from VALIDATE_WHO_INFO '||l_return_status);
1907 
1908     IF (l_return_status <> FND_API.G_RET_STS_SUCCESS) THEN
1909       RAISE FND_API.G_EXC_ERROR;
1910     END IF;
1911 
1912     -- --DBMS_OUTPUT.PUT_LINE('Calling VALIDATE_CHARGE_DETAILS');
1913 
1914     --Validate the Charge Detail Record that is passed in by the Upstream Module
1915     VALIDATE_CHARGE_DETAILS(p_api_name           => l_api_name,
1916                             p_charges_detail_rec => p_est_detail_rec,
1917                             p_validation_mode    => 'I',
1918                             p_user_id            => p_user_id,
1919                             p_login_id           => p_login_id,
1920                             x_charges_detail_rec => l_est_detail_rec,
1921                             x_msg_data           => x_msg_data,
1922                             x_msg_count          => x_msg_count,
1923                             x_return_status      => l_return_status);
1924  IF FND_LOG.level_procedure >= FND_LOG.g_current_runtime_level
1925 	      THEN
1926 		FND_LOG.String
1927 		( FND_LOG.level_procedure , L_LOG_MODULE || ''
1928 		, 'After calling VALIDATE_CHARGE_DETAILS l_return_status :' || l_return_status
1929 		);
1930 		FND_LOG.String
1931 		( FND_LOG.level_procedure , L_LOG_MODULE || ''
1932 		, 'x_msg_data :' || x_msg_data
1933 		);
1934   END IF;
1935 
1936 
1937     IF l_return_status <> FND_API.G_RET_STS_SUCCESS THEN
1938       FND_MESSAGE.Set_Name('CS', 'CS_CHG_VALIDATE_CHRG_DETAIL_ER');
1939       FND_MESSAGE.Set_Token('API_NAME', l_api_name_full);
1940       FND_MSG_PUB.Add;
1941       RAISE FND_API.G_EXC_ERROR;
1942     END IF;
1943 
1944   --Fixed Bug # 3795144
1945   ELSE
1946     --p_validation_level = FND_API.G_VALID_LEVEL_NONE
1947     IF (p_validation_level = FND_API.G_VALID_LEVEL_NONE) THEN
1948       --populate the l_est_detail_rec record
1949       l_est_detail_rec := p_est_detail_rec;
1950     END IF;
1951   END IF ;
1952 
1953   -----------------------------------------
1954   -- Prepare to INSERT record into database
1955   -----------------------------------------
1956   -- Added fix for the bug:5125385
1957   -- commented this out as billing_engine and copy_to_estimate are failing
1958 
1959   -- dbms_output.put_line('Value of charge line number ' || l_est_detail_rec.line_number);
1960 
1961   IF l_est_detail_rec.line_number IS NOT NULL AND
1962      l_est_detail_rec.line_number <> FND_API.G_MISS_NUM THEN
1963 
1964      l_line_num := l_est_detail_rec.line_number;
1965 
1966   ELSE
1967 
1968   SELECT max(line_number) + 1
1969   INTO   l_line_num
1970   FROM   CS_ESTIMATE_DETAILS
1971   WHERE  incident_id = p_est_detail_rec.incident_id;
1972 
1973   END IF;
1974 
1975   l_line_num := NVL(l_line_num,1);
1976 
1977 
1978   SELECT cs_estimate_details_s.nextval
1979   INTO   l_ed_id
1980   FROM   DUAL ;
1981 
1982   --DBMS_OUTPUT.PUT_LINE('Calling CS_ESTIMATE_DETAILS_PKG.INSERT_ROW');
1983   --DBMS_OUTPUT.PUT_LINE('l_org_id = '||l_est_detail_rec.org_id);
1984   --DBMS_OUTPUT.PUT_LINE('l_est_detail_rec.incident_id = '||l_est_detail_rec.incident_id);
1985   --DBMS_OUTPUT.PUT_LINE('l_est_detail_rec.original_source_id = '||l_est_detail_rec.original_source_id);
1986   --DBMS_OUTPUT.PUT_LINE('l_est_detail_rec.original_source_code = '||l_est_detail_rec.original_source_code);
1987   --DBMS_OUTPUT.PUT_LINE('l_est_detail_rec.source_id = '||l_est_detail_rec.source_id);
1988   --DBMS_OUTPUT.PUT_LINE('l_est_detail_rec.source_code = '||l_est_detail_rec.source_code);
1989   --DBMS_OUTPUT.PUT_LINE('l_est_detail_rec.contract_id = '||l_est_detail_rec.contract_id);
1990   --DBMS_OUTPUT.PUT_LINE('l_est_detail_rec.coverage_id = '||l_est_detail_rec.coverage_id);
1991   --DBMS_OUTPUT.PUT_LINE('l_est_detail_rec.coverage_txn_group_id = '||l_est_detail_rec.coverage_txn_group_id);
1992   --DBMS_OUTPUT.PUT_LINE('l_EST_DETAIL_rec.currency_code = '||l_EST_DETAIL_rec.currency_code);
1993   --DBMS_OUTPUT.PUT_LINE('l_EST_DETAIL_rec.conversion_rate = '||l_EST_DETAIL_rec.conversion_rate);
1994   --DBMS_OUTPUT.PUT_LINE('l_EST_DETAIL_rec.conversion_rate_date = '||l_EST_DETAIL_rec.conversion_rate_date);
1995   --DBMS_OUTPUT.PUT_LINE('l_EST_DETAIL_rec.conversion_type_code = '||l_EST_DETAIL_rec.conversion_type_code);
1996   --DBMS_OUTPUT.PUT_LINE('l_est_detail_rec.invoice_to_org_id = '||l_est_detail_rec.invoice_to_org_id);
1997   --DBMS_OUTPUT.PUT_LINE('l_est_detail_rec.ship_to_org_id = '||l_est_detail_rec.ship_to_org_id);
1998   --DBMS_OUTPUT.PUT_LINE('l_est_detail_rec.purchase_order_num = '||l_est_detail_rec.purchase_order_num);
1999   --DBMS_OUTPUT.PUT_LINE('l_est_detail_rec.order_line_id = '||l_est_detail_rec.order_line_id);
2000   --DBMS_OUTPUT.PUT_LINE('l_est_detail_rec.line_type_id = '||l_est_detail_rec.line_type_id);
2001   --DBMS_OUTPUT.PUT_LINE('l_EST_DETAIL_rec.LINE_CATEGORY_CODE = '||l_EST_DETAIL_rec.LINE_CATEGORY_CODE);
2002   --DBMS_OUTPUT.PUT_LINE('l_est_detail_rec.price_list_id = '||l_est_detail_rec.price_list_id);
2003   --DBMS_OUTPUT.PUT_LINE('l_line_num = '||l_line_num);
2004   --DBMS_OUTPUT.PUT_LINE('l_est_detail_rec.inventory_item_id_in = '||l_est_detail_rec.inventory_item_id_in);
2005   --DBMS_OUTPUT.PUT_LINE('l_est_detail_rec.item_revision = '||l_est_detail_rec.item_revision);
2006   --DBMS_OUTPUT.PUT_LINE('l_EST_DETAIL_rec.SERIAL_NUMBER = '||l_EST_DETAIL_rec.SERIAL_NUMBER);
2007   --DBMS_OUTPUT.PUT_LINE('l_est_detail_rec.quantity_required = '||l_est_detail_rec.quantity_required);
2008   --DBMS_OUTPUT.PUT_LINE('l_est_detail_rec.unit_of_measure_code = '||l_est_detail_rec.unit_of_measure_code);
2009   --DBMS_OUTPUT.PUT_LINE('l_est_detail_rec.selling_price = '||l_est_detail_rec.selling_price);
2010   --DBMS_OUTPUT.PUT_LINE('l_est_detail_rec.after_warranty_cost = '||l_est_detail_rec.after_warranty_cost);
2011   --DBMS_OUTPUT.PUT_LINE('l_est_detail_rec.business_process_id = '||l_est_detail_rec.business_process_id);
2012   --DBMS_OUTPUT.PUT_LINE('l_est_detail_rec.transaction_type_id = '||l_est_detail_rec.transaction_type_id);
2013   --DBMS_OUTPUT.PUT_LINE('l_est_detail_rec.customer_product_id = '||l_est_detail_rec.customer_product_id);
2014   --DBMS_OUTPUT.PUT_LINE('l_est_detail_rec.order_header_id = '||l_est_detail_rec.order_header_id);
2015   --DBMS_OUTPUT.PUT_LINE('l_est_detail_rec.installed_cp_return_by_date = '||l_est_detail_rec.installed_cp_return_by_date);
2016   --DBMS_OUTPUT.PUT_LINE('l_est_detail_rec.new_cp_return_by_date = '||l_est_detail_rec.new_cp_return_by_date);
2017   --DBMS_OUTPUT.PUT_LINE('l_est_detail_rec.interface_to_oe_flag = '||l_est_detail_rec.interface_to_oe_flag);
2018   --DBMS_OUTPUT.PUT_LINE('l_est_detail_rec.rollup_flag = '||l_est_detail_rec.rollup_flag);
2019   --DBMS_OUTPUT.PUT_LINE('l_est_detail_rec.no_charge_flag = '||l_est_detail_rec.no_charge_flag);
2020   --DBMS_OUTPUT.PUT_LINE('l_est_detail_rec.add_to_order_flag = '||l_est_detail_rec.add_to_order_flag);
2021   --DBMS_OUTPUT.PUT_LINE('l_est_detail_rec.return_reason_code = '||l_est_detail_rec.return_reason_code);
2022   --DBMS_OUTPUT.PUT_LINE('l_est_detail_rec.generated_by_bca_engine = '||l_est_detail_rec.generated_by_bca_engine);
2023   --DBMS_OUTPUT.PUT_LINE('l_est_detail_rec.transaction_inventory_org = '||l_est_detail_rec.transaction_inventory_org);
2024   --DBMS_OUTPUT.PUT_LINE('l_est_detail_rec.transaction_sub_inventory = '||l_est_detail_rec.transaction_sub_inventory);
2025   --DBMS_OUTPUT.PUT_LINE('l_est_detail_rec.charge_line_type = '||l_est_detail_rec.charge_line_type);
2026   --DBMS_OUTPUT.PUT_LINE('l_est_detail_rec.ship_to_account_id = '||l_est_detail_rec.ship_to_account_id);
2027   --DBMS_OUTPUT.PUT_LINE('l_est_detail_rec.bill_to_account_id = '||l_est_detail_rec.bill_to_account_id);
2028   --DBMS_OUTPUT.PUT_LINE('l_est_detail_rec.ship_to_contact_id = '||l_est_detail_rec.ship_to_contact_id);
2029   --DBMS_OUTPUT.PUT_LINE('l_est_detail_rec.bill_to_contact_id = '||l_est_detail_rec.bill_to_contact_id);
2030   --DBMS_OUTPUT.PUT_LINE('l_est_detail_rec.list_price = '||l_est_detail_rec.list_price);
2031   --DBMS_OUTPUT.PUT_LINE('l_est_detail_rec.activity_start_time = '||TO_CHAR(l_est_detail_rec.activity_start_time, 'DD-MON-YYYY HH24:MI:SS'));
2032   --DBMS_OUTPUT.PUT_LINE('l_est_detail_rec.activity_end_time = '||TO_CHAR(l_est_detail_rec.activity_end_time, 'DD-MON-YYYY HH24:MI:SS'));
2033   --DBMS_OUTPUT.PUT_LINE('l_est_detail_rec.contract_discount_amount = '||l_est_detail_rec.contract_discount_amount);
2034   --DBMS_OUTPUT.PUT_LINE('l_est_detail_rec.bill_to_party_id = '||l_est_detail_rec.bill_to_party_id);
2035   --DBMS_OUTPUT.PUT_LINE('l_est_detail_rec.ship_to_party_id = '||l_est_detail_rec.ship_to_party_id);
2036   --DBMS_OUTPUT.PUT_LINE('l_est_detail_rec.coverage_bill_rate_id = '||l_est_detail_rec.coverage_bill_rate_id);
2037   --DBMS_OUTPUT.PUT_LINE('l_est_detail_rec.txn_billing_type_id = '||l_est_detail_rec.txn_billing_type_id);
2038   --DBMS_OUTPUT.PUT_LINE('p_login_id = '||p_login_id);
2039   --DBMS_OUTPUT.PUT_LINE('p_user_id = '||p_user_id);
2040   --DBMS_OUTPUT.PUT_LINE('p_user_id = '||p_user_id);
2041   --DBMS_OUTPUT.PUT_LINE('l_ed_id = '||l_ed_id);
2042    IF FND_LOG.level_procedure >= FND_LOG.g_current_runtime_level
2043       THEN
2044 	FND_LOG.String
2045 	( FND_LOG.level_procedure , L_LOG_MODULE || ''
2046 	, 'The Value of l_est_detail_rec.shipping_method :' || l_est_detail_rec.shipping_method
2047 	);
2048 	FND_LOG.String
2049 	( FND_LOG.level_procedure , L_LOG_MODULE || ''
2050 	, 'The Value of l_est_detail_rec.arrival_date_time :' || l_est_detail_rec.arrival_date_time
2051 	);
2052   END IF;
2053 
2054   CS_ESTIMATE_DETAILS_PKG.Insert_Row(
2055     p_org_id                           => l_est_detail_rec.org_id,
2056     p_incident_id                      => l_est_detail_rec.incident_id,
2057     p_original_source_id               => l_est_detail_rec.original_source_id,
2058     p_original_source_code             => l_est_detail_rec.original_source_code,
2059     p_source_id                        => l_est_detail_rec.source_id,
2060     p_source_code                      => l_est_detail_rec.source_code,
2061     p_contract_line_id                 => l_est_detail_rec.contract_line_id,
2062     p_rate_type_code                   => l_est_detail_rec.rate_type_code,
2063     p_contract_id                      => l_est_detail_rec.contract_id,
2064     p_coverage_id                      => null,
2065     p_coverage_txn_group_id            => null,
2066     p_CURRENCY_CODE                    => l_EST_DETAIL_rec.currency_code,
2067     p_CONVERSION_RATE                  => l_EST_DETAIL_rec.conversion_rate,
2068     p_CONVERSION_TYPE_CODE             => l_EST_DETAIL_rec.conversion_type_code,
2069     p_CONVERSION_RATE_DATE             => l_EST_DETAIL_rec.conversion_rate_date,
2070     p_invoice_to_org_id                => l_est_detail_rec.invoice_to_org_id,
2071     p_ship_to_org_id                   => l_est_detail_rec.ship_to_org_id,
2072     p_purchase_order_num               => l_est_detail_rec.purchase_order_num,
2073     p_order_line_id                    => l_est_detail_rec.order_line_id,
2074     p_line_type_id                     => l_est_detail_rec.line_type_id,
2075     p_LINE_CATEGORY_CODE               => l_EST_DETAIL_rec.LINE_CATEGORY_CODE,
2076     p_price_list_header_id             => l_est_detail_rec.price_list_id,
2077     p_line_number                      => l_line_num,
2078     p_inventory_item_id                => l_est_detail_rec.inventory_item_id_in,
2079     p_item_revision	               => l_est_detail_rec.item_revision,
2080     p_SERIAL_NUMBER                    => l_EST_DETAIL_rec.SERIAL_NUMBER,
2081     p_quantity_required                => l_est_detail_rec.quantity_required,
2082     p_unit_of_measure_code             => l_est_detail_rec.unit_of_measure_code,
2083     p_selling_price                    => l_est_detail_rec.selling_price,
2084     p_after_warranty_cost              => l_est_detail_rec.after_warranty_cost,
2085     p_business_process_id              => l_est_detail_rec.business_process_id,
2086     p_transaction_type_id              => l_est_detail_rec.transaction_type_id,
2087     p_customer_product_id              => l_est_detail_rec.customer_product_id,
2088     p_order_header_id                  => l_est_detail_rec.order_header_id,
2089     p_installed_cp_return_by_date      => l_est_detail_rec.installed_cp_return_by_date,
2090     p_new_cp_return_by_date            => l_est_detail_rec.new_cp_return_by_date,
2091     p_interface_to_oe_flag             => nvl(l_est_detail_rec.interface_to_oe_flag, 'N'),
2092     p_rollup_flag                      => nvl(l_est_detail_rec.rollup_flag,'N'),
2093     p_no_charge_flag                   => nvl(l_est_detail_rec.no_charge_flag,'N'),
2094     p_add_to_order_flag                => nvl(l_est_detail_rec.add_to_order_flag,'N'),
2095     p_return_reason_code               => l_est_detail_rec.return_reason_code,
2096     p_generated_by_bca_engine_flag     => nvl(l_est_detail_rec.generated_by_bca_engine,'N'),
2097     p_transaction_inventory_org        => l_est_detail_rec.transaction_inventory_org,
2098     p_transaction_sub_inventory	       => l_est_detail_rec.transaction_sub_inventory,
2099     p_charge_line_type                 => l_est_detail_rec.charge_line_type,
2100     p_ship_to_account_id               => l_est_detail_rec.ship_to_account_id,
2101     p_invoice_to_account_id            => l_est_detail_rec.bill_to_account_id,
2102     p_ship_to_contact_id               => l_est_detail_rec.ship_to_contact_id,
2103     p_bill_to_contact_id               => l_est_detail_rec.bill_to_contact_id,
2104     p_list_price                       => l_est_detail_rec.list_price,
2105     p_activity_start_date_time         => l_est_detail_rec.activity_start_time,
2106     p_activity_end_date_time           => l_est_detail_rec.activity_end_time,
2107     p_contract_discount_amount         => l_est_detail_rec.contract_discount_amount,
2108     p_bill_to_party_id                 => l_est_detail_rec.bill_to_party_id,
2109     p_ship_to_party_id                 => l_est_detail_rec.ship_to_party_id,
2110     p_pricing_context                  => l_est_detail_rec.pricing_context,
2111     p_pricing_attribute1               => l_est_detail_rec.pricing_attribute1,
2112     p_pricing_attribute2               => l_est_detail_rec.pricing_attribute2,
2113     p_pricing_attribute3               => l_est_detail_rec.pricing_attribute3,
2114     p_pricing_attribute4               => l_est_detail_rec.pricing_attribute4,
2115     p_pricing_attribute5               => l_est_detail_rec.pricing_attribute5,
2116     p_pricing_attribute6               => l_est_detail_rec.pricing_attribute6,
2117     p_pricing_attribute7               => l_est_detail_rec.pricing_attribute7,
2118     p_pricing_attribute8               => l_est_detail_rec.pricing_attribute8,
2119     p_pricing_attribute9               => l_est_detail_rec.pricing_attribute9,
2120     p_pricing_attribute10              => l_est_detail_rec.pricing_attribute10,
2121     p_pricing_attribute11              => l_est_detail_rec.pricing_attribute11,
2122     p_pricing_attribute12              => l_est_detail_rec.pricing_attribute12,
2123     p_pricing_attribute13              => l_est_detail_rec.pricing_attribute13,
2124     p_pricing_attribute14              => l_est_detail_rec.pricing_attribute14,
2125     p_pricing_attribute15              => l_est_detail_rec.pricing_attribute15,
2126     p_pricing_attribute16              => l_est_detail_rec.pricing_attribute16,
2127     p_pricing_attribute17              => l_est_detail_rec.pricing_attribute17,
2128     p_pricing_attribute18              => l_est_detail_rec.pricing_attribute18,
2129     p_pricing_attribute19              => l_est_detail_rec.pricing_attribute19,
2130     p_pricing_attribute20              => l_est_detail_rec.pricing_attribute20,
2131     p_pricing_attribute21              => l_est_detail_rec.pricing_attribute21,
2132     p_pricing_attribute22              => l_est_detail_rec.pricing_attribute22,
2133     p_pricing_attribute23              => l_est_detail_rec.pricing_attribute23,
2134     p_pricing_attribute24              => l_est_detail_rec.pricing_attribute24,
2135     p_pricing_attribute25              => l_est_detail_rec.pricing_attribute25,
2136     p_pricing_attribute26              => l_est_detail_rec.pricing_attribute26,
2137     p_pricing_attribute27              => l_est_detail_rec.pricing_attribute27,
2138     p_pricing_attribute28              => l_est_detail_rec.pricing_attribute28,
2139     p_pricing_attribute29              => l_est_detail_rec.pricing_attribute29,
2140     p_pricing_attribute30              => l_est_detail_rec.pricing_attribute30,
2141     p_pricing_attribute31              => l_est_detail_rec.pricing_attribute31,
2142     p_pricing_attribute32              => l_est_detail_rec.pricing_attribute32,
2143     p_pricing_attribute33              => l_est_detail_rec.pricing_attribute33,
2144     p_pricing_attribute34              => l_est_detail_rec.pricing_attribute34,
2145     p_pricing_attribute35              => l_est_detail_rec.pricing_attribute35,
2146     p_pricing_attribute36              => l_est_detail_rec.pricing_attribute36,
2147     p_pricing_attribute37              => l_est_detail_rec.pricing_attribute37,
2148     p_pricing_attribute38              => l_est_detail_rec.pricing_attribute38,
2149     p_pricing_attribute39              => l_est_detail_rec.pricing_attribute39,
2150     p_pricing_attribute40              => l_est_detail_rec.pricing_attribute40,
2151     p_pricing_attribute41              => l_est_detail_rec.pricing_attribute41,
2152     p_pricing_attribute42              => l_est_detail_rec.pricing_attribute42,
2153     p_pricing_attribute43              => l_est_detail_rec.pricing_attribute43,
2154     p_pricing_attribute44              => l_est_detail_rec.pricing_attribute44,
2155     p_pricing_attribute45              => l_est_detail_rec.pricing_attribute45,
2156     p_pricing_attribute46              => l_est_detail_rec.pricing_attribute46,
2157     p_pricing_attribute47              => l_est_detail_rec.pricing_attribute47,
2158     p_pricing_attribute48              => l_est_detail_rec.pricing_attribute48,
2159     p_pricing_attribute49              => l_est_detail_rec.pricing_attribute49,
2160     p_pricing_attribute50              => l_est_detail_rec.pricing_attribute50,
2161     p_pricing_attribute51              => l_est_detail_rec.pricing_attribute51,
2162     p_pricing_attribute52              => l_est_detail_rec.pricing_attribute52,
2163     p_pricing_attribute53              => l_est_detail_rec.pricing_attribute53,
2164     p_pricing_attribute54              => l_est_detail_rec.pricing_attribute54,
2165     p_pricing_attribute55              => l_est_detail_rec.pricing_attribute55,
2166     p_pricing_attribute56              => l_est_detail_rec.pricing_attribute56,
2167     p_pricing_attribute57              => l_est_detail_rec.pricing_attribute57,
2168     p_pricing_attribute58              => l_est_detail_rec.pricing_attribute58,
2169     p_pricing_attribute59              => l_est_detail_rec.pricing_attribute59,
2170     p_pricing_attribute60              => l_est_detail_rec.pricing_attribute60,
2171     p_pricing_attribute61              => l_est_detail_rec.pricing_attribute61,
2172     p_pricing_attribute62              => l_est_detail_rec.pricing_attribute62,
2173     p_pricing_attribute63              => l_est_detail_rec.pricing_attribute63,
2174     p_pricing_attribute64              => l_est_detail_rec.pricing_attribute64,
2175     p_pricing_attribute65              => l_est_detail_rec.pricing_attribute65,
2176     p_pricing_attribute66              => l_est_detail_rec.pricing_attribute66,
2177     p_pricing_attribute67              => l_est_detail_rec.pricing_attribute67,
2178     p_pricing_attribute68              => l_est_detail_rec.pricing_attribute68,
2179     p_pricing_attribute69              => l_est_detail_rec.pricing_attribute69,
2180     p_pricing_attribute70              => l_est_detail_rec.pricing_attribute70,
2181     p_pricing_attribute71              => l_est_detail_rec.pricing_attribute71,
2182     p_pricing_attribute72              => l_est_detail_rec.pricing_attribute72,
2183     p_pricing_attribute73              => l_est_detail_rec.pricing_attribute73,
2184     p_pricing_attribute74              => l_est_detail_rec.pricing_attribute74,
2185     p_pricing_attribute75              => l_est_detail_rec.pricing_attribute75,
2186     p_pricing_attribute76              => l_est_detail_rec.pricing_attribute76,
2187     p_pricing_attribute77              => l_est_detail_rec.pricing_attribute77,
2188     p_pricing_attribute78              => l_est_detail_rec.pricing_attribute78,
2189     p_pricing_attribute79              => l_est_detail_rec.pricing_attribute79,
2190     p_pricing_attribute80              => l_est_detail_rec.pricing_attribute80,
2191     p_pricing_attribute81              => l_est_detail_rec.pricing_attribute81,
2192     p_pricing_attribute82              => l_est_detail_rec.pricing_attribute82,
2193     p_pricing_attribute83              => l_est_detail_rec.pricing_attribute83,
2194     p_pricing_attribute84              => l_est_detail_rec.pricing_attribute84,
2195     p_pricing_attribute85              => l_est_detail_rec.pricing_attribute85,
2196     p_pricing_attribute86              => l_est_detail_rec.pricing_attribute86,
2197     p_pricing_attribute87              => l_est_detail_rec.pricing_attribute87,
2198     p_pricing_attribute88              => l_est_detail_rec.pricing_attribute88,
2199     p_pricing_attribute89              => l_est_detail_rec.pricing_attribute89,
2200     p_pricing_attribute90              => l_est_detail_rec.pricing_attribute90,
2201     p_pricing_attribute91              => l_est_detail_rec.pricing_attribute91,
2202     p_pricing_attribute92              => l_est_detail_rec.pricing_attribute92,
2203     p_pricing_attribute93              => l_est_detail_rec.pricing_attribute93,
2204     p_pricing_attribute94              => l_est_detail_rec.pricing_attribute94,
2205     p_pricing_attribute95              => l_est_detail_rec.pricing_attribute95,
2206     p_pricing_attribute96              => l_est_detail_rec.pricing_attribute96,
2207     p_pricing_attribute97              => l_est_detail_rec.pricing_attribute97,
2208     p_pricing_attribute98              => l_est_detail_rec.pricing_attribute98,
2209     p_pricing_attribute99              => l_est_detail_rec.pricing_attribute99,
2210     p_pricing_attribute100             => l_est_detail_rec.pricing_attribute100,
2211     p_attribute1                       => l_est_detail_rec.attribute1,
2212     p_attribute2                       => l_est_detail_rec.attribute2,
2213     p_attribute3                       => l_est_detail_rec.attribute3,
2214     p_attribute4                       => l_est_detail_rec.attribute4,
2215     p_attribute5                       => l_est_detail_rec.attribute5,
2216     p_attribute6                       => l_est_detail_rec.attribute6,
2217     p_attribute7                       => l_est_detail_rec.attribute7,
2218     p_attribute8                       => l_est_detail_rec.attribute8,
2219     p_attribute9                       => l_est_detail_rec.attribute9,
2220     p_attribute10                      => l_est_detail_rec.attribute10,
2221     p_attribute11                      => l_est_detail_rec.attribute11,
2222     p_attribute12                      => l_est_detail_rec.attribute12,
2223     p_attribute13                      => l_est_detail_rec.attribute13,
2224     p_attribute14                      => l_est_detail_rec.attribute14,
2225     p_attribute15                      => l_est_detail_rec.attribute15,
2226     p_context                          => l_est_detail_rec.context,
2227     p_coverage_bill_rate_id            => l_est_detail_rec.coverage_bill_rate_id,
2228     p_coverage_billing_type_id         => null,
2229     p_txn_billing_type_id              => l_est_detail_rec.txn_billing_type_id,
2230     p_submit_restriction_message       => l_est_detail_rec.submit_restriction_message,
2231     p_submit_error_message             => l_est_detail_rec.submit_error_message,
2232     p_submit_from_system               => l_est_detail_rec.submit_from_system,
2233     p_line_submitted                   => nvl(l_est_detail_rec.line_submitted_flag, 'N'),
2234     p_last_update_date                 => sysdate,
2235     --p_last_update_login              => p_user_id,
2236     p_last_update_login                => p_login_id,
2237     p_last_updated_by                  => p_user_id,
2238     p_creation_date                    => sysdate,
2239     p_created_by                       => p_user_id,
2240     p_estimate_detail_id               => l_ed_id,
2241     /* Credit Card 9358401 */
2242     p_instrument_payment_use_id        => l_est_detail_rec.instrument_payment_use_id,
2243     -- Charges Logistics Project
2244     p_shipping_method                  => l_est_detail_rec.shipping_method,
2245     p_arrival_date_time                => l_est_detail_rec.arrival_date_time,
2246     p_return_type		       => l_est_detail_rec.return_type,
2247     p_parent_instance_id	       => l_est_detail_rec.parent_instance_id,
2248     -- Charges MED Project
2249     p_shipping_distance	               => l_est_detail_rec.distance,
2250     p_need_by_date                     => l_est_detail_rec.need_by_date,
2251     --12.2.2 Service Projects Integration (below 3 params)
2252     p_project_id                       =>  l_est_detail_rec.project_id,
2253     p_project_task_id                  =>  l_est_detail_rec.project_task_id,
2254     p_expenditure_org_id               =>  l_est_detail_rec.expenditure_org_id,
2255     x_object_version_number            => x_object_version_number );
2256 
2257   --DBMS_OUTPUT.PUT_LINE('Back from CS_ESTIMATE_DETAILS_PKG.INSERT_ROW. OVN '||x_object_version_number);
2258 
2259   -- hint: primary key should be returned.
2260   -- x_estimate_detail_id := x_estimate_detail_id;
2261 
2262   x_estimate_detail_id      := l_ed_id ;
2263   x_line_number             := nvl(l_line_num,1) ;
2264 
2265 
2266   -- Make the postprocessing call to the user hooks
2267   --
2268   -- Post call to the customer type user hook
2269   --
2270   IF jtf_usr_hks.Ok_To_Execute('CS_CHARGE_DETAILS_PVT',
2271  			       'Create_Charge_Details',
2272 			       'A','C') THEN
2273 
2274     CS_CHARGE_DETAILS_CUHK.Create_Charge_Details_Post(
2275 		p_api_version      	   => l_api_version,
2276 		p_init_msg_list    	   => FND_API.G_FALSE,
2277 		p_commit           	   => p_commit,
2278 		p_validation_level 	   => p_validation_level,
2279 		x_return_status    	   => l_return_status,
2280 		x_msg_count       	   => x_msg_count,
2281 		x_object_version_number    => x_object_version_number,
2282                 x_estimate_detail_id       => l_ed_id,
2283                 x_line_number              => l_line_num,
2284 		x_msg_data         	   => x_msg_data,
2285 		p_resp_appl_id    	   => p_resp_appl_id,
2286 		p_resp_id          	   => p_resp_id,
2287     	        p_user_id          	   => p_user_id,
2288 		p_login_id         	   => p_login_id,
2289                 p_transaction_control      => p_transaction_control,
2290 		p_est_detail_rec           => p_est_detail_rec);
2291 
2292 
2293     IF (l_return_status <> FND_API.G_RET_STS_SUCCESS) THEN
2294       FND_MESSAGE.Set_Name('CS', 'CS_API_CHG_ERR_PST_CUST_USR_HK');
2295       FND_MESSAGE.Set_Token('API_NAME', l_api_name_full);
2296       FND_MSG_PUB.Add;
2297 
2298       RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
2299     END IF;
2300 
2301   END IF;
2302   --
2303   --
2304   -- Post call to the Vertical Type User Hook
2305   --
2306   IF jtf_usr_hks.Ok_To_Execute('CS_CHARGE_DETAILS_PVT',
2307                                'Create_Charge_Details',
2308                                'A', 'V')  THEN
2309 
2310     CS_CHARGE_DETAILS_VUHK.Create_Charge_Details_Post(
2311 		p_api_version      	   => l_api_version,
2312 		p_init_msg_list    	   => FND_API.G_FALSE,
2313 		p_commit           	   => p_commit,
2314 		p_validation_level 	   => p_validation_level,
2315 		x_return_status    	   => l_return_status,
2316 		x_msg_count       	   => x_msg_count,
2317 		x_object_version_number    => x_object_version_number,
2318        	        x_estimate_detail_id       => l_ed_id,
2319        	        x_line_number              => l_line_num,
2320 		x_msg_data         	   => x_msg_data,
2321 		p_resp_appl_id    	   => p_resp_appl_id,
2322 		p_resp_id          	   => p_resp_id,
2323     		p_user_id          	   => p_user_id,
2324 		p_login_id         	   => p_login_id,
2325        	        p_transaction_control      => p_transaction_control,
2326 		p_est_detail_rec           => p_est_detail_rec);
2327 
2328 
2329     IF (l_return_status <> FND_API.G_RET_STS_SUCCESS) THEN
2330       FND_MESSAGE.Set_Name('CS', 'CS_API_CHG_ERR_PST_VERT_USR_HK');
2331       FND_MESSAGE.Set_Token('API_NAME', l_api_name_full);
2332       FND_MSG_PUB.Add;
2333       RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
2334     END IF;
2335   END IF;
2336 
2337 
2338   -- Standard check of p_commit
2339   IF FND_API.To_Boolean(p_commit) THEN
2340     COMMIT WORK;
2341   END IF;
2342 
2343   FND_MSG_PUB.Count_And_Get
2344     ( p_count => x_msg_count,
2345       p_data  => x_msg_data,
2346       p_encoded => FND_API.G_FALSE) ;
2347 
2348   EXCEPTION
2349 
2350     WHEN FND_API.G_EXC_ERROR THEN
2351 
2352       IF FND_API.To_Boolean(p_transaction_control) THEN
2353         ROLLBACK TO Create_Charge_Details_PVT;
2354       END IF ;
2355 
2356 
2357       FND_MSG_PUB.Count_And_Get(p_count    => x_msg_count,
2358                                 p_data     => x_msg_data,
2359                                 p_encoded  => FND_API.G_FALSE) ;
2360 
2361 
2362       x_return_status := FND_API.G_RET_STS_ERROR;
2363 
2364 
2365 
2366       WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
2367 
2368       IF FND_API.To_Boolean(p_transaction_control) THEN
2369         ROLLBACK TO Create_Charge_Details_PVT;
2370       END IF ;
2371 
2372       x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
2373 
2374       FND_MSG_PUB.Count_And_Get(p_count => x_msg_count,
2375                               p_data    => x_msg_data,
2376                               p_encoded => FND_API.G_FALSE) ;
2377       WHEN OTHERS THEN
2378       --l_errm := SQLERRM;
2379       --DBMS_OUTPUT.PUT_LINE('OTHERS inside CREATE_CHARGE_DETAILS '||l_errm);
2380 
2381       IF FND_API.To_Boolean(p_transaction_control) THEN
2382         ROLLBACK TO Create_Charge_Details_PVT;
2383       END IF ;
2384 
2385       x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
2386 
2387       IF FND_MSG_PUB.Check_Msg_Level(FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR) THEN
2388         FND_MSG_PUB.Add_Exc_Msg(G_PKG_NAME, l_api_name);
2389       END IF;
2390 
2391       FND_MSG_PUB.Count_And_Get(p_count   => x_msg_count,
2392                                 p_data    => x_msg_data,
2393                                 p_encoded => FND_API.G_FALSE) ;
2394 
2395 END Create_Charge_Details;
2396 
2397 
2398 --=====================================================
2399 --API to Update Charge Details into CS_ESTIMATE_DETAILS
2400 --=====================================================
2401 
2402 PROCEDURE Update_Charge_Details(
2403         p_api_version           IN         NUMBER,
2404         p_init_msg_list         IN         VARCHAR2          := FND_API.G_FALSE,
2405         p_commit                IN         VARCHAR2          := FND_API.G_FALSE,
2406         p_validation_level      IN         NUMBER            := FND_API.G_VALID_LEVEL_FULL,
2407         x_return_status         OUT NOCOPY VARCHAR2,
2408         x_msg_count             OUT NOCOPY NUMBER,
2409         x_object_version_number OUT NOCOPY NUMBER,
2410         x_msg_data              OUT NOCOPY VARCHAR2,
2411       --p_resp_appl_id          IN         NUMBER            := NULL,
2412       --p_resp_id               IN         NUMBER            := NULL,
2413       --p_user_id               IN         NUMBER            := NULL,
2414         p_resp_appl_id          IN         NUMBER            := FND_GLOBAL.RESP_APPL_ID,
2415         p_resp_id               IN         NUMBER            := FND_GLOBAL.RESP_ID,
2416         p_user_id               IN         NUMBER            := FND_GLOBAL.USER_ID,
2417         p_login_id              IN         NUMBER            := NULL,
2418         p_transaction_control   IN         VARCHAR2          := FND_API.G_TRUE,
2419         p_est_detail_rec        IN         CS_Charge_Details_PUB.Charges_Rec_Type
2420                 ) IS
2421 
2422 l_api_version                     NUMBER                 :=  1.0 ;
2423 l_api_name                        VARCHAR2(30)           := 'Update_Charge_Details' ;
2424 l_api_name_full                   VARCHAR2(100)           :=  G_PKG_NAME || '.' || l_api_name ;
2425 l_log_module            CONSTANT  VARCHAR2(255)          := 'cs.plsql.' || l_api_name_full || '.';
2426 l_return_status                   VARCHAR2(1) ;
2427 
2428 l_line_num                        NUMBER                 :=  1 ;
2429 l_ed_id                           NUMBER ;
2430 l_org_id                          NUMBER ;
2431 l_est_detail_rec                  CS_Charge_Details_PUB.Charges_Rec_Type;
2432 
2433 l_prog_name CONSTANT VARCHAR2(61) := G_PKG_NAME||'.'||'update_charge_details';
2434 
2435 BEGIN
2436 
2437   --DBMS_OUTPUT.PUT_LINE('Updating Charge Details');
2438 
2439   -- Standard start of API savepoint
2440   IF FND_API.To_Boolean(p_transaction_control) THEN
2441     SAVEPOINT Update_Charge_Details_PVT;
2442   END IF ;
2443 
2444   -- Standard call to check for call compatibility
2445   IF NOT FND_API.Compatible_API_Call(l_api_version, p_api_version, l_api_name,
2446      G_PKG_NAME) THEN
2447     RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
2448   END IF;
2449 
2450   -- Initialize message list if p_init_msg_list is set to TRUE
2451   IF FND_API.To_Boolean(p_init_msg_list) THEN
2452     FND_MSG_PUB.Initialize;
2453   END IF;
2454 
2455   -- Initialize API return status to success
2456   x_return_status := FND_API.G_RET_STS_SUCCESS;
2457 
2458 ----------------------- FND Logging -----------------------------------
2459   IF FND_LOG.level_procedure >= FND_LOG.g_current_runtime_level
2460   THEN
2461     FND_LOG.String
2462     ( FND_LOG.level_procedure , L_LOG_MODULE || 'start'
2463     , 'Inside ' || L_API_NAME_FULL || ', called with parameters below:'
2464     );
2465     FND_LOG.String
2466     ( FND_LOG.level_procedure , L_LOG_MODULE || ''
2467     , 'p_api_version:' || p_api_version
2468     );
2469     FND_LOG.String
2470     ( FND_LOG.level_procedure , L_LOG_MODULE || ''
2471     , 'p_init_msg_list:' || p_init_msg_list
2472     );
2473     FND_LOG.String
2474     ( FND_LOG.level_procedure , L_LOG_MODULE || ''
2475     , 'p_commit:' || p_commit
2476     );
2477     FND_LOG.String
2478     ( FND_LOG.level_procedure , L_LOG_MODULE || ''
2479     , 'p_validation_level:' || p_validation_level
2480     );
2481     FND_LOG.String
2482     ( FND_LOG.level_procedure , L_LOG_MODULE || ''
2483     , 'p_resp_appl_id:' || p_resp_appl_id
2484     );
2485     FND_LOG.String
2486     ( FND_LOG.level_procedure , L_LOG_MODULE || ''
2487     , 'p_resp_id:' || p_resp_id
2488     );
2489     FND_LOG.String
2490     ( FND_LOG.level_procedure , L_LOG_MODULE || ''
2491     , 'p_user_id:' || p_user_id
2492     );
2493     FND_LOG.String
2494     ( FND_LOG.level_procedure , L_LOG_MODULE || ''
2495     , 'p_login_id:' || p_login_id
2496     );
2497     FND_LOG.String
2498     ( FND_LOG.level_procedure , L_LOG_MODULE || ''
2499     , 'p_transaction_control:' || p_transaction_control
2500     );
2501 
2502  -- --------------------------------------------------------------------------
2503  -- This procedure Logs the charges record paramters.
2504  -- --------------------------------------------------------------------------
2505     CS_Charge_Details_PUB.Log_Charges_Rec_Parameters
2506     ( p_Charges_Rec             =>  p_est_detail_rec
2507     );
2508 
2509   END IF;
2510 
2511   -- Make the preprocessing call to the user hooks
2512   --
2513   -- Pre call to the customer type user hook
2514   --
2515   IF jtf_usr_hks.Ok_To_Execute('CS_CHARGE_DETAILS_PVT',
2516                                'Update_Charge_Details',
2517                                'B','C') THEN
2518 
2519     CS_CHARGE_DETAILS_CUHK.Update_Charge_Details_Pre(
2520                   p_api_version              => l_api_version,
2521                   p_init_msg_list            => FND_API.G_FALSE,
2522                   p_commit                   => p_commit,
2523                   p_validation_level         => p_validation_level,
2524                   x_return_status            => l_return_status,
2525                   x_msg_count                => x_msg_count,
2526                   x_object_version_number    => x_object_version_number,
2527                   x_estimate_detail_id       => l_ed_id,
2528                   x_msg_data                 => x_msg_data,
2529                   p_resp_appl_id             => p_resp_appl_id,
2530                   p_resp_id                  => p_resp_id,
2531                   p_user_id                  => p_user_id,
2532                   p_login_id                 => p_login_id,
2533                   p_transaction_control      => p_transaction_control,
2534                   p_est_detail_rec           => p_est_detail_rec);
2535 
2536     IF (l_return_status <> FND_API.G_RET_STS_SUCCESS) THEN
2537       FND_MESSAGE.Set_Name('CS', 'CS_API_CHG_ERR_PRE_CUST_USR_HK');
2538       FND_MESSAGE.Set_Token('API_NAME', l_api_name_full);
2539       FND_MSG_PUB.Add;
2540       RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
2541     END IF;
2542 
2543   END IF;
2544   --
2545   --
2546   -- Pre call to the Vertical Type User Hook
2547   --
2548   IF jtf_usr_hks.Ok_To_Execute('CS_CHARGE_DETAILS_PVT',
2549                                'Update_Charge_Details',
2550                                'B', 'V')  THEN
2551 
2552     CS_CHARGE_DETAILS_VUHK.Update_Charge_Details_Pre(
2553                 p_api_version              => l_api_version,
2554                 p_init_msg_list            => FND_API.G_FALSE,
2555                 p_commit                   => p_commit,
2556                 p_validation_level         => p_validation_level,
2557                 x_return_status            => l_return_status,
2558                 x_msg_count                => x_msg_count,
2559                 x_object_version_number    => x_object_version_number,
2560                 x_estimate_detail_id       => l_ed_id,
2561                 x_msg_data                 => x_msg_data,
2562                 p_resp_appl_id             => p_resp_appl_id,
2563                 p_resp_id                  => p_resp_id,
2564                 p_user_id                  => p_user_id,
2565                 p_login_id                 => p_login_id,
2566                 p_transaction_control      => p_transaction_control,
2567                 p_est_detail_rec           => p_est_detail_rec);
2568 
2569     IF (l_return_status <> FND_API.G_RET_STS_SUCCESS) THEN
2570       FND_MESSAGE.Set_Name('CS', 'CS_API_CHG_ERR_PRE_VERT_USR_HK');
2571       FND_MESSAGE.Set_Token('API_NAME', l_api_name_full);
2572       FND_MSG_PUB.Add;
2573       RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
2574     END IF;
2575 
2576   END IF;
2577 
2578   -- ----------------------------------------------------------------------
2579   -- Apply business-rule validation to all required and passed parameters
2580   -- if validation level is set.
2581   -- ----------------------------------------------------------------------
2582   IF (p_validation_level > FND_API.G_VALID_LEVEL_NONE) THEN
2583 
2584     --  Validate the user and login ids
2585 
2586     Validate_Who_Info ( p_api_name             => l_api_name_full,
2587                         p_user_id              => NVL(p_user_id, -1),
2588                         p_login_id             => p_login_id,
2589                         x_return_status        => l_return_status);
2590 
2591     IF (l_return_status <> FND_API.G_RET_STS_SUCCESS) THEN
2592       RAISE FND_API.G_EXC_ERROR;
2593     END IF;
2594 
2595     --DBMS_OUTPUT.PUT_LINE('validating charge details');
2596 
2597     -- Validate the Charge Detail Record that is passed in by the Upstream Module
2598     VALIDATE_CHARGE_DETAILS(p_api_name           => l_api_name,
2599                             p_charges_detail_rec => p_est_detail_rec,
2600                             p_validation_mode    => 'U',
2601                             p_user_id            => p_user_id,
2602                             p_login_id           => p_login_id,
2603                             x_charges_detail_rec => l_est_detail_rec,
2604                             x_msg_data           => x_msg_data,
2605                             x_msg_count          => x_msg_count,
2606                             x_return_status      => l_return_status);
2607 
2608     IF l_return_status <> FND_API.G_RET_STS_SUCCESS THEN
2609       FND_MESSAGE.Set_Name('CS', 'CS_CHG_VALIDATE_CHRG_DETAIL_ER');
2610       FND_MESSAGE.Set_Token('API_NAME', l_api_name_full);
2611       FND_MSG_PUB.Add;
2612       RAISE FND_API.G_EXC_ERROR;
2613     END IF;
2614 
2615    --Fixed Bug # 3795144
2616    ELSE
2617     --p_validation_level = FND_API.G_VALID_LEVEL_NONE
2618     IF (p_validation_level = FND_API.G_VALID_LEVEL_NONE) THEN
2619       --populate the l_est_detail_rec record
2620       l_est_detail_rec := p_est_detail_rec;
2621     END IF;
2622    END IF ;
2623 
2624   --DBMS_OUTPUT.PUT_LINE('Calling CS_ESTIMATE_DETAILS_PKG.UPDATE_ROW');
2625   --DBMS_OUTPUT.PUT_LINE('l_est_detail_rec.org_id = '||l_est_detail_rec.org_id);
2626   --DBMS_OUTPUT.PUT_LINE('l_est_detail_rec.incident_id = '||l_est_detail_rec.incident_id);
2627   --DBMS_OUTPUT.PUT_LINE('l_est_detail_rec.original_source_id = '||l_est_detail_rec.original_source_id);
2628   --DBMS_OUTPUT.PUT_LINE('l_est_detail_rec.original_source_code = '||l_est_detail_rec.original_source_code);
2629   --DBMS_OUTPUT.PUT_LINE('l_est_detail_rec.source_id = '||l_est_detail_rec.source_id);
2630   --DBMS_OUTPUT.PUT_LINE('l_est_detail_rec.source_code = '||l_est_detail_rec.source_code);
2631   --DBMS_OUTPUT.PUT_LINE('l_est_detail_rec.contract_id = '||l_est_detail_rec.contract_id);
2632   --DBMS_OUTPUT.PUT_LINE('l_est_detail_rec.coverage_id = '||l_est_detail_rec.coverage_id);
2633   --DBMS_OUTPUT.PUT_LINE('l_est_detail_rec.coverage_txn_group_id = '||l_est_detail_rec.coverage_txn_group_id);
2634   --DBMS_OUTPUT.PUT_LINE('l_EST_DETAIL_rec.currency_code = '||l_EST_DETAIL_rec.currency_code);
2635   --DBMS_OUTPUT.PUT_LINE('l_EST_DETAIL_rec.conversion_rate = '||l_EST_DETAIL_rec.conversion_rate);
2636   --DBMS_OUTPUT.PUT_LINE('l_EST_DETAIL_rec.conversion_rate_date = '||l_EST_DETAIL_rec.conversion_rate_date);
2637   --DBMS_OUTPUT.PUT_LINE('l_EST_DETAIL_rec.conversion_type_code = '||l_EST_DETAIL_rec.conversion_type_code);
2638   --DBMS_OUTPUT.PUT_LINE('l_est_detail_rec.invoice_to_org_id = '||l_est_detail_rec.invoice_to_org_id);
2639   --DBMS_OUTPUT.PUT_LINE('l_est_detail_rec.ship_to_org_id = '||l_est_detail_rec.ship_to_org_id);
2640   --DBMS_OUTPUT.PUT_LINE('l_est_detail_rec.purchase_order_num = '||l_est_detail_rec.purchase_order_num);
2641   --DBMS_OUTPUT.PUT_LINE('l_est_detail_rec.order_line_id = '||l_est_detail_rec.order_line_id);
2642   --DBMS_OUTPUT.PUT_LINE('l_est_detail_rec.line_type_id = '||l_est_detail_rec.line_type_id);
2643   --DBMS_OUTPUT.PUT_LINE('l_EST_DETAIL_rec.LINE_CATEGORY_CODE = '||l_EST_DETAIL_rec.LINE_CATEGORY_CODE);
2644   --DBMS_OUTPUT.PUT_LINE('l_est_detail_rec.price_list_id = '||l_est_detail_rec.price_list_id);
2645   --DBMS_OUTPUT.PUT_LINE('l_line_num = '||l_line_num);
2646   --DBMS_OUTPUT.PUT_LINE('l_est_detail_rec.inventory_item_id_in = '||l_est_detail_rec.inventory_item_id_in);
2647   --DBMS_OUTPUT.PUT_LINE('l_est_detail_rec.item_revision = '||l_est_detail_rec.item_revision);
2648   --DBMS_OUTPUT.PUT_LINE('l_EST_DETAIL_rec.SERIAL_NUMBER = '||l_EST_DETAIL_rec.SERIAL_NUMBER);
2649   --DBMS_OUTPUT.PUT_LINE('l_est_detail_rec.quantity_required = '||l_est_detail_rec.quantity_required);
2650   --DBMS_OUTPUT.PUT_LINE('l_est_detail_rec.unit_of_measure_code = '||l_est_detail_rec.unit_of_measure_code);
2651   --DBMS_OUTPUT.PUT_LINE('l_est_detail_rec.selling_price = '||l_est_detail_rec.selling_price);
2652   --DBMS_OUTPUT.PUT_LINE('l_est_detail_rec.after_warranty_cost = '||l_est_detail_rec.after_warranty_cost);
2653   --DBMS_OUTPUT.PUT_LINE('l_est_detail_rec.business_process_id = '||l_est_detail_rec.business_process_id);
2654   --DBMS_OUTPUT.PUT_LINE('l_est_detail_rec.transaction_type_id = '||l_est_detail_rec.transaction_type_id);
2655   --DBMS_OUTPUT.PUT_LINE('l_est_detail_rec.customer_product_id = '||l_est_detail_rec.customer_product_id);
2656   --DBMS_OUTPUT.PUT_LINE('l_est_detail_rec.order_header_id = '||l_est_detail_rec.order_header_id);
2657   --DBMS_OUTPUT.PUT_LINE('l_est_detail_rec.installed_cp_return_by_date = '||l_est_detail_rec.installed_cp_return_by_date);
2658   --DBMS_OUTPUT.PUT_LINE('l_est_detail_rec.new_cp_return_by_date = '||l_est_detail_rec.new_cp_return_by_date);
2659   --DBMS_OUTPUT.PUT_LINE('l_est_detail_rec.interface_to_oe_flag = '||l_est_detail_rec.interface_to_oe_flag);
2660   --DBMS_OUTPUT.PUT_LINE('l_est_detail_rec.rollup_flag = '||l_est_detail_rec.rollup_flag);
2661   --DBMS_OUTPUT.PUT_LINE('l_est_detail_rec.no_charge_flag = '||l_est_detail_rec.no_charge_flag);
2662   --DBMS_OUTPUT.PUT_LINE('l_est_detail_rec.add_to_order_flag = '||l_est_detail_rec.add_to_order_flag);
2663   --DBMS_OUTPUT.PUT_LINE('l_est_detail_rec.return_reason_code = '||l_est_detail_rec.return_reason_code);
2664   --DBMS_OUTPUT.PUT_LINE('l_est_detail_rec.generated_by_bca_engine = '||l_est_detail_rec.generated_by_bca_engine);
2665   --DBMS_OUTPUT.PUT_LINE('l_est_detail_rec.transaction_inventory_org = '||l_est_detail_rec.transaction_inventory_org);
2666   --DBMS_OUTPUT.PUT_LINE('l_est_detail_rec.transaction_sub_inventory = '||l_est_detail_rec.transaction_sub_inventory);
2667   --DBMS_OUTPUT.PUT_LINE('l_est_detail_rec.charge_line_type = '||l_est_detail_rec.charge_line_type);
2668   --DBMS_OUTPUT.PUT_LINE('l_est_detail_rec.ship_to_account_id = '||l_est_detail_rec.ship_to_account_id);
2669   --DBMS_OUTPUT.PUT_LINE('l_est_detail_rec.bill_to_account_id = '||l_est_detail_rec.bill_to_account_id);
2670   --DBMS_OUTPUT.PUT_LINE('l_est_detail_rec.ship_to_contact_id = '||l_est_detail_rec.ship_to_contact_id);
2671   --DBMS_OUTPUT.PUT_LINE('l_est_detail_rec.bill_to_contact_id = '||l_est_detail_rec.bill_to_contact_id);
2672   --DBMS_OUTPUT.PUT_LINE('l_est_detail_rec.list_price = '||l_est_detail_rec.list_price);
2673   --DBMS_OUTPUT.PUT_LINE('l_est_detail_rec.activity_start_time = '||TO_CHAR(l_est_detail_rec.activity_start_time, 'DD-MON-YYYY HH24:MI:SS'));
2674   --DBMS_OUTPUT.PUT_LINE('l_est_detail_rec.activity_end_time = '||TO_CHAR(l_est_detail_rec.activity_end_time, 'DD-MON-YYYY HH24:MI:SS'));
2675   --DBMS_OUTPUT.PUT_LINE('l_est_detail_rec.contract_discount_amount = '||l_est_detail_rec.contract_discount_amount);
2676   --DBMS_OUTPUT.PUT_LINE('l_est_detail_rec.bill_to_party_id = '||l_est_detail_rec.bill_to_party_id);
2677   --DBMS_OUTPUT.PUT_LINE('l_est_detail_rec.ship_to_party_id = '||l_est_detail_rec.ship_to_party_id);
2678   --DBMS_OUTPUT.PUT_LINE('l_est_detail_rec.coverage_bill_rate_id = '||l_est_detail_rec.coverage_bill_rate_id);
2679   --DBMS_OUTPUT.PUT_LINE('l_est_detail_rec.txn_billing_type_id = '||l_est_detail_rec.txn_billing_type_id);
2680   --DBMS_OUTPUT.PUT_LINE('p_login_id = '||p_login_id);
2681   --DBMS_OUTPUT.PUT_LINE('p_user_id = '||p_user_id);
2682   --DBMS_OUTPUT.PUT_LINE('p_user_id = '||p_user_id);
2683   --DBMS_OUTPUT.PUT_LINE('l_ed_id = '||l_ed_id);
2684   --DBMS_OUTPUT.PUT_LINE('Before  Update '||l_est_detail_rec.CONTRACT_ID);
2685 
2686   CS_ESTIMATE_DETAILS_PKG.Update_Row(
2687           x_object_version_number        => x_object_version_number,
2688           p_ESTIMATE_DETAIL_ID           => l_est_detail_rec.ESTIMATE_DETAIL_ID,
2689           p_ORG_ID                       => l_est_detail_rec.org_id,
2690           p_INCIDENT_ID                  => l_est_detail_rec.INCIDENT_ID,
2691           p_ORIGINAL_SOURCE_ID           => l_est_detail_rec.ORIGINAL_SOURCE_ID,
2692           p_ORIGINAL_SOURCE_CODE         => l_est_detail_rec.ORIGINAL_SOURCE_CODE,
2693           p_SOURCE_ID                    => l_est_detail_rec.SOURCE_ID,
2694           p_SOURCE_CODE                  => l_est_detail_rec.SOURCE_CODE,
2695           p_contract_line_id             => l_est_detail_rec.contract_line_id,
2696           p_rate_type_code               => l_est_detail_rec.rate_type_code,
2697           p_contract_id                  => l_est_detail_rec.CONTRACT_ID,
2698           p_coverage_id                  => null,
2699           p_coverage_txn_group_id        => null,
2700           --p_EXCEPTION_COVERAGE_USED    => l_est_detail_rec.EXCEPTION_COVERAGE_USED,
2701           p_CURRENCY_CODE                => l_est_detail_rec.currency_code,
2702           p_CONVERSION_RATE              => NULL,
2703           p_CONVERSION_TYPE_CODE         => NULL,
2704           p_CONVERSION_RATE_DATE         => NULL,
2705           p_INVOICE_TO_ORG_ID            => l_est_detail_rec.INVOICE_TO_ORG_ID,
2706           p_SHIP_TO_ORG_ID               => l_est_detail_rec.SHIP_TO_ORG_ID,
2707           p_PURCHASE_ORDER_NUM           => l_est_detail_rec.PURCHASE_ORDER_NUM,
2708           p_ORDER_LINE_ID                => l_est_detail_rec.ORDER_LINE_ID,
2709           p_LINE_TYPE_ID                 => l_est_detail_rec.LINE_TYPE_ID,
2710           p_LINE_CATEGORY_CODE           => l_est_detail_rec.LINE_CATEGORY_CODE,
2711           p_PRICE_LIST_HEADER_ID         => l_est_detail_rec.PRICE_LIST_ID,
2712           p_LINE_NUMBER                  => l_est_detail_rec.line_number,
2713           p_INVENTORY_ITEM_ID            => l_est_detail_rec.INVENTORY_ITEM_ID_in,
2714           p_ITEM_REVISION                => l_est_detail_rec.ITEM_REVISION,
2715           p_SERIAL_NUMBER                => l_est_detail_rec.SERIAL_NUMBER,
2716           p_QUANTITY_REQUIRED            => l_est_detail_rec.QUANTITY_REQUIRED,
2717           p_UNIT_OF_MEASURE_CODE         => l_est_detail_rec.UNIT_OF_MEASURE_CODE,
2718           p_SELLING_PRICE                => l_est_detail_rec.SELLING_PRICE,
2719           p_AFTER_WARRANTY_COST          => l_est_detail_rec.AFTER_WARRANTY_COST,
2720           --p_FUNC_CURR_AFT_WARR_COST    => l_est_detail_rec.FUNC_CURR_AFT_WARR_COST,
2721           p_BUSINESS_PROCESS_ID          => l_est_detail_rec.BUSINESS_PROCESS_ID,
2722           p_TRANSACTION_TYPE_ID          => l_est_detail_rec.TRANSACTION_TYPE_ID,
2723           p_CUSTOMER_PRODUCT_ID          => l_est_detail_rec.CUSTOMER_PRODUCT_ID,
2724           p_ORDER_HEADER_ID              => l_est_detail_rec.ORDER_HEADER_ID,
2725           p_INSTALLED_CP_RETURN_BY_DATE  => l_est_detail_rec.INSTALLED_CP_RETURN_BY_DATE,
2726           p_NEW_CP_RETURN_BY_DATE        => l_est_detail_rec.NEW_CP_RETURN_BY_DATE,
2727           p_INTERFACE_TO_OE_FLAG         => nvl(l_est_detail_rec.INTERFACE_TO_OE_FLAG, 'N'),
2728           p_ROLLUP_FLAG                  => nvl(l_est_detail_rec.ROLLUP_FLAG, 'N'),
2729           p_no_charge_flag               => nvl(l_est_detail_rec.NO_CHARGE_FLAG, 'N'),
2730           p_ADD_TO_ORDER_FLAG            => nvl(l_est_detail_rec.ADD_TO_ORDER_FLAG, 'N'),
2731           p_RETURN_REASON_CODE           => l_est_detail_rec.RETURN_REASON_CODE,
2732           p_GENERATED_BY_BCA_ENGINE_FLAG => nvl(l_est_detail_rec.GENERATED_BY_BCA_ENGINE, 'N'),
2733           p_TRANSACTION_INVENTORY_ORG    => l_est_detail_rec.TRANSACTION_INVENTORY_ORG,
2734           p_TRANSACTION_SUB_INVENTORY    => l_est_detail_rec.TRANSACTION_SUB_INVENTORY,
2735           p_CHARGE_LINE_TYPE             => l_est_detail_rec.CHARGE_LINE_TYPE,
2736           p_SHIP_TO_ACCOUNT_ID           => l_est_detail_rec.SHIP_TO_ACCOUNT_ID,
2737           p_INVOICE_TO_ACCOUNT_ID        => l_est_detail_rec.BILL_TO_ACCOUNT_ID,
2738           p_SHIP_TO_CONTACT_ID           => l_est_detail_rec.SHIP_TO_CONTACT_ID,
2739           p_BILL_TO_CONTACT_ID           => l_est_detail_rec.BILL_TO_CONTACT_ID,
2740           p_LIST_PRICE                   => l_est_detail_rec.LIST_PRICE,--mviswana
2741           p_ACTIVITY_START_DATE_TIME     => l_est_detail_rec.ACTIVITY_START_TIME,
2742           p_ACTIVITY_END_DATE_TIME       => l_est_detail_rec.ACTIVITY_END_TIME,
2743           p_CONTRACT_DISCOUNT_AMOUNT     => l_est_detail_rec.CONTRACT_DISCOUNT_AMOUNT,
2744           p_BILL_TO_PARTY_ID             => l_est_detail_rec.BILL_TO_PARTY_ID,
2745           p_SHIP_TO_PARTY_ID             => l_est_detail_rec.SHIP_TO_PARTY_ID,
2746           --p_tax_code                   => l_est_detail_rec.tax_code,
2747           --p_est_tax_amount             => l_est_detail_rec.est_tax_amount,
2748           p_PRICING_CONTEXT              => l_est_detail_rec.PRICING_CONTEXT,
2749           p_PRICING_ATTRIBUTE1           => l_est_detail_rec.PRICING_ATTRIBUTE1,
2750           p_PRICING_ATTRIBUTE2           => l_est_detail_rec.PRICING_ATTRIBUTE2,
2751           p_PRICING_ATTRIBUTE3           => l_est_detail_rec.PRICING_ATTRIBUTE3,
2752           p_PRICING_ATTRIBUTE4           => l_est_detail_rec.PRICING_ATTRIBUTE4,
2753           p_PRICING_ATTRIBUTE5           => l_est_detail_rec.PRICING_ATTRIBUTE5,
2754           p_PRICING_ATTRIBUTE6           => l_est_detail_rec.PRICING_ATTRIBUTE6,
2755           p_PRICING_ATTRIBUTE7           => l_est_detail_rec.PRICING_ATTRIBUTE7,
2756           p_PRICING_ATTRIBUTE8           => l_est_detail_rec.PRICING_ATTRIBUTE8,
2757           p_PRICING_ATTRIBUTE9           => l_est_detail_rec.PRICING_ATTRIBUTE9,
2758           p_PRICING_ATTRIBUTE10          => l_est_detail_rec.PRICING_ATTRIBUTE10,
2759           p_PRICING_ATTRIBUTE11          => l_est_detail_rec.PRICING_ATTRIBUTE11,
2760           p_PRICING_ATTRIBUTE12          => l_est_detail_rec.PRICING_ATTRIBUTE12,
2761           p_PRICING_ATTRIBUTE13          => l_est_detail_rec.PRICING_ATTRIBUTE13,
2762           p_PRICING_ATTRIBUTE14          => l_est_detail_rec.PRICING_ATTRIBUTE14,
2763           p_PRICING_ATTRIBUTE15          => l_est_detail_rec.PRICING_ATTRIBUTE15,
2764           p_PRICING_ATTRIBUTE16          => l_est_detail_rec.PRICING_ATTRIBUTE16,
2765           p_PRICING_ATTRIBUTE17          => l_est_detail_rec.PRICING_ATTRIBUTE17,
2766           p_PRICING_ATTRIBUTE18          => l_est_detail_rec.PRICING_ATTRIBUTE18,
2767           p_PRICING_ATTRIBUTE19          => l_est_detail_rec.PRICING_ATTRIBUTE19,
2768           p_PRICING_ATTRIBUTE20          => l_est_detail_rec.PRICING_ATTRIBUTE20,
2769           p_PRICING_ATTRIBUTE21          => l_est_detail_rec.PRICING_ATTRIBUTE21,
2770           p_PRICING_ATTRIBUTE22          => l_est_detail_rec.PRICING_ATTRIBUTE22,
2771           p_PRICING_ATTRIBUTE23          => l_est_detail_rec.PRICING_ATTRIBUTE23,
2772           p_PRICING_ATTRIBUTE24          => l_est_detail_rec.PRICING_ATTRIBUTE24,
2773           p_pricing_attribute25          => l_est_detail_rec.pricing_attribute25,
2774           p_pricing_attribute26          => l_est_detail_rec.pricing_attribute26,
2775           p_pricing_attribute27          => l_est_detail_rec.pricing_attribute27,
2776           p_pricing_attribute28          => l_est_detail_rec.pricing_attribute28,
2777           p_pricing_attribute29          => l_est_detail_rec.pricing_attribute29,
2778           p_pricing_attribute30          => l_est_detail_rec.pricing_attribute30,
2779           p_pricing_attribute31          => l_est_detail_rec.pricing_attribute31,
2780           p_pricing_attribute32          => l_est_detail_rec.pricing_attribute32,
2781           p_pricing_attribute33          => l_est_detail_rec.pricing_attribute33,
2782           p_pricing_attribute34          => l_est_detail_rec.pricing_attribute34,
2783           p_pricing_attribute35          => l_est_detail_rec.pricing_attribute35,
2784           p_pricing_attribute36          => l_est_detail_rec.pricing_attribute36,
2785           p_pricing_attribute37          => l_est_detail_rec.pricing_attribute37,
2786           p_pricing_attribute38          => l_est_detail_rec.pricing_attribute38,
2787           p_pricing_attribute39          => l_est_detail_rec.pricing_attribute39,
2788           p_pricing_attribute40          => l_est_detail_rec.pricing_attribute40,
2789           p_pricing_attribute41          => l_est_detail_rec.pricing_attribute41,
2790           p_pricing_attribute42          => l_est_detail_rec.pricing_attribute42,
2791           p_pricing_attribute43          => l_est_detail_rec.pricing_attribute43,
2792           p_pricing_attribute44          => l_est_detail_rec.pricing_attribute44,
2793           p_pricing_attribute45          => l_est_detail_rec.pricing_attribute45,
2794           p_pricing_attribute46          => l_est_detail_rec.pricing_attribute46,
2795           p_pricing_attribute47          => l_est_detail_rec.pricing_attribute47,
2796           p_pricing_attribute48          => l_est_detail_rec.pricing_attribute48,
2797           p_pricing_attribute49          => l_est_detail_rec.pricing_attribute49,
2798           p_pricing_attribute50          => l_est_detail_rec.pricing_attribute50,
2799           p_pricing_attribute51          => l_est_detail_rec.pricing_attribute51,
2800           p_pricing_attribute52          => l_est_detail_rec.pricing_attribute52,
2801           p_pricing_attribute53          => l_est_detail_rec.pricing_attribute53,
2802           p_pricing_attribute54          => l_est_detail_rec.pricing_attribute54,
2803           p_pricing_attribute55          => l_est_detail_rec.pricing_attribute55,
2804           p_pricing_attribute56          => l_est_detail_rec.pricing_attribute56,
2805           p_pricing_attribute57          => l_est_detail_rec.pricing_attribute57,
2806           p_pricing_attribute58          => l_est_detail_rec.pricing_attribute58,
2807           p_pricing_attribute59          => l_est_detail_rec.pricing_attribute59,
2808           p_pricing_attribute60          => l_est_detail_rec.pricing_attribute60,
2809           p_pricing_attribute61          => l_est_detail_rec.pricing_attribute61,
2810           p_pricing_attribute62          => l_est_detail_rec.pricing_attribute62,
2811           p_pricing_attribute63          => l_est_detail_rec.pricing_attribute63,
2812           p_pricing_attribute64          => l_est_detail_rec.pricing_attribute64,
2813           p_pricing_attribute65          => l_est_detail_rec.pricing_attribute65,
2814           p_pricing_attribute66          => l_est_detail_rec.pricing_attribute66,
2815           p_pricing_attribute67          => l_est_detail_rec.pricing_attribute67,
2816           p_pricing_attribute68          => l_est_detail_rec.pricing_attribute68,
2817           p_pricing_attribute69          => l_est_detail_rec.pricing_attribute69,
2818           p_pricing_attribute70          => l_est_detail_rec.pricing_attribute70,
2819           p_pricing_attribute71          => l_est_detail_rec.pricing_attribute71,
2820           p_pricing_attribute72          => l_est_detail_rec.pricing_attribute72,
2821           p_pricing_attribute73          => l_est_detail_rec.pricing_attribute73,
2822           p_pricing_attribute74          => l_est_detail_rec.pricing_attribute74,
2823           p_pricing_attribute75          => l_est_detail_rec.pricing_attribute75,
2824           p_pricing_attribute76          => l_est_detail_rec.pricing_attribute76,
2825           p_pricing_attribute77          => l_est_detail_rec.pricing_attribute77,
2826           p_pricing_attribute78          => l_est_detail_rec.pricing_attribute78,
2827           p_pricing_attribute79          => l_est_detail_rec.pricing_attribute79,
2828           p_pricing_attribute80          => l_est_detail_rec.pricing_attribute80,
2829           p_pricing_attribute81          => l_est_detail_rec.pricing_attribute81,
2830           p_pricing_attribute82          => l_est_detail_rec.pricing_attribute82,
2831           p_pricing_attribute83          => l_est_detail_rec.pricing_attribute83,
2832           p_pricing_attribute84          => l_est_detail_rec.pricing_attribute84,
2833           p_pricing_attribute85          => l_est_detail_rec.pricing_attribute85,
2834           p_pricing_attribute86          => l_est_detail_rec.pricing_attribute86,
2835           p_pricing_attribute87          => l_est_detail_rec.pricing_attribute87,
2836           p_pricing_attribute88          => l_est_detail_rec.pricing_attribute88,
2837           p_pricing_attribute89          => l_est_detail_rec.pricing_attribute89,
2838           p_pricing_attribute90          => l_est_detail_rec.pricing_attribute90,
2839           p_pricing_attribute91          => l_est_detail_rec.pricing_attribute91,
2840           p_pricing_attribute92          => l_est_detail_rec.pricing_attribute92,
2841           p_pricing_attribute93          => l_est_detail_rec.pricing_attribute93,
2842           p_pricing_attribute94          => l_est_detail_rec.pricing_attribute94,
2843           p_pricing_attribute95          => l_est_detail_rec.pricing_attribute95,
2844           p_pricing_attribute96          => l_est_detail_rec.pricing_attribute96,
2845           p_pricing_attribute97          => l_est_detail_rec.pricing_attribute97,
2846           p_pricing_attribute98          => l_est_detail_rec.pricing_attribute98,
2847           p_pricing_attribute99          => l_est_detail_rec.pricing_attribute99,
2848           p_pricing_attribute100         => l_est_detail_rec.pricing_attribute100,
2849           p_attribute1                   => l_est_detail_rec.attribute1,
2850           p_attribute2                   => l_est_detail_rec.attribute2,
2851           p_attribute3                   => l_est_detail_rec.attribute3,
2852           p_attribute4                   => l_est_detail_rec.attribute4,
2853           p_attribute5                   => l_est_detail_rec.attribute5,
2854           p_attribute6                   => l_est_detail_rec.attribute6,
2855           p_attribute7                   => l_est_detail_rec.attribute7,
2856           p_attribute8                   => l_est_detail_rec.attribute8,
2857           p_attribute9                   => l_est_detail_rec.attribute9,
2858           p_attribute10                  => l_est_detail_rec.attribute10,
2859           p_attribute11                  => l_est_detail_rec.attribute11,
2860           p_attribute12                  => l_est_detail_rec.attribute12,
2861           p_attribute13                  => l_est_detail_rec.attribute13,
2862           p_attribute14                  => l_est_detail_rec.attribute14,
2863           p_attribute15                  => l_est_detail_rec.attribute15,
2864           p_context                      => l_est_detail_rec.context,
2865           --p_organization_id            => l_est_detail_rec.organization_id,
2866           p_coverage_bill_rate_id        => l_est_detail_rec.coverage_bill_rate_id,
2867           p_coverage_billing_type_id     => null,
2868           p_txn_billing_type_id          => l_est_detail_rec.txn_billing_type_id,
2869           p_submit_restriction_message   => l_est_detail_rec.submit_restriction_message,
2870           p_submit_error_message         => l_est_detail_rec.submit_error_message,
2871           p_submit_from_system           => l_est_detail_rec.submit_from_system,
2872           p_line_submitted               => nvl(l_est_detail_rec.line_submitted_flag, 'N'),
2873           p_last_update_date             => sysdate,
2874           p_last_update_login            => p_login_id,
2875           p_last_updated_by              => p_user_id,
2876           p_creation_date                => sysdate,
2877           p_created_by                   => p_user_id,
2878           /* Credit Card 9358401 */
2879           p_instrument_payment_use_id    => l_est_detail_rec.instrument_payment_use_id,
2880 	  -- Charges Logistics Project
2881 	  p_shipping_method              => l_est_detail_rec.shipping_method,
2882           p_arrival_date_time            => l_est_detail_rec.arrival_date_time,
2883 	  p_return_type			 => l_est_detail_rec.return_type,
2884 	  p_parent_instance_id		 => l_est_detail_rec.parent_instance_id,
2885 	  p_shipping_distance            => l_est_detail_rec.distance,
2886 	  p_need_by_date                 => l_est_detail_rec.need_by_date,
2887 	     --12.2.2 Service Projects Integration (below 3 params)
2888           p_project_id                   =>  l_est_detail_rec.project_id,
2889           p_project_task_id              =>  l_est_detail_rec.project_task_id,
2890           p_expenditure_org_id           =>  l_est_detail_rec.expenditure_org_id
2891           );
2892 
2893         -- Make the postprocessing call to the user hooks
2894         --
2895         -- Post call to the customer type user hook
2896         --
2897         IF jtf_usr_hks.Ok_To_Execute('CS_CHARGE_DETAILS_PVT',
2898                                      'Update_Charge_Details',
2899                                      'A','C') THEN
2900 
2901         CS_CHARGE_DETAILS_CUHK.Update_Charge_Details_Post(
2902                 p_api_version               => l_api_version,
2903                 p_init_msg_list             => FND_API.G_FALSE,
2904                 p_commit                    => p_commit,
2905                 p_validation_level          => p_validation_level,
2906                 x_return_status             => l_return_status,
2907                 x_msg_count                 => x_msg_count,
2908                 x_object_version_number     => x_object_version_number,
2909                 x_estimate_detail_id        => l_ed_id,
2910                 x_msg_data                  => x_msg_data,
2911                 p_resp_appl_id              => p_resp_appl_id,
2912                 p_resp_id                   => p_resp_id,
2913                 p_user_id                   => p_user_id,
2914                 p_login_id                  => p_login_id,
2915                 p_transaction_control       => p_transaction_control,
2916                 p_est_detail_rec            => p_est_detail_rec);
2917 
2918         IF (l_return_status <> FND_API.G_RET_STS_SUCCESS) THEN
2919           --DBMS_OUTPUT.PUT_LINE('Returned Error Status from the Pre Customer User Hook');
2920           FND_MESSAGE.Set_Name('CS', 'CS_API_CHG_ERR_PST_CUST_USR_HK');
2921           FND_MESSAGE.Set_Token('API_NAME', l_api_name_full);
2922           FND_MSG_PUB.Add;
2923           RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
2924         END IF;
2925 
2926   END IF;
2927   --
2928   --
2929   -- Post call to the Vertical Type User Hook
2930   --
2931   IF jtf_usr_hks.Ok_To_Execute('CS_CHARGE_DETAILS_PVT',
2932                                'Update_Charge_Details',
2933                                'A', 'V')  THEN
2934 
2935     CS_CHARGE_DETAILS_VUHK.Update_Charge_Details_Post(
2936                 p_api_version               => l_api_version,
2937                 p_init_msg_list             => FND_API.G_FALSE,
2938                 p_commit                    => p_commit,
2939                 p_validation_level          => p_validation_level,
2940                 x_return_status             => l_return_status,
2941                 x_msg_count                 => x_msg_count,
2942                 x_object_version_number     => x_object_version_number,
2943                 x_estimate_detail_id        => l_ed_id,
2944                 x_msg_data                  => x_msg_data,
2945                 p_resp_appl_id              => p_resp_appl_id,
2946                 p_resp_id                   => p_resp_id,
2947                 p_user_id                   => p_user_id,
2948                 p_login_id                  => p_login_id,
2949                 p_transaction_control       => p_transaction_control,
2950                 p_est_detail_rec            => p_est_detail_rec);
2951 
2952 
2953     IF (l_return_status <> FND_API.G_RET_STS_SUCCESS) THEN
2954       FND_MESSAGE.Set_Name('CS', 'CS_API_CHG_ERR_PST_VERT_USR_HK');
2955       FND_MESSAGE.Set_Token('API_NAME', l_api_name_full);
2956       FND_MSG_PUB.Add;
2957       RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
2958     END IF;
2959 
2960   END IF;
2961   --
2962   --
2963 
2964   --Standard check of p_commit
2965   IF FND_API.To_Boolean(p_commit) THEN
2966     COMMIT WORK;
2967   END IF;
2968 
2969   -- Standard call to get message count and if count is 1, get message info
2970   FND_MSG_PUB.Count_And_Get
2971   (p_count => x_msg_count,
2972    p_data  => x_msg_data,
2973    p_encoded => FND_API.G_FALSE) ;
2974 
2975   -- Standard check of p_commit
2976   IF FND_API.To_Boolean(p_commit) THEN
2977     COMMIT WORK;
2978   END IF;
2979 
2980   -- Standard call to get message count and if count is 1, get message info
2981   FND_MSG_PUB.Count_And_Get
2982     ( p_count => x_msg_count,
2983       p_data  => x_msg_data
2984     );
2985 
2986 
2987   EXCEPTION
2988     WHEN FND_API.G_EXC_ERROR THEN
2989       IF FND_API.To_Boolean(p_transaction_control) THEN
2990         ROLLBACK TO Update_Charge_Details_PVT;
2991       END IF ;
2992       x_return_status := FND_API.G_RET_STS_ERROR;
2993       FND_MSG_PUB.Count_And_Get(
2994         p_count    => x_msg_count,
2995         p_data     => x_msg_data,
2996         p_encoded  => FND_API.G_FALSE) ;
2997 
2998     WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
2999       IF FND_API.To_Boolean(p_transaction_control) THEN
3000         ROLLBACK TO Update_Charge_Details_PVT;
3001       END IF ;
3002 
3003       x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
3004 
3005       FND_MSG_PUB.Count_And_Get(p_count => x_msg_count,
3006                                 p_data  => x_msg_data,
3007                                 p_encoded => FND_API.G_FALSE) ;
3008     WHEN OTHERS THEN
3009       IF FND_API.To_Boolean(p_transaction_control) THEN
3010         ROLLBACK TO Update_Charge_Details_PVT;
3011 
3012       END IF ;
3013 
3014       x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
3015 
3016       IF FND_MSG_PUB.Check_Msg_Level(FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR) THEN
3017         FND_MSG_PUB.Add_Exc_Msg(G_PKG_NAME, l_api_name);
3018       END IF;
3019 
3020       FND_MSG_PUB.Count_And_Get(p_count => x_msg_count,
3021                                 p_data  => x_msg_data,
3022                                 p_encoded => FND_API.G_FALSE) ;
3023 
3024 END Update_Charge_Details;
3025 
3026 --==========================================================
3027 -- API Delete Charge Details
3028 -- Purpose: Delete a given a charge detail line
3029 --          from CS_ESTIMATE_DETAILS based on the unique id
3030 --          estimate_detail_id
3031 --==========================================================
3032 
3033 Procedure  Delete_Charge_Details(
3034              p_api_version          IN         NUMBER,
3035              p_init_msg_list        IN         VARCHAR2 := FND_API.G_FALSE,
3036              p_commit               IN         VARCHAR2 := FND_API.G_FALSE,
3037              p_validation_level     IN         NUMBER   := FND_API.G_VALID_LEVEL_FULL,
3038              x_return_status        OUT NOCOPY VARCHAR2,
3039              x_msg_count            OUT NOCOPY NUMBER,
3040              x_msg_data             OUT NOCOPY VARCHAR2,
3041              p_transaction_control  IN         VARCHAR2 := FND_API.G_TRUE,
3042              p_estimate_detail_id   IN         NUMBER   := NULL)  AS
3043 
3044 l_api_name       CONSTANT  VARCHAR2(30) := 'Delete_Charge_Details' ;
3045 l_api_name_full  CONSTANT  VARCHAR2(100) := G_PKG_NAME || '.' || l_api_name ;
3046 l_log_module     CONSTANT VARCHAR2(255) := 'cs.plsql.' || l_api_name_full || '.';
3047 l_api_version    CONSTANT  NUMBER       := 1.0 ;
3048 
3049 l_resp_appl_id          NUMBER  ;
3050 l_resp_id               NUMBER  ;
3051 l_user_id               NUMBER  ;
3052 l_login_id              NUMBER  ;
3053 l_org_id                NUMBER          := NULL ;
3054 l_order_line_id         NUMBER ;
3055 l_gen_bca_flag          VARCHAR2(1);
3056 l_charge_line_type      VARCHAR2(30);
3057 l_return_status         VARCHAR2(1) ;
3058 
3059 l_estimate_detail_id    NUMBER := p_estimate_detail_id ;
3060 l_charge_det_rec        CS_Charge_Details_PUB.Charges_Rec_Type;
3061 
3062 
3063 l_prog_name CONSTANT VARCHAR2(61) := G_PKG_NAME||'.'||'delete_charge_details';
3064 
3065 
3066 BEGIN
3067 
3068   --Standard Start of API Savepoint
3069   IF FND_API.To_Boolean( p_transaction_control ) THEN
3070     SAVEPOINT   Delete_Charge_Details_PUB ;
3071   END IF ;
3072 
3073   --Standard Call to check API compatibility
3074   IF NOT FND_API.Compatible_API_Call(l_api_version,
3075      p_api_version,
3076      l_api_name,
3077      G_PKG_NAME) THEN
3078     RAISE FND_API.G_EXC_UNEXPECTED_ERROR ;
3079   END IF ;
3080 
3081   --Initialize the message list  if p_msg_list is set to TRUE
3082   IF FND_API.To_Boolean(p_init_msg_list)   THEN
3083     FND_MSG_PUB.initialize ;
3084   END IF ;
3085 
3086   --Initialize the API Return Success to True
3087   x_return_status := FND_API.G_RET_STS_SUCCESS ;
3088 
3089 ----------------------- FND Logging -----------------------------------
3090   IF FND_LOG.level_procedure >= FND_LOG.g_current_runtime_level
3091   THEN
3092     FND_LOG.String
3093     ( FND_LOG.level_procedure , L_LOG_MODULE || 'start'
3094     , 'Inside ' || L_API_NAME_FULL || ', called with parameters below:'
3095     );
3096     FND_LOG.String
3097     ( FND_LOG.level_procedure , L_LOG_MODULE || ''
3098     , 'p_api_version:' || p_api_version
3099     );
3100     FND_LOG.String
3101     ( FND_LOG.level_procedure , L_LOG_MODULE || ''
3102     , 'p_init_msg_list:' || p_init_msg_list
3103     );
3104     FND_LOG.String
3105     ( FND_LOG.level_procedure , L_LOG_MODULE || ''
3106     , 'p_commit:' || p_commit
3107     );
3108     FND_LOG.String
3109     ( FND_LOG.level_procedure , L_LOG_MODULE || ''
3110     , 'p_validation_level:' || p_validation_level
3111     );
3112     FND_LOG.String
3113     ( FND_LOG.level_procedure , L_LOG_MODULE || ''
3114     , 'p_transaction_control:' || p_transaction_control
3115     );
3116     FND_LOG.String
3117     ( FND_LOG.level_procedure , L_LOG_MODULE || ''
3118     , 'p_estimate_detail_id:' || p_estimate_detail_id
3119     );
3120 
3121   END IF;
3122 
3123   --Check for mandatory params estimate detail id
3124   --If  not passed or are null then raise error
3125 
3126   IF (p_estimate_detail_id IS NULL) THEN
3127     Add_Null_Parameter_Msg(l_api_name_full,
3128                            'p_estimate_detail_id') ;
3129 
3130     Add_Invalid_Argument_Msg(l_api_name_full,
3131                              to_char(p_estimate_detail_id),
3132                              'p_estimate_detail_id');
3133     RAISE FND_API.G_EXC_ERROR ;
3134   END IF ;
3135 
3136   -- Check to see if Transactions exits in Order Management
3137 
3138   Do_Txns_Exist(l_api_name_full,
3139                 p_estimate_detail_id,
3140                 l_order_line_id,
3141                 l_gen_bca_flag,
3142                 l_charge_line_type,
3143                 l_return_status) ;
3144 
3145   IF l_return_status <> FND_API.G_RET_STS_SUCCESS THEN
3146     RAISE FND_API.G_EXC_ERROR ;
3147   END IF ;
3148 
3149   IF l_order_line_id IS NOT NULL THEN
3150     Cannot_Delete_Line_Msg(l_api_name_full) ;
3151     RAISE FND_API.G_EXC_ERROR ;
3152   END IF ;
3153 
3154   --Bug Fix for Bug # 3136630
3155 
3156   --IF l_gen_bca_flag IS NOT NULL THEN
3157   --  IF l_gen_bca_flag = 'Y' AND
3158   IF l_charge_line_type = 'IN PROGRESS' THEN
3159     Cannot_Delete_Line_Msg(l_api_name_full) ;
3160     RAISE FND_API.G_EXC_ERROR ;
3161   END IF ;
3162  -- END IF;
3163 
3164   DELETE FROM
3165   CS_ESTIMATE_DETAILS
3166   WHERE ESTIMATE_DETAIL_ID = p_estimate_detail_id ;
3167 
3168   --End of API Body
3169   --Standard Check of p_commit
3170   IF FND_API.To_Boolean( p_commit ) THEN
3171     COMMIT WORK ;
3172   END IF ;
3173 
3174   --Standard call to get  message count and if count is 1 , get message info
3175   FND_MSG_PUB.Count_And_Get(p_count =>x_msg_count,
3176                             p_data => x_msg_data) ;
3177 
3178   --Begin Exception Handling
3179 
3180 EXCEPTION
3181 
3182   WHEN FND_API.G_EXC_ERROR THEN
3183     IF FND_API.To_Boolean( p_transaction_control ) THEN
3184       ROLLBACK TO Delete_Charge_Details_PUB;
3185     END IF ;
3186   x_return_status :=  FND_API.G_RET_STS_ERROR ;
3187 
3188   FND_MSG_PUB.Count_And_Get(p_count => x_msg_count,
3189                             p_data  => x_msg_data,
3190                             p_encoded => FND_API.G_FALSE) ;
3191 
3192 
3193 
3194   WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
3195     IF FND_API.To_Boolean( p_transaction_control ) THEN
3196       ROLLBACK TO Delete_Charge_Details_PUB;
3197     END IF ;
3198   x_return_status :=  FND_API.G_RET_STS_UNEXP_ERROR ;
3199 
3200   FND_MSG_PUB.Count_And_Get(p_count => x_msg_count,
3201                             p_data  => x_msg_data,
3202                             p_encoded => FND_API.G_FALSE) ;
3203 
3204   WHEN OTHERS THEN
3205     IF FND_API.To_Boolean( p_transaction_control ) THEN
3206       ROLLBACK TO Delete_Charge_Details_PUB;
3207     END IF ;
3208   x_return_status :=  FND_API.G_RET_STS_UNEXP_ERROR ;
3209   IF FND_MSG_PUB.Check_Msg_Level(FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR) THEN
3210      FND_MSG_PUB.Add_Exc_Msg(G_PKG_NAME,l_api_name);
3211   END IF ;
3212   FND_MSG_PUB.Count_And_Get(p_count => x_msg_count,
3213                             p_data  => x_msg_data,
3214                             p_encoded => FND_API.G_FALSE) ;
3215 
3216 END  Delete_Charge_Details;   -- End of Procedure Delete Charge Details
3217 
3218 
3219 
3220 --==================================
3221 --Copy Estimates
3222 --==================================
3223 -- New API added for 11.5.10
3224 -- mviswana
3225 Procedure  Copy_Estimate(
3226         p_api_version         IN         NUMBER,
3227         p_init_msg_list       IN         VARCHAR2 := FND_API.G_FALSE,
3228         p_commit              IN         VARCHAR2 := FND_API.G_FALSE,
3229         p_transaction_control IN         VARCHAR2 := FND_API.G_TRUE,
3230         p_estimate_detail_id  IN         NUMBER   := NULL,
3231         x_estimate_detail_id  OUT NOCOPY NUMBER,
3232         x_return_status       OUT NOCOPY VARCHAR2,
3233         x_msg_count           OUT NOCOPY NUMBER,
3234         x_msg_data            OUT NOCOPY VARCHAR2 ) IS
3235 
3236 l_api_version       NUMBER               :=  1.0 ;
3237 l_api_name          VARCHAR2(30)         := 'Copy_Estimate' ;
3238 l_api_name_full     VARCHAR2(100)         :=  G_PKG_NAME || '.' || l_api_name ;
3239 l_log_module     CONSTANT VARCHAR2(255)  := 'cs.plsql.' || l_api_name_full || '.';
3240 l_return_status     VARCHAR2(1) ;
3241 l_est_detail_id     NUMBER;
3242 l_line_number       NUMBER;
3243 l_obj_ver_num       NUMBER;
3244 l_est_detail_rec    CS_Charge_Details_PUB.Charges_Rec_Type;
3245 
3246 cursor c_charges_rec(p_estimate_detail_id NUMBER) IS
3247 select *
3248 from cs_estimate_details
3249 where estimate_detail_id = p_estimate_detail_id;
3250 
3251 v_charges_rec c_charges_rec%ROWTYPE;
3252 x_cost_id number;
3253 
3254 l_prog_name CONSTANT VARCHAR2(61) := G_PKG_NAME||'.'||l_api_name;
3255 
3256 BEGIN
3257 
3258   --DBMS_OUTPUT.PUT_LINE('BEGIN copy_estimates');
3259 
3260   -- Standard start of API savepoint
3261   IF FND_API.To_Boolean(p_transaction_control) THEN
3262     SAVEPOINT Copy_Estimate_PVT;
3263   END IF ;
3264 
3265   -- Standard call to check for call compatibility
3266   IF NOT FND_API.Compatible_API_Call(l_api_version,
3267                                      p_api_version,
3268                                      l_api_name,
3269                                      G_PKG_NAME) THEN
3270     RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
3271   END IF;
3272 
3273   -- Initialize message list if p_init_msg_list is set to TRUE
3274   IF FND_API.To_Boolean(p_init_msg_list) THEN
3275     FND_MSG_PUB.Initialize;
3276   END IF;
3277 
3278   -- Initialize API return status to success
3279   x_return_status := FND_API.G_RET_STS_SUCCESS;
3280 
3281 ----------------------- FND Logging -----------------------------------
3282   IF FND_LOG.level_procedure >= FND_LOG.g_current_runtime_level
3283   THEN
3284     FND_LOG.String
3285     ( FND_LOG.level_procedure , L_LOG_MODULE || 'start'
3286     , 'Inside ' || L_API_NAME_FULL || ', called with parameters below:'
3287     );
3288     FND_LOG.String
3289     ( FND_LOG.level_procedure , L_LOG_MODULE || ''
3290     , 'p_api_version:' || p_api_version
3291     );
3292     FND_LOG.String
3293     ( FND_LOG.level_procedure , L_LOG_MODULE || ''
3294     , 'p_init_msg_list:' || p_init_msg_list
3295     );
3296     FND_LOG.String
3297     ( FND_LOG.level_procedure , L_LOG_MODULE || ''
3298     , 'p_commit:' || p_commit
3299     );
3300     FND_LOG.String
3301     ( FND_LOG.level_procedure , L_LOG_MODULE || ''
3302     , 'p_transaction_control:' || p_transaction_control
3303     );
3304     FND_LOG.String
3305     ( FND_LOG.level_procedure , L_LOG_MODULE || ''
3306     , 'p_estimate_detail_id:' || p_estimate_detail_id
3307     );
3308 
3309   END IF;
3310 
3311   -- ======================================================================
3312   -- Actual start of the program body.
3313   -- ======================================================================
3314 
3315   -- =========================================
3316   -- Validate the incoming estimate_detail_id
3317   -- =========================================
3318 
3319   IF p_estimate_detail_id IS NULL THEN
3320     FND_MESSAGE.SET_NAME('CS', 'CS_CHG_NOT_A_VALID_CHARGE_LINE');
3321     FND_MESSAGE.SET_TOKEN('ESTIMATE_DETAIL_ID', p_estimate_detail_id);
3322     FND_MSG_PUB.ADD;
3323     RAISE FND_API.G_EXC_ERROR;
3324   END IF;
3325 
3326   --DBMS_OUTPUT.PUT_LINE('passed 1st val');
3327 
3328   OPEN c_charges_rec(p_estimate_detail_id);
3329   FETCH c_charges_rec INTO v_charges_rec;
3330   IF c_charges_rec%NOTFOUND THEN
3331     CLOSE c_charges_rec;
3332     FND_MESSAGE.SET_NAME('CS', 'CS_CHG_NOT_A_VALID_CHARGE_LINE');
3333     FND_MESSAGE.SET_TOKEN('ESTIMATE_DETAIL_ID', p_estimate_detail_id);
3334     FND_MSG_PUB.ADD;
3335     RAISE FND_API.G_EXC_ERROR;
3336   END IF;
3337   CLOSE c_charges_rec;
3338 
3339   --DBMS_OUTPUT.PUT_LINE('passed 2ndst val');
3340 
3341   IF v_charges_rec.charge_line_type <> 'ESTIMATE' THEN
3342     FND_MESSAGE.SET_NAME('CS', 'CS_CHG_NOT_AN_ESTIMATE');
3343     FND_MESSAGE.SET_TOKEN('ESTIMATE_DETAIL_ID', p_estimate_detail_id);
3344     FND_MSG_PUB.ADD;
3345     RAISE FND_API.G_EXC_ERROR;
3346   END IF;
3347 
3348   --DBMS_OUTPUT.PUT_LINE('passed 3rd val');
3349 
3350   --populate the charges rec with values from v_charges_rec
3351 
3352   l_est_detail_rec.incident_id                  :=   v_charges_rec.incident_id;
3353   l_est_detail_rec.charge_line_type             :=   'ACTUAL';
3354   -- fix for bug:5125385
3355   -- l_est_detail_rec.line_number               :=   1;
3356   l_est_detail_rec.line_number                  :=   NULL;
3357   l_est_detail_rec.business_process_id          :=   v_charges_rec.business_process_id;
3358   l_est_detail_rec.transaction_type_id          :=   v_charges_rec.transaction_type_id;
3359   l_est_detail_rec.inventory_item_id_in         :=   v_charges_rec.inventory_item_id;
3360   l_est_detail_rec.item_revision                :=   v_charges_rec.item_revision;
3361   l_est_detail_rec.billing_flag                 :=   NULL;
3362   l_est_detail_rec.txn_billing_type_id          :=   v_charges_rec.txn_billing_type_id;
3363   l_est_detail_rec.unit_of_measure_code         :=   v_charges_rec.unit_of_measure_code;
3364   l_est_detail_rec.quantity_required            :=   v_charges_rec.quantity_required;
3365   l_est_detail_rec.return_reason_code           :=   v_charges_rec.return_reason_code;
3366   l_est_detail_rec.customer_product_id          :=   v_charges_rec.customer_product_id;
3367   l_est_detail_rec.serial_number                :=   v_charges_rec.serial_number;
3368   l_est_detail_rec.installed_cp_return_by_date  :=   v_charges_rec.installed_cp_return_by_date;
3369   l_est_detail_rec.new_cp_return_by_date        :=   v_charges_rec.new_cp_return_by_date;
3370   l_est_detail_rec.bill_to_party_id             :=   v_charges_rec.bill_to_party_id;
3371   l_est_detail_rec.bill_to_account_id           :=   v_charges_rec.INVOICE_TO_ACCOUNT_ID;
3372   l_est_detail_rec.bill_to_contact_id           :=   v_charges_rec.bill_to_contact_id;
3373   l_est_detail_rec.invoice_to_org_id            :=   v_charges_rec.invoice_to_org_id;
3374   l_est_detail_rec.ship_to_party_id             :=   v_charges_rec.ship_to_party_id;
3375   l_est_detail_rec.ship_to_account_id           :=   v_charges_rec.ship_to_account_id;
3376   l_est_detail_rec.ship_to_contact_id           :=   v_charges_rec.ship_to_contact_id;
3377   l_est_detail_rec.ship_to_org_id               :=   v_charges_rec.ship_to_org_id;
3378   l_est_detail_rec.contract_id                  :=   v_charges_rec.contract_id;
3379   l_est_detail_rec.contract_line_id             :=   v_charges_rec.contract_line_id;
3380   l_est_detail_rec.coverage_id                  :=   v_charges_rec.coverage_id;
3381   l_est_detail_rec.coverage_txn_group_id        :=   v_charges_rec.coverage_txn_group_id;
3382   l_est_detail_rec.coverage_bill_rate_id        :=   v_charges_rec.coverage_bill_rate_id;
3383   l_est_detail_rec.coverage_billing_type_id     :=   v_charges_rec.coverage_billing_type_id;
3384   l_est_detail_rec.price_list_id                :=   v_charges_rec.PRICE_LIST_HEADER_ID;
3385   l_est_detail_rec.currency_code                :=   v_charges_rec.currency_code;
3386   l_est_detail_rec.purchase_order_num           :=   v_charges_rec.purchase_order_num;
3387   l_est_detail_rec.list_price                   :=   v_charges_rec.list_price;
3388 
3389 
3390 
3391   --how do we know this we do not trap this value
3392   l_est_detail_rec.con_pct_over_list_price      :=   null;
3393   l_est_detail_rec.selling_price                :=   v_charges_rec.selling_price;
3394   l_est_detail_rec.contract_discount_amount     :=   v_charges_rec.contract_discount_amount;
3395 
3396   --how do we know when to apply contract discount if we do not trap this value
3397   l_est_detail_rec.apply_contract_discount      :=   'N' ;
3398 
3399 
3400   l_est_detail_rec.after_warranty_cost          :=   v_charges_rec.after_warranty_cost;
3401   l_est_detail_rec.transaction_inventory_org    :=   v_charges_rec.transaction_inventory_org;
3402   l_est_detail_rec.transaction_sub_inventory    :=   v_charges_rec.transaction_sub_inventory;
3403   l_est_detail_rec.rollup_flag                  :=   v_charges_rec.rollup_flag;
3404   l_est_detail_rec.add_to_order_flag            :=   v_charges_rec.add_to_order_flag;
3405   l_est_detail_rec.order_header_id              :=   v_charges_rec.order_header_id;
3406   l_est_detail_rec.interface_to_oe_flag         :=   v_charges_rec.interface_to_oe_flag;
3407   l_est_detail_rec.no_charge_flag               :=   v_charges_rec.no_charge_flag;
3408   l_est_detail_rec.line_category_code           :=   v_charges_rec.line_category_code;
3409   l_est_detail_rec.line_type_id                 :=   v_charges_rec.line_type_id;
3410   l_est_detail_rec.order_line_id                :=   v_charges_rec.order_line_id;
3411   l_est_detail_rec.conversion_rate              :=   v_charges_rec.conversion_rate;
3412   l_est_detail_rec.conversion_type_code         :=   v_charges_rec.conversion_type_code;
3413   l_est_detail_rec.conversion_rate_date         :=   v_charges_rec.conversion_rate_date;
3414   l_est_detail_rec.original_source_id           :=   v_charges_rec.original_source_id;
3415   l_est_detail_rec.original_source_code         :=   v_charges_rec.original_source_code;
3416   l_est_detail_rec.source_id                    :=   v_charges_rec.source_id;
3417   l_est_detail_rec.source_code                  :=   v_charges_rec.source_code;
3418   l_est_detail_rec.org_id                       :=   v_charges_rec.org_id;
3419 
3420 
3421 
3422   --Error Handling
3423   l_est_detail_rec.submit_restriction_message   :=   v_charges_rec.submit_restriction_message;
3424   l_est_detail_rec.submit_error_message         :=   v_charges_rec.submit_error_message;
3425 
3426   --DBMS_OUTPUT.PUT_LINE('submit_restriction_message is '||l_est_detail_rec.submit_restriction_message);
3427   --DBMS_OUTPUT.PUT_LINE('submit_error_message is '||l_est_detail_rec.submit_error_message);
3428 
3429 
3430   --Auto Submission Process
3431   l_est_detail_rec.submit_from_system           :=   v_charges_rec.submit_from_system;
3432 
3433   --Billing Engine
3434   --Fixed Bug # 3362046
3435   l_est_detail_rec.activity_start_time          :=   v_charges_rec.activity_start_date_time;
3436   l_est_detail_rec.activity_end_time            :=   v_charges_rec.activity_end_date_time;
3437   l_est_detail_rec.generated_by_bca_engine      :=   v_charges_rec.generated_by_bca_engine_flag;
3438 
3439   l_est_detail_rec.attribute1                   :=   v_charges_rec.attribute1;
3440   l_est_detail_rec.attribute2                   :=   v_charges_rec.attribute2;
3441   l_est_detail_rec.attribute3                   :=   v_charges_rec.attribute3;
3442   l_est_detail_rec.attribute4                   :=   v_charges_rec.attribute4;
3443   l_est_detail_rec.attribute5                   :=   v_charges_rec.attribute5;
3444   l_est_detail_rec.attribute6                   :=   v_charges_rec.attribute6;
3445   l_est_detail_rec.attribute7                   :=   v_charges_rec.attribute7;
3446   l_est_detail_rec.attribute8                   :=   v_charges_rec.attribute8;
3447   l_est_detail_rec.attribute9                   :=   v_charges_rec.attribute9;
3448   l_est_detail_rec.attribute10                  :=   v_charges_rec.attribute10;
3449   l_est_detail_rec.attribute11                  :=   v_charges_rec.attribute11;
3450   l_est_detail_rec.attribute12                  :=   v_charges_rec.attribute12;
3451   l_est_detail_rec.attribute13                  :=   v_charges_rec.attribute13;
3452   l_est_detail_rec.attribute14                  :=   v_charges_rec.attribute14;
3453   l_est_detail_rec.attribute15                  :=   v_charges_rec.attribute15;
3454   l_est_detail_rec.context                      :=   v_charges_rec.context;
3455   l_est_detail_rec.pricing_context              :=   v_charges_rec.pricing_context;
3456   l_est_detail_rec.pricing_attribute1           :=   v_charges_rec.pricing_attribute1;
3457   l_est_detail_rec.pricing_attribute2           :=   v_charges_rec.pricing_attribute2 ;
3458   l_est_detail_rec.pricing_attribute3           :=   v_charges_rec.pricing_attribute3 ;
3459   l_est_detail_rec.pricing_attribute4           :=   v_charges_rec.pricing_attribute4 ;
3460   l_est_detail_rec.pricing_attribute5           :=   v_charges_rec.pricing_attribute5 ;
3461   l_est_detail_rec.pricing_attribute6           :=   v_charges_rec.pricing_attribute6 ;
3462   l_est_detail_rec.pricing_attribute7           :=   v_charges_rec.pricing_attribute7 ;
3463   l_est_detail_rec.pricing_attribute8           :=   v_charges_rec.pricing_attribute8 ;
3464   l_est_detail_rec.pricing_attribute9           :=   v_charges_rec.pricing_attribute9 ;
3465   l_est_detail_rec.pricing_attribute10          :=   v_charges_rec.pricing_attribute10;
3466   l_est_detail_rec.pricing_attribute11          :=   v_charges_rec.pricing_attribute11;
3467   l_est_detail_rec.pricing_attribute12          :=   v_charges_rec.pricing_attribute12;
3468   l_est_detail_rec.pricing_attribute13          :=   v_charges_rec.pricing_attribute13;
3469   l_est_detail_rec.pricing_attribute14          :=   v_charges_rec.pricing_attribute14;
3470   l_est_detail_rec.pricing_attribute15          :=   v_charges_rec.pricing_attribute15;
3471   l_est_detail_rec.pricing_attribute16          :=   v_charges_rec.pricing_attribute16;
3472   l_est_detail_rec.pricing_attribute17          :=   v_charges_rec.pricing_attribute17;
3473   l_est_detail_rec.pricing_attribute18          :=   v_charges_rec.pricing_attribute18;
3474   l_est_detail_rec.pricing_attribute19          :=   v_charges_rec.pricing_attribute19;
3475   l_est_detail_rec.pricing_attribute20          :=   v_charges_rec.pricing_attribute20;
3476   l_est_detail_rec.pricing_attribute21          :=   v_charges_rec.pricing_attribute21;
3477   l_est_detail_rec.pricing_attribute22          :=   v_charges_rec.pricing_attribute22;
3478   l_est_detail_rec.pricing_attribute23          :=   v_charges_rec.pricing_attribute23;
3479   l_est_detail_rec.pricing_attribute24          :=   v_charges_rec.pricing_attribute24;
3480   l_est_detail_rec.pricing_attribute25          :=   v_charges_rec.pricing_attribute25;
3481   l_est_detail_rec.pricing_attribute26          :=   v_charges_rec.pricing_attribute26;
3482   l_est_detail_rec.pricing_attribute27          :=   v_charges_rec.pricing_attribute27;
3483   l_est_detail_rec.pricing_attribute28          :=   v_charges_rec.pricing_attribute28;
3484   l_est_detail_rec.pricing_attribute29          :=   v_charges_rec.pricing_attribute29;
3485   l_est_detail_rec.pricing_attribute30          :=   v_charges_rec.pricing_attribute30;
3486   l_est_detail_rec.pricing_attribute31          :=   v_charges_rec.pricing_attribute31;
3487   l_est_detail_rec.pricing_attribute32          :=   v_charges_rec.pricing_attribute32;
3488   l_est_detail_rec.pricing_attribute33          :=   v_charges_rec.pricing_attribute33;
3489   l_est_detail_rec.pricing_attribute34          :=   v_charges_rec.pricing_attribute34;
3490   l_est_detail_rec.pricing_attribute35          :=   v_charges_rec.pricing_attribute35;
3491   l_est_detail_rec.pricing_attribute36          :=   v_charges_rec.pricing_attribute36;
3492   l_est_detail_rec.pricing_attribute37          :=   v_charges_rec.pricing_attribute37;
3493   l_est_detail_rec.pricing_attribute38          :=   v_charges_rec.pricing_attribute38;
3494   l_est_detail_rec.pricing_attribute39          :=   v_charges_rec.pricing_attribute39;
3495   l_est_detail_rec.pricing_attribute40          :=   v_charges_rec.pricing_attribute40;
3496   l_est_detail_rec.pricing_attribute41          :=   v_charges_rec.pricing_attribute41;
3497   l_est_detail_rec.pricing_attribute42          :=   v_charges_rec.pricing_attribute42;
3498   l_est_detail_rec.pricing_attribute43          :=   v_charges_rec.pricing_attribute43;
3499   l_est_detail_rec.pricing_attribute44          :=   v_charges_rec.pricing_attribute44;
3500   l_est_detail_rec.pricing_attribute45          :=   v_charges_rec.pricing_attribute45;
3501   l_est_detail_rec.pricing_attribute46          :=   v_charges_rec.pricing_attribute46;
3502   l_est_detail_rec.pricing_attribute47          :=   v_charges_rec.pricing_attribute47;
3503   l_est_detail_rec.pricing_attribute48          :=   v_charges_rec.pricing_attribute48;
3504   l_est_detail_rec.pricing_attribute49          :=   v_charges_rec.pricing_attribute49;
3505   l_est_detail_rec.pricing_attribute50          :=   v_charges_rec.pricing_attribute50;
3506   l_est_detail_rec.pricing_attribute51          :=   v_charges_rec.pricing_attribute51;
3507   l_est_detail_rec.pricing_attribute52          :=   v_charges_rec.pricing_attribute52;
3508   l_est_detail_rec.pricing_attribute53          :=   v_charges_rec.pricing_attribute53;
3509   l_est_detail_rec.pricing_attribute54          :=   v_charges_rec.pricing_attribute54;
3510   l_est_detail_rec.pricing_attribute55          :=   v_charges_rec.pricing_attribute56;
3511   l_est_detail_rec.pricing_attribute56          :=   v_charges_rec.pricing_attribute56;
3512   l_est_detail_rec.pricing_attribute57          :=   v_charges_rec.pricing_attribute57;
3513   l_est_detail_rec.pricing_attribute58          :=   v_charges_rec.pricing_attribute58;
3514   l_est_detail_rec.pricing_attribute59          :=   v_charges_rec.pricing_attribute59;
3515   l_est_detail_rec.pricing_attribute60          :=   v_charges_rec.pricing_attribute60;
3516   l_est_detail_rec.pricing_attribute61          :=   v_charges_rec.pricing_attribute61;
3517   l_est_detail_rec.pricing_attribute62          :=   v_charges_rec.pricing_attribute62;
3518   l_est_detail_rec.pricing_attribute63          :=   v_charges_rec.pricing_attribute63;
3519   l_est_detail_rec.pricing_attribute64          :=   v_charges_rec.pricing_attribute64;
3520   l_est_detail_rec.pricing_attribute65          :=   v_charges_rec.pricing_attribute65;
3521   l_est_detail_rec.pricing_attribute66          :=   v_charges_rec.pricing_attribute66;
3522   l_est_detail_rec.pricing_attribute67          :=   v_charges_rec.pricing_attribute67;
3523   l_est_detail_rec.pricing_attribute68          :=   v_charges_rec.pricing_attribute68;
3524   l_est_detail_rec.pricing_attribute69          :=   v_charges_rec.pricing_attribute69;
3525   l_est_detail_rec.pricing_attribute70          :=   v_charges_rec.pricing_attribute70;
3526   l_est_detail_rec.pricing_attribute71          :=   v_charges_rec.pricing_attribute71;
3527   l_est_detail_rec.pricing_attribute72          :=   v_charges_rec.pricing_attribute72;
3528   l_est_detail_rec.pricing_attribute73          :=   v_charges_rec.pricing_attribute73;
3529   l_est_detail_rec.pricing_attribute74          :=   v_charges_rec.pricing_attribute74;
3530   l_est_detail_rec.pricing_attribute75          :=   v_charges_rec.pricing_attribute75;
3531   l_est_detail_rec.pricing_attribute76          :=   v_charges_rec.pricing_attribute76;
3532   l_est_detail_rec.pricing_attribute77          :=   v_charges_rec.pricing_attribute77;
3533   l_est_detail_rec.pricing_attribute78          :=   v_charges_rec.pricing_attribute78;
3534   l_est_detail_rec.pricing_attribute79          :=   v_charges_rec.pricing_attribute79;
3535   l_est_detail_rec.pricing_attribute80          :=   v_charges_rec.pricing_attribute80;
3536   l_est_detail_rec.pricing_attribute81          :=   v_charges_rec.pricing_attribute81;
3537   l_est_detail_rec.pricing_attribute82          :=   v_charges_rec.pricing_attribute82;
3538   l_est_detail_rec.pricing_attribute83          :=   v_charges_rec.pricing_attribute83;
3539   l_est_detail_rec.pricing_attribute84          :=   v_charges_rec.pricing_attribute84;
3540   l_est_detail_rec.pricing_attribute85          :=   v_charges_rec.pricing_attribute85;
3541   l_est_detail_rec.pricing_attribute86          :=   v_charges_rec.pricing_attribute86;
3542   l_est_detail_rec.pricing_attribute87          :=   v_charges_rec.pricing_attribute87;
3543   l_est_detail_rec.pricing_attribute88          :=   v_charges_rec.pricing_attribute88;
3544   l_est_detail_rec.pricing_attribute89          :=   v_charges_rec.pricing_attribute89;
3545   l_est_detail_rec.pricing_attribute90          :=   v_charges_rec.pricing_attribute90;
3546   l_est_detail_rec.pricing_attribute91          :=   v_charges_rec.pricing_attribute91;
3547   l_est_detail_rec.pricing_attribute92          :=   v_charges_rec.pricing_attribute92;
3548   l_est_detail_rec.pricing_attribute93          :=   v_charges_rec.pricing_attribute93;
3549   l_est_detail_rec.pricing_attribute94          :=   v_charges_rec.pricing_attribute94;
3550   l_est_detail_rec.pricing_attribute95          :=   v_charges_rec.pricing_attribute95;
3551   l_est_detail_rec.pricing_attribute96          :=   v_charges_rec.pricing_attribute96;
3552   l_est_detail_rec.pricing_attribute97          :=   v_charges_rec.pricing_attribute97;
3553   l_est_detail_rec.pricing_attribute98          :=   v_charges_rec.pricing_attribute98;
3554   l_est_detail_rec.pricing_attribute99          :=   v_charges_rec.pricing_attribute99;
3555   l_est_detail_rec.pricing_attribute100         :=   v_charges_rec.pricing_attribute100;
3556 /*Credit Card 9358401*/
3557   l_est_detail_rec.instrument_payment_use_id    :=   v_charges_rec.instrument_payment_use_id;
3558 
3559 
3560   -- Call Create Charge Details to create line
3561 
3562   --DBMS_OUTPUT.PUT_LINE('Calling CS_Charge_Details_PUB.Create_Charge_Details');
3563 
3564 
3565   CS_Charge_Details_PUB.Create_Charge_Details(
3566     p_api_version    => l_api_version,
3567     p_commit         => fnd_api.g_false,
3568     p_init_msg_list  => fnd_api.g_false,
3569     x_msg_count      => x_msg_count,
3570     x_msg_data       => x_msg_data,
3571     x_return_status  => l_return_status,
3572     p_Charges_Rec    => l_est_detail_rec,
3573     p_create_cost_detail => 'Y' ,       --Added for  Service Costing
3574     x_cost_id             => x_cost_id, --Added for Service Costing
3575     x_estimate_detail_id  =>  x_estimate_detail_id,
3576     x_line_number        =>  l_line_number,
3577     x_object_version_number => l_obj_ver_num
3578     ) ;
3579 
3580 
3581 
3582 
3583  --DBMS_OUTPUT.PUT_LINE('Estimate detail Id is'||l_est_detail_id);
3584 
3585   IF (l_return_status = FND_API.G_RET_STS_ERROR) THEN
3586     RAISE FND_API.G_EXC_ERROR;
3587   ELSIF (l_return_status = FND_API.G_RET_STS_UNEXP_ERROR) THEN
3588     RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
3589   END IF;
3590 
3591   --End of API Body
3592   --Standard Check of p_commit
3593   IF FND_API.To_Boolean( p_commit ) THEN
3594     COMMIT WORK ;
3595   END IF ;
3596 
3597   --Standard call to get  message count and if count is 1 , get message info
3598   FND_MSG_PUB.Count_And_Get(p_count =>x_msg_count,
3599                             p_data => x_msg_data) ;
3600 
3601 
3602 
3603   --Begin Exception Handling
3604 
3605   EXCEPTION
3606 
3607   WHEN FND_API.G_EXC_ERROR THEN
3608     IF FND_API.To_Boolean( p_transaction_control ) THEN
3609       ROLLBACK TO Copy_Estimates_PVT;
3610     END IF ;
3611 
3612   x_return_status :=  FND_API.G_RET_STS_ERROR ;
3613 
3614   FND_MSG_PUB.Count_And_Get(p_count   => x_msg_count,
3615                             p_data    => x_msg_data,
3616                             p_encoded => FND_API.G_FALSE) ;
3617 
3618 
3619   WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
3620     IF FND_API.To_Boolean( p_transaction_control ) THEN
3621       ROLLBACK TO Copy_Estimates_PVT;
3622     END IF ;
3623 
3624   x_return_status :=  FND_API.G_RET_STS_UNEXP_ERROR ;
3625 
3626   FND_MSG_PUB.Count_And_Get(p_count => x_msg_count,
3627                             p_data  => x_msg_data,
3628                             p_encoded => FND_API.G_FALSE) ;
3629   WHEN OTHERS THEN
3630     IF FND_API.To_Boolean( p_transaction_control ) THEN
3631       ROLLBACK TO Copy_Estimates_PVT;
3632     END IF ;
3633 
3634   x_return_status :=  FND_API.G_RET_STS_UNEXP_ERROR ;
3635 
3636   IF FND_MSG_PUB.Check_Msg_Level
3637     (FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR) THEN
3638     FND_MSG_PUB.Add_Exc_Msg(G_PKG_NAME,l_api_name);
3639   END IF ;
3640 
3641   FND_MSG_PUB.Count_And_Get(p_count => x_msg_count,
3642                             p_data  => x_msg_data,
3643                             p_encoded => FND_API.G_FALSE) ;
3644 
3645 END Copy_Estimate;
3646 
3647 PROCEDURE CURR_IN_CONVERSION_LIST(
3648                 p_api_name        IN         VARCHAR2,
3649                 p_price_list_id   IN         NUMBER ,
3650 		p_currency_code   IN         VARCHAR2,
3651                 x_msg_data        OUT NOCOPY VARCHAR2,
3652                 x_msg_count       OUT NOCOPY NUMBER,
3653                 x_return_status   OUT NOCOPY VARCHAR2)
3654 IS
3655 
3656 Cursor c_currency_code(p_price_list_id NUMBER,p_currency_code VARCHAR2) IS
3657 SELECT 'Y'
3658 FROM qp_currency_details a,qp_list_headers_b b
3659 where list_header_id = p_price_list_id
3660 and a.currency_header_id = b.currency_header_id
3661 and to_currency_code = p_currency_code;
3662 
3663 lv_exists_flag VARCHAR2(1) := 'N';
3664 BEGIN
3665   IF p_price_list_id IS NOT NULL THEN
3666     OPEN c_currency_code(p_price_list_id,p_currency_code);
3667     FETCH c_currency_code INTO lv_exists_flag;
3668     CLOSE c_currency_code;
3669     IF lv_exists_flag <> 'Y' THEN
3670         FND_MESSAGE.SET_NAME('CS', 'CS_CHG_INVALID_CURRENCY_CODE');
3671 	FND_MESSAGE.Set_Token('CURRENCY_CODE', p_currency_code);
3672 	FND_MSG_PUB.Add;
3673 	RAISE FND_API.G_EXC_ERROR;
3674     ELSE
3675        x_return_status := FND_API.G_RET_STS_SUCCESS;
3676     END IF;
3677   ELSE
3678     Add_Null_Parameter_Msg(p_api_name, 'p_price_list_id');
3679     RAISE FND_API.G_EXC_ERROR;
3680   END IF;
3681   EXCEPTION
3682   WHEN FND_API.G_EXC_ERROR THEN
3683     x_return_status := FND_API.G_RET_STS_ERROR;
3684     fnd_msg_pub.count_and_get(
3685       p_count => x_msg_count
3686      ,p_data  => x_msg_data);
3687 
3688   WHEN OTHERS THEN
3689     x_return_status := FND_API.G_RET_STS_ERROR;
3690     FND_MESSAGE.Set_Name('CS', 'CS_CHG_GET_CURRENCY_FAILED');
3691     FND_MESSAGE.SET_TOKEN('PRICE_LIST_ID', p_price_list_id);
3692     FND_MSG_PUB.Add;
3693     fnd_msg_pub.count_and_get(
3694       p_count => x_msg_count
3695      ,p_data  => x_msg_data);
3696 
3697 END CURR_IN_CONVERSION_LIST;
3698 
3699 
3700 --==================================
3701 -- Validate_Chrg_Dtls
3702 --==================================
3703 PROCEDURE VALIDATE_CHARGE_DETAILS(
3704                  P_API_NAME                  IN            VARCHAR2,
3705                  P_CHARGES_DETAIL_REC        IN            CS_Charge_Details_PUB.Charges_Rec_Type,
3706                  P_VALIDATION_MODE           IN            VARCHAR2,
3707                  P_USER_ID                   IN            NUMBER,
3708                  P_LOGIN_ID                  IN            NUMBER,
3709                  X_CHARGES_DETAIL_REC        OUT NOCOPY    CS_Charge_Details_PUB.Charges_Rec_Type,
3710                  X_MSG_DATA                  OUT NOCOPY    VARCHAR2,
3711                  X_MSG_COUNT                 OUT NOCOPY    NUMBER,
3712                  X_RETURN_STATUS             OUT NOCOPY    VARCHAR2)
3713 IS
3714 
3715 l_api_name                  CONSTANT   VARCHAR2(30) := 'Validate_Charge_Details' ;
3716 l_api_name_full             CONSTANT   VARCHAR2(100) :=  G_PKG_NAME || '.' || l_api_name ;
3717 l_log_module                CONSTANT VARCHAR2(255)  := 'cs.plsql.' || l_api_name_full || '.';
3718 l_business_process_id                  NUMBER;
3719 l_line_order_category_code             VARCHAR2(30);
3720 l_no_charge_flag                       VARCHAR2(1);
3721 l_create_charge_flag		       VARCHAR2(1); --costing enhancement
3722 l_interface_to_oe_flag                 VARCHAR2(1);
3723 l_update_ib_flag                       VARCHAR2(1);
3724 l_src_reference_reqd_flag              VARCHAR2(1);
3725 l_src_return_reqd_flag                 VARCHAR2(1);
3726 l_non_src_reference_reqd_flag          VARCHAR2(1);
3727 l_non_src_return_reqd                  VARCHAR2(1);
3728 l_non_src_return_reqd_flag             VARCHAR2(1);
3729 l_serial_control_flag                  VARCHAR2(1);
3730 l_rev_control_flag                     VARCHAR2(1);
3731 l_billing_flag                         VARCHAR2(30);
3732 l_tbl_uom                              TBL_UOM;
3733 l_primary_uom                          VARCHAR2(3);
3734 l_txn_billing_type_id                  NUMBER;
3735 l_line_type_id                         NUMBER;
3736 l_order_header_id                      NUMBER;
3737 l_def_bp_from_sr                       VARCHAR2(1) := 'N';
3738 l_org_id                               NUMBER;
3739 
3740 l_msg_data                             VARCHAR2(2000);
3741 l_msg_count                            NUMBER;
3742 l_profile                              VARCHAR2(200);
3743 l_source_id                            NUMBER;
3744 l_return_status                        VARCHAR2(1);
3745 l_customer_id                          NUMBER;
3746 l_customer_site_id                     NUMBER;
3747 --Changed this to fix bug # 3667210
3748 --Changed to VARCHAR2(50) as per table specification
3749 l_cust_po_number                       VARCHAR2(50);
3750 l_cust_product_id                      NUMBER;
3751 l_system_id                            NUMBER;
3752 l_inventory_item_id                    NUMBER;
3753 l_account_id                           NUMBER;
3754 l_bill_to_party_id                     NUMBER;
3755 l_bill_to_account_id                   NUMBER;
3756 l_bill_to_contact_id                   NUMBER;
3757 l_bill_to_site_id                      NUMBER;
3758 l_ship_to_party_id                     NUMBER;
3759 l_ship_to_account_id                   NUMBER;
3760 l_ship_to_contact_id                   NUMBER;
3761 l_ship_to_site_id                      NUMBER;
3762 l_contract_id                          NUMBER;
3763 l_contract_service_id                  NUMBER;
3764 l_po_number                            VARCHAR2(50);
3765 l_price_list_exists                    VARCHAR2(1);
3766 l_price_list_id                        NUMBER;
3767 -- Changed length of the currency code to 15 for bug # 4120556
3768 l_currency_code                        VARCHAR2(15);
3769 l_conversion_needed_flag               VARCHAR2(1);
3770 l_convert_currency                     VARCHAR2(10);
3771 l_rate NUMBER;
3772 l_numerator                            NUMBER;
3773 l_denominator                          NUMBER;
3774 l_list_price                           NUMBER;
3775 l_contract_discount                    NUMBER;
3776 l_db_rec                               CS_ESTIMATE_DETAILS%ROWTYPE;
3777 
3778 l_transaction_type_changed             VARCHAR2(1);
3779 l_item_changed                         VARCHAR2(1);
3780 
3781 l_incident_date                        DATE;
3782 l_creation_date                        DATE;
3783 l_request_date                         DATE;
3784 l_contract_line_id                     NUMBER;
3785 
3786 --RF
3787 l_db_det_rec                           CS_ESTIMATE_DETAILS%ROWTYPE;
3788 l_calc_sp                              VARCHAR2(1);
3789 
3790 --Fix for Bug # 3362130
3791 l_comms_trackable_flag                 VARCHAR2(1);
3792 
3793 l_in_oe_flag                           VARCHAR2(1) := 'N';
3794 l_in_ib_flag                           VARCHAR2(1) := 'N';
3795 l_rollup_flag                          VARCHAR2(1) := 'N';
3796 l_bp_changed                           VARCHAR2(1) := 'N';
3797 l_update_org                           VARCHAR2(10);
3798 
3799 l_valid_check                          VARCHAR2(1);
3800 
3801 
3802 l_disallow_new_charge                  VARCHAR2(1);
3803 l_disallow_charge_update               VARCHAR2(1);
3804 
3805 -- Added to fix Bug # 3819167
3806 -- Fixed Bug # 3913707
3807 -- l_absolute_quantity_required           NUMBER;
3808 
3809 -- Added for bug # 4395867
3810 l_original_source VARCHAR2(30);
3811 l_source VARCHAR2(30);
3812 l_pricing_date Date; -- Bug 	7117553
3813 l_profile_value Varchar2(100); -- Bug 	7117553
3814 
3815 -- Added for bug#5125934
3816 l_serial_number                         VARCHAR2(30);
3817 
3818 
3819 --taklam
3820 l_internal_party_id                    NUMBER;
3821 l_src_change_owner                     VARCHAR2(1);
3822 
3823 -- Depot Loaner fix - Bug# 4586140
3824 l_action_code   varchar2(30);
3825 
3826 l_credit_status  boolean := TRUE;--Credit Card 9358401
3827 L_CURR_IN_CONVERSION_LIST VARCHAR2(1); --12.1.3 Charges Logistic Multi Currency , vpremach
3828 Cursor C_SRC_CHANGE_OWNER(p_txn_billing_type_id NUMBER) IS
3829 SELECT src_change_owner
3830 FROM CSI_IB_TXN_TYPES
3831 WHERE cs_transaction_type_id = p_txn_billing_type_id;
3832 
3833 -- Depot Loaner fix - Bug# 4586140
3834 -- Cursor to get depot details
3835 /* Fix bug:5198520 */
3836 Cursor c_get_depot_txns_details (p_estimate_detail_id in number) is
3837 SELECT action_code
3838 FROM   csd_product_transactions
3839 WHERE  estimate_detail_id = p_estimate_detail_id;
3840 
3841 /* Select action_code
3842 from csd_product_txns_v
3843 where estimate_detail_id = p_estimate_detail_id; */
3844 
3845 -- Added for bug#5125934
3846 Cursor c_serial_number(p_instance_id NUMBER) IS
3847 SELECT serial_number
3848 FROM   csi_item_instances
3849 WHERE  instance_id = p_instance_id;
3850 
3851 -- 12.1.3 Charges Logistics Project
3852 Cursor c_sub_inventory(p_inv_org_id Number, p_sub_inv_org Varchar2) is
3853 SELECT 'Y'
3854 FROM mtl_secondary_inventories
3855 WHERE organization_id = p_inv_org_id
3856 and secondary_inventory_name = p_sub_inv_org;
3857 
3858 l_sub_inv_exists Varchar2(2);
3859 
3860 Cursor c_return_type(p_lookup_code varchar2) is
3861 SELECT 'Y'
3862 FROM cs_lookups
3863 WHERE lookup_type = 'CS_SR_RETURN_TYPE'
3864 AND lookup_code = p_lookup_code;
3865 
3866 l_return_type Varchar2(2);
3867 
3868 Cursor c_location_id(p_party_site_id Number) is
3869 Select location_id
3870 from hz_party_sites
3871 where party_site_id = p_party_site_id;
3872 
3873 l_location_id Number;
3874 l_shipping_method_found  varchar2(1) := 'N';
3875 l_arrival_date_found   varchar2(1) := 'N';
3876 l_distance_found   varchar2(1) := 'N';
3877 l_found   varchar2(1) := 'N';
3878 
3879 --Cursor c_ship_dtls(p_organization_id Number, p_subinventory_code Varchar2) is
3880 Cursor c_ship_dtls(p_organization_id Number, p_subinventory_code Varchar2 default null) is
3881 select capt.shipping_method,
3882        capt.arrival_date,
3883        capt.distance,
3884        capt.subinventory_code
3885 from   csp_available_parts_temp capt
3886 where  capt.organization_id = p_organization_id;
3887 --and    capt.subinventory_code = p_subinventory_code;
3888 
3889 Cursor c_shipping_arrival_dt(p_organization_id Number, p_location_id Number) is
3890 select shipping_method,
3891         arrival_date
3892  from   csp_shipping_details_v
3893  where  organization_id = p_organization_id   -- source inventory organization id
3894  and    to_location_id = p_location_id        -- hz_locations.location_id
3895  and    location_source = 'HZ'
3896  order by shipping_cost,arrival_date;
3897 
3898 
3899 l_shipping_method_code Varchar2(240);
3900 l_arrival_date		Date;
3901 l_distance		Number; -- Charges MED
3902 l_required_parts	csp_part_search_pvt.required_parts_tbl;
3903 l_search_params		csp_part_search_pvt.search_params_rec;
3904 l_party_site_id		Number;
3905 
3906 x_organization_id	Number;
3907 x_subinventory_code	Varchar2(200);
3908 x_hz_location_id	Number;
3909 x_hr_location_id	Number;
3910 x_operating_unit	Number;
3911 
3912 --Bug 12642943
3913 Cursor sr_instance(p_incident_id Number) is
3914 Select customer_product_id,
3915        inventory_item_id
3916 from cs_incidents_all_b
3917 where incident_id = p_incident_id;
3918 
3919 l_sr_instance_id	Number;
3920 l_sr_inventory_item_id	Number;
3921 
3922 BEGIN
3923 
3924 
3925 
3926   --Standard Start of API Savepoint
3927   SAVEPOINT Validate_Charge_Details_PUB;
3928 
3929   --Initialize the API Return Success to True
3930   x_return_status := FND_API.G_RET_STS_SUCCESS;
3931 
3932   --DBMS_OUTPUT.PUT_LINE('BEGIN VALIDATE_CHARGE_DETAILS');
3933   --DBMS_OUTPUT.PUT_LINE('Cust_product_id is '||P_CHARGES_DETAIL_REC.customer_product_id);
3934   --DBMS_OUTPUT.PUT_LINE('Apply contract_discount '||P_CHARGES_DETAIL_REC.apply_contract_discount);
3935 
3936   --=============================
3937   --Estimate Detail ID Validation
3938   --==============================
3939   --DBMS_OUTPUT.PUT_LINE('Estimate Detail ID Validation ...');
3940 
3941   --DBMS_OUTPUT.PUT_LINE('Estimate Detail Id : '||p_charges_detail_rec.estimate_detail_id);
3942 
3943   --Check to see that estimate_detail_id is passed
3944   --If not passed the give error
3945   --If passed then validate and then
3946   --get the charges record from the database
3947 
3948   IF p_validation_mode = 'U' THEN
3949     IF p_charges_detail_rec.estimate_detail_id IS NULL OR
3950        p_charges_detail_rec.estimate_detail_id = FND_API.G_MISS_NUM THEN
3951 
3952       Add_Null_Parameter_Msg(l_api_name,
3953                              'estimate_detail_id') ;
3954 
3955       Add_Invalid_Argument_Msg(l_api_name,
3956                                TO_CHAR(p_charges_detail_rec.estimate_detail_id),
3957                                'estimate_detail_id');
3958       RAISE FND_API.G_EXC_ERROR;
3959 
3960     ELSE
3961 
3962       IF IS_ESTIMATE_DETAIL_ID_VALID(p_estimate_detail_id => p_charges_detail_rec.estimate_detail_id,
3963                                      x_msg_data           => l_msg_data,
3964                                      x_msg_count          => l_msg_count,
3965                                      x_return_status      => l_return_status) = 'U' THEN
3966 
3967         --raise unexpected error
3968         RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
3969 
3970       ELSIF IS_ESTIMATE_DETAIL_ID_VALID(p_estimate_detail_id => p_charges_detail_rec.estimate_detail_id,
3971                                      x_msg_data           => l_msg_data,
3972                                      x_msg_count          => l_msg_count,
3973                                      x_return_status      => l_return_status) = 'N' THEN
3974 
3975         Add_Invalid_Argument_Msg(l_api_name,
3976                                TO_CHAR(p_charges_detail_rec.estimate_detail_id),
3977                                'estimate_detail_id');
3978         RAISE FND_API.G_EXC_ERROR;
3979 
3980       ELSE
3981         --estimate detail id is valid
3982         --assign to out record
3983         x_charges_detail_rec.estimate_detail_id := p_charges_detail_rec.estimate_detail_id;
3984 
3985         -- Get existing Charges record for this estimate detail_id
3986         Get_Charge_Detail_Rec(p_api_name             => l_api_name_full,
3987                               p_estimate_detail_id   => p_charges_detail_rec.estimate_detail_id,
3988                               x_charge_detail_rec    => l_db_det_rec,
3989                               x_msg_data             => l_msg_data,
3990                               x_msg_count            => l_msg_count,
3991                               x_return_status        => l_return_status);
3992 
3993         IF (l_return_status = FND_API.G_RET_STS_ERROR) THEN
3994           RAISE FND_API.G_EXC_ERROR;
3995         ELSIF (l_return_status = FND_API.G_RET_STS_UNEXP_ERROR) THEN
3996           RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
3997         END IF;
3998 
3999       END IF;
4000     END IF;
4001   END IF;
4002 
4003 
4004   --========================
4005   --Incident ID Validation
4006   --========================
4007   --DBMS_OUTPUT.PUT_LINE('Incident ID Validation ...');
4008 
4009   IF p_validation_mode = 'I' THEN
4010 
4011     --If incident_id is not passed the
4012     --raise error
4013     --else validate the incident_id and assign to out record
4014     --and get the SR defaults
4015 
4016     IF p_charges_detail_rec.incident_id IS NULL THEN
4017 
4018       Add_Null_Parameter_Msg(l_api_name,
4019                              'p_incident_id') ;
4020 
4021       Add_Invalid_Argument_Msg(l_api_name,
4022                                to_char(p_charges_detail_rec.incident_id),
4023                                'incident_id');
4024       RAISE FND_API.G_EXC_ERROR;
4025 
4026     ELSE
4027       -- The incident_id IS NOT NULL
4028       l_valid_check := IS_INCIDENT_ID_VALID( p_incident_id   => p_charges_detail_rec.incident_id,
4029                                x_msg_data      => l_msg_data,
4030                                x_msg_count     => l_msg_count,
4031                                x_return_status => l_return_status);
4032 
4033       IF l_return_status = G_RET_STS_UNEXP_ERROR THEN
4034         RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
4035       ELSIF l_return_status = G_RET_STS_ERROR THEN
4036         RAISE FND_API.G_EXC_ERROR;
4037       END IF;
4038 
4039       IF l_valid_check <> 'Y' THEN
4040 
4041         Add_Invalid_Argument_Msg(l_api_name,
4042                                  to_char(p_charges_detail_rec.incident_id),
4043                                  'incident_id');
4044 
4045         RAISE FND_API.G_EXC_ERROR;
4046 
4047       ELSE
4048         -- assign it to the out record
4049         x_charges_detail_rec.incident_id := p_charges_detail_rec.incident_id;
4050 
4051         -- get the defaults from Service Request for the incident id
4052         get_sr_defaults(p_api_name              => p_api_name,
4053                         p_incident_id           => x_charges_detail_rec.incident_id,
4054                         x_business_process_id   => l_business_process_id,
4055                         x_customer_id           => l_customer_id,
4056                         x_customer_site_id      => l_customer_site_id,
4057                         x_cust_po_number        => l_cust_po_number,
4058                         x_customer_product_id   => l_cust_product_id,
4059                         x_system_id             => l_system_id,       -- Fix bug
4060                         x_inventory_item_id     => l_inventory_item_id, -- Fix bug
4061                         x_account_id            => l_account_id,
4062                         x_bill_to_party_id      => l_bill_to_party_id,
4063                         x_bill_to_account_id    => l_bill_to_account_id,
4064                         x_bill_to_contact_id    => l_bill_to_contact_id,
4065                         x_bill_to_site_id       => l_bill_to_site_id,
4066                         x_ship_to_party_id      => l_ship_to_party_id,
4067                         x_ship_to_account_id    => l_ship_to_account_id,
4068                         x_ship_to_contact_id    => l_ship_to_contact_id,
4069                         x_ship_to_site_id       => l_ship_to_site_id,
4070                         x_contract_id           => l_contract_id,
4071                         x_contract_service_id   => l_contract_service_id,
4072                         x_incident_date         => l_incident_date,
4073                         x_creation_date         => l_creation_date,
4074                         x_msg_data              => l_msg_data,
4075                         x_msg_count             => l_msg_count,
4076                         x_return_status         => l_return_status);
4077 
4078         --DBMS_OUTPUT.PUT_LINE('Back from GET_SR_DEFAULTS l_bill_to_party_id '||l_bill_to_party_id);
4079         --DBMS_OUTPUT.PUT_LINE('Back from GET_SR_DEFAULTS l_ship_to_party_id '||l_ship_to_party_id);
4080 
4081         IF l_return_status <> FND_API.G_RET_STS_SUCCESS THEN
4082           RAISE FND_API.G_EXC_ERROR ;
4083         END IF;
4084 
4085         --DBMS_OUTPUT.PUT_LINE('l_incident_date '||l_incident_date);
4086         --DBMS_OUTPUT.PUT_LINE('l_creation_date '||l_creation_date);
4087 
4088       END IF;
4089     END IF;
4090   END IF;
4091 
4092   -- This needs to be merged with the above validation
4093 
4094   IF p_validation_mode = 'U' THEN
4095 
4096      --DBMS_OUTPUT.PUT_LINE('Incident_id '||l_db_det_rec.incident_id);
4097      -- Incident Id cannot be changed, assign from the database
4098 
4099       x_charges_detail_rec.incident_id := l_db_det_rec.incident_id;
4100 
4101       -- get the defaults from Service Request for the incident id
4102       get_sr_defaults(p_api_name              => p_api_name,
4103                       p_incident_id           => x_charges_detail_rec.incident_id,
4104                       x_business_process_id   => l_business_process_id,
4105                       x_customer_id           => l_customer_id,
4106                       x_customer_site_id      => l_customer_site_id,
4107                       x_cust_po_number        => l_cust_po_number,
4108                       x_customer_product_id   => l_cust_product_id,
4109                       x_system_id             => l_system_id,         -- Fix bug
4110                       x_inventory_item_id     => l_inventory_item_id, -- Fix bug
4111                       x_account_id            => l_account_id,
4112                       x_bill_to_party_id      => l_bill_to_party_id,
4113                       x_bill_to_account_id    => l_bill_to_account_id,
4114                       x_bill_to_contact_id    => l_bill_to_contact_id,
4115                       x_bill_to_site_id       => l_bill_to_site_id,
4116                       x_ship_to_party_id      => l_ship_to_party_id,
4117                       x_ship_to_account_id    => l_ship_to_account_id,
4118                       x_ship_to_contact_id    => l_ship_to_contact_id,
4119                       x_ship_to_site_id       => l_ship_to_site_id,
4120                       x_contract_id           => l_contract_id,
4121                       x_contract_service_id   => l_contract_service_id,
4122                       x_incident_date         => l_incident_date,
4123                       x_creation_date         => l_creation_date,
4124                       x_msg_data              => l_msg_data,
4125                       x_msg_count             => l_msg_count,
4126                       x_return_status         => l_return_status
4127                       );
4128 
4129       --DBMS_OUTPUT.PUT_LINE('business_process_id'||l_business_process_id);
4130       --DBMS_OUTPUT.PUT_LINE('customer_id'||l_customer_id);
4131       --DBMS_OUTPUT.PUT_LINE('customer_site_id'||l_customer_site_id);
4132       --DBMS_OUTPUT.PUT_LINE('cust_po_number'||l_cust_po_number);
4133       --DBMS_OUTPUT.PUT_LINE('customer_product_id'||l_cust_product_id);
4134       --DBMS_OUTPUT.PUT_LINE('account_id'||l_account_id);
4135       --DBMS_OUTPUT.PUT_LINE('bill_to_party_id'|| l_bill_to_party_id);
4136       --DBMS_OUTPUT.PUT_LINE('bill_to_account_id'||l_bill_to_account_id);
4137       --DBMS_OUTPUT.PUT_LINE('bill_to_contact_id'||l_bill_to_contact_id);
4138       --DBMS_OUTPUT.PUT_LINE('bill_to_site_id'||l_bill_to_site_id);
4139       --DBMS_OUTPUT.PUT_LINE('ship_to_party_id'||l_ship_to_account_id);
4140       --DBMS_OUTPUT.PUT_LINE('ship_to_account_id'||l_ship_to_account_id);
4141       --DBMS_OUTPUT.PUT_LINE('ship_to_contact_id'||l_ship_to_contact_id);
4142       --DBMS_OUTPUT.PUT_LINE('ship_to_site_id'||l_ship_to_site_id);
4143       --DBMS_OUTPUT.PUT_LINE('contract_id'||l_contract_id);
4144       --DBMS_OUTPUT.PUT_LINE('contract_service_id'||l_contract_service_id);
4145       --DBMS_OUTPUT.PUT_LINE('msg_data'||l_msg_data);
4146       --DBMS_OUTPUT.PUT_LINE('msg_count'|| l_msg_count);
4147       --DBMS_OUTPUT.PUT_LINE('return_status'||l_return_status);
4148 
4149 
4150       IF l_return_status <> FND_API.G_RET_STS_SUCCESS THEN
4151         RAISE FND_API.G_EXC_ERROR ;
4152       END IF;
4153 
4154   ELSE
4155 
4156     null;
4157 
4158   END IF;
4159 
4160  --===================================================
4161  -- Get the disallow_new_charge_flag and
4162  -- disallow_charge_update_flag for the incident_id
4163  --===================================================
4164 
4165  --DBMS_OUTPUT.PUT_LINE('getting status form SR');
4166  --Bug Fix for Bug # 3086455
4167  get_charge_flags_from_sr(p_api_name               => p_api_name,
4168                           p_incident_id            => x_charges_detail_rec.incident_id,
4169                           x_disallow_new_charge    => l_disallow_new_charge,
4170                           x_disallow_charge_update => l_disallow_charge_update,
4171                           x_msg_data               => l_msg_data,
4172                           x_msg_count              => l_msg_count,
4173                           x_return_status          => l_return_status
4174                           );
4175 
4176  --DBMS_OUTPUT.PUT_LINE('l_disallow_new_charge is '||l_disallow_new_charge);
4177  --DBMS_OUTPUT.PUT_LINE('l_disallow_charge_update is '||l_disallow_charge_update);
4178 
4179  IF p_validation_mode = 'I' THEN
4180    IF l_disallow_new_charge  = 'Y' THEN
4181      --DBMS_OUTPUT.PUT_LINE('l_disallow_new_charge is '||l_disallow_new_charge);
4182      --raise error
4183      FND_MESSAGE.SET_NAME('CS', 'CS_CHG_CANNOT_INSERT');
4184      FND_MSG_PUB.ADD;
4185      RAISE FND_API.G_EXC_ERROR;
4186    END IF;
4187  ELSIF p_validation_mode = 'U' THEN
4188    IF l_disallow_charge_update = 'Y' THEN
4189      --raise error
4190      FND_MESSAGE.SET_NAME('CS', 'CS_CHG_CANNOT_UPDATE');
4191      FND_MSG_PUB.ADD;
4192      RAISE FND_API.G_EXC_ERROR;
4193    END IF;
4194  END IF;
4195 
4196 
4197  --===================================================
4198  --Assign values to columns that don't need validation
4199  --mviswana need to verify and change this
4200  --===================================================
4201 
4202   --DBMS_OUTPUT.PUT_LINE('Assign values to columns that do not need validation ...');
4203 
4204   IF p_validation_mode = 'I' THEN
4205 
4206     --IF p_charges_detail_rec.interface_to_oe_flag IS NOT NULL THEN
4207     --  x_charges_detail_rec.interface_to_oe_flag := p_charges_detail_rec.interface_to_oe_flag;
4208     --ELSE
4209     --  x_charges_detail_rec.interface_to_oe_flag := 'Y';
4210     --END IF;
4211 
4212     -- Added for Bug # 5135284
4213     IF p_charges_detail_rec.rollup_flag IS NOT NULL AND
4214        p_charges_detail_rec.rollup_flag IN ('Y', 'N') THEN
4215       x_charges_detail_rec.rollup_flag := p_charges_detail_rec.rollup_flag;
4216     ELSE
4217       x_charges_detail_rec.rollup_flag := 'N';
4218     END IF;
4219 
4220     -- Added for Bug # 5135284
4221     -- commenting for now
4222     IF p_charges_detail_rec.add_to_order_flag IS NOT NULL AND
4223        p_charges_detail_rec.add_to_order_flag IN ('Y', 'N', 'F') THEN
4224       x_charges_detail_rec.add_to_order_flag := p_charges_detail_rec.add_to_order_flag;
4225     ELSE
4226       x_charges_detail_rec.add_to_order_flag := 'N';
4227     END IF;
4228 
4229     IF p_charges_detail_rec.apply_contract_discount IS NULL THEN
4230       x_charges_detail_rec.apply_contract_discount := 'N';
4231     ELSE
4232       x_charges_detail_rec.apply_contract_discount := p_charges_detail_rec.apply_contract_discount;
4233     END IF;
4234 
4235     x_charges_detail_rec.estimate_detail_id          := NULL;
4236     x_charges_detail_rec.order_line_id               := NULL;
4237     x_charges_detail_rec.coverage_bill_rate_id       := p_charges_detail_rec.coverage_bill_rate_id;
4238     x_charges_detail_rec.transaction_sub_inventory   := p_charges_detail_rec.transaction_sub_inventory;
4239     x_charges_detail_rec.submit_restriction_message  := p_charges_detail_rec.submit_restriction_message;
4240     x_charges_detail_rec.submit_error_message        := p_charges_detail_rec.submit_error_message;
4241     x_charges_detail_rec.submit_from_system          := p_charges_detail_rec.submit_from_system;
4242 
4243 
4244     --DBMS_OUTPUT.PUT_LINE('ORDER_LINE_ID IS '||x_charges_detail_rec.order_line_id);
4245 
4246   ELSIF p_validation_mode = 'U' THEN
4247 
4248     --Resolve Bug # 3078244
4249     --Resolve Bug # 3084879
4250 
4251     --DBMS_OUTPUT.PUT_LINE(' In Update Validation');
4252     --DBMS_OUTPUT.PUT_LINE(' p_charges_detail_rec.add_to_order_flag '||p_charges_detail_rec.add_to_order_flag );
4253     --DBMS_OUTPUT.PUT_LINE(' p_charges_detail_rec.coverage_bill_rate_id '||p_charges_detail_rec.coverage_bill_rate_id);
4254     --DBMS_OUTPUT.PUT_LINE(' p_charges_detail_rec.transaction_sub_inventory '||p_charges_detail_rec.transaction_sub_inventory);
4255 
4256     -- Check to see if add_to_order_flag is passed
4257     -- If not passed then assign from database
4258     -- If passed as null then assign 'N'
4259     -- If passed then assign to the out parameter
4260 
4261     IF p_charges_detail_rec.add_to_order_flag = FND_API.G_MISS_CHAR THEN
4262       x_charges_detail_rec.add_to_order_flag :=  l_db_det_rec.add_to_order_flag;
4263     ELSIF p_charges_detail_rec.add_to_order_flag IS NULL THEN
4264       x_charges_detail_rec.add_to_order_flag :=  'N';
4265     ELSE
4266       -- Added for Bug # 5135284
4267       IF p_charges_detail_rec.add_to_order_flag IN ('Y', 'N', 'F') THEN
4268         x_charges_detail_rec.add_to_order_flag :=  p_charges_detail_rec.add_to_order_flag;
4269       ELSE
4270         x_charges_detail_rec.add_to_order_flag :=  'N';
4271       END IF;
4272     END IF;
4273 
4274     --DBMS_OUTPUT.PUT_LINE('x_charges_detail_rec.add_to_order_flag'||x_charges_detail_rec.add_to_order_flag);
4275 
4276     -- Check to see if coverage_bill_rate_id is passed
4277     -- If not passed then assign from database
4278     -- If passed as null then assign NULL
4279     -- If passed then assign to the out parameter
4280 
4281     IF p_charges_detail_rec.coverage_bill_rate_id = FND_API.G_MISS_NUM THEN
4282       x_charges_detail_rec.coverage_bill_rate_id :=  l_db_det_rec.coverage_bill_rate_id;
4283     ELSIF p_charges_detail_rec.coverage_bill_rate_id IS NULL THEN
4284       x_charges_detail_rec.coverage_bill_rate_id :=  null;
4285     ELSE
4286       x_charges_detail_rec.coverage_bill_rate_id :=  p_charges_detail_rec.coverage_bill_rate_id;
4287     END IF;
4288 
4289     --DBMS_OUTPUT.PUT_LINE('x_charges_detail_rec.coverage_bill_rate_id'||x_charges_detail_rec.coverage_bill_rate_id);
4290 
4291     -- Check to see if transaction_sub_inventory is passed
4292     -- If not passed then assign from database
4293     -- If passed as null then assign NULL
4294     -- If passed then assign to the out parameter
4295 
4296     IF p_charges_detail_rec.transaction_sub_inventory = FND_API.G_MISS_CHAR THEN
4297       x_charges_detail_rec.transaction_sub_inventory :=  l_db_det_rec.transaction_sub_inventory;
4298     ELSIF p_charges_detail_rec.transaction_sub_inventory IS NULL THEN
4299       x_charges_detail_rec.transaction_sub_inventory :=  null;
4300     ELSE
4301       x_charges_detail_rec.transaction_sub_inventory :=  p_charges_detail_rec.transaction_sub_inventory;
4302     END IF;
4303 
4304 
4305     --DBMS_OUTPUT.PUT_LINE(' x_charges_detail_rec.transaction_sub_inventory '|| x_charges_detail_rec.transaction_sub_inventory);
4306 
4307     -- Check to see if interface_to_oe_flag is passed
4308     -- If not passed then assign from database
4309     -- If passed as null then assign NULL
4310     -- If passed then assign to the out parameter
4311 
4312     --IF p_charges_detail_rec.interface_to_oe_flag = FND_API.G_MISS_CHAR THEN
4313     --  x_charges_detail_rec.interface_to_oe_flag :=  l_db_det_rec.interface_to_oe_flag;
4314     --ELSIF p_charges_detail_rec.interface_to_oe_flag IS NULL THEN
4315     --  x_charges_detail_rec.interface_to_oe_flag :=  'N';
4316     --ELSE
4317     --  x_charges_detail_rec.interface_to_oe_flag :=  p_charges_detail_rec.interface_to_oe_flag;
4318     --END IF;
4319 
4320     --DBMS_OUTPUT.PUT_LINE(' x_charges_detail_rec.interface_to_oe_flag '||x_charges_detail_rec.interface_to_oe_flag);
4321 
4322     -- Check to see if apply_contract_discount is passed
4323     -- If not passed then assign from database
4324     -- If passed as null then assign NULL
4325     -- If passed then assign to the out parameter
4326 
4327     IF p_charges_detail_rec.apply_contract_discount = FND_API.G_MISS_CHAR OR
4328        p_charges_detail_rec.apply_contract_discount IS NULL THEN
4329        x_charges_detail_rec.apply_contract_discount := 'N';
4330     ELSE
4331       x_charges_detail_rec.apply_contract_discount := p_charges_detail_rec.apply_contract_discount;
4332     END IF;
4333 
4334     --DBMS_OUTPUT.PUT_LINE('x_charges_detail_rec.apply_contract_discount'||x_charges_detail_rec.apply_contract_discount);
4335 
4336     -- Check to see if con_pct_over_list_price is passed
4337     -- If not passed then OR
4338     -- If passed as null then assign NULL
4339     -- If passed then assign to the out parameter
4340 
4341     IF p_charges_detail_rec.con_pct_over_list_price = FND_API.G_MISS_NUM OR
4342        p_charges_detail_rec.con_pct_over_list_price IS NULL THEN
4343        x_charges_detail_rec.con_pct_over_list_price := NULL;
4344     ELSE
4345       x_charges_detail_rec.con_pct_over_list_price  := p_charges_detail_rec.con_pct_over_list_price;
4346     END IF;
4347 
4348     x_charges_detail_rec.order_line_id := l_db_det_rec.order_line_id;
4349 
4350     -- Check to see if submit_restriction_message is passed
4351     -- If not passed then assign the value in the database
4352     -- If passed as NULL then assign NULL
4353     -- If passed then assign to out parameter
4354 
4355     IF p_charges_detail_rec.submit_restriction_message = FND_API.G_MISS_CHAR THEN
4356       x_charges_detail_rec.submit_restriction_message :=  l_db_det_rec.submit_restriction_message;
4357     ELSIF p_charges_detail_rec.submit_restriction_message IS NULL THEN
4358       x_charges_detail_rec.submit_restriction_message :=  NULL;
4359     ELSE
4360       x_charges_detail_rec.submit_restriction_message :=  p_charges_detail_rec.submit_restriction_message;
4361     END IF;
4362 
4363     -- Check to see if submit_error_message is passed
4364     -- If not passed then assign the value in the database
4365     -- If passed as NULL then assign NULL
4366     -- If passed then assign to out parameter
4367 
4368     IF p_charges_detail_rec.submit_error_message = FND_API.G_MISS_CHAR THEN
4369       x_charges_detail_rec.submit_error_message :=  l_db_det_rec.submit_error_message;
4370     ELSIF p_charges_detail_rec.submit_error_message IS NULL THEN
4371       x_charges_detail_rec.submit_error_message :=  NULL;
4372     ELSE
4373       x_charges_detail_rec.submit_error_message :=  p_charges_detail_rec.submit_error_message;
4374     END IF;
4375 
4376     -- Check to see if submit_from_system  is passed
4377     -- If not passed then assign the value in the database
4378     -- If passed as NULL then assign NULL
4379     -- If passed then assign to out parameter
4380 
4381     IF p_charges_detail_rec.submit_from_system = FND_API.G_MISS_CHAR THEN
4382       x_charges_detail_rec.submit_from_system :=  l_db_det_rec.submit_from_system;
4383     ELSIF p_charges_detail_rec.submit_from_system IS NULL THEN
4384       x_charges_detail_rec.submit_from_system :=  NULL;
4385     ELSE
4386       x_charges_detail_rec.submit_from_system :=  p_charges_detail_rec.submit_from_system;
4387     END IF;
4388 
4389   END IF;
4390 
4391 --=====================================
4392 -- Validate the Org_id Passed
4393 --====================================
4394 
4395   -- Get Org ID from Source for Incident ID
4396   --   CS_Multiorg_PVT.Get_OrgId(
4397   --                P_API_VERSION    => 1.2,
4398   --                P_INIT_MSG_LIST  => FND_API.G_FALSE,
4399   --                X_RETURN_STATUS  => l_return_status,
4400   --                X_MSG_COUNT      => l_msg_count,
4401   --                X_MSG_DATA       => l_msg_data,
4402   --                P_INCIDENT_ID    => p_charges_detail_rec.incident_id,
4403   --                X_ORG_ID         => l_org_id,
4404   --                X_PROFILE        => l_profile);
4405 
4406   -- -- --DBMS_OUTPUT.PUT_LINE('Back from CS_Multiorg_PVT.Get_OrgId '||l_return_status);
4407   -- -- --DBMS_OUTPUT.PUT_LINE('X Profile '||l_profile);
4408   -- -- --DBMS_OUTPUT.PUT_LINE('l_org_id '||l_org_id);
4409 
4410 
4411   -- Get Org ID from Source for Incident ID
4412   -- Call CS_MultiOrg_PUB.Get_OrgID
4413   -- This uses the new multi org public API
4414   --
4415   CS_Multiorg_PUB.Get_OrgId(
4416                 P_API_VERSION       => 1.0,
4417                 P_INIT_MSG_LIST     => FND_API.G_FALSE,
4418                 -- Fix bug 3236597 P_COMMIT            => 'T',
4419                 P_COMMIT            => 'F',  -- Fix bug 3236597
4420                 P_VALIDATION_LEVEL  => FND_API.G_VALID_LEVEL_FULL,
4421                 X_RETURN_STATUS     => l_return_status,
4422                 X_MSG_COUNT         => l_msg_count,
4423                 X_MSG_DATA          => l_msg_data,
4424                 P_INCIDENT_ID       => p_charges_detail_rec.incident_id,
4425                 X_ORG_ID            => l_org_id,
4426                 X_PROFILE           => l_profile);
4427 
4428   --DBMS_OUTPUT.PUT_LINE('Back from CS_Multiorg_PVT.Get_OrgId '||l_return_status);
4429   --DBMS_OUTPUT.PUT_LINE('X Profile '||l_profile);
4430   --DBMS_OUTPUT.PUT_LINE('l_org_id '||l_org_id);
4431 
4432 
4433   IF l_return_status <> FND_API.G_RET_STS_SUCCESS THEN
4434     RAISE FND_API.G_EXC_ERROR ;
4435   END IF;
4436 
4437   IF p_validation_mode = 'I' THEN
4438     IF l_profile = 'Y' THEN
4439       IF p_charges_detail_rec.org_id IS NOT NULL THEN
4440         VALIDATE_ORG_ID(
4441                   P_API_NAME       => l_api_name,
4442                   P_ORG_ID         => p_charges_detail_rec.org_id,
4443                   X_RETURN_STATUS  => l_return_status,
4444                   X_MSG_COUNT      => l_msg_count,
4445                   X_MSG_DATA       => l_msg_data);
4446 
4447         IF l_return_status <> FND_API.G_RET_STS_SUCCESS THEN
4448           RAISE FND_API.G_EXC_ERROR ;
4449         END IF;
4450         x_charges_detail_rec.org_id := p_charges_detail_rec.org_id;
4451       ELSE
4452         --use the default
4453         x_charges_detail_rec.org_id := l_org_id;
4454       END IF;
4455     ELSE
4456       -- l_profile = 'N'
4457 
4458       IF p_charges_detail_rec.org_id IS NOT NULL THEN
4459         IF p_charges_detail_rec.org_id <> l_org_id THEN
4460           --raise error
4461           --Need to define error here
4462           FND_MESSAGE.SET_NAME('CS', 'CS_CHG_CANNOT_CHANGE_OU');
4463           FND_MESSAGE.SET_TOKEN('API_NAME', p_api_name);
4464           FND_MSG_PUB.ADD;
4465           RAISE FND_API.G_EXC_ERROR;
4466         ELSE
4467           x_charges_detail_rec.org_id := p_charges_detail_rec.org_id;
4468         END IF;
4469       ELSE
4470         --p_charges_detail_rec.org_id IS NULL
4471         --assign default
4472         x_charges_detail_rec.org_id := l_org_id;
4473       END IF;
4474     END IF;
4475 
4476   ELSIF p_validation_mode = 'U' THEN
4477     -- Get Org ID from Source for Incident ID
4478     -- Resolve Bug # 3078244
4479 
4480     IF l_profile = 'Y' THEN
4481 
4482       -- If l_profile = 'Y' THEN if org_id is not passed
4483       -- or org_id is null then assign the value from the database
4484       -- else if passed then validate the org_id and if valid then
4485       -- assign the value to the out parameter
4486 
4487       IF p_charges_detail_rec.org_id = FND_API.G_MISS_NUM OR
4488          p_charges_detail_rec.org_id IS NULL THEN
4489          --use the value from the database
4490          x_charges_detail_rec.org_id := l_db_det_rec.org_id;
4491 
4492       ELSE
4493         VALIDATE_ORG_ID(
4494                   P_API_NAME       => l_api_name,
4495                   P_ORG_ID         => p_charges_detail_rec.org_id,
4496                   X_RETURN_STATUS  => l_return_status,
4497                   X_MSG_COUNT      => l_msg_count,
4498                   X_MSG_DATA       => l_msg_data);
4499 
4500         IF l_return_status <> FND_API.G_RET_STS_SUCCESS THEN
4501           RAISE FND_API.G_EXC_ERROR ;
4502         END IF;
4503         x_charges_detail_rec.org_id := p_charges_detail_rec.org_id;
4504 
4505       END IF;
4506 
4507     ELSE
4508       -- l_profile = 'N'
4509       -- If l_profile = 'N' THEN if org_id is not passed
4510       -- or org_id is null then assign the value from the database
4511       -- else if passed then validate the org_id and if valid then
4512       -- assign the value to the out parameter
4513 
4514       IF p_charges_detail_rec.org_id = FND_API.G_MISS_NUM OR
4515          p_charges_detail_rec.org_id IS NULL THEN
4516         --use the value from the database
4517         x_charges_detail_rec.org_id := l_db_det_rec.org_id;
4518 
4519       ELSE
4520         IF p_charges_detail_rec.org_id <> l_db_det_rec.org_id THEN
4521           --raise error
4522           FND_MESSAGE.SET_NAME('CS', 'CS_CHG_CANNOT_CHANGE_OU');
4523           FND_MESSAGE.SET_TOKEN('API_NAME', p_api_name);
4524           FND_MSG_PUB.ADD;
4525           RAISE FND_API.G_EXC_ERROR;
4526         ELSE
4527           x_charges_detail_rec.org_id := p_charges_detail_rec.org_id;
4528         END IF;
4529       END IF;
4530     END IF;
4531   END IF;
4532 
4533   --DBMS_OUTPUT.PUT_LINE('org_id '||x_charges_detail_rec.org_id);
4534 
4535 --=====================================
4536 --Validate Original Source
4537 --=====================================
4538   --DBMS_OUTPUT.PUT_LINE('Validate Original Source ...');
4539   IF p_validation_mode = 'I' THEN
4540     IF (p_charges_detail_rec.original_source_code IS NULL) OR (p_charges_detail_rec.original_source_id IS NULL) THEN
4541 
4542       FND_MESSAGE.SET_NAME('CS', 'CS_CHG_INVALID_ORIGINAL_SOURCE');
4543       FND_MESSAGE.SET_TOKEN('ORIG_SOURCE_ID', p_charges_detail_rec.original_source_id);
4544       FND_MESSAGE.SET_TOKEN('ORIG_SOURCE_CODE', p_charges_detail_rec.original_source_code);
4545       FND_MSG_PUB.ADD;
4546       RAISE FND_API.G_EXC_ERROR;
4547 
4548     ELSE
4549       VALIDATE_SOURCE(
4550                 P_API_NAME         => p_api_name,
4551                 P_SOURCE_CODE      => p_charges_detail_rec.original_source_code,
4552                 P_SOURCE_ID        => p_charges_detail_rec.original_source_id,
4553                 P_ORG_ID           => x_charges_detail_rec.org_id,
4554                 X_SOURCE_ID        => l_source_id,
4555                 X_MSG_DATA         => l_msg_data,
4556                 X_MSG_COUNT        => l_msg_count,
4557                 X_RETURN_STATUS    => l_return_status) ;
4558 
4559       --DBMS_OUTPUT.PUT_LINE('Back from VALIDATE_SOURCE for ORIG SOURCE '||l_return_status);
4560 
4561       --IF l_return_status <> 'S' THEN
4562       IF l_return_status <> FND_API.G_RET_STS_SUCCESS THEN
4563         --raise error
4564         FND_MESSAGE.SET_NAME('CS', 'CS_CHG_INVALID_ORIGINAL_SOURCE');
4565         FND_MESSAGE.SET_TOKEN('ORIG_SOURCE_ID', p_charges_detail_rec.original_source_id);
4566         FND_MESSAGE.SET_TOKEN('ORIG_SOURCE_CODE', p_charges_detail_rec.original_source_code);
4567         FND_MSG_PUB.ADD;
4568         RAISE FND_API.G_EXC_ERROR;
4569       END IF;
4570 
4571       -- assign to out record
4572       x_charges_detail_rec.original_source_code := p_charges_detail_rec.original_source_code;
4573       x_charges_detail_rec.original_source_id := p_charges_detail_rec.original_source_id;
4574 
4575     END IF;
4576 
4577 
4578     IF (p_charges_detail_rec.source_code IS NOT NULL) AND (p_charges_detail_rec.source_id IS NOT NULL) THEN
4579       -- Call the Validate Source Procedure
4580 
4581       --DBMS_OUTPUT.PUT_LINE('source '||p_charges_detail_rec.source_code);
4582       --DBMS_OUTPUT.PUT_LINE('p_charges_detail_rec.source_id'||p_charges_detail_rec.source_id);
4583 
4584       VALIDATE_SOURCE(
4585            P_API_NAME         => p_api_name,
4586            P_SOURCE_CODE      => p_charges_detail_rec.source_code,
4587            P_SOURCE_ID        => p_charges_detail_rec.source_id,
4588            --P_ORG_ID         => l_org_id,
4589            P_ORG_ID           => x_charges_detail_rec.org_id,
4590            X_SOURCE_ID        => l_source_id,
4591            X_MSG_DATA         => l_msg_data,
4592            X_MSG_COUNT        => l_msg_count,
4593            X_RETURN_STATUS    => l_return_status) ;
4594 
4595       --DBMS_OUTPUT.PUT_LINE('Back from VALIDATE_SOURCE for SOURCE '||l_return_status);
4596 
4597       IF l_return_status <> FND_API.G_RET_STS_SUCCESS THEN
4598         RAISE FND_API.G_EXC_ERROR ;
4599       END IF;
4600 
4601       --assign the values source_code, source_id to out record
4602       x_charges_detail_rec.source_code := p_charges_detail_rec.source_code;
4603       x_charges_detail_rec.source_id   := p_charges_detail_rec.source_id;
4604 
4605     ELSE
4606       --Default using original source code and original source id
4607       --assign the values source_code, source_id to out record
4608       x_charges_detail_rec.source_code := p_charges_detail_rec.original_source_code;
4609       x_charges_detail_rec.source_id   := p_charges_detail_rec.original_source_id;
4610 
4611     END IF;
4612 
4613   ELSIF p_validation_mode = 'U' THEN
4614 
4615     -- assign attributes from db record for original source id and
4616     -- original source code as both cannot be changed
4617     x_charges_detail_rec.original_source_id := l_db_det_rec.original_source_id;
4618     x_charges_detail_rec.original_source_code := l_db_det_rec.original_source_code;
4619 
4620 
4621 
4622     IF p_charges_detail_rec.source_code  = FND_API.G_MISS_CHAR OR
4623        p_charges_detail_rec.source_code IS NULL AND
4624        p_charges_detail_rec.source_id = FND_API.G_MISS_NUM OR
4625        p_charges_detail_rec.source_id IS NULL THEN
4626 
4627        --Default attributes using db record
4628        x_charges_detail_rec.source_code := l_db_det_rec.source_code;
4629        x_charges_detail_rec.source_id   := l_db_det_rec.source_id;
4630 
4631     ELSE
4632 
4633         VALIDATE_SOURCE(
4634            P_API_NAME         => p_api_name,
4635            P_SOURCE_CODE      => p_charges_detail_rec.source_code,
4636            P_SOURCE_ID        => p_charges_detail_rec.source_id,
4637            --P_ORG_ID         => l_org_id,
4638            P_ORG_ID           => x_charges_detail_rec.org_id,
4639            X_SOURCE_ID        => l_source_id,
4640            X_MSG_DATA         => l_msg_data,
4641            X_MSG_COUNT        => l_msg_count,
4642            X_RETURN_STATUS    => l_return_status) ;
4643 
4644         --DBMS_OUTPUT.PUT_LINE('Back from VALIDATE_SOURCE for SOURCE '||l_return_status);
4645 
4646         IF l_return_status <> FND_API.G_RET_STS_SUCCESS THEN
4647           RAISE FND_API.G_EXC_ERROR ;
4648         END IF;
4649 
4650         --assign the values source_code, source_id to out record
4651         x_charges_detail_rec.source_code := p_charges_detail_rec.source_code;
4652         x_charges_detail_rec.source_id   := p_charges_detail_rec.source_id;
4653 
4654     END IF;
4655 
4656   END IF;
4657 
4658   --DBMS_OUTPUT.PUT_LINE('Completed Source ID and Source Code Validation');
4659 
4660 --================================================================
4661 -- For Update Only
4662 -- Estimate Detail Record cannot be updated based
4663 -- on certain restrictions
4664 -- If order lines exist for the record then we cannot update line
4665 -- If the line is generated by billing engine then we cannot
4666 -- update anything other than the after_warranty_cost
4667 --================================================================
4668   IF p_validation_mode = 'U' THEN
4669 
4670     --Bug Fix for Bug # 2878503
4671 
4672     IF l_db_det_rec.order_line_id IS NOT NULL THEN
4673       l_in_oe_flag  := 'Y' ;
4674     ELSE
4675       l_in_oe_flag := 'N' ;
4676     END IF ;
4677 
4678     --DBMS_OUTPUT.PUT_LINE('l_in_oe_flag '||l_in_oe_flag);
4679 
4680     IF l_in_oe_flag = 'Y' THEN
4681 
4682       --DBMS_OUTPUT.PUT_LINE(' l_db_det_rec.original_source_code '||l_db_det_rec.original_source_code);
4683       --DBMS_OUTPUT.PUT_LINE(' p_charges_detail_rec.source_code '||p_charges_detail_rec.source_code);
4684 
4685       -- If the Charge Line is Interfaced to OM the upstream can only change the
4686       -- source code from SR to DR and vice versa
4687       -- everything else is not updateable
4688 
4689       IF  l_db_det_rec.original_source_code IN ('SR', 'DR') AND
4690           p_charges_detail_rec.source_code <> FND_API.G_MISS_CHAR AND
4691           p_charges_detail_rec.source_code IS NOT NULL AND
4692           p_charges_detail_rec.source_code IN ('DR', 'SR') THEN
4693 
4694           --DBMS_OUTPUT.PUT_LINE(' Calling validate_source');
4695 
4696             VALIDATE_SOURCE(
4697                 P_API_NAME         => p_api_name,
4698                 P_SOURCE_CODE      => p_charges_detail_rec.original_source_code,
4699                 P_SOURCE_ID        => p_charges_detail_rec.original_source_id,
4700                 P_ORG_ID           => x_charges_detail_rec.org_id,
4701                 X_SOURCE_ID        => l_source_id,
4702                 X_MSG_DATA         => l_msg_data,
4703                 X_MSG_COUNT        => l_msg_count,
4704                 X_RETURN_STATUS    => l_return_status) ;
4705 
4706             IF (l_return_status = FND_API.G_RET_STS_ERROR) THEN
4707               RAISE FND_API.G_EXC_ERROR;
4708             ELSIF (l_return_status = FND_API.G_RET_STS_UNEXP_ERROR) THEN
4709               RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
4710             END IF;
4711 
4712             --DBMS_OUTPUT.PUT_LINE(' l_source_id '||l_source_id);
4713 
4714             x_charges_detail_rec.source_id := l_source_id ;
4715             x_charges_detail_rec.source_code := p_charges_detail_rec.source_code ;
4716 
4717       ELSE
4718         --DBMS_OUTPUT.PUT_LINE('Coming to the else');
4719         FND_MESSAGE.Set_Name('CS', 'CS_CHG_CANNOT_UPDATE_CHRG_LINE');
4720         FND_MSG_PUB.Add;
4721         RAISE FND_API.G_EXC_ERROR;
4722       END IF;
4723 
4724       IF (p_charges_detail_rec.charge_line_type                <> FND_API.G_MISS_CHAR OR
4725           p_charges_detail_rec.line_number                     <> FND_API.G_MISS_NUM OR
4726           p_charges_detail_rec.business_process_id             <> FND_API.G_MISS_NUM  OR
4727           p_charges_detail_rec.transaction_type_id             <> FND_API.G_MISS_NUM  OR
4728           p_charges_detail_rec.inventory_item_id_in            <> FND_API.G_MISS_NUM  OR
4729           p_charges_detail_rec.item_revision                   <> FND_API.G_MISS_CHAR OR
4730           p_charges_detail_rec.billing_flag                    <> FND_API.G_MISS_CHAR OR
4731           p_charges_detail_rec.txn_billing_type_id             <> FND_API.G_MISS_NUM  OR
4732           p_charges_detail_rec.unit_of_measure_code            <> FND_API.G_MISS_CHAR OR
4733           p_charges_detail_rec.quantity_required               <> FND_API.G_MISS_NUM  OR
4734           p_charges_detail_rec.return_reason_code              <> FND_API.G_MISS_CHAR OR
4735           p_charges_detail_rec.customer_product_id             <> FND_API.G_MISS_NUM  OR
4736           p_charges_detail_rec.serial_number                   <> FND_API.G_MISS_CHAR OR
4737           p_charges_detail_rec.installed_cp_return_by_date     <> FND_API.G_MISS_DATE OR
4738           p_charges_detail_rec.new_cp_return_by_date           <> FND_API.G_MISS_DATE OR
4739           p_charges_detail_rec.sold_to_party_id                <> FND_API.G_MISS_NUM  OR
4740           p_charges_detail_rec.bill_to_party_id                <> FND_API.G_MISS_NUM  OR
4741           p_charges_detail_rec.bill_to_account_id              <> FND_API.G_MISS_NUM  OR
4742           p_charges_detail_rec.bill_to_contact_id              <> FND_API.G_MISS_NUM  OR
4743           p_charges_detail_rec.invoice_to_org_id               <> FND_API.G_MISS_NUM  OR
4744           p_charges_detail_rec.ship_to_party_id                <> FND_API.G_MISS_NUM  OR
4745           p_charges_detail_rec.ship_to_account_id              <> FND_API.G_MISS_NUM  OR
4746           p_charges_detail_rec.ship_to_contact_id              <> FND_API.G_MISS_NUM  OR
4747           p_charges_detail_rec.ship_to_org_id                  <> FND_API.G_MISS_NUM  OR
4748           p_charges_detail_rec.contract_id                     <> FND_API.G_MISS_NUM  OR
4749           p_charges_detail_rec.contract_line_id                <> FND_API.G_MISS_NUM  OR
4750           p_charges_detail_rec.coverage_id                     <> FND_API.G_MISS_NUM  OR
4751           p_charges_detail_rec.coverage_txn_group_id           <> FND_API.G_MISS_NUM  OR
4752           p_charges_detail_rec.coverage_bill_rate_id           <> FND_API.G_MISS_NUM  OR
4753           p_charges_detail_rec.coverage_billing_type_id        <> FND_API.G_MISS_NUM  OR
4754           p_charges_detail_rec.price_list_id                   <> FND_API.G_MISS_NUM  OR
4755           p_charges_detail_rec.currency_code                   <> FND_API.G_MISS_CHAR OR
4756           p_charges_detail_rec.purchase_order_num              <> FND_API.G_MISS_CHAR OR
4757           p_charges_detail_rec.list_price                      <> FND_API.G_MISS_NUM  OR
4758           p_charges_detail_rec.con_pct_over_list_price         <> FND_API.G_MISS_NUM  OR
4759           p_charges_detail_rec.selling_price                   <> FND_API.G_MISS_NUM  OR
4760           p_charges_detail_rec.contract_discount_amount        <> FND_API.G_MISS_NUM  OR
4761           p_charges_detail_rec.apply_contract_discount         <> FND_API.G_MISS_CHAR OR
4762           p_charges_detail_rec.after_warranty_cost             <> FND_API.G_MISS_NUM  OR
4763           p_charges_detail_rec.transaction_inventory_org       <> FND_API.G_MISS_NUM OR
4764           p_charges_detail_rec.transaction_sub_inventory       <> FND_API.G_MISS_CHAR OR
4765           p_charges_detail_rec.rollup_flag                     <> FND_API.G_MISS_CHAR OR
4766           p_charges_detail_rec.add_to_order_flag               <> FND_API.G_MISS_CHAR OR
4767           p_charges_detail_rec.order_header_id                 <> FND_API.G_MISS_NUM  OR
4768           p_charges_detail_rec.interface_to_oe_flag            <> FND_API.G_MISS_CHAR OR
4769           p_charges_detail_rec.no_charge_flag                  <> FND_API.G_MISS_CHAR OR
4770           p_charges_detail_rec.line_category_code              <> FND_API.G_MISS_CHAR OR
4771           p_charges_detail_rec.line_type_id                    <> FND_API.G_MISS_NUM  OR
4772           p_charges_detail_rec.order_line_id                   <> FND_API.G_MISS_NUM  OR
4773           p_charges_detail_rec.conversion_rate                 <> FND_API.G_MISS_NUM  OR
4774           p_charges_detail_rec.conversion_type_code            <> FND_API.G_MISS_CHAR OR
4775           p_charges_detail_rec.conversion_rate_date            <> FND_API.G_MISS_DATE OR
4776           p_charges_detail_rec.org_id                          <> FND_API.G_MISS_NUM  OR
4777           p_charges_detail_rec.activity_start_time             <> FND_API.G_MISS_DATE OR
4778           p_charges_detail_rec.activity_end_time               <> FND_API.G_MISS_DATE OR
4779           p_charges_detail_rec.generated_by_bca_engine         <> FND_API.G_MISS_CHAR OR
4780           p_charges_detail_rec.submit_restriction_message      <> FND_API.G_MISS_CHAR OR
4781           p_charges_detail_rec.submit_error_message            <> FND_API.G_MISS_CHAR OR
4782           p_charges_detail_rec.submit_from_system              <> FND_API.G_MISS_CHAR OR
4783           p_charges_detail_rec.attribute1                      <> FND_API.G_MISS_CHAR OR
4784           p_charges_detail_rec.attribute2                      <> FND_API.G_MISS_CHAR OR
4785           p_charges_detail_rec.attribute3                      <> FND_API.G_MISS_CHAR OR
4786           p_charges_detail_rec.attribute4                      <> FND_API.G_MISS_CHAR OR
4787           p_charges_detail_rec.attribute5                      <> FND_API.G_MISS_CHAR OR
4788           p_charges_detail_rec.attribute6                      <> FND_API.G_MISS_CHAR OR
4789           p_charges_detail_rec.attribute7                      <> FND_API.G_MISS_CHAR OR
4790           p_charges_detail_rec.attribute8                      <> FND_API.G_MISS_CHAR OR
4791           p_charges_detail_rec.attribute9                      <> FND_API.G_MISS_CHAR OR
4792           p_charges_detail_rec.attribute10                     <> FND_API.G_MISS_CHAR OR
4793           p_charges_detail_rec.attribute11                     <> FND_API.G_MISS_CHAR OR
4794           p_charges_detail_rec.attribute12                     <> FND_API.G_MISS_CHAR OR
4795           p_charges_detail_rec.attribute13                     <> FND_API.G_MISS_CHAR OR
4796           p_charges_detail_rec.attribute14                     <> FND_API.G_MISS_CHAR OR
4797           p_charges_detail_rec.attribute15                     <> FND_API.G_MISS_CHAR OR
4798           p_charges_detail_rec.context                         <> FND_API.G_MISS_CHAR OR
4799           p_charges_detail_rec.pricing_context                 <> FND_API.G_MISS_CHAR OR
4800           p_charges_detail_rec.pricing_attribute1              <> FND_API.G_MISS_CHAR OR
4801           p_charges_detail_rec.pricing_attribute2              <> FND_API.G_MISS_CHAR OR
4802           p_charges_detail_rec.pricing_attribute3              <> FND_API.G_MISS_CHAR OR
4803           p_charges_detail_rec.pricing_attribute4              <> FND_API.G_MISS_CHAR OR
4804           p_charges_detail_rec.pricing_attribute5              <> FND_API.G_MISS_CHAR OR
4805           p_charges_detail_rec.pricing_attribute6              <> FND_API.G_MISS_CHAR OR
4806           p_charges_detail_rec.pricing_attribute7              <> FND_API.G_MISS_CHAR OR
4807           p_charges_detail_rec.pricing_attribute8              <> FND_API.G_MISS_CHAR OR
4808           p_charges_detail_rec.pricing_attribute9              <> FND_API.G_MISS_CHAR OR
4809           p_charges_detail_rec.pricing_attribute10             <> FND_API.G_MISS_CHAR OR
4810           p_charges_detail_rec.pricing_attribute11             <> FND_API.G_MISS_CHAR OR
4811           p_charges_detail_rec.pricing_attribute12             <> FND_API.G_MISS_CHAR OR
4812           p_charges_detail_rec.pricing_attribute13             <> FND_API.G_MISS_CHAR OR
4813           p_charges_detail_rec.pricing_attribute14             <> FND_API.G_MISS_CHAR OR
4814           p_charges_detail_rec.pricing_attribute15             <> FND_API.G_MISS_CHAR OR
4815           p_charges_detail_rec.pricing_attribute16             <> FND_API.G_MISS_CHAR OR
4816           p_charges_detail_rec.pricing_attribute17             <> FND_API.G_MISS_CHAR OR
4817           p_charges_detail_rec.pricing_attribute18             <> FND_API.G_MISS_CHAR OR
4818           p_charges_detail_rec.pricing_attribute19             <> FND_API.G_MISS_CHAR OR
4819           p_charges_detail_rec.pricing_attribute20             <> FND_API.G_MISS_CHAR OR
4820           p_charges_detail_rec.pricing_attribute21             <> FND_API.G_MISS_CHAR OR
4821           p_charges_detail_rec.pricing_attribute22             <> FND_API.G_MISS_CHAR OR
4822           p_charges_detail_rec.pricing_attribute23             <> FND_API.G_MISS_CHAR OR
4823           p_charges_detail_rec.pricing_attribute24             <> FND_API.G_MISS_CHAR OR
4824           p_charges_detail_rec.pricing_attribute25             <> FND_API.G_MISS_CHAR OR
4825           p_charges_detail_rec.pricing_attribute26             <> FND_API.G_MISS_CHAR OR
4826           p_charges_detail_rec.pricing_attribute27             <> FND_API.G_MISS_CHAR OR
4827           p_charges_detail_rec.pricing_attribute28             <> FND_API.G_MISS_CHAR OR
4828           p_charges_detail_rec.pricing_attribute29             <> FND_API.G_MISS_CHAR OR
4829           p_charges_detail_rec.pricing_attribute30             <> FND_API.G_MISS_CHAR OR
4830           p_charges_detail_rec.pricing_attribute31             <> FND_API.G_MISS_CHAR OR
4831           p_charges_detail_rec.pricing_attribute32             <> FND_API.G_MISS_CHAR OR
4832           p_charges_detail_rec.pricing_attribute33             <> FND_API.G_MISS_CHAR OR
4833           p_charges_detail_rec.pricing_attribute34             <> FND_API.G_MISS_CHAR OR
4834           p_charges_detail_rec.pricing_attribute35             <> FND_API.G_MISS_CHAR OR
4835           p_charges_detail_rec.pricing_attribute36             <> FND_API.G_MISS_CHAR OR
4836           p_charges_detail_rec.pricing_attribute37             <> FND_API.G_MISS_CHAR OR
4837           p_charges_detail_rec.pricing_attribute38             <> FND_API.G_MISS_CHAR OR
4838           p_charges_detail_rec.pricing_attribute39             <> FND_API.G_MISS_CHAR OR
4839           p_charges_detail_rec.pricing_attribute40             <> FND_API.G_MISS_CHAR OR
4840           p_charges_detail_rec.pricing_attribute41             <> FND_API.G_MISS_CHAR OR
4841           p_charges_detail_rec.pricing_attribute42             <> FND_API.G_MISS_CHAR OR
4842           p_charges_detail_rec.pricing_attribute43             <> FND_API.G_MISS_CHAR OR
4843           p_charges_detail_rec.pricing_attribute44             <> FND_API.G_MISS_CHAR OR
4844           p_charges_detail_rec.pricing_attribute45             <> FND_API.G_MISS_CHAR OR
4845           p_charges_detail_rec.pricing_attribute46             <> FND_API.G_MISS_CHAR OR
4846           p_charges_detail_rec.pricing_attribute47             <> FND_API.G_MISS_CHAR OR
4847           p_charges_detail_rec.pricing_attribute48             <> FND_API.G_MISS_CHAR OR
4848           p_charges_detail_rec.pricing_attribute49             <> FND_API.G_MISS_CHAR OR
4849           p_charges_detail_rec.pricing_attribute50             <> FND_API.G_MISS_CHAR OR
4850           p_charges_detail_rec.pricing_attribute51             <> FND_API.G_MISS_CHAR OR
4851           p_charges_detail_rec.pricing_attribute52             <> FND_API.G_MISS_CHAR OR
4852           p_charges_detail_rec.pricing_attribute53             <> FND_API.G_MISS_CHAR OR
4853           p_charges_detail_rec.pricing_attribute54             <> FND_API.G_MISS_CHAR OR
4854           p_charges_detail_rec.pricing_attribute55             <> FND_API.G_MISS_CHAR OR
4855           p_charges_detail_rec.pricing_attribute56             <> FND_API.G_MISS_CHAR OR
4856           p_charges_detail_rec.pricing_attribute57             <> FND_API.G_MISS_CHAR OR
4857           p_charges_detail_rec.pricing_attribute58             <> FND_API.G_MISS_CHAR OR
4858           p_charges_detail_rec.pricing_attribute59             <> FND_API.G_MISS_CHAR OR
4859           p_charges_detail_rec.pricing_attribute60             <> FND_API.G_MISS_CHAR OR
4860           p_charges_detail_rec.pricing_attribute61             <> FND_API.G_MISS_CHAR OR
4861           p_charges_detail_rec.pricing_attribute62             <> FND_API.G_MISS_CHAR OR
4862           p_charges_detail_rec.pricing_attribute63             <> FND_API.G_MISS_CHAR OR
4863           p_charges_detail_rec.pricing_attribute64             <> FND_API.G_MISS_CHAR OR
4864           p_charges_detail_rec.pricing_attribute65             <> FND_API.G_MISS_CHAR OR
4865           p_charges_detail_rec.pricing_attribute66             <> FND_API.G_MISS_CHAR OR
4866           p_charges_detail_rec.pricing_attribute67             <> FND_API.G_MISS_CHAR OR
4867           p_charges_detail_rec.pricing_attribute68             <> FND_API.G_MISS_CHAR OR
4868           p_charges_detail_rec.pricing_attribute69             <> FND_API.G_MISS_CHAR OR
4869           p_charges_detail_rec.pricing_attribute70             <> FND_API.G_MISS_CHAR OR
4870           p_charges_detail_rec.pricing_attribute71             <> FND_API.G_MISS_CHAR OR
4871           p_charges_detail_rec.pricing_attribute72             <> FND_API.G_MISS_CHAR OR
4872           p_charges_detail_rec.pricing_attribute73             <> FND_API.G_MISS_CHAR OR
4873           p_charges_detail_rec.pricing_attribute74             <> FND_API.G_MISS_CHAR OR
4874           p_charges_detail_rec.pricing_attribute75             <> FND_API.G_MISS_CHAR OR
4875           p_charges_detail_rec.pricing_attribute76             <> FND_API.G_MISS_CHAR OR
4876           p_charges_detail_rec.pricing_attribute77             <> FND_API.G_MISS_CHAR OR
4877           p_charges_detail_rec.pricing_attribute78             <> FND_API.G_MISS_CHAR OR
4878           p_charges_detail_rec.pricing_attribute79             <> FND_API.G_MISS_CHAR OR
4879           p_charges_detail_rec.pricing_attribute80             <> FND_API.G_MISS_CHAR OR
4880           p_charges_detail_rec.pricing_attribute81             <> FND_API.G_MISS_CHAR OR
4881           p_charges_detail_rec.pricing_attribute82             <> FND_API.G_MISS_CHAR OR
4882           p_charges_detail_rec.pricing_attribute83             <> FND_API.G_MISS_CHAR OR
4883           p_charges_detail_rec.pricing_attribute84             <> FND_API.G_MISS_CHAR OR
4884           p_charges_detail_rec.pricing_attribute85             <> FND_API.G_MISS_CHAR OR
4885           p_charges_detail_rec.pricing_attribute86             <> FND_API.G_MISS_CHAR OR
4886           p_charges_detail_rec.pricing_attribute87             <> FND_API.G_MISS_CHAR OR
4887           p_charges_detail_rec.pricing_attribute88             <> FND_API.G_MISS_CHAR OR
4888           p_charges_detail_rec.pricing_attribute89             <> FND_API.G_MISS_CHAR OR
4889           p_charges_detail_rec.pricing_attribute90             <> FND_API.G_MISS_CHAR OR
4890           p_charges_detail_rec.pricing_attribute91             <> FND_API.G_MISS_CHAR OR
4891           p_charges_detail_rec.pricing_attribute92             <> FND_API.G_MISS_CHAR OR
4892           p_charges_detail_rec.pricing_attribute93             <> FND_API.G_MISS_CHAR OR
4893           p_charges_detail_rec.pricing_attribute94             <> FND_API.G_MISS_CHAR OR
4894           p_charges_detail_rec.pricing_attribute95             <> FND_API.G_MISS_CHAR OR
4895           p_charges_detail_rec.pricing_attribute96             <> FND_API.G_MISS_CHAR OR
4896           p_charges_detail_rec.pricing_attribute97             <> FND_API.G_MISS_CHAR OR
4897           p_charges_detail_rec.pricing_attribute98             <> FND_API.G_MISS_CHAR OR
4898           p_charges_detail_rec.pricing_attribute99             <> FND_API.G_MISS_CHAR OR
4899           p_charges_detail_rec.pricing_attribute100            <> FND_API.G_MISS_CHAR ) THEN
4900 
4901           FND_MESSAGE.Set_Name('CS', 'CS_CHG_CANNOT_UPDATE_CHRG_LINE');
4902           FND_MSG_PUB.Add;
4903           RAISE FND_API.G_EXC_ERROR;
4904       END IF;
4905    ELSE
4906      --l_in_oe_flag = 'N'
4907      --DBMS_OUTPUT.PUT_LINE('l_in_oe_flag is N ');
4908      null;
4909    END IF;
4910 
4911 
4912 
4913    -- Fixed Bug # 4395867
4914    -- If the original source is 'SR' and source is 'SD' then restrict the line from getting updated
4915    -- from Service Debrief
4916    --
4917 
4918    -- get the current_source for the update transaction
4919 
4920    IF p_charges_detail_rec.source_code IS NOT NULL AND
4921       p_charges_detail_rec.source_code <> FND_API.G_MISS_CHAR THEN
4922       l_source := p_charges_detail_rec.source_code;
4923    ELSE
4924       l_source := l_db_det_rec.source_code;
4925    END IF;
4926 
4927    -- get the original_source for the update transaction
4928       l_original_source := l_db_det_rec.original_source_code;
4929 
4930 --Bug fix for bug 7445810
4931    IF l_db_det_rec.generated_by_bca_engine_flag = 'Y' AND
4932       l_original_source = 'SR' AND
4933       l_source = 'SD'  THEN
4934     IF (
4935 	--cannot be updated
4936 	    p_charges_detail_rec.charge_line_type                <> FND_API.G_MISS_CHAR OR
4937             p_charges_detail_rec.line_number                     <> FND_API.G_MISS_NUM OR
4938             p_charges_detail_rec.business_process_id             <> FND_API.G_MISS_NUM  OR
4939             p_charges_detail_rec.transaction_type_id             <> FND_API.G_MISS_NUM  OR
4940             p_charges_detail_rec.inventory_item_id_in            <> FND_API.G_MISS_NUM  OR
4941             p_charges_detail_rec.item_revision                   <> FND_API.G_MISS_CHAR OR
4942             p_charges_detail_rec.billing_flag                    <> FND_API.G_MISS_CHAR OR
4943             p_charges_detail_rec.txn_billing_type_id             <> FND_API.G_MISS_NUM  OR
4944             p_charges_detail_rec.unit_of_measure_code            <> FND_API.G_MISS_CHAR OR
4945             p_charges_detail_rec.quantity_required               <> FND_API.G_MISS_NUM  OR
4946             p_charges_detail_rec.return_reason_code              <> FND_API.G_MISS_CHAR OR
4947             p_charges_detail_rec.customer_product_id             <> FND_API.G_MISS_NUM  OR
4948             p_charges_detail_rec.serial_number                   <> FND_API.G_MISS_CHAR OR
4949             p_charges_detail_rec.installed_cp_return_by_date     <> FND_API.G_MISS_DATE OR
4950             p_charges_detail_rec.new_cp_return_by_date           <> FND_API.G_MISS_DATE OR
4951 
4952             p_charges_detail_rec.list_price                      <> FND_API.G_MISS_NUM  OR
4953             p_charges_detail_rec.con_pct_over_list_price         <> FND_API.G_MISS_NUM  OR
4954             p_charges_detail_rec.contract_discount_amount        <> FND_API.G_MISS_NUM  OR
4955             p_charges_detail_rec.apply_contract_discount         <> FND_API.G_MISS_CHAR OR
4956 
4957 	    p_charges_detail_rec.transaction_inventory_org       <> FND_API.G_MISS_NUM OR
4958             p_charges_detail_rec.transaction_sub_inventory       <> FND_API.G_MISS_CHAR OR
4959 
4960 
4961           --  p_charges_detail_rec.order_header_id                 <> FND_API.G_MISS_NUM  OR
4962             p_charges_detail_rec.line_category_code              <> FND_API.G_MISS_CHAR OR
4963             p_charges_detail_rec.line_type_id                    <> FND_API.G_MISS_NUM  OR
4964             p_charges_detail_rec.order_line_id                   <> FND_API.G_MISS_NUM  OR
4965             p_charges_detail_rec.conversion_rate                 <> FND_API.G_MISS_NUM  OR
4966             p_charges_detail_rec.conversion_type_code            <> FND_API.G_MISS_CHAR OR
4967             p_charges_detail_rec.conversion_rate_date            <> FND_API.G_MISS_DATE OR
4968             p_charges_detail_rec.original_source_id              <> FND_API.G_MISS_NUM  OR
4969             p_charges_detail_rec.original_source_code            <> FND_API.G_MISS_CHAR OR
4970             p_charges_detail_rec.org_id                          <> FND_API.G_MISS_NUM  OR
4971             p_charges_detail_rec.activity_start_time             <> FND_API.G_MISS_DATE OR
4972             p_charges_detail_rec.activity_end_time               <> FND_API.G_MISS_DATE OR
4973             p_charges_detail_rec.generated_by_bca_engine         <> FND_API.G_MISS_CHAR OR
4974             p_charges_detail_rec.submit_restriction_message      <> FND_API.G_MISS_CHAR OR
4975             p_charges_detail_rec.submit_error_message            <> FND_API.G_MISS_CHAR OR
4976             p_charges_detail_rec.submit_from_system              <> FND_API.G_MISS_CHAR OR
4977 	    p_charges_detail_rec.sold_to_party_id                <> FND_API.G_MISS_NUM
4978             )
4979 
4980 	--can be updated
4981 
4982 	  /*  p_charges_detail_rec.sold_to_party_id                <> FND_API.G_MISS_NUM  OR
4983             p_charges_detail_rec.bill_to_party_id                <> FND_API.G_MISS_NUM  OR
4984             p_charges_detail_rec.bill_to_account_id              <> FND_API.G_MISS_NUM  OR
4985             p_charges_detail_rec.bill_to_contact_id              <> FND_API.G_MISS_NUM  OR
4986             p_charges_detail_rec.invoice_to_org_id               <> FND_API.G_MISS_NUM  OR
4987             p_charges_detail_rec.ship_to_party_id                <> FND_API.G_MISS_NUM  OR
4988             p_charges_detail_rec.ship_to_account_id              <> FND_API.G_MISS_NUM  OR
4989             p_charges_detail_rec.ship_to_contact_id              <> FND_API.G_MISS_NUM  OR
4990             p_charges_detail_rec.ship_to_org_id                  <> FND_API.G_MISS_NUM  OR
4991             p_charges_detail_rec.contract_id                     <> FND_API.G_MISS_NUM  OR
4992             p_charges_detail_rec.coverage_id                     <> FND_API.G_MISS_NUM  OR
4993             p_charges_detail_rec.coverage_txn_group_id           <> FND_API.G_MISS_NUM  OR
4994             p_charges_detail_rec.coverage_bill_rate_id           <> FND_API.G_MISS_NUM  OR
4995             p_charges_detail_rec.coverage_billing_type_id        <> FND_API.G_MISS_NUM  OR
4996             p_charges_detail_rec.price_list_id                   <> FND_API.G_MISS_NUM  OR
4997 	    p_charges_detail_rec.currency_code                   <> FND_API.G_MISS_CHAR OR
4998             p_charges_detail_rec.purchase_order_num              <> FND_API.G_MISS_CHAR OR
4999             p_charges_detail_rec.selling_price                   <> FND_API.G_MISS_NUM  OR
5000             p_charges_detail_rec.rollup_flag                     <> FND_API.G_MISS_CHAR OR
5001             p_charges_detail_rec.add_to_order_flag               <> FND_API.G_MISS_CHAR OR
5002 	    p_charges_detail_rec.interface_to_oe_flag            <> FND_API.G_MISS_CHAR OR
5003 	    p_charges_detail_rec.no_charge_flag                  <> FND_API.G_MISS_CHAR OR
5004 
5005             p_charges_detail_rec.attribute1                      <> FND_API.G_MISS_CHAR OR
5006             p_charges_detail_rec.attribute2                      <> FND_API.G_MISS_CHAR OR
5007             p_charges_detail_rec.attribute3                      <> FND_API.G_MISS_CHAR OR
5008             p_charges_detail_rec.attribute4                      <> FND_API.G_MISS_CHAR OR
5009             p_charges_detail_rec.attribute5                      <> FND_API.G_MISS_CHAR OR
5010             p_charges_detail_rec.attribute6                      <> FND_API.G_MISS_CHAR OR
5011             p_charges_detail_rec.attribute7                      <> FND_API.G_MISS_CHAR OR
5012             p_charges_detail_rec.attribute8                      <> FND_API.G_MISS_CHAR OR
5013             p_charges_detail_rec.attribute9                      <> FND_API.G_MISS_CHAR OR
5014             p_charges_detail_rec.attribute10                     <> FND_API.G_MISS_CHAR OR
5015             p_charges_detail_rec.attribute11                     <> FND_API.G_MISS_CHAR OR
5016             p_charges_detail_rec.attribute12                     <> FND_API.G_MISS_CHAR OR
5017             p_charges_detail_rec.attribute13                     <> FND_API.G_MISS_CHAR OR
5018             p_charges_detail_rec.attribute14                     <> FND_API.G_MISS_CHAR OR
5019             p_charges_detail_rec.attribute15                     <> FND_API.G_MISS_CHAR OR
5020             p_charges_detail_rec.context                         <> FND_API.G_MISS_CHAR OR
5021             p_charges_detail_rec.pricing_context                 <> FND_API.G_MISS_CHAR OR
5022             p_charges_detail_rec.pricing_attribute1              <> FND_API.G_MISS_CHAR OR
5023             p_charges_detail_rec.pricing_attribute2              <> FND_API.G_MISS_CHAR OR
5024             p_charges_detail_rec.pricing_attribute3              <> FND_API.G_MISS_CHAR OR
5025             p_charges_detail_rec.pricing_attribute4              <> FND_API.G_MISS_CHAR OR
5026             p_charges_detail_rec.pricing_attribute5              <> FND_API.G_MISS_CHAR OR
5027             p_charges_detail_rec.pricing_attribute6              <> FND_API.G_MISS_CHAR OR
5028             p_charges_detail_rec.pricing_attribute7              <> FND_API.G_MISS_CHAR OR
5029             p_charges_detail_rec.pricing_attribute8              <> FND_API.G_MISS_CHAR OR
5030             p_charges_detail_rec.pricing_attribute9              <> FND_API.G_MISS_CHAR OR
5031             p_charges_detail_rec.pricing_attribute10             <> FND_API.G_MISS_CHAR OR
5032             p_charges_detail_rec.pricing_attribute11             <> FND_API.G_MISS_CHAR OR
5033             p_charges_detail_rec.pricing_attribute12             <> FND_API.G_MISS_CHAR OR
5034             p_charges_detail_rec.pricing_attribute13             <> FND_API.G_MISS_CHAR OR
5035             p_charges_detail_rec.pricing_attribute14             <> FND_API.G_MISS_CHAR OR
5036             p_charges_detail_rec.pricing_attribute15             <> FND_API.G_MISS_CHAR OR
5037             p_charges_detail_rec.pricing_attribute16             <> FND_API.G_MISS_CHAR OR
5038             p_charges_detail_rec.pricing_attribute17             <> FND_API.G_MISS_CHAR OR
5039             p_charges_detail_rec.pricing_attribute18             <> FND_API.G_MISS_CHAR OR
5040             p_charges_detail_rec.pricing_attribute19             <> FND_API.G_MISS_CHAR OR
5041             p_charges_detail_rec.pricing_attribute20             <> FND_API.G_MISS_CHAR OR
5042             p_charges_detail_rec.pricing_attribute21             <> FND_API.G_MISS_CHAR OR
5043             p_charges_detail_rec.pricing_attribute22             <> FND_API.G_MISS_CHAR OR
5044             p_charges_detail_rec.pricing_attribute23             <> FND_API.G_MISS_CHAR OR
5045             p_charges_detail_rec.pricing_attribute24             <> FND_API.G_MISS_CHAR OR
5046             p_charges_detail_rec.pricing_attribute25             <> FND_API.G_MISS_CHAR OR
5047             p_charges_detail_rec.pricing_attribute26             <> FND_API.G_MISS_CHAR OR
5048             p_charges_detail_rec.pricing_attribute27             <> FND_API.G_MISS_CHAR OR
5049             p_charges_detail_rec.pricing_attribute28             <> FND_API.G_MISS_CHAR OR
5050             p_charges_detail_rec.pricing_attribute29             <> FND_API.G_MISS_CHAR OR
5051             p_charges_detail_rec.pricing_attribute30             <> FND_API.G_MISS_CHAR OR
5052             p_charges_detail_rec.pricing_attribute31             <> FND_API.G_MISS_CHAR OR
5053             p_charges_detail_rec.pricing_attribute32             <> FND_API.G_MISS_CHAR OR
5054             p_charges_detail_rec.pricing_attribute33             <> FND_API.G_MISS_CHAR OR
5055             p_charges_detail_rec.pricing_attribute34             <> FND_API.G_MISS_CHAR OR
5056             p_charges_detail_rec.pricing_attribute35             <> FND_API.G_MISS_CHAR OR
5057             p_charges_detail_rec.pricing_attribute36             <> FND_API.G_MISS_CHAR OR
5058             p_charges_detail_rec.pricing_attribute37             <> FND_API.G_MISS_CHAR OR
5059             p_charges_detail_rec.pricing_attribute38             <> FND_API.G_MISS_CHAR OR
5060             p_charges_detail_rec.pricing_attribute39             <> FND_API.G_MISS_CHAR OR
5061             p_charges_detail_rec.pricing_attribute40             <> FND_API.G_MISS_CHAR OR
5062             p_charges_detail_rec.pricing_attribute41             <> FND_API.G_MISS_CHAR OR
5063             p_charges_detail_rec.pricing_attribute42             <> FND_API.G_MISS_CHAR OR
5064             p_charges_detail_rec.pricing_attribute43             <> FND_API.G_MISS_CHAR OR
5065             p_charges_detail_rec.pricing_attribute44             <> FND_API.G_MISS_CHAR OR
5066             p_charges_detail_rec.pricing_attribute45             <> FND_API.G_MISS_CHAR OR
5067             p_charges_detail_rec.pricing_attribute46             <> FND_API.G_MISS_CHAR OR
5068             p_charges_detail_rec.pricing_attribute47             <> FND_API.G_MISS_CHAR OR
5069             p_charges_detail_rec.pricing_attribute48             <> FND_API.G_MISS_CHAR OR
5070             p_charges_detail_rec.pricing_attribute49             <> FND_API.G_MISS_CHAR OR
5071             p_charges_detail_rec.pricing_attribute50             <> FND_API.G_MISS_CHAR OR
5072             p_charges_detail_rec.pricing_attribute51             <> FND_API.G_MISS_CHAR OR
5073             p_charges_detail_rec.pricing_attribute52             <> FND_API.G_MISS_CHAR OR
5074             p_charges_detail_rec.pricing_attribute53             <> FND_API.G_MISS_CHAR OR
5075             p_charges_detail_rec.pricing_attribute54             <> FND_API.G_MISS_CHAR OR
5076             p_charges_detail_rec.pricing_attribute55             <> FND_API.G_MISS_CHAR OR
5077             p_charges_detail_rec.pricing_attribute56             <> FND_API.G_MISS_CHAR OR
5078             p_charges_detail_rec.pricing_attribute57             <> FND_API.G_MISS_CHAR OR
5079             p_charges_detail_rec.pricing_attribute58             <> FND_API.G_MISS_CHAR OR
5080             p_charges_detail_rec.pricing_attribute59             <> FND_API.G_MISS_CHAR OR
5081             p_charges_detail_rec.pricing_attribute60             <> FND_API.G_MISS_CHAR OR
5082             p_charges_detail_rec.pricing_attribute61             <> FND_API.G_MISS_CHAR OR
5083             p_charges_detail_rec.pricing_attribute62             <> FND_API.G_MISS_CHAR OR
5084             p_charges_detail_rec.pricing_attribute63             <> FND_API.G_MISS_CHAR OR
5085             p_charges_detail_rec.pricing_attribute64             <> FND_API.G_MISS_CHAR OR
5086             p_charges_detail_rec.pricing_attribute65             <> FND_API.G_MISS_CHAR OR
5087             p_charges_detail_rec.pricing_attribute66             <> FND_API.G_MISS_CHAR OR
5088             p_charges_detail_rec.pricing_attribute67             <> FND_API.G_MISS_CHAR OR
5089             p_charges_detail_rec.pricing_attribute68             <> FND_API.G_MISS_CHAR OR
5090             p_charges_detail_rec.pricing_attribute69             <> FND_API.G_MISS_CHAR OR
5091             p_charges_detail_rec.pricing_attribute70             <> FND_API.G_MISS_CHAR OR
5092             p_charges_detail_rec.pricing_attribute71             <> FND_API.G_MISS_CHAR OR
5093             p_charges_detail_rec.pricing_attribute72             <> FND_API.G_MISS_CHAR OR
5094             p_charges_detail_rec.pricing_attribute73             <> FND_API.G_MISS_CHAR OR
5095             p_charges_detail_rec.pricing_attribute74             <> FND_API.G_MISS_CHAR OR
5096             p_charges_detail_rec.pricing_attribute75             <> FND_API.G_MISS_CHAR OR
5097             p_charges_detail_rec.pricing_attribute76             <> FND_API.G_MISS_CHAR OR
5098             p_charges_detail_rec.pricing_attribute77             <> FND_API.G_MISS_CHAR OR
5099             p_charges_detail_rec.pricing_attribute78             <> FND_API.G_MISS_CHAR OR
5100             p_charges_detail_rec.pricing_attribute79             <> FND_API.G_MISS_CHAR OR
5101             p_charges_detail_rec.pricing_attribute80             <> FND_API.G_MISS_CHAR OR
5102             p_charges_detail_rec.pricing_attribute81             <> FND_API.G_MISS_CHAR OR
5103             p_charges_detail_rec.pricing_attribute82             <> FND_API.G_MISS_CHAR OR
5104             p_charges_detail_rec.pricing_attribute83             <> FND_API.G_MISS_CHAR OR
5105             p_charges_detail_rec.pricing_attribute84             <> FND_API.G_MISS_CHAR OR
5106             p_charges_detail_rec.pricing_attribute85             <> FND_API.G_MISS_CHAR OR
5107             p_charges_detail_rec.pricing_attribute86             <> FND_API.G_MISS_CHAR OR
5108             p_charges_detail_rec.pricing_attribute87             <> FND_API.G_MISS_CHAR OR
5109             p_charges_detail_rec.pricing_attribute88             <> FND_API.G_MISS_CHAR OR
5110             p_charges_detail_rec.pricing_attribute89             <> FND_API.G_MISS_CHAR OR
5111             p_charges_detail_rec.pricing_attribute90             <> FND_API.G_MISS_CHAR OR
5112             p_charges_detail_rec.pricing_attribute91             <> FND_API.G_MISS_CHAR OR
5113             p_charges_detail_rec.pricing_attribute92             <> FND_API.G_MISS_CHAR OR
5114             p_charges_detail_rec.pricing_attribute93             <> FND_API.G_MISS_CHAR OR
5115             p_charges_detail_rec.pricing_attribute94             <> FND_API.G_MISS_CHAR OR
5116             p_charges_detail_rec.pricing_attribute95             <> FND_API.G_MISS_CHAR OR
5117             p_charges_detail_rec.pricing_attribute96             <> FND_API.G_MISS_CHAR OR
5118             p_charges_detail_rec.pricing_attribute97             <> FND_API.G_MISS_CHAR OR
5119             p_charges_detail_rec.pricing_attribute98             <> FND_API.G_MISS_CHAR OR
5120             p_charges_detail_rec.pricing_attribute99             <> FND_API.G_MISS_CHAR OR
5121             p_charges_detail_rec.pricing_attribute100            <> FND_API.G_MISS_CHAR )
5122             */
5123 
5124      THEN
5125          --RAISE FND_API.G_EXC_ERROR;
5126          --null;
5127 
5128 --	 FND_MESSAGE.Set_Name('CS', 'CS_CHG_CANNOT_UPDATE_CHRG_LINE');
5129 	 FND_MESSAGE.Set_Name('CS', 'CS_CHG_CANNOT_UPDATE_LINE'); --Bug 7445810	 created an appropriate message
5130          FND_MSG_PUB.Add;
5131          RAISE FND_API.G_EXC_ERROR;
5132      END IF;
5133 
5134      -- If generated by BCA Engine then cannot update anything except the final amount
5135      -- need to find out from Iwen the exact requirements
5136 
5137    END IF;
5138   END IF;
5139 
5140      --DBMS_OUTPUT.PUT_LINE('Passed the Update Validation for BCA and Order Line');
5141 --======================================
5142 -- For Update Only
5143 -- Check for Item Instance and Rollup Flag
5144 -- from values in Database
5145 --======================================
5146 IF p_validation_mode = 'U' THEN
5147   IF l_db_det_rec.rollup_flag = 'Y' THEN
5148     l_rollup_flag := 'Y';
5149   END IF;
5150 END IF;
5151 
5152 --===========================
5153 --Charge Line Type Validation
5154 --===========================
5155 --DBMS_OUTPUT.PUT_LINE('Charge Line Type Validation ...');
5156 
5157   IF p_validation_mode = 'I' THEN
5158 
5159     IF p_charges_detail_rec.charge_line_type IS NOT NULL THEN
5160 
5161       l_valid_check := IS_CHARGE_LINE_TYPE_VALID(p_charge_line_type => p_charges_detail_rec.charge_line_type,
5162                                    x_msg_data         => l_msg_data,
5163                                    x_msg_count        => l_msg_count,
5164                                    x_return_status    => l_return_status);
5165 
5166       IF l_return_status = G_RET_STS_UNEXP_ERROR THEN
5167         RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
5168       ELSIF l_return_status = G_RET_STS_ERROR THEN
5169         RAISE FND_API.G_EXC_ERROR;
5170       END IF;
5171 
5172       IF l_valid_check <> 'Y' THEN
5173 
5174         Add_Invalid_Argument_Msg(l_api_name,
5175                                  p_charges_detail_rec.charge_line_type,
5176                                  'charge_line_type');
5177 
5178         RAISE FND_API.G_EXC_ERROR;
5179       ELSE
5180         x_charges_detail_rec.charge_line_type :=  p_charges_detail_rec.charge_line_type;
5181       END IF;
5182 
5183 
5184     ELSE
5185       x_charges_detail_rec.charge_line_type := 'ACTUAL';
5186     END IF;
5187 
5188   ELSIF p_validation_mode = 'U' THEN
5189 
5190     --Resolve Bug # 3078244
5191 
5192     IF p_charges_detail_rec.charge_line_type  <> FND_API.G_MISS_CHAR AND
5193        p_charges_detail_rec.charge_line_type IS NOT NULL THEN
5194 
5195       IF l_db_det_rec.charge_line_type <> 'IN PROGRESS' THEN
5196 
5197         l_valid_check := IS_CHARGE_LINE_TYPE_VALID(p_charge_line_type => p_charges_detail_rec.charge_line_type,
5198                                      x_msg_data         => l_msg_data,
5199                                      x_msg_count        => l_msg_count,
5200                                      x_return_status    => l_return_status);
5201 
5202         IF l_return_status = G_RET_STS_UNEXP_ERROR THEN
5203           RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
5204         ELSIF l_return_status = G_RET_STS_ERROR THEN
5205           RAISE FND_API.G_EXC_ERROR;
5206         END IF;
5207 
5208         IF l_valid_check <> 'Y' THEN
5209 
5210           Add_Invalid_Argument_Msg(l_api_name,
5211                                    p_charges_detail_rec.charge_line_type,
5212                                    'charge_line_type');
5213 
5214           RAISE FND_API.G_EXC_ERROR;
5215         ELSE
5216           x_charges_detail_rec.charge_line_type :=  p_charges_detail_rec.charge_line_type;
5217         END IF;
5218 
5219       ELSE
5220        -- give an error message
5221        FND_MESSAGE.SET_NAME('CS', 'CS_CHG_CANNOT_UPDATE_INPROG');
5222        FND_MESSAGE.SET_TOKEN('API_NAME', p_api_name);
5223        FND_MSG_PUB.ADD;
5224        RAISE FND_API.G_EXC_ERROR;
5225       END IF;
5226    ELSE
5227     --get it from the db record
5228     x_charges_detail_rec.charge_line_type := l_db_det_rec.charge_line_type;
5229 
5230     IF x_charges_detail_rec.charge_line_type = 'IN PROGRESS' THEN
5231       FND_MESSAGE.SET_NAME('CS', 'CS_CHG_CANNOT_UPDATE_INPROG');
5232       FND_MESSAGE.SET_TOKEN('API_NAME', p_api_name);
5233       FND_MSG_PUB.ADD;
5234       RAISE FND_API.G_EXC_ERROR;
5235     END IF;
5236    END IF;
5237 
5238    --DBMS_OUTPUT.PUT_LINE('passed charge_line_type validation in update');
5239   END IF;
5240 
5241  --=============================
5242  --Line submitted validate
5243  --=============================
5244 
5245  IF p_validation_mode = 'I' THEN
5246 
5247    IF  x_charges_detail_rec.charge_line_type IN ('ESTIMATE', 'IN_PROGRESS') THEN
5248      x_charges_detail_rec.line_submitted_flag := NULL;
5249    ELSE
5250      IF x_charges_detail_rec.charge_line_type = 'ACTUAL' THEN
5251       x_charges_detail_rec.line_submitted_flag := 'N';
5252      END IF;
5253    END IF;
5254  ELSIF p_validation_mode = 'U' THEN
5255    --Fixed Bug # 3353497
5256    IF x_charges_detail_rec.order_line_id IS NULL AND
5257       x_charges_detail_rec.charge_line_type = 'ACTUAL' THEN
5258       x_charges_detail_rec.line_submitted_flag := 'N';
5259    ELSE
5260       --in all other situations  l_line_submitted_flag := NULL;
5261       x_charges_detail_rec.line_submitted_flag := NULL;
5262    END IF;
5263  END IF;
5264 
5265 
5266 
5267  --==============================
5268  --Business Process ID Validation
5269  --==============================
5270   --DBMS_OUTPUT.PUT_LINE('Business Process ID Validation ...');
5271 
5272   IF p_validation_mode = 'I' THEN
5273 
5274     IF p_charges_detail_rec.business_process_id IS NOT NULL THEN
5275 
5276       l_valid_check := IS_BUSINESS_PROCESS_ID_VALID(
5277                                       p_business_process_id => p_charges_detail_rec.business_process_id,
5278                                       x_msg_data            => l_msg_data,
5279                                       x_msg_count           => l_msg_count,
5280                                       x_return_status       => l_return_status);
5281 
5282       IF l_return_status = G_RET_STS_UNEXP_ERROR THEN
5283         RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
5284       ELSIF l_return_status = G_RET_STS_ERROR THEN
5285         RAISE FND_API.G_EXC_ERROR;
5286       END IF;
5287 
5288       IF l_valid_check <> 'Y' THEN
5289 
5290         Add_Invalid_Argument_Msg(l_api_name,
5291                                  to_char(p_charges_detail_rec.business_process_id),
5292                                  'business_process_id');
5293         RAISE FND_API.G_EXC_ERROR;
5294       ELSE
5295         x_charges_detail_rec.business_process_id := p_charges_detail_rec.business_process_id;
5296       END IF;
5297 
5298     ELSE
5299       -- Business Process Id is null
5300       -- Get the Business Process Id from Service Request
5301       -- Check if the profile to get Business Process From SR = 'Y'
5302       l_def_bp_from_sr := fnd_profile.value('CS_CHG_DEFAULT_BP_FROM_SR');
5303 
5304       IF FND_LOG.level_procedure >= FND_LOG.g_current_runtime_level
5305       THEN
5306 	FND_LOG.String
5307 	( FND_LOG.level_procedure , L_LOG_MODULE || ''
5308 	, 'The Value of profile CS_CHG_DEFAULT_BP_FROM_SR :' || l_def_bp_from_sr
5309 	);
5310       END IF;
5311 
5312       IF l_def_bp_from_sr = 'Y' THEN
5313         -- assign the business process id returned from GET_SR_DEFAULTS
5314         -- assign to out record
5315         IF l_business_process_id IS NOT NULL THEN
5316           x_charges_detail_rec.business_process_id := l_business_process_id;
5317         ELSE
5318           -- Raise Error
5319           FND_MESSAGE.SET_NAME('CS', 'CS_CHG_INVALID_BUSS_PROCESS_ID');
5320           FND_MESSAGE.SET_TOKEN('BUSINESS_PROCESS_ID', l_business_process_id);
5321           FND_MSG_PUB.ADD;
5322           RAISE FND_API.G_EXC_ERROR;
5323         END IF;
5324       ELSE
5325         -- Profile to get Business Process From SR = 'N'
5326         -- Raise error the Business Process ID IS Null and needed
5327         FND_MESSAGE.SET_NAME('CS', 'CS_CHG_INVALID_BUSS_PROCESS_ID');
5328         FND_MESSAGE.SET_TOKEN('BUSINESS_PROCESS_ID', p_charges_detail_rec.business_process_id);
5329         FND_MSG_PUB.ADD;
5330         RAISE FND_API.G_EXC_ERROR;
5331       END IF;
5332     END IF;
5333 
5334   ELSIF p_validation_mode = 'U' THEN
5335 
5336     -- In this API the Business Process can be updated
5337     -- If the Business process is passed and valid it will be updated
5338     -- else the value from db will be used
5339     --Resolve Bug # 3078244
5340 
5341     --Check to see if the upstream is passed a new business_process_id
5342     --If passed then validate the new business_process_id
5343     --If valid then assign to out parameters
5344     --Check too see if business_process_id is changed
5345     --If business_process_id is not passed assign the one in the database
5346 
5347     IF p_charges_detail_rec.business_process_id <> FND_API.G_MISS_NUM AND
5348        p_charges_detail_rec.business_process_id IS NOT NULL THEN
5349 
5350        l_valid_check := IS_BUSINESS_PROCESS_ID_VALID(
5351                                       p_business_process_id => p_charges_detail_rec.business_process_id,
5352                                       x_msg_data            => l_msg_data,
5353                                       x_msg_count           => l_msg_count,
5354                                       x_return_status       => l_return_status);
5355 
5356       IF l_return_status = G_RET_STS_UNEXP_ERROR THEN
5357         RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
5358       ELSIF l_return_status = G_RET_STS_ERROR THEN
5359         RAISE FND_API.G_EXC_ERROR;
5360       END IF;
5361 
5362       IF l_valid_check <> 'Y' THEN
5363 
5364         Add_Invalid_Argument_Msg(l_api_name,
5365                                  to_char(p_charges_detail_rec.business_process_id),
5366                                  'business_process_id');
5367         RAISE FND_API.G_EXC_ERROR;
5368       ELSE
5369         x_charges_detail_rec.business_process_id := p_charges_detail_rec.business_process_id;
5370 
5371         IF p_charges_detail_rec.business_process_id <> l_db_det_rec.business_process_id THEN
5372           l_bp_changed := 'Y';
5373         END IF;
5374 
5375       END IF;
5376    ELSE
5377      -- p_charges_detail_rec.business_process_id is not passed
5378      -- use the business_process_id from the db
5379      x_charges_detail_rec.business_process_id := l_db_det_rec.business_process_id;
5380    END IF;
5381 
5382    --DBMS_OUTPUT.PUT_LINE('passed business process validation in update');
5383 
5384  END IF;
5385 
5386  --==============================
5387  --Transaction Type ID Validation
5388  --=============================
5389   --DBMS_OUTPUT.PUT_LINE('Transaction Type ID Validation ...');
5390   --DBMS_OUTPUT.PUT_LINE('p_validation_mode'|| p_validation_mode);
5391 
5392   IF p_validation_mode = 'I' THEN
5393 
5394     IF p_charges_detail_rec.transaction_type_id IS NULL THEN
5395 
5396       Add_Null_Parameter_Msg(l_api_name, 'transaction_type_id');
5397       Add_Invalid_Argument_Msg(l_api_name, to_char(p_charges_detail_rec.inventory_item_id_in), 'transaction_type_id');
5398       RAISE FND_API.G_EXC_ERROR;
5399 
5400     ELSE -- transaction_type_id is not null;
5401 
5402 --Added by bkanimoz on 15-dec-2007
5403  --start
5404 
5405 --check if the 'create_charge_flag' is 'Y' for the transaction type
5406 
5407     get_charge_flag_from_sac(p_api_name               => p_api_name,
5408                              p_txn_type_id            => p_charges_detail_rec.transaction_type_id,
5409 			     x_create_charge_flag     => l_create_charge_flag,
5410 			     x_msg_data               => l_msg_data,
5411 		             x_msg_count              => l_msg_count,
5412                              x_return_status          => l_return_status
5413 			    );
5414 
5415    IF l_create_charge_flag   = 'N' THEN
5416      --DBMS_OUTPUT.PUT_LINE('l_disallow_new_charge is '||l_disallow_new_charge);
5417      --raise error
5418      FND_MESSAGE.SET_NAME('CS', 'CS_CHG_INVALID_CHARGE_FLAG');
5419      FND_MSG_PUB.ADD;
5420      RAISE FND_API.G_EXC_ERROR;
5421    END IF;
5422 
5423 -- end
5424 
5425 
5426       --DBMS_OUTPUT.PUT_LINE('Calling VALIDATE_TXN_TYPE');
5427       -- Call Validate Transaction Type Procedure
5428       VALIDATE_TXN_TYPE(P_API_NAME                  => p_api_name,
5429                         P_BUSINESS_PROCESS_ID       => p_charges_detail_rec.business_process_id,
5430                         P_TXN_TYPE_ID               => p_charges_detail_rec.transaction_type_id,
5431                         P_SOURCE_CODE               => x_charges_detail_rec.source_code,
5432                         X_LINE_ORDER_CATEGORY_CODE  => l_line_order_category_code,
5433                         X_NO_CHARGE_FLAG            => l_no_charge_flag ,
5434                         X_INTERFACE_TO_OE_FLAG      => l_interface_to_oe_flag,
5435                         X_UPDATE_IB_FLAG            => l_update_ib_flag,
5436                         X_SRC_REFERENCE_REQD_FLAG   => l_src_reference_reqd_flag,
5437                         X_SRC_RETURN_REQD_FLAG      => l_src_return_reqd_flag,
5438                         X_NON_SRC_REFERENCE_REQD    => l_non_src_reference_reqd_flag ,
5439                         X_NON_SRC_RETURN_REQD       => l_non_src_return_reqd,
5440                         x_MSG_DATA                  => x_msg_data,
5441                         x_MSG_COUNT                 => x_msg_count,
5442                         X_RETURN_STATUS             => l_return_status );
5443 
5444 
5445 
5446       IF l_return_status = FND_API.G_RET_STS_ERROR THEN
5447        RAISE FND_API.G_EXC_ERROR;
5448       ELSIF l_return_status = FND_API.G_RET_STS_UNEXP_ERROR THEN
5449         RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
5450       ELSE
5451         x_charges_detail_rec.transaction_type_id := p_charges_detail_rec.transaction_type_id;
5452       END IF ;
5453     END IF;
5454 
5455   ELSIF p_validation_mode = 'U' THEN
5456 
5457     --DBMS_OUTPUT.PUT_LINE('l_bp_changed '||l_bp_changed);
5458 
5459      --Resolve Bug # 3078244
5460 
5461     IF l_bp_changed = 'Y' THEN
5462 
5463       --DBMS_OUTPUT.PUT_LINE(' p_charges_detail_rec.transaction_type_id '||p_charges_detail_rec.transaction_type_id);
5464 
5465       --Check to see if the
5466 
5467       IF p_charges_detail_rec.transaction_type_id <> FND_API.G_MISS_NUM AND
5468          p_charges_detail_rec.transaction_type_id IS NOT NULL THEN
5469 
5470         --DBMS_OUTPUT.PUT_LINE('Transaction Type Passed BP Changed');
5471 
5472         VALIDATE_TXN_TYPE(P_API_NAME                  => p_api_name,
5473                           P_BUSINESS_PROCESS_ID       => x_charges_detail_rec.business_process_id,
5474                           P_TXN_TYPE_ID               => p_charges_detail_rec.transaction_type_id,
5475                           P_SOURCE_CODE               => x_charges_detail_rec.source_code,
5476                           X_LINE_ORDER_CATEGORY_CODE  => l_line_order_category_code,
5477                           X_NO_CHARGE_FLAG            => l_no_charge_flag ,
5478                           X_INTERFACE_TO_OE_FLAG      => l_interface_to_oe_flag,
5479                           X_UPDATE_IB_FLAG            => l_update_ib_flag,
5480                           X_SRC_REFERENCE_REQD_FLAG   => l_src_reference_reqd_flag,
5481                           X_SRC_RETURN_REQD_FLAG      => l_src_return_reqd_flag,
5482                           X_NON_SRC_REFERENCE_REQD    => l_non_src_reference_reqd_flag ,
5483                           X_NON_SRC_RETURN_REQD       => l_non_src_return_reqd,
5484                           X_MSG_DATA                  => l_msg_data,
5485                           X_MSG_COUNT                 => l_msg_count,
5486                           X_RETURN_STATUS             => l_return_status );
5487 
5488         IF l_return_status = FND_API.G_RET_STS_ERROR THEN
5489           RAISE FND_API.G_EXC_ERROR;
5490         ELSIF l_return_status = FND_API.G_RET_STS_UNEXP_ERROR THEN
5491           RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
5492         ELSE
5493           x_charges_detail_rec.transaction_type_id := p_charges_detail_rec.transaction_type_id;
5494           l_transaction_type_changed := 'Y';
5495         END IF ;
5496 
5497       ELSE
5498 
5499         --DBMS_OUTPUT.PUT_LINE('Transaction Type Not Passed BP Changed');
5500         -- p_charges_detail_rec.transaction_type_id is not passed
5501         -- validate the one from database against the business process changed
5502         VALIDATE_TXN_TYPE(P_API_NAME                  => p_api_name,
5503                           P_BUSINESS_PROCESS_ID       => x_charges_detail_rec.business_process_id,
5504                           P_TXN_TYPE_ID               => l_db_det_rec.transaction_type_id,
5505                           P_SOURCE_CODE               => x_charges_detail_rec.source_code,
5506                           X_LINE_ORDER_CATEGORY_CODE  => l_line_order_category_code,
5507                           X_NO_CHARGE_FLAG            => l_no_charge_flag ,
5508                           X_INTERFACE_TO_OE_FLAG      => l_interface_to_oe_flag,
5509                           X_UPDATE_IB_FLAG            => l_update_ib_flag,
5510                           X_SRC_REFERENCE_REQD_FLAG   => l_src_reference_reqd_flag,
5511                           X_SRC_RETURN_REQD_FLAG      => l_src_return_reqd_flag,
5512                           X_NON_SRC_REFERENCE_REQD    => l_non_src_reference_reqd_flag ,
5513                           X_NON_SRC_RETURN_REQD       => l_non_src_return_reqd,
5514                           X_MSG_DATA                  => l_msg_data,
5515                           X_MSG_COUNT                 => l_msg_count,
5516                           X_RETURN_STATUS             => l_return_status );
5517 
5518         IF l_return_status = FND_API.G_RET_STS_ERROR THEN
5519           RAISE FND_API.G_EXC_ERROR;
5520         ELSIF l_return_status = FND_API.G_RET_STS_UNEXP_ERROR THEN
5521           RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
5522         ELSE
5523           x_charges_detail_rec.transaction_type_id := l_db_det_rec.transaction_type_id;
5524           l_transaction_type_changed := 'N';
5525         END IF ;
5526       END IF;
5527     ELSE
5528       -- l_bp_changed = 'N'
5529       -- p_charges_detail_rec.transaction_type_id is NOT NULL
5530       --DBMS_OUTPUT.PUT_LINE('l_bp_changed = N');
5531 
5532 
5533       IF p_charges_detail_rec.transaction_type_id <> FND_API.G_MISS_NUM AND
5534          p_charges_detail_rec.transaction_type_id IS NOT NULL THEN
5535 
5536         --DBMS_OUTPUT.PUT_LINE('Transaction Type Passed BP  not Changed');
5537         VALIDATE_TXN_TYPE(P_API_NAME                  => p_api_name,
5538                           P_BUSINESS_PROCESS_ID       => x_charges_detail_rec.business_process_id,
5539                           P_TXN_TYPE_ID               => p_charges_detail_rec.transaction_type_id,
5540                           P_SOURCE_CODE               => x_charges_detail_rec.source_code,
5541                           X_LINE_ORDER_CATEGORY_CODE  => l_line_order_category_code,
5542                           X_NO_CHARGE_FLAG            => l_no_charge_flag ,
5543                           X_INTERFACE_TO_OE_FLAG      => l_interface_to_oe_flag,
5544                           X_UPDATE_IB_FLAG            => l_update_ib_flag,
5545                           X_SRC_REFERENCE_REQD_FLAG   => l_src_reference_reqd_flag,
5546                           X_SRC_RETURN_REQD_FLAG      => l_src_return_reqd_flag,
5547                           X_NON_SRC_REFERENCE_REQD    => l_non_src_reference_reqd_flag ,
5548                           X_NON_SRC_RETURN_REQD       => l_non_src_return_reqd,
5549                           X_MSG_DATA                  => l_msg_data,
5550                           X_MSG_COUNT                 => l_msg_count,
5551                           X_RETURN_STATUS             => l_return_status );
5552         IF l_return_status = FND_API.G_RET_STS_ERROR THEN
5553           RAISE FND_API.G_EXC_ERROR;
5554         ELSIF l_return_status = FND_API.G_RET_STS_UNEXP_ERROR THEN
5555           RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
5556         END IF;
5557 
5558         x_charges_detail_rec.transaction_type_id := p_charges_detail_rec.transaction_type_id;
5559         l_transaction_type_changed := 'Y';
5560 
5561       ELSE
5562 
5563         IF p_charges_detail_rec.transaction_type_id = FND_API.G_MISS_NUM OR
5564            p_charges_detail_rec.transaction_type_id  IS NULL THEN
5565 
5566            --DBMS_OUTPUT.PUT_LINE('Transaction Type Not Passed BP not Changed');
5567            -- transaction type is not passed
5568            -- transaction type has not changed
5569            x_charges_detail_rec.transaction_type_id := l_db_det_rec.transaction_type_id;
5570            l_transaction_type_changed := 'N';
5571 
5572            -- however call validate_txn_type just to get all the values which will be useful
5573            -- while validating instance
5574 
5575            VALIDATE_TXN_TYPE(P_API_NAME               => p_api_name,
5576                           P_BUSINESS_PROCESS_ID       => x_charges_detail_rec.business_process_id,
5577                           P_TXN_TYPE_ID               => x_charges_detail_rec.transaction_type_id,
5578                           P_SOURCE_CODE               => x_charges_detail_rec.source_code,
5579                           X_LINE_ORDER_CATEGORY_CODE  => l_line_order_category_code,
5580                           X_NO_CHARGE_FLAG            => l_no_charge_flag ,
5581                           X_INTERFACE_TO_OE_FLAG      => l_interface_to_oe_flag,
5582                           X_UPDATE_IB_FLAG            => l_update_ib_flag,
5583                           X_SRC_REFERENCE_REQD_FLAG   => l_src_reference_reqd_flag,
5584                           X_SRC_RETURN_REQD_FLAG      => l_src_return_reqd_flag,
5585                           X_NON_SRC_REFERENCE_REQD    => l_non_src_reference_reqd_flag ,
5586                           X_NON_SRC_RETURN_REQD       => l_non_src_return_reqd,
5587                           X_MSG_DATA                  => l_msg_data,
5588                           X_MSG_COUNT                 => l_msg_count,
5589                           X_RETURN_STATUS             => l_return_status );
5590            IF l_return_status = FND_API.G_RET_STS_ERROR THEN
5591              RAISE FND_API.G_EXC_ERROR;
5592            ELSIF l_return_status = FND_API.G_RET_STS_UNEXP_ERROR THEN
5593             RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
5594            END IF;
5595 
5596         END IF;
5597       END IF;
5598     END IF;
5599     --DBMS_OUTPUT.PUT_LINE('passed transaction_type id validation in update ');
5600     --DBMS_OUTPUT.PUT_LINE('l_line_order_category_code = '||l_line_order_category_code);
5601     --DBMS_OUTPUT.PUT_LINE('l_no_charge_flag = '||l_no_charge_flag);
5602     --DBMS_OUTPUT.PUT_LINE('l_update_ib_flag = '||l_update_ib_flag);
5603     --DBMS_OUTPUT.PUT_LINE('l_src_reference_reqd_flag = '||l_src_reference_reqd_flag);
5604     --DBMS_OUTPUT.PUT_LINE('l_src_return_reqd_flag = '||l_src_return_reqd_flag);
5605     --DBMS_OUTPUT.PUT_LINE('l_non_src_reference_reqd_flag = '||l_non_src_reference_reqd_flag);
5606     --DBMS_OUTPUT.PUT_LINE('l_non_src_return_reqd = '||l_non_src_return_reqd);
5607     --DBMS_OUTPUT.PUT_LINE('l_return_status '||l_return_status );
5608   END IF;
5609 
5610 --====================================
5611 -- Line Order Category Code Validation
5612 --====================================
5613   --DBMS_OUTPUT.PUT_LINE('Line Order Category Code Validation ...');
5614 
5615   l_line_order_category_code  :=  NVL(l_line_order_category_code, p_charges_detail_rec.line_category_code);
5616 
5617   IF p_validation_mode = 'I' THEN
5618     IF p_charges_detail_rec.line_category_code IS NOT NULL THEN
5619 
5620       IF p_charges_detail_rec.line_category_code <> l_line_order_category_code THEN
5621         --raise error
5622         FND_MESSAGE.SET_NAME('CS', 'CS_CHG_INVALID_LN_ORD_CATEGORY');
5623         FND_MESSAGE.SET_TOKEN('LINE_ORDER_CATEGORY', p_charges_detail_rec.line_category_code);
5624         FND_MSG_PUB.ADD;
5625         RAISE FND_API.G_EXC_ERROR;
5626       ELSE
5627         -- the p_charges_detail_rec.line_category_code
5628         -- matches l_line_order_category_code
5629         -- assign to out record
5630         x_charges_detail_rec.line_category_code := p_charges_detail_rec.line_category_code;
5631       END IF;
5632 
5633     ELSE
5634       -- p_charges_detail_rec.line_category_code IS NULL
5635       -- assign the l_line_order_category_code to out record
5636       x_charges_detail_rec.line_category_code := l_line_order_category_code;
5637 
5638     END IF;
5639 
5640   ELSIF p_validation_mode = 'U' THEN
5641 
5642     -- Resolve Bug # 3078244
5643     -- line_order_category can change due to changed transaction type
5644 
5645     IF l_transaction_type_changed = 'Y' THEN
5646       IF p_charges_detail_rec.line_category_code <> FND_API.G_MISS_CHAR AND
5647          p_charges_detail_rec.line_category_code IS NOT NULL THEN
5648         IF p_charges_detail_rec.line_category_code <> l_line_order_category_code THEN
5649           --raise error
5650           FND_MESSAGE.SET_NAME('CS', 'CS_CHG_INVALID_LN_ORD_CATEGORY');
5651           FND_MESSAGE.SET_TOKEN('LINE_ORDER_CATEGORY', p_charges_detail_rec.line_category_code);
5652           FND_MSG_PUB.ADD;
5653           RAISE FND_API.G_EXC_ERROR;
5654         ELSE
5655           -- the p_charges_detail_rec.line_category_code
5656           -- matches l_line_order_category_code
5657           -- assign to out record
5658           x_charges_detail_rec.line_category_code := p_charges_detail_rec.line_category_code;
5659         END IF;
5660       ELSE
5661         -- p_charges_detail_rec.line_category_code is not passed
5662         -- assign the l_line_order_category_code to out record
5663         x_charges_detail_rec.line_category_code := l_line_order_category_code;
5664       END IF;
5665     ELSE
5666       -- l_transaction_type_changed := 'N'
5667       IF p_charges_detail_rec.line_category_code <> FND_API.G_MISS_CHAR AND
5668          p_charges_detail_rec.line_category_code IS NOT NULL THEN
5669         IF p_charges_detail_rec.line_category_code <> l_db_det_rec.line_category_code THEN
5670           --raise error
5671           FND_MESSAGE.SET_NAME('CS', 'CS_CHG_INVALID_LN_ORD_CATEGORY');
5672           FND_MESSAGE.SET_TOKEN('LINE_ORDER_CATEGORY', p_charges_detail_rec.line_category_code);
5673           FND_MSG_PUB.ADD;
5674           RAISE FND_API.G_EXC_ERROR;
5675         ELSE
5676           -- the p_charges_detail_rec.line_category_code
5677           -- matches l_db_det_rec.line_category_code
5678           -- assign to out record
5679           x_charges_detail_rec.line_category_code := p_charges_detail_rec.line_category_code;
5680         END IF;
5681       ELSE
5682         -- p_charges_detail_rec.line_category_code IS not passed
5683         -- assign the l_line_order_category_code to out record
5684         x_charges_detail_rec.line_category_code := l_db_det_rec.line_category_code;
5685       END IF;
5686     END IF;
5687 
5688     --DBMS_OUTPUT.PUT_LINE('passed line order category code validation');
5689 
5690   END IF;
5691 
5692 --===================================
5693 --Intreface To OE Flag Validation
5694 --===================================
5695   IF p_validation_mode = 'I' THEN
5696 
5697     -- If the interface_to_oe_flag is passed then use the interface_oe_flag passed by
5698     -- upstream application.
5699     -- If not passed then default this from the Transaction Type Setup
5700 
5701     -- Added for Bug # 5135284
5702     IF p_charges_detail_rec.interface_to_oe_flag IS NOT NULL AND
5703        p_charges_detail_rec.interface_to_oe_flag IN ('Y', 'N') THEN
5704        x_charges_detail_rec.interface_to_oe_flag := p_charges_detail_rec.interface_to_oe_flag;
5705     ELSE
5706       -- p_charges_detail_rec.interface_to_oe_flag is null
5707       -- default it to l_interface_to_oe_flag
5708       x_charges_detail_rec.interface_to_oe_flag := l_interface_to_oe_flag;
5709     END IF;
5710 
5711   ELSIF p_validation_mode = 'U' THEN
5712 
5713 
5714     -- Added for Bug # 5135284
5715      IF l_transaction_type_changed = 'Y' THEN
5716        IF p_charges_detail_rec.interface_to_oe_flag <> FND_API.G_MISS_CHAR AND
5717           p_charges_detail_rec.interface_to_oe_flag IS NOT NULL THEN
5718 
5719           IF p_charges_detail_rec.interface_to_oe_flag IN ('Y', 'N') THEN
5720             x_charges_detail_rec.interface_to_oe_flag := p_charges_detail_rec.interface_to_oe_flag;
5721           ELSE
5722             x_charges_detail_rec.interface_to_oe_flag := l_interface_to_oe_flag;
5723           END IF;
5724 
5725        ELSIF p_charges_detail_rec.interface_to_oe_flag IS NULL THEN
5726           x_charges_detail_rec.interface_to_oe_flag := 'N';
5727        ELSE
5728           x_charges_detail_rec.interface_to_oe_flag := l_interface_to_oe_flag;
5729        END IF;
5730 
5731      ELSE
5732         -- l_transaction_type_changed = 'N'
5733         IF p_charges_detail_rec.interface_to_oe_flag <> FND_API.G_MISS_CHAR AND
5734            p_charges_detail_rec.interface_to_oe_flag IS NOT NULL THEN
5735 
5736             IF p_charges_detail_rec.interface_to_oe_flag IN ('Y', 'N') THEN
5737               x_charges_detail_rec.interface_to_oe_flag := p_charges_detail_rec.interface_to_oe_flag;
5738             ELSE
5739               x_charges_detail_rec.interface_to_oe_flag := l_db_det_rec.interface_to_oe_flag;
5740             END IF;
5741 
5742         ELSIF p_charges_detail_rec.interface_to_oe_flag IS NULL THEN
5743            x_charges_detail_rec.interface_to_oe_flag := 'N';
5744         ELSE
5745            x_charges_detail_rec.interface_to_oe_flag := l_db_det_rec.interface_to_oe_flag;
5746         END IF;
5747 
5748      END IF;
5749 
5750      --DBMS_OUTPUT.PUT_LINE('passed interface_oe_flag validation');
5751   END IF;
5752 
5753 --====================================
5754 -- No Charge Flag Validation
5755 --====================================
5756   IF p_validation_mode = 'I' THEN
5757 
5758     -- If the no_charge_flag is passed then use the no_charge_flag passed by
5759     -- upstream application.
5760     -- If not passed then default this from the Transaction Type Setup
5761     -- Added for Bug # 5135284
5762     IF p_charges_detail_rec.no_charge_flag IS NOT NULL AND
5763        p_charges_detail_rec.no_charge_flag IN ('Y', 'N') THEN
5764       x_charges_detail_rec.no_charge_flag := p_charges_detail_rec.no_charge_flag;
5765     ELSE
5766       -- p_charges_detail_rec.no_charge_flag is null
5767       -- default it to l_no_charge_flag
5768       x_charges_detail_rec.no_charge_flag := l_no_charge_flag;
5769     END IF;
5770 
5771   ELSIF p_validation_mode = 'U' THEN
5772 
5773      -- Resolve Bug # 3078244
5774      -- If Transaction Type is changed and then
5775      -- if no_charge_flag is passed then use the no_charge_flag passed by
5776      -- upstream application
5777      -- if not passed then use the one from the database
5778 
5779      IF l_transaction_type_changed = 'Y' THEN
5780        IF p_charges_detail_rec.no_charge_flag <> FND_API.G_MISS_CHAR AND
5781           p_charges_detail_rec.no_charge_flag IS NOT NULL THEN
5782           IF p_charges_detail_rec.no_charge_flag IN ('Y', 'N') THEN
5783             x_charges_detail_rec.no_charge_flag := p_charges_detail_rec.no_charge_flag;
5784           ELSE
5785             x_charges_detail_rec.no_charge_flag := l_no_charge_flag;
5786           END IF;
5787        ELSIF p_charges_detail_rec.no_charge_flag IS NULL THEN
5788           x_charges_detail_rec.no_charge_flag := 'N';
5789        ELSE
5790           x_charges_detail_rec.no_charge_flag := l_no_charge_flag;
5791        END IF;
5792 
5793      ELSE
5794         -- l_transaction_type_changed = 'N'
5795         IF p_charges_detail_rec.no_charge_flag <> FND_API.G_MISS_CHAR AND
5796            p_charges_detail_rec.no_charge_flag IS NOT NULL THEN
5797            IF p_charges_detail_rec.no_charge_flag IN ('Y', 'N') THEN
5798             x_charges_detail_rec.no_charge_flag := p_charges_detail_rec.no_charge_flag;
5799           ELSE
5800             x_charges_detail_rec.no_charge_flag := l_db_det_rec.no_charge_flag;
5801           END IF;
5802         ELSIF p_charges_detail_rec.no_charge_flag IS NULL THEN
5803           x_charges_detail_rec.no_charge_flag := 'N';
5804         ELSE
5805            x_charges_detail_rec.no_charge_flag := l_db_det_rec.no_charge_flag;
5806         END IF;
5807 
5808      END IF;
5809 
5810      --DBMS_OUTPUT.PUT_LINE('passed no charge flag validation');
5811   END IF;
5812 
5813  --======================
5814  --Item Validation
5815  --======================
5816   --DBMS_OUTPUT.PUT_LINE('Item Validation ...');
5817 
5818   IF p_validation_mode = 'I' THEN
5819 
5820     IF p_charges_detail_rec.inventory_item_id_in IS NULL THEN
5821       Add_Null_Parameter_Msg(l_api_name,
5822                              'inventory_item_id') ;
5823 
5824       Add_Invalid_Argument_Msg(l_api_name,
5825                                to_char(p_charges_detail_rec.inventory_item_id_in),
5826                                'inventory_item_id');
5827       RAISE FND_API.G_EXC_ERROR ;
5828 
5829     ELSE
5830       -- Inventory_Item_ID is not null, call Validate Item
5831 
5832       --DBMS_OUTPUT.PUT_LINE('Calling VALIDATE_ITEM. p_charges_detail_rec.inventory_item_id_in='||p_charges_detail_rec.inventory_item_id_in);
5833 
5834       VALIDATE_ITEM(P_API_NAME            => p_api_name,
5835                     P_INV_ID              => p_charges_detail_rec.inventory_item_id_in,
5836                     P_UPDATE_IB_FLAG      => l_update_ib_flag,
5837                     X_COMMS_TRACKABLE_FLAG=> l_comms_trackable_flag,
5838                     X_SERIAL_CONTROL_FLAG => l_serial_control_flag,
5839                     X_REV_CONTROL_FLAG    => l_rev_control_flag,
5840                     X_MSG_DATA            => l_msg_data,
5841                     X_MSG_COUNT           => l_msg_count,
5842                     X_RETURN_STATUS       => l_return_status);
5843 
5844       --DBMS_OUTPUT.PUT_LINE('Back from VALIDATE_ITEM '||l_return_status);
5845 
5846       IF l_return_status <> FND_API.G_RET_STS_SUCCESS THEN
5847         FND_MESSAGE.SET_NAME('CS', 'CS_CHG_VALIDATE_ITEM_ERROR');
5848         FND_MESSAGE.SET_TOKEN('INV_ID', p_charges_detail_rec.inventory_item_id_in);
5849         FND_MSG_PUB.ADD;
5850         RAISE FND_API.G_EXC_ERROR;
5851       ELSE
5852         --assign to out record
5853         x_charges_detail_rec.inventory_item_id_in := p_charges_detail_rec.inventory_item_id_in;
5854       END IF;
5855 
5856     END IF;
5857 
5858   ELSIF p_validation_mode = 'U' THEN
5859 
5860     --DBMS_OUTPUT.PUT_LINE( 'In update for item val');
5861     --DBMS_OUTPUT.PUT_LINE( 'p_charges_detail_rec.inventory_item_id_in '||p_charges_detail_rec.inventory_item_id_in);
5862 
5863     -- Resolve Bug # 3078244
5864     IF p_charges_detail_rec.inventory_item_id_in <> FND_API.G_MISS_NUM AND
5865        p_charges_detail_rec.inventory_item_id_in IS NOT NULL THEN
5866 
5867       IF l_db_det_rec.customer_product_id IS NOT NULL AND
5868         p_charges_detail_rec.inventory_item_id_in <> l_db_det_rec.inventory_item_id AND
5869         p_charges_detail_rec.customer_product_id IS NULL AND
5870         l_src_reference_reqd_flag = 'Y' AND
5871         l_src_return_reqd_flag = 'Y' AND
5872         l_update_ib_flag = 'Y' AND
5873         l_line_order_category_code = 'RETURN' THEN
5874 
5875         --DBMS_OUTPUT.PUT_LINE('Cannot change item');
5876 
5877         Cant_Update_Detail_Param_Msg(l_api_name_full,
5878                                      'INVENTORY_ITEM_ID',
5879                                      to_char(p_charges_DETAIL_rec.inventory_item_id_in));
5880 
5881         RAISE FND_API.G_EXC_ERROR ;
5882 
5883 
5884       ELSE
5885 
5886         --DBMS_OUTPUT.PUT_LINE('p_charges_detail_rec.inventory_item_id_in not null');
5887         -- Validate Item
5888         VALIDATE_ITEM(P_API_NAME                  => p_api_name,
5889                       P_INV_ID                    => p_charges_detail_rec.inventory_item_id_in,
5890                       P_UPDATE_IB_FLAG            => l_update_ib_flag,
5891                       X_COMMS_TRACKABLE_FLAG      => l_comms_trackable_flag,
5892                       X_SERIAL_CONTROL_FLAG       => l_serial_control_flag,
5893                       X_REV_CONTROL_FLAG          => l_rev_control_flag,
5894                       X_MSG_DATA                  => l_msg_data,
5895                       X_MSG_COUNT                 => l_msg_count,
5896                       X_RETURN_STATUS             => l_return_status);
5897 
5898         --DBMS_OUTPUT.PUT_LINE('l_return_status = '||l_return_status);
5899 
5900         IF l_return_status <> FND_API.G_RET_STS_SUCCESS THEN
5901           FND_MESSAGE.SET_NAME('CS', 'CS_CHG_VALIDATE_ITEM_ERROR');
5902           FND_MESSAGE.SET_TOKEN('INV_ID', p_charges_detail_rec.inventory_item_id_in);
5903           FND_MSG_PUB.ADD;
5904           RAISE FND_API.G_EXC_ERROR;
5905         END IF;
5906 
5907         --assign to out record
5908         x_charges_detail_rec.inventory_item_id_in := p_charges_detail_rec.inventory_item_id_in;
5909 
5910         --Condition added to fix Bug # 3358531
5911         --the flags will only be set to Y if they do not match the database
5912         IF x_charges_detail_rec.inventory_item_id_in <> l_db_det_rec.inventory_item_id THEN
5913           -- Item is changed so recalculate the price
5914           l_calc_sp := 'Y' ;
5915           l_item_changed := 'Y';
5916         END IF;
5917 
5918         --DBMS_OUTPUT.PUT_LINE('Item Valid');
5919 
5920       END IF ;
5921 
5922     ELSE
5923       --p_charges_detail_rec.inventory_item_id_in is not passed
5924       --assign to out record
5925       IF p_charges_detail_rec.inventory_item_id_in = FND_API.G_MISS_NUM OR
5926          p_charges_detail_rec.inventory_item_id_in IS NULL THEN
5927 
5928          x_charges_detail_rec.inventory_item_id_in := l_db_det_rec.inventory_item_id;
5929 
5930          --again need to validate the item as all flags are not stored in DB
5931          VALIDATE_ITEM(P_API_NAME                 => p_api_name,
5932                       P_INV_ID                    => x_charges_detail_rec.inventory_item_id_in,
5933                       P_UPDATE_IB_FLAG            => l_update_ib_flag,
5934                       X_COMMS_TRACKABLE_FLAG      => l_comms_trackable_flag,
5935                       X_SERIAL_CONTROL_FLAG       => l_serial_control_flag,
5936                       X_REV_CONTROL_FLAG          => l_rev_control_flag,
5937                       X_MSG_DATA                  => l_msg_data,
5938                       X_MSG_COUNT                 => l_msg_count,
5939                       X_RETURN_STATUS             => l_return_status);
5940 
5941          --DBMS_OUTPUT.PUT_LINE('item from db');
5942       END IF;
5943 
5944     END IF;
5945 
5946     --DBMS_OUTPUT.PUT_LINE('Passed Item Validation');
5947     --DBMS_OUTPUT.PUT_LINE('Item is = '||x_charges_detail_rec.inventory_item_id_in);
5948   END IF;
5949 
5950 
5951 
5952  --=========================
5953  --Item Revision Validation
5954  --=========================
5955   --DBMS_OUTPUT.PUT_LINE('Item Revision Validation ...');
5956   IF p_validation_mode = 'I' THEN
5957     IF l_rev_control_flag = 'Y' THEN
5958       IF p_charges_detail_rec.item_revision IS NOT NULL AND
5959          p_charges_detail_rec.item_revision <> FND_API.G_MISS_CHAR THEN
5960            -- Added for fix:5125858
5961             IF IS_ITEM_REVISION_VALID(
5962                  p_inventory_item_id => p_charges_detail_rec.inventory_item_id_in,
5963                  p_item_revision    => p_charges_detail_rec.item_revision,
5964                  x_msg_data         => l_msg_data,
5965                  x_msg_count        => l_msg_count,
5966                  x_return_status    => l_return_status) = 'N' THEN
5967 
5968                  Add_Invalid_Argument_Msg(l_api_name,
5969                                           TO_CHAR(p_charges_detail_rec.item_revision),
5970                                           'item_revision');
5971                   RAISE FND_API.G_EXC_ERROR;
5972              ELSE
5973                   x_charges_detail_rec.item_revision := p_charges_detail_rec.item_revision;
5974 
5975             END IF;
5976       ELSE
5977         --item is revision controlled but item revsion is null
5978         --raise error
5979         --FND_MESSAGE.SET_NAME('CS', 'CS_CHG_INVALID_ITEM_REVISION');
5980         --FND_MESSAGE.SET_TOKEN('INVENTORY_ITEM_ID', p_charges_detail_rec.inventory_item_id_in, TRUE);
5981         --FND_MESSAGE.SET_TOKEN('ITEM_REVISION', p_charges_detail_rec.item_revision, TRUE);
5982         --FND_MSG_PUB.ADD;
5983         --RAISE FND_API.G_EXC_ERROR;
5984         x_charges_detail_rec.item_revision := NULL;
5985       END IF;
5986     ELSE
5987       -- l_rev_control_flag = 'N'
5988       x_charges_detail_rec.item_revision := NULL;
5989     END IF;
5990 
5991   ELSIF p_validation_mode = 'U' THEN
5992 
5993     -- Resolve Bug # 3078244
5994 
5995     IF l_item_changed = 'Y' THEN
5996       IF l_rev_control_flag = 'Y' THEN
5997         IF p_charges_detail_rec.item_revision <> FND_API.G_MISS_CHAR AND
5998            p_charges_detail_rec.item_revision IS NOT NULL THEN
5999 
6000            -- Added for fix:5125858
6001             IF IS_ITEM_REVISION_VALID(
6002                  p_inventory_item_id => p_charges_detail_rec.inventory_item_id_in,
6003                  p_item_revision    => p_charges_detail_rec.item_revision,
6004                  x_msg_data         => l_msg_data,
6005                  x_msg_count        => l_msg_count,
6006                  x_return_status    => l_return_status) = 'N' THEN
6007 
6008                  Add_Invalid_Argument_Msg(l_api_name,
6009                                           TO_CHAR(p_charges_detail_rec.item_revision),
6010                                           'item_revision');
6011                   RAISE FND_API.G_EXC_ERROR;
6012              ELSE
6013                   x_charges_detail_rec.item_revision := p_charges_detail_rec.item_revision;
6014 
6015             END IF;
6016 
6017         ELSE
6018           --item is revision controlled but item revsion is null, raise error
6019           --FND_MESSAGE.SET_NAME('CS', 'CS_CHG_INVALID_ITEM_REVISION');
6020           --FND_MESSAGE.SET_TOKEN('INVENTORY_ITEM_ID', p_charges_detail_rec.inventory_item_id_in, TRUE);
6021           --FND_MESSAGE.SET_TOKEN('ITEM_REVISION', p_charges_detail_rec.item_revision, TRUE);
6022           --FND_MSG_PUB.ADD;
6023           --RAISE FND_API.G_EXC_ERROR;
6024           x_charges_detail_rec.item_revision := NULL;
6025         END IF;
6026       ELSE
6027         --l_rev_control_flag = 'N' THEN ignore the item revision
6028         x_charges_detail_rec.item_revision := NULL;
6029       END IF;
6030     ELSE
6031       --l_item_changed = 'N'
6032       IF l_db_det_rec.item_revision IS NOT NULL THEN
6033         l_rev_control_flag := 'Y' ;
6034       ELSE
6035         l_rev_control_flag := 'N' ;
6036       END IF;
6037 
6038       IF l_rev_control_flag = 'Y' THEN
6039         IF p_charges_detail_rec.item_revision <> FND_API.G_MISS_CHAR AND
6040            p_charges_detail_rec.item_revision IS NOT NULL THEN
6041            --
6042            -- Added for fix:5125858
6043             IF IS_ITEM_REVISION_VALID(
6044                  p_inventory_item_id => p_charges_detail_rec.inventory_item_id_in,
6045                  p_item_revision    => p_charges_detail_rec.item_revision,
6046                  x_msg_data         => l_msg_data,
6047                  x_msg_count        => l_msg_count,
6048                  x_return_status    => l_return_status) = 'N' THEN
6049 
6050                  Add_Invalid_Argument_Msg(l_api_name,
6051                                           TO_CHAR(p_charges_detail_rec.item_revision),
6052                                           'item_revision');
6053                   RAISE FND_API.G_EXC_ERROR;
6054              ELSE
6055                   x_charges_detail_rec.item_revision := p_charges_detail_rec.item_revision;
6056 
6057             END IF;
6058            --
6059            -- Added for fix:5125858
6060         ELSE
6061            --get the revision from the database
6062            x_charges_detail_rec.item_revision := l_db_det_rec.item_revision;
6063         END IF;
6064       ELSE
6065         --l_rev_control_flag = 'N' THEN ignore the item revision
6066         x_charges_detail_rec.item_revision := NULL;
6067       END IF;
6068 
6069     END IF;
6070 
6071     --DBMS_OUTPUT.PUT_LINE('Item Revision '||x_charges_detail_rec.item_revision);
6072 
6073 
6074   END IF;
6075 
6076  --=========================
6077  --Line Number Validation
6078  --=========================
6079   --DBMS_OUTPUT.PUT_LINE('Line Number Validation ...');
6080   -- Added for fix:5125385
6081   IF p_validation_mode = 'I' THEN
6082      IF p_charges_detail_rec.line_number IS NOT NULL AND
6083         p_charges_detail_rec.line_number <> FND_API.G_MISS_NUM THEN
6084            -- If the line number already exists or <= 0, then raise an error message
6085             IF IS_LINE_NUMBER_VALID(
6086                  p_line_number => p_charges_detail_rec.line_number,
6087                  p_incident_id => p_charges_detail_rec.incident_id,
6088                  x_msg_data         => l_msg_data,
6089                  x_msg_count        => l_msg_count,
6090                  x_return_status    => l_return_status) = 'Y' THEN
6091 
6092                  Add_Invalid_Argument_Msg(l_api_name,
6093                                           TO_CHAR(p_charges_detail_rec.line_number),
6094                                           'line_number');
6095                   RAISE FND_API.G_EXC_ERROR;
6096              ELSE
6097                   x_charges_detail_rec.line_number := p_charges_detail_rec.line_number;
6098 
6099             END IF;
6100 
6101       END IF;
6102 
6103   ELSIF p_validation_mode = 'U' THEN
6104     -- no validation is performed for update mode
6105     null;
6106 
6107  END IF;
6108  --======================
6109  --UOM Validation
6110  --======================
6111   --DBMS_OUTPUT.PUT_LINE('UOM Validation ...  p_charges_detail_rec.unit_of_measure_code='||p_charges_detail_rec.unit_of_measure_code);
6112   IF p_validation_mode = 'I' THEN
6113 
6114     IF p_charges_detail_rec.unit_of_measure_code IS NOT NULL THEN
6115 
6116 
6117        l_valid_check := IS_UOM_VALID(
6118                         p_inv_id        => p_charges_detail_rec.inventory_item_id_in,
6119                         p_uom_code      => p_charges_detail_rec.unit_of_measure_code,
6120                         x_msg_data      => l_msg_data,
6121                         x_msg_count     => l_msg_count,
6122                         x_return_status => l_return_status);
6123 
6124         IF l_return_status = G_RET_STS_UNEXP_ERROR THEN
6125           RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
6126         ELSIF l_return_status = G_RET_STS_ERROR THEN
6127           RAISE FND_API.G_EXC_ERROR;
6128         END IF;
6129 
6130       IF l_valid_check <> 'Y' THEN
6131         Add_Invalid_Argument_Msg(l_api_name,
6132                                  p_charges_detail_rec.unit_of_measure_code,
6133                                  'Unit_of_Measure_Code');
6134         RAISE FND_API.G_EXC_ERROR;
6135 
6136       ELSE
6137         --assign to out record
6138         x_charges_detail_rec.unit_of_measure_code := p_charges_detail_rec.unit_of_measure_code;
6139       END IF;
6140 
6141     ELSE
6142       -- p_charges_detail_rec.unit_of_measure_code IS NULL, call get primary UOM Proc
6143 
6144       --DBMS_OUTPUT.PUT_LINE('Calling GET_PRIMARY_UOM');
6145       GET_PRIMARY_UOM(P_INV_ID        =>    p_charges_detail_rec.inventory_item_id_in,
6146                       X_PRIMARY_UOM   =>    l_primary_uom,
6147                       X_MSG_DATA      =>    l_msg_data ,
6148                       X_MSG_COUNT     =>    l_msg_count,
6149                       X_RETURN_STATUS =>    l_return_status);
6150 
6151       --DBMS_OUTPUT.PUT_LINE('Back from GET_PRIMARY_UOM status='||l_return_status || '   l_primary_uom '||l_primary_uom);
6152 
6153       --IF l_return_status <> 'S' THEN
6154       IF l_return_status <> FND_API.G_RET_STS_SUCCESS THEN
6155         --raise error
6156         FND_MESSAGE.SET_NAME('CS', 'CS_CHG_GET_PRIMARY_UOM_ERROR');
6157         FND_MESSAGE.SET_TOKEN('INV_ID', p_charges_detail_rec.inventory_item_id_in);
6158         FND_MSG_PUB.ADD;
6159         RAISE FND_API.G_EXC_ERROR;
6160       END IF;
6161 
6162       --assign to out record
6163       x_charges_detail_rec.unit_of_measure_code := l_primary_uom;
6164 
6165     END IF;
6166 
6167   ELSIF p_validation_mode = 'U' THEN
6168 
6169   -- Resolve Bug # 3078244
6170 
6171   IF l_item_changed = 'Y' THEN
6172    IF p_charges_detail_rec.unit_of_measure_code <> FND_API.G_MISS_CHAR AND
6173       p_charges_detail_rec.unit_of_measure_code IS NOT NULL THEN
6174 
6175         l_valid_check := IS_UOM_VALID(
6176                         p_inv_id        => p_charges_detail_rec.inventory_item_id_in,
6177                         p_uom_code      => p_charges_detail_rec.unit_of_measure_code,
6178                         x_msg_data      => l_msg_data,
6179                         x_msg_count     => l_msg_count,
6180                         x_return_status => l_return_status);
6181 
6182         IF l_return_status = G_RET_STS_UNEXP_ERROR THEN
6183           RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
6184         ELSIF l_return_status = G_RET_STS_ERROR THEN
6185           RAISE FND_API.G_EXC_ERROR;
6186         END IF;
6187 
6188       IF l_valid_check <> 'Y' THEN
6189           Add_Invalid_Argument_Msg(l_api_name,
6190                                  p_charges_detail_rec.unit_of_measure_code,
6191                                  'Unit_of_Measure_Code');
6192         RAISE FND_API.G_EXC_ERROR;
6193 
6194       ELSE
6195         --assign to out record
6196         x_charges_detail_rec.unit_of_measure_code := p_charges_detail_rec.unit_of_measure_code;
6197 
6198          --Condition added to fix Bug # 3358531
6199         IF x_charges_detail_rec.unit_of_measure_code <> l_db_det_rec.unit_of_measure_code THEN
6200           --Unit Of Measure is changed need to re-calculate the list price
6201           l_calc_sp := 'Y';
6202         END IF;
6203 
6204       END IF;
6205 
6206 
6207     ELSE
6208         -- p_charges_detail_rec.unit_of_measure_code is not passed
6209         -- get primary UOM Proc
6210         GET_PRIMARY_UOM(P_INV_ID        =>    p_charges_detail_rec.inventory_item_id_in,
6211                         X_PRIMARY_UOM   =>    l_primary_uom,
6212                         X_MSG_DATA      =>    l_msg_data,
6213                         X_MSG_COUNT     =>    l_msg_count,
6214                         X_RETURN_STATUS =>    l_return_status);
6215 
6216         --IF l_return_status <> 'S' THEN
6217         IF l_return_status <> FND_API.G_RET_STS_SUCCESS THEN
6218           --raise error
6219           FND_MESSAGE.SET_NAME('CS', 'CS_CHG_GET_PRIMARY_UOM_ERROR');
6220           FND_MESSAGE.SET_TOKEN('INV_ID', p_charges_detail_rec.inventory_item_id_in);
6221           FND_MSG_PUB.ADD;
6222           RAISE FND_API.G_EXC_ERROR;
6223         END IF;
6224 
6225         --assign to out record
6226         x_charges_detail_rec.unit_of_measure_code := l_primary_uom;
6227 
6228         --Condition added to fix Bug # 3358531
6229         IF x_charges_detail_rec.unit_of_measure_code <> l_db_det_rec.unit_of_measure_code THEN
6230           --Unit Of Measure is changed need to re-calculate the list price
6231           l_calc_sp := 'Y';
6232         END IF;
6233 
6234       END IF;
6235 
6236     ELSE
6237 
6238       -- l_item_changed = 'N';
6239       IF p_charges_detail_rec.unit_of_measure_code <> FND_API.G_MISS_CHAR AND
6240          p_charges_detail_rec.unit_of_measure_code IS NOT NULL THEN
6241 
6242         l_valid_check := IS_UOM_VALID(
6243                         p_inv_id        => p_charges_detail_rec.inventory_item_id_in,
6244                         p_uom_code      => p_charges_detail_rec.unit_of_measure_code,
6245                         x_msg_data      => l_msg_data,
6246                         x_msg_count     => l_msg_count,
6247                         x_return_status => l_return_status);
6248 
6249         IF l_return_status = G_RET_STS_UNEXP_ERROR THEN
6250           RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
6251         ELSIF l_return_status = G_RET_STS_ERROR THEN
6252           RAISE FND_API.G_EXC_ERROR;
6253         END IF;
6254 
6255       IF l_valid_check <> 'Y' THEN
6256         Add_Invalid_Argument_Msg(l_api_name,
6257                                  p_charges_detail_rec.unit_of_measure_code,
6258                                  'Unit_of_Measure_Code');
6259         RAISE FND_API.G_EXC_ERROR;
6260       ELSE
6261         --assign to out record
6262         x_charges_detail_rec.unit_of_measure_code := p_charges_detail_rec.unit_of_measure_code;
6263 
6264         --Condition added to fix Bug # 3358531
6265         IF x_charges_detail_rec.unit_of_measure_code <> l_db_det_rec.unit_of_measure_code THEN
6266           --Unit Of Measure is changed need to re-calculate the list price
6267           l_calc_sp := 'Y';
6268         END IF;
6269       END IF;
6270     ELSE
6271         -- p_charges_rec.unit_of_measure_code is not passed or null
6272         -- assign db record to out record
6273         x_charges_detail_rec.unit_of_measure_code := l_db_det_rec.unit_of_measure_code;
6274     END IF;
6275 
6276   END IF;
6277 
6278   END IF;
6279   --DBMS_OUTPUT.PUT_LINE('UOM Validation completed...  x_charges_detail_rec.unit_of_measure_code='||x_charges_detail_rec.unit_of_measure_code);
6280 
6281 
6282  --==========================================
6283  --Billing Flag Validation    Note: billing flag means billing category
6284  --==========================================
6285   --DBMS_OUTPUT.PUT_LINE('Billing Flag Validation ...');
6286   IF p_validation_mode = 'I' THEN
6287 
6288     --DBMS_OUTPUT.PUT_LINE('Calling GET_BILLING_FLAG. p_charges_detail_rec.inventory_item_id_in=' || p_charges_detail_rec.inventory_item_id_in);
6289     --DBMS_OUTPUT.PUT_LINE('p_charges_detail_rec.transaction_type_id=' || p_charges_detail_rec.transaction_type_id);
6290 
6291     GET_BILLING_FLAG(
6292                      P_API_NAME           => p_api_name,
6293                      P_INV_ID             => p_charges_detail_rec.inventory_item_id_in,
6294                      P_TXN_TYPE_ID        => p_charges_detail_rec.transaction_type_id,
6295                      X_BILLING_FLAG       => l_billing_flag,
6296                      X_MSG_DATA           => l_msg_data,
6297                      X_MSG_COUNT          => l_msg_count,
6298                      X_RETURN_STATUS      => l_return_status);
6299 
6300     --DBMS_OUTPUT.PUT_LINE('Back from GET_BILLING_FLAG. Status='||l_return_status||'  l_billing_flag='||l_billing_flag);
6301 
6302     IF l_return_status <> FND_API.G_RET_STS_SUCCESS THEN
6303       RAISE FND_API.G_EXC_ERROR;
6304     END IF;
6305 
6306     --DBMS_OUTPUT.PUT_LINE('p_charges_detail_rec.billing_flag = ' || p_charges_detail_rec.billing_flag);
6307     --DBMS_OUTPUT.PUT_LINE('l_billing_flag = ' || l_billing_flag);
6308 
6309     IF p_charges_detail_rec.billing_flag IS NOT NULL THEN
6310       --DBMS_OUTPUT.PUT_LINE('P_Billing_Flag is not null');
6311       IF p_charges_detail_rec.billing_flag = l_billing_flag THEN
6312         x_charges_detail_rec.billing_flag := p_charges_detail_rec.billing_flag;
6313       ELSE
6314         -- Billing Flag does not match, raise Error
6315         FND_MESSAGE.SET_NAME('CS', 'CS_CHG_INVALID_BILLING_FLAG');
6316         FND_MESSAGE.SET_TOKEN('BILLING_FLAG', p_charges_detail_rec.billing_flag);
6317         FND_MSG_PUB.ADD;
6318         RAISE FND_API.G_EXC_ERROR;
6319       END IF;
6320     ELSE
6321       -- p_charges_detail_rec.billing_flag is null
6322       -- assign l_billing_flag to out record
6323       --DBMS_OUTPUT.PUT_LINE('P_Billing_Flag is not null');
6324       x_charges_detail_rec.billing_flag := l_billing_flag;
6325     END IF;
6326 
6327     --DBMS_OUTPUT.PUT_LINE('Billing Flag is '||x_charges_detail_rec.billing_flag);
6328 
6329   ELSIF p_validation_mode = 'U' THEN
6330 
6331     IF l_item_changed = 'Y' OR
6332        l_transaction_type_changed = 'Y' THEN
6333        --get the new billing flag
6334       GET_BILLING_FLAG(
6335                        P_API_NAME           => p_api_name,
6336                        P_INV_ID             => x_charges_detail_rec.inventory_item_id_in,
6337                        P_TXN_TYPE_ID        => x_charges_detail_rec.transaction_type_id,
6338                        X_BILLING_FLAG       => l_billing_flag,
6339                        X_MSG_DATA           => l_msg_data,
6340                        X_MSG_COUNT          => l_msg_count,
6341                        X_RETURN_STATUS      => l_return_status);
6342 
6343       IF l_return_status <> FND_API.G_RET_STS_SUCCESS THEN
6344         RAISE FND_API.G_EXC_ERROR ;
6345       END IF;
6346 
6347       IF p_charges_detail_rec.billing_flag <> FND_API.G_MISS_CHAR AND
6348          p_charges_detail_rec.billing_flag IS NOT NULL THEN
6349         IF p_charges_detail_rec.billing_flag = l_billing_flag THEN
6350           x_charges_detail_rec.billing_flag := p_charges_detail_rec.billing_flag;
6351         ELSE
6352           -- Billing Flag does not match
6353           -- Raise Error
6354           FND_MESSAGE.SET_NAME('CS', 'CS_CHG_INVALID_BILLING_FLAG');
6355           FND_MESSAGE.SET_TOKEN('BILLING_FLAG', p_charges_detail_rec.billing_flag);
6356           FND_MSG_PUB.ADD;
6357           RAISE FND_API.G_EXC_ERROR;
6358         END IF;
6359 
6360       ELSE
6361         -- p_charges_detail_rec.billing_flag is is not passed or is null
6362         -- assign l_billing_flag to out record
6363         x_charges_detail_rec.billing_flag := l_billing_flag;
6364       END IF;
6365 
6366     ELSE
6367       --niether item nor transaction type changed
6368       --assign attribute from db_record
6369       --x_charges_detail_rec.billing_flag := l_db_det_rec.billing_flag;  -- no such column
6370 
6371       GET_BILLING_FLAG(
6372                        P_API_NAME           => p_api_name,
6373                        P_INV_ID             => x_charges_detail_rec.inventory_item_id_in,
6374                        P_TXN_TYPE_ID        => x_charges_detail_rec.transaction_type_id,
6375                        X_BILLING_FLAG       => l_billing_flag,
6376                        X_MSG_DATA           => l_msg_data,
6377                        X_MSG_COUNT          => l_msg_count,
6378                        X_RETURN_STATUS      => l_return_status);
6379 
6380       IF l_return_status <> FND_API.G_RET_STS_SUCCESS THEN
6381         RAISE FND_API.G_EXC_ERROR ;
6382       END IF;
6383 
6384       x_charges_detail_rec.billing_flag := l_billing_flag;
6385     END IF;
6386 
6387     --DBMS_OUTPUT.PUT_LINE('Completes Billing Flag Validation ...');
6388 
6389   END IF;
6390 
6391  --=======================================
6392  --Transaction Billing Type ID Validation
6393  --=======================================
6394   --DBMS_OUTPUT.PUT_LINE('Transaction Billing Type ID Validation ...');
6395   IF p_validation_mode = 'I' THEN
6396 
6397     --DBMS_OUTPUT.PUT_LINE('Calling GET_TXN_BILLING_TYPE');
6398     GET_TXN_BILLING_TYPE(P_API_NAME            => p_api_name,
6399                          P_INV_ID              => p_charges_detail_rec.inventory_item_id_in,
6400                          P_TXN_TYPE_ID         => p_charges_detail_rec.transaction_type_id,
6401                          X_TXN_BILLING_TYPE_ID => l_txn_billing_type_id,
6402                          X_MSG_DATA            => l_msg_data,
6403                          X_MSG_COUNT           => l_msg_count,
6404                          X_RETURN_STATUS       => l_return_status);
6405     --DBMS_OUTPUT.PUT_LINE('Back from GET_TXN_BILLING_TYPE '||l_return_status);
6406 
6407     IF l_return_status <> FND_API.G_RET_STS_SUCCESS THEN
6408 
6409       RAISE FND_API.G_EXC_ERROR ;
6410 
6411     ELSE
6412 
6413       IF p_charges_detail_rec.txn_billing_type_id IS NOT NULL THEN
6414 
6415         IF p_charges_detail_rec.txn_billing_type_id <> l_txn_billing_type_id THEN
6416           --RAISE ERROR
6417           FND_MESSAGE.SET_NAME('CS', 'CS_CHG_INVALID_TXN_BILLING_TYP');
6418           FND_MESSAGE.SET_TOKEN('TXN_BILLING_TYPE_ID', p_charges_detail_rec.txn_billing_type_id);
6419           FND_MSG_PUB.ADD;
6420           RAISE FND_API.G_EXC_ERROR;
6421         ELSE --
6422           --the ids match
6423           --assign to the out record
6424           x_charges_detail_rec.txn_billing_type_id := p_charges_detail_rec.txn_billing_type_id ;
6425         END IF;
6426 
6427       ELSE
6428         -- p_charges_detail_rec.txn_billing_type_id is null
6429         -- assign l_txn_billing_type_id to out record
6430         x_charges_detail_rec.txn_billing_type_id := l_txn_billing_type_id;
6431       END IF;
6432 
6433     END IF;
6434 
6435   ELSIF p_validation_mode = 'U' THEN
6436 
6437     IF l_item_changed = 'Y' OR
6438        l_transaction_type_changed = 'Y' THEN
6439 
6440       --need to get the txn billing type for changed parameters
6441 
6442       GET_TXN_BILLING_TYPE(P_API_NAME            => p_api_name,
6443                            P_INV_ID              => x_charges_detail_rec.inventory_item_id_in,
6444                            P_TXN_TYPE_ID         => x_charges_detail_rec.transaction_type_id,
6445                            X_TXN_BILLING_TYPE_ID => l_txn_billing_type_id,
6446                            X_MSG_DATA            => l_msg_data,
6447                            X_MSG_COUNT           => l_msg_count,
6448                            X_RETURN_STATUS       => l_return_status);
6449 
6450       IF l_return_status <> FND_API.G_RET_STS_SUCCESS THEN
6451         RAISE FND_API.G_EXC_ERROR ;
6452       END IF;
6453 
6454       IF p_charges_detail_rec.txn_billing_type_id  <> FND_API.G_MISS_NUM AND
6455          p_charges_detail_rec.txn_billing_type_id IS NOT NULL THEN
6456         IF p_charges_detail_rec.txn_billing_type_id <> l_txn_billing_type_id THEN
6457           --RAISE ERROR
6458           FND_MESSAGE.SET_NAME('CS', 'CS_CHG_INVALID_TXN_BILLING_TYP');
6459           FND_MESSAGE.SET_TOKEN('TXN_BILLING_TYPE_ID', p_charges_detail_rec.txn_billing_type_id);
6460           FND_MSG_PUB.ADD;
6461           RAISE FND_API.G_EXC_ERROR;
6462         ELSE --
6463           --the ids match
6464           --assign to the out record
6465           x_charges_detail_rec.txn_billing_type_id := p_charges_detail_rec.txn_billing_type_id ;
6466         END IF;
6467 
6468       ELSE
6469 
6470         -- p_charges_detail_rec.txn_billing_type_id is not passed
6471         -- assign l_txn_billing_type_id to out record
6472         x_charges_detail_rec.txn_billing_type_id := l_txn_billing_type_id;
6473 
6474       END IF;
6475 
6476     ELSE
6477 
6478       -- niether the item nor the transaction type is changed
6479       -- assign the billing type from db
6480       x_charges_detail_rec.txn_billing_type_id := l_db_det_rec.txn_billing_type_id;
6481 
6482     END IF;
6483 
6484     --DBMS_OUTPUT.PUT_LINE('Completed the txn billing type id');
6485 
6486   END IF;
6487 
6488 
6489  --=======================================
6490  --Line Type ID
6491  --=======================================
6492   --DBMS_OUTPUT.PUT_LINE('Line Type ID Validation ...');
6493   IF p_validation_mode = 'I' THEN
6494 
6495     --DBMS_OUTPUT.PUT_LINE('Calling get_line_type ...');
6496     --DBMS_OUTPUT.PUT_LINE('p_charges_detail_rec.transaction_type_id = ' || p_charges_detail_rec.transaction_type_id);
6497     --DBMS_OUTPUT.PUT_LINE('x_charges_detail_rec.transaction_type_id = ' || x_charges_detail_rec.transaction_type_id);
6498     --DBMS_OUTPUT.PUT_LINE('x_charges_detail_rec.txn_billing_type_id = ' || x_charges_detail_rec.txn_billing_type_id);
6499         --Fixed Bug # 3325667 added p_org_id to procedure get_line_type
6500         Get_Line_Type(
6501           p_api_name       => p_api_name,
6502           p_txn_billing_type_id => x_charges_detail_rec.txn_billing_type_id,
6503           p_org_id              => x_charges_detail_rec.org_id,
6504           x_line_type_id  => l_line_type_id,
6505           x_return_status => l_return_status,
6506           x_msg_count => l_msg_count,
6507           x_msg_data => l_msg_data);
6508 
6509     --DBMS_OUTPUT.PUT_LINE('Back from Calling get_line_type. status = '||l_return_status);
6510     --DBMS_OUTPUT.PUT_LINE('msg_data = '||l_msg_data);
6511 
6512     IF l_return_status <> FND_API.G_RET_STS_SUCCESS THEN
6513 
6514       RAISE FND_API.G_EXC_ERROR ;
6515 
6516     ELSE
6517 
6518       --DBMS_OUTPUT.PUT_LINE('p_charges_detail_rec.line_type_id = '||p_charges_detail_rec.line_type_id);
6519       --DBMS_OUTPUT.PUT_LINE('l_line_type_id = '||l_line_type_id);
6520       --DBMS_OUTPUT.PUT_LINE('x_charges_detail_rec.txn_billing_type_id = '||x_charges_detail_rec.txn_billing_type_id);
6521 
6522       IF p_charges_detail_rec.line_type_id IS NOT NULL THEN
6523 
6524         IF p_charges_detail_rec.line_type_id <> l_line_type_id THEN
6525           --RAISE ERROR
6526           --DBMS_OUTPUT.PUT_LINE('here is the error');
6527           FND_MESSAGE.SET_NAME('CS', 'CS_CHG_INVALID_LINE_TYPE');
6528           FND_MESSAGE.SET_TOKEN('LINE_TYPE_ID', p_charges_detail_rec.line_type_id);
6529           FND_MESSAGE.SET_TOKEN('TXN_LINE_TYPE_ID', l_line_type_id);
6530           FND_MESSAGE.SET_TOKEN('TXN_BILLING_TYPE_ID', x_charges_detail_rec.txn_billing_type_id);
6531           FND_MSG_PUB.ADD;
6532           RAISE FND_API.G_EXC_ERROR;
6533         ELSE --
6534           --the ids match
6535           --assign to the out record
6536           x_charges_detail_rec.line_type_id := p_charges_detail_rec.line_type_id;
6537         END IF;
6538 
6539       ELSE
6540         -- p_charges_detail_rec.line_type_id is null
6541         -- assign l_line_type_id to out record
6542         x_charges_detail_rec.line_type_id := l_line_type_id;
6543       END IF;
6544 
6545     END IF;
6546 
6547   ELSIF p_validation_mode = 'U' THEN
6548 
6549     IF l_item_changed = 'Y' OR
6550        l_transaction_type_changed = 'Y' THEN
6551 
6552       --need to get the line type id for changed parameters
6553       --Fixed Bug # 3325667 added p_org_id to procedure get_line_type
6554 
6555       Get_Line_Type(p_api_name            => p_api_name,
6556                     p_txn_billing_type_id => x_charges_detail_rec.txn_billing_type_id,
6557                     p_org_id              => x_charges_detail_rec.org_id,
6558                     x_line_type_id        => l_line_type_id,
6559                     x_return_status       => l_return_status,
6560                     x_msg_count           => l_msg_count,
6561                     x_msg_data            => l_msg_data);
6562 
6563       IF l_return_status <> FND_API.G_RET_STS_SUCCESS THEN
6564         RAISE FND_API.G_EXC_ERROR ;
6565       END IF;
6566 
6567       IF p_charges_detail_rec.line_type_id <> FND_API.G_MISS_NUM AND
6568          p_charges_detail_rec.line_type_id IS NOT NULL THEN
6569         IF p_charges_detail_rec.line_type_id <> l_line_type_id THEN
6570           --RAISE ERROR
6571           FND_MESSAGE.SET_NAME('CS', 'CS_CHG_INVALID_LINE_TYPE');
6572           FND_MESSAGE.SET_TOKEN('LINE_TYPE_ID', p_charges_detail_rec.line_type_id);
6573           FND_MESSAGE.SET_TOKEN('TXN_LINE_TYPE_ID', l_line_type_id);
6574           FND_MESSAGE.SET_TOKEN('TXN_BILLING_TYPE_ID', x_charges_detail_rec.txn_billing_type_id);
6575           FND_MSG_PUB.ADD;
6576           RAISE FND_API.G_EXC_ERROR;
6577         ELSE --
6578           --the ids match
6579           --assign to the out record
6580           x_charges_detail_rec.line_type_id := p_charges_detail_rec.line_type_id;
6581         END IF;
6582 
6583       ELSE
6584 
6585         -- p_charges_detail_rec.line_type_id is null
6586         -- assign l_line_type_id to out record
6587         x_charges_detail_rec.line_type_id := l_line_type_id;
6588 
6589       END IF;
6590 
6591     ELSE
6592 
6593       -- niether the item nor the transaction type is changed
6594       -- assign the line_type_id from db
6595       x_charges_detail_rec.line_type_id := l_db_det_rec.line_type_id;
6596 
6597     END IF;
6598 
6599     --DBMS_OUTPUT.PUT_LINE('Completed Line Type Id Validation successfully ...');
6600 
6601   END IF;
6602 
6603 
6604 --=====================================
6605 --TCA Validation
6606 --=====================================
6607 --DBMS_OUTPUT.PUT_LINE('TCA Validation ...');
6608 
6609 IF p_validation_mode = 'I' THEN
6610 
6611   -- Bill to Valdation
6612   --
6613   --DBMS_OUTPUT.PUT_LINE('In the the TCA Validation');
6614 
6615   IF p_charges_detail_rec.bill_to_party_id IS NOT NULL THEN
6616 
6617     IF IS_PARTY_VALID(p_party_id      => p_charges_detail_rec.bill_to_party_id,
6618                       x_msg_data         => l_msg_data,
6619                       x_msg_count        => l_msg_count,
6620                       x_return_status    => l_return_status) = 'N' THEN
6621 
6622       Add_Invalid_Argument_Msg(l_api_name,
6623                                to_char(p_charges_detail_rec.bill_to_party_id),
6624                                'Bill_to_Party_Id');
6625       RAISE FND_API.G_EXC_ERROR;
6626 
6627     ELSE
6628       --assign to out record
6629       x_charges_detail_rec.bill_to_party_id := p_charges_detail_rec.bill_to_party_id;
6630 
6631       IF p_charges_detail_rec.bill_to_account_id IS NOT NULL THEN
6632 
6633 
6634          IF IS_ACCOUNT_VALID(p_party_id      => p_charges_detail_rec.bill_to_party_id,
6635                              p_account_id    => p_charges_detail_rec.bill_to_account_id,
6636                              x_msg_data      => l_msg_data,
6637                              x_msg_count     => l_msg_count,
6638                              x_return_status => l_return_status) = 'U' THEN
6639            --raise unexpected error
6640            Raise FND_API.G_EXC_UNEXPECTED_ERROR;
6641            null;
6642          ELSIF IS_ACCOUNT_VALID(p_party_id      => p_charges_detail_rec.bill_to_party_id,
6643                                 p_account_id    => p_charges_detail_rec.bill_to_account_id,
6644                                 x_msg_data      => l_msg_data,
6645                                 x_msg_count     => l_msg_count,
6646                                 x_return_status => l_return_status) = 'N' THEN
6647 
6648            Add_Invalid_Argument_Msg(l_api_name,
6649                                  to_char(p_charges_detail_rec.bill_to_account_id),
6650                                  'Bill_to_Account_Id');
6651            RAISE FND_API.G_EXC_ERROR;
6652            null;
6653          ELSE
6654            -- assign to out record
6655            x_charges_detail_rec.bill_to_account_id := p_charges_detail_rec.bill_to_account_id;
6656          END IF;
6657       ELSE
6658         -- bill_to_account IS NULL
6659         -- assign NULL to out record
6660         x_charges_detail_rec.bill_to_account_id := NULL;
6661       END IF;
6662       IF  p_charges_detail_rec.bill_to_contact_id IS NOT NULL THEN
6663 
6664 
6665         IF IS_CONTACT_VALID(p_party_id      => p_charges_detail_rec.bill_to_party_id,
6666                             p_contact_id    => p_charges_detail_rec.bill_to_contact_id,
6667                             x_msg_data      => l_msg_data,
6668                             x_msg_count     => l_msg_count,
6669                             x_return_status => l_return_status) = 'U' THEN
6670           --raise unexpected error
6671           Raise FND_API.G_EXC_UNEXPECTED_ERROR;
6672           null;
6673 
6674         ELSIF IS_CONTACT_VALID(p_party_id      => p_charges_detail_rec.bill_to_party_id,
6675                                p_contact_id    => p_charges_detail_rec.bill_to_contact_id,
6676                                x_msg_data      => l_msg_data,
6677                                x_msg_count     => l_msg_count,
6678                                x_return_status => l_return_status) = 'N' THEN
6679 
6680           Add_Invalid_Argument_Msg(l_api_name,
6681                                  to_char(p_charges_detail_rec.bill_to_contact_id),
6682                                  'Bill_to_Contact_Id');
6683           RAISE FND_API.G_EXC_ERROR;
6684           null;
6685         ELSE
6686           -- assign to out record
6687           x_charges_detail_rec.bill_to_contact_id := p_charges_detail_rec.bill_to_contact_id;
6688         END IF;
6689       ELSE
6690         -- bill_to_contact IS NULL
6691         -- assign NULL to out record
6692         x_charges_detail_rec.bill_to_contact_id := NULL;
6693       END IF;
6694 
6695       IF p_charges_detail_rec.invoice_to_org_id IS NOT NULL THEN
6696 
6697 
6698         IF IS_PARTY_SITE_VALID( p_party_site_id => p_charges_detail_rec.invoice_to_org_id,
6699                                 p_party_id      => p_charges_detail_rec.bill_to_party_id,
6700                                 p_val_mode      => 'BILL_TO',
6701                                 x_msg_data      => l_msg_data,
6702                                 x_msg_count     => l_msg_count,
6703                                 x_return_status => l_return_status) = 'U' THEN
6704           --raise unexpected error
6705           Raise FND_API.G_EXC_UNEXPECTED_ERROR;
6706           null;
6707         ELSIF IS_PARTY_SITE_VALID( p_party_site_id => p_charges_detail_rec.invoice_to_org_id,
6708                                 p_party_id         => p_charges_detail_rec.bill_to_party_id,
6709                                 p_val_mode         => 'BILL_TO',
6710                                 x_msg_data         => l_msg_data,
6711                                 x_msg_count        => l_msg_count,
6712                                 x_return_status    => l_return_status) = 'N' THEN
6713           Add_Invalid_Argument_Msg(l_api_name,
6714                                  to_char(p_charges_detail_rec.invoice_to_org_id),
6715                                  'Invoice_to_org_Id');
6716           RAISE FND_API.G_EXC_ERROR;
6717           null;
6718         ELSE
6719           --assign to out record
6720           x_charges_detail_rec.invoice_to_org_id := p_charges_detail_rec.invoice_to_org_id;
6721         END IF;
6722 
6723       ELSE
6724         --invoice_to_org_id IS NULL
6725         --assign NULL to out record
6726         x_charges_detail_rec.invoice_to_org_id := NULL;
6727       END IF;
6728     END IF;
6729 
6730   ELSE
6731     -- p_charges_detail_rec.bill_to_party_id IS NULL
6732     -- default TCA information from SR
6733 
6734     --DBMS_OUTPUT.PUT_LINE('p_charges_detail_rec.bill_to_party_id IS NULL............');
6735     --DBMS_OUTPUT.PUT_LINE('l_bill_to_party_id'||l_bill_to_party_id);
6736 
6737     IF l_bill_to_party_id <> -999 THEN
6738 
6739       IF IS_PARTY_VALID(p_party_id         => l_bill_to_party_id,
6740                         x_msg_data         => l_msg_data,
6741                         x_msg_count        => l_msg_count,
6742                         x_return_status    => l_return_status) = 'N' THEN
6743 
6744         Add_Invalid_Argument_Msg(l_api_name,
6745                                  to_char(l_bill_to_party_id),
6746                                  'Bill_to_Party_Id');
6747         RAISE FND_API.G_EXC_ERROR;
6748         null;
6749       ELSE
6750 
6751         --DBMS_OUTPUT.PUT_LINE('l_bill_to_party_id assigned ...' || l_bill_to_party_id);
6752 
6753         --assign to out record
6754         x_charges_detail_rec.bill_to_party_id := l_bill_to_party_id;
6755 
6756         IF l_bill_to_account_id <> -999 THEN
6757           IF IS_ACCOUNT_VALID(p_party_id      => l_bill_to_party_id,
6758                               p_account_id    => l_bill_to_account_id,
6759                               x_msg_data      => l_msg_data,
6760                               x_msg_count     => l_msg_count,
6761                               x_return_status => l_return_status) = 'U' THEN
6762             --raise unexpected error
6763             Raise FND_API.G_EXC_UNEXPECTED_ERROR;
6764             null;
6765 
6766           ELSIF IS_ACCOUNT_VALID(p_party_id      => l_bill_to_party_id,
6767                               p_account_id    => l_bill_to_account_id,
6768                               x_msg_data      => l_msg_data,
6769                               x_msg_count     => l_msg_count,
6770                               x_return_status => l_return_status) = 'N' THEN
6771 
6772              Add_Invalid_Argument_Msg(l_api_name,
6773                                  to_char(l_bill_to_account_id),
6774                                  'Bill_to_Account_Id');
6775              RAISE FND_API.G_EXC_ERROR;
6776              null;
6777            ELSE
6778              --DBMS_OUTPUT.PUT_LINE(' l_bill_to_account_id assigned ....'||l_bill_to_account_id);
6779 
6780              -- assign to out record
6781              x_charges_detail_rec.bill_to_account_id := l_bill_to_account_id;
6782            END IF;
6783         ELSE
6784           --l_bill_to_account is -999
6785           --assign NULL to out record
6786           --DBMS_OUTPUT.PUT_LINE(' l_bill_to_account_id assigned is null ');
6787           x_charges_detail_rec.bill_to_account_id := NULL;
6788 
6789         END IF;
6790 
6791         IF  l_bill_to_contact_id <> -999 THEN
6792           IF IS_CONTACT_VALID(p_party_id      => l_bill_to_party_id,
6793                               p_contact_id    => l_bill_to_contact_id,
6794                               x_msg_data      => l_msg_data,
6795                               x_msg_count     => l_msg_count,
6796                               x_return_status => l_return_status) = 'U' THEN
6797             --raise unexpected error
6798             Raise FND_API.G_EXC_UNEXPECTED_ERROR;
6799             null;
6800 
6801           ELSIF IS_CONTACT_VALID(p_party_id   => l_bill_to_party_id,
6802                               p_contact_id    => l_bill_to_contact_id,
6803                               x_msg_data      => l_msg_data,
6804                               x_msg_count     => l_msg_count,
6805                               x_return_status => l_return_status) = 'N' THEN
6806 
6807             Add_Invalid_Argument_Msg(l_api_name,
6808                                  to_char(l_bill_to_contact_id),
6809                                  'Bill_to_Contact_Id');
6810             RAISE FND_API.G_EXC_ERROR;
6811             null;
6812           ELSE
6813             -- assign to out record
6814             --DBMS_OUTPUT.PUT_LINE(' l_bill_to_contact_id assigned....'||l_bill_to_contact_id);
6815 
6816             x_charges_detail_rec.bill_to_contact_id := l_bill_to_contact_id;
6817           END IF;
6818         ELSE
6819           --l_bill_to_contact_id IS NULL
6820           --assign NULL to out record
6821           --DBMS_OUTPUT.PUT_LINE(' l_bill_to_contact_id assigned null');
6822           x_charges_detail_rec.bill_to_contact_id := NULL;
6823         END IF;
6824 
6825         IF  l_bill_to_site_id <> -999 THEN
6826           x_charges_detail_rec.invoice_to_org_id := l_bill_to_site_id;
6827         ELSE
6828           --l_bill_to_site_use_id IS NULL
6829           --assign NULL to the out record
6830           --assign the customer_site_id
6831           x_charges_detail_rec.invoice_to_org_id := l_customer_site_id;
6832         END IF;
6833         --DBMS_OUTPUT.PUT_LINE('x_charges_detail_rec.invoice_to_org_id ...'||x_charges_detail_rec.invoice_to_org_id);
6834 
6835       END IF;
6836     ELSE
6837       --l_bill_to_party_id is -999
6838       --Check If l_customer_id is not null
6839       IF l_customer_id IS NOT NULL THEN
6840 
6841         IF IS_PARTY_VALID(p_party_id      => l_customer_id,
6842                           x_msg_data      => l_msg_data,
6843                           x_msg_count     => l_msg_count,
6844                           x_return_status => l_return_status) = 'N' THEN
6845 
6846           Add_Invalid_Argument_Msg(l_api_name,
6847                                  to_char(l_customer_id),
6848                                  'Bill_to_Party_Id');
6849           RAISE FND_API.G_EXC_ERROR;
6850           null;
6851         ELSE
6852           --assign to out record
6853           x_charges_detail_rec.bill_to_party_id := l_customer_id;
6854           -- Fix For Bug 6356247--Start
6855 	  --x_charges_detail_rec.bill_to_contact_id := l_customer_id;
6856 	  x_charges_detail_rec.bill_to_contact_id := Null;
6857 	  -- Fix For Bug 6356247--End
6858 
6859           IF l_account_id IS NOT NULL THEN
6860 
6861 
6862             IF IS_ACCOUNT_VALID(p_party_id      => l_customer_id,
6863                                 p_account_id    => l_account_id,
6864                                 x_msg_data      => l_msg_data,
6865                                 x_msg_count     => l_msg_count,
6866                                 x_return_status => l_return_status) = 'U' THEN
6867               --raise unexpected error
6868               Raise FND_API.G_EXC_UNEXPECTED_ERROR;
6869               null;
6870 
6871             ELSIF IS_ACCOUNT_VALID(p_party_id      => l_customer_id,
6872                                 p_account_id    => l_account_id,
6873                                 x_msg_data      => l_msg_data,
6874                                 x_msg_count     => l_msg_count,
6875                                 x_return_status => l_return_status) = 'N' THEN
6876 
6877               Add_Invalid_Argument_Msg(l_api_name,
6878                                  to_char(l_account_id),
6879                                  'Bill_to_Account_Id');
6880               RAISE FND_API.G_EXC_ERROR;
6881               null;
6882             ELSE
6883               -- assign to out record
6884               x_charges_detail_rec.bill_to_account_id :=l_account_id;
6885             END IF;
6886           END IF;
6887 
6888           IF l_customer_site_id IS NOT NULL THEN
6889 
6890             IF IS_PARTY_SITE_VALID( p_party_site_id => l_customer_site_id,
6891                                     p_party_id      => l_customer_id,
6892                                     p_val_mode      => 'NONE',
6893                                     x_msg_data      => l_msg_data,
6894                                     x_msg_count     => l_msg_count,
6895                                     x_return_status => l_return_status) = 'U' THEN
6896               --raise unexpected error
6897               Raise FND_API.G_EXC_UNEXPECTED_ERROR;
6898               null;
6899             ELSIF IS_PARTY_SITE_VALID( p_party_site_id => l_customer_site_id,
6900                                     p_party_id      => l_customer_id,
6901                                     p_val_mode      => 'NONE',
6902                                     x_msg_data      => l_msg_data,
6903                                     x_msg_count     => l_msg_count,
6904                                     x_return_status => l_return_status) = 'N' THEN
6905 
6906               Add_Invalid_Argument_Msg(l_api_name,
6907                                  to_char(l_customer_site_id),
6908                                  'Invoice_to_Org_Id');
6909               RAISE FND_API.G_EXC_ERROR;
6910               null;
6911             ELSE
6912               --assign to out record
6913               x_charges_detail_rec.invoice_to_org_id := l_customer_site_id;
6914             END IF;
6915           ELSE
6916             --l_customer_site_id IS NULL
6917             --assign NULL to out record
6918             x_charges_detail_rec.invoice_to_org_id := NULL;
6919           END IF;
6920         END IF;
6921       ELSE
6922         x_charges_detail_rec.bill_to_party_id   := NULL;
6923         x_charges_detail_rec.bill_to_account_id := NULL;
6924         x_charges_detail_rec.bill_to_contact_id := NULL;
6925         x_charges_detail_rec.invoice_to_org_id  := NULL;
6926       END IF;
6927     END IF;
6928   END IF;
6929 
6930   --DBMS_OUTPUT.PUT_LINE('Passed Bill To Validation .....');
6931 
6932   -- Ship To Validation
6933   --
6934   --DBMS_OUTPUT.PUT_LINE(' ship tp party id '||p_charges_detail_rec.ship_to_party_id );
6935 
6936   IF p_charges_detail_rec.ship_to_party_id IS NOT NULL THEN
6937 
6938     IF IS_PARTY_VALID(p_party_id   => p_charges_detail_rec.ship_to_party_id,
6939                       x_msg_data      => l_msg_data,
6940                       x_msg_count     => l_msg_count,
6941                       x_return_status => l_return_status) = 'N' THEN
6942 
6943 
6944        Add_Invalid_Argument_Msg(l_api_name,
6945                                  to_char(p_charges_detail_rec.ship_to_party_id),
6946                                  'Ship_to_Party_Id');
6947 
6948         x_msg_data      :=  l_msg_data;
6949         x_return_status :=  l_return_status;
6950 
6951        RAISE FND_API.G_EXC_ERROR;
6952 
6953     ELSE
6954 
6955       --DBMS_OUTPUT.PUT_LINE('Assigning the ship_to_party_id '||p_charges_detail_rec.ship_to_party_id);
6956 
6957       --assign to out record
6958       x_charges_detail_rec.ship_to_party_id := p_charges_detail_rec.ship_to_party_id;
6959 
6960       IF p_charges_detail_rec.ship_to_account_id IS NOT NULL THEN
6961 
6962          IF IS_ACCOUNT_VALID(p_party_id         => p_charges_detail_rec.ship_to_party_id,
6963                              p_account_id       => p_charges_detail_rec.ship_to_account_id,
6964                              x_msg_data         => l_msg_data,
6965                              x_msg_count        => l_msg_count,
6966                              x_return_status    => l_return_status) = 'U' THEN
6967            --raise unexpected error
6968            Raise FND_API.G_EXC_UNEXPECTED_ERROR;
6969            null;
6970 
6971          ELSIF IS_ACCOUNT_VALID(p_party_id      => p_charges_detail_rec.ship_to_party_id,
6972                              p_account_id       => p_charges_detail_rec.ship_to_account_id,
6973                              x_msg_data         => l_msg_data,
6974                              x_msg_count        => l_msg_count,
6975                              x_return_status    => l_return_status) = 'N' THEN
6976 
6977            Add_Invalid_Argument_Msg(l_api_name,
6978                                  to_char(p_charges_detail_rec.ship_to_account_id),
6979                                  'Ship_to_Account_Id');
6980 
6981            x_msg_data      :=  l_msg_data;
6982            x_return_status :=  l_return_status;
6983 
6984            RAISE FND_API.G_EXC_ERROR;
6985          ELSE
6986            -- assign to out record
6987            x_charges_detail_rec.ship_to_account_id := p_charges_detail_rec.ship_to_account_id;
6988          END IF;
6989       ELSE
6990         -- Ship To Account ID is NULL
6991         -- assign NULL to out record
6992         x_charges_detail_rec.ship_to_account_id := NULL;
6993       END IF;
6994 
6995       IF  p_charges_detail_rec.ship_to_contact_id IS NOT NULL THEN
6996 
6997         IF IS_CONTACT_VALID(p_party_id      => p_charges_detail_rec.ship_to_party_id,
6998                             p_contact_id    => p_charges_detail_rec.ship_to_contact_id,
6999                             x_msg_data      => l_msg_data,
7000                             x_msg_count     => l_msg_count,
7001                             x_return_status => l_return_status) = 'U' THEN
7002           --raise unexpected error
7003           Raise FND_API.G_EXC_UNEXPECTED_ERROR;
7004           null;
7005         ELSIF IS_CONTACT_VALID(p_party_id   => p_charges_detail_rec.ship_to_party_id,
7006                             p_contact_id    => p_charges_detail_rec.ship_to_contact_id,
7007                             x_msg_data      => l_msg_data,
7008                             x_msg_count     => l_msg_count,
7009                             x_return_status => l_return_status) = 'N' THEN
7010 
7011           Add_Invalid_Argument_Msg(l_api_name,
7012                                  to_char(p_charges_detail_rec.ship_to_contact_id),
7013                                  'Ship_to_Contact_Id');
7014           RAISE FND_API.G_EXC_ERROR;
7015 
7016         ELSE
7017           -- assign to out record
7018           x_charges_detail_rec.ship_to_contact_id := p_charges_detail_rec.ship_to_contact_id;
7019         END IF;
7020       ELSE
7021         -- Ship To Contact is NULL
7022         -- assign NULL to out record
7023         x_charges_detail_rec.ship_to_contact_id := NULL;
7024       END IF;
7025 
7026       IF p_charges_detail_rec.ship_to_org_id IS NOT NULL THEN
7027 
7028 
7029         IF IS_PARTY_SITE_VALID( p_party_site_id => p_charges_detail_rec.ship_to_org_id,
7030                                 p_party_id      => p_charges_detail_rec.ship_to_party_id,
7031                                 p_val_mode      => 'SHIP_TO',
7032                                 x_msg_data      => l_msg_data,
7033                                 x_msg_count     => l_msg_count,
7034                                 x_return_status => l_return_status) = 'U' THEN
7035           --raise unexpected error
7036           Raise FND_API.G_EXC_UNEXPECTED_ERROR;
7037           null;
7038         ELSIF IS_PARTY_SITE_VALID( p_party_site_id => p_charges_detail_rec.ship_to_org_id,
7039                                 p_party_id         => p_charges_detail_rec.ship_to_party_id,
7040                                 p_val_mode         => 'SHIP_TO',
7041                                 x_msg_data         => l_msg_data,
7042                                 x_msg_count        => l_msg_count,
7043                                 x_return_status    => l_return_status) = 'N' THEN
7044 
7045           Add_Invalid_Argument_Msg(l_api_name,
7046                                  to_char(p_charges_detail_rec.ship_to_org_id),
7047                                  'Ship_to_org_Id');
7048           RAISE FND_API.G_EXC_ERROR;
7049           null;
7050         ELSE
7051           --assign to out record
7052           x_charges_detail_rec.ship_to_org_id := p_charges_detail_rec.ship_to_org_id;
7053         END IF;
7054 
7055       ELSE
7056         --ship_to_org_id IS NULL
7057         --assign NULL to out record
7058         x_charges_detail_rec.ship_to_org_id := NULL;
7059       END IF;
7060 
7061     END IF;
7062 
7063   ELSE
7064     -- p_charges_detail_rec.ship_to_party_id IS NULL
7065     -- default TCA information from SR
7066 
7067     --DBMS_OUTPUT.PUT_LINE('ship to party id is null');
7068 
7069     IF l_ship_to_party_id <> -999 THEN
7070       IF IS_PARTY_VALID(p_party_id   => l_ship_to_party_id,
7071                         x_msg_data      => l_msg_data,
7072                         x_msg_count     => l_msg_count,
7073                         x_return_status => l_return_status) = 'N' THEN
7074         RAISE FND_API.G_EXC_ERROR;
7075         null;
7076       ELSE
7077         --assign to out record
7078         x_charges_detail_rec.ship_to_party_id := l_ship_to_party_id;
7079 
7080         IF l_ship_to_account_id <> -999 THEN
7081 
7082 
7083           IF IS_ACCOUNT_VALID(p_party_id      => l_ship_to_party_id,
7084                               p_account_id    => l_ship_to_account_id,
7085                               x_msg_data      => l_msg_data,
7086                               x_msg_count     => l_msg_count,
7087                               x_return_status => l_return_status) = 'U' THEN
7088             --raise unexpected error
7089             Raise FND_API.G_EXC_UNEXPECTED_ERROR;
7090             null;
7091 
7092           ELSIF IS_ACCOUNT_VALID(p_party_id   => l_ship_to_party_id,
7093                               p_account_id    => l_ship_to_account_id,
7094                               x_msg_data      => l_msg_data,
7095                               x_msg_count     => l_msg_count,
7096                               x_return_status => l_return_status) = 'N' THEN
7097              Add_Invalid_Argument_Msg(l_api_name,
7098                                  to_char(l_ship_to_account_id),
7099                                  'Ship_to_Account_Id');
7100 
7101              x_msg_data      :=  l_msg_data;
7102              x_return_status :=  l_return_status;
7103 
7104              RAISE FND_API.G_EXC_ERROR;
7105           ELSE
7106              -- assign to out record
7107              x_charges_detail_rec.ship_to_account_id := l_ship_to_account_id;
7108           END IF;
7109         ELSE
7110           -- Ship To Account is -999
7111           -- assign NULL to out record
7112            x_charges_detail_rec.ship_to_account_id := NULL;
7113         END IF;
7114 
7115         IF  l_ship_to_contact_id <> -999 THEN
7116 
7117           IF IS_CONTACT_VALID(p_party_id      => l_ship_to_party_id,
7118                               p_contact_id    => l_ship_to_contact_id,
7119                               x_msg_data      => l_msg_data,
7120                               x_msg_count     => l_msg_count,
7121                               x_return_status => l_return_status) = 'U' THEN
7122             --raise unexpected error
7123             Raise FND_API.G_EXC_UNEXPECTED_ERROR;
7124             null;
7125 
7126           ELSIF IS_CONTACT_VALID(p_party_id   => l_ship_to_party_id,
7127                               p_contact_id    => l_ship_to_contact_id,
7128                               x_msg_data      => l_msg_data,
7129                               x_msg_count     => l_msg_count,
7130                               x_return_status => l_return_status) = 'N' THEN
7131 
7132             Add_Invalid_Argument_Msg(l_api_name,
7133                                  to_char(l_ship_to_contact_id),
7134                                  'Ship_to_Contact_Id');
7135             RAISE FND_API.G_EXC_ERROR;
7136           ELSE
7137             -- assign to out record
7138             x_charges_detail_rec.ship_to_contact_id := l_ship_to_contact_id;
7139           END IF;
7140         ELSE
7141           -- Ship To Contact is -999
7142           -- assign NULL to out record
7143           x_charges_detail_rec.ship_to_contact_id := NULL;
7144         END IF;
7145 
7146         IF  l_ship_to_site_id <> -999 THEN
7147           x_charges_detail_rec.ship_to_org_id := l_ship_to_site_id;
7148         ELSE
7149           --l_ship_to_site_use_id IS NULL
7150           --assign l_customer_site_id
7151           x_charges_detail_rec.ship_to_org_id := l_customer_site_id;
7152         END IF;
7153 
7154       END IF;
7155     ELSE
7156       --l_ship_to_party_id is -999
7157       --Check If l_customer_id is not null
7158       IF l_customer_id IS NOT NULL THEN
7159 
7160         IF IS_PARTY_VALID(p_party_id   => l_customer_id,
7161                           x_msg_data      => l_msg_data,
7162                           x_msg_count     => l_msg_count,
7163                           x_return_status => l_return_status) = 'N' THEN
7164           RAISE FND_API.G_EXC_ERROR;
7165           null;
7166         ELSE
7167           --assign to out record
7168           x_charges_detail_rec.ship_to_party_id := l_customer_id;
7169 	  --Fix for Bug 6356247--Start
7170           --x_charges_detail_rec.ship_to_contact_id := l_customer_id;
7171 	  x_charges_detail_rec.ship_to_contact_id := Null;
7172 	  --Fix for Bug 6356247--End
7173 
7174           IF l_account_id IS NOT NULL THEN
7175 
7176             IF IS_ACCOUNT_VALID(p_party_id      => l_customer_id,
7177                                 p_account_id    => l_account_id,
7178                                 x_msg_data      => l_msg_data,
7179                                 x_msg_count     => l_msg_count,
7180                                 x_return_status => l_return_status) = 'U' THEN
7181               --raise unexpected error
7182               Raise FND_API.G_EXC_UNEXPECTED_ERROR;
7183               null;
7184 
7185             ELSIF IS_ACCOUNT_VALID(p_party_id   => l_customer_id,
7186                                 p_account_id    => l_account_id,
7187                                 x_msg_data      => l_msg_data,
7188                                 x_msg_count     => l_msg_count,
7189                                 x_return_status => l_return_status) = 'N' THEN
7190 
7191                Add_Invalid_Argument_Msg(l_api_name,
7192                                  to_char(l_account_id),
7193                                  'Ship_to_Account_Id');
7194 
7195                x_msg_data      :=  l_msg_data;
7196                x_return_status :=  l_return_status;
7197 
7198                RAISE FND_API.G_EXC_ERROR;
7199             ELSE
7200               -- assign to out record
7201               x_charges_detail_rec.ship_to_account_id := l_account_id;
7202             END IF;
7203           ELSE
7204             -- Account is NULL
7205             -- assign NULL to out record
7206             x_charges_detail_rec.ship_to_account_id := NULL;
7207           END IF;
7208 
7209           IF l_customer_site_id IS NOT NULL THEN
7210 
7211             IF IS_PARTY_SITE_VALID( p_party_site_id => l_customer_site_id,
7212                                     p_party_id      => l_customer_id,
7213                                     p_val_mode      => 'NONE',
7214                                     x_msg_data      => l_msg_data,
7215                                     x_msg_count     => l_msg_count,
7216                                     x_return_status => l_return_status) = 'U' THEN
7217               --raise unexpected error
7218               Raise FND_API.G_EXC_UNEXPECTED_ERROR;
7219               null;
7220 
7221             ELSIF IS_PARTY_SITE_VALID( p_party_site_id => l_customer_site_id,
7222                                     p_party_id      => l_customer_id,
7223                                     p_val_mode      => 'NONE',
7224                                     x_msg_data      => l_msg_data,
7225                                     x_msg_count     => l_msg_count,
7226                                     x_return_status => l_return_status) = 'N' THEN
7227               RAISE FND_API.G_EXC_ERROR;
7228               null;
7229             ELSE
7230               --assign to out record
7231               x_charges_detail_rec.ship_to_org_id := l_customer_site_id;
7232             END IF;
7233           ELSE
7234             --l_customer_site_id IS NULL
7235             --assign NULL to out record
7236             x_charges_detail_rec.ship_to_org_id := NULL;
7237           END IF;
7238 
7239         END IF;
7240       ELSE
7241         x_charges_detail_rec.ship_to_party_id := NULL;
7242         x_charges_detail_rec.ship_to_account_id := NULL;
7243         x_charges_detail_rec.ship_to_contact_id := NULL;
7244         x_charges_detail_rec.ship_to_org_id  := NULL;
7245       END IF;
7246     END IF;
7247   END IF;
7248   --DBMS_OUTPUT.PUT_LINE('Passed Ship To Validation .....');
7249 
7250 ELSIF p_validation_mode = 'U' THEN
7251 
7252   -- Bill to Valdation
7253   --
7254   --DBMS_OUTPUT.PUT_LINE('In the the TCA Update Validation');
7255 
7256   IF p_charges_detail_rec.bill_to_party_id <> FND_API.G_MISS_NUM AND
7257      p_charges_detail_rec.bill_to_party_id IS NOT NULL THEN
7258 
7259     IF IS_PARTY_VALID(p_party_id      => p_charges_detail_rec.bill_to_party_id,
7260                       x_msg_data         => l_msg_data,
7261                       x_msg_count        => l_msg_count,
7262                       x_return_status    => l_return_status) = 'N' THEN
7263 
7264       Add_Invalid_Argument_Msg(l_api_name,
7265                                to_char(p_charges_detail_rec.bill_to_party_id),
7266                                'Bill_to_Party_Id');
7267       RAISE FND_API.G_EXC_ERROR;
7268 
7269     ELSE
7270       --assign to out record
7271       x_charges_detail_rec.bill_to_party_id := p_charges_detail_rec.bill_to_party_id;
7272 
7273       IF p_charges_detail_rec.bill_to_account_id <> FND_API.G_MISS_NUM AND
7274          p_charges_detail_rec.bill_to_account_id IS NOT NULL THEN
7275 
7276          IF IS_ACCOUNT_VALID(p_party_id      => p_charges_detail_rec.bill_to_party_id,
7277                              p_account_id    => p_charges_detail_rec.bill_to_account_id,
7278                              x_msg_data      => l_msg_data,
7279                              x_msg_count     => l_msg_count,
7280                              x_return_status => l_return_status) = 'U' THEN
7281            --raise unexpected error
7282            Raise FND_API.G_EXC_UNEXPECTED_ERROR;
7283            null;
7284          ELSIF IS_ACCOUNT_VALID(p_party_id      => p_charges_detail_rec.bill_to_party_id,
7285                                 p_account_id    => p_charges_detail_rec.bill_to_account_id,
7286                                 x_msg_data      => l_msg_data,
7287                                 x_msg_count     => l_msg_count,
7288                                 x_return_status => l_return_status) = 'N' THEN
7289 
7290            Add_Invalid_Argument_Msg(l_api_name,
7291                                  to_char(p_charges_detail_rec.bill_to_account_id),
7292                                  'Bill_to_Account_Id');
7293            RAISE FND_API.G_EXC_ERROR;
7294            null;
7295          ELSE
7296            -- assign to out record
7297            x_charges_detail_rec.bill_to_account_id := p_charges_detail_rec.bill_to_account_id;
7298          END IF;
7299 
7300 --Bug# 4870037
7301       ELSIF p_charges_detail_rec.bill_to_account_id = FND_API.G_MISS_NUM THEN
7302          x_charges_detail_rec.bill_to_account_id := l_db_det_rec.invoice_to_account_id;
7303       ELSE
7304         -- bill_to_account IS NULL
7305         -- assign NULL to out record
7306         x_charges_detail_rec.bill_to_account_id := NULL;
7307       END IF;
7308       IF  p_charges_detail_rec.bill_to_contact_id <> FND_API.G_MISS_NUM AND
7309           p_charges_detail_rec.bill_to_contact_id IS NOT NULL THEN
7310 
7311 
7312         IF IS_CONTACT_VALID(p_party_id      => p_charges_detail_rec.bill_to_party_id,
7313                             p_contact_id    => p_charges_detail_rec.bill_to_contact_id,
7314                             x_msg_data      => l_msg_data,
7315                             x_msg_count     => l_msg_count,
7316                             x_return_status => l_return_status) = 'U' THEN
7317           --raise unexpected error
7318           Raise FND_API.G_EXC_UNEXPECTED_ERROR;
7319           null;
7320 
7321         ELSIF IS_CONTACT_VALID(p_party_id      => p_charges_detail_rec.bill_to_party_id,
7322                                p_contact_id    => p_charges_detail_rec.bill_to_contact_id,
7323                                x_msg_data      => l_msg_data,
7324                                x_msg_count     => l_msg_count,
7325                                x_return_status => l_return_status) = 'N' THEN
7326 
7327           Add_Invalid_Argument_Msg(l_api_name,
7328                                  to_char(p_charges_detail_rec.bill_to_contact_id),
7329                                  'Bill_to_Contact_Id');
7330           RAISE FND_API.G_EXC_ERROR;
7331           null;
7332         ELSE
7333           -- assign to out record
7334           x_charges_detail_rec.bill_to_contact_id := p_charges_detail_rec.bill_to_contact_id;
7335         END IF;
7336       ELSE
7337         -- bill_to_contact IS NULL
7338         -- assign NULL to out record
7339         x_charges_detail_rec.bill_to_contact_id := NULL;
7340       END IF;
7341 
7342       IF p_charges_detail_rec.invoice_to_org_id <> FND_API.G_MISS_NUM AND
7343          p_charges_detail_rec.invoice_to_org_id IS NOT NULL THEN
7344 
7345 
7346         IF IS_PARTY_SITE_VALID( p_party_site_id => p_charges_detail_rec.invoice_to_org_id,
7347                                 p_party_id      => p_charges_detail_rec.bill_to_party_id,
7348                                 p_val_mode      => 'BILL_TO',
7349                                 x_msg_data      => l_msg_data,
7350                                 x_msg_count     => l_msg_count,
7351                                 x_return_status => l_return_status) = 'U' THEN
7352           --raise unexpected error
7353           Raise FND_API.G_EXC_UNEXPECTED_ERROR;
7354           null;
7355         ELSIF IS_PARTY_SITE_VALID( p_party_site_id => p_charges_detail_rec.invoice_to_org_id,
7356                                 p_party_id         => p_charges_detail_rec.bill_to_party_id,
7357                                 p_val_mode         => 'BILL_TO',
7358                                 x_msg_data         => l_msg_data,
7359                                 x_msg_count        => l_msg_count,
7360                                 x_return_status    => l_return_status) = 'N' THEN
7361           Add_Invalid_Argument_Msg(l_api_name,
7362                                  to_char(p_charges_detail_rec.invoice_to_org_id),
7363                                  'Invoice_to_org_Id');
7364           RAISE FND_API.G_EXC_ERROR;
7365           null;
7366         ELSE
7367           --assign to out record
7368           x_charges_detail_rec.invoice_to_org_id := p_charges_detail_rec.invoice_to_org_id;
7369         END IF;
7370 
7371       ELSE
7372         --invoice_to_org_id IS NULL
7373         --assign NULL to out record
7374         x_charges_detail_rec.invoice_to_org_id := NULL;
7375       END IF;
7376     END IF;
7377 
7378  ELSIF
7379 
7380      p_charges_detail_rec.bill_to_party_id = FND_API.G_MISS_NUM THEN
7381 
7382       -- assign the value from the database
7383       x_charges_detail_rec.bill_to_party_id := l_db_det_rec.bill_to_party_id;
7384 
7385       IF p_charges_detail_rec.bill_to_account_id <> FND_API.G_MISS_NUM AND
7386          p_charges_detail_rec.bill_to_account_id IS NOT NULL THEN
7387 
7388 
7389          IF IS_ACCOUNT_VALID(p_party_id      => x_charges_detail_rec.bill_to_party_id,
7390                              p_account_id    => p_charges_detail_rec.bill_to_account_id,
7391                              x_msg_data      => l_msg_data,
7392                              x_msg_count     => l_msg_count,
7393                              x_return_status => l_return_status) = 'U' THEN
7394            --raise unexpected error
7395            Raise FND_API.G_EXC_UNEXPECTED_ERROR;
7396            null;
7397          ELSIF IS_ACCOUNT_VALID(p_party_id      => x_charges_detail_rec.bill_to_party_id,
7398                                 p_account_id    => p_charges_detail_rec.bill_to_account_id,
7399                                 x_msg_data      => l_msg_data,
7400                                 x_msg_count     => l_msg_count,
7401                                 x_return_status => l_return_status) = 'N' THEN
7402 
7403            Add_Invalid_Argument_Msg(l_api_name,
7404                                  to_char(p_charges_detail_rec.bill_to_account_id),
7405                                  'Bill_to_Account_Id');
7406            RAISE FND_API.G_EXC_ERROR;
7407            null;
7408          ELSE
7409            -- assign to out record
7410            x_charges_detail_rec.bill_to_account_id := p_charges_detail_rec.bill_to_account_id;
7411          END IF;
7412       ELSE
7413         -- bill_to_account is not passed
7414         -- assign the value from the database
7415         x_charges_detail_rec.bill_to_account_id := l_db_det_rec.invoice_to_account_id;
7416       END IF;
7417 
7418       IF  p_charges_detail_rec.bill_to_contact_id <> FND_API.G_MISS_NUM AND
7419           p_charges_detail_rec.bill_to_contact_id IS NOT NULL THEN
7420 
7421 
7422         IF IS_CONTACT_VALID(p_party_id      => x_charges_detail_rec.bill_to_party_id,
7423                             p_contact_id    => p_charges_detail_rec.bill_to_contact_id,
7424                             x_msg_data      => l_msg_data,
7425                             x_msg_count     => l_msg_count,
7426                             x_return_status => l_return_status) = 'U' THEN
7427           --raise unexpected error
7428           Raise FND_API.G_EXC_UNEXPECTED_ERROR;
7429           null;
7430 
7431         ELSIF IS_CONTACT_VALID(p_party_id      => x_charges_detail_rec.bill_to_party_id,
7432                                p_contact_id    => p_charges_detail_rec.bill_to_contact_id,
7433                                x_msg_data      => l_msg_data,
7434                                x_msg_count     => l_msg_count,
7435                                x_return_status => l_return_status) = 'N' THEN
7436 
7437           Add_Invalid_Argument_Msg(l_api_name,
7438                                  to_char(p_charges_detail_rec.bill_to_contact_id),
7439                                  'Bill_to_Contact_Id');
7440           RAISE FND_API.G_EXC_ERROR;
7441           null;
7442         ELSE
7443           -- assign to out record
7444           x_charges_detail_rec.bill_to_contact_id := p_charges_detail_rec.bill_to_contact_id;
7445         END IF;
7446       ELSE
7447         -- bill_to_contact is not passed
7448         -- assign values from the database to out record
7449         x_charges_detail_rec.bill_to_contact_id := l_db_det_rec.bill_to_contact_id;
7450       END IF;
7451 
7452       IF p_charges_detail_rec.invoice_to_org_id <> FND_API.G_MISS_NUM AND
7453          p_charges_detail_rec.invoice_to_org_id IS NOT NULL THEN
7454 
7455 
7456         IF IS_PARTY_SITE_VALID( p_party_site_id => p_charges_detail_rec.invoice_to_org_id,
7457                                 p_party_id      => x_charges_detail_rec.bill_to_party_id,
7458                                 p_val_mode      => 'BILL_TO',
7459                                 x_msg_data      => l_msg_data,
7460                                 x_msg_count     => l_msg_count,
7461                                 x_return_status => l_return_status) = 'U' THEN
7462           --raise unexpected error
7463           Raise FND_API.G_EXC_UNEXPECTED_ERROR;
7464           null;
7465         ELSIF IS_PARTY_SITE_VALID( p_party_site_id => p_charges_detail_rec.invoice_to_org_id,
7466                                 p_party_id         => x_charges_detail_rec.bill_to_party_id,
7467                                 p_val_mode         => 'BILL_TO',
7468                                 x_msg_data         => l_msg_data,
7469                                 x_msg_count        => l_msg_count,
7470                                 x_return_status    => l_return_status) = 'N' THEN
7471           Add_Invalid_Argument_Msg(l_api_name,
7472                                  to_char(p_charges_detail_rec.invoice_to_org_id),
7473                                  'Invoice_to_org_Id');
7474           RAISE FND_API.G_EXC_ERROR;
7475           null;
7476         ELSE
7477           --assign to out record
7478           x_charges_detail_rec.invoice_to_org_id := p_charges_detail_rec.invoice_to_org_id;
7479         END IF;
7480 
7481       ELSE
7482         --invoice_to_org_id is not passed
7483         --assign values from the database to out record
7484         x_charges_detail_rec.invoice_to_org_id :=  l_db_det_rec.invoice_to_org_id;
7485       END IF;
7486 
7487  ELSE
7488 
7489     IF p_charges_detail_rec.bill_to_party_id IS NULL THEN
7490 
7491       --all the values for out record for TCA should be nulled out
7492       x_charges_detail_rec.bill_to_party_id := NULL;
7493       x_charges_detail_rec.bill_to_account_id := NULL;
7494       x_charges_detail_rec.bill_to_contact_id := NULL;
7495       x_charges_detail_rec.invoice_to_org_id := NULL;
7496     END IF;
7497   END IF;
7498 
7499 
7500   IF p_charges_detail_rec.ship_to_party_id <> FND_API.G_MISS_NUM AND
7501      p_charges_detail_rec.ship_to_party_id IS NOT NULL THEN
7502 
7503     IF IS_PARTY_VALID(p_party_id      => p_charges_detail_rec.ship_to_party_id,
7504                       x_msg_data         => l_msg_data,
7505                       x_msg_count        => l_msg_count,
7506                       x_return_status    => l_return_status) = 'N' THEN
7507 
7508       Add_Invalid_Argument_Msg(l_api_name,
7509                                to_char(p_charges_detail_rec.ship_to_party_id),
7510                                'ship_to_party_id');
7511       RAISE FND_API.G_EXC_ERROR;
7512 
7513     ELSE
7514       --assign to out record
7515       x_charges_detail_rec.ship_to_party_id := p_charges_detail_rec.ship_to_party_id;
7516 
7517       IF p_charges_detail_rec.ship_to_account_id <> FND_API.G_MISS_NUM AND
7518          p_charges_detail_rec.ship_to_account_id IS NOT NULL THEN
7519 
7520          IF IS_ACCOUNT_VALID(p_party_id      => p_charges_detail_rec.ship_to_party_id,
7521                              p_account_id    => p_charges_detail_rec.ship_to_account_id,
7522                              x_msg_data      => l_msg_data,
7523                              x_msg_count     => l_msg_count,
7524                              x_return_status => l_return_status) = 'U' THEN
7525            --raise unexpected error
7526            Raise FND_API.G_EXC_UNEXPECTED_ERROR;
7527            null;
7528          ELSIF IS_ACCOUNT_VALID(p_party_id      => p_charges_detail_rec.ship_to_party_id,
7529                                 p_account_id    => p_charges_detail_rec.ship_to_account_id,
7530                                 x_msg_data      => l_msg_data,
7531                                 x_msg_count     => l_msg_count,
7532                                 x_return_status => l_return_status) = 'N' THEN
7533 
7534            Add_Invalid_Argument_Msg(l_api_name,
7535                                  to_char(p_charges_detail_rec.ship_to_account_id),
7536                                  'ship_to_account_id');
7537            RAISE FND_API.G_EXC_ERROR;
7538            null;
7539          ELSE
7540            -- assign to out record
7541            x_charges_detail_rec.ship_to_account_id := p_charges_detail_rec.ship_to_account_id;
7542          END IF;
7543 
7544       --Bug# 4870037
7545       ELSIF p_charges_detail_rec.ship_to_account_id = FND_API.G_MISS_NUM THEN
7546           x_charges_detail_rec.ship_to_account_id := l_db_det_rec.ship_to_account_id;
7547       ELSE
7548         -- ship_to_account IS NULL
7549         -- assign NULL to out record
7550         x_charges_detail_rec.ship_to_account_id := NULL;
7551       END IF;
7552       IF  p_charges_detail_rec.ship_to_contact_id <> FND_API.G_MISS_NUM AND
7553           p_charges_detail_rec.ship_to_contact_id IS NOT NULL THEN
7554 
7555 
7556         IF IS_CONTACT_VALID(p_party_id      => p_charges_detail_rec.ship_to_party_id,
7557                             p_contact_id    => p_charges_detail_rec.ship_to_contact_id,
7558                             x_msg_data      => l_msg_data,
7559                             x_msg_count     => l_msg_count,
7560                             x_return_status => l_return_status) = 'U' THEN
7561           --raise unexpected error
7562           Raise FND_API.G_EXC_UNEXPECTED_ERROR;
7563           null;
7564 
7565         ELSIF IS_CONTACT_VALID(p_party_id      => p_charges_detail_rec.ship_to_party_id,
7566                                p_contact_id    => p_charges_detail_rec.ship_to_contact_id,
7567                                x_msg_data      => l_msg_data,
7568                                x_msg_count     => l_msg_count,
7569                                x_return_status => l_return_status) = 'N' THEN
7570 
7571           Add_Invalid_Argument_Msg(l_api_name,
7572                                  to_char(p_charges_detail_rec.ship_to_contact_id),
7573                                  'ship_to_contact_id');
7574           RAISE FND_API.G_EXC_ERROR;
7575           null;
7576         ELSE
7577           -- assign to out record
7578           x_charges_detail_rec.ship_to_contact_id := p_charges_detail_rec.ship_to_contact_id;
7579         END IF;
7580       ELSE
7581         -- ship_to_contact IS NULL
7582         -- assign NULL to out record
7583         x_charges_detail_rec.ship_to_contact_id := NULL;
7584       END IF;
7585 
7586        -- Fixed Bug # 3325675
7587       IF p_charges_detail_rec.ship_to_org_id <> FND_API.G_MISS_NUM AND
7588          p_charges_detail_rec.ship_to_org_id IS NOT NULL THEN
7589 
7590 
7591         IF IS_PARTY_SITE_VALID( p_party_site_id => p_charges_detail_rec.ship_to_org_id,
7592                                 p_party_id      => p_charges_detail_rec.ship_to_party_id,
7593                                 p_val_mode      => 'SHIP_TO',
7594                                 x_msg_data      => l_msg_data,
7595                                 x_msg_count     => l_msg_count,
7596                                 x_return_status => l_return_status) = 'U' THEN
7597           --raise unexpected error
7598           Raise FND_API.G_EXC_UNEXPECTED_ERROR;
7599           null;
7600         ELSIF IS_PARTY_SITE_VALID( p_party_site_id => p_charges_detail_rec.ship_to_org_id,
7601                                 p_party_id         => p_charges_detail_rec.ship_to_party_id,
7602                                 p_val_mode         => 'SHIP_TO',
7603                                 x_msg_data         => l_msg_data,
7604                                 x_msg_count        => l_msg_count,
7605                                 x_return_status    => l_return_status) = 'N' THEN
7606           Add_Invalid_Argument_Msg(l_api_name,
7607                                  to_char(p_charges_detail_rec.ship_to_org_id),
7608                                  'Ship_to_org_Id');
7609           RAISE FND_API.G_EXC_ERROR;
7610           null;
7611         ELSE
7612           --assign to out record
7613           x_charges_detail_rec.ship_to_org_id := p_charges_detail_rec.ship_to_org_id;
7614         END IF;
7615 
7616       ELSE
7617         --ship_to_org_id IS NULL
7618         --assign NULL to out record
7619         x_charges_detail_rec.ship_to_org_id := NULL;
7620       END IF;
7621     END IF;
7622 
7623  ELSIF
7624 
7625      p_charges_detail_rec.ship_to_party_id = FND_API.G_MISS_NUM THEN
7626 
7627       -- assign the value from the database
7628       x_charges_detail_rec.ship_to_party_id := l_db_det_rec.ship_to_party_id;
7629 
7630       IF p_charges_detail_rec.ship_to_account_id <> FND_API.G_MISS_NUM AND
7631          p_charges_detail_rec.ship_to_account_id IS NOT NULL THEN
7632 
7633 
7634          IF IS_ACCOUNT_VALID(p_party_id      => x_charges_detail_rec.ship_to_party_id,
7635                              p_account_id    => p_charges_detail_rec.ship_to_account_id,
7636                              x_msg_data      => l_msg_data,
7637                              x_msg_count     => l_msg_count,
7638                              x_return_status => l_return_status) = 'U' THEN
7639            --raise unexpected error
7640            Raise FND_API.G_EXC_UNEXPECTED_ERROR;
7641            null;
7642          ELSIF IS_ACCOUNT_VALID(p_party_id      => x_charges_detail_rec.ship_to_party_id,
7643                                 p_account_id    => p_charges_detail_rec.ship_to_account_id,
7644                                 x_msg_data      => l_msg_data,
7645                                 x_msg_count     => l_msg_count,
7646                                 x_return_status => l_return_status) = 'N' THEN
7647 
7648            Add_Invalid_Argument_Msg(l_api_name,
7649                                  to_char(p_charges_detail_rec.ship_to_account_id),
7650                                  'ship_to_account_id');
7651            RAISE FND_API.G_EXC_ERROR;
7652            null;
7653          ELSE
7654            -- assign to out record
7655            x_charges_detail_rec.ship_to_account_id := p_charges_detail_rec.ship_to_account_id;
7656          END IF;
7657       ELSE
7658         -- ship_to_account is not passed
7659         -- assign the value from the database
7660         x_charges_detail_rec.ship_to_account_id := l_db_det_rec.ship_to_account_id;
7661       END IF;
7662 
7663       IF  p_charges_detail_rec.ship_to_contact_id <> FND_API.G_MISS_NUM AND
7664           p_charges_detail_rec.ship_to_contact_id IS NOT NULL THEN
7665 
7666 
7667         IF IS_CONTACT_VALID(p_party_id      => x_charges_detail_rec.ship_to_party_id,
7668                             p_contact_id    => p_charges_detail_rec.ship_to_contact_id,
7669                             x_msg_data      => l_msg_data,
7670                             x_msg_count     => l_msg_count,
7671                             x_return_status => l_return_status) = 'U' THEN
7672           --raise unexpected error
7673           Raise FND_API.G_EXC_UNEXPECTED_ERROR;
7674           null;
7675 
7676         ELSIF IS_CONTACT_VALID(p_party_id      => x_charges_detail_rec.ship_to_party_id,
7677                                p_contact_id    => p_charges_detail_rec.ship_to_contact_id,
7678                                x_msg_data      => l_msg_data,
7679                                x_msg_count     => l_msg_count,
7680                                x_return_status => l_return_status) = 'N' THEN
7681 
7682           Add_Invalid_Argument_Msg(l_api_name,
7683                                  to_char(p_charges_detail_rec.ship_to_contact_id),
7684                                  'ship_to_contact_id');
7685           RAISE FND_API.G_EXC_ERROR;
7686           null;
7687         ELSE
7688           -- assign to out record
7689           x_charges_detail_rec.ship_to_contact_id := p_charges_detail_rec.ship_to_contact_id;
7690         END IF;
7691       ELSE
7692         -- bill_to_contact is not passed
7693         -- assign values from the database to out record
7694         x_charges_detail_rec.ship_to_contact_id := l_db_det_rec.ship_to_contact_id;
7695       END IF;
7696 
7697        -- Fixed Bug # 3325675
7698       IF p_charges_detail_rec.ship_to_org_id <> FND_API.G_MISS_NUM AND
7699          p_charges_detail_rec.ship_to_org_id IS NOT NULL THEN
7700 
7701 
7702         IF IS_PARTY_SITE_VALID( p_party_site_id => p_charges_detail_rec.ship_to_org_id,
7703                                 p_party_id      => x_charges_detail_rec.ship_to_party_id,
7704                                 p_val_mode      => 'SHIP_TO',
7705                                 x_msg_data      => l_msg_data,
7706                                 x_msg_count     => l_msg_count,
7707                                 x_return_status => l_return_status) = 'U' THEN
7708           --raise unexpected error
7709           Raise FND_API.G_EXC_UNEXPECTED_ERROR;
7710           null;
7711         ELSIF IS_PARTY_SITE_VALID( p_party_site_id => p_charges_detail_rec.ship_to_org_id,
7712                                 p_party_id         => x_charges_detail_rec.ship_to_party_id,
7713                                 p_val_mode         => 'SHIP_TO',
7714                                 x_msg_data         => l_msg_data,
7715                                 x_msg_count        => l_msg_count,
7716                                 x_return_status    => l_return_status) = 'N' THEN
7717           Add_Invalid_Argument_Msg(l_api_name,
7718                                  to_char(p_charges_detail_rec.ship_to_org_id),
7719                                  'ship_to_org_id');
7720           RAISE FND_API.G_EXC_ERROR;
7721           null;
7722         ELSE
7723           --assign to out record
7724           x_charges_detail_rec.ship_to_org_id := p_charges_detail_rec.ship_to_org_id;
7725         END IF;
7726 
7727       ELSE
7728         --ship_to_org_id is not passed
7729         --assign values from the database to out record
7730         x_charges_detail_rec.ship_to_org_id := l_db_det_rec.ship_to_org_id;
7731       END IF;
7732 
7733  ELSE
7734 
7735     IF p_charges_detail_rec.ship_to_party_id IS NULL THEN
7736 
7737       --all the values for out record for TCA should be nulled out
7738       x_charges_detail_rec.ship_to_party_id := NULL;
7739       x_charges_detail_rec.ship_to_account_id := NULL;
7740       x_charges_detail_rec.ship_to_contact_id := NULL;
7741       x_charges_detail_rec.ship_to_org_id := NULL;
7742     END IF;
7743   END IF;
7744 END IF;
7745 
7746 
7747 --DBMS_OUTPUT.PUT_LINE('TCA VALID');
7748 --DBMS_OUTPUT.PUT_LINE('Customer ID '||l_customer_id);
7749 
7750 --==================================================
7751 -- Sold to party Validation
7752 --==================================================
7753 --DBMS_OUTPUT.PUT_LINE('Sold To Party Validation ...');
7754 
7755 --DBMS_OUTPUT.PUT_LINE('sold_to_party_id'||p_charges_detail_rec.sold_to_party_id);
7756 --DBMS_OUTPUT.PUT_LINE('customer id '||l_customer_id);
7757 
7758 IF p_validation_mode = 'I' THEN
7759   IF p_charges_detail_rec.sold_to_party_id IS NOT NULL THEN
7760     IF p_charges_detail_rec.sold_to_party_id <> l_customer_id THEN
7761       --raise error
7762       FND_MESSAGE.SET_NAME('CS', 'CS_CHG_INVALID_SOLD_TO_PARTY');
7763       FND_MESSAGE.SET_TOKEN('SOLD_TO_PARTY', p_charges_detail_rec.sold_to_party_id);
7764       FND_MESSAGE.SET_TOKEN('INCIDENT_ID', p_charges_detail_rec.incident_id);
7765       FND_MSG_PUB.ADD;
7766       RAISE FND_API.G_EXC_ERROR;
7767     ELSE
7768       --assign the sold to party to the out record
7769       x_charges_detail_rec.sold_to_party_id := l_customer_id;
7770     END IF;
7771   ELSE
7772     --p_charges_detail_rec.sold_to_party_id
7773     IF l_customer_id IS NOT NULL THEN
7774       --assign the l_customer_id to the out rec
7775       x_charges_detail_rec.sold_to_party_id  := l_customer_id;
7776     ELSE
7777       x_charges_detail_rec.sold_to_party_id  := NULL;
7778     END IF;
7779   END IF;
7780 
7781 ElSIF p_validation_mode  = 'U' THEN
7782 
7783   IF p_charges_detail_rec.sold_to_party_id <> FND_API.G_MISS_NUM AND
7784     p_charges_detail_rec.sold_to_party_id IS NOT NULL THEN
7785     IF p_charges_detail_rec.sold_to_party_id <> l_customer_id THEN
7786       --raise error
7787       FND_MESSAGE.SET_NAME('CS', 'CS_CHG_INVALID_SOLD_TO_PARTY');
7788       FND_MESSAGE.SET_TOKEN('SOLD_TO_PARTY', p_charges_detail_rec.sold_to_party_id);
7789       FND_MESSAGE.SET_TOKEN('INCIDENT_ID', p_charges_detail_rec.incident_id);
7790       FND_MSG_PUB.ADD;
7791       RAISE FND_API.G_EXC_ERROR;
7792     ELSE
7793       --assign the sold to party to the out record
7794       x_charges_detail_rec.sold_to_party_id := p_charges_detail_rec.sold_to_party_id;
7795     END IF;
7796 
7797   ELSIF p_charges_detail_rec.sold_to_party_id = FND_API.G_MISS_NUM THEN
7798     --assign the database value to the field
7799     --assign the sold to party to the out record
7800     x_charges_detail_rec.sold_to_party_id := l_customer_id ;
7801 
7802   ELSE
7803     IF p_charges_detail_rec.sold_to_party_id IS NULL THEN
7804       IF l_customer_id IS NOT NULL THEN
7805         -- raise error
7806         null;
7807       ELSE
7808         x_charges_detail_rec.sold_to_party_id := NULL;
7809       END IF;
7810     END IF;
7811   END IF;
7812  END IF;
7813 
7814 --DBMS_OUTPUT.PUT_LINE('Sold To Party Validation successful...');
7815 
7816 --============================================
7817 --Valid the Item Instance
7818 --============================================
7819 -- DBMS_OUTPUT.PUT_LINE('Item Instance Validation ...');
7820 IF p_validation_mode = 'I' THEN
7821 
7822    -- DBMS_OUTPUT.PUT_LINE('Update_ib_flag '||l_update_ib_flag);
7823    -- DBMS_OUTPUT.PUT_LINE('src_reference_reqd_flag '||l_src_reference_reqd_flag);
7824    -- DBMS_OUTPUT.PUT_LINE('line_order_category_code '||l_line_order_category_code);
7825    -- DBMS_OUTPUT.PUT_LINE('customer_product_id '||p_charges_detail_rec.customer_product_id);
7826 
7827 
7828    x_charges_detail_rec.customer_product_id := p_charges_detail_rec.customer_product_id;
7829    x_charges_detail_rec.serial_number := p_charges_detail_rec.serial_number;
7830 
7831     --item instance validation
7832     --fixed Bug # 3362130 - added l_comms_trackable_flag = 'Y' condition
7833  IF(l_update_ib_flag = 'Y') AND
7834       (l_src_reference_reqd_flag = 'Y') AND
7835       (l_line_order_category_code = 'RETURN') AND
7836       (l_comms_trackable_flag = 'Y') THEN
7837       IF p_charges_detail_rec.customer_product_id IS NULL THEN
7838 
7839         -- --DBMS_OUTPUT.PUT_LINE('Customer product id null');
7840         --RAISE FND_API.G_EXC_ERROR;
7841         --null;
7842         FND_MESSAGE.Set_Name('CS', 'CS_API_CHG_IB_INSTANCE_MISSING');
7843         FND_MESSAGE.Set_Token('API_NAME', p_api_name);
7844         FND_MSG_PUB.Add;
7845         RAISE FND_API.G_EXC_ERROR;
7846       ELSE
7847         -- Check if instance is of the same inventory_item_id
7848         -- If not of the same inv id the error
7849         -- Call IS_INSTANCE_FOR_INVENTORY
7850 
7851         -- --DBMS_OUTPUT.PUT_LINE('Customer product id is not null');
7852 
7853         l_valid_check := IS_INSTANCE_FOR_INVENTORY(
7854                                      p_instance_id   => p_charges_detail_rec.customer_product_id,
7855                                      p_inv_id        => x_charges_detail_rec.inventory_item_id_in,
7856                                      x_msg_data      => l_msg_data,
7857                                      x_msg_count     => l_msg_count,
7858                                      x_return_status => l_return_status);
7859 
7860           IF l_return_status = G_RET_STS_UNEXP_ERROR THEN
7861             RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
7862           ELSIF l_return_status = G_RET_STS_ERROR THEN
7863             RAISE FND_API.G_EXC_ERROR;
7864           END IF;
7865 
7866         IF l_valid_check <> 'Y' THEN
7867 
7868             FND_MESSAGE.SET_NAME('CS', 'CS_CHG_INVALID_IB_INSTANCE_INV');
7869             FND_MESSAGE.Set_Token('INVENTORY_ITEM_ID', p_charges_detail_rec.inventory_item_id_in);
7870             FND_MESSAGE.Set_Token('INSTANCE_ID', p_charges_detail_rec.customer_product_id);
7871             FND_MSG_PUB.Add;
7872             RAISE FND_API.G_EXC_ERROR;
7873         ELSE
7874 
7875           l_valid_check := IS_INSTANCE_VALID(p_instance_id   => p_charges_detail_rec.customer_product_id,
7876                                p_party_id      => x_charges_detail_rec.sold_to_party_id,
7877                                x_msg_data      => l_msg_data,
7878                                x_msg_count     => l_msg_count,
7879                                x_return_status => l_return_status);
7880 
7881               IF l_return_status = G_RET_STS_UNEXP_ERROR THEN
7882                 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
7883               ELSIF l_return_status = G_RET_STS_ERROR THEN
7884                 RAISE FND_API.G_EXC_ERROR;
7885               END IF;
7886 
7887 --taklam
7888           IF l_valid_check <> 'Y' THEN
7889              --Check if Service activity has 'change owner flag' set to 'N'
7890              --(See the csi_ib_txn_types table for the flag value)
7891              --'change owner flag'
7892 
7893              OPEN C_SRC_CHANGE_OWNER(p_charges_detail_rec.txn_billing_type_id);
7894              FETCH C_SRC_CHANGE_OWNER INTO l_src_change_owner;
7895              CLOSE C_SRC_CHANGE_OWNER;
7896 
7897              If (l_src_change_owner = 'N') or (l_src_change_owner is null) THEN
7898                --Pass the internal_party_id to the existing "IS_INSTANCE_VALID" method.
7899                --select internal_party_id from csi_install_parameters,
7900                SELECT internal_party_id into l_internal_party_id
7901                FROM csi_install_parameters WHERE rownum = 1;
7902 
7903                l_valid_check := IS_INSTANCE_VALID( p_instance_id   => p_charges_detail_rec.customer_product_id,
7904                                                    p_party_id      => l_internal_party_id,
7905                                                    x_msg_data      => l_msg_data,
7906                                                    x_msg_count     => l_msg_count,
7907                                                    x_return_status => l_return_status);
7908                IF l_return_status = G_RET_STS_UNEXP_ERROR THEN
7909                  RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
7910                ELSIF l_return_status = G_RET_STS_ERROR THEN
7911                  RAISE FND_API.G_EXC_ERROR;
7912                END IF;
7913              End if;
7914           End if;
7915 
7916 
7917           IF l_valid_check <> 'Y' THEN
7918 
7919                FND_MESSAGE.SET_NAME ('CS', 'CS_CHG_INVALID_INSTANCE_RMA_PT');
7920                FND_MSG_PUB.Add;
7921                RAISE FND_API.G_EXC_ERROR;
7922 --taklam
7923           ELSE
7924             --assign the customer product id to out record
7925             x_charges_detail_rec.customer_product_id := p_charges_detail_rec.customer_product_id;
7926             --DBMS_OUTPUT.PUT_LINE('Cust prod id '||x_charges_detail_rec.customer_product_id);
7927           END IF;
7928         END IF;
7929       END IF;
7930 
7931       -- check to see if its a serialized item
7932       -- Added for Bug # 4073602
7933       IF l_serial_control_flag = 'Y' THEN
7934         IF p_charges_detail_rec.serial_number IS NULL THEN
7935           -- no error raised
7936           -- Fix bug#5125934
7937           OPEN c_serial_number(p_charges_detail_rec.customer_product_id);
7938           FETCH c_serial_number
7939           INTO  l_serial_number;
7940           CLOSE c_serial_number;
7941 
7942           -- x_charges_detail_rec.serial_number := p_charges_detail_rec.serial_number;
7943           x_charges_detail_rec.serial_number := l_serial_number;
7944         ELSE
7945           --validate the serial number
7946           l_valid_check := IS_INSTANCE_SERIAL_VALID( p_instance_id   => x_charges_detail_rec.customer_product_id
7947                                                     ,p_serial_number => p_charges_detail_rec.serial_number
7948                                                     ,x_msg_data      => l_msg_data
7949                                                     ,x_msg_count     => l_msg_count
7950                                                     ,x_return_status => l_return_status);
7951 
7952           IF l_return_status = G_RET_STS_UNEXP_ERROR THEN
7953             RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
7954           ELSIF l_return_status = G_RET_STS_ERROR THEN
7955             RAISE FND_API.G_EXC_ERROR;
7956           END IF;
7957 
7958           IF l_valid_check <> 'Y' THEN
7959             FND_MESSAGE.SET_NAME('CS', 'CS_CHG_INVALID_SERIAL_NUMBER');
7960             FND_MESSAGE.Set_Token('INSTANCE_ID', p_charges_detail_rec.customer_product_id);
7961             FND_MESSAGE.Set_Token('SERIAL_NUMBER', p_charges_detail_rec.serial_number);
7962             FND_MSG_PUB.Add;
7963             RAISE FND_API.G_EXC_ERROR;
7964           ELSE
7965             --assign the customer product id to out record
7966             x_charges_detail_rec.serial_number := p_charges_detail_rec.serial_number;
7967           END IF;
7968         END IF;
7969 
7970       ELSE
7971         x_charges_detail_rec.serial_number := p_charges_detail_rec.serial_number;
7972       END IF; -- check to see if its a serialized item
7973 
7974 
7975     --fixed Bug # 3362130 - added l_comms_trackable_flag = 'Y' condition
7976  ELSIF (l_update_ib_flag = 'Y') AND
7977       (l_non_src_reference_reqd_flag = 'Y') AND
7978       (l_line_order_category_code = 'ORDER') AND
7979       (l_comms_trackable_flag = 'Y') THEN
7980       IF p_charges_detail_rec.customer_product_id IS NULL THEN
7981         --DBMS_OUTPUT.PUT_LINE('Customer product id null');
7982         --RAISE FND_API.G_EXC_ERROR;
7983         --null;
7984         FND_MESSAGE.Set_Name('CS', 'CS_API_CHG_IB_INSTANCE_MISSING');
7985         FND_MESSAGE.Set_Token('API_NAME', p_api_name);
7986         FND_MSG_PUB.Add;
7987         RAISE FND_API.G_EXC_ERROR;
7988       ELSE
7989 
7990 
7991         l_valid_check := IS_INSTANCE_VALID(p_instance_id   => p_charges_detail_rec.customer_product_id,
7992                                p_party_id      => x_charges_detail_rec.sold_to_party_id,
7993                                x_msg_data      => l_msg_data,
7994                                x_msg_count     => l_msg_count,
7995                                x_return_status => l_return_status);
7996 
7997               IF l_return_status = G_RET_STS_UNEXP_ERROR THEN
7998                 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
7999               ELSIF l_return_status = G_RET_STS_ERROR THEN
8000                 RAISE FND_API.G_EXC_ERROR;
8001               END IF;
8002         --DBMS_OUTPUT.PUT_LINE('Instance is l_valid_check'||l_valid_check);
8003 
8004         IF l_valid_check <> 'Y' THEN
8005 
8006               FND_MESSAGE.SET_NAME('CS', 'CS_CHG_INVALID_IB_INSTANCE_PTY');
8007               FND_MESSAGE.Set_Token('PARTY_ID', x_charges_detail_rec.sold_to_party_id);
8008               FND_MESSAGE.Set_Token('INSTANCE_ID', p_charges_detail_rec.customer_product_id);
8009               FND_MSG_PUB.Add;
8010               RAISE FND_API.G_EXC_ERROR;
8011 
8012         ELSE
8013           --assign to out record
8014           x_charges_detail_rec.customer_product_id := p_charges_detail_rec.customer_product_id;
8015           --DBMS_OUTPUT.PUT_LINE('Cust prod id '||x_charges_detail_rec.customer_product_id);
8016         END IF;
8017       END IF;
8018 
8019       ELSIF (nvl(l_update_ib_flag,'N') = 'N') AND   --Incase of SD l_update_ib_flag is coming as NULL
8020           (l_line_order_category_code = 'RETURN') THEN
8021 
8022     /*  -- check for customer product id
8023       IF p_charges_detail_rec.customer_product_id IS NOT NULL THEN
8024         --validate the instance
8025         --IF not valid then raise error
8026         --ELSE assign
8027         null;
8028       END IF;*/
8029 
8030         -- commented off the above piece of code
8031 	-- Below check has been added for bug 9058387
8032 	-- Perform the instance validation when the l_update_ib_flag is passed as 'N'
8033 	       IF p_charges_detail_rec.customer_product_id IS NOT NULL THEN
8034 	       l_valid_check := IS_INSTANCE_VALID(p_instance_id   => p_charges_detail_rec.customer_product_id,
8035 				       p_party_id      => x_charges_detail_rec.sold_to_party_id,
8036 				       x_msg_data      => l_msg_data,
8037 				       x_msg_count     => l_msg_count,
8038 				       x_return_status => l_return_status);
8039 
8040 		      IF l_return_status = G_RET_STS_UNEXP_ERROR THEN
8041 			RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
8042 		      ELSIF l_return_status = G_RET_STS_ERROR THEN
8043 			RAISE FND_API.G_EXC_ERROR;
8044 		      END IF;
8045 
8046 			IF l_valid_check <> 'Y' THEN
8047 
8048 			      FND_MESSAGE.SET_NAME('CS', 'CS_CHG_INVALID_IB_INSTANCE_PTY');
8049 			      FND_MESSAGE.Set_Token('PARTY_ID', x_charges_detail_rec.sold_to_party_id);
8050 			      FND_MESSAGE.Set_Token('INSTANCE_ID', p_charges_detail_rec.customer_product_id);
8051 			      FND_MSG_PUB.Add;
8052 			      RAISE FND_API.G_EXC_ERROR;
8053 
8054 			ELSE
8055 			  --assign to out record
8056 			  x_charges_detail_rec.customer_product_id := p_charges_detail_rec.customer_product_id;
8057 			  --DBMS_OUTPUT.PUT_LINE('Cust prod id '||x_charges_detail_rec.customer_product_id);
8058 			END IF;
8059 	      END IF;
8060 
8061 
8062       -- check to see if its a serialized item
8063       -- Added for Bug # 4073602
8064       IF l_serial_control_flag = 'Y' THEN
8065         IF p_charges_detail_rec.serial_number IS NULL THEN
8066           -- no error raised
8067           -- Fix bug#5125934
8068           OPEN c_serial_number(p_charges_detail_rec.customer_product_id);
8069           FETCH c_serial_number
8070           INTO  l_serial_number;
8071           CLOSE c_serial_number;
8072 
8073           -- x_charges_detail_rec.serial_number := p_charges_detail_rec.serial_number;
8074           x_charges_detail_rec.serial_number := l_serial_number;
8075 
8076         ELSE
8077           --validate the serial number
8078           l_valid_check := IS_INSTANCE_SERIAL_VALID( p_instance_id => x_charges_detail_rec.customer_product_id
8079                                                     ,p_serial_number => p_charges_detail_rec.serial_number
8080                                                     ,x_msg_data      => l_msg_data
8081                                                     ,x_msg_count     => l_msg_count
8082                                                     ,x_return_status => l_return_status);
8083 
8084           IF l_return_status = G_RET_STS_UNEXP_ERROR THEN
8085             RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
8086           ELSIF l_return_status = G_RET_STS_ERROR THEN
8087             RAISE FND_API.G_EXC_ERROR;
8088           END IF;
8089 
8090           IF l_valid_check <> 'Y' THEN
8091             FND_MESSAGE.SET_NAME('CS', 'CS_CHG_INVALID_SERIAL_NUMBER');
8092             FND_MESSAGE.Set_Token('INSTANCE_ID', p_charges_detail_rec.customer_product_id);
8093             FND_MESSAGE.Set_Token('SERIAL_NUMBER', p_charges_detail_rec.serial_number);
8094             FND_MSG_PUB.Add;
8095             RAISE FND_API.G_EXC_ERROR;
8096           ELSE
8097             --assign the customer product id to out record
8098             x_charges_detail_rec.serial_number := p_charges_detail_rec.serial_number;
8099           END IF;
8100         END IF;
8101 
8102       ELSE
8103         x_charges_detail_rec.serial_number := p_charges_detail_rec.serial_number;
8104       END IF; -- check to see if its a serialized item
8105 
8106     ELSE -- IF1
8107 
8108       --DBMS_OUTPUT.PUT_LINE('In the IF1');
8109       -- Added customer_product_id is not null condition
8110       IF (p_charges_detail_rec.customer_product_id IS NOT NULL AND -- IF2
8111           p_charges_detail_rec.customer_product_id <> FND_API.G_MISS_NUM) THEN
8112         -- Added the FND Messages for Bug# 5141369
8113         IF (l_comms_trackable_flag = 'N') THEN
8114           FND_MESSAGE.SET_NAME('CS', 'CS_CHG_INVALID_INST_AND_INV');
8115           FND_MESSAGE.Set_Token('INSTANCE_ID', p_charges_detail_rec.customer_product_id);
8116           FND_MESSAGE.Set_Token('INVENTORY_ITEM_ID', p_charges_detail_rec.inventory_item_id_in);
8117           FND_MSG_PUB.Add;
8118           RAISE FND_API.G_EXC_ERROR;
8119         ELSE
8120           -- Check if the Instance Is Valid for all other cases
8121           l_valid_check := IS_INSTANCE_VALID(
8122                 p_instance_id   => p_charges_detail_rec.customer_product_id,
8123                 p_party_id      => x_charges_detail_rec.sold_to_party_id,
8124                 x_msg_data      => l_msg_data,
8125                 x_msg_count     => l_msg_count,
8126                 x_return_status => l_return_status);
8127           IF l_return_status = G_RET_STS_UNEXP_ERROR THEN
8128             RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
8129           ELSIF l_return_status = G_RET_STS_ERROR THEN
8130             RAISE FND_API.G_EXC_ERROR;
8131           END IF;
8132         END IF;
8133 
8134         --DBMS_OUTPUT.PUT_LINE('l_valid_check'||l_valid_check);
8135 
8136 --taklam
8137         IF l_valid_check <> 'Y' THEN
8138           --Check if Service activity has 'change owner flag' set to 'N'
8139           --(See the csi_ib_txn_types table for the flag value)
8140           --'change owner flag'
8141 
8142           OPEN C_SRC_CHANGE_OWNER(p_charges_detail_rec.txn_billing_type_id);
8143           FETCH C_SRC_CHANGE_OWNER INTO l_src_change_owner;
8144           CLOSE C_SRC_CHANGE_OWNER;
8145 
8146           --DBMS_OUTPUT.PUT_LINE('l_src_change_owner'||l_src_change_owner);
8147 
8148           If (l_src_change_owner = 'N') or (l_src_change_owner is null) THEN
8149             --Pass the internal_party_id to the existing "IS_INSTANCE_VALID" method.
8150             --select internal_party_id from csi_install_parameters,
8151             SELECT internal_party_id into l_internal_party_id
8152             FROM csi_install_parameters WHERE rownum = 1;
8153 
8154             l_valid_check := IS_INSTANCE_VALID( p_instance_id   => p_charges_detail_rec.customer_product_id,
8155                                                 p_party_id      => l_internal_party_id,
8156                                                 x_msg_data      => l_msg_data,
8157                                                 x_msg_count     => l_msg_count,
8158                                                 x_return_status => l_return_status);
8159             IF l_return_status = G_RET_STS_UNEXP_ERROR THEN
8160               RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
8161             ELSIF l_return_status = G_RET_STS_ERROR THEN
8162               RAISE FND_API.G_EXC_ERROR;
8163             END IF;
8164           End if;
8165         End if;
8166 
8167         --DBMS_OUTPUT.PUT_LINE('l_valid_check'||l_valid_check);
8168 
8169         IF l_valid_check <> 'Y' THEN
8170 
8171             --FND_MESSAGE.SET_NAME ('CS', 'CS_CHG_INVALID_INSTANCE_RMA_PT');
8172             --FND_MSG_PUB.Add;
8173             Add_Invalid_Argument_Msg(l_api_name_full,
8174                              to_char(p_charges_detail_rec.customer_product_id),
8175                              'Customer_Product_Id');
8176             RAISE FND_API.G_EXC_ERROR;
8177 --taklam
8178         ELSE
8179           x_charges_detail_rec.customer_product_id := p_charges_detail_rec.customer_product_id;
8180         END IF;
8181 
8182         -- check to see if its a serialized item
8183         -- Added for Bug # 4073602
8184         IF l_serial_control_flag = 'Y' THEN
8185            --DBMS_OUTPUT.PUT_LINE('l_serial_control_flag'||l_serial_control_flag);
8186           IF p_charges_detail_rec.serial_number IS NULL THEN
8187             -- no error raised
8188             -- Fix bug#5125934
8189             OPEN c_serial_number(p_charges_detail_rec.customer_product_id);
8190             FETCH c_serial_number
8191             INTO  l_serial_number;
8192             CLOSE c_serial_number;
8193 
8194           -- x_charges_detail_rec.serial_number := p_charges_detail_rec.serial_number;
8195           x_charges_detail_rec.serial_number := l_serial_number;
8196 
8197           ELSE
8198             --validate the serial number
8199             --DBMS_OUTPUT.PUT_LINE('Calling IS_INSTANCE_SERIAL_VALID');
8200             --DBMS_OUTPUT.PUT_LINE('x_charges_detail_rec.customer_product_id'||x_charges_detail_rec.customer_product_id);
8201             --DBMS_OUTPUT.PUT_LINE('p_charges_detail_rec.serial_number'||p_charges_detail_rec.serial_number);
8202 
8203             l_valid_check := IS_INSTANCE_SERIAL_VALID( p_instance_id => x_charges_detail_rec.customer_product_id
8204                                                     ,p_serial_number => p_charges_detail_rec.serial_number
8205                                                     ,x_msg_data      => l_msg_data
8206                                                     ,x_msg_count     => l_msg_count
8207                                                     ,x_return_status => l_return_status);
8208             IF l_return_status = G_RET_STS_UNEXP_ERROR THEN
8209               RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
8210             ELSIF l_return_status = G_RET_STS_ERROR THEN
8211               RAISE FND_API.G_EXC_ERROR;
8212             END IF;
8213 
8214             IF l_valid_check <> 'Y' THEN
8215               FND_MESSAGE.SET_NAME('CS', 'CS_CHG_INVALID_SERIAL_NUMBER');
8216               FND_MESSAGE.Set_Token('INSTANCE_ID', p_charges_detail_rec.customer_product_id);
8217               FND_MESSAGE.Set_Token('SERIAL_NUMBER', p_charges_detail_rec.serial_number);
8218               FND_MSG_PUB.Add;
8219               RAISE FND_API.G_EXC_ERROR;
8220             ELSE
8221               --assign the customer product id to out record
8222               x_charges_detail_rec.serial_number := p_charges_detail_rec.serial_number;
8223             END IF;
8224           END IF;
8225 
8226         ELSE
8227           x_charges_detail_rec.serial_number := p_charges_detail_rec.serial_number;
8228         END IF; -- check to see if its a serialized item
8229 
8230       END IF; -- IF2
8231     END IF; -- IF1
8232 
8233     --DBMS_OUTPUT.PUT_LINE('Checking  src');
8234 
8235     -- Fix for Bug # 3325686
8236     --fixed Bug # 3362130 - added l_comms_trackable_flag = 'Y' condition
8237     /*** IF l_src_reference_reqd_flag = 'Y' AND
8238        l_src_return_reqd_flag = 'Y' AND
8239        l_line_order_category_code = 'RETURN' AND
8240        l_comms_trackable_flag = 'Y' THEN
8241         IF p_charges_detail_rec.installed_cp_return_by_date IS NULL THEN
8242           --RAISE FND_API.G_EXC_ERROR;
8243           --null;
8244           FND_MESSAGE.SET_NAME('CS', 'CS_CHG_INST_CP_RETURN_BY_DATE');
8245           FND_MESSAGE.Set_Token('INST_CP_RTN_BY_DATE', p_charges_detail_rec.installed_cp_return_by_date);
8246           FND_MSG_PUB.Add;
8247           RAISE FND_API.G_EXC_ERROR;
8248         ELSE
8249           --assign to out record
8250           x_charges_detail_rec.installed_cp_return_by_date := p_charges_detail_rec.installed_cp_return_by_date;
8251         END IF;
8252 
8253     ELSE
8254       -- the flag is 'N'
8255       -- ignore the installed_cp_return_by_date
8256       x_charges_detail_rec.installed_cp_return_by_date := NULL;
8257     END IF; ****/
8258 
8259     -- Return_by_date fix. If the flags are not set, then assign
8260     --whatever value comes in and do not set the installed_cp_return_date to NULL
8261     -- Fix for bug#5136691
8262     IF l_src_return_reqd_flag = 'Y' AND
8263        l_line_order_category_code = 'RETURN' AND
8264        l_comms_trackable_flag = 'Y' THEN
8265 
8266         IF p_charges_detail_rec.installed_cp_return_by_date IS NULL THEN
8267           --RAISE FND_API.G_EXC_ERROR;
8268           --null;
8269           FND_MESSAGE.SET_NAME('CS', 'CS_CHG_INST_CP_RETURN_BY_DATE');
8270           FND_MESSAGE.Set_Token('INST_CP_RTN_BY_DATE', p_charges_detail_rec.installed_cp_return_by_date);
8271           FND_MSG_PUB.Add;
8272           RAISE FND_API.G_EXC_ERROR;
8273         ELSE
8274           --assign to out record
8275           x_charges_detail_rec.installed_cp_return_by_date := p_charges_detail_rec.installed_cp_return_by_date;
8276         END IF;
8277     ELSE
8278       -- the flag is 'N'
8279       -- ignore installed_cp_return_by_date
8280       x_charges_detail_rec.installed_cp_return_by_date := p_charges_detail_rec.installed_cp_return_by_date;
8281     END IF;
8282 
8283     --DBMS_OUTPUT.PUT_LINE('Done Checking src');
8284     --DBMS_OUTPUT.PUT_LINE('Checking  non src');
8285 
8286     -- Depot Loaner fix - Bug#4586140
8287     -- Commenting out for return_by_date fix
8288     /* Open c_get_depot_txns_details(p_charges_detail_rec.estimate_detail_id);
8289     Fetch c_get_depot_txns_details into l_action_code;
8290     Close c_get_depot_txns_details; */
8291 
8292     -- Fix for Bug # 3325686
8293     --fixed Bug # 3362130 - added l_comms_trackable_flag = 'Y' condition
8294     -- commented out the old code
8295     -- Modified for the return_by_date fix. Bug:5136853
8296     -- If the instance is not null and the non_src retur_reqd flag is 'Y' ,
8297     -- then installed_cp_return_by_date column should have a value.
8298     -- Likewise if the instance is null and the item is trackable and the
8299     -- src_return_reqd field is 'y', the the new_cp_return_by_date should have a value.
8300     -- Otherwise raise appropriate errors. This validation is for 'ORDER'
8301 
8302     /*** non source flag checked for the 'ORDER' ***/
8303     IF l_non_src_return_reqd_flag = 'Y' AND
8304        l_line_order_category_code = 'ORDER' AND
8305        l_comms_trackable_flag = 'Y' AND
8306        p_charges_detail_rec.customer_product_id IS NOT NULL THEN
8307       IF p_charges_detail_rec.installed_cp_return_by_date IS NULL THEN
8308         FND_MESSAGE.SET_NAME('CS', 'CS_CHG_INSTALLED_CP_RETURN_BY_DATE');
8309         FND_MESSAGE.Set_Token('INSTALLED_CP_RTN_BY_DATE', p_charges_detail_rec.installed_cp_return_by_date);
8310         FND_MSG_PUB.Add;
8311         RAISE FND_API.G_EXC_ERROR;
8312       ELSE
8313         x_charges_detail_rec.installed_cp_return_by_date := p_charges_detail_rec.installed_cp_return_by_date;
8314       END IF;
8315     ELSE
8316       -- Assign whatever value is passed in the parameter.
8317       x_charges_detail_rec.installed_cp_return_by_date := p_charges_detail_rec.installed_cp_return_by_date;
8318     END IF;
8319 
8320     /*** Source Flag checked for the 'Order' ***/
8321     IF l_src_return_reqd_flag = 'Y' AND
8322        l_line_order_category_code = 'ORDER' AND
8323        l_comms_trackable_flag = 'Y' AND
8324        p_charges_detail_rec.customer_product_id IS NULL THEN
8325       IF p_charges_detail_rec.new_cp_return_by_date IS NULL THEN
8326         FND_MESSAGE.SET_NAME('CS', 'CS_CHG_NEW_CP_RETURN_BY_DATE');
8327         FND_MESSAGE.Set_Token('NEW_CP_RTN_BY_DATE', p_charges_detail_rec.new_cp_return_by_date);
8328         FND_MSG_PUB.Add;
8329         RAISE FND_API.G_EXC_ERROR;
8330       ELSE
8331         x_charges_detail_rec.new_cp_return_by_date := p_charges_detail_rec.new_cp_return_by_date;
8332       END IF;
8333     ELSE
8334       -- Assign whatever value is passed in the parameter.
8335       x_charges_detail_rec.new_cp_return_by_date := p_charges_detail_rec.new_cp_return_by_date;
8336     END IF;
8337 
8338 
8339     /*****
8340     IF l_non_src_reference_reqd_flag = 'Y' AND
8341        l_non_src_return_reqd = 'Y' AND
8342        l_line_order_category_code = 'ORDER' AND
8343        l_comms_trackable_flag = 'Y' THEN
8344       IF p_charges_detail_rec.new_cp_return_by_date IS NULL THEN
8345         --RAISE FND_API.G_EXC_ERROR;
8346         --null;
8347         FND_MESSAGE.SET_NAME('CS', 'CS_CHG_NEW_CP_RETURN_BY_DATE');
8348         FND_MESSAGE.Set_Token('NEW_CP_RTN_BY_DATE', p_charges_detail_rec.new_cp_return_by_date);
8349         FND_MSG_PUB.Add;
8350         RAISE FND_API.G_EXC_ERROR;
8351       ELSE
8352         x_charges_detail_rec.new_cp_return_by_date := p_charges_detail_rec.new_cp_return_by_date;
8353       END IF;
8354 
8355      -- Depot Loaner fix - Bug#4586140
8356     ELSIF ( l_line_order_category_code = 'ORDER' AND
8357             l_comms_trackable_flag = 'Y' AND
8358             l_src_return_reqd_flag = 'Y' AND
8359             l_action_code = 'LOANER') THEN
8360 
8361         x_charges_detail_rec.new_cp_return_by_date := p_charges_detail_rec.new_cp_return_by_date;
8362     ELSE
8363       --the flag is 'N'
8364       --ignore the new_cp_return_by_date
8365       x_charges_detail_rec.new_cp_return_by_date := NULL;
8366     END IF;  *****/
8367 
8368 
8369   --DBMS_OUTPUT.PUT_LINE('Done Checking non src');
8370   --DBMS_OUTPUT.PUT_LINE('Cust_product_id is '||P_CHARGES_DETAIL_REC.customer_product_id);
8371 
8372 
8373 ELSIF p_validation_mode = 'U' THEN
8374 
8375     -- If no customer_product_id is passed
8376 	    IF  p_charges_detail_rec.customer_product_id = FND_API.G_MISS_NUM THEN
8377 	      IF l_db_det_rec.customer_product_id  IS NOT NULL AND
8378 	         l_item_changed = 'Y' AND
8379 	         x_charges_detail_rec.line_category_code = 'RETURN' AND
8380 	         l_src_reference_reqd_flag = 'Y' AND
8381 	         l_comms_trackable_flag = 'Y' THEN
8382 
8383 	         --check if instance is for the same inventory
8384 	          l_valid_check := IS_INSTANCE_FOR_INVENTORY(
8385 	                                     p_instance_id   => p_charges_detail_rec.customer_product_id,
8386 	                                     p_inv_id        => x_charges_detail_rec.inventory_item_id_in,
8387 	                                     x_msg_data      => l_msg_data,
8388 	                                     x_msg_count     => l_msg_count,
8389 	                                     x_return_status => l_return_status);
8390 
8391 	          IF l_return_status = G_RET_STS_UNEXP_ERROR THEN
8392 	            RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
8393 	          ELSIF l_return_status = G_RET_STS_ERROR THEN
8394 	            RAISE FND_API.G_EXC_ERROR;
8395 	          END IF;
8396 
8397 	        IF l_valid_check <> 'Y' THEN
8398 
8399 	            FND_MESSAGE.SET_NAME('CS', 'CS_CHG_INVALID_IB_INSTANCE_INV');
8400 	            FND_MESSAGE.Set_Token('INVENTORY_ITEM_ID', p_charges_detail_rec.inventory_item_id_in);
8401 	            FND_MESSAGE.Set_Token('INSTANCE_ID', p_charges_detail_rec.customer_product_id);
8402 	            FND_MSG_PUB.Add;
8403 	            RAISE FND_API.G_EXC_ERROR;
8404 
8405 	        ELSE
8406 	          l_valid_check := IS_INSTANCE_VALID(p_instance_id   => p_charges_detail_rec.customer_product_id,
8407 	                               p_party_id      => x_charges_detail_rec.sold_to_party_id,
8408 	                               x_msg_data      => l_msg_data,
8409 	                               x_msg_count     => l_msg_count,
8410 	                               x_return_status => l_return_status);
8411 
8412 	              IF l_return_status = G_RET_STS_UNEXP_ERROR THEN
8413 	                RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
8414 	              ELSIF l_return_status = G_RET_STS_ERROR THEN
8415 	                RAISE FND_API.G_EXC_ERROR;
8416 	              END IF;
8417 
8418 	--taklam
8419 	          IF l_valid_check <> 'Y' THEN
8420 	             --Check if Service activity has 'change owner flag' set to 'N'
8421 	             --(See the csi_ib_txn_types table for the flag value)
8422 	             --'change owner flag'
8423 
8424 	             OPEN C_SRC_CHANGE_OWNER(p_charges_detail_rec.txn_billing_type_id);
8425 	             FETCH C_SRC_CHANGE_OWNER INTO l_src_change_owner;
8426 	             CLOSE C_SRC_CHANGE_OWNER;
8427 
8428 	             If (l_src_change_owner = 'N') or (l_src_change_owner is null) THEN
8429 	               --Pass the internal_party_id to the existing "IS_INSTANCE_VALID" method.
8430 	               --select internal_party_id from csi_install_parameters,
8431 	               SELECT internal_party_id into l_internal_party_id
8432 	               FROM csi_install_parameters;
8433 
8434 	               l_valid_check := IS_INSTANCE_VALID( p_instance_id   => p_charges_detail_rec.customer_product_id,
8435 	                                                   p_party_id      => l_internal_party_id,
8436 	                                                   x_msg_data      => l_msg_data,
8437 	                                                   x_msg_count     => l_msg_count,
8438 	                                                   x_return_status => l_return_status);
8439 	               IF l_return_status = G_RET_STS_UNEXP_ERROR THEN
8440 	                 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
8441 	               ELSIF l_return_status = G_RET_STS_ERROR THEN
8442 	                 RAISE FND_API.G_EXC_ERROR;
8443 	               END IF;
8444 	             End if;
8445 	          End if;
8446 
8447 
8448 	          IF l_valid_check <> 'Y' THEN
8449 
8450 	               FND_MESSAGE.SET_NAME ('CS', 'CS_CHG_INVALID_INSTANCE_RMA_PT');
8451 	               FND_MSG_PUB.Add;
8452 	               RAISE FND_API.G_EXC_ERROR;
8453 	--taklam
8454 	          ELSE
8455 	            --assign the customer product id to out record
8456 	            x_charges_detail_rec.customer_product_id := p_charges_detail_rec.customer_product_id;
8457 	            --DBMS_OUTPUT.PUT_LINE('Cust prod id '||x_charges_detail_rec.customer_product_id);
8458 	          END IF;
8459 	        END IF;
8460 	     ELSE
8461 	      --assign the values from the database
8462 	      x_charges_detail_rec.customer_product_id := l_db_det_rec.customer_product_id;
8463 	    END IF;
8464 
8465     -- check to see if its a serialized item
8466     -- Added for Bug # 4073602
8467     IF l_serial_control_flag = 'Y' THEN
8468         IF p_charges_detail_rec.serial_number IS NULL AND
8469            x_charges_detail_rec.customer_product_id IS NOT NULL THEN
8470           -- no error raised
8471           -- Fix bug#5125934
8472             OPEN c_serial_number(p_charges_detail_rec.customer_product_id);
8473             FETCH c_serial_number
8474             INTO  l_serial_number;
8475             CLOSE c_serial_number;
8476 
8477           -- x_charges_detail_rec.serial_number := p_charges_detail_rec.serial_number;
8478           x_charges_detail_rec.serial_number := l_serial_number;
8479 
8480         ELSIF p_charges_detail_rec.serial_number = FND_API.G_MISS_CHAR THEN
8481           -- Remove serial_number validation. Fix bug#5176423
8482           --validate the serial number
8483           /* l_valid_check := IS_INSTANCE_SERIAL_VALID( p_instance_id   => x_charges_detail_rec.customer_product_id
8484                                                     ,p_serial_number => l_db_det_rec.serial_number
8485                                                     ,x_msg_data      => l_msg_data
8486                                                     ,x_msg_count     => l_msg_count
8487                                                     ,x_return_status => l_return_status);
8488 
8489           IF l_return_status = G_RET_STS_UNEXP_ERROR THEN
8490             RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
8491           ELSIF l_return_status = G_RET_STS_ERROR THEN
8492             RAISE FND_API.G_EXC_ERROR;
8493           END IF;
8494 
8495           IF l_valid_check <> 'Y' THEN
8496             FND_MESSAGE.SET_NAME('CS', 'CS_CHG_INVALID_SERIAL_NUMBER');
8497             FND_MESSAGE.Set_Token('INSTANCE_ID', p_charges_detail_rec.customer_product_id);
8498             FND_MESSAGE.Set_Token('SERIAL_NUMBER', p_charges_detail_rec.serial_number);
8499             FND_MSG_PUB.Add;
8500             RAISE FND_API.G_EXC_ERROR;
8501           ELSE */
8502 
8503             --assign the customer product id to out record
8504             -- x_charges_detail_rec.serial_number := p_charges_detail_rec.serial_number;
8505             x_charges_detail_rec.serial_number := l_db_det_rec.serial_number;
8506 
8507           -- END IF;
8508         -- Added for bug fix:5259686
8509         ELSIF p_charges_detail_rec.serial_number IS NOT NULL AND
8510               x_charges_detail_rec.customer_product_id IS NOT NULL THEN
8511 
8512           --serial number is neither null nor fnd_api.g_miss
8513           -- value is passed
8514           --validate the serial number
8515           x_charges_detail_rec.serial_number := p_charges_detail_rec.serial_number;    --5887316
8516           /*
8517           l_valid_check := IS_INSTANCE_SERIAL_VALID( p_instance_id   => x_charges_detail_rec.customer_product_id
8518                                                     ,p_serial_number => p_charges_detail_rec.serial_number
8519                                                     ,x_msg_data      => l_msg_data
8520                                                     ,x_msg_count     => l_msg_count
8521                                                     ,x_return_status => l_return_status);
8522 
8523 
8524           IF l_return_status = G_RET_STS_UNEXP_ERROR THEN
8525             RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
8526           ELSIF l_return_status = G_RET_STS_ERROR THEN
8527             RAISE FND_API.G_EXC_ERROR;
8528           END IF;
8529 
8530           IF l_valid_check <> 'Y' THEN
8531             FND_MESSAGE.SET_NAME('CS', 'CS_CHG_INVALID_SERIAL_NUMBER');
8532             FND_MESSAGE.Set_Token('INSTANCE_ID', p_charges_detail_rec.customer_product_id);
8533             FND_MESSAGE.Set_Token('SERIAL_NUMBER', p_charges_detail_rec.serial_number);
8534             FND_MSG_PUB.Add;
8535             RAISE FND_API.G_EXC_ERROR;
8536           ELSE
8537             --assign the serial_number to out record
8538             x_charges_detail_rec.serial_number := p_charges_detail_rec.serial_number;
8539           END IF;
8540 	  */ --5887316
8541         END IF;
8542       ELSE
8543         --customerproduct  id is null
8544         x_charges_detail_rec.serial_number := l_db_det_rec.serial_number ;
8545       END IF;
8546     END IF;
8547 
8548   -- If null is passed to customer_product_id
8549 
8550     IF p_charges_detail_rec.customer_product_id IS NULL THEN
8551 
8552       --item instance validation
8553       --fixed Bug # 3362130 - added l_comms_trackable_flag = 'Y' condition
8554       IF (l_src_reference_reqd_flag = 'Y') AND
8555          (l_line_order_category_code = 'RETURN') AND
8556          (l_comms_trackable_flag = 'Y') THEN
8557         --DBMS_OUTPUT.PUT_LINE('Customer product id null');
8558 
8559         --RAISE FND_API.G_EXC_ERROR;
8560         --null;
8561         FND_MESSAGE.Set_Name('CS', 'CS_API_CHG_IB_INSTANCE_MISSING');
8562         FND_MESSAGE.Set_Token('API_NAME', p_api_name);
8563         FND_MSG_PUB.Add;
8564         RAISE FND_API.G_EXC_ERROR;
8565 
8566       --fixed Bug # 3362130 - added l_comms_trackable_flag = 'Y' condition
8567     ELSIF (l_update_ib_flag = 'Y') AND
8568         (l_non_src_reference_reqd_flag = 'Y') AND
8569         (l_line_order_category_code = 'ORDER') AND
8570         (l_comms_trackable_flag = 'Y') THEN
8571         --DBMS_OUTPUT.PUT_LINE('Customer product id null');
8572         --RAISE FND_API.G_EXC_ERROR;
8573         --null;
8574         FND_MESSAGE.Set_Name('CS', 'CS_API_CHG_IB_INSTANCE_MISSING');
8575         FND_MESSAGE.Set_Token('API_NAME', p_api_name);
8576         FND_MSG_PUB.Add;
8577         RAISE FND_API.G_EXC_ERROR;
8578       ELSE
8579         x_charges_detail_rec.customer_product_id := NULL;
8580       END IF;
8581    END IF;
8582 
8583    -- If new CP is passed
8584    -- Fix for Bug # 3325686
8585    --IF l_db_det_rec.customer_product_id  IS NOT NULL AND
8586 /*cnemalik bug 3913714
8587  IN 11.5.9 customer_product_id is mandatory for certain setups. But in 11.5.10, for the same setups it is optional*/
8588 
8589      IF  p_charges_detail_rec.customer_product_id <> FND_API.G_MISS_NUM AND
8590        p_charges_detail_rec.customer_product_id IS NOT NULL AND
8591        x_charges_detail_rec.line_category_code = 'RETURN' THEN
8592 
8593          -- Added the FND Messages for Bug# 5141369
8594          IF (l_comms_trackable_flag = 'N') THEN
8595           FND_MESSAGE.SET_NAME('CS', 'CS_CHG_INVALID_INST_AND_INV');
8596           FND_MESSAGE.Set_Token('INSTANCE_ID', p_charges_detail_rec.customer_product_id);
8597           FND_MESSAGE.Set_Token('INVENTORY_ITEM_ID', p_charges_detail_rec.inventory_item_id_in);
8598           FND_MSG_PUB.Add;
8599           RAISE FND_API.G_EXC_ERROR;
8600 
8601          ELSE
8602 
8603           --check if instance is for the same inventory
8604           l_valid_check := IS_INSTANCE_FOR_INVENTORY(
8605                                      p_instance_id   => p_charges_detail_rec.customer_product_id,
8606                                      p_inv_id        => x_charges_detail_rec.inventory_item_id_in,
8607                                      x_msg_data      => l_msg_data,
8608                                      x_msg_count     => l_msg_count,
8609                                      x_return_status => l_return_status);
8610 
8611           IF l_return_status = G_RET_STS_UNEXP_ERROR THEN
8612             RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
8613           ELSIF l_return_status = G_RET_STS_ERROR THEN
8614             RAISE FND_API.G_EXC_ERROR;
8615           END IF;
8616 
8617           END IF;
8618 
8619         IF l_valid_check <> 'Y' THEN
8620 
8621             FND_MESSAGE.SET_NAME('CS', 'CS_CHG_INVALID_IB_INSTANCE_INV');
8622             FND_MESSAGE.Set_Token('INVENTORY_ITEM_ID', p_charges_detail_rec.inventory_item_id_in);
8623             FND_MESSAGE.Set_Token('INSTANCE_ID', p_charges_detail_rec.customer_product_id);
8624             FND_MSG_PUB.Add;
8625             RAISE FND_API.G_EXC_ERROR;
8626 
8627         ELSE
8628           l_valid_check := IS_INSTANCE_VALID(p_instance_id   => p_charges_detail_rec.customer_product_id,
8629                                p_party_id      => x_charges_detail_rec.sold_to_party_id,
8630                                x_msg_data      => l_msg_data,
8631                                x_msg_count     => l_msg_count,
8632                                x_return_status => l_return_status);
8633 
8634               IF l_return_status = G_RET_STS_UNEXP_ERROR THEN
8635                 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
8636               ELSIF l_return_status = G_RET_STS_ERROR THEN
8637                 RAISE FND_API.G_EXC_ERROR;
8638               END IF;
8639 
8640    --taklam
8641              IF l_valid_check <> 'Y' THEN
8642                 --Check if Service activity has 'change owner flag' set to 'N'
8643                 --(See the csi_ib_txn_types table for the flag value)
8644                 --'change owner flag'
8645 
8646                 OPEN C_SRC_CHANGE_OWNER(p_charges_detail_rec.txn_billing_type_id);
8647                 FETCH C_SRC_CHANGE_OWNER INTO l_src_change_owner;
8648                 CLOSE C_SRC_CHANGE_OWNER;
8649 
8650                 If (l_src_change_owner = 'N') or (l_src_change_owner is null) THEN
8651                   --Pass the internal_party_id to the existing "IS_INSTANCE_VALID" method.
8652                   --select internal_party_id from csi_install_parameters,
8653                   SELECT internal_party_id into l_internal_party_id
8654                   FROM csi_install_parameters;
8655 
8656                   l_valid_check := IS_INSTANCE_VALID( p_instance_id   => p_charges_detail_rec.customer_product_id,
8657                                                       p_party_id      => l_internal_party_id,
8658                                                       x_msg_data      => l_msg_data,
8659                                                       x_msg_count     => l_msg_count,
8660                                                       x_return_status => l_return_status);
8661                   IF l_return_status = G_RET_STS_UNEXP_ERROR THEN
8662                     RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
8663                   ELSIF l_return_status = G_RET_STS_ERROR THEN
8664                     RAISE FND_API.G_EXC_ERROR;
8665                   END IF;
8666                 End if;
8667              End if;
8668 
8669 
8670             IF l_valid_check <> 'Y' THEN
8671 
8672                   FND_MESSAGE.SET_NAME ('CS', 'CS_CHG_INVALID_INSTANCE_RMA_PT');
8673                   FND_MSG_PUB.Add;
8674                   RAISE FND_API.G_EXC_ERROR;
8675    --taklam
8676             ELSE
8677               --assign the customer product id to out record
8678               x_charges_detail_rec.customer_product_id := p_charges_detail_rec.customer_product_id;
8679               --DBMS_OUTPUT.PUT_LINE('Cust prod id '||x_charges_detail_rec.customer_product_id);
8680             END IF;
8681 
8682            -- check to see if its a serialized item
8683            -- Added for Bug # 4073602
8684            IF l_serial_control_flag = 'Y' THEN
8685              IF p_charges_detail_rec.serial_number IS NULL THEN
8686                -- no error raised
8687                -- Fix bug#5125934
8688                OPEN c_serial_number(p_charges_detail_rec.customer_product_id);
8689                FETCH c_serial_number
8690                INTO  l_serial_number;
8691                CLOSE c_serial_number;
8692 
8693                -- x_charges_detail_rec.serial_number := p_charges_detail_rec.serial_number;
8694                -- x_charges_detail_rec.serial_number := l_serial_number;
8695 
8696              ELSIF p_charges_detail_rec.serial_number = FND_API.G_MISS_CHAR THEN
8697 
8698                --validate the serial number
8699                x_charges_detail_rec.serial_number := p_charges_detail_rec.serial_number; --5887316
8700 	       /*
8701 	       l_valid_check := IS_INSTANCE_SERIAL_VALID( p_instance_id   => x_charges_detail_rec.customer_product_id
8702                                                     ,p_serial_number => l_db_det_rec.serial_number
8703                                                     ,x_msg_data      => l_msg_data
8704                                                     ,x_msg_count     => l_msg_count
8705                                                     ,x_return_status => l_return_status);
8706 
8707                IF l_return_status = G_RET_STS_UNEXP_ERROR THEN
8708                  RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
8709                ELSIF l_return_status = G_RET_STS_ERROR THEN
8710                  RAISE FND_API.G_EXC_ERROR;
8711                END IF;
8712 
8713                IF l_valid_check <> 'Y' THEN
8714                  FND_MESSAGE.SET_NAME('CS', 'CS_CHG_INVALID_SERIAL_NUMBER');
8715                  FND_MESSAGE.Set_Token('INSTANCE_ID', p_charges_detail_rec.customer_product_id);
8716                  FND_MESSAGE.Set_Token('SERIAL_NUMBER', p_charges_detail_rec.serial_number);
8717                  FND_MSG_PUB.Add;
8718                  RAISE FND_API.G_EXC_ERROR;
8719                ELSE
8720                  --assign the customer product id to out record
8721                  x_charges_detail_rec.serial_number := p_charges_detail_rec.serial_number;
8722                END IF;
8723                */--5887316
8724              ELSE
8725 
8726                --serial number is neither null nor fnd_api.g_miss
8727                -- value is passed
8728                --validate the serial number
8729                x_charges_detail_rec.serial_number := p_charges_detail_rec.serial_number; --5887316
8730 	       /*
8731 	       l_valid_check := IS_INSTANCE_SERIAL_VALID( p_instance_id   => x_charges_detail_rec.customer_product_id
8732                                                     ,p_serial_number => p_charges_detail_rec.serial_number
8733                                                     ,x_msg_data      => l_msg_data
8734                                                     ,x_msg_count     => l_msg_count
8735                                                     ,x_return_status => l_return_status);
8736                IF l_return_status = G_RET_STS_UNEXP_ERROR THEN
8737                  RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
8738                ELSIF l_return_status = G_RET_STS_ERROR THEN
8739                  RAISE FND_API.G_EXC_ERROR;
8740                END IF;
8741 
8742                IF l_valid_check <> 'Y' THEN
8743                  FND_MESSAGE.SET_NAME('CS', 'CS_CHG_INVALID_SERIAL_NUMBER');
8744                  FND_MESSAGE.Set_Token('INSTANCE_ID', p_charges_detail_rec.customer_product_id);
8745                  FND_MESSAGE.Set_Token('SERIAL_NUMBER', p_charges_detail_rec.serial_number);
8746                  FND_MSG_PUB.Add;
8747                  RAISE FND_API.G_EXC_ERROR;
8748                ELSE
8749                  --assign the customer product id to out record
8750                  x_charges_detail_rec.serial_number := p_charges_detail_rec.serial_number;
8751                END IF;
8752                */ --5887316
8753 	     END IF;
8754            ELSE
8755              --customerproduct  id is null
8756              x_charges_detail_rec.serial_number := l_db_det_rec.serial_number ;
8757            END IF;
8758         END IF;
8759 
8760 
8761       --Fix for Bug # 3325686
8762       ELSIF
8763          p_charges_detail_rec.customer_product_id <> FND_API.G_MISS_NUM AND
8764          p_charges_detail_rec.customer_product_id IS NOT NULL AND
8765          x_charges_detail_rec.line_category_code = 'ORDER' THEN
8766 
8767           -- Added the FND Messages for Bug# 5141369
8768          IF (l_comms_trackable_flag = 'N') THEN
8769           FND_MESSAGE.SET_NAME('CS', 'CS_CHG_INVALID_INST_AND_INV');
8770           FND_MESSAGE.Set_Token('INSTANCE_ID', p_charges_detail_rec.customer_product_id);
8771           FND_MESSAGE.Set_Token('INVENTORY_ITEM_ID', p_charges_detail_rec.inventory_item_id_in);
8772           FND_MSG_PUB.Add;
8773           RAISE FND_API.G_EXC_ERROR;
8774          ELSE
8775          --Check if instance is valid for the party
8776          l_valid_check := IS_INSTANCE_VALID(p_instance_id   => p_charges_detail_rec.customer_product_id,
8777                                p_party_id      => x_charges_detail_rec.sold_to_party_id,
8778                                x_msg_data      => l_msg_data,
8779                                x_msg_count     => l_msg_count,
8780                                x_return_status => l_return_status);
8781 
8782               IF l_return_status = G_RET_STS_UNEXP_ERROR THEN
8783                 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
8784               ELSIF l_return_status = G_RET_STS_ERROR THEN
8785                 RAISE FND_API.G_EXC_ERROR;
8786               END IF;
8787          END IF;
8788 
8789           IF l_valid_check <> 'Y' THEN
8790 
8791               FND_MESSAGE.SET_NAME('CS', 'CS_CHG_INVALID_IB_INSTANCE_PTY');
8792               FND_MESSAGE.Set_Token('PARTY_ID', x_charges_detail_rec.sold_to_party_id);
8793               FND_MESSAGE.Set_Token('INSTANCE_ID', p_charges_detail_rec.customer_product_id);
8794               FND_MSG_PUB.Add;
8795               RAISE FND_API.G_EXC_ERROR;
8796 
8797           ELSE
8798             --assign the customer product id to out record
8799             x_charges_detail_rec.customer_product_id := p_charges_detail_rec.customer_product_id;
8800             --DBMS_OUTPUT.PUT_LINE('Cust prod id '||x_charges_detail_rec.customer_product_id);
8801           END IF;
8802 
8803           -- check to see if its a serialized item
8804           -- Added for Bug # 4073602
8805           IF l_serial_control_flag = 'Y' THEN
8806             IF p_charges_detail_rec.serial_number IS NULL THEN
8807               -- Fix bug#5125934
8808                OPEN c_serial_number(p_charges_detail_rec.customer_product_id);
8809                FETCH c_serial_number
8810                INTO  l_serial_number;
8811                CLOSE c_serial_number;
8812 
8813                -- x_charges_detail_rec.serial_number := p_charges_detail_rec.serial_number;
8814                x_charges_detail_rec.serial_number := l_serial_number;
8815 
8816             ELSIF p_charges_detail_rec.serial_number = FND_API.G_MISS_CHAR THEN
8817               --validate the serial number
8818               -- Added for Bug # 5471849
8819 	             IF l_db_det_rec.serial_number IS NOT NULL THEN
8820 	                -- dbms_output.put_line('Serial number test bug:5471849');
8821 	                x_charges_detail_rec.serial_number := p_charges_detail_rec.serial_number;  --5887316
8822 			/*
8823 			l_valid_check := IS_INSTANCE_SERIAL_VALID( p_instance_id   => x_charges_detail_rec.customer_product_id
8824 	                                                    ,p_serial_number => l_db_det_rec.serial_number
8825 	                                                    ,x_msg_data      => l_msg_data
8826 	                                                    ,x_msg_count     => l_msg_count
8827 	                                                    ,x_return_status => l_return_status);
8828 
8829 	                 IF l_return_status = G_RET_STS_UNEXP_ERROR THEN
8830 	                 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
8831 	                 ELSIF l_return_status = G_RET_STS_ERROR THEN
8832 	                 RAISE FND_API.G_EXC_ERROR;
8833 	                 END IF;
8834 
8835 	                 IF l_valid_check <> 'Y' THEN
8836 	                 FND_MESSAGE.SET_NAME('CS', 'CS_CHG_INVALID_SERIAL_NUMBER');
8837 	                 FND_MESSAGE.Set_Token('INSTANCE_ID', p_charges_detail_rec.customer_product_id);
8838 	                 FND_MESSAGE.Set_Token('SERIAL_NUMBER', p_charges_detail_rec.serial_number);
8839 	                 FND_MSG_PUB.Add;
8840 	                 RAISE FND_API.G_EXC_ERROR;
8841 	                 ELSE
8842 	                 --assign the customer product id to out record
8843 	                 x_charges_detail_rec.serial_number := p_charges_detail_rec.serial_number;
8844 	                 END IF;
8845                         */ --5887316
8846 	              ELSE
8847 	                -- Added for the bug:5471849
8848 	                OPEN c_serial_number(p_charges_detail_rec.customer_product_id);
8849 	                FETCH c_serial_number
8850 	                INTO  l_serial_number;
8851 	                CLOSE c_serial_number;
8852 
8853 	                -- x_charges_detail_rec.serial_number := p_charges_detail_rec.serial_number;
8854 	                 x_charges_detail_rec.serial_number := l_serial_number;
8855 	              END IF;
8856 
8857            ELSE
8858 
8859               --serial number is neither null nor fnd_api.g_miss
8860               -- value is passed
8861               --validate the serial number
8862               x_charges_detail_rec.serial_number := p_charges_detail_rec.serial_number; --5887316
8863 	      /*
8864 	      l_valid_check := IS_INSTANCE_SERIAL_VALID( p_instance_id   => x_charges_detail_rec.customer_product_id
8865                                                     ,p_serial_number => p_charges_detail_rec.serial_number
8866                                                     ,x_msg_data      => l_msg_data
8867                                                     ,x_msg_count     => l_msg_count
8868                                                     ,x_return_status => l_return_status);
8869 
8870               IF l_return_status = G_RET_STS_UNEXP_ERROR THEN
8871                 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
8872               ELSIF l_return_status = G_RET_STS_ERROR THEN
8873                 RAISE FND_API.G_EXC_ERROR;
8874               END IF;
8875 
8876               IF l_valid_check <> 'Y' THEN
8877                 FND_MESSAGE.SET_NAME('CS', 'CS_CHG_INVALID_SERIAL_NUMBER');
8878                 FND_MESSAGE.Set_Token('INSTANCE_ID', p_charges_detail_rec.customer_product_id);
8879                 FND_MESSAGE.Set_Token('SERIAL_NUMBER', p_charges_detail_rec.serial_number);
8880                 FND_MSG_PUB.Add;
8881                 RAISE FND_API.G_EXC_ERROR;
8882               ELSE
8883                 --assign the customer product id to out record
8884                 x_charges_detail_rec.serial_number := p_charges_detail_rec.serial_number;
8885               END IF;
8886               */ --5887316
8887 	    END IF;
8888 	  ELSE
8889             x_charges_detail_rec.serial_number := p_charges_detail_rec.serial_number;
8890           END IF; --serial number check
8891 
8892       ELSE
8893           --customerproduct  id is null
8894           x_charges_detail_rec.serial_number := l_db_det_rec.serial_number ;
8895       END IF;
8896 
8897 
8898     -- Checking for source and RETURN transactions to update installed_cp_return_by_date
8899     -- Fix for Bug # 3325686
8900     --fixed Bug # 3362130 - added l_comms_trackable_flag = 'Y' condition
8901     IF l_src_reference_reqd_flag = 'Y' AND
8902        l_src_return_reqd_flag = 'Y' AND
8903        l_line_order_category_code = 'RETURN' AND
8904        l_comms_trackable_flag = 'Y' THEN
8905        IF p_charges_detail_rec.installed_cp_return_by_date IS NULL THEN
8906          --RAISE FND_API.G_EXC_ERROR;
8907          --null;
8908          FND_MESSAGE.SET_NAME('CS', 'CS_CHG_INST_CP_RETURN_BY_DATE');
8909          FND_MESSAGE.Set_Token('INST_CP_RTN_BY_DATE', p_charges_detail_rec.installed_cp_return_by_date);
8910          FND_MSG_PUB.Add;
8911          RAISE FND_API.G_EXC_ERROR;
8912        ELSIF p_charges_detail_rec.installed_cp_return_by_date <> FND_API.G_MISS_DATE THEN
8913          --assign to out record
8914          x_charges_detail_rec.installed_cp_return_by_date := p_charges_detail_rec.installed_cp_return_by_date;
8915        ELSE
8916          x_charges_detail_rec.installed_cp_return_by_date := l_db_det_rec.installed_cp_return_by_date;
8917        END IF;
8918       --ELSE
8919       -- the flag is 'N'
8920       -- ignore the installed_cp_return_by_date
8921       --x_charges_detail_rec.installed_cp_return_by_date := NULL;
8922     -- if the flags are not set, check for g_miss_date
8923     -- Modified for the return_by_date fix. Bug:5136853
8924     ELSIF p_charges_detail_rec.installed_cp_return_by_date <> FND_API.G_MISS_DATE THEN
8925       --assign to out record
8926       x_charges_detail_rec.installed_cp_return_by_date := p_charges_detail_rec.installed_cp_return_by_date;
8927     ELSE
8928       x_charges_detail_rec.installed_cp_return_by_date := l_db_det_rec.installed_cp_return_by_date;
8929     END IF;
8930 
8931     /***** RETURN BY DATE FIX FOR ORDER TRANSACTIONS *****/
8932     --
8933     -- Modified for the return_by_date fix. Bug:5136853
8934     -- If the instance is not null and the non_src retur_reqd flag is 'Y' ,
8935     -- then installed_cp_return_by_date column should have a value.
8936     -- Likewise if the instance is null and the item is trackable and the
8937     -- src_return_reqd field is 'y', the the new_cp_return_by_date should have a value.
8938     -- Otherwise raise appropriate errors. This validation is for 'ORDER'
8939 
8940     /*** non source flag checked for the 'ORDER' ***/
8941      IF l_non_src_reference_reqd_flag = 'Y' AND
8942         l_non_src_return_reqd_flag = 'Y' AND
8943         l_line_order_category_code = 'ORDER' AND
8944         l_comms_trackable_flag = 'Y' AND
8945         p_charges_detail_rec.customer_product_id IS NOT NULL THEN
8946        IF p_charges_detail_rec.installed_cp_return_by_date IS NULL THEN
8947          FND_MESSAGE.SET_NAME('CS', 'CS_CHG_INSTALLED_CP_RETURN_BY_DATE');
8948          FND_MESSAGE.Set_Token('INSTALLED_CP_RTN_BY_DATE', p_charges_detail_rec.installed_cp_return_by_date);
8949          FND_MSG_PUB.Add;
8950          RAISE FND_API.G_EXC_ERROR;
8951        ELSIF  p_charges_detail_rec.installed_cp_return_by_date  <> FND_API.G_MISS_DATE THEN
8952          x_charges_detail_rec.installed_cp_return_by_date := p_charges_detail_rec.installed_cp_return_by_date;
8953        ELSE
8954          x_charges_detail_rec.installed_cp_return_by_date := l_db_det_rec.installed_cp_return_by_date;
8955        END IF;
8956      -- if the flags are not set, check for g_miss_date
8957      ELSIF p_charges_detail_rec.installed_cp_return_by_date <> FND_API.G_MISS_DATE THEN
8958        -- Assign whatever value is passed in the parameter.
8959        x_charges_detail_rec.installed_cp_return_by_date := p_charges_detail_rec.installed_cp_return_by_date;
8960      ELSE
8961        x_charges_detail_rec.installed_cp_return_by_date := l_db_det_rec.installed_cp_return_by_date;
8962      END IF;
8963 
8964     /*** Source Flag checked for the 'Order' ***/
8965     IF  l_src_reference_reqd_flag = 'Y' AND
8966         l_src_return_reqd_flag = 'Y' AND
8967         l_line_order_category_code = 'ORDER' AND
8968         l_comms_trackable_flag = 'Y' AND
8969         p_charges_detail_rec.customer_product_id IS NULL THEN
8970       IF p_charges_detail_rec.new_cp_return_by_date IS NULL THEN
8971         FND_MESSAGE.SET_NAME('CS', 'CS_CHG_NEW_CP_RETURN_BY_DATE');
8972         FND_MESSAGE.Set_Token('NEW_CP_RTN_BY_DATE', p_charges_detail_rec.new_cp_return_by_date);
8973         FND_MSG_PUB.Add;
8974         RAISE FND_API.G_EXC_ERROR;
8975       ELSIF p_charges_detail_rec.new_cp_return_by_date <> FND_API.G_MISS_DATE THEN
8976         -- Assign whatever value is passed in the parameter.
8977         x_charges_detail_rec.new_cp_return_by_date := p_charges_detail_rec.new_cp_return_by_date;
8978       ELSE
8979         x_charges_detail_rec.new_cp_return_by_date := l_db_det_rec.new_cp_return_by_date;
8980       END IF;
8981     ELSIF p_charges_detail_rec.new_cp_return_by_date <> FND_API.G_MISS_DATE THEN
8982       -- Assign whatever value is passed in the parameter.
8983       x_charges_detail_rec.new_cp_return_by_date := p_charges_detail_rec.new_cp_return_by_date;
8984     ELSE
8985       x_charges_detail_rec.new_cp_return_by_date := l_db_det_rec.new_cp_return_by_date;
8986     END IF;
8987 
8988 
8989     /**** -- Depot Loaner fix - Bug#4586140
8990     Open c_get_depot_txns_details(p_charges_detail_rec.estimate_detail_id);
8991     Fetch c_get_depot_txns_details into l_action_code;
8992     Close c_get_depot_txns_details;
8993 
8994     -- Checking for non-source and ORDER transactions to update new_cp_return_by_date
8995     -- Fix for Bug # 3325686
8996     --fixed Bug # 3362130 - added l_comms_trackable_flag = 'Y' condition
8997     IF l_non_src_reference_reqd_flag = 'Y' AND
8998        l_non_src_return_reqd  = 'Y' AND
8999        l_line_order_category_code = 'ORDER' AND
9000        l_comms_trackable_flag = 'Y' THEN
9001       IF p_charges_detail_rec.new_cp_return_by_date IS NULL THEN
9002         --RAISE FND_API.G_EXC_ERROR;
9003         --null;
9004         FND_MESSAGE.SET_NAME('CS', 'CS_CHG_INST_CP_RETURN_BY_DATE');
9005         FND_MESSAGE.Set_Token('INST_CP_RTN_BY_DATE', p_charges_detail_rec.installed_cp_return_by_date);
9006         FND_MSG_PUB.Add;
9007         RAISE FND_API.G_EXC_ERROR;
9008       ELSIF p_charges_detail_rec.new_cp_return_by_date <> FND_API.G_MISS_DATE THEN
9009             --assign to out record
9010             x_charges_detail_rec.new_cp_return_by_date := p_charges_detail_rec.new_cp_return_by_date;
9011       ELSE
9012             x_charges_detail_rec.new_cp_return_by_date := l_db_det_rec.new_cp_return_by_date;
9013       END IF;
9014     -- Depot Loaner fix - Bug#4586140
9015     ELSIF ( l_line_order_category_code = 'ORDER' AND
9016             l_comms_trackable_flag = 'Y' AND
9017             l_src_return_reqd_flag = 'Y' AND
9018             l_action_code = 'LOANER') THEN
9019 
9020         x_charges_detail_rec.new_cp_return_by_date := p_charges_detail_rec.new_cp_return_by_date;
9021     ELSE
9022       -- the flag is 'N'
9023       -- ignore the installed_cp_return_by_date
9024       x_charges_detail_rec.new_cp_return_by_date := NULL;
9025     END IF;  ****/
9026 END IF;
9027 --DBMS_OUTPUT.PUT_LINE('Item Instance Valid');
9028 
9029 -- 12.1.3 Charges Logistics Project
9030 IF p_validation_mode = 'I' THEN
9031 
9032   IF p_charges_detail_rec.parent_instance_id <> FND_API.G_MISS_NUM AND
9033      p_charges_detail_rec.parent_instance_id IS NOT NULL and x_charges_detail_rec.customer_product_id is not NUll
9034      AND x_charges_detail_rec.line_category_code = 'ORDER'
9035        AND x_charges_detail_rec.billing_flag = 'M' THEN
9036 
9037     l_valid_check := IS_PARENT_INSTANCE_VALID(p_cust_prod_id     => x_charges_detail_rec.customer_product_id,
9038 					      p_parent_inst_id   => p_charges_detail_rec.parent_instance_id,
9039                                               x_msg_data         => l_msg_data,
9040                                               x_msg_count        => l_msg_count,
9041                                               x_return_status    => l_return_status);
9042 
9043       IF l_return_status = G_RET_STS_UNEXP_ERROR THEN
9044         RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
9045       ELSIF l_return_status = G_RET_STS_ERROR THEN
9046         RAISE FND_API.G_EXC_ERROR;
9047       END IF;
9048 
9049       IF l_valid_check <> 'Y' THEN
9050         FND_MESSAGE.Set_Name('CS', 'CS_CHG_INVALID_PARENT_INST');
9051         FND_MESSAGE.Set_Token('PARENT_INSTANCE_ID', p_charges_detail_rec.parent_instance_id);
9052         FND_MSG_PUB.Add;
9053         RAISE FND_API.G_EXC_ERROR;
9054       Else
9055          x_charges_detail_rec.parent_instance_id := p_charges_detail_rec.parent_instance_id;
9056       END IF;
9057   Elsif p_charges_detail_rec.parent_instance_id <> FND_API.G_MISS_NUM AND
9058      p_charges_detail_rec.parent_instance_id IS NOT NULL and x_charges_detail_rec.customer_product_id is NUll
9059      AND x_charges_detail_rec.line_category_code = 'ORDER'
9060      AND x_charges_detail_rec.billing_flag = 'M' THEN
9061 
9062      Open sr_instance(p_charges_detail_rec.incident_id);
9063      Fetch sr_instance into l_sr_instance_id, l_sr_inventory_item_id;
9064      Close sr_instance;
9065 
9066      If l_sr_instance_id is not null AND l_sr_instance_id = p_charges_detail_rec.parent_instance_id
9067      AND l_sr_inventory_item_id <> x_charges_detail_rec.inventory_item_id_in Then
9068         x_charges_detail_rec.parent_instance_id := p_charges_detail_rec.parent_instance_id;
9069      Else
9070         FND_MESSAGE.Set_Name('CS', 'CS_CHG_INVALID_PARENT_INST');
9071         FND_MESSAGE.Set_Token('PARENT_INSTANCE_ID', p_charges_detail_rec.parent_instance_id);
9072         FND_MSG_PUB.Add;
9073         RAISE FND_API.G_EXC_ERROR;
9074      End If;
9075   Else
9076      x_charges_detail_rec.parent_instance_id := NULL;
9077   END IF;
9078 
9079 
9080 ELSIF p_validation_mode = 'U' THEN
9081 
9082   IF p_charges_detail_rec.parent_instance_id <> FND_API.G_MISS_NUM AND
9083      p_charges_detail_rec.parent_instance_id IS NOT NULL AND
9084      x_charges_detail_rec.customer_product_id IS NOT NULL AND x_charges_detail_rec.line_category_code = 'ORDER'
9085           AND x_charges_detail_rec.billing_flag = 'M' THEN
9086 
9087      l_valid_check := IS_PARENT_INSTANCE_VALID(p_cust_prod_id     => x_charges_detail_rec.customer_product_id,
9088 					      p_parent_inst_id   => p_charges_detail_rec.parent_instance_id,
9089                                               x_msg_data         => l_msg_data,
9090                                               x_msg_count        => l_msg_count,
9091                                               x_return_status    => l_return_status  ) ;
9092 
9093       IF l_return_status = G_RET_STS_UNEXP_ERROR THEN
9094         RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
9095       ELSIF l_return_status = G_RET_STS_ERROR THEN
9096         RAISE FND_API.G_EXC_ERROR;
9097       END IF;
9098 
9099       IF l_valid_check <> 'Y' THEN
9100         FND_MESSAGE.Set_Name('CS', 'CS_CHG_INVALID_PARENT_INST');
9101         FND_MESSAGE.Set_Token('PARENT_INSTANCE_ID', p_charges_detail_rec.parent_instance_id);
9102         FND_MSG_PUB.Add;
9103         RAISE FND_API.G_EXC_ERROR;
9104       Else
9105           x_charges_detail_rec.parent_instance_id := p_charges_detail_rec.parent_instance_id;
9106       End If;
9107 
9108   Elsif p_charges_detail_rec.parent_instance_id <> FND_API.G_MISS_NUM AND
9109      p_charges_detail_rec.parent_instance_id IS NOT NULL and x_charges_detail_rec.customer_product_id is NUll
9110      AND x_charges_detail_rec.line_category_code = 'ORDER' AND x_charges_detail_rec.billing_flag = 'M' THEN
9111 
9112      Open sr_instance(x_charges_detail_rec.incident_id); --new flow...
9113      Fetch sr_instance into l_sr_instance_id, l_sr_inventory_item_id;
9114      Close sr_instance;
9115 
9116      If l_sr_instance_id is not null AND l_sr_instance_id = p_charges_detail_rec.parent_instance_id
9117      AND l_sr_inventory_item_id <> x_charges_detail_rec.inventory_item_id_in Then
9118         x_charges_detail_rec.parent_instance_id := p_charges_detail_rec.parent_instance_id;
9119      Else
9120         FND_MESSAGE.Set_Name('CS', 'CS_CHG_INVALID_PARENT_INST');
9121         FND_MESSAGE.Set_Token('PARENT_INSTANCE_ID', p_charges_detail_rec.parent_instance_id);
9122         FND_MSG_PUB.Add;
9123         RAISE FND_API.G_EXC_ERROR;
9124      End If;
9125 
9126   ELSIF p_charges_detail_rec.parent_instance_id  = FND_API.G_MISS_NUM THEN
9127       x_charges_detail_rec.parent_instance_id := l_db_det_rec.parent_instance_id;
9128   ELSE
9129       x_charges_detail_rec.parent_instance_id := NULL;
9130   END IF;
9131 
9132 END IF;
9133 
9134 -- End of Charges Logistics Project
9135 --=====================================
9136 -- Return Reason Code Validation
9137 --=====================================
9138 --DBMS_OUTPUT.PUT_LINE('Return Reason Code Validation ...');
9139 IF p_validation_mode = 'I' THEN
9140 
9141   IF l_line_order_category_code = 'RETURN' THEN
9142     IF p_charges_detail_rec.return_reason_code IS NULL THEN
9143       --RAISE FND_API.G_EXC_ERROR;
9144       --null;
9145       FND_MESSAGE.SET_NAME('CS', 'CS_CHG_INVALID_RETURN_REASON');
9146       FND_MESSAGE.Set_Token('RETURN_REASON_CODE', p_charges_detail_rec.return_reason_code);
9147       FND_MSG_PUB.Add;
9148       RAISE FND_API.G_EXC_ERROR;
9149     ELSE
9150 
9151       --return reason code is not null
9152       --validate the return reason code
9153 
9154       l_valid_check := IS_RETURN_REASON_VALID(p_return_reason_code => p_charges_detail_rec.return_reason_code,
9155                                 x_msg_data           => l_msg_data,
9156                                 x_msg_count          => l_msg_count,
9157                                 x_return_status      => l_return_status);
9158 
9159       IF l_return_status = G_RET_STS_UNEXP_ERROR THEN
9160         RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
9161       ELSIF l_return_status = G_RET_STS_ERROR THEN
9162         RAISE FND_API.G_EXC_ERROR;
9163       END IF;
9164 
9165       IF l_valid_check <> 'Y' THEN
9166 
9167         FND_MESSAGE.SET_NAME('CS', 'CS_CHG_INVALID_RETURN_REASON');
9168         FND_MESSAGE.Set_Token('RETURN_REASON_CODE', p_charges_detail_rec.return_reason_code);
9169         FND_MSG_PUB.Add;
9170         RAISE FND_API.G_EXC_ERROR;
9171       ELSE
9172         x_charges_detail_rec.return_reason_code := p_charges_detail_rec.return_reason_code;
9173       END IF;
9174 
9175     END IF;
9176 
9177   ELSE
9178 
9179     IF l_line_order_category_code = 'ORDER' OR l_line_order_category_code IS NULL THEN
9180       IF p_charges_detail_rec.return_reason_code IS NOT NULL THEN
9181         --RAISE FND_API.G_EXC_ERROR;
9182         --null;
9183         FND_MESSAGE.SET_NAME('CS', 'CS_CHG_INVALID_RETURN_REASON');
9184         FND_MESSAGE.Set_Token('RETURN_REASON_CODE', p_charges_detail_rec.return_reason_code);
9185         FND_MSG_PUB.Add;
9186         RAISE FND_API.G_EXC_ERROR;
9187       END IF;
9188     END IF;
9189     x_charges_detail_rec.return_reason_code := p_charges_detail_rec.return_reason_code;
9190 
9191   END IF;
9192 
9193 ELSIF p_validation_mode = 'U' THEN
9194 
9195   IF l_line_order_category_code = 'RETURN' THEN
9196 
9197     IF p_charges_detail_rec.return_reason_code <> FND_API.G_MISS_CHAR AND
9198        p_charges_detail_rec.return_reason_code IS NOT NULL THEN
9199 
9200       l_valid_check := IS_RETURN_REASON_VALID(p_return_reason_code => p_charges_detail_rec.return_reason_code,
9201                                 x_msg_data           => l_msg_data,
9202                                 x_msg_count          => l_msg_count,
9203                                 x_return_status      => l_return_status);
9204 
9205       IF l_return_status = G_RET_STS_UNEXP_ERROR THEN
9206         RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
9207       ELSIF l_return_status = G_RET_STS_ERROR THEN
9208         RAISE FND_API.G_EXC_ERROR;
9209       END IF;
9210 
9211       IF l_valid_check <> 'Y' THEN
9212 
9213         FND_MESSAGE.SET_NAME('CS', 'CS_CHG_INVALID_RETURN_REASON');
9214         FND_MESSAGE.Set_Token('RETURN_REASON_CODE', p_charges_detail_rec.return_reason_code);
9215         FND_MSG_PUB.Add;
9216         RAISE FND_API.G_EXC_ERROR;
9217       ELSE
9218         x_charges_detail_rec.return_reason_code := p_charges_detail_rec.return_reason_code;
9219       END IF;
9220 
9221     ELSE
9222       -- If not passed then
9223       -- assign from db record
9224       x_charges_detail_rec.return_reason_code := l_db_det_rec.return_reason_code;
9225     END IF;
9226   END IF;
9227 END IF;
9228 
9229 --DBMS_OUTPUT.PUT_LINE('Return Reason COde Successful ....');
9230 
9231 --========================================
9232 -- Qty Required Validation
9233 --========================================
9234 
9235 --DBMS_OUTPUT.PUT_LINE('Qty Required Validation ...');
9236 
9237 IF p_validation_mode = 'I' THEN
9238 
9239   --DBMS_OUTPUT.PUT_LINE('Insert Mode');
9240 
9241   IF (((l_line_order_category_code = 'RETURN') AND
9242        (p_charges_detail_rec.return_reason_code IS NOT NULL) AND
9243        (p_charges_detail_rec.quantity_required IS NOT NULL))) THEN
9244 
9245        IF sign(p_charges_detail_rec.quantity_required) = -1 THEN
9246          x_charges_detail_rec.quantity_required := p_charges_detail_rec.quantity_required;
9247        ELSE
9248          --assign -ve qty to out record
9249          x_charges_detail_rec.quantity_required := (p_charges_detail_rec.quantity_required * -1);
9250        END IF;
9251   ELSE
9252 
9253     IF p_charges_detail_rec.quantity_required IS NOT NULL THEN
9254       -- Added to fix bug # 5147727
9255       IF sign(p_charges_detail_rec.quantity_required) = -1 THEN
9256         -- need to make this positive as no -ve quantity for orders
9257         x_charges_detail_rec.quantity_required := (p_charges_detail_rec.quantity_required * -1);
9258       ELSE
9259         x_charges_detail_rec.quantity_required := p_charges_detail_rec.quantity_required;
9260       END IF;
9261 
9262     ELSE
9263       --Added to fix bug # 3217757
9264       --debriefed expense line not displaying correct amount
9265       --This is to default 1 for qty if qty is null
9266 
9267       --Added to fix bug # 4205915
9268       IF ((l_line_order_category_code = 'RETURN') AND
9269          (p_charges_detail_rec.return_reason_code IS NOT NULL)) THEN
9270 
9271          x_charges_detail_rec.quantity_required := -1;
9272       ELSE
9273          x_charges_detail_rec.quantity_required := 1;
9274       END IF;
9275     END IF;
9276   END IF;
9277 
9278 ELSIF p_validation_mode = 'U' THEN
9279 
9280   --DBMS_OUTPUT.PUT_LINE('Update Mode');
9281 
9282   --DBMS_OUTPUT.PUT_LINE('p_charges_detail_rec.quantity_required '||p_charges_detail_rec.quantity_required);
9283 
9284   IF p_charges_detail_rec.quantity_required = FND_API.G_MISS_NUM OR
9285      p_charges_detail_rec.quantity_required IS NULL THEN
9286 
9287      --DBMS_OUTPUT.PUT_LINE('Quantity Required not passed');
9288      x_charges_detail_rec.quantity_required  := l_db_det_rec.quantity_required ;
9289      --DBMS_OUTPUT.PUT_LINE('Quantity required is '||x_charges_detail_rec.quantity_required);
9290 
9291   ELSE
9292      /* Bug# 4870051
9293      IF l_db_det_rec.rollup_flag = 'Y'  THEN
9294          Cant_Update_Detail_Param_Msg(l_api_name_full,
9295                                       'QUANTITY_REQUIRED',
9296                                       to_char(p_charges_detail_rec.quantity_required));
9297          RAISE FND_API.G_EXC_ERROR;
9298      ELSE*/
9299          IF (((l_line_order_category_code = 'RETURN') AND
9300               (x_charges_detail_rec.return_reason_code IS NOT NULL) AND
9301               (p_charges_detail_rec.quantity_required IS NOT NULL))) THEN
9302 
9303                IF sign(p_charges_detail_rec.quantity_required) = -1 THEN
9304                  x_charges_detail_rec.quantity_required := p_charges_detail_rec.quantity_required;
9305                ELSE
9306                  --assign -ve qty to out record
9307                  x_charges_detail_rec.quantity_required := (p_charges_detail_rec.quantity_required * -1);
9308                END IF;
9309          ELSE
9310            -- Added below for Bug# 5147727
9311            IF sign(p_charges_detail_rec.quantity_required) = -1 THEN
9312              -- need to make this positive as no -ve quantity for orders
9313              x_charges_detail_rec.quantity_required := (p_charges_detail_rec.quantity_required * -1);
9314            ELSE
9315              x_charges_detail_rec.quantity_required  := p_charges_detail_rec.quantity_required ;
9316            END IF;
9317             --DBMS_OUTPUT.PUT_LINE('Quantity required is '||x_charges_detail_rec.quantity_required);
9318 
9319          END IF;
9320 
9321          --Condition added to fix Bug # 3358531
9322          IF x_charges_detail_rec.quantity_required  <> l_db_det_rec.quantity_required THEN
9323           --quantity required is changed need to re-calculate the list price
9324           l_calc_sp := 'Y';
9325         END IF;
9326       --Bug# 4870051 END IF ;
9327   END IF ;
9328 END IF;
9329 
9330 --DBMS_OUTPUT.PUT_LINE('Qty Required Validation Successful...');
9331 
9332 
9333 --=================================================
9334 --Validate Incoming Price List and Currency Code
9335 --=================================================
9336 --DBMS_OUTPUT.PUT_LINE('Validate Incoming Price List and Currency Code ...');
9337 
9338 IF p_validation_mode IN ( 'I', 'U') THEN
9339 
9340   --DBMS_OUTPUT.PUT_LINE(' Price List '||p_charges_detail_rec.price_list_id);
9341   --DBMS_OUTPUT.PUT_LINE(' Currency_code '||p_charges_detail_rec.currency_code);
9342 
9343   IF p_charges_detail_rec.price_list_id <> FND_API.G_MISS_NUM AND
9344      p_charges_detail_rec.price_list_id IS NOT NULL THEN
9345 
9346     l_valid_check := IS_PRICE_LIST_VALID(p_price_list_id => p_charges_detail_rec.price_list_id,
9347                            x_msg_data      => l_msg_data,
9348                            x_msg_count     => l_msg_count,
9349                            x_return_status => l_return_status);
9350 
9351       IF l_return_status = G_RET_STS_UNEXP_ERROR THEN
9352         RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
9353       ELSIF l_return_status = G_RET_STS_ERROR THEN
9354         RAISE FND_API.G_EXC_ERROR;
9355       END IF;
9356 
9357     IF l_valid_check <> 'Y' THEN
9358         FND_MESSAGE.SET_NAME('CS', 'CS_CHG_INVALID_PRICE_LIST');
9359         FND_MESSAGE.Set_Token('PRICE_LIST_ID', p_charges_detail_rec.price_list_id);
9360         FND_MSG_PUB.Add;
9361         RAISE FND_API.G_EXC_ERROR;
9362 
9363     ELSE
9364 
9365       --DBMS_OUTPUT.PUT_LINE('Price List is valid');
9366 
9367       --assign the price_list_id to the out record
9368       x_charges_detail_rec.price_list_id := p_charges_detail_rec.price_list_id;
9369 
9370       -- get currency_code for the price_list_id
9371       GET_CURRENCY_CODE(
9372         p_api_name        => l_api_name,
9373         p_price_list_id   => p_charges_detail_rec.price_list_id,
9374         x_currency_code   => l_currency_code,
9375         x_msg_data        => l_msg_data,
9376         x_msg_count       => l_msg_count,
9377         x_return_status   => l_return_status);
9378 
9379       IF (l_return_status <> FND_API.G_RET_STS_SUCCESS) THEN
9380         FND_MESSAGE.SET_NAME('CS', 'CS_CHG_GET_CURRENCY_CODE_ERROR');
9381         FND_MESSAGE.Set_Token('PRICE_LIST_ID', p_charges_detail_rec.price_list_id);
9382         --FND_MESSAGE.Set_Token('TEXT', l_msg_data, TRUE);
9383         FND_MSG_PUB.Add;
9384         RAISE FND_API.G_EXC_ERROR;
9385       END IF ;
9386 
9387       --DBMS_OUTPUT.PUT_LINE('Currency_code '||l_currency_code);
9388 
9389       IF (p_charges_detail_rec.currency_code <> FND_API.G_MISS_CHAR AND
9390           p_charges_detail_rec.currency_code IS NOT NULL) AND
9391          (l_currency_code IS NOT NULL) AND
9392          (p_charges_detail_rec.currency_code <> l_currency_code) THEN
9393         l_profile_value := fnd_profile.value('CS_ENABLE_CURRENCY_CONVERSION');
9394 	 IF l_profile_value = 'Y' THEN
9395 
9396 	   CURR_IN_CONVERSION_LIST(
9397 		p_api_name        => l_api_name,
9398 		p_price_list_id   => p_charges_detail_rec.price_list_id,
9399 		p_currency_code   => p_charges_detail_rec.currency_code,
9400 		x_msg_data        => l_msg_data,
9401 		x_msg_count       => l_msg_count,
9402 		x_return_status   => l_return_status);
9403 
9404 	   IF l_return_status = FND_API.G_RET_STS_SUCCESS Then
9405 	      x_charges_detail_rec.currency_code := p_charges_detail_rec.currency_code;
9406 	      l_curr_in_conversion_list := 'Y';
9407 
9408 	   ELSE
9409 		FND_MESSAGE.SET_NAME('CS', 'CS_CHG_INVALID_CURRENCY_CODE');
9410 		FND_MESSAGE.Set_Token('CURRENCY_CODE', p_charges_detail_rec.currency_code);
9411 		FND_MSG_PUB.Add;
9412 		RAISE FND_API.G_EXC_ERROR;
9413 
9414            END IF;
9415 
9416 	   If l_curr_in_conversion_list = 'Y'
9417 	    and (p_charges_detail_rec.list_price is null OR p_charges_detail_rec.list_price = FND_API.G_MISS_NUM
9418 	    OR p_charges_detail_rec.selling_price is null OR p_charges_detail_rec.selling_price = FND_API.G_MISS_NUM
9419 	    OR p_charges_detail_rec.after_warranty_cost is null OR p_charges_detail_rec.after_warranty_cost = FND_API.G_MISS_NUM) then
9420 
9421 	      FND_MESSAGE.SET_NAME('CS', 'CS_CHG_NOT_BASE_CURRENCY');
9422               FND_MESSAGE.Set_Token('CURRENCY_CODE', p_charges_detail_rec.currency_code);
9423               FND_MSG_PUB.Add;
9424               RAISE FND_API.G_EXC_ERROR;
9425 
9426 	   End If;
9427          ELSE
9428 	        FND_MESSAGE.SET_NAME('CS', 'CS_CHG_INVALID_CURRENCY_CODE');
9429 		FND_MESSAGE.Set_Token('CURRENCY_CODE', p_charges_detail_rec.currency_code);
9430 		FND_MSG_PUB.Add;
9431 		RAISE FND_API.G_EXC_ERROR;
9432 	 END IF;
9433 
9434       ELSIF (p_charges_detail_rec.currency_code IS NULL) AND
9435             (l_currency_code IS NOT NULL) THEN
9436           x_charges_detail_rec.currency_code := l_currency_code;
9437 
9438       --ELSIF (p_charges_detail_rec.currency_code IS NOT NULL) AND
9439       --        (l_currency_code IS NULL) THEN
9440       ELSE
9441           --assign currency_code to out record
9442           x_charges_detail_rec.currency_code := p_charges_detail_rec.currency_code;
9443       END IF;
9444     END IF;
9445 
9446   END IF;
9447 END IF;
9448 
9449 
9450 --===================================
9451 --Validate Contract Information
9452 --===================================
9453 --DBMS_OUTPUT.PUT_LINE('Validate Contract Information ...');
9454 
9455 
9456 IF l_incident_date is NOT NULL THEN
9457   l_request_date := l_incident_date;
9458   --DBMS_OUTPUT.PUT_LINE('l_request_date : '||l_request_date);
9459 
9460 ELSE
9461   l_request_date := l_creation_date;
9462   --DBMS_OUTPUT.PUT_LINE('l_request_date : '||l_request_date);
9463 END IF;
9464 
9465 IF p_validation_mode = 'I' THEN
9466 
9467   --DBMS_OUTPUT.PUT_LINE('Contract Validation');
9468   --DBMS_OUTPUT.PUT_LINE('p_charges_detail_rec.contract_id = ' || p_charges_detail_rec.contract_id);
9469   --DBMS_OUTPUT.PUT_LINE('p_charges_detail_rec.coverage_id = ' || p_charges_detail_rec.coverage_id);
9470   --DBMS_OUTPUT.PUT_LINE('p_charges_detail_rec.coverage_txn_group_id = ' || p_charges_detail_rec.coverage_txn_group_id);
9471 
9472   -- if rate_type is passed then pass it down to the application
9473   IF p_charges_detail_rec.rate_type_code IS NOT NULL THEN
9474     x_charges_detail_rec.rate_type_code := p_charges_detail_rec.rate_type_code;
9475   ELSE
9476     x_charges_detail_rec.rate_type_code := null;
9477   END IF;
9478 
9479 
9480 
9481   --Changed for R12 - always use the contract_line_id
9482   IF p_charges_detail_rec.contract_line_id IS NOT NULL THEN
9483     --validate the contract_line_id
9484     l_valid_check := IS_CONTRACT_LINE_VALID(
9485                       p_contract_line_id      => p_charges_detail_rec.contract_line_id,
9486                       x_contract_id           => x_charges_detail_rec.contract_id,
9487                       x_msg_data              => l_msg_data,
9488                       x_msg_count             => l_msg_count,
9489                       x_return_status         => l_return_status);
9490 
9491     IF l_return_status = G_RET_STS_UNEXP_ERROR THEN
9492       RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
9493     ELSIF l_return_status = G_RET_STS_ERROR THEN
9494       RAISE FND_API.G_EXC_ERROR;
9495     END IF;
9496 
9497     IF l_valid_check <> 'Y' THEN
9498 
9499       FND_MESSAGE.SET_NAME('CS', 'CS_CHG_INVALID_CONTRACT_LINE');
9500       FND_MESSAGE.Set_Token('CONTRACT_LINE_ID', p_charges_detail_rec.contract_Line_id);
9501       FND_MSG_PUB.Add;
9502       RAISE FND_API.G_EXC_ERROR;
9503     ELSE
9504       --assign this value to the out parameter
9505       x_charges_detail_rec.contract_line_id := p_charges_detail_rec.contract_line_id;
9506     END IF;
9507   ELSIF p_charges_detail_rec.coverage_id IS NOT NULL THEN
9508     --need to derive the coverage_line_id using the coverage_id
9509 
9510       x_charges_detail_rec.contract_line_id  := GET_CONTRACT_LINE_ID(p_charges_detail_rec.coverage_id,
9511                                                                      l_msg_data,
9512                                                                      x_msg_count,
9513                                                                      x_return_status);
9514 
9515          IF l_return_status = G_RET_STS_UNEXP_ERROR THEN
9516           RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
9517          ELSIF l_return_status = G_RET_STS_ERROR THEN
9518           RAISE FND_API.G_EXC_ERROR;
9519          END IF;
9520 
9521          IF x_charges_detail_rec.contract_line_id = 0 THEN
9522             Add_Invalid_Argument_Msg(l_api_name,
9523                                  l_contract_line_id,
9524                                  'Contract Line ID');
9525 
9526             RAISE FND_API.G_EXC_ERROR;
9527          END IF;
9528    ELSE
9529        --Fixed Bug # 5022118  Added condition for Depot Repair Task lines
9530        IF l_contract_service_id IS NOT NULL AND
9531           p_charges_detail_rec.original_source_code <> 'DR' AND
9532           p_charges_detail_rec.source_code <> 'SD' THEN
9533          --assign this to the x_charges_detail_rec.contract_line_id
9534          x_charges_detail_rec.contract_line_id := l_contract_service_id;
9535        -- Bug 12730503
9536        ELSIF l_contract_service_id IS NOT NULL AND
9537              p_charges_detail_rec.original_source_code = 'DR' AND
9538              p_charges_detail_rec.source_code = 'DR' THEN
9539 
9540             x_charges_detail_rec.contract_line_id := l_contract_service_id;
9541        -- End of Bug 12730503
9542        ELSE
9543          x_charges_detail_rec.contract_line_id := null;
9544        END IF;
9545    END IF;
9546 
9547 
9548 
9549   -- Initialize contract values.
9550   x_charges_detail_rec.contract_id := null;
9551   x_charges_detail_rec.coverage_id := null;
9552   x_charges_detail_rec.coverage_txn_group_id := null;
9553 
9554   IF (p_charges_detail_rec.contract_id IS NOT NULL) THEN
9555      --(p_charges_detail_rec.coverage_id IS NOT NULL) AND
9556      --(p_charges_detail_rec.coverage_txn_group_id IS NOT NULL) THEN
9557 
9558     --Validate Contract
9559 
9560     l_valid_check := IS_CONTRACT_VALID(
9561                          p_contract_id           =>  p_charges_detail_rec.contract_id,
9562                          x_msg_data              =>  l_msg_data,
9563                          x_msg_count             =>  l_msg_count,
9564                          x_return_status         =>  l_return_status);
9565 
9566       IF l_return_status = G_RET_STS_UNEXP_ERROR THEN
9567         RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
9568       ELSIF l_return_status = G_RET_STS_ERROR THEN
9569         RAISE FND_API.G_EXC_ERROR;
9570       END IF;
9571 
9572       IF l_valid_check <> 'Y' THEN
9573 
9574         FND_MESSAGE.SET_NAME('CS', 'CS_CHG_INVALID_CONTRACT');
9575         FND_MESSAGE.Set_Token('CONTRACT_ID', p_charges_detail_rec.contract_id);
9576         --FND_MESSAGE.Set_Token('COVERAGE_ID', p_charges_detail_rec.coverage_id, TRUE);
9577         --FND_MESSAGE.Set_Token('BUSINESS_PROCESS_ID', p_charges_detail_rec.business_process_id, TRUE);
9578         FND_MSG_PUB.Add;
9579         RAISE FND_API.G_EXC_ERROR;
9580 
9581       ELSE
9582 
9583       --Contract is valid, assign to out record
9584       x_charges_detail_rec.contract_id := p_charges_detail_rec.contract_id;
9585 
9586       -- get price list for the contract
9587       GET_CONTRACT_PRICE_LIST(
9588           p_api_name              => l_api_name,
9589           p_business_process_id   => x_charges_detail_rec.business_process_id,
9590           p_request_date          => l_request_date,
9591           p_contract_line_id      => x_charges_detail_rec.contract_line_id,
9592           x_price_list_id         => l_price_list_id,
9593           x_currency_code         => l_currency_code,
9594           x_msg_data              => l_msg_data,
9595           x_msg_count             => l_msg_count,
9596           x_return_status         => l_return_status);
9597 
9598       IF p_charges_detail_rec.price_list_id IS NOT NULL AND
9599          l_price_list_id IS NOT NULL AND
9600          p_charges_detail_rec.price_list_id <> l_price_list_id THEN
9601 
9602          --Fixed To resolve Bug # 3557490
9603          --do nothing
9604          --since the price list is already derived there is no need to validate again
9605          --use the price list sent by the upstream application
9606          x_charges_detail_rec.price_list_id := p_charges_detail_rec.price_list_id;
9607 
9608          -- get currency_code for the price_list_id
9609          GET_CURRENCY_CODE(
9610               p_api_name        => l_api_name,
9611               p_price_list_id   => x_charges_detail_rec.price_list_id,
9612               x_currency_code   => l_currency_code,
9613               x_msg_data        => l_msg_data,
9614               x_msg_count       => l_msg_count,
9615               x_return_status   => l_return_status);
9616 
9617          IF (l_return_status <> FND_API.G_RET_STS_SUCCESS) THEN
9618           FND_MESSAGE.SET_NAME('CS', 'CS_CHG_GET_CURRENCY_CODE_ERROR');
9619           FND_MESSAGE.Set_Token('PRICE_LIST_ID', p_charges_detail_rec.price_list_id);
9620           --FND_MESSAGE.Set_Token('TEXT', l_msg_data, TRUE);
9621           FND_MSG_PUB.Add;
9622           RAISE FND_API.G_EXC_ERROR;
9623          END IF ;
9624 	 IF x_charges_detail_rec.currency_code <> l_currency_code
9625 	     AND l_currency_code is NOT NULL and x_charges_detail_rec.currency_code is not NUll
9626 	     and x_charges_detail_rec.currency_code <> FND_API.G_MISS_CHAR THEN --12.1.3 , vpremach
9627 	    IF L_CURR_IN_CONVERSION_LIST <> 'Y' THEN
9628                 FND_MESSAGE.SET_NAME('CS', 'CS_CHG_INVALID_CURRENCY_CODE');
9629 		FND_MESSAGE.Set_Token('CURRENCY_CODE', p_charges_detail_rec.currency_code);
9630 		FND_MSG_PUB.Add;
9631 		RAISE FND_API.G_EXC_ERROR;
9632             END IF;
9633 	 ELSE
9634 	    x_charges_detail_rec.currency_code := l_currency_code;
9635          END IF;
9636       ELSIF p_charges_detail_rec.price_list_id IS NULL AND
9637             l_price_list_id IS NOT NULL THEN
9638         x_charges_detail_rec.price_list_id := l_price_list_id;
9639         x_charges_detail_rec.currency_code := l_currency_code;
9640 
9641       ELSIF p_charges_detail_rec.price_list_id IS NOT NULL AND
9642             l_price_list_id IS NULL THEN
9643 
9644         x_charges_detail_rec.price_list_id := p_charges_detail_rec.price_list_id;
9645         -- get currency_code for the price_list_id
9646         GET_CURRENCY_CODE(
9647               p_api_name        => l_api_name,
9648               p_price_list_id   => p_charges_detail_rec.price_list_id,
9649               x_currency_code   => l_currency_code,
9650               x_msg_data        => l_msg_data,
9651               x_msg_count       => l_msg_count,
9652               x_return_status   => l_return_status);
9653 
9654         IF (l_return_status <> FND_API.G_RET_STS_SUCCESS) THEN
9655          FND_MESSAGE.SET_NAME('CS', 'CS_CHG_GET_CURRENCY_CODE_ERROR');
9656          FND_MESSAGE.Set_Token('PRICE_LIST_ID', p_charges_detail_rec.price_list_id);
9657          --FND_MESSAGE.Set_Token('TEXT', l_msg_data, TRUE);
9658          FND_MSG_PUB.Add;
9659          RAISE FND_API.G_EXC_ERROR;
9660         END IF ;
9661 
9662         IF x_charges_detail_rec.currency_code <> l_currency_code AND l_currency_code is NOT NULL and x_charges_detail_rec.currency_code is not NUll
9663 	     and x_charges_detail_rec.currency_code <> FND_API.G_MISS_CHAR THEN --12.1.3, vpremach
9664 	    IF L_CURR_IN_CONVERSION_LIST <> 'Y' THEN
9665                 FND_MESSAGE.SET_NAME('CS', 'CS_CHG_INVALID_CURRENCY_CODE');
9666 		FND_MESSAGE.Set_Token('CURRENCY_CODE', p_charges_detail_rec.currency_code);
9667 		FND_MSG_PUB.Add;
9668 		RAISE FND_API.G_EXC_ERROR;
9669             END IF;
9670 	 ELSE
9671 	    x_charges_detail_rec.currency_code := l_currency_code;
9672          END IF;
9673 
9674       ELSIF p_charges_detail_rec.price_list_id IS NULL AND
9675             l_price_list_id IS NULL THEN
9676 
9677         --use the default from the price list
9678         x_charges_detail_rec.price_list_id := to_number(fnd_profile.value('CS_CHARGE_DEFAULT_PRICE_LIST'));
9679 
9680       IF FND_LOG.level_procedure >= FND_LOG.g_current_runtime_level
9681       THEN
9682 	FND_LOG.String
9683 	( FND_LOG.level_procedure , L_LOG_MODULE || ''
9684 	, 'The Value of profile CS_CHARGE_DEFAULT_PRICE_LIST :' || x_charges_detail_rec.price_list_id
9685 	);
9686       END IF;
9687 
9688         -- get currency_code for the price_list_id
9689         GET_CURRENCY_CODE(
9690               p_api_name        => l_api_name,
9691               p_price_list_id   => x_charges_detail_rec.price_list_id,
9692               x_currency_code   => l_currency_code,
9693               x_msg_data        => l_msg_data,
9694               x_msg_count       => l_msg_count,
9695               x_return_status   => l_return_status);
9696 
9697         IF (l_return_status <> FND_API.G_RET_STS_SUCCESS) THEN
9698           FND_MESSAGE.SET_NAME('CS', 'CS_CHG_GET_CURRENCY_CODE_ERROR');
9699           FND_MESSAGE.Set_Token('PRICE_LIST_ID', x_charges_detail_rec.price_list_id);
9700           --FND_MESSAGE.Set_Token('TEXT', l_msg_data, TRUE);
9701           FND_MSG_PUB.Add;
9702           RAISE FND_API.G_EXC_ERROR;
9703         END IF ;
9704         IF x_charges_detail_rec.currency_code <> l_currency_code AND l_currency_code is NOT NULL and x_charges_detail_rec.currency_code is not NUll
9705 	     and x_charges_detail_rec.currency_code <> FND_API.G_MISS_CHAR THEN --12.1.3, vpremach
9706 	    IF L_CURR_IN_CONVERSION_LIST <> 'Y' THEN
9707                 FND_MESSAGE.SET_NAME('CS', 'CS_CHG_INVALID_CURRENCY_CODE');
9708 		FND_MESSAGE.Set_Token('CURRENCY_CODE', p_charges_detail_rec.currency_code);
9709 		FND_MSG_PUB.Add;
9710 		RAISE FND_API.G_EXC_ERROR;
9711             END IF;
9712 	 ELSE
9713 	    x_charges_detail_rec.currency_code := l_currency_code;
9714          END IF;
9715 
9716       END IF;
9717     END IF;
9718 
9719 
9720   -- For bugfix 3903911, vkjain.
9721   -- The charge contract is selectively applied for debrief lines.
9722   -- If the debrief lines originate from Depot Repair than RO contract
9723   -- is used. If there is no RO contract then SR contract should not be defaulted.
9724   -- Adding the NOT condition below to address the requirement.
9725   ELSIF l_contract_service_ID IS NOT NULL AND
9726         l_business_process_id IS NOT NULL AND
9727         NOT ( p_charges_detail_rec.original_source_code = 'DR' AND
9728               p_charges_detail_rec.source_code = 'SD') THEN
9729 
9730     -- p_charges_detail_rec.contract_id IS NULL AND
9731     -- p_charges_detail_rec.coverage_id IS NULL AND
9732     -- p_charges_detail_rec.coverage_txn_group_id IS NULL
9733     -- Check to see if there is a contract on SR
9734 
9735     --DBMS_OUTPUT.PUT_LINE('l_contract_id = ' || l_contract_id);
9736     --DBMS_OUTPUT.PUT_LINE('l_contract_service_ID = ' || l_contract_service_ID);
9737     --DBMS_OUTPUT.PUT_LINE('l_business_process_id = ' || l_business_process_id);
9738 
9739     GET_CONTRACT(
9740         p_api_name               => l_api_name,
9741         p_contract_SR_ID         => l_contract_service_id,
9742         p_incident_date          => l_incident_date,
9743         p_creation_date          => l_creation_date,
9744         p_customer_id            => l_customer_id,
9745         p_cust_account_id        => l_account_id,
9746         p_cust_product_id        => l_cust_product_id,
9747         p_system_id              => l_system_id,          -- Fix bug
9748         p_inventory_item_id      => l_inventory_item_id,  -- Fix bug
9749         p_business_process_id    => p_charges_detail_rec.business_process_id,
9750         x_contract_id            => l_contract_id,
9751         x_po_number              => l_po_number,
9752         x_return_status          => l_return_status,
9753         x_msg_count              => l_msg_count,
9754         x_msg_data               => l_msg_data);
9755 
9756         --DBMS_OUTPUT.PUT_LINE('l_contract_id = ' || l_contract_id);
9757 
9758         IF l_return_status <> FND_API.G_RET_STS_SUCCESS THEN
9759           FND_MESSAGE.SET_NAME('CS', 'CS_CHG_GET_CONTRACT_API_ERROR');
9760           FND_MESSAGE.SET_TOKEN('BUSINESS_PROCESS_ID', p_charges_detail_rec.business_process_id);
9761           FND_MESSAGE.SET_TOKEN('CONTRACT_SERVICE_LINE_ID', l_contract_service_id);
9762           --FND_MESSAGE.SET_TOKEN('TEXT', l_msg_data);
9763           FND_MSG_PUB.Add;
9764           RAISE FND_API.G_EXC_ERROR;
9765         END IF;
9766 
9767         IF l_contract_id IS NOT NULL THEN
9768 
9769           x_charges_detail_rec.contract_id := l_contract_id;
9770 
9771 
9772           -- get price list for the contract
9773           GET_CONTRACT_PRICE_LIST(
9774             p_api_name              => l_api_name,
9775             p_business_process_id   => l_business_process_id,
9776             p_request_date          => l_request_date,
9777             p_contract_line_id      => l_contract_service_id,
9778             x_price_list_id         => l_price_list_id,
9779             x_currency_code         => l_currency_code,
9780             x_msg_data              => l_msg_data,
9781             x_msg_count             => l_msg_count,
9782             x_return_status         => l_return_status);
9783 
9784           IF p_charges_detail_rec.price_list_id IS NOT NULL AND
9785              l_price_list_id IS NOT NULL AND
9786              p_charges_detail_rec.price_list_id <> l_price_list_id THEN
9787 
9788              --Fixed To resolve Bug # 3557490
9789              --do nothing
9790              --since the price list is already derived there is no need to validate again
9791              --use the price list sent by the upstream application
9792              x_charges_detail_rec.price_list_id := p_charges_detail_rec.price_list_id;
9793 
9794              -- get currency_code for the price_list_id
9795              GET_CURRENCY_CODE(
9796                   p_api_name        => l_api_name,
9797                   p_price_list_id   => x_charges_detail_rec.price_list_id,
9798                   x_currency_code   => l_currency_code,
9799                   x_msg_data        => l_msg_data,
9800                   x_msg_count       => l_msg_count,
9801                   x_return_status   => l_return_status);
9802 
9803              IF (l_return_status <> FND_API.G_RET_STS_SUCCESS) THEN
9804                FND_MESSAGE.SET_NAME('CS', 'CS_CHG_GET_CURRENCY_CODE_ERROR');
9805                FND_MESSAGE.Set_Token('PRICE_LIST_ID', p_charges_detail_rec.price_list_id);
9806                --FND_MESSAGE.Set_Token('TEXT', l_msg_data, TRUE);
9807                FND_MSG_PUB.Add;
9808                RAISE FND_API.G_EXC_ERROR;
9809              END IF ;
9810 
9811              IF x_charges_detail_rec.currency_code <> l_currency_code AND l_currency_code is NOT NULL and x_charges_detail_rec.currency_code is not NUll
9812 	     and x_charges_detail_rec.currency_code <> FND_API.G_MISS_CHAR THEN --12.1.3, vpremach
9813 	        IF L_CURR_IN_CONVERSION_LIST <> 'Y' THEN
9814 		   FND_MESSAGE.SET_NAME('CS', 'CS_CHG_INVALID_CURRENCY_CODE');
9815 		   FND_MESSAGE.Set_Token('CURRENCY_CODE', p_charges_detail_rec.currency_code);
9816 		   FND_MSG_PUB.Add;
9817 		   RAISE FND_API.G_EXC_ERROR;
9818 	        END IF;
9819 	     ELSE
9820 	        x_charges_detail_rec.currency_code := l_currency_code;
9821 	     END IF;
9822 
9823           ELSIF p_charges_detail_rec.price_list_id IS NULL AND
9824                 l_price_list_id IS NOT NULL THEN
9825             x_charges_detail_rec.price_list_id := l_price_list_id;
9826             x_charges_detail_rec.currency_code := l_currency_code;
9827           ELSIF p_charges_detail_rec.price_list_id IS NOT NULL AND
9828                 l_price_list_id IS NULL THEN
9829             x_charges_detail_rec.price_list_id := p_charges_detail_rec.price_list_id;
9830 
9831             -- get currency_code for the price_list_id
9832             GET_CURRENCY_CODE(
9833                   p_api_name        => l_api_name,
9834                   p_price_list_id   => p_charges_detail_rec.price_list_id,
9835                   x_currency_code   => l_currency_code,
9836                   x_msg_data        => l_msg_data,
9837                   x_msg_count       => l_msg_count,
9838                   x_return_status   => l_return_status);
9839 
9840             IF (l_return_status <> FND_API.G_RET_STS_SUCCESS) THEN
9841               FND_MESSAGE.SET_NAME('CS', 'CS_CHG_GET_CURRENCY_CODE_ERROR');
9842               FND_MESSAGE.Set_Token('PRICE_LIST_ID', p_charges_detail_rec.price_list_id);
9843               --FND_MESSAGE.Set_Token('TEXT', l_msg_data, TRUE);
9844               FND_MSG_PUB.Add;
9845               RAISE FND_API.G_EXC_ERROR;
9846             END IF ;
9847 
9848             IF x_charges_detail_rec.currency_code <> l_currency_code AND l_currency_code is NOT NULL and x_charges_detail_rec.currency_code is not NUll
9849 	     and x_charges_detail_rec.currency_code <> FND_API.G_MISS_CHAR THEN --12.1.3, vpremach
9850 	        IF L_CURR_IN_CONVERSION_LIST <> 'Y' THEN
9851 		   FND_MESSAGE.SET_NAME('CS', 'CS_CHG_INVALID_CURRENCY_CODE');
9852 		   FND_MESSAGE.Set_Token('CURRENCY_CODE', p_charges_detail_rec.currency_code);
9853 		   FND_MSG_PUB.Add;
9854 		   RAISE FND_API.G_EXC_ERROR;
9855 	        END IF;
9856 	     ELSE
9857 	        x_charges_detail_rec.currency_code := l_currency_code;
9858 	     END IF;
9859 
9860           ELSIF p_charges_detail_rec.price_list_id IS NULL AND
9861                 l_price_list_id IS NULL THEN
9862 
9863             --use the default from the price list
9864             x_charges_detail_rec.price_list_id := to_number(fnd_profile.value('CS_CHARGE_DEFAULT_PRICE_LIST'));
9865 
9866       IF FND_LOG.level_procedure >= FND_LOG.g_current_runtime_level
9867       THEN
9868 	FND_LOG.String
9869 	( FND_LOG.level_procedure , L_LOG_MODULE || ''
9870 	, 'The Value of profile CS_CHARGE_DEFAULT_PRICE_LIST :' || x_charges_detail_rec.price_list_id
9871 	);
9872       END IF;
9873 
9874             -- get currency_code for the price_list_id
9875             GET_CURRENCY_CODE(
9876                   p_api_name        => l_api_name,
9877                   p_price_list_id   => x_charges_detail_rec.price_list_id,
9878                   x_currency_code   => l_currency_code,
9879                   x_msg_data        => l_msg_data,
9880                   x_msg_count       => l_msg_count,
9881                   x_return_status   => l_return_status);
9882 
9883             IF (l_return_status <> FND_API.G_RET_STS_SUCCESS) THEN
9884               FND_MESSAGE.SET_NAME('CS', 'CS_CHG_GET_CURRENCY_CODE_ERROR');
9885               FND_MESSAGE.Set_Token('PRICE_LIST_ID', x_charges_detail_rec.price_list_id);
9886               --FND_MESSAGE.Set_Token('TEXT', l_msg_data, TRUE);
9887               FND_MSG_PUB.Add;
9888               RAISE FND_API.G_EXC_ERROR;
9889             END IF ;
9890             IF x_charges_detail_rec.currency_code <> l_currency_code AND l_currency_code is NOT NULL and x_charges_detail_rec.currency_code is not NUll
9891 	     and x_charges_detail_rec.currency_code <> FND_API.G_MISS_CHAR THEN --12.1.3, vpremach
9892 	        IF L_CURR_IN_CONVERSION_LIST <> 'Y' THEN
9893 		   FND_MESSAGE.SET_NAME('CS', 'CS_CHG_INVALID_CURRENCY_CODE');
9894 		   FND_MESSAGE.Set_Token('CURRENCY_CODE', p_charges_detail_rec.currency_code);
9895 		   FND_MSG_PUB.Add;
9896 		   RAISE FND_API.G_EXC_ERROR;
9897 	        END IF;
9898 	     ELSE
9899 	        x_charges_detail_rec.currency_code := l_currency_code;
9900 	     END IF;
9901           END IF;
9902 
9903        ELSE
9904           -- consider this as no contract exists
9905           IF p_charges_detail_rec.price_list_id IS NULL THEN
9906             x_charges_detail_rec.price_list_id := to_number(fnd_profile.value('CS_CHARGE_DEFAULT_PRICE_LIST'));
9907 
9908             -- get currency_code for the price_list_id
9909             GET_CURRENCY_CODE(
9910                   p_api_name        => l_api_name,
9911                   p_price_list_id   => x_charges_detail_rec.price_list_id,
9912                   x_currency_code   => l_currency_code,
9913                   x_msg_data        => l_msg_data,
9914                   x_msg_count       => l_msg_count,
9915                   x_return_status   => l_return_status);
9916 
9917             IF (l_return_status <> FND_API.G_RET_STS_SUCCESS) THEN
9918               --RAISE FND_API.G_EXC_ERROR;
9919               FND_MESSAGE.SET_NAME('CS', 'CS_CHG_GET_CURRENCY_CODE_ERROR');
9920               FND_MESSAGE.Set_Token('PRICE_LIST_ID', x_charges_detail_rec.price_list_id);
9921               --FND_MESSAGE.Set_Token('TEXT', l_msg_data, TRUE);
9922               FND_MSG_PUB.Add;
9923               RAISE FND_API.G_EXC_ERROR;
9924             END IF ;
9925             IF x_charges_detail_rec.currency_code <> l_currency_code AND l_currency_code is NOT NULL and x_charges_detail_rec.currency_code is not NUll
9926 	     and x_charges_detail_rec.currency_code <> FND_API.G_MISS_CHAR THEN --12.1.3, vpremach
9927 	        IF L_CURR_IN_CONVERSION_LIST <> 'Y' THEN
9928 		   FND_MESSAGE.SET_NAME('CS', 'CS_CHG_INVALID_CURRENCY_CODE');
9929 		   FND_MESSAGE.Set_Token('CURRENCY_CODE', p_charges_detail_rec.currency_code);
9930 		   FND_MSG_PUB.Add;
9931 		   RAISE FND_API.G_EXC_ERROR;
9932 	        END IF;
9933 	     ELSE
9934 	        x_charges_detail_rec.currency_code := l_currency_code;
9935 	     END IF;
9936           ELSE
9937 
9938             x_charges_detail_rec.price_list_id := p_charges_detail_rec.price_list_id;
9939 
9940             -- get currency_code for the price_list_id
9941             GET_CURRENCY_CODE(
9942                   p_api_name        => l_api_name,
9943                   p_price_list_id   => x_charges_detail_rec.price_list_id,
9944                   x_currency_code   => l_currency_code,
9945                   x_msg_data        => l_msg_data,
9946                   x_msg_count       => l_msg_count,
9947                   x_return_status   => l_return_status);
9948             IF (l_return_status <> FND_API.G_RET_STS_SUCCESS) THEN
9949               --RAISE FND_API.G_EXC_ERROR;
9950               FND_MESSAGE.SET_NAME('CS', 'CS_CHG_GET_CURRENCY_CODE_ERROR');
9951               FND_MESSAGE.Set_Token('PRICE_LIST_ID', x_charges_detail_rec.price_list_id);
9952               --FND_MESSAGE.Set_Token('TEXT', l_msg_data, TRUE);
9953               FND_MSG_PUB.Add;
9954               RAISE FND_API.G_EXC_ERROR;
9955             END IF ;
9956             IF x_charges_detail_rec.currency_code <> l_currency_code AND l_currency_code is NOT NULL and x_charges_detail_rec.currency_code is not NUll
9957 	     and x_charges_detail_rec.currency_code <> FND_API.G_MISS_CHAR THEN --12.1.3, vpremach
9958 	        IF L_CURR_IN_CONVERSION_LIST <> 'Y' THEN
9959 		   FND_MESSAGE.SET_NAME('CS', 'CS_CHG_INVALID_CURRENCY_CODE');
9960 		   FND_MESSAGE.Set_Token('CURRENCY_CODE', p_charges_detail_rec.currency_code);
9961 		   FND_MSG_PUB.Add;
9962 		   RAISE FND_API.G_EXC_ERROR;
9963 	        END IF;
9964 	     ELSE
9965 	        x_charges_detail_rec.currency_code := l_currency_code;
9966 	     END IF;
9967           END IF;
9968         END IF;
9969 
9970 
9971   ELSE
9972     --no contract exists
9973     IF p_charges_detail_rec.price_list_id IS NULL THEN
9974        x_charges_detail_rec.price_list_id := to_number(fnd_profile.value('CS_CHARGE_DEFAULT_PRICE_LIST'));
9975 
9976       -- get currency_code for the price_list_id
9977       GET_CURRENCY_CODE(
9978             p_api_name        => l_api_name,
9979             p_price_list_id   => x_charges_detail_rec.price_list_id,
9980             x_currency_code   => l_currency_code,
9981             x_msg_data        => l_msg_data,
9982             x_msg_count       => l_msg_count,
9983             x_return_status   => l_return_status);
9984 
9985       IF (l_return_status <> FND_API.G_RET_STS_SUCCESS) THEN
9986         FND_MESSAGE.SET_NAME('CS', 'CS_CHG_GET_CURRENCY_CODE_ERROR');
9987         FND_MESSAGE.Set_Token('PRICE_LIST_ID', x_charges_detail_rec.price_list_id);
9988         --FND_MESSAGE.Set_Token('TEXT', l_msg_data, TRUE);
9989         FND_MSG_PUB.Add;
9990         RAISE FND_API.G_EXC_ERROR;
9991       END IF ;
9992              IF x_charges_detail_rec.currency_code <> l_currency_code AND l_currency_code is NOT NULL and x_charges_detail_rec.currency_code is not NUll
9993 	     and x_charges_detail_rec.currency_code <> FND_API.G_MISS_CHAR THEN --12.1.3, vpremach
9994 	        IF L_CURR_IN_CONVERSION_LIST <> 'Y' THEN
9995 		   FND_MESSAGE.SET_NAME('CS', 'CS_CHG_INVALID_CURRENCY_CODE');
9996 		   FND_MESSAGE.Set_Token('CURRENCY_CODE', p_charges_detail_rec.currency_code);
9997 		   FND_MSG_PUB.Add;
9998 		   RAISE FND_API.G_EXC_ERROR;
9999 	        END IF;
10000 	     ELSE
10001 	        x_charges_detail_rec.currency_code := l_currency_code;
10002 	     END IF;
10003 
10004     ELSE
10005       x_charges_detail_rec.price_list_id := p_charges_detail_rec.price_list_id;
10006 
10007       -- get currency_code for the price_list_id
10008       GET_CURRENCY_CODE(
10009             p_api_name        => l_api_name,
10010             p_price_list_id   => x_charges_detail_rec.price_list_id,
10011             x_currency_code   => l_currency_code,
10012             x_msg_data        => l_msg_data,
10013             x_msg_count       => l_msg_count,
10014             x_return_status   => l_return_status);
10015       IF (l_return_status <> FND_API.G_RET_STS_SUCCESS) THEN
10016         --RAISE FND_API.G_EXC_ERROR;
10017         FND_MESSAGE.SET_NAME('CS', 'CS_CHG_GET_CURRENCY_CODE_ERROR');
10018         FND_MESSAGE.Set_Token('PRICE_LIST_ID', x_charges_detail_rec.price_list_id);
10019         --FND_MESSAGE.Set_Token('TEXT', l_msg_data, TRUE);
10020         FND_MSG_PUB.Add;
10021         RAISE FND_API.G_EXC_ERROR;
10022       END IF ;
10023              IF x_charges_detail_rec.currency_code <> l_currency_code AND l_currency_code is NOT NULL and x_charges_detail_rec.currency_code is not NUll
10024 	     and x_charges_detail_rec.currency_code <> FND_API.G_MISS_CHAR THEN --12.1.3, vpremach
10025 	        IF L_CURR_IN_CONVERSION_LIST <> 'Y' THEN
10026 		   FND_MESSAGE.SET_NAME('CS', 'CS_CHG_INVALID_CURRENCY_CODE');
10027 		   FND_MESSAGE.Set_Token('CURRENCY_CODE', p_charges_detail_rec.currency_code);
10028 		   FND_MSG_PUB.Add;
10029 		   RAISE FND_API.G_EXC_ERROR;
10030 	        END IF;
10031 	     ELSE
10032 	        x_charges_detail_rec.currency_code := l_currency_code;
10033 	     END IF;
10034     END IF;
10035   END IF;
10036 
10037 ELSIF p_validation_mode = 'U' THEN
10038 
10039  --DBMS_OUTPUT.PUT_LINE('Contract Validation for update');
10040  --DBMS_OUTPUT.PUT_LINE('p_charges_detail_rec.contract_id = ' || p_charges_detail_rec.contract_id);
10041  --DBMS_OUTPUT.PUT_LINE('p_charges_detail_rec.coverage_id = ' || p_charges_detail_rec.coverage_id);
10042  --DBMS_OUTPUT.PUT_LINE('p_charges_detail_rec.coverage_txn_group_id = ' || p_charges_detail_rec.coverage_txn_group_id);
10043 
10044   -- if rate_type is passed then pass it down to the application
10045   IF p_charges_detail_rec.rate_type_code IS NOT NULL AND
10046      p_charges_detail_rec.rate_type_code <> FND_API.G_MISS_CHAR THEN
10047      -- value is passed
10048     x_charges_detail_rec.rate_type_code := p_charges_detail_rec.rate_type_code;
10049   ELSE
10050     IF p_charges_detail_rec.rate_type_code IS NULL THEN
10051       --nullify the rate_type_code on the charge line
10052       x_charges_detail_rec.rate_type_code := null;
10053     ELSE
10054       --take the one from the database;
10055       x_charges_detail_rec.rate_type_code := l_db_det_rec.rate_type_code;
10056     END IF;
10057 
10058   END IF;
10059 
10060 
10061 
10062   --Changed for R12 - always use the contract_line_id
10063   IF p_charges_detail_rec.contract_line_id IS NOT NULL AND
10064      p_charges_detail_rec.contract_line_id <> FND_API.G_MISS_NUM THEN
10065     --validate the contract_line_id
10066     l_valid_check := IS_CONTRACT_LINE_VALID(
10067                       p_contract_line_id      => p_charges_detail_rec.contract_line_id,
10068                       x_contract_id           => x_charges_detail_rec.contract_id,
10069                       x_msg_data              => l_msg_data,
10070                       x_msg_count             => l_msg_count,
10071                       x_return_status         => l_return_status);
10072 
10073     IF l_return_status = G_RET_STS_UNEXP_ERROR THEN
10074       RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
10075     ELSIF l_return_status = G_RET_STS_ERROR THEN
10076       RAISE FND_API.G_EXC_ERROR;
10077     END IF;
10078 
10079     IF l_valid_check <> 'Y' THEN
10080 
10081       FND_MESSAGE.SET_NAME('CS', 'CS_CHG_INVALID_CONTRACT');
10082       FND_MESSAGE.Set_Token('CONTRACT_ID', p_charges_detail_rec.contract_id);
10083       FND_MSG_PUB.Add;
10084       RAISE FND_API.G_EXC_ERROR;
10085     ELSE
10086       --assign this value to the out parameter
10087       x_charges_detail_rec.contract_line_id := p_charges_detail_rec.contract_line_id;
10088     END IF;
10089   ELSIF p_charges_detail_rec.coverage_id IS NOT NULL AND
10090         p_charges_detail_rec.coverage_id <> FND_API.G_MISS_NUM THEN
10091 
10092     --need to derive the coverage_line_id using the new coverage_id
10093 
10094       x_charges_detail_rec.contract_line_id  := GET_CONTRACT_LINE_ID(p_charges_detail_rec.coverage_id,
10095                                                                      l_msg_data,
10096                                                                      x_msg_count,
10097                                                                      x_return_status);
10098 
10099          IF l_return_status = G_RET_STS_UNEXP_ERROR THEN
10100           RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
10101          ELSIF l_return_status = G_RET_STS_ERROR THEN
10102           RAISE FND_API.G_EXC_ERROR;
10103          END IF;
10104 
10105          IF x_charges_detail_rec.contract_line_id = 0 THEN
10106             Add_Invalid_Argument_Msg(l_api_name,
10107                                  l_contract_line_id,
10108                                  'Contract Line ID');
10109 
10110             RAISE FND_API.G_EXC_ERROR;
10111          END IF;
10112    ELSE
10113        IF p_charges_detail_rec.contract_line_id IS NULL THEN
10114          --nullify the contract line id on the charge line
10115          x_charges_detail_rec.contract_line_id := null;
10116        ELSE
10117          --take the one from the database;
10118          x_charges_detail_rec.contract_line_id := l_db_det_rec.contract_line_id;
10119        END IF;
10120 
10121    END IF;
10122 
10123 
10124    -- Initialize contract values.
10125    --x_charges_detail_rec.contract_id := null;
10126    x_charges_detail_rec.coverage_id := null;
10127    x_charges_detail_rec.coverage_txn_group_id := null;
10128 
10129 
10130 
10131  IF(p_charges_detail_rec.contract_id <> FND_API.G_MISS_NUM) AND
10132    (p_charges_detail_rec.contract_id IS NOT NULL) THEN
10133 
10134    -- Fixed Bug # 4126979
10135 
10136     --Validate Contract
10137     l_valid_check := IS_CONTRACT_VALID(
10138                          p_contract_id           =>  p_charges_detail_rec.contract_id,
10139                          x_msg_data              =>  l_msg_data,
10140                          x_msg_count             =>  l_msg_count,
10141                          x_return_status         =>  l_return_status);
10142 
10143       IF l_return_status = G_RET_STS_UNEXP_ERROR THEN
10144         RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
10145       ELSIF l_return_status = G_RET_STS_ERROR THEN
10146         RAISE FND_API.G_EXC_ERROR;
10147       END IF;
10148 
10149       IF l_valid_check <> 'Y' THEN
10150 
10151         FND_MESSAGE.SET_NAME('CS', 'CS_CHG_INVALID_CONTRACT');
10152         FND_MESSAGE.Set_Token('CONTRACT_ID', p_charges_detail_rec.contract_id);
10153         FND_MSG_PUB.Add;
10154         RAISE FND_API.G_EXC_ERROR;
10155 
10156       ELSE
10157 
10158       --Contract is valid, assign to out record
10159       x_charges_detail_rec.contract_id := p_charges_detail_rec.contract_id;
10160       -- get price list for the contract
10161       GET_CONTRACT_PRICE_LIST(
10162           p_api_name              => l_api_name,
10163           p_business_process_id   => x_charges_detail_rec.business_process_id,
10164           p_request_date          => l_request_date,
10165           p_contract_line_id      => x_charges_detail_rec.contract_line_id,
10166           x_price_list_id         => l_price_list_id,
10167           x_currency_code         => l_currency_code,
10168           x_msg_data              => l_msg_data,
10169           x_msg_count             => l_msg_count,
10170           x_return_status         => l_return_status);
10171 
10172       IF p_charges_detail_rec.price_list_id <> FND_API.G_MISS_NUM AND
10173          p_charges_detail_rec.price_list_id IS NOT NULL AND
10174          l_price_list_id IS NOT NULL AND
10175          p_charges_detail_rec.price_list_id <> l_price_list_id THEN
10176 
10177          --Fixed To resolve Bug # 3557490
10178          --do nothing
10179          --since the price list is already derived there is no need to validate again
10180          --use the price list sent by the upstream application
10181          x_charges_detail_rec.price_list_id := p_charges_detail_rec.price_list_id;
10182 
10183          -- get currency_code for the price_list_id
10184          GET_CURRENCY_CODE(
10185               p_api_name        => l_api_name,
10186               p_price_list_id   => x_charges_detail_rec.price_list_id,
10187               x_currency_code   => l_currency_code,
10188               x_msg_data        => l_msg_data,
10189               x_msg_count       => l_msg_count,
10190               x_return_status   => l_return_status);
10191 
10192          IF (l_return_status <> FND_API.G_RET_STS_SUCCESS) THEN
10193            FND_MESSAGE.SET_NAME('CS', 'CS_CHG_GET_CURRENCY_CODE_ERROR');
10194            FND_MESSAGE.Set_Token('PRICE_LIST_ID', p_charges_detail_rec.price_list_id);
10195            --FND_MESSAGE.Set_Token('TEXT', l_msg_data, TRUE);
10196            FND_MSG_PUB.Add;
10197            RAISE FND_API.G_EXC_ERROR;
10198          END IF ;
10199 
10200              IF x_charges_detail_rec.currency_code <> l_currency_code AND l_currency_code is NOT NULL and x_charges_detail_rec.currency_code is not NUll
10201 	        and x_charges_detail_rec.currency_code <> FND_API.G_MISS_CHAR THEN --12.1.3, vpremach
10202 	        IF L_CURR_IN_CONVERSION_LIST <> 'Y' THEN
10203 		   FND_MESSAGE.SET_NAME('CS', 'CS_CHG_INVALID_CURRENCY_CODE');
10204 		   FND_MESSAGE.Set_Token('CURRENCY_CODE', p_charges_detail_rec.currency_code);
10205 		   FND_MSG_PUB.Add;
10206 		   RAISE FND_API.G_EXC_ERROR;
10207 	        END IF;
10208 	     ELSE
10209 	        x_charges_detail_rec.currency_code := l_currency_code;
10210 	     END IF;
10211 
10212          --Condition added to fix Bug # 3358531
10213         IF x_charges_detail_rec.price_list_id <> l_db_det_rec.price_list_header_id OR
10214            x_charges_detail_rec.currency_code <> l_db_det_rec.currency_code THEN
10215           --price list or currecy code is changed need to re-calculate the list price
10216           l_calc_sp := 'Y';
10217         END IF;
10218 
10219       ELSIF p_charges_detail_rec.price_list_id IS NULL OR
10220             p_charges_detail_rec.price_list_id = FND_API.G_MISS_NUM AND
10221             l_price_list_id IS NOT NULL THEN
10222 
10223         -- update the pricelist in the database with the new one
10224 
10225         x_charges_detail_rec.price_list_id := l_price_list_id;
10226         x_charges_detail_rec.currency_code := l_currency_code;
10227 
10228         --Condition added to fix Bug # 3358531
10229         IF x_charges_detail_rec.price_list_id <> l_db_det_rec.price_list_header_id OR
10230            x_charges_detail_rec.currency_code <> l_db_det_rec.currency_code THEN
10231           --price list or currecy code is changed need to re-calculate the list price
10232           l_calc_sp := 'Y';
10233         END IF;
10234 
10235       ELSIF p_charges_detail_rec.price_list_id <> FND_API.G_MISS_NUM AND
10236             p_charges_detail_rec.price_list_id IS NOT NULL AND
10237             l_price_list_id IS NULL THEN
10238 
10239         x_charges_detail_rec.price_list_id := p_charges_detail_rec.price_list_id;
10240         -- get currency_code for the price_list_id
10241         GET_CURRENCY_CODE(
10242               p_api_name        => l_api_name,
10243               p_price_list_id   => p_charges_detail_rec.price_list_id,
10244               x_currency_code   => l_currency_code,
10245               x_msg_data        => l_msg_data,
10246               x_msg_count       => l_msg_count,
10247               x_return_status   => l_return_status);
10248 
10249         IF (l_return_status <> FND_API.G_RET_STS_SUCCESS) THEN
10250           FND_MESSAGE.SET_NAME('CS', 'CS_CHG_GET_CURRENCY_CODE_ERROR');
10251           FND_MESSAGE.Set_Token('PRICE_LIST_ID', p_charges_detail_rec.price_list_id);
10252           --FND_MESSAGE.Set_Token('TEXT', l_msg_data, TRUE);
10253           FND_MSG_PUB.Add;
10254           RAISE FND_API.G_EXC_ERROR;
10255         END IF ;
10256 
10257              IF x_charges_detail_rec.currency_code <> l_currency_code AND l_currency_code is NOT NULL and x_charges_detail_rec.currency_code is not NUll
10258 	     and x_charges_detail_rec.currency_code <> FND_API.G_MISS_CHAR THEN --12.1.3, vpremach
10259 	        IF L_CURR_IN_CONVERSION_LIST <> 'Y' THEN
10260 		   FND_MESSAGE.SET_NAME('CS', 'CS_CHG_INVALID_CURRENCY_CODE');
10261 		   FND_MESSAGE.Set_Token('CURRENCY_CODE', p_charges_detail_rec.currency_code);
10262 		   FND_MSG_PUB.Add;
10263 		   RAISE FND_API.G_EXC_ERROR;
10264 	        END IF;
10265 	     ELSE
10266 	        x_charges_detail_rec.currency_code := l_currency_code;
10267 	     END IF;
10268 
10269          --Condition added to fix Bug # 3358531
10270          IF x_charges_detail_rec.price_list_id <> l_db_det_rec.price_list_header_id OR
10271             x_charges_detail_rec.currency_code <> l_db_det_rec.currency_code THEN
10272             --price list or currecy code is changed need to re-calculate the list price
10273             l_calc_sp := 'Y';
10274          END IF;
10275 
10276       ELSIF p_charges_detail_rec.price_list_id IS NULL OR
10277             p_charges_detail_rec.price_list_id = FND_API.G_MISS_NUM AND
10278             l_price_list_id IS NULL THEN
10279 
10280         --use the default from the price list
10281         x_charges_detail_rec.price_list_id := to_number(fnd_profile.value('CS_CHARGE_DEFAULT_PRICE_LIST'));
10282 
10283         -- get currency_code for the price_list_id
10284         GET_CURRENCY_CODE(
10285               p_api_name        => l_api_name,
10286               p_price_list_id   => x_charges_detail_rec.price_list_id,
10287               x_currency_code   => l_currency_code,
10288               x_msg_data        => l_msg_data,
10289               x_msg_count       => l_msg_count,
10290               x_return_status   => l_return_status);
10291 
10292         IF (l_return_status <> FND_API.G_RET_STS_SUCCESS) THEN
10293           FND_MESSAGE.SET_NAME('CS', 'CS_CHG_GET_CURRENCY_CODE_ERROR');
10294           FND_MESSAGE.Set_Token('PRICE_LIST_ID', x_charges_detail_rec.price_list_id);
10295           --FND_MESSAGE.Set_Token('TEXT', l_msg_data, TRUE);
10296           FND_MSG_PUB.Add;
10297           RAISE FND_API.G_EXC_ERROR;
10298         END IF ;
10299              IF x_charges_detail_rec.currency_code <> l_currency_code AND l_currency_code is NOT NULL and x_charges_detail_rec.currency_code is not NUll
10300 	     and x_charges_detail_rec.currency_code <> FND_API.G_MISS_CHAR THEN --12.1.3, vpremach
10301 	        IF L_CURR_IN_CONVERSION_LIST <> 'Y' THEN
10302 		   FND_MESSAGE.SET_NAME('CS', 'CS_CHG_INVALID_CURRENCY_CODE');
10303 		   FND_MESSAGE.Set_Token('CURRENCY_CODE', p_charges_detail_rec.currency_code);
10304 		   FND_MSG_PUB.Add;
10305 		   RAISE FND_API.G_EXC_ERROR;
10306 	        END IF;
10307 	     ELSE
10308 	        x_charges_detail_rec.currency_code := l_currency_code;
10309 	     END IF;
10310 
10311         --Condition added to fix Bug # 3358531
10312         IF x_charges_detail_rec.price_list_id <> l_db_det_rec.price_list_header_id OR
10313            x_charges_detail_rec.currency_code <> l_db_det_rec.currency_code THEN
10314           --price list or currecy code is changed need to re-calculate the list price
10315           l_calc_sp := 'Y';
10316         END IF;
10317       END IF;
10318     END IF;
10319 
10320   ELSIF p_charges_detail_rec.contract_id IS NULL  THEN
10321 
10322     --nullify the contract on the charge line
10323     --x_charges_detail_rec.contract_id := null;
10324     --x_charges_detail_rec.coverage_id := null;
10325     --x_charges_detail_rec.coverage_txn_group_id := null;
10326 
10327     -- Check to see if there is a price list passed
10328     IF p_charges_detail_rec.price_list_id <> FND_API.G_MISS_NUM AND
10329        p_charges_detail_rec.price_list_id IS NOT NULL THEN
10330 
10331        --assign these to the out parameters as these have already
10332        --been validated before
10333        x_charges_detail_rec.price_list_id := x_charges_detail_rec.price_list_id;
10334        x_charges_detail_rec.currency_code := x_charges_detail_rec.currency_code;
10335 
10336        --Condition added to fix Bug # 3358531
10337        IF x_charges_detail_rec.price_list_id <> l_db_det_rec.price_list_header_id OR
10338           x_charges_detail_rec.currency_code <> l_db_det_rec.currency_code THEN
10339           --price list or currecy code is changed need to re-calculate the list price
10340           l_calc_sp := 'Y';
10341        END IF;
10342 
10343     ELSIF p_charges_detail_rec.price_list_id = FND_API.G_MISS_NUM THEN
10344 
10345       IF l_db_det_rec.price_list_header_id IS NOT NULL THEN
10346 
10347           x_charges_detail_rec.price_list_id := l_db_det_rec.price_list_header_id;
10348 
10349           GET_CURRENCY_CODE(
10350               p_api_name        => l_api_name,
10351               p_price_list_id   => x_charges_detail_rec.price_list_id,
10352               x_currency_code   => l_currency_code,
10353               x_msg_data        => l_msg_data,
10354               x_msg_count       => l_msg_count,
10355               x_return_status   => l_return_status);
10356 
10357         IF (l_return_status <> FND_API.G_RET_STS_SUCCESS) THEN
10358           FND_MESSAGE.SET_NAME('CS', 'CS_CHG_GET_CURRENCY_CODE_ERROR');
10359           FND_MESSAGE.Set_Token('PRICE_LIST_ID', p_charges_detail_rec.price_list_id);
10360           --FND_MESSAGE.Set_Token('TEXT', l_msg_data, TRUE);
10361           FND_MSG_PUB.Add;
10362           RAISE FND_API.G_EXC_ERROR;
10363         END IF ;
10364 
10365              IF x_charges_detail_rec.currency_code <> l_currency_code AND l_currency_code is NOT NULL and x_charges_detail_rec.currency_code is not NUll
10366 	     and x_charges_detail_rec.currency_code <> FND_API.G_MISS_CHAR THEN --12.1.3, vpremach
10367 	        IF L_CURR_IN_CONVERSION_LIST <> 'Y' THEN
10368 		   FND_MESSAGE.SET_NAME('CS', 'CS_CHG_INVALID_CURRENCY_CODE');
10369 		   FND_MESSAGE.Set_Token('CURRENCY_CODE', p_charges_detail_rec.currency_code);
10370 		   FND_MSG_PUB.Add;
10371 		   RAISE FND_API.G_EXC_ERROR;
10372 	        END IF;
10373 	     ELSE
10374 	        x_charges_detail_rec.currency_code := l_currency_code;
10375 	     END IF;
10376 
10377         --Condition added to fix Bug # 3358531
10378         IF x_charges_detail_rec.currency_code <> l_db_det_rec.currency_code THEN
10379           --currecy code is changed need to re-calculate the list price
10380           l_calc_sp := 'Y';
10381         END IF;
10382 
10383     ELSE
10384 
10385       --get the default on the profile
10386       --use the default from the price list
10387       x_charges_detail_rec.price_list_id := to_number(fnd_profile.value('CS_CHARGE_DEFAULT_PRICE_LIST'));
10388 
10389       -- get currency_code for the price_list_id
10390       GET_CURRENCY_CODE(
10391             p_api_name        => l_api_name,
10392             p_price_list_id   => x_charges_detail_rec.price_list_id,
10393             x_currency_code   => l_currency_code,
10394             x_msg_data        => l_msg_data,
10395             x_msg_count       => l_msg_count,
10396             x_return_status   => l_return_status);
10397 
10398         IF (l_return_status <> FND_API.G_RET_STS_SUCCESS) THEN
10399           FND_MESSAGE.SET_NAME('CS', 'CS_CHG_GET_CURRENCY_CODE_ERROR');
10400           FND_MESSAGE.Set_Token('PRICE_LIST_ID', x_charges_detail_rec.price_list_id);
10401           --FND_MESSAGE.Set_Token('TEXT', l_msg_data, TRUE);
10402           FND_MSG_PUB.Add;
10403           RAISE FND_API.G_EXC_ERROR;
10404         END IF ;
10405              IF x_charges_detail_rec.currency_code <> l_currency_code AND l_currency_code is NOT NULL and x_charges_detail_rec.currency_code is not NUll
10406 	     and x_charges_detail_rec.currency_code <> FND_API.G_MISS_CHAR THEN --12.1.3, vpremach
10407 	        IF L_CURR_IN_CONVERSION_LIST <> 'Y' THEN
10408 		   FND_MESSAGE.SET_NAME('CS', 'CS_CHG_INVALID_CURRENCY_CODE');
10409 		   FND_MESSAGE.Set_Token('CURRENCY_CODE', p_charges_detail_rec.currency_code);
10410 		   FND_MSG_PUB.Add;
10411 		   RAISE FND_API.G_EXC_ERROR;
10412 	        END IF;
10413 	     ELSE
10414 	        x_charges_detail_rec.currency_code := l_currency_code;
10415 	     END IF;
10416 
10417         --Condition added to fix Bug # 3358531
10418         IF x_charges_detail_rec.price_list_id <> l_db_det_rec.price_list_header_id OR
10419            x_charges_detail_rec.currency_code <> l_db_det_rec.currency_code THEN
10420           --price list or currecy code is changed need to re-calculate the list price
10421           l_calc_sp := 'Y';
10422         END IF;
10423 
10424        END IF;
10425     END IF;
10426 
10427   ELSE
10428    -- no contract information coming in
10429    -- get what is in the database
10430    -- --DBMS_OUTPUT.PUT_LINE('contract coming from database');
10431     IF (x_charges_detail_rec.contract_id IS NULL) THEN
10432       x_charges_detail_rec.contract_id           := l_db_det_rec.contract_id;
10433     END IF;
10434 
10435     --DBMS_OUTPUT.PUT_LINE('x_charges_detail_rec.contract_id '||x_charges_detail_rec.contract_id);
10436     --DBMS_OUTPUT.PUT_LINE('x_charges_detail_rec.coverage_id '||x_charges_detail_rec.coverage_id);
10437     --DBMS_OUTPUT.PUT_LINE('x_charges_detail_rec.coverage_txn_group_id '||x_charges_detail_rec.coverage_txn_group_id);
10438 
10439 
10440     IF x_charges_detail_rec.contract_id IS NOT NULL THEN
10441 
10442        GET_CONTRACT_PRICE_LIST(
10443             p_api_name              => l_api_name,
10444             p_business_process_id   => x_charges_detail_rec.business_process_id,
10445             p_request_date          => l_request_date,
10446             p_contract_line_id      => x_charges_detail_rec.contract_line_id,
10447             x_price_list_id         => l_price_list_id,
10448             x_currency_code         => l_currency_code,
10449             x_msg_data              => l_msg_data,
10450             x_msg_count             => l_msg_count,
10451             x_return_status         => l_return_status);
10452 
10453        IF (l_return_status <> FND_API.G_RET_STS_SUCCESS) THEN
10454            FND_MESSAGE.SET_NAME('CS', 'CS_CHG_GET_CURRENCY_CODE_ERROR');
10455            FND_MESSAGE.Set_Token('PRICE_LIST_ID', x_charges_detail_rec.price_list_id);
10456            --FND_MESSAGE.Set_Token('TEXT', l_msg_data, TRUE);
10457            FND_MSG_PUB.Add;
10458            RAISE FND_API.G_EXC_ERROR;
10459         END IF ;
10460        --DBMS_OUTPUT.PUT_LINE ('l_price_list_id '||l_price_list_id);
10461        --DBMS_OUTPUT.PUT_LINE (' l_currency_code '||l_currency_code);
10462 
10463        IF p_charges_detail_rec.price_list_id <> FND_API.G_MISS_NUM AND
10464           p_charges_detail_rec.price_list_id IS NOT NULL AND
10465           l_price_list_id IS NOT NULL AND
10466 
10467           p_charges_detail_rec.price_list_id <> l_price_list_id THEN
10468 
10469           --Fixed To resolve Bug # 3557490
10470           --do nothing
10471           --since the price list is already derived there is no need to validate again
10472           --use the price list sent by the upstream application
10473           x_charges_detail_rec.price_list_id := p_charges_detail_rec.price_list_id;
10474 
10475           -- get currency_code for the price_list_id
10476           GET_CURRENCY_CODE(
10477               p_api_name        => l_api_name,
10478               p_price_list_id   => x_charges_detail_rec.price_list_id,
10479               x_currency_code   => l_currency_code,
10480               x_msg_data        => l_msg_data,
10481               x_msg_count       => l_msg_count,
10482               x_return_status   => l_return_status);
10483 
10484           IF (l_return_status <> FND_API.G_RET_STS_SUCCESS) THEN
10485             FND_MESSAGE.SET_NAME('CS', 'CS_CHG_GET_CURRENCY_CODE_ERROR');
10486             FND_MESSAGE.Set_Token('PRICE_LIST_ID', p_charges_detail_rec.price_list_id);
10487             --FND_MESSAGE.Set_Token('TEXT', l_msg_data, TRUE);
10488             FND_MSG_PUB.Add;
10489             RAISE FND_API.G_EXC_ERROR;
10490           END IF ;
10491 
10492              IF x_charges_detail_rec.currency_code <> l_currency_code AND l_currency_code is NOT NULL and x_charges_detail_rec.currency_code is not NUll
10493 	     and x_charges_detail_rec.currency_code <> FND_API.G_MISS_CHAR THEN --12.1.3, vpremach
10494 	        IF L_CURR_IN_CONVERSION_LIST <> 'Y' THEN
10495 		   FND_MESSAGE.SET_NAME('CS', 'CS_CHG_INVALID_CURRENCY_CODE');
10496 		   FND_MESSAGE.Set_Token('CURRENCY_CODE', p_charges_detail_rec.currency_code);
10497 		   FND_MSG_PUB.Add;
10498 		   RAISE FND_API.G_EXC_ERROR;
10499 	        END IF;
10500 	     ELSE
10501 	        x_charges_detail_rec.currency_code := l_currency_code;
10502 	     END IF;
10503 
10504           --Condition added to fix Bug # 3358531
10505           IF x_charges_detail_rec.price_list_id <> l_db_det_rec.price_list_header_id OR
10506             x_charges_detail_rec.currency_code <> l_db_det_rec.currency_code THEN
10507             --price list or currecy code is changed need to re-calculate the list price
10508             l_calc_sp := 'Y';
10509           END IF;
10510 
10511        ELSIF p_charges_detail_rec.price_list_id = FND_API.G_MISS_NUM THEN
10512 
10513           --DBMS_OUTPUT.PUT_LINE(' price list not passed using from db');
10514 
10515           x_charges_detail_rec.price_list_id := l_db_det_rec.price_list_header_id;
10516           x_charges_detail_rec.currency_code := l_db_det_rec.currency_code;
10517 
10518 
10519           --DBMS_OUTPUT.PUT_LINE('x_charges_detail_rec.price_list_id'||x_charges_detail_rec.price_list_id);
10520 
10521        ELSIF p_charges_detail_rec.price_list_id IS NULL AND
10522              l_price_list_id IS NOT NULL THEN
10523 
10524           x_charges_detail_rec.price_list_id := l_price_list_id;
10525           x_charges_detail_rec.currency_code := l_currency_code;
10526 
10527           --Condition added to fix Bug # 3358531
10528           IF x_charges_detail_rec.price_list_id <> l_db_det_rec.price_list_header_id OR
10529             x_charges_detail_rec.currency_code <> l_db_det_rec.currency_code THEN
10530             --price list or currecy code is changed need to re-calculate the list price
10531             l_calc_sp := 'Y';
10532           END IF;
10533 
10534        ELSIF p_charges_detail_rec.price_list_id <> FND_API.G_MISS_NUM AND
10535              p_charges_detail_rec.price_list_id IS NOT NULL AND
10536              l_price_list_id IS NULL THEN
10537 
10538            x_charges_detail_rec.price_list_id := p_charges_detail_rec.price_list_id;
10539 
10540             -- get currency_code for the price_list_id
10541             GET_CURRENCY_CODE(
10542                   p_api_name        => l_api_name,
10543                   p_price_list_id   => p_charges_detail_rec.price_list_id,
10544                   x_currency_code   => l_currency_code,
10545                   x_msg_data        => l_msg_data,
10546                   x_msg_count       => l_msg_count,
10547                   x_return_status   => l_return_status);
10548 
10549             IF (l_return_status <> FND_API.G_RET_STS_SUCCESS) THEN
10550               FND_MESSAGE.SET_NAME('CS', 'CS_CHG_GET_CURRENCY_CODE_ERROR');
10551               FND_MESSAGE.Set_Token('PRICE_LIST_ID', p_charges_detail_rec.price_list_id);
10552               --FND_MESSAGE.Set_Token('TEXT', l_msg_data, TRUE);
10553               FND_MSG_PUB.Add;
10554               RAISE FND_API.G_EXC_ERROR;
10555             END IF ;
10556 
10557             IF x_charges_detail_rec.currency_code <> l_currency_code AND l_currency_code is NOT NULL and x_charges_detail_rec.currency_code is not NUll
10558 	     and x_charges_detail_rec.currency_code <> FND_API.G_MISS_CHAR THEN --12.1.3, vpremach
10559 	        IF L_CURR_IN_CONVERSION_LIST <> 'Y' THEN
10560 		   FND_MESSAGE.SET_NAME('CS', 'CS_CHG_INVALID_CURRENCY_CODE');
10561 		   FND_MESSAGE.Set_Token('CURRENCY_CODE', p_charges_detail_rec.currency_code);
10562 		   FND_MSG_PUB.Add;
10563 		   RAISE FND_API.G_EXC_ERROR;
10564 	        END IF;
10565 	     ELSE
10566 	        x_charges_detail_rec.currency_code := l_currency_code;
10567 	     END IF;
10568 
10569             --Condition added to fix Bug # 3346568
10570             IF x_charges_detail_rec.price_list_id <> l_db_det_rec.price_list_header_id OR
10571               x_charges_detail_rec.currency_code <> l_db_det_rec.currency_code THEN
10572               --price list or currecy code is changed need to re-calculate the list price
10573               l_calc_sp := 'Y';
10574             END IF;
10575 
10576         ELSIF p_charges_detail_rec.price_list_id IS NULL AND
10577                 l_price_list_id IS NULL THEN
10578 
10579             --use the default from the price list
10580             x_charges_detail_rec.price_list_id := to_number(fnd_profile.value('CS_CHARGE_DEFAULT_PRICE_LIST'));
10581 
10582             -- get currency_code for the price_list_id
10583             GET_CURRENCY_CODE(
10584                   p_api_name        => l_api_name,
10585                   p_price_list_id   => x_charges_detail_rec.price_list_id,
10586                   x_currency_code   => l_currency_code,
10587                   x_msg_data        => l_msg_data,
10588                   x_msg_count       => l_msg_count,
10589                   x_return_status   => l_return_status);
10590 
10591             IF (l_return_status <> FND_API.G_RET_STS_SUCCESS) THEN
10592               FND_MESSAGE.SET_NAME('CS', 'CS_CHG_GET_CURRENCY_CODE_ERROR');
10593               FND_MESSAGE.Set_Token('PRICE_LIST_ID', x_charges_detail_rec.price_list_id);
10594               --FND_MESSAGE.Set_Token('TEXT', l_msg_data, TRUE);
10595               FND_MSG_PUB.Add;
10596               RAISE FND_API.G_EXC_ERROR;
10597             END IF ;
10598             IF x_charges_detail_rec.currency_code <> l_currency_code AND l_currency_code is NOT NULL and x_charges_detail_rec.currency_code is not NUll
10599 	     and x_charges_detail_rec.currency_code <> FND_API.G_MISS_CHAR THEN --12.1.3, vpremach
10600 	        IF L_CURR_IN_CONVERSION_LIST <> 'Y' THEN
10601 
10602 		   FND_MESSAGE.SET_NAME('CS', 'CS_CHG_INVALID_CURRENCY_CODE');
10603 		   FND_MESSAGE.Set_Token('CURRENCY_CODE', p_charges_detail_rec.currency_code);
10604 		   FND_MSG_PUB.Add;
10605 		   RAISE FND_API.G_EXC_ERROR;
10606 	        END IF;
10607 	     ELSE
10608 	        x_charges_detail_rec.currency_code := l_currency_code;
10609 	     END IF;
10610 
10611             --Condition added to fix Bug # 3358531
10612             IF x_charges_detail_rec.price_list_id <> l_db_det_rec.price_list_header_id OR
10613               x_charges_detail_rec.currency_code <> l_db_det_rec.currency_code THEN
10614               --price list or currecy code is changed need to re-calculate the list price
10615               l_calc_sp := 'Y';
10616             END IF;
10617        END IF;
10618 
10619     ELSE
10620       --all three are null
10621       --update what is come on the line
10622 
10623       --DBMS_OUTPUT.PUT_LINE(' No Contract Information');
10624 
10625       IF p_charges_detail_rec.price_list_id <> FND_API.G_MISS_NUM AND
10626          p_charges_detail_rec.price_list_id IS NOT NULL THEN
10627 
10628             x_charges_detail_rec.price_list_id := p_charges_detail_rec.price_list_id;
10629 
10630             -- get currency_code for the price_list_id
10631             GET_CURRENCY_CODE(
10632                   p_api_name        => l_api_name,
10633                   p_price_list_id   => p_charges_detail_rec.price_list_id,
10634                   x_currency_code   => l_currency_code,
10635                   x_msg_data        => l_msg_data,
10636                   x_msg_count       => l_msg_count,
10637                   x_return_status   => l_return_status);
10638 
10639             IF (l_return_status <> FND_API.G_RET_STS_SUCCESS) THEN
10640               FND_MESSAGE.Set_Token('PRICE_LIST_ID', p_charges_detail_rec.price_list_id);
10641               --FND_MESSAGE.Set_Token('TEXT', l_msg_data, TRUE);
10642               FND_MSG_PUB.Add;
10643               RAISE FND_API.G_EXC_ERROR;
10644             END IF ;
10645 
10646             IF x_charges_detail_rec.currency_code <> l_currency_code AND l_currency_code is NOT NULL and x_charges_detail_rec.currency_code is not NUll
10647 	     and x_charges_detail_rec.currency_code <> FND_API.G_MISS_CHAR THEN --12.1.3, vpremach
10648 	        IF L_CURR_IN_CONVERSION_LIST <> 'Y' THEN
10649 		   FND_MESSAGE.SET_NAME('CS', 'CS_CHG_INVALID_CURRENCY_CODE');
10650 		   FND_MESSAGE.Set_Token('CURRENCY_CODE', p_charges_detail_rec.currency_code);
10651 		   FND_MSG_PUB.Add;
10652 		   RAISE FND_API.G_EXC_ERROR;
10653 	        END IF;
10654 	     ELSE
10655 	        x_charges_detail_rec.currency_code := l_currency_code;
10656 	     END IF;
10657 
10658             --Condition added to fix Bug # 3358531
10659             IF x_charges_detail_rec.price_list_id <> l_db_det_rec.price_list_header_id OR
10660               x_charges_detail_rec.currency_code <> l_db_det_rec.currency_code THEN
10661               --price list or currecy code is changed need to re-calculate the list price
10662               l_calc_sp := 'Y';
10663             END IF;
10664 
10665         ELSE
10666 
10667 
10668           IF l_db_det_rec.price_list_header_id IS NOT NULL THEN
10669                x_charges_detail_rec.price_list_id := l_db_det_rec.price_list_header_id;
10670                -- get currency_code for the price_list_id
10671                GET_CURRENCY_CODE(
10672                   p_api_name        => l_api_name,
10673                   p_price_list_id   => x_charges_detail_rec.price_list_id,
10674                   x_currency_code   => l_currency_code,
10675                   x_msg_data        => l_msg_data,
10676                   x_msg_count       => l_msg_count,
10677                   x_return_status   => l_return_status);
10678 
10679             IF (l_return_status <> FND_API.G_RET_STS_SUCCESS) THEN
10680               FND_MESSAGE.SET_NAME('CS', 'CS_CHG_GET_CURRENCY_CODE_ERROR');
10681               FND_MESSAGE.Set_Token('PRICE_LIST_ID', x_charges_detail_rec.price_list_id);
10682               --FND_MESSAGE.Set_Token('TEXT', l_msg_data, TRUE);
10683               FND_MSG_PUB.Add;
10684               RAISE FND_API.G_EXC_ERROR;
10685             END IF ;
10686             IF x_charges_detail_rec.currency_code <> l_currency_code AND l_currency_code is NOT NULL and x_charges_detail_rec.currency_code is not NUll
10687 	     and x_charges_detail_rec.currency_code <> FND_API.G_MISS_CHAR THEN --12.1.3, vpremach
10688 	        IF L_CURR_IN_CONVERSION_LIST <> 'Y' THEN
10689 		   FND_MESSAGE.SET_NAME('CS', 'CS_CHG_INVALID_CURRENCY_CODE');
10690 		   FND_MESSAGE.Set_Token('CURRENCY_CODE', p_charges_detail_rec.currency_code);
10691 		   FND_MSG_PUB.Add;
10692 		   RAISE FND_API.G_EXC_ERROR;
10693 	        END IF;
10694 	     ELSE
10695 	        x_charges_detail_rec.currency_code := l_currency_code;
10696 	     END IF;
10697 
10698             --Condition added to fix Bug # 3358531
10699             IF x_charges_detail_rec.currency_code <> l_db_det_rec.currency_code THEN
10700               --currecy code is changed need to re-calculate the list price
10701               l_calc_sp := 'Y';
10702             END IF;
10703 
10704           ELSE
10705             --use the default from the price list
10706             x_charges_detail_rec.price_list_id := to_number(fnd_profile.value('CS_CHARGE_DEFAULT_PRICE_LIST'));
10707 
10708             -- get currency_code for the price_list_id
10709             GET_CURRENCY_CODE(
10710                   p_api_name        => l_api_name,
10711                   p_price_list_id   => x_charges_detail_rec.price_list_id,
10712                   x_currency_code   => l_currency_code,
10713                   x_msg_data        => l_msg_data,
10714                   x_msg_count       => l_msg_count,
10715                   x_return_status   => l_return_status);
10716 
10717             IF (l_return_status <> FND_API.G_RET_STS_SUCCESS) THEN
10718               FND_MESSAGE.SET_NAME('CS', 'CS_CHG_GET_CURRENCY_CODE_ERROR');
10719               FND_MESSAGE.Set_Token('PRICE_LIST_ID', x_charges_detail_rec.price_list_id);
10720               --FND_MESSAGE.Set_Token('TEXT', l_msg_data, TRUE);
10721               FND_MSG_PUB.Add;
10722               RAISE FND_API.G_EXC_ERROR;
10723             END IF ;
10724             IF x_charges_detail_rec.currency_code <> l_currency_code AND l_currency_code is NOT NULL and x_charges_detail_rec.currency_code is not NUll
10725 	     and x_charges_detail_rec.currency_code <> FND_API.G_MISS_CHAR THEN --12.1.3, vpremach
10726 	        IF L_CURR_IN_CONVERSION_LIST <> 'Y' THEN
10727 		   FND_MESSAGE.SET_NAME('CS', 'CS_CHG_INVALID_CURRENCY_CODE');
10728 		   FND_MESSAGE.Set_Token('CURRENCY_CODE', p_charges_detail_rec.currency_code);
10729 		   FND_MSG_PUB.Add;
10730 		   RAISE FND_API.G_EXC_ERROR;
10731 	        END IF;
10732 	     ELSE
10733 	        x_charges_detail_rec.currency_code := l_currency_code;
10734 	     END IF;
10735 
10736             --Condition added to fix Bug # 3358531
10737             IF x_charges_detail_rec.price_list_id <> l_db_det_rec.price_list_header_id OR
10738                x_charges_detail_rec.currency_code <> l_db_det_rec.currency_code THEN
10739                --price list or currecy code is changed need to re-calculate the list price
10740                l_calc_sp := 'Y';
10741             END IF;
10742          END IF;
10743        END IF;
10744     END IF;
10745   END IF;
10746 END IF;
10747 
10748 --DBMS_OUTPUT.PUT_LINE('x_charges_detail_rec.price_list_id'||x_charges_detail_rec.price_list_id);
10749 --DBMS_OUTPUT.PUT_LINE('x_charges_detail_rec.currency_code '||x_charges_detail_rec.currency_code);
10750 --DBMS_OUTPUT.PUT_LINE('contract_id '||x_charges_detail_rec.contract_id);
10751 
10752 
10753 -- ========================================
10754 -- Check currency coversion
10755 -- ========================================
10756 --DBMS_OUTPUT.PUT_LINE('Check currency coversion ...');
10757 
10758 IF p_validation_mode IN ('I', 'U') THEN
10759 
10760   l_conversion_needed_flag := 'N';
10761   x_charges_detail_rec.conversion_rate := null;
10762   x_charges_detail_rec.conversion_type_code := null;
10763   x_charges_detail_rec.conversion_rate_date := null;
10764 
10765   IF p_charges_detail_rec.currency_code <> FND_API.G_MISS_CHAR AND
10766      p_charges_detail_rec.currency_code IS NOT NULL AND
10767      p_charges_detail_rec.currency_code <> x_charges_detail_rec.currency_code THEN
10768 
10769     IF l_billing_flag = 'E' THEN
10770 
10771       -- Contract exists for the Charge Line
10772       -- Convert the currency to the currency derived from Contract
10773 
10774       --DBMS_OUTPUT.PUT_LINE('Conversion Needed');
10775 
10776       l_conversion_needed_flag := 'Y';
10777 
10778       --call get_conversion_rate API
10779       Get_Conversion_Rate(
10780         p_api_name        => p_api_name,
10781         p_from_currency   => p_charges_detail_rec.currency_code,
10782         p_to_currency     => x_charges_detail_rec.currency_code,
10783         x_denominator     => l_denominator,
10784         x_numerator       => l_numerator,
10785         x_rate            => l_rate,
10786         x_return_status   => l_return_status);
10787 
10788         --DBMS_OUTPUT.PUT_LINE('l_rate '||l_rate);
10789 
10790       IF l_return_status <> FND_API.G_RET_STS_SUCCESS THEN
10791         FND_MESSAGE.SET_NAME('CS', 'CS_CHG_CURRENCY_CONVERSION_ERR');
10792         FND_MESSAGE.Set_Token('FROM_CURRENCY', p_charges_detail_rec.currency_code);
10793         FND_MESSAGE.Set_Token('TO_CURRENCY', x_charges_detail_rec.currency_code);
10794         FND_MSG_PUB.Add;
10795         RAISE FND_API.G_EXC_ERROR;
10796       END IF;
10797       --assign values to out record for conversion_rate, conversion_type_code
10798       --conversion_rate_date
10799       x_charges_detail_rec.conversion_rate := l_rate;
10800       x_charges_detail_rec.conversion_type_code := FND_PROFILE.VALUE('CS_CHG_DEFAULT_CONVERSION_TYPE');
10801       x_charges_detail_rec.conversion_rate_date := SYSDATE;
10802 
10803     ELSE
10804 
10805       --this should be an error because what comes in must mastch the derived currency code
10806       --RAISE FND_API.G_EXC_ERROR;
10807       --null;
10808       IF L_CURR_IN_CONVERSION_LIST <> 'Y' THEN --srini
10809          FND_MESSAGE.SET_NAME('CS', 'CS_CHG_INVALID_CURRENCY_CODE');
10810          FND_MESSAGE.Set_Token('CURRENCY_CODE', p_charges_detail_rec.currency_code);
10811          FND_MSG_PUB.Add;
10812          RAISE FND_API.G_EXC_ERROR;
10813       Else--srini
10814          IF p_charges_detail_rec.list_price is not null AND
10815 	    p_charges_detail_rec.list_price <> FND_API.G_MISS_NUM Then
10816             x_charges_detail_rec.currency_code := p_charges_detail_rec.currency_code; --srini
10817 	 Else
10818          FND_MESSAGE.SET_NAME('CS', 'CS_CHG_INVALID_CURRENCY_CODE');
10819          FND_MESSAGE.Set_Token('CURRENCY_CODE', p_charges_detail_rec.currency_code);
10820          FND_MSG_PUB.Add;
10821          RAISE FND_API.G_EXC_ERROR;
10822 	 End IF; --srini
10823       End If;--srini
10824     END IF;
10825 
10826   END IF;
10827 
10828 END IF;
10829 
10830 --DBMS_OUTPUT.PUT_LINE('l_conversion_flag'||l_conversion_needed_flag);
10831 
10832 
10833 --=========================================
10834 -- Assign Values to Charges Flex fields
10835 -- in the out record
10836 --==========================================
10837 IF p_validation_mode = 'I' THEN
10838   x_charges_detail_rec.context       := p_charges_detail_rec.context ;
10839   x_charges_detail_rec.attribute1    := p_charges_detail_rec.attribute1 ;
10840   x_charges_detail_rec.attribute2    := p_charges_detail_rec.attribute2 ;
10841   x_charges_detail_rec.attribute3    := p_charges_detail_rec.attribute3 ;
10842   x_charges_detail_rec.attribute4    := p_charges_detail_rec.attribute4 ;
10843   x_charges_detail_rec.attribute5    := p_charges_detail_rec.attribute5 ;
10844   x_charges_detail_rec.attribute6    := p_charges_detail_rec.attribute6 ;
10845   x_charges_detail_rec.attribute7    := p_charges_detail_rec.attribute7 ;
10846   x_charges_detail_rec.attribute8    := p_charges_detail_rec.attribute8 ;
10847   x_charges_detail_rec.attribute9    := p_charges_detail_rec.attribute9 ;
10848   x_charges_detail_rec.attribute10   := p_charges_detail_rec.attribute10 ;
10849   x_charges_detail_rec.attribute11   := p_charges_detail_rec.attribute11 ;
10850   x_charges_detail_rec.attribute12   := p_charges_detail_rec.attribute12 ;
10851   x_charges_detail_rec.attribute13   := p_charges_detail_rec.attribute13 ;
10852   x_charges_detail_rec.attribute14   := p_charges_detail_rec.attribute14 ;
10853   x_charges_detail_rec.attribute15   := p_charges_detail_rec.attribute15 ;
10854 
10855 --=========================================
10856 -- Assign values to Pricing Flex fields
10857 -- in out record
10858 --=========================================
10859   x_charges_detail_rec.pricing_context       := p_charges_detail_rec.pricing_context ;
10860   x_charges_detail_rec.pricing_attribute1    := p_charges_detail_rec.pricing_attribute1 ;
10861   x_charges_detail_rec.pricing_attribute2    := p_charges_detail_rec.pricing_attribute2 ;
10862   x_charges_detail_rec.pricing_attribute3    := p_charges_detail_rec.pricing_attribute3 ;
10863   x_charges_detail_rec.pricing_attribute4    := p_charges_detail_rec.pricing_attribute4 ;
10864   x_charges_detail_rec.pricing_attribute5    := p_charges_detail_rec.pricing_attribute5 ;
10865   x_charges_detail_rec.pricing_attribute6    := p_charges_detail_rec.pricing_attribute6 ;
10866   x_charges_detail_rec.pricing_attribute7    := p_charges_detail_rec.pricing_attribute7 ;
10867   x_charges_detail_rec.pricing_attribute8    := p_charges_detail_rec.pricing_attribute8 ;
10868   x_charges_detail_rec.pricing_attribute9    := p_charges_detail_rec.pricing_attribute9 ;
10869   x_charges_detail_rec.pricing_attribute10   := p_charges_detail_rec.pricing_attribute10 ;
10870   x_charges_detail_rec.pricing_attribute11   := p_charges_detail_rec.pricing_attribute11 ;
10871   x_charges_detail_rec.pricing_attribute12   := p_charges_detail_rec.pricing_attribute12 ;
10872   x_charges_detail_rec.pricing_attribute13   := p_charges_detail_rec.pricing_attribute13 ;
10873   x_charges_detail_rec.pricing_attribute14   := p_charges_detail_rec.pricing_attribute14 ;
10874   x_charges_detail_rec.pricing_attribute15   := p_charges_detail_rec.pricing_attribute15 ;
10875   x_charges_detail_rec.pricing_attribute16   := p_charges_detail_rec.pricing_attribute16 ;
10876   x_charges_detail_rec.pricing_attribute17   := p_charges_detail_rec.pricing_attribute17 ;
10877   x_charges_detail_rec.pricing_attribute18   := p_charges_detail_rec.pricing_attribute18 ;
10878   x_charges_detail_rec.pricing_attribute19   := p_charges_detail_rec.pricing_attribute19 ;
10879   x_charges_detail_rec.pricing_attribute20   := p_charges_detail_rec.pricing_attribute20 ;
10880   x_charges_detail_rec.pricing_attribute21   := p_charges_detail_rec.pricing_attribute21 ;
10881   x_charges_detail_rec.pricing_attribute22   := p_charges_detail_rec.pricing_attribute22 ;
10882   x_charges_detail_rec.pricing_attribute23   := p_charges_detail_rec.pricing_attribute23 ;
10883   x_charges_detail_rec.pricing_attribute24   := p_charges_detail_rec.pricing_attribute24 ;
10884   x_charges_detail_rec.pricing_attribute25   := p_charges_detail_rec.pricing_attribute25 ;
10885   x_charges_detail_rec.pricing_attribute26   := p_charges_detail_rec.pricing_attribute26 ;
10886   x_charges_detail_rec.pricing_attribute27   := p_charges_detail_rec.pricing_attribute27 ;
10887   x_charges_detail_rec.pricing_attribute28   := p_charges_detail_rec.pricing_attribute28 ;
10888   x_charges_detail_rec.pricing_attribute29   := p_charges_detail_rec.pricing_attribute29 ;
10889   x_charges_detail_rec.pricing_attribute30   := p_charges_detail_rec.pricing_attribute30 ;
10890   x_charges_detail_rec.pricing_attribute31   := p_charges_detail_rec.pricing_attribute31 ;
10891   x_charges_detail_rec.pricing_attribute32   := p_charges_detail_rec.pricing_attribute32 ;
10892   x_charges_detail_rec.pricing_attribute33   := p_charges_detail_rec.pricing_attribute33 ;
10893   x_charges_detail_rec.pricing_attribute34   := p_charges_detail_rec.pricing_attribute34 ;
10894   x_charges_detail_rec.pricing_attribute35   := p_charges_detail_rec.pricing_attribute35 ;
10895   x_charges_detail_rec.pricing_attribute36   := p_charges_detail_rec.pricing_attribute36 ;
10896   x_charges_detail_rec.pricing_attribute37   := p_charges_detail_rec.pricing_attribute37 ;
10897   x_charges_detail_rec.pricing_attribute38   := p_charges_detail_rec.pricing_attribute38 ;
10898   x_charges_detail_rec.pricing_attribute39   := p_charges_detail_rec.pricing_attribute39 ;
10899   x_charges_detail_rec.pricing_attribute40   := p_charges_detail_rec.pricing_attribute40 ;
10900   x_charges_detail_rec.pricing_attribute41   := p_charges_detail_rec.pricing_attribute41 ;
10901   x_charges_detail_rec.pricing_attribute42   := p_charges_detail_rec.pricing_attribute42 ;
10902   x_charges_detail_rec.pricing_attribute43   := p_charges_detail_rec.pricing_attribute43 ;
10903   x_charges_detail_rec.pricing_attribute44   := p_charges_detail_rec.pricing_attribute44 ;
10904   x_charges_detail_rec.pricing_attribute45   := p_charges_detail_rec.pricing_attribute45 ;
10905   x_charges_detail_rec.pricing_attribute46   := p_charges_detail_rec.pricing_attribute46 ;
10906   x_charges_detail_rec.pricing_attribute47   := p_charges_detail_rec.pricing_attribute47 ;
10907   x_charges_detail_rec.pricing_attribute48   := p_charges_detail_rec.pricing_attribute48 ;
10908   x_charges_detail_rec.pricing_attribute49   := p_charges_detail_rec.pricing_attribute49 ;
10909   x_charges_detail_rec.pricing_attribute50   := p_charges_detail_rec.pricing_attribute50 ;
10910   x_charges_detail_rec.pricing_attribute51   := p_charges_detail_rec.pricing_attribute51 ;
10911   x_charges_detail_rec.pricing_attribute52   := p_charges_detail_rec.pricing_attribute52 ;
10912   x_charges_detail_rec.pricing_attribute53   := p_charges_detail_rec.pricing_attribute53 ;
10913   x_charges_detail_rec.pricing_attribute54   := p_charges_detail_rec.pricing_attribute54 ;
10914   x_charges_detail_rec.pricing_attribute55   := p_charges_detail_rec.pricing_attribute55 ;
10915   x_charges_detail_rec.pricing_attribute56   := p_charges_detail_rec.pricing_attribute56 ;
10916   x_charges_detail_rec.pricing_attribute57   := p_charges_detail_rec.pricing_attribute57 ;
10917   x_charges_detail_rec.pricing_attribute58   := p_charges_detail_rec.pricing_attribute58 ;
10918   x_charges_detail_rec.pricing_attribute59   := p_charges_detail_rec.pricing_attribute59 ;
10919   x_charges_detail_rec.pricing_attribute60   := p_charges_detail_rec.pricing_attribute60 ;
10920   x_charges_detail_rec.pricing_attribute61   := p_charges_detail_rec.pricing_attribute61 ;
10921   x_charges_detail_rec.pricing_attribute62   := p_charges_detail_rec.pricing_attribute62 ;
10922   x_charges_detail_rec.pricing_attribute63   := p_charges_detail_rec.pricing_attribute63 ;
10923   x_charges_detail_rec.pricing_attribute64   := p_charges_detail_rec.pricing_attribute64 ;
10924   x_charges_detail_rec.pricing_attribute65   := p_charges_detail_rec.pricing_attribute65 ;
10925   x_charges_detail_rec.pricing_attribute66   := p_charges_detail_rec.pricing_attribute66 ;
10926   x_charges_detail_rec.pricing_attribute67   := p_charges_detail_rec.pricing_attribute67 ;
10927   x_charges_detail_rec.pricing_attribute68   := p_charges_detail_rec.pricing_attribute68 ;
10928   x_charges_detail_rec.pricing_attribute69   := p_charges_detail_rec.pricing_attribute69 ;
10929   x_charges_detail_rec.pricing_attribute70   := p_charges_detail_rec.pricing_attribute70 ;
10930   x_charges_detail_rec.pricing_attribute71   := p_charges_detail_rec.pricing_attribute71 ;
10931   x_charges_detail_rec.pricing_attribute72   := p_charges_detail_rec.pricing_attribute72 ;
10932   x_charges_detail_rec.pricing_attribute73   := p_charges_detail_rec.pricing_attribute73 ;
10933   x_charges_detail_rec.pricing_attribute74   := p_charges_detail_rec.pricing_attribute74 ;
10934   x_charges_detail_rec.pricing_attribute75   := p_charges_detail_rec.pricing_attribute75 ;
10935   x_charges_detail_rec.pricing_attribute76   := p_charges_detail_rec.pricing_attribute76 ;
10936   x_charges_detail_rec.pricing_attribute77   := p_charges_detail_rec.pricing_attribute77 ;
10937   x_charges_detail_rec.pricing_attribute78   := p_charges_detail_rec.pricing_attribute78 ;
10938   x_charges_detail_rec.pricing_attribute79   := p_charges_detail_rec.pricing_attribute79 ;
10939   x_charges_detail_rec.pricing_attribute80   := p_charges_detail_rec.pricing_attribute80 ;
10940   x_charges_detail_rec.pricing_attribute81   := p_charges_detail_rec.pricing_attribute81 ;
10941   x_charges_detail_rec.pricing_attribute82   := p_charges_detail_rec.pricing_attribute82 ;
10942   x_charges_detail_rec.pricing_attribute83   := p_charges_detail_rec.pricing_attribute83 ;
10943   x_charges_detail_rec.pricing_attribute84   := p_charges_detail_rec.pricing_attribute84 ;
10944   x_charges_detail_rec.pricing_attribute85   := p_charges_detail_rec.pricing_attribute85 ;
10945   x_charges_detail_rec.pricing_attribute86   := p_charges_detail_rec.pricing_attribute86 ;
10946   x_charges_detail_rec.pricing_attribute87   := p_charges_detail_rec.pricing_attribute87 ;
10947   x_charges_detail_rec.pricing_attribute88   := p_charges_detail_rec.pricing_attribute88 ;
10948   x_charges_detail_rec.pricing_attribute89   := p_charges_detail_rec.pricing_attribute89 ;
10949   x_charges_detail_rec.pricing_attribute90   := p_charges_detail_rec.pricing_attribute90 ;
10950   x_charges_detail_rec.pricing_attribute91   := p_charges_detail_rec.pricing_attribute91 ;
10951   x_charges_detail_rec.pricing_attribute92   := p_charges_detail_rec.pricing_attribute92 ;
10952   x_charges_detail_rec.pricing_attribute93   := p_charges_detail_rec.pricing_attribute93 ;
10953   x_charges_detail_rec.pricing_attribute94   := p_charges_detail_rec.pricing_attribute94 ;
10954   x_charges_detail_rec.pricing_attribute95   := p_charges_detail_rec.pricing_attribute95 ;
10955   x_charges_detail_rec.pricing_attribute96   := p_charges_detail_rec.pricing_attribute96 ;
10956   x_charges_detail_rec.pricing_attribute97   := p_charges_detail_rec.pricing_attribute97 ;
10957   x_charges_detail_rec.pricing_attribute98   := p_charges_detail_rec.pricing_attribute98 ;
10958   x_charges_detail_rec.pricing_attribute99   := p_charges_detail_rec.pricing_attribute99 ;
10959   x_charges_detail_rec.pricing_attribute100  := p_charges_detail_rec.pricing_attribute100 ;
10960 
10961 ELSIF p_validation_mode = 'U' THEN
10962 
10963  -- Bug Fix for Bug # 3078247
10964  -- Added code to handle the update of attributes
10965 
10966  --=========================================
10967 -- Assign Values to Charges Flex fields
10968 -- in the out record
10969 --==========================================
10970  IF p_charges_detail_rec.context = FND_API.G_MISS_CHAR THEN
10971 
10972    -- get the values from the database
10973    x_charges_detail_rec.context      := l_db_det_rec.context;
10974    x_charges_detail_rec.attribute1   := l_db_det_rec.attribute1;
10975    x_charges_detail_rec.attribute2   := l_db_det_rec.attribute2;
10976    x_charges_detail_rec.attribute3   := l_db_det_rec.attribute3;
10977    x_charges_detail_rec.attribute4   := l_db_det_rec.attribute4;
10978    x_charges_detail_rec.attribute5   := l_db_det_rec.attribute5;
10979    x_charges_detail_rec.attribute6   := l_db_det_rec.attribute6;
10980    x_charges_detail_rec.attribute7   := l_db_det_rec.attribute7;
10981    x_charges_detail_rec.attribute8   := l_db_det_rec.attribute8;
10982    x_charges_detail_rec.attribute9   := l_db_det_rec.attribute9;
10983    x_charges_detail_rec.attribute10  := l_db_det_rec.attribute10;
10984    x_charges_detail_rec.attribute11  := l_db_det_rec.attribute11;
10985    x_charges_detail_rec.attribute12  := l_db_det_rec.attribute12;
10986    x_charges_detail_rec.attribute13  := l_db_det_rec.attribute13;
10987    x_charges_detail_rec.attribute14  := l_db_det_rec.attribute14;
10988    x_charges_detail_rec.attribute15  := l_db_det_rec.attribute15;
10989 
10990  ELSIF
10991    p_charges_detail_rec.context IS NULL THEN
10992 
10993    -- nullify all values for the descriptive flex
10994    x_charges_detail_rec.context      := null;
10995    x_charges_detail_rec.attribute1   := null;
10996    x_charges_detail_rec.attribute2   := null;
10997    x_charges_detail_rec.attribute3   := null;
10998    x_charges_detail_rec.attribute4   := null;
10999    x_charges_detail_rec.attribute5   := null;
11000    x_charges_detail_rec.attribute6   := null;
11001    x_charges_detail_rec.attribute7   := null;
11002    x_charges_detail_rec.attribute8   := null;
11003    x_charges_detail_rec.attribute9   := null;
11004    x_charges_detail_rec.attribute10  := null;
11005    x_charges_detail_rec.attribute11  := null;
11006    x_charges_detail_rec.attribute12  := null;
11007    x_charges_detail_rec.attribute13  := null;
11008    x_charges_detail_rec.attribute14  := null;
11009    x_charges_detail_rec.attribute15  := null;
11010 
11011   ELSE
11012 
11013     x_charges_detail_rec.context     := p_charges_detail_rec.context ;
11014 
11015     IF p_charges_detail_rec.attribute1 = FND_API.G_MISS_CHAR THEN
11016       x_charges_detail_rec.attribute1  := null;
11017     ELSE
11018       x_charges_detail_rec.attribute1  := p_charges_detail_rec.attribute1;
11019     END IF;
11020 
11021     IF p_charges_detail_rec.attribute2 = FND_API.G_MISS_CHAR THEN
11022       x_charges_detail_rec.attribute2  := null;
11023     ELSE
11024       x_charges_detail_rec.attribute2  := p_charges_detail_rec.attribute2;
11025     END IF;
11026 
11027     IF p_charges_detail_rec.attribute3 = FND_API.G_MISS_CHAR THEN
11028       x_charges_detail_rec.attribute3  := null;
11029     ELSE
11030       x_charges_detail_rec.attribute3  := p_charges_detail_rec.attribute3;
11031     END IF;
11032 
11033     IF p_charges_detail_rec.attribute4 = FND_API.G_MISS_CHAR THEN
11034       x_charges_detail_rec.attribute4  := null;
11035     ELSE
11036       x_charges_detail_rec.attribute4  := p_charges_detail_rec.attribute4;
11037     END IF;
11038 
11039     IF p_charges_detail_rec.attribute5 = FND_API.G_MISS_CHAR THEN
11040       x_charges_detail_rec.attribute5  := null;
11041     ELSE
11042       x_charges_detail_rec.attribute5  := p_charges_detail_rec.attribute5;
11043     END IF;
11044 
11045      IF p_charges_detail_rec.attribute6 = FND_API.G_MISS_CHAR THEN
11046       x_charges_detail_rec.attribute6  := null;
11047     ELSE
11048       x_charges_detail_rec.attribute6  := p_charges_detail_rec.attribute6;
11049     END IF;
11050 
11051     IF p_charges_detail_rec.attribute7 = FND_API.G_MISS_CHAR THEN
11052       x_charges_detail_rec.attribute7  := null;
11053     ELSE
11054       x_charges_detail_rec.attribute7  := p_charges_detail_rec.attribute7;
11055     END IF;
11056 
11057     IF p_charges_detail_rec.attribute8 = FND_API.G_MISS_CHAR THEN
11058       x_charges_detail_rec.attribute8  := null;
11059     ELSE
11060       x_charges_detail_rec.attribute8  := p_charges_detail_rec.attribute8;
11061     END IF;
11062 
11063     IF p_charges_detail_rec.attribute9 = FND_API.G_MISS_CHAR THEN
11064       x_charges_detail_rec.attribute9  := null;
11065     ELSE
11066       x_charges_detail_rec.attribute9  := p_charges_detail_rec.attribute9;
11067     END IF;
11068 
11069     IF p_charges_detail_rec.attribute10 = FND_API.G_MISS_CHAR THEN
11070       x_charges_detail_rec.attribute10  := null;
11071     ELSE
11072       x_charges_detail_rec.attribute10 := p_charges_detail_rec.attribute10;
11073     END IF;
11074 
11075     IF p_charges_detail_rec.attribute11 = FND_API.G_MISS_CHAR THEN
11076       x_charges_detail_rec.attribute11  := null;
11077     ELSE
11078       x_charges_detail_rec.attribute11  := p_charges_detail_rec.attribute11;
11079     END IF;
11080 
11081     IF p_charges_detail_rec.attribute12 = FND_API.G_MISS_CHAR THEN
11082       x_charges_detail_rec.attribute12  := null;
11083     ELSE
11084       x_charges_detail_rec.attribute12  := p_charges_detail_rec.attribute12;
11085     END IF;
11086 
11087     IF p_charges_detail_rec.attribute13 = FND_API.G_MISS_CHAR THEN
11088       x_charges_detail_rec.attribute13  := null;
11089     ELSE
11090       x_charges_detail_rec.attribute13  := p_charges_detail_rec.attribute13;
11091     END IF;
11092 
11093     IF p_charges_detail_rec.attribute14 = FND_API.G_MISS_CHAR THEN
11094       x_charges_detail_rec.attribute14  := null;
11095     ELSE
11096       x_charges_detail_rec.attribute14  := p_charges_detail_rec.attribute14;
11097     END IF;
11098 
11099     IF p_charges_detail_rec.attribute15 = FND_API.G_MISS_CHAR THEN
11100       x_charges_detail_rec.attribute15  := null;
11101     ELSE
11102       x_charges_detail_rec.attribute15  := p_charges_detail_rec.attribute15;
11103     END IF;
11104 
11105  END IF;
11106 
11107  -- Bug Fix for Bug # 3063439
11108  -- Added code to handle the update of pricing attributes
11109 
11110 --=========================================
11111 -- Assign values to Pricing Flex fields
11112 -- in out record
11113 --=========================================
11114   IF p_charges_detail_rec.pricing_context = FND_API.G_MISS_CHAR THEN
11115 
11116     --DBMS_OUTPUT.PUT_LINE('parameter context is FND_API.G_MISS_CHAR ');
11117 
11118     x_charges_detail_rec.pricing_context      := l_db_det_rec.pricing_context ;
11119     x_charges_detail_rec.pricing_attribute1   := l_db_det_rec.pricing_attribute1;
11120     x_charges_detail_rec.pricing_attribute2   := l_db_det_rec.pricing_attribute2;
11121     x_charges_detail_rec.pricing_attribute3   := l_db_det_rec.pricing_attribute3;
11122     x_charges_detail_rec.pricing_attribute4   := l_db_det_rec.pricing_attribute4;
11123     x_charges_detail_rec.pricing_attribute5   := l_db_det_rec.pricing_attribute5;
11124     x_charges_detail_rec.pricing_attribute6   := l_db_det_rec.pricing_attribute6;
11125     x_charges_detail_rec.pricing_attribute7   := l_db_det_rec.pricing_attribute7;
11126     x_charges_detail_rec.pricing_attribute8   := l_db_det_rec.pricing_attribute8;
11127     x_charges_detail_rec.pricing_attribute9   := l_db_det_rec.pricing_attribute9;
11128     x_charges_detail_rec.pricing_attribute10  := l_db_det_rec.pricing_attribute10;
11129     x_charges_detail_rec.pricing_attribute11  := l_db_det_rec.pricing_attribute11;
11130     x_charges_detail_rec.pricing_attribute12  := l_db_det_rec.pricing_attribute12;
11131     x_charges_detail_rec.pricing_attribute13  := l_db_det_rec.pricing_attribute13;
11132     x_charges_detail_rec.pricing_attribute14  := l_db_det_rec.pricing_attribute14;
11133     x_charges_detail_rec.pricing_attribute15  := l_db_det_rec.pricing_attribute15;
11134     x_charges_detail_rec.pricing_attribute16  := l_db_det_rec.pricing_attribute16;
11135     x_charges_detail_rec.pricing_attribute17  := l_db_det_rec.pricing_attribute17;
11136     x_charges_detail_rec.pricing_attribute18  := l_db_det_rec.pricing_attribute18;
11137     x_charges_detail_rec.pricing_attribute19  := l_db_det_rec.pricing_attribute19;
11138     x_charges_detail_rec.pricing_attribute20  := l_db_det_rec.pricing_attribute20;
11139     x_charges_detail_rec.pricing_attribute21  := l_db_det_rec.pricing_attribute21;
11140     x_charges_detail_rec.pricing_attribute22  := l_db_det_rec.pricing_attribute22;
11141     x_charges_detail_rec.pricing_attribute23  := l_db_det_rec.pricing_attribute23;
11142     x_charges_detail_rec.pricing_attribute24  := l_db_det_rec.pricing_attribute24;
11143     x_charges_detail_rec.pricing_attribute25  := l_db_det_rec.pricing_attribute25;
11144     x_charges_detail_rec.pricing_attribute26  := l_db_det_rec.pricing_attribute26;
11145     x_charges_detail_rec.pricing_attribute27  := l_db_det_rec.pricing_attribute27;
11146     x_charges_detail_rec.pricing_attribute28  := l_db_det_rec.pricing_attribute28;
11147     x_charges_detail_rec.pricing_attribute29  := l_db_det_rec.pricing_attribute29;
11148     x_charges_detail_rec.pricing_attribute30  := l_db_det_rec.pricing_attribute30;
11149     x_charges_detail_rec.pricing_attribute31  := l_db_det_rec.pricing_attribute31;
11150     x_charges_detail_rec.pricing_attribute32  := l_db_det_rec.pricing_attribute32;
11151     x_charges_detail_rec.pricing_attribute33  := l_db_det_rec.pricing_attribute33;
11152     x_charges_detail_rec.pricing_attribute34  := l_db_det_rec.pricing_attribute34;
11153     x_charges_detail_rec.pricing_attribute35  := l_db_det_rec.pricing_attribute35;
11154     x_charges_detail_rec.pricing_attribute36  := l_db_det_rec.pricing_attribute36;
11155     x_charges_detail_rec.pricing_attribute37  := l_db_det_rec.pricing_attribute37;
11156     x_charges_detail_rec.pricing_attribute38  := l_db_det_rec.pricing_attribute38;
11157     x_charges_detail_rec.pricing_attribute39  := l_db_det_rec.pricing_attribute39;
11158     x_charges_detail_rec.pricing_attribute40  := l_db_det_rec.pricing_attribute40;
11159     x_charges_detail_rec.pricing_attribute41  := l_db_det_rec.pricing_attribute41;
11160     x_charges_detail_rec.pricing_attribute42  := l_db_det_rec.pricing_attribute42;
11161     x_charges_detail_rec.pricing_attribute43  := l_db_det_rec.pricing_attribute43;
11162     x_charges_detail_rec.pricing_attribute44  := l_db_det_rec.pricing_attribute44;
11163     x_charges_detail_rec.pricing_attribute45  := l_db_det_rec.pricing_attribute45;
11164     x_charges_detail_rec.pricing_attribute46  := l_db_det_rec.pricing_attribute46;
11165     x_charges_detail_rec.pricing_attribute47  := l_db_det_rec.pricing_attribute47;
11166     x_charges_detail_rec.pricing_attribute48  := l_db_det_rec.pricing_attribute48;
11167     x_charges_detail_rec.pricing_attribute49  := l_db_det_rec.pricing_attribute49;
11168     x_charges_detail_rec.pricing_attribute50  := l_db_det_rec.pricing_attribute50;
11169     x_charges_detail_rec.pricing_attribute51  := l_db_det_rec.pricing_attribute51;
11170     x_charges_detail_rec.pricing_attribute52  := l_db_det_rec.pricing_attribute52;
11171     x_charges_detail_rec.pricing_attribute53  := l_db_det_rec.pricing_attribute53;
11172     x_charges_detail_rec.pricing_attribute54  := l_db_det_rec.pricing_attribute54;
11173     x_charges_detail_rec.pricing_attribute55  := l_db_det_rec.pricing_attribute55;
11174     x_charges_detail_rec.pricing_attribute56  := l_db_det_rec.pricing_attribute56;
11175     x_charges_detail_rec.pricing_attribute57  := l_db_det_rec.pricing_attribute57;
11176     x_charges_detail_rec.pricing_attribute58  := l_db_det_rec.pricing_attribute58;
11177     x_charges_detail_rec.pricing_attribute59  := l_db_det_rec.pricing_attribute59;
11178     x_charges_detail_rec.pricing_attribute60  := l_db_det_rec.pricing_attribute60;
11179     x_charges_detail_rec.pricing_attribute61  := l_db_det_rec.pricing_attribute61;
11180     x_charges_detail_rec.pricing_attribute62  := l_db_det_rec.pricing_attribute62;
11181     x_charges_detail_rec.pricing_attribute63  := l_db_det_rec.pricing_attribute63;
11182     x_charges_detail_rec.pricing_attribute64  := l_db_det_rec.pricing_attribute64;
11183     x_charges_detail_rec.pricing_attribute65  := l_db_det_rec.pricing_attribute65;
11184     x_charges_detail_rec.pricing_attribute66  := l_db_det_rec.pricing_attribute66;
11185     x_charges_detail_rec.pricing_attribute67  := l_db_det_rec.pricing_attribute67;
11186     x_charges_detail_rec.pricing_attribute68  := l_db_det_rec.pricing_attribute68;
11187     x_charges_detail_rec.pricing_attribute69  := l_db_det_rec.pricing_attribute69;
11188     x_charges_detail_rec.pricing_attribute70  := l_db_det_rec.pricing_attribute70;
11189     x_charges_detail_rec.pricing_attribute71  := l_db_det_rec.pricing_attribute71;
11190     x_charges_detail_rec.pricing_attribute72  := l_db_det_rec.pricing_attribute72;
11191     x_charges_detail_rec.pricing_attribute73  := l_db_det_rec.pricing_attribute73;
11192     x_charges_detail_rec.pricing_attribute74  := l_db_det_rec.pricing_attribute74;
11193     x_charges_detail_rec.pricing_attribute75  := l_db_det_rec.pricing_attribute75;
11194     x_charges_detail_rec.pricing_attribute76  := l_db_det_rec.pricing_attribute76;
11195     x_charges_detail_rec.pricing_attribute77  := l_db_det_rec.pricing_attribute77;
11196     x_charges_detail_rec.pricing_attribute78  := l_db_det_rec.pricing_attribute78;
11197     x_charges_detail_rec.pricing_attribute79  := l_db_det_rec.pricing_attribute79;
11198     x_charges_detail_rec.pricing_attribute80  := l_db_det_rec.pricing_attribute80;
11199     x_charges_detail_rec.pricing_attribute81  := l_db_det_rec.pricing_attribute81;
11200     x_charges_detail_rec.pricing_attribute82  := l_db_det_rec.pricing_attribute82;
11201     x_charges_detail_rec.pricing_attribute83  := l_db_det_rec.pricing_attribute83;
11202     x_charges_detail_rec.pricing_attribute84  := l_db_det_rec.pricing_attribute84;
11203     x_charges_detail_rec.pricing_attribute85  := l_db_det_rec.pricing_attribute85;
11204     x_charges_detail_rec.pricing_attribute86  := l_db_det_rec.pricing_attribute86;
11205     x_charges_detail_rec.pricing_attribute87  := l_db_det_rec.pricing_attribute87;
11206     x_charges_detail_rec.pricing_attribute88  := l_db_det_rec.pricing_attribute88;
11207     x_charges_detail_rec.pricing_attribute89  := l_db_det_rec.pricing_attribute89;
11208     x_charges_detail_rec.pricing_attribute90  := l_db_det_rec.pricing_attribute90;
11209     x_charges_detail_rec.pricing_attribute91  := l_db_det_rec.pricing_attribute91;
11210     x_charges_detail_rec.pricing_attribute92  := l_db_det_rec.pricing_attribute92;
11211     x_charges_detail_rec.pricing_attribute93  := l_db_det_rec.pricing_attribute93;
11212     x_charges_detail_rec.pricing_attribute94  := l_db_det_rec.pricing_attribute94;
11213     x_charges_detail_rec.pricing_attribute95  := l_db_det_rec.pricing_attribute95;
11214     x_charges_detail_rec.pricing_attribute96  := l_db_det_rec.pricing_attribute96;
11215     x_charges_detail_rec.pricing_attribute97  := l_db_det_rec.pricing_attribute97;
11216     x_charges_detail_rec.pricing_attribute98  := l_db_det_rec.pricing_attribute98;
11217     x_charges_detail_rec.pricing_attribute99  := l_db_det_rec.pricing_attribute99;
11218     x_charges_detail_rec.pricing_attribute100 := l_db_det_rec.pricing_attribute100;
11219 
11220  ELSIF p_charges_detail_rec.pricing_context IS NULL THEN
11221 
11222     --DBMS_OUTPUT.PUT_LINE('parameter context is null ');
11223     x_charges_detail_rec.pricing_context      := null ;
11224     x_charges_detail_rec.pricing_attribute1   := null ;
11225     x_charges_detail_rec.pricing_attribute2   := null ;
11226     x_charges_detail_rec.pricing_attribute3   := null ;
11227     x_charges_detail_rec.pricing_attribute4   := null ;
11228     x_charges_detail_rec.pricing_attribute5   := null ;
11229     x_charges_detail_rec.pricing_attribute6   := null ;
11230     x_charges_detail_rec.pricing_attribute7   := null ;
11231     x_charges_detail_rec.pricing_attribute8   := null ;
11232     x_charges_detail_rec.pricing_attribute9   := null ;
11233     x_charges_detail_rec.pricing_attribute10  := null ;
11234     x_charges_detail_rec.pricing_attribute11  := null ;
11235     x_charges_detail_rec.pricing_attribute12  := null ;
11236     x_charges_detail_rec.pricing_attribute13  := null ;
11237     x_charges_detail_rec.pricing_attribute14  := null ;
11238     x_charges_detail_rec.pricing_attribute15  := null ;
11239     x_charges_detail_rec.pricing_attribute16  := null ;
11240     x_charges_detail_rec.pricing_attribute17  := null ;
11241     x_charges_detail_rec.pricing_attribute18  := null ;
11242     x_charges_detail_rec.pricing_attribute19  := null ;
11243     x_charges_detail_rec.pricing_attribute20  := null ;
11244     x_charges_detail_rec.pricing_attribute21  := null ;
11245     x_charges_detail_rec.pricing_attribute22  := null ;
11246     x_charges_detail_rec.pricing_attribute23  := null ;
11247     x_charges_detail_rec.pricing_attribute24  := null ;
11248     x_charges_detail_rec.pricing_attribute25  := null ;
11249     x_charges_detail_rec.pricing_attribute26  := null ;
11250     x_charges_detail_rec.pricing_attribute27  := null ;
11251     x_charges_detail_rec.pricing_attribute28  := null ;
11252     x_charges_detail_rec.pricing_attribute29  := null ;
11253     x_charges_detail_rec.pricing_attribute30  := null ;
11254     x_charges_detail_rec.pricing_attribute31  := null ;
11255     x_charges_detail_rec.pricing_attribute32  := null ;
11256     x_charges_detail_rec.pricing_attribute33  := null ;
11257     x_charges_detail_rec.pricing_attribute34  := null ;
11258     x_charges_detail_rec.pricing_attribute35  := null ;
11259     x_charges_detail_rec.pricing_attribute36  := null ;
11260     x_charges_detail_rec.pricing_attribute37  := null ;
11261     x_charges_detail_rec.pricing_attribute38  := null ;
11262     x_charges_detail_rec.pricing_attribute39  := null ;
11263     x_charges_detail_rec.pricing_attribute40  := null ;
11264     x_charges_detail_rec.pricing_attribute41  := null ;
11265     x_charges_detail_rec.pricing_attribute42  := null ;
11266     x_charges_detail_rec.pricing_attribute43  := null ;
11267     x_charges_detail_rec.pricing_attribute44  := null ;
11268     x_charges_detail_rec.pricing_attribute45  := null ;
11269     x_charges_detail_rec.pricing_attribute46  := null ;
11270     x_charges_detail_rec.pricing_attribute47  := null ;
11271     x_charges_detail_rec.pricing_attribute48  := null ;
11272     x_charges_detail_rec.pricing_attribute49  := null ;
11273     x_charges_detail_rec.pricing_attribute50  := null ;
11274     x_charges_detail_rec.pricing_attribute51  := null ;
11275     x_charges_detail_rec.pricing_attribute52  := null ;
11276     x_charges_detail_rec.pricing_attribute53  := null ;
11277     x_charges_detail_rec.pricing_attribute54  := null ;
11278     x_charges_detail_rec.pricing_attribute55  := null ;
11279     x_charges_detail_rec.pricing_attribute56  := null ;
11280     x_charges_detail_rec.pricing_attribute57  := null ;
11281     x_charges_detail_rec.pricing_attribute58  := null ;
11282     x_charges_detail_rec.pricing_attribute59  := null ;
11283     x_charges_detail_rec.pricing_attribute59  := null ;
11284     x_charges_detail_rec.pricing_attribute60  := null ;
11285     x_charges_detail_rec.pricing_attribute61  := null ;
11286     x_charges_detail_rec.pricing_attribute62  := null ;
11287     x_charges_detail_rec.pricing_attribute63  := null ;
11288     x_charges_detail_rec.pricing_attribute64  := null ;
11289     x_charges_detail_rec.pricing_attribute65  := null ;
11290     x_charges_detail_rec.pricing_attribute66  := null ;
11291     x_charges_detail_rec.pricing_attribute67  := null ;
11292     x_charges_detail_rec.pricing_attribute68  := null ;
11293     x_charges_detail_rec.pricing_attribute69  := null ;
11294     x_charges_detail_rec.pricing_attribute70  := null ;
11295     x_charges_detail_rec.pricing_attribute71  := null ;
11296     x_charges_detail_rec.pricing_attribute72  := null ;
11297     x_charges_detail_rec.pricing_attribute73  := null ;
11298     x_charges_detail_rec.pricing_attribute74  := null ;
11299     x_charges_detail_rec.pricing_attribute75  := null ;
11300     x_charges_detail_rec.pricing_attribute76  := null ;
11301     x_charges_detail_rec.pricing_attribute77  := null ;
11302     x_charges_detail_rec.pricing_attribute78  := null ;
11303     x_charges_detail_rec.pricing_attribute79  := null ;
11304     x_charges_detail_rec.pricing_attribute80  := null ;
11305     x_charges_detail_rec.pricing_attribute81  := null ;
11306     x_charges_detail_rec.pricing_attribute82  := null ;
11307     x_charges_detail_rec.pricing_attribute83  := null ;
11308     x_charges_detail_rec.pricing_attribute84  := null ;
11309     x_charges_detail_rec.pricing_attribute85  := null ;
11310     x_charges_detail_rec.pricing_attribute86  := null ;
11311     x_charges_detail_rec.pricing_attribute87  := null ;
11312     x_charges_detail_rec.pricing_attribute88  := null ;
11313     x_charges_detail_rec.pricing_attribute89  := null ;
11314     x_charges_detail_rec.pricing_attribute90  := null ;
11315     x_charges_detail_rec.pricing_attribute91  := null ;
11316     x_charges_detail_rec.pricing_attribute92  := null ;
11317     x_charges_detail_rec.pricing_attribute93  := null ;
11318     x_charges_detail_rec.pricing_attribute94  := null ;
11319     x_charges_detail_rec.pricing_attribute95  := null ;
11320     x_charges_detail_rec.pricing_attribute96  := null ;
11321     x_charges_detail_rec.pricing_attribute97  := null ;
11322     x_charges_detail_rec.pricing_attribute98  := null ;
11323     x_charges_detail_rec.pricing_attribute99  := null ;
11324     x_charges_detail_rec.pricing_attribute100 := null ;
11325 
11326   ELSE
11327 
11328     -- the pricing context is not null
11329     -- copy the incoming parameters to the record structure
11330     -- --DBMS_OUTPUT.PUT_LINE('parameter context is not null ');
11331 
11332     x_charges_detail_rec.pricing_context     := p_charges_detail_rec.pricing_context ;
11333 
11334     IF p_charges_detail_rec.pricing_attribute1 = FND_API.G_MISS_CHAR THEN
11335       x_charges_detail_rec.pricing_attribute1  := null;
11336     ELSE
11337       x_charges_detail_rec.pricing_attribute1  := p_charges_detail_rec.pricing_attribute1;
11338     END IF;
11339 
11340     IF p_charges_detail_rec.pricing_attribute2 = FND_API.G_MISS_CHAR THEN
11341       x_charges_detail_rec.pricing_attribute2  := null;
11342     ELSE
11343       x_charges_detail_rec.pricing_attribute2  := p_charges_detail_rec.pricing_attribute2;
11344     END IF;
11345 
11346     IF p_charges_detail_rec.pricing_attribute3 = FND_API.G_MISS_CHAR THEN
11347       x_charges_detail_rec.pricing_attribute3  := null;
11348     ELSE
11349       x_charges_detail_rec.pricing_attribute3  := p_charges_detail_rec.pricing_attribute3;
11350     END IF;
11351 
11352     IF p_charges_detail_rec.pricing_attribute4 = FND_API.G_MISS_CHAR THEN
11353       x_charges_detail_rec.pricing_attribute4  := null;
11354     ELSE
11355       x_charges_detail_rec.pricing_attribute4  := p_charges_detail_rec.pricing_attribute4;
11356     END IF;
11357 
11358     IF p_charges_detail_rec.pricing_attribute5 = FND_API.G_MISS_CHAR THEN
11359       x_charges_detail_rec.pricing_attribute5  := null;
11360     ELSE
11361       x_charges_detail_rec.pricing_attribute5  := p_charges_detail_rec.pricing_attribute5;
11362     END IF;
11363 
11364      IF p_charges_detail_rec.pricing_attribute6 = FND_API.G_MISS_CHAR THEN
11365       x_charges_detail_rec.pricing_attribute6  := null;
11366     ELSE
11367       x_charges_detail_rec.pricing_attribute6  := p_charges_detail_rec.pricing_attribute6;
11368     END IF;
11369 
11370     IF p_charges_detail_rec.pricing_attribute7 = FND_API.G_MISS_CHAR THEN
11371       x_charges_detail_rec.pricing_attribute7  := null;
11372     ELSE
11373       x_charges_detail_rec.pricing_attribute7  := p_charges_detail_rec.pricing_attribute7;
11374     END IF;
11375 
11376     IF p_charges_detail_rec.pricing_attribute8 = FND_API.G_MISS_CHAR THEN
11377       x_charges_detail_rec.pricing_attribute8  := null;
11378     ELSE
11379       x_charges_detail_rec.pricing_attribute8  := p_charges_detail_rec.pricing_attribute8;
11380     END IF;
11381 
11382     IF p_charges_detail_rec.pricing_attribute9 = FND_API.G_MISS_CHAR THEN
11383       x_charges_detail_rec.pricing_attribute9  := null;
11384     ELSE
11385       x_charges_detail_rec.pricing_attribute9  := p_charges_detail_rec.pricing_attribute9;
11386     END IF;
11387 
11388     IF p_charges_detail_rec.pricing_attribute10 = FND_API.G_MISS_CHAR THEN
11389       x_charges_detail_rec.pricing_attribute10  := null;
11390     ELSE
11391       x_charges_detail_rec.pricing_attribute10 := p_charges_detail_rec.pricing_attribute10;
11392     END IF;
11393 
11394     IF p_charges_detail_rec.pricing_attribute11 = FND_API.G_MISS_CHAR THEN
11395       x_charges_detail_rec.pricing_attribute11  := null;
11396     ELSE
11397       x_charges_detail_rec.pricing_attribute11  := p_charges_detail_rec.pricing_attribute11;
11398     END IF;
11399 
11400     IF p_charges_detail_rec.pricing_attribute12 = FND_API.G_MISS_CHAR THEN
11401       x_charges_detail_rec.pricing_attribute12  := null;
11402     ELSE
11403       x_charges_detail_rec.pricing_attribute12  := p_charges_detail_rec.pricing_attribute12;
11404     END IF;
11405 
11406     IF p_charges_detail_rec.pricing_attribute13 = FND_API.G_MISS_CHAR THEN
11407       x_charges_detail_rec.pricing_attribute13  := null;
11408     ELSE
11409       x_charges_detail_rec.pricing_attribute13  := p_charges_detail_rec.pricing_attribute13;
11410     END IF;
11411 
11412     IF p_charges_detail_rec.pricing_attribute14 = FND_API.G_MISS_CHAR THEN
11413       x_charges_detail_rec.pricing_attribute14  := null;
11414     ELSE
11415       x_charges_detail_rec.pricing_attribute14  := p_charges_detail_rec.pricing_attribute14;
11416     END IF;
11417 
11418     IF p_charges_detail_rec.pricing_attribute15 = FND_API.G_MISS_CHAR THEN
11419       x_charges_detail_rec.pricing_attribute15  := null;
11420     ELSE
11421       x_charges_detail_rec.pricing_attribute15  := p_charges_detail_rec.pricing_attribute15;
11422     END IF;
11423 
11424     IF p_charges_detail_rec.pricing_attribute16 = FND_API.G_MISS_CHAR THEN
11425       x_charges_detail_rec.pricing_attribute16  := null;
11426     ELSE
11427       x_charges_detail_rec.pricing_attribute16  := p_charges_detail_rec.pricing_attribute16;
11428     END IF;
11429 
11430     IF p_charges_detail_rec.pricing_attribute17 = FND_API.G_MISS_CHAR THEN
11431       x_charges_detail_rec.pricing_attribute17  := null;
11432     ELSE
11433       x_charges_detail_rec.pricing_attribute17  := p_charges_detail_rec.pricing_attribute17;
11434     END IF;
11435 
11436     IF p_charges_detail_rec.pricing_attribute18 = FND_API.G_MISS_CHAR THEN
11437       x_charges_detail_rec.pricing_attribute18  := null;
11438     ELSE
11439       x_charges_detail_rec.pricing_attribute18  := p_charges_detail_rec.pricing_attribute18;
11440     END IF;
11441 
11442     IF p_charges_detail_rec.pricing_attribute19 = FND_API.G_MISS_CHAR THEN
11443       x_charges_detail_rec.pricing_attribute19  := null;
11444     ELSE
11445       x_charges_detail_rec.pricing_attribute19  := p_charges_detail_rec.pricing_attribute19;
11446     END IF;
11447 
11448     IF p_charges_detail_rec.pricing_attribute20 = FND_API.G_MISS_CHAR THEN
11449       x_charges_detail_rec.pricing_attribute20  := null;
11450     ELSE
11451       x_charges_detail_rec.pricing_attribute20  := p_charges_detail_rec.pricing_attribute20;
11452     END IF;
11453 
11454     IF p_charges_detail_rec.pricing_attribute21 = FND_API.G_MISS_CHAR THEN
11455       x_charges_detail_rec.pricing_attribute21  := null;
11456     ELSE
11457       x_charges_detail_rec.pricing_attribute21  := p_charges_detail_rec.pricing_attribute21;
11458     END IF;
11459 
11460     IF p_charges_detail_rec.pricing_attribute22 = FND_API.G_MISS_CHAR THEN
11461       x_charges_detail_rec.pricing_attribute22  := null;
11462     ELSE
11463       x_charges_detail_rec.pricing_attribute22  := p_charges_detail_rec.pricing_attribute22;
11464     END IF;
11465 
11466 
11467     IF p_charges_detail_rec.pricing_attribute23 = FND_API.G_MISS_CHAR THEN
11468       x_charges_detail_rec.pricing_attribute23  := null;
11469     ELSE
11470       x_charges_detail_rec.pricing_attribute23 := p_charges_detail_rec.pricing_attribute23;
11471     END IF;
11472 
11473     IF p_charges_detail_rec.pricing_attribute24 = FND_API.G_MISS_CHAR THEN
11474       x_charges_detail_rec.pricing_attribute24  := null;
11475     ELSE
11476       x_charges_detail_rec.pricing_attribute24  := p_charges_detail_rec.pricing_attribute24;
11477     END IF;
11478 
11479     IF p_charges_detail_rec.pricing_attribute25 = FND_API.G_MISS_CHAR THEN
11480       x_charges_detail_rec.pricing_attribute25  := null;
11481     ELSE
11482       x_charges_detail_rec.pricing_attribute25  := p_charges_detail_rec.pricing_attribute25;
11483     END IF;
11484 
11485     IF p_charges_detail_rec.pricing_attribute26 = FND_API.G_MISS_CHAR THEN
11486       x_charges_detail_rec.pricing_attribute26  := null;
11487     ELSE
11488       x_charges_detail_rec.pricing_attribute26  := p_charges_detail_rec.pricing_attribute26;
11489     END IF;
11490 
11491      IF p_charges_detail_rec.pricing_attribute27 = FND_API.G_MISS_CHAR THEN
11492       x_charges_detail_rec.pricing_attribute27  := null;
11493     ELSE
11494       x_charges_detail_rec.pricing_attribute27 := p_charges_detail_rec.pricing_attribute27;
11495     END IF;
11496 
11497     IF p_charges_detail_rec.pricing_attribute28 = FND_API.G_MISS_CHAR THEN
11498       x_charges_detail_rec.pricing_attribute28 := null;
11499     ELSE
11500       x_charges_detail_rec.pricing_attribute28  := p_charges_detail_rec.pricing_attribute28;
11501     END IF;
11502 
11503     IF p_charges_detail_rec.pricing_attribute29 = FND_API.G_MISS_CHAR THEN
11504       x_charges_detail_rec.pricing_attribute29  := null;
11505     ELSE
11506       x_charges_detail_rec.pricing_attribute29  := p_charges_detail_rec.pricing_attribute29;
11507     END IF;
11508 
11509      IF p_charges_detail_rec.pricing_attribute30 = FND_API.G_MISS_CHAR THEN
11510       x_charges_detail_rec.pricing_attribute30  := null;
11511     ELSE
11512       x_charges_detail_rec.pricing_attribute30  := p_charges_detail_rec.pricing_attribute30;
11513     END IF;
11514 
11515     IF p_charges_detail_rec.pricing_attribute31 = FND_API.G_MISS_CHAR THEN
11516       x_charges_detail_rec.pricing_attribute31  := null;
11517     ELSE
11518       x_charges_detail_rec.pricing_attribute31  := p_charges_detail_rec.pricing_attribute31;
11519     END IF;
11520 
11521     IF p_charges_detail_rec.pricing_attribute32 = FND_API.G_MISS_CHAR THEN
11522       x_charges_detail_rec.pricing_attribute32  := null;
11523     ELSE
11524       x_charges_detail_rec.pricing_attribute32  := p_charges_detail_rec.pricing_attribute32;
11525     END IF;
11526 
11527     IF p_charges_detail_rec.pricing_attribute33 = FND_API.G_MISS_CHAR THEN
11528       x_charges_detail_rec.pricing_attribute33  := null;
11529     ELSE
11530       x_charges_detail_rec.pricing_attribute33  := p_charges_detail_rec.pricing_attribute33;
11531     END IF;
11532 
11533     IF p_charges_detail_rec.pricing_attribute34 = FND_API.G_MISS_CHAR THEN
11534       x_charges_detail_rec.pricing_attribute34  := null;
11535     ELSE
11536       x_charges_detail_rec.pricing_attribute34  := p_charges_detail_rec.pricing_attribute34;
11537     END IF;
11538 
11539     IF p_charges_detail_rec.pricing_attribute35 = FND_API.G_MISS_CHAR THEN
11540       x_charges_detail_rec.pricing_attribute35  := null;
11541     ELSE
11542       x_charges_detail_rec.pricing_attribute35  := p_charges_detail_rec.pricing_attribute35;
11543     END IF;
11544 
11545     IF p_charges_detail_rec.pricing_attribute36 = FND_API.G_MISS_CHAR THEN
11546       x_charges_detail_rec.pricing_attribute36  := null;
11547     ELSE
11548       x_charges_detail_rec.pricing_attribute36  := p_charges_detail_rec.pricing_attribute36;
11549     END IF;
11550 
11551     IF p_charges_detail_rec.pricing_attribute37 = FND_API.G_MISS_CHAR THEN
11552       x_charges_detail_rec.pricing_attribute37  := null;
11553     ELSE
11554       x_charges_detail_rec.pricing_attribute37  := p_charges_detail_rec.pricing_attribute37;
11555     END IF;
11556 
11557     IF p_charges_detail_rec.pricing_attribute38 = FND_API.G_MISS_CHAR THEN
11558       x_charges_detail_rec.pricing_attribute38  := null;
11559     ELSE
11560       x_charges_detail_rec.pricing_attribute38  := p_charges_detail_rec.pricing_attribute38;
11561     END IF;
11562 
11563     IF p_charges_detail_rec.pricing_attribute39 = FND_API.G_MISS_CHAR THEN
11564       x_charges_detail_rec.pricing_attribute39  := null;
11565     ELSE
11566       x_charges_detail_rec.pricing_attribute39  := p_charges_detail_rec.pricing_attribute39;
11567     END IF;
11568 
11569     IF p_charges_detail_rec.pricing_attribute40 = FND_API.G_MISS_CHAR THEN
11570       x_charges_detail_rec.pricing_attribute40  := null;
11571     ELSE
11572       x_charges_detail_rec.pricing_attribute40  := p_charges_detail_rec.pricing_attribute40;
11573     END IF;
11574 
11575     IF p_charges_detail_rec.pricing_attribute41 = FND_API.G_MISS_CHAR THEN
11576       x_charges_detail_rec.pricing_attribute41  := null;
11577     ELSE
11578       x_charges_detail_rec.pricing_attribute41 := p_charges_detail_rec.pricing_attribute41;
11579     END IF;
11580 
11581      IF p_charges_detail_rec.pricing_attribute42 = FND_API.G_MISS_CHAR THEN
11582       x_charges_detail_rec.pricing_attribute42  := null;
11583     ELSE
11584       x_charges_detail_rec.pricing_attribute42  := p_charges_detail_rec.pricing_attribute42;
11585     END IF;
11586 
11587     IF p_charges_detail_rec.pricing_attribute43 = FND_API.G_MISS_CHAR THEN
11588       x_charges_detail_rec.pricing_attribute43  := null;
11589     ELSE
11590       x_charges_detail_rec.pricing_attribute43  := p_charges_detail_rec.pricing_attribute43;
11591     END IF;
11592 
11593     IF p_charges_detail_rec.pricing_attribute44 = FND_API.G_MISS_CHAR THEN
11594       x_charges_detail_rec.pricing_attribute44  := null;
11595     ELSE
11596       x_charges_detail_rec.pricing_attribute44  := p_charges_detail_rec.pricing_attribute44;
11597     END IF;
11598 
11599      IF p_charges_detail_rec.pricing_attribute45 = FND_API.G_MISS_CHAR THEN
11600       x_charges_detail_rec.pricing_attribute45  := null;
11601     ELSE
11602       x_charges_detail_rec.pricing_attribute45  := p_charges_detail_rec.pricing_attribute45;
11603     END IF;
11604 
11605     IF p_charges_detail_rec.pricing_attribute46 = FND_API.G_MISS_CHAR THEN
11606       x_charges_detail_rec.pricing_attribute46  := null;
11607     ELSE
11608       x_charges_detail_rec.pricing_attribute46  := p_charges_detail_rec.pricing_attribute46;
11609     END IF;
11610 
11611     IF p_charges_detail_rec.pricing_attribute47 = FND_API.G_MISS_CHAR THEN
11612       x_charges_detail_rec.pricing_attribute47  := null;
11613     ELSE
11614       x_charges_detail_rec.pricing_attribute47  := p_charges_detail_rec.pricing_attribute47;
11615     END IF;
11616 
11617     IF p_charges_detail_rec.pricing_attribute48 = FND_API.G_MISS_CHAR THEN
11618       x_charges_detail_rec.pricing_attribute48  := null;
11619     ELSE
11620       x_charges_detail_rec.pricing_attribute48  := p_charges_detail_rec.pricing_attribute48;
11621     END IF;
11622 
11623     IF p_charges_detail_rec.pricing_attribute49 = FND_API.G_MISS_CHAR THEN
11624       x_charges_detail_rec.pricing_attribute49 := null;
11625     ELSE
11626       x_charges_detail_rec.pricing_attribute49  := p_charges_detail_rec.pricing_attribute49;
11627     END IF;
11628 
11629     IF p_charges_detail_rec.pricing_attribute50 = FND_API.G_MISS_CHAR THEN
11630       x_charges_detail_rec.pricing_attribute50  := null;
11631     ELSE
11632       x_charges_detail_rec.pricing_attribute50  := p_charges_detail_rec.pricing_attribute50;
11633     END IF;
11634 
11635     IF p_charges_detail_rec.pricing_attribute51 = FND_API.G_MISS_CHAR THEN
11636       x_charges_detail_rec.pricing_attribute51  := null;
11637     ELSE
11638       x_charges_detail_rec.pricing_attribute51  := p_charges_detail_rec.pricing_attribute51;
11639     END IF;
11640 
11641      IF p_charges_detail_rec.pricing_attribute52 = FND_API.G_MISS_CHAR THEN
11642       x_charges_detail_rec.pricing_attribute52  := null;
11643     ELSE
11644       x_charges_detail_rec.pricing_attribute52  := p_charges_detail_rec.pricing_attribute52;
11645     END IF;
11646 
11647     IF p_charges_detail_rec.pricing_attribute53 = FND_API.G_MISS_CHAR THEN
11648       x_charges_detail_rec.pricing_attribute53  := null;
11649     ELSE
11650       x_charges_detail_rec.pricing_attribute53  := p_charges_detail_rec.pricing_attribute53;
11651     END IF;
11652 
11653     IF p_charges_detail_rec.pricing_attribute54 = FND_API.G_MISS_CHAR THEN
11654       x_charges_detail_rec.pricing_attribute54  := null;
11655     ELSE
11656       x_charges_detail_rec.pricing_attribute54  := p_charges_detail_rec.pricing_attribute54;
11657     END IF;
11658 
11659     IF p_charges_detail_rec.pricing_attribute55 = FND_API.G_MISS_CHAR THEN
11660       x_charges_detail_rec.pricing_attribute55  := null;
11661     ELSE
11662       x_charges_detail_rec.pricing_attribute55  := p_charges_detail_rec.pricing_attribute55;
11663     END IF;
11664 
11665     IF p_charges_detail_rec.pricing_attribute56 = FND_API.G_MISS_CHAR THEN
11666       x_charges_detail_rec.pricing_attribute56  := null;
11667     ELSE
11668       x_charges_detail_rec.pricing_attribute56  := p_charges_detail_rec.pricing_attribute56;
11669     END IF;
11670 
11671     IF p_charges_detail_rec.pricing_attribute57 = FND_API.G_MISS_CHAR THEN
11672       x_charges_detail_rec.pricing_attribute57  := null;
11673     ELSE
11674       x_charges_detail_rec.pricing_attribute57  := p_charges_detail_rec.pricing_attribute57;
11675     END IF;
11676 
11677     IF p_charges_detail_rec.pricing_attribute58 = FND_API.G_MISS_CHAR THEN
11678       x_charges_detail_rec.pricing_attribute58  := null;
11679     ELSE
11680       x_charges_detail_rec.pricing_attribute58  := p_charges_detail_rec.pricing_attribute58;
11681     END IF;
11682 
11683     IF p_charges_detail_rec.pricing_attribute59 = FND_API.G_MISS_CHAR THEN
11684       x_charges_detail_rec.pricing_attribute59  := null;
11685     ELSE
11686       x_charges_detail_rec.pricing_attribute59  := p_charges_detail_rec.pricing_attribute59;
11687     END IF;
11688 
11689     IF p_charges_detail_rec.pricing_attribute60 = FND_API.G_MISS_CHAR THEN
11690       x_charges_detail_rec.pricing_attribute60  := null;
11691     ELSE
11692       x_charges_detail_rec.pricing_attribute60  := p_charges_detail_rec.pricing_attribute60;
11693     END IF;
11694 
11695     IF p_charges_detail_rec.pricing_attribute61 = FND_API.G_MISS_CHAR THEN
11696       x_charges_detail_rec.pricing_attribute61  := null;
11697     ELSE
11698       x_charges_detail_rec.pricing_attribute61  := p_charges_detail_rec.pricing_attribute61;
11699     END IF;
11700 
11701     IF p_charges_detail_rec.pricing_attribute62 = FND_API.G_MISS_CHAR THEN
11702       x_charges_detail_rec.pricing_attribute62  := null;
11703     ELSE
11704       x_charges_detail_rec.pricing_attribute62  := p_charges_detail_rec.pricing_attribute62;
11705     END IF;
11706 
11707     IF p_charges_detail_rec.pricing_attribute63 = FND_API.G_MISS_CHAR THEN
11708       x_charges_detail_rec.pricing_attribute63  := null;
11709     ELSE
11710       x_charges_detail_rec.pricing_attribute63  := p_charges_detail_rec.pricing_attribute63;
11711     END IF;
11712 
11713     IF p_charges_detail_rec.pricing_attribute64 = FND_API.G_MISS_CHAR THEN
11714       x_charges_detail_rec.pricing_attribute64  := null;
11715     ELSE
11716       x_charges_detail_rec.pricing_attribute64  := p_charges_detail_rec.pricing_attribute64;
11717     END IF;
11718 
11719     IF p_charges_detail_rec.pricing_attribute65 = FND_API.G_MISS_CHAR THEN
11720       x_charges_detail_rec.pricing_attribute65  := null;
11721     ELSE
11722       x_charges_detail_rec.pricing_attribute65  := p_charges_detail_rec.pricing_attribute65;
11723     END IF;
11724 
11725     IF p_charges_detail_rec.pricing_attribute66 = FND_API.G_MISS_CHAR THEN
11726       x_charges_detail_rec.pricing_attribute66  := null;
11727     ELSE
11728       x_charges_detail_rec.pricing_attribute66  := p_charges_detail_rec.pricing_attribute66;
11729     END IF;
11730 
11731     IF p_charges_detail_rec.pricing_attribute67 = FND_API.G_MISS_CHAR THEN
11732       x_charges_detail_rec.pricing_attribute67  := null;
11733     ELSE
11734       x_charges_detail_rec.pricing_attribute67  := p_charges_detail_rec.pricing_attribute67;
11735     END IF;
11736 
11737     IF p_charges_detail_rec.pricing_attribute68 = FND_API.G_MISS_CHAR THEN
11738       x_charges_detail_rec.pricing_attribute68  := null;
11739     ELSE
11740       x_charges_detail_rec.pricing_attribute68  := p_charges_detail_rec.pricing_attribute68;
11741     END IF;
11742 
11743     IF p_charges_detail_rec.pricing_attribute69 = FND_API.G_MISS_CHAR THEN
11744       x_charges_detail_rec.pricing_attribute69  := null;
11745     ELSE
11746       x_charges_detail_rec.pricing_attribute69  := p_charges_detail_rec.pricing_attribute69;
11747     END IF;
11748 
11749     IF p_charges_detail_rec.pricing_attribute70 = FND_API.G_MISS_CHAR THEN
11750       x_charges_detail_rec.pricing_attribute70  := null;
11751     ELSE
11752       x_charges_detail_rec.pricing_attribute70  := p_charges_detail_rec.pricing_attribute70;
11753     END IF;
11754 
11755     IF p_charges_detail_rec.pricing_attribute71 = FND_API.G_MISS_CHAR THEN
11756       x_charges_detail_rec.pricing_attribute71  := null;
11757     ELSE
11758       x_charges_detail_rec.pricing_attribute71 := p_charges_detail_rec.pricing_attribute71;
11759     END IF;
11760 
11761     IF p_charges_detail_rec.pricing_attribute72 = FND_API.G_MISS_CHAR THEN
11762       x_charges_detail_rec.pricing_attribute72  := null;
11763     ELSE
11764       x_charges_detail_rec.pricing_attribute72  := p_charges_detail_rec.pricing_attribute72;
11765     END IF;
11766 
11767     IF p_charges_detail_rec.pricing_attribute73 = FND_API.G_MISS_CHAR THEN
11768       x_charges_detail_rec.pricing_attribute73  := null;
11769     ELSE
11770       x_charges_detail_rec.pricing_attribute73  := p_charges_detail_rec.pricing_attribute73;
11771     END IF;
11772 
11773     IF p_charges_detail_rec.pricing_attribute74 = FND_API.G_MISS_CHAR THEN
11774       x_charges_detail_rec.pricing_attribute74  := null;
11775     ELSE
11776       x_charges_detail_rec.pricing_attribute74  := p_charges_detail_rec.pricing_attribute74;
11777     END IF;
11778 
11779     IF p_charges_detail_rec.pricing_attribute75 = FND_API.G_MISS_CHAR THEN
11780       x_charges_detail_rec.pricing_attribute75  := null;
11781     ELSE
11782       x_charges_detail_rec.pricing_attribute75  := p_charges_detail_rec.pricing_attribute75;
11783     END IF;
11784 
11785     IF p_charges_detail_rec.pricing_attribute76 = FND_API.G_MISS_CHAR THEN
11786       x_charges_detail_rec.pricing_attribute76  := null;
11787     ELSE
11788       x_charges_detail_rec.pricing_attribute76  := p_charges_detail_rec.pricing_attribute76;
11789     END IF;
11790 
11791      IF p_charges_detail_rec.pricing_attribute77 = FND_API.G_MISS_CHAR THEN
11792       x_charges_detail_rec.pricing_attribute77  := null;
11793     ELSE
11794       x_charges_detail_rec.pricing_attribute77  := p_charges_detail_rec.pricing_attribute77;
11795     END IF;
11796 
11797     IF p_charges_detail_rec.pricing_attribute78 = FND_API.G_MISS_CHAR THEN
11798       x_charges_detail_rec.pricing_attribute78  := null;
11799     ELSE
11800       x_charges_detail_rec.pricing_attribute78  := p_charges_detail_rec.pricing_attribute78;
11801     END IF;
11802 
11803     IF p_charges_detail_rec.pricing_attribute79 = FND_API.G_MISS_CHAR THEN
11804       x_charges_detail_rec.pricing_attribute79  := null;
11805     ELSE
11806       x_charges_detail_rec.pricing_attribute79  := p_charges_detail_rec.pricing_attribute79;
11807     END IF;
11808 
11809       IF p_charges_detail_rec.pricing_attribute80 = FND_API.G_MISS_CHAR THEN
11810       x_charges_detail_rec.pricing_attribute80  := null;
11811     ELSE
11812       x_charges_detail_rec.pricing_attribute80  := p_charges_detail_rec.pricing_attribute80;
11813     END IF;
11814 
11815     IF p_charges_detail_rec.pricing_attribute81 = FND_API.G_MISS_CHAR THEN
11816       x_charges_detail_rec.pricing_attribute81  := null;
11817     ELSE
11818       x_charges_detail_rec.pricing_attribute81  := p_charges_detail_rec.pricing_attribute81;
11819     END IF;
11820 
11821     IF p_charges_detail_rec.pricing_attribute82 = FND_API.G_MISS_CHAR THEN
11822       x_charges_detail_rec.pricing_attribute82  := null;
11823     ELSE
11824       x_charges_detail_rec.pricing_attribute82  := p_charges_detail_rec.pricing_attribute82;
11825     END IF;
11826 
11827     IF p_charges_detail_rec.pricing_attribute83 = FND_API.G_MISS_CHAR THEN
11828       x_charges_detail_rec.pricing_attribute83  := null;
11829     ELSE
11830       x_charges_detail_rec.pricing_attribute83  := p_charges_detail_rec.pricing_attribute83;
11831     END IF;
11832 
11833     IF p_charges_detail_rec.pricing_attribute84 = FND_API.G_MISS_CHAR THEN
11834       x_charges_detail_rec.pricing_attribute84  := null;
11835     ELSE
11836       x_charges_detail_rec.pricing_attribute84  := p_charges_detail_rec.pricing_attribute84;
11837     END IF;
11838 
11839     IF p_charges_detail_rec.pricing_attribute85 = FND_API.G_MISS_CHAR THEN
11840       x_charges_detail_rec.pricing_attribute85 := null;
11841     ELSE
11842       x_charges_detail_rec.pricing_attribute85  := p_charges_detail_rec.pricing_attribute85;
11843     END IF;
11844 
11845     IF p_charges_detail_rec.pricing_attribute86 = FND_API.G_MISS_CHAR THEN
11846       x_charges_detail_rec.pricing_attribute86  := null;
11847     ELSE
11848       x_charges_detail_rec.pricing_attribute86  := p_charges_detail_rec.pricing_attribute86;
11849     END IF;
11850 
11851     IF p_charges_detail_rec.pricing_attribute87 = FND_API.G_MISS_CHAR THEN
11852       x_charges_detail_rec.pricing_attribute87  := null;
11853     ELSE
11854       x_charges_detail_rec.pricing_attribute87  := p_charges_detail_rec.pricing_attribute87;
11855     END IF;
11856 
11857     IF p_charges_detail_rec.pricing_attribute88 = FND_API.G_MISS_CHAR THEN
11858       x_charges_detail_rec.pricing_attribute88  := null;
11859     ELSE
11860       x_charges_detail_rec.pricing_attribute88  := p_charges_detail_rec.pricing_attribute88;
11861     END IF;
11862 
11863     IF p_charges_detail_rec.pricing_attribute89 = FND_API.G_MISS_CHAR THEN
11864       x_charges_detail_rec.pricing_attribute89  := null;
11865     ELSE
11866       x_charges_detail_rec.pricing_attribute89  := p_charges_detail_rec.pricing_attribute89;
11867     END IF;
11868 
11869     IF p_charges_detail_rec.pricing_attribute90 = FND_API.G_MISS_CHAR THEN
11870       x_charges_detail_rec.pricing_attribute90  := null;
11871     ELSE
11872       x_charges_detail_rec.pricing_attribute90  := p_charges_detail_rec.pricing_attribute90;
11873     END IF;
11874 
11875     IF p_charges_detail_rec.pricing_attribute91 = FND_API.G_MISS_CHAR THEN
11876       x_charges_detail_rec.pricing_attribute91  := null;
11877     ELSE
11878       x_charges_detail_rec.pricing_attribute91  := p_charges_detail_rec.pricing_attribute91;
11879     END IF;
11880 
11881     IF p_charges_detail_rec.pricing_attribute92 = FND_API.G_MISS_CHAR THEN
11882       x_charges_detail_rec.pricing_attribute92  := null;
11883     ELSE
11884       x_charges_detail_rec.pricing_attribute92  := p_charges_detail_rec.pricing_attribute92;
11885     END IF;
11886 
11887     IF p_charges_detail_rec.pricing_attribute93 = FND_API.G_MISS_CHAR THEN
11888       x_charges_detail_rec.pricing_attribute93  := null;
11889     ELSE
11890       x_charges_detail_rec.pricing_attribute93  := p_charges_detail_rec.pricing_attribute93;
11891     END IF;
11892 
11893     IF p_charges_detail_rec.pricing_attribute94 = FND_API.G_MISS_CHAR THEN
11894       x_charges_detail_rec.pricing_attribute94  := null;
11895     ELSE
11896       x_charges_detail_rec.pricing_attribute94  := p_charges_detail_rec.pricing_attribute94;
11897     END IF;
11898 
11899     IF p_charges_detail_rec.pricing_attribute95 = FND_API.G_MISS_CHAR THEN
11900       x_charges_detail_rec.pricing_attribute95  := null;
11901     ELSE
11902       x_charges_detail_rec.pricing_attribute95  := p_charges_detail_rec.pricing_attribute95;
11903     END IF;
11904 
11905     IF p_charges_detail_rec.pricing_attribute96 = FND_API.G_MISS_CHAR THEN
11906       x_charges_detail_rec.pricing_attribute96  := null;
11907     ELSE
11908       x_charges_detail_rec.pricing_attribute96  := p_charges_detail_rec.pricing_attribute96;
11909     END IF;
11910 
11911     IF p_charges_detail_rec.pricing_attribute97 = FND_API.G_MISS_CHAR THEN
11912       x_charges_detail_rec.pricing_attribute97  := null;
11913     ELSE
11914       x_charges_detail_rec.pricing_attribute97  := p_charges_detail_rec.pricing_attribute97;
11915     END IF;
11916 
11917      IF p_charges_detail_rec.pricing_attribute98 = FND_API.G_MISS_CHAR THEN
11918       x_charges_detail_rec.pricing_attribute98  := null;
11919     ELSE
11920       x_charges_detail_rec.pricing_attribute98  := p_charges_detail_rec.pricing_attribute98;
11921     END IF;
11922 
11923     IF p_charges_detail_rec.pricing_attribute99 = FND_API.G_MISS_CHAR THEN
11924       x_charges_detail_rec.pricing_attribute99  := null;
11925     ELSE
11926       x_charges_detail_rec.pricing_attribute99  := p_charges_detail_rec.pricing_attribute99;
11927     END IF;
11928 
11929     IF p_charges_detail_rec.pricing_attribute100 = FND_API.G_MISS_CHAR THEN
11930       x_charges_detail_rec.pricing_attribute100  := null;
11931     ELSE
11932       x_charges_detail_rec.pricing_attribute100  := p_charges_detail_rec.pricing_attribute100;
11933     END IF;
11934 
11935   END IF;
11936 
11937 END IF;
11938 -- ========================================
11939 -- Call the pricing API
11940 -- ========================================
11941 --DBMS_OUTPUT.PUT_LINE('Call the pricing API ...');
11942 --DBMS_OUTPUT.PUT_LINE('Billing Flag '||x_charges_detail_rec.billing_flag);
11943 --DBMS_OUTPUT.PUT_LINE('List Price '||p_charges_detail_rec.list_price);
11944 --DBMS_OUTPUT.PUT_LINE('After Warranty_cost '||p_charges_detail_rec.after_warranty_cost);
11945 
11946 IF p_validation_mode = 'I' THEN
11947 
11948   IF  l_curr_in_conversion_list = 'Y' AND
11949       p_charges_detail_rec.list_price is null then  --12.1.3, vpremach
11950 
11951        FND_MESSAGE.SET_NAME('CS', 'CS_CHG_NOT_BASE_CURRENCY');
11952        FND_MESSAGE.Set_Token('CURRENCY_CODE', p_charges_detail_rec.currency_code);
11953        FND_MSG_PUB.Add;
11954        RAISE FND_API.G_EXC_ERROR;
11955   END IF;
11956   x_charges_detail_rec.apply_contract_discount := p_charges_detail_rec.apply_contract_discount;
11957 
11958   IF x_charges_detail_rec.billing_flag = 'L' AND
11959      p_charges_detail_rec.list_price IS NOT NULL THEN
11960 
11961       -- no need to call the pricing api
11962       -- assign to out record
11963 
11964       x_charges_detail_rec.list_price    := p_charges_detail_rec.list_price;
11965       x_charges_detail_rec.selling_price := p_charges_detail_rec.list_price;
11966 
11967       --bug # 3056622 charge amount is zero for items with negative prices
11968 
11969       --derive the after_warranty_cost
11970       IF x_charges_detail_rec.no_charge_flag <> 'Y' AND
11971          x_charges_detail_rec.selling_price IS NOT NULL THEN
11972 
11973          --Fix for Bug # 3388373
11974          IF p_charges_detail_rec.after_warranty_cost IS NULL THEN
11975            x_charges_detail_rec.after_warranty_cost := x_charges_detail_rec.selling_price * x_charges_detail_rec.quantity_required;
11976          ELSE
11977            x_charges_detail_rec.after_warranty_cost := p_charges_detail_rec.after_warranty_cost;
11978          END IF;
11979       ELSE
11980         -- no charge flag = 'Y'
11981         x_charges_detail_rec.after_warranty_cost := 0;
11982       END IF;
11983 
11984       --check to see if contract discount needs to be applied
11985       IF x_charges_detail_rec.apply_contract_discount = 'Y' AND
11986          x_charges_detail_rec.contract_line_id IS NOT NULL AND
11987          x_charges_detail_rec.no_charge_flag <> 'Y' THEN
11988 
11989         --assign to out record
11990         x_charges_detail_rec.apply_contract_discount := p_charges_detail_rec.apply_contract_discount;
11991 
11992         --call contracts dicounting API
11993         --DBMS_OUTPUT.PUT_LINE('Call Contracts API to Apply contracts 1');
11994 
11995         CS_Est_Apply_Contract_PKG.Apply_Contract(
11996           p_coverage_id           => x_charges_detail_rec.contract_line_id,
11997           p_coverage_txn_group_id => x_charges_detail_rec.coverage_txn_group_id,
11998           p_txn_billing_type_id   => x_charges_detail_rec.txn_billing_type_id,
11999           P_BUSINESS_PROCESS_ID   => x_charges_detail_rec.business_process_id,
12000           P_REQUEST_DATE          => l_request_date,
12001           p_amount                => x_charges_detail_rec.after_warranty_cost,
12002           p_discount_amount       => l_contract_discount,
12003           X_RETURN_STATUS         => l_return_status,
12004           X_MSG_COUNT             => l_msg_count,
12005           X_MSG_DATA              => l_msg_data);
12006 
12007         IF l_return_status <> FND_API.G_RET_STS_SUCCESS THEN
12008           FND_MESSAGE.Set_Name('CS', 'CS_CHG_APPLY_CONTRACT_WARNING');
12009           FND_MESSAGE.SET_TOKEN('REASON', l_msg_data);
12010           FND_MSG_PUB.Add;
12011           RAISE FND_API.G_EXC_ERROR;
12012         END IF;
12013 
12014         --Bug Fix for Bug # 3088397
12015         IF l_contract_discount IS NOT NULL THEN
12016           --assign the contract discount to the out record
12017           x_charges_detail_rec.contract_discount_amount := x_charges_detail_rec.after_warranty_cost - l_contract_discount;
12018 
12019           --apply discount
12020           x_charges_detail_rec.after_warranty_cost :=  l_contract_discount;
12021         ELSE
12022           -- contract discount amt should be 0
12023           --x_charges_detail_rec.contract_discount_amount := 0;
12024           null;
12025         END IF;
12026 
12027        --DBMS_OUTPUT.PUT_LINE('Contract 1'||x_charges_detail_rec.contract_discount_amount);
12028 
12029 
12030       ELSE
12031         --Apply contract discount = 'N'
12032         --Fixed Bug # 3220253
12033         --passed p_charges_detail_rec.contract_discount_amount
12034         x_charges_detail_rec.apply_contract_discount  := p_charges_detail_rec.apply_contract_discount;
12035         x_charges_detail_rec.contract_discount_amount := p_charges_detail_rec.contract_discount_amount;
12036         IF x_charges_detail_rec.contract_discount_amount IS NULL THEN
12037           x_charges_detail_rec.contract_discount_amount := 0;
12038         ELSE
12039           x_charges_detail_rec.contract_discount_amount := x_charges_detail_rec.contract_discount_amount;
12040         END IF;
12041       END IF ;
12042 
12043   ELSIF
12044      --Fix # 3069583 unable to override charges for labor charge line
12045 
12046      --x_charges_detail_rec.billing_flag <> 'E' AND
12047      --x_charges_detail_rec.billing_flag <> 'M' OR
12048      x_charges_detail_rec.billing_flag IN ('E','M', 'L') AND
12049      p_charges_detail_rec.after_warranty_cost IS NULL AND
12050      p_charges_detail_rec.list_price IS NULL THEN
12051      IF l_curr_in_conversion_list = 'Y' THEN --AND fnd_profile.value('CS_ENABLE_CURRENCY_CONVERSION') = 'Y' THEN   --12.1.3 Multi Currency, vpremach
12052         FND_MESSAGE.SET_NAME('CS', 'CS_CHG_NOT_BASE_CURRENCY');
12053         FND_MESSAGE.Set_Token('CURRENCY_CODE', p_charges_detail_rec.currency_code);
12054         FND_MSG_PUB.Add;
12055         RAISE FND_API.G_EXC_ERROR;
12056      END IF;
12057 
12058     IF ((((x_charges_detail_rec.inventory_item_id_in IS NOT NULL) AND
12059           (x_charges_detail_rec.unit_of_measure_code IS NOT NULL) AND
12060           (x_charges_detail_rec.price_list_id IS NOT NULL) AND
12061           (x_charges_detail_rec.quantity_required IS NOT NULL)))) THEN
12062 
12063       --DBMS_OUTPUT.PUT_LINE('Before calling CS_Pricing_Item_Pkg.Call_Pricing_Item ...');
12064       --DBMS_OUTPUT.PUT_LINE('x_charges_detail_rec.inventory_item_id_in='||x_charges_detail_rec.inventory_item_id_in);
12065       --DBMS_OUTPUT.PUT_LINE('x_charges_detail_rec.price_list_id='||x_charges_detail_rec.price_list_id);
12066       --DBMS_OUTPUT.PUT_LINE('x_charges_detail_rec.unit_of_measure_code='||x_charges_detail_rec.unit_of_measure_code);
12067       --DBMS_OUTPUT.PUT_LINE('x_charges_detail_rec.currency_code='||x_charges_detail_rec.currency_code);
12068       --DBMS_OUTPUT.PUT_LINE('x_charges_detail_rec.quantity_required='||x_charges_detail_rec.quantity_required);
12069 
12070       -- Added to fix Bug # 3819167
12071       --
12072       /*
12073       IF ((l_line_order_category_code = 'RETURN') AND
12074           (sign(x_charges_detail_rec.quantity_required) = -1)) THEN
12075           l_absolute_quantity_required := x_charges_detail_rec.quantity_required * -1;
12076       ELSE
12077           l_absolute_quantity_required := x_charges_detail_rec.quantity_required;
12078       END IF;
12079       */
12080         -- Bug 7117553
12081       l_profile_value := fnd_profile.value('CS_SR_CHG_PRIC_DATE');
12082       If l_profile_value = 'CHG_INC_DATE' Then
12083         l_pricing_date := l_incident_date;
12084       Else
12085 	l_pricing_date := sysdate;
12086       End if;
12087       -- Bug 7117553
12088 
12089 
12090       -- Calculate the selling price
12091       CS_Pricing_Item_Pkg.Call_Pricing_Item(
12092             P_Inventory_Item_Id          => x_charges_detail_rec.inventory_item_id_in,
12093             P_Price_List_Id              => x_charges_detail_rec.price_list_id,
12094             P_UOM_Code                   => x_charges_detail_rec.unit_of_measure_code,
12095             p_Currency_Code              => x_charges_detail_rec.currency_code,
12096             P_Quantity                   => abs(x_charges_detail_rec.quantity_required),
12097 	    P_incident_date	         => l_pricing_date,   -- Bug 7117553
12098             P_Org_Id                     => x_charges_detail_rec.org_id,
12099             x_list_price                 => l_list_price,
12100             P_Pricing_Context            => x_charges_detail_rec.pricing_context,
12101             P_Pricing_Attribute1         => x_charges_detail_rec.pricing_attribute1,
12102             P_Pricing_Attribute2         => x_charges_detail_rec.pricing_attribute2,
12103             P_Pricing_Attribute3         => x_charges_detail_rec.pricing_attribute3,
12104             P_Pricing_Attribute4         => x_charges_detail_rec.pricing_attribute4,
12105             P_Pricing_Attribute5         => x_charges_detail_rec.pricing_attribute5,
12106             P_Pricing_Attribute6         => x_charges_detail_rec.pricing_attribute6,
12107             P_Pricing_Attribute7         => x_charges_detail_rec.pricing_attribute7,
12108             P_Pricing_Attribute8         => x_charges_detail_rec.pricing_attribute8,
12109             P_Pricing_Attribute9         => x_charges_detail_rec.pricing_attribute9,
12110             P_Pricing_Attribute10        => x_charges_detail_rec.pricing_attribute10,
12111             P_Pricing_Attribute11        => x_charges_detail_rec.pricing_attribute11,
12112             P_Pricing_Attribute12        => x_charges_detail_rec.pricing_attribute12,
12113             P_Pricing_Attribute13        => x_charges_detail_rec.pricing_attribute13,
12114             P_Pricing_Attribute14        => x_charges_detail_rec.pricing_attribute14,
12115             P_Pricing_Attribute15        => x_charges_detail_rec.pricing_attribute15,
12116             P_Pricing_Attribute16        => x_charges_detail_rec.pricing_attribute16,
12117             P_Pricing_Attribute17        => x_charges_detail_rec.pricing_attribute17,
12118             P_Pricing_Attribute18        => x_charges_detail_rec.pricing_attribute18,
12119             P_Pricing_Attribute19        => x_charges_detail_rec.pricing_attribute19,
12120             P_Pricing_Attribute20        => x_charges_detail_rec.pricing_attribute20,
12121             P_Pricing_Attribute21        => x_charges_detail_rec.pricing_attribute21,
12122             P_Pricing_Attribute22        => x_charges_detail_rec.pricing_attribute22,
12123             P_Pricing_Attribute23        => x_charges_detail_rec.pricing_attribute23,
12124             P_Pricing_Attribute24        => x_charges_detail_rec.pricing_attribute24,
12125             P_Pricing_Attribute25        => x_charges_detail_rec.pricing_attribute25,
12126             p_Pricing_Attribute26        => x_charges_detail_rec.pricing_attribute26,
12127             P_Pricing_Attribute27        => x_charges_detail_rec.pricing_attribute27,
12128             P_Pricing_Attribute28        => x_charges_detail_rec.pricing_attribute28,
12129             P_Pricing_Attribute29        => x_charges_detail_rec.pricing_attribute29,
12130             P_Pricing_Attribute30        => x_charges_detail_rec.pricing_attribute30,
12131             P_PRICING_ATTRIBUTE31        => x_charges_detail_rec.pricing_attribute31,
12132             P_PRICING_ATTRIBUTE32        => x_charges_detail_rec.pricing_attribute32,
12133             P_PRICING_ATTRIBUTE33        => x_charges_detail_rec.pricing_attribute33,
12134             P_PRICING_ATTRIBUTE34        => x_charges_detail_rec.pricing_attribute34,
12135             P_Pricing_Attribute35        => x_charges_detail_rec.pricing_attribute35,
12136             P_Pricing_Attribute36        => x_charges_detail_rec.pricing_attribute36,
12137             P_Pricing_Attribute37        => x_charges_detail_rec.pricing_attribute37,
12138             P_Pricing_Attribute38        => x_charges_detail_rec.pricing_attribute38,
12139             P_Pricing_Attribute39        => x_charges_detail_rec.pricing_attribute39,
12140             P_Pricing_Attribute40        => x_charges_detail_rec.pricing_attribute40,
12141             P_Pricing_Attribute41        => x_charges_detail_rec.pricing_attribute41,
12142             P_Pricing_Attribute42        => x_charges_detail_rec.pricing_attribute42,
12143             P_Pricing_Attribute43        => x_charges_detail_rec.pricing_attribute43,
12144             P_Pricing_Attribute44        => x_charges_detail_rec.pricing_attribute44,
12145             P_Pricing_Attribute45        => x_charges_detail_rec.pricing_attribute45,
12146             P_Pricing_Attribute46        => x_charges_detail_rec.pricing_attribute46,
12147             P_Pricing_Attribute47        => x_charges_detail_rec.pricing_attribute47,
12148             P_Pricing_Attribute48        => x_charges_detail_rec.pricing_attribute48,
12149             P_Pricing_Attribute49        => x_charges_detail_rec.pricing_attribute49,
12150             P_Pricing_Attribute50        => x_charges_detail_rec.pricing_attribute50,
12151             P_Pricing_Attribute51        => x_charges_detail_rec.pricing_attribute51,
12152             P_Pricing_Attribute52        => x_charges_detail_rec.pricing_attribute52,
12153             P_Pricing_Attribute53        => x_charges_detail_rec.pricing_attribute53,
12154             P_Pricing_Attribute54        => x_charges_detail_rec.pricing_attribute54,
12155             P_Pricing_Attribute55        => x_charges_detail_rec.pricing_attribute55,
12156             P_Pricing_Attribute56        => x_charges_detail_rec.pricing_attribute56,
12157             P_Pricing_Attribute57        => x_charges_detail_rec.pricing_attribute57,
12158             P_Pricing_Attribute58        => x_charges_detail_rec.pricing_attribute58,
12159             P_Pricing_Attribute59        => x_charges_detail_rec.pricing_attribute59,
12160             P_Pricing_Attribute60        => x_charges_detail_rec.pricing_attribute60,
12161             P_Pricing_Attribute61        => x_charges_detail_rec.pricing_attribute61,
12162             P_Pricing_Attribute62        => x_charges_detail_rec.pricing_attribute62,
12163             P_Pricing_Attribute63        => x_charges_detail_rec.pricing_attribute63,
12164             P_Pricing_Attribute64        => x_charges_detail_rec.pricing_attribute64,
12165             P_Pricing_Attribute65        => x_charges_detail_rec.pricing_attribute65,
12166             P_Pricing_Attribute66        => x_charges_detail_rec.pricing_attribute66,
12167             P_Pricing_Attribute67        => x_charges_detail_rec.pricing_attribute67,
12168             P_Pricing_Attribute68        => x_charges_detail_rec.pricing_attribute68,
12169             P_Pricing_Attribute69        => x_charges_detail_rec.pricing_attribute69,
12170             P_Pricing_Attribute70        => x_charges_detail_rec.pricing_attribute70,
12171             P_Pricing_Attribute71        => x_charges_detail_rec.pricing_attribute71,
12172             P_Pricing_Attribute72        => x_charges_detail_rec.pricing_attribute72,
12173             P_Pricing_Attribute73        => x_charges_detail_rec.pricing_attribute73,
12174             P_Pricing_Attribute74        => x_charges_detail_rec.pricing_attribute74,
12175             P_Pricing_Attribute75        => x_charges_detail_rec.pricing_attribute75,
12176             P_Pricing_Attribute76        => x_charges_detail_rec.pricing_attribute76,
12177             P_Pricing_Attribute77        => x_charges_detail_rec.pricing_attribute77,
12178             P_Pricing_Attribute78        => x_charges_detail_rec.pricing_attribute78,
12179             P_Pricing_Attribute79        => x_charges_detail_rec.pricing_attribute79,
12180             P_Pricing_Attribute80        => x_charges_detail_rec.pricing_attribute80,
12181             P_Pricing_Attribute81        => x_charges_detail_rec.pricing_attribute81,
12182             P_Pricing_Attribute82        => x_charges_detail_rec.pricing_attribute82,
12183             P_Pricing_Attribute83        => x_charges_detail_rec.pricing_attribute83,
12184             P_Pricing_Attribute84        => x_charges_detail_rec.pricing_attribute84,
12185             P_Pricing_Attribute85        => x_charges_detail_rec.pricing_attribute85,
12186             P_Pricing_Attribute86        => x_charges_detail_rec.pricing_attribute86,
12187             P_Pricing_Attribute87        => x_charges_detail_rec.pricing_attribute87,
12188             P_Pricing_Attribute88        => x_charges_detail_rec.pricing_attribute88,
12189             P_Pricing_Attribute89        => x_charges_detail_rec.pricing_attribute89,
12190             P_Pricing_Attribute90        => x_charges_detail_rec.pricing_attribute90,
12191             P_Pricing_Attribute91        => x_charges_detail_rec.pricing_attribute91,
12192             P_Pricing_Attribute92        => x_charges_detail_rec.pricing_attribute92,
12193             P_Pricing_Attribute93        => x_charges_detail_rec.pricing_attribute93,
12194             P_Pricing_Attribute94        => x_charges_detail_rec.pricing_attribute94,
12195             P_Pricing_Attribute95        => x_charges_detail_rec.pricing_attribute95,
12196             P_Pricing_Attribute96        => x_charges_detail_rec.pricing_attribute96,
12197             P_Pricing_Attribute97        => x_charges_detail_rec.pricing_attribute97,
12198             P_Pricing_Attribute98        => x_charges_detail_rec.pricing_attribute98,
12199             P_Pricing_Attribute99        => x_charges_detail_rec.pricing_attribute99,
12200             P_Pricing_Attribute100       => x_charges_detail_rec.pricing_attribute100,
12201             x_return_status              => l_return_status,
12202             x_msg_count                  => l_msg_count,
12203             x_msg_data                   => l_msg_data);
12204 
12205       --DBMS_OUTPUT.PUT_LINE('After calling CS_Pricing_Item_Pkg.Call_Pricing_Item ...');
12206       --DBMS_OUTPUT.PUT_LINE('l_msg_data '||l_msg_data);
12207 
12208       IF (l_return_status <> FND_API.G_RET_STS_SUCCESS) THEN
12209         FND_MESSAGE.Set_Name('CS', 'CS_CHG_API_PRICING_ITEM_ERROR');
12210         FND_MESSAGE.set_token('INV_ID', x_charges_detail_rec.inventory_item_id_in);
12211         FND_MESSAGE.set_token('PRICE_LIST_ID', x_charges_detail_rec.price_list_id);
12212         FND_MESSAGE.set_token('UOM', x_charges_detail_rec.unit_of_measure_code);
12213         FND_MESSAGE.set_token('CURR_CODE', x_charges_detail_rec.currency_code);
12214         --FND_MESSAGE.SET_TOKEN('TEXT', l_msg_data, TRUE);
12215         FND_MSG_PUB.Add;
12216         RAISE FND_API.G_EXC_ERROR;
12217       END IF;
12218 
12219       --assign to out record
12220       x_charges_detail_rec.list_price    := l_list_price;
12221 
12222       --bug # 3056622 charge amount is zero for items with negative prices
12223 
12224       IF p_charges_detail_rec.selling_price IS NOT NULL THEN
12225         x_charges_detail_rec.selling_price :=  p_charges_detail_rec.selling_price;
12226       ELSE
12227         x_charges_detail_rec.selling_price := x_charges_detail_rec.list_price;
12228       END IF;
12229 
12230 
12231       IF x_charges_detail_rec.billing_flag = 'L' AND
12232          p_charges_detail_rec.con_pct_over_list_price IS NOT NULL THEN
12233          --get the new list price and selling price
12234          x_charges_detail_rec.list_price := x_charges_detail_rec.list_price +
12235                                                (x_charges_detail_rec.list_price *  p_charges_detail_rec.con_pct_over_list_price/100);
12236          x_charges_detail_rec.selling_price := x_charges_detail_rec.list_price;
12237       ELSE
12238          x_charges_detail_rec.list_price    := x_charges_detail_rec.list_price;
12239          x_charges_detail_rec.selling_price := x_charges_detail_rec.selling_price;
12240       END IF;
12241 
12242 
12243       --DBMS_OUTPUT.PUT_LINE('list_price '||x_charges_detail_rec.list_price);
12244       --DBMS_OUTPUT.PUT_LINE('Selling Price '||x_charges_detail_rec.selling_price);
12245       --DBMS_OUTPUT.PUT_LINE(' No Charge Flag is  '||x_charges_detail_rec.no_charge_flag);
12246       --DBMS_OUTPUT.PUT_LINE(' Conversion needed flag '||l_conversion_needed_flag);
12247 
12248       --bug # 3056622 charge amount is zero for items with negative prices
12249 
12250       IF x_charges_detail_rec.no_charge_flag <> 'Y' AND x_charges_detail_rec.selling_price IS NOT NULL THEN
12251         IF l_conversion_needed_flag = 'Y' THEN
12252           IF p_charges_detail_rec.selling_price IS NOT NULL THEN
12253             x_charges_detail_rec.selling_price := x_charges_detail_rec.selling_price * x_charges_detail_rec.conversion_rate;
12254             x_charges_detail_rec.after_warranty_cost := x_charges_detail_rec.selling_price * x_charges_detail_rec.quantity_required;
12255           ELSE
12256             x_charges_detail_rec.after_warranty_cost := x_charges_detail_rec.selling_price * x_charges_detail_rec.quantity_required * x_charges_detail_rec.conversion_rate;
12257           END IF;
12258         ELSE
12259           x_charges_detail_rec.after_warranty_cost := x_charges_detail_rec.selling_price * x_charges_detail_rec.quantity_required;
12260         END IF;
12261       ELSE
12262         -- no charge flag = 'Y'
12263         x_charges_detail_rec.after_warranty_cost := 0;
12264       END IF;
12265 
12266       --DBMS_OUTPUT.PUT_LINE(' after warr cost is '|| x_charges_detail_rec.after_warranty_cost);
12267 
12268 
12269       --check to see if contract discount needs to be applied
12270 
12271       --DBMS_OUTPUT.PUT_LINE('apply contract discount '|| x_charges_detail_rec.apply_contract_discount);
12272       --DBMS_OUTPUT.PUT_LINE('contract_id '||x_charges_detail_rec.contract_id);
12273       --DBMS_OUTPUT.PUT_LINE('coverage_id '||x_charges_detail_rec.coverage_id);
12274 
12275       IF x_charges_detail_rec.apply_contract_discount = 'Y' AND
12276          x_charges_detail_rec.no_charge_flag <> 'Y' AND
12277          x_charges_detail_rec.contract_line_id IS NOT NULL THEN
12278 
12279         --assign to out record
12280         x_charges_detail_rec.apply_contract_discount := p_charges_detail_rec.apply_contract_discount;
12281 
12282         --DBMS_OUTPUT.PUT_LINE('calling get_contract_line_id');
12283 
12284         --DBMS_OUTPUT.PUT_LINE('after calling get_contract_line_id');
12285         --call contracts dicounting API
12286         --DBMS_OUTPUT.PUT_LINE('Call Contracts API to Apply contracts 2');
12287 
12288         CS_Est_Apply_Contract_PKG.Apply_Contract(
12289           p_coverage_id           => x_charges_detail_rec.contract_line_id,
12290           p_coverage_txn_group_id => x_charges_detail_rec.coverage_txn_group_id,
12291           p_txn_billing_type_id   => x_charges_detail_rec.txn_billing_type_id,
12292           P_BUSINESS_PROCESS_ID   => x_charges_detail_rec.business_process_id,
12293           P_REQUEST_DATE          => l_request_date,
12294           p_amount                => x_charges_detail_rec.after_warranty_cost,
12295           p_discount_amount       => l_contract_discount,
12296           X_RETURN_STATUS         => l_return_status,
12297           X_MSG_COUNT             => l_msg_count,
12298           X_MSG_DATA              => l_msg_data);
12299 
12300         IF l_return_status <> FND_API.G_RET_STS_SUCCESS THEN
12301           FND_MESSAGE.Set_Name('CS', 'CS_CHG_APPLY_CONTRACT_WARNING');
12302           FND_MESSAGE.SET_TOKEN('REASON', l_msg_data);
12303           FND_MSG_PUB.Add;
12304           RAISE FND_API.G_EXC_ERROR;
12305         END IF;
12306 
12307         --Bug Fix for Bug # 3088397
12308         IF l_contract_discount IS NOT NULL THEN
12309           --assign the contract discount to the out record
12310           x_charges_detail_rec.contract_discount_amount := x_charges_detail_rec.after_warranty_cost - l_contract_discount;
12311 
12312           --apply discount
12313           x_charges_detail_rec.after_warranty_cost := l_contract_discount;
12314 
12315         ELSE
12316           -- contract discount amt should be 0
12317           --x_charges_detail_rec.contract_discount_amount := 0;
12318           null;
12319         END IF;
12320         --DBMS_OUTPUT.PUT_LINE('l_contract_discount'||l_contract_discount);
12321         --DBMS_OUTPUT.PUT_LINE('Contract 2'||x_charges_detail_rec.contract_discount_amount);
12322 
12323       ELSE
12324         --Apply contract discount = 'N'
12325         --Fixed Bug # 3220253
12326         --passed p_charges_detail_rec.contract_discount_amount
12327         x_charges_detail_rec.apply_contract_discount := p_charges_detail_rec.apply_contract_discount;
12328         x_charges_detail_rec.contract_discount_amount := p_charges_detail_rec.contract_discount_amount;
12329 
12330         IF x_charges_detail_rec.contract_discount_amount IS NULL THEN
12331           x_charges_detail_rec.contract_discount_amount := 0;
12332         ELSE
12333           x_charges_detail_rec.contract_discount_amount := x_charges_detail_rec.contract_discount_amount;
12334         END IF;
12335 
12336       END IF ;
12337 
12338 
12339     ELSE
12340       --x_charges_detail_rec.inventory_item_id_in IS NULL
12341       --x_charges_detail_rec.unit_of_measure_code IS NULL
12342       --x_charges_detail_rec.price_list_id IS NULL
12343       --x_charges_detail_rec.quantity_required IS NULL
12344       --the list price cannot be derived and the
12345       --after warranty cost cannot be computed
12346       --assign 0 to list_price and after_warranty_cost
12347       x_charges_detail_rec.list_price := 0;
12348       x_charges_detail_rec.selling_price := 0;
12349       x_charges_detail_rec.after_warranty_cost := 0;
12350       x_charges_detail_rec.contract_discount_amount := 0;
12351 
12352     END IF;
12353 
12354   --Added to fix bug # 3217757
12355   --debriefed expense line not displaying correct amount
12356 
12357   ELSIF x_charges_detail_rec.billing_flag = 'E' AND
12358         x_charges_detail_rec.source_code = 'SD' AND
12359         p_charges_detail_rec.after_warranty_cost IS NOT NULL THEN
12360 
12361 	IF p_charges_detail_rec.list_price IS NULL THEN --12.1.3 Multi Currency, vpremach
12362 	    IF l_curr_in_conversion_list = 'Y' THEN --AND fnd_profile.value('CS_ENABLE_CURRENCY_CONVERSION') = 'Y' THEN
12363 		FND_MESSAGE.SET_NAME('CS', 'CS_CHG_NOT_BASE_CURRENCY');
12364 		FND_MESSAGE.Set_Token('CURRENCY_CODE', p_charges_detail_rec.currency_code);
12365 		FND_MSG_PUB.Add;
12366 		RAISE FND_API.G_EXC_ERROR;
12367 	    END IF;
12368 	END IF;
12369         --DBMS_OUTPUT.PUT_LINE('Expense line with after warr cost ');
12370  /* Start Bug 6960562 */
12371     IF l_line_order_category_code = 'RETURN' THEN
12372         x_charges_detail_rec.after_warranty_cost := p_charges_detail_rec.after_warranty_cost * x_charges_detail_rec.quantity_required;
12373     ELSE
12374     -- Assign the after warranty that comes on the line
12375         x_charges_detail_rec.after_warranty_cost := p_charges_detail_rec.after_warranty_cost;
12376     END IF;
12377   /* End Bug 6960562 */
12378     x_charges_detail_rec.list_price := p_charges_detail_rec.after_warranty_cost;
12379 
12380     IF l_conversion_needed_flag = 'Y' THEN
12381       --assign coverted amt to after_list_price
12382       x_charges_detail_rec.list_price := x_charges_detail_rec.list_price * x_charges_detail_rec.conversion_rate;
12383 
12384       --bug # 3056600 charge amount is zero for items with negative prices
12385 
12386       IF p_charges_detail_rec.selling_price IS NOT NULL THEN
12387         x_charges_detail_rec.selling_price :=  p_charges_detail_rec.selling_price * x_charges_detail_rec.conversion_rate;
12388       ELSE
12389         x_charges_detail_rec.selling_price :=  x_charges_detail_rec.list_price;
12390       END IF;
12391 
12392       -- Fixed second issue in Bug 3468146
12393       -- If the line originates from SD and has a after_warranty_cost
12394       -- but the no_charge_flag = 'Y' then make after_warranty_cost = 0
12395 
12396       IF x_charges_detail_rec.no_charge_flag = 'Y' THEN
12397          x_charges_detail_rec.after_warranty_cost := 0;
12398       ELSE
12399          x_charges_detail_rec.after_warranty_cost := x_charges_detail_rec.after_warranty_cost * x_charges_detail_rec.conversion_rate;
12400       END IF;
12401 
12402     ELSE
12403       --l_conversion_needed_flag = 'N'
12404       --bug # 3056600 charge amount is zero for items with negative prices
12405       IF p_charges_detail_rec.selling_price IS NOT NULL THEN
12406         x_charges_detail_rec.selling_price :=  p_charges_detail_rec.selling_price;
12407       ELSE
12408         x_charges_detail_rec.selling_price :=  x_charges_detail_rec.list_price;
12409       END IF;
12410 
12411       -- Fixed second issue in Bug 3468146
12412       -- If the line originates from SD and has a after_warranty_cost
12413       -- but the no_charge_flag = 'Y' then make after_warranty_cost = 0
12414       IF x_charges_detail_rec.no_charge_flag = 'Y' THEN
12415          x_charges_detail_rec.after_warranty_cost := 0;
12416       END IF;
12417     END IF;
12418 
12419     --Fixed Bug # 3468146
12420     --need to do this here so that contract discounting is done correctly
12421     --re-set the no_charge_flag for Charge Lines
12422     --since the line has come with after warranty cost from upstream
12423     IF x_charges_detail_rec.after_warranty_cost <> 0 THEN
12424       x_charges_detail_rec.no_charge_flag := 'N';
12425     END IF;
12426 
12427 
12428     --DBMS_OUTPUT.PUT_LINE('re-setting the no_charge_flag' ||x_charges_detail_rec.no_charge_flag);
12429 
12430     IF x_charges_detail_rec.apply_contract_discount = 'Y' AND
12431        x_charges_detail_rec.no_charge_flag <> 'Y' AND
12432        x_charges_detail_rec.contract_line_id IS NOT NULL THEN
12433 
12434          --call contracts dicounting API
12435          CS_Est_Apply_Contract_PKG.Apply_Contract (
12436             p_coverage_id           => x_charges_detail_rec.contract_line_id,
12437             p_coverage_txn_group_id => x_charges_detail_rec.coverage_txn_group_id,
12438             p_business_process_id   => x_charges_detail_rec.business_process_id,
12439             p_request_date          => l_request_date,
12440             p_txn_billing_type_id   => x_charges_detail_rec.txn_billing_type_id,
12441             p_amount                => x_charges_detail_rec.after_warranty_cost,
12442             p_discount_amount       => l_contract_discount,
12443             X_RETURN_STATUS         => l_return_status,
12444             X_MSG_COUNT             => l_msg_count,
12445             X_MSG_DATA              => l_msg_data);
12446 
12447         IF l_return_status <> FND_API.G_RET_STS_SUCCESS THEN
12448           FND_MESSAGE.Set_Name('CS', 'CS_CHG_APPLY_CONTRACT_WARNING');
12449           FND_MESSAGE.SET_TOKEN('REASON', l_msg_data);
12450           FND_MSG_PUB.Add;
12451           RAISE FND_API.G_EXC_ERROR;
12452         END IF;
12453 
12454          IF l_contract_discount IS NOT NULL THEN
12455           --assign the contract discount to the out record
12456           x_charges_detail_rec.contract_discount_amount := x_charges_detail_rec.after_warranty_cost - l_contract_discount;
12457 
12458           --apply discount
12459           x_charges_detail_rec.after_warranty_cost := l_contract_discount;
12460 
12461         ELSE
12462           -- contract discount amt should be 0
12463           --x_charges_detail_rec.contract_discount_amount := 0;
12464           null;
12465         END IF;
12466 
12467     ELSE
12468       --Apply contract discount = 'N'
12469       --Fixed Bug # 3220253
12470       --passed p_charges_detail_rec.contract_discount_amount
12471       x_charges_detail_rec.apply_contract_discount := p_charges_detail_rec.apply_contract_discount;
12472       x_charges_detail_rec.contract_discount_amount := p_charges_detail_rec.contract_discount_amount;
12473 
12474       IF x_charges_detail_rec.contract_discount_amount IS NULL THEN
12475           x_charges_detail_rec.contract_discount_amount := 0;
12476       ELSE
12477           x_charges_detail_rec.contract_discount_amount := x_charges_detail_rec.contract_discount_amount;
12478       END IF;
12479     END IF ;
12480 
12481 
12482   ELSIF
12483         --Fix # 3069583 unable to override charges for labor charge line
12484         x_charges_detail_rec.billing_flag IN ('E', 'M', 'L') AND
12485         p_charges_detail_rec.after_warranty_cost IS NOT NULL THEN
12486 
12487 	IF p_charges_detail_rec.list_price IS NULL THEN --12.1.3 Multi Currency, vpremach
12488 	    IF l_curr_in_conversion_list = 'Y' THEN --AND fnd_profile.value('CS_ENABLE_CURRENCY_CONVERSION') = 'Y' THEN
12489 		FND_MESSAGE.SET_NAME('CS', 'CS_CHG_NOT_BASE_CURRENCY');
12490 		FND_MESSAGE.Set_Token('CURRENCY_CODE', p_charges_detail_rec.currency_code);
12491 		FND_MSG_PUB.Add;
12492 		RAISE FND_API.G_EXC_ERROR;
12493 	    END IF;
12494 	END IF;
12495 
12496         --DBMS_OUTPUT.PUT_LINE('Expense line with after warr cost ');
12497         --DBMS_OUTPUT.PUT_LINE('l_conversion_needed_flag '||l_conversion_needed_flag);
12498         --DBMS_OUTPUT.PUT_LINE('after_warranty_cost = '||p_charges_detail_rec.after_warranty_cost );
12499 
12500         -- Added to fix Bug # 3819167
12501         --
12502         /*
12503         IF ((l_line_order_category_code = 'RETURN') AND
12504           (sign(x_charges_detail_rec.quantity_required) = -1)) THEN
12505           l_absolute_quantity_required := x_charges_detail_rec.quantity_required * -1;
12506         ELSE
12507           l_absolute_quantity_required := x_charges_detail_rec.quantity_required;
12508         END IF;
12509         */
12510 
12511        IF nvl(l_curr_in_conversion_list,'N')  <> 'Y' Then
12512 
12513 	-- Call the pricing API just to verify that the item is on the price list
12514         CS_Pricing_Item_Pkg.Call_Pricing_Item(
12515             P_Inventory_Item_Id          => x_charges_detail_rec.inventory_item_id_in,
12516             P_Price_List_Id              => x_charges_detail_rec.price_list_id,
12517             P_UOM_Code                   => x_charges_detail_rec.unit_of_measure_code,
12518             p_Currency_Code              => x_charges_detail_rec.currency_code,
12519             P_Quantity                   => abs(x_charges_detail_rec.quantity_required),
12520             P_Org_Id                     => x_charges_detail_rec.org_id,
12521             x_list_price                 => l_list_price,
12522             P_Pricing_Context            => x_charges_detail_rec.pricing_context,
12523             P_Pricing_Attribute1         => x_charges_detail_rec.pricing_attribute1,
12524             P_Pricing_Attribute2         => x_charges_detail_rec.pricing_attribute2,
12525             P_Pricing_Attribute3         => x_charges_detail_rec.pricing_attribute3,
12526             P_Pricing_Attribute4         => x_charges_detail_rec.pricing_attribute4,
12527             P_Pricing_Attribute5         => x_charges_detail_rec.pricing_attribute5,
12528             P_Pricing_Attribute6         => x_charges_detail_rec.pricing_attribute6,
12529             P_Pricing_Attribute7         => x_charges_detail_rec.pricing_attribute7,
12530             P_Pricing_Attribute8         => x_charges_detail_rec.pricing_attribute8,
12531             P_Pricing_Attribute9         => x_charges_detail_rec.pricing_attribute9,
12532             P_Pricing_Attribute10        => x_charges_detail_rec.pricing_attribute10,
12533             P_Pricing_Attribute11        => x_charges_detail_rec.pricing_attribute11,
12534             P_Pricing_Attribute12        => x_charges_detail_rec.pricing_attribute12,
12535             P_Pricing_Attribute13        => x_charges_detail_rec.pricing_attribute13,
12536             P_Pricing_Attribute14        => x_charges_detail_rec.pricing_attribute14,
12537             P_Pricing_Attribute15        => x_charges_detail_rec.pricing_attribute15,
12538             P_Pricing_Attribute16        => x_charges_detail_rec.pricing_attribute16,
12539             P_Pricing_Attribute17        => x_charges_detail_rec.pricing_attribute17,
12540             P_Pricing_Attribute18        => x_charges_detail_rec.pricing_attribute18,
12541             P_Pricing_Attribute19        => x_charges_detail_rec.pricing_attribute19,
12542             P_Pricing_Attribute20        => x_charges_detail_rec.pricing_attribute20,
12543             P_Pricing_Attribute21        => x_charges_detail_rec.pricing_attribute21,
12544             P_Pricing_Attribute22        => x_charges_detail_rec.pricing_attribute22,
12545             P_Pricing_Attribute23        => x_charges_detail_rec.pricing_attribute23,
12546             P_Pricing_Attribute24        => x_charges_detail_rec.pricing_attribute24,
12547             P_Pricing_Attribute25        => x_charges_detail_rec.pricing_attribute25,
12548             p_Pricing_Attribute26        => x_charges_detail_rec.pricing_attribute26,
12549             P_Pricing_Attribute27        => x_charges_detail_rec.pricing_attribute27,
12550             P_Pricing_Attribute28        => x_charges_detail_rec.pricing_attribute28,
12551             P_Pricing_Attribute29        => x_charges_detail_rec.pricing_attribute29,
12552             P_Pricing_Attribute30        => x_charges_detail_rec.pricing_attribute30,
12553             P_PRICING_ATTRIBUTE31        => x_charges_detail_rec.pricing_attribute31,
12554             P_PRICING_ATTRIBUTE32        => x_charges_detail_rec.pricing_attribute32,
12555             P_PRICING_ATTRIBUTE33        => x_charges_detail_rec.pricing_attribute33,
12556             P_PRICING_ATTRIBUTE34        => x_charges_detail_rec.pricing_attribute34,
12557             P_Pricing_Attribute35        => x_charges_detail_rec.pricing_attribute35,
12558             P_Pricing_Attribute36        => x_charges_detail_rec.pricing_attribute36,
12559             P_Pricing_Attribute37        => x_charges_detail_rec.pricing_attribute37,
12560             P_Pricing_Attribute38        => x_charges_detail_rec.pricing_attribute38,
12561             P_Pricing_Attribute39        => x_charges_detail_rec.pricing_attribute39,
12562             P_Pricing_Attribute40        => x_charges_detail_rec.pricing_attribute40,
12563             P_Pricing_Attribute41        => x_charges_detail_rec.pricing_attribute41,
12564             P_Pricing_Attribute42        => x_charges_detail_rec.pricing_attribute42,
12565             P_Pricing_Attribute43        => x_charges_detail_rec.pricing_attribute43,
12566             P_Pricing_Attribute44        => x_charges_detail_rec.pricing_attribute44,
12567             P_Pricing_Attribute45        => x_charges_detail_rec.pricing_attribute45,
12568             P_Pricing_Attribute46        => x_charges_detail_rec.pricing_attribute46,
12569             P_Pricing_Attribute47        => x_charges_detail_rec.pricing_attribute47,
12570             P_Pricing_Attribute48        => x_charges_detail_rec.pricing_attribute48,
12571             P_Pricing_Attribute49        => x_charges_detail_rec.pricing_attribute49,
12572             P_Pricing_Attribute50        => x_charges_detail_rec.pricing_attribute50,
12573             P_Pricing_Attribute51        => x_charges_detail_rec.pricing_attribute51,
12574             P_Pricing_Attribute52        => x_charges_detail_rec.pricing_attribute52,
12575             P_Pricing_Attribute53        => x_charges_detail_rec.pricing_attribute53,
12576             P_Pricing_Attribute54        => x_charges_detail_rec.pricing_attribute54,
12577             P_Pricing_Attribute55        => x_charges_detail_rec.pricing_attribute55,
12578             P_Pricing_Attribute56        => x_charges_detail_rec.pricing_attribute56,
12579             P_Pricing_Attribute57        => x_charges_detail_rec.pricing_attribute57,
12580             P_Pricing_Attribute58        => x_charges_detail_rec.pricing_attribute58,
12581             P_Pricing_Attribute59        => x_charges_detail_rec.pricing_attribute59,
12582             P_Pricing_Attribute60        => x_charges_detail_rec.pricing_attribute60,
12583             P_Pricing_Attribute61        => x_charges_detail_rec.pricing_attribute61,
12584             P_Pricing_Attribute62        => x_charges_detail_rec.pricing_attribute62,
12585             P_Pricing_Attribute63        => x_charges_detail_rec.pricing_attribute63,
12586             P_Pricing_Attribute64        => x_charges_detail_rec.pricing_attribute64,
12587             P_Pricing_Attribute65        => x_charges_detail_rec.pricing_attribute65,
12588             P_Pricing_Attribute66        => x_charges_detail_rec.pricing_attribute66,
12589             P_Pricing_Attribute67        => x_charges_detail_rec.pricing_attribute67,
12590             P_Pricing_Attribute68        => x_charges_detail_rec.pricing_attribute68,
12591             P_Pricing_Attribute69        => x_charges_detail_rec.pricing_attribute69,
12592             P_Pricing_Attribute70        => x_charges_detail_rec.pricing_attribute70,
12593             P_Pricing_Attribute71        => x_charges_detail_rec.pricing_attribute71,
12594             P_Pricing_Attribute72        => x_charges_detail_rec.pricing_attribute72,
12595             P_Pricing_Attribute73        => x_charges_detail_rec.pricing_attribute73,
12596             P_Pricing_Attribute74        => x_charges_detail_rec.pricing_attribute74,
12597             P_Pricing_Attribute75        => x_charges_detail_rec.pricing_attribute75,
12598             P_Pricing_Attribute76        => x_charges_detail_rec.pricing_attribute76,
12599             P_Pricing_Attribute77        => x_charges_detail_rec.pricing_attribute77,
12600             P_Pricing_Attribute78        => x_charges_detail_rec.pricing_attribute78,
12601             P_Pricing_Attribute79        => x_charges_detail_rec.pricing_attribute79,
12602             P_Pricing_Attribute80        => x_charges_detail_rec.pricing_attribute80,
12603             P_Pricing_Attribute81        => x_charges_detail_rec.pricing_attribute81,
12604             P_Pricing_Attribute82        => x_charges_detail_rec.pricing_attribute82,
12605             P_Pricing_Attribute83        => x_charges_detail_rec.pricing_attribute83,
12606             P_Pricing_Attribute84        => x_charges_detail_rec.pricing_attribute84,
12607             P_Pricing_Attribute85        => x_charges_detail_rec.pricing_attribute85,
12608             P_Pricing_Attribute86        => x_charges_detail_rec.pricing_attribute86,
12609             P_Pricing_Attribute87        => x_charges_detail_rec.pricing_attribute87,
12610             P_Pricing_Attribute88        => x_charges_detail_rec.pricing_attribute88,
12611             P_Pricing_Attribute89        => x_charges_detail_rec.pricing_attribute89,
12612             P_Pricing_Attribute90        => x_charges_detail_rec.pricing_attribute90,
12613             P_Pricing_Attribute91        => x_charges_detail_rec.pricing_attribute91,
12614             P_Pricing_Attribute92        => x_charges_detail_rec.pricing_attribute92,
12615             P_Pricing_Attribute93        => x_charges_detail_rec.pricing_attribute93,
12616             P_Pricing_Attribute94        => x_charges_detail_rec.pricing_attribute94,
12617             P_Pricing_Attribute95        => x_charges_detail_rec.pricing_attribute95,
12618             P_Pricing_Attribute96        => x_charges_detail_rec.pricing_attribute96,
12619             P_Pricing_Attribute97        => x_charges_detail_rec.pricing_attribute97,
12620             P_Pricing_Attribute98        => x_charges_detail_rec.pricing_attribute98,
12621             P_Pricing_Attribute99        => x_charges_detail_rec.pricing_attribute99,
12622             P_Pricing_Attribute100       => x_charges_detail_rec.pricing_attribute100,
12623             x_return_status              => l_return_status,
12624             x_msg_count                  => l_msg_count,
12625             x_msg_data                   => l_msg_data);
12626 
12627       --DBMS_OUTPUT.PUT_LINE('After calling CS_Pricing_Item_Pkg.Call_Pricing_Item ...');
12628       --DBMS_OUTPUT.PUT_LINE('l_msg_data '||l_msg_data);
12629 
12630       IF (l_return_status <> FND_API.G_RET_STS_SUCCESS) THEN
12631         FND_MESSAGE.Set_Name('CS', 'CS_CHG_API_PRICING_ITEM_ERROR');
12632         FND_MESSAGE.set_token('INV_ID', x_charges_detail_rec.inventory_item_id_in);
12633         FND_MESSAGE.set_token('PRICE_LIST_ID', x_charges_detail_rec.price_list_id);
12634         FND_MESSAGE.set_token('UOM', x_charges_detail_rec.unit_of_measure_code);
12635         FND_MESSAGE.set_token('CURR_CODE', x_charges_detail_rec.currency_code);
12636         --FND_MESSAGE.SET_TOKEN('TEXT', l_msg_data, TRUE);
12637         FND_MSG_PUB.Add;
12638         RAISE FND_API.G_EXC_ERROR;
12639       END IF;
12640      END IF;
12641 
12642 
12643       -- Assign the after warranty that comes on the line
12644         x_charges_detail_rec.after_warranty_cost := p_charges_detail_rec.after_warranty_cost;
12645 
12646     IF l_conversion_needed_flag = 'Y' THEN
12647 
12648       --assign coverted amt to after_warranty_cost
12649       x_charges_detail_rec.after_warranty_cost := x_charges_detail_rec.after_warranty_cost * x_charges_detail_rec.conversion_rate;
12650       IF l_curr_in_conversion_list = 'Y' --AND fnd_profile.value('CS_ENABLE_CURRENCY_CONVERSION') = 'Y'  --12.1.3 Multi Currency, vpremach
12651          AND p_charges_detail_rec.list_price IS NOT NULL THEN
12652             x_charges_detail_rec.list_price := p_charges_detail_rec.list_price;
12653       ELSE
12654             x_charges_detail_rec.list_price := l_list_price;
12655       END IF;
12656 
12657       --bug # 3056622 charge amount is zero for items with negative prices
12658 
12659       IF p_charges_detail_rec.selling_price IS NOT NULL THEN
12660         x_charges_detail_rec.selling_price :=  p_charges_detail_rec.selling_price * x_charges_detail_rec.conversion_rate;
12661       ELSE
12662         x_charges_detail_rec.selling_price :=  x_charges_detail_rec.list_price;
12663       END IF;
12664 
12665     ELSE
12666 
12667       x_charges_detail_rec.after_warranty_cost := p_charges_detail_rec.after_warranty_cost;
12668       IF l_curr_in_conversion_list = 'Y' --AND fnd_profile.value('CS_ENABLE_CURRENCY_CONVERSION') = 'Y'  --12.1.3 Multi Currency, vpremach
12669          AND p_charges_detail_rec.list_price IS NOT NULL THEN
12670 	    x_charges_detail_rec.list_price := p_charges_detail_rec.list_price;
12671       ELSE
12672             x_charges_detail_rec.list_price := l_list_price;
12673       END IF;
12674 
12675       --bug # 3056622 charge amount is zero for items with negative prices
12676 
12677       IF p_charges_detail_rec.selling_price IS NOT NULL THEN
12678         x_charges_detail_rec.selling_price :=  p_charges_detail_rec.selling_price;
12679       ELSE
12680         x_charges_detail_rec.selling_price :=  x_charges_detail_rec.list_price;
12681       END IF;
12682 
12683     END IF;
12684 
12685     --DBMS_OUTPUT.PUT_LINE(' after_warranty_cost '||x_charges_detail_rec.after_warranty_cost );
12686 
12687     --Fixed Bug # 3468146
12688     --need to do this here so that contract discounting is done correctly
12689     --re-set the no_charge_flag for Charge Lines
12690     --since the line has come with after warranty cost from upstream
12691     IF x_charges_detail_rec.after_warranty_cost <> 0 THEN
12692       x_charges_detail_rec.no_charge_flag := 'N';
12693     END IF;
12694 
12695 
12696     --DBMS_OUTPUT.PUT_LINE('re-setting the no_charge_flag' ||x_charges_detail_rec.no_charge_flag);
12697 
12698 
12699     IF x_charges_detail_rec.apply_contract_discount = 'Y' AND
12700        x_charges_detail_rec.no_charge_flag <> 'Y' AND
12701        x_charges_detail_rec.contract_line_id IS NOT NULL THEN
12702 
12703       --call contracts dicounting API
12704       CS_Est_Apply_Contract_PKG.Apply_Contract (
12705             p_coverage_id           => x_charges_detail_rec.contract_line_id,
12706             p_coverage_txn_group_id => x_charges_detail_rec.coverage_txn_group_id,
12707             p_business_process_id   => x_charges_detail_rec.business_process_id,
12708             p_request_date          => l_request_date,
12709             p_txn_billing_type_id   => x_charges_detail_rec.txn_billing_type_id,
12710             p_amount                => x_charges_detail_rec.after_warranty_cost,
12711             p_discount_amount       => l_contract_discount,
12712             X_RETURN_STATUS         => l_return_status,
12713             X_MSG_COUNT             => l_msg_count,
12714             X_MSG_DATA              => l_msg_data);
12715 
12716       IF l_return_status <> FND_API.G_RET_STS_SUCCESS THEN
12717         FND_MESSAGE.Set_Name('CS', 'CS_CHG_APPLY_CONTRACT_WARNING');
12718         FND_MESSAGE.SET_TOKEN('REASON', l_msg_data);
12719         FND_MSG_PUB.Add;
12720         RAISE FND_API.G_EXC_ERROR;
12721       END IF;
12722 
12723       --Bug Fix for Bug # 3088397
12724       IF l_contract_discount IS NOT NULL THEN
12725         --assign the contract discount to the out record
12726         x_charges_detail_rec.contract_discount_amount := x_charges_detail_rec.after_warranty_cost - l_contract_discount;
12727 
12728         --apply discount
12729         x_charges_detail_rec.after_warranty_cost := l_contract_discount;
12730 
12731        ELSE
12732           -- contract discount amt should be 0
12733           --x_charges_detail_rec.contract_discount_amount := 0;
12734           null;
12735       END IF;
12736 
12737     ELSE
12738       --Apply contract discount = 'N'
12739       --Fixed Bug # 3220253
12740       --passed p_charges_detail_rec.contract_discount_amount
12741       x_charges_detail_rec.apply_contract_discount := p_charges_detail_rec.apply_contract_discount;
12742       x_charges_detail_rec.contract_discount_amount := p_charges_detail_rec.contract_discount_amount;
12743 
12744       IF x_charges_detail_rec.contract_discount_amount IS NULL THEN
12745           x_charges_detail_rec.contract_discount_amount := 0;
12746       ELSE
12747           x_charges_detail_rec.contract_discount_amount := x_charges_detail_rec.contract_discount_amount;
12748       END IF;
12749     END IF ;
12750   END IF;
12751   IF   l_line_order_category_code = 'ORDER' THEN      --Bug 6960562
12752       /* Start : 5705568 */
12753 --      If x_charges_detail_rec.after_warranty_cost < 0  Then
12754 -- Bug 8305664 removed the and condition in the if statement
12755       If x_charges_detail_rec.after_warranty_cost < 0  Then  -- bug 7459205
12756           x_charges_detail_rec.after_warranty_cost := 0;
12757       End If;
12758      /* End : 5705568 */
12759   End If;
12760 ELSIF p_validation_mode = 'U' THEN
12761 
12762   IF  l_curr_in_conversion_list = 'Y' AND p_charges_detail_rec.list_price is null then --12.1.3, vpremach
12763        FND_MESSAGE.SET_NAME('CS', 'CS_CHG_NOT_BASE_CURRENCY');
12764        FND_MESSAGE.Set_Token('CURRENCY_CODE', p_charges_detail_rec.currency_code);
12765        FND_MSG_PUB.Add;
12766        RAISE FND_API.G_EXC_ERROR;
12767   END IF;
12768   --DBMS_OUTPUT.PUT_LINE('In Update of Pricing API');
12769   --DBMS_OUTPUT.PUT_LINE('Billing Flag '||x_charges_detail_rec.billing_flag);
12770   --DBMS_OUTPUT.PUT_LINE('AFter_warranty_cost '||p_charges_detail_rec.after_warranty_cost);
12771   --DBMS_OUTPUT.PUT_LINE('selling price '||p_charges_detail_rec.selling_price);
12772 
12773   IF x_charges_detail_rec.billing_flag = 'L' AND
12774      p_charges_detail_rec.list_price <> FND_API.G_MISS_NUM AND
12775      p_charges_detail_rec.list_price IS NOT NULL THEN
12776 
12777     IF p_charges_detail_rec.list_price <> l_db_det_rec.list_price THEN
12778 
12779        l_calc_sp := 'Y';
12780 
12781 
12782        -- no need to call the pricing api
12783        -- assign to out record
12784        x_charges_detail_rec.list_price    := p_charges_detail_rec.list_price;
12785        x_charges_detail_rec.selling_price := p_charges_detail_rec.list_price;
12786 
12787        --bug # 3056622 charge amount is zero for items with negative prices
12788 
12789        --derive the after_warranty_cost
12790        IF x_charges_detail_rec.no_charge_flag <> 'Y' AND
12791           x_charges_detail_rec.selling_price IS NOT NULL THEN
12792 
12793           --Fix for Bug # 3388373
12794           IF p_charges_detail_rec.after_warranty_cost IS NOT NULL THEN
12795 
12796             x_charges_detail_rec.after_warranty_cost := p_charges_detail_rec.after_warranty_cost;
12797             l_calc_sp := 'N';
12798           ELSIF p_charges_detail_rec.after_warranty_cost = FND_API.G_MISS_NUM THEN
12799             x_charges_detail_rec.after_warranty_cost := l_db_det_rec.after_warranty_cost;
12800             l_calc_sp := 'N';
12801           ELSE
12802             --after warr cost is null
12803             x_charges_detail_rec.after_warranty_cost := x_charges_detail_rec.selling_price * x_charges_detail_rec.quantity_required;
12804           END IF;
12805 
12806        ELSE
12807           -- no charge flag = 'Y'
12808           x_charges_detail_rec.after_warranty_cost := 0;
12809        END IF;
12810 
12811        --check to see if contract discount needs to be applied
12812        IF x_charges_detail_rec.apply_contract_discount = 'Y' AND
12813           x_charges_detail_rec.no_charge_flag <> 'Y' AND
12814           x_charges_detail_rec.contract_line_id IS NOT NULL THEN
12815 
12816           --assign to out record
12817           x_charges_detail_rec.apply_contract_discount := p_charges_detail_rec.apply_contract_discount;
12818 
12819           --call contracts dicounting API
12820           --DBMS_OUTPUT.PUT_LINE('Call Contracts API to Apply contracts 3');
12821 
12822          CS_Est_Apply_Contract_PKG.Apply_Contract(
12823            p_coverage_id           => x_charges_detail_rec.contract_line_id,
12824            p_coverage_txn_group_id => x_charges_detail_rec.coverage_txn_group_id,
12825            p_txn_billing_type_id   => x_charges_detail_rec.txn_billing_type_id,
12826            P_BUSINESS_PROCESS_ID   => x_charges_detail_rec.business_process_id,
12827            P_REQUEST_DATE          => l_request_date,
12828            p_amount                => x_charges_detail_rec.after_warranty_cost,
12829            p_discount_amount       => l_contract_discount,
12830            X_RETURN_STATUS         => l_return_status,
12831            X_MSG_COUNT             => l_msg_count,
12832            X_MSG_DATA              => l_msg_data);
12833 
12834           IF l_return_status <> FND_API.G_RET_STS_SUCCESS THEN
12835             FND_MESSAGE.Set_Name('CS', 'CS_CHG_APPLY_CONTRACT_WARNING');
12836             FND_MESSAGE.SET_TOKEN('REASON', l_msg_data);
12837             FND_MSG_PUB.Add;
12838             RAISE FND_API.G_EXC_ERROR;
12839           END IF;
12840 
12841           --Bug Fix for Bug # 3088397
12842           IF l_contract_discount IS NOT NULL THEN
12843             --assign the contract discount to the out record
12844             x_charges_detail_rec.contract_discount_amount := x_charges_detail_rec.after_warranty_cost - l_contract_discount;
12845 
12846             --apply discount
12847             x_charges_detail_rec.after_warranty_cost := l_contract_discount;
12848           ELSE
12849             -- contract discount amt should be 0
12850             --x_charges_detail_rec.contract_discount_amount := 0;
12851             null;
12852           END IF;
12853 
12854           --DBMS_OUTPUT.PUT_LINE('Contract 3'||x_charges_detail_rec.contract_discount_amount);
12855 
12856       ELSE
12857         --Apply contract discount = 'N'
12858         --Fixed Bug # 3220253
12859         --passed p_charges_detail_rec.contract_discount_amount
12860         x_charges_detail_rec.apply_contract_discount := p_charges_detail_rec.apply_contract_discount;
12861         x_charges_detail_rec.contract_discount_amount := p_charges_detail_rec.contract_discount_amount;
12862 
12863         IF x_charges_detail_rec.contract_discount_amount IS NULL THEN
12864           x_charges_detail_rec.contract_discount_amount := 0;
12865         ELSE
12866           x_charges_detail_rec.contract_discount_amount := x_charges_detail_rec.contract_discount_amount;
12867         END IF;
12868 
12869       END IF ;
12870     ELSE
12871        --p_charges_detail_rec.list_price = l_db_det_rec.list_price
12872 
12873        -- no need to call the pricing api
12874        -- assign to out record what is the dbatabase
12875        x_charges_detail_rec.list_price    := l_db_det_rec.list_price;
12876        x_charges_detail_rec.selling_price := l_db_det_rec.list_price;
12877 
12878        --bug # 3056622 charge amount is zero for items with negative prices
12879         --derive the after_warranty_cost
12880        IF x_charges_detail_rec.no_charge_flag <> 'Y' THEN
12881           --Condition added to fix Bug # 3358531
12882   	  -- Bug 9945655
12883           --x_charges_detail_rec.after_warranty_cost := l_db_det_rec.after_warranty_cost;
12884   	  x_charges_detail_rec.after_warranty_cost := x_charges_detail_rec.selling_price * x_charges_detail_rec.quantity_required;
12885 
12886        ELSE
12887           -- no charge flag = 'Y'
12888           x_charges_detail_rec.after_warranty_cost := 0;
12889        END IF;
12890 
12891 
12892       --check to see if contract discount needs to be applied
12893       IF x_charges_detail_rec.apply_contract_discount = 'Y' AND
12894          x_charges_detail_rec.contract_line_id IS NOT NULL AND
12895          x_charges_detail_rec.no_charge_flag <> 'Y' THEN
12896 
12897           --assign to out record
12898           x_charges_detail_rec.apply_contract_discount := p_charges_detail_rec.apply_contract_discount;
12899 
12900           --call contracts dicounting API
12901           --DBMS_OUTPUT.PUT_LINE('Call Contracts API to Apply contracts 4');
12902 
12903           CS_Est_Apply_Contract_PKG.Apply_Contract(
12904             p_coverage_id           => x_charges_detail_rec.apply_contract_discount,
12905             p_coverage_txn_group_id => x_charges_detail_rec.coverage_txn_group_id,
12906             p_txn_billing_type_id   => x_charges_detail_rec.txn_billing_type_id,
12907             P_BUSINESS_PROCESS_ID   => x_charges_detail_rec.business_process_id,
12908             P_REQUEST_DATE          => l_request_date,
12909             p_amount                => x_charges_detail_rec.after_warranty_cost,
12910             p_discount_amount       => l_contract_discount,
12911             X_RETURN_STATUS         => l_return_status,
12912             X_MSG_COUNT             => l_msg_count,
12913             X_MSG_DATA              => l_msg_data);
12914 
12915           IF l_return_status <> FND_API.G_RET_STS_SUCCESS THEN
12916             FND_MESSAGE.Set_Name('CS', 'CS_CHG_APPLY_CONTRACT_WARNING');
12917             FND_MESSAGE.SET_TOKEN('REASON', l_msg_data);
12918             FND_MSG_PUB.Add;
12919             RAISE FND_API.G_EXC_ERROR;
12920           END IF;
12921 
12922           --Bug Fix for Bug # 3088397
12923           IF l_contract_discount IS NOT NULL THEN
12924             --assign the contract discount to the out record
12925             x_charges_detail_rec.contract_discount_amount := x_charges_detail_rec.after_warranty_cost - l_contract_discount;
12926 
12927             --apply discount
12928             x_charges_detail_rec.after_warranty_cost := l_contract_discount;
12929           ELSE
12930             -- contract discount amt should be 0
12931             --x_charges_detail_rec.contract_discount_amount := 0;
12932             null;
12933           END IF;
12934 
12935           --DBMS_OUTPUT.PUT_LINE('Contract 4'||x_charges_detail_rec.contract_discount_amount);
12936 
12937       ELSE
12938         --Apply contract discount = 'N'
12939         --Fixed Bug # 3220253
12940         --passed p_charges_detail_rec.contract_discount_amount
12941         x_charges_detail_rec.apply_contract_discount := p_charges_detail_rec.apply_contract_discount;
12942 
12943         IF p_charges_detail_rec.contract_discount_amount <> FND_API.G_MISS_NUM OR
12944            p_charges_detail_rec.contract_discount_amount IS NOT NULL THEN
12945            x_charges_detail_rec.contract_discount_amount := l_db_rec.contract_discount_amount;
12946         ELSIF p_charges_detail_rec.contract_discount_amount IS NULL THEN
12947            x_charges_detail_rec.contract_discount_amount := 0;
12948         ELSE
12949           x_charges_detail_rec.contract_discount_amount := p_charges_detail_rec.contract_discount_amount;
12950         END IF;
12951 
12952       END IF ;
12953     END IF;
12954 
12955   ELSIF
12956 
12957      --Fix # 3069583 unable to override charges for labor charge line
12958      --x_charges_detail_rec.billing_flag <> 'E' AND
12959      --x_charges_detail_rec.billing_flag <> 'M' OR
12960      (x_charges_detail_rec.billing_flag IN ('E','M', 'L') AND
12961      ((p_charges_detail_rec.after_warranty_cost = FND_API.G_MISS_NUM OR
12962      p_charges_detail_rec.after_warranty_cost IS NULL) AND
12963      (p_charges_detail_rec.list_price = FND_API.G_MISS_NUM OR
12964      p_charges_detail_rec.list_price IS NULL))) THEN
12965      IF nvl(l_curr_in_conversion_list,'N') = 'Y' THEN --12.1.3, vpremach
12966 		FND_MESSAGE.SET_NAME('CS', 'CS_CHG_NOT_BASE_CURRENCY');
12967 		FND_MESSAGE.Set_Token('CURRENCY_CODE', p_charges_detail_rec.currency_code);
12968 		FND_MSG_PUB.Add;
12969 		RAISE FND_API.G_EXC_ERROR;
12970      END IF;
12971 
12972      IF l_calc_sp = 'Y' THEN
12973        IF ((((x_charges_detail_rec.inventory_item_id_in IS NOT NULL) AND
12974              (x_charges_detail_rec.unit_of_measure_code IS NOT NULL) AND
12975              (x_charges_detail_rec.price_list_id IS NOT NULL) AND
12976              (x_charges_detail_rec.quantity_required IS NOT NULL)))) THEN
12977           --DBMS_OUTPUT.PUT_LINE('Before calling CS_Pricing_Item_Pkg.Call_Pricing_Item ...');
12978           --DBMS_OUTPUT.PUT_LINE('x_charges_detail_rec.inventory_item_id_in='||x_charges_detail_rec.inventory_item_id_in);
12979           --DBMS_OUTPUT.PUT_LINE('x_charges_detail_rec.price_list_id='||x_charges_detail_rec.price_list_id);
12980           --DBMS_OUTPUT.PUT_LINE('x_charges_detail_rec.unit_of_measure_code='||x_charges_detail_rec.unit_of_measure_code);
12981           --DBMS_OUTPUT.PUT_LINE('x_charges_detail_rec.currency_code='||x_charges_detail_rec.currency_code);
12982           --DBMS_OUTPUT.PUT_LINE('x_charges_detail_rec.quantity_required='||x_charges_detail_rec.quantity_required);
12983 
12984           -- Added to fix Bug # 3819167
12985           --
12986           /*
12987           IF ((l_line_order_category_code = 'RETURN') AND
12988               (sign(x_charges_detail_rec.quantity_required) = -1)) THEN
12989              l_absolute_quantity_required := x_charges_detail_rec.quantity_required * -1;
12990           ELSE
12991              l_absolute_quantity_required := x_charges_detail_rec.quantity_required;
12992           END IF;
12993           */
12994 
12995           -- Calculate the selling price
12996           CS_Pricing_Item_Pkg.Call_Pricing_Item(
12997             P_Inventory_Item_Id          => x_charges_detail_rec.inventory_item_id_in,
12998             P_Price_List_Id              => x_charges_detail_rec.price_list_id,
12999             P_UOM_Code                   => x_charges_detail_rec.unit_of_measure_code,
13000             p_Currency_Code              => x_charges_detail_rec.currency_code,
13001             P_Quantity                   => abs(x_charges_detail_rec.quantity_required),
13002             P_Org_Id                     => x_charges_detail_rec.org_id,
13003             x_list_price                 => l_list_price,
13004             P_Pricing_Context            => x_charges_detail_rec.pricing_context,
13005             P_Pricing_Attribute1         => x_charges_detail_rec.pricing_attribute1,
13006             P_Pricing_Attribute2         => x_charges_detail_rec.pricing_attribute2,
13007             P_Pricing_Attribute3         => x_charges_detail_rec.pricing_attribute3,
13008             P_Pricing_Attribute4         => x_charges_detail_rec.pricing_attribute4,
13009             P_Pricing_Attribute5         => x_charges_detail_rec.pricing_attribute5,
13010             P_Pricing_Attribute6         => x_charges_detail_rec.pricing_attribute6,
13011             P_Pricing_Attribute7         => x_charges_detail_rec.pricing_attribute7,
13012             P_Pricing_Attribute8         => x_charges_detail_rec.pricing_attribute8,
13013             P_Pricing_Attribute9         => x_charges_detail_rec.pricing_attribute9,
13014             P_Pricing_Attribute10        => x_charges_detail_rec.pricing_attribute10,
13015             P_Pricing_Attribute11        => x_charges_detail_rec.pricing_attribute11,
13016             P_Pricing_Attribute12        => x_charges_detail_rec.pricing_attribute12,
13017             P_Pricing_Attribute13        => x_charges_detail_rec.pricing_attribute13,
13018             P_Pricing_Attribute14        => x_charges_detail_rec.pricing_attribute14,
13019             P_Pricing_Attribute15        => x_charges_detail_rec.pricing_attribute15,
13020             P_Pricing_Attribute16        => x_charges_detail_rec.pricing_attribute16,
13021             P_Pricing_Attribute17        => x_charges_detail_rec.pricing_attribute17,
13022             P_Pricing_Attribute18        => x_charges_detail_rec.pricing_attribute18,
13023             P_Pricing_Attribute19        => x_charges_detail_rec.pricing_attribute19,
13024             P_Pricing_Attribute20        => x_charges_detail_rec.pricing_attribute20,
13025             P_Pricing_Attribute21        => x_charges_detail_rec.pricing_attribute21,
13026             P_Pricing_Attribute22        => x_charges_detail_rec.pricing_attribute22,
13027             P_Pricing_Attribute23        => x_charges_detail_rec.pricing_attribute23,
13028             P_Pricing_Attribute24        => x_charges_detail_rec.pricing_attribute24,
13029             P_Pricing_Attribute25        => x_charges_detail_rec.pricing_attribute25,
13030             p_Pricing_Attribute26        => x_charges_detail_rec.pricing_attribute26,
13031             P_Pricing_Attribute27        => x_charges_detail_rec.pricing_attribute27,
13032             P_Pricing_Attribute28        => x_charges_detail_rec.pricing_attribute28,
13033             P_Pricing_Attribute29        => x_charges_detail_rec.pricing_attribute29,
13034             P_Pricing_Attribute30        => x_charges_detail_rec.pricing_attribute30,
13035             P_PRICING_ATTRIBUTE31        => x_charges_detail_rec.pricing_attribute31,
13036             P_PRICING_ATTRIBUTE32        => x_charges_detail_rec.pricing_attribute32,
13037             P_PRICING_ATTRIBUTE33        => x_charges_detail_rec.pricing_attribute33,
13038             P_PRICING_ATTRIBUTE34        => x_charges_detail_rec.pricing_attribute34,
13039             P_Pricing_Attribute35        => x_charges_detail_rec.pricing_attribute35,
13040             P_Pricing_Attribute36        => x_charges_detail_rec.pricing_attribute36,
13041             P_Pricing_Attribute37        => x_charges_detail_rec.pricing_attribute37,
13042             P_Pricing_Attribute38        => x_charges_detail_rec.pricing_attribute38,
13043             P_Pricing_Attribute39        => x_charges_detail_rec.pricing_attribute39,
13044             P_Pricing_Attribute40        => x_charges_detail_rec.pricing_attribute40,
13045             P_Pricing_Attribute41        => x_charges_detail_rec.pricing_attribute41,
13046             P_Pricing_Attribute42        => x_charges_detail_rec.pricing_attribute42,
13047             P_Pricing_Attribute43        => x_charges_detail_rec.pricing_attribute43,
13048             P_Pricing_Attribute44        => x_charges_detail_rec.pricing_attribute44,
13049             P_Pricing_Attribute45        => x_charges_detail_rec.pricing_attribute45,
13050             P_Pricing_Attribute46        => x_charges_detail_rec.pricing_attribute46,
13051             P_Pricing_Attribute47        => x_charges_detail_rec.pricing_attribute47,
13052             P_Pricing_Attribute48        => x_charges_detail_rec.pricing_attribute48,
13053             P_Pricing_Attribute49        => x_charges_detail_rec.pricing_attribute49,
13054             P_Pricing_Attribute50        => x_charges_detail_rec.pricing_attribute50,
13055             P_Pricing_Attribute51        => x_charges_detail_rec.pricing_attribute51,
13056             P_Pricing_Attribute52        => x_charges_detail_rec.pricing_attribute52,
13057             P_Pricing_Attribute53        => x_charges_detail_rec.pricing_attribute53,
13058             P_Pricing_Attribute54        => x_charges_detail_rec.pricing_attribute54,
13059             P_Pricing_Attribute55        => x_charges_detail_rec.pricing_attribute55,
13060             P_Pricing_Attribute56        => x_charges_detail_rec.pricing_attribute56,
13061             P_Pricing_Attribute57        => x_charges_detail_rec.pricing_attribute57,
13062             P_Pricing_Attribute58        => x_charges_detail_rec.pricing_attribute58,
13063             P_Pricing_Attribute59        => x_charges_detail_rec.pricing_attribute59,
13064             P_Pricing_Attribute60        => x_charges_detail_rec.pricing_attribute60,
13065             P_Pricing_Attribute61        => x_charges_detail_rec.pricing_attribute61,
13066             P_Pricing_Attribute62        => x_charges_detail_rec.pricing_attribute62,
13067             P_Pricing_Attribute63        => x_charges_detail_rec.pricing_attribute63,
13068             P_Pricing_Attribute64        => x_charges_detail_rec.pricing_attribute64,
13069             P_Pricing_Attribute65        => x_charges_detail_rec.pricing_attribute65,
13070             P_Pricing_Attribute66        => x_charges_detail_rec.pricing_attribute66,
13071             P_Pricing_Attribute67        => x_charges_detail_rec.pricing_attribute67,
13072             P_Pricing_Attribute68        => x_charges_detail_rec.pricing_attribute68,
13073             P_Pricing_Attribute69        => x_charges_detail_rec.pricing_attribute69,
13074             P_Pricing_Attribute70        => x_charges_detail_rec.pricing_attribute70,
13075             P_Pricing_Attribute71        => x_charges_detail_rec.pricing_attribute71,
13076             P_Pricing_Attribute72        => x_charges_detail_rec.pricing_attribute72,
13077             P_Pricing_Attribute73        => x_charges_detail_rec.pricing_attribute73,
13078             P_Pricing_Attribute74        => x_charges_detail_rec.pricing_attribute74,
13079             P_Pricing_Attribute75        => x_charges_detail_rec.pricing_attribute75,
13080             P_Pricing_Attribute76        => x_charges_detail_rec.pricing_attribute76,
13081             P_Pricing_Attribute77        => x_charges_detail_rec.pricing_attribute77,
13082             P_Pricing_Attribute78        => x_charges_detail_rec.pricing_attribute78,
13083             P_Pricing_Attribute79        => x_charges_detail_rec.pricing_attribute79,
13084             P_Pricing_Attribute80        => x_charges_detail_rec.pricing_attribute80,
13085             P_Pricing_Attribute81        => x_charges_detail_rec.pricing_attribute81,
13086             P_Pricing_Attribute82        => x_charges_detail_rec.pricing_attribute82,
13087             P_Pricing_Attribute83        => x_charges_detail_rec.pricing_attribute83,
13088             P_Pricing_Attribute84        => x_charges_detail_rec.pricing_attribute84,
13089             P_Pricing_Attribute85        => x_charges_detail_rec.pricing_attribute85,
13090             P_Pricing_Attribute86        => x_charges_detail_rec.pricing_attribute86,
13091             P_Pricing_Attribute87        => x_charges_detail_rec.pricing_attribute87,
13092             P_Pricing_Attribute88        => x_charges_detail_rec.pricing_attribute88,
13093             P_Pricing_Attribute89        => x_charges_detail_rec.pricing_attribute89,
13094             P_Pricing_Attribute90        => x_charges_detail_rec.pricing_attribute90,
13095             P_Pricing_Attribute91        => x_charges_detail_rec.pricing_attribute91,
13096             P_Pricing_Attribute92        => x_charges_detail_rec.pricing_attribute92,
13097             P_Pricing_Attribute93        => x_charges_detail_rec.pricing_attribute93,
13098             P_Pricing_Attribute94        => x_charges_detail_rec.pricing_attribute94,
13099             P_Pricing_Attribute95        => x_charges_detail_rec.pricing_attribute95,
13100             P_Pricing_Attribute96        => x_charges_detail_rec.pricing_attribute96,
13101             P_Pricing_Attribute97        => x_charges_detail_rec.pricing_attribute97,
13102             P_Pricing_Attribute98        => x_charges_detail_rec.pricing_attribute98,
13103             P_Pricing_Attribute99        => x_charges_detail_rec.pricing_attribute99,
13104             P_Pricing_Attribute100       => x_charges_detail_rec.pricing_attribute100,
13105             x_return_status              => l_return_status,
13106             x_msg_count                  => l_msg_count,
13107             x_msg_data                   => l_msg_data);
13108 
13109           --DBMS_OUTPUT.PUT_LINE('After calling CS_Pricing_Item_Pkg.Call_Pricing_Item ...');
13110           --DBMS_OUTPUT.PUT_LINE('l_msg_data '||l_msg_data);
13111 
13112           IF (l_return_status <> FND_API.G_RET_STS_SUCCESS) THEN
13113             FND_MESSAGE.Set_Name('CS', 'CS_CHG_API_PRICING_ITEM_ERROR');
13114             FND_MESSAGE.set_token('INV_ID', x_charges_detail_rec.inventory_item_id_in);
13115             FND_MESSAGE.set_token('PRICE_LIST_ID', x_charges_detail_rec.price_list_id);
13116             FND_MESSAGE.set_token('UOM', x_charges_detail_rec.unit_of_measure_code);
13117             FND_MESSAGE.set_token('CURR_CODE', x_charges_detail_rec.currency_code);
13118             --FND_MESSAGE.SET_TOKEN('TEXT', l_msg_data, TRUE);
13119             FND_MSG_PUB.Add;
13120             RAISE FND_API.G_EXC_ERROR;
13121           END IF;
13122 
13123           --bug # 3056622 charge amount is zero for items with negative prices
13124           --assign to out record
13125           x_charges_detail_rec.list_price    := l_list_price;
13126           IF p_charges_detail_rec.selling_price <> FND_API.G_MISS_NUM AND
13127              p_charges_detail_rec.selling_price IS NOT NULL THEN
13128             x_charges_detail_rec.selling_price :=  p_charges_detail_rec.selling_price;
13129           ELSE
13130             x_charges_detail_rec.selling_price := x_charges_detail_rec.list_price;
13131           END IF;
13132 
13133 
13134           IF x_charges_detail_rec.billing_flag = 'L' AND
13135              x_charges_detail_rec.con_pct_over_list_price IS NOT NULL THEN
13136             --get the new list price and selling price
13137             x_charges_detail_rec.list_price := x_charges_detail_rec.list_price +
13138                                                (x_charges_detail_rec.list_price *  x_charges_detail_rec.con_pct_over_list_price/100);
13139             x_charges_detail_rec.selling_price := x_charges_detail_rec.list_price;
13140           ELSE
13141             x_charges_detail_rec.list_price    := x_charges_detail_rec.list_price;
13142             x_charges_detail_rec.selling_price := x_charges_detail_rec.selling_price;
13143           END IF;
13144 
13145 
13146           --DBMS_OUTPUT.PUT_LINE('list_price '||x_charges_detail_rec.list_price);
13147           --DBMS_OUTPUT.PUT_LINE('Selling Price '||x_charges_detail_rec.selling_price);
13148           --DBMS_OUTPUT.PUT_LINE(' No Charge Flag is  '||x_charges_detail_rec.no_charge_flag);
13149           --DBMS_OUTPUT.PUT_LINE(' Conversion needed flag '||l_conversion_needed_flag);
13150 
13151 
13152           --bug # 3056622 charge amount is zero for items with negative prices
13153           IF x_charges_detail_rec.no_charge_flag <> 'Y' AND x_charges_detail_rec.selling_price IS NOT NULL THEN
13154             IF l_conversion_needed_flag = 'Y' THEN
13155               IF p_charges_detail_rec.selling_price IS NOT NULL THEN
13156                 x_charges_detail_rec.selling_price := x_charges_detail_rec.selling_price * x_charges_detail_rec.conversion_rate;
13157                 x_charges_detail_rec.after_warranty_cost := x_charges_detail_rec.selling_price * x_charges_detail_rec.quantity_required;
13158               ELSE
13159                 x_charges_detail_rec.after_warranty_cost := x_charges_detail_rec.selling_price * x_charges_detail_rec.quantity_required * x_charges_detail_rec.conversion_rate;
13160               END IF;
13161             ELSE
13162               x_charges_detail_rec.after_warranty_cost := x_charges_detail_rec.selling_price * x_charges_detail_rec.quantity_required;
13163             END IF;
13164           ELSE
13165             -- no charge flag = 'Y'
13166             x_charges_detail_rec.after_warranty_cost := 0;
13167           END IF;
13168 
13169           --DBMS_OUTPUT.PUT_LINE(' after warr cost is '|| x_charges_detail_rec.after_warranty_cost);
13170 
13171 
13172           --check to see if contract discount needs to be applied
13173 
13174           --DBMS_OUTPUT.PUT_LINE('apply contract discount '|| x_charges_detail_rec.apply_contract_discount);
13175 
13176           IF x_charges_detail_rec.apply_contract_discount = 'Y' AND
13177              x_charges_detail_rec.contract_line_id IS NOT NULL AND
13178              x_charges_detail_rec.no_charge_flag <> 'Y' THEN
13179 
13180             --assign to out record
13181             x_charges_detail_rec.apply_contract_discount := p_charges_detail_rec.apply_contract_discount;
13182 
13183             --call contracts dicounting API
13184             --DBMS_OUTPUT.PUT_LINE('Call Contracts API to Apply contracts 5');
13185 
13186             CS_Est_Apply_Contract_PKG.Apply_Contract(
13187               p_coverage_id           => x_charges_detail_rec.contract_line_id,
13188               p_coverage_txn_group_id => x_charges_detail_rec.coverage_txn_group_id,
13189               p_txn_billing_type_id   => x_charges_detail_rec.txn_billing_type_id,
13190               P_BUSINESS_PROCESS_ID   => x_charges_detail_rec.business_process_id,
13191               P_REQUEST_DATE          => l_request_date,
13192               p_amount                => x_charges_detail_rec.after_warranty_cost,
13193               p_discount_amount       => l_contract_discount,
13194               X_RETURN_STATUS         => l_return_status,
13195               X_MSG_COUNT             => l_msg_count,
13196               X_MSG_DATA              => l_msg_data);
13197 
13198             IF l_return_status <> FND_API.G_RET_STS_SUCCESS THEN
13199               FND_MESSAGE.Set_Name('CS', 'CS_CHG_APPLY_CONTRACT_WARNING');
13200               FND_MESSAGE.SET_TOKEN('REASON', l_msg_data);
13201               FND_MSG_PUB.Add;
13202               RAISE FND_API.G_EXC_ERROR;
13203             END IF;
13204 
13205             --Bug Fix for Bug # 3088397
13206             IF l_contract_discount IS NOT NULL THEN
13207               --assign the contract discount to the out record
13208               x_charges_detail_rec.contract_discount_amount := x_charges_detail_rec.after_warranty_cost - l_contract_discount;
13209 
13210               --apply discount
13211               x_charges_detail_rec.after_warranty_cost :=  l_contract_discount;
13212 
13213             ELSE
13214               -- contract discount amt should be 0
13215               --x_charges_detail_rec.contract_discount_amount := 0;
13216               null;
13217             END IF;
13218             --DBMS_OUTPUT.PUT_LINE('Contract 5'||x_charges_detail_rec.contract_discount_amount);
13219 
13220           ELSE
13221             --Apply contract discount = 'N'
13222             --Fixed Bug # 3220253
13223             --passed p_charges_detail_rec.contract_discount_amount
13224             x_charges_detail_rec.apply_contract_discount := p_charges_detail_rec.apply_contract_discount;
13225             x_charges_detail_rec.contract_discount_amount := p_charges_detail_rec.contract_discount_amount;
13226 
13227             IF x_charges_detail_rec.contract_discount_amount IS NULL THEN
13228               x_charges_detail_rec.contract_discount_amount := 0;
13229             ELSE
13230               x_charges_detail_rec.contract_discount_amount := x_charges_detail_rec.contract_discount_amount;
13231             END IF;
13232           END IF ;
13233 
13234       ELSE
13235         --x_charges_detail_rec.inventory_item_id_in IS NULL
13236         --x_charges_detail_rec.unit_of_measure_code IS NULL
13237         --x_charges_detail_rec.price_list_id IS NULL
13238         --x_charges_detail_rec.quantity_required IS NULL
13239         --the list price cannot be derived and the
13240         --after warranty cost cannot be computed
13241         --assign 0 to list_price and after_warranty_cost
13242         x_charges_detail_rec.list_price := 0;
13243         x_charges_detail_rec.selling_price := 0;
13244         x_charges_detail_rec.after_warranty_cost := 0;
13245         x_charges_detail_rec.contract_discount_amount := 0;
13246 
13247       END IF;
13248     ELSE
13249       --l_calc_sp = 'N'
13250       x_charges_detail_rec.list_price := l_db_det_rec.list_price;
13251       x_charges_detail_rec.selling_price := l_db_det_rec.selling_price;
13252 
13253 
13254       --calculate the contract % over list price
13255       IF x_charges_detail_rec.billing_flag = 'L' AND
13256          x_charges_detail_rec.con_pct_over_list_price IS NOT NULL THEN
13257         --get the new list price and selling price
13258         x_charges_detail_rec.list_price := x_charges_detail_rec.list_price +
13259                                         (x_charges_detail_rec.list_price *  x_charges_detail_rec.con_pct_over_list_price/100);
13260 
13261         x_charges_detail_rec.selling_price := x_charges_detail_rec.list_price;
13262       ELSE
13263         x_charges_detail_rec.list_price    := l_db_det_rec.list_price;
13264         --x_charges_detail_rec.selling_price := l_db_det_rec.selling_price;
13265         -- Commented above and added below for Bug# 4689183
13266         IF (p_charges_detail_rec.selling_price <> FND_API.G_MISS_NUM AND
13267             p_charges_detail_rec.selling_price IS NOT NULL) THEN
13268           IF (p_charges_detail_rec.selling_price <> l_db_det_rec.selling_price) THEN
13269             x_charges_detail_rec.selling_price := p_charges_detail_rec.selling_price;
13270           ELSE
13271             x_charges_detail_rec.selling_price := l_db_det_rec.selling_price;
13272           END IF;
13273         END IF;
13274       END IF;
13275 
13276       --bug # 3056622 charge amount is zero for items with negative prices
13277 
13278       IF x_charges_detail_rec.no_charge_flag <> 'Y' AND x_charges_detail_rec.selling_price IS NOT NULL THEN
13279         IF l_conversion_needed_flag = 'Y' THEN
13280           x_charges_detail_rec.after_warranty_cost := x_charges_detail_rec.selling_price * x_charges_detail_rec.quantity_required * x_charges_detail_rec.conversion_rate;
13281         ELSE
13282           --Condition added to fix Bug # 3358531
13283           x_charges_detail_rec.after_warranty_cost := l_db_det_rec.after_warranty_cost;
13284         END IF;
13285       ELSE
13286         -- no charge flag = 'Y'
13287         x_charges_detail_rec.after_warranty_cost := 0;
13288       END IF;
13289 
13290        --DBMS_OUTPUT.PUT_LINE(' after warr cost is '|| x_charges_detail_rec.after_warranty_cost);
13291 
13292 
13293           --check to see if contract discount needs to be applied
13294 
13295           --DBMS_OUTPUT.PUT_LINE('apply contract discount '|| x_charges_detail_rec.apply_contract_discount);
13296 
13297           IF x_charges_detail_rec.apply_contract_discount = 'Y' AND
13298              x_charges_detail_rec.contract_line_id IS NOT NULL AND
13299              x_charges_detail_rec.no_charge_flag <> 'Y' THEN
13300 
13301             --assign to out record
13302             x_charges_detail_rec.apply_contract_discount := p_charges_detail_rec.apply_contract_discount;
13303 
13304 
13305             --call contracts dicounting API
13306             --DBMS_OUTPUT.PUT_LINE('Call Contracts API to Apply contracts 6');
13307 
13308             CS_Est_Apply_Contract_PKG.Apply_Contract(
13309               p_coverage_id           => x_charges_detail_rec.coverage_id,
13310               p_coverage_txn_group_id => x_charges_detail_rec.coverage_txn_group_id,
13311               p_txn_billing_type_id   => x_charges_detail_rec.txn_billing_type_id,
13312               P_BUSINESS_PROCESS_ID   => x_charges_detail_rec.business_process_id,
13313               P_REQUEST_DATE          => l_request_date,
13314               p_amount                => x_charges_detail_rec.after_warranty_cost,
13315               p_discount_amount       => l_contract_discount,
13316               X_RETURN_STATUS         => l_return_status,
13317               X_MSG_COUNT             => l_msg_count,
13318               X_MSG_DATA              => l_msg_data);
13319 
13320             IF l_return_status <> FND_API.G_RET_STS_SUCCESS THEN
13321               FND_MESSAGE.Set_Name('CS', 'CS_CHG_APPLY_CONTRACT_WARNING');
13322               FND_MESSAGE.SET_TOKEN('REASON', l_msg_data);
13323               FND_MSG_PUB.Add;
13324               RAISE FND_API.G_EXC_ERROR;
13325             END IF;
13326 
13327             --Bug Fix for Bug # 3088397
13328             IF l_contract_discount IS NOT NULL THEN
13329               --assign the contract discount to the out record
13330               x_charges_detail_rec.contract_discount_amount := x_charges_detail_rec.after_warranty_cost - l_contract_discount;
13331 
13332               --apply discount
13333               x_charges_detail_rec.after_warranty_cost := l_contract_discount;
13334             ELSE
13335               -- contract discount amt should be 0
13336               --x_charges_detail_rec.contract_discount_amount := 0;
13337               null;
13338             END IF;
13339             --DBMS_OUTPUT.PUT_LINE('Contract 6'||x_charges_detail_rec.contract_discount_amount);
13340 
13341           ELSE
13342             --Apply contract discount = 'N'
13343             --Fixed Bug # 3220253
13344             --passed p_charges_detail_rec.contract_discount_amount
13345             x_charges_detail_rec.apply_contract_discount := p_charges_detail_rec.apply_contract_discount;
13346             IF p_charges_detail_rec.contract_discount_amount <> FND_API.G_MISS_NUM OR
13347               p_charges_detail_rec.contract_discount_amount IS NOT NULL THEN
13348               x_charges_detail_rec.contract_discount_amount := l_db_rec.contract_discount_amount;
13349             ELSIF p_charges_detail_rec.contract_discount_amount IS NULL THEN
13350               x_charges_detail_rec.contract_discount_amount := 0;
13351             ELSE
13352               x_charges_detail_rec.contract_discount_amount := p_charges_detail_rec.contract_discount_amount;
13353             END IF;
13354           END IF ;
13355     END IF;
13356 
13357   ELSIF
13358         --Fix # 3069583 unable to override charges for labor charge line
13359         x_charges_detail_rec.billing_flag IN ('E', 'M', 'L') AND
13360         p_charges_detail_rec.after_warranty_cost <> FND_API.G_MISS_NUM AND
13361         p_charges_detail_rec.after_warranty_cost IS NOT NULL THEN
13362 
13363 	IF p_charges_detail_rec.list_price IS NULL THEN --12.1.3 Multi Currency, vpremach
13364 	    IF l_curr_in_conversion_list = 'Y' THEN
13365 		FND_MESSAGE.SET_NAME('CS', 'CS_CHG_NOT_BASE_CURRENCY');
13366 		FND_MESSAGE.Set_Token('CURRENCY_CODE', p_charges_detail_rec.currency_code);
13367 		FND_MSG_PUB.Add;
13368 		RAISE FND_API.G_EXC_ERROR;
13369 	    END IF;
13370 	END IF;
13371 
13372         --DBMS_OUTPUT.PUT_LINE('Update Expense line with after warr cost ');
13373         --DBMS_OUTPUT.PUT_LINE('Update l_conversion_needed_flag '||l_conversion_needed_flag);
13374         --DBMS_OUTPUT.PUT_LINE('Update after_warranty_cost = '||p_charges_detail_rec.after_warranty_cost );
13375         --DBMS_OUTPUT.PUT_LINE('DB After warranty cost = '||l_db_det_rec.after_warranty_cost);
13376 
13377         IF p_charges_detail_rec.after_warranty_cost <> nvl(l_db_det_rec.after_warranty_cost, 0) THEN
13378 
13379           l_calc_sp := 'Y';
13380 
13381           --DBMS_OUTPUT.PUT_LINE(' In here ');
13382 
13383           -- Added to fix Bug # 3819167
13384           --
13385           /*
13386           IF ((l_line_order_category_code = 'RETURN') AND
13387               (sign(x_charges_detail_rec.quantity_required) = -1)) THEN
13388              l_absolute_quantity_required := x_charges_detail_rec.quantity_required * -1;
13389           ELSE
13390              l_absolute_quantity_required := x_charges_detail_rec.quantity_required;
13391           END IF;
13392           */
13393        IF nvl(l_curr_in_conversion_list,'N') <> 'Y' THEN
13394           -- Call the pricing API just to verify that the item is on the price list
13395           CS_Pricing_Item_Pkg.Call_Pricing_Item(
13396             P_Inventory_Item_Id          => x_charges_detail_rec.inventory_item_id_in,
13397             P_Price_List_Id              => x_charges_detail_rec.price_list_id,
13398             P_UOM_Code                   => x_charges_detail_rec.unit_of_measure_code,
13399             p_Currency_Code              => x_charges_detail_rec.currency_code,
13400             P_Quantity                   => abs(x_charges_detail_rec.quantity_required),
13401             P_Org_Id                     => x_charges_detail_rec.org_id,
13402             x_list_price                 => l_list_price,
13403             P_Pricing_Context            => x_charges_detail_rec.pricing_context,
13404             P_Pricing_Attribute1         => x_charges_detail_rec.pricing_attribute1,
13405             P_Pricing_Attribute2         => x_charges_detail_rec.pricing_attribute2,
13406             P_Pricing_Attribute3         => x_charges_detail_rec.pricing_attribute3,
13407             P_Pricing_Attribute4         => x_charges_detail_rec.pricing_attribute4,
13408             P_Pricing_Attribute5         => x_charges_detail_rec.pricing_attribute5,
13409             P_Pricing_Attribute6         => x_charges_detail_rec.pricing_attribute6,
13410             P_Pricing_Attribute7         => x_charges_detail_rec.pricing_attribute7,
13411             P_Pricing_Attribute8         => x_charges_detail_rec.pricing_attribute8,
13412             P_Pricing_Attribute9         => x_charges_detail_rec.pricing_attribute9,
13413             P_Pricing_Attribute10        => x_charges_detail_rec.pricing_attribute10,
13414             P_Pricing_Attribute11        => x_charges_detail_rec.pricing_attribute11,
13415             P_Pricing_Attribute12        => x_charges_detail_rec.pricing_attribute12,
13416             P_Pricing_Attribute13        => x_charges_detail_rec.pricing_attribute13,
13417             P_Pricing_Attribute14        => x_charges_detail_rec.pricing_attribute14,
13418             P_Pricing_Attribute15        => x_charges_detail_rec.pricing_attribute15,
13419             P_Pricing_Attribute16        => x_charges_detail_rec.pricing_attribute16,
13420             P_Pricing_Attribute17        => x_charges_detail_rec.pricing_attribute17,
13421             P_Pricing_Attribute18        => x_charges_detail_rec.pricing_attribute18,
13422             P_Pricing_Attribute19        => x_charges_detail_rec.pricing_attribute19,
13423             P_Pricing_Attribute20        => x_charges_detail_rec.pricing_attribute20,
13424             P_Pricing_Attribute21        => x_charges_detail_rec.pricing_attribute21,
13425             P_Pricing_Attribute22        => x_charges_detail_rec.pricing_attribute22,
13426             P_Pricing_Attribute23        => x_charges_detail_rec.pricing_attribute23,
13427             P_Pricing_Attribute24        => x_charges_detail_rec.pricing_attribute24,
13428             P_Pricing_Attribute25        => x_charges_detail_rec.pricing_attribute25,
13429             p_Pricing_Attribute26        => x_charges_detail_rec.pricing_attribute26,
13430             P_Pricing_Attribute27        => x_charges_detail_rec.pricing_attribute27,
13431             P_Pricing_Attribute28        => x_charges_detail_rec.pricing_attribute28,
13432             P_Pricing_Attribute29        => x_charges_detail_rec.pricing_attribute29,
13433             P_Pricing_Attribute30        => x_charges_detail_rec.pricing_attribute30,
13434             P_PRICING_ATTRIBUTE31        => x_charges_detail_rec.pricing_attribute31,
13435             P_PRICING_ATTRIBUTE32        => x_charges_detail_rec.pricing_attribute32,
13436             P_PRICING_ATTRIBUTE33        => x_charges_detail_rec.pricing_attribute33,
13437             P_PRICING_ATTRIBUTE34        => x_charges_detail_rec.pricing_attribute34,
13438             P_Pricing_Attribute35        => x_charges_detail_rec.pricing_attribute35,
13439             P_Pricing_Attribute36        => x_charges_detail_rec.pricing_attribute36,
13440             P_Pricing_Attribute37        => x_charges_detail_rec.pricing_attribute37,
13441             P_Pricing_Attribute38        => x_charges_detail_rec.pricing_attribute38,
13442             P_Pricing_Attribute39        => x_charges_detail_rec.pricing_attribute39,
13443             P_Pricing_Attribute40        => x_charges_detail_rec.pricing_attribute40,
13444             P_Pricing_Attribute41        => x_charges_detail_rec.pricing_attribute41,
13445             P_Pricing_Attribute42        => x_charges_detail_rec.pricing_attribute42,
13446             P_Pricing_Attribute43        => x_charges_detail_rec.pricing_attribute43,
13447             P_Pricing_Attribute44        => x_charges_detail_rec.pricing_attribute44,
13448             P_Pricing_Attribute45        => x_charges_detail_rec.pricing_attribute45,
13449             P_Pricing_Attribute46        => x_charges_detail_rec.pricing_attribute46,
13450             P_Pricing_Attribute47        => x_charges_detail_rec.pricing_attribute47,
13451             P_Pricing_Attribute48        => x_charges_detail_rec.pricing_attribute48,
13452             P_Pricing_Attribute49        => x_charges_detail_rec.pricing_attribute49,
13453             P_Pricing_Attribute50        => x_charges_detail_rec.pricing_attribute50,
13454             P_Pricing_Attribute51        => x_charges_detail_rec.pricing_attribute51,
13455             P_Pricing_Attribute52        => x_charges_detail_rec.pricing_attribute52,
13456             P_Pricing_Attribute53        => x_charges_detail_rec.pricing_attribute53,
13457             P_Pricing_Attribute54        => x_charges_detail_rec.pricing_attribute54,
13458             P_Pricing_Attribute55        => x_charges_detail_rec.pricing_attribute55,
13459             P_Pricing_Attribute56        => x_charges_detail_rec.pricing_attribute56,
13460             P_Pricing_Attribute57        => x_charges_detail_rec.pricing_attribute57,
13461             P_Pricing_Attribute58        => x_charges_detail_rec.pricing_attribute58,
13462             P_Pricing_Attribute59        => x_charges_detail_rec.pricing_attribute59,
13463             P_Pricing_Attribute60        => x_charges_detail_rec.pricing_attribute60,
13464             P_Pricing_Attribute61        => x_charges_detail_rec.pricing_attribute61,
13465             P_Pricing_Attribute62        => x_charges_detail_rec.pricing_attribute62,
13466             P_Pricing_Attribute63        => x_charges_detail_rec.pricing_attribute63,
13467             P_Pricing_Attribute64        => x_charges_detail_rec.pricing_attribute64,
13468             P_Pricing_Attribute65        => x_charges_detail_rec.pricing_attribute65,
13469             P_Pricing_Attribute66        => x_charges_detail_rec.pricing_attribute66,
13470             P_Pricing_Attribute67        => x_charges_detail_rec.pricing_attribute67,
13471             P_Pricing_Attribute68        => x_charges_detail_rec.pricing_attribute68,
13472             P_Pricing_Attribute69        => x_charges_detail_rec.pricing_attribute69,
13473             P_Pricing_Attribute70        => x_charges_detail_rec.pricing_attribute70,
13474             P_Pricing_Attribute71        => x_charges_detail_rec.pricing_attribute71,
13475             P_Pricing_Attribute72        => x_charges_detail_rec.pricing_attribute72,
13476             P_Pricing_Attribute73        => x_charges_detail_rec.pricing_attribute73,
13477             P_Pricing_Attribute74        => x_charges_detail_rec.pricing_attribute74,
13478             P_Pricing_Attribute75        => x_charges_detail_rec.pricing_attribute75,
13479             P_Pricing_Attribute76        => x_charges_detail_rec.pricing_attribute76,
13480             P_Pricing_Attribute77        => x_charges_detail_rec.pricing_attribute77,
13481             P_Pricing_Attribute78        => x_charges_detail_rec.pricing_attribute78,
13482             P_Pricing_Attribute79        => x_charges_detail_rec.pricing_attribute79,
13483             P_Pricing_Attribute80        => x_charges_detail_rec.pricing_attribute80,
13484             P_Pricing_Attribute81        => x_charges_detail_rec.pricing_attribute81,
13485             P_Pricing_Attribute82        => x_charges_detail_rec.pricing_attribute82,
13486             P_Pricing_Attribute83        => x_charges_detail_rec.pricing_attribute83,
13487             P_Pricing_Attribute84        => x_charges_detail_rec.pricing_attribute84,
13488             P_Pricing_Attribute85        => x_charges_detail_rec.pricing_attribute85,
13489             P_Pricing_Attribute86        => x_charges_detail_rec.pricing_attribute86,
13490             P_Pricing_Attribute87        => x_charges_detail_rec.pricing_attribute87,
13491             P_Pricing_Attribute88        => x_charges_detail_rec.pricing_attribute88,
13492             P_Pricing_Attribute89        => x_charges_detail_rec.pricing_attribute89,
13493             P_Pricing_Attribute90        => x_charges_detail_rec.pricing_attribute90,
13494             P_Pricing_Attribute91        => x_charges_detail_rec.pricing_attribute91,
13495             P_Pricing_Attribute92        => x_charges_detail_rec.pricing_attribute92,
13496             P_Pricing_Attribute93        => x_charges_detail_rec.pricing_attribute93,
13497             P_Pricing_Attribute94        => x_charges_detail_rec.pricing_attribute94,
13498             P_Pricing_Attribute95        => x_charges_detail_rec.pricing_attribute95,
13499             P_Pricing_Attribute96        => x_charges_detail_rec.pricing_attribute96,
13500             P_Pricing_Attribute97        => x_charges_detail_rec.pricing_attribute97,
13501             P_Pricing_Attribute98        => x_charges_detail_rec.pricing_attribute98,
13502             P_Pricing_Attribute99        => x_charges_detail_rec.pricing_attribute99,
13503             P_Pricing_Attribute100       => x_charges_detail_rec.pricing_attribute100,
13504             x_return_status              => l_return_status,
13505             x_msg_count                  => l_msg_count,
13506             x_msg_data                   => l_msg_data);
13507 
13508         --DBMS_OUTPUT.PUT_LINE('After calling CS_Pricing_Item_Pkg.Call_Pricing_Item ...');
13509         --DBMS_OUTPUT.PUT_LINE('l_msg_data '||l_msg_data);
13510 
13511         IF (l_return_status <> FND_API.G_RET_STS_SUCCESS) THEN
13512           FND_MESSAGE.Set_Name('CS', 'CS_CHG_API_PRICING_ITEM_ERROR');
13513           FND_MESSAGE.set_token('INV_ID', x_charges_detail_rec.inventory_item_id_in);
13514           FND_MESSAGE.set_token('PRICE_LIST_ID', x_charges_detail_rec.price_list_id);
13515           FND_MESSAGE.set_token('UOM', x_charges_detail_rec.unit_of_measure_code);
13516           FND_MESSAGE.set_token('CURR_CODE', x_charges_detail_rec.currency_code);
13517           --FND_MESSAGE.SET_TOKEN('TEXT', l_msg_data, TRUE);
13518           FND_MSG_PUB.Add;
13519           RAISE FND_API.G_EXC_ERROR;
13520         END IF;
13521         END IF;
13522         -- Assign the after warranty that comes on the line
13523         x_charges_detail_rec.after_warranty_cost := p_charges_detail_rec.after_warranty_cost;
13524 
13525         IF l_conversion_needed_flag = 'Y' THEN
13526          --assign coverted amt to after_warranty_cost
13527          x_charges_detail_rec.after_warranty_cost := x_charges_detail_rec.after_warranty_cost * x_charges_detail_rec.conversion_rate;
13528          IF l_curr_in_conversion_list = 'Y' THEN --12.1.3, vpremach
13529             x_charges_detail_rec.list_price := p_charges_detail_rec.list_price;
13530          ELSE
13531 	    x_charges_detail_rec.list_price := l_list_price;
13532          END IF;
13533 
13534          --bug # 3056622 charge amount is zero for items with negative prices
13535 
13536          IF p_charges_detail_rec.selling_price <> FND_API.G_MISS_NUM AND
13537             p_charges_detail_rec.selling_price IS NOT NULL THEN
13538            x_charges_detail_rec.selling_price :=  p_charges_detail_rec.selling_price * x_charges_detail_rec.conversion_rate;
13539          ELSE
13540            x_charges_detail_rec.selling_price :=  x_charges_detail_rec.list_price;
13541          END IF;
13542 
13543         ELSE
13544           x_charges_detail_rec.after_warranty_cost := p_charges_detail_rec.after_warranty_cost;
13545           IF l_curr_in_conversion_list = 'Y' THEN --12.1.3, vpremach
13546             x_charges_detail_rec.list_price := p_charges_detail_rec.list_price;
13547           ELSE
13548 	    x_charges_detail_rec.list_price := l_list_price;
13549           END IF;
13550 
13551           --bug # 3056622 charge amount is zero for items with negative prices
13552 
13553           IF p_charges_detail_rec.selling_price IS NOT NULL
13554 	  and p_charges_detail_rec.selling_price <> FND_API.G_MISS_NUM THEN  -- charges logistics
13555             x_charges_detail_rec.selling_price :=  p_charges_detail_rec.selling_price;
13556           ELSE
13557             x_charges_detail_rec.selling_price :=  x_charges_detail_rec.list_price;
13558           END IF;
13559         END IF;
13560 
13561 
13562         --DBMS_OUTPUT.PUT_LINE(' after_warranty_cost '||x_charges_detail_rec.after_warranty_cost );
13563         --DBMS_OUTPUT.PUT_LINE(' selling price is '|| x_charges_detail_rec.selling_price);
13564         --DBMS_OUTPUT.PUT_LINE(' list price is '|| x_charges_detail_rec.list_price);
13565         --DBMS_OUTPUT.PUT_LINE(' apply_contract_discount is '||x_charges_detail_rec.apply_contract_discount);
13566         --DBMS_OUTPUT.PUT_LINE(' no_charge_flag is '||x_charges_detail_rec.no_charge_flag);
13567         --DBMS_OUTPUT.PUT_LINE('l_request_date is '||l_request_date);
13568 
13569         --Fixed Bug # 3468146
13570         --need to do this here so that contract discounting is done correctly
13571         --re-set the no_charge_flag for Charge Lines
13572         --since the line has come with after warranty cost from upstream
13573         IF x_charges_detail_rec.after_warranty_cost <> 0 THEN
13574           x_charges_detail_rec.no_charge_flag := 'N';
13575         END IF;
13576 
13577         --DBMS_OUTPUT.PUT_LINE('re-setting the no_charge_flag' ||x_charges_detail_rec.no_charge_flag);
13578 
13579 
13580         IF x_charges_detail_rec.apply_contract_discount = 'Y' AND
13581           x_charges_detail_rec.contract_line_id IS NOT NULL AND
13582           x_charges_detail_rec.no_charge_flag <> 'Y' THEN
13583 
13584 
13585           --DBMS_OUTPUT.PUT_LINE('calling contract discount ');
13586 
13587 
13588           --call contracts dicounting API
13589          CS_Est_Apply_Contract_PKG.Apply_Contract(
13590            p_coverage_id           => x_charges_detail_rec.contract_line_id,
13591            p_coverage_txn_group_id => x_charges_detail_rec.coverage_txn_group_id,
13592            p_txn_billing_type_id   => x_charges_detail_rec.txn_billing_type_id,
13593            P_BUSINESS_PROCESS_ID   => x_charges_detail_rec.business_process_id,
13594            P_REQUEST_DATE          => l_request_date,
13595            p_amount                => x_charges_detail_rec.after_warranty_cost,
13596            p_discount_amount       => l_contract_discount,
13597            X_RETURN_STATUS         => l_return_status,
13598            X_MSG_COUNT             => l_msg_count,
13599            X_MSG_DATA              => l_msg_data);
13600 
13601           IF l_return_status <> FND_API.G_RET_STS_SUCCESS THEN
13602             FND_MESSAGE.Set_Name('CS', 'CS_CHG_APPLY_CONTRACT_WARNING');
13603             FND_MESSAGE.SET_TOKEN('REASON', l_msg_data);
13604             FND_MSG_PUB.Add;
13605             RAISE FND_API.G_EXC_ERROR;
13606           END IF;
13607 
13608           --DBMS_OUTPUT.PUT_LINE('l_contract_discount '||l_contract_discount);
13609 
13610          --Bug Fix for Bug # 3088397
13611          IF l_contract_discount IS NOT NULL THEN
13612            --assign the contract discount to the out record
13613            x_charges_detail_rec.contract_discount_amount := x_charges_detail_rec.after_warranty_cost - l_contract_discount;
13614 
13615            --apply discount
13616            x_charges_detail_rec.after_warranty_cost := l_contract_discount;
13617 
13618            --DBMS_OUTPUT.PUT_LINE(' contract discount is : '||x_charges_detail_rec.contract_discount_amount);
13619            --DBMS_OUTPUT.PUT_LINE(' after_warranty_cost  : '||x_charges_detail_rec.after_warranty_cost );
13620 
13621          ELSE
13622            -- contract discount amt should be 0
13623            --x_charges_detail_rec.contract_discount_amount := 0;
13624            null;
13625 
13626          END IF;
13627 
13628            --DBMS_OUTPUT.PUT_LINE('Contract 7'||x_charges_detail_rec.contract_discount_amount);
13629            --DBMS_OUTPUT.PUT_LINE(' contract discount is : '||x_charges_detail_rec.contract_discount_amount);
13630            --DBMS_OUTPUT.PUT_LINE(' after_warranty_cost  : '||x_charges_detail_rec.after_warranty_cost );
13631       ELSE
13632         --Apply contract discount = 'N'
13633         --Fixed Bug # 3220253
13634         --passed p_charges_detail_rec.contract_discount_amount
13635         x_charges_detail_rec.apply_contract_discount := p_charges_detail_rec.apply_contract_discount;
13636         x_charges_detail_rec.contract_discount_amount := p_charges_detail_rec.contract_discount_amount;
13637 
13638          IF x_charges_detail_rec.contract_discount_amount IS NULL THEN
13639             x_charges_detail_rec.contract_discount_amount := 0;
13640          ELSE
13641             x_charges_detail_rec.contract_discount_amount := x_charges_detail_rec.contract_discount_amount;
13642          END IF;
13643       END IF ;
13644    ELSE
13645      --l_calc_sp = 'N'
13646      -- Assign the after warranty that is in the databse
13647         x_charges_detail_rec.after_warranty_cost := l_db_det_rec.after_warranty_cost;
13648 
13649     IF l_conversion_needed_flag = 'Y' AND
13650        l_db_det_rec.conversion_rate IS NULL THEN
13651        --assign coverted amt to after_warranty_cost
13652 
13653       --bug # 3056622 charge amount is zero for items with negative prices
13654 
13655       IF p_charges_detail_rec.selling_price <> FND_API.G_MISS_NUM AND
13656          p_charges_detail_rec.selling_price IS NOT NULL THEN
13657         x_charges_detail_rec.selling_price :=  p_charges_detail_rec.selling_price * x_charges_detail_rec.conversion_rate;
13658         x_charges_detail_rec.after_warranty_cost := x_charges_detail_rec.after_warranty_cost * x_charges_detail_rec.conversion_rate;
13659         x_charges_detail_rec.list_price := l_db_det_rec.list_price * x_charges_detail_rec.conversion_rate;
13660       ELSE
13661         x_charges_detail_rec.selling_price :=  l_db_det_rec.selling_price * x_charges_detail_rec.conversion_rate  ;
13662         x_charges_detail_rec.after_warranty_cost := x_charges_detail_rec.after_warranty_cost * x_charges_detail_rec.conversion_rate;
13663         x_charges_detail_rec.list_price := l_db_det_rec.list_price * x_charges_detail_rec.conversion_rate;
13664       END IF;
13665 
13666     ELSE
13667        --bug # 3056622 charge amount is zero for items with negative prices
13668        IF p_charges_detail_rec.selling_price <> FND_API.G_MISS_NUM AND
13669           p_charges_detail_rec.selling_price IS NOT NULL THEN
13670          x_charges_detail_rec.selling_price :=  p_charges_detail_rec.selling_price;
13671          x_charges_detail_rec.after_warranty_cost := x_charges_detail_rec.after_warranty_cost;
13672          x_charges_detail_rec.list_price := l_db_det_rec.list_price;
13673        ELSE
13674          x_charges_detail_rec.after_warranty_cost := l_db_det_rec.after_warranty_cost;
13675          x_charges_detail_rec.list_price := l_db_det_rec.list_price;
13676          x_charges_detail_rec.selling_price := l_db_det_rec.selling_price;
13677        END IF;
13678     END IF;
13679 
13680     --DBMS_OUTPUT.PUT_LINE(' after_warranty_cost '||x_charges_detail_rec.after_warranty_cost );
13681 
13682     IF x_charges_detail_rec.apply_contract_discount = 'Y' AND
13683        x_charges_detail_rec.contract_line_id IS NOT NULL AND
13684        x_charges_detail_rec.no_charge_flag <> 'Y' THEN
13685 
13686 
13687       --call contracts dicounting API
13688      CS_Est_Apply_Contract_PKG.Apply_Contract(
13689           p_coverage_id           => x_charges_detail_rec.contract_line_id,
13690           p_coverage_txn_group_id => x_charges_detail_rec.coverage_txn_group_id,
13691           p_txn_billing_type_id   => x_charges_detail_rec.txn_billing_type_id,
13692           P_BUSINESS_PROCESS_ID   => x_charges_detail_rec.business_process_id,
13693           P_REQUEST_DATE          => l_request_date,
13694           p_amount                => x_charges_detail_rec.after_warranty_cost,
13695           p_discount_amount       => l_contract_discount,
13696           X_RETURN_STATUS         => l_return_status,
13697           X_MSG_COUNT             => l_msg_count,
13698           X_MSG_DATA              => l_msg_data);
13699 
13700       IF l_return_status <> FND_API.G_RET_STS_SUCCESS THEN
13701         FND_MESSAGE.Set_Name('CS', 'CS_CHG_APPLY_CONTRACT_WARNING');
13702         FND_MESSAGE.SET_TOKEN('REASON', l_msg_data);
13703         FND_MSG_PUB.Add;
13704         RAISE FND_API.G_EXC_ERROR;
13705       END IF;
13706 
13707       --Bug Fix for Bug # 3088397
13708       IF l_contract_discount IS NOT NULL THEN
13709         --assign the contract discount to the out record
13710         x_charges_detail_rec.contract_discount_amount := x_charges_detail_rec.after_warranty_cost - l_contract_discount;
13711 
13712         --apply discount
13713         x_charges_detail_rec.after_warranty_cost := l_contract_discount;
13714 
13715        ELSE
13716           -- contract discount amt should be 0
13717           --x_charges_detail_rec.contract_discount_amount := 0;
13718           null;
13719       END IF;
13720       --DBMS_OUTPUT.PUT_LINE('Contract 8'||x_charges_detail_rec.contract_discount_amount);
13721 
13722       --DBMS_OUTPUT.PUT_LINE('Contract Amount '||x_charges_detail_rec.contract_discount_amount );
13723 
13724     ELSE
13725       --Apply contract discount = 'N'
13726       --Fixed Bug # 3220253
13727       --passed p_charges_detail_rec.contract_discount_amount
13728       x_charges_detail_rec.apply_contract_discount := p_charges_detail_rec.apply_contract_discount;
13729       IF p_charges_detail_rec.contract_discount_amount <> FND_API.G_MISS_NUM OR
13730          p_charges_detail_rec.contract_discount_amount IS NOT NULL THEN
13731         x_charges_detail_rec.contract_discount_amount := l_db_rec.contract_discount_amount;
13732       ELSIF p_charges_detail_rec.contract_discount_amount IS NULL THEN
13733         x_charges_detail_rec.contract_discount_amount := 0;
13734       ELSE
13735         x_charges_detail_rec.contract_discount_amount := p_charges_detail_rec.contract_discount_amount;
13736       END IF;
13737     END IF ;
13738    END IF;
13739   END IF;
13740   IF   l_line_order_category_code = 'ORDER' THEN      --Bug 6960562
13741   /* Start : 5705568 */
13742 --    If x_charges_detail_rec.after_warranty_cost < 0  Then
13743 -- Bug 8305664 Removed the and  condition in the if statement.
13744   If x_charges_detail_rec.after_warranty_cost < 0  Then  -- bug 7459205
13745      x_charges_detail_rec.after_warranty_cost := 0;
13746   End If;
13747   /* End : 5705568 */
13748   End If;
13749 END IF;
13750 
13751 --==================================
13752 --final re-set of no_charge_flag
13753 --if after_warranty_cost <> 0
13754 --Fixed Bug # 3468146
13755 --since the line has come with after warranty cost from upstream
13756 IF x_charges_detail_rec.after_warranty_cost <> 0 THEN
13757   x_charges_detail_rec.no_charge_flag := 'N';
13758 END IF;
13759 
13760 
13761 --===================================
13762 --Validate Transaction Inventory Org
13763 --===================================
13764 --DBMS_OUTPUT.PUT_LINE('Validate Transaction Inventory Org ...');
13765 --DBMS_OUTPUT.PUT_LINE('p_charges_detail_rec.transaction_inventory_org = '||p_charges_detail_rec.transaction_inventory_org);
13766 IF p_validation_mode = 'I' THEN
13767   IF p_charges_detail_rec.transaction_inventory_org IS NOT NULL THEN
13768     l_valid_check := IS_TXN_INV_ORG_VALID(p_txn_inv_org   => p_charges_detail_rec.transaction_inventory_org,
13769                             --p_org_id         => l_org_id,
13770                            -- p_org_id           => x_charges_detail_rec.org_id,
13771 			      p_inv_id           => x_charges_detail_rec.inventory_item_id_in,
13772                               x_msg_data         => l_msg_data,
13773                               x_msg_count        => l_msg_count,
13774                               x_return_status    => l_return_status  ) ;
13775 
13776       IF l_return_status = G_RET_STS_UNEXP_ERROR THEN
13777         RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
13778       ELSIF l_return_status = G_RET_STS_ERROR THEN
13779         RAISE FND_API.G_EXC_ERROR;
13780       END IF;
13781 
13782       IF l_valid_check <> 'Y' THEN
13783         FND_MESSAGE.Set_Name('CS', 'CS_CHG_INVALID_TXN_INV_ORG');
13784         FND_MESSAGE.Set_Token('ORG_ID', p_charges_detail_rec.transaction_inventory_org);
13785         FND_MSG_PUB.Add;
13786         RAISE FND_API.G_EXC_ERROR;
13787       END IF;
13788 
13789   END IF;
13790   x_charges_detail_rec.transaction_inventory_org := p_charges_detail_rec.transaction_inventory_org;
13791 
13792 ELSIF p_validation_mode = 'U' THEN
13793   -- assign from db record
13794   -- need to find out if we can update the transaction_inventory_org
13795   --
13796 
13797   IF p_charges_detail_rec.transaction_inventory_org <> FND_API.G_MISS_NUM AND
13798      p_charges_detail_rec.transaction_inventory_org IS NOT NULL THEN
13799 
13800      l_valid_check := IS_TXN_INV_ORG_VALID
13801                            (p_txn_inv_org   => p_charges_detail_rec.transaction_inventory_org,
13802                            -- p_org_id           => x_charges_detail_rec.org_id,
13803 			    p_inv_id           => x_charges_detail_rec.inventory_item_id_in,
13804                             x_msg_data         => l_msg_data,
13805                             x_msg_count        => l_msg_count,
13806                             x_return_status    => l_return_status  ) ;
13807 
13808       IF l_return_status = G_RET_STS_UNEXP_ERROR THEN
13809         RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
13810       ELSIF l_return_status = G_RET_STS_ERROR THEN
13811         RAISE FND_API.G_EXC_ERROR;
13812       END IF;
13813 
13814       IF l_valid_check <> 'Y' THEN
13815         FND_MESSAGE.Set_Name('CS', 'CS_CHG_INVALID_TXN_INV_ORG');
13816         FND_MESSAGE.Set_Token('ORG_ID', p_charges_detail_rec.transaction_inventory_org);
13817         FND_MSG_PUB.Add;
13818         RAISE FND_API.G_EXC_ERROR;
13819       END IF;
13820 
13821       x_charges_detail_rec.transaction_inventory_org := p_charges_detail_rec.transaction_inventory_org;
13822 
13823   ELSIF p_charges_detail_rec.transaction_inventory_org  = FND_API.G_MISS_NUM THEN
13824       x_charges_detail_rec.transaction_inventory_org := l_db_det_rec.transaction_inventory_org;
13825   ELSE
13826       x_charges_detail_rec.transaction_inventory_org := NULL;
13827   END IF;
13828 
13829 END IF;
13830 
13831 --DBMS_OUTPUT.PUT_LINE('Validate Transaction Inventory Org completed. x_charges_detail_rec.transaction_inventory_org = '|| x_charges_detail_rec.transaction_inventory_org);
13832 
13833 -- 12.1.3 Charges Logistics PRoject
13834 
13835 IF p_validation_mode = 'I' THEN
13836 
13837 
13838   x_charges_detail_rec.shipping_method := null;
13839   x_charges_detail_rec.arrival_date_time := null;
13840   x_charges_detail_rec.shipping_method := null;
13841   x_charges_detail_rec.distance := null;
13842   x_charges_detail_rec.need_by_date := null;
13843 
13844 IF x_charges_detail_rec.line_category_code = 'ORDER' AND fnd_profile.value('CS_SR_EN_SHIP_SOUR_RULE') = 'Y' Then
13845 
13846    If x_charges_detail_rec.transaction_inventory_org is not Null AND x_charges_detail_rec.transaction_inventory_org <> FND_API.G_MISS_NUM THEN
13847 
13848       IF p_charges_detail_rec.transaction_sub_inventory IS NOT NULL AND p_charges_detail_rec.transaction_sub_inventory <> FND_API.G_MISS_CHAR Then
13849          Open c_sub_inventory(x_charges_detail_rec.transaction_inventory_org, p_charges_detail_rec.transaction_sub_inventory);
13850          Fetch c_sub_inventory into l_sub_inv_exists;
13851          If c_sub_inventory%FOUND Then
13852 	    x_charges_detail_rec.transaction_sub_inventory := p_charges_detail_rec.transaction_sub_inventory;
13853          Else
13854 	    FND_MESSAGE.Set_Name('CS', 'CS_CHG_INVALID_SUB_INV');
13855             FND_MESSAGE.Set_Token('SUB_INVENTORY', p_charges_detail_rec.transaction_sub_inventory);
13856             FND_MSG_PUB.Add;
13857             RAISE FND_API.G_EXC_ERROR;
13858 	 End If;
13859       Else
13860          x_charges_detail_rec.transaction_sub_inventory :=  Null;
13861       End If;
13862 
13863       If ( p_charges_detail_rec.shipping_method is not null and p_charges_detail_rec.shipping_method <> FND_API.G_MISS_CHAR)
13864 	 OR (p_charges_detail_rec.arrival_date_time is not Null and p_charges_detail_rec.arrival_date_time <> FND_API.G_MISS_DATE) Then
13865 
13866 	    l_required_parts(1).inventory_item_id := x_charges_detail_rec.inventory_item_id_in;
13867             l_required_parts(1).quantity := x_charges_detail_rec.quantity_required;
13868             l_party_site_id := x_charges_detail_rec.ship_to_org_id;
13869 
13870 	    Open c_location_id(l_party_site_id);
13871             Fetch c_location_id into l_location_id;
13872             Close c_location_id;
13873 
13874             l_search_params.manned_warehouses := TRUE;
13875             l_search_params.to_hz_location_id := l_location_id;
13876             l_search_params.include_closed := TRUE;
13877 
13878             If p_charges_detail_rec.need_by_date is not Null and p_charges_detail_rec.need_by_date <> FND_API.G_MISS_DATE Then
13879                 l_search_params.need_by_date := p_charges_detail_rec.need_by_date;
13880                 x_charges_detail_rec.need_by_date := p_charges_detail_rec.need_by_date;
13881 	    Else
13882 		l_search_params.need_by_date := null;
13883             End If;
13884 
13885             csp_part_search_pvt.search(
13886 		    p_required_parts => l_required_parts,
13887 		    p_search_params  => l_search_params,
13888 		    x_return_status  => x_return_status,
13889 		    x_msg_data	     => x_msg_data,
13890 		    x_msg_count      => x_msg_count);
13891 
13892             If x_return_status = 'S' then
13893 
13894 	       For i in c_ship_dtls(x_charges_detail_rec.transaction_inventory_org) Loop
13895 	          If ( p_charges_detail_rec.shipping_method is not null and p_charges_detail_rec.shipping_method <> FND_API.G_MISS_CHAR) Then
13896 
13897 		   if i.shipping_method = p_charges_detail_rec.shipping_method Then
13898                       x_charges_detail_rec.shipping_method   := p_charges_detail_rec.shipping_method;
13899 		      l_shipping_method_found :='Y';
13900 		      l_found := 'Y';
13901 		   else
13902 		      l_found := 'N';
13903 		   End If;
13904 		  End If;
13905 
13906 		If (p_charges_detail_rec.arrival_date_time is not Null and p_charges_detail_rec.arrival_date_time <> FND_API.G_MISS_DATE) Then
13907 		   If trunc(i.arrival_date) = trunc(p_charges_detail_rec.arrival_date_time) then
13908 		       x_charges_detail_rec.arrival_date_time := p_charges_detail_rec.arrival_date_time;
13909 		       l_arrival_date_found :='Y';
13910 		       l_found := 'Y';
13911 		   Else
13912 		      l_found := 'N';
13913 		   End If;
13914 		Else
13915 		   x_charges_detail_rec.arrival_date_time := Null;
13916                 End If;
13917 
13918 		If (p_charges_detail_rec.distance is not Null and p_charges_detail_rec.distance <> FND_API.G_MISS_NUM) Then
13919 
13920 		   If i.distance = p_charges_detail_rec.distance then
13921 		       x_charges_detail_rec.distance := p_charges_detail_rec.distance;
13922 		       l_distance_found :='Y';
13923 		       l_found := 'Y';
13924 		   Else
13925 		      l_found := 'N';
13926 		   End If;
13927 		Else
13928 		   x_charges_detail_rec.distance := Null;
13929                 End If;
13930 
13931 		If ((l_found ='Y') and (NOT (p_charges_detail_rec.shipping_method is not null and l_shipping_method_found = 'N' ))
13932 	       and (NOT (p_charges_detail_rec.arrival_date_time is not null and l_arrival_date_found = 'N' ))
13933 	       and (NOT (p_charges_detail_rec.distance is not null and l_distance_found = 'N' ))
13934 	       ) Then
13935 		   Exit;
13936 	       End If;
13937 	       End Loop;
13938 
13939 	       If (p_charges_detail_rec.shipping_method is not null and l_shipping_method_found ='N' ) then
13940                   FND_MESSAGE.Set_Name('CS', 'CS_CHG_INVALID_SHIP_METHOD');
13941                   FND_MESSAGE.Set_Token('SHIPPING_METHOD', p_charges_detail_rec.shipping_method);
13942                   FND_MSG_PUB.Add;
13943                   RAISE FND_API.G_EXC_ERROR;
13944 	       end if;
13945 
13946                If (l_arrival_date_found  ='N' and p_charges_detail_rec.arrival_date_time is not null ) Then
13947 	          FND_MESSAGE.Set_Name('CS', 'CS_CHG_INVALID_ARRV_DT');
13948                   FND_MESSAGE.Set_Token('ARRIVAL_DATE', p_charges_detail_rec.arrival_date_time);
13949                   FND_MSG_PUB.Add;
13950                   RAISE FND_API.G_EXC_ERROR;
13951 	       End If;
13952 	       If (l_distance_found  ='N' and p_charges_detail_rec.distance is not null and p_charges_detail_rec.distance <> FND_API.G_MISS_NUM) Then
13953 	          FND_MESSAGE.Set_Name('CS', 'CS_CHG_INVALID_SHIP_DIST');
13954                   FND_MESSAGE.Set_Token('DISTANCE', p_charges_detail_rec.distance);
13955                   FND_MSG_PUB.Add;
13956                   RAISE FND_API.G_EXC_ERROR;
13957 	       end if;
13958 	    End If;  --x_return_status = 'S'
13959 	 Else
13960 	    x_charges_detail_rec.shipping_method := Null;
13961 	    x_charges_detail_rec.arrival_date_time := Null;
13962 	    x_charges_detail_rec.distance := null;
13963 	    x_charges_detail_rec.need_by_date := null;
13964 	 End If;
13965       Else  -- transaction_inventory_org is null
13966          x_charges_detail_rec.shipping_method := Null;
13967 	 x_charges_detail_rec.arrival_date_time := Null;
13968 	 x_charges_detail_rec.distance := null;
13969 	 x_charges_detail_rec.need_by_date := null;
13970       End If;
13971   End If;
13972 /* End bug 12537583 */
13973 /* Commented below code for bug 12537583 */
13974            /* l_search_params.manned_warehouses := TRUE;
13975             l_search_params.need_by_date := null;
13976             l_search_params.to_hz_location_id := l_location_id;
13977             l_search_params.include_closed := TRUE;
13978 
13979             csp_part_search_pvt.search(
13980 		    p_required_parts => l_required_parts,
13981 		    p_search_params  => l_search_params,
13982 		    x_return_status  => x_return_status,
13983 		    x_msg_data	     => x_msg_data,
13984 		    x_msg_count      => x_msg_count);
13985 
13986             If x_return_status = 'S' then
13987 	       Open c_ship_dtls(x_charges_detail_rec.transaction_inventory_org, x_charges_detail_rec.transaction_sub_inventory);
13988 	       Fetch c_ship_dtls into l_shipping_method_code, l_arrival_date;
13989 	       Close c_ship_dtls;
13990 
13991 	       If p_charges_detail_rec.shipping_method is not null and p_charges_detail_rec.shipping_method <> FND_API.G_MISS_CHAR Then
13992 	          If l_shipping_method_code = p_charges_detail_rec.shipping_method Then
13993 	             x_charges_detail_rec.shipping_method := p_charges_detail_rec.shipping_method;
13994 	          Else
13995 	             FND_MESSAGE.Set_Name('CS', 'CS_CHG_INVALID_SHIP_METHOD');
13996                      FND_MESSAGE.Set_Token('SHIPPING_METHOD', p_charges_detail_rec.shipping_method);
13997                      FND_MSG_PUB.Add;
13998                      RAISE FND_API.G_EXC_ERROR;
13999 	          End If;
14000 	       Else
14001 	          x_charges_detail_rec.shipping_method := Null;
14002 	       End If;
14003 
14004 	       If p_charges_detail_rec.arrival_date_time is not Null and p_charges_detail_rec.arrival_date_time <> FND_API.G_MISS_DATE Then
14005 	          If trunc(l_arrival_date) = trunc(p_charges_detail_rec.arrival_date_time) then
14006 	             x_charges_detail_rec.arrival_date_time := p_charges_detail_rec.arrival_date_time;
14007 	          Else
14008 	             FND_MESSAGE.Set_Name('CS', 'CS_CHG_INVALID_ARRV_DT');
14009                      FND_MESSAGE.Set_Token('ARRIVAL_DATE', p_charges_detail_rec.arrival_date_time);
14010                      FND_MSG_PUB.Add;
14011                      RAISE FND_API.G_EXC_ERROR;
14012 	          End If;
14013 	       Else
14014 	          x_charges_detail_rec.arrival_date_time := Null;
14015 	       End If;
14016 	    End If; --x_return_status
14017 	 Else -- shipping method , arrival date not null
14018 
14019 	    x_charges_detail_rec.shipping_method := Null;
14020 	    x_charges_detail_rec.arrival_date_time := Null;
14021 	 End If;
14022 
14023       Else
14024 
14025          FND_MESSAGE.Set_Name('CS', 'CS_CHG_INVALID_SUB_INV');
14026          FND_MESSAGE.Set_Token('SUB_INVENTORY', p_charges_detail_rec.transaction_sub_inventory);
14027          FND_MSG_PUB.Add;
14028          RAISE FND_API.G_EXC_ERROR;
14029       End If; --c_sub_inventory
14030       Close c_sub_inventory;  */
14031   -- Else
14032     --  x_charges_detail_rec.transaction_sub_inventory :=  Null;
14033   -- End If;
14034 
14035 ELSIF p_validation_mode = 'U' THEN
14036 -- bug 10404123
14037   IF x_charges_detail_rec.line_category_code = 'ORDER' AND fnd_profile.value('CS_SR_EN_SHIP_SOUR_RULE') = 'Y' Then
14038    If (x_charges_detail_rec.transaction_inventory_org is not Null AND x_charges_detail_rec.transaction_inventory_org <> FND_API.G_MISS_NUM) THEN
14039 
14040       IF (p_charges_detail_rec.transaction_sub_inventory IS NOT NULL AND p_charges_detail_rec.transaction_sub_inventory <> FND_API.G_MISS_CHAR) Then
14041 
14042          Open c_sub_inventory(x_charges_detail_rec.transaction_inventory_org, p_charges_detail_rec.transaction_sub_inventory);
14043          Fetch c_sub_inventory into l_sub_inv_exists;
14044          If c_sub_inventory%FOUND Then
14045 	    x_charges_detail_rec.transaction_sub_inventory :=  p_charges_detail_rec.transaction_sub_inventory;
14046          Else
14047             FND_MESSAGE.Set_Name('CS', 'CS_CHG_INVALID_SUB_INV');
14048             FND_MESSAGE.Set_Token('SUB_INVENTORY', p_charges_detail_rec.transaction_sub_inventory);
14049             FND_MSG_PUB.Add;
14050             RAISE FND_API.G_EXC_ERROR;
14051          End If;
14052          Close c_sub_inventory;
14053       ELSE
14054          x_charges_detail_rec.transaction_sub_inventory := l_db_det_rec.transaction_sub_inventory;
14055       End if;
14056 
14057       IF ( p_charges_detail_rec.shipping_method is not null and p_charges_detail_rec.shipping_method <> FND_API.G_MISS_CHAR)
14058 	 OR (p_charges_detail_rec.arrival_date_time is not Null and p_charges_detail_rec.arrival_date_time <> FND_API.G_MISS_DATE) Then
14059 
14060 	    l_required_parts(1).inventory_item_id := x_charges_detail_rec.inventory_item_id_in;
14061             l_required_parts(1).quantity := x_charges_detail_rec.quantity_required;
14062             l_party_site_id := x_charges_detail_rec.ship_to_org_id;
14063 
14064             Open c_location_id(l_party_site_id);
14065             Fetch c_location_id into l_location_id;
14066             Close c_location_id;
14067 
14068             l_search_params.manned_warehouses := TRUE;
14069 	    -- Charges MED Project
14070 	    If p_charges_detail_rec.need_by_date is not Null and p_charges_detail_rec.need_by_date <> FND_API.G_MISS_DATE Then
14071                 l_search_params.need_by_date := p_charges_detail_rec.need_by_date;
14072 		x_charges_detail_rec.need_by_date := p_charges_detail_rec.need_by_date;
14073             else
14074 	        l_search_params.need_by_date := Null;
14075 	    End If;
14076             l_search_params.to_hz_location_id := l_location_id;
14077             l_search_params.include_closed := TRUE;
14078 
14079             csp_part_search_pvt.search(
14080 		    p_required_parts => l_required_parts,
14081 		    p_search_params  => l_search_params,
14082 		    x_return_status  => x_return_status,
14083 		    x_msg_data	     => x_msg_data,
14084 		    x_msg_count      => x_msg_count);
14085 
14086             If x_return_status = 'S' then
14087 
14088 
14089 	       For i in c_ship_dtls(x_charges_detail_rec.transaction_inventory_org) Loop
14090 		  If p_charges_detail_rec.shipping_method is not null and p_charges_detail_rec.shipping_method <> FND_API.G_MISS_CHAR Then
14091 
14092 	             If i.shipping_method = p_charges_detail_rec.shipping_method Then
14093 		        l_found :='Y';
14094 			l_shipping_method_found := 'Y';
14095 	                x_charges_detail_rec.shipping_method := p_charges_detail_rec.shipping_method;
14096 	             Else
14097 		        l_found :='N';
14098 	             End If;
14099 	          Else
14100 	             x_charges_detail_rec.shipping_method := l_db_det_rec.shipping_method;
14101 	          End If;
14102 
14103 	       If p_charges_detail_rec.arrival_date_time is not Null and p_charges_detail_rec.arrival_date_time <> FND_API.G_MISS_DATE Then
14104 
14105 	          If trunc(i.arrival_date) = trunc(p_charges_detail_rec.arrival_date_time) then
14106 	             x_charges_detail_rec.arrival_date_time := p_charges_detail_rec.arrival_date_time;
14107 		     l_found := 'Y';
14108 		     l_arrival_date_found  :='Y';
14109 	          Else
14110 		     l_found := 'N';
14111 	          End If;
14112 	       Else
14113 	          x_charges_detail_rec.arrival_date_time := l_db_det_rec.arrival_date_time;
14114 	       End If;
14115 
14116 	       --Charges MED
14117 
14118 	       If p_charges_detail_rec.distance is not Null and p_charges_detail_rec.distance <> FND_API.G_MISS_NUM Then
14119 	          If i.distance = p_charges_detail_rec.distance then
14120 		     l_found  :='Y';
14121 		     l_distance_found  :='Y';
14122 	             x_charges_detail_rec.distance := p_charges_detail_rec.distance;
14123 	          Else
14124 		     l_found  := 'N';
14125 	          End If;
14126 	       Else
14127 	          x_charges_detail_rec.distance := l_db_det_rec.shipping_distance;
14128 	       End If;
14129 
14130 	       If ((l_found ='Y') and (NOT (p_charges_detail_rec.shipping_method is not null and l_shipping_method_found = 'N' ))
14131 	       and (NOT (p_charges_detail_rec.arrival_date_time is not null and l_arrival_date_found = 'N' ))
14132 	       and (NOT (p_charges_detail_rec.distance is not null and l_distance_found = 'N' ))
14133 	       ) Then
14134 		   Exit;
14135 	       End If;
14136 
14137 	       End Loop;
14138 
14139 	       If (p_charges_detail_rec.shipping_method is not null and l_shipping_method_found ='N' ) then
14140                   FND_MESSAGE.Set_Name('CS', 'CS_CHG_INVALID_SHIP_METHOD');
14141                   FND_MESSAGE.Set_Token('SHIPPING_METHOD', p_charges_detail_rec.shipping_method);
14142                   FND_MSG_PUB.Add;
14143                   RAISE FND_API.G_EXC_ERROR;
14144 	       end if;
14145 
14146                If (l_arrival_date_found  ='N' and p_charges_detail_rec.arrival_date_time is not null ) Then
14147 	          FND_MESSAGE.Set_Name('CS', 'CS_CHG_INVALID_ARRV_DT');
14148                   FND_MESSAGE.Set_Token('ARRIVAL_DATE', p_charges_detail_rec.arrival_date_time);
14149                   FND_MSG_PUB.Add;
14150                   RAISE FND_API.G_EXC_ERROR;
14151 	       End If;
14152 	       If (l_distance_found  ='N' and p_charges_detail_rec.distance is not null and p_charges_detail_rec.distance <> FND_API.G_MISS_NUM) Then
14153 	          FND_MESSAGE.Set_Name('CS', 'CS_CHG_INVALID_SHIP_DIST');
14154                   FND_MESSAGE.Set_Token('DISTANCE', p_charges_detail_rec.distance);
14155                   FND_MSG_PUB.Add;
14156                   RAISE FND_API.G_EXC_ERROR;
14157 	       end if;
14158 
14159 	       End If;  -- return status = 'S'
14160 
14161 	       /*Open c_ship_dtls(x_charges_detail_rec.transaction_inventory_org, x_charges_detail_rec.transaction_sub_inventory);
14162 	       Fetch c_ship_dtls into l_shipping_method_code, l_arrival_date,l_distance;
14163 	       Close c_ship_dtls;*/
14164 	 Else
14165 	    x_charges_detail_rec.shipping_method := l_db_det_rec.shipping_method;
14166 	    x_charges_detail_rec.arrival_date_time := l_db_det_rec.arrival_date_time;
14167 	    x_charges_detail_rec.distance := l_db_det_rec.shipping_distance;
14168 	    x_charges_detail_rec.need_by_date := l_db_det_rec.need_by_date;
14169 
14170 	 End If;
14171     END IF;
14172   End If;
14173 End If;
14174 
14175 IF p_validation_mode = 'I' THEN
14176 
14177    IF p_charges_detail_rec.return_type IS NOT NULL and p_charges_detail_rec.return_type <> FND_API.G_MISS_CHAR THEN
14178       Open c_return_type(p_charges_detail_rec.return_type);
14179       Fetch c_return_type into l_return_type;
14180       If c_return_type%FOUND Then
14181 
14182 	 x_charges_detail_rec.return_type :=  p_charges_detail_rec.return_type;
14183 
14184 	 IF l_line_order_category_code = 'RETURN' THEN
14185 
14186 	    Open c_location_id(x_charges_detail_rec.ship_to_org_id);
14187             Fetch c_location_id into l_location_id;
14188 	    Close c_location_id;
14189 
14190 	     CSP_EXCESS_PARTS_PVT.charges_return_routing(
14191 			    p_return_type       => p_charges_detail_rec.return_type,
14192 			    p_hz_location_id    => l_location_id,
14193 			    p_item_id           => x_charges_detail_rec.inventory_item_id_in,
14194 			    x_organization_id   => x_organization_id,
14195 			    x_subinventory_code => x_subinventory_code,
14196 			    x_hz_location_id    => x_hz_location_id,
14197 			    x_hr_location_id    => x_hr_location_id,
14198 			    x_operating_unit    => x_operating_unit,
14199 			    x_return_status     => l_return_status,
14200 			    x_msg_count         => l_msg_count,
14201 			    x_msg_data          => l_msg_data);
14202 
14203 	     IF x_return_status = 'S' THEN
14204 	        x_charges_detail_rec.transaction_inventory_org := x_organization_id;
14205 	        x_charges_detail_rec.transaction_sub_inventory := x_subinventory_code;
14206 	     END IF;
14207 	 End If;
14208       Else
14209          FND_MESSAGE.Set_Name('CS', 'CS_CHG_INVALID_RETURN_TYPE');
14210          FND_MESSAGE.Set_Token('RETURN_TYPE', p_charges_detail_rec.return_type);
14211          FND_MSG_PUB.Add;
14212          RAISE FND_API.G_EXC_ERROR;
14213       End If;
14214       Close c_return_type;
14215    Else
14216       x_charges_detail_rec.return_type := Null;
14217 
14218    End If;
14219 
14220 ELSIF p_validation_mode = 'U' THEN
14221   IF p_charges_detail_rec.return_type <> FND_API.G_MISS_CHAR AND
14222      p_charges_detail_rec.return_type <> l_db_det_rec.return_type AND
14223      p_charges_detail_rec.return_type IS NOT NULL THEN
14224 
14225      Open c_return_type(p_charges_detail_rec.return_type);
14226       Fetch c_return_type into l_return_type;
14227       If c_return_type%FOUND Then
14228 
14229 	 x_charges_detail_rec.return_type :=  p_charges_detail_rec.return_type;
14230 
14231 	 IF l_line_order_category_code = 'RETURN' THEN
14232 
14233 	    Open c_location_id(x_charges_detail_rec.ship_to_org_id);
14234             Fetch c_location_id into l_location_id;
14235 	    Close c_location_id;
14236 
14237 	     CSP_EXCESS_PARTS_PVT.charges_return_routing(
14238 			    p_return_type       => p_charges_detail_rec.return_type,
14239 			    p_hz_location_id    => l_location_id,
14240 			    p_item_id           => x_charges_detail_rec.inventory_item_id_in,
14241 			    x_organization_id   => x_organization_id,
14242 			    x_subinventory_code => x_subinventory_code,
14243 			    x_hz_location_id    => x_hz_location_id,
14244 			    x_hr_location_id    => x_hr_location_id,
14245 			    x_operating_unit    => x_operating_unit,
14246 			    x_return_status     => l_return_status,
14247 			    x_msg_count         => l_msg_count,
14248 			    x_msg_data          => l_msg_data);
14249 
14250 	     IF x_return_status = 'S' THEN
14251 	        x_charges_detail_rec.transaction_inventory_org := x_organization_id;
14252 	        x_charges_detail_rec.transaction_sub_inventory := x_subinventory_code;
14253 	     END IF;
14254 	 End If;
14255       Else
14256          FND_MESSAGE.Set_Name('CS', 'CS_CHG_INVALID_RETURN_TYPE');
14257          FND_MESSAGE.Set_Token('RETURN_TYPE', p_charges_detail_rec.return_type);
14258          FND_MSG_PUB.Add;
14259          RAISE FND_API.G_EXC_ERROR;
14260       End If;
14261       Close c_return_type;
14262   ELSIF p_charges_detail_rec.return_type  = FND_API.G_MISS_CHAR THEN
14263       x_charges_detail_rec.return_type := l_db_det_rec.return_type;
14264   ELSE
14265       x_charges_detail_rec.return_type := NULL;
14266   END IF;
14267 
14268 END IF;
14269 -- End of 12.1.3 Charges Logistics Project
14270 
14271 
14272 --===================================
14273 -- Validate Order Information
14274 --===================================
14275 --DBMS_OUTPUT.PUT_LINE('Validate Order Information ...');
14276 
14277 IF p_validation_mode = 'I' THEN
14278 
14279   IF x_charges_detail_rec.add_to_order_flag = 'Y' AND
14280      x_charges_detail_rec.interface_to_oe_flag = 'Y' THEN
14281 
14282     IF p_charges_detail_rec.order_header_id IS NULL THEN
14283 
14284       --Charges needs a order number when interfaceing
14285       --to OM if add to order flag = 'Y'
14286 
14287       --RAISE FND_API.G_EXC_ERROR;
14288       --null;
14289       FND_MESSAGE.Set_Name('CS', 'CS_CHG_ORDER_NUMBER_REQUIRED');
14290       FND_MSG_PUB.Add;
14291       RAISE FND_API.G_EXC_ERROR;
14292     ELSE
14293 
14294       -- If order number provided then validate the order
14295 
14296       Validate_Order(
14297         p_api_name           => p_api_name,
14298         p_order_header_id    => p_charges_detail_rec.order_header_id,
14299         --p_org_id           => l_org_id,
14300         p_org_id             => x_charges_detail_rec.org_id,
14301         x_return_status      => l_return_status,
14302         x_msg_count          => l_msg_count,
14303         x_msg_data           => l_msg_data);
14304 
14305       IF l_return_status <> FND_API.G_RET_STS_SUCCESS THEN
14306 
14307         --RAISE FND_API.G_EXC_ERROR ;
14308         FND_MESSAGE.Set_Name('CS', 'CS_CHG_INVALID_ORDER');
14309         FND_MESSAGE.SET_TOKEN('ORDER_HEADER_ID', p_charges_detail_rec.order_header_id);
14310         --FND_MESSAGE.SET_TOKEN('TEXT', l_msg_data, TRUE);
14311         FND_MSG_PUB.Add;
14312         RAISE FND_API.G_EXC_ERROR;
14313       ELSE
14314 
14315         x_charges_detail_rec.order_header_id := p_charges_detail_rec.order_header_id;
14316         x_charges_detail_rec.order_line_id :=  p_charges_detail_rec.order_line_id;
14317 
14318       END IF;
14319 
14320     END IF;
14321 
14322    ELSE
14323 
14324    --If the add_to_order_flag = 'Y' and order is provided
14325 
14326     IF x_charges_detail_rec.add_to_order_flag = 'Y' AND
14327        p_charges_detail_rec.order_header_id IS NOT NULL THEN
14328 
14329       Validate_Order(
14330         p_api_name           => p_api_name,
14331         p_order_header_id    => p_charges_detail_rec.order_header_id,
14332         --p_org_id           => l_org_id,
14333         p_org_id             => x_charges_detail_rec.org_id,
14334         x_return_status      => l_return_status,
14335         x_msg_count          => l_msg_count,
14336         x_msg_data           => l_msg_data);
14337 
14338       IF l_return_status <> FND_API.G_RET_STS_SUCCESS THEN
14339 
14340         --RAISE FND_API.G_EXC_ERROR ;
14341         FND_MESSAGE.Set_Name('CS', 'CS_CHG_INVALID_ORDER');
14342         FND_MESSAGE.SET_TOKEN('ORDER_HEADER_ID', p_charges_detail_rec.order_header_id);
14343         --FND_MESSAGE.SET_TOKEN('TEXT', l_msg_data, TRUE);
14344         FND_MSG_PUB.Add;
14345         RAISE FND_API.G_EXC_ERROR;
14346 
14347       ELSE
14348 
14349          x_charges_detail_rec.order_header_id := p_charges_detail_rec.order_header_id;
14350         x_charges_detail_rec.order_line_id :=  p_charges_detail_rec.order_line_id;
14351 
14352       END IF;
14353 
14354     --In all other cases
14355 
14356     ELSE
14357 
14358       x_charges_detail_rec.order_line_id := NULL;
14359       x_charges_detail_rec.order_header_id := NULL;
14360 
14361     END IF;
14362  END IF;
14363 
14364 ELSIF p_validation_mode = 'U' THEN
14365 
14366  IF l_db_det_rec.order_line_id IS NULL THEN
14367 
14368    IF x_charges_detail_rec.add_to_order_flag = 'Y' AND
14369       x_charges_detail_rec.interface_to_oe_flag = 'Y' THEN
14370 
14371 
14372      IF p_charges_detail_rec.order_header_id <> FND_API.G_MISS_NUM AND
14373         p_charges_detail_rec.order_header_id IS NOT NULL THEN
14374 
14375          Validate_Order(
14376                p_api_name           => p_api_name,
14377                p_order_header_id    => p_charges_detail_rec.order_header_id,
14378                p_org_id             => x_charges_detail_rec.org_id,
14379                x_return_status      => l_return_status,
14380                x_msg_count          => l_msg_count,
14381                x_msg_data           => l_msg_data);
14382 
14383          IF l_return_status <> FND_API.G_RET_STS_SUCCESS THEN
14384            --RAISE FND_API.G_EXC_ERROR ;
14385            FND_MESSAGE.Set_Name('CS', 'CS_CHG_INVALID_ORDER');
14386            FND_MESSAGE.SET_TOKEN('ORDER_HEADER_ID', p_charges_detail_rec.order_header_id);
14387            FND_MSG_PUB.Add;
14388            RAISE FND_API.G_EXC_ERROR;
14389          ELSE
14390             x_charges_detail_rec.order_header_id := p_charges_detail_rec.order_header_id;
14391          END IF;
14392 
14393      ELSIF p_charges_detail_rec.order_header_id = FND_API.G_MISS_NUM THEN
14394        IF  l_db_det_rec.order_header_id IS NOT NULL THEN
14395          x_charges_detail_rec.order_header_id := l_db_det_rec.order_header_id;
14396        ELSE
14397          --order number required
14398          FND_MESSAGE.Set_Name('CS', 'CS_CHG_ORDER_NUMBER_REQUIRED');
14399          FND_MSG_PUB.Add;
14400          RAISE FND_API.G_EXC_ERROR;
14401        END IF;
14402      ELSE
14403        --order number not passed
14404        --order number required
14405        FND_MESSAGE.Set_Name('CS', 'CS_CHG_ORDER_NUMBER_REQUIRED');
14406        FND_MSG_PUB.Add;
14407        RAISE FND_API.G_EXC_ERROR;
14408      END IF;
14409 
14410 
14411    ELSE
14412      --If the add_to_order_flag = 'Y' and order is provided
14413      IF x_charges_detail_rec.add_to_order_flag = 'Y' AND
14414         p_charges_detail_rec.order_header_id <> FND_API.G_MISS_NUM AND
14415         p_charges_detail_rec.order_header_id IS NOT NULL THEN
14416 
14417       Validate_Order(
14418         p_api_name           => p_api_name,
14419         p_order_header_id    => p_charges_detail_rec.order_header_id,
14420         --p_org_id           => l_org_id,
14421         p_org_id             => x_charges_detail_rec.org_id,
14422         x_return_status      => l_return_status,
14423         x_msg_count          => l_msg_count,
14424         x_msg_data           => l_msg_data);
14425 
14426       IF l_return_status <> FND_API.G_RET_STS_SUCCESS THEN
14427 
14428         --RAISE FND_API.G_EXC_ERROR ;
14429         FND_MESSAGE.Set_Name('CS', 'CS_CHG_INVALID_ORDER');
14430         FND_MESSAGE.SET_TOKEN('ORDER_HEADER_ID', p_charges_detail_rec.order_header_id);
14431         --FND_MESSAGE.SET_TOKEN('TEXT', l_msg_data, TRUE);
14432         FND_MSG_PUB.Add;
14433         RAISE FND_API.G_EXC_ERROR;
14434 
14435       ELSE
14436 
14437         x_charges_detail_rec.order_header_id := p_charges_detail_rec.order_header_id;
14438         x_charges_detail_rec.order_line_id :=  p_charges_detail_rec.order_line_id;
14439 
14440       END IF;
14441 
14442      --In all other cases
14443 
14444     ELSE
14445 
14446       x_charges_detail_rec.order_line_id := NULL;
14447       x_charges_detail_rec.order_header_id := NULL;
14448 
14449     END IF;
14450    END IF;
14451  ELSE
14452 
14453    --cannot add to order
14454    --line already interfaced to om
14455    --raise error
14456    FND_MESSAGE.SET_NAME('CS', 'CS_CHG_CANNOT_ADD_CHG_TO_ORDER');
14457    FND_MESSAGE.SET_TOKEN('API_NAME', p_api_name);
14458    FND_MSG_PUB.Add;
14459    RAISE FND_API.G_EXC_ERROR;
14460  END IF;
14461 END IF;
14462 
14463 
14464 --===================================
14465 --Validate Purchase Order Information
14466 --===================================
14467 --DBMS_OUTPUT.PUT_LINE('Validate Purchase Order Information ...');
14468 
14469 IF p_validation_mode = 'I' THEN
14470   IF p_charges_detail_rec.purchase_order_num IS NOT NULL THEN
14471     -- assign to out record
14472     x_charges_detail_rec.purchase_order_num := p_charges_detail_rec.purchase_order_num;
14473   ELSE
14474     IF l_cust_po_number IS NOT NULL THEN
14475       -- assign the customer po number from service
14476       x_charges_detail_rec.purchase_order_num := l_cust_po_number;
14477     ELSE
14478       -- get the po number from contracts of a contract exists
14479       IF l_po_number IS NOT NULL THEN
14480         x_charges_detail_rec.purchase_order_num := l_po_number;
14481       ELSE
14482         x_charges_detail_rec.purchase_order_num := null;
14483       END IF;
14484     END IF;
14485   END IF;
14486 ELSIF p_validation_mode = 'U' THEN
14487   -- bug Fix for Bug # 3084256
14488   IF p_charges_detail_rec.purchase_order_num <> FND_API.G_MISS_CHAR AND
14489      p_charges_detail_rec.purchase_order_num IS NOT NULL THEN
14490      x_charges_detail_rec.purchase_order_num := p_charges_detail_rec.purchase_order_num;
14491   ELSIF
14492      p_charges_detail_rec.purchase_order_num = FND_API.G_MISS_CHAR THEN
14493      x_charges_detail_rec.purchase_order_num := l_db_det_rec.purchase_order_num;
14494   ELSE
14495      --null is passed
14496      x_charges_detail_rec.purchase_order_num := null;
14497   END IF;
14498 END IF;
14499 
14500 
14501 --====================================
14502 --Validate Billing Engine Information
14503 --====================================
14504 --DBMS_OUTPUT.PUT_LINE('Validate Billing Engine Information ...');
14505 
14506 IF p_validation_mode = 'I' THEN
14507 
14508   IF p_charges_detail_rec.generated_by_bca_engine IS NULL THEN
14509     x_charges_detail_rec.generated_by_bca_engine := 'N';
14510   ELSE
14511     x_charges_detail_rec.generated_by_bca_engine := p_charges_detail_rec.generated_by_bca_engine;
14512   END IF;
14513 
14514   x_charges_detail_rec.activity_start_time := p_charges_detail_rec.activity_start_time;
14515   x_charges_detail_rec.activity_end_time := p_charges_detail_rec.activity_end_time;
14516 
14517   --DBMS_OUTPUT.PUT_LINE('Customer Product Id '||x_charges_detail_rec.customer_product_id);
14518 
14519 END IF;
14520 
14521 /* Credit Card 9358401 */
14522     IF (p_validation_mode = 'I') THEN
14523       IF (p_charges_detail_rec.instrument_payment_use_id =FND_API.G_MISS_NUM)       THEN
14524         x_charges_detail_rec.instrument_payment_use_id := NULL;
14525       ELSE
14526         x_charges_detail_rec.instrument_payment_use_id :=
14527 	                          p_charges_detail_rec.instrument_payment_use_id;
14528       END IF;
14529     ELSE /*Update mode */
14530       IF (p_charges_detail_rec.instrument_payment_use_id =FND_API.G_MISS_NUM)
14531 	 THEN
14532         x_charges_detail_rec.instrument_payment_use_id :=
14533 	                                  l_db_det_rec.instrument_payment_use_id;
14534       ELSE
14535         x_charges_detail_rec.instrument_payment_use_id :=
14536 	                          p_charges_detail_rec.instrument_payment_use_id;
14537       END IF;
14538     END IF; /*p_validation_mode*/
14539 
14540      IF x_charges_detail_rec.instrument_payment_use_id is not null then
14541 	  l_credit_status := FALSE;
14542        CS_ServiceRequest_UTIL.validate_credit_card(
14543             p_api_name             => l_api_name,
14544             p_parameter_name       => 'P_INSTRUMENT_PAYMENT_USE_ID',
14545             p_instrument_payment_use_id  =>
14546 		                     x_charges_detail_rec.instrument_payment_use_id,
14547             p_bill_to_acct_id      => x_charges_detail_rec.bill_to_account_id,
14548 		  p_called_from          => p_validation_mode,
14549             x_return_status        => l_return_status);
14550 
14551          IF (l_return_status <> FND_API.G_RET_STS_SUCCESS) THEN
14552                 x_charges_detail_rec.instrument_payment_use_id := NULL;
14553          END IF;
14554      END IF;
14555 
14556        IF (p_validation_mode = 'I' AND
14557             x_charges_detail_rec.instrument_payment_use_id is NULL AND
14558 		  p_charges_detail_rec.instrument_payment_use_id is not null AND
14559             l_credit_status) THEN
14560             BEGIN
14561              SELECT instrument_payment_use_id
14562                INTO x_charges_detail_rec.instrument_payment_use_id
14563                FROM CS_INCIDENTS_ALL_B
14564              WHERE  incident_id = p_charges_detail_rec.incident_id;
14565 
14566             EXCEPTION
14567             WHEN OTHERS THEN
14568              NULL;
14569             END;
14570        END IF;
14571 
14572   --DBMS_OUTPUT.PUT_LINE('ORDER_LINE_ID IS '||x_charges_detail_rec.order_line_id);
14573 
14574 
14575 
14576 
14577 -- 12.2.2 Service Projects Integration project
14578 --project_id
14579   mo_global.set_policy_context('S',x_charges_detail_rec.org_id);
14580    IF (p_validation_mode = 'I') THEN
14581  -- setting charge line's operating unit before executing PA views
14582 
14583 
14584 
14585       IF (p_charges_detail_rec.project_id =FND_API.G_MISS_NUM)       THEN
14586         x_charges_detail_rec.project_id := NULL;
14587       ELSE
14588         x_charges_detail_rec.project_id :=  p_charges_detail_rec.project_id;
14589       END IF;
14590 
14591    ELSE /*Update mode */
14592 
14593   mo_global.set_policy_context('S',x_charges_detail_rec.org_id);
14594 
14595       IF (p_charges_detail_rec.project_id =FND_API.G_MISS_NUM)
14596 	 THEN
14597         x_charges_detail_rec.project_id := l_db_det_rec.project_id;
14598       ELSE
14599         x_charges_detail_rec.project_id := p_charges_detail_rec.project_id;
14600       END IF;
14601 
14602    END IF; /*p_validation_mode*/
14603 
14604    IF x_charges_detail_rec.project_id is not null then
14605        BEGIN
14606           SELECT project_id
14607 	  INTO   x_charges_detail_rec.project_id
14608 	  FROM   PA_PROJECTS_EXPEND_V
14609 	  WHERE  project_id = x_charges_detail_rec.project_id;
14610 
14611 	  If sql%rowcount=0 then
14612 	     x_charges_detail_rec.project_id := null;
14613           End if;
14614        EXCEPTION
14615          When Others then
14616 	 NUll;
14617        END;
14618 
14619   END IF;
14620 
14621 
14622 --project_task_id
14623 
14624  IF (p_validation_mode = 'I') THEN
14625       IF (p_charges_detail_rec.project_task_id =FND_API.G_MISS_NUM)       THEN
14626         x_charges_detail_rec.project_task_id := NULL;
14627       ELSE
14628         x_charges_detail_rec.project_task_id :=  p_charges_detail_rec.project_task_id;
14629       END IF;
14630    ELSE /*Update mode */
14631       IF (p_charges_detail_rec.project_task_id =FND_API.G_MISS_NUM)
14632 	 THEN
14633         x_charges_detail_rec.project_task_id := l_db_det_rec.project_task_id;
14634       ELSE
14635         x_charges_detail_rec.project_task_id := p_charges_detail_rec.project_task_id;
14636       END IF;
14637    END IF; /*p_validation_mode*/
14638 
14639    IF x_charges_detail_rec.project_task_id is not null then
14640        BEGIN
14641           SELECT task_id
14642 	  INTO   x_charges_detail_rec.project_task_id
14643 	  FROM   PA_TASKS_EXPEND_V
14644 	  WHERE  task_id = x_charges_detail_rec.project_task_id;
14645 
14646 	  If sql%rowcount=0 then
14647 	     x_charges_detail_rec.project_task_id := null;
14648           End if;
14649 
14650        EXCEPTION
14651          When Others then
14652 	 NUll;
14653        END;
14654 
14655   END IF;
14656 
14657 
14658   --expenditure_org_id
14659 
14660  IF (p_validation_mode = 'I') THEN
14661 
14662 
14663       IF (p_charges_detail_rec.expenditure_org_id =FND_API.G_MISS_NUM)       THEN
14664         x_charges_detail_rec.expenditure_org_id := NULL;
14665       ELSE
14666         x_charges_detail_rec.expenditure_org_id :=  p_charges_detail_rec.expenditure_org_id;
14667       END IF;
14668    ELSE /*Update mode */
14669       IF (p_charges_detail_rec.expenditure_org_id =FND_API.G_MISS_NUM)
14670 	 THEN
14671         x_charges_detail_rec.expenditure_org_id := l_db_det_rec.expenditure_org_id;
14672       ELSE
14673         x_charges_detail_rec.expenditure_org_id := p_charges_detail_rec.expenditure_org_id;
14674       END IF;
14675    END IF; /*p_validation_mode*/
14676 
14677    IF x_charges_detail_rec.expenditure_org_id is not null then
14678        BEGIN
14679           SELECT organization_id
14680 	  INTO   x_charges_detail_rec.expenditure_org_id
14681 	  FROM   PA_ORGANIZATIONS_EXPEND_V
14682 	  WHERE  organization_id = x_charges_detail_rec.expenditure_org_id;
14683 
14684 	  If sql%rowcount=0 then
14685 	     x_charges_detail_rec.expenditure_org_id := null;
14686           End if;
14687 
14688        EXCEPTION
14689          When Others then
14690 	 NUll;
14691        END;
14692 
14693   END IF;
14694 
14695 
14696   --
14697 -- All the 3 attributes project_id,project_task_id and expenditure_org_id  should be passed , otherwise none of the 3 attrs will be saved
14698 -- A warning will be thrown in the insert charge line flow and in the update flow an error will be thrown and the charge line will not be updated
14699      If x_charges_detail_rec.project_id is not null and  x_charges_detail_rec.project_task_id is null then
14700 
14701 	 x_charges_detail_rec.project_id := null;
14702          x_charges_detail_rec.project_task_id := null;
14703 	 x_charges_detail_rec.expenditure_org_id := null;
14704 
14705         FND_MESSAGE.SET_NAME('CS', 'CS_SR_NO_TASK_NUM');
14706         FND_MESSAGE.SET_TOKEN('API_NAME', p_api_name);
14707         FND_MSG_PUB.Add;
14708 
14709 	IF (p_validation_mode ='U') then
14710            RAISE FND_API.G_EXC_ERROR;
14711 	End if;
14712 
14713 
14714 
14715      Elsif x_charges_detail_rec.project_id is  null and  x_charges_detail_rec.project_task_id is not null then
14716 
14717 	x_charges_detail_rec.project_id := null;
14718         x_charges_detail_rec.project_task_id := null;
14719 	x_charges_detail_rec.expenditure_org_id := null;
14720 
14721         FND_MESSAGE.SET_NAME('CS', 'CS_SR_NO_PROJ_NUM');
14722         FND_MESSAGE.SET_TOKEN('API_NAME', p_api_name);
14723         FND_MSG_PUB.Add;
14724 
14725 	IF (p_validation_mode ='U') then
14726            RAISE FND_API.G_EXC_ERROR;
14727 	End if;
14728 
14729      Elsif x_charges_detail_rec.project_id is not null and  x_charges_detail_rec.project_task_id is not null and
14730         x_charges_detail_rec.expenditure_org_id is null then
14731 
14732 	x_charges_detail_rec.project_id := null;
14733         x_charges_detail_rec.project_task_id := null;
14734 	x_charges_detail_rec.expenditure_org_id := null;
14735 
14736 
14737 	 FND_MESSAGE.SET_NAME('CS', 'CS_SR_NO_EXPENDITURE_ORG');
14738          FND_MESSAGE.SET_TOKEN('API_NAME', p_api_name);
14739 	 FND_MSG_PUB.Add;
14740 
14741 
14742        IF (p_validation_mode ='U') then
14743            RAISE FND_API.G_EXC_ERROR;
14744 	End if;
14745 
14746    Elsif  (x_charges_detail_rec.project_id is  null or  x_charges_detail_rec.project_task_id is null ) and
14747         x_charges_detail_rec.expenditure_org_id is not null then
14748 
14749 	x_charges_detail_rec.project_id := null;
14750         x_charges_detail_rec.project_task_id := null;
14751 	x_charges_detail_rec.expenditure_org_id := null;
14752 
14753 
14754 	 FND_MESSAGE.SET_NAME('CS', 'CS_SR_NO_PROJ_DETAILS');
14755          FND_MESSAGE.SET_TOKEN('API_NAME', p_api_name);
14756 	 FND_MSG_PUB.Add;
14757 
14758 
14759        IF (p_validation_mode ='U') then
14760            RAISE FND_API.G_EXC_ERROR;
14761 	End if;
14762 
14763 
14764      Elsif  ( x_charges_detail_rec.project_id is not null and  x_charges_detail_rec.project_task_id is not null and
14765               x_charges_detail_rec.expenditure_org_id is not null) then -- all the 3 values are passed
14766 
14767 
14768        BEGIN
14769 
14770 	SELECT     pp.project_id,
14771                    pt.task_id ,
14772                    HOU.organization_id
14773         INTO x_charges_detail_rec.project_id ,x_charges_detail_rec.project_task_id ,x_charges_detail_rec.expenditure_org_id
14774         FROM  pa_projects_expend_v pp,
14775               pa_tasks_expend_v pt,
14776                pa_organizations_expend_v hou
14777         WHERE  pp.project_id = pt.project_id
14778         AND pp.project_id = x_charges_detail_rec.project_id
14779         AND pt.task_id = x_charges_detail_rec.project_task_id
14780         AND hou.organization_id =x_charges_detail_rec.expenditure_org_id ;
14781 
14782 
14783 
14784 
14785       EXCEPTION
14786            when no_data_found then
14787 
14788 	     FND_MESSAGE.SET_NAME('CS', 'CS_SR_INVALID_PROJECT_DETAILS');
14789              FND_MESSAGE.SET_TOKEN('API_NAME', p_api_name);
14790 	     FND_MSG_PUB.Add;
14791 
14792 	   /*  x_charges_detail_rec.project_id := null;
14793              x_charges_detail_rec.project_task_id := null;
14794 	     x_charges_detail_rec.expenditure_org_id := null;
14795 	     */
14796 
14797 	     IF (p_validation_mode ='U') then
14798  	        RAISE FND_API.G_EXC_ERROR;
14799 	     End if;
14800 
14801 	   when others  then
14802 	   FND_MESSAGE.SET_NAME('CS', 'CS_SR_INVALID_PROJECT_DETAILS');
14803              FND_MESSAGE.SET_TOKEN('API_NAME', p_api_name);
14804 	     FND_MSG_PUB.Add;
14805 
14806 
14807 	     IF (p_validation_mode ='U') then
14808  	        RAISE FND_API.G_EXC_ERROR;
14809 	     End if;
14810       END;
14811 
14812 	   If x_charges_detail_rec.project_id is null or x_charges_detail_rec.project_task_id is null
14813 	   or x_charges_detail_rec.expenditure_org_id is null then
14814 	     x_charges_detail_rec.project_id :=null;
14815 	     x_charges_detail_rec.project_task_id :=null;
14816 	     x_charges_detail_rec.expenditure_org_id :=null;
14817 
14818              FND_MESSAGE.SET_NAME('CS', 'CS_INC_CLEAR_PROJECT_INFO');
14819              FND_MESSAGE.SET_TOKEN('API_NAME', p_api_name);
14820 	     FND_MSG_PUB.Add;
14821 
14822           End if;
14823      End if; --null checks
14824 
14825 
14826 
14827 -- End if;--validation mode
14828 
14829 
14830 
14831 --=================================
14832 --Assign to out record --
14833 --=================================
14834 
14835    -- Exception Block
14836    EXCEPTION
14837 
14838       WHEN FND_API.G_EXC_ERROR THEN
14839         ROLLBACK TO Validate_Charge_Details_PUB;
14840 
14841         x_return_status := FND_API.G_RET_STS_ERROR;
14842         FND_MSG_PUB.Count_And_Get(
14843           p_count => x_msg_count,
14844           p_data  => x_msg_data,
14845           p_encoded => FND_API.G_FALSE);
14846 
14847       WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
14848         ROLLBACK TO Validate_Charge_Details_PUB;
14849         x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
14850         FND_MSG_PUB.Count_And_Get(
14851           p_count => x_msg_count,
14852           p_data  => x_msg_data,
14853           p_encoded => FND_API.G_FALSE);
14854 
14855   WHEN G_WARNING THEN
14856         ROLLBACK TO Validate_Charge_Details_PUB;
14857         x_return_status := FND_API.G_RET_STS_SUCCESS;
14858         FND_MSG_PUB.Count_And_Get(
14859           p_count => x_msg_count,
14860           p_data  => x_msg_data,
14861           p_encoded => FND_API.G_FALSE);
14862 
14863 
14864       WHEN OTHERS THEN
14865         ROLLBACK TO Validate_Charge_Details_PUB;
14866         FND_MESSAGE.SET_NAME('CS', 'CS_CHG_UNEXPECTED_EXEC_ERRORS');
14867         FND_MESSAGE.SET_TOKEN('ROUTINE', l_api_name);
14868         FND_MESSAGE.SET_TOKEN('SQLERRM', sqlerrm);
14869         FND_MSG_PUB.ADD;
14870         IF FND_MSG_PUB.Check_Msg_Level(FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR) THEN
14871           FND_MSG_PUB.Add_Exc_Msg(G_PKG_NAME,l_api_name);
14872         END IF ;
14873         fnd_msg_pub.count_and_get(
14874            p_count => x_msg_count
14875           ,p_data  => x_msg_data);
14876         x_return_status := FND_API.G_RET_STS_ERROR;
14877 
14878 
14879 
14880 END VALIDATE_CHARGE_DETAILS;
14881 
14882 
14883 --==================================
14884 -- Get Defaults from Service Request
14885 --==================================
14886 
14887 PROCEDURE GET_SR_DEFAULTS(P_API_NAME               IN          VARCHAR2,
14888                           P_INCIDENT_ID            IN          NUMBER,
14889                           X_BUSINESS_PROCESS_ID    OUT NOCOPY  NUMBER,
14890                           X_CUSTOMER_ID            OUT NOCOPY  NUMBER,
14891                           X_CUSTOMER_SITE_ID       OUT NOCOPY  NUMBER,
14892                           X_CUST_PO_NUMBER         OUT NOCOPY  VARCHAR2,
14893                           X_CUSTOMER_PRODUCT_ID    OUT NOCOPY  NUMBER,
14894                           X_SYSTEM_ID              OUT NOCOPY  NUMBER, -- Fix bug
14895                           X_INVENTORY_ITEM_ID      OUT NOCOPY  NUMBER, -- Fix bug
14896                           X_ACCOUNT_ID             OUT NOCOPY  NUMBER,
14897                           X_BILL_TO_PARTY_ID       OUT NOCOPY  NUMBER,
14898                           X_BILL_TO_ACCOUNT_ID     OUT NOCOPY  NUMBER,
14899                           X_BILL_TO_CONTACT_ID     OUT NOCOPY  NUMBER,
14900                           X_BILL_TO_SITE_ID        OUT NOCOPY  NUMBER,
14901                           X_SHIP_TO_PARTY_ID       OUT NOCOPY  NUMBER,
14902                           X_SHIP_TO_ACCOUNT_ID     OUT NOCOPY  NUMBER,
14903                           X_SHIP_TO_CONTACT_ID     OUT NOCOPY  NUMBER,
14904                           X_SHIP_TO_SITE_ID        OUT NOCOPY  NUMBER,
14905                           X_CONTRACT_ID            OUT NOCOPY  NUMBER,
14906                           X_CONTRACT_SERVICE_ID    OUT NOCOPY  NUMBER,
14907                           X_INCIDENT_DATE          OUT NOCOPY  DATE,
14908                           X_CREATION_DATE          OUT NOCOPY  DATE,
14909                           X_MSG_DATA               OUT NOCOPY  VARCHAR2,
14910                           X_MSG_COUNT              OUT NOCOPY  NUMBER,
14911                           X_RETURN_STATUS          OUT NOCOPY  VARCHAR2) IS
14912 
14913 
14914 CURSOR c_incidents_def(p_incident_id IN NUMBER) IS
14915 
14916   SELECT intp.business_process_id,
14917             inc.customer_id,
14918             inc.customer_site_id,
14919             inc.contract_id,
14920             inc.contract_service_id,
14921             inc.customer_po_number,
14922             inc.customer_product_id,
14923             inc.system_id,         -- Fix bug
14924             inc.inventory_item_id, -- Fix bug
14925             inc.account_id,
14926             inc.incident_date,
14927             inc.creation_date,
14928             substr(hza.account_name,1,30),
14929             NVL(inc.bill_to_party_id, -999)  bill_to_party_id,
14930             NVL(inc.ship_to_party_id, -999)  ship_to_party_id,
14931             NVL(inc.bill_to_site_id,-999),bill_to_site_id,
14932             NVL(inc.ship_to_site_id,-999)ship_to_site_id,
14933 	    NVL(inc.bill_to_account_id,-999) bill_to_account_id,
14934 	    NVL(inc.ship_to_account_id,-999) ship_to_account_id,
14935 	    NVL(inc.bill_to_contact_id,-999) bill_to_contact_id,
14936 	    NVL(inc.ship_to_contact_id,-999) ship_to_contact_id,
14937 	    inc.caller_type
14938      FROM   cs_incidents_all_b inc,
14939             CS_INCIDENT_TYPES intp,
14940             CS_BUSINESS_PROCESSES bp,
14941             hz_parties hzp,
14942             hz_cust_accounts hza
14943      WHERE  inc.incident_id = p_incident_id
14944      AND    inc.incident_type_id = intp.incident_type_id
14945      AND    intp.business_process_id = bp.business_process_id
14946      AND    inc.customer_id = hzp.party_id
14947      AND    inc.account_id  = hza.cust_account_id(+);
14948 
14949 
14950 
14951 
14952 BEGIN
14953 
14954   x_return_status :=  FND_API.G_RET_STS_SUCCESS;
14955 
14956   FOR v_incidents_def IN c_incidents_def(p_incident_id) LOOP
14957 
14958     x_business_process_id    :=  v_incidents_def.business_process_id;
14959     x_customer_id            :=  v_incidents_def.customer_id;
14960     x_customer_site_id       :=  v_incidents_def.customer_site_id;
14961     x_cust_po_number         :=  v_incidents_def.customer_po_number;
14962     x_customer_product_id    :=  v_incidents_def.customer_product_id;
14963     x_system_id              :=  v_incidents_def.system_id;
14964     x_inventory_item_id      :=  v_incidents_def.inventory_item_id;
14965     x_account_id             :=  v_incidents_def.account_id;
14966     x_bill_to_party_id       :=  v_incidents_def.bill_to_party_id;
14967     x_bill_to_account_id     :=  v_incidents_def.bill_to_account_id;
14968     x_bill_to_contact_id     :=  v_incidents_def.bill_to_contact_id;
14969     x_bill_to_site_id        :=  v_incidents_def.bill_to_site_id;
14970     x_ship_to_party_id       :=  v_incidents_def.ship_to_party_id;
14971     x_ship_to_account_id     :=  v_incidents_def.ship_to_account_id;
14972     x_ship_to_contact_id     :=  v_incidents_def.ship_to_contact_id;
14973     x_ship_to_site_id        :=  v_incidents_def.ship_to_site_id;
14974     x_contract_id            :=  v_incidents_def.contract_id;
14975     x_contract_service_id    :=  v_incidents_def.contract_service_id;
14976     x_incident_date          :=  v_incidents_def.incident_date;
14977     x_creation_date          :=  v_incidents_def.creation_date;
14978 
14979   END LOOP;
14980 
14981   EXCEPTION
14982 
14983     WHEN OTHERS THEN
14984       x_return_status :=  FND_API.G_RET_STS_ERROR;
14985       fnd_msg_pub.count_and_get(
14986         p_count => x_msg_count,
14987         p_data  => x_msg_data);
14988 
14989 END GET_SR_DEFAULTS;
14990 
14991 --================================
14992 --Validate Transaction Type Id
14993 --================================
14994 PROCEDURE VALIDATE_TXN_TYPE(P_API_NAME                  IN         VARCHAR2,
14995                             P_BUSINESS_PROCESS_ID       IN         NUMBER,
14996                             P_TXN_TYPE_ID               IN         NUMBER,
14997                             P_SOURCE_CODE               IN         VARCHAR2,
14998                             X_LINE_ORDER_CATEGORY_CODE  OUT NOCOPY VARCHAR2,
14999                             X_NO_CHARGE_FLAG            OUT NOCOPY VARCHAR2,
15000                             X_INTERFACE_TO_OE_FLAG      OUT NOCOPY VARCHAR2,
15001                             X_UPDATE_IB_FLAG            OUT NOCOPY VARCHAR2,
15002                             X_SRC_REFERENCE_REQD_FLAG   OUT NOCOPY VARCHAR2,
15003                             X_SRC_RETURN_REQD_FLAG      OUT NOCOPY VARCHAR2,
15004                             X_NON_SRC_REFERENCE_REQD    OUT NOCOPY VARCHAR2,
15005                             X_NON_SRC_RETURN_REQD       OUT NOCOPY VARCHAR2,
15006                             X_MSG_DATA                  OUT NOCOPY VARCHAR2,
15007                             X_MSG_COUNT                 OUT NOCOPY NUMBER,
15008                             X_RETURN_STATUS             OUT NOCOPY VARCHAR2) IS
15009 
15010 Cursor c_txn_type(p_txn_type_id         IN NUMBER,
15011                   p_business_process_id IN NUMBER) IS
15012 SELECT  tt.transaction_type_id,
15013         NVL(citt.src_reference_reqd,'N') src_reference_reqd,
15014         NVL(citt.src_return_reqd,'N') src_return_reqd,
15015         citt.src_change_owner_to_code,
15016         NVL(citt.non_src_reference_reqd,'N') non_src_reference_reqd,
15017         NVL(citt.non_src_return_reqd,'N') non_src_return_reqd,
15018         citt.non_src_change_owner_to_code,
15019         NVL(csit.update_ib_flag,'N') update_ib_flag,
15020         nvl(tt.no_charge_flag, 'N') no_charge_flag,
15021         nvl(tt.interface_to_oe_flag, 'N')interface_to_oe_flag,
15022         tt.line_order_category_code,
15023         ol.meaning line_category_meaning
15024 FROM    CS_TRANSACTION_TYPES_VL  tt,
15025         CS_BUS_PROCESS_TXNS  bt,
15026         csi_ib_txn_types citt,
15027         csi_source_ib_types csit,
15028         CSI_TXN_TYPES ctt,
15029         OE_LOOKUPS ol
15030 WHERE  tt.transaction_type_id = p_txn_type_id
15031   and  bt.business_process_id = p_business_process_id
15032   and  bt.transaction_type_id = tt.transaction_type_id
15033   and  tt.line_order_category_code is not null
15034   and  ol.lookup_code = tt.line_order_category_code
15035   and  ol.lookup_type = 'LINE_CATEGORY'
15036   and  tt.transaction_type_id = citt.cs_transaction_type_id (+)
15037   and nvl(citt.parent_reference_reqd, 'N') = 'N'
15038   and nvl(ctt.source_transaction_type, 'OM_SHIPMENT') =
15039   decode(tt.line_order_category_code, 'ORDER', 'OM_SHIPMENT',
15040   nvl(ctt.source_transaction_type, 'OM_SHIPMENT'))
15041   and nvl(ctt.source_transaction_type, 'RMA_RECEIPT') =
15042   decode(tt.line_order_category_code, 'RETURN', 'RMA_RECEIPT',
15043   nvl(ctt.source_transaction_type, 'RMA_RECEIPT'))
15044   and citt.sub_type_id = csit.sub_type_id (+)
15045   and csit.transaction_type_id = ctt.transaction_type_id (+)
15046   and nvl(ctt.source_application_id, 660) = 660
15047   and trunc(sysdate) between trunc(nvl(bt.start_date_active, sysdate))
15048   and trunc(nvl(bt.end_date_active, sysdate));
15049 
15050 
15051 
15052 
15053 Cursor c_txn_type_sd(p_txn_type_id         IN NUMBER,
15054                      p_business_process_id IN NUMBER) IS
15055 SELECT  tt.transaction_type_id,
15056         nvl(tt.no_charge_flag, 'N') no_charge_flag,
15057         nvl(tt.interface_to_oe_flag, 'N')interface_to_oe_flag,
15058         tt.line_order_category_code,
15059         ol.meaning line_category_meaning
15060 FROM    CS_TRANSACTION_TYPES_VL  tt,
15061         CS_BUS_PROCESS_TXNS  bt,
15062         OE_LOOKUPS ol
15063 WHERE  tt.transaction_type_id = p_txn_type_id
15064   and  bt.business_process_id = p_business_process_id
15065   and  bt.transaction_type_id = tt.transaction_type_id
15066   and  tt.line_order_category_code is not null
15067   and  ol.lookup_code = tt.line_order_category_code
15068   and  ol.lookup_type = 'LINE_CATEGORY'
15069   and trunc(sysdate) between trunc(nvl(bt.start_date_active, sysdate))
15070   and trunc(nvl(bt.end_date_active, sysdate));
15071 
15072   lv_exists_flag VARCHAR2(1) := 'N';
15073 
15074 BEGIN
15075   -- Initialize API return status to success
15076   x_return_status := FND_API.G_RET_STS_SUCCESS;
15077 
15078   --DBMS_OUTPUT.PUT_LINE(' Source Code = :'||p_source_code);
15079 
15080   IF p_source_code <> 'SD' THEN
15081 
15082     FOR v_txn_type IN c_txn_type(p_txn_type_id, p_business_process_id) LOOP
15083       lv_exists_flag := 'Y';
15084 
15085       -- Check with Anu if this logic is OK here
15086       IF v_txn_type.line_order_category_code = 'RETURN' THEN
15087         IF v_txn_type.src_change_owner_to_code = 'E' THEN
15088           --RAISE FND_API.G_EXC_ERROR;
15089           --null;
15090           FND_MESSAGE.Set_Name('CS', 'CS_CHG_INVALID_TXN_TYPE_OWNER');
15091           FND_MESSAGE.SET_TOKEN('TXN_TYPE_ID', p_txn_type_id);
15092           FND_MSG_PUB.Add;
15093           RAISE FND_API.G_EXC_ERROR;
15094         END IF;
15095 
15096       ELSIF v_txn_type.line_order_category_code = 'ORDER' THEN
15097         IF v_txn_type.non_src_change_owner_to_code = 'E' THEN
15098           --RAISE FND_API.G_EXC_ERROR;
15099           --null;
15100           FND_MESSAGE.Set_Name('CS', 'CS_CHG_INVALID_TXN_TYPE_OWNER');
15101           FND_MESSAGE.SET_TOKEN('TXN_TYPE_ID', p_txn_type_id);
15102           FND_MSG_PUB.Add;
15103           RAISE FND_API.G_EXC_ERROR;
15104         END IF;
15105       END IF;
15106 
15107       x_line_order_category_code  := v_txn_type.line_order_category_code;
15108       x_no_charge_flag            := v_txn_type.no_charge_flag;
15109       x_interface_to_oe_flag      := v_txn_type.interface_to_oe_flag;
15110       x_update_ib_flag            := v_txn_type.update_ib_flag;
15111       x_src_reference_reqd_flag   := v_txn_type.src_reference_reqd;
15112       x_src_return_reqd_flag      := v_txn_type.src_return_reqd;
15113       x_non_src_reference_reqd    := v_txn_type.non_src_reference_reqd;
15114       x_non_src_return_reqd       := v_txn_type.non_src_return_reqd;
15115 
15116     END LOOP;
15117 
15118   ELSE
15119 
15120      FOR v_txn_type_sd IN c_txn_type_sd(p_txn_type_id, p_business_process_id) LOOP
15121       lv_exists_flag := 'Y';
15122 
15123       x_line_order_category_code  := v_txn_type_sd.line_order_category_code;
15124       x_no_charge_flag            := v_txn_type_sd.no_charge_flag;
15125       x_interface_to_oe_flag      := v_txn_type_sd.interface_to_oe_flag;
15126      END LOOP;
15127   END IF;
15128 
15129 
15130 
15131   IF lv_exists_flag = 'N' THEN
15132     FND_MESSAGE.Set_Name('CS', 'CS_CHG_INVALID_TXN_TYPE');
15133     FND_MESSAGE.SET_TOKEN('TXN_TYPE_ID', p_txn_type_id);
15134     FND_MESSAGE.SET_TOKEN('BUSINESS_PROCESS_ID', p_business_process_id);
15135     FND_MSG_PUB.Add;
15136 
15137     RAISE FND_API.G_EXC_ERROR;
15138 
15139   END IF;
15140 
15141   EXCEPTION
15142     WHEN FND_API.G_EXC_ERROR THEN
15143       x_return_status := FND_API.G_RET_STS_ERROR;
15144       fnd_msg_pub.count_and_get(
15145       p_count => x_msg_count
15146      ,p_data  => x_msg_data);
15147 
15148 
15149     WHEN OTHERS THEN
15150       x_return_status := FND_API.G_RET_STS_ERROR;
15151       FND_MESSAGE.Set_Name('CS', 'CS_CHG_INVALID_TXN_TYPE');
15152       FND_MESSAGE.SET_TOKEN('TXN_TYPE_ID', p_txn_type_id);
15153       FND_MESSAGE.SET_TOKEN('BUSINESS_PROCESS_ID', p_business_process_id);
15154       FND_MSG_PUB.Add;
15155 
15156       fnd_msg_pub.count_and_get(
15157       p_count => x_msg_count
15158      ,p_data  => x_msg_data);
15159 
15160 
15161 
15162 
15163 END VALIDATE_TXN_TYPE;
15164 
15165 
15166 --=================================
15167 -- Validate Inventory Item ID
15168 --=================================
15169 PROCEDURE VALIDATE_ITEM(P_API_NAME             IN         VARCHAR2,
15170                         P_INV_ID               IN         NUMBER,
15171                         P_UPDATE_IB_FLAG       IN         VARCHAR2,
15172                         X_COMMS_TRACKABLE_FLAG OUT NOCOPY VARCHAR2,
15173                         X_SERIAL_CONTROL_FLAG  OUT NOCOPY VARCHAR2,
15174                         X_REV_CONTROL_FLAG     OUT NOCOPY VARCHAR2,
15175                         X_MSG_DATA             OUT NOCOPY VARCHAR2,
15176                         X_MSG_COUNT            OUT NOCOPY NUMBER,
15177                         X_RETURN_STATUS        OUT NOCOPY VARCHAR2) IS
15178 
15179 Cursor c_get_inv_item(p_inv_id NUMBER) IS
15180 SELECT inventory_item_id,
15181        serial_number_control_code,
15182        revision_qty_control_code,
15183        nvl(comms_nl_trackable_flag, 'N') comms_nl_trackable_flag
15184        -- contract_item_type_code -- Fix for Bug # 3109160
15185  FROM MTL_SYSTEM_ITEMS_KFV
15186 WHERE organization_id = cs_std.get_item_valdn_orgzn_id
15187   AND inventory_item_id = p_inv_id;
15188 
15189 
15190 
15191 lv_exists_flag VARCHAR2(1) := 'N';
15192 
15193 BEGIN
15194 
15195 
15196   -- Initialize API return status to success
15197   x_return_status := FND_API.G_RET_STS_SUCCESS;
15198 
15199   --DBMS_OUTPUT.PUT_LINE('cs_std.get_item_valdn_orgzn_id = ' || cs_std.get_item_valdn_orgzn_id);
15200   --DBMS_OUTPUT.PUT_LINE('p_inv_id = ' || p_inv_id);
15201   --DBMS_OUTPUT.PUT_LINE('p_update_ib_flag = ' || p_update_ib_flag);
15202 
15203 
15204   FOR v_get_inv_item IN c_get_inv_item(p_inv_id) LOOP
15205 
15206     x_comms_trackable_flag := v_get_inv_item.comms_nl_trackable_flag;
15207 
15208       --DBMS_OUTPUT.PUT_LINE('inside loop');
15209       --DBMS_OUTPUT.PUT_LINE('comms_nl_trackable '||v_get_inv_item.comms_nl_trackable_flag);
15210 
15211     --Comment this for bug # 3809160
15212     --
15213 
15214     -- IF NOT (NVL(v_get_inv_item.contract_item_type_code, 'N') = 'N') THEN
15215     -- lv_exists_flag := 'N';
15216     -- --RAISE FND_API.G_EXC_ERROR;
15217     -- FND_MESSAGE.Set_Name('CS', 'CS_CHG_CONTRACT_ITEM_ERROR');
15218     -- FND_MESSAGE.SET_TOKEN('INVENTORY_ITEM_ID', p_inv_id, TRUE);
15219     -- FND_MSG_PUB.Add;
15220     -- RAISE FND_API.G_EXC_ERROR;
15221     -- END IF;
15222 
15223     ------DBMS_OUTPUT.PUT_LINE('v_get_inv_item.contract_item_type_code '||v_get_inv_item.contract_item_type_code);
15224 
15225      -- Indicator If Serial Number Controlled or not
15226     IF v_get_inv_item.serial_number_control_code <> 1 THEN
15227       x_serial_control_flag := 'Y';
15228     ELSE
15229       x_serial_control_flag := 'N';
15230     END IF;
15231 
15232     --DBMS_OUTPUT.PUT_LINE('v_get_inv_item.serial_number_control_code '||v_get_inv_item.serial_number_control_code);
15233 
15234 
15235     -- Indicator If Item Revision Controlled or not
15236     IF v_get_inv_item.revision_qty_control_code <> 1 THEN
15237       x_rev_control_flag := 'Y';
15238     ELSE
15239       x_rev_control_flag := 'N';
15240     END IF;
15241 
15242     lv_exists_flag := 'Y';
15243 
15244   END LOOP;
15245   --DBMS_OUTPUT.PUT_LINE('lv_exists_flag '||lv_exists_flag);
15246 
15247   IF lv_exists_flag = 'N' THEN
15248    -- --DBMS_OUTPUT.PUT_LINE('lv_exists_flag = ' || 'N');
15249     FND_MESSAGE.Set_Name('CS', 'CS_CHG_INVALID_INVENTORY_ITEM');
15250     FND_MESSAGE.SET_TOKEN('INVENTORY_ITEM_ID', p_inv_id);
15251     FND_MSG_PUB.Add;
15252     RAISE FND_API.G_EXC_ERROR;
15253   END IF;
15254 
15255   EXCEPTION
15256 
15257   WHEN FND_API.G_EXC_ERROR  THEN
15258     x_return_status := FND_API.G_RET_STS_ERROR;
15259     fnd_msg_pub.count_and_get(
15260       p_count => x_msg_count
15261      ,p_data  => x_msg_data);
15262 
15263   WHEN OTHERS THEN
15264     x_return_status := FND_API.G_RET_STS_ERROR;
15265     FND_MESSAGE.Set_Name('CS', 'CS_CHG_INVALID_INVENTORY_ITEM');
15266     FND_MESSAGE.SET_TOKEN('INVENTORY_ITEM_ID', p_inv_id);
15267     FND_MSG_PUB.Add;
15268     fnd_msg_pub.count_and_get(
15269       p_count => x_msg_count
15270      ,p_data  => x_msg_data);
15271 
15272 END VALIDATE_ITEM;
15273 
15274 --==============================================
15275 -- Get Item Billing Flag
15276 --==============================================
15277 
15278 PROCEDURE GET_BILLING_FLAG(
15279                  P_API_NAME            IN         VARCHAR2,
15280                  P_INV_ID              IN         NUMBER,
15281                  P_TXN_TYPE_ID         IN         NUMBER,
15282                  X_BILLING_FLAG        OUT NOCOPY VARCHAR2,
15283                  X_MSG_DATA            OUT NOCOPY VARCHAR2,
15284                  X_MSG_COUNT           OUT NOCOPY NUMBER,
15285                  X_RETURN_STATUS       OUT NOCOPY VARCHAR2) IS
15286 
15287 Cursor c_get_billing_flag(p_inv_id IN NUMBER,
15288                           p_txn_type_id IN NUMBER) IS
15289 SELECT bc.billing_category
15290   FROM cs_billing_type_categories bc,
15291   cs_txn_billing_types bt
15292   WHERE sysdate between nvl(bc.start_date_active,sysdate)
15293     AND nvl(bc.end_date_active,sysdate)
15294     AND sysdate between nvl(bt.start_date_active,sysdate)
15295                             AND nvl(bt.end_date_active,sysdate)
15296                             AND bt.billing_type = bc.billing_type
15297                             AND bt.transaction_type_id = p_txn_type_id
15298                             AND bc.billing_type IN (SELECT material_billable_flag
15299                                                       FROM MTL_SYSTEM_ITEMS_KFV
15300                                                      WHERE organization_id = cs_std.get_item_valdn_orgzn_id
15301                                                        AND inventory_item_id = p_inv_id);
15302 
15303 
15304 lv_exists_flag VARCHAR2(1) := 'N';
15305 
15306 BEGIN
15307   -- Initialize API return status to success
15308   x_return_status := FND_API.G_RET_STS_SUCCESS;
15309 
15310  -- --DBMS_OUTPUT.PUT_LINE('p_inv_id = ' || p_inv_id);
15311  -- --DBMS_OUTPUT.PUT_LINE('p_txn_type_id = ' || p_txn_type_id);
15312 
15313   FOR v_get_billing_flag in c_get_billing_flag(p_inv_id, p_txn_type_id) LOOP
15314 
15315     lv_exists_flag := 'Y';
15316     x_billing_flag := v_get_billing_flag.billing_category;
15317 
15318   END LOOP;
15319 
15320   IF lv_exists_flag <> 'Y' THEN
15321     --RAISE FND_API.G_EXC_ERROR;
15322     FND_MESSAGE.Set_Name('CS', 'CS_CHG_ITM_BILL_FLG_NOT_IN_TXN');
15323     FND_MESSAGE.SET_TOKEN('INVENTORY_ITEM_ID', p_inv_id);
15324     FND_MESSAGE.SET_TOKEN('TXN_TYPE_ID', p_txn_type_id);
15325     FND_MSG_PUB.Add;
15326     RAISE FND_API.G_EXC_ERROR;
15327   END IF;
15328 
15329   --DBMS_OUTPUT.PUT_LINE('lv_exists_flag = ' || lv_exists_flag);
15330   --DBMS_OUTPUT.PUT_LINE('x_return_status = ' || x_return_status);
15331 
15332   EXCEPTION
15333 
15334   WHEN FND_API.G_EXC_ERROR  THEN
15335     x_return_status := FND_API.G_RET_STS_ERROR;
15336     fnd_msg_pub.count_and_get(
15337       p_count => x_msg_count
15338      ,p_data  => x_msg_data);
15339 
15340   WHEN OTHERS THEN
15341     x_return_status := FND_API.G_RET_STS_ERROR;
15342     FND_MESSAGE.Set_Name('CS', 'CS_CHG_ITM_BILL_FLG_NOT_IN_TXN');
15343     FND_MESSAGE.SET_TOKEN('INVENTORY_ITEM_ID', p_inv_id);
15344     FND_MESSAGE.SET_TOKEN('TXN_TYPE_ID', p_txn_type_id);
15345     FND_MSG_PUB.Add;
15346     fnd_msg_pub.count_and_get(
15347       p_count => x_msg_count
15348      ,p_data  => x_msg_data);
15349 
15350 END GET_BILLING_FLAG;
15351 
15352 
15353 --=============================================
15354 -- Get Txn Billing Type Id
15355 --=============================================
15356 PROCEDURE GET_TXN_BILLING_TYPE(
15357                  P_API_NAME            IN         VARCHAR2,
15358                  P_INV_ID              IN         NUMBER,
15359                  P_TXN_TYPE_ID         IN         NUMBER,
15360                  X_TXN_BILLING_TYPE_ID OUT NOCOPY NUMBER,
15361                  X_MSG_DATA            OUT NOCOPY VARCHAR2,
15362                  X_MSG_COUNT           OUT NOCOPY NUMBER,
15363                  X_RETURN_STATUS       OUT NOCOPY VARCHAR2) IS
15364 
15365 Cursor c_txn_billing_type(p_inventory_item_id   IN NUMBER,
15366                           p_txn_type_id         IN NUMBER) IS
15367   SELECT ctbt.txn_billing_type_id
15368     FROM mtl_system_items_kfv kfv,
15369          cs_txn_billing_types ctbt
15370    WHERE kfv.inventory_item_id = p_inventory_item_id
15371      AND organization_id = cs_std.get_item_valdn_orgzn_id   --
15372      AND ctbt.transaction_type_id = p_txn_type_id
15373      AND ctbt.billing_type = kfv.material_billable_flag;
15374 
15375   lv_exists_flag VARCHAR2(1) := 'N';
15376 
15377 
15378 BEGIN
15379   -- Initialize API return status to success
15380   x_return_status := FND_API.G_RET_STS_SUCCESS;
15381 
15382   FOR v_txn_billing_type IN c_txn_billing_type(p_inv_id,
15383                 p_txn_type_id) LOOP
15384     x_txn_billing_type_id := v_txn_billing_type.txn_billing_type_id;
15385     lv_exists_flag := 'Y';
15386   END LOOP;
15387 
15388   IF lv_exists_flag <> 'Y' THEN
15389     --RAISE FND_API.G_EXC_ERROR;
15390     --null;
15391     FND_MESSAGE.Set_Name('CS', 'CS_CHG_ITM_BILL_TYP_NOT_IN_TXN');
15392     FND_MESSAGE.SET_TOKEN('INVENTORY_ITEM_ID', p_inv_id);
15393     FND_MESSAGE.SET_TOKEN('TXN_TYPE_ID', p_txn_type_id);
15394     FND_MSG_PUB.Add;
15395     RAISE FND_API.G_EXC_ERROR;
15396   END IF;
15397 
15398   EXCEPTION
15399 
15400   WHEN FND_API.G_EXC_ERROR  THEN
15401     x_return_status := FND_API.G_RET_STS_ERROR;
15402     fnd_msg_pub.count_and_get(
15403       p_count => x_msg_count
15404      ,p_data  => x_msg_data);
15405 
15406   WHEN OTHERS THEN
15407     x_return_status := FND_API.G_RET_STS_ERROR;
15408     FND_MESSAGE.Set_Name('CS', 'CS_CHG_ITM_BILL_TYP_NOT_IN_TXN');
15409     FND_MESSAGE.SET_TOKEN('INVENTORY_ITEM_ID', p_inv_id);
15410     FND_MESSAGE.SET_TOKEN('TXN_TYPE_ID', p_txn_type_id);
15411     FND_MSG_PUB.Add;
15412     fnd_msg_pub.count_and_get(
15413       p_count => x_msg_count
15414      ,p_data  => x_msg_data);
15415 
15416 END GET_TXN_BILLING_TYPE;
15417 
15418 
15419 --==============================================
15420 -- Get Unit Of Measure
15421 --==============================================
15422 
15423 PROCEDURE GET_UOM(P_INV_ID            IN NUMBER,
15424                   X_TBL_UOM           OUT NOCOPY TBL_UOM,
15425                   X_MSG_DATA          OUT NOCOPY VARCHAR2,
15426                   X_MSG_COUNT         OUT NOCOPY NUMBER,
15427                   X_RETURN_STATUS     OUT NOCOPY VARCHAR2) IS
15428 
15429 
15430 Cursor c_uom(p_inv_id IN NUMBER) IS
15431 SELECT   uom_code
15432   FROM   MTL_ITEM_UOMS_VIEW
15433   WHERE  inventory_item_id = P_INV_ID AND
15434          organization_id = cs_std.get_item_valdn_orgzn_id;
15435 
15436 i NUMBER := 0;
15437 
15438 BEGIN
15439   -- Initialize API return status to success
15440   x_return_status := FND_API.G_RET_STS_SUCCESS;
15441 
15442   FOR v_uom IN c_uom(p_inv_id) LOOP
15443     i := i + 1;
15444     X_TBL_UOM(i).unit_of_measure := v_uom.uom_code;
15445   END LOOP;
15446 
15447   EXCEPTION
15448 
15449   WHEN OTHERS THEN
15450     x_return_status := FND_API.G_RET_STS_ERROR;
15451     FND_MESSAGE.Set_Name('CS', 'CS_CHG_GET_UOM_FAILED');
15452     FND_MESSAGE.SET_TOKEN('INVENTORY_ITEM_ID', p_inv_id);
15453     FND_MESSAGE.SET_TOKEN('ORGANIZATION_ID', cs_std.get_item_valdn_orgzn_id);
15454     FND_MSG_PUB.Add;
15455     fnd_msg_pub.count_and_get(
15456       p_count => x_msg_count
15457      ,p_data  => x_msg_data);
15458 
15459 END GET_UOM;
15460 
15461 
15462 --================================================
15463 -- Get Primary Unit of Measure
15464 --================================================
15465 
15466 PROCEDURE GET_PRIMARY_UOM(P_INV_ID            IN NUMBER,
15467                           X_PRIMARY_UOM       OUT NOCOPY VARCHAR2,
15468                           X_MSG_DATA          OUT NOCOPY VARCHAR2,
15469                           X_MSG_COUNT         OUT NOCOPY NUMBER,
15470                           X_RETURN_STATUS     OUT NOCOPY VARCHAR2)
15471 IS
15472 
15473 Cursor c_primary_uom(p_inv_id IN NUMBER) IS
15474  SELECT mum.uom_code
15475   FROM  mtl_system_items_b msi,
15476         MTL_UNITS_OF_MEASURE_TL mum
15477  WHERE msi.PRIMARY_UNIT_OF_MEASURE = mum.unit_of_measure
15478    AND msi.INVENTORY_ITEM_ID = P_INV_ID
15479    AND msi.organization_id = cs_std.get_item_valdn_orgzn_id;
15480 
15481 lv_exists_flag VARCHAR2(1) := 'N';
15482 BEGIN
15483   -- Initialize API return status to success
15484   x_return_status := FND_API.G_RET_STS_SUCCESS;
15485 
15486   FOR v_primary_uom IN c_primary_uom(p_inv_id) LOOP
15487     lv_exists_flag := 'Y';
15488     x_primary_uom := v_primary_uom.uom_code;
15489   END LOOP;
15490 
15491   IF lv_exists_flag = 'N' THEN
15492     --RAISE FND_API.G_EXC_ERROR;
15493     --null;
15494     FND_MESSAGE.Set_Name('CS', 'CS_CHG_GET_UOM_FAILED');
15495     FND_MESSAGE.SET_TOKEN('INVENTORY_ITEM_ID', p_inv_id);
15496     FND_MESSAGE.SET_TOKEN('ORGANIZATION_ID', cs_std.get_item_valdn_orgzn_id);
15497     FND_MSG_PUB.Add;
15498     RAISE FND_API.G_EXC_ERROR;
15499   END IF;
15500 
15501   EXCEPTION
15502 
15503   WHEN FND_API.G_EXC_ERROR THEN
15504     x_return_status := FND_API.G_RET_STS_ERROR;
15505     fnd_msg_pub.count_and_get(
15506       p_count => x_msg_count
15507      ,p_data  => x_msg_data);
15508 
15509   WHEN OTHERS THEN
15510     x_return_status := FND_API.G_RET_STS_ERROR;
15511     FND_MESSAGE.Set_Name('CS', 'CS_CHG_GET_UOM_FAILED');
15512     FND_MESSAGE.SET_TOKEN('INVENTORY_ITEM_ID', p_inv_id);
15513     FND_MESSAGE.SET_TOKEN('ORGANIZATION_ID', cs_std.get_item_valdn_orgzn_id);
15514     FND_MSG_PUB.Add;
15515     fnd_msg_pub.count_and_get(
15516       p_count => x_msg_count
15517      ,p_data  => x_msg_data);
15518 
15519 END GET_PRIMARY_UOM;
15520 
15521 --================================================
15522 -- Validate Source Code and Source Id being passed
15523 --===============================================
15524 PROCEDURE VALIDATE_SOURCE(
15525                 P_API_NAME          IN   VARCHAR2,
15526                 P_SOURCE_CODE       IN   VARCHAR2,
15527                 P_SOURCE_ID         IN   NUMBER,
15528                 P_ORG_ID            IN   NUMBER,
15529                 X_SOURCE_ID         OUT NOCOPY   NUMBER,
15530                 X_MSG_DATA          OUT NOCOPY VARCHAR2,
15531                 X_MSG_COUNT         OUT NOCOPY NUMBER,
15532                 X_RETURN_STATUS     OUT NOCOPY   VARCHAR2)  IS
15533 
15534 Cursor c_val_sr_source(p_source_id IN NUMBER) IS
15535 
15536 -- Bug Fix for Bug # 3044488
15537 SELECT incident_id
15538   FROM CS_INCIDENTS_ALL_b
15539  WHERE incident_id = p_source_id;
15540    --AND org_id = p_org_id;
15541 
15542 Cursor c_val_dr_source(p_source_id IN NUMBER) IS
15543 SELECT repair_line_id
15544   FROM CSD_REPAIRS
15545  WHERE repair_line_id = p_source_id;
15546 
15547 Cursor c_val_sd_source(p_source_id IN NUMBER) IS
15548 --SELECT debrief_header_id
15549 --  FROM csf_debrief_headers
15550 -- WHERE debrief_header_id = p_source_id ;
15551 SELECT debrief_line_id
15552   FROM csf_debrief_lines
15553  WHERE debrief_line_id = p_source_id;
15554 
15555 lv_exists_flag  VARCHAR2(1) := 'N';
15556 
15557 --DEBUG
15558 l_ERRM VARCHAR2(100);
15559 
15560 BEGIN
15561 -- Initialize API return status to success
15562   x_return_status := FND_API.G_RET_STS_SUCCESS;
15563 
15564   --DBMS_OUTPUT.PUT_LINE('p_source_code  = ' || p_source_code);
15565   --DBMS_OUTPUT.PUT_LINE('p_source_id  = ' || p_source_id);
15566   --DBMS_OUTPUT.PUT_LINE('p_org_id  = ' || p_org_id);
15567 
15568   IF p_source_code = 'SR' THEN
15569 
15570     IF  p_source_id IS NOT NULL THEN
15571       FOR v_val_sr_source IN c_val_sr_source(p_source_id) LOOP
15572         lv_exists_flag := 'Y';
15573         x_source_id := p_source_id;
15574       END LOOP;
15575 
15576       IF lv_exists_flag <> 'Y' THEN
15577         --RAISE FND_API.G_EXC_ERROR;
15578         --null;
15579         FND_MESSAGE.Set_Name('CS', 'CS_CHG_INVALID_SOURCE');
15580         FND_MESSAGE.SET_TOKEN('SOURCE_CODE', p_source_code);
15581         FND_MESSAGE.SET_TOKEN('SOURCE_ID', p_source_id);
15582         FND_MSG_PUB.Add;
15583         RAISE FND_API.G_EXC_ERROR;
15584       END IF;
15585 
15586     ELSE
15587       -- source_id cannot be cannot be null
15588       Add_Null_Parameter_Msg(p_api_name, 'p_source_id');
15589       RAISE FND_API.G_EXC_ERROR;
15590     END IF ;
15591 
15592   ELSIF p_source_code = 'DR' THEN
15593     IF  p_source_id  IS NOT NULL  THEN
15594       FOR v_val_dr_source IN c_val_dr_source(p_source_id) LOOP
15595         lv_exists_flag := 'Y';
15596         x_source_id := p_source_id;
15597       END LOOP;
15598 
15599       IF lv_exists_flag <> 'Y' THEN
15600         --RAISE FND_API.G_EXC_ERROR;
15601         --null;
15602         FND_MESSAGE.Set_Name('CS', 'CS_CHG_INVALID_SOURCE');
15603         FND_MESSAGE.SET_TOKEN('SOURCE_CODE', p_source_code);
15604         FND_MESSAGE.SET_TOKEN('SOURCE_ID', p_source_id);
15605         FND_MSG_PUB.Add;
15606         RAISE FND_API.G_EXC_ERROR;
15607       END IF;
15608 
15609     ELSE
15610       -- source_id cannot be cannot be null
15611       Add_Null_Parameter_Msg(p_api_name, 'p_source_id');
15612       RAISE FND_API.G_EXC_ERROR;
15613     END IF ;
15614 
15615   ELSIF p_source_code = 'SD' THEN
15616     IF  p_source_id  IS NOT NULL  THEN
15617       FOR v_val_dr_source IN c_val_sd_source(p_source_id) LOOP
15618         lv_exists_flag := 'Y';
15619         x_source_id := p_source_id;
15620       END LOOP;
15621 
15622       IF lv_exists_flag <> 'Y' THEN
15623         --RAISE FND_API.G_EXC_ERROR;
15624         --null;
15625         FND_MESSAGE.Set_Name('CS', 'CS_CHG_INVALID_SOURCE');
15626         FND_MESSAGE.SET_TOKEN('SOURCE_CODE', p_source_code);
15627         FND_MESSAGE.SET_TOKEN('SOURCE_ID', p_source_id);
15628         FND_MSG_PUB.Add;
15629         RAISE FND_API.G_EXC_ERROR;
15630       END IF;
15631 
15632     ELSE
15633       -- raise error as source_id cannot be cannot be null
15634       Add_Null_Parameter_Msg(p_api_name, 'p_source_id');
15635       RAISE FND_API.G_EXC_ERROR;
15636     END IF ;
15637 
15638   ELSIF p_source_code = 'SD' THEN
15639     IF  p_source_id  IS NOT NULL  THEN
15640       FOR v_val_sd_source IN c_val_sd_source(p_source_id) LOOP
15641 
15642         lv_exists_flag := 'Y';
15643         x_source_id := p_source_id;
15644       END LOOP;
15645 
15646       IF lv_exists_flag <> 'Y' THEN
15647         --RAISE FND_API.G_EXC_ERROR;
15648         --null;
15649         FND_MESSAGE.Set_Name('CS', 'CS_CHG_INVALID_SOURCE');
15650         FND_MESSAGE.SET_TOKEN('SOURCE_CODE', p_source_code);
15651         FND_MESSAGE.SET_TOKEN('SOURCE_ID', p_source_id);
15652         FND_MSG_PUB.Add;
15653         RAISE FND_API.G_EXC_ERROR;
15654       END IF;
15655     ELSE
15656       -- cannot be null
15657       Add_Null_Parameter_Msg(p_api_name, 'p_source_id');
15658       RAISE FND_API.G_EXC_ERROR;
15659     END IF ;
15660 
15661   ELSE
15662     --Invalid source code passed. Raise an exception
15663     Add_Invalid_Argument_Msg(
15664       p_token_an => p_api_name,
15665       p_token_v  => p_source_code,
15666       p_token_p  => 'p_source_code');
15667 
15668     RAISE FND_API.G_EXC_ERROR;
15669   END IF ;
15670 
15671   EXCEPTION
15672 
15673   WHEN FND_API.G_EXC_ERROR THEN
15674     x_return_status := FND_API.G_RET_STS_ERROR;
15675     fnd_msg_pub.count_and_get(
15676       p_count => x_msg_count
15677      ,p_data  => x_msg_data);
15678 
15679   WHEN NO_DATA_FOUND THEN
15680     x_return_status := FND_API.G_RET_STS_ERROR;
15681     IF  p_source_id IS NOT NULL THEN
15682       Add_Invalid_Argument_Msg(p_token_an => p_api_name,
15683         p_token_v  => p_source_id,
15684         p_token_p  => 'p_source_id');
15685     END IF ;
15686 
15687   WHEN OTHERS THEN
15688     --l_ERRM := SQLERRM;
15689     --DBMS_OUTPUT.PUT_LINE('Others Validate Source ' ||l_errm);
15690     --x_return_status := FND_API.G_RET_STS_ERROR ;
15691     x_return_status := FND_API.G_RET_STS_ERROR;
15692     FND_MESSAGE.Set_Name('CS', 'CS_CHG_INVALID_SOURCE');
15693     FND_MESSAGE.SET_TOKEN('SOURCE_CODE', p_source_code);
15694     FND_MESSAGE.SET_TOKEN('SOURCE_ID', p_source_id);
15695     FND_MSG_PUB.Add;
15696     fnd_msg_pub.count_and_get(
15697       p_count => x_msg_count
15698      ,p_data  => x_msg_data);
15699 
15700 END  Validate_Source;
15701 
15702 --===========================================================
15703 -- Get Site Id
15704 --==========================================================
15705 
15706 PROCEDURE GET_SITE_FOR_PARTY(P_API_NAME          IN         VARCHAR2,
15707                              P_SITE_USE_ID       IN         NUMBER,
15708                              P_PARTY_ID          IN         NUMBER,
15709                              P_VAL_MODE          IN         VARCHAR2,
15710                              X_SITE_ID           OUT NOCOPY NUMBER,
15711                              X_RETURN_STATUS     OUT NOCOPY VARCHAR2) IS
15712 
15713 CURSOR c_bill_to_party_site(P_SITE_USE_ID IN NUMBER,
15714                             P_PARTY_ID    IN NUMBER) IS
15715 SELECT site_use.party_site_id
15716   FROM  HZ_PARTY_SITE_USES site_use,
15717         HZ_PARTY_SITES site,
15718         HZ_PARTIES party
15719  WHERE  site_use.party_site_use_id = p_site_use_id
15720    AND  party.party_id = p_party_id
15721    AND  nvl(site_use.status,'A') = 'A'
15722    AND  site_use.site_use_type = 'BILL_TO'
15723    AND  site_use.party_site_id = site.party_site_id
15724    AND  site.party_id   = party.party_id;
15725 
15726 CURSOR c_ship_to_party_site(p_site_use_id IN NUMBER,
15727                             p_party_id    IN NUMBER) IS
15728 SELECT site_use.party_site_id
15729   FROM  HZ_PARTY_SITE_USES site_use,
15730         HZ_PARTY_SITES site,
15731         HZ_PARTIES party
15732  WHERE  site_use.party_site_use_id = p_site_use_id
15733    AND  party.party_id = p_party_id
15734    AND  nvl(site_use.status,'A') = 'A'
15735    AND  site_use.site_use_type = 'SHIP_TO'
15736    AND  site_use.party_site_id = site.party_site_id
15737    AND  site.party_id   = party.party_id;
15738 
15739 lv_exists_flag VARCHAR2(1) := 'N';
15740 BEGIN
15741 
15742    x_return_status :=  FND_API.G_RET_STS_SUCCESS;
15743    IF p_val_mode = 'BILL_TO' THEN
15744      FOR v_bill_to_party_site IN c_bill_to_party_site(p_site_use_id, p_party_id) LOOP
15745        lv_exists_flag := 'Y';
15746        x_site_id := v_bill_to_party_site.party_site_id;
15747      END LOOP;
15748    ELSE
15749       --p_val_mode = 'SHIP_TO'
15750       FOR v_ship_to_party_site IN c_ship_to_party_site(p_site_use_id, p_party_id) LOOP
15751        lv_exists_flag := 'Y';
15752        x_site_id := v_ship_to_party_site.party_site_id;
15753      END LOOP;
15754    END IF;
15755 
15756    IF lv_exists_flag = 'N' THEN
15757      --RAISE FND_API.G_EXC_ERROR;
15758      --null;
15759      FND_MESSAGE.Set_Name('CS', 'CS_CHG_NO_SITE_FOUND');
15760      FND_MESSAGE.SET_TOKEN('PARTY_ID', p_party_id);
15761      FND_MESSAGE.SET_TOKEN('SITE_USE_ID', p_site_use_id);
15762      FND_MSG_PUB.Add;
15763      RAISE FND_API.G_EXC_ERROR;
15764    END IF;
15765 
15766   EXCEPTION
15767 
15768   WHEN FND_API.G_EXC_ERROR THEN
15769     x_return_status := FND_API.G_RET_STS_ERROR;
15770 
15771   WHEN OTHERS THEN
15772     x_return_status := FND_API.G_RET_STS_ERROR;
15773     FND_MESSAGE.Set_Name('CS', 'CS_CHG_NO_SITE_FOUND');
15774     FND_MESSAGE.SET_TOKEN('PARTY_ID', p_party_id);
15775     FND_MESSAGE.SET_TOKEN('SITE_USE_ID', p_site_use_id);
15776     FND_MSG_PUB.Add;
15777 
15778 END get_site_for_party;
15779 
15780 
15781 --============================================================
15782 -- Get Price List for Contract
15783 --============================================================
15784 PROCEDURE GET_CONTRACT_PRICE_LIST(
15785                 p_api_name               IN         VARCHAR2,
15786                 p_business_process_id    IN         NUMBER,
15787                 p_request_date           IN         DATE,
15788                 p_contract_line_id       IN         NUMBER,
15789                 --p_coverage_id            IN         NUMBER,
15790                 x_price_list_id          OUT NOCOPY NUMBER,
15791                 x_currency_code          OUT NOCOPY VARCHAR2,
15792                 x_msg_data               OUT NOCOPY VARCHAR2,
15793                 x_msg_count              OUT NOCOPY NUMBER,
15794                 x_return_status          OUT NOCOPY VARCHAR2) IS
15795 
15796 
15797 
15798 --Added to get the currency_code for the price list header id
15799 --Fixed Bug # 3546804
15800 Cursor get_currency_code(p_price_list_id NUMBER) IS
15801   select currency_code
15802     from qp_price_lists_v
15803    where price_list_id = p_price_list_id;
15804 
15805 --Added to get the currency_code for the price list header id
15806 --Fixed Bug # 3546804
15807 l_pricing_tbl      OKS_CON_COVERAGE_PUB.pricing_tbl_type ;
15808 l_index           BINARY_INTEGER;
15809 
15810 
15811 
15812 BEGIN
15813 
15814   x_return_status := FND_API.G_RET_STS_SUCCESS;
15815 
15816   --Changed the functionality to resolve bug # 3546804
15817 
15818   IF p_business_process_id IS NOT NULL AND
15819      p_request_date IS NOT NULL AND
15820      p_contract_line_id IS NOT NULL THEN
15821 
15822 
15823        --Call the OKC API
15824        OKS_CON_COVERAGE_PUB.get_bp_pricelist
15825                          (p_api_version         => 1.0
15826                          ,p_init_msg_list       => 'T'
15827                          ,p_Contract_line_id    => p_contract_line_id
15828                          ,p_business_process_id => p_business_process_id
15829                          ,p_request_date        => p_request_date
15830                          ,x_return_status       => x_return_status
15831                          ,x_msg_count           => x_msg_count
15832                          ,x_msg_data            => x_msg_data
15833                          ,x_pricing_tbl         => l_pricing_tbl);
15834 
15835         l_index := l_pricing_tbl.FIRST;
15836 
15837         FOR l_temp IN 1..l_pricing_tbl.COUNT LOOP
15838           --get the Business Process Price List ID
15839           x_price_list_id := l_pricing_tbl(l_index).BP_Price_list_id;
15840 
15841           --get the currency_code for the same
15842           OPEN get_currency_code(x_price_list_id);
15843           FETCH get_currency_code INTO x_currency_code;
15844           CLOSE get_currency_code;
15845 
15846           EXIT WHEN l_index = l_pricing_tbl.FIRST ;
15847         END LOOP;
15848   ELSE
15849     -- p_business_process_id or p_request_date is null
15850     -- default the contract price list and currency code to null
15851     -- as this cannot be derived
15852     x_price_list_id := null;
15853     x_currency_code := null;
15854   END IF;
15855 
15856   EXCEPTION
15857 
15858   WHEN OTHERS THEN
15859     x_return_status := FND_API.G_RET_STS_ERROR;
15860     FND_MESSAGE.SET_NAME('CS', 'CS_CHG_UNEXPECTED_EXEC_ERRORS');
15861      FND_MESSAGE.SET_TOKEN('ROUTINE', p_api_name);
15862      FND_MESSAGE.SET_TOKEN('SQLERRM', sqlerrm);
15863      FND_MSG_PUB.ADD;
15864      fnd_msg_pub.count_and_get(
15865             p_count => x_msg_count
15866            ,p_data  => x_msg_data);
15867 
15868 END get_contract_price_list;
15869 
15870 --===========================================================
15871 -- Get Currency Code for Price List
15872 --===========================================================
15873 
15874 PROCEDURE  GET_CURRENCY_CODE(
15875                 p_api_name        IN         VARCHAR2,
15876                 p_price_list_id   IN         NUMBER ,
15877                 x_currency_code   OUT NOCOPY VARCHAR2,
15878                 x_msg_data        OUT NOCOPY VARCHAR2,
15879                 x_msg_count       OUT NOCOPY NUMBER,
15880                 x_return_status   OUT NOCOPY VARCHAR2)
15881 IS
15882 
15883 Cursor c_currency_code(p_price_list_id NUMBER) IS
15884 SELECT currency_code
15885 FROM   qp_price_lists_v
15886 WHERE  price_list_id = p_price_list_id;
15887 
15888 lv_exists_flag VARCHAR2(1) := 'N';
15889 BEGIN
15890   x_return_status := FND_API.G_RET_STS_SUCCESS;
15891 
15892   IF p_price_list_id IS NOT NULL THEN
15893     FOR v_currency_code IN c_currency_code(p_price_list_id) LOOP
15894       --assign currency_code to out record
15895       x_currency_code := v_currency_code.currency_code;
15896       lv_exists_flag := 'Y';
15897     END LOOP;
15898 
15899     IF lv_exists_flag <> 'Y' THEN
15900       --RAISE FND_API.G_EXC_ERROR;
15901       --null;
15902       FND_MESSAGE.Set_Name('CS', 'CS_CHG_GET_CURRENCY_FAILED');
15903       FND_MESSAGE.SET_TOKEN('PRICE_LIST_ID', p_price_list_id);
15904       FND_MSG_PUB.Add;
15905       RAISE FND_API.G_EXC_ERROR;
15906     END IF;
15907   ELSE
15908     --price list id is null
15909     -- this should never happen
15910     --RAISE FND_API.G_EXC_ERROR;
15911     --null;
15912     Add_Null_Parameter_Msg(p_api_name, 'p_price_list_id');
15913     RAISE FND_API.G_EXC_ERROR;
15914   END IF;
15915 
15916   EXCEPTION
15917 
15918   WHEN FND_API.G_EXC_ERROR THEN
15919     x_return_status := FND_API.G_RET_STS_ERROR;
15920     fnd_msg_pub.count_and_get(
15921       p_count => x_msg_count
15922      ,p_data  => x_msg_data);
15923 
15924   WHEN OTHERS THEN
15925     x_return_status := FND_API.G_RET_STS_ERROR;
15926     FND_MESSAGE.Set_Name('CS', 'CS_CHG_GET_CURRENCY_FAILED');
15927     FND_MESSAGE.SET_TOKEN('PRICE_LIST_ID', p_price_list_id);
15928     FND_MSG_PUB.Add;
15929     fnd_msg_pub.count_and_get(
15930       p_count => x_msg_count
15931      ,p_data  => x_msg_data);
15932 
15933 END get_currency_code;
15934 
15935 --============================================================
15936 -- Get_Conversion_Rate - To get the conversion rate
15937 --=============================================================
15938 
15939  PROCEDURE  Get_Conversion_Rate
15940                    ( p_api_name       IN VARCHAR2,
15941                      p_from_currency  IN  VARCHAR2,
15942                      p_to_currency    IN  VARCHAR2,
15943                      x_denominator    OUT NOCOPY NUMBER,
15944                      x_numerator      OUT NOCOPY NUMBER,
15945                      x_rate           OUT NOCOPY NUMBER,
15946                      x_return_status  OUT NOCOPY VARCHAR) IS
15947 
15948   l_api_name  VARCHAR2(80)                   :=  'CS_Charge_Details_PVT.Get_Conversion_Rate';
15949   l_api_name_full  CONSTANT  VARCHAR2(100)    := G_PKG_NAME || '.' || l_api_name ;
15950   l_log_module     CONSTANT VARCHAR2(255)    := 'cs.plsql.' || l_api_name_full || '.';
15951   l_conversion_type VARCHAR2(30) :=   FND_PROFILE.VALUE('CS_CHG_DEFAULT_CONVERSION_TYPE');
15952   l_max_roll_days   NUMBER       :=   to_number(FND_PROFILE.VALUE('CS_CHG_MAX_ROLL_DAYS'));
15953   lx_numerator       NUMBER;
15954   lx_denominator     NUMBER;
15955   lx_rate            NUMBER;
15956 
15957   BEGIN
15958 
15959     -- Initialize Return Status to SUCCESS
15960     x_return_status := FND_API.G_RET_STS_SUCCESS;
15961 
15962     --DBMS_OUTPUT.PUT_LINE('Conversion Type is '||l_conversion_type);
15963     --DBMS_OUTPUT.PUT_LINE('l_max_roll_days '||l_max_roll_days);
15964 
15965       IF FND_LOG.level_procedure >= FND_LOG.g_current_runtime_level
15966       THEN
15967 	FND_LOG.String
15968 	( FND_LOG.level_procedure , L_LOG_MODULE || ''
15969 	, 'The Value of profile CS_CHG_DEFAULT_CONVERSION_TYPE :' || l_conversion_type
15970 	);
15971 	FND_LOG.String
15972 	( FND_LOG.level_procedure , L_LOG_MODULE || ''
15973 	, 'The Value of profile CS_CHG_MAX_ROLL_DAYS :' || l_max_roll_days
15974 	);
15975       END IF;
15976 
15977    IF p_from_currency IS NULL THEN
15978      -- return error
15979      FND_MESSAGE.SET_NAME('CS', 'CS_CHG_UNDEFINED_CONV_CURRENCY');
15980      FND_MESSAGE.SET_TOKEN('API_NAME', p_api_name);
15981      FND_MESSAGE.SET_TOKEN('FROM_CURRENCY', p_from_currency);
15982      FND_MESSAGE.SET_TOKEN('TO_CURRENCY', p_to_currency);
15983      FND_MSG_PUB.add;
15984      RAISE FND_API.g_exc_error;
15985    END IF;
15986 
15987    IF p_to_currency IS NULL THEN
15988      -- return error
15989      FND_MESSAGE.SET_NAME('CS', 'CS_CHG_UNDEFINED_CONV_CURRENCY');
15990      FND_MESSAGE.SET_TOKEN('API_NAME', p_api_name);
15991      FND_MESSAGE.SET_TOKEN('FROM_CURRENCY', p_from_currency);
15992      FND_MESSAGE.SET_TOKEN('TO_CURRENCY', p_to_currency);
15993      FND_MSG_PUB.add;
15994      RAISE FND_API.g_exc_error;
15995    END IF;
15996 
15997    IF ((l_conversion_type IS NULL) OR
15998        (l_max_roll_days IS NULL)) THEN
15999      -- return error
16000      FND_MESSAGE.SET_NAME('CS', 'CS_CHG_UNDEFINED_CONV_PROFILES');
16001      FND_MESSAGE.SET_TOKEN('API_NAME', p_api_name);
16002      FND_MESSAGE.SET_TOKEN('PROFILE1', 'CS_CHG_DEFAULT_CONVERSION_TYPE');
16003      FND_MESSAGE.SET_TOKEN('PROFILE2', 'CS_CHG_MAX_ROLL_DAYS');
16004      FND_MSG_PUB.add;
16005      RAISE FND_API.g_exc_error;
16006    END IF;
16007 
16008 
16009    IF  ((l_conversion_type IS NOT NULL) AND
16010         (l_max_roll_days IS NOT NULL)) THEN
16011             gl_currency_api.get_closest_triangulation_rate (
16012                 x_from_currency      => p_from_currency,
16013                 x_to_currency        => p_to_currency,
16014                 x_conversion_date    => SYSDATE,
16015                 x_conversion_type    => l_conversion_type,
16016                 x_max_roll_days      => l_max_roll_days,
16017                 x_denominator        => lx_denominator,
16018                 x_numerator          => lx_numerator,
16019                 x_rate               => lx_rate );
16020 
16021      IF lx_rate IS NULL THEN
16022        --RAISE FND_API.g_exc_error;
16023        FND_MESSAGE.SET_NAME('CS', 'CS_CHG_CONV_RATE_NOT_FOUND');
16024        FND_MESSAGE.SET_TOKEN('API_NAME', p_api_name);
16025        FND_MESSAGE.SET_TOKEN('FROM_CURRENCY', p_from_currency);
16026        FND_MESSAGE.SET_TOKEN('TO_CURRENCY', p_to_currency);
16027        FND_MESSAGE.SET_TOKEN('CONV_DATE', sysdate);
16028        FND_MSG_PUB.add;
16029        RAISE FND_API.g_exc_error;
16030      ELSE
16031        x_denominator := lx_denominator;
16032        x_numerator   := lx_numerator;
16033        x_rate        := lx_rate;
16034      END IF;
16035   END IF;
16036 
16037   EXCEPTION
16038 
16039     WHEN FND_API.g_exc_error THEN
16040       x_return_status := fnd_api.g_ret_sts_error;
16041 
16042     WHEN OTHERS THEN
16043       x_return_status := FND_API.G_RET_STS_ERROR;
16044       FND_MESSAGE.SET_NAME('CS', 'CS_CHG_CONV_RATE_NOT_FOUND');
16045       FND_MESSAGE.SET_TOKEN('API_NAME', p_api_name);
16046       FND_MESSAGE.SET_TOKEN('FROM_CURRENCY', p_from_currency);
16047       FND_MESSAGE.SET_TOKEN('TO_CURRENCY', p_to_currency);
16048       FND_MESSAGE.SET_TOKEN('CONV_DATE', sysdate);
16049       FND_MSG_PUB.add;
16050 
16051 END Get_Conversion_Rate;
16052 
16053 --============================================================
16054 -- Get Contracts - Contracts information for Contract Service ID
16055 --============================================================
16056 
16057 PROCEDURE GET_CONTRACT(
16058                   p_api_name               IN VARCHAR2,
16059                   p_contract_SR_ID         IN NUMBER,
16060                   p_incident_date          IN DATE,
16061                   p_creation_date          IN DATE,
16062                   p_customer_id            IN NUMBER,
16063                   p_cust_account_id        IN NUMBER,
16064                   p_cust_product_id        IN NUMBER,
16065                   p_system_id              IN NUMBER DEFAULT NULL,   -- Fix bug
16066                   p_inventory_item_id      IN NUMBER DEFAULT NULL,   -- Fix bug
16067                   p_business_process_id    IN NUMBER,
16068                   x_contract_id            OUT NOCOPY NUMBER,
16069                   x_po_number              OUT NOCOPY VARCHAR2,
16070                   x_return_status          OUT NOCOPY VARCHAR2,
16071                   x_msg_count              OUT NOCOPY NUMBER,
16072                   x_msg_data               OUT NOCOPY VARCHAR2) IS
16073 
16074 --Changed to Fix Bug # 3419211
16075 Cursor Con_Coverage(p_service_line_id number,p_business_process_id number) IS
16076  SELECT     cov.contract_id
16077             --cov.coverage_line_id,
16078             --cov.coverage_name,
16079             --ent.txn_group_id
16080    FROM     oks_ent_line_details_v cov,
16081             oks_ent_txn_groups_v ent
16082   WHERE     cov.service_line_id = p_service_line_id
16083     AND     cov.coverage_line_id = ent.coverage_id
16084     AND     ent.business_process_id = p_business_process_id;
16085 
16086  TYPE T_CHCONCOVTAB IS TABLE OF Con_Coverage%rowtype
16087      INDEX BY BINARY_INTEGER;
16088 
16089  CHCONCOVTAB T_CHCONCOVTAB;
16090 
16091 
16092 
16093 l_count          NUMBER := 0;
16094 l_record_count   NUMBER := 0;
16095 k                NUMBER := 0;
16096 l_ent_contracts OKS_ENTITLEMENTS_PUB.GET_CONTOP_TBL;
16097 l_request_date   DATE;
16098 
16099 l_Service_PO_required VARCHAR2(30);
16100 l_result  VARCHAR2(1);
16101 l_return_status VARCHAR2(1);
16102 l_service_po VARCHAR2(30);
16103 
16104 
16105 
16106 BEGIN
16107 
16108  --Fixed Bug # 3480770
16109  -- Initiate contract value.
16110  x_contract_id := null;
16111  --x_coverage_id := null;
16112  --x_coverage_txn_group_id := null;
16113  x_po_number := null;
16114 
16115 -- derive the request date which will be passed to the
16116 -- CS_EST_APPLY_Contract_Pkg.Get_Contract_lines API
16117 -- if p_incident_date is null then use p_creation_date
16118 
16119 IF p_incident_date IS NOT NULL THEN
16120   l_request_date := p_incident_date;
16121 ELSE
16122   l_request_date := p_creation_date;
16123 END IF;
16124 
16125 
16126   --Changed to Fix Bug # 3419211
16127   IF p_contract_sr_id IS NOT NULL AND
16128      p_business_process_id IS NOT NULL THEN
16129 
16130       OPEN Con_Coverage(p_contract_sr_id, p_business_process_id);
16131       FETCH Con_Coverage
16132       INTO  CHCONCOVTAB(k);
16133       --Fixed Bug # 3480770
16134       IF Con_Coverage%FOUND THEN
16135         x_contract_id := CHCONCOVTAB(k).contract_id;
16136         --x_coverage_id := CHCONCOVTAB(k).coverage_line_id;
16137         --x_coverage_txn_group_id := CHCONCOVTAB(k).TXN_GROUP_ID;
16138       END IF;
16139       CLOSE Con_Coverage;
16140 
16141 
16142       --DBMS_OUTPUT.PUT_LINE('Calling PO Cursor');
16143 
16144       IF x_contract_id IS NOT NULL THEN
16145         -- call the Contracts API to get the PO NUmber
16146         OKS_ENTITLEMENTS_PVT.Get_Service_PO(
16147           P_Chr_Id               => x_contract_id,
16148           P_Set_ExcepionStack    => 'F',
16149           X_Service_PO           => l_service_po,
16150           X_Service_PO_required  => l_Service_po_required,
16151           X_Result               => l_result,
16152           X_Return_Status        => l_return_status);
16153 
16154         --DBMS_OUTPUT.PUT_LINE('l_return_status'||l_return_status);
16155 
16156         IF l_return_status  = 'S' THEN
16157           x_po_number := l_service_po;
16158         ELSIF l_return_status  IN ('E', 'U') THEN
16159           x_po_number := null;
16160         END IF;
16161       END IF;
16162   ELSE
16163     --RAISE FND_API.G_EXC_ERROR;
16164     --null;
16165     FND_MESSAGE.SET_NAME('CS', 'CS_CHG_GET_CONTRACT_ERROR');
16166     FND_MESSAGE.SET_TOKEN('API_NAME', p_api_name);
16167     FND_MESSAGE.SET_TOKEN('CONTRACT_SERVICE_LINE_ID', p_contract_sr_id);
16168     FND_MESSAGE.SET_TOKEN('BUSINESS_PROCESS_ID', p_business_process_id);
16169     FND_MSG_PUB.add;
16170     RAISE FND_API.g_exc_error;
16171   END IF;
16172 
16173   EXCEPTION
16174 
16175     WHEN FND_API.g_exc_error THEN
16176       x_return_status := fnd_api.g_ret_sts_error;
16177       fnd_msg_pub.count_and_get(
16178         p_count => x_msg_count
16179        ,p_data  => x_msg_data);
16180 
16181 END get_contract;
16182 
16183 --=============================================================
16184 -- Get Charge Detail Record
16185 --=============================================================
16186 
16187 PROCEDURE GET_CHARGE_DETAIL_REC(
16188              P_API_NAME               IN         VARCHAR2,
16189              P_ESTIMATE_DETAIL_ID     IN         NUMBER,
16190              x_CHARGE_DETAIL_REC      OUT NOCOPY CS_ESTIMATE_DETAILS%ROWTYPE ,
16191              x_MSG_DATA               OUT NOCOPY VARCHAR2,
16192              x_MSG_COUNT              OUT NOCOPY NUMBER,
16193              x_RETURN_STATUS          OUT NOCOPY VARCHAR2) IS
16194 BEGIN
16195 
16196   --DBMS_OUTPUT.PUT_LINE('In GET_CHARGE_DETAIL_REC .....');
16197 
16198   -- Initialize the  p_return_status  to TRUE
16199          --p_return_status :=  FND_API.G_RET_STS_SUCCESS ;
16200   x_return_status :=  FND_API.G_RET_STS_SUCCESS ;
16201 
16202                  SELECT *
16203                  INTO x_charge_detail_rec
16204                  FROM CS_ESTIMATE_DETAILS
16205                  WHERE ESTIMATE_DETAIL_ID = p_estimate_detail_id
16206                  FOR UPDATE OF  ESTIMATE_DETAIL_ID NOWAIT ;
16207 
16208  EXCEPTION
16209         WHEN NO_DATA_FOUND THEN
16210          CS_Charge_Details_PVT.Add_Invalid_Argument_Msg(
16211                          p_token_an  =>  p_api_name,
16212                          p_token_v   =>  to_char(p_estimate_detail_id) ,
16213                          p_token_p   =>  'p_estimate_detail_id') ;
16214         fnd_msg_pub.count_and_get(
16215           p_count => x_msg_count
16216          ,p_data  => x_msg_data);
16217 
16218         WHEN RECORD_LOCK_EXCEPTION THEN
16219              --p_return_status := FND_API.G_RET_STS_ERROR ;
16220              x_return_status := FND_API.G_RET_STS_ERROR ;
16221              CS_Charge_Details_PVT.Record_Is_Locked_Msg(
16222                              p_token_an => p_api_name);
16223 
16224     WHEN OTHERS THEN
16225       x_return_status := FND_API.G_RET_STS_ERROR;
16226       FND_MESSAGE.SET_NAME('CS', 'CS_CHG_GET_CHARGE_FAILED');
16227       FND_MESSAGE.SET_TOKEN('API_NAME', p_api_name);
16228       FND_MESSAGE.SET_TOKEN('ESTIMATE_DETAIL_ID', p_estimate_detail_id);
16229       FND_MSG_PUB.add;
16230       fnd_msg_pub.count_and_get(
16231         p_count => x_msg_count
16232        ,p_data  => x_msg_data);
16233 
16234 END;
16235 
16236 
16237 --=============================================================
16238 --Do_Txns_Exist -- Can This be a function instead of a procedure
16239 --============================================================
16240 PROCEDURE Do_Txns_Exist(
16241                p_api_name             IN          VARCHAR2,
16242                p_estimate_detail_id   IN          NUMBER ,
16243                x_order_line_id        OUT NOCOPY  NUMBER,
16244                x_gen_bca_flag         OUT NOCOPY  VARCHAR2,
16245                x_charge_line_type     OUT NOCOPY  VARCHAR2,
16246                x_return_status        OUT NOCOPY  VARCHAR2)  AS
16247 BEGIN
16248       --p_return_status :=  FND_API.G_RET_STS_SUCCESS ;
16249       x_return_status :=  FND_API.G_RET_STS_SUCCESS;
16250         SELECT order_line_id,
16251                GENERATED_BY_BCA_ENGINE_FLAG,
16252                Charge_line_type
16253         INTO   x_order_line_id,
16254                x_gen_bca_flag,
16255                x_charge_line_type
16256         FROM   CS_ESTIMATE_DETAILS
16257         WHERE  estimate_detail_id = p_estimate_detail_id
16258         FOR UPDATE OF ESTIMATE_DETAIL_ID NOWAIT ;
16259 
16260 
16261 EXCEPTION
16262         WHEN NO_DATA_FOUND THEN
16263              --p_return_status :=  FND_API.G_RET_STS_ERROR ;
16264              x_return_status :=  FND_API.G_RET_STS_ERROR ;
16265              Add_Invalid_Argument_Msg(p_token_an => p_api_name,
16266                   p_token_v => to_char(p_estimate_detail_id) ,
16267                   p_token_p => 'estimate_detail_id' ) ;
16268 
16269         WHEN RECORD_LOCK_EXCEPTION THEN
16270              --p_return_status := FND_API.G_RET_STS_ERROR ;
16271              x_return_status := FND_API.G_RET_STS_ERROR ;
16272              Record_Is_Locked_Msg(p_token_an => p_api_name);
16273 
16274         WHEN OTHERS THEN
16275              --p_return_status :=  FND_API.G_RET_STS_ERROR ;
16276              x_return_status :=  FND_API.G_RET_STS_ERROR ;
16277 
16278 END Do_Txns_Exist ;
16279 
16280 
16281 --=================================
16282 -- Validate Org Id
16283 --================================
16284 
16285 PROCEDURE VALIDATE_ORG_ID(
16286                   P_API_NAME       IN VARCHAR2,
16287                   P_ORG_ID         IN NUMBER,
16288                   X_RETURN_STATUS  OUT NOCOPY VARCHAR2,
16289                   X_MSG_COUNT      OUT NOCOPY NUMBER,
16290                   X_MSG_DATA       OUT NOCOPY VARCHAR2)
16291 
16292 IS
16293 
16294   Cursor c_org_id IS
16295   SELECT organization_id
16296     FROM hr_operating_units
16297    WHERE organization_id = p_org_id;
16298 --12.2 charges log shachoud : start
16299 
16300   /* cursor c_org_id_moac IS
16301    SELECT   organization_id
16302 	FROM     hr_operating_units
16303 	WHERE organization_id = p_org_id and
16304 	mo_global.check_access(organization_id) = 'Y'; */
16305 
16306 --12.2 charges log shachoud  : end
16307 
16308 
16309 
16310 lv_exists_flag VARCHAR2(1) := 'N';
16311 
16312 BEGIN
16313 
16314 If Nvl(fnd_profile.value('CS_SR_RESTRICT_OPERATING_UNIT'),'N') = 'N' then
16315      FOR v_org_id IN c_org_id
16316      LOOP
16317        lv_exists_flag := 'Y';
16318      END LOOP;
16319 
16320      IF lv_exists_flag = 'Y' THEN
16321           x_return_status :=  FND_API.G_RET_STS_SUCCESS ;
16322      ELSE
16323            raise NO_DATA_FOUND;
16324      END IF;
16325 else
16326      /*FOR v_org_id IN c_org_id_moac
16327      LOOP
16328        lv_exists_flag := 'Y';
16329      END LOOP;
16330 
16331      IF lv_exists_flag = 'Y' THEN
16332           x_return_status :=  FND_API.G_RET_STS_SUCCESS ;
16333      ELSE
16334            raise NO_DATA_FOUND;
16335      END IF;*/
16336 
16337      IF (MO_GLOBAL.check_valid_org(p_org_id) ='N') THEN            -- Bug 10359327
16338            raise NO_DATA_FOUND;
16339      else
16340           x_return_status :=  FND_API.G_RET_STS_SUCCESS ;
16341      End if;
16342 end if;
16343 
16344 
16345 
16346 EXCEPTION
16347 
16348   WHEN NO_DATA_FOUND THEN
16349          CS_Charge_Details_PVT.Add_Invalid_Argument_Msg(
16350                          p_token_an  =>  p_api_name,
16351                          p_token_v   =>  to_char(p_org_id) ,
16352                          p_token_p   =>  'p_org_id') ;
16353 
16354          fnd_msg_pub.count_and_get(
16355            p_count => x_msg_count
16356           ,p_data  => x_msg_data);
16357 
16358 	  x_return_status :=  FND_API.G_RET_STS_ERROR ;   -- Bug 10359327
16359 
16360 
16361   WHEN OTHERS THEN
16362          x_return_status :=  FND_API.G_RET_STS_ERROR ;
16363 
16364 END VALIDATE_ORG_ID;
16365 
16366 
16367 --==================================
16368 -- Add_Invalid_Argument_Msg
16369 --==================================
16370 
16371 PROCEDURE Add_Invalid_Argument_Msg
16372 ( p_token_an	VARCHAR2,
16373   p_token_v	VARCHAR2,
16374   p_token_p	VARCHAR2
16375 )
16376 IS
16377 
16378 BEGIN
16379 
16380   IF FND_MSG_PUB.Check_Msg_Level(FND_MSG_PUB.G_MSG_LVL_ERROR) THEN
16381     FND_MESSAGE.Set_Name('CS', 'CS_API_ALL_INVALID_ARGUMENT');
16382     FND_MESSAGE.Set_Token('API_NAME', p_token_an);
16383     FND_MESSAGE.Set_Token('VALUE', p_token_v);
16384     FND_MESSAGE.Set_Token('PARAMETER', p_token_p);
16385     FND_MSG_PUB.Add;
16386 
16387   END IF;
16388 
16389 END Add_Invalid_Argument_Msg;
16390 
16391 
16392 --====================================
16393 -- Add_Null_Parameter_Msg
16394 --====================================
16395 
16396 PROCEDURE Add_Null_Parameter_Msg
16397 ( p_token_an	VARCHAR2,
16398   p_token_np	VARCHAR2
16399 )
16400 IS
16401 
16402 BEGIN
16403 
16404   IF FND_MSG_PUB.Check_Msg_Level(FND_MSG_PUB.G_MSG_LVL_ERROR) THEN
16405 
16406     FND_MESSAGE.Set_Name('CS', 'CS_API_ALL_NULL_PARAMETER');
16407     FND_MESSAGE.Set_Token('API_NAME', p_token_an);
16408     FND_MESSAGE.Set_Token('NULL_PARAM', p_token_np);
16409     FND_MSG_PUB.Add;
16410 
16411   END IF;
16412 
16413 END Add_Null_Parameter_Msg;
16414 
16415 --============================
16416 --Cannot_Delete_Line_Msg
16417 --============================
16418 PROCEDURE Cannot_Delete_Line_Msg
16419 ( p_token_an    IN      VARCHAR2
16420 )
16421 IS
16422 BEGIN
16423     FND_MESSAGE.Set_Name('CS', 'CS_API_CHG_CANT_DELETE_DET');
16424     FND_MESSAGE.Set_Token('API_NAME', p_token_an);
16425     FND_MSG_PUB.Add;
16426 END;
16427 
16428 
16429 --============================
16430 --
16431 --============================
16432 PROCEDURE Cant_Update_Detail_Param_Msg
16433 ( p_token_an            IN      VARCHAR2,
16434   p_token_cn            IN      VARCHAR2,
16435   p_token_v             IN      VARCHAR2
16436 ) IS
16437 BEGIN
16438     FND_MESSAGE.Set_Name('CS', 'CS_API_CHG_CANT_UPD_DET_PARAM');
16439     FND_MESSAGE.Set_Token('API_NAME', p_token_an);
16440     FND_MESSAGE.Set_Token('COLUMN_NAME', p_token_cn);
16441     FND_MESSAGE.Set_Token('VALUE', p_token_v);
16442     FND_MSG_PUB.Add;
16443 END;
16444 
16445 
16446 
16447 --=============================
16448 -- Record_Is_Locked_msg
16449 --=============================
16450 
16451 PROCEDURE Record_Is_Locked_Msg
16452 ( p_token_an	VARCHAR2
16453 )
16454 IS
16455 
16456 BEGIN
16457 
16458     FND_MESSAGE.Set_Name('CS', 'CS_API_ALL_CANT_LOCK_RECORD');
16459     FND_MESSAGE.Set_Token('API_NAME', p_token_an);
16460     FND_MSG_PUB.Add;
16461 END Record_IS_Locked_Msg;
16462 
16463 
16464 PROCEDURE Validate_Who_Info(
16465                  P_API_NAME                  IN            VARCHAR2,
16466                  P_USER_ID                   IN            NUMBER,
16467                  P_LOGIN_ID                  IN            NUMBER,
16468                  X_RETURN_STATUS             OUT NOCOPY    VARCHAR2) IS
16469 
16470   CURSOR c_user IS
16471   SELECT 1
16472   FROM   fnd_user
16473   WHERE  user_id = p_user_id
16474   AND    TRUNC(SYSDATE) <= start_date
16475   AND    NVL(end_date, SYSDATE) >= SYSDATE;
16476 
16477   CURSOR c_login IS
16478   SELECT 1
16479   FROM   fnd_logins
16480   WHERE  login_id = p_login_id
16481   AND    user_id = p_user_id;
16482 
16483   l_dummy  VARCHAR2(1);
16484 
16485 BEGIN
16486 
16487    x_return_status :=  FND_API.G_RET_STS_SUCCESS;
16488 
16489    BEGIN
16490       IF p_user_id = -1 then
16491          SELECT 'x' into l_dummy
16492          FROM    fnd_user
16493          WHERE   user_id = p_user_id;
16494       ELSE
16495          SELECT 'x' into l_dummy
16496          FROM    fnd_user
16497          WHERE   user_id = p_user_id
16498          AND trunc(sysdate) BETWEEN trunc(nvl(start_date, sysdate))
16499          AND trunc(nvl(end_date, sysdate));
16500       END IF;
16501 
16502       EXCEPTION
16503       WHEN NO_DATA_FOUND THEN
16504          x_return_status := FND_API.G_RET_STS_ERROR;
16505          Add_Invalid_Argument_Msg(p_token_an => p_api_name,
16506                                   p_token_v  => TO_CHAR(p_user_id),
16507                                   p_token_p  => 'p_user_id');
16508       return;
16509    END;
16510 
16511    IF p_login_id is not null then
16512    BEGIN
16513       SELECT 'x' into l_dummy
16514       FROM       fnd_logins
16515       WHERE   login_id = p_login_id
16516       AND        user_id  = p_user_id;
16517 
16518       EXCEPTION
16519       WHEN NO_DATA_FOUND THEN
16520          x_return_status := FND_API.G_RET_STS_ERROR;
16521          Add_Invalid_Argument_Msg(p_token_an => p_api_name,
16522                                   p_token_v  => TO_CHAR(p_login_id),
16523                                   p_token_p  => 'p_user_login');
16524    END;
16525    END IF;
16526 
16527 END Validate_Who_Info;
16528 
16529 -- Get line type id.
16530 --Fixed Bug # 3325667 added p_org_id to procedure get_line_type
16531 Procedure Get_Line_Type(p_api_name              IN VARCHAR2,
16532                         p_txn_billing_type_id   IN  NUMBER,
16533                         p_org_id                IN  NUMBER,
16534                         x_line_type_id          OUT NOCOPY  NUMBER,
16535                         x_return_status         OUT NOCOPY VARCHAR2,
16536                         x_msg_count             OUT NOCOPY NUMBER,
16537                         x_msg_data              OUT NOCOPY VARCHAR2) IS
16538 
16539 --Fixed Bug # 3325667 added p_org_id to procedure get_line_type
16540 CURSOR get_line_type_csr IS
16541    select tb.line_type_id
16542    from cs_txn_billing_oetxn_all tb, cs_txn_billing_types tt
16543    where tb.txn_billing_type_id = p_txn_billing_type_id
16544    and tb.txn_billing_type_id = tt.txn_billing_type_id and
16545    tb.org_id = p_org_id;
16546 
16547 BEGIN
16548    --DBMS_OUTPUT.PUT_LINE('p_txn_billing_type_id = ' || p_txn_billing_type_id);
16549 
16550    x_return_status :=  FND_API.G_RET_STS_SUCCESS;
16551    x_line_type_id := null;
16552 
16553    OPEN get_line_type_csr;
16554    FETCH get_line_type_csr
16555    INTO x_line_type_id;
16556    IF get_line_type_csr%NOTFOUND THEN
16557       CLOSE get_line_type_csr;
16558       FND_MESSAGE.SET_NAME('CS', 'CS_CHG_LINE_TYPE_NOT_FOUND');
16559       FND_MESSAGE.SET_TOKEN('TXN_BILLING_TYPE_ID', p_txn_billing_type_id);
16560       FND_MSG_PUB.ADD;
16561       RAISE FND_API.g_exc_error;
16562    END IF;
16563    CLOSE get_line_type_csr;
16564    --DBMS_OUTPUT.PUT_LINE('x_return_status = ' || x_return_status);
16565 
16566    -- Exception Block
16567    EXCEPTION
16568       WHEN FND_API.g_exc_error THEN
16569         x_return_status := fnd_api.g_ret_sts_error;
16570         fnd_msg_pub.count_and_get(
16571           p_count => x_msg_count
16572          ,p_data  => x_msg_data);
16573       WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
16574          x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
16575          fnd_msg_pub.count_and_get(
16576             p_count   => x_msg_count
16577            ,p_data    => x_msg_data);
16578       WHEN OTHERS THEN
16579          x_return_status := FND_API.G_RET_STS_ERROR;
16580          FND_MESSAGE.SET_NAME('CS', 'CS_CHG_UNEXPECTED_EXEC_ERRORS');
16581          FND_MESSAGE.SET_TOKEN('ROUTINE', p_api_name);
16582          FND_MESSAGE.SET_TOKEN('SQLERRM', sqlerrm);
16583          FND_MSG_PUB.ADD;
16584          fnd_msg_pub.count_and_get(
16585             p_count => x_msg_count
16586            ,p_data  => x_msg_data);
16587 
16588 END Get_Line_Type;
16589 
16590 --==================================================
16591 -- GET_CHARGE_FLAGS_FROM_SR
16592 --==================================================
16593 
16594 --Bug Fix for Bug # 3086455
16595 PROCEDURE get_charge_flags_from_sr(p_api_name                IN          VARCHAR2,
16596                                    p_incident_id             IN          NUMBER,
16597                                    x_disallow_new_charge     OUT NOCOPY  VARCHAR2,
16598                                    x_disallow_charge_update  OUT NOCOPY  VARCHAR2,
16599                                    x_msg_data                OUT NOCOPY  VARCHAR2,
16600                                    x_msg_count               OUT NOCOPY  NUMBER,
16601                                    x_return_status           OUT NOCOPY  NUMBER
16602                                    )IS
16603 
16604 cursor c_charge_flags(p_incident_id IN NUMBER)IS
16605 select nvl(csinst.disallow_new_charge, 'N'),
16606        nvl(csinst.disallow_charge_update, 'N')
16607  from cs_incident_statuses csinst,
16608       cs_incidents_all csinall
16609  where csinst.incident_status_id = csinall.incident_status_id
16610  and   csinall.incident_id = p_incident_id;
16611 
16612 
16613 BEGIN
16614 
16615   OPEN c_charge_flags(p_incident_id);
16616    FETCH c_charge_flags
16617    INTO x_disallow_new_charge, x_disallow_charge_update;
16618    IF c_charge_flags%NOTFOUND THEN
16619       CLOSE c_charge_flags;
16620         --Add null argument error
16621         Add_Invalid_Argument_Msg(p_token_an => p_api_name,
16622                                   p_token_v  => TO_CHAR(p_incident_id),
16623                                   p_token_p  => 'p_incident_id');
16624         RAISE FND_API.G_EXC_ERROR;
16625    END IF;
16626    CLOSE c_charge_flags;
16627  END;
16628 
16629 
16630 --========================
16631 --CHARGE FLAG
16632 --========================
16633 
16634 --added by bkanimoz on 15-dec-2007
16635 
16636 PROCEDURE  get_charge_flag_from_sac
16637                             (p_api_name                IN  VARCHAR2,
16638                              p_txn_type_id             IN  NUMBER,
16639                              x_create_charge_flag      OUT NOCOPY  VARCHAR2,
16640 			     x_msg_data                OUT NOCOPY  VARCHAR2,
16641                              x_msg_count               OUT NOCOPY  NUMBER,
16642                              x_return_status           OUT NOCOPY  NUMBER
16643                              )IS
16644 
16645 cursor c_create_charge_flag ( p_txn_type_id IN NUMBER)IS
16646 select nvl(ctt.create_charge_flag, 'Y')
16647 from   cs_transaction_types_b  ctt
16648 where transaction_type_id= p_txn_type_id ;
16649 
16650 
16651 BEGIN
16652 
16653   OPEN c_create_charge_flag(p_txn_type_id);
16654    FETCH c_create_charge_flag
16655    INTO x_create_charge_flag;
16656    IF c_create_charge_flag%NOTFOUND THEN
16657       CLOSE c_create_charge_flag;
16658         --Add null argument error
16659         Add_Invalid_Argument_Msg(p_token_an => p_api_name,
16660                                   p_token_v  => TO_CHAR(p_txn_type_id),
16661                                   p_token_p  => 'p_txn_type_id');
16662         RAISE FND_API.G_EXC_ERROR;
16663    END IF;
16664    CLOSE c_create_charge_flag;
16665 
16666 END;
16667 
16668 
16669 
16670 
16671 --========================
16672 -- VALIDATE_ORDER
16673 --========================
16674 
16675 PROCEDURE Validate_Order(p_api_name              IN VARCHAR2,
16676                          p_order_header_id       IN NUMBER,
16677                          p_org_id                IN NUMBER,
16678                          x_return_status         OUT NOCOPY VARCHAR2,
16679                          x_msg_count             OUT NOCOPY NUMBER,
16680                          x_msg_data              OUT NOCOPY VARCHAR2) IS
16681 
16682 CURSOR order_csr IS
16683    SELECT header_id,
16684           open_flag
16685      FROM OE_ORDER_HEADERS_ALL ooha,
16686           HZ_CUST_ACCOUNTS acct,
16687           HZ_PARTIES hp
16688     WHERE ooha.sold_to_org_id = acct.cust_account_id
16689     AND   acct.party_id       = hp.party_id
16690     AND   ooha.header_id      = p_order_header_id
16691     AND   ooha.org_id         = p_org_id;
16692 
16693 l_order_header_id   NUMBER;
16694 l_open_flag       VARCHAR2(1);
16695 
16696 BEGIN
16697    -- Initialize Return Status to SUCCESS
16698    x_return_status := FND_API.G_RET_STS_SUCCESS;
16699 
16700    OPEN order_csr;
16701    FETCH order_csr
16702    INTO l_order_header_id, l_open_flag;
16703    IF order_csr%NOTFOUND THEN
16704       CLOSE order_csr;
16705         FND_MESSAGE.Set_Name('CS', 'CS_CHG_INVALID_ORDER');
16706         FND_MESSAGE.SET_TOKEN('ORDER_HEADER_ID', p_order_header_id);
16707         FND_MSG_PUB.Add;
16708         RAISE FND_API.G_EXC_ERROR;
16709    END IF;
16710    CLOSE order_csr;
16711 
16712    --Bug Fix for Bug # 3085106
16713 
16714    IF l_open_flag = 'N' THEN
16715      FND_MESSAGE.Set_Name('CS', 'CS_CHG_CANNOT_ADD_TO_ORDER');
16716      FND_MESSAGE.Set_token('API_NAME', p_api_name);
16717      FND_MESSAGE.SET_TOKEN('ORDER_HEADER_ID', p_order_header_id);
16718      FND_MSG_PUB.Add;
16719      RAISE FND_API.G_EXC_ERROR;
16720    END IF;
16721 
16722 
16723    -- Exception Block
16724    EXCEPTION
16725       WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
16726          x_return_status := FND_API.G_RET_STS_ERROR;
16727          fnd_msg_pub.count_and_get(
16728             p_count   => x_msg_count
16729            ,p_data    => x_msg_data);
16730 
16731       WHEN OTHERS THEN
16732          FND_MESSAGE.SET_NAME('CS', 'CS_CHG_UNEXPECTED_EXEC_ERRORS');
16733          FND_MESSAGE.SET_TOKEN('ROUTINE', p_api_name);
16734          FND_MESSAGE.SET_TOKEN('SQLERRM', sqlerrm);
16735          FND_MSG_PUB.ADD;
16736          fnd_msg_pub.count_and_get(
16737             p_count => x_msg_count
16738            ,p_data  => x_msg_data);
16739          x_return_status := FND_API.G_RET_STS_ERROR;
16740 
16741 END Validate_Order;
16742 
16743 --------------------------------------------------------------------------------
16744 --  Procedure Name            :   PURGE_CHG_VALIDATIONS
16745 --
16746 --  Parameters (other than standard ones)
16747 --  IN
16748 --      p_object_type         :   Type of object for which this procedure is
16749 --                                being called. (Here it will be 'SR')
16750 --      p_processing_set_id   :   Id that helps the API in identifying the
16751 --                                set of SRs for which the child objects have
16752 --                                to be deleted.
16753 --
16754 --  Description
16755 --      This procedure identifies the charge lines that are related to an SR
16756 --      and verifies if they can be deleted. The conditions checked during the
16757 --      varification are: if the charge line is 'ACTUAL' and if it does not have
16758 --      an order line id, the line cannot be deleted. In this case, the global
16759 --      temp table is updated with a purge_status as E against that SR which
16760 --      contains such a charge line.
16761 --
16762 --  HISTORY
16763 --
16764 ----------------+------------+--------------------------------------------------
16765 --  DATE        | UPDATED BY | Change Description
16766 ----------------+------------+--------------------------------------------------
16767 --  4-Aug-2005  | varnaray   | Created
16768 --              |            |
16769 ----------------+------------+--------------------------------------------------
16770 PROCEDURE Purge_Chg_Validations
16771 (
16772   p_api_version_number IN  NUMBER := 1.0
16773 , p_init_msg_list      IN  VARCHAR2 := FND_API.G_FALSE
16774 , p_commit             IN  VARCHAR2 := FND_API.G_FALSE
16775 , p_object_type        IN  VARCHAR2
16776 , p_processing_set_id  IN  NUMBER
16777 , x_return_status      OUT NOCOPY  VARCHAR2
16778 , x_msg_count          OUT NOCOPY  NUMBER
16779 , x_msg_data           OUT NOCOPY  VARCHAR2
16780 )
16781 IS
16782 --------------------------------------------------------------------------------
16783 
16784 L_API_VERSION   CONSTANT NUMBER        := 1.0;
16785 L_API_NAME      CONSTANT VARCHAR2(30)  := 'PURGE_CHG_VALIDATIONS';
16786 L_API_NAME_FULL CONSTANT VARCHAR2(100)  := G_PKG_NAME || '.' || L_API_NAME;
16787 L_LOG_MODULE    CONSTANT VARCHAR2(255) := 'cs.plsql.' || L_API_NAME_FULL || '.';
16788 
16789 l_row_count     NUMBER := 0;
16790 
16791 BEGIN
16792   x_return_status := FND_API.G_RET_STS_SUCCESS;
16793 
16794   IF FND_LOG.level_procedure >= FND_LOG.g_current_runtime_level
16795   THEN
16796     FND_LOG.String
16797     (
16798       FND_LOG.level_procedure
16799     , L_LOG_MODULE || 'start'
16800     , 'Inside ' || L_API_NAME_FULL
16801       || ', called with parameters below:'
16802     );
16803     FND_LOG.String
16804     (
16805       FND_LOG.level_procedure
16806     , L_LOG_MODULE || 'param 1'
16807     , 'p_api_version_number:' || p_api_version_number
16808     );
16809     FND_LOG.String
16810     (
16811       FND_LOG.level_procedure
16812     , L_LOG_MODULE || 'param 2'
16813     , 'p_init_msg_list:' || p_init_msg_list
16814     );
16815     FND_LOG.String
16816     (
16817       FND_LOG.level_procedure
16818     , L_LOG_MODULE || 'param 3'
16819     , 'p_commit:' || p_commit
16820     );
16821     FND_LOG.String
16822     (
16823       FND_LOG.level_procedure
16824     , L_LOG_MODULE || 'param 4'
16825     , 'p_object_type:' || p_object_type
16826     );
16827     FND_LOG.String
16828     (
16829       FND_LOG.level_procedure
16830     , L_LOG_MODULE || 'param 5'
16831     , 'p_processing_set_id:' || p_processing_set_id
16832     );
16833   END IF ;
16834 
16835   IF NOT FND_API.Compatible_API_Call
16836   (
16837     L_API_VERSION
16838   , p_api_version_number
16839   , L_API_NAME
16840   , G_PKG_NAME
16841   )
16842   THEN
16843     FND_MSG_PUB.Count_And_Get
16844     (
16845       p_count => x_msg_count
16846     , p_data  => x_msg_data
16847     );
16848     RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
16849   END IF ;
16850 
16851   IF FND_API.to_Boolean(p_init_msg_list)
16852   THEN
16853     FND_MSG_PUB.initialize;
16854   END IF ;
16855 
16856   ------------------------------------------------------------------------------
16857   -- Parameter Validations:
16858   ------------------------------------------------------------------------------
16859 
16860   IF NVL(p_object_type, 'X') <> 'SR'
16861   THEN
16862     IF FND_LOG.level_unexpected >= FND_LOG.g_current_runtime_level
16863     THEN
16864       FND_LOG.String
16865       (
16866         FND_LOG.level_unexpected
16867       , L_LOG_MODULE || 'object_type_invalid'
16868       , 'p_object_type has to be SR.'
16869       );
16870     END IF ;
16871 
16872     FND_MESSAGE.Set_Name('CS', 'CS_SR_PARAM_VALUE_ERROR');
16873     FND_MESSAGE.Set_Token('API_NAME', L_API_NAME_FULL);
16874     FND_MESSAGE.Set_Token('PARAM', 'p_object_type');
16875     FND_MESSAGE.Set_Token('CURRVAL', p_object_type);
16876     FND_MSG_PUB.ADD;
16877 
16878     RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
16879   END IF;
16880 
16881   ---
16882 
16883   IF p_processing_set_id IS NULL
16884   THEN
16885     IF FND_LOG.level_unexpected >= FND_LOG.g_current_runtime_level
16886     THEN
16887       FND_LOG.String
16888       (
16889         FND_LOG.level_unexpected
16890       , L_LOG_MODULE || 'proc_set_id_invalid'
16891       , 'p_processing_set_id should not be NULL.'
16892       );
16893     END IF ;
16894 
16895     FND_MESSAGE.Set_Name('CS', 'CS_SR_PARAM_VALUE_ERROR');
16896     FND_MESSAGE.Set_Token('API_NAME', L_API_NAME_FULL);
16897     FND_MESSAGE.Set_Token('PARAM', 'p_processing_set_id');
16898     FND_MESSAGE.Set_Token('CURRVAL', NVL(to_char(p_processing_set_id),'NULL'));
16899     FND_MSG_PUB.ADD;
16900 
16901     RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
16902   END IF;
16903 
16904   ------------------------------------------------------------------------------
16905   -- Actual Logic starts below:
16906   ------------------------------------------------------------------------------
16907 
16908   IF FND_LOG.level_statement >= FND_LOG.g_current_runtime_level
16909   THEN
16910     FND_LOG.String
16911     (
16912       FND_LOG.level_statement
16913     , L_LOG_MODULE || 'valid_chg_line_start'
16914     , 'validating charge lines against SRs in the global temp table'
16915     );
16916   END IF ;
16917 
16918   -- validate the SRs that are submitted for purge
16919   -- against the charge lines created for them.
16920   -- if the charge lines are ACTUAL and do not have
16921   -- a line id attached to them, then the corresponding
16922   -- SRs cannot be purged.
16923 
16924   UPDATE jtf_object_purge_param_tmp
16925   SET
16926     purge_status        = 'E'
16927   , purge_error_message = 'CS:CS_CHG_LINE_VAL_ERR'
16928   WHERE
16929       object_id IN
16930       (
16931       SELECT
16932           t.object_id
16933       FROM
16934         cs_estimate_details        e
16935       , jtf_object_purge_param_tmp t
16936       WHERE
16937           e.incident_id            = t.object_id
16938       AND e.charge_line_type       = 'ACTUAL'
16939       AND e.order_line_id          IS NULL
16940       AND t.object_type            = 'SR'
16941       AND t.processing_set_id      = p_processing_set_id
16942       AND nvl(t.purge_status, 'S') = 'S'
16943       )
16944   AND nvl(purge_status, 'S') = 'S'
16945   AND object_type            = 'SR'
16946   AND processing_set_id      = p_processing_set_id;
16947 
16948   l_row_count := SQL%ROWCOUNT;
16949 
16950   IF FND_LOG.level_statement >= FND_LOG.g_current_runtime_level
16951   THEN
16952     FND_LOG.String
16953     (
16954       FND_LOG.level_statement
16955     , L_LOG_MODULE || 'valid_chg_line_end'
16956     , 'after validating charge lines against SRs in the global temp table '
16957       || l_row_count || ' rows failed validation'
16958     );
16959   END IF ;
16960 
16961   ---
16962 
16963   IF FND_LOG.level_procedure >= FND_LOG.g_current_runtime_level
16964   THEN
16965     FND_LOG.String
16966     (
16967       FND_LOG.level_procedure
16968     , L_LOG_MODULE || 'end'
16969     , 'Completed work in ' || L_API_NAME_FULL || ' successfully'
16970     );
16971   END IF ;
16972 
16973 EXCEPTION
16974   WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
16975     x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
16976 
16977     IF FND_LOG.level_unexpected >= FND_LOG.g_current_runtime_level
16978     THEN
16979       FND_LOG.String
16980       (
16981         FND_LOG.level_unexpected
16982       , L_LOG_MODULE || 'unexpected_error'
16983       , 'Inside WHEN FND_API.G_EXC_UNEXPECTED_ERROR of ' || L_API_NAME_FULL
16984       );
16985     END IF ;
16986 
16987 	WHEN OTHERS THEN
16988     x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
16989     FND_MESSAGE.Set_Name('CS', 'CS_CHG_LINE_VAL_FAIL');
16990     FND_MESSAGE.Set_Token('API_NAME', L_API_NAME_FULL);
16991     FND_MESSAGE.Set_Token('ERROR', SQLERRM);
16992     FND_MSG_PUB.ADD;
16993 
16994     IF FND_LOG.level_unexpected >= FND_LOG.g_current_runtime_level
16995     THEN
16996       FND_LOG.String
16997       (
16998         FND_LOG.level_unexpected
16999       , L_LOG_MODULE || 'when_others'
17000       , 'Inside WHEN OTHERS of ' || L_API_NAME_FULL || '. Oracle Error was:'
17001       );
17002       FND_LOG.String
17003       (
17004         FND_LOG.level_unexpected
17005       , L_LOG_MODULE || 'when_others'
17006       , SQLERRM
17007       );
17008     END IF ;
17009 END Purge_Chg_Validations;
17010 
17011 --------------------------------------------------------------------------------
17012 --  Procedure Name            :   PURGE_CHARGES
17013 --
17014 --  Parameters (other than standard ones)
17015 --  IN
17016 --      p_object_type         :   Type of object for which this procedure is
17017 --                                being called. (Here it will be 'SR')
17018 --      p_processing_set_id   :   Id that helps the API in identifying the
17019 --                                set of SRs for which the child objects have
17020 --                                to be deleted.
17021 --
17022 --  Description
17023 --      This procedure physically deletes all the charge lines attached to
17024 --      a service request. It reads the list of SRs for which the charge lines
17025 --      have to be deleted from the global temp table, looking only for rows
17026 --      having the purge_status as NULL. Using Set processing, the procedure
17027 --      deletes all the charge lines attached to such SRs.
17028 --
17029 --  HISTORY
17030 --
17031 ----------------+------------+--------------------------------------------------
17032 --  DATE        | UPDATED BY | Change Description
17033 ----------------+------------+--------------------------------------------------
17034 --  4-Aug-2005  | varnaray   | Created
17035 --              |            |
17036 ----------------+------------+--------------------------------------------------
17037 PROCEDURE Purge_Charges
17038 (
17039   p_api_version_number IN  NUMBER := 1.0
17040 , p_init_msg_list      IN  VARCHAR2 := FND_API.G_FALSE
17041 , p_commit             IN  VARCHAR2 := FND_API.G_FALSE
17042 , p_object_type        IN  VARCHAR2
17043 , p_processing_set_id  IN  NUMBER
17044 , x_return_status      OUT NOCOPY  VARCHAR2
17045 , x_msg_count          OUT NOCOPY  NUMBER
17046 , x_msg_data           OUT NOCOPY  VARCHAR2
17047 )
17048 IS
17049 --------------------------------------------------------------------------------
17050 
17051 L_API_VERSION   CONSTANT NUMBER       := 1.0;
17052 L_API_NAME      CONSTANT VARCHAR2(30) := 'PURGE_CHARGES';
17053 L_API_NAME_FULL CONSTANT VARCHAR2(100) := G_PKG_NAME || '.' || L_API_NAME;
17054 L_LOG_MODULE    CONSTANT VARCHAR2(255) := 'cs.plsql.' || L_API_NAME_FULL || '.';
17055 
17056 l_row_count     NUMBER := 0;
17057 
17058 BEGIN
17059   x_return_status := FND_API.G_RET_STS_SUCCESS;
17060 
17061   IF FND_LOG.level_procedure >= FND_LOG.g_current_runtime_level
17062   THEN
17063     FND_LOG.String
17064     (
17065       FND_LOG.level_procedure
17066     , L_LOG_MODULE || 'start'
17067     , 'Inside ' || L_API_NAME_FULL || ', called with parameters below:'
17068     );
17069     FND_LOG.String
17070     (
17071       FND_LOG.level_procedure
17072     , L_LOG_MODULE || 'param 1'
17073     , 'p_api_version_number:' || p_api_version_number
17074     );
17075     FND_LOG.String
17076     (
17077       FND_LOG.level_procedure
17078     , L_LOG_MODULE || 'param 2'
17079     , 'p_init_msg_list:' || p_init_msg_list
17080     );
17081     FND_LOG.String
17082     (
17083       FND_LOG.level_procedure
17084     , L_LOG_MODULE || 'param 3'
17085     , 'p_commit:' || p_commit
17086     );
17087     FND_LOG.String
17088     (
17089       FND_LOG.level_procedure
17090     , L_LOG_MODULE || 'param 4'
17091     , 'p_object_type:' || p_object_type
17092     );
17093     FND_LOG.String
17094     (
17095       FND_LOG.level_procedure
17096     , L_LOG_MODULE || 'param 5'
17097     , 'p_processing_set_id:' || p_processing_set_id
17098     );
17099   END IF ;
17100 
17101   IF NOT FND_API.Compatible_API_Call
17102   (
17103     L_API_VERSION
17104   , p_api_version_number
17105   , L_API_NAME
17106   , G_PKG_NAME
17107   )
17108   THEN
17109     FND_MSG_PUB.Count_And_Get
17110     (
17111       p_count => x_msg_count
17112     , p_data  => x_msg_data
17113     );
17114     RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
17115   END IF ;
17116 
17117   IF FND_API.to_Boolean(p_init_msg_list)
17118   THEN
17119     FND_MSG_PUB.initialize;
17120   END IF ;
17121 
17122   ------------------------------------------------------------------------------
17123   -- Parameter Validations:
17124   ------------------------------------------------------------------------------
17125 
17126   IF NVL(p_object_type, 'X') <> 'SR'
17127   THEN
17128     IF FND_LOG.level_unexpected >= FND_LOG.g_current_runtime_level
17129     THEN
17130       FND_LOG.String
17131       (
17132         FND_LOG.level_unexpected
17133       , L_LOG_MODULE || 'object_type_invalid'
17134       , 'p_object_type has to be SR.'
17135       );
17136     END IF ;
17137 
17138     FND_MESSAGE.Set_Name('CS', 'CS_SR_PARAM_VALUE_ERROR');
17139     FND_MESSAGE.Set_Token('API_NAME', L_API_NAME_FULL);
17140     FND_MESSAGE.Set_Token('PARAM', 'p_object_type');
17141     FND_MESSAGE.Set_Token('CURRVAL', p_object_type);
17142     FND_MSG_PUB.ADD;
17143 
17144     RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
17145   END IF;
17146 
17147   ---
17148 
17149   IF p_processing_set_id IS NULL
17150   THEN
17151     IF FND_LOG.level_unexpected >= FND_LOG.g_current_runtime_level
17152     THEN
17153       FND_LOG.String
17154       (
17155         FND_LOG.level_unexpected
17156       , L_LOG_MODULE || 'proc_set_id_invalid'
17157       , 'p_processing_set_id should not be NULL.'
17158       );
17159     END IF ;
17160 
17161     FND_MESSAGE.Set_Name('CS', 'CS_SR_PARAM_VALUE_ERROR');
17162     FND_MESSAGE.Set_Token('API_NAME', L_API_NAME_FULL);
17163     FND_MESSAGE.Set_Token('PARAM', 'p_processing_set_id');
17164     FND_MESSAGE.Set_Token('CURRVAL', NVL(to_char(p_processing_set_id),'NULL'));
17165     FND_MSG_PUB.ADD;
17166 
17167     RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
17168   END IF;
17169 
17170   ------------------------------------------------------------------------------
17171   -- Actual Logic starts below:
17172   ------------------------------------------------------------------------------
17173 
17174   IF FND_LOG.level_statement >= FND_LOG.g_current_runtime_level
17175   THEN
17176     FND_LOG.String
17177     (
17178       FND_LOG.level_statement
17179     , L_LOG_MODULE || 'del_chg_line_start'
17180     , 'deleting charge lines against SRs in the global temp table'
17181     );
17182   END IF ;
17183 
17184   -- Delete all the estimate lines that correspond to the
17185   -- SRs that are available for purge after validations.
17186   -- bug 12681409 Change the hint to cardinality(jtf_object_purge_param_tmp, 10)
17187 
17188   DELETE /*+ index(e) */ cs_estimate_details e
17189   WHERE
17190     incident_id IN
17191     (
17192     SELECT /*+ cardinality(jtf_object_purge_param_tmp, 10) */
17193         object_id
17194     FROM
17195         jtf_object_purge_param_tmp
17196     WHERE
17197         processing_set_id = p_processing_set_id
17198     AND object_type = 'SR'
17199     AND NVL(purge_status, 'S') = 'S'
17200     );
17201 
17202   l_row_count := SQL%ROWCOUNT;
17203 
17204   IF FND_LOG.level_statement >= FND_LOG.g_current_runtime_level
17205   THEN
17206     FND_LOG.String
17207     (
17208       FND_LOG.level_statement
17209     , L_LOG_MODULE || 'del_chg_line_end'
17210     , 'after deleting charge lines against SRs in the global temp table'
17211       || l_row_count || ' rows deleted.'
17212     );
17213   END IF ;
17214 
17215   ---
17216 
17217   IF FND_LOG.level_procedure >= FND_LOG.g_current_runtime_level
17218   THEN
17219     FND_LOG.String
17220     (
17221       FND_LOG.level_procedure
17222     , L_LOG_MODULE || 'end'
17223     , 'Completed work in ' || L_API_NAME_FULL || ' successfully'
17224     );
17225   END IF ;
17226 
17227 EXCEPTION
17228   WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
17229     x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
17230 
17231     IF FND_LOG.level_unexpected >= FND_LOG.g_current_runtime_level
17232     THEN
17233       FND_LOG.String
17234       (
17235         FND_LOG.level_unexpected
17236       , L_LOG_MODULE || 'unexpected_error'
17237       , 'Inside WHEN FND_API.G_EXC_UNEXPECTED_ERROR of ' || L_API_NAME_FULL
17238       );
17239     END IF ;
17240 
17241 	WHEN OTHERS THEN
17242     x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
17243     FND_MESSAGE.Set_Name('CS', 'CS_CHG_LINE_DEL_FAIL');
17244     FND_MESSAGE.Set_Token('API_NAME', L_API_NAME_FULL);
17245     FND_MESSAGE.Set_Token('ERROR', SQLERRM);
17246     FND_MSG_PUB.ADD;
17247 
17248     IF FND_LOG.level_unexpected >= FND_LOG.g_current_runtime_level
17249     THEN
17250       FND_LOG.String
17251       (
17252         FND_LOG.level_unexpected
17253       , L_LOG_MODULE || 'when_others'
17254       , 'Inside WHEN OTHERS of ' || L_API_NAME_FULL || '. Oracle Error was:'
17255       );
17256       FND_LOG.String
17257       (
17258         FND_LOG.level_unexpected
17259       , L_LOG_MODULE || 'when_others'
17260       , SQLERRM
17261       );
17262     END IF ;
17263 END Purge_Charges;
17264 --------------------------------------------------------------------------------
17265 
17266 END CS_Charge_Details_PVT;