1 PACKAGE BODY PO_VAL_DISTRIBUTIONS AS
2 -- $Header: PO_VAL_DISTRIBUTIONS.plb 120.23.12020000.10 2013/05/30 17:36:44 vpeddi ship $
3
4 c_ENTITY_TYPE_DISTRIBUTION CONSTANT VARCHAR2(30) := PO_VALIDATIONS.C_ENTITY_TYPE_DISTRIBUTION;
5 c_NEW CONSTANT VARCHAR2(3) := 'NEW';
6 c_RATE CONSTANT VARCHAR2(30) := 'RATE';
7 c_FIXED_PRICE CONSTANT VARCHAR2(30) := 'FIXED PRICE';
8 c_STANDARD CONSTANT VARCHAR2(30) := 'STANDARD';
9 c_PREPAYMENT CONSTANT VARCHAR2(30) := 'PREPAYMENT'; -- <Complex Work R12>
10 c_DEST_TYPE_SHOP_FLOOR CONSTANT VARCHAR2(30) := 'SHOP FLOOR';
11 c_DEST_TYPE_EXPENSE CONSTANT VARCHAR2(30) := 'EXPENSE';
12 c_DEST_TYPE_INVENTORY CONSTANT VARCHAR2(30) :='INVENTORY';
13
14 -- Constants for column names
15 c_DISTRIBUTION_NUM CONSTANT VARCHAR2(30) := 'DISTRIBUTION_NUM';
16 c_QUANTITY_ORDERED CONSTANT VARCHAR2(30) := 'QUANTITY_ORDERED';
17 c_AMOUNT_ORDERED CONSTANT VARCHAR2(30) := 'AMOUNT_ORDERED';
18 c_END_ITEM_UNIT_NUMBER CONSTANT VARCHAR2(30) := 'END_ITEM_UNIT_NUMBER';
19 c_WIP_ENTITY_ID CONSTANT VARCHAR2(30) := 'WIP_ENTITY_ID';
20 c_WIP_OPERATION_SEQ_NUM CONSTANT VARCHAR2(30) := 'WIP_OPERATION_SEQ_NUM';
21 c_WIP_RESOURCE_SEQ_NUM CONSTANT VARCHAR2(30) := 'WIP_RESOURCE_SEQ_NUM';
22 c_AMOUNT_TO_ENCUMBER CONSTANT VARCHAR2(30) := 'AMOUNT_TO_ENCUMBER';
23 c_BUDGET_ACCOUNT_ID CONSTANT VARCHAR2(30) := 'BUDGET_ACCOUNT_ID';
24 c_CODE_COMBINATION_ID CONSTANT VARCHAR2(30) := 'CODE_COMBINATION_ID';
25 c_GL_ENCUMBERED_DATE CONSTANT VARCHAR2(30) := 'GL_ENCUMBERED_DATE';
26 c_UNENCUMBERED_AMOUNT CONSTANT VARCHAR2(30) := 'UNENCUMBERED_AMOUNT';
27 c_AWARD_ID CONSTANT VARCHAR2(30) := 'AWARD_ID';
28
29 /* CLM Partial Funding Changes -- START */
30 c_FUNDED_VALUE CONSTANT VARCHAR2(30) := 'FUNDED_VALUE';
31 c_QUANTITY_FUNDED CONSTANT VARCHAR2(30) := 'c_QUANTITY_FUNDED';
32 c_AMOUNT_FUNDED CONSTANT VARCHAR2(30) := 'AMOUNT_FUNDED';
33 /* CLM Partial Funding Changes -- END */
34
35 --CLM PDOI Integration
36 c_CLM_OPTION_INDICATOR CONSTANT VARCHAR2(30) := 'CLM_OPTION_INDICATOR';
37 c_GROUP_LINE_ID VARCHAR2(30) := 'GROUP_LINE_ID';
38 c_CLM_DEFENCE_FUNDING VARCHAR2(30) := 'CLM_DEFENCE_FUNDING';
39 -- The module base for this package.
40 D_PACKAGE_BASE CONSTANT VARCHAR2(50) :=
41 PO_LOG.get_package_base('PO_VAL_DISTRIBUTIONS');
42
43 -- The module base for the subprogram.
44 D_dist_num_unique CONSTANT VARCHAR2(100) :=
45 PO_LOG.get_subprogram_base(D_PACKAGE_BASE,'dist_num_unique');
46
47 -- The module base for the subprogram.
48 D_dist_num_gt_zero CONSTANT VARCHAR2(100) :=
49 PO_LOG.get_subprogram_base(D_PACKAGE_BASE,'dist_num_gt_zero');
50
51 -- The module base for the subprogram.
52 D_quantity_gt_zero CONSTANT VARCHAR2(100) :=
53 PO_LOG.get_subprogram_base(D_PACKAGE_BASE,'quantity_gt_zero');
54
55 -- The module base for the subprogram.
56 D_amount_gt_zero CONSTANT VARCHAR2(100) :=
57 PO_LOG.get_subprogram_base(D_PACKAGE_BASE,'amount_gt_zero');
58
59 -- The module base for the subprogram.
60 D_check_fv_validations CONSTANT VARCHAR2(100) :=
61 PO_LOG.get_subprogram_base(D_PACKAGE_BASE,'check_fv_validations');
62
63 D_check_proj_rel_validations CONSTANT VARCHAR2(100) :=
64 PO_LOG.get_subprogram_base(D_PACKAGE_BASE,'check_proj_related_validations');
65
66 -- <Complex Work R12 Start>: Combine billed/del checks into exec checks
67 -- The module base for the subprogram.
68 D_quantity_ge_quantity_exec CONSTANT VARCHAR2(100) :=
69 PO_LOG.get_subprogram_base(D_PACKAGE_BASE,'quantity_ge_quantity_exec');
70
71 D_amount_ge_amount_exec CONSTANT VARCHAR2(100) :=
72 PO_LOG.get_subprogram_base(D_PACKAGE_BASE,'amount_ge_amount_exec');
73
74 -- <Complex Work R12 End>
75
76 D_pjm_unit_number_effective CONSTANT VARCHAR2(100) :=
77 PO_LOG.get_subprogram_base(D_PACKAGE_BASE,'pjm_unit_number_effective');
78
79 D_oop_enter_all_fields CONSTANT VARCHAR2(100) :=
80 PO_LOG.get_subprogram_base(D_PACKAGE_BASE, 'oop_enter_all_fields');
81
82 D_amount_to_encumber_ge_zero CONSTANT VARCHAR2(100) :=
83 PO_LOG.get_subprogram_base(D_PACKAGE_BASE, 'amount_to_encumber_ge_zero');
84 D_budget_account_id_not_null CONSTANT VARCHAR2(100) :=
85 PO_LOG.get_subprogram_base(D_PACKAGE_BASE, 'budget_account_id_not_null');
86 D_gl_encumbered_date_not_null CONSTANT VARCHAR2(100) :=
87 PO_LOG.get_subprogram_base(D_PACKAGE_BASE, 'gl_encumbered_date_not_null');
88 D_unencum_amt_le_amt_to_encum CONSTANT VARCHAR2(100) :=
89 PO_LOG.get_subprogram_base(D_PACKAGE_BASE, 'unencum_amt_le_amt_to_encum');
90
91 /* CLM Partial Funding Changes -- START */
92 D_funded_value_ge_zero CONSTANT VARCHAR2(100) :=
93 PO_LOG.get_subprogram_base(D_PACKAGE_BASE, 'funded_value_ge_zero');
94 D_funded_val_le_tot_order_val CONSTANT VARCHAR2(100) :=
95 PO_LOG.get_subprogram_base(D_PACKAGE_BASE, 'funded_val_le_tot_order_val');
96 D_qty_funded_ge_exc_qty CONSTANT VARCHAR2(100) :=
97 PO_LOG.get_subprogram_base(D_PACKAGE_BASE, 'qty_funded_ge_exc_qty');
98 D_amount_funded_ge_exc_amount CONSTANT VARCHAR2(100) :=
99 PO_LOG.get_subprogram_base(D_PACKAGE_BASE, 'amount_funded_ge_exc_amount');
100 D_funded_value_gt_backing_req CONSTANT VARCHAR2(100) :=
101 PO_LOG.get_subprogram_base(D_PACKAGE_BASE, 'funded_value_gt_backing_req');
102 /* CLM Partial Funding Changes -- END */
103
104 -- CLM-LnSc
105 D_funded_val_gt_req_funds_rmn CONSTANT VARCHAR2(100) :=
106 PO_LOG.get_subprogram_base(D_PACKAGE_BASE, 'funded_val_gt_req_funds_rmn');
107
108 --CLM PDOI Integration
109 D_check_clin_slin_funding CONSTANT VARCHAR2(100) :=
110 PO_LOG.get_subprogram_base(D_PACKAGE_BASE, 'check_clin_slin_funding');
111 D_validate_defence_funding CONSTANT VARCHAR2(100) :=
112 PO_LOG.get_subprogram_base(D_PACKAGE_BASE, 'validate_defence_funding');
113 D_validate_option_distribution CONSTANT VARCHAR2(100) :=
114 PO_LOG.get_subprogram_base(D_PACKAGE_BASE, 'validate_option_distribution');
115 D_check_dist_val_inc_for_par CONSTANT VARCHAR2(100) :=
116 PO_LOG.get_subprogram_base(D_PACKAGE_BASE, 'check_dist_val_inc_for_par');
117
118 -----------------------------------------------------------------------------
119 -- Validates that all the distribution numbers for a given shipment are
120 -- unique.
121 -----------------------------------------------------------------------------
122 -- Assumption:
123 -- All of the unposted distribution data will be passed in
124 -- to this routine in order to get accurate results.
125 PROCEDURE dist_num_unique(
126 p_dist_id_tbl IN PO_TBL_NUMBER
127 , p_line_loc_id_tbl IN PO_TBL_NUMBER
128 , p_dist_num_tbl IN PO_TBL_NUMBER
129 , p_par_draft_id_tbl IN PO_TBL_VARCHAR4000 DEFAULT NULL --<PAR Project>
130 , p_draft_id_tbl IN PO_TBL_NUMBER --<PAR Project>
131 , x_result_set_id IN OUT NOCOPY NUMBER
132 , x_result_type OUT NOCOPY VARCHAR2
133 )
134 IS
135 BEGIN
136 PO_VALIDATION_HELPER.child_num_unique(
137 p_calling_module => D_dist_num_unique
138 , p_entity_type => c_entity_type_DISTRIBUTION
139 , p_entity_id_tbl => p_dist_id_tbl
140 , p_parent_id_tbl => p_line_loc_id_tbl
141 , p_entity_num_tbl => p_dist_num_tbl
142 , p_par_draft_id_tbl => p_par_draft_id_tbl -- <PAR Project>
143 , p_draft_id_tbl => p_draft_id_tbl --<PAR Project>
144 , x_result_set_id => x_result_set_id
145 , x_result_type => x_result_type
146 );
147
148 END dist_num_unique;
149
150
151 -----------------------------------------------------------------------------
152 -- Checks for null or non-positive distribution numbers.
153 -----------------------------------------------------------------------------
154 PROCEDURE dist_num_gt_zero(
155 p_dist_id_tbl IN PO_TBL_NUMBER
156 , p_dist_num_tbl IN PO_TBL_NUMBER
157 , x_results IN OUT NOCOPY PO_VALIDATION_RESULTS_TYPE
158 , x_result_type OUT NOCOPY VARCHAR2
159 )
160 IS
161 BEGIN
162
163 PO_VALIDATION_HELPER.greater_than_zero(
164 p_calling_module => D_dist_num_gt_zero
165 , p_null_allowed_flag => PO_CORE_S.g_parameter_NO
166 , p_value_tbl => p_dist_num_tbl
167 , p_entity_id_tbl => p_dist_id_tbl
168 , p_entity_type => c_ENTITY_TYPE_DISTRIBUTION
169 , p_column_name => c_DISTRIBUTION_NUM
170 , p_message_name => PO_MESSAGE_S.PO_ALL_ENTER_VALUE_GT_ZERO
171 , x_results => x_results
172 , x_result_type => x_result_type
173 );
174
175 END dist_num_gt_zero;
176
177
178 -----------------------------------------------------------------------------
179 -- Validates that quantity is not null and greater than zero if it is not
180 -- a Rate or Fixed Price line.
181 -----------------------------------------------------------------------------
182 PROCEDURE quantity_gt_zero(
183 p_dist_id_tbl IN PO_TBL_NUMBER
184 , p_qty_ordered_tbl IN PO_TBL_NUMBER
185 , p_value_basis_tbl IN PO_TBL_VARCHAR30 -- <Complex Work R12>
186 , p_cost_constraint_tbl IN PO_TBL_VARCHAR30
187 , x_results IN OUT NOCOPY PO_VALIDATION_RESULTS_TYPE
188 , x_result_type OUT NOCOPY VARCHAR2
189 , p_header_id_tbl IN PO_TBL_NUMBER --<Bug 15871378>
190 )
191 IS
192 l_input_size NUMBER;
193 l_clm_info_flag_tbl PO_TBL_VARCHAR1;
194 BEGIN
195
196 l_input_size := p_dist_id_tbl.COUNT;
197
198 l_clm_info_flag_tbl := PO_TBL_VARCHAR1();
199 l_clm_info_flag_tbl.extend(l_input_size);
200
201 FOR i IN 1 .. l_input_size LOOP
202 l_clm_info_flag_tbl(i) := 'N';
203 END LOOP;
204
205 PO_VALIDATION_HELPER.gt_zero_order_type_filter(
206 p_calling_module => D_quantity_gt_zero
207 , p_value_tbl => p_qty_ordered_tbl
208 , p_entity_id_tbl => p_dist_id_tbl
209 , p_order_type_lookup_code_tbl => p_value_basis_tbl -- <Complex Work R12>
210 , p_clm_info_flag_tbl => l_clm_info_flag_tbl
211 , p_cost_constraint_tbl => p_cost_constraint_tbl
212 , p_check_quantity_types_flag => PO_CORE_S.g_parameter_YES
213 , p_entity_type => c_ENTITY_TYPE_DISTRIBUTION
214 , p_column_name => c_QUANTITY_ORDERED
215 , x_results => x_results
216 , x_result_type => x_result_type
217 , p_header_id_tbl => p_header_id_tbl --<Bug 15871378>
218 );
219
220 END quantity_gt_zero;
221
222
223 -- <Complex Work R12 Start>
224 -- Combined quantity_ge_quantity_billed and quantity_ge_quantity_del into
225 -- quantity_ge_quantity_exec
226
227 -----------------------------------------------------------------------------
228 -- Validates that quantity is greater than or equal to quantity billed,
229 -- delivered and financed.
230 -- This check is only performed if quantity is being reduced below the
231 -- current transaction quantity, since over-billing/delivery is allowed.
232 -----------------------------------------------------------------------------
233 PROCEDURE quantity_ge_quantity_exec(
234 p_dist_id_tbl IN PO_TBL_NUMBER
235 , p_dist_type_tbl IN PO_TBL_VARCHAR30
236 , p_qty_ordered_tbl IN PO_TBL_NUMBER
237 , x_result_set_id IN OUT NOCOPY NUMBER
238 , x_result_type OUT NOCOPY VARCHAR2
239 )
240 IS
241 d_mod CONSTANT VARCHAR2(100) := D_quantity_ge_quantity_exec;
242 BEGIN
243
244 IF PO_LOG.d_proc THEN
245 PO_LOG.proc_begin(d_mod,'p_dist_id_tbl',p_dist_id_tbl);
246 PO_LOG.proc_begin(d_mod,'p_dist_type_tbl',p_dist_type_tbl);
247 PO_LOG.proc_begin(d_mod,'p_qty_ordered_tbl',p_qty_ordered_tbl);
248 PO_LOG.proc_begin(d_mod,'x_result_set_id',x_result_set_id);
249 END IF;
250
251 IF (x_result_set_id IS NULL) THEN
252 x_result_set_id := PO_VALIDATIONS.next_result_set_id();
253 END IF;
254
255 FORALL i IN 1 .. p_dist_id_tbl.COUNT
256 INSERT INTO PO_VALIDATION_RESULTS_GT
257 ( result_set_id
258 , entity_type
259 , entity_id
260 , column_name
261 , column_val
262 , message_name
263 --PBWC Message Change Impact: Adding a token
264 , token1_name
265 , token1_value
266 )
267 SELECT
268 x_result_set_id
269 , c_ENTITY_TYPE_DISTRIBUTION
270 , p_dist_id_tbl(i)
271 , C_QUANTITY_ORDERED
272 , TO_CHAR(p_qty_ordered_tbl(i))
273 , (CASE
274 WHEN NVL(POD.quantity_delivered, 0) >
275 GREATEST(NVL(POD.quantity_billed, 0), NVL(POD.quantity_financed, 0))
276 THEN PO_MESSAGE_S.PO_PO_QTY_ORD_LT_QTY_DEL_NA
277 ELSE PO_MESSAGE_S.PO_PO_QTY_ORD_LT_QTY_BILLED_NA
278 END
279 )
280 --PBWC Message Change Impact: Adding a token
281 , (CASE
282 WHEN NVL(POD.quantity_delivered, 0) >
283 GREATEST(NVL(POD.quantity_billed, 0), NVL(POD.quantity_financed, 0))
284 THEN PO_MESSAGE_S.c_QTY_DEL_token
285 ELSE PO_MESSAGE_S.c_QTY_BILLED_token
286 END
287 )
288 , (CASE
289 WHEN NVL(POD.quantity_delivered, 0) >
290 GREATEST(NVL(POD.quantity_billed, 0), NVL(POD.quantity_financed, 0))
291 THEN TO_CHAR(POD.quantity_delivered)
292 ELSE TO_CHAR(POD.quantity_billed)
293 END
294 )
295 FROM
296 PO_DISTRIBUTIONS_ALL POD
297 WHERE
298 POD.po_distribution_id = p_dist_id_tbl(i)
299 AND p_dist_type_tbl(i) IN (c_STANDARD, c_PREPAYMENT) -- <Complex Work R12>
300 -- Quantity is being reduced below the current transaction quantity:
301 AND p_qty_ordered_tbl(i) < POD.quantity_ordered
302 AND p_qty_ordered_tbl(i) < -- <Complex Work R12>
303 GREATEST(NVL(POD.quantity_delivered, 0),
304 NVL(POD.quantity_billed, 0),
305 NVL(POD.quantity_financed, 0))
306 ;
307
308 IF (SQL%ROWCOUNT > 0) THEN
309 x_result_type := PO_VALIDATIONS.c_result_type_FAILURE;
310 ELSE
311 x_result_type := PO_VALIDATIONS.c_result_type_SUCCESS;
312 END IF;
313
314 IF PO_LOG.d_proc THEN
315 PO_VALIDATIONS.log_validation_results_gt(d_mod,9,x_result_set_id);
316 PO_LOG.proc_end(d_mod,'x_result_type',x_result_type);
317 PO_LOG.proc_end(d_mod,'x_result_set_id',x_result_set_id);
318 END IF;
319
320 EXCEPTION
321 WHEN OTHERS THEN
322 IF PO_LOG.d_exc THEN
323 PO_LOG.exc(d_mod,0,NULL);
324 END IF;
325 RAISE;
326
327 END quantity_ge_quantity_exec;
328
329 -- <Complex Work R12 End>
330
331 -----------------------------------------------------------------------------
332 -- Validates that amount is not null and greater than zero if the line is
333 -- Rate or Fixed Price.
334 -----------------------------------------------------------------------------
335 PROCEDURE amount_gt_zero(
336 p_dist_id_tbl IN PO_TBL_NUMBER
337 , p_amt_ordered_tbl IN PO_TBL_NUMBER
338 , p_value_basis_tbl IN PO_TBL_VARCHAR30 -- <Complex Work R12>
339 , p_cost_constraint_tbl IN PO_TBL_VARCHAR30
340 , x_results IN OUT NOCOPY PO_VALIDATION_RESULTS_TYPE
341 , x_result_type OUT NOCOPY VARCHAR2
342 , p_header_id_tbl IN PO_TBL_NUMBER --<Bug 15871378>
343 )
344 IS
345 l_input_size NUMBER;
346 l_clm_info_flag_tbl PO_TBL_VARCHAR1;
347 BEGIN
348
349 l_input_size := p_dist_id_tbl.COUNT;
350
351 l_clm_info_flag_tbl := PO_TBL_VARCHAR1();
352 l_clm_info_flag_tbl.extend(l_input_size);
353
354 FOR i IN 1 .. l_input_size LOOP
355 l_clm_info_flag_tbl(i) := 'N';
356 END LOOP;
357
358 PO_VALIDATION_HELPER.gt_zero_order_type_filter(
359 p_calling_module => D_amount_gt_zero
360 , p_value_tbl => p_amt_ordered_tbl
361 , p_entity_id_tbl => p_dist_id_tbl
362 , p_order_type_lookup_code_tbl => p_value_basis_tbl -- <Complex Work R12>
363 , p_clm_info_flag_tbl => l_clm_info_flag_tbl
364 , p_cost_constraint_tbl => p_cost_constraint_tbl
365 , p_check_quantity_types_flag => PO_CORE_S.g_parameter_NO
366 , p_entity_type => c_ENTITY_TYPE_DISTRIBUTION
367 , p_column_name => c_AMOUNT_ORDERED
368 , x_results => x_results
369 , x_result_type => x_result_type
370 , p_header_id_tbl => p_header_id_tbl --<Bug 15871378>
371 );
372
373 END amount_gt_zero;
374
375 -- <Complex Work R12 Start>
376 -- Combined amount_ge_amount_billed and amount_ge_amount_del into
377 -- amount_ge_amount_exec
378
379 -----------------------------------------------------------------------------
380 -- Validates that amount is greater than or equal to
381 -- amount billed, amount financed, and amount delivered.
382 -- This check is only performed if amount is being reduced below the
383 -- current transaction amount, since over-delivery/billing is allowed.
384 -----------------------------------------------------------------------------
385 PROCEDURE amount_ge_amount_exec(
386 p_dist_id_tbl IN PO_TBL_NUMBER
387 , p_dist_type_tbl IN PO_TBL_VARCHAR30
388 , p_amt_ordered_tbl IN PO_TBL_NUMBER
389 , x_result_set_id IN OUT NOCOPY NUMBER
390 , x_result_type OUT NOCOPY VARCHAR2
391 )
392 IS
393 d_mod CONSTANT VARCHAR2(100) := D_amount_ge_amount_exec;
394 BEGIN
395
396 IF PO_LOG.d_proc THEN
397 PO_LOG.proc_begin(d_mod,'p_dist_id_tbl',p_dist_id_tbl);
398 PO_LOG.proc_begin(d_mod,'p_dist_type_tbl',p_dist_type_tbl);
399 PO_LOG.proc_begin(d_mod,'p_amt_ordered_tbl',p_amt_ordered_tbl);
400 PO_LOG.proc_begin(d_mod,'x_result_set_id',x_result_set_id);
401 END IF;
402
403 IF (x_result_set_id IS NULL) THEN
404 x_result_set_id := PO_VALIDATIONS.next_result_set_id();
405 END IF;
406
407 FORALL i IN 1 .. p_dist_id_tbl.COUNT
408 INSERT INTO PO_VALIDATION_RESULTS_GT
409 ( result_set_id
410 , entity_type
411 , entity_id
412 , column_name
413 , column_val
414 , message_name
415 --PBWC Message Change Impact: Adding a token
416 , token1_name
417 , token1_value
418 )
419 SELECT
420 x_result_set_id
421 , c_ENTITY_TYPE_DISTRIBUTION
422 , p_dist_id_tbl(i)
423 , C_AMOUNT_ORDERED
424 , TO_CHAR(p_amt_ordered_tbl(i))
425 , (CASE
426 WHEN NVL(POD.amount_delivered, 0) >
427 GREATEST(NVL(POD.amount_billed, 0), NVL(POD.amount_financed, 0))
428 THEN PO_MESSAGE_S.PO_PO_AMT_ORD_LT_AMT_DEL_NA
429 ELSE PO_MESSAGE_S.PO_PO_AMT_ORD_LT_AMT_BILLED_NA
430 END
431 )
432 --PBWC Message Change Impact: Adding a token
433 , (CASE
434 WHEN NVL(POD.amount_delivered, 0) >
435 GREATEST(NVL(POD.amount_billed, 0), NVL(POD.amount_financed, 0))
436 THEN PO_MESSAGE_S.c_AMT_DEL_token
437 ELSE PO_MESSAGE_S.c_AMT_BILLED_token
438 END
439 )
440 , (CASE
441 WHEN NVL(POD.amount_delivered, 0) >
442 GREATEST(NVL(POD.amount_billed, 0), NVL(POD.amount_financed, 0))
443 THEN TO_CHAR(POD.amount_delivered)
444 ELSE TO_CHAR(POD.amount_billed)
445 END
446 )
447 FROM
448 PO_DISTRIBUTIONS_ALL POD
449 WHERE
450 POD.po_distribution_id = p_dist_id_tbl(i)
451 AND p_dist_type_tbl(i) IN (c_STANDARD, c_PREPAYMENT) -- <Complex Work R12>
452 -- Amount is being reduced below the current transaction amount:
453 AND p_amt_ordered_tbl(i) < POD.amount_ordered
454 AND p_amt_ordered_tbl(i) < GREATEST(NVL(POD.amount_delivered, 0),
455 NVL(POD.amount_financed, 0),
456 NVL(POD.amount_billed, 0));
457
458 IF (SQL%ROWCOUNT > 0) THEN
459 x_result_type := PO_VALIDATIONS.c_result_type_FAILURE;
460 ELSE
461 x_result_type := PO_VALIDATIONS.c_result_type_SUCCESS;
462 END IF;
463
464 IF PO_LOG.d_proc THEN
465 PO_VALIDATIONS.log_validation_results_gt(d_mod,9,x_result_set_id);
466 PO_LOG.proc_end(d_mod,'x_result_type',x_result_type);
467 PO_LOG.proc_end(d_mod,'x_result_set_id',x_result_set_id);
468 END IF;
469
470 EXCEPTION
471 WHEN OTHERS THEN
472 IF PO_LOG.d_exc THEN
473 PO_LOG.exc(d_mod,0,NULL);
474 END IF;
475 RAISE;
476
477 END amount_ge_amount_exec;
478
479 -- <Complex Work R12 End>
480
481
482 ------------------------------------------------------------------------
483 -- Validates that if the item is unit number effective, then the unit number
484 -- on the distribution is not null.
485 --
486 -- Displays the warning 'UEFF-UNIT NUMBER REQUIRED' if all the following are true:
487 -- 1) Item on the line is unit number effective
488 -- 2) Unit number field at the distribution level is null
489 --
490 -- Where clauses derived from PJM_UNIT_EFF.UNIT_EFFECTIVE_ITEM
491 ------------------------------------------------------------------------
492 PROCEDURE pjm_unit_number_effective(
493 p_dist_id_tbl IN PO_TBL_NUMBER
494 , p_end_item_unit_number_tbl IN PO_TBL_VARCHAR30
495 , p_item_id_tbl IN PO_TBL_NUMBER
496 , p_ship_to_org_id_tbl IN PO_TBL_NUMBER
497 -- Bug# 4338241: Checking if it is inventory and PJM is installed
498 , p_destination_type_code_tbl IN PO_TBL_VARCHAR30
499 , x_results IN OUT NOCOPY PO_VALIDATION_RESULTS_TYPE
500 , x_result_type OUT NOCOPY VARCHAR2
501 )
502 IS
503 d_mod CONSTANT VARCHAR2(100) := D_pjm_unit_number_effective;
504
505 l_unit_number_effective VARCHAR2(1);
506 l_results_count NUMBER;
507 BEGIN
508
509 IF PO_LOG.d_proc THEN
510 PO_LOG.proc_begin(d_mod,'p_dist_id_tbl',p_dist_id_tbl);
511 PO_LOG.proc_begin(d_mod,'p_end_item_unit_number_tbl',p_end_item_unit_number_tbl);
512 PO_LOG.proc_begin(d_mod,'p_item_id_tbl',p_item_id_tbl);
513 PO_LOG.proc_begin(d_mod,'p_ship_to_org_id_tbl',p_ship_to_org_id_tbl);
514 PO_LOG.log(PO_LOG.c_PROC_BEGIN,d_mod,NULL,'x_results',x_results);
515 END IF;
516
517 IF (x_results IS NULL) THEN
518 x_results := PO_VALIDATION_RESULTS_TYPE.new_instance();
519 END IF;
520
521 l_results_count := x_results.result_type.COUNT;
522
523 FOR i IN 1 .. p_dist_id_tbl.COUNT LOOP
524
525 -- Bug# 4338241
526 -- Do this validation only if PJM is installed and
527 -- destination type is not EXPENSE
528 -- If the unit number field at the distributions level is null
529 -- Then check if the item and org are unit number effective
530
531 -- Bug 5193851
532 -- Changed the check po_core_s.get_product_install_status('PJM') = 'Y'
533 -- to po_core_s.get_product_install_status('PJM') = 'I'
534 IF (po_core_s.get_product_install_status('PJM') = 'I' AND
535 p_destination_type_code_tbl(i) <> c_DEST_TYPE_EXPENSE AND
536 p_end_item_unit_number_tbl(i) IS NULL) THEN
537
538 l_unit_number_effective :=
539 PO_PROJECT_DETAILS_SV.pjm_unit_eff_item(p_item_id_tbl(i),p_ship_to_org_id_tbl(i));
540
541 IF (l_unit_number_effective = 'Y') THEN
542
543 x_results.add_result(
544 p_entity_type => c_ENTITY_TYPE_DISTRIBUTION
545 , p_entity_id => p_dist_id_tbl(i)
546 , p_column_name => c_END_ITEM_UNIT_NUMBER
547 , p_message_name => PO_MESSAGE_S.PO_ALL_NOT_NULL -- Bug 5193851 - Changed the message
548 );
549
550 END IF;
551
552 END IF;
553
554 END LOOP;
555
556 IF (l_results_count < x_results.result_type.COUNT) THEN
557 x_result_type := PO_VALIDATIONS.c_result_type_FAILURE;
558 ELSE
559 x_result_type := PO_VALIDATIONS.c_result_type_SUCCESS;
560 END IF;
561
562 IF PO_LOG.d_proc THEN
563 PO_LOG.proc_end(d_mod,'x_result_type',x_result_type);
564 PO_LOG.log(PO_LOG.c_PROC_END,d_mod,NULL,'x_results',x_results);
565 END IF;
566
567 EXCEPTION
568 WHEN OTHERS THEN
569 IF PO_LOG.d_exc THEN
570 PO_LOG.exc(d_mod,0,NULL);
571 END IF;
572 RAISE;
573
574 END pjm_unit_number_effective;
575
576 PROCEDURE oop_enter_all_fields(
577 p_dist_id_tbl IN PO_TBL_NUMBER
578 , p_line_line_type_id_tbl IN PO_TBL_NUMBER
579 , p_wip_entity_id_tbl IN PO_TBL_NUMBER
580 , p_wip_line_id_tbl IN PO_TBL_NUMBER
581 , p_wip_operation_seq_num_tbl IN PO_TBL_NUMBER
582 , p_destination_type_code_tbl IN PO_TBL_VARCHAR30
583 , p_wip_resource_seq_num_tbl IN PO_TBL_NUMBER
584 , x_results IN OUT NOCOPY PO_VALIDATION_RESULTS_TYPE
585 , x_result_type OUT NOCOPY VARCHAR2
586 )
587 IS
588 d_mod CONSTANT VARCHAR2(100) := D_oop_enter_all_fields;
589
590 l_results_count NUMBER;
591 l_outside_operation_flag VARCHAR2(1);
592 BEGIN
593
594 IF PO_LOG.d_proc THEN
595 PO_LOG.proc_begin(d_mod,'p_dist_id_tbl',p_dist_id_tbl);
596 PO_LOG.proc_begin(d_mod,'p_line_line_type_id_tbl',p_line_line_type_id_tbl);
597 PO_LOG.proc_begin(d_mod,'p_wip_entity_id_tbl',p_wip_entity_id_tbl);
598 PO_LOG.proc_begin(d_mod,'p_wip_line_id_tbl',p_wip_line_id_tbl);
599 PO_LOG.proc_begin(d_mod,'p_wip_operation_seq_num_tbl',p_wip_operation_seq_num_tbl);
600 PO_LOG.proc_begin(d_mod,'p_destination_type_code_tbl',p_destination_type_code_tbl);
601 PO_LOG.proc_begin(d_mod,'p_wip_resource_seq_num_tbl',p_wip_resource_seq_num_tbl);
602 PO_LOG.log(PO_LOG.c_PROC_BEGIN,d_mod,NULL,'x_results',x_results);
603 END IF;
604
605 IF (x_results IS NULL) THEN
606 x_results := PO_VALIDATION_RESULTS_TYPE.new_instance();
607 END IF;
608
609 l_results_count := x_results.result_type.COUNT;
610
611 FOR i IN 1 .. p_dist_id_tbl.COUNT LOOP
612
613 -- Get outside operation flag
614 SELECT outside_operation_flag
615 INTO l_outside_operation_flag
616 FROM po_line_types
617 WHERE line_type_id = p_line_line_type_id_tbl(i);
618
619 IF (p_destination_type_code_tbl(i) = c_DEST_TYPE_SHOP_FLOOR)
620 THEN
621 IF (p_wip_entity_id_tbl(i) IS NULL
622 AND p_wip_line_id_tbl(i) IS NULL)
623 THEN
624 x_results.add_result(
625 p_entity_type => c_ENTITY_TYPE_DISTRIBUTION
626 , p_entity_id => p_dist_id_tbl(i)
627 , p_column_name => c_WIP_ENTITY_ID
628 , p_message_name => PO_MESSAGE_S.PO_OOP_ENTER_ALL_FIELDS
629 );
630 END IF;
631
632 IF (p_wip_operation_seq_num_tbl(i) IS NULL)
633 THEN
634 x_results.add_result(
635 p_entity_type => c_ENTITY_TYPE_DISTRIBUTION
636 , p_entity_id => p_dist_id_tbl(i)
637 , p_column_name => c_WIP_OPERATION_SEQ_NUM
638 , p_message_name => PO_MESSAGE_S.PO_OOP_ENTER_ALL_FIELDS
639 );
640 END IF;
641
642 -- BR says that if WIP line id is not null,
643 -- then assembly cannot be null.
644 --
645 -- Assembly is not stored in PO tables, but if one chooses
646 -- an assembly, then one must also choose a job. Therefore,
647 -- we check here if the job column is null instead.
648 IF (p_wip_line_id_tbl(i) IS NOT NULL
649 AND p_wip_entity_id_tbl(i) IS NULL)
650 THEN
651 x_results.add_result(
652 p_entity_type => c_ENTITY_TYPE_DISTRIBUTION
653 , p_entity_id => p_dist_id_tbl(i)
654 , p_column_name => c_WIP_ENTITY_ID
655 , p_message_name => PO_MESSAGE_S.PO_OOP_ENTER_ALL_FIELDS
656 );
657 END IF;
658
659 -- If OSP line, then also validate that resource sequence is not null
660 IF (l_outside_operation_flag = 'Y'
661 AND p_wip_resource_seq_num_tbl(i) IS NULL)
662 THEN
663 x_results.add_result(
664 p_entity_type => c_ENTITY_TYPE_DISTRIBUTION
665 , p_entity_id => p_dist_id_tbl(i)
666 , p_column_name => c_WIP_RESOURCE_SEQ_NUM
667 , p_message_name => PO_MESSAGE_S.PO_OOP_ENTER_ALL_FIELDS
668 );
669 END IF;
670 END IF; -- IF (p_destination_type_code_tbl(i) = c_DEST_TYPE_SHOP_FLOOR)
671
672 END LOOP;
673
674 IF (l_results_count < x_results.result_type.COUNT) THEN
675 x_result_type := PO_VALIDATIONS.c_result_type_FAILURE;
676 ELSE
677 x_result_type := PO_VALIDATIONS.c_result_type_SUCCESS;
678 END IF;
679
680 IF PO_LOG.d_proc THEN
681 PO_LOG.proc_end(d_mod,'x_result_type',x_result_type);
682 PO_LOG.log(PO_LOG.c_PROC_END,d_mod,NULL,'x_results',x_results);
683 END IF;
684
685 EXCEPTION
686 WHEN OTHERS THEN
687 IF PO_LOG.d_exc THEN
688 PO_LOG.exc(d_mod,0,NULL);
689 END IF;
690 RAISE;
691
692 END oop_enter_all_fields;
693
694
695 -------------------------------------------------------------------------
696 -- Check that unencumbered amount is less than or equal to amount to
697 -- encumber.
698 -- Agreements only.
699 -------------------------------------------------------------------------
700 PROCEDURE unencum_amt_le_amt_to_encum(
701 p_dist_id_tbl IN PO_TBL_NUMBER
702 , p_amount_to_encumber_tbl IN PO_TBL_NUMBER
703 , p_unencumbered_amount_tbl IN PO_TBL_NUMBER
704 , x_results IN OUT NOCOPY PO_VALIDATION_RESULTS_TYPE
705 , x_result_type OUT NOCOPY VARCHAR2
706 )
707 IS
708 BEGIN
709
710 PO_VALIDATION_HELPER.num1_less_or_equal_num2(
711 p_calling_module => D_unencum_amt_le_amt_to_encum
712 , p_num1_tbl => p_unencumbered_amount_tbl
713 , p_num2_tbl => p_amount_to_encumber_tbl
714 , p_entity_id_tbl => p_dist_id_tbl
715 , p_entity_type => c_entity_type_DISTRIBUTION
716 , p_column_name => c_AMOUNT_TO_ENCUMBER
717 , p_message_name => PO_MESSAGE_S.PO_AMT_TO_ENCUM_LT_UNENCUM
718 , x_results => x_results
719 , x_result_type => x_result_type
720 );
721
722 END unencum_amt_le_amt_to_encum;
723
724 -----------------------------------------------------------------------------
725 -- Checks that the Amount To Encumber is not null and >= 0.
726 -- Agreements only.
727 -----------------------------------------------------------------------------
728 PROCEDURE amount_to_encumber_ge_zero(
729 p_dist_id_tbl IN PO_TBL_NUMBER
730 , p_amount_to_encumber_tbl IN PO_TBL_NUMBER
731 , x_results IN OUT NOCOPY PO_VALIDATION_RESULTS_TYPE
732 , x_result_type OUT NOCOPY VARCHAR2
733 )
734 IS
735 BEGIN
736
737 PO_VALIDATION_HELPER.greater_or_equal_zero(
738 p_calling_module => D_amount_to_encumber_ge_zero
739 , p_null_allowed_flag => PO_CORE_S.g_parameter_NO
740 , p_value_tbl => p_amount_to_encumber_tbl
741 , p_entity_id_tbl => p_dist_id_tbl
742 , p_entity_type => c_ENTITY_TYPE_DISTRIBUTION
743 , p_column_name => c_AMOUNT_TO_ENCUMBER
744 , p_message_name => PO_MESSAGE_S.PO_ALL_ENTER_VALUE_GE_ZERO
745 , x_results => x_results
746 , x_result_type => x_result_type
747 );
748
749 END amount_to_encumber_ge_zero;
750
751
752 -------------------------------------------------------------------------------
753 -- Ensures that the Budget Account is not null.
754 -- Agreements only.
755 -------------------------------------------------------------------------------
756 PROCEDURE budget_account_id_not_null(
757 p_dist_id_tbl IN PO_TBL_NUMBER
758 , p_budget_account_id_tbl IN PO_TBL_NUMBER
759 , x_results IN OUT NOCOPY PO_VALIDATION_RESULTS_TYPE
760 , x_result_type OUT NOCOPY VARCHAR2
761 )
762 IS
763 BEGIN
764
765 PO_VALIDATION_HELPER.not_null(
766 p_calling_module => D_budget_account_id_not_null
767 , p_value_tbl => PO_TYPE_CONVERTER.to_po_tbl_varchar4000(p_budget_account_id_tbl)
768 , p_entity_id_tbl => p_dist_id_tbl
769 , p_entity_type => c_entity_type_DISTRIBUTION
770 , p_column_name => c_BUDGET_ACCOUNT_ID
771 , p_message_name => PO_MESSAGE_S.PO_ALL_NOT_NULL
772 , x_results => x_results
773 , x_result_type => x_result_type
774 );
775
776 END budget_account_id_not_null;
777
778
779 -------------------------------------------------------------------------------
780 -- Ensures that the GL Encumbered Date is not null.
781 -- Agreements only.
782 -------------------------------------------------------------------------------
783 PROCEDURE gl_encumbered_date_not_null(
784 p_dist_id_tbl IN PO_TBL_NUMBER
785 , p_gl_encumbered_date_tbl IN PO_TBL_DATE
786 , x_results IN OUT NOCOPY PO_VALIDATION_RESULTS_TYPE
787 , x_result_type OUT NOCOPY VARCHAR2
788 )
789 IS
790 BEGIN
791
792 PO_VALIDATION_HELPER.not_null(
793 p_calling_module => D_gl_encumbered_date_not_null
794 , p_value_tbl => PO_TYPE_CONVERTER.to_po_tbl_varchar4000(p_gl_encumbered_date_tbl)
795 , p_entity_id_tbl => p_dist_id_tbl
796 , p_entity_type => c_entity_type_DISTRIBUTION
797 , p_column_name => c_GL_ENCUMBERED_DATE
798 , p_message_name => PO_MESSAGE_S.PO_ALL_NOT_NULL
799 , x_results => x_results
800 , x_result_type => x_result_type
801 );
802
803 END gl_encumbered_date_not_null;
804
805 ------------------------------------------------------------------------
806 -- Validates that if PO encumbrance is on, the GL Date is not null and
807 -- is in an open period.
808 -- For both SPOs and BPAs.
809 ------------------------------------------------------------------------
810 PROCEDURE gl_enc_date_not_null_open(
811 p_dist_id_tbl IN PO_TBL_NUMBER
812 , p_org_id_tbl IN PO_TBL_NUMBER
813 , p_gl_encumbered_date_tbl IN PO_TBL_DATE
814 , p_dist_type_tbl IN PO_TBL_VARCHAR30 --Bug 14664343
815 , x_results IN OUT NOCOPY PO_VALIDATION_RESULTS_TYPE
816 , x_result_type OUT NOCOPY VARCHAR2
817 )
818 IS
819 l_sob_id FINANCIALS_SYSTEM_PARAMS_ALL.set_of_books_id%TYPE;
820 l_po_enc_flag FINANCIALS_SYSTEM_PARAMS_ALL.purch_encumbrance_flag%TYPE;
821 l_gl_enc_period_name PO_DISTRIBUTIONS_ALL.gl_encumbered_period_name %TYPE;
822 l_results_count NUMBER;
823 l_gl_encumbered_date DATE;
824 BEGIN
825
826 IF (x_results IS NULL) THEN
827 x_results := PO_VALIDATION_RESULTS_TYPE.new_instance();
828 END IF;
829
830 l_results_count := x_results.result_type.COUNT;
831
832 FOR I IN 1..p_dist_id_tbl.COUNT LOOP
833 SELECT purch_encumbrance_flag, set_of_books_id
834 INTO l_po_enc_flag, l_sob_id
835 FROM financials_system_params_all
836 WHERE org_id = p_org_id_tbl(i);
837
838 IF (l_po_enc_flag = 'Y' AND p_dist_type_tbl(i) <> 'PREPAYMENT') THEN --Bug 14664343
839 -- GL Date Project: Start
840 -- If the Profile - PO:Validate GL Period is set to 'Redefault', try to
841 -- derive the valid GL Encumbered Date. If Valid GL Date is derived, then
842 -- skip raising any error message (the Valid GL Date will be derived once
843 -- again in JAVA layer, in postProcessDistribution), else raise an error.
844 IF Nvl(FND_PROFILE.VALUE('PO_VALIDATE_GL_PERIOD'),'Y') = 'R' THEN
845
846 l_gl_encumbered_date := p_gl_encumbered_date_tbl(i);
847 po_periods_sv.get_period_name(l_sob_id,
848 p_gl_encumbered_date_tbl(i),
849 l_gl_enc_period_name);
850 END IF;
851 -- GL Date Project: End
852 --14523678 If profile PO_VALIDATE_GL_PERIOD raise error if gldate is invalid or null
853 IF (Nvl(FND_PROFILE.VALUE('PO_VALIDATE_GL_PERIOD'),'Y') IN ( 'R','Y')) THEN
854
855 IF (p_gl_encumbered_date_tbl(i) IS NULL) THEN -- Error: GL Date is required
856 x_results.add_result(
857 p_entity_type => c_ENTITY_TYPE_DISTRIBUTION
858 , p_entity_id => p_dist_id_tbl(i)
859 , p_column_name => c_GL_ENCUMBERED_DATE
860 , p_column_val => NULL
861 , p_message_name => PO_MESSAGE_S.PO_ALL_NOT_NULL
862 );
863
864 ELSE -- Verify that GL Date is in an open period.
865 po_periods_sv.get_period_name(l_sob_id,
866 p_gl_encumbered_date_tbl(i),
867 l_gl_enc_period_name);
868
869 IF (l_gl_enc_period_name IS NULL) THEN
870 x_results.add_result(
871 p_entity_type => c_ENTITY_TYPE_DISTRIBUTION
872 , p_entity_id => p_dist_id_tbl(i)
873 , p_column_name => c_GL_ENCUMBERED_DATE
874 , p_column_val => TO_CHAR(p_gl_encumbered_date_tbl(i))
875 , p_message_name => PO_MESSAGE_S.PO_PO_ENTER_OPEN_GL_DATE
876 );
877 END IF;
878
879 END IF; -- p_gl_date_tbl(i) IS NULL
880 END IF; -- l_po_enc_flag = 'Y'
881 END IF;
882 END LOOP;
883
884
885 IF (l_results_count < x_results.result_type.COUNT) THEN
886 x_result_type := PO_VALIDATIONS.c_result_type_FAILURE;
887 ELSE
888 x_result_type := PO_VALIDATIONS.c_result_type_SUCCESS;
889 END IF;
890
891 END gl_enc_date_not_null_open;
892
893 ------------------------------------------------------------------------
894 -- gms_data_valid
895 --
896 -- Checks with the PO/Grants interface functions whether or not the
897 -- award data on a distribution is valid.
898 --
899 ------------------------------------------------------------------------
900 PROCEDURE gms_data_valid(
901 p_dist_id_tbl IN PO_TBL_NUMBER
902 , p_project_id_tbl IN PO_TBL_NUMBER
903 , p_task_id_tbl IN PO_TBL_NUMBER
904 , p_award_number_tbl IN PO_TBL_VARCHAR2000
905 , p_expenditure_type_tbl IN PO_TBL_VARCHAR30
906 , p_expenditure_item_date_tbl IN PO_TBL_DATE
907 , x_results IN OUT NOCOPY PO_VALIDATION_RESULTS_TYPE
908 , x_result_type OUT NOCOPY VARCHAR2
909 )
910 IS
911 l_failure_dist_id_tbl PO_TBL_NUMBER;
912 l_failure_message_tbl PO_TBL_VARCHAR4000;
913 l_results_count NUMBER;
914
915 BEGIN
916
917 IF (x_results IS NULL) THEN
918 x_results := PO_VALIDATION_RESULTS_TYPE.new_instance();
919 END IF;
920
921 l_results_count := x_results.result_type.COUNT;
922
923 IF (PO_GMS_INTEGRATION_PVT.is_gms_enabled()) THEN
924
925 PO_GMS_INTEGRATION_PVT.validate_award_data(
926 p_dist_id_tbl => p_dist_id_tbl
927 , p_project_id_tbl => p_project_id_tbl
928 , p_task_id_tbl => p_task_id_tbl
929 , p_award_number_tbl => p_award_number_tbl
930 , p_expenditure_type_tbl => p_expenditure_type_tbl
931 , p_expenditure_item_date_tbl => p_expenditure_item_date_tbl
932 , x_failure_dist_id_tbl => l_failure_dist_id_tbl
933 , x_failure_message_tbl => l_failure_message_tbl
934 );
935
936 IF (l_failure_dist_id_tbl IS NOT NULL) THEN
937 FOR i IN 1 .. l_failure_dist_id_tbl.COUNT LOOP
938 x_results.add_result(
939 p_entity_type => c_entity_type_DISTRIBUTION
940 , p_entity_id => l_failure_dist_id_tbl(i)
941 , p_column_name => c_AWARD_ID
942 , p_message_name => PO_MESSAGE_S.PO_WRAPPER_MESSAGE
943 , p_token1_name => PO_MESSAGE_S.c_MESSAGE_token
944 , p_token1_value => l_failure_message_tbl(i)
945 );
946 END LOOP;
947 END IF;
948
949 END IF; -- if is_gms_enabled
950
951 IF (l_results_count < x_results.result_type.COUNT) THEN
952 x_result_type := PO_VALIDATIONS.c_result_type_FAILURE;
953 ELSE
954 x_result_type := PO_VALIDATIONS.c_result_type_SUCCESS;
955 END IF;
956
957 END gms_data_valid;
958
959 ------------------------------------------------------------------------
960 -- ECO 4059111
961 -- Performs the federal financial validations for distributions
962 -- For Standard POs only.
963 ------------------------------------------------------------------------
964 PROCEDURE check_fv_validations(
965 p_dist_id_tbl IN PO_TBL_NUMBER
966 , p_ccid_tbl IN PO_TBL_NUMBER
967 , p_org_id_tbl IN PO_TBL_NUMBER
968 , p_attribute1_tbl IN PO_TBL_VARCHAR2000
969 , p_attribute2_tbl IN PO_TBL_VARCHAR2000
970 , p_attribute3_tbl IN PO_TBL_VARCHAR2000
971 , p_attribute4_tbl IN PO_TBL_VARCHAR2000
972 , p_attribute5_tbl IN PO_TBL_VARCHAR2000
973 , p_attribute6_tbl IN PO_TBL_VARCHAR2000
974 , p_attribute7_tbl IN PO_TBL_VARCHAR2000
975 , p_attribute8_tbl IN PO_TBL_VARCHAR2000
976 , p_attribute9_tbl IN PO_TBL_VARCHAR2000
977 , p_attribute10_tbl IN PO_TBL_VARCHAR2000
978 , p_attribute11_tbl IN PO_TBL_VARCHAR2000
979 , p_attribute12_tbl IN PO_TBL_VARCHAR2000
980 , p_attribute13_tbl IN PO_TBL_VARCHAR2000
981 , p_attribute14_tbl IN PO_TBL_VARCHAR2000
982 , p_attribute15_tbl IN PO_TBL_VARCHAR2000
983 , x_results IN OUT NOCOPY PO_VALIDATION_RESULTS_TYPE
984 , x_result_type OUT NOCOPY VARCHAR2
985 )
986 IS
987 d_mod CONSTANT VARCHAR2(100) := D_check_fv_validations;
988
989 l_ledger_id FINANCIALS_SYSTEM_PARAMS_ALL.set_of_books_id%TYPE;
990 l_return_status VARCHAR2(1);
991 l_error_message VARCHAR2(2000);
992 l_results_count NUMBER;
993 l_result_type VARCHAR2(30);
994 BEGIN
995
996 IF PO_LOG.d_proc THEN
997 PO_LOG.proc_begin(d_mod,'p_dist_id_tbl',p_dist_id_tbl);
998 PO_LOG.proc_begin(d_mod,'p_ccid_tbl',p_ccid_tbl);
999 PO_LOG.proc_begin(d_mod,'p_org_id_tbl',p_org_id_tbl);
1000 PO_LOG.log(PO_LOG.c_PROC_BEGIN,d_mod,NULL,'x_results',x_results);
1001 END IF;
1002
1003 IF (x_results IS NULL) THEN
1004 x_results := PO_VALIDATION_RESULTS_TYPE.new_instance();
1005 END IF;
1006
1007 l_results_count := x_results.result_type.COUNT;
1008
1009 FOR i IN 1..p_dist_id_tbl.COUNT LOOP
1010
1011 IF FV_INSTALL.enabled(p_org_id_tbl(i)) THEN
1012
1013 SELECT set_of_books_id
1014 INTO l_ledger_id
1015 FROM financials_system_params_all
1016 WHERE org_id = p_org_id_tbl(i);
1017
1018 FV_PO_VALIDATE_GRP.CHECK_AGREEMENT_DATES(
1019 x_code_combination_id => p_ccid_tbl(i),
1020 x_org_id => p_org_id_tbl(i),
1021 x_ledger_id => l_ledger_id,
1022 x_called_from => 'PO',
1023 x_ATTRIBUTE1 => p_attribute1_tbl(i),
1024 x_ATTRIBUTE2 => p_attribute2_tbl(i),
1025 x_ATTRIBUTE3 => p_attribute3_tbl(i),
1026 x_ATTRIBUTE4 => p_attribute4_tbl(i),
1027 x_ATTRIBUTE5 => p_attribute5_tbl(i),
1028 x_ATTRIBUTE6 => p_attribute6_tbl(i),
1029 x_ATTRIBUTE7 => p_attribute7_tbl(i),
1030 x_ATTRIBUTE8 => p_attribute8_tbl(i),
1031 x_ATTRIBUTE9 => p_attribute9_tbl(i),
1032 x_ATTRIBUTE10 => p_attribute10_tbl(i),
1033 x_ATTRIBUTE11 => p_attribute11_tbl(i),
1034 x_ATTRIBUTE12 => p_attribute12_tbl(i),
1035 x_ATTRIBUTE13 => p_attribute13_tbl(i),
1036 x_ATTRIBUTE14 => p_attribute14_tbl(i),
1037 x_ATTRIBUTE15 => p_attribute15_tbl(i),
1038 x_status => l_return_status,
1039 x_message => l_error_message) ;
1040
1041
1042 IF (l_return_status <> FND_API.G_RET_STS_SUCCESS) THEN
1043 IF l_return_status = FND_API.G_RET_STS_ERROR THEN
1044 l_result_type := PO_VALIDATIONS.c_result_type_FAILURE;
1045 ELSE
1046 l_result_type := PO_VALIDATIONS.c_result_type_WARNING;
1047 END IF;
1048
1049 x_results.add_result(
1050 p_entity_type => c_entity_type_DISTRIBUTION
1051 , p_entity_id => p_dist_id_tbl(i)
1052 , p_column_name => c_CODE_COMBINATION_ID
1053 , p_column_val => NULL
1054 , p_result_type => l_result_type
1055 , p_message_name => l_error_message
1056 );
1057 END IF;
1058
1059 END IF; -- FV Enabled
1060 END LOOP;
1061
1062 IF (l_results_count < x_results.result_type.COUNT) THEN
1063
1064 x_result_type := PO_VALIDATIONS.c_result_type_WARNING;
1065
1066 FOR j IN 1..x_results.result_type.COUNT LOOP
1067 IF (x_results.result_type(j) = PO_VALIDATIONS.c_result_type_FAILURE)
1068 THEN
1069 x_result_type := PO_VALIDATIONS.c_result_type_FAILURE;
1070 END IF;
1071 exit;
1072 END LOOP;
1073
1074 ELSE
1075 x_result_type := PO_VALIDATIONS.c_result_type_SUCCESS;
1076 END IF;
1077
1078 IF PO_LOG.d_proc THEN
1079 PO_LOG.proc_end(d_mod,'x_result_type',x_result_type);
1080 PO_LOG.log(PO_LOG.c_PROC_END,d_mod,NULL,'x_results',x_results);
1081 END IF;
1082
1083 EXCEPTION
1084 WHEN OTHERS THEN
1085 IF PO_LOG.d_exc THEN
1086 PO_LOG.exc(d_mod,0,NULL);
1087 END IF;
1088 RAISE;
1089
1090 END check_fv_validations;
1091
1092 /* CLM Partial Funding Changes -- START */
1093 ------------------------------------------------------------------------
1094 -- Validates whether the Funded Value is negative or not, when
1095 -- 1. Encumbrance is enabled and
1096 -- 2. Document is of CLM style.
1097 ------------------------------------------------------------------------
1098 PROCEDURE funded_value_ge_zero(
1099 p_dist_id_tbl IN PO_TBL_NUMBER
1100 , p_org_id_tbl IN PO_TBL_NUMBER
1101 , p_style_id_tbl IN PO_TBL_NUMBER
1102 , p_partial_funded_flag_tbl IN PO_TBL_VARCHAR1
1103 , p_funded_value_tbl IN PO_TBL_NUMBER
1104 , x_results IN OUT NOCOPY PO_VALIDATION_RESULTS_TYPE
1105 , x_result_type OUT NOCOPY VARCHAR2
1106 )
1107 IS
1108 d_mod CONSTANT VARCHAR2(100) := D_funded_value_ge_zero;
1109 l_po_enc_flag FINANCIALS_SYSTEM_PARAMS_ALL.purch_encumbrance_flag%TYPE;
1110 l_results_count NUMBER;
1111 l_is_clm_enabled VARCHAR2(1);
1112 BEGIN
1113
1114 IF PO_LOG.d_proc THEN
1115 PO_LOG.proc_begin(d_mod,'p_dist_id_tbl',p_dist_id_tbl);
1116 PO_LOG.proc_begin(d_mod,'p_org_id_tbl',p_org_id_tbl);
1117 PO_LOG.proc_begin(d_mod,'p_style_id_tbl',p_style_id_tbl);
1118 PO_LOG.proc_begin(d_mod,'p_partial_funded_flag_tbl',p_partial_funded_flag_tbl);
1119 PO_LOG.proc_begin(d_mod,'p_funded_value_tbl',p_funded_value_tbl);
1120 PO_LOG.log(PO_LOG.c_PROC_BEGIN,d_mod,NULL,'x_results',x_results);
1121 END IF;
1122
1123 IF (x_results IS NULL) THEN
1124 x_results := PO_VALIDATION_RESULTS_TYPE.new_instance();
1125 END IF;
1126
1127 l_results_count := x_results.result_type.COUNT;
1128
1129 FOR I IN 1..p_dist_id_tbl.COUNT LOOP
1130 SELECT purch_encumbrance_flag
1131 INTO l_po_enc_flag
1132 FROM financials_system_params_all
1133 WHERE org_id = p_org_id_tbl(i);
1134
1135 l_is_clm_enabled := po_doc_style_helper.get_clm_flag(p_style_id => p_style_id_tbl(i));
1136
1137 IF (l_po_enc_flag = 'Y' AND l_is_clm_enabled = 'Y' AND Nvl(p_funded_value_tbl(i),0) < 0) THEN
1138
1139 x_results.add_result(
1140 p_entity_type => c_ENTITY_TYPE_DISTRIBUTION
1141 , p_entity_id => p_dist_id_tbl(i)
1142 , p_column_name => c_FUNDED_VALUE
1143 , p_message_name => PO_MESSAGE_S.PO_PDOI_INVALID_FUND_VAL
1144 );
1145
1146 END IF;
1147
1148 END LOOP;
1149
1150 IF (l_results_count < x_results.result_type.COUNT) THEN
1151 x_result_type := PO_VALIDATIONS.c_result_type_FAILURE;
1152 ELSE
1153 x_result_type := PO_VALIDATIONS.c_result_type_SUCCESS;
1154 END IF;
1155
1156 IF PO_LOG.d_proc THEN
1157 PO_LOG.proc_end(d_mod,'x_result_type',x_result_type);
1158 PO_LOG.log(PO_LOG.c_PROC_END,d_mod,NULL,'x_results',x_results);
1159 END IF;
1160
1161 EXCEPTION
1162 WHEN OTHERS THEN
1163 IF PO_LOG.d_exc THEN
1164 PO_LOG.exc(d_mod,0,NULL);
1165 END IF;
1166 RAISE;
1167
1168 END funded_value_ge_zero;
1169
1170
1171 ------------------------------------------------------------------------
1172 -- Validates whether the Funded Value is less than or equal to Total
1173 -- Order Value or not, when
1174 -- 1. Encumbrance is enabled and
1175 -- 2. Document is of CLM style.
1176 ------------------------------------------------------------------------
1177 PROCEDURE funded_val_le_tot_order_val(
1178 p_dist_id_tbl IN PO_TBL_NUMBER
1179 , p_org_id_tbl IN PO_TBL_NUMBER
1180 , p_style_id_tbl IN PO_TBL_NUMBER
1181 , p_partial_funded_flag_tbl IN PO_TBL_VARCHAR1
1182 , p_funded_value_tbl IN PO_TBL_NUMBER
1183 , p_quantity_ordered_tbl IN PO_TBL_NUMBER
1184 , p_amount_ordered_tbl IN PO_TBL_NUMBER
1185 , p_price_override_tbl IN PO_TBL_NUMBER
1186 , p_nonrecoverable_tax_tbl IN PO_TBL_NUMBER
1187 , p_rate_tbl IN PO_TBL_NUMBER
1188 , x_results IN OUT NOCOPY PO_VALIDATION_RESULTS_TYPE
1189 , x_result_type OUT NOCOPY VARCHAR2
1190 )
1191 IS
1192 d_mod CONSTANT VARCHAR2(100) := D_funded_val_le_tot_order_val;
1193 l_po_enc_flag FINANCIALS_SYSTEM_PARAMS_ALL.purch_encumbrance_flag%TYPE;
1194 l_results_count NUMBER;
1195 l_is_clm_enabled VARCHAR2(1);
1196 l_total_order_value NUMBER;
1197
1198 x_precision NUMBER := NULL;
1199 x_ext_precision NUMBER := NULL;
1200 x_min_acct_unit NUMBER := NULL;
1201 l_func_currency_code VARCHAR2(10);
1202
1203
1204 BEGIN
1205
1206 IF PO_LOG.d_proc THEN
1207 PO_LOG.proc_begin(d_mod,'p_dist_id_tbl',p_dist_id_tbl);
1208 PO_LOG.proc_begin(d_mod,'p_org_id_tbl',p_org_id_tbl);
1209 PO_LOG.proc_begin(d_mod,'p_style_id_tbl',p_style_id_tbl);
1210 PO_LOG.proc_begin(d_mod,'p_partial_funded_flag_tbl',p_partial_funded_flag_tbl);
1211 PO_LOG.proc_begin(d_mod,'p_funded_value_tbl',p_funded_value_tbl);
1212 PO_LOG.proc_begin(d_mod,'p_quantity_ordered_tbl',p_quantity_ordered_tbl);
1213 PO_LOG.proc_begin(d_mod,'p_amount_ordered_tbl',p_amount_ordered_tbl);
1214 PO_LOG.proc_begin(d_mod,'p_price_override_tbl',p_price_override_tbl);
1215 PO_LOG.proc_begin(d_mod,'p_nonrecoverable_tax_tbl',p_nonrecoverable_tax_tbl);
1216 PO_LOG.proc_begin(d_mod,'p_rate_tbl',p_rate_tbl);
1217 PO_LOG.log(PO_LOG.c_PROC_BEGIN,d_mod,NULL,'x_results',x_results);
1218 END IF;
1219
1220 IF (x_results IS NULL) THEN
1221 x_results := PO_VALIDATION_RESULTS_TYPE.new_instance();
1222 END IF;
1223
1224 l_results_count := x_results.result_type.COUNT;
1225
1226
1227 FOR I IN 1..p_dist_id_tbl.COUNT LOOP
1228 SELECT purch_encumbrance_flag
1229 INTO l_po_enc_flag
1230 FROM financials_system_params_all
1231 WHERE org_id = p_org_id_tbl(i);
1232
1233 IF l_func_currency_code IS NULL THEN
1234 -- 13943396 Get currency_code to extract the precision value
1235 SELECT glsob.currency_code
1236 INTO l_func_currency_code
1237 FROM gl_sets_of_books glsob,
1238 financials_system_params_all fsp
1239 WHERE glsob.set_of_books_id = fsp.set_of_books_id
1240 AND fsp.org_id = p_org_id_tbl(i);
1241
1242 --13943396 Extract the precision value to round the Funded value
1243 fnd_currency.get_info(l_func_currency_code,
1244 x_precision,
1245 x_ext_precision,
1246 x_min_acct_unit );
1247
1248 END IF;
1249
1250
1251 l_is_clm_enabled := po_doc_style_helper.get_clm_flag(p_style_id => p_style_id_tbl(i));
1252
1253 IF (l_po_enc_flag = 'Y' AND l_is_clm_enabled = 'Y') THEN
1254
1255 IF (p_quantity_ordered_tbl(i) IS NOT NULL) THEN
1256 -- 13943396 added precision for comparision
1257 l_total_order_value := Round( ((p_quantity_ordered_tbl(i) * p_price_override_tbl(i))
1258 + NVL(p_nonrecoverable_tax_tbl(i),0)) * NVL(p_rate_tbl(i), 1),x_precision);
1259
1260 IF (l_total_order_value < p_funded_value_tbl(i)) THEN
1261 x_results.add_result(
1262 p_entity_type => c_ENTITY_TYPE_DISTRIBUTION
1263 , p_entity_id => p_dist_id_tbl(i)
1264 , p_column_name => c_FUNDED_VALUE
1265 , p_message_name => PO_MESSAGE_S.PO_PDOI_INVALID_FUND_VAL_ENC
1266 );
1267 END IF;
1268
1269 ELSE
1270 -- 13943396 added precision for comparision
1271 l_total_order_value := Round((NVL(p_amount_ordered_tbl(i),0) + NVL(p_nonrecoverable_tax_tbl(i),0))
1272 * NVL(p_rate_tbl(i), 1),x_precision);
1273
1274 IF (l_total_order_value < p_funded_value_tbl(i)) THEN
1275 x_results.add_result(
1276 p_entity_type => c_ENTITY_TYPE_DISTRIBUTION
1277 , p_entity_id => p_dist_id_tbl(i)
1278 , p_column_name => c_FUNDED_VALUE
1279 , p_message_name => PO_MESSAGE_S.PO_PDOI_INVALID_FUND_VAL
1280 );
1281 END IF;
1282
1283 END IF;
1284
1285 END IF;
1286 END LOOP;
1287
1288 IF (l_results_count < x_results.result_type.COUNT) THEN
1289 x_result_type := PO_VALIDATIONS.c_result_type_FAILURE;
1290 ELSE
1291 x_result_type := PO_VALIDATIONS.c_result_type_SUCCESS;
1292 END IF;
1293
1294 IF PO_LOG.d_proc THEN
1295 PO_LOG.proc_end(d_mod,'x_result_type',x_result_type);
1296 PO_LOG.log(PO_LOG.c_PROC_END,d_mod,NULL,'x_results',x_results);
1297 END IF;
1298
1299 EXCEPTION
1300 WHEN OTHERS THEN
1301 IF PO_LOG.d_exc THEN
1302 PO_LOG.exc(d_mod,0,NULL);
1303 END IF;
1304 RAISE;
1305
1306 END funded_val_le_tot_order_val;
1307
1308 ------------------------------------------------------------------------
1309 -- Validates whether the new Quantity Funded is greater than the
1310 -- Utilized Quantity or not, when
1311 -- 1. Encumbrance is enabled and
1312 -- 2. Document is of CLM style.
1313 ------------------------------------------------------------------------
1314 PROCEDURE qty_funded_ge_exc_qty(
1315 p_dist_id_tbl IN PO_TBL_NUMBER
1316 , p_org_id_tbl IN PO_TBL_NUMBER
1317 , p_style_id_tbl IN PO_TBL_NUMBER
1318 , p_quantity_funded_tbl IN PO_TBL_NUMBER
1319 , p_quantity_billed_tbl IN PO_TBL_NUMBER
1320 , p_quantity_delivered_tbl IN PO_TBL_NUMBER
1321 , x_results IN OUT NOCOPY PO_VALIDATION_RESULTS_TYPE
1322 , x_result_type OUT NOCOPY VARCHAR2
1323 )
1324 IS
1325 d_mod CONSTANT VARCHAR2(100) := D_qty_funded_ge_exc_qty;
1326 l_po_enc_flag FINANCIALS_SYSTEM_PARAMS_ALL.purch_encumbrance_flag%TYPE;
1327 l_results_count NUMBER;
1328 l_is_clm_enabled VARCHAR2(1);
1329 BEGIN
1330
1331 IF PO_LOG.d_proc THEN
1332 PO_LOG.proc_begin(d_mod,'p_dist_id_tbl',p_dist_id_tbl);
1333 PO_LOG.proc_begin(d_mod,'p_org_id_tbl',p_org_id_tbl);
1334 PO_LOG.proc_begin(d_mod,'p_style_id_tbl',p_style_id_tbl);
1335 PO_LOG.proc_begin(d_mod,'p_quantity_funded_tbl',p_quantity_funded_tbl);
1336 PO_LOG.proc_begin(d_mod,'p_quantity_billed_tbl',p_quantity_billed_tbl);
1337 PO_LOG.proc_begin(d_mod,'p_quantity_delivered_tbl',p_quantity_delivered_tbl);
1338 PO_LOG.log(PO_LOG.c_PROC_BEGIN,d_mod,NULL,'x_results',x_results);
1339 END IF;
1340
1341 IF (x_results IS NULL) THEN
1342 x_results := PO_VALIDATION_RESULTS_TYPE.new_instance();
1343 END IF;
1344
1345 l_results_count := x_results.result_type.COUNT;
1346
1347 FOR I IN 1..p_dist_id_tbl.COUNT LOOP
1348 SELECT purch_encumbrance_flag
1349 INTO l_po_enc_flag
1350 FROM financials_system_params_all
1351 WHERE org_id = p_org_id_tbl(i);
1352
1353 l_is_clm_enabled := po_doc_style_helper.get_clm_flag(p_style_id => p_style_id_tbl(i));
1354
1355 IF (l_po_enc_flag = 'Y' AND l_is_clm_enabled = 'Y' AND
1356 (NVL(p_quantity_billed_tbl(i),0) > 0 OR NVL(p_quantity_delivered_tbl(i),0) >0)) THEN
1357
1358 IF (NVL(p_quantity_billed_tbl(i),0) > NVL(p_quantity_funded_tbl(i),0)) THEN
1359
1360 x_results.add_result(
1361 p_entity_type => c_ENTITY_TYPE_DISTRIBUTION
1362 , p_entity_id => p_dist_id_tbl(i)
1363 , p_column_name => c_QUANTITY_FUNDED
1364 , p_message_name => PO_MESSAGE_S.PO_PF_QTY_FUND_LT_QTY_BIL_NA
1365 );
1366
1367 ELSIF (NVL(p_quantity_delivered_tbl(i),0) > NVL(p_quantity_funded_tbl(i),0)) THEN
1368
1369 x_results.add_result(
1370 p_entity_type => c_ENTITY_TYPE_DISTRIBUTION
1371 , p_entity_id => p_dist_id_tbl(i)
1372 , p_column_name => c_QUANTITY_FUNDED
1373 , p_message_name => PO_MESSAGE_S.PO_PF_QTY_FUND_LT_QTY_DEL_NA
1374 );
1375
1376 END IF;
1377
1378 END IF;
1379
1380 END LOOP;
1381
1382 IF (l_results_count < x_results.result_type.COUNT) THEN
1383 x_result_type := PO_VALIDATIONS.c_result_type_FAILURE;
1384 ELSE
1385 x_result_type := PO_VALIDATIONS.c_result_type_SUCCESS;
1386 END IF;
1387
1388 IF PO_LOG.d_proc THEN
1389 PO_LOG.proc_end(d_mod,'x_result_type',x_result_type);
1390 PO_LOG.log(PO_LOG.c_PROC_END,d_mod,NULL,'x_results',x_results);
1391 END IF;
1392
1393 EXCEPTION
1394 WHEN OTHERS THEN
1395 IF PO_LOG.d_exc THEN
1396 PO_LOG.exc(d_mod,0,NULL);
1397 END IF;
1398 RAISE;
1399
1400 END qty_funded_ge_exc_qty;
1401
1402 ------------------------------------------------------------------------
1403 -- Validates whether the new Amount Funded is greater than the
1404 -- Utilized Amount or not, when
1405 -- 1. Encumbrance is enabled and
1406 -- 2. Document is of CLM style.
1407 ------------------------------------------------------------------------
1408 PROCEDURE amount_funded_ge_exc_amount(
1409 p_dist_id_tbl IN PO_TBL_NUMBER
1410 , p_org_id_tbl IN PO_TBL_NUMBER
1411 , p_style_id_tbl IN PO_TBL_NUMBER
1412 , p_amount_funded_tbl IN PO_TBL_NUMBER
1413 , p_amount_billed_tbl IN PO_TBL_NUMBER
1414 , p_amount_delivered_tbl IN PO_TBL_NUMBER
1415 , p_line_matching_basis_tbl IN PO_TBL_VARCHAR30 --bug 13773450
1416 , x_results IN OUT NOCOPY PO_VALIDATION_RESULTS_TYPE
1417 , x_result_type OUT NOCOPY VARCHAR2
1418 )
1419 IS
1420 d_mod CONSTANT VARCHAR2(100) := D_amount_funded_ge_exc_amount;
1421 l_po_enc_flag FINANCIALS_SYSTEM_PARAMS_ALL.purch_encumbrance_flag%TYPE;
1422 l_results_count NUMBER;
1423 l_is_clm_enabled VARCHAR2(1);
1424 BEGIN
1425
1426 IF PO_LOG.d_proc THEN
1427 PO_LOG.proc_begin(d_mod,'p_dist_id_tbl',p_dist_id_tbl);
1428 PO_LOG.proc_begin(d_mod,'p_org_id_tbl',p_org_id_tbl);
1429 PO_LOG.proc_begin(d_mod,'p_style_id_tbl',p_style_id_tbl);
1430 PO_LOG.proc_begin(d_mod,'p_amount_funded_tbl',p_amount_funded_tbl);
1431 PO_LOG.proc_begin(d_mod,'p_amount_billed_tbl',p_amount_billed_tbl);
1432 PO_LOG.proc_begin(d_mod,'p_amount_delivered_tbl',p_amount_delivered_tbl);
1433 PO_LOG.log(PO_LOG.c_PROC_BEGIN,d_mod,NULL,'x_results',x_results);
1434 END IF;
1435
1436 IF (x_results IS NULL) THEN
1437 x_results := PO_VALIDATION_RESULTS_TYPE.new_instance();
1438 END IF;
1439
1440 l_results_count := x_results.result_type.COUNT;
1441
1442 FOR I IN 1..p_dist_id_tbl.COUNT LOOP
1443 SELECT purch_encumbrance_flag
1444 INTO l_po_enc_flag
1445 FROM financials_system_params_all
1446 WHERE org_id = p_org_id_tbl(i);
1447
1448 l_is_clm_enabled := po_doc_style_helper.get_clm_flag(p_style_id => p_style_id_tbl(i));
1449
1450 IF (l_po_enc_flag = 'Y' AND l_is_clm_enabled = 'Y'
1451 --bug 13773450: for lines having matching basis as quantity no need to check these conditions.
1452 AND p_line_matching_basis_tbl(i) <> 'QUANTITY'
1453 AND (NVL(p_amount_billed_tbl(i),0) > 0 OR NVL(p_amount_delivered_tbl(i),0) >0)) THEN
1454
1455 IF (NVL(p_amount_billed_tbl(i),0) > NVL(p_amount_funded_tbl(i),0)) THEN
1456
1457 x_results.add_result(
1458 p_entity_type => c_ENTITY_TYPE_DISTRIBUTION
1459 , p_entity_id => p_dist_id_tbl(i)
1460 , p_column_name => c_AMOUNT_FUNDED
1461 , p_message_name => PO_MESSAGE_S.PO_PF_AMT_FUND_LT_AMT_BIL_NA
1462 );
1463
1464 ELSIF (NVL(p_amount_delivered_tbl(i),0) > NVL(p_amount_funded_tbl(i),0)) THEN
1465
1466 x_results.add_result(
1467 p_entity_type => c_ENTITY_TYPE_DISTRIBUTION
1468 , p_entity_id => p_dist_id_tbl(i)
1469 , p_column_name => c_AMOUNT_FUNDED
1470 , p_message_name => PO_MESSAGE_S.PO_PF_AMT_FUND_LT_AMT_DEL_NA
1471 );
1472
1473 END IF;
1474
1475 END IF;
1476
1477 END LOOP;
1478
1479 IF (l_results_count < x_results.result_type.COUNT) THEN
1480 x_result_type := PO_VALIDATIONS.c_result_type_FAILURE;
1481 ELSE
1482 x_result_type := PO_VALIDATIONS.c_result_type_SUCCESS;
1483 END IF;
1484
1485 IF PO_LOG.d_proc THEN
1486 PO_LOG.proc_end(d_mod,'x_result_type',x_result_type);
1487 PO_LOG.log(PO_LOG.c_PROC_END,d_mod,NULL,'x_results',x_results);
1488 END IF;
1489
1490 EXCEPTION
1491 WHEN OTHERS THEN
1492 IF PO_LOG.d_exc THEN
1493 PO_LOG.exc(d_mod,0,NULL);
1494 END IF;
1495 RAISE;
1496
1497 END amount_funded_ge_exc_amount;
1498
1499 ------------------------------------------------------------------------
1500 -- Validates whether the Funded Value of the PO distribution is greater
1501 -- than its corresponding Requisition distribution or not, when
1502 -- 1. Encumbrance is enabled and
1503 -- 2. Document is of CLM style.
1504 ------------------------------------------------------------------------
1505 PROCEDURE funded_value_gt_backing_req(
1506 p_dist_id_tbl IN PO_TBL_NUMBER
1507 , p_org_id_tbl IN PO_TBL_NUMBER
1508 , p_style_id_tbl IN PO_TBL_NUMBER
1509 , p_funded_value_tbl IN PO_TBL_NUMBER
1510 , p_req_distribution_id_tbl IN PO_TBL_NUMBER
1511 , x_results IN OUT NOCOPY PO_VALIDATION_RESULTS_TYPE
1512 , x_result_type OUT NOCOPY VARCHAR2
1513 )
1514 IS
1515 d_mod CONSTANT VARCHAR2(100) := D_funded_value_gt_backing_req;
1516 l_po_enc_flag FINANCIALS_SYSTEM_PARAMS_ALL.purch_encumbrance_flag%TYPE;
1517 l_results_count NUMBER;
1518 l_is_clm_enabled VARCHAR2(1);
1519 l_backing_req_fund_value NUMBER;
1520 BEGIN
1521
1522 IF PO_LOG.d_proc THEN
1523 PO_LOG.proc_begin(d_mod,'p_dist_id_tbl',p_dist_id_tbl);
1524 PO_LOG.proc_begin(d_mod,'p_org_id_tbl',p_org_id_tbl);
1525 PO_LOG.proc_begin(d_mod,'p_style_id_tbl',p_style_id_tbl);
1526 PO_LOG.proc_begin(d_mod,'p_funded_value_tbl',p_funded_value_tbl);
1527 PO_LOG.proc_begin(d_mod,'p_req_distribution_id_tbl',p_req_distribution_id_tbl);
1528 PO_LOG.log(PO_LOG.c_PROC_BEGIN,d_mod,NULL,'x_results',x_results);
1529 END IF;
1530
1531 IF (x_results IS NULL) THEN
1532 x_results := PO_VALIDATION_RESULTS_TYPE.new_instance();
1533 END IF;
1534
1535 l_results_count := x_results.result_type.COUNT;
1536
1537 FOR I IN 1..p_dist_id_tbl.COUNT LOOP
1538 SELECT purch_encumbrance_flag
1539 INTO l_po_enc_flag
1540 FROM financials_system_params_all
1541 WHERE org_id = p_org_id_tbl(i);
1542
1543 l_is_clm_enabled := po_doc_style_helper.get_clm_flag(p_style_id => p_style_id_tbl(i));
1544
1545 IF (l_po_enc_flag = 'Y' AND l_is_clm_enabled = 'Y' AND
1546 p_req_distribution_id_tbl(i) IS NOT NULL) THEN
1547
1548 SELECT NVL(funded_value,0)
1549 INTO l_backing_req_fund_value
1550 FROM po_req_distributions_all
1551 WHERE distribution_id = p_req_distribution_id_tbl(i);
1552
1553 IF (l_backing_req_fund_value < p_funded_value_tbl(i)) THEN
1554
1555 x_results.add_result(
1556 p_entity_type => c_ENTITY_TYPE_DISTRIBUTION
1557 , p_entity_id => p_dist_id_tbl(i)
1558 , p_column_name => c_FUNDED_VALUE
1559 , p_message_name => PO_MESSAGE_S.PO_PF_FUND_VAL_GT_BACK_REQ
1560 );
1561
1562 END IF;
1563
1564 END IF;
1565
1566 END LOOP;
1567
1568 IF (l_results_count < x_results.result_type.COUNT) THEN
1569 x_result_type := PO_VALIDATIONS.c_result_type_WARNING;
1570 ELSE
1571 x_result_type := PO_VALIDATIONS.c_result_type_SUCCESS;
1572 END IF;
1573
1574 IF PO_LOG.d_proc THEN
1575 PO_LOG.proc_end(d_mod,'x_result_type',x_result_type);
1576 PO_LOG.log(PO_LOG.c_PROC_END,d_mod,NULL,'x_results',x_results);
1577 END IF;
1578
1579 EXCEPTION
1580 WHEN OTHERS THEN
1581 IF PO_LOG.d_exc THEN
1582 PO_LOG.exc(d_mod,0,NULL);
1583 END IF;
1584 RAISE;
1585
1586 END funded_value_gt_backing_req;
1587 /* CLM Partial Funding Changes -- END */
1588
1589 ------------------------------------------------------------------------
1590 -- Bug 5442682
1591 -- Performs required field validations on project related fields
1592 -- Following business rules apply (given project is filled in) :
1593 -- 1. Task is required irrespective of destination type
1594 -- 2. For expense lines, expenditure org and expenditure item
1595 -- date are required
1596 -- 3. If gms is installed and award is required for the project,
1597 -- expenditure type is required if award is filled in
1598 -- 4. If gms is not installed or if award is not required,
1599 -- expenditure item type is required.
1600 ------------------------------------------------------------------------
1601 PROCEDURE check_proj_related_validations(
1602 p_dist_id_tbl IN PO_TBL_NUMBER
1603 , p_dest_type_code_tbl IN PO_TBL_VARCHAR30
1604 , p_project_id_tbl IN PO_TBL_NUMBER
1605 , p_task_id_tbl IN PO_TBL_NUMBER
1606 , p_award_id_tbl IN PO_TBL_NUMBER
1607 , p_expenditure_type_tbl IN PO_TBL_VARCHAR30
1608 , p_expenditure_org_id_tbl IN PO_TBL_NUMBER
1609 , p_expenditure_item_date_tbl IN PO_TBL_DATE
1610 , p_ship_to_org_id_tbl IN PO_TBL_NUMBER
1611 , x_results IN OUT NOCOPY PO_VALIDATION_RESULTS_TYPE
1612 , x_result_type OUT NOCOPY VARCHAR2
1613 )
1614 IS
1615 d_mod CONSTANT VARCHAR2(100) := D_check_proj_rel_validations;
1616 l_error_message VARCHAR2(2000);
1617 l_award_required_flag VARCHAR2(2);
1618 l_expenditure_type_reqd BOOLEAN := FALSE;
1619 l_results_count NUMBER;
1620 x_project_reference_enabled NUMBER;
1621 x_project_control_level NUMBER;
1622 BEGIN
1623 IF PO_LOG.d_proc THEN
1624 PO_LOG.proc_begin(d_mod,'p_dist_id_tbl',p_dist_id_tbl);
1625 PO_LOG.proc_begin(d_mod,'p_dest_type_code_tbl',p_dest_type_code_tbl);
1626 PO_LOG.proc_begin(d_mod,'p_project_id_tbl',p_project_id_tbl);
1627 PO_LOG.proc_begin(d_mod,'p_task_id_tbl',p_task_id_tbl);
1628 PO_LOG.proc_begin(d_mod,'p_award_id_tbl',p_award_id_tbl);
1629 PO_LOG.proc_begin(d_mod,'p_expenditure_type_tbl',p_expenditure_type_tbl);
1630 PO_LOG.proc_begin(d_mod,'p_expenditure_org_id_tbl',p_expenditure_org_id_tbl);
1631 PO_LOG.proc_begin(d_mod,'p_expenditure_item_date_tbl',p_expenditure_item_date_tbl);
1632 PO_LOG.proc_begin(d_mod,'p_ship_to_org_id_tbl',p_ship_to_org_id_tbl);
1633 PO_LOG.log(PO_LOG.c_PROC_BEGIN,d_mod,NULL,'x_results',x_results);
1634 END IF;
1635
1636 IF (x_results IS NULL) THEN
1637 x_results := PO_VALIDATION_RESULTS_TYPE.new_instance();
1638 END IF;
1639
1640 l_results_count := x_results.result_type.COUNT;
1641
1642
1643 FOR i IN 1..p_dist_id_tbl.COUNT LOOP
1644
1645 po_core_s4.get_mtl_parameters (p_ship_to_org_id_tbl(i),
1646 NULL,
1647 x_project_reference_enabled,
1648 x_project_control_level);
1649
1650 PO_LOG.proc_begin(d_mod,'x_project_reference_enabled',x_project_reference_enabled);
1651 PO_LOG.proc_begin(d_mod,'x_project_control_level',x_project_control_level);
1652 -- Bug 7558385
1653 -- Need to check for PJM Parameters before making Task as mandatory.
1654 IF (p_project_id_tbl(i) IS NOT NULL) AND
1655 (NOT((x_project_reference_enabled = 1 ) and
1656 (x_project_control_level = 1 ) and
1657 (p_dest_type_code_tbl(i) in (c_DEST_TYPE_INVENTORY, c_DEST_TYPE_SHOP_FLOOR))
1658 ))
1659 THEN
1660 -- Task is required irrespective of destination type
1661 IF (p_task_id_tbl(i) IS NULL) THEN
1662 x_results.add_result(
1663 p_entity_type => c_entity_type_DISTRIBUTION
1664 , p_entity_id => p_dist_id_tbl(i)
1665 , p_column_name => 'TASK_ID'
1666 , p_column_val => NULL
1667 , p_message_name => PO_MESSAGE_S.PO_ALL_NOT_NULL
1668 );
1669 END IF;
1670
1671 IF (p_dest_type_code_tbl(i) = c_DEST_TYPE_EXPENSE) THEN
1672
1673 IF (PO_GMS_INTEGRATION_PVT.is_gms_enabled()) THEN
1674
1675 -- Award field is rendered if destination type is expense and grants is enabled
1676 -- Check if award is required for the project
1677 PO_GMS_INTEGRATION_PVT.is_award_required_for_project
1678 (p_project_id => p_project_id_tbl(i)
1679 , x_award_required_flag => l_award_required_flag);
1680
1681 -- If award is required, expenditure item type is required if award is filled in
1682 IF (l_award_required_flag = 'Y') THEN
1683 IF ( p_award_id_tbl(i) IS NOT NULL AND p_expenditure_type_tbl(i) IS NULL) THEN
1684 l_expenditure_type_reqd := TRUE;
1685 END IF; -- award id null check
1686 ELSIF (p_expenditure_type_tbl(i) IS NULL) THEN
1687 -- If award is not required for the project, the expenditure type is required
1688 l_expenditure_type_reqd := TRUE;
1689 END IF; --award required check
1690 ELSIF (p_expenditure_type_tbl(i) IS NULL) THEN
1691 -- If grants is not enabled, expenditure item type is required
1692 l_expenditure_type_reqd := TRUE;
1693 END IF; -- grants enabled check
1694
1695 IF (l_expenditure_type_reqd) THEN
1696 x_results.add_result(
1697 p_entity_type => c_entity_type_DISTRIBUTION
1698 , p_entity_id => p_dist_id_tbl(i)
1699 , p_column_name => 'EXPENDITURE_TYPE'
1700 , p_column_val => NULL
1701 , p_message_name => PO_MESSAGE_S.PO_ALL_NOT_NULL
1702 );
1703 END IF; --expenditure type validation check
1704
1705 IF (p_expenditure_org_id_tbl(i) IS NULL) THEN
1706 x_results.add_result(
1707 p_entity_type => c_entity_type_DISTRIBUTION
1708 , p_entity_id => p_dist_id_tbl(i)
1709 , p_column_name => 'EXPENDITURE_ORGANIZATION_ID'
1710 , p_column_val => NULL
1711 , p_message_name => PO_MESSAGE_S.PO_ALL_NOT_NULL
1712 );
1713 END IF;
1714
1715 IF (p_expenditure_item_date_tbl(i) IS NULL) THEN
1716 x_results.add_result(
1717 p_entity_type => c_entity_type_DISTRIBUTION
1718 , p_entity_id => p_dist_id_tbl(i)
1719 , p_column_name => 'EXPENDITURE_ITEM_DATE'
1720 , p_column_val => NULL
1721 , p_message_name => PO_MESSAGE_S.PO_ALL_NOT_NULL
1722 );
1723 END IF;
1724 END IF; -- destination type check
1725 END IF;
1726 END LOOP;
1727
1728 IF (l_results_count < x_results.result_type.COUNT) THEN
1729 x_result_type := PO_VALIDATIONS.c_result_type_FAILURE;
1730 ELSE
1731 x_result_type := PO_VALIDATIONS.c_result_type_SUCCESS;
1732 END IF;
1733
1734 IF po_log.d_proc THEN
1735 po_log.proc_end(d_mod, 'x_result_type', x_result_type);
1736 po_log.LOG(po_log.c_proc_end, d_mod, NULL, 'x_results', x_results);
1737 END IF;
1738
1739 EXCEPTION
1740 WHEN OTHERS THEN
1741 IF po_log.d_exc THEN
1742 po_log.exc(d_mod, 0, NULL);
1743 END IF;
1744
1745 RAISE;
1746
1747 END check_proj_related_validations;
1748
1749 -- CLM-LnSc-st
1750 -----------------------------------------------------------------------------
1751 -- Validates if Total Funded Value of Distributions is greater than the Funds
1752 -- Remaining on the PR they refer to.
1753 -----------------------------------------------------------------------------
1754 PROCEDURE funded_val_gt_req_funds_rmn(
1755 p_dist_id_tbl IN PO_TBL_NUMBER,
1756 p_dist_type_tbl IN PO_TBL_VARCHAR30,
1757 p_org_id_tbl IN PO_TBL_NUMBER,
1758 p_style_id_tbl IN PO_TBL_NUMBER,
1759 p_draft_id_tbl IN PO_TBL_NUMBER,
1760 p_funded_value_tbl IN PO_TBL_NUMBER,
1761 p_enc_amount_tbl IN PO_TBL_NUMBER,
1762 p_req_dist_id_tbl IN PO_TBL_NUMBER,
1763 x_result_set_id IN OUT NOCOPY NUMBER,
1764 x_result_type OUT NOCOPY VARCHAR2)
1765 IS
1766 d_mod CONSTANT VARCHAR2(100) := D_funded_val_gt_req_funds_rmn;
1767
1768 l_data_key NUMBER;
1769
1770 BEGIN
1771
1772 IF PO_LOG.d_proc THEN
1773 PO_LOG.proc_begin(d_mod);
1774 END IF;
1775
1776 IF (x_result_set_id IS NULL) THEN
1777 x_result_set_id := PO_VALIDATIONS.next_result_set_id();
1778 END IF;
1779
1780 ----------------------------------------------------------------------
1781 -- In order to check that the total funded value of Distributions
1782 -- is less than the Funds remaining on the backing Req, we first we need to
1783 -- construct a view of the intended Document.In order to do this, we need to get
1784 -- all of the in-memory data into a temp database table, so that
1785 -- we can run the business logic of the validation on this.
1786 --
1787 -- The session temp table will be used with the following mapping:
1788
1789 -- Distributions
1790 --
1791 -- index_num1 distribution_id
1792 -- index_num2 req_distribution_id
1793 -- num1 funded_value (latest value passed into the Validation routine)
1794 -- num2 funded_value_saved (already existing(saved in db),if any, funded_value for this Dist)
1795 --
1796 -- A view of the in-memory and stored data will be constructed
1797 -- as follows:
1798 -- 1. Gather the in-memory data(distribution_id,req_distribution_id,funded_value)
1799 -- and the stored data(PO_DISTRIBUTIONS_MERGE_V.funded_value) into the temp table.
1800 -- Valid Distributions are CLM-enabled, STANDARD type,
1801 -- having a Req reference, and when PO and Req Encumbrance is On
1802 -- 2. Compare the temp table data with Funds remaining on Req as follows:
1803 -- For each distinct Req being referred to by the Distributions, record error If
1804 -- For Base Documeny:
1805 -- Funds Remaining for Req + Total Funds already saved in db for these Dists
1806 -- < Total Funds now required by these Dists
1807 -- For Modification:
1808 -- Funds Remaining for Req + Total +ve Change in Funds already saved in db for these Dists
1809 -- < Total +ve Change in Funds now required by these Dists
1810 ----------------------------------------------------------------------
1811
1812 -- Put the stored data for these ids into the temp table.
1813 l_data_key := PO_CORE_S.get_session_gt_nextval();
1814
1815 FORALL i IN 1 .. p_dist_id_tbl.COUNT
1816 INSERT INTO PO_SESSION_GT(
1817 KEY,
1818 index_num1,
1819 index_num2,
1820 num1,
1821 num2)
1822 SELECT
1823 l_data_key,
1824 p_dist_id_tbl(i),
1825 p_req_dist_id_tbl(i),
1826 Decode(Nvl(p_draft_id_tbl(i), -1), -1, p_funded_value_tbl(i),
1827 Decode(Sign(Nvl(p_funded_value_tbl(i),0) - Nvl(p_enc_amount_tbl(i),0)), -1, 0,
1828 Nvl(p_funded_value_tbl(i),0) - Nvl(p_enc_amount_tbl(i), 0))),
1829 (SELECT Decode(Nvl(p_draft_id_tbl(i), -1), -1, funded_value,
1830 Decode(Sign(change_in_funded_value), -1, 0, change_in_funded_value))
1831 FROM po_distributions_merge_v
1832 WHERE po_distribution_id = p_dist_id_tbl(i)
1833 AND draft_id = Nvl(p_draft_id_tbl(i), -1))
1834 FROM dual
1835 WHERE p_req_dist_id_tbl(i) IS NOT NULL
1836 AND p_dist_type_tbl(i) = c_STANDARD
1837 AND PO_DOC_STYLE_HELPER.get_clm_flag(p_style_id => p_style_id_tbl(i)) = 'Y'
1838 AND EXISTS(
1839 SELECT NULL
1840 FROM FINANCIALS_SYSTEM_PARAMS_ALL
1841 WHERE org_id = p_org_id_tbl(i)
1842 AND purch_encumbrance_flag = 'Y'
1843 AND req_encumbrance_flag = 'Y');
1844
1845 INSERT INTO PO_VALIDATION_RESULTS_GT(
1846 result_set_id,
1847 entity_type,
1848 entity_id,
1849 column_name,
1850 message_name)
1851 SELECT
1852 x_result_set_id,
1853 c_ENTITY_TYPE_DISTRIBUTION,
1854 GT.index_num1, -- po_distribution_id
1855 c_FUNDED_VALUE,
1856 PO_MESSAGE_S.PO_FUNDED_VAL_GT_REQ_FUNDS_RMN
1857 FROM
1858 PO_SESSION_GT GT
1859 WHERE
1860 GT.key = l_data_key
1861 AND EXISTS(
1862 SELECT NULL
1863 FROM PO_SESSION_GT GT2,
1864 PO_CLMREQ_DIST_DETAILS_V PRD
1865 WHERE PRD.distribution_id = GT2.index_num2 -- JOIN
1866 AND GT2.key = l_data_key
1867 AND GT2.index_num2 = GT.index_num2 -- req_distribution_id
1868 GROUP BY
1869 GT2.index_num2,
1870 PRD.funds_remaining
1871 HAVING PRD.funds_remaining + Sum(Nvl(GT2.num2,0)) < Sum(Nvl(GT2.num1,0)));
1872
1873 IF (SQL%ROWCOUNT > 0) THEN
1874 x_result_type := PO_VALIDATIONS.c_result_type_FAILURE;
1875 ELSE
1876 x_result_type := PO_VALIDATIONS.c_result_type_SUCCESS;
1877 END IF;
1878
1879 IF PO_LOG.d_proc THEN
1880 PO_VALIDATIONS.log_validation_results_gt(d_mod,9,x_result_set_id);
1881 PO_LOG.proc_end(d_mod,'x_result_type',x_result_type);
1882 PO_LOG.proc_end(d_mod,'x_result_set_id',x_result_set_id);
1883 END IF;
1884
1885 EXCEPTION
1886 WHEN OTHERS THEN
1887 IF PO_LOG.d_exc THEN
1888 PO_LOG.exc(d_mod,0,NULL);
1889 END IF;
1890 RAISE;
1891
1892 END funded_val_gt_req_funds_rmn;
1893 -- CLM-LnSc-end
1894
1895 --<PAR Project>
1896 -------------------------------------------------------------------------------
1897 --Start of Comments
1898 --Pre-reqs: None.
1899 --Procedure Name: check_dist_values_inc_for_par.
1900 --Locks: None.
1901 --Function:
1902 -- Validates if Total Funded Value of Distributions is greater than the Funds
1903 -- Remaining on the PR they refer to.
1904 --Parameters:
1905 --IN:
1906 --p_dist_id_tbl
1907 --p_draft_id_tbl
1908 --p_draft_type_tbl
1909 --p_quantity_ordered_tbl
1910 --p_amt_ordered_tbl
1911 --p_old_qty_ordered_tbl
1912 --OUT:
1913 --x_result_type
1914 -- Provides a summary of the validation results.
1915 -- VARCHAR2(30)
1916 --x_results
1917 -- The results of the validations.
1918 --End of Comments
1919 -------------------------------------------------------------------------------
1920 PROCEDURE check_dist_values_inc_for_par(
1921 p_dist_id_tbl IN PO_TBL_NUMBER,
1922 p_draft_id_tbl IN PO_TBL_NUMBER,
1923 p_draft_type_tbl IN PO_TBL_VARCHAR30,
1924 p_quantity_ordered_tbl IN PO_TBL_NUMBER,
1925 p_amt_ordered_tbl IN PO_TBL_NUMBER,
1926 p_old_qty_ordered_tbl IN PO_TBL_NUMBER,
1927 p_change_status_tbl IN PO_TBL_VARCHAR30,
1928 x_results IN OUT NOCOPY PO_VALIDATION_RESULTS_TYPE ,
1929 x_result_type OUT NOCOPY VARCHAR2)
1930
1931 IS
1932 d_mod CONSTANT VARCHAR2(100) := D_check_dist_val_inc_for_par;
1933 l_draft_type VARCHAR2(10);
1934 l_results_count NUMBER;
1935
1936
1937 BEGIN
1938
1939 IF PO_LOG.d_proc THEN
1940 PO_LOG.proc_begin(d_mod);
1941 END IF;
1942
1943 IF (x_results IS NULL) THEN
1944 x_results := PO_VALIDATION_RESULTS_TYPE.new_instance();
1945 END IF;
1946
1947 l_results_count := x_results.result_type.COUNT;
1948
1949 FOR i IN 1..p_dist_id_tbl.Count() LOOP
1950
1951 IF PO_LOG.d_proc THEN
1952 PO_LOG.stmt(d_mod,10,'p_dist_id_tbl(i) is ',p_dist_id_tbl(i));
1953 PO_LOG.stmt(d_mod,20,'p_draft_type_tbl(i) is ',p_draft_type_tbl(i));
1954 END IF;
1955
1956 --Validation has to skipped for new lines in PAR
1957 IF ((p_draft_type_tbl(i) = 'PAR' AND p_change_status_tbl(i)='NEW') OR
1958 p_draft_type_tbl(i) <>'PAR' OR p_draft_type_tbl(i) IS NULL ) THEN
1959 x_result_type := PO_VALIDATIONS.c_result_type_SUCCESS;
1960 RETURN;
1961 END IF;
1962
1963
1964 IF PO_LOG.d_proc THEN
1965 PO_LOG.stmt(d_mod,30,'p_quantity_ordered_tbl(i) ',p_quantity_ordered_tbl(i));
1966 PO_LOG.stmt(d_mod,40,'p_old_qty_ordered_tbl(i) ',p_old_qty_ordered_tbl(i));
1967 END IF;
1968
1969 --Compare the old and new qauntities and thorw an error if there is an increase
1970 IF p_quantity_ordered_tbl(i) > p_old_qty_ordered_tbl(i) THEN
1971
1972 IF PO_LOG.d_proc THEN
1973 PO_LOG.stmt(d_mod,50,'Qty/Amount is increased at distributions on a PAR ');
1974 END IF;
1975
1976 x_results.add_result(
1977 p_entity_type => c_ENTITY_TYPE_DISTRIBUTION
1978 , p_entity_id => p_dist_id_tbl(i)
1979 , p_column_name => c_AMOUNT_ORDERED
1980 , p_message_name => 'PO_DIST_AMOUNT_INC_ON_PAR'
1981 );
1982
1983 END IF;
1984 END LOOP;
1985
1986 IF (l_results_count < x_results.result_type.COUNT) THEN
1987 x_result_type := PO_VALIDATIONS.c_result_type_FAILURE;
1988 ELSE
1989 x_result_type := PO_VALIDATIONS.c_result_type_SUCCESS;
1990 END IF;
1991
1992 END check_dist_values_inc_for_par;
1993
1994
1995
1996 --CLM PDOI Integration
1997 /*------------------------------------------------------------------------------
1998 This procedure validates:
1999 1. Proper clin slin funding
2000 2. If funding is at slin level, then there should not be any distribution
2001 against its clin
2002 -------------------------------------------------------------------------------*/
2003
2004 PROCEDURE check_clin_slin_funding(
2005 p_intf_dist_id_tbl IN PO_TBL_NUMBER,
2006 --p_dist_id_tbl IN PO_TBL_NUMBER,
2007 x_results IN OUT NOCOPY PO_VALIDATION_RESULTS_TYPE,
2008 x_result_type OUT NOCOPY VARCHAR2)
2009 IS
2010
2011 d_mod CONSTANT VARCHAR2(100) := D_check_clin_slin_funding;
2012 l_lines_count NUMBER := 0;
2013 l_results_count NUMBER :=0;
2014
2015 BEGIN
2016
2017 -- skip the validation for non-CLM documents
2018 IF NOT PO_CLM_CLO_UTIL.Isclminstalled THEN
2019 x_result_type := PO_VALIDATIONS.c_result_type_SUCCESS;
2020 RETURN;
2021 END IF;
2022
2023 IF PO_LOG.d_proc THEN
2024 PO_LOG.proc_begin(d_mod,'p_id_tbl',p_intf_dist_id_tbl);
2025 END IF;
2026
2027 --loop through each distribution that corresponds to a slin
2028 FOR i IN 1..p_intf_dist_id_tbl.COUNT LOOP
2029
2030 SELECT Count(pdi.interface_distribution_id)
2031 INTO l_lines_count
2032 FROM po_distributions_interface pdi, po_lines_interface pli
2033 WHERE pdi.interface_distribution_id = p_intf_dist_id_tbl(i)
2034 AND pdi.interface_line_id = PLI.interface_line_id
2035 AND PLI.group_line_id IS NOT NULL
2036 AND EXISTS ( --distribution against clin
2037 SELECT interface_distribution_id
2038 FROM po_distributions_interface
2039 WHERE interface_line_id = PLI.group_line_id
2040 );
2041 IF l_lines_count > 0 THEN
2042 x_results.add_result(
2043 p_entity_type => c_ENTITY_TYPE_DISTRIBUTION
2044 , p_entity_id => p_intf_dist_id_tbl(i)
2045 , p_column_name => c_GROUP_LINE_ID
2046 , p_message_name => 'PO_FUNDING_INVALID'
2047 );
2048 END IF;
2049
2050 l_results_count := l_results_count + l_lines_count;
2051
2052 END LOOP;
2053
2054 IF l_results_count > 0 THEN
2055 x_result_type := PO_VALIDATIONS.c_result_type_FAILURE;
2056 ELSE
2057 x_result_type := PO_VALIDATIONS.c_result_type_SUCCESS;
2058 END IF;
2059
2060 IF PO_LOG.d_proc THEN
2061 PO_LOG.proc_end(d_mod,'x_result_type',x_result_type);
2062 END IF;
2063 EXCEPTION
2064 WHEN OTHERS THEN
2065 IF PO_LOG.d_exc THEN
2066 PO_LOG.exc(d_mod,0,NULL);
2067 END IF;
2068 RAISE;
2069
2070 END check_clin_slin_funding;
2071
2072
2073
2074 PROCEDURE validate_defence_funding(
2075 p_intf_dist_id_tbl IN PO_TBL_NUMBER,
2076 p_clm_defence_funding_tbl IN PO_TBL_VARCHAR30,
2077 x_results IN OUT NOCOPY PO_VALIDATION_RESULTS_TYPE,
2078 x_result_type OUT NOCOPY VARCHAR2)
2079 IS
2080
2081 d_mod CONSTANT VARCHAR2(100) := D_validate_defence_funding;
2082 l_lines_count NUMBER := 0;
2083 l_results_count NUMBER :=0;
2084 is_defence_funding_valid VARCHAR2(1) := NULL;
2085
2086 BEGIN
2087
2088 -- skip the validation for non-CLM documents
2089 IF NOT PO_CLM_CLO_UTIL.Isclminstalled THEN
2090 x_result_type := PO_VALIDATIONS.c_result_type_SUCCESS;
2091 RETURN;
2092 END IF;
2093
2094 IF PO_LOG.d_proc THEN
2095 PO_LOG.proc_begin(d_mod,'p_id_tbl',p_intf_dist_id_tbl);
2096 END IF;
2097
2098 IF (x_results IS NULL) THEN
2099 x_results := PO_VALIDATION_RESULTS_TYPE.new_instance();
2100 END IF;
2101 --loop through each distribution that corresponds to a slin
2102 FOR i IN 1..p_intf_dist_id_tbl.COUNT
2103 LOOP
2104 IF p_clm_defence_funding_tbl(i) IS null
2105 THEN
2106 x_results.add_result(
2107 p_entity_type => c_ENTITY_TYPE_DISTRIBUTION
2108 , p_entity_id => p_intf_dist_id_tbl(i)
2109 , p_column_name => c_CLM_DEFENCE_FUNDING
2110 , p_message_name => PO_MESSAGE_S.PO_ALL_NOT_NULL
2111 );
2112 l_results_count := l_results_count + l_lines_count;
2113 ELSE
2114 BEGIN
2115 SELECT 'Y' INTO is_defence_funding_valid
2116 FROM dual
2117 WHERE EXISTS ( SELECT 1 FROM po_lookup_codes
2118 WHERE LOOKUP_TYPE = 'PO_FUND_INDICATOR'
2119 AND lookup_code = p_clm_defence_funding_tbl(i)
2120 );
2121 EXCEPTION WHEN No_Data_Found
2122 THEN
2123 x_results.add_result(
2124 p_entity_type => c_ENTITY_TYPE_DISTRIBUTION
2125 , p_entity_id => p_intf_dist_id_tbl(i)
2126 , p_column_name => c_CLM_DEFENCE_FUNDING
2127 , p_message_name => 'PO_DEFENCE_FUNDING_INVALID'
2128 );
2129 l_results_count := l_results_count + 1;
2130 END;
2131 END IF;
2132 END LOOP;
2133 IF l_results_count > 0 THEN
2134 x_result_type := PO_VALIDATIONS.c_result_type_FAILURE;
2135 ELSE
2136 x_result_type := PO_VALIDATIONS.c_result_type_SUCCESS;
2137 END IF;
2138 IF PO_LOG.d_proc THEN
2139 PO_LOG.proc_end(d_mod,'x_result_type',x_result_type);
2140 END IF;
2141 EXCEPTION
2142 WHEN OTHERS THEN
2143 IF PO_LOG.d_exc THEN
2144 PO_LOG.exc(d_mod,0,NULL);
2145 END IF;
2146 RAISE;
2147
2148 END validate_defence_funding;
2149
2150
2151
2152 PROCEDURE validate_option_distribution(
2153 p_intf_dist_id_tbl IN PO_TBL_NUMBER,
2154 x_results IN OUT NOCOPY PO_VALIDATION_RESULTS_TYPE,
2155 x_result_type OUT NOCOPY VARCHAR2)
2156 IS
2157
2158 d_mod CONSTANT VARCHAR2(100) := D_validate_option_distribution;
2159 l_intf_dist_id_tbl PO_TBL_NUMBER;
2160 l_data_key NUMBER;
2161
2162 BEGIN
2163
2164 -- skip the validation for non-CLM documents
2165 IF NOT PO_CLM_CLO_UTIL.Isclminstalled THEN
2166 x_result_type := PO_VALIDATIONS.c_result_type_SUCCESS;
2167 RETURN;
2168 END IF;
2169
2170 IF PO_LOG.d_proc THEN
2171 PO_LOG.proc_begin(d_mod,'p_id_tbl',p_intf_dist_id_tbl);
2172 END IF;
2173
2174 IF (x_results IS NULL) THEN
2175 x_results := PO_VALIDATION_RESULTS_TYPE.new_instance();
2176 END IF;
2177
2178 -- Put the stored data for these ids into the temp table.
2179 l_data_key := PO_CORE_S.get_session_gt_nextval();
2180
2181 FORALL i IN 1 .. p_intf_dist_id_tbl.COUNT
2182 INSERT INTO PO_SESSION_GT(
2183 KEY,
2184 num1)
2185 SELECT
2186 l_data_key,
2187 pdi.interface_distribution_id
2188 FROM po_distributions_interface pdi,
2189 po_lines_interface PLI
2190 WHERE pdi.interface_distribution_id = p_intf_dist_id_tbl(i)
2191 AND pdi.interface_line_id = PLI.interface_line_id
2192 AND Nvl(PLI.clm_option_indicator,'*') = 'O'
2193 AND Nvl(PLI.clm_exercised_flag,'N') <> 'Y';
2194
2195 DELETE FROM po_session_gt
2196 WHERE key = l_data_key
2197 RETURNING num1 BULK COLLECT INTO l_intf_dist_id_tbl;
2198
2199 FOR i IN 1..l_intf_dist_id_tbl.Count
2200 LOOP
2201 x_results.add_result(
2202 p_entity_type => c_ENTITY_TYPE_DISTRIBUTION
2203 , p_entity_id => l_intf_dist_id_tbl(i)
2204 , p_column_name => c_CLM_OPTION_INDICATOR
2205 , p_message_name => 'PO_OPTION_DIST_INVALID'
2206 );
2207 END LOOP;
2208
2209 IF l_intf_dist_id_tbl.count > 0 THEN
2210 x_result_type := PO_VALIDATIONS.c_result_type_FAILURE;
2211 ELSE
2212 x_result_type := PO_VALIDATIONS.c_result_type_SUCCESS;
2213 END IF;
2214 IF PO_LOG.d_proc THEN
2215 PO_LOG.proc_end(d_mod,'x_result_type',x_result_type);
2216 END IF;
2217 EXCEPTION
2218 WHEN OTHERS THEN
2219 IF PO_LOG.d_exc THEN
2220 PO_LOG.exc(d_mod,0,NULL);
2221 END IF;
2222 RAISE;
2223
2224 END validate_option_distribution;
2225
2226
2227 END PO_VAL_DISTRIBUTIONS;