[Home] [Help]
PACKAGE BODY: APPS.GMI_QUANTITY_PVT
Source
1 PACKAGE BODY GMI_QUANTITY_PVT AS
2 --$Header: GMIVQTYB.pls 115.9 2000/02/03 04:23:58 pkm ship $
3 -- Body start of comments
4 --+==========================================================================+
5 --| Copyright (c) 1998 Oracle Corporation |
6 --| Redwood Shores, CA, USA |
7 --| All rights reserved. |
8 --+==========================================================================+
9 --| FILE NAME |
10 --| GMIVQTYB.pls |
11 --| |
12 --| PACKAGE NAME |
13 --| GMI_QUANTITY_PVT |
14 --| |
15 --| DESCRIPTION |
16 --| |
17 --| CONTENTS |
18 --| Validate_Inventory_Posting |
19 --| Insert_Ic_Jrnl_Mst |
20 --| Insert_Ic_Adjs_Mst |
21 --| Check_unposted_jnl_lot_status |
22 --| Check_unposted_jnl_qc_grade |
23 --| |
24 --| HISTORY |
25 --| 25-FEB-1999 M.Godfrey Upgrade to R11 |
26 --| 20/AUG/1999 H.Verdding Bug 951828 Change GMS package Calls to GMA |
27 --| 27/OCT/1999 H.Verdding Bug 1042739 added l_trans_rec.orgn_code To |
28 --| GMA_VALID_GRP.Validate_doc_no |
29 --| |
30 --| 02/JAN/2000 Liz Enstone Bug 1159223 Change message names from SY_ |
31 -- to IC_
32 --+==========================================================================+
33 -- Body end of comments
34
35 -- Global variables
36 G_PKG_NAME CONSTANT VARCHAR2(30) := 'GMI_QUANTITY_PVT';
37 IC$DEFAULT_LOT VARCHAR2(255);
38 IC$DEFAULT_LOCT VARCHAR2(255);
39 IC$ALLOWNEGINV VARCHAR2(255);
40 IC$MOVEDIFFSTAT VARCHAR2(255);
41
42 --+=========================================================================+
43 --| PROCEDURE NAME |
44 --| Validate_Inventory_Posting |
45 --| |
46 --| TYPE |
47 --| Public |
48 --| |
49 --| USAGE |
50 --| Perform validation functions for inventory quantities posting |
51 --| |
52 --| DESCRIPTION |
53 --| This procedure performs all the validation functions concerned with |
54 --| inventory quantity postings. |
55 --| |
56 --| PARAMETERS |
57 --| p_trans_rec Record datatype containing all inventory posting |
58 --| data |
59 --| x_item_id Surrogate key of the item |
60 --| x_lot_id Surrogate key of the lot |
61 --| x_old_lot_status Original lot status of item/lot/location |
62 --| x_old_qc_grade Original QC grade of item/lot |
63 --| x_trans_rec Record datatype containing all inventory posting |
64 --| data |
65 --| x_return_status 'S'-success, 'E'-error, 'U'-unexpected error |
66 --| x_msg_count Count of messages in message list |
67 --| x_msg_data Message data |
68 --| |
69 --| HISTORY |
70 --| 01-OCT-1998 M.Godfrey Created |
71 --| 16-AUG-1999 H.Verdding Added Fix For B965832 Part 2 |
72 --| Prevent Transactions Against |
73 --| Default Lot. |
74 --| 17-AUG-1999 H.Verdding Added Fix For B959444 |
75 --| Amended Deviation Logic |
76 --+=========================================================================+
77 PROCEDURE Validate_Inventory_Posting
78 ( p_trans_rec IN GMI_QUANTITY_PUB.trans_rec_typ
79 , x_item_id OUT ic_item_mst.item_id%TYPE
80 , x_lot_id OUT ic_lots_mst.lot_id%TYPE
81 , x_old_lot_status OUT ic_lots_sts.lot_status%TYPE
82 , x_old_qc_grade OUT qc_grad_mst.qc_grade%TYPE
83 , x_return_status OUT VARCHAR2
84 , x_msg_count OUT NUMBER
85 , x_msg_data OUT VARCHAR2
86 , x_trans_rec OUT GMI_QUANTITY_PUB.trans_rec_typ
87 )
88 IS
89 l_trans_rec GMI_QUANTITY_PUB.trans_rec_typ;
90 l_ic_item_mst_rec ic_item_mst%ROWTYPE;
91 l_ic_item_cpg_rec ic_item_cpg%ROWTYPE;
92 l_ic_lots_mst_rec ic_lots_mst%ROWTYPE;
93 l_ic_lots_cpg_rec ic_lots_cpg%ROWTYPE;
94 l_ic_whse_mst_rec ic_whse_mst%ROWTYPE;
95 l_ic_loct_inv_rec_from ic_loct_inv%ROWTYPE;
96 l_ic_loct_inv_rec_to ic_loct_inv%ROWTYPE;
97 l_sy_reas_cds_rec sy_reas_cds%ROWTYPE;
98 l_lot_rec GMI_LOTS_PUB.lot_rec_typ;
99 l_item_id ic_item_mst.item_id%TYPE;
100 l_lot_id ic_lots_mst.lot_id%TYPE;
101 l_qty2 NUMBER;
102 l_lot_onhand NUMBER :=0;
103 l_trans_type NUMBER(2);
104 l_msg_count NUMBER;
105 l_msg_data VARCHAR2(2000);
106 l_return_status VARCHAR2(1);
107 l_return_val NUMBER;
108 l_neg_qty NUMBER :=0;
109 l_user_name fnd_user.user_name%TYPE;
110 l_user_id fnd_user.user_id%TYPE;
111
112 BEGIN
113
114 l_user_name := p_trans_rec.user_name;
115
116 -- Populate WHO columns
117 GMA_GLOBAL_GRP.Get_who( p_user_name => l_user_name
118 , x_user_id => l_user_id
119 );
120
121 IF l_user_id = 0
122 THEN
123 FND_MESSAGE.SET_NAME('GMI','IC_API_INVALID_USER_NAME');
124 FND_MESSAGE.SET_TOKEN('USER_NAME',l_user_name);
125 FND_MSG_PUB.Add;
126 RAISE FND_API.G_EXC_ERROR;
127 END IF;
128
129 -- Get required system constants
130 IC$DEFAULT_LOT := FND_PROFILE.Value_Specific( name => 'IC$DEFAULT_LOT'
131 , user_id => l_user_id
132 );
133 IF (IC$DEFAULT_LOT IS NULL)
134 THEN
135 FND_MESSAGE.SET_NAME('GMI','IC_API_UNABLE_TO_GET_CONSTANT');
136 FND_MESSAGE.SET_TOKEN('CONSTANT_NAME','IC$DEFAULT_LOT');
137 FND_MSG_PUB.Add;
138 RAISE FND_API.G_EXC_ERROR;
139 END IF;
140 IC$DEFAULT_LOCT := FND_PROFILE.Value_Specific( name => 'IC$DEFAULT_LOCT'
141 , user_id => l_user_id
142 );
143 IF (IC$DEFAULT_LOCT IS NULL)
144 THEN
145 FND_MESSAGE.SET_NAME('GMI','IC_API_UNABLE_TO_GET_CONSTANT');
146 FND_MESSAGE.SET_TOKEN('CONSTANT_NAME','IC$DEFAULT_LOCT');
147 FND_MSG_PUB.Add;
148 RAISE FND_API.G_EXC_ERROR;
149 END IF;
150 IC$ALLOWNEGINV := FND_PROFILE.Value_Specific( name => 'IC$ALLOWNEGINV'
151 , user_id => l_user_id
152 );
153 IF (IC$ALLOWNEGINV IS NULL)
154 THEN
155 FND_MESSAGE.SET_NAME('GMI','IC_API_UNABLE_TO_GET_CONSTANT');
156 FND_MESSAGE.SET_TOKEN('CONSTANT_NAME','IC$ALLOWNEGINV');
157 FND_MSG_PUB.Add;
158 RAISE FND_API.G_EXC_ERROR;
159 END IF;
160 IC$MOVEDIFFSTAT := FND_PROFILE.Value_Specific( name => 'IC$MOVEDIFFSTAT'
161 , user_id => l_user_id
162 );
163 IF (IC$MOVEDIFFSTAT IS NULL)
164 THEN
165 FND_MESSAGE.SET_NAME('GMI','IC_API_UNABLE_TO_GET_CONSTANT');
166 FND_MESSAGE.SET_TOKEN('CONSTANT_NAME','IC$MOVEDIFFSTAT');
167 FND_MSG_PUB.Add;
168 RAISE FND_API.G_EXC_ERROR;
169 END IF;
170
171 -- Store transaction locally
172 l_trans_rec := p_trans_rec;
173 l_trans_type := p_trans_rec.trans_type;
174
175 -- Validate transaction type in the range 1 - 5
176 IF NOT GMA_VALID_GRP.NumRangeCheck(1,5,l_trans_type)
177 THEN
178 FND_MESSAGE.SET_NAME('GMI','IC_API_INVALID_TRANS_TYPE');
179 FND_MESSAGE.SET_TOKEN('TRANS_TYPE',l_trans_type);
180 FND_MSG_PUB.Add;
181 RAISE FND_API.G_EXC_ERROR;
182 END IF;
183
184 -- Check for inappropriate fields being passed for transaction type
185 -- From Warehouse
186 IF (l_trans_rec.from_whse_code <> ' ' AND
187 l_trans_rec.from_whse_code IS NOT NULL) AND
188 (l_trans_type = 5)
189 THEN
190 FND_MESSAGE.SET_NAME('GMI','IC_API_FROM_WHSE_NOT_REQD');
191 FND_MESSAGE.SET_TOKEN('ITEM_NO',l_trans_rec.item_no);
192 FND_MESSAGE.SET_TOKEN('TRANS_TYPE', l_trans_type);
193 FND_MSG_PUB.Add;
194 RAISE FND_API.G_EXC_ERROR;
195 END IF;
196 -- To Warehouse
197 IF (l_trans_rec.to_whse_code <> ' ' AND
198 l_trans_rec.to_whse_code IS NOT NULL) AND
199 (l_trans_type <> 3)
200 THEN
201 FND_MESSAGE.SET_NAME('GMI','IC_API_TO_WHSE_NOT_REQD');
202 FND_MESSAGE.SET_TOKEN('ITEM_NO',l_trans_rec.item_no);
203 FND_MESSAGE.SET_TOKEN('TRANS_TYPE', l_trans_type);
204 FND_MSG_PUB.Add;
205 RAISE FND_API.G_EXC_ERROR;
206 END IF;
207 -- From Location
208 IF (l_trans_rec.from_location <> ' ' AND
209 l_trans_rec.from_location IS NOT NULL) AND
210 (l_trans_type = 5)
211 THEN
212 FND_MESSAGE.SET_NAME('GMI','IC_API_LOCATION_NOT_REQD');
213 FND_MESSAGE.SET_TOKEN('ITEM_NO',l_trans_rec.item_no);
214 FND_MESSAGE.SET_TOKEN('TRANS_TYPE', l_trans_type);
215 FND_MSG_PUB.Add;
216 RAISE FND_API.G_EXC_ERROR;
217 END IF;
218 -- To Location
219 IF (l_trans_rec.to_location <> ' ' AND
220 l_trans_rec.to_location IS NOT NULL AND
221 l_trans_type <> 3)
222 THEN
223 FND_MESSAGE.SET_NAME('GMI','IC_API_LOCATION_NOT_REQD');
224 FND_MESSAGE.SET_TOKEN('ITEM_NO',l_trans_rec.item_no);
225 FND_MESSAGE.SET_TOKEN('TRANS_TYPE', l_trans_type);
226 FND_MSG_PUB.Add;
227 RAISE FND_API.G_EXC_ERROR;
228 END IF;
229 -- Primary UOM
230 IF (l_trans_rec.item_um <> ' ' AND
231 l_trans_rec.item_um IS NOT NULL) AND
232 (l_trans_type = 4 OR
233 l_trans_type = 5)
234 THEN
235 FND_MESSAGE.SET_NAME('GMI','IC_API_UOM_NOT_REQD');
236 FND_MESSAGE.SET_TOKEN('ITEM_NO',l_trans_rec.item_no);
237 FND_MESSAGE.SET_TOKEN('TRANS_TYPE', l_trans_type);
238 FND_MSG_PUB.Add;
239 RAISE FND_API.G_EXC_ERROR;
240 END IF;
241 -- Secondary UOM
242 IF (l_trans_rec.item_um2 <> ' ' AND
243 l_trans_rec.item_um2 IS NOT NULL) AND
244 (l_trans_type = 4 OR
245 l_trans_type = 5)
246 THEN
247 FND_MESSAGE.SET_NAME('GMI','IC_API_UOM2_NOT_REQD');
248 FND_MESSAGE.SET_TOKEN('ITEM_NO',l_trans_rec.item_no);
249 FND_MESSAGE.SET_TOKEN('TRANS_TYPE', l_trans_type);
250 FND_MSG_PUB.Add;
251 RAISE FND_API.G_EXC_ERROR;
252 END IF;
253 -- Primary qty
254 IF (l_trans_rec.trans_qty <> 0 AND
255 l_trans_rec.trans_qty IS NOT NULL) AND
256 (l_trans_type = 4 OR
257 l_trans_type = 5)
258 THEN
259 FND_MESSAGE.SET_NAME('GMI','IC_API_QTY_NOT_REQD');
260 FND_MESSAGE.SET_TOKEN('ITEM_NO',l_trans_rec.item_no);
261 FND_MESSAGE.SET_TOKEN('TRANS_TYPE', l_trans_type);
262 FND_MSG_PUB.Add;
263 RAISE FND_API.G_EXC_ERROR;
264 END IF;
265 -- Secondary qty
266 IF (l_trans_rec.trans_qty2 <> 0 AND
267 l_trans_rec.trans_qty2 IS NOT NULL) AND
268 (l_trans_type = 4 OR
269 l_trans_type = 5)
270 THEN
271 FND_MESSAGE.SET_NAME('GMI','IC_API_QTY2_NOT_REQD');
272 FND_MESSAGE.SET_TOKEN('ITEM_NO',l_trans_rec.item_no);
273 FND_MESSAGE.SET_TOKEN('TRANS_TYPE', l_trans_type);
274 FND_MSG_PUB.Add;
275 RAISE FND_API.G_EXC_ERROR;
276 END IF;
277 -- QC Grade
278 IF (l_trans_rec.qc_grade <> ' ' AND
279 l_trans_rec.qc_grade IS NOT NULL) AND
280 (l_trans_type <> 5) AND (l_trans_type <>1)
281 THEN
282 FND_MESSAGE.SET_NAME('GMI','IC_API_QC_GRADE_NOT_REQD');
283 FND_MESSAGE.SET_TOKEN('ITEM_NO',l_trans_rec.item_no);
284 FND_MESSAGE.SET_TOKEN('TRANS_TYPE', l_trans_type);
285 FND_MSG_PUB.Add;
286 RAISE FND_API.G_EXC_ERROR;
287 END IF;
288 -- Lot Status
289 IF (l_trans_rec.lot_status <> ' ' AND
290 l_trans_rec.lot_status IS NOT NULL) AND
291 (l_trans_type <> 4)
292 THEN
293 FND_MESSAGE.SET_NAME('GMI','IC_API_LOT_STATUS_NOT_REQD');
294 FND_MESSAGE.SET_TOKEN('ITEM_NO',l_trans_rec.item_no);
295 FND_MESSAGE.SET_TOKEN('TRANS_TYPE', l_trans_type);
296 FND_MSG_PUB.Add;
297 RAISE FND_API.G_EXC_ERROR;
298 END IF;
299
300 -- Validate Journal number
301 -- Added orgn_code to function call
302 -- H.Verdding Bug 1042739
303 IF NOT GMA_VALID_GRP.Validate_doc_no('JRNL',l_trans_rec.journal_no
304 ,l_trans_rec.orgn_code)
305 THEN
306 FND_MESSAGE.SET_NAME('GMI','IC_API_INVALID_JOURNAL_NO');
307 FND_MESSAGE.SET_TOKEN('JOURNAL_NO',l_trans_rec.journal_no);
308 FND_MSG_PUB.Add;
309 RAISE FND_API.G_EXC_ERROR;
310 ELSE
311 IF (l_trans_rec.journal_no = ' ' OR
312 l_trans_rec.journal_no IS NULL)
313 THEN
314 l_trans_rec.journal_no :=GMA_GLOBAL_GRP.Get_doc_no
315 ( 'JRNL'
316 , l_trans_rec.orgn_code
317 );
318 IF (l_trans_rec.journal_no = ' ')
319 THEN
320 FND_MESSAGE.SET_NAME('GMI','IC_API_UNABLE_TO_GET_DOC_NO');
321 FND_MESSAGE.SET_TOKEN('DOC_TYPE','JRNL');
322 FND_MESSAGE.SET_TOKEN('ORGN_CODE',l_trans_rec.orgn_code);
323 FND_MSG_PUB.Add;
324 RAISE FND_API.G_EXC_ERROR;
325 END IF;
326 END IF;
327 END IF;
328
329 -- Validate Reason Code
330 GMA_GLOBAL_GRP.Get_Reason_Code
331 ( p_reason_code => l_trans_rec.reason_code
332 , x_sy_reas_cds => l_sy_reas_cds_rec
333 );
334 IF (l_sy_reas_cds_rec.reason_code = ' ')
335 THEN
336 FND_MESSAGE.SET_NAME('GMI','IC_API_INVALID_REASON_CODE');
337 FND_MESSAGE.SET_TOKEN('REASON_CODE',l_trans_rec.reason_code);
338 FND_MSG_PUB.Add;
339 RAISE FND_API.G_EXC_ERROR;
340 END IF;
341
342 -- Get the item details
343 GMI_GLOBAL_GRP.Get_Item ( p_item_no => l_trans_rec.item_no
344 , x_ic_item_mst => l_ic_item_mst_rec
345 , x_ic_item_cpg => l_ic_item_cpg_rec
346 );
347 -- If errors were found then raise exception
348 IF (l_ic_item_mst_rec.item_id < 0)
349 THEN
350 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
351 ELSIF (l_ic_item_mst_rec.item_id = 0) OR
352 (l_ic_item_mst_rec.delete_mark = 1)
353 THEN
354 FND_MESSAGE.SET_NAME('GMI','IC_API_INVALID_ITEM_NO');
355 FND_MESSAGE.SET_TOKEN('ITEM_NO',l_trans_rec.item_no);
356 FND_MSG_PUB.Add;
357 RAISE FND_API.G_EXC_ERROR;
358 ELSIF (l_ic_item_mst_rec.noninv_ind = 1)
359 THEN
360 FND_MESSAGE.SET_NAME('GMI','IC_API_NONINV_ITEM_NO');
361 FND_MESSAGE.SET_TOKEN('ITEM_NO',l_trans_rec.item_no);
362 FND_MSG_PUB.Add;
363 RAISE FND_API.G_EXC_ERROR;
364 ELSIF (l_ic_item_mst_rec.inactive_ind = 1)
365 THEN
366 FND_MESSAGE.SET_NAME('GMI','IC_API_INACTIVE_ITEM_NO');
367 FND_MESSAGE.SET_TOKEN('ITEM_NO',l_trans_rec.item_no);
368 FND_MSG_PUB.Add;
369 RAISE FND_API.G_EXC_ERROR;
370 END IF;
371
372 -- Check that transaction type is applicable to item
373 -- QC grade change
374 IF (l_ic_item_mst_rec.grade_ctl = 0 AND l_trans_type = 5)
375 THEN
376 FND_MESSAGE.SET_NAME('GMI','IC_API_INV_TRANS_TYPE_FOR_ITEM');
377 FND_MESSAGE.SET_TOKEN('ITEM_NO',l_trans_rec.item_no);
378 FND_MESSAGE.SET_TOKEN('TRANS_TYPE', l_trans_type);
379 FND_MSG_PUB.Add;
380 RAISE FND_API.G_EXC_ERROR;
381 END IF;
382
383 -- Lot status change
384 IF (l_ic_item_mst_rec.status_ctl = 0 AND l_trans_type = 4)
385 THEN
386 FND_MESSAGE.SET_NAME('GMI','IC_API_INV_TRANS_TYPE_FOR_ITEM');
387 FND_MESSAGE.SET_TOKEN('ITEM_NO',l_trans_rec.item_no);
388 FND_MESSAGE.SET_TOKEN('TRANS_TYPE', l_trans_type);
389 FND_MSG_PUB.Add;
390 RAISE FND_API.G_EXC_ERROR;
391 END IF;
392
393 -- Default unit of measure fields for status and QC grade change
394 IF (l_trans_type > 3)
395 THEN
396 l_trans_rec.item_um := l_ic_item_mst_rec.item_um;
397 l_trans_rec.item_um2 := l_ic_item_mst_rec.item_um2;
398 END IF;
399
400 -- Store item_id for return to calling API
401 x_item_id :=l_ic_item_mst_rec.item_id;
402 l_item_id :=l_ic_item_mst_rec.item_id;
403
404 -- Store the default lot_status of the item. This will be
405 -- used as the 'Old' lot_status for QC grade transactions
406 -- In this situation 'Old' and 'New' lot_status is not
407 -- applicable.
408 x_old_lot_status :=l_ic_item_mst_rec.lot_status;
409
410 -- If not change lot status then store lot_status
411 IF (l_trans_type <> 4)
412 THEN
413 l_trans_rec.lot_status :=l_ic_item_mst_rec.lot_status;
414 END IF;
415
416 -- Check lot parameters
417 IF (l_ic_item_mst_rec.lot_ctl = 0)
418 THEN
419 IF (l_trans_rec.lot_no <>' ' AND
420 l_trans_rec.lot_no IS NOT NULL)
421 THEN
422 FND_MESSAGE.SET_NAME('GMI','IC_API_INVALID_LOT_NO');
423 FND_MESSAGE.SET_TOKEN('ITEM_NO',l_trans_rec.item_no);
424 FND_MESSAGE.SET_TOKEN('LOT_NO',l_trans_rec.lot_no);
425 FND_MESSAGE.SET_TOKEN('SUBLOT_NO',l_trans_rec.sublot_no);
426 FND_MSG_PUB.Add;
427 RAISE FND_API.G_EXC_ERROR;
428 END IF;
429 ELSE
430 IF (l_trans_rec.lot_no = ' ' OR
431 l_trans_rec.lot_no IS NULL)
432 THEN
433 FND_MESSAGE.SET_NAME('GMI','IC_API_INVALID_LOT_NO');
434 FND_MESSAGE.SET_TOKEN('ITEM_NO',l_trans_rec.item_no);
435 FND_MESSAGE.SET_TOKEN('LOT_NO',l_trans_rec.lot_no);
436 FND_MESSAGE.SET_TOKEN('SUBLOT_NO',l_trans_rec.sublot_no);
437 FND_MSG_PUB.Add;
438 RAISE FND_API.G_EXC_ERROR;
439 END IF;
440 END IF;
441
442 -- Check sub-lot parameters
443 IF (l_trans_rec.sublot_no IS NULL)
444 THEN
445 l_trans_rec.sublot_no := NULL;
446 END IF;
447
448 IF (l_ic_item_mst_rec.sublot_ctl = 0)
449 THEN
450 IF (l_trans_rec.sublot_no <>' ')
451 THEN
452 FND_MESSAGE.SET_NAME('GMI','IC_API_SUBLOT_NOT_REQD');
453 FND_MESSAGE.SET_TOKEN('ITEM_NO',l_trans_rec.item_no);
454 FND_MSG_PUB.Add;
455 RAISE FND_API.G_EXC_ERROR;
456 END IF;
457 END IF;
458
459 -- Get existing lot details. If item not lot controlled then
460 -- get the default lot.
461
462 IF (l_ic_item_mst_rec.sublot_ctl = 0)
463 THEN
464 l_trans_rec.sublot_no :=NULL;
465 END IF;
466
467 IF (l_ic_item_mst_rec.lot_ctl = 0)
468 THEN
469 l_trans_rec.lot_no :=IC$DEFAULT_LOT;
470 ELSE
471 -- Do not Allow Transactions against DEFAULT LOT
472 -- H.Verdding B965832 Part 2
473 IF (l_ic_item_mst_rec.lot_ctl = 1 AND
474 l_trans_rec.lot_no='DEFAULTLOT')
475 THEN
476 FND_MESSAGE.SET_NAME('GMI','IC_DEFAULTLOTERR');
477 FND_MSG_PUB.Add;
478 RAISE FND_API.G_EXC_ERROR;
479 END IF;
480 END IF;
481
482
483 GMI_GLOBAL_GRP.Get_Lot ( p_item_id => l_ic_item_mst_rec.item_id
484 , p_lot_no => l_trans_rec.lot_no
485 , p_sublot_no => l_trans_rec.sublot_no
486 , x_ic_lots_mst => l_ic_lots_mst_rec
487 , x_ic_lots_cpg => l_ic_lots_cpg_rec
488 );
489 -- Check for deleted or inactive lot
490 IF (l_ic_lots_mst_rec.delete_mark = 1) OR
491 (l_ic_lots_mst_rec.inactive_ind = 1)
492 THEN
493 FND_MESSAGE.SET_NAME('GMI','IC_API_INVALID_LOT_NO');
494 FND_MESSAGE.SET_TOKEN('ITEM_NO',l_trans_rec.item_no);
495 FND_MESSAGE.SET_TOKEN('LOT_NO',l_trans_rec.lot_no);
496 FND_MESSAGE.SET_TOKEN('SUBLOT_NO',l_trans_rec.sublot_no);
497 FND_MSG_PUB.Add;
498 RAISE FND_API.G_EXC_ERROR;
499 ELSIF (l_ic_lots_mst_rec.lot_id = -2)
500 THEN
501 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
502 END IF;
503
504 -- If the was lot not found and not creating inventory then error
505 IF (l_trans_type <> 1)
506 THEN
507 IF (l_ic_lots_mst_rec.lot_id = -1)
508 THEN
509 FND_MESSAGE.SET_NAME('GMI','IC_API_INVALID_LOT_NO');
510 FND_MESSAGE.SET_TOKEN('ITEM_NO',l_trans_rec.item_no);
511 FND_MESSAGE.SET_TOKEN('LOT_NO',l_trans_rec.lot_no);
512 FND_MESSAGE.SET_TOKEN('SUBLOT_NO',l_trans_rec.sublot_no);
513 FND_MSG_PUB.Add;
514 RAISE FND_API.G_EXC_ERROR;
515 END IF;
516 ELSE
517 -- If the lot was not found when creating inventory then create it
518 IF (l_ic_lots_mst_rec.lot_id = -1)
519 THEN
520 -- Set up PL/SQL record and create the lot
521 l_lot_rec.item_no :=l_trans_rec.item_no;
522 l_lot_rec.lot_no :=l_trans_rec.lot_no;
523 l_lot_rec.sublot_no :=l_trans_rec.sublot_no;
524 l_lot_rec.user_name :=l_trans_rec.user_name;
525 l_lot_rec.qc_grade :=l_trans_rec.qc_grade;
526 GMI_LOTS_PUB.Create_Lot ( p_api_version => 2.0
527 , x_return_status => l_return_status
528 , x_msg_count => l_msg_count
529 , x_msg_data => l_msg_data
530 , p_lot_rec => l_lot_rec
531 );
532 -- If errors were found then raise exception
533 IF (l_return_status = FND_API.G_RET_STS_ERROR)
534 THEN
535 RAISE FND_API.G_EXC_ERROR;
536 ELSIF (l_return_status = FND_API.G_RET_STS_UNEXP_ERROR)
537 THEN
538 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
539 END IF;
540
541 -- Initialize message list to remove 'Lot created' message
542 FND_MSG_PUB.Initialize;
543
544 -- Get lot details for lot created
545 GMI_GLOBAL_GRP.Get_Lot ( p_item_id => l_ic_item_mst_rec.item_id
546 , p_lot_no => l_trans_rec.lot_no
547 , p_sublot_no => l_trans_rec.sublot_no
548 , x_ic_lots_mst => l_ic_lots_mst_rec
549 , x_ic_lots_cpg => l_ic_lots_cpg_rec
550 );
551 END IF;
552 END IF;
553
554 -- Store the lot_id and original QC grade locally
555 x_lot_id := l_ic_lots_mst_rec.lot_id;
556 l_lot_id := l_ic_lots_mst_rec.lot_id;
557 x_old_qc_grade := l_ic_lots_mst_rec.qc_grade;
558
559 -- If QC grade change then check new QC grade differs from existing
560 -- If not QC grade change then store lot QC grade as new QC grade
561 IF (l_trans_type = 5)
562 THEN
563 IF (l_trans_rec.qc_grade = l_ic_lots_mst_rec.qc_grade)
564 THEN
565 FND_MESSAGE.SET_NAME('GMI','IC_API_SAME_QC_GRADE');
566 FND_MESSAGE.SET_TOKEN('ITEM_NO',l_trans_rec.item_no);
567 FND_MESSAGE.SET_TOKEN('LOT_NO',l_trans_rec.lot_no);
568 FND_MESSAGE.SET_TOKEN('SUBLOT_NO',l_trans_rec.sublot_no);
569 FND_MSG_PUB.Add;
570 RAISE FND_API.G_EXC_ERROR;
571 END IF;
572 ELSE
573 l_trans_rec.qc_grade :=l_ic_lots_mst_rec.qc_grade;
574 END IF;
575
576 -- Validate 'from' warehouse code (not applicable for change QC Grade)
577 IF (l_trans_type <> 5)
578 THEN
579 GMI_GLOBAL_GRP.Get_Warehouse ( p_whse_code => l_trans_rec.from_whse_code
580 , x_ic_whse_mst => l_ic_whse_mst_rec
581 );
582 IF (l_ic_whse_mst_rec.whse_code = ' ') OR
583 (l_ic_whse_mst_rec.delete_mark = 1)
584 THEN
585 FND_MESSAGE.SET_NAME('GMI','IC_API_INVALID_WHSE_CODE');
586 FND_MESSAGE.SET_TOKEN('WHSE_CODE', l_trans_rec.from_whse_code);
587 FND_MSG_PUB.Add;
588 RAISE FND_API.G_EXC_ERROR;
589 ELSE
590 -- Check location parameters
591 IF NOT GMI_VALID_GRP.Validate_Location
592 ( p_item_loct_ctl => l_ic_item_mst_rec.loct_ctl
593 , p_whse_loct_ctl => l_ic_whse_mst_rec.loct_ctl
594 , p_whse_code => l_trans_rec.from_whse_code
595 , p_location => l_trans_rec.from_location
596 )
597 THEN
598 FND_MESSAGE.SET_NAME('GMI','IC_API_INVALID_LOCATION');
599 FND_MESSAGE.SET_TOKEN('ITEM_NO', l_trans_rec.item_no);
600 FND_MESSAGE.SET_TOKEN('WHSE_CODE', l_trans_rec.from_whse_code);
601 FND_MESSAGE.SET_TOKEN('LOCATION',l_trans_rec.from_location);
602 FND_MSG_PUB.Add;
603 RAISE FND_API.G_EXC_ERROR;
604 ELSIF (l_trans_rec.from_location = ' ' OR
605 l_trans_rec.from_location IS NULL)
606 THEN
607 l_trans_rec.from_location := IC$DEFAULT_LOCT;
608 END IF;
609 END IF;
610 ELSE
611 -- For QC Grade changes 'from' warehouse and location are not relevant
612 l_trans_rec.from_whse_code := NULL;
613 l_trans_rec.from_location := NULL;
614 END IF;
615
616 -- If move inventory transaction then validate 'to' warehouse code
617 IF (l_trans_type = 3)
618 THEN
619 GMI_GLOBAL_GRP.Get_Warehouse ( p_whse_code =>l_trans_rec.to_whse_code
620 , x_ic_whse_mst => l_ic_whse_mst_rec
621 );
622 IF (l_ic_whse_mst_rec.whse_code = ' ') OR
623 (l_ic_whse_mst_rec.delete_mark = 1)
624 THEN
625 FND_MESSAGE.SET_NAME('GMI','IC_API_INVALID_WHSE_CODE');
626 FND_MESSAGE.SET_TOKEN('WHSE_CODE', l_trans_rec.to_whse_code);
627 FND_MSG_PUB.Add;
628 RAISE FND_API.G_EXC_ERROR;
629 ELSE
630 -- Check location parameters
631 IF NOT GMI_VALID_GRP.Validate_Location
632 ( p_item_loct_ctl => l_ic_item_mst_rec.loct_ctl
633 , p_whse_loct_ctl => l_ic_whse_mst_rec.loct_ctl
634 , p_whse_code => l_trans_rec.to_whse_code
635 , p_location => l_trans_rec.to_location
636 )
637 THEN
638 FND_MESSAGE.SET_NAME('GMI','IC_API_INVALID_LOCATION');
639 FND_MESSAGE.SET_TOKEN('ITEM_NO', l_trans_rec.item_no);
640 FND_MESSAGE.SET_TOKEN('WHSE_CODE', l_trans_rec.to_whse_code);
641 FND_MESSAGE.SET_TOKEN('LOCATION',l_trans_rec.to_location);
642 FND_MSG_PUB.Add;
643 RAISE FND_API.G_EXC_ERROR;
644 ELSE
645 IF (l_trans_rec.to_location = ' ' OR
646 l_trans_rec.to_location IS NULL)
647 THEN
648 l_trans_rec.to_location := IC$DEFAULT_LOCT;
649 END IF;
650 END IF;
651 END IF;
652 -- Check that from warehouse/location differs from to warehouse/location
653 IF (l_trans_rec.from_whse_code = l_trans_rec.to_whse_code) AND
654 (l_trans_rec.from_location = l_trans_rec.to_location)
655 THEN
656 FND_MESSAGE.SET_NAME('GMI','IC_API_MOVE_SAME_WHSE_LOC');
657 FND_MESSAGE.SET_TOKEN('ITEM_NO',l_trans_rec.item_no);
658 FND_MESSAGE.SET_TOKEN('LOT_NO',l_trans_rec.lot_no);
659 FND_MESSAGE.SET_TOKEN('SUBLOT_NO',l_trans_rec.sublot_no);
660 FND_MSG_PUB.Add;
661 RAISE FND_API.G_EXC_ERROR;
662 END IF;
663 -- For Change lot status 'to' warehouse and location are the same as 'from'
664 ELSIF (l_trans_type = 4)
665 THEN
666 l_trans_rec.to_whse_code := l_trans_rec.from_whse_code;
667 l_trans_rec.to_location := l_trans_rec.from_location;
668 ELSE
669 -- For Create, adjust or QC Grade changes 'to' warehouse and location
670 -- are not relevant
671 l_trans_rec.to_whse_code := NULL;
672 l_trans_rec.to_location := NULL;
673 END IF;
674
675 -- If adjusting, moving or changing lot status, check that inventory
676 -- exists at from warehouse / location
677 --LIZ Put this call outside the trans_type condition
678 -- IF (l_trans_type <> 5)
679 -- THEN
680 GMI_GLOBAL_GRP.Get_loct_inv ( p_item_id =>l_item_id
681 , p_whse_code =>l_trans_rec.from_whse_code
682 , p_lot_id =>l_lot_id
683 , p_location =>l_trans_rec.from_location
684 , x_ic_loct_inv =>l_ic_loct_inv_rec_from
685 );
686 -- If inventory create then should be no stock at location.
687 -- If inventory adjust then may or may not be stock at location
688 IF (l_trans_type <> 5)
689 THEN
690 IF (l_trans_type = 1 OR l_trans_type = 2) AND
691 (l_ic_loct_inv_rec_from.item_id = 0)
692 THEN
693 l_ic_loct_inv_rec_from.loct_onhand :=0;
694 l_ic_loct_inv_rec_from.loct_onhand2 :=0;
695 l_trans_rec.lot_status :=l_ic_item_mst_rec.lot_status;
696 ELSIF (l_trans_type = 1)
697 THEN
698 FND_MESSAGE.SET_NAME('GMI','IC_API_LOCT_ONHAND_EXISTS');
699 FND_MESSAGE.SET_TOKEN('ITEM_NO',l_trans_rec.item_no);
700 FND_MESSAGE.SET_TOKEN('LOT_NO',l_trans_rec.lot_no);
701 FND_MESSAGE.SET_TOKEN('SUBLOT_NO',l_trans_rec.sublot_no);
702 FND_MESSAGE.SET_TOKEN('WHSE_CODE',l_trans_rec.from_whse_code);
703 FND_MESSAGE.SET_TOKEN('LOCATION',l_trans_rec.from_location);
704 FND_MSG_PUB.Add;
705 RAISE FND_API.G_EXC_ERROR;
706 ELSIF (l_ic_loct_inv_rec_from.item_id = 0) OR
707 (l_ic_loct_inv_rec_from.loct_onhand = 0 AND l_trans_type =4)
708 THEN
709 FND_MESSAGE.SET_NAME('GMI','IC_API_NO_LOCT_ONHAND');
710 FND_MESSAGE.SET_TOKEN('ITEM_NO',l_trans_rec.item_no);
711 FND_MESSAGE.SET_TOKEN('LOT_NO',l_trans_rec.lot_no);
712 FND_MESSAGE.SET_TOKEN('SUBLOT_NO',l_trans_rec.sublot_no);
713 FND_MESSAGE.SET_TOKEN('WHSE_CODE',l_trans_rec.from_whse_code);
714 FND_MESSAGE.SET_TOKEN('LOCATION',l_trans_rec.from_location);
715 FND_MSG_PUB.Add;
716 RAISE FND_API.G_EXC_ERROR;
717 ELSIF (l_trans_type = 2)
718 THEN
719 l_trans_rec.lot_status :=l_ic_loct_inv_rec_from.lot_status;
720 -- If adjust inventory then this will also be new lot status
721 ELSIF (l_trans_type = 4) AND
722 (l_trans_rec.lot_status = l_ic_loct_inv_rec_from.lot_status)
723 THEN
724 FND_MESSAGE.SET_NAME('GMI','IC_API_SAME_LOT_STATUS');
725 FND_MESSAGE.SET_TOKEN('ITEM_NO',l_trans_rec.item_no);
726 FND_MESSAGE.SET_TOKEN('LOT_NO',l_trans_rec.lot_no);
727 FND_MESSAGE.SET_TOKEN('SUBLOT_NO',l_trans_rec.sublot_no);
728 FND_MSG_PUB.Add;
729 RAISE FND_API.G_EXC_ERROR;
730 ELSE
731 -- Store original lot status
732 x_old_lot_status :=l_ic_loct_inv_rec_from.lot_status;
733 END IF;
734 -- If changing QC grade then check lot has inventory
735 ELSIF (l_trans_type = 5)
736 THEN
737 GMI_GLOBAL_GRP.Get_lot_inv ( p_item_id =>l_item_id
738 , p_lot_id =>l_lot_id
739 , x_lot_onhand =>l_lot_onhand
740 );
741 x_old_lot_status :=l_ic_loct_inv_rec_from.lot_status;
742 IF (l_lot_onhand = 0 OR l_lot_onhand IS NULL)
743 THEN
744 FND_MESSAGE.SET_NAME('GMI','IC_API_NO_LOT_ONHAND');
745 FND_MESSAGE.SET_TOKEN('ITEM_NO',l_trans_rec.item_no);
746 FND_MESSAGE.SET_TOKEN('LOT_NO',l_trans_rec.lot_no);
747 FND_MESSAGE.SET_TOKEN('SUBLOT_NO',l_trans_rec.sublot_no);
748 FND_MSG_PUB.Add;
749 RAISE FND_API.G_EXC_ERROR;
750 END IF;
751 END IF;
752
753 -- Check for zero quantity
754 IF (l_trans_type < 4)
755 THEN
756 IF (l_trans_rec.trans_qty =0)
757 THEN
758 FND_MESSAGE.SET_NAME('GMI','IC_API_ZERO_QTY');
759 FND_MESSAGE.SET_TOKEN('ITEM_NO',l_trans_rec.item_no);
760 FND_MESSAGE.SET_TOKEN('LOT_NO',l_trans_rec.lot_no);
761 FND_MESSAGE.SET_TOKEN('SUBLOT_NO',l_trans_rec.sublot_no);
762 FND_MSG_PUB.Add;
763 RAISE FND_API.G_EXC_ERROR;
764 END IF;
765 IF (l_trans_rec.trans_qty2 <> 0 AND
766 l_trans_rec.trans_qty2 IS NOT NULL) AND
767 (l_ic_item_mst_rec.dualum_ind = 0 OR
768 l_ic_item_mst_rec.dualum_ind =1)
769 THEN
770 FND_MESSAGE.SET_NAME('GMI','IC_API_INVALID_QTY2');
771 FND_MESSAGE.SET_TOKEN('ITEM_NO',l_trans_rec.item_no);
772 FND_MESSAGE.SET_TOKEN('LOT_NO',l_trans_rec.lot_no);
773 FND_MESSAGE.SET_TOKEN('SUBLOT_NO',l_trans_rec.sublot_no);
774 FND_MSG_PUB.Add;
775 RAISE FND_API.G_EXC_ERROR;
776 END IF;
777 END IF;
778
779 -- Check Primary UoM
780 IF NOT GMA_VALID_GRP.Validate_um(l_trans_rec.item_um)
781 THEN
782 FND_MESSAGE.SET_NAME('GMI','IC_API_INVALID_UOM');
783 FND_MESSAGE.SET_TOKEN('ITEM_NO',l_trans_rec.item_no);
784 FND_MESSAGE.SET_TOKEN('UOM',l_trans_rec.item_um);
785 FND_MSG_PUB.Add;
786 RAISE FND_API.G_EXC_ERROR;
787 END IF;
788
789 -- Handle Quantities
790 -- If primary Uom differs from item primary UoM then convert
791 -- transaction quantity
792 IF (l_trans_rec.item_um <> l_ic_item_mst_rec.item_um) OR
793 (l_trans_rec.item_um IS NULL)
794 THEN
795 -- If quantity to convert is negative then make positive for conversion
796 IF l_trans_rec.trans_qty < 0
797 THEN
798 l_neg_qty := 1;
799 l_trans_rec.trans_qty := 0 - l_trans_rec.trans_qty;
800 END IF;
801 l_trans_rec.trans_qty :=GMICUOM.uom_conversion
802 ( pitem_id =>l_item_id
803 , plot_id =>l_lot_id
804 , pcur_qty =>l_trans_rec.trans_qty
805 , pcur_uom =>l_trans_rec.item_um
806 , pnew_uom =>l_ic_item_mst_rec.item_um
807 , patomic =>0
808 );
809 -- Negative quantity indicates UoM conversion failure
810 IF (l_trans_rec.trans_qty < 0)
811 THEN
812 FND_MESSAGE.SET_NAME('GMI','IC_API_UOM_CONVERSION_ERROR');
813 FND_MESSAGE.SET_TOKEN('ITEM_NO',l_trans_rec.item_no);
814 FND_MESSAGE.SET_TOKEN('FROM_UOM',l_trans_rec.item_um);
815 FND_MESSAGE.SET_TOKEN('TO_UOM',l_ic_item_mst_rec.item_um);
816 FND_MSG_PUB.Add;
817 RAISE FND_API.G_EXC_ERROR;
818 ELSE
819 l_trans_rec.item_um :=l_ic_item_mst_rec.item_um;
820 -- Reverse quantity sign if reversed above
821 IF l_neg_qty = 1
822 THEN
823 l_neg_qty := 0;
824 l_trans_rec.trans_qty := 0 - l_trans_rec.trans_qty;
825 END IF;
826 END IF;
827 END IF;
828
829 -- If dual unit of measure then convert to item secondary unit of measure
830 IF (l_ic_item_mst_rec.dualum_ind > 0)
831 THEN
832 -- If quantity to convert is negative then make positive for conversion
833 IF l_trans_rec.trans_qty < 0
834 THEN
835 l_neg_qty := 1;
836 l_trans_rec.trans_qty := 0 - l_trans_rec.trans_qty;
837 END IF;
838 l_qty2 :=GMICUOM.uom_conversion
839 ( pitem_id =>l_item_id
840 , plot_id =>l_lot_id
841 , pcur_qty =>l_trans_rec.trans_qty
842 , pcur_uom =>l_ic_item_mst_rec.item_um
843 , pnew_uom =>l_ic_item_mst_rec.item_um2
844 , patomic =>0
845 );
846 -- Negative quantity indicates UoM conversion failure
847 IF (l_qty2 < 0)
848 THEN
849 FND_MESSAGE.SET_NAME('GMI','IC_API_UOM_CONVERSION_ERROR');
850 FND_MESSAGE.SET_TOKEN('ITEM_NO',l_trans_rec.item_no);
851 FND_MESSAGE.SET_TOKEN('FROM_UOM',l_ic_item_mst_rec.item_um);
852 FND_MESSAGE.SET_TOKEN('TO_UOM',l_ic_item_mst_rec.item_um2);
853 FND_MSG_PUB.Add;
854 RAISE FND_API.G_EXC_ERROR;
855 END IF;
856 -- Reverse quantity sign if reversed above
857 IF l_neg_qty = 1
858 THEN
859 l_neg_qty := 0;
860 l_trans_rec.trans_qty := 0 - l_trans_rec.trans_qty;
861 l_qty2 := 0 - l_qty2;
862 END IF;
863 -- If fixed conversion then converted value is secondary qty
864 IF (l_ic_item_mst_rec.dualum_ind = 1) OR
865 (l_ic_item_mst_rec.dualum_ind =2 AND l_trans_rec.trans_qty2 = 0)
866 THEN
867 l_trans_rec.trans_qty2 :=l_qty2;
868 l_trans_rec.item_um2 :=l_ic_item_mst_rec.item_um2;
869 ELSE
870 -- If secondary Uom differs from item secondary UoM then convert
871 -- transaction quantity
872 IF (l_trans_rec.item_um2 <> l_ic_item_mst_rec.item_um2)
873 THEN
874 -- If quantity to convert is negative then make positive for conversion
875 IF l_trans_rec.trans_qty < 0
876 THEN
877 l_neg_qty := 1;
878 l_trans_rec.trans_qty2 := 0 - l_trans_rec.trans_qty2;
879 END IF;
880 l_trans_rec.trans_qty2 :=GMICUOM.uom_conversion
881 ( pitem_id =>l_item_id
882 , plot_id =>l_lot_id
883 , pcur_qty =>l_trans_rec.trans_qty2
884 , pcur_uom =>l_trans_rec.item_um2
885 , pnew_uom =>l_ic_item_mst_rec.item_um2
886 , patomic =>0
887 );
888 -- Negative quantity indicates UoM conversion failure
889 IF (l_trans_rec.trans_qty2 < 0)
890 THEN
891 FND_MESSAGE.SET_NAME('GMI','IC_API_UOM_CONVERSION_ERROR');
892 FND_MESSAGE.SET_TOKEN('ITEM_NO',l_trans_rec.item_no);
893 FND_MESSAGE.SET_TOKEN('FROM_UOM',l_trans_rec.item_um2);
894 FND_MESSAGE.SET_TOKEN('TO_UOM',l_ic_item_mst_rec.item_um2);
895 FND_MSG_PUB.Add;
896 RAISE FND_API.G_EXC_ERROR;
897 ELSE
898 l_trans_rec.item_um2 :=l_ic_item_mst_rec.item_um2;
899 -- Reverse quantity sign if reversed above
900 IF l_neg_qty = 1
901 THEN
902 l_neg_qty := 0;
903 l_trans_rec.trans_qty2 := 0 - l_trans_rec.trans_qty2;
904 END IF;
905 END IF;
906 END IF;
907 -- Check deviation
908 -- H.Verdding B959444 Amended Deviation Logic
909 IF (ABS(l_trans_rec.trans_qty2) >
910 ABS(l_qty2) * (1 + l_ic_item_mst_rec.deviation_hi)) OR
911 (ABS(l_trans_rec.trans_qty2) <
912 ABS(l_qty2) * (1 - l_ic_item_mst_rec.deviation_lo))
913 THEN
914 FND_MESSAGE.SET_NAME('GMI','IC_API_QTY_TOLERANCE_ERROR');
915 FND_MESSAGE.SET_TOKEN('ITEM_NO',l_trans_rec.item_no);
916 FND_MESSAGE.SET_TOKEN('LOT_NO',l_trans_rec.lot_no);
917 FND_MESSAGE.SET_TOKEN('SUBLOT_NO',l_trans_rec.sublot_no);
918 FND_MSG_PUB.Add;
919 RAISE FND_API.G_EXC_ERROR;
920 END IF;
921 END IF;
922 ELSE
923 --LE fix
924 l_trans_rec.item_um2 := NULL;
925 END IF;
926
927 -- Check quantity is correctly signed
928 IF (l_trans_type = 3 AND l_trans_rec.trans_qty <= 0)
929 THEN
930 FND_MESSAGE.SET_NAME('GMI','IC_API_MOVE_QTY_NOT_NEG');
931 FND_MESSAGE.SET_TOKEN('ITEM_NO',l_trans_rec.item_no);
932 FND_MESSAGE.SET_TOKEN('LOT_NO',l_trans_rec.lot_no);
933 FND_MESSAGE.SET_TOKEN('SUBLOT_NO',l_trans_rec.sublot_no);
934 FND_MSG_PUB.Add;
935 RAISE FND_API.G_EXC_ERROR;
936 END IF;
937
938 -- Check location inventory for becoming negative
939 IF (IC$ALLOWNEGINV = '0')
940 THEN
941 IF ((l_trans_type = 1 OR l_trans_type = 2) AND
942 (l_ic_loct_inv_rec_from.loct_onhand +
943 l_trans_rec.trans_qty) < 0) OR
944 (l_trans_type = 3 AND (l_ic_loct_inv_rec_from.loct_onhand -
945 l_trans_rec.trans_qty) < 0)
946 THEN
947 FND_MESSAGE.SET_NAME('GMI','IC_API_NEG_QTY_NOT_ALLOWED');
948 FND_MESSAGE.SET_TOKEN('ITEM_NO',l_trans_rec.item_no);
949 FND_MESSAGE.SET_TOKEN('LOT_NO',l_trans_rec.lot_no);
950 FND_MESSAGE.SET_TOKEN('SUBLOT_NO',l_trans_rec.sublot_no);
951 FND_MESSAGE.SET_TOKEN('WHSE_CODE',l_trans_rec.from_whse_code);
952 FND_MESSAGE.SET_TOKEN('LOCATION',l_trans_rec.from_location);
953 FND_MSG_PUB.Add;
954 RAISE FND_API.G_EXC_ERROR;
955 END IF;
956 END IF;
957
958 -- Check reason type allows quantity
959 IF (l_trans_type < 4)
960 THEN
961 IF ((l_sy_reas_cds_rec.reason_type = 1) AND
962 (l_trans_rec.trans_qty < 0))
963 THEN
964 FND_MESSAGE.SET_NAME('GMI','IC_API_DEC_NOT_ALLOWED');
965 FND_MESSAGE.SET_TOKEN('ITEM_NO',l_trans_rec.item_no);
966 FND_MESSAGE.SET_TOKEN('LOT_NO',l_trans_rec.lot_no);
967 FND_MESSAGE.SET_TOKEN('SUBLOT_NO',l_trans_rec.sublot_no);
968 FND_MSG_PUB.Add;
969 RAISE FND_API.G_EXC_ERROR;
970 ELSIF ((l_sy_reas_cds_rec.reason_type = 2) AND
971 (l_trans_rec.trans_qty > 0))
972 THEN
973 FND_MESSAGE.SET_NAME('GMI','IC_API_INC_NOT_ALLOWED');
974 FND_MESSAGE.SET_TOKEN('ITEM_NO',l_trans_rec.item_no);
975 FND_MESSAGE.SET_TOKEN('LOT_NO',l_trans_rec.lot_no);
976 FND_MESSAGE.SET_TOKEN('SUBLOT_NO',l_trans_rec.sublot_no);
977 FND_MSG_PUB.Add;
978 RAISE FND_API.G_EXC_ERROR;
979 END IF;
980 END IF;
981
982 -- Check move quantity if item is lot-indivisble
983 IF (l_ic_item_mst_rec.lot_indivisible = 1) AND
984 (l_trans_type = 3) AND
985 (l_ic_loct_inv_rec_from.loct_onhand <> l_trans_rec.trans_qty)
986 THEN
987 FND_MESSAGE.SET_NAME('GMI','IC_API_LOT_INDIVISIBLE');
988 FND_MESSAGE.SET_TOKEN('ITEM_NO',l_trans_rec.item_no);
989 FND_MESSAGE.SET_TOKEN('LOT_NO',l_trans_rec.lot_no);
990 FND_MESSAGE.SET_TOKEN('SUBLOT_NO',l_trans_rec.sublot_no);
991 FND_MESSAGE.SET_TOKEN('WHSE_CODE',l_trans_rec.from_whse_code);
992 FND_MESSAGE.SET_TOKEN('LOCATION',l_trans_rec.from_location);
993 FND_MSG_PUB.Add;
994 RAISE FND_API.G_EXC_ERROR;
995 END IF;
996
997 -- If moving inventory, check inventory at to warehouse /location
998 IF (l_trans_type = 3)
999 THEN
1000 GMI_GLOBAL_GRP.Get_loct_inv
1001 ( p_item_id =>l_item_id
1002 , p_whse_code =>l_trans_rec.to_whse_code
1003 , p_lot_id =>l_lot_id
1004 , p_location =>l_trans_rec.to_location
1005 , x_ic_loct_inv =>l_ic_loct_inv_rec_to
1006 );
1007 -- If location inventory not found then insert row into IC_LOCT_INV
1008 IF (l_ic_loct_inv_rec_to.item_id = 0)
1009 THEN
1010 l_trans_rec.lot_status := l_ic_loct_inv_rec_from.lot_status;
1011 -- If location inventory found then check lot_status if status
1012 -- controlled item
1013 ELSE
1014 IF (l_ic_item_mst_rec.status_ctl = 1)
1015 THEN
1016 IF (l_ic_loct_inv_rec_from.lot_status <>
1017 l_ic_loct_inv_rec_to.lot_status)
1018 THEN
1019 IF (l_ic_loct_inv_rec_to.loct_onhand = 0 AND
1020 IC$MOVEDIFFSTAT = '2')
1021 THEN
1022 l_trans_rec.lot_status := l_ic_loct_inv_rec_from.lot_status;
1023 ELSIF (IC$MOVEDIFFSTAT = '1')
1024 THEN
1025 l_trans_rec.lot_status := l_ic_loct_inv_rec_to.lot_status;
1026 ELSE
1027 FND_MESSAGE.SET_NAME('GMI','IC_API_MOVE_STATUS_ERR');
1028 FND_MESSAGE.SET_TOKEN('ITEM_NO',l_trans_rec.item_no);
1029 FND_MESSAGE.SET_TOKEN('LOT_NO',l_trans_rec.lot_no);
1030 FND_MESSAGE.SET_TOKEN('SUBLOT_NO',l_trans_rec.sublot_no);
1031 FND_MSG_PUB.Add;
1032 RAISE FND_API.G_EXC_ERROR;
1033 END IF;
1034 ELSE
1035 l_trans_rec.lot_status := l_ic_loct_inv_rec_from.lot_status;
1036 END IF;
1037 END IF;
1038 END IF;
1039 END IF;
1040
1041 -- Validate lot status for change lot status transaction
1042 IF (l_trans_type = 4)
1043 THEN
1044 IF NOT GMI_VALID_GRP.Validate_lot_status ( l_trans_rec.lot_status
1045 , l_ic_item_mst_rec.status_ctl
1046 )
1047 THEN
1048 FND_MESSAGE.SET_NAME('GMI','IC_API_INVALID_LOT_STATUS');
1049 FND_MESSAGE.SET_TOKEN('LOT_STATUS',l_trans_rec.lot_status);
1050 FND_MESSAGE.SET_TOKEN('ITEM_NO',l_trans_rec.item_no);
1051 FND_MSG_PUB.Add;
1052 RAISE FND_API.G_EXC_ERROR;
1053 END IF;
1054 -- Check for unposted journals with different lot status
1055 IF Check_unposted_jnl_lot_status
1056 ( p_item_id => l_item_id
1057 , p_lot_id => l_lot_id
1058 , p_whse_code => l_trans_rec.from_whse_code
1059 , p_location => l_trans_rec.from_location
1060 , p_lot_status => l_trans_rec.lot_status
1061 )
1062 THEN
1063 FND_MESSAGE.SET_NAME('GMI','IC_API_UNPOSTED_JNL_LOT_STATUS');
1064 FND_MESSAGE.SET_TOKEN('LOT_STATUS',l_trans_rec.lot_status);
1065 FND_MESSAGE.SET_TOKEN('ITEM_NO',l_trans_rec.item_no);
1066 FND_MSG_PUB.Add;
1067 RAISE FND_API.G_EXC_ERROR;
1068 END IF;
1069 END IF;
1070
1071 -- Validate QC grade for change QC grade transaction
1072 IF (l_trans_type = 5) OR (l_trans_type = 1)
1073 THEN
1074 IF NOT GMI_VALID_GRP.Validate_qc_grade ( l_trans_rec.qc_grade
1075 , l_ic_item_mst_rec.grade_ctl
1076 )
1077 THEN
1078 FND_MESSAGE.SET_NAME('GMI','IC_API_INVALID_QC_GRADE');
1079 FND_MESSAGE.SET_TOKEN('QC_GRADE',l_trans_rec.qc_grade);
1080 FND_MESSAGE.SET_TOKEN('ITEM_NO',l_trans_rec.item_no);
1081 FND_MSG_PUB.Add;
1082 RAISE FND_API.G_EXC_ERROR;
1083 END IF;
1084 -- Check for unposted journals with different QC grade
1085 IF Check_unposted_jnl_qc_grade
1086 ( p_item_id => l_item_id
1087 , p_lot_id => l_lot_id
1088 , p_qc_grade => l_trans_rec.qc_grade
1089 )
1090 THEN
1091 FND_MESSAGE.SET_NAME('GMI','IC_API_UNPOSTED_JNL_QC_GRADE');
1092 FND_MESSAGE.SET_TOKEN('QC_GRADE',l_trans_rec.qc_grade);
1093 FND_MESSAGE.SET_TOKEN('ITEM_NO',l_trans_rec.item_no);
1094 FND_MSG_PUB.Add;
1095 RAISE FND_API.G_EXC_ERROR;
1096 END IF;
1097 END IF;
1098
1099 -- Validate Company Code
1100 IF NOT GMA_VALID_GRP.Validate_co_code(l_trans_rec.co_code)
1101 THEN
1102 FND_MESSAGE.SET_NAME('GMI','IC_API_INVALID_CO_CODE');
1103 FND_MESSAGE.SET_TOKEN('CO_CODE',l_trans_rec.co_code);
1104 FND_MSG_PUB.Add;
1105 RAISE FND_API.G_EXC_ERROR;
1106 END IF;
1107
1108 -- Validate Organisation Code belongs to Company Code
1109 IF NOT GMA_VALID_GRP.Validate_orgn_for_company ( l_trans_rec.orgn_code
1110 , l_trans_rec.co_code
1111 )
1112 THEN
1113 FND_MESSAGE.SET_NAME('GMI','IC_API_INVALID_ORGN_CODE');
1114 FND_MESSAGE.SET_TOKEN('ORGN_CODE',l_trans_rec.orgn_code);
1115 FND_MSG_PUB.Add;
1116 RAISE FND_API.G_EXC_ERROR;
1117 END IF;
1118
1119 -- Validate Transaction Date For Transactions
1120 -- That are not type 5 - GRADE CHANGE
1121 IF l_trans_rec.trans_type <> 5 THEN
1122 l_return_val := GMICCAL.trans_date_validate ( l_trans_rec.trans_date
1123 , l_trans_rec.orgn_code
1124 , l_trans_rec.from_whse_code
1125 );
1126 END IF;
1127 IF (l_return_val <> 0)
1128 THEN
1129 FND_MESSAGE.SET_NAME('GMI','IC_API_CANNOT_POST_CLOSED');
1130 FND_MESSAGE.SET_TOKEN('ITEM_NO' , l_trans_rec.item_no);
1131 FND_MESSAGE.SET_TOKEN('TRANS_DATE', l_trans_rec.trans_date);
1132 FND_MSG_PUB.Add;
1133 RAISE FND_API.G_EXC_ERROR;
1134 ELSIF TRUNC(l_trans_rec.trans_date, 'DD') >
1135 TRUNC(SYSDATE, 'DD')
1136 THEN
1137 FND_MESSAGE.SET_NAME('GMI','IC_API_CANNOT_POST_FUTURE');
1138 FND_MESSAGE.SET_TOKEN('ITEM_NO' , l_trans_rec.item_no);
1139 FND_MESSAGE.SET_TOKEN('TRANS_DATE', l_trans_rec.trans_date);
1140 FND_MSG_PUB.Add;
1141 RAISE FND_API.G_EXC_ERROR;
1142 END IF;
1143
1144 -- If no errors then move local trans_rec to output parameter
1145 x_trans_rec :=l_trans_rec;
1146
1147
1148 EXCEPTION
1149 WHEN FND_API.G_EXC_ERROR THEN
1150 x_return_status := FND_API.G_RET_STS_ERROR;
1151 FND_MSG_PUB.Count_AND_GET ( p_count => x_msg_count
1152 , p_data => x_msg_data
1153 );
1154
1155 WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
1156 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
1157 FND_MSG_PUB.Count_AND_GET ( p_count => x_msg_count
1158 , p_data => x_msg_data
1159 );
1160 WHEN OTHERS THEN
1161 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
1162 -- IF FND_MSG_PUB.check_msg_level
1163 -- (FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR)
1164 -- THEN
1165
1166 FND_MSG_PUB.Add_Exc_Msg ( G_PKG_NAME
1167 , 'Validate_Inventory_posting'
1168 );
1169 -- END IF;
1170 FND_MSG_PUB.Count_AND_GET ( p_count => x_msg_count
1171 , p_data => x_msg_data
1172 );
1173
1174 END Validate_Inventory_Posting;
1175
1176 --+=========================================================================+
1177 --| FUNCTION NAME |
1178 --| Insert_Ic_Jrnl_Mst |
1179 --| |
1180 --| TYPE |
1181 --| PRIVATE |
1182 --| |
1183 --| USAGE |
1184 --| Used to insert inventory journal header |
1185 --| |
1186 --| DESCRIPTION |
1187 --| This procedure is used to insert a row into IC_JRNL_MST |
1188 --| |
1189 --| PARAMETERS |
1190 --| p_ic_jrnl_mst_rec Record datatype containing row to be inserted |
1191 --| |
1192 --| RETURNS |
1193 --| Boolean |
1194 --| |
1195 --| HISTORY |
1196 --| 01-OCT-1998 M.Godfrey Created |
1197 --+=========================================================================+
1198 FUNCTION Insert_Ic_Jrnl_Mst
1199 ( p_ic_jrnl_mst_rec IN ic_jrnl_mst%ROWTYPE)
1200 RETURN BOOLEAN
1201 IS
1202 BEGIN
1203
1204 INSERT INTO ic_jrnl_mst
1205 ( journal_id
1206 , journal_no
1207 , journal_comment
1208 , posting_id
1209 , print_cnt
1210 , posted_ind
1211 , orgn_code
1212 , creation_date
1213 , last_update_date
1214 , created_by
1215 , last_updated_by
1216 , delete_mark
1217 , text_code
1218 , in_use
1219 )
1220 VALUES
1221 ( p_ic_jrnl_mst_rec.journal_id
1222 , p_ic_jrnl_mst_rec.journal_no
1223 , p_ic_jrnl_mst_rec.journal_comment
1224 , p_ic_jrnl_mst_rec.posting_id
1225 , p_ic_jrnl_mst_rec.print_cnt
1226 , p_ic_jrnl_mst_rec.posted_ind
1227 , p_ic_jrnl_mst_rec.orgn_code
1228 , p_ic_jrnl_mst_rec.creation_date
1229 , p_ic_jrnl_mst_rec.last_update_date
1230 , p_ic_jrnl_mst_rec.created_by
1231 , p_ic_jrnl_mst_rec.last_updated_by
1232 , p_ic_jrnl_mst_rec.delete_mark
1233 , p_ic_jrnl_mst_rec.text_code
1234 , p_ic_jrnl_mst_rec.in_use
1235 );
1236
1237 RETURN TRUE;
1238
1239 EXCEPTION
1240 WHEN OTHERS THEN
1241 -- IF FND_MSG_PUB.check_msg_level
1242 -- (FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR)
1243 -- THEN
1244
1245 FND_MSG_PUB.Add_Exc_Msg ( G_PKG_NAME
1246 , 'Insert_IC_JRNL_MST'
1247 );
1248 -- END IF;
1249 RETURN FALSE;
1250
1251 END Insert_Ic_Jrnl_Mst;
1252
1253 --+=========================================================================+
1254 --| FUNCTION NAME |
1255 --| Insert_Ic_Adjs_Jnl |
1256 --| |
1257 --| TYPE |
1258 --| PRIVATE |
1259 --| |
1260 --| USAGE |
1261 --| Used to insert inventory journal detail |
1262 --| |
1263 --| DESCRIPTION |
1264 --| This procedure is used to insert a row into IC_ADJS_JNL |
1265 --| |
1266 --| PARAMETERS |
1267 --| p_ic_adjs_jnl_rec Record datatype containing row to be inserted |
1268 --| |
1269 --| RETURNS |
1270 --| Boolean |
1271 --| |
1272 --| HISTORY |
1273 --| 01-OCT-1998 M.Godfrey Created |
1274 --+=========================================================================+
1275 FUNCTION Insert_Ic_Adjs_Jnl
1276 ( p_ic_adjs_jnl_rec IN ic_adjs_jnl%ROWTYPE)
1277 RETURN BOOLEAN
1278 IS
1279 BEGIN
1280
1281 INSERT INTO ic_adjs_jnl
1282 ( trans_type
1283 , trans_flag
1284 , doc_id
1285 , doc_line
1286 , journal_id
1287 , completed_ind
1288 , whse_code
1289 , reason_code
1290 , doc_date
1291 , item_id
1292 , item_um
1293 , item_um2
1294 , lot_id
1295 , location
1296 , qty
1297 , qty2
1298 , qc_grade
1299 , lot_status
1300 , line_type
1301 , line_id
1302 , co_code
1303 , orgn_code
1304 , no_inv
1305 , no_trans
1306 , creation_date
1307 , created_by
1308 , last_update_date
1309 , trans_cnt
1310 , last_updated_by
1311 )
1312 VALUES
1313 ( p_ic_adjs_jnl_rec.trans_type
1314 , p_ic_adjs_jnl_rec.trans_flag
1315 , p_ic_adjs_jnl_rec.doc_id
1316 , p_ic_adjs_jnl_rec.doc_line
1317 , p_ic_adjs_jnl_rec.journal_id
1318 , p_ic_adjs_jnl_rec.completed_ind
1319 , p_ic_adjs_jnl_rec.whse_code
1320 , p_ic_adjs_jnl_rec.reason_code
1321 , p_ic_adjs_jnl_rec.doc_date
1322 , p_ic_adjs_jnl_rec.item_id
1323 , p_ic_adjs_jnl_rec.item_um
1324 , p_ic_adjs_jnl_rec.item_um2
1325 , p_ic_adjs_jnl_rec.lot_id
1326 , p_ic_adjs_jnl_rec.location
1327 , p_ic_adjs_jnl_rec.qty
1328 , p_ic_adjs_jnl_rec.qty2
1329 , p_ic_adjs_jnl_rec.qc_grade
1330 , p_ic_adjs_jnl_rec.lot_status
1331 , p_ic_adjs_jnl_rec.line_type
1332 , p_ic_adjs_jnl_rec.line_id
1333 , p_ic_adjs_jnl_rec.co_code
1334 , p_ic_adjs_jnl_rec.orgn_code
1335 , p_ic_adjs_jnl_rec.no_inv
1336 , p_ic_adjs_jnl_rec.no_trans
1337 , p_ic_adjs_jnl_rec.creation_date
1338 , p_ic_adjs_jnl_rec.created_by
1339 , p_ic_adjs_jnl_rec.last_update_date
1340 , p_ic_adjs_jnl_rec.trans_cnt
1341 , p_ic_adjs_jnl_rec.last_updated_by
1342 );
1343
1344 RETURN TRUE;
1345
1346 EXCEPTION
1347 WHEN OTHERS THEN
1348 -- IF FND_MSG_PUB.check_msg_level
1349 -- (FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR)
1350 -- THEN
1351
1352 FND_MSG_PUB.Add_Exc_Msg ( G_PKG_NAME
1353 , 'Insert_IC_ADJS_JNL'
1354 );
1355 -- END IF;
1356 RETURN FALSE;
1357
1358 END Insert_Ic_Adjs_Jnl;
1359
1360 --+=========================================================================+
1361 --| FUNCTION NAME |
1362 --| Check_unposted_jnl_lot_status |
1363 --| |
1364 --| TYPE |
1365 --| PRIVATE |
1366 --| |
1367 --| USAGE |
1368 --| Used to ascertain if any unposted journals exist for item / lot / |
1369 --| sublot / whse_code / location with a different lot status |
1370 --| |
1371 --| DESCRIPTION |
1372 --| This procedure checks for unposted journals for item / lot / sublot |
1373 --| / whse_code / location with differnet lot status |
1374 --| |
1375 --| PARAMETERS |
1376 --| p_item_id Surrogate key of item |
1377 --| p_lot_id Surrogate key of lot |
1378 --| p_whse_code Warehouse code |
1379 --| p_location Location |
1380 --| p_lot_status Lot status to be checked for |
1381 --| |
1382 --| RETURNS |
1383 --| BOOLEAN |
1384 --| |
1385 --| HISTORY |
1386 --| 01-OCT-1998 M.Godfrey Created |
1387 --+=========================================================================+
1388 FUNCTION Check_unposted_jnl_lot_status
1389 ( p_item_id IN ic_item_mst.item_id%TYPE
1390 , p_lot_id IN ic_lots_mst.lot_id%TYPE
1391 , p_whse_code IN ic_whse_mst.whse_code%TYPE
1392 , p_location IN ic_loct_mst.location%TYPE
1393 , p_lot_status IN ic_lots_sts.lot_status%TYPE
1394 )
1395 RETURN BOOLEAN
1396 IS
1397
1398 CURSOR ic_journal IS
1399 SELECT
1400 count(*)
1401 FROM
1402 ic_adjs_jnl a, ic_jrnl_mst j
1403 WHERE
1404 a.item_id = p_item_id AND
1405 a.lot_id = p_lot_id AND
1406 a.whse_code = p_whse_code AND
1407 a.location = p_location AND
1408 a.journal_id = j.journal_id AND
1409 j.posted_ind = 0 AND
1410 j.delete_mark = 0 AND
1411 p_lot_status <> a.lot_status;
1412
1413 l_rows_found NUMBER;
1414
1415 BEGIN
1416
1417 OPEN ic_journal;
1418
1419 FETCH ic_journal INTO l_rows_found;
1420
1421 IF (ic_journal%NOTFOUND)
1422 THEN
1423 l_rows_found :=0;
1424 END IF;
1425
1426 CLOSE ic_journal;
1427
1428 IF l_rows_found > 0
1429 THEN
1430 RETURN TRUE;
1431 ELSE
1432 RETURN FALSE;
1433 END IF;
1434
1435 EXCEPTION
1436 WHEN OTHERS THEN
1437 RAISE;
1438
1439 END Check_unposted_jnl_lot_status;
1440
1441 --+=========================================================================+
1442 --| FUNCTION NAME |
1443 --| Check_unposted_jnl_qc_grade |
1444 --| |
1445 --| TYPE |
1446 --| PRIVATE |
1447 --| |
1448 --| USAGE |
1449 --| Used to ascertain if any unposted journals exist for item / lot / |
1450 --| sublot / whse_code / location with a different QC grade |
1451 --| |
1452 --| DESCRIPTION |
1453 --| This procedure checks for unposted journals for item / lot / sublot |
1454 --| / whse_code / location with differnet QC grade |
1455 --| |
1456 --| PARAMETERS |
1457 --| p_item_id Surrogate key of item |
1458 --| p_lot_id Surrogate key of lot |
1459 --| p_qc_grade QC grade to be checked for |
1460 --| |
1461 --| RETURNS |
1462 --| BOOLEAN |
1463 --| |
1464 --| HISTORY |
1465 --| 01-OCT-1998 M.Godfrey Created |
1466 --+=========================================================================+
1467 FUNCTION Check_unposted_jnl_qc_grade
1468 ( p_item_id IN ic_item_mst.item_id%TYPE
1469 , p_lot_id IN ic_lots_mst.lot_id%TYPE
1470 , p_qc_grade IN qc_grad_mst.qc_grade%TYPE
1471 )
1472 RETURN BOOLEAN
1473 IS
1474
1475 CURSOR ic_journal IS
1476 SELECT
1477 count(*)
1478 FROM
1479 ic_adjs_jnl a, ic_jrnl_mst j
1480 WHERE
1481 a.item_id = p_item_id AND
1482 a.lot_id = p_lot_id AND
1483 a.journal_id = j.journal_id AND
1484 j.posted_ind = 0 AND
1485 j.delete_mark = 0 AND
1486 p_qc_grade <> a.qc_grade;
1487
1488 l_rows_found NUMBER;
1489
1490 BEGIN
1491
1492 OPEN ic_journal;
1493
1494 FETCH ic_journal INTO l_rows_found;
1495
1496 IF (ic_journal%NOTFOUND)
1497 THEN
1498 l_rows_found :=0;
1499 END IF;
1500
1501 CLOSE ic_journal;
1502
1503 IF l_rows_found > 0
1504 THEN
1505 RETURN TRUE;
1506 ELSE
1507 RETURN FALSE;
1508 END IF;
1509
1510 EXCEPTION
1511 WHEN OTHERS THEN
1512 RAISE;
1513
1514 END Check_unposted_jnl_qc_grade;
1515
1516 END GMI_QUANTITY_PVT;