DBA Data[Home] [Help]

PACKAGE BODY: APPS.MTH_UTIL_PKG

Source


1 PACKAGE BODY mth_util_pkg AS
2 /*$Header: mthutilb.pls 120.36.12020000.5 2012/11/29 12:53:44 sasuren ship $ */
3 
4 
5 /* *****************************************************************************
6 * Procedure		    :MTH_RUN_LOG_PRE_LOAD                              *
7 * Description 	 	:This procedure is used for the population of the      *
8 * mth_run_log table for the initial and incremental load. The procedure is     *
9 * called at the begenning of the mapping execution sequence to set the         *
10 * boundary conditions for the ebs collection for the corresponding fact        *
11 * or dimension.                                                                *
12 * File Name	 	    :MTHUTILB.PLS		             	       *
13 * Visibility		    :Public                			       *
14 * Parameters	 	    : p_fact_name       :name of the fact	       *
15 *                     p_db_global_name  :source system global name             *
16 *                     p_run_mode        :run mode 'INITIAL' or blank           *
17 *                     p_run_start_date  :run start date for the run            *
18 *                     p_is_fact         :0=false, 1=true                       *
19 *                     p_to_date         :to_date for the run                   *
20 * Modification log	:	                                               *
21 *			Author		Date			Change	       *
22 *			Ankit Goyal	31-May-2007	Initial Creation       *
23 *	Ankit Goyal	03-Jul-2007   Incorporated pushkala comments           *
24 *  Amrit Kaur      14-mar-2008   Commented apps_initilalize due to Bug 6737820 *
25 ***************************************************************************** */
26 PROCEDURE mth_run_log_pre_load( p_fact_table IN VARCHAR2,
27                                 p_db_global_name IN VARCHAR2,
28                                 p_run_mode IN VARCHAR2,
29                                 p_run_start_date IN DATE,
30                                 p_is_fact IN NUMBER,
31                                 p_to_date IN DATE)
32 IS
33 --local variable declation
34 
35 l_fact_table mth_run_log.fact_table%TYPE;--fact table name
36 l_ebs_organization_id mth_run_log.ebs_organization_id%TYPE;
37 l_ebs_organization_code mth_run_log.ebs_organization_code%TYPE;
38 l_from_date mth_run_log.from_date%TYPE;--from date of the run
39 l_to_date mth_run_log.to_date%TYPE;--to date of the run
40 l_source mth_run_log.source%TYPE;--process or discrete. Not used currently
41 l_system_fk_key mth_systems_setup.system_pk_key%TYPE;
42 l_creation_date mth_run_log.creation_date%TYPE;--who column
43 l_last_update_date mth_run_log.last_update_date%TYPE;--who column
44 l_creation_system_id mth_run_log.creation_system_id%TYPE;--who column
45 l_last_update_system_id mth_run_log.last_update_system_id%TYPE;--who column
46 --l_sysdate to holding the current date
47 l_sysdate DATE := sysdate;--target system sysdate
48 --l_mode is used to determine the run type , initial 0 or incremental 1
49 l_mode NUMBER := 0;--initial default
50 l_plant_start_date DATE; --Plant end date
51 --Hub organization code
52 l_hub_organization_code mth_run_log.hub_organization_code%TYPE;
53 
54 --cursor for iterating through the ebs organizations in mth_plants_d
55 --the rows in the mth_run_log will be at organization granularity
56 CURSOR c_ebs_orgs IS
57 SELECT ebs_organization_id,organization_code,
58   source,plant_pk,system_fk_key,from_date
59 FROM mth_plants_d, mth_systems_setup,mth_organizations_l
60 WHERE system_pk_key = system_fk_key
61 AND system_pk = p_db_global_name
62 AND NVL(to_date,TRUNC(SYSDATE)) >= TRUNC(SYSDATE)--pick active plants only
63 AND plant_fk_key=plant_pk_key;
64 
65 BEGIN
66   IF p_run_mode = 'INITIAL' THEN--Initial load
67   --delete the rows from run log
68   DELETE FROM mth_run_log WHERE fact_table = p_fact_table;
69 
70   END IF;
71   --initialize the local variables and who columns
72   l_fact_table := p_fact_table;
73   l_last_update_system_id := -99999;
74   l_last_update_date := l_sysdate;
75   l_to_date := p_to_date;
76 
80   END IF;
77   --initialize the global start date
78   IF p_is_fact = 0 THEN--for dimensions only
79   l_from_date := To_Date('01-01-1900','MM-DD-YYYY');
81 
82   --iterate through the cursor
83   FOR l_orgs IN c_ebs_orgs
84   LOOP
85 
86   	--initialize the variables for current cursor value
87     l_ebs_organization_id := l_orgs.ebs_organization_id;
88     l_source := l_orgs.source;--pick source column from the plants
89     l_ebs_organization_code := l_orgs.organization_code;
90     l_creation_date := l_sysdate;
91 	l_creation_system_id := -1;
92 
93     IF p_is_fact = 1 THEN--for facts only
94     	l_from_date := l_orgs.from_date;--run start date= plant start date
95     END IF;
96 
97     l_plant_start_date := l_orgs.from_date;
98     l_hub_organization_code := l_orgs.plant_pk;
99 
100 
101    	IF l_orgs.ebs_organization_id is null THEN
102    			/* We are dealing with non-ebs org configured to the passed system*/
103    			/* Check if there are records for non-ebs organizations from same system and same fact and same plant */
104    		SELECT COUNT(*)
105 	    INTO l_mode
106 	    FROM mth_run_log
107 	    WHERE fact_table = l_fact_table
108 	    AND db_global_name = p_db_global_name
109 	    AND hub_organization_code = l_orgs.plant_pk;
110 
111 	    IF l_mode = 0 OR UPPER(p_run_mode) = 'INITIAL' THEN /* Initial Load */
112 
113 	      --statement for insert
114 
115 		      INSERT INTO mth_run_log (fact_table, ebs_organization_id,
116 			ebs_organization_code,from_date,to_date, source, db_global_name,
117 			creation_date,last_update_date,creation_system_id,
118 			last_update_system_id,plant_start_date,hub_organization_code)
119 		      VALUES(l_fact_table,l_ebs_organization_id,l_ebs_organization_code,
120 			l_from_date,l_to_date,l_source,p_db_global_name,l_creation_date,
121 			l_last_update_date,l_creation_system_id,l_last_update_system_id,
122 			l_plant_start_date,l_hub_organization_code);
123 
124 	    ELSE
125 		    /* update all non_ebs organizations from same system and plant with to_date as the passed date */
126     		--Custom Logic for the time dimension
127 		      IF p_fact_table = 'MTH_WORKDAY_SHIFTS_D'
128 		      THEN
129 			      UPDATE mth_run_log
130 			      SET from_date = p_run_start_date
131 			      WHERE
132 			      fact_table = p_fact_table and db_global_name=p_db_global_name;
133 		      END IF ;
134 
135 		      --statment for update
136 		      UPDATE mth_run_log
137 		      SET TO_DATE = l_to_date,
138 		      LAST_UPDATE_DATE = l_last_update_date,
139 		      LAST_UPDATE_SYSTEM_ID =l_last_update_system_id
140 		      WHERE
141 		      fact_table =l_fact_table
142 		      AND db_global_name = p_db_global_name
143 		      AND hub_organization_code =  l_hub_organization_code;
144 
145 
146     	END IF; /* END of Initial VS Incremental */
147 
148   ELSE
149      /* We are dealing with EBS Organizations  */
150 
151     --determine if there are any rows in the mth_run_log for
152     --the fact_table corresponding to the org
153 	    SELECT COUNT(*)
154 	    INTO l_mode
155 	    FROM mth_run_log
156 	    WHERE fact_table = l_fact_table
157 	    AND ebs_organization_id = l_orgs.ebs_organization_id
158 	    AND db_global_name = p_db_global_name
159 	    AND hub_organization_code = l_orgs.plant_pk;
160 
161 	    --l_mode = 0 means that it is a initial run. p_run_mode is
162 	    --for forceful execution of the initial load
163 
164 	    IF l_mode = 0 OR UPPER(p_run_mode) = 'INITIAL' THEN--initial load
165 
166 	      --initialize the variables for initial load
167 	      l_creation_date := l_sysdate;
168 	      l_creation_system_id := -1;
169 
170 	      --statement for insert
171 
172 	      INSERT INTO mth_run_log (fact_table, ebs_organization_id,
173 		ebs_organization_code,from_date,to_date, source, db_global_name,
174 		creation_date,last_update_date,creation_system_id,
175 		last_update_system_id,plant_start_date,hub_organization_code)
176 	      VALUES(l_fact_table,l_ebs_organization_id,l_ebs_organization_code,
177 		l_from_date,l_to_date,l_source,p_db_global_name,l_creation_date,
178 		l_last_update_date,l_creation_system_id,l_last_update_system_id,
179 		l_plant_start_date,l_hub_organization_code);
180 
181 
182 
183 	      --if the above condition fails then update the row
184 	    ELSE--incremental load
185 
186 	      --Custom Logic for the time dimension
187 	      IF p_fact_table = 'MTH_WORKDAY_SHIFTS_D'
188 	      THEN
189 		      UPDATE mth_run_log
190 		      SET from_date = p_run_start_date
191 		      WHERE
192 		      fact_table = p_fact_table;
193 	      END IF ;
194 		      --statment for update
195 		      UPDATE mth_run_log
196 		      SET TO_DATE = l_to_date,
197 		      LAST_UPDATE_DATE = l_last_update_date,
198 		      LAST_UPDATE_SYSTEM_ID =l_last_update_system_id
199 		      WHERE
200 		      fact_table =l_fact_table
201 		      AND source =l_source
202 		      AND db_global_name = p_db_global_name
203 		      AND ebs_organization_id = l_ebs_organization_id
204 		      AND hub_organization_code =  l_hub_organization_code;
205 
206 	      --end of if clause
207 	    END IF; /* END of Initial VS Incremental */
208 
209 END IF; /* End of EBS VS NON-EBS */
210     --end of the for loop
211   END LOOP;
212 
213 --handle exceptions
214 EXCEPTION
215    WHEN NO_DATA_FOUND THEN
216    RAISE_APPLICATION_ERROR (-20001,
217         'Exception has occured');
218 
219 END mth_run_log_pre_load;
220 
221 
222 /* *****************************************************************************
223 * Procedure		    :MTH_RUN_LOG_POST_LOAD	       	      	       *
224 * Description 	 	:This procedure is used for the population of the      *
225 * mth_run_log table for the initial and incremental load. The procedure is     *
226 * called at the end of the mapping execution sequence to set the               *
227 * boundary conditions for the ebs collection for the corresponding fact        *
228 * or dimension.                                                                *
229 * File Name	 	  : MTHUTILB.PLS				       *
230 * Visibility		  : Public                                             *
231 * Parameters	 	  : p_fact_name : name of the fact table in the hub    *
232 *                   p_global_name: source system global name                   *
233 * Modification log	:						       *
234 *			Author		Date		    Change	       *
235 *			Ankit Goyal	31-May-2007   Initial Creation         *
236 *	Ankit Goyal	03-Jul-2007   Incorporated pushkala's comments         *
237 *   viveksha 30-Jan-2009 Updated the procedure to update txn ids *
238 ***************************************************************************** */
239 PROCEDURE mth_run_log_post_load(p_fact_table IN VARCHAR2,
240                                 p_db_global_name IN VARCHAR2)
241 
242 IS
243 
244 --local variables initialization
245 l_fact_table mth_run_log.fact_table%TYPE;--fact table
246 l_sysdate DATE := sysdate;--variable for sysdate
247 l_last_update_system_id mth_run_log.last_update_system_id%TYPE;
248 l_last_update_date mth_run_log.last_update_date%TYPE;
249 l_system_fk_key mth_systems_setup.system_pk_key%TYPE;
250 l_to_date mth_run_log.to_date%TYPE;--variable for storing to_date
251 l_from_date mth_run_log.from_date%TYPE;--variable for storing from_date
252 l_ebs_organization_id mth_run_log.ebs_organization_id%TYPE;
253 --Hub organization code
254 l_hub_organization_code mth_run_log.hub_organization_code%TYPE;
255 --TXN IDS
256 l_to_txn_id mth_run_log.to_txn_id%TYPE;
257 l_from_txn_id mth_run_log.from_txn_id%TYPE;
258 
259 --cursor for iterating through the ebs organizations in mth_plants_d
260 --the rows in the mth_run_log will be at organization granularity
261 
262 CURSOR c_ebs_orgs
263 IS
264 SELECT ebs_organization_id,system_fk_key
265 FROM mth_plants_d, mth_systems_setup,mth_organizations_l
266 WHERE system_pk_key = system_fk_key
267 AND system_pk = p_db_global_name
268 AND NVL(to_date,TRUNC(SYSDATE)) >= TRUNC(SYSDATE)--pick active plants only
269 AND plant_fk_key=plant_pk_key;
270 
271 
272 BEGIN
273 
274   --initialize the varialbles common to the initial and incremental
275   -- loading
276 
277   l_fact_table := p_fact_table;
278   l_last_update_system_id := -99999;
279   l_last_update_date := l_sysdate;
280   --iterate through the cursor
281 
282     /* The to_date for all organizations populated for a given fact and system are bound to be the same because
283        all organizations are populated with sysdate(source or target) as the to_date. So giving a generic update command here would work */
284 
285     SELECT min(to_date) --min is to avoid getting duplicate rows
286     INTO l_from_date--from date set to previous to_date
287     FROM mth_run_log
288     WHERE fact_table = l_fact_table
289     AND db_global_name = p_db_global_name;
290 
291          --select the next starting txn id into l_from_txn_id
292     SELECT MIN(to_txn_id)
293     INTO l_from_txn_id--from txn id to be set to previous to txn id
294     FROM mth_run_log
295     WHERE fact_table = l_fact_table
296     AND db_global_name = p_db_global_name;
297 
298 
299     --if statement to restrict the accidental re run of the block
300     IF l_from_date IS NOT NULL THEN
301     --update the mth run log for next incremental run
302 
303     UPDATE mth_run_log
304     SET from_date = l_from_date,--from date set to previous to_date
305     to_date = NULL,--to_date set to null for next run
306     last_update_date = l_last_update_date,
307     from_txn_id = l_from_txn_id, -- from txn id set to previous to txn id
308     to_txn_id = NULL
312     END IF;
309     Where fact_table = l_fact_table
310     AND db_global_name =  p_db_global_name;
311 
313 
314 
315 
316   /*
317   FOR l_orgs IN c_ebs_orgs
318   LOOP
319     --initialize the variables for current cursor value
320     l_ebs_organization_id := l_orgs.ebs_organization_id;
321 
322 
323     --select the next starting date into l_from_date
324     SELECT to_date
325     INTO l_from_date--from date set to previous to_date
326     FROM mth_run_log
327     WHERE fact_table = l_fact_table
328     AND db_global_name = p_db_global_name
329     AND ebs_organization_id = l_ebs_organization_id;
330 
331 
332 
333 
334     --if statement to restrict the accidental re run of the block
335     IF l_from_date IS NOT NULL THEN
336     --update the mth run log for next incremental run
337 
338     UPDATE mth_run_log
339     SET from_date = l_from_date,--from date set to previous to_date
340     to_date = NULL,--to_date set to null for next run
341     from_txn_id = l_from_txn_id, -- from txn id set to previous to txn id
342     to_txn_id = NULL,
343     last_update_date = l_last_update_date
344     Where fact_table = l_fact_table
345     AND ebs_organization_id = l_ebs_organization_id
346     AND db_global_name =  p_db_global_name;
347 
348     END IF;
349 
350   END LOOP;
351 */
352 
353 --handle exceptions
354 EXCEPTION
355    WHEN NO_DATA_FOUND THEN
356    RAISE_APPLICATION_ERROR (-20001,
357         'Exception has occured');
358 END mth_run_log_post_load;
359 
360 
361 /* *****************************************************************************
362 * Procedure		:MTH_HRCHY_BALANCE_LOAD                                *
363 * Description 	 	:This procedure is used for the balancing of the       *
364 * hierarchy. The algorithm used for the balancing is down balancing 	       *
365 * Please refer to the Item fdd for more details on this.                       *
366 * File Name	 	:MTHUTILS.PLS			                       *
367 * Visibility		:Public			       		               *
368 * Parameters	 	:fact table name		                       *
369 * Modification log	:		                                       *
370 *			Author		Date			Change	       *
371 *	Ankit Goyal	17-Aug-2007	Initial Creation                       *
372 ****************************************************************************** */
373 PROCEDURE mth_hrchy_balance_load(p_fact_table IN VARCHAR2) is
374 
375 v_fact_table VARCHAR2(120);
376 
377 --user defined type for array of records
378 TYPE denorm_rec_tab_type IS TABLE OF NUMBER;
379 TYPE denorm_rec_name_tab_type IS TABLE OF VARCHAR2(240);
380 
381 --user defined type of record of arrays
382 TYPE denorm_rec_type IS RECORD (level9_fk_key denorm_rec_tab_type,
383 hierarchy_id denorm_rec_tab_type,
384 baselevel_fk_key denorm_rec_tab_type,
385 level7_fk_key denorm_rec_tab_type,
386 level6_fk_key denorm_rec_tab_type,
387 level5_fk_key denorm_rec_tab_type,
388 level4_fk_key denorm_rec_tab_type,
389 level3_fk_key denorm_rec_tab_type,
390 level2_fk_key denorm_rec_tab_type,
391 level1_fk_key denorm_rec_tab_type,
392 level9_name denorm_rec_name_tab_type,
393 level7_name denorm_rec_name_tab_type,
394 level6_name denorm_rec_name_tab_type,
395 level5_name denorm_rec_name_tab_type,
396 level4_name denorm_rec_name_tab_type,
397 level3_name denorm_rec_name_tab_type,
398 level2_name denorm_rec_name_tab_type,
399 level1_name denorm_rec_name_tab_type
400 );
401 
402 --instantiation of the user defined type
403 --this will be the placeholder for the records fetched from the denorm table
404 denorm_rec denorm_rec_type;
405 
406 --user defined cursor to hold the bulk collection of records
407 item_cur SYS_REFCURSOR;
408 
409 --variable for the limit of the bulk collection
410 v_limit NUMBER :=5000;
411 
412 
413 BEGIN
414 
415 --initialize the collection
416 denorm_rec := NULL;
417 
418 --initialize the fact table name
419 v_fact_table :=p_fact_table;
420 
421 --open the cursor
422 OPEN item_cur FOR 'SELECT     --select for the newe levels
423         level9_fk_key,hierarchy_id,item_fk_key,
424         Decode(diff_level,1,level8_fk_key,level9_fk_key) level7_fk_key_new,
425         Decode(diff_level,1,level7_fk_key,2,level8_fk_key,level9_fk_key)
426         level6_fk_key_new,
427         Decode(diff_level,1,level6_fk_key,2,level7_fk_key,3,level8_fk_key,
428         level9_fk_key) level5_fk_key_new,
429         Decode(diff_level,1,level5_fk_key,2,level6_fk_key,3,level7_fk_key,4,
430         level8_fk_key,level9_fk_key) level4_fk_key_new,
431         Decode(diff_level,1,level4_fk_key,2,level5_fk_key,3,level6_fk_key,4,
432         level7_fk_key,5,level8_fk_key,level9_fk_key) level3_fk_key_new,
433         Decode(diff_level,1,level3_fk_key,2,level4_fk_key,3,level5_fk_key,4,
434         level6_fk_key,5,level7_fk_key,6,level8_fk_key,level9_fk_key)
435         level2_fk_key_new,
436         Decode(diff_level,1,level2_fk_key,2,level3_fk_key,3,level4_fk_key,4,
437         level5_fk_key,5,level6_fk_key,6,level7_fk_key,7,level8_fk_key,
438         level9_fk_key) level1_fk_key_new,
439         level9_name,
440         Decode(diff_level,1,level8_name,level9_name) level7_name_new,
441         Decode(diff_level,1,level7_name,2,level8_name,level9_name)
442         level6_name_new,
443         Decode(diff_level,1,level6_name,2,level7_name,3,level8_name,
444         level9_name) level5_name_new,
445         Decode(diff_level,1,level5_name,2,level6_name,3,level7_name,4,
446         level8_name,level9_name) level4_name_new,
447         Decode(diff_level,1,level4_name,2,level5_name,3,level6_name,4,
448         level7_name,5,level8_name,level9_name) level3_name_new,
449         Decode(diff_level,1,level3_name,2,level4_name,3,level5_name,4,
450         level6_name,5,level7_name,6,level8_name,level9_name)
451         level2_name_new,
452         Decode(diff_level,1,level2_name,2,level3_name,3,level4_name,4,
453         level5_name,5,level6_name,6,level7_name,7,level8_name,
454         level9_name) level1_name_new
455     from
456         (--select the levels to be balanced
457         SELECT hierarchy_id ,item_fk_key,
458         level9_fk_key,level8_fk_key,level7_fk_key,level6_fk_key,
459         level5_fk_key,level4_fk_key,level3_fk_key,level2_fk_key,
460         level1_fk_key,
461         level9_name,level8_name,level7_name,level6_name,
462         level5_name,level4_name,level3_name,level2_name,
463         level1_name,
464         max_level-c_level diff_level
465         FROM
466           (
467               SELECT hierarchy_id ,item_fk_key,
468               level9_fk_key,level8_fk_key,level7_fk_key,level6_fk_key,
469               level5_fk_key,level4_fk_key,level3_fk_key,level2_fk_key,
470               level1_fk_key,
471               level9_name,level8_name,level7_name,level6_name,
472               level5_name,level4_name,level3_name,level2_name,
473               level1_name,
474               decode(level9_fk_key,NULL,0,1) +
475               decode(level8_fk_key,NULL,0,1) +
476               decode(level7_fk_key,NULL,0,1) +
477               decode(level6_fk_key,NULL,0,1) +
478               decode(level5_fk_key,NULL,0,1) +
479               decode(level4_fk_key,NULL,0,1) +
480               decode(level3_fk_key,NULL,0,1) +
481               decode(level2_fk_key,NULL,0,1) +
482               decode(level1_fk_key,NULL,0,1) c_level,--current level
483               Max(decode(level9_fk_key,NULL,0,1) +
484               decode(level8_fk_key,NULL,0,1) +
485               decode(level7_fk_key,NULL,0,1) +
486               decode(level6_fk_key,NULL,0,1) +
487               decode(level5_fk_key,NULL,0,1) +
488               decode(level4_fk_key,NULL,0,1) +
489               decode(level3_fk_key,NULL,0,1) +
490               decode(level2_fk_key,NULL,0,1) +
491               decode(level1_fk_key,NULL,0,1)) over(PARTITION BY hierarchy_id)
492               max_level--maximum level in the hierarchy
493               FROM mth_item_denorm_d
494               WHERE item_fk_key != MTH_UTIL_PKG.MTH_UA_GET_VAL
495           )
496           WHERE c_level<max_level
497 	  AND level9_fk_key IS NOT NULL
498         )';
499       LOOP
500 	    --fetch the rows in in cursor. Bulk collect
501             FETCH item_cur BULK COLLECT INTO denorm_rec.level9_fk_key,
502             denorm_rec.hierarchy_id,
503             denorm_rec.baselevel_fk_key,denorm_rec.level7_fk_key,
504 		denorm_rec.level6_fk_key,
505             denorm_rec.level5_fk_key,denorm_rec.level4_fk_key,
506             denorm_rec.level3_fk_key,denorm_rec.level2_fk_key,
507 		denorm_rec.level1_fk_key,
508             denorm_rec.level9_name,
509             denorm_rec.level7_name,
510 	    denorm_rec.level6_name,
511             denorm_rec.level5_name,
512             denorm_rec.level4_name,
513             denorm_rec.level3_name,
514             denorm_rec.level2_name,
515 	    denorm_rec.level1_name
516             LIMIT v_limit;
517 
518   	    --terminating condition
519             EXIT WHEN denorm_rec.baselevel_fk_key.count =0;
520 
521 	    --bulk update using forall
522             FORALL i IN
523 	denorm_rec.baselevel_fk_key.first..denorm_rec.baselevel_fk_key.last
524                 UPDATE mth_item_denorm_d
525                 SET
526                   level8_fk_key = denorm_rec.level9_fk_key(i),
527                   level7_fk_key = denorm_rec.level7_fk_key(i),
528                   level6_fk_key = denorm_rec.level6_fk_key(i),
529                   level5_fk_key = denorm_rec.level5_fk_key(i),
530                   level4_fk_key = denorm_rec.level4_fk_key(i),
531                   level3_fk_key = denorm_rec.level3_fk_key(i),
532                   level2_fk_key = denorm_rec.level2_fk_key(i),
533                   level1_fk_key = denorm_rec.level1_fk_key(i),
534                   level8_name   = denorm_rec.level9_name(i),
535                   level7_name   = denorm_rec.level7_name(i),
536                   level6_name   = denorm_rec.level6_name(i),
537                   level5_name   = denorm_rec.level5_name(i),
538                   level4_name   = denorm_rec.level4_name(i),
539                   level3_name   = denorm_rec.level3_name(i),
540                   level2_name   = denorm_rec.level2_name(i),
541                   level1_name   = denorm_rec.level1_name(i)
542                 WHERE
543                   item_fk_key = denorm_rec.baselevel_fk_key(i)
544                   AND hierarchy_id= denorm_rec.hierarchy_id(i);
545 END LOOP;
546 --close the cursor
547 CLOSE item_cur;
548 
549 --handle exceptions
550 EXCEPTION
551    WHEN NO_DATA_FOUND THEN
552    RAISE_APPLICATION_ERROR (-20001,
553         'Exception has occured');
554 
555 END mth_hrchy_balance_load ;
556 
557 
558 /* *****************************************************************************
559 * Procedure		:MTH_TRUNCATE_TABLE	                               *
560 * Description 	 	:This procedure is used to truncate the table in the   *
561 * MTH Schema. Thsi can be overriden by spefying a custom schema name as well.  *
562 * File Name	 	:MTHUTILS.PLS		             		       *
563 * Visibility		:Public                				       *
564 * Parameters	 	:Table name  		                               *
565 * Modification log	:						       *
566 *			Author		Date			Change	       *
567 *			Ankit Goyal	11-Oct-2007	Initial Creation       *
568 ***************************************************************************** */
569 
570 PROCEDURE mth_truncate_table(p_table_name IN VARCHAR2) IS
571 
572 --initialize variables here
573 v_stmt VARCHAR2(2000);
574 v_schema_name VARCHAR2(100);
575 v_status      VARCHAR2(30) ;
576 v_industry    VARCHAR2(30) ;
577 
578 -- main body
579 BEGIN
580 IF (FND_INSTALLATION.GET_APP_INFO(
581               application_short_name => 'MTH'
582             , status                 => v_status
583             , industry               => v_industry
584             , oracle_schema          => v_schema_name))
585 THEN
586 --Prepare the truncate statement using schema name and table name
587   v_stmt := 'TRUNCATE TABLE '||v_schema_name||'.'||p_table_name;
588   EXECUTE IMMEDIATE v_stmt;
589 END IF;
590 
591 END mth_truncate_table;
592 
593 /* *****************************************************************************
594 * Procedure		:MTH_TRUNCATE_TABLE	                               *
595 * Description 	 	:This procedure is used to truncate the table in the   *
596 *                        specified schema.                                     *
597 * File Name	 	:MTHUTILS.PLS		             		       *
598 * Visibility		:Public                				       *
599 * Parameters	 	:Table name                                            *
600 *                        Schema name                                           *
601 * Modification log	:						       *
602 *			Author		Date			Change	       *
603 *			Yong Feng	July 18, 2008	Initial Creation       *
604 ***************************************************************************** */
605 
606 PROCEDURE mth_truncate_table(p_table_name IN VARCHAR2,
607                              p_schema_name IN VARCHAR2) IS
608 --initialize variables here
609 v_stmt VARCHAR2(2000);
610 
611 BEGIN
612   --Prepare the truncate statement using schema name and table name
613   v_stmt := 'TRUNCATE TABLE '||p_schema_name||'.'||p_table_name;
614   EXECUTE IMMEDIATE v_stmt;
615   -- Truncate called for table
616   mth_util_pkg.log_msg('Truncated table '||p_table_name, mth_util_pkg.G_DBG_USER_INFO);
617 
618 END mth_truncate_table;
619 
620 /* ****************************************************************************
621 * Procedure             :MTH_TRUNCATE_TABLES                                  *
622 * Description           :This procedure is used to truncate the tables in the *
623 *                        list separated by comma.                             *
624 * File Name             :MTHUTILS.PLS                                         *
625 * Visibility            :Public                                               *
626 * Parameters            :p_list_table_names: List of table names separated    *
627 *                        by commas.                                           *
628 *                       :p_schema_name: The schema name for all listed tables.*
629 * Modification log      :                                                     *
630 *                       Author          Date                    Change        *
631 *                       Yong Feng       Aug-07-2008     Initial Creation      *
632 **************************************************************************** */
633 
634 PROCEDURE mth_truncate_tables(p_list_table_names IN VARCHAR2) IS
635   -- Index to identify the beginning of a table name in the list
636   v_bidx number := 1;
637   -- Index to identify the ending of a table name in the list
638   v_eidx number;
639   v_has_schema_name BOOLEAN;
640   v_table_name varchar2(30);
641   v_user_name varchar2(30);
642   v_status      VARCHAR2(30) ;
643   v_industry    VARCHAR2(30) ;
644   v_mth_name varchar2(30);
645   v_schema_name varchar2(30);
646   v_list_length number;
647   cursor getSchema (p_table_name in varchar2,
648                     p_owner1 in varchar2,
649                     p_owner2 in varchar2) is
650   SELECT owner
651   FROM ALL_TABLES
652   WHERE table_name = p_table_name
653   AND owner in (p_owner1, p_owner2);
654 
655 BEGIN
656   IF p_list_table_names IS NULL OR LENGTH(p_list_table_names) = 0 THEN
657     RETURN;
658   END IF;
659 
660   v_user_name :=user;
661 
662   IF (NOT FND_INSTALLATION.GET_APP_INFO(
663               application_short_name => 'MTH'
664             , status                 => v_status
665             , industry               => v_industry
666             , oracle_schema          => v_mth_name)) THEN
667        RAISE_APPLICATION_ERROR (-20001,
668         'Could not find MTH product.');
669   END IF;
670 
671   v_list_length := LENGTH(p_list_table_names);
672 
673   -- Parse the list of table name and truncate each table
674   v_eidx := INSTR(p_list_table_names, ',', v_bidx);
675 
676   -- Handle the case where there is only one element in the list
677   IF (v_eidx = 0 AND v_bidx <= v_list_length) THEN
678     v_eidx := v_list_length + 1;
679   END IF;
680 
681   WHILE (v_eidx > 0 AND v_eidx > v_bidx) LOOP
682     v_table_name := SUBSTR(p_list_table_names, v_bidx, (v_eidx - v_bidx));
683     v_table_name := UPPER(TRIM(BOTH FROM v_table_name));
684 
685     -- Get the schema name for that table
686     IF v_table_name IS NOT NULL AND LENGTH(v_table_name) > 0 THEN
687       OPEN getSchema ( v_table_name, v_user_name, v_mth_name);
688       FETCH getSchema INTO v_schema_name;
689       IF (getSchema%FOUND) THEN
690         MTH_TRUNCATE_TABLE(v_table_name, v_schema_name);
691         CLOSE getSchema;
692       ELSE
693         CLOSE getSchema;
694         RAISE_APPLICATION_ERROR (-20001,
695           'Could not find table ' || v_table_name || ' in either ' || v_user_name || ' or ' || v_mth_name || '.');
696       END IF;
697     END IF;
698     v_bidx := v_eidx + 1;
699     v_eidx := INSTR(p_list_table_names, ',', v_bidx);
700     -- Handle the case for end of the list
701     IF (v_eidx = 0 AND v_bidx <= v_list_length) THEN
702       v_eidx := v_list_length + 1;
703     END IF;
704   END LOOP;
705 END mth_truncate_tables;
706 
707 
708 
709 /* ****************************************************************************
710 * Procedure             :MTH_TRUNCATE_MV_LOGS                                 *
711 * Description           :This procedure is used to truncate the Materialized  *
712 *                        View log created on the tables                       *
713 *                        list separated by comma.                             *
714 * File Name             :MTHUTILS.PLS                                         *
715 * Visibility            :Public                                               *
716 * Parameters            :p_list_table_names: List of table names separated    *
717 *                        by commas.                                           *
718 * Modification log      :                                                     *
719 *                       Author          Date                    Change        *
720 *                       Yong Feng       Aug-07-2008     Initial Creation      *
721 **************************************************************************** */
722 
723 PROCEDURE MTH_TRUNCATE_MV_LOGS (p_list_table_names IN VARCHAR2) IS
724   -- Index to identify the beginning of a table name in the list
725   v_bidx number := 1;
726   -- Index to identify the ending of a table name in the list
727   v_eidx number;
728   v_has_schema_name BOOLEAN;
729   v_table_name varchar2(30);
730   v_user_name varchar2(30);
731   v_status      VARCHAR2(30) ;
732   v_industry    VARCHAR2(30) ;
733   v_mth_name varchar2(30);
734   v_log_owner varchar2(30);
735   v_log_table varchar2(30);
736   v_list_length number;
737   cursor getLogTableSchema (p_table_name in varchar2,
738                             p_owner1 in varchar2,
739                             p_owner2 in varchar2) is
740   SELECT log_owner, log_table
741   FROM ALL_SNAPSHOT_LOGS
742   WHERE master = p_table_name
743   AND log_owner in (p_owner1, p_owner2);
744 
745 BEGIN
746   IF p_list_table_names IS NULL OR LENGTH(p_list_table_names) = 0 THEN
747     RETURN;
748   END IF;
749 
750   v_user_name :=user;
751 
752   IF (NOT FND_INSTALLATION.GET_APP_INFO(
753               application_short_name => 'MTH'
754             , status                 => v_status
755             , industry               => v_industry
756             , oracle_schema          => v_mth_name)) THEN
757        RAISE_APPLICATION_ERROR (-20001,
758         'Could not find MTH product.');
759   END IF;
760 
761   v_list_length := LENGTH(p_list_table_names);
762 
763   -- Parse the list of table name and truncate each table
764   v_eidx := INSTR(p_list_table_names, ',', v_bidx);
765 
766   -- Handle the case where there is only one element in the list
767   IF (v_eidx = 0 AND v_bidx <= v_list_length) THEN
768     v_eidx := v_list_length + 1;
769   END IF;
770 
771   WHILE (v_eidx > 0 AND v_eidx > v_bidx) LOOP
772     v_table_name := SUBSTR(p_list_table_names, v_bidx, (v_eidx - v_bidx));
773     v_table_name := UPPER(TRIM(BOTH FROM v_table_name));
774 
775     -- Get the mv log name and schema name for that table
776     IF v_table_name IS NOT NULL AND LENGTH(v_table_name) > 0 THEN
777       OPEN getLogTableSchema ( v_table_name, v_user_name, v_mth_name);
778       FETCH getLogTableSchema INTO v_log_owner, v_log_table;
779       IF (getLogTableSchema%FOUND) THEN
780         MTH_TRUNCATE_TABLE(v_log_table, v_log_owner);
781         CLOSE getLogTableSchema ;
782       ELSE
783         CLOSE getLogTableSchema;
784         RAISE_APPLICATION_ERROR (-20001,
785           'Could not find Materialized View Log on table ' || v_table_name || ' in either ' || v_user_name || ' or ' || v_mth_name || '.');
786       END IF;
787     END IF;
788     v_bidx := v_eidx + 1;
789     v_eidx := INSTR(p_list_table_names, ',', v_bidx);
790     -- Handle the case for end of the list
791     IF (v_eidx = 0 AND v_bidx <= v_list_length) THEN
792       v_eidx := v_list_length + 1;
793     END IF;
794   END LOOP;
795 END MTH_TRUNCATE_MV_LOGS;
796 
797 
798 
799 
800 /* *****************************************************************************
801 * Function		:MTH_UA_GET_VAL	   			      	       *
802 * Description 	 	: This procedure is used to return the lookup code for *
803 * the unasssigned							       *
804 * File Name	 	:MTHUTILS.PLS		             		       *
805 * Visibility		:Public                				       *
806 * Parameters	 	:None                               	               *
807 * Return Value		:v_lookup_code : Unassigned lookup code value          *
808 * Modification log	:						       *
809 *			Author		Date			Change         *
810 *	Ankit Goyal	11-Oct-2007	Initial Creation                       *
811 ***************************************************************************** */
812 
813 Function mth_ua_get_val RETURN NUMBER IS
814 v_lookup_code varchar2(30);
815 BEGIN
816 --NULL
817   SELECT lookup_code INTO v_lookup_code FROM FND_LOOKUP_VALUES  WHERE
818     lookup_type='MTH_UNASSIGNED_L' AND language=userenv('LANG');
819 
820   RETURN(to_number(v_lookup_code));
821 
822 --handle exceptions
823 EXCEPTION
824    WHEN NO_DATA_FOUND THEN
825    RAISE_APPLICATION_ERROR (-20001,
826         'Exception has occured');
827 
828 END mth_ua_get_val;
829 
830 
831 
832 /* *****************************************************************************
833 * Function		:MTH_UA_GET_MEANING			               *
834 * Description 	 	:This procedure is used to return the lookup meaning   *
835 * for the unasssigned			                                       *
836 * File Name	 	:MTHUTILS.PLS				               *
837 * Visibility		:Public			                               *
838 * Parameters	 	:None                          	                       *
839 * Return Value		:v_lookup_code : Unassigned lookup code value          *
840 * Modification log	:	                                               *
841 *			Author		Date			Change         *
842 *			Ankit Goyal	23-Oct-2007	Initial Creation       *
843 ***************************************************************************** */
844 
845 Function mth_ua_get_meaning RETURN VARCHAR2 IS
846 v_lookup_meaning varchar2(80);
847 BEGIN
848 --NULL
849   SELECT meaning INTO v_lookup_meaning FROM FND_LOOKUP_VALUES  WHERE
850     lookup_type='MTH_UNASSIGNED_L' AND language=userenv('LANG');
851 
852   RETURN(v_lookup_meaning);
853 
854 --handle exceptions
855 EXCEPTION
856    WHEN NO_DATA_FOUND THEN
857    RAISE_APPLICATION_ERROR (-20001,
858         'Exception has occured');
859 
860 END mth_ua_get_meaning;
861 
862 /* ****************************************************************************
863 * Procedure		:request_lock	          	                      *
864 * Description 	 	:This procedure is used to request an exclusive       *
865 *    lock with p_key_table as the key using rdbms_lock package. The current   *
866 *    will wait indifinitely if the lock was held by others until the release  *
867 *    of the lock.                                                             *
868 * File Name	        :MTHUTILB.PLS	                       	   	      *
869 * Visibility	        :Private                          	              *
870 * Parameters	 	                              	                      *
871 *    p_key_table        : The name used to request an exclusive lock.         *
872 *    p_retval           : The return value of the operation:                  *
873 *                           0 - Success           			      *
874 *	                          1 - Timeout    			      *
875 *	                          2 - Deadlock    			      *
876 *	                          3 - Parameter Error    		      *
877 *	                          4 - Already owned    			      *
878 *	                          5 - Illegal Lock Handle    		      *
879 * Modification log	:					              *
880 *		           Author	Date	Change	                      *
881 *			   Yong Feng	17-Oct-2007	Initial Creation      *
882 **************************************************************************** */
883 PROCEDURE request_lock(p_key_table IN VARCHAR2, p_retval OUT NOCOPY INTEGER)
884 IS
885   v_lockhandle VARCHAR2(200);
886 BEGIN
887   dbms_lock.allocate_unique(p_key_table, v_lockhandle);
888   p_retval := dbms_lock.request(v_lockhandle, dbms_lock.x_mode);
889 END request_lock;
890 
891 /* ****************************************************************************
892 * Procedure		:generate_new_time_range	                      *
893 * Description 	 	:This procedure is used to generate a time range      *
894 *    starting from the last end date up to current time, sysdate, using       *
895 *    the p_key_table name as the key to look up the entry in mth_run_log      *
896 *    table. If the entry does not exist, create one and set the time range    *
897 *    to a hard-coded past time to current time.                               *
898 * File Name	 	:MTHUTILB.PLS		             		      *
899 * Visibility		:Public                				      *
900 * Parameters	 	                                                      *
901 *    p_key_table        : Name to uniquely identify one entry in the          *
902 *                         mth_run_log table.                                  *
903 *    p_start_date       : An output value that specifies the start time       *
904 *                         of the new time period.                             *
905 *    p_end_date         : An output value that specifies the end time         *
906 *                         of the new time period.                             *
907 *    p_exclusive_lock   : Specify whether it needs to request an exclusive    *
908 *                         lock using p_key_table as the key so that only      *
909 *                         one procedure will be running at one point of time. *
910 *                         If the value is 1, then it will run in exclusive    *
911 *                         mode. The lock will be released when the            *
912 *                         transaction is either committed or rollbacked.      *
913 * Modification log	:					              *
914 *			Author		Date			Change        *
915 *			Yong Feng	17-Oct-2007	Initial Creation      *
916 **************************************************************************** */
917 PROCEDURE generate_new_time_range(p_key_table IN VARCHAR2,
918                                   p_start_date OUT NOCOPY DATE,
919                                   p_end_date OUT NOCOPY DATE,
920                                   p_exclusive_lock IN NUMBER DEFAULT 1)
921 IS
922   v_from_date mth_run_log.from_date%TYPE;
923   v_to_date mth_run_log.to_date%TYPE;
924   v_is_new_entry BOOLEAN := FALSE;
925   v_default_start_date DATE := to_date('1950', 'YYYY');
926   v_sysdate DATE := sysdate;
927   v_retval number := 0;
928 
929   CURSOR c_lookup IS
930       SELECT to_date
931       FROM   mth_run_log
932       WHERE  fact_table = p_key_table and rownum=1;
933 BEGIN
934   -- 1. Validate the p_fact_table input value.
935   IF (p_key_table is not null) THEN
936 
937     -- 2. Check to see if we need to request an exclusive lock.
938     -- It will wait infinitively if it cannot get the lock.
939     -- Do not request lock any more for the mappinging. Request one
940     -- for the process flow instead.
941     --IF p_exclusive_lock = 1 THEN
942     --  request_lock(p_key_table, v_retval);
943     --END IF;
944 
945     --IF v_retval = 0 THEN
946 
947       -- 3. Do the look up
948       open c_lookup;
949       fetch c_lookup into v_to_date;
950       IF c_lookup%NOTFOUND THEN
951         v_is_new_entry := TRUE;
952       END IF;
953       close c_lookup;
954 
955       v_from_date := v_to_date;
956       v_to_date := v_sysdate;
957 
958       -- 4. Create a new entry if not exist. Otherwise, update the entry
959       IF v_is_new_entry THEN
960         v_from_date := v_default_start_date;
961         INSERT INTO mth_run_log
962           (fact_table, ebs_organization_id, ebs_organization_code, from_date,
963            to_date, source, db_global_name, creation_date, last_update_date,
964            creation_system_id, last_update_system_id, plant_start_date)
965         VALUES
966           (p_key_table, -1, '-1', v_from_date,
967            v_to_date, -1, '-99999', v_sysdate, v_sysdate,
968            -1, -1, v_default_start_date);
969       ELSE
970         UPDATE mth_run_log
971           SET TO_DATE = v_to_date,
972               FROM_DATE = v_from_date,
973               LAST_UPDATE_DATE = v_sysdate
974           WHERE
975               fact_table = p_key_table;
976       END IF;
977 
978       -- 5. Set the output variables
979       p_start_date := v_from_date;
980       p_end_date := v_to_date;
981     --END IF;
982   END IF;
983 END generate_new_time_range;
984 
985 
986 
987 /* *****************************************************************************
988 * Function		:GET_PROFILE_VAL  		       	               *
989 * Description 	 	:This function is used to retrive the value of the     *
990 * 			 profile for the profile name provided by the user     *
991 * File Name	 	:MTHSOURCEPATCHS.PLS	             		       *
992 * Visibility		:Public                				       *
993 * Return	 	: V_PROFILE_NAME - Global name of the source DB        *
994 * Modification log	:				                       *
995 *			Author		Date		    Change	       *
996 *			Ankit Goyal	29-Oct-2007	Initial Creation       *
997 ******************************************************************************/
998 FUNCTION get_profile_val(p_profile_name IN VARCHAR2) RETURN VARCHAR2
999 IS
1000 --local variable declation
1001 v_profile_value varchar2(120);
1002 
1003 v_uid number := -1;
1004 v_rid number := -1;
1005 v_applid number := 1;
1006 
1007 BEGIN
1008 
1009 --Initialize the session for default values -1.
1010 /* fnd_global.apps_initialize(v_uid, v_rid, v_applid); */
1011 
1012 --select the value of the profile into the local variable.
1013 select fnd_profile.value(p_profile_name) into v_profile_value from dual;
1014 
1015 --Return the value.
1016 RETURN(v_profile_value);
1017 
1018 --End the function
1019 END;
1020 
1021 /* *****************************************************************************
1022 * Function		:CHECK_REFERENCE  		       	               *
1023 * Description 	 	:This function is used to retrive the value of the     *
1024 * 			 count of rows from mv     *
1025 * File Name	 	:MTHUTILS.PLS	             		       *
1026 * Visibility		:Public                				       *
1027 * Return	 	: v_count Value									*
1028 * Modification log	:				                       *
1029 *			Author		Date		    Change	       *
1030 *			Mandar Gijare	20-Dec-2010	Initial Creation       *
1031 ******************************************************************************/
1032 FUNCTION check_reference RETURN NUMBER
1033 IS
1034 --local variable declation
1035 v_count number;
1036 
1037 BEGIN
1038 
1039 --select the count value into the local variable.
1040 SELECT Count(*) into v_count FROM mth_shift_reference_mv;
1041 
1042 --Return the value.
1043 RETURN(v_count);
1044 
1045 --End the function
1046 END;
1047 
1048 /* *****************************************************************************
1049 * Function		:FIND_METERS  		       	               *
1050 * Description :This function is used to retrive the value of the     *
1051 * 			 			 meters from the virtual meter formula     *
1052 * File Name	 	:MTHUTILS.PLS	             		       *
1053 * Visibility		:Public                				       *
1054 * Return	 	: v_str Value									*
1055 * Modification log	:				                       *
1056 *			Author		Date		    Change	       *
1057 *			Mandar Gijare	31-May-2011	Initial Creation       *
1058 ******************************************************************************/
1059 FUNCTION find_meters(p_meter_formula IN VARCHAR2) RETURN VARCHAR2
1060 IS
1061 --local variable declaration
1062 v_meter_id VARCHAR2(1000);
1063 v_str VARCHAR2(4000);
1064 v_str_len NUMBER;
1065 v_meter_name VARCHAR2(4000);
1066 v_meter_name_str VARCHAR2(4000);
1067 v_virt_meter_formula VARCHAR2(4000);
1068 v_meter_type VARCHAR2(10);
1069 v_position NUMBER;
1070 
1071 BEGIN
1072   v_str := p_meter_formula;
1073   v_str_len := InStr(v_str,'ID#');
1074 
1075   WHILE (v_str_len > 0)
1076   LOOP
1077     SELECT Least(
1078       Decode(InStr(v_str,'+',v_str_len),0,4000,InStr(v_str,'+',v_str_len)),
1079       Decode(InStr(v_str,'-',v_str_len),0,4000,InStr(v_str,'-',v_str_len)),
1080       Decode(InStr(v_str,'*',v_str_len),0,4000,InStr(v_str,'*',v_str_len)),
1081       Decode(InStr(v_str,'/',v_str_len),0,4000,InStr(v_str,'/',v_str_len)),
1082       Decode(InStr(v_str,'(',v_str_len),0,4000,InStr(v_str,'(',v_str_len)),
1083       Decode(InStr(v_str,')',v_str_len),0,4000,InStr(v_str,')',v_str_len)))
1084     INTO v_position
1085     FROM dual;
1086 
1087     SELECT SubStr(v_str,v_str_len,v_position-1-(v_str_len-1))
1088       INTO v_meter_id
1089       FROM dual;
1090       IF(v_meter_id IS NULL)
1091        THEN
1092          v_meter_id := v_str;
1093       END IF;
1094 
1095      IF v_meter_id IS NOT NULL
1096       THEN
1097         SELECT meter_name, meter_type, virtual_meter_formula
1098           INTO v_meter_name, v_meter_type, v_virt_meter_formula
1099           FROM mth_meters
1100          WHERE meter_pk_key IN (SELECT COMPONENT_VALUE
1101                                   FROM MTH_VIRTUAL_METER_COMPONENTS
1102                                  WHERE component_name = v_meter_id);
1103      END IF;
1104 
1105 
1106      IF v_virt_meter_formula IS NOT NULL
1107      THEN
1108           v_meter_name := v_meter_name || ' [ ' || FIND_METERS(v_virt_meter_formula) || ' ] ';
1109      ELSE
1110           v_meter_name := v_meter_name;
1111      END IF;
1112 
1113     v_str := SubStr(v_str,1,v_str_len-1) || v_meter_name || SubStr(v_str,v_position);
1114     v_str_len := InStr(v_str,'ID#');
1115 
1116    END LOOP;
1117 
1118    RETURN v_str;
1119  END;
1120 
1121 
1122 /* ****************************************************************************
1123 * Function		:Get_UDA_Eq_HId  	                              *
1124 * Description 	 	:This function is used to retrive the hierarchy id of *
1125 *			the UDA Equipment profile			      *
1126 * File Name	 	:MTHUTILS.PLS	                   		      *
1127 * Visibility		:Public                				      *
1128 * Return	 	:Hierarchy id for the equipment UDA profile           *
1129 * Modification log	:						      *
1130 *			Author		Date		    Change	      *
1131 *			Vivek		18-Jan-2008	Initial Creation      *
1132 ******************************************************************************/
1133 
1134 FUNCTION Get_UDA_Eq_HId  RETURN VARCHAR IS
1135 
1136 v_profile VARCHAR2(6);
1137 v_pos NUMBER;
1138 v_hId VARCHAR2(3);
1139 
1140 BEGIN
1141 
1142 -- Get the profile value, it will be of form h_id:level_no
1143 v_profile := FND_PROFILE.VALUE('MTH_UDA_EQUIPMENT_PROFILE');
1144 
1145 -- based on the position of :, retrieve h_id
1146 v_pos := INSTR(v_profile,':');
1147 v_hId := SUBSTR(v_profile,1,v_pos-1);
1148 
1149 RETURN v_hId;
1150 
1151 EXCEPTION
1152 	WHEN OTHERS THEN NULL;
1153 END;
1154 
1155 /* ****************************************************************************
1156 * Function		:Get_UDA_Eq_LNo  	                              *
1157 * Description 	 	:This function is used to retrive the Level Number of *
1158 *			the UDA Equipment profile			      *
1159 * File Name	 	:MTHUTILS.PLS	                   		      *
1160 * Visibility		:Public                				      *
1161 * Return	 	:Level Number for the equipment UDA profile           *
1162 * Modification log	:						      *
1163 *			Author		Date		    Change	      *
1164 *			Vivek		18-Jan-2008	Initial Creation      *
1165 ******************************************************************************/
1166 
1167 FUNCTION Get_UDA_Eq_LNo  RETURN VARCHAR IS
1168 
1169 v_profile VARCHAR2(6);
1170 v_pos NUMBER;
1171 v_lNo VARCHAR2(3);
1172 v_length NUMBER;
1173 
1174 BEGIN
1175 
1176 -- Get the profile value, it will be of form h_id:level_no
1177 v_profile := FND_PROFILE.VALUE('MTH_UDA_EQUIPMENT_PROFILE');
1178 
1179 -- based on the position of :, retrieve h_id
1180 v_pos := INSTR(v_profile,':');
1181 v_length := LENGTH(v_profile);
1182 v_lNo := SUBSTR(v_profile,v_pos+1,v_length);
1183 
1184 RETURN v_lNo;
1185 
1186 EXCEPTION
1187 	WHEN OTHERS THEN NULL;
1188 END;
1189 
1190 /* ****************************************************************************
1191 * Procedure		:REFRESH_MV	          	                      *
1192 * Description 	 	:This procedure is used to call DBMS_MVIEW.REFRESH    *
1193 *    procedure to refresh MVs.                                                *
1194 * File Name	        :MTHUTILB.PLS			             	      *
1195 * Visibility	        :Public   	                          	      *
1196 * Parameters	 	                              	                      *
1197 *    list               : Comma-separated list of materialized views that     *
1198 *                         you want to refresh.                                *
1199 *    method             :A string of refresh methods indicating how to        *
1200 *                        refresh the listed materialized views.               *
1201 *                        - An f indicates fast refresh                        *
1202 *                        - ? indicates force refresh                          *
1203 *                        - C or c indicates complete refresh                  *
1204 *                        - A or a indicates always refresh. A and C are       *
1205 *                          equivalent.		                              *
1206 *    rollback_seg       :Name of the materialized view site rollback segment  *
1207 *                        to use while refreshing materialized views.          *
1208 *    push_deferred_rpc  : Used by updatable materialized views only.          *
1209 *  refresh_after_errors :                                                     *
1210 *   purge_option        :                                                     *
1211 *   parallelism         : 0 specifies serial propagation                      *
1212 *    heap_size          :                                                     *
1213 *   atomic_refresh      :                                                     *
1214 * Modification log	:						      *
1215 *		         Author		Date		Change	              *
1216 *			 Yong Feng	11-July-2008	Initial Creation      *
1217 **************************************************************************** */
1218 PROCEDURE REFRESH_MV(
1219    p_list                   IN     VARCHAR2,
1220    p_method                 IN     VARCHAR2       := NULL,
1221    p_rollback_seg           IN     VARCHAR2       := NULL,
1222    p_push_deferred_rpc      IN     BOOLEAN        := true,
1223    p_refresh_after_errors   IN     BOOLEAN        := false,
1224    p_purge_option           IN     BINARY_INTEGER := 1,
1225    p_parallelism            IN     BINARY_INTEGER := 0,
1226    p_heap_size              IN     BINARY_INTEGER := 0,
1227    p_atomic_refresh         IN     BOOLEAN        := true
1228 )
1229 IS
1230 BEGIN
1231   DBMS_MVIEW.REFRESH(p_list, p_method, p_rollback_seg, p_push_deferred_rpc,
1232                      p_refresh_after_errors, p_purge_option,
1233                      p_parallelism, p_heap_size, p_atomic_refresh);
1234 END REFRESH_MV;
1235 
1236 /* ****************************************************************************
1237 * Procedure		:REFRESH_MV_ONE_ALL        	                      							*
1238 * Description :This procedure is used to call DBMS_MVIEW.REFRESH    					*
1239 *    								procedure to refresh MVs.                                 *
1240 * File Name	  :MTHUTILB.PLS			             	      													*
1241 * Visibility	:Public   	                          	      									*
1242 * Parameters	                             	                      						*
1243 *    list     : Comma-separated list of materialized views that     					*
1244 *               you want to refresh.                                					*
1245 *   																																					*
1246 * Modification log	:						      																				*
1247 *	 Author					Date				Change	              													*
1248 *	Mandar Gijare		24-May-2012	Initial Creation      													*
1249 **************************************************************************** */
1250 PROCEDURE REFRESH_MV_ONE_ALL(
1251    p_mview_name IN VARCHAR2
1252 )
1253 IS
1254 	 p_list                        VARCHAR2(2000) := NULL;
1255    p_method                      VARCHAR2(1)    := '?';
1256    p_rollback_seg                VARCHAR2(10)   := NULL;
1257    p_push_deferred_rpc           BOOLEAN        := true;
1258    p_refresh_after_errors        BOOLEAN        := false;
1259    p_purge_option                BINARY_INTEGER := 1;
1260    p_parallelism                 BINARY_INTEGER := 0;
1261    p_heap_size                   BINARY_INTEGER := 0;
1262    p_atomic_refresh              BOOLEAN        := true;
1263 BEGIN
1264 	p_list := 'MTH_SHIFT_GREGORIAN_DENORM_MV,MTH_RES_TXN_IT_MV,MTH_RES_TXN_LT_MV,MTH_MTL_CONS_IT_MV,MTH_MTL_CONS_LT_MV,MTH_MTL_PROD_IT_MV,MTH_MTL_PROD_LT_MV,
1265 					   MTH_RES_REQ_IT_MV,MTH_RES_REQ_LT_MV,MTH_EQUIP_OP_SUM_DD_MV,MTH_EQUIP_OP_SUM_PM_MV,MTH_EQUIP_ST_SUM_DD_MV,MTH_EQUIP_ST_SUM_PM_MV,MTH_EQUIP_PROD_SCH_DD_MV,
1266 					   MTH_EQUIP_PROD_SCH_PM_MV,MTH_EQUIP_SHFT_DD_MV,MTH_EQUIP_SHFT_PM_MV,MTH_RESOURCE_COST_MV,MTH_ITEM_COST_MV,MTH_ALL_ENTITIES_MV,MTH_ENTITY_PLANNED_USAGE_MV,
1267 					   MTH_ENTITY_PLANNED_USAGE_HR_MV,MTH_ENTITY_PLANNED_USAGE_SM_MV,MTH_445_PERIOD_CAL_HOUR_MV';
1268 
1269 	IF(p_mview_name = 'ALL')
1270 	THEN
1271 
1272   	DBMS_MVIEW.REFRESH(p_list, p_method, p_rollback_seg, p_push_deferred_rpc,
1273                      p_refresh_after_errors, p_purge_option,
1274                      p_parallelism, p_heap_size, p_atomic_refresh);
1275 
1276   ELSE
1277   	DBMS_MVIEW.REFRESH(p_mview_name,p_method);
1278   END IF;
1279 END REFRESH_MV_ONE_ALL;
1280 
1281 
1282 /* ****************************************************************************
1283 * Procedure		:REFRESH_ONE_MV	          	                              *
1284 * Description 	 	:This procedure is used to call refresh one MV.       *
1285 * File Name	        :MTHUTILB.PLS			             	            *
1286 * Visibility	        :Public   	                          	      *
1287 * Parameters	 	                              	                  *
1288 *    p_mv_name          : Name of the materialized view to be refreshed.      *
1289 *    p_method           :A string of refresh methods indicating how to        *
1290 *                        refresh the listed materialized views.               *
1291 *                        - An f indicates fast refresh                        *
1292 *                        - ? indicates force refresh                          *
1293 *                        - C or c indicates complete refresh                  *
1294 *                        - A or a indicates always refresh. A and C are       *
1295 *                          equivalent.		                              *
1296 *    p_rollback_seg     :Name of the materialized view site rollback segment  *
1297 *                        to use while refreshing materialized views.          *
1298 *    p_refresh_mode     :A string of refresh mode:                            *
1299 *                        - C , c or NULL indicates complete refresh.          *
1300 *                        - R or r indicates resume refresh that has been      *
1301 *                        started earlier. The MV will be refreshed if the     *
1302 *                        refresh date is earlier than the date stored in      *
1303 *                        to_date column in MTH_RUN_LOG for MTH_ALL_MVS entry. *
1304 *   p_push_deferred_rpc : Used by updatable materialized views only.          *
1305 * Modification log	:						                  *
1306 *		         Author		Date		Change	                  *
1307 *			 Yong Feng	19-Aug-2008	 Initial Creation                   *
1308 **************************************************************************** */
1309 
1310 PROCEDURE REFRESH_ONE_MV(
1311    p_mv_name                IN     VARCHAR2,
1312    p_method                 IN     VARCHAR2       := NULL,
1313    p_rollback_seg           IN     VARCHAR2       := NULL,
1314    p_refresh_mode           IN     VARCHAR2       := NULL
1315 )
1316 IS
1317   v_bneed_refresh BOOLEAN := FALSE;
1318   v_last_refresh_date DATE;
1319   v_refresh_date_required  DATE;
1320   v_unassigned_string VARCHAR2(20) := to_char(mth_util_pkg.mth_ua_get_val);
1321   v_mv_name varchar2(30);
1322   cursor getRefreshDate (p_mv_name in varchar2) is
1323   SELECT last_refresh_date
1324   FROM user_mviews
1325   WHERE mview_name = p_mv_name;
1326 BEGIN
1327   v_mv_name := UPPER(TRIM(p_mv_name));
1328   IF v_mv_name IS NULL OR LENGTH(v_mv_name) = 0 THEN
1329     RETURN;
1330   END IF;
1331 
1332   -- Check whether the MV needs to be refreshed
1333   IF (p_refresh_mode IS NULL OR upper(p_refresh_mode) <> 'R') THEN
1334     -- Need to refresh in mode C
1335     v_bneed_refresh := TRUE;
1336   ELSE
1337     -- It is a resume operation
1338     -- First, find the refresh date in MTH_RUN_LOG in resume case
1339     SELECT max(to_date) into v_refresh_date_required
1340       FROM mth_run_log
1341       WHERE fact_table = 'MTH_ALL_MVS' AND db_global_name = v_unassigned_string;
1342     IF (v_refresh_date_required IS NULL) THEN
1343       -- Refresh the MV if there is no entry found in MTH_RUN_LOG
1344       v_bneed_refresh := TRUE;
1345     ELSE
1346       -- First get the last refresh date of the MV
1347       -- Then, compare the last refresh date of the MV with the date from the MTH_RUN_LOG
1348       -- to decide whether the MV needs to be refreshed
1349       OPEN getRefreshDate ( v_mv_name);
1350       FETCH getRefreshDate INTO v_last_refresh_date;
1351       IF (getRefreshDate%FOUND) THEN
1352          v_bneed_refresh := (v_last_refresh_date IS NULL OR v_last_refresh_date <= v_refresh_date_required);
1353         CLOSE getRefreshDate ;
1354       ELSE
1355         CLOSE getRefreshDate ;
1356         RAISE_APPLICATION_ERROR (-20001,
1357           'Could not find Materialized View ' || v_mv_name || '.');
1358       END IF;
1359     END IF;
1360   END IF;
1361 
1362   IF v_bneed_refresh THEN
1363     DBMS_MVIEW.REFRESH(v_mv_name, p_method, p_rollback_seg);
1364   END IF;
1365 END REFRESH_ONE_MV;
1369 * Description 	 	:This procedure is used to insert the level_num column *
1366 
1367 /* *****************************************************************************
1368 * Procedure		:PUT_EQUIP_DENORM_LEVEL_NUM	          	       *
1370 *    in the mth_equipment_denorm_d table                                       *
1371 * File Name	        :MTHUTILB.PLS			             	       *
1372 * Visibility	        :Private	                          	       *
1373 * Modification log	:						       *
1374 *		       Author	      	Date	      	Change	               *
1375 *		   shanthi donthu    16-Jul-2008     Initial Creation          *
1376 ***************************************************************************** */
1377 
1378 PROCEDURE PUT_EQUIP_DENORM_LEVEL_NUM
1379 IS
1380 BEGIN
1381 UPDATE MTH_EQUIPMENT_DENORM_D SET LEVEL_NUM = (
1382          CASE WHEN EQUIPMENT_FK_KEY IS NOT NULL THEN 10
1383          ELSE CASE WHEN LEVEL9_LEVEL_KEY IS NOT NULL THEN 9
1384          ELSE CASE WHEN LEVEL8_LEVEL_KEY IS NOT NULL THEN 8
1385          ELSE CASE WHEN LEVEL7_LEVEL_KEY IS NOT NULL THEN 7
1386          ELSE CASE WHEN LEVEL6_LEVEL_KEY IS NOT NULL THEN 6
1387          ELSE CASE WHEN LEVEL5_LEVEL_KEY IS NOT NULL THEN 5
1388          ELSE CASE WHEN LEVEL4_LEVEL_KEY IS NOT NULL THEN 4
1389          ELSE CASE WHEN LEVEL3_LEVEL_KEY IS NOT NULL THEN 3
1390          ELSE CASE WHEN LEVEL2_LEVEL_KEY IS NOT NULL THEN 2
1391          ELSE CASE WHEN LEVEL1_LEVEL_KEY IS NOT NULL THEN 1
1392          END
1393          END
1394          END
1395          END
1396          END
1397          END
1398          END
1399          END
1400          END
1401          END )
1402 WHERE LEVEL_NUM IS NULL;
1403 
1404 END PUT_EQUIP_DENORM_LEVEL_NUM;
1405 
1406 /* *****************************************************************************
1407 * Procedure     :update_equip_hrchy_gid                                        *
1408 * Description    :This procedue is used for updating the group_id column in    *
1409 * the mth_equip_hierarchy table. The group id will be used to determine the    *
1410 * sequence in which a particular record will be processed in the equipment SCD *
1411 * logic. The oldest relationships will have the lowest group id =1 and the new *
1412 * relationships will have higher group id. All the catch all relationships i.e.*
1413 * the relationship with parent = -99999 and effective date = 1-Jan-1900 will   *
1414 * have group id defaulted to 1 inside the MTH_EQUIP_HRCHY_UA_ALL_MAP map.      *
1415 * File Name         :MTHUTILB.PLS                                              *
1416 * Visibility     :Public                                                       *
1417 * Parameters       : none                                                      *
1418 * Modification log :                                                           *
1419 * Author Date Change                                                           *
1420 * Ankit Goyal 26-Aug-2008 Initial Creation                                     *
1421 ***************************************************************************** */
1422 PROCEDURE update_equip_hrchy_gid
1423 IS
1424   /*variable to track # of conlficting rows*/
1425   l_max_gid NUMBER := 0;
1426   /*variable to get current maximum group id*/
1427   l_new_rows NUMBER := 0;
1428   v_new_ed DATE ;
1429   /*Variable to track the numnber of new rows */
1430   /*This cursor will fetch the number of rows that are in conflict. The rows
1431   are said to be in conflict when the incoming new rows have effective date
1432   less than the effective date of the current rows. This implies that the
1433   existing rows need to be processed after the new rows. This cursor fetches
1434   those rows and then logic in the program will manipulate those rows
1435   and increase theor group id.*/
1436   CURSOR cr_conflict_rows
1437   IS
1438      SELECT old_rows.hierarchy_id,
1439       old_rows.level_num         ,
1440       old_rows.group_id          ,
1441       old_rows.level_fk_key      ,
1442       old_rows.effective_date
1443        FROM
1444       (SELECT hierarchy_id           ,
1445         level_fk_key                 ,
1446         level_num                    ,
1447         effective_date effective_date,
1448         group_id
1449          FROM mth_equip_hierarchy
1450         WHERE group_id > 1
1451         /*group_id==1 are catch all rows.  */
1452      GROUP BY hierarchy_id,
1453         level_fk_key      ,
1454         level_num         ,
1455         group_id          ,
1456         effective_date
1457       ) old_rows        ,
1458     (SELECT hierarchy_id,
1459       level_fk_key      ,
1460       level_num         ,
1461       effective_date    ,
1462       parent_fk_key
1463        FROM mth_equip_hierarchy
1464       WHERE group_id IS NULL
1465     ) new_rows
1466     /*new relationships with group id as null */
1467     WHERE old_rows.hierarchy_id = new_rows.hierarchy_id
1468   AND old_rows.level_fk_key     = new_rows.level_fk_key
1469   AND old_rows.level_num        = new_rows.level_num
1470   AND old_rows.effective_date   > new_rows.effective_date;
1471   /*The effective date comparison will tell us if there are conflits */
1472   /*This cursor fetches the row among the conflict rows with the minimum
1473   effective date.This tells us all the rows that will need to be updated so
1474   that they are processed in the correct groups*/
1475   CURSOR cr_aggr_conflict_rows(p_effective_date IN date,p_hierarchy_id IN number,p_level_fk_key IN number,p_level_num IN number)
1476   IS
1477      SELECT new_ed FROM (
1478      SELECT old_rows.hierarchy_id    ,
1479       old_rows.level_num             ,
1480       MIN(old_rows.group_id) group_id,
1481       /*to skip group by */
1482       old_rows.level_fk_key                      ,
1483       MIN(old_rows.effective_date) effective_date,
1484       /*effecitve date of the old row */
1485       new_rows.effective_date new_ed
1486       /*effecitve date of the new row */
1487        FROM
1488       (SELECT hierarchy_id           ,
1489         level_fk_key                 ,
1490         level_num                    ,
1491         effective_date effective_date,
1492         group_id
1493          FROM mth_equip_hierarchy
1494         WHERE group_id > 1
1495         /*group_id==1 are catch all rows. */
1496       ) old_rows        ,
1497     (SELECT hierarchy_id,
1498       level_fk_key      ,
1499       level_num         ,
1500       effective_date    ,
1501       parent_fk_key
1502        FROM mth_equip_hierarchy
1503       WHERE group_id IS NULL
1504     ) new_rows
1505     /*new relationships with group id as null */
1506     WHERE old_rows.hierarchy_id = new_rows.hierarchy_id
1507   AND old_rows.level_fk_key     = new_rows.level_fk_key
1508   AND old_rows.level_num        = new_rows.level_num
1509   AND old_rows.effective_date   > new_rows.effective_date
1510    GROUP BY old_rows.hierarchy_id,
1511     old_rows.level_num         ,
1512     old_rows.level_fk_key      ,
1513     new_rows.effective_date) c_rows WHERE
1514   c_rows.effective_date =p_effective_date
1515   AND c_rows.hierarchy_id = p_hierarchy_id
1516   AND c_rows.level_fk_key = p_level_fk_key
1517   AND c_rows.level_num = p_level_num ;
1518   /*This cursor will fetch all the new rows for which the group id
1519   assignments have not been done.*/
1520   CURSOR cr_new_rows
1521   IS
1522      SELECT effective_date,
1523       hierarchy_id        ,
1524       level_fk_key        ,
1525       level_num
1526        FROM mth_equip_hierarchy
1527       WHERE group_id IS NULL;
1528 BEGIN
1529     FOR l_rows      IN cr_conflict_rows
1530     LOOP
1531       /*All rows in conflict */
1532     OPEN cr_aggr_conflict_rows(l_rows.effective_date,l_rows.hierarchy_id, l_rows.level_fk_key,l_rows.level_num);
1533      FETCH cr_aggr_conflict_rows into v_new_ed ;
1534               /*All aggregated rows in conflict */
1535         /*This part of the logic deals with updating the group id
1536         of the new rows. */
1537         IF(cr_aggr_conflict_rows%FOUND) then
1538         /*set the group id of the new row equal to the group id of the old
1539           row which matches the effective date*/
1540            UPDATE mth_equip_hierarchy
1541           SET group_id           = l_rows.group_id
1542             WHERE effective_date = v_new_ed
1543             /*This is the determining condition */
1544           AND hierarchy_id = l_rows.hierarchy_id
1545           AND level_fk_key = l_rows.level_fk_key
1546           AND level_num    = l_rows.level_num;
1547         END IF;
1548      CLOSE  cr_aggr_conflict_rows;
1549       /*Update the odl rows and increment the group id by 1         */
1550        UPDATE mth_equip_hierarchy
1551       SET group_id           = l_rows.group_id + 1
1552         WHERE effective_date = l_rows.effective_date
1553       AND hierarchy_id       = l_rows.hierarchy_id
1554       AND level_fk_key       = l_rows.level_fk_key
1555       AND level_num          = l_rows.level_num;
1556     END LOOP;
1557   /*This part of the logic will update any rows which did not cause a conflict
1558   with the old rows. This logic is necessary as the data can contain both the
1559   conflit rows and non conflict rows*/
1560   /*get the number of new rows remaining to be updated. */
1561    SELECT COUNT(* )
1562      INTO l_new_rows
1563      FROM mth_equip_hierarchy
1564     WHERE group_id IS NULL;
1565   IF l_new_rows     > 0 THEN
1566     /*if new rows found */
1567     FOR new_rows IN cr_new_rows
1568     LOOP
1569        SELECT MAX(group_id)
1570          INTO l_max_gid
1571          FROM mth_equip_hierarchy
1572         WHERE hierarchy_id = new_rows.hierarchy_id
1573       AND level_fk_key     = new_rows.level_fk_key
1574       AND level_num        = new_rows.level_num;
1575     /*update the new rows gorup_id column and set it = group_id of old row + 1*/
1576        UPDATE mth_equip_hierarchy
1577       SET group_id         = l_max_gid + 1
1578         WHERE hierarchy_id = new_rows.hierarchy_id
1579       AND level_fk_key     = new_rows.level_fk_key
1580       AND level_num        = new_rows.level_num
1581       AND effective_date   = new_rows.effective_date;
1582     END LOOP;
1583   END IF;
1584   --handle exceptions
1585 EXCEPTION
1586    WHEN NO_DATA_FOUND THEN
1587    RAISE_APPLICATION_ERROR (-20001,
1588         'Exception has occured');
1589 
1590 END update_equip_hrchy_gid;
1591 
1592 /* *****************************************************************************
1593 * Function     :get_min_max_gid                                        	       *
1594 * Description    :This finction returns the minimum or maximum group id in the *
1595 * Equipment hierarchy table.                                                   *
1596 * File Name         :MTHUTILB.PLS                                              *
1597 * Visibility     :Public                                                       *
1598 * Parameters       : Mode Number. Mode= 1 Minimum, Mode =2 Maximum             *
1599 * Modification log :                                                           *
1600 * Author Date Change                                                           *
1601 * Ankit Goyal 26-Aug-2008 Initial Creation                                     *
1602 ***************************************************************************** */
1603 
1604 FUNCTION get_min_max_gid
1605      (minmax  IN NUMBER)
1606 RETURN NUMBER
1607 IS
1608   v_minmax  NUMBER := 0;
1609 BEGIN
1610   IF minmax = 1 THEN
1611     SELECT MIN(group_id)
1612     INTO   v_minmax
1613     FROM   mth_equip_hierarchy;
1614   ELSE
1615     SELECT MAX(group_id)
1616     INTO   v_minmax
1617     FROM   mth_equip_hierarchy;
1618   END IF;
1619 
1620   RETURN v_minmax;
1621 END get_min_max_gid;
1622 
1623 /* *****************************************************************************
1624 * Procedure     :switch_column_default_value                                   *
1625 * Description    :This procedure will determine the current value of the       *
1626 *  processing_flag of the table, issue an alter table statement to switch      *
1627 *  the default values to another (1 to 2, or 2 to 1,) and return the           *
1628 *  current value. If there are no data in the table, do nothing and return     *
1629 *  0.                                                                          *
1630 * File Name         :MTHUTILB.PLS                                              *
1631 * Visibility     :Public                                                       *
1632 * Parameters       :                                                           *
1633 *         p_table_name:  table name                                            *
1634 *         p_current_processing_flag: the current value of processing_flag      *
1635 *                                    It could be 1, or 2 for normal case.      *
1636 *                                    If it is 0, then no data is available     *
1637 *                                    the table. So no process is needed.       *
1638 * Modification log :                                                           *
1639 * Author Date Change:  Yong Feng 10/2/08 Initial creation                      *
1640 ***************************************************************************** */
1641 
1642 PROCEDURE switch_column_default_value (
1643     p_table_name IN VARCHAR2,
1644     p_current_processing_flag OUT NOCOPY NUMBER)
1645 IS
1646   v_stmt varchar2(500);
1647   v_current_value NUMBER;
1648   v_new_value NUMBER;
1649   e_wrong_value EXCEPTION;
1650   v_schema_name VARCHAR2(100);
1651   v_status      VARCHAR2(30) ;
1652   v_industry    VARCHAR2(30) ;
1653 BEGIN
1654   IF p_table_name IS NULL OR LENGTH(p_table_name) = 0 THEN
1655     RETURN;
1656   END IF;
1657 
1658   IF (NOT FND_INSTALLATION.GET_APP_INFO(
1659               application_short_name => 'MTH'
1660             , status                 => v_status
1661             , industry               => v_industry
1662             , oracle_schema          => v_schema_name)) THEN
1663        RAISE_APPLICATION_ERROR (-20002,
1664         'Could not find MTH product.');
1665   END IF;
1666 
1667   v_stmt := 'SELECT processing_flag FROM ' ||
1668             v_schema_name || '.' || p_table_name ||
1669             ' WHERE rownum < 2';
1670   EXECUTE IMMEDIATE v_stmt INTO v_current_value;
1671 
1672   IF v_current_value = 1 THEN
1673     v_new_value := 2;
1674   ELSIF v_current_value = 2 THEN
1675     v_new_value := 1;
1676   ELSE RAISE e_wrong_value;
1677   END IF;
1678 
1679   v_stmt := 'ALTER TABLE ' || v_schema_name || '.' || p_table_name ||
1680             ' MODIFY PROCESSING_FLAG DEFAULT ' || v_new_value;
1681   EXECUTE IMMEDIATE v_stmt;
1682   p_current_processing_flag := v_current_value;
1683 EXCEPTION
1684   WHEN NO_DATA_FOUND THEN
1685     p_current_processing_flag := 0;
1686   WHEN e_wrong_value THEN
1687    RAISE_APPLICATION_ERROR (-20001, 'The table ' || p_table_name ||
1688      ' contains wrong value ' || v_current_value ||
1689      ' in column PROCESSING_FLAG.');
1690 END switch_column_default_value;
1691 
1692 
1693 /* *****************************************************************************
1694 * Procedure     :truncate_table_partition                                      *
1695 * Description    :This procedure will truncate the partition corresponding     *
1696 *                 to the value of p_current_processing_flag.                   *
1697 * File Name         :MTHUTILB.PLS                                              *
1698 * Visibility     :Public                                                       *
1699 * Parameters       :                                                           *
1700 *         p_table_name:  table name                                            *
1701 *         p_current_processing_flag: Used to determine the partition to be     *
1702 *          truncated. Truncate p1 if the value is 1; truncate p2 if 2.         *
1703 * Modification log :                                                           *
1704 * Author Date Change:  Yong Feng 10/2/08 Initial creation                      *
1705 ***************************************************************************** */
1706 
1707 PROCEDURE truncate_table_partition (
1708     p_table_name IN VARCHAR2,
1709     p_current_processing_flag IN NUMBER)
1710 IS
1711   v_stmt        VARCHAR2(500);
1712   v_schema_name VARCHAR2(100);
1713   v_status      VARCHAR2(30) ;
1714   v_industry    VARCHAR2(30) ;
1715   v_partition_name    VARCHAR2(30) ;
1716 
1717 BEGIN
1718   IF (NOT FND_INSTALLATION.GET_APP_INFO(
1719               application_short_name => 'MTH'
1720             , status                 => v_status
1721             , industry               => v_industry
1722             , oracle_schema          => v_schema_name)) THEN
1723        RAISE_APPLICATION_ERROR (-20002,
1724         'Could not find MTH product.');
1725   END IF;
1726 
1727   IF (p_current_processing_flag = 1) THEN
1728     v_partition_name := 'P1';
1729   ELSIF p_current_processing_flag = 2 THEN
1730     v_partition_name := 'P2';
1731   ELSE
1732    RAISE_APPLICATION_ERROR (-20003, 'The table ' || p_table_name ||
1733      ' cannot have the value ' || p_current_processing_flag ||
1734      ' in column PROCESSING_FLAG.');
1735   END IF;
1736   v_stmt := 'ALTER TABLE '||v_schema_name||'.'||p_table_name ||
1737             ' TRUNCATE PARTITION ' || v_partition_name;
1738   EXECUTE IMMEDIATE v_stmt;
1739 END truncate_table_partition;
1740 
1741 /* *****************************************************************************
1742 * Procedure      :mth_run_log_pre_load                              	       *
1743 * Description    :This procedure will log entries when a map is run taking     *
1744 *                 transaction id and populating from_txn_id and to_txn_id      *
1745 * File Name         :MTHUTILS.PLS                                              *
1746 * Visibility     :Public                                                       *
1747 * Modification log :                                                           *
1748 * Author Date Change:  Vivek Sharma 21-Jan-2009 Initial creation               *
1749 ***************************************************************************** */
1750 
1751 PROCEDURE mth_run_log_pre_load( p_fact_table IN VARCHAR2,
1752                                 p_db_global_name IN VARCHAR2,
1753                                 p_run_mode IN VARCHAR2,
1754                                 p_run_start_date IN DATE,
1755                                 p_is_fact IN NUMBER,
1756                                 p_to_date IN DATE,
1757                                 p_to_txn_id IN NUMBER)
1758 IS
1759 --local variable declation
1760 
1761 l_fact_table mth_run_log.fact_table%TYPE;--fact table name
1762 l_ebs_organization_id mth_run_log.ebs_organization_id%TYPE;
1763 l_ebs_organization_code mth_run_log.ebs_organization_code%TYPE;
1764 l_from_date mth_run_log.from_date%TYPE;--from date of the run
1765 l_to_date mth_run_log.to_date%TYPE;--to date of the run
1766 l_source mth_run_log.source%TYPE;--process or discrete. Not used currently
1767 l_system_fk_key mth_systems_setup.system_pk_key%TYPE;
1768 l_creation_date mth_run_log.creation_date%TYPE;--who column
1769 l_last_update_date mth_run_log.last_update_date%TYPE;--who column
1770 l_creation_system_id mth_run_log.creation_system_id%TYPE;--who column
1771 l_last_update_system_id mth_run_log.last_update_system_id%TYPE;--who column
1772 --l_sysdate to holding the current date
1773 l_sysdate DATE := sysdate;--target system sysdate
1774 --l_mode is used to determine the run type , initial 0 or incremental 1
1775 l_mode NUMBER := 0;--initial default
1776 l_plant_start_date DATE; --Plant end date
1777 --Hub organization code
1778 l_hub_organization_code mth_run_log.hub_organization_code%TYPE;
1779 --TXN IDS
1780 l_to_txn_id mth_run_log.to_txn_id%TYPE;
1781 l_from_txn_id mth_run_log.from_txn_id%TYPE;
1782 
1783 --cursor for iterating through the ebs organizations in mth_plants_d
1784 --the rows in the mth_run_log will be at organization granularity
1785 CURSOR c_ebs_orgs IS
1786 SELECT ebs_organization_id,organization_code,
1787   source,plant_pk,system_fk_key,from_date
1788 FROM mth_plants_d, mth_systems_setup,mth_organizations_l
1789 WHERE system_pk_key = system_fk_key
1790 AND system_pk = p_db_global_name
1791 AND NVL(to_date,TRUNC(SYSDATE)) >= TRUNC(SYSDATE)--pick active plants only
1792 AND plant_fk_key=plant_pk_key;
1793 
1794 BEGIN
1795   IF p_run_mode = 'INITIAL' THEN--Initial load
1796   l_from_txn_id := 0;
1797   --delete the rows from run log
1798   DELETE FROM mth_run_log WHERE fact_table = p_fact_table;
1799 
1800   END IF;
1801   --initialize the local variables and who columns
1802   l_fact_table := p_fact_table;
1803   l_last_update_system_id := -99999;
1804   l_last_update_date := l_sysdate;
1805   l_to_date := p_to_date;
1806   l_to_txn_id := p_to_txn_id;
1807 
1808   --initialize the global start date
1809   IF p_is_fact = 0 THEN--for dimensions only
1810   l_from_date := To_Date('01-01-1900','MM-DD-YYYY');
1811   END IF;
1812 
1813   --iterate through the cursor
1814   FOR l_orgs IN c_ebs_orgs
1815   LOOP
1816 
1817   	--initialize the variables for current cursor value
1818     l_ebs_organization_id := l_orgs.ebs_organization_id;
1819     l_source := l_orgs.source;--pick source column from the plants
1820     l_ebs_organization_code := l_orgs.organization_code;
1821     l_creation_date := l_sysdate;
1822 	l_creation_system_id := -1;
1823 
1824     IF p_is_fact = 1 THEN--for facts only
1825     	l_from_date := l_orgs.from_date;--run start date= plant start date
1826     END IF;
1827 
1828     l_plant_start_date := l_orgs.from_date;
1829     l_hub_organization_code := l_orgs.plant_pk;
1830 
1831 
1832    	IF l_orgs.ebs_organization_id is null THEN
1833    			/* We are dealing with non-ebs org configured to the passed system*/
1834    			/* Check if there are records for non-ebs organizations from same system and same fact and same plant */
1835    		SELECT COUNT(*)
1836 	    INTO l_mode
1837 	    FROM mth_run_log
1838 	    WHERE fact_table = l_fact_table
1839 	    AND db_global_name = p_db_global_name
1840 	    AND hub_organization_code = l_orgs.plant_pk;
1841 
1842 	    IF l_mode = 0 OR UPPER(p_run_mode) = 'INITIAL' THEN /* Initial Load */
1843 
1844 	      --statement for insert
1845 
1846 		      INSERT INTO mth_run_log (fact_table, ebs_organization_id,
1847 			ebs_organization_code,from_date,to_date, source, db_global_name,
1848 			creation_date,last_update_date,creation_system_id,
1849 			last_update_system_id,plant_start_date,hub_organization_code,from_txn_id,to_txn_id)
1850 		      VALUES(l_fact_table,l_ebs_organization_id,l_ebs_organization_code,
1851 			l_from_date,l_to_date,l_source,p_db_global_name,l_creation_date,
1852 			l_last_update_date,l_creation_system_id,l_last_update_system_id,
1853 			l_plant_start_date,l_hub_organization_code,l_from_txn_id,l_to_txn_id);
1854 
1855 	    ELSE
1856 		    /* update all non_ebs organizations from same system and plant with to_date as the passed date */
1857     		--Custom Logic for the time dimension
1858 		      IF p_fact_table = 'MTH_WORKDAY_SHIFTS_D'
1859 		      THEN
1860 			      UPDATE mth_run_log
1861 			      SET from_date = p_run_start_date
1862 			      WHERE
1863 			      fact_table = p_fact_table and db_global_name=p_db_global_name;
1864 		      END IF ;
1865 
1866 		      --statment for update
1867 		      UPDATE mth_run_log
1868 		      SET TO_DATE = l_to_date,
1869 		      TO_TXN_ID = l_to_txn_id,
1870 		      LAST_UPDATE_DATE = l_last_update_date,
1871 		      LAST_UPDATE_SYSTEM_ID =l_last_update_system_id
1872 		      WHERE
1873 		      fact_table =l_fact_table
1874 		      AND db_global_name = p_db_global_name
1875 		      AND hub_organization_code =  l_hub_organization_code;
1876 
1877 
1878     	END IF; /* END of Initial VS Incremental */
1879 
1880   ELSE
1881      /* We are dealing with EBS Organizations  */
1882 
1883     --determine if there are any rows in the mth_run_log for
1884     --the fact_table corresponding to the org
1885 	    SELECT COUNT(*)
1886 	    INTO l_mode
1887 	    FROM mth_run_log
1888 	    WHERE fact_table = l_fact_table
1889 	    AND ebs_organization_id = l_orgs.ebs_organization_id
1890 	    AND db_global_name = p_db_global_name
1891 	    AND hub_organization_code = l_orgs.plant_pk;
1892 
1893 	    --l_mode = 0 means that it is a initial run. p_run_mode is
1894 	    --for forceful execution of the initial load
1895 
1896 	    IF l_mode = 0 OR UPPER(p_run_mode) = 'INITIAL' THEN--initial load
1897 
1898 	      --initialize the variables for initial load
1899 	      l_creation_date := l_sysdate;
1900 	      l_creation_system_id := -1;
1901 
1902 	      --statement for insert
1903 
1904 	      INSERT INTO mth_run_log (fact_table, ebs_organization_id,
1905 		ebs_organization_code,from_date,to_date, source, db_global_name,
1906 		creation_date,last_update_date,creation_system_id,
1907 		last_update_system_id,plant_start_date,hub_organization_code,from_txn_id,to_txn_id)
1908 	      VALUES(l_fact_table,l_ebs_organization_id,l_ebs_organization_code,
1909 		l_from_date,l_to_date,l_source,p_db_global_name,l_creation_date,
1910 		l_last_update_date,l_creation_system_id,l_last_update_system_id,
1911 		l_plant_start_date,l_hub_organization_code,l_from_txn_id,l_to_txn_id);
1912 
1913 
1914 
1915 	      --if the above condition fails then update the row
1916 	    ELSE--incremental load
1917 
1918 	      --Custom Logic for the time dimension
1919 	      IF p_fact_table = 'MTH_WORKDAY_SHIFTS_D'
1920 	      THEN
1921 		      UPDATE mth_run_log
1922 		      SET from_date = p_run_start_date
1923 		      WHERE
1924 		      fact_table = p_fact_table;
1925 	      END IF ;
1926 		      --statment for update
1927 		      UPDATE mth_run_log
1928 		      SET TO_DATE = l_to_date,
1929 		      TO_TXN_ID = l_to_txn_id,
1930 		      LAST_UPDATE_DATE = l_last_update_date,
1931 		      LAST_UPDATE_SYSTEM_ID =l_last_update_system_id
1932 		      WHERE
1933 		      fact_table =l_fact_table
1934 		      AND source =l_source
1935 		      AND db_global_name = p_db_global_name
1936 		      AND ebs_organization_id = l_ebs_organization_id
1937 		      AND hub_organization_code =  l_hub_organization_code;
1938 
1939 	      --end of if clause
1940 	    END IF; /* END of Initial VS Incremental */
1941 
1942 END IF; /* End of EBS VS NON-EBS */
1943     --end of the for loop
1944   END LOOP;
1945 
1946 --handle exceptions
1947 EXCEPTION
1948    WHEN NO_DATA_FOUND THEN
1949    RAISE_APPLICATION_ERROR (-20001,
1950         'Exception has occured');
1951 
1952 END mth_run_log_pre_load;
1953 
1954 
1955 
1956 /* ****************************************************************************
1957 * Function		:GET_ATTR_EXT_COLUMN 	                              *
1958 * Description 	 	:This function is used to retrive column name in   *
1959 * 			 MTH_EQUIPMENTS_EXT_B that stores the value of an given  *
1960 *        attribute name.   *
1961 * File Name	 	:MTHUTILB.PLS	             		      *
1962 * Visibility		:Public
1963 * Parameters       :                                                           *
1964 *             p_attr_name:  Attribute name  *
1965 * Return	 	: COLUMN_NAME - Column name in MTH_EQUIPMENTS_EXT_B that  *
1966 *              stores the value of an given attribute name.      *
1967 * Modification log	:						      *
1968 *	Author Date Change: Yong Feng	14-Jul-2009	Initial Creation      *
1969 ******************************************************************************/
1970 FUNCTION GET_ATTR_EXT_COLUMN(p_attr_name IN VARCHAR2,
1971                              p_att_grp_name IN VARCHAR2 DEFAULT 'SPECIFICATIONS'
1972                             ) RETURN VARCHAR2 IS
1973   cursor getColumnName (p_attr_name in varchar2,
1974                         p_att_grp_name IN VARCHAR2) is
1975   SELECT DATABASE_COLUMN
1976   FROM EGO_ATTRS_V
1977   WHERE application_id = 9001 AND
1978         ATTR_GROUP_TYPE = 'MTH_EQUIPMENTS_GROUP'  AND
1979         attr_group_name = p_att_grp_name AND
1980         ATTR_NAME = p_attr_name;
1981   v_attr_dbcol varchar2(30) := NULL;
1982 BEGIN
1983 
1984  IF p_attr_name IS NULL OR LENGTH(p_attr_name) = 0 OR
1985     p_att_grp_name IS NULL OR LENGTH(p_att_grp_name) = 0 THEN
1986     RETURN NULL;
1987   END IF;
1988 
1989   OPEN getColumnName ( p_attr_name, p_att_grp_name );
1990   FETCH getColumnName INTO v_attr_dbcol;
1991   CLOSE getColumnName;
1992   RETURN v_attr_dbcol;
1993 END GET_ATTR_EXT_COLUMN;
1994 
1995 
1996 /* ****************************************************************************
1997 * Function		:GET_ATTR_GROUP_ID        	                              *
1998 * Description 	 	:This function is used to retrive attribute group ID    *
1999 * 			 from EGO_ATTR_GROUPS_V for a given attribute group name.   *
2000 * File Name	 	:MTHUTILB.PLS	             		      *
2001 * Visibility		:Public
2002 * Parameters       :                                                           *
2003 *             p_att_grp_name:  Attribute group name  *
2004 * Return	 	:  Attribute group id for the specified attribute group name      *
2005 * Modification log	:						      *
2006 *	Author Date Change: Yong Feng	26-Aug-2009	Initial Creation      *
2007 ******************************************************************************/
2008 FUNCTION GET_ATTR_GROUP_ID(p_att_grp_name IN VARCHAR2 DEFAULT 'SPECIFICATIONS'
2009                           ) RETURN NUMBER IS
2010   cursor getAttrGroupId (p_att_grp_name IN VARCHAR2) is
2011   SELECT ATTR_GROUP_ID
2012   FROM EGO_ATTR_GROUPS_V
2013   WHERE application_id = 9001 AND
2014         ATTR_GROUP_TYPE = 'MTH_EQUIPMENTS_GROUP'  AND
2015         attr_group_name = p_att_grp_name;
2016   v_attr_grp_id NUMBER := NULL;
2017 BEGIN
2018 
2019  IF p_att_grp_name IS NULL OR LENGTH(p_att_grp_name) = 0 THEN
2020     RETURN NULL;
2021   END IF;
2022 
2023   OPEN getAttrGroupId ( p_att_grp_name );
2024   FETCH getAttrGroupId INTO v_attr_grp_id;
2025   CLOSE getAttrGroupId;
2026   RETURN v_attr_grp_id;
2027 END GET_ATTR_GROUP_ID;
2028 
2029 
2030 /* ****************************************************************************
2031 * Procedure		:GET_UPPER_LOWER_LIMITS 	                              *
2032 * Description 	 	Find and return the UPPER and LOWER limit for the    *
2033 *                 equipment specified. *
2034 * File Name	 	:MTHUTILB.PLS	             		      *
2035 * Visibility		:Public
2036 * Parameters       :                                                           *
2037 *             p_equipment_fk_key:  Equipment fk key  *
2038 *             p_attr_name:  Attribute name   *
2039 *             p_att_grp_name:  attribute group name   *
2040 *             p_low_lim_name:  attribute name in EGO_ATTRS_V   *
2041 *             p_upp_lim_name:  another attribute name in EGO_ATTRS_V  *
2042 *             p_ret_LOWER_LIMIT : Lower limit returned *
2043 *             p_ret_UPPER_LIMIT : Upper limit returned *
2044 * Modification log	:						      *
2045 *	Author Date Change: Yong Feng	14-Jul-2009	Initial Creation      *
2046 ******************************************************************************/
2047 PROCEDURE GET_UPPER_LOWER_LIMITS(p_equipment_fk_key IN NUMBER,
2048                                  p_attr_name in VARCHAR2,
2049                                  p_att_grp_name IN VARCHAR2
2050                                                 DEFAULT 'SPECIFICATIONS',
2051                                  p_low_lim_name IN VARCHAR2
2052                                                 DEFAULT 'LLIMIT',
2053                                  p_upp_lim_name IN VARCHAR2
2054                                                 DEFAULT 'ULIMIT',
2055                                  p_ret_LOWER_LIMIT OUT NOCOPY NUMBER,
2056                                  p_ret_UPPER_LIMIT OUT NOCOPY NUMBER) IS
2057 
2058   TYPE cur_typ IS REF CURSOR;
2059   c cur_typ;
2060   query_str VARCHAR2(200);
2061 
2062   v_upp_column_name varchar2(30);
2063   v_low_column_name varchar2(30);
2064   v_parameter_col_name varchar2(30);
2065   v_attr_grp_id number;
2066 
2067 BEGIN
2068   v_attr_grp_id := GET_ATTR_GROUP_ID(p_att_grp_name);
2069   v_parameter_col_name := GET_ATTR_EXT_COLUMN('PARAMETER', p_att_grp_name);
2070   v_low_column_name := GET_ATTR_EXT_COLUMN(p_low_lim_name, p_att_grp_name);
2071   v_upp_column_name := GET_ATTR_EXT_COLUMN(p_upp_lim_name, p_att_grp_name);
2072   p_ret_LOWER_LIMIT := NULL;
2073   p_ret_UPPER_LIMIT := NULL;
2074 
2075   -- RETURN because LLIMIT or ULIMIT has not been setup properly
2076   if (v_low_column_name is NULL or LENGTH(v_low_column_name) = 0 or
2077       v_upp_column_name is NULL or LENGTH(v_upp_column_name) = 0 or
2078       v_parameter_col_name is NULL or LENGTH(v_parameter_col_name) = 0 or
2079       v_attr_grp_id is NULL ) THEN
2080       RETURN;
2081   END IF;
2082 
2083   query_str := 'SELECT ' ||  v_low_column_name || ', ' || v_upp_column_name ||
2084                ' FROM mth_equipments_ext_b' ||
2085                ' WHERE equipment_pk_key = :e_id AND ' ||
2086                v_parameter_col_name || ' = :attr_name AND ' ||
2087                ' attr_group_id = :attr_group_id';
2088   OPEN c FOR query_str USING p_equipment_fk_key, p_attr_name, v_attr_grp_id;
2089   FETCH c INTO p_ret_LOWER_LIMIT, p_ret_UPPER_LIMIT;
2090   CLOSE c;
2091 END GET_UPPER_LOWER_LIMITS;
2092 
2093 
2094 /* ****************************************************************************
2095 * Procedure		:GET_LATEST_READINGS 	                              *
2096 * Description 	 	Find the latest readings bwtween two readings *
2097 * File Name	 	:MTHUTILB.PLS	             		      *
2098 * Visibility		:Private
2099 * Parameters       :                                                           *
2100 *             p_tag_data1:  One tag data  *
2101 *             p_reading_time1: One reading time   *
2102 *             p_tag_data2:  Another input tag data  and return the latest one *
2103 *                           among two *
2104 *             p_reading_time2: Another input reading time and return the  *
2105 *                           latest one among two *
2106 * Modification log	:						      *
2107 *	Author Date Change: Yong Feng	14-Jul-2009	Initial Creation      *
2108 ******************************************************************************/
2109 PROCEDURE GET_LATEST_READINGS(p_tag_data1 IN VARCHAR2,
2110                               p_reading_time1 in DATE,
2111                               p_tag_data2 IN OUT NOCOPY VARCHAR2,
2112                               p_reading_time2 IN OUT NOCOPY DATE) IS
2113 
2114 BEGIN
2115   IF p_reading_time2 IS NULL OR
2116      p_reading_time1 IS NOT NULL and p_reading_time2 IS NOT NULL AND
2117      p_reading_time1 > p_reading_time2
2118   THEN
2122 END GET_LATEST_READINGS;
2119     p_tag_data2 := p_tag_data1;
2120     p_reading_time2 := p_reading_time1;
2121   END IF;
2123 
2124 
2125 /* ****************************************************************************
2126 * Function		:GET_PREV_TAG_READING 	                              *
2127 * Description 	 	:This function is used to retrive the previous reading *
2128 *                  from mth_tag_readings_stg, mth_tag_readings,  *
2129                    and mth_tag_readings_err *
2130 *                  for the given tag_code and reading time is earlier than *
2131 *                  the reading time specified and within the range specified *
2132 *                  by the range_in_hour *
2133 * File Name	 	:MTHUTILB.PLS	             		      *
2134 * Visibility		:Public
2135 * Parameters       :                                                           *
2136 *             p_tag_code:  TAG code name  *
2137 *             p_reading_time:  current reading_time  *
2138 *             p_range_in_hours:  Number of hours, which is used to limit   *
2139 *             the search of the prevous reading to the range that is earlier *
2140 *             than the reading_time and later than  *
2141 *             reading_time + p_range_in_hours / 24. *
2142 * Return	 	: Previous tag reading for the same tag *
2143 * Modification log	:						      *
2144 *	Author Date Change: Yong Feng	14-Jul-2009	Initial Creation      *
2145 ******************************************************************************/
2146 FUNCTION GET_PREV_TAG_READING(p_tag_code IN VARCHAR2,
2147                               p_reading_time IN DATE,
2148                               p_range_in_hours IN NUMBER DEFAULT NULL)
2149                 RETURN VARCHAR2 IS
2150   v_end_date DATE;
2151   v_pre_tag_data_stg VARCHAR2(255) := null;
2152   v_pre_reading_time_stg date := null;
2153   v_processed_flag NUMBER;
2154   v_pre_tag_data VARCHAR2(255) := null;
2155   v_pre_reading_time date := null;
2156   v_pre_tag_data_err VARCHAR2(255) := null;
2157   v_pre_reading_time_err date := null;
2158   v_pre_tag_data_ret VARCHAR2(255) := null;
2159   v_pre_reading_time_ret date := null;
2160   v_pre_tag_data_ret2 VARCHAR2(255) := null;
2161   v_pre_reading_time_ret2 date := null;
2162 
2163   v_found_pre_in_readings boolean := false;
2164   v_found_pre_in_err boolean := false;
2165   v_found_pre_in_stg boolean := false;
2166 
2167   CURSOR c_readings_stg (p_tag_code IN VARCHAR2,
2168                          p_start_reading_time IN DATE,
2169                          p_end_reading_time IN DATE) IS
2170     SELECT tag_data, reading_time, processed_flag
2171     FROM mth_tag_readings_stg
2172     WHERE tag_code = p_tag_code AND
2173           reading_time < p_start_reading_time AND
2174           reading_time >= p_end_reading_time
2175     ORDER BY reading_time desc;
2176 
2177   CURSOR c_readings     (p_tag_code IN VARCHAR2,
2178                          p_start_reading_time IN DATE,
2179                          p_end_reading_time IN DATE) IS
2180     SELECT tag_data, reading_time
2181     FROM mth_tag_readings
2182     WHERE tag_code = p_tag_code AND
2183           reading_time < p_start_reading_time AND
2184           reading_time >= p_end_reading_time
2185     ORDER BY reading_time desc;
2186 
2187   CURSOR c_readings_err (p_tag_code IN VARCHAR2,
2188                          p_start_reading_time IN DATE,
2189                          p_end_reading_time IN DATE) IS
2190     SELECT tag_data, reading_time
2191     FROM mth_tag_readings_err
2192     WHERE tag_code = p_tag_code AND
2193           reading_time < p_start_reading_time AND
2194           reading_time >= p_end_reading_time
2195     ORDER BY reading_time desc;
2196 
2197 BEGIN
2198   IF p_range_in_hours is not NULL and p_range_in_hours > 0 THEN
2199     v_end_date := p_reading_time - p_range_in_hours / 24;
2200   ELSE
2201     v_end_date := p_reading_time - 36500;
2202   END IF;
2203 
2204   OPEN c_readings_stg ( p_tag_code, p_reading_time, v_end_date);
2205   FETCH c_readings_stg INTO
2206         v_pre_tag_data_stg, v_pre_reading_time_stg, v_processed_flag;
2207   v_found_pre_in_stg := c_readings_stg%FOUND;
2208   CLOSE c_readings_stg;
2209 
2210   -- If found the previous reading in staging table and the data
2211   -- has not been processed yet, then that is the latest.
2212   IF v_found_pre_in_stg = true  THEN
2213     RETURN v_pre_tag_data_stg;
2214   END IF;
2215 
2216   -- Otherwise, look into readings and err tables.
2217   OPEN c_readings ( p_tag_code, p_reading_time, v_end_date);
2218   FETCH c_readings INTO v_pre_tag_data, v_pre_reading_time;
2219   v_found_pre_in_readings := c_readings%FOUND;
2220   CLOSE c_readings;
2221 
2222   OPEN c_readings_err ( p_tag_code, p_reading_time, v_end_date);
2223   FETCH c_readings_err INTO v_pre_tag_data_err, v_pre_reading_time_err;
2224   v_found_pre_in_err := c_readings_err%FOUND;
2225   CLOSE c_readings_err;
2226 
2227   GET_LATEST_READINGS(v_pre_tag_data_err,
2228                       v_pre_reading_time_err,
2229                       v_pre_tag_data,
2230                       v_pre_reading_time);
2231   return v_pre_tag_data;
2232 END GET_PREV_TAG_READING;
2233 
2234 
2235 
2236 
2237 /* ****************************************************************************
2238 * Procedure		:GET_PREV_TAG_READING_INFO 	                              *
2239 * Description 	 	:This function is used to retrive the previous reading *
2240 *                  from mth_tag_readings_stg, mth_tag_readings,  *
2241                    and mth_tag_readings_err *
2242 *                  for the given tag_code and reading time is earlier than *
2243 *                  the reading time specified and within the range specified *
2247 * Parameters       :                                                           *
2244 *                  by the range_in_hour *
2245 * File Name	 	:MTHUTILB.PLS	             		      *
2246 * Visibility		:Public
2248 *             p_tag_code:  TAG code name  *
2249 *             p_reading_time:  current reading_time  *
2250 *             p_range_in_hours:  Number of hours, which is used to limit   *
2251 *             the search of the prevous reading to the range that is earlier *
2252 *             than the reading_time and later than  *
2253 *             reading_time + p_range_in_hours / 24. *
2254 *             p_pre_tag_data: Previous tag reading for the same tag code *
2255 *             p_pre_reading_time: reading time for the previous tag reading  *
2256 *             p_pre_eqp_availability: The availability_flag in the
2257 *                      mth_equipment_shifts_d table      *
2258 *                                     Y - available *
2259 *                                     N - not available *
2260 *                                     NULL - no schedule available *
2261 * Modification log	:						      *
2262 *	Author Date Change: Yong Feng	14-Jul-2009	Initial Creation      *
2263 ******************************************************************************/
2264 PROCEDURE GET_PREV_TAG_READING_INFO(p_tag_code IN VARCHAR2,
2265                                     p_reading_time IN DATE,
2266                                     p_range_in_hours IN NUMBER DEFAULT NULL,
2267                                     p_pre_tag_data OUT NOCOPY VARCHAR2,
2268                                     p_pre_reading_time OUT NOCOPY DATE,
2269                                     p_pre_eqp_availability OUT NOCOPY VARCHAR2)
2270 IS
2271   v_end_date DATE;
2272   v_pre_tag_data_stg VARCHAR2(255) := null;
2273   v_pre_reading_time_stg date := null;
2274   v_processed_flag NUMBER;
2275   v_pre_tag_data VARCHAR2(255) := null;
2276   v_pre_reading_time date := null;
2277   v_pre_tag_data_err VARCHAR2(255) := null;
2278   v_pre_reading_time_err date := null;
2279   v_pre_tag_data_ret VARCHAR2(255) := null;
2280   v_pre_reading_time_ret date := null;
2281   v_pre_tag_data_ret2 VARCHAR2(255) := null;
2282   v_pre_reading_time_ret2 date := null;
2283   v_pre_eqp_availability varchar2(1) := null;
2284 
2285   v_found_pre_in_readings boolean := false;
2286   v_found_pre_in_err boolean := false;
2287   v_found_pre_in_stg boolean := false;
2288   v_equipment_fk_key number;
2289 
2290   CURSOR c_readings_stg (p_tag_code IN VARCHAR2,
2291                          p_start_reading_time IN DATE,
2292                          p_end_reading_time IN DATE) IS
2293     SELECT tag_data, reading_time, equipment_fk_key
2294     FROM mth_tag_readings_stg
2295     WHERE tag_code = p_tag_code AND
2296           reading_time < p_start_reading_time AND
2297           reading_time >= p_end_reading_time
2298     ORDER BY reading_time desc;
2299 
2300   CURSOR c_readings     (p_tag_code IN VARCHAR2,
2301                          p_start_reading_time IN DATE,
2302                          p_end_reading_time IN DATE) IS
2303     SELECT tag_data, reading_time, equipment_fk_key
2304     FROM mth_tag_readings
2305     WHERE tag_code = p_tag_code AND
2306           reading_time < p_start_reading_time AND
2307           reading_time >= p_end_reading_time
2308     ORDER BY reading_time desc;
2309 
2310   CURSOR c_readings_err (p_tag_code IN VARCHAR2,
2311                          p_start_reading_time IN DATE,
2312                          p_end_reading_time IN DATE) IS
2313     SELECT tag_data, reading_time, equipment_fk_key
2314     FROM mth_tag_readings_err
2315     WHERE tag_code = p_tag_code AND
2316           reading_time < p_start_reading_time AND
2317           reading_time >= p_end_reading_time
2318     ORDER BY reading_time desc;
2319 
2320     cursor c_avail (p_equipment_fk_key IN NUMBER, p_reading_time IN DATE ) IS
2321       SELECT s.availability_flag
2322       FROM MTH_EQUIPMENT_SHIFTS_D s
2323       WHERE s.equipment_fk_key = p_equipment_fk_key AND
2324             p_reading_time BETWEEN s.from_date AND s.To_Date;
2325 
2326 
2327 BEGIN
2328   IF p_range_in_hours is not NULL and p_range_in_hours > 0 THEN
2329     v_end_date := p_reading_time - p_range_in_hours / 24;
2330   ELSE
2331     v_end_date := p_reading_time - 36500;
2332   END IF;
2333 
2334   OPEN c_readings_stg ( p_tag_code, p_reading_time, v_end_date);
2335   FETCH c_readings_stg INTO
2336         v_pre_tag_data, v_pre_reading_time, v_equipment_fk_key;
2337   v_found_pre_in_stg := c_readings_stg%FOUND;
2338   CLOSE c_readings_stg;
2339 
2340   -- If found the previous reading in staging table and the data
2341   -- has not been processed yet, then that is the latest.
2342   -- Otherwise, look into readings and err tables.
2343   IF v_found_pre_in_stg = false THEN
2344     begin
2345 
2346       OPEN c_readings ( p_tag_code, p_reading_time, v_end_date);
2347       FETCH c_readings INTO v_pre_tag_data, v_pre_reading_time,
2348                             v_equipment_fk_key;
2349       v_found_pre_in_readings := c_readings%FOUND;
2350       CLOSE c_readings;
2351 
2352       OPEN c_readings_err ( p_tag_code, p_reading_time, v_end_date);
2353       FETCH c_readings_err INTO v_pre_tag_data_err, v_pre_reading_time_err,
2354                                 v_equipment_fk_key;
2355       v_found_pre_in_err := c_readings_err%FOUND;
2356       CLOSE c_readings_err;
2357 
2358       GET_LATEST_READINGS(v_pre_tag_data_err,
2359                           v_pre_reading_time_err,
2360                           v_pre_tag_data,
2361                           v_pre_reading_time);
2362      end;
2363    end if;
2364 
2365   IF ( v_pre_tag_data is not null and  v_pre_reading_time is not NULL ) THEN
2366     OPEN c_avail (v_equipment_fk_key, v_pre_reading_time);
2367     FETCH c_avail INTO v_pre_eqp_availability;
2368     CLOSE c_avail;
2369   END IF;
2370 
2374 
2371   p_pre_tag_data := v_pre_tag_data;
2372   p_pre_reading_time := v_pre_reading_time;
2373   p_pre_eqp_availability := v_pre_eqp_availability;
2375 END GET_PREV_TAG_READING_INFO;
2376 
2377 
2378 /* ****************************************************************************
2379 * Procedure		:GET_PREV_TAG_READING_SET 	                              *
2380 * Description 	 	:This function is used to retrive the previous reading set *
2381 *                  from mth_tag_readings_stg, mth_tag_readings,  *
2382                    and mth_tag_readings_err *
2383 *                  for the given tag_codes and reading time is earlier than *
2384 *                  the reading time specified and within the range specified *
2385 *                  by the range_in_hour. The reading set bounded by the same *
2386 *                  group id contains both tags *
2387 * File Name	 	:MTHUTILB.PLS	             		      *
2388 * Visibility		:Public
2389 * Parameters       :                                                           *
2390 *             p_tag_code1:  TAG code name  *
2391 *             p_reading_time1:  corresponding reading_time  *
2392 *             p_tag_code2:  Another tag code name  *
2393 *             p_reading_time2:  corresponding reading_time to the second tag *
2394 *             p_range_in_hours:  Number of hours, which is used to limit   *
2395 *             the search of the prevous reading to the range that is earlier *
2396 *             than the reading_time and later than  *
2397 *             reading_time + p_range_in_hours / 24. *
2398 *             p_pre_tag_data1: Previous tag reading for the  tag_code1 *
2399 *             p_pre_tag_data2: Previous tag reading for the  tag_code2  *
2400 * Modification log	:						      *
2401 *	Author Date Change: Yong Feng	14-Jul-2009	Initial Creation      *
2402 ******************************************************************************/
2403 PROCEDURE GET_PREV_TAG_READING_SET(p_tag_code1 IN VARCHAR2,
2404                                     p_reading_time1 IN DATE,
2405                                     p_tag_code2 IN VARCHAR2,
2406                                     p_reading_time2 IN DATE,
2407                                     p_range_in_hours IN NUMBER DEFAULT NULL,
2408                                     p_pre_tag_data1 OUT NOCOPY VARCHAR2,
2409                                     p_pre_tag_data2 OUT NOCOPY VARCHAR2) IS
2410   CURSOR c_pre_data_set(p_tag_code1 IN VARCHAR2, p_reading_time1 IN DATE,
2411                         p_tag_code2 IN VARCHAR2, p_reading_time2 IN DATE,
2412                         p_end_time IN DATE) IS
2413       SELECT tag_data1, reading_time1, tag_data2, reading_time2
2414       FROM (
2415         SELECT r1.tag_data tag_data1, r1.reading_time reading_time1,
2416               r2.tag_data tag_data2, r2.reading_time reading_time2
2417         FROM   mth_tag_readings_stg r1, mth_tag_readings_stg r2
2418         WHERE  r1.group_id = r2.GROUP_id AND
2419               r1.reading_time < p_reading_time1 AND
2420               r2.reading_time < p_reading_time2 AND
2421               r1.reading_time >= p_end_time AND
2422               r2.reading_time >= p_end_time AND
2423               r1.tag_code = p_tag_code1 AND
2424               r2.tag_code = p_tag_code2
2425         UNION ALL
2426         SELECT r1.tag_data tag_data1, r1.reading_time reading_time1,
2427               r2.tag_data tag_data2, r2.reading_time reading_time2
2428         FROM   mth_tag_readings r1, mth_tag_readings r2
2429         WHERE  r1.group_id = r2.GROUP_id AND
2430               r1.reading_time < p_reading_time1 AND
2431               r2.reading_time < p_reading_time2 AND
2432               r1.reading_time >= p_end_time AND
2433               r2.reading_time >= p_end_time AND
2434               r1.tag_code = p_tag_code1 AND
2435               r2.tag_code = p_tag_code2
2436         UNION ALL
2437         SELECT r1.tag_data tag_data1, r1.reading_time reading_time1,
2438               r2.tag_data tag_data2, r2.reading_time reading_time2
2439         FROM   mth_tag_readings_err r1, mth_tag_readings_err r2
2440         WHERE  r1.group_id = r2.GROUP_id AND
2441               r1.reading_time < p_reading_time1 AND
2442               r2.reading_time < p_reading_time2 AND
2443               r1.reading_time >= p_end_time AND
2444               r2.reading_time >= p_end_time AND
2445               r1.tag_code = p_tag_code1 AND
2446               r2.tag_code = p_tag_code2
2447       )
2448       ORDER BY   reading_time1 DESC, reading_time2 DESC;
2449 
2450   v_reading_time1 DATE;
2451   v_reading_time2 DATE;
2452   v_begin_date DATE;
2453   v_end_date DATE;
2454 BEGIN
2455   v_begin_date := LEAST(p_reading_time1, p_reading_time2);
2456   IF (v_begin_date IS NULL) THEN
2457     v_begin_date := SYSDATE;
2458   END IF;
2459   IF p_range_in_hours is not NULL and p_range_in_hours > 0 THEN
2460     v_end_date := v_begin_date - p_range_in_hours / 24;
2461   ELSE
2462     v_end_date := v_begin_date - 36500;
2463   END IF;
2464 
2465   OPEN c_pre_data_set(p_tag_code1, p_reading_time1,
2466                       p_tag_code2, p_reading_time2, v_end_date);
2467   FETCH c_pre_data_set INTO p_pre_tag_data1, v_reading_time1,
2468         p_pre_tag_data2, v_reading_time2;
2469   CLOSE c_pre_data_set;
2470 END GET_PREV_TAG_READING_SET;
2471 
2472 
2473 /* ****************************************************************************
2474 * Function		:VERIFY_TAG_DATA_TREND 	                              *
2475 * Description 	 	Check consecutive values of tag readings is above  *
2476 *                 mean value (or) below mean value and the previous set of *
2477 *                 data does not satisfy this condition *
2478 * File Name	 	:MTHUTILB.PLS	             		      *
2479 * Visibility		:Public
2480 * Parameters       :                                                           *
2481 *             p_tag_code:  tag code name  *
2482 *             p_tag_data:  tag data  *
2483 *             p_reading_time:  corresponding reading_time  *
2484 *             p_att_grp_name:  group name  *
2488 *             the search of the prevous reading to the range that is earlier *
2485 *             p_mean_attr_name:  attribute name in EGO_ATTRS_V   *
2486 *             p_num_of_readings:  Number of consective readings to check  *
2487 *             p_range_in_hours:  Number of hours, which is used to limit   *
2489 *             than the reading_time and later than  *
2490 *             reading_time + p_range_in_hours / 24. *
2491 *             RETURN: 0 Does not satisfy the condition *
2492 *                     1 Has a up trend  *
2493 *                     2 Has a down trend  *
2494 * Modification log	:						      *
2495 *	Author Date Change: Yong Feng	14-Jul-2009	Initial Creation      *
2496 ******************************************************************************/
2497 FUNCTION VERIFY_TAG_DATA_TREND(p_tag_code IN VARCHAR2,
2498                                p_tag_data IN VARCHAR2,
2499                                p_reading_time IN DATE,
2500                                p_att_grp_name IN VARCHAR2
2501                                               DEFAULT 'SPECIFICATIONS',
2502                                p_mean_attr_name IN VARCHAR2
2503                                               DEFAULT 'MEAN',
2504                                p_num_of_readings IN NUMBER,
2505                                p_range_in_hours IN NUMBER DEFAULT NULL)
2506                         RETURN NUMBER
2507 IS
2508   CURSOR c_attr_name (p_tag_code IN VARCHAR2) IS
2509       SELECT a.attr_name, t.equipment_fk_key
2510       FROM mth_tag_destination_map t, ego_attrs_v a, EGO_ATTR_GROUPS_V g
2511       WHERE t.tag_code = p_tag_code and t.attribute = a.attr_id AND
2512             t.attribute_group = g.attr_group_id AND a.application_id = 9001 AND
2513             a.application_id = g.application_id and
2514             a.attr_group_name = g.attr_group_name;
2515 
2516   CURSOR c_pre_data_set(p_tag_code IN VARCHAR2, p_reading_time IN DATE,
2517                         p_end_time IN DATE) IS
2518       SELECT tag_data, reading_time
2519       FROM (
2520         SELECT tag_data, reading_time
2521         FROM   mth_tag_readings_stg
2522         WHERE  reading_time < p_reading_time AND
2523                reading_time >= p_end_time AND
2524                tag_code = p_tag_code
2525         UNION ALL
2526         SELECT tag_data, reading_time
2527         FROM   mth_tag_readings
2528         WHERE  reading_time < p_reading_time AND
2529                reading_time >= p_end_time AND
2530                tag_code = p_tag_code
2531         UNION ALL
2532         SELECT tag_data, reading_time
2533         FROM   mth_tag_readings_err
2534         WHERE  reading_time < p_reading_time AND
2535                reading_time >= p_end_time AND
2536                tag_code = p_tag_code
2537       )
2538       ORDER BY   reading_time DESC;
2539 
2540   TYPE cur_typ IS REF CURSOR;
2541   c cur_typ;
2542   query_str VARCHAR2(200);
2543   v_mean_column_name varchar2(30);
2544   v_ret_value number := 1;
2545   v_attr_name varchar2(30);
2546   v_equipment_fk_key number;
2547   v_mean_value number;
2548   v_end_date DATE;
2549   v_is_up_trend boolean;
2550   v_num_data_examed number;
2551 
2552   v_cur_tag_data varchar2(255);
2553   v_cur_reading_time date;
2554   v_pre_tag_data varchar2(255);
2555   v_pre_reading_time date;
2556   v_has_trend boolean;
2557   v_cur_tag_value number;
2558   v_pre_tag_value number;
2559   v_pre_has_trend boolean;
2560   v_has_more_data boolean;
2561   v_parameter_col_name varchar2(30);
2562   v_attr_grp_id number;
2563 
2564 BEGIN
2565   v_attr_grp_id := GET_ATTR_GROUP_ID(p_att_grp_name);
2566   v_parameter_col_name := GET_ATTR_EXT_COLUMN('PARAMETER', p_att_grp_name);
2567 
2568   -- Get the attribute name associated with tag code
2569   open c_attr_name(p_tag_code);
2570   fetch c_attr_name into v_attr_name, v_equipment_fk_key;
2571   close c_attr_name;
2572 
2573   -- Construct the sql to get the value for that attribute
2574   v_mean_column_name := GET_ATTR_EXT_COLUMN(p_mean_attr_name, p_att_grp_name);
2575 
2576   IF v_attr_name is null or length(v_attr_name) = 0 or
2577      v_parameter_col_name is NULL or LENGTH(v_parameter_col_name) = 0 or
2578      v_mean_column_name is NULL or LENGTH(v_mean_column_name) = 0 or
2579      v_attr_grp_id is NULL THEN
2580     return 0;
2581   END IF;
2582 
2583   query_str := 'SELECT ' ||  v_mean_column_name ||
2584                ' FROM mth_equipments_ext_b' ||
2585                ' WHERE equipment_pk_key = :e_id AND ' ||
2586                v_parameter_col_name || ' = :attr_name AND ' ||
2587                ' attr_group_id = :attr_group_id';
2588   OPEN c FOR query_str USING v_equipment_fk_key, v_attr_name, v_attr_grp_id;
2589   FETCH c INTO v_mean_value;
2590   CLOSE c;
2591 
2592   -- IF could not find the mean value, or a user-specified value, OR
2593   -- the mean value is equal to the current tag_data
2594   -- THEN return 0 for no trend found.
2595   IF (v_mean_value IS NULL OR to_number(p_tag_data) = v_mean_value ) THEN
2596     return 0;
2597   END IF;
2598 
2599   IF p_range_in_hours is not NULL and p_range_in_hours > 0 THEN
2600     v_end_date := p_reading_time - p_range_in_hours / 24;
2601   ELSE
2602     v_end_date := p_reading_time - 36500;
2603   END IF;
2604   OPEN c_pre_data_set(p_tag_code, p_reading_time, v_end_date);
2605 
2606   v_is_up_trend := (to_number(p_tag_data) > v_mean_value);
2607 
2608   v_num_data_examed := 1;
2609   v_pre_tag_value := to_number(p_tag_data);
2610   v_has_trend := true;
2611   v_has_more_data := true;
2612   while v_num_data_examed <= p_num_of_readings  and
2613         v_has_trend and v_has_more_data loop
2614     fetch c_pre_data_set into v_cur_tag_data, v_cur_reading_time;
2615     --EXIT WHEN c_pre_data_set%NOTFOUND;
2616     if (c_pre_data_set%NOTFOUND) THEN
2617       v_has_more_data := false;
2618     else
2622         if v_is_up_trend then
2619       begin
2620         v_cur_tag_value := to_number(v_cur_tag_data);
2621          v_pre_has_trend := v_has_trend;
2623           v_has_trend := ( -- v_pre_tag_value > v_cur_tag_value AND
2624                            v_cur_tag_value > v_mean_value );
2625         else
2626           v_has_trend := ( -- v_pre_tag_value < v_cur_tag_value AND
2627                            v_cur_tag_value < v_mean_value );
2628         end if;
2629 
2630         v_num_data_examed := v_num_data_examed + 1;
2631         v_pre_tag_value := v_cur_tag_value;
2632       end;
2633     end if;
2634   end loop;
2635   close c_pre_data_set;
2636 
2637   if ((v_num_data_examed = p_num_of_readings + 1) and
2638      v_pre_has_trend = true and v_has_trend = false)  OR
2639      ((v_num_data_examed = p_num_of_readings) and  v_has_trend = true) then
2640      IF v_is_up_trend THEN
2641        v_ret_value := 1;
2642      ELSE
2643        v_ret_value := 2;
2644      END IF;
2645   else
2646     v_ret_value := 0;
2647   end if;
2648   return v_ret_value;
2649 
2650 END VERIFY_TAG_DATA_TREND;
2651 
2652 
2653 /* ****************************************************************************
2654 * Procedure		:PUT_DOWN_STS_EXPECTED_UPTIME 	                              *
2655 * Description 	 	:This procedure puts expected_up_time for planned   *
2656 *                  downtime in the mth_equip_statuses table  *
2657 * File Name	 	:MTHUTILB.PLS	             		      *
2658 * Visibility		:Public
2659 * Modification log	:						      *
2660 *	Author Date Change: Shanthi Swaroop Donthu	18-Jul-2009	Initial Creation      *
2661 ******************************************************************************/
2662 PROCEDURE PUT_DOWN_STS_EXPECTED_UPTIME
2663 IS
2664 v_start_time DATE;
2665 v_end_time   DATE;
2666 v_run_date   DATE;
2667 BEGIN
2668 SELECT DISTINCT from_date INTO v_run_date FROM mth_run_log WHERE fact_table = 'MTH_EQUIP_DOWN_STS_UPTIME';
2669 
2670     FOR i IN (SELECT equipment_fk_key,shift_workday_fk_key,from_date,To_Date,system_fk_key,creation_date,last_update_date,creation_system_id,
2671                             last_update_system_id FROM mth_equip_statuses WHERE status=3 AND To_Date IS NOT NULL AND last_update_date>=v_run_date)
2672     LOOP
2673     v_start_time := i.from_date;
2674     v_end_time   := i.To_Date;
2675 
2676           --Dbms_Output.PUT_LINE('v_start_time AND v_end_time are'||'-----'||To_Char(v_start_time,'dd-Mon-yyyy hh24:mi:ss')||'------'||To_Char(v_end_time,'dd-Mon-yyyy hh24:mi:ss'));
2677 
2678          FOR j IN (SELECT equipment_fk_key,shift_workday_fk_key,from_date,To_Date FROM mth_equipment_shifts_d WHERE equipment_fk_key = i.equipment_fk_key
2679                      AND shift_workday_fk_key = i.shift_workday_fk_key AND Upper(availability_flag)= 'N')
2680          LOOP
2681 
2682          --Dbms_Output.PUT_LINE('Equip_shift'||'------'||To_Char(j.from_date,'dd-Mon-yyyy hh24:mi:ss')||'------'||To_Char(j.to_date,'dd-Mon-yyyy hh24:mi:ss'));
2683          /***************************************/
2684 
2685          IF (v_start_time < j.from_date) THEN
2686             IF (v_end_time >= j.from_date) THEN
2687                    IF (i.from_date = v_start_time) THEN
2688                         UPDATE mth_equip_statuses SET To_Date = j.from_date WHERE equipment_fk_key = i.equipment_fk_key
2689                                                          AND shift_workday_fk_key = i.shift_workday_fk_key AND from_date = v_start_time;
2690                                                        /***** NO EXPECTE_DOWN_TIME ******/
2691                     --Dbms_Output.PUT_LINE('Third Updated status record with the end date'||'---'||To_Char(j.from_date,'dd-Mon-yyyy hh24:mi:ss'));
2692                     ELSE
2693                          INSERT INTO mth_equip_statuses(equipment_fk_key,shift_workday_fk_key,from_date,To_Date,status,system_fk_key,
2694                                   creation_date,last_update_date,creation_system_id,last_update_system_id) VALUES (i.equipment_fk_key,
2695                                   i.shift_workday_fk_key,v_start_time,j.from_date,3,i.system_fk_key,i.creation_date,sysdate,
2696                                   i.creation_system_id,i.last_update_system_id);
2697 
2698                      --Dbms_Output.PUT_LINE('inserted status record with'||'---'||To_Char(v_start_time,'dd-Mon-yyyy hh24:mi:ss')||'---'||To_Char(j.from_date,'dd-Mon-yyyy hh24:mi:ss'));
2699 
2700                     END IF;
2701 
2702                   IF (v_end_time <= j.To_Date) THEN
2703 
2704                       INSERT INTO mth_equip_statuses(equipment_fk_key,shift_workday_fk_key,from_date,To_Date,status,system_fk_key,
2705                                   creation_date,last_update_date,creation_system_id,last_update_system_id,expected_up_time,status_type) VALUES (i.equipment_fk_key,
2706                                   i.shift_workday_fk_key,j.from_date,v_end_time,3,i.system_fk_key,i.creation_date,sysdate,
2707                                   i.creation_system_id,i.last_update_system_id,((j.To_Date-j.from_date)*24),'PLANNED DOWNTIME');/*** EXPECTED_UP_TIME = J.TO_DATE - J.FROM_DATE **/
2708                                   EXIT;
2709                         --Dbms_Output.PUT_LINE('inserted status record with'||'---'||To_Char(j.from_date,'dd-Mon-yyyy hh24:mi:ss')||'---'||To_Char(v_end_time,'dd-Mon-yyyy hh24:mi:ss'));
2710 
2711                   ELSE
2712                       INSERT INTO mth_equip_statuses(equipment_fk_key,shift_workday_fk_key,from_date,To_Date,status,system_fk_key,
2713                                   creation_date,last_update_date,creation_system_id,last_update_system_id,expected_up_time,status_type) VALUES (i.equipment_fk_key,
2714                                   i.shift_workday_fk_key,j.from_date,j.to_date,3,i.system_fk_key,i.creation_date,sysdate,
2715                                   i.creation_system_id,i.last_update_system_id,((j.To_Date-j.from_date)*24),'PLANNED DOWNTIME');/*** EXPECTED_UP_TIME = J.TO_DATE - J.FROM_DATE **/
2716 
2720                       v_start_time := j.To_Date;
2717                            --Dbms_Output.PUT_LINE('inserted status record with'||'---'||To_Char(j.from_date,'dd-Mon-yyyy hh24:mi:ss')||'---'||To_Char(j.to_date,'dd-Mon-yyyy hh24:mi:ss'));
2718 
2719 
2721                   END IF;
2722             END IF;
2723          END IF;
2724 
2725           /****************************************/
2726 
2727          IF (v_start_time >= j.from_date AND v_start_time < j.To_Date)  THEN
2728             --Dbms_Output.PUT_LINE('First IF condition');
2729 
2730              IF(v_end_time <= j.to_date) THEN
2731 
2732              UPDATE mth_equip_statuses SET expected_up_time = ((j.to_date-v_start_time)*24), status_type = 'PLANNED DOWNTIME', last_update_date = SYSDATE
2733                                      WHERE equipment_fk_key = i.equipment_fk_key
2734                                                          AND shift_workday_fk_key = i.shift_workday_fk_key AND from_date = v_start_time AND To_Date=v_end_time;
2735                    /***UPDATE THE RECORD WITH *** EXPECTED_UP_TIME = V_END_TIME - V_START_TIMR **/
2736 
2737              EXIT ;
2738 
2739              ELSE
2740                   UPDATE mth_equip_statuses SET To_Date = j.to_date, last_update_date = SYSDATE,expected_up_time=((j.To_Date - v_start_time)*24), status_type ='PLANNED DOWNTIME'   WHERE equipment_fk_key = i.equipment_fk_key
2741                                                          AND shift_workday_fk_key = i.shift_workday_fk_key AND from_date = v_start_time;
2742 
2743                   --Dbms_Output.PUT_LINE('Third Updated status record with the end date'||'---'||To_Char(j.to_date,'dd-Mon-yyyy hh24:mi:ss'));
2744 
2745                   INSERT INTO mth_equip_statuses(equipment_fk_key,shift_workday_fk_key,from_date,To_Date,status,system_fk_key,
2746                                   creation_date,last_update_date,creation_system_id,last_update_system_id) VALUES (i.equipment_fk_key,
2747                                   i.shift_workday_fk_key,j.to_date,v_end_time,3,i.system_fk_key,i.creation_date,sysdate,
2748                                   i.creation_system_id,i.last_update_system_id);
2749 
2750                  --Dbms_Output.PUT_LINE('inserted status record with'||'---'||To_Char(j.to_date,'dd-Mon-yyyy hh24:mi:ss')||'---'||To_Char(v_end_time,'dd-Mon-yyyy hh24:mi:ss'));
2751 
2752                   v_start_time := j.To_Date;
2753 
2754              END IF;
2755          END IF;
2756       COMMIT;
2757 
2758 END LOOP;
2759 COMMIT;
2760 END LOOP;
2761 DELETE FROM mth_equip_statuses WHERE from_date = To_Date;
2762 COMMIT;
2763 
2764 END PUT_DOWN_STS_EXPECTED_UPTIME;
2765 
2766 
2767 
2768 /*****************************************************************************
2769 * Procedure		:MTH_LOAD_HOUR_STATUS 	                              *
2770 * Description 	 	:This procedure is used to break the shift level status data   *
2771 *                  into hour level and populates into mth_equip_statuses table  *
2772 * File Name	 	:MTHUTILB.PLS	             		      *
2773 * Visibility		:Public
2774 * Modification log	:						      *
2775 *	Author Date Change: Shanthi Swaroop Donthu	08-Dec-2009	Initial Creation      *
2776 ******************************************************************************/
2777 
2778 PROCEDURE MTH_LOAD_HOUR_STATUS(p_equipment_fk_key IN  NUMBER,p_shift_workday_fk_key IN  NUMBER,
2779 p_from_date IN  DATE, p_to_date IN  DATE,p_status IN  VARCHAR2,
2780 p_system_fk_key IN  NUMBER,p_user_dim1_fk_key IN  NUMBER, p_user_dim2_fk_key IN  NUMBER,
2781 p_user_dim3_fk_key IN  NUMBER,p_user_dim4_fk_key IN  NUMBER, p_user_dim5_fk_key IN  NUMBER,
2782 p_user_attr1 IN  VARCHAR2,p_user_attr2 IN  VARCHAR2, p_user_attr3 IN  VARCHAR2,
2783 p_user_attr4 IN  VARCHAR2,p_user_attr5 IN  VARCHAR2, p_user_measure1 IN  NUMBER,
2784 p_user_measure2 IN  NUMBER,p_user_measure3 IN  NUMBER, p_user_measure4 IN  NUMBER,
2785 p_user_measure5 IN  NUMBER ,p_hour_fk_key IN NUMBER,p_hour_fk IN VARCHAR2,p_hour_to_time IN DATE) IS
2786 
2787 --initialize variables here
2788 v_unassigned_string VARCHAR2(20) := to_char(mth_util_pkg.mth_ua_get_val);
2789 v_count NUMBER;
2790 v_next_hour_from_time DATE;
2791 v_next_hour_to_time DATE;
2792 v_next_hour_fk_key VARCHAR2(120);
2793 v_least_to_date DATE;
2794 
2795 BEGIN
2796 IF (p_hour_to_time >= p_to_date)
2797 THEN
2798 MERGE INTO  MTH_EQUIP_STATUSES stat
2799        USING (select p_equipment_fk_key p_equipment_fk_key, p_shift_workday_fk_key p_shift_workday_fk_key,
2800         p_hour_fk_key p_hour_fk_key, p_from_date p_from_date, p_to_date p_to_date, p_status p_status,
2801         p_system_fk_key p_system_fk_key,p_user_dim1_fk_key p_user_dim1_fk_key,
2802         p_user_dim2_fk_key p_user_dim2_fk_key, p_user_dim3_fk_key p_user_dim3_fk_key,
2803         p_user_dim4_fk_key p_user_dim4_fk_key, p_user_dim5_fk_key p_user_dim5_fk_key,
2804         p_user_attr1 p_user_attr1,p_user_attr2 p_user_attr2, p_user_attr3 p_user_attr3,
2805         p_user_attr4 p_user_attr4, p_user_attr5 p_user_attr5, p_user_measure1 p_user_measure1,
2806         p_user_measure2 p_user_measure2, p_user_measure3 p_user_measure3,
2807         p_user_measure4 p_user_measure4, p_user_measure5 p_user_measure5 FROM dual) var
2808                ON  (stat.equipment_fk_key = var.p_equipment_fk_key AND
2809                stat.shift_workday_fk_key = var.p_shift_workday_fk_key AND
2810                stat.hour_fk_key = var.p_hour_fk_key AND
2811                stat.from_date = var.p_from_date)
2812      WHEN MATCHED THEN
2813          UPDATE SET To_Date = p_to_date, status = p_status, system_fk_key = Nvl(p_system_fk_key,v_unassigned_string),
2814                  user_dim1_fk_key = p_user_dim1_fk_key, user_dim2_fk_key = p_user_dim2_fk_key,
2815                  user_dim3_fk_key = p_user_dim3_fk_key, user_dim4_fk_key = p_user_dim4_fk_key,
2816                  user_dim5_fk_key = p_user_dim1_fk_key, user_attr1 = p_user_attr1,user_attr2 =p_user_attr2,
2817                  user_attr3 = p_user_attr3, user_attr4 = p_user_attr4, user_attr5 = p_user_attr5,
2818                  user_measure1 = p_user_measure1, user_measure2 = p_user_measure2,
2822      WHEN NOT MATCHED THEN
2819                  user_measure3 = p_user_measure3, user_measure4 = p_user_measure4,
2820                  user_measure5 = p_user_measure5, last_update_date = SYSDATE,last_update_system_id =p_system_fk_key
2821 
2823          INSERT (stat.EQUIPMENT_FK_KEY, stat.SHIFT_WORKDAY_FK_KEY, stat.FROM_DATE, stat.TO_DATE,
2824          stat.STATUS, stat.SYSTEM_FK_KEY, stat.USER_DIM1_FK_KEY, stat.USER_DIM2_FK_KEY, stat.USER_DIM3_FK_KEY,
2825          stat.USER_DIM4_FK_KEY, stat.USER_DIM5_FK_KEY, stat.USER_ATTR1, stat.USER_ATTR2, stat.USER_ATTR3,
2826          stat.USER_ATTR4, stat.USER_ATTR5, stat.USER_MEASURE1, stat.USER_MEASURE2, stat.USER_MEASURE3,
2827          stat.USER_MEASURE4, stat.USER_MEASURE5, stat.CREATION_DATE, stat.LAST_UPDATE_DATE, stat.CREATION_SYSTEM_ID,
2828          stat.LAST_UPDATE_SYSTEM_ID, stat.CREATED_BY, stat.LAST_UPDATE_LOGIN, stat.LAST_UPDATED_BY,
2829          stat.EXPECTED_UP_TIME, stat.STATUS_TYPE, stat.HOUR_FK_KEY)
2830              VALUES (p_equipment_fk_key, p_shift_workday_fk_key, p_from_date, p_to_date, p_status,
2831              Nvl(p_system_fk_key,v_unassigned_string),
2832 p_user_dim1_fk_key, p_user_dim2_fk_key, p_user_dim3_fk_key, p_user_dim4_fk_key, p_user_dim5_fk_key, p_user_attr1,
2833 p_user_attr2, p_user_attr3, p_user_attr4, p_user_attr5, p_user_measure1, p_user_measure2, p_user_measure3,
2834 p_user_measure4, p_user_measure5,SYSDATE,SYSDATE,Nvl(p_system_fk_key,v_unassigned_string),
2835 Nvl(p_system_fk_key,v_unassigned_string),NULL,NULL,NULL,NULL,NULL,p_hour_fk_key);
2836 
2837 ELSE
2838 
2839   MERGE INTO  MTH_EQUIP_STATUSES stat
2840        USING (select p_equipment_fk_key p_equipment_fk_key, p_shift_workday_fk_key p_shift_workday_fk_key,
2841        p_hour_fk_key p_hour_fk_key, p_from_date p_from_date, p_to_date p_to_date, p_status p_status,
2842        p_system_fk_key p_system_fk_key,p_user_dim1_fk_key p_user_dim1_fk_key,
2843        p_user_dim2_fk_key p_user_dim2_fk_key, p_user_dim3_fk_key p_user_dim3_fk_key,
2844        p_user_dim4_fk_key p_user_dim4_fk_key, p_user_dim5_fk_key p_user_dim5_fk_key,p_user_attr1 p_user_attr1,
2845        p_user_attr2 p_user_attr2, p_user_attr3 p_user_attr3, p_user_attr4 p_user_attr4,
2846        p_user_attr5 p_user_attr5, p_user_measure1 p_user_measure1, p_user_measure2 p_user_measure2,
2847        p_user_measure3 p_user_measure3,p_user_measure4 p_user_measure4, p_user_measure5 p_user_measure5 FROM dual) var
2848                ON  (stat.equipment_fk_key = var.p_equipment_fk_key AND
2849                stat.shift_workday_fk_key = var.p_shift_workday_fk_key AND
2850                stat.hour_fk_key = var.p_hour_fk_key AND
2851                stat.from_date = var.p_from_date)
2852      WHEN MATCHED THEN
2853          UPDATE SET To_Date = p_hour_to_time, status = p_status, system_fk_key = Nvl(p_system_fk_key,v_unassigned_string),
2854                  user_dim1_fk_key = p_user_dim1_fk_key, user_dim2_fk_key = p_user_dim2_fk_key,
2855                  user_dim3_fk_key = p_user_dim3_fk_key, user_dim4_fk_key = p_user_dim4_fk_key,
2856                  user_dim5_fk_key = p_user_dim1_fk_key, user_attr1 = p_user_attr1,user_attr2 =p_user_attr2,
2857                  user_attr3 = p_user_attr3, user_attr4 = p_user_attr4, user_attr5 = p_user_attr5,
2858                  user_measure1 = p_user_measure1, user_measure2 = p_user_measure2,
2859                  user_measure3 = p_user_measure3, user_measure4 = p_user_measure4,
2860                  user_measure5 = p_user_measure5, last_update_date = SYSDATE,last_update_system_id =p_system_fk_key
2861 
2862      WHEN NOT MATCHED THEN
2863          INSERT (stat.EQUIPMENT_FK_KEY, stat.SHIFT_WORKDAY_FK_KEY, stat.FROM_DATE, stat.TO_DATE,
2864          stat.STATUS, stat.SYSTEM_FK_KEY, stat.USER_DIM1_FK_KEY, stat.USER_DIM2_FK_KEY, stat.USER_DIM3_FK_KEY,
2865          stat.USER_DIM4_FK_KEY, stat.USER_DIM5_FK_KEY, stat.USER_ATTR1, stat.USER_ATTR2, stat.USER_ATTR3,
2866          stat.USER_ATTR4, stat.USER_ATTR5, stat.USER_MEASURE1, stat.USER_MEASURE2, stat.USER_MEASURE3,
2867          stat.USER_MEASURE4, stat.USER_MEASURE5, stat.CREATION_DATE, stat.LAST_UPDATE_DATE, stat.CREATION_SYSTEM_ID,
2868          stat.LAST_UPDATE_SYSTEM_ID, stat.CREATED_BY, stat.LAST_UPDATE_LOGIN, stat.LAST_UPDATED_BY,
2869          stat.EXPECTED_UP_TIME, stat.STATUS_TYPE, stat.HOUR_FK_KEY)
2870              VALUES (p_equipment_fk_key, p_shift_workday_fk_key, p_from_date, p_hour_to_time, p_status,
2871              Nvl(p_system_fk_key,v_unassigned_string),
2872 p_user_dim1_fk_key, p_user_dim2_fk_key, p_user_dim3_fk_key, p_user_dim4_fk_key, p_user_dim5_fk_key, p_user_attr1,
2873 p_user_attr2, p_user_attr3, p_user_attr4, p_user_attr5, p_user_measure1, p_user_measure2, p_user_measure3,
2874 p_user_measure4, p_user_measure5,SYSDATE,SYSDATE,Nvl(p_system_fk_key,v_unassigned_string),
2875 Nvl(p_system_fk_key,v_unassigned_string),NULL,NULL,NULL,NULL,NULL,p_hour_fk_key);
2876 
2877 SELECT FLOOR((p_to_date -p_hour_to_time)*24) INTO v_count FROM DUAL;
2878 
2879 FOR i IN 1..v_count+1 LOOP
2880 
2881 SELECT LEAD_HOUR,LEAD_FROM_DATE,LEAD_TO_DATE, LEAST(p_to_date, LEAD_TO_DATE)
2882 INTO v_next_hour_fk_key, v_next_hour_from_time, v_next_hour_to_time, v_least_to_date
2883 FROM(
2884 SELECT HOUR_PK,LEAD( HOUR_PK_KEY ,i) OVER(ORDER BY FROM_TIME  ) LEAD_HOUR, LEAD( FROM_TIME,i) OVER(ORDER BY FROM_TIME  ) LEAD_FROM_DATE,
2885 LEAD( TO_TIME ,i) OVER(ORDER BY FROM_TIME) LEAD_TO_DATE FROM MTH_HOUR_D)
2886 WHERE HOUR_PK = p_hour_fk;
2887 
2888 IF (v_next_hour_from_time <= v_least_to_date)
2889 THEN
2890 MERGE INTO  MTH_EQUIP_STATUSES stat
2891        USING (select p_equipment_fk_key p_equipment_fk_key, p_shift_workday_fk_key p_shift_workday_fk_key,
2892        p_hour_fk_key p_hour_fk_key, p_from_date p_from_date, p_to_date p_to_date, p_status p_status,
2893        p_system_fk_key p_system_fk_key,p_user_dim1_fk_key p_user_dim1_fk_key,
2894        p_user_dim2_fk_key p_user_dim2_fk_key, p_user_dim3_fk_key p_user_dim3_fk_key,
2895        p_user_dim4_fk_key p_user_dim4_fk_key, p_user_dim5_fk_key p_user_dim5_fk_key,
2896        p_user_attr1 p_user_attr1,p_user_attr2 p_user_attr2, p_user_attr3 p_user_attr3,
2897        p_user_attr4 p_user_attr4, p_user_attr5 p_user_attr5, p_user_measure1 p_user_measure1,
2898        p_user_measure2 p_user_measure2, p_user_measure3 p_user_measure3,p_user_measure4 p_user_measure4,
2902                stat.shift_workday_fk_key = var.p_shift_workday_fk_key AND
2899        p_user_measure5 p_user_measure5,v_next_hour_fk_key v_next_hour_fk_key,
2900        v_next_hour_from_time v_next_hour_from_time,v_next_hour_to_time v_next_hour_to_time FROM dual) var
2901                ON  (stat.equipment_fk_key = var.p_equipment_fk_key AND
2903                stat.hour_fk_key = var.v_next_hour_fk_key AND
2904                stat.from_date = var.v_next_hour_from_time)
2905      WHEN MATCHED THEN
2906          UPDATE SET To_Date = least(p_to_date,v_next_hour_to_time), status = p_status,
2907          system_fk_key = Nvl(p_system_fk_key,v_unassigned_string),
2908                  user_dim1_fk_key = p_user_dim1_fk_key, user_dim2_fk_key = p_user_dim2_fk_key,
2909                  user_dim3_fk_key = p_user_dim3_fk_key, user_dim4_fk_key = p_user_dim4_fk_key,
2910                  user_dim5_fk_key = p_user_dim1_fk_key, user_attr1 = p_user_attr1,user_attr2 =p_user_attr2,
2911                  user_attr3 = p_user_attr3, user_attr4 = p_user_attr4, user_attr5 = p_user_attr5,
2912                  user_measure1 = p_user_measure1, user_measure2 = p_user_measure2,
2913                  user_measure3 = p_user_measure3, user_measure4 = p_user_measure4,
2914                  user_measure5 = p_user_measure5, last_update_date = SYSDATE,last_update_system_id =p_system_fk_key
2915 
2916      WHEN NOT MATCHED THEN
2917          INSERT (stat.EQUIPMENT_FK_KEY, stat.SHIFT_WORKDAY_FK_KEY, stat.FROM_DATE, stat.TO_DATE,
2918          stat.STATUS, stat.SYSTEM_FK_KEY, stat.USER_DIM1_FK_KEY, stat.USER_DIM2_FK_KEY, stat.USER_DIM3_FK_KEY,
2919          stat.USER_DIM4_FK_KEY, stat.USER_DIM5_FK_KEY, stat.USER_ATTR1, stat.USER_ATTR2, stat.USER_ATTR3,
2920          stat.USER_ATTR4, stat.USER_ATTR5, stat.USER_MEASURE1, stat.USER_MEASURE2, stat.USER_MEASURE3,
2921          stat.USER_MEASURE4, stat.USER_MEASURE5, stat.CREATION_DATE, stat.LAST_UPDATE_DATE, stat.CREATION_SYSTEM_ID,
2922          stat.LAST_UPDATE_SYSTEM_ID, stat.CREATED_BY, stat.LAST_UPDATE_LOGIN, stat.LAST_UPDATED_BY,
2923          stat.EXPECTED_UP_TIME, stat.STATUS_TYPE, stat.HOUR_FK_KEY)
2924              VALUES (p_equipment_fk_key, p_shift_workday_fk_key, v_next_hour_from_time,
2925              least(p_to_date,v_next_hour_to_time), p_status,Nvl(p_system_fk_key,v_unassigned_string),
2926 p_user_dim1_fk_key, p_user_dim2_fk_key, p_user_dim3_fk_key, p_user_dim4_fk_key, p_user_dim5_fk_key, p_user_attr1,
2927 p_user_attr2, p_user_attr3, p_user_attr4, p_user_attr5, p_user_measure1, p_user_measure2, p_user_measure3,
2928 p_user_measure4, p_user_measure5,SYSDATE,SYSDATE,Nvl(p_system_fk_key,v_unassigned_string),
2929 Nvl(p_system_fk_key,v_unassigned_string),NULL,NULL,NULL,NULL,NULL,v_next_hour_fk_key);
2930 
2931 END IF;
2932 END LOOP;
2933 COMMIT;
2934 END IF;
2935 COMMIT;
2936 END MTH_LOAD_HOUR_STATUS;
2937 
2938 
2939 
2940 /* ****************************************************************************
2941 * Procedure		:GENERATE_SHIFTS	                              *
2942 * Description 	 	:This procedure generates the shifts in workday shifts  *
2943 *                  and  equipment shifts table *
2944 * File Name	 	:MTHUTILB.PLS	             		      *
2945 * Visibility		:Public
2946 * Modification log	:						      *
2947 *	Author Date Change: amrit Kaur	04-Dec-2009	Initial Creation      *
2948 *                       Mandar Gijare 20-Dec-2010 Shift MED modification *
2949 ******************************************************************************/
2950 
2951 
2952 PROCEDURE GENERATE_SHIFTS( p_plant_fk_key IN NUMBER,
2953                                 p_start_date IN DATE,
2954                                   p_end_date IN DATE,
2955                                   p_comp_state OUT NOCOPY VARCHAR2)
2956 IS
2957 --local variable declation
2958 
2959 l_plant_fk_key NUMBER ;
2960 l_sysdate DATE := sysdate;--variable for sysdate
2961 l_last_update_system_id NUMBER ;
2962 l_last_update_date DATE ;
2963 l_plant_pk VARCHAR2(120);
2964 l_start_time varchar2(8);--variable for storing start time
2965 l_end_time VARCHAR2(8);--variable for storing end_time
2966 l_graveyard VARCHAR2(30);
2967 l_shift_num  number;
2968 l_shift_name VARCHAR2(240);
2969 l_line_num NUMBER ;
2970 l_start_date DATE ;
2971 l_end_date DATE ;
2972 l_start_time1 NUMBER;
2973 l_end_time1 NUMBER;
2974 l_equipment_fk_key NUMBER ;
2975 l1_plant_fk_key NUMBER ;
2976     N NUMBER:=0;
2977     l_creation_system_id NUMBER;
2978     --l_organization_code VARCHAR2(120);
2979      l_system_fk_key NUMBER;
2980     l_site_id NUMBER ;
2981     l_entity_pk_key NUMBER ;
2982     l_entity_name     VARCHAR2(100);
2983     l_entity_type     VARCHAR2(30);
2984     l_production_entity  VARCHAR2(1);
2985     l_shift_workday_pk_key NUMBER ;
2986     l1_shift_date DATE ;
2987     l_from_date DATE ;
2988     l_to_date DATE ;
2989     l_shift_type VARCHAR2(30);
2990     l_comp_state VARCHAR2(50);
2991     l_sh_start_date DATE;
2992    -- l_graveyard_shift NUMBER;
2993   CURSOR c_shift_def IS
2994 
2995     select start_time ,end_time ,graveyard ,shift_num , shift_name,shift_type
2996 -- into  l_start_time, l_end_time, l_graveyard, l_shift_num,l_line_num,l_shift_name,l_shift_type
2997  from
2998 
2999 mth_site_shift_definitions where plant_fk_key=p_plant_fk_key;
3000 
3001   CURSOR c_shift_date(p_plant_key NUMBER)
3002   IS
3003   SELECT shift_date
3004     FROM mth_shift_reference_mv
3005    WHERE PLANT_FK_KEY = p_plant_key;
3006 
3007   CURSOR c_check_compile_state
3008   IS
3009   SELECT compile_state
3010     FROM user_mviews
3011    WHERE mview_name = 'MTH_SHIFT_REFERENCE_MV';
3012 
3013 BEGIN
3014 
3015 
3016 
3017 DBMS_MVIEW.REFRESH('MTH_SHIFT_REFERENCE_MV','C');
3018 
3019 	OPEN c_check_compile_state;
3020 	FETCH c_check_compile_state INTO l_comp_state;
3021 	CLOSE c_check_compile_state;
3025 IF(l_comp_state = 'VALID')
3022 
3023 p_comp_state := l_comp_state;
3024 
3026 THEN
3027 	l_plant_fk_key := p_plant_fk_key;
3028 
3029 	FOR cur_shift_date in c_shift_date(l_plant_fk_key)
3030 	LOOP
3031 	   l_sh_start_date := cur_shift_date.shift_date;
3032 	END LOOP;
3033 
3034 	IF(l_sh_start_date > p_start_date)
3035 	THEN
3036 		l_start_date := l_sh_start_date+1;
3037 	ELSE
3038 		l_start_date := p_start_date;
3039 	END IF;
3040 	l_end_date := p_end_date;
3041 	l_system_fk_key := "MTH_UTIL_PKG"."MTH_UA_GET_VAL"();
3042 
3043 	IF (l_end_date > l_start_date)
3044 	THEN
3045 		--DELETE FROM mth_workday_shifts_D WHERE plant_fk_key = l_plant_fk_key and shift_date>=l_start_date ;
3046 		DELETE FROM mth_workday_shifts_D WHERE plant_fk_key = l_plant_fk_key and Trunc(from_date)>=l_start_date AND Trunc(from_date)<=l_end_date;
3047 		DELETE FROM mth_workday_shifts_D WHERE plant_fk_key = l_plant_fk_key and shift_date>=l_start_date AND shift_date<=l_end_date;
3048 		DELETE FROM mth_equipment_shifts_d WHERE availability_date>=l_start_date AND availability_date<=l_end_date
3049 		AND equipment_fk_key IN (SELECT DISTINCT(Nvl(a.equipment_fk_key,0))
3050 		 FROM mth_equipment_shifts_d a,mth_equipments_d b WHERE b.equipment_pk_key=a.equipment_fk_key AND b.plant_fk_key =l_plant_fk_key
3051 		 UNION ALL
3052 		SELECT distinct(Nvl(a.equipment_fk_key,0) )
3053 		 FROM mth_equipment_shifts_d a,mth_resources_d b WHERE b.resource_pk_key=a.equipment_fk_key AND b.plant_fk_key =l_plant_fk_key
3054 
3055 		UNION ALL
3056 		SELECT distinct(Nvl(a.equipment_fk_key,0) )
3057 		 FROM mth_equipment_shifts_d a,mth_plants_d b WHERE b.plant_pk_key=a.equipment_fk_key AND b.plant_pk_key =l_plant_fk_key
3058 
3059 		 UNION ALL
3060 		SELECT distinct(Nvl(a.equipment_fk_key,0) )
3061 		 FROM mth_equipment_shifts_d a,mth_equip_entities_mst b WHERE b.entity_pk_key=a.equipment_fk_key AND b.plant_fk_key =l_plant_fk_key
3062 		);
3063 
3064 		  FOR l_shift_def IN c_shift_def
3065 		  LOOP
3066 
3067 		    l_start_time := l_shift_def.start_time;
3068 		     l_end_time   := l_shift_def.end_time;
3069 		      l_graveyard  := l_shift_def.graveyard;
3070 		       l_shift_num  := l_shift_def.shift_num;
3071 		      -- l_line_num    := l_shift_def.line_num;
3072 		       l_shift_name   := l_shift_def.shift_name;
3073 		 l_shift_type     := l_shift_def.shift_type;
3074 
3075 
3076 
3077 		select plant_pk into l_plant_pk  from mth_plants_d where plant_pk_key=l_plant_fk_key;
3078 		--SELECT organization_code  INTO l_organization_code FROM mth_organizations_l WHERE plant_fk_key =
3079 		--l_plant_fk_key;
3080 		N := l_end_date-l_start_date;
3081 
3082 		for i IN 1.. N+1
3083 		 LOOP
3084 
3085 
3086 
3087 		  l_last_update_system_id := -99999;
3088 		  l_last_update_date := l_sysdate;
3089 			l_creation_system_id := -1;
3090 		  l_start_time1 := TO_NUMBER(SUBSTR(l_start_time,1,2))*3600+
3091 		                        TO_NUMBER(SUBSTR(l_start_time,4,2))*60+
3092 		                        TO_NUMBER(SUBSTR(l_start_time,7,2));
3093 
3094 		          l_end_time1 := TO_NUMBER(SUBSTR(l_end_time,1,2))*3600+
3095 		                        TO_NUMBER(SUBSTR(l_end_time,4,2))*60+
3096 		                        TO_NUMBER(SUBSTR(l_end_time,7,2));
3097 
3098 
3099 		   INSERT INTO mth_workday_shifts_D(shift_workday_pk_key, shift_workday_pk,
3100 					shift_date,shift_date_julian,plant_fk_key,shift_type,
3101 		                        graveyard_shift,from_date,to_date, shift_num,shift_name,
3102 		                        source_org_code,system_fk_key,
3103 					creation_date,last_update_date,creation_system_id,
3104 					last_update_system_id)
3105 				      VALUES(mth_workdays_shifts_s.nextval,
3106 		                        to_char(DECODE(GREATEST( l_start_time1, l_end_time1 ) ,
3107 		                        l_start_time1 , l_start_date  ,
3108 		                        l_start_date) + ((TO_NUMBER(SUBSTR(l_start_time,1,2))+
3109 		                        (TO_NUMBER(SUBSTR(l_start_time,4,2))/60)+
3110 		                        (TO_NUMBER(SUBSTR(l_start_time,7,2))/3600))/24),
3111 		                        'yyyymmdd-hh24:mi:ss')||'-'||l_shift_num||'-'||l_plant_pk,
3112 		                        DECODE(GREATEST( l_start_time1, l_end_time1 ) , l_start_time1 ,
3113 		                        l_start_date  +  Decode( l_shift_def.graveyard, 'SED',1,0) , l_start_date)  ,
3114 		                        TO_NUMBER(TO_CHAR( l_start_date ,'J')),
3115 		          l_plant_fk_key,l_shift_type,l_graveyard,
3116 		                        l_start_date + ((TO_NUMBER(SUBSTR(l_start_time,1,2))+
3117 		                        (TO_NUMBER(SUBSTR(l_start_time,4,2))/60)+
3118 		                        (TO_NUMBER(SUBSTR(l_start_time,7,2))/3600))/24),
3119 		         DECODE(GREATEST( l_start_time1, l_end_time1 ) , l_start_time1 ,
3120 		                        l_start_date + ((TO_NUMBER(SUBSTR(l_end_time,1,2))+
3121 		                        (TO_NUMBER(SUBSTR(l_end_time,4,2))/60)+
3122 		                        (TO_NUMBER(SUBSTR(l_end_time,7,2))/3600))/24)+  Decode( l_shift_def.graveyard, 'SED',1,1) ,
3123 		                        l_start_date + ((TO_NUMBER(SUBSTR(l_end_time,1,2))+
3124 		                        (TO_NUMBER(SUBSTR(l_end_time,4,2))/60)+
3125 		                        (TO_NUMBER(SUBSTR(l_end_time,7,2))/3600))/24)),
3126 		                        l_shift_num,l_shift_name,null, l_system_fk_key,
3127 					l_sysdate,			l_sysdate,
3128 		                        l_creation_system_id,l_last_update_system_id);
3129 		        l_start_date := l_start_date+1;
3130 
3131 
3132 		END LOOP;
3133 		  COMMIT;
3134 
3135 		IF(l_sh_start_date > p_start_date)
3136 		THEN
3137 			l_start_date := l_sh_start_date+1;
3138 		ELSE
3139 			l_start_date := p_start_date;
3140 		END IF;
3141 
3142 
3143 		IF UPPER(l_shift_type)='BOTH'   THEN
3147 		SELECT b.entity_pk_key entity_pk_key,a.shift_date shift_date,a.shift_workday_pk_key shift_workday_fk_key,a.from_date from_date,a.to_date To_Date,1 line_num,'Y',
3144 		  INSERT INTO  mth_equipment_shifts_d(equipment_fk_key,availability_date,shift_workday_fk_key,from_date,To_Date,line_num,availability_flag,entity_type,creation_date,last_update_date,creation_system_id,
3145 					last_update_system_id)        (
3146 
3148 		b.entity_type entity_type,SYSDATE,SYSDATE,-1,-99999
3149 
3150 		 --INTO l_site_id,l_entity_pk_key,l_entity_name,l_entity_type,l_production_entity,
3151 		 --l_shift_workday_pk_key,l1_shift_date,l_from_date,l_to_date
3152 		  FROM   mth_workday_shifts_d a ,
3153 		(
3154 		   SELECT plant_fk_key site_id, entity_pk_key, entity_name, entity_type, production_entity production_entity
3155 		   FROM mth_equip_entities_mst
3156 		   UNION ALL
3157 		   SELECT plant_pk_key site_id, plant_pk_key entity_pk_key, plant_name entity_name, 'SITE', production_site production_entity
3158 		   FROM mth_plants_d
3159 		   UNION ALL
3160 		   SELECT plant_fk_key site_id, resource_pk_key entity_pk_key, resource_name entity_name, 'RESOURCE', production_resource production_entity
3161 		   FROM mth_resources_d
3162 		   UNION ALL
3163 		   SELECT plant_fk_key site_id, equipment_pk_key entity_pk_key, equipment_name entity_name, 'EQUIPMENT', production_equipment production_entity
3164 		   FROM mth_equipments_d
3165 		)b
3166 		WHERE b.site_id = a.plant_fk_key
3167 		AND a.plant_fk_key=l_plant_fk_key
3168 		AND shift_date>=l_start_date
3169 		AND shift_date<=l_end_date
3170 		AND UPPER(a.shift_type)='BOTH'
3171 		--AND a.line_num=l_line_num
3172 		AND a.shift_num=l_shift_num
3173 		AND a.shift_name=l_shift_name
3174 		AND l_shift_def.start_time=To_Char(from_date,'HH24:MI:SS')
3175 		AND l_shift_def.end_time=To_Char(To_Date,'HH24:MI:SS'));
3176 
3177 		END IF;
3178 		  IF UPPER(l_shift_type)='PROD-SHIFT'   THEN
3179 		  INSERT INTO  mth_equipment_shifts_d(equipment_fk_key,availability_date,shift_workday_fk_key,from_date,To_Date,line_num,availability_flag,entity_type,creation_date,last_update_date,creation_system_id,
3180 					last_update_system_id)        (
3181 
3182 		SELECT b.entity_pk_key entity_pk_key,a.shift_date shift_date,a.shift_workday_pk_key shift_workday_fk_key,a.from_date from_date,a.to_date To_Date,1 line_num,'Y',
3183 		b.entity_type entity_type,SYSDATE,SYSDATE,-1,-99999
3184 
3185 		 --INTO l_site_id,l_entity_pk_key,l_entity_name,l_entity_type,l_production_entity,
3186 		 --l_shift_workday_pk_key,l1_shift_date,l_from_date,l_to_date
3187 		  FROM   mth_workday_shifts_d a ,
3188 		(
3189 		   SELECT plant_fk_key site_id, entity_pk_key, entity_name, entity_type, production_entity production_entity
3190 		   FROM mth_equip_entities_mst
3191 		   UNION ALL
3192 		   SELECT plant_pk_key site_id, plant_pk_key entity_pk_key, plant_name entity_name, 'SITE', production_site production_entity
3193 		   FROM mth_plants_d
3194 		   UNION ALL
3195 		   SELECT plant_fk_key site_id, resource_pk_key entity_pk_key, resource_name entity_name, 'RESOURCE', production_resource production_entity
3196 		   FROM mth_resources_d
3197 		   UNION ALL
3198 		   SELECT plant_fk_key site_id, equipment_pk_key entity_pk_key, equipment_name entity_name, 'EQUIPMENT', production_equipment production_entity
3199 		   FROM mth_equipments_d
3200 		)b
3201 		WHERE b.site_id = a.plant_fk_key
3202 		AND a.plant_fk_key=l_plant_fk_key
3203 		AND shift_date>=l_start_date
3204 		AND shift_date<=l_end_date
3205 		AND b.production_entity='Y'
3206 		AND UPPER(a.shift_type)='PROD-SHIFT'
3207 		--AND a.line_num=l_line_num
3208 		AND a.shift_num=l_shift_num
3209 		AND a.shift_name=l_shift_name
3210 		AND l_shift_def.start_time=To_Char(from_date,'HH24:MI:SS')
3211 		AND l_shift_def.end_time=To_Char(To_Date,'HH24:MI:SS'));
3212 
3213 		END IF;
3214 		   IF UPPER(l_shift_type)='NON-PROD-SHIFT'   THEN
3215 		  INSERT INTO  mth_equipment_shifts_d(equipment_fk_key,availability_date,shift_workday_fk_key,from_date,To_Date,line_num,availability_flag,entity_type,creation_date,last_update_date,creation_system_id,
3216 					last_update_system_id)        (
3217 
3218 		SELECT b.entity_pk_key entity_pk_key,a.shift_date shift_date,a.shift_workday_pk_key shift_workday_fk_key,a.from_date from_date,a.to_date To_Date,1 line_num,'Y',
3219 		b.entity_type entity_type,SYSDATE,SYSDATE,-1,-99999
3220 
3221 		 --INTO l_site_id,l_entity_pk_key,l_entity_name,l_entity_type,l_production_entity,
3222 		 --l_shift_workday_pk_key,l1_shift_date,l_from_date,l_to_date
3223 		  FROM   mth_workday_shifts_d a ,
3224 		(
3225 		   SELECT plant_fk_key site_id, entity_pk_key, entity_name, entity_type, production_entity production_entity
3226 		   FROM mth_equip_entities_mst
3227 		   UNION ALL
3228 		   SELECT plant_pk_key site_id, plant_pk_key entity_pk_key, plant_name entity_name, 'SITE', production_site production_entity
3229 		   FROM mth_plants_d
3230 		   UNION ALL
3231 		   SELECT plant_fk_key site_id, resource_pk_key entity_pk_key, resource_name entity_name, 'RESOURCE', production_resource production_entity
3232 		   FROM mth_resources_d
3233 		   UNION ALL
3234 		   SELECT plant_fk_key site_id, equipment_pk_key entity_pk_key, equipment_name entity_name, 'EQUIPMENT', production_equipment production_entity
3235 		   FROM mth_equipments_d
3236 		)b
3237 		WHERE b.site_id = a.plant_fk_key
3238 		AND a.plant_fk_key=l_plant_fk_key
3239 		AND shift_date>=l_start_date
3240 		AND shift_date<=l_end_date
3241 		AND b.production_entity='N'
3242 		AND UPPER(a.shift_type)='NON-PROD-SHIFT'
3243 		--AND a.line_num=l_line_num
3244 		AND a.shift_num=l_shift_num
3245 		AND a.shift_name=l_shift_name
3246 		AND l_shift_def.start_time=To_Char(from_date,'HH24:MI:SS')
3247 		AND l_shift_def.end_time=To_Char(To_Date,'HH24:MI:SS'));
3248 
3249 		END IF;
3250 
3251 		COMMIT;
3252 		END LOOP;
3253 
3254 		    IF(l_sh_start_date > p_start_date)
3255 			THEN
3256 				l_start_date := l_sh_start_date+1;
3257 			ELSE
3258 				l_start_date := p_start_date;
3259 			END IF;
3260 
3261 		   for i IN 1.. N+1
3262 		 LOOP
3263 
3264 
3265 		  l_last_update_system_id := -99999;
3266 		  l_last_update_date := l_sysdate;
3267 			l_creation_system_id := -1;
3268 
3269 		   INSERT INTO mth_workday_shifts_D(shift_workday_pk_key, shift_workday_pk,
3270 					shift_date,shift_date_julian,plant_fk_key,shift_type,graveyard_shift,from_date,to_date, shift_num,shift_name,source_org_code,system_fk_key,
3271 					creation_date,last_update_date,creation_system_id,
3272 					last_update_system_id)
3273 				      VALUES(mth_workdays_shifts_s.nextval,TO_CHAR(l_start_date,'yyyymmdd-hh24:mi:ss')||'-'||l_plant_pk|| "MTH_UTIL_PKG"."MTH_UA_GET_VAL"(),l_start_date ,TO_NUMBER(TO_CHAR( l_start_date ,'J')),
3274 		          l_plant_fk_key,'BOTH',null,null,
3275 		         null,null,FND_PROFILE.VALUE('MTH_CATCH_ALL_NAME'),null, l_system_fk_key,
3276 					l_sysdate,			l_sysdate,l_creation_system_id,l_last_update_system_id);
3277 		        l_start_date := l_start_date+1;
3278 
3279 
3280 		END LOOP;
3281 		  COMMIT;
3282 		      IF(l_sh_start_date > p_start_date)
3283 		THEN
3284 			l_start_date := l_sh_start_date+1;
3285 		ELSE
3286 			l_start_date := p_start_date;
3287 		END IF;
3288 
3289 		  INSERT INTO  mth_equipment_shifts_d(equipment_fk_key,availability_date,shift_workday_fk_key,from_date,To_Date,line_num,availability_flag,entity_type,creation_date,last_update_date,creation_system_id,
3290 					last_update_system_id)        (
3291 
3292 		SELECT b.entity_pk_key entity_pk_key,a.shift_date shift_date,a.shift_workday_pk_key shift_workday_fk_key,null,null,1 line_num,'Y',
3293 		b.entity_type entity_type,SYSDATE,SYSDATE,-1,-99999
3294 
3295 		 --INTO l_site_id,l_entity_pk_key,l_entity_name,l_entity_type,l_production_entity,
3296 		 --l_shift_workday_pk_key,l1_shift_date,l_from_date,l_to_date
3297 		  FROM   mth_workday_shifts_d a ,
3298 		(
3299 		   SELECT plant_fk_key site_id, entity_pk_key, entity_name, entity_type, production_entity production_entity
3300 		   FROM mth_equip_entities_mst
3301 		   UNION ALL
3302 		   SELECT plant_pk_key site_id, plant_pk_key entity_pk_key, plant_name entity_name, 'SITE', production_site production_entity
3303 		   FROM mth_plants_d
3304 		   UNION ALL
3305 		   SELECT plant_fk_key site_id, resource_pk_key entity_pk_key, resource_name entity_name, 'RESOURCE', production_resource production_entity
3306 		   FROM mth_resources_d
3307 		   UNION ALL
3308 		   SELECT plant_fk_key site_id, equipment_pk_key entity_pk_key, equipment_name entity_name, 'EQUIPMENT', production_equipment production_entity
3309 		   FROM mth_equipments_d
3310 		)b
3311 		WHERE b.site_id = a.plant_fk_key
3312 		AND a.plant_fk_key=l_plant_fk_key
3313 		AND shift_date>=l_start_date
3314 		AND shift_date<=l_end_date
3315 		AND UPPER(a.shift_type)='BOTH'
3316 		AND a.FROM_DATE IS NULL
3317 		AND a .To_Date IS NULL
3318 		--AND a.line_num=NULL
3319 		AND a.shift_num IS NULL
3320 		 );
3321 		END IF;
3322 END IF;
3323 
3324 --handle exceptions
3325 --EXCEPTION
3326  --  WHEN NO_DATA_FOUND THEN
3327  --  RAISE_APPLICATION_ERROR (-20001,
3328     --    'Exception has occured');
3329 
3330 END GENERATE_SHIFTS;
3331 
3332 
3333 
3334 /* ****************************************************************************
3335 * Function    		:get_incremental_tag_data                                      *
3336 * Description 	 	:Insert the error row into the error with the error code    *
3337 * File Name             :MTHSUSAB.PLS                                         *
3338 * Visibility            :Private                                              *
3339 * Parameters            :p_tag_value -  tag value                             *
3340 *                        p_is_number -  1 if tag value is number; 0 otherwise *
3341 *                        p_is_cumulative -  1 to apply incremental logic;     *
3342 *                                           0 otherwise                       *
3343 *                        p_is_assending -  1 if tag is assending order;       *
3344 *                                           0 otherwise                       *
3345 *                        p_initial_value -  Tag initial value                 *
3349 *                          be applied; return p_tag_value otherwise           *
3346 *                        p_max_reset_value -                                  *
3347 *                        p_prev_tag_value -  Previous tag value               *
3348 * Return Value          :Incremental value if incremental logic needs to be   *
3350 **************************************************************************** */
3351 
3352 FUNCTION get_incremental_tag_data(P_TAG_VALUE IN VARCHAR2,
3353                                P_IS_NUMBER IN NUMBER,
3354                                P_IS_CUMULATIVE IN NUMBER,
3355                                P_IS_ASSENDING IN NUMBER,
3356                                P_INITIAL_VALUE IN NUMBER,
3357                                P_MAX_RESET_VALUE IN NUMBER,
3358                                p_prev_tag_value IN VARCHAR2)  RETURN VARCHAR2
3359 IS
3360   v_incr_value VARCHAR2(255);
3361 BEGIN
3362   -- 1. Do not need to apply the incremental logic
3363   IF (P_IS_NUMBER IS NULL OR P_IS_NUMBER <> 1 OR
3364       P_IS_CUMULATIVE IS NULL OR P_IS_CUMULATIVE <> 1) THEN
3365     v_incr_value := P_TAG_VALUE;
3366   ELSIF (P_IS_CUMULATIVE = 1 AND  P_IS_ASSENDING = 1 AND
3367          p_prev_tag_value IS NOT NULL) THEN
3368     -- 2. Assending tag and it is not the first reding
3369     -- 2.1 not reset
3370     v_incr_value := CASE WHEN To_Number(P_TAG_VALUE) >= To_Number(p_prev_tag_value)
3371                          THEN P_TAG_VALUE - p_prev_tag_value
3372                          -- 2.2 after reset
3373                          ELSE P_MAX_RESET_VALUE - p_prev_tag_value +
3374                               P_TAG_VALUE
3375                     END;
3376   ELSIF (P_IS_CUMULATIVE = 1 AND  P_IS_ASSENDING = 1 AND
3377          p_prev_tag_value IS NULL) THEN
3378     -- 3. Assending tag and it is the first reding
3379     -- 3.1 First reading
3380     v_incr_value := CASE WHEN To_Number(P_TAG_VALUE) >= To_Number(P_INITIAL_VALUE)
3381                          THEN P_TAG_VALUE - P_INITIAL_VALUE
3382                          -- 3.2 First reading but reset already
3383                          ELSE P_MAX_RESET_VALUE - P_INITIAL_VALUE + P_TAG_VALUE
3384                     END;
3385   ELSIF (P_IS_CUMULATIVE = 1 AND  P_IS_ASSENDING = 0 AND
3386          p_prev_tag_value IS NOT NULL) THEN
3387     -- 4. Descending tag and it is not the first reding
3388     -- 4.1 not reset
3389     v_incr_value := CASE WHEN To_Number(P_TAG_VALUE) <= To_Number(p_prev_tag_value)
3390                          THEN p_prev_tag_value - P_TAG_VALUE
3391                          -- 2.2 after reset
3392                          ELSE p_prev_tag_value + P_MAX_RESET_VALUE -
3393                               P_TAG_VALUE
3394                     END;
3395   ELSIF (P_IS_CUMULATIVE = 1 AND  P_IS_ASSENDING = 0 AND
3396          p_prev_tag_value IS NULL) THEN
3397     -- 5. Descending tag and it is  the first reding
3398     -- 4.1 not reset
3399     v_incr_value := CASE WHEN To_Number(P_TAG_VALUE) <= To_Number(P_INITIAL_VALUE)
3400                          THEN P_INITIAL_VALUE - P_TAG_VALUE
3401                          -- 3.2 First reading but reset already
3402                          ELSE P_INITIAL_VALUE + P_MAX_RESET_VALUE - P_TAG_VALUE
3403                     END;
3404   END IF;
3405   RETURN v_incr_value;
3406 
3407 END get_incremental_tag_data;
3408 
3409 
3410 
3411 /* ****************************************************************************
3412 * Procedure    		:update_tag_to_latest_tab                                   *
3413 * Description 	 	:Update an existing the latest reading time and tag value   *
3414 *                  for a tag if table MTH_TAG_READINGS_LATEST already   *
3415 *                  has a entry for the tag. Otherwise, insert a new row       *
3416 * File Name             :MTHUTILB.PLS                                         *
3417 * Visibility            :Private                                              *
3418 * Parameters            :p_tag_code -  tag code                               *
3419 *                        p_latest_reading_time - reading time of the latest   *
3420 *                        p_latest_tag_value -  latest tag reading             *
3421 *                        p_lookup_entry_exist - whether the entry with the    *
3422 *                            same tag code exists in the                      *
3423 *                            MTH_TAG_READINGS_LATEST or not             *
3424 * Return Value          :None                                                 *
3425 **************************************************************************** */
3426 
3427 PROCEDURE update_tag_to_latest_tab(p_tag_code IN VARCHAR2,
3428                                    p_latest_reading_time IN DATE,
3429                                    p_latest_tag_value IN VARCHAR2,
3430                                    p_lookup_entry_exist IN BOOLEAN)
3431 IS
3432 BEGIN
3433   -- If the entry exists, do the update; otherwise, do the insert
3434   IF (p_lookup_entry_exist) THEN
3435     UPDATE MTH_TAG_READINGS_LATEST
3436     SET    reading_time = p_latest_reading_time, tag_value = p_latest_tag_value
3437     WHERE  tag_code = p_tag_code;
3438   ELSE
3439     INSERT INTO MTH_TAG_READINGS_LATEST
3440            (TAG_CODE, READING_TIME, TAG_VALUE) VALUES
3441            (p_tag_code, p_latest_reading_time, p_latest_tag_value);
3442   END IF;
3443 
3444 END update_tag_to_latest_tab;
3445 
3446 
3447 /* ****************************************************************************
3448 * Function     		:MTH_IS_TAG_RAW_DATA_ROW_VALID                                *
3449 * Description 	 	:Check if the raw from MTH_TAG_READINGS_RAW is valid      *
3450 *                  or not.                                         *
3451 * File Name             :MTHUTILB.PLS                                         *
3452 * Visibility            :Private                                              *
3453 * Parameters            :p_tag_code - Tag code                                *
3454 *                        p_reading_time - Reading time                        *
3458 *                                           0 otherwise                       *
3455 *                        p_tag_value -  tag value                             *
3456 *                        p_is_number -  1 if tag value is number; 0 otherwise *
3457 *                        p_is_cumulative -  1 to apply incremental logic;     *
3459 *                        p_is_assending -  1 if tag is assending order;       *
3460 *                                           0 otherwise                       *
3461 *                        p_initial_value -  Tag initial value                 *
3462 *                        p_max_reset_value -                                  *
3463 *                        p_prev_reading_time -  reading time for the previous *
3464 *                                               tag reading                   *
3465 *    OUT parameters:     p_is_valid_timestamp - Whether the reading time      *
3466 *                        from the current entry can be used to calculate the  *
3467 *                        from time of the next reading                        *
3468 * Return Value          : Found violations of the following rules:            *
3469 *                         'NGV'  -	Usage value is negative.                  *
3470 *                         'OTR'  -	Usage value is out of range defined       *
3471 *                                   for a cumulative tag.                     *
3472 *                         'OTO'  - 	The raw reading data is out of order.     *
3473 *                         'DUP'  -	The raw reading data is duplicated.       *
3474 *                         'FTD'  -      Data in future time                   *
3475 *                          NULL  -      Valid Row                             *
3476 ***************************************************************************** */
3477 
3478 FUNCTION MTH_IS_TAG_RAW_DATA_ROW_VALID
3479          (p_tag_code IN VARCHAR2,
3480          p_mast_tag_code IN VARCHAR2,
3481           p_reading_time IN DATE,
3482           p_tag_value IN VARCHAR2,
3483           p_is_number IN NUMBER,
3484           p_is_cumulative IN NUMBER,
3485           p_is_assending IN NUMBER,
3486           p_initial_value IN NUMBER,
3487           p_max_reset_value IN NUMBER,
3488           p_prev_reading_time IN DATE,
3489           p_is_valid_timestamp OUT NOCOPY BOOLEAN) RETURN VARCHAR2
3490 IS
3491   v_err_code VARCHAR2(240) := '';
3492 BEGIN
3493 p_is_valid_timestamp := FALSE;
3494   IF (p_is_number = 1 AND p_tag_value < 0) THEN
3495     v_err_code :=  v_err_code || 'NGV ';
3496     IF p_is_cumulative = 0 THEN
3497       p_is_valid_timestamp := TRUE;
3498     END IF;
3499   END IF;
3500    IF(p_tag_value IS NULL) THEN
3501   v_err_code :=  v_err_code || 'ITD ';
3502     p_is_valid_timestamp := FALSE;
3503   END IF;
3504   IF (p_is_number = 1 AND p_is_cumulative = 1 AND
3505       p_tag_value > p_max_reset_value) THEN
3506     v_err_code :=  v_err_code || 'OTR ';
3507     p_is_valid_timestamp := FALSE;
3508   END IF;
3509   IF (p_prev_reading_time IS NOT NULL AND
3510       p_reading_time < p_prev_reading_time) THEN
3511     v_err_code :=  v_err_code || 'OTO ';
3512     p_is_valid_timestamp := FALSE;
3513   END IF;
3514   IF (p_prev_reading_time IS NOT NULL AND
3515       p_reading_time = p_prev_reading_time) THEN
3516     v_err_code :=  v_err_code || 'DUP ';
3517     p_is_valid_timestamp := FALSE;
3518   END IF;
3519   IF (p_reading_time > SYSDATE) THEN
3520     v_err_code :=  v_err_code || 'FTD ';
3521     p_is_valid_timestamp := FALSE;
3522   END IF;
3523     IF (p_mast_tag_code IS NULL) THEN
3524     v_err_code :=  v_err_code || 'MTC ';
3525     p_is_valid_timestamp := FALSE;
3526   END IF;
3527 
3528   IF (Length(v_err_code) = 0) THEN
3529     v_err_code := NULL;
3530     p_is_valid_timestamp := TRUE;
3531   END IF;
3532   RETURN v_err_code;
3533 END MTH_IS_TAG_RAW_DATA_ROW_VALID;
3534 
3535 
3536 
3537 /* ****************************************************************************
3538 * Procedure		:MTH_LOAD_TAG_RAW_TO_PROCESSED                                *
3539 * Description 	 	:Load data from  the table MTH_TAG_READINGS_RAW           *
3540 * into meter readings table MTH_TAG_READINGS_RAW_PROCESSED                    *
3541 * File Name             :MTHUTILB.PLS                                         *
3542 * Visibility            :Private                                              *
3543 * Parameters            :p_curr_partition (value of the partition column      *
3544 *                       :p_from_tz (value for from time zone )                *
3545 *                       :p_to_tz (value for to time zone )                    *
3546 **************************************************************************** */
3547 
3548 PROCEDURE MTH_LOAD_TAG_RAW_TO_PROCESSED(p_curr_partition IN NUMBER, p_from_tz IN
3549 VARCHAR2, p_to_tz IN VARCHAR2)
3550 IS
3551 
3552 --Paramters for handling time zone conversion
3553 
3554 v_from_tz VARCHAR2(255) := p_from_tz;
3555 v_to_tz VARCHAR2(255) := p_to_tz;
3556 v_date_constant CONSTANT DATE := To_Date('11/16/2010','mm/dd/yyyy');
3557 v_factor_time_zone NUMBER := 0;
3558 
3559   -- Fetch raw data for active tags from the patition
3560   -- ordered by TAG_CODE, READING_TIME
3561   CURSOR c_getRawData (p_processing_flag IN NUMBER,v_factor_time_zone IN NUMBER) IS
3562     SELECT R.TAG_CODE, T.TAG_CODE TAG_MAST_TAG_CODE,R.READING_TIME + v_factor_time_zone READING_TIME,  R.TAG_DATA,
3563            Decode(DATA_TYPE, 'NUM', 1, 0) IS_NUMBER,
3564            Decode(T.READING_TYPE, 'CHNG', 1, 0) AS IS_CUMULATIVE,
3565            Decode(T.ORDER_TYPE, 'ASC', 1, 0) IS_ASSENDING,
3566            T.INITIAL_VALUE, T.MAX_RESET_VALUE, R.GROUP_ID, R.CREATION_DATE, R.USER_ATTR1, R.USER_ATTR2, R.USER_ATTR3, R.USER_ATTR4, R.USER_ATTR5, R.USER_MEASURE1, R.USER_MEASURE2, R.USER_MEASURE3, R.USER_MEASURE4, R.USER_MEASURE5, R.QUALITY_FLAG
3567     FROM MTH_TAG_READINGS_RAW R, MTH_TAG_MASTER T
3568     WHERE R.PROCESSING_FLAG = p_processing_flag AND
3569           R.TAG_CODE = T.TAG_CODE (+)
3573   CURSOR c_getPrevReadingTimeForTag (p_tag_code IN VARCHAR2) IS
3570     ORDER BY TAG_CODE, READING_TIME;
3571 
3572   -- Fetch the previous reading time for the given tag code
3574     SELECT TAG_VALUE, READING_TIME
3575     FROM MTH_TAG_READINGS_LATEST
3576     WHERE TAG_CODE = p_tag_code;
3577 
3578   v_curr_partition NUMBER := p_curr_partition;
3579   v_curr_tag_code VARCHAR2(255) := NULL;
3580   v_prev_tag_code VARCHAR2(255) := NULL;
3581   v_prev_reading_time DATE := NULL;
3582   v_prev_tag_value VARCHAR2(255) := NULL;
3583   v_lookup_entry_exist boolean;
3584   v_err_code VARCHAR2(240) := NULL;
3585   v_is_valid_timestamp BOOLEAN := FALSE;
3586   v_incr_tag_value VARCHAR2(255);
3587    -- Keep the information of the last reading to be used to update LATEST table
3588   -- after the LOOP for the latest valid timestamp of the last tag code
3589   v_last_tag_code VARCHAR2(255) := NULL;
3590   v_last_reading_time DATE := NULL;
3591   v_last_tag_value VARCHAR2(255) := NULL;
3592 
3593 
3594 Begin
3595 
3596   -- 1. First switch the partition for the meter readings raw table
3597   --mth_util_pkg.switch_column_default_value(v_raw_tab_name, v_curr_partition);
3598   IF (v_curr_partition = 0) THEN
3599     -- No data available in the table to be processed
3600     RETURN;
3601   END IF;
3602 
3603 -- If the from_tz and to_tz values are not null, then call the function to
3604 -- account for time zone conversion
3605 
3606 IF (v_from_tz IS NOT NULL AND  v_to_tz IS NOT NULL) THEN
3607 
3608 v_factor_time_zone := MTH_TZ_UTIL.convert_tz(v_date_constant,
3609                     v_from_tz,
3610                     v_to_tz) - v_date_constant ;
3611   END IF;
3612 
3613 
3614     -- 2. Fetch the raw data for active tag and process each row
3615   FOR r_raw_data IN c_getRawData(v_curr_partition,v_factor_time_zone) LOOP
3616     v_curr_tag_code := r_raw_data.TAG_CODE;
3617 
3618     -- 2.0 Update/Create entry in MTH_TAG_METER_READINGS_LATEST for previous tag
3619     --     that is stored in v_last_... .
3620     --     only if the there is no error or the timestamp is valid even though
3621     --     there is an error in the preivoud set of values kept in v_last....
3622     IF (v_last_tag_code IS NOT NULL AND v_last_tag_code <> v_curr_tag_code) THEN
3623       update_tag_to_latest_tab(v_last_tag_code,
3624                                v_last_reading_time,
3625                                v_last_tag_value,
3626                                v_lookup_entry_exist);
3627 
3628       -- Erase the information for the last record since it has been saved
3629       -- into the LATEST table already.
3630       v_last_tag_code := NULL;
3631       v_last_reading_time := NULL;
3632       v_last_tag_value := NULL;
3633     END IF;
3634 
3635     -- 2.1 Find the meters and latest reading for the new tag code
3636     IF (v_prev_tag_code IS NULL OR v_prev_tag_code <> v_curr_tag_code) THEN
3637       -- 2.1.0 Reset the previous reading for the new tag code
3638       v_prev_tag_value := NULL;
3639       v_prev_reading_time := NULL;
3640 
3641       -- 2.1.2 Find previous reading time and tag value for the  currenttag
3642       --       in the lookup table MTH_TAG_READINGS_LATEST
3643       OPEN c_getPrevReadingTimeForTag(v_curr_tag_code);
3644       FETCH c_getPrevReadingTimeForTag INTO
3645               v_prev_tag_value, v_prev_reading_time;
3646       CLOSE c_getPrevReadingTimeForTag;
3647       v_lookup_entry_exist :=  v_prev_reading_time IS NOT NULL;
3648     END IF;
3649 
3650  -- 2.2 Validate the raw data
3651     v_err_code := MTH_IS_TAG_RAW_DATA_ROW_VALID (r_raw_data.TAG_CODE,
3652                                                  r_raw_data.TAG_MAST_TAG_CODE,
3653                                                  r_raw_data.READING_TIME,
3654                                                  r_raw_data.TAG_DATA,
3655                                                  r_raw_data.IS_NUMBER,
3656                                                  r_raw_data.IS_CUMULATIVE,
3657                                                  r_raw_data.IS_ASSENDING,
3658                                                  r_raw_data.INITIAL_VALUE,
3659                                                  r_raw_data.MAX_RESET_VALUE,
3660                                                  v_prev_reading_time,
3661                                                  v_is_valid_timestamp);
3662 
3663 
3664     -- 2.3 Insert data into either meter readings or error table
3665     IF (v_err_code IS NOT NULL OR Length(v_err_code) > 0) THEN
3666       -- 2.3.1 Insert the error row to error table  if there is any error
3667        INSERT INTO MTH_TAG_READINGS_UNPROCESS_ERR
3668           (GROUP_ID, READING_TIME , TAG_CODE, TAG_DATA, CREATION_DATE, USER_ATTR1, USER_ATTR2, USER_ATTR3, USER_ATTR4, USER_ATTR5, USER_MEASURE1, USER_MEASURE2, USER_MEASURE3, USER_MEASURE4, USER_MEASURE5, QUALITY_FLAG, REPROCESSED_READY_YN, ERR_CODE)
3669         VALUES (r_raw_data.GROUP_ID, r_raw_data.READING_TIME, r_raw_data.TAG_CODE, r_raw_data.TAG_DATA, r_raw_data.CREATION_DATE, r_raw_data.USER_ATTR1, r_raw_data.USER_ATTR2, r_raw_data.USER_ATTR3, r_raw_data.USER_ATTR4, r_raw_data.USER_ATTR5,
3670         r_raw_data.USER_MEASURE1, r_raw_data.USER_MEASURE2, r_raw_data.USER_MEASURE3, r_raw_data.USER_MEASURE4, r_raw_data.USER_MEASURE5, r_raw_data.QUALITY_FLAG,'N', v_err_code);
3671     ELSE
3672       -- 2.3.2 Get the incremental value
3673       v_incr_tag_value := get_incremental_tag_data(r_raw_data.TAG_DATA,
3674                                                 r_raw_data.IS_NUMBER,
3675                                                 r_raw_data.IS_CUMULATIVE,
3676                                                 r_raw_data.IS_ASSENDING,
3677                                                 r_raw_data.INITIAL_VALUE,
3678                                                 r_raw_data.MAX_RESET_VALUE,
3679                                                 v_prev_tag_value);
3680 
3681       -- 2.3.3 Insert the data into the mth_tag_readings_processed table
3682        INSERT INTO MTH_TAG_READINGS_RAW_PROCESSED (GROUP_ID, READING_TIME , TAG_CODE, TAG_DATA, CREATION_DATE, USER_ATTR1, USER_ATTR2, USER_ATTR3, USER_ATTR4, USER_ATTR5, USER_MEASURE1, USER_MEASURE2, USER_MEASURE3, USER_MEASURE4,
3683        USER_MEASURE5, QUALITY_FLAG) VALUES ( r_raw_data.GROUP_ID, r_raw_data.READING_TIME, r_raw_data.TAG_CODE, v_incr_tag_value, r_raw_data.CREATION_DATE, r_raw_data.USER_ATTR1, r_raw_data.USER_ATTR2, r_raw_data.USER_ATTR3,
3684        r_raw_data.USER_ATTR4, r_raw_data.USER_ATTR5, r_raw_data.USER_MEASURE1, r_raw_data.USER_MEASURE2, r_raw_data.USER_MEASURE3, r_raw_data.USER_MEASURE4, r_raw_data.USER_MEASURE5, r_raw_data.QUALITY_FLAG);
3685 
3686     END IF;
3687 
3688     -- 2.4 Save the current data as previous data, which can be used for :
3689         --     - Use the previous reading time - 1 second as FROM TIME for new
3690         --        data
3691     --     - Use the previous tag value to calcuate the incremental value
3692     --     - Save all of above into lookup table  MTH_TAG_METER_READINGS_LATEST
3693     --       when processing the last reading for this tag, wihch can be
3694     --       identified by find the next and different tag code
3695     IF (v_err_code IS NULL OR Length(v_err_code) = 0) or
3696        Length(v_err_code) > 0 and v_is_valid_timestamp THEN
3697     v_prev_tag_code :=  v_curr_tag_code;
3698     v_prev_tag_value := r_raw_data.TAG_DATA;
3699     v_prev_reading_time := Greatest(r_raw_data.READING_TIME,
3700                                     Nvl(v_prev_reading_time,
3701                                         r_raw_data.READING_TIME));
3702     -- Update the information for the last reading to update LATEST table
3703     -- for step 2.6
3704     v_last_tag_code := v_prev_tag_code;
3705     v_last_reading_time := v_prev_reading_time;
3706     v_last_tag_value := v_prev_tag_value;
3707     END IF;
3708    END LOOP;
3709 
3710        -- 2.6 Update/Create entry in MTH_TAG_READINGS_LATEST for the last tag
3711        --     Since we have kept the information for the last reading, just
3712        --     need to make sure that v_last_tag_code exists.
3713     IF (v_last_tag_code is not NULL) THEN
3714            update_tag_to_latest_tab(v_last_tag_code,
3715                                     v_last_reading_time,
3716                                     v_last_tag_value,
3717                                     v_lookup_entry_exist);
3718   END IF;
3719 
3720 
3721 
3722 END MTH_LOAD_TAG_RAW_TO_PROCESSED;
3723 /* ****************************************************************************
3724 * Procedure		:INSERT_OPEN_SALES_ORDERS*
3725 * Description 	 	:The procedure will insert open sales orders in the table, passed as a parameter,
3726 	 *in the partition that is empty. In the initial run, both the partitions will be empty,
3727 	 *then the data will move to partition with partition key=1. The alternate partition key
3728 	 *will be passed as the out parameter *
3729 * File Name	 	:MTHUTILB.PLS	             		      *
3730 * Visibility		:Public
3731 * Modification log	:						      *
3732 *	Author Date Change: Amrit Kaur	28-Jul-2011	Initial Creation      *
3733 *
3734 ******************************************************************************/
3735 
3736 
3737 PROCEDURE insert_open_sales_orders(p_table_name IN VARCHAR2, p_current_processing_flag OUT NOCOPY NUMBER)
3738 IS
3739 v_stmt VARCHAR2(400);
3740 v_stmt_no NUMBER;
3741 v_count NUMBER;
3742 v_schema_name VARCHAR2(100);
3743 v_status      VARCHAR2(30) ;
3744 v_industry    VARCHAR2(30) ;
3745  l_source_location  VARCHAR2(100) := fnd_profile.value('MTH_OWB_SOURCE_LOCATION');
3746    l_source_service VARCHAR2(100) := fnd_profile.value('MTH_SOURCE_DB_SERVICE_NAME');
3747    l_dblink VARCHAR2(400);
3748     l_sql_stmt    VARCHAR2(1000);
3749   l_installed   VARCHAR2(1);
3750 
3751     CURSOR get_db_link (source_service VARCHAR2, source_location VARCHAR2)
3752    IS
3753        SELECT db_link
3754        FROM user_db_links
3755        WHERE Upper(db_link) like Upper(source_service||'%@'||source_location);
3756 
3757 BEGIN
3758 
3759 
3760 
3761  OPEN  get_db_link(l_source_service, l_source_location);
3762        FETCH  get_db_link INTO l_dblink;
3763        CLOSE get_db_link;
3764 
3765 
3766 
3767 /*The procedure will insert open sales orders in the table, passed as a parameter,
3768 	 *in the partition that is empty. In the initial run, both the partitions will be empty,
3769 	 *then the data will move to partition with partition key=1. The alternate partition key
3770 	 *will be passed as the out parameter*/
3771 
3772 	 v_stmt_no := 10;
3773 --	 IF (NOT FND_INSTALLATION.GET_APP_INFO@l_db_link(
3774   --            application_short_name => 'MSC'
3775   --          , status                 => v_status
3776   --          , industry               => v_industry
3777   --          , oracle_schema          => v_schema_name)) THEN
3778   --   RAISE_APPLICATION_ERROR (-20002,'Could not find MSC product');
3779   --  END IF;
3780   l_sql_stmt := 'DECLARE ' ||
3781                 ' v_schema_name VARCHAR2(100); ' ||
3782                 ' v_status      VARCHAR2(30); ' ||
3783                 ' v_industry    VARCHAR2(30); ' ||
3784                 ' v_out_value   VARCHAR2(1); ' ||
3785                 'BEGIN ' ||
3786                 ' IF FND_INSTALLATION.GET_APP_INFO@' ||
3787                       l_dblink || '( ' ||
3788                       'application_short_name => ''MSC'', ' ||
3789                       'status                 => v_status, ' ||
3790                       'industry               => v_industry, ' ||
3791                       'oracle_schema          => v_schema_name) THEN ' ||
3792                       'v_out_value := ''Y''; ' ||
3793                 ' ELSE ' ||
3794                       'v_out_value := ''N''; ' ||
3795                 ' END IF; ' ||
3796                 ' :b1 := v_out_value; ' ||
3797                 'END;';
3798 
3799 --  Dbms_Output.put_line(l_sql_stmt);
3800 
3801   EXECUTE IMMEDIATE l_sql_stmt USING OUT l_installed;
3802 
3803 --  Dbms_Output.put_line(l_installed);
3804 IF(l_installed='N')     THEN
3805 RAISE_APPLICATION_ERROR(-20002,'Could not find MSC product');
3806 END IF;
3807 
3808     /*Check which partition is empty*/
3809     v_stmt_no := 20;
3810     v_stmt := 'SELECT COUNT(1) FROM '||p_table_name|| '@' || l_dblink || ' WHERE PROCESSING_FLAG = 1';
3811     EXECUTE IMMEDIATE v_stmt INTO v_count;
3812 
3813     /*v_count will either be 0 or greater than 0. v_count greater than 0 implies that
3814     *partition 2 is empty. All the open sales orders should go in partition 2 while
3815     *partition 1 should be used in the ETL. For the initial load, any partition will be
3816     *empty.*/
3817 
3818     v_stmt_no := 30;
3819     IF
3820     v_count > 0 THEN
3824     v_stmt := 'INSERT INTO '||p_table_name|| '@' || l_dblink || ' (EBS_HEADER_ID, PROCESSING_FLAG) (SELECT HEADER_ID, 2 FROM OE_ORDER_HEADERS_ALL@' ||l_dblink||' WHERE OPEN_FLAG = '||''''||'Y'||''''||')';
3821     /*partition 2 is empty. Open sales orders will be populated with PROCESSING_FLAG =2*/
3822     v_stmt_no := 40;
3823     p_current_processing_flag := 1;
3825     EXECUTE IMMEDIATE v_stmt;
3826     COMMIT;
3827 
3828     ELSE
3829     /*partition 1 is empty Open sales orders will be populated with PROCESSING_FLAG =1*/
3830     v_stmt_no := 40;
3831     p_current_processing_flag := 2;
3832        v_stmt := 'INSERT INTO '||p_table_name|| '@' || l_dblink || ' (EBS_HEADER_ID, PROCESSING_FLAG) (SELECT HEADER_ID, 1 FROM OE_ORDER_HEADERS_ALL@' ||l_dblink||' WHERE OPEN_FLAG = '||''''||'Y'||''''||')';
3833     EXECUTE IMMEDIATE v_stmt;
3834     COMMIT;
3835 
3836     END IF;
3837 
3838 
3839 EXCEPTION
3840 	WHEN OTHERS THEN
3841 		RAISE_APPLICATION_ERROR (-20002, SQLERRM||' at '||v_stmt_no);
3842      COMMIT;
3843 END insert_open_sales_orders;
3844 
3845 
3846 
3847 
3848 /*****************************************************************************
3849  * Procedure   : Get_Run_Log_Dates                                           *
3850  * Description : The procedure returns from and to dates from run log.       *
3851  * File Name   : MTHUTILB.pls                                                *
3852  * Visibility  : Public                                                      *
3853  *****************************************************************************/
3854 PROCEDURE Get_Run_Log_Dates(
3855     p_fact_table            IN  VARCHAR2,
3856     p_db_global_name        IN  VARCHAR2 DEFAULT NULL,
3857     p_hub_organization_code IN  VARCHAR2 DEFAULT NULL,
3858     p_ebs_organization_id   IN  NUMBER   DEFAULT NULL,
3859     p_from_date             OUT NOCOPY DATE,
3860     p_to_date               OUT NOCOPY DATE)
3861 IS
3862 
3863 BEGIN
3864     mth_util_pkg.log_msg('GET_RUN_LOG_DATES start', mth_util_pkg.G_DBG_PROC_FUN_START);
3865     mth_util_pkg.log_msg('p_fact_table            = ' || p_fact_table           , mth_util_pkg.G_DBG_PARAM_VAL);
3866     mth_util_pkg.log_msg('p_db_global_name        = ' || p_db_global_name       , mth_util_pkg.G_DBG_PARAM_VAL);
3867     mth_util_pkg.log_msg('p_hub_organization_code = ' || p_hub_organization_code, mth_util_pkg.G_DBG_PARAM_VAL);
3868     mth_util_pkg.log_msg('p_ebs_organization_id   = ' || p_ebs_organization_id  , mth_util_pkg.G_DBG_PARAM_VAL);
3869 
3870     SELECT MAX(FROM_DATE), MAX(TO_DATE)
3871       INTO p_from_date, p_to_date
3872       FROM MTH_RUN_LOG
3873      WHERE FACT_TABLE = p_fact_table
3874        AND (db_global_name = nvl(p_db_global_name,db_global_name)
3875             OR db_global_name IS NULL)
3876        AND (ebs_organization_id = nvl(p_ebs_organization_id,ebs_organization_id)
3877             OR ebs_organization_id IS NULL)
3878        AND (hub_organization_code =  nvl(p_hub_organization_code,hub_organization_code)
3879             OR hub_organization_code IS NULL);
3880 
3881     mth_util_pkg.log_msg('p_from_date             = ' || to_char(p_from_date,'DD-MON-YYYY HH24:MI:SS'), mth_util_pkg.G_DBG_VAR_VAL);
3882     mth_util_pkg.log_msg('p_to_date               = ' || to_char(p_to_date,  'DD-MON-YYYY HH24:MI:SS'), mth_util_pkg.G_DBG_VAR_VAL);
3883     mth_util_pkg.log_msg('GET_RUN_LOG_DATES end', mth_util_pkg.G_DBG_PROC_FUN_END);
3884 
3885 END GET_RUN_LOG_DATES;
3886 
3887 
3888 /*****************************************************************************
3889  * Procedure   : Initialize_Debug                                            *
3890  * Description : The procedure obtains execution_id from MTH_EXECUTION_S.    *
3891  *               This is required when being called from OWB task to be able *
3892  *               to set a unique execution_id. This is an optional step when *
3893  *               being called from concurrent program.                       *
3894  * File Name   : MTHUTILB.pls                                                *
3895  * Visibility  : Public                                                      *
3896  * Parameters  : p_context_desc (current context description)                *
3897  *               p_execution_id                                              *
3898  *****************************************************************************/
3899 PROCEDURE Initialize_Debug(
3900     p_context_desc IN VARCHAR2 DEFAULT NULL,
3901     p_execution_id IN OUT NOCOPY NUMBER
3902 ) IS
3903 BEGIN
3904 
3905     mth_util_pkg.g_mth_debug := nvl(fnd_profile.value('MTH_DEBUG_LEVEL'),0);
3906     mth_util_pkg.g_debug_indent_level := 0;
3907     if FND_GLOBAL.CONC_REQUEST_ID <> -1 then
3908         mth_util_pkg.g_execution_id := -1;
3909     else
3910         if p_execution_id is null then
3911           mth_util_pkg.g_execution_id := MTH_EXECUTION_S.NEXTVAL;
3912             p_execution_id := mth_util_pkg.g_execution_id;
3913         else
3914             mth_util_pkg.g_execution_id := p_execution_id;
3915         end if;
3916 
3917         select  value
3918         into    mth_util_pkg.g_debug_file_dir
3919         from    v$parameter2
3920         where   name='utl_file_dir'
3921         and     rownum = 1;
3922 
3923     end if;
3924     mth_util_pkg.log_msg('-----------------------------------------------------', 1);
3925     mth_util_pkg.log_msg('Initialize called for - ' || p_context_desc, 1);
3926 
3927 EXCEPTION
3928    WHEN OTHERS THEN
3929       return;
3930 
3931 END Initialize_Debug;
3932 
3933 
3934 /*****************************************************************************
3935  * Procedure   : Log_Msg                                                     *
3936  * Description : The procedure logs the passed message appropriately. This   *
3937  *               takes two parameters  1. p_msg_text and 2. p_msg_level. If *
3938  *               p_msg_level is less than or equal to profile option         *
3942  * Parameters  : p_msg_txt                                                   *
3939  *               MTH_DEBUG_LEVEL then the message will be logged.            *
3940  * File Name   : MTHUTILB.pls                                                *
3941  * Visibility  : Public                                                      *
3943  *               p_msg_lvl                                                   *
3944  *****************************************************************************/
3945 PROCEDURE Log_Msg(
3946     p_msg_txt IN VARCHAR2,
3947     p_msg_lvl IN NUMBER DEFAULT NULL
3948 ) IS
3949     fname utl_file.file_type;
3950     l_indent_level NUMBER;
3951     l_execution_id NUMBER;
3952 BEGIN
3953 
3954     if mth_util_pkg.g_mth_debug is null then
3955       Initialize_Debug('Unknown',l_execution_id);
3956     end if;
3957 
3958     if p_msg_lvl <= mth_util_pkg.g_mth_debug then
3959 
3960         if p_msg_lvl = mth_util_pkg.G_DBG_PROC_FUN_END then
3961             mth_util_pkg.g_debug_indent_level := mth_util_pkg.g_debug_indent_level - 1;
3962         end if;
3963         if p_msg_lvl = 0 then
3964             l_indent_level := 0;
3965         else
3966             l_indent_level := 2 * mth_util_pkg.g_debug_indent_level;
3967         end if;
3968         if p_msg_lvl = mth_util_pkg.G_DBG_PROC_FUN_START then
3969             mth_util_pkg.g_debug_indent_level := mth_util_pkg.g_debug_indent_level + 1;
3970         end if;
3971 
3972         if mth_util_pkg.g_execution_id = -1 then
3973             fnd_file.put_line(FND_FILE.LOG, LPad(' ',l_indent_level,' ') || p_msg_txt);
3974         else
3975             fname := utl_file.fopen(mth_util_pkg.g_debug_file_dir,'MOC-'||mth_util_pkg.g_execution_id,'a');
3976             utl_file.put(fname, LPad(' ',l_indent_level,' ') || p_msg_txt);
3977            -- dbms_output.put_line(LPad(' ',l_indent_level,' ') || p_msg_txt); --to be removed before checkin
3978             utl_file.fflush(fname);
3979             utl_file.fclose(fname);
3980         end if;
3981 
3982     end if;
3983 
3984 EXCEPTION
3985    WHEN OTHERS THEN
3986       return;
3987 
3988 END Log_Msg;
3989 
3990  /* ****************************************************************************
3991 * Procedure		:INCR_EQUIP_SHIFTS*
3992 * Description 	 	:The procedure will insert records in equipment shifts table by taking the data*
3993 from workday shifts and mth_all_entities_v table *
3994 * File Name	 	:MTHUTILB.PLS	             		      *
3995 * Visibility		:Public
3996 * Modification log	:						      *
3997 *	Author Date Change: Amrit Kaur	27-Mar-2012	Initial Creation      *
3998 *
3999 ******************************************************************************/
4000 
4001   PROCEDURE INCR_EQUIP_SHIFTS IS
4002     v_log_from_date   DATE;
4003     v_log_to_date     DATE;
4004     v_unassigned_val  VARCHAR2(30);
4005 
4006 BEGIN
4007     mth_util_pkg.log_msg('INCR_EQUIPMENT_SHIFTS start', mth_util_pkg.G_DBG_PROC_FUN_START);
4008 
4009     -- Initialize default parameters
4010     v_log_to_date := sysdate;
4011     v_unassigned_val := MTH_UTIL_PKG.MTH_UA_GET_VAL;
4012 
4013 
4014     -- Call mth_run_log_pre_load
4015     mth_util_pkg.mth_run_log_pre_load('MTH_EQUIPMENT_SHIFTS_D',v_unassigned_val,'INCR',NULL,0,v_log_to_date);
4016 
4017     -- Call GET_RUN_LOG_DATES
4018     mth_util_pkg.GET_RUN_LOG_DATES('MTH_EQUIPMENT_SHIFTS_D',NULL,NULL,NULL,v_log_from_date,v_log_to_date);
4019 
4020   DELETE
4021 FROM MTH_EQUIPMENT_SHIFTS_D ESD
4022   WHERE EXISTS (SELECT 1
4023                   FROM MTH_WORKDAY_SHIFTS_D WSD,MTH_ALL_ENTITIES_V  MAV
4024                   WHERE WSD.LAST_UPDATE_DATE > v_log_from_date
4025                     AND   (MAV.PRODUCTION_ENTITY ='Y'or MAV.PRODUCTION_ENTITY ='N')
4026                     AND   WSD.PLANT_FK_KEY =  MAV.SITE_ID
4027 AND
4028 ESD.EQUIPMENT_FK_KEY = MAV.ENTITY_PK_KEY AND
4029 ESD.SHIFT_WORKDAY_FK_KEY = WSD.SHIFT_WORKDAY_PK_KEY  )   ;
4030        mth_util_pkg.log_msg('Number of rows deleted from MTH_EQUIPMENT_SHIFTS_D - ' || SQL%ROWCOUNT, mth_util_pkg.G_DBG_ROW_CNT);
4031 
4032 INSERT INTO MTH_EQUIPMENT_SHIFTS_D (EQUIPMENT_FK_KEY,
4033 								      AVAILABILITY_DATE,
4034 								      SHIFT_WORKDAY_FK_KEY,
4035 								      FROM_DATE,
4036 								      TO_DATE,
4037 								      AVAILABILITY_FLAG,
4038 								      CREATION_DATE,
4039 								      LAST_UPDATE_DATE,
4040 								      CREATION_SYSTEM_ID,
4041 								      LAST_UPDATE_SYSTEM_ID,
4042 								      LINE_NUM,
4043 								      RESOURCE_FK_KEY,
4044 								      RESOURCE_COST,
4045                                       ENTITY_TYPE)
4046                                    (SELECT
4047   RES.EQUIPMENT_PK_KEY,
4048   RES.SHIFT_DATE,
4049   RES.SHIFT_WORKDAY_PK_KEY ,
4050   RES.FROM_DATE,
4051   RES.TO_DATE,
4052   'Y' ,
4053 v_log_to_date,
4054 v_log_to_date,
4055 v_unassigned_val,
4056 v_unassigned_val ,
4057   1 ,
4058   COST.LEVEL9_LEVEL_KEY,
4059   COST.COST,
4060   RES.ENTITY_TYPE
4061 FROM
4062 			  (   SELECT MAV.ENTITY_PK_KEY EQUIPMENT_PK_KEY,
4063 					  WSD.SHIFT_WORKDAY_PK_KEY,
4064 					  WSD.SHIFT_DATE,
4065 					  WSD.FROM_DATE,
4066 					  WSD.TO_DATE,
4067 					  MAV.ENTITY_TYPE
4068               FROM    MTH_ALL_ENTITIES_V  MAV,
4069                       MTH_WORKDAY_SHIFTS_D  WSD
4070               WHERE  (WSD.LAST_UPDATE_DATE > v_log_from_date OR
4071                                 ( MAV.CREATION_DATE > v_log_from_date AND
4072                                  TRUNC( MAV.CREATION_DATE ) <= WSD.SHIFT_DATE))
4073                     AND   (MAV.PRODUCTION_ENTITY ='Y'or MAV.PRODUCTION_ENTITY ='N')
4074                     AND   WSD.PLANT_FK_KEY =  MAV.SITE_ID
4075 ) RES ,( SELECT MED.EQUIPMENT_FK_KEY,
4076   MED.LEVEL9_LEVEL_KEY,
4077   MED.EQUIPMENT_EFFECTIVE_DATE,
4078   MED.EQUIPMENT_EXPIRATION_DATE,
4082 FROM
4079  MRC.RESOURCE_FK_KEY,
4080  MRC.COST
4081 
4083     MTH_EQUIPMENT_DENORM_D MED ,MTH_RESOURCE_COST_MV  MRC
4084     WHERE  MED.EQUIPMENT_FK_KEY IS NOT NULL  AND
4085   MED.EQUIPMENT_HIERARCHY_KEY  = -2
4086   AND MED.LEVEL9_LEVEL_KEY  =  MRC.RESOURCE_FK_KEY  (+))COST
4087  WHERE
4088 
4089 RES.EQUIPMENT_PK_KEY  =  COST.EQUIPMENT_FK_KEY  (+)  And
4090    ( RES.FROM_DATE  >= COST.EQUIPMENT_EFFECTIVE_DATE (+)   AND
4091    RES.FROM_DATE <= NVL (  COST.EQUIPMENT_EXPIRATION_DATE  (+) ,TO_DATE('4000-01-01', 'YYYY-MM-DD') )
4092    ) )
4093     ;
4094      mth_util_pkg.log_msg('Number of rows inserted in MTH_EQUIPMENT_SHIFTS_D - ' || SQL%ROWCOUNT, mth_util_pkg.G_DBG_ROW_CNT);
4095 
4096     ----Call mth_run_log_post_load
4097     mth_util_pkg.mth_run_log_post_load('MTH_EQUIPMENT_SHIFTS_D',v_unassigned_val);
4098 
4099 
4100     mth_util_pkg.log_msg('INCR_EQUIPMENT_SHIFTS end', mth_util_pkg.G_DBG_PROC_FUN_END);
4101     COMMIT;
4102 EXCEPTION
4103     WHEN OTHERS THEN
4104         mth_util_pkg.log_msg('Exception OTHERS in INCR_EQUIPMENT_SHIFTS', mth_util_pkg.G_DBG_EXCEPTION);
4105         mth_util_pkg.log_msg(substr(sqlerrm,1,300), mth_util_pkg.G_DBG_EXCEPTION);
4106         mth_util_pkg.log_msg(sqlcode, mth_util_pkg.G_DBG_EXCEPTION);
4107         ROLLBACK;
4108         RAISE;
4109 
4110   END INCR_EQUIP_SHIFTS;
4111  /* ****************************************************************************
4112 * Procedure		:MTH_WORKDAY_SHIFTS_SF*
4113 * Description 	 	:The procedure will insert valid records in workday shifts table and*
4114 invalid records in workday shifts error table *
4115 * File Name	 	:MTHUTILB.PLS	             		      *
4116 * Visibility		:Public
4117 * Modification log	:						      *
4118 *	Author Date Change: Amrit Kaur	27-Mar-2012	Initial Creation      *
4119 *
4120 ******************************************************************************/
4121 
4122  PROCEDURE MTH_WORKDAY_SHIFTS_SF IS
4123      v_log_date        DATE;
4124      v_processing_flag NUMBER;
4125      v_unassigned_val  VARCHAR2(30);
4126      v_profile VARCHAR2(240);
4127        v_reprocess_flag  number;
4128 BEGIN
4129   -- Initialize default parameters
4130     v_log_date := sysdate;
4131     v_unassigned_val := MTH_UTIL_PKG.MTH_UA_GET_VAL;
4132    --       mth_util_pkg.switch_column_default_value ( 'MTH_WORKDAY_SHIFTS_STG', v_processing_flag);
4133     --     SELECT Count(*) INTO v_reprocess_flag FROM   MTH_WORKDAY_SHIFTS_ERR WHERE  REPROCESS_READY_YN='Y';
4134 
4135     --      IF ( v_processing_flag=1 OR  v_processing_flag=2  OR v_reprocess_flag>0 ) THEN
4136 
4137 
4138        mth_util_pkg.log_msg('MTH_WORKDAY_SHIFTS_SF start', mth_util_pkg.G_DBG_PROC_FUN_START);
4139 
4140 
4141      SELECT 	MTH_UTIL_PKG.GET_PROFILE_VAL('MTH_SHIFT_SETUP' ) INTO v_profile FROM DUAL ;
4142 
4143 INSERT INTO  MTH_WORKDAY_SHIFTS_STG
4144       (SHIFT_DATE,
4145       SOURCE_ORG_CODE,
4146       USER_ATTR1,
4147       USER_ATTR2,
4148       USER_ATTR3,
4149       USER_ATTR4,
4150       USER_ATTR5,
4151       USER_MEASURE1,
4152       USER_MEASURE2,
4153       USER_MEASURE3,
4154       USER_MEASURE4,
4155       USER_MEASURE5,
4156       SHIFT_WORKDAY_PK,
4157       SYSTEM_FK,
4158       FROM_DATE,
4159       SHIFT_NUM,
4160       TO_DATE,
4161       SHIFT_NAME,
4162       SHIFT_TYPE,
4163       GRAVEYARD_SHIFT)
4164       (SELECT SHIFT_DATE,
4165   SOURCE_ORG_CODE,
4166   USER_ATTR1 ,
4167   USER_ATTR2,
4168   USER_ATTR3,
4169   USER_ATTR4,
4170   USER_ATTR5,
4171   USER_MEASURE1,
4172   USER_MEASURE2,
4173   USER_MEASURE3,
4174   USER_MEASURE4,
4175   USER_MEASURE5 ,
4176   SHIFT_WORKDAY_PK ,
4177   SYSTEM_FK,
4178   FROM_DATE,
4179   SHIFT_NUM,
4180   TO_DATE,
4181   SHIFT_NAME,
4182   SHIFT_TYPE,
4183   GRAVEYARD_SHIFT
4184 FROM MTH_WORKDAY_SHIFTS_ERR
4185   WHERE UPPER( REPROCESS_READY_YN   ) = 'Y'
4186       )
4187     ;
4188      mth_util_pkg.log_msg('Number of rows inserted in MTH_WORKDAY_SHIFTS_STG from error table - ' || SQL%ROWCOUNT, mth_util_pkg.G_DBG_ROW_CNT);
4189 
4190  --delete data from the output error table
4191     DELETE FROM MTH_WORKDAY_SHIFTS_ERR
4192           WHERE UPPER(REPROCESS_READY_YN) IN ('D','Y'); --Bug 14753663
4193     mth_util_pkg.log_msg('Number of rows deleted in MTH_WORKDAY_SHIFTS_ERR - ' || SQL%ROWCOUNT, mth_util_pkg.G_DBG_ROW_CNT);
4194                      mth_util_pkg.REFRESH_ONE_MV ('MTH_SHIFT_REFERENCE_MV',null,null,'C');
4195   mth_util_pkg.switch_column_default_value('MTH_WORKDAY_SHIFTS_STG',v_processing_flag);
4196       IF ( v_processing_flag=1 OR  v_processing_flag=2 ) THEN
4197 
4198   --Execute all validations on csv records
4199 
4200    -- Validation for Duplicate record
4201 			    UPDATE mth_workday_shifts_stg stg
4202              SET stg.err_code = stg.err_code || 'DUP '
4203     WHERE EXISTS ( SELECT * FROM ( SELECT shift_workday_pk,Count(shift_workday_pk) cnt
4204                                     FROM mth_workday_shifts_stg
4205                                 GROUP BY shift_workday_pk) dup
4206                     WHERE dup.cnt>1
4207                       AND dup.shift_workday_pk = stg.shift_workday_pk
4208                       AND stg.processing_flag = v_processing_flag );
4209     mth_util_pkg.log_msg('Number of rows with DUP in MTH_WORKDAY_SHIFTS_STG - ' || SQL%ROWCOUNT, mth_util_pkg.G_DBG_ROW_CNT);
4210 
4211      -- Validation for Null From Date
4212 		           UPDATE mth_workday_shifts_stg stg
4213 		              SET stg.err_code = stg.err_code || 'NFD '
4214 		            WHERE stg.from_date IS NULL
4215                           AND stg.processing_flag = v_processing_flag;
4216 		mth_util_pkg.log_msg('Number of rows with NFD in MTH_WORKDAY_SHIFTS_STG - ' || SQL%ROWCOUNT, mth_util_pkg.G_DBG_ROW_CNT);
4217 
4218 
4219          -- Validation for Null To Date
4223                           AND stg.processing_flag = v_processing_flag;
4220 		           UPDATE mth_workday_shifts_stg stg
4221 		              SET stg.err_code = stg.err_code || 'NTD '
4222 		            WHERE stg.to_date IS NULL
4224 		mth_util_pkg.log_msg('Number of rows with NTD in MTH_WORKDAY_SHIFTS_STG - ' || SQL%ROWCOUNT, mth_util_pkg.G_DBG_ROW_CNT);
4225 
4226     -- Validation for From Date = To date
4227 		           UPDATE mth_workday_shifts_stg stg
4228 		              SET stg.err_code = stg.err_code || 'SDT '
4229 		            WHERE stg.from_date= stg.to_date
4230                           AND stg.processing_flag = v_processing_flag;
4231 		mth_util_pkg.log_msg('Number of rows with SDT in MTH_WORKDAY_SHIFTS_STG - ' || SQL%ROWCOUNT, mth_util_pkg.G_DBG_ROW_CNT);
4232 
4233       -- Validation for From Date > To date
4234 		           UPDATE mth_workday_shifts_stg stg
4235 		              SET stg.err_code = stg.err_code || 'DTE '
4236 		            WHERE Nvl(stg.from_date,TO_DATE ('01-01-1900', 'DD-MM-YYYY')) >Nvl ( stg.To_Date,  TO_DATE ('01-01-2999', 'DD-MM-YYYY')    )
4237                           AND stg.processing_flag = v_processing_flag;
4238 		mth_util_pkg.log_msg('Number of rows with DTE in MTH_WORKDAY_SHIFTS_STG - ' || SQL%ROWCOUNT, mth_util_pkg.G_DBG_ROW_CNT);
4239 
4240     --  Validation for shift_type
4241 
4242        UPDATE mth_workday_shifts_stg stg
4243 		             SET stg.err_code = stg.err_code || 'SFT '
4244 		           WHERE   stg.SHIFT_TYPE IS NOT NULL
4245                AND EXISTS (SELECT * FROM (SELECT  stg.SHIFT_TYPE   SHIFT_TYPE ,fl.meaning
4246 		                          FROM mth_workday_shifts_stg stg,
4247 		                               ( SELECT meaning FROM  fnd_lookup_values fl    WHERE fl.LOOKUP_TYPE  ='MTH_SHIFT_TYPE'
4248 
4249                               AND fl.LANGUAGE  = USERENV('LANG')
4250                                   AND fl.ENABLED_FLAG ='Y'      )  fl
4251 		                         WHERE  stg.SHIFT_TYPE  = fl.meaning(+)
4252                              AND stg.SHIFT_TYPE IS NOT NULL
4253 		                       ) fls
4254 		                    WHERE fls.SHIFT_TYPE =  stg.SHIFT_TYPE
4255                                   AND stg.processing_flag = v_processing_flag
4256 		                              AND fls.meaning IS NULL);
4257 		mth_util_pkg.log_msg('Number of rows with SFT in MTH_WORKDAY_SHIFTS_STG - ' || SQL%ROWCOUNT, mth_util_pkg.G_DBG_ROW_CNT);
4258 
4259       -- Validation for graveyard shift
4260 		          UPDATE mth_workday_shifts_stg stg
4261 		             SET stg.err_code = stg.err_code || 'GRA '
4262 		           WHERE stg.graveyard_shift IS NOT NULL
4263 		      AND EXISTS (SELECT * FROM (SELECT fl.meaning, stg.graveyard_shift
4264 		                          FROM mth_workday_shifts_stg stg,
4265 		                           ( SELECT meaning FROM  fnd_lookup_values fl    WHERE fl.LOOKUP_TYPE  ='MTH_GRAVEYARD_SHIFT_TYPE'
4266 
4267                               AND fl.LANGUAGE  = USERENV('LANG')
4268                                   AND fl.ENABLED_FLAG ='Y'      )fl
4269 		                         WHERE stg.graveyard_shift = fl.meaning (+)
4270 		                           AND stg.graveyard_shift IS NOT NULL
4271                                )flg
4272 		                    WHERE    flg.graveyard_shift = stg.graveyard_shift
4273                                   AND stg.processing_flag = v_processing_flag
4274 		                              AND flg.meaning IS NULL);
4275 		mth_util_pkg.log_msg('Number of rows with GRA in MTH_WORKDAY_SHIFTS_STG - ' || SQL%ROWCOUNT, mth_util_pkg.G_DBG_ROW_CNT);
4276 
4277      -- Validation for incorrect plant
4278 		          UPDATE mth_workday_shifts_stg stg
4279 		             SET stg.err_code = stg.err_code || 'PLT '
4280 		           WHERE EXISTS (SELECT * FROM ( SELECT PLANTS.PLANT_PK_KEY,STG.SHIFT_WORKDAY_PK  FROM MTH_WORKDAY_SHIFTS_STG STG
4281 
4282                               , (  SELECT MOL.ORGANIZATION_CODE,MP.PLANT_PK_KEY,MS.SYSTEM_PK FROM MTH_PLANTS_D  MP,
4283                                           MTH_ORGANIZATIONS_L MOL,
4284                                           MTH_SYSTEMS_SETUP MS
4285                                   WHERE    NVL(MP.TO_DATE,SYSDATE)  >= TRUNC(SYSDATE)
4286                                          AND MP.PLANT_PK_KEY  =  MOL.PLANT_FK_KEY
4287                                          AND MOL.SYSTEM_FK_KEY  =  MS.SYSTEM_PK_KEY   )PLANTS
4288                                          WHERE STG.SOURCE_ORG_CODE  =  PLANTS.ORGANIZATION_CODE  (+)
4289                                          AND  NVL(STG.SYSTEM_FK, MTH_UTIL_PKG.MTH_UA_GET_VAL()  )   = PLANTS.SYSTEM_PK  (+)
4290                                     )plants1
4291 		                    WHERE    stg.shift_workday_pk = plants1.shift_workday_pk
4292                                   AND stg.processing_flag = v_processing_flag
4293 		                              AND plants1.plant_pk_key IS NULL);
4294 		mth_util_pkg.log_msg('Number of rows with PLT in MTH_WORKDAY_SHIFTS_STG - ' || SQL%ROWCOUNT, mth_util_pkg.G_DBG_ROW_CNT);
4295 
4296       	--Validation for OVP
4297 									       UPDATE  mth_workday_shifts_stg stag
4298 									         SET stag.err_code = stag.err_code || 'OVP '
4299 									WHERE EXISTS (SELECT *
4300 									                FROM
4301 									                (SELECT 	CASE
4302 										                        WHEN (LAG(stg.from_date) OVER (PARTITION BY stg.source_org_code,stg.system_fk ORDER BY stg.from_date)) IS NOT NULL
4303 										                          AND (LAG (stg.to_date) OVER (PARTITION BY stg.source_org_code,stg.system_fk ORDER BY stg.from_date)) IS NOT NULL
4304 										                          AND ((stg.from_date >=  (LAG(stg.from_date) OVER ( PARTITION BY stg.source_org_code,stg.system_fk ORDER BY stg.from_date))
4305 										                                AND
4306 										                                stg.from_date <= (LAG (stg.to_date) OVER (PARTITION BY stg.source_org_code,stg.system_fk ORDER BY stg.from_date)))
4307 										                                OR
4308 										                                (stg.to_date >= (LAG(stg.from_date) OVER (PARTITION BY stg.source_org_code,stg.system_fk ORDER BY stg.from_date))
4312 										                        THEN 1 END overlap,
4309 										                                AND
4310 										                                stg.to_date <= (LAG(stg.to_date) OVER (PARTITION BY  stg.source_org_code,stg.system_fk ORDER BY stg.from_date   )))
4311 										                              )
4313 									                          stg.shift_workday_pk,
4314 									                          stg.from_date,
4315 									                          stg.to_date
4316 									                    FROM  mth_workday_shifts_stg stg ) ovp
4317 									              WHERE ovp.overlap = 1
4318 									                AND stag.shift_workday_pk = ovp.shift_workday_pk
4319 									                AND stag.from_date = ovp.from_date
4320 									                AND stag.To_Date = ovp.To_Date);
4321 							mth_util_pkg.log_msg('Number of rows with OVP in MTH_WORKDAY_SHIFTS_STG - ' || SQL%ROWCOUNT, mth_util_pkg.G_DBG_ROW_CNT);
4322 
4323         	--Validation for SAE
4324 									       UPDATE  mth_workday_shifts_stg stg
4325 									         SET stg.err_code = stg.err_code || 'SAE '
4326 									WHERE EXISTS (SELECT *
4327 									                FROM
4328 									                (SELECT 	stg.shift_workday_pk
4329 									                    FROM  mth_workday_shifts_stg stg,
4330 									                          MTH_SHIFT_REFERENCE_MV MSV,
4331                                             mth_plants_d plants,
4332                                               mth_organizations_l mol,
4333                                            mth_systems_setup ms
4334                                   WHERE NVL(MSV.SHIFT_DATE,stg.shift_date-1) >= stg.shift_date
4335                                         AND  NVL(plants.TO_DATE,SYSDATE)  >= TRUNC(SYSDATE)
4336                                          AND plants.PLANT_PK_KEY  =  MOL.PLANT_FK_KEY
4337                                          AND MOL.SYSTEM_FK_KEY  =  MS.SYSTEM_PK_KEY
4338                                          AND STG.SOURCE_ORG_CODE  =  MOL.ORGANIZATION_CODE  (+)
4339                                           AND  NVL(STG.SYSTEM_FK, MTH_UTIL_PKG.MTH_UA_GET_VAL()  )   = MS.SYSTEM_PK  (+)
4340                                           AND  plants.PLANT_PK_KEY=MSV.PLANT_FK_KEY )sae
4341 									              WHERE stg.shift_workday_pk = sae.shift_workday_pk);
4342 							mth_util_pkg.log_msg('Number of rows with SAE in MTH_WORKDAY_SHIFTS_STG - ' || SQL%ROWCOUNT, mth_util_pkg.G_DBG_ROW_CNT);
4343 
4344               	--Validation for profile value
4345 									       UPDATE  mth_workday_shifts_stg stg
4346 									         SET stg.err_code = stg.err_code || 'PRF '
4347 									WHERE v_profile<>'External Source';
4348 							mth_util_pkg.log_msg('Number of rows with PRF in MTH_WORKDAY_SHIFTS_STG - ' || SQL%ROWCOUNT, mth_util_pkg.G_DBG_ROW_CNT);
4349 
4350 
4351 	--Insert records into mth_workday_shifts_err
4352 
4353 INSERT INTO MTH_WORKDAY_SHIFTS_ERR(REPROCESS_READY_YN,
4354                                     SHIFT_DATE,
4355                                     SOURCE_ORG_CODE,
4356                                     USER_ATTR1,
4357                                     USER_ATTR2,
4358                                     USER_ATTR3,
4359                                     USER_ATTR4,
4360                                     USER_ATTR5,
4361                                     USER_MEASURE1,
4362                                     USER_MEASURE2,
4363                                     USER_MEASURE3,
4364                                     USER_MEASURE4,
4365                                     USER_MEASURE5,
4366                                     SHIFT_WORKDAY_PK,
4367                                     SYSTEM_FK,
4368                                     FROM_DATE,
4369                                     TO_DATE,
4370                                     SHIFT_NUM,
4371                                     SHIFT_NAME,
4372                                     ERR_CODE,
4373                                     SHIFT_TYPE,
4374                                   GRAVEYARD_SHIFT)
4375                                    (SELECT 	'N',
4376 		                                       SHIFT_DATE,
4377                                            SOURCE_ORG_CODE,
4378                                           USER_ATTR1,
4379                                           USER_ATTR2,
4380                                           USER_ATTR3,
4381                                           USER_ATTR4,
4382                                           USER_ATTR5,
4383                                           USER_MEASURE1,
4384                                           USER_MEASURE2,
4385                                           USER_MEASURE3,
4386                                           USER_MEASURE4,
4387                                           USER_MEASURE5,
4388                                           SHIFT_WORKDAY_PK,
4389                                           SYSTEM_FK,
4390                                           FROM_DATE,
4391                                           TO_DATE,
4392                                           SHIFT_NUM,
4393                                           SHIFT_NAME,
4394                                           ERR_CODE,
4395                                           SHIFT_TYPE,
4396                                         GRAVEYARD_SHIFT
4397 		                                    FROM  mth_workday_shifts_stg
4398 		                                   WHERE  err_code IS NOT NULL
4399 		                                     );
4400 		mth_util_pkg.log_msg('Number of rows inserted in MTH_WORKDAY_SHIFTS_ERR - ' || SQL%ROWCOUNT, mth_util_pkg.G_DBG_ROW_CNT);
4401 
4402 
4403 
4404 DELETE FROM mth_equipment_shifts_D
4405  WHERE shift_workday_fk_key IN (SELECT shift_workday_pk_key FROM
4406                                 mth_workday_shifts_D wsd,
4407                                 mth_shift_reference_MV mv,
4408                                 mth_workday_shifts_stg stg,
4409                                 mth_plants_d plants  ,
4410                                 MTH_ORGANIZATIONS_L MOL,
4414   TRUNC( wsd.FROM_DATE  )   = TRUNC (  stg.SHIFT_DATE ) )
4411                                 MTH_SYSTEMS_SETUP MS
4412                         WHERE   wsd.SHIFT_DATE  > Nvl(  mv.SHIFT_DATE ,wsd.shift_date-1)
4413  And (TRUNC(  wsd.SHIFT_DATE  )   = TRUNC (   stg.SHIFT_DATE )  OR
4415   And  wsd.PLANT_FK_KEY  =  mv.PLANT_FK_KEY(+)
4416    And  wsd.PLANT_FK_KEY  =   plants.PLANT_PK_KEY
4417     AND  NVL(plants.TO_DATE,SYSDATE)  >= TRUNC(SYSDATE)
4418     AND plants.PLANT_PK_KEY  =  MOL.PLANT_FK_KEY
4419      AND MOL.SYSTEM_FK_KEY  =  MS.SYSTEM_PK_KEY
4420      AND STG.SOURCE_ORG_CODE  =  MOL.ORGANIZATION_CODE
4421     AND  NVL(STG.SYSTEM_FK, MTH_UTIL_PKG.MTH_UA_GET_VAL()  )   = MS.SYSTEM_PK
4422     AND stg.err_code IS NULL
4423    And    stg.SOURCE_ORG_CODE = nvl (  wsd.SOURCE_ORG_CODE , stg.SOURCE_ORG_CODE  ));
4424 
4425    mth_util_pkg.log_msg('Number of rows deleted from mth_equipment_shifts_D - ' || SQL%ROWCOUNT, mth_util_pkg.G_DBG_ROW_CNT);
4426 
4427    DELETE FROM mth_workday_shifts_D
4428  WHERE shift_workday_pk_key IN (SELECT shift_workday_pk_key FROM
4429                                 mth_workday_shifts_D wsd,
4430                                 mth_shift_reference_MV mv,
4431                                 mth_workday_shifts_stg stg,
4432                                 mth_plants_d plants  ,
4433                                 MTH_ORGANIZATIONS_L MOL,
4434                                 MTH_SYSTEMS_SETUP MS
4435                         WHERE   wsd.SHIFT_DATE  > Nvl( mv.SHIFT_DATE,wsd.shift_date-1)
4436  And (TRUNC(  wsd.SHIFT_DATE  )   = TRUNC (   stg.SHIFT_DATE )  OR
4437   TRUNC( wsd.FROM_DATE  )   = TRUNC (  stg.SHIFT_DATE ) )
4438  And  wsd.PLANT_FK_KEY  =  mv.PLANT_FK_KEY(+)
4439    And  wsd.PLANT_FK_KEY  =   plants.PLANT_PK_KEY
4440     AND  NVL(plants.TO_DATE,SYSDATE)  >= TRUNC(SYSDATE)
4441     AND plants.PLANT_PK_KEY  =  MOL.PLANT_FK_KEY
4442      AND MOL.SYSTEM_FK_KEY  =  MS.SYSTEM_PK_KEY
4443      AND STG.SOURCE_ORG_CODE  =  MOL.ORGANIZATION_CODE
4444     AND  NVL(STG.SYSTEM_FK, MTH_UTIL_PKG.MTH_UA_GET_VAL()  )   = MS.SYSTEM_PK
4445     AND stg.err_code IS NULL
4446    And    stg.SOURCE_ORG_CODE = nvl (  wsd.SOURCE_ORG_CODE , stg.SOURCE_ORG_CODE  ));
4447 
4448       mth_util_pkg.log_msg('Number of rows deleted from mth_workday_shifts_D - ' || SQL%ROWCOUNT, mth_util_pkg.G_DBG_ROW_CNT);
4449 
4450   INSERT INTO MTH_WORKDAY_SHIFTS_D
4451       (SHIFT_WORKDAY_PK_KEY,
4452       SHIFT_WORKDAY_PK,
4453       SHIFT_DATE,
4454       SHIFT_DATE_JULIAN,
4455       PLANT_FK_KEY,
4456       SYSTEM_FK_KEY,
4457       USER_ATTR1,
4458       USER_ATTR2,
4459       USER_ATTR3,
4460       USER_ATTR4,
4461       USER_ATTR5,
4462       USER_MEASURE1,
4463       USER_MEASURE2,
4464       USER_MEASURE3,
4465       USER_MEASURE4,
4466       USER_MEASURE5,
4467       CREATION_DATE,
4468       LAST_UPDATE_DATE,
4469       CREATION_SYSTEM_ID,
4470       LAST_UPDATE_SYSTEM_ID,
4471       FROM_DATE,
4472       TO_DATE,
4473       SHIFT_NUM,
4474       SHIFT_NAME,
4475       SOURCE_ORG_CODE,
4476       SHIFT_TYPE,
4477       GRAVEYARD_SHIFT)
4478 
4479       (SELECT MTH_WORKDAYS_SHIFTS_S.NEXTVAL,
4480      stg.SHIFT_WORKDAY_PK,
4481       stg.SHIFT_DATE,
4482         TO_NUMBER(TO_CHAR( stg.SHIFT_DATE ,'J')),
4483   PD.plant_pk_key,
4484     NVL( SP.SYSTEM_PK_KEY ,  MTH_UTIL_PKG.MTH_UA_GET_VAL()    ),
4485      STG.USER_ATTR1,
4486       stg.USER_ATTR2,
4487       stg.USER_ATTR3,
4488       stg.USER_ATTR4,
4489       stg.USER_ATTR5,
4490       stg.USER_MEASURE1,
4491       stg.USER_MEASURE2,
4492       stg.USER_MEASURE3,
4493       stg.USER_MEASURE4,
4494       stg.USER_MEASURE5,
4495       SYSDATE,
4496       SYSDATE,
4497       NVL( SP.SYSTEM_PK_KEY ,  MTH_UTIL_PKG.MTH_UA_GET_VAL()    ),
4498       NVL( SP.SYSTEM_PK_KEY ,  MTH_UTIL_PKG.MTH_UA_GET_VAL()    ),
4499       stg.FROM_DATE,
4500       stg.TO_DATE,
4501       STG.SHIFT_NUM,
4502       STG.SHIFT_NAME,
4503       STG.SOURCE_ORG_CODE,
4504       Decode(STG.SHIFT_TYPE,NULL,'PROD-SHIFT',FL2.LOOKUP_CODE),
4505       DECODE(STG.GRAVEYARD_SHIFT,NULL,NULL,FL1.LOOKUP_CODE)
4506 FROM
4507     MTH_WORKDAY_SHIFTS_STG  STG ,MTH_SYSTEMS_SETUP  SP,MTH_PLANTS_D  PD,MTH_ORGANIZATIONS_L  MOL,FND_LOOKUP_VALUES FL1,FND_LOOKUP_VALUES FL2
4508     WHERE  NVL ( STG.SYSTEM_FK , MTH_UTIL_PKG.MTH_UA_GET_VAL ) = SP.SYSTEM_PK
4509 AND NVL(PD.TO_DATE,SYSDATE)  >= TRUNC(SYSDATE)
4510 AND PD.PLANT_PK_KEY  =  MOL.PLANT_FK_KEY
4511 AND MOL.SYSTEM_FK_KEY  = SP.SYSTEM_PK_KEY
4512 AND STG.SOURCE_ORG_CODE = MOL.ORGANIZATION_CODE
4513 AND  NVL(STG.SYSTEM_FK, MTH_UTIL_PKG.MTH_UA_GET_VAL()  )   = SP.SYSTEM_PK  (+)
4514 AND FL1.LOOKUP_TYPE  ='MTH_GRAVEYARD_SHIFT_TYPE'
4515 AND FL1.LANGUAGE   = USERENV('LANG')
4516 AND FL1.ENABLED_FLAG ='Y'
4517 AND FL1.MEANING =NVL(STG.GRAVEYARD_SHIFT,'Shift End Date')
4518 AND FL2.LOOKUP_TYPE  ='MTH_SHIFT_TYPE'
4519 AND FL2.LANGUAGE   = USERENV('LANG')
4520 AND FL2.ENABLED_FLAG ='Y'
4521 AND NVL( STG.SHIFT_TYPE ,'Production Shift') = FL2.MEANING
4522 AND  STG.processing_flag = v_processing_flag
4523 AND STG.ERR_CODE IS NULL );
4524 
4525  mth_util_pkg.log_msg('Number of rows inserted in mth_workday_shifts_D - ' || SQL%ROWCOUNT, mth_util_pkg.G_DBG_ROW_CNT);
4526 
4527 
4528     INSERT INTO MTH_WORKDAY_SHIFTS_D
4529       (SHIFT_WORKDAY_PK_KEY,
4530       SHIFT_WORKDAY_PK,
4531       SHIFT_DATE,
4532       SHIFT_DATE_JULIAN,
4533       PLANT_FK_KEY,
4534       SYSTEM_FK_KEY,
4535       USER_ATTR1,
4536       USER_ATTR2,
4537       USER_ATTR3,
4538       USER_ATTR4,
4539       USER_ATTR5,
4540       USER_MEASURE1,
4541       USER_MEASURE2,
4542       USER_MEASURE3,
4543       USER_MEASURE4,
4544       USER_MEASURE5,
4545       CREATION_DATE,
4549       FROM_DATE,
4546       LAST_UPDATE_DATE,
4547       CREATION_SYSTEM_ID,
4548       LAST_UPDATE_SYSTEM_ID,
4550       TO_DATE,
4551       SHIFT_NUM,
4552       SHIFT_NAME,
4553       SOURCE_ORG_CODE,
4554       SHIFT_TYPE,
4555       GRAVEYARD_SHIFT)
4556 
4557       (SELECT MTH_WORKDAYS_SHIFTS_S.NEXTVAL,
4558       TO_CHAR( CATCH_ALL.DAY,'yyyymmdd-hh24:mi:ss') ||'-'|| PD.PLANT_PK || MTH_UTIL_PKG.MTH_UA_GET_VAL(),
4559       CATCH_ALL.DAY,
4560         TO_NUMBER(TO_CHAR( CATCH_ALL.DAY ,'J')),
4561   PD.plant_pk_key,
4562     NVL( SP.SYSTEM_PK_KEY ,  MTH_UTIL_PKG.MTH_UA_GET_VAL()    ),
4563      NULL,
4564        NULL,
4565   NULL,
4566  NULL,
4567  NULL,
4568   NULL,
4569  NULL,
4570  NULL,
4571  NULL,
4572  NULL,
4573 SYSDATE,
4574       SYSDATE,
4575       NVL( SP.SYSTEM_PK_KEY ,  MTH_UTIL_PKG.MTH_UA_GET_VAL()    ),
4576       NVL( SP.SYSTEM_PK_KEY ,  MTH_UTIL_PKG.MTH_UA_GET_VAL()    ),
4577   NULL,
4578  NULL,
4579   NULL,
4580 MTH_UTIL_PKG.GET_PROFILE_VAL('MTH_CATCH_ALL_NAME'),
4581       STG.SOURCE_ORG_CODE,
4582  'BOTH' ,
4583 NULL
4584 FROM
4585     ( SELECT DISTINCT SHIFT_DATE,SOURCE_ORG_CODE,system_fk from
4586  MTH_WORKDAY_SHIFTS_STG  STG where  STG.processing_flag = v_processing_flag
4587 AND STG.ERR_CODE IS NULL
4588 )  STG ,MTH_SYSTEMS_SETUP  SP,MTH_PLANTS_D  PD,MTH_ORGANIZATIONS_L  MOL,(SELECT DISTINCT DAY FROM(SELECT DAY FROM MTH_445_PERIOD_CALENDAR
4589 UNION
4590 SELECT DAY FROM MTH_GREGORIAN_CALENDAR
4591 UNION
4592 SELECT  REPORT_DATE DAY FROM MTH_DAY_D   )) CATCH_ALL
4593     WHERE  NVL ( STG.SYSTEM_FK , MTH_UTIL_PKG.MTH_UA_GET_VAL ) = SP.SYSTEM_PK
4594 AND NVL(PD.TO_DATE,SYSDATE)  >= TRUNC(SYSDATE)
4595 AND PD.PLANT_PK_KEY  =  MOL.PLANT_FK_KEY
4596 AND MOL.SYSTEM_FK_KEY  = SP.SYSTEM_PK_KEY
4597 AND STG.SOURCE_ORG_CODE = MOL.ORGANIZATION_CODE
4598 AND CATCH_ALL.DAY    =     stg.SHIFT_DATE
4599  );
4600 
4601  mth_util_pkg.log_msg('Number of catch all rows inserted in mth_workday_shifts_D - ' || SQL%ROWCOUNT, mth_util_pkg.G_DBG_ROW_CNT);
4602 
4603     mth_util_pkg.truncate_table_partition(' MTH_WORKDAY_SHIFTS_STG',v_processing_flag);
4604 
4605         mth_util_pkg.log_msg('MTH_WORKDAY_SHIFTS_SF end', mth_util_pkg.G_DBG_PROC_FUN_END);
4606         mth_util_pkg.refresh_mv('MTH_SHIFT_GREGORIAN_DENORM_MV','f',null,null,null,null,null,null,null);
4607       COMMIT;
4608         ELSE
4609              mth_util_pkg.log_msg('There are no records in MTH_WORKDAY_SHIFTS_STG for processing');
4610              END IF ;
4611 
4612 
4613 EXCEPTION
4614     WHEN OTHERS THEN
4615         --Call logging API and then throw exception
4616         mth_util_pkg.log_msg('Exception OTHERS in MTH_WORKDAY_SHIFTS_SF', mth_util_pkg.G_DBG_EXCEPTION);
4617         mth_util_pkg.log_msg(substr(sqlerrm,1,300), mth_util_pkg.G_DBG_EXCEPTION);
4618         mth_util_pkg.log_msg(sqlcode, mth_util_pkg.G_DBG_EXCEPTION);
4619         ROLLBACK;
4620         RAISE;
4621 
4622 
4623   END MTH_WORKDAY_SHIFTS_SF;
4624 
4625 /* ****************************************************************************
4626 * Procedure		:MTH_RESET_SEQUENCE	   			      *
4627 * Description 	 	:This procedure is used to reset the sequence in the  *
4628 * specified schema.                                                           *
4629 * File Name	 	:MTHUTILS.PLS		             		      *
4630 * Visibility		:Public                				      *
4631 * Parameters	 	:Table name , schema name                  	      *
4632 * Modification log	:						      *
4633 *			Author		Date			Change	      *
4634 *     Akanksha verma       April-17-2012    Initial Creation      *
4635 **************************************************************************** */
4636 
4637 PROCEDURE mth_Reset_sequence(p_seq_name IN VARCHAR2,v_schema_name IN VARCHAR2) IS
4638 
4639 --initialize variables here
4640 v_stmt VARCHAR2(2000);
4641 
4642 TYPE cur_typ IS REF CURSOR;
4643 
4644   c cur_typ;
4645   v_seq_val NUMBER;
4646 -- main body
4647 BEGIN
4648 
4649 --Prepare the truncate statement using schema name and table name
4650    v_stmt := 'SELECT ' || p_seq_name || '.nextval FROM dual';
4651     OPEN c FOR v_stmt;
4652     FETCH c INTO v_seq_val;
4653     CLOSE c;
4654     IF(v_seq_val > 1)
4655     THEN
4656       v_stmt := 'ALTER SEQUENCE ' || V_SCHEMA_NAME || '.' || p_seq_name || ' MAXVALUE ' || v_seq_val || ' CYCLE NOCACHE';
4657 
4658       EXECUTE IMMEDIATE v_stmt;
4659 
4660       v_stmt := 'SELECT ' || p_seq_name || '.nextval FROM dual';
4661       OPEN c FOR v_stmt;
4662       FETCH c INTO v_seq_val;
4663       CLOSE c;
4664       v_stmt := 'ALTER SEQUENCE ' || V_SCHEMA_NAME || '.' || p_seq_name || ' MAXVALUE 2147483647 NOCYCLE CACHE 20';
4665 
4666       EXECUTE IMMEDIATE v_stmt;
4667     END IF;
4668 
4669 
4670 END mth_Reset_sequence;
4671 
4672 /* ****************************************************************************
4673 * Procedure		:		   			      *
4674 * Description 	 	:This procedure is used to truncate table,materialized view
4675 * and reset sequence in the  specified schema based on input parameter as MTH,
4676 * SSDM or ALL.                                                           *
4677 * File Name	 	:MTHUTILS.PLS		             		      *
4678 * Visibility		:Public                				      *
4679 * Parameters	 	:Table name , schema name                  	      *
4680 * Modification log	:						      *
4681 *			Author		Date			Change	      *
4682 *     Akanksha verma       April-17-2012    Initial Creation      *
4683 **************************************************************************** */
4684 
4685 PROCEDURE CLEAN_UP_TABLE_DATA(p_err_buff        OUT NOCOPY VARCHAR2,
4686                               p_retcode         OUT NOCOPY NUMBER,
4687                               P_PROD_TO_BE_CLEANUP IN VARCHAR2)
4688 	IS
4689 
4690   CURSOR c_tabs (p_lookup_type IN varchar2) IS
4691   SELECT  LOOKUP_CODE
4692   FROM    FND_LOOKUP_Values
4693   WHERE   LOOKUP_TYPE=p_lookup_type
4694   AND     DESCRIPTION = 'TABLE'
4695   AND     LANGUAGE = userenv('LANG');
4696 
4697   CURSOR c_seqs (p_lookup_type IN varchar2) IS
4698   SELECT  LOOKUP_CODE
4699   FROM    FND_LOOKUP_Values
4700   WHERE   LOOKUP_TYPE=p_lookup_type
4701   AND     DESCRIPTION = 'SEQUENCE'
4702   AND     LANGUAGE = userenv('LANG');
4703 
4704   CURSOR c_mvs (p_lookup_type IN varchar2) IS
4705   SELECT  LOOKUP_CODE
4706   FROM    FND_LOOKUP_Values
4707   WHERE   LOOKUP_TYPE=p_lookup_type
4708   AND     DESCRIPTION = 'MVIEW'
4709   AND     LANGUAGE = userenv('LANG');
4710 
4711   v_lookup_type VARCHAR2(100);
4712   v_schema_name VARCHAR2(100);
4713   v_status      VARCHAR2(30) ;
4714   v_industry    VARCHAR2(30) ;
4715 
4716 
4717 BEGIN
4718  mth_util_pkg.log_msg('MAIN start', mth_util_pkg.G_DBG_PROC_FUN_START);
4719 
4720   If P_PROD_TO_BE_CLEANUP = 'ALL' THEN
4721     v_lookup_type := 'MTH_ALL_CLEANUP_LIST';
4722   elsIf P_PROD_TO_BE_CLEANUP = 'MOC' THEN
4723     v_lookup_type := 'MTH_MOC_CLEANUP_LIST';
4724   elsIf P_PROD_TO_BE_CLEANUP = 'SSDM' THEN
4725     v_lookup_type := 'MTH_SSDM_CLEANUP_LIST';
4726   End If;
4727 
4728 IF (FND_INSTALLATION.GET_APP_INFO(
4729               application_short_name => 'MTH'
4730             , status                 => v_status
4731             , industry               => v_industry
4732             , oracle_schema          => v_schema_name))
4733 THEN
4734 
4735   FOR r_tab IN c_tabs(v_lookup_type) LOOP
4736 
4737     mth_util_pkg.mth_truncate_table(r_tab.LOOKUP_CODE,v_schema_name);
4738 
4739   END LOOP;
4740 
4741   FOR r_seq IN c_seqs(v_lookup_type) LOOP
4742 
4743     mth_util_pkg.mth_Reset_sequence(r_seq.LOOKUP_CODE,v_schema_name);
4744 
4745   END LOOP;
4746 
4747   FOR r_mv IN c_mvs(v_lookup_type) LOOP
4748 
4749     Dbms_Mview.REFRESH(r_mv.LOOKUP_CODE, 'C', '', FALSE, FALSE, 0, 0, 0, TRUE);
4750 
4751   END LOOP;
4752 
4753   DELETE FROM MTH_RUN_LOG rl
4754   WHERE exists (
4755         SELECT  1
4756         FROM    FND_LOOKUP_VALUES lv
4757         WHERE   lv.LOOKUP_TYPE=v_lookup_type
4758         AND     lv.DESCRIPTION = 'TABLE'
4759         AND     lv.LANGUAGE = userenv('LANG')
4760         AND     lv.LOOKUP_CODE like rl.FACT_TABLE || '%');
4761   commit;
4762 
4763   p_retcode := 0;
4764   mth_util_pkg.log_msg('MAIN end', mth_util_pkg.G_DBG_PROC_FUN_END);
4765 
4766 END IF;
4767 
4768 EXCEPTION
4769 WHEN OTHERS THEN
4770     mth_util_pkg.log_msg('Exception in CLEAN_UP_TABLE_DATA.', mth_util_pkg.G_DBG_EXCEPTION);
4771  mth_util_pkg.log_msg('Unknown Exception occured while processing');
4772     mth_util_pkg.log_msg(-20001, mth_util_pkg.G_DBG_EXCEPTION);
4773  p_retcode := 2;
4774  p_err_buff := mth_util_pkg.G_DBG_EXCEPTION;
4775  RAISE;
4776 
4777 END CLEAN_UP_TABLE_DATA;
4778 
4779 
4780 
4781 
4782 
4783 
4784 /*****************************************************************************
4785  * Procedure   : Get_Processing_Flag                                         *
4786  * Description : Returns the value of variable G_PROCESSING_FLAG.            *
4787  *               Used in ODI IKM for SF interfaces                           *
4788  * File Name   : MTHUTILB.pls                                                *
4789  * Visibility  : Public                                                      *
4790  * Parameters  :                                                             *
4791  *****************************************************************************/
4792 FUNCTION Get_Processing_Flag(p_table_name IN VARCHAR2 DEFAULT 'default') RETURN NUMBER IS
4793 v_flag VARCHAR2(100);
4794 v_schema_name VARCHAR2(100);
4795 v_status      VARCHAR2(30) ;
4796 v_industry    VARCHAR2(30) ;
4797 BEGIN
4798 	IF p_table_name = 'default' THEN
4799 		return mth_util_pkg.g_processing_flag;
4800 	ELSE
4801 		IF (FND_INSTALLATION.GET_APP_INFO(
4802               application_short_name => 'MTH'
4803             , status                 => v_status
4804             , industry               => v_industry
4805             , oracle_schema          => v_schema_name))
4806 		THEN
4807 
4808 			SELECT  c.DATA_DEFAULT
4809 			into v_flag
4810             FROM    user_synonyms s
4811             LEFT OUTER JOIN
4812                  (all_editioning_views ev
4813                   INNER JOIN all_editioning_view_cols evc
4814                   ON      evc.owner = ev.owner
4815                   AND     evc.view_name = ev.view_name)
4816             ON      ev.view_name = s.table_name
4817             AND     ev.owner = s.table_owner
4818             INNER JOIN all_tab_columns c
4819             ON      Nvl(ev.OWNER,s.table_owner) = c.owner
4820             AND     Nvl(ev.table_name,s.table_name) = c.table_name
4821             AND     Nvl(evc.TABLE_COLUMN_NAME,c.COLUMN_NAME) = c.COLUMN_NAME
4822             WHERE   s.synonym_name = p_table_name
4823             AND     Nvl(evc.TABLE_COLUMN_NAME,c.COLUMN_NAME) = 'PROCESSING_FLAG';
4824 /*
4825 			FROM    all_tab_columns c
4826 			WHERE   column_name = 'PROCESSING_FLAG'
4827 			AND  TABLE_NAME = p_table_name
4828 			AND owner = v_schema_name;
4829 */
4830 			IF v_flag = '1' THEN
4831 				return 2;
4832 			ELSE
4833 				return 1;
4834 			END IF;
4835 		END IF;
4836 	END IF;
4837 END Get_Processing_Flag;
4838 
4839 
4840 END mth_util_pkg;