DBA Data[Home] [Help]

PACKAGE BODY: APPS.OKL_SUBSIDY_PROCESS_PVT

Source


1 PACKAGE BODY okl_subsidy_process_pvt as
2 /* $Header: OKLRSBPB.pls 120.27.12010000.2 2008/10/01 21:56:16 rkuttiya ship $ */
3 
4     G_MODULE VARCHAR2(255) := 'okl.stream.esg.okl_esg_transport_pvt';
5     G_DEBUG_ENABLED CONSTANT VARCHAR2(10) := OKL_DEBUG_PUB.CHECK_LOG_ENABLED;
6     G_IS_DEBUG_STATEMENT_ON BOOLEAN;
7 
8 --global message constants
9 G_MISSING_SUB_CALC_BASIS     CONSTANT VARCHAR2(200) := 'OKL_MISSING_SUB_CALC_BASIS';
10 G_SUBSIDY_NAME_TOKEN         CONSTANT VARCHAR2(200) := 'SUBSIDY_NAME';
11 
12 G_MISSING_SUB_CALC_PARAMETER CONSTANT VARCHAR2(200) := 'OKL_MISSING_SUB_CALC_PARAM';
13 G_PARAMETER_NAME_TOKEN       CONSTANT VARCHAR2(200) := 'PARAMETER_NAME';
14 G_CALC_BASIS_TOKEN           CONSTANT VARCHAR2(200) := 'SUB_CALC_BASIS';
15 
16 G_CONV_RATE_NOT_FOUND        CONSTANT VARCHAR2(200)  := 'OKL_LLA_CONV_RATE_NOT_FOUND';
17 G_FROM_CURRENCY_TOKEN        CONSTANT VARCHAR2(200)  := 'FROM_CURRENCY';
18 G_TO_CURRENCY_TOKEN          CONSTANT VARCHAR2(200)  := 'TO_CURRENCY';
19 G_CONV_TYPE_TOKEN            CONSTANT VARCHAR2(200)  := 'CONVERSION_TYPE';
20 G_CONV_DATE_TOKEN            CONSTANT VARCHAR2(200)  := 'CONVERSION_DATE';
21 
22 G_AMOUNT_ROUNDING            CONSTANT VARCHAR2(200)  := 'OKL_ERROR_ROUNDING_AMT';
23 
24 G_API_MISSING_PARAMETER      CONSTANT VARCHAR2(200)  := 'OKL_API_ALL_MISSING_PARAM';
25 G_API_NAME_TOKEN             CONSTANT VARCHAR2(50)   := 'API_NAME';
26 G_MISSING_PARAM_TOKEN        CONSTANT VARCHAR2(50)   := 'MISSING_PARAM';
27 
28 G_SUBSIDY_NO_RENTS           CONSTANT VARCHAR2(200)  := 'OKL_SUBSIDY_NO_RENTS';
29 G_ASSET_NUMBER_TOKEN         CONSTANT VARCHAR2(30)   := 'ASSET_NUMBER';
30 
31 
32 --global constants
33 G_FORMULA_OEC                CONSTANT VARCHAR2(200)  := 'LINE_OEC';
34 G_RATE_TYPE                  CONSTANT VARCHAR2(30)  := 'PRE_TAX_IRR';
35 
36 --global constants for billing trx creation
37 G_INCOMPLETE_VEND_BILL    CONSTANT VARCHAR2(200) := 'OKL_SUB_INCOMPLETE_VEND_BILL';
38 G_ERROR_TYPE_TOKEN        CONSTANT VARCHAR2(200) := 'ERROR_TYPE';
39 G_PARAMETER_TOKEN         CONSTANT VARCHAR2(200) := 'PARAMETER';
40 
41 G_VERIFY_VENDOR_BILL      CONSTANT VARCHAR2(200) := 'OKL_SUB_VERIFY_VENDOR_BILL';
42 G_VENDOR_NAME_TOKEN       CONSTANT VARCHAR2(200) := 'VENDOR_NAME';
43 
44 G_AR_INV_TRX_TYPE	       CONSTANT VARCHAR2(30)    := 'BILLING';
45 G_CANCEL_STATUS	               CONSTANT VARCHAR2(30)    := 'CANCELED';
46 G_SUBMIT_STATUS	               CONSTANT VARCHAR2(30)    := 'SUBMITTED';
47 G_PROCESSED_STATUS             CONSTANT VARCHAR2(30)    := 'PROCESSED';
48 G_AR_INV_LINE_CODE	       CONSTANT VARCHAR2(30)    := 'LINE';
49 G_AR_LINES_SOURCE	       CONSTANT VARCHAR2(30)    := 'OKL_TXL_AR_INV_LNS_B';
50 G_AR_CM_TRX_TYPE	       CONSTANT VARCHAR2(30)	:= 'CREDIT MEMO';
51 --global constants for billing trx creation
52 --Bug# 4899328
53 G_FORMULA_CAP                  CONSTANT VARCHAR2(200)  := 'LINE_CAP_AMNT';
54 
55 -- sjalasut, added Booking source as part of R12 Billing Enhancement. BEGIN
56 G_SOURCE_BILLING_TRX_BOOK    CONSTANT fnd_lookups.lookup_code%TYPE :='BOOKING';
57 -- sjalasut, added Booking source as part of R12 Billing Enhancement. END
58 
59 -- varangan - Billing Enhancement - Bug#5874824 - New constant added -Begin
60 G_SOURCE_BILLING_TRX_RBK    CONSTANT fnd_lookups.lookup_code%TYPE :='REBOOK';
61 -- varangan - Billing Enhancement - Bug#5874824 - New constant added -End
62 
63 -------------------------------------------------------------------------------
64 --****Local procedures for parameter validations
65 -------------------------------------------------------------------------------
66 ----------------------------------------------------
67 --validate chr_id : check that it is an okl contract
68 ----------------------------------------------------
69 Procedure validate_chr_id(p_chr_id         in number,
70                          x_return_status  out nocopy varchar2) is
71 
72 --cursor to find that chr id is valid okl contract header id
73 cursor l_chr_csr (p_chr_id in number) is
74 select 'Y'
75 from   okc_k_headers_b  chrb,
76        okc_subclasses_b scsb
77 where  chrb.id       = p_chr_id
78 and    scsb.code     = chrb.scs_code
79 and    scsb.cls_code = 'OKL';
80 
81 l_valid_value varchar2(1) default 'N';
82 begin
83     x_return_status := OKL_API.G_RET_STS_SUCCESS;
84 
85     l_valid_value := 'N';
86 
87     open l_chr_csr(p_chr_id => p_chr_id);
88     fetch l_chr_csr into l_valid_value;
89     if l_chr_csr%NOTFOUND then
90         null;
91     end if;
92     close l_chr_csr;
93 
94     If l_valid_value = 'N' then
95         x_return_status := OKL_API.G_RET_STS_ERROR;
96    End If;
97 
98    Exception
99    When Others then
100    If l_chr_csr%ISOPEN then
101        CLOSE l_chr_csr;
102    End If;
103    OKL_API.SET_MESSAGE( p_app_name     => G_APP_NAME
104                         ,p_msg_name     => G_UNEXPECTED_ERROR
105                         ,p_token1       => G_SQLCODE_TOKEN
106                         ,p_token1_value => SQLCODE
107                         ,p_token2       => G_SQLERRM_TOKEN
108                         ,p_token2_value => SQLERRM);
109    x_return_status := OKL_API.G_RET_STS_UNEXP_ERROR;
110 end validate_chr_id;
111 --------------------------------------------------------------
112 --validate line id : check that it is a valid okl line
113 -------------------------------------------------------------
114 Procedure validate_cle_id(p_cle_id         in number,
115                          p_lty_code       in varchar2 default NULL,
116                          x_return_status  out nocopy varchar2) is
117 
118 
119 --cursor to find that chr id is valid okl contract header id
120 cursor l_cle_csr (p_cle_id   in number,
121                   p_lty_code in varchar2) is
122 select 'Y'
123 from   okc_k_lines_b     cleb,
124        okc_line_styles_b lseb,
125        okc_k_headers_b   chrb,
126        okc_subclasses_b  scsb
127 where  chrb.id       = cleb.dnz_chr_id
128 and    scsb.code     = chrb.scs_code
129 and    scsb.cls_code = 'OKL'
130 and    lseb.lty_code = nvl(p_lty_code,lseb.lty_code)
131 and    lseb.id       = cleb.lse_id
132 and    cleb.id       = p_cle_id;
133 
134 l_valid_value varchar2(1) default 'N';
135 begin
136     x_return_status := OKL_API.G_RET_STS_SUCCESS;
137 
138     l_valid_value := 'N';
139 
140     open l_cle_csr(p_cle_id   => p_cle_id,
141                    p_lty_code => p_lty_code);
142     fetch l_cle_csr into l_valid_value;
143     if l_cle_csr%NOTFOUND then
144         null;
145     end if;
146     close l_cle_csr;
147 
148     If l_valid_value = 'N' then
149         x_return_status := OKL_API.G_RET_STS_ERROR;
150    End If;
151 
152    Exception
153    When Others then
154    If l_cle_csr%ISOPEN then
155        CLOSE l_cle_csr;
156    End If;
157    OKL_API.SET_MESSAGE( p_app_name     => G_APP_NAME
158                         ,p_msg_name     => G_UNEXPECTED_ERROR
159                         ,p_token1       => G_SQLCODE_TOKEN
160                         ,p_token1_value => SQLCODE
161                         ,p_token2       => G_SQLERRM_TOKEN
162                         ,p_token2_value => SQLERRM);
163    x_return_status := OKL_API.G_RET_STS_UNEXP_ERROR;
164 end validate_cle_id;
165 -----------------------------------------
166 --validate accounting method
167 -----------------------------------------
168 procedure validate_acct_method(p_accounting_method in varchar2,
169                                x_return_status      out nocopy varchar2) is
170 
171 --cursor to find whether accounting method is valid
172 cursor l_flkup_csr (p_lookup_code in varchar2) is
173 select 'Y'
174 from   fnd_lookups
175 where  lookup_code = p_lookup_code
176 and    lookup_type = 'OKL_SUBACCT_METHOD';
177 
178 l_valid_value varchar2(1) default 'N';
179 
180 begin
181     x_return_status := OKL_API.G_RET_STS_SUCCESS;
182 
183     l_valid_value := 'N';
184 
185     open l_flkup_csr(p_lookup_code   => p_accounting_method);
186     fetch l_flkup_csr into l_valid_value;
187     if l_flkup_csr%NOTFOUND then
188         null;
189     end if;
190     close l_flkup_csr;
191 
192     If l_valid_value = 'N' then
193         x_return_status := OKL_API.G_RET_STS_ERROR;
194    End If;
195 
196    Exception
197    When Others then
198    If l_flkup_csr%ISOPEN then
199        CLOSE l_flkup_csr;
200    End If;
201    OKL_API.SET_MESSAGE( p_app_name     => G_APP_NAME
202                         ,p_msg_name     => G_UNEXPECTED_ERROR
203                         ,p_token1       => G_SQLCODE_TOKEN
204                         ,p_token1_value => SQLCODE
205                         ,p_token2       => G_SQLERRM_TOKEN
206                         ,p_token2_value => SQLERRM);
207    x_return_status := OKL_API.G_RET_STS_UNEXP_ERROR;
208 end validate_acct_method;
209 ------------------------------------
210 --procedure to validate vendor id
211 -----------------------------------
212 procedure validate_vendor_id(p_vendor_id in number,
213                              x_return_status      out nocopy varchar2) is
214 
215 --cursor to find whether vendor id is valid
216 cursor l_vendor_csr (p_vendor_id in number) is
217 select 'Y'
218 from   po_vendors
219 where  vendor_id = p_vendor_id;
220 
221 l_valid_value varchar2(1) default 'N';
222 
223 begin
224     x_return_status := OKL_API.G_RET_STS_SUCCESS;
225 
226     l_valid_value := 'N';
227 
228     open l_vendor_csr(p_vendor_id   => p_vendor_id);
229     fetch l_vendor_csr into l_valid_value;
230     if l_vendor_csr%NOTFOUND then
231         null;
232     end if;
233     close l_vendor_csr;
234 
235     If l_valid_value = 'N' then
236         x_return_status := OKL_API.G_RET_STS_ERROR;
237    End If;
238 
239    Exception
240    When Others then
241    If l_vendor_csr%ISOPEN then
242        CLOSE l_vendor_csr;
243    End If;
244    OKL_API.SET_MESSAGE( p_app_name     => G_APP_NAME
245                         ,p_msg_name     => G_UNEXPECTED_ERROR
246                         ,p_token1       => G_SQLCODE_TOKEN
247                         ,p_token1_value => SQLCODE
248                         ,p_token2       => G_SQLERRM_TOKEN
249                         ,p_token2_value => SQLERRM);
250    x_return_status := OKL_API.G_RET_STS_UNEXP_ERROR;
251 end validate_vendor_id;
252 
253 ------------------------------------------------------------------------------
254 --*****End of local procedures for parameter validations
255 ------------------------------------------------------------------------------
256 --------------------------------------------------------------------------------
257 --Name         : Is_Contract_Subsidized
258 --Description  : UTIL API returns true if contract is subsidized
259 --
260 -- PARAMETERS  : IN - p_chr_id     : contract header id
261 --               OUT -x_subsidized : OKL_API.G_TRUE or OKL_API.G_FALSE
262 --------------------------------------------------------------------------------
263 Procedure is_contract_subsidized(
264     p_api_version                  IN NUMBER,
265     p_init_msg_list                IN VARCHAR2,
266     x_return_status                OUT NOCOPY VARCHAR2,
267     x_msg_count                    OUT NOCOPY NUMBER,
268     x_msg_data                     OUT NOCOPY VARCHAR2,
269     p_chr_id                       IN  NUMBER,
270     x_subsidized                   OUT NOCOPY VARCHAR2) is
271 
272     l_return_status        VARCHAR2(1)  default OKL_API.G_RET_STS_SUCCESS;
273     l_api_name             CONSTANT     varchar2(30) := 'IS_CONTRACT_SUBSIDIZED';
274     l_api_version          CONSTANT     NUMBER := 1.0;
275 
276 --cursor to find out whether subsidies exist on the
277 --contract
278 cursor l_subexist_csr(p_chr_id in number) is
279 select 'Y'
280 from   dual
281 where  exists (select '1'
282                from   okc_k_lines_b cleb,
283                       okc_line_styles_b lseb
284                where  cleb.dnz_chr_id = p_chr_id
285                and    cleb.sts_code <> 'ABANDONED'
286                and    lseb.id       = cleb.lse_id
287                and    lseb.lty_code = 'SUBSIDY'
288               );
289 
290 l_subsidy_exists varchar2(1) default 'N';
291 begin
292 ----
293     --------------------------------------
294     --start of input variable validations
295     --------------------------------------
296     --validate p_chr_id
297     If (p_chr_id is NULL) or (p_chr_id = OKL_API.G_MISS_NUM) then
298         OKL_API.set_message(
299                               p_app_name     => G_APP_NAME,
300                               p_msg_name     => G_API_MISSING_PARAMETER,
301                               p_token1       => G_API_NAME_TOKEN,
302                               p_token1_value => l_api_name,
303                               p_token2       => G_MISSING_PARAM_TOKEN,
304                               p_token2_value => 'p_chr_id');
305          x_return_status := OKL_API.G_RET_STS_ERROR;
306          Raise OKL_API.G_EXCEPTION_ERROR;
307     Elsif (p_chr_id is not NULL) and (p_chr_id <> OKL_API.G_MISS_NUM) then
308         validate_chr_id(p_chr_id        => p_chr_id,
309                         x_return_status => x_return_status);
310         IF x_return_status = OKL_API.G_RET_STS_ERROR then
311             OKL_API.set_message(G_APP_NAME, G_INVALID_VALUE,G_COL_NAME_TOKEN,'p_chr_id');
312             Raise OKL_API.G_EXCEPTION_ERROR;
313         Elsif x_return_status = OKL_API.G_RET_STS_UNEXP_ERROR then
314             Raise OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
315         End If;
316     End If;
317     ------------------------------------------
318     --end of input variable validations
319     -----------------------------------------
320 
321     l_subsidy_exists := 'N';
322     open l_subexist_csr(p_chr_id => p_chr_id);
323     fetch l_subexist_csr into l_subsidy_exists;
324     If l_subexist_csr%NOTFOUND then
325         NULL;
326     End If;
327     Close l_subexist_csr;
328     If l_subsidy_exists = 'Y' then
329         x_subsidized := OKL_API.G_TRUE;
330     elsif l_subsidy_exists = 'N' then
331         x_subsidized := OKL_API.G_FALSE;
332     end if;
333     Exception
334     WHEN OKL_API.G_EXCEPTION_ERROR THEN
335     If l_subexist_csr%ISOPEN then
336          CLOSE l_subexist_csr;
337     End If;
338     x_return_status := OKL_API.HANDLE_EXCEPTIONS(
339                                l_api_name,
340                                G_PKG_NAME,
341                                'OKL_API.G_RET_STS_ERROR',
342                                x_msg_count,
343                                x_msg_data,
344                                '_PVT');
345     WHEN OKL_API.G_EXCEPTION_UNEXPECTED_ERROR THEN
346     If l_subexist_csr%ISOPEN then
347          CLOSE l_subexist_csr;
348     End If;
349     x_return_status :=OKL_API.HANDLE_EXCEPTIONS(
350                               l_api_name,
351                               G_PKG_NAME,
352                               'OKL_API.G_RET_STS_UNEXP_ERROR',
353                               x_msg_count,
354                               x_msg_data,
355                               '_PVT');
356     When others then
357     If l_subexist_csr%ISOPEN then
358         CLOSE l_subexist_csr;
359     End If;
360     x_return_status :=OKL_API.HANDLE_EXCEPTIONS(
361                               l_api_name,
362                               G_PKG_NAME,
363                               'OTHERS',
364                               x_msg_count,
365                               x_msg_data,
366                               '_PVT');
367 End is_contract_subsidized;
368 --------------------------------------------------------------------------------
369 --Name         : Is_Asset_Subsidized
370 --Description  : UTIL API returns true if asset is subsidized
371 --
372 -- PARAMETERS  : IN - p_asset_cle_id     : financial asset line id
373 --               OUT -x_subsidized       : OKL_API.G_TRUE or OKL_API.G_FALSE
374 --------------------------------------------------------------------------------
375 Procedure is_asset_subsidized(
376     p_api_version                  IN NUMBER,
377     p_init_msg_list                IN VARCHAR2,
378     x_return_status                OUT NOCOPY VARCHAR2,
379     x_msg_count                    OUT NOCOPY NUMBER,
380     x_msg_data                     OUT NOCOPY VARCHAR2,
381     p_asset_cle_id                 IN  NUMBER,
382     x_subsidized                   OUT NOCOPY VARCHAR2) is
383 
384     l_return_status        VARCHAR2(1)  default OKL_API.G_RET_STS_SUCCESS;
385     l_api_name             CONSTANT     varchar2(30) := 'IS_ASSET_SUBSIDIZED';
386     l_api_version          CONSTANT     NUMBER := 1.0;
387 
388 --cursor to find out whether subsidies exist on the
389 --contract
390 cursor l_subexist_csr(p_asset_cle_id in number) is
391 select 'Y'
392 from   dual
393 where  exists (select '1'
394                from   okc_k_lines_b cleb,
395                       okc_line_styles_b lseb
396                where  cleb.cle_id    = p_asset_cle_id
397                and    cleb.sts_code <> 'ABANDONED'
398                and    lseb.id       = cleb.lse_id
399                and    lseb.lty_code = 'SUBSIDY'
400               );
401 
402 l_subsidy_exists varchar2(1) default 'N';
403 begin
404 ----
405     ----------------------------------------
406     --start of input parameter validations
407     ---------------------------------------
408     --1.validate p_asset_cle_id
409     If (p_asset_cle_id is NULL) or (p_asset_cle_id = OKL_API.G_MISS_NUM) then
410         OKL_API.set_message(
411                               p_app_name     => G_APP_NAME,
412                               p_msg_name     => G_API_MISSING_PARAMETER,
413                               p_token1       => G_API_NAME_TOKEN,
414                               p_token1_value => l_api_name,
415                               p_token2       => G_MISSING_PARAM_TOKEN,
416                               p_token2_value => 'p_asset_cle_id');
417          x_return_status := OKL_API.G_RET_STS_ERROR;
418          Raise OKL_API.G_EXCEPTION_ERROR;
419     Elsif (p_asset_cle_id is not NULL) and (p_asset_cle_id <> OKL_API.G_MISS_NUM) then
420         validate_cle_id(p_cle_id        => p_asset_cle_id,
421                         p_lty_code      => 'FREE_FORM1',
422                         x_return_status => x_return_status);
423         IF x_return_status = OKL_API.G_RET_STS_ERROR then
424             OKL_API.set_message(G_APP_NAME, G_INVALID_VALUE,G_COL_NAME_TOKEN,'p_asset_cle_id');
425             Raise OKL_API.G_EXCEPTION_ERROR;
426         Elsif x_return_status = OKL_API.G_RET_STS_UNEXP_ERROR then
427             Raise OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
428         End If;
429     End If;
430     -----------------------------------
431     --end of input variable validations
432     -----------------------------------
433 
434     l_subsidy_exists := 'N';
435     open l_subexist_csr(p_asset_cle_id => p_asset_cle_id);
436     fetch l_subexist_csr into l_subsidy_exists;
437     If l_subexist_csr%NOTFOUND then
438         NULL;
439     End If;
440     Close l_subexist_csr;
441     If l_subsidy_exists = 'Y' then
442         x_subsidized := OKL_API.G_TRUE;
443     elsif l_subsidy_exists = 'N' then
444         x_subsidized := OKL_API.G_FALSE;
445     end if;
446     Exception
447     WHEN OKL_API.G_EXCEPTION_ERROR THEN
448     If l_subexist_csr%ISOPEN then
449          CLOSE l_subexist_csr;
450     End If;
451     x_return_status := OKL_API.HANDLE_EXCEPTIONS(
452                                l_api_name,
453                                G_PKG_NAME,
454                                'OKL_API.G_RET_STS_ERROR',
455                                x_msg_count,
456                                x_msg_data,
457                                '_PVT');
458     WHEN OKL_API.G_EXCEPTION_UNEXPECTED_ERROR THEN
459     If l_subexist_csr%ISOPEN then
460          CLOSE l_subexist_csr;
461     End If;
462     x_return_status :=OKL_API.HANDLE_EXCEPTIONS(
463                               l_api_name,
464                               G_PKG_NAME,
465                               'OKL_API.G_RET_STS_UNEXP_ERROR',
466                               x_msg_count,
467                               x_msg_data,
468                               '_PVT');
469     When others then
470     If l_subexist_csr%ISOPEN then
471         CLOSE l_subexist_csr;
472     End If;
473     x_return_status :=OKL_API.HANDLE_EXCEPTIONS(
474                               l_api_name,
475                               G_PKG_NAME,
476                               'OTHERS',
477                               x_msg_count,
478                               x_msg_data,
479                               '_PVT');
480 End is_asset_subsidized;
481 ---------------------------------------------------------------------------------
482 --Bug# 3330669 : Bug Fix for Rate Points calculation
483 --------------------------------------------------------------------------------
484 Procedure print( p_proc_name     IN VARCHAR2,
485                    p_message       IN VARCHAR2,
486 		   x_return_status IN VARCHAR2) IS
487 
488   Begin
489 
490        NULL;
491        --dbms_output.put_line( p_proc_name||':'||p_message||':'||x_return_status );
492 
493   End;
494 
495   Procedure print( p_proc_name     IN VARCHAR2,
496                    p_message       IN VARCHAR2) IS
497   Begin
498 
499      IF (G_IS_DEBUG_STATEMENT_ON = true) THEN
500             OKL_DEBUG_PUB.LOG_DEBUG(FND_LOG.LEVEL_STATEMENT, G_MODULE,p_proc_name || p_message || 'S' );
501 
502      END IF;
503   End;
504   --------------------------------------------------------------------------
505   -- FUNCTION get_first_sel_date
506   ---------------------------------------------------------------------------
507   FUNCTION get_first_sel_date( p_start_date          IN    DATE,
508                                p_advance_or_arrears  IN    VARCHAR2,
509                                p_months_increment    IN    NUMBER,
510                                x_return_status       OUT NOCOPY VARCHAR2) RETURN DATE IS
511     l_date  DATE;
512 
513     l_prog_name         CONSTANT VARCHAR2(61) := G_PKG_NAME||'.'||'get_first_sel_date';
514 
515   BEGIN
516     IF (G_DEBUG_ENABLED = 'Y') THEN
517       G_IS_DEBUG_STATEMENT_ON := OKL_DEBUG_PUB.CHECK_LOG_ON(G_MODULE, FND_LOG.LEVEL_STATEMENT);
518     END IF;
519 
520     x_return_status := OKL_API.G_RET_STS_SUCCESS;
521     IF (G_IS_DEBUG_STATEMENT_ON = true) THEN
522           OKL_DEBUG_PUB.LOG_DEBUG(FND_LOG.LEVEL_STATEMENT, G_MODULE, l_prog_name || 'begin' );
523     END IF;
524     IF p_advance_or_arrears = 'ADVANCE' THEN
525       l_date  :=  TRUNC(p_start_date);
526     ELSIF p_advance_or_arrears = 'ARREARS' THEN
527       l_date  :=  ADD_MONTHS(TRUNC(p_start_date), p_months_increment) - 1;
528     END IF;
529 
530     IF l_date IS NOT NULL THEN
531       x_return_status := OKL_API.G_RET_STS_SUCCESS;
532       RETURN l_date;
533     ELSE
534       RAISE OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
535     END IF;
536 
537     IF (G_IS_DEBUG_STATEMENT_ON = true) THEN
538           OKL_DEBUG_PUB.LOG_DEBUG(FND_LOG.LEVEL_STATEMENT, G_MODULE, l_prog_name || 'end' );
539     END IF;
540   EXCEPTION
541 
542     WHEN OKL_API.G_EXCEPTION_ERROR THEN
543 
544       x_return_status := OKL_API.G_RET_STS_ERROR;
545 
546     WHEN OKL_API.G_EXCEPTION_UNEXPECTED_ERROR THEN
547 
548       x_return_status := OKL_API.G_RET_STS_UNEXP_ERROR;
549 
550     WHEN OTHERS THEN
551 
552      OKL_API.SET_MESSAGE( p_app_name     => G_APP_NAME
553                         ,p_msg_name     => G_UNEXPECTED_ERROR
554                         ,p_token1       => G_SQLCODE_TOKEN
555                         ,p_token1_value => SQLCODE
556                         ,p_token2       => G_SQLERRM_TOKEN
557                         ,p_token2_value => SQLERRM);
558 
559       x_return_status := OKL_API.G_RET_STS_UNEXP_ERROR;
560 
561   END get_first_sel_date;
562    ---------------------------------------------------------------------------
563   -- FUNCTION get_months_factor
564   ---------------------------------------------------------------------------
565   FUNCTION get_months_factor( p_frequency     IN VARCHAR2,
566                               x_return_status OUT NOCOPY VARCHAR2) RETURN NUMBER IS
567 
568     l_months  NUMBER;
569 
570     l_prog_name         CONSTANT VARCHAR2(61) := G_PKG_NAME||'.'||'get_months_factor';
571 
572 
573   BEGIN
574     IF (G_DEBUG_ENABLED = 'Y') THEN
575       G_IS_DEBUG_STATEMENT_ON := OKL_DEBUG_PUB.CHECK_LOG_ON(G_MODULE, FND_LOG.LEVEL_STATEMENT);
576     END IF;
577 
578     x_return_status := OKL_API.G_RET_STS_SUCCESS;
579     IF (G_IS_DEBUG_STATEMENT_ON = true) THEN
580           OKL_DEBUG_PUB.LOG_DEBUG(FND_LOG.LEVEL_STATEMENT, G_MODULE, l_prog_name || 'begin' );
581     END IF;
582     IF p_frequency = 'M' THEN
583       l_months := 1;
584     ELSIF p_frequency = 'Q' THEN
585       l_months := 3;
586     ELSIF p_frequency = 'S' THEN
587       l_months := 6;
588     ELSIF p_frequency = 'A' THEN
589       l_months := 12;
590     END IF;
591 
592     IF l_months IS NOT NULL THEN
593       x_return_status := OKL_API.G_RET_STS_SUCCESS;
594       RETURN l_months;
595 
596     ELSE
597 
598       OKL_API.SET_MESSAGE(p_app_name     => G_APP_NAME,
599                           p_msg_name     => 'OKL_INVALID_FREQUENCY_CODE',
600                           p_token1       => 'FRQ_CODE',
601                           p_token1_value => p_frequency);
602 
603       RAISE OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
604 
605     END IF;
606 
607     IF (G_IS_DEBUG_STATEMENT_ON = true) THEN
608           OKL_DEBUG_PUB.LOG_DEBUG(FND_LOG.LEVEL_STATEMENT, G_MODULE, l_prog_name || 'end' );
609     END IF;
610   EXCEPTION
611 
612     WHEN OKL_API.G_EXCEPTION_ERROR THEN
613 
614       x_return_status := OKL_API.G_RET_STS_ERROR;
615 
616     WHEN OKL_API.G_EXCEPTION_UNEXPECTED_ERROR THEN
617 
618       x_return_status := OKL_API.G_RET_STS_UNEXP_ERROR;
619 
620     WHEN OTHERS THEN
621 
622      OKL_API.SET_MESSAGE( p_app_name     => G_APP_NAME
623                         ,p_msg_name     => G_UNEXPECTED_ERROR
624                         ,p_token1       => G_SQLCODE_TOKEN
625                         ,p_token1_value => SQLCODE
626                         ,p_token2       => G_SQLERRM_TOKEN
627                         ,p_token2_value => SQLERRM);
628 
629       x_return_status := OKL_API.G_RET_STS_UNEXP_ERROR;
630 
631   END get_months_factor;
632  ---------------------------------------------------------------------------
633   -- PROCEDURE get_stream_elements
634   --
635   -- Description
636   -- Populates Stream Elements array for contiguous periodic charges/expenses
637   --
638   ---------------------------------------------------------------------------
639   PROCEDURE get_stream_elements( p_start_date          IN      DATE,
640                                  p_periods             IN      NUMBER,
641                                  p_frequency           IN      VARCHAR2,
642                                  p_structure           IN      VARCHAR2,
643                                  p_advance_or_arrears  IN      VARCHAR2,
644                                  p_amount              IN      NUMBER,
645                                  p_stub_days           IN      NUMBER,
646                                  p_stub_amount         IN      NUMBER,
647                                  p_currency_code       IN      VARCHAR2,
648                                  p_khr_id              IN      NUMBER,
649                                  p_kle_id              IN      NUMBER,
650                                  p_purpose_code        IN      VARCHAR2,
651                                  x_selv_tbl            OUT NOCOPY okl_sel_pvt.selv_tbl_type,
652                                  x_pt_tbl              OUT NOCOPY okl_sel_pvt.selv_tbl_type,
653                                  x_return_status       OUT NOCOPY VARCHAR2,
654                                  x_msg_count           OUT NOCOPY NUMBER,
655                                  x_msg_data            OUT NOCOPY VARCHAR2) IS
656 
657     lx_return_status             VARCHAR2(1);
658 
659     l_months_factor              NUMBER;
660     l_first_sel_date             DATE;
661     l_element_count              NUMBER;
662     l_base_amount                NUMBER;
663     l_amount                     NUMBER;
664 
665     l_prog_name         CONSTANT VARCHAR2(61) := G_PKG_NAME||'.'||'get_stream_elements';
666 
667   BEGIN
668     IF (G_DEBUG_ENABLED = 'Y') THEN
669       G_IS_DEBUG_STATEMENT_ON := OKL_DEBUG_PUB.CHECK_LOG_ON(G_MODULE, FND_LOG.LEVEL_STATEMENT);
670     END IF;
671     x_return_status := OKL_API.G_RET_STS_SUCCESS ;
672     IF (G_IS_DEBUG_STATEMENT_ON = true) THEN
673           OKL_DEBUG_PUB.LOG_DEBUG(FND_LOG.LEVEL_STATEMENT, G_MODULE, l_prog_name || 'begin' );
674     END IF;
675     l_months_factor := get_months_factor( p_frequency       =>   p_frequency,
676                                           x_return_status   =>   x_return_status);
677 
678     IF x_return_status = OKL_API.G_RET_STS_UNEXP_ERROR THEN
679       RAISE OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
680     ELSIF x_return_status = OKL_API.G_RET_STS_ERROR THEN
681       RAISE OKL_API.G_EXCEPTION_ERROR;
682     END IF;
683 
684     l_first_sel_date := get_first_sel_date( p_start_date          =>   p_start_date,
685                                             p_advance_or_arrears  =>   p_advance_or_arrears,
686                                             p_months_increment    =>   l_months_factor,
687                                             x_return_status       =>   x_return_status);
688 
689     IF x_return_status = OKL_API.G_RET_STS_UNEXP_ERROR THEN
690       RAISE OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
691     ELSIF x_return_status = OKL_API.G_RET_STS_ERROR THEN
692       RAISE OKL_API.G_EXCEPTION_ERROR;
693     END IF;
694 
695     If ( p_amount IS NULL ) Then
696         l_amount := NULL;
697     else
698         l_amount := okl_accounting_util.validate_amount(p_amount         => p_amount,
699                                                         p_currency_code  => p_currency_code);
700     ENd If;
701 
702     If ( p_periods IS NULL ) AND ( p_stub_days IS NOT NULL ) Then
703 
704         x_selv_tbl(1).amount                     := p_stub_amount;
705         x_selv_tbl(1).se_line_number             := 1;                            -- TBD
706         x_selv_tbl(1).accrued_yn                 := NULL;                         -- TBD
707 
708         IF p_advance_or_arrears = 'ARREARS' THEN
709             x_selv_tbl(1).stream_element_date        := p_start_date + p_stub_days - 1;
710             x_selv_tbl(1).comments                   := 'Y';
711         ELSE
712             x_selv_tbl(1).stream_element_date        := p_start_date;
713             x_selv_tbl(1).comments                   := 'N';
714         END IF;
715 
716     Else
717 
718         l_element_count := p_periods;
719 
720         IF (G_IS_DEBUG_STATEMENT_ON = true) THEN
721                   OKL_DEBUG_PUB.LOG_DEBUG(FND_LOG.LEVEL_STATEMENT, G_MODULE, l_prog_name || 'creating elements: ' || to_char(l_element_count) );
722         END IF;
723         FOR i IN 1 .. l_element_count LOOP
724 
725             x_selv_tbl(i).amount                     := l_amount;
726             x_selv_tbl(i).stream_element_date        := ADD_MONTHS(l_first_sel_date, (i - 1) * l_months_factor);
727             x_selv_tbl(i).se_line_number             := i;                            -- TBD
728             x_selv_tbl(i).accrued_yn                 := NULL;                         -- TBD
729 
730             IF p_advance_or_arrears = 'ARREARS' THEN
731               x_selv_tbl(i).comments                   := 'Y';
732             ELSE
733               x_selv_tbl(i).comments                   := 'N';
734             END IF;
735 
736         END LOOP;
737 
738      End If;
739 
740 
741     IF (G_IS_DEBUG_STATEMENT_ON = true) THEN
742           OKL_DEBUG_PUB.LOG_DEBUG(FND_LOG.LEVEL_STATEMENT, G_MODULE, l_prog_name || 'end' );
743 
744     END IF;
745   EXCEPTION
746 
747     WHEN OKL_API.G_EXCEPTION_ERROR THEN
748 
749       x_return_status := OKL_API.G_RET_STS_ERROR;
750 
751     WHEN OKL_API.G_EXCEPTION_UNEXPECTED_ERROR THEN
752 
753       x_return_status := OKL_API.G_RET_STS_UNEXP_ERROR;
754 
755     WHEN OTHERS THEN
756 
757        OKL_API.SET_MESSAGE( p_app_name     => G_APP_NAME
758                         ,p_msg_name     => G_UNEXPECTED_ERROR
759                         ,p_token1       => G_SQLCODE_TOKEN
760                         ,p_token1_value => SQLCODE
761                         ,p_token2       => G_SQLERRM_TOKEN
762                         ,p_token2_value => SQLERRM);
763 
764       x_return_status := OKL_API.G_RET_STS_UNEXP_ERROR;
765 
766   END get_stream_elements;
767   ---------------------------------------------------------------------------
768   -- PROCEDURE get_stream_header
769   ---------------------------------------------------------------------------
770   PROCEDURE get_stream_header(p_purpose_code   IN  VARCHAR2,
771                               p_khr_id         IN  NUMBER,
772                               p_kle_id         IN  NUMBER,
773                               p_sty_id         IN  NUMBER,
774                               x_stmv_rec       OUT NOCOPY okl_stm_pvt.stmv_rec_type,
775                               x_return_status  OUT NOCOPY VARCHAR2) IS
776 
777     l_stmv_rec                okl_stm_pvt.stmv_rec_type;
778     l_transaction_number      NUMBER;
779 
780     l_prog_name         CONSTANT VARCHAR2(61) := G_PKG_NAME||'.'||'get_stream_header';
781 
782 
783   BEGIN
784     IF (G_DEBUG_ENABLED = 'Y') THEN
785       G_IS_DEBUG_STATEMENT_ON := OKL_DEBUG_PUB.CHECK_LOG_ON(G_MODULE, FND_LOG.LEVEL_STATEMENT);
786     END IF;
787     x_return_status := OKL_API.G_RET_STS_SUCCESS;
788     IF (G_IS_DEBUG_STATEMENT_ON = true) THEN
789           OKL_DEBUG_PUB.LOG_DEBUG(FND_LOG.LEVEL_STATEMENT, G_MODULE, l_prog_name || 'begin' );
790     END IF;
791     SELECT okl_sif_seq.nextval INTO l_transaction_number FROM DUAL;
792 
793     -- NOTE: UV for Streams inquiry (OKL_ASSET_STREAMS_UV) assumes a denormalized use of KHR_ID
794     l_stmv_rec.khr_id  :=  p_khr_id;
795     l_stmv_rec.kle_id              :=  p_kle_id;
796     l_stmv_rec.sty_id              :=  p_sty_id;
797     l_stmv_rec.sgn_code            :=  'MANL';
798     l_stmv_rec.say_code            :=  'WORK';
799     l_stmv_rec.active_yn           :=  'N';
800     l_stmv_rec.transaction_number  :=  l_transaction_number;
801     -- l_stmv_rec.date_current        :=  NULL;                                    --  TBD
802     l_stmv_rec.date_working        :=  SYSDATE;                                    --  TBD
803     -- l_stmv_rec.date_history        :=  NULL;                                    --  TBD
804     -- l_stmv_rec.comments            :=  NULL;                                    --  TBD
805 
806     IF p_purpose_code = 'REPORT' THEN
807 
808       l_stmv_rec.purpose_code := 'REPORT';
809 
810     END IF;
811 
812     x_stmv_rec                     := l_stmv_rec;
813     --x_return_status                := G_RET_STS_SUCCESS;
814 
815     IF (G_IS_DEBUG_STATEMENT_ON = true) THEN
816           OKL_DEBUG_PUB.LOG_DEBUG(FND_LOG.LEVEL_STATEMENT, G_MODULE, l_prog_name || 'end' );
817     END IF;
818   EXCEPTION
819 
820     WHEN OKL_API.G_EXCEPTION_ERROR THEN
821 
822       x_return_status := OKL_API.G_RET_STS_ERROR;
823 
824     WHEN OKL_API.G_EXCEPTION_UNEXPECTED_ERROR THEN
825 
826       x_return_status := OKL_API.G_RET_STS_UNEXP_ERROR;
827 
828     WHEN OTHERS THEN
829 
830       OKL_API.SET_MESSAGE( p_app_name     => G_APP_NAME
831                         ,p_msg_name     => G_UNEXPECTED_ERROR
832                         ,p_token1       => G_SQLCODE_TOKEN
833                         ,p_token1_value => SQLCODE
834                         ,p_token2       => G_SQLERRM_TOKEN
835                         ,p_token2_value => SQLERRM);
836 
837       x_return_status := OKL_API.G_RET_STS_UNEXP_ERROR;
838 
839   END get_stream_header;
840 
841 --------------------------------------------------------------------------------
842 --Modified from okl_stream_generator_pvt.generate_stub_element
843 --------------------------------------------------------------------------------
844 
845   Procedure generate_stub_element(p_khr_id   IN NUMBER,
846                                   p_api_version   IN  NUMBER,
847                                   p_init_msg_list IN  VARCHAR2,
848                                   x_msg_count     OUT NOCOPY NUMBER,
849                                   x_msg_data      OUT NOCOPY VARCHAR2,
850                                   x_return_status OUT NOCOPY VARCHAR2,
851                                   x_stmv_rec      OUT NOCOPY OKL_STREAMS_PUB.stmv_rec_type,
852                                   x_selv_tbl      OUT NOCOPY OKL_STREAMS_PUB.selv_tbl_type
853 				                  ) Is
854 
855     l_return_status        VARCHAR2(1)  default OKL_API.G_RET_STS_SUCCESS;
856     l_api_name             CONSTANT     varchar2(30) := 'GENERATE_STUB_ELEMENT';
857     l_api_version          CONSTANT     NUMBER := 1.0;
858 
859 
860    l_prog_name                CONSTANT VARCHAR2(100) := G_PKG_NAME||'.'||'generate_stub_element';
861    l_selv_tbl                 OKL_STREAMS_PUB.selv_tbl_type;
862    l_stmv_rec                 OKL_STREAMS_PUB.stmv_rec_type;
863    --avsingh :
864    lx_selv_tbl                 OKL_STREAMS_PUB.selv_tbl_type;
865    lx_stmv_rec                 OKL_STREAMS_PUB.stmv_rec_type;
866 
867 
868    l_sty_id NUMBER;
869 
870    Cursor c_sty IS
871    Select id
872    from okl_strm_type_v
873    --BUG# 4181025
874    --where name = 'RENT';
875    where stream_type_purpose = 'RENT';
876 
877   Begin
878 
879     x_return_status := OKL_API.G_RET_STS_SUCCESS;
880     -- Call start_activity to create savepoint, check compatibility
881     -- and initialize message list
882     x_return_status := OKL_API.START_ACTIVITY (
883                                l_api_name
884                                ,p_init_msg_list
885                                ,'_PVT'
886                                ,x_return_status);
887     -- Check if activity started successfully
888     IF (x_return_status = OKL_API.G_RET_STS_UNEXP_ERROR) THEN
889        RAISE OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
890     ELSIF (x_return_status = OKL_API.G_RET_STS_ERROR) THEN
891        RAISE OKL_API.G_EXCEPTION_ERROR;
892     END IF;
893 
894 
895 
896      OPEN c_sty;
897      FETCH c_sty INTO l_sty_id;
898      CLOSE c_sty;
899 
900      get_stream_header( p_khr_id         =>   p_khr_id,
901                         p_kle_id         =>   NULL,
902                         p_sty_id         =>   l_sty_id,
903                         p_purpose_code   =>   'STUBS',
904                         x_stmv_rec       =>   l_stmv_rec,
905                         x_return_status  =>   x_return_status);
906 
907       IF x_return_status = OKL_API.G_RET_STS_UNEXP_ERROR THEN
908         RAISE OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
909       ELSIF x_return_status = OKL_API.G_RET_STS_ERROR THEN
910         RAISE OKL_API.G_EXCEPTION_ERROR;
911       END IF;
912 
913      l_stmv_rec.date_history    := sysdate  ;
914      l_stmv_rec.say_code        :=  'HIST' ;
915      l_stmv_rec.SGN_CODE        :=  'MANL';
916      l_stmv_rec.active_yn       :=  'N';
917      l_stmv_rec.purpose_code    :=  'STUBS';
918      l_stmv_rec.comments        :=  'STUB STREAMS';
919 
920      l_selv_tbl(1).stream_element_date := sysdate;
921      l_selv_tbl(1).amount              := 0.0;
922      l_selv_tbl(1).se_line_number      := 1 ;
923      l_selv_tbl(1).comments            := 'STUB STREAM ELEMENT' ;
924      l_selv_tbl(1).parent_index        := 1 ;
925 
926 
927      okl_streams_pvt.create_streams(
928                      p_api_version     => p_api_version
929 					,p_init_msg_list   => p_init_msg_list
930 					,x_return_status   => x_return_status
931 					,x_msg_count       => x_msg_count
932 					,x_msg_data        => x_msg_data
933 					,p_stmv_rec        => l_stmv_rec
934 					,p_selv_tbl        => l_selv_tbl
935 					,x_stmv_rec        => lx_stmv_rec
936 					,x_selv_tbl        => lx_selv_tbl
937                                     );
938 
939     IF (x_return_status = OKL_API.G_RET_STS_UNEXP_ERROR) THEN
940        RAISE OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
941     ELSIF (x_return_status = OKL_API.G_RET_STS_ERROR) THEN
942        RAISE OKL_API.G_EXCEPTION_ERROR;
943     END IF;
944 
945 
946      --x_se_id := lx_selv_tbl(1).id;
947      x_stmv_rec := lx_stmv_rec;
948      x_selv_tbl := lx_selv_tbl;
949      OKL_API.END_ACTIVITY (x_msg_count,x_msg_data );
950 
951       EXCEPTION
952 
953       WHEN OKL_API.G_EXCEPTION_ERROR THEN
954       x_return_status := OKL_API.HANDLE_EXCEPTIONS(
955                                  l_api_name,
956                                  G_PKG_NAME,
957                                  'OKL_API.G_RET_STS_ERROR',
958                                  x_msg_count,
959                                  x_msg_data,
960                                  '_PVT');
961       WHEN OKL_API.G_EXCEPTION_UNEXPECTED_ERROR THEN
962       x_return_status :=OKL_API.HANDLE_EXCEPTIONS(
963                                 l_api_name,
964                                 G_PKG_NAME,
965                                 'OKL_API.G_RET_STS_UNEXP_ERROR',
966                                 x_msg_count,
967                                 x_msg_data,
968                                 '_PVT');
969       WHEN OTHERS THEN
970       x_return_status :=OKL_API.HANDLE_EXCEPTIONS(
971                                 l_api_name,
972                                 G_PKG_NAME,
973                                 'OTHERS',
974                                 x_msg_count,
975                                 x_msg_data,
976                                 '_PVT');
977   end generate_stub_element;
978 
979 --------------------------------------------------------------------------------
980 --Modified from okl_stream_generator_pvt.generate cash flows
981 --------------------------------------------------------------------------------
982   PROCEDURE generate_cash_flows(
983                              p_api_version   IN  NUMBER,
984                              p_init_msg_list IN  VARCHAR2,
985                              p_khr_id        IN  NUMBER,
986 		             p_kle_id        IN  NUMBER,
987 		             p_sty_id        IN  NUMBER,
988 		             p_payment_tbl   IN  okl_stream_generator_pvt.payment_tbl_type,
989                              x_return_status OUT NOCOPY VARCHAR2,
990                              x_msg_count     OUT NOCOPY NUMBER,
991                              x_msg_data      OUT NOCOPY VARCHAR2,
992                              x_stmv_rec_rent OUT NOCOPY okl_streams_pub.stmv_rec_type,
993                              x_selv_tbl_rent OUT NOCOPY okl_streams_pub.selv_tbl_type,
994                              x_stmv_rec_stub OUT NOCOPY okl_streams_pub.stmv_rec_type,
995                              x_selv_tbl_stub OUT NOCOPY okl_streams_pub.selv_tbl_type,
996                              x_payment_count OUT NOCOPY BINARY_INTEGER) IS
997 
998     l_return_status        VARCHAR2(1)  default OKL_API.G_RET_STS_SUCCESS;
999     l_api_name             CONSTANT     varchar2(30) := 'GENERATE_CASH_FLOWS';
1000     l_api_version          CONSTANT     NUMBER := 1.0;
1001 
1002 
1003       CURSOR c_hdr IS
1004       SELECT chr.template_yn,
1005              chr.currency_code,
1006              chr.start_date,
1007              khr.deal_type,
1008              khr.term_duration,
1009              NVL(khr.generate_accrual_yn, 'Y')
1010       FROM   okc_k_headers_b chr,
1011              okl_k_headers khr
1012       WHERE  khr.id = p_khr_id
1013         AND  chr.id = khr.id;
1014 
1015     l_hdr                    c_hdr%ROWTYPE;
1016     l_deal_type              VARCHAR2(30);
1017     l_purpose_code           VARCHAR2(30) := 'FLOW';
1018 
1019     l_pt_yn                  VARCHAR2(1);
1020     l_passthrough_id         NUMBER;
1021 
1022     l_sty_id                 NUMBER;
1023     l_sty_name               VARCHAR2(150);
1024     l_mapped_sty_name        VARCHAR2(150);
1025 
1026     l_pre_tax_inc_id         NUMBER;
1027     l_principal_id           NUMBER;
1028     l_interest_id            NUMBER;
1029     l_prin_bal_id            NUMBER;
1030     l_termination_id         NUMBER;
1031 
1032     l_selv_tbl               okl_streams_pub.selv_tbl_type;
1033     l_pt_tbl                 okl_streams_pub.selv_tbl_type;
1034     lx_selv_tbl              okl_streams_pub.selv_tbl_type;
1035 
1036     l_stmv_rec               okl_streams_pub.stmv_rec_type;
1037     l_pt_rec                 okl_streams_pub.stmv_rec_type;
1038     lx_stmv_rec              okl_streams_pub.stmv_rec_type;
1039 
1040     i                        BINARY_INTEGER := 0;
1041     j                        BINARY_INTEGER := 0;
1042     l_ele_count              BINARY_INTEGER := 0;
1043     k                        BINARY_INTEGER := 0;
1044 
1045     l_adv_arr                VARCHAR2(30);
1046 
1047 
1048 
1049     l_prog_name         CONSTANT VARCHAR2(61) := G_PKG_NAME||'.'||'generate_cash_flows';
1050     l_se_id NUMBER;
1051 
1052     --avsingh
1053     l_stmv_rec_stub     okl_streams_pub.stmv_rec_type;
1054     l_selv_tbl_stub     okl_streams_pub.selv_tbl_type;
1055     l_stmv_rec_rent     okl_streams_pub.stmv_rec_type;
1056     l_selv_tbl_rent     okl_streams_pub.selv_tbl_type;
1057 
1058 
1059 
1060   BEGIN
1061     IF (G_DEBUG_ENABLED = 'Y') THEN
1062       G_IS_DEBUG_STATEMENT_ON := OKL_DEBUG_PUB.CHECK_LOG_ON(G_MODULE, FND_LOG.LEVEL_STATEMENT);
1063     END IF;
1064 
1065       x_return_status := OKL_API.G_RET_STS_SUCCESS;
1066       -- Call start_activity to create savepoint, check compatibility
1067       -- and initialize message list
1068       x_return_status := OKL_API.START_ACTIVITY (
1069                                  l_api_name
1070                                  ,p_init_msg_list
1071                                  ,'_PVT'
1072                                  ,x_return_status);
1073       -- Check if activity started successfully
1074       IF (x_return_status = OKL_API.G_RET_STS_UNEXP_ERROR) THEN
1075          RAISE OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
1076       ELSIF (x_return_status = OKL_API.G_RET_STS_ERROR) THEN
1077          RAISE OKL_API.G_EXCEPTION_ERROR;
1078       END IF;
1079 
1080 
1081     IF (G_IS_DEBUG_STATEMENT_ON = true) THEN
1082           OKL_DEBUG_PUB.LOG_DEBUG(FND_LOG.LEVEL_STATEMENT, G_MODULE, l_prog_name || 'begin' );
1083     END IF;
1084     OPEN  c_hdr;
1085     FETCH c_hdr INTO l_hdr;
1086     CLOSE c_hdr;
1087 
1088     generate_stub_element( p_api_version   => p_api_version,
1089                            p_init_msg_list => p_init_msg_list,
1090                            p_khr_id        => p_khr_id,
1091                            x_return_status => x_return_status,
1092                            x_msg_count     => x_msg_count,
1093                            x_msg_data      => x_msg_data,
1094                            x_stmv_rec      => l_stmv_rec_stub,
1095                            x_selv_tbl      => l_selv_tbl_stub);
1096 
1097     IF x_return_status = OKL_API.G_RET_STS_UNEXP_ERROR THEN
1098       RAISE OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
1099     ELSIF x_return_status = OKL_API.G_RET_STS_ERROR THEN
1100       RAISE OKL_API.G_EXCEPTION_ERROR;
1101     END IF;
1102 
1103     l_se_id   := l_selv_tbl_stub(1).id;
1104 
1105       ---------------------------------------------
1106       -- STEP 1: Spread cash INFLOW
1107       ---------------------------------------------
1108 
1109       IF (G_IS_DEBUG_STATEMENT_ON = true) THEN
1110               OKL_DEBUG_PUB.LOG_DEBUG(FND_LOG.LEVEL_STATEMENT, G_MODULE, l_prog_name || ' generating streams - begin');
1111 
1112       END IF;
1113       get_stream_header(p_khr_id         =>   p_khr_id,
1114                         p_kle_id         =>   p_kle_id,
1115                         p_sty_id         =>   p_sty_id,
1116                         p_purpose_code   =>   l_purpose_code,
1117                         x_stmv_rec       =>   l_stmv_rec,
1118                         x_return_status  =>   x_return_status);
1119 
1120       IF x_return_status = OKL_API.G_RET_STS_UNEXP_ERROR THEN
1121         RAISE OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
1122       ELSIF x_return_status = OKL_API.G_RET_STS_ERROR THEN
1123         RAISE OKL_API.G_EXCEPTION_ERROR;
1124       END IF;
1125 
1126       l_stmv_rec.purpose_code := 'FLOW';
1127 
1128       okl_streams_pub.create_streams(p_api_version     =>   p_api_version,
1129                                      p_init_msg_list   =>   p_init_msg_list,
1130                                      x_return_status   =>   x_return_status,
1131                                      x_msg_count       =>   x_msg_count,
1132                                      x_msg_data        =>   x_msg_data,
1133                                      p_stmv_rec        =>   l_stmv_rec,
1134                                      x_stmv_rec        =>   lx_stmv_rec);
1135 
1136       IF x_return_status = OKL_API.G_RET_STS_UNEXP_ERROR THEN
1137         RAISE OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
1138       ELSIF x_return_status = OKL_API.G_RET_STS_ERROR THEN
1139         RAISE OKL_API.G_EXCEPTION_ERROR;
1140       END IF;
1141 
1142       l_stmv_rec_rent := lx_stmv_rec;
1143 
1144       IF (G_IS_DEBUG_STATEMENT_ON = true) THEN
1145               OKL_DEBUG_PUB.LOG_DEBUG(FND_LOG.LEVEL_STATEMENT, G_MODULE, l_prog_name || 'created header' );
1146       END IF;
1147       x_payment_count  :=  0;
1148       l_ele_count := 0;
1149       FOR i IN p_payment_tbl.FIRST..p_payment_tbl.LAST
1150       LOOP
1151 
1152         IF p_payment_tbl(i).start_date IS NULL THEN
1153 
1154           OKL_API.SET_MESSAGE (p_app_name     => G_APP_NAME,
1155                                p_msg_name     => 'OKL_NO_SLL_SDATE');
1156 
1157           RAISE OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
1158 
1159         END IF;
1160 
1161 /*
1162  * calculate stream elements for each payment level
1163  * also means that if there are multiple payment levels for an asset, streams are
1164  * calculated at different points.
1165  * the streams amounts are they are entered in payments. In case of passthru, a
1166  * new set of streams are created with amounts that are passthru'ed - l_pt_tbl.
1167  */
1168         If ( p_payment_tbl(i).arrears_yn = 'Y' ) Then
1169             l_adv_arr := 'ARREARS';
1170 	    Else
1171             l_adv_arr := 'ADVANCE';
1172 	    End If;
1173 
1174         IF (G_IS_DEBUG_STATEMENT_ON = true) THEN
1175                   OKL_DEBUG_PUB.LOG_DEBUG(FND_LOG.LEVEL_STATEMENT, G_MODULE, l_prog_name || 'start date ' || p_payment_tbl(i).start_date );
1176         END IF;
1177         get_stream_elements( p_start_date          =>   p_payment_tbl(i).start_date,
1178                              p_periods             =>   p_payment_tbl(i).periods,
1179                              p_frequency           =>   p_payment_tbl(i).frequency,
1180                              p_structure           =>   p_payment_tbl(i).structure,
1181                              p_advance_or_arrears  =>   l_adv_arr,
1182                              p_amount              =>   p_payment_tbl(i).amount,
1183 			                 p_stub_days           =>   p_payment_tbl(i).stub_days,
1184 			                 p_stub_amount         =>   p_payment_tbl(i).stub_amount,
1185                              p_currency_code       =>   l_hdr.currency_code,
1186                              p_khr_id              =>   p_khr_id,
1187                              p_kle_id              =>   p_kle_id,
1188                              p_purpose_code        =>   l_purpose_code,
1189                              x_selv_tbl            =>   l_selv_tbl,
1190                              x_pt_tbl              =>   l_pt_tbl,
1191                              x_return_status       =>   x_return_status,
1192                              x_msg_count           =>   x_msg_count,
1193                              x_msg_data            =>   x_msg_data);
1194 
1195         IF x_return_status = OKL_API.G_RET_STS_UNEXP_ERROR THEN
1196           RAISE OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
1197         ELSIF x_return_status = OKL_API.G_RET_STS_ERROR THEN
1198           RAISE OKL_API.G_EXCEPTION_ERROR;
1199         END IF;
1200 
1201         IF (G_IS_DEBUG_STATEMENT_ON = true) THEN
1202                   OKL_DEBUG_PUB.LOG_DEBUG(FND_LOG.LEVEL_STATEMENT, G_MODULE, l_prog_name || 'created elements ' || to_char(l_selv_tbl.COUNT) );
1203         END IF;
1204         FOR j in 1..l_selv_tbl.COUNT
1205 	    LOOP
1206 	        l_ele_count                  := l_ele_count + 1;
1207 	        l_selv_tbl(j).stm_id         := lx_stmv_rec.id;
1208 	        l_selv_tbl(j).se_line_number := l_ele_count;
1209 	        l_selv_tbl(j).id             := NULL;
1210 	    END LOOP;
1211 
1212         If ( p_payment_tbl(i).stub_days IS NOT NULL ) AND ( p_payment_tbl(i).periods IS NULL ) Then
1213 
1214   	        FOr i in 1..l_selv_tbl.COUNT
1215 	        LOOP
1216 	            l_selv_tbl(i).sel_id := l_se_id;
1217 	        END LOOP;
1218 
1219 	        FOr i in 1..l_pt_tbl.COUNT
1220 	        LOOP
1221 	            l_pt_tbl(i).sel_id := l_se_id;
1222 	        END LOOP;
1223 
1224    	    End If;
1225 
1226         IF (G_IS_DEBUG_STATEMENT_ON = true) THEN
1227                   OKL_DEBUG_PUB.LOG_DEBUG(FND_LOG.LEVEL_STATEMENT, G_MODULE, l_prog_name || 'start date ' || l_selv_tbl(1).stream_element_date );
1228         END IF;
1229         okl_streams_pub.create_stream_elements(
1230 	                                   p_api_version     =>   p_api_version,
1231                                        p_init_msg_list   =>   p_init_msg_list,
1232                                        x_return_status   =>   x_return_status,
1233                                        x_msg_count       =>   x_msg_count,
1234                                        x_msg_data        =>   x_msg_data,
1235                                        p_selv_tbl        =>   l_selv_tbl,
1236                                        x_selv_tbl        =>   lx_selv_tbl);
1237 
1238         IF x_return_status = OKL_API.G_RET_STS_UNEXP_ERROR THEN
1239           RAISE OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
1240         ELSIF x_return_status = OKL_API.G_RET_STS_ERROR THEN
1241           RAISE OKL_API.G_EXCEPTION_ERROR;
1242         END IF;
1243 
1244         IF (G_IS_DEBUG_STATEMENT_ON = true) THEN
1245                   OKL_DEBUG_PUB.LOG_DEBUG(FND_LOG.LEVEL_STATEMENT, G_MODULE, l_prog_name || 'created elements ' || to_char(l_ele_count) );
1246         END IF;
1247         If l_selv_tbl_rent.COUNT = 0 then
1248              l_selv_tbl_rent := lx_selv_tbl;
1249         Else
1250              k := l_selv_tbl_rent.LAST;
1251              For j in lx_selv_tbl.FIRST..lx_selv_tbl.LAST
1252              Loop
1253                  k := k + 1;
1254                  l_selv_tbl_rent(k) := lx_selv_tbl(j);
1255              End Loop;
1256         End If;
1257         l_selv_tbl.DELETE;
1258         -- Clear out reusable data structures
1259 
1260 
1261         l_pt_rec := NULL;
1262         l_selv_tbl.delete;
1263         l_pt_tbl.delete;
1264 
1265         lx_selv_tbl.delete;
1266 
1267          x_payment_count  :=  x_payment_count + 1;
1268          IF (G_IS_DEBUG_STATEMENT_ON = true) THEN
1269                     OKL_DEBUG_PUB.LOG_DEBUG(FND_LOG.LEVEL_STATEMENT, G_MODULE, l_prog_name || ' payment count ' || to_char(x_payment_count) );
1270 
1271          END IF;
1272       END LOOP;
1273 
1274       IF (G_IS_DEBUG_STATEMENT_ON = true) THEN
1275               OKL_DEBUG_PUB.LOG_DEBUG(FND_LOG.LEVEL_STATEMENT, G_MODULE, l_prog_name || ' done ' );
1276 
1277       END IF;
1278       l_sty_name  :=  NULL;
1279       l_sty_id    :=  NULL;
1280       l_stmv_rec  := NULL;
1281       lx_stmv_rec := NULL;
1282 
1283       x_stmv_rec_stub := l_stmv_rec_stub;
1284       x_selv_tbl_stub := l_selv_tbl_stub;
1285       x_stmv_rec_rent := l_stmv_rec_rent;
1286       x_selv_tbl_rent := l_selv_tbl_rent;
1287 
1288      OKL_API.END_ACTIVITY (x_msg_count,x_msg_data );
1289 
1290       EXCEPTION
1291 
1292       WHEN OKL_API.G_EXCEPTION_ERROR THEN
1293       x_return_status := OKL_API.HANDLE_EXCEPTIONS(
1294                                  l_api_name,
1295                                  G_PKG_NAME,
1296                                  'OKL_API.G_RET_STS_ERROR',
1297                                  x_msg_count,
1298                                  x_msg_data,
1299                                  '_PVT');
1300       WHEN OKL_API.G_EXCEPTION_UNEXPECTED_ERROR THEN
1301       x_return_status :=OKL_API.HANDLE_EXCEPTIONS(
1302                                 l_api_name,
1303                                 G_PKG_NAME,
1304                                 'OKL_API.G_RET_STS_UNEXP_ERROR',
1305                                 x_msg_count,
1306                                 x_msg_data,
1307                                 '_PVT');
1308       WHEN OTHERS THEN
1309       x_return_status :=OKL_API.HANDLE_EXCEPTIONS(
1310                                 l_api_name,
1311                                 G_PKG_NAME,
1312                                 'OTHERS',
1313                                 x_msg_count,
1314                                 x_msg_data,
1315                                 '_PVT');
1316 
1317   END generate_cash_flows;
1318 
1319   -----------------------------------------------------------
1320   --Local procedure PV calculation - calls ISG API
1321   -----------------------------------------------------------
1322   Procedure calculate_pv  (p_api_version       IN NUMBER,
1323                            p_init_msg_list     IN VARCHAR2,
1324                            x_return_status     OUT NOCOPY VARCHAR2,
1325                            x_msg_count         OUT NOCOPY NUMBER,
1326                            x_msg_data          OUT NOCOPY VARCHAR2,
1327                            p_chr_id            IN  NUMBER,
1328                            p_asset_cle_id      IN  NUMBER,
1329                            p_payment_tbl       IN  OKL_STREAM_GENERATOR_PVT.payment_tbl_type,
1330                            p_irr               IN  NUMBER,
1331                            x_npv               OUT NOCOPY NUMBER
1332                           ) is
1333 
1334    l_return_status        VARCHAR2(1)  default OKL_API.G_RET_STS_SUCCESS;
1335    l_api_name             CONSTANT     varchar2(30) := 'CALCULATE_NPV';
1336    l_api_version          CONSTANT     NUMBER := 1.0;
1337 
1338    cursor l_cleb_csr (p_cle_id in number) is
1339    select cleb.start_date,
1340           cleb.end_date
1341    from   okc_k_lines_b cleb
1342    where  cleb.id = p_cle_id;
1343 
1344    l_start_date  okc_k_lines_b.start_date%TYPE;
1345    l_end_date    okc_k_lines_b.end_date%TYPE;
1346    i             NUMBER;
1347 
1348    l_stmv_rec_rent     okl_streams_pub.stmv_rec_type;
1349    l_selv_tbl_rent     okl_streams_pub.selv_tbl_type;
1350    l_stmv_rec_stub     okl_streams_pub.stmv_rec_type;
1351    l_selv_tbl_stub     okl_streams_pub.selv_tbl_type;
1352 
1353    l_payment_count     BINARY_INTEGER;
1354    l_sty_id            NUMBER;
1355    l_npv               NUMBER;
1356    l_kle_yld         NUMBER;
1357    l_days              NUMBER;
1358 
1359    --cursor to ger stream type id
1360    cursor l_styb_csr(p_strm_type in varchar2) is
1361    select styb.id
1362    from   okl_strm_type_b styb
1363    --Bug# 4181025
1364    --where  code = p_strm_type;
1365    where  stream_type_purpose = p_strm_type;
1366    l_pv number;
1367    l_cash_flow_tbl okl_stream_generator_pvt.cash_flow_tbl;
1368   Begin
1369     IF (G_DEBUG_ENABLED = 'Y') THEN
1370       G_IS_DEBUG_STATEMENT_ON := OKL_DEBUG_PUB.CHECK_LOG_ON(G_MODULE, FND_LOG.LEVEL_STATEMENT);
1371     END IF;
1372 
1373       x_return_status := OKL_API.G_RET_STS_SUCCESS;
1374       -- Call start_activity to create savepoint, check compatibility
1375       -- and initialize message list
1376       x_return_status := OKL_API.START_ACTIVITY (
1377                                l_api_name
1378                                ,p_init_msg_list
1379                                ,'_PVT'
1380                                ,x_return_status);
1381       -- Check if activity started successfully
1382       IF (x_return_status = OKL_API.G_RET_STS_UNEXP_ERROR) THEN
1383          RAISE OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
1384       ELSIF (x_return_status = OKL_API.G_RET_STS_ERROR) THEN
1385          RAISE OKL_API.G_EXCEPTION_ERROR;
1386       END IF;
1387 
1388       open l_styb_csr(p_strm_type => 'RENT');
1389       fetch l_styb_csr into l_sty_id;
1390       if l_styb_csr%NOTFOUND then
1391           null;
1392       end if;
1393       close l_styb_csr;
1394 
1395       generate_cash_flows(p_api_version   => p_api_version,
1396                           p_init_msg_list => p_init_msg_list,
1397                           p_khr_id        => p_chr_id,
1398                           p_kle_id        => p_asset_cle_id,
1399 		          p_sty_id        => l_sty_id,
1400 		          p_payment_tbl   => p_payment_tbl,
1401                           x_return_status => x_return_status,
1402                           x_msg_count     => x_msg_count,
1403                           x_msg_data      => x_msg_data,
1404                           x_stmv_rec_rent => l_stmv_rec_rent,
1405                           x_selv_tbl_rent => l_selv_tbl_rent,
1406                           x_stmv_rec_stub => l_stmv_rec_stub,
1407                           x_selv_tbl_stub => l_selv_tbl_stub,
1408                           x_payment_count => l_payment_count);
1409 
1410       IF (x_return_status = OKL_API.G_RET_STS_UNEXP_ERROR) THEN
1411          RAISE OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
1412       ELSIF (x_return_status = OKL_API.G_RET_STS_ERROR) THEN
1413          RAISE OKL_API.G_EXCEPTION_ERROR;
1414       END IF;
1415 
1416 
1417       l_npv := 0.0;
1418 
1419       open l_cleb_csr(p_cle_id => p_asset_cle_id);
1420       Fetch l_cleb_csr into l_start_date,
1421                             l_end_date;
1422       IF l_cleb_csr%NOTFOUND then
1423          NULL;
1424       END IF;
1425       close l_cleb_csr;
1426 
1427       FOR i in l_selv_tbl_rent.FIRST..l_selv_tbl_rent.LAST
1428       LOOP
1429 
1430           l_pv := 0;
1431           IF (G_IS_DEBUG_STATEMENT_ON = true) THEN
1432                       OKL_DEBUG_PUB.LOG_DEBUG(FND_LOG.LEVEL_STATEMENT, G_MODULE, l_api_name || ' frequency ' || p_payment_tbl(1).frequency );
1433           END IF;
1434           OKL_STREAM_GENERATOR_PVT.get_present_value(p_api_version    => p_api_version,
1435                                                      p_init_msg_list  => p_init_msg_list,
1436 	                                             p_amount_date    => l_selv_tbl_rent(i).stream_element_date,
1437 	                                             p_amount         => l_selv_tbl_rent(i).amount,
1438                                                      p_frequency      => p_payment_tbl(1).frequency,
1439          	                                     p_rate           => p_irr,
1440                                                      p_pv_date        => l_start_date,
1441 		                                     x_pv_amount      => l_pv,
1442                                                      x_return_status  => x_return_status,
1443                                                      x_msg_count      => x_msg_count,
1444                                                      x_msg_data       => x_msg_data);
1445 
1446           IF (x_return_status = OKL_API.G_RET_STS_UNEXP_ERROR) THEN
1447               RAISE OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
1448           ELSIF (x_return_status = OKL_API.G_RET_STS_ERROR) THEN
1449               RAISE OKL_API.G_EXCEPTION_ERROR;
1450           END IF;
1451 
1452           l_npv := l_npv + l_pv;
1453           IF (G_IS_DEBUG_STATEMENT_ON = true) THEN
1454                       OKL_DEBUG_PUB.LOG_DEBUG(FND_LOG.LEVEL_STATEMENT, G_MODULE, l_api_name || ' amount ' || to_char(l_npv) );
1455 
1456           END IF;
1457       END LOOP;
1458       x_npv := l_npv;
1459 
1460       --delete streams created for this temporary calculation
1461       okl_streams_pub.delete_streams(
1462        p_api_version      => p_api_version,
1463        p_init_msg_list    => p_init_msg_list,
1464        x_return_status    => x_return_status,
1465        x_msg_count        => x_msg_count,
1466        x_msg_data         => x_msg_data,
1467        p_stmv_rec         => l_stmv_rec_stub);
1468 
1469       IF x_return_status = OKL_API.G_RET_STS_UNEXP_ERROR THEN
1470         RAISE OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
1471       ELSIF x_return_status = OKL_API.G_RET_STS_ERROR THEN
1472         RAISE OKL_API.G_EXCEPTION_ERROR;
1473       END IF;
1474 
1475 
1476       okl_streams_pub.delete_streams(
1477        p_api_version      => p_api_version,
1478        p_init_msg_list    => p_init_msg_list,
1479        x_return_status    => x_return_status,
1480        x_msg_count        => x_msg_count,
1481        x_msg_data         => x_msg_data,
1482        p_stmv_rec         => l_stmv_rec_rent);
1483 
1484       IF x_return_status = OKL_API.G_RET_STS_UNEXP_ERROR THEN
1485         RAISE OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
1486       ELSIF x_return_status = OKL_API.G_RET_STS_ERROR THEN
1487         RAISE OKL_API.G_EXCEPTION_ERROR;
1488       END IF;
1489 
1490       OKL_API.END_ACTIVITY (x_msg_count,x_msg_data );
1491 
1492       EXCEPTION
1493 
1494       WHEN OKL_API.G_EXCEPTION_ERROR THEN
1495       If l_cleb_csr%ISOPEN then
1496           close l_cleb_csr;
1497       End If;
1498       If l_styb_csr%ISOPEN then
1499           close l_styb_csr;
1500       End If;
1501       x_return_status := OKL_API.HANDLE_EXCEPTIONS(
1502                                l_api_name,
1503                                G_PKG_NAME,
1504                                'OKL_API.G_RET_STS_ERROR',
1505                                x_msg_count,
1506                                x_msg_data,
1507                                '_PVT');
1508       WHEN OKL_API.G_EXCEPTION_UNEXPECTED_ERROR THEN
1509       If l_cleb_csr%ISOPEN then
1510           close l_cleb_csr;
1511       End If;
1512       If l_styb_csr%ISOPEN then
1513           close l_styb_csr;
1514       End If;
1515       x_return_status :=OKL_API.HANDLE_EXCEPTIONS(
1516                               l_api_name,
1517                               G_PKG_NAME,
1518                               'OKL_API.G_RET_STS_UNEXP_ERROR',
1519                               x_msg_count,
1520                               x_msg_data,
1521                               '_PVT');
1522       WHEN OTHERS THEN
1523       If l_cleb_csr%ISOPEN then
1524           close l_cleb_csr;
1525       End If;
1526       If l_styb_csr%ISOPEN then
1527           close l_styb_csr;
1528       End If;
1529       x_return_status :=OKL_API.HANDLE_EXCEPTIONS(
1530                               l_api_name,
1531                               G_PKG_NAME,
1532                               'OTHERS',
1533                               x_msg_count,
1534                               x_msg_data,
1535                               '_PVT');
1536   End calculate_pv;
1537 --End Rate Points Calc
1538 --------------------------------------------------------------------------------
1539 --Name         : get_rate_points_amount
1540 --Description  : API to calculate rate point subsidy amount for a subsidy line
1541 --
1542 -- PARAMETERS  : IN - p_subsidy_cle_id  : subsidy line id
1543 --                    rate_points       : rate points as specified in setup
1544 --               OUT - x_subsidy_amount : calculated subsidy amount
1545 --------------------------------------------------------------------------------
1546 PROCEDURE calc_rate_points_amount(
1547     p_api_version                  IN NUMBER,
1548     p_init_msg_list                IN VARCHAR2,
1549     x_return_status                OUT NOCOPY VARCHAR2,
1550     x_msg_count                    OUT NOCOPY NUMBER,
1551     x_msg_data                     OUT NOCOPY VARCHAR2,
1552     p_rate_points                  IN  NUMBER,
1553     p_chr_id                       IN  NUMBER,
1554     p_asset_cle_id                 IN  NUMBER,
1555     x_subsidy_amount               OUT NOCOPY NUMBER) is
1556 
1557     l_return_status        VARCHAR2(1)  default OKL_API.G_RET_STS_SUCCESS;
1558     l_api_name             CONSTANT     varchar2(30) := 'GET_RATE_POINTS';
1559     l_api_version          CONSTANT     NUMBER := 1.0;
1560 
1561 -- Added sll_rulb.rule_information2 in order by clause for bug#6007644 - varangan-14-Jun-07
1562     cursor l_rent_csr (p_asset_cle_id in number) is
1563     select sll_rulb.rule_information2         start_date,
1564        sll_rulb.rule_information3             periods,
1565        sll_rulb.object1_id1                   frequency,
1566        sll_rulb.rule_information5             structure,
1567        nvl( sll_rulb.rule_information10,'N')  arrears_yn,
1568        sll_rulb.rule_information6             amount,
1569        sll_rulb.rule_information7             stub_days,
1570        sll_rulb.rule_information8             stub_amount,
1571        sll_rulb.rule_information13            rate
1572     from   okc_rules_b        sll_rulb,
1573        okc_rules_b        slh_rulb,
1574        okl_strm_type_b    styb,
1575        okc_rule_groups_b  rgpb
1576     where  sll_rulb.rgp_id                      = rgpb.id
1577     and    sll_rulb.rule_information_category   = 'LASLL'
1578     and    sll_rulb.dnz_chr_id                  = rgpb.dnz_chr_id
1579     and    sll_rulb.object2_id1                 = to_char(slh_rulb.id)
1580     and    slh_rulb.rgp_id                      = rgpb.id
1581     and    slh_rulb.rule_information_category   = 'LASLH'
1582     and    slh_rulb.dnz_chr_id                  = rgpb.dnz_chr_id
1583     and    styb.id                              = slh_rulb.object1_id1
1584     --Bug# 4181025 :
1585     --and    styb.code                            = 'RENT'
1586     and    styb.stream_type_purpose             = 'RENT'
1587     and    rgpb.cle_id                          = p_asset_cle_id
1588     and    rgpb.rgd_code                        = 'LALEVL'
1589     order by FND_DATE.canonical_to_date(sll_rulb.rule_information2);
1590 
1591     l_rent_rec          l_rent_csr%RowType;
1592     l_payment_tbl       OKL_STREAM_GENERATOR_PVT.payment_tbl_type;
1593     lx_payment_tbl      OKL_STREAM_GENERATOR_PVT.payment_tbl_type;
1594     l_payment_tbl_miss  OKL_STREAM_GENERATOR_PVT.payment_tbl_type;
1595 
1596     i                   number;
1597     l_orig_irr          number;
1598     lx_orig_irr         number;
1599     l_modified_irr      number;
1600     l_rate_points       number;
1601 
1602     l_subsidy_amount    number;
1603 
1604     l_npv_new           number;
1605     l_npv_orig          number;
1606 
1607     --cursor to get asset number for error message
1608     cursor l_astnum_csr (p_cle_id in number) is
1609     select clet.name
1610     from   okc_k_lines_tl clet
1611     where  id         = p_cle_id
1612     and    language    = userenv('LANG');
1613 
1614     l_asset_number okc_k_lines_tl.name%TYPE;
1615 
1616 begin
1617     x_return_status := OKL_API.G_RET_STS_SUCCESS;
1618     -- Call start_activity to create savepoint, check compatibility
1619     -- and initialize message list
1620     x_return_status := OKL_API.START_ACTIVITY (
1621                                l_api_name
1622                                ,p_init_msg_list
1623                                ,'_PVT'
1624                                ,x_return_status);
1625     -- Check if activity started successfully
1626     IF (x_return_status = OKL_API.G_RET_STS_UNEXP_ERROR) THEN
1627        RAISE OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
1628     ELSIF (x_return_status = OKL_API.G_RET_STS_ERROR) THEN
1629        RAISE OKL_API.G_EXCEPTION_ERROR;
1630     END IF;
1631 
1632     ---------------------------------------
1633     --start of input parameter validations
1634     --------------------------------------
1635     --1.validate p_asset_cle_id
1636     If (p_asset_cle_id is NULL) or (p_asset_cle_id = OKL_API.G_MISS_NUM) then
1637         OKL_API.set_message(
1638                               p_app_name     => G_APP_NAME,
1639                               p_msg_name     => G_API_MISSING_PARAMETER,
1640                               p_token1       => G_API_NAME_TOKEN,
1641                               p_token1_value => l_api_name,
1642                               p_token2       => G_MISSING_PARAM_TOKEN,
1643                               p_token2_value => 'p_asset_cle_id');
1644          x_return_status := OKL_API.G_RET_STS_ERROR;
1645          Raise OKL_API.G_EXCEPTION_ERROR;
1646     Elsif (p_asset_cle_id is not NULL) and (p_asset_cle_id <> OKL_API.G_MISS_NUM) then
1647         validate_cle_id(p_cle_id        => p_asset_cle_id,
1648                         p_lty_code      => 'FREE_FORM1',
1649                         x_return_status => x_return_status);
1650         IF x_return_status = OKL_API.G_RET_STS_ERROR then
1651             OKL_API.set_message(G_APP_NAME, G_INVALID_VALUE,G_COL_NAME_TOKEN,'p_asset_cle_id');
1652             Raise OKL_API.G_EXCEPTION_ERROR;
1653         Elsif x_return_status = OKL_API.G_RET_STS_UNEXP_ERROR then
1654             Raise OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
1655         End If;
1656     End If;
1657     ------------------------------------
1658     --end of input variable validations
1659     -----------------------------------
1660 
1661     ---------------------------------------------------------------------
1662     --Rate points calculation steps
1663     ---------------------------------------------------------------------
1664     --1. Get asset payments
1665     --2. Call ISG API to get IRR from asset payments
1666     --3. Add rate points to IRR to get modified IRR
1667     --4. Call PV formula to get PV of payments at original IRR
1668     --5. Call PV formula to get PV of payments at modified IRR
1669     --6. subtract new PV from old PV. Difference is subsidy amount;
1670     ------------------------------------------------------------------
1671 
1672     i := 0;
1673     l_rate_points := p_rate_points;
1674     -----------------------------------------------------
1675      --1. Get asset payments
1676     -----------------------------------------------------
1677     open l_rent_csr(p_asset_cle_id => p_asset_cle_id);
1678     Loop
1679         fetch l_rent_csr into l_rent_rec;
1680         Exit when l_rent_csr%NOTFOUND;
1681         i := i+1;
1682         l_Payment_tbl(i).start_date      :=  trunc(fnd_date.canonical_to_date(l_rent_rec.start_date));
1683         l_Payment_tbl(i).periods         :=  l_rent_rec.periods;
1684         l_Payment_tbl(i).frequency       :=  l_rent_rec.frequency;
1685         l_payment_tbl(i).structure       :=  l_rent_rec.structure;
1686         l_payment_tbl(i).arrears_yn      :=  l_rent_rec.arrears_yn;
1687         l_payment_tbl(i).amount          :=  l_rent_rec.amount;
1688         l_payment_tbl(i).stub_days       :=  l_rent_rec.stub_days;
1689         l_payment_tbl(i).stub_amount     :=  l_rent_rec.stub_amount;
1690         l_payment_tbl(i).rate            :=  l_rent_rec.rate;
1691     end loop;
1692     close l_rent_csr;
1693     If l_payment_tbl.COUNT > 0 then
1694        -------------------------------------------------------
1695        --2. Call ISG API to get IRR from asset payments
1696        -------------------------------------------------------
1697         OKL_PRICING_PVT.target_parameter
1698             (p_api_version   =>  p_api_version,
1699              p_init_msg_list =>  p_init_msg_list,
1700              p_khr_id        =>  p_chr_id,
1701              p_kle_id        =>  p_asset_cle_id,
1702              p_rate_type     =>  G_RATE_TYPE,
1703              p_target_param  =>  'PMNT',
1704              p_pay_tbl       =>  l_payment_tbl,
1705              x_pay_tbl       =>  lx_payment_tbl,
1706              x_overall_rate  =>  l_orig_irr,
1707              x_return_status =>  x_return_status,
1708              x_msg_count     =>  x_msg_count,
1709              x_msg_data      =>  x_msg_data);
1710 
1711         IF (x_return_status = OKL_API.G_RET_STS_UNEXP_ERROR) THEN
1712             RAISE OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
1713         ELSIF (x_return_status = OKL_API.G_RET_STS_ERROR) THEN
1714             RAISE OKL_API.G_EXCEPTION_ERROR;
1715         END IF;
1716 
1717         ------------------------------------------------
1718         --3. Add rate points to IRR to get modified IRR
1719         ------------------------------------------------
1720         l_modified_irr := l_rate_points + l_orig_irr;
1721 
1722          ------------------------------------------------------------
1723         --5. Call PV formula and get NPV for old and new payments
1724         -----------------------------------------------------------
1725         --pv for old irr
1726         calculate_pv(p_api_version       => p_api_version,
1727                       p_init_msg_list     => p_init_msg_list,
1728                       x_return_status     => x_return_status,
1729                       x_msg_count         => x_msg_count,
1730                       x_msg_data          => x_msg_data,
1731                       p_chr_id            => p_chr_id,
1732                       p_asset_cle_id      => p_asset_cle_id,
1733                       p_payment_tbl       => l_payment_tbl,
1734                       p_irr               => l_orig_irr,
1735                       x_npv               => l_npv_orig);
1736 
1737         IF (x_return_status = OKL_API.G_RET_STS_UNEXP_ERROR) THEN
1738             RAISE OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
1739         ELSIF (x_return_status = OKL_API.G_RET_STS_ERROR) THEN
1740             RAISE OKL_API.G_EXCEPTION_ERROR;
1741         END IF;
1742 
1743         --pv for new irr
1744         calculate_pv (p_api_version       => p_api_version,
1745                       p_init_msg_list     => p_init_msg_list,
1746                       x_return_status     => x_return_status,
1747                       x_msg_count         => x_msg_count,
1748                       x_msg_data          => x_msg_data,
1749                       p_chr_id            => p_chr_id,
1750                       p_asset_cle_id      => p_asset_cle_id,
1751                       p_payment_tbl       => l_payment_tbl,
1752                       p_irr               => l_modified_irr,
1753                       x_npv               => l_npv_new);
1754 
1755         IF (x_return_status = OKL_API.G_RET_STS_UNEXP_ERROR) THEN
1756             RAISE OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
1757         ELSIF (x_return_status = OKL_API.G_RET_STS_ERROR) THEN
1758             RAISE OKL_API.G_EXCEPTION_ERROR;
1759         END IF;
1760 
1761 
1762         l_subsidy_amount := l_npv_orig - l_npv_new;
1763 
1764     Else
1765         --get asset number
1766         open l_astnum_csr(p_cle_id => p_asset_cle_id);
1767         fetch l_astnum_csr into l_asset_number;
1768         if l_astnum_csr%NOTFOUND then
1769             null;
1770         end if;
1771         close l_astnum_csr;
1772         OKL_API.set_message(p_app_name     => G_APP_NAME,
1773                             p_msg_name     => G_SUBSIDY_NO_RENTS,
1774                             p_token1       => G_ASSET_NUMBER_TOKEN,
1775                             p_token1_value => l_asset_number);
1776         x_return_status := OKL_API.G_RET_STS_ERROR;
1777         RAISE OKL_API.G_EXCEPTION_ERROR;
1778     End If;
1779 
1780     x_subsidy_amount := l_subsidy_amount;
1781     OKL_API.END_ACTIVITY (x_msg_count,x_msg_data );
1782 
1783     EXCEPTION
1784 
1785     WHEN OKL_API.G_EXCEPTION_ERROR THEN
1786     If l_astnum_csr%ISOPEN then
1787         close l_astnum_csr;
1788     End If;
1789     If l_rent_csr%ISOPEN then
1790         close l_rent_csr;
1791     End If;
1792     x_return_status := OKL_API.HANDLE_EXCEPTIONS(
1793                                l_api_name,
1794                                G_PKG_NAME,
1795                                'OKL_API.G_RET_STS_ERROR',
1796                                x_msg_count,
1797                                x_msg_data,
1798                                '_PVT');
1799     WHEN OKL_API.G_EXCEPTION_UNEXPECTED_ERROR THEN
1800     If l_astnum_csr%ISOPEN then
1801         close l_astnum_csr;
1802     End If;
1803     If l_rent_csr%ISOPEN then
1804         close l_rent_csr;
1805     End If;
1806     x_return_status :=OKL_API.HANDLE_EXCEPTIONS(
1807                               l_api_name,
1808                               G_PKG_NAME,
1809                               'OKL_API.G_RET_STS_UNEXP_ERROR',
1810                               x_msg_count,
1811                               x_msg_data,
1812                               '_PVT');
1813     WHEN OTHERS THEN
1814     If l_astnum_csr%ISOPEN then
1815         close l_astnum_csr;
1816     End If;
1817     If l_rent_csr%ISOPEN then
1818         close l_rent_csr;
1819     End If;
1820     x_return_status :=OKL_API.HANDLE_EXCEPTIONS(
1821                               l_api_name,
1822                               G_PKG_NAME,
1823                               'OTHERS',
1824                               x_msg_count,
1825                               x_msg_data,
1826                               '_PVT');
1827 End calc_rate_points_amount;
1828 --------------------------------------------------------------------------------
1829 --End : Changes for Bug# 3330669
1830 --------------------------------------------------------------------------------
1831 --------------------------------------------------------------------------------
1832 --Name         : Convert_Currency
1833 --Description  : Local procedure to do currency conversion
1834 --PARAMETERS   : IN p_from_currency in varchar2
1835 --                  p_khr_id in contract header id
1836 --                  p_transaction_date in transaction_date
1837 --                  p_amount in number
1838 --                  p_round_yn in varchar2 default OKL_API_G_TRUE
1839 --               OUT x_return_status
1840 --                   x_converted amount
1841 --------------------------------------------------------------------------------
1842 Procedure Convert_currency(p_khr_id            IN NUMBER,
1843                            p_from_currency     IN VARCHAR2,
1844                            p_transaction_date  IN DATE,
1845                            p_amount            IN NUMBER,
1846                            p_round_yn          IN VARCHAR2 DEFAULT OKL_API.G_TRUE,
1847                            x_converted_amount  OUT NOCOPY NUMBER,
1848                            x_return_status     OUT NOCOPY VARCHAR2) is
1849 
1850     l_contract_currency           okc_k_headers_b.currency_code%TYPE;
1851     l_currency_conversion_type    okl_k_headers.currency_conversion_type%TYPE;
1852     l_currency_conversion_rate    okl_k_headers.currency_conversion_rate%TYPE;
1853     l_currency_conversion_date    okl_k_headers.currency_conversion_date%TYPE;
1854     l_converted_subsidy_amount    Number;
1855     l_rounded_subsidy_amount      Number;
1856 
1857     error_condition               Exception;
1858 Begin
1859     ----------------------------------------------------------------------------
1860     --1. Call accounting util to do currency conversion
1861     ----------------------------------------------------------------------------
1862     okl_accounting_util.convert_to_contract_currency
1863     (p_khr_id                   => p_khr_id,
1864      p_from_currency            => p_from_currency,
1865      p_transaction_date         => p_transaction_date,
1866      p_amount 			        => p_amount,
1867      x_contract_currency        => l_contract_currency,
1868      x_currency_conversion_type => l_currency_conversion_type,
1869      x_currency_conversion_rate => l_currency_conversion_rate,
1870      x_currency_conversion_date => l_currency_conversion_date,
1871      x_converted_amount 		=> l_converted_subsidy_amount
1872      );
1873      --check for error in rate
1874      If (p_amount > 0) and (l_converted_subsidy_amount < 0 ) Then
1875          OKC_API.set_message(
1876                               p_app_name     => G_APP_NAME,
1877                               p_msg_name     => G_CONV_RATE_NOT_FOUND,
1878                               p_token1       => G_FROM_CURRENCY_TOKEN,
1879                               p_token1_value => p_from_currency,
1880                               p_token2       => G_TO_CURRENCY_TOKEN,
1881                               p_token2_value => l_contract_currency,
1882                               p_token3       => G_CONV_TYPE_TOKEN,
1883                               p_token3_value => l_currency_conversion_type,
1884                               p_token4       => G_CONV_DATE_TOKEN,
1885                               p_token4_value => to_char(l_currency_conversion_date,'DD-MON-YYYY'));
1886          x_return_status := OKL_API.G_RET_STS_ERROR;
1887          Raise error_condition;
1888      End If;
1889      ---------------------------------------------------------------------------
1890      --2. Call accounting util to do cross currency rounding
1891      ---------------------------------------------------------------------------
1892      If p_round_yn = OKL_API.G_TRUE then
1893          l_rounded_subsidy_amount :=  OKL_ACCOUNTING_UTIL.CROSS_CURRENCY_ROUND_AMOUNT
1894                                                  (l_converted_subsidy_amount,
1895                                                   l_contract_currency);
1896 
1897            IF (l_converted_subsidy_amount <> 0 AND l_rounded_subsidy_amount = 0) THEN
1898              OKL_API.set_message(p_app_name     => G_APP_NAME,
1899                              p_msg_name     => G_AMOUNT_ROUNDING);
1900              x_return_status := OKL_API.G_RET_STS_ERROR;
1901              RAISE error_condition;
1902          End If;
1903          l_converted_subsidy_amount := l_rounded_subsidy_amount;
1904      End If;
1905 
1906      x_converted_amount   := l_converted_subsidy_amount;
1907      Exception
1908      When Error_Condition Then
1909          Null;
1910      When Others Then
1911          x_return_status :=  OKL_API.G_RET_STS_UNEXP_ERROR;
1912 End Convert_Currency;
1913 --------------------------------------------------------------------------------
1914 --Name         : calculate_subsidy_amount
1915 --Description  : API to calculate subsidy amount based on subsidy calculation
1916 --               criteria for a subsidy line.
1917 --Notes        :
1918 --               Always calculates actual amount to
1919 --               be stored in okl_k_lines.amount column for the subsidy line.
1920 --               This will be called from OKL_ASSET_SUBSIDY_PVT.calculate_Asset_subsidy
1921 --               to calculate subsidy amount. This does not consider subsidy_override_amount.
1922 --               For considering subsidy_override_amount please use overloded form
1923 --               of calculate_subsidy_amount with extra parameter p_override_yn.
1924 -- PARAMETERS  : IN - p_subsidy_cle_id  : subsidy line id
1925 --               OUT - x_subsidy_amount : subsidy amount
1926 --------------------------------------------------------------------------------
1927 PROCEDURE calculate_subsidy_amount(
1928     p_api_version                  IN NUMBER,
1929     p_init_msg_list                IN VARCHAR2,
1930     x_return_status                OUT NOCOPY VARCHAR2,
1931     x_msg_count                    OUT NOCOPY NUMBER,
1932     x_msg_data                     OUT NOCOPY VARCHAR2,
1933     p_subsidy_cle_id               IN  NUMBER,
1934     x_subsidy_amount               OUT NOCOPY NUMBER) is
1935 
1936     l_return_status        VARCHAR2(1)  default OKL_API.G_RET_STS_SUCCESS;
1937     l_api_name             CONSTANT     varchar2(30) := 'CALCULATE_SUBSIDY_AMOUNT';
1938     l_api_version          CONSTANT     NUMBER := 1.0;
1939 
1940     --cursor to fetch calculation basis
1941     cursor l_sub_calc_csr(p_subsidy_cle_id IN NUMBER) is
1942     Select sub_cle.id                      subsidy_cle_id,
1943            sub_cle.dnz_chr_id              dnz_chr_id,
1944            sub_cle.start_date              subsidy_start_date,
1945            sub_kle.subsidy_id              subsidy_id,
1946            sub_kle.amount                  subsidy_line_amount,
1947            sub_cle.cle_id                  asset_cle_id,
1948            sub_kle.subsidy_override_amount subsidy_override_amount,
1949            ast_kle.oec                     asset_oec,
1950            ast_kle.capital_amount          asset_capital_amount,
1951            ast_kle.residual_value          residual_value,
1952            subb.subsidy_calc_basis         subsidy_calc_basis,
1953            subb.amount                     subsidy_setup_amount,
1954            subb.name                       subsidy_name,
1955            subb.percent                    subsidy_setup_percent,
1956            subb.formula_id                 formula_id,
1957            subb.rate_points                rate_points,
1958            subb.currency_code              subsidy_setup_currency,
1959            sub_cle.currency_code           contract_currency,
1960            --Bug# 3313802 :
1961            subb.maximum_financed_amount    maximum_financed_amount,
1962            subb.maximum_subsidy_amount     maximum_subsidy_amount
1963     from   okc_k_lines_b      sub_cle,
1964            okl_k_lines        sub_kle,
1965            okl_k_lines        ast_kle,
1966            okl_subsidies_b    subb
1967     where  subb.id      = sub_kle.subsidy_id
1968     and    ast_kle.id   = sub_cle.cle_id
1969     and    sub_kle.id   = sub_cle.id
1970     and    sub_cle.id   = p_subsidy_cle_id
1971     and    sub_cle.sts_code <> 'ABANDONED';
1972 
1973     l_sub_calc_rec                l_sub_calc_csr%ROWTYPE;
1974     l_subsidy_amount              Number;
1975     l_finance_amount              Number;  -- Added by veramach for Bug#6622178
1976 
1977     l_converted_subsidy_amount      Number;
1978     l_conv_max_fin_amount           Number;
1979     l_conv_max_sub_amount           Number;
1980 
1981     --Cursor to get formula name
1982     cursor l_fmla_csr (p_formula_id in NUMBER) is
1983     Select name
1984     from   okl_formulae_b
1985     where  id = p_formula_id;
1986 
1987     l_formula_name okl_formulae_b.name%TYPE;
1988 
1989     l_oec number;
1990 
1991     -----------------------
1992     --Bug# 3394233
1993     /*-----------------------
1994     --cursor to get any maximum financed amount OR maximum subsidy restrictions defined for
1995     --inventory item
1996     --cursor l_sub_limits_csr(p_chr_id in number,p_asset_cle_id in number, p_subsidy_id in number) is
1997     --select suc.maximum_subsidy_amount,
1998            --suc.maximum_financed_amount
1999     --from   okl_subsidy_criteria suc,
2000            --okc_k_items          cim,
2001            --okc_k_lines_b        cleb, --modelline
2002            --okc_line_styles_b    lseb
2003     --where  suc.subsidy_id                  = p_subsidy_id
2004     --and    to_char(suc.organization_id)    = cim.object1_id1
2005     --and    to_char(suc.inventory_item_id)  = cim.object1_id2
2006     --and    cim.jtot_object1_code           = 'OKX_SYSITEM'
2007     --and    cim.dnz_chr_id                  = cleb.dnz_chr_id
2008     --and    cim.cle_id                      = cleb.id
2009     --and    cleb.cle_id                     = p_asset_cle_id
2010     --and    lseb.id                         = cleb.lse_id
2011     --and    lseb.lty_code                   = 'ITEM'
2012     --and    cleb.dnz_chr_id                 = p_chr_id;
2013     -----------------------*/
2014     --Bug# 3394233
2015     -----------------------
2016 
2017 
2018     l_max_subsidy_amount  number;
2019     l_max_financed_amount number;
2020 
2021     --cursor to find out calculation basis meaning for errors
2022     cursor l_flkup_csr (p_lookup_code in varchar2,
2023                         p_lookup_type in varchar2) is
2024     select flkup.meaning
2025     from   fnd_lookups flkup
2026     where  flkup.lookup_type = p_lookup_type
2027     and    flkup.lookup_code = p_lookup_code;
2028 
2029     l_flkup_meaning fnd_lookups.meaning%TYPE;
2030 
2031 
2032 begin
2033     x_return_status := OKL_API.G_RET_STS_SUCCESS;
2034     -- Call start_activity to create savepoint, check compatibility
2035     -- and initialize message list
2036     x_return_status := OKL_API.START_ACTIVITY (
2037                                l_api_name
2038                                ,p_init_msg_list
2039                                ,'_PVT'
2040                                ,x_return_status);
2041     -- Check if activity started successfully
2042     IF (x_return_status = OKL_API.G_RET_STS_UNEXP_ERROR) THEN
2043        RAISE OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
2044     ELSIF (x_return_status = OKL_API.G_RET_STS_ERROR) THEN
2045        RAISE OKL_API.G_EXCEPTION_ERROR;
2046     END IF;
2047 
2048     ---------------------------------------
2049     --start of input parameter validations
2050     ---------------------------------------
2051     --1.validate p_subsidy_cle_id
2052     If (p_subsidy_cle_id is NULL) or (p_subsidy_cle_id = OKL_API.G_MISS_NUM) then
2053         OKL_API.set_message(
2054                               p_app_name     => G_APP_NAME,
2055                               p_msg_name     => G_API_MISSING_PARAMETER,
2056                               p_token1       => G_API_NAME_TOKEN,
2057                               p_token1_value => l_api_name,
2058                               p_token2       => G_MISSING_PARAM_TOKEN,
2059                               p_token2_value => 'p_subsidy_cle_id');
2060          x_return_status := OKL_API.G_RET_STS_ERROR;
2061          Raise OKL_API.G_EXCEPTION_ERROR;
2062     Elsif (p_subsidy_cle_id is not NULL) and (p_subsidy_cle_id <> OKL_API.G_MISS_NUM) then
2063         validate_cle_id(p_cle_id        => p_subsidy_cle_id,
2064                         p_lty_code      => 'SUBSIDY',
2065                         x_return_status => x_return_status);
2066         IF x_return_status = OKL_API.G_RET_STS_ERROR then
2067             OKL_API.set_message(G_APP_NAME, G_INVALID_VALUE,G_COL_NAME_TOKEN,'p_subsidy_cle_id');
2068             Raise OKL_API.G_EXCEPTION_ERROR;
2069         Elsif x_return_status = OKL_API.G_RET_STS_UNEXP_ERROR then
2070             Raise OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
2071         End If;
2072     End If;
2073     ------------------------------------
2074     --end of input variable validations
2075     ------------------------------------
2076 
2077 
2078     Open l_sub_calc_csr(p_subsidy_cle_id => p_subsidy_cle_id);
2079     Fetch l_sub_calc_csr into l_sub_calc_rec;
2080     If l_sub_calc_csr%NOTFOUND then
2081         --raise error
2082         OKL_API.set_message(p_app_name     => G_APP_NAME,
2083                             p_msg_name     => G_MISSING_SUB_CALC_BASIS
2084                             );
2085         x_return_status := OKL_API.G_RET_STS_ERROR;
2086         -- halt validation as it is a required setup
2087         RAISE OKL_API.G_EXCEPTION_ERROR;
2088     End If;
2089     Close l_sub_calc_csr;
2090 
2091     --always calculate do not override the original calculated amount
2092     --overide amount considered in overloaded calculate_subsidy_amount API
2093     IF l_sub_calc_rec.subsidy_calc_basis is Null OR l_sub_calc_rec.subsidy_calc_basis = OKL_API.G_MISS_CHAR then
2094         --raise error
2095         OKL_API.set_message(p_app_name     => G_APP_NAME,
2096                             p_msg_name     => G_MISSING_SUB_CALC_BASIS,
2097                             p_token1       => G_SUBSIDY_NAME_TOKEN,
2098 		            p_token1_value => l_sub_calc_rec.subsidy_name
2099                             );
2100         x_return_status := OKL_API.G_RET_STS_ERROR;
2101         -- halt validation as it is a required setup to go ahead
2102         RAISE OKL_API.G_EXCEPTION_ERROR;
2103     ElsIf l_sub_calc_rec.subsidy_calc_basis = 'FIXED' then
2104         If l_sub_calc_rec.subsidy_setup_amount is Null OR  l_sub_calc_rec.subsidy_setup_amount = OKL_API.G_MISS_NUM then
2105 
2106             --raise error
2107             open l_flkup_csr(p_lookup_type => 'OKL_SUBCALC_BASIS',
2108                              p_lookup_code => l_sub_calc_rec.subsidy_calc_basis);
2109             fetch l_flkup_csr into l_flkup_meaning;
2110             If l_flkup_csr%NOTFOUND then
2111                 l_flkup_meaning := l_sub_calc_rec.subsidy_calc_basis;
2112             End If;
2113             close l_flkup_csr;
2114 
2115             OKL_API.set_message(p_app_name     => G_APP_NAME,
2116                                 p_msg_name     => G_MISSING_SUB_CALC_PARAMETER,
2117                                 p_token1       => G_PARAMETER_NAME_TOKEN,
2118 		                p_token1_value => 'Amount',
2119                                 p_token2       => G_CALC_BASIS_TOKEN,
2120 		                p_token2_value => l_flkup_meaning,
2121                                 p_token3       => G_SUBSIDY_NAME_TOKEN,
2122 		                p_token3_value => l_sub_calc_rec.subsidy_name
2123                                 );
2124             x_return_status := OKL_API.G_RET_STS_ERROR;
2125             -- halt validation as it is a required setup to go ahead
2126             RAISE OKL_API.G_EXCEPTION_ERROR;
2127         Else
2128             If l_sub_calc_rec.subsidy_setup_currency = l_sub_calc_rec.contract_currency then
2129                 l_subsidy_amount :=  l_sub_calc_rec.subsidy_setup_amount;
2130             Elsif l_sub_calc_rec.subsidy_setup_currency <> l_sub_calc_rec.contract_currency then
2131                 Convert_currency(p_khr_id             => l_sub_calc_rec.dnz_chr_id,
2132                                  p_from_currency      => l_sub_calc_rec.subsidy_setup_currency,
2133                                  p_transaction_date   => l_sub_calc_rec.subsidy_start_date,
2134                                  p_amount             => l_sub_calc_rec.subsidy_setup_amount,
2135                                  x_converted_amount   => l_converted_subsidy_amount,
2136                                  x_return_status      => x_return_status);
2137 
2138                 IF (x_return_status = OKL_API.G_RET_STS_UNEXP_ERROR) THEN
2139                     RAISE OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
2140                 ELSIF (x_return_status = OKL_API.G_RET_STS_ERROR) THEN
2141                     RAISE OKL_API.G_EXCEPTION_ERROR;
2142                 END IF;
2143                  l_subsidy_amount := l_converted_subsidy_amount;
2144              End If;
2145          End if;
2146     ElsIf  l_sub_calc_rec.subsidy_calc_basis = 'ASSETCOST' then
2147         If l_sub_calc_rec.subsidy_setup_percent is Null OR  l_sub_calc_rec.subsidy_setup_percent = OKL_API.G_MISS_NUM then
2148 
2149             --raise error
2150             open l_flkup_csr(p_lookup_type => 'OKL_SUBCALC_BASIS',
2151                              p_lookup_code => l_sub_calc_rec.subsidy_calc_basis);
2152             fetch l_flkup_csr into l_flkup_meaning;
2153             If l_flkup_csr%NOTFOUND then
2154                 l_flkup_meaning := l_sub_calc_rec.subsidy_calc_basis;
2155             End If;
2156             close l_flkup_csr;
2157 
2158 
2159             OKL_API.set_message(p_app_name     => G_APP_NAME,
2160                                 p_msg_name     => G_MISSING_SUB_CALC_PARAMETER,
2161                                 p_token1       => G_PARAMETER_NAME_TOKEN,
2162 		                p_token1_value => 'Percent',
2163                                 p_token2       => G_CALC_BASIS_TOKEN,
2164 		                p_token2_value => l_flkup_meaning,
2165                                 p_token3       => G_SUBSIDY_NAME_TOKEN,
2166 		                p_token3_value => l_sub_calc_rec.subsidy_name
2167                                 );
2168             x_return_status := OKL_API.G_RET_STS_ERROR;
2169             -- halt validation as it is a required setup to go ahead
2170             RAISE OKL_API.G_EXCEPTION_ERROR;
2171         Else
2172             --get original equipment cost from formula
2173             OKL_EXECUTE_FORMULA_PUB.execute(p_api_version   => p_api_version,
2174                                     p_init_msg_list => p_init_msg_list,
2175                                     x_return_status => x_return_status,
2176                                     x_msg_count     => x_msg_count,
2177                                     x_msg_data      => x_msg_data,
2178                                     p_formula_name  => G_FORMULA_OEC,
2179                                     p_contract_id   => l_sub_calc_rec.dnz_chr_id,
2180                                     p_line_id       => l_sub_calc_rec.asset_cle_id,
2181                                     x_value         => l_oec);
2182 
2183             IF (x_return_status = OKL_API.G_RET_STS_UNEXP_ERROR) THEN
2184                 RAISE OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
2185             ELSIF (x_return_status = OKL_API.G_RET_STS_ERROR) THEN
2186                 RAISE OKL_API.G_EXCEPTION_ERROR;
2187             END IF;
2188 
2189             --Bug# 3313802 : maximum financed amount moved from subsidy criteria to
2190             --               main subsidy setup
2191             /*-----------------------------------------------------------------------
2192             --check if there is any maximum financed amount restriction on this subsidy
2193             --open l_sub_limits_csr(p_chr_id        => l_sub_calc_rec.dnz_chr_id,
2194                                   --p_asset_cle_id  => l_sub_calc_rec.asset_cle_id,
2195                                   --p_subsidy_id    => l_sub_calc_rec.subsidy_id);
2196             --fetch  l_sub_limits_csr into l_max_subsidy_amount,
2197                                          --l_max_financed_amount;
2198             --If l_sub_limits_csr%NOTFOUND then
2199                 --null;
2200             --Else
2201             -------------------------------------------------------------------------*/
2202 
2203             l_max_financed_amount := l_sub_calc_rec.maximum_financed_amount;
2204 
2205             IF l_sub_calc_rec.subsidy_setup_currency = l_sub_calc_rec.contract_currency then
2206                 l_conv_max_fin_amount := l_max_financed_amount;
2207             ELSIF l_sub_calc_rec.subsidy_setup_currency <> l_sub_calc_rec.contract_currency then
2208                 Convert_currency(p_khr_id             => l_sub_calc_rec.dnz_chr_id,
2209                                  p_from_currency      => l_sub_calc_rec.subsidy_setup_currency,
2210                                  p_transaction_date   => l_sub_calc_rec.subsidy_start_date,
2211                                  p_amount             => l_max_financed_amount,
2212                                  x_converted_amount   => l_conv_max_fin_amount,
2213                                  x_return_status      => x_return_status);
2214 
2215                 IF (x_return_status = OKL_API.G_RET_STS_UNEXP_ERROR) THEN
2216                     RAISE OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
2217                 ELSIF (x_return_status = OKL_API.G_RET_STS_ERROR) THEN
2218                     RAISE OKL_API.G_EXCEPTION_ERROR;
2219                 END IF;
2220             End If;
2221 
2222             If (l_oec > l_conv_max_fin_amount) then
2223                 l_oec := l_conv_max_fin_amount;
2224             End If;
2225             End If;
2226 
2227             --End If;
2228             --Close l_sub_limits_csr;
2229 
2230             l_subsidy_amount :=   l_oec * (l_sub_calc_rec.subsidy_setup_percent/100);
2231 
2232     ElsIf l_sub_calc_rec.subsidy_calc_basis = 'FORMULA' then
2233         If l_sub_calc_rec.formula_id is Null OR  l_sub_calc_rec.formula_id = OKL_API.G_MISS_NUM then
2234 
2235             --raise error
2236             open l_flkup_csr(p_lookup_type => 'OKL_SUBCALC_BASIS',
2237                              p_lookup_code => l_sub_calc_rec.subsidy_calc_basis);
2238             fetch l_flkup_csr into l_flkup_meaning;
2239             If l_flkup_csr%NOTFOUND then
2240                 l_flkup_meaning := l_sub_calc_rec.subsidy_calc_basis;
2241             End If;
2242             close l_flkup_csr;
2243 
2244 
2245             OKL_API.set_message(p_app_name     => G_APP_NAME,
2246                                 p_msg_name     => G_MISSING_SUB_CALC_PARAMETER,
2247                                 p_token1       => G_PARAMETER_NAME_TOKEN,
2248             	                p_token1_value => 'Formula Name',
2249                                 p_token2       => G_CALC_BASIS_TOKEN,
2250 		                p_token2_value => l_flkup_meaning,
2251                                 p_token3       => G_SUBSIDY_NAME_TOKEN,
2252 		                p_token3_value => l_sub_calc_rec.subsidy_name
2253                                 );
2254             x_return_status := OKL_API.G_RET_STS_ERROR;
2255             -- halt validation as it is a required setup to go ahead
2256             RAISE OKL_API.G_EXCEPTION_ERROR;
2257         Else
2258             Open l_fmla_csr (p_formula_id =>   l_sub_calc_rec.formula_id);
2259             Fetch l_fmla_csr into l_formula_name;
2260             If l_fmla_csr%NOTFOUND then
2261                 --raise error
2262                 OKL_API.set_message(G_APP_NAME, G_INVALID_VALUE,G_COL_NAME_TOKEN,'Subsidy Calculation Formula');
2263                 x_return_status := OKL_API.G_RET_STS_ERROR;
2264                 -- halt validation as it is a required setup to go ahead
2265                 RAISE OKL_API.G_EXCEPTION_ERROR;
2266             End If;
2267             Close l_fmla_csr;
2268 
2269             --Execte Formula
2270             OKL_EXECUTE_FORMULA_PUB.execute(p_api_version   => p_api_version,
2271                                             p_init_msg_list => p_init_msg_list,
2272                                             x_return_status => x_return_status,
2273                                             x_msg_count     => x_msg_count,
2274                                             x_msg_data      => x_msg_data,
2275                                             p_formula_name  => l_formula_name,
2276                                             p_contract_id   => l_sub_calc_rec.dnz_chr_id,
2277                                             --Bug# 3487167
2278                                             p_line_id       => l_sub_calc_rec.asset_cle_id,
2279                                             --p_line_id       => l_sub_calc_rec.subsidy_cle_id,
2280                                             x_value         => l_subsidy_amount);
2281             If (x_return_status = OKL_API.G_RET_STS_UNEXP_ERROR) then
2282                 raise OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
2283             Elsif (x_return_status = OKL_API.G_RET_STS_ERROR) then
2284                 raise OKL_API.G_EXCEPTION_ERROR;
2285             End If;
2286 
2287         End If;
2288     Elsif l_sub_calc_rec.subsidy_calc_basis = 'RATE' then
2289         If l_sub_calc_rec.rate_points is Null OR  l_sub_calc_rec.rate_points = OKL_API.G_MISS_NUM then
2290             --raise error
2291             open l_flkup_csr(p_lookup_type => 'OKL_SUBCALC_BASIS',
2292                              p_lookup_code => l_sub_calc_rec.subsidy_calc_basis);
2293             fetch l_flkup_csr into l_flkup_meaning;
2294             If l_flkup_csr%NOTFOUND then
2295                 l_flkup_meaning := l_sub_calc_rec.subsidy_calc_basis;
2296             End If;
2297             close l_flkup_csr;
2298 
2299             OKL_API.set_message(p_app_name     => G_APP_NAME,
2300                                 p_msg_name     => G_MISSING_SUB_CALC_PARAMETER,
2301                                 p_token1       => G_PARAMETER_NAME_TOKEN,
2302 		                p_token1_value => 'Rate Points',
2303                                 p_token2       => G_CALC_BASIS_TOKEN,
2304 		                p_token2_value => l_flkup_meaning,
2305                                 p_token3       => G_SUBSIDY_NAME_TOKEN,
2306 		                p_token3_value => l_sub_calc_rec.subsidy_name
2307                                 );
2308             x_return_status := OKL_API.G_RET_STS_ERROR;
2309             -- halt validation as it is a required setup to go ahead
2310             RAISE OKL_API.G_EXCEPTION_ERROR;
2311         Else
2312             calc_rate_points_amount(p_api_version   => p_api_version,
2313                                    p_init_msg_list  => p_init_msg_list,
2314                                    x_return_status  => x_return_status,
2315                                    x_msg_count      => x_msg_count,
2316                                    x_msg_data       => x_msg_data,
2317                                    p_rate_points    => l_sub_calc_rec.rate_points,
2318                                    p_chr_id         => l_sub_calc_rec.dnz_chr_id,
2319                                    p_asset_cle_id   => l_sub_calc_rec.asset_cle_id,
2320                                    x_subsidy_amount => l_subsidy_amount);
2321 
2322             If (x_return_status = OKL_API.G_RET_STS_UNEXP_ERROR) then
2323                 raise OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
2324             Elsif (x_return_status = OKL_API.G_RET_STS_ERROR) then
2325                 raise OKL_API.G_EXCEPTION_ERROR;
2326             End If;
2327         End If;
2328 
2329        -------------------------------------------------------------
2330        -- Added by veramach for Bug#6622178
2331        -- Calculating subsidy amount on the basis of Financed Amount
2332        -------------------------------------------------------------
2333        ELSIF  l_sub_calc_rec.subsidy_calc_basis = 'FINANCED_AMOUNT' THEN
2334             IF l_sub_calc_rec.subsidy_setup_percent IS NULL OR  l_sub_calc_rec.subsidy_setup_percent = OKL_API.G_MISS_NUM THEN
2335                 --raise error
2336                 OPEN l_flkup_csr(p_lookup_type => 'OKL_SUBCALC_BASIS',
2337                                  p_lookup_code => l_sub_calc_rec.subsidy_calc_basis);
2338                 FETCH l_flkup_csr INTO l_flkup_meaning;
2339                 IF l_flkup_csr%NOTFOUND THEN
2340                     l_flkup_meaning := l_sub_calc_rec.subsidy_calc_basis;
2341                 END IF;
2342                 CLOSE l_flkup_csr;
2343                 OKL_API.set_message(p_app_name     => G_APP_NAME,
2344                                     p_msg_name     => G_MISSING_SUB_CALC_PARAMETER,
2345                                     p_token1       => G_PARAMETER_NAME_TOKEN,
2346                                     p_token1_value => 'Percent',
2347                                     p_token2       => G_CALC_BASIS_TOKEN,
2348                                     p_token2_value => l_flkup_meaning,
2349                                     p_token3       => G_SUBSIDY_NAME_TOKEN,
2350                                     p_token3_value => l_sub_calc_rec.subsidy_name
2351                                     );
2352                 x_return_status := OKL_API.G_RET_STS_ERROR;
2353                 --halt validation as it is a required setup to go ahead
2354                 RAISE OKL_API.G_EXCEPTION_ERROR;
2355             ELSE
2356                 --get original financed amount from formula
2357                 OKL_EXECUTE_FORMULA_PUB.execute(p_api_version   => p_api_version,
2358                                         p_init_msg_list => p_init_msg_list,
2359                                         x_return_status => x_return_status,
2360                                         x_msg_count     => x_msg_count,
2361                                         x_msg_data      => x_msg_data,
2362                                         p_formula_name  => 'FRONT_END_FINANCED_AMOUNT',
2363                                         p_contract_id   => l_sub_calc_rec.dnz_chr_id,
2364                                         p_line_id       => l_sub_calc_rec.asset_cle_id,
2365                                         x_value         => l_finance_amount);
2366                 IF (x_return_status = OKL_API.G_RET_STS_UNEXP_ERROR) THEN
2367                     RAISE OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
2368                 ELSIF (x_return_status = OKL_API.G_RET_STS_ERROR) THEN
2369                     RAISE OKL_API.G_EXCEPTION_ERROR;
2370                 END IF;
2371 
2372                 l_max_financed_amount := l_sub_calc_rec.maximum_financed_amount;
2373 
2374                 IF l_sub_calc_rec.subsidy_setup_currency = l_sub_calc_rec.contract_currency then
2375                     l_conv_max_fin_amount := l_max_financed_amount;
2376                 ELSIF l_sub_calc_rec.subsidy_setup_currency <> l_sub_calc_rec.contract_currency then
2377                     Convert_currency(p_khr_id             => l_sub_calc_rec.dnz_chr_id,
2378                                      p_from_currency      => l_sub_calc_rec.subsidy_setup_currency,
2379                                      p_transaction_date   => l_sub_calc_rec.subsidy_start_date,
2380                                      p_amount             => l_max_financed_amount,
2381                                      x_converted_amount   => l_conv_max_fin_amount,
2382                                      x_return_status      => x_return_status);
2383 
2384                     IF (x_return_status = OKL_API.G_RET_STS_UNEXP_ERROR) THEN
2385                         RAISE OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
2386                     ELSIF (x_return_status = OKL_API.G_RET_STS_ERROR) THEN
2387                         RAISE OKL_API.G_EXCEPTION_ERROR;
2388                     END IF;
2389                 END IF;
2390 
2391                 IF (l_finance_amount > l_conv_max_fin_amount) THEN
2392                     l_finance_amount := l_conv_max_fin_amount;
2393                 END IF;
2394             END IF;
2395             l_subsidy_amount :=   l_finance_amount * (l_sub_calc_rec.subsidy_setup_percent/100);
2396     -- End by veramach for Bug#6622178
2397     Else
2398          OKL_API.set_message(G_APP_NAME, G_INVALID_VALUE,G_COL_NAME_TOKEN,'Subsidy Calculation Basis');
2399          x_return_status := OKL_API.G_RET_STS_ERROR;
2400          raise OKL_API.G_EXCEPTION_ERROR;
2401     End If;
2402 
2403     --Bug# 3313802 : Maximum subsidy amount moved from subsidy
2404     /*--------------------------------------------------------------------
2405     --check for limits on subsidy amount for this inventory item
2406     --open l_sub_limits_csr(p_chr_id        => l_sub_calc_rec.dnz_chr_id,
2407                           --p_asset_cle_id  => l_sub_calc_rec.asset_cle_id,
2408                           --p_subsidy_id    => l_sub_calc_rec.subsidy_id);
2409     --fetch  l_sub_limits_csr into l_max_subsidy_amount,
2410                                  --l_max_financed_amount;
2411     --If l_sub_limits_csr%NOTFOUND then
2412         --null;
2413     --Else
2414     --------------------------------------------------------------------------*/
2415     l_max_subsidy_amount := l_sub_calc_rec.maximum_subsidy_amount;
2416     IF l_sub_calc_rec.subsidy_setup_currency = l_sub_calc_rec.contract_currency then
2417         l_conv_max_sub_amount := l_max_subsidy_amount;
2418     ELSIF l_sub_calc_rec.subsidy_setup_currency <> l_sub_calc_rec.contract_currency then
2419         Convert_currency(p_khr_id             => l_sub_calc_rec.dnz_chr_id,
2420                          p_from_currency      => l_sub_calc_rec.subsidy_setup_currency,
2421                          p_transaction_date   => l_sub_calc_rec.subsidy_start_date,
2422                          p_amount             => l_max_subsidy_amount,
2423                          x_converted_amount   => l_conv_max_sub_amount,
2424                          x_return_status      => x_return_status);
2425 
2426         IF (x_return_status = OKL_API.G_RET_STS_UNEXP_ERROR) THEN
2427             RAISE OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
2428         ELSIF (x_return_status = OKL_API.G_RET_STS_ERROR) THEN
2429             RAISE OKL_API.G_EXCEPTION_ERROR;
2430         END IF;
2431     END IF;
2432     If (l_subsidy_amount > l_conv_max_sub_amount) then
2433         l_subsidy_amount := l_conv_max_sub_amount;
2434     End If;
2435 
2436     --End If;
2437     --Close l_sub_limits_csr;
2438 
2439     x_subsidy_amount := l_subsidy_amount;
2440     OKL_API.END_ACTIVITY (x_msg_count,x_msg_data );
2441 
2442     EXCEPTION
2443     WHEN OKL_API.G_EXCEPTION_ERROR THEN
2444     If l_sub_calc_csr%ISOPEN then
2445         CLOSE l_sub_calc_csr;
2446     End If;
2447     If l_fmla_csr%ISOPEN then
2448         CLOSE l_fmla_csr;
2449     End If;
2450     -----------------------
2451     --Bug# 3394233
2452     /*--------------------------
2453     --If l_sub_limits_csr%ISOPEN then
2454         --CLOSE l_sub_limits_csr;
2455     --End If;
2456     ---------------------------*/
2457     --Bug# 3394233
2458     -----------------------
2459     x_return_status := OKL_API.HANDLE_EXCEPTIONS(
2460                                l_api_name,
2461                                G_PKG_NAME,
2462                                'OKL_API.G_RET_STS_ERROR',
2463                                x_msg_count,
2464                                x_msg_data,
2465                                '_PVT');
2466     WHEN OKL_API.G_EXCEPTION_UNEXPECTED_ERROR THEN
2467     If l_sub_calc_csr%ISOPEN then
2468         CLOSE l_sub_calc_csr;
2469     End If;
2470     If l_fmla_csr%ISOPEN then
2471         CLOSE l_fmla_csr;
2472     End If;
2473     -----------------------
2474     --Bug# 3394233
2475     /*--------------------------
2476     --If l_sub_limits_csr%ISOPEN then
2477         --CLOSE l_sub_limits_csr;
2478     --End If;
2479     ---------------------------*/
2480     --Bug# 3394233
2481     -----------------------
2482     x_return_status :=OKL_API.HANDLE_EXCEPTIONS(
2483                               l_api_name,
2484                               G_PKG_NAME,
2485                               'OKL_API.G_RET_STS_UNEXP_ERROR',
2486                               x_msg_count,
2487                               x_msg_data,
2488                               '_PVT');
2489     WHEN OTHERS THEN
2490     If l_sub_calc_csr%ISOPEN then
2491         CLOSE l_sub_calc_csr;
2492     End If;
2493     If l_fmla_csr%ISOPEN then
2494         CLOSE l_fmla_csr;
2495     End If;
2496     -----------------------
2497     --Bug# 3394233
2498     /*--------------------------
2499     --If l_sub_limits_csr%ISOPEN then
2500         --CLOSE l_sub_limits_csr;
2501     --End If;
2502     ---------------------------*/
2503     --Bug# 3394233
2504     -----------------------
2505     x_return_status :=OKL_API.HANDLE_EXCEPTIONS(
2506                               l_api_name,
2507                               G_PKG_NAME,
2508                               'OTHERS',
2509                               x_msg_count,
2510                               x_msg_data,
2511                               '_PVT');
2512 End calculate_subsidy_amount;
2513 --------------------------------------------------------------------------------
2514 --Name         : calculate_subsidy_amount (overloaded)
2515 --Description  : API to calculate subsidy amount based on subsidy calculation
2516 --               criteria for a subsidy line. If subsidy_override amount is
2517 --               specified and overloaded parameter p_override_yn is
2518 --               OKL_API.G_TRUE then subsidy_amount = subsidy_override_amount
2519 --               This overloaded form will be called to re-calculate total of
2520 --               subsidies at asset or contract level at the time of QA check
2521 --               or any other time where total calculated is to be copared
2522 --               against total stored amount of subsidies
2523 -- PARAMETERS  : IN - p_subsidy_cle_id  : subsidy line id
2524 --                    p_override_yn     : OKL_API.G_TRUE/OKL_API.G_FALSE (will
2525 --                                        determine whether subsidy override
2526 --                                        amount is to be taken into account
2527 --               OUT - x_subsidy_amount : subsidy amount
2528 --------------------------------------------------------------------------------
2529 PROCEDURE calculate_subsidy_amount(
2530     p_api_version                  IN NUMBER,
2531     p_init_msg_list                IN VARCHAR2,
2532     x_return_status                OUT NOCOPY VARCHAR2,
2533     x_msg_count                    OUT NOCOPY NUMBER,
2534     x_msg_data                     OUT NOCOPY VARCHAR2,
2535     p_subsidy_cle_id               IN  NUMBER,
2536     p_override_yn                  IN  VARCHAR2,
2537     x_subsidy_amount               OUT NOCOPY NUMBER) is
2538 
2539     l_return_status        VARCHAR2(1)  default OKL_API.G_RET_STS_SUCCESS;
2540     l_api_name             CONSTANT     varchar2(30) := 'CALCULATE_SUBSIDY_AMOUNT';
2541     l_api_version          CONSTANT     NUMBER := 1.0;
2542 
2543     --------------------------------------------------
2544     --cursor to fetch subsidy override amount
2545     --------------------------------------------------
2546     cursor l_kle_csr (p_cle_id in number) is
2547     select kle.subsidy_override_amount
2548     from   okl_k_lines kle,
2549            okc_k_lines_b cleb
2550     where  kle.id         = cleb.id
2551     and    cleb.sts_code  <> 'ABANDONED'
2552     and    cleb.id        = p_cle_id;
2553 
2554     l_subsidy_override_amount okl_k_lines.subsidy_override_amount%TYPE default NULL;
2555     l_subsidy_amount          number;
2556 
2557 begin
2558     x_return_status := OKL_API.G_RET_STS_SUCCESS;
2559     -- Call start_activity to create savepoint, check compatibility
2560     -- and initialize message list
2561     x_return_status := OKL_API.START_ACTIVITY (
2562                                l_api_name
2563                                ,p_init_msg_list
2564                                ,'_PVT'
2565                                ,x_return_status);
2566     -- Check if activity started successfully
2567     IF (x_return_status = OKL_API.G_RET_STS_UNEXP_ERROR) THEN
2568        RAISE OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
2569     ELSIF (x_return_status = OKL_API.G_RET_STS_ERROR) THEN
2570        RAISE OKL_API.G_EXCEPTION_ERROR;
2571     END IF;
2572 
2573     --------------------------------------
2574     --start of input parameter validations
2575     --------------------------------------
2576     --1.validate p_subsidy_cle_id
2577     If (p_subsidy_cle_id is NULL) or (p_subsidy_cle_id = OKL_API.G_MISS_NUM) then
2578         OKL_API.set_message(
2579                               p_app_name     => G_APP_NAME,
2580                               p_msg_name     => G_API_MISSING_PARAMETER,
2581                               p_token1       => G_API_NAME_TOKEN,
2582                               p_token1_value => l_api_name,
2583                               p_token2       => G_MISSING_PARAM_TOKEN,
2584                               p_token2_value => 'p_subsidy_cle_id');
2585          x_return_status := OKL_API.G_RET_STS_ERROR;
2586          Raise OKL_API.G_EXCEPTION_ERROR;
2587     Elsif (p_subsidy_cle_id is not NULL) and (p_subsidy_cle_id <> OKL_API.G_MISS_NUM) then
2588         validate_cle_id(p_cle_id        => p_subsidy_cle_id,
2589                         p_lty_code      => 'SUBSIDY',
2590                         x_return_status => x_return_status);
2591         IF x_return_status = OKL_API.G_RET_STS_ERROR then
2592             OKL_API.set_message(G_APP_NAME, G_INVALID_VALUE,G_COL_NAME_TOKEN,'p_subsidy_cle_id');
2593             Raise OKL_API.G_EXCEPTION_ERROR;
2594         Elsif x_return_status = OKL_API.G_RET_STS_UNEXP_ERROR then
2595             Raise OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
2596         End If;
2597     End If;
2598 
2599     --2.validate p_override_yn
2600     If p_override_yn is NULL Then
2601         OKL_API.set_message(
2602                               p_app_name     => G_APP_NAME,
2603                               p_msg_name     => G_API_MISSING_PARAMETER,
2604                               p_token1       => G_API_NAME_TOKEN,
2605                               p_token1_value => l_api_name,
2606                               p_token2       => G_MISSING_PARAM_TOKEN,
2607                               p_token2_value => 'p_override_yn');
2608          x_return_status := OKL_API.G_RET_STS_ERROR;
2609          Raise OKL_API.G_EXCEPTION_ERROR;
2610 
2611     ElsIf (p_override_yn is Not Null) then
2612        If p_override_yn not in (OKL_API.G_TRUE,OKL_API.G_FALSE) then
2613            OKL_API.set_message(G_APP_NAME, G_INVALID_VALUE,G_COL_NAME_TOKEN,'p_override_yn');
2614            Raise OKL_API.G_EXCEPTION_ERROR;
2615        End If;
2616     End If;
2617     -----------------------------------
2618     --end of input variable validations
2619     -----------------------------------
2620 
2621     If p_override_yn = OKL_API.G_TRUE then
2622         open l_kle_csr (p_cle_id => p_subsidy_cle_id);
2623         fetch l_kle_csr into l_subsidy_override_amount;
2624         if l_kle_csr%NOTFOUND then
2625             Null;
2626         End If;
2627         close l_kle_csr;
2628     End If;
2629 
2630     If (l_subsidy_override_amount is NOT NULL) and
2631        (l_subsidy_override_amount <> OKL_API.G_MISS_NUM) and
2632        (p_override_yn = OKL_API.G_TRUE)  then
2633 
2634         l_subsidy_amount := l_subsidy_override_amount;
2635 
2636     Elsif (l_subsidy_override_amount is NULL) OR
2637           (l_subsidy_override_amount = OKL_API.G_MISS_NUM) OR
2638           (p_override_yn = OKL_API.G_FALSE) then
2639 
2640         calculate_subsidy_amount(
2641                                  p_api_version     => p_api_version,
2642                                  p_init_msg_list   => p_init_msg_list,
2643                                  x_return_status   => x_return_status,
2644                                  x_msg_count       => x_msg_count,
2645                                  x_msg_data        => x_msg_data,
2646                                  p_subsidy_cle_id  => p_subsidy_cle_id,
2647                                  x_subsidy_amount  => l_subsidy_amount);
2648 
2649         IF (x_return_status = OKL_API.G_RET_STS_UNEXP_ERROR) THEN
2650             RAISE OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
2651         ELSIF (x_return_status = OKL_API.G_RET_STS_ERROR) THEN
2652             RAISE OKL_API.G_EXCEPTION_ERROR;
2653         END IF;
2654 
2655     End If;
2656 
2657     x_subsidy_amount := l_subsidy_amount;
2658     OKL_API.END_ACTIVITY (x_msg_count,x_msg_data );
2659 
2660     EXCEPTION
2661     WHEN OKL_API.G_EXCEPTION_ERROR THEN
2662     If l_kle_csr%ISOPEN then
2663         close l_kle_csr;
2664     End If;
2665     x_return_status := OKL_API.HANDLE_EXCEPTIONS(
2666                                l_api_name,
2667                                G_PKG_NAME,
2668                                'OKL_API.G_RET_STS_ERROR',
2669                                x_msg_count,
2670                                x_msg_data,
2671                                '_PVT');
2672     WHEN OKL_API.G_EXCEPTION_UNEXPECTED_ERROR THEN
2673     If l_kle_csr%ISOPEN then
2674         close l_kle_csr;
2675     End If;
2676     x_return_status :=OKL_API.HANDLE_EXCEPTIONS(
2677                               l_api_name,
2678                               G_PKG_NAME,
2679                               'OKL_API.G_RET_STS_UNEXP_ERROR',
2680                               x_msg_count,
2681                               x_msg_data,
2682                               '_PVT');
2683     WHEN OTHERS THEN
2684     If l_kle_csr%ISOPEN then
2685         close l_kle_csr;
2686     End If;
2687     x_return_status :=OKL_API.HANDLE_EXCEPTIONS(
2688                               l_api_name,
2689                               G_PKG_NAME,
2690                               'OTHERS',
2691                               x_msg_count,
2692                               x_msg_data,
2693                               '_PVT');
2694 END calculate_subsidy_amount;
2695 --------------------------------------------------------------------------------
2696 --Name         : get_subsidy_amount
2697 --Description  : API to get subsidy amount based on subsidy calculation
2698 --               criteria for a subsidy line
2699 -- PARAMETERS  : IN - p_subsidy_cle_id  : subsidy line id
2700 --               OUT - x_subsidy_amount: subsidy amount
2701 --------------------------------------------------------------------------------
2702 PROCEDURE get_subsidy_amount(
2703     p_api_version                  IN NUMBER,
2704     p_init_msg_list                IN VARCHAR2,
2705     x_return_status                OUT NOCOPY VARCHAR2,
2706     x_msg_count                    OUT NOCOPY NUMBER,
2707     x_msg_data                     OUT NOCOPY VARCHAR2,
2708     p_subsidy_cle_id               IN  NUMBER,
2709     x_subsidy_amount               OUT NOCOPY NUMBER) is
2710 
2711     l_return_status        VARCHAR2(1)  default OKL_API.G_RET_STS_SUCCESS;
2712     l_api_name             CONSTANT     varchar2(30) := 'GET_SUBSIDY_AMOUNT';
2713     l_api_version          CONSTANT     NUMBER := 1.0;
2714 
2715     l_subsidy_amount       Number;
2716 
2717     --cursor to get subsidy amount
2718     --should read override amount if it is specified, else amount
2719     cursor l_cleb_csr (p_cle_id in number) is
2720     select nvl(kle.subsidy_override_amount,nvl(kle.amount,0))
2721     from   okl_k_lines    kle,
2722            okc_k_lines_b  cleb
2723     where  kle.id       = cleb.id
2724     and    cleb.id      = p_subsidy_cle_id
2725     and    cleb.sts_code <> 'ABANDONED';
2726 
2727 
2728 
2729 Begin
2730     x_return_status := OKL_API.G_RET_STS_SUCCESS;
2731 
2732     -----------------------------------------
2733     --start of input parameter validations
2734     -----------------------------------------
2735     --1.validate p_subsidy_cle_id
2736     If (p_subsidy_cle_id is NULL) or (p_subsidy_cle_id = OKL_API.G_MISS_NUM) then
2737         OKL_API.set_message(
2738                               p_app_name     => G_APP_NAME,
2739                               p_msg_name     => G_API_MISSING_PARAMETER,
2740                               p_token1       => G_API_NAME_TOKEN,
2741                               p_token1_value => l_api_name,
2742                               p_token2       => G_MISSING_PARAM_TOKEN,
2743                               p_token2_value => 'p_subsidy_cle_id');
2744          x_return_status := OKL_API.G_RET_STS_ERROR;
2745          Raise OKL_API.G_EXCEPTION_ERROR;
2746     Elsif (p_subsidy_cle_id is not NULL) and (p_subsidy_cle_id <> OKL_API.G_MISS_NUM) then
2747         validate_cle_id(p_cle_id        => p_subsidy_cle_id,
2748                         p_lty_code      => 'SUBSIDY',
2749                         x_return_status => x_return_status);
2750         IF x_return_status = OKL_API.G_RET_STS_ERROR then
2751             OKL_API.set_message(G_APP_NAME, G_INVALID_VALUE,G_COL_NAME_TOKEN,'p_subsidy_cle_id');
2752             Raise OKL_API.G_EXCEPTION_ERROR;
2753         Elsif x_return_status = OKL_API.G_RET_STS_UNEXP_ERROR then
2754             Raise OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
2755         End If;
2756     End If;
2757     -------------------------------------
2758     --end of input parameter validations
2759     -------------------------------------
2760 
2761 
2762     l_subsidy_amount := 0;
2763     -----------------------------------------------
2764     -- fetch the subsidy amount from subsidy line
2765     -----------------------------------------------
2766     Open l_cleb_csr (p_cle_id => p_subsidy_cle_id);
2767     fetch l_cleb_csr into  l_subsidy_amount;
2768     If  l_cleb_csr%NOTFOUND then
2769         null;
2770     End If;
2771     Close l_cleb_csr;
2772 
2773     x_subsidy_amount := l_subsidy_amount;
2774 
2775     EXCEPTION
2776     WHEN OKL_API.G_EXCEPTION_ERROR THEN
2777     If l_cleb_csr%ISOPEN then
2778         CLOSE l_cleb_csr;
2779     End If;
2780     x_return_status := OKL_API.HANDLE_EXCEPTIONS(
2781                                l_api_name,
2782                                G_PKG_NAME,
2783                                'OKL_API.G_RET_STS_ERROR',
2784                                x_msg_count,
2785                                x_msg_data,
2786                                '_PVT');
2787     WHEN OKL_API.G_EXCEPTION_UNEXPECTED_ERROR THEN
2788     If l_cleb_csr%ISOPEN then
2789         CLOSE l_cleb_csr;
2790     End If;
2791     x_return_status :=OKL_API.HANDLE_EXCEPTIONS(
2792                               l_api_name,
2793                               G_PKG_NAME,
2794                               'OKL_API.G_RET_STS_UNEXP_ERROR',
2795                               x_msg_count,
2796                               x_msg_data,
2797                               '_PVT');
2798     WHEN OTHERS THEN
2799     If l_cleb_csr%ISOPEN then
2800         CLOSE l_cleb_csr;
2801     End If;
2802     x_return_status :=OKL_API.HANDLE_EXCEPTIONS(
2803                               l_api_name,
2804                               G_PKG_NAME,
2805                               'OTHERS',
2806                               x_msg_count,
2807                               x_msg_data,
2808                               '_PVT');
2809 End get_subsidy_amount;
2810 --------------------------------------------------------------------------------
2811 --Name         : get_subsidy_amount
2812 --Description  : API to get subsidy amount along with other details from the
2813 --               subsidy line
2814 -- PARAMETERS  : IN - p_subsidy_cle_id  : subsidy line id
2815 --               OUT - x_asbv_rec : subsidy amount with details of vendor, pay to
2816 --                                  details etc (AM may need this)
2817 --------------------------------------------------------------------------------
2818 PROCEDURE get_subsidy_amount(
2819     p_api_version                  IN NUMBER,
2820     p_init_msg_list                IN VARCHAR2,
2821     x_return_status                OUT NOCOPY VARCHAR2,
2822     x_msg_count                    OUT NOCOPY NUMBER,
2823     x_msg_data                     OUT NOCOPY VARCHAR2,
2824     p_subsidy_cle_id               IN  NUMBER,
2825     x_asbv_rec                     OUT NOCOPY asbv_rec_type) is
2826 
2827 
2828     l_return_status        VARCHAR2(1)  default OKL_API.G_RET_STS_SUCCESS;
2829     l_api_name             CONSTANT     varchar2(30) := 'GET_SUBSIDY_AMOUNT';
2830     l_api_version          CONSTANT     NUMBER := 1.0;
2831 
2832     l_asbv_rec         asbv_rec_type;
2833     l_subsidy_amount   number;
2834 
2835     --Cursor to get other subsdiy details
2836     cursor l_sub_dtls_csr (p_subsidy_cle_id in number) is
2837     select
2838         sub_kle.subsidy_id              subsidy_id
2839        ,sub_cleb.id                     subsidy_cle_id
2840        ,sub_clet.name                   name
2841        ,sub_clet.item_description       description
2842        ,sub_kle.sty_id                  stream_type_id
2843        ,subb.accounting_method_code     accounting_method_code
2844        ,subb.maximum_term               maximum_term
2845        ,sub_kle.subsidy_override_amount subsidy_override_amount
2846        ,sub_cleb.dnz_chr_id             dnz_chr_id
2847        ,sub_cleb.cle_id                 asset_cle_id
2848        ,cplb.id                         cpl_id
2849        ,pov.vendor_id                   vendor_id
2850        ,pov.vendor_name                 vendor_name
2851        ,ppyd.pay_site_id                pay_site_id
2852        ,ppyd.payment_term_id            payment_term_id
2853        ,ppyd.payment_method_code        payment_method_code
2854        ,ppyd.pay_group_code             pay_group_code
2855        --
2856        ,sub_cleb.start_date             start_date
2857        ,sub_cleb.end_date               end_date
2858        ,subb.expire_after_days          expire_after_days
2859        ,subb.currency_code              currency_code
2860        ,subb.exclusive_yn               exclusive_yn
2861        ,subb.applicable_to_release_yn   applicable_to_release_yn
2862        ,subb.recourse_yn                recourse_yn
2863        ,subb.termination_refund_basis   termination_refund_basis
2864        ,subb.refund_formula_id          refund_formula_id
2865        ,subb.receipt_method_code        receipt_method_code
2866        ,subb.customer_visible_yn        customer_visible_yn
2867    from okl_subsidies_b        subb,
2868         okc_k_lines_b          sub_cleb,
2869         okc_k_lines_tl         sub_clet,
2870         okl_k_lines            sub_kle,
2871         okc_k_party_roles_b    cplb,
2872         po_vendors             pov,
2873         okl_party_payment_dtls ppyd
2874    where ppyd.cpl_id(+)          = cplb.id --payment details may not be mandatory
2875    and   ppyd.vendor_id(+)       = cplb.object1_id1
2876    and   to_char(pov.vendor_id)  = cplb.object1_id1
2877    and   cplb.object1_id2        = '#'
2878    and   cplb.jtot_object1_code  = 'OKX_VENDOR'
2879    and   cplb.rle_code           = 'OKL_VENDOR'
2880    and   cplb.cle_id             = sub_cleb.id
2881    and   cplb.dnz_chr_id         = sub_cleb.dnz_chr_id
2882    and   subb.id                 = sub_kle.subsidy_id
2883    and   sub_kle.id              = sub_cleb.id
2884    and   sub_clet.id             = sub_cleb.id
2885    and   sub_clet.language       = userenv('LANG')
2886    and   sub_cleb.id             = p_subsidy_cle_id;
2887 
2888    l_sub_dtls_rec l_sub_dtls_csr%ROWTYPE;
2889 
2890 Begin
2891     x_return_status := OKL_API.G_RET_STS_SUCCESS;
2892 
2893     ---------------------------------------
2894     --start of input parameter validations
2895     ---------------------------------------
2896     --1.validate p_subsidy_cle_id
2897     If (p_subsidy_cle_id is NULL) or (p_subsidy_cle_id = OKL_API.G_MISS_NUM) then
2898         OKL_API.set_message(
2899                               p_app_name     => G_APP_NAME,
2900                               p_msg_name     => G_API_MISSING_PARAMETER,
2901                               p_token1       => G_API_NAME_TOKEN,
2902                               p_token1_value => l_api_name,
2903                               p_token2       => G_MISSING_PARAM_TOKEN,
2904                               p_token2_value => 'p_subsidy_cle_id');
2905          x_return_status := OKL_API.G_RET_STS_ERROR;
2906          Raise OKL_API.G_EXCEPTION_ERROR;
2907     Elsif (p_subsidy_cle_id is not NULL) and (p_subsidy_cle_id <> OKL_API.G_MISS_NUM) then
2908         validate_cle_id(p_cle_id        => p_subsidy_cle_id,
2909                         p_lty_code      => 'SUBSIDY',
2910                         x_return_status => x_return_status);
2911         IF x_return_status = OKL_API.G_RET_STS_ERROR then
2912             OKL_API.set_message(G_APP_NAME, G_INVALID_VALUE,G_COL_NAME_TOKEN,'p_subsidy_cle_id');
2913             Raise OKL_API.G_EXCEPTION_ERROR;
2914         Elsif x_return_status = OKL_API.G_RET_STS_UNEXP_ERROR then
2915             Raise OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
2916         End If;
2917     End If;
2918     ------------------------------------------
2919     --end of input parameter validations
2920     ------------------------------------------
2921 
2922 
2923     ------------------------------------------------------
2924     --call api to get subsidy amount
2925     ------------------------------------------------------
2926     get_subsidy_amount(
2927     p_api_version      => p_api_version,
2928     p_init_msg_list    => p_init_msg_list,
2929     x_return_status    => x_return_status,
2930     x_msg_count        => x_msg_count,
2931     x_msg_data         => x_msg_data,
2932     p_subsidy_cle_id   => p_subsidy_cle_id,
2933     x_subsidy_amount   => l_subsidy_amount);
2934 
2935     IF (x_return_status = OKL_API.G_RET_STS_UNEXP_ERROR) THEN
2936        RAISE OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
2937     ELSIF (x_return_status = OKL_API.G_RET_STS_ERROR) THEN
2938        RAISE OKL_API.G_EXCEPTION_ERROR;
2939     END IF;
2940 
2941 
2942     ----------------------------------------------------------------------------
2943     --fetch other details for subsidy
2944     ----------------------------------------------------------------------------
2945     Open l_sub_dtls_csr(p_subsidy_cle_id => p_subsidy_cle_id);
2946     Fetch l_sub_dtls_csr into l_sub_dtls_rec;
2947     If l_sub_dtls_csr%NOTFOUND then
2948         --need to raise error here (should have been taken care in call above)
2949         null;
2950     End If;
2951     Close l_sub_dtls_csr;
2952 
2953     ----------------------------------------------------------------------------
2954     --initialize output rec
2955     ----------------------------------------------------------------------------
2956     l_asbv_rec.subsidy_id               := l_sub_dtls_rec.subsidy_id;
2957     l_asbv_rec.subsidy_cle_id           := l_sub_dtls_rec.subsidy_cle_id;
2958     l_asbv_rec.name                     := l_sub_dtls_rec.name;
2959     l_asbv_rec.description              := l_sub_dtls_rec.description;
2960     l_asbv_rec.amount                   := l_subsidy_amount;
2961     l_asbv_rec.stream_type_id           := l_sub_dtls_rec.stream_type_id;
2962     l_asbv_rec.accounting_method_code   := l_sub_dtls_rec.accounting_method_code;
2963     l_asbv_rec.maximum_term             := l_sub_dtls_rec.maximum_term;
2964     l_asbv_rec.subsidy_override_amount  := l_sub_dtls_rec.subsidy_override_amount;
2965     l_asbv_rec.dnz_chr_id               := l_sub_dtls_rec.dnz_chr_id;
2966     l_asbv_rec.asset_cle_id             := l_sub_dtls_rec.asset_cle_id;
2967     l_asbv_rec.cpl_id                   := l_sub_dtls_rec.cpl_id;
2968     l_asbv_rec.vendor_id                := l_sub_dtls_rec.vendor_id;
2969     l_asbv_rec.vendor_name              := l_sub_dtls_rec.vendor_name;
2970     l_asbv_rec.pay_site_id              := l_sub_dtls_rec.pay_site_id;
2971     l_asbv_rec.payment_term_id          := l_sub_dtls_rec.payment_term_id;
2972     l_asbv_rec.payment_method_code      := l_sub_dtls_rec.payment_method_code;
2973     l_asbv_rec.pay_group_code           := l_sub_dtls_rec.pay_group_code;
2974     --
2975     l_asbv_rec.start_date               := l_sub_dtls_rec.start_date;
2976     l_asbv_rec.end_date                 := l_sub_dtls_rec.end_date;
2977     l_asbv_rec.expire_after_days        := l_sub_dtls_rec.expire_after_days;
2978     l_asbv_rec.currency_code            := l_sub_dtls_rec.currency_code;
2979     l_asbv_rec.exclusive_yn             := l_sub_dtls_rec.exclusive_yn;
2980     l_asbv_rec.applicable_to_release_yn := l_sub_dtls_rec.applicable_to_release_yn;
2981     l_asbv_rec.recourse_yn              := l_sub_dtls_rec.recourse_yn;
2982     l_asbv_rec.termination_refund_basis := l_sub_dtls_rec.termination_refund_basis;
2983     l_asbv_rec.refund_formula_id        := l_sub_dtls_rec.refund_formula_id;
2984     l_asbv_rec.receipt_method_code      := l_sub_dtls_rec.receipt_method_code;
2985     l_asbv_rec.customer_visible_yn      := l_sub_dtls_rec.customer_visible_yn;
2986     ----------------------------------------------------------------------------
2987 
2988     x_asbv_rec := l_asbv_rec;
2989 
2990     EXCEPTION
2991     WHEN OKL_API.G_EXCEPTION_ERROR THEN
2992     x_return_status := OKL_API.HANDLE_EXCEPTIONS(
2993                                l_api_name,
2994                                G_PKG_NAME,
2995                                'OKL_API.G_RET_STS_ERROR',
2996                                x_msg_count,
2997                                x_msg_data,
2998                                '_PVT');
2999     WHEN OKL_API.G_EXCEPTION_UNEXPECTED_ERROR THEN
3000     x_return_status :=OKL_API.HANDLE_EXCEPTIONS(
3001                               l_api_name,
3002                               G_PKG_NAME,
3003                               'OKL_API.G_RET_STS_UNEXP_ERROR',
3004                               x_msg_count,
3005                               x_msg_data,
3006                               '_PVT');
3007     WHEN OTHERS THEN
3008     If l_sub_dtls_csr%ISOPEN then
3009         CLOSE l_sub_dtls_csr;
3010     End If;
3011     x_return_status :=OKL_API.HANDLE_EXCEPTIONS(
3012                               l_api_name,
3013                               G_PKG_NAME,
3014                               'OTHERS',
3015                               x_msg_count,
3016                               x_msg_data,
3017                               '_PVT');
3018 End get_subsidy_amount;
3019 --------------------------------------------------------------------------------
3020 --Name         : get_asset_subsidy_amount
3021 --Description  : API to fetch subsidy amount an asset
3022 -- PARAMETERS  : IN - p_asset_cle_id   : financial asset line id, p_accounting_method(NET or AMORTIZE)
3023 --               OUT - l_subsidy_amount: subsidy amount
3024 --------------------------------------------------------------------------------
3025 PROCEDURE get_asset_subsidy_amount(
3026     p_api_version                  IN NUMBER,
3027     p_init_msg_list                IN VARCHAR2,
3028     x_return_status                OUT NOCOPY VARCHAR2,
3029     x_msg_count                    OUT NOCOPY NUMBER,
3030     x_msg_data                     OUT NOCOPY VARCHAR2,
3031     p_asset_cle_id                 IN  NUMBER,
3032     p_accounting_method            IN  VARCHAR2,
3033     x_subsidy_amount               OUT NOCOPY NUMBER) is
3034 
3035     l_return_status        VARCHAR2(1)  default OKL_API.G_RET_STS_SUCCESS;
3036     l_api_name             CONSTANT     varchar2(30) := 'GET_ASSET_SUBSIDY';
3037     l_api_version          CONSTANT     NUMBER := 1.0;
3038 
3039     l_subsidy_amount       Number;
3040 
3041     l_asset_subsidy_amount Number;
3042 
3043     --cursor to fetch all the subsidies attached to financial asset
3044     cursor l_sub_csr(p_asset_cle_id in number) is
3045     select sub_cle.id
3046     from   okl_subsidies_b    subb,
3047            okl_k_lines        sub_kle,
3048            okc_k_lines_b      sub_cle,
3049            okc_line_styles_b  sub_lse
3050     where  subb.id                     = sub_kle.subsidy_id
3051     and    subb.accounting_method_code = nvl(upper(p_accounting_method),subb.accounting_method_code)
3052     and    sub_kle.id                  = sub_cle.id
3053     and    sub_cle.cle_id              = p_asset_cle_id
3054     and    sub_cle.lse_id              = sub_lse.id
3055     and    sub_lse.lty_code            = 'SUBSIDY'
3056     and    sub_cle.sts_code            <> 'ABANDONED';
3057 
3058     l_subsidy_cle_id number;
3059 begin
3060     x_return_status := OKL_API.G_RET_STS_SUCCESS;
3061 
3062 /*----commented this validation as it causes issues during booking
3063     --------------------------------------
3064     --start of input parameter validations
3065     --------------------------------------
3066     --1.validate p_asset_cle_id
3067     If (p_asset_cle_id is NULL) or (p_asset_cle_id = OKL_API.G_MISS_NUM) then
3068         OKL_API.set_message(
3069                               p_app_name     => G_APP_NAME,
3070                               p_msg_name     => G_API_MISSING_PARAMETER,
3071                               p_token1       => G_API_NAME_TOKEN,
3072                               p_token1_value => l_api_name,
3073                               p_token2       => G_MISSING_PARAM_TOKEN,
3074                               p_token2_value => 'p_asset_cle_id');
3075          x_return_status := OKL_API.G_RET_STS_ERROR;
3076          Raise OKL_API.G_EXCEPTION_ERROR;
3077     Elsif (p_asset_cle_id is not NULL) and (p_asset_cle_id <> OKL_API.G_MISS_NUM) then
3078         validate_cle_id(p_cle_id        => p_asset_cle_id,
3079                         p_lty_code      => 'FREE_FORM1',
3080                         x_return_status => x_return_status);
3081         IF x_return_status = OKL_API.G_RET_STS_ERROR then
3082             OKL_API.set_message(G_APP_NAME, G_INVALID_VALUE,G_COL_NAME_TOKEN,'p_asset_cle_id');
3083             Raise OKL_API.G_EXCEPTION_ERROR;
3084         Elsif x_return_status = OKL_API.G_RET_STS_UNEXP_ERROR then
3085             Raise OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
3086         End If;
3087     End If;
3088     --2.validate accounting method
3089     If (p_accounting_method is NOT NULL) then
3090         validate_acct_method(p_accounting_method => p_accounting_method,
3091                              x_return_status     => x_return_status);
3092        IF x_return_status = OKL_API.G_RET_STS_ERROR then
3093             OKL_API.set_message(G_APP_NAME, G_INVALID_VALUE,G_COL_NAME_TOKEN,'p_accounting_method');
3094             Raise OKL_API.G_EXCEPTION_ERROR;
3095         Elsif x_return_status = OKL_API.G_RET_STS_UNEXP_ERROR then
3096             Raise OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
3097         End If;
3098     End If;
3099     ------------------------------------
3100     --end of input parameter validations
3101     ------------------------------------
3102 ---commented this validation as this causes issues during booking------*/
3103 
3104 
3105 
3106     l_asset_subsidy_amount := 0;
3107 
3108     --------------------------------------------------------------
3109     --get all the subsidies associated to asset and get amount
3110     --------------------------------------------------------------
3111     Open l_sub_csr(p_asset_cle_id => p_asset_cle_id);
3112     Loop
3113         Fetch l_sub_csr into l_subsidy_cle_id;
3114         Exit when l_sub_csr%NOTFOUND;
3115         get_subsidy_amount(
3116             p_api_version      => p_api_version,
3117             p_init_msg_list    => p_init_msg_list,
3118             x_return_status    => x_return_status,
3119             x_msg_count        => x_msg_count,
3120             x_msg_data         => x_msg_data,
3121             p_subsidy_cle_id   => l_subsidy_cle_id,
3122             x_subsidy_amount   => l_subsidy_amount);
3123 
3124         IF (x_return_status = OKL_API.G_RET_STS_UNEXP_ERROR) THEN
3125             RAISE OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
3126         ELSIF (x_return_status = OKL_API.G_RET_STS_ERROR) THEN
3127             RAISE OKL_API.G_EXCEPTION_ERROR;
3128         END IF;
3129         l_asset_subsidy_Amount := l_asset_subsidy_Amount + l_subsidy_amount;
3130     End Loop;
3131     Close l_sub_csr;
3132 
3133     x_subsidy_amount := l_asset_subsidy_amount;
3134 
3135     EXCEPTION
3136     WHEN OKL_API.G_EXCEPTION_ERROR THEN
3137     x_return_status := OKL_API.HANDLE_EXCEPTIONS(
3138                                l_api_name,
3139                                G_PKG_NAME,
3140                                'OKL_API.G_RET_STS_ERROR',
3141                                x_msg_count,
3142                                x_msg_data,
3143                                '_PVT');
3144     WHEN OKL_API.G_EXCEPTION_UNEXPECTED_ERROR THEN
3145     x_return_status :=OKL_API.HANDLE_EXCEPTIONS(
3146                               l_api_name,
3147                               G_PKG_NAME,
3148                               'OKL_API.G_RET_STS_UNEXP_ERROR',
3149                               x_msg_count,
3150                               x_msg_data,
3151                               '_PVT');
3152     WHEN OTHERS THEN
3153     If l_sub_csr%ISOPEN then
3154         CLOSE l_sub_csr;
3155     End If;
3156     x_return_status :=OKL_API.HANDLE_EXCEPTIONS(
3157                               l_api_name,
3158                               G_PKG_NAME,
3159                               'OTHERS',
3160                               x_msg_count,
3161                               x_msg_data,
3162                               '_PVT');
3163 
3164 End get_asset_subsidy_amount;
3165 
3166 --------------------------------------------------------------------------------
3167 --Name         : get_asset_subsidy_amount
3168 --Description  : API to get subsidy amount for an asset
3169 -- PARAMETERS  : IN - p_asset_cle_id   : financial asset line id
3170 --               OUT - l_asbv_tbl:subsidy amount with additional details about
3171 --                     subsidy vendor
3172 --------------------------------------------------------------------------------
3173 PROCEDURE get_asset_subsidy_amount(
3174     p_api_version                  IN NUMBER,
3175     p_init_msg_list                IN VARCHAR2,
3176     x_return_status                OUT NOCOPY VARCHAR2,
3177     x_msg_count                    OUT NOCOPY NUMBER,
3178     x_msg_data                     OUT NOCOPY VARCHAR2,
3179     p_asset_cle_id                 IN  NUMBER,
3180     x_asbv_tbl                     OUT NOCOPY asbv_tbl_type) is
3181 
3182     l_return_status        VARCHAR2(1)  default OKL_API.G_RET_STS_SUCCESS;
3183     l_api_name             CONSTANT     varchar2(30) := 'GET_ASSET_SUBSIDY';
3184     l_api_version          CONSTANT     NUMBER := 1.0;
3185 
3186     l_asbv_tbl             asbv_tbl_type;
3187 
3188     --cursor to fetch all the subsidies attached to financial asset
3189     cursor l_sub_csr(p_asset_cle_id in number) is
3190     select sub_cle.id
3191     from   okc_k_lines_b      sub_cle,
3192            okc_line_styles_b  sub_lse
3193     where  sub_cle.cle_id   = p_asset_cle_id
3194     and    sub_cle.lse_id   = sub_lse.id
3195     and    sub_lse.lty_code = 'SUBSIDY'
3196     and    sub_cle.sts_code <> 'ABANDONED';
3197 
3198     l_subsidy_cle_id number;
3199     i number;
3200 
3201 begin
3202     x_return_status := OKL_API.G_RET_STS_SUCCESS;
3203 
3204     ---------------------------------------
3205     --start of input parameter validations
3206     ---------------------------------------
3207     --1.validate p_asset_cle_id
3208     If (p_asset_cle_id is NULL) or (p_asset_cle_id = OKL_API.G_MISS_NUM) then
3209         OKL_API.set_message(
3210                               p_app_name     => G_APP_NAME,
3211                               p_msg_name     => G_API_MISSING_PARAMETER,
3212                               p_token1       => G_API_NAME_TOKEN,
3213                               p_token1_value => l_api_name,
3214                               p_token2       => G_MISSING_PARAM_TOKEN,
3215                               p_token2_value => 'p_asset_cle_id');
3216          x_return_status := OKL_API.G_RET_STS_ERROR;
3217          Raise OKL_API.G_EXCEPTION_ERROR;
3218     Elsif (p_asset_cle_id is not NULL) and (p_asset_cle_id <> OKL_API.G_MISS_NUM) then
3219         validate_cle_id(p_cle_id        => p_asset_cle_id,
3220                         p_lty_code      => 'FREE_FORM1',
3221                         x_return_status => x_return_status);
3222         IF x_return_status = OKL_API.G_RET_STS_ERROR then
3223             OKL_API.set_message(G_APP_NAME, G_INVALID_VALUE,G_COL_NAME_TOKEN,'p_asset_cle_id');
3224             Raise OKL_API.G_EXCEPTION_ERROR;
3225         Elsif x_return_status = OKL_API.G_RET_STS_UNEXP_ERROR then
3226             Raise OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
3227         End If;
3228     End If;
3229     -------------------------------------
3230     --end of input parameter validations
3231     -------------------------------------
3232 
3233     i := 0;
3234     Open l_sub_csr(p_asset_cle_id => p_asset_cle_id);
3235     Loop
3236         Fetch l_sub_csr into l_subsidy_cle_id;
3237         Exit when l_sub_csr%NOTFOUND;
3238         i := i + 1;
3239         get_subsidy_amount(
3240             p_api_version      => p_api_version,
3241             p_init_msg_list    => p_init_msg_list,
3242             x_return_status    => x_return_status,
3243             x_msg_count        => x_msg_count,
3244             x_msg_data         => x_msg_data,
3245             p_subsidy_cle_id   => l_subsidy_cle_id,
3246             x_asbv_rec         => l_asbv_tbl(i));
3247 
3248         IF (x_return_status = OKL_API.G_RET_STS_UNEXP_ERROR) THEN
3249             RAISE OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
3250         ELSIF (x_return_status = OKL_API.G_RET_STS_ERROR) THEN
3251             RAISE OKL_API.G_EXCEPTION_ERROR;
3252         END IF;
3253     End Loop;
3254     Close l_sub_csr;
3255 
3256     x_asbv_tbl := l_asbv_tbl;
3257 
3258     EXCEPTION
3259     WHEN OKL_API.G_EXCEPTION_ERROR THEN
3260     x_return_status := OKL_API.HANDLE_EXCEPTIONS(
3261                                l_api_name,
3262                                G_PKG_NAME,
3263                                'OKL_API.G_RET_STS_ERROR',
3264                                x_msg_count,
3265                                x_msg_data,
3266                                '_PVT');
3267     WHEN OKL_API.G_EXCEPTION_UNEXPECTED_ERROR THEN
3268     x_return_status :=OKL_API.HANDLE_EXCEPTIONS(
3269                               l_api_name,
3270                               G_PKG_NAME,
3271                               'OKL_API.G_RET_STS_UNEXP_ERROR',
3272                               x_msg_count,
3273                               x_msg_data,
3274                               '_PVT');
3275     WHEN OTHERS THEN
3276     If l_sub_csr%ISOPEN then
3277         CLOSE l_sub_csr;
3278     End If;
3279     x_return_status :=OKL_API.HANDLE_EXCEPTIONS(
3280                               l_api_name,
3281                               G_PKG_NAME,
3282                               'OTHERS',
3283                               x_msg_count,
3284                               x_msg_data,
3285                               '_PVT');
3286 
3287 End get_asset_subsidy_amount;
3288 --------------------------------------------------------------------------------
3289 --Name         : calculate_asset_subsidy
3290 --Description  : API to calculate total subsidy amount for an asset
3291 -- PARAMETERS  : IN - p_asset_cle_id   : financial asset line id
3292 --               OUT - l_subsidy_amount: subsidy amount
3293 --------------------------------------------------------------------------------
3294 PROCEDURE calculate_asset_subsidy(
3295     p_api_version                  IN NUMBER,
3296     p_init_msg_list                IN VARCHAR2,
3297     x_return_status                OUT NOCOPY VARCHAR2,
3298     x_msg_count                    OUT NOCOPY NUMBER,
3299     x_msg_data                     OUT NOCOPY VARCHAR2,
3300     p_asset_cle_id                 IN  NUMBER,
3301     x_subsidy_amount               OUT NOCOPY NUMBER) is
3302 
3303     l_return_status        VARCHAR2(1)  default OKL_API.G_RET_STS_SUCCESS;
3304     l_api_name             CONSTANT     varchar2(30) := 'CALC_ASSET_SUBSIDY';
3305     l_api_version          CONSTANT     NUMBER := 1.0;
3306 
3307     l_subsidy_amount       Number;
3308 
3309     l_asset_subsidy_amount Number;
3310 
3311     --cursor to fetch all the subsidies attached to financial asset
3312     cursor l_sub_csr(p_asset_cle_id in number) is
3313     select sub_cle.id
3314     from   okc_k_lines_b      sub_cle,
3315            okc_line_styles_b  sub_lse
3316     where  sub_cle.cle_id   = p_asset_cle_id
3317     and    sub_cle.lse_id   = sub_lse.id
3318     and    sub_lse.lty_code = 'SUBSIDY'
3319     and    sub_cle.sts_code <> 'ABANDONED';
3320 
3321     l_subsidy_cle_id number;
3322 begin
3323     x_return_status := OKL_API.G_RET_STS_SUCCESS;
3324 
3325     ---------------------------------------
3326     --start of input parameter validations
3327     ---------------------------------------
3328     --1.validate p_asset_cle_id
3329     If (p_asset_cle_id is NULL) or (p_asset_cle_id = OKL_API.G_MISS_NUM) then
3330         OKL_API.set_message(
3331                               p_app_name     => G_APP_NAME,
3332                               p_msg_name     => G_API_MISSING_PARAMETER,
3333                               p_token1       => G_API_NAME_TOKEN,
3334                               p_token1_value => l_api_name,
3335                               p_token2       => G_MISSING_PARAM_TOKEN,
3336                               p_token2_value => 'p_asset_cle_id');
3337          x_return_status := OKL_API.G_RET_STS_ERROR;
3338          Raise OKL_API.G_EXCEPTION_ERROR;
3339     Elsif (p_asset_cle_id is not NULL) and (p_asset_cle_id <> OKL_API.G_MISS_NUM) then
3340         validate_cle_id(p_cle_id        => p_asset_cle_id,
3341                         p_lty_code      => 'FREE_FORM1',
3342                         x_return_status => x_return_status);
3343         IF x_return_status = OKL_API.G_RET_STS_ERROR then
3344             OKL_API.set_message(G_APP_NAME, G_INVALID_VALUE,G_COL_NAME_TOKEN,'p_asset_cle_id');
3345             Raise OKL_API.G_EXCEPTION_ERROR;
3346         Elsif x_return_status = OKL_API.G_RET_STS_UNEXP_ERROR then
3347             Raise OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
3348         End If;
3349     End If;
3350     ------------------------------------
3351     --end of input parameter validations
3352     ------------------------------------
3353 
3354     l_asset_subsidy_amount := 0;
3355 
3356     --------------------------------------------------------------
3357     --get all the subsidies associated to asset and get amount
3358     --------------------------------------------------------------
3359     Open l_sub_csr(p_asset_cle_id => p_asset_cle_id);
3360     Loop
3361         Fetch l_sub_csr into l_subsidy_cle_id;
3362         Exit when l_sub_csr%NOTFOUND;
3363         calculate_subsidy_amount(
3364             p_api_version      => p_api_version,
3365             p_init_msg_list    => p_init_msg_list,
3366             x_return_status    => x_return_status,
3367             x_msg_count        => x_msg_count,
3368             x_msg_data         => x_msg_data,
3369             p_subsidy_cle_id   => l_subsidy_cle_id,
3370             p_override_yn      => OKL_API.G_TRUE,
3371             x_subsidy_amount   => l_subsidy_amount);
3372 
3373         IF (x_return_status = OKL_API.G_RET_STS_UNEXP_ERROR) THEN
3374             RAISE OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
3375         ELSIF (x_return_status = OKL_API.G_RET_STS_ERROR) THEN
3376             RAISE OKL_API.G_EXCEPTION_ERROR;
3377         END IF;
3378         l_asset_subsidy_Amount := l_asset_subsidy_Amount + l_subsidy_amount;
3379     End Loop;
3380     Close l_sub_csr;
3381 
3382     x_subsidy_amount := l_asset_subsidy_amount;
3383 
3384     EXCEPTION
3385     WHEN OKL_API.G_EXCEPTION_ERROR THEN
3386     x_return_status := OKL_API.HANDLE_EXCEPTIONS(
3387                                l_api_name,
3388                                G_PKG_NAME,
3389                                'OKL_API.G_RET_STS_ERROR',
3390                                x_msg_count,
3391                                x_msg_data,
3392                                '_PVT');
3393     WHEN OKL_API.G_EXCEPTION_UNEXPECTED_ERROR THEN
3394     x_return_status :=OKL_API.HANDLE_EXCEPTIONS(
3395                               l_api_name,
3396                               G_PKG_NAME,
3397                               'OKL_API.G_RET_STS_UNEXP_ERROR',
3398                               x_msg_count,
3399                               x_msg_data,
3400                               '_PVT');
3401     WHEN OTHERS THEN
3402     If l_sub_csr%ISOPEN then
3403         CLOSE l_sub_csr;
3404     End If;
3405     x_return_status :=OKL_API.HANDLE_EXCEPTIONS(
3406                               l_api_name,
3407                               G_PKG_NAME,
3408                               'OTHERS',
3409                               x_msg_count,
3410                               x_msg_data,
3411                               '_PVT');
3412 
3413 End calculate_asset_subsidy;
3414 --------------------------------------------------------------------------------
3415 --Name         : get_contract_subsidy_amount
3416 --Description  : API to fetch subsidy amount for the contract
3417 -- PARAMETERS  : IN - p_chr_id   : Contract id
3418 --               OUT - x_subsidy_amount:subsidy amount
3419 --------------------------------------------------------------------------------
3420 PROCEDURE get_contract_subsidy_amount(
3421     p_api_version                  IN NUMBER,
3422     p_init_msg_list                IN VARCHAR2,
3423     x_return_status                OUT NOCOPY VARCHAR2,
3424     x_msg_count                    OUT NOCOPY NUMBER,
3425     x_msg_data                     OUT NOCOPY VARCHAR2,
3426     p_chr_id                       IN  NUMBER,
3427     p_accounting_method            IN  VARCHAR2,
3428     x_subsidy_amount               OUT NOCOPY NUMBER) is
3429 
3430     l_return_status        VARCHAR2(1)  default OKL_API.G_RET_STS_SUCCESS;
3431     l_api_name             CONSTANT     varchar2(30) := 'GET_CONTRACT_SUBSIDY';
3432     l_api_version          CONSTANT     NUMBER := 1.0;
3433 
3434     l_subsidy_amount            number;
3435     l_chr_subsidy_amount        number;
3436 
3437     --cursor to get all the financial assets in the contract
3438     cursor l_asst_csr(p_chr_id in number) is
3439     select cleb.id
3440     from   okc_k_lines_b      cleb,
3441            okc_line_styles_b  lseb,
3442            okc_statuses_b     stsb
3443     where  cleb.chr_id      = p_chr_id
3444     and    cleb.dnz_chr_id  = p_chr_id
3445     and    cleb.lse_id      = lseb.id
3446     and    lseb.lty_code    = 'FREE_FORM1'
3447     and    cleb.sts_code    = stsb.code
3448     and    stsb.ste_code    not in ('HOLD','EXPIRED','TERMINATED','CANCELLED');
3449 
3450     l_asset_cle_id    number;
3451 
3452 begin
3453     x_return_status := OKL_API.G_RET_STS_SUCCESS;
3454 
3455     -------------------------------------
3456     --start of input parameter validations
3457     -------------------------------------
3458     --1.validate p_chr_id
3459     If (p_chr_id is NULL) or (p_chr_id = OKL_API.G_MISS_NUM) then
3460         OKL_API.set_message(
3461                               p_app_name     => G_APP_NAME,
3462                               p_msg_name     => G_API_MISSING_PARAMETER,
3463                               p_token1       => G_API_NAME_TOKEN,
3464                               p_token1_value => l_api_name,
3465                               p_token2       => G_MISSING_PARAM_TOKEN,
3466                               p_token2_value => 'p_chr_id');
3467          x_return_status := OKL_API.G_RET_STS_ERROR;
3468          Raise OKL_API.G_EXCEPTION_ERROR;
3469     Elsif (p_chr_id is not NULL) and (p_chr_id <> OKL_API.G_MISS_NUM) then
3470         validate_chr_id(p_chr_id        => p_chr_id,
3471                         x_return_status => x_return_status);
3472         IF x_return_status = OKL_API.G_RET_STS_ERROR then
3473             OKL_API.set_message(G_APP_NAME, G_INVALID_VALUE,G_COL_NAME_TOKEN,'p_chr_id');
3474             Raise OKL_API.G_EXCEPTION_ERROR;
3475         Elsif x_return_status = OKL_API.G_RET_STS_UNEXP_ERROR then
3476             Raise OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
3477         End If;
3478     End If;
3479     --2.validate accounting method
3480     If (p_accounting_method is NOT NULL) then
3481         validate_acct_method(p_accounting_method => p_accounting_method,
3482                              x_return_status     => x_return_status);
3483        IF x_return_status = OKL_API.G_RET_STS_ERROR then
3484             OKL_API.set_message(G_APP_NAME, G_INVALID_VALUE,G_COL_NAME_TOKEN,'p_accounting_method');
3485             Raise OKL_API.G_EXCEPTION_ERROR;
3486         Elsif x_return_status = OKL_API.G_RET_STS_UNEXP_ERROR then
3487             Raise OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
3488         End If;
3489     End If;
3490     ------------------------------------
3491     --end of input parameter validations
3492     -------------------------------------
3493 
3494     l_chr_subsidy_amount := 0;
3495     Open l_asst_csr(p_chr_id => p_chr_id);
3496     Loop
3497         Fetch l_asst_csr into l_asset_cle_id;
3498         Exit when l_asst_csr%NOTFOUND;
3499         get_asset_subsidy_amount(
3500             p_api_version       => p_api_version,
3501             p_init_msg_list     => p_init_msg_list,
3502             x_return_status     => x_return_status,
3503             x_msg_count         => x_msg_count,
3504             x_msg_data          => x_msg_data,
3505             p_asset_cle_id      => l_asset_cle_id,
3506             p_accounting_method => p_accounting_method,
3507             x_subsidy_amount    => l_subsidy_amount);
3508 
3509         IF (x_return_status = OKL_API.G_RET_STS_UNEXP_ERROR) THEN
3510             RAISE OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
3511         ELSIF (x_return_status = OKL_API.G_RET_STS_ERROR) THEN
3512             RAISE OKL_API.G_EXCEPTION_ERROR;
3513         END IF;
3514         l_chr_subsidy_Amount := l_chr_subsidy_Amount + l_subsidy_amount;
3515     End Loop;
3516     Close l_asst_csr;
3517 
3518     x_subsidy_amount := l_chr_subsidy_amount;
3519 
3520     EXCEPTION
3521     WHEN OKL_API.G_EXCEPTION_ERROR THEN
3522     x_return_status := OKL_API.HANDLE_EXCEPTIONS(
3523                                l_api_name,
3524                                G_PKG_NAME,
3525                                'OKL_API.G_RET_STS_ERROR',
3526                                x_msg_count,
3527                                x_msg_data,
3528                                '_PVT');
3529     WHEN OKL_API.G_EXCEPTION_UNEXPECTED_ERROR THEN
3530     x_return_status :=OKL_API.HANDLE_EXCEPTIONS(
3531                               l_api_name,
3532                               G_PKG_NAME,
3533                               'OKL_API.G_RET_STS_UNEXP_ERROR',
3534                               x_msg_count,
3535                               x_msg_data,
3536                               '_PVT');
3537     WHEN OTHERS THEN
3538     If l_asst_csr%ISOPEN then
3539         CLOSE l_asst_csr;
3540     End If;
3541     x_return_status :=OKL_API.HANDLE_EXCEPTIONS(
3542                               l_api_name,
3543                               G_PKG_NAME,
3544                               'OTHERS',
3545                               x_msg_count,
3546                               x_msg_data,
3547                               '_PVT');
3548 end get_contract_subsidy_amount;
3549 --------------------------------------------------------------------------------
3550 --Name         : get_contract_subsidy_amount
3551 --Description  : API to fetch subsidy amount for the contract
3552 -- PARAMETERS  : IN - p_chr_id    : Contract id
3553 --               OUT - x_asbv_tbl : subsidy amount with additional vendor details
3554 --------------------------------------------------------------------------------
3555 PROCEDURE get_contract_subsidy_amount(
3556     p_api_version                  IN NUMBER,
3557     p_init_msg_list                IN VARCHAR2,
3558     x_return_status                OUT NOCOPY VARCHAR2,
3559     x_msg_count                    OUT NOCOPY NUMBER,
3560     x_msg_data                     OUT NOCOPY VARCHAR2,
3561     p_chr_id                       IN  NUMBER,
3562     x_asbv_tbl                     OUT NOCOPY asbv_tbl_type) is
3563 
3564     l_return_status        VARCHAR2(1)  default OKL_API.G_RET_STS_SUCCESS;
3565     l_api_name             CONSTANT     varchar2(30) := 'GET_CONTRACT_SUBSIDY';
3566     l_api_version          CONSTANT     NUMBER := 1.0;
3567 
3568     l_asset_asbv_tbl             asbv_tbl_type;
3569     l_chr_asbv_tbl               asbv_tbl_type;
3570     i                            number;
3571     j                            number;
3572 
3573     --cursor to get all the financial assets in the contract
3574     cursor l_asst_csr(p_chr_id in number) is
3575     select cleb.id
3576     from   okc_k_lines_b      cleb,
3577            okc_line_styles_b  lseb,
3578            okc_statuses_b     stsb
3579     where  cleb.chr_id      = p_chr_id
3580     and    cleb.dnz_chr_id  = p_chr_id
3581     and    cleb.lse_id      = lseb.id
3582     and    lseb.lty_code    = 'FREE_FORM1'
3583     and    cleb.sts_code    = stsb.code
3584     and    stsb.ste_code    not in ('HOLD','EXPIRED','TERMINATED','CANCELLED');
3585 
3586     l_asset_cle_id    number;
3587 
3588 begin
3589     x_return_status := OKL_API.G_RET_STS_SUCCESS;
3590 
3591     -----------------------------------------
3592     --start of input parameter validations
3593     ----------------------------------------
3594     --1.validate p_chr_id
3595     If (p_chr_id is NULL) or (p_chr_id = OKL_API.G_MISS_NUM) then
3596         OKL_API.set_message(
3597                               p_app_name     => G_APP_NAME,
3598                               p_msg_name     => G_API_MISSING_PARAMETER,
3599                               p_token1       => G_API_NAME_TOKEN,
3600                               p_token1_value => l_api_name,
3601                               p_token2       => G_MISSING_PARAM_TOKEN,
3602                               p_token2_value => 'p_chr_id');
3603          x_return_status := OKL_API.G_RET_STS_ERROR;
3604          Raise OKL_API.G_EXCEPTION_ERROR;
3605     Elsif (p_chr_id is not NULL) and (p_chr_id <> OKL_API.G_MISS_NUM) then
3606         validate_chr_id(p_chr_id        => p_chr_id,
3607                         x_return_status => x_return_status);
3608         IF x_return_status = OKL_API.G_RET_STS_ERROR then
3609             OKL_API.set_message(G_APP_NAME, G_INVALID_VALUE,G_COL_NAME_TOKEN,'p_chr_id');
3610             Raise OKL_API.G_EXCEPTION_ERROR;
3611         Elsif x_return_status = OKL_API.G_RET_STS_UNEXP_ERROR then
3612             Raise OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
3613         End If;
3614     End If;
3615     ------------------------------------
3616     --end of input parameter validations
3617     ------------------------------------
3618 
3619     j := 0;
3620     i := 0;
3621     Open l_asst_csr(p_chr_id => p_chr_id);
3622     Loop
3623         Fetch l_asst_csr into l_asset_cle_id;
3624         Exit when l_asst_csr%NOTFOUND;
3625         get_asset_subsidy_amount(
3626             p_api_version      => p_api_version,
3627             p_init_msg_list    => p_init_msg_list,
3628             x_return_status    => x_return_status,
3629             x_msg_count        => x_msg_count,
3630             x_msg_data         => x_msg_data,
3631             p_asset_cle_id     => l_asset_cle_id,
3632             x_asbv_tbl         => l_asset_asbv_tbl);
3633 
3634         IF (x_return_status = OKL_API.G_RET_STS_UNEXP_ERROR) THEN
3635             RAISE OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
3636         ELSIF (x_return_status = OKL_API.G_RET_STS_ERROR) THEN
3637             RAISE OKL_API.G_EXCEPTION_ERROR;
3638         END IF;
3639 
3640         IF l_asset_asbv_tbl.COUNT > 0 then
3641             For i in l_asset_asbv_tbl.FIRST..l_asset_asbv_tbl.LAST
3642             Loop
3643                 j := j + 1;
3644                 l_chr_asbv_tbl(j) :=  l_asset_asbv_tbl(i);
3645             End Loop;
3646             l_asset_asbv_tbl.delete;
3647         End If;
3648 
3649     End Loop;
3650     Close l_asst_csr;
3651 
3652     x_asbv_tbl := l_chr_asbv_tbl;
3653 
3654     EXCEPTION
3655     WHEN OKL_API.G_EXCEPTION_ERROR THEN
3656     x_return_status := OKL_API.HANDLE_EXCEPTIONS(
3657                                l_api_name,
3658                                G_PKG_NAME,
3659                                'OKL_API.G_RET_STS_ERROR',
3660                                x_msg_count,
3661                                x_msg_data,
3662                                '_PVT');
3663     WHEN OKL_API.G_EXCEPTION_UNEXPECTED_ERROR THEN
3664     x_return_status :=OKL_API.HANDLE_EXCEPTIONS(
3665                               l_api_name,
3666                               G_PKG_NAME,
3667                               'OKL_API.G_RET_STS_UNEXP_ERROR',
3668                               x_msg_count,
3669                               x_msg_data,
3670                               '_PVT');
3671     WHEN OTHERS THEN
3672     If l_asst_csr%ISOPEN then
3673         CLOSE l_asst_csr;
3674     End If;
3675     x_return_status :=OKL_API.HANDLE_EXCEPTIONS(
3676                               l_api_name,
3677                               G_PKG_NAME,
3678                               'OTHERS',
3679                               x_msg_count,
3680                               x_msg_data,
3681                               '_PVT');
3682 end get_contract_subsidy_amount;
3683 --------------------------------------------------------------------------------
3684 --Name         : calculate_contract_subsidy
3685 --Description  : API to fetch subsidy amount for the contract
3686 -- PARAMETERS  : IN - p_chr_id   : Contract id
3687 --               OUT - x_subsidy_amount:subsidy amount
3688 --------------------------------------------------------------------------------
3689 PROCEDURE calculate_contract_subsidy(
3690     p_api_version                  IN NUMBER,
3691     p_init_msg_list                IN VARCHAR2,
3692     x_return_status                OUT NOCOPY VARCHAR2,
3693     x_msg_count                    OUT NOCOPY NUMBER,
3694     x_msg_data                     OUT NOCOPY VARCHAR2,
3695     p_chr_id                       IN  NUMBER,
3696     x_subsidy_amount               OUT NOCOPY NUMBER) is
3697 
3698     l_return_status        VARCHAR2(1)  default OKL_API.G_RET_STS_SUCCESS;
3699     l_api_name             CONSTANT     varchar2(30) := 'CALC_CONTRACT_SUBSIDY';
3700     l_api_version          CONSTANT     NUMBER := 1.0;
3701 
3702     l_subsidy_amount            number;
3703     l_chr_subsidy_amount        number;
3704 
3705     --cursor to get all the financial assets in the contract
3706     cursor l_asst_csr(p_chr_id in number) is
3707     select cleb.id
3708     from   okc_k_lines_b      cleb,
3709            okc_line_styles_b  lseb,
3710            okc_statuses_b     stsb
3711     where  cleb.chr_id      = p_chr_id
3712     and    cleb.dnz_chr_id  = p_chr_id
3713     and    cleb.lse_id      = lseb.id
3714     and    lseb.lty_code    = 'FREE_FORM1'
3715     and    cleb.sts_code    = stsb.code
3716     and    stsb.ste_code    not in ('HOLD','EXPIRED','TERMINATED','CANCELLED');
3717 
3718     l_asset_cle_id    number;
3719 
3720 begin
3721     x_return_status := OKL_API.G_RET_STS_SUCCESS;
3722 
3723     -----------------------------------------
3724     --start of input parameter validations
3725     ----------------------------------------
3726     --1.validate p_chr_id
3727     If (p_chr_id is NULL) or (p_chr_id = OKL_API.G_MISS_NUM) then
3728         OKL_API.set_message(
3729                               p_app_name     => G_APP_NAME,
3730                               p_msg_name     => G_API_MISSING_PARAMETER,
3731                               p_token1       => G_API_NAME_TOKEN,
3732                               p_token1_value => l_api_name,
3733                               p_token2       => G_MISSING_PARAM_TOKEN,
3734                               p_token2_value => 'p_chr_id');
3735          x_return_status := OKL_API.G_RET_STS_ERROR;
3736          Raise OKL_API.G_EXCEPTION_ERROR;
3737     Elsif (p_chr_id is not NULL) and (p_chr_id <> OKL_API.G_MISS_NUM) then
3738         validate_chr_id(p_chr_id        => p_chr_id,
3739                         x_return_status => x_return_status);
3740         IF x_return_status = OKL_API.G_RET_STS_ERROR then
3741             OKL_API.set_message(G_APP_NAME, G_INVALID_VALUE,G_COL_NAME_TOKEN,'p_chr_id');
3742             Raise OKL_API.G_EXCEPTION_ERROR;
3743         Elsif x_return_status = OKL_API.G_RET_STS_UNEXP_ERROR then
3744             Raise OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
3745         End If;
3746     End If;
3747     ------------------------------------
3748     --end of input parameter validations
3749     ------------------------------------
3750 
3751     l_chr_subsidy_amount := 0;
3752     Open l_asst_csr(p_chr_id => p_chr_id);
3753     Loop
3754         Fetch l_asst_csr into l_asset_cle_id;
3755         Exit when l_asst_csr%NOTFOUND;
3756         calculate_asset_subsidy(
3757             p_api_version      => p_api_version,
3758             p_init_msg_list    => p_init_msg_list,
3759             x_return_status    => x_return_status,
3760             x_msg_count        => x_msg_count,
3761             x_msg_data         => x_msg_data,
3762             p_asset_cle_id     => l_asset_cle_id,
3763             x_subsidy_amount   => l_subsidy_amount);
3764 
3765         IF (x_return_status = OKL_API.G_RET_STS_UNEXP_ERROR) THEN
3766             RAISE OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
3767         ELSIF (x_return_status = OKL_API.G_RET_STS_ERROR) THEN
3768             RAISE OKL_API.G_EXCEPTION_ERROR;
3769         END IF;
3770         l_chr_subsidy_Amount := l_chr_subsidy_Amount + l_subsidy_amount;
3771     End Loop;
3772     Close l_asst_csr;
3773 
3774     x_subsidy_amount := l_chr_subsidy_amount;
3775 
3776     EXCEPTION
3777     WHEN OKL_API.G_EXCEPTION_ERROR THEN
3778     x_return_status := OKL_API.HANDLE_EXCEPTIONS(
3779                                l_api_name,
3780                                G_PKG_NAME,
3781                                'OKL_API.G_RET_STS_ERROR',
3782                                x_msg_count,
3783                                x_msg_data,
3784                                '_PVT');
3785     WHEN OKL_API.G_EXCEPTION_UNEXPECTED_ERROR THEN
3786     x_return_status :=OKL_API.HANDLE_EXCEPTIONS(
3787                               l_api_name,
3788                               G_PKG_NAME,
3789                               'OKL_API.G_RET_STS_UNEXP_ERROR',
3790                               x_msg_count,
3791                               x_msg_data,
3792                               '_PVT');
3793     WHEN OTHERS THEN
3794     If l_asst_csr%ISOPEN then
3795         CLOSE l_asst_csr;
3796     End If;
3797     x_return_status :=OKL_API.HANDLE_EXCEPTIONS(
3798                               l_api_name,
3799                               G_PKG_NAME,
3800                               'OTHERS',
3801                               x_msg_count,
3802                               x_msg_data,
3803                               '_PVT');
3804 end calculate_contract_subsidy;
3805 --------------------------------------------------------------------------------
3806 --Name         : get_funding_subsidy_amount
3807 --Description  : API to fetch subsidy amount for funding request
3808 -- PARAMETERS  : IN - p_chr_id        : Contract id
3809 --                    p_asset_cle_id  : Financial asset line id
3810 --               OUT -x_subsidy_amount : subsidy amount
3811 --special logic : If vendor id is passed , subsidy is calculated for that vendor
3812 --                If vendor id is null(defualt) subsidy is calculated only for assets
3813 --                which have vendor attached. Subsidy vendorr and asset vendor must
3814 --                be same.
3815 --------------------------------------------------------------------------------
3816 PROCEDURE get_funding_subsidy_amount(
3817     p_api_version                  IN  NUMBER,
3818     p_init_msg_list                IN  VARCHAR2,
3819     x_return_status                OUT NOCOPY VARCHAR2,
3820     x_msg_count                    OUT NOCOPY NUMBER,
3821     x_msg_data                     OUT NOCOPY VARCHAR2,
3822     p_chr_id                       IN  NUMBER,
3823     p_asset_cle_id                 IN  NUMBER,
3824     p_vendor_id                    IN  NUMBER DEFAULT NULL,
3825     x_subsidy_amount               OUT NOCOPY NUMBER) is
3826 
3827     l_return_status        VARCHAR2(1)  default OKL_API.G_RET_STS_SUCCESS;
3828     l_api_name             CONSTANT     varchar2(30) := 'GET_FUND_SUBSIDY';
3829     l_api_version          CONSTANT     NUMBER := 1.0;
3830 
3831     l_subsidy_amount        number;
3832     l_asset_subsidy_amount  number;
3833 
3834     --cursor to fetch vendor subssidies
3835     cursor l_vend_sub_csr (p_asset_cle_id  in number,
3836                            p_chr_id        in number,
3837                            p_vendor_id     in number) is
3838     select sub_cle.id
3839     from
3840            okl_k_lines          sub_kle,
3841            okc_k_lines_b        sub_cle,
3842            okc_line_styles_b    sub_lse,
3843            okl_subsidies_b      subb,
3844            okc_k_party_roles_b  sub_vend,
3845            okc_k_party_roles_b  asst_vend,
3846            okc_k_lines_b        model_cle,
3847            okc_line_styles_b    model_lse,
3848            okc_k_lines_b        asst_cle,
3849            okc_statuses_b       asst_sts
3850     --subsidy vendor
3851     where  sub_vend.dnz_chr_id         = sub_cle.dnz_chr_id
3852     and    sub_vend.object1_id1        = nvl(to_char(p_vendor_id),sub_vend.object1_id1)
3853     and    sub_vend.object1_id1        = asst_vend.object1_id1 --to make sure asset and subsidy vendors are same
3854     and    sub_vend.object1_id2        = '#'
3855     and    sub_vend.jtot_object1_code  = 'OKX_VENDOR'
3856     and    sub_vend.rle_code           = 'OKL_VENDOR'
3857     and    sub_vend.cle_id             = sub_cle.id
3858     --subsidy receipt method is 'FUND' and subsidy accounting method is 'NET' (discount)
3859     and    subb.id                     = sub_kle.subsidy_id
3860     and    subb.receipt_method_code    = 'FUND'
3861     and    subb.accounting_method_code = 'NET'
3862     and    sub_kle.id                  = sub_cle.id
3863     --subsidy line
3864     and    sub_cle.cle_id              = asst_cle.id
3865     and    sub_cle.dnz_chr_id          = asst_cle.dnz_chr_id
3866     and    sub_cle.sts_code            <> 'ABANDONED'
3867     and    sub_lse.id                  = sub_cle.lse_id
3868     and    sub_lse.lty_code            = 'SUBSIDY'
3869     --model line vendor
3870     and    asst_vend.dnz_chr_id        = model_cle.dnz_chr_id
3871     and    asst_vend.object1_id1       = nvl(to_char(p_vendor_id),asst_vend.object1_id1)
3872     and    asst_vend.object1_id2       = '#'
3873     and    asst_vend.jtot_object1_code = 'OKX_VENDOR'
3874     and    asst_vend.rle_code          = 'OKL_VENDOR'
3875     and    asst_vend.cle_id            = model_cle.id
3876     --model line
3877     and    model_cle.cle_id              = asst_cle.id
3878     and    model_cle.dnz_chr_id          = asst_cle.dnz_chr_id
3879     and    model_lse.id                  = model_cle.lse_id
3880     and    model_lse.lty_code            = 'ITEM'
3881     --financial asset
3882     and    asst_sts.code               = asst_cle.sts_code
3883     and    asst_sts.ste_code           not in ('HOLD','EXPIRED','CANCELLED')
3884     and    asst_cle.dnz_chr_id         = p_chr_id
3885     and    asst_cle.chr_id             = p_chr_id
3886     and    asst_cle.id                 = p_asset_cle_id;
3887 
3888 	  --veramach bug 5600694 start
3889  	  cursor is_subsidy( p_chr_id  in number, p_asset_cle_id in number) is
3890  	  select 'Y' from dual where exists
3891  	  (
3892  	   select null   from OKC_LINE_STYLES_B SUB_LSE,
3893  	   OKC_K_LINES_B SUB_CLE
3894  	   where SUB_CLE.dnz_chr_id=p_chr_id
3895  	   and  SUB_LSE.LTY_CODE = 'SUBSIDY'
3896  	   and SUB_CLE.lse_id= SUB_LSE.id
3897  	   and  SUB_CLE.CLE_ID =p_asset_cle_id
3898  	  );
3899  	  l_has_subsidy varchar2(1) := 'N';
3900  	  --veramach bug 5600694 end
3901 
3902     l_subsidy_cle_id number;
3903 begin
3904     x_return_status := OKL_API.G_RET_STS_SUCCESS;
3905 
3906     -----------------------------------------
3907     --start of input parameter validations
3908     -----------------------------------------
3909     --1.validate p_chr_id
3910     If (p_chr_id is NULL) or (p_chr_id = OKL_API.G_MISS_NUM) then
3911         OKL_API.set_message(
3912                               p_app_name     => G_APP_NAME,
3913                               p_msg_name     => G_API_MISSING_PARAMETER,
3914                               p_token1       => G_API_NAME_TOKEN,
3915                               p_token1_value => l_api_name,
3916                               p_token2       => G_MISSING_PARAM_TOKEN,
3917                               p_token2_value => 'p_chr_id');
3918          x_return_status := OKL_API.G_RET_STS_ERROR;
3919          Raise OKL_API.G_EXCEPTION_ERROR;
3920     Elsif (p_chr_id is not NULL) and (p_chr_id <> OKL_API.G_MISS_NUM) then
3921         validate_chr_id(p_chr_id        => p_chr_id,
3922                         x_return_status => x_return_status);
3923         IF x_return_status = OKL_API.G_RET_STS_ERROR then
3924             OKL_API.set_message(G_APP_NAME, G_INVALID_VALUE,G_COL_NAME_TOKEN,'p_chr_id');
3925             Raise OKL_API.G_EXCEPTION_ERROR;
3926         Elsif x_return_status = OKL_API.G_RET_STS_UNEXP_ERROR then
3927             Raise OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
3928         End If;
3929     End If;
3930     --2. validate p_asset_cle_id
3931     If (p_asset_cle_id is NULL) or (p_asset_cle_id = OKL_API.G_MISS_NUM) then
3932         OKL_API.set_message(
3933                               p_app_name     => G_APP_NAME,
3934                               p_msg_name     => G_API_MISSING_PARAMETER,
3935                               p_token1       => G_API_NAME_TOKEN,
3936                               p_token1_value => l_api_name,
3937                               p_token2       => G_MISSING_PARAM_TOKEN,
3938                               p_token2_value => 'p_asset_cle_id');
3939          x_return_status := OKL_API.G_RET_STS_ERROR;
3940          Raise OKL_API.G_EXCEPTION_ERROR;
3941     Elsif (p_asset_cle_id is not NULL) and (p_asset_cle_id <> OKL_API.G_MISS_NUM) then
3942         validate_cle_id(p_cle_id        => p_asset_cle_id,
3943                         p_lty_code      => 'FREE_FORM1',
3944                         x_return_status => x_return_status);
3945         IF x_return_status = OKL_API.G_RET_STS_ERROR then
3946             OKL_API.set_message(G_APP_NAME, G_INVALID_VALUE,G_COL_NAME_TOKEN,'p_asset_cle_id');
3947             Raise OKL_API.G_EXCEPTION_ERROR;
3948         Elsif x_return_status = OKL_API.G_RET_STS_UNEXP_ERROR then
3949             Raise OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
3950         End If;
3951     End If;
3952     --3.validate vendor id
3953     if (p_vendor_id is not NULL) then
3954         validate_vendor_id(p_vendor_id        => p_vendor_id,
3955                            x_return_status => x_return_status);
3956         IF x_return_status = OKL_API.G_RET_STS_ERROR then
3957             OKL_API.set_message(G_APP_NAME, G_INVALID_VALUE,G_COL_NAME_TOKEN,'p_vendor_id');
3958             Raise OKL_API.G_EXCEPTION_ERROR;
3959         Elsif x_return_status = OKL_API.G_RET_STS_UNEXP_ERROR then
3960             Raise OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
3961         End If;
3962     End If;
3963     -------------------------------------
3964     --end of input parameter validations
3965     -------------------------------------
3966 
3967     l_asset_subsidy_amount := 0;
3968 
3969 	  --veramach bug 5600694 start
3970  	  open is_subsidy(p_chr_id => p_chr_id, p_asset_cle_id => p_asset_cle_id);
3971  	  fetch is_subsidy into l_has_subsidy;
3972  	  close is_subsidy;
3973  	  if(l_has_subsidy = 'Y') then
3974  	  --veramach bug 5600694 end
3975 
3976     Open l_vend_sub_csr(p_chr_id       => p_chr_id,
3977                         p_asset_cle_id => p_asset_cle_id,
3978                         p_vendor_id    => p_vendor_id);
3979     Loop
3980         Fetch l_vend_sub_csr into l_subsidy_cle_id;
3981         Exit when l_vend_sub_csr%NOTFOUND;
3982         get_subsidy_amount(
3983             p_api_version      => p_api_version,
3984             p_init_msg_list    => p_init_msg_list,
3985             x_return_status    => x_return_status,
3986             x_msg_count        => x_msg_count,
3987             x_msg_data         => x_msg_data,
3988             p_subsidy_cle_id   => l_subsidy_cle_id,
3989             x_subsidy_amount   => l_subsidy_amount);
3990 
3991         IF (x_return_status = OKL_API.G_RET_STS_UNEXP_ERROR) THEN
3992             RAISE OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
3993         ELSIF (x_return_status = OKL_API.G_RET_STS_ERROR) THEN
3994             RAISE OKL_API.G_EXCEPTION_ERROR;
3995         END IF;
3996         l_asset_subsidy_Amount := l_asset_subsidy_Amount + l_subsidy_amount;
3997     End Loop;
3998     Close l_vend_sub_csr;
3999 	  --veramach bug 5600694 start
4000  	  end if;
4001  	  --veramach bug 5600694 end
4002     x_subsidy_amount := l_asset_subsidy_amount;
4003 
4004     EXCEPTION
4005     WHEN OKL_API.G_EXCEPTION_ERROR THEN
4006     x_return_status := OKL_API.HANDLE_EXCEPTIONS(
4007                                l_api_name,
4008                                G_PKG_NAME,
4009                                'OKL_API.G_RET_STS_ERROR',
4010                                x_msg_count,
4011                                x_msg_data,
4012                                '_PVT');
4013     WHEN OKL_API.G_EXCEPTION_UNEXPECTED_ERROR THEN
4014     x_return_status :=OKL_API.HANDLE_EXCEPTIONS(
4015                               l_api_name,
4016                               G_PKG_NAME,
4017                               'OKL_API.G_RET_STS_UNEXP_ERROR',
4018                               x_msg_count,
4019                               x_msg_data,
4020                               '_PVT');
4021     WHEN OTHERS THEN
4022     If l_vend_sub_csr%ISOPEN then
4023         CLOSE l_vend_sub_csr;
4024     End If;
4025     x_return_status :=OKL_API.HANDLE_EXCEPTIONS(
4026                               l_api_name,
4027                               G_PKG_NAME,
4028                               'OTHERS',
4029                               x_msg_count,
4030                               x_msg_data,
4031                               '_PVT');
4032 end get_funding_subsidy_amount;
4033 --------------------------------------------------------------------------------
4034 --Name         : get_partial_subsidy_amount
4035 --Description  : API to fetch subsidy amount for partial funding request
4036 -- PARAMETERS  : IN - p_asset_cle_id  : Financial asset line id
4037 --               OUT -x_asbv_tbl     : table of subsidy fund details
4038 --special logic : Subsidy vendor and asset vendor must
4039 --                be same.
4040 --------------------------------------------------------------------------------
4041 PROCEDURE get_partial_subsidy_amount(
4042     p_api_version                  IN  NUMBER,
4043     p_init_msg_list                IN  VARCHAR2,
4044     x_return_status                OUT NOCOPY VARCHAR2,
4045     x_msg_count                    OUT NOCOPY NUMBER,
4046     x_msg_data                     OUT NOCOPY VARCHAR2,
4047     p_asset_cle_id                 IN  NUMBER,
4048     p_req_fund_amount              IN  NUMBER,
4049     x_asbv_tbl                     OUT NOCOPY asbv_tbl_type) is
4050 
4051     l_return_status        VARCHAR2(1)  default OKL_API.G_RET_STS_SUCCESS;
4052     l_api_name             CONSTANT     varchar2(30) := 'GET_PARTIAL_SUBSIDY';
4053     l_api_version          CONSTANT     NUMBER := 1.0;
4054 
4055     l_asbv_tbl             asbv_tbl_type;
4056     l_asset_oec            Number;
4057 
4058     --cursor to fetch vendor subssidies
4059     cursor l_vend_sub_csr (p_asset_cle_id  in number) is
4060     select sub_cle.id,
4061            sub_cle.dnz_chr_id
4062     from   okl_k_lines          sub_kle,
4063            okc_k_lines_b        sub_cle,
4064            okc_line_styles_b    sub_lse,
4065            okl_subsidies_b      subb,
4066            okc_k_party_roles_b  sub_vend,
4067            okc_k_party_roles_b  asst_vend,
4068            okc_k_lines_b        model_cle,
4069            okc_line_styles_b    model_lse,
4070            okc_k_lines_b        asst_cle,
4071            okc_statuses_b       asst_sts
4072     --subsidy vendor
4073     where  sub_vend.dnz_chr_id         = sub_cle.dnz_chr_id
4074     --and    sub_vend.object1_id1        = to_char(nvl(p_vendor_id,sub_vend.object1_id1))
4075     and    sub_vend.object1_id1        = asst_vend.object1_id1 --to make sure asset and subsidy vendors are same
4076     and    sub_vend.object1_id2        = '#'
4077     and    sub_vend.jtot_object1_code  = 'OKX_VENDOR'
4078     and    sub_vend.rle_code           = 'OKL_VENDOR'
4079     and    sub_vend.cle_id             = sub_cle.id
4080     --subsidy receipt method is 'FUND' and accounting method is 'NET'
4081     and    subb.id                     = sub_kle.subsidy_id
4082     and    subb.receipt_method_code    = 'FUND'
4083     and    subb.accounting_method_code = 'NET'   --only discounts ('NET') can be funded from vendor
4084     and    sub_kle.id                  = sub_cle.id
4085     --subsidy line
4086     and    sub_cle.cle_id              = asst_cle.id
4087     and    sub_cle.dnz_chr_id          = asst_cle.dnz_chr_id
4088     and    sub_cle.sts_code            <> 'ABANDONED'
4089     and    sub_lse.id                  = sub_cle.lse_id
4090     and    sub_lse.lty_code            = 'SUBSIDY'
4091     --model line vendor
4092     and    asst_vend.dnz_chr_id        = model_cle.dnz_chr_id
4093     --and    asst_vend.object1_id1       = nvl(to_char(p_vendor_id),asst_vend.object1_id1)
4094     and    asst_vend.object1_id2       = '#'
4095     and    asst_vend.jtot_object1_code = 'OKX_VENDOR'
4096     and    asst_vend.rle_code          = 'OKL_VENDOR'
4097     and    asst_vend.cle_id            = model_cle.id
4098     --model line
4099     and    model_cle.cle_id              = asst_cle.id
4100     and    model_cle.dnz_chr_id          = asst_cle.dnz_chr_id
4101     and    model_lse.id                  = model_cle.lse_id
4102     and    model_lse.lty_code            = 'ITEM'
4103     --financial asset
4104     and    asst_sts.code               = asst_cle.sts_code
4105     and    asst_sts.ste_code           not in ('HOLD','EXPIRED','CANCELLED')
4106     and    asst_cle.dnz_chr_id         = asst_cle.chr_id
4107     and    asst_cle.id                 = p_asset_cle_id;
4108 
4109     l_subsidy_cle_id number;
4110     l_chr_id         number;
4111 
4112     i                number;
4113 
4114 begin
4115     x_return_status := OKL_API.G_RET_STS_SUCCESS;
4116 
4117     ---------------------------------------------
4118     --validate input parameters
4119     ---------------------------------------------
4120     --1.validate p_asset_id
4121     If (p_asset_cle_id is NULL) or (p_asset_cle_id = OKL_API.G_MISS_NUM) then
4122         OKL_API.set_message(
4123                               p_app_name     => G_APP_NAME,
4124                               p_msg_name     => G_API_MISSING_PARAMETER,
4125                               p_token1       => G_API_NAME_TOKEN,
4126                               p_token1_value => l_api_name,
4127                               p_token2       => G_MISSING_PARAM_TOKEN,
4128                               p_token2_value => 'p_asset_cle_id');
4129          x_return_status := OKL_API.G_RET_STS_ERROR;
4130          Raise OKL_API.G_EXCEPTION_ERROR;
4131     Elsif (p_asset_cle_id is not NULL) and (p_asset_cle_id <> OKL_API.G_MISS_NUM) then
4132         validate_cle_id(p_cle_id        => p_asset_cle_id,
4133                         p_lty_code      => 'FREE_FORM1',
4134                         x_return_status => x_return_status);
4135         IF x_return_status = OKL_API.G_RET_STS_ERROR then
4136             OKL_API.set_message(G_APP_NAME, G_INVALID_VALUE,G_COL_NAME_TOKEN,'p_asset_cle_id');
4137             Raise OKL_API.G_EXCEPTION_ERROR;
4138         Elsif x_return_status = OKL_API.G_RET_STS_UNEXP_ERROR then
4139             Raise OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
4140         End If;
4141     End If;
4142     ------------------------------------------
4143     --end of input parameter validations
4144     ------------------------------------------
4145 
4146     i := 0;
4147     Open l_vend_sub_csr(p_asset_cle_id => p_asset_cle_id);
4148     Loop
4149         Fetch l_vend_sub_csr into l_subsidy_cle_id, l_chr_id;
4150         Exit when l_vend_sub_csr%NOTFOUND;
4151         i := i + 1;
4152         If i = 1 then --get oec only first time
4153             --get asset OEC
4154 
4155             /*---commented formula as it has commit and this
4156             --needs to be called in a sql bu funding API
4157             --called seeded function directly instead of formula
4158 
4159             --OKL_EXECUTE_FORMULA_PUB.execute(p_api_version   => p_api_version,
4160             --                                p_init_msg_list => p_init_msg_list,
4161             --                                x_return_status => x_return_status,
4162             --                                x_msg_count     => x_msg_count,
4163             --                                x_msg_data      => x_msg_data,
4164             --                                p_formula_name  => G_FORMULA_OEC,
4165             --                                p_contract_id   => l_chr_id,
4166             --                                p_line_id       => p_asset_cle_id,
4167             --                                x_value         => l_asset_oec);
4168 
4169             --IF (x_return_status = OKL_API.G_RET_STS_UNEXP_ERROR) THEN
4170             --    RAISE OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
4171             --ELSIF (x_return_status = OKL_API.G_RET_STS_ERROR) THEN
4172             --    RAISE OKL_API.G_EXCEPTION_ERROR;
4173             --END IF;
4174             -----------*/
4175             -------------------------------------------
4176             --call seeded functions API :
4177             -------------------------------------------
4178             l_asset_oec := OKL_SEEDED_FUNCTIONS_PVT.line_oec(p_dnz_chr_id => l_chr_id,
4179                                                              p_cle_id     => p_asset_cle_id);
4180 
4181         End If;
4182 
4183         get_subsidy_amount(
4184             p_api_version      => p_api_version,
4185             p_init_msg_list    => p_init_msg_list,
4186             x_return_status    => x_return_status,
4187             x_msg_count        => x_msg_count,
4188             x_msg_data         => x_msg_data,
4189             p_subsidy_cle_id   => l_subsidy_cle_id,
4190             x_asbv_rec         => l_asbv_tbl(i));
4191 
4192         IF (x_return_status = OKL_API.G_RET_STS_UNEXP_ERROR) THEN
4193             RAISE OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
4194         ELSIF (x_return_status = OKL_API.G_RET_STS_ERROR) THEN
4195             RAISE OKL_API.G_EXCEPTION_ERROR;
4196         END IF;
4197 
4198         --calculate proportional subsidy amount
4199         l_asbv_tbl(i).amount := (l_asbv_tbl(i).amount/l_asset_oec)* p_req_fund_amount;
4200     End Loop;
4201     Close l_vend_sub_csr;
4202 
4203     x_asbv_tbl := l_asbv_tbl;
4204 
4205     EXCEPTION
4206     WHEN OKL_API.G_EXCEPTION_ERROR THEN
4207     x_return_status := OKL_API.HANDLE_EXCEPTIONS(
4208                                l_api_name,
4209                                G_PKG_NAME,
4210                                'OKL_API.G_RET_STS_ERROR',
4211                                x_msg_count,
4212                                x_msg_data,
4213                                '_PVT');
4214     WHEN OKL_API.G_EXCEPTION_UNEXPECTED_ERROR THEN
4215     x_return_status :=OKL_API.HANDLE_EXCEPTIONS(
4216                               l_api_name,
4217                               G_PKG_NAME,
4218                               'OKL_API.G_RET_STS_UNEXP_ERROR',
4219                               x_msg_count,
4220                               x_msg_data,
4221                               '_PVT');
4222     WHEN OTHERS THEN
4223     If l_vend_sub_csr%ISOPEN then
4224         CLOSE l_vend_sub_csr;
4225     End If;
4226     x_return_status :=OKL_API.HANDLE_EXCEPTIONS(
4227                               l_api_name,
4228                               G_PKG_NAME,
4229                               'OTHERS',
4230                               x_msg_count,
4231                               x_msg_data,
4232                               '_PVT');
4233 end get_partial_subsidy_amount;
4234 
4235 
4236 
4237 -- Start of comments
4238 --
4239 -- Procedure Name	: Get_Vendor_Billing_Info
4240 -- Description		: Local Procedure to Extract Vendor Billing Information for
4241 --                    creating billing transaction
4242 -- Business Rules	:
4243 -- Parameters		: Contract Party Id or Contract Id
4244 -- History          :
4245 -- Version		: 1.0
4246 -- End of comments
4247 
4248 PROCEDURE Get_Vendor_Billing_Info (
4249     p_contract_id           IN         NUMBER,
4250     p_cpl_id                IN         NUMBER,
4251     x_return_status	    OUT NOCOPY VARCHAR2,
4252     x_bill_to_site_use_id   OUT NOCOPY Number,
4253     x_cust_acct_id          OUT NOCOPY Number,
4254     x_payment_method_id     OUT NOCOPY Number,
4255     x_bank_account_id       OUT NOCOPY Number,
4256     x_inv_reason_for_review OUT NOCOPY Varchar2,
4257     x_inv_review_until_date OUT NOCOPY Date,
4258     x_cash_appl_rule_id     OUT NOCOPY Number,
4259     x_invoice_format        OUT NOCOPY Varchar2,
4260     x_review_invoice_yn     OUT NOCOPY Varchar2,
4261     x_cust_acct_site_id     OUT NOCOPY Number,
4262     x_payment_term_id       OUT NOCOPY Number) As
4263 
4264 	l_return_status		VARCHAR2(1)	:= OKL_API.G_RET_STS_SUCCESS;
4265 	l_overall_status	VARCHAR2(1)	:= OKL_API.G_RET_STS_SUCCESS;
4266 
4267 	l_contract_id		NUMBER		:= p_contract_id;
4268     l_cpl_id            NUMBER      := p_cpl_id;
4269 	l_khr_id		    NUMBER;
4270 	l_par_id		    NUMBER;
4271 	l_rgd_id		    NUMBER;
4272 	l_party_name		VARCHAR2(1000);
4273 
4274     l_bill_to_site_use_id OKC_K_HEADERS_B.bill_to_site_use_id%TYPE;
4275     l_cust_acct_id        OKC_K_PARTY_ROLES_B.cust_acct_id%TYPE;
4276     l_party_role          FND_LOOKUPS.meaning%TYPE;
4277 
4278     ----------------------------------------------------------------------------
4279     -- Get bill to site of OKL_VENDOR party on the contract
4280     ----------------------------------------------------------------------------
4281 	CURSOR	l_k_party_rg_csr (cp_cpl_id IN NUMBER) IS
4282 	SELECT	cpl.id			        cpl_id,
4283 			cpl.jtot_object1_code	object1_code,
4284 			cpl.object1_id1		    object1_id1,
4285 			cpl.object1_id2		    object1_id2,
4286 			rgd.id			        rgd_id,
4287             cpl.bill_to_site_use_id bill_to_site_use_id,
4288             cpl.role                party_role,
4289             cpl.cust_acct_id        cust_acct_id
4290 	FROM	okc_k_party_roles_v	    cpl,
4291 			okc_rg_party_roles	    rgpr,
4292 			okc_rule_groups_v	    rgd
4293 	WHERE	cpl.id			= cp_cpl_id
4294 	AND	    cpl.rle_code    = 'OKL_VENDOR'
4295 	AND	    rgpr.cpl_id	(+)	= cpl.id
4296 	AND	    rgd.id		(+)	= rgpr.rgp_id
4297 	AND	    rgd.rgd_code(+)	= 'LAVENB';
4298 
4299     ----------------------------------------------------------------------------
4300     -- Get bill to site of vendor PROGRAM if Vendor Program vendor same as lease vendor
4301     ----------------------------------------------------------------------------
4302 -- modified by zrehman to fix Bug#6341517 on 27-Feb-2008 start
4303 	CURSOR	l_partner_rg_csr (cp_khr_id    IN NUMBER,
4304                               cp_vendor_id IN VARCHAR2) IS
4305         SELECT khr.Id khr_Id,
4306                Par.Id Par_Id,
4307                rgd.Id rgd_Id,
4308                cPl.Bill_To_Site_Use_Id Bill_To_Site_Use_Id,
4309              --  cPl.ROLE ParACty_Role,
4310                cPl.cUst_acct_Id cUst_acct_Id
4311         FROM   Okl_k_Headers khr,
4312                Okc_k_Headers_b Par,
4313                Okc_Rule_Groups_v rgd,
4314                Okc_k_Party_Roles_b cPl
4315         WHERE  khr.Id = cp_khr_Id
4316         AND Par.Id   = khr.khr_Id
4317         AND Par.scs_Code   = 'PROGRAM'
4318         AND rgd.chr_Id   = Par.Id
4319         AND rgd.dnz_chr_Id   = Par.Id
4320         AND rgd.cle_Id IS NULL
4321         AND rgd.rgd_Code   = 'LAVENB'
4322         AND Par.Id = cPl.chr_Id
4323         AND cPl.rle_Code = 'OKL_VENDOR'
4324         AND cPl.Object1_Id1 = cp_Vendor_Id
4325         AND cPl.Object1_Id2 = '#'
4326         AND cPl.jTot_Object1_Code = 'OKX_VENDOR';
4327 -- modified by zrehman to fix Bug#6341517 on 27-Feb-2008 end
4328 
4329     -------------------------------------------------------
4330     --cursor to fetch receipt method id
4331     -------------------------------------------------------
4332 	CURSOR	l_rcpt_mthd_csr (cp_cust_rct_mthd IN NUMBER) IS
4333 	SELECT	c.receipt_method_id
4334 	FROM	ra_cust_receipt_methods  c
4335 	WHERE	c.cust_receipt_method_id = cp_cust_rct_mthd;
4336 
4337 
4338     ---------------------------------------------------------
4339     --cursor to fetch site use information
4340     ----------------------------------------------------------
4341 	CURSOR	l_site_use_csr (cp_site_use_id		IN NUMBER,
4342 			                cp_site_use_code	IN VARCHAR2) IS
4343 	SELECT	a.cust_account_id	cust_account_id,
4344 			a.cust_acct_site_id	cust_acct_site_id,
4345 			a.payment_term_id	payment_term_id
4346 	FROM    okx_cust_site_uses_v	a,
4347 			okx_customer_accounts_v	c
4348 	WHERE	a.id1			= cp_site_use_id
4349 	AND	    a.site_use_code	= cp_site_use_code
4350 	AND	    c.id1			= a.cust_account_id;
4351 
4352     ----------------------------------------------------------------------------
4353     --get payment term from customer profiles
4354     ----------------------------------------------------------------------------
4355 	CURSOR	l_std_terms_csr (cp_cust_id		IN NUMBER,
4356 			                 cp_site_use_id		IN NUMBER) IS
4357 	SELECT	c.standard_terms	standard_terms
4358 	FROM	hz_customer_profiles	c
4359 	WHERE	c.cust_account_id	= cp_cust_id
4360 	AND	    c.site_use_id		= cp_site_use_id
4361 	UNION
4362 	SELECT	c1.standard_terms	standard_terms
4363 	FROM	hz_customer_profiles	c1
4364 	WHERE	c1.cust_account_id	= cp_cust_id
4365 	AND	c1.site_use_id		IS NULL
4366 	AND	NOT EXISTS (
4367 			SELECT	'1'
4368 			FROM	hz_customer_profiles	c2
4369 			WHERE	c2.cust_account_id	= cp_cust_id
4370 			AND	c2.site_use_id		= cp_site_use_id);
4371 
4372 	l_site_use_rec	 l_site_use_csr%ROWTYPE;
4373 	l_k_party_rg_rec l_k_party_rg_csr%ROWTYPE;
4374 
4375     ----------------------------------------------------------------------------
4376     --cursors to fetch rule values
4377     ----------------------------------------------------------------------------
4378     cursor l_rul_csr (p_rul_code in varchar2,
4379                       p_rgp_id   in number,
4380                       p_chr_id   in number) is
4381     select rule_information1,
4382            rule_information2,
4383            rule_information3,
4384            rule_information4,
4385            rule_information5,
4386            rule_information6,
4387            jtot_object1_code,
4388            object1_id1,
4389            object1_id2
4390      from  okc_rules_b
4391      where rgp_id = p_rgp_id
4392      and   rule_information_category = p_rul_code
4393      and   dnz_chr_id = p_chr_id;
4394 
4395 --START: rseela 11/28/05 bug#4673593
4396     ----------------------------------------------------------------------------
4397     --cursors to fetch bank account ID
4398     ----------------------------------------------------------------------------
4399     cursor l_bank_acc_csr (p_bank_acc_uses_id in varchar2) is
4400     select rmc.bank_account_id
4401      from  OKX_RCPT_METHOD_ACCOUNTS_V rmc
4402      where rmc.id1 = p_bank_acc_uses_id;
4403 
4404 --END: rseela 11/28/05 bug#4673593
4405 
4406 
4407      l_pmth_rec l_rul_csr%ROWTYPE;
4408      l_bacc_rec l_rul_csr%ROWTYPE;
4409      l_inpr_rec l_rul_csr%ROWTYPE;
4410      l_invd_rec l_rul_csr%ROWTYPE;
4411 
4412     l_payment_method_id     Number;
4413     l_bank_account_id       Number;
4414     l_inv_reason_for_review Varchar2(450);
4415     l_inv_review_until_date Date;
4416     l_cash_appl_rule_id     Number;
4417     l_invoice_format        Varchar2(450);
4418     l_review_invoice_yn     Varchar2(450);
4419 
4420     l_cust_acct_site_id     Number;
4421     l_payment_term_id       Number;
4422 
4423 
4424 BEGIN
4425 	-- *******************
4426 	-- Validate parameters
4427 	-- *******************
4428 	IF (l_cpl_id	IS NULL
4429 	     OR	l_cpl_id	= OKL_API.G_MISS_NUM)
4430 	AND (l_contract_id	IS NULL
4431 	     OR	l_contract_id	= OKL_API.G_MISS_NUM) THEN
4432 
4433 		l_return_status	:= OKL_API.G_RET_STS_ERROR;
4434 		OKL_API.SET_MESSAGE (
4435 		    p_app_name	    => G_APP_NAME,
4436 			p_msg_name	    => G_INCOMPLETE_VEND_BILL,
4437 			p_token1	    => G_ERROR_TYPE_TOKEN,
4438 			p_token1_value	=> 'Program Error : ',
4439 			p_token2	    => G_PARAMETER_TOKEN,
4440 			p_token2_value	=> 'Contract Party Identifier and Contract identifier'
4441            );
4442 
4443 	END IF;
4444 
4445 	IF l_return_status <> OKL_API.G_RET_STS_SUCCESS THEN
4446 		IF l_overall_status <> OKL_API.G_RET_STS_UNEXP_ERROR THEN
4447 			l_overall_status := l_return_status;
4448 		END IF;
4449 	END IF;
4450 
4451 	-- ***************
4452 	-- Find Rule Group
4453 	-- ***************
4454 
4455 	IF l_overall_status = OKL_API.G_RET_STS_SUCCESS THEN
4456 
4457 	    IF  l_cpl_id IS NOT NULL
4458 	        AND l_cpl_id <> OKL_API.G_MISS_NUM THEN
4459 
4460 		    OPEN	l_k_party_rg_csr (l_cpl_id);
4461 		    FETCH	l_k_party_rg_csr INTO l_k_party_rg_rec;
4462 		    CLOSE	l_k_party_rg_csr;
4463 		    l_rgd_id := l_k_party_rg_rec.rgd_id;
4464 
4465             l_bill_to_site_use_id := l_k_party_rg_rec.bill_to_site_use_id ;
4466             l_cust_acct_id        := l_k_party_rg_rec.cust_acct_id;
4467 
4468 		    IF l_k_party_rg_rec.cpl_id IS NULL THEN
4469 			    l_return_status	:= OKL_API.G_RET_STS_ERROR;
4470 			    OKL_API.SET_MESSAGE (
4471 				    p_app_name	    => G_APP_NAME,
4472 				    p_msg_name	    => G_INCOMPLETE_VEND_BILL,
4473 			        p_token1	    => G_ERROR_TYPE_TOKEN,
4474 			        p_token1_value	=> 'Program Error : ',
4475 				    p_token2	    => G_PARAMETER_TOKEN,
4476 				    p_token2_value	=> 'Contract Party Identifier'
4477                     );
4478             ELSIF    l_k_party_rg_rec.bill_to_site_use_id IS NULL    THEN
4479                 ----------------------------------------------------------------
4480                 --Try to fetch billing details from vendor program if lease
4481                 --and vp verndor are the same
4482                 ----------------------------------------------------------------
4483                 If l_contract_id is not null
4484                     and l_contract_id <> OKL_API.G_MISS_NUM
4485                 Then
4486                     --Open vendor program cursor
4487 		            OPEN	l_partner_rg_csr (l_contract_id, l_k_party_rg_rec.object1_id1);
4488 		            FETCH	l_partner_rg_csr INTO l_khr_id,
4489                                                   l_par_id,
4490                                                   l_rgd_id,
4491                                                   l_bill_to_site_use_id,
4492                                                  -- l_party_role, -- modified by zrehman to fix Bug#6341517 on 27-Feb-2008
4493                                                   l_cust_acct_id;
4494 		            CLOSE	l_partner_rg_csr;
4495 
4496                  ------------------------------------------------------------
4497                  --not to raise this ambiguous error when VP does not exist
4498                     --If (l_khr_id is null) OR (l_par_id is null) then
4499                      --   l_return_status := OKL_API.G_RET_STS_ERROR;
4500     		--	        OKL_API.SET_MESSAGE (
4501 		--		        p_app_name	    => G_APP_NAME,
4502 		--		        p_msg_name	    => G_INCOMPLETE_VEND_BILL,
4503 		--	            p_token1	    => G_ERROR_TYPE_TOKEN,
4504 		--	            p_token1_value	=> 'Program Error : ',
4505 		--		        p_token2	    => G_PARAMETER_TOKEN,
4506 		--		        p_token2_value	=> 'Contract Header Identifier'
4507                  --       );
4508                   --  Els
4509                  --not to raise this ambiguous error when VP does not exist
4510                  -------------------------------------------------------------
4511                     If l_bill_to_site_use_id is null then
4512 
4513 			            l_return_status	:= OKL_API.G_RET_STS_ERROR;
4514   			            OKL_API.SET_MESSAGE (
4515 				              p_app_name	=> G_APP_NAME,
4516 				              p_msg_name	=> G_INCOMPLETE_VEND_BILL,
4517 			                      p_token1	        => G_ERROR_TYPE_TOKEN,
4518 			                      p_token1_value	=> 'Billing setup not defined.',
4519 				              p_token2	        => G_PARAMETER_TOKEN,
4520 				              p_token2_value	=> 'Bill to Site'
4521                             );
4522                     End If;
4523                    ---------------------------------------------------------------
4524                     --End of trying to fetch billing details from VP
4525                    ---------------------------------------------------------------
4526                  Else
4527                         l_return_status	:= OKL_API.G_RET_STS_ERROR;
4528   			            OKL_API.SET_MESSAGE (
4529 				              p_app_name	    => G_APP_NAME,
4530 				              p_msg_name	    => G_INCOMPLETE_VEND_BILL,
4531 			                  p_token1	        => G_ERROR_TYPE_TOKEN,
4532 			                  p_token1_value	=> '',
4533 				              p_token2	        => G_PARAMETER_TOKEN,
4534 				              p_token2_value	=> 'Bill to Site'
4535                             );
4536 
4537                  End If;
4538 		     END IF;
4539 	    ELSE
4540             --exception cpl_id passed is null
4541             l_return_status := OKL_API.G_RET_STS_ERROR;
4542     		OKL_API.SET_MESSAGE (
4543 				        p_app_name	    => G_APP_NAME,
4544 				        p_msg_name	    => G_INCOMPLETE_VEND_BILL,
4545 			            p_token1	    => G_ERROR_TYPE_TOKEN,
4546 			            p_token1_value	=> 'Program Error : ',
4547 				        p_token2	    => G_PARAMETER_TOKEN,
4548 				        p_token2_value	=> 'Contract Party Identifier'
4549                         );
4550 
4551         END IF;
4552 	END IF;
4553 
4554 	IF l_return_status <> OKL_API.G_RET_STS_SUCCESS THEN
4555 		IF l_overall_status <> OKL_API.G_RET_STS_UNEXP_ERROR THEN
4556 			l_overall_status := l_return_status;
4557 		END IF;
4558 	END IF;
4559 
4560 
4561 	IF l_overall_status = OKL_API.G_RET_STS_SUCCESS THEN
4562 
4563         --------------------------------------------
4564         --1. Get payment method
4565         --------------------------------------------
4566         open l_rul_csr (p_rul_code => 'LAPMTH',
4567                         p_rgp_id   => l_rgd_id,
4568                         p_chr_id   => l_contract_id);
4569         Fetch l_rul_csr into l_pmth_rec;
4570         If l_rul_csr%NOTFOUND then
4571             l_payment_method_id := null;
4572         Else
4573             IF l_pmth_rec.object1_id2 <> '#' THEN
4574 		       l_payment_method_id    := l_pmth_rec.object1_id2;
4575 		    ELSE
4576 			    -- This cursor needs to be removed when
4577 			    -- the view changes to include id2
4578 			    OPEN	l_rcpt_mthd_csr (l_pmth_rec.object1_id1);
4579 			    FETCH	l_rcpt_mthd_csr INTO l_payment_method_id;
4580 			    CLOSE	l_rcpt_mthd_csr;
4581 		    END IF;
4582         End If;
4583         close l_rul_csr;
4584 
4585         --------------------------------------------
4586         --2. Get bank account
4587         --------------------------------------------
4588         open l_rul_csr (p_rul_code => 'LABACC',
4589                         p_rgp_id   => l_rgd_id,
4590                         p_chr_id   => l_contract_id);
4591         Fetch l_rul_csr into l_bacc_rec;
4592            If l_rul_csr%NOTFOUND then
4593              l_bank_account_id := null;
4594            Else
4595            --START: rseela 11/28/05 bug#4673593
4596              open l_bank_acc_csr(TO_NUMBER(l_bacc_rec.object1_id1));
4597              fetch l_bank_acc_csr into l_bank_account_id;
4598              close l_bank_acc_csr;
4599 --           l_bank_account_id := l_bacc_rec.object1_id1;
4600            --END: rseela 11/28/05 bug#4673593
4601 
4602         End If;
4603         close l_rul_csr;
4604 
4605 
4606         --------------------------------------------
4607         --3. Get invoice pull for review
4608         --------------------------------------------
4609         open l_rul_csr (p_rul_code => 'LAINPR',
4610                         p_rgp_id   => l_rgd_id,
4611                         p_chr_id   => l_contract_id);
4612         Fetch l_rul_csr into l_inpr_rec;
4613         If l_rul_csr%NOTFOUND then
4614             l_inv_reason_for_review := null;
4615             l_inv_review_until_date := null;
4616         Else
4617             l_inv_reason_for_review := l_inpr_rec.rule_information1;
4618             l_inv_review_until_date := fnd_date.canonical_to_date(l_inpr_rec.rule_information2);
4619         End If;
4620         close l_rul_csr;
4621 
4622         --------------------------------------------
4623         --4. Get invoice details
4624         --------------------------------------------
4625         open l_rul_csr (p_rul_code => 'LAINVD',
4626                         p_rgp_id   => l_rgd_id,
4627                         p_chr_id   => l_contract_id);
4628         Fetch l_rul_csr into l_invd_rec;
4629         If l_rul_csr%NOTFOUND then
4630             l_cash_appl_rule_id := null;
4631             l_invoice_format    := null;
4632             l_review_invoice_yn := null;
4633         Else
4634             l_cash_appl_rule_id := l_invd_rec.object1_id1;
4635             l_invoice_format    := l_invd_rec.rule_information1;
4636             l_review_invoice_yn := l_invd_rec.rule_information4;
4637         End If;
4638         close l_rul_csr;
4639 
4640 	END IF;
4641 
4642 
4643 	-- *****************************************************
4644 	-- Extract Customer, Bill To and Payment Term from rules
4645 	-- *****************************************************
4646 
4647 	IF l_overall_status = OKL_API.G_RET_STS_SUCCESS THEN
4648 
4649 		OPEN	l_site_use_csr (l_bill_to_site_use_id, 'BILL_TO');
4650 		FETCH	l_site_use_csr INTO l_site_use_rec;
4651 		CLOSE	l_site_use_csr;
4652 
4653         l_cust_acct_site_id     :=  l_site_use_rec.cust_acct_site_id;
4654         l_payment_term_id       :=  l_site_use_rec.payment_term_id;
4655 
4656 		IF l_payment_term_id IS NULL
4657 		OR l_payment_term_id = OKL_API.G_MISS_NUM THEN
4658 			OPEN	l_std_terms_csr (
4659 					l_site_use_rec.cust_account_id,
4660 					l_bill_to_site_use_id);
4661 			FETCH	l_std_terms_csr INTO l_payment_term_id;
4662 			CLOSE	l_std_terms_csr;
4663 		END IF;
4664 
4665 	END IF;
4666 
4667 	IF l_return_status <> OKL_API.G_RET_STS_SUCCESS THEN
4668 		IF l_overall_status <> OKL_API.G_RET_STS_UNEXP_ERROR THEN
4669 			l_overall_status := l_return_status;
4670 		END IF;
4671 	END IF;
4672 
4673 	-- ****************
4674 	-- Validate Results
4675 	-- ****************
4676 
4677 	IF l_overall_status = OKL_API.G_RET_STS_SUCCESS THEN
4678 
4679 		--IF px_taiv_rec.ixx_id IS NULL
4680 		--OR px_taiv_rec.ixx_id = G_MISS_NUM THEN
4681         IF l_cust_acct_id IS NULL
4682 		    OR l_cust_acct_id = OKL_API.G_MISS_NUM THEN
4683 
4684 			l_return_status	:= OKL_API.G_RET_STS_ERROR;
4685 			OKL_API.SET_MESSAGE (
4686 			    p_app_name	    => G_APP_NAME,
4687 				p_msg_name	    => G_INCOMPLETE_VEND_BILL,
4688 			    p_token1	    => G_ERROR_TYPE_TOKEN,
4689 			    p_token1_value	=> '',
4690 				p_token2	    => G_PARAMETER_TOKEN,
4691 				p_token2_value	=> 'Customer Account'
4692              );
4693 
4694 		END IF;
4695 
4696 		--IF px_taiv_rec.ibt_id IS NULL
4697 		--OR px_taiv_rec.ibt_id = G_MISS_NUM THEN
4698 		IF l_cust_acct_site_id IS NULL
4699 		OR l_cust_acct_site_id = OKL_API.G_MISS_NUM THEN
4700 			l_return_status	:= OKL_API.G_RET_STS_ERROR;
4701 			OKL_API.SET_MESSAGE (
4702 			    p_app_name	    => G_APP_NAME,
4703 				p_msg_name	    => G_INCOMPLETE_VEND_BILL,
4704 			    p_token1	    => G_ERROR_TYPE_TOKEN,
4705 			    p_token1_value	=> '',
4706 				p_token2	    => G_PARAMETER_TOKEN,
4707 				p_token2_value	=> 'Customer Account Site'
4708              );
4709 		END IF;
4710 
4711 		--IF px_taiv_rec.irt_id IS NULL
4712 		--OR px_taiv_rec.irt_id = G_MISS_NUM THEN
4713 		IF l_payment_term_id IS NULL
4714 		OR l_payment_term_id = OKL_API.G_MISS_NUM THEN
4715 			l_return_status	:= OKL_API.G_RET_STS_ERROR;
4716 			OKL_API.SET_MESSAGE (
4717 			    p_app_name	    => G_APP_NAME,
4718 				p_msg_name	    => G_INCOMPLETE_VEND_BILL,
4719 			    p_token1	    => G_ERROR_TYPE_TOKEN,
4720 			    p_token1_value	=> '',
4721 				p_token2	    => G_PARAMETER_TOKEN,
4722 				p_token2_value	=> 'Payment Term'
4723              );
4724 		END IF;
4725 
4726 	END IF;
4727 
4728 	IF l_return_status <> OKL_API.G_RET_STS_SUCCESS THEN
4729 		IF l_overall_status <> OKL_API.G_RET_STS_UNEXP_ERROR THEN
4730 			l_overall_status := l_return_status;
4731 		END IF;
4732 	END IF;
4733 
4734     x_bill_to_site_use_id     := l_bill_to_site_use_id;
4735     x_cust_acct_id            := l_cust_acct_id;
4736     --
4737     x_payment_method_id       := l_payment_method_id;
4738     x_bank_account_id         := l_bank_account_id;
4739     x_inv_reason_for_review   := l_inv_reason_for_review;
4740     x_inv_review_until_date   := l_inv_review_until_date;
4741     x_cash_appl_rule_id       := l_cash_appl_rule_id;
4742     x_invoice_format          := l_invoice_format;
4743     x_review_invoice_yn       := l_review_invoice_yn;
4744     --
4745     x_cust_acct_site_id       := l_cust_acct_site_id;
4746     x_payment_term_id         := l_payment_term_id;
4747 
4748 	x_return_status	:= l_overall_status;
4749 
4750 EXCEPTION
4751 
4752 	WHEN OTHERS THEN
4753 
4754 		-- close open cursors
4755 		IF l_k_party_rg_csr%ISOPEN THEN
4756 			CLOSE l_k_party_rg_csr;
4757 		END IF;
4758 
4759 		IF l_partner_rg_csr%ISOPEN THEN
4760 			CLOSE l_partner_rg_csr;
4761 		END IF;
4762 
4763 		IF l_rcpt_mthd_csr%ISOPEN THEN
4764 			CLOSE l_rcpt_mthd_csr;
4765 		END IF;
4766 
4767 		IF l_site_use_csr%ISOPEN THEN
4768 			CLOSE l_site_use_csr;
4769 		END IF;
4770 
4771 		IF l_std_terms_csr%ISOPEN THEN
4772 			CLOSE l_std_terms_csr;
4773 		END IF;
4774 
4775         IF l_rul_csr%ISOPEN THEN
4776 			CLOSE l_rul_csr;
4777 		END IF;
4778 
4779 		-- store SQL error message on message stack for caller
4780 		OKL_API.SET_MESSAGE (
4781 			 p_app_name	=> G_APP_NAME
4782 			,p_msg_name	=> G_UNEXPECTED_ERROR
4783 			,p_token1	=> G_SQLCODE_TOKEN
4784 			,p_token1_value	=> sqlcode
4785 			,p_token2	=> G_SQLERRM_TOKEN
4786 			,p_token2_value	=> sqlerrm);
4787 
4788 
4789 		-- notify caller of an UNEXPECTED error
4790 		x_return_status := OKL_API.G_RET_STS_UNEXP_ERROR;
4791 
4792 END Get_Vendor_Billing_Info;
4793 
4794 -- Start of comments
4795 --
4796 -- Function Name        : Get_Trx_Type_Id
4797 -- Description          : Local function to fetch trx_type_id (try_id)
4798 -- Business Rules       :
4799 -- Parameters           :  p_trx_type - trx type name
4800 --                         p_lang     - language
4801 -- History          :
4802 -- Version              : 1.0
4803 -- End of comments
4804 
4805 Function Get_trx_type_id (p_trx_type in varchar2,
4806                           p_lang     in varchar2) return number is
4807 
4808 
4809 -- Cursor to get the try_id for the name passed
4810    CURSOR l_try_id_csr (
4811                                      cp_try_name        IN VARCHAR2,
4812                                      cp_language        IN VARCHAR2) IS
4813                 SELECT  id
4814                 FROM    okl_trx_types_tl t
4815                 WHERE   Upper (t.name)  LIKE Upper (cp_try_name)
4816                 AND     t.language  = Upper (cp_language);
4817 
4818    l_try_id  number default null;
4819 begin
4820     l_try_id := Null;
4821     open l_try_id_csr (cp_try_name => p_trx_type,
4822                        cp_language => p_lang);
4823     Fetch l_try_id_csr into l_try_id;
4824     If l_try_id_csr%NOTFOUND then
4825         NULL;
4826     End If;
4827     close l_try_id_csr;
4828     return(l_try_id);
4829     Exception
4830     When others then
4831     If l_try_id_csr%ISOPEN then
4832        CLOSE l_try_id_csr;
4833     End If;
4834     OKL_API.SET_MESSAGE( p_app_name     => G_APP_NAME
4835                         ,p_msg_name     => G_UNEXPECTED_ERROR
4836                         ,p_token1       => G_SQLCODE_TOKEN
4837                         ,p_token1_value => SQLCODE
4838                         ,p_token2       => G_SQLERRM_TOKEN
4839                         ,p_token2_value => SQLERRM);
4840     Return(l_try_id);
4841 end Get_trx_type_id;
4842 
4843 -- varangan - Bug#5474059 - Added - Start
4844   -- Start of comments
4845   -- Procedure Name     : insert_billing_records
4846   -- Description        : Code in this API was intially part of the procedure
4847   --                      Create_Billing_Trx. Creates billing transaction
4848   --                      records for subsidies
4849   -- PARAMETERS  : IN - p_asdv_tbl : Table of records with subsidy details
4850   -- Created varangan
4851   -- End of comments
4852   PROCEDURE insert_billing_records
4853            (p_api_version    IN  NUMBER
4854           , p_init_msg_list  IN  VARCHAR2
4855           , x_return_status  OUT NOCOPY VARCHAR2
4856           , x_msg_count      OUT NOCOPY NUMBER
4857           , x_msg_data       OUT NOCOPY VARCHAR2
4858           , p_chr_id         IN  NUMBER
4859           , p_asdv_tbl       IN  asbv_tbl_type) IS
4860     l_return_status        VARCHAR2(1)  default OKL_API.G_RET_STS_SUCCESS;
4861     l_api_name             CONSTANT     varchar2(30) := 'insert_billing_records';
4862     l_api_version          CONSTANT     NUMBER := 1.0;
4863 
4864     l_asdv_tbl asbv_tbl_type DEFAULT p_asdv_tbl;
4865     l_asdv_tbl_proc asbv_tbl_type;
4866     i               number;
4867     j               number;
4868 
4869     --30-Oct-03 avsingh : cursor corrected for same vendor match at
4870     --model line level
4871     --cursor to verify theat asset and subsidy vendors are the same
4872     cursor l_samevend_csr(p_vendor_id    in number,
4873                           p_asset_cle_id in number,
4874                           p_chr_id       in number) is
4875     Select 'Y'
4876     From   okc_k_party_roles_b cplb,
4877            okc_k_lines_b       cleb,
4878            okc_line_styles_b   lseb
4879     where  cplb.cle_id            = cleb.id
4880     and    cleb.cle_id            = p_asset_cle_id
4881     and    lseb.id                = cleb.lse_id
4882     and    lseb.lty_code          = 'ITEM'
4883     and    cplb.dnz_chr_id        = p_chr_id
4884     and    cplb.object1_id1       = to_char(p_vendor_id)
4885     and    cplb.object1_id2       = '#'
4886     and    cplb.jtot_object1_code = 'OKX_VENDOR'
4887     and    cplb.rle_code          = 'OKL_VENDOR';
4888 
4889     l_exists varchar2(1) default'N';
4890 -- varangan - Billing Enhancement changes- Bug#5874824 - begin
4891 
4892  /* l_taiv_rec     okl_trx_ar_invoices_pub.taiv_rec_type;
4893     l_tilv_rec     okl_txl_ar_inv_lns_pub.tilv_rec_type;
4894     l_bpd_acc_rec  okl_acc_call_pub.bpd_acc_rec_type;
4895 
4896     lx_taiv_rec     okl_trx_ar_invoices_pub.taiv_rec_type;
4897     lx_tilv_rec     okl_txl_ar_inv_lns_pub.tilv_rec_type;
4898     lx_bpd_acc_rec  okl_acc_call_pub.bpd_acc_rec_type;
4899     */
4900 
4901  -----------------------------------------------------------
4902  -- Variables for billing API call
4903  -----------------------------------------------------------
4904     lp_taiv_rec        okl_tai_pvt.taiv_rec_type;
4905     lp_tilv_rec	       okl_til_pvt.tilv_rec_type;
4906     lp_tilv_tbl        okl_til_pvt.tilv_tbl_type;
4907     lp_tldv_tbl        okl_tld_pvt.tldv_tbl_type;
4908 
4909     lx_taiv_rec        okl_tai_pvt.taiv_rec_type;
4910     lx_tilv_tbl        okl_til_pvt.tilv_tbl_type;
4911     lx_tldv_tbl        okl_tld_pvt.tldv_tbl_type;
4912 
4913 --Varangan - Billing Enhancement changes - Bug#5874824  - End
4914     l_bill_to_site_use_id OKC_K_HEADERS_B.bill_to_site_use_id%TYPE;
4915     l_cust_acct_id        OKC_K_PARTY_ROLES_B.cust_acct_id%TYPE;
4916     l_payment_method_id     Number;
4917     l_bank_account_id       Number;
4918     l_inv_reason_for_review Varchar2(450);
4919     l_inv_review_until_date Date;
4920     l_cash_appl_rule_id     Number;
4921     l_invoice_format        Varchar2(450);
4922     l_review_invoice_yn     Varchar2(450);
4923 
4924     l_cust_acct_site_id     Number;
4925     l_payment_term_id       Number;
4926 
4927     --cursor to get vendor cpl_id at header level
4928     cursor l_chrcpl_csr (p_vendor_id in number,
4929                          p_chr_id    in number) is
4930     select cplb.id
4931     from   okc_k_party_roles_b cplb
4932     where  cplb.chr_id             = p_chr_id
4933     and    cplb.dnz_chr_id         = p_chr_id
4934     and    cplb.cle_id is null
4935     and    cplb.object1_id1        = to_char(p_vendor_id)
4936     and    cplb.object1_id2        = '#'
4937     and    cplb.jtot_object1_code  = 'OKX_VENDOR'
4938     and    cplb.rle_code           = 'OKL_VENDOR';
4939 
4940     l_chr_cpl_id number;
4941     l_try_id     number;
4942     l_chr_id     number DEFAULT p_chr_id;
4943 
4944   BEGIN
4945 
4946     x_return_status := OKL_API.G_RET_STS_SUCCESS;
4947     -- Call start_activity to create savepoint, check compatibility
4948     -- and initialize message list
4949     x_return_status := OKL_API.START_ACTIVITY (
4950                                l_api_name
4951                                ,p_init_msg_list
4952                                ,'_PVT'
4953                                ,x_return_status);
4954     -- Check if activity started successfully
4955     IF (x_return_status = OKL_API.G_RET_STS_UNEXP_ERROR) THEN
4956        RAISE OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
4957     ELSIF (x_return_status = OKL_API.G_RET_STS_ERROR) THEN
4958        RAISE OKL_API.G_EXCEPTION_ERROR;
4959     END IF;
4960 
4961     IF l_asdv_tbl.COUNT = 0 Then
4962         Null;
4963     Else
4964         -------------------------------------------------------------------------
4965         --find out subsidy records for which billing transaction is to be created
4966         -------------------------------------------------------------------------
4967         j := 1;
4968         FOR i in l_asdv_tbl.FIRST..l_asdv_tbl.LAST
4969         LOOP
4970             If (l_asdv_tbl(i).receipt_method_code = 'BILL') OR
4971                (l_asdv_tbl(i).accounting_method_code = 'AMORTIZE')  Then
4972                 -- OR clause added as only discounts('NET') can be FUNDED
4973                l_asdv_tbl_proc(j) := l_asdv_tbl(i);
4974                j:= j+1;
4975             ElsIf (l_asdv_tbl(i).receipt_method_code = 'FUND') AND
4976                   (l_asdv_tbl(i).accounting_method_code = 'NET') then
4977                 -- AND clause added as only discounts ('NET') can be funded
4978 
4979                 ------------------------------------------------------------
4980                 --find out if asset vendor and subsidy vendor are the same
4981                 --becuase only then net from funding can be done. If not same
4982                 --then 'BILL' irrespective of receipt method
4983                 ------------------------------------------------------------
4984                 l_exists := 'N';
4985                 Open l_samevend_csr(p_vendor_id    => l_asdv_tbl(i).vendor_id,
4986                                     p_asset_cle_id => l_asdv_tbl(i).asset_cle_id,
4987                                     p_chr_id       => l_chr_id);
4988                 Fetch l_samevend_csr into l_exists;
4989                 If l_samevend_csr%NOTFOUND then
4990                     null;
4991                 End If;
4992                 Close l_samevend_csr;
4993 
4994                 If l_exists = 'N' Then
4995                     l_asdv_tbl_proc(j) := l_asdv_tbl(i);
4996                    j := j+1;
4997                 End If;
4998             End If;
4999         End Loop;
5000 
5001         ------------------------------------------------------------------------
5002         --If there are records to process then create billing trx
5003         ------------------------------------------------------------------------
5004         If l_asdv_tbl_proc.COUNT > 0 Then
5005         For i in  l_asdv_tbl_proc.FIRST..l_asdv_tbl_proc.LAST Loop
5006 	  -- Varangan - Billing Enhancement changes - Bug#5874824 - Begin
5007             lp_taiv_rec.khr_id         := l_asdv_tbl_proc(i).dnz_chr_id;
5008             lp_taiv_rec.description    := l_asdv_tbl_proc(i).description;
5009             lp_taiv_rec.currency_code  := l_asdv_tbl_proc(i).currency_code;
5010             lp_taiv_rec.date_invoiced  := l_asdv_tbl_proc(i).start_date; --check whether it is ok to give this
5011             lp_taiv_rec.amount         := l_asdv_tbl_proc(i).amount;
5012 
5013 	    -- Varangan - Billing Enhancement changes - Bug#5874824 - End
5014             --l_taiv_rec.qte_id       := p_quote_id;
5015 
5016             /*l_taiv_rec.currency_conversion_type := l_qte_rec.currency_conversion_type;
5017                     l_taiv_rec.currency_conversion_rate := l_qte_rec.currency_conversion_rate;
5018                     l_taiv_rec.currency_conversion_date := l_qte_rec.currency_conversion_date;
5019             */
5020             --------------------------------------------------------------------
5021             --Get vendor billing information for the transaction
5022             --------------------------------------------------------------------
5023             --fetch contract header cpl_id
5024             open l_chrcpl_csr (p_vendor_id => l_asdv_tbl_proc(i).vendor_id,
5025                                p_chr_id    => l_chr_id);
5026             Fetch l_chrcpl_csr into l_chr_cpl_id;
5027             If l_chrcpl_csr%NOTFOUND then
5028                 NULL;
5029             End If;
5030             Close l_chrcpl_csr;
5031 
5032             Get_Vendor_Billing_Info (
5033                 p_contract_id           => l_chr_id,
5034                 p_cpl_id                => l_chr_cpl_id,
5035                 x_return_status         => x_return_status,
5036                 x_bill_to_site_use_id   => l_bill_to_site_use_id,
5037                 x_cust_acct_id          => l_cust_acct_id,
5038                 x_payment_method_id     => l_payment_method_id,
5039                 x_bank_account_id       => l_bank_account_id,
5040                 x_inv_reason_for_review => l_inv_reason_for_review,
5041                 x_inv_review_until_date => l_inv_review_until_date,
5042                 x_cash_appl_rule_id     => l_cash_appl_rule_id,
5043                 x_invoice_format        => l_invoice_format,
5044                 x_review_invoice_yn     => l_review_invoice_yn,
5045                 x_cust_acct_site_id     => l_cust_acct_site_id,
5046                 x_payment_term_id       => l_payment_term_id);
5047 
5048             IF (x_return_status = OKL_API.G_RET_STS_UNEXP_ERROR) THEN
5049                OKL_API.SET_MESSAGE (
5050                             p_app_name      => G_APP_NAME,
5051                             p_msg_name      => G_VERIFY_VENDOR_BILL,
5052                             p_token1        => G_VENDOR_NAME_TOKEN,
5053                             p_token1_value  => l_asdv_tbl_proc(i).vendor_name
5054                );
5055                 RAISE OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
5056             ELSIF (x_return_status = OKL_API.G_RET_STS_ERROR) THEN
5057                OKL_API.SET_MESSAGE (
5058                             p_app_name      => G_APP_NAME,
5059                             p_msg_name      => G_VERIFY_VENDOR_BILL,
5060                             p_token1        => G_VENDOR_NAME_TOKEN,
5061                             p_token1_value  => l_asdv_tbl_proc(i).vendor_name
5062                );
5063                 RAISE OKL_API.G_EXCEPTION_ERROR;
5064             END IF;
5065          -- Varangan - Billing Enhancement changes - Bug#5874824 - Begin
5066             lp_taiv_rec.ibt_id   := l_cust_acct_site_id;
5067             lp_taiv_rec.ixx_id   := l_cust_acct_id;
5068             lp_taiv_rec.irt_id   := l_payment_term_id;
5069             lp_taiv_rec.irm_id   := l_payment_method_id;
5070         -- Varangan - Billing Enhancement changes - Bug#5874824 - End
5071             --function to fetch try_id
5072             l_try_id := Get_trx_type_id(p_trx_type => G_AR_INV_TRX_TYPE,
5073                                         p_lang     => 'US');
5074             If l_try_id is null then
5075                 x_return_status := OKL_API.G_RET_STS_ERROR;
5076                         OKL_API.SET_MESSAGE (
5077                                 p_app_name          => G_APP_NAME,
5078                                 p_msg_name          => G_REQUIRED_VALUE,
5079                                 p_token1            => G_COL_NAME_TOKEN,
5080                                 p_token1_value      => 'Transaction Type');
5081                 RAISE OKL_API.G_EXCEPTION_ERROR;
5082             End If;
5083          -- Varangan - Billing Enhancement changes - Bug#5874824 - Begin
5084             lp_taiv_rec.try_id           := l_try_id;
5085             lp_taiv_rec.trx_status_code  := G_SUBMIT_STATUS;
5086             lp_taiv_rec.date_entered     := sysdate;
5087 
5088             lp_taiv_rec.OKL_SOURCE_BILLING_TRX := G_SOURCE_BILLING_TRX_BOOK;
5089 
5090         -- Populate the Line record
5091             lp_tilv_rec.amount               := l_asdv_tbl_proc(i).amount;
5092             -- varangan - Bug#5474059 - Modified - Start
5093 		      -- Passing KLE_ID as subsidy line id to track the subsidy records during rebook
5094             lp_tilv_rec.kle_id               := l_asdv_tbl_proc(i).subsidy_cle_id;
5095 
5096             lp_tilv_rec.description          := l_asdv_tbl_proc(i).description;
5097             lp_tilv_rec.sty_id               := l_asdv_tbl_proc(i).stream_type_id;
5098             lp_tilv_rec.line_number          := i;
5099             lp_tilv_rec.inv_receiv_line_code := G_AR_INV_LINE_CODE;
5100 			--   Bug# 4673593 -- pass bank acc# to internal |
5101 	    lp_tilv_rec.bank_acct_id := l_bank_account_id;
5102 			--   Bug# 4673593 -- pass bank acc# to internal |
5103 
5104             lp_tilv_tbl(1) := lp_tilv_rec; -- Assign the line record in tilv_tbl structure
5105 
5106             ---------------------------------------------------------------------------
5107 	    -- Call to Billing Centralized API
5108 	    ---------------------------------------------------------------------------
5109 		okl_internal_billing_pvt.create_billing_trx(p_api_version =>l_api_version,
5110 							    p_init_msg_list =>p_init_msg_list,
5111 							    x_return_status =>  x_return_status,
5112 							    x_msg_count => x_msg_count,
5113 							    x_msg_data => x_msg_data,
5114 							    p_taiv_rec => lp_taiv_rec,
5115 							    p_tilv_tbl => lp_tilv_tbl,
5116 							    p_tldv_tbl => lp_tldv_tbl,
5117 							    x_taiv_rec => lx_taiv_rec,
5118 							    x_tilv_tbl => lx_tilv_tbl,
5119 							    x_tldv_tbl => lx_tldv_tbl);
5120 
5121 	       IF (x_return_status = OKL_API.G_RET_STS_UNEXP_ERROR) THEN
5122                 RAISE OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
5123                ELSIF (x_return_status = OKL_API.G_RET_STS_ERROR) THEN
5124                 RAISE OKL_API.G_EXCEPTION_ERROR;
5125                END IF;
5126 
5127 
5128 
5129 			   /* -- Commenting the existing code for calling common Billing API
5130 
5131 			   --create internal AR transaction header
5132 			    okl_trx_ar_invoices_pub.insert_trx_ar_invoices (
5133 					    p_api_version       => p_api_version,
5134 					    p_init_msg_list     => p_init_msg_list,
5135 					    x_return_status     => x_return_status,
5136 					    x_msg_count         => x_msg_count,
5137 					    x_msg_data          => x_msg_data,
5138 					    p_taiv_rec          => l_taiv_rec,
5139 					    x_taiv_rec          => lx_taiv_rec);
5140 
5141 			    IF (x_return_status = OKL_API.G_RET_STS_UNEXP_ERROR) THEN
5142 				RAISE OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
5143 			    ELSIF (x_return_status = OKL_API.G_RET_STS_ERROR) THEN
5144 				RAISE OKL_API.G_EXCEPTION_ERROR;
5145 			    END IF;
5146 
5147 
5148 			    --tilv_record
5149 			    l_tilv_rec.tai_id               := lx_taiv_rec.id;
5150 
5151 
5152 
5153 			    --create internal AR transaction line
5154 			    okl_txl_ar_inv_lns_pub.insert_txl_ar_inv_lns  (
5155 					    p_api_version       => p_api_version,
5156 					    p_init_msg_list     => p_init_msg_list,
5157 					    x_return_status     => x_return_status,
5158 					    x_msg_count         => x_msg_count,
5159 					    x_msg_data          => x_msg_data,
5160 					    p_tilv_rec          => l_tilv_rec,
5161 					    x_tilv_rec          => lx_tilv_rec);
5162 
5163 			    IF (x_return_status = OKL_API.G_RET_STS_UNEXP_ERROR) THEN
5164 				RAISE OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
5165 			    ELSIF (x_return_status = OKL_API.G_RET_STS_ERROR) THEN
5166 				RAISE OKL_API.G_EXCEPTION_ERROR;
5167 			    END IF;
5168 
5169 
5170 			    --accounting trx
5171 			    l_bpd_acc_rec.id                := lx_tilv_rec.id;
5172 			    l_bpd_acc_rec.source_table      := G_AR_LINES_SOURCE;
5173 
5174 			    -- Create Accounting Distribution
5175 				    okl_acc_call_pub.create_acc_trans (
5176 					    p_api_version       => p_api_version,
5177 					    p_init_msg_list     => p_init_msg_list,
5178 					    x_return_status     => x_return_status,
5179 					    x_msg_count         => x_msg_count,
5180 					    x_msg_data          => x_msg_data,
5181 					    p_bpd_acc_rec       => l_bpd_acc_rec);
5182 
5183 			    IF (x_return_status = OKL_API.G_RET_STS_UNEXP_ERROR) THEN
5184 				RAISE OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
5185 			    ELSIF (x_return_status = OKL_API.G_RET_STS_ERROR) THEN
5186 				RAISE OKL_API.G_EXCEPTION_ERROR;
5187 			    END IF; */
5188 
5189             -- Varangan - Billing Enhancement changes - Bug#5874824 - End
5190         End Loop;
5191         End If;
5192     End If;
5193 
5194     l_asdv_tbl_proc.delete;
5195     OKL_API.END_ACTIVITY (x_msg_count,x_msg_data );
5196 
5197     EXCEPTION
5198     WHEN OKL_API.G_EXCEPTION_ERROR THEN
5199     If l_samevend_csr%ISOPEN then
5200         close l_samevend_csr;
5201     End If;
5202     If l_chrcpl_csr%ISOPEN then
5203         close l_chrcpl_csr;
5204     End If;
5205     x_return_status := OKL_API.HANDLE_EXCEPTIONS(
5206                                l_api_name,
5207                                G_PKG_NAME,
5208                                'OKL_API.G_RET_STS_ERROR',
5209                                x_msg_count,
5210                                x_msg_data,
5211                                '_PVT');
5212     WHEN OKL_API.G_EXCEPTION_UNEXPECTED_ERROR THEN
5213     If l_samevend_csr%ISOPEN then
5214         close l_samevend_csr;
5215     End If;
5216     If l_chrcpl_csr%ISOPEN then
5217         close l_chrcpl_csr;
5218     End If;
5219     x_return_status :=OKL_API.HANDLE_EXCEPTIONS(
5220                               l_api_name,
5221                               G_PKG_NAME,
5222                               'OKL_API.G_RET_STS_UNEXP_ERROR',
5223                               x_msg_count,
5224                               x_msg_data,
5225                               '_PVT');
5226     WHEN OTHERS THEN
5227     If l_samevend_csr%ISOPEN then
5228         close l_samevend_csr;
5229     End If;
5230     If l_chrcpl_csr%ISOPEN then
5231         close l_chrcpl_csr;
5232     End If;
5233     x_return_status :=OKL_API.HANDLE_EXCEPTIONS(
5234                               l_api_name,
5235                               G_PKG_NAME,
5236                               'OTHERS',
5237                               x_msg_count,
5238                               x_msg_data,
5239                               '_PVT');
5240   END insert_billing_records;
5241 -- varangan - Bug#5474059 - Added - End
5242 --------------------------------------------------------------------------------
5243 --Name     : Rebook_Synchronize
5244 --Date     : 08-Sep-2003
5245 --Purpose  : This will be called during online rebooks to synchronize any
5246 --           changes made on subsidies
5247 --------------------------------------------------------------------------------
5248 PROCEDURE rebook_synchronize(
5249     p_api_version                  IN  NUMBER,
5250     p_init_msg_list                IN  VARCHAR2,
5251     x_return_status                OUT NOCOPY VARCHAR2,
5252     x_msg_count                    OUT NOCOPY NUMBER,
5253     x_msg_data                     OUT NOCOPY VARCHAR2,
5254     p_rbk_chr_id                   in number,
5255     p_orig_chr_id                  in number
5256     ) is
5257 
5258     l_return_status        VARCHAR2(1)  default OKL_API.G_RET_STS_SUCCESS;
5259     l_api_name             CONSTANT     varchar2(30) := 'REBOOK_SYNCHRONIZE';
5260     l_api_version          CONSTANT     NUMBER := 1.0;
5261 
5262 
5263 
5264 --2.cursors to check if any of the subsidy elements have changed
5265   ---------------------------------------------------------------------------
5266   --get subsidy elements from rebook copy contract
5267   ---------------------------------------------------------------------------
5268   cursor l_subelm_rbk_csr(p_chr_id in number) is
5269   select  kle.SUBSIDY_ID
5270          ,clet.NAME
5271          ,clet.ITEM_DESCRIPTION
5272          ,kle.AMOUNT
5273          ,kle.SUBSIDY_OVERRIDE_AMOUNT
5274          ,cleb.orig_system_id1
5275          ,cplb.object1_id1  vendor_id
5276          ,cplb.id           cpl_id
5277          ,kle.sty_id        sty_id
5278   from   okl_k_lines          kle,
5279          okc_k_lines_tl       clet,
5280          okc_k_lines_b        cleb,
5281          okc_statuses_b       stsb,
5282          okc_line_styles_b    lseb,
5283          okc_k_party_roles_b  cplb
5284   where  kle.id          = cleb.id
5285   and    clet.id         = cleb.id
5286   and    clet.language   = userenv('LANG')
5287   and    cleb.dnz_chr_id = p_chr_id
5288   and    cleb.orig_system_id1 is not null
5289   and    stsb.code       = cleb.sts_code
5290   and    stsb.ste_code   not in ('CANCELLED')
5291   and    lseb.id         =  cleb.lse_id
5292   and    lseb.lty_code   =  'SUBSIDY'
5293   and    cplb.cle_id     = cleb.id
5294   and    cplb.rle_code   = 'OKL_VENDOR'
5295   and    cplb.dnz_chr_id = p_chr_id;
5296 
5297   l_subelm_rbk_rec l_subelm_rbk_csr%ROWTYPE;
5298 
5299   ---------------------------------------------------------------------------
5300   --get subsidy elements from original contract
5301   ---------------------------------------------------------------------------
5302   cursor l_subelm_orig_csr(p_cle_id in number,
5303                            p_chr_id in number) is
5304   select  kle.SUBSIDY_ID
5305          ,clet.NAME
5306          ,clet.ITEM_DESCRIPTION
5307          ,kle.AMOUNT
5308          ,kle.SUBSIDY_OVERRIDE_AMOUNT
5309          ,cplb.object1_id1  vendor_id
5310          ,cplb.id           cpl_id
5311          ,kle.sty_id        sty_id
5312   from   okl_k_lines          kle,
5313          okc_k_lines_tl       clet,
5314          okc_k_lines_b        cleb,
5315          okc_statuses_b       stsb,
5316          okc_line_styles_b    lseb,
5317          okc_k_party_roles_b  cplb
5318   where  kle.id          = cleb.id
5319   and    clet.id         = cleb.id
5320   and    clet.language   = userenv('LANG')
5321   and    cleb.id         = p_cle_id
5322   and    cleb.dnz_chr_id = p_chr_id
5323   and    stsb.code       = cleb.sts_code
5324   and    stsb.ste_code   not in ('CANCELLED')
5325   and    lseb.id         =  cleb.lse_id
5326   and    lseb.lty_code   =  'SUBSIDY'
5327   and    cplb.cle_id     = cleb.id
5328   and    cplb.rle_code   = 'OKL_VENDOR'
5329   and    cplb.dnz_chr_id = p_chr_id;
5330 
5331   l_subelm_orig_rec l_subelm_orig_csr%ROWTYPE;
5332 
5333   ----------------------------------------------------------
5334   --cursors to get party payment details
5335   ----------------------------------------------------------
5336   cursor l_ppyd_rbk_csr (p_cpl_id in number) is
5337   select ID
5338          ,CPL_ID
5339          ,VENDOR_ID
5340          ,PAY_SITE_ID
5341          ,PAYMENT_TERM_ID
5342          ,PAYMENT_METHOD_CODE
5343          ,PAY_GROUP_CODE
5344   from okl_party_payment_dtls
5345   where cpl_id = p_cpl_id;
5346 
5347   l_ppyd_rbk_rec  l_ppyd_rbk_csr%ROWTYPE;
5348 
5349   cursor l_ppyd_orig_csr (p_cpl_id in number) is
5350   select ID
5351          ,CPL_ID
5352          ,VENDOR_ID
5353          ,PAY_SITE_ID
5354          ,PAYMENT_TERM_ID
5355          ,PAYMENT_METHOD_CODE
5356          ,PAY_GROUP_CODE
5357   from okl_party_payment_dtls
5358   where cpl_id = p_cpl_id;
5359 
5360   l_ppyd_orig_rec  l_ppyd_orig_csr%ROWTYPE;
5361 
5362   ------------------------------------------------------------------------------
5363   --cursor to find out subsidy line which has been deleted
5364   ------------------------------------------------------------------------------
5365   cursor l_del_sub_csr (p_orig_chr_id in number,
5366                         p_rbk_chr_id  in number) is
5367   select cleb.id  cle_id,
5368          cplb.id  cpl_id
5369   from   okc_k_lines_b        cleb,
5370          okc_line_styles_b    lseb,
5371          okc_k_party_roles_b  cplb
5372   where  cleb.dnz_chr_id = p_orig_chr_id
5373   and    lseb.id         =  cleb.lse_id
5374   and    lseb.lty_code   =  'SUBSIDY'
5375   and    cplb.cle_id     = cleb.id
5376   and    cplb.dnz_chr_id = p_orig_chr_id
5377   and    cplb.rle_code   = 'OKL_VENDOR'
5378   --line was deleted from rebook copy :
5379   and    not exists (select '1'
5380                      from   okc_k_lines_b cleb2
5381                      where  cleb2.orig_system_id1 = cleb.id
5382                      and    cleb2.dnz_chr_id       = p_rbk_chr_id)
5383   --line is not a new line created during this rebook
5384   and    not exists (select '1'
5385                      from   okc_k_lines_b cleb3
5386                      where  cleb3.id   = cleb.orig_system_id1
5387                      and    cleb3.dnz_chr_id = p_rbk_chr_id);
5388 
5389   l_del_sub_id      number;
5390   l_del_cpl_id      number;
5391 
5392     ------------------------------------------------------------------------------
5393   --cursor to find out new subsidy lines which have been added
5394   ------------------------------------------------------------------------------
5395   cursor l_new_sub_csr (p_chr_id  in number) is
5396   select kle.subsidy_id              subsidy_id,
5397          cleb.id                     subsidy_cle_id,
5398          clet.name                   name,
5399          clet.item_description       description,
5400          kle.amount                  amount,
5401          kle.subsidy_override_amount subsidy_override_amount,
5402          cleb.dnz_chr_id             dnz_chr_id,
5403          cleb.cle_id                 asset_cle_id,
5404          cplb.id                     cpl_id,
5405          cplb.object1_id1            vendor_id,
5406          cleb.lse_id                 lse_id,
5407          cleb.display_sequence       display_sequence,
5408          cleb.start_date             start_date,
5409          cleb.end_date               end_date,
5410          cleb.currency_code          currency_code,
5411          cleb.sts_code               sts_code,
5412          kle.sty_id                  sty_id,
5413          asst_cleb.orig_system_id1   orig_asst_cle_id
5414 
5415   from
5416          okc_k_lines_b              asst_cleb,
5417          okc_statuses_b             asst_sts,
5418          okc_k_party_roles_b        cplb,
5419          okc_k_lines_tl             clet,
5420          okl_k_lines                kle,
5421          okc_line_styles_b          lseb,
5422          okc_k_lines_b              cleb
5423 
5424   Where  asst_cleb.id              =   cleb.cle_id
5425   And    asst_cleb.dnz_chr_id      =   cleb.dnz_chr_id
5426   And    asst_sts.code             =   asst_cleb.sts_code
5427   And    asst_sts.ste_code         not in ('HOLD','EXPIRED','TERMINATED','CANCELLED')
5428   And    cplb.jtot_object1_code    =   'OKX_VENDOR'
5429   And    cplb.dnz_chr_id           =   cleb.dnz_chr_id
5430   And    cplb.cle_id               =   cleb.id
5431   And    cplb.rle_code             =   'OKL_VENDOR'
5432   And    clet.id                   =   cleb.id
5433   And    clet.language             =   userenv('LANG')
5434   And    kle.id                    =   cleb.id
5435   And    lseb.id                   =   cleb.lse_id
5436   And    lseb.lty_code             =   'SUBSIDY'
5437   And    cleb.dnz_chr_id           =   p_chr_id
5438   And    cleb.orig_system_id1  is null
5439   And    asst_cleb.orig_system_id1 is not null
5440   And    cleb.sts_code <> 'ABANDONED';
5441 
5442   l_new_sub_rec     l_new_sub_csr%ROWTYPE;
5443 
5444   --cursor to get asset line id if asset line is new
5445   cursor l_cleb_csr (p_orig_cle_id in number) is
5446   select cleb.id
5447   from   okc_k_lines_b cleb
5448   where  cleb.orig_system_id1 = p_orig_cle_id;
5449 
5450   l_asset_cle_id okc_k_lines_b.ID%TYPE;
5451 
5452   --record structures for update and delete
5453 
5454   l_asst_clev_rec    okl_okc_migration_pvt.clev_rec_type;
5455   l_asst_klev_rec    okl_contract_pub.klev_rec_type;
5456   lx_asst_clev_rec   okl_okc_migration_pvt.clev_rec_type;
5457   lx_asst_klev_rec   okl_contract_pub.klev_rec_type;
5458 
5459   l_sub_clev_rec    okl_okc_migration_pvt.clev_rec_type;
5460   l_sub_klev_rec    okl_contract_pub.klev_rec_type;
5461   lx_sub_clev_rec   okl_okc_migration_pvt.clev_rec_type;
5462   lx_sub_klev_rec   okl_contract_pub.klev_rec_type;
5463 
5464 
5465   l_cplv_rec           okl_okc_migration_pvt.cplv_rec_type;
5466   lx_cplv_rec          okl_okc_migration_pvt.cplv_rec_type;
5467 
5468 
5469   l_pydv_rec          okl_pyd_pvt.ppydv_rec_type;
5470   lx_pydv_rec         okl_pyd_pvt.ppydv_rec_type;
5471 
5472   -- sjalasut, added local variables to support logging. added as part of
5473   -- subsidy pools enhancement
5474   l_module CONSTANT fnd_log_messages.module%TYPE := 'okl.plsql.OKL_SUBSIDY_PROCESS_PVT.REBOOK_SYNCHRONIZE';
5475   l_debug_enabled VARCHAR2(10);
5476   is_debug_statement_on BOOLEAN;
5477 
5478   --Bug# 4558486
5479   l_kplv_rec          okl_k_party_roles_pvt.kplv_rec_type;
5480   lx_kplv_rec         okl_k_party_roles_pvt.kplv_rec_type;
5481 
5482   --Bug# 4899328
5483   l_orig_asset_cle_id   number;
5484   l_cap_amount          number;
5485   l_clev_fin_rec    okl_okc_migration_pvt.clev_rec_type;
5486   l_klev_fin_rec    okl_contract_pub.klev_rec_type;
5487   lx_clev_fin_rec   okl_okc_migration_pvt.clev_rec_type;
5488   lx_klev_fin_rec   okl_contract_pub.klev_rec_type;
5489 
5490    -- varangan - Bug#5474059  - Added - Start
5491    l_new_asdv_tbl asbv_tbl_type;
5492    l_new_cnt      NUMBER DEFAULT 0;
5493    -- varangan - Bug#5474059  - Added - End
5494 begin
5495 
5496     x_return_status := OKL_API.G_RET_STS_SUCCESS;
5497     -- Call start_activity to create savepoint, check compatibility
5498     -- and initialize message list
5499     x_return_status := OKL_API.START_ACTIVITY (
5500                                l_api_name
5501                                ,p_init_msg_list
5502                                ,'_PVT'
5503                                ,x_return_status);
5504     -- Check if activity started successfully
5505     IF (x_return_status = OKL_API.G_RET_STS_UNEXP_ERROR) THEN
5506        RAISE OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
5507     ELSIF (x_return_status = OKL_API.G_RET_STS_ERROR) THEN
5508        RAISE OKL_API.G_EXCEPTION_ERROR;
5509     END IF;
5510 
5511     -- check if debug is enabled
5512     l_debug_enabled := okl_debug_pub.check_log_enabled;
5513     -- check for logging on STATEMENT level
5514     is_debug_statement_on := okl_debug_pub.check_log_on(l_module,FND_LOG.LEVEL_STATEMENT);
5515 
5516     --------------------------------------
5517     --start of input parameter validations
5518     --------------------------------------
5519     --1.validate p_rbk_chr_id
5520     If (p_rbk_chr_id is NULL) or (p_rbk_chr_id = OKL_API.G_MISS_NUM) then
5521         OKL_API.set_message(
5522                               p_app_name     => G_APP_NAME,
5523                               p_msg_name     => G_API_MISSING_PARAMETER,
5524                               p_token1       => G_API_NAME_TOKEN,
5525                               p_token1_value => l_api_name,
5526                               p_token2       => G_MISSING_PARAM_TOKEN,
5527                               p_token2_value => 'p_rbk_chr_id');
5528          x_return_status := OKL_API.G_RET_STS_ERROR;
5529          Raise OKL_API.G_EXCEPTION_ERROR;
5530     Elsif (p_rbk_chr_id is not NULL) and (p_rbk_chr_id <> OKL_API.G_MISS_NUM) then
5531         validate_chr_id(p_chr_id        => p_rbk_chr_id,
5532                         x_return_status => x_return_status);
5533         IF x_return_status = OKL_API.G_RET_STS_ERROR then
5534             OKL_API.set_message(G_APP_NAME, G_INVALID_VALUE,G_COL_NAME_TOKEN,'p_rbk_chr_id');
5535             Raise OKL_API.G_EXCEPTION_ERROR;
5536         Elsif x_return_status = OKL_API.G_RET_STS_UNEXP_ERROR then
5537             Raise OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
5538         End If;
5539     End If;
5540     --2.validate p_orig_chr_id
5541     If (p_orig_chr_id is NULL) or (p_orig_chr_id = OKL_API.G_MISS_NUM) then
5542         OKL_API.set_message(
5543                               p_app_name     => G_APP_NAME,
5544                               p_msg_name     => G_API_MISSING_PARAMETER,
5545                               p_token1       => G_API_NAME_TOKEN,
5546                               p_token1_value => l_api_name,
5547                               p_token2       => G_MISSING_PARAM_TOKEN,
5548                               p_token2_value => 'p_orig_chr_id');
5549          x_return_status := OKL_API.G_RET_STS_ERROR;
5550          Raise OKL_API.G_EXCEPTION_ERROR;
5551     Elsif (p_orig_chr_id is not NULL) and (p_orig_chr_id <> OKL_API.G_MISS_NUM) then
5552         validate_chr_id(p_chr_id        => p_orig_chr_id,
5553                         x_return_status => x_return_status);
5554         IF x_return_status = OKL_API.G_RET_STS_ERROR then
5555             OKL_API.set_message(G_APP_NAME, G_INVALID_VALUE,G_COL_NAME_TOKEN,'p_orig_chr_id');
5556             Raise OKL_API.G_EXCEPTION_ERROR;
5557         Elsif x_return_status = OKL_API.G_RET_STS_UNEXP_ERROR then
5558             Raise OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
5559         End If;
5560     End If;
5561     -------------------------------------
5562     --end of input parameter validations
5563     ------------------------------------
5564     /*
5565      * sjalasut, added code here to call synchornization of subsidy pool transactions
5566      * before synchronizing the subsidy lines. this code is added as part of
5567      * subsidy pools enhancement. START
5568      */
5569      -- write to log
5570      IF(NVL(l_debug_enabled,'N')='Y' AND is_debug_statement_on) THEN
5571        okl_debug_pub.log_debug(FND_LOG.LEVEL_STATEMENT,
5572                                l_module,
5573                                'invoking OKL_SUBSIDY_POOL_AUTH_TRX_PVT.create_pool_trx_khr_rbk'||
5574                                ' p_rbk_chr_id '||p_rbk_chr_id||' p_orig_chr_id '||p_orig_chr_id
5575                                );
5576      END IF; -- end of NVL(l_debug_enabled,'N')='Y' AND is_debug_statement_on
5577 
5578      OKL_SUBSIDY_POOL_AUTH_TRX_PVT.create_pool_trx_khr_rbk(p_api_version   => p_api_version
5579                                                           ,p_init_msg_list => p_init_msg_list
5580                                                           ,x_return_status => x_return_status
5581                                                           ,x_msg_count     => x_msg_count
5582                                                           ,x_msg_data      => x_msg_data
5583                                                           ,p_rbk_chr_id    => p_rbk_chr_id
5584                                                           ,p_orig_chr_id    => p_orig_chr_id
5585                                                           );
5586      -- write to log
5587      IF(NVL(l_debug_enabled,'N')='Y' AND is_debug_statement_on) THEN
5588        okl_debug_pub.log_debug(FND_LOG.LEVEL_STATEMENT,
5589                                l_module,
5590                                'OKL_SUBSIDY_POOL_AUTH_TRX_PVT.create_pool_trx_khr_rbk returned with status '||x_return_status||
5591                                ' x_msg_data '||x_msg_data
5592                                );
5593      END IF; -- end of NVL(l_debug_enabled,'N')='Y' AND is_debug_statement_on
5594 
5595      IF(x_return_status = OKL_API.G_RET_STS_UNEXP_ERROR)THEN
5596        RAISE OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
5597      ELSIF(x_return_status = OKL_API.G_RET_STS_ERROR)THEN
5598        RAISE OKL_API.G_EXCEPTION_ERROR;
5599      END IF;
5600 
5601     /*
5602      * sjalasut, added code here to call synchornization of subsidy pool transactions
5603      * before synchronizing the subsidy lines. this code is added as part of
5604      * subsidy pools enhancement. END
5605      */
5606 
5607    -----------------------------------------------------------------------------
5608    --A. Synchronize subsidized amounts on the financial asset lines
5609    -----------------------------------------------------------------------------
5610     --This code(Part A) is promoted to rebook api as asset lines are being synched there
5611 
5612     ----------------------------------------------------------------------------
5613     --B. Sunchronize subsidy line attributes
5614     ----------------------------------------------------------------------------
5615     --1. Fetch subsidy line attributes for the rebook copy
5616     Open l_subelm_rbk_csr(p_chr_id => p_rbk_chr_id);
5617     Loop
5618         Fetch l_subelm_rbk_csr into l_subelm_rbk_rec;
5619         Exit when l_subelm_rbk_csr%NOTFOUND;
5620         --2. Fetch subsidy line attributes for original contract
5621         Open l_subelm_orig_csr(p_cle_id => l_subelm_rbk_rec.orig_system_id1,
5622                                p_chr_id => p_orig_chr_id);
5623         Fetch l_subelm_orig_csr into l_subelm_orig_rec;
5624         If l_subelm_orig_csr%NOTFOUND then
5625             Null;
5626         Else
5627             --3. syncronize subsidy line attributes in case of differences
5628             If  (nvl(l_subelm_orig_rec.amount,0)                  <>  nvl(l_subelm_rbk_rec.Amount,0)) OR
5629                 (nvl(l_subelm_orig_rec.subsidy_override_amount,0) <>  nvl(l_subelm_rbk_rec.subsidy_override_Amount,0)) OR
5630                 (l_subelm_orig_rec.subsidy_id                     <>  l_subelm_rbk_rec.subsidy_id) OR
5631                 (l_subelm_orig_rec.sty_id                         <>  l_subelm_rbk_rec.sty_id) Then
5632 
5633                 l_sub_clev_rec.id                       := l_subelm_rbk_rec.orig_system_id1;
5634                 l_sub_klev_rec.id                       := l_subelm_rbk_rec.orig_system_id1;
5635                 l_sub_klev_rec.Amount                   := l_subelm_rbk_rec.Amount;
5636                 l_sub_klev_rec.Subsidy_override_Amount  := l_subelm_rbk_rec.Subsidy_override_Amount;
5637                 l_sub_klev_rec.Subsidy_id               := l_subelm_rbk_rec.Subsidy_id;
5638                 l_sub_clev_rec.Name                     := l_subelm_rbk_rec.Name;
5639                 l_sub_clev_rec.item_description         := l_subelm_rbk_rec.item_description;
5640                 l_sub_klev_rec.sty_id                   := l_subelm_rbk_rec.sty_id;
5641 
5642                 --dbms_output.put_line('Amount before updating line '||to_char(l_sub_klev_rec.Amount));
5643                 okl_contract_pub.update_contract_line
5644                     (p_api_version   => p_api_version,
5645                      p_init_msg_list => p_init_msg_list,
5646                      x_return_status => x_return_status,
5647                      x_msg_count     => x_msg_count,
5648                      x_msg_data      => x_msg_data,
5649                      p_clev_rec      => l_sub_clev_rec,
5650                      p_klev_rec      => l_sub_klev_rec,
5651                      x_clev_rec      => lx_sub_clev_rec,
5652                      x_klev_rec      => lx_sub_klev_rec);
5653 
5654                 IF (x_return_status = OKL_API.G_RET_STS_UNEXP_ERROR) THEN
5655                     RAISE OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
5656                 ELSIF (x_return_status = OKL_API.G_RET_STS_ERROR) THEN
5657                     RAISE OKL_API.G_EXCEPTION_ERROR;
5658                 END IF;
5659 
5660                 --Bug# 4899328 : Recalculate OEC and capital amount and update financial asset line
5661                 l_orig_asset_cle_id := lx_sub_clev_rec.cle_id;
5662                 OKL_EXECUTE_FORMULA_PUB.execute(p_api_version   => p_api_version,
5663                                     p_init_msg_list => p_init_msg_list,
5664                                     x_return_status => x_return_status,
5665                                     x_msg_count     => x_msg_count,
5666                                     x_msg_data      => x_msg_data,
5667                                     p_formula_name  => G_FORMULA_CAP,
5668                                     p_contract_id   => p_orig_chr_id,
5669                                     p_line_id       => l_orig_asset_cle_id,
5670                                     x_value         => l_cap_amount);
5671 
5672                IF (x_return_status = OKL_API.G_RET_STS_UNEXP_ERROR) THEN
5673                    RAISE OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
5674                ELSIF (x_return_status = OKL_API.G_RET_STS_ERROR) THEN
5675                    RAISE OKL_API.G_EXCEPTION_ERROR;
5676                END IF;
5677 
5678                ----------------------------------------------------------------------
5679                --call api to update costs on asset line
5680                ----------------------------------------------------------------------
5681                l_clev_fin_rec.id                    := l_orig_asset_cle_id;
5682                l_klev_fin_rec.id                    := l_orig_asset_cle_id;
5683                l_klev_fin_rec.capital_amount        := l_cap_amount;
5684 
5685 
5686                okl_contract_pub.update_contract_line
5687                            (p_api_version   => p_api_version,
5688                             p_init_msg_list => p_init_msg_list,
5689                             x_return_status => x_return_status,
5690                             x_msg_count     => x_msg_count,
5691                             x_msg_data      => x_msg_data,
5692                             p_clev_rec      => l_clev_fin_rec,
5693                             p_klev_rec      => l_klev_fin_rec,
5694                             x_clev_rec      => lx_clev_fin_rec,
5695                             x_klev_rec      => lx_klev_fin_rec
5696                             );
5697 
5698                IF (x_return_status = OKL_API.G_RET_STS_UNEXP_ERROR) THEN
5699                    RAISE OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
5700                ELSIF (x_return_status = OKL_API.G_RET_STS_ERROR) THEN
5701                    RAISE OKL_API.G_EXCEPTION_ERROR;
5702                END IF;
5703             End If;
5704             --Bug# 4899328
5705 
5706             --4. syncronize subsidy party attributes in case of differences
5707             IF (l_subelm_orig_rec.vendor_id <>  l_subelm_rbk_rec.vendor_id) Then
5708                 Null;
5709                 --------------------------------------------------------------
5710                 --***(i)Commented as syncing vendor not allowed during rebooks
5711                 --as per srawlings: if vendor is to be changed delete the
5712                 --subsidy and add a new one
5713                 /*------------------------------------------------------------
5714                 --l_cplv_rec.id          := l_subelm_orig_rec.cpl_id;
5715                 --l_cplv_rec.object1_id1 := l_subelm_rbk_rec.vendor_id;
5716 
5717                 --okl_okc_migration_pvt.update_k_party_role
5718                     --(p_api_version   => p_api_version,
5719                      --p_init_msg_list => p_init_msg_list,
5720                      --x_return_status => x_return_status,
5721                      --x_msg_count     => x_msg_count,
5722                      --x_msg_data      => x_msg_data,
5723                      --p_cplv_rec      => l_cplv_rec,
5724                      --x_cplv_rec      => lx_cplv_rec);
5725 
5726                 --IF (x_return_status = OKL_API.G_RET_STS_UNEXP_ERROR) THEN
5727                     --RAISE OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
5728                 --ELSIF (x_return_status = OKL_API.G_RET_STS_ERROR) THEN
5729                     --RAISE OKL_API.G_EXCEPTION_ERROR;
5730                 --END IF;
5731                 -----------------------------------------------------------*/
5732                 --***Commented as syncing vendor not allowed during rebooks
5733                 --as per srawlings
5734                 -----------------------------------------------------------
5735             End If;
5736 
5737             -----------------------------------------------------------------------
5738             --In view of the above decesion(i) of not changing the vendor during re-book,
5739             --party payment details will be synced only if the vendor is same on
5740             --rebook copy and the original contract. So enclosed the party payment
5741             --details sync code in IF clause below.
5742             ------------------------------------------------------------------------
5743             IF (l_subelm_orig_rec.vendor_id = l_subelm_rbk_rec.vendor_id) THEN --new IF clause
5744                 --5. party payment details synchronization
5745                 open l_ppyd_rbk_csr (p_cpl_id => l_subelm_rbk_rec.cpl_id);
5746                 fetch l_ppyd_rbk_csr into l_ppyd_rbk_rec;
5747                 If l_ppyd_rbk_csr%NOTFOUND then
5748                     open l_ppyd_orig_csr (p_cpl_id => l_subelm_orig_rec.cpl_id);
5749                     fetch l_ppyd_orig_csr into l_ppyd_orig_rec;
5750                     If l_ppyd_orig_csr%NOTFOUND then
5751                        null;
5752                     Else
5753                        --delete party payment details
5754                        l_pydv_rec.id := l_ppyd_orig_rec.id;
5755 
5756                        OKL_PYD_PVT.delete_row
5757                          (p_api_version   => p_api_version,
5758                           p_init_msg_list => p_init_msg_list,
5759                           x_return_status => x_return_status,
5760                           x_msg_count     => x_msg_count,
5761                           x_msg_data      => x_msg_data,
5762                           p_ppydv_rec      => l_pydv_rec);
5763 
5764 
5765                         IF (x_return_status = OKL_API.G_RET_STS_UNEXP_ERROR) THEN
5766                             RAISE OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
5767                         ELSIF (x_return_status = OKL_API.G_RET_STS_ERROR) THEN
5768                             RAISE OKL_API.G_EXCEPTION_ERROR;
5769                         END IF;
5770                     End If;
5771                     close l_ppyd_orig_csr;
5772                 Else
5773                     open l_ppyd_orig_csr (p_cpl_id => l_subelm_orig_rec.cpl_id);
5774                     fetch l_ppyd_orig_csr into l_ppyd_orig_rec;
5775                     If l_ppyd_orig_csr%NOTFOUND then
5776 
5777                        --create payment details row
5778                        l_pydv_rec.cpl_id              := l_subelm_orig_rec.cpl_id;
5779                        l_pydv_rec.vendor_id           := l_ppyd_rbk_rec.vendor_id;
5780                        l_pydv_rec.pay_site_id         := l_ppyd_rbk_rec.pay_site_id;
5781                        l_pydv_rec.payment_term_id     := l_ppyd_rbk_rec.payment_term_id;
5782                        l_pydv_rec.payment_method_code := l_ppyd_rbk_rec.payment_method_code;
5783                        l_pydv_rec.pay_group_code      := l_ppyd_rbk_rec.pay_group_code;
5784 
5785                        OKL_PYD_PVT.insert_row
5786                           (p_api_version   => p_api_version,
5787                            p_init_msg_list => p_init_msg_list,
5788                            x_return_status => x_return_status,
5789                            x_msg_count     => x_msg_count,
5790                            x_msg_data      => x_msg_data,
5791                            p_ppydv_rec     => l_pydv_rec,
5792                            x_ppydv_rec     => lx_pydv_rec);
5793 
5794 
5795                      IF (x_return_status = OKL_API.G_RET_STS_UNEXP_ERROR) THEN
5796                          RAISE OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
5797                      ELSIF (x_return_status = OKL_API.G_RET_STS_ERROR) THEN
5798                          RAISE OKL_API.G_EXCEPTION_ERROR;
5799                      END IF;
5800 
5801 
5802                     Else
5803                         --if payment details are not equal
5804                        If (l_ppyd_orig_rec.pay_site_id           <> l_ppyd_rbk_rec.pay_site_id) OR
5805                        (l_ppyd_orig_rec.payment_term_id       <> l_ppyd_rbk_rec.payment_term_id) OR
5806                        (l_ppyd_orig_rec.payment_method_code   <> l_ppyd_rbk_rec.payment_method_code) OR
5807                        (l_ppyd_orig_rec.pay_group_code        <> l_ppyd_rbk_rec.pay_group_code) Then
5808 
5809                             l_pydv_rec.id                    := l_ppyd_orig_rec.id;
5810                             l_pydv_rec.cpl_id                := l_subelm_orig_rec.cpl_id;
5811                             l_pydv_rec.vendor_id             := l_ppyd_rbk_rec.vendor_id;
5812                             l_pydv_rec.pay_site_id           := l_ppyd_rbk_rec.pay_site_id;
5813                             l_pydv_rec.payment_term_id       := l_ppyd_rbk_rec.payment_term_id;
5814                             l_pydv_rec.payment_method_code   := l_ppyd_rbk_rec.payment_method_code;
5815                             l_pydv_rec.pay_group_code        := l_ppyd_rbk_rec.pay_group_code;
5816 
5817                             okl_pyd_pvt.update_row
5818                            (p_api_version   => p_api_version,
5819                             p_init_msg_list => p_init_msg_list,
5820                             x_return_status => x_return_status,
5821                             x_msg_count     => x_msg_count,
5822                             x_msg_data      => x_msg_data,
5823                             p_ppydv_rec      => l_pydv_rec,
5824                             x_ppydv_rec      => lx_pydv_rec);
5825 
5826 
5827                             IF (x_return_status = OKL_API.G_RET_STS_UNEXP_ERROR) THEN
5828                                 RAISE OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
5829                             ELSIF (x_return_status = OKL_API.G_RET_STS_ERROR) THEN
5830                                 RAISE OKL_API.G_EXCEPTION_ERROR;
5831                             END IF;
5832                         End If;
5833                     End If;
5834                     close l_ppyd_orig_csr;
5835                 End If;
5836                 Close l_ppyd_rbk_csr;
5837             END IF;-- If for effective only if vendor has not been modified
5838             -----------------------------------------------------------------------------------
5839             --party payment detail updates are effective only if vendor has not been modified on
5840             --rebook copy - as vendor updates are not allowed on a subsidy line during rebook
5841             ------------------------------------------------------------------------------------
5842         End If;
5843         Close l_subelm_orig_csr;
5844     End Loop;
5845     Close l_subelm_rbk_csr;
5846 
5847     ----------------------------------------------------------------------------
5848     --C. Delete any subsidy lines deleted during rebook
5849     ----------------------------------------------------------------------------
5850     open l_del_sub_csr (p_orig_chr_id => p_orig_chr_id,
5851                         p_rbk_chr_id  => p_rbk_chr_id);
5852     Loop
5853         Fetch  l_del_sub_csr into   l_del_sub_id,
5854                                     l_del_cpl_id;
5855         Exit when l_del_sub_csr%NOTFOUND;
5856 
5857         --3. Logically Delete subsidy line
5858         l_sub_clev_rec.id       := l_del_sub_id;
5859         l_sub_klev_rec.id       := l_del_sub_id;
5860         l_sub_clev_rec.sts_code := 'ABANDONED';
5861 
5862         okl_contract_pub.update_contract_line
5863             (p_api_version   => p_api_version,
5864              p_init_msg_list => p_init_msg_list,
5865              x_return_status => x_return_status,
5866              x_msg_count     => x_msg_count,
5867              x_msg_data      => x_msg_data,
5868              p_clev_rec      => l_sub_clev_rec,
5869              p_klev_rec      => l_sub_klev_rec,
5870              x_clev_rec      => lx_sub_clev_rec,
5871              x_klev_rec      => lx_sub_klev_rec);
5872 
5873         IF (x_return_status = OKL_API.G_RET_STS_UNEXP_ERROR) THEN
5874             RAISE OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
5875         ELSIF (x_return_status = OKL_API.G_RET_STS_ERROR) THEN
5876             RAISE OKL_API.G_EXCEPTION_ERROR;
5877         END IF;
5878 
5879         /*********can not physically delete line on a booked K ****/
5880 
5881         --Bug# 4899328 : Recalculate OEC and capital amount and update financial asset line
5882         l_orig_asset_cle_id := lx_sub_clev_rec.cle_id;
5883         OKL_EXECUTE_FORMULA_PUB.execute(p_api_version   => p_api_version,
5884                                     p_init_msg_list => p_init_msg_list,
5885                                     x_return_status => x_return_status,
5886                                     x_msg_count     => x_msg_count,
5887                                     x_msg_data      => x_msg_data,
5888                                     p_formula_name  => G_FORMULA_CAP,
5889                                     p_contract_id   => p_orig_chr_id,
5890                                     p_line_id       => l_orig_asset_cle_id,
5891                                     x_value         => l_cap_amount);
5892 
5893         IF (x_return_status = OKL_API.G_RET_STS_UNEXP_ERROR) THEN
5894              RAISE OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
5895         ELSIF (x_return_status = OKL_API.G_RET_STS_ERROR) THEN
5896              RAISE OKL_API.G_EXCEPTION_ERROR;
5897         END IF;
5898 
5899         ----------------------------------------------------------------------
5900         --call api to update costs on asset line
5901         ----------------------------------------------------------------------
5902         l_clev_fin_rec.id                    := l_orig_asset_cle_id;
5903         l_klev_fin_rec.id                    := l_orig_asset_cle_id;
5904         l_klev_fin_rec.capital_amount        := l_cap_amount;
5905 
5906 
5907         okl_contract_pub.update_contract_line
5908                            (p_api_version   => p_api_version,
5909                             p_init_msg_list => p_init_msg_list,
5910                             x_return_status => x_return_status,
5911                             x_msg_count     => x_msg_count,
5912                             x_msg_data      => x_msg_data,
5913                             p_clev_rec      => l_clev_fin_rec,
5914                             p_klev_rec      => l_klev_fin_rec,
5915                             x_clev_rec      => lx_clev_fin_rec,
5916                             x_klev_rec      => lx_klev_fin_rec
5917                             );
5918 
5919         IF (x_return_status = OKL_API.G_RET_STS_UNEXP_ERROR) THEN
5920             RAISE OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
5921         ELSIF (x_return_status = OKL_API.G_RET_STS_ERROR) THEN
5922             RAISE OKL_API.G_EXCEPTION_ERROR;
5923         END IF;
5924         --Bug# 4899328
5925 
5926     End Loop;
5927     Close l_del_sub_csr;
5928 
5929     ----------------------------------------------------------------------------
5930     --C. Syncronize new subsidy line
5931     ----------------------------------------------------------------------------
5932     --1. fetch new subsidy lines
5933     open l_new_sub_csr (p_chr_id => p_rbk_chr_id);
5934     Loop
5935         Fetch l_new_sub_csr into l_new_sub_rec;
5936         Exit when l_new_sub_csr%NOTFOUND;
5937 
5938         --create subsidy line record
5939         l_sub_klev_rec.id                      := OKL_API.G_MISS_NUM;
5940         l_sub_klev_rec.subsidy_id              := l_new_sub_rec.subsidy_id;
5941         l_sub_klev_rec.amount                  := l_new_sub_rec.amount;
5942         l_sub_klev_rec.subsidy_override_amount := l_new_sub_rec.subsidy_override_amount;
5943         l_sub_klev_rec.sty_id                  := l_new_sub_rec.sty_id;
5944 
5945         If l_new_sub_rec.orig_asst_cle_id is not null then
5946             l_sub_clev_rec.cle_id                  := l_new_sub_rec.orig_asst_cle_id;
5947         Else
5948             Open l_cleb_csr(p_orig_cle_id => l_new_sub_rec.asset_cle_id);
5949             fetch l_cleb_csr into l_asset_cle_id;
5950             If l_cleb_csr%NOTFOUND then
5951                 null;
5952             End If;
5953             close l_cleb_csr;
5954             l_sub_clev_rec.cle_id              := l_asset_cle_id;
5955         End If;
5956 
5957         l_sub_clev_rec.id                      := OKL_API.G_MISS_NUM;
5958         l_sub_clev_rec.dnz_chr_id              := p_orig_chr_id;
5959         l_sub_clev_rec.exception_yn            := 'N';
5960         l_sub_clev_rec.lse_id                  := l_new_sub_rec.lse_id;
5961         l_sub_clev_rec.display_sequence        := l_new_sub_rec.display_sequence;
5962         l_sub_clev_rec.name                    := l_new_sub_rec.name;
5963         l_sub_clev_rec.item_description        := l_new_sub_rec.description;
5964         l_sub_clev_rec.start_date              := l_new_sub_rec.start_date;
5965         l_sub_clev_rec.end_date                := l_new_sub_rec.end_date;
5966         l_sub_clev_rec.currency_code           := l_new_sub_rec.currency_code;
5967         l_sub_clev_rec.sts_code                := l_new_sub_rec.sts_code;
5968 
5969         --dbms_output.put_line('Amount before updating line '||to_char(l_sub_klev_rec.Amount));
5970         okl_contract_pub.create_contract_line
5971                     (p_api_version   => p_api_version,
5972                      p_init_msg_list => p_init_msg_list,
5973                      x_return_status => x_return_status,
5974                      x_msg_count     => x_msg_count,
5975                      x_msg_data      => x_msg_data,
5976                      p_clev_rec      => l_sub_clev_rec,
5977                      p_klev_rec      => l_sub_klev_rec,
5978                      x_clev_rec      => lx_sub_clev_rec,
5979                      x_klev_rec      => lx_sub_klev_rec);
5980 
5981         IF (x_return_status = OKL_API.G_RET_STS_UNEXP_ERROR) THEN
5982             RAISE OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
5983         ELSIF (x_return_status = OKL_API.G_RET_STS_ERROR) THEN
5984             RAISE OKL_API.G_EXCEPTION_ERROR;
5985         END IF;
5986 
5987         --Bug# 4899328 : Recalculate OEC and capital amount and update financial asset line
5988         l_orig_asset_cle_id := lx_sub_clev_rec.cle_id;
5989         OKL_EXECUTE_FORMULA_PUB.execute(p_api_version   => p_api_version,
5990                                     p_init_msg_list => p_init_msg_list,
5991                                     x_return_status => x_return_status,
5992                                     x_msg_count     => x_msg_count,
5993                                     x_msg_data      => x_msg_data,
5994                                     p_formula_name  => G_FORMULA_CAP,
5995                                     p_contract_id   => p_orig_chr_id,
5996                                     p_line_id       => l_orig_asset_cle_id,
5997                                     x_value         => l_cap_amount);
5998 
5999        IF (x_return_status = OKL_API.G_RET_STS_UNEXP_ERROR) THEN
6000            RAISE OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
6001        ELSIF (x_return_status = OKL_API.G_RET_STS_ERROR) THEN
6002            RAISE OKL_API.G_EXCEPTION_ERROR;
6003        END IF;
6004 
6005        ----------------------------------------------------------------------
6006        --call api to update costs on asset line
6007        ----------------------------------------------------------------------
6008        l_clev_fin_rec.id                    := l_orig_asset_cle_id;
6009        l_klev_fin_rec.id                    := l_orig_asset_cle_id;
6010        l_klev_fin_rec.capital_amount        := l_cap_amount;
6011 
6012 
6013        okl_contract_pub.update_contract_line
6014                            (p_api_version   => p_api_version,
6015                             p_init_msg_list => p_init_msg_list,
6016                             x_return_status => x_return_status,
6017                             x_msg_count     => x_msg_count,
6018                             x_msg_data      => x_msg_data,
6019                             p_clev_rec      => l_clev_fin_rec,
6020                             p_klev_rec      => l_klev_fin_rec,
6021                             x_clev_rec      => lx_clev_fin_rec,
6022                             x_klev_rec      => lx_klev_fin_rec
6023                             );
6024 
6025        IF (x_return_status = OKL_API.G_RET_STS_UNEXP_ERROR) THEN
6026            RAISE OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
6027        ELSIF (x_return_status = OKL_API.G_RET_STS_ERROR) THEN
6028            RAISE OKL_API.G_EXCEPTION_ERROR;
6029        END IF;
6030        --Bug# 4899328
6031 
6032         --create the party role record
6033         l_cplv_rec.id                   :=  OKL_API.G_MISS_NUM;
6034         l_cplv_rec.dnz_chr_id           :=   p_orig_chr_id;
6035         l_cplv_rec.cle_id               :=   lx_sub_clev_rec.id;
6036         l_cplv_rec.rle_code             :=   'OKL_VENDOR';
6037         l_cplv_rec.jtot_object1_code    :=   'OKX_VENDOR';
6038         l_cplv_rec.object1_id1          :=   l_new_sub_rec.vendor_id;
6039         l_cplv_rec.object1_id2          :=   '#';
6040 
6041 
6042         --Bug# 4558486: Changed call to okl_k_party_roles_pvt api
6043         --              to create records in tables
6044         --              okc_k_party_roles_b and okl_k_party_roles
6045         /*
6046         okl_okc_migration_pvt.create_k_party_role
6047                     (p_api_version   => p_api_version,
6048                      p_init_msg_list => p_init_msg_list,
6049                      x_return_status => x_return_status,
6050                      x_msg_count     => x_msg_count,
6051                      x_msg_data      => x_msg_data,
6052                      p_cplv_rec      => l_cplv_rec,
6053                      x_cplv_rec      => lx_cplv_rec);
6054         */
6055 
6056         okl_k_party_roles_pvt.create_k_party_role
6057                     (p_api_version   => p_api_version,
6058                      p_init_msg_list => p_init_msg_list,
6059                      x_return_status => x_return_status,
6060                      x_msg_count     => x_msg_count,
6061                      x_msg_data      => x_msg_data,
6062                      p_cplv_rec      => l_cplv_rec,
6063                      x_cplv_rec      => lx_cplv_rec,
6064                      p_kplv_rec      => l_kplv_rec,
6065                      x_kplv_rec      => lx_kplv_rec);
6066 
6067         IF (x_return_status = OKL_API.G_RET_STS_UNEXP_ERROR) THEN
6068             RAISE OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
6069         ELSIF (x_return_status = OKL_API.G_RET_STS_ERROR) THEN
6070             RAISE OKL_API.G_EXCEPTION_ERROR;
6071         END IF;
6072 
6073         --3. Fetch party payment details for the new line
6074         Open  l_ppyd_rbk_csr(p_cpl_id => l_new_sub_rec.cpl_id);
6075         Fetch  l_ppyd_rbk_csr into l_ppyd_rbk_rec;
6076         If l_ppyd_rbk_csr%NOTFOUND then
6077             null;
6078         Else
6079             --1.create the party payment details record
6080             l_pydv_rec.id                    := OKL_API.G_MISS_NUM;
6081             l_pydv_rec.cpl_id                := lx_cplv_rec.id;
6082             l_pydv_rec.vendor_id             := l_ppyd_rbk_rec.vendor_id;
6083             l_pydv_rec.pay_site_id           := l_ppyd_rbk_rec.pay_site_id;
6084             l_pydv_rec.payment_term_id       := l_ppyd_rbk_rec.payment_term_id;
6085             l_pydv_rec.payment_method_code   := l_ppyd_rbk_rec.payment_method_code;
6086             l_pydv_rec.pay_group_code        := l_ppyd_rbk_rec.pay_group_code;
6087 
6088             OKL_PYD_PVT.insert_row
6089                 (p_api_version   => p_api_version,
6090                  p_init_msg_list => p_init_msg_list,
6091                  x_return_status => x_return_status,
6092                  x_msg_count     => x_msg_count,
6093                  x_msg_data      => x_msg_data,
6094                  p_ppydv_rec     => l_pydv_rec,
6095                  x_ppydv_rec     => lx_pydv_rec);
6096 
6097 
6098              IF (x_return_status = OKL_API.G_RET_STS_UNEXP_ERROR) THEN
6099                  RAISE OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
6100              ELSIF (x_return_status = OKL_API.G_RET_STS_ERROR) THEN
6101                  RAISE OKL_API.G_EXCEPTION_ERROR;
6102              END IF;
6103         End If;
6104         Close l_ppyd_rbk_csr;
6105 
6106 	-- varangan - Bug#5474059  - Added - Start
6107       l_new_cnt := l_new_cnt + 1;
6108       -- Code to create billing transaction records for the newly added subsidies
6109       get_subsidy_amount(
6110                     p_api_version       => p_api_version
6111                   , p_init_msg_list     => p_init_msg_list
6112                   , x_return_status     => x_return_status
6113                   , x_msg_count         => x_msg_count
6114                   , x_msg_data          => x_msg_data
6115                   , p_subsidy_cle_id    => lx_sub_clev_rec.id
6116                   , x_asbv_rec          => l_new_asdv_tbl(l_new_cnt));
6117       IF (x_return_status = OKL_API.G_RET_STS_UNEXP_ERROR) THEN
6118         RAISE OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
6119       ELSIF (x_return_status = OKL_API.G_RET_STS_ERROR) THEN
6120         RAISE OKL_API.G_EXCEPTION_ERROR;
6121       END IF;
6122       -- varangan - Bug#5474059  - Added - End
6123     End Loop;
6124     Close l_new_sub_csr;
6125 
6126      -- varangan - Bug#5474059 - Added - Start
6127       -- Call to insert billing transaction records for the newly added subsidies
6128       IF ( l_new_asdv_tbl.count > 0)THEN
6129         insert_billing_records(
6130             p_api_version   => p_api_version
6131           , p_init_msg_list => p_init_msg_list
6132           , x_return_status => x_return_status
6133           , x_msg_count     => x_msg_count
6134           , x_msg_data      => x_msg_data
6135           , p_chr_id        => p_orig_chr_id
6136           , p_asdv_tbl      => l_new_asdv_tbl);
6137         IF (x_return_status = OKL_API.G_RET_STS_UNEXP_ERROR) THEN
6138           RAISE OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
6139         ELSIF (x_return_status = OKL_API.G_RET_STS_ERROR) THEN
6140           RAISE OKL_API.G_EXCEPTION_ERROR;
6141         END IF;
6142       END IF; -- end of check for l_new_asdv_tbl count
6143       -- varangan - Bug#5474059 - Added - End
6144 
6145     OKL_API.END_ACTIVITY (x_msg_count,x_msg_data );
6146 
6147     EXCEPTION
6148     WHEN OKL_API.G_EXCEPTION_ERROR THEN
6149     If l_subelm_rbk_csr%ISOPEN then
6150         close l_subelm_rbk_csr;
6151     End If;
6152     If l_subelm_orig_csr%ISOPEN then
6153         close l_subelm_orig_csr;
6154     End If;
6155     If l_ppyd_rbk_csr%ISOPEN then
6156         close l_ppyd_rbk_csr;
6157     End If;
6158     If l_ppyd_orig_csr%ISOPEN then
6159         close l_ppyd_orig_csr;
6160     End If;
6161     If l_del_sub_csr%ISOPEN then
6162         close l_del_sub_csr;
6163     End If;
6164     If l_new_sub_csr%ISOPEN then
6165         close l_new_sub_csr;
6166     End If;
6167    If l_cleb_csr%ISOPEN then
6168         close l_cleb_csr;
6169     End If;
6170     x_return_status := OKL_API.HANDLE_EXCEPTIONS(
6171                                l_api_name,
6172                                G_PKG_NAME,
6173                                'OKL_API.G_RET_STS_ERROR',
6174                                x_msg_count,
6175                                x_msg_data,
6176                                '_PVT');
6177     WHEN OKL_API.G_EXCEPTION_UNEXPECTED_ERROR THEN
6178     If l_subelm_rbk_csr%ISOPEN then
6179         close l_subelm_rbk_csr;
6180     End If;
6181     If l_subelm_orig_csr%ISOPEN then
6182         close l_subelm_orig_csr;
6183     End If;
6184     If l_ppyd_rbk_csr%ISOPEN then
6185         close l_ppyd_rbk_csr;
6186     End If;
6187     If l_ppyd_orig_csr%ISOPEN then
6188         close l_ppyd_orig_csr;
6189     End If;
6190     If l_del_sub_csr%ISOPEN then
6191         close l_del_sub_csr;
6192     End If;
6193     If l_new_sub_csr%ISOPEN then
6194         close l_new_sub_csr;
6195     End If;
6196     If l_cleb_csr%ISOPEN then
6197         close l_cleb_csr;
6198     End If;
6199     x_return_status :=OKL_API.HANDLE_EXCEPTIONS(
6200                               l_api_name,
6201                               G_PKG_NAME,
6202                               'OKL_API.G_RET_STS_UNEXP_ERROR',
6203                               x_msg_count,
6204                               x_msg_data,
6205                               '_PVT');
6206     WHEN OTHERS THEN
6207     If l_subelm_rbk_csr%ISOPEN then
6208         close l_subelm_rbk_csr;
6209     End If;
6210     If l_subelm_orig_csr%ISOPEN then
6211         close l_subelm_orig_csr;
6212     End If;
6213     If l_ppyd_rbk_csr%ISOPEN then
6214         close l_ppyd_rbk_csr;
6215     End If;
6216     If l_ppyd_orig_csr%ISOPEN then
6217         close l_ppyd_orig_csr;
6218     End If;
6219     If l_del_sub_csr%ISOPEN then
6220         close l_del_sub_csr;
6221     End If;
6222     If l_new_sub_csr%ISOPEN then
6223         close l_new_sub_csr;
6224     End If;
6225     If l_cleb_csr%ISOPEN then
6226         close l_cleb_csr;
6227     End If;
6228     x_return_status :=OKL_API.HANDLE_EXCEPTIONS(
6229                               l_api_name,
6230                               G_PKG_NAME,
6231                               'OTHERS',
6232                               x_msg_count,
6233                               x_msg_data,
6234                               '_PVT');
6235 End Rebook_synchronize;
6236 
6237 -- varangan - Bug#5474059 - Added - End
6238 
6239 -- varangan - Bug#5474059 - Added - Start
6240   -- Start of comments
6241   -- Procedure Name     : rebook_adjustment
6242   -- Description        : Logic in the API is as follows:
6243   --                     - Compare the subsidy lines of the orignal and rebook copy
6244   --                     - If there is a decrease in subsidy, then check if the AR invoice
6245   --                       has a balance and create a credit memo on this invoice for the
6246   --                       invoice balance amount. If there is an excess amount in the subsidy
6247   --                       change still to be adjusted, create an on-account credit memo.
6248   --                     - If there is an increase in subsidy, then bill the excess amount to
6249   --                        the vendor
6250   --                     - API also handles the case of unprocessed billing transactions which
6251   --                       a  re cancelled.
6252   --                     - Deletion of subsidies is also handled
6253   --                     - Addition of subsidies is taken care in rebook_synchronize procedure
6254   -- PARAMETERS  : IN - p_rbk_chr_id   : Rebook Copy Contract id
6255   --               IN - p_orig_chr_id  : Original Contract id
6256   --               IN - p_rebook_date  : Date of rebook
6257   -- Created varangan
6258   -- End of comments
6259   PROCEDURE rebook_adjustment
6260            (p_api_version    IN  NUMBER
6261           , p_init_msg_list  IN  VARCHAR2
6262           , x_return_status  OUT NOCOPY VARCHAR2
6263           , x_msg_count      OUT NOCOPY NUMBER
6264           , x_msg_data       OUT NOCOPY VARCHAR2
6265           , p_rbk_chr_id     IN  NUMBER
6266           , p_orig_chr_id    IN  NUMBER
6267           , p_rebook_date    IN DATE
6268           ) IS
6269     l_return_status        VARCHAR2(1)  default OKL_API.G_RET_STS_SUCCESS;
6270     l_api_name             CONSTANT     varchar2(30) := 'rebook_adjustment';
6271     l_api_version          CONSTANT     NUMBER := 1.0;
6272 
6273     --------------------------------------
6274     -- Cursor Block - Begin
6275     --------------------------------------
6276     -- Cursor to get the subsidy present in rebook copy. ORIG_SYSTEM_ID1 relates
6277     -- to the subsidy on the original contract
6278     CURSOR c_rbk_subs (p_cle_id IN NUMBER
6279                      , p_chr_id IN NUMBER) IS
6280       SELECT CLEB.ID
6281         FROM OKC_K_LINES_B        CLEB,
6282              OKC_STATUSES_B       STSB,
6283              OKC_LINE_STYLES_B    LSEB
6284       WHERE CLEB.ORIG_SYSTEM_ID1 = p_cle_id
6285         AND CLEB.ORIG_SYSTEM_SOURCE_CODE ='OKC_LINE'
6286         AND CLEB.DNZ_CHR_ID = p_chr_id
6287         AND STSB.CODE       = CLEB.STS_CODE
6288         AND STSB.STE_CODE   NOT IN ('CANCELLED')
6289         AND LSEB.ID         =  CLEB.LSE_ID
6290         AND LSEB.LTY_CODE   =  'SUBSIDY';
6291 
6292     -- Cursor to get the unprocessed transactions of the subsidy
6293     CURSOR c_get_bill_stat( p_cle_id IN NUMBER,
6294                             p_chr_id IN NUMBER) IS
6295       SELECT TRX.ID
6296            , TRX.DESCRIPTION
6297         FROM OKL_TRX_AR_INVOICES_V TRX
6298            , OKL_TXL_AR_INV_LNS_B  TIL
6299        WHERE TIL.TAI_ID = TRX.ID
6300          AND TIL.KLE_ID = p_cle_id -- subsidy cle id
6301          AND TRX.KHR_ID = p_chr_id
6302          AND TRX.TRX_STATUS_CODE = G_SUBMIT_STATUS;
6303 
6304     -- Cursor to get all the invoices already generated for this subsidy
6305     -- cursor doesnot consider credit-memos,as the invoice balances are already
6306     -- adjusted for invoice based credit-memos
6307     CURSOR c_get_inv_balance(p_cle_id IN NUMBER,
6308                              p_chr_id IN NUMBER) IS
6309     SELECT ARL.receivables_invoice_id  receivables_invoice_id,
6310          ARL.RECEIVABLES_INVOICE_LINE_ID invoice_line_id,
6311          tai.ibt_id                 cust_acct_site_id,
6312          tai.ixx_id                 cust_acct_id,
6313          tai.irt_id                 payment_term_id,
6314          tai.irm_id                 payment_method_id,
6315          tai.khr_id                 khr_id,
6316          tai.description            tai_description,
6317          tai.currency_code          currency_code,
6318          tai.date_invoiced          date_invoiced,
6319          tai.amount                 tai_amount,
6320          tai.try_id                 try_id,
6321          tai.trx_status_code        trx_status_code,
6322          tai.date_entered           date_entered,
6323          til.id                     til_id_reverses,
6324          til.tai_id                 tai_id,
6325          til.amount                 til_amount,
6326          til.kle_id                 subsidy_cle_id,
6327          til.description            til_description,
6328          til.sty_id                 stream_type_id,
6329          til.line_number            line_number,
6330          til.inv_receiv_line_code   inv_receiv_line_code
6331        , til.bank_acct_id           bank_acct_id
6332        -- varangan - Bug#5588871 - Modified - Start
6333        -- Consider Invoice line balance instead of invoice balance itself
6334        , ARL.AMOUNT_LINE_ITEMS_REMAINING  amount_remaining
6335        -- varangan - Bug#5588871 - Modified - End
6336        , ARL.AMOUNT_DUE_ORIGINAL        invoice_amount
6337       FROM OKL_BPD_AR_INV_LINES_V ARL
6338          , OKL_TXL_AR_INV_LNS_V     TIL
6339          , OKL_TRX_AR_INVOICES_V    TAI
6340       WHERE
6341        TIL.KLE_ID                 = p_cle_id -- < SUBSIDY CLE ID >
6342        AND TAI.ID                     = TIL.TAI_ID
6343        AND TAI.KHR_ID                 = p_chr_id
6344        AND TAI.TRX_STATUS_CODE = 'PROCESSED'
6345        AND TIL.ID = ARL.TIL_ID_DETAILS
6346        AND ARL.AMOUNT_DUE_ORIGINAL > 0 -- donot consider credit memos
6347        AND ARL.AMOUNT_DUE_REMAINING > 0 -- only those invoices that have some balance
6348      ORDER BY ARL.AMOUNT_DUE_REMAINING DESC;
6349 
6350     -- Cursor to get billing details in order to create on-Acc CM
6351     CURSOR c_get_bill_details(p_cle_id IN NUMBER,
6352                              p_chr_id IN NUMBER) IS
6353     SELECT tai.ibt_id               cust_acct_site_id,
6354          tai.ixx_id                 cust_acct_id,
6355          tai.irt_id                 payment_term_id,
6356          tai.irm_id                 payment_method_id,
6357          tai.khr_id                 khr_id,
6358          tai.description            tai_description,
6359          tai.currency_code          currency_code,
6360          tai.date_invoiced          date_invoiced,
6361          tai.amount                 tai_amount,
6362          tai.try_id                 try_id,
6363          tai.trx_status_code        trx_status_code,
6364          tai.date_entered           date_entered,
6365          til.id                     til_id_reverses,
6366          til.tai_id                 tai_id,
6367          til.amount                 til_amount,
6368          til.kle_id                 subsidy_cle_id,
6369          til.description            til_description,
6370          til.sty_id                 stream_type_id,
6371          til.line_number            line_number,
6372          til.inv_receiv_line_code   inv_receiv_line_code
6373        , til.bank_acct_id           bank_acct_id
6374       FROM OKL_TXL_AR_INV_LNS_V     TIL
6375          , OKL_TRX_AR_INVOICES_V    TAI
6376      WHERE TIL.KLE_ID                 = p_cle_id -- < SUBSIDY CLE ID >
6377        AND TAI.ID                     = TIL.TAI_ID
6378        AND TAI.KHR_ID                 = p_chr_id;
6379 
6380     -- Cursor to check if any records have been processed for billing
6381     CURSOR c_chk_billing_done ( p_cle_id IN NUMBER
6382                               , p_chr_id IN NUMBER) IS
6383       SELECT 'Y'
6384         FROM OKL_TRX_AR_INVOICES_B TAI
6385            , OKL_TXL_AR_INV_LNS_B  TXL
6386        WHERE TXL.TAI_ID  = TAI.ID
6387          AND TXL.KLE_ID  = p_cle_id -- subsidy cle id
6388          AND TAI.KHR_ID  = p_chr_id
6389          AND TAI.TRX_STATUS_CODE = G_PROCESSED_STATUS;
6390     --------------------------------------
6391     -- Cursor Block - End
6392     --------------------------------------
6393 
6394     l_pos_try_id    NUMBER;
6395     l_neg_try_id    NUMBER;
6396 
6397     l_orig_asdv_tbl asbv_tbl_type;
6398     l_rbk_asdv_tbl  asbv_tbl_type;
6399 
6400     l_new_asdv_tbl asbv_tbl_type;
6401     l_new_cnt      NUMBER DEFAULT 0;
6402 
6403     l_rbk_subs_cle_id NUMBER;
6404     l_cancel_taiv_tbl OKL_TRX_AR_INVOICES_PUB.taiv_tbl_type;
6405     lx_cancel_taiv_tbl OKL_TRX_AR_INVOICES_PUB.taiv_tbl_type;
6406     l_cancel_cnt NUMBER DEFAULT 0;
6407 
6408     l_subs_adj NUMBER;
6409     l_bill_chk VARCHAR2(1) DEFAULT 'N';
6410     -- varangan - Billing Enhancement changes- Bug#5874824 - begin
6411     /*l_taiv_rec      okl_trx_ar_invoices_pub.taiv_rec_type;
6412     lx_taiv_rec      okl_trx_ar_invoices_pub.taiv_rec_type;
6413     l_tilv_rec      okl_txl_ar_inv_lns_pub.tilv_rec_type;
6414     lx_tilv_rec      okl_txl_ar_inv_lns_pub.tilv_rec_type;
6415     l_bpd_acc_rec   okl_acc_call_pub.bpd_acc_rec_type; */
6416 
6417     lp_taiv_rec        okl_tai_pvt.taiv_rec_type;
6418     lp_tilv_rec	       okl_til_pvt.tilv_rec_type;
6419     lp_tilv_tbl        okl_til_pvt.tilv_tbl_type;
6420     lp_tldv_tbl        okl_tld_pvt.tldv_tbl_type;
6421 
6422     lx_taiv_rec        okl_tai_pvt.taiv_rec_type;
6423     lx_tilv_tbl        okl_til_pvt.tilv_tbl_type;
6424     lx_tldv_tbl        okl_tld_pvt.tldv_tbl_type;
6425 
6426 --Varangan - Billing Enhancement changes - Bug#5874824  - End
6427 
6428     l_asbv_rec asbv_rec_type;
6429 
6430     l_bill_details_rec c_get_bill_details%ROWTYPE;
6431 
6432     -------------------------------------------------------
6433     -- Local Procedure Block
6434     -------------------------------------------------------
6435         PROCEDURE on_acc_CM_create( p_subsidy_cle_id IN NUMBER
6436                               , p_chr_id         IN NUMBER
6437                               , p_subs_adj       IN NUMBER
6438                               , p_rebook_date    IN DATE ) IS
6439     BEGIN
6440        OPEN c_get_bill_details(p_subsidy_cle_id
6441                               ,p_chr_id );
6442                 FETCH c_get_bill_details INTO l_bill_details_rec;
6443              CLOSE c_get_bill_details;
6444 
6445              lp_taiv_rec.amount           := p_subs_adj;
6446              lp_taiv_rec.khr_id           := l_bill_details_rec.khr_id;
6447              lp_taiv_rec.description      := 'Rebook Credit On-Acc- '||l_bill_details_rec.tai_description;
6448              lp_taiv_rec.currency_code    := l_bill_details_rec.currency_code;
6449              lp_taiv_rec.date_invoiced    := p_rebook_date; --check whether it is ok to give this
6450              lp_taiv_rec.ibt_id           := l_bill_details_rec.cust_acct_site_id;
6451              lp_taiv_rec.ixx_id           := l_bill_details_rec.cust_acct_id;
6452              lp_taiv_rec.irt_id           := l_bill_details_rec.payment_term_id;
6453              lp_taiv_rec.irm_id           := l_bill_details_rec.payment_method_id;
6454              lp_taiv_rec.try_id           := l_neg_try_id;
6455              lp_taiv_rec.trx_status_code  := G_SUBMIT_STATUS;
6456              lp_taiv_rec.date_entered     := SYSDATE;
6457              lp_taiv_rec.OKL_SOURCE_BILLING_TRX := G_SOURCE_BILLING_TRX_RBK;
6458 
6459 	    -- Line  Record
6460 	       lp_tilv_rec.amount               := p_subs_adj;
6461                lp_tilv_rec.kle_id               := l_bill_details_rec.subsidy_cle_id;
6462                lp_tilv_rec.description          := l_bill_details_rec.til_description;
6463                lp_tilv_rec.sty_id               := l_bill_details_rec.stream_type_id;
6464                lp_tilv_rec.line_number          := l_bill_details_rec.line_number;
6465                lp_tilv_rec.inv_receiv_line_code := G_AR_INV_LINE_CODE;
6466                lp_tilv_rec.bank_acct_id := l_bill_details_rec.bank_acct_id;
6467                -- ON-ACCOUNT Credit Memo
6468                lp_tilv_rec.TIL_ID_REVERSES := NULL;
6469               -- Assign the line record in tilv_tbl structure
6470 	       lp_tilv_tbl(1) := lp_tilv_rec;
6471             ---------------------------------------------------------------------------
6472 	    -- Call to Billing Centralized API
6473 	    ---------------------------------------------------------------------------
6474 		okl_internal_billing_pvt.create_billing_trx(p_api_version =>l_api_version,
6475 							    p_init_msg_list =>p_init_msg_list,
6476 							    x_return_status =>  x_return_status,
6477 							    x_msg_count => x_msg_count,
6478 							    x_msg_data => x_msg_data,
6479 							    p_taiv_rec => lp_taiv_rec,
6480 							    p_tilv_tbl => lp_tilv_tbl,
6481 							    p_tldv_tbl => lp_tldv_tbl,
6482 							    x_taiv_rec => lx_taiv_rec,
6483 							    x_tilv_tbl => lx_tilv_tbl,
6484 							    x_tldv_tbl => lx_tldv_tbl);
6485 
6486 	       IF (x_return_status = OKL_API.G_RET_STS_UNEXP_ERROR) THEN
6487                 RAISE OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
6488                ELSIF (x_return_status = OKL_API.G_RET_STS_ERROR) THEN
6489                 RAISE OKL_API.G_EXCEPTION_ERROR;
6490                END IF;
6491              -- Varangan - Billing Enhancement changes - Bug#5874824 - End
6492 
6493               /* --create internal AR transaction header
6494                OKL_TRX_AR_INVOICES_PUB.insert_trx_ar_invoices (
6495                             p_api_version       => p_api_version,
6496                             p_init_msg_list     => p_init_msg_list,
6497                             x_return_status     => x_return_status,
6498                             x_msg_count         => x_msg_count,
6499                             x_msg_data          => x_msg_data,
6500                             p_taiv_rec          => l_taiv_rec,
6501                             x_taiv_rec          => lx_taiv_rec);
6502 
6503                IF (x_return_status = OKL_API.G_RET_STS_UNEXP_ERROR) THEN
6504                  RAISE OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
6505                ELSIF (x_return_status = OKL_API.G_RET_STS_ERROR) THEN
6506                  RAISE OKL_API.G_EXCEPTION_ERROR;
6507                END IF;
6508 
6509               --l_tilv_rec.tai_id := lx_taiv_rec.id;
6510 
6511                --create internal AR transaction line
6512                okl_txl_ar_inv_lns_pub.insert_txl_ar_inv_lns  (
6513                                    p_api_version       => p_api_version,
6514                                    p_init_msg_list     => p_init_msg_list,
6515                                    x_return_status     => x_return_status,
6516                                    x_msg_count         => x_msg_count,
6517                                    x_msg_data          => x_msg_data,
6518                                    p_tilv_rec          => l_tilv_rec,
6519                                    x_tilv_rec          => lx_tilv_rec);
6520 
6521                IF (x_return_status = OKL_API.G_RET_STS_UNEXP_ERROR) THEN
6522                    RAISE OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
6523                ELSIF (x_return_status = OKL_API.G_RET_STS_ERROR) THEN
6524                    RAISE OKL_API.G_EXCEPTION_ERROR;
6525                END IF;
6526 
6527                --accounting trx
6528                l_bpd_acc_rec.id                := lx_tilv_rec.id;
6529                l_bpd_acc_rec.source_table      := G_AR_LINES_SOURCE;
6530                -- Create Accounting Distribution
6531                okl_acc_call_pub.create_acc_trans (
6532                             p_api_version       => p_api_version,
6533                             p_init_msg_list     => p_init_msg_list,
6534                             x_return_status     => x_return_status,
6535                             x_msg_count         => x_msg_count,
6536                             x_msg_data          => x_msg_data,
6537                             p_bpd_acc_rec       => l_bpd_acc_rec);
6538 
6539                IF (x_return_status = OKL_API.G_RET_STS_UNEXP_ERROR) THEN
6540                  RAISE OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
6541                ELSIF (x_return_status = OKL_API.G_RET_STS_ERROR) THEN
6542                  RAISE OKL_API.G_EXCEPTION_ERROR;
6543                END IF;  */
6544 
6545       END on_acc_CM_create;
6546 
6547   BEGIN
6548 
6549     x_return_status := OKL_API.G_RET_STS_SUCCESS;
6550     -- Call start_activity to create savepoint, check compatibility
6551     -- and initialize message list
6552     x_return_status := OKL_API.START_ACTIVITY (
6553                                l_api_name
6554                                ,p_init_msg_list
6555                                ,'_PVT'
6556                                ,x_return_status);
6557     -- Check if activity started successfully
6558     IF (x_return_status = OKL_API.G_RET_STS_UNEXP_ERROR) THEN
6559        RAISE OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
6560     ELSIF (x_return_status = OKL_API.G_RET_STS_ERROR) THEN
6561        RAISE OKL_API.G_EXCEPTION_ERROR;
6562     END IF;
6563 
6564     --function to fetch try_id
6565     l_pos_try_id := Get_trx_type_id(p_trx_type => G_AR_INV_TRX_TYPE,
6566                                     p_lang     => 'US');
6567     If l_pos_try_id is null then
6568         x_return_status := OKL_API.G_RET_STS_ERROR;
6569         OKL_API.SET_MESSAGE (
6570                              p_app_name          => G_APP_NAME,
6571                              p_msg_name          => G_REQUIRED_VALUE,
6572                              p_token1            => G_COL_NAME_TOKEN,
6573                              p_token1_value      => 'Transaction Type');
6574         RAISE OKL_API.G_EXCEPTION_ERROR;
6575     End If;
6576 
6577     l_neg_try_id := Get_trx_type_id(p_trx_type => G_AR_CM_TRX_TYPE,
6578                                     p_lang     => 'US');
6579     If l_neg_try_id is null then
6580         x_return_status := OKL_API.G_RET_STS_ERROR;
6581         OKL_API.SET_MESSAGE (
6582                              p_app_name          => G_APP_NAME,
6583                              p_msg_name          => G_REQUIRED_VALUE,
6584                              p_token1            => G_COL_NAME_TOKEN,
6585                              p_token1_value      => 'Transaction Type');
6586         RAISE OKL_API.G_EXCEPTION_ERROR;
6587     End If;
6588 
6589     -- STEP 1 : Get the subsidy table of the original contract
6590     get_contract_subsidy_amount(
6591                     p_api_version       => p_api_version
6592                   , p_init_msg_list     => p_init_msg_list
6593                   , x_return_status     => x_return_status
6594                   , x_msg_count         => x_msg_count
6595                   , x_msg_data          => x_msg_data
6596                   , p_chr_id            => p_orig_chr_id
6597                   , x_asbv_tbl          => l_orig_asdv_tbl);
6598 
6599     -- check if the l_orig_asdv_tbl is not empty
6600     IF l_orig_asdv_tbl.count > 0 THEN
6601       FOR i IN l_orig_asdv_tbl.FIRST .. l_orig_asdv_tbl.LAST
6602       LOOP
6603          l_subs_adj := 0;
6604          -- STEP 2 : Query for the original subsidy line in rebook copy
6605          OPEN  c_rbk_subs(l_orig_asdv_tbl(i).subsidy_cle_id, p_rbk_chr_id);
6606            FETCH c_rbk_subs INTO l_rbk_subs_cle_id;
6607 
6608            -- STEP 3 : IF the original subsidy line doesnot exist - Subsidy DELETED
6609            IF c_rbk_subs%NOTFOUND THEN
6610              -- STEP 3 (a) : IF the subsidy billing transaction is still Unprocessed
6611              --              Cancel transaction
6612              FOR c_get_bill_stat_rec IN c_get_bill_stat(l_orig_asdv_tbl(i).subsidy_cle_id
6613                                                       , p_orig_chr_id)
6614              LOOP
6615                l_cancel_cnt := l_cancel_cnt + 1;
6616                l_cancel_taiv_tbl(l_cancel_cnt).ID := c_get_bill_stat_rec.ID;
6617                l_cancel_taiv_tbl(l_cancel_cnt).DESCRIPTION := c_get_bill_stat_rec.DESCRIPTION;
6618                l_cancel_taiv_tbl(l_cancel_cnt).TRX_STATUS_CODE := G_CANCEL_STATUS;
6619                -- sjalasut, added okl_source_billing_trx as 'REBOOK' as rebook process initiates
6620                -- cancelation
6621                l_cancel_taiv_tbl(l_cancel_cnt).OKL_SOURCE_BILLING_TRX := G_SOURCE_BILLING_TRX_RBK;
6622              END LOOP;
6623 
6624              -- STEP 3 (b) : IF the subsidy billing transaction had been processed
6625 
6626               -- need to reverse the entire amount of the deleted subsidy
6627               l_subs_adj := - l_orig_asdv_tbl(i).amount;
6628 
6629               -- IF Balance exists on the subsidy invoices, then create credit-memos
6630               -- on the balances
6631               FOR c_get_inv_balance_rec IN c_get_inv_balance(l_orig_asdv_tbl(i).subsidy_cle_id
6632                                                            , p_orig_chr_id)
6633               LOOP
6634 
6635                 IF c_get_inv_balance_rec.amount_remaining > 0 THEN
6636         -- Varangan - Billing Enhancement changes - Bug#5874824 - Begin
6637                   -- reverse whatever amount is remaining on the invoice of deleted subsidy
6638                   lp_taiv_rec.amount   := (-1) * c_get_inv_balance_rec.amount_remaining;
6639                   -- Accordingly change the l_subs_adj so as to track if On-Acc CM needs to be generated
6640                   l_subs_adj := l_subs_adj + c_get_inv_balance_rec.amount_remaining;
6641 
6642                   lp_taiv_rec.khr_id   := c_get_inv_balance_rec.khr_id;
6643                   lp_taiv_rec.description      := 'Rebook Credit - '||c_get_inv_balance_rec.tai_description;
6644                   lp_taiv_rec.currency_code    := c_get_inv_balance_rec.currency_code;
6645                   lp_taiv_rec.date_invoiced    := p_rebook_date; --check whether it is ok to give this
6646                   lp_taiv_rec.ibt_id           := c_get_inv_balance_rec.cust_acct_site_id;
6647                   lp_taiv_rec.ixx_id           := c_get_inv_balance_rec.cust_acct_id;
6648                   lp_taiv_rec.irt_id           := c_get_inv_balance_rec.payment_term_id;
6649                   lp_taiv_rec.irm_id           := c_get_inv_balance_rec.payment_method_id;
6650                   lp_taiv_rec.try_id           := l_neg_try_id;
6651                   lp_taiv_rec.trx_status_code  := G_SUBMIT_STATUS;
6652                   lp_taiv_rec.date_entered     := SYSDATE;
6653                   lp_taiv_rec.OKL_SOURCE_BILLING_TRX := G_SOURCE_BILLING_TRX_RBK;
6654 		  --tilv_record
6655                    --l_tilv_rec.tai_id               := lx_taiv_rec.id;
6656                   lp_tilv_rec.amount               := (-1) * c_get_inv_balance_rec.amount_remaining;
6657                   lp_tilv_rec.kle_id               := c_get_inv_balance_rec.subsidy_cle_id;
6658                   lp_tilv_rec.description          := 'Rebook Credit - '||c_get_inv_balance_rec.til_description;
6659                   lp_tilv_rec.sty_id               := c_get_inv_balance_rec.stream_type_id;
6660                   lp_tilv_rec.line_number          := c_get_inv_balance_rec.line_number;
6661                   lp_tilv_rec.inv_receiv_line_code := G_AR_INV_LINE_CODE;
6662                   lp_tilv_rec.til_id_reverses      := c_get_inv_balance_rec.til_id_reverses;
6663                   lp_tilv_rec.bank_acct_id      := c_get_inv_balance_rec.bank_acct_id;
6664 
6665 	          lp_tilv_tbl(1) := lp_tilv_rec; -- Assign the line record in tilv_tbl structure
6666 
6667 		  ---------------------------------------------------------------------------
6668 	          -- Call to Billing Centralized API
6669 	          ---------------------------------------------------------------------------
6670 		okl_internal_billing_pvt.create_billing_trx(p_api_version =>l_api_version,
6671 							    p_init_msg_list =>p_init_msg_list,
6672 							    x_return_status =>  x_return_status,
6673 							    x_msg_count => x_msg_count,
6674 							    x_msg_data => x_msg_data,
6675 							    p_taiv_rec => lp_taiv_rec,
6676 							    p_tilv_tbl => lp_tilv_tbl,
6677 							    p_tldv_tbl => lp_tldv_tbl,
6678 							    x_taiv_rec => lx_taiv_rec,
6679 							    x_tilv_tbl => lx_tilv_tbl,
6680 							    x_tldv_tbl => lx_tldv_tbl);
6681 
6682 	       IF (x_return_status = OKL_API.G_RET_STS_UNEXP_ERROR) THEN
6683                 RAISE OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
6684                ELSIF (x_return_status = OKL_API.G_RET_STS_ERROR) THEN
6685                 RAISE OKL_API.G_EXCEPTION_ERROR;
6686                END IF;
6687 
6688                -- Varangan - Billing Enhancement changes - Bug#5874824 - End
6689 
6690                  /* Commented the existing Billing call
6691 		 --create internal AR transaction header
6692                   OKL_TRX_AR_INVOICES_PUB.insert_trx_ar_invoices (
6693                                p_api_version       => p_api_version,
6694                                p_init_msg_list     => p_init_msg_list,
6695                                x_return_status     => x_return_status,
6696                                x_msg_count         => x_msg_count,
6697                                x_msg_data          => x_msg_data,
6698                                p_taiv_rec          => l_taiv_rec,
6699                                x_taiv_rec          => lx_taiv_rec);
6700 
6701                   IF (x_return_status = OKL_API.G_RET_STS_UNEXP_ERROR) THEN
6702                     RAISE OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
6703                   ELSIF (x_return_status = OKL_API.G_RET_STS_ERROR) THEN
6704                     RAISE OKL_API.G_EXCEPTION_ERROR;
6705                   END IF;
6706 
6707                   --tilv_record
6708                   l_tilv_rec.tai_id               := lx_taiv_rec.id;
6709                   l_tilv_rec.amount               := (-1) * c_get_inv_balance_rec.amount_remaining;
6710                   l_tilv_rec.kle_id               := c_get_inv_balance_rec.subsidy_cle_id;
6711                   l_tilv_rec.description          := 'Rebook Credit - '||c_get_inv_balance_rec.til_description;
6712                   l_tilv_rec.sty_id               := c_get_inv_balance_rec.stream_type_id;
6713                   l_tilv_rec.line_number          := c_get_inv_balance_rec.line_number;
6714                   l_tilv_rec.inv_receiv_line_code := G_AR_INV_LINE_CODE;
6715                   l_tilv_rec.til_id_reverses      := c_get_inv_balance_rec.til_id_reverses;
6716                   l_tilv_rec.bank_acct_id      := c_get_inv_balance_rec.bank_acct_id;
6717 
6718                   --create internal AR transaction line
6719                   okl_txl_ar_inv_lns_pub.insert_txl_ar_inv_lns  (
6720                                       p_api_version       => p_api_version,
6721                                       p_init_msg_list     => p_init_msg_list,
6722                                       x_return_status     => x_return_status,
6723                                       x_msg_count         => x_msg_count,
6724                                       x_msg_data          => x_msg_data,
6725                                       p_tilv_rec          => l_tilv_rec,
6726                                       x_tilv_rec          => lx_tilv_rec);
6727 
6728                   IF (x_return_status = OKL_API.G_RET_STS_UNEXP_ERROR) THEN
6729                       RAISE OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
6730                   ELSIF (x_return_status = OKL_API.G_RET_STS_ERROR) THEN
6731                       RAISE OKL_API.G_EXCEPTION_ERROR;
6732                   END IF;
6733 
6734                   --accounting trx
6735                   l_bpd_acc_rec.id                := lx_tilv_rec.id;
6736                   l_bpd_acc_rec.source_table      := G_AR_LINES_SOURCE;
6737                   -- Create Accounting Distribution
6738                   okl_acc_call_pub.create_acc_trans (
6739                                p_api_version       => p_api_version,
6740                                p_init_msg_list     => p_init_msg_list,
6741                                x_return_status     => x_return_status,
6742                                x_msg_count         => x_msg_count,
6743                                x_msg_data          => x_msg_data,
6744                                p_bpd_acc_rec       => l_bpd_acc_rec);
6745 
6746                   IF (x_return_status = OKL_API.G_RET_STS_UNEXP_ERROR) THEN
6747                     RAISE OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
6748                   ELSIF (x_return_status = OKL_API.G_RET_STS_ERROR) THEN
6749                     RAISE OKL_API.G_EXCEPTION_ERROR;
6750                   END IF;     */   --Commented End
6751 
6752                 END IF;  -- end of check for amount_remaining > 0
6753               END LOOP;  -- end of check for invoice balances
6754 
6755               -- If there is still amount remaining, create on-account credit-memo
6756               IF l_subs_adj < 0 THEN
6757                 -- Call API to create On-ACC CM
6758                 on_acc_CM_create( p_subsidy_cle_id  =>l_orig_asdv_tbl(i).subsidy_cle_id
6759                                  , p_chr_id         => p_orig_chr_id
6760                                  , p_subs_adj       => l_subs_adj
6761                                  , p_rebook_date    => p_rebook_date);
6762               END IF; -- end of check for on_acc credit memo creation
6763 
6764            -- STEP 4 : ELSE IF the original subsidy line exists
6765            ELSE --else for c_rbk_subs%NOTFOUND
6766 
6767              -- Get the subsidy amount for the rebook copy
6768              get_subsidy_amount(
6769                        p_api_version       => p_api_version
6770                      , p_init_msg_list     => p_init_msg_list
6771                      , x_return_status     => x_return_status
6772                      , x_msg_count         => x_msg_count
6773                      , x_msg_data          => x_msg_data
6774                      , p_subsidy_cle_id    => l_rbk_subs_cle_id -- rebook subsidy cle id
6775                      , x_asbv_rec          => l_asbv_rec);
6776 
6777             l_subs_adj :=  l_asbv_rec.amount          -- Subsidy in rebook copy
6778                             - l_orig_asdv_tbl(i).amount; -- Subsidy in Original KHR
6779              -- STEP 4 (a) : IF there is decrease in subsidy
6780              IF (l_subs_adj < 0) THEN
6781 
6782              -- If subsidy billing transaction is still Unprocessed
6783              -- Cancel transaction
6784              FOR c_get_bill_stat_rec IN c_get_bill_stat(l_orig_asdv_tbl(i).subsidy_cle_id
6785                                                       , p_orig_chr_id)
6786              LOOP
6787                l_cancel_cnt := l_cancel_cnt + 1;
6788                l_cancel_taiv_tbl(l_cancel_cnt).ID := c_get_bill_stat_rec.ID;
6789                l_cancel_taiv_tbl(l_cancel_cnt).DESCRIPTION := c_get_bill_stat_rec.DESCRIPTION;
6790                l_cancel_taiv_tbl(l_cancel_cnt).TRX_STATUS_CODE := G_CANCEL_STATUS;
6791                -- sjalasut, added okl_source_billing_trx as 'REBOOK' as rebook process initiates
6792                -- cancelation
6793                l_cancel_taiv_tbl(l_cancel_cnt).OKL_SOURCE_BILLING_TRX := G_SOURCE_BILLING_TRX_RBK;
6794              END LOOP;
6795 
6796              -- If there has been no billing run till now, then on cancellation
6797              -- create a new record for the new subsidy amount
6798              OPEN c_chk_billing_done(l_orig_asdv_tbl(i).subsidy_cle_id
6799                                                       , p_orig_chr_id);
6800                FETCH c_chk_billing_done INTO l_bill_chk;
6801              CLOSE c_chk_billing_done;
6802                IF l_bill_chk <> 'Y' THEN
6803                  l_subs_adj := 0;
6804                  l_new_cnt := l_new_cnt + 1;
6805                  l_new_asdv_tbl(l_new_cnt) := l_orig_asdv_tbl(i);
6806                  l_new_asdv_tbl(l_new_cnt).amount := l_asbv_rec.amount; -- bill subsidy with new amount
6807                END IF;
6808 
6809              -- ELSE IF Balance exists on the subsidy invoices, then create credit-memos
6810              -- on the balances
6811               FOR c_get_inv_balance_rec IN c_get_inv_balance(l_orig_asdv_tbl(i).subsidy_cle_id
6812                                                            , p_orig_chr_id)
6813               LOOP
6814 	      -- Varangan - Billing Enhancement changes - Bug#5874824 - Begin
6815 
6816                 IF c_get_inv_balance_rec.amount_remaining > 0 AND l_subs_adj <> 0 THEN
6817                   IF ( c_get_inv_balance_rec.amount_remaining + l_subs_adj ) >= 0 THEN
6818                     lp_taiv_rec.amount   := l_subs_adj; -- l_subs_adj is already negative
6819                     l_subs_adj := 0;
6820                   ELSE
6821                     lp_taiv_rec.amount   := (-1) * c_get_inv_balance_rec.amount_remaining;
6822                     l_subs_adj := l_subs_adj + c_get_inv_balance_rec.amount_remaining;
6823                   END IF;
6824                   lp_taiv_rec.khr_id   := c_get_inv_balance_rec.khr_id;
6825                   lp_taiv_rec.description      := 'Rebook Credit - '||c_get_inv_balance_rec.tai_description;
6826                   lp_taiv_rec.currency_code    := c_get_inv_balance_rec.currency_code;
6827                   lp_taiv_rec.date_invoiced    := p_rebook_date; --check whether it is ok to give this
6828                   lp_taiv_rec.ibt_id           := c_get_inv_balance_rec.cust_acct_site_id;
6829                   lp_taiv_rec.ixx_id           := c_get_inv_balance_rec.cust_acct_id;
6830                   lp_taiv_rec.irt_id           := c_get_inv_balance_rec.payment_term_id;
6831                   lp_taiv_rec.irm_id           := c_get_inv_balance_rec.payment_method_id;
6832                   lp_taiv_rec.try_id           := l_neg_try_id;
6833                   lp_taiv_rec.trx_status_code  := G_SUBMIT_STATUS;
6834                   lp_taiv_rec.date_entered     := SYSDATE;
6835                   lp_taiv_rec.OKL_SOURCE_BILLING_TRX := G_SOURCE_BILLING_TRX_RBK;
6836 
6837                 		 --lp_tilv record
6838                    -- l_tilv_rec.tai_id               := lx_taiv_rec.id;
6839                   -- varangan - Bug#5588871 - Modified - Start
6840                   -- THE TIL record amount should be the same as the TRX record amount
6841                   lp_tilv_rec.amount               := lp_taiv_rec.amount;
6842                   -- varangan - Bug#5588871 - Modified - End
6843                   lp_tilv_rec.kle_id               := c_get_inv_balance_rec.subsidy_cle_id;
6844                   lp_tilv_rec.description          := 'Rebook Credit - '||c_get_inv_balance_rec.til_description;
6845                   lp_tilv_rec.sty_id               := c_get_inv_balance_rec.stream_type_id;
6846                   lp_tilv_rec.line_number          := c_get_inv_balance_rec.line_number;
6847                   lp_tilv_rec.inv_receiv_line_code := G_AR_INV_LINE_CODE;
6848                   lp_tilv_rec.til_id_reverses      := c_get_inv_balance_rec.til_id_reverses;
6849                   lp_tilv_rec.bank_acct_id      := c_get_inv_balance_rec.bank_acct_id;
6850 
6851 		  lp_tilv_tbl(1) := lp_tilv_rec; -- Assign the line record in tilv_tbl structure
6852 
6853             ---------------------------------------------------------------------------
6854 	    -- Call to Billing Centralized API
6855 	    ---------------------------------------------------------------------------
6856 		okl_internal_billing_pvt.create_billing_trx(p_api_version =>l_api_version,
6857 							    p_init_msg_list =>p_init_msg_list,
6858 							    x_return_status =>  x_return_status,
6859 							    x_msg_count => x_msg_count,
6860 							    x_msg_data => x_msg_data,
6861 							    p_taiv_rec => lp_taiv_rec,
6862 							    p_tilv_tbl => lp_tilv_tbl,
6863 							    p_tldv_tbl => lp_tldv_tbl,
6864 							    x_taiv_rec => lx_taiv_rec,
6865 							    x_tilv_tbl => lx_tilv_tbl,
6866 							    x_tldv_tbl => lx_tldv_tbl);
6867 
6868 	       IF (x_return_status = OKL_API.G_RET_STS_UNEXP_ERROR) THEN
6869                 RAISE OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
6870                ELSIF (x_return_status = OKL_API.G_RET_STS_ERROR) THEN
6871                 RAISE OKL_API.G_EXCEPTION_ERROR;
6872                END IF;
6873              -- Varangan - Billing Enhancement changes - Bug#5874824 - End
6874 
6875                  /* Commented the existing billing API call
6876 		  --create internal AR transaction header
6877                   OKL_TRX_AR_INVOICES_PUB.insert_trx_ar_invoices (
6878                                p_api_version       => p_api_version,
6879                                p_init_msg_list     => p_init_msg_list,
6880                                x_return_status     => x_return_status,
6881                                x_msg_count         => x_msg_count,
6882                                x_msg_data          => x_msg_data,
6883                                p_taiv_rec          => l_taiv_rec,
6884                                x_taiv_rec          => lx_taiv_rec);
6885 
6886                   IF (x_return_status = OKL_API.G_RET_STS_UNEXP_ERROR) THEN
6887                     RAISE OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
6888                   ELSIF (x_return_status = OKL_API.G_RET_STS_ERROR) THEN
6889                     RAISE OKL_API.G_EXCEPTION_ERROR;
6890                   END IF;
6891 
6892                   --tilv_record
6893                   l_tilv_rec.tai_id               := lx_taiv_rec.id;
6894                   -- varangan - Bug#5588871 - Modified - Start
6895                   -- THE TIL record amount should be the same as the TRX record amount
6896                   l_tilv_rec.amount               := l_taiv_rec.amount;
6897                   -- varangan - Bug#5588871 - Modified - End
6898                   l_tilv_rec.kle_id               := c_get_inv_balance_rec.subsidy_cle_id;
6899                   l_tilv_rec.description          := 'Rebook Credit - '||c_get_inv_balance_rec.til_description;
6900                   l_tilv_rec.sty_id               := c_get_inv_balance_rec.stream_type_id;
6901                   l_tilv_rec.line_number          := c_get_inv_balance_rec.line_number;
6902                   l_tilv_rec.inv_receiv_line_code := G_AR_INV_LINE_CODE;
6903                   l_tilv_rec.til_id_reverses      := c_get_inv_balance_rec.til_id_reverses;
6904                   l_tilv_rec.bank_acct_id      := c_get_inv_balance_rec.bank_acct_id;
6905 
6906                   --create internal AR transaction line
6907                   okl_txl_ar_inv_lns_pub.insert_txl_ar_inv_lns  (
6908                                       p_api_version       => p_api_version,
6909                                       p_init_msg_list     => p_init_msg_list,
6910                                       x_return_status     => x_return_status,
6911                                       x_msg_count         => x_msg_count,
6912                                       x_msg_data          => x_msg_data,
6913                                       p_tilv_rec          => l_tilv_rec,
6914                                       x_tilv_rec          => lx_tilv_rec);
6915 
6916                   IF (x_return_status = OKL_API.G_RET_STS_UNEXP_ERROR) THEN
6917                       RAISE OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
6918                   ELSIF (x_return_status = OKL_API.G_RET_STS_ERROR) THEN
6919                       RAISE OKL_API.G_EXCEPTION_ERROR;
6920                   END IF;
6921 
6922                   --accounting trx
6923                   l_bpd_acc_rec.id                := lx_tilv_rec.id;
6924                   l_bpd_acc_rec.source_table      := G_AR_LINES_SOURCE;
6925                   -- Create Accounting Distribution
6926                   okl_acc_call_pub.create_acc_trans (
6927                                p_api_version       => p_api_version,
6928                                p_init_msg_list     => p_init_msg_list,
6929                                x_return_status     => x_return_status,
6930                                x_msg_count         => x_msg_count,
6931                                x_msg_data          => x_msg_data,
6932                                p_bpd_acc_rec       => l_bpd_acc_rec);
6933 
6934                   IF (x_return_status = OKL_API.G_RET_STS_UNEXP_ERROR) THEN
6935                     RAISE OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
6936                   ELSIF (x_return_status = OKL_API.G_RET_STS_ERROR) THEN
6937                     RAISE OKL_API.G_EXCEPTION_ERROR;
6938                   END IF;   */
6939 
6940 
6941                 END IF;  -- end of check for amount_remaining > 0
6942               END LOOP; -- end of loop over invoice balances
6943 
6944              -- If there is still amount remaining, create an on-account credit-memo
6945              IF (l_subs_adj < 0) THEN
6946                 -- Call API to create On-ACC CM
6947                 on_acc_CM_create( p_subsidy_cle_id  =>l_orig_asdv_tbl(i).subsidy_cle_id
6948                                  , p_chr_id         => p_orig_chr_id
6949                                  , p_subs_adj       => l_subs_adj
6950                                  , p_rebook_date    => p_rebook_date);
6951              END IF; -- end of on_account credit memo creation
6952 
6953              -- STEP 4 (b) : IF there is increase in subsidy
6954              ELSIF (l_subs_adj > 0) THEN
6955                -- If subsidy billing transaction is still Unprocessed
6956                -- Cancel transaction
6957                FOR c_get_bill_stat_rec IN c_get_bill_stat(l_orig_asdv_tbl(i).subsidy_cle_id
6958                                                         , p_orig_chr_id)
6959                LOOP
6960                  l_cancel_cnt := l_cancel_cnt + 1;
6961                  l_cancel_taiv_tbl(l_cancel_cnt).ID := c_get_bill_stat_rec.ID;
6962                  l_cancel_taiv_tbl(l_cancel_cnt).DESCRIPTION := c_get_bill_stat_rec.DESCRIPTION;
6963                  l_cancel_taiv_tbl(l_cancel_cnt).TRX_STATUS_CODE := G_CANCEL_STATUS;
6964                  -- sjalasut, added okl_source_billing_trx as 'REBOOK' as rebook process initiates
6965                  -- cancelation
6966                  l_cancel_taiv_tbl(l_cancel_cnt).OKL_SOURCE_BILLING_TRX := G_SOURCE_BILLING_TRX_RBK;
6967 
6968                END LOOP;
6969 
6970                -- If there has been no billing run till now, then on cancellation
6971                -- create a new record for the new subsidy amount
6972                OPEN c_chk_billing_done(l_orig_asdv_tbl(i).subsidy_cle_id
6973                                      , p_orig_chr_id);
6974                  FETCH c_chk_billing_done INTO l_bill_chk;
6975                CLOSE c_chk_billing_done;
6976                IF l_bill_chk <> 'Y' THEN
6977                  l_subs_adj := 0;
6978                  l_new_cnt := l_new_cnt + 1;
6979                  l_new_asdv_tbl(l_new_cnt) := l_orig_asdv_tbl(i);
6980                  l_new_asdv_tbl(l_new_cnt).amount := l_asbv_rec.amount; -- bill subsidy with new amount
6981                 ELSE
6982                 -- Else IF subsidy billing transaction had been processed
6983                 -- add new record to l_new_asdv_tbl table to bill subsidy change amount
6984                   l_new_cnt := l_new_cnt + 1;
6985                   l_new_asdv_tbl(l_new_cnt) := l_orig_asdv_tbl(i);
6986                   l_new_asdv_tbl(l_new_cnt).amount := l_subs_adj; -- bill subsidy with new amount
6987                 END IF;
6988 
6989             END IF; -- end of check for l_subs_adj
6990           END IF; -- end of c_rbk_subs%NOTFOUND IF loop
6991         CLOSE c_rbk_subs;
6992       END LOOP; -- end of loop over the orignal contract subsidies
6993     END IF; -- end of check l_orig_asdv_tbl is not empty
6994 
6995     -- STEP 5 : Create billing transaction records using l_new_asdv_tbl table
6996     -- this procedure is called to create billing transaction
6997     -- records for the new subsidies
6998     IF l_new_cnt > 0 THEN
6999       insert_billing_records(
7000                p_api_version   => p_api_version
7001              , p_init_msg_list => p_init_msg_list
7002              , x_return_status => x_return_status
7003              , x_msg_count     => x_msg_count
7004              , x_msg_data      => x_msg_data
7005              , p_chr_id        => p_orig_chr_id
7006              , p_asdv_tbl      => l_new_asdv_tbl);
7007        IF (x_return_status = OKL_API.G_RET_STS_UNEXP_ERROR) THEN
7008          RAISE OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
7009        ELSIF (x_return_status = OKL_API.G_RET_STS_ERROR) THEN
7010          RAISE OKL_API.G_EXCEPTION_ERROR;
7011        END IF;
7012      END IF; -- end of check for l_new_asdv_tbl count
7013 
7014 
7015     -- STEP 6 : Cancel the records which were in unprocessed state
7016     IF l_cancel_cnt > 0 THEN
7017       --update internal AR transaction headers to mark them canceled
7018       okl_trx_ar_invoices_pub.update_trx_ar_invoices (
7019                             p_api_version       => p_api_version,
7020                             p_init_msg_list     => p_init_msg_list,
7021                             x_return_status     => x_return_status,
7022                             x_msg_count         => x_msg_count,
7023                             x_msg_data          => x_msg_data,
7024                             p_taiv_tbl          => l_cancel_taiv_tbl,
7025                             x_taiv_tbl          => lx_cancel_taiv_tbl);
7026     END IF;
7027 
7028 
7029     OKL_API.END_ACTIVITY (x_msg_count,x_msg_data );
7030   EXCEPTION
7031     WHEN OKL_API.G_EXCEPTION_ERROR THEN
7032     x_return_status := OKL_API.HANDLE_EXCEPTIONS(
7033                                l_api_name,
7034                                G_PKG_NAME,
7035                                'OKL_API.G_RET_STS_ERROR',
7036                                x_msg_count,
7037                                x_msg_data,
7038                                '_PVT');
7039     WHEN OKL_API.G_EXCEPTION_UNEXPECTED_ERROR THEN
7040     x_return_status :=OKL_API.HANDLE_EXCEPTIONS(
7041                               l_api_name,
7042                               G_PKG_NAME,
7043                               'OKL_API.G_RET_STS_UNEXP_ERROR',
7044                               x_msg_count,
7045                               x_msg_data,
7046                               '_PVT');
7047     WHEN OTHERS THEN
7048     x_return_status :=OKL_API.HANDLE_EXCEPTIONS(
7049                               l_api_name,
7050                               G_PKG_NAME,
7051                               'OTHERS',
7052                               x_msg_count,
7053                               x_msg_data,
7054                               '_PVT');
7055   END rebook_adjustment;
7056 -- varangan - Bug#5474059 - Added - End
7057 
7058 -- Start of comments
7059 --
7060 -- Procedure Name	: Create_Billing_Trx
7061 -- Description		: Procedure to create billing transaction for subsidies to
7062 --                        be billed to third party
7063 -- Business Rules	:
7064 -- Parameters		: Contract Id
7065 -- History          :
7066 -- Version		: 1.0
7067 -- End of comments
7068 
7069 Procedure Create_Billing_Trx
7070            (p_api_version    IN  NUMBER,
7071             p_init_msg_list  IN  VARCHAR2,
7072             x_return_status  OUT NOCOPY VARCHAR2,
7073             x_msg_count      OUT NOCOPY NUMBER,
7074             x_msg_data       OUT NOCOPY VARCHAR2,
7075             p_chr_id         IN  NUMBER) is
7076 
7077     l_return_status        VARCHAR2(1)  default OKL_API.G_RET_STS_SUCCESS;
7078     l_api_name             CONSTANT     varchar2(30) := 'CREATE_BILLING_TRX';
7079     l_api_version          CONSTANT     NUMBER := 1.0;
7080 
7081 
7082    l_asdv_tbl      asbv_tbl_type;
7083    l_asdv_tbl_proc asbv_tbl_type;
7084    l_chr_id        number;
7085    i               number;
7086    j               number;
7087 
7088    --30-Oct-03 avsingh : cursor corrected for same vendor match at
7089    --model line level
7090    --cursor to verify theat asset and subsidy vendors are the same
7091    cursor l_samevend_csr(p_vendor_id    in number,
7092                          p_asset_cle_id in number,
7093                          p_chr_id       in number) is
7094    Select 'Y'
7095    From   okc_k_party_roles_b cplb,
7096           okc_k_lines_b       cleb,
7097           okc_line_styles_b   lseb
7098    where  cplb.cle_id            = cleb.id
7099    and    cleb.cle_id            = p_asset_cle_id
7100    and    lseb.id                = cleb.lse_id
7101    and    lseb.lty_code          = 'ITEM'
7102    and    cplb.dnz_chr_id        = p_chr_id
7103    and    cplb.object1_id1       = to_char(p_vendor_id)
7104    and    cplb.object1_id2       = '#'
7105    and    cplb.jtot_object1_code = 'OKX_VENDOR'
7106    and    cplb.rle_code          = 'OKL_VENDOR';
7107 
7108    l_exists varchar2(1) default 'N';
7109 
7110    l_taiv_rec     okl_trx_ar_invoices_pub.taiv_rec_type;
7111    l_tilv_rec     okl_txl_ar_inv_lns_pub.tilv_rec_type;
7112    l_bpd_acc_rec  okl_acc_call_pub.bpd_acc_rec_type;
7113 
7114    lx_taiv_rec     okl_trx_ar_invoices_pub.taiv_rec_type;
7115    lx_tilv_rec     okl_txl_ar_inv_lns_pub.tilv_rec_type;
7116    lx_bpd_acc_rec  okl_acc_call_pub.bpd_acc_rec_type;
7117 
7118    l_bill_to_site_use_id OKC_K_HEADERS_B.bill_to_site_use_id%TYPE;
7119    l_cust_acct_id        OKC_K_PARTY_ROLES_B.cust_acct_id%TYPE;
7120    l_payment_method_id     Number;
7121    l_bank_account_id       Number;
7122    l_inv_reason_for_review Varchar2(450);
7123    l_inv_review_until_date Date;
7124    l_cash_appl_rule_id     Number;
7125    l_invoice_format        Varchar2(450);
7126    l_review_invoice_yn     Varchar2(450);
7127 
7128    l_cust_acct_site_id     Number;
7129    l_payment_term_id       Number;
7130 
7131    --cursor to get vendor cpl_id at header level
7132    cursor l_chrcpl_csr (p_vendor_id in number,
7133                         p_chr_id    in number) is
7134    select cplb.id
7135    from   okc_k_party_roles_b cplb
7136    where  cplb.chr_id             = p_chr_id
7137    and    cplb.dnz_chr_id         = p_chr_id
7138    and    cplb.cle_id is null
7139    and    cplb.object1_id1        = to_char(p_vendor_id)
7140    and    cplb.object1_id2        = '#'
7141    and    cplb.jtot_object1_code  = 'OKX_VENDOR'
7142    and    cplb.rle_code           = 'OKL_VENDOR';
7143 
7144    l_chr_cpl_id number;
7145 
7146     -- Cursor to find out whether rebook copy
7147     cursor l_chk_rbk_csr(p_chr_id IN NUMBER) is
7148     SELECT 'Y',
7149            chrb.orig_system_id1,
7150            ktrx.date_transaction_occurred
7151     FROM   okc_k_headers_b   CHRB,
7152            okl_trx_contracts ktrx
7153     WHERE  ktrx.khr_id_new = chrb.id
7154     AND    ktrx.tsu_code = 'ENTERED'
7155     AND    ktrx.rbr_code is NOT NULL
7156     AND    ktrx.tcn_type = 'TRBK'
7157   --rkuttiya added for 12.1.1 Multi GAAP
7158     AND    ktrx.representation_type = 'PRIMARY'
7159   --
7160     AND    CHRB.id = p_chr_id
7161     AND    CHRB.ORIG_SYSTEM_SOURCE_CODE = 'OKL_REBOOK';
7162 
7163     l_rebook_cpy       varchar2(1) default 'N';
7164     l_orig_chr_id      okc_k_headers_b.id%TYPE;
7165     l_rebook_date      date;
7166 
7167     l_try_id           number;
7168 
7169 Begin
7170 
7171     x_return_status := OKL_API.G_RET_STS_SUCCESS;
7172     -- Call start_activity to create savepoint, check compatibility
7173     -- and initialize message list
7174     x_return_status := OKL_API.START_ACTIVITY (
7175                                l_api_name
7176                                ,p_init_msg_list
7177                                ,'_PVT'
7178                                ,x_return_status);
7179     -- Check if activity started successfully
7180     IF (x_return_status = OKL_API.G_RET_STS_UNEXP_ERROR) THEN
7181        RAISE OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
7182     ELSIF (x_return_status = OKL_API.G_RET_STS_ERROR) THEN
7183        RAISE OKL_API.G_EXCEPTION_ERROR;
7184     END IF;
7185 
7186 
7187     -----------------------------------------------
7188     --start of input parameter validations
7189     -----------------------------------------------
7190     --1. validate chr_id
7191     If (p_chr_id is NULL) or (p_chr_id = OKL_API.G_MISS_NUM) then
7192         OKL_API.set_message(
7193                               p_app_name     => G_APP_NAME,
7194                               p_msg_name     => G_API_MISSING_PARAMETER,
7195                               p_token1       => G_API_NAME_TOKEN,
7196                               p_token1_value => l_api_name,
7197                               p_token2       => G_MISSING_PARAM_TOKEN,
7198                               p_token2_value => 'p_chr_id');
7199          x_return_status := OKL_API.G_RET_STS_ERROR;
7200          Raise OKL_API.G_EXCEPTION_ERROR;
7201     Elsif (p_chr_id is not NULL) and (p_chr_id <> OKL_API.G_MISS_NUM) then
7202         validate_chr_id(p_chr_id        => p_chr_id,
7203                         x_return_status => x_return_status);
7204         IF x_return_status = OKL_API.G_RET_STS_ERROR then
7205             OKL_API.set_message(G_APP_NAME, G_INVALID_VALUE,G_COL_NAME_TOKEN,'p_chr_id');
7206             Raise OKL_API.G_EXCEPTION_ERROR;
7207         Elsif x_return_status = OKL_API.G_RET_STS_UNEXP_ERROR then
7208             Raise OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
7209         End If;
7210     End If;
7211     ---------------------------------------
7212     --end of input parameter validations
7213     ---------------------------------------
7214 
7215     --Rebook Processing
7216     -------------------------------------------
7217     --find out whether contract is rebook copy :
7218     -------------------------------------------
7219     l_rebook_cpy := 'N';
7220     open l_chk_rbk_csr(p_chr_id => p_chr_id);
7221     fetch l_chk_rbk_csr into
7222         l_rebook_cpy,
7223         l_orig_chr_id,
7224         l_rebook_date;
7225     If l_chk_rbk_csr%NOTFOUND then
7226         Null;
7227     End If;
7228     close l_chk_rbk_csr;
7229 
7230     If l_rebook_cpy = 'N' then
7231         l_chr_id := p_chr_id;
7232     -- varangan - Bug#5474059 - Modified - Start
7233     get_contract_subsidy_amount(
7234     p_api_version    => p_api_version,
7235     p_init_msg_list  => p_init_msg_list,
7236     x_return_status  => x_return_status,
7237     x_msg_count      => x_msg_count,
7238     x_msg_data       => x_msg_data,
7239     p_chr_id         => l_chr_id,
7240     x_asbv_tbl       => l_asdv_tbl);
7241 
7242     IF (x_return_status = OKL_API.G_RET_STS_UNEXP_ERROR) THEN
7243        RAISE OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
7244     ELSIF (x_return_status = OKL_API.G_RET_STS_ERROR) THEN
7245        RAISE OKL_API.G_EXCEPTION_ERROR;
7246     END IF;
7247 
7248 
7249        -- Moved code into a separate Procedure and called here
7250        -- this procedure is called to create billing transaction
7251        -- records for the new subsidies
7252        insert_billing_records(
7253                p_api_version   => p_api_version
7254              , p_init_msg_list => p_init_msg_list
7255              , x_return_status => x_return_status
7256              , x_msg_count     => x_msg_count
7257              , x_msg_data      => x_msg_data
7258              , p_chr_id        => l_chr_id
7259              , p_asdv_tbl      => l_asdv_tbl);
7260        IF (x_return_status = OKL_API.G_RET_STS_UNEXP_ERROR) THEN
7261           RAISE OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
7262        ELSIF (x_return_status = OKL_API.G_RET_STS_ERROR) THEN
7263           RAISE OKL_API.G_EXCEPTION_ERROR;
7264        END IF;
7265        -- varangan - Bug#5474059 - Modified - End
7266 
7267     elsif l_rebook_cpy = 'Y' then
7268         l_chr_id := l_orig_chr_id;
7269         --call api for reversals
7270        -- varangan - Bug#5412198 - Commented - Start
7271        -- Susbidy invoice will no longer be reversed. Instead additional credit memos
7272        -- or invoices will be generated
7273        /* Reverse_Billing_Trx
7274            (p_api_version    => p_api_version,
7275             p_init_msg_list  => p_init_msg_list,
7276             x_return_status  => x_return_status,
7277             x_msg_count      => x_msg_count,
7278             x_msg_data       => x_msg_data,
7279             p_chr_id         => l_orig_chr_id,
7280             p_rebook_date    => l_rebook_date);*/
7281 
7282        -- varangan - Bug#5474059 - Commented - End
7283        -- varangan - Bug#5474059 - Added - Start
7284 	 rebook_adjustment
7285            (p_api_version    => p_api_version,
7286             p_init_msg_list  => p_init_msg_list,
7287             x_return_status  => x_return_status,
7288             x_msg_count      => x_msg_count,
7289             x_msg_data       => x_msg_data,
7290             p_rbk_chr_id     => p_chr_id,
7291 	    p_orig_chr_id    => l_orig_chr_id,
7292             p_rebook_date    => l_rebook_date);
7293        -- varangan - Bug#5474059 - Added - End
7294         IF (x_return_status = OKL_API.G_RET_STS_UNEXP_ERROR) THEN
7295             RAISE OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
7296         ELSIF (x_return_status = OKL_API.G_RET_STS_ERROR) THEN
7297             RAISE OKL_API.G_EXCEPTION_ERROR;
7298         END IF;
7299     End If;
7300     -- End of rebook processing
7301 
7302 
7303 
7304     l_asdv_tbl.delete;
7305 
7306     OKL_API.END_ACTIVITY (x_msg_count,x_msg_data );
7307 
7308     EXCEPTION
7309     WHEN OKL_API.G_EXCEPTION_ERROR THEN
7310     If l_samevend_csr%ISOPEN then
7311         close l_samevend_csr;
7312     End If;
7313     If l_chrcpl_csr%ISOPEN then
7314         close l_chrcpl_csr;
7315     End If;
7316     If l_chk_rbk_csr%ISOPEN then
7317         close l_chk_rbk_csr;
7318     End If;
7319     x_return_status := OKL_API.HANDLE_EXCEPTIONS(
7320                                l_api_name,
7321                                G_PKG_NAME,
7322                                'OKL_API.G_RET_STS_ERROR',
7323                                x_msg_count,
7324                                x_msg_data,
7325                                '_PVT');
7326     WHEN OKL_API.G_EXCEPTION_UNEXPECTED_ERROR THEN
7327     If l_samevend_csr%ISOPEN then
7328         close l_samevend_csr;
7329     End If;
7330     If l_chrcpl_csr%ISOPEN then
7331         close l_chrcpl_csr;
7332     End If;
7333     If l_chk_rbk_csr%ISOPEN then
7334         close l_chk_rbk_csr;
7335     End If;
7336     x_return_status :=OKL_API.HANDLE_EXCEPTIONS(
7337                               l_api_name,
7338                               G_PKG_NAME,
7339                               'OKL_API.G_RET_STS_UNEXP_ERROR',
7340                               x_msg_count,
7341                               x_msg_data,
7342                               '_PVT');
7343     WHEN OTHERS THEN
7344     If l_samevend_csr%ISOPEN then
7345         close l_samevend_csr;
7346     End If;
7347     If l_chrcpl_csr%ISOPEN then
7348         close l_chrcpl_csr;
7349     End If;
7350     If l_chk_rbk_csr%ISOPEN then
7351         close l_chk_rbk_csr;
7352     End If;
7353     x_return_status :=OKL_API.HANDLE_EXCEPTIONS(
7354                               l_api_name,
7355                               G_PKG_NAME,
7356                               'OTHERS',
7357                               x_msg_count,
7358                               x_msg_data,
7359                               '_PVT');
7360 End Create_Billing_Trx;
7361 
7362 --Bug# 3948361
7363 Procedure get_relk_termn_basis
7364           (p_api_version    IN  NUMBER,
7365            p_init_msg_list  IN  VARCHAR2 DEFAULT OKC_API.G_FALSE,
7366            x_return_status  OUT NOCOPY VARCHAR2,
7367            x_msg_count      OUT NOCOPY NUMBER,
7368            x_msg_data       OUT NOCOPY VARCHAR2,
7369            p_chr_id         IN  NUMBER,
7370            p_subsidy_id     IN  NUMBER,
7371            x_release_basis  OUT NOCOPY varchar2) is
7372 
7373     l_return_status        VARCHAR2(1)  default OKL_API.G_RET_STS_SUCCESS;
7374     l_api_name             CONSTANT     varchar2(30) := 'GET_RELK_TERMN_BASIS';
7375     l_api_version          CONSTANT     NUMBER := 1.0;
7376 
7377     --cursor to read whether product change or customer change
7378     cursor l_relk_reason_csr(p_chr_id in number) is
7379     select tcn.rbr_code
7380     from   okl_trx_contracts tcn,
7381            okl_trx_types_tl  ttl
7382     where  ttl.id        =  tcn.try_id
7383     and    ttl.language  = 'US'
7384     and    ttl.name      = 'Release'
7385     and    tcn.tsu_code  = 'ENTERED'
7386     and    tcn.tcn_type  = 'MAE'
7387 --rkuttiya added for 12.1.1 Multi GAAP
7388     and    tcn.representation_type = 'PRIMARY'
7389 --
7390     and    tcn.khr_id    = p_chr_id;
7391 
7392     l_relk_reason   okl_trx_contracts.rbr_code%TYPE;
7393 
7394     --cursor to read subsidy setup
7395     cursor l_tsfr_basis_csr (p_subsidy_id in number) is
7396     select subb.transfer_basis_code
7397     from   okl_subsidies_b subb
7398     where  id = p_subsidy_id;
7399 
7400     l_transfer_basis okl_subsidies_b.transfer_basis_code%TYPE;
7401 Begin
7402 
7403   x_return_status := OKL_API.G_RET_STS_SUCCESS;
7404     -- Call start_activity to create savepoint, check compatibility
7405     -- and initialize message list
7406     x_return_status := OKL_API.START_ACTIVITY (
7407                                l_api_name
7408                                ,p_init_msg_list
7409                                ,'_PVT'
7410                                ,x_return_status);
7411     -- Check if activity started successfully
7412     IF (x_return_status = OKL_API.G_RET_STS_UNEXP_ERROR) THEN
7413        RAISE OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
7414     ELSIF (x_return_status = OKL_API.G_RET_STS_ERROR) THEN
7415        RAISE OKL_API.G_EXCEPTION_ERROR;
7416     END IF;
7417 
7418 
7419     for l_relk_reason_rec in l_relk_reason_csr(p_chr_id => p_chr_id)
7420     loop
7421        l_relk_reason := l_relk_reason_rec.rbr_code;
7422     end loop;
7423 
7424     If l_relk_reason = 'PRODUCT_CHANGE'  then
7425         x_release_basis := 'ACCELERATE';
7426     ElsIf l_relk_reason = 'CUSTOMER_CHANGE' then
7427         --read subsidy setup
7428         for l_tsfr_basis_rec in l_tsfr_basis_csr(p_subsidy_id => p_subsidy_id)
7429         loop
7430             l_transfer_basis := l_tsfr_basis_rec.transfer_basis_code;
7431         end loop;
7432         x_release_basis := l_transfer_basis;
7433     End If;
7434 
7435     If x_release_basis is null then
7436         x_release_basis := 'ACCELERATE';
7437     end if;
7438    OKL_API.END_ACTIVITY (x_msg_count,x_msg_data );
7439 
7440     EXCEPTION
7441     WHEN OKL_API.G_EXCEPTION_ERROR THEN
7442     x_return_status := OKL_API.HANDLE_EXCEPTIONS(
7443                                l_api_name,
7444                                G_PKG_NAME,
7445                                'OKL_API.G_RET_STS_ERROR',
7446                                x_msg_count,
7447                                x_msg_data,
7448                                '_PVT');
7449     WHEN OKL_API.G_EXCEPTION_UNEXPECTED_ERROR THEN
7450     x_return_status :=OKL_API.HANDLE_EXCEPTIONS(
7451                               l_api_name,
7452                               G_PKG_NAME,
7453                               'OKL_API.G_RET_STS_UNEXP_ERROR',
7454                               x_msg_count,
7455                               x_msg_data,
7456                               '_PVT');
7457     WHEN OTHERS THEN
7458     x_return_status :=OKL_API.HANDLE_EXCEPTIONS(
7459                               l_api_name,
7460                               G_PKG_NAME,
7461                               'OTHERS',
7462                               x_msg_count,
7463                               x_msg_data,
7464                               '_PVT');
7465 
7466 End get_relk_termn_basis;
7467 END OKL_SUBSIDY_PROCESS_PVT;