DBA Data[Home] [Help]

PACKAGE BODY: APPS.GMO_DISPENSE_SETUP_PVT

Source


1 PACKAGE BODY GMO_DISPENSE_SETUP_PVT
2 -- $Header: GMOVDSSB.pls 120.3 2006/02/01 14:45:31 swasubra noship $
3 AS
4 
5 
6 --This function is used to obtain the display name of the item
7 --identified by the item ID.
8 FUNCTION GET_ITEM_DISPLAY_NAME(P_ITEM_ID NUMBER)
9 RETURN VARCHAR2
10 
11 IS
12 
13 --This cursor would fetch the item display name for the specified
14 --item ID.
15 CURSOR GET_ITEM_DISPLAY_NAME_CUR IS
16   SELECT
17     CONCATENATED_SEGMENTS
18   FROM
19     MTL_SYSTEM_ITEMS_VL
20   WHERE
21     INVENTORY_ITEM_ID = P_ITEM_ID;
22 
23 --This variable would hold the item display name.
24 L_DISPLAY_NAME VARCHAR2(240);
25 
26 BEGIN
27 
28   --Open the cursor.
29   OPEN GET_ITEM_DISPLAY_NAME_CUR;
30 
31   --Fetch the item display name into the local variable.
32   FETCH GET_ITEM_DISPLAY_NAME_CUR INTO L_DISPLAY_NAME;
33 
34   --Close the cursor.
35   CLOSE GET_ITEM_DISPLAY_NAME_CUR;
36 
37   --Return the item display name.
38   RETURN L_DISPLAY_NAME;
39 
40   EXCEPTION
41     WHEN OTHERS THEN
42 
43       IF GET_ITEM_DISPLAY_NAME_CUR%ISOPEN THEN
44         CLOSE GET_ITEM_DISPLAY_NAME_CUR;
45       END IF;
46       FND_MESSAGE.SET_NAME('FND','FND_AS_UNEXPECTED_ERROR');
47       FND_MESSAGE.SET_TOKEN('ERROR_TEXT',SQLERRM);
48       FND_MESSAGE.SET_TOKEN('PKG_NAME','GMO_DISPENSE_SETUP_PVT');
49       FND_MESSAGE.SET_TOKEN('PROCEDURE_NAME','GET_ITEM_DISPLAY_NAME');
50       IF (FND_LOG.LEVEL_UNEXPECTED >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
51         FND_LOG.MESSAGE(FND_LOG.LEVEL_UNEXPECTED,
52                         'edr.plsql.GMO_DISPENSE_SETUP_PVT.GET_ITEM_DISPLAY_NAME',
53                         FALSE
54                        );
55       END IF;
56     --Diagnostics End
57 
58       APP_EXCEPTION.RAISE_EXCEPTION;
59 
60 END GET_ITEM_DISPLAY_NAME;
61 
62 
63 --This function is used to obtain the description of the item
64 --identified by the item ID.
65 FUNCTION GET_ITEM_DESCRIPTION(P_ITEM_ID NUMBER)
66 RETURN VARCHAR2
67 
68 IS
69 
70 --This cursor would fetch the description for the specified
71 --item ID.
72 CURSOR GET_ITEM_DESCRIPTION_CUR IS
73   SELECT
74     DESCRIPTION
75   FROM
76     MTL_SYSTEM_ITEMS_VL
77   WHERE
78     INVENTORY_ITEM_ID = P_ITEM_ID;
79 
80 --This variable would hold the item description.
81 L_DESCRIPTION VARCHAR2(240);
82 
83 BEGIN
84 
85   --Open the cursor.
86   OPEN GET_ITEM_DESCRIPTION_CUR;
87 
88   --Fetch the item description into the local variable.
89   FETCH GET_ITEM_DESCRIPTION_CUR INTO L_DESCRIPTION;
90 
91   CLOSE GET_ITEM_DESCRIPTION_CUR;
92 
93   --Return the item description.
94   RETURN L_DESCRIPTION;
95 
96   EXCEPTION
97     WHEN OTHERS THEN
98 
99       IF GET_ITEM_DESCRIPTION_CUR%ISOPEN THEN
100         CLOSE GET_ITEM_DESCRIPTION_CUR;
101       END IF;
102       FND_MESSAGE.SET_NAME('FND','FND_AS_UNEXPECTED_ERROR');
103       FND_MESSAGE.SET_TOKEN('ERROR_TEXT',SQLERRM);
104       FND_MESSAGE.SET_TOKEN('PKG_NAME','GMO_DISPENSE_SETUP_PVT');
105       FND_MESSAGE.SET_TOKEN('PROCEDURE_NAME','GET_ITEM_DESCRIPTION');
106 
107       IF (FND_LOG.LEVEL_UNEXPECTED >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
108         FND_LOG.MESSAGE(FND_LOG.LEVEL_UNEXPECTED,
109                         'edr.plsql.GMO_DISPENSE_SETUP_PVT.GET_ITEM_DESCRIPTION',
110                         FALSE
111                        );
112       END IF;
113 
114       APP_EXCEPTION.RAISE_EXCEPTION;
115 
116 END GET_ITEM_DESCRIPTION;
117 
118 
119 --This procedure is used to create a definition context in Process Instructions
120 --for the specified entity name, entity key and instruction types. It would return
121 --a instruction process ID through its OUT parameter.
122 PROCEDURE CREATE_DEFN_CONTEXT
123 (
124     P_ENTITY_NAME                IN VARCHAR2,
125     P_ENTITY_KEY                 IN VARCHAR2,
126     P_ENTITY_DISPLAYNAME         IN VARCHAR2,
127     P_INSTRUCTION_TYPE           IN FND_TABLE_OF_VARCHAR2_255,
128     P_MODE                       IN VARCHAR2,
129     P_CONTEXT_PARAMETER_NAMES    IN FND_TABLE_OF_VARCHAR2_255,
130     P_CONTEXT_PARAMETER_VALUES   IN FND_TABLE_OF_VARCHAR2_255,
131     P_CURR_INSTRUCTION_PROCESS_ID IN  NUMBER DEFAULT NULL,
132     X_INSTRUCTION_PROCESS_ID     OUT NOCOPY NUMBER
133 )
134 
135 IS
136 
137 
138 L_ENTITY_NAME        FND_TABLE_OF_VARCHAR2_255;
139 
140 L_ENTITY_KEY         FND_TABLE_OF_VARCHAR2_255;
141 
142 L_ENTITY_DISPLAYNAME FND_TABLE_OF_VARCHAR2_255;
143 
144 
145 L_RETURN_STATUS VARCHAR2(10);
146 L_MSG_COUNT     NUMBER;
147 L_MSG_DATA      VARCHAR2(4000);
148 
149 
150 L_CONTEXT_PARAMETERS GMO_DATATYPES_GRP.GMO_DEFINITION_PARAM_TBL_TYPE;
151 
152 i NUMBER;
153 
154 CREATE_ERROR EXCEPTION;
155 
156 BEGIN
157 
158   --Initialize the the entity names array containing only one element.
159   L_ENTITY_NAME        := FND_TABLE_OF_VARCHAR2_255();
160   L_ENTITY_NAME.EXTEND;
161 
162   --Initialize the the entity keys array containing only one element.
163   L_ENTITY_KEY         := FND_TABLE_OF_VARCHAR2_255();
164   L_ENTITY_KEY.EXTEND;
165 
166   --Initialize the the entity display name array containing only one element.
167   L_ENTITY_DISPLAYNAME := FND_TABLE_OF_VARCHAR2_255();
168   L_ENTITY_DISPLAYNAME.EXTEND;
169 
170   --Set the entity name, key and display name values.
171   L_ENTITY_NAME(1)        := P_ENTITY_NAME;
172   L_ENTITY_KEY(1)         := P_ENTITY_KEY;
173   L_ENTITY_DISPLAYNAME(1) := P_ENTITY_DISPLAYNAME;
174 
175   --Set the context parameter values.
176   FOR i IN 1..P_CONTEXT_PARAMETER_NAMES.COUNT LOOP
177 
178     L_CONTEXT_PARAMETERS(i).name := P_CONTEXT_PARAMETER_NAMES(i);
179     L_CONTEXT_PARAMETERS(i).value := P_CONTEXT_PARAMETER_VALUES(i);
180 
181   END LOOP;
182 
183   --Call the API to create a definition context.
184   GMO_INSTRUCTION_GRP.CREATE_DEFN_CONTEXT
185   (
186     P_API_VERSION            => 1.0,
187     P_INIT_MSG_LIST          => FND_API.G_FALSE,
188     P_VALIDATION_LEVEL       => FND_API.G_VALID_LEVEL_NONE,
189     P_ENTITY_NAME            => L_ENTITY_NAME,
190     P_ENTITY_KEY             => L_ENTITY_KEY,
191     P_ENTITY_DISPLAYNAME     => L_ENTITY_DISPLAYNAME,
192     P_INSTRUCTION_TYPE       => P_INSTRUCTION_TYPE,
193     P_MODE                   => P_MODE,
194     P_CONTEXT_PARAMETERS     => L_CONTEXT_PARAMETERS,
195     P_CURR_INSTR_PROCESS_ID  => P_CURR_INSTRUCTION_PROCESS_ID,
196     X_INSTRUCTION_PROCESS_ID => X_INSTRUCTION_PROCESS_ID,
197     X_RETURN_STATUS          => L_RETURN_STATUS,
198     X_MSG_COUNT              => L_MSG_COUNT,
199     X_MSG_DATA               => L_MSG_DATA
200   );
201 
202   --If the return status is not success then raise an exception.
203   IF L_RETURN_STATUS = FND_API.G_RET_STS_UNEXP_ERROR OR L_RETURN_STATUS = FND_API.G_RET_STS_ERROR  THEN
204     RAISE CREATE_ERROR;
205   END IF;
206 
207 EXCEPTION
208   WHEN CREATE_ERROR THEN
209     FND_MESSAGE.SET_ENCODED(L_MSG_DATA);
210 
211     IF (FND_LOG.LEVEL_UNEXPECTED >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
212       FND_LOG.MESSAGE(FND_LOG.LEVEL_UNEXPECTED,
213                       'edr.plsql.GMO_DISPENSE_SETUP_PVT.CREATE_DEFN_CONTEXT',
214                       FALSE
215                      );
216     END IF;
217 
218     APP_EXCEPTION.RAISE_EXCEPTION;
219 
220   WHEN OTHERS THEN
221     FND_MESSAGE.SET_NAME('FND','FND_AS_UNEXPECTED_ERROR');
222     FND_MESSAGE.SET_TOKEN('ERROR_TEXT',SQLERRM);
223     FND_MESSAGE.SET_TOKEN('PKG_NAME','GMO_DISPENSE_SETUP_PVT');
224     FND_MESSAGE.SET_TOKEN('PROCEDURE_NAME','CREATE_DEFN_CONTEXT');
225 
226     IF (FND_LOG.LEVEL_UNEXPECTED >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
227       FND_LOG.MESSAGE(FND_LOG.LEVEL_UNEXPECTED,
228                       'edr.plsql.GMO_DISPENSE_SETUP_PVT.CREATE_DEFN_CONTEXT',
229                       FALSE
230                      );
231     END IF;
232 
233     APP_EXCEPTION.RAISE_EXCEPTION;
234 
235 END CREATE_DEFN_CONTEXT;
236 
237 
238 --This procedure is used to update the context parameters associated with the specified process ID and entity parameters
239 PROCEDURE UPDATE_CONTEXT_PARAMS
240 (
241   P_INSTRUCTION_PROCESS_ID     IN  NUMBER,
242   P_ENTITY_NAME                IN  VARCHAR2,
243   P_ENTITY_KEY                 IN  VARCHAR2,
244   P_ENTITY_DISPLAYNAME         IN  VARCHAR2,
245   P_INSTRUCTION_TYPE           IN  FND_TABLE_OF_VARCHAR2_255,
246   P_CONTEXT_PARAMETER_NAMES    IN  FND_TABLE_OF_VARCHAR2_255,
247   P_CONTEXT_PARAMETER_VALUES   IN  FND_TABLE_OF_VARCHAR2_255
248 )
249 
250 IS
251 
252 L_ENTITY_NAME        FND_TABLE_OF_VARCHAR2_255;
253 
254 L_ENTITY_KEY         FND_TABLE_OF_VARCHAR2_255;
255 
256 L_ENTITY_DISPLAYNAME FND_TABLE_OF_VARCHAR2_255;
257 
258 
259 L_RETURN_STATUS          VARCHAR2(10);
260 L_MSG_COUNT              NUMBER;
261 L_MSG_DATA               VARCHAR2(4000);
262 
263 L_INSTRUCTION_PROCESS_ID NUMBER;
264 
265 
266 L_CONTEXT_PARAMETERS GMO_DATATYPES_GRP.GMO_DEFINITION_PARAM_TBL_TYPE;
267 
268 i NUMBER;
269 
270 UPDATE_ERROR EXCEPTION;
271 
272 BEGIN
273 
274   --Initialize the the entity names array containing only one element.
275   L_ENTITY_NAME        := FND_TABLE_OF_VARCHAR2_255();
276   L_ENTITY_NAME.EXTEND;
277 
278   --Initialize the the entity keys array containing only one element.
279   L_ENTITY_KEY         := FND_TABLE_OF_VARCHAR2_255();
280   L_ENTITY_KEY.EXTEND;
281 
282   --Initialize the the entity display name array containing only one element.
283   L_ENTITY_DISPLAYNAME := FND_TABLE_OF_VARCHAR2_255();
284   L_ENTITY_DISPLAYNAME.EXTEND;
285 
286   --Set the entity name, key and display name values.
287   L_ENTITY_NAME(1)        := P_ENTITY_NAME;
288   L_ENTITY_KEY(1)         := P_ENTITY_KEY;
289   L_ENTITY_DISPLAYNAME(1) := P_ENTITY_DISPLAYNAME;
290 
291   --Set the context parameter values.
292   FOR i IN 1..P_CONTEXT_PARAMETER_NAMES.COUNT LOOP
293 
294     L_CONTEXT_PARAMETERS(i).name := P_CONTEXT_PARAMETER_NAMES(i);
295     L_CONTEXT_PARAMETERS(i).value := P_CONTEXT_PARAMETER_VALUES(i);
296 
297   END LOOP;
298 
299   --Call the API to update the context parameters of the existing definition context.
300   GMO_INSTRUCTION_GRP.CREATE_DEFN_CONTEXT
301   (
302     P_API_VERSION            => 1.0,
303     P_INIT_MSG_LIST          => FND_API.G_FALSE,
304     P_VALIDATION_LEVEL       => FND_API.G_VALID_LEVEL_NONE,
305     P_CURR_INSTR_PROCESS_ID  => P_INSTRUCTION_PROCESS_ID,
306     P_ENTITY_NAME            => L_ENTITY_NAME,
307     P_ENTITY_KEY             => L_ENTITY_KEY,
308     P_ENTITY_DISPLAYNAME     => L_ENTITY_DISPLAYNAME,
309     P_INSTRUCTION_TYPE       => P_INSTRUCTION_TYPE,
310     P_MODE                   => GMO_CONSTANTS_GRP.G_INSTR_DEFN_MODE_UPDATE,
311     P_CONTEXT_PARAMETERS     => L_CONTEXT_PARAMETERS,
312     X_INSTRUCTION_PROCESS_ID => L_INSTRUCTION_PROCESS_ID,
313     X_RETURN_STATUS          => L_RETURN_STATUS,
314     X_MSG_COUNT              => L_MSG_COUNT,
315     X_MSG_DATA               => L_MSG_DATA
316   );
317 
318   --If the return status is not success then raise an exception.
319   IF L_RETURN_STATUS = FND_API.G_RET_STS_UNEXP_ERROR OR L_RETURN_STATUS = FND_API.G_RET_STS_ERROR  THEN
320     RAISE UPDATE_ERROR;
321   END IF;
322 
323 EXCEPTION
324   WHEN UPDATE_ERROR THEN
325     FND_MESSAGE.SET_ENCODED(L_MSG_DATA);
326 
327     IF (FND_LOG.LEVEL_UNEXPECTED >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
328       FND_LOG.MESSAGE(FND_LOG.LEVEL_UNEXPECTED,
329                       'edr.plsql.GMO_DISPENSE_SETUP_PVT.UPDATE_CONTEXT_PARAMS',
330                       FALSE
331                      );
332     END IF;
333 
334     APP_EXCEPTION.RAISE_EXCEPTION;
335 
336   WHEN OTHERS THEN
337     FND_MESSAGE.SET_NAME('FND','FND_AS_UNEXPECTED_ERROR');
338     FND_MESSAGE.SET_TOKEN('ERROR_TEXT',SQLERRM);
339     FND_MESSAGE.SET_TOKEN('PKG_NAME','GMO_DISPENSE_SETUP_PVT');
340     FND_MESSAGE.SET_TOKEN('PROCEDURE_NAME','CREATE_DEFN_CONTEXT');
341 
342     IF (FND_LOG.LEVEL_UNEXPECTED >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
343       FND_LOG.MESSAGE(FND_LOG.LEVEL_UNEXPECTED,
344                       'edr.plsql.GMO_DISPENSE_SETUP_PVT.UPDATE_CONTEXT_PARAMS',
345                       FALSE
346                      );
347     END IF;
348 
349     APP_EXCEPTION.RAISE_EXCEPTION;
350 
351 END UPDATE_CONTEXT_PARAMS;
352 
353 
354 --This procedure is used to construct transaction XML to be send to ERES for processing.
355 --In particular, it obtains the process instruction details (identified by the
356 --instruction process ID) in XML format and merges the same with the current XML parameter.
357 --This merged XML is returned as the output XML.
358 PROCEDURE GET_TRANSACTION_XML(P_INSTR_PROCESS_ID IN         NUMBER,
359                                P_CURRENT_XML      IN         CLOB,
360                               X_OUTPUT_XML       OUT NOCOPY CLOB)
361 
362 IS
363 
364 L_PROCESS_STATUS VARCHAR2(20);
365 
366 L_RETURN_STATUS  VARCHAR2(10);
367 
368 L_MSG_COUNT      NUMBER;
369 
370 L_MSG_DATA       VARCHAR2(4000);
371 
372 L_INSTR_XML      CLOB;
373 
374 XML_ERROR        EXCEPTION;
375 
376 BEGIN
377 
378 --Create a temporary CLOB that would hold the final transaction XML.
379 DBMS_LOB.CREATETEMPORARY(X_OUTPUT_XML, TRUE, DBMS_LOB.SESSION);
380 
381 --Append the contents of the current XML.
382 DBMS_LOB.APPEND(X_OUTPUT_XML,P_CURRENT_XML);
383 
384 --Call the PL/SQL API to fetch the instruction set details in XML format for the specified
385 --process ID.
386 GMO_INSTRUCTION_GRP.GET_INSTR_XML
387 (P_API_VERSION            => 1.0,
388  P_INIT_MSG_LIST          => FND_API.G_FALSE,
389  P_VALIDATION_LEVEL       => FND_API.G_VALID_LEVEL_NONE,
390  P_INSTRUCTION_PROCESS_ID => P_INSTR_PROCESS_ID,
391  X_OUTPUT_XML             => L_INSTR_XML,
392  X_RETURN_STATUS          => L_RETURN_STATUS,
393  X_MSG_COUNT              => L_MSG_COUNT,
394  X_MSG_DATA               => L_MSG_DATA);
395 
396 --If the return status is not success then raise an error.
397 IF L_RETURN_STATUS = FND_API.G_RET_STS_UNEXP_ERROR OR L_RETURN_STATUS = FND_API.G_RET_STS_ERROR  THEN
398   RAISE XML_ERROR;
399 END IF;
400 
401 --Append the XML of instruction set details to the final XML.
402 DBMS_LOB.APPEND(X_OUTPUT_XML,L_INSTR_XML);
403 
404 --Append the XML Footer to the FINAL XML.
405 DBMS_LOB.WRITEAPPEND(X_OUTPUT_XML,length(EDR_CONSTANTS_GRP.G_ERECORD_XML_FOOTER),EDR_CONSTANTS_GRP.G_ERECORD_XML_FOOTER);
406 
407 EXCEPTION
408   WHEN XML_ERROR THEN
409     FND_MESSAGE.SET_ENCODED(L_MSG_DATA);
410     IF (FND_LOG.LEVEL_UNEXPECTED >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
411       FND_LOG.MESSAGE(FND_LOG.LEVEL_UNEXPECTED,
412                       'edr.plsql.GMO_DISPENSE_SETUP_PVT.GET_TRANSACTION_XML',
413                       FALSE
414                      );
415     END IF;
416 
417     APP_EXCEPTION.RAISE_EXCEPTION;
418 
419   WHEN OTHERS THEN
420     FND_MESSAGE.SET_NAME('FND','FND_AS_UNEXPECTED_ERROR');
421     FND_MESSAGE.SET_TOKEN('ERROR_TEXT',SQLERRM);
422     FND_MESSAGE.SET_TOKEN('PKG_NAME','GMO_DISPENSE_SETUP_PVT');
423     FND_MESSAGE.SET_TOKEN('PROCEDURE_NAME','GET_TRANSACTION_XML');
424 
425     IF (FND_LOG.LEVEL_UNEXPECTED >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
426       FND_LOG.MESSAGE(FND_LOG.LEVEL_UNEXPECTED,
427                       'edr.plsql.GMO_DISPENSE_SETUP_PVT.GET_TRANSACTION_XML',
428                       FALSE
429                      );
430     END IF;
431 
432     APP_EXCEPTION.RAISE_EXCEPTION;
433 
434 
435 
436 END GET_TRANSACTION_XML;
437 
438 
439 --This procedure used to send an acknowledgement back to process instructions to
440 --copy the details from the temp tables into the permanent tables for the specified
441 --instruction process ID and entity.
442 PROCEDURE SEND_INSTR_ACKN(P_INSTR_PROCESS_ID  IN NUMBER,
443                           P_ENTITY_NAME       IN VARCHAR2,
444                           P_SOURCE_ENTITY_KEY IN VARCHAR2,
445                           P_TARGET_ENTITY_KEY IN VARCHAR2)
446 IS
447 
448 L_MSG_DATA VARCHAR2(4000);
449 L_MSG_COUNT NUMBER;
450 L_RETURN_STATUS VARCHAR2(10);
451 L_INSTRUCTION_TYPE VARCHAR2(4000);
452 L_INSTRUCTION_SET_ID NUMBER;
453 SEND_ACKN_ERROR EXCEPTION;
454 
455 CURSOR DISPENSE_INSTR_TYPES_CSR IS
456   SELECT LOOKUP_CODE
457   FROM FND_LOOKUPS
458   WHERE LOOKUP_TYPE = 'GMO_INSTR_' || P_ENTITY_NAME;
459 
460 BEGIN
461 
462 
463   --If the source and target entity keys are different then call PI's SEND_DEFN_FROM_DEFN
464   --to ensure proper versioning.
465   IF P_SOURCE_ENTITY_KEY <> P_TARGET_ENTITY_KEY THEN
466 
467     --Open the cursor.
468     OPEN DISPENSE_INSTR_TYPES_CSR;
469 
470     LOOP
471       FETCH DISPENSE_INSTR_TYPES_CSR INTO L_INSTRUCTION_TYPE;
472       EXIT WHEN DISPENSE_INSTR_TYPES_CSR%NOTFOUND;
473 
474       --Create a definition from definition for each instruction type.
475       GMO_INSTRUCTION_GRP.CREATE_DEFN_FROM_DEFN
476       (
477         P_API_VERSION           => 1.0,
478         P_INIT_MSG_LIST         => FND_API.G_TRUE,
479         P_COMMIT                => FND_API.G_FALSE,
480         P_VALIDATION_LEVEL      => FND_API.G_VALID_LEVEL_NONE,
481         P_SOURCE_ENTITY_NAME    => P_ENTITY_NAME,
482         P_SOURCE_ENTITY_KEY     => P_SOURCE_ENTITY_KEY,
483         P_TARGET_ENTITY_NAME    => P_ENTITY_NAME,
484         P_TARGET_ENTITY_KEY     => P_TARGET_ENTITY_KEY,
485         P_INSTRUCTION_TYPE      => L_INSTRUCTION_TYPE,
486         X_RETURN_STATUS         => L_RETURN_STATUS,
487         X_MSG_COUNT             => L_MSG_COUNT,
488         X_MSG_DATA              => L_MSG_DATA,
489         X_INSTRUCTION_SET_ID    => L_INSTRUCTION_SET_ID
490       );
491 
492       --If the return status is not success then raise an exception.
493       IF L_RETURN_STATUS = FND_API.G_RET_STS_UNEXP_ERROR OR L_RETURN_STATUS = FND_API.G_RET_STS_ERROR  THEN
494         RAISE SEND_ACKN_ERROR;
495       END IF;
496     END LOOP;
497 
498     CLOSE DISPENSE_INSTR_TYPES_CSR;
499 
500   END IF;
501 
502   --Call the PL/SQL API to send the definition acknowledgement.
503   GMO_INSTRUCTION_GRP.SEND_DEFN_ACKN
504   (
505     P_API_VERSION            => 1.0,
506     P_INIT_MSG_LIST          => FND_API.G_FALSE,
507     P_VALIDATION_LEVEL       => FND_API.G_VALID_LEVEL_NONE,
508     P_INSTRUCTION_PROCESS_ID => P_INSTR_PROCESS_ID,
509     P_ENTITY_NAME            => P_ENTITY_NAME,
510     P_SOURCE_ENTITY_KEY      => P_SOURCE_ENTITY_KEY,
511     P_TARGET_ENTITY_KEY      => P_TARGET_ENTITY_KEY,
512     X_RETURN_STATUS          => L_RETURN_STATUS,
513     X_MSG_COUNT              => L_MSG_COUNT,
514     X_MSG_DATA               => L_MSG_DATA
515   );
516 
517   --If the return status is not success then raise an exception.
518   IF L_RETURN_STATUS = FND_API.G_RET_STS_UNEXP_ERROR OR L_RETURN_STATUS = FND_API.G_RET_STS_ERROR  THEN
519     RAISE SEND_ACKN_ERROR;
520   END IF;
521 
522 EXCEPTION
523   WHEN SEND_ACKN_ERROR THEN
524 
525     IF DISPENSE_INSTR_TYPES_CSR%ISOPEN THEN
526       CLOSE DISPENSE_INSTR_TYPES_CSR;
527     END IF;
528 
529     FND_MESSAGE.SET_ENCODED(L_MSG_DATA);
530 
531     IF (FND_LOG.LEVEL_UNEXPECTED >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
532       FND_LOG.MESSAGE(FND_LOG.LEVEL_UNEXPECTED,
533                       'edr.plsql.GMO_DISPENSE_SETUP_PVT.SEND_INSTR_ACKN',
534                       FALSE
535                      );
536     END IF;
537 
538     APP_EXCEPTION.RAISE_EXCEPTION;
539 
540   WHEN OTHERS THEN
541 
542     IF DISPENSE_INSTR_TYPES_CSR%ISOPEN THEN
543       CLOSE DISPENSE_INSTR_TYPES_CSR;
544     END IF;
545 
546     FND_MESSAGE.SET_NAME('FND','FND_AS_UNEXPECTED_ERROR');
547     FND_MESSAGE.SET_TOKEN('ERROR_TEXT',SQLERRM);
548     FND_MESSAGE.SET_TOKEN('PKG_NAME','GMO_DISPENSE_SETUP_PVT');
549     FND_MESSAGE.SET_TOKEN('PROCEDURE_NAME','SEND_INSTR_ACKN');
550 
551     IF (FND_LOG.LEVEL_UNEXPECTED >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
552       FND_LOG.MESSAGE(FND_LOG.LEVEL_UNEXPECTED,
553                       'edr.plsql.GMO_DISPENSE_SETUP_PVT.SEND_INSTR_ACKN',
554                       FALSE
555                      );
556     END IF;
557 
558     APP_EXCEPTION.RAISE_EXCEPTION;
559     null;
560 
561 END SEND_INSTR_ACKN;
562 
563 --This procedure is used to obtain the dispense configuration for the specified
564 --item, organization and recipe.
565 PROCEDURE GET_DISPENSE_CONFIG
566 (
567   P_INVENTORY_ITEM_ID          IN         NUMBER,
568   P_ORGANIZATION_ID            IN         NUMBER,
569   P_RECIPE_ID                  IN         NUMBER,
570   X_DISPENSE_CONFIG            OUT NOCOPY GMO_DISPENSE_CONFIG%ROWTYPE,
571   X_INSTRUCTION_DEFINITION_KEY OUT NOCOPY VARCHAR2
572 )
573 
574 IS
575 
576 BEGIN
577 
578   X_INSTRUCTION_DEFINITION_KEY := NULL;
579 
580   --Obtain the dispense configuration for the case where both organization and recipe are specified.
581   BEGIN
582     SELECT * INTO X_DISPENSE_CONFIG
583     FROM  GMO_DISPENSE_CONFIG
584     WHERE INVENTORY_ITEM_ID = P_INVENTORY_ITEM_ID
585     AND   ORGANIZATION_ID = P_ORGANIZATION_ID
586     AND   RECIPE_ID = P_RECIPE_ID
587     AND   DISPENSE_REQUIRED_FLAG = 'Y'
588     AND   SYSDATE BETWEEN START_DATE AND NVL(END_DATE,START_DATE);
589 
590   EXCEPTION
591     WHEN NO_DATA_FOUND THEN
592       X_DISPENSE_CONFIG := NULL;
593   END;
594 
595 
596   IF (X_DISPENSE_CONFIG.CONFIG_ID IS NOT NULL) THEN
597 
598     --A valid dispense configuration has been found.
599     --Obtain the instruction defninition key and exit.
600     X_INSTRUCTION_DEFINITION_KEY := X_DISPENSE_CONFIG.CONFIG_ID;
601     RETURN;
602 
603   END IF;
604 
605   --Obtain the dispense configuration for the case where organization is specified, but recipe is null.
606   BEGIN
607     SELECT * INTO X_DISPENSE_CONFIG
608     FROM  GMO_DISPENSE_CONFIG
609     WHERE INVENTORY_ITEM_ID = P_INVENTORY_ITEM_ID
610     AND   ORGANIZATION_ID=P_ORGANIZATION_ID
611     AND   DISPENSE_REQUIRED_FLAG = 'Y'
612     AND   RECIPE_ID IS NULL
613     AND   SYSDATE BETWEEN START_DATE AND NVL(END_DATE,START_DATE);
614 
615   EXCEPTION
616     WHEN NO_DATA_FOUND THEN
617       X_DISPENSE_CONFIG := NULL;
618   END;
619 
620   IF (X_DISPENSE_CONFIG.CONFIG_ID IS NOT NULL) THEN
621 
622     --A valid dispense configuration has been found.
623     --Obtain the instruction defninition key and exit.
624     X_INSTRUCTION_DEFINITION_KEY := X_DISPENSE_CONFIG.CONFIG_ID;
625     RETURN;
626 
627   END IF;
628 
629   --Obtain the dispense configuration for the case where organization and recipe is null.
630   BEGIN
631     SELECT * INTO X_DISPENSE_CONFIG
632     FROM  GMO_DISPENSE_CONFIG
633     WHERE INVENTORY_ITEM_ID = P_INVENTORY_ITEM_ID
634     AND   DISPENSE_REQUIRED_FLAG = 'Y'
635     AND   ORGANIZATION_ID IS NULL
636     AND   RECIPE_ID IS NULL
637     AND   SYSDATE BETWEEN START_DATE AND NVL(END_DATE,START_DATE);
638 
639   EXCEPTION
640     WHEN NO_DATA_FOUND THEN
641     X_DISPENSE_CONFIG := NULL;
642   END;
643 
644   IF (X_DISPENSE_CONFIG.CONFIG_ID IS NOT NULL) THEN
645 
646     --A valid dispense configuration has been found.
647     --Obtain the instruction defninition key and exit.
648     X_INSTRUCTION_DEFINITION_KEY := X_DISPENSE_CONFIG.CONFIG_ID;
649 
650   END IF;
651 
652 END GET_DISPENSE_CONFIG;
653 
654 
655 --This function is obtain the dispense UOM value for the specified item, organization and recipe.
656 FUNCTION GET_DISPENSE_UOM
657 (
658   P_INVENTORY_ITEM_ID IN NUMBER,
659   P_ORGANIZATION_ID   IN NUMBER,
660   P_RECIPE_ID         IN NUMBER
661 ) RETURN VARCHAR2
662 
663 IS
664 
665 --This variable would hold the dispense uom value.
666 L_RETURN_VALUE VARCHAR2(240);
667 
668 --This variable would hold the dispense configuration details for the specified item, organization and recipe.
669 L_DISPENSE_CONFIG GMO_DISPENSE_CONFIG%ROWTYPE;
670 
671 --This variable sould hold the instruction key.
672 L_INSTRUCTION_KEY VARCHAR2(240);
673 BEGIN
674 
675   L_RETURN_VALUE := NULL;
676 
677   --Obtain the dispense configuration details for the specified item, org and recipe.
678   GET_DISPENSE_CONFIG(P_INVENTORY_ITEM_ID          => P_INVENTORY_ITEM_ID,
679                       P_ORGANIZATION_ID            => P_ORGANIZATION_ID,
680                       P_RECIPE_ID                  => P_RECIPE_ID,
681                       X_DISPENSE_CONFIG            => L_DISPENSE_CONFIG,
682                       X_INSTRUCTION_DEFINITION_KEY => L_INSTRUCTION_KEY);
683 
684   --If the dispense UOM value was found then set the same on the return value.
685   IF(L_DISPENSE_CONFIG.DISPENSE_UOM IS NOT NULL) THEN
686     L_RETURN_VALUE := L_DISPENSE_CONFIG.DISPENSE_UOM;
687   END IF;
688 
689   --Return the dispense UOM value.
690   RETURN L_RETURN_VALUE;
691 
692 END GET_DISPENSE_UOM;
693 
694 
695 --This function is used to verify if the specified UOM is convertible with the
696 --primary UOM value.
697 FUNCTION IS_CONV_WITH_PRIMARY_UOM
698 (
699   P_UOM VARCHAR2,
700   P_ITEM_ID NUMBER,
701   P_ORGANIZATION_ID NUMBER
702 ) RETURN VARCHAR2
703 
704 IS
705 
706 L_ITEM_UOM VARCHAR2(10);
707 L_RETURN_VALUE NUMBER;
708 BEGIN
709 
710   SELECT PRIMARY_UOM_CODE INTO L_ITEM_UOM
711   FROM   MTL_SYSTEM_ITEMS
712   WHERE  INVENTORY_ITEM_ID = P_ITEM_ID
713   AND    ORGANIZATION_ID = NVL(P_ORGANIZATION_ID, ORGANIZATION_ID)
714   AND    ROWNUM =1;
715 
716   IF P_ORGANIZATION_ID IS NOT NULL THEN
717 
718     L_RETURN_VALUE := INV_CONVERT.INV_UM_CONVERT(P_ITEM_ID,
719                                                  NULL,
720                                                  P_ORGANIZATION_ID,
721                                                  1,
722                                                  1,
723                                                  L_ITEM_UOM,
724                                                  P_UOM,
725                                                  NULL,
726                                                  NULL);
727   ELSE
728     L_RETURN_VALUE := INV_CONVERT.INV_UM_CONVERT(P_ITEM_ID,
729                                                  1,
730                                                  1,
731                                                  L_ITEM_UOM,
732                                                  P_UOM,
733                                                  NULL,
734                                                  NULL);
735   END IF;
736 
737   IF  (L_RETURN_VALUE = -99999) THEN
738     RETURN FND_API.G_FALSE;
739   END IF;
740 
741   RETURN FND_API.G_TRUE;
742 
743   EXCEPTION WHEN OTHERS THEN
744     RETURN FND_API.G_FALSE;
745 
746 END IS_CONV_WITH_PRIMARY_UOM;
747 
748 
749 --Yhis procedure is used check if dispense is required for the specified item,
750 --organization and recipe. If dispensing is required, it returns the corresponding
751 --dispense config ID that can be used to identify the dispense setup.
752 PROCEDURE IS_DISPENSE_ITEM
753 (
754   P_INVENTORY_ITEM_ID    IN  NUMBER,
755   P_ORGANIZATION_ID      IN  NUMBER,
756   P_RECIPE_ID            IN  NUMBER,
757   X_IS_DISPENSE_REQUIRED OUT NOCOPY VARCHAR2,
758   X_DISPENSE_CONFIG_ID   OUT NOCOPY VARCHAR2
759 )
760 
761 IS
762 
763 BEGIN
764 
765   --Obtain the value of the dispense required flag for the case where organization and recipe are specified.
766   BEGIN
767     SELECT DISPENSE_REQUIRED_FLAG,CONFIG_ID
768     INTO   X_IS_DISPENSE_REQUIRED,X_DISPENSE_CONFIG_ID
769     FROM GMO_DISPENSE_CONFIG
770     WHERE INVENTORY_ITEM_ID = P_INVENTORY_ITEM_ID
771     AND ORGANIZATION_ID=P_ORGANIZATION_ID
772     AND RECIPE_ID=P_RECIPE_ID
773     AND SYSDATE BETWEEN START_DATE AND NVL(END_DATE,SYSDATE);
774   EXCEPTION
775     WHEN NO_DATA_FOUND THEN
776       X_IS_DISPENSE_REQUIRED := 'N';
777   END;
778 
779   IF (X_IS_DISPENSE_REQUIRED = 'Y' ) THEN
780 
781     --If the flag is set to 'Y' then return.
782     RETURN;
783 
784   END IF;
785 
786   --Obtain the value of the dispense required flag for the case where organization is specified, but recipe is null.
787   BEGIN
788     SELECT DISPENSE_REQUIRED_FLAG,CONFIG_ID
789     INTO   X_IS_DISPENSE_REQUIRED,X_DISPENSE_CONFIG_ID
790     FROM GMO_DISPENSE_CONFIG
791     WHERE INVENTORY_ITEM_ID = P_INVENTORY_ITEM_ID
792     AND ORGANIZATION_ID=P_ORGANIZATION_ID
793     AND RECIPE_ID IS NULL
794     AND SYSDATE BETWEEN START_DATE AND NVL(END_DATE,SYSDATE);
795 
796   EXCEPTION
797     WHEN NO_DATA_FOUND THEN
798     X_IS_DISPENSE_REQUIRED := 'N';
799   END;
800 
801   IF X_IS_DISPENSE_REQUIRED = 'Y' THEN
802 
803     --If the flag is set to 'Y' then return.
804     RETURN;
805   END IF;
806 
807   --Obtain the value of the dispense required flag for the case where both organization and recipe are null.
808   BEGIN
809     SELECT DISPENSE_REQUIRED_FLAG,CONFIG_ID
810     INTO   X_IS_DISPENSE_REQUIRED,X_DISPENSE_CONFIG_ID
811     FROM   GMO_DISPENSE_CONFIG
812     WHERE  INVENTORY_ITEM_ID = P_INVENTORY_ITEM_ID
813     AND    ORGANIZATION_ID IS NULL
814     AND    RECIPE_ID IS NULL
815     AND    SYSDATE BETWEEN START_DATE AND NVL(END_DATE,SYSDATE);
816 
817   EXCEPTION
818     WHEN NO_DATA_FOUND THEN
819     X_IS_DISPENSE_REQUIRED := 'N';
820   END;
821 
822   IF X_IS_DISPENSE_REQUIRED = 'N' THEN
823     X_DISPENSE_CONFIG_ID := NULL;
824   END IF;
825 
826 END IS_DISPENSE_ITEM;
827 
828 
829 --This procedure is used to obtain the dispense configuration for the specified ENTITY_NAME and
830 --ENTITY_KEY from the instance tables.
831 PROCEDURE GET_DISPENSE_CONFIG_INST
832 (
833   P_ENTITY_NAME                IN         VARCHAR2,
834   P_ENTITY_KEY                 IN         VARCHAR2,
835   X_DISPENSE_CONFIG            OUT NOCOPY GMO_DISPENSE_CONFIG%ROWTYPE,
836   X_INSTRUCTION_DEFINITION_KEY OUT NOCOPY VARCHAR2
837 )
838 IS
839 
840 L_DISPENSE_CONFIG_ID NUMBER;
841 
842 BEGIN
843 
844   X_INSTRUCTION_DEFINITION_KEY := NULL;
845 
846   SELECT DISPENSE_CONFIG_ID INTO L_DISPENSE_CONFIG_ID
847   FROM   GMO_DISPENSE_CONFIG_INST
848   WHERE  ENTITY_NAME = P_ENTITY_NAME
849   AND    ENTITY_KEY  = P_ENTITY_KEY;
850 
851   IF L_DISPENSE_CONFIG_ID IS NOT NULL THEN
852     SELECT * INTO X_DISPENSE_CONFIG FROM GMO_DISPENSE_CONFIG
853     WHERE  CONFIG_ID = L_DISPENSE_CONFIG_ID;
854 
855     IF (X_DISPENSE_CONFIG.CONFIG_ID IS NOT NULL) THEN
856 
857       --A valid dispense configuration has been found.
858       --Obtain the instruction defninition key.
859       X_INSTRUCTION_DEFINITION_KEY := X_DISPENSE_CONFIG.CONFIG_ID;
860 
861     END IF;
862   END IF;
863 
864 EXCEPTION
865   WHEN NO_DATA_FOUND THEN
866     NULL;
870 --This procedure is used to instantiate the dispense setup identified by the specified
867 END GET_DISPENSE_CONFIG_INST;
868 
869 
871 --dispense config ID, entity name and entity key.
872 PROCEDURE INSTANTIATE_DISPENSE_SETUP
873 (P_DISPENSE_CONFIG_ID IN  NUMBER,
874  P_ENTITY_NAME        IN  VARCHAR2,
875  P_ENTITY_KEY         IN  VARCHAR2,
876  P_INIT_MSG_LIST      IN  VARCHAR2,
877  P_AUTO_COMMIT        IN  VARCHAR2,
878  X_RETURN_STATUS      OUT NOCOPY VARCHAR2,
879  X_MSG_COUNT          OUT NOCOPY NUMBER,
880  X_MSG_DATA           OUT NOCOPY VARCHAR2)
881 
882 IS
883 
884 L_API_NAME           CONSTANT VARCHAR2(40) := 'INSTANTIATE_DISPENSE_SETUP';
885 
886 
887 L_COUNT NUMBER;
888 
889 GMO_NO_DISPENSE_CONFIG_ERR EXCEPTION;
890 
891 BEGIN
892 
893   --Initialize the message list if specified so.
894   IF FND_API.TO_BOOLEAN( P_INIT_MSG_LIST ) THEN
895 
896     FND_MSG_PUB.INITIALIZE;
897 
898   END IF;
899 
900   IF P_AUTO_COMMIT = FND_API.G_TRUE THEN
901     INSTANTIATE_DISP_SETUP_AUTO
902     (P_DISPENSE_CONFIG_ID => P_DISPENSE_CONFIG_ID,
903      P_ENTITY_NAME        => P_ENTITY_NAME,
904      P_ENTITY_KEY         => P_ENTITY_KEY,
905      P_INIT_MSG_LIST      => P_INIT_MSG_LIST,
906      X_RETURN_STATUS      => X_RETURN_STATUS,
907      X_MSG_COUNT          => X_MSG_COUNT,
908      X_MSG_DATA           => X_MSG_DATA);
909   ELSE
910     --Check if a dispense setup exists for the specified config ID.
911     SELECT COUNT(*) INTO L_COUNT
912     FROM   GMO_DISPENSE_CONFIG
913     WHERE  CONFIG_ID = P_DISPENSE_CONFIG_ID;
914 
915     IF L_COUNT > 0 THEN
916       INSERT INTO GMO_DISPENSE_CONFIG_INST(INSTANCE_ID,
917                                            DISPENSE_CONFIG_ID,
918 	   				   ENTITY_NAME,
919 					   ENTITY_KEY,
920                                            CREATION_DATE,
921                                            CREATED_BY,
922 					   LAST_UPDATE_DATE,
923 					   LAST_UPDATED_BY,
924 					   LAST_UPDATE_LOGIN)
925 
926       VALUES (GMO_DISPENSE_CONFIG_INST_S.NEXTVAL,
927               P_DISPENSE_CONFIG_ID,
928 	      P_ENTITY_NAME,
929 	      P_ENTITY_KEY,
930 	      SYSDATE,
931 	      FND_GLOBAL.USER_ID(),
932 	      SYSDATE,
933 	      FND_GLOBAL.LOGIN_ID(),
934 	      FND_GLOBAL.LOGIN_ID());
935     ELSE
936       RAISE GMO_NO_DISPENSE_CONFIG_ERR;
937     END IF;
938 
939     X_RETURN_STATUS := FND_API.G_RET_STS_SUCCESS;
940 
941   END IF;
942 
943 EXCEPTION
944   WHEN GMO_NO_DISPENSE_CONFIG_ERR THEN
945 
946     X_RETURN_STATUS := FND_API.G_RET_STS_ERROR;
947 
948     FND_MESSAGE.SET_NAME('GMO','GMO_INVALID_DISPENSE_CONFIG_ID');
949     FND_MESSAGE.SET_TOKEN('CONFIG_ID',P_DISPENSE_CONFIG_ID);
950     FND_MESSAGE.SET_TOKEN('ENTITY_NAME',P_ENTITY_NAME);
951     FND_MESSAGE.SET_TOKEN('ENTITY_NAME',P_ENTITY_NAME);
952 
953     FND_MSG_PUB.ADD;
954 
955     FND_MSG_PUB.COUNT_AND_GET
956     (P_COUNT => X_MSG_COUNT,
957      P_DATA  => X_MSG_DATA);
958 
959     IF (FND_LOG.LEVEL_EXCEPTION >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
960       FND_LOG.MESSAGE(FND_LOG.LEVEL_EXCEPTION,
961                       'gmo.plsql.GMO_DISPENSE_SETUP_PVT.INSTANTIATE_DISPENSE_SETUP',
962                       FALSE);
963     END IF;
964 
965   WHEN OTHERS THEN
966 
967     X_RETURN_STATUS := FND_API.G_RET_STS_UNEXP_ERROR ;
968 
969     FND_MESSAGE.SET_NAME('FND','FND_AS_UNEXPECTED_ERROR');
970     FND_MESSAGE.SET_TOKEN('ERROR_TEXT',SQLERRM);
971     FND_MESSAGE.SET_TOKEN('PKG_NAME','GMO_DISPENSE_SETUP_PVT');
972     FND_MESSAGE.SET_TOKEN('PROCEDURE_NAME','INSTANTIATE_DISPENSE_SETUP');
973 
974     FND_MSG_PUB.ADD;
975 
976     IF  FND_MSG_PUB.CHECK_MSG_LEVEL( FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR)  THEN
977 
978       FND_MSG_PUB.ADD_EXC_MSG (G_PKG_NAME,
979                                L_API_NAME );
980 
981     END IF;
982 
983     FND_MSG_PUB.COUNT_AND_GET
984     (P_COUNT => X_MSG_COUNT,
985      P_DATA  => X_MSG_DATA);
986 
987     IF (FND_LOG.LEVEL_UNEXPECTED >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
988       FND_LOG.MESSAGE(FND_LOG.LEVEL_UNEXPECTED,
989                       'gmo.plsql.GMO_DISPENSE_SETUP_PVT.INSTANTIATE_DISPENSE_SETUP',
990                       FALSE);
991     END IF;
992 
993 END INSTANTIATE_DISPENSE_SETUP;
994 
995 
996 --This procedure is used to instantiate the dispense setup identified by the specified
997 --dispense config ID, entity name and entity key. The transaction is committed autonomously.
998 PROCEDURE INSTANTIATE_DISP_SETUP_AUTO
999 (P_DISPENSE_CONFIG_ID IN  NUMBER,
1000  P_ENTITY_NAME        IN  VARCHAR2,
1001  P_ENTITY_KEY         IN  VARCHAR2,
1002  P_INIT_MSG_LIST      IN  VARCHAR2,
1003  X_RETURN_STATUS      OUT NOCOPY VARCHAR2,
1004  X_MSG_COUNT          OUT NOCOPY NUMBER,
1005  X_MSG_DATA           OUT NOCOPY VARCHAR2)
1006 
1007 IS
1008 
1009 L_API_NAME           CONSTANT VARCHAR2(40) := 'INSTANTIATE_DISPENSE_SETUP';
1010 
1011 
1012 L_COUNT NUMBER;
1013 
1014 GMO_NO_DISPENSE_CONFIG_ERR EXCEPTION;
1015 
1016 PRAGMA AUTONOMOUS_TRANSACTION;
1017 
1018 BEGIN
1019 
1020   --Initialize the message list if specified so.
1021   IF FND_API.TO_BOOLEAN( P_INIT_MSG_LIST ) THEN
1022 
1023     FND_MSG_PUB.INITIALIZE;
1024 
1025   END IF;
1026 
1027   --Check if a dispense setup exists for the specified config ID.
1028   SELECT COUNT(*) INTO L_COUNT
1029   FROM   GMO_DISPENSE_CONFIG
1030   WHERE  CONFIG_ID = P_DISPENSE_CONFIG_ID;
1031 
1032   IF L_COUNT > 0 THEN
1033     INSERT INTO GMO_DISPENSE_CONFIG_INST(INSTANCE_ID,
1034                                          DISPENSE_CONFIG_ID,
1035 					 ENTITY_NAME,
1036 					 ENTITY_KEY,
1037                                          CREATION_DATE,
1038                                          CREATED_BY,
1039 					 LAST_UPDATE_DATE,
1040 					 LAST_UPDATED_BY,
1041 					 LAST_UPDATE_LOGIN)
1042 
1043      VALUES (GMO_DISPENSE_CONFIG_INST_S.NEXTVAL,
1044              P_DISPENSE_CONFIG_ID,
1045 	     P_ENTITY_NAME,
1046 	     P_ENTITY_KEY,
1047 	     SYSDATE,
1048 	     FND_GLOBAL.USER_ID(),
1049 	     SYSDATE,
1050 	     FND_GLOBAL.LOGIN_ID(),
1051 	     FND_GLOBAL.LOGIN_ID());
1052   ELSE
1053     RAISE GMO_NO_DISPENSE_CONFIG_ERR;
1054   END IF;
1055 
1056   COMMIT;
1057 
1058   X_RETURN_STATUS := FND_API.G_RET_STS_SUCCESS;
1059 
1060 EXCEPTION
1061   WHEN GMO_NO_DISPENSE_CONFIG_ERR THEN
1062     ROLLBACK;
1063 
1064     X_RETURN_STATUS := FND_API.G_RET_STS_ERROR;
1065 
1066     FND_MESSAGE.SET_NAME('GMO','GMO_INVALID_DISPENSE_CONFIG_ID');
1067     FND_MESSAGE.SET_TOKEN('CONFIG_ID',P_DISPENSE_CONFIG_ID);
1068     FND_MESSAGE.SET_TOKEN('ENTITY_NAME',P_ENTITY_NAME);
1069     FND_MESSAGE.SET_TOKEN('ENTITY_NAME',P_ENTITY_NAME);
1070 
1071     FND_MSG_PUB.ADD;
1072 
1073     FND_MSG_PUB.COUNT_AND_GET
1074     (P_COUNT => X_MSG_COUNT,
1075      P_DATA  => X_MSG_DATA);
1076 
1077     IF (FND_LOG.LEVEL_EXCEPTION >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
1078       FND_LOG.MESSAGE(FND_LOG.LEVEL_EXCEPTION,
1079                       'gmo.plsql.GMO_DISPENSE_SETUP_PVT.INSTANTIATE_DISP_SETUP',
1080                       FALSE);
1081     END IF;
1082 
1083   WHEN OTHERS THEN
1084     ROLLBACK;
1085 
1086     X_RETURN_STATUS := FND_API.G_RET_STS_UNEXP_ERROR ;
1087 
1088     FND_MESSAGE.SET_NAME('FND','FND_AS_UNEXPECTED_ERROR');
1089     FND_MESSAGE.SET_TOKEN('ERROR_TEXT',SQLERRM);
1090     FND_MESSAGE.SET_TOKEN('PKG_NAME','GMO_DISPENSE_SETUP_PVT');
1091     FND_MESSAGE.SET_TOKEN('PROCEDURE_NAME','INSTANTIATE_DISP_SETUP');
1092 
1093     FND_MSG_PUB.ADD;
1094 
1095     IF  FND_MSG_PUB.CHECK_MSG_LEVEL( FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR)  THEN
1096 
1097       FND_MSG_PUB.ADD_EXC_MSG (G_PKG_NAME,
1098                                L_API_NAME );
1099 
1100     END IF;
1101 
1102     FND_MSG_PUB.COUNT_AND_GET
1103     (P_COUNT => X_MSG_COUNT,
1104      P_DATA  => X_MSG_DATA);
1105 
1106     IF (FND_LOG.LEVEL_UNEXPECTED >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN
1107       FND_LOG.MESSAGE(FND_LOG.LEVEL_UNEXPECTED,
1108                       'gmo.plsql.GMO_DISPENSE_SETUP_PVT.INSTANTIATE_DISP_SETUP',
1109                       FALSE);
1110     END IF;
1111 
1112 END INSTANTIATE_DISP_SETUP_AUTO;
1113 
1114 --This function return the dispense setup status based on the specified start and end date values.
1115 --The status value returned is one of possible lookup code values contained in the lookup type
1116 --GMO_DISP_SETUP_STATUS.
1117 FUNCTION GET_SETUP_STATUS(P_START_DATE DATE,
1118                           P_END_DATE   DATE)
1119 
1120 RETURN VARCHAR2
1121 
1122 IS
1123 
1124 BEGIN
1125 
1126   IF SYSDATE BETWEEN P_START_DATE AND NVL(P_END_DATE,SYSDATE) OR P_START_DATE > SYSDATE THEN
1127     RETURN 'N';
1128   ELSE
1129     RETURN 'P';
1130   END IF;
1131 
1132 END GET_SETUP_STATUS;
1133 
1134 --This function checks if the the difference between the specified dates is atleast
1135 --two seconds. Based on this condition it returns FND_API.G_TRUE or FND_API.G_FALSE.
1136 FUNCTION IS_DATE_DIFF_SUFFICIENT(P_FIRST_DATE    DATE,
1137                                  P_SECOND_DATE   DATE)
1138 
1139 RETURN VARCHAR2
1140 
1141 IS
1142 
1143 L_DIFF NUMBER;
1144 
1145 BEGIN
1146 
1147   IF P_FIRST_DATE IS NOT NULL AND P_SECOND_DATE IS NOT NULL THEN
1148     L_DIFF := P_SECOND_DATE - P_FIRST_DATE;
1149 
1150     IF L_DIFF > 1/86400 THEN
1151       RETURN FND_API.G_TRUE;
1152     ELSE
1153       RETURN FND_API.G_FALSE;
1154     END IF;
1155   ELSE
1156     RETURN FND_API.G_TRUE;
1157   END IF;
1158 
1159 END IS_DATE_DIFF_SUFFICIENT;
1160 
1161 
1162 --This function subtracts the specified number of seconds from the date provided.
1163 FUNCTION SUBTRACT_SECONDS_FROM_DATE(P_DATE    DATE,
1164                                     P_SECONDS NUMBER)
1165 
1166 RETURN DATE
1167 
1168 IS
1169 
1170 L_DATE DATE;
1171 
1172 BEGIN
1173 
1174   IF P_DATE IS NOT NULL THEN
1175 
1176     L_DATE := P_DATE;
1177 
1178     L_DATE := L_DATE - P_SECONDS/86400;
1179   ELSE
1180     L_DATE := NULL;
1181   END IF;
1182 
1183   RETURN L_DATE;
1184 END SUBTRACT_SECONDS_FROM_DATE;
1185 
1186 --This function adds the specified number of seconds from the date provided.
1187 FUNCTION ADD_SECONDS_TO_DATE(P_DATE    DATE,
1188                              P_SECONDS NUMBER)
1189 
1190 RETURN DATE
1191 
1192 IS
1193 
1194 L_DATE DATE;
1195 
1196 BEGIN
1197 
1198   IF P_DATE IS NOT NULL THEN
1199 
1200     L_DATE := P_DATE;
1201 
1202     L_DATE := L_DATE + P_SECONDS/86400;
1203   ELSE
1204     L_DATE := NULL;
1205   END IF;
1206 
1207   RETURN L_DATE;
1208 END ADD_SECONDS_TO_DATE;
1209 
1210 
1211 END GMO_DISPENSE_SETUP_PVT;