DBA Data[Home] [Help]

PACKAGE BODY: APPS.MRP_ADJUST_DATES_PK

Source


1 PACKAGE BODY mrp_adjust_dates_pk AS
2  /* $Header: MRPPADTB.pls 120.1 2005/10/09 23:59:01 rgurugub noship $ */
3     -- ******************* mrp_adjust_dates_by_calendar *********************
4     PROCEDURE   mrp_adjust_dates_by_calendar(
5                             cal_code        IN      VARCHAR2,
6                             except_set_id   IN      NUMBER,
7                             user_id         IN      NUMBER,
8                             error_msg       IN OUT NOCOPY  VARCHAR2) IS
9     org_id      NUMBER;
10     CURSOR  organizations_cur IS
11         SELECT  organization_id
12         FROM    mtl_parameters mtl
13         WHERE   mtl.calendar_code = cal_code
14         AND     mtl.calendar_exception_set_id = except_set_id;
15 
16     l_error_msg VARCHAR2(240);
17 
18     BEGIN
19 
20         l_error_msg := error_msg;
21 
22         OPEN    organizations_cur;
23         LOOP
24             FETCH   organizations_cur   INTO
25                     org_id;
26 
27             EXIT WHEN organizations_cur%NOTFOUND;
28             mrp_adjust_dates_by_org(cal_code, except_set_id,
29                         org_id, user_id, error_msg);
30 
31             IF error_msg is not null then
32                 EXIT;
33             END IF;
34 
35         END LOOP;
36 
37     EXCEPTION WHEN OTHERS THEN
38       error_msg := l_error_msg;
39 
40     END mrp_adjust_dates_by_calendar;   -- END mrp_adjust_dates_by_calendar
41 
42     -- *********************** mrp_adjust_dates_by_org ********************
43 
44     PROCEDURE   mrp_adjust_dates_by_org(
45                             cal_code        IN  VARCHAR2,
46                             except_set_id   IN  NUMBER,
47                             org_id          IN  NUMBER,
48                             user_id         IN  NUMBER,
49                             error_msg       IN OUT NOCOPY  VARCHAR2) IS
50                 min_date            DATE;
51                 max_date            DATE;
52                 statement           INTEGER := 0;
53                 string_buffer       CHAR(1);
54                 forecast_exists     BOOLEAN := FALSE;
55                 demand_exists       BOOLEAN := FALSE;
56 
57                 l_error_msg VARCHAR2(240);
58     BEGIN
59 
60       l_error_msg := error_msg;
61 
62       BEGIN
63             SELECT 'x' into string_buffer
64             FROM dual
65             WHERE exists
66             (SELECT schedule_date
67             FROM   mrp_schedule_dates
68             WHERE  organization_id = org_id);
69             demand_exists := TRUE;
70       EXCEPTION
71             WHEN NO_DATA_FOUND THEN
72             demand_exists := FALSE;
73       END;
74 
75       BEGIN
76             SELECT 'x' into string_buffer
77             FROM dual
78             WHERE exists
79                 (SELECT forecast_date
80                 FROM    mrp_forecast_dates
81                 WHERE   organization_id = org_id);
82                 forecast_exists := TRUE;
83       EXCEPTION
84             WHEN NO_DATA_FOUND THEN
85              forecast_exists := FALSE;
86       END;
87 
88 
89 
90 --  Select the minimum and maximum calendar_dates if no rows exist then raise
91 --  exception
92      IF forecast_exists or demand_exists THEN
93         SELECT min(calendar_date), max(calendar_date)
94         INTO    min_date, max_date
95         FROM    bom_calendar_dates
96         WHERE   exception_set_id = except_set_id
97         AND     calendar_code = cal_code;
98 
99         IF min_date IS NULL THEN
100             raise no_data_found;
101         END IF;
102         statement := 1;
103 
104     END IF;
105 --  Check if enough data exists in the calendar to cover the current dates
106 --  in mrp_schedule_dates
107    IF demand_exists THEN
108         SELECT  'x' INTO string_buffer
109         FROM    dual
110         WHERE   NOT EXISTS
111                 (SELECT schedule_date
112                  FROM   mrp_schedule_dates
113                  WHERE  organization_id = org_id
114                  AND    schedule_date < min_date
115 		 AND schedule_level=2)
116         AND     NOT EXISTS
117                 (SELECT schedule_date
118                  FROM   mrp_schedule_dates
119                  WHERE  organization_id = org_id
120                  AND    DECODE(rate_end_date, NULL, schedule_date,
121                                 rate_end_date) > max_date
122 				AND schedule_level=2);
123         statement := 2;
124     END IF;
125 --  Check if enough data exists in the calendar to cover the current dates
126 --  in mrp_forecast_dates
127      IF forecast_exists THEN
128 
129         SELECT  'x' INTO string_buffer
130         FROM    dual
131         WHERE   NOT EXISTS
132                 (SELECT forecast_date
133                 FROM    mrp_forecast_dates
134                 WHERE   organization_id = org_id
135                 AND    forecast_date < min_date)
136         AND     NOT EXISTS
137                 (SELECT forecast_date
138                 FROM    mrp_forecast_dates
139                 WHERE  organization_id = org_id
140                 AND    DECODE(rate_end_date, NULL, forecast_date,
141                                 rate_end_date) > max_date);
142      END IF;
143 
144 --  Update the schedule workdate to be the next valid work date for MPS,
145 --  and the previous valid workdate for MDS.
146 
147 --  For multi-org schedules we check the schedule type in the owning
148 --  org  for entries in the current org
149 
150     IF demand_exists THEN
151         UPDATE  mrp_schedule_dates  dates
152         SET /*  dates.last_update_date = SYSDATE,
153                 dates.last_updated_by = user_id, */
154                 dates.schedule_workdate =
155                 (SELECT     DECODE(desig.schedule_type, 1, prior_date,
156                                     next_date)
157                 FROM        bom_calendar_dates          cal,
158                             mrp_schedule_designators    desig
159                 WHERE       cal.calendar_code = cal_code
160                   AND       cal.exception_set_id = except_set_id
161 /*2285842         AND       cal.calendar_date = dates.schedule_workdate*/
162                   AND       cal.calendar_date = dates.schedule_date
163                   AND       desig.organization_id
164                             in (select organization_id
165                                 from    mrp_plan_organizations_v  orgs
166                                 where   orgs.compile_designator =
167                                             dates.schedule_designator
168                                 and     orgs.planned_organization =
169                                         dates.organization_id
170                                 union all
171                                 select  org_id
172                                 from    dual)
173                   AND       desig.schedule_designator =
174                                 dates.schedule_designator)
175         WHERE   dates.organization_id = org_id
176           AND   dates.schedule_level = 2;
177 
178 --  Set the schedule date to be a valid workdate if it's repetitive or if
179 --  it's an MPS
180 
181 --  We check the schedule_type from the owning org for multi-org schedules
182 
183         UPDATE  mrp_schedule_dates  dates
184         SET     dates.last_update_date = SYSDATE,
185                 dates.last_updated_by = user_id,
186                 dates.schedule_date = schedule_workdate
187         WHERE   ((organization_id, schedule_designator) IN
188                 (SELECT org_id, desig.schedule_designator
189                 FROM    mrp_schedule_designators desig,
190                         mrp_plan_organizations_v orgs
191                 WHERE   orgs.planned_organization (+) = org_id
192                 AND     desig.organization_id = NVL(orgs.organization_id,
193                                                 org_id)
194                 AND     desig.schedule_designator =
195                             orgs.compile_designator (+)
196                 AND     desig.schedule_type = 2)  OR
197                 dates.rate_end_date IS NOT NULL)
198           AND   dates.organization_id = org_id;
199 
200 --  Always set the rate end date to be the previous valid date for repetitive
201 --  entries
202 
203         UPDATE  mrp_schedule_dates  dates
204         SET /*  dates.last_update_date = SYSDATE,
205                 dates.last_updated_by = user_id, */
206                 dates.rate_end_date =
207                 (SELECT     GREATEST(prior_date, dates.schedule_date)
208                 FROM        bom_calendar_dates          cal
209                 WHERE       cal.calendar_code = cal_code
210                   AND       cal.exception_set_id = except_set_id
211                   AND       cal.calendar_date = dates.rate_end_date)
212         WHERE   dates.rate_end_date IS NOT NULL
213           AND   dates.schedule_level = 2
214           AND   dates.organization_id = org_id;
215      END IF;
216 --  Set daily forecast entries to be valid dates
217    IF forecast_exists THEN
218 
219         UPDATE  mrp_forecast_dates  dates
220         SET /*  dates.last_update_date = SYSDATE,
221                 dates.last_updated_by = user_id, */
222                 dates.forecast_date =
223                 (SELECT     prior_date
224                 FROM        bom_calendar_dates          cal
225                 WHERE       cal.calendar_code = cal_code
226                   AND       cal.exception_set_id = except_set_id
227                   AND       cal.calendar_date = dates.forecast_date)
228         WHERE   dates.bucket_type = 1
229           AND   dates.organization_id = org_id;
230 
231 --  Set end dates for daily forecast entries to be valid dates
232 
233         UPDATE  mrp_forecast_dates  dates
234         SET /*  dates.last_update_date = SYSDATE,
235                 dates.last_updated_by = user_id, */
239                 WHERE       cal.calendar_code = cal_code
236                 dates.rate_end_date =
237                 (SELECT     prior_date
238                 FROM        bom_calendar_dates          cal
240                   AND       cal.exception_set_id = except_set_id
241                   AND       cal.calendar_date = dates.rate_end_date)
242         WHERE   dates.rate_end_date IS NOT NULL
243           AND   dates.bucket_type = 1
244           AND   organization_id = org_id;
245 
246 --  Set weekly forecast entries to be valid dates
247 
248         UPDATE  mrp_forecast_dates  dates
249         SET /*  dates.last_update_date = SYSDATE,
250                 dates.last_updated_by = user_id, */
251                 dates.forecast_date =
252                 (SELECT     MAX(week_start_date)
253                 FROM        bom_cal_week_start_dates        cal
254                 WHERE       cal.calendar_code = cal_code
255                   AND       cal.exception_set_id = except_set_id
256                   AND       cal.week_start_date <= dates.forecast_date)
257         WHERE   dates.bucket_type = 2
258           AND   dates.organization_id = org_id;
259 
260 
261 --  Set weekly end dates to be valid dates
262 
263         UPDATE  mrp_forecast_dates  dates
264         SET /*  dates.last_update_date = SYSDATE,
265                 dates.last_updated_by = user_id, */
266                 dates.rate_end_date =
267                 (SELECT     MAX(week_start_date)
268                 FROM        bom_cal_week_start_dates        cal
269                 WHERE       cal.calendar_code = cal_code
270                   AND       cal.exception_set_id = except_set_id
271                   AND       cal.week_start_date <= dates.rate_end_date)
272         WHERE   dates.rate_end_date IS NOT NULL
273           AND   dates.bucket_type = 2
274           AND   dates.organization_id = org_id;
275 
276 --  Set monthly forecast entries to be valid dates
277 
278         UPDATE  mrp_forecast_dates  dates
279         SET /*  dates.last_update_date = SYSDATE,
280                 dates.last_updated_by = user_id, */
281                 dates.forecast_date =
282                 (SELECT     MAX(period_start_date)
283                 FROM        bom_period_start_dates          cal
284                 WHERE       cal.calendar_code = cal_code
285                   AND       cal.exception_set_id = except_set_id
286                   AND       cal.period_start_date <= dates.forecast_date)
287         WHERE   dates.bucket_type = 3
288           AND   dates.organization_id = org_id;
289 
290 --  Set monthly end dates to be valid dates
291 
292         UPDATE  mrp_forecast_dates  dates
293         SET /*  dates.last_update_date = SYSDATE,
294                 dates.last_updated_by = user_id, */
295                 dates.rate_end_date =
296                 (SELECT     MAX(period_start_date)
297                 FROM        bom_period_start_dates          cal
298                 WHERE       cal.calendar_code = cal_code
299                   AND       cal.exception_set_id = except_set_id
300                   AND       cal.period_start_date <= dates.rate_end_date)
301         WHERE   dates.rate_end_date IS NOT NULL
302           AND   dates.bucket_type = 3
303           AND   dates.organization_id = org_id;
304     END IF;
305 --  Set the snapshot and plan completion date to NULL
306     IF demand_exists or forecast_exists then
307         UPDATE  mrp_plans
308         SET     data_completion_date = NULL,
309                 plan_completion_date = NULL
310         WHERE   (compile_designator , organization_id) in
311 		(SELECT compile_designator , organization_id
312 		 FROM mrp_plan_organizations_v
313 		 WHERE
314 			planned_organization = org_id);
315 
316         COMMIT;
317     end if;
318         error_msg := NULL;
319 
320     EXCEPTION
321         WHEN no_data_found THEN
322             IF statement = 0 THEN
323                 error_msg := 'GEN-calendar not compiled';
324             ELSIF statement = 1 THEN
325                 error_msg := 'GEN-invalid schedules';
326             ELSE
327                 error_msg := 'GEN-invalid forecasts';
328             END IF;
329         WHEN OTHERS THEN
330             error_msg := l_error_msg;
331 
332     END mrp_adjust_dates_by_org;    -- END mrp_adjust_dates_by_org
333 END mrp_adjust_dates_pk;    -- END PACKAGE