DBA Data[Home] [Help]

PACKAGE BODY: APPS.OKC_TIME_RES_PVT

Source


1 Package BODY OKC_TIME_RES_PVT AS
2 /* $Header: OKCCRESB.pls 120.2 2006/02/24 15:11:51 smallya noship $ */
3 
4 	l_debug VARCHAR2(1) := NVL(FND_PROFILE.VALUE('AFLOG_ENABLED'),'N');
5 
6   ---------------------------------------------------------------------------
7   -- Procedures and Functions
8   ---------------------------------------------------------------------------
9   PROCEDURE Get_K_Effectivity(
10     p_chr_id IN NUMBER,
11     p_cle_id IN NUMBER,
12     x_start_date OUT NOCOPY DATE,
13     x_end_date OUT NOCOPY DATE,
14     x_return_status OUT NOCOPY VARCHAR2) IS
15 
16     CURSOR chr_csr(p_chr_id IN NUMBER) is
17      select start_date, end_date
18       from okc_k_headers_b
19       where id = p_chr_id;
20 
21     CURSOR cle_csr(p_cle_id IN NUMBER) is
22      select start_date, end_date
23       from okc_k_lines_b
24       where id = p_cle_id;
25 
26     l_row_not_found                BOOLEAN := TRUE;
27     l_chr_rec                      chr_csr%ROWTYPE;
28     l_cle_rec                      cle_csr%ROWTYPE;
29     l_token_value                  varchar2(10) := OKC_API.G_MISS_CHAR;
30   BEGIN
31 
32   /* Get the effectivity of the contract header or lines */
33 
34     x_start_date := NULL;
35     x_end_date := NULL;
36     x_return_status := OKC_API.G_RET_STS_SUCCESS;
37     IF p_cle_id is NOT NULL and
38 	  p_cle_id <> OKC_API.G_MISS_NUM Then
39 	  l_token_value := 'CLE_ID';
40        OPEN cle_csr(p_cle_id);
41        FETCH cle_csr into l_cle_rec;
42        l_row_not_found := cle_csr%NOTFOUND;
43        CLOSE cle_csr;
44        IF (l_row_not_found) THEN
45          OKC_API.set_message(G_APP_NAME, G_INVALID_VALUE,G_COL_NAME_TOKEN,'CLE_ID');
46          x_return_status := OKC_API.G_RET_STS_ERROR;
47 	 return;
48        ELSE
49          x_start_date := l_cle_rec.start_date;
50          x_end_date   := l_cle_rec.end_date;
51        END IF;
52     ELSIF p_chr_id is NOT NULL and
53 	  p_chr_id <> OKC_API.G_MISS_NUM THEN
54        l_token_value := 'CHR_ID';
55        OPEN chr_csr(p_chr_id);
56        FETCH chr_csr into l_chr_rec;
57        l_row_not_found := chr_csr%NOTFOUND;
58        CLOSE chr_csr;
59        IF (l_row_not_found) THEN
60          OKC_API.set_message(G_APP_NAME, G_INVALID_VALUE,G_COL_NAME_TOKEN,'CHR_ID');
61          x_return_status := OKC_API.G_RET_STS_ERROR;
62 	    return;
63        ELSE
64          x_start_date := l_chr_rec.start_date;
65          x_end_date := l_chr_rec.end_date;
66        END IF;
67      END IF;
68 -- The following block is added for Bug#2386569 regarding initialization for perpetual contracts
69      IF x_start_date IS NULL Then
70         x_start_date := to_date('01010001','ddmmyyyy');
71      end if;
72      IF x_end_date IS NULL Then
73         x_end_date := to_date('31124000','ddmmyyyy');
74      end if;
75 
76     EXCEPTION
77       WHEN OTHERS THEN
78         OKC_API.SET_MESSAGE(p_app_name     => g_app_name,
79                             p_msg_name     => g_unexpected_error,
80                             p_token1       => g_sqlcode_token,
81                             p_token1_value => sqlcode,
82                             p_token2       => g_col_name_token,
83                             p_token2_value => l_token_value,
84                             p_token3       => g_sqlerrm_token,
85                             p_token3_value => sqlerrm);
86       -- notify caller of an UNEXPECTED error
87         x_return_status := OKC_API.G_RET_STS_UNEXP_ERROR;
88    END Get_K_Effectivity;
89 
90   PROCEDURE Get_Timezone(
91     p_tze_id IN NUMBER,
92     x_tze_name OUT NOCOPY VARCHAR2,
93     x_return_status OUT NOCOPY VARCHAR2) IS
94     CURSOR okc_timezone_csr  is
95 	 SELECT global_timezone_name
96 	 from okx_timezones_v
97 	 where timezone_id = p_tze_id;
98     l_okc_timezone_rec okc_timezone_csr%ROWTYPE;
99     item_not_found_error          EXCEPTION;
100     l_row_notfound                 BOOLEAN := TRUE;
101    BEGIN
102 
103   -- Get the timezone name from the timezone id which is also required for the JTF_TASKS API
104 
105 	x_return_status := OKC_API.G_RET_STS_SUCCESS;
106 	OPEN okc_timezone_csr;
107      FETCH okc_timezone_csr INTO l_okc_timezone_rec;
108       l_row_notfound := okc_timezone_csr%NOTFOUND;
109      CLOSE okc_timezone_csr;
110      IF (l_row_notfound) THEN
111        OKC_API.set_message(G_APP_NAME, G_INVALID_VALUE,G_COL_NAME_TOKEN,'TZE_ID');
112        RAISE item_not_found_error;
113      END IF;
114 	x_tze_name := l_okc_timezone_rec.global_timezone_name;
115     EXCEPTION
116       WHEN item_not_found_error THEN
117         x_return_status := OKC_API.G_RET_STS_ERROR;
118       WHEN OTHERS THEN
119         OKC_API.SET_MESSAGE(p_app_name     => g_app_name,
120                             p_msg_name     => g_unexpected_error,
121                             p_token1       => g_sqlcode_token,
122                             p_token1_value => sqlcode,
123                             p_token2       => g_col_name_token,
124                             p_token2_value => 'TZE_ID',
125                             p_token3       => g_sqlerrm_token,
126                             p_token3_value => sqlerrm);
127       -- notify caller of an UNEXPECTED error
128         x_return_status := OKC_API.G_RET_STS_UNEXP_ERROR;
129     End Get_Timezone;
130 
131   PROCEDURE Create_RTV_N_Tasks(
132     x_return_status     OUT NOCOPY VARCHAR2,
133     p_api_version	    IN NUMBER,
134     p_init_msg_list     IN VARCHAR2 ,
135     p_tve_id            IN NUMBER,
136     p_date              IN DATE,
137     p_cutoff_date       IN DATE ,
138     p_coe_id            IN NUMBER ,
139     p_tze_id            IN NUMBER,
140     p_tze_name          VARCHAR2) IS
141     l_api_version            CONSTANT NUMBER := 1;
142     l_api_name               CONSTANT VARCHAR2(30) := 'Create_RTV_N_Tasks';
143     l_msg_count              NUMBER;
144     x_msg_count              NUMBER;
145     x_task_id                NUMBER;
146     l_msg_data               VARCHAR2(2000);
147     x_msg_data               VARCHAR2(2000);
148     l_rtvv_rec               OKC_TIME_PUB.rtvv_rec_type;
149     x_rtvv_rec               OKC_TIME_PUB.rtvv_rec_type;
150   BEGIN
151     x_return_status := OKC_API.START_ACTIVITY(l_api_name,
152 									 p_init_msg_list,
153 									 '_COMPLEX',
154 									 x_return_status);
155     IF (x_return_status = OKC_API.G_RET_STS_UNEXP_ERROR) THEN
156 	  raise OKC_API.G_EXCEPTION_UNEXPECTED_ERROR;
157     ELSIF (x_return_status = OKC_API.G_RET_STS_ERROR) THEN
158 	  raise OKC_API.G_EXCEPTION_ERROR;
159     END IF;
160 
161   -- Cutoff Date is the date which will actually be the start date for the time resolving window
162 
163 	x_return_status := OKC_API.G_RET_STS_SUCCESS;
164 	if p_cutoff_date is NOT NULL Then
165 	  if p_date < p_cutoff_date then
166 	    return;
167        end if;
168      end if;
169     l_rtvv_rec.tve_id := p_tve_id;
170     l_rtvv_rec.datetime := p_date;
171     l_rtvv_rec.coe_id := p_coe_id;
172     -- Creating Resolved timevalues
173     OKC_TIME_PUB.CREATE_RESOLVED_TIMEVALUES(
174       p_api_version,
175       p_init_msg_list,
176       x_return_status,
177       x_msg_count,
178       x_msg_data,
179       l_rtvv_rec,
180       x_rtvv_rec );
181 
182 	IF x_return_status = OKC_API.G_RET_STS_UNEXP_ERROR THEN
183 	   raise OKC_API.G_EXCEPTION_UNEXPECTED_ERROR;
184      ELSIF x_return_status = OKC_API.G_RET_STS_ERROR THEN
185 	   raise OKC_API.G_EXCEPTION_ERROR;
186      END IF;
187 
188 /*    if x_return_status <> OKC_API.G_RET_STS_SUCCESS THEN
189 	  return;
190     end if;*/
191 
192     -- Creating Tasks
193     OKC_TASK_PUB.CREATE_TASK(
194        p_api_version,
195        p_init_msg_list,
196 	  'F',
197 	  x_rtvv_rec.id,
198 	  p_tze_id,
199 	  p_tze_name,
200 	  p_tve_id,
201 	  p_date,
202        x_return_status,
203        x_msg_count,
204        x_msg_data,
205 	  x_task_id);
206 
207      IF x_return_status = OKC_API.G_RET_STS_UNEXP_ERROR THEN
208 	   raise OKC_API.G_EXCEPTION_UNEXPECTED_ERROR;
209      ELSIF x_return_status = OKC_API.G_RET_STS_ERROR THEN
210 	   raise OKC_API.G_EXCEPTION_ERROR;
211      END IF;
212 
213 	  OKC_API.END_ACTIVITY(l_msg_count, l_msg_data);
214 
215      EXCEPTION
216 		WHEN OKC_API.G_EXCEPTION_ERROR THEN
217 		 x_return_status := OKC_API.HANDLE_EXCEPTIONS
218 		 (l_api_name,
219 		  G_PKG_NAME,
220 		  'OKC_API.G_RET_STS_ERROR',
221 		  x_msg_count,
222 		  x_msg_data,
223 		  '_COMPLEX');
224 		WHEN OKC_API.G_EXCEPTION_UNEXPECTED_ERROR THEN
225 		 x_return_status := OKC_API.HANDLE_EXCEPTIONS
226 		 (l_api_name,
227 		  G_PKG_NAME,
228 		  'OKC_API.G_RET_STS_UNEXP_ERROR',
229 		  x_msg_count,
230 		  x_msg_data,
231 		  '_COMPLEX');
232 		WHEN OTHERS THEN
233 		 x_return_status := OKC_API.HANDLE_EXCEPTIONS
234 		 (l_api_name,
235 		  G_PKG_NAME,
236 		  'OTHERS',
237 		  x_msg_count,
238 		  x_msg_data,
239 		  '_COMPLEX');
240 
241   END Create_RTV_N_Tasks;
242 
243   PROCEDURE Res_day_of_week(
244     x_return_status                OUT NOCOPY VARCHAR2,
245     p_api_version	    IN NUMBER,
246     p_init_msg_list         IN VARCHAR2 ,
247     p_tve_id  IN NUMBER,
248     p_tze_id  IN NUMBER,
249     p_tze_name IN                     VARCHAR2,
250     p_start_date IN DATE,
251     p_end_date  IN DATE,
252     p_cutoff_date IN DATE ,
253     p_nth IN NUMBER,
254     p_daynum_of_week IN NUMBER,
255     p_hour IN NUMBER,
256     p_minute IN NUMBER,
257     p_second IN NUMBER) IS
258     l_daynum_of_week              number := OKC_API.G_MISS_NUM;
259     l_daynum_offset               number := OKC_API.G_MISS_NUM;
260     l_date                        date := OKC_API.G_MISS_DATE;
261     l_start_day_of_month          date := OKC_API.G_MISS_DATE;
262     l_nth                         NUMBER := p_nth;
263     x_msg_count              NUMBER;
264     x_task_id              NUMBER;
265     x_msg_data               VARCHAR2(2000);
266     BEGIN
267 
268     /* resolving day of the week to an actual date
269 	  e.g. 5th Monday between 1st Jan 2000 and 30th june 2000 will be 31st Jan 2000 and 29 th May 2000
270     */
271 
272       x_return_status                := OKC_API.G_RET_STS_SUCCESS;
273 	 if l_nth = 0 or l_nth is NULL then
274 	   l_daynum_of_week               := to_char(p_start_date,'D');
275 	   l_daynum_offset := p_daynum_of_week - l_daynum_of_week ;
276 	   if l_daynum_offset < 0 then
277 	      l_daynum_offset := 7 + l_daynum_offset;
278 	   end if;
279 	   l_date := to_date(to_char(p_start_date + l_daynum_offset,'mmddyyyy') ||
280 	 	   lpad(p_hour,2,'0') ||
281 	        lpad(p_minute,2,'0') ||
282 	        lpad(p_second,2,'0'), 'mmddyyyyhh24miss');
283 	   if l_date > p_end_date then
284           x_return_status                := OKC_API.G_RET_STS_SUCCESS;
285 		return;
286 	   end if;
287 	   while (l_date <= p_end_date) loop
288           Create_RTV_N_Tasks(
289             x_return_status,
290             p_api_version,
291             p_init_msg_list,
292             p_tve_id,
293             l_date,
294 		  p_cutoff_date,
295 		  NULL,
296             p_tze_id,
297             p_tze_name);
298 		if x_return_status <> OKC_API.G_RET_STS_SUCCESS THEN
299 		  exit;
300           end if;
301 	     l_date := l_date + 7;
302 	   end loop;
303       else
304 
305 	 /* nth is the frequency i.e. 99 means last e.g. nth=99, day_of_week=1 will mean Last Sunday */
306 
307 	   if l_nth = 99 then
308 	      l_nth := 5;
309         end if;
310 	   l_start_day_of_month := to_date(to_char(p_start_date,'mmyyyy'),'mmyyyy');
311 	   while l_date <= p_end_date loop
312 	     l_daynum_of_week               := to_char(l_start_day_of_month,'D');
313 	     l_daynum_offset := p_daynum_of_week - l_daynum_of_week ;
314 	     if l_daynum_offset < 0 then
315 	        l_daynum_offset := 7 + l_daynum_offset;
316 	     end if;
317 	     l_daynum_offset := l_daynum_offset + (l_nth - 1) * 7;
318 	     l_date := to_date(to_char(l_start_day_of_month + l_daynum_offset,'mmddyyyy') ||
319 	 	   lpad(p_hour,2,'0') ||
320 	        lpad(p_minute,2,'0') ||
321 	        lpad(p_second,2,'0'), 'mmddyyyyhh24miss');
322           while (to_char(l_date,'MM') <> to_char(l_start_day_of_month,'MM')) loop
323 		  l_date := l_date - 7;
324           end loop;
325 	     if l_date >= p_start_date  and l_date <= p_end_date then
326              Create_RTV_N_Tasks(
327                x_return_status,
328                p_api_version,
329                p_init_msg_list,
330                p_tve_id,
331                l_date,
332 			p_cutoff_date,
333                NULL,
334                p_tze_id,
335                p_tze_name);
336 		   if x_return_status <> OKC_API.G_RET_STS_SUCCESS THEN
337 		    exit;
338 		   end if;
339           end if;
340 		l_start_day_of_month := add_months(l_start_day_of_month,1);
341 	  end loop;
342     end if;
343   END Res_day_of_week;
344 
345   PROCEDURE Res_Time_Events (
346     x_return_status                OUT NOCOPY VARCHAR2,
347     p_api_version	    IN NUMBER,
348     p_init_msg_list         IN VARCHAR2 ,
349     p_cnh_id                       IN NUMBER,
350     p_coe_id                       IN NUMBER,
351     p_date                         IN date) IS
352     item_not_found_error          EXCEPTION;
353     CURSOR okc_tgn_csr (p_cnh_id IN NUMBER)
354     IS
355     SELECT id, tze_id
356      FROM OKC_TIMEVALUES tgn
357      WHERE cnh_id = p_cnh_id
358 	 AND tve_type = 'TGN';
359 
360     CURSOR okc_tal_csr (p_id                 IN NUMBER)
361     IS
362       SELECT id, tve_type, duration, operator, before_after, datetime, tve_id_offset, uom_code, tze_id
363       FROM Okc_Timevalues
364       connect by tve_id_offset = prior id
365       start with tve_id_offset = p_id;
366 
367     l_okc_tal_rec                 okc_tal_csr%ROWTYPE;
368     l_okc_tgn_rec                 okc_tgn_csr%ROWTYPE;
369     l_date                        date;
370     l_end_date                    date := NULL; -- bug#2337567 -- default value
371     l_tze_name                    OKX_TIMEZONES_V.global_timezone_name%TYPE;
372     x_task_id                     NUMBER;
373     l_tze_id                 NUMBER;
374     l_tve_id                 NUMBER;
375     x_msg_count              NUMBER;
376     x_msg_data               VARCHAR2(2000);
377     l_found                  BOOLEAN := FALSE;
378     l_cutoff_date            DATE := NULL;
379     BEGIN
380 
381     /*
382 	 Resolve timevalues related to an event e.g 10 days after Contract Signing. Will be triggered only when the
383 	 event occurs
384     */
385 
386       x_return_status                := OKC_API.G_RET_STS_SUCCESS;
387 	 l_date := NULL;
388       OPEN okc_tgn_csr(p_cnh_id);
389 	 LOOP
390         FETCH okc_tgn_csr INTO l_okc_tgn_rec;
391 	   EXIT WHEN okc_tgn_csr%NOTFOUND;
392            l_found      := FALSE;   -- bug#2337567  -- moved up from bottom
393            l_end_date   := NULL;    -- bug#2337567  -- the initialization was lost
394 	        l_date       := p_date;
395         FOR l_okc_tal_rec in okc_tal_csr(l_okc_tgn_rec.id)
396 	   LOOP
397 		 l_found := TRUE;
398 		 if l_okc_tal_rec.before_after = 'B' then
399 		    l_okc_tal_rec.duration := -1 * l_okc_tal_rec.duration;
400 		 end if;
401            l_end_date := OKC_TIME_UTIL_PUB.GET_ENDDATE(
402 						l_date,
403                               l_okc_tal_rec.uom_code,
404 					     l_okc_tal_rec.duration);
405            if l_end_date is NULL Then
406              OKC_API.set_message(G_APP_NAME, G_INVALID_VALUE,G_COL_NAME_TOKEN,'END_DATE');
407              x_return_status := OKC_API.G_RET_STS_ERROR;
408 		   exit;
409            end if;
410 		 if ((l_end_date - l_date) >= 1) then
411 		   l_date := l_end_date + 1;
412 		 else
413 		   l_date := l_end_date + (86399/86400);
414 		 end if;
415 	      l_tve_id := l_okc_tal_rec.id;
416 		 l_tze_id := l_okc_tal_rec.tze_id;
417 	  END LOOP;
418 	  IF x_return_status <> OKC_API.G_RET_STS_SUCCESS Then
419 	    exit;
420        END IF;
421        IF l_end_date is NULL THEN
422 	    if l_found  THEN
423 		 goto next_record;
424 	    else
425 	      l_end_date := p_date;
426 	      l_tve_id := l_okc_tgn_rec.id;
427 	      l_tze_id := l_okc_tgn_rec.tze_id;
428          END IF;
429        END IF;
430 	  if l_tze_id is NOT NULL and
431 	     l_tze_id <> OKC_API.G_MISS_NUM then
432           Get_Timezone(l_tze_id, l_tze_name, x_return_status);
433 	     if x_return_status <> OKC_API.G_RET_STS_SUCCESS THEN
434 	       exit;
435 	     end if;
436 	  else
437 	    l_tze_name := NULL;
438 	  end if;
439        Create_RTV_N_Tasks(
440          x_return_status,
441          p_api_version,
442          p_init_msg_list,
443          l_tve_id,
444          l_end_date,
445 	    l_cutoff_date,
446 	    p_coe_id,
447          l_tze_id,
448          l_tze_name);
449 	  if x_return_status <> OKC_API.G_RET_STS_SUCCESS THEN
450 	    exit;
451 	  end if;
452 	 << next_record>>
453             null;    -- bug#2337567 -- see initialization in head of the loop
454 	END LOOP;
455     EXCEPTION
456       WHEN OTHERS THEN
457         OKC_API.SET_MESSAGE(p_app_name     => g_app_name,
458                             p_msg_name     => g_unexpected_error,
459                             p_token1       => g_sqlcode_token,
460                             p_token1_value => sqlcode,
461                             p_token2       => g_col_name_token,
462                             p_token2_value => 'TVE_ID',
463                             p_token3       => g_sqlerrm_token,
464                             p_token3_value => sqlerrm);
465       -- notify caller of an UNEXPECTED error
466         x_return_status := OKC_API.G_RET_STS_UNEXP_ERROR;
467   END  Res_Time_Events ;
468 
469   PROCEDURE Res_TPG_Delimited (
470     x_return_status                OUT NOCOPY VARCHAR2,
471     p_api_version	    IN NUMBER,
472     p_init_msg_list         IN VARCHAR2 ,
473     p_tve_id                       IN NUMBER,
474     p_tze_id                       IN NUMBER,
475     p_tze_name                     VARCHAR2,
476     p_month                        IN NUMBER,
477     p_day                          IN NUMBER,
478     p_nth                          IN NUMBER,
479     p_day_of_week                  IN VARCHAR2,
480     p_hour                         IN NUMBER,
481     p_minute                       IN NUMBER,
482     p_second                       IN NUMBER,
483     p_start_date                   IN date,
484     p_end_date                     IN date,
485     p_cutoff_date                 IN date) IS
486     l_month                       NUMBER := OKC_API.G_MISS_NUM;
487     l_start_date1                  date := OKC_API.G_MISS_DATE;
488     l_end_date1                    date := OKC_API.G_MISS_DATE;
489     l_start_date                  date := OKC_API.G_MISS_DATE;
490     l_end_date                    date := OKC_API.G_MISS_DATE;
491     l_date                        date := OKC_API.G_MISS_DATE;
492     l_daynum_of_week              NUMBER;
493     x_msg_count              NUMBER;
494     x_msg_data               VARCHAR2(2000);
495     x_task_id                     NUMBER;
496     BEGIN
497 
498     /*
499 	 Resolve all generic dates e.g. Last day of every month or, 15th of every month etc.
500 	 Nth is the frequency i.e. 99 means last e.g. nth=99, day_of_week=1 will mean Last Sunday.
501 	 Also p_day=99 means the last day of the month
502     */
503 
504       x_return_status                := OKC_API.G_RET_STS_SUCCESS;
505 	 /* Find the start and end dates if not passed and store them in l_start_date1 and l_end_date1 */
506 	 if (p_start_date is null or p_start_date = OKC_API.G_MISS_DATE) then
507         OKC_API.set_message(G_APP_NAME, G_INVALID_VALUE,G_COL_NAME_TOKEN,'START_DATE');
508         x_return_status := OKC_API.G_RET_STS_ERROR;
509 	   return;
510 	 elsif (p_end_date is null or p_end_date = OKC_API.G_MISS_DATE) then
511         OKC_API.set_message(G_APP_NAME, G_INVALID_VALUE,G_COL_NAME_TOKEN,'END_DATE');
512         x_return_status := OKC_API.G_RET_STS_ERROR;
513 	   return;
514 	 else
515 	   if p_start_date > p_end_date then
516           x_return_status := OKC_API.G_RET_STS_ERROR;
517           OKC_API.set_message(G_APP_NAME, G_INVALID_VALUE,G_COL_NAME_TOKEN,'START_DATE');
518 	     return;
519 	   end if;
520 	   l_start_date1 := p_start_date;
521 	   l_end_date1 := p_end_date;
522 	 end if;
523 	 if (p_day_of_week is NOT NULL and p_day_of_week <> OKC_API.G_MISS_CHAR) then
524 	   if p_day_of_week = 'SUN' then
525 		l_daynum_of_week := 1;
526 	   elsif p_day_of_week = 'MON' then
527 		l_daynum_of_week := 2;
528 	   elsif p_day_of_week = 'TUE' then
529 		l_daynum_of_week := 3;
530 	   elsif p_day_of_week = 'WED' then
531 		l_daynum_of_week := 4;
532 	   elsif p_day_of_week = 'THU' then
533 		l_daynum_of_week := 5;
534 	   elsif p_day_of_week = 'FRI' then
535 		l_daynum_of_week := 6;
536 	   elsif p_day_of_week = 'SAT' then
537 		l_daynum_of_week := 7;
538 	   end if;
539 	 end if;
540 	 If p_month is not null then
541 	   l_month := to_char(l_start_date1,'MM');
542 	   if l_month = p_month then
543 		l_start_date := l_start_date1;
544 	   elsif l_month < p_month then
545 		l_start_date := to_date('01'||lpad(p_month,2,0)||to_char(l_start_date1,'YYYY'),'ddmmyyyy');
546 	   elsif l_month > p_month then
547 		l_start_date := to_date('01'||lpad(p_month,2,0)||to_char(to_number(to_char(l_start_date1,'YYYY')) +1),'ddmmyyyy');
548         end if;
549 	   l_end_date := last_day(l_start_date);
550 	   if l_end_date1 < l_end_date then
551 		l_end_date := l_end_date1;
552 	   end if;
553 	   if l_start_date > l_end_date then
554 	   /* Will never be resolved */
555 	     return;
556 	   end if;
557 	   while (l_start_date <= l_end_date1) loop
558 	     If p_day_of_week is not null then
559             Res_day_of_week(x_return_status,
560                             p_api_version,
561                             p_init_msg_list,
562                             p_tve_id,
563                             p_tze_id,
564 					   p_tze_name,
565 		  			   l_start_date,
566 		  			   l_end_date,
567 					   p_cutoff_date,
568 		  			   p_nth,
569 		  			   l_daynum_of_week,
570 		  			   p_hour,
571 		  			   p_minute,
572 		  			   p_second);
573           elsif p_day is not null and
574 	  	    p_day <> 99 then
575 	       l_date := to_date(lpad(p_day,2,'0') ||
576 		  			   to_char(l_start_date,'mmyyyy') ||
577 		  			   lpad(p_hour,2,'0') ||
578 		  			   lpad(p_minute,2,'0') ||
579 		  			   lpad(p_second,2,'0'),'ddmmyyyyhh24miss');
580 	       if l_date >= l_start_date then
581               Create_RTV_N_Tasks(
582                 x_return_status,
583                 p_api_version,
584                 p_init_msg_list,
585                 p_tve_id,
586                 l_date,
587 			 p_cutoff_date,
588 	           NULL,
589                 p_tze_id,
590                 p_tze_name);
591 		    if x_return_status <> OKC_API.G_RET_STS_SUCCESS THEN
592 		      exit;
593 		    end if;
594 		  end if;
595           elsif p_day = 99 then
596 	       l_date := last_day(to_date( to_char(l_start_date,'mmyyyy') ||
597 					   lpad(p_hour,2,'0') ||
598 					   lpad(p_minute,2,'0') ||
599 					   lpad(p_second,2,'0'),'mmyyyyhh24miss'));
600             Create_RTV_N_Tasks(
601               x_return_status,
602               p_api_version,
603               p_init_msg_list,
604               p_tve_id,
605               l_date,
606 		    p_cutoff_date,
607 	         NULL,
608               p_tze_id,
609               p_tze_name);
610 		  if x_return_status <> OKC_API.G_RET_STS_SUCCESS THEN
611 		    exit;
612 		  end if;
613 	     end if;
614 	     l_start_date := to_date('01'||lpad(p_month,2,0)||to_char(to_number(to_char(l_start_date,'yyyy'))+1),'ddmmyyyy');
615 	     l_end_date := last_day(l_start_date);
616 	     if l_end_date1 < l_end_date then
617 		  l_end_date := l_end_date1;
618 	     end if;
619 	   end loop;
620       end if;
621     If p_day_of_week is not null and
622 	  p_month is null then
623       Res_day_of_week(x_return_status,
624                       p_api_version,
625                       p_init_msg_list,
626                       p_tve_id,
627                       p_tze_id,
628                       p_tze_name,
629 		  		  l_start_date1,
630 		  		  l_end_date1,
631 				  p_cutoff_date,
632 				  p_nth,
633 				  l_daynum_of_week,
634 				  p_hour,
635 				  p_minute,
636 				  p_second);
637     elsif p_day is not null and
638           p_day <> 99 and
639 	     p_month is null then
640 		l_start_date := l_start_date1;
641 	     l_date := to_date(lpad(p_day,2,'0') ||
642 				   to_char(l_start_date,'mmyyyy') ||
643 				   lpad(p_hour,2,'0') ||
644 				   lpad(p_minute,2,'0') ||
645 				   lpad(p_second,2,'0'),'ddmmyyyyhh24miss');
646 	 while (l_date <= l_end_date1) loop
647 	   if l_date >= l_start_date1 then
648           Create_RTV_N_Tasks(
649             x_return_status,
650             p_api_version,
651             p_init_msg_list,
652             p_tve_id,
653             l_date,
654 		  p_cutoff_date,
655 	       NULL,
656             p_tze_id,
657             p_tze_name);
658 		if x_return_status <> OKC_API.G_RET_STS_SUCCESS THEN
659 		  exit;
660 		end if;
661 	    end if;
662 	   l_date := add_months(l_date,1);
663 	 end loop;
664     elsif p_day = 99 and
665 	  p_month is null then
666 	  l_start_date := l_start_date1;
667 	 l_date := last_day(to_date( to_char(l_start_date,'mmyyyy') ||
668 				   lpad(p_hour,2,'0') ||
669 				   lpad(p_minute,2,'0') ||
670 				   lpad(p_second,2,'0'),'mmyyyyhh24miss'));
671 	 while (l_date <= l_end_date1) loop
672         Create_RTV_N_Tasks(
673           x_return_status,
674           p_api_version,
675           p_init_msg_list,
676           p_tve_id,
677           l_date,
678 		p_cutoff_date,
679 	     NULL,
680           p_tze_id,
681           p_tze_name);
682 	   if x_return_status <> OKC_API.G_RET_STS_SUCCESS THEN
683 	    exit;
684 	   end if;
685 	   l_date := add_months(l_date,1);
686 	 end loop;
687     elsif (p_day is null and  /* Every day */
688 		 p_month is null and
689 		 p_day_of_week is null) then
690 		l_start_date := l_start_date1;
691 	 l_date := to_date( to_char(l_start_date,'yyyymmdd') ||
692 				   lpad(p_hour,2,'0') ||
693 				   lpad(p_minute,2,'0') ||
694 				   lpad(p_second,2,'0'),'yyyymmddhh24miss');
695 	 while (l_date <= l_end_date1) loop
696         Create_RTV_N_Tasks(
697           x_return_status,
698           p_api_version,
699           p_init_msg_list,
700           p_tve_id,
701           l_date,
702 		p_cutoff_date,
703 	     NULL,
704           p_tze_id,
705           p_tze_name);
706 	   if x_return_status <> OKC_API.G_RET_STS_SUCCESS THEN
707 	    exit;
708 	   end if;
709 	   l_date := l_date + 1;
710 	 end loop;
711     end if;
712     EXCEPTION
713       WHEN OTHERS THEN
714         OKC_API.SET_MESSAGE(p_app_name     => g_app_name,
715                             p_msg_name     => g_unexpected_error,
716                             p_token1       => g_sqlcode_token,
717                             p_token1_value => sqlcode,
718                             p_token2       => g_col_name_token,
719                             p_token2_value => 'TVE_ID',
720                             p_token3       => g_sqlerrm_token,
721                             p_token3_value => sqlerrm);
722       -- notify caller of an UNEXPECTED error
723         x_return_status := OKC_API.G_RET_STS_UNEXP_ERROR;
724   END  Res_TPG_Delimited ;
725 
726   PROCEDURE Res_TPG_Delimited (
727     x_return_status                OUT NOCOPY VARCHAR2,
728     p_api_version	    IN NUMBER,
729     p_init_msg_list         IN VARCHAR2 ,
730     p_tve_id                       IN NUMBER,
731     p_start_date                   IN date,
732     p_end_date                     IN date,
733     p_cutoff_date                     IN date) IS
734     item_not_found_error          EXCEPTION;
735     l_row_notfound                 BOOLEAN := TRUE;
736     l_month                       NUMBER := OKC_API.G_MISS_NUM;
737     l_start_date1                  date := OKC_API.G_MISS_DATE;
738     l_end_date1                    date := OKC_API.G_MISS_DATE;
739     l_start_date                  date := OKC_API.G_MISS_DATE;
740     l_end_date                    date := OKC_API.G_MISS_DATE;
741     l_date                        date := OKC_API.G_MISS_DATE;
742     x_task_id                     NUMBER;
743     l_tze_name                    OKX_TIMEZONES_V.global_timezone_name%TYPE;
744     CURSOR okc_tgd_csr (p_tve_id IN NUMBER)
745     IS
746       SELECT month, day, nth, day_of_week, hour, minute, second, tze_id
747         FROM OKC_TIMEVALUES
748        WHERE id = p_tve_id
749 		and  tve_type = 'TGD';
750     l_okc_tgd_rec                 okc_tgd_csr%ROWTYPE;
751     BEGIN
752 
753     /*
754 	 Resolve all generic dates e.g. Last day of every month or, 15th of every month etc.
755     */
756 
757       x_return_status                := OKC_API.G_RET_STS_SUCCESS;
758 	 /* Find the start and end dates if not passed and store them in l_start_date1 and l_end_date1 */
759 	 if (p_start_date is null or p_start_date = OKC_API.G_MISS_DATE) then
760         OKC_API.set_message(G_APP_NAME, G_INVALID_VALUE,G_COL_NAME_TOKEN,'START_DATE');
761         x_return_status := OKC_API.G_RET_STS_ERROR;
762 	   return;
763 	 elsif (p_end_date is null or p_end_date = OKC_API.G_MISS_DATE) then
764         OKC_API.set_message(G_APP_NAME, G_INVALID_VALUE,G_COL_NAME_TOKEN,'END_DATE');
765         x_return_status := OKC_API.G_RET_STS_ERROR;
766 	   return;
767 	 else
768 	   if p_start_date > p_end_date then
769           x_return_status := OKC_API.G_RET_STS_ERROR;
770           OKC_API.set_message(G_APP_NAME, 'OKC_INVALID_END_DATE');
771 	     return;
772 	   end if;
773 	   l_start_date1 := p_start_date;
774 	   l_end_date1 := p_end_date;
775 	 end if;
776       OPEN okc_tgd_csr(p_tve_id);
777       FETCH okc_tgd_csr INTO l_okc_tgd_rec;
778       l_row_notfound := okc_tgd_csr%NOTFOUND;
779       CLOSE okc_tgd_csr;
780       IF (l_row_notfound) THEN
781         OKC_API.set_message(G_APP_NAME, G_INVALID_VALUE,G_COL_NAME_TOKEN,'TVE_ID');
782         RAISE item_not_found_error;
783       END IF;
784 	 if l_okc_tgd_rec.tze_id is NOT NULL and
785 	    l_okc_tgd_rec.tze_id <> OKC_API.G_MISS_NUM then
786          Get_Timezone(l_okc_tgd_rec.tze_id, l_tze_name, x_return_status);
787 	    if x_return_status <> OKC_API.G_RET_STS_SUCCESS THEN
788 	      return;
789 	    end if;
790 	 else
791 	   l_tze_name := NULL;
792 	 end if;
793       Res_TPG_Delimited (
794         x_return_status,
795         p_api_version,
796         p_init_msg_list,
797 	   p_tve_id,
798         l_okc_tgd_rec.tze_id,
799         l_tze_name,
800         l_okc_tgd_rec.month,
801         l_okc_tgd_rec.day,
802         l_okc_tgd_rec.nth,
803         l_okc_tgd_rec.day_of_week,
804         l_okc_tgd_rec.hour,
805         l_okc_tgd_rec.minute,
806         l_okc_tgd_rec.second,
807         p_start_date,
808         p_end_date,
809 	   p_cutoff_date) ;
810     EXCEPTION
811       WHEN item_not_found_error THEN
812         x_return_status := OKC_API.G_RET_STS_ERROR;
813       WHEN OTHERS THEN
814         OKC_API.SET_MESSAGE(p_app_name     => g_app_name,
815                             p_msg_name     => g_unexpected_error,
816                             p_token1       => g_sqlcode_token,
817                             p_token1_value => sqlcode,
818                             p_token2       => g_col_name_token,
819                             p_token2_value => 'TVE_ID',
820                             p_token3       => g_sqlerrm_token,
821                             p_token3_value => sqlerrm);
822       -- notify caller of an UNEXPECTED error
823         x_return_status := OKC_API.G_RET_STS_UNEXP_ERROR;
824   END  Res_TPG_Delimited ;
825 
826   PROCEDURE Res_Cycle (
827     x_return_status                OUT NOCOPY VARCHAR2,
828     p_api_version	    IN NUMBER,
829     p_init_msg_list         IN VARCHAR2 ,
830     p_tve_id                       IN NUMBER,
831     p_tze_id                       IN NUMBER,
832     p_tze_name                       IN VARCHAR2,
833     p_start_date                   IN date,
834     p_end_date                     IN date,
835     p_cutoff_date                     IN date) IS
836     CURSOR okc_spn_csr (p_id                 IN NUMBER)
837     IS
838       SELECT id, active_yn, duration, uom_code
839       FROM Okc_Span
840       connect by prior id = spn_id
841       start with ((spn_id is NULL) or (spn_id = OKC_API.G_MISS_NUM)) and
842 	   tve_id = p_id;
843     type l_okc_spn_tbl_type is table of okc_spn_csr%ROWTYPE index by binary_integer;
844     item_not_found_error          EXCEPTION;
845     l_row_notfound                 BOOLEAN := TRUE;
846     l_end_date                     date;
847     l_start_date                   date;
848     i                              NUMBER;
849     l_okc_spn_tbl                  l_okc_spn_tbl_type;
850     x_msg_count              NUMBER;
851     x_msg_data               VARCHAR2(2000);
852     x_task_id              NUMBER;
853     BEGIN
854 
855     /*
856 	 Resolve all recurring dates e.g. Every 6 months
857     */
858 
859       x_return_status                := OKC_API.G_RET_STS_SUCCESS;
860 	 /* Find the start and end dates if not passed and store them in l_start_date1 and l_end_date1 */
861 	 if (p_start_date is null or p_start_date = OKC_API.G_MISS_DATE) then
862         OKC_API.set_message(G_APP_NAME, G_INVALID_VALUE,G_COL_NAME_TOKEN,'START_DATE');
863         x_return_status := OKC_API.G_RET_STS_ERROR;
864 	   return;
865 	 elsif (p_end_date is null or p_end_date = OKC_API.G_MISS_DATE) then
866         OKC_API.set_message(G_APP_NAME, G_INVALID_VALUE,G_COL_NAME_TOKEN,'END_DATE');
867         x_return_status := OKC_API.G_RET_STS_ERROR;
868 	   return;
869 	 else
870 	   if p_start_date > p_end_date then
871           x_return_status := OKC_API.G_RET_STS_ERROR;
872           OKC_API.set_message(G_APP_NAME, G_INVALID_VALUE,G_COL_NAME_TOKEN,'START_DATE');
873 	     return;
874 	   end if;
875 	 end if;
876 	 l_start_date := p_start_date;
877 	 l_end_date := p_start_date;
878 
879 	 /* one recurring timevalue may comprise of many spans */
880 
881 	 OPEN okc_spn_csr(p_tve_id);
882 	 i := 0;
883 	 LOOP
884         FETCH okc_spn_csr INTO l_okc_spn_tbl(i);
885         EXIT WHEN okc_spn_csr%NOTFOUND;
886 	   i:=i+1;
887 	 END LOOP;
888       CLOSE okc_spn_csr;
889       IF (l_okc_spn_tbl.COUNT > 0) THEN
890         while l_end_date <= p_end_date
891 	   LOOP
892           i := l_okc_spn_tbl.FIRST;
893           LOOP
894 	       l_end_date := okc_time_util_pub.get_enddate(l_start_date, l_okc_spn_tbl(i).uom_code,l_okc_spn_tbl(i).duration);
895 	       if (l_end_date > p_end_date) THEN
896 		    exit;
897 		  end if;
898 		  if l_okc_spn_tbl(i).active_yn = 'Y' then
899                Create_RTV_N_Tasks(
900                  x_return_status,
901                  p_api_version,
902                  p_init_msg_list,
903                  p_tve_id,
904                  l_end_date,
905 			  p_cutoff_date,
906 	            NULL,
907                  p_tze_id,
908                  p_tze_name);
909 	          if x_return_status <> OKC_API.G_RET_STS_SUCCESS THEN
910 	           exit;
911 	          end if;
912             end if;
913 		  if ((l_end_date - l_start_date) >= 1) then
914 		    l_start_date := l_end_date + 1;
915 		  else
916 		    l_start_date := l_end_date + (86399/86400);
917 		  end if;
918             EXIT WHEN (i = l_okc_spn_tbl.LAST);
919             i := l_okc_spn_tbl.NEXT(i);
920 	     END LOOP;
921 	     IF x_return_status <> OKC_API.G_RET_STS_SUCCESS Then
922 	       exit;
923           END IF;
924 	     if (l_end_date > p_end_date) THEN
925 		  exit;
926 		end if;
927         END LOOP;
928 	 ELSE
929         x_return_status := OKC_API.G_RET_STS_ERROR;
930         OKC_API.set_message(G_APP_NAME, G_INVALID_VALUE,G_COL_NAME_TOKEN,'SPN_ID');
931 	   return;
932       END IF;
933     EXCEPTION
934       WHEN item_not_found_error THEN
935         x_return_status := OKC_API.G_RET_STS_ERROR;
936       WHEN OTHERS THEN
937         OKC_API.SET_MESSAGE(p_app_name     => g_app_name,
938                             p_msg_name     => g_unexpected_error,
939                             p_token1       => g_sqlcode_token,
940                             p_token1_value => sqlcode,
941                             p_token2       => g_col_name_token,
942                             p_token2_value => 'TVE_ID',
943                             p_token3       => g_sqlerrm_token,
944                             p_token3_value => sqlerrm);
945       -- notify caller of an UNEXPECTED error
946         x_return_status := OKC_API.G_RET_STS_UNEXP_ERROR;
947   END  Res_Cycle ;
948 
949 -- The parameters p_resolved_until_date is the date till which the timevalues will be resolved
950 --                p_cutoff_date is the threshold date below which dates resolved will be ignored.
951 --  In other words dates will be resolved between p_cutoff_date and the least of (p_resolved_until_date,end date of K header/Line)
952 
953 
954   PROCEDURE Res_Time_K(
955     p_chr_id IN NUMBER,
956     p_resolved_until_date IN DATE ,
957     p_cutoff_date         IN DATE,
958     p_api_version	    IN NUMBER,
959     p_init_msg_list         IN VARCHAR2 ,
960     x_return_status OUT NOCOPY VARCHAR2) IS
961 
962      TYPE rule_csr_type is REF CURSOR;
963 	rule_csr rule_csr_type;
964 
965      TYPE tve_id_csr_type is REF CURSOR;
966 	tve_id_csr tve_id_csr_type;
967 
968 -- The following cursor is changed to nvl for dates for Bug#2386569 regarding initialization for perpetual contracts
969     CURSOR limited_by_csr(p_tve_id IN NUMBER) is
970      select nvl(ise.start_date,to_date('01010001','ddmmyyyy')) start_date,
971             nvl(ise.end_date,to_date('31124000','ddmmyyyy')) end_date,
972                 tze_id
973       from okc_time_ia_startend_val_v ise
974       where ise.id = p_tve_id;
975 
976     l_list_of_rules                VARCHAR2(4000);
977     l_list_of_rules1               VARCHAR2(4000);
978     l_list_of_tve_id               VARCHAR2(4000);
979     l_row_not_found                BOOLEAN := TRUE;
980     l_limited_by_rec               limited_by_csr%ROWTYPE;
981     l_start_date                   DATE;
982     l_end_date                     DATE;
983     l_k_start_date                 DATE;
984     l_k_end_date                   DATE;
985     l_rul_id                       NUMBER;
986     l_chr_id                       NUMBER;
987     l_cle_id                       NUMBER;
988     l_tve_id                       NUMBER;
989     l_tve_id_limited               NUMBER;
990     l_tve_type                     OKC_TIMEVALUES.tve_type%type;
991     l_sql_string varchar2(4000);
992     l_datetime                     date;
993     x_msg_count              NUMBER;
994     x_msg_data               VARCHAR2(2000);
995     x_task_id              NUMBER;
996     l_rule_type                    OKC_RULES_V.rule_information_category%type;
997     l_app_id         number;
998     l_rule_df_name   varchar2(40);
999     l_col_val_table  OKC_TIME_UTIL_PUB.t_col_vals;
1000     l_no_of_cols     number;
1001     l_tze_id     number;
1002     l_tze_name                    OKX_TIMEZONES_V.global_timezone_name%TYPE;
1003     p_isev_ext_rec	              OKC_TIME_PUB.isev_ext_rec_type;
1004     x_isev_ext_rec	              OKC_TIME_PUB.isev_ext_rec_type;
1005     l_pending_further_resolving   VARCHAR2(1) := 'X';
1006     l_over_further_resolving   VARCHAR2(1) := 'X';
1007 
1008   BEGIN
1009 
1010     /*
1011 	 Resolve all timevalues related to a contract (excluding the event ones).
1012     */
1013 
1014     /* Get the application_id and get the rule definition names */
1015 
1016     l_app_id := OKC_TIME_UTIL_PUB.get_app_id;
1017     if l_app_id is null then
1018       return;
1019     end if;
1020 
1021     l_rule_df_name := OKC_TIME_UTIL_PUB.get_rule_df_name;
1022     if l_rule_df_name is null then
1023       return;
1024     end if;
1025 
1026    /* Get all the rule types (e.g. NTN)  from metadata which are related to timevalues.*/
1027    /* Get all the rule types (e.g. NTN)  from metadata which are related to tasks.*/
1028 
1029     l_list_of_rules := OKC_TIME_UTIL_PUB.get_rule_defs_using_vs(l_app_id,l_rule_df_name,'OKC_TIMEVALUES');
1030     l_list_of_rules1 := OKC_TIME_UTIL_PUB.get_rule_defs_using_vs(l_app_id,l_rule_df_name,'OKC_TASK_RS');
1031 
1032     x_return_status     := OKC_API.G_RET_STS_SUCCESS;
1033 
1034     /* For these rules, get their ids using the contract header (line) id.               */
1035 
1036     l_sql_string := 'select r.id, rg.chr_id, rg.cle_id, r.rule_information_category ' ||
1037 	 'from okc_rules_b r, okc_rule_groups_b rg '||
1038 	 'where r.dnz_chr_id = :p_chr_id ' ||
1039 	 'and rg.id = r.rgp_id ' ||
1040 	 'and r.rule_information_category in '|| l_list_of_rules ||
1041 	 'and r.rule_information_category in '|| l_list_of_rules1 ;
1042     open rule_csr for l_sql_string using p_chr_id;
1043     loop
1044       fetch rule_csr into l_rul_id, l_chr_id, l_cle_id, l_rule_type;
1045 	 exit when rule_csr%NOTFOUND;
1046 
1047    /* Get all the timevalues associated with the rule. Currently there is only one tve_id per rule. May be extended in
1048 	 future. API is flexible to handle this   */
1049 
1050       l_list_of_tve_id := OKC_TIME_UTIL_PUB.get_tve_ids(l_app_id,l_rule_df_name,l_rule_type,'OKC_TIMEVALUES',
1051                                                        l_rul_id);
1052       if l_list_of_tve_id is NULL Then
1053 		goto next_row1;
1054       end if;
1055       l_sql_string :=
1056 	 'select id, tve_id_limited, tve_type, datetime, tze_id ' ||
1057 	 'from okc_timevalues ' ||
1058 	 'where ((tve_type in ( ''TGD'',''TAV''))'||
1059 	 ' or (tve_type = ''CYL'' and interval_yn = ''N'')) ' ||
1060 	 'and id in '|| l_list_of_tve_id;
1061       open tve_id_csr for l_sql_string;
1062       loop
1063 	   fetch tve_id_csr into l_tve_id, l_tve_id_limited, l_tve_type, l_datetime, l_tze_id;
1064 	   exit when tve_id_csr%NOTFOUND;
1065 
1066 	   /* Absolute Time Value will have only one date */
1067 
1068 	  IF l_tve_type = 'TAV' then
1069 	     if l_tze_id is NOT NULL and
1070 	        l_tze_id <> OKC_API.G_MISS_NUM then
1071                Get_Timezone(l_tze_id, l_tze_name, x_return_status);
1072 	       if x_return_status <> OKC_API.G_RET_STS_SUCCESS THEN
1073 	         exit;
1074 	       end if;
1075 	     else
1076 	      l_tze_name := NULL;
1077 	     end if;
1078              Create_RTV_N_Tasks(
1079                x_return_status,
1080                p_api_version,
1081                p_init_msg_list,
1082                l_tve_id,
1083                l_datetime,
1084 	       p_cutoff_date,
1085 	       NULL,
1086                l_tze_id,
1087                l_tze_name);
1088 	    if x_return_status <> OKC_API.G_RET_STS_SUCCESS THEN
1089 	      exit;
1090 	    end if;
1091 	    goto next_row;
1092 	  end if;
1093 
1094        /* If timevalue is not limited use the Contract headers and lines effectivity */
1095 
1096 	   IF l_tve_id_limited is NULL or
1097 	      l_tve_id_limited = OKC_API.G_MISS_NUM then
1098              Get_K_Effectivity(
1099                l_chr_id,
1100                l_cle_id,
1101                l_start_date,
1102                l_end_date,
1103                x_return_status);
1104 	      if x_return_status <> OKC_API.G_RET_STS_SUCCESS THEN
1105 	        exit;
1106 	      end if;
1107              IF l_cle_id is NOT NULL and
1108 	         l_cle_id <> OKC_API.G_MISS_NUM Then
1109 		    null;
1110  	     ELSIF l_chr_id is NOT NULL and
1111 	         l_chr_id <> OKC_API.G_MISS_NUM Then
1112 
1113        /* If the contract is perpetual or for a very large duration, resolve this only until the derived
1114 		resolved until date to avoid too many resolved timevalues being created. this check has to be
1115 		done for each rule tied to a contract header.
1116 	   */
1117 
1118 	         if l_end_date >= p_resolved_until_date Then
1119 	           l_pending_further_resolving := '1';
1120 		 elsif l_end_date < p_resolved_until_date Then
1121 	           l_over_further_resolving := '1';
1122                  end if;
1123 	      end if;
1124 	      if l_end_date > p_resolved_until_date then
1125 		    l_end_date := p_resolved_until_date;
1126               end if;
1127 
1128 		 /* For generic and recurring call the respective procedures to create resolved timevalues */
1129               if l_start_date <= p_resolved_until_date then
1130 
1131 		 If l_tve_type = 'TGD' then
1132                     Res_TPG_Delimited ( x_return_status,p_api_version,p_init_msg_list,l_tve_id, l_start_date, l_end_date, p_cutoff_date);
1133 		 elsif l_tve_type = 'CYL' then
1134                     Res_Cycle ( x_return_status,p_api_version,p_init_msg_list,l_tve_id, l_tze_id, l_tze_name, l_start_date, l_end_date, p_cutoff_date);
1135 		 end if;
1136 	         if x_return_status <> OKC_API.G_RET_STS_SUCCESS THEN
1137 	           exit;
1138 	         end if;
1139 	       end if;
1140         ELSE
1141 
1142        /* If timevalue is limited get the effectivity of the timevalue using tve_id_limited */
1143 
1144           OPEN limited_by_csr(l_tve_id_limited);
1145           FETCH limited_by_csr into l_limited_by_rec;
1146           l_row_not_found := limited_by_csr%NOTFOUND;
1147           CLOSE limited_by_csr;
1148           IF (l_row_not_found) THEN
1149             OKC_API.set_message(G_APP_NAME, G_INVALID_VALUE,G_COL_NAME_TOKEN,'TVE_ID');
1150             x_return_status := OKC_API.G_RET_STS_ERROR;
1151           ELSE
1152             l_start_date := l_limited_by_rec.start_date;
1153             l_end_date   := l_limited_by_rec.end_date;
1154 
1155 		  /*
1156 		  A timevalue is created using the timevalue editor for an unsigned contract such that the start date is null
1157 		  (assuming to be the start of the contract) but the end date is a valid limiting date (not the end date of the
1158 		  contract). In order to store that as a tve_id_limited, the start_date can be set to the start_date of the
1159 		  contract header/line. But the contract is not yet signed, therfore a change to the start_date would mean a
1160 		  change in the start date of the tve_id_limited.
1161 		  In order to overcome this problem, we are storing the start_date as 01010001 and we will update this to the
1162 		  actual start date of the contract once the contract is signed/approved and this procedure is called.
1163 		  The same can be said to be the reason for storing end_date as 31124000 where the end_date is entered as null
1164 		  but the start date is an actual limiting date.
1165 
1166 		  BETTER SOLUTION: Change datamodel to have the K effectivity pointing to a timevalue and then the limited
1167 		  timevalue will also be pointing to the same start date as referenced by the contract start date.
1168             */
1169 
1170 	   if l_start_date = to_date('01010001','ddmmyyyy') or
1171 	      l_end_date = to_date('31124000','ddmmyyyy') Then
1172               Get_K_Effectivity(
1173                 l_chr_id,
1174                 l_cle_id,
1175                 l_k_start_date,
1176                 l_k_end_date,
1177                 x_return_status);
1178 	      if x_return_status <> OKC_API.G_RET_STS_SUCCESS THEN
1179 	           exit;
1180 	      end if;
1181 	      if l_start_date = to_date('01010001','ddmmyyyy') Then
1182 		      l_start_date := l_k_start_date;
1183                       if l_start_date > l_end_date Then
1184                          l_start_date := l_end_date;
1185                       end if;
1186 	      end if;
1187 	      if l_end_date = to_date('31124000','ddmmyyyy') Then
1188 		      l_end_date := l_k_end_date;
1189                       if l_start_date > l_end_date Then
1190                          l_end_date := l_start_date;
1191                       end if;
1192 	      end if;
1193               p_isev_ext_rec.start_date := l_start_date;
1194               p_isev_ext_rec.end_date :=  l_end_date;
1195 	      p_isev_ext_rec.id := l_tve_id_limited;
1196               OKC_TIME_pub.update_ia_startend(
1197                 p_api_version,
1198                 p_init_msg_list,
1199                 x_return_status,
1200                 x_msg_count,
1201                 x_msg_data,
1202                 p_isev_ext_rec,
1203                 x_isev_ext_rec);
1204               if (x_return_status <> OKC_API.G_RET_STS_SUCCESS) then
1205                 exit;
1206               end if;
1207             end if;
1208 
1209 		  /* For contract headers, if the end date > derived resolved until date, use the derived_resolved until date
1210 			as a limiting date for time resolving timevalue and also update the contract header to reflect this value.
1211 			Otherwise reset the resolved until date of the contract header to NULL
1212 			*/
1213 
1214             IF l_cle_id is NOT NULL and
1215 	          l_cle_id <> OKC_API.G_MISS_NUM Then
1216 		  null;
1217 	    ELSIF l_chr_id is NOT NULL and
1218 	          l_chr_id <> OKC_API.G_MISS_NUM Then
1219 	          if l_end_date > p_resolved_until_date Then
1220 	            l_pending_further_resolving := '1';
1221 		  elsif l_end_date < p_resolved_until_date Then
1222 	            l_over_further_resolving := '1';
1223                   end if;
1224 	    end if;
1225 	    if l_end_date > p_resolved_until_date then
1226 		    l_end_date := p_resolved_until_date;
1227             end if;
1228 
1229 		 /* For generic and recurring call the respective procedures to create resolved timevalues */
1230             if l_start_date <= p_resolved_until_date then
1231 
1232 		  If l_tve_type = 'TGD' then
1233                      Res_TPG_Delimited ( x_return_status,p_api_version,p_init_msg_list,l_tve_id, l_start_date, l_end_date, p_cutoff_date);
1234 		  elsif l_tve_type = 'CYL' then
1235                      Res_Cycle ( x_return_status,p_api_version,p_init_msg_list,l_tve_id, l_tze_id, l_tze_name, l_start_date, l_end_date, p_cutoff_date);
1236 		  end if;
1237 	          if x_return_status <> OKC_API.G_RET_STS_SUCCESS THEN
1238 	            exit;
1239 	          end if;
1240 	     end if;
1241           END IF;
1242         END IF;
1243 	   <<next_row>>
1244 		null;
1245        end loop;
1246        close tve_id_csr;
1247        IF x_return_status <> OKC_API.G_RET_STS_SUCCESS Then
1248          exit;
1249        END IF;
1250 	 <<next_row1>>
1251 		null;
1252       end loop;
1253       close rule_csr;
1254       if l_pending_further_resolving = '1' Then
1255 	   update okc_k_headers_b
1256 	     set resolved_until = p_resolved_until_date
1257 	     where id = l_chr_id;
1258 	 elsif l_over_further_resolving = '1' Then
1259 	   update okc_k_headers_b
1260 	     set resolved_until = NULL
1261 	     where id = l_chr_id;
1262 	 end if;
1263       l_pending_further_resolving  := 'X';
1264       l_over_further_resolving  := 'X';
1265       EXCEPTION
1266       WHEN OTHERS THEN
1267         OKC_API.SET_MESSAGE(p_app_name     => g_app_name,
1268                             p_msg_name     => g_unexpected_error,
1269                             p_token1       => g_sqlcode_token,
1270                             p_token1_value => sqlcode,
1271                             p_token2       => g_col_name_token,
1272                             p_token2_value => 'CHR_ID',
1273                             p_token3       => g_sqlerrm_token,
1274                             p_token3_value => sqlerrm);
1275       -- notify caller of an UNEXPECTED error
1276         x_return_status := OKC_API.G_RET_STS_UNEXP_ERROR;
1277     END Res_Time_K;
1278 
1279   PROCEDURE Res_Time_New_K(
1280     p_chr_id IN NUMBER,
1281     p_api_version	    IN NUMBER,
1282     p_init_msg_list         IN VARCHAR2 ,
1283     x_return_status OUT NOCOPY VARCHAR2) IS
1284 
1285   BEGIN
1286     Res_Time_K(p_chr_id => p_chr_id,
1287 			p_resolved_until_date => add_months(sysdate,(OKC_TIME_RES_PVT.RESOLVE_UNTIL_MONTHS +
1288 											     OKC_TIME_RES_PVT.PICKUP_UPTO_MONTHS)) ,
1289 			p_cutoff_date => sysdate,
1290 			p_api_version => p_api_version,
1291 			p_init_msg_list => p_init_msg_list,
1292 			x_return_status => x_return_status);
1293     END Res_Time_New_K;
1294 
1295   PROCEDURE Res_Time_Extnd_K(
1296     p_chr_id IN NUMBER,
1297     p_cle_id IN NUMBER,
1298     p_start_date IN DATE,
1299     p_end_date IN DATE,
1300     p_api_version	    IN NUMBER,
1301     p_init_msg_list         IN VARCHAR2 ,
1302     x_return_status OUT NOCOPY VARCHAR2) IS
1303 
1304     TYPE rgp_csr_type is REF CURSOR;
1305     rgp_csr rgp_csr_type;
1306 
1307     TYPE tve_id_csr_type is REF CURSOR;
1308     tve_id_csr tve_id_csr_type;
1309 
1310 -- The following cursor is changed to nvl for dates for Bug#2386569 regarding initialization for perpetual contracts
1311     CURSOR limited_by_csr(p_tve_id IN NUMBER) is
1312      select nvl(ise.start_date,to_date('01010001','ddmmyyyy')) start_date,
1313             nvl(ise.end_date,to_date('31124000','ddmmyyyy')) end_date,
1314             tze_id
1315       from okc_time_ia_startend_val_v ise
1316       where ise.id = p_tve_id;
1317 
1318 
1319     CURSOR resolved_until_csr(p_cle_id IN NUMBER) is
1320 	 SELECT resolved_until from okc_k_headers_b h, okc_k_lines_b l
1321 	 where h.id = l.chr_id
1322 	   and l.id = p_cle_id;
1323 
1324     l_list_of_rules                VARCHAR2(4000);
1325     l_list_of_rules1               VARCHAR2(4000);
1326     l_list_of_tve_id               VARCHAR2(4000);
1327     l_row_not_found                BOOLEAN := TRUE;
1328     l_tve_id                       NUMBER;
1329     l_rul_id                       NUMBER;
1330     l_tve_type                     OKC_TIMEVALUES.tve_type%type;
1331     l_datetime                     date;
1332     x_msg_count              NUMBER;
1333     x_msg_data               VARCHAR2(2000);
1334     l_sql_string varchar2(4000);
1335     l_rule_type                    OKC_RULES_V.rule_information_category%type;
1336     l_app_id         number;
1337     l_rule_df_name   varchar2(40);
1338     l_col_val_table  OKC_TIME_UTIL_PUB.t_col_vals;
1339     l_no_of_cols     number;
1340     l_tze_id     number;
1341     x_task_id              NUMBER;
1342     l_tze_name                    OKX_TIMEZONES_V.global_timezone_name%TYPE;
1343     l_resolved_until_date         DATE;
1344     l_cutoff_date                 DATE := NULL;
1345     l_end_date                    DATE;
1346     l_start_date                    DATE;
1347     l_tve_id_limited               NUMBER;
1348     l_limited_by_rec               limited_by_csr%ROWTYPE;
1349     l_pending_further_resolving   VARCHAR2(1) := 'X';
1350     l_over_further_resolving   VARCHAR2(1) := 'X';
1351 
1352   BEGIN
1353 
1354     /*
1355 	 Call this procedure for extending lines and headers.
1356 	 NOTE: Extending header will not automatically resolve timevalues for lines. Has to be called for extending lines
1357 	 as well.  p_chr_id and p_cle_id are mutually exclusive.
1358     */
1359 
1360     l_end_date := nvl(p_end_date, to_date('12314000','mmddyyyy'));
1361     l_cutoff_date := p_start_date;
1362     x_return_status     := OKC_API.G_RET_STS_SUCCESS;
1363 
1364     /* Get the application_id and get the rule definition names */
1365 
1366     l_app_id := OKC_TIME_UTIL_PUB.get_app_id;
1367     if l_app_id is null then
1368       return;
1369     end if;
1370     l_rule_df_name := OKC_TIME_UTIL_PUB.get_rule_df_name;
1371     if l_rule_df_name is null then
1372       return;
1373     end if;
1374 
1375 /*get all the rule types (e.g. NTN)  from metadata which are related to timevalues.*/
1376 /*get all the rule types (e.g. NTN)  from metadata which are related to tasks.*/
1377 
1378     l_list_of_rules := OKC_TIME_UTIL_PUB.get_rule_defs_using_vs(l_app_id,l_rule_df_name,'OKC_TIMEVALUES');
1379     l_list_of_rules1 := OKC_TIME_UTIL_PUB.get_rule_defs_using_vs(l_app_id,l_rule_df_name,'OKC_TASK_RS');
1380 
1381     /* For these rules, get their ids using the contract header (line) id.               */
1382 
1383 
1384     l_sql_string := 'select r.id, r.rule_information_category ' ||
1385 	 'from okc_rules_b r, okc_rule_groups_b rg '||
1386 	 'where ((rg.dnz_chr_id = :p_chr_id and rg.cle_id IS NULL) or ' ||
1387 	 '	 (rg.cle_id = :p_cle_id)) and ' ||
1388 	 '	  r.rgp_id = rg.id ' ||
1389 	 'and r.rule_information_category in '|| l_list_of_rules ||
1390 	 'and r.rule_information_category in '|| l_list_of_rules1 ;
1391 
1392 	 /* for extending lines, ensure that the resolved until date (if present) of the headers is met */
1393 
1394     if p_cle_id is NOT NULL AND
1395        p_cle_id <> OKC_API.G_MISS_NUM Then
1396       OPEN resolved_until_csr(p_cle_id);
1397       FETCH resolved_until_csr INTO l_resolved_until_date;
1398       CLOSE resolved_until_csr;
1399       IF l_resolved_until_date is NOT NULL then
1400         if l_end_date > l_resolved_until_date then
1401 	      l_end_date := l_resolved_until_date;
1402         end if;
1403 	 end if;
1404     elsif p_chr_id is NOT NULL AND
1405           p_chr_id <> OKC_API.G_MISS_NUM Then
1406       l_resolved_until_date := add_months(sysdate,OKC_TIME_RES_PVT.RESOLVE_UNTIL_MONTHS);
1407       if l_end_date <= l_resolved_until_date then
1408 	   l_over_further_resolving := '1';
1409       else
1410 	    l_end_date := l_resolved_until_date;
1411 	    l_pending_further_resolving := '1';
1412       end if;
1413     end if;
1414     open rgp_csr for l_sql_string using p_chr_id, p_cle_id;
1415     loop
1416       FETCH rgp_csr into l_rul_id, l_rule_type;
1417 	 exit when rgp_csr%NOTFOUND;
1418 
1419    /* Get all the timevalues associated with the rule. Currently there is only one tve_id per rule. May be extended in
1420 	 future. API is flexible to handle this   */
1421 
1422       l_list_of_tve_id := OKC_TIME_UTIL_PUB.get_tve_ids(l_app_id,l_rule_df_name,l_rule_type,'OKC_TIMEVALUES',
1423                                                        l_rul_id);
1424       if l_list_of_tve_id is NULL Then
1425 		goto next_row;
1426 	 end if;
1427       l_sql_string :=
1428 	 'select id, tve_id_limited, tve_type, datetime, tze_id ' ||
1429 	 'from okc_timevalues ' ||
1430 	 'where ((tve_type in ( ''TGD'',''TAV''))'||
1431 	 ' or (tve_type = ''CYL'' and interval_yn = ''N'')) ' ||
1432 	 'and id in '|| l_list_of_tve_id;
1433       open tve_id_csr for l_sql_string;
1434 	 loop
1435 	   fetch tve_id_csr into l_tve_id, l_tve_id_limited, l_tve_type, l_datetime, l_tze_id;
1436 	   exit when tve_id_csr%NOTFOUND;
1437 	   /* Absolute Time Value will have only one date */
1438 
1439 	   IF l_tve_type = 'TAV' then
1440 	     if l_tze_id is NOT NULL and
1441 	        l_tze_id <> OKC_API.G_MISS_NUM then
1442             Get_Timezone(l_tze_id, l_tze_name, x_return_status);
1443 	       if x_return_status <> OKC_API.G_RET_STS_SUCCESS THEN
1444 	         exit;
1445 	       end if;
1446 	    else
1447 	      l_tze_name := NULL;
1448 	    end if;
1449          Create_RTV_N_Tasks(
1450            x_return_status,
1451            p_api_version,
1452            p_init_msg_list,
1453            l_tve_id,
1454            l_datetime,
1455 		 l_cutoff_date,
1456 	      NULL,
1457            l_tze_id,
1458            l_tze_name);
1459 	    if x_return_status <> OKC_API.G_RET_STS_SUCCESS THEN
1460 	      exit;
1461 	    end if;
1462 
1463 		 /* For generic and recurring call the respective procedures to create resolved timevalues */
1464        ELSE
1465 	    l_start_date := p_start_date;
1466 	    if l_tve_id_limited is NOT NULL Then
1467                OPEN limited_by_csr(l_tve_id_limited);
1468                FETCH limited_by_csr into l_limited_by_rec;
1469                l_row_not_found := limited_by_csr%NOTFOUND;
1470                CLOSE limited_by_csr;
1471                IF (l_row_not_found) THEN
1472                  OKC_API.set_message(G_APP_NAME, G_INVALID_VALUE,G_COL_NAME_TOKEN,'TVE_ID');
1473                  x_return_status := OKC_API.G_RET_STS_ERROR;
1474 	         exit;
1475                END IF;
1476                if l_limited_by_rec.start_date > p_start_date Then
1477 			 l_start_date := l_limited_by_rec.start_date;
1478 	       end if;
1479 	       if l_limited_by_rec.end_date < l_end_date Then
1480                    l_end_date   := l_limited_by_rec.end_date;
1481 	       end if;
1482 	    end if;
1483 	    if l_start_date > l_end_date then
1484 		 exit;
1485 	    end if;
1486 	    l_cutoff_date := l_start_date;
1487 	    IF l_tve_type = 'TGD' then
1488               Res_TPG_Delimited ( x_return_status,p_api_version,p_init_msg_list,l_tve_id, l_start_date, l_end_date, l_cutoff_date);
1489 	    ELSE
1490               Res_Cycle ( x_return_status,p_api_version,p_init_msg_list,l_tve_id, l_tze_id, l_tze_name, l_start_date, l_end_date, l_cutoff_date);
1491 	    end if;
1492 	  end if;
1493 	  if x_return_status <> OKC_API.G_RET_STS_SUCCESS THEN
1494 	      exit;
1495 	  end if;
1496 	 end loop;
1497 	 close tve_id_csr;
1498 	 IF x_return_status <> OKC_API.G_RET_STS_SUCCESS Then
1499 	    exit;
1500       END IF;
1501 	<<next_row>>
1502 	    null;
1503     end loop;
1504     if l_pending_further_resolving = '1' Then
1505 	   update okc_k_headers_b
1506 	     set resolved_until = l_resolved_until_date
1507 	     where id = p_chr_id;
1508     elsif l_over_further_resolving = '1' Then
1509 	   update okc_k_headers_b
1510 	     set resolved_until = NULL
1511 	     where id = p_chr_id;
1512     end if;
1513     l_pending_further_resolving  := 'X';
1514     l_over_further_resolving  := 'X';
1515     CLOSE rgp_csr;
1516     EXCEPTION
1517       WHEN OTHERS THEN
1518         OKC_API.SET_MESSAGE(p_app_name     => g_app_name,
1519                             p_msg_name     => g_unexpected_error,
1520                             p_token1       => g_sqlcode_token,
1521                             p_token1_value => sqlcode,
1522                             p_token2       => g_col_name_token,
1523                             p_token2_value => 'CHR_ID',
1524                             p_token3       => g_sqlerrm_token,
1525                             p_token3_value => sqlerrm);
1526       -- notify caller of an UNEXPECTED error
1527         x_return_status := OKC_API.G_RET_STS_UNEXP_ERROR;
1528     END Res_Time_Extnd_K;
1529 
1530   PROCEDURE Res_Time_Termnt_K(
1531     p_chr_id IN NUMBER,
1532     p_cle_id IN NUMBER,
1533     p_end_date IN DATE,
1534     p_api_version	    IN NUMBER,
1535     p_init_msg_list         IN VARCHAR2 ,
1536     x_return_status OUT NOCOPY VARCHAR2) IS
1537 
1538     TYPE rgp_csr_type is REF CURSOR;
1539     rgp_csr rgp_csr_type;
1540 
1541     TYPE tve_id_csr_type is REF CURSOR;
1542     tve_id_csr tve_id_csr_type;
1543 
1544     CURSOR resolved_until_csr(p_chr_id IN NUMBER) is
1545 	 SELECT resolved_until from okc_k_headers_b h
1546 	 where h.id = p_chr_id;
1547 
1548     l_list_of_rules                VARCHAR2(4000);
1549     l_list_of_rules1               VARCHAR2(4000);
1550     l_list_of_tve_id               VARCHAR2(4000);
1551     l_row_not_found                BOOLEAN := TRUE;
1552     l_tve_id                       NUMBER;
1553     l_rul_id                       NUMBER;
1554     l_rtv_id                       NUMBER;
1555     l_tve_type                     OKC_TIMEVALUES.tve_type%type;
1556     l_sql_string varchar2(4000);
1557     l_rtvv_rec                     OKC_TIME_PUB.rtvv_rec_type;
1558     x_msg_count              NUMBER;
1559     x_msg_data               VARCHAR2(2000);
1560     l_app_id         number;
1561     l_rule_type                    OKC_RULES_V.rule_information_category%type;
1562     l_rule_df_name   varchar2(40);
1563     l_col_val_table  OKC_TIME_UTIL_PUB.t_col_vals;
1564     l_no_of_cols     number;
1565     l_resolved_until_date     date;
1566 
1567   BEGIN
1568 
1569     /*
1570 	 Call this procedure for terminating lines and headers.
1571 	 NOTE: terminating header will not automatically delete resolved timevalues for lines.
1572 	 Has to be called for terminating lines as well.  p_chr_id and p_cle_id are mutually exclusive.
1573     */
1574 
1575     x_return_status     := OKC_API.G_RET_STS_SUCCESS;
1576 
1577     /* Get the application_id and get the rule definition names */
1578 
1579     l_app_id := OKC_TIME_UTIL_PUB.get_app_id;
1580     if l_app_id is null then
1581       return;
1582     end if;
1583 
1584     l_rule_df_name := OKC_TIME_UTIL_PUB.get_rule_df_name;
1585     if l_rule_df_name is null then
1586       return;
1587     end if;
1588 
1589 /*get all the rule types (e.g. NTN)  from metadata which are related to timevalues.*/
1590 /*get all the rule types (e.g. NTN)  from metadata which are related to tasks.*/
1591 
1592     l_list_of_rules := OKC_TIME_UTIL_PUB.get_rule_defs_using_vs(l_app_id,l_rule_df_name,'OKC_TIMEVALUES');
1593     l_list_of_rules1 := OKC_TIME_UTIL_PUB.get_rule_defs_using_vs(l_app_id,l_rule_df_name,'OKC_TASK_RS');
1594 
1595     /* For these rules, get their ids using the contract header (line) id.               */
1596 
1597     l_sql_string := 'select r.id, r.rule_information_category ' ||
1598 	 'from okc_rules_b r, okc_rule_groups_b rg '||
1599 	 'where ((rg.dnz_chr_id = :p_chr_id and rg.cle_id IS NULL) or ' ||
1600 	 '	 (rg.cle_id = :p_cle_id)) and ' ||
1601 	 '	  r.rgp_id = rg.id ' ||
1602 	 'and r.rule_information_category in '|| l_list_of_rules ||
1603 	 'and r.rule_information_category in '|| l_list_of_rules1 ;
1604     open rgp_csr for l_sql_string using p_chr_id, p_cle_id;
1605     loop
1606       FETCH rgp_csr into l_rul_id, l_rule_type;
1607 	 exit when rgp_csr%NOTFOUND;
1608 
1609    /* Get all the timevalues associated with the rule. Currently there is only one tve_id per rule. May be extended in
1610 	 future. API is flexible to handle this   */
1611 
1612       l_list_of_tve_id := OKC_TIME_UTIL_PUB.get_tve_ids(l_app_id,l_rule_df_name,l_rule_type,'OKC_TIMEVALUES',
1613                                                        l_rul_id);
1614       if l_list_of_tve_id is NULL Then
1615 		goto next_row;
1616 	 end if;
1617 
1618 	 /* Get all resolved timevalues */
1619 
1620       l_sql_string :=
1621 	 'select rtv.id rtv_id ' ||
1622 	 'from okc_timevalues tve, okc_resolved_timevalues rtv ' ||
1623 	 'where rtv.tve_id = tve.id ' ||
1624 	 'and rtv.datetime >= :p_end_date  ' ||
1625 	 'and tve.id in '|| l_list_of_tve_id ;
1626       open tve_id_csr for l_sql_string using p_end_date;
1627 	 loop
1628 	   fetch tve_id_csr into l_rtv_id;
1629 	   exit when tve_id_csr%NOTFOUND;
1630 	   l_rtvv_rec.id := l_rtv_id;
1631 	   OKC_TASK_PUB.DELETE_TASK(
1632           p_api_version,
1633           p_init_msg_list,
1634 	     'F',
1635           NULL,
1636 	     l_rtv_id,
1637           x_return_status,
1638           x_msg_count,
1639           x_msg_data);
1640 	   if x_return_status <> OKC_API.G_RET_STS_SUCCESS THEN
1641 	     exit;
1642 	   end if;
1643 	   OKC_TIME_PUB.DELETE_RESOLVED_TIMEVALUES(
1644           p_api_version,
1645           p_init_msg_list,
1646           x_return_status,
1647           x_msg_count,
1648           x_msg_data,
1649           l_rtvv_rec);
1650 	   if x_return_status <> OKC_API.G_RET_STS_SUCCESS THEN
1651 	     exit;
1652 	   end if;
1653 	 end loop;
1654 	 close tve_id_csr;
1655 	 IF x_return_status <> OKC_API.G_RET_STS_SUCCESS Then
1656 	    exit;
1657       END IF;
1658 	 <<next_row>>
1659 	   null;
1660     end loop;
1661     CLOSE rgp_csr;
1662 
1663     /* For contract headers, check if the contract has a resolved until date. If it exists, then check if this date is >
1664 	  termination date (p_end_date). If yes, then reset the resolved until date as there is no need for any further
1665 	  resolving of timevalues */
1666 
1667     if p_chr_id is NOT NULL AND
1668        p_chr_id <> OKC_API.G_MISS_NUM Then
1669       OPEN resolved_until_csr(p_chr_id);
1670       FETCH resolved_until_csr INTO l_resolved_until_date;
1671       CLOSE resolved_until_csr;
1672       IF l_resolved_until_date is NOT NULL then
1673         if p_end_date <= l_resolved_until_date then
1674 	      update okc_k_headers_b
1675 	         set resolved_until = NULL
1676 	      where id = p_chr_id;
1677         end if;
1678       end if;
1679     end if;
1680     EXCEPTION
1681       WHEN OTHERS THEN
1682         OKC_API.SET_MESSAGE(p_app_name     => g_app_name,
1683                             p_msg_name     => g_unexpected_error,
1684                             p_token1       => g_sqlcode_token,
1685                             p_token1_value => sqlcode,
1686                             p_token2       => g_col_name_token,
1687                             p_token2_value => 'CHR_ID',
1688                             p_token3       => g_sqlerrm_token,
1689                             p_token3_value => sqlerrm);
1690       -- notify caller of an UNEXPECTED error
1691         x_return_status := OKC_API.G_RET_STS_UNEXP_ERROR;
1692     END Res_Time_Termnt_K;
1693 
1694   FUNCTION Check_Res_Time_N_tasks(
1695 	  p_tve_id IN NUMBER,
1696 	  p_date IN DATE)
1697 	 return BOOLEAN IS
1698 	 l_dummy    VARCHAR2(1) ;
1699 	 l_rowfound BOOLEAN := TRUE;
1700 
1701 -- Replaced name with seeded id to avoid transaltion issue - Bug 1683539
1702 -- Reed OKCSCHRULE - Contract Schedule Rule - Bug 1683539
1703 	 CURSOR Check_RTV_Tasks_csr (p_tve_id IN NUMBER, p_date IN DATE) IS
1704 	  SELECT '1' from OKC_RESOLVED_TIMEVALUES
1705 	  WHERE tve_id = p_tve_id AND
1706 	   datetime <= p_date
1707 	  UNION ALL
1708 	   SELECT '1' from OKC_RESOLVED_TIMEVALUES rtv, JTF_TASKS_B t, JTF_TASK_TYPES_VL tt
1709 	   WHERE SOURCE_OBJECT_ID = rtv.id AND
1710 		    t.TASK_TYPE_ID = tt.TASK_TYPE_ID AND
1711 		    tve_id = p_tve_id AND
1712 		    tt.task_type_id = 23 AND
1713 		    --tt.name = 'OKCSCHRULE' AND
1714 		    ACTUAL_START_DATE <= p_date;
1715 	 BEGIN
1716 	  OPEN Check_RTV_Tasks_csr(p_tve_id, p_date);
1717 	  FETCH Check_RTV_Tasks_csr into l_dummy;
1718 	  l_rowfound := Check_RTV_Tasks_csr%FOUND;
1719 	  CLOSE Check_RTV_Tasks_csr;
1720 	  return l_rowfound;
1721 
1722     END Check_Res_Time_N_tasks;
1723 
1724   PROCEDURE Delete_Res_Time_N_Tasks(
1725     p_tve_id IN NUMBER,
1726     p_date IN DATE,
1727     p_api_version	    IN NUMBER,
1728     p_init_msg_list         IN VARCHAR2 ,
1729     x_return_status OUT NOCOPY VARCHAR2) IS
1730 
1731     CURSOR rtv_csr(p_tve_id IN NUMBER, p_date IN DATE) is
1732 	 select rtv.id rtv_id
1733 	 from okc_timevalues tve, okc_resolved_timevalues rtv
1734 	 where rtv.tve_id = tve.id
1735 	 and rtv.datetime >= p_date
1736 	 and tve.id = p_tve_id ;
1737 
1738     l_rtv_rec                      rtv_csr%ROWTYPE;
1739     l_rtvv_rec                     OKC_TIME_PUB.rtvv_rec_type;
1740     x_msg_count              NUMBER;
1741     x_msg_data               VARCHAR2(2000);
1742   BEGIN
1743     x_return_status := OKC_API.G_RET_STS_SUCCESS;
1744     open rtv_csr (p_tve_id, p_date);
1745     loop
1746       fetch rtv_csr into l_rtv_rec;
1747 	 exit when rtv_csr%NOTFOUND;
1748 	 l_rtvv_rec.id := l_rtv_rec.rtv_id;
1749 	 OKC_TASK_PUB.DELETE_TASK(
1750         p_api_version,
1751         p_init_msg_list,
1752 	   'F',
1753         NULL,
1754 	   l_rtv_rec.rtv_id,
1755         x_return_status,
1756         x_msg_count,
1757         x_msg_data);
1758 	 if x_return_status <> OKC_API.G_RET_STS_SUCCESS THEN
1759 	   exit;
1760 	 end if;
1761 	 OKC_TIME_PUB.DELETE_RESOLVED_TIMEVALUES(
1762         p_api_version,
1763         p_init_msg_list,
1764         x_return_status,
1765         x_msg_count,
1766         x_msg_data,
1767         l_rtvv_rec);
1768 	 if x_return_status <> OKC_API.G_RET_STS_SUCCESS THEN
1769 	   exit;
1770 	 end if;
1771     end loop;
1772     close rtv_csr;
1773     EXCEPTION
1774       WHEN OTHERS THEN
1775         OKC_API.SET_MESSAGE(p_app_name     => g_app_name,
1776                             p_msg_name     => g_unexpected_error,
1777                             p_token1       => g_sqlcode_token,
1778                             p_token1_value => sqlcode,
1779                             p_token2       => g_col_name_token,
1780                             p_token2_value => 'RTV_ID',
1781                             p_token3       => g_sqlerrm_token,
1782                             p_token3_value => sqlerrm);
1783       -- notify caller of an UNEXPECTED error
1784         x_return_status := OKC_API.G_RET_STS_UNEXP_ERROR;
1785   END Delete_Res_Time_N_Tasks;
1786 
1787   PROCEDURE Create_Res_Time_N_Tasks(
1788     p_tve_id IN NUMBER,
1789     p_start_date IN DATE,
1790     p_end_date IN DATE ,
1791     p_api_version	    IN NUMBER,
1792     p_init_msg_list         IN VARCHAR2 ,
1793     x_return_status OUT NOCOPY VARCHAR2) IS
1794 
1795     CURSOR tve_id_csr(p_tve_id IN NUMBER) is
1796 	 select id, tve_type, datetime, tze_id
1797 	 from okc_timevalues
1798 	 where
1799 	  id = p_tve_id;
1800 
1801     l_tve_rec                      tve_id_csr%ROWTYPE;
1802     x_msg_count              NUMBER;
1803     x_msg_data               VARCHAR2(2000);
1804     x_task_id              NUMBER;
1805     l_tze_name                    OKX_TIMEZONES_V.global_timezone_name%TYPE;
1806     l_row_not_found                BOOLEAN := TRUE;
1807     l_cutoff_date                  DATE := NULL;
1808   BEGIN
1809     x_return_status := OKC_API.G_RET_STS_SUCCESS;
1810     open tve_id_csr(p_tve_id);
1811     fetch tve_id_csr into l_tve_rec;
1812     l_row_not_found := tve_id_csr%NOTFOUND;
1813     close tve_id_csr;
1814     if l_row_not_found then
1815       OKC_API.set_message(G_APP_NAME, G_INVALID_VALUE,G_COL_NAME_TOKEN,'TVE_ID');
1816       x_return_status := OKC_API.G_RET_STS_ERROR;
1817 	 return;
1818     end if;
1819     IF l_tve_rec.tve_type = 'TAV' then
1820 	  if l_tve_rec.tze_id is NOT NULL and
1821 	     l_tve_rec.tze_id <> OKC_API.G_MISS_NUM then
1822          Get_Timezone(l_tve_rec.tze_id, l_tze_name, x_return_status);
1823 	    if x_return_status <> OKC_API.G_RET_STS_SUCCESS THEN
1824 	      return;
1825 	    end if;
1826 	  else
1827 	    l_tze_name := NULL;
1828 	  end if;
1829        Create_RTV_N_Tasks(
1830          x_return_status,
1831          p_api_version,
1832          p_init_msg_list,
1833          l_tve_rec.id,
1834          l_tve_rec.datetime,
1835 	    l_cutoff_date,
1836 	    NULL,
1837          l_tve_rec.tze_id,
1838          l_tze_name);
1839 	  if x_return_status <> OKC_API.G_RET_STS_SUCCESS THEN
1840 	    return;
1841 	  end if;
1842 	  ELSIF l_tve_rec.tve_type = 'TGD' then
1843          Res_TPG_Delimited ( x_return_status,p_api_version,p_init_msg_list,l_tve_rec.id, p_start_date, p_end_date, l_cutoff_date);
1844 	  ELSIF l_tve_rec.tve_type = 'CYL' then
1845          Res_Cycle ( x_return_status,p_api_version,p_init_msg_list,l_tve_rec.id, l_tve_rec.tze_id, l_tze_name, p_start_date, p_end_date, l_cutoff_date);
1846 	  end if;
1847     EXCEPTION
1848       WHEN OTHERS THEN
1849         OKC_API.SET_MESSAGE(p_app_name     => g_app_name,
1850                             p_msg_name     => g_unexpected_error,
1851                             p_token1       => g_sqlcode_token,
1852                             p_token1_value => sqlcode,
1853                             p_token2       => g_col_name_token,
1854                             p_token2_value => 'TVE_ID',
1855                             p_token3       => g_sqlerrm_token,
1856                             p_token3_value => sqlerrm);
1857       -- notify caller of an UNEXPECTED error
1858         x_return_status := OKC_API.G_RET_STS_UNEXP_ERROR;
1859   END Create_Res_Time_N_Tasks;
1860 
1861   PROCEDURE Batch_Resolve_Time_N_Tasks IS
1862    CURSOR c_chr IS
1863 	SELECT contract_number, id, resolved_until from OKC_K_HEADERS_B
1864 	where resolved_until < add_months(sysdate, OKC_TIME_RES_PVT.PICKUP_UPTO_MONTHS)
1865 	   and resolved_until >= sysdate;
1866    x_return_status VARCHAR2(1);
1867    l_init_msg_list VARCHAR2(1) := 'F';
1868    l_api_version  NUMBER := 1.0;
1869    l_resolved_until_date DATE;
1870    BEGIN
1871 
1872    /* This is a nightly concurrent job to trigger re-resoving all
1873 	 contracts which need re-resolving as their resolved until_date
1874 	 falls in the PICKUP_UPTO_MONTHS window.
1875 	 If the end date is less than the derived resolved until date,
1876 	 reset the resolved until dates for the contract
1877     	 to null and will never be picked up.
1878 	*/
1879 
1880 --    l_resolved_until_date := add_months(sysdate, OKC_TIME_RES_PVT.RESOLVE_UNTIL_MONTHS);
1881     for chr_rec in c_chr LOOP
1882       l_resolved_until_date := add_months(chr_rec.resolved_until, OKC_TIME_RES_PVT.RESOLVE_UNTIL_MONTHS);
1883       Res_Time_K(p_chr_id => chr_rec.id,
1884 			p_resolved_until_date => l_resolved_until_date,
1885 			p_cutoff_date => chr_rec.resolved_until,
1886 			p_api_version => l_api_version,
1887 			p_init_msg_list => l_init_msg_list,
1888 			x_return_status => x_return_status);
1889 	end loop;
1890   END Batch_Resolve_Time_N_Tasks;
1891 
1892  PROCEDURE time_resolver(errbuf  OUT NOCOPY VARCHAR2,
1893                          retcode OUT NOCOPY VARCHAR2) IS
1894 
1895   l_api_name        CONSTANT VARCHAR2(30) := 'time_resolver';
1896   l_api_version     CONSTANT VARCHAR2(30) := 1.0;
1897   l_return_status   VARCHAR2(1)  := OKC_API.G_RET_STS_SUCCESS;
1898   x_return_status   VARCHAR2(1)  := OKC_API.G_RET_STS_SUCCESS;
1899   l_msg_count       NUMBER;
1900   l_msg_data        VARCHAR2(1000);
1901   l_init_msg_list   VARCHAR2(3) := 'F';
1902   E_Resource_Busy   EXCEPTION;
1903   PRAGMA EXCEPTION_INIT(E_Resource_Busy,  -00054);
1904 
1905   BEGIN
1906        -- call start_activity to create savepoint, check comptability
1907        -- and initialize message list
1908        l_return_status := OKC_API.START_ACTIVITY(l_api_name
1909                                                 ,l_init_msg_list
1910                                                 ,'_PROCESS'
1911                                                 ,x_return_status
1912                                                 );
1913     --Initialize the return code
1914     retcode := 0;
1915 
1916     OKC_TIME_RES_PVT.Batch_Resolve_Time_N_Tasks;
1917 
1918 	IF l_return_status = OKC_API.G_RET_STS_UNEXP_ERROR THEN
1919           	RAISE OKC_API.G_EXCEPTION_UNEXPECTED_ERROR;
1920     	ELSIF l_return_status = OKC_API.G_RET_STS_ERROR THEN
1921              	RAISE OKC_API.G_EXCEPTION_ERROR;
1922  --	ELSIF l_return_status = OKC_API.G_RET_STS_SUCCESS THEN
1923 --		     commit;
1924      END IF;
1925 
1926 	 OKC_API.END_ACTIVITY(l_msg_count, l_msg_data);
1927 
1928   EXCEPTION
1929       WHEN E_Resource_Busy THEN
1930         l_return_status := okc_api.g_ret_sts_error;
1931         RAISE APP_EXCEPTIONS.RECORD_LOCK_EXCEPTION;
1932       WHEN OKC_API.G_EXCEPTION_ERROR THEN
1933 	retcode := 2;
1934 	errbuf  := substr(sqlerrm,1,200);
1935         l_return_status := OKC_API.HANDLE_EXCEPTIONS
1936         (l_api_name,
1937         G_PKG_NAME,
1938         'OKC_API.G_RET_STS_ERROR',
1939         l_msg_count,
1940         l_msg_data,
1941         '_COMPLEX');
1942        WHEN OKC_API.G_EXCEPTION_UNEXPECTED_ERROR THEN
1943 	retcode := 2;
1944 	errbuf  := substr(sqlerrm,1,200);
1945         l_return_status := OKC_API.HANDLE_EXCEPTIONS
1946         (l_api_name,
1947         G_PKG_NAME,
1948         'OKC_API.G_RET_STS_UNEXP_ERROR',
1949         l_msg_count,
1950         l_msg_data,
1951         '_COMPLEX');
1952        WHEN OTHERS THEN
1953 	retcode := 2;
1954 	errbuf  := substr(sqlerrm,1,200);
1955         l_return_status := OKC_API.HANDLE_EXCEPTIONS
1956         (l_api_name,
1957         G_PKG_NAME,
1958         'OTHERS',
1959         l_msg_count,
1960         l_msg_data,
1961         '_COMPLEX');
1962   END time_resolver;
1963 
1964 END OKC_TIME_RES_PVT;