DBA Data[Home] [Help]

PACKAGE BODY: APPS.MSC_WS_IO

Source


1 PACKAGE BODY MSC_WS_IO AS
2 /* $Header: MSCWIOPB.pls 120.5 2008/03/20 15:57:58 bnaghi noship $  */
3 
4 g_IGlbDmdSchTbl  MscIGlbIODmdSchTbl; -- store all global demand schediles data
5 g_ILocDmdSchTbl  MscILocIODmdSchTbl; -- store all local demand schediles data
6 g_ErrorCode      VARCHAR2(9);
7 
8 -- =============================================================
9 -- Desc: Please see package spec file for description
10 -- =============================================================
11 PROCEDURE  LAUNCH_IO_BATCH (
12                    processId                OUT NOCOPY NUMBER,
13                    status                   OUT NOCOPY VARCHAR2,
14                    userId                   IN  NUMBER,
15                    responsibilityId         IN  NUMBER,
16                    planId                   IN  NUMBER,
17                    anchorDate               IN  DATE,
18                    archiveCurrVersPlan IN VARCHAR2) AS
19 
20   l_error_tracking_num          NUMBER;
21   l_result                      VARCHAR2(30);
22   l_plan_name                   VARCHAR2(10);
23   l_org_id                      NUMBER;
24   l_sr_instance_id              NUMBER;
25   l_inventory_atp_flag          NUMBER;
26   l_production                  NUMBER;
27   l_release_resched             NUMBER;
28   l_24x7_purge                  NUMBER;
29   l_val_archivePlan         NUMBER;
30 
31 BEGIN
32 
33   l_error_tracking_num := 3010;
34 
35   -- ------------------------------------
36   -- validate and initialize apps
37   -- ------------------------------------
38   MSC_WS_COMMON.VALIDATE_USER_RESP(l_result, userId, responsibilityId);
39 
40   IF (l_result <> 'OK') THEN
41       processId := -1;
42       status := l_result;
43       RETURN;
44   END IF;
45 
46   l_error_tracking_num := 3020;
47 
48   -- ------------------------------------
49   -- validate planId
50   -- ------------------------------------
51 
52   BEGIN
53      SELECT plans.compile_designator, plans.organization_id, plans.sr_instance_id,
54             desig.inventory_atp_flag, desig.production
55      INTO   l_plan_name, l_org_id, l_sr_instance_id, l_inventory_atp_flag, l_production
56      FROM   msc_plans plans, msc_designators desig
57      WHERE  plans.curr_plan_type = 4
58      AND    plans.organization_id = desig.organization_id
59      AND    plans.sr_instance_id = desig.sr_instance_id
60      AND    plans.compile_designator = desig.designator
61      AND    NVL(desig.disable_date, TRUNC(SYSDATE) + 1) > TRUNC(SYSDATE)
62      AND    plans.organization_selection <> 1
63      AND    plans.plan_id = planId;
64 
65   EXCEPTION
66      WHEN no_data_found THEN
67         processId := -1;
68         status := 'INVALID_PLANID';
69         RETURN;
70   END;
71 
72   l_error_tracking_num := 3030;
73 
74   -- ------------------------------------
75   -- validate anchorDate
76   -- ------------------------------------
77   BEGIN
78     SELECT  'Y'
79     INTO    l_result
80     FROM    msc_calendar_dates dates,
81             msc_trading_partners mtp
82     WHERE   dates.calendar_code = mtp.calendar_code
83     AND     dates.exception_set_id = mtp.calendar_exception_set_id
84     AND     mtp.sr_instance_id = dates.sr_instance_id
85     AND     mtp.sr_tp_id = l_org_id
86     AND     mtp.sr_instance_id = l_sr_instance_id
87     AND     dates.calendar_date <= TRUNC(SYSDATE)
88     AND     dates.calendar_date = anchorDate;
89   EXCEPTION
90      WHEN no_data_found THEN
91         processId := -1;
92         status := 'INVALID_ANCHORDATE';
93         RETURN;
94   END;
95 
96 
97 l_error_tracking_num:= 3035;
98 
99      BEGIN
100        SELECT  decode(archiveCurrVersPlan, 'Y', msc_ws_common.sys_yes, msc_ws_common.sys_no)
101        INTO   l_val_archivePlan
102        FROM   dual;
103 
104      END;
105 
106   l_error_tracking_num := 3040;
107 
108   -- ------------------------------------
109   -- setting hidden parameters
110   -- ------------------------------------
111 
112   -- PLAN_TYPE_DUMMY hidden parameter
113   -- Original default logic is "SELECT inventory_atp_flag from msc_designators d
114   -- where d.designator = :$FLEX$.MSC_SRS_SRO_NAME_LAUNCH_1 and d.inventory_atp_flag = 1"
115   -- Which pretty much meant this flag is set to either NULL or 1
116   IF (l_inventory_atp_flag  <> 1) THEN l_inventory_atp_flag := NULL;
117   END IF;
118 
119 
120   -- MSC_24X7 hidden parameter
121   -- Original default logic is "Select meaning From Mfg_Lookups Where Lookup_Type = 'MSC_24X7_PURGE'
122   --                             AND (DECODE(NVL(:$FLEX$.FND_CHAR240,2),2,2,1)=2 OR LOOKUP_CODE=2
123   -- Where FND_CHAR240 was referring to l_inventory_atp_flag variable.  This is tricky since
124   -- if l_inventory_atp_flag is NULL, the above query will return 2 values, which invalidates the
125   -- default logic (since default logic can only return 1 value) resulting in default value being NULL
126   -- Most likely, this is some kinda of faulty logic in conc program definition
127   IF (l_inventory_atp_flag is NULL)
128   THEN l_24x7_purge := NULL;
129   ELSE l_24x7_purge := 2;
130   END IF;
131 
132   -- RESCHEDULE_DUMMY parameter
133   -- Similar default logic as l_inventory_atp, "SELECT production from msc_designators d
134   -- where d.designator = :$FLEX$.MSC_SRS_SRO_NAME_LAUNCH_1 and d.production = 1"
135   IF (l_production  <> 1)
136   THEN l_production := NULL;
137   END IF;
138 
139   -- Similar logic as l_24x7_purge
140   IF (l_production is NULL)
141   THEN l_release_resched := NULL;
142   ELSE l_release_resched := 2;
143   END IF;
144 
145 
146   l_error_tracking_num := 3050;
147 
148   -- ------------------------------------
149   -- Launch conc program
150   -- ------------------------------------
151   processId := FND_REQUEST.SUBMIT_REQUEST(
152      'MSC',                                    -- application
153      'MSCSLPPR4',                              -- program
154      NULL,                                     -- description
155      NULL,                                     -- start_time
156      FALSE,                                    -- sub_request
157      l_plan_name,                              -- plan name, argument 1
158      planId,                                   -- plan name hidden, argument 2
159      to_char(msc_ws_common.sys_yes),           -- launch snapshot, argument 3, set to Yes always
160      to_char(msc_ws_common.sys_yes),           -- launch planner, argument 4, set to Yes always
161      to_char(msc_ws_common.sys_no),            -- netchange, argument 5, set to No always
162      fnd_date.date_to_chardate(anchorDate),    -- anchor date, argument 6
163      l_val_archivePlan,
164      l_inventory_atp_flag,                          -- plan type dummy, argument 7
165      l_24x7_purge,                             -- msc 24x7, argument 8
166      l_production,                             -- reschedule dummy, argument 9
167      l_release_resched);                       -- release rescheduled, argument 10
168 
169   IF (processId = 0) THEN
170     processId := -1;
171     status := 'ERROR_SUBMIT';
172     return;
173   END IF;
174 
175   status := 'SUCCESS';
176 
177 EXCEPTION
178   WHEN others THEN
179     status := 'ERROR_UNEXPECTED_'||l_error_tracking_num;
180     processId := -1;
181     return;
182 
183 END LAUNCH_IO_BATCH;
184 
185 
186 PROCEDURE  LAUNCH_IO_BATCH_PUBLIC (
187                    processId              OUT NOCOPY NUMBER,
188 		   status                 OUT NOCOPY VARCHAR2,
189 		   UserName               IN VARCHAR2,
190 		   RespName     IN VARCHAR2,
191 		   RespApplName IN VARCHAR2,
192 		   SecurityGroupName      IN VARCHAR2,
193 		   Language            IN VARCHAR2,
194                    planId                   IN  NUMBER,
195                    anchorDate               IN  DATE,
196                    archiveCurrVersPlan IN VARCHAR2)AS
197   userid    number;
198   respid    number;
199   l_String VARCHAR2(30);
200   error_tracking_num number;
201   l_SecutirtGroupId  NUMBER;
202  BEGIN
203    error_tracking_num :=2010;
204     MSC_WS_COMMON.GET_PERMISSION_IDS(l_String, userid, respid, l_SecutirtGroupId, UserName, RespName, RespApplName, SecurityGroupName, Language);
205     IF (l_String <> 'OK') THEN
206         Status := l_String;
207         RETURN;
208     END IF;
209 
210      error_tracking_num :=2030;
211 
212      MSC_WS_COMMON.VALIDATE_USER_RESP_FUNC(l_String, userid, respid, 'MSCFNSCW-SRO',l_SecutirtGroupId);
213    IF (l_String <> 'OK') THEN
214     MSC_WS_COMMON.VALIDATE_USER_RESP_FUNC(l_String, userid, respid, 'MSCFPCMN-SRO', l_SecutirtGroupId);
215        IF (l_String <> 'OK') THEN
216        MSC_WS_COMMON.VALIDATE_USER_RESP_FUNC(l_String, userid, respid, 'MSC_ORG_FNDRSRUN_LAUNCH_SRO',l_SecutirtGroupId);
217        IF (l_String <> 'OK') THEN
218        Status := l_String;
219        RETURN;
220     END IF;
221     END IF;
222     END IF;
223     error_tracking_num :=2040;
224 
225    LAUNCH_IO_BATCH ( processId, status, userId ,respid, planId , anchorDate, archiveCurrVersPlan );
226    --      dbms_output.put_line('USERID=' || userid);
227 
228 
229       EXCEPTION
230       WHEN others THEN
231          status := 'ERROR_UNEXPECTED_'||error_tracking_num;
232 
233          return;
234 END  LAUNCH_IO_BATCH_PUBLIC;
235 
236 
237 -- =============================================================
238 --
239 -- SET_IO_PLAN_OPTIONS and its private helper functions.
240 --
241 -- Un-handled exceptions generate error tokens in the
242 -- format of ERROR_UNEXPECTED_#####.
243 -- The possible values are:
244 --   00301 - SET_IO_PLAN_OPTIONS/VALIDATE_PLAN_ID
245 --   00302 - SET_IO_PLAN_OPTIONS/VALIDATE_PLAN_TYPE
246 --   00303 - SET_IO_PLAN_OPTIONS/MSC_WS_COMMON.VALIDATE_SIMULATION_SET_ID
247 --   00304 - SET_IO_PLAN_OPTIONS/VALIDATE_SER_LVL_SET_ID
248 --   00305 - SET_IO_PLAN_OPTIONS/VALIDATE_GLB_DMD_SCHS/VALIDATE_G_DMD_SCH_ID
249 --   00306 - SET_IO_PLAN_OPTIONS/VALIDATE_GLB_DMD_SCHS/VALIDATE_CONSUM_LVL (goe)
250 --         - SET_IO_PLAN_OPTIONS/VALIDATE_LOC_DMD_SCHS/VALIDATE_CONSUM_LVL (goe)
251 --   00307 - SET_IO_PLAN_OPTIONS/VALIDATE_GLB_DMD_SCHS/VALIDATE_CONSUM_LVL (item)
252 --         - SET_IO_PLAN_OPTIONS/VALIDATE_LOC_DMD_SCHS/VALIDATE_CONSUM_LVL (item)
253 --   -- 00308 - SET_IO_PLAN_OPTIONS/VALIDATE_GLB_DMD_SCHS/VALIDATE_G_VARIABILITY/VALIDATE_G_VARIABILITY_ID
254 --   00309 - SET_IO_PLAN_OPTIONS/VALIDATE_LOC_DMD_SCHS/MSC_WS_COMMON.PLAN_CONTAINS_THIS_ORG
255 --   00310 - SET_IO_PLAN_OPTIONS/VALIDATE_LOC_DMD_SCHS/VALIDATE_L_DMD_SCH_ID
256 --   00311 - SET_IO_PLAN_OPTIONS/MSC_WS_COMMON.PURGE_ALL_SCHEDULES
257 --   00312 - SET_IO_PLAN_OPTIONS/UPDATE_PLAN_OPTIONS
258 --   00313 - SET_IO_PLAN_OPTIONS/INSERT_ALL_SCHEDULES/INSERT_GLB_DMD_SCHEDULE
259 --           SET_IO_PLAN_OPTIONS/INSERT_OR_UPDATE_ALL_SCHS/INSERT_GLB_DMD_SCHEDULE
260 --   00314 - SET_IO_PLAN_OPTIONS/INSERT_ALL_SCHEDULES/INSERT_LOC_DMD_SCHEDULE
261 --         - SET_IO_PLAN_OPTIONS/INSERT_OR_UPDATE_ALL_SCHS/INSERT_LOC_DMD_SCHEDULE
262 --   00315 - SET_IO_PLAN_OPTIONS/INSERT_OR_UPDATE_ALL_SCHS
263 --   00316 - SET_IO_PLAN_OPTIONS/INSERT_OR_UPDATE_ALL_SCHS/UPDATE_GLB_DMD_SCHEDULE
264 --   00317 - SET_IO_PLAN_OPTIONS/INSERT_OR_UPDATE_ALL_SCHS
265 --   00318 - SET_IO_PLAN_OPTIONS/INSERT_OR_UPDATE_ALL_SCHS/UPDATE_LOC_DMD_SCHEDULE
266 -- =============================================================
267 
268 -- =============================================================
269 -- Desc: Validate plan id, copy the where clause from LAUNCH_IO_BATCH
270 --
271 -- Input:
272 --       PlanId            Plan Id.
273 --
274 -- Output: The possible return statuses are:
275 --         OK
276 --         INVALID_PLANID
277 -- =============================================================
278 FUNCTION VALIDATE_PLAN_ID(
279         OrgId              OUT NOCOPY NUMBER,
280         InsId              OUT NOCOPY NUMBER,
281         PlanName           OUT NOCOPY VARCHAR2,
282         PlanId             IN         NUMBER
283         ) RETURN VARCHAR2 AS
284 l_ReturnString    VARCHAR2(100);
285 BEGIN
286     BEGIN
287         SELECT
288             plans.organization_id,
289             plans.sr_instance_id,
290             plans.compile_designator
291         INTO
292             OrgId,
293             InsId,
294             PlanName
295         FROM
296             msc_plans       plans,
297             msc_designators desig
298         WHERE
299             plans.organization_id = desig.organization_id AND
300             plans.sr_instance_id = desig.sr_instance_id AND
301             plans.compile_designator = desig.designator AND
302             NVL(desig.disable_date, TRUNC(SYSDATE) + 1) > TRUNC(SYSDATE) AND
303             plans.organization_selection <> 1 AND
304             plans.curr_plan_type in (1,2,3,4,5,8,9) AND
305             plans.plan_id <> -1 AND
306             -- NVL(plans.copy_plan_id,-1) = -1 AND
307             -- NVL(desig.copy_designator_id, -1) = -1 AND
308             plans.plan_id = PlanId;
309         EXCEPTION WHEN NO_DATA_FOUND THEN
310             RETURN 'INVALID_PLANID';
311         WHEN others THEN
312             g_ErrorCode := 'ERROR_UNEXPECTED_00301';
313             raise;
314     END;
315 
316     RETURN 'OK';
317 END VALIDATE_PLAN_ID;
318 
319 -- =============================================================
320 -- Desc: Validate plan type is IO
321 -- Input:
322 --       PlanId            plan id.
323 --
324 -- Output: The possible return statuses are:
325 --         OK
326 --         INVALID_PLAN_TYPE
327 -- =============================================================
328 FUNCTION VALIDATE_PLAN_TYPE( PlanId IN  NUMBER ) RETURN VARCHAR2 AS
329 l_Dummy           NUMBER;
330 BEGIN
331     BEGIN
332         SELECT
333             1 INTO l_Dummy
334         FROM
335             msc_plans
336         WHERE
337             curr_plan_type = 4 AND
338             plan_id = PlanId;
339         EXCEPTION WHEN NO_DATA_FOUND THEN
340             RETURN 'INVALID_PLAN_TYPE';
341         WHEN others THEN
342             g_ErrorCode := 'ERROR_UNEXPECTED_00302';
343             raise;
344     END;
345 
346     RETURN 'OK';
347 END VALIDATE_PLAN_TYPE;
348 
349 -- =============================================================
350 -- Desc: Validate Service Level set id.
351 -- Input:
352 --       SetId             Service level set Id.
353 --
354 -- Output: The possible return statuses are:
355 --         OK
356 --         INVALID_SERVICE_LVL_SET_ID
357 -- =============================================================
358 FUNCTION VALIDATE_SER_LVL_SET_ID( SetId IN  NUMBER ) RETURN VARCHAR2 AS
359 l_Dummy           NUMBER;
360 BEGIN
361     IF SetId IS NOT NULL THEN
362         BEGIN
363             SELECT
364                1 INTO l_Dummy
365             FROM
366                 msc_service_level_sets
367             WHERE
368                 service_level_set_id = SetId;
369             EXCEPTION WHEN NO_DATA_FOUND THEN
370                 RETURN 'INVALID_SERVICE_LVL_SET_ID';
371             WHEN others THEN
372                 g_ErrorCode := 'ERROR_UNEXPECTED_00304';
373                 raise;
374         END;
375     END IF;
376 
377     RETURN 'OK';
378 END VALIDATE_SER_LVL_SET_ID;
379 
380 -- =============================================================
381 -- Desc: Validate global demand schedule id
382 -- Input:
383 --       SchId             global demand schedule id.
384 --       PlanName          plan name.
385 --
386 -- Output: The possible return statuses are:
387 --         OK
388 --         INVALID_GLOBALDMDSCHS_DMD_SCH_ID
389 -- =============================================================
390 FUNCTION VALIDATE_G_DMD_SCH_ID(
391         ErrorType          OUT NOCOPY VARCHAR2,
392         SchId              IN         NUMBER,
393         PlanName           IN         VARCHAR2
394         ) RETURN VARCHAR2 AS
395 BEGIN
396     BEGIN
397         SELECT
398             error_type INTO ErrorType
399         FROM
400             msd_dp_ascp_scenarios_v
401         WHERE
402             global_scenario_flag = 'Y' AND
403             scenario_name <> PlanName AND
404             scenario_id = SchId AND
405             last_revision IS NOT NULL;
406         EXCEPTION WHEN NO_DATA_FOUND THEN
407             RETURN 'INVALID_GLOBALDMDSCHS_DMD_SCH_ID';
408         WHEN others THEN
409             g_ErrorCode := 'ERROR_UNEXPECTED_00305';
410             raise;
411     END;
412 
413     RETURN 'OK';
414 END VALIDATE_G_DMD_SCH_ID;
415 
416 -- =============================================================
417 -- Desc: Validate the ship to consumption level. This function is
418 --       used by IO only. DRP and SRP have their own function in
419 --       MSC_WS_COMMON. ASCP has its own in MSC_WS_ASCP.
420 -- Input:
421 --       ShipTo                Ship to consumption level.
422 --       SchId                 Demand schedule id.
423 --
424 -- Output: The possible return statuses are:
425 --         OK
426 --         INVALID_SHIP_TO_CONSUMPTION_LVL
427 -- =============================================================
428 FUNCTION VALIDATE_CONSUM_LVL(
429         ShipTo             IN         NUMBER,
430         SchId              IN         NUMBER
431 ) RETURN VARCHAR2 AS
432 l_scenario_lvl_geo  NUMBER;
433 l_scenario_lvl_item NUMBER;
434 BEGIN
435     BEGIN
436         SELECT level_id INTO l_scenario_lvl_geo
437         FROM   msd_dp_scenario_output_levels
438         WHERE  scenario_id = SchId AND level_id in (11,15,41,42,30);
439         EXCEPTION WHEN NO_DATA_FOUND THEN
440             l_scenario_lvl_geo := 30;
441         WHEN others THEN
442             g_ErrorCode := 'ERROR_UNEXPECTED_00306';
443             raise;
444     END;
445 
446     BEGIN
447         SELECT level_id INTO l_scenario_lvl_item
448         FROM   msd_dp_scenario_output_levels
449         WHERE  scenario_id = SchId AND level_id in (34,40);
450         EXCEPTION WHEN NO_DATA_FOUND THEN
451             l_scenario_lvl_item := 40;
452         WHEN others THEN
453             g_ErrorCode := 'ERROR_UNEXPECTED_00307';
454             raise;
455     END;
456 
457     /*
458     2    Ship
459     3    Bill
460     4    Customer
461     5    Region
462     6    Item
463     7    Customer Site
464     8    Zone
465     9    Customer Zone
466     10   Demand Class
467     */
468 -- dbms_output.put_line('SchId: ' || SchId);
469 -- dbms_output.put_line('l_scenario_lvl_item: ' || l_scenario_lvl_item);
470 -- dbms_output.put_line('l_scenario_lvl_geo: ' || l_scenario_lvl_geo);
471 
472     IF l_scenario_lvl_item = 40 THEN
473         IF l_scenario_lvl_geo = 11 THEN
474             -- simulate the logic from Record Groups 'MSC_SHIP_TO_CS_ALL'
475             IF ShipTo NOT IN (4, 6, 7, 9) THEN -- Item, Customer, Customer Zone, Customer Site
476                 RETURN 'INVALID_SHIP_TO_CONSUMPTION_LVL';
477             END IF;
478         ELSIF l_scenario_lvl_geo = 15 THEN
479             -- simulate the logic from Record Groups 'MSC_SHIP_TO_C_ALL'
480             IF ShipTo NOT IN (4, 6) THEN -- Item, Customer
481                 RETURN 'INVALID_SHIP_TO_CONSUMPTION_LVL';
482             END IF;
483         ELSIF l_scenario_lvl_geo = 42 then
484             -- simulate the logic from Record Groups 'MSC_SHIP_TO_Z_ALL'
485             IF ShipTo NOT IN (6, 8) THEN -- Item, Zone
486                 RETURN 'INVALID_SHIP_TO_CONSUMPTION_LVL';
487             END IF;
488         ELSIF l_scenario_lvl_geo = 41 THEN
489             -- simulate the logic from Record Groups 'MSC_SHIP_TO_CZ_ALL'
490             IF ShipTo NOT IN (4, 6, 8, 9) THEN -- Item, Customer, Customer Zone, Zone
491                 RETURN 'INVALID_SHIP_TO_CONSUMPTION_LVL';
492             END IF;
493         ELSIF l_scenario_lvl_geo = 30 THEN
494             -- simulate the logic from Record Groups 'MSC_SHIP_TO_ALL_ALL'
495             IF ShipTo <> 6 THEN -- Item'
496                 RETURN 'INVALID_SHIP_TO_CONSUMPTION_LVL';
497             END IF;
498         ELSE
499             -- ???? use the default record group ?????
500             -- simulate the logic from Record Groups 'MSC_SHIP_TO_CS_ALL'
501             IF ShipTo NOT IN (4, 6, 7, 9) THEN -- Item, Customer, Customer Zone, Customer Site
502                 RETURN 'INVALID_SHIP_TO_CONSUMPTION_LVL';
503             END IF;
504         END IF;
505     ELSE -- IF l_scenario_lvl_item <> 40 THEN
506         IF l_scenario_lvl_geo = 11 THEN
507             -- simulate the logic from Record Groups 'MSC_SHIP_TO_CS_DC'
508             IF ShipTo NOT IN (4, 6, 7, 9, 10) THEN -- Item, Customer, Demand Class, Customer Zone, Customer Site
509                 RETURN 'INVALID_SHIP_TO_CONSUMPTION_LVL';
510             END IF;
511         ELSIF l_scenario_lvl_geo = 15 THEN
512             -- simulate the logic from Record Groups 'MSC_SHIP_TO_C_DC'
513             IF ShipTo NOT IN (4, 6, 10) THEN -- Item, Customer, Demand Class
514                 RETURN 'INVALID_SHIP_TO_CONSUMPTION_LVL';
515             END IF;
516         ELSIF l_scenario_lvl_geo = 42 THEN
517             -- simulate the logic from Record Groups 'MSC_SHIP_TO_Z_DC'
518             IF ShipTo NOT IN (6, 8, 10) THEN -- Item, Demand Class, Zone
519                 RETURN 'INVALID_SHIP_TO_CONSUMPTION_LVL';
520             END IF;
521         ELSIF l_scenario_lvl_geo = 41 THEN
522             -- simulate the logic from Record Groups 'MSC_SHIP_TO_CZ_DC'
523             IF ShipTo NOT IN (4, 6, 8, 9, 10) THEN -- Item', Customer, Customer Zone, Zone, Demand Class
524                 RETURN 'INVALID_SHIP_TO_CONSUMPTION_LVL';
525             END IF;
526         ELSIF l_scenario_lvl_geo = 30 THEN
527             -- simulate the logic from Record Groups 'MSC_SHIP_TO_ALL_DC'
528             IF ShipTo NOT IN (6, 10) THEN -- Item, Demand Class
529                 RETURN 'INVALID_SHIP_TO_CONSUMPTION_LVL';
530             END IF;
531         ELSE
532             -- ???? which record group should I use ?????
533             -- simulate the logic from Record Groups 'MSC_SHIP_TO_CS_DC'
534             IF ShipTo NOT IN (4, 6, 7, 9, 10) THEN -- Item, Customer, Demand Class, Customer Zone, Customer Site
535                 RETURN 'INVALID_SHIP_TO_CONSUMPTION_LVL';
536             END IF;
537         END IF;
538     END IF;
539 
540     RETURN 'OK';
541 END VALIDATE_CONSUM_LVL;
542 
543 -- =============================================================
544 -- Desc: Validate demand variability type
545 --
546 -- Input:
547 --       VarId                 demand variability type id.
548 --       DesigType
549 --
550 -- Output: The possible return statuses are:
551 --         OK
552 --         INVALID
553 -- =============================================================
554 FUNCTION VALIDATE_VARIABILITY_ID(
555         VarId              IN         NUMBER,
556         DesigType          IN         NUMBER
557         ) RETURN VARCHAR2 AS
558 BEGIN
559     IF VarId = 1 AND DesigType <> 7 THEN
560         RETURN 'INVALID'; -- caller has to overwrite this
561     ELSIF VarId < 1 OR VarId > 3 THEN
562         RETURN 'INVALID'; -- caller has to overwrite this
563     END IF;
564     RETURN 'OK';
565 END VALIDATE_VARIABILITY_ID;
566 
567 
568 -- =============================================================
569 -- Desc: Validate demand variability type and its dependance
570 -- Input:
571 --       SchRec            global demand schedule data.
572 --
573 -- Output: The possible return statuses are:
574 --         OK
575 --         INVALID_GLOBALDMDSCHS_VARIABILITY_TYPE
576 --         INVALID_GLOBALDMDSCHS_PROBABILITY
577 --         INVALID_GLOBALDMDSCHS_MEAN_ABS_PCT_ERROR
578 -- =============================================================
579 FUNCTION VALIDATE_G_VARIABILITY(SchRec IN MscGlbIODmdSchRec) RETURN VARCHAR2 AS
580 l_String          VARCHAR2(100);
581 BEGIN
582     l_String := VALIDATE_VARIABILITY_ID(SchRec.DmdVariabilityType, 7);
583     IF l_String <> 'OK' THEN
584         RETURN 'INVALID_GLOBALDMDSCHS_VARIABILITY_TYPE';
585     END IF;
586     BEGIN
587         CASE SchRec.DmdVariabilityType
588             WHEN 1 THEN -- Accuracy_Metric_MAD
589                 BEGIN
590                     -- probability can be null or in the range of 0 to 1
591                     IF SchRec.Probability IS NOT NULL THEN
592                         IF SchRec.Probability < 0 OR SchRec.Probability > 1 THEN
593                             RETURN 'INVALID_GLOBALDMDSCHS_PROBABILITY';
594                         END IF;
595                     END IF;
596                     -- mean absolute % error can be null or in the range of 0 to 100
597                     IF SchRec.MeanAbsPctError IS NOT NULL THEN
598                         IF SchRec.MeanAbsPctError < 0 OR SchRec.MeanAbsPctError > 100 THEN
599                             RETURN 'INVALID_GLOBALDMDSCHS_MEAN_ABS_PCT_ERROR';
600                         END IF;
601                     END IF;
602                 END;
603             WHEN 2 THEN -- 'Probability'
604                     -- probability is required and in the range of 0 to 1
605                     IF SchRec.Probability IS NULL THEN
606                         RETURN 'INVALID_GLOBALDMDSCHS_PROBABILITY';
607                     ELSE
608                         IF SchRec.Probability < 0 OR SchRec.Probability > 1 THEN
609                             RETURN 'INVALID_GLOBALDMDSCHS_PROBABILITY';
610                         END IF;
611                     END IF;
612                     -- mean absolute % error has to be null
613                     IF SchRec.MeanAbsPctError IS NOT NULL THEN
614                         RETURN 'INVALID_GLOBALDMDSCHS_MEAN_ABS_PCT_ERROR';
615                     END IF;
616             WHEN 3 THEN -- 'Mean_Absolute_Pct_Err'
617                     -- probability has to be null
618                     IF SchRec.Probability IS NOT NULL THEN
619                         RETURN 'INVALID_GLOBALDMDSCHS_PROBABILITY';
620                     END IF;
621                     -- mean absolute % error is required and in the range of 0 to 100
622                     IF SchRec.MeanAbsPctError IS NOT NULL THEN
623                         IF SchRec.MeanAbsPctError < 0 OR SchRec.MeanAbsPctError > 100 THEN
624                             RETURN 'INVALID_GLOBALDMDSCHS_MEAN_ABS_PCT_ERROR';
625                         END IF;
626                     END IF;
627         END CASE;
628     END;
629 
630     RETURN 'OK';
631 END VALIDATE_G_VARIABILITY;
632 
633 -- =============================================================
634 -- Desc: load global demand schedules
635 -- Input:
636 --       PurgeAll              Purge All Schs Flag
637 --       PlanId
638 --
639 -- Output: No output.
640 -- =============================================================
641 PROCEDURE LOAD_GLB_DMD_SCH_TBL(
642         SchTbl             OUT NOCOPY MscIDmdSchVarTbl,
643         PurgeAll           IN         VARCHAR2,
644         PlanId             IN         NUMBER
645         ) AS
646 cursor schedule_c(idPlan number) is
647 SELECT
648     sr_instance_id,
649     input_schedule_id,
650     demand_variability_type,
651     probability
652 FROM
653     msc_plan_schedules
654 WHERE
655     plan_id = idPlan AND
656     organization_id = -1;
657 
658 l_InsId           NUMBER;
659 l_SchedId         NUMBER;
660 l_VarType         NUMBER;
661 l_Probability     NUMBER;
662 BEGIN
663     SchTbl := MscIDmdSchVarTbl();
664     SchTbl.DELETE;
665     IF MSC_WS_COMMON.BOOL_TO_NUMBER(PurgeAll) = MSC_UTIL.SYS_NO THEN
666         BEGIN
667             OPEN schedule_c(PlanId);
668             LOOP
669                 FETCH schedule_c into l_InsId, l_SchedId, l_VarType, l_Probability;
670                 EXIT WHEN schedule_c%NOTFOUND;
671                 SchTbl.extend;
672                 SchTbl(SchTbl.count) :=
673                     MscIDmdSchVarRec(
674                               l_InsId,
675                               -1,
676                               l_SchedId,
677                               l_VarType,
678                               l_Probability
679                               );
680             END LOOP;
681             CLOSE schedule_c;
682         END;
683     END IF;
684 
685 END LOAD_GLB_DMD_SCH_TBL;
686 
687 -- =============================================================
688 -- Desc: All global demand schedules have the same variability type
689 --       If the the variability type is probability, the sun must equal to 1
690 -- Input:
691 --       InsId              Instance id
692 --
693 -- Output: The possible return statuses are:
694 --         OK
695 --         INVALID_VAR_TYPE_IN_GBL_SCH
696 --         INVALID_GLB_SUM_OF_PROB
697 -- =============================================================
698 FUNCTION VALIDATE_G_PROB(
699         PurgeAll           IN         VARCHAR2,
700         InsId              IN         NUMBER,
701         PlanId             IN         NUMBER
702         ) RETURN VARCHAR2 AS
703 l_String         VARCHAR2(100);
704 l_SchTbl         MscIDmdSchVarTbl;  -- global shedules in database
705 l_VarType        NUMBER;
706 l_Sum            NUMBER;
707 BEGIN
708     IF g_IGlbDmdSchTbl.COUNT > 0 THEN
709         -- get all global schedules from database and store them in l_SchTbl
710         LOAD_GLB_DMD_SCH_TBL(l_SchTbl, PurgeAll, PlanId);
711         l_VarType := -1;
712         l_Sum := 0;
713         FOR I in g_IGlbDmdSchTbl.first..g_IGlbDmdSchTbl.last
714             LOOP
715                 IF l_VarType = -1 THEN
716                     l_VarType := g_IGlbDmdSchTbl(I).DmdVariabilityType;
717                 ELSIF l_VarType <> g_IGlbDmdSchTbl(I).DmdVariabilityType THEN
718                     RETURN 'INVALID_VAR_TYPE_IN_GBL_SCH';
719                 END IF;
720                 IF l_VarType = 2 THEN
721                     l_Sum := l_Sum + g_IGlbDmdSchTbl(I).Probability;
722                 END IF;
723                 -- delete this demand schedule from l_SchTbl.
724                 IF l_SchTbl.COUNT > 0 THEN
725                     FOR J IN l_SchTbl.first..l_SchTbl.last
726                         LOOP
727                             BEGIN
728                                 IF l_SchTbl(J).InsId = InsId AND
729                                     l_SchTbl(J).SchId = g_IGlbDmdSchTbl(I).DmdSchId THEN
730                                     l_SchTbl.delete(J);
731                                     EXIT;
732                                 END IF;
733                                 EXCEPTION WHEN NO_DATA_FOUND THEN
734                                     NULL; -- skip, this element is deleted.
735                             END;
736                         END LOOP;
737                 END IF;
738             END LOOP;
739         IF l_SchTbl.COUNT > 0 THEN
740             FOR I IN l_SchTbl.first..l_SchTbl.last
741                 LOOP
742                     BEGIN
743                         IF l_SchTbl(I).DmdVariabilityType <> l_VarType THEN
744                             RETURN 'INVALID_VAR_TYPE_IN_GBL_SCH';
745                         ELSIF l_VarType = 2 THEN
746                             l_Sum := l_Sum + l_SchTbl(I).Probability;
747                         END IF;
748                         EXCEPTION WHEN NO_DATA_FOUND THEN
749                             NULL; -- skip, this element is deleted.
750                     END;
751                 END LOOP;
752         END IF;
753         -- test the sum
754         IF l_VarType = 2 AND l_Sum <> 1 THEN
755             RETURN 'INVALID_GBL_SUM_OF_PROB';
756         END IF;
757     END IF;
758     RETURN 'OK';
759 END VALIDATE_G_PROB;
760 
761 -- =============================================================
762 -- Desc: validate global demand schedules
763 -- Input:
764 --       SchTable              Global demand schedules.
765 --       PlanName              Plan name.
766 --
767 -- Output: The possible return statuses are:
768 --         OK
769 --         INVALID_GLOBALDMDSCHS_DMD_SCH_ID
770 --         INVALID_GLOBALDMDSCHS_SHP_TO_CONSUMPTION_LVL
771 -- =============================================================
772 FUNCTION VALIDATE_GLB_DMD_SCHS(
773         SchTable           IN         MscGlbIODmdSchTbl,
774         PlanId             IN         NUMBER,
775         PlanName           IN         VARCHAR2,
776         InsId              IN         NUMBER,
777         PurgeAll           IN         VARCHAR2
778         ) RETURN VARCHAR2 AS
779 l_String          VARCHAR2(100);
780 l_ErrorType       VARCHAR2(30);
781 BEGIN
782     IF SchTable IS NOT NULL AND SchTable.COUNT > 0 THEN
783         FOR I IN SchTable.first..SchTable.last
784             LOOP
785                 -- validate demand schedule id
786                 l_String := VALIDATE_G_DMD_SCH_ID(l_ErrorType, SchTable(I).DmdSchId, PlanName);
787                 IF (l_String <> 'OK') THEN
788                     RETURN l_String;
789                 END IF;
790 
791                 -- validate ship to consumption level
792                 l_String := VALIDATE_CONSUM_LVL(
793                                   SchTable(I).ShipToConsumptionLvl,
794                                   SchTable(I).DmdSchId
795                                   );
796                 IF (l_String <> 'OK') THEN
797                     RETURN 'INVALID_GLOBALDMDSCHS_SHP_TO_CONSUMPTION_LVL';
798                 END IF;
799 
800                 -- validate Type of Demand Variability and its dependence
801                 l_String := VALIDATE_G_VARIABILITY(SchTable(I));
802                 IF (l_String <> 'OK') THEN
803                     RETURN l_String;
804                 END IF;
805 
806                 g_IGlbDmdSchTbl.extend;
807                 g_IGlbDmdSchTbl(g_IGlbDmdSchTbl.count) :=
808                      MscIGlbIODmdSchRec(SchTable(I).DmdSchId,
809                                    SchTable(I).ShipToConsumptionLvl,
810                                    SchTable(I).DmdVariabilityType,
811                                    SchTable(I).Probability,
812                                    SchTable(I).MeanAbsPctError,
813                                    1, -- input_type
814                                    7  -- designator_type
815                                    );
816 
817             END LOOP;
818         l_String := VALIDATE_G_PROB(PurgeAll, InsId, PlanId);
819         IF (l_String <> 'OK') THEN
820             RETURN l_String;
821         END IF;
822     END IF;
823 
824     RETURN 'OK';
825 END VALIDATE_GLB_DMD_SCHS;
826 
827 -- =============================================================
828 -- Desc: load local demand schedules for this scenario set
829 -- Input:
830 --       PurgeAll              Purge All Schs Flag
831 --       ScenarioSetId
832 --       PlanId
833 --
834 -- Output: No output.
835 -- =============================================================
836 PROCEDURE LOAD_LOC_DMD_SCH_TBL(
837         SchTbl             OUT NOCOPY MscIDmdSchVarTbl,
838         PurgeAll           IN         VARCHAR2,
839         ScenarioSetId      IN         NUMBER,
840         PlanId             IN         NUMBER
841         ) AS
842 cursor schedule_c(idPlan number, idScenarioSet number) is
843 SELECT
844     sr_instance_id,
845     organization_id,
846     input_schedule_id,
847     demand_variability_type,
848     probability
849 FROM
850     msc_plan_schedules
851 WHERE
852     plan_id = idPlan AND
853     organization_id <> -1 AND
854     scenario_set = idScenarioSet;
855 
856 l_InsId           NUMBER;
857 l_OrgId           NUMBER;
858 l_SchedId         NUMBER;
859 l_VarType         NUMBER;
860 l_Probability     NUMBER;
861 BEGIN
862     SchTbl := MscIDmdSchVarTbl();
863     SchTbl.DELETE;
864     IF MSC_WS_COMMON.BOOL_TO_NUMBER(PurgeAll) = MSC_UTIL.SYS_NO THEN
865         BEGIN
866             OPEN schedule_c(PlanId, ScenarioSetId);
867             LOOP
868                 FETCH schedule_c into l_InsId, l_OrgId, l_SchedId, l_VarType, l_Probability;
869                 EXIT WHEN schedule_c%NOTFOUND;
870                 SchTbl.extend;
871                 SchTbl(SchTbl.count) :=
872                     MscIDmdSchVarRec(
873                               l_InsId,
874                               l_OrgId,
875                               l_SchedId,
876                               l_VarType,
877                               l_Probability
878                               );
879             END LOOP;
880             CLOSE schedule_c;
881         END;
882     END IF;
883 
884 END LOAD_LOC_DMD_SCH_TBL;
885 
886 -- =============================================================
887 -- Desc: All demand schedules in a scenario set have the same variability type
888 --       If the the variability type is probability, the sun must equal to 1 in any scenario set
889 -- Input:
890 --       InsId              Instance id
891 --
892 -- Output: The possible return statuses are:
893 --         OK
894 --         INVALID_VAR_TYPE_IN_SCENARIO_SET
895 --         INVALID_LOC_SUM_OF_PROB
896 -- =============================================================
897 FUNCTION VALIDATE_L_PROB(
898         PurgeAll           IN         VARCHAR2,
899         InsId              IN         NUMBER,
900         PlanId             IN         NUMBER
901         ) RETURN VARCHAR2 AS
902 l_String         VARCHAR2(100);
903 l_ScenarioTbl    MscNumberArr;         -- scenario sets in local demand schedules parameter
904 l_SchTbl         MscIDmdSchVarTbl;  -- local shedules for a single scenario set
905 l_Insert         NUMBER;
906 l_VarType        NUMBER;
907 l_Sum            NUMBER;
908 BEGIN
909     IF g_ILocDmdSchTbl.COUNT > 0 THEN
910         l_ScenarioTbl := MscNumberArr();
911 
912         -- insert all scenario set from parameter into l_ScenarioTbl
913         FOR I IN g_ILocDmdSchTbl.first..g_ILocDmdSchTbl.last
914             LOOP
915                 l_Insert := MSC_UTIL.SYS_YES;
916                 IF l_ScenarioTbl.COUNT > 0 THEN
917                      FOR J IN l_ScenarioTbl.first..l_ScenarioTbl.last
918                          LOOP
919                              IF l_ScenarioTbl(J) = g_ILocDmdSchTbl(I).ScenarioSet THEN
920                                  l_Insert := MSC_UTIL.SYS_NO;
921                                  EXIT;
922                              END IF;
923                          END LOOP;
924                 END IF;
925                 IF l_Insert = MSC_UTIL.SYS_YES THEN
926                     l_ScenarioTbl.extend;
927                     l_ScenarioTbl(l_ScenarioTbl.COUNT) := g_ILocDmdSchTbl(I).ScenarioSet;
928                 END IF;
929             END LOOP;
930 
931         -- l_ScenarioTbl must not empty!!!
932         FOR I IN l_ScenarioTbl.first..l_ScenarioTbl.last
933             LOOP
934                 -- get all schedules for this scenario set from database and store them in l_SchTbl
935                 LOAD_LOC_DMD_SCH_TBL(l_SchTbl, PurgeAll, l_ScenarioTbl(I), PlanId);
936 
937                 l_VarType := -1;
938                 l_Sum := 0;
939                 FOR J in g_ILocDmdSchTbl.first..g_ILocDmdSchTbl.last
940                     LOOP
941                         IF g_ILocDmdSchTbl(J).ScenarioSet = l_ScenarioTbl(I) THEN
942                             IF l_VarType = -1 THEN
943                                 l_VarType := g_ILocDmdSchTbl(J).DmdVariabilityType;
944                             ELSIF l_VarType <> g_ILocDmdSchTbl(J).DmdVariabilityType THEN
945                                 RETURN 'INVALID_VAR_TYPE_IN_SCENARIO_SET';
946                             END IF;
947                             IF l_VarType = 2 THEN
948                                 l_Sum := l_Sum + g_ILocDmdSchTbl(J).Probability;
949                             END IF;
950                         END IF;
951                         -- delete this demand schedule from l_SchTbl.
952                         IF l_SchTbl.COUNT > 0 THEN
953                             FOR K IN l_SchTbl.first..l_SchTbl.last
954                                 LOOP
955                                     BEGIN
956                                         IF l_SchTbl(K).InsId = InsId AND
957                                            l_SchTbl(K).OrgId = g_ILocDmdSchTbl(J).OrgId AND
958                                            l_SchTbl(K).SchId = g_ILocDmdSchTbl(J).DmdSchId THEN
959                                             l_SchTbl.delete(K);
960                                             EXIT;
961                                         END IF;
962                                         EXCEPTION WHEN NO_DATA_FOUND THEN
963                                             NULL; -- skip, this element is deleted.
964                                     END;
965                                 END LOOP;
966                             END IF;
967                     END LOOP;
968                 IF l_SchTbl.COUNT > 0 THEN
969                     FOR L IN l_SchTbl.first..l_SchTbl.last
970                     LOOP
971                         IF l_SchTbl(L).DmdVariabilityType <> l_VarType THEN
972                             RETURN 'INVALID_VAR_TYPE_IN_SCENARIO_SET';
973                         ELSIF l_VarType = 2 THEN
974                             l_Sum := l_Sum + l_SchTbl(L).Probability;
975                         END IF;
976                     END LOOP;
977                 END IF;
978                 -- test the sum
979                 IF l_VarType = 2 AND l_Sum <> 1 THEN
980                     RETURN 'INVALID_LOC_SUM_OF_PROB';
981                 END IF;
982             END LOOP;
983     END IF;
984     RETURN 'OK';
985 END VALIDATE_L_PROB;
986 
987 -- =============================================================
988 -- Desc: Validate loal demand schedule id
989 -- Input:
990 --       SchId             local demand schedule id.
991 --       OrgId             organization id.
992 --       InsId             sr instance id.
993 --       PlanName          plan name.
994 --
995 -- Output: The possible return statuses are:
996 --         OK
997 --         INVALID_LOCALDMDSCHS_DMD_SCH_ID
998 -- =============================================================
999 FUNCTION VALIDATE_L_DMD_SCH_ID(
1000         DesigType          OUT NOCOPY NUMBER,
1001         SchId              IN         NUMBER,
1002         OrgId              IN         NUMBER,
1003         InsId              IN         NUMBER,
1004         PlanName           IN         VARCHAR2
1005 ) RETURN VARCHAR2 AS
1006 BEGIN
1007     BEGIN
1008         SELECT designator_type
1009         INTO   DesigType
1010         FROM   msc_designators
1011         WHERE
1012             ((designator_type = 6 AND forecast_set_id IS NULL) OR
1013              (designator_type in  (1,2,3,4,5,8)) ) AND
1014             trunc(nvl(disable_date, trunc(sysdate) + 1)) > trunc(sysdate) AND
1015             (designator <> PlanName OR designator_type = 1) AND
1016             organization_id = OrgId AND
1017             sr_instance_id = InsId AND
1018             designator_id = SchId
1019         UNION
1020         SELECT 7
1021         FROM   msd_dp_ascp_scenarios_v
1022         WHERE
1023             global_scenario_flag = 'N' AND
1024             scenario_name <> PlanName AND
1025             sr_instance_id = InsId AND
1026             (sr_instance_id = -23453 OR sr_instance_id = InsId) AND
1027             scenario_id = SchId
1028         UNION
1029         SELECT designator_type
1030         FROM
1031             msc_designators desig,
1032             msc_plan_organizations_v mpo
1033         WHERE
1034             ((desig.designator_type = 6 and desig.forecast_set_id IS NULL) OR
1035              (desig.designator_type IN (2,3,4,5,8) )) AND
1036             NVL(desig.disable_date, trunc(sysdate) + 1) > trunc(sysdate) AND
1037             mpo.organization_id  = desig.organization_id AND
1038             mpo.sr_instance_id  = desig.sr_instance_id AND
1039             mpo.compile_designator = desig.designator AND
1040             mpo.planned_organization = OrgId AND
1041             mpo.sr_instance_id = InsId AND
1042             desig.designator <> PlanName AND
1043             desig.designator_id = SchId
1044         UNION
1045         SELECT desig.designator_type
1046         FROM
1047             msc_designators desig,
1048             msc_item_sourcing mis,
1049             msc_plans mp
1050         WHERE
1051             ((desig.designator_type = 6 AND desig.forecast_set_id IS NULL) OR
1052              (desig.designator_type IN (2,3,4,5,8)) ) AND
1053             trunc(nvl(desig.disable_date, trunc(sysdate) + 1)) > trunc(sysdate) AND
1054             mis.plan_id = mp.plan_id AND
1055             mp.organization_id  = desig.organization_id AND
1056             mp.sr_instance_id  = desig.sr_instance_id AND
1057             mp.compile_designator = desig.designator AND
1058             mis.source_organization_id = OrgId AND
1059             mis.sr_instance_id2 = InsId AND
1060             desig.designator <> PlanName AND
1061             desig.designator_id = SchId;
1062         EXCEPTION WHEN NO_DATA_FOUND THEN
1063             RETURN 'INVALID_LOCALDMDSCHS_DMD_SCH_ID';
1064         WHEN others THEN
1065             g_ErrorCode := 'ERROR_UNEXPECTED_00310';
1066             raise;
1067     END;
1068 
1069     RETURN 'OK';
1070 END VALIDATE_L_DMD_SCH_ID;
1071 
1072 -- =============================================================
1073 -- Desc: Validate demand variability type and its dependance
1074 -- Input:
1075 --       SchRec            local demand schedule data.
1076 --       DesigType         Designator type.
1077 --
1078 -- Output: The possible return statuses are:
1079 --         OK
1080 --         INVALID_LOCALDMDSCHS_VARIABILITY_TYPE
1081 --         INVALID_LOCBALDMDSCHS_PROBABILITY
1082 --         INVALID_LOCBALDMDSCHS_MEAN_ABS_PCT_ERROR
1083 -- =============================================================
1084 FUNCTION VALIDATE_L_VARIABILITY(
1085         SchRec             IN         MscLocIODmdSchRec,
1086         DesigType          IN         NUMBER
1087         ) RETURN VARCHAR2 AS
1088 l_String          VARCHAR2(100);
1089 BEGIN
1090     l_String := VALIDATE_VARIABILITY_ID(SchRec.DmdVariabilityType, DesigType);
1091     IF l_String <> 'OK' THEN
1092         RETURN 'INVALID_LOCALDMDSCHS_VARIABILITY_TYPE';
1093     END IF;
1094     BEGIN
1095         CASE SchRec.DmdVariabilityType
1096             WHEN 1 THEN -- Accuracy_Metric_MAD
1097                 BEGIN
1098                     -- probability has to be null
1099                     IF SchRec.Probability IS NOT NULL THEN
1100                         RETURN 'INVALID_LOCBALDMDSCHS_PROBABILITY';
1101                     END IF;
1102                     -- mean absolute % error has to be null
1103                     IF SchRec.MeanAbsPctError IS NOT NULL THEN
1104                         RETURN 'INVALID_LOCBALDMDSCHS_MEAN_ABS_PCT_ERROR';
1105                     END IF;
1106                 END;
1107             WHEN 2 THEN -- 'Probability'
1108                     -- probability is required and in the range of 0 to 1
1109                     IF SchRec.Probability IS NULL THEN
1110                         RETURN 'INVALID_LOCBALDMDSCHS_PROBABILITY';
1111                     ELSE
1112                         IF SchRec.Probability < 0 OR SchRec.Probability > 1 THEN
1113                             RETURN 'INVALID_LOCBALDMDSCHS_PROBABILITY';
1114                         END IF;
1115                     END IF;
1116                     -- mean absolute % error has to be null
1117                     IF SchRec.MeanAbsPctError IS NOT NULL THEN
1118                         RETURN 'INVALID_LOCBALDMDSCHS_MEAN_ABS_PCT_ERROR';
1119                     END IF;
1120             WHEN 3 THEN -- 'Mean_Absolute_Pct_Err'
1121                     -- probability has to be null
1122                     IF SchRec.Probability IS NOT NULL THEN
1123                         RETURN 'INVALID_LOCBALDMDSCHS_PROBABILITY';
1124                     END IF;
1125                     -- mean absolute % error is required and in the range of 0 to 100
1126                     IF SchRec.MeanAbsPctError IS NULL THEN
1127                         RETURN 'INVALID_LOCBALDMDSCHS_MEAN_ABS_PCT_ERROR';
1128                     ELSE
1129                         IF SchRec.MeanAbsPctError < 0 OR SchRec.MeanAbsPctError > 100 THEN
1130                             RETURN 'INVALID_LOCBALDMDSCHS_MEAN_ABS_PCT_ERROR';
1131                         END IF;
1132                     END IF;
1133         END CASE;
1134     END;
1135 
1136     RETURN 'OK';
1137 END VALIDATE_L_VARIABILITY;
1138 
1139 -- =============================================================
1140 -- Desc: validate local demand schedules
1141 -- Input:
1142 --       SchTable              Local demand schedules.
1143 --       PlanId                Plan id
1144 --       PlanName              Plan name.
1145 --       InsId                 Instance id
1146 --       PurgeAll              Purge All Schs Flag
1147 --
1148 -- Output: The possible return statuses are:
1149 --         OK
1150 --         INVALID_LOCALDMDSCHS_ORGID
1151 --         INVALID_LOCALDMDSCHS_SCENARIO_SET
1152 --         INVALID_LOCALDMDSCHS_DMD_SCH_ID
1153 --         INVALID_LOCALDMDSCHS_SHP_TO_CONSUMPTION_LVL
1154 -- =============================================================
1155 FUNCTION VALIDATE_LOC_DMD_SCHS(
1156         SchTable           IN         MscLocIODmdSchTbl,
1157         PlanId             IN         NUMBER,
1158         PlanName           IN         VARCHAR2,
1159         InsId              IN         NUMBER,
1160         PurgeAll           IN         VARCHAR2
1161         ) RETURN VARCHAR2 AS
1162 l_ReturnString    VARCHAR2(100);
1163 l_OrgInsId        NUMBER;
1164 l_DesigType       NUMBER;
1165 BEGIN
1166     IF SchTable IS NOT NULL AND SchTable.count > 0 THEN
1167         FOR I IN SchTable.first..SchTable.last
1168             LOOP
1169                 -- validate organization id
1170                 BEGIN
1171                     l_ReturnString := MSC_WS_COMMON.PLAN_CONTAINS_THIS_ORG(l_OrgInsId, SchTable(I).OrgId, PlanId);
1172                     IF (l_ReturnString <> 'OK') THEN
1173                         -- overwrite the error token here.
1174                         l_ReturnString := 'INVALID_LOCALDMDSCHS_ORGID';
1175                         RETURN l_ReturnString;
1176                     END IF;
1177                     EXCEPTION WHEN others THEN
1178                         g_ErrorCode := 'ERROR_UNEXPECTED_00309';
1179                         raise;
1180                 END;
1181 
1182                 -- validate scenario set
1183                 IF SchTable(I).ScenarioSet IS NULL THEN
1184                     RETURN 'INVALID_LOCALDMDSCHS_SCENARIO_SET';
1185                 ELSIF SchTable(I).ScenarioSet < 0 OR SchTable(I).ScenarioSet > 9999 THEN
1186                     RETURN 'INVALID_LOCALDMDSCHS_SCENARIO_SET';
1187                 END IF;
1188 
1189                 -- validate demand schedule id
1190                 l_ReturnString := VALIDATE_L_DMD_SCH_ID(
1191                                          l_DesigType,
1192                                          SchTable(I).DmdSchId,
1193                                          SchTable(I).OrgId,
1194                                          l_OrgInsId,
1195                                          PlanName);
1196                 IF (l_ReturnString <> 'OK') THEN
1197                     RETURN l_ReturnString;
1198                 END IF;
1199 
1200                 -- validate ship to consumption level
1201                 IF l_DesigType = 7 THEN
1202                     l_ReturnString := VALIDATE_CONSUM_LVL(
1203                                       SchTable(I).ShipToConsumptionLvl,
1204                                       SchTable(I).DmdSchId);
1205                     IF (l_ReturnString <> 'OK') THEN
1206                         RETURN 'INVALID_LOCALDMDSCHS_SHP_TO_CONSUMPTION_LVL';
1207                     END IF;
1208                 ELSE
1209                     IF SchTable(I).ShipToConsumptionLvl IS NOT NULL THEN
1210                         RETURN 'INVALID_LOCALDMDSCHS_SHP_TO_CONSUMPTION_LVL';
1211                     END IF;
1212                 END IF;
1213 
1214                 -- validate Type of Demand Variability and its dependence
1215                 l_ReturnString := VALIDATE_L_VARIABILITY(SchTable(I), l_DesigType);
1216                 IF (l_ReturnString <> 'OK') THEN
1217                     RETURN l_ReturnString;
1218                 END IF;
1219 
1220                 g_ILocDmdSchTbl.extend;
1221                 g_ILocDmdSchTbl(g_ILocDmdSchTbl.count) :=
1222                     MscILocIODmdSchRec(SchTable(I).OrgId,
1223                                   SchTable(I).ScenarioSet,
1224                                   SchTable(I).DmdSchId,
1225                                   SchTable(I).ShipToConsumptionLvl,
1226                                   SchTable(I).DmdVariabilityType,
1227                                   SchTable(I).Probability,
1228                                   SchTable(I).MeanAbsPctError,
1229                                   1,           -- input_type
1230                                   l_DesigType  -- designator_type
1231                                   );
1232             END LOOP;
1233         l_ReturnString := VALIDATE_L_PROB(PurgeAll, InsId, PlanId);
1234         IF (l_ReturnString <> 'OK') THEN
1235             RETURN l_ReturnString;
1236         END IF;
1237     END IF;
1238 
1239     RETURN 'OK';
1240 END VALIDATE_LOC_DMD_SCHS;
1241 
1242 -- =============================================================
1243 -- Desc: update item simulation set and service level set
1244 --
1245 -- Input:
1246 --       PlanId                Id of the plan.
1247 --       ItemSimulationSetId   Id of the item simulation set.
1248 --       SvcLvlSet             Service level set.
1249 --
1250 -- Output: No output.
1251 -- =============================================================
1252 PROCEDURE UPDATE_PLAN_OPTIONS(
1253         PlanId              IN         NUMBER,
1254         ItemSimulationSetId IN         NUMBER,
1255         SvcLvlSetId         IN         NUMBER
1256 ) AS
1257 BEGIN
1258     BEGIN
1259         UPDATE msc_plans
1260         SET
1261             item_simulation_set_id = ItemSimulationSetId,
1262             curr_service_level_set_id = SvcLvlSetId
1263         WHERE
1264             plan_id = PlanId;
1265         EXCEPTION WHEN others THEN
1266             g_ErrorCode := 'ERROR_UNEXPECTED_00312';
1267             raise;
1268     END;
1269 
1270 END UPDATE_PLAN_OPTIONS;
1271 
1272 -- =============================================================
1273 -- Desc: Insert a global demand schedule
1274 --
1275 -- Input:
1276 --       PlanId                Id of the plan.
1277 --       InsId                 Sr instance id.
1278 --       UserId                user id,
1279 --       Schrec                global demand schedule data.
1280 --
1281 -- Output: The possible return statuses are:
1282 --         OK
1283 --         ERROR_DUP_GLOBALDMDSCH
1284 -- =============================================================
1285 FUNCTION INSERT_GLB_DMD_SCHEDULE(
1286         PlanId              IN         NUMBER,
1287         InsId               IN         NUMBER,
1288         UserId              IN         NUMBER,
1289         SchRec              IN         MscIGlbIODmdSchRec
1290 ) RETURN VARCHAR2 AS
1291 BEGIN
1292     BEGIN
1293         INSERT INTO msc_plan_schedules
1294             (
1295             plan_id, organization_id, input_schedule_id, sr_instance_id,
1296             input_type, last_update_date, last_updated_by,
1297             creation_date, created_by, designator_type, ship_to,
1298             demand_variability_type, probability, mape_value
1299             )
1300         VALUES
1301             (
1302             PlanId, -1, SchRec.DmdSchId, InsId,
1303             SchRec.input_type, sysdate, UserId,
1304             sysdate, UserId, SchRec.designator_type, SchRec.ShipToConsumptionLvl,
1305             SchRec.DmdVariabilityType, SchRec.Probability, SchRec.MeanAbsPctError
1306             );
1307         EXCEPTION WHEN DUP_VAL_ON_INDEX THEN
1308             RETURN 'ERROR_DUP_GLOBALDMDSCH';
1309         WHEN others THEN
1310             g_ErrorCode := 'ERROR_UNEXPECTED_00313';
1311             raise;
1312     END;
1313 
1314     RETURN 'OK';
1315 END INSERT_GLB_DMD_SCHEDULE;
1316 
1317 
1318 -- =============================================================
1319 -- Desc: Insert a locaal demand schedule
1320 --
1321 -- Input:
1322 --       PlanId                Id of the plan.
1323 --       InsId                 Sr instance id.
1324 --       UserId                user id,
1325 --       Schrec                local demand schedule data.
1326 --
1327 -- Output: The possible return statuses are:
1328 --         OK
1329 --         ERROR_DUP_LOCBALDMDSCH
1330 -- =============================================================
1331 FUNCTION INSERT_LOC_DMD_SCHEDULE(
1332         PlanId              IN         NUMBER,
1333         InsId               IN         NUMBER,
1334         UserId              IN         NUMBER,
1335         SchRec              IN         MscILocIODmdSchRec
1336 ) RETURN VARCHAR2 AS
1337 BEGIN
1338     BEGIN
1339         INSERT INTO msc_plan_schedules
1340             (
1341             plan_id, organization_id, input_schedule_id, sr_instance_id,
1342             input_type, last_update_date, last_updated_by,
1343             creation_date, created_by, designator_type, ship_to,
1344             demand_variability_type, probability, mape_value,
1345             scenario_set, include_target_demands -- include_target_demands is hard coded to 2
1346             )
1347         VALUES
1348             (
1349             PlanId, SchRec.OrgId, SchRec.DmdSchId, InsId,
1350             SchRec.input_type, sysdate, UserId,
1351             sysdate, UserId, SchRec.designator_type, SchRec.ShipToConsumptionLvl,
1352             SchRec.DmdVariabilityType, SchRec.Probability, SchRec.MeanAbsPctError,
1353             SchRec.ScenarioSet, 2
1354             );
1355         EXCEPTION WHEN DUP_VAL_ON_INDEX THEN
1356             RETURN 'ERROR_DUP_LOCBALDMDSCH';
1357         WHEN others THEN
1358             g_ErrorCode := 'ERROR_UNEXPECTED_00314';
1359             raise;
1360     END;
1361 
1362     RETURN 'OK';
1363 END INSERT_LOC_DMD_SCHEDULE;
1364 
1365 -- =============================================================
1366 -- Desc: this function is call when the PurgeAllSchsFlag is set,
1367 --       insert all global and local demand schedules.
1368 --
1369 -- Input:
1370 --       PlanId                Id of the plan.
1371 --       InsId                 Sr instance id.
1372 --       UserId                user id,
1373 --
1374 -- Output: No output.
1375 -- =============================================================
1376 FUNCTION INSERT_ALL_SCHEDULES(
1377         PlanId              IN         NUMBER,
1378         InsId               IN         NUMBER,
1379         UserId              IN         NUMBER
1380 ) RETURN VARCHAR2 AS
1381 l_ReturnString    VARCHAR2(100);
1382 BEGIN
1383     -- insert global demand schedules
1384     IF g_IGlbDmdSchTbl.COUNT > 0 THEN
1385         FOR I IN g_IGlbDmdSchTbl.first..g_IGlbDmdSchTbl.last
1386             LOOP
1387                 l_ReturnString:= INSERT_GLB_DMD_SCHEDULE(PlanId, InsId, UserId, g_IGlbDmdSchTbl(I));
1388                 IF (l_ReturnString <> 'OK') THEN
1389                     RETURN l_ReturnString;
1390                 END IF;
1391             END LOOP;
1392     END IF;
1393 
1394     -- insert local demand schedules
1395     IF g_ILocDmdSchTbl.COUNT > 0 THEN
1396         FOR I IN g_ILocDmdSchTbl.first..g_ILocDmdSchTbl.last
1397             LOOP
1398                 l_ReturnString:= INSERT_LOC_DMD_SCHEDULE(PlanId, InsId, UserId, g_ILocDmdSchTbl(I));
1399                 IF (l_ReturnString <> 'OK') THEN
1400                     RETURN l_ReturnString;
1401                  END IF;
1402             END LOOP;
1403     END IF;
1404 
1405     RETURN 'OK';
1406 END INSERT_ALL_SCHEDULES;
1407 
1408 -- =============================================================
1409 -- Desc: Update a global demand schedule
1410 --
1411 -- Input:
1412 --       PlanId                Id of the plan.
1413 --       InsId                 Sr instance id.
1414 --       UserId                user id,
1415 --       Schrec                global demand schedule data.
1416 --
1417 -- Output: No output.
1418 -- =============================================================
1419 PROCEDURE UPDATE_GLB_DMD_SCHEDULE(
1420         PlanId              IN         NUMBER,
1421         InsId               IN         NUMBER,
1422         UserId              IN         NUMBER,
1423         SchRec              IN         MscIGlbIODmdSchRec
1424 ) AS
1425 BEGIN
1426     BEGIN
1427         UPDATE msc_plan_schedules
1428         SET
1429             ship_to                 = SchRec.ShipToConsumptionLvl,
1430             demand_variability_type = SchRec.DmdVariabilityType,
1431             probability             = SchRec.Probability,
1432             mape_value              = SchRec.MeanAbsPctError
1433         WHERE
1434             plan_id = PlanId AND
1435             organization_id = -1 AND
1436             sr_instance_id = InsId AND
1437             input_schedule_id = SchRec.DmdSchId;
1438         EXCEPTION WHEN others THEN
1439             g_ErrorCode := 'ERROR_UNEXPECTED_00316';
1440             raise;
1441     END;
1442 
1443 END UPDATE_GLB_DMD_SCHEDULE;
1444 
1445 -- =============================================================
1446 -- Desc: Update a local demand schedule
1447 --
1448 -- Input:
1449 --       PlanId                Id of the plan.
1450 --       InsId                 Sr instance id.
1451 --       UserId                user id,
1452 --       Schrec                local demand schedule data.
1453 --
1454 -- Output: No output.
1455 -- =============================================================
1456 PROCEDURE UPDATE_LOC_DMD_SCHEDULE(
1457         PlanId              IN         NUMBER,
1458         InsId               IN         NUMBER,
1459         UserId              IN         NUMBER,
1460         SchRec              IN         MscILocIODmdSchRec
1461 ) AS
1462 BEGIN
1463     BEGIN
1464         UPDATE msc_plan_schedules
1465         SET
1466             ship_to                 = SchRec.ShipToConsumptionLvl,
1467             demand_variability_type = SchRec.DmdVariabilityType,
1468             probability             = SchRec.Probability,
1469             mape_value              = SchRec.MeanAbsPctError,
1470             scenario_set            = SchRec.ScenarioSet
1471         WHERE
1472             plan_id = PlanId AND
1473             organization_id = SchRec.OrgId AND
1474             sr_instance_id = InsId AND
1475             input_schedule_id = SchRec.DmdSchId;
1476         EXCEPTION WHEN others THEN
1477             g_ErrorCode := 'ERROR_UNEXPECTED_00318';
1478             raise;
1479     END;
1480 
1481 END UPDATE_LOC_DMD_SCHEDULE;
1482 
1483 -- =============================================================
1484 -- Desc: this function is call when the PurgeAllSchsFlag is not set,
1485 --       insert or update bothe global and local demand schedules.
1486 --
1487 -- Input:
1488 --       PlanId                Id of the plan.
1489 --       InsId                 Sr instance id.
1490 --       UserId                user id,
1491 --
1492 -- Output: No output.
1493 -- =============================================================
1494 FUNCTION INSERT_OR_UPDATE_ALL_SCHS(
1495         PlanId              IN         NUMBER,
1496         InsId               IN         NUMBER,
1497         UserId              IN         NUMBER
1498 ) RETURN VARCHAR2 AS
1499 l_ReturnString    VARCHAR2(100);
1500 l_Dummy           NUMBER;
1501 BEGIN
1502     -- insert/update all global demand schedules
1503     IF g_IGlbDmdSchTbl.COUNT > 0 THEN
1504         FOR I IN g_IGlbDmdSchTbl.FIRST..g_IGlbDmdSchTbl.LAST
1505             LOOP
1506                 BEGIN
1507                     Select count(*) INTO l_Dummy
1508                     FROM   msc_plan_schedules
1509                     WHERE
1510                         plan_id = PlanId AND
1511                         organization_id = -1 AND
1512                         sr_instance_id = InsId AND
1513                         input_schedule_id  = g_IGlbDmdSchTbl(I).DmdSchId;
1514                     EXCEPTION WHEN others THEN
1515                         g_ErrorCode := 'ERROR_UNEXPECTED_00315';
1516                         raise;
1517                 END;
1518                 IF l_Dummy = 0 THEN
1519                     l_ReturnString := INSERT_GLB_DMD_SCHEDULE(PlanId, InsId, UserId, g_IGlbDmdSchTbl(I));
1520                 ELSE
1521                     UPDATE_GLB_DMD_SCHEDULE(PlanId, InsId, UserId, g_IGlbDmdSchTbl(I));
1522                 END IF;
1523             END LOOP;
1524     END IF;
1525 
1526     -- insert/update all local demand schedules
1527     IF g_ILocDmdSchTbl.COUNT > 0 THEN
1528         FOR I IN g_ILocDmdSchTbl.first..g_ILocDmdSchTbl.last
1529             LOOP
1530                 BEGIN
1531                     Select count(*) INTO l_Dummy
1532                     FROM   msc_plan_schedules
1533                     WHERE
1534                         plan_id = PlanId AND
1535                         organization_id = g_ILocDmdSchTbl(I).OrgId AND
1536                         sr_instance_id = InsId AND
1537                         input_schedule_id  = g_ILocDmdSchTbl(I).DmdSchId;
1538                     EXCEPTION WHEN others THEN
1539                         g_ErrorCode := 'ERROR_UNEXPECTED_7';
1540                         raise;
1541                 END;
1542                 IF l_Dummy = 0 THEN
1543                     l_ReturnString := INSERT_LOC_DMD_SCHEDULE(PlanId, InsId, UserId, g_ILocDmdSchTbl(I));
1544                     IF (l_ReturnString <> 'OK') THEN
1545                         RETURN l_ReturnString;
1546                      END IF;
1547                 ELSE
1548                     UPDATE_LOC_DMD_SCHEDULE(PlanId, InsId, UserId, g_ILocDmdSchTbl(I));
1549                     IF (l_ReturnString <> 'OK') THEN
1550                         RETURN l_ReturnString;
1551                      END IF;
1552                 END IF;
1553             END LOOP;
1554     END IF;
1555 
1556 
1557 RETURN 'OK';
1558 END INSERT_OR_UPDATE_ALL_SCHS;
1559 
1560 -- =============================================================
1561 -- Desc: This procedure is invoked from web service to
1562 --       updates Plan Options for IO plans.
1563 -- Input:
1564 --        UserId            User ID.
1565 --        ResponsibilityId  Responsibility Id.
1566 --        PlanId            Plan Id.
1567 --        ItemSimulationSet Item Simulation Set.
1568 --        ServiceLvlSetId   Service Level Set Id.
1569 --        PurgeAllSchsFlag  There is no such parameter in UI. Allowed
1570 --                          input is Y or N. This is a new parameter
1571 --                          to control how Global and local Demand Schedules
1572 --                          are updated / inserted. If this flag is set, all
1573 --                          Global and Local Demand will be purged before
1574 --                          update / insert from the input parameters.
1575 --                          If this flag is not set, no global or local demand
1576 --                          schedules will be purged, schedules in the input
1577 --                          parameters will be updated or inserted.
1578 --        GlobalDmdSchs	    Global Demand Schedules. Each global demand schedule
1579 --                          contains the schedule id, ship to consumption,
1580 --                          demand variability type, probability and/or
1581 --                          mean absolue % error parameters.
1582 --        LocalDmdSchs      Local Demand Schedules. Each local demand schedule
1583 --                          contains the organization id, schedule id, scenario set id,
1584 --                          ship to consumption, demand variability type, probability and/or
1585 --                          mean absolue % error parameters.
1586 --
1587 -- Output: Procedure returns a status and conc program req id.
1588 --       The possible return statuses are:
1589 --          SUCCESS if everything is ok
1590 --          ERROR_DUP_GLOBALDMDSCH
1591 --          ERROR_DUP_LOCBALDMDSCH
1592 --          ERROR_UNEXPECTED_#####  unexpected error
1593 --          INVALID_FND_USERID
1594 --          INVALID_FND_RESPONSIBILITYID
1595 --          INVALID_PLANID          invalid source plan id
1596 --          INVALID_PLAN_TYPE       non IO plan
1597 --          INVALID_SIMULATION_SET_ID
1598 --          INVALID_SERVICE_LVL_SET_ID
1599 --          INVALID_GLOBALDMDSCHS_DMD_SCH_ID
1600 --          INVALID_GLOBALDMDSCHS_SHP_TO_CONSUMPTION_LVL
1601 --          INVALID_GLOBALDMDSCHS_VARIABILITY_TYPE
1602 --          INVALID_GLOBALDMDSCHS_PROBABILITY
1603 --          INVALID_GLOBALDMDSCHS_MEAN_ABS_PCT_ERROR
1604 --          INVALID_VAR_TYPE_IN_GBL_SCH
1605 --          INVALID_GLB_SUM_OF_PROB
1606 --          INVALID_LOCALDMDSCHS_ORGID
1607 --          INVALID_LOCALDMDSCHS_SCENARIO_SET
1608 --          INVALID_LOCALDMDSCHS_DMD_SCH_ID
1609 --          INVALID_LOCALDMDSCHS_SHP_TO_CONSUMPTION_LVL
1610 --          INVALID_LOCALDMDSCHS_VARIABILITY_TYPE
1611 --          INVALID_LOCBALDMDSCHS_PROBABILITY
1612 --          INVALID_LOCBALDMDSCHS_MEAN_ABS_PCT_ERROR
1613 --          INVALID_VAR_TYPE_IN_SCENARIO_SET
1614 --          INVALID_LOC_SUM_OF_PROB
1615 -- =============================================================
1616 PROCEDURE SET_IO_PLAN_OPTIONS(
1617         Status               OUT NOCOPY VARCHAR2,
1618         UserId               IN         NUMBER,
1619         ResponsibilityId     IN         NUMBER,
1620         PlanId               IN         NUMBER,
1621         ItemSimulationSetId  IN         NUMBER default NULL,
1622         ServiceLvlSetId      IN         NUMBER default NULL,
1623         PurgeAllSchsFlag     IN         VARCHAR2,
1624         GlobalDmdSchs        IN         MscGlbIODmdSchTbl default NULL,
1625         LocalDmdSchs         IN         MscLocIODmdSchTbl default NULL
1626         ) IS
1627 l_String            VARCHAR2(100);
1628 l_OrgId             NUMBER;
1629 l_InsId             NUMBER;
1630 l_PlanName          VARCHAR2(10);
1631 BEGIN
1632 -- dbms_output.put_line('Matthew: Init');
1633 
1634     -- init global variables
1635     g_IGlbDmdSchTbl  := MscIGlbIODmdSchTbl();
1636     g_ILocDmdSchTbl  := MscILocIODmdSchTbl();
1637 
1638     -- check user id and responsibility
1639     MSC_WS_COMMON.VALIDATE_USER_RESP(l_String, UserId, ResponsibilityId);
1640     IF (l_String <> 'OK') THEN
1641         Status := l_String;
1642         RETURN;
1643     END IF;
1644 
1645     -- check plan id
1646     -- l_String := MSC_WS_COMMON.VALIDATE_PLAN_ID(l_OrgId, l_InsId, l_PlanName, PlanId);
1647     l_String := VALIDATE_PLAN_ID(l_OrgId, l_InsId, l_PlanName, PlanId);
1648     IF (l_String <> 'OK') THEN
1649         Status := l_String;
1650         RETURN;
1651     END IF;
1652 
1653     -- check plan type
1654     l_String := VALIDATE_PLAN_TYPE(PlanId);
1655     IF (l_String <> 'OK') THEN
1656         Status := l_String;
1657         RETURN;
1658     END IF;
1659 
1660 
1661     -- validate item simulation set id
1662     BEGIN
1663         l_String := MSC_WS_COMMON.VALIDATE_SIMULATION_SET_ID(ItemSimulationSetId);
1664         IF (l_String <> 'OK') THEN
1665             Status := l_String;
1666             RETURN;
1667         END IF;
1668         EXCEPTION WHEN others THEN
1669             g_ErrorCode := 'ERROR_UNEXPECTED_00303';
1670             raise;
1671     END;
1672 
1673     -- validate service level set id
1674     l_String := VALIDATE_SER_LVL_SET_ID(ServiceLvlSetId);
1675     IF (l_String <> 'OK') THEN
1676         Status := l_String;
1677         RETURN;
1678     END IF;
1679 
1680 
1681     -- validate global demand schedules
1682     l_String := VALIDATE_GLB_DMD_SCHS(GlobalDmdSchs, PlanId, l_PlanName, l_InsId, PurgeAllSchsFlag);
1683     IF (l_String <> 'OK') THEN
1684         Status := l_String;
1685         RETURN;
1686     END IF;
1687 
1688     -- validate local demand schedules
1689     l_String := VALIDATE_LOC_DMD_SCHS(LocalDmdSchs, PlanId, l_PlanName, l_InsId, PurgeAllSchsFlag);
1690     IF (l_String <> 'OK') THEN
1691         Status := l_String;
1692         RETURN;
1693     END IF;
1694 
1695     -- if PurgeAllSchsFlag is set, purge all global demand schedules,
1696     -- local demand schedule and local supply schedules
1697     IF MSC_WS_COMMON.BOOL_TO_NUMBER(PurgeAllSchsFlag) = MSC_UTIL.SYS_YES THEN
1698         BEGIN
1699             MSC_WS_COMMON.PURGE_ALL_SCHEDULES(PlanId);
1700             EXCEPTION WHEN others THEN
1701                 g_ErrorCode := 'ERROR_UNEXPECTED_00011';
1702                 raise;
1703         END;
1704     END IF;
1705 
1706     -- update item simulation set and overwrite
1707     UPDATE_PLAN_OPTIONS(PlanId, ItemSimulationSetId, ServiceLvlSetId);
1708 
1709     -- set all global/local demand/supply schedules
1710     IF MSC_WS_COMMON.BOOL_TO_NUMBER(PurgeAllSchsFlag) = MSC_UTIL.SYS_YES THEN
1711         l_String := INSERT_ALL_SCHEDULES(PlanId, l_InsId, UserId);
1712     ELSE
1713         l_String := INSERT_OR_UPDATE_ALL_SCHS(PlanId, l_InsId, UserId);
1714     END IF;
1715 
1716     IF (l_String <> 'OK') THEN
1717         Status := l_String;
1718         RETURN;
1719     ELSE
1720         Status := 'SUCCESS';
1721     END IF;
1722 
1723     COMMIT;
1724 
1725     EXCEPTION
1726         WHEN others THEN
1727         -- Status := 'Failed '||fnd_message.get;
1728             Status := g_ErrorCode;
1729             ROLLBACK;
1730 
1731 END SET_IO_PLAN_OPTIONS;
1732 
1733 
1734 PROCEDURE SET_IO_PLAN_OPTIONS_PUBLIC (
1735 
1736 		   status                 OUT NOCOPY VARCHAR2,
1737 		   UserName               IN VARCHAR2,
1738 		   RespName     IN VARCHAR2,
1739 		   RespApplName IN VARCHAR2,
1740 		   SecurityGroupName      IN VARCHAR2,
1741 		   Language            IN VARCHAR2,
1742         PlanId               IN         NUMBER,
1743         ItemSimulationSetId  IN         NUMBER default NULL,
1744         ServiceLvlSetId      IN         NUMBER default NULL,
1745         PurgeAllSchsFlag     IN         VARCHAR2,
1746         GlobalDmdSchs        IN         MscGlbIODmdSchTbl default NULL,
1747         LocalDmdSchs         IN         MscLocIODmdSchTbl default NULL
1748 
1749                           ) AS
1750   userid    number;
1751   respid    number;
1752   l_String VARCHAR2(30);
1753   error_tracking_num number;
1754   l_SecutirtGroupId  NUMBER;
1755  BEGIN
1756    error_tracking_num :=2010;
1757     MSC_WS_COMMON.GET_PERMISSION_IDS(l_String, userid, respid, l_SecutirtGroupId, UserName, RespName, RespApplName, SecurityGroupName, Language);
1758     IF (l_String <> 'OK') THEN
1759         Status := l_String;
1760         RETURN;
1761     END IF;
1762 
1763      error_tracking_num :=2030;
1764      MSC_WS_COMMON.VALIDATE_USER_RESP_FUNC(l_String, userid, respid, 'MSCFPPMR-SRO',l_SecutirtGroupId);
1765     IF (l_String <> 'OK') THEN
1766         Status := l_String;
1767         RETURN;
1768     END IF;
1769     error_tracking_num :=2040;
1770 
1771    SET_IO_PLAN_OPTIONS ( Status, userId , respid, PlanId, ItemSimulationSetId, ServiceLvlSetId, PurgeAllSchsFlag, GlobalDmdSchs, LocalDmdSchs );
1772    --      dbms_output.put_line('USERID=' || userid);
1773 
1774 
1775       EXCEPTION
1776       WHEN others THEN
1777          status := 'ERROR_UNEXPECTED_'||error_tracking_num;
1778 
1779          return;
1780 END  SET_IO_PLAN_OPTIONS_PUBLIC;
1781 
1782 END MSC_WS_IO;
1783