DBA Data[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;