1 PACKAGE BODY GMD_FORMULA_DETAIL_PUB AS
2 /* $Header: GMDPFMDB.pls 120.8.12010000.4 2008/10/16 13:14:09 kannavar ship $ */
3
4 G_PKG_NAME CONSTANT VARCHAR2(30) := 'GMD_FORMULA_DETAIL_PUB' ;
5 pRecord_in GMDFMVAL_PUB.formula_info_in;
6 pTable_out GMDFMVAL_PUB.formula_table_out;
7 lreturn VARCHAR2(1);
8
9 --Bug 3222090, NSRIVAST 20-FEB-2004, BEGIN
10 --Forward declaration.
11 FUNCTION set_debug_flag RETURN VARCHAR2;
12 l_debug VARCHAR2(1) := set_debug_flag;
13
14 FUNCTION set_debug_flag RETURN VARCHAR2 IS
15 l_debug VARCHAR2(1):= 'N';
16 BEGIN
17 IF( FND_LOG.LEVEL_PROCEDURE >= FND_LOG.G_CURRENT_RUNTIME_LEVEL ) THEN
18 l_debug := 'Y';
19 END IF;
20 RETURN l_debug;
21 END set_debug_flag;
22 --Bug 3222090, NSRIVAST 20-FEB-2004, END
23
24 FUNCTION get_fm_status_meaning(vFormula_id NUMBER) RETURN VARCHAR2 IS
25 CURSOR get_status_meaning(P_Status_code VARCHAR2) IS
26 SELECT meaning
27 FROM gmd_status
28 WHERE status_code = P_status_code;
29
30 l_status_meaning GMD_STATUS.meaning%TYPE;
31
32 BEGIN
33 FOR C_status_code IN (Select formula_status from fm_form_mst_b
34 where formula_id = vFormula_id) LOOP
35 OPEN get_status_meaning(C_status_code.formula_status);
36 FETCH get_status_meaning INTO l_status_meaning;
37 CLOSE get_status_meaning;
38
39 END LOOP;
40
41 RETURN l_status_meaning;
42
43 END get_fm_status_meaning;
44
45 /* ======================================================================== */
46 /* Procedure: */
47 /* Insert_FormulaDetail */
48 /* */
49 /* DESCRIPTION: */
50 /* This PL/SQL procedure is responsible for */
51 /* inserting a formula detail. */
52 /* HISTORY: */
53 /* 10-Apr-2003 P.Raghu Bug#2893682 Modified the code such that */
54 /* p_formula_detail_rec.item_no is correctly set to */
55 /* ITEM_NO TOKEN. Uncommented the assigment statement*/
56 /* of GMDFMVAL_PUB.p_called_from_forms package */
57 /* variable in Insert_FormulaDetail procedure. */
58 /* 18-Apr-2003 J. Baird Bug #2908311 Uncommented initialization of */
59 /* x_return_status */
60 /* 18-Apr-2003 J. Baird Bug #2906124 Was not setting the TO_UOM token. */
61 /* ======================================================================== */
62 PROCEDURE Insert_FormulaDetail
63 ( p_api_version IN NUMBER
64 ,p_init_msg_list IN VARCHAR2
65 ,p_commit IN VARCHAR2
66 ,p_called_from_forms IN VARCHAR2 := 'NO'
67 ,x_return_status OUT NOCOPY VARCHAR2
68 ,x_msg_count OUT NOCOPY NUMBER
69 ,x_msg_data OUT NOCOPY VARCHAR2
70 ,p_formula_detail_tbl IN formula_insert_dtl_tbl_type
71 )
72 IS
73 /* Local Variables definitions */
74 l_api_name CONSTANT VARCHAR2(30) := 'INSERT_FORMULADETAIL';
75 l_api_version CONSTANT NUMBER := 1.0;
76 l_user_id fnd_user.user_id%TYPE := 0;
77 l_return_val NUMBER := 0;
78 l_item_id mtl_system_items.inventory_item_id%TYPE := 0;
79 l_inv_uom mtl_system_items.primary_uom_code%TYPE := NULL;
80 l_formula_id fm_matl_dtl.formula_id%TYPE := 0;
81 l_surrogate fm_matl_dtl.formulaline_id%TYPE := 0;
82
83 /* Record type definition */
84 l_fm_matl_dtl_rec fm_matl_dtl%ROWTYPE;
85 p_formula_detail_rec GMD_FORMULA_COMMON_PUB.formula_insert_rec_type;
86 X_formula_detail_rec GMD_FORMULA_COMMON_PUB.formula_insert_rec_type;
87
88 CURSOR C_get_orgid (V_formula_id NUMBER) IS
89 SELECT owner_organization_id
90 FROM fm_form_mst_b
91 WHERE formula_id = V_formula_id;
92 l_org_id NUMBER;
93
94 -- Kapil ME Auto-Prod :Bug#5716318
95 l_auto_calc VARCHAR2(1);
96 l_formula_calc_flag VARCHAR2(1);
97
98 CURSOR C_get_auto_parameter (V_formula_id NUMBER) IS
99 SELECT AUTO_PRODUCT_CALC
100 FROM FM_FORM_MST_B
101 WHERE FORMULA_ID = V_formula_id;
102
103 v_item_no varchar2(30); -- Added in Bug No.6799624
104 v_recipe_enabled varchar2(1); -- Added in Bug No.6799624
105
106 new_line_no Number(5) ; /* Added in Bug No.7328802 */
107
108 BEGIN
109 /* Define Savepoint */
110 SAVEPOINT Insert_FormulaDetail;
111
112 /* Standard Check for API compatibility */
113 IF NOT FND_API.Compatible_API_Call(l_api_version
114 ,p_api_version
115 ,l_api_name
116 ,G_PKG_NAME )
117 THEN
118 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
119 END IF;
120
121 /* Initialize message list if p_init_msg_list is set to TRUE */
122 IF FND_API.to_Boolean( p_init_msg_list ) THEN
123 FND_MSG_PUB.initialize;
124 END IF;
125
126 --Set the formula validation pkg variable GMDFMVAL_PUB
127 --variable p_called_from_form same as that passed in.
128 --When API is called from forms the parameter p_called_from_forms is set
129 --to 'YES' and the same parameter is set to 'YES' within the validation pkg.
130 --When API is not called from forms the parameter is 'NO'.
131
132 --BEGIN BUG#2893682 P.Raghu
133 --Uncommenting the following statement such that the actual value
134 --is passed to the GMDFMVAL_PUB API.
135 GMDFMVAL_PUB.p_called_from_forms := p_called_from_forms;
136 --END BUG#2893682
137
138 /* API body */
139 /* 1. Does validation when not called from forms because from forms all
140 field level validation is already done */
141 /* 2. Call the private API that does the database inserts/ updates */
142 IF (p_formula_detail_tbl.count = 0) THEN
143 RAISE FND_API.G_EXC_ERROR;
144 END IF;
145
146 /* Start looping through the table */
147 FOR i in 1 .. p_formula_detail_tbl.count LOOP
148
149 /* Initialize API return status to success for every line */
150 x_return_status := FND_API.G_RET_STS_SUCCESS;
151
152 IF (l_debug = 'Y') THEN
153 gmd_debug.put_line(' ');
154 gmd_debug.put_line(' ');
155 END IF;
156
157 IF (l_debug = 'Y') THEN
158 gmd_debug.put_line(' In Formula Detail Pub - Entering loop with row # '||i);
159 END IF;
160
161 p_formula_detail_rec := p_formula_detail_tbl(i);
162
163 /* New record to get different entity values */
164 pRecord_in.formula_no := p_formula_detail_rec.formula_no;
165 pRecord_in.formula_vers := p_formula_detail_rec.formula_vers;
166 pRecord_in.formula_id := p_formula_detail_rec.formula_id;
167 -- Bug 4603060 pRecord_in.user_name := p_formula_detail_rec.user_name;
168
169 /* Procedure get_element based on the element_name return all
170 information about it. For e.g. if element_name is formula
171 and if we input the formula_id in pRecord_in it returns the
172 formula_no and vers information and visa versa too */
173 /* ================================ */
174 /* Get the formula id if it is NULL */
175 /* ================================ */
176 IF (l_debug = 'Y') THEN
177 gmd_debug.put_line(' In Formula Detail Pub - Before formula id val '
178 ||x_return_status);
179 END IF;
180
181 IF (p_formula_detail_rec.formula_id is NULL) THEN
182 GMDFMVAL_PUB.get_element(pElement_name => 'FORMULA',
183 pRecord_in => pRecord_in,
184 xTable_out => pTable_out,
185 xReturn => x_return_status);
186 IF (x_return_status <> 'S') THEN
187 IF (p_formula_detail_rec.formula_no IS NULL) THEN
188 FND_MESSAGE.SET_NAME('GMD', 'FM_MISSING_FORMULA_NO');
189 FND_MSG_PUB.Add;
190 ELSIF (p_formula_detail_rec.formula_vers IS NULL) THEN
191 FND_MESSAGE.SET_NAME('GMD', 'FM_MISSING_FORMULA_VERS');
192 FND_MSG_PUB.Add;
193 ELSE
194 FND_MESSAGE.SET_NAME('GMD', 'FM_INVFORMULANO');
195 FND_MESSAGE.SET_TOKEN('FORMULA_NO',p_formula_detail_rec.formula_no);
196 FND_MSG_PUB.Add;
197 END IF;
198 RAISE FND_API.G_EXC_ERROR;
199 ELSE
200 l_formula_id := pTable_out(1).formula_id;
201 END IF; /* end condition for x_ret)status <> 'S' */
202 ELSE
203 l_formula_id := p_formula_detail_rec.formula_id;
204 END IF;
205
206 OPEN C_get_orgid (l_formula_id);
207 FETCH C_get_orgid INTO l_org_id;
208 CLOSE C_get_orgid;
209
210 p_formula_detail_rec.owner_organization_id := l_org_id;
211
212 IF (p_formula_detail_rec.inventory_item_id is NULL AND p_formula_detail_rec.item_no IS NULL) THEN
213 FND_MESSAGE.SET_NAME('GMI', 'GMI_API_ITEM_NOT_FOUND');
214 FND_MSG_PUB.Add;
215 ELSE
216 GMDFMVAL_PUB.get_item_id(pitem_no => p_formula_detail_rec.item_no,
217 pinventory_item_id => p_formula_detail_rec.inventory_item_id,
218 porganization_id => l_org_id,
219 xitem_id => l_item_id,
220 xitem_um => l_inv_uom,
221 xreturn_code => l_return_val);
222 IF (l_return_val < 0) THEN
223 FND_MESSAGE.SET_NAME('GMI','IC_API_INVALID_ITEM_NO');
224 FND_MESSAGE.SET_TOKEN('ITEM_NO',p_formula_detail_rec.item_no);
225 FND_MSG_PUB.Add;
226 RAISE FND_API.G_EXC_ERROR;
227 END IF;
228 END IF;
229 p_formula_detail_rec.inventory_item_id := l_item_id;
230
231 /* Bug No.6799624 - Start */
232
233 BEGIN
234 SELECT segment1,recipe_enabled_flag INTO v_item_no, v_recipe_enabled
235 FROM mtl_system_items_b
236 WHERE inventory_item_id = p_formula_detail_rec.inventory_item_id AND
237 organization_id = p_formula_detail_rec.owner_organization_id;
238 EXCEPTION
239 WHEN others THEN
240 ROLLBACK to Insert_FormulaDetail;
241 x_return_status := FND_API.G_RET_STS_ERROR;
242 FND_MSG_PUB.Count_And_Get (
243 p_count => x_msg_count,
244 p_data => x_msg_data );
245 END;
246
247 IF v_recipe_enabled <> 'Y' THEN
248 FND_MESSAGE.SET_NAME('GMD', 'GMD_ITEM_NOT_RECIPE_ENABLED');
249 FND_MESSAGE.SET_TOKEN('ITEM_NO', v_item_no);
250 FND_MSG_PUB.Add;
251 RAISE FND_API.G_EXC_ERROR;
252 END IF ;
253
254 /* Bug No. 6799624 - End */
255
256 IF (l_debug = 'Y') THEN
257 gmd_debug.put_line(' In Formula Detail Pub - Before User_id val');
258 END IF;
259 -- Bug 4603060 Use the user from context
260 l_user_id := FND_GLOBAL.user_id;
261 IF (l_user_id IS NULL) THEN
262 FND_MESSAGE.SET_NAME('GMD', 'GMD_USER_CONTEXT_NOT_SET');
263 FND_MSG_PUB.Add;
264 RAISE FND_API.G_EXC_ERROR;
265 END IF;
266
267 /* ======================================= */
268 /* Check if the same line no and type */
269 /* for that formula does no already exists */
270 /* ======================================= */
271 IF (l_debug = 'Y') THEN
272 gmd_debug.put_line(' In Formula Detail Pub - Before detail lines val '
273 ||x_return_status);
274 END IF;
275
276
277 /* Bug No.7328802 - Start */
278
279 IF NVL(p_called_from_forms,'NO') <> 'YES' THEN
280
281 SELECT nvl(max(line_no),0)+1 INTO new_line_no FROM fm_matl_dtl
282 WHERE formula_id = l_formula_id AND
283 line_type = p_formula_detail_rec.line_type;
284
285 p_formula_detail_rec.line_no := new_line_no;
286
287 END IF;
288
289 /* Bug No.7328802 - End */
290
291 l_return_val := GMDFMVAL_PUB.detail_line_val
292 (l_formula_id,
293 p_formula_detail_rec.line_no,
294 p_formula_detail_rec.line_type);
295 IF (l_return_val <> 0) THEN
296 FND_MESSAGE.SET_NAME('GMD','FM_DUPLICATE_LINE_NO');
297 FND_MESSAGE.SET_TOKEN('ITEM_NO', p_formula_detail_rec.item_no);
298 FND_MESSAGE.SET_TOKEN('FORMULA_NO', p_formula_detail_rec.formula_no);
299 FND_MESSAGE.SET_TOKEN('FORMULA_VERS',p_formula_detail_rec.formula_vers );
300 FND_MSG_PUB.Add;
301 RAISE FND_API.G_EXC_ERROR;
302 END IF;
303
304 /* Get the item_id which is based on the item no */
305 IF (l_debug = 'Y') THEN
306 gmd_debug.put_line(' In Formula Detail Pub - Before item id val '
307 ||x_return_status);
308 END IF;
309
310 /* Get the formula line id which is a surrogate key */
311 IF (l_debug = 'Y') THEN
312 gmd_debug.put_line(' In Formula Detail Pub - Get the surrogate key '
313 ||' fmline id = '
314 ||p_formula_detail_rec.formulaline_id
315 ||' - '
316 ||x_return_status);
317 END IF;
318 IF (p_formula_detail_rec.formulaline_id IS NULL) THEN
319 l_surrogate := GMDSURG.get_surrogate('formulaline_id');
320 /* Call for private API */
321 IF (l_surrogate < 1) THEN
322 FND_MESSAGE.SET_NAME('GMD','FM_INVALID_FMLINE_ID');
323 FND_MSG_PUB.Add;
324 RAISE FND_API.G_EXC_ERROR;
325 END IF;
326 ELSE
327 l_surrogate := p_formula_detail_rec.formulaline_id;
328 END IF;
329
330 /* Beyond this all validations are made ONLY WHEN THIS API IS
331 NOT CALLED BY FORMS */
332 /* When coming from forms all these validations are already
333 done, so we can skip the validations below. */
334
335
336 IF (NVL(p_called_from_forms,'NO') = 'NO') THEN
337 GMDFMVAL_PUB.validate_insert_record (P_formula_dtl => P_formula_detail_rec,
338 X_formula_dtl => X_formula_detail_rec,
339 xReturn => X_return_status);
340 ELSE
341 X_formula_detail_rec := P_formula_detail_rec;
342 END IF;
343
344 -- Kapil ME Auto-Prod :Bug#5716318
345 /* Get the Organization Parameter and the Parameter set at the Formula level */
346 GMD_API_GRP.FETCH_PARM_VALUES(P_orgn_id => l_org_id,
347 P_parm_name => 'GMD_AUTO_PROD_CALC',
348 P_parm_value => l_auto_calc,
349 X_return_status => X_return_status );
350
351 OPEN C_get_auto_parameter (l_formula_id);
352 FETCH C_get_auto_parameter INTO l_formula_calc_flag ;
353 CLOSE C_get_auto_parameter;
354
355 IF l_auto_calc = 'Y' THEN
356 IF l_formula_calc_flag = 'Y' AND p_formula_detail_rec.line_type = 1
357 AND p_formula_detail_rec.scale_type_dtl =1 AND p_formula_detail_rec.prod_percent IS NULL THEN
358 /* Error to be raised for Proportional Products when Percentages are not passed */
359 FND_MESSAGE.SET_NAME('GMD', 'GMD_ENTER_PERCENTAGE_YES');
360 FND_MSG_PUB.Add;
361 RAISE FND_API.G_EXC_ERROR;
362 ELSIF l_formula_calc_flag = 'Y' AND (p_formula_detail_rec.prod_percent IS NOT NULL )
363 AND ( p_formula_detail_rec.line_type IN (-1,2) OR
364 ( p_formula_detail_rec.line_type = 1 AND p_formula_detail_rec.scale_type_dtl = 0 ) ) THEN
365 /* Error to be raised when Percentages are passed for Ingredients/By-Products or Fixed
366 Products */
367 FND_MESSAGE.SET_NAME('GMD', 'GMD_ENTER_PERCENTAGE_CANNOT');
368 FND_MSG_PUB.Add;
369 RAISE FND_API.G_EXC_ERROR;
370 END IF;
371 END IF;
372
373 IF ( ( l_auto_calc IS NULL OR l_auto_calc = 'N') OR (l_formula_calc_flag IS NULL OR l_formula_calc_flag = 'N' ))
374 AND p_formula_detail_rec.prod_percent IS NOT NULL THEN
375 /* Error to be raised when Percentages are passed when Parameter is not Set tp
376 Calculate Product qty */
377 FND_MESSAGE.SET_NAME('GMD', 'GMD_ENTER_PERCENTAGE_NO');
378 FND_MSG_PUB.Add;
379 RAISE FND_API.G_EXC_ERROR;
380 END IF;
381 -- Kapil ME Auto-Prod :Bug#5716318
382
383 /* Assigning values to formula detail rec and passing to the private API */
384 IF (x_return_status = FND_API.G_RET_STS_SUCCESS) THEN
385 l_fm_matl_dtl_rec.formulaline_id := l_surrogate;
386 l_fm_matl_dtl_rec.formula_id := l_formula_id;
387 l_fm_matl_dtl_rec.line_type := p_formula_detail_rec.line_type;
388 l_fm_matl_dtl_rec.line_no := p_formula_detail_rec.line_no;
389 l_fm_matl_dtl_rec.inventory_item_id := p_formula_detail_rec.inventory_item_id;
390 l_fm_matl_dtl_rec.organization_id := p_formula_detail_rec.owner_organization_id;
391 l_fm_matl_dtl_rec.revision := X_formula_detail_rec.revision;
392 l_fm_matl_dtl_rec.qty := p_formula_detail_rec.qty;
393 l_fm_matl_dtl_rec.detail_uom := X_formula_detail_rec.detail_uom;
394 l_fm_matl_dtl_rec.release_type := X_formula_detail_rec.release_type;
395 l_fm_matl_dtl_rec.scrap_factor := p_formula_detail_rec.scrap_factor;
396 l_fm_matl_dtl_rec.scale_type := p_formula_detail_rec.scale_type_dtl;
397 l_fm_matl_dtl_rec.cost_alloc := X_formula_detail_rec.cost_alloc;
398 l_fm_matl_dtl_rec.phantom_type := p_formula_detail_rec.phantom_type;
399 l_fm_matl_dtl_rec.buffer_ind := p_formula_detail_rec.buffer_ind;
400 l_fm_matl_dtl_rec.rework_type := 0;
401 l_fm_matl_dtl_rec.tpformula_id := p_formula_detail_rec.tpformula_id;
402 l_fm_matl_dtl_rec.iaformula_id := p_formula_detail_rec.iaformula_id;
403 l_fm_matl_dtl_rec.scale_multiple := p_formula_detail_rec.scale_multiple;
404 l_fm_matl_dtl_rec.contribute_yield_ind := p_formula_detail_rec.contribute_yield_ind;
405 l_fm_matl_dtl_rec.scale_uom := p_formula_detail_rec.scale_uom;
406 l_fm_matl_dtl_rec.contribute_step_qty_ind := p_formula_detail_rec.contribute_step_qty_ind;
407 l_fm_matl_dtl_rec.scale_rounding_variance := p_formula_detail_rec.scale_rounding_variance;
408 l_fm_matl_dtl_rec.rounding_direction := p_formula_detail_rec.rounding_direction;
409 /*Bug 2509076 - Thomas Daniel QM Integration new field */
410 l_fm_matl_dtl_rec.by_product_type := X_formula_detail_rec.by_product_type;
411 l_fm_matl_dtl_rec.ingredient_end_date := p_formula_detail_rec.ingredient_end_date; --Bug 4479101
412 l_fm_matl_dtl_rec.text_code := p_formula_detail_rec.text_code_dtl;
413 l_fm_matl_dtl_rec.created_by := l_user_id; -- Bug 4603060
414 l_fm_matl_dtl_rec.creation_date := NVL(p_formula_detail_rec.creation_date, SYSDATE);
415 l_fm_matl_dtl_rec.last_update_date := NVL(p_formula_detail_rec.last_update_date, SYSDATE);
416 l_fm_matl_dtl_rec.last_update_login := NVL(p_formula_detail_rec.last_update_login, l_user_id);-- Bug No.6672176 l_user_id; -- Bug 4603060
417 l_fm_matl_dtl_rec.last_updated_by := l_user_id; -- Bug 4603060
418 /*Bug 3837470 - Thomas Daniel */
419 /*Changed the following assignment from attribute_category to dtl_attribute_category*/
420 l_fm_matl_dtl_rec.attribute_category := p_formula_detail_rec.dtl_attribute_category;
421 l_fm_matl_dtl_rec.attribute1 := p_formula_detail_rec.dtl_attribute1;
422 l_fm_matl_dtl_rec.attribute2 := p_formula_detail_rec.dtl_attribute2;
423 l_fm_matl_dtl_rec.attribute3 := p_formula_detail_rec.dtl_attribute3;
424 l_fm_matl_dtl_rec.attribute4 := p_formula_detail_rec.dtl_attribute4;
425 l_fm_matl_dtl_rec.attribute5 := p_formula_detail_rec.dtl_attribute5;
426 l_fm_matl_dtl_rec.attribute6 := p_formula_detail_rec.dtl_attribute6;
427 l_fm_matl_dtl_rec.attribute7 := p_formula_detail_rec.dtl_attribute7;
428 l_fm_matl_dtl_rec.attribute8 := p_formula_detail_rec.dtl_attribute8;
429 l_fm_matl_dtl_rec.attribute9 := p_formula_detail_rec.dtl_attribute9;
430 l_fm_matl_dtl_rec.attribute10 := p_formula_detail_rec.dtl_attribute10;
431 l_fm_matl_dtl_rec.attribute11 := p_formula_detail_rec.dtl_attribute11;
432 l_fm_matl_dtl_rec.attribute12 := p_formula_detail_rec.dtl_attribute12;
433 l_fm_matl_dtl_rec.attribute13 := p_formula_detail_rec.dtl_attribute13;
434 l_fm_matl_dtl_rec.attribute14 := p_formula_detail_rec.dtl_attribute14;
435 l_fm_matl_dtl_rec.attribute15 := p_formula_detail_rec.dtl_attribute15;
436 l_fm_matl_dtl_rec.attribute16 := p_formula_detail_rec.dtl_attribute16;
437 l_fm_matl_dtl_rec.attribute17 := p_formula_detail_rec.dtl_attribute17;
438 l_fm_matl_dtl_rec.attribute18 := p_formula_detail_rec.dtl_attribute18;
439 l_fm_matl_dtl_rec.attribute19 := p_formula_detail_rec.dtl_attribute19;
440 l_fm_matl_dtl_rec.attribute20 := p_formula_detail_rec.dtl_attribute20;
441 l_fm_matl_dtl_rec.attribute21 := p_formula_detail_rec.dtl_attribute21;
442 l_fm_matl_dtl_rec.attribute22 := p_formula_detail_rec.dtl_attribute22;
443 l_fm_matl_dtl_rec.attribute23 := p_formula_detail_rec.dtl_attribute23;
444 l_fm_matl_dtl_rec.attribute24 := p_formula_detail_rec.dtl_attribute24;
445 l_fm_matl_dtl_rec.attribute25 := p_formula_detail_rec.dtl_attribute25;
446 l_fm_matl_dtl_rec.attribute26 := p_formula_detail_rec.dtl_attribute26;
447 l_fm_matl_dtl_rec.attribute27 := p_formula_detail_rec.dtl_attribute27;
448 l_fm_matl_dtl_rec.attribute28 := p_formula_detail_rec.dtl_attribute28;
449 l_fm_matl_dtl_rec.attribute29 := p_formula_detail_rec.dtl_attribute29;
450 l_fm_matl_dtl_rec.attribute30 := p_formula_detail_rec.dtl_attribute30;
451 -- Kapil ME Auto-Prod :Bug#5716318
452 l_fm_matl_dtl_rec.prod_percent := p_formula_detail_rec.prod_percent;
453 /* Call the private API */
454 IF (l_debug = 'Y') THEN
455 gmd_debug.put_line(' In Formula Detail Pub - '
456 ||' About to call the line Pvt API '
457 ||' - '
458 ||x_return_status);
459 END IF;
460 GMD_FORMULA_DETAIL_PVT.Insert_FormulaDetail
461 ( p_api_version => p_api_version
462 ,p_init_msg_list => p_init_msg_list
463 ,p_commit => FND_API.G_FALSE
464 ,x_return_status => x_return_status
465 ,x_msg_count => x_msg_count
466 ,x_msg_data => x_msg_data
467 ,p_formula_detail_rec => l_fm_matl_dtl_rec
468 );
469
470 IF (l_debug = 'Y') THEN
471 gmd_debug.put_line(' In Formula Detail Pub - '
472 ||' After calling the line Pvt API '
473 ||' - '
474 ||x_return_status);
475 END IF;
476
477 END IF; -- if x_return_status = 'S'
478
479 -- Kapil ME Auto-Prod :Bug#5716318
480 /* Product Qty Calculation after Inserting a Record */
481 IF l_formula_calc_flag = 'Y' THEN
482 GMD_COMMON_VAL.Calculate_Total_Product_Qty( p_formula_id =>l_formula_id ,
483 x_return_status => x_return_status,
484 x_msg_count => x_msg_count,
485 x_msg_data => x_msg_data);
486 END IF;
487
488 /* IF creation of a line fails - Raise an exception
489 rather than trying to insert other lines */
490 IF (x_return_status = FND_API.G_RET_STS_ERROR) THEN
491 RAISE FND_API.G_EXC_ERROR;
492 ELSIF (x_return_status = FND_API.G_RET_STS_UNEXP_ERROR) THEN
493 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
494 END IF;
495
496 END LOOP; -- for number of lines to be inserted
497
498 /* End of API body */
499
500 IF x_return_status IN (FND_API.G_RET_STS_SUCCESS,'Q') AND
501 (FND_API.To_Boolean(p_commit)) THEN
502 /* Check if p_commit is set to TRUE */
503 Commit;
504 END IF;
505
506 /* Get the message count and information */
507 FND_MSG_PUB.Count_And_Get (
508 p_count => x_msg_count,
509 p_data => x_msg_data );
510
511 EXCEPTION
512 WHEN FND_API.G_EXC_ERROR THEN
513 ROLLBACK to Insert_FormulaDetail;
514 x_return_status := FND_API.G_RET_STS_ERROR;
515 FND_MSG_PUB.Count_And_Get (
516 p_count => x_msg_count,
517 p_data => x_msg_data );
518 IF (l_debug = 'Y') THEN
519 gmd_debug.put_line(' In Formula Detail Pub - In Error Exception Section '
520 ||' - '
521 ||x_return_status);
522 END IF;
523
524 WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
525 ROLLBACK to Insert_FormulaDetail;
526 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
527 FND_MSG_PUB.Count_And_Get (
528 p_count => x_msg_count,
529 p_data => x_msg_data );
530 IF (l_debug = 'Y') THEN
531 gmd_debug.put_line(' In Formula Detail Pub - In Unexpected Exception Section '
532 ||' - '
533 ||x_return_status);
534 END IF;
535
536 WHEN OTHERS THEN
537 ROLLBACK to Insert_FormulaDetail;
538 fnd_msg_pub.add_exc_msg (G_PKG_NAME, l_api_name);
539 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
540 FND_MSG_PUB.Count_And_Get (
541 p_count => x_msg_count,
542 p_data => x_msg_data );
543 IF (l_debug = 'Y') THEN
544 gmd_debug.put_line(' In Formula Detail Pub - In OTHERS Exception Section '
545 ||' - '
546 ||x_return_status);
547 END IF;
548
549 END Insert_FormulaDetail;
550
551
552 /* ======================================================================== */
553 /* Procedure: */
554 /* Update_FormulaDetail */
555 /* */
556 /* DESCRIPTION: */
557 /* This PL/SQL procedure is responsible for updating a formula. */
558 /* details. */
559 /* HISTORY: */
560 /* 10-Apr-2003 P.Raghu Bug#2893682 Modified the code such that */
561 /* p_formula_detail_rec.item_no is correctly set */
562 /* to ITEM_NO TOKEN. */
563 /* 07-MAR-2006 Kapil M Bug#4603056 Added the check for update of revision*/
564 /* of non-revision controlled item */
565 /* ======================================================================== */
566 PROCEDURE Update_FormulaDetail
567 ( p_api_version IN NUMBER
568 ,p_init_msg_list IN VARCHAR2
569 ,p_commit IN VARCHAR2
570 ,p_called_from_forms IN VARCHAR2 := 'NO'
571 ,x_return_status OUT NOCOPY VARCHAR2
572 ,x_msg_count OUT NOCOPY NUMBER
573 ,x_msg_data OUT NOCOPY VARCHAR2
574 ,p_formula_detail_tbl IN formula_update_dtl_tbl_type
575 )
576 IS
577 /* Local Variables definitions */
578 l_api_name CONSTANT VARCHAR2(30) := 'UPDATE_FORMULADETAIL';
579 l_api_version CONSTANT NUMBER := 2.0;
580 l_user_id fnd_user.user_id%TYPE := 0;
581 l_return_val NUMBER := 0;
582 l_item_id mtl_system_items.inventory_item_id%TYPE := 0;
583 l_inv_uom mtl_system_items.primary_uom_code%TYPE := NULL;
584 l_formula_id fm_matl_dtl.formula_id%TYPE := 0;
585 l_fm_matl_dtl_rec fm_matl_dtl%ROWTYPE;
586 p_formula_detail_rec GMD_FORMULA_COMMON_PUB.formula_update_rec_type;
587 X_formula_detail_rec GMD_FORMULA_COMMON_PUB.formula_update_rec_type;
588
589 l_by_product_type fm_matl_dtl.by_product_type%TYPE;
590
591 l_cost_alloc fm_matl_dtl.cost_alloc%TYPE;
592 l_text_code fm_matl_dtl.text_code%TYPE;
593 l_tpformula_id fm_matl_dtl.tpformula_id%TYPE;
594 l_iaformula_id fm_matl_dtl.iaformula_id%TYPE;
595 l_scale_multiple fm_matl_dtl.scale_multiple%TYPE;
596 l_contribute_yield_ind fm_matl_dtl.contribute_yield_ind%TYPE;
597 l_scale_uom fm_matl_dtl.scale_uom%TYPE;
598 l_contribute_step_qty_ind fm_matl_dtl.contribute_step_qty_ind%TYPE;
599 l_scale_rounding_variance fm_matl_dtl.scale_rounding_variance%TYPE;
600 l_rounding_direction fm_matl_dtl.rounding_direction%TYPE;
601 l_ingredient_end_date fm_matl_dtl.ingredient_end_date%TYPE; --bug 4479101
602 l_attribute_category fm_matl_dtl.attribute_category%TYPE;
603
604 l_attribute1 fm_matl_dtl.attribute1%TYPE;
605 l_attribute2 fm_matl_dtl.attribute2%TYPE;
606 l_attribute3 fm_matl_dtl.attribute3%TYPE;
607 l_attribute4 fm_matl_dtl.attribute4%TYPE;
608 l_attribute5 fm_matl_dtl.attribute5%TYPE;
609 l_attribute6 fm_matl_dtl.attribute6%TYPE;
610 l_attribute7 fm_matl_dtl.attribute7%TYPE;
611 l_attribute8 fm_matl_dtl.attribute8%TYPE;
612 l_attribute9 fm_matl_dtl.attribute9%TYPE;
613 l_attribute10 fm_matl_dtl.attribute10%TYPE;
614 l_attribute11 fm_matl_dtl.attribute11%TYPE;
615 l_attribute12 fm_matl_dtl.attribute12%TYPE;
616 l_attribute13 fm_matl_dtl.attribute13%TYPE;
617 l_attribute14 fm_matl_dtl.attribute14%TYPE;
618 l_attribute15 fm_matl_dtl.attribute15%TYPE;
619 l_attribute16 fm_matl_dtl.attribute16%TYPE;
620 l_attribute17 fm_matl_dtl.attribute17%TYPE;
621 l_attribute18 fm_matl_dtl.attribute18%TYPE;
622 l_attribute19 fm_matl_dtl.attribute19%TYPE;
623 l_attribute20 fm_matl_dtl.attribute20%TYPE;
624 l_attribute21 fm_matl_dtl.attribute21%TYPE;
625 l_attribute22 fm_matl_dtl.attribute22%TYPE;
626 l_attribute23 fm_matl_dtl.attribute23%TYPE;
627 l_attribute24 fm_matl_dtl.attribute24%TYPE;
628 l_attribute25 fm_matl_dtl.attribute25%TYPE;
629 l_attribute26 fm_matl_dtl.attribute26%TYPE;
630 l_attribute27 fm_matl_dtl.attribute27%TYPE;
631 l_attribute28 fm_matl_dtl.attribute28%TYPE;
632 l_attribute29 fm_matl_dtl.attribute29%TYPE;
633 l_attribute30 fm_matl_dtl.attribute30%TYPE;
634
635 fm_matl_dtl_rec fm_matl_dtl%ROWTYPE;
636
637 l_to_uom varchar2(4);
638
639 /* Define cursor */
640 CURSOR get_detail_rec(vFormulaline_id NUMBER) IS
641 SELECT * from fm_matl_dtl
642 WHERE formulaline_id = vFormulaline_id;
643
644 CURSOR C_get_orgid (V_formula_id NUMBER) IS
645 SELECT owner_organization_id
646 FROM fm_form_mst_b
647 WHERE formula_id = V_formula_id;
648 l_org_id NUMBER;
649
650 CURSOR C_get_item_id (V_formulaline_id NUMBER) IS
651 SELECT inventory_item_id
652 FROM fm_matl_dtl
653 WHERE formulaline_id = V_formulaline_id;
654
655 CURSOR C_get_item_no (V_item_id NUMBER) IS
656 SELECT concatenated_segments
657 FROM mtl_system_items_kfv
658 WHERE inventory_item_id = V_item_id;
659 l_item_no VARCHAR2(2000);
660
661 -- Kapil ME Auto-Prod :Bug#5716318
662 l_auto_calc VARCHAR2(1);
663 l_formula_calc_flag VARCHAR2(1);
664
665 CURSOR C_get_auto_parameter (V_formula_id NUMBER) IS
666 SELECT AUTO_PRODUCT_CALC
667 FROM FM_FORM_MST_B
668 WHERE FORMULA_ID = V_formula_id;
669
670 BEGIN
671 /* Define Savepoint */
672 SAVEPOINT Update_FormulaDetail;
673
674 /* Standard Check for API compatibility */
675 IF NOT FND_API.Compatible_API_Call ( l_api_version
676 ,p_api_version
677 ,l_api_name
678 ,G_PKG_NAME )
679 THEN
680 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
681 END IF;
682
683 /* Set the formula validation pkg variable GMDFMVAL_PUB */
684 /* variable p_called_from_form same as that passed in. */
685 /* When API is called from forms the parameter p_called_from_forms is set
686 to 'YES' and the same parameter is set to 'YES' within the validation pkg.
687 When API is not called from forms the parameter is 'NO'.
688 */
689
690 GMDFMVAL_PUB.p_called_from_forms := p_called_from_forms;
691
692 /* Initialize message list if p_init_msg_list is set to TRUE */
693 IF FND_API.to_Boolean( p_init_msg_list ) THEN
694 FND_MSG_PUB.initialize;
695 END IF;
696
697 /* 1. Does validation */
698 /* 2. Call the private API that does the database updates */
699 IF (p_formula_detail_tbl.count = 0) THEN
700 RAISE FND_API.G_EXC_ERROR;
701 END IF;
702
703 FOR i IN 1 .. p_formula_detail_tbl.count LOOP
704
705 /* Initialize API return status to success */
706 x_return_status := FND_API.G_RET_STS_SUCCESS;
707
708 IF (l_debug = 'Y') THEN
709 gmd_debug.put_line(' In Formula Detail Update Pub - Entering loop with row # '||i);
710 END IF;
711
712 p_formula_detail_rec := p_formula_detail_tbl(i);
713
714 /* New record to get different entity values */
715 pRecord_in.formula_no := p_formula_detail_rec.formula_no;
716 pRecord_in.formula_vers := p_formula_detail_rec.formula_vers;
717 pRecord_in.formula_id := p_formula_detail_rec.formula_id;
718 -- Bug 4603060 pRecord_in.user_name := p_formula_detail_rec.user_name;
719
720 /* Procedure get_element based on the element_name return all
721 information about it. For e.g. if element_name is formula
722 and if we input the formula_id in pRecord_in it returns the
723 formula_no and vers information and visa versa too
724 */
725 /* ======================== */
726 /* Get the formula id */
727 /* ======================== */
728 IF (l_debug = 'Y') THEN
729 gmd_debug.put_line(' In Formula Detail Pub - '
730 ||' Before formula validation - '||x_return_status);
731 END IF;
732 IF (p_formula_detail_rec.formula_id is NULL) THEN
733 GMDFMVAL_PUB.get_formula_id(p_formula_detail_rec.formula_no,
734 p_formula_detail_rec.formula_vers,
735 l_formula_id, l_return_val);
736 IF (l_return_val <> 0) THEN
737 IF (p_formula_detail_rec.formula_no IS NULL) THEN
738 FND_MESSAGE.SET_NAME('GMD', 'FM_MISSING_FORMULA_NO');
739 FND_MSG_PUB.Add;
740 RAISE FND_API.G_EXC_ERROR;
741 ELSIF (p_formula_detail_rec.formula_vers IS NULL) THEN
742 FND_MESSAGE.SET_NAME('GMD', 'FM_MISSING_FORMULA_VERS');
743 FND_MSG_PUB.Add;
744 RAISE FND_API.G_EXC_ERROR;
745 ELSE
746 FND_MESSAGE.SET_NAME('GMD', 'FM_INVFORMULANO');
747 FND_MESSAGE.SET_TOKEN('FORMULA_NO', p_formula_detail_rec.formula_no);
748 FND_MSG_PUB.Add;
749 RAISE FND_API.G_EXC_ERROR;
750 END IF;
751 END IF;
752 ELSE
753 l_formula_id := p_formula_detail_rec.formula_id;
754 END IF;
755
756 /* New - added this condition below by Shyam */
757 /* Check if this formula can be changed - if this formula is
758 On-Hold or Obsolete or Frozen or Requested for Approval -
759 the change of this formula is prevented */
760 /* Check if update is allowed */
761 IF NOT GMD_COMMON_VAL.Update_Allowed('FORMULA',l_formula_id) THEN
762 FND_MESSAGE.SET_NAME('GMD','GMD_CANNOT_UPD_ENTITY');
763 FND_MESSAGE.SET_TOKEN('NAME', 'formula');
764 FND_MESSAGE.SET_TOKEN('ID', l_formula_id);
765 FND_MESSAGE.SET_TOKEN('NO', p_formula_detail_rec.formula_no);
766 FND_MESSAGE.SET_TOKEN('VERS', p_formula_detail_rec.formula_vers);
767 FND_MESSAGE.SET_TOKEN('STATUS',
768 GMD_FORMULA_DETAIL_PUB.get_fm_status_meaning(l_formula_id));
769 FND_MSG_PUB.Add;
770 RAISE FND_API.G_EXC_ERROR;
771 END IF;
772
773 /* Check if there is a valid userid */
774 IF (l_debug = 'Y') THEN
775 gmd_debug.put_line(' In Formula Detail Pub - '
776 ||' - Before user validation ');
777 END IF;
778 -- Bug 4603060 User the user_id from context
779 l_user_id := FND_GLOBAL.user_id;
780 IF (l_user_id IS NULL) THEN
781 FND_MESSAGE.SET_NAME('GMD', 'GMD_USER_CONTEXT_NOT_SET');
782 FND_MSG_PUB.Add;
783 RAISE FND_API.G_EXC_ERROR;
784 END IF;
785
786 /* ========================================= */
787 /* Ensure that the formulaline id exists */
788 /* User is forced to pass the formulaline_id */
789 /* ========================================== */
790 IF (l_debug = 'Y') THEN
791 gmd_debug.put_line(' In Formula Detail Pub - '
792 ||' Before formulaline validation - '||x_return_status);
793 END IF;
794 IF (p_formula_detail_rec.formulaline_id IS NOT NULL) THEN /* if invalid formula no */
795 GMDFMVAL_PUB.get_formulaline_id(p_formula_detail_rec.formulaline_id,l_return_val);
796 IF (l_return_val <> 0) THEN
797 FND_MESSAGE.SET_NAME('GMD','FM_INVALID_FMLINE_ID');
798 FND_MSG_PUB.Add;
799 RAISE FND_API.G_EXC_ERROR;
800 END IF;
801 ELSIF (p_formula_detail_rec.formulaline_id IS NULL) THEN /* missing formula no */
802 FND_MESSAGE.SET_NAME('GMD','FM_MISSING_FMLINE_ID');
803 FND_MSG_PUB.Add;
804 RAISE FND_API.G_EXC_ERROR;
805 END IF;
806
807 -- Bug# 5554631 KMOTUPAL - TO prevent Update of Item Revision
808 IF (p_formula_detail_rec.revision IS NOT NULL) THEN
809 FND_MESSAGE.SET_NAME('GMD','GMD_INVALID_COL_UPDATES');
810 FND_MESSAGE.SET_TOKEN('NAME','REVISION');
811 FND_MSG_PUB.Add;
812 END IF;
813
814 OPEN C_get_orgid (l_formula_id);
815 FETCH C_get_orgid INTO l_org_id;
816 CLOSE C_get_orgid;
817
818 p_formula_detail_rec.owner_organization_id := l_org_id;
819
820 OPEN C_get_item_id(p_formula_detail_rec.formulaline_id);
821 FETCH C_get_item_id INTO l_item_id;
822 CLOSE C_get_item_id;
823
824 p_formula_detail_rec.inventory_item_id := l_item_id;
825
826 OPEN C_get_item_no(l_item_id);
827 FETCH C_get_item_no INTO l_item_no;
828 CLOSE C_get_item_no;
829
830 p_formula_detail_rec.item_no := l_item_no;
831
832
833 /* ================================================================= */
834 /* Get all not null values from the from the formula line table */
835 /* (fm_matl_dtl). If any field value is not provided, update it */
836 /* with what exists in the db */
837 /* ================================================================= */
838 IF (l_debug = 'Y') THEN
839 gmd_debug.put_line(' In Formula Detail Pub - '
840 ||' Retrieving all not null columns '
841 ||' for formula line id = '
842 ||p_formula_detail_rec.formulaline_id
843 ||' - '
844 ||x_return_status);
845 END IF;
846
847 FOR fmline_not_null IN get_detail_rec(p_formula_detail_rec.formulaline_id)
848 LOOP
849 IF (p_formula_detail_rec.line_type IS NULL) THEN
850 p_formula_detail_rec.line_type := fmline_not_null.line_type;
851 END IF;
852
853 IF (p_formula_detail_rec.line_no IS NULL) THEN
854 p_formula_detail_rec.line_no := fmline_not_null.line_no;
855 END IF;
856
857 IF (p_formula_detail_rec.qty IS NULL) THEN
858 p_formula_detail_rec.qty := fmline_not_null.qty;
859 END IF;
860
861 -- Bug# 5554631 KMOTUPAL - To pass the old revision as update of revision is not allowed.
862 -- IF (p_formula_detail_rec.revision IS NULL) THEN
863 p_formula_detail_rec.revision := fmline_not_null.revision;
864 -- END IF;
865
866
867 IF (p_formula_detail_rec.detail_uom IS NULL) THEN
868 p_formula_detail_rec.detail_uom := fmline_not_null.detail_uom;
869 END IF;
870
871 IF (p_formula_detail_rec.release_type IS NULL) THEN
872 p_formula_detail_rec.release_type := fmline_not_null.release_type;
873 END IF;
874
875 IF (p_formula_detail_rec.scrap_factor IS NULL) THEN
876 p_formula_detail_rec.scrap_factor := fmline_not_null.scrap_factor;
877 END IF;
878
879 IF (p_formula_detail_rec.scale_type_dtl IS NULL) THEN
880 p_formula_detail_rec.scale_type_dtl := fmline_not_null.scale_type;
881 END IF;
882
883 IF (p_formula_detail_rec.phantom_type IS NULL) THEN
884 p_formula_detail_rec.phantom_type := fmline_not_null.phantom_type;
885 END IF;
886
887 IF (p_formula_detail_rec.buffer_ind IS NULL) THEN
888 p_formula_detail_rec.buffer_ind := fmline_not_null.buffer_ind;
889 END IF;
890
891 IF (p_formula_detail_rec.rework_type IS NULL) THEN
892 p_formula_detail_rec.rework_type := fmline_not_null.rework_type;
893 END IF;
894
895 -- Bug 4603060
896 p_formula_detail_rec.last_updated_by := l_user_id;
897
898
899 IF (p_formula_detail_rec.created_by IS NULL) THEN
900 p_formula_detail_rec.created_by := fmline_not_null.created_by;
901 END IF;
902
903 IF (p_formula_detail_rec.last_update_date IS NULL) THEN
904 p_formula_detail_rec.last_update_date := SYSDATE;
905 END IF;
906
907 IF (p_formula_detail_rec.creation_date IS NULL) THEN
908 p_formula_detail_rec.creation_date := fmline_not_null.creation_date;
909 END IF;
910
911 IF (p_formula_detail_rec.last_update_login IS NULL) THEN
912 p_formula_detail_rec.last_update_login := fmline_not_null.last_update_login;
913 END IF;
914
915 -- Kapil ME Auto-Prod :Bug#5716318
916 /* Get the Organization Parameter and the Parameter set at the Formula level */
917 GMD_API_GRP.FETCH_PARM_VALUES(P_orgn_id => l_org_id,
918 P_parm_name => 'GMD_AUTO_PROD_CALC',
919 P_parm_value => l_auto_calc,
920 X_return_status => X_return_status );
921
922 OPEN C_get_auto_parameter (l_formula_id);
923 FETCH C_get_auto_parameter INTO l_formula_calc_flag ;
924 CLOSE C_get_auto_parameter;
925
926 /* Get the Percentage value if Not passed */
927 IF (p_formula_detail_rec.prod_percent IS NULL) THEN
928 p_formula_detail_rec.prod_percent := fmline_not_null.prod_percent;
929 ELSE
930 IF l_auto_calc IS NULL OR l_auto_calc = 'N' OR l_formula_calc_flag = 'N' OR l_formula_calc_flag IS NULL
931 OR (fmline_not_null.line_type IN (-1,2) OR
932 (p_formula_detail_rec.line_type = 1 And p_formula_detail_rec.scale_type_dtl = 0 ) ) THEN
933 /* Error to be raised if Percentages are passed for Ingredients/By-Products or when
934 when the Parameter is not set to calculate Product Qty */
935 FND_MESSAGE.SET_NAME('GMD', 'GMD_ENTER_PERCENTAGES_NOT');
936 FND_MSG_PUB.Add;
937 RAISE FND_API.G_EXC_ERROR;
938 END IF;
939 END IF;
940 -- Kapil ME Auto-Prod :Bug#5716318
941
942 END LOOP; -- end loop for all not column assignment
943
944
945 /* Beyond this all validations are made */
946 /* When coming from forms all these validations are already */
947 /* done, so we can skip the validations below. */
948
949 /* Procedure validate_formula_record for all the elements*/
950
951 IF (NVL(p_called_from_forms,'NO') = 'NO') THEN
952 GMDFMVAL_PUB.validate_update_record (P_formula_dtl => P_formula_detail_rec,
953 X_formula_dtl => X_formula_detail_rec,
954 xReturn => X_return_status);
955 ELSE
956 X_formula_detail_rec := P_formula_detail_rec;
957 END IF; /* Validations end when not called from forms */
958
959 /* Validate all optional parameters passed. */
960
961 IF (l_debug = 'Y') THEN
962 gmd_debug.put_line(' In Formula Detail Pub - '
963 ||' Validation of G-MISS '
964 ||' - '
965 ||x_return_status);
966 END IF;
967
968 OPEN get_detail_rec(p_formula_detail_rec.formulaline_id);
969 FETCH get_detail_rec into fm_matl_dtl_rec;
970
971 /* Shyam Sitaraman - Bug 2652200 */
972 /* Reversed the handling of FND_API.G_MISS_CHAR, now if the user */
973 /* passes in FND_API.G_MISS_CHAR for an attribute it would be handled */
974 /* as the user is intending to update the field to NULL */
975 IF (get_detail_rec%FOUND) THEN
976 /*Bug 2509076 - Thomas Daniel */
977 /* QM Integration */
978 IF (p_formula_detail_rec.by_product_type = FND_API.G_MISS_CHAR) THEN
979 l_by_product_type := NULL;
980 ELSIF (p_formula_detail_rec.by_product_type IS NULL) THEN
981 l_by_product_type := fm_matl_dtl_rec.by_product_type;
982 ELSE
983 l_by_product_type := X_formula_detail_rec.by_product_type;
984 END IF;
985
986 /* Added some more - with FM API cleanup */
987 IF (p_formula_detail_rec.rounding_direction = FND_API.G_MISS_NUM) THEN
988 l_rounding_direction := NULL;
989 ELSIF (p_formula_detail_rec.rounding_direction IS NULL) THEN
990 l_rounding_direction := fm_matl_dtl_rec.rounding_direction;
991 ELSE
992 l_rounding_direction := p_formula_detail_rec.rounding_direction;
993 END IF;
994
995 IF (p_formula_detail_rec.text_code_dtl = FND_API.G_MISS_NUM) THEN
996 l_text_code := NULL;
997 ELSIF (p_formula_detail_rec.text_code_dtl IS NULL) THEN
998 l_text_code := fm_matl_dtl_rec.text_code;
999 ELSE
1000 l_text_code := p_formula_detail_rec.text_code_dtl;
1001 END IF;
1002
1003 IF (p_formula_detail_rec.cost_alloc = FND_API.G_MISS_NUM) THEN
1004 l_cost_alloc := NULL;
1005 ELSIF (p_formula_detail_rec.cost_alloc IS NULL) THEN
1006 l_cost_alloc := fm_matl_dtl_rec.cost_alloc;
1007 ELSE
1008 l_cost_alloc := X_formula_detail_rec.cost_alloc;
1009 END IF;
1010
1011 IF (p_formula_detail_rec.tpformula_id = FND_API.G_MISS_NUM) THEN
1012 l_tpformula_id := NULL;
1013 ELSIF (p_formula_detail_rec.tpformula_id IS NULL) THEN
1014 l_tpformula_id := fm_matl_dtl_rec.tpformula_id;
1015 ELSE
1016 l_tpformula_id := p_formula_detail_rec.tpformula_id;
1017 END IF;
1018
1019 IF (p_formula_detail_rec.tpformula_id = FND_API.G_MISS_NUM) THEN
1020 l_tpformula_id := NULL;
1021 ELSIF (p_formula_detail_rec.tpformula_id IS NULL) THEN
1022 l_tpformula_id := fm_matl_dtl_rec.tpformula_id;
1023 ELSE
1024 l_tpformula_id := p_formula_detail_rec.tpformula_id;
1025 END IF;
1026
1027 IF (p_formula_detail_rec.iaformula_id = FND_API.G_MISS_NUM) THEN
1028 l_iaformula_id := NULL;
1029 ELSIF (p_formula_detail_rec.iaformula_id IS NULL) THEN
1030 l_iaformula_id := fm_matl_dtl_rec.iaformula_id;
1031 ELSE
1032 l_iaformula_id := p_formula_detail_rec.iaformula_id;
1033 END IF;
1034
1035 IF (p_formula_detail_rec.scale_multiple = FND_API.G_MISS_NUM) THEN
1036 l_scale_multiple := NULL;
1037 ELSIF (p_formula_detail_rec.scale_multiple IS NULL) THEN
1038 l_scale_multiple := fm_matl_dtl_rec.scale_multiple;
1039 ELSE
1040 l_scale_multiple := p_formula_detail_rec.scale_multiple;
1041 END IF;
1042
1043 IF (p_formula_detail_rec.scale_rounding_variance = FND_API.G_MISS_NUM) THEN
1044 l_scale_rounding_variance := NULL;
1045 ELSIF (p_formula_detail_rec.scale_rounding_variance IS NULL) THEN
1046 l_scale_rounding_variance := fm_matl_dtl_rec.scale_rounding_variance;
1047 ELSE
1048 l_scale_rounding_variance := p_formula_detail_rec.scale_rounding_variance;
1049 END IF;
1050
1051 IF (p_formula_detail_rec.contribute_yield_ind = FND_API.G_MISS_CHAR) THEN
1052 l_contribute_yield_ind := NULL;
1053 IF (l_debug = 'Y') THEN
1054 gmd_debug.put_line(' In Formula Header Pub - '
1055 ||' Cond 1');
1056 END IF;
1057 ELSIF (p_formula_detail_rec.contribute_yield_ind IS NULL) THEN
1058 l_contribute_yield_ind := fm_matl_dtl_rec.contribute_yield_ind;
1059 IF (l_debug = 'Y') THEN
1060 gmd_debug.put_line(' In Formula Header Pub - '
1061 ||' Cond 2');
1062 END IF;
1063 ELSE
1064 l_contribute_yield_ind := p_formula_detail_rec.contribute_yield_ind;
1065 IF (l_debug = 'Y') THEN
1066 gmd_debug.put_line(' In Formula Header Pub - '
1067 ||' Cond 3');
1068 END IF;
1069 END IF;
1070
1071 IF (l_debug = 'Y') THEN
1072 gmd_debug.put_line(' In Formula Header Pub - '
1073 ||' p_formula_detail_rec.contribute_yield_ind = '
1074 ||p_formula_detail_rec.contribute_yield_ind
1075 ||' fm_matl_dtl_rec.contribute_yield_ind = '
1076 ||fm_matl_dtl_rec.contribute_yield_ind
1077 ||' l_contribute_yield_ind = '
1078 ||l_contribute_yield_ind
1079 ||' - '
1080 ||x_return_status);
1081 END IF;
1082
1083 IF (p_formula_detail_rec.scale_uom = FND_API.G_MISS_CHAR) THEN
1084 l_scale_uom := NULL;
1085 ELSIF (p_formula_detail_rec.scale_uom IS NULL) THEN
1086 l_scale_uom := fm_matl_dtl_rec.scale_uom;
1087 ELSE
1088 l_scale_uom := p_formula_detail_rec.scale_uom;
1089 END IF;
1090
1091 IF (p_formula_detail_rec.contribute_step_qty_ind = FND_API.G_MISS_CHAR) THEN
1092 l_contribute_step_qty_ind := NULL;
1093 ELSIF (p_formula_detail_rec.contribute_step_qty_ind IS NULL) THEN
1094 l_contribute_step_qty_ind := fm_matl_dtl_rec.contribute_step_qty_ind;
1095 ELSE
1096 l_contribute_step_qty_ind := p_formula_detail_rec.contribute_step_qty_ind;
1097 END IF;
1098
1099
1100 IF (p_formula_detail_rec.attribute_category = FND_API.G_MISS_CHAR) THEN
1101 l_attribute_category := NULL;
1102 ELSIF (p_formula_detail_rec.attribute_category IS NULL) THEN
1103 l_attribute_category := fm_matl_dtl_rec.attribute_category;
1104 ELSE
1105 l_attribute_category := p_formula_detail_rec.attribute_category;
1106 END IF;
1107
1108 IF (p_formula_detail_rec.attribute1 = FND_API.G_MISS_CHAR) THEN
1109 l_attribute1 := NULL;
1110 ELSIF (p_formula_detail_rec.attribute1 IS NULL) THEN
1111 l_attribute1 := fm_matl_dtl_rec.attribute1;
1112 ELSE
1113 l_attribute1 := p_formula_detail_rec.attribute1;
1114 END IF;
1115
1116 IF (p_formula_detail_rec.attribute2 = FND_API.G_MISS_CHAR) THEN
1117 l_attribute2 := NULL;
1118 ELSIF (p_formula_detail_rec.attribute2 IS NULL) THEN
1119 l_attribute2 := fm_matl_dtl_rec.attribute2;
1120 ELSE
1121 l_attribute2 := p_formula_detail_rec.attribute2;
1122 END IF;
1123
1124 IF (p_formula_detail_rec.attribute3 = FND_API.G_MISS_CHAR) THEN
1125 l_attribute3 := NULL;
1126 ELSIF (p_formula_detail_rec.attribute3 IS NULL) THEN
1127 l_attribute3 := fm_matl_dtl_rec.attribute3;
1128 ELSE
1129 l_attribute3 := p_formula_detail_rec.attribute3;
1130 END IF;
1131
1132 IF (p_formula_detail_rec.attribute4 = FND_API.G_MISS_CHAR) THEN
1133 l_attribute4 := NULL;
1134 ELSIF (p_formula_detail_rec.attribute4 IS NULL) THEN
1135 l_attribute4 := fm_matl_dtl_rec.attribute4;
1136 ELSE
1137 l_attribute4 := p_formula_detail_rec.attribute4;
1138 END IF;
1139
1140 IF (p_formula_detail_rec.attribute5 = FND_API.G_MISS_CHAR) THEN
1141 l_attribute5 := NULL;
1142 ELSIF (p_formula_detail_rec.attribute5 IS NULL) THEN
1143 l_attribute5 := fm_matl_dtl_rec.attribute5;
1144 ELSE
1145 l_attribute5 := p_formula_detail_rec.attribute5;
1146 END IF;
1147
1148 IF (p_formula_detail_rec.attribute6 = FND_API.G_MISS_CHAR) THEN
1149 l_attribute6 := NULL;
1150 ELSIF (p_formula_detail_rec.attribute6 IS NULL) THEN
1151 l_attribute6 := fm_matl_dtl_rec.attribute6;
1152 ELSE
1153 l_attribute6 := p_formula_detail_rec.attribute6;
1154 END IF;
1155
1156 IF (p_formula_detail_rec.attribute7 = FND_API.G_MISS_CHAR) THEN
1157 l_attribute7 := NULL;
1158 ELSIF (p_formula_detail_rec.attribute7 IS NULL) THEN
1159 l_attribute7 := fm_matl_dtl_rec.attribute7;
1160 ELSE
1161 l_attribute7 := p_formula_detail_rec.attribute7;
1162 END IF;
1163
1164 IF (p_formula_detail_rec.attribute8 = FND_API.G_MISS_CHAR) THEN
1165 l_attribute8 := NULL;
1166 ELSIF (p_formula_detail_rec.attribute8 IS NULL) THEN
1167 l_attribute8 := fm_matl_dtl_rec.attribute8;
1168 ELSE
1169 l_attribute8 := p_formula_detail_rec.attribute8;
1170 END IF;
1171
1172 IF (p_formula_detail_rec.attribute9 = FND_API.G_MISS_CHAR) THEN
1173 l_attribute9 := NULL;
1174 ELSIF (p_formula_detail_rec.attribute9 IS NULL) THEN
1175 l_attribute9 := fm_matl_dtl_rec.attribute9;
1176 ELSE
1177 l_attribute9 := p_formula_detail_rec.attribute9;
1178 END IF;
1179
1180 IF (p_formula_detail_rec.attribute10 = FND_API.G_MISS_CHAR) THEN
1181 l_attribute10 := NULL;
1182 ELSIF (p_formula_detail_rec.attribute10 IS NULL) THEN
1183 l_attribute10 := fm_matl_dtl_rec.attribute10;
1184 ELSE
1185 l_attribute10 := p_formula_detail_rec.attribute10;
1186 END IF;
1187
1188 IF (p_formula_detail_rec.attribute11 = FND_API.G_MISS_CHAR) THEN
1189 l_attribute11 := NULL;
1190 ELSIF (p_formula_detail_rec.attribute11 IS NULL) THEN
1191 l_attribute11 := fm_matl_dtl_rec.attribute11;
1192 ELSE
1193 l_attribute11 := p_formula_detail_rec.attribute11;
1194 END IF;
1195
1196 IF (p_formula_detail_rec.attribute12 = FND_API.G_MISS_CHAR) THEN
1197 l_attribute12 := NULL;
1198 ELSIF (p_formula_detail_rec.attribute2 IS NULL) THEN
1199 l_attribute12 := fm_matl_dtl_rec.attribute12;
1200 ELSE
1201 l_attribute12 := p_formula_detail_rec.attribute12;
1202 END IF;
1203
1204 IF (p_formula_detail_rec.attribute13 = FND_API.G_MISS_CHAR) THEN
1205 l_attribute13 := NULL;
1206 ELSIF (p_formula_detail_rec.attribute13 IS NULL) THEN
1207 l_attribute13 := fm_matl_dtl_rec.attribute13;
1208 ELSE
1209 l_attribute13 := p_formula_detail_rec.attribute13;
1210 END IF;
1211
1212 IF (p_formula_detail_rec.attribute14 = FND_API.G_MISS_CHAR) THEN
1213 l_attribute14 := NULL;
1214 ELSIF (p_formula_detail_rec.attribute14 IS NULL) THEN
1215 l_attribute14 := fm_matl_dtl_rec.attribute14;
1216 ELSE
1217 l_attribute14 := p_formula_detail_rec.attribute14;
1218 END IF;
1219
1220 IF (p_formula_detail_rec.attribute15 = FND_API.G_MISS_CHAR) THEN
1221 l_attribute15 := NULL;
1222 ELSIF (p_formula_detail_rec.attribute15 IS NULL) THEN
1223 l_attribute15 := fm_matl_dtl_rec.attribute15;
1224 ELSE
1225 l_attribute15 := p_formula_detail_rec.attribute15;
1226 END IF;
1227
1228 IF (p_formula_detail_rec.attribute16 = FND_API.G_MISS_CHAR) THEN
1229 l_attribute16 := NULL;
1230 ELSIF (p_formula_detail_rec.attribute16 IS NULL) THEN
1231 l_attribute16 := fm_matl_dtl_rec.attribute16;
1232 ELSE
1233 l_attribute16 := p_formula_detail_rec.attribute16;
1234 END IF;
1235
1236 IF (p_formula_detail_rec.attribute17 = FND_API.G_MISS_CHAR) THEN
1237 l_attribute17 := NULL;
1238 ELSIF (p_formula_detail_rec.attribute17 IS NULL) THEN
1239 l_attribute17 := fm_matl_dtl_rec.attribute17;
1240 ELSE
1241 l_attribute17 := p_formula_detail_rec.attribute17;
1242 END IF;
1243
1244 IF (p_formula_detail_rec.attribute18 = FND_API.G_MISS_CHAR) THEN
1245 l_attribute18 := NULL;
1246 ELSIF (p_formula_detail_rec.attribute18 IS NULL) THEN
1247 l_attribute18 := fm_matl_dtl_rec.attribute18;
1248 ELSE
1249 l_attribute18 := p_formula_detail_rec.attribute18;
1250 END IF;
1251
1252 IF (p_formula_detail_rec.attribute19 = FND_API.G_MISS_CHAR) THEN
1253 l_attribute19 := NULL;
1254 ELSIF (p_formula_detail_rec.attribute19 IS NULL) THEN
1255 l_attribute19 := fm_matl_dtl_rec.attribute19;
1256 ELSE
1257 l_attribute19 := p_formula_detail_rec.attribute19;
1258 END IF;
1259
1260 IF (p_formula_detail_rec.attribute20 = FND_API.G_MISS_CHAR) THEN
1261 l_attribute20 := NULL;
1262 ELSIF (p_formula_detail_rec.attribute20 IS NULL) THEN
1263 l_attribute20 := fm_matl_dtl_rec.attribute20;
1264 ELSE
1265 l_attribute20 := p_formula_detail_rec.attribute20;
1266 END IF;
1267
1268 IF (p_formula_detail_rec.attribute21 = FND_API.G_MISS_CHAR) THEN
1269 l_attribute21 := NULL;
1270 ELSIF (p_formula_detail_rec.attribute21 IS NULL) THEN
1271 l_attribute21 := fm_matl_dtl_rec.attribute21;
1272 ELSE
1273 l_attribute21 := p_formula_detail_rec.attribute21;
1274 END IF;
1275
1276 IF (p_formula_detail_rec.attribute22 = FND_API.G_MISS_CHAR) THEN
1277 l_attribute22 := NULL;
1278 ELSIF (p_formula_detail_rec.attribute22 IS NULL) THEN
1279 l_attribute22 := fm_matl_dtl_rec.attribute22;
1280 ELSE
1281 l_attribute22 := p_formula_detail_rec.attribute22;
1282 END IF;
1283
1284 IF (p_formula_detail_rec.attribute23 = FND_API.G_MISS_CHAR) THEN
1285 l_attribute23 := NULL;
1286 ELSIF (p_formula_detail_rec.attribute23 IS NULL) THEN
1287 l_attribute23 := fm_matl_dtl_rec.attribute23;
1288 ELSE
1289 l_attribute23 := p_formula_detail_rec.attribute23;
1290 END IF;
1291
1292 IF (p_formula_detail_rec.attribute24 = FND_API.G_MISS_CHAR) THEN
1293 l_attribute24 := NULL;
1294 ELSIF (p_formula_detail_rec.attribute24 IS NULL) THEN
1295 l_attribute24 := fm_matl_dtl_rec.attribute24;
1296 ELSE
1297 l_attribute24 := p_formula_detail_rec.attribute24;
1298 END IF;
1299
1300 IF (p_formula_detail_rec.attribute25 = FND_API.G_MISS_CHAR) THEN
1301 l_attribute25 := NULL;
1302 ELSIF (p_formula_detail_rec.attribute25 IS NULL) THEN
1303 l_attribute25 := fm_matl_dtl_rec.attribute25;
1304 ELSE
1305 l_attribute25 := p_formula_detail_rec.attribute25;
1306 END IF;
1307
1308 IF (p_formula_detail_rec.attribute26 = FND_API.G_MISS_CHAR) THEN
1309 l_attribute26 := NULL;
1310 ELSIF (p_formula_detail_rec.attribute26 IS NULL) THEN
1311 l_attribute26 := fm_matl_dtl_rec.attribute26;
1312 ELSE
1313 l_attribute26 := p_formula_detail_rec.attribute26;
1314 END IF;
1315
1316 IF (p_formula_detail_rec.attribute27 = FND_API.G_MISS_CHAR) THEN
1317 l_attribute27 := NULL;
1318 ELSIF (p_formula_detail_rec.attribute27 IS NULL) THEN
1319 l_attribute27 := fm_matl_dtl_rec.attribute27;
1320 ELSE
1321 l_attribute27 := p_formula_detail_rec.attribute27;
1322 END IF;
1323
1324 IF (p_formula_detail_rec.attribute28 = FND_API.G_MISS_CHAR) THEN
1325 l_attribute28 := NULL;
1326 ELSIF (p_formula_detail_rec.attribute28 IS NULL) THEN
1327 l_attribute28 := fm_matl_dtl_rec.attribute28;
1328 ELSE
1329 l_attribute28 := p_formula_detail_rec.attribute28;
1330 END IF;
1331
1332 IF (p_formula_detail_rec.attribute29 = FND_API.G_MISS_CHAR) THEN
1333 l_attribute29 := NULL;
1334 ELSIF (p_formula_detail_rec.attribute29 IS NULL) THEN
1335 l_attribute29 := fm_matl_dtl_rec.attribute29;
1336 ELSE
1337 l_attribute29 := p_formula_detail_rec.attribute29;
1338 END IF;
1339
1340 IF (p_formula_detail_rec.attribute30 = FND_API.G_MISS_CHAR) THEN
1341 l_attribute30 := NULL;
1342 ELSIF (p_formula_detail_rec.attribute30 IS NULL) THEN
1343 l_attribute30 := fm_matl_dtl_rec.attribute30;
1344 ELSE
1345 l_attribute30 := p_formula_detail_rec.attribute30;
1346 END IF;
1347 --Bug 4479101
1348 IF (p_formula_detail_rec.ingredient_end_date = FND_API.G_MISS_DATE) THEN
1349 l_ingredient_end_date := NULL;
1350 ELSIF (p_formula_detail_rec.ingredient_end_date IS NULL) THEN
1351 l_ingredient_end_date := fm_matl_dtl_rec.ingredient_end_date;
1352 ELSE
1353 l_ingredient_end_date := p_formula_detail_rec.ingredient_end_date;
1354 END IF;
1355
1356 END IF;
1357
1358 CLOSE get_detail_rec;
1359
1360 /* Call for private API */
1361 IF (l_debug = 'Y') THEN
1362 gmd_debug.put_line(' In Formula Detail Pub - '
1363 ||' Assigning values prior to pvt API call '
1364 ||' - '
1365 ||x_return_status);
1366 END IF;
1367 IF (x_return_status = FND_API.G_RET_STS_SUCCESS) THEN
1368 l_fm_matl_dtl_rec.formulaline_id := p_formula_detail_rec.formulaline_id;
1369 l_fm_matl_dtl_rec.formula_id := l_formula_id;
1370 l_fm_matl_dtl_rec.line_type := p_formula_detail_rec.line_type;
1371 l_fm_matl_dtl_rec.line_no := p_formula_detail_rec.line_no;
1372 l_fm_matl_dtl_rec.organization_id := p_formula_detail_rec.owner_organization_id;
1373 l_fm_matl_dtl_rec.revision := X_formula_detail_rec.revision; l_fm_matl_dtl_rec.qty := p_formula_detail_rec.qty;
1374 l_fm_matl_dtl_rec.detail_uom := X_formula_detail_rec.detail_uom;
1375 l_fm_matl_dtl_rec.release_type := X_formula_detail_rec.release_type;
1376 l_fm_matl_dtl_rec.scrap_factor := p_formula_detail_rec.scrap_factor;
1377 l_fm_matl_dtl_rec.scale_type := p_formula_detail_rec.scale_type_dtl;
1378 l_fm_matl_dtl_rec.cost_alloc := l_cost_alloc;
1379 l_fm_matl_dtl_rec.phantom_type := p_formula_detail_rec.phantom_type;
1380 l_fm_matl_dtl_rec.buffer_ind := p_formula_detail_rec.buffer_ind;
1381 l_fm_matl_dtl_rec.rework_type := 0;
1382 l_fm_matl_dtl_rec.tpformula_id := l_tpformula_id;
1383 l_fm_matl_dtl_rec.iaformula_id := l_iaformula_id;
1384 l_fm_matl_dtl_rec.scale_multiple := l_scale_multiple;
1385 l_fm_matl_dtl_rec.contribute_yield_ind := l_contribute_yield_ind;
1386 l_fm_matl_dtl_rec.scale_uom := l_scale_uom;
1387 l_fm_matl_dtl_rec.contribute_step_qty_ind := l_contribute_step_qty_ind;
1388 l_fm_matl_dtl_rec.scale_rounding_variance := l_scale_rounding_variance;
1389 l_fm_matl_dtl_rec.rounding_direction := l_rounding_direction;
1390 /*Bug 2509076 - Thomas Daniel QM Integration new field */
1391 l_fm_matl_dtl_rec.by_product_type := l_by_product_type;
1392 l_fm_matl_dtl_rec.ingredient_end_date := l_ingredient_end_date; --Bug 4479101
1393 l_fm_matl_dtl_rec.text_code := l_text_code;
1394 l_fm_matl_dtl_rec.created_by := p_formula_detail_rec.created_by;
1395 l_fm_matl_dtl_rec.creation_date := p_formula_detail_rec.creation_date;
1396 l_fm_matl_dtl_rec.last_update_date := p_formula_detail_rec.last_update_date;
1397 l_fm_matl_dtl_rec.last_update_login := p_formula_detail_rec.last_update_login;
1398 l_fm_matl_dtl_rec.last_updated_by := p_formula_detail_rec.last_updated_by;
1399 l_fm_matl_dtl_rec.attribute_category := l_attribute_category;
1400 l_fm_matl_dtl_rec.attribute1 := l_attribute1;
1401 l_fm_matl_dtl_rec.attribute2 := l_attribute2;
1402 l_fm_matl_dtl_rec.attribute3 := l_attribute3;
1403 l_fm_matl_dtl_rec.attribute4 := l_attribute4;
1404 l_fm_matl_dtl_rec.attribute5 := l_attribute5;
1405 l_fm_matl_dtl_rec.attribute6 := l_attribute6;
1406 l_fm_matl_dtl_rec.attribute7 := l_attribute7;
1407 l_fm_matl_dtl_rec.attribute8 := l_attribute8;
1408 l_fm_matl_dtl_rec.attribute9 := l_attribute9;
1409 l_fm_matl_dtl_rec.attribute10 := l_attribute10;
1410 l_fm_matl_dtl_rec.attribute11 := l_attribute11;
1411 l_fm_matl_dtl_rec.attribute12 := l_attribute12;
1412 l_fm_matl_dtl_rec.attribute13 := l_attribute13;
1413 l_fm_matl_dtl_rec.attribute14 := l_attribute14;
1414 l_fm_matl_dtl_rec.attribute15 := l_attribute15;
1415 l_fm_matl_dtl_rec.attribute16 := l_attribute16;
1416 l_fm_matl_dtl_rec.attribute17 := l_attribute17;
1417 l_fm_matl_dtl_rec.attribute18 := l_attribute18;
1418 l_fm_matl_dtl_rec.attribute19 := l_attribute19;
1419 l_fm_matl_dtl_rec.attribute20 := l_attribute20;
1420 l_fm_matl_dtl_rec.attribute21 := l_attribute21;
1421 l_fm_matl_dtl_rec.attribute22 := l_attribute22;
1422 l_fm_matl_dtl_rec.attribute23 := l_attribute23;
1423 l_fm_matl_dtl_rec.attribute24 := l_attribute24;
1424 l_fm_matl_dtl_rec.attribute25 := l_attribute25;
1425 l_fm_matl_dtl_rec.attribute26 := l_attribute26;
1426 l_fm_matl_dtl_rec.attribute27 := l_attribute27;
1427 l_fm_matl_dtl_rec.attribute28 := l_attribute28;
1428 l_fm_matl_dtl_rec.attribute29 := l_attribute29;
1429 l_fm_matl_dtl_rec.attribute30 := l_attribute30;
1430 -- Kapil ME Auto-Prod :Bug#5716318
1431 l_fm_matl_dtl_rec.prod_percent := p_formula_detail_rec.prod_percent;
1432
1433 /* Call the private API */
1434 IF (l_debug = 'Y') THEN
1435 gmd_debug.put_line(' In Formula Detail Pub - '
1436 ||' Before Updtae Pvt API call '
1437 ||' - '
1438 ||x_return_status);
1439 END IF;
1440 GMD_FORMULA_DETAIL_PVT.Update_FormulaDetail
1441 ( p_api_version => 1.0
1442 ,p_init_msg_list => p_init_msg_list
1443 ,p_commit => FND_API.G_FALSE
1444 ,x_return_status => x_return_status
1445 ,x_msg_count => x_msg_count
1446 ,x_msg_data => x_msg_data
1447 ,p_formula_detail_rec => l_fm_matl_dtl_rec
1448 );
1449
1450 IF (l_debug = 'Y') THEN
1451 gmd_debug.put_line(' In Formula Detail Pub - '
1452 ||' After Update Pvt API call '
1453 ||' - '
1454 ||x_return_status);
1455 END IF;
1456
1457 END IF;
1458
1459 -- Kapil ME Auto-Prod :Bug#5716318
1460 /* To calculate Product Quantity after updating a record if the Parameter is set to yes */
1461 IF l_auto_calc = 'Y' THEN
1462 IF l_formula_calc_flag = 'Y' THEN
1463 GMD_COMMON_VAL.Calculate_Total_Product_Qty( p_formula_id =>l_formula_id ,
1464 x_return_status => x_return_status,
1465 x_msg_count => x_msg_count,
1466 x_msg_data => x_msg_data);
1467 END IF;
1468 END IF;
1469 -- Kapil ME Auto-Prod :Bug#5716318
1470
1471 /* IF update of a line fails - Raise an exception
1472 rather than trying to insert other lines */
1473 IF (x_return_status = FND_API.G_RET_STS_ERROR) THEN
1474 RAISE FND_API.G_EXC_ERROR;
1475 ELSIF (x_return_status = FND_API.G_RET_STS_UNEXP_ERROR) THEN
1476 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
1477 END IF;
1478
1479 END LOOP; -- End of main update loop
1480
1481 /* Check if p_commit is set to TRUE */
1482 IF x_return_status IN (FND_API.G_RET_STS_SUCCESS,'Q') AND
1483 (FND_API.To_Boolean( p_commit ) ) THEN
1484 Commit;
1485 END IF;
1486
1487 /* Get the message count and information */
1488 FND_MSG_PUB.Count_And_Get (
1489 p_count => x_msg_count,
1490 p_data => x_msg_data );
1491 EXCEPTION
1492 WHEN FND_API.G_EXC_ERROR THEN
1493 ROLLBACK to Update_FormulaDetail;
1494 x_return_status := FND_API.G_RET_STS_ERROR;
1495 FND_MSG_PUB.Count_And_Get (
1496 p_count => x_msg_count,
1497 p_data => x_msg_data );
1498 IF (l_debug = 'Y') THEN
1499 gmd_debug.put_line(' In Formula Detail pub - In error Exception Section '
1500 ||' - '
1501 ||x_return_status);
1502 END IF;
1503 WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
1504 ROLLBACK to Update_FormulaDetail;
1505 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
1506 FND_MSG_PUB.Count_And_Get (
1507 p_count => x_msg_count,
1508 p_data => x_msg_data );
1509 IF (l_debug = 'Y') THEN
1510 gmd_debug.put_line(' In Formula Detail pub - In unexpected Exception Section '
1511 ||' - '
1512 ||x_return_status);
1513 END IF;
1514 WHEN OTHERS THEN
1515 ROLLBACK to Update_FormulaDetail;
1516 fnd_msg_pub.add_exc_msg (G_PKG_NAME, l_api_name);
1517 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
1518 FND_MSG_PUB.Count_And_Get (
1519 p_count => x_msg_count,
1520 p_data => x_msg_data );
1521 IF (l_debug = 'Y') THEN
1522 gmd_debug.put_line(' In Formula Detail pub - In OTHERS Exception Section '
1523 ||' - '
1524 ||x_return_status);
1525 END IF;
1526
1527 END Update_FormulaDetail;
1528
1529
1530 /* ============================================= */
1531 /* Procedure: */
1532 /* Delete_FormulaDetail */
1533 /* */
1534 /* DESCRIPTION: */
1535 /* This PL/SQL procedure is responsible for */
1536 /* delete a formula detail. */
1537 /* */
1538 /* HISTORY */
1539 /* 06-Nov-2001 M. Grosser BUGS 1922679, 1981755 - Modified procedure Delete_FormulaDetail */
1540 /* to not allow the deletion of a product with a valid */
1541 /* validity rule against it and to not delete the only */
1542 /* ingredient or product in a formula */
1543 /* ============================================= */
1544 PROCEDURE Delete_FormulaDetail
1545 ( p_api_version IN NUMBER
1546 ,p_init_msg_list IN VARCHAR2
1547 ,p_commit IN VARCHAR2
1548 ,p_called_from_forms IN VARCHAR2 := 'NO'
1549 ,x_return_status OUT NOCOPY VARCHAR2
1550 ,x_msg_count OUT NOCOPY NUMBER
1551 ,x_msg_data OUT NOCOPY VARCHAR2
1552 ,p_formula_detail_tbl IN formula_update_dtl_tbl_type
1553 )
1554 IS
1555 /* Local Variables definitions */
1556 l_api_name CONSTANT VARCHAR2(30) := 'DELETE_FORMULADETAIL';
1557 l_api_version CONSTANT NUMBER := 1.1;
1558 l_user_id fnd_user.user_id%TYPE := 0;
1559 l_return_val NUMBER := 0;
1560 l_item_id ic_item_mst.item_id%TYPE := 0;
1561 l_inv_uom ic_item_mst.item_um%TYPE := NULL;
1562 l_fm_matl_dtl_rec fm_matl_dtl%ROWTYPE;
1563 p_formula_detail_rec GMD_FORMULA_COMMON_PUB.formula_update_rec_type;
1564 l_count NUMBER := 0;
1565
1566 l_formula_id NUMBER;
1567
1568 /* Define Cursors */
1569 -- Bug 4603060 removed user_id cursor
1570
1571 CURSOR check_num_details(pformula_id number, pline_type number) IS
1572 SELECT count(*)
1573 FROM fm_matl_dtl
1574 WHERE formula_id = pformula_id
1575 AND line_type = pline_type;
1576
1577 CURSOR get_formula_id(vFormulaLine_id NUMBER) IS
1578 SELECT formula_id
1579 FROM fm_matl_dtl
1580 WHERE formulaline_id = vFormulaLine_id;
1581
1582 CURSOR check_validity_rules(pformula_id number, pitem_no varchar2 ) IS
1583 SELECT 1
1584 FROM gmd_recipes_b rcp,
1585 gmd_recipe_validity_rules vr,
1586 ic_item_mst it
1587 WHERE vr.delete_mark = 0
1588 AND vr.validity_rule_status < 1000
1589 AND (vr.end_date IS NULL OR vr.end_date >= SYSDATE)
1590 AND it.item_no = pitem_no
1591 AND vr.item_id = it.item_id
1592 AND vr.recipe_id = rcp.recipe_id
1593 AND rcp.formula_id = pformula_id;
1594
1595 -- Kapil ME Auto-Prod :Bug#5716318
1596 l_auto_calc VARCHAR2(1);
1597 l_auto_calc_flag VARCHAR2(1);
1598 l_org_id NUMBER;
1599
1600 CURSOR C_get_org_id (V_formula_id NUMBER) IS
1601 SELECT OWNER_ORGANIZATION_ID
1602 FROM FM_FORM_MST_B
1603 WHERE FORMULA_ID = V_formula_id;
1604
1605 CURSOR C_get_auto_parameter (V_formula_id NUMBER) IS
1606 SELECT AUTO_PRODUCT_CALC
1607 FROM FM_FORM_MST_B
1608 WHERE FORMULA_ID = V_formula_id;
1609
1610 BEGIN
1611 /* Define Savepoint */
1612 SAVEPOINT Delete_FormulaDetail;
1613
1614 /* Standard Check for API compatibility */
1615 IF NOT FND_API.Compatible_API_Call ( l_api_version ,
1616 p_api_version ,
1617 l_api_name ,
1618 G_PKG_NAME )
1619 THEN
1620 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
1621 END IF;
1622
1623 /* Initialize message list if p_init_msg_list is set to TRUE */
1624 IF FND_API.to_Boolean( p_init_msg_list ) THEN
1625 FND_MSG_PUB.initialize;
1626 END IF;
1627 /* Initialize API return status to success */
1628 x_return_status := FND_API.G_RET_STS_SUCCESS;
1629
1630 /* API body */
1631 /* 1. Does minimum validation */
1632 /* 2. Call the private API that does the database inserts/ updates */
1633
1634 IF (p_formula_detail_tbl.count = 0) THEN
1635 RAISE FND_API.G_EXC_ERROR;
1636 END IF;
1637
1638 FOR i in 1 .. p_formula_detail_tbl.count LOOP
1639
1640 x_return_status := FND_API.G_RET_STS_SUCCESS;
1641
1642 p_formula_detail_rec := p_formula_detail_tbl(i);
1643
1644 /* Check if there is a valid userid */
1645 -- Bug 4603060
1646 l_user_id := FND_GLOBAL.user_id;
1647 IF (l_user_id IS NULL) THEN
1648 FND_MESSAGE.SET_NAME('GMD', 'GMD_USER_CONTEXT_NOT_SET');
1649 FND_MSG_PUB.Add;
1650 RAISE FND_API.G_EXC_ERROR;
1651 END IF;
1652
1653 /* =================================== */
1654 /* Check if an appropriate action_code */
1655 /* has been supplied */
1656 /* ================================== */
1657 IF (p_formula_detail_rec.record_type <> 'D')THEN
1658 FND_MESSAGE.SET_NAME('GMD', 'FM_INVALID_ACTION');
1659 FND_MESSAGE.SET_TOKEN('FORMULA_NO', p_formula_detail_rec.formula_no);
1660 FND_MESSAGE.SET_TOKEN('FORMULA_VERS', p_formula_detail_rec.formula_vers);
1661 FND_MSG_PUB.Add;
1662 RAISE FND_API.G_EXC_ERROR;
1663 END IF;
1664
1665
1666 /* ============================ */
1667 /* Formulaline_id Validation */
1668 /* Must be passed and should exist */
1669 /* ============================ */
1670 IF (p_formula_detail_rec.formulaline_id IS NOT NULL) THEN /* if invalid formulaline no */
1671
1672 GMDFMVAL_PUB.get_formulaline_id(p_formula_detail_rec.formulaline_id,l_return_val);
1673 IF (l_return_val <> 0) THEN
1674 FND_MESSAGE.SET_NAME('GMD','FM_MISSING_FMLINE_ID');
1675 FND_MSG_PUB.Add;
1676 RAISE FND_API.G_EXC_ERROR;
1677 END IF;
1678 ELSIF (p_formula_detail_rec.formulaline_id IS NULL) THEN
1679 FND_MESSAGE.SET_NAME('GMD','FM_MISSING_FMLINE_ID');
1680 FND_MSG_PUB.Add;
1681 RAISE FND_API.G_EXC_ERROR;
1682 END IF;
1683
1684 /* ======================== */
1685 /* Get the formula id */
1686 /* ======================== */
1687 IF (l_debug = 'Y') THEN
1688 gmd_debug.put_line(' In Formula Detail Pub - '
1689 ||' Before formula validation - '||x_return_status);
1690 END IF;
1691
1692 IF (p_formula_detail_rec.formula_id is NULL) THEN
1693 OPEN get_formula_id(p_formula_detail_rec.formulaline_id);
1694 FETCH get_formula_id INTO l_formula_id;
1695 IF (get_formula_id%NOTFOUND) THEN
1696 FND_MESSAGE.SET_NAME('GMD', 'FM_INVFORMULANO');
1697 FND_MESSAGE.SET_TOKEN('FORMULA_NO', p_formula_detail_rec.formula_no);
1698 FND_MSG_PUB.Add;
1699 CLOSE get_formula_id;
1700 RAISE FND_API.G_EXC_ERROR;
1701 END IF;
1702 CLOSE get_formula_id;
1703 ELSE
1704 l_formula_id := p_formula_detail_rec.formula_id;
1705 END IF;
1706
1707 IF NOT GMD_COMMON_VAL.Update_Allowed('FORMULA',l_formula_id) THEN
1708 FND_MESSAGE.SET_NAME('GMD','GMD_CANNOT_UPD_ENTITY');
1709 FND_MESSAGE.SET_TOKEN('NAME', 'formula');
1710 FND_MESSAGE.SET_TOKEN('ID', l_formula_id);
1711 FND_MESSAGE.SET_TOKEN('NO', p_formula_detail_rec.formula_no);
1712 FND_MESSAGE.SET_TOKEN('VERS', p_formula_detail_rec.formula_vers);
1713 FND_MESSAGE.SET_TOKEN('STATUS',
1714 GMD_FORMULA_DETAIL_PUB.get_fm_status_meaning(l_formula_id));
1715 FND_MSG_PUB.Add;
1716 RAISE FND_API.G_EXC_ERROR;
1717 END IF;
1718
1719 /* ================================================= */
1720 /* Checked if only 1 line if an ingredient or product */
1721 /* ================================================= */
1722 IF p_formula_detail_rec.line_type in (-1,1) THEN
1723 IF (NVL(p_called_from_forms,'NO') = 'NO') THEN
1724 OPEN check_num_details(l_formula_id,p_formula_detail_rec.line_type);
1725 FETCH check_num_details INTO l_count;
1726 /* If there s only 1 ingredient or product, stop the delete */
1727 IF (l_count < 2) THEN
1728 IF p_formula_detail_rec.line_type = 1 THEN
1729 FND_MESSAGE.SET_NAME('GMD', 'GMD_MUST_HAVE_PRODUCT');
1730 ELSE
1731 FND_MESSAGE.SET_NAME('GMD', 'GMD_MUST_HAVE_INGREDIENT');
1732 END IF;
1733 FND_MSG_PUB.Add;
1734 RAISE FND_API.G_EXC_ERROR;
1735 END IF;
1736 CLOSE check_num_details;
1737
1738 /* ================================================= */
1739 /* Checked for valid validity rule if a product */
1740 /* ================================================= */
1741 IF p_formula_detail_rec.line_type = 1 THEN
1742 OPEN check_validity_rules (l_formula_id,
1743 p_formula_detail_rec.line_type);
1744 FETCH check_validity_rules INTO l_count;
1745 /* If there are valid validity rules, stop the delete */
1746 IF (check_validity_rules%FOUND) THEN
1747 FND_MESSAGE.SET_NAME('GMD', 'GMD_VALID_VALIDITY');
1748 FND_MSG_PUB.Add;
1749 RAISE FND_API.G_EXC_ERROR;
1750 END IF;
1751 CLOSE check_validity_rules;
1752 END IF;
1753 END IF; /* If not called by a form */
1754 END IF; /* If this is an ingredient or product */
1755
1756 /* Call for private API */
1757 IF (x_return_status = FND_API.G_RET_STS_SUCCESS) THEN
1758
1759 l_fm_matl_dtl_rec.formulaline_id := p_formula_detail_rec.formulaline_id;
1760 l_fm_matl_dtl_rec.formula_id := l_formula_id;
1761
1762 /* New - added this condition below by Shyam */
1763 /* Check if this formula can be changed - if this formula is
1764 On-Hold or Obsolete or Frozen or Requested for Approval -
1765 the change of this formula is prevented */
1766
1767 GMD_FORMULA_DETAIL_PVT.Delete_FormulaDetail
1768 ( p_api_version => p_api_version
1769 ,p_init_msg_list => p_init_msg_list
1770 ,p_commit => FND_API.G_FALSE
1771 ,x_return_status => x_return_status
1772 ,x_msg_count => x_msg_count
1773 ,x_msg_data => x_msg_data
1774 ,p_formula_detail_rec => l_fm_matl_dtl_rec
1775 );
1776
1777 END IF; -- When return status is sucess
1778
1779 -- Kapil ME Auto-Prod :Bug#5716318
1780 /* Calculate Product Qty after deleting a record if the Parameter is set to Yes */
1781 OPEN C_get_org_id (l_formula_id);
1782 FETCH C_get_org_id INTO l_org_id;
1783 CLOSE C_get_org_id;
1784 GMD_API_GRP.FETCH_PARM_VALUES(P_orgn_id => l_org_id,
1785 P_parm_name => 'GMD_AUTO_PROD_CALC',
1786 P_parm_value => l_auto_calc,
1787 X_return_status => X_return_status );
1788 IF l_auto_calc = 'Y' THEN
1789 OPEN C_get_auto_parameter (l_formula_id);
1790 FETCH C_get_auto_parameter INTO l_auto_calc_flag;
1791 CLOSE C_get_auto_parameter;
1792 IF l_auto_calc_flag = 'Y' THEN
1793 GMD_COMMON_VAL.Calculate_Total_Product_Qty( p_formula_id =>l_formula_id ,
1794 x_return_status => x_return_status,
1795 x_msg_count => x_msg_count,
1796 x_msg_data => x_msg_data);
1797 END IF;
1798 END IF;
1799 -- Kapil ME Auto-Prod :Bug#5716318
1800
1801 /* End of API body */
1802 /* IF delete of a line fails - Raise an exception
1803 rather than trying to deleting other lines */
1804 IF (x_return_status = FND_API.G_RET_STS_ERROR) THEN
1805 RAISE FND_API.G_EXC_ERROR;
1806 ELSIF (x_return_status = FND_API.G_RET_STS_UNEXP_ERROR) THEN
1807 RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
1808 END IF;
1809
1810 END LOOP; -- End of main delete loop
1811
1812 /* Check if p_commit is set to TRUE */
1813 IF x_return_status IN (FND_API.G_RET_STS_SUCCESS,'Q') AND
1814 (FND_API.To_Boolean( p_commit ) ) THEN
1815 Commit;
1816 END IF;
1817
1818 /* Get the message count and information */
1819 FND_MSG_PUB.Count_And_Get (
1820 p_count => x_msg_count,
1821 p_data => x_msg_data );
1822 EXCEPTION
1823 WHEN FND_API.G_EXC_ERROR THEN
1824 ROLLBACK to Delete_FormulaDetail;
1825 x_return_status := FND_API.G_RET_STS_ERROR;
1826 FND_MSG_PUB.Count_And_Get (
1827 p_count => x_msg_count,
1828 p_data => x_msg_data );
1829
1830 WHEN FND_API.G_EXC_UNEXPECTED_ERROR THEN
1831 ROLLBACK to Delete_FormulaDetail;
1832 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
1833 FND_MSG_PUB.Count_And_Get (
1834 p_count => x_msg_count,
1835 p_data => x_msg_data );
1836
1837 WHEN OTHERS THEN
1838 ROLLBACK to Delete_FormulaDetail;
1839 fnd_msg_pub.add_exc_msg (G_PKG_NAME, l_api_name);
1840 x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
1841 FND_MSG_PUB.Count_And_Get (
1842 p_count => x_msg_count,
1843 p_data => x_msg_data );
1844
1845 END Delete_FormulaDetail;
1846
1847 END GMD_FORMULA_DETAIL_PUB;