[Home] [Help]
PACKAGE BODY: APPS.OKL_STREAM_GENERATOR_PVT
Source
1 PACKAGE BODY OKL_STREAM_GENERATOR_PVT AS
2 /* $Header: OKLRSGPB.pls 120.101 2008/02/07 07:15:32 veramach noship $ */
3
4 TYPE interim_interest_rec_type IS RECORD (cf_days NUMBER, cf_amount NUMBER, cf_dpp NUMBER);
5 TYPE interim_interest_tbl_type IS TABLE OF interim_interest_rec_type INDEX BY BINARY_INTEGER;
6 -- Added by RGOOTY : Start
7
8 CURSOR G_SRV_ASSETS_EXISTS_CSR( chrId NUMBER ) IS
9 select 'T' flag
10 from dual where exists
11 (
12 select 1
13 from okc_k_lines_b kle,
14 okc_line_styles_b lse,
15 okc_statuses_b sts
16 where KLE.LSE_ID = LSE.ID
17 and lse.lty_code = 'SOLD_SERVICE'
18 and kle.chr_id = chrId
19 and sts.code = kle.sts_code
20 and sts.ste_code not in ('HOLD', 'TERMINATED', 'EXPIRED', 'CANCELLED')
21 );
22
23 G_ORG_ID OKC_K_HEADERS_B.AUTHORING_ORG_ID%TYPE;
24 G_CURRENCY_CODE OKC_K_HEADERS_B.CURRENCY_CODE%TYPE;
25 G_DIFF_LOOKUP_CODE FND_LOOKUPS.LOOKUP_CODE%TYPE;
26 G_PRECISION NUMBER;
27 G_ROUNDING_RULE OKL_SYS_ACCT_OPTS.AEL_ROUNDING_RULE%TYPE;
28
29 CURSOR G_HDR( p_khr_id OKC_K_HEADERS_V.ID%TYPE) IS
30 select chr.orig_system_source_code,
31 chr.start_date,
32 chr.end_date,
33 chr.template_yn,
34 chr.authoring_org_id,
35 chr.inv_organization_id,
36 khr.deal_type,
37 to_char(pdt.id) pid,
38 nvl(pdt.reporting_pdt_id, -1) report_pdt_id,
39 chr.currency_code currency_code,
40 khr.term_duration term
41 from okc_k_headers_v chr,
42 okl_k_headers khr,
43 okl_products_v pdt
44 where khr.id = chr.id
45 and chr.id = p_khr_id
46 and khr.pdt_id = pdt.id(+);
47 r_hdr G_HDR%ROWTYPE;
48
49 Cursor G_ROLLOVER_PMNTS(p_khr_id OKC_RULE_GROUPS_B.dnz_chr_id%type ) IS
50 Select distinct nvl(slh.object1_id1, -1) styId
51 From OKC_RULE_GROUPS_B rgp,
52 OKC_RULES_B sll,
53 okc_rules_b slh,
54 okl_strm_type_b sty
55 Where slh.rgp_id = rgp.id
56 and rgp.RGD_CODE = 'LALEVL'
57 and sll.RULE_INFORMATION_CATEGORY = 'LASLL'
58 and slh.RULE_INFORMATION_CATEGORY = 'LASLH'
59 AND TO_CHAR(slh.id) = sll.object2_id1
60 and slh.object1_id1 = sty.id
61 and sty.stream_type_purpose = 'RENT'
62 and rgp.dnz_chr_id = p_khr_id;
63
64 r_rollover_pmnts G_ROLLOVER_PMNTS%ROWTYPE;
65 -- Added by RGOOTY : End
66
67 G_API_TYPE CONSTANT VARCHAR2(4) := '_PVT';
68 G_IA_STS_NEW CONSTANT VARCHAR2(6) := okl_pool_pvt.G_POL_STS_NEW;
69 G_IA_STS_ACTIVE CONSTANT VARCHAR2(6) := okl_pool_pvt.G_POL_STS_ACTIVE;
70 G_IA_STS_INACTIVE CONSTANT VARCHAR2(8) := okl_pool_pvt.G_POL_STS_INACTIVE;
71 G_IA_STS_EXPIRED CONSTANT VARCHAR2(10) := okl_pool_pvt.G_POL_STS_EXPIRED;
72 --sosharma 14-12-2007 ,Added pending status
73 G_PC_STS_PENDING CONSTANT VARCHAR2(8) := 'PENDING';
74
75 -- Added by RGOOTY: Start 4371472
76 -- This add_months_new is modified to handle even the
77 -- negative p_months_after ...
78 -- Hence, we can use add_months_new to calculate the months before
79 -- p_start_date
80 PROCEDURE add_months_new(
81 p_start_date IN DATE,
82 p_months_after IN NUMBER,
83 x_date OUT NOCOPY DATE,
84 x_return_status OUT NOCOPY VARCHAR2)
85 IS
86 l_day NUMBER;
87 l_month NUMBER;
88 l_year NUMBER;
89 l_year_inc NUMBER;
90
91 l_api_name VARCHAR2(30) := 'add_months_new';
92 l_return_status VARCHAR2(1);
93 BEGIN
94 -- Initialize the status
95 l_return_status := OKL_API.G_RET_STS_SUCCESS;
96
97 l_month := to_char( p_start_date, 'MM' );
98 l_year := to_char( p_start_date, 'YYYY' );
99 l_day := to_char( p_start_date, 'DD' );
100 --print( l_api_name || ': ' || 'l_month | l_year | l_day | p_months_after' );
101 --print( l_api_name || ': ' || '1 |' || l_month || '|' || l_year || '|' || l_day || '|' || p_months_after );
102
103 l_month := l_month + nvl(p_months_after,0);
104 --print( l_api_name || ': ' || '2 |' || l_month || '|' || l_year || '|' || l_day || '|' || p_months_after );
105
106 IF l_month > 0
107 THEN
108 l_year := l_year + floor( (l_month - 1) / 12);
109 --print( l_api_name || ': ' || '3 |' || l_month || '|' || l_year || '|' || l_day || '|' || p_months_after );
110 l_month := mod(l_month ,12 );
111 --print( l_api_name || ': ' || '4 |' || l_month || '|' || l_year || '|' || l_day || '|' || p_months_after );
112 IF l_month = 0
113 THEN
114 l_month := 12;
115 END IF;
116 ELSE
117 l_year_inc := ceil( (ABS(l_month) + 1 ) / 12 );
118 l_year := l_year - l_year_inc;
119 --print( l_api_name || ': ' || '3 |' || l_month || '|' || l_year || '|' || l_day || '|' || p_months_after );
120 l_month := 12 * l_year_inc - ABS(l_month);
121 IF l_month = 13
122 THEN
123 l_month := 1;
124 END IF;
125 --print( l_api_name || ': ' || '4 |' || l_month || '|' || l_year || '|' || l_day || '|' || p_months_after );
126 END IF;
127 CASE
128 -- Considering the cases where 30 is the last day in the month
129 WHEN ( l_month = 4 OR l_month = 6 OR
130 l_month = 9 OR l_month = 11 ) AND
131 l_day > 30
132 THEN
133 l_day := 30;
134 WHEN l_month = 2
135 AND l_day > 28
136 THEN
137 -- Considering the cases where day > 28 and month is February in a leap/Non Leap Year
138 IF mod(l_year,400 ) = 0 OR
139 ( mod(l_year, 100) <> 0 AND mod(l_year,4) = 0 )
140 THEN
141 -- Leap Year is divisible by 4, but not with 100 except for the years which are divisible by 400
142 -- Like 1900 is not leap year, but 2000 is a leap year
143 l_day := 29;
144 ELSE
145 -- Its a non Leap Year
146 l_day := 28;
147 END IF;
148 ELSE
149 -- Do Nothing
150 NULL;
151 END CASE;
152 --print( l_api_name || ': ' || '5 |' || l_month || '|' || l_year || '|' || l_day || '|' || p_months_after );
153 -- Return things
154 x_date := to_date( l_day || '-' || l_month || '-' || l_year, 'DD-MM-YYYY' );
155 x_return_status := l_return_status;
156 EXCEPTION
157 WHEN OKL_API.G_EXCEPTION_ERROR THEN
158 x_return_status := G_RET_STS_ERROR;
159 WHEN OKL_API.G_EXCEPTION_UNEXPECTED_ERROR THEN
160 x_return_status := G_RET_STS_UNEXP_ERROR;
161 WHEN OTHERS THEN
162 OKL_API.SET_MESSAGE (
163 p_app_name => G_APP_NAME,
164 p_msg_name => G_DB_ERROR,
165 p_token1 => G_PROG_NAME_TOKEN,
166 p_token1_value => l_api_name,
167 p_token2 => G_SQLCODE_TOKEN,
168 p_token2_value => sqlcode,
169 p_token3 => G_SQLERRM_TOKEN,
170 p_token3_value => sqlerrm);
171 x_return_status := G_RET_STS_UNEXP_ERROR;
172 END add_months_new;
173
174 -- API calculating the Stream element date after
175 -- (p_periods_after * p_months_per_period ) months
176 -- from p_start_date, also considering the payments are
177 -- Advance/Arrears !!
178
179 -- Added parameter p_recurrence_date by djanaswa for bug 6007644
180 -- Added parameter p_arrears_pay_dates_option DJANASWA ER6274342
181 PROCEDURE get_sel_date(
182 p_start_date IN DATE,
183 p_advance_or_arrears IN VARCHAR2,
184 p_periods_after IN NUMBER,
185 p_months_per_period IN NUMBER,
186 x_date OUT NOCOPY DATE,
187 x_return_status OUT NOCOPY VARCHAR2,
188 p_recurrence_date IN DATE,
189 p_arrears_pay_dates_option IN VARCHAR2)
190 AS
191 l_start_date DATE;
192 l_start_day NUMBER;
193 l_temp_day NUMBER;
194 l_temp_date DATE;
195 l_month NUMBER;
196 l_api_name VARCHAR2(30) := 'get_sel_date';
197 l_return_status VARCHAR2(1);
198
199 -- Added by djanaswa for bug 6007644
200 l_recurrence_day NUMBER;
201 l_temp_month NUMBER;
202 l_temp_year NUMBER;
203 --end djanaswa
204
205
206
207
208 BEGIN
209 -- Initialize Things ...
210 l_start_date := p_start_date;
211 l_return_status := OKL_API.G_RET_STS_SUCCESS;
212 l_start_date := trunc(p_start_date);
213 l_start_day := to_char( l_start_date, 'DD');
214 l_month := to_char(p_start_date, 'MM');
215
216 -- Added by djanaswa for bug 6007644
217 l_month := to_char(p_recurrence_date, 'MM');
218 l_recurrence_day := to_char(p_recurrence_date, 'DD');
219 --end djanaswa
220
221 IF p_advance_or_arrears = 'ARREARS' OR
222 p_advance_or_arrears = 'Y'
223 THEN
224 add_months_new(
225 p_start_date => l_start_date,
226 p_months_after => p_periods_after * p_months_per_period,
227 x_date => l_temp_date,
228 x_return_status => l_return_status);
229 IF(l_return_status = OKL_API.G_RET_STS_UNEXP_ERROR) THEN
230 RAISE OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
231 ELSIF (l_return_status = OKL_API.G_RET_STS_ERROR) THEN
232 RAISE OKL_API.G_EXCEPTION_ERROR;
233 END IF;
234 -- IF to_char( l_temp_date, 'DD' ) >= l_start_day
235 -- THEN
236 -- l_temp_date := l_temp_date - 1;
237 -- END IF;
238 ELSE
239 add_months_new(
240 p_start_date => l_start_date,
241 p_months_after => (p_periods_after-1)* p_months_per_period,
242 x_date => l_temp_date,
243 x_return_status => l_return_status);
244 IF(l_return_status = OKL_API.G_RET_STS_UNEXP_ERROR) THEN
245 RAISE OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
246 ELSIF (l_return_status = OKL_API.G_RET_STS_ERROR) THEN
247 RAISE OKL_API.G_EXCEPTION_ERROR;
248 END IF;
249 END IF; -- changed by djanaswa for bug 6007644
250
251 -- Note:
252 -- The logic below is to address the rule, that if the start date is last day of a month
253 -- then the succeeding advance payments should be on the last day of the month..
254 -- Please remove the below IF clause, if the above mentioned rule is not applicable.
255
256 -- Added p_recurrence_date in IF clause by djanaswa for bug 6007644
257
258 IF l_month in (1, 3 , 5 , 7, 8, 10, 12) THEN
259 IF p_recurrence_date = LAST_DAY( p_recurrence_date )
260 THEN
261 l_temp_date := LAST_DAY( l_temp_date );
262 END IF;
263 END IF;
264
265 -- Added by djanaswa for bug 6007644
266 IF(l_recurrence_day in(29, 30)) THEN
267 l_temp_month := to_char(l_temp_date, 'MM');
268 l_temp_year := to_char(l_temp_date, 'YYYY');
269 IF(l_temp_month = 2) THEN
270 IF mod(l_temp_year,400 ) = 0 OR (mod(l_temp_year, 100) <> 0 AND mod(l_temp_year,4) = 0)
271 THEN
272 -- Leap Year is divisible by 4, but not with 100 except for the years which are divisible by 400
273 -- Like 1900 is not leap year, but 2000 is a leap year
274 l_temp_day := 29;
275 ELSE
276 -- Its a non Leap Year
277 l_temp_day := 28;
278 END IF;
279 ELSE
280 l_temp_day := l_recurrence_day;
281 END IF;
282 l_temp_date := to_date(l_temp_day || '-' || l_temp_month || '-' || l_temp_year, 'DD-MM-YYYY');
283 END IF;
284
285 -- djanaswa 6274342 start
286 IF p_advance_or_arrears = 'ARREARS' OR
287 p_advance_or_arrears = 'Y'
288 THEN
289 IF p_arrears_pay_dates_option = 'FIRST_DAY_OF_NEXT_PERIOD' THEN
290 l_temp_date := l_temp_date;
291 ELSE
292 l_temp_date := l_temp_date - 1;
293 END IF;
294 END IF;
295 -- djanaswa 6274342 end
296 --end djanaswa
297
298
299 -- Return the things
300 x_date := l_temp_date;
301 x_return_status := l_return_status;
302 EXCEPTION
303 WHEN OKL_API.G_EXCEPTION_ERROR THEN
304 x_return_status := G_RET_STS_ERROR;
305 WHEN OKL_API.G_EXCEPTION_UNEXPECTED_ERROR THEN
306 x_return_status := G_RET_STS_UNEXP_ERROR;
307 WHEN OTHERS THEN
308 OKL_API.SET_MESSAGE (
309 p_app_name => G_APP_NAME,
310 p_msg_name => G_DB_ERROR,
311 p_token1 => G_PROG_NAME_TOKEN,
312 p_token1_value => l_api_name,
313 p_token2 => G_SQLCODE_TOKEN,
314 p_token2_value => sqlcode,
315 p_token3 => G_SQLERRM_TOKEN,
316 p_token3_value => sqlerrm);
317 x_return_status := G_RET_STS_UNEXP_ERROR;
318 END get_sel_date;
319 -- Added by RGOOTY: End 4371472
320
321 ---------------------------------------------------------------------------
322 -- PROCEDURE get_mapped_stream
323 --
324 -- DESC
325 -- Repository of hard-coded stream type mapping
326 --
327 -- USAGE
328 -- Driven by mapping type. Must provide mapping type
329 ---------------------------------------------------------------------------
330 PROCEDURE get_mapped_stream(p_sty_purpose IN VARCHAR2 DEFAULT NULL,
331 p_line_style IN VARCHAR2,
332 p_mapping_type IN VARCHAR2,
333 p_deal_type IN VARCHAR2,
334 p_primary_sty_id IN NUMBER DEFAULT NULL,
335 p_fee_type IN VARCHAR2 DEFAULT NULL,
336 p_recurr_yn IN VARCHAR2 DEFAULT NULL,
337 p_pt_yn IN VARCHAR2 DEFAULT 'N',
338 p_khr_id IN NUMBER,
339 x_mapped_stream OUT NOCOPY VARCHAR2,
340 x_return_status OUT NOCOPY VARCHAR2,
341 p_hdr IN G_HDR%ROWTYPE,
342 p_rollover_pmnts IN G_ROLLOVER_PMNTS%ROWTYPE) IS
343
344 l_prog_name CONSTANT VARCHAR2(61) := G_PKG_NAME||'.'||'get_mapped_stream';
345 l_sty_id NUMBER;
346 l_primary_sty_id NUMBER;
347 p_get_k_info_csr OKL_ISG_UTILS_PVT.G_GET_K_INFO_CSR%ROWTYPE;
348 BEGIN
349 -- Enhancement pending to remove hard coding dependency (TBD by MCHAKRAB, SRAWLING)
350 -- Accrual Stream Type will be specified during setup of Payment Stream Type
351 IF p_rollover_pmnts.styId IS NULL
352 THEN
353 OPEN G_ROLLOVER_PMNTS(p_khr_id);
354 FETCH G_ROLLOVER_PMNTS INTO r_rollover_pmnts;
355 CLOSE G_ROLLOVER_PMNTS;
356 ELSE
357 r_rollover_pmnts := p_rollover_pmnts;
358 END IF;
359
360 OPEN OKL_ISG_UTILS_PVT.G_GET_K_INFO_CSR (p_khr_id);
361 FETCH OKL_ISG_UTILS_PVT.G_GET_K_INFO_CSR INTO p_get_k_info_csr;
362 CLOSE OKL_ISG_UTILS_PVT.G_GET_K_INFO_CSR;
363
364 l_primary_sty_id := nvl(p_primary_sty_id, r_rollover_pmnts.styId);
365
366 -- print( l_prog_name, 'begin' );
367 -- print( l_prog_name, ' mapping type ' || p_mapping_type || ' sty ame ' || p_sty_purpose || ' deal type ' || p_deal_type );
368 IF p_mapping_type = 'ACCRUAL' THEN
369 IF p_sty_purpose = 'RENT' AND p_deal_type = 'LEASEOP' AND
370 (p_line_style = 'FREE_FORM1' OR p_line_style IS NULL) THEN
371 --x_mapped_stream := 'RENTAL ACCRUAL';
372 -- print( l_prog_name, '##1##' );
373 OKL_ISG_UTILS_PVT.get_dep_stream_type(
374 p_khr_id => p_khr_id,
375 p_deal_type => p_deal_type,
376 p_primary_sty_id => l_primary_sty_id,
377 p_dependent_sty_purpose => 'RENT_ACCRUAL',
378 x_return_status => x_return_status,
379 x_dependent_sty_id => l_sty_id,
380 x_dependent_sty_name => x_mapped_stream,
381 p_get_k_info_rec => p_get_k_info_csr);
382
383 ELSIF p_sty_purpose = 'RENT' AND p_deal_type <> 'LEASEOP' AND
384 (p_line_style = 'FREE_FORM1' OR p_line_style IS NULL) THEN
385 -- print( l_prog_name, '##2##' );
386 x_mapped_stream := NULL;
387 ELSIF p_pt_yn = 'Y' THEN
388 -- print( l_prog_name, '##3##' );
389 --x_mapped_stream := 'PASS THROUGH REVENUE ACCRUAL';
390 --Bug 4434343 - Start of Changes
391 IF (p_line_style = 'FEE') THEN
392 OKL_ISG_UTILS_PVT.get_dependent_stream_type(
393 p_khr_id => p_khr_id,
394 p_deal_type => p_deal_type,
395 p_primary_sty_id => l_primary_sty_id,
396 p_dependent_sty_purpose => 'PASS_THRU_REV_ACCRUAL',
397 x_return_status => x_return_status,
398 x_dependent_sty_id => l_sty_id,
399 x_dependent_sty_name => x_mapped_stream);
400 ELSIF (p_line_style = 'SOLD_SERVICE') OR (p_line_style = 'LINK_SERV_ASSET') THEN
401 OKL_ISG_UTILS_PVT.get_dependent_stream_type(
402 p_khr_id => p_khr_id,
403 p_deal_type => p_deal_type,
404 p_primary_sty_id => l_primary_sty_id,
405 p_dependent_sty_purpose => 'PASS_THRU_SVC_REV_ACCRUAL',
406 x_return_status => x_return_status,
407 x_dependent_sty_id => l_sty_id,
408 x_dependent_sty_name => x_mapped_stream);
409 END IF;
410 --Bug 4434343 - End of Changes
411 ELSIF ((p_line_style = 'SOLD_SERVICE') OR (p_line_style = 'LINK_SERV_ASSET')) THEN
412 -- print( l_prog_name, '##4##' );
413 --x_mapped_stream := 'SERVICE INCOME';
414 OKL_ISG_UTILS_PVT.get_dep_stream_type(
415 p_khr_id => p_khr_id,
416 p_deal_type => p_deal_type,
417 p_primary_sty_id => l_primary_sty_id,
418 p_dependent_sty_purpose => 'SERVICE_INCOME',
419 x_return_status => x_return_status,
420 x_dependent_sty_id => l_sty_id,
421 x_dependent_sty_name => x_mapped_stream,
422 p_get_k_info_rec => p_get_k_info_csr);
423
424 ELSIF (p_line_style IN ('FEE', 'FREE_FORM1') OR p_line_style IS NULL) AND
425 (p_sty_purpose <> 'SECURITY_DEPOSIT') THEN
426
427 If ( p_fee_type = 'INCOME' AND p_recurr_yn = OKL_API.G_FALSE ) Then
428 --x_mapped_stream := 'AMORTIZED FEE INCOME';
429 OKL_ISG_UTILS_PVT.get_dep_stream_type(
430 p_khr_id => p_khr_id,
431 p_deal_type => p_deal_type,
432 p_primary_sty_id => l_primary_sty_id,
433 p_dependent_sty_purpose => 'AMORTIZE_FEE_INCOME',
434 x_return_status => x_return_status,
435 x_dependent_sty_id => l_sty_id,
436 x_dependent_sty_name => x_mapped_stream,
437 p_get_k_info_rec => p_get_k_info_csr);
438
439 elsif ( p_fee_type = 'FINANCED' OR p_fee_type = 'ROLLOVER') Then
440 x_mapped_stream := NULL;
441 else
442 --x_mapped_stream := 'FEE INCOME';
443 OKL_ISG_UTILS_PVT.get_dep_stream_type(
444 p_khr_id => p_khr_id,
445 p_deal_type => p_deal_type,
446 p_primary_sty_id => l_primary_sty_id,
447 p_dependent_sty_purpose => 'ACCRUED_FEE_INCOME',
448 x_return_status => x_return_status,
449 x_dependent_sty_id => l_sty_id,
450 x_dependent_sty_name => x_mapped_stream,
451 p_get_k_info_rec => p_get_k_info_csr);
452
453 end if;
454 ELSE
455 x_mapped_stream := NULL;
456 END IF;
457
458 ELSIF p_mapping_type = 'PRE-TAX INCOME' THEN
459
460 IF (p_deal_type IN ('LOAN', 'LOAN-REVOLVING')) OR
461 ( p_fee_type in ('FINANCED', 'ROLLOVER','LINK_FEE_ASSET') ) THEN
462 --x_mapped_stream := 'PRE-TAX INCOME';
463 OKL_ISG_UTILS_PVT.get_dep_stream_type(
464 p_khr_id => p_khr_id,
465 p_deal_type => p_deal_type,
466 p_primary_sty_id => l_primary_sty_id,
467 p_dependent_sty_purpose => 'INTEREST_INCOME',
468 x_return_status => x_return_status,
469 x_dependent_sty_id => l_sty_id,
470 x_dependent_sty_name => x_mapped_stream,
471 p_get_k_info_rec => p_get_k_info_csr);
472
473 ELSIF (p_deal_type IN ('LEASEDF', 'LEASEST')) THEN
474 --x_mapped_stream := 'PRE-TAX INCOME';
475 OKL_ISG_UTILS_PVT.get_dep_stream_type(
476 p_khr_id => p_khr_id,
477 p_deal_type => p_deal_type,
478 p_primary_sty_id => l_primary_sty_id,
479 p_dependent_sty_purpose => 'LEASE_INCOME',
480 x_return_status => x_return_status,
481 x_dependent_sty_id => l_sty_id,
482 x_dependent_sty_name => x_mapped_stream,
483 p_get_k_info_rec => p_get_k_info_csr);
484
485 ELSE
486 x_mapped_stream := NULL;
487 END IF;
488
489 ELSIF p_mapping_type = 'PAYMENT' THEN
490 IF p_sty_purpose = 'RENT' AND p_deal_type IN ('LOAN', 'LOAN-REVOLVING') THEN
491 x_mapped_stream := 'LOAN PAYMENT';
492 ELSE
493 x_mapped_stream := p_sty_purpose;
494 END IF;
495
496 ELSIF p_mapping_type = 'CAPITAL RECOVERY' THEN
497 IF p_deal_type IN ('LEASEDF', 'LEASEST', 'LOAN', 'LOAN-REVOLVING') THEN
498 x_mapped_stream := 'PRINCIPAL PAYMENT';
499 ELSE
500 x_mapped_stream := NULL;
501 END IF;
502
503 ELSIF p_mapping_type = 'INTEREST PAYMENT' THEN
504 IF p_deal_type IN ('LEASEDF', 'LEASEST', 'LOAN', 'LOAN-REVOLVING') THEN
505 x_mapped_stream := 'INTEREST PAYMENT';
506 ELSE
507 x_mapped_stream := NULL;
508 END IF;
509
510 ELSIF p_mapping_type = 'CLOSE BOOK' THEN
511 IF p_deal_type IN ('LEASEDF', 'LEASEST', 'LOAN', 'LOAN-REVOLVING') THEN
512 x_mapped_stream := 'PRINCIPAL BALANCE';
513 ELSE
514 x_mapped_stream := NULL;
515 END IF;
516
517 ELSIF p_mapping_type = 'DISBURSEMENT' THEN
518 IF p_hdr.pid IS NULL
519 THEN
520 OPEN G_HDR(p_khr_id);
521 FETCH G_HDR INTO r_hdr;
522 CLOSE G_HDR;
523 ELSE
524 r_hdr := p_hdr;
525 END IF;
526
527 If ( p_sty_purpose = 'RENT' ) THen
528 --x_mapped_stream := 'INVESTOR RENT DISBURSEMENT BASIS';
529 OKL_ISG_UTILS_PVT.get_primary_stream_type(
530 p_khr_id => p_khr_id,
531 p_pdt_id => r_hdr.pid,
532 p_primary_sty_purpose => 'INVESTOR_RENT_DISB_BASIS',
533 x_return_status => x_return_status,
534 x_primary_sty_id => l_sty_id,
535 x_primary_sty_name => x_mapped_stream);
536 ElsIf ( p_sty_purpose = 'RESIDUAL' ) Then
537 --x_mapped_stream := 'INVESTOR RESIDUAL DISBURSEMENT BASIS';
538 OKL_ISG_UTILS_PVT.get_primary_stream_type(
539 p_khr_id => p_khr_id,
540 p_pdt_id => r_hdr.pid,
541 p_primary_sty_purpose => 'INVESTOR_RESIDUAL_DISB_BASIS',
542 x_return_status => x_return_status,
543 x_primary_sty_id => l_sty_id,
544 x_primary_sty_name => x_mapped_stream);
545 End If;
546
547 ELSIF p_mapping_type = 'PV_DISBURSEMENT' THEN
548 IF p_hdr.pid IS NULL
549 THEN
550 OPEN G_HDR(p_khr_id);
551 FETCH G_HDR INTO r_hdr;
552 CLOSE G_HDR;
553 ELSE
554 r_hdr := p_hdr;
555 END IF;
556
557 If ( p_sty_purpose = 'RENT' ) THen
558 --x_mapped_stream := 'PRESENT VALUE SECURITIZED RENT';
559 OKL_ISG_UTILS_PVT.get_primary_stream_type(
560 p_khr_id => p_khr_id,
561 p_pdt_id => r_hdr.pid,
562 p_primary_sty_purpose => 'PV_RENT_SECURITIZED',
563 x_return_status => x_return_status,
564 x_primary_sty_id => l_sty_id,
565 x_primary_sty_name => x_mapped_stream);
566 ElsIf ( p_sty_purpose = 'RESIDUAL' ) Then
567 --x_mapped_stream := 'PRESENT VALUE SECURITIZED RESIDUAL';
568 OKL_ISG_UTILS_PVT.get_primary_stream_type(
569 p_khr_id => p_khr_id,
570 p_pdt_id => r_hdr.pid,
571 p_primary_sty_purpose => 'PV_RV_SECURITIZED',
572 x_return_status => x_return_status,
573 x_primary_sty_id => l_sty_id,
574 x_primary_sty_name => x_mapped_stream);
575 End If;
576
577 ELSE
578 x_mapped_stream := NULL;
579 END IF;
580 x_return_status := G_RET_STS_SUCCESS;
581 -- print( l_prog_name, 'end' );
582 EXCEPTION
583
584 WHEN OKL_API.G_EXCEPTION_ERROR THEN
585
586 x_return_status := G_RET_STS_ERROR;
587
588 WHEN OKL_API.G_EXCEPTION_UNEXPECTED_ERROR THEN
589
590 x_return_status := G_RET_STS_UNEXP_ERROR;
591
592 WHEN OTHERS THEN
593
594 OKL_API.SET_MESSAGE (p_app_name => G_APP_NAME,
595 p_msg_name => G_DB_ERROR,
596 p_token1 => G_PROG_NAME_TOKEN,
597 p_token1_value => l_prog_name,
598 p_token2 => G_SQLCODE_TOKEN,
599 p_token2_value => sqlcode,
600 p_token3 => G_SQLERRM_TOKEN,
601 p_token3_value => sqlerrm);
602
603 x_return_status := G_RET_STS_UNEXP_ERROR;
604
605 END get_mapped_stream;
606
607 Procedure print( p_proc_name IN VARCHAR2,
608 p_message IN VARCHAR2,
609 x_return_status IN VARCHAR2) IS
610 Begin
611 NULL;
612 --dbms_output.put_line( p_proc_name||':'||p_message||':'||x_return_status );
613 End;
614
615 Procedure print( p_proc_name IN VARCHAR2,
616 p_message IN VARCHAR2) IS
617 Begin
618 print(p_proc_name, p_message, 'S' );
619 End;
620
621 Procedure generate_stub_element(p_khr_id IN NUMBER,
622 p_deal_type IN VARCHAR2,
623 p_api_version IN NUMBER,
624 p_init_msg_list IN VARCHAR2,
625 x_msg_count OUT NOCOPY NUMBER,
626 x_msg_data OUT NOCOPY VARCHAR2,
627 x_return_status OUT NOCOPY VARCHAR2,
628 x_se_id OUT NOCOPY NUMBER) Is
629
630 l_prog_name CONSTANT VARCHAR2(100) := G_PKG_NAME||'.'||'generate_stub_element';
631 p_selv_tbl OKL_STREAMS_PUB.selv_tbl_type;
632 x_selv_tbl OKL_STREAMS_PUB.selv_tbl_type;
633 p_stmv_rec OKL_STREAMS_PUB.stmv_rec_type;
634 x_stmv_rec OKL_STREAMS_PUB.stmv_rec_type;
635 l_sty_id NUMBER;
636
637 --prasjain:start for bug 5474827
638 /*
639 Cursor c_sty IS
640 SELECT sel.id
641 FROM okl_streams stm,
642 okl_strm_elements sel
643 where stm.khr_id = p_khr_id
644 and stm.say_code = 'HIST'
645 and stm.SGN_CODE = 'MANL'
646 and stm.active_yn = 'N'
647 and stm.purpose_code = 'STUBS'
648 and stm.comments = 'STUB STREAMS'
649 and sel.stm_id = stm.id;
650 */
651 --prasjain:End
652
653
654 error VARCHAR2(256);
655 l_stream_name VARCHAR2(256);
656
657 Begin
658 --print( l_prog_name, ' deal type ' || p_deal_type );
659 -- Utility API to get the Stream Type Id of the RENT Stream Type.
660 OKL_ISG_UTILS_PVT.get_primary_stream_type(
661 p_khr_id => p_khr_id,
662 p_deal_type => p_deal_type,
663 p_primary_sty_purpose => 'RENT',
664 x_return_status => x_return_status,
665 x_primary_sty_id => l_sty_id,
666 x_primary_sty_name => l_stream_name);
667 -- print( l_prog_name, ' stream name ' || l_stream_name );
668 IF x_return_status = OKL_API.G_RET_STS_UNEXP_ERROR THEN
669 RAISE OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
670 ELSIF x_return_status = OKL_API.G_RET_STS_ERROR THEN
671 RAISE OKL_API.G_EXCEPTION_ERROR;
672 END IF;
673
674 -- Creates a new Stream Header record populating the input values passed
675 -- and generates a transaction number for the header.
676 get_stream_header(
677 p_khr_id => p_khr_id,
678 p_kle_id => NULL,
679 p_sty_id => l_sty_id,
680 p_purpose_code => 'STUBS',
681 x_stmv_rec => p_stmv_rec,
682 x_return_status => x_return_status);
683 IF x_return_status = OKL_API.G_RET_STS_UNEXP_ERROR THEN
684 RAISE OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
685 ELSIF x_return_status = OKL_API.G_RET_STS_ERROR THEN
686 RAISE OKL_API.G_EXCEPTION_ERROR;
687 END IF;
688 -- Updating the Stream Header Details as per the need
689 p_stmv_rec.date_history := sysdate ;
690 p_stmv_rec.say_code := 'HIST' ;
691 p_stmv_rec.SGN_CODE := 'MANL';
692 p_stmv_rec.active_yn := 'N';
693 p_stmv_rec.purpose_code := 'STUBS';
694 p_stmv_rec.comments := 'STUB STREAMS';
695 p_stmv_rec.date_history := SYSDATE;
696 -- Updating the Stream Element Details as per the need
697 p_selv_tbl(0).stream_element_date := sysdate;
698 p_selv_tbl(0).amount := 0.0;
699 p_selv_tbl(0).se_line_number := 1 ;
700 p_selv_tbl(0).comments := 'STUB STREAM ELEMENT' ;
701 p_selv_tbl(0).parent_index := 1 ;
702
703 -- Create the Stream Header along with one stream element.
704 --print( l_prog_name, ' b4 create_stub ' || to_char(l_sty_id) );
705 okl_streams_pub.create_streams(
706 p_api_version,
707 p_init_msg_list,
708 x_return_status,
709 x_msg_count,
710 x_msg_data,
711 p_stmv_rec,
712 p_selv_tbl,
713 x_stmv_rec,
714 x_selv_tbl);
715 IF x_return_status = OKL_API.G_RET_STS_UNEXP_ERROR THEN
716 RAISE OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
717 ELSIF x_return_status = OKL_API.G_RET_STS_ERROR THEN
718 RAISE OKL_API.G_EXCEPTION_ERROR;
719 END IF;
720 --print( l_prog_name, ' after create_stub ', x_return_status );
721 --print( l_prog_name, ' # of stubf created ' || to_chaR( x_selv_tbl.COUNT ) );
722 --x_se_id := x_selv_tbl(x_selv_tbl.FIRST).id;
723
724 --prasjain:start for bug 5474827
725 --Populating the stream element id from parameter x_selv_tbl instead of getting from cursor c_sty
726 x_se_id := x_selv_tbl(0).id;
727
728 --Returns the id of the new Stream Created ?????
729 /*
730 OPEN c_sty;
731 FETCH c_sty INTO x_se_id;
732 CLOSE c_sty;
733 */
734 --prasjain:End
735 --print( l_prog_name, ' stub Id ' || to_chaR( x_se_id ) );
736 end generate_stub_element;
737 ---------------------------------------------------------------------------
738 -- PROCEDURE generate_quote_streams
739 ---------------------------------------------------------------------------
740
741 ---------------------------------------------------------------------------
742 PROCEDURE generate_quote_streams(
743 p_api_version IN NUMBER,
744 p_init_msg_list IN VARCHAR2,
745 p_khr_id IN NUMBER,
746 p_kle_id IN NUMBER,
747 x_return_status OUT NOCOPY VARCHAR2,
748 x_msg_count OUT NOCOPY NUMBER,
749 x_msg_data OUT NOCOPY VARCHAR2) IS
750
751 lx_return_status VARCHAR2(1);
752
753
754 l_prog_name CONSTANT VARCHAR2(61) := G_PKG_NAME||'.'||'generate_quote_streams';
755
756 --Added sll.rule_information2 in order by clause by djanaswa for bug 6007644
757 Cursor c_rollover_fee_pmnts ( feeId NUMBER ) IS
758 SELECT DISTINCT
759 cle.id kleId,
760 kle.amount fee_amount,
761 cle.start_date fee_start_date,
762 stm.id styId,
763 sll.object1_id1 frequency,
764 TO_NUMBER(sll.rule_information3) periods,
765 FND_DATE.canonical_to_date(sll.rule_information2) start_date,
766 sll.rule_information5 structure,
767 sll.rule_information10 advance_arrears,
768 FND_NUMBER.canonical_to_number(sll.rule_information6) amount,
769 TO_NUMBER(sll.rule_information7) stub_days,
770 TO_NUMBER(sll.rule_information8) stub_amount
771 FROM okc_k_headers_b chr_so,
772 okc_k_lines_b cle,
773 okl_k_lines kle,
774 okc_line_styles_b lse,
775 okc_rules_b sll,
776 okc_rules_b slh,
777 okc_rule_groups_b rgp,
778 okl_strm_type_b stm
779 WHERE chr_so.id = p_khr_id
780 and cle.sts_code in( 'COMPLETE', 'INCOMPLETE')--'ENTERED'
781 AND cle.dnz_chr_id = chr_so.id
782 AND cle.id = kle.id
783 AND kle.id = feeId
784 AND trunc(cle.START_DATE) = trunc(chr_so.START_DATE)
785 AND cle.lse_id = lse.id
786 AND ((lse.lty_code = 'FEE' AND kle.fee_type = 'ROLLOVER') OR lse.lty_code = 'LINK_FEE_ASSET')
787 AND kle.fee_type <> 'CAPITALIZED'
788 AND cle.id = rgp.cle_id
789 AND rgp.rgd_code = 'LALEVL'
790 AND rgp.id = slh.rgp_id
791 AND slh.rule_information_category = 'LASLH'
792 AND slh.object1_id1 = TO_CHAR(stm.id)
793 AND TO_CHAR(slh.id) = sll.object2_id1
794 AND sll.rule_information_category = 'LASLL'
795 order by cle.id,stm.id, FND_DATE.canonical_to_date(sll.rule_information2);
796
797 r_rollover_fee_pmnts c_rollover_fee_pmnts%ROWTYPE;
798
799 Cursor c_rollover_fee IS
800 SELECT DISTINCT
801 to_char(cle.id) kleId,
802 kle.amount fee_amount,
803 cle.start_date fee_start_date
804 FROM okc_k_headers_b chr_so,
805 okc_k_lines_b cle,
806 okl_k_lines kle,
807 okc_line_styles_b lse
808 WHERE chr_so.id = p_khr_id
809 and cle.sts_code in( 'COMPLETE', 'INCOMPLETE')--'ENTERED'
810 AND cle.dnz_chr_id = chr_so.id
811 AND cle.id = kle.id
812 AND trunc(cle.START_DATE) = trunc(chr_so.START_DATE)
813 AND cle.lse_id = lse.id
814 AND ((lse.lty_code = 'FEE' AND kle.fee_type = 'ROLLOVER') OR lse.lty_code = 'LINK_FEE_ASSET')
815 AND kle.fee_type <> 'CAPITALIZED';
816
817 r_rollover_fee c_rollover_fee%ROWTYPE;
818
819 l_selv_tbl okl_streams_pub.selv_tbl_type;
820 l_tmp_selv_tbl okl_streams_pub.selv_tbl_type;
821 l_pt_tbl okl_streams_pub.selv_tbl_type;
822 lx_selv_tbl okl_streams_pub.selv_tbl_type;
823
824 l_stmv_rec okl_streams_pub.stmv_rec_type;
825 l_pt_rec okl_streams_pub.stmv_rec_type;
826 lx_stmv_rec okl_streams_pub.stmv_rec_type;
827
828 l_capital_cost NUMBER;
829
830 i BINARY_INTEGER := 0;
831 j BINARY_INTEGER := 0;
832
833 l_cle_id NUMBER;
834 l_sty_id NUMBER;
835
836 l_deal_type varchar2(30);
837
838 CURSOR c_hdr IS
839 SELECT chr.template_yn,
840 chr.currency_code,
841 chr.start_date,
842 khr.deal_type,
843 khr.term_duration,
844 NVL(khr.generate_accrual_yn, 'Y')
845 FROM okc_k_headers_b chr,
846 okl_k_headers khr
847 WHERE khr.id = p_khr_id
848 AND chr.id = khr.id;
849
850 l_hdr c_hdr%ROWTYPE;
851
852 l_se_id NUMBER;
853 l_fee_start_date DATE;
854
855 l_principal_tbl okl_streams_pub.selv_tbl_type;
856 l_interest_tbl okl_streams_pub.selv_tbl_type;
857 l_prin_bal_tbl okl_streams_pub.selv_tbl_type;
858 l_termination_tbl okl_streams_pub.selv_tbl_type;
859 l_pre_tax_inc_tbl okl_streams_pub.selv_tbl_type;
860
861 l_interim_interest NUMBER;
862 l_interim_days NUMBER;
863 l_interim_dpp NUMBER;
864 l_asset_iir NUMBER;
865 l_asset_guess_iir NUMBER;
866 l_bkg_yield_guess NUMBER;
867 l_asset_booking_yield NUMBER;
868
869 l_interim_tbl OKL_PRICING_PVT.interim_interest_tbl_type;
870 l_sub_interim_tbl OKL_PRICING_PVT.interim_interest_tbl_type;
871
872 l_principal_id NUMBER;
873 l_interest_id NUMBER;
874 l_prin_bal_id NUMBER;
875 l_termination_id NUMBER;
876 l_pre_tax_inc_id NUMBER;
877
878 l_sty_name VARCHAR2(256);
879 l_has_pmnts VARCHAR2(1);
880
881 --Added by djanaswa for bug 6007644
882 l_recurrence_date DATE := NULL;
883 l_old_sty_id NUMBER;
884 --end djanaswa
885
886
887
888 BEGIN
889
890 OPEN c_hdr;
891 FETCH c_hdr into l_hdr;
892 CLOSE c_hdr;
893
894 l_deal_type := l_hdr.deal_type;
895
896 generate_stub_element( p_api_version => p_api_version,
897 p_init_msg_list => p_init_msg_list,
898 p_deal_type => l_deal_type,
899 p_khr_id => p_khr_id,
900 x_return_status => x_return_status,
901 x_msg_count => x_msg_count,
902 x_msg_data => x_msg_data,
903 x_se_id => l_se_id );
904
905 print( l_prog_name, 'stub', x_return_status );
906 IF x_return_status = OKL_API.G_RET_STS_UNEXP_ERROR THEN
907 RAISE OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
908 ELSIF x_return_status = OKL_API.G_RET_STS_ERROR THEN
909 RAISE OKL_API.G_EXCEPTION_ERROR;
910 END IF;
911
912 For r_rollover_fee in c_rollover_fee
913 LOOP
914
915 print( l_prog_name, ' found a roll fee ', to_char(r_rollover_fee.kleId) );
916
917 update okl_streams
918 set say_code = 'HIST'
919 ,date_history = SYSDATE
920 where khr_id = p_khr_id
921 and kle_id = r_rollover_fee.kleId;
922
923 update okl_streams
924 set active_yn = 'N'
925 where khr_id = p_khr_id
926 and kle_id = r_rollover_fee.kleId;
927
928
929 r_rollover_fee_pmnts := NULL;
930 l_has_pmnts := 'N';
931
932 For r_rollover_fee_pmnts in c_rollover_fee_pmnts ( r_rollover_fee.kleId )
933 LOOP
934 print( l_prog_name, ' foudn a roll fee pmnts ', to_char(r_rollover_fee_pmnts.kleId) );
935
936 l_has_pmnts := 'Y';
937
938 l_cle_id := r_rollover_fee_pmnts.kleId;
939 l_sty_id := r_rollover_fee_pmnts.styId;
940 l_capital_cost := r_rollover_fee_pmnts.fee_amount;
941
942 l_fee_start_date := r_rollover_fee_pmnts.fee_start_date;
943
944 --Added by djanaswa for bug 6007644
945 IF((r_rollover_fee_pmnts.periods IS NULL) AND (r_rollover_fee_pmnts.stub_days IS NOT NULL)) THEN
946 --Set the recurrence date to null for stub payment
947 l_recurrence_date := NULL;
948 ELSIF(l_recurrence_date IS NULL OR l_old_sty_id <> r_rollover_fee_pmnts.styId) THEN
949 --Set the recurrence date as periodic payment level start date
950 l_recurrence_date := r_rollover_fee_pmnts.start_date;
951 END IF;
952 l_old_sty_id := r_rollover_fee_pmnts.styId;
953 --end djanaswa
954
955 --Added parameter p_recurrence_date by djanaswa for bug 6007644
956 get_stream_elements( p_start_date => r_rollover_fee_pmnts.start_date,
957 p_periods => r_rollover_fee_pmnts.periods,
958 p_frequency => r_rollover_fee_pmnts.frequency,
959 p_structure => r_rollover_fee_pmnts.structure,
960 p_advance_or_arrears => r_rollover_fee_pmnts.advance_arrears,
961 p_amount => r_rollover_fee_pmnts.amount,
962 p_stub_days => r_rollover_fee_pmnts.stub_days,
963 p_stub_amount => r_rollover_fee_pmnts.stub_amount,
964 p_currency_code => l_hdr.currency_code,
965 p_khr_id => p_khr_id,
966 p_kle_id => r_rollover_fee_pmnts.kleId,
967 p_purpose_code => NULL,
968 x_selv_tbl => l_tmp_selv_tbl,
969 x_pt_tbl => l_pt_tbl,
970 x_return_status => lx_return_status,
971 x_msg_count => x_msg_count,
972 x_msg_data => x_msg_data,
973 p_recurrence_date => l_recurrence_date);
974 IF lx_return_status = OKL_API.G_RET_STS_UNEXP_ERROR THEN
975 RAISE OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
976 ELSIF lx_return_status = OKL_API.G_RET_STS_ERROR THEN
977 RAISE OKL_API.G_EXCEPTION_ERROR;
978 END IF;
979
980 j := l_selv_tbl.COUNT;
981 For i in l_tmp_selv_tbl.FIRST..l_tmp_selv_tbl.LAST
982 LOOP
983
984 l_selv_tbl(i+j) := l_tmp_selv_tbl(i);
985 If ( r_rollover_fee_pmnts.stub_days IS NOT NULL ) AND ( r_rollover_fee_pmnts.periods IS NULL ) Then
986 l_selv_tbl(i+j).sel_id := l_se_id;
987 End If;
988
989 END LOOP;
990 l_tmp_selv_tbl.DELETE;
991
992 END LOOP;
993
994 If ( l_has_pmnts = 'Y') Then
995
996 get_stream_header(p_khr_id => p_khr_id,
997 p_kle_id => l_cle_id,
998 p_sty_id => l_sty_id,
999 p_purpose_code => NULL,
1000 x_stmv_rec => l_stmv_rec,
1001 x_return_status => lx_return_status);
1002
1003 IF lx_return_status = OKL_API.G_RET_STS_UNEXP_ERROR THEN
1004 RAISE OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
1005 ELSIF lx_return_status = OKL_API.G_RET_STS_ERROR THEN
1006 RAISE OKL_API.G_EXCEPTION_ERROR;
1007 END IF;
1008
1009
1010 lx_return_status := Okl_Streams_Util.round_streams_amount(
1011 p_api_version => g_api_version,
1012 p_init_msg_list => p_init_msg_list,
1013 x_msg_count => x_msg_count,
1014 x_msg_data => x_msg_data,
1015 p_chr_id => p_khr_id,
1016 p_selv_tbl => l_selv_tbl,
1017 x_selv_tbl => lx_selv_tbl);
1018
1019 IF (lx_return_status = G_RET_STS_UNEXP_ERROR) THEN
1020 RAISE OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
1021 ELSIF (lx_return_status = G_RET_STS_ERROR) THEN
1022 RAISE OKL_API.G_EXCEPTION_ERROR;
1023 END IF;
1024
1025 l_selv_tbl.DELETE;
1026 l_selv_tbl := lx_selv_tbl;
1027
1028 l_stmv_rec.say_code := 'CURR';
1029 l_stmv_rec.active_yn := 'Y';
1030 l_stmv_rec.date_current := SYSDATE;
1031
1032 okl_streams_pub.create_streams(p_api_version => G_API_VERSION,
1033 p_init_msg_list => G_FALSE,
1034 x_return_status => lx_return_status,
1035 x_msg_count => x_msg_count,
1036 x_msg_data => x_msg_data,
1037 p_stmv_rec => l_stmv_rec,
1038 p_selv_tbl => l_selv_tbl,
1039 x_stmv_rec => lx_stmv_rec,
1040 x_selv_tbl => lx_selv_tbl);
1041
1042 IF lx_return_status = OKL_API.G_RET_STS_UNEXP_ERROR THEN
1043 RAISE OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
1044 ELSIF lx_return_status = OKL_API.G_RET_STS_ERROR THEN
1045 RAISE OKL_API.G_EXCEPTION_ERROR;
1046 END IF;
1047
1048 print( l_prog_name, 'amortize with capital cost ' || to_char(l_capital_cost) );
1049
1050 OKL_PRICING_PVT.get_quote_amortization(
1051 p_khr_id => p_khr_id,
1052 p_kle_id => l_cle_id,
1053 p_investment => l_capital_cost,
1054 p_residual_value => 0,
1055 p_start_date => l_hdr.start_date,
1056 p_asset_start_date => l_fee_start_date,
1057 p_term_duration => l_hdr.term_duration,
1058 x_principal_tbl => l_principal_tbl,
1059 x_interest_tbl => l_interest_tbl,
1060 x_prin_bal_tbl => l_prin_bal_tbl,
1061 x_termination_tbl => l_termination_tbl,
1062 x_pre_tax_inc_tbl => l_pre_tax_inc_tbl,
1063 x_interim_interest => l_interim_interest,
1064 x_interim_days => l_interim_days,
1065 x_interim_dpp => l_interim_dpp,
1066 x_iir => l_asset_iir,
1067 x_booking_yield => l_asset_booking_yield,
1068 x_return_status => lx_return_status);
1069
1070 print( l_prog_name, 'amortize ', lx_return_status );
1071
1072 IF lx_return_status = OKL_API.G_RET_STS_UNEXP_ERROR THEN
1073 RAISE OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
1074 ELSIF lx_return_status = OKL_API.G_RET_STS_ERROR THEN
1075 RAISE OKL_API.G_EXCEPTION_ERROR;
1076 END IF;
1077
1078
1079 OKL_ISG_UTILS_PVT.get_dependent_stream_type(
1080 p_khr_id => p_khr_id,
1081 p_deal_type => l_deal_type,
1082 p_dependent_sty_purpose => 'INTEREST_INCOME',
1083 x_return_status => x_return_status,
1084 x_dependent_sty_id => l_pre_tax_inc_id,
1085 x_dependent_sty_name => l_sty_name);
1086
1087 IF x_return_status = OKL_API.G_RET_STS_UNEXP_ERROR THEN
1088 RAISE OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
1089 ELSIF x_return_status = OKL_API.G_RET_STS_ERROR THEN
1090 RAISE OKL_API.G_EXCEPTION_ERROR;
1091 END IF;
1092
1093 OKL_ISG_UTILS_PVT.get_dependent_stream_type(
1094 p_khr_id => p_khr_id,
1095 p_deal_type => l_deal_type,
1096 p_dependent_sty_purpose => 'INTEREST_PAYMENT',
1097 x_return_status => lx_return_status,
1098 x_dependent_sty_id => l_interest_id,
1099 x_dependent_sty_name => l_sty_name);
1100
1101 IF lx_return_status = OKL_API.G_RET_STS_UNEXP_ERROR THEN
1102 RAISE OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
1103 ELSIF lx_return_status = OKL_API.G_RET_STS_ERROR THEN
1104 RAISE OKL_API.G_EXCEPTION_ERROR;
1105 END IF;
1106
1107 OKL_ISG_UTILS_PVT.get_dependent_stream_type(
1108 p_khr_id => p_khr_id,
1109 p_deal_type => l_deal_type,
1110 p_dependent_sty_purpose => 'PRINCIPAL_PAYMENT',
1111 x_return_status => lx_return_status,
1112 x_dependent_sty_id => l_principal_id,
1113 x_dependent_sty_name => l_sty_name);
1114
1115 IF lx_return_status = OKL_API.G_RET_STS_UNEXP_ERROR THEN
1116 RAISE OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
1117 ELSIF lx_return_status = OKL_API.G_RET_STS_ERROR THEN
1118 RAISE OKL_API.G_EXCEPTION_ERROR;
1119 END IF;
1120
1121 OKL_ISG_UTILS_PVT.get_dependent_stream_type(
1122 p_khr_id => p_khr_id,
1123 p_deal_type => l_deal_type,
1124 p_dependent_sty_purpose => 'PRINCIPAL_BALANCE',
1125 x_return_status => lx_return_status,
1126 x_dependent_sty_id => l_prin_bal_id,
1127 x_dependent_sty_name => l_sty_name);
1128
1129 IF lx_return_status = OKL_API.G_RET_STS_UNEXP_ERROR THEN
1130 RAISE OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
1131 ELSIF lx_return_status = OKL_API.G_RET_STS_ERROR THEN
1132 RAISE OKL_API.G_EXCEPTION_ERROR;
1133 END IF;
1134
1135 OKL_ISG_UTILS_PVT.get_dependent_stream_type(
1136 p_khr_id => p_khr_id,
1137 p_deal_type => l_deal_type,
1138 p_dependent_sty_purpose => 'TERMINATION_VALUE',
1139 x_return_status => lx_return_status,
1140 x_dependent_sty_id => l_termination_id,
1141 x_dependent_sty_name => l_sty_name);
1142
1143 IF lx_return_status = OKL_API.G_RET_STS_UNEXP_ERROR THEN
1144 RAISE OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
1145 ELSIF lx_return_status = OKL_API.G_RET_STS_ERROR THEN
1146 RAISE OKL_API.G_EXCEPTION_ERROR;
1147 END IF;
1148
1149 IF l_principal_tbl.COUNT > 0 AND (l_principal_id IS NOT NULL) Then
1150
1151 get_stream_header(p_khr_id => p_khr_id,
1152 p_kle_id => l_cle_id,
1153 p_sty_id => l_principal_id,
1154 p_purpose_code => NULL,
1155 x_stmv_rec => l_stmv_rec,
1156 x_return_status => lx_return_status);
1157
1158 IF lx_return_status = OKL_API.G_RET_STS_UNEXP_ERROR THEN
1159 RAISE OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
1160 ELSIF lx_return_status = OKL_API.G_RET_STS_ERROR THEN
1161 RAISE OKL_API.G_EXCEPTION_ERROR;
1162 END IF;
1163
1164
1165 l_stmv_rec.say_code := 'CURR';
1166 l_stmv_rec.active_yn := 'Y';
1167 l_stmv_rec.date_current := SYSDATE;
1168
1169 lx_return_status := Okl_Streams_Util.round_streams_amount(
1170 p_api_version => g_api_version,
1171 p_init_msg_list => p_init_msg_list,
1172 x_msg_count => x_msg_count,
1173 x_msg_data => x_msg_data,
1174 p_chr_id => p_khr_id,
1175 p_selv_tbl => l_principal_tbl,
1176 x_selv_tbl => lx_selv_tbl);
1177
1178 IF (lx_return_status = G_RET_STS_UNEXP_ERROR) THEN
1179 RAISE OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
1180 ELSIF (lx_return_status = G_RET_STS_ERROR) THEN
1181 RAISE OKL_API.G_EXCEPTION_ERROR;
1182 END IF;
1183
1184 l_principal_tbl.DELETE;
1185 l_principal_tbl := lx_selv_tbl;
1186
1187 okl_streams_pub.create_streams(p_api_version => G_API_VERSION,
1188 p_init_msg_list => G_FALSE,
1189 x_return_status => lx_return_status,
1190 x_msg_count => x_msg_count,
1191 x_msg_data => x_msg_data,
1192 p_stmv_rec => l_stmv_rec,
1193 p_selv_tbl => l_principal_tbl,
1194 x_stmv_rec => lx_stmv_rec,
1195 x_selv_tbl => lx_selv_tbl);
1196
1197 IF lx_return_status = OKL_API.G_RET_STS_UNEXP_ERROR THEN
1198 RAISE OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
1199 ELSIF lx_return_status = OKL_API.G_RET_STS_ERROR THEN
1200 RAISE OKL_API.G_EXCEPTION_ERROR;
1201 END IF;
1202
1203 END IF;
1204
1205 IF l_interest_tbl.COUNT > 0 AND ( l_interest_id IS NOT NULL) Then
1206
1207 get_stream_header(p_khr_id => p_khr_id,
1208 p_kle_id => l_cle_id,
1209 p_sty_id => l_interest_id,
1210 p_purpose_code => NULL,
1211 x_stmv_rec => l_stmv_rec,
1212 x_return_status => lx_return_status);
1213
1214 IF lx_return_status = OKL_API.G_RET_STS_UNEXP_ERROR THEN
1215 RAISE OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
1216 ELSIF lx_return_status = OKL_API.G_RET_STS_ERROR THEN
1217 RAISE OKL_API.G_EXCEPTION_ERROR;
1218 END IF;
1219
1220
1221 l_stmv_rec.say_code := 'CURR';
1222 l_stmv_rec.active_yn := 'Y';
1223 l_stmv_rec.date_current := SYSDATE;
1224
1225 lx_return_status := Okl_Streams_Util.round_streams_amount(
1226 p_api_version => g_api_version,
1227 p_init_msg_list => p_init_msg_list,
1228 x_msg_count => x_msg_count,
1229 x_msg_data => x_msg_data,
1230 p_chr_id => p_khr_id,
1231 p_selv_tbl => l_interest_tbl,
1232 x_selv_tbl => lx_selv_tbl);
1233
1234 IF (lx_return_status = G_RET_STS_UNEXP_ERROR) THEN
1235 RAISE OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
1236 ELSIF (lx_return_status = G_RET_STS_ERROR) THEN
1237 RAISE OKL_API.G_EXCEPTION_ERROR;
1238 END IF;
1239
1240 l_interest_tbl.DELETE;
1241 l_interest_tbl := lx_selv_tbl;
1242
1243 okl_streams_pub.create_streams(p_api_version => G_API_VERSION,
1244 p_init_msg_list => G_FALSE,
1245 x_return_status => lx_return_status,
1246 x_msg_count => x_msg_count,
1247 x_msg_data => x_msg_data,
1248 p_stmv_rec => l_stmv_rec,
1249 p_selv_tbl => l_interest_tbl,
1250 x_stmv_rec => lx_stmv_rec,
1251 x_selv_tbl => lx_selv_tbl);
1252
1253 IF lx_return_status = OKL_API.G_RET_STS_UNEXP_ERROR THEN
1254 RAISE OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
1255 ELSIF lx_return_status = OKL_API.G_RET_STS_ERROR THEN
1256 RAISE OKL_API.G_EXCEPTION_ERROR;
1257 END IF;
1258
1259 END IF;
1260
1261 IF l_prin_bal_tbl.COUNT > 0 AND (l_prin_bal_id IS NOT NULL) Then
1262
1263 get_stream_header(p_khr_id => p_khr_id,
1264 p_kle_id => l_cle_id,
1265 p_sty_id => l_prin_bal_id,
1266 p_purpose_code => NULL,
1267 x_stmv_rec => l_stmv_rec,
1268 x_return_status => lx_return_status);
1269
1270 IF lx_return_status = OKL_API.G_RET_STS_UNEXP_ERROR THEN
1271 RAISE OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
1272 ELSIF lx_return_status = OKL_API.G_RET_STS_ERROR THEN
1273 RAISE OKL_API.G_EXCEPTION_ERROR;
1274 END IF;
1275
1276
1277 l_stmv_rec.say_code := 'CURR';
1278 l_stmv_rec.active_yn := 'Y';
1279 l_stmv_rec.date_current := SYSDATE;
1280
1281 lx_return_status := Okl_Streams_Util.round_streams_amount(
1282 p_api_version => g_api_version,
1283 p_init_msg_list => p_init_msg_list,
1284 x_msg_count => x_msg_count,
1285 x_msg_data => x_msg_data,
1286 p_chr_id => p_khr_id,
1287 p_selv_tbl => l_prin_bal_tbl,
1288 x_selv_tbl => lx_selv_tbl);
1289
1290 IF (lx_return_status = G_RET_STS_UNEXP_ERROR) THEN
1291 RAISE OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
1292 ELSIF (lx_return_status = G_RET_STS_ERROR) THEN
1293 RAISE OKL_API.G_EXCEPTION_ERROR;
1294 END IF;
1295
1296 l_prin_bal_tbl.DELETE;
1297 l_prin_bal_tbl := lx_selv_tbl;
1298
1299 okl_streams_pub.create_streams(p_api_version => G_API_VERSION,
1300 p_init_msg_list => G_FALSE,
1301 x_return_status => lx_return_status,
1302 x_msg_count => x_msg_count,
1303 x_msg_data => x_msg_data,
1304 p_stmv_rec => l_stmv_rec,
1305 p_selv_tbl => l_prin_bal_tbl,
1306 x_stmv_rec => lx_stmv_rec,
1307 x_selv_tbl => lx_selv_tbl);
1308
1309 IF lx_return_status = OKL_API.G_RET_STS_UNEXP_ERROR THEN
1310 RAISE OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
1311 ELSIF lx_return_status = OKL_API.G_RET_STS_ERROR THEN
1312 RAISE OKL_API.G_EXCEPTION_ERROR;
1313 END IF;
1314
1315 END IF;
1316
1317 IF l_termination_tbl.COUNT > 0 AND (l_termination_id IS NOT NULL) THEN
1318
1319 get_stream_header(p_khr_id => p_khr_id,
1320 p_kle_id => l_cle_id,
1321 p_sty_id => l_termination_id,
1322 p_purpose_code => NULL,
1323 x_stmv_rec => l_stmv_rec,
1324 x_return_status => lx_return_status);
1325
1326 IF lx_return_status = OKL_API.G_RET_STS_UNEXP_ERROR THEN
1327 RAISE OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
1328 ELSIF lx_return_status = OKL_API.G_RET_STS_ERROR THEN
1329 RAISE OKL_API.G_EXCEPTION_ERROR;
1330 END IF;
1331
1332
1333 l_stmv_rec.say_code := 'CURR';
1334 l_stmv_rec.active_yn := 'Y';
1335 l_stmv_rec.date_current := SYSDATE;
1336
1337 lx_return_status := Okl_Streams_Util.round_streams_amount(
1338 p_api_version => g_api_version,
1339 p_init_msg_list => p_init_msg_list,
1340 x_msg_count => x_msg_count,
1341 x_msg_data => x_msg_data,
1342 p_chr_id => p_khr_id,
1343 p_selv_tbl => l_termination_tbl,
1344 x_selv_tbl => lx_selv_tbl);
1345
1346 IF (lx_return_status = G_RET_STS_UNEXP_ERROR) THEN
1347 RAISE OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
1348 ELSIF (lx_return_status = G_RET_STS_ERROR) THEN
1349 RAISE OKL_API.G_EXCEPTION_ERROR;
1350 END IF;
1351
1352 l_termination_tbl.DELETE;
1353 l_termination_tbl := lx_selv_tbl;
1354
1355 okl_streams_pub.create_streams(p_api_version => G_API_VERSION,
1356 p_init_msg_list => G_FALSE,
1357 x_return_status => lx_return_status,
1358 x_msg_count => x_msg_count,
1359 x_msg_data => x_msg_data,
1360 p_stmv_rec => l_stmv_rec,
1361 p_selv_tbl => l_termination_tbl,
1362 x_stmv_rec => lx_stmv_rec,
1363 x_selv_tbl => lx_selv_tbl);
1364
1365 IF lx_return_status = OKL_API.G_RET_STS_UNEXP_ERROR THEN
1366 RAISE OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
1367 ELSIF lx_return_status = OKL_API.G_RET_STS_ERROR THEN
1368 RAISE OKL_API.G_EXCEPTION_ERROR;
1369 END IF;
1370
1371 END IF;
1372
1373 IF l_pre_tax_inc_tbl.COUNT > 0 AND l_pre_tax_inc_id IS NOT NULL THEN
1374
1375 get_stream_header(p_khr_id => p_khr_id,
1376 p_kle_id => l_cle_id,
1377 p_sty_id => l_pre_tax_inc_id,
1378 p_purpose_code => NULL,
1379 x_stmv_rec => l_stmv_rec,
1380 x_return_status => lx_return_status);
1381
1382 IF lx_return_status = OKL_API.G_RET_STS_UNEXP_ERROR THEN
1383 RAISE OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
1384 ELSIF lx_return_status = OKL_API.G_RET_STS_ERROR THEN
1385 RAISE OKL_API.G_EXCEPTION_ERROR;
1386 END IF;
1387
1388 l_stmv_rec.say_code := 'CURR';
1389 l_stmv_rec.active_yn := 'Y';
1390 l_stmv_rec.date_current := SYSDATE;
1391
1392
1393 lx_return_status := Okl_Streams_Util.round_streams_amount(
1394 p_api_version => g_api_version,
1395 p_init_msg_list => p_init_msg_list,
1396 x_msg_count => x_msg_count,
1397 x_msg_data => x_msg_data,
1398 p_chr_id => p_khr_id,
1399 p_selv_tbl => l_pre_tax_inc_tbl,
1400 x_selv_tbl => lx_selv_tbl);
1401
1402 IF (lx_return_status = G_RET_STS_UNEXP_ERROR) THEN
1403 RAISE OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
1404 ELSIF (lx_return_status = G_RET_STS_ERROR) THEN
1405 RAISE OKL_API.G_EXCEPTION_ERROR;
1406 END IF;
1407
1408 l_pre_tax_inc_tbl.DELETE;
1409 l_pre_tax_inc_tbl := lx_selv_tbl;
1410
1411 okl_streams_pub.create_streams(p_api_version => G_API_VERSION,
1412 p_init_msg_list => G_FALSE,
1413 x_return_status => lx_return_status,
1414 x_msg_count => x_msg_count,
1415 x_msg_data => x_msg_data,
1416 p_stmv_rec => l_stmv_rec,
1417 p_selv_tbl => l_pre_tax_inc_tbl,
1418 x_stmv_rec => lx_stmv_rec,
1419 x_selv_tbl => lx_selv_tbl);
1420
1421 IF lx_return_status = OKL_API.G_RET_STS_UNEXP_ERROR THEN
1422 RAISE OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
1423 ELSIF lx_return_status = OKL_API.G_RET_STS_ERROR THEN
1424 RAISE OKL_API.G_EXCEPTION_ERROR;
1425 END IF;
1426
1427 END IF;
1428
1429 -- Clear out data structures
1430
1431 l_principal_tbl.delete;
1432 l_interest_tbl.delete;
1433 l_prin_bal_tbl.delete;
1434 l_termination_tbl.delete;
1435 l_pre_tax_inc_tbl.delete;
1436
1437 End If;
1438
1439 END LOOP;
1440
1441 EXCEPTION
1442
1443 WHEN OKL_API.G_EXCEPTION_ERROR THEN
1444
1445 x_return_status := G_RET_STS_ERROR;
1446
1447 WHEN OKL_API.G_EXCEPTION_UNEXPECTED_ERROR THEN
1448
1449 x_return_status := G_RET_STS_UNEXP_ERROR;
1450
1451 WHEN OTHERS THEN
1452
1453 OKL_API.SET_MESSAGE (p_app_name => G_APP_NAME,
1454 p_msg_name => G_DB_ERROR,
1455 p_token1 => G_PROG_NAME_TOKEN,
1456 p_token1_value => l_prog_name,
1457 p_token2 => G_SQLCODE_TOKEN,
1458 p_token2_value => sqlcode,
1459 p_token3 => G_SQLERRM_TOKEN,
1460 p_token3_value => sqlerrm);
1461
1462 x_return_status := G_RET_STS_UNEXP_ERROR;
1463
1464 END generate_quote_streams;
1465
1466 PROCEDURE get_present_value( p_api_version IN NUMBER,
1467 p_init_msg_list IN VARCHAR2,
1468 p_amount_date IN DATE,
1469 p_amount IN NUMBER,
1470 p_frequency IN VARCHAR2 DEFAULT 'M',
1471 p_rate IN NUMBER,
1472 p_pv_date IN DATE,
1473 p_day_convention_month IN VARCHAR2 DEFAULT '30',
1474 p_day_convention_year IN VARCHAR2 DEFAULT '360',
1475 x_pv_amount OUT NOCOPY NUMBER,
1476 x_return_status OUT NOCOPY VARCHAR2,
1477 x_msg_count OUT NOCOPY NUMBER,
1478 x_msg_data OUT NOCOPY VARCHAR2) IS
1479
1480 l_days NUMBER;
1481 l_periods NUMBER;
1482 l_cf_dpp NUMBER;
1483 l_cf_ppy NUMBER;
1484
1485 l_prog_name CONSTANT VARCHAR2(61) := 'get_present_value';
1486
1487 Begin
1488 --print(l_prog_name, 'begin' );
1489 l_days := OKL_PRICING_UTILS_PVT.get_day_count (p_start_date => p_pv_date,
1490 p_days_in_month => p_day_convention_month,
1491 p_days_in_year => p_day_convention_year,
1492 p_end_date => p_amount_date,
1493 p_arrears => 'N',
1494 x_return_status => x_return_status);
1495
1496 IF x_return_status = OKL_API.G_RET_STS_UNEXP_ERROR THEN
1497 RAISE OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
1498 ELSIF x_return_status = OKL_API.G_RET_STS_ERROR THEN
1499 RAISE OKL_API.G_EXCEPTION_ERROR;
1500 END IF;
1501
1502
1503 IF p_frequency = 'M' THEN
1504 l_cf_dpp := 30;
1505 l_cf_ppy := 12;
1506 ELSIF p_frequency = 'Q' THEN
1507 l_cf_dpp := 90;
1508 l_cf_ppy := 4;
1509 ELSIF p_frequency = 'S' THEN
1510 l_cf_dpp := 180;
1511 l_cf_ppy := 2;
1512 ELSIF p_frequency = 'A' THEN
1513 l_cf_dpp := 360;
1514 l_cf_ppy := 1;
1515 ELSE
1516 l_cf_dpp := 30;
1517 l_cf_ppy := 12;
1518 END IF;
1519
1520 l_periods := l_days/l_cf_dpp;
1521 x_pv_amount := p_amount / POWER( 1 + (p_rate/(l_cf_ppy*100)), l_periods );
1522
1523 --print(l_prog_name, 'end' );
1524 EXCEPTION
1525 WHEN OKL_API.G_EXCEPTION_ERROR
1526 THEN
1527 x_return_status := G_RET_STS_ERROR;
1528
1529 WHEN OKL_API.G_EXCEPTION_UNEXPECTED_ERROR THEN
1530
1531 x_return_status := G_RET_STS_UNEXP_ERROR;
1532
1533 WHEN OTHERS THEN
1534
1535 OKL_API.SET_MESSAGE (p_app_name => G_APP_NAME,
1536 p_msg_name => G_DB_ERROR,
1537 p_token1 => G_PROG_NAME_TOKEN,
1538 p_token1_value => l_prog_name,
1539 p_token2 => G_SQLCODE_TOKEN,
1540 p_token2_value => sqlcode,
1541 p_token3 => G_SQLERRM_TOKEN,
1542 p_token3_value => sqlerrm);
1543
1544 x_return_status := G_RET_STS_UNEXP_ERROR;
1545
1546 End get_present_value;
1547
1548 PROCEDURE get_present_value(
1549 p_api_version IN NUMBER,
1550 p_init_msg_list IN VARCHAR2,
1551 p_cash_flow_tbl IN cash_flow_tbl,
1552 p_rate IN NUMBER,
1553 p_pv_date IN DATE,
1554 p_day_convention_month IN VARCHAR2 DEFAULT '30',
1555 p_day_convention_year IN VARCHAR2 DEFAULT '360',
1556 x_pv_amount OUT NOCOPY NUMBER,
1557 x_return_status OUT NOCOPY VARCHAR2,
1558 x_msg_count OUT NOCOPY NUMBER,
1559 x_msg_data OUT NOCOPY VARCHAR2) IS
1560
1561 l_prog_name CONSTANT VARCHAR2(61) := 'get_present_value';
1562 i BINARY_INTEGER;
1563
1564 l_pv_amount NUMBER := 0;
1565
1566 BEGIN
1567 --print(l_prog_name, 'begin' );
1568 x_pv_amount := 0;
1569 FOR i in p_cash_flow_tbl.FIRST..p_cash_flow_tbl.LAST
1570 LOOP
1571 get_present_value(
1572 p_api_version => p_api_version,
1573 p_init_msg_list => p_init_msg_list,
1574 p_amount_date => p_cash_flow_tbl(i).cf_date,
1575 p_amount => p_cash_flow_tbl(i).cf_amount,
1576 p_frequency => nvl(p_cash_flow_tbl(i).cf_frequency, 'M'),
1577 p_rate => p_rate,
1578 p_pv_date => p_pv_date,
1579 p_day_convention_month => p_day_convention_month,
1580 p_day_convention_year => p_day_convention_year,
1581 x_pv_amount => l_pv_amount,
1582 x_return_status => x_return_status,
1583 x_msg_count => x_msg_count,
1584 x_msg_data => x_msg_data);
1585 x_pv_amount := x_pv_amount + l_pv_amount;
1586 END LOOP;
1587 --print(l_prog_name, 'end' );
1588
1589 EXCEPTION
1590 WHEN OKL_API.G_EXCEPTION_ERROR THEN
1591 x_return_status := G_RET_STS_ERROR;
1592 WHEN OKL_API.G_EXCEPTION_UNEXPECTED_ERROR THEN
1593 x_return_status := G_RET_STS_UNEXP_ERROR;
1594 WHEN OTHERS THEN
1595 OKL_API.SET_MESSAGE (p_app_name => G_APP_NAME,
1596 p_msg_name => G_DB_ERROR,
1597 p_token1 => G_PROG_NAME_TOKEN,
1598 p_token1_value => l_prog_name,
1599 p_token2 => G_SQLCODE_TOKEN,
1600 p_token2_value => sqlcode,
1601 p_token3 => G_SQLERRM_TOKEN,
1602 p_token3_value => sqlerrm);
1603
1604 x_return_status := G_RET_STS_UNEXP_ERROR;
1605 END get_present_value;
1606
1607 PROCEDURE get_amortized_accruals ( p_khr_id IN NUMBER,
1608 p_currency_code IN VARCHAR2,
1609 p_start_date IN DATE,
1610 p_end_date IN DATE,
1611 p_deal_type IN VARCHAR2,
1612 p_amount IN NUMBER,
1613 x_selv_tbl OUT NOCOPY okl_sel_pvt.selv_tbl_type,
1614 x_return_status OUT NOCOPY VARCHAR2) IS
1615
1616 l_prog_name CONSTANT VARCHAR2(61) := G_PKG_NAME||'.'||'get_amortized_accruals';
1617
1618 CURSOR c_k_income (p_sty_name VARCHAR2) IS
1619 SELECT sel.amount income_amount,
1620 sel.stream_element_date income_date
1621 FROM okl_strm_elements sel,
1622 okl_streams stm,
1623 okl_strm_type_b sty,
1624 okl_strm_type_tl styt
1625 WHERE stm.khr_id = p_khr_id
1626 AND stm.say_code = 'WORK'
1627 AND stm.id = sel.stm_id
1628 AND stm.sty_id = sty.id
1629 AND sty.version = '1.0'
1630 AND sty.id = styt.id
1631 AND styt.language = 'US'
1632 AND styt.name = p_sty_name
1633 AND sel.stream_element_date >= p_start_date
1634 AND sel.stream_element_date <= LAST_DAY(p_end_date) --bug# 3379436
1635 ORDER BY sel.stream_element_date;
1636
1637 l_selv_tbl okl_streams_pub.selv_tbl_type;
1638 lx_selv_tbl okl_streams_pub.selv_tbl_type;
1639
1640 l_stmv_rec okl_streams_pub.stmv_rec_type;
1641 lx_stmv_rec okl_streams_pub.stmv_rec_type;
1642
1643 l_amortized_exp_id NUMBER;
1644 l_sty_name VARCHAR2(150);
1645 l_sty_id NUMBER;
1646 l_name VARCHAR2(150);
1647 l_total_rent_income NUMBER := 0;
1648 i BINARY_INTEGER := 0;
1649
1650 lx_return_status VARCHAR2(1);
1651 lx_msg_data VARCHAR2(4000);
1652 lx_msg_count NUMBER;
1653
1654 TYPE inc_strms_rec_type is RECORD
1655 ( amount NUMBER,
1656 ele_date DATE
1657 );
1658
1659 TYPE inc_strms_tbl_type is TABLE OF
1660 inc_strms_rec_type INDEX BY BINARY_INTEGER;
1661
1662 inc_strms_tbl inc_strms_tbl_type;
1663 lastDate DATE := NULL;
1664 Cursor c_rollover_pmnts IS
1665 Select distinct nvl(slh.object1_id1, -1) styId
1666 From OKC_RULE_GROUPS_B rgp,
1667 OKC_RULES_B sll,
1668 okc_rules_b slh,
1669 okl_strm_type_b sty
1670 Where slh.rgp_id = rgp.id
1671 and rgp.RGD_CODE = 'LALEVL'
1672 and sll.RULE_INFORMATION_CATEGORY = 'LASLL'
1673 and slh.RULE_INFORMATION_CATEGORY = 'LASLH'
1674 AND TO_CHAR(slh.id) = sll.object2_id1
1675 and slh.object1_id1 = sty.id
1676 and sty.stream_type_purpose = 'RENT'
1677 and rgp.dnz_chr_id = p_khr_id;
1678 r_rollover_pmnts c_rollover_pmnts%ROWTYPE;
1679 l_primary_sty_id NUMBER;
1680 BEGIN
1681 print( l_prog_name, 'begin' );
1682
1683 OPEN c_rollover_pmnts;
1684 FETCH c_rollover_pmnts INTO r_rollover_pmnts;
1685 CLOSE c_rollover_pmnts;
1686
1687 l_primary_sty_id := r_rollover_pmnts.styId;
1688
1689 IF p_deal_type = 'LEASEOP' THEN
1690 --l_sty_name := 'RENTAL ACCRUAL';
1691 OKL_ISG_UTILS_PVT.get_dependent_stream_type(
1692 p_khr_id => p_khr_id,
1693 p_deal_type => p_deal_type,
1694 p_primary_sty_id => l_primary_sty_id,
1695 p_dependent_sty_purpose => 'RENT_ACCRUAL',
1696 x_return_status => x_return_status,
1697 x_dependent_sty_id => l_sty_id,
1698 x_dependent_sty_name => l_sty_name);
1699
1700 IF x_return_status = OKL_API.G_RET_STS_UNEXP_ERROR THEN
1701 RAISE OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
1702 ELSIF x_return_status = OKL_API.G_RET_STS_ERROR THEN
1703 RAISE OKL_API.G_EXCEPTION_ERROR;
1704 END IF;
1705 ELSIF p_deal_type IN ('LEASEDF', 'LEASEST') THEN
1706 --l_sty_name := 'PRE-TAX INCOME';
1707 OKL_ISG_UTILS_PVT.get_dependent_stream_type(
1708 p_khr_id => p_khr_id,
1709 p_deal_type => p_deal_type,
1710 p_primary_sty_id => l_primary_sty_id,
1711 p_dependent_sty_purpose => 'LEASE_INCOME',
1712 x_return_status => x_return_status,
1713 x_dependent_sty_id => l_sty_id,
1714 x_dependent_sty_name => l_sty_name);
1715
1716 IF x_return_status = OKL_API.G_RET_STS_UNEXP_ERROR THEN
1717 RAISE OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
1718 ELSIF x_return_status = OKL_API.G_RET_STS_ERROR THEN
1719 RAISE OKL_API.G_EXCEPTION_ERROR;
1720 END IF;
1721
1722 ELSIF p_deal_type IN ('LOAN', 'LOAN-REVOLVING') THEN
1723 --l_sty_name := 'PRE-TAX INCOME';
1724 OKL_ISG_UTILS_PVT.get_dependent_stream_type(
1725 p_khr_id => p_khr_id,
1726 p_deal_type => p_deal_type,
1727 p_primary_sty_id => l_primary_sty_id,
1728 p_dependent_sty_purpose => 'INTEREST_INCOME',
1729 x_return_status => x_return_status,
1730 x_dependent_sty_id => l_sty_id,
1731 x_dependent_sty_name => l_sty_name);
1732
1733 IF x_return_status = OKL_API.G_RET_STS_UNEXP_ERROR THEN
1734 RAISE OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
1735 ELSIF x_return_status = OKL_API.G_RET_STS_ERROR THEN
1736 RAISE OKL_API.G_EXCEPTION_ERROR;
1737 END IF;
1738
1739 END IF;
1740
1741 print( l_prog_name, ' income stream ' || l_sty_name );
1742
1743 i := 0;
1744 FOR l_k_income IN c_k_income(p_sty_name => l_sty_name) LOOP
1745 l_total_rent_income := l_total_rent_income + l_k_income.income_amount;
1746 If ( trunc(l_k_income.income_date) =
1747 trunc(nvl(lastDate, l_k_income.income_date+1) )) Then
1748 inc_strms_tbl(i).amount := inc_strms_tbl(i).amount + l_k_income.income_amount;
1749 Else
1750 i := i + 1;
1751 inc_strms_tbl(i).amount := l_k_income.income_amount;
1752 inc_strms_tbl(i).ele_date := l_K_income.income_date;
1753 lastDate := l_K_income.income_date;
1754 End If;
1755 END LOOP;
1756
1757
1758 print( l_prog_name, ' l_total_rent_income ' || to_char( l_total_rent_income) );
1759 print( l_prog_name, ' amount 2 b amort ' || to_char( p_amount) );
1760 IF NVL(p_amount, 0) > 0 THEN
1761
1762
1763 FOR i IN 1..inc_strms_tbl.count
1764 LOOP
1765
1766
1767 l_selv_tbl(i).stream_element_date := inc_strms_tbl(i).ele_date;
1768 l_selv_tbl(i).se_line_number := i;
1769
1770 --bug 6751635 veramach start
1771 IF(inc_strms_tbl(i).amount = 0 OR l_total_rent_income = 0) THEN
1772 l_selv_tbl(i).amount := 0;
1773 ELSE
1774 l_selv_tbl(i).amount :=
1775 (inc_strms_tbl(i).amount/l_total_rent_income)*p_amount;
1776 END IF;
1777 --bug 6751635 veramach end
1778
1779 END LOOP;
1780
1781 x_selv_tbl := l_selv_tbl;
1782
1783 i := 0;
1784
1785 END IF;
1786
1787 x_return_status := G_RET_STS_SUCCESS;
1788 print( l_prog_name, 'end' );
1789
1790 EXCEPTION
1791
1792 WHEN OKL_API.G_EXCEPTION_ERROR THEN
1793
1794 x_return_status := G_RET_STS_ERROR;
1795
1796 WHEN OKL_API.G_EXCEPTION_UNEXPECTED_ERROR THEN
1797
1798 x_return_status := G_RET_STS_UNEXP_ERROR;
1799
1800 WHEN OTHERS THEN
1801
1802 OKL_API.SET_MESSAGE (p_app_name => G_APP_NAME,
1803 p_msg_name => G_DB_ERROR,
1804 p_token1 => G_PROG_NAME_TOKEN,
1805 p_token1_value => l_prog_name,
1806 p_token2 => G_SQLCODE_TOKEN,
1807 p_token2_value => sqlcode,
1808 p_token3 => G_SQLERRM_TOKEN,
1809 p_token3_value => sqlerrm);
1810
1811 x_return_status := G_RET_STS_UNEXP_ERROR;
1812
1813 END get_amortized_accruals;
1814
1815 Function Is_Var_Rate_Contract (p_chr_id in number) Return Varchar2 is
1816 Cursor get_rul_csr(p_chr_id in Number, p_rule_code in varchar2, p_rgd_code in varchar2) is
1817 Select rul.*
1818 from okc_rules_b rul,
1819 okc_rule_groups_b rgp
1820 where rul.rgp_id = rgp.id
1821 and rul.rule_information_category = p_rule_code
1822 and rul.dnz_chr_id = rgp.dnz_chr_id
1823 and rgp.chr_id = p_chr_id
1824 and rgp.rgd_code = p_rgd_code
1825 and rgp.dnz_chr_id = p_chr_id;
1826
1827 l_rul_rec get_rul_csr%ROWTYPE;
1828 l_var_int varchar2(1) default 'N';
1829 l_is_k_var_rate varchar2(1) default 'N';
1830
1831 begin
1832
1833 print( 'is var rate', 'begin');
1834 l_is_k_var_rate := 'N';
1835 l_var_int := 'N';
1836 Open get_rul_csr(p_chr_id,'LAINTP','LAIIND');
1837 Fetch get_rul_csr into l_rul_rec;
1838 If get_rul_csr%NOTFOUND Then
1839 Null;
1840 Elsif nvl(l_rul_rec.rule_information1,'N') = 'Y' Then
1841 l_var_int := 'Y';
1842 End If;
1843 Close get_rul_csr;
1844
1845 If l_var_int = 'Y' Then
1846 Open get_rul_csr(p_chr_id,'LAICLC','LAIIND');
1847 Fetch get_rul_csr into l_rul_rec;
1848 If get_rul_csr%NOTFOUND Then
1849 Null;
1850 Elsif nvl(l_rul_rec.rule_information5,'NONE') = 'FORMULA' Then
1851 l_is_k_var_rate := 'Y';
1852 End If;
1853 Close get_rul_csr;
1854 End If;
1855 Return(l_is_k_var_rate);
1856
1857 End Is_Var_Rate_Contract;
1858
1859 ---------------------------------------------------------------------------
1860 -- PROCEDURE get_sty_details
1861 --
1862 -- Check status of stream
1863 -- Return Stream Type ID or Name as requested
1864 ---------------------------------------------------------------------------
1865 PROCEDURE get_sty_details (p_sty_id IN NUMBER DEFAULT NULL,
1866 p_sty_name IN VARCHAR2 DEFAULT NULL,
1867 x_sty_id OUT NOCOPY NUMBER,
1868 x_sty_name OUT NOCOPY VARCHAR2,
1869 x_return_status OUT NOCOPY VARCHAR2) IS
1870
1871 CURSOR c_sty_name IS
1872 SELECT styt.name
1873 FROM okl_strm_type_b sty,
1874 okl_strm_type_tl styt
1875 WHERE sty.id = p_sty_id
1876 AND sty.version = '1.0' -- not really needed in 1159
1877 AND sty.id = styt.id
1878 AND styt.language = 'US'
1879 AND sty.start_date <= TRUNC(SYSDATE)
1880 AND NVL(sty.end_date, SYSDATE) >= TRUNC(SYSDATE);
1881
1882 CURSOR c_sty_id IS
1883 SELECT sty.id
1884 FROM okl_strm_type_b sty,
1885 okl_strm_type_tl styt
1886 WHERE styt.name = p_sty_name
1887 AND styt.language = 'US'
1888 AND styt.id = sty.id
1889 AND sty.version = '1.0' -- not really needed in 1159
1890 AND sty.start_date <= TRUNC(SYSDATE)
1891 AND NVL(sty.end_date, SYSDATE) >= TRUNC(SYSDATE);
1892
1893 l_sty_id NUMBER;
1894 l_sty_name VARCHAR2(150);
1895
1896 l_prog_name CONSTANT VARCHAR2(61) := G_PKG_NAME||'.'||'get_sty_details';
1897
1898 BEGIN
1899
1900 print( l_prog_name, 'begin' );
1901
1902 IF p_sty_id IS NOT NULL THEN
1903
1904 OPEN c_sty_name;
1905 FETCH c_sty_name INTO l_sty_name;
1906 CLOSE c_sty_name;
1907
1908 IF l_sty_name IS NOT NULL THEN
1909
1910 x_sty_name := l_sty_name;
1911 x_sty_id := p_sty_id;
1912
1913 ELSE
1914
1915 OKL_API.SET_MESSAGE(p_app_name => G_APP_NAME,
1916 p_msg_name => 'OKL_STREAM_ID_NOT_FOUND',
1917 p_token1 => 'STY_ID',
1918 p_token1_value => p_sty_id);
1919
1920 RAISE OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
1921
1922 END IF;
1923
1924 ELSIF p_sty_name IS NOT NULL THEN
1925
1926 OPEN c_sty_id;
1927 FETCH c_sty_id INTO l_sty_id;
1928 CLOSE c_sty_id;
1929
1930 IF l_sty_id IS NOT NULL THEN
1931
1932 x_sty_id := l_sty_id;
1933 x_sty_name := p_sty_name;
1934
1935 ELSE
1936
1937 OKL_API.SET_MESSAGE(p_app_name => G_APP_NAME,
1938 p_msg_name => 'OKL_STREAM_TYPE_NOT_FOUND',
1939 p_token1 => 'STY_NAME',
1940 p_token1_value => p_sty_name);
1941
1942 RAISE OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
1943
1944 END IF;
1945
1946 END IF;
1947
1948 x_return_status := G_RET_STS_SUCCESS;
1949 print( l_prog_name, 'end' );
1950
1951 EXCEPTION
1952
1953 WHEN OKL_API.G_EXCEPTION_ERROR THEN
1954
1955 x_return_status := G_RET_STS_ERROR;
1956
1957 WHEN OKL_API.G_EXCEPTION_UNEXPECTED_ERROR THEN
1958
1959 x_return_status := G_RET_STS_UNEXP_ERROR;
1960
1961 WHEN OTHERS THEN
1962
1963 OKL_API.SET_MESSAGE (p_app_name => G_APP_NAME,
1964 p_msg_name => G_DB_ERROR,
1965 p_token1 => G_PROG_NAME_TOKEN,
1966 p_token1_value => l_prog_name,
1967 p_token2 => G_SQLCODE_TOKEN,
1968 p_token2_value => sqlcode,
1969 p_token3 => G_SQLERRM_TOKEN,
1970 p_token3_value => sqlerrm);
1971
1972 x_return_status := G_RET_STS_UNEXP_ERROR;
1973
1974 END get_sty_details;
1975
1976
1977 ---------------------------------------------------------------------------
1978 -- PROCEDURE get_mapped_stream
1979 --
1980 -- DESC
1981 -- Repository of hard-coded stream type mapping
1982 --
1983 -- USAGE
1984 -- Driven by mapping type. Must provide mapping type
1985 ---------------------------------------------------------------------------
1986 PROCEDURE get_mapped_stream (p_sty_purpose IN VARCHAR2 DEFAULT NULL,
1987 p_line_style IN VARCHAR2,
1988 p_mapping_type IN VARCHAR2,
1989 p_deal_type IN VARCHAR2,
1990 p_primary_sty_id IN NUMBER DEFAULT NULL,
1991 p_fee_type IN VARCHAR2 DEFAULT NULL,
1992 p_recurr_yn IN VARCHAR2 DEFAULT NULL,
1993 p_pt_yn IN VARCHAR2 DEFAULT 'N',
1994 p_khr_id IN NUMBER,
1995 p_stream_type_purpose IN VARCHAR2 DEFAULT NULL,
1996 x_mapped_stream OUT NOCOPY VARCHAR2,
1997 x_return_status OUT NOCOPY VARCHAR2) IS
1998
1999 l_prog_name CONSTANT VARCHAR2(61) := G_PKG_NAME||'.'||'get_mapped_stream';
2000 l_sty_id NUMBER;
2001
2002 CURSOR c_hdr IS
2003 select chr.orig_system_source_code,
2004 chr.start_date,
2005 chr.end_date,
2006 chr.template_yn,
2007 chr.authoring_org_id,
2008 chr.inv_organization_id,
2009 khr.deal_type,
2010 to_char(pdt.id) pid, --358660899972842057983133434721270318297
2011 nvl(pdt.reporting_pdt_id, -1) report_pdt_id,
2012 chr.currency_code currency_code,
2013 khr.term_duration term
2014 from okc_k_headers_v chr,
2015 okl_k_headers khr,
2016 okl_products_v pdt
2017 where khr.id = chr.id
2018 and chr.id = p_khr_id
2019 and khr.pdt_id = pdt.id(+);
2020
2021 r_hdr c_hdr%ROWTYPE;
2022
2023 Cursor c_rollover_pmnts IS
2024 Select distinct nvl(slh.object1_id1, -1) styId
2025 From OKC_RULE_GROUPS_B rgp,
2026 OKC_RULES_B sll,
2027 okc_rules_b slh,
2028 okl_strm_type_b sty
2029 Where slh.rgp_id = rgp.id
2030 and rgp.RGD_CODE = 'LALEVL'
2031 and sll.RULE_INFORMATION_CATEGORY = 'LASLL'
2032 and slh.RULE_INFORMATION_CATEGORY = 'LASLH'
2033 AND TO_CHAR(slh.id) = sll.object2_id1
2034 and slh.object1_id1 = sty.id
2035 and sty.stream_type_purpose = 'RENT'
2036 and rgp.dnz_chr_id = p_khr_id;
2037
2038 r_rollover_pmnts c_rollover_pmnts%ROWTYPE;
2039
2040
2041 l_primary_sty_id NUMBER;
2042 BEGIN
2043
2044 -- Enhancement pending to remove hard coding dependency (TBD by MCHAKRAB, SRAWLING)
2045 -- Accrual Stream Type will be specified during setup of Payment Stream Type
2046
2047 OPEN c_rollover_pmnts;
2048 FETCH c_rollover_pmnts INTO r_rollover_pmnts;
2049 CLOSE c_rollover_pmnts;
2050
2051 l_primary_sty_id := nvl(p_primary_sty_id, r_rollover_pmnts.styId);
2052
2053 print( l_prog_name, 'begin' );
2054 print( l_prog_name, ' mapping type ' || p_mapping_type || ' sty ame ' || p_sty_purpose || ' deal type ' || p_deal_type );
2055 IF p_mapping_type = 'ACCRUAL' THEN
2056
2057 IF p_sty_purpose = 'RENT' AND p_deal_type = 'LEASEOP' AND
2058 (p_line_style = 'FREE_FORM1' OR p_line_style IS NULL) THEN
2059 --x_mapped_stream := 'RENTAL ACCRUAL';
2060 print( l_prog_name, '##1##' );
2061 OKL_ISG_UTILS_PVT.get_dependent_stream_type(
2062 p_khr_id => p_khr_id,
2063 p_deal_type => p_deal_type,
2064 p_primary_sty_id => l_primary_sty_id,
2065 p_dependent_sty_purpose => 'RENT_ACCRUAL',
2066 x_return_status => x_return_status,
2067 x_dependent_sty_id => l_sty_id,
2068 x_dependent_sty_name => x_mapped_stream);
2069
2070 ELSIF p_sty_purpose = 'RENT' AND p_deal_type <> 'LEASEOP' AND
2071 (p_line_style = 'FREE_FORM1' OR p_line_style IS NULL) THEN
2072 print( l_prog_name, '##2##' );
2073 x_mapped_stream := NULL;
2074 ELSIF p_pt_yn = 'Y' THEN
2075 print( l_prog_name, '##3##' );
2076 --x_mapped_stream := 'PASS THROUGH REVENUE ACCRUAL';
2077 --If condition added by mansrini on 10-Jun-2005 for generating accrual streams for Service Lines
2078 --Bug 4434343 -Start of Changes
2079
2080 IF (p_line_style = 'FEE') THEN
2081 OKL_ISG_UTILS_PVT.get_dependent_stream_type(
2082 p_khr_id => p_khr_id,
2083 p_deal_type => p_deal_type,
2084 p_primary_sty_id => l_primary_sty_id,
2085 p_dependent_sty_purpose => 'PASS_THRU_REV_ACCRUAL',
2086 x_return_status => x_return_status,
2087 x_dependent_sty_id => l_sty_id,
2088 x_dependent_sty_name => x_mapped_stream);
2089
2090 ELSIF ((p_line_style = 'SOLD_SERVICE') OR (p_line_style = 'LINK_SERV_ASSET')) THEN
2091 OKL_ISG_UTILS_PVT.get_dependent_stream_type(
2092 p_khr_id => p_khr_id,
2093 p_deal_type => p_deal_type,
2094 p_primary_sty_id => l_primary_sty_id,
2095 p_dependent_sty_purpose => 'PASS_THRU_SVC_REV_ACCRUAL',
2096 x_return_status => x_return_status,
2097 x_dependent_sty_id => l_sty_id,
2098 x_dependent_sty_name => x_mapped_stream);
2099 END IF;
2100 --Bug 4434343 -End of Changes
2101
2102 ELSIF ((p_line_style = 'SOLD_SERVICE') OR (p_line_style = 'LINK_SERV_ASSET')) THEN
2103 print( l_prog_name, '##4##' );
2104 --x_mapped_stream := 'SERVICE INCOME';
2105 OKL_ISG_UTILS_PVT.get_dependent_stream_type(
2106 p_khr_id => p_khr_id,
2107 p_deal_type => p_deal_type,
2108 p_primary_sty_id => l_primary_sty_id,
2109 p_dependent_sty_purpose => 'SERVICE_INCOME',
2110 x_return_status => x_return_status,
2111 x_dependent_sty_id => l_sty_id,
2112 x_dependent_sty_name => x_mapped_stream);
2113
2114 ELSIF (p_line_style IN ('FEE', 'FREE_FORM1') OR p_line_style IS NULL) AND
2115 (p_sty_purpose <> 'SECURITY_DEPOSIT') THEN
2116
2117 If ( p_fee_type = 'INCOME' AND p_recurr_yn = OKL_API.G_FALSE ) Then
2118 --x_mapped_stream := 'AMORTIZED FEE INCOME';
2119 OKL_ISG_UTILS_PVT.get_dependent_stream_type(
2120 p_khr_id => p_khr_id,
2121 p_deal_type => p_deal_type,
2122 p_primary_sty_id => l_primary_sty_id,
2123 p_dependent_sty_purpose => 'AMORTIZE_FEE_INCOME',
2124 x_return_status => x_return_status,
2125 x_dependent_sty_id => l_sty_id,
2126 x_dependent_sty_name => x_mapped_stream);
2127
2128 elsif ( p_fee_type = 'FINANCED' OR p_fee_type = 'ROLLOVER') Then
2129 x_mapped_stream := NULL;
2130 else
2131 --x_mapped_stream := 'FEE INCOME';
2132 OKL_ISG_UTILS_PVT.get_dependent_stream_type(
2133 p_khr_id => p_khr_id,
2134 p_deal_type => p_deal_type,
2135 p_primary_sty_id => l_primary_sty_id,
2136 p_dependent_sty_purpose => 'ACCRUED_FEE_INCOME',
2137 x_return_status => x_return_status,
2138 x_dependent_sty_id => l_sty_id,
2139 x_dependent_sty_name => x_mapped_stream);
2140
2141 end if;
2142
2143 ELSE
2144 x_mapped_stream := NULL;
2145 END IF;
2146
2147 ELSIF p_mapping_type = 'PRE-TAX INCOME' THEN
2148
2149 IF (p_deal_type IN ('LEASEDF', 'LEASEST')) THEN
2150 --x_mapped_stream := 'PRE-TAX INCOME';
2151 OKL_ISG_UTILS_PVT.get_dependent_stream_type(
2152 p_khr_id => p_khr_id,
2153 p_deal_type => p_deal_type,
2154 p_primary_sty_id => l_primary_sty_id,
2155 p_dependent_sty_purpose => 'LEASE_INCOME',
2156 x_return_status => x_return_status,
2157 x_dependent_sty_id => l_sty_id,
2158 x_dependent_sty_name => x_mapped_stream);
2159
2160 ElsIF (p_deal_type IN ('LOAN', 'LOAN-REVOLVING')) OR ( p_fee_type in ('FINANCED', 'ROLLOVER','LINK_FEE_ASSET') ) THEN
2161 --x_mapped_stream := 'PRE-TAX INCOME';
2162 OKL_ISG_UTILS_PVT.get_dependent_stream_type(
2163 p_khr_id => p_khr_id,
2164 p_deal_type => p_deal_type,
2165 p_primary_sty_id => l_primary_sty_id,
2166 p_dependent_sty_purpose => 'INTEREST_INCOME',
2167 x_return_status => x_return_status,
2168 x_dependent_sty_id => l_sty_id,
2169 x_dependent_sty_name => x_mapped_stream);
2170 ELSE
2171 x_mapped_stream := NULL;
2172 END IF;
2173
2174 ELSIF p_mapping_type = 'PAYMENT' THEN
2175
2176 IF p_sty_purpose = 'RENT' AND p_deal_type IN ('LOAN', 'LOAN-REVOLVING') THEN
2177 x_mapped_stream := 'LOAN PAYMENT';
2178 ELSE
2179 x_mapped_stream := p_sty_purpose;
2180 END IF;
2181
2182 ELSIF p_mapping_type = 'CAPITAL RECOVERY' THEN
2183
2184 IF p_deal_type IN ('LEASEDF', 'LEASEST', 'LOAN', 'LOAN-REVOLVING') THEN
2185 x_mapped_stream := 'PRINCIPAL PAYMENT';
2186 ELSE
2187 x_mapped_stream := NULL;
2188 END IF;
2189
2190 ELSIF p_mapping_type = 'INTEREST PAYMENT' THEN
2191
2192 IF p_deal_type IN ('LEASEDF', 'LEASEST', 'LOAN', 'LOAN-REVOLVING') THEN
2193 x_mapped_stream := 'INTEREST PAYMENT';
2194 ELSE
2195 x_mapped_stream := NULL;
2196 END IF;
2197
2198 ELSIF p_mapping_type = 'CLOSE BOOK' THEN
2199
2200 IF p_deal_type IN ('LEASEDF', 'LEASEST', 'LOAN', 'LOAN-REVOLVING') THEN
2201 x_mapped_stream := 'PRINCIPAL BALANCE';
2202 ELSE
2203 x_mapped_stream := NULL;
2204 END IF;
2205
2206 ELSIF p_mapping_type = 'DISBURSEMENT' THEN
2207
2208 OPEN c_hdr;
2209 FETCH c_hdr INTO r_hdr;
2210 CLOSE c_hdr;
2211 IF p_deal_type = 'LEASE' THEN
2212 If ( p_sty_purpose = 'RENT' ) THen
2213 --x_mapped_stream := 'INVESTOR RENT DISBURSEMENT BASIS';
2214 OKL_ISG_UTILS_PVT.get_primary_stream_type(
2215 p_khr_id => p_khr_id,
2216 p_pdt_id => r_hdr.pid,
2217 p_primary_sty_purpose => 'INVESTOR_RENT_DISB_BASIS',
2218 x_return_status => x_return_status,
2219 x_primary_sty_id => l_sty_id,
2220 x_primary_sty_name => x_mapped_stream);
2221
2222 ElsIf ( p_sty_purpose = 'RESIDUAL' ) Then
2223 --x_mapped_stream := 'INVESTOR RESIDUAL DISBURSEMENT BASIS';
2224 OKL_ISG_UTILS_PVT.get_primary_stream_type(
2225 p_khr_id => p_khr_id,
2226 p_pdt_id => r_hdr.pid,
2227 p_primary_sty_purpose => 'INVESTOR_RESIDUAL_DISB_BASIS',
2228 x_return_status => x_return_status,
2229 x_primary_sty_id => l_sty_id,
2230 x_primary_sty_name => x_mapped_stream);
2231 End If;
2232 ELSIF p_deal_type = 'LOAN' THEN
2233 If ( p_sty_purpose = 'LOAN_PAYMENT' ) Then
2234 IF p_stream_type_purpose = 'PRINCIPAL_PAYMENT' THEN
2235 OKL_ISG_UTILS_PVT.get_primary_stream_type(
2236 p_khr_id => p_khr_id,
2237 p_pdt_id => r_hdr.pid,
2238 p_primary_sty_purpose => 'INVESTOR_PRINCIPAL_DISB_BASIS',
2239 x_return_status => x_return_status,
2240 x_primary_sty_id => l_sty_id,
2241 x_primary_sty_name => x_mapped_stream);
2242 ELSIF p_stream_type_purpose = 'INTEREST_PAYMENT' THEN
2243 OKL_ISG_UTILS_PVT.get_primary_stream_type(
2244 p_khr_id => p_khr_id,
2245 p_pdt_id => r_hdr.pid,
2246 p_primary_sty_purpose => 'INVESTOR_INTEREST_DISB_BASIS',
2247 x_return_status => x_return_status,
2248 x_primary_sty_id => l_sty_id,
2249 x_primary_sty_name => x_mapped_stream);
2250 ELSIF p_stream_type_purpose = 'UNSCHEDULED_PRINCIPAL_PAYMENT' THEN
2251 OKL_ISG_UTILS_PVT.get_primary_stream_type(
2252 p_khr_id => p_khr_id,
2253 p_pdt_id => r_hdr.pid,
2254 p_primary_sty_purpose => 'INVESTOR_PPD_DISB_BASIS',
2255 x_return_status => x_return_status,
2256 x_primary_sty_id => l_sty_id,
2257 x_primary_sty_name => x_mapped_stream);
2258
2259 End If;
2260 End If;
2261 End If;
2262 ELSIF p_mapping_type = 'PV_DISBURSEMENT' THEN
2263
2264 OPEN c_hdr;
2265 FETCH c_hdr INTO r_hdr;
2266 CLOSE c_hdr;
2267 IF p_deal_type = 'LEASE' THEN
2268 If ( p_sty_purpose = 'RENT' ) THen
2269 OKL_ISG_UTILS_PVT.get_primary_stream_type(
2270 p_khr_id => p_khr_id,
2271 p_pdt_id => r_hdr.pid,
2272 p_primary_sty_purpose => 'PV_RENT_SECURITIZED',
2273 x_return_status => x_return_status,
2274 x_primary_sty_id => l_sty_id,
2275 x_primary_sty_name => x_mapped_stream);
2276
2277 ElsIf ( p_sty_purpose = 'RESIDUAL' ) Then
2278 OKL_ISG_UTILS_PVT.get_primary_stream_type(
2279 p_khr_id => p_khr_id,
2280 p_pdt_id => r_hdr.pid,
2281 p_primary_sty_purpose => 'PV_RV_SECURITIZED',
2282 x_return_status => x_return_status,
2283 x_primary_sty_id => l_sty_id,
2284 x_primary_sty_name => x_mapped_stream);
2285 End If;
2286 ELSIF p_deal_type = 'LOAN' THEN
2287 If ( p_sty_purpose = 'LOAN_PAYMENT' ) Then
2288 IF p_stream_type_purpose = 'PRINCIPAL_PAYMENT' THEN
2289 OKL_ISG_UTILS_PVT.get_primary_stream_type(
2290 p_khr_id => p_khr_id,
2291 p_pdt_id => r_hdr.pid,
2292 p_primary_sty_purpose => 'PV_PRINCIPAL_SECURITIZED',
2293 x_return_status => x_return_status,
2294 x_primary_sty_id => l_sty_id,
2295 x_primary_sty_name => x_mapped_stream);
2296 ELSIF p_stream_type_purpose = 'INTEREST_PAYMENT' THEN
2297 OKL_ISG_UTILS_PVT.get_primary_stream_type(
2298 p_khr_id => p_khr_id,
2299 p_pdt_id => r_hdr.pid,
2300 p_primary_sty_purpose => 'PV_INTEREST_SECURITIZED',
2301 x_return_status => x_return_status,
2302 x_primary_sty_id => l_sty_id,
2303 x_primary_sty_name => x_mapped_stream);
2304 ELSIF p_stream_type_purpose = 'UNSCHEDULED_PRINCIPAL_PAYMENT' THEN
2305 OKL_ISG_UTILS_PVT.get_primary_stream_type(
2306 p_khr_id => p_khr_id,
2307 p_pdt_id => r_hdr.pid,
2308 p_primary_sty_purpose => 'PV_UNSCHEDULED_PMT_SECURITIZED',
2309 x_return_status => x_return_status,
2310 x_primary_sty_id => l_sty_id,
2311 x_primary_sty_name => x_mapped_stream);
2312
2313 End If;
2314 End If;
2315 End If;
2316
2317 ELSE
2318
2319 x_mapped_stream := NULL;
2320
2321 END IF;
2322
2323 x_return_status := G_RET_STS_SUCCESS;
2324 print( l_prog_name, 'end' );
2325
2326 EXCEPTION
2327
2328 WHEN OKL_API.G_EXCEPTION_ERROR THEN
2329
2330 x_return_status := G_RET_STS_ERROR;
2331
2332 WHEN OKL_API.G_EXCEPTION_UNEXPECTED_ERROR THEN
2333
2334 x_return_status := G_RET_STS_UNEXP_ERROR;
2335
2336 WHEN OTHERS THEN
2337
2338 OKL_API.SET_MESSAGE (p_app_name => G_APP_NAME,
2339 p_msg_name => G_DB_ERROR,
2340 p_token1 => G_PROG_NAME_TOKEN,
2341 p_token1_value => l_prog_name,
2342 p_token2 => G_SQLCODE_TOKEN,
2343 p_token2_value => sqlcode,
2344 p_token3 => G_SQLERRM_TOKEN,
2345 p_token3_value => sqlerrm);
2346
2347 x_return_status := G_RET_STS_UNEXP_ERROR;
2348
2349 END get_mapped_stream;
2350
2351
2352
2353 ---------------------------------------------------------------------------
2354 -- FUNCTION get_months_factor
2355 ---------------------------------------------------------------------------
2356 FUNCTION get_months_factor( p_frequency IN VARCHAR2,
2357 x_return_status OUT NOCOPY VARCHAR2) RETURN NUMBER IS
2358 l_months NUMBER;
2359 l_prog_name CONSTANT VARCHAR2(61) := G_PKG_NAME||'.'||'get_months_factor';
2360 BEGIN
2361 IF p_frequency = 'M' THEN
2362 l_months := 1;
2363 ELSIF p_frequency = 'Q' THEN
2364 l_months := 3;
2365 ELSIF p_frequency = 'S' THEN
2366 l_months := 6;
2367 ELSIF p_frequency = 'A' THEN
2368 l_months := 12;
2369 END IF;
2370 --print( 'get_months_factor: p_frequency, l_months = ' || p_frequency || ',' || l_months );
2371 IF l_months IS NOT NULL THEN
2372 x_return_status := G_RET_STS_SUCCESS;
2373 RETURN l_months;
2374 ELSE
2375 OKL_API.SET_MESSAGE(p_app_name => G_APP_NAME,
2376 p_msg_name => 'OKL_INVALID_FREQUENCY_CODE',
2377 p_token1 => 'FRQ_CODE',
2378 p_token1_value => p_frequency);
2379 RAISE OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
2380 END IF;
2381 EXCEPTION
2382 WHEN OKL_API.G_EXCEPTION_ERROR
2383 THEN
2384 x_return_status := G_RET_STS_ERROR;
2385 WHEN OKL_API.G_EXCEPTION_UNEXPECTED_ERROR
2386 THEN
2387 x_return_status := G_RET_STS_UNEXP_ERROR;
2388 WHEN OTHERS
2389 THEN
2390 OKL_API.SET_MESSAGE (p_app_name => G_APP_NAME,
2391 p_msg_name => G_DB_ERROR,
2392 p_token1 => G_PROG_NAME_TOKEN,
2393 p_token1_value => l_prog_name,
2394 p_token2 => G_SQLCODE_TOKEN,
2395 p_token2_value => sqlcode,
2396 p_token3 => G_SQLERRM_TOKEN,
2397 p_token3_value => sqlerrm);
2398 x_return_status := G_RET_STS_UNEXP_ERROR;
2399 END get_months_factor;
2400
2401
2402 ---------------------------------------------------------------------------
2403 -- FUNCTION get_first_sel_date
2404 ---------------------------------------------------------------------------
2405 -- djanaswa ER6274342 added parameter p_arrears_pay_dates_option
2406
2407 FUNCTION get_first_sel_date( p_start_date IN DATE,
2408 p_advance_or_arrears IN VARCHAR2,
2409 p_months_increment IN NUMBER,
2410 p_arrears_pay_dates_option IN VARCHAR2,
2411 x_return_status OUT NOCOPY VARCHAR2) RETURN DATE IS
2412 l_date DATE;
2413
2414 l_prog_name CONSTANT VARCHAR2(61) := G_PKG_NAME||'.'||'get_first_sel_date';
2415
2416 BEGIN
2417
2418
2419 print( l_prog_name, 'begin' );
2420
2421 --Added by kthiruva on 04-01-2005
2422 --Bug 4100610 - Start of Changes
2423 IF ((p_advance_or_arrears = 'ADVANCE') OR (p_advance_or_arrears = 'N')) THEN
2424 l_date := TRUNC(p_start_date);
2425 ELSIF ((p_advance_or_arrears = 'ARREARS') OR (p_advance_or_arrears = 'Y')) THEN
2426 -- djanaswa ER 6274342 Added IF condition
2427 IF p_arrears_pay_dates_option = 'FIRST_DAY_OF_NEXT_PERIOD' THEN
2428 l_date := ADD_MONTHS(TRUNC(p_start_date), p_months_increment);
2429 ELSE
2430 l_date := ADD_MONTHS(TRUNC(p_start_date), p_months_increment) - 1;
2431 END IF;
2432 END IF;
2433 --Bug 4100610 - End Of Changes
2434 IF l_date IS NOT NULL THEN
2435 x_return_status := G_RET_STS_SUCCESS;
2436 RETURN l_date;
2437 ELSE
2438 RAISE OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
2439 END IF;
2440
2441 print( l_prog_name, 'end' );
2442 EXCEPTION
2443
2444 WHEN OKL_API.G_EXCEPTION_ERROR THEN
2445
2446 x_return_status := G_RET_STS_ERROR;
2447
2448 WHEN OKL_API.G_EXCEPTION_UNEXPECTED_ERROR THEN
2449
2450 x_return_status := G_RET_STS_UNEXP_ERROR;
2451
2452 WHEN OTHERS THEN
2453
2454 OKL_API.SET_MESSAGE (p_app_name => G_APP_NAME,
2455 p_msg_name => G_DB_ERROR,
2456 p_token1 => G_PROG_NAME_TOKEN,
2457 p_token1_value => l_prog_name,
2458 p_token2 => G_SQLCODE_TOKEN,
2459 p_token2_value => sqlcode,
2460 p_token3 => G_SQLERRM_TOKEN,
2461 p_token3_value => sqlerrm);
2462
2463 x_return_status := G_RET_STS_UNEXP_ERROR;
2464
2465 END get_first_sel_date;
2466
2467
2468 ---------------------------------------------------------------------------
2469 -- FUNCTION get_advance_count
2470 ---------------------------------------------------------------------------
2471 FUNCTION get_advance_count( p_structure IN VARCHAR2,
2472 x_return_status OUT NOCOPY VARCHAR2) RETURN NUMBER IS
2473
2474 l_count NUMBER;
2475 l_prog_name CONSTANT VARCHAR2(61) := G_PKG_NAME||'.'||'get_advance_count';
2476
2477
2478 BEGIN
2479
2480 print( l_prog_name, 'begin' );
2481 IF NVL(p_structure, 'LEVEL') IN ('LEVEL', '0') THEN
2482 l_count := 0;
2483 ELSIF p_structure IN ('1STLAST', '1') THEN
2484 l_count := 1;
2485 ELSIF p_structure IN ('1STLAST2', '2') THEN
2486 l_count := 2;
2487 ELSIF p_structure IN ('1STLAST3', '3') THEN
2488 l_count := 3;
2489 ELSE
2490 OKL_API.SET_MESSAGE(p_app_name => G_APP_NAME,
2491 p_msg_name => 'OKL_INVALID_PAYMENT_STRUCTURE',
2492 p_token1 => 'STRUCTURE_CODE',
2493 p_token1_value => p_structure);
2494 RAISE OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
2495 END IF;
2496
2497 x_return_status := G_RET_STS_SUCCESS;
2498 print( l_prog_name, 'end' );
2499 RETURN l_count;
2500
2501 EXCEPTION
2502
2503 WHEN OKL_API.G_EXCEPTION_ERROR THEN
2504
2505 x_return_status := G_RET_STS_ERROR;
2506
2507 WHEN OKL_API.G_EXCEPTION_UNEXPECTED_ERROR THEN
2508
2509 x_return_status := G_RET_STS_UNEXP_ERROR;
2510
2511 WHEN OTHERS THEN
2512
2513 OKL_API.SET_MESSAGE (p_app_name => G_APP_NAME,
2514 p_msg_name => G_DB_ERROR,
2515 p_token1 => G_PROG_NAME_TOKEN,
2516 p_token1_value => l_prog_name,
2517 p_token2 => G_SQLCODE_TOKEN,
2518 p_token2_value => sqlcode,
2519 p_token3 => G_SQLERRM_TOKEN,
2520 p_token3_value => sqlerrm);
2521
2522 x_return_status := G_RET_STS_UNEXP_ERROR;
2523
2524 END get_advance_count;
2525
2526
2527 ---------------------------------------------------------------------------
2528 -- FUNCTION get_fractional_month
2529 ---------------------------------------------------------------------------
2530 FUNCTION get_fractional_month( p_start_date IN DATE,
2531 x_return_status OUT NOCOPY VARCHAR2) RETURN NUMBER IS
2532
2533 l_fraction NUMBER;
2534
2535 l_prog_name CONSTANT VARCHAR2(61) := G_PKG_NAME||'.'||'get_fractional_month';
2536
2537 BEGIN
2538
2539 print( l_prog_name, 'begin' );
2540 IF TO_CHAR(p_start_date, 'DD') IN ('30', '31') OR
2541 (TO_CHAR(p_start_date, 'MON') = 'FEB' AND TO_CHAR(p_start_date, 'DD') IN ('28', '29')) THEN
2542 l_fraction := 0;
2543 ELSIF p_start_date = (ADD_MONTHS(LAST_DAY(p_start_date), -1) + 1) THEN
2544 l_fraction :=1;
2545 ELSE
2546 l_fraction := (30 - TO_CHAR(p_start_date-1, 'DD')) / 30;
2547 END IF;
2548
2549 x_return_status := G_RET_STS_SUCCESS;
2550 print( l_prog_name, 'end' );
2551 RETURN l_fraction;
2552
2553 EXCEPTION
2554
2555 WHEN OKL_API.G_EXCEPTION_ERROR THEN
2556
2557 x_return_status := G_RET_STS_ERROR;
2558
2559 WHEN OKL_API.G_EXCEPTION_UNEXPECTED_ERROR THEN
2560
2561 x_return_status := G_RET_STS_UNEXP_ERROR;
2562
2563 WHEN OTHERS THEN
2564
2565 OKL_API.SET_MESSAGE (p_app_name => G_APP_NAME,
2566 p_msg_name => G_DB_ERROR,
2567 p_token1 => G_PROG_NAME_TOKEN,
2568 p_token1_value => l_prog_name,
2569 p_token2 => G_SQLCODE_TOKEN,
2570 p_token2_value => sqlcode,
2571 p_token3 => G_SQLERRM_TOKEN,
2572 p_token3_value => sqlerrm);
2573
2574 x_return_status := G_RET_STS_UNEXP_ERROR;
2575
2576 END get_fractional_month;
2577
2578
2579 ---------------------------------------------------------------------------
2580 -- PROCEDURE get_stream_header
2581 ---------------------------------------------------------------------------
2582 PROCEDURE get_stream_header(p_purpose_code IN VARCHAR2,
2583 p_khr_id IN NUMBER,
2584 p_kle_id IN NUMBER,
2585 p_sty_id IN NUMBER,
2586 x_stmv_rec OUT NOCOPY okl_stm_pvt.stmv_rec_type,
2587 x_return_status OUT NOCOPY VARCHAR2) IS
2588
2589 l_stmv_rec okl_stm_pvt.stmv_rec_type;
2590 l_transaction_number NUMBER;
2591
2592 l_prog_name CONSTANT VARCHAR2(61) := G_PKG_NAME||'.'||'get_stream_header';
2593
2594
2595 BEGIN
2596
2597 --print( l_prog_name, 'begin' );
2598 SELECT okl_sif_seq.nextval INTO l_transaction_number FROM DUAL;
2599
2600 -- NOTE: UV for Streams inquiry (OKL_ASSET_STREAMS_UV) assumes a denormalized use of KHR_ID
2601
2602 l_stmv_rec.khr_id := p_khr_id;
2603 l_stmv_rec.kle_id := p_kle_id;
2604 l_stmv_rec.sty_id := p_sty_id;
2605 l_stmv_rec.sgn_code := 'MANL';
2606 l_stmv_rec.say_code := 'WORK'; -- calling API will update to CURR as required
2607 l_stmv_rec.active_yn := 'N'; -- calling API will update to Y as required
2608 l_stmv_rec.transaction_number := l_transaction_number; -- approved by AKJAIN
2609 -- l_stmv_rec.date_current := NULL; -- TBD
2610 l_stmv_rec.date_working := SYSDATE; -- TBD
2611 -- l_stmv_rec.date_history := NULL; -- TBD
2612 -- l_stmv_rec.comments := NULL; -- TBD
2613
2614 IF p_purpose_code = 'REPORT' THEN
2615
2616 l_stmv_rec.purpose_code := 'REPORT';
2617
2618 END IF;
2619
2620 x_stmv_rec := l_stmv_rec;
2621 x_return_status := G_RET_STS_SUCCESS;
2622
2623 --print( l_prog_name, 'end' );
2624 EXCEPTION
2625
2626 WHEN OKL_API.G_EXCEPTION_ERROR THEN
2627
2628 x_return_status := G_RET_STS_ERROR;
2629
2630 WHEN OKL_API.G_EXCEPTION_UNEXPECTED_ERROR THEN
2631
2632 x_return_status := G_RET_STS_UNEXP_ERROR;
2633
2634 WHEN OTHERS THEN
2635
2636 OKL_API.SET_MESSAGE (p_app_name => G_APP_NAME,
2637 p_msg_name => G_DB_ERROR,
2638 p_token1 => G_PROG_NAME_TOKEN,
2639 p_token1_value => l_prog_name,
2640 p_token2 => G_SQLCODE_TOKEN,
2641 p_token2_value => sqlcode,
2642 p_token3 => G_SQLERRM_TOKEN,
2643 p_token3_value => sqlerrm);
2644
2645 x_return_status := G_RET_STS_UNEXP_ERROR;
2646
2647 END get_stream_header;
2648
2649 ---------------------------------------------------------------------------
2650 -- PROCEDURE get_stream_elements
2651 --
2652 -- Description
2653 -- Populates Stream Elements array for contiguous periodic charges/expenses
2654 --
2655 -- Added parameter p_recurrence_date by djanaswa for bug 6007644
2656 ---------------------------------------------------------------------------
2657 PROCEDURE get_stream_elements( p_start_date IN DATE,
2658 p_periods IN NUMBER,
2659 p_frequency IN VARCHAR2,
2660 p_structure IN VARCHAR2,
2661 p_advance_or_arrears IN VARCHAR2,
2662 p_amount IN NUMBER,
2663 p_stub_days IN NUMBER,
2664 p_stub_amount IN NUMBER,
2665 p_currency_code IN VARCHAR2,
2666 p_khr_id IN NUMBER,
2667 p_kle_id IN NUMBER,
2668 p_purpose_code IN VARCHAR2,
2669 x_selv_tbl OUT NOCOPY okl_sel_pvt.selv_tbl_type,
2670 x_pt_tbl OUT NOCOPY okl_sel_pvt.selv_tbl_type,
2671 x_pt_pro_fee_tbl OUT NOCOPY okl_sel_pvt.selv_tbl_type,
2672 x_return_status OUT NOCOPY VARCHAR2,
2673 x_msg_count OUT NOCOPY NUMBER,
2674 x_msg_data OUT NOCOPY VARCHAR2,
2675 p_recurrence_date IN DATE) IS
2676
2677
2678 top_svc_rec top_svc_csr%ROWTYPE;
2679
2680 lx_return_status VARCHAR2(1);
2681
2682 l_months_factor NUMBER;
2683 l_first_sel_date DATE;
2684 l_element_count NUMBER;
2685 l_base_amount NUMBER;
2686 l_amount NUMBER;
2687
2688 Cursor c_pass ( khrId NUMBER, cleId NUMBER) IS
2689 select vDtls.DISBURSEMENT_BASIS,
2690 vDtls.DISBURSEMENT_FIXED_AMOUNT,
2691 vDtls.DISBURSEMENT_PERCENT,
2692 vDtls.PROCESSING_FEE_BASIS,
2693 vDtls.PROCESSING_FEE_FIXED_AMOUNT,
2694 vDtls.PROCESSING_FEE_PERCENT
2695 from okl_party_payment_hdr vHdr,
2696 okl_party_payment_dtls vDtls
2697 where vDtls.payment_hdr_id = vHdr.id
2698 and vHdr.CLE_ID = cleId
2699 and vHdr.DNZ_CHR_ID = khrId
2700 and vHdr.PASSTHRU_TERM = 'BASE';
2701
2702 r_pass c_pass%ROWTYPE;
2703
2704 pass_thru_id NUMBER;
2705 pass_thru_amount NUMBER;
2706 pass_thru_pro_fee NUMBER;
2707
2708 l_prog_name CONSTANT VARCHAR2(61) := G_PKG_NAME||'.'||'get_stream_elements';
2709 l_ptpf_level_amount NUMBER;
2710 l_ptpf_level_stub_amount NUMBER;
2711 l_pt_level_amount NUMBER;
2712 l_pt_level_stub_amount NUMBER;
2713 l_link_yn VARCHAR2(1);
2714
2715 -- djanaswa ER6274342 start
2716 l_arrears_pay_dates_option okl_st_gen_tmpt_sets_all.isg_arrears_pay_dates_option%type;
2717 -- djanaswa ER6274342 end
2718
2719
2720 BEGIN
2721
2722 print( l_prog_name, 'begin' );
2723 l_months_factor := get_months_factor( p_frequency => p_frequency,
2724 x_return_status => lx_return_status);
2725
2726 IF lx_return_status = OKL_API.G_RET_STS_UNEXP_ERROR THEN
2727 RAISE OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
2728 ELSIF lx_return_status = OKL_API.G_RET_STS_ERROR THEN
2729 RAISE OKL_API.G_EXCEPTION_ERROR;
2730 END IF;
2731
2732
2733 -- djanaswa ER6274342 start
2734 IF p_advance_or_arrears = 'ARREARS' THEN
2735 OKL_ISG_UTILS_PVT.get_arrears_pay_dates_option(
2736 p_khr_id => p_khr_id,
2737 x_arrears_pay_dates_option => l_arrears_pay_dates_option,
2738 x_return_status => lx_return_status);
2739
2740 IF(lx_return_status = OKL_API.G_RET_STS_UNEXP_ERROR) THEN
2741 RAISE OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
2742 ELSIF (lx_return_status = OKL_API.G_RET_STS_ERROR) THEN
2743 RAISE OKL_API.G_EXCEPTION_ERROR;
2744 END IF;
2745 END IF;
2746
2747 -- djanaswa ER6274342 end
2748
2749
2750 IF ( p_amount IS NULL )
2751 THEN
2752 l_amount := NULL;
2753 ELSE
2754 l_amount := p_amount;
2755 END IF;
2756
2757 IF ( p_periods IS NULL ) AND ( p_stub_days IS NOT NULL )
2758 THEN
2759 x_selv_tbl(1).amount := p_stub_amount;
2760 x_selv_tbl(1).se_line_number := 1; -- TBD
2761 x_selv_tbl(1).accrued_yn := NULL; -- TBD
2762
2763 IF p_advance_or_arrears = 'ARREARS' THEN
2764 -- djanaswa ER6274342 start
2765 -- x_selv_tbl(1).stream_element_date := p_start_date + p_stub_days - 1;
2766 x_selv_tbl(1).comments := 'Y';
2767
2768 IF l_arrears_pay_dates_option = 'FIRST_DAY_OF_NEXT_PERIOD' THEN
2769 x_selv_tbl(1).stream_element_date := p_start_date + p_stub_days;
2770 ELSE
2771 x_selv_tbl(1).stream_element_date := p_start_date + p_stub_days - 1;
2772 END IF;
2773 -- djanaswa ER6274342 end
2774
2775 ELSE
2776 x_selv_tbl(1).stream_element_date := p_start_date;
2777 x_selv_tbl(1).comments := 'N';
2778 END IF;
2779
2780 ELSE
2781
2782 l_element_count := p_periods;
2783 --print( l_prog_name, 'creating elements: ' || to_char(l_element_count) );
2784
2785
2786 FOR i IN 1 .. l_element_count
2787 LOOP
2788 x_selv_tbl(i).amount := l_amount;
2789
2790 IF p_advance_or_arrears = 'ARREARS'
2791 THEN
2792 x_selv_tbl(i).comments := 'Y';
2793 ELSE
2794 x_selv_tbl(i).comments := 'N';
2795 END IF;
2796
2797 -- Modified by RGOOTY: Start 4371472
2798 --Added parameter p_recurrence_date by djanaswa for bug 6007644
2799 -- added p_arrears_pay_dates_option by DJANASWA ER 6274342
2800 get_sel_date(
2801 p_start_date => p_start_date,
2802 p_advance_or_arrears => p_advance_or_arrears,
2803 p_periods_after => i,
2804 p_months_per_period => l_months_factor,
2805 x_date => x_selv_tbl(i).stream_element_date,
2806 x_return_status => lx_return_status,
2807 p_recurrence_date => p_recurrence_date,
2808 p_arrears_pay_dates_option => l_arrears_pay_dates_option);
2809 IF lx_return_status = OKL_API.G_RET_STS_UNEXP_ERROR THEN
2810 RAISE OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
2811 ELSIF lx_return_status = OKL_API.G_RET_STS_ERROR THEN
2812 RAISE OKL_API.G_EXCEPTION_ERROR;
2813 END IF;
2814 -- Modified by RGOOTY: End
2815
2816 x_selv_tbl(i).se_line_number := i; -- TBD
2817 x_selv_tbl(i).accrued_yn := NULL; -- TBD
2818 END LOOP;
2819 END IF;
2820
2821 l_link_yn := 'N';
2822 OPEN top_svc_csr( p_khr_id, p_kle_id );
2823 FETCH top_svc_csr INTO top_svc_rec;
2824 If ( top_svc_csr%FOUND ) Then
2825 print( l_prog_name, ' found top svc line ' || to_char( p_kle_id ));
2826 pass_thru_id := top_svc_rec.top_svc_id;
2827 l_link_yn := 'Y';
2828 Else
2829 print( l_prog_name, ' not found top svc line ' || to_char( p_kle_id ));
2830 l_link_yn := 'N';
2831 pass_thru_id := p_kle_id;
2832 End If;
2833 CLOSE top_svc_csr;
2834 pass_thru_amount := 0;
2835 pass_thru_pro_fee := 0;
2836
2837 For r_pass in c_pass( p_khr_id, pass_thru_id )
2838 LOOP
2839
2840 If ( r_pass.disbursement_basis = 'PERCENT' ) Then
2841 pass_thru_amount := pass_thru_amount +
2842 nvl(p_amount,0)*(r_pass.disbursement_percent/100) +
2843 nvl(p_stub_amount,0)*(r_pass.disbursement_percent/100);
2844
2845 Else
2846
2847 If (l_link_yn = 'Y') Then
2848 pass_thru_amount := pass_thru_amount +
2849 (r_pass.disbursement_fixed_amount*top_svc_rec.link_amount)/top_svc_rec.top_amount;
2850 Else
2851 pass_thru_amount := pass_thru_amount + r_pass.disbursement_fixed_amount;
2852 End If;
2853
2854 End If;
2855 If ( r_pass.processing_fee_basis = 'PERCENT' ) Then
2856 pass_thru_pro_fee := pass_thru_pro_fee +
2857 nvl(p_amount,0)*(r_pass.processing_fee_percent/100) +
2858 nvl(p_stub_amount,0)*(r_pass.processing_fee_percent/100);
2859 Else
2860
2861 If (l_link_yn = 'Y') Then
2862 pass_thru_pro_fee := pass_thru_pro_fee +
2863 (r_pass.processing_fee_fixed_amount*top_svc_rec.link_amount)/top_svc_rec.top_amount;
2864 Else
2865 pass_thru_pro_fee := pass_thru_pro_fee + r_pass.processing_fee_fixed_amount;
2866 End If;
2867
2868 End If;
2869
2870 END LOOP;
2871
2872 IF nvl(pass_thru_amount,0) <> 0 THEN
2873 IF nvl(p_amount, 0 ) = 0 THEN
2874 l_pt_level_amount := 0;
2875 ELSE
2876 l_pt_level_amount := p_amount *(pass_thru_amount/ p_amount );
2877 END IF;
2878 IF nvl(p_stub_amount,0) = 0
2879 THEN
2880 l_pt_level_stub_amount := 0;
2881 ELSE
2882 l_pt_level_stub_amount := p_stub_amount *(pass_thru_pro_fee/p_stub_amount);
2883 END IF;
2884 get_accrual_elements (p_start_date => p_start_date,
2885 p_periods => p_periods,
2886 p_frequency => p_frequency,
2887 p_structure => p_structure,
2888 p_advance_or_arrears => p_advance_or_arrears,
2889 p_amount => nvl(l_pt_level_amount,0),
2890 p_stub_days => p_stub_days,
2891 p_stub_amount => nvl(l_pt_level_stub_amount,0),
2892 p_currency_code => p_currency_code,
2893 x_selv_tbl => x_pt_tbl,
2894 x_return_status => lx_return_status);
2895 IF lx_return_status = OKL_API.G_RET_STS_UNEXP_ERROR THEN
2896 RAISE OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
2897 ELSIF lx_return_status = OKL_API.G_RET_STS_ERROR THEN
2898 RAISE OKL_API.G_EXCEPTION_ERROR;
2899 END IF;
2900 END IF;
2901
2902 IF (nvl(pass_thru_pro_fee,0) <> 0 ) THEN
2903 IF nvl(p_amount, 0 ) = 0 THEN
2904 l_ptpf_level_amount := 0;
2905 ELSE
2906 l_ptpf_level_amount := p_amount *(pass_thru_pro_fee/ p_amount );
2907 END IF;
2908 IF nvl(p_stub_amount,0) = 0
2909 THEN
2910 l_ptpf_level_stub_amount := 0;
2911 ELSE
2912 l_ptpf_level_stub_amount := p_stub_amount *(pass_thru_pro_fee/p_stub_amount);
2913 END IF;
2914 get_accrual_elements (p_start_date => p_start_date,
2915 p_periods => p_periods,
2916 p_frequency => p_frequency,
2917 p_structure => p_structure,
2918 p_advance_or_arrears => p_advance_or_arrears,
2919 p_amount => nvl(l_ptpf_level_amount,0),
2920 p_stub_days => p_stub_days,
2921 p_stub_amount => nvl(l_ptpf_level_stub_amount,0),
2922 p_currency_code => p_currency_code,
2923 x_selv_tbl => x_pt_pro_fee_tbl,
2924 x_return_status => lx_return_status);
2925
2926 IF lx_return_status = OKL_API.G_RET_STS_UNEXP_ERROR THEN
2927 RAISE OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
2928 ELSIF lx_return_status = OKL_API.G_RET_STS_ERROR THEN
2929 RAISE OKL_API.G_EXCEPTION_ERROR;
2930 END IF;
2931
2932
2933 END IF;
2934
2935 x_return_status := G_RET_STS_SUCCESS ;
2936 print( l_prog_name, 'end' );
2937
2938 EXCEPTION
2939
2940 WHEN OKL_API.G_EXCEPTION_ERROR THEN
2941
2942 x_return_status := G_RET_STS_ERROR;
2943
2944 WHEN OKL_API.G_EXCEPTION_UNEXPECTED_ERROR THEN
2945
2946 x_return_status := G_RET_STS_UNEXP_ERROR;
2947
2948 WHEN OTHERS THEN
2949
2950 OKL_API.SET_MESSAGE (p_app_name => G_APP_NAME,
2951 p_msg_name => G_DB_ERROR,
2952 p_token1 => G_PROG_NAME_TOKEN,
2953 p_token1_value => l_prog_name,
2954 p_token2 => G_SQLCODE_TOKEN,
2955 p_token2_value => sqlcode,
2956 p_token3 => G_SQLERRM_TOKEN,
2957 p_token3_value => sqlerrm);
2958
2959 x_return_status := G_RET_STS_UNEXP_ERROR;
2960
2961 END get_stream_elements;
2962
2963
2964 ---------------------------------------------------------------------------
2965 -- PROCEDURE get_stream_elements
2966 --
2967 -- Description
2968 -- Populates Stream Elements array for contiguous periodic charges/expenses
2969 --
2970 -- Added parameter p_recurrence_date by djanaswa for bug 6007644
2971 ---------------------------------------------------------------------------
2972 PROCEDURE get_stream_elements( p_start_date IN DATE,
2973 p_periods IN NUMBER,
2974 p_frequency IN VARCHAR2,
2975 p_structure IN VARCHAR2,
2976 p_advance_or_arrears IN VARCHAR2,
2977 p_amount IN NUMBER,
2978 p_stub_days IN NUMBER,
2979 p_stub_amount IN NUMBER,
2980 p_currency_code IN VARCHAR2,
2981 p_khr_id IN NUMBER,
2982 p_kle_id IN NUMBER,
2983 p_purpose_code IN VARCHAR2,
2984 x_selv_tbl OUT NOCOPY okl_sel_pvt.selv_tbl_type,
2985 x_pt_tbl OUT NOCOPY okl_sel_pvt.selv_tbl_type,
2986 x_return_status OUT NOCOPY VARCHAR2,
2987 x_msg_count OUT NOCOPY NUMBER,
2988 x_msg_data OUT NOCOPY VARCHAR2,
2989 p_recurrence_date IN DATE) IS
2990
2991 CURSOR c_pt_perc( kleid NUMBER) IS
2992 SELECT NVL(TO_NUMBER(rul.rule_information1), 100) pass_through_percentage
2993 FROM okc_rule_groups_b rgp,
2994 okc_rules_b rul
2995 WHERE rgp.cle_id = kleid
2996 AND rgp.rgd_code = 'LAPSTH'
2997 AND rgp.id = rul.rgp_id
2998 AND rul.rule_information_category = 'LAPTPR';
2999
3000 rec_pt_perc c_pt_perc%ROWTYPE;
3001
3002 top_svc_rec top_svc_csr%ROWTYPE;
3003
3004 l_pt_perc NUMBER;
3005
3006 lx_return_status VARCHAR2(1);
3007
3008 l_months_factor NUMBER;
3009 l_first_sel_date DATE;
3010 l_element_count NUMBER;
3011 l_base_amount NUMBER;
3012 l_amount NUMBER;
3013
3014 -- djanaswa ER6274342 start
3015 l_arrears_pay_dates_option okl_st_gen_tmpt_sets_all.isg_arrears_pay_dates_option%type;
3016 -- djanaswa ER6274342 end
3017
3018 l_prog_name CONSTANT VARCHAR2(61) := G_PKG_NAME||'.'||'get_stream_elements';
3019
3020 BEGIN
3021
3022 print( l_prog_name, 'begin' );
3023 l_months_factor := get_months_factor( p_frequency => p_frequency,
3024 x_return_status => lx_return_status);
3025
3026 IF lx_return_status = OKL_API.G_RET_STS_UNEXP_ERROR THEN
3027 RAISE OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
3028 ELSIF lx_return_status = OKL_API.G_RET_STS_ERROR THEN
3029 RAISE OKL_API.G_EXCEPTION_ERROR;
3030 END IF;
3031
3032 -- djanaswa ER6274342 start
3033 IF p_advance_or_arrears = 'ARREARS' THEN
3034 OKL_ISG_UTILS_PVT.get_arrears_pay_dates_option(
3035 p_khr_id => p_khr_id,
3036 x_arrears_pay_dates_option => l_arrears_pay_dates_option,
3037 x_return_status => lx_return_status);
3038
3039 IF(lx_return_status = OKL_API.G_RET_STS_UNEXP_ERROR) THEN
3040 RAISE OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
3041 ELSIF (lx_return_status = OKL_API.G_RET_STS_ERROR) THEN
3042 RAISE OKL_API.G_EXCEPTION_ERROR;
3043 END IF;
3044 END IF;
3045
3046 -- djanaswa ER6274342 end
3047
3048 IF ( p_amount IS NULL )
3049 THEN
3050 l_amount := NULL;
3051 ELSE
3052 l_amount := p_amount;
3053 END IF;
3054
3055 IF ( p_periods IS NULL ) AND ( p_stub_days IS NOT NULL )
3056 THEN
3057 x_selv_tbl(1).amount := p_stub_amount;
3058 x_selv_tbl(1).se_line_number := 1; -- TBD
3059 x_selv_tbl(1).accrued_yn := NULL; -- TBD
3060
3061 IF p_advance_or_arrears = 'ARREARS' THEN
3062 -- djanaswa ER6274342 start
3063 -- x_selv_tbl(1).stream_element_date := p_start_date + p_stub_days - 1;
3064 x_selv_tbl(1).comments := 'Y';
3065
3066 IF l_arrears_pay_dates_option = 'FIRST_DAY_OF_NEXT_PERIOD' THEN
3067 x_selv_tbl(1).stream_element_date := p_start_date + p_stub_days;
3068 ELSE
3069 x_selv_tbl(1).stream_element_date := p_start_date + p_stub_days - 1;
3070 END IF;
3071 -- djanaswa ER6274342 end
3072
3073 ELSE
3074 x_selv_tbl(1).stream_element_date := p_start_date;
3075 x_selv_tbl(1).comments := 'N';
3076 END IF;
3077
3078 ELSE
3079
3080 l_element_count := p_periods;
3081 --print( l_prog_name, 'creating elements: ' || to_char(l_element_count) );
3082
3083
3084 FOR i IN 1 .. l_element_count
3085 LOOP
3086 x_selv_tbl(i).amount := l_amount;
3087
3088 IF p_advance_or_arrears = 'ARREARS'
3089 THEN
3090 x_selv_tbl(i).comments := 'Y';
3091 ELSE
3092 x_selv_tbl(i).comments := 'N';
3093 END IF;
3094
3095 -- Modified by RGOOTY: Start 4371472
3096 --Added parameter p_recurrence_date by djanaswa for bug 6007644
3097 -- added p_arrears_pay_dates_option by DJANASWA ER 6274342
3098 get_sel_date(
3099 p_start_date => p_start_date,
3100 p_advance_or_arrears => p_advance_or_arrears,
3101 p_periods_after => i,
3102 p_months_per_period => l_months_factor,
3103 x_date => x_selv_tbl(i).stream_element_date,
3104 x_return_status => lx_return_status,
3105 p_recurrence_date => p_recurrence_date,
3106 p_arrears_pay_dates_option => l_arrears_pay_dates_option);
3107 IF lx_return_status = OKL_API.G_RET_STS_UNEXP_ERROR THEN
3108 RAISE OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
3109 ELSIF lx_return_status = OKL_API.G_RET_STS_ERROR THEN
3110 RAISE OKL_API.G_EXCEPTION_ERROR;
3111 END IF;
3112 -- Modified by RGOOTY: End
3113
3114 x_selv_tbl(i).se_line_number := i; -- TBD
3115 x_selv_tbl(i).accrued_yn := NULL; -- TBD
3116 END LOOP;
3117 END IF;
3118
3119 OPEN top_svc_csr( p_khr_id, p_kle_id );
3120 FETCH top_svc_csr INTO top_svc_rec;
3121 If ( top_svc_csr%FOUND ) Then
3122 print( l_prog_name, ' found top svc line ' || to_char( p_kle_id ));
3123 OPEN c_pt_perc( top_svc_rec.top_svc_id);
3124 Else
3125 print( l_prog_name, ' not found top svc line ' || to_char( p_kle_id ));
3126 OPEN c_pt_perc( p_kle_id);
3127 End If;
3128 CLOSE top_svc_csr;
3129
3130 FETCH c_pt_perc INTO rec_pt_perc;
3131 CLOSE c_pt_perc;
3132
3133 l_pt_perc := rec_pt_perc.pass_through_percentage;
3134
3135 print( l_prog_name, ' pass thru percent ' || to_char( l_pt_perc ) );
3136 print( l_prog_name, ' payment amount ' || to_char( p_amount ) );
3137
3138 IF (l_pt_perc IS NOT NULL) THEN
3139
3140 get_accrual_elements (p_start_date => p_start_date,
3141 p_periods => p_periods,
3142 p_frequency => p_frequency,
3143 p_structure => p_structure,
3144 p_advance_or_arrears => p_advance_or_arrears,
3145 p_amount => nvl(p_amount,0)*(l_pt_perc/100),
3146 p_stub_days => p_stub_days,
3147 p_stub_amount => nvl(p_stub_amount,0)*(l_pt_perc/100),
3148 p_currency_code => p_currency_code,
3149 x_selv_tbl => x_pt_tbl,
3150 x_return_status => lx_return_status);
3151
3152 IF lx_return_status = OKL_API.G_RET_STS_UNEXP_ERROR THEN
3153 RAISE OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
3154 ELSIF lx_return_status = OKL_API.G_RET_STS_ERROR THEN
3155 RAISE OKL_API.G_EXCEPTION_ERROR;
3156 END IF;
3157
3158
3159 END IF;
3160
3161 x_return_status := G_RET_STS_SUCCESS ;
3162 print( l_prog_name, 'end' );
3163
3164 EXCEPTION
3165
3166 WHEN OKL_API.G_EXCEPTION_ERROR THEN
3167
3168 x_return_status := G_RET_STS_ERROR;
3169
3170 WHEN OKL_API.G_EXCEPTION_UNEXPECTED_ERROR THEN
3171
3172 x_return_status := G_RET_STS_UNEXP_ERROR;
3173
3174 WHEN OTHERS THEN
3175
3176 OKL_API.SET_MESSAGE (p_app_name => G_APP_NAME,
3177 p_msg_name => G_DB_ERROR,
3178 p_token1 => G_PROG_NAME_TOKEN,
3179 p_token1_value => l_prog_name,
3180 p_token2 => G_SQLCODE_TOKEN,
3181 p_token2_value => sqlcode,
3182 p_token3 => G_SQLERRM_TOKEN,
3183 p_token3_value => sqlerrm);
3184
3185 x_return_status := G_RET_STS_UNEXP_ERROR;
3186
3187 END get_stream_elements;
3188
3189
3190 ---------------------------------------------------------------------------
3191 -- PROCEDURE get_accrual_elements
3192 --
3193 -- Description
3194 -- Populates Stream Elements array for Accurals
3195 -- such as RENT ACCRUAL
3196 ---------------------------------------------------------------------------
3197 PROCEDURE get_accrual_elements (p_start_date IN DATE,
3198 p_periods IN NUMBER,
3199 p_frequency IN VARCHAR2,
3200 p_structure IN NUMBER,
3201 p_advance_or_arrears IN VARCHAR2,
3202 p_amount IN NUMBER,
3203 p_stub_days IN NUMBER,
3204 p_stub_amount IN NUMBER,
3205 p_currency_code IN VARCHAR2,
3206 p_day_convention_month IN VARCHAR2 DEFAULT '30',
3207 p_day_convention_year IN VARCHAR2 DEFAULT '360',
3208 x_selv_tbl OUT NOCOPY okl_streams_pub.selv_tbl_type,
3209 x_return_status OUT NOCOPY VARCHAR2) IS
3210
3211 lx_return_status VARCHAR2(1);
3212
3213 l_fractional_month NUMBER;
3214 l_months_factor NUMBER;
3215 l_element_count NUMBER;
3216 l_day_count NUMBER;
3217 l_se_date DATE;
3218 l_amount NUMBER;
3219
3220 l_prog_name CONSTANT VARCHAR2(61) := G_PKG_NAME||'.'||'get_accrual_elements';
3221
3222 BEGIN
3223
3224 -- print( l_prog_name, 'begin' );
3225 l_fractional_month := get_fractional_month(p_start_date => p_start_date,
3226 x_return_status => lx_return_status);
3227
3228 IF lx_return_status = OKL_API.G_RET_STS_UNEXP_ERROR THEN
3229 RAISE OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
3230 ELSIF lx_return_status = OKL_API.G_RET_STS_ERROR THEN
3231 RAISE OKL_API.G_EXCEPTION_ERROR;
3232 END IF;
3233
3234 l_months_factor := get_months_factor(p_frequency => p_frequency,
3235 x_return_status => lx_return_status);
3236
3237 IF lx_return_status = OKL_API.G_RET_STS_UNEXP_ERROR THEN
3238 RAISE OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
3239 ELSIF lx_return_status = OKL_API.G_RET_STS_ERROR THEN
3240 RAISE OKL_API.G_EXCEPTION_ERROR;
3241 END IF;
3242
3243 If ( p_periods IS NULL ) AND ( p_stub_days IS NOT NULL ) THen
3244
3245 l_se_date := LAST_DAY(p_start_date);
3246 IF TO_CHAR(l_se_date, 'MON') IN ('JAN', 'MAR', 'MAY', 'JUL', 'AUG', 'OCT', 'DEC') THEN
3247 l_se_date := l_se_date - 1;
3248 END IF;
3249
3250 l_day_count := OKL_PRICING_UTILS_PVT.get_day_count (p_start_date => p_start_date,
3251 p_days_in_month => p_day_convention_month,
3252 p_days_in_year => p_day_convention_year,
3253 p_end_date => l_se_date,
3254 p_arrears => p_advance_or_arrears,
3255 x_return_status => lx_return_status);
3256
3257 IF lx_return_status = OKL_API.G_RET_STS_UNEXP_ERROR THEN
3258 RAISE OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
3259 ELSIF lx_return_status = OKL_API.G_RET_STS_ERROR THEN
3260 RAISE OKL_API.G_EXCEPTION_ERROR;
3261 END IF;
3262
3263 If ( l_day_count < p_stub_days ) Then
3264
3265 x_selv_tbl(1).amount := (p_stub_amount*l_day_count)/p_stub_days;
3266 x_selv_tbl(1).stream_element_date := l_se_date;
3267 x_selv_tbl(1).se_line_number := 1;
3268
3269 l_se_date := ADD_MONTHS(LAST_DAY(p_start_date) , 1);
3270 IF TO_CHAR(l_se_date, 'MON') IN ('JAN', 'MAR', 'MAY', 'JUL', 'AUG', 'OCT', 'DEC') THEN
3271 l_se_date := l_se_date - 1;
3272 END IF;
3273
3274 x_selv_tbl(2).amount := p_stub_amount - x_selv_tbl(1).amount;
3275 x_selv_tbl(2).stream_element_date := l_se_date;
3276 x_selv_tbl(2).se_line_number := 2;
3277
3278 Else
3279
3280 x_selv_tbl(1).amount := p_stub_amount;
3281 x_selv_tbl(1).stream_element_date := l_se_date;
3282 x_selv_tbl(1).se_line_number := 1;
3283
3284 End If;
3285
3286 Else
3287
3288 l_element_count := (p_periods * l_months_factor) + 1;
3289 FOR i IN 1 .. l_element_count LOOP
3290
3291 l_se_date := ADD_MONTHS(LAST_DAY(p_start_date) , (i - 1));
3292
3293 IF TO_CHAR(l_se_date, 'MON') IN ('JAN', 'MAR', 'MAY', 'JUL', 'AUG', 'OCT', 'DEC') THEN
3294
3295 l_se_date := l_se_date - 1;
3296
3297 END IF;
3298
3299 IF i = 1 THEN
3300
3301 l_amount := (p_amount/l_months_factor) * l_fractional_month;
3302
3303 /*
3304 l_amount := okl_accounting_util.validate_amount(
3305 p_amount => ((p_amount/l_months_factor) * l_fractional_month),
3306 p_currency_code => p_currency_code);
3307
3308 */
3309 ELSIF i = l_element_count THEN
3310
3311 l_amount := (p_amount/l_months_factor) * (1 - l_fractional_month);
3312 /*
3313 l_amount := okl_accounting_util.validate_amount(
3314 p_amount => ((p_amount/l_months_factor) * (1 - l_fractional_month)),
3315 p_currency_code => p_currency_code);
3316 */
3317
3318 ELSE
3319
3320 l_amount := p_amount/l_months_factor;
3321 /*
3322 l_amount := okl_accounting_util.validate_amount(p_amount => (p_amount/l_months_factor),
3323 p_currency_code => p_currency_code);
3324 */
3325
3326 END IF;
3327
3328 IF (i < l_element_count) OR (i = l_element_count AND l_amount <> 0) THEN
3329
3330 x_selv_tbl(i).amount := l_amount;
3331 x_selv_tbl(i).stream_element_date := l_se_date;
3332 x_selv_tbl(i).se_line_number := i;
3333
3334 END IF;
3335
3336 END LOOP;
3337
3338 End If;
3339
3340 print( l_prog_name, 'end' );
3341 x_return_status := OKL_API.G_RET_STS_SUCCESS;
3342 EXCEPTION
3343
3344 WHEN OKL_API.G_EXCEPTION_ERROR THEN
3345
3346 x_return_status := G_RET_STS_ERROR;
3347
3348 WHEN OKL_API.G_EXCEPTION_UNEXPECTED_ERROR THEN
3349
3350 x_return_status := G_RET_STS_UNEXP_ERROR;
3351
3352 WHEN OTHERS THEN
3353
3354 OKL_API.SET_MESSAGE (p_app_name => G_APP_NAME,
3355 p_msg_name => G_DB_ERROR,
3356 p_token1 => G_PROG_NAME_TOKEN,
3357 p_token1_value => l_prog_name,
3358 p_token2 => G_SQLCODE_TOKEN,
3359 p_token2_value => sqlcode,
3360 p_token3 => G_SQLERRM_TOKEN,
3361 p_token3_value => sqlerrm);
3362
3363 x_return_status := G_RET_STS_UNEXP_ERROR;
3364
3365 END get_accrual_elements;
3366
3367
3368 ---------------------------------------------------------------------------
3369 -- FUNCTION get_day_count
3370 ---------------------------------------------------------------------------
3371 FUNCTION get_day_count (p_start_date IN DATE,
3372 p_end_date IN DATE,
3373 p_arrears IN VARCHAR2,
3374 x_return_status OUT NOCOPY VARCHAR2) RETURN NUMBER IS
3375
3376 l_prog_name CONSTANT VARCHAR2(61) := G_PKG_NAME||'.'||'get_day_count';
3377
3378 l_days NUMBER := 0;
3379
3380 l_sd_ld VARCHAR2(1) := 'N';
3381 l_cf_ld VARCHAR2(1) := 'N';
3382
3383 l_fom DATE;
3384 i NUMBER := 0;
3385 l_mon_Date DATE;
3386 l_char_days varchar2(4);
3387
3388 l_start_date DATE;
3389 l_end_date DATE;
3390 l_months NUMBER;
3391 -- Bug 4626837 : Start
3392 l_start_mon VARCHAR2(15);
3393 l_end_mon VARCHAR2(15);
3394 -- Bug 4626837 : End
3395 BEGIN
3396
3397 l_start_date := trunc( p_start_date );
3398 l_end_date := trunc( p_end_date );
3399
3400 --print( l_prog_name, 'begin' );
3401 x_return_status := G_RET_STS_SUCCESS;
3402 l_months := 0;
3403 IF l_start_date > l_end_date THEN
3404 RETURN 0;
3405 END IF;
3406
3407 l_fom := LAST_DAY(l_start_date) + 1;
3408 l_mon_date := ADD_MONTHS(LAST_DAY(p_end_date) + 1, -1);
3409
3410 IF l_fom < l_mon_date THEN
3411
3412 /* LOOP
3413 IF l_fom = l_mon_date THEN
3414 EXIT;
3415 ELSE
3416 l_days := l_days + 30;
3417 l_fom := ADD_MONTHS(l_fom, 1);
3418 i := i + 1;
3419 END IF;
3420
3421 END LOOP;*/
3422 i := 1;
3423 l_months := trunc(months_between( l_mon_date, l_fom ));
3424 l_days := l_months * 30;
3425 l_fom := add_months( l_fom, l_months );
3426
3427
3428 END IF;
3429
3430 l_start_mon := TO_CHAR(l_start_date, 'MON');
3431 l_end_mon := TO_CHAR(l_end_date, 'MON');
3432
3433 l_char_days := TO_CHAR(l_end_date, 'DD');
3434 IF l_char_days IN ('30', '31') OR
3435 (l_end_mon = 'FEB' AND l_char_days IN ('28', '29')) THEN
3436 l_cf_ld := 'Y';
3437 END IF;
3438
3439 l_char_days := TO_CHAR(l_start_date, 'DD');
3440 IF l_char_days IN ('30', '31') OR
3441 ( l_start_mon = 'FEB' AND l_char_days IN ('28', '29')) THEN
3442 l_sd_ld := 'Y';
3443 END IF;
3444
3445 -- Starting date is always counted
3446 -- CF date is only counted if payment is in arrears (SRAWLING)
3447
3448 IF i > 0 THEN
3449
3450 IF l_sd_ld = 'Y' THEN
3451 l_days := l_days + 1;
3452 ELSE
3453 l_days := l_days + 30 - l_char_days + 1;
3454 END IF;
3455
3456 IF l_cf_ld = 'Y' THEN
3457 l_days := l_days + 30;
3458 ELSE
3459 l_days := l_days + (l_end_date - l_fom) + 1;
3460 END IF;
3461
3462 ELSE
3463
3464 IF l_end_mon <> l_start_mon THEN -- i=0 so YYYY will be the same
3465
3466 IF l_sd_ld = 'Y' THEN
3467 l_days := l_days + 1;
3468 ELSE
3469 l_days := l_days + 30 - l_char_days + 1;
3470 END IF;
3471
3472 IF l_cf_ld = 'Y' THEN
3473 l_days := l_days + 30;
3474 ELSE
3475 l_days := l_days + (l_end_date - l_fom) + 1;
3476 END IF;
3477
3478 ELSE
3479
3480 IF l_sd_ld = 'Y' AND l_cf_ld = 'Y' THEN
3481 l_days := 1;
3482 ELSIF l_cf_ld = 'Y' THEN
3483 l_days := 30 - l_char_days + 1;
3484 ELSE
3485 l_days := (l_end_date - l_start_date) + 1;
3486 END IF;
3487
3488 END IF;
3489
3490 END IF;
3491
3492 IF p_arrears <> 'Y' THEN
3493 l_days := l_days - 1;
3494 END IF;
3495
3496 --print( l_prog_name, 'end' );
3497 RETURN l_days;
3498
3499 EXCEPTION
3500
3501 WHEN OKL_API.G_EXCEPTION_ERROR THEN
3502
3503 x_return_status := G_RET_STS_ERROR;
3504
3505 WHEN OKL_API.G_EXCEPTION_UNEXPECTED_ERROR THEN
3506
3507 x_return_status := G_RET_STS_UNEXP_ERROR;
3508
3509 WHEN OTHERS THEN
3510
3511 OKL_API.SET_MESSAGE (p_app_name => G_APP_NAME,
3512 p_msg_name => G_DB_ERROR,
3513 p_token1 => G_PROG_NAME_TOKEN,
3514 p_token1_value => l_prog_name,
3515 p_token2 => G_SQLCODE_TOKEN,
3516 p_token2_value => sqlcode,
3517 p_token3 => G_SQLERRM_TOKEN,
3518 p_token3_value => sqlerrm);
3519
3520 x_return_status := G_RET_STS_UNEXP_ERROR;
3521
3522 END get_day_count;
3523
3524
3525
3526 ---------------------------------------------------------------------------
3527 -- PROCEDURE consolidate_header_streams
3528 ---------------------------------------------------------------------------
3529 PROCEDURE consolidate_header_streams(p_khr_id IN NUMBER,
3530 p_purpose_code IN VARCHAR2,
3531 x_return_status OUT NOCOPY VARCHAR2) IS
3532
3533 l_prog_name CONSTANT VARCHAR2(61) := G_PKG_NAME||'.'||'consolidate_header_streams';
3534
3535 CURSOR c_stm_count IS
3536 SELECT COUNT(stm.id),
3537 stm.sty_id
3538 FROM okl_streams stm
3539 WHERE stm.khr_id = p_khr_id
3540 AND stm.say_code = 'WORK'
3541 AND NVL(stm.purpose_code, '-99') = p_purpose_code
3542 AND stm.kle_id IS NULL
3543 HAVING COUNT(stm.id) > 1
3544 GROUP BY stm.kle_id, stm.sty_id;
3545
3546 CURSOR c_stm_first (p_sty_id NUMBER) IS
3547 SELECT id
3548 FROM okl_streams
3549 WHERE khr_id = p_khr_id
3550 AND kle_id IS NULL
3551 AND say_code = 'WORK'
3552 AND sty_id = p_sty_id
3553 AND NVL(purpose_code, '-99') = p_purpose_code;
3554
3555 CURSOR c_stm (p_sty_id NUMBER, p_stm_id NUMBER) IS
3556 SELECT id
3557 FROM okl_streams
3558 WHERE khr_id = p_khr_id
3559 AND kle_id IS NULL
3560 AND sty_id = p_sty_id
3561 AND say_code = 'WORK'
3562 AND NVL(purpose_code, '-99') = p_purpose_code
3563 AND id <> p_stm_id;
3564
3565 CURSOR c_last_sel (p_stm_id NUMBER) IS
3566 SELECT se_line_number
3567 FROM okl_strm_elements
3568 WHERE stm_id = p_stm_id
3569 ORDER BY se_line_number DESC;
3570
3571 CURSOR c_sel (p_stm_id NUMBER) IS
3572 SELECT id
3573 FROM okl_strm_elements
3574 WHERE stm_id = p_stm_id
3575 ORDER BY stream_element_date;
3576
3577 l_stm_first NUMBER;
3578 l_line_num NUMBER;
3579 n NUMBER := 0;
3580
3581 BEGIN
3582
3583 print( l_prog_name, 'begin' );
3584 FOR l_stm_count IN c_stm_count LOOP
3585
3586 OPEN c_stm_first (p_sty_id => l_stm_count.sty_id);
3587 FETCH c_stm_first INTO l_stm_first;
3588 CLOSE c_stm_first;
3589
3590 OPEN c_last_sel (p_stm_id => l_stm_first);
3591 FETCH c_last_sel INTO l_line_num;
3592 CLOSE c_last_sel;
3593
3594 FOR l_stm IN c_stm (l_stm_count.sty_id, l_stm_first) LOOP
3595
3596 DELETE FROM okl_streams WHERE id = l_stm.id
3597 and khr_id = p_khr_id;
3598
3599 FOR l_sel IN c_sel (l_stm.id) LOOP
3600
3601 n := n + 1;
3602
3603 UPDATE okl_strm_elements
3604 SET stm_id = l_stm_first, se_line_number = (l_line_num + n) WHERE id = l_sel.id;
3605
3606 END LOOP;
3607
3608
3609 END LOOP;
3610
3611 END LOOP;
3612
3613
3614 DELETE FROM OKL_STREAMS WHERE purpose_code = 'STUBS'
3615 and khr_id = p_khr_id;
3616 x_return_status := G_RET_STS_SUCCESS;
3617 print( l_prog_name, 'end' );
3618
3619
3620 EXCEPTION
3621
3622 WHEN OKL_API.G_EXCEPTION_ERROR THEN
3623
3624 x_return_status := G_RET_STS_ERROR;
3625
3626 WHEN OKL_API.G_EXCEPTION_UNEXPECTED_ERROR THEN
3627
3628 x_return_status := G_RET_STS_UNEXP_ERROR;
3629
3630 WHEN OTHERS THEN
3631
3632 OKL_API.SET_MESSAGE (p_app_name => G_APP_NAME,
3633 p_msg_name => G_DB_ERROR,
3634 p_token1 => G_PROG_NAME_TOKEN,
3635 p_token1_value => l_prog_name,
3636 p_token2 => G_SQLCODE_TOKEN,
3637 p_token2_value => sqlcode,
3638 p_token3 => G_SQLERRM_TOKEN,
3639 p_token3_value => sqlerrm);
3640
3641 x_return_status := G_RET_STS_UNEXP_ERROR;
3642
3643 END consolidate_header_streams;
3644
3645 ---------------------------------------------------------------------------
3646 -- PROCEDURE consolidate_line_streams
3647 ---------------------------------------------------------------------------
3648 PROCEDURE consolidate_line_streams(p_khr_id IN NUMBER,
3649 p_purpose_code IN VARCHAR2,
3650 x_return_status OUT NOCOPY VARCHAR2) IS
3651
3652 l_prog_name CONSTANT VARCHAR2(61) := G_PKG_NAME||'.'||'consolidate_line_streams';
3653
3654 CURSOR c_stm_count IS
3655 SELECT COUNT(stm.id),
3656 stm.kle_id,
3657 stm.sty_id
3658 FROM okl_streams stm,
3659 okc_k_lines_b cle,
3660 okc_line_styles_b lse
3661 WHERE stm.khr_id = p_khr_id
3662 AND stm.say_code = 'WORK'
3663 AND NVL(stm.purpose_code, '-99') = p_purpose_code
3664 AND stm.kle_id IS NOT NULL
3665 AND stm.kle_id = cle.id
3666 AND cle.lse_id = lse.id
3667 AND lse.lty_code IN ('FEE', 'SOLD_SERVICE', 'LINK_SERV_ASSET', 'FREE_FORM1', 'LINK_FEE_ASSET')
3668 HAVING COUNT(stm.id) > 1
3669 GROUP BY stm.kle_id, stm.sty_id;
3670
3671 CURSOR c_stm_first (p_kle_id NUMBER, p_sty_id NUMBER) IS
3672 SELECT id
3673 FROM okl_streams
3674 WHERE khr_id = p_khr_id
3675 AND kle_id = p_kle_id
3676 AND sty_id = p_sty_id
3677 AND say_code = 'WORK'
3678 AND NVL(purpose_code, '-99') = p_purpose_code;
3679
3680 CURSOR c_stm (p_kle_id NUMBER, p_sty_id NUMBER, p_stm_id NUMBER) IS
3681 SELECT id
3682 FROM okl_streams
3683 WHERE khr_id = p_khr_id
3684 AND kle_id = p_kle_id
3685 AND sty_id = p_sty_id
3686 AND say_code = 'WORK'
3687 AND NVL(purpose_code, '-99') = p_purpose_code
3688 AND id <> p_stm_id;
3689
3690 CURSOR c_last_sel (p_stm_id NUMBER) IS
3691 SELECT se_line_number
3692 FROM okl_strm_elements
3693 WHERE stm_id = p_stm_id
3694 ORDER BY se_line_number DESC;
3695
3696 CURSOR c_sel (p_stm_id NUMBER) IS
3697 SELECT id
3698 FROM okl_strm_elements
3699 WHERE stm_id = p_stm_id
3700 ORDER BY stream_element_date;
3701
3702 l_stm_first NUMBER;
3703 l_line_num NUMBER;
3704 n NUMBER := 0;
3705
3706 BEGIN
3707
3708 print( l_prog_name, 'begin' );
3709
3710 FOR l_stm_count IN c_stm_count LOOP
3711
3712 OPEN c_stm_first (p_kle_id => l_stm_count.kle_id, p_sty_id => l_stm_count.sty_id);
3713 FETCH c_stm_first INTO l_stm_first;
3714 CLOSE c_stm_first;
3715
3716 OPEN c_last_sel (p_stm_id => l_stm_first);
3717 FETCH c_last_sel INTO l_line_num;
3718 CLOSE c_last_sel;
3719
3720 FOR l_stm IN c_stm (l_stm_count.kle_id, l_stm_count.sty_id, l_stm_first) LOOP
3721
3722 DELETE FROM okl_streams WHERE id = l_stm.id
3723 and khr_id = p_khr_id;
3724
3725 FOR l_sel IN c_sel (l_stm.id) LOOP
3726
3727 n := n + 1;
3728
3729 UPDATE okl_strm_elements SET stm_id = l_stm_first, se_line_number = (l_line_num + n) WHERE id = l_sel.id;
3730
3731 END LOOP;
3732
3733 END LOOP;
3734
3735 END LOOP;
3736
3737
3738 DELETE FROM OKL_STREAMS WHERE purpose_code = 'STUBS'
3739 and khr_id = p_khr_id;
3740
3741 x_return_status := G_RET_STS_SUCCESS;
3742 print( l_prog_name, 'end' );
3743
3744
3745 EXCEPTION
3746
3747 WHEN OKL_API.G_EXCEPTION_ERROR THEN
3748
3749 x_return_status := G_RET_STS_ERROR;
3750
3751 WHEN OKL_API.G_EXCEPTION_UNEXPECTED_ERROR THEN
3752
3753 x_return_status := G_RET_STS_UNEXP_ERROR;
3754
3755 WHEN OTHERS THEN
3756
3757 OKL_API.SET_MESSAGE (p_app_name => G_APP_NAME,
3758 p_msg_name => G_DB_ERROR,
3759 p_token1 => G_PROG_NAME_TOKEN,
3760 p_token1_value => l_prog_name,
3761 p_token2 => G_SQLCODE_TOKEN,
3762 p_token2_value => sqlcode,
3763 p_token3 => G_SQLERRM_TOKEN,
3764 p_token3_value => sqlerrm);
3765
3766 x_return_status := G_RET_STS_UNEXP_ERROR;
3767
3768 END consolidate_line_streams;
3769
3770 ---------------------------------------------------------------------------
3771 -- PROCEDURE consolidate_acc_streams
3772 ---------------------------------------------------------------------------
3773 PROCEDURE consolidate_acc_streams(p_khr_id IN NUMBER,
3774 p_purpose_code IN VARCHAR2,
3775 x_return_status OUT NOCOPY VARCHAR2) IS
3776
3777 l_prog_name CONSTANT VARCHAR2(61) := G_PKG_NAME||'.'||'consolidate_acc_streams';
3778
3779 --Modified by kthiruva on 30-May-2005
3780 --Bug 4374085 - Start of Changes
3781 -- The purpose 'SUBSIDY_INCOME' was added to the cursor
3782 --For Bug 4434343 - Purposes 'PASS_THRU_SVC_REV_ACCRUAL' and 'PASS_THRU_SVC_EXP_ACCRUAL'
3783 --added by mansrini on 10-Jun-2005 to the cursor
3784
3785 --Bug 5503678 - order by clause modified by dpsingh on 18-Sep-2006
3786 -- Order on sty_id and not stream_Type_purpose
3787
3788 CURSOR c_acc_stm IS
3789 SELECT ele.stream_element_date,
3790 ele.id element_id,
3791 stm.id stream_id,
3792 stm.kle_id kle_id,
3793 stm.sty_id,
3794 sty.stream_type_purpose stm_purpose,
3795 ele.amount amount
3796 FROM okl_streams stm,
3797 okl_strm_elements ele,
3798 okl_strm_type_b sty
3799 WHERE stm.khr_id = p_khr_id
3800 AND ele.stm_id = stm.id
3801 AND stm.say_code = 'WORK'
3802 AND NVL(stm.purpose_code, '-99') = p_purpose_code
3803 AND sty.id = stm.sty_id
3804 AND sty.stream_type_purpose in ( 'RENT_ACCRUAL','PASS_THRU_PRO_FEE_ACCRUAL',
3805 'PASS_THRU_REV_ACCRUAL', 'SERVICE_INCOME',
3806 'AMORTIZE_FEE_INCOME', 'ACCRUED_FEE_INCOME', 'LEASE_INCOME','INTEREST_INCOME',
3807 'PASS_THRU_EXP_ACCRUAL', 'ACCOUNTING', 'AMORTIZED_FEE_EXPENSE','SUBSIDY_INCOME',
3808 'PASS_THRU_SVC_EXP_ACCRUAL','PASS_THRU_SVC_REV_ACCRUAL')
3809 --Added by dpsingh for consolidation to happen only for ISG streams 5949810
3810 AND (stm.sgn_code <> 'STMP' and stm.sgn_code <> 'STMP-REBK')
3811 --dpsingh 5949810 ends
3812
3813 ORDER BY stm.sty_id,stm.kle_id,ele.stream_element_date;
3814 -- Bug 4374085 - End of Changes
3815
3816 r_acc_stm c_acc_stm%ROWTYPE;
3817
3818
3819 l_stm_first NUMBER;
3820 l_line_num NUMBER;
3821 n NUMBER := 0;
3822
3823 -- Added by RGOOTY
3824 eleid_tbl Okl_Streams_Util.NumberTabTyp;
3825 streamid_tbl Okl_Streams_Util.NumberTabTyp;
3826 sel_date Okl_Streams_Util.DateTabTyp;
3827
3828 lom_date DATE;
3829 i NUMBER;
3830 -- Added by RGOOTY: 4403311
3831 m NUMBER;
3832 d NUMBER;
3833 j NUMBER;
3834 r NUMBER;
3835
3836
3837 l_ele_id_all_tbl Okl_Streams_Util.NumberTabTyp;
3838 l_streamid_all_tbl Okl_Streams_Util.NumberTabTyp;
3839 l_sel_date_all_tbl Okl_Streams_Util.DateTabTyp;
3840 l_kle_id_all_tbl Okl_Streams_Util.NumberTabTyp;
3841 l_amt_all_tbl Okl_Streams_Util.NumberTabTyp;
3842 l_stm_purpose_all_tbl Okl_Streams_Util.Var150TabTyp;
3843
3844 --Added by dpsingh for bug 5503678
3845 l_sty_id_all_tbl Okl_Streams_Util.NumberTabTyp;
3846
3847 l_ele_id_mod_tbl Okl_Streams_Util.NumberTabTyp;
3848 l_streamid_mod_tbl Okl_Streams_Util.NumberTabTyp;
3849 l_sel_date_mod_tbl Okl_Streams_Util.DateTabTyp;
3850 l_kle_id_mod_tbl Okl_Streams_Util.NumberTabTyp;
3851 l_amt_mod_tbl Okl_Streams_Util.NumberTabTyp;
3852 l_stm_purpose_mod_tbl Okl_Streams_Util.Var150TabTyp;
3853
3854 l_ele_id_del_tbl Okl_Streams_Util.NumberTabTyp;
3855 l_streamid_del_tbl Okl_Streams_Util.NumberTabTyp;
3856 l_sel_date_del_tbl Okl_Streams_Util.DateTabTyp;
3857 l_kle_id_del_tbl Okl_Streams_Util.NumberTabTyp;
3858 l_amt_del_tbl Okl_Streams_Util.NumberTabTyp;
3859 l_stm_purpose_del_tbl Okl_Streams_Util.Var150TabTyp;
3860
3861 l_sum_amount NUMBER;
3862 BEGIN
3863
3864 -- print( l_prog_name, 'begin' );
3865
3866 i := 1;
3867 r := 1;
3868 FOR l_acc_stm IN c_acc_stm
3869 LOOP
3870 lom_date := LAST_DAY(l_acc_stm.stream_element_date);
3871 l_sel_date_all_tbl(r) := trunc(lom_date);
3872 l_streamid_all_tbl(r) := l_acc_stm.stream_id;
3873 l_ele_id_all_tbl(r) := l_acc_stm.element_id;
3874 l_kle_id_all_tbl(r) := l_acc_stm.kle_id;
3875 l_amt_all_tbl(r) := l_acc_stm.amount;
3876 l_stm_purpose_all_tbl(r) := l_acc_stm.stm_purpose;
3877 --Added by dpsingh for bug 5503678
3878 l_sty_id_all_tbl(r) := l_acc_stm.sty_id;
3879
3880 r := r + 1;
3881 END LOOP;
3882
3883 --print( l_prog_name, 'Number of accrual Stream Elements ' || l_amt_all_tbl.COUNT );
3884 -- Consolidation of Rental Accruals ..
3885 IF l_ele_id_all_tbl.count > 0
3886 THEN
3887 i := 1; -- Index to loop through all the Accrual Streams
3888 m := 1; -- Index for PL/SQL table for storing the modifed and updatable records only.
3889 d := 1; -- Index for PL/SQL table for storing the streams which have to be deleted.
3890 WHILE i <= l_ele_id_all_tbl.LAST
3891 LOOP
3892 l_sum_amount := l_amt_all_tbl(i);
3893
3894 j := i + 1;
3895 WHILE j >= 2 AND
3896 j <= l_ele_id_all_tbl.COUNT AND
3897 l_kle_id_all_tbl(j) = l_kle_id_all_tbl(i) AND
3898 l_sel_date_all_tbl(j) = l_sel_date_all_tbl(i) AND
3899 --Modified by dpsingh for bug 5503678.
3900 --Check if sty_id remains the same not purpose
3901 l_sty_id_all_tbl(j) = l_sty_id_all_tbl(i)
3902 LOOP
3903 l_sum_amount := l_sum_amount + l_amt_all_tbl(j);
3904
3905 -- Put the record in the to be deleted table
3906 l_ele_id_del_tbl(d) := l_ele_id_all_tbl(j);
3907 l_streamid_del_tbl(d) := l_streamid_all_tbl(j);
3908 l_sel_date_del_tbl(d) := l_sel_date_all_tbl(j);
3909 l_kle_id_del_tbl(d) := l_kle_id_all_tbl(j);
3910 l_amt_del_tbl(d) := l_amt_all_tbl(j);
3911 l_stm_purpose_del_tbl(d) := l_stm_purpose_all_tbl(d);
3912 d := d + 1;
3913
3914 -- Increment j, k
3915 j := j + 1;
3916 END LOOP; -- Loop on j
3917 -- Put the record in to be Updated Table
3918 l_ele_id_mod_tbl(m) := l_ele_id_all_tbl(i);
3919 l_streamid_mod_tbl(m) := l_streamid_all_tbl(i);
3920 l_sel_date_mod_tbl(m) := l_sel_date_all_tbl(i);
3921 l_kle_id_mod_tbl(m) := l_kle_id_all_tbl(i);
3922 l_amt_mod_tbl(m) := l_sum_amount;
3923 l_stm_purpose_mod_tbl(d) := l_stm_purpose_all_tbl(d);
3924 m := m + 1;
3925 -- proceed to unprocessed record !!
3926 i := j;
3927 END LOOP; -- Loop on i
3928 END IF; -- IF l_ele_id_all_tbl.count > 0
3929
3930 --print( l_prog_name, 'Updateable Stream Elements ' || l_ele_id_mod_tbl.COUNT );
3931 --print( l_prog_name, 'To be Deleted Stream Elements ' || l_ele_id_del_tbl.COUNT );
3932
3933 -- Delete the Redundant Rental Accrual Stream Elements
3934 IF l_ele_id_del_tbl.COUNT > 0
3935 THEN
3936 --print( l_prog_name, 'Deleting ' || l_ele_id_del_tbl.COUNT || ' Stream Elements ' );
3937 BEGIN
3938 FORALL indx in l_ele_id_del_tbl.FIRST .. l_ele_id_del_tbl.LAST
3939 DELETE okl_strm_elements
3940 WHERE id = l_ele_id_del_tbl(indx) AND
3941 stm_id = l_streamid_del_tbl(indx);
3942 EXCEPTION
3943 WHEN OTHERS THEN
3944 okl_api.set_message (
3945 p_app_name => G_APP_NAME,
3946 p_msg_name => G_DB_ERROR,
3947 p_token1 => G_PROG_NAME_TOKEN,
3948 p_token1_value => 'consolidate_acc_streams',
3949 p_token2 => G_SQLCODE_TOKEN,
3950 p_token2_value => sqlcode,
3951 p_token3 => G_SQLERRM_TOKEN,
3952 p_token3_value => sqlerrm);
3953 x_return_status := Okl_Api.G_RET_STS_UNEXP_ERROR;
3954 RAISE OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
3955 END;
3956 END IF; -- IF l_ele_id_del_tbl.COUNT > 0
3957
3958 --print( l_prog_name, 'Deleted Redundant Stream Elements ' );
3959
3960 -- Update the Rental Accrual Stream Elements
3961 IF l_ele_id_mod_tbl.COUNT > 0
3962 THEN
3963 --print( l_prog_name, 'Modifiying ' || l_ele_id_mod_tbl.COUNT || ' Stream Elements ' );
3964 BEGIN
3965 FORALL indx in l_ele_id_mod_tbl.FIRST .. l_ele_id_mod_tbl.LAST
3966 UPDATE okl_strm_elements
3967 SET stream_element_date = l_sel_date_mod_tbl(indx),
3968 amount = l_amt_mod_tbl(indx)
3969 WHERE id = l_ele_id_mod_tbl(indx) AND
3970 stm_id = l_streamid_mod_tbl(indx);
3971 EXCEPTION
3972 WHEN OTHERS THEN
3973 okl_api.set_message (
3974 p_app_name => G_APP_NAME,
3975 p_msg_name => G_DB_ERROR,
3976 p_token1 => G_PROG_NAME_TOKEN,
3977 p_token1_value => 'consolidate_acc_streams',
3978 p_token2 => G_SQLCODE_TOKEN,
3979 p_token2_value => sqlcode,
3980 p_token3 => G_SQLERRM_TOKEN,
3981 p_token3_value => sqlerrm);
3982 x_return_status := Okl_Api.G_RET_STS_UNEXP_ERROR;
3983 RAISE OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
3984 END;
3985 END IF; -- IF l_ele_id_mod_tbl.COUNT > 0
3986
3987 x_return_status := G_RET_STS_SUCCESS;
3988 -- print( l_prog_name, 'end' );
3989
3990 EXCEPTION
3991
3992 WHEN OKL_API.G_EXCEPTION_ERROR THEN
3993
3994 x_return_status := G_RET_STS_ERROR;
3995
3996 WHEN OKL_API.G_EXCEPTION_UNEXPECTED_ERROR THEN
3997
3998 x_return_status := G_RET_STS_UNEXP_ERROR;
3999
4000 WHEN OTHERS THEN
4001
4002 OKL_API.SET_MESSAGE (p_app_name => G_APP_NAME,
4003 p_msg_name => G_DB_ERROR,
4004 p_token1 => G_PROG_NAME_TOKEN,
4005 p_token1_value => l_prog_name,
4006 p_token2 => G_SQLCODE_TOKEN,
4007 p_token2_value => sqlcode,
4008 p_token3 => G_SQLERRM_TOKEN,
4009 p_token3_value => sqlerrm);
4010
4011 x_return_status := G_RET_STS_UNEXP_ERROR;
4012
4013 END consolidate_acc_streams;
4014
4015 ---------------------------------------------------------------------------
4016 -- PROCEDURE gen_non_cash_flows
4017 ---------------------------------------------------------------------------
4018 ---------------------------------------------------------------------------
4019 PROCEDURE gen_non_cash_flows
4020 ( p_api_version IN NUMBER,
4021 p_init_msg_list IN VARCHAR2,
4022 p_khr_id IN NUMBER,
4023 p_pre_tax_irr IN NUMBER,
4024 p_generation_type IN VARCHAR2,
4025 p_reporting_book_class IN VARCHAR2,
4026 p_subsidies_yn IN VARCHAR2,
4027 x_return_status OUT NOCOPY VARCHAR2,
4028 x_msg_count OUT NOCOPY NUMBER,
4029 x_msg_data OUT NOCOPY VARCHAR2) IS
4030
4031 lx_return_status VARCHAR2(1);
4032
4033 lx_isAllowed BOOLEAN;
4034 lx_passStatus VARCHAR2(30);
4035 lx_failStatus VARCHAR2(30);
4036
4037
4038 CURSOR c_hdr IS
4039 SELECT chr.template_yn,
4040 chr.currency_code,
4041 chr.start_date,
4042 chr.end_date,
4043 khr.deal_type,
4044 khr.term_duration,
4045 khr.pre_tax_irr,
4046 NVL(khr.generate_accrual_yn, 'Y')
4047 FROM okc_k_headers_b chr,
4048 okl_k_headers khr
4049 WHERE khr.id = p_khr_id
4050 AND chr.id = khr.id;
4051
4052 cursor l_line_csr( chrid NUMBER, lnetype VARCHAR2 ) is
4053 select kle.id,
4054 kle.oec,
4055 kle.residual_code,
4056 kle.capital_amount,
4057 kle.delivered_date,
4058 kle.date_funding_required,
4059 kle.residual_grnty_amount,
4060 kle.date_funding,
4061 kle.residual_value,
4062 kle.amount,
4063 kle.price_negotiated,
4064 kle.start_date,
4065 kle.end_date,
4066 kle.orig_system_id1,
4067 kle.fee_type,
4068 kle.initial_direct_cost,
4069 kle.capital_reduction,
4070 kle.capital_reduction_percent,
4071 NVL(kle.capitalize_down_payment_yn, 'N') capitalize_down_payment_yn
4072 /* ,tl.item_description,
4073 tl.name */
4074 from okl_k_lines_full_v kle,
4075 okc_line_styles_b lse,
4076 -- okc_k_lines_tl tl,
4077 okc_statuses_b sts
4078 where KLE.LSE_ID = LSE.ID
4079 and lse.lty_code = lnetype
4080 -- and tl.id = kle.id
4081 -- and tl.language = userenv('LANG')
4082 and kle.dnz_chr_id = chrid
4083 and sts.code = kle.sts_code
4084 and sts.ste_code not in ('HOLD', 'EXPIRED', 'CANCELLED');
4085
4086 l_line_rec l_line_csr%ROWTYPE;
4087
4088 l_hdr c_hdr%ROWTYPE;
4089 l_deal_type VARCHAR2(30);
4090 l_purpose_code VARCHAR2(30);
4091
4092 l_sty_id NUMBER;
4093 l_sty_name VARCHAR2(150);
4094 l_mapped_sty_name VARCHAR2(150);
4095
4096 l_selv_tbl okl_streams_pub.selv_tbl_type;
4097 l_tmp_selv_tbl okl_streams_pub.selv_tbl_type;
4098 l_pt_tbl okl_streams_pub.selv_tbl_type;
4099 lx_selv_tbl okl_streams_pub.selv_tbl_type;
4100
4101 l_stmv_rec okl_streams_pub.stmv_rec_type;
4102 l_pt_rec okl_streams_pub.stmv_rec_type;
4103 lx_stmv_rec okl_streams_pub.stmv_rec_type;
4104
4105 l_capital_cost NUMBER;
4106
4107 i BINARY_INTEGER := 0;
4108 j BINARY_INTEGER := 0;
4109
4110
4111 Cursor c_rollover_pmnts( chrId NUMBER, kleId NUMBER ) IS
4112 Select nvl(slh.object1_id1, -1) styId
4113 From OKC_RULE_GROUPS_B rgp,
4114 OKC_RULES_B sll,
4115 okc_rules_b slh,
4116 okl_strm_type_b sty
4117 Where slh.rgp_id = rgp.id
4118 and rgp.RGD_CODE = 'LALEVL'
4119 and sll.RULE_INFORMATION_CATEGORY = 'LASLL'
4120 and slh.RULE_INFORMATION_CATEGORY = 'LASLH'
4121 AND TO_CHAR(slh.id) = sll.object2_id1
4122 and rgp.dnz_chr_id = chrId
4123 and rgp.cle_id = kleId
4124 and sty.id = to_number(slh.object1_id1)
4125 and sty.stream_type_purpose NOT IN ('ESTIMATED_PROPERTY_TAX', 'UNSCHEDULED_PRINCIPAL_PAYMENT' );
4126 --bug# 4092324 bug# 4122385
4127
4128 r_rollover_pmnts c_rollover_pmnts%ROWTYPE;
4129
4130 CURSOR c_inflows( khrId NUMBER, kleId NUMBER) IS
4131 SELECT rul2.object1_id1 frequency,
4132 DECODE(rul2.rule_information10, 'Y', 'ARREARS', 'ADVANCE') advance_arrears
4133 FROM okc_rule_groups_b rgp,
4134 okc_rules_b rul1,
4135 okc_rules_b rul2,
4136 okc_k_lines_b cle,
4137 okl_k_lines kle,
4138 okc_line_styles_b lse,
4139 okl_strm_type_b sty
4140 WHERE rul1.rgp_id= rgp.id
4141 ANd rgp.rgd_code = 'LALEVL'
4142 AND rul2.rule_information_category = 'LASLL'
4143 and rul1.RULE_INFORMATION_CATEGORY = 'LASLH'
4144 AND TO_NUMBER(rul2.object2_id1) = rul1.id
4145 AND rul2.rgp_id = rgp.id
4146 AND rgp.dnz_chr_id = khrid
4147 AND rgp.cle_id = kleid
4148 AND cle.id = rgp.cle_id
4149 AND cle.sts_code IN ('PASSED', 'COMPLETE')
4150 AND cle.id = kle.id
4151 AND cle.lse_id = lse.id
4152 and sty.id = to_number(rul1.object1_id1)
4153 and sty.stream_type_purpose NOT IN ('ESTIMATED_PROPERTY_TAX', 'UNSCHEDULED_PRINCIPAL_PAYMENT' );
4154 --bug# 4092324 bug# 4122385
4155
4156 r_inflows c_inflows%ROWTYPE;
4157
4158 l_asbv_tbl OKL_SUBSIDY_PROCESS_PVT.asbv_tbl_type;
4159 l_first_sel_date DATE;
4160 l_months_factor NUMBER;
4161 l_end_date DATE;
4162
4163 l_primary_sty_id NUMBER;
4164
4165 l_prog_name CONSTANT VARCHAR2(61) := G_PKG_NAME||'.'||'gen_non_cash_flows';
4166
4167 Cursor c_subsidy_strm ( styId NUMBER ) IS
4168 Select to_number(Value)
4169 from okl_sgn_translations
4170 where jtot_object1_code = 'OKL_STRMTYP'
4171 and object1_id1 = to_char( styId );
4172
4173 Cursor c_strm_name ( styId NUMBER ) IS
4174 Select name
4175 from okl_strm_type_tl
4176 where language = 'US'
4177 and id = styId;
4178
4179 l_subsidy_stream VARCHAR2(256);
4180 l_accrual_sty_id NUMBER;
4181
4182 CURSOR c_inflows_line ( khrId NUMBER, kleId NUMBER, pCode VARCHAR2 ) IS
4183 SELECT DISTINCT
4184 sel.id id,
4185 sel.amount cf_amount,
4186 sel.stream_element_date cf_date,
4187 sel.comments cf_arrear,
4188 sty.stream_type_purpose cf_purpose,
4189 sll.object1_id1 cf_frequency,
4190 DECODE(sll.object1_id1, 'M', 30, 'Q', 90, 'S', 180, 'A', 360) days_per_period,
4191 DECODE(sll.object1_id1, 'M', 12, 'Q', 4, 'S', 2, 'A', 1) periods_per_year
4192 FROM okl_streams stm,
4193 okl_strm_type_b sty,
4194 okl_strm_elements sel,
4195 okc_k_lines_b cle,
4196 okc_line_styles_b lse,
4197 okc_rules_b sll,
4198 okc_rules_b slh,
4199 okc_rule_groups_b rgp
4200 WHERE stm.khr_id = khrId
4201 AND stm.kle_id = kleId
4202 AND stm.say_code = 'WORK'
4203 AND nvl(stm.purpose_code, '-99') = pCode
4204 AND stm.sty_id = sty.id
4205 AND stm.id = sel.stm_id
4206 AND sty.stream_type_purpose IN ( 'RENT', 'LOAN_PAYMENT')
4207 AND sel.comments IS NOT NULL
4208 AND stm.kle_id = cle.id
4209 AND NOT EXISTS (SELECT 1
4210 FROM okc_rule_groups_b rgp2
4211 WHERE rgp2.dnz_chr_id = khrId
4212 AND rgp2.cle_id = cle.id
4213 AND rgp2.rgd_code = 'LAPSTH')
4214 AND cle.sts_code IN ('PASSED', 'COMPLETE', 'TERMINATED')
4215 AND cle.lse_id = lse.id
4216 AND lse.lty_code = 'FREE_FORM1'
4217 AND cle.id = rgp.cle_id
4218 AND rgp.rgd_code = 'LALEVL'
4219 AND rgp.id = slh.rgp_id
4220 AND slh.rule_information_category = 'LASLH'
4221 AND slh.object1_id1 = TO_CHAR(stm.sty_id)
4222 AND TO_CHAR(slh.id) = sll.object2_id1
4223 AND sll.rule_information_category = 'LASLL'
4224 AND cle.id = kleid;
4225
4226 r_inflows_line c_inflows_line%ROWTYPE;
4227 TYPE r_inflow_line_tbl_type is table of c_inflows_line%ROWTYPE
4228 INDEX BY BINARY_INTEGER;
4229 r_inflow_line_tbl r_inflow_line_tbl_type;
4230 l_pv_date DATE;
4231 l_pv_amount NUMBER;
4232 x_pv_amount NUMBER;
4233
4234 P_FIRST VARCHAR2(1);
4235 L NUMBER := 0;
4236
4237 -- Added by RGOOTY : Start
4238 l_rv_sty_id NUMBER;
4239 l_rv_sty_name VARCHAR2(150);
4240
4241 l_capred_sty_id NUMBER;
4242 l_capred_sty_name VARCHAR2(150);
4243
4244 -- Added by RGOOTY : End
4245 -- Added by RGOOTY for perf.: Bug Number 4346646 Start
4246 l_stmv_tbl Okl_Streams_Pub.stmv_tbl_type;
4247 l_full_selv_tbl Okl_Streams_Pub.selv_tbl_type;
4248
4249 lx_stmv_tbl Okl_Streams_Pub.stmv_tbl_type;
4250 lx_full_selv_tbl Okl_Streams_Pub.selv_tbl_type;
4251 -- Added by RGOOTY for perf.: End
4252
4253 -- djanaswa ER6274342 start
4254 l_arrears_pay_dates_option okl_st_gen_tmpt_sets_all.isg_arrears_pay_dates_option%type;
4255 -- djanaswa ER6274342 end
4256
4257 BEGIN
4258
4259 -- print( l_prog_name, 'begin' );
4260 OPEN c_hdr;
4261 FETCH c_hdr INTO l_hdr;
4262 CLOSE c_hdr;
4263
4264 IF p_reporting_book_class IS NOT NULL THEN
4265 l_deal_type := p_reporting_book_class;
4266 l_purpose_code := 'REPORT';
4267 ELSE
4268 l_deal_type := l_hdr.deal_type;
4269 l_purpose_code := '-99';
4270 END IF;
4271
4272 OKL_ISG_UTILS_PVT.get_primary_stream_type(
4273 p_khr_id => p_khr_id,
4274 p_deal_type => l_deal_type,
4275 p_primary_sty_purpose => 'RESIDUAL_VALUE',
4276 x_return_status => lx_return_status,
4277 x_primary_sty_id => l_rv_sty_id,
4278 x_primary_sty_name => l_rv_sty_name);
4279
4280 -- djanaswa ER6274342 start
4281
4282 IF lx_return_status = OKL_API.G_RET_STS_UNEXP_ERROR THEN
4283 RAISE OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
4284 ELSIF lx_return_status = OKL_API.G_RET_STS_ERROR THEN
4285 RAISE OKL_API.G_EXCEPTION_ERROR;
4286 END IF;
4287
4288 OKL_ISG_UTILS_PVT.get_arrears_pay_dates_option(
4289 p_khr_id => p_khr_id,
4290 x_arrears_pay_dates_option => l_arrears_pay_dates_option,
4291 x_return_status => lx_return_status);
4292
4293 IF(lx_return_status = OKL_API.G_RET_STS_UNEXP_ERROR) THEN
4294 RAISE OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
4295 ELSIF (lx_return_status = OKL_API.G_RET_STS_ERROR) THEN
4296 RAISE OKL_API.G_EXCEPTION_ERROR;
4297 END IF;
4298
4299 -- djanaswa ER6274342 end
4300
4301 -- print( l_prog_name, ' generating streams - begin');
4302 -- Added by RGOOTY: Start
4303 IF ( p_generation_type <> 'SERVICE_LINES' )
4304 THEN
4305 FOR l_line_rec in l_line_csr( p_khr_id, 'FREE_FORM1' )
4306 LOOP
4307 -- Residual Value Streams are getting generated here ....
4308 IF ( (p_generation_type = 'FULL' OR p_generation_type = 'RESIDUAL VALUE') ) AND
4309 ( nvl(l_line_rec.residual_value, 0) > 0 )
4310 THEN
4311
4312 l_selv_tbl.delete;
4313 -- Moving the execution of the RV Stream out of loop
4314 IF ( l_rv_sty_id IS NOT NULL ) THEN
4315 get_stream_header(
4316 p_khr_id => p_khr_id,
4317 p_kle_id => l_line_rec.id,
4318 p_sty_id => l_rv_sty_id,
4319 p_purpose_code => l_purpose_code,
4320 x_stmv_rec => l_stmv_rec,
4321 x_return_status => lx_return_status);
4322
4323 IF lx_return_status = OKL_API.G_RET_STS_UNEXP_ERROR THEN
4324 RAISE OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
4325 ELSIF lx_return_status = OKL_API.G_RET_STS_ERROR THEN
4326 RAISE OKL_API.G_EXCEPTION_ERROR;
4327 END IF;
4328
4329 l_selv_tbl(1).amount := l_line_rec.residual_value;
4330 l_selv_tbl(1).stream_element_date := l_hdr.end_date;
4331 l_selv_tbl(1).se_line_number := 1;
4332 l_selv_tbl(1).accrued_yn := NULL;
4333
4334 lx_return_status := Okl_Streams_Util.round_streams_amount_esg(
4335 p_api_version => g_api_version,
4336 p_init_msg_list => p_init_msg_list,
4337 x_msg_count => x_msg_count,
4338 x_msg_data => x_msg_data,
4339 p_chr_id => p_khr_id,
4340 p_selv_tbl => l_selv_tbl,
4341 x_selv_tbl => lx_selv_tbl,
4342 p_org_id => G_ORG_ID,
4343 p_precision => G_PRECISION,
4344 p_currency_code => G_CURRENCY_CODE,
4345 p_rounding_rule => G_ROUNDING_RULE,
4346 p_apply_rnd_diff=> G_DIFF_LOOKUP_CODE);
4347
4348 IF (lx_return_status = G_RET_STS_UNEXP_ERROR) THEN
4349 RAISE OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
4350 ELSIF (lx_return_status = G_RET_STS_ERROR) THEN
4351 RAISE OKL_API.G_EXCEPTION_ERROR;
4352 END IF;
4353 l_selv_tbl.DELETE;
4354 l_selv_tbl := lx_selv_tbl;
4355 --Accumulate Stream Header: 4346646
4356 OKL_STREAMS_UTIL.accumulate_strm_headers(
4357 p_stmv_rec => l_stmv_rec,
4358 x_full_stmv_tbl => l_stmv_tbl,
4359 x_return_status => lx_return_status );
4360 IF (lx_return_status = G_RET_STS_UNEXP_ERROR) THEN
4361 RAISE OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
4362 ELSIF (lx_return_status = G_RET_STS_ERROR) THEN
4363 RAISE OKL_API.G_EXCEPTION_ERROR;
4364 END IF;
4365 --Accumulate Stream Elements
4366 OKL_STREAMS_UTIL.accumulate_strm_elements(
4367 p_stm_index_no => l_stmv_tbl.LAST,
4368 p_selv_tbl => l_selv_tbl,
4369 x_full_selv_tbl => l_full_selv_tbl,
4370 x_return_status => lx_return_status );
4371 IF (lx_return_status = G_RET_STS_UNEXP_ERROR) THEN
4372 RAISE OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
4373 ELSIF (lx_return_status = G_RET_STS_ERROR) THEN
4374 RAISE OKL_API.G_EXCEPTION_ERROR;
4375 END IF;
4376 l_stmv_rec := NULL;
4377 l_selv_tbl.delete;
4378 lx_stmv_rec := NULL;
4379 lx_selv_tbl.delete;
4380 END IF;
4381 END IF;
4382
4383 -- Capital Reduction Streams are getting generated here ....
4384 IF ( l_line_rec.capitalize_down_payment_yn = 'Y' AND
4385 ( nvl(l_line_rec.capital_reduction, l_line_rec.capital_reduction_percent) > 0 ) ) AND
4386 (p_generation_type = 'FULL' OR p_generation_type = 'CAPITAL REDUCTION')
4387 THEN
4388 OKL_ISG_UTILS_PVT.get_primary_stream_type(
4389 p_khr_id => p_khr_id,
4390 p_deal_type => l_deal_type,
4391 p_primary_sty_purpose => 'CAPITAL_REDUCTION',
4392 x_return_status => lx_return_status,
4393 x_primary_sty_id => l_capred_sty_id,
4394 x_primary_sty_name => l_capred_sty_name);
4395 IF (lx_return_status = G_RET_STS_UNEXP_ERROR) THEN
4396 RAISE OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
4397 ELSIF (lx_return_status = G_RET_STS_ERROR) THEN
4398 RAISE OKL_API.G_EXCEPTION_ERROR;
4399 END IF;
4400
4401 l_selv_tbl.delete;
4402 IF ( l_capred_sty_id IS NOT NULL ) THEN
4403 get_stream_header(
4404 p_khr_id => p_khr_id,
4405 p_kle_id => l_line_rec.id,
4406 p_sty_id => l_capred_sty_id,
4407 p_purpose_code => l_purpose_code,
4408 x_stmv_rec => l_stmv_rec,
4409 x_return_status => lx_return_status);
4410
4411 IF lx_return_status = OKL_API.G_RET_STS_UNEXP_ERROR THEN
4412 RAISE OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
4413 ELSIF lx_return_status = OKL_API.G_RET_STS_ERROR THEN
4414 RAISE OKL_API.G_EXCEPTION_ERROR;
4415 END IF;
4416
4417 IF (l_line_rec.capital_reduction IS NULL ) Then
4418 l_selv_tbl(1).amount := l_line_rec.oec * l_line_rec.capital_reduction_percent * 0.01;
4419 Else
4420 l_selv_tbl(1).amount := l_line_rec.capital_reduction;
4421 END IF;
4422
4423 l_selv_tbl(1).stream_element_date := l_hdr.start_date;
4424 l_selv_tbl(1).se_line_number := 1;
4425 l_selv_tbl(1).accrued_yn := NULL;
4426
4427 lx_return_status := Okl_Streams_Util.round_streams_amount_esg(
4428 p_api_version => g_api_version,
4429 p_init_msg_list => p_init_msg_list,
4430 x_msg_count => x_msg_count,
4431 x_msg_data => x_msg_data,
4432 p_chr_id => p_khr_id,
4433 p_selv_tbl => l_selv_tbl,
4434 x_selv_tbl => lx_selv_tbl,
4435 p_org_id => G_ORG_ID,
4436 p_precision => G_PRECISION,
4437 p_currency_code => G_CURRENCY_CODE,
4438 p_rounding_rule => G_ROUNDING_RULE,
4439 p_apply_rnd_diff=> G_DIFF_LOOKUP_CODE);
4440
4441 IF (lx_return_status = G_RET_STS_UNEXP_ERROR) THEN
4442 RAISE OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
4443 ELSIF (lx_return_status = G_RET_STS_ERROR) THEN
4444 RAISE OKL_API.G_EXCEPTION_ERROR;
4445 END IF;
4446
4447 l_selv_tbl.DELETE;
4448 l_selv_tbl := lx_selv_tbl;
4449
4450 --Accumulate Stream Header: 4346646
4451 OKL_STREAMS_UTIL.accumulate_strm_headers(
4452 p_stmv_rec => l_stmv_rec,
4453 x_full_stmv_tbl => l_stmv_tbl,
4454 x_return_status => lx_return_status );
4455 IF (lx_return_status = G_RET_STS_UNEXP_ERROR) THEN
4456 RAISE OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
4457 ELSIF (lx_return_status = G_RET_STS_ERROR) THEN
4458 RAISE OKL_API.G_EXCEPTION_ERROR;
4459 END IF;
4460
4461 --Accumulate Stream Elements
4462 OKL_STREAMS_UTIL.accumulate_strm_elements(
4463 p_stm_index_no => l_stmv_tbl.LAST,
4464 p_selv_tbl => l_selv_tbl,
4465 x_full_selv_tbl => l_full_selv_tbl,
4466 x_return_status => lx_return_status );
4467 IF (lx_return_status = G_RET_STS_UNEXP_ERROR) THEN
4468 RAISE OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
4469 ELSIF (lx_return_status = G_RET_STS_ERROR) THEN
4470 RAISE OKL_API.G_EXCEPTION_ERROR;
4471 END IF;
4472
4473 l_stmv_rec := NULL;
4474 l_selv_tbl.delete;
4475 lx_stmv_rec := NULL;
4476 lx_selv_tbl.delete;
4477 END IF;
4478
4479 END IF;
4480
4481 IF (p_generation_type = 'FULL' OR p_generation_type = 'SUBSIDY') AND ( p_subsidies_yn = 'Y' ) THEN
4482
4483 OKL_SUBSIDY_PROCESS_PVT.get_asset_subsidy_amount(
4484 p_api_version => G_API_VERSION,
4485 p_init_msg_list => G_FALSE,
4486 p_asset_cle_id => l_line_rec.id,
4487 x_return_status => lx_return_status,
4488 x_msg_count => x_msg_count,
4489 x_msg_data => x_msg_data,
4490 x_asbv_tbl => l_asbv_tbl);
4491
4492 IF lx_return_status = OKL_API.G_RET_STS_UNEXP_ERROR THEN
4493 RAISE OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
4494 ELSIF lx_return_status = OKL_API.G_RET_STS_ERROR THEN
4495 RAISE OKL_API.G_EXCEPTION_ERROR;
4496 END IF;
4497
4498 print( l_prog_name, ' count ' || to_char(l_asbv_tbl.count));
4499
4500
4501
4502 FOR i in 1..l_asbv_tbl.COUNT
4503 LOOP
4504 --print( l_prog_name, ' method ' || l_asbv_tbl(i).accounting_method_code);
4505
4506 If ( l_asbv_tbl(i).accounting_method_code = 'AMORTIZE' )
4507 THEN
4508 l_end_date := l_hdr.end_date;
4509 IF ( l_asbv_tbl(i).maximum_term < l_hdr.term_duration )
4510 THEN
4511 OPEN c_inflows( p_khr_id, l_line_rec.id);
4512 FETCH c_inflows INTO r_inflows;
4513 CLOSE c_inflows;
4514 l_months_factor := get_months_factor(
4515 p_frequency => r_inflows.frequency,
4516 x_return_status => lx_return_status );
4517
4518 IF lx_return_status = OKL_API.G_RET_STS_UNEXP_ERROR THEN
4519 RAISE OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
4520 ELSIF lx_return_status = OKL_API.G_RET_STS_ERROR THEN
4521 RAISE OKL_API.G_EXCEPTION_ERROR;
4522 END IF;
4523
4524 -- djanaswa ER6274342 added parameter p_arrears_pay_dates_option
4525
4526 l_first_sel_date := get_first_sel_date( p_start_date => l_hdr.start_date,
4527 p_advance_or_arrears => r_inflows.advance_arrears,
4528 p_months_increment => l_months_factor,
4529 p_arrears_pay_dates_option => l_arrears_pay_dates_option,
4530 x_return_status => lx_return_status );
4531
4532 IF lx_return_status = OKL_API.G_RET_STS_UNEXP_ERROR THEN
4533 RAISE OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
4534 ELSIF lx_return_status = OKL_API.G_RET_STS_ERROR THEN
4535 RAISE OKL_API.G_EXCEPTION_ERROR;
4536 END IF;
4537 l_end_date := ADD_MONTHS(l_first_sel_date,
4538 l_months_factor*(l_asbv_tbl(i).maximum_term-1));
4539
4540 End If;
4541
4542 get_amortized_accruals (
4543 p_khr_id => p_khr_id,
4544 p_currency_code => l_hdr.currency_code,
4545 p_start_date => l_line_rec.start_date,
4546 p_end_date => l_end_date,
4547 p_deal_type => l_hdr.deal_type,
4548 p_amount => l_asbv_tbl(i).amount,
4549 x_selv_tbl => l_selv_tbl,
4550 x_return_status => lx_return_status);
4551
4552 IF lx_return_status = OKL_API.G_RET_STS_UNEXP_ERROR THEN
4553 RAISE OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
4554 ELSIF lx_return_status = OKL_API.G_RET_STS_ERROR THEN
4555 RAISE OKL_API.G_EXCEPTION_ERROR;
4556 END IF;
4557
4558 ElsIf (l_asbv_tbl(i).accounting_method_code = 'NET' ) Then
4559
4560 get_accrual_elements (
4561 p_start_date => l_hdr.start_date,
4562 p_periods => 1,
4563 p_frequency => 'M',
4564 p_structure => 0,
4565 p_advance_or_arrears => 'ARREARS',
4566 p_amount => l_asbv_tbl(i).amount,
4567 p_stub_days => NULL,
4568 p_stub_amount => NULL,
4569 p_currency_code => l_hdr.currency_code,
4570 x_selv_tbl => l_selv_tbl,
4571 x_return_status => lx_return_status);
4572
4573 IF lx_return_status = OKL_API.G_RET_STS_UNEXP_ERROR THEN
4574 RAISE OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
4575 ELSIF lx_return_status = OKL_API.G_RET_STS_ERROR THEN
4576 RAISE OKL_API.G_EXCEPTION_ERROR;
4577 END IF;
4578
4579 -- bug# 3330636
4580 l_tmp_selv_tbl := l_selv_tbl;
4581 l_selv_tbl.DELETE;
4582 l_selv_tbl(1) := l_tmp_selv_tbl(1);
4583 l_selv_tbl(1).amount := l_asbv_tbl(i).amount;
4584 l_tmp_selv_tbl.DELETE;
4585
4586 End If;
4587
4588 -- get the accrual stream type;
4589 /*
4590
4591 OPEN c_subsidy_strm ( l_asbv_tbl(i).stream_type_id );
4592 FETCH c_subsidy_strm INTO l_accrual_sty_id;
4593
4594
4595 IF ( c_subsidy_strm%NOTFOUND ) THen
4596
4597 OPEN c_strm_name ( l_asbv_tbl(i).stream_type_id );
4598 FETCH c_strm_name INTO l_subsidy_stream;
4599 CLOSE c_strm_name;
4600
4601 OKL_API.SET_MESSAGE (p_app_name => G_APP_NAME,
4602 p_msg_name => 'OKL_NO_SUBSIDY_MAP',
4603 p_token1 => 'SUBS',
4604 p_token1_value => l_subsidy_stream);
4605
4606 CLOSE c_subsidy_strm;
4607 RAISE OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
4608
4609 END IF;
4610 CLOSE c_subsidy_strm;
4611
4612 */
4613
4614 -- bug# 4041666
4615 OKL_ISG_UTILS_PVT.get_dependent_stream_type(
4616 p_khr_id => p_khr_id,
4617 p_deal_type => l_deal_type,
4618 p_primary_sty_id => l_asbv_tbl(i).stream_type_id,
4619 p_dependent_sty_purpose => 'SUBSIDY_INCOME',
4620 x_return_status => lx_return_status,
4621 x_dependent_sty_id => l_accrual_sty_id,
4622 x_dependent_sty_name => l_sty_name);
4623
4624 If ( l_accrual_sty_id is not null ) Then
4625
4626 get_stream_header(p_khr_id => p_khr_id,
4627 p_kle_id => l_line_rec.id,
4628 p_sty_id => l_accrual_sty_id,
4629 p_purpose_code => l_purpose_code,
4630 x_stmv_rec => l_stmv_rec,
4631 x_return_status => lx_return_status);
4632
4633 IF lx_return_status = OKL_API.G_RET_STS_UNEXP_ERROR THEN
4634 RAISE OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
4635 ELSIF lx_return_status = OKL_API.G_RET_STS_ERROR THEN
4636 RAISE OKL_API.G_EXCEPTION_ERROR;
4637 END IF;
4638
4639
4640 lx_return_status := Okl_Streams_Util.round_streams_amount_esg(
4641 p_api_version => g_api_version,
4642 p_init_msg_list => p_init_msg_list,
4643 x_msg_count => x_msg_count,
4644 x_msg_data => x_msg_data,
4645 p_chr_id => p_khr_id,
4646 p_selv_tbl => l_selv_tbl,
4647 x_selv_tbl => lx_selv_tbl,
4648 p_org_id => G_ORG_ID,
4649 p_precision => G_PRECISION,
4650 p_currency_code => G_CURRENCY_CODE,
4651 p_rounding_rule => G_ROUNDING_RULE,
4652 p_apply_rnd_diff=> G_DIFF_LOOKUP_CODE);
4653
4654 IF (lx_return_status = G_RET_STS_UNEXP_ERROR) THEN
4655 RAISE OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
4656 ELSIF (lx_return_status = G_RET_STS_ERROR) THEN
4657 RAISE OKL_API.G_EXCEPTION_ERROR;
4658 END IF;
4659
4660 l_selv_tbl.DELETE;
4661 l_selv_tbl := lx_selv_tbl;
4662
4663 okl_streams_pub.create_streams(p_api_version => G_API_VERSION,
4664 p_init_msg_list => G_FALSE,
4665 x_return_status => lx_return_status,
4666 x_msg_count => x_msg_count,
4667 x_msg_data => x_msg_data,
4668 p_stmv_rec => l_stmv_rec,
4669 p_selv_tbl => l_selv_tbl,
4670 x_stmv_rec => lx_stmv_rec,
4671 x_selv_tbl => lx_selv_tbl);
4672
4673 IF lx_return_status = OKL_API.G_RET_STS_UNEXP_ERROR THEN
4674 RAISE OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
4675 ELSIF lx_return_status = OKL_API.G_RET_STS_ERROR THEN
4676 RAISE OKL_API.G_EXCEPTION_ERROR;
4677 END IF;
4678
4679 l_selv_tbl.delete;
4680
4681 End If;
4682
4683 END LOOP;
4684
4685 l_asbv_tbl.delete;
4686
4687 End If;
4688
4689 IF (p_generation_type = 'FULL' ) AND (l_purpose_code = '-99' ) THEN
4690
4691
4692 OPEN c_rollover_pmnts( p_khr_id, l_line_rec.id);
4693 FETCH c_rollover_pmnts INTO r_rollover_pmnts;
4694 CLOSE c_rollover_pmnts;
4695
4696
4697 l_primary_sty_id := r_rollover_pmnts.styId;
4698
4699 OKL_ISG_UTILS_PVT.get_dependent_stream_type(
4700 p_khr_id => p_khr_id,
4701 p_deal_type => l_deal_type,
4702 p_primary_sty_id => l_primary_sty_id,
4703 p_dependent_sty_purpose => 'PV_RENT',
4704 x_return_status => lx_return_status,
4705 x_dependent_sty_id => l_sty_id,
4706 x_dependent_sty_name => l_sty_name);
4707
4708
4709 IF ( l_sty_id is not null ) THEN
4710
4711 IF lx_return_status = OKL_API.G_RET_STS_UNEXP_ERROR THEN
4712 RAISE OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
4713 ELSIF lx_return_status = OKL_API.G_RET_STS_ERROR THEN
4714 RAISE OKL_API.G_EXCEPTION_ERROR;
4715 END IF;
4716
4717 get_stream_header(p_khr_id => p_khr_id,
4718 p_kle_id => l_line_rec.id,
4719 p_sty_id => l_sty_id,
4720 p_purpose_code => l_purpose_code,
4721 x_stmv_rec => l_stmv_rec,
4722 x_return_status => lx_return_status);
4723
4724 IF lx_return_status = OKL_API.G_RET_STS_UNEXP_ERROR THEN
4725 RAISE OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
4726 ELSIF lx_return_status = OKL_API.G_RET_STS_ERROR THEN
4727 RAISE OKL_API.G_EXCEPTION_ERROR;
4728 END IF;
4729
4730 l_selv_tbl.delete;
4731
4732
4733 P_FIRST := 'T';
4734 L := 0;
4735 i := 0;
4736
4737 r_inflow_line_tbl.delete;
4738 For r_inflows_line_rec in c_inflows_line( p_khr_id, l_line_rec.id, l_purpose_code )
4739 LOOP
4740 i := i + 1;
4741 r_inflow_line_tbl(i) := r_inflows_line_rec;
4742 END LOOP;
4743 i := 1;
4744
4745 FOR i IN r_inflow_line_tbl.first .. r_inflow_line_tbl.last
4746 LOOP
4747 l_pv_date := r_inflow_line_tbl(i).cf_date;
4748 l_pv_amount := 0;
4749
4750 FOR L IN r_inflow_line_tbl.first .. r_inflow_line_tbl.last
4751 LOOP
4752 IF trunc(r_inflow_line_tbl(l).cf_date) >= trunc(l_pv_date)
4753 THEN
4754
4755 get_present_value( p_api_version => G_API_VERSION,
4756 p_init_msg_list => G_FALSE,
4757 p_amount_date => r_inflow_line_tbl(l).cf_date,
4758 p_amount => r_inflow_line_tbl(l).cf_amount,
4759 p_frequency => r_inflow_line_tbl(l).cf_frequency,
4760 p_rate => p_pre_tax_irr,
4761 p_pv_date => l_pv_date,
4762 x_pv_amount => x_pv_amount,
4763 x_return_status => lx_return_status,
4764 x_msg_count => x_msg_count,
4765 x_msg_data => x_msg_data);
4766
4767 IF lx_return_status = OKL_API.G_RET_STS_UNEXP_ERROR THEN
4768 RAISE OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
4769 ELSIF lx_return_status = OKL_API.G_RET_STS_ERROR THEN
4770 RAISE OKL_API.G_EXCEPTION_ERROR;
4771 END IF;
4772 l_pv_amount := l_pv_amount + x_pv_amount;
4773 END IF;
4774 END LOOP;
4775
4776 l_selv_tbl(i).stream_element_date := l_pv_date;
4777 l_selv_tbl(i).amount := l_pv_amount;
4778
4779 l_selv_tbl(i).se_line_number := i;
4780 l_selv_tbl(i).accrued_yn := NULL;
4781 l_selv_tbl(i).comments := r_inflow_line_tbl(i).cf_arrear;
4782 END LOOP;
4783
4784
4785 lx_return_status := Okl_Streams_Util.round_streams_amount_esg(
4786 p_api_version => p_api_version,
4787 p_init_msg_list => p_init_msg_list,
4788 x_msg_count => x_msg_count,
4789 x_msg_data => x_msg_data,
4790 p_chr_id => p_khr_id,
4791 p_selv_tbl => l_selv_tbl,
4792 x_selv_tbl => lx_selv_tbl,
4793 p_org_id => G_ORG_ID,
4794 p_precision => G_PRECISION,
4795 p_currency_code => G_CURRENCY_CODE,
4796 p_rounding_rule => G_ROUNDING_RULE,
4797 p_apply_rnd_diff=> G_DIFF_LOOKUP_CODE);
4798
4799 IF (x_return_status = G_RET_STS_UNEXP_ERROR) THEN
4800 RAISE OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
4801 ELSIF (x_return_status = G_RET_STS_ERROR) THEN
4802 RAISE OKL_API.G_EXCEPTION_ERROR;
4803 END IF;
4804
4805 l_selv_tbl.DELETE;
4806 l_selv_tbl := lx_selv_tbl;
4807
4808 okl_streams_pub.create_streams(p_api_version => G_API_VERSION,
4809 p_init_msg_list => G_FALSE,
4810 x_return_status => lx_return_status,
4811 x_msg_count => x_msg_count,
4812 x_msg_data => x_msg_data,
4813 p_stmv_rec => l_stmv_rec,
4814 p_selv_tbl => l_selv_tbl,
4815 x_stmv_rec => lx_stmv_rec,
4816 x_selv_tbl => lx_selv_tbl);
4817
4818 IF lx_return_status = OKL_API.G_RET_STS_UNEXP_ERROR THEN
4819 RAISE OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
4820 ELSIF lx_return_status = OKL_API.G_RET_STS_ERROR THEN
4821 RAISE OKL_API.G_EXCEPTION_ERROR;
4822 END IF;
4823 END IF;
4824
4825 END IF;
4826 END LOOP;
4827 --Create all the accumulated Streams at one shot ..
4828 IF l_stmv_tbl.COUNT > 0 AND
4829 l_full_selv_tbl.COUNT > 0
4830 THEN
4831 Okl_Streams_Pub.create_streams_perf(
4832 p_api_version,
4833 p_init_msg_list,
4834 lx_return_status,
4835 x_msg_count,
4836 x_msg_data,
4837 l_stmv_tbl,
4838 l_full_selv_tbl,
4839 lx_stmv_tbl,
4840 lx_full_selv_tbl);
4841
4842 IF lx_return_status = OKL_API.G_RET_STS_UNEXP_ERROR THEN
4843 RAISE OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
4844 ELSIF lx_return_status = OKL_API.G_RET_STS_ERROR THEN
4845 RAISE OKL_API.G_EXCEPTION_ERROR;
4846 END IF;
4847 END IF;
4848
4849 END IF;
4850 x_return_status := OKL_API.G_RET_STS_SUCCESS;
4851
4852 -- Added by RGOOTY: End
4853 -- print( l_prog_name, 'end');
4854
4855 EXCEPTION
4856
4857 WHEN OKL_API.G_EXCEPTION_ERROR THEN
4858
4859 x_return_status := G_RET_STS_ERROR;
4860
4861 WHEN OKL_API.G_EXCEPTION_UNEXPECTED_ERROR THEN
4862
4863 x_return_status := G_RET_STS_UNEXP_ERROR;
4864
4865 WHEN OTHERS THEN
4866
4867 OKL_API.SET_MESSAGE (p_app_name => G_APP_NAME,
4868 p_msg_name => G_DB_ERROR,
4869 p_token1 => G_PROG_NAME_TOKEN,
4870 p_token1_value => l_prog_name,
4871 p_token2 => G_SQLCODE_TOKEN,
4872 p_token2_value => sqlcode,
4873 p_token3 => G_SQLERRM_TOKEN,
4874 p_token3_value => sqlerrm);
4875
4876 x_return_status := G_RET_STS_UNEXP_ERROR;
4877
4878 END gen_non_cash_flows;
4879
4880
4881 ---------------------------------------------------------------------------
4882 -- PROCEDURE generate_cash_flows
4883 ---------------------------------------------------------------------------
4884
4885 ---------------------------------------------------------------------------
4886 PROCEDURE generate_cash_flows(
4887 p_api_version IN NUMBER,
4888 p_init_msg_list IN VARCHAR2,
4889 p_khr_id IN NUMBER,
4890 p_kle_id IN NUMBER,
4891 p_sty_id IN NUMBER,
4892 p_payment_tbl IN payment_tbl_type,
4893 x_return_status OUT NOCOPY VARCHAR2,
4894 x_msg_count OUT NOCOPY NUMBER,
4895 x_msg_data OUT NOCOPY VARCHAR2,
4896 x_payment_count OUT NOCOPY BINARY_INTEGER) IS
4897
4898 lx_return_status VARCHAR2(1);
4899
4900 lx_isAllowed BOOLEAN;
4901 lx_passStatus VARCHAR2(30);
4902 lx_failStatus VARCHAR2(30);
4903
4904 CURSOR c_hdr IS
4905 SELECT chr.template_yn,
4906 chr.currency_code,
4907 chr.start_date,
4908 khr.deal_type,
4909 khr.term_duration,
4910 NVL(khr.generate_accrual_yn, 'Y')
4911 FROM okc_k_headers_b chr,
4912 okl_k_headers khr
4913 WHERE khr.id = p_khr_id
4914 AND chr.id = khr.id;
4915
4916 l_hdr c_hdr%ROWTYPE;
4917 l_deal_type VARCHAR2(30);
4918 l_purpose_code VARCHAR2(30) := 'FLOW';
4919
4920 l_pt_yn VARCHAR2(1);
4921 l_passthrough_id NUMBER;
4922
4923 l_sty_id NUMBER;
4924 l_sty_name VARCHAR2(150);
4925 l_mapped_sty_name VARCHAR2(150);
4926
4927 l_pre_tax_inc_id NUMBER;
4928 l_principal_id NUMBER;
4929 l_interest_id NUMBER;
4930 l_prin_bal_id NUMBER;
4931 l_termination_id NUMBER;
4932
4933 l_selv_tbl okl_streams_pub.selv_tbl_type;
4934 l_pt_tbl okl_streams_pub.selv_tbl_type;
4935 lx_selv_tbl okl_streams_pub.selv_tbl_type;
4936
4937 l_stmv_rec okl_streams_pub.stmv_rec_type;
4938 l_pt_rec okl_streams_pub.stmv_rec_type;
4939 lx_stmv_rec okl_streams_pub.stmv_rec_type;
4940
4941 i BINARY_INTEGER := 0;
4942 j BINARY_INTEGER := 0;
4943 l_ele_count BINARY_INTEGER := 0;
4944
4945 l_adv_arr VARCHAR2(30);
4946
4947
4948
4949 l_prog_name CONSTANT VARCHAR2(61) := G_PKG_NAME||'.'||'generate_cash_flows';
4950 l_se_id NUMBER;
4951
4952 --Added by djanaswa for bug 6007644
4953 l_recurrence_date DATE := NULL;
4954 --end djanaswa
4955
4956 BEGIN
4957
4958 -- print( l_prog_name, 'begin' );
4959 -- c_hdr cursor fetches the contract/quote details
4960 OPEN c_hdr;
4961 FETCH c_hdr INTO l_hdr;
4962 CLOSE c_hdr;
4963
4964 l_deal_type := l_hdr.deal_type;
4965 -- Generates a Stub Element and returns the id of the
4966 -- new Stream Created into x_se_id
4967 generate_stub_element( p_api_version => p_api_version,
4968 p_init_msg_list => p_init_msg_list,
4969 p_khr_id => p_khr_id,
4970 p_deal_type => l_deal_type,
4971 x_return_status => x_return_status,
4972 x_msg_count => x_msg_count,
4973 x_msg_data => x_msg_data,
4974 x_se_id => l_se_id );
4975 --print( l_prog_name, 'stub', x_return_status );
4976 IF x_return_status = OKL_API.G_RET_STS_UNEXP_ERROR THEN
4977 RAISE OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
4978 ELSIF x_return_status = OKL_API.G_RET_STS_ERROR THEN
4979 RAISE OKL_API.G_EXCEPTION_ERROR;
4980 END IF;
4981
4982 ---------------------------------------------
4983 -- STEP 1: Spread cash INFLOW
4984 ---------------------------------------------
4985 --print( l_prog_name, ' generating streams - begin');
4986 get_stream_header(
4987 p_khr_id => p_khr_id,
4988 p_kle_id => p_kle_id, -- p_kle_id is passed to generate_cash_flows
4989 p_sty_id => p_sty_id, -- p_sty_id is passed
4990 p_purpose_code => l_purpose_code, -- 'FLOW'
4991 x_stmv_rec => l_stmv_rec,
4992 x_return_status => lx_return_status);
4993 IF lx_return_status = OKL_API.G_RET_STS_UNEXP_ERROR THEN
4994 RAISE OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
4995 ELSIF lx_return_status = OKL_API.G_RET_STS_ERROR THEN
4996 RAISE OKL_API.G_EXCEPTION_ERROR;
4997 END IF;
4998
4999 l_stmv_rec.purpose_code := 'FLOW';
5000 -- Proceed with Creating the RENT Stream Header
5001 okl_streams_pub.create_streams(
5002 p_api_version => G_API_VERSION,
5003 p_init_msg_list => G_FALSE,
5004 x_return_status => lx_return_status,
5005 x_msg_count => x_msg_count,
5006 x_msg_data => x_msg_data,
5007 p_stmv_rec => l_stmv_rec,
5008 x_stmv_rec => lx_stmv_rec);
5009 IF lx_return_status = OKL_API.G_RET_STS_UNEXP_ERROR THEN
5010 RAISE OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
5011 ELSIF lx_return_status = OKL_API.G_RET_STS_ERROR THEN
5012 RAISE OKL_API.G_EXCEPTION_ERROR;
5013 END IF;
5014
5015 --print( l_prog_name, 'created header' );
5016 x_payment_count := 0;
5017 l_ele_count := 0;
5018 -- Creating Stream lines based on the Payments Received ...
5019 -- p_payment_tbl will be having the information similiar to rules..
5020 FOR i IN p_payment_tbl.FIRST..p_payment_tbl.LAST
5021 LOOP
5022 IF p_payment_tbl(i).start_date IS NULL
5023 THEN
5024 OKL_API.SET_MESSAGE (p_app_name => G_APP_NAME,
5025 p_msg_name => 'OKL_NO_SLL_SDATE');
5026 RAISE OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
5027 END IF;
5028 /*
5029 * calculate stream elements for each payment level
5030 * also means that if there are multiple payment levels for an asset, streams are
5031 * calculated at different points.
5032 * the streams amounts are they are entered in payments. In case of passthru, a
5033 * new set of streams are created with amounts that are passthru'ed - l_pt_tbl.
5034 */
5035 IF ( p_payment_tbl(i).arrears_yn = 'Y' )
5036 THEN
5037 l_adv_arr := 'ARREARS';
5038 ELSE
5039 l_adv_arr := 'ADVANCE';
5040 End If;
5041
5042 --Added by djanaswa for bug 6007644
5043 IF((p_payment_tbl(i).periods IS NULL) AND (p_payment_tbl(i).stub_days IS NOT NULL)) THEN
5044 --Set the recurrence date to null for stub payment
5045 l_recurrence_date := NULL;
5046 ELSIF(l_recurrence_date IS NULL) THEN
5047 --Set the recurrence date as Periodic payment level start date
5048 l_recurrence_date := p_payment_tbl(i).start_date;
5049 END IF;
5050 --end djanaswa
5051
5052 --print( l_prog_name, 'start date ' || p_payment_tbl(i).start_date );
5053 -- get_stream_elements create the Stream elements records based on the
5054 -- payments scheduled.
5055 --Added parameter p_recurrence_date by djanaswa for bug 6007644
5056 get_stream_elements(
5057 p_start_date => p_payment_tbl(i).start_date,
5058 p_periods => p_payment_tbl(i).periods,
5059 p_frequency => p_payment_tbl(i).frequency,
5060 p_structure => p_payment_tbl(i).structure,
5061 p_advance_or_arrears => l_adv_arr,
5062 p_amount => p_payment_tbl(i).amount,
5063 p_stub_days => p_payment_tbl(i).stub_days,
5064 p_stub_amount => p_payment_tbl(i).stub_amount,
5065 p_currency_code => l_hdr.currency_code,
5066 p_khr_id => p_khr_id,
5067 p_kle_id => p_kle_id,
5068 p_purpose_code => l_purpose_code,
5069 x_selv_tbl => l_selv_tbl,
5070 x_pt_tbl => l_pt_tbl,
5071 x_return_status => lx_return_status,
5072 x_msg_count => x_msg_count,
5073 x_msg_data => x_msg_data,
5074 p_recurrence_date => l_recurrence_date);
5075 IF lx_return_status = OKL_API.G_RET_STS_UNEXP_ERROR THEN
5076 RAISE OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
5077 ELSIF lx_return_status = OKL_API.G_RET_STS_ERROR THEN
5078 RAISE OKL_API.G_EXCEPTION_ERROR;
5079 END IF;
5080
5081 --print( l_prog_name, 'created elements ' || to_char(l_selv_tbl.COUNT) );
5082 FOR j in 1..l_selv_tbl.COUNT
5083 LOOP
5084 l_ele_count := l_ele_count + 1;
5085 l_selv_tbl(j).stm_id := lx_stmv_rec.id;
5086 l_selv_tbl(j).se_line_number := l_ele_count;
5087 l_selv_tbl(j).id := NULL;
5088 END LOOP;
5089
5090 -- Case of Stub days is given
5091 IF ( p_payment_tbl(i).stub_days IS NOT NULL ) AND ( p_payment_tbl(i).periods IS NULL )
5092 THEN
5093 FOR i in 1..l_selv_tbl.COUNT
5094 LOOP
5095 l_selv_tbl(i).sel_id := l_se_id;
5096 END LOOP;
5097
5098 FOR i in 1..l_pt_tbl.COUNT
5099 LOOP
5100 l_pt_tbl(i).sel_id := l_se_id;
5101 END LOOP;
5102 END IF;
5103 --print( l_prog_name, 'start date ' || l_selv_tbl(1).stream_element_date );
5104 -- Create the Stream Elements in the OKL_STRM_ELEMENTS table
5105 -- feels like the join between stream header and stream elements here is
5106 -- sel_id, we are populating it in the above for loop.
5107 okl_streams_pub.create_stream_elements(
5108 p_api_version => G_API_VERSION,
5109 p_init_msg_list => G_FALSE,
5110 x_return_status => lx_return_status,
5111 x_msg_count => x_msg_count,
5112 x_msg_data => x_msg_data,
5113 p_selv_tbl => l_selv_tbl,
5114 x_selv_tbl => lx_selv_tbl);
5115
5116 IF lx_return_status = OKL_API.G_RET_STS_UNEXP_ERROR THEN
5117 RAISE OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
5118 ELSIF lx_return_status = OKL_API.G_RET_STS_ERROR THEN
5119 RAISE OKL_API.G_EXCEPTION_ERROR;
5120 END IF;
5121
5122 --print( l_prog_name, 'created elements ' || to_char(l_ele_count) );
5123 -- Deleting the Stream Elements for next iteration.
5124 l_selv_tbl.DELETE;
5125
5126 FOR j in 1..lx_selv_tbl.COUNT
5127 LOOP
5128 l_ele_count := l_ele_count + 1;
5129 l_selv_tbl(j) := lx_selv_tbl(j);
5130 -- If Payment rate is not present, then initialize the amount with -999999
5131 l_selv_tbl(j).amount := nvl(p_payment_tbl(i).rate, -9999999);
5132 l_selv_tbl(j).sel_id := lx_selv_tbl(j).id;
5133 l_selv_tbl(j).se_line_number := l_ele_count;
5134 l_selv_tbl(j).id := NULL;
5135 -- Store in stream elements comments whether that represents the
5136 -- missing payments or not.
5137 IF ( lx_selv_tbl(j).amount = -9999999 )
5138 THEN
5139 l_selv_tbl(j).comments := 'Y';
5140 ELSE
5141 l_selv_tbl(j).comments := 'N';
5142 END IF;
5143 END LOOP;
5144 lx_selv_tbl.DELETE;
5145 -- Create/Update Stream Elements with the above modification.
5146 okl_streams_pub.create_stream_elements(
5147 p_api_version => G_API_VERSION,
5148 p_init_msg_list => G_FALSE,
5149 x_return_status => lx_return_status,
5150 x_msg_count => x_msg_count,
5151 x_msg_data => x_msg_data,
5152 p_selv_tbl => l_selv_tbl,
5153 x_selv_tbl => lx_selv_tbl);
5154 IF lx_return_status = OKL_API.G_RET_STS_UNEXP_ERROR THEN
5155 RAISE OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
5156 ELSIF lx_return_status = OKL_API.G_RET_STS_ERROR THEN
5157 RAISE OKL_API.G_EXCEPTION_ERROR;
5158 END IF;
5159 --print( l_prog_name, 'created elements rates ' || to_char(l_ele_count) );
5160 --print( l_prog_name, ' pass thru count ' || to_char(l_pt_tbl.COUNT) );
5161
5162 -- Code for handling Passthroughs Follows
5163 IF l_pt_tbl.COUNT > 0
5164 THEN
5165 IF l_passthrough_id IS NULL
5166 THEN
5167 OKL_ISG_UTILS_PVT.get_dependent_stream_type(
5168 p_khr_id => p_khr_id,
5169 p_deal_type => l_deal_type,
5170 p_dependent_sty_purpose => 'PASS_THRU_EXP_ACCRUAL',
5171 x_return_status => lx_return_status,
5172 x_dependent_sty_id => l_passthrough_id,
5173 x_dependent_sty_name => l_sty_name);
5174 IF lx_return_status = OKL_API.G_RET_STS_UNEXP_ERROR THEN
5175 RAISE OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
5176 ELSIF lx_return_status = OKL_API.G_RET_STS_ERROR THEN
5177 RAISE OKL_API.G_EXCEPTION_ERROR;
5178 END IF;
5179 END IF;
5180 IF l_passthrough_id IS NOT NULL
5181 THEN
5182 get_stream_header(p_khr_id => p_khr_id,
5183 p_kle_id => p_kle_id,
5184 p_sty_id => l_passthrough_id,
5185 p_purpose_code => l_purpose_code,
5186 x_stmv_rec => l_pt_rec,
5187 x_return_status => lx_return_status);
5188
5189 IF lx_return_status = OKL_API.G_RET_STS_UNEXP_ERROR THEN
5190 RAISE OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
5191 ELSIF lx_return_status = OKL_API.G_RET_STS_ERROR THEN
5192 RAISE OKL_API.G_EXCEPTION_ERROR;
5193 END IF;
5194
5195 l_pt_rec.purpose_code := 'PLOW';
5196 lx_return_status := Okl_Streams_Util.round_streams_amount(
5197 p_api_version => g_api_version,
5198 p_init_msg_list => p_init_msg_list,
5199 x_msg_count => x_msg_count,
5200 x_msg_data => x_msg_data,
5201 p_chr_id => p_khr_id,
5202 p_selv_tbl => l_pt_tbl,
5203 x_selv_tbl => lx_selv_tbl);
5204
5205 IF (lx_return_status = G_RET_STS_UNEXP_ERROR) THEN
5206 RAISE OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
5207 ELSIF (lx_return_status = G_RET_STS_ERROR) THEN
5208 RAISE OKL_API.G_EXCEPTION_ERROR;
5209 END IF;
5210 l_pt_tbl.DELETE;
5211 l_pt_tbl := lx_selv_tbl;
5212 -- Create additional Pass Through Streams
5213 okl_streams_pub.create_streams(
5214 p_api_version => G_API_VERSION,
5215 p_init_msg_list => G_FALSE,
5216 x_return_status => lx_return_status,
5217 x_msg_count => x_msg_count,
5218 x_msg_data => x_msg_data,
5219 p_stmv_rec => l_pt_rec,
5220 p_selv_tbl => l_pt_tbl,
5221 x_stmv_rec => lx_stmv_rec,
5222 x_selv_tbl => lx_selv_tbl);
5223
5224 IF lx_return_status = OKL_API.G_RET_STS_UNEXP_ERROR THEN
5225 RAISE OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
5226 ELSIF lx_return_status = OKL_API.G_RET_STS_ERROR THEN
5227 RAISE OKL_API.G_EXCEPTION_ERROR;
5228 END IF;
5229 END IF;
5230 END IF;
5231 -- Clear out reusable data structures
5232 l_pt_rec := NULL;
5233 l_selv_tbl.delete;
5234 l_pt_tbl.delete;
5235 lx_selv_tbl.delete;
5236 x_payment_count := x_payment_count + 1;
5237 --print( l_prog_name, ' payment count ' || to_char(x_payment_count) );
5238 END LOOP;
5239 --print( l_prog_name, ' done ' );
5240 l_sty_name := NULL;
5241 l_sty_id := NULL;
5242 l_stmv_rec := NULL;
5243 lx_stmv_rec := NULL;
5244 x_return_status := lx_return_status;
5245
5246 EXCEPTION
5247
5248 WHEN OKL_API.G_EXCEPTION_ERROR THEN
5249
5250 x_return_status := G_RET_STS_ERROR;
5251
5252 WHEN OKL_API.G_EXCEPTION_UNEXPECTED_ERROR THEN
5253
5254 x_return_status := G_RET_STS_UNEXP_ERROR;
5255
5256 WHEN OTHERS THEN
5257
5258 OKL_API.SET_MESSAGE (p_app_name => G_APP_NAME,
5259 p_msg_name => G_DB_ERROR,
5260 p_token1 => G_PROG_NAME_TOKEN,
5261 p_token1_value => l_prog_name,
5262 p_token2 => G_SQLCODE_TOKEN,
5263 p_token2_value => sqlcode,
5264 p_token3 => G_SQLERRM_TOKEN,
5265 p_token3_value => sqlerrm);
5266
5267 x_return_status := G_RET_STS_UNEXP_ERROR;
5268
5269 END generate_cash_flows;
5270
5271 ---------------------------------------------------------------------------
5272 -- PROCEDURE generate_cash_flows
5273 ---------------------------------------------------------------------------
5274 -- Added output parameter x_se_id by prasjain for bug 5474827
5275 ---------------------------------------------------------------------------
5276 PROCEDURE generate_cash_flows
5277 ( p_api_version IN NUMBER,
5278 p_init_msg_list IN VARCHAR2,
5279 p_khr_id IN NUMBER,
5280 p_generation_type IN VARCHAR2,
5281 p_reporting_book_class IN VARCHAR2,
5282 x_payment_count OUT NOCOPY BINARY_INTEGER,
5283 x_return_status OUT NOCOPY VARCHAR2,
5284 x_msg_count OUT NOCOPY NUMBER,
5285 x_msg_data OUT NOCOPY VARCHAR2,
5286 x_se_id OUT NOCOPY NUMBER) IS
5287
5288 lx_return_status VARCHAR2(1);
5289
5290 lx_isAllowed BOOLEAN;
5291 lx_passStatus VARCHAR2(30);
5292 lx_failStatus VARCHAR2(30);
5293
5294
5295 CURSOR c_hdr IS
5296 SELECT chr.template_yn,
5297 chr.currency_code,
5298 chr.start_date,
5299 khr.deal_type,
5300 khr.term_duration,
5301 NVL(khr.generate_accrual_yn, 'Y')
5302 FROM okc_k_headers_b chr,
5303 okl_k_headers khr
5304 WHERE khr.id = p_khr_id
5305 AND chr.id = khr.id;
5306
5307 l_hdr c_hdr%ROWTYPE;
5308 l_deal_type VARCHAR2(30);
5309 l_purpose_code VARCHAR2(30);
5310
5311 --Added order by cle_id, sty_id, start_date by djanaswa for bug 6007644
5312 CURSOR c_inflows IS
5313 (SELECT rgp.cle_id cle_id,
5314 TO_NUMBER(rul1.object1_id1) sty_id,
5315 FND_DATE.canonical_to_date(rul2.rule_information2) start_date,
5316 TO_NUMBER(rul2.rule_information3) periods,
5317 rul2.object1_id1 frequency,
5318 rul2.rule_information5 structure,
5319 DECODE(rul2.rule_information10, 'Y', 'ARREARS', 'ADVANCE') advance_arrears,
5320 FND_NUMBER.canonical_to_number(rul2.rule_information6) amount,
5321 TO_NUMBER(rul2.rule_information7) stub_days,
5322 TO_NUMBER(rul2.rule_information8) stub_amount,
5323 lse.lty_code lty_code,
5324 kle.capital_amount capital_amount,
5325 kle.residual_value residual_value,
5326 kle.fee_type fee_type
5327 FROM okc_rule_groups_b rgp,
5328 okc_rules_b rul1,
5329 okc_rules_b rul2,
5330 okc_k_lines_b cle,
5331 okl_k_lines kle,
5332 okc_line_styles_b lse
5333 WHERE
5334 rul2.dnz_chr_id = p_khr_id
5335 AND rul2.rule_information_category = 'LASLL'
5336 AND rul1.rule_information_category = 'LASLH'
5337 AND rul1.jtot_object1_code = 'OKL_STRMTYP'
5338 AND rul2.rgp_id = rgp.id
5339 AND TO_NUMBER(rul2.object2_id1) = rul1.id
5340 AND rgp.cle_id = cle.id
5341 AND cle.sts_code IN ('PASSED', 'COMPLETE', 'TERMINATED')
5342 AND cle.id = kle.id
5343 AND cle.lse_id = lse.id)
5344 UNION
5345 (SELECT TO_NUMBER(NULL) cle_id,
5346 TO_NUMBER(rul1.object1_id1) sty_id,
5347 FND_DATE.canonical_to_date(rul2.rule_information2) start_date,
5348 TO_NUMBER(rul2.rule_information3) periods,
5349 rul2.object1_id1 frequency,
5350 rul2.rule_information5 structure,
5351 DECODE(rul2.rule_information10, 'Y', 'ARREARS', 'ADVANCE') advance_arrears,
5352 FND_NUMBER.canonical_to_number(rul2.rule_information6) amount,
5353 TO_NUMBER(rul2.rule_information7) stub_days,
5354 TO_NUMBER(rul2.rule_information8) stub_amount,
5355 NULL lty_code,
5356 TO_NUMBER(NULL) capital_amount,
5357 TO_NUMBER(NULL) residual_value,
5358 NULL fee_type
5359 FROM okc_rule_groups_b rgp,
5360 okc_rules_b rul1,
5361 okc_rules_b rul2
5362 WHERE
5363 rul2.dnz_chr_id = p_khr_id
5364 AND rul2.rule_information_category = 'LASLL'
5365 AND rul1.rule_information_category = 'LASLH'
5366 AND rul1.jtot_object1_code = 'OKL_STRMTYP'
5367 AND rul2.rgp_id = rgp.id
5368 AND rgp.cle_id IS NULL
5369 AND TO_NUMBER(rul2.object2_id1) = rul1.id)
5370 ORDER BY cle_id, sty_id, start_date;
5371
5372 l_inflow c_inflows%rowtype;
5373
5374 CURSOR c_fin_assets IS
5375 SELECT kle.id,
5376 NVL(kle.residual_value, 0) residual_value,
5377 cle.start_date
5378 FROM okc_k_lines_b cle,
5379 okl_k_lines kle,
5380 okc_line_styles_b lse
5381 WHERE cle.chr_id = p_khr_id
5382 AND cle.sts_code IN ('PASSED', 'COMPLETE', 'TERMINATED')
5383 AND cle.lse_id = lse.id
5384 AND lse.lty_code = 'FREE_FORM1'
5385 AND cle.id = kle.id;
5386
5387
5388 CURSOR c_pt_yn (p_cle_id NUMBER) IS
5389 SELECT 'Y'
5390 FROM okc_rule_groups_b
5391 WHERE cle_id = p_cle_id
5392 AND rgd_code = 'LAPSTH';
5393
5394 l_pt_yn VARCHAR2(1);
5395 l_passthrough_id NUMBER;
5396
5397 l_sty_id NUMBER;
5398 l_sty_name VARCHAR2(150);
5399 l_mapped_sty_name VARCHAR2(150);
5400
5401 l_pre_tax_inc_id NUMBER;
5402 l_principal_id NUMBER;
5403 l_interest_id NUMBER;
5404 l_prin_bal_id NUMBER;
5405 l_termination_id NUMBER;
5406
5407 l_selv_tbl okl_streams_pub.selv_tbl_type;
5408 l_pt_tbl okl_streams_pub.selv_tbl_type;
5409 l_pt_pro_fee_tbl okl_streams_pub.selv_tbl_type;
5410 lx_selv_tbl okl_streams_pub.selv_tbl_type;
5411
5412 l_stmv_rec okl_streams_pub.stmv_rec_type;
5413 l_pt_rec okl_streams_pub.stmv_rec_type;
5414 l_pt_pro_fee_rec okl_streams_pub.stmv_rec_type;
5415 lx_stmv_rec okl_streams_pub.stmv_rec_type;
5416
5417 -- Loan Amortization
5418 l_principal_tbl okl_streams_pub.selv_tbl_type;
5419 l_interest_tbl okl_streams_pub.selv_tbl_type;
5420 l_prin_bal_tbl okl_streams_pub.selv_tbl_type;
5421 l_termination_tbl okl_streams_pub.selv_tbl_type;
5422 l_pre_tax_inc_tbl okl_streams_pub.selv_tbl_type;
5423
5424 l_capital_cost NUMBER;
5425 l_interim_interest NUMBER;
5426 l_interim_days NUMBER;
5427 l_interim_dpp NUMBER;
5428 l_asset_iir NUMBER;
5429 l_asset_booking_yield NUMBER;
5430
5431 i BINARY_INTEGER := 0;
5432
5433
5434 l_prog_name CONSTANT VARCHAR2(61) := G_PKG_NAME||'.'||'generate_cash_flows';
5435 l_pay_tbl OKL_STREAM_GENERATOR_PVT.payment_tbl_type;
5436
5437 l_se_id NUMBER;
5438
5439 l_passthrough_pro_fee_id NUMBER;
5440
5441 -- Added by RGOOTY for perf.: Bug Number 4346646 Start
5442 l_stmv_tbl Okl_Streams_Pub.stmv_tbl_type;
5443 l_full_selv_tbl Okl_Streams_Pub.selv_tbl_type;
5444
5445 lx_stmv_tbl Okl_Streams_Pub.stmv_tbl_type;
5446 lx_full_selv_tbl Okl_Streams_Pub.selv_tbl_type;
5447 -- Added by RGOOTY for perf.: End
5448
5449 cursor fee_strm_type_csr ( kleid NUMBER,
5450 linestyle VARCHAR2 ) is
5451 select tl.name strm_name,
5452 sty.capitalize_yn capitalize_yn,
5453 kle.id line_id,
5454 sty.id styp_id,
5455 sty.stream_type_class stream_type_class
5456 from okl_strm_type_tl tl,
5457 okl_strm_type_v sty,
5458 okc_k_items cim,
5459 okl_k_lines_full_v kle,
5460 okc_line_styles_b ls
5461 where tl.id = sty.id
5462 and tl.language = 'US'
5463 and cim.cle_id = kle.id
5464 and ls.id = kle.lse_id
5465 and ls.lty_code = 'FEE'
5466 and cim.object1_id1 = sty.id
5467 and cim.object1_id2 = '#'
5468 and kle.id = kleid;
5469
5470 fee_strm_type_rec fee_strm_type_csr%ROWTYPE;
5471
5472 top_svc_rec top_svc_csr%ROWTYPE;
5473
5474 --Added by djanaswa for bug 6007644
5475 l_recurrence_date DATE := NULL;
5476 l_old_cle_id NUMBER;
5477 l_old_sty_id NUMBER;
5478 --end djanaswa
5479
5480
5481 BEGIN
5482
5483 -- print( l_prog_name, 'begin' );
5484 OPEN c_hdr;
5485 FETCH c_hdr INTO l_hdr;
5486 CLOSE c_hdr;
5487
5488 IF p_reporting_book_class IS NOT NULL THEN
5489 l_deal_type := p_reporting_book_class;
5490 l_purpose_code := 'REPORT';
5491 ELSE
5492 l_deal_type := l_hdr.deal_type;
5493 l_purpose_code := '-99';
5494 END IF;
5495
5496 generate_stub_element( p_api_version => p_api_version,
5497 p_init_msg_list => p_init_msg_list,
5498 p_khr_id => p_khr_id,
5499 p_deal_type => l_deal_type,
5500 x_return_status => x_return_status,
5501 x_msg_count => x_msg_count,
5502 x_msg_data => x_msg_data,
5503 x_se_id => l_se_id );
5504 -- print( l_prog_name, ' generate_stub_elements ', x_return_status );
5505
5506 IF x_return_status = OKL_API.G_RET_STS_UNEXP_ERROR THEN
5507 RAISE OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
5508 ELSIF x_return_status = OKL_API.G_RET_STS_ERROR THEN
5509 RAISE OKL_API.G_EXCEPTION_ERROR;
5510 END IF;
5511
5512 --Added by prasjain for bug 5474827
5513 x_se_id := l_se_id;
5514 --end prasjain
5515
5516 ---------------------------------------------
5517 -- STEP 1: Spread cash INFLOW
5518 ---------------------------------------------
5519
5520 print( l_prog_name, ' generating streams - begin');
5521 x_payment_count := 0;
5522 FOR l_inflow IN c_inflows LOOP
5523 IF ( (l_inflow.lty_code = 'SOLD_SERVICE' OR l_inflow.lty_code = 'LINK_SERV_ASSET') AND
5524 p_generation_type = 'SERVICE_LINES') OR (p_generation_type = 'FULL') THEN
5525 IF l_inflow.start_date IS NULL
5526 THEN
5527 OKL_API.SET_MESSAGE (p_app_name => G_APP_NAME,
5528 p_msg_name => 'OKL_NO_SLL_SDATE');
5529 RAISE OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
5530 END IF;
5531
5532 --Added by djanaswa for bug 6007644
5533 IF((l_inflow.periods IS NULL) AND (l_inflow.stub_days IS NOT NULL)) THEN
5534 --Set the recurrence date to null for stub payment
5535 l_recurrence_date := NULL;
5536 ELSIF(l_recurrence_date IS NULL
5537 OR l_old_cle_id <> l_inflow.cle_id
5538 OR l_old_sty_id <> l_inflow.sty_id) THEN
5539 --Set the recurrence date as periodic payment level start date
5540 l_recurrence_date := l_inflow.start_date;
5541 END IF;
5542 l_old_cle_id := l_inflow.cle_id;
5543 l_old_sty_id := l_inflow.sty_id;
5544 --end djanaswa
5545
5546 /*
5547 * calculate stream elements for each payment level
5548 * also means that if there are multiple payment levels for an asset, streams are
5549 * calculated at different points.
5550 * the streams amounts are they are entered in payments. In case of passthru, a
5551 * new set of streams are created with amounts that are passthru'ed - l_pt_tbl.
5552 */
5553 --Added parameter p_recurrence_date by djanaswa for bug 6007644
5554
5555 get_stream_elements( p_start_date => l_inflow.start_date,
5556 p_periods => l_inflow.periods,
5557 p_frequency => l_inflow.frequency,
5558 p_structure => l_inflow.structure,
5559 p_advance_or_arrears => l_inflow.advance_arrears,
5560 p_amount => l_inflow.amount,
5561 p_stub_days => l_inflow.stub_days,
5562 p_stub_amount => l_inflow.stub_amount,
5563 p_currency_code => l_hdr.currency_code,
5564 p_khr_id => p_khr_id,
5565 p_kle_id => l_inflow.cle_id,
5566 p_purpose_code => l_purpose_code,
5567 x_selv_tbl => l_selv_tbl,
5568 x_pt_tbl => l_pt_tbl,
5569 x_pt_pro_fee_tbl => l_pt_pro_fee_tbl,
5570 x_return_status => lx_return_status,
5571 x_msg_count => x_msg_count,
5572 x_msg_data => x_msg_data,
5573 p_recurrence_date => l_recurrence_date);
5574
5575 IF lx_return_status = OKL_API.G_RET_STS_UNEXP_ERROR THEN
5576 RAISE OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
5577 ELSIF lx_return_status = OKL_API.G_RET_STS_ERROR THEN
5578 RAISE OKL_API.G_EXCEPTION_ERROR;
5579 END IF;
5580
5581 IF ( l_inflow.stub_days IS NOT NULL ) AND ( l_inflow.periods IS NULL )
5582 THEN
5583 FOR i in 1..l_selv_tbl.COUNT
5584 LOOP
5585 l_selv_tbl(i).sel_id := l_se_id;
5586 END LOOP;
5587 FOR i in 1..l_pt_tbl.COUNT
5588 LOOP
5589 l_pt_tbl(i).sel_id := l_se_id;
5590 l_pt_pro_fee_tbl(i).sel_id := l_se_id;
5591 END LOOP;
5592 End If;
5593
5594 /*
5595 * will get multiple headers for same ( khr_id, kle_id, sty_id ) :-()
5596 */
5597
5598 get_stream_header(p_khr_id => p_khr_id,
5599 p_kle_id => l_inflow.cle_id,
5600 p_sty_id => l_inflow.sty_id,
5601 p_purpose_code => l_purpose_code,
5602 x_stmv_rec => l_stmv_rec,
5603 x_return_status => lx_return_status);
5604
5605 IF lx_return_status = OKL_API.G_RET_STS_UNEXP_ERROR THEN
5606 RAISE OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
5607 ELSIF lx_return_status = OKL_API.G_RET_STS_ERROR THEN
5608 RAISE OKL_API.G_EXCEPTION_ERROR;
5609 END IF;
5610
5611 lx_return_status := Okl_Streams_Util.round_streams_amount_esg(
5612 p_api_version => g_api_version,
5613 p_init_msg_list => p_init_msg_list,
5614 x_msg_count => x_msg_count,
5615 x_msg_data => x_msg_data,
5616 p_chr_id => p_khr_id,
5617 p_selv_tbl => l_selv_tbl,
5618 x_selv_tbl => lx_selv_tbl,
5619 p_org_id => G_ORG_ID,
5620 p_precision => G_PRECISION,
5621 p_currency_code => G_CURRENCY_CODE,
5622 p_rounding_rule => G_ROUNDING_RULE,
5623 p_apply_rnd_diff=> G_DIFF_LOOKUP_CODE);
5624
5625 IF (lx_return_status = G_RET_STS_UNEXP_ERROR) THEN
5626 RAISE OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
5627 ELSIF (lx_return_status = G_RET_STS_ERROR) THEN
5628 RAISE OKL_API.G_EXCEPTION_ERROR;
5629 END IF;
5630
5631 l_selv_tbl.DELETE;
5632 l_selv_tbl := lx_selv_tbl;
5633
5634 --Accumulate Stream Header
5635 OKL_STREAMS_UTIL.accumulate_strm_headers(
5636 p_stmv_rec => l_stmv_rec,
5637 x_full_stmv_tbl => l_stmv_tbl,
5638 x_return_status => lx_return_status );
5639 IF (lx_return_status = G_RET_STS_UNEXP_ERROR) THEN
5640 RAISE OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
5641 ELSIF (lx_return_status = G_RET_STS_ERROR) THEN
5642 RAISE OKL_API.G_EXCEPTION_ERROR;
5643 END IF;
5644
5645 --Accumulate Stream Elements
5646 OKL_STREAMS_UTIL.accumulate_strm_elements(
5647 p_stm_index_no => l_stmv_tbl.LAST,
5648 p_selv_tbl => l_selv_tbl,
5649 x_full_selv_tbl => l_full_selv_tbl,
5650 x_return_status => lx_return_status );
5651 IF (lx_return_status = G_RET_STS_UNEXP_ERROR) THEN
5652 RAISE OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
5653 ELSIF (lx_return_status = G_RET_STS_ERROR) THEN
5654 RAISE OKL_API.G_EXCEPTION_ERROR;
5655 END IF;
5656 /*
5657 okl_streams_pub.create_streams(p_api_version => G_API_VERSION,
5658 p_init_msg_list => G_FALSE,
5659 x_return_status => lx_return_status,
5660 x_msg_count => x_msg_count,
5661 x_msg_data => x_msg_data,
5662 p_stmv_rec => l_stmv_rec,
5663 p_selv_tbl => l_selv_tbl,
5664 x_stmv_rec => lx_stmv_rec,
5665 x_selv_tbl => lx_selv_tbl);
5666
5667 IF lx_return_status = OKL_API.G_RET_STS_UNEXP_ERROR THEN
5668 RAISE OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
5669 ELSIF lx_return_status = OKL_API.G_RET_STS_ERROR THEN
5670 RAISE OKL_API.G_EXCEPTION_ERROR;
5671 END IF;
5672 */
5673 IF l_pt_tbl.COUNT > 0 THEN
5674 --Added by mansrini on 30-Jun-2005 for generating pass through accrual streams for service lines
5675 --Bug 4434343 - Start of Changes
5676 IF (l_inflow.lty_code = 'FEE') OR (l_inflow.lty_code = 'LINK_FEE_ASSET') THEN
5677 OKL_ISG_UTILS_PVT.get_dependent_stream_type(
5678 p_khr_id => p_khr_id,
5679 p_deal_type => l_deal_type,
5680 p_primary_sty_id => l_inflow.sty_id,
5681 p_dependent_sty_purpose => 'PASS_THRU_EXP_ACCRUAL',
5682 x_return_status => lx_return_status,
5683 x_dependent_sty_id => l_passthrough_id,
5684 x_dependent_sty_name => l_sty_name);
5685 IF lx_return_status = OKL_API.G_RET_STS_UNEXP_ERROR THEN
5686 RAISE OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
5687 ELSIF lx_return_status = OKL_API.G_RET_STS_ERROR THEN
5688 RAISE OKL_API.G_EXCEPTION_ERROR;
5689 END IF;
5690 ELSIF (l_inflow.lty_code = 'SOLD_SERVICE') OR (l_inflow.lty_code = 'LINK_SERV_ASSET') THEN
5691 OKL_ISG_UTILS_PVT.get_dependent_stream_type(
5692 p_khr_id => p_khr_id,
5693 p_deal_type => l_deal_type,
5694 p_primary_sty_id => l_inflow.sty_id,
5695 p_dependent_sty_purpose => 'PASS_THRU_SVC_EXP_ACCRUAL',
5696 x_return_status => lx_return_status,
5697 x_dependent_sty_id => l_passthrough_id,
5698 x_dependent_sty_name => l_sty_name);
5699 IF lx_return_status = OKL_API.G_RET_STS_UNEXP_ERROR THEN
5700 RAISE OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
5701 ELSIF lx_return_status = OKL_API.G_RET_STS_ERROR THEN
5702 RAISE OKL_API.G_EXCEPTION_ERROR;
5703 END IF;
5704 END IF;
5705 --Bug 4434343 - End of Changes
5706
5707
5708 If l_passthrough_id IS NOT NULL then
5709
5710 get_stream_header(p_khr_id => p_khr_id,
5711 p_kle_id => l_inflow.cle_id,
5712 p_sty_id => l_passthrough_id,
5713 p_purpose_code => l_purpose_code,
5714 x_stmv_rec => l_pt_rec,
5715 x_return_status => lx_return_status);
5716
5717 IF lx_return_status = OKL_API.G_RET_STS_UNEXP_ERROR THEN
5718 RAISE OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
5719 ELSIF lx_return_status = OKL_API.G_RET_STS_ERROR THEN
5720 RAISE OKL_API.G_EXCEPTION_ERROR;
5721 END IF;
5722
5723
5724 lx_return_status := Okl_Streams_Util.round_streams_amount_esg(
5725 p_api_version => g_api_version,
5726 p_init_msg_list => p_init_msg_list,
5727 x_msg_count => x_msg_count,
5728 x_msg_data => x_msg_data,
5729 p_chr_id => p_khr_id,
5730 p_selv_tbl => l_pt_tbl,
5731 x_selv_tbl => lx_selv_tbl,
5732 p_org_id => G_ORG_ID,
5733 p_precision => G_PRECISION,
5734 p_currency_code => G_CURRENCY_CODE,
5735 p_rounding_rule => G_ROUNDING_RULE,
5736 p_apply_rnd_diff=> G_DIFF_LOOKUP_CODE);
5737
5738 IF (lx_return_status = G_RET_STS_UNEXP_ERROR) THEN
5739 RAISE OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
5740 ELSIF (lx_return_status = G_RET_STS_ERROR) THEN
5741 RAISE OKL_API.G_EXCEPTION_ERROR;
5742 END IF;
5743
5744 l_pt_tbl.DELETE;
5745 l_pt_tbl := lx_selv_tbl;
5746 --Accumulate Stream Header: 4346646
5747 OKL_STREAMS_UTIL.accumulate_strm_headers(
5748 p_stmv_rec => l_pt_rec,
5749 x_full_stmv_tbl => l_stmv_tbl,
5750 x_return_status => lx_return_status );
5751 IF (lx_return_status = G_RET_STS_UNEXP_ERROR) THEN
5752 RAISE OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
5753 ELSIF (lx_return_status = G_RET_STS_ERROR) THEN
5754 RAISE OKL_API.G_EXCEPTION_ERROR;
5755 END IF;
5756
5757 --Accumulate Stream Elements
5758 OKL_STREAMS_UTIL.accumulate_strm_elements(
5759 p_stm_index_no => l_stmv_tbl.LAST,
5760 p_selv_tbl => l_pt_tbl,
5761 x_full_selv_tbl => l_full_selv_tbl,
5762 x_return_status => lx_return_status );
5763 IF (lx_return_status = G_RET_STS_UNEXP_ERROR) THEN
5764 RAISE OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
5765 ELSIF (lx_return_status = G_RET_STS_ERROR) THEN
5766 RAISE OKL_API.G_EXCEPTION_ERROR;
5767 END IF;
5768 /*
5769 okl_streams_pub.create_streams(p_api_version => G_API_VERSION,
5770 p_init_msg_list => G_FALSE,
5771 x_return_status => lx_return_status,
5772 x_msg_count => x_msg_count,
5773 x_msg_data => x_msg_data,
5774 p_stmv_rec => l_pt_rec,
5775 p_selv_tbl => l_pt_tbl,
5776 x_stmv_rec => lx_stmv_rec,
5777 x_selv_tbl => lx_selv_tbl);
5778
5779 IF lx_return_status = OKL_API.G_RET_STS_UNEXP_ERROR THEN
5780 RAISE OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
5781 ELSIF lx_return_status = OKL_API.G_RET_STS_ERROR THEN
5782 RAISE OKL_API.G_EXCEPTION_ERROR;
5783 END IF;
5784 */
5785 End If;
5786 END IF;
5787
5788 IF l_pt_pro_fee_tbl.COUNT > 0 THEN
5789
5790 IF l_passthrough_pro_fee_id IS NULL THEN
5791
5792 If ( l_inflow.lty_code = 'LINK_FEE_ASSET') Then
5793
5794 OPEN top_svc_csr( p_khr_id, l_inflow.cle_id );
5795 FETCH top_svc_csr INTO top_svc_rec;
5796 CLOSE top_svc_csr;
5797
5798 OPEN fee_strm_type_csr ( top_svc_rec.top_svc_id, 'FEE' );
5799 FETCH fee_strm_type_csr into fee_strm_type_rec;
5800 CLOSE fee_strm_type_csr;
5801
5802 Else
5803
5804 OPEN fee_strm_type_csr ( l_inflow.cle_id, 'FEE' );
5805 FETCH fee_strm_type_csr into fee_strm_type_rec;
5806 CLOSE fee_strm_type_csr;
5807
5808 End If;
5809
5810 OKL_ISG_UTILS_PVT.get_dependent_stream_type(
5811 p_khr_id => p_khr_id,
5812 p_deal_type => l_deal_type,
5813 p_primary_sty_id => fee_strm_type_rec.styp_id,
5814 p_dependent_sty_purpose => 'PASS_THRU_PRO_FEE_ACCRUAL',
5815 x_return_status => lx_return_status,
5816 x_dependent_sty_id => l_passthrough_pro_fee_id,
5817 x_dependent_sty_name => l_sty_name);
5818
5819 IF lx_return_status = OKL_API.G_RET_STS_UNEXP_ERROR THEN
5820 RAISE OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
5821 ELSIF lx_return_status = OKL_API.G_RET_STS_ERROR THEN
5822 RAISE OKL_API.G_EXCEPTION_ERROR;
5823 END IF;
5824
5825 END IF;
5826
5827 If l_passthrough_pro_fee_id IS NOT NULL then
5828
5829 get_stream_header(p_khr_id => p_khr_id,
5830 p_kle_id => l_inflow.cle_id,
5831 p_sty_id => l_passthrough_pro_fee_id,
5832 p_purpose_code => l_purpose_code,
5833 x_stmv_rec => l_pt_pro_fee_rec,
5834 x_return_status => lx_return_status);
5835
5836 IF lx_return_status = OKL_API.G_RET_STS_UNEXP_ERROR THEN
5837 RAISE OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
5838 ELSIF lx_return_status = OKL_API.G_RET_STS_ERROR THEN
5839 RAISE OKL_API.G_EXCEPTION_ERROR;
5840 END IF;
5841
5842
5843 lx_return_status := Okl_Streams_Util.round_streams_amount_esg(
5844 p_api_version => g_api_version,
5845 p_init_msg_list => p_init_msg_list,
5846 x_msg_count => x_msg_count,
5847 x_msg_data => x_msg_data,
5848 p_chr_id => p_khr_id,
5849 p_selv_tbl => l_pt_pro_fee_tbl,
5850 x_selv_tbl => lx_selv_tbl,
5851 p_org_id => G_ORG_ID,
5852 p_precision => G_PRECISION,
5853 p_currency_code => G_CURRENCY_CODE,
5854 p_rounding_rule => G_ROUNDING_RULE,
5855 p_apply_rnd_diff=> G_DIFF_LOOKUP_CODE);
5856
5857 IF (lx_return_status = G_RET_STS_UNEXP_ERROR) THEN
5858 RAISE OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
5859 ELSIF (lx_return_status = G_RET_STS_ERROR) THEN
5860 RAISE OKL_API.G_EXCEPTION_ERROR;
5861 END IF;
5862
5863 l_pt_pro_fee_tbl.DELETE;
5864 l_pt_pro_fee_tbl := lx_selv_tbl;
5865
5866 OKL_STREAMS_UTIL.accumulate_strm_headers(
5867 p_stmv_rec => l_pt_pro_fee_rec,
5868 x_full_stmv_tbl => l_stmv_tbl,
5869 x_return_status => lx_return_status );
5870
5871 IF (lx_return_status = G_RET_STS_UNEXP_ERROR) THEN
5872 RAISE OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
5873 ELSIF (lx_return_status = G_RET_STS_ERROR) THEN
5874 RAISE OKL_API.G_EXCEPTION_ERROR;
5875 END IF;
5876
5877 --Accumulate Stream Elements
5878 OKL_STREAMS_UTIL.accumulate_strm_elements(
5879 p_stm_index_no => l_stmv_tbl.LAST,
5880 p_selv_tbl => l_pt_pro_fee_tbl,
5881 x_full_selv_tbl => l_full_selv_tbl,
5882 x_return_status => lx_return_status );
5883
5884 IF lx_return_status = OKL_API.G_RET_STS_UNEXP_ERROR THEN
5885 RAISE OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
5886 ELSIF lx_return_status = OKL_API.G_RET_STS_ERROR THEN
5887 RAISE OKL_API.G_EXCEPTION_ERROR;
5888 END IF;
5889
5890 End If;
5891
5892 END IF;
5893
5894
5895 -- Clear out reusable data structures
5896
5897 l_sty_name := NULL;
5898 l_sty_id := NULL;
5899
5900 l_stmv_rec := NULL;
5901 l_pt_rec := NULL;
5902 l_selv_tbl.delete;
5903 l_pt_tbl.delete;
5904
5905 l_pt_pro_fee_rec := NULL;
5906 l_pt_pro_fee_tbl.delete;
5907
5908
5909 lx_stmv_rec := NULL;
5910 lx_selv_tbl.delete;
5911
5912 x_payment_count := x_payment_count + 1;
5913 END IF;
5914 END LOOP;
5915 --Create all the accumulated Streams at one shot ..
5916 Okl_Streams_Pub.create_streams_perf(
5917 p_api_version,
5918 p_init_msg_list,
5919 lx_return_status,
5920 x_msg_count,
5921 x_msg_data,
5922 l_stmv_tbl,
5923 l_full_selv_tbl,
5924 lx_stmv_tbl,
5925 lx_full_selv_tbl);
5926 IF lx_return_status = OKL_API.G_RET_STS_UNEXP_ERROR THEN
5927 RAISE OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
5928 ELSIF lx_return_status = OKL_API.G_RET_STS_ERROR THEN
5929 RAISE OKL_API.G_EXCEPTION_ERROR;
5930 END IF;
5931
5932 EXCEPTION
5933
5934 WHEN OKL_API.G_EXCEPTION_ERROR THEN
5935
5936 x_return_status := G_RET_STS_ERROR;
5937
5938 WHEN OKL_API.G_EXCEPTION_UNEXPECTED_ERROR THEN
5939
5940 x_return_status := G_RET_STS_UNEXP_ERROR;
5941
5942 WHEN OTHERS THEN
5943
5944 OKL_API.SET_MESSAGE (p_app_name => G_APP_NAME,
5945 p_msg_name => G_DB_ERROR,
5946 p_token1 => G_PROG_NAME_TOKEN,
5947 p_token1_value => l_prog_name,
5948 p_token2 => G_SQLCODE_TOKEN,
5949 p_token2_value => sqlcode,
5950 p_token3 => G_SQLERRM_TOKEN,
5951 p_token3_value => sqlerrm);
5952
5953 x_return_status := G_RET_STS_UNEXP_ERROR;
5954
5955 END generate_cash_flows;
5956
5957 ---------------------------------------------------------------------------
5958 -- PROCEDURE generate_streams
5959 ---------------------------------------------------------------------------
5960 ---------------------------------------------------------------------------
5961 /*
5962 * single point entry for streams generation.
5963 * p_compute_irr : boolean to calculate irr.
5964 * p_gen.._type : FULL, SERVICE_ACCRUAL, etc
5965 * p_repor..class: streams for reporting product. yields are not calculated for report.
5966 */
5967 PROCEDURE generate_streams( p_api_version IN NUMBER,
5968 p_init_msg_list IN VARCHAR2,
5969 p_khr_id IN NUMBER,
5970 p_compute_rates IN VARCHAR2,
5971 p_generation_type IN VARCHAR2,
5972 p_reporting_book_class IN VARCHAR2,
5973 x_contract_rates OUT NOCOPY rate_rec_type,
5974 x_return_status OUT NOCOPY VARCHAR2,
5975 x_msg_count OUT NOCOPY NUMBER,
5976 x_msg_data OUT NOCOPY VARCHAR2) IS
5977
5978 lx_return_status VARCHAR2(1);
5979
5980 lx_isAllowed BOOLEAN;
5981 lx_passStatus VARCHAR2(30);
5982 lx_failStatus VARCHAR2(30);
5983
5984
5985 CURSOR c_hdr IS
5986 SELECT chr.template_yn,
5987 chr.currency_code,
5988 chr.start_date,
5989 chr.end_date,
5990 khr.deal_type,
5991 khr.term_duration,
5992 NVL(khr.generate_accrual_yn, 'Y'),
5993 nvl(rpar.base_rate, 10) base_rate
5994 FROM okc_k_headers_b chr,
5995 okl_k_headers khr,
5996 OKL_K_RATE_PARAMS rpar
5997 WHERE khr.id = p_khr_id
5998 AND chr.id = khr.id
5999 AND rpar.khr_id(+) = khr.id;
6000
6001 l_hdr c_hdr%ROWTYPE;
6002 l_deal_type VARCHAR2(30);
6003 l_purpose_code VARCHAR2(30);
6004
6005 p_compute_irr VARCHAR2(1) := p_compute_rates;
6006
6007 CURSOR c_niv (kleId NUMBER) IS
6008 SELECT FND_NUMBER.canonical_to_number(rul2.rule_information6) amount,
6009 TO_NUMBER(rul2.rule_information8) stub_amount
6010 FROM okc_rule_groups_b rgp,
6011 okc_rules_b rul1,
6012 okc_rules_b rul2,
6013 okc_k_lines_b cle,
6014 okl_k_lines kle,
6015 okc_line_styles_b lse,
6016 okl_strm_type_b sty
6017 WHERE rul2.dnz_chr_id = p_khr_id
6018 AND rul2.rule_information_category = 'LASLL'
6019 AND rul2.rgp_id = rgp.id
6020 AND TO_NUMBER(rul2.object2_id1) = rul1.id
6021 AND rgp.cle_id = cle.id
6022 AND cle.sts_code = 'TERMINATED'
6023 AND cle.id = kle.id
6024 AND cle.lse_id = lse.id
6025 AND cle.id = kleId
6026 AND sty.id = rul1.object1_id1
6027 AND sty.stream_type_purpose = 'TERMINATION_VALUE';
6028
6029 r_niv c_niv%ROWTYPE;
6030
6031
6032 CURSOR c_inflows IS
6033 SELECT rgp.cle_id cle_id,
6034 TO_NUMBER(rul1.object1_id1) sty_id,
6035 sty.stream_type_purpose,
6036 FND_DATE.canonical_to_date(rul2.rule_information2) start_date,
6037 TO_NUMBER(rul2.rule_information3) periods,
6038 rul2.object1_id1 frequency,
6039 rul2.rule_information5 structure,
6040 DECODE(rul2.rule_information10, 'Y', 'ARREARS', 'ADVANCE') advance_arrears,
6041 FND_NUMBER.canonical_to_number(rul2.rule_information6) amount,
6042 TO_NUMBER(rul2.rule_information7) stub_days,
6043 TO_NUMBER(rul2.rule_information8) stub_amount,
6044 lse.lty_code lty_code,
6045 kle.capital_amount capital_amount,
6046 kle.residual_value residual_value,
6047 kle.fee_type fee_type
6048 FROM okc_rule_groups_b rgp,
6049 okc_rules_b rul1,
6050 okc_rules_b rul2,
6051 okc_k_lines_b cle,
6052 okl_k_lines kle,
6053 okc_line_styles_b lse,
6054 okl_strm_type_b sty
6055 WHERE
6056 rul2.dnz_chr_id = p_khr_id
6057 AND rul2.rule_information_category = 'LASLL'
6058 AND rul2.rgp_id = rgp.id
6059 AND TO_NUMBER(rul2.object2_id1) = rul1.id
6060 AND rgp.cle_id = cle.id
6061 AND cle.sts_code IN ('PASSED', 'COMPLETE', 'TERMINATED')
6062 AND cle.id = kle.id
6063 AND cle.lse_id = lse.id
6064 AND sty.id = rul1.object1_id1
6065 UNION
6066 SELECT TO_NUMBER(NULL) cle_id,
6067 TO_NUMBER(rul1.object1_id1) sty_id,
6068 sty.stream_type_purpose,
6069 FND_DATE.canonical_to_date(rul2.rule_information2) start_date,
6070 TO_NUMBER(rul2.rule_information3) periods,
6071 rul2.object1_id1 frequency,
6072 rul2.rule_information5 structure,
6073 DECODE(rul2.rule_information10, 'Y', 'ARREARS', 'ADVANCE') advance_arrears,
6074 FND_NUMBER.canonical_to_number(rul2.rule_information6) amount,
6075 TO_NUMBER(rul2.rule_information7) stub_days,
6076 TO_NUMBER(rul2.rule_information8) stub_amount,
6077 NULL lty_code,
6078 TO_NUMBER(NULL) capital_amount,
6079 TO_NUMBER(NULL) residual_value,
6080 NULL fee_type
6081 FROM okc_rule_groups_b rgp,
6082 okc_rules_b rul1,
6083 okc_rules_b rul2,
6084 okl_strm_type_b sty
6085 WHERE
6086 rul2.dnz_chr_id = p_khr_id
6087 AND rul2.rule_information_category = 'LASLL'
6088 AND rul2.rgp_id = rgp.id
6089 AND rgp.cle_id IS NULL
6090 AND sty.id = rul1.object1_id1
6091 AND TO_NUMBER(rul2.object2_id1) = rul1.id;
6092
6093 -- Added by RGOOTY. Bug 4403311
6094 TYPE l_inflows_tbl_type IS TABLE OF c_inflows%ROWTYPE
6095 INDEX BY BINARY_INTEGER;
6096 l_inflows_tbl l_inflows_tbl_type;
6097 inf_index NUMBER;
6098 inf_start_date DATE;
6099 l_use_first_pmnt_date VARCHAR2(1);
6100
6101 -- Added by RGOOTY. Bug 4403311: End
6102
6103 CURSOR c_fin_assets IS
6104 SELECT kle.id,
6105 NVL(kle.residual_value, 0) residual_value,
6106 cle.start_date,
6107 cle.sts_code,
6108 kle.fee_type,
6109 lse.lty_code,
6110 kle.amount,
6111 kle.capital_amount,
6112 kle.capitalized_interest
6113 FROM okc_k_lines_b cle,
6114 okl_k_lines kle,
6115 okc_line_styles_b lse
6116 WHERE cle.dnz_chr_id = p_khr_id
6117 AND cle.sts_code IN ('PASSED', 'COMPLETE', 'TERMINATED')
6118 AND cle.lse_id = lse.id
6119 AND (lse.lty_code = 'FREE_FORM1' OR
6120 kle.fee_type = 'FINANCED' OR
6121 kle.fee_type = 'ROLLOVER' OR
6122 lse.lty_code = 'LINK_FEE_ASSET')
6123 AND cle.id = kle.id;
6124
6125 top_svc_rec top_svc_csr%ROWTYPE;
6126
6127 Cursor c_rollover_pmnts( chrId NUMBER, kleId NUMBER ) IS
6128 Select nvl(slh.object1_id1, -1) styId
6129 From OKC_RULE_GROUPS_B rgp,
6130 OKC_RULES_B sll,
6131 okc_rules_b slh,
6132 okl_strm_type_b sty
6133 Where slh.rgp_id = rgp.id
6134 and rgp.RGD_CODE = 'LALEVL'
6135 and sll.RULE_INFORMATION_CATEGORY = 'LASLL'
6136 and slh.RULE_INFORMATION_CATEGORY = 'LASLH'
6137 AND TO_CHAR(slh.id) = sll.object2_id1
6138 and rgp.dnz_chr_id = chrId
6139 and rgp.cle_id = kleId
6140 and sty.id = to_number(slh.object1_id1)
6141 and sty.stream_type_purpose NOT IN ('ESTIMATED_PROPERTY_TAX', 'UNSCHEDULED_PRINCIPAL_PAYMENT' );
6142 --bug# 4092324 bug# 4122385
6143
6144 r_rollover_pmnts c_rollover_pmnts%ROWTYPE;
6145
6146 Cursor c_link_pmnts( chrId NUMBER, kleId NUMBER ) IS
6147 Select nvl(slh.object1_id1, -1) styId
6148 From OKC_RULE_GROUPS_B crg,
6149 OKC_RULES_B crl,
6150 okc_rules_b slh,
6151 okc_K_lines_b cle_lnk,
6152 okl_K_lines kle_roll
6153 Where slh.rgp_id = crg.id
6154 and crg.RGD_CODE = 'LALEVL'
6155 and crl.RULE_INFORMATION_CATEGORY = 'LASLL'
6156 and slh.RULE_INFORMATION_CATEGORY = 'LASLH'
6157 AND TO_CHAR(slh.id) = crl.object2_id1
6158 and crg.dnz_chr_id = chrId
6159 and crg.cle_id = kleId
6160 and crg.cle_id = cle_lnk.id
6161 and cle_lnk.cle_id = kle_roll.id
6162 and kle_roll.fee_type in ('ROLLOVER', 'FINANCED');
6163
6164 r_link_pmnts c_link_pmnts%ROWTYPE;
6165
6166 CURSOR c_pt_yn (p_cle_id NUMBER) IS
6167 Select 'Y'
6168 from dual
6169 where Exists (
6170 select vDtls.DISBURSEMENT_BASIS,
6171 vDtls.DISBURSEMENT_FIXED_AMOUNT,
6172 vDtls.DISBURSEMENT_PERCENT,
6173 vDtls.PROCESSING_FEE_BASIS,
6174 vDtls.PROCESSING_FEE_FIXED_AMOUNT,
6175 vDtls.PROCESSING_FEE_PERCENT
6176 from okl_party_payment_hdr vHdr,
6177 okl_party_payment_dtls vDtls
6178 where vDtls.payment_hdr_id = vHdr.id
6179 and vHdr.CLE_ID = p_cle_id);
6180
6181 CURSOR c_financed_fees IS
6182 SELECT kle.id,
6183 nvl(kle.fee_type, 'LINK_FEE_ASSET') fee_type,
6184 lse.lty_code
6185 FROM okc_k_lines_b cle,
6186 okl_k_lines kle,
6187 okc_line_styles_b lse
6188 WHERE cle.dnz_chr_id = p_khr_id
6189 AND cle.sts_code IN ('PASSED', 'COMPLETE', 'TERMINATED')
6190 AND cle.id = kle.id
6191 AND cle.lse_id = lse.id
6192 AND (kle.fee_type='FINANCED' OR kle.fee_type='ROLLOVER' OR lse.lty_code='LINK_FEE_ASSET');
6193
6194 r_financed_fees c_financed_fees%ROWTYPE;
6195
6196 l_primary_sty_id NUMBER;
6197
6198 l_pt_yn VARCHAR2(1);
6199 l_passthrough_id NUMBER;
6200
6201 l_sty_id NUMBER;
6202 l_sty_name VARCHAR2(150);
6203 l_mapped_sty_name VARCHAR2(150);
6204
6205 l_pre_tax_inc_id NUMBER;
6206 l_principal_id NUMBER;
6207 l_interest_id NUMBER;
6208 l_prin_bal_id NUMBER;
6209 l_termination_id NUMBER;
6210
6211 l_selv_tbl okl_streams_pub.selv_tbl_type;
6212 l_pt_tbl okl_streams_pub.selv_tbl_type;
6213 lx_selv_tbl okl_streams_pub.selv_tbl_type;
6214
6215 l_stmv_rec okl_streams_pub.stmv_rec_type;
6216 l_pt_rec okl_streams_pub.stmv_rec_type;
6217 lx_stmv_rec okl_streams_pub.stmv_rec_type;
6218
6219 -- Loan Amortization
6220 l_principal_tbl okl_streams_pub.selv_tbl_type;
6221 l_interest_tbl okl_streams_pub.selv_tbl_type;
6222 l_prin_bal_tbl okl_streams_pub.selv_tbl_type;
6223 l_termination_tbl okl_streams_pub.selv_tbl_type;
6224 l_pre_tax_inc_tbl okl_streams_pub.selv_tbl_type;
6225
6226 l_capital_cost NUMBER;
6227 l_interim_interest NUMBER;
6228 l_interim_days NUMBER;
6229 l_interim_dpp NUMBER;
6230 l_asset_iir NUMBER;
6231 l_asset_guess_iir NUMBER;
6232 l_bkg_yield_guess NUMBER;
6233 l_asset_booking_yield NUMBER;
6234
6235 l_interim_tbl OKL_PRICING_PVT.interim_interest_tbl_type;
6236 l_sub_interim_tbl OKL_PRICING_PVT.interim_interest_tbl_type;
6237 i BINARY_INTEGER := 0;
6238
6239 l_payment_count BINARY_INTEGER := 0;
6240
6241 l_prog_name CONSTANT VARCHAR2(61) := G_PKG_NAME||'.'||'generate_streams';
6242
6243 prof_rate VARCHAR2(256);
6244 contract_comments VARCHAR2(256);
6245
6246 l_recurr_yn VARCHAR2(1) := NULL;
6247 l_blnHasFinFees VARCHAR2(1) := OKL_API.G_FALSE;
6248
6249 l_clev_tbl okl_okc_migration_pvt.clev_tbl_type;
6250 l_klev_tbl okl_contract_pub.klev_tbl_type;
6251 x_clev_tbl okl_okc_migration_pvt.clev_tbl_type;
6252 x_klev_tbl okl_contract_pub.klev_tbl_type;
6253
6254 l_PRE_TAX_IRR NUMBER;
6255 l_IMPLICIT_INTEREST_RATE NUMBER;
6256 l_SUB_IMPL_INTEREST_RATE NUMBER;
6257 l_SUB_PRE_TAX_IRR NUMBER;
6258
6259 Cursor c_subs Is
6260 Select 'Y'
6261 From dual
6262 where Exists(
6263 select kle.id
6264 from okl_k_lines_full_v kle,
6265 okc_line_styles_b lse,
6266 okc_statuses_b sts
6267 where KLE.LSE_ID = LSE.ID
6268 and lse.lty_code = 'SUBSIDY'
6269 and kle.dnz_chr_id = p_khr_id
6270 and sts.code = kle.sts_code
6271 and sts.ste_code not in ('HOLD', 'EXPIRED', 'CANCELLED'));
6272
6273 r_subs c_subs%ROWTYPE;
6274 l_subsidies_yn VARCHAR2(1);
6275 l_subsidy_amount NUMBER;
6276 l_residual_value NUMBER;
6277
6278 l_fee_type VARCHAR2(256);
6279
6280 l_additional_parameters OKL_EXECUTE_FORMULA_PUB.ctxt_val_tbl_type;
6281
6282 l_sty_purpose VARCHAR2(256);
6283
6284 l_rent_sty_id NUMBER;
6285
6286
6287 CURSOR c_rent_sty_id (finfeesId NUMBER) IS
6288 SELECT slh.object1_id1
6289 FROM okc_rules_b slh,
6290 okc_rule_groups_b rgp
6291 WHERE rgp.dnz_chr_id = p_khr_id
6292 AND rgp.cle_id = finfeesId
6293 AND rgp.rgd_code= 'LALEVL'
6294 AND rgp.id = slh.rgp_id
6295 AND slh.rule_information_category = 'LASLH';
6296 -- Added by RGOOTY
6297 -- Assuming that there are no Services initially.
6298 exec_svc_csr VARCHAR2(1) := 'F';
6299 l_tmp_cle_id NUMBER;
6300 p_get_k_info_csr OKL_ISG_UTILS_PVT.G_GET_K_INFO_CSR%ROWTYPE;
6301
6302 l_initial_irr NUMBER := 0;
6303 l_asset_count NUMBER := 0;
6304
6305 -- Added by RGOOTY for perf.: Bug Number 4346646 Start
6306 l_stmv_tbl Okl_Streams_Pub.stmv_tbl_type;
6307 l_full_selv_tbl Okl_Streams_Pub.selv_tbl_type;
6308
6309 lx_stmv_tbl Okl_Streams_Pub.stmv_tbl_type;
6310 lx_full_selv_tbl Okl_Streams_Pub.selv_tbl_type;
6311 -- Added by RGOOTY for perf.: End
6312
6313 --Added by prasjain for bug 5474827
6314 l_se_id NUMBER;
6315 --end prasjain
6316
6317 BEGIN
6318
6319 -- print( l_prog_name, 'begin' );
6320 -- Added by RGOOTY: Start
6321 OKL_STREAMS_UTIL.get_acc_options(
6322 p_khr_id => p_khr_id,
6323 x_org_id => G_ORG_ID,
6324 x_precision => G_PRECISION,
6325 x_currency_code => G_CURRENCY_CODE,
6326 x_rounding_rule => G_ROUNDING_RULE,
6327 x_apply_rnd_diff => G_DIFF_LOOKUP_CODE,
6328 x_return_status => x_return_status);
6329 IF x_return_status = OKL_API.G_RET_STS_UNEXP_ERROR THEN
6330 RAISE OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
6331 ELSIF x_return_status = OKL_API.G_RET_STS_ERROR THEN
6332 RAISE OKL_API.G_EXCEPTION_ERROR;
6333 END IF;
6334
6335 OPEN G_HDR(p_khr_id);
6336 FETCH G_HDR INTO r_hdr;
6337 CLOSE G_HDR;
6338
6339 OPEN G_ROLLOVER_PMNTS(p_khr_id);
6340 FETCH G_ROLLOVER_PMNTS INTO r_rollover_pmnts;
6341 CLOSE G_ROLLOVER_PMNTS;
6342
6343 OPEN OKL_ISG_UTILS_PVT.G_GET_K_INFO_CSR (p_khr_id);
6344 FETCH OKL_ISG_UTILS_PVT.G_GET_K_INFO_CSR INTO p_get_k_info_csr;
6345 CLOSE OKL_ISG_UTILS_PVT.G_GET_K_INFO_CSR;
6346
6347 -- Added by RGOOTY : End
6348 OPEN c_hdr;
6349 FETCH c_hdr INTO l_hdr;
6350 CLOSE c_hdr;
6351
6352 IF p_reporting_book_class IS NOT NULL THEN
6353 l_deal_type := p_reporting_book_class;
6354 l_purpose_code := 'REPORT';
6355 ELSE
6356 l_deal_type := l_hdr.deal_type;
6357 l_purpose_code := '-99';
6358 END IF;
6359
6360 l_asset_guess_iir := l_hdr.base_rate / 100.0;
6361
6362 OKL_ISG_UTILS_PVT.validate_strm_gen_template(
6363 p_api_version => p_api_version,
6364 p_init_msg_list => p_init_msg_list,
6365 x_return_status => x_return_status,
6366 x_msg_count => x_msg_count,
6367 x_msg_data => x_msg_data,
6368 p_khr_id => p_khr_id);
6369
6370 IF x_return_status = OKL_API.G_RET_STS_UNEXP_ERROR THEN
6371 RAISE OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
6372 ELSIF x_return_status = OKL_API.G_RET_STS_ERROR THEN
6373 RAISE OKL_API.G_EXCEPTION_ERROR;
6374 END IF;
6375
6376 -- Added by RGOOTY: Start. Not accepting this as its giving problem for ISG Streams
6377 IF ( p_generation_type = 'SERVICE_LINES' OR p_generation_type = 'FULL' )
6378 THEN
6379
6380 -- print( l_prog_name, ' validating stream templates - done');
6381 generate_cash_flows ( p_api_version => p_api_version,
6382 p_init_msg_list => p_init_msg_list,
6383 p_khr_id => p_khr_id,
6384 p_generation_type => p_generation_type,
6385 p_reporting_book_class => p_reporting_book_class,
6386 x_payment_count => l_payment_count,
6387 x_return_status => x_return_status,
6388 x_msg_count => x_msg_count,
6389 x_msg_data => x_msg_data,
6390 x_se_id => l_se_id); --Added by prasjain for bug 5474827
6391 IF x_return_status = OKL_API.G_RET_STS_UNEXP_ERROR THEN
6392 RAISE OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
6393 ELSIF x_return_status = OKL_API.G_RET_STS_ERROR THEN
6394 RAISE OKL_API.G_EXCEPTION_ERROR;
6395 END IF;
6396
6397 END IF;
6398 -- Added by RGOOTY: End
6399
6400 /* print( l_prog_name, ' generating streams - done');
6401 print( l_prog_name, ' payment count ' || l_payment_count);
6402 */
6403
6404 -- cursor to check for existense of financed fee
6405 l_blnHasFinFees := OKL_API.G_FALSE;
6406 l_fee_type := NULL;
6407 OPEN c_financed_fees;
6408 FETCH c_financed_fees INTO r_financed_fees;
6409 IF ( c_financed_fees%FOUND ) Then
6410 l_blnHasFinFees := OKL_API.G_TRUE;
6411 l_fee_type := r_financed_fees.fee_type;
6412 --'FINANCED';
6413 End If;
6414 CLOSE c_financed_fees;
6415
6416 OPEN c_subs;
6417 FETCH c_subs INTO l_subsidies_yn;
6418 CLOSE c_subs;
6419
6420 IF p_generation_type = 'FULL' THEN
6421 ---------------------------------------------
6422 -- STEP 2: Generate Pre-Tax Income
6423 ---------------------------------------------
6424 get_mapped_stream (p_mapping_type => 'PRE-TAX INCOME',
6425 p_line_style => NULL,
6426 p_deal_type => l_deal_type,
6427 p_fee_type => l_fee_type,
6428 p_khr_id => p_khr_id,
6429 x_mapped_stream => l_mapped_sty_name,
6430 x_return_status => lx_return_status,
6431 p_hdr => r_hdr,
6432 p_rollover_pmnts => r_rollover_pmnts);
6433 IF lx_return_status = OKL_API.G_RET_STS_UNEXP_ERROR THEN
6434 RAISE OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
6435 ELSIF lx_return_status = OKL_API.G_RET_STS_ERROR THEN
6436 RAISE OKL_API.G_EXCEPTION_ERROR;
6437 END IF;
6438
6439 print( l_prog_name, ' mapped sty name' || l_mapped_sty_name || ' has fees ' || l_blnHasFinFees );
6440
6441
6442 IF (l_mapped_sty_name IS NOT NULL) OR ( l_blnHasFinFees = OKL_API.G_TRUE ) THEN
6443 -- print( l_prog_name, ' loop calc amort o');
6444
6445 FOR l_fin_asset IN c_fin_assets LOOP
6446
6447 r_rollover_pmnts := NULL;
6448 r_link_pmnts := NULL;
6449
6450
6451 If ( l_fin_asset.fee_type = 'ROLLOVER' ) Then
6452 OPEN c_rollover_pmnts( p_khr_id, l_fin_asset.id);
6453 FETCH c_rollover_pmnts INTO r_rollover_pmnts;
6454 CLOSE c_rollover_pmnts;
6455 l_primary_sty_id := nvl(r_rollover_pmnts.styId, -1);
6456 Elsif ( l_fin_asset.lty_code = 'LINK_FEE_ASSET' ) Then
6457 OPEN c_link_pmnts( p_khr_id, l_fin_asset.id);
6458 FETCH c_link_pmnts INTO r_link_pmnts;
6459 CLOSE c_link_pmnts;
6460 l_primary_sty_id := nvl(r_link_pmnts.styId, -1);
6461 Else
6462 OPEN c_rollover_pmnts( p_khr_id, l_fin_asset.id);
6463 FETCH c_rollover_pmnts INTO r_rollover_pmnts;
6464 CLOSE c_rollover_pmnts;
6465 l_primary_sty_id := nvl(r_rollover_pmnts.styId, -1);
6466 l_rent_sty_id := l_primary_sty_id;
6467 End If;
6468
6469 if (l_fin_asset.lty_code = 'FREE_FORM1') Then
6470 get_mapped_stream (p_mapping_type => 'PRE-TAX INCOME',
6471 p_line_style => NULL,
6472 p_primary_sty_id => l_primary_sty_id,
6473 p_deal_type => l_deal_type,
6474 p_fee_type => NULL,
6475 p_khr_id => p_khr_id,
6476 x_mapped_stream => l_mapped_sty_name,
6477 x_return_status => lx_return_status,
6478 p_hdr => r_hdr,
6479 p_rollover_pmnts => r_rollover_pmnts);
6480 Else
6481 get_mapped_stream (p_mapping_type => 'PRE-TAX INCOME',
6482 p_line_style => NULL,
6483 p_primary_sty_id => l_primary_sty_id,
6484 p_deal_type => l_deal_type,
6485 p_fee_type => l_fee_type,
6486 p_khr_id => p_khr_id,
6487 x_mapped_stream => l_mapped_sty_name,
6488 x_return_status => lx_return_status,
6489 p_hdr => r_hdr,
6490 p_rollover_pmnts => r_rollover_pmnts);
6491 End if;
6492
6493 IF ( l_fin_asset.lty_code = 'FREE_FORM1' OR
6494 (l_fin_asset.fee_type = 'FINANCED' AND nvl(r_rollover_pmnts.styId, -1) <> -1) OR
6495 (l_fin_asset.fee_type = 'ROLLOVER' AND nvl(r_rollover_pmnts.styId, -1) <> -1) OR
6496 (l_fin_asset.lty_code = 'LINK_FEE_ASSET' and nvl(r_link_pmnts.styId, -1) <> -1)) Then
6497
6498 print( l_prog_name, ' amortize fee type ' || nvl(l_fin_asset.fee_type, 'XXX') );
6499 print( l_prog_name, ' amortize lty code ' || nvl(l_fin_asset.lty_code, 'XXX') );
6500 print( l_prog_name, ' rollover pmnts ' || nvl(r_rollover_pmnts.styId, -1) );
6501 print( l_prog_name, ' link pmnts ' || nvl(r_link_pmnts.styId, -1) );
6502 print( l_prog_name, ' l_mapped_sty_name ' || l_mapped_sty_name );
6503
6504 l_capital_cost := 0;
6505 IF ( nvl(l_fin_asset.fee_type, 'XXX') = 'FINANCED' ) OR
6506 ( nvl(l_fin_asset.lty_code, 'XXX') = 'LINK_FEE_ASSET' ) OR
6507 ( nvl(l_fin_asset.fee_type, 'XXX') = 'ROLLOVER' ) THEN
6508 l_capital_cost := l_fin_asset.amount;
6509 ELSIF (l_mapped_sty_name IS NOT NULL) THEN
6510 l_capital_cost := nvl(l_fin_asset.capital_amount, 0) +
6511 nvl(l_fin_asset.capitalized_interest,0);
6512 END IF;
6513
6514 IF ( l_capital_cost > 0 ) THEN
6515 IF l_fin_asset.sts_code = 'TERMINATED' THEN
6516 l_residual_value := OKL_AM_UTIL_PVT.get_actual_asset_residual(
6517 p_khr_id => p_khr_id,
6518 p_kle_id => l_fin_asset.id);
6519 ELSE
6520 l_residual_value := l_fin_asset.residual_value;
6521 END IF;
6522 --print( l_prog_name, ' subsidies_yn ' || l_subsidies_yn );
6523
6524
6525 IF ( l_subsidies_yn = 'Y' ) THEN
6526
6527 OKL_SUBSIDY_PROCESS_PVT.get_asset_subsidy_amount(
6528 p_api_version => G_API_VERSION,
6529 p_init_msg_list => G_FALSE,
6530 x_return_status => lx_return_status,
6531 x_msg_data => x_msg_data,
6532 x_msg_count => x_msg_count,
6533 p_asset_cle_id => l_fin_asset.id,
6534 x_subsidy_amount=> l_subsidy_amount);
6535
6536 IF lx_return_status = OKL_API.G_RET_STS_UNEXP_ERROR THEN
6537 RAISE OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
6538 ELSIF lx_return_status = OKL_API.G_RET_STS_ERROR THEN
6539 RAISE OKL_API.G_EXCEPTION_ERROR;
6540 END IF;
6541 l_capital_cost := l_capital_cost + l_subsidy_amount;
6542 END IF;
6543
6544 print( l_prog_name, ' calling loan amort ' );
6545 OKL_PRICING_PVT.get_loan_amortization(p_khr_id => p_khr_id,
6546 p_kle_id => l_fin_asset.id,
6547 p_purpose_code => l_purpose_code,
6548 p_investment => l_capital_cost,
6549 p_residual_value => l_residual_value,
6550 p_start_date => l_hdr.start_date,
6551 p_asset_start_date => l_fin_asset.start_date,
6552 p_term_duration => l_hdr.term_duration,
6553 p_currency_code => l_hdr.currency_code,
6554 p_deal_type => l_deal_type,
6555 p_asset_iir_guess => l_asset_guess_iir,
6556 p_bkg_yield_guess => l_bkg_yield_guess,
6557 x_principal_tbl => l_principal_tbl,
6558 x_interest_tbl => l_interest_tbl,
6559 x_prin_bal_tbl => l_prin_bal_tbl,
6560 x_termination_tbl => l_termination_tbl,
6561 x_pre_tax_inc_tbl => l_pre_tax_inc_tbl,
6562 x_interim_interest => l_interim_interest,
6563 x_interim_days => l_interim_days,
6564 x_interim_dpp => l_interim_dpp,
6565 x_iir => l_asset_iir,
6566 x_booking_yield => l_asset_booking_yield,
6567 x_return_status => lx_return_status,
6568 p_se_id => l_se_id); --Added by prasjain for bug 5474827
6569
6570
6571 prof_rate := fnd_profile.value('OKL_BOOK_CONTRACT_WITHOUT_IRR');
6572 IF ((lx_return_status = OKL_API.G_RET_STS_UNEXP_ERROR) OR
6573 (lx_return_status = OKL_API.G_RET_STS_ERROR)) AND
6574 (nvl(prof_rate, 'N') = 'Y')
6575 THEN
6576 lx_return_status := OKL_API.G_RET_STS_SUCCESS;
6577 OKL_API.init_msg_list( 'T' );
6578 OKL_API.SET_MESSAGE (p_app_name => G_APP_NAME,
6579 p_msg_name => 'OKL_CANNOT_CALC_IIR');
6580 contract_comments := fnd_message.get_string(OKL_API.G_APP_NAME,
6581 'OKL_CANNOT_CALC_IIR');
6582
6583 UPDATE OKC_K_HEADERS_TL
6584 SET COMMENTS = CONTRACT_COMMENTS
6585 WHERE ID = P_KHR_ID
6586 AND LANGUAGE = USERENV('LANG');
6587 END IF;
6588
6589 IF lx_return_status = OKL_API.G_RET_STS_UNEXP_ERROR THEN
6590 RAISE OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
6591 ELSIF lx_return_status = OKL_API.G_RET_STS_ERROR THEN
6592 RAISE OKL_API.G_EXCEPTION_ERROR;
6593 END IF;
6594
6595 IF l_interim_interest <> 0 THEN
6596 i := i + 1;
6597 l_interim_tbl(i).cf_days := l_interim_days;
6598 l_interim_tbl(i).cf_amount := l_interim_interest;
6599 l_interim_tbl(i).cf_dpp := l_interim_dpp;
6600 END IF;
6601
6602 IF ( l_subsidies_yn = 'Y' ) THEN
6603 l_capital_cost := l_capital_cost - l_subsidy_amount;
6604 l_principal_tbl.DELETE;
6605 l_interest_tbl.DELETE;
6606 l_prin_bal_tbl.DELETE;
6607 l_termination_tbl.DELETE;
6608 l_pre_tax_inc_tbl.DELETE;
6609
6610 OKL_PRICING_PVT.get_loan_amortization(
6611 p_khr_id => p_khr_id,
6612 p_kle_id => l_fin_asset.id,
6613 p_purpose_code => l_purpose_code,
6614 p_investment => l_capital_cost,
6615 p_residual_value => l_residual_value,
6616 p_start_date => l_hdr.start_date,
6617 p_asset_start_date => l_fin_asset.start_date,
6618 p_term_duration => l_hdr.term_duration,
6619 p_currency_code => l_hdr.currency_code,
6620 p_deal_type => l_deal_type,
6621 p_asset_iir_guess => l_asset_guess_iir,
6622 p_bkg_yield_guess => l_bkg_yield_guess,
6623 x_principal_tbl => l_principal_tbl,
6624 x_interest_tbl => l_interest_tbl,
6625 x_prin_bal_tbl => l_prin_bal_tbl,
6626 x_termination_tbl => l_termination_tbl,
6627 x_pre_tax_inc_tbl => l_pre_tax_inc_tbl,
6628 x_interim_interest => l_interim_interest,
6629 x_interim_days => l_interim_days,
6630 x_interim_dpp => l_interim_dpp,
6631 x_iir => l_asset_iir,
6632 x_booking_yield => l_asset_booking_yield,
6633 x_return_status => lx_return_status,
6634 p_se_id => l_se_id); --Added by prasjain for bug 5474827
6635
6636 prof_rate := fnd_profile.value('OKL_BOOK_CONTRACT_WITHOUT_IRR');
6637 IF ((lx_return_status = OKL_API.G_RET_STS_UNEXP_ERROR) OR
6638 (lx_return_status = OKL_API.G_RET_STS_ERROR)) AND
6639 (nvl(prof_rate, 'N') = 'Y') THEN
6640
6641 lx_return_status := OKL_API.G_RET_STS_SUCCESS;
6642 OKL_API.init_msg_list( 'T' );
6643 OKL_API.SET_MESSAGE (p_app_name => G_APP_NAME,
6644 p_msg_name => 'OKL_CANNOT_CALC_IIR');
6645 contract_comments := fnd_message.get_string(OKL_API.G_APP_NAME,
6646 'OKL_CANNOT_CALC_IIR');
6647
6648 UPDATE OKC_K_HEADERS_TL
6649 SET COMMENTS = CONTRACT_COMMENTS
6650 WHERE ID = P_KHR_ID
6651 AND LANGUAGE = USERENV('LANG');
6652 END IF;
6653 IF lx_return_status = OKL_API.G_RET_STS_UNEXP_ERROR THEN
6654 RAISE OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
6655 ELSIF lx_return_status = OKL_API.G_RET_STS_ERROR THEN
6656 RAISE OKL_API.G_EXCEPTION_ERROR;
6657 END IF;
6658
6659 IF l_interim_interest <> 0 THEN
6660 i := i + 1;
6661 l_sub_interim_tbl(i).cf_days := l_interim_days;
6662 l_sub_interim_tbl(i).cf_amount := l_interim_interest;
6663 l_sub_interim_tbl(i).cf_dpp := l_interim_dpp;
6664 END IF;
6665 End If;
6666 i := i + 1;
6667 --l_clev_tbl(i).dnz_chr_id := p_khr_id;
6668 --l_clev_tbl(i).chr_id := p_khr_id;
6669 l_clev_tbl(i).id := l_fin_asset.id;
6670 l_klev_tbl(i).id := l_fin_asset.id;
6671 l_klev_tbl(i).implicit_interest_rate := l_asset_iir * 100.0;
6672 l_asset_guess_iir := l_asset_iir;
6673 l_bkg_yield_guess := l_asset_booking_yield;
6674 End If;
6675
6676
6677
6678 print( l_prog_name, ' lty code ' || l_fin_asset.lty_code );
6679 print( l_prog_name, ' mapped stream PRE-TAX INCOME ' || l_mapped_sty_name );
6680 print( l_prog_name, ' prim ' || to_char(l_primary_sty_id) );
6681 print( l_prog_name, ' deal type ' || l_deal_type );
6682 print( l_prog_name, ' fee type ' || l_fee_type );
6683 print( l_prog_name, ' count ' || l_pre_tax_inc_tbl.COUNT);
6684
6685 IF lx_return_status = OKL_API.G_RET_STS_UNEXP_ERROR THEN
6686 RAISE OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
6687 ELSIF lx_return_status = OKL_API.G_RET_STS_ERROR THEN
6688 RAISE OKL_API.G_EXCEPTION_ERROR;
6689 END IF;
6690
6691 --get_sty_details (p_sty_name => 'PRE-TAX INCOME',
6692 get_sty_details (p_sty_name => l_mapped_sty_name,
6693 x_sty_id => l_pre_tax_inc_id,
6694 x_sty_name => l_sty_name,
6695 x_return_status => lx_return_status);
6696
6697 IF lx_return_status = OKL_API.G_RET_STS_UNEXP_ERROR THEN
6698 RAISE OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
6699 ELSIF lx_return_status = OKL_API.G_RET_STS_ERROR THEN
6700 RAISE OKL_API.G_EXCEPTION_ERROR;
6701 END IF;
6702
6703 OKL_ISG_UTILS_PVT.get_dep_stream_type(
6704 p_khr_id => p_khr_id,
6705 p_deal_type => l_deal_type,
6706 p_primary_sty_id => l_primary_sty_id,
6707 p_dependent_sty_purpose => 'INTEREST_PAYMENT',
6708 x_return_status => lx_return_status,
6709 x_dependent_sty_id => l_interest_id,
6710 x_dependent_sty_name => l_sty_name,
6711 p_get_k_info_rec => p_get_k_info_csr);
6712
6713 print( l_prog_name, ' INTEREST_PAYMENT ' || l_sty_name );
6714
6715 IF lx_return_status = OKL_API.G_RET_STS_UNEXP_ERROR THEN
6716 RAISE OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
6717 ELSIF lx_return_status = OKL_API.G_RET_STS_ERROR THEN
6718 RAISE OKL_API.G_EXCEPTION_ERROR;
6719 END IF;
6720
6721 OKL_ISG_UTILS_PVT.get_dep_stream_type(
6722 p_khr_id => p_khr_id,
6723 p_deal_type => l_deal_type,
6724 p_primary_sty_id => l_primary_sty_id,
6725 p_dependent_sty_purpose => 'PRINCIPAL_PAYMENT',
6726 x_return_status => lx_return_status,
6727 x_dependent_sty_id => l_principal_id,
6728 x_dependent_sty_name => l_sty_name,
6729 p_get_k_info_rec => p_get_k_info_csr);
6730
6731
6732 print( l_prog_name, ' PRINCIPAL_PAYMENT ' || l_sty_name );
6733
6734 IF lx_return_status = OKL_API.G_RET_STS_UNEXP_ERROR THEN
6735 RAISE OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
6736 ELSIF lx_return_status = OKL_API.G_RET_STS_ERROR THEN
6737 RAISE OKL_API.G_EXCEPTION_ERROR;
6738 END IF;
6739
6740 OKL_ISG_UTILS_PVT.get_dep_stream_type(
6741 p_khr_id => p_khr_id,
6742 p_deal_type => l_deal_type,
6743 p_primary_sty_id => l_primary_sty_id,
6744 p_dependent_sty_purpose => 'PRINCIPAL_BALANCE',
6745 x_return_status => lx_return_status,
6746 x_dependent_sty_id => l_prin_bal_id,
6747 x_dependent_sty_name => l_sty_name,
6748 p_get_k_info_rec => p_get_k_info_csr);
6749
6750 print( l_prog_name, ' PRINCIPAL_BALANCE ' || l_sty_name );
6751
6752 IF lx_return_status = OKL_API.G_RET_STS_UNEXP_ERROR THEN
6753 RAISE OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
6754 ELSIF lx_return_status = OKL_API.G_RET_STS_ERROR THEN
6755 RAISE OKL_API.G_EXCEPTION_ERROR;
6756 END IF;
6757
6758 OKL_ISG_UTILS_PVT.get_dep_stream_type(
6759 p_khr_id => p_khr_id,
6760 p_deal_type => l_deal_type,
6761 p_primary_sty_id => l_primary_sty_id,
6762 p_dependent_sty_purpose => 'TERMINATION_VALUE',
6763 x_return_status => lx_return_status,
6764 x_dependent_sty_id => l_termination_id,
6765 x_dependent_sty_name => l_sty_name,
6766 p_get_k_info_rec => p_get_k_info_csr);
6767
6768 IF lx_return_status = OKL_API.G_RET_STS_UNEXP_ERROR THEN
6769 RAISE OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
6770 ELSIF lx_return_status = OKL_API.G_RET_STS_ERROR THEN
6771 RAISE OKL_API.G_EXCEPTION_ERROR;
6772 END IF;
6773
6774 --print( l_prog_name, ' inserting principal ' );
6775 IF l_principal_tbl.COUNT > 0 AND (l_principal_id IS NOT NULL) AND
6776 ( (l_deal_type IN ('LOAN', 'LOAN-REVOLVING')) OR
6777 ( l_fin_asset.fee_type = 'FINANCED' OR
6778 l_fin_asset.fee_type = 'ROLLOVER' OR
6779 l_fin_asset.lty_code = 'LINK_FEE_ASSET') )
6780 THEN
6781 get_stream_header(
6782 p_khr_id => p_khr_id,
6783 p_kle_id => l_fin_asset.id,
6784 p_sty_id => l_principal_id,
6785 p_purpose_code => l_purpose_code,
6786 x_stmv_rec => l_stmv_rec,
6787 x_return_status => lx_return_status);
6788
6789 IF lx_return_status = OKL_API.G_RET_STS_UNEXP_ERROR THEN
6790 RAISE OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
6791 ELSIF lx_return_status = OKL_API.G_RET_STS_ERROR THEN
6792 RAISE OKL_API.G_EXCEPTION_ERROR;
6793 END IF;
6794
6795 lx_return_status := Okl_Streams_Util.round_streams_amount_esg(
6796 p_api_version => g_api_version,
6797 p_init_msg_list => p_init_msg_list,
6798 x_msg_count => x_msg_count,
6799 x_msg_data => x_msg_data,
6800 p_chr_id => p_khr_id,
6801 p_selv_tbl => l_principal_tbl,
6802 x_selv_tbl => lx_selv_tbl,
6803 p_org_id => G_ORG_ID,
6804 p_precision => G_PRECISION,
6805 p_currency_code => G_CURRENCY_CODE,
6806 p_rounding_rule => G_ROUNDING_RULE,
6807 p_apply_rnd_diff=> G_DIFF_LOOKUP_CODE);
6808
6809 IF (lx_return_status = G_RET_STS_UNEXP_ERROR) THEN
6810 RAISE OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
6811 ELSIF (lx_return_status = G_RET_STS_ERROR) THEN
6812 RAISE OKL_API.G_EXCEPTION_ERROR;
6813 END IF;
6814
6815 l_principal_tbl.DELETE;
6816 l_principal_tbl := lx_selv_tbl;
6817
6818 okl_streams_pub.create_streams(p_api_version => G_API_VERSION,
6819 p_init_msg_list => G_FALSE,
6820 x_return_status => lx_return_status,
6821 x_msg_count => x_msg_count,
6822 x_msg_data => x_msg_data,
6823 p_stmv_rec => l_stmv_rec,
6824 p_selv_tbl => l_principal_tbl,
6825 x_stmv_rec => lx_stmv_rec,
6826 x_selv_tbl => lx_selv_tbl);
6827 IF lx_return_status = OKL_API.G_RET_STS_UNEXP_ERROR THEN
6828 RAISE OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
6829 ELSIF lx_return_status = OKL_API.G_RET_STS_ERROR THEN
6830 RAISE OKL_API.G_EXCEPTION_ERROR;
6831 END IF;
6832 END IF;
6833 --print( l_prog_name, ' inserting interest ' );
6834 IF l_interest_tbl.COUNT > 0 AND ( l_interest_id IS NOT NULL) AND
6835 ( (l_deal_type IN ('LOAN', 'LOAN-REVOLVING')) OR
6836 ( l_fin_asset.fee_type = 'FINANCED' OR l_fin_asset.fee_type = 'ROLLOVER' OR
6837 l_fin_asset.lty_code = 'LINK_FEE_ASSET') )
6838 THEN
6839
6840
6841
6842 get_stream_header(
6843 p_khr_id => p_khr_id,
6844 p_kle_id => l_fin_asset.id,
6845 p_sty_id => l_interest_id,
6846 p_purpose_code => l_purpose_code,
6847 x_stmv_rec => l_stmv_rec,
6848 x_return_status => lx_return_status);
6849
6850 IF lx_return_status = OKL_API.G_RET_STS_UNEXP_ERROR THEN
6851 RAISE OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
6852 ELSIF lx_return_status = OKL_API.G_RET_STS_ERROR THEN
6853 RAISE OKL_API.G_EXCEPTION_ERROR;
6854 END IF;
6855
6856 lx_return_status := Okl_Streams_Util.round_streams_amount_esg(
6857 p_api_version => g_api_version,
6858 p_init_msg_list => p_init_msg_list,
6859 x_msg_count => x_msg_count,
6860 x_msg_data => x_msg_data,
6861 p_chr_id => p_khr_id,
6862 p_selv_tbl => l_interest_tbl,
6863 x_selv_tbl => lx_selv_tbl,
6864 p_org_id => G_ORG_ID,
6865 p_precision => G_PRECISION,
6866 p_currency_code => G_CURRENCY_CODE,
6867 p_rounding_rule => G_ROUNDING_RULE,
6868 p_apply_rnd_diff=> G_DIFF_LOOKUP_CODE);
6869
6870 IF (lx_return_status = G_RET_STS_UNEXP_ERROR) THEN
6871 RAISE OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
6872 ELSIF (lx_return_status = G_RET_STS_ERROR) THEN
6873 RAISE OKL_API.G_EXCEPTION_ERROR;
6874 END IF;
6875
6876 l_interest_tbl.DELETE;
6877 l_interest_tbl := lx_selv_tbl;
6878
6879 okl_streams_pub.create_streams(
6880 p_api_version => G_API_VERSION,
6881 p_init_msg_list => G_FALSE,
6882 x_return_status => lx_return_status,
6883 x_msg_count => x_msg_count,
6884 x_msg_data => x_msg_data,
6885 p_stmv_rec => l_stmv_rec,
6886 p_selv_tbl => l_interest_tbl,
6887 x_stmv_rec => lx_stmv_rec,
6888 x_selv_tbl => lx_selv_tbl);
6889
6890 IF lx_return_status = OKL_API.G_RET_STS_UNEXP_ERROR THEN
6891 RAISE OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
6892 ELSIF lx_return_status = OKL_API.G_RET_STS_ERROR THEN
6893 RAISE OKL_API.G_EXCEPTION_ERROR;
6894 END IF;
6895 END IF;
6896 -- print( l_prog_name, ' inserting prin bal ' );
6897 IF l_prin_bal_tbl.COUNT > 0 AND (l_prin_bal_id IS NOT NULL) AND
6898 ( (l_deal_type IN ('LOAN', 'LOAN-REVOLVING')) OR
6899 ( l_fin_asset.fee_type = 'FINANCED'
6900 OR l_fin_asset.fee_type = 'ROLLOVER' OR
6901 l_fin_asset.lty_code = 'LINK_FEE_ASSET') )
6902 THEN
6903 get_stream_header(
6904 p_khr_id => p_khr_id,
6905 p_kle_id => l_fin_asset.id,
6906 p_sty_id => l_prin_bal_id,
6907 p_purpose_code => l_purpose_code,
6908 x_stmv_rec => l_stmv_rec,
6909 x_return_status => lx_return_status);
6910
6911 IF lx_return_status = OKL_API.G_RET_STS_UNEXP_ERROR THEN
6912 RAISE OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
6913 ELSIF lx_return_status = OKL_API.G_RET_STS_ERROR THEN
6914 RAISE OKL_API.G_EXCEPTION_ERROR;
6915 END IF;
6916
6917 lx_return_status := Okl_Streams_Util.round_streams_amount_esg(
6918 p_api_version => g_api_version,
6919 p_init_msg_list => p_init_msg_list,
6920 x_msg_count => x_msg_count,
6921 x_msg_data => x_msg_data,
6922 p_chr_id => p_khr_id,
6923 p_selv_tbl => l_prin_bal_tbl,
6924 x_selv_tbl => lx_selv_tbl,
6925 p_org_id => G_ORG_ID,
6926 p_precision => G_PRECISION,
6927 p_currency_code => G_CURRENCY_CODE,
6928 p_rounding_rule => G_ROUNDING_RULE,
6929 p_apply_rnd_diff=> G_DIFF_LOOKUP_CODE);
6930
6931 IF (lx_return_status = G_RET_STS_UNEXP_ERROR) THEN
6932 RAISE OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
6933 ELSIF (lx_return_status = G_RET_STS_ERROR) THEN
6934 RAISE OKL_API.G_EXCEPTION_ERROR;
6935 END IF;
6936
6937 l_prin_bal_tbl.DELETE;
6938 l_prin_bal_tbl := lx_selv_tbl;
6939
6940 okl_streams_pub.create_streams(p_api_version => G_API_VERSION,
6941 p_init_msg_list => G_FALSE,
6942 x_return_status => lx_return_status,
6943 x_msg_count => x_msg_count,
6944 x_msg_data => x_msg_data,
6945 p_stmv_rec => l_stmv_rec,
6946 p_selv_tbl => l_prin_bal_tbl,
6947 x_stmv_rec => lx_stmv_rec,
6948 x_selv_tbl => lx_selv_tbl);
6949
6950 IF lx_return_status = OKL_API.G_RET_STS_UNEXP_ERROR THEN
6951 RAISE OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
6952 ELSIF lx_return_status = OKL_API.G_RET_STS_ERROR THEN
6953 RAISE OKL_API.G_EXCEPTION_ERROR;
6954 END IF;
6955 END IF;
6956
6957 -- print( l_prog_name, ' inserting termin ' );
6958 IF l_termination_tbl.COUNT > 0 AND (l_termination_id IS NOT NULL) THEN
6959 get_stream_header(p_khr_id => p_khr_id,
6960 p_kle_id => l_fin_asset.id,
6961 p_sty_id => l_termination_id,
6962 p_purpose_code => l_purpose_code,
6963 x_stmv_rec => l_stmv_rec,
6964 x_return_status => lx_return_status);
6965
6966 IF lx_return_status = OKL_API.G_RET_STS_UNEXP_ERROR THEN
6967 RAISE OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
6968 ELSIF lx_return_status = OKL_API.G_RET_STS_ERROR THEN
6969 RAISE OKL_API.G_EXCEPTION_ERROR;
6970 END IF;
6971
6972 lx_return_status := Okl_Streams_Util.round_streams_amount_esg(
6973 p_api_version => g_api_version,
6974 p_init_msg_list => p_init_msg_list,
6975 x_msg_count => x_msg_count,
6976 x_msg_data => x_msg_data,
6977 p_chr_id => p_khr_id,
6978 p_selv_tbl => l_termination_tbl,
6979 x_selv_tbl => lx_selv_tbl,
6980 p_org_id => G_ORG_ID,
6981 p_precision => G_PRECISION,
6982 p_currency_code => G_CURRENCY_CODE,
6983 p_rounding_rule => G_ROUNDING_RULE,
6984 p_apply_rnd_diff=> G_DIFF_LOOKUP_CODE);
6985
6986 IF (lx_return_status = G_RET_STS_UNEXP_ERROR) THEN
6987 RAISE OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
6988 ELSIF (lx_return_status = G_RET_STS_ERROR) THEN
6989 RAISE OKL_API.G_EXCEPTION_ERROR;
6990 END IF;
6991
6992 l_termination_tbl.DELETE;
6993 l_termination_tbl := lx_selv_tbl;
6994
6995 okl_streams_pub.create_streams(p_api_version => G_API_VERSION,
6996 p_init_msg_list => G_FALSE,
6997 x_return_status => lx_return_status,
6998 x_msg_count => x_msg_count,
6999 x_msg_data => x_msg_data,
7000 p_stmv_rec => l_stmv_rec,
7001 p_selv_tbl => l_termination_tbl,
7002 x_stmv_rec => lx_stmv_rec,
7003 x_selv_tbl => lx_selv_tbl);
7004 IF lx_return_status = OKL_API.G_RET_STS_UNEXP_ERROR THEN
7005 RAISE OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
7006 ELSIF lx_return_status = OKL_API.G_RET_STS_ERROR THEN
7007 RAISE OKL_API.G_EXCEPTION_ERROR;
7008 END IF;
7009 END IF;
7010 -- print( l_prog_name, ' inserting pre-tax ' );
7011 IF l_pre_tax_inc_tbl.COUNT > 0 AND (l_pre_tax_inc_id is NOT NULL) THEN
7012 get_stream_header(p_khr_id => p_khr_id,
7013 p_kle_id => l_fin_asset.id,
7014 p_sty_id => l_pre_tax_inc_id,
7015 p_purpose_code => l_purpose_code,
7016 x_stmv_rec => l_stmv_rec,
7017 x_return_status => lx_return_status);
7018
7019 IF lx_return_status = OKL_API.G_RET_STS_UNEXP_ERROR THEN
7020 RAISE OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
7021 ELSIF lx_return_status = OKL_API.G_RET_STS_ERROR THEN
7022 RAISE OKL_API.G_EXCEPTION_ERROR;
7023 END IF;
7024
7025 lx_return_status := Okl_Streams_Util.round_streams_amount_esg(
7026 p_api_version => g_api_version,
7027 p_init_msg_list => p_init_msg_list,
7028 x_msg_count => x_msg_count,
7029 x_msg_data => x_msg_data,
7030 p_chr_id => p_khr_id,
7031 p_selv_tbl => l_pre_tax_inc_tbl,
7032 x_selv_tbl => lx_selv_tbl,
7033 p_org_id => G_ORG_ID,
7034 p_precision => G_PRECISION,
7035 p_currency_code => G_CURRENCY_CODE,
7036 p_rounding_rule => G_ROUNDING_RULE,
7037 p_apply_rnd_diff=> G_DIFF_LOOKUP_CODE);
7038
7039 IF (lx_return_status = G_RET_STS_UNEXP_ERROR) THEN
7040 RAISE OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
7041 ELSIF (lx_return_status = G_RET_STS_ERROR) THEN
7042 RAISE OKL_API.G_EXCEPTION_ERROR;
7043 END IF;
7044
7045 l_pre_tax_inc_tbl.DELETE;
7046 l_pre_tax_inc_tbl := lx_selv_tbl;
7047
7048 okl_streams_pub.create_streams(p_api_version => G_API_VERSION,
7049 p_init_msg_list => G_FALSE,
7050 x_return_status => lx_return_status,
7051 x_msg_count => x_msg_count,
7052 x_msg_data => x_msg_data,
7053 p_stmv_rec => l_stmv_rec,
7054 p_selv_tbl => l_pre_tax_inc_tbl,
7055 x_stmv_rec => lx_stmv_rec,
7056 x_selv_tbl => lx_selv_tbl);
7057
7058 IF lx_return_status = OKL_API.G_RET_STS_UNEXP_ERROR THEN
7059 RAISE OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
7060 ELSIF lx_return_status = OKL_API.G_RET_STS_ERROR THEN
7061 RAISE OKL_API.G_EXCEPTION_ERROR;
7062 END IF;
7063 END IF;
7064 -- Clear out data structures
7065 l_principal_tbl.delete;
7066 l_interest_tbl.delete;
7067 l_prin_bal_tbl.delete;
7068 l_termination_tbl.delete;
7069 l_pre_tax_inc_tbl.delete;
7070 l_stmv_rec := NULL;
7071 l_interim_interest := NULL;
7072 l_interim_days := NULL;
7073 l_asset_iir := NULL;
7074 l_asset_booking_yield := NULL;
7075 l_capital_cost := NULL;
7076
7077 END IF;
7078 END LOOP;
7079
7080
7081 IF ( l_clev_tbl.COUNT > 0 OR l_klev_tbl.COUNT > 0 ) THEN
7082
7083 okl_contract_pub.update_contract_line(
7084 p_api_version => p_api_version,
7085 p_init_msg_list => p_init_msg_list,
7086 x_return_status => lx_return_status,
7087 x_msg_count => x_msg_count,
7088 x_msg_data => x_msg_data,
7089 p_clev_tbl => l_clev_tbl,
7090 p_klev_tbl => l_klev_tbl,
7091 p_edit_mode => 'N',
7092 x_clev_tbl => x_clev_tbl,
7093 x_klev_tbl => x_klev_tbl);
7094 IF lx_return_status = OKL_API.G_RET_STS_UNEXP_ERROR THEN
7095 RAISE OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
7096 ELSIF lx_return_status = OKL_API.G_RET_STS_ERROR THEN
7097 RAISE OKL_API.G_EXCEPTION_ERROR;
7098 END IF;
7099 End If;
7100 END IF;
7101 END IF;
7102
7103 --print( l_prog_name, ' compute irr ' || p_compute_irr );
7104
7105 IF (p_compute_irr = G_TRUE) AND (l_purpose_code <> 'REPORT') THEN
7106
7107 ---------------------------------------------
7108 -- STEP 3: Compute IRR
7109 ---------------------------------------------
7110
7111 IF l_payment_count = 0 THEN
7112
7113 OKL_API.SET_MESSAGE (p_app_name => G_APP_NAME,
7114 p_msg_name => 'OKL_NO_SLL_DEFINED');
7115
7116 RAISE OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
7117
7118 END IF;
7119
7120 -- Calculate IRR after all inflow stream elements have been generated but before accrual
7121 -- and collateral streams have been generated because IRR cursors will not be able to
7122 -- distinguish between Payment and Accrual stream elements.
7123
7124 --print( l_prog_name, ' subsidies_yn ' || l_subsidies_yn );
7125 If ( nvl(l_subsidies_yn, 'N') = 'Y' ) Then
7126
7127 OKL_PRICING_PVT.compute_irr (p_khr_id => p_khr_id,
7128 p_start_date => l_hdr.start_date,
7129 p_term_duration => l_hdr.term_duration,
7130 p_interim_tbl => l_sub_interim_tbl,
7131 p_subsidies_yn => 'Y',
7132 p_initial_irr => 0,
7133 x_irr => l_sub_pre_tax_irr,
7134 x_return_status => lx_return_status);
7135
7136 prof_rate := fnd_profile.value('OKL_BOOK_CONTRACT_WITHOUT_IRR');
7137
7138 IF ((lx_return_status = OKL_API.G_RET_STS_UNEXP_ERROR) OR
7139 (lx_return_status = OKL_API.G_RET_STS_ERROR)) AND
7140 (nvl(prof_rate, 'N') = 'Y') THEN
7141
7142 lx_return_status := OKL_API.G_RET_STS_SUCCESS;
7143 OKL_API.init_msg_list( 'T' );
7144 OKL_API.SET_MESSAGE (p_app_name => G_APP_NAME,
7145 p_msg_name => 'OKL_CANNOT_CALC_IIR');
7146
7147 -- select nvl(comments, '') into contract_comments
7148 -- from okc_K_headers_tl
7149 -- where id = p_khr_id
7150 -- and language = userenv('LANG');
7151
7152 -- contract_comments := concat(contract_comments, ' : ');
7153 contract_comments := fnd_message.get_string(OKL_API.G_APP_NAME,'OKL_CANNOT_CALC_IIR');
7154
7155 update okc_K_headers_tl
7156 set comments = contract_comments
7157 where id = p_khr_id
7158 and language = userenv('LANG');
7159
7160 End If;
7161
7162 IF lx_return_status = OKL_API.G_RET_STS_UNEXP_ERROR THEN
7163 RAISE OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
7164 ELSIF lx_return_status = OKL_API.G_RET_STS_ERROR THEN
7165 RAISE OKL_API.G_EXCEPTION_ERROR;
7166 END IF;
7167
7168 x_contract_rates.sub_pre_tax_irr := l_sub_pre_tax_irr;
7169
7170 OKL_PRICING_PVT.compute_iir (p_khr_id => p_khr_id,
7171 p_start_date => l_hdr.start_date,
7172 p_term_duration => l_hdr.term_duration,
7173 p_interim_tbl => l_sub_interim_tbl,
7174 p_subsidies_yn => 'Y',
7175 p_initial_iir => l_sub_pre_tax_irr,
7176 x_iir => l_sub_pre_tax_irr,
7177 x_return_status => lx_return_status);
7178
7179 prof_rate := fnd_profile.value('OKL_BOOK_CONTRACT_WITHOUT_IRR');
7180
7181 IF ((lx_return_status = OKL_API.G_RET_STS_UNEXP_ERROR) OR
7182 (lx_return_status = OKL_API.G_RET_STS_ERROR)) AND
7183 (nvl(prof_rate, 'N') = 'Y') THEN
7184
7185 lx_return_status := OKL_API.G_RET_STS_SUCCESS;
7186 OKL_API.init_msg_list( 'T' );
7187 OKL_API.SET_MESSAGE (p_app_name => G_APP_NAME,
7188 p_msg_name => 'OKL_CANNOT_CALC_IIR');
7189
7190 -- select nvl(comments, '') into contract_comments
7191 -- from okc_K_headers_tl
7192 -- where id = p_khr_id
7193 -- and language = userenv('LANG');
7194
7195 -- contract_comments := concat(contract_comments, ' : ');
7196 contract_comments := fnd_message.get_string(OKL_API.G_APP_NAME,'OKL_CANNOT_CALC_IIR');
7197
7198 update okc_K_headers_tl
7199 set comments = contract_comments
7200 where id = p_khr_id
7201 and language = userenv('LANG');
7202
7203 End If;
7204
7205 IF lx_return_status = OKL_API.G_RET_STS_UNEXP_ERROR THEN
7206 RAISE OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
7207 ELSIF lx_return_status = OKL_API.G_RET_STS_ERROR THEN
7208 RAISE OKL_API.G_EXCEPTION_ERROR;
7209 END IF;
7210
7211 x_contract_rates.sub_impl_interest_rate := l_sub_pre_tax_irr;
7212
7213 End If;
7214
7215
7216 OKL_PRICING_PVT.compute_irr (p_khr_id => p_khr_id,
7217 p_start_date => l_hdr.start_date,
7218 p_term_duration => l_hdr.term_duration,
7219 p_interim_tbl => l_interim_tbl,
7220 p_subsidies_yn => 'N',
7221 p_initial_irr => l_initial_irr, -- Added by RGOOTY
7222 x_irr => l_pre_tax_irr,
7223 x_return_status => lx_return_status);
7224
7225 prof_rate := fnd_profile.value('OKL_BOOK_CONTRACT_WITHOUT_IRR');
7226
7227 IF ((lx_return_status = OKL_API.G_RET_STS_UNEXP_ERROR) OR
7228 (lx_return_status = OKL_API.G_RET_STS_ERROR)) AND
7229 (nvl(prof_rate, 'N') = 'Y') THEN
7230
7231 lx_return_status := OKL_API.G_RET_STS_SUCCESS;
7232 OKL_API.init_msg_list( 'T' );
7233 OKL_API.SET_MESSAGE (p_app_name => G_APP_NAME,
7234 p_msg_name => 'OKL_CANNOT_CALC_IIR');
7235
7236 -- select nvl(comments, '') into contract_comments
7237 -- from okc_K_headers_tl
7238 -- where id = p_khr_id
7239 -- and language = userenv('LANG');
7240
7241 -- contract_comments := concat(contract_comments, ' : ');
7242 contract_comments := fnd_message.get_string(OKL_API.G_APP_NAME,'OKL_CANNOT_CALC_IIR');
7243
7244 update okc_K_headers_tl
7245 set comments = contract_comments
7246 where id = p_khr_id
7247 and language = userenv('LANG');
7248
7249 End If;
7250
7251 print( l_prog_name, ' compute irr ', lx_return_status );
7252 IF lx_return_status = OKL_API.G_RET_STS_UNEXP_ERROR THEN
7253 RAISE OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
7254 ELSIF lx_return_status = OKL_API.G_RET_STS_ERROR THEN
7255 RAISE OKL_API.G_EXCEPTION_ERROR;
7256 END IF;
7257
7258 print( l_prog_name, ' pre tax irr ' || to_char( nvl(l_pre_tax_irr, -999) ) , lx_return_status );
7259 x_contract_rates.pre_tax_irr := l_pre_tax_irr;
7260
7261 OKL_PRICING_PVT.compute_iir (p_khr_id => p_khr_id,
7262 p_start_date => l_hdr.start_date,
7263 p_term_duration => l_hdr.term_duration,
7264 p_interim_tbl => l_interim_tbl,
7265 p_subsidies_yn => 'N',
7266 p_initial_iir => x_contract_rates.pre_tax_irr,
7267 x_iir => l_pre_tax_irr,
7268 x_return_status => lx_return_status);
7269
7270 prof_rate := fnd_profile.value('OKL_BOOK_CONTRACT_WITHOUT_IRR');
7271
7272 IF ((lx_return_status = OKL_API.G_RET_STS_UNEXP_ERROR) OR
7273 (lx_return_status = OKL_API.G_RET_STS_ERROR)) AND
7274 (nvl(prof_rate, 'N') = 'Y') THEN
7275
7276 lx_return_status := OKL_API.G_RET_STS_SUCCESS;
7277 OKL_API.init_msg_list( 'T' );
7278 OKL_API.SET_MESSAGE (p_app_name => G_APP_NAME,
7279 p_msg_name => 'OKL_CANNOT_CALC_IIR');
7280
7281 -- select nvl(comments, '') into contract_comments
7282 -- from okc_K_headers_tl
7283 -- where id = p_khr_id
7284 -- and language = userenv('LANG');
7285
7286 -- contract_comments := concat(contract_comments, ' : ');
7287 contract_comments := fnd_message.get_string(OKL_API.G_APP_NAME,'OKL_CANNOT_CALC_IIR');
7288
7289 update okc_K_headers_tl
7290 set comments = contract_comments
7291 where id = p_khr_id
7292 and language = userenv('LANG');
7293
7294 End If;
7295
7296 -- print( l_prog_name, ' compute iir ', lx_return_status );
7297 IF lx_return_status = OKL_API.G_RET_STS_UNEXP_ERROR THEN
7298 RAISE OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
7299 ELSIF lx_return_status = OKL_API.G_RET_STS_ERROR THEN
7300 RAISE OKL_API.G_EXCEPTION_ERROR;
7301 END IF;
7302
7303 print( l_prog_name, ' pre tax iir ' || to_char( nvl(l_pre_tax_irr, -999) ) , lx_return_status );
7304 x_contract_rates.implicit_interest_rate := l_pre_tax_irr;
7305
7306 END IF;
7307
7308 ---------------------------------------------
7309 -- STEP 4: Generate Income Accrual
7310 ---------------------------------------------
7311 -- print( l_prog_name, ' accruals ' );
7312
7313 -- Added by RGOOTY: Start
7314 IF (p_generation_type = 'SERVICE_LINES') OR (p_generation_type = 'FULL') THEN
7315
7316 FOR l_inflow IN c_inflows LOOP
7317
7318 l_sty_purpose := l_inflow.stream_type_purpose;
7319
7320 get_sty_details (p_sty_id => l_inflow.sty_id,
7321 x_sty_id => l_sty_id,
7322 x_sty_name => l_sty_name,
7323 x_return_status => lx_return_status);
7324
7325 IF lx_return_status = OKL_API.G_RET_STS_UNEXP_ERROR THEN
7326 RAISE OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
7327 ELSIF lx_return_status = OKL_API.G_RET_STS_ERROR THEN
7328 RAISE OKL_API.G_EXCEPTION_ERROR;
7329 END IF;
7330
7331 l_primary_sty_id := l_sty_id;
7332 -- Changed by RGOOTY: Start
7333 -- Condition added by mansrini on 13-Jun-2005 for Bug 4434343
7334 -- If the line is a serviced asset line, the service line id needs to be determined. Otherwise, the line_id is passed as it is
7335 IF ( l_inflow.lty_code = 'LINK_SERV_ASSET' )
7336 THEN
7337 OPEN top_svc_csr( p_khr_id, l_inflow.cle_id );
7338 FETCH top_svc_csr INTO top_svc_rec;
7339 l_tmp_cle_id := top_svc_rec.top_svc_id;
7340 CLOSE top_svc_csr;
7341 ELSE
7342 l_tmp_cle_id := l_inflow.cle_id;
7343 END IF;
7344 OPEN c_pt_yn (p_cle_id => l_tmp_cle_id);
7345
7346 FETCH c_pt_yn INTO l_pt_yn;
7347 CLOSE c_pt_yn;
7348 -- Changed by RGOOTY: End
7349
7350 -- Ignoring billable_yn AND stream_type_class attributes of the SLH stream type.
7351 -- Per MKMITTAL, payments defined from LLA UI are implicitly billable. And
7352 -- every billable payment must generate accrual (MKMITTAL, SRAWLING)
7353
7354 If( TO_NUMBER(nvl(l_inflow.periods, 0)) > 1 ) Then
7355 l_recurr_yn := OKL_API.G_TRUE;
7356 ElsIf( TO_NUMBER(nvl(l_inflow.periods, 0)) = 1 ) Then
7357 l_recurr_yn := OKL_API.G_FALSE;
7358 ENd If;
7359 /*
7360 print( l_prog_name, ' l_recurr_yn ' || l_recurr_yn );
7361 print( l_prog_name, ' lty_code ' || l_inflow.lty_code );
7362 print( l_prog_name, ' l_primary_sty_id ' || to_char(l_primary_sty_id) );
7363 print( l_prog_name, ' l_deal_type ' || to_char(l_deal_type) );
7364 */
7365
7366 get_mapped_stream ( p_sty_purpose => l_sty_purpose,
7367 p_line_style => l_inflow.lty_code,
7368 p_primary_sty_id => l_primary_sty_id,
7369 p_mapping_type => 'ACCRUAL',
7370 p_deal_type => l_deal_type,
7371 p_fee_type => l_inflow.fee_type,
7372 p_recurr_yn => l_recurr_yn,
7373 p_pt_yn => l_pt_yn,
7374 p_khr_id => p_khr_id,
7375 x_mapped_stream => l_mapped_sty_name,
7376 x_return_status => lx_return_status,
7377 p_hdr => r_hdr,
7378 p_rollover_pmnts => r_rollover_pmnts);
7379
7380 print( l_prog_name, ' l_mapped_sty_name ' || to_char(l_mapped_sty_name) );
7381
7382 IF lx_return_status = OKL_API.G_RET_STS_UNEXP_ERROR THEN
7383 RAISE OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
7384 ELSIF lx_return_status = OKL_API.G_RET_STS_ERROR THEN
7385 RAISE OKL_API.G_EXCEPTION_ERROR;
7386 END IF;
7387
7388 inf_start_date := l_inflow.start_date;
7389 -- Fix to write the Rental Accruals seperately
7390 IF p_generation_type = 'FULL' AND
7391 l_deal_type = 'LEASEOP' AND
7392 l_inflow.lty_code = 'FREE_FORM1' AND
7393 l_inflow.stream_type_purpose = 'RENT' AND
7394 l_mapped_sty_name IS NOT NULL
7395 THEN
7396 -- You are about to generate the RENTAL ACCRUAL Streams
7397 -- Accumulate into the l_inflow_tbl for later generation of Rental Accruals
7398 -- If the table doesn't exists until, then create one
7399 IF l_inflows_tbl.COUNT = 0
7400 THEN
7401 inf_index := 1;
7402 l_inflows_tbl( inf_index ) := l_inflow;
7403 inf_index := inf_index + 1;
7404 ELSE
7405 -- Inflows table is already present,
7406 -- if the payment levels belong to the same cle_id, sty_id then accumulate
7407 IF l_inflows_tbl(1).cle_id = l_inflow.cle_id AND
7408 l_inflows_tbl(1).sty_id = l_inflow.sty_id
7409 THEN
7410 -- Inflows belong to the same Asset line and same stream
7411 -- so accumulate
7412 l_inflows_tbl( inf_index ) := l_inflow;
7413 inf_index := inf_index + 1;
7414 ELSE
7415 -- New Payment Levels for another asset / another Payment Stream
7416 -- Hence, destroy the payment levels
7417 l_inflows_tbl.DELETE;
7418 -- Create new table and then store into that
7419 inf_index := 1;
7420 l_inflows_tbl( inf_index ) := l_inflow;
7421 inf_index := inf_index + 1;
7422 END IF;
7423 END IF;
7424 -- Now check whether to pick the contract date
7425 -- instead of the start_date stored @ payment level.
7426 -- Fix Explanation:
7427 -- We will use the contract start_date only for a Payment level
7428 -- which is after one or more stubs with zero amount.
7429 l_use_first_pmnt_date := 'N';
7430 IF l_inflows_tbl.COUNT >= 2 AND
7431 l_inflow.periods IS NOT NULL OR
7432 l_inflow.amount IS NOT NULL
7433 THEN
7434 -- If the current Payment level is not the first one
7435 -- and also the current payment level is a regular payment
7436 -- and now, loop through the all the payment levels before
7437 -- this, if all of them are stubs with zero amount, then
7438 -- change the date, else keep the start date at the payment itself.
7439 l_use_first_pmnt_date := 'Y';
7440 FOR t_index in l_inflows_tbl.FIRST .. (l_inflows_tbl.LAST - 1 )
7441 LOOP
7442 IF l_inflows_tbl(t_index).STUB_DAYS IS NOT NULL AND
7443 l_inflows_tbl(t_index).STUB_AMOUNT = 0 AND
7444 l_use_first_pmnt_date = 'Y'
7445 THEN
7446 -- No problem, continue checking
7447 NULL;
7448 ELSE
7449 l_use_first_pmnt_date := 'N';
7450 END IF;
7451 END LOOP;
7452 END IF; -- IF l_inflows_tbl.COUNT >= 2
7453 IF l_use_first_pmnt_date = 'Y'
7454 THEN
7455 -- Pick the first Payment Level Start Date
7456 inf_start_date := l_inflows_tbl(1).start_date;
7457 ELSE
7458 -- Use the payment date stored in this level itself !
7459 inf_start_date := l_inflow.start_date;
7460 END IF; -- IF l_use_first_pmnt_date = 'Y'
7461 END IF;
7462
7463 IF l_mapped_sty_name IS NOT NULL THEN
7464
7465 IF ((l_inflow.lty_code = 'SOLD_SERVICE' OR l_inflow.lty_code = 'LINK_SERV_ASSET') AND
7466 p_generation_type = 'SERVICE_LINES') OR (p_generation_type = 'FULL') THEN
7467
7468 IF ( l_inflow.fee_type = 'INCOME' AND l_recurr_yn = OKL_API.G_FALSE ) THEN
7469 print( l_prog_name, ' creatig income amort ' );
7470
7471
7472 get_amortized_accruals (
7473 p_khr_id => p_khr_id,
7474 p_currency_code => l_hdr.currency_code,
7475 p_start_date => l_inflow.start_date,
7476 p_end_date => l_hdr.end_date,
7477 p_deal_type => l_hdr.deal_type,
7478 p_amount => l_inflow.amount,
7479 x_selv_tbl => l_selv_tbl,
7480 x_return_status => lx_return_status);
7481
7482 IF lx_return_status = OKL_API.G_RET_STS_UNEXP_ERROR THEN
7483 RAISE OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
7484 ELSIF lx_return_status = OKL_API.G_RET_STS_ERROR THEN
7485 RAISE OKL_API.G_EXCEPTION_ERROR;
7486 END IF;
7487 ELSE
7488 get_accrual_elements (
7489 p_start_date => l_inflow.start_date,
7490 p_periods => l_inflow.periods,
7491 p_frequency => l_inflow.frequency,
7492 p_structure => l_inflow.structure,
7493 p_advance_or_arrears => l_inflow.advance_arrears,
7494 p_amount => l_inflow.amount,
7495 p_stub_days => l_inflow.stub_days,
7496 p_stub_amount => l_inflow.stub_amount,
7497 p_currency_code => l_hdr.currency_code,
7498 x_selv_tbl => l_selv_tbl,
7499 x_return_status => lx_return_status);
7500
7501 IF lx_return_status = OKL_API.G_RET_STS_UNEXP_ERROR THEN
7502 RAISE OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
7503 ELSIF lx_return_status = OKL_API.G_RET_STS_ERROR THEN
7504 RAISE OKL_API.G_EXCEPTION_ERROR;
7505 END IF;
7506 END IF;
7507
7508 get_sty_details (p_sty_name => l_mapped_sty_name,
7509 x_sty_id => l_sty_id,
7510 x_sty_name => l_sty_name,
7511 x_return_status => lx_return_status);
7512
7513 IF lx_return_status = OKL_API.G_RET_STS_UNEXP_ERROR THEN
7514 RAISE OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
7515 ELSIF lx_return_status = OKL_API.G_RET_STS_ERROR THEN
7516 RAISE OKL_API.G_EXCEPTION_ERROR;
7517 END IF;
7518
7519 --Modified by kthiruva on 27-May-2005
7520 --Bug 4371472 - Start of Changes
7521 --Added the condition to check of the l_selv_tbl.count >0
7522 IF (l_selv_tbl.COUNT > 0 ) THEN
7523 get_stream_header(p_khr_id => p_khr_id,
7524 p_kle_id => l_inflow.cle_id,
7525 p_sty_id => l_sty_id,
7526 p_purpose_code => l_purpose_code,
7527 x_stmv_rec => l_stmv_rec,
7528 x_return_status => lx_return_status);
7529
7530 IF lx_return_status = OKL_API.G_RET_STS_UNEXP_ERROR THEN
7531 RAISE OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
7532 ELSIF lx_return_status = OKL_API.G_RET_STS_ERROR THEN
7533 RAISE OKL_API.G_EXCEPTION_ERROR;
7534 END IF;
7535
7536 --
7537 -- call process API to create parent Stream Header and its child Stream Elements
7538 --
7539
7540 lx_return_status := Okl_Streams_Util.round_streams_amount_esg(
7541 p_api_version => g_api_version,
7542 p_init_msg_list => p_init_msg_list,
7543 x_msg_count => x_msg_count,
7544 x_msg_data => x_msg_data,
7545 p_chr_id => p_khr_id,
7546 p_selv_tbl => l_selv_tbl,
7547 x_selv_tbl => lx_selv_tbl,
7548 p_org_id => G_ORG_ID,
7549 p_precision => G_PRECISION,
7550 p_currency_code => G_CURRENCY_CODE,
7551 p_rounding_rule => G_ROUNDING_RULE,
7552 p_apply_rnd_diff=> G_DIFF_LOOKUP_CODE);
7553
7554 IF (lx_return_status = G_RET_STS_UNEXP_ERROR) THEN
7555 RAISE OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
7556 ELSIF (x_return_status = G_RET_STS_ERROR) THEN
7557 RAISE OKL_API.G_EXCEPTION_ERROR;
7558 END IF;
7559
7560 l_selv_tbl.DELETE;
7561 l_selv_tbl := lx_selv_tbl;
7562 --Accumulate Stream Header
7563 OKL_STREAMS_UTIL.accumulate_strm_headers(
7564 p_stmv_rec => l_stmv_rec,
7565 x_full_stmv_tbl => l_stmv_tbl,
7566 x_return_status => lx_return_status );
7567 IF (lx_return_status = G_RET_STS_UNEXP_ERROR) THEN
7568 RAISE OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
7569 ELSIF (lx_return_status = G_RET_STS_ERROR) THEN
7570 RAISE OKL_API.G_EXCEPTION_ERROR;
7571 END IF;
7572 --Accumulate Stream Elements
7573 OKL_STREAMS_UTIL.accumulate_strm_elements(
7574 p_stm_index_no => l_stmv_tbl.LAST,
7575 p_selv_tbl => l_selv_tbl,
7576 x_full_selv_tbl => l_full_selv_tbl,
7577 x_return_status => lx_return_status );
7578 IF (lx_return_status = G_RET_STS_UNEXP_ERROR) THEN
7579 RAISE OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
7580 ELSIF (lx_return_status = G_RET_STS_ERROR) THEN
7581 RAISE OKL_API.G_EXCEPTION_ERROR;
7582 END IF;
7583
7584 END IF;
7585 --Bug 4371472 - End of Changes
7586 END IF;
7587
7588 END IF;
7589
7590 -- Clear out reusable data structures
7591
7592 l_mapped_sty_name := NULL;
7593 l_sty_name := NULL;
7594 l_sty_id := NULL;
7595
7596 l_stmv_rec := NULL;
7597 l_selv_tbl.delete;
7598
7599 lx_stmv_rec := NULL;
7600 lx_selv_tbl.delete;
7601
7602 l_pt_yn := NULL;
7603
7604 END LOOP;
7605 --Create all the accumulated Streams at one shot ..
7606 IF l_stmv_tbl.COUNT > 0 AND
7607 l_full_selv_tbl.COUNT > 0
7608 THEN
7609 Okl_Streams_Pub.create_streams_perf(
7610 p_api_version,
7611 p_init_msg_list,
7612 lx_return_status,
7613 x_msg_count,
7614 x_msg_data,
7615 l_stmv_tbl,
7616 l_full_selv_tbl,
7617 lx_stmv_tbl,
7618 lx_full_selv_tbl);
7619 IF lx_return_status = OKL_API.G_RET_STS_UNEXP_ERROR THEN
7620 RAISE OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
7621 ELSIF lx_return_status = OKL_API.G_RET_STS_ERROR THEN
7622 RAISE OKL_API.G_EXCEPTION_ERROR;
7623 END IF;
7624 END IF;
7625 END IF;
7626 -- Added by RGOOTY: End
7627
7628 -- streams like RESIDUAL VALUE, etc.
7629 gen_non_cash_flows ( p_api_version => p_api_version,
7630 p_init_msg_list => p_init_msg_list,
7631 p_khr_id => p_khr_id,
7632 p_pre_tax_irr => (l_pre_tax_irr*100.00),
7633 p_generation_type => p_generation_type,
7634 p_subsidies_yn => nvl(l_subsidies_yn, 'N'),
7635 p_reporting_book_class => p_reporting_book_class,
7636 x_return_status => x_return_status,
7637 x_msg_count => x_msg_count,
7638 x_msg_data => x_msg_data);
7639
7640 IF x_return_status = OKL_API.G_RET_STS_UNEXP_ERROR THEN
7641 RAISE OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
7642 ELSIF x_return_status = OKL_API.G_RET_STS_ERROR THEN
7643 RAISE OKL_API.G_EXCEPTION_ERROR;
7644 END IF;
7645
7646 print( l_prog_name, ' non gen cash flows ', x_return_status );
7647 print( l_prog_name, ' gen type ' || p_generation_type );
7648
7649 IF p_generation_type = 'FULL' THEN
7650
7651 ---------------------------------------------
7652 -- STEP 5: Generate Fee Expense Accrual
7653 ---------------------------------------------
7654
7655 okl_expense_streams_pvt.generate_expense_streams(p_api_version => G_API_VERSION,
7656 p_init_msg_list => G_FALSE,
7657 p_khr_id => p_khr_id,
7658 p_purpose_code => l_purpose_code,
7659 p_deal_type => l_deal_type,
7660 x_return_status => lx_return_status,
7661 x_msg_count => x_msg_count,
7662 x_msg_data => x_msg_data);
7663
7664 IF lx_return_status = OKL_API.G_RET_STS_UNEXP_ERROR THEN
7665 RAISE OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
7666 ELSIF lx_return_status = OKL_API.G_RET_STS_ERROR THEN
7667 RAISE OKL_API.G_EXCEPTION_ERROR;
7668 END IF;
7669
7670
7671
7672 print( l_prog_name, ' updating loan payment ' );
7673
7674
7675 IF l_deal_type IN ('LOAN', 'LOAN-REVOLVING') THEN
7676
7677 OKL_ISG_UTILS_PVT.get_dependent_stream_type(
7678 p_khr_id => p_khr_id,
7679 p_deal_type => l_deal_type,
7680 p_primary_sty_id => l_rent_sty_id,
7681 p_dependent_sty_purpose => 'LOAN_PAYMENT',
7682 x_return_status => x_return_status,
7683 x_dependent_sty_id => l_sty_id,
7684 x_dependent_sty_name => l_sty_name);
7685
7686 IF x_return_status = OKL_API.G_RET_STS_UNEXP_ERROR THEN
7687 RAISE OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
7688 ELSIF x_return_status = OKL_API.G_RET_STS_ERROR THEN
7689 RAISE OKL_API.G_EXCEPTION_ERROR;
7690 END IF;
7691
7692 If ( l_sty_id IS NOT NULL ) Then
7693
7694 UPDATE okl_streams
7695 SET sty_id = l_sty_id
7696 WHERE khr_id = p_khr_id
7697 AND say_code = 'WORK'
7698 AND NVL(purpose_code, '-99') = l_purpose_code
7699 AND sty_id = l_rent_sty_id;
7700
7701 End if;
7702 END IF;
7703
7704
7705 If ( nvl(l_blnHasFinFees, OKL_API.G_FALSE) = OKL_APi.G_TRUE ) Then
7706 -- print( l_prog_name, ' updating financed fees ' );
7707
7708 FOR r_financed_fees in c_financed_fees
7709 LOOP
7710 --print( l_prog_name, ' getting financed fees ' || to_char( r_financed_fees.id ));
7711
7712 l_rent_sty_id := NULL; --bug# 4096605.
7713 OPEN c_rent_sty_id(r_financed_fees.id);
7714 FETCH c_rent_sty_id INTO l_rent_sty_id;
7715 CLOSE c_rent_sty_id;
7716
7717
7718 If ( l_rent_sty_id is NOT NULL ) Then
7719
7720 OKL_ISG_UTILS_PVT.get_dependent_stream_type(
7721 p_khr_id => p_khr_id,
7722 p_deal_type => l_deal_type,
7723 p_primary_sty_id => l_rent_sty_id,
7724 p_dependent_sty_purpose => 'LOAN_PAYMENT',
7725 x_return_status => x_return_status,
7726 x_dependent_sty_id => l_sty_id,
7727 x_dependent_sty_name => l_sty_name);
7728
7729 IF x_return_status = OKL_API.G_RET_STS_UNEXP_ERROR THEN
7730 RAISE OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
7731 ELSIF x_return_status = OKL_API.G_RET_STS_ERROR THEN
7732 RAISE OKL_API.G_EXCEPTION_ERROR;
7733 END IF;
7734
7735 If ( l_sty_id IS NOT NULL ) Then
7736
7737 -- print( l_prog_name, ' updating financed fees ' || to_char( r_financed_fees.id ));
7738
7739 UPDATE okl_streams
7740 SET sty_id = l_sty_id
7741 WHERE khr_id = p_khr_id
7742 AND kle_id = r_financed_fees.id
7743 AND say_code = 'WORK'
7744 AND NVL(purpose_code, '-99') = l_purpose_code
7745 AND sty_id = l_rent_sty_id;
7746
7747 End If;
7748
7749 END IF ;
7750
7751 END LOOP;
7752
7753 End If;
7754
7755
7756 END IF;
7757
7758 -- print( l_prog_name, ' updating ' );
7759
7760 UPDATE okl_strm_elements
7761 SET comments=NULL
7762 WHERE stm_id IN
7763 (SELECT id from okl_streams WHERE khr_id = p_khr_id and say_code = 'WORK');
7764 -- print( l_prog_name, ' done ' );
7765
7766 /*
7767 * delete the duplicates from the okl_streams header table.
7768 */
7769 -- Modified by RGOOTY: Start
7770 IF (p_generation_type <> 'RESIDUAL VALUE' AND p_generation_type <> 'CAPITAL REDUCTION')
7771 THEN
7772
7773 consolidate_line_streams(p_khr_id => p_khr_id,
7774 p_purpose_code => l_purpose_code,
7775 x_return_status => lx_return_status);
7776 -- print( l_prog_name, ' consolidated ', lx_return_status );
7777
7778 IF lx_return_status = OKL_API.G_RET_STS_UNEXP_ERROR THEN
7779 RAISE OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
7780 ELSIF lx_return_status = OKL_API.G_RET_STS_ERROR THEN
7781 RAISE OKL_API.G_EXCEPTION_ERROR;
7782 END IF;
7783 END IF;
7784
7785 IF (p_generation_type <> 'SERVICE_LINES' AND
7786 p_generation_type <> 'RESIDUAL VALUE' AND
7787 p_generation_type <> 'CAPITAL REDUCTION')
7788 THEN
7789
7790 consolidate_header_streams(p_khr_id => p_khr_id,
7791 p_purpose_code => l_purpose_code,
7792 x_return_status => lx_return_status);
7793
7794 -- print( l_prog_name, ' consolidated ', lx_return_status );
7795
7796 IF lx_return_status = OKL_API.G_RET_STS_UNEXP_ERROR THEN
7797 RAISE OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
7798 ELSIF lx_return_status = OKL_API.G_RET_STS_ERROR THEN
7799 RAISE OKL_API.G_EXCEPTION_ERROR;
7800 END IF;
7801 --bakuchib changes
7802 END IF;
7803
7804 IF (p_generation_type <> 'RESIDUAL VALUE' AND p_generation_type <> 'CAPITAL REDUCTION')
7805 THEN
7806 consolidate_acc_streams(p_khr_id => p_khr_id,
7807 p_purpose_code => l_purpose_code,
7808 x_return_status => lx_return_status);
7809 -- print( l_prog_name, ' consolidated ', lx_return_status );
7810
7811 IF lx_return_status = OKL_API.G_RET_STS_UNEXP_ERROR THEN
7812 RAISE OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
7813 ELSIF lx_return_status = OKL_API.G_RET_STS_ERROR THEN
7814 RAISE OKL_API.G_EXCEPTION_ERROR;
7815 END IF;
7816
7817 END IF;
7818
7819 OKL_API.SET_MESSAGE (p_app_name => G_APP_NAME,
7820 p_msg_name => 'OKL_STREAM_GENERATION_SUCCESS');
7821
7822 x_return_status := G_RET_STS_SUCCESS;
7823 print( l_prog_name, 'end' );
7824
7825 EXCEPTION
7826
7827 WHEN OKL_API.G_EXCEPTION_ERROR THEN
7828
7829 x_return_status := G_RET_STS_ERROR;
7830
7831 WHEN OKL_API.G_EXCEPTION_UNEXPECTED_ERROR THEN
7832
7833 x_return_status := G_RET_STS_UNEXP_ERROR;
7834
7835 WHEN OTHERS THEN
7836
7837 OKL_API.SET_MESSAGE (p_app_name => G_APP_NAME,
7838 p_msg_name => G_DB_ERROR,
7839 p_token1 => G_PROG_NAME_TOKEN,
7840 p_token1_value => l_prog_name,
7841 p_token2 => G_SQLCODE_TOKEN,
7842 p_token2_value => sqlcode,
7843 p_token3 => G_SQLERRM_TOKEN,
7844 p_token3_value => sqlerrm);
7845
7846 x_return_status := G_RET_STS_UNEXP_ERROR;
7847
7848 END generate_streams;
7849
7850 PROCEDURE generate_streams( p_api_version IN NUMBER,
7851 p_init_msg_list IN VARCHAR2,
7852 p_khr_id IN NUMBER,
7853 p_compute_irr IN VARCHAR2,
7854 p_generation_type IN VARCHAR2,
7855 p_reporting_book_class IN VARCHAR2,
7856 x_pre_tax_irr OUT NOCOPY NUMBER,
7857 x_return_status OUT NOCOPY VARCHAR2,
7858 x_msg_count OUT NOCOPY NUMBER,
7859 x_msg_data OUT NOCOPY VARCHAR2) IS
7860
7861 l_contract_rates rate_rec_type;
7862
7863 Begin
7864
7865
7866 generate_streams( p_api_version => p_api_version,
7867 p_init_msg_list => p_init_msg_list,
7868 p_khr_id => p_khr_id,
7869 p_compute_rates => p_compute_irr,
7870 p_generation_type => p_generation_type,
7871 p_reporting_book_class => p_reporting_book_class,
7872 x_contract_rates => l_contract_rates,
7873 x_return_status => x_return_status,
7874 x_msg_count => x_msg_count,
7875 x_msg_data => x_msg_data);
7876
7877 x_pre_tax_irr := l_contract_rates.pre_tax_irr;
7878
7879
7880 End generate_streams;
7881
7882 PROCEDURE GEN_VAR_INT_SCHEDULE( p_api_version IN NUMBER,
7883 p_init_msg_list IN VARCHAR2,
7884 p_khr_id IN NUMBER,
7885 p_purpose_code IN VARCHAR2,
7886 x_return_status OUT NOCOPY VARCHAR2,
7887 x_msg_count OUT NOCOPY NUMBER,
7888 x_msg_data OUT NOCOPY VARCHAR2) IS
7889
7890 CURSOR l_varint_sll_csr( khrid NUMBER ) IS
7891 SELECT TO_NUMBER(NULL) cle_id,
7892 TO_NUMBER(rul1.object1_id1) sty_id,
7893 FND_DATE.canonical_to_date(rul2.rule_information2) start_date,
7894 TO_NUMBER(rul2.rule_information3) periods,
7895 rul2.object1_id1 frequency,
7896 rul2.rule_information5 structure,
7897 DECODE(rul2.rule_information10, 'Y', 'ARREARS', 'ADVANCE') advance_arrears,
7898 FND_NUMBER.canonical_to_number(rul2.rule_information6) amount,
7899 TO_NUMBER(rul2.rule_information7) stub_days,
7900 TO_NUMBER(rul2.rule_information8) stub_amount,
7901 NULL lty_code,
7902 TO_NUMBER(NULL) capital_amount,
7903 TO_NUMBER(NULL) residual_value
7904 FROM okc_rule_groups_b rgp,
7905 okc_rules_b rul1,
7906 okc_rules_b rul2,
7907 okl_strm_type_tl sty
7908 WHERE rul2.dnz_chr_id = khrid
7909 AND rul2.rule_information_category = 'LASLL'
7910 AND rul2.rgp_id = rgp.id
7911 AND rul1.rgp_id = rgp.id
7912 AND rgp.cle_id IS NULL
7913 AND rul2.object2_id1 = rul1.id
7914 AND rul1.object1_id1 = sty.id
7915 AND sty.language = USERENV('LANG')
7916 AND sty.name = 'VARIABLE INTEREST SCHEDULE';
7917
7918 l_varint_sll_rec l_varint_sll_csr%ROWTYPE;
7919
7920 l_advance_or_arrears VARCHAR2(10) := 'ARREARS';
7921
7922 Cursor l_strms_csr ( chrId NUMBER, styId NUMBER ) IS
7923 Select str.id strm_id
7924 From okl_streams str
7925 Where str.sty_id = styId
7926 and str.khr_id = chrId
7927 and str.say_code = 'WORK';
7928
7929 l_strms_rec l_strms_csr%ROWTYPE;
7930
7931 CURSOR c_hdr IS
7932 SELECT chr.template_yn,
7933 chr.currency_code,
7934 chr.start_date,
7935 khr.deal_type,
7936 khr.term_duration,
7937 NVL(khr.generate_accrual_yn, 'Y')
7938 FROM okc_k_headers_b chr,
7939 okl_k_headers khr
7940 WHERE khr.id = p_khr_id
7941 AND chr.id = khr.id;
7942
7943 l_hdr c_hdr%ROWTYPE;
7944 l_deal_type VARCHAR2(30);
7945 l_purpose_code VARCHAR2(30);
7946
7947 l_sty_id NUMBER;
7948 l_sty_name VARCHAR2(150);
7949 l_mapped_sty_name VARCHAR2(150);
7950
7951 l_selv_tbl okl_streams_pub.selv_tbl_type;
7952 l_pt_tbl okl_streams_pub.selv_tbl_type;
7953 lx_selv_tbl okl_streams_pub.selv_tbl_type;
7954
7955 l_stmv_rec okl_streams_pub.stmv_rec_type;
7956 l_stmv_tbl okl_streams_pub.stmv_tbl_type;
7957 lx_stmv_tbl okl_streams_pub.stmv_tbl_type;
7958 x_stmv_tbl okl_streams_pub.stmv_tbl_type;
7959 l_pt_rec okl_streams_pub.stmv_rec_type;
7960 lx_stmv_rec okl_streams_pub.stmv_rec_type;
7961
7962 i BINARY_INTEGER := 0;
7963
7964 l_api_name CONSTANT VARCHAR2(61) := 'GEN_VAR_INT_SCHEDULE';
7965
7966 BEGIN
7967 print( l_api_name, 'begin' );
7968
7969 x_return_status := OKL_API.G_RET_STS_SUCCESS;
7970
7971 x_return_status := OKL_API.START_ACTIVITY(
7972 p_api_name => l_api_name,
7973 p_pkg_name => g_pkg_name,
7974 p_init_msg_list => p_init_msg_list,
7975 l_api_version => p_api_version,
7976 p_api_version => p_api_version,
7977 p_api_type => G_API_TYPE,
7978 x_return_status => x_return_status);
7979
7980 -- check if activity started successfully
7981 If (x_return_status = OKL_API.G_RET_STS_UNEXP_ERROR) then
7982 raise OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
7983 ElSIF (x_return_status = OKL_API.G_RET_STS_ERROR) then
7984 raise OKL_API.G_EXCEPTION_ERROR;
7985 End If;
7986
7987 print( l_api_name, 'checking for var rate' );
7988 If (Is_Var_Rate_Contract( p_khr_id ) = 'N' ) THEN
7989 print( l_api_name, 'checking for var rate - nah' );
7990 return;
7991 END IF;
7992 print( l_api_name, 'checking for var rate - yah' );
7993
7994 get_sty_details (p_sty_name => 'VARIABLE INTEREST SCHEDULE',
7995 x_sty_id => l_sty_id,
7996 x_sty_name => l_sty_name,
7997 x_return_status => x_return_status);
7998
7999 IF x_return_status = OKL_API.G_RET_STS_UNEXP_ERROR THEN
8000 RAISE OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
8001 ELSIF x_return_status = OKL_API.G_RET_STS_ERROR THEN
8002 RAISE OKL_API.G_EXCEPTION_ERROR;
8003 END IF;
8004
8005 print( l_api_name, 'got stream type' );
8006 i := 0;
8007 FOR l_strms_rec in l_strms_csr ( p_khr_id, l_sty_id)
8008 LOOP
8009
8010 i := i + 1;
8011 l_stmv_tbl(i).id := l_strms_rec.STRM_ID;
8012 l_stmv_tbl(i).say_code := 'HIST';
8013 l_stmv_tbl(i).active_yn := 'N';
8014 l_stmv_tbl(i).date_history := sysdate;
8015
8016 END LOOP;
8017
8018 If ( l_stmv_tbl.COUNT > 0 ) Then
8019
8020 Okl_Streams_pub.update_streams(
8021 p_api_version => p_api_version,
8022 p_init_msg_list => p_init_msg_list,
8023 x_return_status => x_return_status,
8024 x_msg_count => x_msg_count,
8025 x_msg_data => x_msg_data,
8026 p_stmv_tbl => l_stmv_tbl,
8027 x_stmv_tbl => x_stmv_tbl);
8028
8029 IF x_return_status = OKL_API.G_RET_STS_UNEXP_ERROR THEN
8030 RAISE OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
8031 ELSIF x_return_status = OKL_API.G_RET_STS_ERROR THEN
8032 RAISE OKL_API.G_EXCEPTION_ERROR;
8033 END IF;
8034
8035 End If;
8036
8037 /*
8038 OPEN c_hdr;
8039 FETCH c_hdr INTO l_hdr;
8040 CLOSE c_hdr;
8041
8042 FOR l_varint_sll_rec in l_varint_sll_csr( p_khr_id )
8043 LOOP
8044
8045 IF ( lx_selv_tbl.COUNT > 0 ) Then
8046 lx_selv_tbl.delete;
8047 END IF;
8048
8049 get_stream_elements(
8050 p_start_date => l_varint_sll_rec.start_date,
8051 p_periods => l_varint_sll_rec.periods,
8052 p_frequency => l_varint_sll_rec.frequency,
8053 p_structure => l_varint_sll_rec.structure,
8054 p_advance_or_arrears => l_varint_sll_rec.advance_arrears,
8055 p_amount => l_varint_sll_rec.amount,
8056 p_stub_days => l_varint_sll_rec.stub_days,
8057 p_stub_amount => l_varint_sll_rec.stub_amount,
8058 p_currency_code => l_hdr.currency_code,
8059 p_khr_id => p_khr_id,
8060 p_kle_id => NULL,
8061 p_purpose_code => p_purpose_code,
8062 x_selv_tbl => lx_selv_tbl,
8063 x_pt_tbl => l_pt_tbl,
8064 x_return_status => x_return_status,
8065 x_msg_count => x_msg_count,
8066 x_msg_data => x_msg_data);
8067
8068 IF x_return_status = OKL_API.G_RET_STS_UNEXP_ERROR THEN
8069 RAISE OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
8070 ELSIF x_return_status = OKL_API.G_RET_STS_ERROR THEN
8071 RAISE OKL_API.G_EXCEPTION_ERROR;
8072 END IF;
8073
8074 FOR i in 1..lx_selv_tbl.COUNT
8075 LOOP
8076 l_selv_tbl( l_selv_tbl.COUNT + 1) := lx_selv_tbl(i);
8077 END LOOP;
8078
8079 END LOOP;
8080
8081 get_stream_header(p_khr_id => p_khr_id,
8082 p_kle_id => NULL,
8083 p_sty_id => l_sty_id,
8084 p_purpose_code => p_purpose_code,
8085 x_stmv_rec => l_stmv_rec,
8086 x_return_status => x_return_status);
8087
8088 IF x_return_status = OKL_API.G_RET_STS_UNEXP_ERROR THEN
8089 RAISE OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
8090 ELSIF x_return_status = OKL_API.G_RET_STS_ERROR THEN
8091 RAISE OKL_API.G_EXCEPTION_ERROR;
8092 END IF;
8093
8094
8095 x_return_status := Okl_Streams_Util.round_streams_amount(
8096 p_api_version => p_api_version,
8097 p_init_msg_list => p_init_msg_list,
8098 x_msg_count => x_msg_count,
8099 x_msg_data => x_msg_data,
8100 p_chr_id => p_khr_id,
8101 p_selv_tbl => l_selv_tbl,
8102 x_selv_tbl => lx_selv_tbl);
8103
8104 IF (x_return_status = G_RET_STS_UNEXP_ERROR) THEN
8105 RAISE OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
8106 ELSIF (x_return_status = G_RET_STS_ERROR) THEN
8107 RAISE OKL_API.G_EXCEPTION_ERROR;
8108 END IF;
8109
8110 l_selv_tbl.DELETE;
8111 l_selv_tbl := lx_selv_tbl;
8112
8113 okl_streams_pub.create_streams(p_api_version => p_api_version,
8114 p_init_msg_list => p_init_msg_list,
8115 x_return_status => x_return_status,
8116 x_msg_count => x_msg_count,
8117 x_msg_data => x_msg_data,
8118 p_stmv_rec => l_stmv_rec,
8119 p_selv_tbl => l_selv_tbl,
8120 x_stmv_rec => lx_stmv_rec,
8121 x_selv_tbl => lx_selv_tbl);
8122
8123 IF x_return_status = OKL_API.G_RET_STS_UNEXP_ERROR THEN
8124 RAISE OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
8125 ELSIF x_return_status = OKL_API.G_RET_STS_ERROR THEN
8126 RAISE OKL_API.G_EXCEPTION_ERROR;
8127 END IF;
8128
8129 */
8130 OKL_API.END_ACTIVITY(x_msg_count => x_msg_count, x_msg_data => x_msg_data);
8131 print( l_api_name, 'end' );
8132 Exception
8133
8134 when OKL_API.G_EXCEPTION_ERROR then
8135 x_return_status := OKL_API.HANDLE_EXCEPTIONS(
8136 p_api_name => l_api_name,
8137 p_pkg_name => g_pkg_name,
8138 p_exc_name => 'OKL_API.G_RET_STS_ERROR',
8139 x_msg_count => x_msg_count,
8140 x_msg_data => x_msg_data,
8141 p_api_type => g_api_type);
8142
8143 when OKL_API.G_EXCEPTION_UNEXPECTED_ERROR then
8144 x_return_status := OKL_API.HANDLE_EXCEPTIONS(
8145 p_api_name => l_api_name,
8146 p_pkg_name => g_pkg_name,
8147 p_exc_name => 'OKL_API.G_RET_STS_UNEXP_ERROR',
8148 x_msg_count => x_msg_count,
8149 x_msg_data => x_msg_data,
8150 p_api_type => g_api_type);
8151
8152 when OTHERS then
8153 x_return_status := OKL_API.HANDLE_EXCEPTIONS(
8154 p_api_name => l_api_name,
8155 p_pkg_name => g_pkg_name,
8156 p_exc_name => 'OTHERS',
8157 x_msg_count => x_msg_count,
8158 x_msg_data => x_msg_data,
8159 p_api_type => g_api_type);
8160
8161 END GEN_VAR_INT_SCHEDULE;
8162
8163 PROCEDURE gen_pv_streams(p_api_version IN NUMBER,
8164 p_init_msg_list IN VARCHAR2,
8165 p_pool_status IN VARCHAR2,
8166 p_agreement_id IN NUMBER,
8167 p_contract_id IN NUMBER,
8168 p_kle_id IN NUMBER,
8169 p_sty_id IN NUMBER,
8170 p_mode IN VARCHAR2,
8171 x_stmv_rec OUT NOCOPY okl_streams_pub.stmv_rec_type,
8172 x_selv_tbl OUT NOCOPY okl_streams_pub.selv_tbl_type,
8173 x_return_status OUT NOCOPY VARCHAR2,
8174 x_msg_count OUT NOCOPY NUMBER,
8175 x_msg_data OUT NOCOPY VARCHAR2) IS
8176
8177
8178 l_api_name CONSTANT VARCHAR2(61) := 'gen_pv_streams';
8179
8180 Cursor sec_strms_csr IS
8181 select pol.khr_id agreement_id,
8182 pcn.khr_id contract_id,
8183 pcn.kle_id asset_id,
8184 pcn.sty_id stream_type_id,
8185 pcn.streams_from_date,
8186 pcn.streams_to_date,
8187 ele.STREAM_ELEMENT_DATE,
8188 ele.se_line_number,
8189 ele.id stream_ele_id,
8190 ele.amount stream_ele_amount,
8191 sty.name stream_name,
8192 stm.id stm_id
8193 from okl_pools pol,
8194 okl_pool_contents pcn,
8195 okl_strm_type_v sty,
8196 okl_streams stm,
8197 okl_strm_elements ele
8198 where pcn.sty_id = sty.id
8199 and pcn.pol_id = pol.id
8200 and stm.kle_id = pcn.kle_id
8201 and stm.khr_id = pcn.khr_id
8202 and stm.sty_id = pcn.sty_id
8203 and stm.say_code = 'CURR'
8204 and stm.active_yn = 'Y'
8205 and ele.stm_id = stm.id
8206 and pol.khr_id = p_agreement_id
8207 and stm.khr_id = p_contract_id
8208 and stm.kle_id = p_kle_id
8209 and stm.sty_id = p_sty_id
8210 and pol.status_code = p_pool_status
8211 and ele.stream_element_date >= nvl(pcn.streams_from_date, ele.stream_element_date-1)
8212 and ele.stream_element_date <= nvl(pcn.STREAMS_TO_DATE, OKL_POOL_PVT.G_FINAL_DATE)
8213 AND pcn.status_code IN (G_IA_STS_ACTIVE,G_IA_STS_NEW) -- Added by VARANGAN -Pool Contents Impact - 26/11/07
8214 order by pcn.khr_id, pcn.kle_id, pcn.sty_id;
8215
8216 sec_strms_rec sec_strms_csr%ROWTYPE;
8217
8218 Cursor ylds_csr( agmntID NUMBER, khrId NUMBER) IS
8219 select pol.khr_id agreement_id,
8220 pcn.khr_id contract_id,
8221 pkhr.start_date contract_start_date,
8222 pkhr.contract_number agreement_number,
8223 nvl(pkhr.after_tax_yield, -1) agmnt_yield,
8224 nvl(khr.PRE_TAX_IRR, -1) contract_yield
8225 from okl_pools pol,
8226 okl_pool_contents pcn,
8227 okl_K_headers_full_v pkhr,
8228 okl_k_headers khr
8229 where pcn.pol_id = pol.id
8230 and pcn.khr_id = khr.id
8231 and pol.khr_id = pkhr.id
8232 and pol.khr_id = agmntID
8233 and pcn.khr_id = khrId
8234 AND pcn.status_CODE IN (G_IA_STS_ACTIVE,G_IA_STS_NEW) ; -- Added by VARANGAN -Pool Contents Impact - 26/11/07
8235 /* sosharma ,14-12-2007
8236 Bug 6691554
8237 Changed cursors for pending pool
8238 Start Changes*/
8239 Cursor sec_strms_pend_csr IS
8240 select pol.khr_id agreement_id,
8241 pcn.khr_id contract_id,
8242 pcn.kle_id asset_id,
8243 pcn.sty_id stream_type_id,
8244 pcn.streams_from_date,
8245 pcn.streams_to_date,
8246 ele.STREAM_ELEMENT_DATE,
8247 ele.se_line_number,
8248 ele.id stream_ele_id,
8249 ele.amount stream_ele_amount,
8250 sty.name stream_name,
8251 stm.id stm_id
8252 from okl_pools pol,
8253 okl_pool_contents pcn,
8254 okl_strm_type_v sty,
8255 okl_streams stm,
8256 okl_strm_elements ele
8257 where pcn.sty_id = sty.id
8258 and pcn.pol_id = pol.id
8259 and stm.kle_id = pcn.kle_id
8260 and stm.khr_id = pcn.khr_id
8261 and stm.sty_id = pcn.sty_id
8262 and stm.say_code = 'CURR'
8263 and stm.active_yn = 'Y'
8264 and ele.stm_id = stm.id
8265 and pol.khr_id = p_agreement_id
8266 and stm.khr_id = p_contract_id
8267 and stm.kle_id = p_kle_id
8268 and stm.sty_id = p_sty_id
8269 and pol.status_code = p_pool_status
8270 and ele.stream_element_date >= nvl(pcn.streams_from_date, ele.stream_element_date-1)
8271 and ele.stream_element_date <= nvl(pcn.STREAMS_TO_DATE, OKL_POOL_PVT.G_FINAL_DATE)
8272 AND pcn.status_code = G_PC_STS_PENDING
8273 order by pcn.khr_id, pcn.kle_id, pcn.sty_id;
8274
8275
8276
8277 Cursor ylds_pend_csr( agmntID NUMBER, khrId NUMBER) IS
8278 select pol.khr_id agreement_id,
8279 pcn.khr_id contract_id,
8280 pkhr.start_date contract_start_date,
8281 pkhr.contract_number agreement_number,
8282 nvl(pkhr.after_tax_yield, -1) agmnt_yield,
8283 nvl(khr.PRE_TAX_IRR, -1) contract_yield
8284 from okl_pools pol,
8285 okl_pool_contents pcn,
8286 okl_K_headers_full_v pkhr,
8287 okl_k_headers khr
8288 where pcn.pol_id = pol.id
8289 and pcn.khr_id = khr.id
8290 and pol.khr_id = pkhr.id
8291 and pol.khr_id = agmntID
8292 and pcn.khr_id = khrId
8293 AND pcn.status_CODE = G_PC_STS_PENDING ;
8294 /* sosharma end changes*/
8295
8296 ylds_rec ylds_csr%ROWTYPE;
8297
8298 l_day_convention_month VARCHAR2(30);
8299 l_day_convention_year VARCHAR2(30);
8300
8301 l_agt_yld NUMBER;
8302 l_khr_yld NUMBER;
8303
8304 l_sty_id NUMBER;
8305 l_sty_name VARCHAR2(150);
8306 l_mapped_sty_name VARCHAR2(150);
8307
8308 l_selv_tbl okl_streams_pub.selv_tbl_type;
8309 l_stmv_tbl okl_streams_pub.stmv_tbl_type;
8310 x_stmv_tbl okl_streams_pub.stmv_tbl_type;
8311 lx_selv_tbl okl_streams_pub.selv_tbl_type;
8312
8313 l_stmv_rec okl_streams_pub.stmv_rec_type;
8314 lx_stmv_rec okl_streams_pub.stmv_rec_type;
8315
8316 cursor l_hdrrl_csr IS
8317 select crl.RULE_INFORMATION1 method
8318 from OKC_RULE_GROUPS_B crg,
8319 OKC_RULES_B crl
8320 where crl.rgp_id = crg.id
8321 and crg.RGD_CODE = 'LASEIR'
8322 and crl.RULE_INFORMATION_CATEGORY = 'LASEIR'
8323 and crg.dnz_chr_id = p_agreement_id;
8324
8325 l_hdrrl_rec l_hdrrl_csr%ROWTYPE;
8326
8327 Cursor c_stm_name IS
8328 Select sty.stream_type_subclass name,
8329 sty.stream_type_purpose stream_type_purpose
8330 from okl_strm_type_tl tl,
8331 okl_strm_type_v sty
8332 where tl.language = 'US'
8333 and sty.id = tl.id
8334 and tl.id = p_sty_id;
8335
8336 r_stm_name c_stm_name%ROWTYPE;
8337
8338 i NUMBER;
8339 n NUMBER;
8340
8341 l_rentsty_id NUMBER;
8342 l_rvsty_id NUMBER;
8343 l_rentsty_name VARCHAR2(256);
8344 l_rvsty_name VARCHAR2(256);
8345
8346 l_days NUMBER;
8347
8348 l_start_date DATE;
8349 l_end_date DATE;
8350
8351 BEGIN
8352
8353 print( l_api_name, 'begin' );
8354
8355 x_return_status := OKL_API.G_RET_STS_SUCCESS;
8356
8357 x_return_status := OKL_API.START_ACTIVITY(
8358 p_api_name => l_api_name,
8359 p_pkg_name => g_pkg_name,
8360 p_init_msg_list => p_init_msg_list,
8361 l_api_version => p_api_version,
8362 p_api_version => p_api_version,
8363 p_api_type => G_API_TYPE,
8364 x_return_status => x_return_status);
8365
8366 -- check if activity started successfully
8367 If (x_return_status = OKL_API.G_RET_STS_UNEXP_ERROR) then
8368 raise OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
8369 ElSIF (x_return_status = OKL_API.G_RET_STS_ERROR) then
8370 raise OKL_API.G_EXCEPTION_ERROR;
8371 End If;
8372
8373 OPEN l_hdrrl_csr;
8374 FETCH l_hdrrl_csr INTO l_hdrrl_rec;
8375 CLOSE l_hdrrl_csr;
8376 print( l_api_name, ' method ' || l_hdrrl_rec.method );
8377
8378 IF p_mode IS NULL THEN
8379
8380 OPEN sec_strms_csr;
8381 FETCH sec_strms_csr INTO sec_strms_rec;
8382 CLOSE sec_strms_csr;
8383
8384 OPEN ylds_csr( p_agreement_id, sec_strms_rec.contract_id );
8385 FETCH ylds_csr INTO ylds_rec;
8386 CLOSE ylds_csr;
8387
8388 If (nvl(ylds_rec.contract_yield, -360)/360 = -1 ) Then
8389
8390 OKL_API.SET_MESSAGE(p_app_name => G_APP_NAME,
8391 p_msg_name => 'OKL_AGMNT_NOYLD',
8392 p_token1 => 'AGMNT',
8393 p_token1_value => ylds_rec.agreement_number);
8394
8395 RAISE OKL_API.G_EXCEPTION_ERROR;
8396
8397 End If;
8398
8399 l_khr_yld := ylds_rec.contract_yield / 100.00;
8400
8401 OPEN c_stm_name;
8402 FETCH c_stm_name INTO r_stm_name;
8403 CLOSE c_stm_name;
8404
8405 IF r_stm_name.name = 'LOAN_PAYMENT' THEN
8406 get_mapped_stream (p_sty_purpose => r_stm_name.name,
8407 p_mapping_type => 'PV_DISBURSEMENT',
8408 p_line_style => NULL,
8409 p_deal_type => 'LOAN',
8410 p_khr_id => p_agreement_id,
8411 p_stream_type_purpose => r_stm_name.stream_type_purpose,
8412 x_mapped_stream => l_mapped_sty_name,
8413 x_return_status => x_return_status);
8414
8415 IF x_return_status = OKL_API.G_RET_STS_UNEXP_ERROR THEN
8416 RAISE OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
8417 ELSIF x_return_status = OKL_API.G_RET_STS_ERROR THEN
8418 RAISE OKL_API.G_EXCEPTION_ERROR;
8419 END IF;
8420 If l_mapped_sty_name is NOT NULL THen
8421
8422 get_sty_details (p_sty_name => l_mapped_sty_name,
8423 x_sty_id => l_sty_id,
8424 x_sty_name => l_sty_name,
8425 x_return_status => x_return_status);
8426
8427 IF x_return_status = OKL_API.G_RET_STS_UNEXP_ERROR THEN
8428 RAISE OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
8429 ELSIF x_return_status = OKL_API.G_RET_STS_ERROR THEN
8430 RAISE OKL_API.G_EXCEPTION_ERROR;
8431 END IF;
8432
8433 l_stmv_rec := NULL;
8434 get_stream_header(p_purpose_code => NULL,
8435 p_khr_id => p_contract_id,
8436 p_kle_id => p_kle_id,
8437 p_sty_id => l_sty_id,
8438 x_stmv_rec => l_stmv_rec,
8439 x_return_status => x_return_status);
8440
8441 IF x_return_status = OKL_API.G_RET_STS_UNEXP_ERROR THEN
8442 RAISE OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
8443 ELSIF x_return_status = OKL_API.G_RET_STS_ERROR THEN
8444 RAISE OKL_API.G_EXCEPTION_ERROR;
8445 END IF;
8446
8447 l_selv_tbl(1).stream_element_date := ylds_rec.contract_start_date;
8448 l_selv_tbl(1).se_line_number := 1;
8449 l_start_date := ylds_rec.contract_start_date;
8450
8451 l_selv_tbl(1).amount := 0.0;
8452 print( l_api_name, ' khr_yld ' || to_char( l_khr_yld ) );
8453
8454 -- Fetch the day convention ..
8455 OKL_PRICING_UTILS_PVT.get_day_convention(
8456 p_id => p_contract_id,
8457 p_source => 'ISG',
8458 x_days_in_month => l_day_convention_month,
8459 x_days_in_year => l_day_convention_year,
8460 x_return_status => x_return_status);
8461 print( 'gen_pv_streams', 'Month / Year = ' || l_day_convention_month || '/' || l_day_convention_year );
8462 IF (x_return_status = G_RET_STS_UNEXP_ERROR) THEN
8463 RAISE OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
8464 ELSIF (x_return_status = G_RET_STS_ERROR) THEN
8465 RAISE OKL_API.G_EXCEPTION_ERROR;
8466 END IF;
8467
8468 FOR sec_strms_rec IN sec_strms_csr
8469 LOOP
8470
8471 l_end_date := sec_strms_rec.stream_element_date;
8472
8473 l_days := OKL_PRICING_UTILS_PVT.get_day_count (p_start_date => l_start_date,
8474 p_days_in_month => l_day_convention_month,
8475 p_days_in_year => l_day_convention_year,
8476 p_end_date => l_end_date,
8477 p_arrears => 'N',
8478 x_return_status => x_return_status);
8479
8480 IF x_return_status = OKL_API.G_RET_STS_UNEXP_ERROR THEN
8481 RAISE OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
8482 ELSIF x_return_status = OKL_API.G_RET_STS_ERROR THEN
8483 RAISE OKL_API.G_EXCEPTION_ERROR;
8484 END IF;
8485
8486 l_selv_tbl(1).amount := l_selv_tbl(1).amount +
8487 sec_strms_rec.stream_ele_amount / POWER( 1 + (l_khr_yld/360), l_days );
8488
8489 print( l_api_name, ' amount ' || to_char( l_selv_tbl(1).amount ) );
8490 END LOOP;
8491
8492
8493 x_stmv_rec := l_stmv_rec;
8494 x_selv_tbl := l_selv_tbl;
8495
8496 End If;
8497
8498 ELSE
8499 get_mapped_stream (p_sty_purpose => r_stm_name.name,
8500 p_mapping_type => 'PV_DISBURSEMENT',
8501 p_line_style => NULL,
8502 p_deal_type => 'LEASE',
8503 p_khr_id => p_agreement_id, --p_khr_id => p_contract_id,
8504 x_mapped_stream => l_mapped_sty_name,
8505 x_return_status => x_return_status);
8506
8507 IF x_return_status = OKL_API.G_RET_STS_UNEXP_ERROR THEN
8508 RAISE OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
8509 ELSIF x_return_status = OKL_API.G_RET_STS_ERROR THEN
8510 RAISE OKL_API.G_EXCEPTION_ERROR;
8511 END IF;
8512 If l_mapped_sty_name is NOT NULL THen
8513
8514 get_sty_details (p_sty_name => l_mapped_sty_name,
8515 x_sty_id => l_sty_id,
8516 x_sty_name => l_sty_name,
8517 x_return_status => x_return_status);
8518
8519 IF x_return_status = OKL_API.G_RET_STS_UNEXP_ERROR THEN
8520 RAISE OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
8521 ELSIF x_return_status = OKL_API.G_RET_STS_ERROR THEN
8522 RAISE OKL_API.G_EXCEPTION_ERROR;
8523 END IF;
8524
8525 l_stmv_rec := NULL;
8526 get_stream_header(p_purpose_code => NULL,
8527 p_khr_id => p_contract_id,
8528 p_kle_id => p_kle_id,
8529 p_sty_id => l_sty_id,
8530 x_stmv_rec => l_stmv_rec,
8531 x_return_status => x_return_status);
8532
8533 IF x_return_status = OKL_API.G_RET_STS_UNEXP_ERROR THEN
8534 RAISE OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
8535 ELSIF x_return_status = OKL_API.G_RET_STS_ERROR THEN
8536 RAISE OKL_API.G_EXCEPTION_ERROR;
8537 END IF;
8538
8539 l_selv_tbl(1).stream_element_date := ylds_rec.contract_start_date;
8540 l_selv_tbl(1).se_line_number := 1;
8541 l_start_date := ylds_rec.contract_start_date;
8542
8543 l_selv_tbl(1).amount := 0.0;
8544 print( l_api_name, ' khr_yld ' || to_char( l_khr_yld ) );
8545
8546 -- Fetch the day convention ..
8547 OKL_PRICING_UTILS_PVT.get_day_convention(
8548 p_id => p_contract_id,
8549 p_source => 'ISG',
8550 x_days_in_month => l_day_convention_month,
8551 x_days_in_year => l_day_convention_year,
8552 x_return_status => x_return_status);
8553 print( 'gen_pv_streams', 'Month / Year = ' || l_day_convention_month || '/' || l_day_convention_year );
8554 IF (x_return_status = G_RET_STS_UNEXP_ERROR) THEN
8555 RAISE OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
8556 ELSIF (x_return_status = G_RET_STS_ERROR) THEN
8557 RAISE OKL_API.G_EXCEPTION_ERROR;
8558 END IF;
8559
8560 FOR sec_strms_rec IN sec_strms_csr
8561 LOOP
8562
8563 l_end_date := sec_strms_rec.stream_element_date;
8564
8565 l_days := OKL_PRICING_UTILS_PVT.get_day_count (p_start_date => l_start_date,
8566 p_days_in_month => l_day_convention_month,
8567 p_days_in_year => l_day_convention_year,
8568 p_end_date => l_end_date,
8569 p_arrears => 'N',
8570 x_return_status => x_return_status);
8571
8572 IF x_return_status = OKL_API.G_RET_STS_UNEXP_ERROR THEN
8573 RAISE OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
8574 ELSIF x_return_status = OKL_API.G_RET_STS_ERROR THEN
8575 RAISE OKL_API.G_EXCEPTION_ERROR;
8576 END IF;
8577
8578 l_selv_tbl(1).amount := l_selv_tbl(1).amount +
8579 sec_strms_rec.stream_ele_amount / POWER( 1 + (l_khr_yld/360), l_days );
8580
8581 print( l_api_name, ' amount ' || to_char( l_selv_tbl(1).amount ) );
8582 END LOOP;
8583
8584
8585 x_stmv_rec := l_stmv_rec;
8586 x_selv_tbl := l_selv_tbl;
8587
8588 End If;
8589
8590 END IF;
8591
8592
8593 ELSE
8594
8595 OPEN sec_strms_pend_csr;
8596 FETCH sec_strms_pend_csr INTO sec_strms_rec;
8597 CLOSE sec_strms_pend_csr;
8598
8599 OPEN ylds_pend_csr( p_agreement_id, sec_strms_rec.contract_id );
8600 FETCH ylds_pend_csr INTO ylds_rec;
8601 CLOSE ylds_pend_csr;
8602
8603 If (nvl(ylds_rec.contract_yield, -360)/360 = -1 ) Then
8604
8605 OKL_API.SET_MESSAGE(p_app_name => G_APP_NAME,
8606 p_msg_name => 'OKL_AGMNT_NOYLD',
8607 p_token1 => 'AGMNT',
8608 p_token1_value => ylds_rec.agreement_number);
8609
8610 RAISE OKL_API.G_EXCEPTION_ERROR;
8611
8612 End If;
8613
8614 l_khr_yld := ylds_rec.contract_yield / 100.00;
8615
8616 OPEN c_stm_name;
8617 FETCH c_stm_name INTO r_stm_name;
8618 CLOSE c_stm_name;
8619 IF r_stm_name.name = 'LOAN_PAYMENT' THEN
8620 get_mapped_stream (p_sty_purpose => r_stm_name.name,
8621 p_mapping_type => 'PV_DISBURSEMENT',
8622 p_line_style => NULL,
8623 p_deal_type => 'LOAN',
8624 p_khr_id => p_agreement_id,
8625 p_stream_type_purpose => r_stm_name.stream_type_purpose,
8626 x_mapped_stream => l_mapped_sty_name,
8627 x_return_status => x_return_status);
8628
8629 IF x_return_status = OKL_API.G_RET_STS_UNEXP_ERROR THEN
8630 RAISE OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
8631 ELSIF x_return_status = OKL_API.G_RET_STS_ERROR THEN
8632 RAISE OKL_API.G_EXCEPTION_ERROR;
8633 END IF;
8634 If l_mapped_sty_name is NOT NULL THen
8635
8636 get_sty_details (p_sty_name => l_mapped_sty_name,
8637 x_sty_id => l_sty_id,
8638 x_sty_name => l_sty_name,
8639 x_return_status => x_return_status);
8640
8641 IF x_return_status = OKL_API.G_RET_STS_UNEXP_ERROR THEN
8642 RAISE OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
8643 ELSIF x_return_status = OKL_API.G_RET_STS_ERROR THEN
8644 RAISE OKL_API.G_EXCEPTION_ERROR;
8645 END IF;
8646
8647 l_stmv_rec := NULL;
8648 get_stream_header(p_purpose_code => NULL,
8649 p_khr_id => p_contract_id,
8650 p_kle_id => p_kle_id,
8651 p_sty_id => l_sty_id,
8652 x_stmv_rec => l_stmv_rec,
8653 x_return_status => x_return_status);
8654
8655 IF x_return_status = OKL_API.G_RET_STS_UNEXP_ERROR THEN
8656 RAISE OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
8657 ELSIF x_return_status = OKL_API.G_RET_STS_ERROR THEN
8658 RAISE OKL_API.G_EXCEPTION_ERROR;
8659 END IF;
8660
8661 l_selv_tbl(1).stream_element_date := ylds_rec.contract_start_date;
8662 l_selv_tbl(1).se_line_number := 1;
8663 l_start_date := ylds_rec.contract_start_date;
8664
8665 l_selv_tbl(1).amount := 0.0;
8666 print( l_api_name, ' khr_yld ' || to_char( l_khr_yld ) );
8667
8668 -- Fetch the day convention ..
8669 OKL_PRICING_UTILS_PVT.get_day_convention(
8670 p_id => p_contract_id,
8671 p_source => 'ISG',
8672 x_days_in_month => l_day_convention_month,
8673 x_days_in_year => l_day_convention_year,
8674 x_return_status => x_return_status);
8675 print( 'gen_pv_streams', 'Month / Year = ' || l_day_convention_month || '/' || l_day_convention_year );
8676 IF (x_return_status = G_RET_STS_UNEXP_ERROR) THEN
8677 RAISE OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
8678 ELSIF (x_return_status = G_RET_STS_ERROR) THEN
8679 RAISE OKL_API.G_EXCEPTION_ERROR;
8680 END IF;
8681
8682 FOR sec_strms_rec IN sec_strms_pend_csr
8683 LOOP
8684
8685 l_end_date := sec_strms_rec.stream_element_date;
8686
8687 l_days := OKL_PRICING_UTILS_PVT.get_day_count (p_start_date => l_start_date,
8688 p_days_in_month => l_day_convention_month,
8689 p_days_in_year => l_day_convention_year,
8690 p_end_date => l_end_date,
8691 p_arrears => 'N',
8692 x_return_status => x_return_status);
8693
8694 IF x_return_status = OKL_API.G_RET_STS_UNEXP_ERROR THEN
8695 RAISE OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
8696 ELSIF x_return_status = OKL_API.G_RET_STS_ERROR THEN
8697 RAISE OKL_API.G_EXCEPTION_ERROR;
8698 END IF;
8699
8700 l_selv_tbl(1).amount := l_selv_tbl(1).amount +
8701 sec_strms_rec.stream_ele_amount / POWER( 1 + (l_khr_yld/360), l_days );
8702
8703 print( l_api_name, ' amount ' || to_char( l_selv_tbl(1).amount ) );
8704 END LOOP;
8705 END IF;
8706 ELSE
8707 get_mapped_stream (p_sty_purpose => r_stm_name.name,
8708 p_mapping_type => 'PV_DISBURSEMENT',
8709 p_line_style => NULL,
8710 p_deal_type => 'LEASE',
8711 p_khr_id => p_agreement_id, --p_khr_id => p_contract_id,
8712 x_mapped_stream => l_mapped_sty_name,
8713 x_return_status => x_return_status);
8714
8715 IF x_return_status = OKL_API.G_RET_STS_UNEXP_ERROR THEN
8716 RAISE OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
8717 ELSIF x_return_status = OKL_API.G_RET_STS_ERROR THEN
8718 RAISE OKL_API.G_EXCEPTION_ERROR;
8719 END IF;
8720 If l_mapped_sty_name is NOT NULL THen
8721
8722 get_sty_details (p_sty_name => l_mapped_sty_name,
8723 x_sty_id => l_sty_id,
8724 x_sty_name => l_sty_name,
8725 x_return_status => x_return_status);
8726
8727 IF x_return_status = OKL_API.G_RET_STS_UNEXP_ERROR THEN
8728 RAISE OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
8729 ELSIF x_return_status = OKL_API.G_RET_STS_ERROR THEN
8730 RAISE OKL_API.G_EXCEPTION_ERROR;
8731 END IF;
8732
8733 l_stmv_rec := NULL;
8734 get_stream_header(p_purpose_code => NULL,
8735 p_khr_id => p_contract_id,
8736 p_kle_id => p_kle_id,
8737 p_sty_id => l_sty_id,
8738 x_stmv_rec => l_stmv_rec,
8739 x_return_status => x_return_status);
8740
8741 IF x_return_status = OKL_API.G_RET_STS_UNEXP_ERROR THEN
8742 RAISE OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
8743 ELSIF x_return_status = OKL_API.G_RET_STS_ERROR THEN
8744 RAISE OKL_API.G_EXCEPTION_ERROR;
8745 END IF;
8746
8747 l_selv_tbl(1).stream_element_date := ylds_rec.contract_start_date;
8748 l_selv_tbl(1).se_line_number := 1;
8749 l_start_date := ylds_rec.contract_start_date;
8750
8751 l_selv_tbl(1).amount := 0.0;
8752 print( l_api_name, ' khr_yld ' || to_char( l_khr_yld ) );
8753
8754 -- Fetch the day convention ..
8755 OKL_PRICING_UTILS_PVT.get_day_convention(
8756 p_id => p_contract_id,
8757 p_source => 'ISG',
8758 x_days_in_month => l_day_convention_month,
8759 x_days_in_year => l_day_convention_year,
8760 x_return_status => x_return_status);
8761 print( 'gen_pv_streams', 'Month / Year = ' || l_day_convention_month || '/' || l_day_convention_year );
8762 IF (x_return_status = G_RET_STS_UNEXP_ERROR) THEN
8763 RAISE OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
8764 ELSIF (x_return_status = G_RET_STS_ERROR) THEN
8765 RAISE OKL_API.G_EXCEPTION_ERROR;
8766 END IF;
8767
8768 FOR sec_strms_rec IN sec_strms_pend_csr
8769 LOOP
8770
8771 l_end_date := sec_strms_rec.stream_element_date;
8772
8773 l_days := OKL_PRICING_UTILS_PVT.get_day_count (p_start_date => l_start_date,
8774 p_days_in_month => l_day_convention_month,
8775 p_days_in_year => l_day_convention_year,
8776 p_end_date => l_end_date,
8777 p_arrears => 'N',
8778 x_return_status => x_return_status);
8779
8780 IF x_return_status = OKL_API.G_RET_STS_UNEXP_ERROR THEN
8781 RAISE OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
8782 ELSIF x_return_status = OKL_API.G_RET_STS_ERROR THEN
8783 RAISE OKL_API.G_EXCEPTION_ERROR;
8784 END IF;
8785
8786 l_selv_tbl(1).amount := l_selv_tbl(1).amount +
8787 sec_strms_rec.stream_ele_amount / POWER( 1 + (l_khr_yld/360), l_days );
8788
8789 print( l_api_name, ' amount ' || to_char( l_selv_tbl(1).amount ) );
8790 END LOOP;
8791 END IF;
8792 END IF;
8793 x_stmv_rec := l_stmv_rec;
8794 x_selv_tbl := l_selv_tbl;
8795
8796 END IF;
8797
8798 print( l_api_name, 'end' );
8799 OKL_API.END_ACTIVITY(x_msg_count => x_msg_count, x_msg_data => x_msg_data);
8800
8801 Exception
8802
8803 when OKL_API.G_EXCEPTION_ERROR then
8804 x_return_status := OKL_API.HANDLE_EXCEPTIONS(
8805 p_api_name => l_api_name,
8806 p_pkg_name => g_pkg_name,
8807 p_exc_name => 'OKL_API.G_RET_STS_ERROR',
8808 x_msg_count => x_msg_count,
8809 x_msg_data => x_msg_data,
8810 p_api_type => g_api_type);
8811
8812 when OKL_API.G_EXCEPTION_UNEXPECTED_ERROR then
8813 x_return_status := OKL_API.HANDLE_EXCEPTIONS(
8814 p_api_name => l_api_name,
8815 p_pkg_name => g_pkg_name,
8816 p_exc_name => 'OKL_API.G_RET_STS_UNEXP_ERROR',
8817 x_msg_count => x_msg_count,
8818 x_msg_data => x_msg_data,
8819 p_api_type => g_api_type);
8820
8821 when OTHERS then
8822 x_return_status := OKL_API.HANDLE_EXCEPTIONS(
8823 p_api_name => l_api_name,
8824 p_pkg_name => g_pkg_name,
8825 p_exc_name => 'OTHERS',
8826 x_msg_count => x_msg_count,
8827 x_msg_data => x_msg_data,
8828 p_api_type => g_api_type);
8829
8830 END gen_pv_streams;
8831
8832 PROCEDURE gen_disb_streams(p_api_version IN NUMBER,
8833 p_init_msg_list IN VARCHAR2,
8834 p_pool_status IN VARCHAR2,
8835 p_agreement_id IN NUMBER,
8836 p_contract_id IN NUMBER,
8837 p_kle_id IN NUMBER,
8838 p_sty_id IN NUMBER,
8839 --sosharma added, bug 6691554
8840 p_mode IN VARCHAR2,
8841 x_stmv_rec OUT NOCOPY okl_streams_pub.stmv_rec_type,
8842 x_selv_tbl OUT NOCOPY okl_streams_pub.selv_tbl_type,
8843 x_return_status OUT NOCOPY VARCHAR2,
8844 x_msg_count OUT NOCOPY NUMBER,
8845 x_msg_data OUT NOCOPY VARCHAR2) IS
8846
8847
8848 l_api_name CONSTANT VARCHAR2(61) := 'gen_disb_streams';
8849
8850 Cursor sec_strms_csr IS
8851 select pol.khr_id agreement_id,
8852 pcn.khr_id contract_id,
8853 pcn.kle_id asset_id,
8854 pcn.sty_id stream_type_id,
8855 pcn.streams_from_date,
8856 pcn.streams_to_date,
8857 ele.STREAM_ELEMENT_DATE,
8858 ele.se_line_number,
8859 ele.id stream_ele_id,
8860 ele.amount stream_ele_amount,
8861 sty.name stream_name,
8862 stm.id stm_id
8863 from okl_pools pol,
8864 okl_pool_contents pcn,
8865 okl_strm_type_v sty,
8866 okl_streams stm,
8867 okl_strm_elements ele
8868 where pcn.sty_id = sty.id
8869 and pcn.pol_id = pol.id
8870 and stm.kle_id = pcn.kle_id
8871 and stm.khr_id = pcn.khr_id
8872 and stm.sty_id = pcn.sty_id
8873 and pcn.status_code IN (G_IA_STS_ACTIVE,G_IA_STS_NEW)
8874 and stm.say_code = 'CURR'
8875 and stm.active_yn = 'Y'
8876 and ele.stm_id = stm.id
8877 and pol.khr_id = p_agreement_id
8878 and stm.khr_id = p_contract_id
8879 and stm.kle_id = p_kle_id
8880 and stm.sty_id = p_sty_id
8881 and pol.status_code = p_pool_status
8882 and ele.stream_element_date >= nvl(pcn.streams_from_date, ele.stream_element_date-1)
8883 and ele.stream_element_date <= nvl(pcn.STREAMS_TO_DATE, OKL_POOL_PVT.G_FINAL_DATE)
8884 order by ele.stream_element_date,pcn.khr_id, pcn.kle_id, pcn.sty_id;
8885
8886 sec_strms_rec sec_strms_csr%ROWTYPE;
8887
8888 Cursor ylds_csr( agmntID NUMBER, khrId NUMBER) IS
8889 select pol.khr_id agreement_id,
8890 pcn.khr_id contract_id,
8891 nvl(pkhr.after_tax_yield, -1) agmnt_yield,
8892 pkhr.contract_number agreement_number,
8893 nvl(khr.PRE_TAX_IRR, -1) contract_yield
8894 from okl_pools pol,
8895 okl_pool_contents pcn,
8896 okl_K_headers_full_v pkhr,
8897 okl_k_headers khr
8898 where pcn.pol_id = pol.id
8899 and pcn.khr_id = khr.id
8900 and pol.khr_id = pkhr.id
8901 and pol.khr_id = agmntID
8902 and pcn.khr_id = khrId
8903 AND pcn.status_code IN (G_IA_STS_ACTIVE,G_IA_STS_NEW) ; -- Added by VARANGAN -Pool Contents Impact - 26/11/07
8904
8905 ylds_rec ylds_csr%ROWTYPE;
8906
8907 /* sosharma, 14-12-2007
8908 Added Cursors for handling pending status for pool contents
8909 Start changes
8910 */
8911
8912 Cursor sec_strms_pend_csr IS
8913 select pol.khr_id agreement_id,
8914 pcn.khr_id contract_id,
8915 pcn.kle_id asset_id,
8916 pcn.sty_id stream_type_id,
8917 pcn.streams_from_date,
8918 pcn.streams_to_date,
8919 ele.STREAM_ELEMENT_DATE,
8920 ele.se_line_number,
8921 ele.id stream_ele_id,
8922 ele.amount stream_ele_amount,
8923 sty.name stream_name,
8924 stm.id stm_id
8925 from okl_pools pol,
8926 okl_pool_contents pcn,
8927 okl_strm_type_v sty,
8928 okl_streams stm,
8929 okl_strm_elements ele
8930 where pcn.sty_id = sty.id
8931 and pcn.pol_id = pol.id
8932 and stm.kle_id = pcn.kle_id
8933 and stm.khr_id = pcn.khr_id
8934 and stm.sty_id = pcn.sty_id
8935 and pcn.status_code IN (G_PC_STS_PENDING)
8936 and stm.say_code = 'CURR'
8937 and stm.active_yn = 'Y'
8938 and ele.stm_id = stm.id
8939 and pol.khr_id = p_agreement_id
8940 and stm.khr_id = p_contract_id
8941 and stm.kle_id = p_kle_id
8942 and stm.sty_id = p_sty_id
8943 and pol.status_code = p_pool_status
8944 and ele.stream_element_date >= nvl(pcn.streams_from_date, ele.stream_element_date-1)
8945 and ele.stream_element_date <= nvl(pcn.STREAMS_TO_DATE, OKL_POOL_PVT.G_FINAL_DATE)
8946 order by ele.stream_element_date,pcn.khr_id, pcn.kle_id, pcn.sty_id;
8947
8948
8949 Cursor ylds_pend_csr( agmntID NUMBER, khrId NUMBER) IS
8950 select pol.khr_id agreement_id,
8951 pcn.khr_id contract_id,
8952 nvl(pkhr.after_tax_yield, -1) agmnt_yield,
8953 pkhr.contract_number agreement_number,
8954 nvl(khr.PRE_TAX_IRR, -1) contract_yield
8955 from okl_pools pol,
8956 okl_pool_contents pcn,
8957 okl_K_headers_full_v pkhr,
8958 okl_k_headers khr
8959 where pcn.pol_id = pol.id
8960 and pcn.khr_id = khr.id
8961 and pol.khr_id = pkhr.id
8962 and pol.khr_id = agmntID
8963 and pcn.khr_id = khrId
8964 and pcn.status_code IN (G_PC_STS_PENDING) ;
8965
8966 /* Sosharma End changes*/
8967
8968 l_agt_yld NUMBER;
8969 l_khr_yld NUMBER;
8970
8971 l_sty_id NUMBER;
8972 l_sty_name VARCHAR2(150);
8973 l_mapped_sty_name VARCHAR2(150);
8974
8975 l_selv_tbl okl_streams_pub.selv_tbl_type;
8976 l_stmv_tbl okl_streams_pub.stmv_tbl_type;
8977 x_stmv_tbl okl_streams_pub.stmv_tbl_type;
8978 lx_selv_tbl okl_streams_pub.selv_tbl_type;
8979
8980 l_stmv_rec okl_streams_pub.stmv_rec_type;
8981 lx_stmv_rec okl_streams_pub.stmv_rec_type;
8982
8983 cursor l_hdrrl_csr IS
8984 select crl.RULE_INFORMATION1 method
8985 from OKC_RULE_GROUPS_B crg,
8986 OKC_RULES_B crl
8987 where crl.rgp_id = crg.id
8988 and crg.RGD_CODE = 'LASEIR'
8989 and crl.RULE_INFORMATION_CATEGORY = 'LASEIR'
8990 and crg.dnz_chr_id = p_agreement_id;
8991
8992 l_hdrrl_rec l_hdrrl_csr%ROWTYPE;
8993
8994 Cursor c_stm_name IS
8995 Select sty.stream_type_subclass name,
8996 sty.stream_type_purpose stream_type_purpose
8997 from okl_strm_type_tl tl,
8998 okl_strm_type_v sty
8999 where tl.language = 'US'
9000 and sty.id = tl.id
9001 and tl.id = p_sty_id;
9002
9003 r_stm_name c_stm_name%ROWTYPE;
9004
9005 i NUMBER;
9006 n NUMBER;
9007
9008 l_rentsty_id NUMBER;
9009 l_rvsty_id NUMBER;
9010 l_rentsty_name VARCHAR2(256);
9011 l_rvsty_name VARCHAR2(256);
9012
9013 BEGIN
9014
9015 print( l_api_name, 'begin' );
9016
9017 x_return_status := OKL_API.G_RET_STS_SUCCESS;
9018
9019 x_return_status := OKL_API.START_ACTIVITY(
9020 p_api_name => l_api_name,
9021 p_pkg_name => g_pkg_name,
9022 p_init_msg_list => p_init_msg_list,
9023 l_api_version => p_api_version,
9024 p_api_version => p_api_version,
9025 p_api_type => G_API_TYPE,
9026 x_return_status => x_return_status);
9027
9028 -- check if activity started successfully
9029 If (x_return_status = OKL_API.G_RET_STS_UNEXP_ERROR) then
9030 raise OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
9031 ElSIF (x_return_status = OKL_API.G_RET_STS_ERROR) then
9032 raise OKL_API.G_EXCEPTION_ERROR;
9033 End If;
9034
9035 OPEN l_hdrrl_csr;
9036 FETCH l_hdrrl_csr INTO l_hdrrl_rec;
9037 CLOSE l_hdrrl_csr;
9038 print( l_api_name, ' method ' || l_hdrrl_rec.method );
9039
9040 /* sosharma ,14-12-2007
9041 Bug 6691554
9042 Start Changes*/
9043
9044 --Based on the p_mode passed to the procedure two flows have been defined
9045 IF p_mode IS NULL THEN
9046 --(1) When Streams are getting generated on activation of Investor Agreement/Changes in contract
9047 OPEN sec_strms_csr;
9048 FETCH sec_strms_csr INTO sec_strms_rec;
9049 CLOSE sec_strms_csr;
9050
9051
9052 If ( l_hdrrl_rec.method = 'YIELD' ) Then
9053
9054 OPEN ylds_csr( p_agreement_id, sec_strms_rec.contract_id );
9055 FETCH ylds_csr INTO ylds_rec;
9056 CLOSE ylds_csr;
9057
9058 If (( ylds_rec.agmnt_yield = -1 ) OR (ylds_rec.contract_yield = -1 )) Then
9059
9060 OKL_API.SET_MESSAGE(p_app_name => G_APP_NAME,
9061 p_msg_name => 'OKL_AGMNT_NOYLD',
9062 p_token1 => 'AGMNT',
9063 p_token1_value => ylds_rec.agreement_number);
9064
9065 RAISE OKL_API.G_EXCEPTION_ERROR;
9066
9067 End If;
9068
9069 l_agt_yld := ylds_rec.agmnt_yield/100.0;
9070 l_khr_yld := ylds_rec.contract_yield/100.0;
9071
9072 ElsIf ( nvl(l_hdrrl_rec.method, 'XYZ') = 'XYZ' ) Then
9073
9074 OKL_API.SET_MESSAGE(p_app_name => G_APP_NAME,
9075 p_msg_name => 'OKL_INVALID_METHOD',
9076 p_token1 => 'AGMNT',
9077 p_token1_value => ylds_rec.agreement_number);
9078
9079 RAISE OKL_API.G_EXCEPTION_ERROR;
9080
9081 End If;
9082
9083 OPEN c_stm_name;
9084 FETCH c_stm_name INTO r_stm_name;
9085 CLOSE c_stm_name;
9086 IF r_stm_name.name = 'LOAN_PAYMENT' THEN
9087 get_mapped_stream (p_sty_purpose => r_stm_name.name,
9088 p_mapping_type => 'DISBURSEMENT',
9089 p_line_style => NULL,
9090 p_deal_type => 'LOAN',
9091 p_khr_id => p_agreement_id,
9092 p_stream_type_purpose => r_stm_name.stream_type_purpose,
9093 x_mapped_stream => l_mapped_sty_name,
9094 x_return_status => x_return_status);
9095
9096 IF x_return_status = OKL_API.G_RET_STS_UNEXP_ERROR THEN
9097 RAISE OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
9098 ELSIF x_return_status = OKL_API.G_RET_STS_ERROR THEN
9099 RAISE OKL_API.G_EXCEPTION_ERROR;
9100 END IF;
9101 If l_mapped_sty_name IS NOT NULL Then
9102
9103 get_sty_details (p_sty_name => l_mapped_sty_name,
9104 x_sty_id => l_sty_id,
9105 x_sty_name => l_sty_name,
9106 x_return_status => x_return_status);
9107
9108 IF x_return_status = OKL_API.G_RET_STS_UNEXP_ERROR THEN
9109 RAISE OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
9110 ELSIF x_return_status = OKL_API.G_RET_STS_ERROR THEN
9111 RAISE OKL_API.G_EXCEPTION_ERROR;
9112 END IF;
9113
9114 l_stmv_rec := NULL;
9115 get_stream_header(p_purpose_code => NULL,
9116 p_khr_id => p_contract_id,
9117 p_kle_id => p_kle_id,
9118 p_sty_id => l_sty_id,
9119 x_stmv_rec => l_stmv_rec,
9120 x_return_status => x_return_status);
9121
9122 IF x_return_status = OKL_API.G_RET_STS_UNEXP_ERROR THEN
9123 RAISE OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
9124 ELSIF x_return_status = OKL_API.G_RET_STS_ERROR THEN
9125 RAISE OKL_API.G_EXCEPTION_ERROR;
9126 END IF;
9127
9128 FOR sec_strms_rec IN sec_strms_csr
9129 LOOP
9130
9131 i := l_selv_tbl.COUNT + 1;
9132 l_selv_tbl(i).se_line_number := i;
9133 l_selv_tbl(i).sel_id := sec_strms_rec.stream_ele_id;
9134
9135 l_selv_tbl(i).stream_element_date := sec_strms_rec.stream_element_date;
9136 If ( l_hdrrl_rec.method = 'CASH_FLOW' ) Then
9137 l_selv_tbl(i).amount := sec_strms_rec.stream_ele_amount;
9138 Elsif ( l_hdrrl_rec.method = 'YIELD' ) Then
9139 l_selv_tbl(i).amount := sec_strms_rec.stream_ele_amount *
9140 POWER(( 1+l_agt_yld )/(1+l_khr_yld), i);
9141 ENd If;
9142 l_stmv_rec.stm_id := sec_strms_rec.stm_id;
9143
9144 END LOOP;
9145
9146 x_stmv_rec := l_stmv_rec;
9147 x_selv_tbl := l_selv_tbl;
9148
9149 End If;
9150
9151 ELSE
9152 get_mapped_stream (p_sty_purpose => r_stm_name.name,
9153 p_mapping_type => 'DISBURSEMENT',
9154 p_line_style => NULL,
9155 p_deal_type => 'LEASE',
9156 p_khr_id => p_agreement_id,
9157 x_mapped_stream => l_mapped_sty_name,
9158 x_return_status => x_return_status);
9159
9160 IF x_return_status = OKL_API.G_RET_STS_UNEXP_ERROR THEN
9161 RAISE OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
9162 ELSIF x_return_status = OKL_API.G_RET_STS_ERROR THEN
9163 RAISE OKL_API.G_EXCEPTION_ERROR;
9164 END IF;
9165 If l_mapped_sty_name IS NOT NULL Then
9166
9167 get_sty_details (p_sty_name => l_mapped_sty_name,
9168 x_sty_id => l_sty_id,
9169 x_sty_name => l_sty_name,
9170 x_return_status => x_return_status);
9171
9172 IF x_return_status = OKL_API.G_RET_STS_UNEXP_ERROR THEN
9173 RAISE OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
9174 ELSIF x_return_status = OKL_API.G_RET_STS_ERROR THEN
9175 RAISE OKL_API.G_EXCEPTION_ERROR;
9176 END IF;
9177
9178 l_stmv_rec := NULL;
9179 get_stream_header(p_purpose_code => NULL,
9180 p_khr_id => p_contract_id,
9181 p_kle_id => p_kle_id,
9182 p_sty_id => l_sty_id,
9183 x_stmv_rec => l_stmv_rec,
9184 x_return_status => x_return_status);
9185
9186 IF x_return_status = OKL_API.G_RET_STS_UNEXP_ERROR THEN
9187 RAISE OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
9188 ELSIF x_return_status = OKL_API.G_RET_STS_ERROR THEN
9189 RAISE OKL_API.G_EXCEPTION_ERROR;
9190 END IF;
9191
9192 FOR sec_strms_rec IN sec_strms_csr
9193 LOOP
9194
9195 i := l_selv_tbl.COUNT + 1;
9196 l_selv_tbl(i).se_line_number := i;
9197 l_selv_tbl(i).sel_id := sec_strms_rec.stream_ele_id;
9198
9199 l_selv_tbl(i).stream_element_date := sec_strms_rec.stream_element_date;
9200 If ( l_hdrrl_rec.method = 'CASH_FLOW' ) Then
9201 l_selv_tbl(i).amount := sec_strms_rec.stream_ele_amount;
9202 Elsif ( l_hdrrl_rec.method = 'YIELD' ) Then
9203 l_selv_tbl(i).amount := sec_strms_rec.stream_ele_amount *
9204 POWER(( 1+l_agt_yld )/(1+l_khr_yld), i);
9205 ENd If;
9206 l_stmv_rec.stm_id := sec_strms_rec.stm_id;
9207
9208 END LOOP;
9209
9210 x_stmv_rec := l_stmv_rec;
9211 x_selv_tbl := l_selv_tbl;
9212
9213 End If;
9214
9215 END IF;
9216
9217 ELSE
9218
9219 OPEN sec_strms_pend_csr;
9220 FETCH sec_strms_pend_csr INTO sec_strms_rec;
9221 CLOSE sec_strms_pend_csr;
9222
9223
9224 If ( l_hdrrl_rec.method = 'YIELD' ) Then
9225
9226 OPEN ylds_pend_csr( p_agreement_id, sec_strms_rec.contract_id );
9227 FETCH ylds_pend_csr INTO ylds_rec;
9228 CLOSE ylds_pend_csr;
9229
9230 If (( ylds_rec.agmnt_yield = -1 ) OR (ylds_rec.contract_yield = -1 )) Then
9231
9232 OKL_API.SET_MESSAGE(p_app_name => G_APP_NAME,
9233 p_msg_name => 'OKL_AGMNT_NOYLD',
9234 p_token1 => 'AGMNT',
9235 p_token1_value => ylds_rec.agreement_number);
9236
9237 RAISE OKL_API.G_EXCEPTION_ERROR;
9238
9239 End If;
9240
9241 l_agt_yld := ylds_rec.agmnt_yield/100.0;
9242 l_khr_yld := ylds_rec.contract_yield/100.0;
9243
9244 ElsIf ( nvl(l_hdrrl_rec.method, 'XYZ') = 'XYZ' ) Then
9245
9246 OKL_API.SET_MESSAGE(p_app_name => G_APP_NAME,
9247 p_msg_name => 'OKL_INVALID_METHOD',
9248 p_token1 => 'AGMNT',
9249 p_token1_value => ylds_rec.agreement_number);
9250
9251 RAISE OKL_API.G_EXCEPTION_ERROR;
9252
9253 End If;
9254
9255 OPEN c_stm_name;
9256 FETCH c_stm_name INTO r_stm_name;
9257 CLOSE c_stm_name;
9258 IF r_stm_name.name = 'LOAN_PAYMENT' THEN
9259 get_mapped_stream (p_sty_purpose => r_stm_name.name,
9260 p_mapping_type => 'DISBURSEMENT',
9261 p_line_style => NULL,
9262 p_deal_type => 'LOAN',
9263 p_khr_id => p_agreement_id,
9264 p_stream_type_purpose => r_stm_name.stream_type_purpose,
9265 x_mapped_stream => l_mapped_sty_name,
9266 x_return_status => x_return_status);
9267
9268 IF x_return_status = OKL_API.G_RET_STS_UNEXP_ERROR THEN
9269 RAISE OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
9270 ELSIF x_return_status = OKL_API.G_RET_STS_ERROR THEN
9271 RAISE OKL_API.G_EXCEPTION_ERROR;
9272 END IF;
9273 If l_mapped_sty_name IS NOT NULL Then
9274
9275 get_sty_details (p_sty_name => l_mapped_sty_name,
9276 x_sty_id => l_sty_id,
9277 x_sty_name => l_sty_name,
9278 x_return_status => x_return_status);
9279
9280 IF x_return_status = OKL_API.G_RET_STS_UNEXP_ERROR THEN
9281 RAISE OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
9282 ELSIF x_return_status = OKL_API.G_RET_STS_ERROR THEN
9283 RAISE OKL_API.G_EXCEPTION_ERROR;
9284 END IF;
9285
9286 l_stmv_rec := NULL;
9287 get_stream_header(p_purpose_code => NULL,
9288 p_khr_id => p_contract_id,
9289 p_kle_id => p_kle_id,
9290 p_sty_id => l_sty_id,
9291 x_stmv_rec => l_stmv_rec,
9292 x_return_status => x_return_status);
9293
9294 IF x_return_status = OKL_API.G_RET_STS_UNEXP_ERROR THEN
9295 RAISE OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
9296 ELSIF x_return_status = OKL_API.G_RET_STS_ERROR THEN
9297 RAISE OKL_API.G_EXCEPTION_ERROR;
9298 END IF;
9299
9300 FOR sec_strms_rec IN sec_strms_pend_csr
9301 LOOP
9302
9303 i := l_selv_tbl.COUNT + 1;
9304 l_selv_tbl(i).se_line_number := i;
9305 l_selv_tbl(i).sel_id := sec_strms_rec.stream_ele_id;
9306
9307 l_selv_tbl(i).stream_element_date := sec_strms_rec.stream_element_date;
9308 If ( l_hdrrl_rec.method = 'CASH_FLOW' ) Then
9309 l_selv_tbl(i).amount := sec_strms_rec.stream_ele_amount;
9310 Elsif ( l_hdrrl_rec.method = 'YIELD' ) Then
9311 l_selv_tbl(i).amount := sec_strms_rec.stream_ele_amount *
9312 POWER(( 1+l_agt_yld )/(1+l_khr_yld), i);
9313 End If;
9314 l_stmv_rec.stm_id := sec_strms_rec.stm_id;
9315
9316 END LOOP;
9317
9318 x_stmv_rec := l_stmv_rec;
9319 x_selv_tbl := l_selv_tbl;
9320
9321 End If;
9322 ELSE
9323 get_mapped_stream (p_sty_purpose => r_stm_name.name,
9324 p_mapping_type => 'DISBURSEMENT',
9325 p_line_style => NULL,
9326 p_deal_type => 'LEASE',
9327 p_khr_id => p_agreement_id,
9328 x_mapped_stream => l_mapped_sty_name,
9329 x_return_status => x_return_status);
9330
9331 IF x_return_status = OKL_API.G_RET_STS_UNEXP_ERROR THEN
9332 RAISE OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
9333 ELSIF x_return_status = OKL_API.G_RET_STS_ERROR THEN
9334 RAISE OKL_API.G_EXCEPTION_ERROR;
9335 END IF;
9336 If l_mapped_sty_name IS NOT NULL Then
9337
9338 get_sty_details (p_sty_name => l_mapped_sty_name,
9339 x_sty_id => l_sty_id,
9340 x_sty_name => l_sty_name,
9341 x_return_status => x_return_status);
9342
9343 IF x_return_status = OKL_API.G_RET_STS_UNEXP_ERROR THEN
9344 RAISE OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
9345 ELSIF x_return_status = OKL_API.G_RET_STS_ERROR THEN
9346 RAISE OKL_API.G_EXCEPTION_ERROR;
9347 END IF;
9348
9349 l_stmv_rec := NULL;
9350 get_stream_header(p_purpose_code => NULL,
9351 p_khr_id => p_contract_id,
9352 p_kle_id => p_kle_id,
9353 p_sty_id => l_sty_id,
9354 x_stmv_rec => l_stmv_rec,
9355 x_return_status => x_return_status);
9356
9357 IF x_return_status = OKL_API.G_RET_STS_UNEXP_ERROR THEN
9358 RAISE OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
9359 ELSIF x_return_status = OKL_API.G_RET_STS_ERROR THEN
9360 RAISE OKL_API.G_EXCEPTION_ERROR;
9361 END IF;
9362
9363 FOR sec_strms_rec IN sec_strms_pend_csr
9364 LOOP
9365
9366 i := l_selv_tbl.COUNT + 1;
9367 l_selv_tbl(i).se_line_number := i;
9368 l_selv_tbl(i).sel_id := sec_strms_rec.stream_ele_id;
9369
9370 l_selv_tbl(i).stream_element_date := sec_strms_rec.stream_element_date;
9371 If ( l_hdrrl_rec.method = 'CASH_FLOW' ) Then
9372 l_selv_tbl(i).amount := sec_strms_rec.stream_ele_amount;
9373 Elsif ( l_hdrrl_rec.method = 'YIELD' ) Then
9374 l_selv_tbl(i).amount := sec_strms_rec.stream_ele_amount *
9375 POWER(( 1+l_agt_yld )/(1+l_khr_yld), i);
9376 End If;
9377 l_stmv_rec.stm_id := sec_strms_rec.stm_id;
9378
9379 END LOOP;
9380
9381 x_stmv_rec := l_stmv_rec;
9382 x_selv_tbl := l_selv_tbl;
9383
9384 End If;
9385 END IF;
9386 END IF;
9387 /* sosharma End Changes*/
9388
9389 print( l_api_name, 'end' );
9390 OKL_API.END_ACTIVITY(x_msg_count => x_msg_count, x_msg_data => x_msg_data);
9391
9392 Exception
9393
9394 when OKL_API.G_EXCEPTION_ERROR then
9395 x_return_status := OKL_API.HANDLE_EXCEPTIONS(
9396 p_api_name => l_api_name,
9397 p_pkg_name => g_pkg_name,
9398 p_exc_name => 'OKL_API.G_RET_STS_ERROR',
9399 x_msg_count => x_msg_count,
9400 x_msg_data => x_msg_data,
9401 p_api_type => g_api_type);
9402
9403 when OKL_API.G_EXCEPTION_UNEXPECTED_ERROR then
9404 x_return_status := OKL_API.HANDLE_EXCEPTIONS(
9405 p_api_name => l_api_name,
9406 p_pkg_name => g_pkg_name,
9407 p_exc_name => 'OKL_API.G_RET_STS_UNEXP_ERROR',
9408 x_msg_count => x_msg_count,
9409 x_msg_data => x_msg_data,
9410 p_api_type => g_api_type);
9411
9412 when OTHERS then
9413 x_return_status := OKL_API.HANDLE_EXCEPTIONS(
9414 p_api_name => l_api_name,
9415 p_pkg_name => g_pkg_name,
9416 p_exc_name => 'OTHERS',
9417 x_msg_count => x_msg_count,
9418 x_msg_data => x_msg_data,
9419 p_api_type => g_api_type);
9420
9421 END gen_disb_streams;
9422
9423
9424 PROCEDURE gen_pv_disb_streams(p_api_version IN NUMBER,
9425 p_init_msg_list IN VARCHAR2,
9426 p_contract_id IN NUMBER,
9427 p_agreement_id IN NUMBER,
9428 p_pool_status IN VARCHAR2,
9429 p_mode IN VARCHAR2 DEFAULT NULL,
9430 x_return_status OUT NOCOPY VARCHAR2,
9431 x_msg_count OUT NOCOPY NUMBER,
9432 x_msg_data OUT NOCOPY VARCHAR2) IS
9433
9434
9435 l_api_name CONSTANT VARCHAR2(61) := 'gen_pv_disb_streams';
9436
9437 Cursor l_strms_csr ( khrId NUMBER, kleId NUMBER, strmname VARCHAR2) IS
9438 select stm.id strm_id
9439 from okl_strm_type_v sty,
9440 okl_strm_type_tl stl,
9441 okl_streams stm
9442 where stl.language = 'US'
9443 and stl.name = strmname
9444 and sty.id = stl.id
9445 and stm.sty_id = sty.id
9446 and stm.kle_id = kleId
9447 and stm.khr_id = khrId
9448 and stm.say_code = 'CURR';
9449
9450 l_strms_rec l_strms_csr%ROWTYPE;
9451
9452 Cursor sec_strms_csr ( poolstat VARCHAR2 ) IS
9453 select pol.khr_id agreement_id,
9454 pcn.khr_id contract_id,
9455 pcn.kle_id asset_id,
9456 pcn.sty_id stream_type_id,
9457 sty.stream_type_subclass stream_type_subclass,
9458 sty.stream_type_purpose stream_type_purpose
9459 from okl_pools pol,
9460 okl_pool_contents pcn,
9461 okl_strm_type_v sty,
9462 okl_streams stm
9463 where pcn.sty_id = sty.id
9464 and pcn.pol_id = pol.id
9465 and stm.kle_id = pcn.kle_id
9466 and stm.khr_id = pcn.khr_id
9467 and stm.sty_id = pcn.sty_id
9468 and stm.say_code = 'CURR'
9469 and stm.active_yn = 'Y'
9470 and pol.status_code = poolstat
9471 and nvl(stm.khr_id, 0) = nvl(p_contract_id, -1)
9472 and pcn.status_code IN (G_IA_STS_NEW,G_IA_STS_ACTIVE)
9473 Union
9474 select pol.khr_id agreement_id,
9475 pcn.khr_id contract_id,
9476 pcn.kle_id asset_id,
9477 pcn.sty_id stream_type_id,
9478 sty.stream_type_subclass stream_type_subclass,
9479 sty.stream_type_purpose stream_type_purpose
9480 from okl_pools pol,
9481 okl_pool_contents pcn,
9482 okl_strm_type_v sty,
9483 okl_streams stm
9484 where pcn.sty_id = sty.id
9485 and pcn.pol_id = pol.id
9486 and stm.kle_id = pcn.kle_id
9487 and stm.khr_id = pcn.khr_id
9488 and stm.sty_id = pcn.sty_id
9489 and stm.say_code = 'CURR'
9490 and stm.active_yn = 'Y'
9491 and pol.status_code = poolstat
9492 and nvl(pol.khr_id, 0) = nvl(p_agreement_id, -1)
9493 and pcn.status_code IN (G_IA_STS_NEW,G_IA_STS_ACTIVE)
9494 order by agreement_id, contract_id, asset_id, stream_type_id;
9495
9496 /* sosharma ,14-12-2007
9497 Bug 6691554
9498 Start Changes*/
9499
9500 Cursor sec_strms_pend_csr ( poolstat VARCHAR2 ) IS
9501 select pol.khr_id agreement_id,
9502 pcn.khr_id contract_id,
9503 pcn.kle_id asset_id,
9504 pcn.sty_id stream_type_id,
9505 sty.stream_type_subclass stream_type_subclass,
9506 sty.stream_type_purpose stream_type_purpose
9507 from okl_pools pol,
9508 okl_pool_contents pcn,
9509 okl_strm_type_v sty,
9510 okl_streams stm
9511 where pcn.sty_id = sty.id
9512 and pcn.pol_id = pol.id
9513 and stm.kle_id = pcn.kle_id
9514 and stm.khr_id = pcn.khr_id
9515 and stm.sty_id = pcn.sty_id
9516 and stm.say_code = 'CURR'
9517 and stm.active_yn = 'Y'
9518 and pol.status_code = poolstat
9519 and nvl(stm.khr_id, 0) = nvl(p_contract_id, -1)
9520 and pcn.status_code=G_PC_STS_PENDING
9521 Union
9522 select pol.khr_id agreement_id,
9523 pcn.khr_id contract_id,
9524 pcn.kle_id asset_id,
9525 pcn.sty_id stream_type_id,
9526 sty.stream_type_subclass stream_type_subclass,
9527 sty.stream_type_purpose stream_type_purpose
9528 from okl_pools pol,
9529 okl_pool_contents pcn,
9530 okl_strm_type_v sty,
9531 okl_streams stm
9532 where pcn.sty_id = sty.id
9533 and pcn.pol_id = pol.id
9534 and stm.kle_id = pcn.kle_id
9535 and stm.khr_id = pcn.khr_id
9536 and stm.sty_id = pcn.sty_id
9537 and stm.say_code = 'CURR'
9538 and stm.active_yn = 'Y'
9539 and pol.status_code = poolstat
9540 and nvl(pol.khr_id, 0) = nvl(p_agreement_id, -1)
9541 and pcn.status_code=G_PC_STS_PENDING
9542 order by agreement_id, contract_id, asset_id, stream_type_id;
9543
9544 /* sosharma End Changes*/
9545 sec_strms_rec sec_strms_csr%ROWTYPE;
9546
9547 l_sty_id NUMBER;
9548
9549 l_selv_tbl okl_streams_pub.selv_tbl_type;
9550 l_stmv_tbl okl_streams_pub.stmv_tbl_type;
9551 x_stmv_tbl okl_streams_pub.stmv_tbl_type;
9552 lx_selv_tbl okl_streams_pub.selv_tbl_type;
9553
9554 l_stmv_rec okl_streams_pub.stmv_rec_type;
9555 lx_stmv_rec okl_streams_pub.stmv_rec_type;
9556
9557 i NUMBER;
9558 n NUMBER;
9559
9560 l_sty_id NUMBER;
9561 l_sty_name VARCHAR2(256);
9562
9563 l_pool_status VARCHAR2(256);
9564 l_mapped_sty_name VARCHAR2(150);
9565
9566 BEGIN
9567
9568 print( l_api_name, 'begin' );
9569
9570 x_return_status := OKL_API.G_RET_STS_SUCCESS;
9571
9572 x_return_status := OKL_API.START_ACTIVITY(
9573 p_api_name => l_api_name,
9574 p_pkg_name => g_pkg_name,
9575 p_init_msg_list => p_init_msg_list,
9576 l_api_version => p_api_version,
9577 p_api_version => p_api_version,
9578 p_api_type => G_API_TYPE,
9579 x_return_status => x_return_status);
9580
9581 -- check if activity started successfully
9582 If (x_return_status = OKL_API.G_RET_STS_UNEXP_ERROR) then
9583 raise OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
9584 ElSIF (x_return_status = OKL_API.G_RET_STS_ERROR) then
9585 raise OKL_API.G_EXCEPTION_ERROR;
9586 End If;
9587
9588 print( l_api_name, 'save point' );
9589
9590 If ( nvl(p_pool_status, 'XXX') = 'XXX' ) AND ( nvl(p_agreement_id, -1) <> -1 ) Then
9591 l_pool_status := 'NEW';
9592 ELsif( nvl(p_pool_status, 'XXX') = 'XXX' ) AND ( nvl(p_contract_id, -1) <> -1) Then
9593 l_pool_status := 'ACTIVE';
9594 Else
9595 l_pool_status := p_pool_status;
9596 End If;
9597
9598 print( l_api_name, 'pool stat' || l_pool_status );
9599
9600 IF p_mode IS NULL THEN
9601 FOR sec_strms_rec IN sec_strms_csr( l_pool_status )
9602 LOOP
9603 IF sec_strms_rec.stream_type_subclass = 'LOAN_PAYMENT' THEN
9604 get_mapped_stream (p_sty_purpose => sec_strms_rec.stream_type_subclass,
9605 p_mapping_type => 'PV_DISBURSEMENT',
9606 p_line_style => NULL,
9607 p_deal_type => 'LOAN',
9608 p_khr_id => sec_strms_rec.agreement_id,
9609 p_stream_type_purpose => sec_strms_rec.stream_type_purpose,
9610 x_mapped_stream => l_mapped_sty_name,
9611 x_return_status => x_return_status);
9612
9613 IF x_return_status = OKL_API.G_RET_STS_UNEXP_ERROR THEN
9614 RAISE OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
9615 ELSIF x_return_status = OKL_API.G_RET_STS_ERROR THEN
9616 RAISE OKL_API.G_EXCEPTION_ERROR;
9617 END IF;
9618
9619 If ( l_mapped_sty_name IS NOT NULL ) Then
9620
9621 print( l_api_name, ' mapped stream ' || l_mapped_sty_name, x_return_status );
9622 i := 0;
9623 FOR l_strms_rec in l_strms_csr( sec_strms_rec.contract_id,
9624 sec_strms_rec.asset_id,
9625 l_mapped_sty_name )
9626 LOOP
9627
9628 i := i + 1;
9629 l_stmv_tbl(i).id := l_strms_rec.STRM_ID;
9630 l_stmv_tbl(i).say_code := 'HIST';
9631 l_stmv_tbl(i).active_yn := 'N';
9632 l_stmv_tbl(i).date_history := sysdate;
9633
9634 END LOOP;
9635
9636 If ( l_stmv_tbl.COUNT > 0 ) Then
9637
9638 Okl_Streams_pub.update_streams(
9639 p_api_version => p_api_version,
9640 p_init_msg_list => p_init_msg_list,
9641 x_return_status => x_return_status,
9642 x_msg_count => x_msg_count,
9643 x_msg_data => x_msg_data,
9644 p_stmv_tbl => l_stmv_tbl,
9645 x_stmv_tbl => x_stmv_tbl);
9646
9647 IF x_return_status = OKL_API.G_RET_STS_UNEXP_ERROR THEN
9648 RAISE OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
9649 ELSIF x_return_status = OKL_API.G_RET_STS_ERROR THEN
9650 RAISE OKL_API.G_EXCEPTION_ERROR;
9651 END IF;
9652
9653 End If;
9654 l_stmv_tbl.delete;
9655
9656 End If;
9657
9658 ELSE
9659 get_mapped_stream (p_sty_purpose => sec_strms_rec.stream_type_subclass,
9660 p_mapping_type => 'PV_DISBURSEMENT',
9661 p_line_style => NULL,
9662 p_deal_type => 'LEASE',
9663 p_khr_id => sec_strms_rec.agreement_id,
9664 x_mapped_stream => l_mapped_sty_name,
9665 x_return_status => x_return_status);
9666
9667 IF x_return_status = OKL_API.G_RET_STS_UNEXP_ERROR THEN
9668 RAISE OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
9669 ELSIF x_return_status = OKL_API.G_RET_STS_ERROR THEN
9670 RAISE OKL_API.G_EXCEPTION_ERROR;
9671 END IF;
9672
9673 If ( l_mapped_sty_name IS NOT NULL ) Then
9674
9675 print( l_api_name, ' mapped stream ' || l_mapped_sty_name, x_return_status );
9676 i := 0;
9677 FOR l_strms_rec in l_strms_csr( sec_strms_rec.contract_id,
9678 sec_strms_rec.asset_id,
9679 l_mapped_sty_name )
9680 LOOP
9681
9682 i := i + 1;
9683 l_stmv_tbl(i).id := l_strms_rec.STRM_ID;
9684 l_stmv_tbl(i).say_code := 'HIST';
9685 l_stmv_tbl(i).active_yn := 'N';
9686 l_stmv_tbl(i).date_history := sysdate;
9687
9688 END LOOP;
9689
9690 If ( l_stmv_tbl.COUNT > 0 ) Then
9691
9692 Okl_Streams_pub.update_streams(
9693 p_api_version => p_api_version,
9694 p_init_msg_list => p_init_msg_list,
9695 x_return_status => x_return_status,
9696 x_msg_count => x_msg_count,
9697 x_msg_data => x_msg_data,
9698 p_stmv_tbl => l_stmv_tbl,
9699 x_stmv_tbl => x_stmv_tbl);
9700
9701 IF x_return_status = OKL_API.G_RET_STS_UNEXP_ERROR THEN
9702 RAISE OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
9703 ELSIF x_return_status = OKL_API.G_RET_STS_ERROR THEN
9704 RAISE OKL_API.G_EXCEPTION_ERROR;
9705 END IF;
9706
9707 End If;
9708 l_stmv_tbl.delete;
9709
9710 End If;
9711 END IF;
9712
9713 END LOOP;
9714
9715 FOR sec_strms_rec IN sec_strms_csr( l_pool_status )
9716 LOOP
9717
9718 l_stmv_rec := NULL;
9719 gen_pv_streams(p_api_version => p_api_version,
9720 p_init_msg_list => p_init_msg_list,
9721 p_pool_status => l_pool_status,
9722 p_agreement_id => sec_strms_rec.agreement_id,
9723 p_contract_id => sec_strms_rec.contract_id,
9724 p_kle_id => sec_strms_rec.asset_id,
9725 p_sty_id => sec_strms_rec.stream_type_id,
9726 p_mode => p_mode,
9727 x_stmv_rec => l_stmv_rec,
9728 x_selv_tbl => l_selv_tbl,
9729 x_return_status => x_return_status,
9730 x_msg_count => x_msg_count,
9731 x_msg_data => x_msg_data);
9732
9733 IF x_return_status = OKL_API.G_RET_STS_UNEXP_ERROR THEN
9734 RAISE OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
9735 ELSIF x_return_status = OKL_API.G_RET_STS_ERROR THEN
9736 RAISE OKL_API.G_EXCEPTION_ERROR;
9737 END IF;
9738
9739 l_stmv_rec.say_code := 'CURR';
9740 l_stmv_rec.date_current := sysdate;
9741 l_stmv_rec.active_yn := 'Y';
9742 l_stmv_rec.source_table := 'OKL_K_HEADERS';
9743 l_stmv_rec.source_id := sec_strms_rec.agreement_id;
9744
9745 print( l_api_name, ' # of streams ' || to_char( l_selv_tbl.COUNT ) );
9746 If( l_selv_tbl.COUNT > 0 AND (l_stmv_rec.sty_id IS NOT NULL) ) Then
9747
9748 print( l_api_name, ' creating pv disb streams ' );
9749
9750 x_return_status := Okl_Streams_Util.round_streams_amount(
9751 p_api_version => g_api_version,
9752 p_init_msg_list => p_init_msg_list,
9753 x_msg_count => x_msg_count,
9754 x_msg_data => x_msg_data,
9755 p_chr_id => l_stmv_Rec.khr_id,
9756 p_selv_tbl => l_selv_tbl,
9757 x_selv_tbl => lx_selv_tbl);
9758
9759 IF (x_return_status = G_RET_STS_UNEXP_ERROR) THEN
9760 RAISE OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
9761 ELSIF (x_return_status = G_RET_STS_ERROR) THEN
9762 RAISE OKL_API.G_EXCEPTION_ERROR;
9763 END IF;
9764
9765 l_selv_tbl.DELETE;
9766 l_selv_tbl := lx_selv_tbl;
9767
9768 okl_streams_pub.create_streams(p_api_version => G_API_VERSION,
9769 p_init_msg_list => G_FALSE,
9770 x_return_status => x_return_status,
9771 x_msg_count => x_msg_count,
9772 x_msg_data => x_msg_data,
9773 p_stmv_rec => l_stmv_rec,
9774 p_selv_tbl => l_selv_tbl,
9775 x_stmv_rec => lx_stmv_rec,
9776 x_selv_tbl => lx_selv_tbl);
9777
9778 print( l_api_name, ' creating pv disb streams : done ', x_return_status );
9779 IF x_return_status = OKL_API.G_RET_STS_UNEXP_ERROR THEN
9780 RAISE OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
9781 ELSIF x_return_status = OKL_API.G_RET_STS_ERROR THEN
9782 RAISE OKL_API.G_EXCEPTION_ERROR;
9783 END IF;
9784
9785 l_selv_tbl.delete;
9786
9787 End if;
9788
9789 END LOOP;
9790 ELSE
9791 FOR sec_strms_rec IN sec_strms_pend_csr( l_pool_status )
9792 LOOP
9793 IF sec_strms_rec.stream_type_subclass = 'LOAN_PAYMENT' THEN
9794 get_mapped_stream (p_sty_purpose => sec_strms_rec.stream_type_subclass,
9795 p_mapping_type => 'PV_DISBURSEMENT',
9796 p_line_style => NULL,
9797 p_deal_type => 'LOAN',
9798 p_stream_type_purpose => sec_strms_rec.stream_type_purpose,
9799 p_khr_id => sec_strms_rec.agreement_id,
9800 x_mapped_stream => l_mapped_sty_name,
9801 x_return_status => x_return_status);
9802
9803 IF x_return_status = OKL_API.G_RET_STS_UNEXP_ERROR THEN
9804 RAISE OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
9805 ELSIF x_return_status = OKL_API.G_RET_STS_ERROR THEN
9806 RAISE OKL_API.G_EXCEPTION_ERROR;
9807 END IF;
9808
9809 If ( l_mapped_sty_name IS NOT NULL ) Then
9810
9811 print( l_api_name, ' mapped stream ' || l_mapped_sty_name, x_return_status );
9812 i := 0;
9813 FOR l_strms_rec in l_strms_csr( sec_strms_rec.contract_id,
9814 sec_strms_rec.asset_id,
9815 l_mapped_sty_name )
9816 LOOP
9817
9818 i := i + 1;
9819 l_stmv_tbl(i).id := l_strms_rec.STRM_ID;
9820 l_stmv_tbl(i).say_code := 'HIST';
9821 l_stmv_tbl(i).active_yn := 'N';
9822 l_stmv_tbl(i).date_history := sysdate;
9823
9824 END LOOP;
9825
9826 If ( l_stmv_tbl.COUNT > 0 ) Then
9827
9828 Okl_Streams_pub.update_streams(
9829 p_api_version => p_api_version,
9830 p_init_msg_list => p_init_msg_list,
9831 x_return_status => x_return_status,
9832 x_msg_count => x_msg_count,
9833 x_msg_data => x_msg_data,
9834 p_stmv_tbl => l_stmv_tbl,
9835 x_stmv_tbl => x_stmv_tbl);
9836
9837 IF x_return_status = OKL_API.G_RET_STS_UNEXP_ERROR THEN
9838 RAISE OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
9839 ELSIF x_return_status = OKL_API.G_RET_STS_ERROR THEN
9840 RAISE OKL_API.G_EXCEPTION_ERROR;
9841 END IF;
9842
9843 End If;
9844 l_stmv_tbl.delete;
9845
9846 End If;
9847 ELSE
9848 get_mapped_stream (p_sty_purpose => sec_strms_rec.stream_type_subclass,
9849 p_mapping_type => 'PV_DISBURSEMENT',
9850 p_line_style => NULL,
9851 p_deal_type => 'LEASE',
9852 p_khr_id => sec_strms_rec.agreement_id,
9853 x_mapped_stream => l_mapped_sty_name,
9854 x_return_status => x_return_status);
9855
9856 IF x_return_status = OKL_API.G_RET_STS_UNEXP_ERROR THEN
9857 RAISE OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
9858 ELSIF x_return_status = OKL_API.G_RET_STS_ERROR THEN
9859 RAISE OKL_API.G_EXCEPTION_ERROR;
9860 END IF;
9861
9862 If ( l_mapped_sty_name IS NOT NULL ) Then
9863
9864 print( l_api_name, ' mapped stream ' || l_mapped_sty_name, x_return_status );
9865 i := 0;
9866 FOR l_strms_rec in l_strms_csr( sec_strms_rec.contract_id,
9867 sec_strms_rec.asset_id,
9868 l_mapped_sty_name )
9869 LOOP
9870
9871 i := i + 1;
9872 l_stmv_tbl(i).id := l_strms_rec.STRM_ID;
9873 l_stmv_tbl(i).say_code := 'HIST';
9874 l_stmv_tbl(i).active_yn := 'N';
9875 l_stmv_tbl(i).date_history := sysdate;
9876
9877 END LOOP;
9878
9879 If ( l_stmv_tbl.COUNT > 0 ) Then
9880
9881 Okl_Streams_pub.update_streams(
9882 p_api_version => p_api_version,
9883 p_init_msg_list => p_init_msg_list,
9884 x_return_status => x_return_status,
9885 x_msg_count => x_msg_count,
9886 x_msg_data => x_msg_data,
9887 p_stmv_tbl => l_stmv_tbl,
9888 x_stmv_tbl => x_stmv_tbl);
9889
9890 IF x_return_status = OKL_API.G_RET_STS_UNEXP_ERROR THEN
9891 RAISE OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
9892 ELSIF x_return_status = OKL_API.G_RET_STS_ERROR THEN
9893 RAISE OKL_API.G_EXCEPTION_ERROR;
9894 END IF;
9895
9896 End If;
9897 l_stmv_tbl.delete;
9898
9899 End If;
9900 END IF;
9901
9902 END LOOP;
9903
9904 FOR sec_strms_rec IN sec_strms_pend_csr( l_pool_status )
9905 LOOP
9906
9907 l_stmv_rec := NULL;
9908 gen_pv_streams(p_api_version => p_api_version,
9909 p_init_msg_list => p_init_msg_list,
9910 p_pool_status => l_pool_status,
9911 p_agreement_id => sec_strms_rec.agreement_id,
9912 p_contract_id => sec_strms_rec.contract_id,
9913 p_kle_id => sec_strms_rec.asset_id,
9914 p_sty_id => sec_strms_rec.stream_type_id,
9915 p_mode => p_mode,
9916 x_stmv_rec => l_stmv_rec,
9917 x_selv_tbl => l_selv_tbl,
9918 x_return_status => x_return_status,
9919 x_msg_count => x_msg_count,
9920 x_msg_data => x_msg_data);
9921
9922 IF x_return_status = OKL_API.G_RET_STS_UNEXP_ERROR THEN
9923 RAISE OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
9924 ELSIF x_return_status = OKL_API.G_RET_STS_ERROR THEN
9925 RAISE OKL_API.G_EXCEPTION_ERROR;
9926 END IF;
9927
9928 l_stmv_rec.say_code := 'CURR';
9929 l_stmv_rec.date_current := sysdate;
9930 l_stmv_rec.active_yn := 'Y';
9931 l_stmv_rec.source_table := 'OKL_K_HEADERS';
9932 l_stmv_rec.source_id := sec_strms_rec.agreement_id;
9933
9934 print( l_api_name, ' # of streams ' || to_char( l_selv_tbl.COUNT ) );
9935 If( l_selv_tbl.COUNT > 0 AND (l_stmv_rec.sty_id IS NOT NULL) ) Then
9936
9937 print( l_api_name, ' creating pv disb streams ' );
9938
9939 x_return_status := Okl_Streams_Util.round_streams_amount(
9940 p_api_version => g_api_version,
9941 p_init_msg_list => p_init_msg_list,
9942 x_msg_count => x_msg_count,
9943 x_msg_data => x_msg_data,
9944 p_chr_id => l_stmv_Rec.khr_id,
9945 p_selv_tbl => l_selv_tbl,
9946 x_selv_tbl => lx_selv_tbl);
9947
9948 IF (x_return_status = G_RET_STS_UNEXP_ERROR) THEN
9949 RAISE OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
9950 ELSIF (x_return_status = G_RET_STS_ERROR) THEN
9951 RAISE OKL_API.G_EXCEPTION_ERROR;
9952 END IF;
9953
9954 l_selv_tbl.DELETE;
9955 l_selv_tbl := lx_selv_tbl;
9956
9957 okl_streams_pub.create_streams(p_api_version => G_API_VERSION,
9958 p_init_msg_list => G_FALSE,
9959 x_return_status => x_return_status,
9960 x_msg_count => x_msg_count,
9961 x_msg_data => x_msg_data,
9962 p_stmv_rec => l_stmv_rec,
9963 p_selv_tbl => l_selv_tbl,
9964 x_stmv_rec => lx_stmv_rec,
9965 x_selv_tbl => lx_selv_tbl);
9966
9967 print( l_api_name, ' creating pv disb streams : done ', x_return_status );
9968 IF x_return_status = OKL_API.G_RET_STS_UNEXP_ERROR THEN
9969 RAISE OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
9970 ELSIF x_return_status = OKL_API.G_RET_STS_ERROR THEN
9971 RAISE OKL_API.G_EXCEPTION_ERROR;
9972 END IF;
9973
9974 l_selv_tbl.delete;
9975
9976 End if;
9977
9978 END LOOP;
9979
9980 END IF;
9981
9982 OKL_API.END_ACTIVITY(x_msg_count => x_msg_count, x_msg_data => x_msg_data);
9983 print( l_api_name, 'end' );
9984
9985 Exception
9986
9987 when OKL_API.G_EXCEPTION_ERROR then
9988 x_return_status := OKL_API.HANDLE_EXCEPTIONS(
9989 p_api_name => l_api_name,
9990 p_pkg_name => g_pkg_name,
9991 p_exc_name => 'OKL_API.G_RET_STS_ERROR',
9992 x_msg_count => x_msg_count,
9993 x_msg_data => x_msg_data,
9994 p_api_type => g_api_type);
9995
9996 when OKL_API.G_EXCEPTION_UNEXPECTED_ERROR then
9997 x_return_status := OKL_API.HANDLE_EXCEPTIONS(
9998 p_api_name => l_api_name,
9999 p_pkg_name => g_pkg_name,
10000 p_exc_name => 'OKL_API.G_RET_STS_UNEXP_ERROR',
10001 x_msg_count => x_msg_count,
10002 x_msg_data => x_msg_data,
10003 p_api_type => g_api_type);
10004
10005 when OTHERS then
10006 x_return_status := OKL_API.HANDLE_EXCEPTIONS(
10007 p_api_name => l_api_name,
10008 p_pkg_name => g_pkg_name,
10009 p_exc_name => 'OTHERS',
10010 x_msg_count => x_msg_count,
10011 x_msg_data => x_msg_data,
10012 p_api_type => g_api_type);
10013
10014 END gen_pv_disb_streams;
10015
10016 PROCEDURE gen_disbursement_streams(p_api_version IN NUMBER,
10017 p_init_msg_list IN VARCHAR2,
10018 p_contract_id IN NUMBER,
10019 p_agreement_id IN NUMBER,
10020 p_pool_status IN VARCHAR2,
10021 /* sosharma 14-12-2007 Added p_mode to the signature to pass mode
10022 from calling procedure*/
10023 p_mode IN VARCHAR2 DEFAULT NULL,
10024 x_return_status OUT NOCOPY VARCHAR2,
10025 x_msg_count OUT NOCOPY NUMBER,
10026 x_msg_data OUT NOCOPY VARCHAR2) IS
10027
10028
10029 l_api_name CONSTANT VARCHAR2(61) := 'gen_disbursement_streams';
10030
10031 Cursor l_strms_csr ( khrId NUMBER, kleId NUMBER, strmname VARCHAR2) IS
10032 select stm.id strm_id
10033 from okl_strm_type_v sty,
10034 okl_strm_type_tl stl,
10035 okl_streams stm
10036 where stl.language = 'US'
10037 and stl.name = strmname
10038 and sty.id = stl.id
10039 and stm.sty_id = sty.id
10040 and stm.kle_id = kleId
10041 and stm.khr_id = khrId
10042 and stm.say_code = 'CURR';
10043
10044 l_strms_rec l_strms_csr%ROWTYPE;
10045
10046 Cursor sec_strms_csr ( poolstat VARCHAR2 ) IS
10047 select pol.khr_id agreement_id,
10048 pcn.khr_id contract_id,
10049 pcn.kle_id asset_id,
10050 pcn.sty_id stream_type_id,
10051 sty.stream_type_subclass stream_type_subclass,
10052 sty.stream_type_purpose stream_type_purpose
10053 from okl_pools pol,
10054 okl_pool_contents pcn,
10055 okl_strm_type_v sty,
10056 okl_streams stm
10057 where pcn.sty_id = sty.id
10058 and pcn.pol_id = pol.id
10059 and stm.kle_id = pcn.kle_id
10060 and stm.khr_id = pcn.khr_id
10061 and stm.sty_id = pcn.sty_id
10062 and stm.say_code = 'CURR'
10063 and stm.active_yn = 'Y'
10064 and pol.status_code = poolstat
10065 and nvl(stm.khr_id, 0) = nvl(p_contract_id, -1)
10066 and pcn.status_code IN(G_IA_STS_NEW,G_IA_STS_ACTIVE)
10067 Union
10068 select pol.khr_id agreement_id,
10069 pcn.khr_id contract_id,
10070 pcn.kle_id asset_id,
10071 pcn.sty_id stream_type_id,
10072 sty.stream_type_subclass stream_type_subclass,
10073 sty.stream_type_purpose stream_type_purpose
10074 from okl_pools pol,
10075 okl_pool_contents pcn,
10076 okl_strm_type_v sty,
10077 okl_streams stm
10078 where pcn.sty_id = sty.id
10079 and pcn.pol_id = pol.id
10080 and stm.kle_id = pcn.kle_id
10081 and stm.khr_id = pcn.khr_id
10082 and stm.sty_id = pcn.sty_id
10083 and stm.say_code = 'CURR'
10084 and stm.active_yn = 'Y'
10085 and pol.status_code = poolstat
10086 and nvl(pol.khr_id, 0) = nvl(p_agreement_id, -1)
10087 and pcn.status_code IN(G_IA_STS_NEW,G_IA_STS_ACTIVE)
10088 order by agreement_id, contract_id, asset_id, stream_type_id;
10089
10090 /* sosharma ,14-12-2007
10091 Bug 6691554
10092 Start Changes*/
10093 --Changed Cursor to pich up pending requests
10094
10095 Cursor sec_strms_pend_csr ( poolstat VARCHAR2 ) IS
10096 select pol.khr_id agreement_id,
10097 pcn.khr_id contract_id,
10098 pcn.kle_id asset_id,
10099 pcn.sty_id stream_type_id,
10100 sty.stream_type_subclass stream_type_subclass,
10101 sty.stream_type_purpose stream_type_purpose
10102 from okl_pools pol,
10103 okl_pool_contents pcn,
10104 okl_strm_type_v sty,
10105 okl_streams stm
10106 where pcn.sty_id = sty.id
10107 and pcn.pol_id = pol.id
10108 and stm.kle_id = pcn.kle_id
10109 and stm.khr_id = pcn.khr_id
10110 and stm.sty_id = pcn.sty_id
10111 and stm.say_code = 'CURR'
10112 and stm.active_yn = 'Y'
10113 and pol.status_code = poolstat
10114 and nvl(stm.khr_id, 0) = nvl(p_contract_id, -1)
10115 and pcn.status_code=G_PC_STS_PENDING
10116 Union
10117 select pol.khr_id agreement_id,
10118 pcn.khr_id contract_id,
10119 pcn.kle_id asset_id,
10120 pcn.sty_id stream_type_id,
10121 sty.stream_type_subclass stream_type_subclass,
10122 sty.stream_type_purpose stream_type_purpose
10123 from okl_pools pol,
10124 okl_pool_contents pcn,
10125 okl_strm_type_v sty,
10126 okl_streams stm
10127 where pcn.sty_id = sty.id
10128 and pcn.pol_id = pol.id
10129 and stm.kle_id = pcn.kle_id
10130 and stm.khr_id = pcn.khr_id
10131 and stm.sty_id = pcn.sty_id
10132 and stm.say_code = 'CURR'
10133 and stm.active_yn = 'Y'
10134 and pol.status_code = poolstat
10135 and nvl(pol.khr_id, 0) = nvl(p_agreement_id, -1)
10136 and pcn.status_code=G_PC_STS_PENDING
10137 order by agreement_id, contract_id, asset_id, stream_type_id;
10138
10139
10140 /*soharma End Changes*/
10141
10142 sec_strms_rec sec_strms_csr%ROWTYPE;
10143
10144 l_sty_id NUMBER;
10145
10146 l_selv_tbl okl_streams_pub.selv_tbl_type;
10147 l_stmv_tbl okl_streams_pub.stmv_tbl_type;
10148 x_stmv_tbl okl_streams_pub.stmv_tbl_type;
10149 lx_selv_tbl okl_streams_pub.selv_tbl_type;
10150
10151 l_stmv_rec okl_streams_pub.stmv_rec_type;
10152 lx_stmv_rec okl_streams_pub.stmv_rec_type;
10153
10154 i NUMBER;
10155 n NUMBER;
10156
10157 l_sty_id NUMBER;
10158 l_sty_name VARCHAR2(256);
10159
10160 l_pool_status VARCHAR2(256);
10161 l_mapped_sty_name VARCHAR2(150);
10162
10163 BEGIN
10164
10165 print( l_api_name, 'begin' );
10166
10167 x_return_status := OKL_API.G_RET_STS_SUCCESS;
10168
10169 x_return_status := OKL_API.START_ACTIVITY(
10170 p_api_name => l_api_name,
10171 p_pkg_name => g_pkg_name,
10172 p_init_msg_list => p_init_msg_list,
10173 l_api_version => p_api_version,
10174 p_api_version => p_api_version,
10175 p_api_type => G_API_TYPE,
10176 x_return_status => x_return_status);
10177
10178 -- check if activity started successfully
10179 If (x_return_status = OKL_API.G_RET_STS_UNEXP_ERROR) then
10180 raise OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
10181 ElSIF (x_return_status = OKL_API.G_RET_STS_ERROR) then
10182 raise OKL_API.G_EXCEPTION_ERROR;
10183 End If;
10184
10185 print( l_api_name, 'save point' );
10186
10187 If ( nvl(p_pool_status, 'XXX') = 'XXX' ) AND ( nvl(p_agreement_id, -1) <> -1 ) Then
10188 l_pool_status := 'NEW';
10189 ELsif( nvl(p_pool_status, 'XXX') = 'XXX' ) AND ( nvl(p_contract_id, -1) <> -1) Then
10190 l_pool_status := 'ACTIVE';
10191 Else
10192 l_pool_status := p_pool_status;
10193 End If;
10194
10195 print( l_api_name, 'pool stat' || l_pool_status );
10196 /* sosharma ,14-12-2007
10197 Bug 6691554
10198 Start Changes*/
10199
10200 --Based on the p_mode passed to the procedure two flows have been defined
10201 IF p_mode IS NULL THEN
10202 i := 0;
10203 FOR sec_strms_rec IN sec_strms_csr( l_pool_status )
10204 LOOP
10205 IF sec_strms_rec.stream_type_subclass = 'LOAN_PAYMENT' THEN
10206 get_mapped_stream (p_sty_purpose => sec_strms_rec.stream_type_subclass,
10207 p_mapping_type => 'DISBURSEMENT',
10208 p_line_style => NULL,
10209 p_deal_type => 'LOAN',
10210 p_stream_type_purpose => sec_strms_rec.stream_type_purpose,
10211 p_khr_id => sec_strms_rec.agreement_id,
10212 x_mapped_stream => l_mapped_sty_name,
10213 x_return_status => x_return_status);
10214
10215 print( l_api_name, ' mapped sty ' || l_mapped_sty_name );
10216
10217 IF x_return_status = OKL_API.G_RET_STS_UNEXP_ERROR THEN
10218 RAISE OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
10219 ELSIF x_return_status = OKL_API.G_RET_STS_ERROR THEN
10220 RAISE OKL_API.G_EXCEPTION_ERROR;
10221 END IF;
10222
10223 If l_mapped_sty_name IS NOT NULL Then
10224
10225 FOR l_strms_rec in l_strms_csr( sec_strms_rec.contract_id,
10226 sec_strms_rec.asset_id,
10227 l_mapped_sty_name )
10228 LOOP
10229
10230 i := i + 1;
10231 l_stmv_tbl(i).id := l_strms_rec.STRM_ID;
10232 l_stmv_tbl(i).say_code := 'HIST';
10233 l_stmv_tbl(i).active_yn := 'N';
10234 l_stmv_tbl(i).date_history := sysdate;
10235
10236 END LOOP;
10237
10238 If ( l_stmv_tbl.COUNT > 0 ) Then
10239
10240 Okl_Streams_pub.update_streams(
10241 p_api_version => p_api_version,
10242 p_init_msg_list => p_init_msg_list,
10243 x_return_status => x_return_status,
10244 x_msg_count => x_msg_count,
10245 x_msg_data => x_msg_data,
10246 p_stmv_tbl => l_stmv_tbl,
10247 x_stmv_tbl => x_stmv_tbl);
10248
10249 IF x_return_status = OKL_API.G_RET_STS_UNEXP_ERROR THEN
10250 RAISE OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
10251 ELSIF x_return_status = OKL_API.G_RET_STS_ERROR THEN
10252 RAISE OKL_API.G_EXCEPTION_ERROR;
10253 END IF;
10254
10255 End If;
10256 l_stmv_tbl.delete;
10257
10258 End If;
10259
10260 ELSE
10261 get_mapped_stream (p_sty_purpose => sec_strms_rec.stream_type_subclass,
10262 p_mapping_type => 'DISBURSEMENT',
10263 p_line_style => NULL,
10264 p_deal_type => 'LEASE',
10265 p_khr_id => sec_strms_rec.agreement_id,
10266 x_mapped_stream => l_mapped_sty_name,
10267 x_return_status => x_return_status);
10268
10269 print( l_api_name, ' mapped sty ' || l_mapped_sty_name );
10270
10271 IF x_return_status = OKL_API.G_RET_STS_UNEXP_ERROR THEN
10272 RAISE OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
10273 ELSIF x_return_status = OKL_API.G_RET_STS_ERROR THEN
10274 RAISE OKL_API.G_EXCEPTION_ERROR;
10275 END IF;
10276
10277 If l_mapped_sty_name IS NOT NULL Then
10278
10279 FOR l_strms_rec in l_strms_csr( sec_strms_rec.contract_id,
10280 sec_strms_rec.asset_id,
10281 l_mapped_sty_name )
10282 LOOP
10283
10284 i := i + 1;
10285 l_stmv_tbl(i).id := l_strms_rec.STRM_ID;
10286 l_stmv_tbl(i).say_code := 'HIST';
10287 l_stmv_tbl(i).active_yn := 'N';
10288 l_stmv_tbl(i).date_history := sysdate;
10289
10290 END LOOP;
10291
10292 If ( l_stmv_tbl.COUNT > 0 ) Then
10293
10294 Okl_Streams_pub.update_streams(
10295 p_api_version => p_api_version,
10296 p_init_msg_list => p_init_msg_list,
10297 x_return_status => x_return_status,
10298 x_msg_count => x_msg_count,
10299 x_msg_data => x_msg_data,
10300 p_stmv_tbl => l_stmv_tbl,
10301 x_stmv_tbl => x_stmv_tbl);
10302
10303 IF x_return_status = OKL_API.G_RET_STS_UNEXP_ERROR THEN
10304 RAISE OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
10305 ELSIF x_return_status = OKL_API.G_RET_STS_ERROR THEN
10306 RAISE OKL_API.G_EXCEPTION_ERROR;
10307 END IF;
10308
10309 End If;
10310 l_stmv_tbl.delete;
10311
10312 End If;
10313
10314 END IF;
10315 END LOOP;
10316
10317 FOR sec_strms_rec IN sec_strms_csr( l_pool_status )
10318 LOOP
10319
10320 print( l_api_name, ' mapped stream ' || l_mapped_sty_name, x_return_status );
10321
10322 l_stmv_rec := NULL;
10323 gen_disb_streams(p_api_version => p_api_version,
10324 p_init_msg_list => p_init_msg_list,
10325 p_pool_status => l_pool_status,
10326 p_agreement_id => sec_strms_rec.agreement_id,
10327 p_contract_id => sec_strms_rec.contract_id,
10328 p_kle_id => sec_strms_rec.asset_id,
10329 p_sty_id => sec_strms_rec.stream_type_id,
10330 p_mode => p_mode,
10331 x_stmv_rec => l_stmv_rec,
10332 x_selv_tbl => l_selv_tbl,
10333 x_return_status => x_return_status,
10334 x_msg_count => x_msg_count,
10335 x_msg_data => x_msg_data);
10336
10337 IF x_return_status = OKL_API.G_RET_STS_UNEXP_ERROR THEN
10338 RAISE OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
10339 ELSIF x_return_status = OKL_API.G_RET_STS_ERROR THEN
10340 RAISE OKL_API.G_EXCEPTION_ERROR;
10341 END IF;
10342
10343 l_stmv_rec.say_code := 'CURR';
10344 l_stmv_rec.date_current := sysdate;
10345 l_stmv_rec.active_yn := 'Y';
10346 l_stmv_rec.source_table := 'OKL_K_HEADERS';
10347 l_stmv_rec.source_id := sec_strms_rec.agreement_id;
10348
10349 If( l_selv_tbl.COUNT > 0 AND l_stmv_rec.sty_id IS NOT NULL) Then
10350
10351 print( l_api_name, ' creating disb streams ' );
10352
10353 x_return_status := Okl_Streams_Util.round_streams_amount(
10354 p_api_version => g_api_version,
10355 p_init_msg_list => p_init_msg_list,
10356 x_msg_count => x_msg_count,
10357 x_msg_data => x_msg_data,
10358 p_chr_id => l_stmv_Rec.khr_id,
10359 p_selv_tbl => l_selv_tbl,
10360 x_selv_tbl => lx_selv_tbl);
10361
10362 IF (x_return_status = G_RET_STS_UNEXP_ERROR) THEN
10363 RAISE OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
10364 ELSIF (x_return_status = G_RET_STS_ERROR) THEN
10365 RAISE OKL_API.G_EXCEPTION_ERROR;
10366 END IF;
10367
10368 l_selv_tbl.DELETE;
10369 l_selv_tbl := lx_selv_tbl;
10370
10371 okl_streams_pub.create_streams(p_api_version => G_API_VERSION,
10372 p_init_msg_list => G_FALSE,
10373 x_return_status => x_return_status,
10374 x_msg_count => x_msg_count,
10375 x_msg_data => x_msg_data,
10376 p_stmv_rec => l_stmv_rec,
10377 p_selv_tbl => l_selv_tbl,
10378 x_stmv_rec => lx_stmv_rec,
10379 x_selv_tbl => lx_selv_tbl);
10380
10381 IF x_return_status = OKL_API.G_RET_STS_UNEXP_ERROR THEN
10382 RAISE OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
10383 ELSIF x_return_status = OKL_API.G_RET_STS_ERROR THEN
10384 RAISE OKL_API.G_EXCEPTION_ERROR;
10385 END IF;
10386
10387 l_selv_tbl.delete;
10388
10389 End if;
10390
10391 END LOOP;
10392 ELSE
10393 i := 0;
10394 FOR sec_strms_rec IN sec_strms_pend_csr( l_pool_status )
10395 LOOP
10396 IF sec_strms_rec.stream_type_subclass = 'LOAN_PAYMENT' THEN
10397 get_mapped_stream (p_sty_purpose => sec_strms_rec.stream_type_subclass,
10398 p_mapping_type => 'DISBURSEMENT',
10399 p_line_style => NULL,
10400 p_deal_type => 'LOAN',
10401 p_stream_type_purpose => sec_strms_rec.stream_type_purpose,
10402 p_khr_id => sec_strms_rec.agreement_id,
10403 x_mapped_stream => l_mapped_sty_name,
10404 x_return_status => x_return_status);
10405
10406 print( l_api_name, ' mapped sty ' || l_mapped_sty_name );
10407
10408 IF x_return_status = OKL_API.G_RET_STS_UNEXP_ERROR THEN
10409 RAISE OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
10410 ELSIF x_return_status = OKL_API.G_RET_STS_ERROR THEN
10411 RAISE OKL_API.G_EXCEPTION_ERROR;
10412 END IF;
10413
10414 If l_mapped_sty_name IS NOT NULL Then
10415
10416 FOR l_strms_rec in l_strms_csr( sec_strms_rec.contract_id,
10417 sec_strms_rec.asset_id,
10418 l_mapped_sty_name )
10419 LOOP
10420
10421 i := i + 1;
10422 l_stmv_tbl(i).id := l_strms_rec.STRM_ID;
10423 l_stmv_tbl(i).say_code := 'HIST';
10424 l_stmv_tbl(i).active_yn := 'N';
10425 l_stmv_tbl(i).date_history := sysdate;
10426
10427 END LOOP;
10428
10429 If ( l_stmv_tbl.COUNT > 0 ) Then
10430
10431 Okl_Streams_pub.update_streams(
10432 p_api_version => p_api_version,
10433 p_init_msg_list => p_init_msg_list,
10434 x_return_status => x_return_status,
10435 x_msg_count => x_msg_count,
10436 x_msg_data => x_msg_data,
10437 p_stmv_tbl => l_stmv_tbl,
10438 x_stmv_tbl => x_stmv_tbl);
10439
10440 IF x_return_status = OKL_API.G_RET_STS_UNEXP_ERROR THEN
10441 RAISE OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
10442 ELSIF x_return_status = OKL_API.G_RET_STS_ERROR THEN
10443 RAISE OKL_API.G_EXCEPTION_ERROR;
10444 END IF;
10445
10446 End If;
10447 l_stmv_tbl.delete;
10448
10449 End If;
10450
10451 ELSE
10452 get_mapped_stream (p_sty_purpose => sec_strms_rec.stream_type_subclass,
10453 p_mapping_type => 'DISBURSEMENT',
10454 p_line_style => NULL,
10455 p_deal_type => 'LEASE',
10456 p_khr_id => sec_strms_rec.agreement_id,
10457 x_mapped_stream => l_mapped_sty_name,
10458 x_return_status => x_return_status);
10459
10460 print( l_api_name, ' mapped sty ' || l_mapped_sty_name );
10461
10462 IF x_return_status = OKL_API.G_RET_STS_UNEXP_ERROR THEN
10463 RAISE OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
10464 ELSIF x_return_status = OKL_API.G_RET_STS_ERROR THEN
10465 RAISE OKL_API.G_EXCEPTION_ERROR;
10466 END IF;
10467
10468 If l_mapped_sty_name IS NOT NULL Then
10469
10470 FOR l_strms_rec in l_strms_csr( sec_strms_rec.contract_id,
10471 sec_strms_rec.asset_id,
10472 l_mapped_sty_name )
10473 LOOP
10474
10475 i := i + 1;
10476 l_stmv_tbl(i).id := l_strms_rec.STRM_ID;
10477 l_stmv_tbl(i).say_code := 'HIST';
10478 l_stmv_tbl(i).active_yn := 'N';
10479 l_stmv_tbl(i).date_history := sysdate;
10480
10481 END LOOP;
10482
10483 If ( l_stmv_tbl.COUNT > 0 ) Then
10484
10485 Okl_Streams_pub.update_streams(
10486 p_api_version => p_api_version,
10487 p_init_msg_list => p_init_msg_list,
10488 x_return_status => x_return_status,
10489 x_msg_count => x_msg_count,
10490 x_msg_data => x_msg_data,
10491 p_stmv_tbl => l_stmv_tbl,
10492 x_stmv_tbl => x_stmv_tbl);
10493
10494 IF x_return_status = OKL_API.G_RET_STS_UNEXP_ERROR THEN
10495 RAISE OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
10496 ELSIF x_return_status = OKL_API.G_RET_STS_ERROR THEN
10497 RAISE OKL_API.G_EXCEPTION_ERROR;
10498 END IF;
10499
10500 End If;
10501 l_stmv_tbl.delete;
10502
10503 End If;
10504 END IF;
10505
10506 END LOOP;
10507
10508
10509
10510 FOR sec_strms_rec IN sec_strms_pend_csr( l_pool_status )
10511 LOOP
10512
10513 print( l_api_name, ' mapped stream ' || l_mapped_sty_name, x_return_status );
10514
10515 l_stmv_rec := NULL;
10516 gen_disb_streams(p_api_version => p_api_version,
10517 p_init_msg_list => p_init_msg_list,
10518 p_pool_status => l_pool_status,
10519 p_agreement_id => sec_strms_rec.agreement_id,
10520 p_contract_id => sec_strms_rec.contract_id,
10521 p_kle_id => sec_strms_rec.asset_id,
10522 p_sty_id => sec_strms_rec.stream_type_id,
10523 p_mode => p_mode,
10524 x_stmv_rec => l_stmv_rec,
10525 x_selv_tbl => l_selv_tbl,
10526 x_return_status => x_return_status,
10527 x_msg_count => x_msg_count,
10528 x_msg_data => x_msg_data);
10529
10530 IF x_return_status = OKL_API.G_RET_STS_UNEXP_ERROR THEN
10531 RAISE OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
10532 ELSIF x_return_status = OKL_API.G_RET_STS_ERROR THEN
10533 RAISE OKL_API.G_EXCEPTION_ERROR;
10534 END IF;
10535
10536 l_stmv_rec.say_code := 'CURR';
10537 l_stmv_rec.date_current := sysdate;
10538 l_stmv_rec.active_yn := 'Y';
10539 l_stmv_rec.source_table := 'OKL_K_HEADERS';
10540 l_stmv_rec.source_id := sec_strms_rec.agreement_id;
10541
10542 If( l_selv_tbl.COUNT > 0 AND l_stmv_rec.sty_id IS NOT NULL) Then
10543
10544 print( l_api_name, ' creating disb streams ' );
10545
10546 x_return_status := Okl_Streams_Util.round_streams_amount(
10547 p_api_version => g_api_version,
10548 p_init_msg_list => p_init_msg_list,
10549 x_msg_count => x_msg_count,
10550 x_msg_data => x_msg_data,
10551 p_chr_id => l_stmv_Rec.khr_id,
10552 p_selv_tbl => l_selv_tbl,
10553 x_selv_tbl => lx_selv_tbl);
10554
10555 IF (x_return_status = G_RET_STS_UNEXP_ERROR) THEN
10556 RAISE OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
10557 ELSIF (x_return_status = G_RET_STS_ERROR) THEN
10558 RAISE OKL_API.G_EXCEPTION_ERROR;
10559 END IF;
10560
10561 l_selv_tbl.DELETE;
10562 l_selv_tbl := lx_selv_tbl;
10563
10564 okl_streams_pub.create_streams(p_api_version => G_API_VERSION,
10565 p_init_msg_list => G_FALSE,
10566 x_return_status => x_return_status,
10567 x_msg_count => x_msg_count,
10568 x_msg_data => x_msg_data,
10569 p_stmv_rec => l_stmv_rec,
10570 p_selv_tbl => l_selv_tbl,
10571 x_stmv_rec => lx_stmv_rec,
10572 x_selv_tbl => lx_selv_tbl);
10573
10574 IF x_return_status = OKL_API.G_RET_STS_UNEXP_ERROR THEN
10575 RAISE OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
10576 ELSIF x_return_status = OKL_API.G_RET_STS_ERROR THEN
10577 RAISE OKL_API.G_EXCEPTION_ERROR;
10578 END IF;
10579
10580 l_selv_tbl.delete;
10581
10582 End if;
10583
10584 END LOOP;
10585
10586 END IF;
10587
10588 OKL_API.END_ACTIVITY(x_msg_count => x_msg_count, x_msg_data => x_msg_data);
10589 print( l_api_name, 'end' );
10590
10591 Exception
10592
10593 when OKL_API.G_EXCEPTION_ERROR then
10594 x_return_status := OKL_API.HANDLE_EXCEPTIONS(
10595 p_api_name => l_api_name,
10596 p_pkg_name => g_pkg_name,
10597 p_exc_name => 'OKL_API.G_RET_STS_ERROR',
10598 x_msg_count => x_msg_count,
10599 x_msg_data => x_msg_data,
10600 p_api_type => g_api_type);
10601
10602 when OKL_API.G_EXCEPTION_UNEXPECTED_ERROR then
10603 x_return_status := OKL_API.HANDLE_EXCEPTIONS(
10604 p_api_name => l_api_name,
10605 p_pkg_name => g_pkg_name,
10606 p_exc_name => 'OKL_API.G_RET_STS_UNEXP_ERROR',
10607 x_msg_count => x_msg_count,
10608 x_msg_data => x_msg_data,
10609 p_api_type => g_api_type);
10610
10611 when OTHERS then
10612 x_return_status := OKL_API.HANDLE_EXCEPTIONS(
10613 p_api_name => l_api_name,
10614 p_pkg_name => g_pkg_name,
10615 p_exc_name => 'OTHERS',
10616 x_msg_count => x_msg_count,
10617 x_msg_data => x_msg_data,
10618 p_api_type => g_api_type);
10619
10620 END gen_disbursement_streams;
10621
10622
10623 PROCEDURE create_disb_streams(p_api_version IN NUMBER,
10624 p_init_msg_list IN VARCHAR2,
10625 p_agreement_id IN NUMBER,
10626 p_pool_status IN VARCHAR2 DEFAULT 'NEW',
10627 -- sosharma bug 6691554 ,added p_mode call for content status pending
10628 p_mode IN VARCHAR2 DEFAULT NULL,
10629 x_return_status OUT NOCOPY VARCHAR2,
10630 x_msg_count OUT NOCOPY NUMBER,
10631 x_msg_data OUT NOCOPY VARCHAR2) IS
10632
10633
10634 l_api_name CONSTANT VARCHAR2(61) := 'create_disb_streams';
10635
10636 BEGIN
10637
10638 print( l_api_name, 'begin' );
10639
10640 x_return_status := OKL_API.G_RET_STS_SUCCESS;
10641
10642 x_return_status := OKL_API.START_ACTIVITY(
10643 p_api_name => l_api_name,
10644 p_pkg_name => g_pkg_name,
10645 p_init_msg_list => p_init_msg_list,
10646 l_api_version => p_api_version,
10647 p_api_version => p_api_version,
10648 p_api_type => G_API_TYPE,
10649 x_return_status => x_return_status);
10650
10651 -- check if activity started successfully
10652 If (x_return_status = OKL_API.G_RET_STS_UNEXP_ERROR) then
10653 raise OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
10654 ElSIF (x_return_status = OKL_API.G_RET_STS_ERROR) then
10655 raise OKL_API.G_EXCEPTION_ERROR;
10656 End If;
10657
10658 gen_disbursement_streams(p_api_version => p_api_version,
10659 p_init_msg_list => p_init_msg_list,
10660 p_contract_id => NULL,
10661 p_agreement_id => p_agreement_id,
10662 p_pool_status => p_pool_status,
10663 -- sosharma 14-12-2007 bug 6691554 ,added p_mode to pass mode pending for downstream processing
10664 p_mode => p_mode,
10665 x_return_status => x_return_status,
10666 x_msg_count => x_msg_count,
10667 x_msg_data => x_msg_data);
10668
10669 If (x_return_status = OKL_API.G_RET_STS_UNEXP_ERROR) then
10670 raise OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
10671 ElSIF (x_return_status = OKL_API.G_RET_STS_ERROR) then
10672 raise OKL_API.G_EXCEPTION_ERROR;
10673 End If;
10674
10675 OKL_API.END_ACTIVITY(x_msg_count => x_msg_count, x_msg_data => x_msg_data);
10676 print( l_api_name, 'end' );
10677 Exception
10678
10679 when OKL_API.G_EXCEPTION_ERROR then
10680 x_return_status := OKL_API.HANDLE_EXCEPTIONS(
10681 p_api_name => l_api_name,
10682 p_pkg_name => g_pkg_name,
10683 p_exc_name => 'OKL_API.G_RET_STS_ERROR',
10684 x_msg_count => x_msg_count,
10685 x_msg_data => x_msg_data,
10686 p_api_type => g_api_type);
10687
10688 when OKL_API.G_EXCEPTION_UNEXPECTED_ERROR then
10689 x_return_status := OKL_API.HANDLE_EXCEPTIONS(
10690 p_api_name => l_api_name,
10691 p_pkg_name => g_pkg_name,
10692 p_exc_name => 'OKL_API.G_RET_STS_UNEXP_ERROR',
10693 x_msg_count => x_msg_count,
10694 x_msg_data => x_msg_data,
10695 p_api_type => g_api_type);
10696
10697 when OTHERS then
10698 x_return_status := OKL_API.HANDLE_EXCEPTIONS(
10699 p_api_name => l_api_name,
10700 p_pkg_name => g_pkg_name,
10701 p_exc_name => 'OTHERS',
10702 x_msg_count => x_msg_count,
10703 x_msg_data => x_msg_data,
10704 p_api_type => g_api_type);
10705
10706 END create_disb_streams;
10707
10708
10709 PROCEDURE create_disb_streams(p_api_version IN NUMBER,
10710 p_init_msg_list IN VARCHAR2,
10711 p_contract_id IN NUMBER,
10712 p_pool_status IN VARCHAR2 DEFAULT 'ACTIVE',
10713 x_return_status OUT NOCOPY VARCHAR2,
10714 x_msg_count OUT NOCOPY NUMBER,
10715 x_msg_data OUT NOCOPY VARCHAR2) IS
10716
10717
10718 l_api_name CONSTANT VARCHAR2(61) := 'create_disb_streams';
10719
10720 BEGIN
10721
10722 print( l_api_name, 'begin' );
10723
10724 x_return_status := OKL_API.G_RET_STS_SUCCESS;
10725
10726 x_return_status := OKL_API.START_ACTIVITY(
10727 p_api_name => l_api_name,
10728 p_pkg_name => g_pkg_name,
10729 p_init_msg_list => p_init_msg_list,
10730 l_api_version => p_api_version,
10731 p_api_version => p_api_version,
10732 p_api_type => G_API_TYPE,
10733 x_return_status => x_return_status);
10734
10735 -- check if activity started successfully
10736 If (x_return_status = OKL_API.G_RET_STS_UNEXP_ERROR) then
10737 raise OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
10738 ElSIF (x_return_status = OKL_API.G_RET_STS_ERROR) then
10739 raise OKL_API.G_EXCEPTION_ERROR;
10740 End If;
10741
10742 gen_disbursement_streams(p_api_version => p_api_version,
10743 p_init_msg_list => p_init_msg_list,
10744 p_contract_id => p_contract_id,
10745 p_agreement_id => NULL,
10746 p_pool_status => p_pool_status,
10747 x_return_status => x_return_status,
10748 x_msg_count => x_msg_count,
10749 x_msg_data => x_msg_data);
10750
10751 If (x_return_status = OKL_API.G_RET_STS_UNEXP_ERROR) then
10752 raise OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
10753 ElSIF (x_return_status = OKL_API.G_RET_STS_ERROR) then
10754 raise OKL_API.G_EXCEPTION_ERROR;
10755 End If;
10756
10757 OKL_API.END_ACTIVITY(x_msg_count => x_msg_count, x_msg_data => x_msg_data);
10758 print( l_api_name, 'end' );
10759 Exception
10760
10761 when OKL_API.G_EXCEPTION_ERROR then
10762 x_return_status := OKL_API.HANDLE_EXCEPTIONS(
10763 p_api_name => l_api_name,
10764 p_pkg_name => g_pkg_name,
10765 p_exc_name => 'OKL_API.G_RET_STS_ERROR',
10766 x_msg_count => x_msg_count,
10767 x_msg_data => x_msg_data,
10768 p_api_type => g_api_type);
10769
10770 when OKL_API.G_EXCEPTION_UNEXPECTED_ERROR then
10771 x_return_status := OKL_API.HANDLE_EXCEPTIONS(
10772 p_api_name => l_api_name,
10773 p_pkg_name => g_pkg_name,
10774 p_exc_name => 'OKL_API.G_RET_STS_UNEXP_ERROR',
10775 x_msg_count => x_msg_count,
10776 x_msg_data => x_msg_data,
10777 p_api_type => g_api_type);
10778
10779 when OTHERS then
10780 x_return_status := OKL_API.HANDLE_EXCEPTIONS(
10781 p_api_name => l_api_name,
10782 p_pkg_name => g_pkg_name,
10783 p_exc_name => 'OTHERS',
10784 x_msg_count => x_msg_count,
10785 x_msg_data => x_msg_data,
10786 p_api_type => g_api_type);
10787
10788 END create_disb_streams;
10789
10790 PROCEDURE create_pv_streams(p_api_version IN NUMBER,
10791 p_init_msg_list IN VARCHAR2,
10792 p_agreement_id IN NUMBER,
10793 p_pool_status IN VARCHAR2 DEFAULT 'NEW',
10794 p_mode IN VARCHAR2 DEFAULT NULL,
10795 x_return_status OUT NOCOPY VARCHAR2,
10796 x_msg_count OUT NOCOPY NUMBER,
10797 x_msg_data OUT NOCOPY VARCHAR2) IS
10798
10799
10800 l_api_name CONSTANT VARCHAR2(61) := 'create_pv_streams';
10801
10802 BEGIN
10803
10804 print( l_api_name, 'begin' );
10805
10806 x_return_status := OKL_API.G_RET_STS_SUCCESS;
10807
10808 x_return_status := OKL_API.START_ACTIVITY(
10809 p_api_name => l_api_name,
10810 p_pkg_name => g_pkg_name,
10811 p_init_msg_list => p_init_msg_list,
10812 l_api_version => p_api_version,
10813 p_api_version => p_api_version,
10814 p_api_type => G_API_TYPE,
10815 x_return_status => x_return_status);
10816
10817 -- check if activity started successfully
10818 If (x_return_status = OKL_API.G_RET_STS_UNEXP_ERROR) then
10819 raise OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
10820 ElSIF (x_return_status = OKL_API.G_RET_STS_ERROR) then
10821 raise OKL_API.G_EXCEPTION_ERROR;
10822 End If;
10823
10824 gen_pv_disb_streams(p_api_version => p_api_version,
10825 p_init_msg_list => p_init_msg_list,
10826 p_contract_id => NULL,
10827 p_agreement_id => p_agreement_id,
10828 p_pool_status => p_pool_status,
10829 p_mode => p_mode,
10830 x_return_status => x_return_status,
10831 x_msg_count => x_msg_count,
10832 x_msg_data => x_msg_data);
10833
10834 If (x_return_status = OKL_API.G_RET_STS_UNEXP_ERROR) then
10835 raise OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
10836 ElSIF (x_return_status = OKL_API.G_RET_STS_ERROR) then
10837 raise OKL_API.G_EXCEPTION_ERROR;
10838 End If;
10839
10840 OKL_API.END_ACTIVITY(x_msg_count => x_msg_count, x_msg_data => x_msg_data);
10841 print( l_api_name, 'end' );
10842 Exception
10843
10844 when OKL_API.G_EXCEPTION_ERROR then
10845 x_return_status := OKL_API.HANDLE_EXCEPTIONS(
10846 p_api_name => l_api_name,
10847 p_pkg_name => g_pkg_name,
10848 p_exc_name => 'OKL_API.G_RET_STS_ERROR',
10849 x_msg_count => x_msg_count,
10850 x_msg_data => x_msg_data,
10851 p_api_type => g_api_type);
10852
10853 when OKL_API.G_EXCEPTION_UNEXPECTED_ERROR then
10854 x_return_status := OKL_API.HANDLE_EXCEPTIONS(
10855 p_api_name => l_api_name,
10856 p_pkg_name => g_pkg_name,
10857 p_exc_name => 'OKL_API.G_RET_STS_UNEXP_ERROR',
10858 x_msg_count => x_msg_count,
10859 x_msg_data => x_msg_data,
10860 p_api_type => g_api_type);
10861
10862 when OTHERS then
10863 x_return_status := OKL_API.HANDLE_EXCEPTIONS(
10864 p_api_name => l_api_name,
10865 p_pkg_name => g_pkg_name,
10866 p_exc_name => 'OTHERS',
10867 x_msg_count => x_msg_count,
10868 x_msg_data => x_msg_data,
10869 p_api_type => g_api_type);
10870
10871 END create_pv_streams;
10872
10873
10874 PROCEDURE create_pv_streams(p_api_version IN NUMBER,
10875 p_init_msg_list IN VARCHAR2,
10876 p_contract_id IN NUMBER,
10877 p_pool_status IN VARCHAR2 DEFAULT 'ACTIVE',
10878 x_return_status OUT NOCOPY VARCHAR2,
10879 x_msg_count OUT NOCOPY NUMBER,
10880 x_msg_data OUT NOCOPY VARCHAR2) IS
10881
10882
10883 l_api_name CONSTANT VARCHAR2(61) := 'create_pv_streams';
10884
10885 BEGIN
10886
10887 print( l_api_name, 'begin' );
10888
10889 x_return_status := OKL_API.G_RET_STS_SUCCESS;
10890
10891 x_return_status := OKL_API.START_ACTIVITY(
10892 p_api_name => l_api_name,
10893 p_pkg_name => g_pkg_name,
10894 p_init_msg_list => p_init_msg_list,
10895 l_api_version => p_api_version,
10896 p_api_version => p_api_version,
10897 p_api_type => G_API_TYPE,
10898 x_return_status => x_return_status);
10899
10900 -- check if activity started successfully
10901 If (x_return_status = OKL_API.G_RET_STS_UNEXP_ERROR) then
10902 raise OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
10903 ElSIF (x_return_status = OKL_API.G_RET_STS_ERROR) then
10904 raise OKL_API.G_EXCEPTION_ERROR;
10905 End If;
10906
10907 gen_pv_disb_streams(p_api_version => p_api_version,
10908 p_init_msg_list => p_init_msg_list,
10909 p_contract_id => p_contract_id,
10910 p_agreement_id => NULL,
10911 p_pool_status => p_pool_status,
10912 x_return_status => x_return_status,
10913 x_msg_count => x_msg_count,
10914 x_msg_data => x_msg_data);
10915
10916 If (x_return_status = OKL_API.G_RET_STS_UNEXP_ERROR) then
10917 raise OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
10918 ElSIF (x_return_status = OKL_API.G_RET_STS_ERROR) then
10919 raise OKL_API.G_EXCEPTION_ERROR;
10920 End If;
10921
10922 OKL_API.END_ACTIVITY(x_msg_count => x_msg_count, x_msg_data => x_msg_data);
10923 print( l_api_name, 'end' );
10924 Exception
10925
10926 when OKL_API.G_EXCEPTION_ERROR then
10927 x_return_status := OKL_API.HANDLE_EXCEPTIONS(
10928 p_api_name => l_api_name,
10929 p_pkg_name => g_pkg_name,
10930 p_exc_name => 'OKL_API.G_RET_STS_ERROR',
10931 x_msg_count => x_msg_count,
10932 x_msg_data => x_msg_data,
10933 p_api_type => g_api_type);
10934
10935 when OKL_API.G_EXCEPTION_UNEXPECTED_ERROR then
10936 x_return_status := OKL_API.HANDLE_EXCEPTIONS(
10937 p_api_name => l_api_name,
10938 p_pkg_name => g_pkg_name,
10939 p_exc_name => 'OKL_API.G_RET_STS_UNEXP_ERROR',
10940 x_msg_count => x_msg_count,
10941 x_msg_data => x_msg_data,
10942 p_api_type => g_api_type);
10943
10944 when OTHERS then
10945 x_return_status := OKL_API.HANDLE_EXCEPTIONS(
10946 p_api_name => l_api_name,
10947 p_pkg_name => g_pkg_name,
10948 p_exc_name => 'OTHERS',
10949 x_msg_count => x_msg_count,
10950 x_msg_data => x_msg_data,
10951 p_api_type => g_api_type);
10952
10953 END create_pv_streams;
10954
10955 PROCEDURE get_line_principal_bal( p_api_version IN NUMBER,
10956 p_init_msg_list IN VARCHAR2,
10957 p_khr_id IN NUMBER,
10958 p_kle_id IN NUMBER,
10959 p_date IN DATE,
10960 x_principal_balance OUT NOCOPY NUMBER,
10961 x_accumulated_int OUT NOCOPY NUMBER,
10962 x_return_status OUT NOCOPY VARCHAR2,
10963 x_msg_count OUT NOCOPY NUMBER,
10964 x_msg_data OUT NOCOPY VARCHAR2) IS
10965
10966
10967 CURSOR c_hdr IS
10968 SELECT nvl(khr.implicit_interest_rate, 0),
10969 khr.deal_type
10970 FROM okc_k_headers_b chr,
10971 okl_k_headers khr
10972 WHERE khr.id = p_khr_id
10973 AND chr.id = khr.id;
10974
10975 r_hdr c_hdr%ROWTYPE;
10976
10977
10978 CURSOR c_pbal IS
10979 SELECT ele.amount,
10980 ele.stream_element_date
10981 FROM okl_streams stm,
10982 okl_strm_elements ele,
10983 okl_strm_type_b sty
10984 WHERE sty.stream_type_purpose = 'PRINCIPAL_BALANCE'
10985 AND stm.sty_id = sty.id
10986 AND stm.khr_id = p_khr_id
10987 AND stm.kle_id = p_kle_id
10988 AND stm.say_code = 'CURR'
10989 AND stm.active_yn = 'Y'
10990 AND ele.stm_id = stm.id
10991 AND ele.stream_element_date =
10992 ( SELECT max( ele.stream_element_date)
10993 FROM okl_streams stm,
10994 okl_strm_elements ele,
10995 okl_strm_type_b sty
10996 WHERE sty.stream_type_purpose = 'PRINCIPAL_BALANCE'
10997 AND stm.sty_id = sty.id
10998 AND stm.khr_id = p_khr_id
10999 AND stm.kle_id = p_kle_id
11000 AND stm.say_code = 'CURR'
11001 AND stm.active_yn = 'Y'
11002 AND ele.stm_id = stm.id
11003 AND ele.stream_element_date <= p_date );
11004
11005 r_pbal c_pbal%ROWTYPE;
11006
11007 CURSOR c_inflows ( styId NUMBER) IS
11008 SELECT DISTINCT
11009 sll.object1_id1 frequency,
11010 nvl(sll.rule_information10, 'N') advance_arrears
11011 FROM okc_rules_b sll,
11012 okc_rules_b slh,
11013 okc_rule_groups_b rgp
11014 WHERE rgp.rgd_code = 'LALEVL'
11015 AND rgp.id = slh.rgp_id
11016 AND slh.rule_information_category = 'LASLH'
11017 AND slh.object1_id1 = styId
11018 AND slh.id = sll.object2_id1
11019 AND sll.rule_information_category = 'LASLL'
11020 AND sll.dnz_chr_id = p_khr_id
11021 AND rgp.cle_id = p_kle_id;
11022
11023 r_inflows c_inflows%ROWTYPE;
11024
11025 l_iir NUMBER;
11026 l_days NUMBER;
11027 l_principal_balance NUMBER;
11028 l_principal_bal_date DATE;
11029 l_accumulated_int NUMBER;
11030
11031
11032 Cursor fee_type_csr IS
11033 Select 'Y' What
11034 from dual where Exists(
11035 SELECT nvl(kle.fee_type, 'XYZ'),
11036 nvl(lse.lty_code, 'XYZ')
11037 FROM okc_k_lines_b cle,
11038 okl_k_lines kle,
11039 okc_line_styles_b lse
11040 WHERE cle.dnz_chr_id = p_khr_id
11041 AND cle.sts_code IN ('PASSED', 'COMPLETE', 'TERMINATED')
11042 AND cle.lse_id = lse.id
11043 AND (kle.fee_type = 'FINANCED' OR kle.fee_type = 'ROLLOVER' OR lse.lty_code = 'LINK_FEE_ASSET')
11044 AND cle.id = kle.id
11045 AND cle.id = p_kle_id);
11046
11047
11048 fee_type_rec fee_type_csr%ROWTYPe;
11049
11050
11051 l_stream_name VARCHAR2(256);
11052 l_sty_id NUMBER;
11053
11054 cursor fee_strm_type_csr is
11055 SELECT sty.id
11056 FROM okc_rules_b sll,
11057 okc_rules_b slh,
11058 okc_rule_groups_b rgp,
11059 okl_strm_type_b sty
11060 WHERE rgp.dnz_chr_id = p_khr_id
11061 AND rgp.cle_id = p_kle_id
11062 AND rgp.rgd_code= 'LALEVL'
11063 AND rgp.id = slh.rgp_id
11064 AND slh.rule_information_category = 'LASLH'
11065 AND slh.object1_id1 = TO_CHAR(sty.id)
11066 AND TO_CHAR(slh.id) = sll.object2_id1
11067 AND sll.rule_information_category = 'LASLL'
11068 ORDER BY fnd_date.canonical_to_date(sll.rule_information2);
11069
11070 l_deal_type VARCHAR2(30);
11071
11072 l_api_name CONSTANT VARCHAR2(61) := 'GET_SCHED_PRINCIPAL_BAL';
11073
11074 l_day_convention_month VARCHAR2(30);
11075 l_day_convention_year VARCHAR2(30);
11076
11077 Begin
11078
11079 print( l_api_name, 'end' );
11080
11081 OPEN c_pbal;
11082 FETCH c_pbal INTO r_pbal;
11083 CLOSE c_pbal;
11084
11085 l_principal_balance := nvl( r_pbal.amount, 0 );
11086 l_principal_bal_date := nvl( r_pbal.stream_element_date, p_date );
11087
11088 print( l_api_name, ' prince date ' || to_char( l_principal_bal_date) );
11089 OPEN c_hdr;
11090 FETCH c_hdr INTO l_iir, l_deal_type;
11091 CLOSE c_hdr;
11092 l_iir := l_iir/100.0;
11093
11094 OPEN fee_type_csr;
11095 FETCH fee_type_csr INTO fee_type_rec;
11096 CLOSE fee_type_csr;
11097
11098 If nvl(fee_type_rec.What, 'N') = 'Y' Then
11099
11100 OPEN fee_strm_type_csr;
11101 FETCH fee_strm_type_csr INTO l_sty_id;
11102 CLOSE fee_strm_type_csr;
11103
11104 Else
11105 OKL_ISG_UTILS_PVT.get_primary_stream_type(
11106 p_khr_id => p_khr_id,
11107 p_deal_type => l_deal_type,
11108 p_primary_sty_purpose => 'RENT',
11109 x_return_status => x_return_status,
11110 x_primary_sty_id => l_sty_id,
11111 x_primary_sty_name => l_stream_name);
11112
11113 IF (x_return_status = G_RET_STS_UNEXP_ERROR) THEN
11114 RAISE OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
11115 ELSIF (x_return_status = G_RET_STS_ERROR) THEN
11116 RAISE OKL_API.G_EXCEPTION_ERROR;
11117 END IF;
11118 --l_stream_name := 'RENT';
11119 End If;
11120
11121 OPEN c_inflows ( l_sty_id );
11122 FETCH c_inflows INTO r_inflows;
11123 CLOSE c_inflows;
11124
11125 print( l_api_name, ' bal datae ' || to_char( l_principal_bal_date ), x_return_status );
11126 print( l_api_name, ' p_days ' || to_char( p_date ), x_return_status );
11127
11128 -- Fetch the day convention ..
11129 OKL_PRICING_UTILS_PVT.get_day_convention(
11130 p_id => p_khr_id,
11131 p_source => 'ISG',
11132 x_days_in_month => l_day_convention_month,
11133 x_days_in_year => l_day_convention_year,
11134 x_return_status => x_return_status);
11135 print( 'get_line_principal_bal', 'Month / Year = ' || l_day_convention_month || '/' || l_day_convention_year );
11136 IF (x_return_status = G_RET_STS_UNEXP_ERROR) THEN
11137 RAISE OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
11138 ELSIF (x_return_status = G_RET_STS_ERROR) THEN
11139 RAISE OKL_API.G_EXCEPTION_ERROR;
11140 END IF;
11141 l_days := OKL_PRICING_UTILS_PVT.get_day_count (p_start_date => trunc(l_principal_bal_date),
11142 p_days_in_month => l_day_convention_month,
11143 p_days_in_year => l_day_convention_year,
11144 p_end_date => trunc(p_date),
11145 p_arrears => r_inflows.advance_arrears,
11146 x_return_status => x_return_status);
11147
11148 print( l_api_name, ' n days ' || to_char( l_days), x_return_status );
11149
11150 IF x_return_status = OKL_API.G_RET_STS_UNEXP_ERROR THEN
11151 RAISE OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
11152 ELSIF x_return_status = OKL_API.G_RET_STS_ERROR THEN
11153 RAISE OKL_API.G_EXCEPTION_ERROR;
11154 END IF;
11155
11156 l_accumulated_int := l_principal_balance * l_days * l_iir/360;
11157
11158 x_principal_balance := l_principal_balance;
11159 x_accumulated_int := l_accumulated_int;
11160
11161 print( l_api_name, ' line ' || to_char(p_kle_id) );
11162 print( l_api_name, ' iir ' || to_char(l_iir) );
11163 print( l_api_name, ' prince ' || to_char(l_principal_balance) );
11164 print( l_api_name, ' days ' || to_char(l_days) );
11165 print( l_api_name, ' accu ' || to_char(l_accumulated_int) );
11166
11167 print( l_api_name, 'end');
11168 EXCEPTION
11169
11170 WHEN OKL_API.G_EXCEPTION_ERROR THEN
11171
11172 x_return_status := G_RET_STS_ERROR;
11173
11174 WHEN OKL_API.G_EXCEPTION_UNEXPECTED_ERROR THEN
11175
11176 x_return_status := G_RET_STS_UNEXP_ERROR;
11177
11178 WHEN OTHERS THEN
11179
11180 OKL_API.SET_MESSAGE (p_app_name => G_APP_NAME,
11181 p_msg_name => G_DB_ERROR,
11182 p_token1 => G_PROG_NAME_TOKEN,
11183 p_token1_value => l_api_name,
11184 p_token2 => G_SQLCODE_TOKEN,
11185 p_token2_value => sqlcode,
11186 p_token3 => G_SQLERRM_TOKEN,
11187 p_token3_value => sqlerrm);
11188
11189 x_return_status := G_RET_STS_UNEXP_ERROR;
11190
11191 End get_line_principal_bal;
11192
11193 PROCEDURE get_sched_principal_bal( p_api_version IN NUMBER,
11194 p_init_msg_list IN VARCHAR2,
11195 p_khr_id IN NUMBER,
11196 p_kle_id IN NUMBER DEFAULT NULL,
11197 p_date IN DATE,
11198 x_principal_balance OUT NOCOPY NUMBER,
11199 x_accumulated_int OUT NOCOPY NUMBER,
11200 x_return_status OUT NOCOPY VARCHAR2,
11201 x_msg_count OUT NOCOPY NUMBER,
11202 x_msg_data OUT NOCOPY VARCHAR2) IS
11203
11204 cursor l_line_csr IS
11205 select kle.id
11206 from okl_k_lines_full_v kle,
11207 okc_line_styles_b lse,
11208 okc_statuses_b sts
11209 where KLE.LSE_ID = LSE.ID
11210 and lse.lty_code in ('FREE_FORM1', 'FEE')
11211 AND nvl(kle.fee_type,'-99') in ( '-99', 'FINANCED', 'ROLLOVER')
11212 and kle.dnz_chr_id = p_khr_id
11213 and sts.code = kle.sts_code
11214 and sts.ste_code not in ('HOLD', 'TERMINATED', 'EXPIRED', 'CANCELLED');
11215
11216 l_line_rec l_line_csr%ROWTYPE;
11217
11218 l_principal_balance NUMBER;
11219 l_principal_bal_date DATE;
11220 l_accumulated_int NUMBER;
11221
11222 l_api_name CONSTANT VARCHAR2(61) := 'GET_SCHED_PRINCIPAL_BAL';
11223
11224 Begin
11225
11226 print( l_api_name, 'begin');
11227 If (p_kle_id IS NOT NULL ) Then
11228
11229 get_line_principal_bal( p_api_version => p_api_version,
11230 p_init_msg_list => p_init_msg_list,
11231 p_khr_id => p_khr_id,
11232 p_kle_id => p_kle_id,
11233 p_date => p_date,
11234 x_principal_balance => x_principal_balance,
11235 x_accumulated_int => x_accumulated_int,
11236 x_return_status => x_return_status,
11237 x_msg_count => x_msg_count,
11238 x_msg_data => x_msg_data);
11239
11240 IF x_return_status = OKL_API.G_RET_STS_UNEXP_ERROR THEN
11241 RAISE OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
11242 ELSIF x_return_status = OKL_API.G_RET_STS_ERROR THEN
11243 RAISE OKL_API.G_EXCEPTION_ERROR;
11244 END IF;
11245
11246 return;
11247
11248 End If;
11249
11250 l_principal_balance := 0;
11251 l_accumulated_int := 0;
11252
11253 FOR l_line_rec IN l_line_csr
11254 LOOP
11255
11256 get_line_principal_bal( p_api_version => p_api_version,
11257 p_init_msg_list => p_init_msg_list,
11258 p_khr_id => p_khr_id,
11259 p_kle_id => l_line_rec.id,
11260 p_date => p_date,
11261 x_principal_balance => x_principal_balance,
11262 x_accumulated_int => x_accumulated_int,
11263 x_return_status => x_return_status,
11264 x_msg_count => x_msg_count,
11265 x_msg_data => x_msg_data);
11266
11267 IF x_return_status = OKL_API.G_RET_STS_UNEXP_ERROR THEN
11268 RAISE OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
11269 ELSIF x_return_status = OKL_API.G_RET_STS_ERROR THEN
11270 RAISE OKL_API.G_EXCEPTION_ERROR;
11271 END IF;
11272
11273 l_principal_balance := l_principal_balance + x_principal_balance;
11274 l_accumulated_int := l_accumulated_int + x_accumulated_int;
11275
11276 END LOOP;
11277
11278 x_principal_balance := l_principal_balance;
11279 x_accumulated_int := l_accumulated_int;
11280
11281 print( l_api_name, 'end');
11282
11283 EXCEPTION
11284
11285 WHEN OKL_API.G_EXCEPTION_ERROR THEN
11286
11287 x_return_status := G_RET_STS_ERROR;
11288
11289 WHEN OKL_API.G_EXCEPTION_UNEXPECTED_ERROR THEN
11290
11291 x_return_status := G_RET_STS_UNEXP_ERROR;
11292
11293 WHEN OTHERS THEN
11294
11295 OKL_API.SET_MESSAGE (p_app_name => G_APP_NAME,
11296 p_msg_name => G_DB_ERROR,
11297 p_token1 => G_PROG_NAME_TOKEN,
11298 p_token1_value => l_api_name,
11299 p_token2 => G_SQLCODE_TOKEN,
11300 p_token2_value => sqlcode,
11301 p_token3 => G_SQLERRM_TOKEN,
11302 p_token3_value => sqlerrm);
11303
11304 x_return_status := G_RET_STS_UNEXP_ERROR;
11305
11306 End get_sched_principal_bal;
11307
11308 PROCEDURE get_next_billing_date( p_api_version IN NUMBER,
11309 p_init_msg_list IN VARCHAR2,
11310 p_khr_id IN NUMBER,
11311 p_billing_date IN DATE DEFAULT NULL,
11312 x_next_due_date OUT NOCOPY DATE,
11313 x_next_period_start_date OUT NOCOPY DATE,
11314 x_next_period_end_date OUT NOCOPY DATE,
11315 x_return_status OUT NOCOPY VARCHAR2,
11316 x_msg_count OUT NOCOPY NUMBER,
11317 x_msg_data OUT NOCOPY VARCHAR2) IS
11318
11319
11320 --Added order by rul2.rule_information2 by djanaswa for bug 6007644
11321 CURSOR l_varint_sll_csr( khrid NUMBER ) IS
11322 SELECT TO_NUMBER(NULL) cle_id,
11323 TO_NUMBER(rul1.object1_id1) sty_id,
11324 FND_DATE.canonical_to_date(rul2.rule_information2) start_date,
11325 TO_NUMBER(rul2.rule_information3) periods,
11326 rul2.object1_id1 frequency,
11327 rul2.rule_information5 structure,
11328 DECODE(rul2.rule_information10, 'Y', 'ARREARS', 'ADVANCE') advance_arrears,
11329 FND_NUMBER.canonical_to_number(rul2.rule_information6) amount,
11330 TO_NUMBER(rul2.rule_information7) stub_days,
11331 TO_NUMBER(rul2.rule_information8) stub_amount,
11332 NULL lty_code,
11333 TO_NUMBER(NULL) capital_amount,
11334 TO_NUMBER(NULL) residual_value
11335 FROM okc_rule_groups_b rgp,
11336 okc_rules_b rul1,
11337 okc_rules_b rul2,
11338 okl_strm_type_b sty
11339 WHERE rul2.dnz_chr_id = khrid
11340 AND rul2.rule_information_category = 'LASLL'
11341 AND rul2.rgp_id = rgp.id
11342 AND rgp.cle_id IS NULL
11343 AND TO_NUMBER(rul2.object2_id1) = rul1.id
11344 AND TO_NUMBER(rul1.object1_id1) = sty.id
11345 AND sty.stream_type_purpose = 'VARIABLE_INTEREST_SCHEDULE'
11346 ORDER BY FND_DATE.canonical_to_date(rul2.rule_information2);
11347
11348 l_varint_sll_rec l_varint_sll_csr%ROWTYPE;
11349
11350 l_advance_or_arrears VARCHAR2(10) := 'ARREARS';
11351
11352 Cursor l_strms_csr ( chrId NUMBER, styId NUMBER ) IS
11353 Select str.id strm_id
11354 From okl_streams str
11355 Where str.sty_id = styId
11356 and str.khr_id = chrId
11357 and str.say_code = 'WORK';
11358
11359 l_strms_rec l_strms_csr%ROWTYPE;
11360
11361 CURSOR c_hdr IS
11362 SELECT chr.template_yn,
11363 chr.currency_code,
11364 chr.start_date,
11365 chr.end_date,
11366 khr.deal_type,
11367 khr.term_duration,
11368 NVL(khr.generate_accrual_yn, 'Y')
11369 FROM okc_k_headers_b chr,
11370 okl_k_headers khr
11371 WHERE khr.id = p_khr_id
11372 AND chr.id = khr.id;
11373
11374 l_hdr c_hdr%ROWTYPE;
11375 l_deal_type VARCHAR2(30);
11376 l_purpose_code VARCHAR2(30);
11377
11378 l_sty_id NUMBER;
11379 l_sty_name VARCHAR2(150);
11380 l_mapped_sty_name VARCHAR2(150);
11381
11382 l_selv_tbl okl_streams_pub.selv_tbl_type;
11383 l_pt_tbl okl_streams_pub.selv_tbl_type;
11384 lx_selv_tbl okl_streams_pub.selv_tbl_type;
11385
11386 l_stmv_rec okl_streams_pub.stmv_rec_type;
11387 l_stmv_tbl okl_streams_pub.stmv_tbl_type;
11388 lx_stmv_tbl okl_streams_pub.stmv_tbl_type;
11389 x_stmv_tbl okl_streams_pub.stmv_tbl_type;
11390 l_pt_rec okl_streams_pub.stmv_rec_type;
11391 lx_stmv_rec okl_streams_pub.stmv_rec_type;
11392
11393 i BINARY_INTEGER := 0;
11394
11395 l_api_name CONSTANT VARCHAR2(61) := 'GET_NEXT_BILL_DATE';
11396
11397 --Added by djanaswa for bug 6007644
11398 l_recurrence_date DATE := NULL;
11399 --end djanaswa
11400
11401 BEGIN
11402
11403 print( l_api_name, 'begin' );
11404
11405 x_return_status := OKL_API.G_RET_STS_SUCCESS;
11406
11407 x_return_status := OKL_API.START_ACTIVITY(
11408 p_api_name => l_api_name,
11409 p_pkg_name => g_pkg_name,
11410 p_init_msg_list => p_init_msg_list,
11411 l_api_version => p_api_version,
11412 p_api_version => p_api_version,
11413 p_api_type => G_API_TYPE,
11414 x_return_status => x_return_status);
11415
11416 -- check if activity started successfully
11417 If (x_return_status = OKL_API.G_RET_STS_UNEXP_ERROR) then
11418 raise OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
11419 ElSIF (x_return_status = OKL_API.G_RET_STS_ERROR) then
11420 raise OKL_API.G_EXCEPTION_ERROR;
11421 End If;
11422
11423 /*
11424 get_sty_details (p_sty_name => 'VARIABLE INTEREST SCHEDULE',
11425 x_sty_id => l_sty_id,
11426 x_sty_name => l_sty_name,
11427 x_return_status => x_return_status);
11428
11429 IF x_return_status = OKL_API.G_RET_STS_UNEXP_ERROR THEN
11430 RAISE OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
11431 ELSIF x_return_status = OKL_API.G_RET_STS_ERROR THEN
11432 RAISE OKL_API.G_EXCEPTION_ERROR;
11433 END IF;
11434
11435 */
11436 OPEN c_hdr;
11437 FETCH c_hdr INTO l_hdr;
11438 CLOSE c_hdr;
11439
11440 x_next_due_date := NULL;
11441 x_next_period_end_date := NULL;
11442
11443 FOR l_varint_sll_rec in l_varint_sll_csr( p_khr_id )
11444 LOOP
11445
11446 IF ( lx_selv_tbl.COUNT > 0 ) Then
11447 lx_selv_tbl.delete;
11448 END IF;
11449
11450 --Added by djanaswa for bug 6007644
11451 IF((l_varint_sll_rec.periods IS NULL) AND (l_varint_sll_rec.stub_days IS NOT NULL)) THEN
11452 --Set the recurrence date to null for stub payment
11453 l_recurrence_date := NULL;
11454 ELSIF(l_recurrence_date IS NULL) THEN
11455 --Set the recurrence date as periodic payment level start date
11456 l_recurrence_date := l_varint_sll_rec.start_date;
11457 END IF;
11458 --end djanaswa
11459
11460 --Added parameter p_recurrence_date by djanaswa for bug 6007644
11461 get_stream_elements(
11462 p_start_date => l_varint_sll_rec.start_date,
11463 p_periods => l_varint_sll_rec.periods,
11464 p_frequency => l_varint_sll_rec.frequency,
11465 p_structure => l_varint_sll_rec.structure,
11466 p_advance_or_arrears => l_varint_sll_rec.advance_arrears,
11467 p_amount => l_varint_sll_rec.amount,
11468 p_stub_days => l_varint_sll_rec.stub_days,
11469 p_stub_amount => l_varint_sll_rec.stub_amount,
11470 p_currency_code => l_hdr.currency_code,
11471 p_khr_id => p_khr_id,
11472 p_kle_id => NULL,
11473 p_purpose_code => NULL,
11474 x_selv_tbl => lx_selv_tbl,
11475 x_pt_tbl => l_pt_tbl,
11476 x_return_status => x_return_status,
11477 x_msg_count => x_msg_count,
11478 x_msg_data => x_msg_data,
11479 p_recurrence_date => l_recurrence_date);
11480
11481 IF x_return_status = OKL_API.G_RET_STS_UNEXP_ERROR THEN
11482 RAISE OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
11483 ELSIF x_return_status = OKL_API.G_RET_STS_ERROR THEN
11484 RAISE OKL_API.G_EXCEPTION_ERROR;
11485 END IF;
11486
11487 FOR i in 1..lx_selv_tbl.COUNT
11488 LOOP
11489
11490 If trunc(lx_selv_tbl(i).stream_element_date) > trunc(nvl(p_billing_date, (l_hdr.start_date-1)))Then
11491
11492 If ( x_next_due_date IS NULL ) Then
11493
11494 x_next_due_date := lx_selv_tbl(i).stream_element_date;
11495 if ( l_varint_sll_Rec.advance_arrears = 'ADVANCE' ) Then
11496 x_next_period_start_date := lx_selv_tbl(i).stream_element_date;
11497 If ( i < lx_selv_tbl.COUNT ) Then
11498 x_next_period_end_date := lx_selv_tbl(i+1).stream_element_date - 1;
11499 IF TO_CHAR(x_next_period_end_date, 'DD') = '31' OR
11500 (TO_CHAR(x_next_period_end_date, 'MON') = 'FEB' AND
11501 TO_CHAR(x_next_period_end_date, 'DD') = '29') THEN
11502 x_next_period_end_date := x_next_period_end_date - 1;
11503 END IF;
11504 return;
11505 End If;
11506 Else
11507 x_next_period_end_date := lx_selv_tbl(i).stream_element_date;
11508 If ( i > 1 ) Then
11509 x_next_period_start_date := lx_selv_tbl(i-1).stream_element_date + 1;
11510 Else
11511 x_next_period_start_date := l_hdr.start_date;
11512 End If;
11513 IF TO_CHAR(x_next_period_start_date, 'DD') = '31' OR
11514 (TO_CHAR(x_next_period_start_date, 'MON') = 'FEB' AND
11515 TO_CHAR(x_next_period_start_date, 'DD') = '29') THEN
11516 x_next_period_start_date := x_next_period_start_date + 1;
11517 END IF;
11518 return;
11519 End If;
11520
11521 Else
11522 x_next_period_end_date := lx_selv_tbl(i).stream_element_date - 1;
11523 IF TO_CHAR(x_next_period_end_date, 'DD') = '31' OR
11524 (TO_CHAR(x_next_period_end_date, 'MON') = 'FEB' AND
11525 TO_CHAR(x_next_period_end_date, 'DD') = '29') THEN
11526 x_next_period_end_date := x_next_period_end_date - 1;
11527 END IF;
11528 return;
11529 ENd If;
11530
11531 End If;
11532
11533 END LOOP;
11534
11535 END LOOP;
11536
11537 if(x_next_period_end_date IS NULL) Then
11538 x_next_period_end_date := l_hdr.end_date;
11539 End If;
11540
11541 OKL_API.END_ACTIVITY(x_msg_count => x_msg_count, x_msg_data => x_msg_data);
11542 print( l_api_name, 'end' );
11543
11544 Exception
11545
11546 when OKL_API.G_EXCEPTION_ERROR then
11547 x_return_status := OKL_API.HANDLE_EXCEPTIONS(
11548 p_api_name => l_api_name,
11549 p_pkg_name => g_pkg_name,
11550 p_exc_name => 'OKL_API.G_RET_STS_ERROR',
11551 x_msg_count => x_msg_count,
11552 x_msg_data => x_msg_data,
11553 p_api_type => g_api_type);
11554
11555 when OKL_API.G_EXCEPTION_UNEXPECTED_ERROR then
11556 x_return_status := OKL_API.HANDLE_EXCEPTIONS(
11557 p_api_name => l_api_name,
11558 p_pkg_name => g_pkg_name,
11559 p_exc_name => 'OKL_API.G_RET_STS_UNEXP_ERROR',
11560 x_msg_count => x_msg_count,
11561 x_msg_data => x_msg_data,
11562 p_api_type => g_api_type);
11563
11564 when OTHERS then
11565 x_return_status := OKL_API.HANDLE_EXCEPTIONS(
11566 p_api_name => l_api_name,
11567 p_pkg_name => g_pkg_name,
11568 p_exc_name => 'OTHERS',
11569 x_msg_count => x_msg_count,
11570 x_msg_data => x_msg_data,
11571 p_api_type => g_api_type);
11572
11573 x_return_status := G_RET_STS_UNEXP_ERROR;
11574
11575 end get_next_billing_date;
11576
11577
11578 /** gboomina created GEN_CASH_FLOWS_FOR_IA API for Bug 6763287
11579 ------------------------------------------------------------------
11580 PROCEDURE GEN_CASH_FLOWS_FOR_IA
11581 ------------------------------------------------------------------
11582 Description: This procedure is used to generate streams for Fees defined in
11583 Investor Agreement
11584 **/
11585
11586 PROCEDURE gen_cash_flows_for_IA( p_api_version IN NUMBER
11587 , p_init_msg_list IN VARCHAR2
11588 , p_khr_id IN NUMBER
11589 , x_return_status OUT NOCOPY VARCHAR2
11590 , x_msg_count OUT NOCOPY NUMBER
11591 , x_msg_data OUT NOCOPY VARCHAR2
11592 )
11593 IS
11594 CURSOR c_inflows IS
11595 SELECT rgp.cle_id cle_id,
11596 TO_NUMBER(rul1.object1_id1) sty_id,
11597 FND_DATE.canonical_to_date(rul2.rule_information2) start_date,
11598 TO_NUMBER(rul2.rule_information3) periods,
11599 rul2.object1_id1 frequency,
11600 rul2.rule_information5 structure,
11601 DECODE(rul2.rule_information10, 'Y', 'ARREARS', 'ADVANCE') advance_arrears,
11602 FND_NUMBER.canonical_to_number(rul2.rule_information6) amount,
11603 TO_NUMBER(rul2.rule_information7) stub_days,
11604 TO_NUMBER(rul2.rule_information8) stub_amount,
11605 lse.lty_code lty_code,
11606 kle.capital_amount capital_amount,
11607 kle.residual_value residual_value,
11608 kle.fee_type fee_type
11609 FROM okc_rule_groups_b rgp,
11610 okc_rules_b rul1,
11611 okc_rules_b rul2,
11612 okc_k_lines_b cle,
11613 okl_k_lines kle,
11614 okc_line_styles_b lse
11615 WHERE
11616 rul2.dnz_chr_id = p_khr_id
11617 AND rul2.rule_information_category = 'LASLL'
11618 AND rul1.rule_information_category = 'LASLH'
11619 AND rul1.jtot_object1_code = 'OKL_STRMTYP'
11620 AND rul2.rgp_id = rgp.id
11621 AND TO_NUMBER(rul2.object2_id1) = rul1.id
11622 AND rgp.cle_id = cle.id
11623 AND cle.id = kle.id
11624 AND cle.lse_id = lse.id
11625 ORDER BY cle_id, sty_id, start_date;
11626
11627 l_inflow c_inflows%rowtype;
11628
11629 CURSOR c_hdr IS
11630 SELECT chr.currency_code
11631 FROM okc_k_headers_b chr
11632 WHERE chr.id = p_khr_id;
11633
11634 l_curreny_code okc_k_headers_all_b.currency_code%type;
11635
11636 l_recurrence_date DATE := NULL;
11637 l_old_cle_id NUMBER;
11638 l_old_sty_id NUMBER;
11639 l_purpose_code VARCHAR2(30);
11640
11641 l_pt_tbl okl_streams_pub.selv_tbl_type;
11642 l_pt_pro_fee_tbl okl_streams_pub.selv_tbl_type;
11643
11644 l_selv_tbl okl_streams_pub.selv_tbl_type;
11645 lx_selv_tbl okl_streams_pub.selv_tbl_type;
11646
11647 l_stmv_rec okl_streams_pub.stmv_rec_type;
11648 l_stmv_tbl Okl_Streams_Pub.stmv_tbl_type;
11649 lx_stmv_tbl Okl_Streams_Pub.stmv_tbl_type;
11650
11651 l_full_selv_tbl Okl_Streams_Pub.selv_tbl_type;
11652 lx_full_selv_tbl Okl_Streams_Pub.selv_tbl_type;
11653
11654 l_prog_name CONSTANT VARCHAR2(61) := G_PKG_NAME||'.'||'gen_cash_flows_for_IA';
11655
11656 BEGIN
11657
11658 -- Generate streams for the payments
11659 FOR l_inflow IN c_inflows LOOP
11660 IF l_inflow.start_date IS NULL THEN
11661 OKL_API.SET_MESSAGE ( p_app_name => G_APP_NAME
11662 , p_msg_name => 'OKL_NO_SLL_SDATE');
11663 RAISE OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
11664 END IF;
11665
11666 IF((l_inflow.periods IS NULL) AND (l_inflow.stub_days IS NOT NULL)) THEN
11667 --Set the recurrence date to null for stub payment
11668 l_recurrence_date := NULL;
11669 ELSIF(l_recurrence_date IS NULL
11670 OR l_old_cle_id <> l_inflow.cle_id
11671 OR l_old_sty_id <> l_inflow.sty_id) THEN
11672 --Set the recurrence date as periodic payment level start date
11673 l_recurrence_date := l_inflow.start_date;
11674 END IF;
11675 l_old_cle_id := l_inflow.cle_id;
11676 l_old_sty_id := l_inflow.sty_id;
11677
11678 OPEN c_hdr;
11679 FETCH c_hdr INTO l_curreny_code;
11680 CLOSE c_hdr;
11681
11682 get_stream_elements( p_start_date => l_inflow.start_date,
11683 p_periods => l_inflow.periods,
11684 p_frequency => l_inflow.frequency,
11685 p_structure => l_inflow.structure,
11686 p_advance_or_arrears => l_inflow.advance_arrears,
11687 p_amount => l_inflow.amount,
11688 p_stub_days => l_inflow.stub_days,
11689 p_stub_amount => l_inflow.stub_amount,
11690 p_currency_code => l_curreny_code,
11691 p_khr_id => p_khr_id,
11692 p_kle_id => l_inflow.cle_id,
11693 p_purpose_code => l_purpose_code,
11694 x_selv_tbl => l_selv_tbl,
11695 x_pt_tbl => l_pt_tbl,
11696 x_pt_pro_fee_tbl => l_pt_pro_fee_tbl,
11697 x_return_status => x_return_status,
11698 x_msg_count => x_msg_count,
11699 x_msg_data => x_msg_data,
11700 p_recurrence_date => l_recurrence_date);
11701
11702 IF x_return_status = OKL_API.G_RET_STS_UNEXP_ERROR THEN
11703 RAISE OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
11704 ELSIF x_return_status = OKL_API.G_RET_STS_ERROR THEN
11705 RAISE OKL_API.G_EXCEPTION_ERROR;
11706 END IF;
11707
11708 get_stream_header(p_khr_id => p_khr_id,
11709 p_kle_id => l_inflow.cle_id,
11710 p_sty_id => l_inflow.sty_id,
11711 p_purpose_code => l_purpose_code,
11712 x_stmv_rec => l_stmv_rec,
11713 x_return_status => x_return_status);
11714
11715 IF x_return_status = OKL_API.G_RET_STS_UNEXP_ERROR THEN
11716 RAISE OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
11717 ELSIF x_return_status = OKL_API.G_RET_STS_ERROR THEN
11718 RAISE OKL_API.G_EXCEPTION_ERROR;
11719 END IF;
11720
11721 x_return_status := Okl_Streams_Util.round_streams_amount_esg(
11722 p_api_version => g_api_version,
11723 p_init_msg_list => p_init_msg_list,
11724 x_msg_count => x_msg_count,
11725 x_msg_data => x_msg_data,
11726 p_chr_id => p_khr_id,
11727 p_selv_tbl => l_selv_tbl,
11728 x_selv_tbl => lx_selv_tbl,
11729 p_org_id => G_ORG_ID,
11730 p_precision => G_PRECISION,
11731 p_currency_code => G_CURRENCY_CODE,
11732 p_rounding_rule => G_ROUNDING_RULE,
11733 p_apply_rnd_diff=> G_DIFF_LOOKUP_CODE);
11734
11735 IF (x_return_status = G_RET_STS_UNEXP_ERROR) THEN
11736 RAISE OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
11737 ELSIF (x_return_status = G_RET_STS_ERROR) THEN
11738 RAISE OKL_API.G_EXCEPTION_ERROR;
11739 END IF;
11740
11741 l_selv_tbl.DELETE;
11742 l_selv_tbl := lx_selv_tbl;
11743
11744 --Accumulate Stream Header
11745 OKL_STREAMS_UTIL.accumulate_strm_headers( p_stmv_rec => l_stmv_rec,
11746 x_full_stmv_tbl => l_stmv_tbl,
11747 x_return_status => x_return_status );
11748 IF (x_return_status = G_RET_STS_UNEXP_ERROR) THEN
11749 RAISE OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
11750 ELSIF (x_return_status = G_RET_STS_ERROR) THEN
11751 RAISE OKL_API.G_EXCEPTION_ERROR;
11752 END IF;
11753
11754 --Accumulate Stream Elements
11755 OKL_STREAMS_UTIL.accumulate_strm_elements( p_stm_index_no => l_stmv_tbl.LAST,
11756 p_selv_tbl => l_selv_tbl,
11757 x_full_selv_tbl => l_full_selv_tbl,
11758 x_return_status => x_return_status );
11759 IF (x_return_status = G_RET_STS_UNEXP_ERROR) THEN
11760 RAISE OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
11761 ELSIF (x_return_status = G_RET_STS_ERROR) THEN
11762 RAISE OKL_API.G_EXCEPTION_ERROR;
11763 END IF;
11764
11765 l_stmv_rec := NULL;
11766 l_selv_tbl.delete;
11767 lx_selv_tbl.delete;
11768
11769 END LOOP;
11770
11771 --Create all the accumulated Streams at one shot ..
11772 Okl_Streams_Pub.create_streams_perf( p_api_version,
11773 p_init_msg_list,
11774 x_return_status,
11775 x_msg_count,
11776 x_msg_data,
11777 l_stmv_tbl,
11778 l_full_selv_tbl,
11779 lx_stmv_tbl,
11780 lx_full_selv_tbl);
11781 IF x_return_status = OKL_API.G_RET_STS_UNEXP_ERROR THEN
11782 RAISE OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
11783 ELSIF x_return_status = OKL_API.G_RET_STS_ERROR THEN
11784 RAISE OKL_API.G_EXCEPTION_ERROR;
11785 END IF;
11786
11787 EXCEPTION
11788 WHEN OKL_API.G_EXCEPTION_ERROR THEN
11789 x_return_status := G_RET_STS_ERROR;
11790 WHEN OKL_API.G_EXCEPTION_UNEXPECTED_ERROR THEN
11791 x_return_status := G_RET_STS_UNEXP_ERROR;
11792 WHEN OTHERS THEN
11793 OKL_API.SET_MESSAGE (p_app_name => G_APP_NAME,
11794 p_msg_name => G_DB_ERROR,
11795 p_token1 => G_PROG_NAME_TOKEN,
11796 p_token1_value => l_prog_name,
11797 p_token2 => G_SQLCODE_TOKEN,
11798 p_token2_value => sqlcode,
11799 p_token3 => G_SQLERRM_TOKEN,
11800 p_token3_value => sqlerrm);
11801
11802 x_return_status := G_RET_STS_UNEXP_ERROR;
11803 END gen_cash_flows_for_IA;
11804
11805
11806 /** gboomina created GEN_INCOME_ACCRUAL_FOR_IA API for Bug 6763287
11807 ------------------------------------------------------------------
11808 PROCEDURE GEN_INCOME_ACCRUAL_FOR_IA
11809 ------------------------------------------------------------------
11810 Description: This procedure is used to generate income accrual streams
11811 for Fees defined in Investor Agreement
11812 **/
11813
11814 PROCEDURE gen_income_accruals_for_IA( p_api_version IN NUMBER
11815 , p_init_msg_list IN VARCHAR2
11816 , p_khr_id IN NUMBER
11817 , x_return_status OUT NOCOPY VARCHAR2
11818 , x_msg_count OUT NOCOPY NUMBER
11819 , x_msg_data OUT NOCOPY VARCHAR2
11820 )
11821 IS
11822
11823 CURSOR c_inflows IS
11824 SELECT rgp.cle_id cle_id,
11825 TO_NUMBER(rul1.object1_id1) sty_id,
11826 sty.stream_type_purpose,
11827 FND_DATE.canonical_to_date(rul2.rule_information2) start_date,
11828 TO_NUMBER(rul2.rule_information3) periods,
11829 rul2.object1_id1 frequency,
11830 rul2.rule_information5 structure,
11831 DECODE(rul2.rule_information10, 'Y', 'ARREARS', 'ADVANCE') advance_arrears,
11832 FND_NUMBER.canonical_to_number(rul2.rule_information6) amount,
11833 TO_NUMBER(rul2.rule_information7) stub_days,
11834 TO_NUMBER(rul2.rule_information8) stub_amount,
11835 lse.lty_code lty_code,
11836 kle.capital_amount capital_amount,
11837 kle.residual_value residual_value,
11838 kle.fee_type fee_type
11839 FROM okc_rule_groups_b rgp,
11840 okc_rules_b rul1,
11841 okc_rules_b rul2,
11842 okc_k_lines_b cle,
11843 okl_k_lines kle,
11844 okc_line_styles_b lse,
11845 okl_strm_type_b sty
11846 WHERE
11847 rul2.dnz_chr_id = p_khr_id
11848 AND rul2.rule_information_category = 'LASLL'
11849 AND rul2.rgp_id = rgp.id
11850 AND TO_NUMBER(rul2.object2_id1) = rul1.id
11851 AND rgp.cle_id = cle.id
11852 AND cle.id = kle.id
11853 AND cle.lse_id = lse.id
11854 AND sty.id = rul1.object1_id1;
11855
11856 l_inflow c_inflows%rowtype;
11857
11858 CURSOR c_hdr IS
11859 SELECT to_char(pdt.id) pid,
11860 chr.currency_code currency_code
11861 FROM okc_k_headers_v chr,
11862 okl_k_headers khr,
11863 okl_products_v pdt
11864 WHERE khr.id = chr.id
11865 AND chr.id = p_khr_id
11866 AND khr.pdt_id = pdt.id(+);
11867
11868 l_sty_purpose okl_strm_type_b.STREAM_TYPE_PURPOSE%TYPE;
11869 l_sty_id okl_strm_type_b.ID%TYPE;
11870 l_sty_name OKL_STRM_TYPE_v.name%TYPE;
11871 l_mapped_sty_name OKL_STRM_TYPE_v.name%TYPE;
11872 l_pdt_id okl_products.id%type;
11873 l_currency_code okc_k_headers_all_b.currency_code%type;
11874 l_purpose_code VARCHAR2(30) := '-99';
11875
11876 l_selv_tbl okl_streams_pub.selv_tbl_type;
11877 lx_selv_tbl okl_streams_pub.selv_tbl_type;
11878 l_full_selv_tbl okl_streams_pub.selv_tbl_type;
11879 lx_full_selv_tbl okl_streams_pub.selv_tbl_type;
11880
11881 l_stmv_rec okl_streams_pub.stmv_rec_type;
11882 l_stmv_tbl okl_Streams_Pub.stmv_tbl_type;
11883 lx_stmv_tbl okl_Streams_Pub.stmv_tbl_type;
11884
11885 l_prog_name CONSTANT VARCHAR2(61) := G_PKG_NAME||'.'||'gen_income_accruals_for_IA';
11886
11887 BEGIN
11888
11889 FOR l_inflow IN c_inflows LOOP
11890
11891 l_sty_purpose := l_inflow.stream_type_purpose;
11892
11893 get_sty_details (p_sty_id => l_inflow.sty_id,
11894 x_sty_id => l_sty_id,
11895 x_sty_name => l_sty_name,
11896 x_return_status => x_return_status);
11897
11898 IF x_return_status = OKL_API.G_RET_STS_UNEXP_ERROR THEN
11899 RAISE OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
11900 ELSIF x_return_status = OKL_API.G_RET_STS_ERROR THEN
11901 RAISE OKL_API.G_EXCEPTION_ERROR;
11902 END IF;
11903
11904 OPEN c_hdr;
11905 FETCH c_hdr INTO l_pdt_id, l_currency_code;
11906 CLOSE c_hdr;
11907
11908 OKL_ISG_UTILS_PVT.get_dependent_stream_type(
11909 p_khr_id => p_khr_id,
11910 p_pdt_id => l_pdt_id,
11911 p_dependent_sty_purpose => 'ACCRUED_FEE_INCOME',
11912 x_return_status => x_return_status,
11913 x_dependent_sty_id => l_sty_id,
11914 x_dependent_sty_name => l_mapped_sty_name);
11915
11916 IF x_return_status = OKL_API.G_RET_STS_UNEXP_ERROR THEN
11917 RAISE OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
11918 ELSIF x_return_status = OKL_API.G_RET_STS_ERROR THEN
11919 RAISE OKL_API.G_EXCEPTION_ERROR;
11920 END IF;
11921
11922 IF l_mapped_sty_name IS NOT NULL THEN
11923 get_accrual_elements (
11924 p_start_date => l_inflow.start_date,
11925 p_periods => l_inflow.periods,
11926 p_frequency => l_inflow.frequency,
11927 p_structure => l_inflow.structure,
11928 p_advance_or_arrears => l_inflow.advance_arrears,
11929 p_amount => l_inflow.amount,
11930 p_stub_days => l_inflow.stub_days,
11931 p_stub_amount => l_inflow.stub_amount,
11932 p_currency_code => l_currency_code,
11933 x_selv_tbl => l_selv_tbl,
11934 x_return_status => x_return_status);
11935
11936 IF x_return_status = OKL_API.G_RET_STS_UNEXP_ERROR THEN
11937 RAISE OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
11938 ELSIF x_return_status = OKL_API.G_RET_STS_ERROR THEN
11939 RAISE OKL_API.G_EXCEPTION_ERROR;
11940 END IF;
11941 END IF;
11942
11943 get_sty_details (p_sty_name => l_mapped_sty_name,
11944 x_sty_id => l_sty_id,
11945 x_sty_name => l_sty_name,
11946 x_return_status => x_return_status);
11947
11948 IF x_return_status = OKL_API.G_RET_STS_UNEXP_ERROR THEN
11949 RAISE OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
11950 ELSIF x_return_status = OKL_API.G_RET_STS_ERROR THEN
11951 RAISE OKL_API.G_EXCEPTION_ERROR;
11952 END IF;
11953
11954 IF (l_selv_tbl.COUNT > 0 ) THEN
11955 get_stream_header(p_khr_id => p_khr_id,
11956 p_kle_id => l_inflow.cle_id,
11957 p_sty_id => l_sty_id,
11958 p_purpose_code => l_purpose_code,
11959 x_stmv_rec => l_stmv_rec,
11960 x_return_status => x_return_status);
11961
11962 IF x_return_status = OKL_API.G_RET_STS_UNEXP_ERROR THEN
11963 RAISE OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
11964 ELSIF x_return_status = OKL_API.G_RET_STS_ERROR THEN
11965 RAISE OKL_API.G_EXCEPTION_ERROR;
11966 END IF;
11967
11968 x_return_status := Okl_Streams_Util.round_streams_amount_esg(
11969 p_api_version => g_api_version,
11970 p_init_msg_list => p_init_msg_list,
11971 x_msg_count => x_msg_count,
11972 x_msg_data => x_msg_data,
11973 p_chr_id => p_khr_id,
11974 p_selv_tbl => l_selv_tbl,
11975 x_selv_tbl => lx_selv_tbl,
11976 p_org_id => G_ORG_ID,
11977 p_precision => G_PRECISION,
11978 p_currency_code => G_CURRENCY_CODE,
11979 p_rounding_rule => G_ROUNDING_RULE,
11980 p_apply_rnd_diff=> G_DIFF_LOOKUP_CODE);
11981
11982 IF (x_return_status = G_RET_STS_UNEXP_ERROR) THEN
11983 RAISE OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
11984 ELSIF (x_return_status = G_RET_STS_ERROR) THEN
11985 RAISE OKL_API.G_EXCEPTION_ERROR;
11986 END IF;
11987
11988 l_selv_tbl.DELETE;
11989 l_selv_tbl := lx_selv_tbl;
11990
11991 --Accumulate Stream Header
11992 OKL_STREAMS_UTIL.accumulate_strm_headers(
11993 p_stmv_rec => l_stmv_rec,
11994 x_full_stmv_tbl => l_stmv_tbl,
11995 x_return_status => x_return_status );
11996 IF (x_return_status = G_RET_STS_UNEXP_ERROR) THEN
11997 RAISE OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
11998 ELSIF (x_return_status = G_RET_STS_ERROR) THEN
11999 RAISE OKL_API.G_EXCEPTION_ERROR;
12000 END IF;
12001
12002 --Accumulate Stream Elements
12003 OKL_STREAMS_UTIL.accumulate_strm_elements(
12004 p_stm_index_no => l_stmv_tbl.LAST,
12005 p_selv_tbl => l_selv_tbl,
12006 x_full_selv_tbl => l_full_selv_tbl,
12007 x_return_status => x_return_status );
12008 IF (x_return_status = G_RET_STS_UNEXP_ERROR) THEN
12009 RAISE OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
12010 ELSIF (x_return_status = G_RET_STS_ERROR) THEN
12011 RAISE OKL_API.G_EXCEPTION_ERROR;
12012 END IF;
12013
12014 END IF;
12015
12016 l_mapped_sty_name := NULL;
12017 l_sty_name := NULL;
12018 l_sty_id := NULL;
12019
12020 l_stmv_rec := NULL;
12021 l_selv_tbl.delete;
12022
12023 lx_selv_tbl.delete;
12024
12025 END LOOP;
12026
12027 --Create all the accumulated Streams at one shot ..
12028 IF l_stmv_tbl.COUNT > 0 AND
12029 l_full_selv_tbl.COUNT > 0
12030 THEN
12031 Okl_Streams_Pub.create_streams_perf(
12032 p_api_version,
12033 p_init_msg_list,
12034 x_return_status,
12035 x_msg_count,
12036 x_msg_data,
12037 l_stmv_tbl,
12038 l_full_selv_tbl,
12039 lx_stmv_tbl,
12040 lx_full_selv_tbl);
12041 IF x_return_status = OKL_API.G_RET_STS_UNEXP_ERROR THEN
12042 RAISE OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
12043 ELSIF x_return_status = OKL_API.G_RET_STS_ERROR THEN
12044 RAISE OKL_API.G_EXCEPTION_ERROR;
12045 END IF;
12046 END IF;
12047
12048 EXCEPTION
12049 WHEN OKL_API.G_EXCEPTION_ERROR THEN
12050 x_return_status := G_RET_STS_ERROR;
12051 WHEN OKL_API.G_EXCEPTION_UNEXPECTED_ERROR THEN
12052 x_return_status := G_RET_STS_UNEXP_ERROR;
12053 WHEN OTHERS THEN
12054 OKL_API.SET_MESSAGE (p_app_name => G_APP_NAME,
12055 p_msg_name => G_DB_ERROR,
12056 p_token1 => G_PROG_NAME_TOKEN,
12057 p_token1_value => l_prog_name,
12058 p_token2 => G_SQLCODE_TOKEN,
12059 p_token2_value => sqlcode,
12060 p_token3 => G_SQLERRM_TOKEN,
12061 p_token3_value => sqlerrm);
12062
12063 x_return_status := G_RET_STS_UNEXP_ERROR;
12064
12065 END gen_income_accruals_for_IA;
12066
12067
12068 /** gboomina created GEN_INCOME_ACCRUAL_FOR_IA API for Bug 6763287
12069 ------------------------------------------------------------------
12070 PROCEDURE GEN_INCOME_ACCRUAL_FOR_IA
12071 ------------------------------------------------------------------
12072 Description: This procedure is used to generate income accrual streams
12073 for Fees defined in Investor Agreement
12074 **/
12075
12076 PROCEDURE adjust_IA_streams( p_api_version IN NUMBER
12077 , p_init_msg_list IN VARCHAR2
12078 , p_khr_id IN NUMBER
12079 , x_return_status OUT NOCOPY VARCHAR2
12080 , x_msg_count OUT NOCOPY NUMBER
12081 , x_msg_data OUT NOCOPY VARCHAR2
12082 )
12083 IS
12084
12085 l_strm_id_tbl okl_streams_util.NumberTabTyp;
12086 l_say_code_tbl okl_streams_util.Var10TabTyp;
12087 l_active_yn_tbl okl_streams_util.Var10TabTyp;
12088 l_date_history_tbl okl_streams_util.DateTabTyp;
12089 l_date_curr_tbl okl_streams_util.DateTabTyp;
12090
12091 CURSOR strms_csr IS
12092 SELECT strm.id
12093 , strm.say_code
12094 FROM okl_streams strm
12095 WHERE khr_id = p_khr_id;
12096 l_strms_rec strms_csr%rowtype;
12097
12098 i NUMBER;
12099 l_prog_name CONSTANT VARCHAR2(61) := G_PKG_NAME||'.'||'adjust_IA_streams';
12100 BEGIN
12101
12102 i := 0;
12103 FOR l_strms_rec IN strms_csr
12104 LOOP
12105 -- Make WORK streams CURR and CURR streams WORK
12106 IF l_strms_rec.say_code = 'WORK' THEN
12107 i := i+1;
12108 l_strm_id_tbl(i):= l_strms_rec.id;
12109 l_say_code_tbl(i) := 'CURR';
12110 l_date_curr_tbl(i) := sysdate;
12111 l_date_history_tbl(i) := NULL;
12112 l_active_yn_tbl(i) := 'Y';
12113 ELSIF l_strms_rec.say_code = 'CURR' THEN
12114 i := i+1;
12115 l_strm_id_tbl(i):= l_strms_rec.id;
12116 l_say_code_tbl(i) := 'HIST';
12117 l_date_curr_tbl(i) := sysdate;
12118 l_date_history_tbl(i) := NULL;
12119 l_active_yn_tbl(i) := 'N';
12120 END IF;
12121 END LOOP;
12122
12123 -- Update all streams at once...
12124 FORALL i IN l_strm_id_tbl.FIRST..l_strm_id_tbl.LAST
12125 UPDATE OKL_STREAMS
12126 SET say_code = l_say_code_tbl(i),
12127 active_yn = l_active_yn_tbl(i),
12128 date_history = l_date_history_tbl(i),
12129 date_current = l_date_curr_tbl(i)
12130 WHERE ID = l_strm_id_tbl(i);
12131
12132 EXCEPTION
12133 WHEN OKL_API.G_EXCEPTION_ERROR THEN
12134 x_return_status := G_RET_STS_ERROR;
12135 WHEN OKL_API.G_EXCEPTION_UNEXPECTED_ERROR THEN
12136 x_return_status := G_RET_STS_UNEXP_ERROR;
12137 WHEN OTHERS THEN
12138 OKL_API.SET_MESSAGE (p_app_name => G_APP_NAME,
12139 p_msg_name => G_DB_ERROR,
12140 p_token1 => G_PROG_NAME_TOKEN,
12141 p_token1_value => l_prog_name,
12142 p_token2 => G_SQLCODE_TOKEN,
12143 p_token2_value => sqlcode,
12144 p_token3 => G_SQLERRM_TOKEN,
12145 p_token3_value => sqlerrm);
12146 x_return_status := G_RET_STS_UNEXP_ERROR;
12147
12148 END adjust_IA_streams;
12149
12150
12151 /** gboomina created GENERATE_STREAMS_FOR_IA API for Bug 6763287
12152 ------------------------------------------------------------------
12153 PROCEDURE GENERATE_STREAMS_FOR_IA
12154 ------------------------------------------------------------------
12155 Description: This procedure is used to generate streams
12156 for Fees defined in Investor Agreement
12157 **/
12158
12159 PROCEDURE generate_streams_for_IA( p_api_version IN NUMBER
12160 , p_init_msg_list IN VARCHAR2
12161 , p_khr_id IN NUMBER
12162 , x_return_status OUT NOCOPY VARCHAR2
12163 , x_msg_count OUT NOCOPY NUMBER
12164 , x_msg_data OUT NOCOPY VARCHAR2
12165 )
12166 IS
12167 l_api_name CONSTANT VARCHAR2(61) := 'generate_streams_for_IA';
12168
12169 CURSOR c_hdr IS
12170 SELECT chr.currency_code
12171 FROM okc_k_headers_b chr
12172 WHERE chr.id = p_khr_id;
12173
12174 l_currency_code okc_k_headers_all_b.currency_code%type;
12175 l_purpose_code VARCHAR2(10) := '-99';
12176 l_return_status VARCHAR2(1) := OKL_API.G_RET_STS_SUCCESS;
12177
12178 BEGIN
12179 x_return_status := OKL_API.G_RET_STS_SUCCESS;
12180
12181 l_return_status := OKL_API.START_ACTIVITY(
12182 p_api_name => l_api_name,
12183 p_pkg_name => g_pkg_name,
12184 p_init_msg_list => p_init_msg_list,
12185 l_api_version => p_api_version,
12186 p_api_version => p_api_version,
12187 p_api_type => G_API_TYPE,
12188 x_return_status => l_return_status);
12189
12190 -- check if activity started successfully
12191 IF (l_return_status = OKL_API.G_RET_STS_UNEXP_ERROR) THEN
12192 RAISE OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
12193 ElSIF (l_return_status = OKL_API.G_RET_STS_ERROR) THEN
12194 RAISE OKL_API.G_EXCEPTION_ERROR;
12195 END IF;
12196
12197 ---------------------------------------------
12198 -- STEP 1: Generate Income Streams
12199 ---------------------------------------------
12200 gen_cash_flows_for_IA( p_api_version => p_api_version
12201 , p_init_msg_list => p_init_msg_list
12202 , p_khr_id => p_khr_id
12203 , x_return_status => l_return_status
12204 , x_msg_count => x_msg_count
12205 , x_msg_data => x_msg_data);
12206
12207 IF (l_return_status = OKL_API.G_RET_STS_UNEXP_ERROR) THEN
12208 RAISE OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
12209 ElSIF (l_return_status = OKL_API.G_RET_STS_ERROR) THEN
12210 RAISE OKL_API.G_EXCEPTION_ERROR;
12211 END IF;
12212
12213 ---------------------------------------------
12214 -- STEP 2: Generate Income Accrual Streams
12215 ---------------------------------------------
12216 gen_income_accruals_for_IA( p_api_version => p_api_version
12217 , p_init_msg_list => p_init_msg_list
12218 , p_khr_id => p_khr_id
12219 , x_return_status => l_return_status
12220 , x_msg_count => x_msg_count
12221 , x_msg_data => x_msg_data);
12222
12223 IF (l_return_status = OKL_API.G_RET_STS_UNEXP_ERROR) THEN
12224 RAISE OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
12225 ElSIF (l_return_status = OKL_API.G_RET_STS_ERROR) THEN
12226 RAISE OKL_API.G_EXCEPTION_ERROR;
12227 END IF;
12228
12229 ---------------------------------------------
12230 -- STEP 3: Generate Expense Accrual Streams
12231 ---------------------------------------------
12232 OPEN c_hdr;
12233 FETCH c_hdr INTO l_currency_code;
12234 CLOSE c_hdr;
12235
12236 okl_expense_streams_pvt.generate_rec_exp(
12237 p_khr_id => p_khr_id
12238 , p_deal_type => NULL -- NULL for Investor
12239 , p_purpose_code => l_purpose_code
12240 , p_currency_code => l_currency_code
12241 , x_return_status => l_return_status);
12242
12243 IF (l_return_status = OKL_API.G_RET_STS_UNEXP_ERROR) THEN
12244 RAISE OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
12245 ElSIF (l_return_status = OKL_API.G_RET_STS_ERROR) THEN
12246 RAISE OKL_API.G_EXCEPTION_ERROR;
12247 END IF;
12248
12249 -- one streams header per the payment line (LASLL) will be
12250 -- created by the previous API's. So we need to consolidate
12251 -- those stream headers into one stream header per fee line
12252 ---------------------------------------------------------------
12253 -- STEP 4: Consolidate Income Fee streams into one stream header
12254 -- per fee line
12255 ---------------------------------------------------------------
12256 consolidate_line_streams( p_khr_id => p_khr_id
12257 , p_purpose_code => l_purpose_code
12258 , x_return_status => l_return_status);
12259
12260 IF (l_return_status = OKL_API.G_RET_STS_UNEXP_ERROR) THEN
12261 RAISE OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
12262 ElSIF (l_return_status = OKL_API.G_RET_STS_ERROR) THEN
12263 RAISE OKL_API.G_EXCEPTION_ERROR;
12264 END IF;
12265
12266 ------------------------------------------------------------------
12267 -- STEP 5: Consolidate Income Accrual Fee streams into one stream
12268 -- header per fee line
12269 ------------------------------------------------------------------
12270 consolidate_acc_streams( p_khr_id => p_khr_id
12271 , p_purpose_code => l_purpose_code
12272 , x_return_status => l_return_status);
12273
12274 IF (l_return_status = OKL_API.G_RET_STS_UNEXP_ERROR) THEN
12275 RAISE OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
12276 ElSIF (l_return_status = OKL_API.G_RET_STS_ERROR) THEN
12277 RAISE OKL_API.G_EXCEPTION_ERROR;
12278 END IF;
12279
12280 ---------------------------------------------
12281 -- STEP 6: Adjust Streams
12282 ---------------------------------------------
12283 -- Move the Working status streams to Current
12284 -- and the existing Current status streams to History
12285 adjust_IA_streams( p_api_version => p_api_version
12286 , p_init_msg_list => p_init_msg_list
12287 , p_khr_id => p_khr_id
12288 , x_return_status => l_return_status
12289 , x_msg_count => x_msg_count
12290 , x_msg_data => x_msg_data);
12291
12292 IF (l_return_status = OKL_API.G_RET_STS_UNEXP_ERROR) THEN
12293 RAISE OKL_API.G_EXCEPTION_UNEXPECTED_ERROR;
12294 ElSIF (l_return_status = OKL_API.G_RET_STS_ERROR) THEN
12295 RAISE OKL_API.G_EXCEPTION_ERROR;
12296 END IF;
12297
12298 OKL_API.END_ACTIVITY(x_msg_count => x_msg_count, x_msg_data => x_msg_data);
12299
12300 EXCEPTION
12301 WHEN OKL_API.G_EXCEPTION_ERROR THEN
12302 l_return_status := G_RET_STS_ERROR;
12303 WHEN OKL_API.G_EXCEPTION_UNEXPECTED_ERROR THEN
12304 l_return_status := G_RET_STS_UNEXP_ERROR;
12305 WHEN OTHERS THEN
12306 OKL_API.SET_MESSAGE (p_app_name => G_APP_NAME,
12307 p_msg_name => G_DB_ERROR,
12308 p_token1 => G_PROG_NAME_TOKEN,
12309 p_token1_value => l_api_name,
12310 p_token2 => G_SQLCODE_TOKEN,
12311 p_token2_value => sqlcode,
12312 p_token3 => G_SQLERRM_TOKEN,
12313 p_token3_value => sqlerrm);
12314 l_return_status := G_RET_STS_UNEXP_ERROR;
12315
12316 END generate_streams_for_IA;
12317
12318 END OKL_STREAM_GENERATOR_PVT;