DBA Data[Home] [Help]

PACKAGE BODY: APPS.OKI_LOAD_OKV_PVT

Source


1 PACKAGE BODY oki_load_okv_pvt AS
2 /* $Header: OKIROKVB.pls 115.25 2003/11/24 08:24:54 kbajaj ship $ */
3 
4 --------------------------------------------------------------------------------
5 -- Modification History
6 -- 25-Aug-2001  mezra        Changed program to reflect the addition of
7 --                           new columns: authoring_org_id,
8 --                           authoring_org_name, and subclass code.
9 -- 10-Sep-2001  mezra        Added column value, All Categories, for summary
10 --                           level of all scs_code; All Organizations, for
11 --                           summary level of all organizations.
12 -- 18-Sep-2001  mezra        Moved okv_csr from local cursor to global
13 --                           cursor since it is used by all the calc
14 --                           procedures.
15 -- 25-Sep-2001  mezra        Change usd_ columns to base_.
16 -- 22-Oct-2001  mezra        Changed All Categories value to -1.
17 -- 24-Oct-2001  mezra        Removed trunc on date columns to increase
18 --                           performance since index will be used.
19 -- 04-Apr-2002  mezra        Synched branh with mainline.
20 -- 26-NOV-2002  rpotnuru     NOCOPY Changes
21 -- 19-Dec-2002  brrao        UTF-8 Changes for Org Name
22 --
23 -- 29-OCT-2003  axraghav     Modified l_org_id_csr in OKIROKVB.pls to populate
24 --                           null for the orgnization names
25 --                           Modified the proceures calc_okv_dtl1,calc_okv_dtl2,
26 --                           calc_okv_sum to calculate the base price negotiated
27 --                           from oki_sales_k_hdrs table.
28 --------------------------------------------------------------------------------
29 
30   -- Global exception declaration
31 
32   -- Generic exception to immediately exit the procedure
33   g_excp_exit_immediate   EXCEPTION ;
34 
35 
36   -- Global constant delcaration
37 
38   -- Constants for the "All" organization and subclass record
39   g_all_org_id   CONSTANT NUMBER       := -1 ;
40   g_all_org_name CONSTANT VARCHAR2(240) := 'All Organizations' ;
41   g_all_scs_code CONSTANT VARCHAR2(30) := '-1' ;
42 
43   g_base_currency     fnd_currencies.currency_code%TYPE :=
44                         fnd_profile.value('OKI_BASE_CURRENCY');
45 
46 
47 
48   -- Global cursor declaration
49 
50   -- Cursor to get the FND_LOOKUPS code based on the lookup_type and code
51   -- Retrieves the code representing the column label, e.g, if the days renewal
52   -- outstanding is being retrieved for insertion into a table, then retrieve
53   -- the corresponding code (DRO IN this example).
54   -- Note:  The fnd_lookups.lookup_code is hard coded in this program.
55   -- We use this cursor to verify the hard coded values before we use the
56   -- actual value itself.
57 
58   CURSOR g_lkup_csr
59   (   p_lookup_type IN VARCHAR2
60      ,p_lookup_code IN VARCHAR2
61   ) IS
62     SELECT  lkup.lookup_code
63     FROM    fnd_lookups lkup
64     WHERE   lkup.lookup_type = p_lookup_type
65     AND     lkup.lookup_code = p_lookup_code
66     ;
67   rec_g_lkup_csr g_lkup_csr%ROWTYPE ;
68 
69   -- Cursor to retrieve the rowid for the selected record
70   -- If a rowid is retrieved, then the record will be updated,
71   -- else the record will be inserted.
72   CURSOR g_okv_csr
73   (   p_period_set_name  IN VARCHAR2
74     , p_period_name      IN VARCHAR2
75     , p_authoring_org_id IN VARCHAR2
76     , p_kpi_code         IN VARCHAR2
77     , p_scs_code         IN VARCHAR2
78   ) IS
79     SELECT rowid
80     FROM   oki_perf_measures okv
81     WHERE  okv.period_set_name  = p_period_set_name
82     AND    okv.period_name      = p_period_name
83     AND    okv.authoring_org_id = p_authoring_org_id
84     AND    okv.kpi_code         = p_kpi_code
85     AND    okv.scs_code         = p_scs_code
86     ;
87   rec_g_okv_csr g_okv_csr%ROWTYPE ;
88 
89 --------------------------------------------------------------------------------
90   -- Procedure to insert records into the oki_perf_measures table.
91 
92 --------------------------------------------------------------------------------
93 
94   PROCEDURE ins_perf_meas
95   (   p_period_name        IN  VARCHAR2
96     , p_period_set_name    IN  VARCHAR2
97     , p_period_type        IN  VARCHAR2
98     , p_authoring_org_id   IN  NUMBER
99     , p_authoring_org_name IN  VARCHAR2
100     , p_kpi_code           IN  VARCHAR2
101     , p_kpi_value          IN  NUMBER
102     , p_scs_code           IN  VARCHAR2
103     , x_retcode            OUT NOCOPY VARCHAR2
104   ) IS
105 
106 
107   -- Local variable declaration
108 
109   -- For error handling
110   l_sqlcode   VARCHAR2(100) ;
111   l_sqlerrm   VARCHAR2(1000) ;
112 
113   l_sequence  NUMBER := NULL ;
114 
115   -- Cursor declaration
116   CURSOR l_seq_num IS
117     SELECT oki_perf_measures_s1.nextval seq
118     FROM dual
119     ;
120   rec_l_seq_num l_seq_num%ROWTYPE ;
121 
122   BEGIN
123 
124     OPEN l_seq_num ;
125     FETCH l_seq_num INTO rec_l_seq_num ;
126       -- unable to generate sequence number, exit immediately
127       IF l_seq_num%NOTFOUND THEN
128         RAISE g_excp_exit_immediate ;
129       END IF ;
130       l_sequence := rec_l_seq_num.seq ;
131     CLOSE l_seq_num ;
132 
133     -- initialize return code to success
134     x_retcode := '0' ;
135 
136     INSERT INTO oki_perf_measures
137     (        id
138            , period_set_name
139            , period_name
140            , period_type
141            , authoring_org_id
142            , authoring_org_name
143            , kpi_code
144            , kpi_value
145            , scs_code
146            , request_id
147            , program_application_id
148            , program_id
149            , program_update_date  )
150     VALUES ( l_sequence
151            , p_period_set_name
152            , p_period_name
153            , p_period_type
154            , p_authoring_org_id
155            , p_authoring_org_name
156            , p_kpi_code
157            , p_kpi_value
158            , p_scs_code
159            , oki_load_okv_pvt.g_request_id
160            , oki_load_okv_pvt.g_program_application_id
161            , oki_load_okv_pvt.g_program_id
162            , oki_load_okv_pvt.g_program_update_date ) ;
163 
164   EXCEPTION
165     WHEN oki_load_okv_pvt.g_excp_exit_immediate THEN
166       l_sqlcode := SQLCODE ;
167       l_sqlerrm := SQLERRM ;
168 
169       -- Set return code to error
170       x_retcode := '2';
171 
172       fnd_message.set_name(  application => 'OKI'
173                            , name        => 'OKI_TABLE_LOAD_FAILURE');
174 
175       fnd_message.set_token(  token => 'TABLE_NAME'
176                             , value => 'OKI_PERF_MEASURES');
177 
178       fnd_file.put_line(  which => fnd_file.log
179                         , buff  => fnd_message.get);
180 
181       fnd_file.put_line(  which => fnd_file.log
182                         , buff  => l_sqlcode||' '||l_sqlerrm );
183 
184     WHEN OTHERS THEN
185 
186       l_sqlcode := SQLCODE ;
187       l_sqlerrm := SQLERRM ;
188 
189       -- Set return code to error
190       x_retcode := '2';
191 
192       fnd_message.set_name(  application => 'OKI'
193                            , name        => 'OKI_TABLE_LOAD_FAILURE');
194 
195       fnd_message.set_token(  token => 'TABLE_NAME'
196                             , value => 'OKI_PERF_MEASURES');
197 
198       fnd_file.put_line(  which => fnd_file.log
199                         , buff  => fnd_message.get);
200 
201       fnd_file.put_line(  which => fnd_file.log
202                         , buff  => l_sqlcode||' '||l_sqlerrm );
203 
204   END ins_perf_meas ;
205 
206 --------------------------------------------------------------------------------
207   -- Procedure to update records in the oki_perf_measures table.
208 
209 --------------------------------------------------------------------------------
210   PROCEDURE upd_perf_meas
211   (   p_kpi_value IN  NUMBER
212     , p_okv_rowid IN  ROWID
213     , x_retcode   OUT NOCOPY VARCHAR2
214   ) IS
215 
216   -- Local variable declaration
217 
218   -- For error handling
219   l_sqlcode   VARCHAR2(100) ;
220   l_sqlerrm   VARCHAR2(1000) ;
221 
222 
223   BEGIN
224 
225     -- initialize return code to success
226     x_retcode := '0';
227 
228     UPDATE oki_perf_measures SET
229         kpi_value              = p_kpi_value
230       , request_id             = oki_load_okv_pvt.g_request_id
231       , program_application_id = oki_load_okv_pvt.g_program_application_id
232       , program_id             = oki_load_okv_pvt.g_program_id
233       , program_update_date    = oki_load_okv_pvt.g_program_update_date
234     WHERE ROWID = p_okv_rowid ;
235 
236   EXCEPTION
237     WHEN OTHERS THEN
238       l_sqlcode := SQLCODE ;
239       l_sqlerrm := SQLERRM ;
240 
241       -- Set return code to error
242       x_retcode := '2';
243 
244       fnd_message.set_name(  application => 'OKI'
245                            , name        => 'OKI_UNEXPECTED_FAILURE');
246 
247       fnd_message.set_token(  token => 'OBJECT_NAME'
248                             , value => 'OKI_LOAD_OKV_PVT.OKI_UPD_PERF_MEAS');
249 
250       fnd_file.put_line(  which => fnd_file.log
251                         , buff  => fnd_message.get);
252 
253       fnd_file.put_line(  which => fnd_file.log
254                         , buff  => l_sqlcode||' '||l_sqlerrm );
255   END upd_perf_meas ;
256 
257 --------------------------------------------------------------------------------
258   -- Procedure to calculate the performance measures.
259   -- Calculates the amounts by each dimension:
260   --   period set name
261   --   period type
262   --   period name
263   --   measure
264   --   subclass
265   --   organization
266 --------------------------------------------------------------------------------
267 
268   PROCEDURE calc_okv_dtl1
269   (   p_period_set_name    IN  VARCHAR2
270     , p_period_type        IN  VARCHAR2
271     , p_summary_build_date IN  DATE
272     , x_retcode            OUT NOCOPY VARCHAR2
273   ) IS
274 
275 
276   -- Constant declaration
277 
278   -- Codes for the performance measures in fnd_lookups
279   l_hardcoded_dro_code   CONSTANT VARCHAR2(30) := 'DRO' ;
280   l_hardcoded_fcacp_code CONSTANT VARCHAR2(30) := 'FCACP' ;
281   l_hardcoded_cncs_code  CONSTANT VARCHAR2(30) := 'CNCS' ;
282   l_lkup_type            CONSTANT VARCHAR2(30) := 'OKI_PERF_MEASURE_TYPES' ;
283 
284 
285   -- Local variable declaration
286 
287   -- For capturing the return code, 0 = success, 1 = warning, 2 = error
288   l_retcode          VARCHAR2(1)    := NULL ;
289 
290   -- For error handling
291   l_sqlcode          VARCHAR2(100)  := NULL ;
292   l_sqlerrm          VARCHAR2(1000) := NULL ;
293 
294   -- Holds the calculated days renewal outstanding,
295   -- forecast achievement % and the contracts consolidated values
296   l_dro_value                 NUMBER := 0 ;
297   l_base_achv_forecast_amount NUMBER := 0 ;
298   l_base_achv_contract_amount NUMBER := 0 ;
299   l_base_consolidated_amount  NUMBER := 0 ;
300   l_achv_pct                  NUMBER := 0 ;
301 
302   -- Holds the code from the fnd_lookups table for the
303   -- OKI_PERF_MEASURE_TYPES type
304   l_dro_code   VARCHAR2(30) := NULL ;
305   l_fcacp_code VARCHAR2(30) := NULL ;
306   l_cncs_code  VARCHAR2(30) := NULL ;
307 
308   -- Location within the program before the error was encountered.
309   l_loc        VARCHAR2(100) ;
310 
311   -- Holds the truncated start and end dates from gl_periods
312   l_glpr_start_date      DATE ;
313   l_glpr_end_date        DATE ;
314 
315 
316   -- Cursor declaration
317 
318   -- Cursor to get all the organizations and subclasses
319   CURSOR l_org_id_csr IS
320     SELECT   DISTINCT shd.authoring_org_id org_id
321            , /*11510 change*/ NULL  organization_name
322            , shd.scs_code
323     FROM     oki_sales_k_hdrs shd
324     ;
325 
326   -- Cursor that calculates the days renewals outstanding
327   -- for a particular organization and subclass
328   CURSOR l_dro_csr
329   (   p_summary_build_date IN DATE
330     , p_authoring_org_id   IN NUMBER
331     , p_scs_code           IN VARCHAR2
332   ) IS
333     SELECT   ROUND(NVL(SUM(TRUNC(p_summary_build_date ) - TRUNC(shd.creation_date)), 0)
334              / DECODE(COUNT(shd.chr_id), NULL, 1, 0, 1, COUNT(shd.chr_id)), 2) dro_value
335     FROM     oki_sales_k_hdrs shd
336     WHERE    shd.ste_code  = 'ENTERED'
337     AND      shd.is_new_yn IS NULL
338     AND      shd.authoring_org_id  = p_authoring_org_id
339     AND      shd.scs_code          = p_scs_code
340     ;
341   rec_l_dro_csr l_dro_csr%ROWTYPE ;
342 
343   -- Cursor that calculates the contract amount portion for the
344   -- forecast achievement % for a particular organization and subclass
345   CURSOR l_achv_cntr_csr
346   (   p_glpr_start_date  IN DATE
347     , p_glpr_end_date    IN DATE
348     , p_authoring_org_id IN NUMBER
349     , p_scs_code         IN VARCHAR2
350   ) IS
351     SELECT NVL(SUM(shd.base_contract_amount), 0) base_contract_amount
352     FROM   oki_sales_k_hdrs shd
353     WHERE  shd.ste_code    IN ('SIGNED', 'ACTIVE')
354     AND    shd.win_percent IS NOT NULL
355     AND    shd.close_date  IS NOT NULL
356     AND    shd.close_date  BETWEEN p_glpr_start_date AND p_glpr_end_date
357     AND    shd.date_signed BETWEEN p_glpr_start_date AND p_glpr_end_date
358     AND    shd.is_new_yn   IS NULL
359     AND    shd.authoring_org_id  = p_authoring_org_id
360     AND    shd.scs_code          = p_scs_code
361     ;
362   rec_l_achv_cntr_csr l_achv_cntr_csr%ROWTYPE ;
363 
364 
365   -- Cursor that calculates the forecast amount portion for the
366   -- forecast achievement % for a particular organization and subclass
367   CURSOR l_achv_fcst_csr
368   (   p_glpr_start_date  IN DATE
369     , p_glpr_end_date    IN DATE
370     , p_authoring_org_id IN NUMBER
371     , p_scs_code         IN VARCHAR2
372   ) IS
373     SELECT NVL(SUM(shd.base_forecast_amount), 0) base_forecast_amount
374     FROM   oki_sales_k_hdrs shd
375     WHERE  shd.ste_code    IN ('SIGNED', 'ACTIVE', 'ENTERED')
376     AND    shd.win_percent IS NOT NULL
377     AND    shd.close_date  IS NOT NULL
378     AND    shd.close_date  BETWEEN p_glpr_start_date AND p_glpr_end_date
379     AND    shd.is_new_yn   IS NULL
380     AND    shd.authoring_org_id = p_authoring_org_id
381     AND    shd.scs_code         = p_scs_code
382     ;
383   rec_l_achv_fcst_csr l_achv_fcst_csr%ROWTYPE ;
384 
385 
386   -- Cursor that calculates the contracts consolidated amount
387   -- for a particular organization and subclass.
388   -- Converts the contracts consolidated amount to base for insertion
389   -- into the table
390   CURSOR l_cntr_cnsl_csr
391   (   p_glpr_start_date  IN DATE
392     , p_glpr_end_date    IN DATE
393     , p_authoring_org_id IN NUMBER
394     , p_scs_code         IN VARCHAR2
395   ) IS
396     SELECT /*11510 changes removed NVL(SUM(cle.price_negotiated * odr.conversion_rate), 0) */ SUM(shd.base_contract_amount) base_price_negotiated
397     FROM
398            /* 11510 changes removed okc_k_lines_b cle */
399            oki_sales_k_hdrs shd
400          , okc_operation_lines ole
401          , okc_operation_instances oie
402          , okc_class_operations cop
403         /*,11510 changes removed oki_daily_rates odr */
404     -- Join lines to head to get currency code from header
405     -- and convert the currency in base
406     WHERE
407     /*11510 changes comment out the following joins
408       shd.chr_id        = cle.dnz_chr_id
409     AND    odr.to_currency   = oki_load_okv_pvt.g_base_currency
410     AND    odr.from_currency = nvl(cle.currency_code, shd.currency_code) */
411     -- Get all consolidated contracts
412            cop.opn_code      = 'REN_CON'
413     AND    ole.process_flag  = 'P'
414     -- Get all signed and active or contracts
415     AND    shd.ste_code     IN ('SIGNED', 'ACTIVE')
416     -- Get priced lines
417  /*11510 changes removed the condition AND    cle.price_level_ind = 'Y' */
418     -- Go from okc_k_lines_b to okc_class_operations
419     AND    shd.chr_id       = ole.subject_chr_id
420     AND    ole.oie_id       = oie.id
421     AND    oie.cop_id       = cop.id
422     AND    shd.date_signed  BETWEEN p_glpr_start_date AND p_glpr_end_date
423     AND    shd.is_new_yn    IS NULL
424     AND    shd.authoring_org_id = p_authoring_org_id
425     AND    shd.scs_code         = p_scs_code
426     ;
427   rec_l_cntr_cnsl_csr l_cntr_cnsl_csr%ROWTYPE ;
428 
429   BEGIN
430 
431     -- initialize return code to success
432     l_retcode := '0';
433 
434     l_loc := 'Opening cursor to determine days renewal outstanding code.' ;
435     -- Validate the days renewal outstanding code
436     OPEN oki_load_okv_pvt.g_lkup_csr( l_lkup_type, l_hardcoded_dro_code ) ;
437     FETCH oki_load_okv_pvt.g_lkup_csr INTO rec_g_lkup_csr ;
438       -- If there was not a valid DRO code then exit ;
439       IF oki_load_okv_pvt.g_lkup_csr%NOTFOUND THEN
440         RAISE g_excp_exit_immediate ;
441       END IF ;
442       l_dro_code := rec_g_lkup_csr.lookup_code ;
443     CLOSE oki_load_okv_pvt.g_lkup_csr ;
444 
445     l_loc := 'Opening cursor to determine forecast achievement % code.' ;
446     -- Validate the forecast achievement %
447     OPEN oki_load_okv_pvt.g_lkup_csr( l_lkup_type, l_hardcoded_fcacp_code ) ;
448     FETCH oki_load_okv_pvt.g_lkup_csr INTO rec_g_lkup_csr ;
449       -- If there was not a valid FCACP code then exit ;
450       IF oki_load_okv_pvt.g_lkup_csr%NOTFOUND THEN
451         RAISE g_excp_exit_immediate ;
452       END IF ;
453       l_fcacp_code := rec_g_lkup_csr.lookup_code ;
454     CLOSE oki_load_okv_pvt.g_lkup_csr ;
455 
456     l_loc := 'Opening cursor to determine contracts consolidated code.' ;
457     -- Validate the contracts consolidate code
458     OPEN oki_load_okv_pvt.g_lkup_csr( l_lkup_type, l_hardcoded_cncs_code ) ;
459     FETCH oki_load_okv_pvt.g_lkup_csr INTO rec_g_lkup_csr ;
460       -- If there was not a valid CNCS code then exit ;
461       IF oki_load_okv_pvt.g_lkup_csr%NOTFOUND THEN
462         RAISE g_excp_exit_immediate ;
463       END IF ;
464       l_cncs_code := rec_g_lkup_csr.lookup_code ;
465     CLOSE oki_load_okv_pvt.g_lkup_csr ;
466 
467 
468     l_loc := 'Looping through valid organizations.' ;
469     << l_org_id_csr_loop >>
470     -- Loop through all the organizations to calcuate the
471     -- appropriate amounts
472     FOR rec_l_org_id_csr IN l_org_id_csr LOOP
473 
474       l_loc := 'Looping through valid periods.' ;
475       -- Loop through all the periods
476       FOR rec_g_glpr_csr IN oki_utl_pvt.g_glpr_csr(
477           p_period_set_name, p_period_type, p_summary_build_date ) LOOP
478 
479         -- Get the truncated gl_periods start and end dates
480         l_glpr_start_date := trunc(rec_g_glpr_csr.start_date );
481         l_glpr_end_date   := trunc(rec_g_glpr_csr.end_date );
482 
483         -- Re-initialize the amounts before calculating
484         l_dro_value                 := 0 ;
485         l_base_achv_forecast_amount := 0 ;
486         l_base_achv_contract_amount := 0 ;
487         l_base_consolidated_amount  := 0 ;
488 
489         l_loc := 'Opening cursor to determine the days renewal outstanding value.' ;
490         << l_dro_csr_loop >>
491         -- Calculate the days renewals outstanding
492         FOR rec_l_dro_csr in l_dro_csr (p_summary_build_date,
493             rec_l_org_id_csr.org_id, rec_l_org_id_csr.scs_code ) LOOP
494           l_dro_value          := rec_l_dro_csr.dro_value ;
495 
496           l_loc := 'Opening cursor to determine if insert or update should occur.'  ;
497           -- Determine if the DRO record is a new one or an existing one
498           OPEN oki_load_okv_pvt.g_okv_csr( rec_g_glpr_csr.period_set_name,
499                rec_g_glpr_csr.period_name, rec_l_org_id_csr.org_id, l_dro_code,
500                rec_l_org_id_csr.scs_code ) ;
501           FETCH oki_load_okv_pvt.g_okv_csr INTO rec_g_okv_csr ;
502             IF oki_load_okv_pvt.g_okv_csr%NOTFOUND THEN
503               l_loc := 'Insert the new record.' ;
504               l_loc := 'Update the existing record.' ;
505               -- Insert the current period data for the period
506               oki_load_okv_pvt.ins_perf_meas(
507                    p_period_name        => rec_g_glpr_csr.period_name
508                  , p_period_set_name    => rec_g_glpr_csr.period_set_name
509                  , p_period_type        => rec_g_glpr_csr.period_type
510                  , p_authoring_org_id   => rec_l_org_id_csr.org_id
511                  , p_authoring_org_name => rec_l_org_id_csr.organization_name
512                  , p_kpi_code           => l_dro_code
513                  , p_kpi_value          => l_dro_value
514                  , p_scs_code           => rec_l_org_id_csr.scs_code
515                  , x_retcode            => l_retcode ) ;
516 
517               IF l_retcode = '2' THEN
518                 -- Load failed, exit immediately.
519                 RAISE oki_load_okv_pvt.g_excp_exit_immediate ;
520               END IF ;
521 
522             ELSE
523               l_loc := 'Update the existing record.' ;
524               -- Record already exists, so perform an update
525               oki_load_okv_pvt.upd_perf_meas(
526                   p_kpi_value => l_dro_value
527                 , p_okv_rowid => rec_g_okv_csr.rowid
528                 , x_retcode   => l_retcode ) ;
529 
530               IF l_retcode = '2' THEN
531                 -- Load failed, exit immediately.
532                 RAISE oki_load_okv_pvt.g_excp_exit_immediate ;
533               END IF ;
534 
535             END IF ;
536           CLOSE oki_load_okv_pvt.g_okv_csr ;
537         END LOOP l_dro_csr_loop ;
538 
539 
540         l_loc := 'Opening cursor to determine the contract amount of FA %.' ;
541         << l_achv_cntr_csr_loop >>
542         -- Calculate the contract amount portion of the
543         -- forecast achievement %
544         FOR rec_l_achv_cntr_csr in l_achv_cntr_csr( l_glpr_start_date,
545               l_glpr_end_date, rec_l_org_id_csr.org_id,
546               rec_l_org_id_csr.scs_code   ) LOOP
547           l_base_achv_contract_amount :=
548                              rec_l_achv_cntr_csr.base_contract_amount ;
549 
550           l_loc := 'Opening cursor to determine the forecast amount of FA %.' ;
551           -- Calculate the forecast amount portion of the
552           -- forecast achievement %
553           OPEN  l_achv_fcst_csr( l_glpr_start_date, l_glpr_end_date,
554                 rec_l_org_id_csr.org_id, rec_l_org_id_csr.scs_code ) ;
555           FETCH l_achv_fcst_csr into rec_l_achv_fcst_csr ;
556             IF l_achv_fcst_csr%FOUND THEN
557               l_base_achv_forecast_amount :=
558                                 rec_l_achv_fcst_csr.base_forecast_amount ;
559             END IF ;
560           CLOSE l_achv_fcst_csr ;
561 
562           IF l_base_achv_forecast_amount = 0 THEN
563             l_achv_pct := 0 ;
564           ELSE
565             -- Calculate the forecast achievement % and round to the nearest
566             -- hundredth.
567             l_achv_pct := ROUND(( l_base_achv_contract_amount /
568                                 l_base_achv_forecast_amount ) * 100, 2) ;
569           END IF ;
570 
571           l_loc := 'Opening cursor to determine if insert or update should occur.'  ;
572           -- Determine if the FCACP record is a new one or an existing one
573           OPEN oki_load_okv_pvt.g_okv_csr( rec_g_glpr_csr.period_set_name,
574                rec_g_glpr_csr.period_name, rec_l_org_id_csr.org_id, l_fcacp_code,
575                rec_l_org_id_csr.scs_code ) ;
576           FETCH oki_load_okv_pvt.g_okv_csr INTO rec_g_okv_csr ;
577             IF oki_load_okv_pvt.g_okv_csr%NOTFOUND THEN
578               l_loc := 'Insert the new record.' ;
579               -- Insert the current period data for the period
580               oki_load_okv_pvt.ins_perf_meas(
581                    p_period_name        => rec_g_glpr_csr.period_name
582                  , p_period_set_name    => rec_g_glpr_csr.period_set_name
583                  , p_period_type        => rec_g_glpr_csr.period_type
584                  , p_authoring_org_id   => rec_l_org_id_csr.org_id
585                  , p_authoring_org_name => rec_l_org_id_csr.organization_name
586                  , p_kpi_code           => l_fcacp_code
587                  , p_kpi_value          => l_achv_pct
588                  , p_scs_code           => rec_l_org_id_csr.scs_code
589                  , x_retcode            => l_retcode ) ;
590               IF l_retcode = '2' THEN
591                 -- Load failed, exit immediately.
592                 RAISE oki_load_okv_pvt.g_excp_exit_immediate ;
593               END IF ;
594             ELSE
595               l_loc := 'Update the existing record.' ;
596               -- Record already exists, so perform an update
597               oki_load_okv_pvt.upd_perf_meas(
598                   p_kpi_value => l_achv_pct
599                 , p_okv_rowid => rec_g_okv_csr.rowid
600                 , x_retcode   => l_retcode ) ;
601 
602               IF l_retcode = '2' THEN
603                 -- Load failed, exit immediately.
604                 RAISE oki_load_okv_pvt.g_excp_exit_immediate ;
605               END IF ;
606 
607             END IF ;
608           CLOSE oki_load_okv_pvt.g_okv_csr ;
609         END LOOP l_achv_cntr_csr_loop ;
610 
611 
612         l_loc := 'Opening cursor to determine the contracts consilodated value.' ;
613         << l_cntr_cnsl_csr_loop >>
614         -- Calculate the contracts consolidated amount
615         FOR rec_l_cntr_cnsl_csr IN l_cntr_cnsl_csr( l_glpr_start_date,
616             l_glpr_end_date, rec_l_org_id_csr.org_id,
617             rec_l_org_id_csr.scs_code ) LOOP
618 
619           l_base_consolidated_amount :=
620                 rec_l_cntr_cnsl_csr.base_price_negotiated ;
621 
622           l_loc := 'Opening cursor to determine if insert or update should occur.'  ;
623           -- Determine if the CNCS record is a new one or an existing one
624           OPEN oki_load_okv_pvt.g_okv_csr( rec_g_glpr_csr.period_set_name,
625                rec_g_glpr_csr.period_name, rec_l_org_id_csr.org_id, l_cncs_code,
626                rec_l_org_id_csr.scs_code ) ;
627           FETCH oki_load_okv_pvt.g_okv_csr INTO rec_g_okv_csr ;
628             IF oki_load_okv_pvt.g_okv_csr%NOTFOUND THEN
629               l_loc := 'Insert the new record.' ;
630               -- Insert the current period data for the period
631               oki_load_okv_pvt.ins_perf_meas(
632                   p_period_name        => rec_g_glpr_csr.period_name
633                 , p_period_set_name    => rec_g_glpr_csr.period_set_name
634                 , p_period_type        => rec_g_glpr_csr.period_type
635                 , p_authoring_org_id   => rec_l_org_id_csr.org_id
636                 , p_authoring_org_name => rec_l_org_id_csr.organization_name
637                 , p_kpi_code           => l_cncs_code
638                 , p_kpi_value          => l_base_consolidated_amount
639                 , p_scs_code           => rec_l_org_id_csr.scs_code
640                 , x_retcode            => l_retcode ) ;
641 
642               IF l_retcode = '2' THEN
643                 -- Load failed, exit immediately.
644                 RAISE oki_load_okv_pvt.g_excp_exit_immediate ;
645               END IF ;
646 
647             ELSE
648               l_loc := 'Update the existing record.' ;
649               -- Record already exists, so perform an update
650               oki_load_okv_pvt.upd_perf_meas(
651                   p_kpi_value => l_base_consolidated_amount
652                 , p_okv_rowid => rec_g_okv_csr.rowid
653                 , x_retcode   => l_retcode ) ;
654 
655               IF l_retcode = '2' THEN
656                 -- Load failed, exit immediately.
657                 RAISE oki_load_okv_pvt.g_excp_exit_immediate ;
658               END IF ;
659 
660             END IF ;
661           CLOSE oki_load_okv_pvt.g_okv_csr ;
662         END LOOP l_cntr_cnsl_csr_loop ;
663       END LOOP g_glpr_csr_loop ;
664     END LOOP l_org_id_csr_loop ;
665 
666   EXCEPTION
667 
668     WHEN oki_load_okv_pvt.g_excp_exit_immediate THEN
669       -- Do not log an error ;  It has already been logged.
670       -- Set return code to error
671       x_retcode := '2' ;
672 
673     WHEN OTHERS THEN
674       l_sqlcode := SQLCODE ;
675       l_sqlerrm := SQLERRM ;
676 
677       -- Set return code TO error
678       x_retcode := '2' ;
679 
680       fnd_message.set_name(  application => 'OKI'
681                            , name        => 'OKI_UNEXPECTED_FAILURE');
682 
683       fnd_message.set_token(  token => 'OBJECT_NAME'
684                             , value => 'OKI_LOAD_OKV_PVT.CALC_OKV_DTL1');
685 
686       fnd_file.put_line(  which => fnd_file.log
687                         , buff  => fnd_message.get);
688 
689       -- Log the location within the procedure where the error occurred
690       fnd_message.set_name(  application => 'OKI'
691                            , name        => 'OKI_LOC_IN_PROG_FAILURE');
692 
693       fnd_message.set_token(  token => 'LOCATION'
694                             , value => l_loc);
695 
696       fnd_file.put_line(  which => fnd_file.log
697                         , buff  => fnd_message.get);
698 
699       fnd_file.put_line(  which => fnd_file.log
700                         , buff  => l_sqlcode||' '||l_sqlerrm );
701   END calc_okv_dtl1 ;
702 
703 --------------------------------------------------------------------------------
704   -- Procedure to calculate the performance measures.
705   -- Calculates the amounts across organizations:
706   --   each period set name
707   --   each period type
708   --   each period name
709   --   each measure
710   --   each subclass
711   --   all  organizations
712 --------------------------------------------------------------------------------
713 
714   PROCEDURE calc_okv_dtl2
715   (   p_period_set_name    IN  VARCHAR2
716     , p_period_type        IN  VARCHAR2
717     , p_summary_build_date IN  DATE
718     , x_retcode            OUT NOCOPY VARCHAR2
719   ) IS
720 
721 
722   -- Constant declaration
723 
724   -- Codes for the performance measures in fnd_lookups
725   l_hardcoded_dro_code   CONSTANT VARCHAR2(30) := 'DRO' ;
726   l_hardcoded_fcacp_code CONSTANT VARCHAR2(30) := 'FCACP' ;
727   l_hardcoded_cncs_code  CONSTANT VARCHAR2(30) := 'CNCS' ;
728   l_lkup_type            CONSTANT VARCHAR2(30) := 'OKI_PERF_MEASURE_TYPES' ;
729 
730 
731   -- Local variable declaration
732 
733   -- For capturing the return code, 0 = success, 1 = warning, 2 = error
734   l_retcode          VARCHAR2(1)    := NULL ;
735 
736   -- For error handling
737   l_sqlcode          VARCHAR2(100)  := NULL ;
738   l_sqlerrm          VARCHAR2(1000) := NULL ;
739 
740   -- Holds the calculated days renewal outstanding,
741   -- forecast achievement % and the contracts consolidated values
742   l_dro_value                 NUMBER := 0 ;
743   l_base_achv_forecast_amount NUMBER := 0 ;
744   l_base_achv_contract_amount NUMBER := 0 ;
745   l_base_consolidated_amount  NUMBER := 0 ;
746   l_achv_pct                  NUMBER := 0 ;
747 
748   -- Holds the code from the fnd_lookups table for the
749   -- OKI_PERF_MEASURE_TYPES type
750   l_dro_code   VARCHAR2(30) := NULL ;
751   l_fcacp_code VARCHAR2(30) := NULL ;
752   l_cncs_code  VARCHAR2(30) := NULL ;
753 
754   -- Location within the program before the error was encountered.
755   l_loc        VARCHAR2(100) ;
756 
757   -- Holds the truncated start and end dates from gl_periods
758   l_glpr_start_date      DATE ;
759   l_glpr_end_date        DATE ;
760 
761 
762   -- Cusror declaration
763 
764   -- Cursor to get all the organizations
765   CURSOR l_scs_csr IS
766     SELECT   DISTINCT shd.scs_code
767     FROM     oki_sales_k_hdrs shd
768     ;
769 
770   -- Cursor that calculates the days renewals outstanding for all
771   -- contracts by subclass
772   CURSOR l_dro_csr
773   (   p_summary_build_date IN DATE
774     , p_scs_code           IN VARCHAR2
775   ) IS
776     SELECT   ROUND(NVL(SUM(TRUNC(p_summary_build_date ) - TRUNC(shd.creation_date)), 0)
777              / DECODE(COUNT(shd.chr_id), NULL, 1, 0, 1, COUNT(shd.chr_id)), 2) dro_value
778     FROM     oki_sales_k_hdrs shd
779     WHERE    shd.ste_code  = 'ENTERED'
780     AND      shd.is_new_yn IS NULL
781     AND    shd.scs_code = p_scs_code
782     ;
783   rec_l_dro_csr l_dro_csr%ROWTYPE ;
784 
785   -- Cursor that calculates the contract amount portion for the
786   -- forecast achievement % by subclass
787   CURSOR l_achv_cntr_csr
788   (   p_glpr_start_date  IN DATE
789     , p_glpr_end_date    IN DATE
790     , p_scs_code           IN VARCHAR2
791   ) IS
792     SELECT NVL(SUM(shd.base_contract_amount), 0) base_contract_amount
793     FROM   oki_sales_k_hdrs shd
794     WHERE  shd.ste_code    IN ('SIGNED', 'ACTIVE')
795     AND    shd.win_percent IS NOT NULL
796     AND    shd.close_date  IS NOT NULL
797     AND    shd.close_date  BETWEEN p_glpr_start_date AND p_glpr_end_date
798     AND    shd.date_signed BETWEEN p_glpr_start_date AND p_glpr_end_date
799     AND    shd.is_new_yn   IS NULL
800     AND    shd.scs_code    = p_scs_code
801     ;
802   rec_l_achv_cntr_csr l_achv_cntr_csr%ROWTYPE ;
803 
804 
805   -- Cursor that calculates the forecast amount portion for the
806   -- forecast achievement % by subclass
807   CURSOR l_achv_fcst_csr
808   (   p_glpr_start_date  IN DATE
809     , p_glpr_end_date    IN DATE
810     , p_scs_code           IN VARCHAR2
811   ) IS
812     SELECT NVL(SUM(shd.base_forecast_amount), 0) base_forecast_amount
813     FROM   oki_sales_k_hdrs shd
814     WHERE  shd.ste_code    IN ('SIGNED', 'ACTIVE', 'ENTERED')
815     AND    shd.win_percent IS NOT NULL
816     AND    shd.close_date  IS NOT NULL
817     AND    shd.close_date  BETWEEN p_glpr_start_date AND p_glpr_end_date
818     AND    shd.is_new_yn   IS NULL
819     AND    shd.scs_code    = p_scs_code
820     ;
821   rec_l_achv_fcst_csr l_achv_fcst_csr%ROWTYPE ;
822 
823 
824   -- Cursor that calculates the contracts consolidated amount for contracts
825   -- by subclass.
826   -- Convert the contracts consolidated amount to base for insertion
827   -- into the table
828   CURSOR l_cntr_cnsl_csr
829   (   p_glpr_start_date IN DATE
830     , p_glpr_end_date   IN DATE
831     , p_scs_code           IN VARCHAR2
832   ) IS
833      SELECT /*11510 changes removed NVL(SUM(cle.price_negotiated * odr.conversion_rate), 0) */ SUM(shd.base_contract_amount) base_price_negotiated
834            /* 11510 changes removed okc_k_lines_b cle */
835          FROM
836              oki_sales_k_hdrs shd
837          , okc_operation_lines ole
838          , okc_operation_instances oie
839          , okc_class_operations cop
840         /*,11510 changes removed oki_daily_rates odr */
841     -- Join lines to head to get currency code from header
842     -- and convert the currency in base
843     WHERE
844     /*11510 changes removed the following joins
845       shd.chr_id        = cle.dnz_chr_id
846     AND    odr.to_currency   = oki_load_okv_pvt.g_base_currency
847     AND    odr.from_currency = nvl(cle.currency_code, shd.currency_code) */
848     -- Get all consolidated contracts
849            cop.opn_code      = 'REN_CON'
850     AND    ole.process_flag  = 'P'
851     -- Get all signed and active or contracts
852     AND    shd.ste_code     IN ('SIGNED', 'ACTIVE')
853     AND    shd.chr_id       = ole.subject_chr_id
854     AND    ole.oie_id       = oie.id
855     AND    oie.cop_id       = cop.id
856     AND    shd.date_signed  BETWEEN p_glpr_start_date AND p_glpr_end_date
857     AND    shd.is_new_yn    IS NULL
858     AND    shd.scs_code     = p_scs_code
859     ;
860   rec_l_cntr_cnsl_csr l_cntr_cnsl_csr%ROWTYPE ;
861 
862   BEGIN
863 
864     -- initialize return code to success
865     l_retcode := '0';
866 
867     l_loc := 'Opening cursor to determine days renewal outstanding code.' ;
868     -- Validate the days renewal outstanding code
869     OPEN oki_load_okv_pvt.g_lkup_csr( l_lkup_type, l_hardcoded_dro_code ) ;
870     FETCH oki_load_okv_pvt.g_lkup_csr INTO rec_g_lkup_csr ;
871       -- If there was not a valid DRO code then exit ;
872       IF oki_load_okv_pvt.g_lkup_csr%NOTFOUND THEN
873         RAISE g_excp_exit_immediate ;
874       END IF ;
875       l_dro_code := rec_g_lkup_csr.lookup_code ;
876     CLOSE oki_load_okv_pvt.g_lkup_csr ;
877 
878     l_loc := 'Opening cursor to determine forecast achievement % code.' ;
879     -- Validate the forecast achievement %
880     OPEN oki_load_okv_pvt.g_lkup_csr( l_lkup_type, l_hardcoded_fcacp_code ) ;
881     FETCH oki_load_okv_pvt.g_lkup_csr INTO rec_g_lkup_csr ;
882       -- If there was not a valid FCACP code then exit ;
883       IF oki_load_okv_pvt.g_lkup_csr%NOTFOUND THEN
884         RAISE g_excp_exit_immediate ;
885       END IF ;
886       l_fcacp_code := rec_g_lkup_csr.lookup_code ;
887     CLOSE oki_load_okv_pvt.g_lkup_csr ;
888 
889     l_loc := 'Opening cursor to determine contracts consolidated code.' ;
890     -- Validate the contracts consolidate code
891     OPEN  oki_load_okv_pvt.g_lkup_csr( l_lkup_type, l_hardcoded_cncs_code ) ;
892     FETCH oki_load_okv_pvt.g_lkup_csr INTO rec_g_lkup_csr ;
893       -- If there was not a valid CNCS code then exit ;
894       IF oki_load_okv_pvt.g_lkup_csr%NOTFOUND THEN
895         RAISE g_excp_exit_immediate ;
896       END IF ;
897       l_cncs_code := rec_g_lkup_csr.lookup_code ;
898     CLOSE oki_load_okv_pvt.g_lkup_csr ;
899 
900     l_loc := 'Looping through valid organizations.' ;
901     << l_org_id_csr_loop >>
902     -- Loop through all the organizations to calcuate the
903     -- appropriate amounts
904     FOR rec_l_scs_csr IN l_scs_csr LOOP
905 
906       l_loc := 'Looping through valid periods.' ;
907       << g_glpr_csr_loop >>
908       -- Loop through all the periods
909       FOR rec_g_glpr_csr IN oki_utl_pvt.g_glpr_csr(
910           p_period_set_name, p_period_type, p_summary_build_date ) LOOP
911 
912         -- Get the truncated gl_periods start and end dates
913         l_glpr_start_date := trunc(rec_g_glpr_csr.start_date );
914         l_glpr_end_date   := trunc(rec_g_glpr_csr.end_date );
915 
916         -- Re-initialize the amounts before calculating
917         l_dro_value                 := 0 ;
918         l_base_achv_forecast_amount := 0 ;
919         l_base_achv_contract_amount := 0 ;
920         l_base_consolidated_amount  := 0 ;
921 
922         l_loc := 'Opening cursor to determine the days renewal outstanding value.' ;
923         << l_dro_csr_loop >>
924         -- Calculate the days renewals outstanding
925         FOR rec_l_dro_csr in l_dro_csr (p_summary_build_date,
926             rec_l_scs_csr.scs_code ) LOOP
927           l_dro_value  := rec_l_dro_csr.dro_value ;
928 
929           l_loc := 'Opening cursor to determine if insert or update should occur.'  ;
930           -- Determine if the DRO record is a new one or an existing one
931           OPEN oki_load_okv_pvt.g_okv_csr( rec_g_glpr_csr.period_set_name,
932                rec_g_glpr_csr.period_name, oki_load_okv_pvt.g_all_org_id,
933                l_dro_code, rec_l_scs_csr.scs_code ) ;
934           FETCH oki_load_okv_pvt.g_okv_csr INTO rec_g_okv_csr ;
935             IF oki_load_okv_pvt.g_okv_csr%NOTFOUND THEN
936               l_loc := 'Insert the new record.' ;
937               l_loc := 'Update the existing record.' ;
938               -- Insert the current period data for the period
939               oki_load_okv_pvt.ins_perf_meas(
940                    p_period_name        => rec_g_glpr_csr.period_name
941                  , p_period_set_name    => rec_g_glpr_csr.period_set_name
942                  , p_period_type        => rec_g_glpr_csr.period_type
943                  , p_authoring_org_id   => oki_load_okv_pvt.g_all_org_id
944                  , p_authoring_org_name => oki_load_okv_pvt.g_all_org_name
945                  , p_kpi_code           => l_dro_code
946                  , p_kpi_value          => l_dro_value
947                  , p_scs_code           => rec_l_scs_csr.scs_code
948                  , x_retcode            => l_retcode ) ;
949 
950               IF l_retcode = '2' THEN
951                 -- Load failed, exit immediately.
952                 RAISE oki_load_okv_pvt.g_excp_exit_immediate ;
953               END IF ;
954 
955             ELSE
956               l_loc := 'Update the existing record.' ;
957               -- Record already exists, so perform an update
958               oki_load_okv_pvt.upd_perf_meas(
959                   p_kpi_value => l_dro_value
960                 , p_okv_rowid => rec_g_okv_csr.rowid
961                 , x_retcode   => l_retcode ) ;
962 
963               IF l_retcode = '2' THEN
964                 -- Load failed, exit immediately.
965                 RAISE oki_load_okv_pvt.g_excp_exit_immediate ;
966               END IF ;
967 
968             END IF ;
969           CLOSE oki_load_okv_pvt.g_okv_csr ;
970         END LOOP l_dro_csr_loop ;
971 
972 
973         l_loc := 'Opening cursor to determine the contract amount of FA %.' ;
974         << l_achv_cntr_csr_loop >>
975         -- Calculate the contract amount portion of the
976         -- forecast achievement %
977         FOR rec_l_achv_cntr_csr in l_achv_cntr_csr( l_glpr_start_date,
978             l_glpr_end_date, rec_l_scs_csr.scs_code ) LOOP
979           l_base_achv_contract_amount :=
980                            rec_l_achv_cntr_csr.base_contract_amount ;
981 
982           l_loc := 'Opening cursor to determine the forecast amount of FA %.' ;
983           -- Calculate the forecast amount portion of the
984           -- forecast achievement %
985           OPEN  l_achv_fcst_csr( l_glpr_start_date, l_glpr_end_date,
986                 rec_l_scs_csr.scs_code ) ;
987           FETCH l_achv_fcst_csr into rec_l_achv_fcst_csr ;
988             IF l_achv_fcst_csr%FOUND THEN
989               l_base_achv_forecast_amount :=
990                                 rec_l_achv_fcst_csr.base_forecast_amount ;
991             END IF ;
992           CLOSE l_achv_fcst_csr ;
993 
994           IF l_base_achv_forecast_amount = 0 THEN
995             l_achv_pct := 0 ;
996           ELSE
997             -- Calculate the forecast achievement % and round to the nearest
998             -- hundredth.
999             l_achv_pct := ROUND(( l_base_achv_contract_amount /
1000                                 l_base_achv_forecast_amount ) * 100, 2) ;
1001           END IF ;
1002 
1003           l_loc := 'Opening cursor to determine if insert or update should occur.'  ;
1004           -- Determine if the FCACP record is a new one or an existing one
1005           OPEN oki_load_okv_pvt.g_okv_csr( rec_g_glpr_csr.period_set_name,
1006                rec_g_glpr_csr.period_name, oki_load_okv_pvt.g_all_org_id,
1007                l_fcacp_code, rec_l_scs_csr.scs_code ) ;
1008           FETCH oki_load_okv_pvt.g_okv_csr INTO rec_g_okv_csr ;
1009             IF oki_load_okv_pvt.g_okv_csr%NOTFOUND THEN
1010               l_loc := 'Insert the new record.' ;
1011               -- Insert the current period data for the period
1012               oki_load_okv_pvt.ins_perf_meas(
1013                   p_period_name        => rec_g_glpr_csr.period_name
1014                 , p_period_set_name    => rec_g_glpr_csr.period_set_name
1015                 , p_period_type        => rec_g_glpr_csr.period_type
1016                 , p_authoring_org_id   => oki_load_okv_pvt.g_all_org_id
1017                 , p_authoring_org_name => oki_load_okv_pvt.g_all_org_name
1018                 , p_kpi_code           => l_fcacp_code
1019                 , p_kpi_value          => l_achv_pct
1020                 , p_scs_code           => rec_l_scs_csr.scs_code
1021                 , x_retcode            => l_retcode ) ;
1022               IF l_retcode = '2' THEN
1023                 -- Load failed, exit immediately.
1024                 RAISE oki_load_okv_pvt.g_excp_exit_immediate ;
1025               END IF ;
1026             ELSE
1027               l_loc := 'Update the existing record.' ;
1028               -- Record already exists, so perform an update
1029               oki_load_okv_pvt.upd_perf_meas(
1030                   p_kpi_value => l_achv_pct
1031                 , p_okv_rowid => rec_g_okv_csr.rowid
1032                 , x_retcode   => l_retcode ) ;
1033 
1034               IF l_retcode = '2' THEN
1035                 -- Load failed, exit immediately.
1036                 RAISE oki_load_okv_pvt.g_excp_exit_immediate ;
1037               END IF ;
1038 
1039             END IF ;
1040           CLOSE oki_load_okv_pvt.g_okv_csr ;
1041         END LOOP l_achv_cntr_csr_loop ;
1042 
1043 
1044         l_loc := 'Opening cursor to determine the contracts consilodated value.' ;
1045         << l_cntr_cnsl_csr_loop >>
1046         -- Calculate the contracts consolidated amount
1047         FOR rec_l_cntr_cnsl_csr IN l_cntr_cnsl_csr( l_glpr_start_date,
1048             l_glpr_end_date, rec_l_scs_csr.scs_code ) LOOP
1049 
1050           l_base_consolidated_amount :=
1051                 rec_l_cntr_cnsl_csr.base_price_negotiated ;
1052 
1053           l_loc := 'Opening cursor to determine if insert or update should occur.'  ;
1054           -- Determine if the CNCS record is a new one or an existing one
1055           OPEN oki_load_okv_pvt.g_okv_csr( rec_g_glpr_csr.period_set_name,
1056              rec_g_glpr_csr.period_name, oki_load_okv_pvt.g_all_org_id,
1057              l_cncs_code, rec_l_scs_csr.scs_code ) ;
1058           FETCH oki_load_okv_pvt.g_okv_csr INTO rec_g_okv_csr ;
1059             IF oki_load_okv_pvt.g_okv_csr%NOTFOUND THEN
1060               l_loc := 'Insert the new record.' ;
1061               -- Insert the current period data for the period
1062               oki_load_okv_pvt.ins_perf_meas(
1063                   p_period_name        => rec_g_glpr_csr.period_name
1064                 , p_period_set_name    => rec_g_glpr_csr.period_set_name
1065                 , p_period_type        => rec_g_glpr_csr.period_type
1066                 , p_authoring_org_id   => oki_load_okv_pvt.g_all_org_id
1067                 , p_authoring_org_name => oki_load_okv_pvt.g_all_org_name
1068                 , p_kpi_code           => l_cncs_code
1069                 , p_kpi_value          => l_base_consolidated_amount
1070                 , p_scs_code           => rec_l_scs_csr.scs_code
1071                 , x_retcode            => l_retcode ) ;
1072 
1073               IF l_retcode = '2' THEN
1074                 -- Load failed, exit immediately.
1075                 RAISE oki_load_okv_pvt.g_excp_exit_immediate ;
1076               END IF ;
1077 
1078             ELSE
1079               l_loc := 'Update the existing record.' ;
1080               -- Record already exists, so perform an update
1081               oki_load_okv_pvt.upd_perf_meas(
1082                   p_kpi_value => l_base_consolidated_amount
1083                 , p_okv_rowid => rec_g_okv_csr.rowid
1084                 , x_retcode   => l_retcode ) ;
1085 
1086               IF l_retcode = '2' THEN
1087                 -- Load failed, exit immediately.
1088                 RAISE oki_load_okv_pvt.g_excp_exit_immediate ;
1089               END IF ;
1090 
1091             END IF ;
1092           CLOSE oki_load_okv_pvt.g_okv_csr ;
1093         END LOOP l_cntr_cnsl_csr_loop ;
1094       END LOOP g_glpr_csr_loop ;
1095     END LOOP l_org_id_csr_loop ;
1096   EXCEPTION
1097 
1098     WHEN oki_load_okv_pvt.g_excp_exit_immediate THEN
1099       -- Do not log an error ;  It has already been logged.
1100       -- Set return code to error
1101       x_retcode := '2' ;
1102 
1103     WHEN OTHERS THEN
1104       l_sqlcode := SQLCODE ;
1105       l_sqlerrm := SQLERRM ;
1106 
1107       -- Set return code TO error
1108       x_retcode := '2' ;
1109 
1110       fnd_message.set_name(  application => 'OKI'
1111                            , name        => 'OKI_UNEXPECTED_FAILURE');
1112 
1113       fnd_message.set_token(  token => 'OBJECT_NAME'
1114                             , value => 'OKI_LOAD_OKV_PVT.CALC_OKV_DTL2');
1115 
1116       fnd_file.put_line(  which => fnd_file.log
1117                         , buff  => fnd_message.get);
1118 
1119       -- Log the location within the procedure where the error occurred
1120       fnd_message.set_name(  application => 'OKI'
1121                            , name        => 'OKI_LOC_IN_PROG_FAILURE');
1122 
1123       fnd_message.set_token(  token => 'LOCATION'
1124                             , value => l_loc);
1125 
1126       fnd_file.put_line(  which => fnd_file.log
1127                         , buff  => fnd_message.get);
1128 
1129       fnd_file.put_line(  which => fnd_file.log
1130                         , buff  => l_sqlcode||' '||l_sqlerrm );
1131 
1132   END calc_okv_dtl2 ;
1133 --------------------------------------------------------------------------------
1134   -- Procedure to calculate the performance measures.
1135   -- Calculates the amounts across organizations and subclasses
1136   --   each period set name
1137   --   each period type
1138   --   each period name
1139   --   each measures
1140   --   all  subclasses
1141   --   all  organizations
1142   --
1143 --------------------------------------------------------------------------------
1144 
1145   PROCEDURE calc_okv_sum
1146   (   p_period_set_name    IN  VARCHAR2
1147     , p_period_type        IN  VARCHAR2
1148     , p_summary_build_date IN  DATE
1149     , x_retcode            OUT NOCOPY VARCHAR2
1150   ) IS
1151 
1152 
1153   -- Constant declaration
1154 
1155   -- Codes for the performance measures in fnd_lookups
1156   l_hardcoded_dro_code   CONSTANT VARCHAR2(30) := 'DRO' ;
1157   l_hardcoded_fcacp_code CONSTANT VARCHAR2(30) := 'FCACP' ;
1158   l_hardcoded_cncs_code  CONSTANT VARCHAR2(30) := 'CNCS' ;
1159   l_lkup_type            CONSTANT VARCHAR2(30) := 'OKI_PERF_MEASURE_TYPES' ;
1160 
1161 
1162   -- Local variable declaration
1163 
1164   -- For capturing the return code, 0 = success, 1 = warning, 2 = error
1165   l_retcode          VARCHAR2(1)    := NULL ;
1166 
1167   -- For error handling
1168   l_sqlcode          VARCHAR2(100)  := NULL ;
1169   l_sqlerrm          VARCHAR2(1000) := NULL ;
1170 
1171   -- Holds the calculated days renewal outstanding,
1172   -- forecast achievement % and the contracts consolidated values
1173   l_dro_value                 NUMBER := 0 ;
1174   l_base_achv_forecast_amount NUMBER := 0 ;
1175   l_base_achv_contract_amount NUMBER := 0 ;
1176   l_base_consolidated_amount  NUMBER := 0 ;
1177 
1178   l_achv_pct                  NUMBER := 0 ;
1179 
1180   -- Holds the code from the fnd_lookups table for the
1181   -- OKI_PERF_MEASURE_TYPES type
1182   l_dro_code   VARCHAR2(30) := NULL ;
1183   l_fcacp_code VARCHAR2(30) := NULL ;
1184   l_cncs_code  VARCHAR2(30) := NULL ;
1185 
1186   -- Location within the program before the error was encountered.
1187   l_loc        VARCHAR2(100) ;
1188 
1189   -- Holds the truncated start and end dates from gl_periods
1190   l_glpr_start_date      DATE ;
1191   l_glpr_end_date        DATE ;
1192 
1193 
1194   -- Cusror declaration
1195 
1196   -- Cursor that calculates the days renewals outstanding for all
1197   -- contracts
1198   CURSOR l_dro_csr
1199   (   p_summary_build_date IN DATE
1200   ) IS
1201     SELECT ROUND(NVL(SUM(TRUNC(p_summary_build_date ) - TRUNC(shd.creation_date)), 0)
1202            / DECODE(COUNT(shd.chr_id), NULL, 1, 0, 1, COUNT(shd.chr_id)), 2) dro_value
1203     FROM   oki_sales_k_hdrs shd
1204     WHERE  shd.ste_code  = 'ENTERED'
1205     AND    shd.is_new_yn IS NULL
1206     ;
1207   rec_l_dro_csr l_dro_csr%ROWTYPE ;
1208 
1209 
1210   -- Cursor that calculates the contract amount portion for the
1211   -- forecast achievement %
1212   CURSOR l_achv_cntr_csr
1213   (   p_glpr_start_date IN DATE
1214     , p_glpr_end_date   IN DATE
1215   ) IS
1216     SELECT NVL(SUM(shd.base_contract_amount), 0) base_contract_amount
1217     FROM   oki_sales_k_hdrs shd
1218     WHERE  shd.ste_code    IN ('SIGNED', 'ACTIVE')
1219     AND    shd.win_percent IS NOT NULL
1220     AND    shd.close_date  IS NOT NULL
1221     AND    shd.close_date  BETWEEN p_glpr_start_date AND p_glpr_end_date
1222     AND    shd.date_signed BETWEEN p_glpr_start_date AND p_glpr_end_date
1223     AND    shd.is_new_yn   IS NULL
1224     ;
1225   rec_l_achv_cntr_csr l_achv_cntr_csr%ROWTYPE ;
1226 
1227 
1228   -- Cursor that calculates the forecast amount portion for the
1229   -- forecast achievement %
1230   CURSOR l_achv_fcst_csr
1231   (   p_glpr_start_date IN DATE
1232     , p_glpr_end_date   IN DATE
1233   ) IS
1234     SELECT NVL(SUM(shd.base_forecast_amount), 0) base_forecast_amount
1235     FROM   oki_sales_k_hdrs shd
1236     WHERE  shd.ste_code    IN ('SIGNED', 'ACTIVE', 'ENTERED')
1237     AND    shd.win_percent IS NOT NULL
1238     AND    shd.close_date  IS NOT NULL
1239     AND    shd.close_date  BETWEEN p_glpr_start_date AND p_glpr_end_date
1240     AND    shd.is_new_yn   IS NULL
1241     ;
1242   rec_l_achv_fcst_csr l_achv_fcst_csr%ROWTYPE ;
1243 
1244   -- Cursor that calculates the contracts consolidated amount for contracts
1245   -- Convert the contracts consolidated amount to base for insertion
1246   -- into the table
1247   CURSOR l_cntr_cnsl_csr
1248   (   p_glpr_start_date IN DATE
1249     , p_glpr_end_date   IN DATE
1250   ) IS
1251     SELECT /*11510 changes removed NVL(SUM(cle.price_negotiated * odr.conversion_rate), 0) */
1252            SUM(shd.base_contract_amount) base_price_negotiated
1253            /* 11510 changes removed okc_k_lines_b cle */
1254          FROM
1255            oki_sales_k_hdrs shd
1256          , okc_operation_lines ole
1257          , okc_operation_instances oie
1258          , okc_class_operations cop
1259         /*11510 changes removed oki_daily_rates odr */
1260     WHERE
1261     /*11510 changes removed the following joins
1262       shd.chr_id        = cle.dnz_chr_id
1263     AND    odr.to_currency   = oki_load_okv_pvt.g_base_currency
1264     AND    odr.from_currency = nvl(cle.currency_code, shd.currency_code) */
1265     --  Get all consolidated contracts
1266           cop.opn_code      = 'REN_CON'
1267     AND    ole.process_flag  = 'P'
1268     -- Get all signed and active or contracts
1269     AND    shd.ste_code     IN ('SIGNED', 'ACTIVE')
1270     AND    shd.chr_id       = ole.subject_chr_id
1271     AND    ole.oie_id       = oie.id
1272     AND    oie.cop_id       = cop.id
1273     AND    shd.date_signed  BETWEEN p_glpr_start_date AND p_glpr_end_date
1274     AND    shd.is_new_yn    IS NULL ;
1275 
1276 
1277   rec_l_cntr_cnsl_csr l_cntr_cnsl_csr%ROWTYPE ;
1278 
1279   BEGIN
1280 
1281     -- initialize return code to success
1282     l_retcode := '0';
1283 
1284     l_loc := 'Opening cursor to determine days renewal outstanding code.' ;
1285     -- Validate the days renewal outstanding code
1286     OPEN  oki_load_okv_pvt.g_lkup_csr( l_lkup_type, l_hardcoded_dro_code ) ;
1287     FETCH oki_load_okv_pvt.g_lkup_csr INTO rec_g_lkup_csr ;
1288       -- If there was not a valid DRO code then exit ;
1289       IF oki_load_okv_pvt.g_lkup_csr%NOTFOUND THEN
1290         RAISE g_excp_exit_immediate ;
1291       END IF ;
1292       l_dro_code := rec_g_lkup_csr.lookup_code ;
1293     CLOSE oki_load_okv_pvt.g_lkup_csr ;
1294 
1295     l_loc := 'Opening cursor to determine forecast achievement % code.' ;
1296     -- Validate the forecast achievement %
1297     OPEN  oki_load_okv_pvt.g_lkup_csr( l_lkup_type, l_hardcoded_fcacp_code ) ;
1298     FETCH oki_load_okv_pvt.g_lkup_csr INTO rec_g_lkup_csr ;
1299       -- If there was not a valid FCACP code then exit ;
1300       IF oki_load_okv_pvt.g_lkup_csr%NOTFOUND THEN
1301         RAISE g_excp_exit_immediate ;
1302       END IF ;
1303       l_fcacp_code := rec_g_lkup_csr.lookup_code ;
1304     CLOSE oki_load_okv_pvt.g_lkup_csr ;
1305 
1306     l_loc := 'Opening cursor to determine contracts consolidated code.' ;
1307     -- Validate the contracts consolidate code
1308     OPEN  oki_load_okv_pvt.g_lkup_csr( l_lkup_type, l_hardcoded_cncs_code ) ;
1309     FETCH oki_load_okv_pvt.g_lkup_csr INTO rec_g_lkup_csr ;
1310       -- If there was not a valid CNCS code then exit ;
1311       IF oki_load_okv_pvt.g_lkup_csr%NOTFOUND THEN
1312         RAISE g_excp_exit_immediate ;
1313       END IF ;
1314       l_cncs_code := rec_g_lkup_csr.lookup_code ;
1315     CLOSE oki_load_okv_pvt.g_lkup_csr ;
1316 
1317     l_loc := 'Looping through valid periods.' ;
1318     -- Loop through all the periods
1319     FOR rec_g_glpr_csr IN oki_utl_pvt.g_glpr_csr(
1320         p_period_set_name, p_period_type, p_summary_build_date ) LOOP
1321 
1322       l_dro_value                 := 0 ;
1323       l_base_achv_forecast_amount := 0 ;
1324       l_base_achv_contract_amount := 0 ;
1325       l_base_consolidated_amount  := 0 ;
1326 
1327       l_loc := 'Opening cursor to determine the days renewal outstanding value.' ;
1328       -- Calculate the days renewals outstanding
1329       OPEN  l_dro_csr (p_summary_build_date ) ;
1330       FETCH l_dro_csr INTO rec_l_dro_csr ;
1331         IF l_dro_csr%FOUND THEN
1332           l_dro_value := rec_l_dro_csr.dro_value ;
1333         END IF ;
1334       CLOSE l_dro_csr ;
1335 
1336       l_loc := 'Opening cursor to determine if insert or update should occur.'  ;
1337       -- Determine if the DRO record is a new one or an existing one
1338       OPEN oki_load_okv_pvt.g_okv_csr( rec_g_glpr_csr.period_set_name,
1339            rec_g_glpr_csr.period_name, oki_load_okv_pvt.g_all_org_id,
1340            l_dro_code, oki_load_okv_pvt.g_all_scs_code ) ;
1341       FETCH oki_load_okv_pvt.g_okv_csr INTO rec_g_okv_csr ;
1342         IF oki_load_okv_pvt.g_okv_csr%NOTFOUND THEN
1343           l_loc := 'Insert the new record.' ;
1344           l_loc := 'Update the existing record.' ;
1345           -- Insert the current period data for the period
1346           oki_load_okv_pvt.ins_perf_meas(
1347                p_period_name         => rec_g_glpr_csr.period_name
1348              , p_period_set_name     => rec_g_glpr_csr.period_set_name
1349              , p_period_type         => rec_g_glpr_csr.period_type
1350              , p_authoring_org_id    => oki_load_okv_pvt.g_all_org_id
1351              , p_authoring_org_name  => oki_load_okv_pvt.g_all_org_name
1352              , p_kpi_code            => l_dro_code
1353              , p_kpi_value           => l_dro_value
1354              , p_scs_code            => oki_load_okv_pvt.g_all_scs_code
1355              , x_retcode             => l_retcode ) ;
1356 
1357           IF l_retcode = '2' THEN
1358             -- Load failed, exit immediately.
1359             RAISE oki_load_okv_pvt.g_excp_exit_immediate ;
1360           END IF ;
1361 
1362         ELSE
1363           l_loc := 'Update the existing record.' ;
1364           -- Record already exists, so perform an update
1365           oki_load_okv_pvt.upd_perf_meas(
1366               p_kpi_value => l_dro_value
1367             , p_okv_rowid => rec_g_okv_csr.rowid
1368             , x_retcode   => l_retcode ) ;
1369 
1370           IF l_retcode = '2' THEN
1371             -- Load failed, exit immediately.
1372             RAISE oki_load_okv_pvt.g_excp_exit_immediate ;
1373           END IF ;
1374 
1375         END IF ;
1376       CLOSE oki_load_okv_pvt.g_okv_csr ;
1377 
1378 
1379       l_loc := 'Opening cursor to determine the contract amount of FA %.' ;
1380       -- Calculate the contract amount portion of the
1381       -- forecast achievement %
1382       OPEN  l_achv_cntr_csr( rec_g_glpr_csr.start_date,
1383             rec_g_glpr_csr.end_date ) ;
1384       FETCH l_achv_cntr_csr into rec_l_achv_cntr_csr ;
1385         IF l_achv_cntr_csr%FOUND THEN
1386           l_base_achv_contract_amount :=
1387                            rec_l_achv_cntr_csr.base_contract_amount ;
1388         END IF ;
1389       CLOSE l_achv_cntr_csr ;
1390 
1391       l_loc := 'Opening cursor to determine the forecast amount of FA %.' ;
1392       -- Calculate the forecast amount portion of the
1393       -- forecast achievement %
1394       OPEN  l_achv_fcst_csr( rec_g_glpr_csr.start_date,
1395             rec_g_glpr_csr.end_date ) ;
1396       FETCH l_achv_fcst_csr into rec_l_achv_fcst_csr ;
1397         IF l_achv_fcst_csr%FOUND THEN
1398           l_base_achv_forecast_amount :=
1399                             rec_l_achv_fcst_csr.base_forecast_amount ;
1400         END IF ;
1401       CLOSE l_achv_fcst_csr ;
1402 
1403       IF l_base_achv_forecast_amount = 0 THEN
1404         l_achv_pct := 0 ;
1405       ELSE
1406         -- Calculate the forecast achievement % and round to the nearest
1407         -- hundredth.
1408         l_achv_pct := ROUND(( l_base_achv_contract_amount /
1409                             l_base_achv_forecast_amount ) * 100, 2) ;
1410       END IF ;
1411 
1412       l_loc := 'Opening cursor to determine if insert or update should occur.'  ;
1413       -- Determine if the FCACP record is a new one or an existing one
1414       OPEN oki_load_okv_pvt.g_okv_csr( rec_g_glpr_csr.period_set_name,
1415            rec_g_glpr_csr.period_name, oki_load_okv_pvt.g_all_org_id,
1416            l_fcacp_code, oki_load_okv_pvt.g_all_scs_code ) ;
1417       FETCH oki_load_okv_pvt.g_okv_csr INTO rec_g_okv_csr ;
1418         IF oki_load_okv_pvt.g_okv_csr%NOTFOUND THEN
1419          l_loc := 'Insert the new record.' ;
1420          -- Insert the current period data for the period
1421          oki_load_okv_pvt.ins_perf_meas(
1422              p_period_name        => rec_g_glpr_csr.period_name
1423            , p_period_set_name    => rec_g_glpr_csr.period_set_name
1424            , p_period_type        => rec_g_glpr_csr.period_type
1425            , p_authoring_org_id   => oki_load_okv_pvt.g_all_org_id
1426            , p_authoring_org_name => oki_load_okv_pvt.g_all_org_name
1427            , p_kpi_code           => l_fcacp_code
1428            , p_kpi_value          => l_achv_pct
1429            , p_scs_code           => oki_load_okv_pvt.g_all_scs_code
1430            , x_retcode            => l_retcode ) ;
1431 
1432          IF l_retcode = '2' THEN
1433            -- Load failed, exit immediately.
1434            RAISE oki_load_okv_pvt.g_excp_exit_immediate ;
1435          END IF ;
1436 
1437         ELSE
1438           l_loc := 'Update the existing record.' ;
1439           -- Record already exists, so perform an update
1440           oki_load_okv_pvt.upd_perf_meas(
1441               p_kpi_value => l_achv_pct
1442             , p_okv_rowid => rec_g_okv_csr.rowid
1443             , x_retcode   => l_retcode ) ;
1444 
1445           IF l_retcode = '2' THEN
1446             -- Load failed, exit immediately.
1447             RAISE oki_load_okv_pvt.g_excp_exit_immediate ;
1448           END IF ;
1449 
1450         END IF ;
1451       CLOSE oki_load_okv_pvt.g_okv_csr ;
1452 
1453       l_loc := 'Opening cursor to determine the contracts consilodated value.' ;
1454       -- Calculate the contracts consolidated amount
1455       OPEN  l_cntr_cnsl_csr( rec_g_glpr_csr.start_date,
1456             rec_g_glpr_csr.end_date ) ;
1457       FETCH l_cntr_cnsl_csr INTO rec_l_cntr_cnsl_csr ;
1458         IF l_cntr_cnsl_csr%FOUND THEN
1459           l_base_consolidated_amount :=
1460               rec_l_cntr_cnsl_csr.base_price_negotiated ;
1461         END IF ;
1462       CLOSE l_cntr_cnsl_csr ;
1463 
1464       l_loc := 'Opening cursor to determine if insert or update should occur.'  ;
1465       -- Determine if the CNCS record is a new one or an existing one
1466       OPEN oki_load_okv_pvt.g_okv_csr( rec_g_glpr_csr.period_set_name,
1467            rec_g_glpr_csr.period_name, oki_load_okv_pvt.g_all_org_id,
1468            l_cncs_code, oki_load_okv_pvt.g_all_scs_code ) ;
1469       FETCH oki_load_okv_pvt.g_okv_csr INTO rec_g_okv_csr ;
1470         IF oki_load_okv_pvt.g_okv_csr%NOTFOUND THEN
1471           l_loc := 'Insert the new record.' ;
1472           -- Insert the current period data for the period
1473           oki_load_okv_pvt.ins_perf_meas(
1474               p_period_name        => rec_g_glpr_csr.period_name
1475             , p_period_set_name    => rec_g_glpr_csr.period_set_name
1476             , p_period_type        => rec_g_glpr_csr.period_type
1477             , p_authoring_org_id   => oki_load_okv_pvt.g_all_org_id
1478             , p_authoring_org_name => oki_load_okv_pvt.g_all_org_name
1479             , p_kpi_code           => l_cncs_code
1480             , p_kpi_value          => l_base_consolidated_amount
1481             , p_scs_code           => oki_load_okv_pvt.g_all_scs_code
1482             , x_retcode            => l_retcode ) ;
1483 
1484           IF l_retcode = '2' THEN
1485             -- Load failed, exit immediately.
1486             RAISE oki_load_okv_pvt.g_excp_exit_immediate ;
1487           END IF ;
1488 
1489         ELSE
1490           l_loc := 'Update the existing record.' ;
1491           -- Record already exists, so perform an update
1492           oki_load_okv_pvt.upd_perf_meas(
1493               p_kpi_value => l_base_consolidated_amount
1494             , p_okv_rowid => rec_g_okv_csr.rowid
1495             , x_retcode   => l_retcode ) ;
1496 
1497           IF l_retcode = '2' THEN
1498             -- Load failed, exit immediately.
1499             RAISE oki_load_okv_pvt.g_excp_exit_immediate ;
1500           END IF ;
1501 
1502         END IF ;
1503       CLOSE oki_load_okv_pvt.g_okv_csr ;
1504 
1505     END LOOP ;
1506   EXCEPTION
1507 
1508     WHEN oki_load_okv_pvt.g_excp_exit_immediate THEN
1509       -- Do not log an error ;  It has already been logged.
1510       -- Set return code to error
1511       x_retcode := '2' ;
1512 
1513     WHEN OTHERS THEN
1514       l_sqlcode := SQLCODE ;
1515       l_sqlerrm := SQLERRM ;
1516 
1517       -- Set return code TO error
1518       x_retcode := '2' ;
1519 
1520       fnd_message.set_name(  application => 'OKI'
1521                            , name        => 'OKI_UNEXPECTED_FAILURE');
1522 
1523       fnd_message.set_token(  token => 'OBJECT_NAME'
1524                             , value => 'OKI_LOAD_OKV_PVT.CALC_OKV_SUM');
1525 
1526       fnd_file.put_line(  which => fnd_file.log
1527                         , buff  => fnd_message.get);
1528 
1529       -- Log the location within the procedure where the error occurred
1530       fnd_message.set_name(  application => 'OKI'
1531                            , name        => 'OKI_LOC_IN_PROG_FAILURE');
1532 
1533       fnd_message.set_token(  token => 'LOCATION'
1534                             , value => l_loc);
1535 
1536       fnd_file.put_line(  which => fnd_file.log
1537                         , buff  => fnd_message.get);
1538 
1539       fnd_file.put_line(  which => fnd_file.log
1540                         , buff  => l_sqlcode||' '||l_sqlerrm );
1541 
1542   END calc_okv_sum ;
1543 --------------------------------------------------------------------------------
1544   -- Procedure to create all the performance measures.  If an
1545   -- error is encountered in this procedure or subsequent procedures then
1546   -- rollback all changes.  Once the table is loaded and the data is committed
1547   -- the load is considered successful even if update of the oki_refreshs
1548   -- table failed.
1549   --
1550 --------------------------------------------------------------------------------
1551   PROCEDURE create_perf_measures
1552   (   p_period_set_name    IN  VARCHAR2
1553     , p_period_type        IN  VARCHAR2
1554     , p_summary_build_date IN  DATE
1555     , x_errbuf             OUT NOCOPY VARCHAR2
1556     , x_retcode            OUT NOCOPY VARCHAR2
1557   ) IS
1558 
1559   -- Local exception declaration
1560 
1561   -- Exception to immediately exit the procedure
1562   l_excp_upd_refresh   EXCEPTION ;
1563 
1564 
1565   -- Constant declaration
1566 
1567   -- Name of the table for which data is being inserted
1568   l_table_name      CONSTANT VARCHAR2(30) := 'OKI_PERF_MEASURES' ;
1569 
1570 
1571   -- Local variable declaration
1572 
1573   -- For capturing the return code, 0 = success, 1 = warning, 2 = error
1574   l_retcode          VARCHAR2(1)    := NULL ;
1575 
1576   -- For error handling
1577   l_sqlcode          VARCHAR2(100)  := NULL ;
1578   l_sqlerrm          VARCHAR2(1000) := NULL ;
1579 
1580 
1581   BEGIN
1582 
1583     SAVEPOINT oki_load_okv_pvt_crt_perf_meas ;
1584 
1585     -- initialize return code TO success
1586     l_retcode := '0' ;
1587     x_retcode := '0' ;
1588 
1589     -- calculate the peformance measures for each dimension
1590     oki_load_okv_pvt.calc_okv_dtl1(
1591         p_period_set_name    => p_period_set_name
1592       , p_period_type        => p_period_type
1593       , p_summary_build_date => p_summary_build_date
1594       , x_retcode            => l_retcode ) ;
1595 
1596     IF l_retcode = '2' THEN
1597       -- Load failed, exit immediately.
1598       RAISE oki_load_okv_pvt.g_excp_exit_immediate ;
1599     END IF ;
1600 
1601     -- calculate the peformance measures across organizations
1602     oki_load_okv_pvt.calc_okv_dtl2(
1603         p_period_set_name    => p_period_set_name
1604       , p_period_type        => p_period_type
1605       , p_summary_build_date => p_summary_build_date
1606       , x_retcode            => l_retcode ) ;
1607 
1608     IF l_retcode = '2' THEN
1609       -- Load failed, exit immediately.
1610       RAISE oki_load_okv_pvt.g_excp_exit_immediate ;
1611     END IF ;
1612 
1613     -- calculate the peformance measures across organizations
1614     -- and subclasses
1615     oki_load_okv_pvt.calc_okv_sum(
1616         p_period_set_name    => p_period_set_name
1617       , p_period_type        => p_period_type
1618       , p_summary_build_date => p_summary_build_date
1619       , x_retcode            => l_retcode ) ;
1620 
1621     IF l_retcode = '2' THEN
1622       -- Load failed, exit immediately.
1623       RAISE oki_load_okv_pvt.g_excp_exit_immediate ;
1624     END IF ;
1625 
1626     COMMIT ;
1627 
1628     SAVEPOINT oki_load_okv_pvt_upd_refresh ;
1629 
1630     -- Table loaded successfully.  Log message in concurrent manager
1631     -- log indicating successful load.
1632     fnd_message.set_name(  application => 'OKI'
1633                          , name        => 'OKI_TABLE_LOAD_SUCCESS');
1634 
1635     fnd_message.set_token(  token => 'TABLE_NAME'
1636                           , value => l_table_name );
1637 
1638     fnd_file.put_line(  which => fnd_file.log
1639                       , buff  => fnd_message.get);
1640 
1641     oki_refresh_pvt.update_oki_refresh( l_table_name, l_retcode ) ;
1642 
1643 
1644     IF l_retcode in ('1', '2') THEN
1645       -- Update to OKI_REFRESHS failed, exit immediately.
1646       RAISE l_excp_upd_refresh ;
1647     END IF ;
1648 
1649     COMMIT ;
1650 
1651   EXCEPTION
1652     WHEN l_excp_upd_refresh THEN
1653       -- Do not log error; It has already been logged by the refreshs
1654       -- program
1655       x_retcode := l_retcode ;
1656 
1657       ROLLBACK to oki_load_okv_pvt_upd_refresh ;
1658 
1659     WHEN oki_load_okv_pvt.g_excp_exit_immediate THEN
1660       -- Do not log an error ;  It has already been logged.
1661       -- Set return code to error
1662       x_retcode := '2' ;
1663 
1664       ROLLBACK TO oki_load_okv_pvt_crt_perf_meas ;
1665 
1666     WHEN OTHERS THEN
1667       l_sqlcode := SQLCODE ;
1668       l_sqlerrm := SQLERRM ;
1669 
1670       -- Set return code to error
1671       x_retcode := '2' ;
1672 
1673       -- ROLLBACK all transactions
1674       ROLLBACK TO oki_load_okv_pvt_crt_perf_meas ;
1675 
1676 
1677       fnd_message.set_name(  application => 'OKI'
1678                            , name        => 'OKI_UNEXPECTED_FAILURE');
1679 
1680       fnd_message.set_token(  token => 'OBJECT_NAME'
1681                             , value => 'OKI_LOAD_OKV_PVT.CREATE_PERF_MEASURES');
1682 
1683       fnd_file.put_line(  which => fnd_file.log
1684                         , buff  => fnd_message.get);
1685 
1686       fnd_file.put_line(  which => fnd_file.log
1687                         , buff  => l_sqlcode||' '||l_sqlerrm );
1688   END create_perf_measures ;
1689 
1690 
1691 BEGIN
1692 
1693   -- Initialize the global variables used to log this job run
1694   -- FROM concurrent manager
1695   g_request_id             :=  fnd_global.conc_request_id ;
1696   g_program_application_id :=  fnd_global.prog_appl_id ;
1697   g_program_id             :=  fnd_global.conc_program_id ;
1698   g_program_update_date    :=  SYSDATE ;
1699 
1700 END oki_load_okv_pvt ;