DBA Data[Home] [Help]

PACKAGE BODY: APPS.MSC_WS_PLAN_MANAGEMENT

Source


1 PACKAGE BODY MSC_WS_PLAN_MANAGEMENT AS
2 /* $Header: MSCWPMAB.pls 120.8 2008/03/14 23:17:46 ryliu noship $ */
3 
4 g_UserId         NUMBER;
5 g_ErrorCode      VARCHAR2(9);
6 
7 -- validate source plan id, simulate the logic from Value Set "MSC_SRS_NAME_COPY"
8 FUNCTION VALIDATE_COPY_PLAN_ID(
9         OrgId              OUT NOCOPY NUMBER,
10         InsId              OUT NOCOPY NUMBER,
11         SrcPlanName        OUT NOCOPY VARCHAR2,
12         PlanId             IN         NUMBER
13         ) RETURN VARCHAR2 AS
14 l_ReturnString    VARCHAR2(30);
15 l_OrgId            NUMBER;
16 l_InsId            NUMBER;
17 l_PlanName         VARCHAR2(10);
18 BEGIN
19     BEGIN
20         SELECT
21             plans.organization_id,
22             plans.sr_instance_id,
23             plans.compile_designator
24         INTO
25             l_OrgId,
26             l_InsId,
27             l_PlanName
28         FROM
29             msc_plans       plans,
30             msc_designators desig
31         WHERE
32             plans.organization_id = desig.organization_id AND
33             plans.sr_instance_id = desig.sr_instance_id AND
34             plans.compile_designator = desig.designator AND
35             NVL(desig.disable_date, TRUNC(SYSDATE) + 1) > TRUNC(SYSDATE) AND
36             plans.organization_selection <> 1 AND
37             plans.curr_plan_type in (1,2,3,4,5,8,9) AND
38             plans.plan_completion_date IS NOT NULL AND
39             plans.data_completion_date IS NOT NULL AND
40             plans.plan_id <> -1 AND
41             ( (plans.curr_plan_type in (1,2,3,4,8,9) AND
42               plans.organization_selection <> 1) or
43               plans.curr_plan_type = 5 ) AND
44             NVL(plans.copy_plan_id,-1) = -1 AND
45             NVL(desig.copy_designator_id, -1) = -1 AND
46             plans.plan_id = PlanId;
47         EXCEPTION WHEN NO_DATA_FOUND THEN
48             l_ReturnString := 'INVALID_SRCPLNID';
49             RETURN l_ReturnString;
50         WHEN others THEN
51             g_ErrorCode := 'ERROR_UNEXPECTED_00001';
52             raise;
53     END;
54 
55     l_ReturnString := 'OK';
56     OrgId := l_OrgId;
57     InsId := l_InsId;
58     SrcPlanName := l_PlanName;
59     RETURN l_ReturnString;
60 END VALIDATE_COPY_PLAN_ID;
61 
62 -- validate destination plan name
63 FUNCTION VALIDATE_DEST_PLAN_NAME(
64         OrgId              IN         NUMBER,
65         InsId              IN         NUMBER,
66         PlanName           IN         VARCHAR2
67         ) RETURN VARCHAR2 AS
68 l_ReturnString    VARCHAR2(30);
69 l_Dummy           NUMBER;
70 BEGIN
71     BEGIN
72         SELECT 1 INTO l_Dummy
73         FROM
74             msc_plans       plans
75         WHERE
76             plans.organization_id = OrgId AND
77             plans.sr_instance_id = InsId AND
78             plans.compile_designator = PlanName;
79         EXCEPTION WHEN NO_DATA_FOUND THEN
80             l_ReturnString := 'OK';
81             RETURN l_ReturnString;
82         WHEN others THEN
83             g_ErrorCode := 'ERROR_UNEXPECTED_00002';
84             raise;
85     END;
86 
87     l_ReturnString := 'INVALID_DESTPLNNAME';
88     RETURN l_ReturnString;
89 END VALIDATE_DEST_PLAN_NAME;
90 
91 -- get Destination Org Selection
92 FUNCTION GET_DEST_ORG_SELECTION(
93         OrgId              IN         NUMBER,
94         InsId              IN         NUMBER,
95         PlanName           IN         VARCHAR2
96         ) RETURN NUMBER AS
97 l_Dest_OrgSel           NUMBER;
98 BEGIN
99     BEGIN
100         SELECT organization_selection INTO l_Dest_OrgSel
101         FROM msc_designators
102         WHERE
103             designator = PlanName AND
104             organization_id = OrgId AND
105             sr_instance_id = InsId;
106         EXCEPTION
107         WHEN others THEN
108             g_ErrorCode := 'ERROR_UNEXPECTED_00003';
109             raise;
110     END;
111     RETURN l_Dest_OrgSel;
112 END GET_DEST_ORG_SELECTION;
113 
114 
115 -- validate Designator Id
116 FUNCTION VALIDATE_DESIGATOR_ID( DesignatorId IN  NUMBER ) RETURN VARCHAR2 AS
117 l_ReturnString    VARCHAR2(30);
118 l_DesignatorId    NUMBER;
119 BEGIN
120     BEGIN
121         SELECT
122             designator_id INTO l_DesignatorId
123 	FROM
124 	    msc_designators
125 	WHERE
126 	    designator_id = DesignatorId AND
127 	    nvl(copy_designator_id,-1) = -1 AND
128 	    (
129 	        -- 2,3,4 for ASCP. 8 is DRP. 11 is SRP
130 	        ( designator_type IN (2, 3, 4, 8, 11) AND nvl(collected_flag,2) <> 1 ) OR
131 	        -- IO plan
132 	        /*
133 	         This decode statement is copied from the 'Name' form of IO plan.
134 	         Will come back and re-look at this decode, it always returns 5,
135 	         why?
136 	        */
137 	        ( designator_type = decode(4, 1,3,2,2,3,4,4,5,9,12) )
138 	    );
139         EXCEPTION WHEN NO_DATA_FOUND THEN
140             l_ReturnString := 'INVALID_DESIGNATORID';
141             RETURN l_ReturnString;
142         WHEN others THEN
143             g_ErrorCode := 'ERROR_UNEXPECTED_00004';
144             raise;
145 
146     END;
147 
148     l_ReturnString := 'OK';
149     RETURN l_ReturnString;
150 END VALIDATE_DESIGATOR_ID;
151 
152 -- validate archive plan id, simulate the logic from Value Set "MSC_SRS_NAME_COPY"
153 FUNCTION VALIDATE_ARCHIVE_PLAN_ID(
154         ArchiveFlag        OUT NOCOPY NUMBER,
155         PlanId             IN         NUMBER
156         ) RETURN VARCHAR2 AS
157 BEGIN
158     BEGIN
159         SELECT NVL(archive_flag, 2)
160         INTO ArchiveFlag
161         FROM
162             msc_plans       plans,
163             msc_designators desig
164         WHERE
165             plans.organization_id = desig.organization_id AND
166             plans.sr_instance_id = desig.sr_instance_id AND
167             plans.compile_designator = desig.designator AND
168             NVL(desig.disable_date, TRUNC(SYSDATE) + 1) > TRUNC(SYSDATE) AND
169             plans.organization_selection <> 1 AND
170             plans.curr_plan_type in (1,2,3,4,5,8,9) AND
171             plans.plan_completion_date IS NOT NULL AND
172             plans.data_completion_date IS NOT NULL AND
173             plans.plan_id <> -1 AND
174             ( (plans.curr_plan_type in (1,2,3,4,8,9) AND
175               plans.organization_selection <> 1) or
176               plans.curr_plan_type = 5 ) AND
177             NVL(plans.copy_plan_id,-1) = -1 AND
178             NVL(desig.copy_designator_id, -1) = -1 AND
179             plans.plan_id = PlanId;
180         EXCEPTION WHEN NO_DATA_FOUND THEN
181             RETURN 'INVALID_PLAN_ID';
182         WHEN others THEN
183             g_ErrorCode := 'ERROR_UNEXPECTED_00007';
184             raise;
185     END;
186 
187     RETURN 'OK';
188 END VALIDATE_ARCHIVE_PLAN_ID;
189 
190 PROCEDURE COPY_PLAN(
191         ProcessId          OUT NOCOPY NUMBER,
192         Status             OUT NOCOPY VARCHAR2,
193         UserName           IN         VARCHAR2,
194         RespName           IN         VARCHAR2,
195         RespAppName        IN         VARCHAR2,
196         SecurityGroupName  IN         VARCHAR2,
197         Language           IN         VARCHAR2,
198         SrcPlanId          IN         NUMBER,
199         DestPlanName       IN         VARCHAR2,
200         DestPlanDesc       IN         VARCHAR2 default NULL,
201         DestATP            IN         VARCHAR2,
202         DestProd           IN         VARCHAR2,
203         DestNoti           IN         VARCHAR2,
204         DestInacOn         IN         DATE default NULL,
205         CopyOptionsOnly    IN         VARCHAR2
206         ) IS
207 l_String            VARCHAR2(100);
208 l_ResponsibilityId  NUMBER;
209 l_SecurityGroupId   NUMBER;
210 l_OrgId             NUMBER;
211 l_InsId             NUMBER;
212 l_SrcPlanName       VARCHAR2(10);
213 l_DestOrgSelection  NUMBER;
214 l_Number            NUMBER;
215 l_PlanType          NUMBER;
216 BEGIN
217     -- query user id, responsibility id and security group id
218     MSC_WS_COMMON.GET_PERMISSION_IDS(l_String, g_UserId, l_ResponsibilityId, l_SecurityGroupId, UserName, RespName, RespAppName, SecurityGroupName, Language);
219     IF (l_String <> 'OK') THEN
220         Status := l_String;
221         RETURN;
222     END IF;
223 
224     MSC_WS_COMMON.VALIDATE_USER_RESP_FUNC(l_String, g_UserId, l_ResponsibilityId, 'MSCFPCMN-SCP',l_SecurityGroupId);
225     IF (l_String <> 'OK') THEN
226       MSC_WS_COMMON.VALIDATE_USER_RESP_FUNC(l_String, g_UserId, l_ResponsibilityId, 'MSCFPCMN-SRO',l_SecurityGroupId);
227       IF (l_String <> 'OK') THEN
228         MSC_WS_COMMON.VALIDATE_USER_RESP_FUNC(l_String, g_UserId, l_ResponsibilityId, 'MSCFPCDP',l_SecurityGroupId);
229         IF (l_String <> 'OK') THEN
230           MSC_WS_COMMON.VALIDATE_USER_RESP_FUNC(l_String, g_UserId, l_ResponsibilityId, 'MSCFPCMN-SRP',l_SecurityGroupId);
231           IF (l_String <> 'OK') THEN
232             Status := l_String;
233             RETURN;
234           END IF;
235         END IF;
236       END IF;
237     END IF;
238 
239     IF MSC_WS_COMMON.BOOL_TO_NUMBER(CopyOptionsOnly) = MSC_UTIL.SYS_YES THEN
240         /*
241         The Copy Plan Options Only feature is not implemented yet, will do it later.
242         */
243         ProcessId := -1;
244         Status := 'We don''t support Copy Plan Options Only feature for now!';
245     ELSE
246         -- check source plan id
247         l_String := VALIDATE_COPY_PLAN_ID(l_OrgId, l_InsId, l_SrcPlanName, SrcPlanId);
248         IF (l_String <> 'OK') THEN
249             ProcessId := -1;
250             Status := l_String;
251             RETURN;
252         END IF;
253 
254         -- check destination plan name
255         l_String := VALIDATE_DEST_PLAN_NAME(l_OrgId, l_InsId, DestPlanName);
256         IF (l_String <> 'OK') THEN
257             ProcessId := -1;
258             Status := l_String;
259             RETURN;
260         END IF;
261 
262         -- get Destination Org Selection
263         l_DestOrgSelection := GET_DEST_ORG_SELECTION(l_OrgId, l_InsId, l_SrcPlanName);
264 
265         BEGIN
266             SELECT curr_plan_type INTO l_PlanType
267 	    FROM   msc_plans
268             WHERE  plan_id = SrcPlanId;
269             EXCEPTION WHEN others THEN
270                 g_ErrorCode := 'ERROR_UNEXPECTED_00005';
271                 raise;
272         END;
273 
274         -- validate the rest parameters for diff plan type
275         IF l_PlanType  = 4 OR l_PlanType  = 8 THEN -- IO/SRP
276             IF DestATP <> 'N' THEN
277                 ProcessId := -1;
278                 Status := 'INVALID_DESTATP';
279                 RETURN;
280             END IF;
281             IF DestProd <> 'N' THEN
282                 ProcessId := -1;
283                 Status := 'INVALID_DESTPROD';
284                 RETURN;
285             END IF;
286             IF l_PlanType  = 4 THEN -- IO
287                 IF DestNoti <> 'N' THEN
288                     ProcessId := -1;
289                     Status := 'INVALID_DESTNOTI';
290                     RETURN;
291                 END IF;
292             END IF;
293         END IF;
294 
295         -- Now, submit the conc. program to run
296         l_Number := fnd_request.submit_request(
297                               application => 'MSC',
298                               program => 'MSCCPP5',
299                               argument1 => SrcPlanId,
300                               argument2 => DestPlanName,
301                               argument3 => DestPlanDesc,
302                               argument4 => l_DestOrgSelection,
303                               argument5 => MSC_WS_COMMON.BOOL_TO_NUMBER(DestATP),
304                               argument6 => MSC_WS_COMMON.BOOL_TO_NUMBER(DestProd),
305                               argument7 => MSC_WS_COMMON.BOOL_TO_NUMBER(DestNoti),
306                               argument8 => to_char(DestInacOn, 'DD-MM-YYYY'),
307                               argument9 => l_OrgId,
308                               argument10 => l_InsId
309                               );
310     IF (l_Number = 0) THEN
311         ProcessId := -1;
312         -- Status := 'Failed '||fnd_message.get;
313         Status := 'ERROR_SUBMIT';
314     ELSE
315         ProcessId := l_Number;
316         Status := 'SUCCESS';
317     END IF;
318 
319     END IF;
320     EXCEPTION
321         WHEN others THEN
322             ProcessId := -1;
323             Status := g_ErrorCode;
324 
325 END COPY_PLAN;
326 
327 PROCEDURE PURGE_PLAN(
328         ProcessId          OUT NOCOPY NUMBER,
329         Status             OUT NOCOPY VARCHAR2,
330         UserName           IN         VARCHAR2,
331         RespName           IN         VARCHAR2,
332         RespAppName        IN         VARCHAR2,
333         SecurityGroupName  IN         VARCHAR2,
334         Language           IN         VARCHAR2,
335         DesignatorId       IN         NUMBER
336         ) IS
337 l_String            VARCHAR2(100);
338 l_ResponsibilityId  NUMBER;
339 l_SecurityGroupId   NUMBER;
340 l_Number            NUMBER;
341 BEGIN
342     -- query user id, responsibility id and security group id
343     MSC_WS_COMMON.GET_PERMISSION_IDS(l_String, g_UserId, l_ResponsibilityId, l_SecurityGroupId, UserName, RespName, RespAppName, SecurityGroupName, Language);
344     IF (l_String <> 'OK') THEN
345         Status := l_String;
346         RETURN;
347     END IF;
348 
349     MSC_WS_COMMON.VALIDATE_USER_RESP_FUNC(l_String, g_UserId, l_ResponsibilityId, 'MSCFPCMN-SCP',l_SecurityGroupId);
350     IF (l_String <> 'OK') THEN
351       MSC_WS_COMMON.VALIDATE_USER_RESP_FUNC(l_String, g_UserId, l_ResponsibilityId, 'MSCFPCMN-SRO',l_SecurityGroupId);
352       IF (l_String <> 'OK') THEN
353         MSC_WS_COMMON.VALIDATE_USER_RESP_FUNC(l_String, g_UserId, l_ResponsibilityId, 'MSCFPCDP',l_SecurityGroupId);
354         IF (l_String <> 'OK') THEN
355           MSC_WS_COMMON.VALIDATE_USER_RESP_FUNC(l_String, g_UserId, l_ResponsibilityId, 'MSCFPCMN-SRP',l_SecurityGroupId);
356           IF (l_String <> 'OK') THEN
357             Status := l_String;
358             RETURN;
359           END IF;
360         END IF;
361       END IF;
362     END IF;
363 
364 
365     -- check DesignatorId
366     l_String := Validate_Desigator_Id(DesignatorId);
367     IF (l_String <> 'OK') THEN
368         ProcessId := -1;
369         Status := l_String;
370         RETURN;
371     END IF;
372 
373     -- Hardcoding to mfg, Advanced Supply Chain Planner for prototype
374     -- this init function call is embedded in MSC_WS_COMMON.VALIDATE_USER_RESP
375     -- fnd_global.apps_initialize(1068, 21634, 724);
376 
377     -- Update the MSC_DESIGNATORS table to disable it to prevent further
378     -- activities, such as plan launch while the purge is taking place
379     BEGIN
380         UPDATE msc_designators
381         SET disable_date = sysdate
382         WHERE designator_id = DesignatorId;
383         EXCEPTION WHEN others THEN
384             g_ErrorCode := 'ERROR_UNEXPECTED_00006';
385             raise;
386     END;
387 
388     -- Now, submit the conc. program to run
389     l_Number := fnd_request.submit_request(
390                               application => 'MSC',
391                               program => 'MSCPRG',
392                               argument1 => to_char(DesignatorId)
393                               );
394     IF (l_Number = 0) THEN
395         ProcessId := -1;
396         -- Status := 'Failed '||fnd_message.get;
397         Status := 'ERROR_SUBMIT';
398     ELSE
399         ProcessId := l_Number;
400         Status := 'SUCCESS';
401     END IF;
402 
403     EXCEPTION
404         WHEN others THEN
405             ProcessId := -1;
406             Status := g_ErrorCode;
407 
408 END PURGE_PLAN;
409 
410 PROCEDURE ARCHIVE_PLAN(
411         ProcessId          OUT NOCOPY NUMBER,
412         Status             OUT NOCOPY VARCHAR2,
413         UserName           IN         VARCHAR2,
414         RespName           IN         VARCHAR2,
415         RespAppName        IN         VARCHAR2,
416         SecurityGroupName  IN         VARCHAR2,
417         Language           IN         VARCHAR2,
418         PlanId             IN         NUMBER
419         ) IS
420 l_String            VARCHAR2(100);
421 l_ResponsibilityId  NUMBER;
422 l_SecurityGroupId   NUMBER;
423 l_ArchiveFlag       NUMBER;
424 l_Number            NUMBER;
425 BEGIN
426 -- dbms_output.put_line('Matthew: Init');
427     -- init global variables
428     g_ErrorCode    := '';
429     ProcessId      := -1;
430 
431     -- query user id, responsibility id and security group id
432     MSC_WS_COMMON.GET_PERMISSION_IDS(l_String, g_UserId, l_ResponsibilityId, l_SecurityGroupId, UserName, RespName, RespAppName, SecurityGroupName, Language);
433     IF (l_String <> 'OK') THEN
434         Status := l_String;
435         RETURN;
436     END IF;
437 
438     MSC_WS_COMMON.VALIDATE_USER_RESP_FUNC(l_String, g_UserId, l_ResponsibilityId, 'MSCFPCMN-SCP',l_SecurityGroupId);
439     IF (l_String <> 'OK') THEN
440       MSC_WS_COMMON.VALIDATE_USER_RESP_FUNC(l_String, g_UserId, l_ResponsibilityId, 'MSCFPCMN-SRO',l_SecurityGroupId);
441       IF (l_String <> 'OK') THEN
442         MSC_WS_COMMON.VALIDATE_USER_RESP_FUNC(l_String, g_UserId, l_ResponsibilityId, 'MSCFPCDP',l_SecurityGroupId);
443         IF (l_String <> 'OK') THEN
444           MSC_WS_COMMON.VALIDATE_USER_RESP_FUNC(l_String, g_UserId, l_ResponsibilityId, 'MSCFPCMN-SRP',l_SecurityGroupId);
445           IF (l_String <> 'OK') THEN
446             Status := l_String;
447             RETURN;
448           END IF;
449         END IF;
450       END IF;
451     END IF;
452 
453     -- check plan id
454     l_String := VALIDATE_ARCHIVE_PLAN_ID(l_ArchiveFlag, PlanId);
455     IF (l_String <> 'OK') THEN
456         Status := l_String;
457         RETURN;
458     END IF;
459 
460     -- Now, submit the conc. program to run
461     /* * * * * * * * * * * * * * * * * * * * * * * *
462     2008/02/25
463     Although Archive Plan Summary conc prog is documented
464     to take plan id as the only parameter in MA1DV210,
465     it is coded to take an extra parameter in
466     patch/115/sql/MSCBISUB.pls, 120.7 2008/01/26 01:18:16.
467 
468     l_Number := fnd_request.submit_request(
469                           application => 'MSC',
470                           program => 'MSCHUBA',
471                           argument1 => to_char(PlanId)
472                           );
473     * * * * * * * * * * * * * * * * * * * * * * * */
474 
475     l_Number := fnd_request.submit_request(
476                           application => 'MSC',
477                           program => 'MSCHUBA',
478                           argument1 => PlanId,
479                           argument3 => l_ArchiveFlag
480                           );
481 
482     IF (l_Number = 0) THEN
483         Status := 'ERROR_SUBMIT';
484     ELSE
485         ProcessId := l_Number;
486         Status := 'SUCCESS';
487     END IF;
488 
489     EXCEPTION
490         WHEN others THEN
491             Status := g_ErrorCode;
492 
493 END ARCHIVE_PLAN;
494 
495 END MSC_WS_PLAN_MANAGEMENT;
496