DBA Data[Home] [Help]

PACKAGE BODY: APPS.AR_RAAPI_UTIL

Source


1 PACKAGE BODY AR_RAAPI_UTIL AS
2 /*$Header: ARXRAAUB.pls 120.43 2011/07/19 02:39:06 dgaurab ship $*/
3   PG_DEBUG varchar2(1) := NVL(FND_PROFILE.value('AFLOG_ENABLED'), 'N');
4 
5   /* 5011151 - global for use_inv_acctg */
6   g_use_inv_acctg   VARCHAR2(1);
7 
8   FUNCTION use_inv_acctg
9     RETURN VARCHAR2
10   IS
11   BEGIN
12     IF g_use_inv_acctg IS NULL
13     THEN
14        fnd_profile.get( 'AR_USE_INV_ACCT_FOR_CM_FLAG',
15                         g_use_inv_acctg);
16        IF g_use_inv_acctg IS NULL
17        THEN
18           g_use_inv_acctg := 'N';
19        END IF;
20     END IF;
21     RETURN g_use_inv_acctg;
22   END use_inv_acctg;
23 
24   PROCEDURE Constant_System_Values IS
25 
26     l_segment_num              NUMBER;
27     l_enabled_flag             VARCHAR2(1);
28 
29     /* Bug 4675438 - removed all ar_system_parameter related fetches */
30     CURSOR c_ar_app_id IS
31       SELECT application_id
32       FROM fnd_application
33       WHERE application_short_name = 'AR';
34 
35     CURSOR c_get_category_set IS
36       SELECT dcs.category_set_id,
37              cs.structure_id
38       FROM   mtl_default_category_sets dcs,
39              mtl_category_sets cs,
40              mfg_lookups ml
41       WHERE  ml.lookup_type = 'MTL_FUNCTIONAL_AREAS'
42              AND ml.lookup_code = dcs.functional_area_id
43              AND dcs.category_set_id = cs.category_set_id
44              AND ml.lookup_code = '1';
45 	     -- bug2117242 "meaning" is translatable column
46              -- AND ml.meaning = 'Inventory';
47 
48   BEGIN
49     arp_util.debug('AR_RAAPI_UTIL.constant_system_values()+');
50 
51     OPEN c_ar_app_id;
52     FETCH c_ar_app_id INTO g_ar_app_id;
53     CLOSE c_ar_app_id;
54 
55     /* 5126974 - this was raising an error if MOAC not init'd
56         so I moved it to inv_org_id function where it initializes
57         on the first call
58     oe_profile.get('SO_ORGANIZATION_ID',g_inv_org_id);
59     */
60 
61     OPEN c_get_category_set;
62     FETCH c_get_category_set INTO g_category_set_id, g_category_structure_id;
63     CLOSE c_get_category_set;
64 
65     g_un_meaning := ARPT_SQL_FUNC_UTIL.get_lookup_meaning
66                             (p_lookup_type => 'REV_ADJ_TYPE'
67                             ,p_lookup_code => 'UN');
68     g_ea_meaning := ARPT_SQL_FUNC_UTIL.get_lookup_meaning
69                             (p_lookup_type => 'REV_ADJ_TYPE'
70                             ,p_lookup_code => 'EA');
71     g_sa_meaning := ARPT_SQL_FUNC_UTIL.get_lookup_meaning
72                             (p_lookup_type => 'REV_ADJ_TYPE'
73                             ,p_lookup_code => 'SA');
74     g_nr_meaning := ARPT_SQL_FUNC_UTIL.get_lookup_meaning
75                             (p_lookup_type => 'REV_ADJ_TYPE'
76                             ,p_lookup_code => 'NR');
77     g_ll_meaning := ARPT_SQL_FUNC_UTIL.get_lookup_meaning
78                             (p_lookup_type => 'REV_ADJ_TYPE'
79                             ,p_lookup_code => 'LL');
80 
81     g_system_cache_flag := 'Y';
82 
83   EXCEPTION
84     WHEN OTHERS THEN
85        arp_util.debug('Unexpected error '||sqlerrm||
86                      ' at AR_RAAPI_UTIL.constant_system_values()+');
87        RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
88 
89   END Constant_System_Values;
90 
91   PROCEDURE Initialize_Globals
92   IS
93   BEGIN
94     g_customer_trx_id          := NULL;
95     g_last_customer_trx_id     := NULL;
96     g_cust_trx_type_id         := NULL;
97     g_trx_date                 := NULL;
98     g_invoicing_rule_id        := NULL;
99     g_trx_currency             := NULL;
100     g_trx_curr_format          := NULL;
101     g_exchange_rate            := NULL;
102     g_trx_precision            := NULL;
103     g_from_salesrep_id         := NULL;
104     g_to_salesrep_id           := NULL;
105 /* BEGIN bug 3067675 */
106     g_from_salesgroup_id       := NULL;
107     g_to_salesgroup_id         := NULL;
108 /* END bug 3067675 */
109     g_from_category_id         := NULL;
110     g_to_category_id           := NULL;
111     g_from_inventory_item_id   := NULL;
112     g_to_inventory_item_id     := NULL;
113     g_from_cust_trx_line_id    := NULL;
114     g_to_cust_trx_line_id      := NULL;
115     g_gl_date                  := NULL;
116 
117     /* Bug 3022420 - initialize arp_global and arp_standard globals to ensure
118        the correct set of books is accessed */
119     arp_global.init_global;
120     /* Bug 5547989 - Pass org id as a parameter to arp_standard.init_standard to set the correct org id */
121     arp_standard.init_standard(arp_global.sysparam.org_id);
122     /* Change for Bug 5547989 ends */
123 
124   END Initialize_Globals;
125 
126 
127 PROCEDURE Constant_Trx_Values
128      (p_customer_trx_id       IN NUMBER)
129   IS
130 
131     CURSOR c_trx IS
132       SELECT t.cust_trx_type_id
133             ,t.invoice_currency_code
134             ,t.exchange_rate
135             ,NVL(c.precision,0) -- Bug 3480443
136             ,t.trx_date
137             ,t.invoicing_rule_id
138       FROM ra_customer_trx t
139           ,fnd_currencies c
140       WHERE  t.invoice_currency_code = c.currency_code
141              AND t.customer_trx_id = p_customer_trx_id;
142 
143   BEGIN
144     IF PG_DEBUG in ('Y', 'C') THEN
145        arp_util.debug('AR_RAAPI_UTIL.Constant_Trx_Values()+');
146     END IF;
147 
148     OPEN c_trx;
149     FETCH c_trx INTO g_cust_trx_type_id
150                     ,g_trx_currency
151                     ,g_exchange_rate
152                     ,g_trx_precision
153                     ,g_trx_date
154                     ,g_invoicing_rule_id;
155     CLOSE c_trx;
156 
157     g_trx_curr_format := fnd_currency.get_format_mask
158                          (currency_code => g_trx_currency, field_length => 18);
159     g_trx_curr_format := REPLACE(g_trx_curr_format,'FM');
160     g_trx_curr_format := REPLACE(g_trx_curr_format,'PR');
161 
162     g_last_customer_trx_id  := p_customer_trx_id;
163 
164   EXCEPTION
165 
166      WHEN OTHERS then
167        IF PG_DEBUG in ('Y', 'C') THEN
168           arp_util.debug('Constant_Trx_Values: ' || 'Unexpected error '||sqlerrm||
169                      ' at AR_RAAPI_UTIL.constant_system_values()+');
170        END IF;
171        RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
172 
173   END Constant_Trx_Values;
174 
175   PROCEDURE Validate_Parameters
176         (p_init_msg_list       IN VARCHAR2
177         ,p_rev_adj_rec         IN OUT NOCOPY AR_Revenue_Adjustment_PVT.Rev_Adj_Rec_Type
178         ,p_validation_level    IN NUMBER
179         ,x_return_status       IN OUT NOCOPY VARCHAR2
180         ,x_msg_count           OUT NOCOPY NUMBER
181         ,x_msg_data            OUT NOCOPY VARCHAR2)
182   IS
183     l_gl_date_valid              DATE;  -- Bug 2146970
184   BEGIN
185     IF PG_DEBUG in ('Y', 'C') THEN
186        arp_util.debug('AR_RAAPI_UTIL.Validate_Parameters()+');
187     END IF;
188     -- Initialize message list if p_init_msg_list is set to TRUE.
189     IF FND_API.to_Boolean( p_init_msg_list )
190     THEN
191       FND_MSG_PUB.initialize;
192     END IF;
193     x_return_status := FND_API.G_RET_STS_SUCCESS;
194     Validate_Transaction (p_init_msg_list    => FND_API.G_FALSE
195                          ,p_rev_adj_rec      => p_rev_adj_rec
196                          ,p_validation_level => p_validation_level
197                          ,x_return_status    => x_return_status
198                          ,x_msg_count        => x_msg_count
199                          ,x_msg_data         => x_msg_data);
200     IF x_return_status = FND_API.G_RET_STS_SUCCESS
201     THEN
202       IF NVL(AR_RAAPI_UTIL.g_last_customer_trx_id,
203         AR_RAAPI_UTIL.g_customer_trx_id - 1) <> AR_RAAPI_UTIL.g_customer_trx_id
204       THEN
205         Constant_Trx_Values(AR_RAAPI_UTIL.g_customer_trx_id);
206       END IF;
207       IF p_validation_level = FND_API.G_VALID_LEVEL_FULL
208       THEN
209         Validate_Salesreps (p_init_msg_list    => FND_API.G_FALSE
210                            ,p_rev_adj_rec      => p_rev_adj_rec
211                            ,x_return_status    => x_return_status
212                            ,x_msg_count        => x_msg_count
213                            ,x_msg_data         => x_msg_data);
214         Validate_Category  (p_init_msg_list    => FND_API.G_FALSE
215                            ,p_rev_adj_rec      => p_rev_adj_rec
216                            ,x_return_status    => x_return_status
217                            ,x_msg_count        => x_msg_count
218                            ,x_msg_data         => x_msg_data);
219         Validate_Item      (p_init_msg_list    => FND_API.G_FALSE
220                            ,p_rev_adj_rec      => p_rev_adj_rec
221                            ,x_return_status    => x_return_status
222                            ,x_msg_count        => x_msg_count
223                            ,x_msg_data         => x_msg_data);
224         Validate_Line      (p_init_msg_list    => FND_API.G_FALSE
225                            ,p_rev_adj_rec      => p_rev_adj_rec
226                            ,x_return_status    => x_return_status
227                            ,x_msg_count        => x_msg_count
228                            ,x_msg_data         => x_msg_data);
229 
230         /* Bug 2146970 - replaced call to procedure with function call */
231 
232         /* Bug # 2804660- validate_gl_date should only be called here if
233                           no gl date is provided, so that a gl date is
234                           defaulted. */
235 
236         IF (p_rev_adj_rec.gl_date IS NULL) THEN
237           l_gl_date_valid := validate_gl_date(
238             p_gl_date => p_rev_adj_rec.gl_date);
239           p_rev_adj_rec.gl_date := l_gl_date_valid;
240         END IF;
241 
242         Validate_Other     (p_init_msg_list    => FND_API.G_FALSE
243                            ,p_rev_adj_rec      => p_rev_adj_rec
244                            ,x_return_status    => x_return_status
245                            ,x_msg_count        => x_msg_count
246                            ,x_msg_data         => x_msg_data);
247       ELSE
248         g_from_salesrep_id       := p_rev_adj_rec.from_salesrep_id;
249         g_to_salesrep_id         := p_rev_adj_rec.to_salesrep_id;
250 /* BEGIN bug 3067675 */
251         g_from_salesgroup_id     := p_rev_adj_rec.from_salesgroup_id;
252         g_to_salesgroup_id       := p_rev_adj_rec.to_salesgroup_id;
253 /* END bug 3067675 */
254         g_from_category_id       := p_rev_adj_rec.from_category_id;
255         g_to_category_id         := p_rev_adj_rec.to_category_id;
256         g_from_inventory_item_id := p_rev_adj_rec.from_inventory_item_id;
257         g_to_inventory_item_id   := p_rev_adj_rec.to_inventory_item_id;
258         g_from_cust_trx_line_id  := p_rev_adj_rec.from_cust_trx_line_id;
259         g_to_cust_trx_line_id    := p_rev_adj_rec.to_cust_trx_line_id;
260         g_gl_date                := p_rev_adj_rec.gl_date;
261       END IF;
262     ELSE
263       RAISE FND_API.G_EXC_ERROR;
264 
265     END IF;
266   EXCEPTION
267     WHEN OTHERS THEN
268        IF PG_DEBUG in ('Y', 'C') THEN
269           arp_util.debug('Unexpected error '||sqlerrm||
270                      ' at AR_RAAPI_UTIL.Validate_Parameters()+');
271        END IF;
272        RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
273 
274   END Validate_Parameters;
275 
276   PROCEDURE Validate_Transaction
277         (p_init_msg_list         IN VARCHAR2
278         ,p_rev_adj_rec           IN  AR_Revenue_Adjustment_PVT.Rev_Adj_Rec_Type
279         ,p_validation_level      IN  NUMBER
280         ,x_return_status         IN OUT NOCOPY VARCHAR2
281         ,x_msg_count             OUT NOCOPY NUMBER
282         ,x_msg_data              OUT NOCOPY VARCHAR2)
283   IS
284     l_customer_trx_id           NUMBER;
285     l_trx_type                  ra_cust_trx_types.type%TYPE;
286     l_invoice_total             NUMBER;
287     l_cm_total                  NUMBER;
288     l_inv_and_cm_total          NUMBER;
289     l_prev_trx_id               NUMBER;
290 
291     CURSOR c_trx_num IS
292       SELECT t.customer_trx_id
293       FROM   ra_customer_trx t
294             ,ra_batch_sources bs
295       WHERE  t.batch_source_id = bs.batch_source_id
296       AND    t.trx_number = p_rev_adj_rec.trx_number
297       AND    bs.name = NVL(p_rev_adj_rec.batch_source_name,bs.name)
298       AND    NVL(t.invoicing_rule_id,0) <> -3
299       AND NOT EXISTS (SELECT 'X'
300                       FROM   ra_customer_trx_lines l
301                       WHERE  l.customer_trx_id = t.customer_trx_id
302                       AND    l.line_type = 'LINE'
303                       AND    autorule_complete_flag IS NOT NULL);
304 
305     CURSOR c_trx_id IS
306       SELECT t.customer_trx_id
307       FROM   ra_customer_trx t
308       WHERE  t.customer_trx_id = p_rev_adj_rec.customer_trx_id
309       AND    NVL(t.invoicing_rule_id,0) <> -3
310       AND NOT EXISTS (SELECT 'X'
311                       FROM   ra_customer_trx_lines l
312                       WHERE  l.customer_trx_id = t.customer_trx_id
313                       AND    l.line_type = 'LINE'
314                       AND    autorule_complete_flag IS NOT NULL);
315 
316     CURSOR c_trx_type IS
317     SELECT tt.type,
318            t.previous_customer_trx_id
319     FROM   ra_cust_trx_types tt,
320            ra_customer_trx t
321     WHERE  tt.cust_trx_type_id = t.cust_trx_type_id
322     AND    t.customer_trx_id = g_customer_trx_id;
323 
324     CURSOR c_invoice_total IS
325     SELECT SUM(l.extended_amount)
326     FROM   ra_customer_trx_lines l
327     WHERE  l.customer_trx_id = g_customer_trx_id
328     AND    l.line_type = 'LINE';
329 
330     CURSOR c_cm_total IS
331     SELECT sum(l.extended_amount)
332     FROM   ra_customer_trx_lines l,
333            ra_cust_trx_types tt,
334            ra_customer_trx cm
335     WHERE  l.customer_trx_id =  cm.customer_trx_id
336     AND    cm.cust_trx_type_id = tt.cust_trx_type_id
337     AND    l.line_type = 'LINE'
338     AND    tt.type = 'CM'
339     AND    cm.previous_customer_trx_id = g_customer_trx_id;
340 
341   BEGIN
342     IF PG_DEBUG in ('Y', 'C') THEN
343        arp_util.debug('AR_RAAPI_UTIL.Validate_Transaction()+');
344     END IF;
345     -- Initialize message list if p_init_msg_list is set to TRUE.
346     IF FND_API.to_Boolean( p_init_msg_list )
347     THEN
348       FND_MSG_PUB.initialize;
349     END IF;
350     x_return_status := FND_API.G_RET_STS_SUCCESS;
351     IF p_validation_level = FND_API.G_VALID_LEVEL_FULL
352     THEN
353       --
354       -- Verify the transaction ID
355       --
356       IF p_rev_adj_rec.customer_trx_id IS NULL
357       THEN
358         IF p_rev_adj_rec.trx_number IS NOT NULL
359         THEN
360           OPEN c_trx_num;
361           FETCH c_trx_num INTO g_customer_trx_id;
362           IF c_trx_num%NOTFOUND
363           THEN
364             FND_MESSAGE.set_name (application => 'AR',
365                                   name => 'AR_RA_TRX_NOTFOUND');
366             FND_MESSAGE.set_token('TRX_NUMBER',p_rev_adj_rec.trx_number);
367             FND_MSG_PUB.Add;
368             x_return_status := FND_API.G_RET_STS_ERROR ;
369           ELSE
370             FETCH c_trx_num INTO l_customer_trx_id;
371             IF c_trx_num%FOUND
372             THEN
373               g_customer_trx_id := NULL;
374               FND_MESSAGE.set_name (application => 'AR',
375                                     name => 'AR_RA_TRX_TOO_MANY_ROWS');
376               FND_MESSAGE.set_token('TRX_NUMBER',p_rev_adj_rec.trx_number);
377               FND_MSG_PUB.Add;
378               x_return_status := FND_API.G_RET_STS_ERROR ;
379             END IF;
380           END IF;
381           CLOSE c_trx_num;
382         ELSE
383           FND_MESSAGE.set_name (application => 'AR',
384                                 name => 'AR_RA_NO_TRX_NUMBER');
385           FND_MSG_PUB.Add;
386           x_return_status := FND_API.G_RET_STS_ERROR ;
387         END IF;
388       ELSE
389         OPEN c_trx_id;
390         FETCH c_trx_id INTO g_customer_trx_id;
391         IF c_trx_id%NOTFOUND
392         THEN
393           FND_MESSAGE.set_name (application => 'AR',
394                                 name => 'AR_TAPI_TRANS_NOT_EXIST');
395           FND_MESSAGE.set_token('CUSTOMER_TRX_ID',p_rev_adj_rec.customer_trx_id);
396           FND_MSG_PUB.Add;
397           x_return_status := FND_API.G_RET_STS_ERROR ;
398         END IF;
399         CLOSE c_trx_id;
400       END IF;
401     ELSE
402       g_customer_trx_id := p_rev_adj_rec.customer_trx_id;
403     END IF;
404     OPEN c_trx_type;
405     FETCH c_trx_type INTO l_trx_type, l_prev_trx_id;
406     CLOSE c_trx_type;
407     IF (p_validation_level = FND_API.G_VALID_LEVEL_FULL AND
408         g_customer_trx_id IS NOT NULL)
409     THEN
410       IF l_trx_type = 'CB'
411       THEN
412         FND_MESSAGE.set_name('AR','AR_RA_CB_DISALLOWED');
413         FND_MSG_PUB.Add;
414         x_return_status := FND_API.G_RET_STS_ERROR ;
415       END IF;
416       -- Bug # 4096889
417       -- ORASHID
418       --      IF l_trx_type = 'DM'
419       --      THEN
420       --        FND_MESSAGE.set_name('AR','AR_RA_DM_DISALLOWED');
421       --        FND_MSG_PUB.Add;
422       --        x_return_status := FND_API.G_RET_STS_ERROR ;
423       --      END IF;
424       IF l_trx_type = 'BR'
425       THEN
426         FND_MESSAGE.set_name('AR','AR_RA_BR_DISALLOWED');
427         FND_MSG_PUB.Add;
428         x_return_status := FND_API.G_RET_STS_ERROR ;
429       END IF;
430       -- Bug # 4096889
431       -- ORASHID
432       --      IF l_trx_type = 'DEP'
433       --      THEN
434       --        FND_MESSAGE.set_name('AR','AR_RA_DEP_DISALLOWED');
435       --        FND_MSG_PUB.Add;
436       --        x_return_status := FND_API.G_RET_STS_ERROR ;
437       --      END IF;
438       IF l_trx_type = 'GUAR'
439       THEN
440         FND_MESSAGE.set_name('AR','AR_RA_GUAR_DISALLOWED');
441         FND_MSG_PUB.Add;
442         x_return_status := FND_API.G_RET_STS_ERROR ;
443       END IF;
444       /* 5011151 - Only allow revenue adjustments on
445          credit memos if they are on-account or use_inv_acct=N  */
446       IF l_trx_type = 'CM' AND
447          l_prev_trx_id IS NOT NULL
448       THEN
449         /* Check invoice accounting profile and
450             raise error if it is Y */
451         IF use_inv_acctg = 'Y'
452         THEN
453            /* raise error */
454            FND_MESSAGE.set_name('AR','AR_RA_CM_DISALLOWED');
455            FND_MSG_PUB.Add;
456            x_return_status := FND_API.G_RET_STS_ERROR;
457         END IF;
458       END IF;
459     END IF;
460     -- Bug # 4096889
461     -- ORASHID
462     IF l_trx_type IN ('INV', 'DEP', 'DM')
463     THEN
464       OPEN c_invoice_total;
465       FETCH c_invoice_total INTO l_invoice_total;
466       CLOSE c_invoice_total;
467       OPEN c_cm_total;
468       FETCH c_cm_total INTO l_cm_total;
469       CLOSE c_cm_total;
470 
471       l_inv_and_cm_total := l_invoice_total + l_cm_total;
472       IF l_invoice_total <> l_inv_and_cm_total
473       THEN
474         IF l_inv_and_cm_total = 0
475         THEN
476           /* 5011151 - Remove this error, we now handle the
477               credit amounts inside the adj code so there is no
478               reason to overtly prevent adjustments  */
479           --
480           -- Fully credit memo'd so raise an error
481           --
482           FND_MESSAGE.set_name ('AR','AR_RA_FULL_CREDIT');
483           FND_MSG_PUB.Add;
484         ELSE
485           --
486           -- Partially credit memo'd so raise a warning only
487           --
488           FND_MESSAGE.set_name ('AR','AR_RA_PARTIAL_CREDIT');
489           FND_MSG_PUB.Add;
490         END IF;
491       END IF;
492     END IF;
493     FND_MSG_PUB.Count_And_Get
494                            (p_encoded => FND_API.G_FALSE,
495                             p_count   => x_msg_count,
496                             p_data    => x_msg_data);
497   EXCEPTION
498      WHEN OTHERS THEN
499        IF PG_DEBUG in ('Y', 'C') THEN
500           arp_util.debug('Validate_Transaction: ' || 'Unexpected error '||sqlerrm||
501                   ' at AR_RAAPI_UTIL.Validate_Transaction()+');
502        END IF;
503        RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
504   END Validate_Transaction;
505 
506 
507   PROCEDURE Validate_Salesreps
508      (p_init_msg_list          IN  VARCHAR2
509      ,p_rev_adj_rec            IN  AR_Revenue_Adjustment_PVT.Rev_Adj_Rec_Type
510      ,x_return_status          IN OUT NOCOPY VARCHAR2
511      ,x_msg_count              OUT NOCOPY NUMBER
512      ,x_msg_data               OUT NOCOPY VARCHAR2)
513   IS
514     l_sales_credit_total       NUMBER;
515 --begin anuj
516 /* Multi-Org Access Control Changes for SSA;Begin;anukumar;11/01/2002*/
517  l_org_id                   NUMBER;
518 /* Multi-Org Access Control Changes for SSA;Begin;anukumar;11/01/2002*/
519 --end anuj
520 
521 /* BEGIN bug 3067675 */
522     l_rep_group_changed        BOOLEAN := FALSE;
523     l_group_start_date         DATE;
524     l_group_end_date           DATE;
525 /* END bug 3067675 */
526 
527     CURSOR c_salesrep_num (p_salesrep_number VARCHAR2) IS
528       SELECT salesrep_id
529       FROM   ra_salesreps
530       WHERE  salesrep_number = p_salesrep_number
531       AND SYSDATE BETWEEN NVL(start_date_active,SYSDATE)
532                       AND NVL(end_date_active,SYSDATE)
533       AND g_trx_date BETWEEN NVL(start_date_active,g_trx_date)
534                          AND NVL(end_date_active,g_trx_date) ;
535 
536     CURSOR c_salesrep_id (p_salesrep_id NUMBER) IS
537       SELECT salesrep_id
538       FROM   ra_salesreps
539       WHERE  salesrep_id = p_salesrep_id
540       AND SYSDATE BETWEEN NVL(start_date_active,SYSDATE)
541                       AND NVL(end_date_active,SYSDATE)
542       AND g_trx_date BETWEEN NVL(start_date_active,g_trx_date)
543                          AND NVL(end_date_active,g_trx_date) ;
544 
545 /* BEGIN bug 3067675 */
546     CURSOR c_salesgroup_id (p_salesgroup_id NUMBER) IS
547       SELECT grp.group_id group_id
548       FROM   jtf_rs_group_members mem, jtf_rs_groups_b grp,
549              jtf_rs_salesreps srp, jtf_rs_group_usages usg,
550              jtf_rs_role_relations rrl
551       WHERE  srp.resource_id = mem.resource_id
552       AND mem.group_id = grp.group_id
553       AND mem.group_id = usg.group_id
554       AND usg.usage = 'SALES'
555       AND mem.delete_flag = 'N'
556       AND mem.group_member_id = rrl.role_resource_id
557       AND rrl.role_resource_type = 'RS_GROUP_MEMBER'
558       AND rrl.delete_flag = 'N'
559       AND nvl(rrl.end_date_active, to_date('01/01/4713','MM/DD/RRRR')) >= l_group_start_date
560       AND rrl.start_date_active <= l_group_end_date
561       AND srp.salesrep_id = g_to_salesrep_id
562       AND nvl(srp.org_id, -99) = nvl(arp_standard.sysparm.org_id, -99)
563       AND l_group_end_date BETWEEN grp.start_date_active AND nvl(grp.end_date_active, to_date('01/01/4713','MM/DD/RRRR'))
564       AND grp.group_id = p_salesgroup_id
565       UNION ALL
566       SELECT group_id
567       FROM jtf_rs_groups_b
568       WHERE group_id = -1
569       AND group_id = p_salesgroup_id;
570 /* END bug 3067675 */
571 
572     CURSOR c_check_sales_credits IS
573       SELECT DECODE(p_rev_adj_rec.sales_credit_type,'N',
574             SUM(non_revenue_percent_split), SUM(revenue_percent_split))
575 --begin anuj
576 /* Multi-Org Access Control Changes for SSA;Begin;anukumar;11/01/2002*/
577             ,org_id
578 /* Multi-Org Access Control Changes for SSA;end;anukumar;11/01/2002*/
579 --end anuj
580       FROM ra_cust_trx_line_salesreps
581       WHERE customer_trx_id = g_customer_trx_id
582       AND   customer_trx_line_id IS NOT NULL
583 /* BEGIN bug 3067675 */
584       --AND   salesrep_id = g_from_salesrep_id
585       --GROUP BY salesrep_id;
586       AND   salesrep_id = NVL(g_from_salesrep_id, salesrep_id)
587       AND   DECODE(p_rev_adj_rec.sales_credit_type,'N', NVL(non_revenue_salesgroup_id, -9999), NVL(revenue_salesgroup_id, -9999)) =
588                 NVL(g_from_salesgroup_id, DECODE(p_rev_adj_rec.sales_credit_type,'N', NVL(non_revenue_salesgroup_id, -9999), NVL(revenue_salesgroup_id, -9999)))
589       GROUP BY  salesrep_id,
590 		DECODE(p_rev_adj_rec.sales_credit_type,'N', non_revenue_salesgroup_id, revenue_salesgroup_id),
591 		org_id;
592 /* END bug 3067675 */
593 
594     CURSOR c_line_num (p_line_number NUMBER) IS
595       SELECT customer_trx_line_id
596       FROM   ra_customer_trx_lines
597       WHERE  line_number = p_line_number
598       AND    customer_trx_id = g_customer_trx_id
599       AND    line_type = 'LINE';
600 
601     CURSOR c_line_id (p_line_id NUMBER) IS
602       SELECT customer_trx_line_id
603       FROM   ra_customer_trx_lines
604       WHERE  customer_trx_line_id = p_line_id
605       AND    line_type = 'LINE';
606 
607   BEGIN
608     IF PG_DEBUG in ('Y', 'C') THEN
609        arp_util.debug('AR_RAAPI_UTIL.Validate_Salesreps()+');
610     END IF;
611     -- Initialize message list if p_init_msg_list is set to TRUE.
612     IF FND_API.to_Boolean( p_init_msg_list )
613     THEN
614       FND_MSG_PUB.initialize;
615     END IF;
616     --
617     -- Validate from salesrep
618     --
619     IF g_from_salesrep_id IS NOT NULL AND
620        NVL(p_rev_adj_rec.from_salesrep_id,g_from_salesrep_id - 1)
621                             = g_from_salesrep_id
622     THEN
623       --
624       -- Don't revalidate if validated previously in this session
625       --
626       NULL;
627     ElSE
628       l_rep_group_changed := TRUE; -- bug 3067675
629       IF p_rev_adj_rec.adjustment_type <> 'NR'
630       THEN
631         IF p_rev_adj_rec.from_salesrep_id IS NULL
632         THEN
633           IF p_rev_adj_rec.from_salesrep_number IS NOT NULL
634           THEN
635             OPEN c_salesrep_num (p_rev_adj_rec.from_salesrep_number);
636             FETCH c_salesrep_num INTO g_from_salesrep_id;
637             IF c_salesrep_num%NOTFOUND
638             THEN
639               /* Bug 2157246 - shortened message */
640               /* Bug 2191739 - call to message API for degovtized message */
641               FND_MESSAGE.set_name
642                       (application => 'AR',
643                        name => gl_public_sector.get_message_name
644                                (p_message_name => 'AR_RA_INVALID_SALESREP_NUM',
645                                 p_app_short_name => 'AR'));
646               FND_MESSAGE.set_token('SALESREP_NUMBER',
647                                     p_rev_adj_rec.from_salesrep_number);
648               FND_MSG_PUB.Add;
649               x_return_status := FND_API.G_RET_STS_ERROR ;
650             END IF;
651             CLOSE c_salesrep_num;
652           END IF;
653         ELSE
654           OPEN c_salesrep_id(p_rev_adj_rec.from_salesrep_id);
655           FETCH c_salesrep_id INTO g_from_salesrep_id;
656           IF c_salesrep_id%NOTFOUND
657           THEN
658             FND_MESSAGE.set_name (application => 'AR',
659                                   name => 'AR_TAPI_INVALID_SALESREP_ID');
660             FND_MESSAGE.set_token('SALESREP_ID',
661                                   p_rev_adj_rec.from_salesrep_id);
662             FND_MSG_PUB.Add;
663             x_return_status := FND_API.G_RET_STS_ERROR ;
664           END IF;
665           CLOSE c_salesrep_id;
666         END IF;
667       END IF;
668 
669 /* BEGIN bug 3067675 */
670     END IF;
671 
672     --
673     -- Validate from salesgroup
674     --
675     IF g_from_salesgroup_id IS NOT NULL AND
676        NVL(p_rev_adj_rec.from_salesgroup_id,g_from_salesgroup_id - 1)
677                             = g_from_salesgroup_id
678     THEN
679       --
680       -- Don't revalidate if validated previously in this session
681       --
682       NULL;
683     ElSE
684       l_rep_group_changed := TRUE;
685       IF p_rev_adj_rec.adjustment_type <> 'NR'
686       THEN
687         IF p_rev_adj_rec.from_salesgroup_id IS NOT NULL
688         THEN
689           g_from_salesgroup_id := p_rev_adj_rec.from_salesgroup_id;
690         END IF;
691       END IF;
692     END IF;
693 
694       IF ((l_rep_group_changed) AND ((g_from_salesrep_id IS NOT NULL) OR (g_from_salesgroup_id IS NOT NULL)))
695       --IF g_from_salesrep_id IS NOT NULL
696 /* END bug 3067675 */
697 
698       THEN
699         --
700         --  Check from salesrep,salesgroup has existing sales credits on the transaction
701         --
702         OPEN c_check_sales_credits;
703         FETCH c_check_sales_credits INTO l_sales_credit_total
704 --begin anuj
705 /* Multi-Org Access Control Changes for SSA;Begin;anukumar;11/01/2002*/
706                ,l_org_id;
707 /* Multi-Org Access Control Changes for SSA;end;anukumar;11/01/2002*/
708 --end anuj
709 
710 
711         CLOSE c_check_sales_credits;
712         IF NVL(l_sales_credit_total,0) = 0
713         THEN
714           /* Bug 2191739 - call to message API for degovtized message */
715           FND_MESSAGE.set_name
716                   (application => 'AR',
717                    name => gl_public_sector.get_message_name
718                            (p_message_name => 'AR_RA_SALESREP_NOT_ON_TRX',
719                             p_app_short_name => 'AR'));
720           FND_MESSAGE.set_token('SALESREP_NAME',
721 --begin anuj
722 /* Multi-Org Access Control Changes for SSA;Begin;anukumar;11/01/2002*/
723        -- ARPT_SQL_FUNC_UTIL.get_salesrep_name_number(g_from_salesrep_id,'NAME'));
724         ARPT_SQL_FUNC_UTIL.get_salesrep_name_number(g_from_salesrep_id,'NAME',l_org_id));
725 /* Multi-Org Access Control Changes for SSA;end;anukumar;11/01/2002*/
726 --end anuj
727           FND_MSG_PUB.Add;
728           x_return_status := FND_API.G_RET_STS_ERROR ;
729         END IF;
730       END IF;
731     --END IF; -- commented for bug 3067675
732     --
733     -- Validate To salesrep
734     --
735     IF g_to_salesrep_id IS NOT NULL AND
736        NVL(p_rev_adj_rec.to_salesrep_id,g_to_salesrep_id - 1) = g_to_salesrep_id
737     THEN
738       --
739       -- Don't revalidate if validated previously in this session
740       --
741       NULL;
742     ELSE
743       IF p_rev_adj_rec.adjustment_type IN ('NR','SA')
744       THEN
745         IF p_rev_adj_rec.to_salesrep_id IS NULL
746         THEN
747           IF p_rev_adj_rec.to_salesrep_number IS NULL
748           THEN
749             /* Bug 2191739 - call to message API for degovtized message */
750             FND_MESSAGE.set_name
751                   (application => 'AR',
752                    name => gl_public_sector.get_message_name
753                            (p_message_name => 'AR_RA_NO_TO_SALESREP',
754                             p_app_short_name => 'AR'));
755             FND_MSG_PUB.Add;
756             x_return_status := FND_API.G_RET_STS_ERROR ;
757           ELSE
758             OPEN c_salesrep_num (p_rev_adj_rec.to_salesrep_number);
759             FETCH c_salesrep_num INTO g_to_salesrep_id;
760             IF c_salesrep_num%NOTFOUND
761             THEN
762               /* Bug 2157246 - shortened message */
763               /* Bug 2191739 - call to message API for degovtized message */
764               FND_MESSAGE.set_name
765                       (application => 'AR',
766                        name => gl_public_sector.get_message_name
767                                (p_message_name => 'AR_RA_INVALID_SALESREP_NUM',
768                                 p_app_short_name => 'AR'));
769               FND_MESSAGE.set_token('SALESREP_NUMBER',
770                                     p_rev_adj_rec.to_salesrep_number);
771               FND_MSG_PUB.Add;
772               x_return_status := FND_API.G_RET_STS_ERROR ;
773             END IF;
774             CLOSE c_salesrep_num;
775           END IF;
776         ELSE
777           OPEN c_salesrep_id(p_rev_adj_rec.to_salesrep_id);
778           FETCH c_salesrep_id INTO g_to_salesrep_id;
779           IF c_salesrep_id%NOTFOUND
780           THEN
781             FND_MESSAGE.set_name (application => 'AR',
782                                   name => 'AR_TAPI_INVALID_SALESREP_ID');
783             FND_MESSAGE.set_token('SALESREP_ID',
784                                   p_rev_adj_rec.to_salesrep_id);
785             FND_MSG_PUB.Add;
786             x_return_status := FND_API.G_RET_STS_ERROR ;
787           END IF;
788           CLOSE c_salesrep_id;
789         END IF;
790       END IF;
791     END IF;
792 
793 /* BEGIN bug 3067675 */
794     --
795     -- Validate To salesgroup
796     --
797     IF g_to_salesgroup_id IS NOT NULL AND
798        NVL(p_rev_adj_rec.to_salesgroup_id,g_to_salesgroup_id - 1) = g_to_salesgroup_id
799     THEN
800       --
801       -- Don't revalidate if validated previously in this session
802       --
803       NULL;
804     ELSE
805       IF p_rev_adj_rec.adjustment_type IN ('NR','SA')
806       THEN
807         IF p_rev_adj_rec.to_salesgroup_id IS NOT NULL
808         THEN
809           arp_util.Get_Txn_Start_End_Dates(p_rev_adj_rec.customer_trx_id, l_group_start_date, l_group_end_date);
810           OPEN c_salesgroup_id(p_rev_adj_rec.to_salesgroup_id);
811           FETCH c_salesgroup_id INTO g_to_salesgroup_id;
812           IF c_salesgroup_id%NOTFOUND
813           THEN
814             FND_MESSAGE.set_name (application => 'AR',
815                                   name => 'AR_INVALID_SALESGROUP_ID');
816             FND_MSG_PUB.Add;
817             x_return_status := FND_API.G_RET_STS_ERROR ;
818           END IF;
819           CLOSE c_salesgroup_id;
820         END IF;
821       END IF;
822     END IF;
823 /* END bug 3067675 */
824 
825     FND_MSG_PUB.Count_And_Get
826                            (p_encoded => FND_API.G_FALSE,
827                             p_count   => x_msg_count,
828                             p_data    => x_msg_data);
829   EXCEPTION
830      WHEN OTHERS THEN
831        IF PG_DEBUG in ('Y', 'C') THEN
832           arp_util.debug('Validate_Salesreps: ' || 'Unexpected error '||sqlerrm||
833                   ' at AR_RAAPI_UTIL.Validate_Salesreps()+');
834        END IF;
835        RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
836   END Validate_Salesreps;
837 
838   PROCEDURE Validate_Category
839      (p_init_msg_list          IN  VARCHAR2
840      ,p_rev_adj_rec            IN  AR_Revenue_Adjustment_PVT.Rev_Adj_Rec_Type
841      ,x_return_status          IN OUT NOCOPY VARCHAR2
842      ,x_msg_count              OUT NOCOPY NUMBER
843      ,x_msg_data               OUT NOCOPY VARCHAR2)
844   IS
845 
846     l_segment_rec              Segment_Rec_Type;
847     l_cat_count                NUMBER;
848 
849     /* Bug 2157246 - replaced CHR(0) with FND_API.G_MISS_CHAR */
850     CURSOR c_category_segs (p_segment_rec Segment_Rec_Type) IS
851       SELECT category_id
852       FROM   mtl_categories_vl
853       WHERE  NVL(segment1,FND_API.G_MISS_CHAR) =  NVL(p_segment_rec.segment1,FND_API.G_MISS_CHAR)
854       AND    NVL(segment2,FND_API.G_MISS_CHAR) =  NVL(p_segment_rec.segment2,FND_API.G_MISS_CHAR)
855       AND    NVL(segment3,FND_API.G_MISS_CHAR) =  NVL(p_segment_rec.segment3,FND_API.G_MISS_CHAR)
856       AND    NVL(segment4,FND_API.G_MISS_CHAR) =  NVL(p_segment_rec.segment4,FND_API.G_MISS_CHAR)
857       AND    NVL(segment5,FND_API.G_MISS_CHAR) =  NVL(p_segment_rec.segment5,FND_API.G_MISS_CHAR)
858       AND    NVL(segment6,FND_API.G_MISS_CHAR) =  NVL(p_segment_rec.segment6,FND_API.G_MISS_CHAR)
859       AND    NVL(segment7,FND_API.G_MISS_CHAR) =  NVL(p_segment_rec.segment7,FND_API.G_MISS_CHAR)
860       AND    NVL(segment8,FND_API.G_MISS_CHAR) =  NVL(p_segment_rec.segment8,FND_API.G_MISS_CHAR)
861       AND    NVL(segment9,FND_API.G_MISS_CHAR) =  NVL(p_segment_rec.segment9,FND_API.G_MISS_CHAR)
862       AND    NVL(segment10,FND_API.G_MISS_CHAR) = NVL(p_segment_rec.segment10,FND_API.G_MISS_CHAR)
863       AND    NVL(segment11,FND_API.G_MISS_CHAR) = NVL(p_segment_rec.segment11,FND_API.G_MISS_CHAR)
864       AND    NVL(segment12,FND_API.G_MISS_CHAR) = NVL(p_segment_rec.segment12,FND_API.G_MISS_CHAR)
865       AND    NVL(segment13,FND_API.G_MISS_CHAR) = NVL(p_segment_rec.segment13,FND_API.G_MISS_CHAR)
866       AND    NVL(segment14,FND_API.G_MISS_CHAR) = NVL(p_segment_rec.segment14,FND_API.G_MISS_CHAR)
867       AND    NVL(segment15,FND_API.G_MISS_CHAR) = NVL(p_segment_rec.segment15,FND_API.G_MISS_CHAR)
868       AND    NVL(segment16,FND_API.G_MISS_CHAR) = NVL(p_segment_rec.segment16,FND_API.G_MISS_CHAR)
869       AND    NVL(segment17,FND_API.G_MISS_CHAR) = NVL(p_segment_rec.segment17,FND_API.G_MISS_CHAR)
870       AND    NVL(segment18,FND_API.G_MISS_CHAR) = NVL(p_segment_rec.segment18,FND_API.G_MISS_CHAR)
871       AND    NVL(segment19,FND_API.G_MISS_CHAR) = NVL(p_segment_rec.segment19,FND_API.G_MISS_CHAR)
872       AND    NVL(segment20,FND_API.G_MISS_CHAR) = NVL(p_segment_rec.segment20,FND_API.G_MISS_CHAR)
873       AND    structure_id = g_category_structure_id;
874 
875     CURSOR c_category_id(p_category_id NUMBER) IS
876       SELECT category_id
877       FROM   mtl_categories_vl
878       WHERE  category_id = p_category_id
879       AND    structure_id = g_category_structure_id;
880 
881     CURSOR c_cat_exists_on_trx(p_category_id NUMBER) IS
882       SELECT COUNT(*)
883       FROM   mtl_item_categories c,
884              ra_customer_trx_lines l
885       WHERE  c.inventory_item_id = l.inventory_item_id
886       AND    l.customer_trx_id = g_customer_trx_id
887       AND    c.category_id = p_category_id
888       AND    l.line_type = 'LINE'
889       AND    c.category_set_id = g_category_set_id
890       AND    c.organization_id = g_inv_org_id;
891 
892   BEGIN
893     IF PG_DEBUG in ('Y', 'C') THEN
894        arp_util.debug('AR_RAAPI_UTIL.Validate_Category()+');
895     END IF;
896 
897     /* 5126974 - move initialization to this function
898         to avoid org-specific failure in constant_system_values */
899     IF g_inv_org_id IS NULL
900     THEN
901        oe_profile.get('SO_ORGANIZATION_ID',g_inv_org_id);
902     END IF;
903 
904     -- Initialize message list if p_init_msg_list is set to TRUE.
905     IF FND_API.to_Boolean( p_init_msg_list )
906     THEN
907       FND_MSG_PUB.initialize;
908     END IF;
909     --
910     -- Validate category
911     --
912     IF g_from_category_id IS NOT NULL AND
913        NVL(p_rev_adj_rec.from_category_id,g_from_category_id - 1)
914                                         = g_from_category_id
915     THEN
916       --
917       -- Don't revalidate if validated previously in this session
918       --
919       NULL;
920     ELSE
921       IF p_rev_adj_rec.from_category_id IS NULL
922       THEN
923         IF (p_rev_adj_rec.from_category_segment1 IS NOT NULL OR
924             p_rev_adj_rec.from_category_segment2 IS NOT NULL OR
925             p_rev_adj_rec.from_category_segment3 IS NOT NULL OR
926             p_rev_adj_rec.from_category_segment4 IS NOT NULL OR
927             p_rev_adj_rec.from_category_segment5 IS NOT NULL OR
928             p_rev_adj_rec.from_category_segment6 IS NOT NULL OR
929             p_rev_adj_rec.from_category_segment7 IS NOT NULL OR
930             p_rev_adj_rec.from_category_segment8 IS NOT NULL OR
931             p_rev_adj_rec.from_category_segment9 IS NOT NULL OR
932             p_rev_adj_rec.from_category_segment10 IS NOT NULL OR
933             p_rev_adj_rec.from_category_segment11 IS NOT NULL OR
934             p_rev_adj_rec.from_category_segment12 IS NOT NULL OR
935             p_rev_adj_rec.from_category_segment13 IS NOT NULL OR
936             p_rev_adj_rec.from_category_segment14 IS NOT NULL OR
937             p_rev_adj_rec.from_category_segment15 IS NOT NULL OR
938             p_rev_adj_rec.from_category_segment16 IS NOT NULL OR
939             p_rev_adj_rec.from_category_segment17 IS NOT NULL OR
940             p_rev_adj_rec.from_category_segment18 IS NOT NULL OR
941             p_rev_adj_rec.from_category_segment19 IS NOT NULL OR
942             p_rev_adj_rec.from_category_segment20 IS NOT NULL)
943         THEN
944           l_segment_rec.segment1 := p_rev_adj_rec.from_category_segment1;
945           l_segment_rec.segment2 := p_rev_adj_rec.from_category_segment2;
946           l_segment_rec.segment3 := p_rev_adj_rec.from_category_segment3;
947           l_segment_rec.segment4 := p_rev_adj_rec.from_category_segment4;
948           l_segment_rec.segment5 := p_rev_adj_rec.from_category_segment5;
949           l_segment_rec.segment6 := p_rev_adj_rec.from_category_segment6;
950           l_segment_rec.segment7 := p_rev_adj_rec.from_category_segment7;
951           l_segment_rec.segment8 := p_rev_adj_rec.from_category_segment8;
952           l_segment_rec.segment9 := p_rev_adj_rec.from_category_segment9;
953           l_segment_rec.segment10 := p_rev_adj_rec.from_category_segment10;
954           l_segment_rec.segment11 := p_rev_adj_rec.from_category_segment11;
955           l_segment_rec.segment12 := p_rev_adj_rec.from_category_segment12;
956           l_segment_rec.segment13 := p_rev_adj_rec.from_category_segment13;
957           l_segment_rec.segment14 := p_rev_adj_rec.from_category_segment14;
958           l_segment_rec.segment15 := p_rev_adj_rec.from_category_segment15;
959           l_segment_rec.segment16 := p_rev_adj_rec.from_category_segment16;
960           l_segment_rec.segment17 := p_rev_adj_rec.from_category_segment17;
961           l_segment_rec.segment18 := p_rev_adj_rec.from_category_segment18;
962           l_segment_rec.segment19 := p_rev_adj_rec.from_category_segment19;
963           l_segment_rec.segment20 := p_rev_adj_rec.from_category_segment20;
964           OPEN c_category_segs(l_segment_rec);
965           FETCH c_category_segs INTO g_from_category_id;
966           IF c_category_segs%NOTFOUND
967           THEN
968             FND_MESSAGE.set_name (application => 'AR',
969                                   name => 'AR_RA_INVALID_CAT_SEGMENTS');
970             FND_MESSAGE.set_token('CONCAT_SEGS', l_segment_rec.segment1||
971               l_segment_rec.segment2||l_segment_rec.segment3||
972               l_segment_rec.segment4||l_segment_rec.segment5||
973               l_segment_rec.segment6||l_segment_rec.segment7||
974               l_segment_rec.segment8||l_segment_rec.segment9||
975               l_segment_rec.segment10||l_segment_rec.segment11||
976               l_segment_rec.segment12||l_segment_rec.segment13||
977               l_segment_rec.segment14||l_segment_rec.segment15||
978               l_segment_rec.segment16||l_segment_rec.segment17||
979               l_segment_rec.segment18||l_segment_rec.segment19||
980               l_segment_rec.segment20);
981             FND_MSG_PUB.Add;
982             x_return_status := FND_API.G_RET_STS_ERROR ;
983           END IF;
984           CLOSE c_category_segs;
985         ELSIF p_rev_adj_rec.line_selection_mode = 'C'
986         THEN
987           FND_MESSAGE.set_name (application => 'AR',
988                                 name => 'AR_RA_NO_FROM_CATEGORY');
989           FND_MSG_PUB.Add;
990           x_return_status := FND_API.G_RET_STS_ERROR ;
991         END IF;
992       ELSE
993         OPEN c_category_id(p_rev_adj_rec.from_category_id);
994         FETCH c_category_id INTO g_from_category_id;
995         IF c_category_id%NOTFOUND
996         THEN
997           FND_MESSAGE.set_name (application => 'AR',
998                                 name => 'AR_RA_INVALID_CATEGORY_ID');
999           FND_MESSAGE.set_token('CATEGORY_ID', p_rev_adj_rec.from_category_id);
1000           FND_MSG_PUB.Add;
1001           x_return_status := FND_API.G_RET_STS_ERROR ;
1002         END IF;
1003         CLOSE c_category_id;
1004       END IF;
1005       IF g_from_category_id IS NOT NULL
1006       THEN
1007         OPEN c_cat_exists_on_trx(g_from_category_id);
1008         FETCH c_cat_exists_on_trx INTO l_cat_count;
1009         CLOSE c_cat_exists_on_trx;
1010         IF l_cat_count = 0
1011         THEN
1012           FND_MESSAGE.set_name (application => 'AR',
1013                                 name => 'AR_RA_CATEGORY_NOT_ON_TRX');
1014           FND_MESSAGE.set_token('CATEGORY_ID', p_rev_adj_rec.from_category_id);
1015           FND_MSG_PUB.Add;
1016           x_return_status := FND_API.G_RET_STS_ERROR ;
1017         END IF;
1018       END IF;
1019     END IF;
1020       --
1021       -- Validate to category if line transfer
1022       --
1023     IF g_to_category_id IS NOT NULL AND
1024        NVL(p_rev_adj_rec.to_category_id,g_to_category_id - 1) = g_to_category_id
1025     THEN
1026       --
1027       -- Don't revalidate if validated previously in this session
1028       --
1029       NULL;
1030     ELSE
1031       IF p_rev_adj_rec.adjustment_type = 'LL' AND
1032          p_rev_adj_rec.line_selection_mode = 'C'
1033       THEN
1034         IF p_rev_adj_rec.to_category_id IS NULL
1035         THEN
1036           IF (p_rev_adj_rec.to_category_segment1 IS NOT NULL OR
1037               p_rev_adj_rec.to_category_segment2 IS NOT NULL OR
1038               p_rev_adj_rec.to_category_segment3 IS NOT NULL OR
1039               p_rev_adj_rec.to_category_segment4 IS NOT NULL OR
1040               p_rev_adj_rec.to_category_segment5 IS NOT NULL OR
1041               p_rev_adj_rec.to_category_segment6 IS NOT NULL OR
1042               p_rev_adj_rec.to_category_segment7 IS NOT NULL OR
1043               p_rev_adj_rec.to_category_segment8 IS NOT NULL OR
1044               p_rev_adj_rec.to_category_segment9 IS NOT NULL OR
1045               p_rev_adj_rec.to_category_segment10 IS NOT NULL OR
1046               p_rev_adj_rec.to_category_segment11 IS NOT NULL OR
1047               p_rev_adj_rec.to_category_segment12 IS NOT NULL OR
1048               p_rev_adj_rec.to_category_segment13 IS NOT NULL OR
1049               p_rev_adj_rec.to_category_segment14 IS NOT NULL OR
1050               p_rev_adj_rec.to_category_segment15 IS NOT NULL OR
1051               p_rev_adj_rec.to_category_segment16 IS NOT NULL OR
1052               p_rev_adj_rec.to_category_segment17 IS NOT NULL OR
1053               p_rev_adj_rec.to_category_segment18 IS NOT NULL OR
1054               p_rev_adj_rec.to_category_segment19 IS NOT NULL OR
1055               p_rev_adj_rec.to_category_segment20 IS NOT NULL)
1056           THEN
1057             l_segment_rec.segment1 := p_rev_adj_rec.to_category_segment1;
1058             l_segment_rec.segment2 := p_rev_adj_rec.to_category_segment2;
1059             l_segment_rec.segment3 := p_rev_adj_rec.to_category_segment3;
1060             l_segment_rec.segment4 := p_rev_adj_rec.to_category_segment4;
1061             l_segment_rec.segment5 := p_rev_adj_rec.to_category_segment5;
1062             l_segment_rec.segment6 := p_rev_adj_rec.to_category_segment6;
1063             l_segment_rec.segment7 := p_rev_adj_rec.to_category_segment7;
1064             l_segment_rec.segment8 := p_rev_adj_rec.to_category_segment8;
1065             l_segment_rec.segment9 := p_rev_adj_rec.to_category_segment9;
1066             l_segment_rec.segment10 := p_rev_adj_rec.to_category_segment10;
1067             l_segment_rec.segment11 := p_rev_adj_rec.to_category_segment11;
1068             l_segment_rec.segment12 := p_rev_adj_rec.to_category_segment12;
1069             l_segment_rec.segment13 := p_rev_adj_rec.to_category_segment13;
1070             l_segment_rec.segment14 := p_rev_adj_rec.to_category_segment14;
1071             l_segment_rec.segment15 := p_rev_adj_rec.to_category_segment15;
1072             l_segment_rec.segment16 := p_rev_adj_rec.to_category_segment16;
1073             l_segment_rec.segment17 := p_rev_adj_rec.to_category_segment17;
1074             l_segment_rec.segment18 := p_rev_adj_rec.to_category_segment18;
1075             l_segment_rec.segment19 := p_rev_adj_rec.to_category_segment19;
1076             l_segment_rec.segment20 := p_rev_adj_rec.to_category_segment20;
1077             OPEN c_category_segs(l_segment_rec);
1078             FETCH c_category_segs INTO g_to_category_id;
1079             IF c_category_segs%NOTFOUND
1080             THEN
1081               FND_MESSAGE.set_name (application => 'AR',
1082                                     name => 'AR_RA_INVALID_CAT_SEGMENTS');
1083               FND_MESSAGE.set_token('CONCAT_SEGS', l_segment_rec.segment1||
1084                 l_segment_rec.segment2||l_segment_rec.segment3||
1085                 l_segment_rec.segment4||l_segment_rec.segment5||
1086                 l_segment_rec.segment6||l_segment_rec.segment7||
1087                 l_segment_rec.segment8||l_segment_rec.segment9||
1088                 l_segment_rec.segment10||l_segment_rec.segment11||
1089                 l_segment_rec.segment12||l_segment_rec.segment13||
1090                 l_segment_rec.segment14||l_segment_rec.segment15||
1091                 l_segment_rec.segment16||l_segment_rec.segment17||
1092                 l_segment_rec.segment18||l_segment_rec.segment19||
1093                 l_segment_rec.segment20);
1094               FND_MSG_PUB.Add;
1095               x_return_status := FND_API.G_RET_STS_ERROR ;
1096             END IF;
1097             CLOSE c_category_segs;
1098           ELSE
1099             FND_MESSAGE.set_name (application => 'AR',
1100                                   name => 'AR_RA_NO_TO_CATEGORY');
1101             FND_MSG_PUB.Add;
1102             x_return_status := FND_API.G_RET_STS_ERROR ;
1103           END IF;
1104         ELSE
1105           OPEN c_category_id(p_rev_adj_rec.to_category_id);
1106           FETCH c_category_id INTO g_to_category_id;
1107           IF c_category_id%NOTFOUND
1108           THEN
1109             FND_MESSAGE.set_name (application => 'AR',
1110                                   name => 'AR_RA_INVALID_CATEGORY_ID');
1111             FND_MESSAGE.set_token('CATEGORY_ID', p_rev_adj_rec.to_category_id);
1112             FND_MSG_PUB.Add;
1113             x_return_status := FND_API.G_RET_STS_ERROR ;
1114           END IF;
1115           CLOSE c_category_id;
1116         END IF;
1117         IF g_to_category_id IS NOT NULL
1118         THEN
1119           OPEN c_cat_exists_on_trx(g_to_category_id);
1120           FETCH c_cat_exists_on_trx INTO l_cat_count;
1121           CLOSE c_cat_exists_on_trx;
1122           IF l_cat_count = 0
1123           THEN
1124             FND_MESSAGE.set_name (application => 'AR',
1125                                   name => 'AR_RA_CATEGORY_NOT_ON_TRX');
1126             FND_MESSAGE.set_token('CATEGORY_ID', p_rev_adj_rec.to_category_id);
1127             FND_MSG_PUB.Add;
1128             x_return_status := FND_API.G_RET_STS_ERROR ;
1129           END IF;
1130         END IF;
1131       END IF;
1132     END IF;
1133     FND_MSG_PUB.Count_And_Get
1134                            (p_encoded => FND_API.G_FALSE,
1135                             p_count   => x_msg_count,
1136                             p_data    => x_msg_data);
1137   EXCEPTION
1138     WHEN TOO_MANY_ROWS THEN
1139       FND_MESSAGE.set_name (application => 'AR',
1140                             name => 'AR_RA_INVALID_CAT_SEGMENTS');
1141       FND_MESSAGE.set_token('CONCAT_SEGS', l_segment_rec.segment1||
1142         l_segment_rec.segment2||l_segment_rec.segment3||
1143         l_segment_rec.segment4||l_segment_rec.segment5||
1144         l_segment_rec.segment6||l_segment_rec.segment7||
1145         l_segment_rec.segment8||l_segment_rec.segment9||
1146         l_segment_rec.segment10||l_segment_rec.segment11||
1147         l_segment_rec.segment12||l_segment_rec.segment13||
1148         l_segment_rec.segment14||l_segment_rec.segment15||
1149         l_segment_rec.segment16||l_segment_rec.segment17||
1150         l_segment_rec.segment18||l_segment_rec.segment19||
1151         l_segment_rec.segment20);
1152       FND_MSG_PUB.Add;
1153       x_return_status := FND_API.G_RET_STS_ERROR ;
1154     WHEN OTHERS THEN
1155        IF PG_DEBUG in ('Y', 'C') THEN
1156           arp_util.debug('Validate_Category: ' || 'Unexpected error '||sqlerrm||
1157                   ' at AR_RAAPI_UTIL.Validate_Category()+');
1158        END IF;
1159        RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
1160   END Validate_Category;
1161 
1162   PROCEDURE Validate_Item
1163      (p_init_msg_list          IN  VARCHAR2
1164      ,p_rev_adj_rec            IN  AR_Revenue_Adjustment_PVT.Rev_Adj_Rec_Type
1165      ,x_return_status          IN OUT NOCOPY VARCHAR2
1166      ,x_msg_count              OUT NOCOPY NUMBER
1167      ,x_msg_data               OUT NOCOPY VARCHAR2)
1168   IS
1169 
1170     l_segment_rec              Segment_Rec_Type;
1171     l_item_count               NUMBER;
1172 
1173     /* Bug 2157246 - replaced CHR(0) with FND_API.G_MISS_CHAR */
1174     CURSOR c_item_segs (p_segment_rec Segment_Rec_Type) IS
1175       SELECT inventory_item_id
1176       FROM   mtl_system_items
1177       WHERE  NVL(segment1,FND_API.G_MISS_CHAR) =  NVL(p_segment_rec.segment1,FND_API.G_MISS_CHAR)
1178       AND    NVL(segment2,FND_API.G_MISS_CHAR) =  NVL(p_segment_rec.segment2,FND_API.G_MISS_CHAR)
1179       AND    NVL(segment3,FND_API.G_MISS_CHAR) =  NVL(p_segment_rec.segment3,FND_API.G_MISS_CHAR)
1180       AND    NVL(segment4,FND_API.G_MISS_CHAR) =  NVL(p_segment_rec.segment4,FND_API.G_MISS_CHAR)
1181       AND    NVL(segment5,FND_API.G_MISS_CHAR) =  NVL(p_segment_rec.segment5,FND_API.G_MISS_CHAR)
1182       AND    NVL(segment6,FND_API.G_MISS_CHAR) =  NVL(p_segment_rec.segment6,FND_API.G_MISS_CHAR)
1183       AND    NVL(segment7,FND_API.G_MISS_CHAR) =  NVL(p_segment_rec.segment7,FND_API.G_MISS_CHAR)
1184       AND    NVL(segment8,FND_API.G_MISS_CHAR) =  NVL(p_segment_rec.segment8,FND_API.G_MISS_CHAR)
1185       AND    NVL(segment9,FND_API.G_MISS_CHAR) =  NVL(p_segment_rec.segment9,FND_API.G_MISS_CHAR)
1186       AND    NVL(segment10,FND_API.G_MISS_CHAR) = NVL(p_segment_rec.segment10,FND_API.G_MISS_CHAR)
1187       AND    NVL(segment11,FND_API.G_MISS_CHAR) = NVL(p_segment_rec.segment11,FND_API.G_MISS_CHAR)
1188       AND    NVL(segment12,FND_API.G_MISS_CHAR) = NVL(p_segment_rec.segment12,FND_API.G_MISS_CHAR)
1189       AND    NVL(segment13,FND_API.G_MISS_CHAR) = NVL(p_segment_rec.segment13,FND_API.G_MISS_CHAR)
1190       AND    NVL(segment14,FND_API.G_MISS_CHAR) = NVL(p_segment_rec.segment14,FND_API.G_MISS_CHAR)
1191       AND    NVL(segment15,FND_API.G_MISS_CHAR) = NVL(p_segment_rec.segment15,FND_API.G_MISS_CHAR)
1192       AND    NVL(segment16,FND_API.G_MISS_CHAR) = NVL(p_segment_rec.segment16,FND_API.G_MISS_CHAR)
1193       AND    NVL(segment17,FND_API.G_MISS_CHAR) = NVL(p_segment_rec.segment17,FND_API.G_MISS_CHAR)
1194       AND    NVL(segment18,FND_API.G_MISS_CHAR) = NVL(p_segment_rec.segment18,FND_API.G_MISS_CHAR)
1195       AND    NVL(segment19,FND_API.G_MISS_CHAR) = NVL(p_segment_rec.segment19,FND_API.G_MISS_CHAR)
1196       AND    NVL(segment20,FND_API.G_MISS_CHAR) = NVL(p_segment_rec.segment20,FND_API.G_MISS_CHAR)
1197       AND    organization_id = g_inv_org_id;
1198 
1199     CURSOR c_item_id(p_item_id NUMBER) IS
1200       SELECT inventory_item_id
1201       FROM   mtl_system_items
1202       WHERE  inventory_item_id = p_item_id
1203       AND    organization_id = g_inv_org_id;
1204 
1205     CURSOR c_item_exists_on_trx(p_item_id NUMBER) IS
1206       SELECT COUNT(*)
1207       FROM   ra_customer_trx_lines
1208       WHERE  customer_trx_id = g_customer_trx_id
1209       AND    inventory_item_id = p_item_id
1210       AND    line_type = 'LINE';
1211 
1212   BEGIN
1213     IF PG_DEBUG in ('Y', 'C') THEN
1214        arp_util.debug('AR_RAAPI_UTIL.Validate_Item()+');
1215     END IF;
1216     /* 5126974 - move initialization to this function
1217         to avoid org-specific failure in constant_system_values */
1218     IF g_inv_org_id IS NULL
1219     THEN
1220        oe_profile.get('SO_ORGANIZATION_ID',g_inv_org_id);
1221     END IF;
1222     -- Initialize message list if p_init_msg_list is set to TRUE.
1223     IF FND_API.to_Boolean( p_init_msg_list )
1224     THEN
1225       FND_MSG_PUB.initialize;
1226     END IF;
1227     --
1228     -- Validate from item
1229     --
1230     IF g_from_inventory_item_id IS NOT NULL AND
1231        NVL(p_rev_adj_rec.from_inventory_item_id,g_from_inventory_item_id - 1)
1232                          = g_from_inventory_item_id
1233     THEN
1234       --
1235       -- Don't revalidate if validated previously in this session
1236       --
1237       NULL;
1238     ELSE
1239       IF p_rev_adj_rec.from_inventory_item_id IS NULL
1240       THEN
1241         IF (p_rev_adj_rec.from_item_segment1 IS NOT NULL OR
1242             p_rev_adj_rec.from_item_segment2 IS NOT NULL OR
1243             p_rev_adj_rec.from_item_segment3 IS NOT NULL OR
1244             p_rev_adj_rec.from_item_segment4 IS NOT NULL OR
1245             p_rev_adj_rec.from_item_segment5 IS NOT NULL OR
1246             p_rev_adj_rec.from_item_segment6 IS NOT NULL OR
1247             p_rev_adj_rec.from_item_segment7 IS NOT NULL OR
1248             p_rev_adj_rec.from_item_segment8 IS NOT NULL OR
1249             p_rev_adj_rec.from_item_segment9 IS NOT NULL OR
1250             p_rev_adj_rec.from_item_segment10 IS NOT NULL OR
1251             p_rev_adj_rec.from_item_segment11 IS NOT NULL OR
1252             p_rev_adj_rec.from_item_segment12 IS NOT NULL OR
1253             p_rev_adj_rec.from_item_segment13 IS NOT NULL OR
1254             p_rev_adj_rec.from_item_segment14 IS NOT NULL OR
1255             p_rev_adj_rec.from_item_segment15 IS NOT NULL OR
1256             p_rev_adj_rec.from_item_segment16 IS NOT NULL OR
1257             p_rev_adj_rec.from_item_segment17 IS NOT NULL OR
1258             p_rev_adj_rec.from_item_segment18 IS NOT NULL OR
1259             p_rev_adj_rec.from_item_segment19 IS NOT NULL OR
1260             p_rev_adj_rec.from_item_segment20 IS NOT NULL)
1261         THEN
1262           l_segment_rec.segment1 := p_rev_adj_rec.from_item_segment1;
1263           l_segment_rec.segment2 := p_rev_adj_rec.from_item_segment2;
1264           l_segment_rec.segment3 := p_rev_adj_rec.from_item_segment3;
1265           l_segment_rec.segment4 := p_rev_adj_rec.from_item_segment4;
1266           l_segment_rec.segment5 := p_rev_adj_rec.from_item_segment5;
1267           l_segment_rec.segment6 := p_rev_adj_rec.from_item_segment6;
1268           l_segment_rec.segment7 := p_rev_adj_rec.from_item_segment7;
1269           l_segment_rec.segment8 := p_rev_adj_rec.from_item_segment8;
1270           l_segment_rec.segment9 := p_rev_adj_rec.from_item_segment9;
1271           l_segment_rec.segment10 := p_rev_adj_rec.from_item_segment10;
1272           l_segment_rec.segment11 := p_rev_adj_rec.from_item_segment11;
1273           l_segment_rec.segment12 := p_rev_adj_rec.from_item_segment12;
1274           l_segment_rec.segment13 := p_rev_adj_rec.from_item_segment13;
1275           l_segment_rec.segment14 := p_rev_adj_rec.from_item_segment14;
1276           l_segment_rec.segment15 := p_rev_adj_rec.from_item_segment15;
1277           l_segment_rec.segment16 := p_rev_adj_rec.from_item_segment16;
1278           l_segment_rec.segment17 := p_rev_adj_rec.from_item_segment17;
1279           l_segment_rec.segment18 := p_rev_adj_rec.from_item_segment18;
1280           l_segment_rec.segment19 := p_rev_adj_rec.from_item_segment19;
1281           l_segment_rec.segment20 := p_rev_adj_rec.from_item_segment20;
1282           OPEN c_item_segs(l_segment_rec);
1283           FETCH c_item_segs INTO g_from_inventory_item_id;
1284           IF c_item_segs%NOTFOUND
1285           THEN
1286             FND_MESSAGE.set_name (application => 'AR',
1287                                   name => 'AR_RA_INVALID_ITEM_SEGMENTS');
1288             FND_MESSAGE.set_token('CONCAT_SEGS', l_segment_rec.segment1||
1289               l_segment_rec.segment2||l_segment_rec.segment3||
1290               l_segment_rec.segment4||l_segment_rec.segment5||
1291               l_segment_rec.segment6||l_segment_rec.segment7||
1292               l_segment_rec.segment8||l_segment_rec.segment9||
1293               l_segment_rec.segment10||l_segment_rec.segment11||
1294               l_segment_rec.segment12||l_segment_rec.segment13||
1295               l_segment_rec.segment14||l_segment_rec.segment15||
1296               l_segment_rec.segment16||l_segment_rec.segment17||
1297               l_segment_rec.segment18||l_segment_rec.segment19||
1298               l_segment_rec.segment20);
1299             FND_MSG_PUB.Add;
1300             x_return_status := FND_API.G_RET_STS_ERROR ;
1301           END IF;
1302           CLOSE c_item_segs;
1303         ELSIF p_rev_adj_rec.line_selection_mode = 'I'
1304         THEN
1305           FND_MESSAGE.set_name (application => 'AR',
1306                                 name => 'AR_RA_NO_FROM_ITEM');
1307           FND_MSG_PUB.Add;
1308           x_return_status := FND_API.G_RET_STS_ERROR ;
1309         END IF;
1310       ELSE
1311         OPEN c_item_id(p_rev_adj_rec.from_inventory_item_id);
1312         FETCH c_item_id INTO g_from_inventory_item_id;
1313         IF c_item_id%NOTFOUND
1314         THEN
1315           FND_MESSAGE.set_name (application => 'AR',
1316                                 name => 'AR_RA_INVALID_ITEM_ID');
1317           FND_MESSAGE.set_token('ITEM_ID',p_rev_adj_rec.from_inventory_item_id);
1318           FND_MSG_PUB.Add;
1319           x_return_status := FND_API.G_RET_STS_ERROR ;
1320         END IF;
1321         close c_item_id;
1322       END IF;
1323       IF g_from_inventory_item_id IS NOT NULL
1324       THEN
1325         OPEN c_item_exists_on_trx(g_from_inventory_item_id);
1326         FETCH c_item_exists_on_trx INTO l_item_count;
1327         CLOSE c_item_exists_on_trx;
1328         IF l_item_count = 0
1329         THEN
1330           FND_MESSAGE.set_name (application => 'AR',
1331                                 name => 'AR_RA_ITEM_NOT_ON_TRX');
1332           FND_MESSAGE.set_token('ITEM_ID',p_rev_adj_rec.from_inventory_item_id);
1333           FND_MSG_PUB.Add;
1334           x_return_status := FND_API.G_RET_STS_ERROR ;
1335         END IF;
1336       END IF;
1337     END IF;
1338     --
1339     -- Validate to item if line transfer
1340     --
1341     IF g_to_inventory_item_id IS NOT NULL AND
1342        NVL(p_rev_adj_rec.to_inventory_item_id,g_to_inventory_item_id - 1)
1343                             = g_to_inventory_item_id
1344     THEN
1345       --
1346       -- Don't revalidate if validated previously in this session
1347       --
1348       NULL;
1349     ELSE
1350       IF p_rev_adj_rec.adjustment_type = 'LL' AND
1351          p_rev_adj_rec.line_selection_mode = 'I'
1352       THEN
1353         IF p_rev_adj_rec.to_inventory_item_id IS NULL
1354         THEN
1355           IF (p_rev_adj_rec.to_item_segment1 IS NOT NULL OR
1356               p_rev_adj_rec.to_item_segment2 IS NOT NULL OR
1357               p_rev_adj_rec.to_item_segment3 IS NOT NULL OR
1358               p_rev_adj_rec.to_item_segment4 IS NOT NULL OR
1359               p_rev_adj_rec.to_item_segment5 IS NOT NULL OR
1360               p_rev_adj_rec.to_item_segment6 IS NOT NULL OR
1361               p_rev_adj_rec.to_item_segment7 IS NOT NULL OR
1362               p_rev_adj_rec.to_item_segment8 IS NOT NULL OR
1363               p_rev_adj_rec.to_item_segment9 IS NOT NULL OR
1364               p_rev_adj_rec.to_item_segment10 IS NOT NULL OR
1365               p_rev_adj_rec.to_item_segment11 IS NOT NULL OR
1366               p_rev_adj_rec.to_item_segment12 IS NOT NULL OR
1367               p_rev_adj_rec.to_item_segment13 IS NOT NULL OR
1368               p_rev_adj_rec.to_item_segment14 IS NOT NULL OR
1369               p_rev_adj_rec.to_item_segment15 IS NOT NULL OR
1370               p_rev_adj_rec.to_item_segment16 IS NOT NULL OR
1371               p_rev_adj_rec.to_item_segment17 IS NOT NULL OR
1372               p_rev_adj_rec.to_item_segment18 IS NOT NULL OR
1373               p_rev_adj_rec.to_item_segment19 IS NOT NULL OR
1374               p_rev_adj_rec.to_item_segment20 IS NOT NULL)
1375           THEN
1376             l_segment_rec.segment1 := p_rev_adj_rec.to_item_segment1;
1377             l_segment_rec.segment2 := p_rev_adj_rec.to_item_segment2;
1378             l_segment_rec.segment3 := p_rev_adj_rec.to_item_segment3;
1379             l_segment_rec.segment4 := p_rev_adj_rec.to_item_segment4;
1380             l_segment_rec.segment5 := p_rev_adj_rec.to_item_segment5;
1381             l_segment_rec.segment6 := p_rev_adj_rec.to_item_segment6;
1382             l_segment_rec.segment7 := p_rev_adj_rec.to_item_segment7;
1383             l_segment_rec.segment8 := p_rev_adj_rec.to_item_segment8;
1384             l_segment_rec.segment9 := p_rev_adj_rec.to_item_segment9;
1385             l_segment_rec.segment10 := p_rev_adj_rec.to_item_segment10;
1386             l_segment_rec.segment11 := p_rev_adj_rec.to_item_segment11;
1387             l_segment_rec.segment12 := p_rev_adj_rec.to_item_segment12;
1388             l_segment_rec.segment13 := p_rev_adj_rec.to_item_segment13;
1389             l_segment_rec.segment14 := p_rev_adj_rec.to_item_segment14;
1390             l_segment_rec.segment15 := p_rev_adj_rec.to_item_segment15;
1391             l_segment_rec.segment16 := p_rev_adj_rec.to_item_segment16;
1392             l_segment_rec.segment17 := p_rev_adj_rec.to_item_segment17;
1393             l_segment_rec.segment18 := p_rev_adj_rec.to_item_segment18;
1394             l_segment_rec.segment19 := p_rev_adj_rec.to_item_segment19;
1395             l_segment_rec.segment20 := p_rev_adj_rec.to_item_segment20;
1396             OPEN c_item_segs(l_segment_rec);
1397             FETCH c_item_segs INTO g_to_inventory_item_id;
1398             IF c_item_segs%NOTFOUND
1399             THEN
1400               FND_MESSAGE.set_name (application => 'AR',
1401                                     name => 'AR_RA_INVALID_ITEM_SEGMENTS');
1402               FND_MESSAGE.set_token('CONCAT_SEGS', l_segment_rec.segment1||
1403                 l_segment_rec.segment2||l_segment_rec.segment3||
1404                 l_segment_rec.segment4||l_segment_rec.segment5||
1405                 l_segment_rec.segment6||l_segment_rec.segment7||
1406                 l_segment_rec.segment8||l_segment_rec.segment9||
1407                 l_segment_rec.segment10||l_segment_rec.segment11||
1408                 l_segment_rec.segment12||l_segment_rec.segment13||
1409                 l_segment_rec.segment14||l_segment_rec.segment15||
1410                 l_segment_rec.segment16||l_segment_rec.segment17||
1411                 l_segment_rec.segment18||l_segment_rec.segment19||
1412                 l_segment_rec.segment20);
1413               FND_MSG_PUB.Add;
1414               x_return_status := FND_API.G_RET_STS_ERROR ;
1415             END IF;
1416             CLOSE c_item_segs;
1417           ELSE
1418             FND_MESSAGE.set_name (application => 'AR',
1419                                   name => 'AR_RA_NO_TO_ITEM');
1420             FND_MSG_PUB.Add;
1421             x_return_status := FND_API.G_RET_STS_ERROR ;
1422           END IF;
1423         ELSE
1424           OPEN c_item_id(p_rev_adj_rec.to_inventory_item_id);
1425           FETCH c_item_id INTO g_to_inventory_item_id;
1426           IF c_item_id%NOTFOUND
1427           THEN
1428             FND_MESSAGE.set_name (application => 'AR',
1429                                   name => 'AR_RA_INVALID_ITEM_ID');
1430             FND_MESSAGE.set_token('ITEM_ID',p_rev_adj_rec.to_inventory_item_id);
1431             FND_MSG_PUB.Add;
1432             x_return_status := FND_API.G_RET_STS_ERROR ;
1433           END IF;
1434           CLOSE c_item_id;
1435         END IF;
1436         IF g_to_inventory_item_id IS NOT NULL
1437         THEN
1438           OPEN c_item_exists_on_trx(g_to_inventory_item_id);
1439           FETCH c_item_exists_on_trx INTO l_item_count;
1440           CLOSE c_item_exists_on_trx;
1441           IF l_item_count = 0
1442           THEN
1443             FND_MESSAGE.set_name (application => 'AR',
1444                                   name => 'AR_RA_ITEM_NOT_ON_TRX');
1445             FND_MESSAGE.set_token('ITEM_ID',p_rev_adj_rec.to_inventory_item_id);
1446             FND_MSG_PUB.Add;
1447             x_return_status := FND_API.G_RET_STS_ERROR ;
1448           END IF;
1449         END IF;
1450       END IF;
1451     END IF;
1452     FND_MSG_PUB.Count_And_Get
1453                            (p_encoded => FND_API.G_FALSE,
1454                             p_count   => x_msg_count,
1455                             p_data    => x_msg_data);
1456   EXCEPTION
1457     WHEN TOO_MANY_ROWS THEN
1458       FND_MESSAGE.set_name (application => 'AR',
1459                             name => 'AR_RA_INVALID_ITEM_SEGMENTS');
1460       FND_MESSAGE.set_token('CONCAT_SEGS', l_segment_rec.segment1||
1461         l_segment_rec.segment2||l_segment_rec.segment3||
1462         l_segment_rec.segment4||l_segment_rec.segment5||
1463         l_segment_rec.segment6||l_segment_rec.segment7||
1464         l_segment_rec.segment8||l_segment_rec.segment9||
1465         l_segment_rec.segment10||l_segment_rec.segment11||
1466         l_segment_rec.segment12||l_segment_rec.segment13||
1467         l_segment_rec.segment14||l_segment_rec.segment15||
1468         l_segment_rec.segment16||l_segment_rec.segment17||
1469         l_segment_rec.segment18||l_segment_rec.segment19||
1470         l_segment_rec.segment20);
1471       FND_MSG_PUB.Add;
1472       x_return_status := FND_API.G_RET_STS_ERROR ;
1473     WHEN OTHERS THEN
1474        IF PG_DEBUG in ('Y', 'C') THEN
1475           arp_util.debug('Validate_Item: ' || 'Unexpected error '||sqlerrm||
1476                   ' at AR_RAAPI_UTIL.Validate_Item()+');
1477        END IF;
1478        RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
1479   END Validate_Item;
1480 
1481   PROCEDURE Validate_Line
1482      (p_init_msg_list          IN  VARCHAR2
1483      ,p_rev_adj_rec            IN  AR_Revenue_Adjustment_PVT.Rev_Adj_Rec_Type
1484      ,x_return_status          IN OUT NOCOPY VARCHAR2
1485      ,x_msg_count              OUT NOCOPY NUMBER
1486      ,x_msg_data               OUT NOCOPY VARCHAR2)
1487   IS
1488 
1489     CURSOR c_line_num (p_line_number NUMBER) IS
1490       SELECT customer_trx_line_id
1491       FROM   ra_customer_trx_lines
1492       WHERE  line_number = p_line_number
1493       AND    customer_trx_id = g_customer_trx_id
1494       AND    line_type = 'LINE';
1495 
1496     CURSOR c_line_id (p_line_id NUMBER) IS
1497       SELECT customer_trx_line_id
1498       FROM   ra_customer_trx_lines
1499       WHERE  customer_trx_line_id = p_line_id
1500       AND    customer_trx_id = g_customer_trx_id
1501       AND    line_type = 'LINE';
1502 
1503   BEGIN
1504     IF PG_DEBUG in ('Y', 'C') THEN
1505        arp_util.debug('AR_RAAPI_UTIL.Validate_Line()+');
1506     END IF;
1507     -- Initialize message list if p_init_msg_list is set to TRUE.
1508     IF FND_API.to_Boolean( p_init_msg_list )
1509     THEN
1510       FND_MSG_PUB.initialize;
1511     END IF;
1512     --
1513     -- Validate from line
1514     --
1515     IF p_rev_adj_rec.from_cust_trx_line_id IS NULL
1516     THEN
1517       IF p_rev_adj_rec.from_line_number IS NOT NULL
1518       THEN
1519         OPEN c_line_num(p_rev_adj_rec.from_line_number);
1520         FETCH c_line_num INTO g_from_cust_trx_line_id;
1521         IF c_line_num%NOTFOUND
1522         THEN
1523           FND_MESSAGE.set_name (application => 'AR',
1524                                 name => 'AR_RA_LINE_NOT_ON_TRX');
1525           FND_MESSAGE.set_token('LINE_NUMBER', p_rev_adj_rec.from_line_number);
1526           FND_MSG_PUB.Add;
1527           x_return_status := FND_API.G_RET_STS_ERROR ;
1528         END IF;
1529         CLOSE c_line_num;
1530       ELSIF p_rev_adj_rec.line_selection_mode = 'L'
1531       THEN
1532         FND_MESSAGE.set_name (application => 'AR',
1533                               name => 'AR_RA_NO_FROM_LINE');
1534         FND_MSG_PUB.Add;
1535         x_return_status := FND_API.G_RET_STS_ERROR ;
1536       END IF;
1537     ELSE
1538       OPEN c_line_id(p_rev_adj_rec.from_cust_trx_line_id);
1539       FETCH c_line_id INTO g_from_cust_trx_line_id;
1540       IF c_line_id%NOTFOUND
1541       THEN
1542         FND_MESSAGE.set_name (application => 'AR',
1543                               name => 'AR_RA_INVALID_LINE_ID');
1544         FND_MESSAGE.set_token('CUST_TRX_LINE_ID',
1545                                   p_rev_adj_rec.from_cust_trx_line_id);
1546         FND_MSG_PUB.Add;
1547         x_return_status := FND_API.G_RET_STS_ERROR ;
1548       END IF;
1549       CLOSE c_line_id;
1550     END IF;
1551 
1552     FND_MSG_PUB.Count_And_Get
1553                            (p_encoded => FND_API.G_FALSE,
1554                             p_count   => x_msg_count,
1555                             p_data    => x_msg_data);
1556   EXCEPTION
1557      WHEN OTHERS THEN
1558        IF PG_DEBUG in ('Y', 'C') THEN
1559           arp_util.debug('Validate_Line: ' || 'Unexpected error '||sqlerrm||
1560                   ' at AR_RAAPI_UTIL.Validate_Line()+');
1561        END IF;
1562        RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
1563   END Validate_Line;
1564 
1565   /* Bug 2146970 - changed main in parameter from p_rev_adj_rec to p_gl_date
1566      and converted from procedure to function */
1567   FUNCTION Validate_GL_Date
1568      (p_gl_date                IN DATE)
1569   RETURN DATE
1570   IS
1571 
1572     l_gl_date                 DATE;
1573     l_valid_gl_date           DATE;
1574     l_default_rule            VARCHAR2(80);
1575     l_err_mesg                VARCHAR2(2000);
1576 
1577   BEGIN
1578     IF PG_DEBUG in ('Y', 'C') THEN
1579        arp_util.debug('AR_RAAPI_UTIL.Validate_GL_Date()+');
1580     END IF;
1581 --
1582 -- Bug 2030914: need to allow NOT OPENNED periods
1583 --              changed p_allow_not_open_flag from 'N' to 'Y'
1584 --
1585     l_gl_date := NVL(p_gl_date,SYSDATE);
1586     l_valid_gl_date := NULL;
1587     IF ARP_STANDARD.validate_and_default_gl_date
1588              (gl_date => p_gl_date,
1589               trx_date => g_trx_date,
1590               validation_date1 => NULL,
1591               validation_date2 => NULL,
1592               validation_date3 => NULL,
1593               default_date1 => NULL,
1594               default_date2 => NULL,
1595               default_date3 => NULL,
1596               p_allow_not_open_flag   => 'Y',
1597               p_invoicing_rule_id => g_invoicing_rule_id,
1598               p_set_of_books_id => arp_global.sysparam.set_of_books_id,
1599               p_application_id => AR_RAAPI_UTIL.application_id,
1600               default_gl_date => l_valid_gl_date,
1601               defaulting_rule_used  => l_default_rule,
1602               error_message  => l_err_mesg)
1603     THEN
1604       IF p_gl_date <> l_valid_gl_date
1605       THEN
1606         FND_MESSAGE.set_name('AR','AR_RA_GL_DATE_CHANGED');
1607 	--Int'l Calendar Project
1608         FND_MESSAGE.set_token('GL_DATE',fnd_date.date_to_chardate(p_gl_date, calendar_aware=> FND_DATE.calendar_aware_alt));
1609         FND_MESSAGE.set_token('NEW_GL_DATE',fnd_date.date_to_chardate(l_valid_gl_date, calendar_aware=> FND_DATE.calendar_aware_alt));
1610         FND_MSG_PUB.Add;
1611       END IF;
1612     END IF;
1613     RETURN l_valid_gl_date;
1614   EXCEPTION
1615      WHEN OTHERS THEN
1616        IF PG_DEBUG in ('Y', 'C') THEN
1617           arp_util.debug('Validate_GL_Date: ' || 'Unexpected error '||sqlerrm||
1618                   ' at AR_RAAPI_UTIL.Validate_GL_Date()+');
1619        END IF;
1620        RETURN NULL;
1621   END Validate_GL_Date;
1622 
1623   FUNCTION bump_gl_date_if_closed
1624      (p_gl_date                IN DATE)
1625   RETURN DATE
1626   IS
1627 
1628   BEGIN
1629     IF PG_DEBUG in ('Y', 'C') THEN
1630        arp_util.debug('AR_RAAPI_UTIL.bump_gl_date_if_closed()+');
1631     END IF;
1632 
1633     /* Bug 3879222 - replaced proprietary logic with a call to
1634        arp_auto_rule.assign_gl_date.  That routine caches
1635        dates and calendar to make for faster returns */
1636     RETURN arp_auto_rule.assign_gl_date(p_gl_date);
1637 
1638     IF PG_DEBUG in ('Y', 'C') THEN
1639        arp_util.debug('AR_RAAPI_UTIL.bump_gl_date_if_closed()-');
1640     END IF;
1641   EXCEPTION
1642      WHEN OTHERS THEN
1643        IF PG_DEBUG in ('Y', 'C') THEN
1644           arp_util.debug('bump_gl_date_if_closed: ' || 'Unexpected error '||sqlerrm||
1645                   ' at AR_RAAPI_UTIL.bump_gl_date_if_closed()+');
1646        END IF;
1647        RETURN NULL;
1648   END bump_gl_date_if_closed;
1649 
1650 PROCEDURE Validate_Other
1651      (p_init_msg_list          IN  VARCHAR2
1652      ,p_rev_adj_rec            IN  AR_Revenue_Adjustment_PVT.Rev_Adj_Rec_Type
1653      ,x_return_status          IN OUT NOCOPY VARCHAR2
1654      ,x_msg_count              OUT NOCOPY NUMBER
1655      ,x_msg_data               OUT NOCOPY VARCHAR2)
1656   IS
1657     l_meaning                  ar_lookups.meaning%TYPE;
1658     l_attribute_rec            ar_receipt_api_pub.attribute_rec_type;
1659     l_df_return_status         VARCHAR2(1);
1660 
1661   BEGIN
1662     IF PG_DEBUG in ('Y', 'C') THEN
1663        arp_util.debug('AR_RAAPI_UTIL.Validate_Other()+');
1664     END IF;
1665     -- Initialize message list if p_init_msg_list is set to TRUE.
1666     IF FND_API.to_Boolean( p_init_msg_list )
1667     THEN
1668       FND_MSG_PUB.initialize;
1669     END IF;
1670     IF p_rev_adj_rec.adjustment_type NOT IN ('UN','EA','SA','NR')
1671 --  'LL' temporarily disabled
1672     THEN
1673       FND_MESSAGE.set_name (application => 'AR',
1674                             name => 'AR_RA_INVALID_ADJUST_TYPE');
1675       FND_MESSAGE.set_token('ADJUST_TYPE', p_rev_adj_rec.adjustment_type);
1676       FND_MSG_PUB.Add;
1677       x_return_status := FND_API.G_RET_STS_ERROR ;
1678     END IF;
1679     IF p_rev_adj_rec.sales_credit_type NOT IN ('R','N','B')
1680     THEN
1681       FND_MESSAGE.set_name (application => 'AR',
1682                             name => 'AR_RA_INVALID_SALESCRED_TYPE');
1683       FND_MESSAGE.set_token('SALESCRED_TYPE', p_rev_adj_rec.sales_credit_type);
1684       FND_MSG_PUB.Add;
1685       x_return_status := FND_API.G_RET_STS_ERROR ;
1686     END IF;
1687     IF p_rev_adj_rec.amount_mode NOT IN ('T','A','P')
1688     THEN
1689       FND_MESSAGE.set_name (application => 'AR',
1690                             name => 'AR_RA_INVALID_AMOUNT_MODE');
1691       FND_MESSAGE.set_token('AMOUNT_MODE', p_rev_adj_rec.amount_mode);
1692       FND_MSG_PUB.Add;
1693       x_return_status := FND_API.G_RET_STS_ERROR ;
1694     END IF;
1695     IF p_rev_adj_rec.line_selection_mode NOT IN ('A','C','I','S')
1696     THEN
1697       FND_MESSAGE.set_name (application => 'AR',
1698                             name => 'AR_RA_INVALID_LINE_MODE');
1699       FND_MESSAGE.set_token('LINE_MODE', p_rev_adj_rec.line_selection_mode);
1700       FND_MSG_PUB.Add;
1701       x_return_status := FND_API.G_RET_STS_ERROR ;
1702     END IF;
1703     IF AR_Revenue_Adjustment_PVT.g_update_db_flag = 'Y'
1704     THEN
1705       /* Bug 4304865 - separate lookup for sales credit adjustments */
1706       IF p_rev_adj_rec.adjustment_type IN ('SA','NR') THEN
1707          l_meaning := ARPT_SQL_FUNC_UTIL.get_lookup_meaning
1708                               (p_lookup_type => 'SALESCRED_ADJ_REASON'
1709                               ,p_lookup_code => p_rev_adj_rec.reason_code);
1710       ELSE
1711          l_meaning := ARPT_SQL_FUNC_UTIL.get_lookup_meaning
1712                               (p_lookup_type => 'REV_ADJ_REASON'
1713                               ,p_lookup_code => p_rev_adj_rec.reason_code);
1714       END IF;
1715       IF l_meaning IS NULL
1716       THEN
1717         /* Bug 2312077 - incorrect message replaced */
1718         FND_MESSAGE.set_name (application => 'AR',
1719                               name => 'AR_RA_INVALID_REASON');
1720         FND_MESSAGE.set_token('REASON_CODE', p_rev_adj_rec.reason_code);
1721         FND_MSG_PUB.Add;
1722         x_return_status := FND_API.G_RET_STS_ERROR ;
1723       END IF;
1724     END IF;
1725 
1726     --
1727     -- Validate and default the dff attributes
1728     --
1729     l_attribute_rec.attribute1     := p_rev_adj_rec.attribute1;
1730     l_attribute_rec.attribute2     := p_rev_adj_rec.attribute2;
1731     l_attribute_rec.attribute3     := p_rev_adj_rec.attribute3;
1732     l_attribute_rec.attribute4     := p_rev_adj_rec.attribute4;
1733     l_attribute_rec.attribute5     := p_rev_adj_rec.attribute5;
1734     l_attribute_rec.attribute6     := p_rev_adj_rec.attribute6;
1735     l_attribute_rec.attribute7     := p_rev_adj_rec.attribute7;
1736     l_attribute_rec.attribute8     := p_rev_adj_rec.attribute8;
1737     l_attribute_rec.attribute9     := p_rev_adj_rec.attribute9;
1738     l_attribute_rec.attribute10    := p_rev_adj_rec.attribute10;
1739     l_attribute_rec.attribute11    := p_rev_adj_rec.attribute11;
1740     l_attribute_rec.attribute12    := p_rev_adj_rec.attribute12;
1741     l_attribute_rec.attribute13    := p_rev_adj_rec.attribute13;
1742     l_attribute_rec.attribute14    := p_rev_adj_rec.attribute14;
1743     l_attribute_rec.attribute15    := p_rev_adj_rec.attribute15;
1744     ar_receipt_lib_pvt.Validate_Desc_Flexfield(
1745                                             l_attribute_rec,
1746                                             'AR_REVENUE_ADJUSTMENTS',
1747                                             l_df_return_status
1748                                             );
1749     IF NVL(l_df_return_status,FND_API.G_RET_STS_SUCCESS) <>
1750                                          FND_API.G_RET_STS_SUCCESS
1751     THEN
1752       x_return_status := l_df_return_status;
1753     END IF;
1754     FND_MSG_PUB.Count_And_Get
1755                            (p_encoded => FND_API.G_FALSE,
1756                             p_count   => x_msg_count,
1757                             p_data    => x_msg_data);
1758   EXCEPTION
1759      WHEN OTHERS THEN
1760        IF PG_DEBUG in ('Y', 'C') THEN
1761           arp_util.debug('Validate_Other: ' || 'Unexpected error '||sqlerrm||
1762                   ' at AR_RAAPI_UTIL.Validate_Other()+');
1763        END IF;
1764        RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
1765   END Validate_Other;
1766 
1767   --
1768   -- Public function to return the cost center for a given salesrep
1769   --
1770   FUNCTION Get_Salesrep_Cost_Ctr
1771     (p_salesrep_id  IN NUMBER)
1772   RETURN VARCHAR2
1773   IS
1774     l_cost_ctr      VARCHAR2(30);
1775     CURSOR c_cost_ctr IS
1776       SELECT get_cost_ctr(gl_id_rev)
1777       FROM   ra_salesreps
1778       WHERE  salesrep_id = p_salesrep_id;
1779   BEGIN
1780     OPEN c_cost_ctr;
1781     FETCH c_cost_ctr INTO l_cost_ctr;
1782     CLOSE c_cost_ctr;
1783     RETURN l_cost_ctr;
1784   EXCEPTION
1785     WHEN OTHERS THEN
1786       RETURN NULL;
1787   END Get_Salesrep_Cost_Ctr;
1788 
1789   --
1790   -- Public function to return the cost center segment value for a given ccid
1791   --
1792   FUNCTION Get_Cost_Ctr
1793     (p_code_combination_id  IN NUMBER)
1794   RETURN VARCHAR2
1795   IS
1796     /* Bug 4675438: moved from constant_system_values as is dependent on
1797        MOAC initialization */
1798     CURSOR c_cost_ctr_segmt IS
1799       SELECT b.segment_num
1800       FROM   fnd_segment_attribute_values a ,
1801              fnd_id_flex_segments b ,
1802              gl_sets_of_books c
1803       WHERE  a.id_flex_num = c.chart_of_accounts_id
1804              AND c.set_of_books_id = arp_global.sysparam.set_of_books_id
1805              AND a.application_id = 101
1806              AND a.id_flex_code = 'GL#'
1807              AND a.attribute_value = 'Y'
1808              AND a.segment_attribute_type = 'FA_COST_CTR'
1809              AND a.application_id = b.application_id
1810              AND a.id_flex_code = b.id_flex_code
1811              AND a.id_flex_num = b.id_flex_num
1812              AND a.application_column_name = b.application_column_name
1813              AND a.id_flex_num = b.id_flex_num
1814              AND b.enabled_flag = 'Y';
1815     l_segnum                     NUMBER;
1816     l_number_of_segs             NUMBER;
1817     l_segment_array              fnd_flex_ext.segmentarray;
1818     l_segment_value              VARCHAR2(30);
1819 
1820   BEGIN
1821     IF NOT fnd_flex_ext.get_segments ('SQLGL'
1822                                      ,'GL#'
1823                                      ,arp_global.chart_of_accounts_id
1824                                      ,p_code_combination_id
1825                                      ,l_number_of_segs
1826                                      ,l_segment_array)
1827     THEN
1828       RETURN NULL;
1829     END IF;
1830     OPEN c_cost_ctr_segmt;
1831     FETCH c_cost_ctr_segmt INTO l_segnum;
1832     CLOSE c_cost_ctr_segmt;
1833 
1834     l_segment_value := l_segment_array(l_segnum);
1835     RETURN l_segment_value;
1836   EXCEPTION
1837     WHEN OTHERS THEN
1838       RETURN NULL;
1839   END Get_Cost_Ctr;
1840 
1841 
1842   PROCEDURE Validate_Sales_Credits
1843           (p_init_msg_list         IN VARCHAR2
1844           ,p_customer_trx_id       IN  NUMBER
1845           ,p_sales_credit_type     IN  VARCHAR2
1846           ,p_salesrep_id           IN  NUMBER
1847           ,p_salesgroup_id         IN  NUMBER DEFAULT NULL  -- bug 3067675
1848           ,p_customer_trx_line_id  IN  NUMBER
1849           ,p_item_id               IN  NUMBER
1850           ,p_category_id           IN  NUMBER
1851           ,x_return_status         IN OUT NOCOPY VARCHAR2
1852           ,x_msg_count             OUT NOCOPY NUMBER
1853           ,x_msg_data              OUT NOCOPY VARCHAR2)
1854   IS
1855     l_revenue_percent_total        NUMBER;
1856     l_non_revenue_percent_total    NUMBER;
1857 
1858     CURSOR c_salesrep_totals IS
1859     SELECT NVL(SUM(s.revenue_percent_split),0),
1860            NVL(SUM(s.non_revenue_percent_split),0)
1861     FROM   ra_cust_trx_line_salesreps s,
1862            mtl_item_categories mic,
1863            ra_customer_trx_lines l
1864     WHERE  s.customer_trx_line_id = l.customer_trx_line_id
1865     AND    l.customer_trx_id = p_customer_trx_id
1866     AND    l.line_type = 'LINE'
1867     AND    s.salesrep_id = NVL(p_salesrep_id,s.salesrep_id)
1868 /* BEGIN bug 3067675 */
1869     AND    DECODE(p_sales_credit_type,'N', NVL(s.non_revenue_salesgroup_id, -9999), NVL(s.revenue_salesgroup_id, -9999)) =
1870                 NVL(p_salesgroup_id, DECODE(p_sales_credit_type,'N', NVL(s.non_revenue_salesgroup_id, -9999), NVL(s.revenue_salesgroup_id, -9999)))
1871 /* END bug 3067675 */
1872     AND    l.customer_trx_line_id = NVL(p_customer_trx_line_id,
1873                                          l.customer_trx_line_id)
1874     AND    NVL(l.inventory_item_id,0) =
1875             NVL(p_item_id,NVL(l.inventory_item_id,0))
1876     AND    mic.organization_id(+) = g_inv_org_id
1877     AND    l.inventory_item_id = mic.inventory_item_id(+)
1878     AND    NVL(p_category_id,0) =
1879                  DECODE(p_category_id,NULL,0,mic.category_id)
1880     AND    mic.category_set_id(+) = g_category_set_id;
1881 
1882   BEGIN
1883     IF PG_DEBUG in ('Y', 'C') THEN
1884        arp_util.debug('AR_RAAPI_UTIL.Validate_Sales_Credits()+');
1885     END IF;
1886     /* 5126974 - move initialization to this function
1887         to avoid org-specific failure in constant_system_values */
1888     IF g_inv_org_id IS NULL
1889     THEN
1890        oe_profile.get('SO_ORGANIZATION_ID',g_inv_org_id);
1891     END IF;
1892     -- Initialize message list if p_init_msg_list is set to TRUE.
1893     IF FND_API.to_Boolean( p_init_msg_list )
1894     THEN
1895       FND_MSG_PUB.initialize;
1896     END IF;
1897     x_return_status := FND_API.G_RET_STS_SUCCESS;
1898     OPEN c_salesrep_totals;
1899     FETCH c_salesrep_totals INTO l_revenue_percent_total,
1900                                  l_non_revenue_percent_total;
1901     CLOSE c_salesrep_totals;
1902     IF (p_sales_credit_type = 'R' AND l_revenue_percent_total = 0) OR
1903        (p_sales_credit_type = 'N' AND l_non_revenue_percent_total = 0) OR
1904        (p_sales_credit_type = 'B' AND l_revenue_percent_total = 0
1905                                     AND l_non_revenue_percent_total = 0)
1906     THEN
1907       FND_MESSAGE.set_name('AR','AR_RA_NO_SELECTED_SALESCRED');
1908       FND_MSG_PUB.Add;
1909       x_return_status := FND_API.G_RET_STS_ERROR ;
1910     END IF;
1911     FND_MSG_PUB.Count_And_Get
1912                            (p_encoded => FND_API.G_FALSE,
1913                             p_count   => x_msg_count,
1914                             p_data    => x_msg_data);
1915   EXCEPTION
1916      WHEN OTHERS THEN
1917        IF PG_DEBUG in ('Y', 'C') THEN
1918           arp_util.debug('Validate_Sales_Credits: ' || 'Unexpected error '||sqlerrm||
1919                   ' at AR_RAAPI_UTIL.Validate_Sales_Credits()+');
1920        END IF;
1921        RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
1922   END Validate_Sales_Credits;
1923 
1924   FUNCTION Total_Selected_Line_Value
1925      (p_customer_trx_line_id  IN NUMBER
1926      ,p_customer_trx_id       IN NUMBER
1927      ,p_item_id               IN NUMBER
1928      ,p_category_id           IN NUMBER
1929      ,p_salesrep_id           IN NUMBER
1930      ,p_salesgroup_id         IN NUMBER DEFAULT NULL -- bug 3067675
1931      ,p_sales_credit_type     IN VARCHAR2)
1932   RETURN NUMBER
1933    IS
1934      l_all_line_total          NUMBER;
1935 
1936      CURSOR c_all_line_total IS
1937      SELECT NVL(SUM(d.amount),0) amount
1938      FROM   ra_cust_trx_line_gl_dist d
1939            ,mtl_item_categories mic
1940            ,ra_customer_trx_lines l
1941      WHERE  d.customer_trx_line_id = l.customer_trx_line_id
1942      AND    l.line_type = 'LINE'
1943      AND    l.customer_trx_id = p_customer_trx_id
1944      AND    d.account_class IN ('REV','UNEARN')
1945      AND    l.customer_trx_line_id = NVL(p_customer_trx_line_id,
1946                                          l.customer_trx_line_id)
1947      AND    NVL(l.inventory_item_id,0) =
1948             NVL(p_item_id,NVL(l.inventory_item_id,0))
1949      AND    mic.organization_id(+) = g_inv_org_id
1950      AND    l.inventory_item_id = mic.inventory_item_id(+)
1951      AND    NVL(p_category_id,0) =
1952                  DECODE(p_category_id,NULL,0,mic.category_id)
1953      AND    mic.category_set_id(+) = g_category_set_id
1954      AND   ((p_salesrep_id IS NULL AND p_salesgroup_id IS NULL AND
1955              p_sales_credit_type IS NULL)
1956        OR  EXISTS
1957             (SELECT 'X'
1958              FROM   ra_cust_trx_line_salesreps ls
1959              WHERE  ls.customer_trx_line_id = l.customer_trx_line_id
1960              AND    ls.salesrep_id = NVL(p_salesrep_id,ls.salesrep_id)
1961              AND    DECODE(p_sales_credit_type,'N',NVL(ls.non_revenue_salesgroup_id, -9999), NVL(ls.revenue_salesgroup_id, -9999)) =
1962                         NVL(p_salesgroup_id, DECODE(p_sales_credit_type,'N',NVL(ls.non_revenue_salesgroup_id, -9999), NVL(ls.revenue_salesgroup_id, -9999)))
1963              GROUP  BY ls.salesrep_id
1964              HAVING SUM(NVL(DECODE(p_sales_credit_type,'N',
1965                ls.non_revenue_percent_split,ls.revenue_percent_split),0)) <> 0));
1966 
1967   BEGIN
1968     IF PG_DEBUG in ('Y', 'C') THEN
1969        arp_util.debug('AR_RAAPI_UTIL.Total_Selected_Line_Value()+');
1970     END IF;
1971     /* 5126974 - move initialization to this function
1972         to avoid org-specific failure in constant_system_values */
1973     IF g_inv_org_id IS NULL
1974     THEN
1975        oe_profile.get('SO_ORGANIZATION_ID',g_inv_org_id);
1976     END IF;
1977     OPEN c_all_line_total;
1978     FETCH c_all_line_total INTO l_all_line_total;
1979     CLOSE c_all_line_total;
1980     RETURN l_all_line_total;
1981   EXCEPTION
1982      WHEN OTHERS THEN
1983        IF PG_DEBUG in ('Y', 'C') THEN
1984           arp_util.debug('Total_Selected_Line_Value: ' || 'Unexpected error '||sqlerrm||
1985                   ' at AR_RAAPI_UTIL.Total_Selected_Line_Value()+');
1986        END IF;
1987        RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
1988   END Total_Selected_Line_Value ;
1989 
1990   /* 7365097 - Centralized some credit memo processing logic
1991      so that it can be neatly included in both adjustable_revenue
1992      and adjustable_revenue_total
1993 
1994      RETURNS FALSE if this is a regular credit memo and accounting
1995       is based on invoice
1996   */
1997   FUNCTION check_credit_memos
1998     (p_customer_trx_id    IN NUMBER,
1999      p_adjustment_type    IN VARCHAR2)
2000   RETURN BOOLEAN
2001   IS
2002      CURSOR c_unrec_cm(p_target_trx NUMBER) IS
2003      SELECT cmt.customer_trx_id
2004      FROM   ra_customer_trx cmt
2005      WHERE  cmt.previous_customer_trx_id = p_target_trx
2006      AND    EXISTS ( SELECT 'Unrecognized CM'
2007                      FROM   ra_customer_trx_lines cmtl
2008                      WHERE  cmtl.customer_trx_id = cmt.customer_trx_id
2009                      AND    cmtl.line_type = 'LINE'
2010                      AND    cmtl.autorule_complete_flag = 'N');
2011 
2012      l_dist_count NUMBER;
2013      l_cm_flag    VARCHAR2(1);
2014   BEGIN
2015      /* 5011151 - If a user attempts to RAM or API an invoice that has
2016         credits which have not (yet) been through Rev Rec, the UNEARN
2017         will total incorrectly for the target transaction and allow
2018         more REV to be earned than it should.  We are going to look
2019         for CMs that have not been through RR and process them before
2020         continuing */
2021 
2022         FOR cm IN c_unrec_cm(p_customer_trx_id) LOOP
2023            l_dist_count := ARP_AUTO_RULE.create_distributions
2024                               ( p_commit => 'N',
2025                                 p_debug  => 'N',
2026                                 p_trx_id => cm.customer_trx_id);
2027 
2028            IF PG_DEBUG in ('Y','C')
2029            THEN
2030                arp_util.debug('trx_id= ' || cm.customer_trx_id || '  dists=' ||
2031                       l_dist_count);
2032            END IF;
2033         END LOOP;
2034 
2035      /* 5555356/5759659 - Another corner case.. if the trx being processed
2036         is a credit, and use_inv_acctg=Y, then return zero for adjustable
2037         amounts */
2038      IF use_inv_acctg = 'Y' AND
2039         p_adjustment_type in ('EA','UN')
2040      THEN
2041         select decode(previous_customer_trx_id, NULL,'N','Y')
2042         into   l_cm_flag
2043         from   ra_customer_trx
2044         where  customer_trx_id = p_customer_trx_id;
2045 
2046         IF l_cm_flag = 'Y'
2047         THEN
2048            /* User is not allowed to adjust credits */
2049            RETURN FALSE; -- trap in callee, and return 0
2050         END IF;
2051      END IF;
2052 
2053      RETURN TRUE;  -- successfull, allow to continue
2054   END check_credit_memos;
2055 
2056   /* Bug 2560048 RAM-C: new out parameter p_acctd_amount_out provided for use
2057      by collectibility - it is assumed that a salesrep_id will never be passed
2058      in to this routine otherwise this amount will be wrong.  To be rectified
2059      when sales credit dependency removed from RAM */
2060   FUNCTION Adjustable_Revenue
2061      (p_customer_trx_line_id  IN NUMBER
2062      ,p_adjustment_type       IN VARCHAR2
2063      ,p_customer_trx_id       IN NUMBER
2064      ,p_salesrep_id           IN NUMBER
2065      ,p_salesgroup_id         IN NUMBER DEFAULT NULL -- bug 3067675
2066      ,p_sales_credit_type     IN VARCHAR2
2067      ,p_item_id               IN NUMBER
2068      ,p_category_id           IN NUMBER
2069      ,p_revenue_adjustment_id IN NUMBER
2070      ,p_line_count_out       OUT NOCOPY NUMBER
2071      ,p_acctd_amount_out     OUT NOCOPY NUMBER)
2072   RETURN NUMBER
2073    IS
2074      l_line_id                  NUMBER;
2075      l_line_amount              NUMBER;
2076      l_line_acctd_amount        NUMBER;
2077      l_cm_line_amount           NUMBER;
2078      l_cm_line_acctd_amount     NUMBER;
2079      l_net_line_amount          NUMBER;
2080      l_net_line_acctd_amount    NUMBER;
2081      l_line_adjustable          NUMBER;
2082      l_line_count               NUMBER;
2083      l_line_salesrep_total      NUMBER;
2084      l_adjustable_revenue       NUMBER;
2085      l_dist_count               NUMBER;
2086      l_cm_flag                  VARCHAR2(1);
2087 
2088      /* Bug 2560048 - credit memo amounts included in adjustable revenue
2089         calculation */
2090      /* Bug 3431815 - removed unnecessary extra join to ra_customer_trx
2091 	to get credit memos */
2092      /* Bug 3536944: c_line broken up into 3 separate queries to improve
2093         performance */
2094 
2095      CURSOR c_line IS
2096      SELECT l.customer_trx_line_id,
2097             lr.deferred_revenue_flag
2098      FROM   mtl_item_categories mic
2099            ,ra_customer_trx_lines l
2100            ,ra_rules lr
2101      WHERE  l.customer_trx_id = p_customer_trx_id
2102      AND    l.line_type = 'LINE'
2103      AND    l.customer_trx_line_id = NVL(p_customer_trx_line_id,l.customer_trx_line_id)
2104      AND    l.autorule_complete_flag IS NULL
2105      AND    NVL(l.inventory_item_id,0) =
2106             NVL(p_item_id,NVL(l.inventory_item_id,0))
2107      AND    DECODE(p_adjustment_type,'LL',
2108               DECODE(p_category_id,NULL,
2109                 DECODE(p_item_id,NULL,
2110                   DECODE(p_customer_trx_line_id,NULL,
2111                     NVL(l.accounting_rule_duration,0),0),0),0),0) <= 1
2112      AND    mic.organization_id(+) = g_inv_org_id
2113      AND    l.inventory_item_id = mic.inventory_item_id(+)
2114      AND    NVL(p_category_id,0) =
2115                  DECODE(p_category_id,NULL,0,mic.category_id)
2116      AND    mic.category_set_id(+) = g_category_set_id
2117      AND    l.accounting_rule_id = lr.rule_id (+)
2118      AND   ((p_salesrep_id IS NULL AND p_salesgroup_id IS NULL)
2119           /*   AND p_sales_credit_type IS NULL) */
2120        OR  EXISTS
2121             (SELECT 'X'
2122              FROM   ra_cust_trx_line_salesreps ls
2123              WHERE  ls.customer_trx_line_id = l.customer_trx_line_id
2124              AND    ls.salesrep_id = NVL(p_salesrep_id,ls.salesrep_id)
2125 	     AND    DECODE(p_sales_credit_type,'N',NVL(ls.non_revenue_salesgroup_id, -9999), NVL(ls.revenue_salesgroup_id, -9999)) =
2126 			NVL(p_salesgroup_id, DECODE(p_sales_credit_type,'N',NVL(ls.non_revenue_salesgroup_id, -9999), NVL(ls.revenue_salesgroup_id, -9999)))
2127              AND    NVL(ls.revenue_adjustment_id,0) <>
2128                     NVL(p_revenue_adjustment_id,
2129                                        NVL(ls.revenue_adjustment_id,0) + 1)
2130              GROUP  BY ls.salesrep_id
2131              HAVING SUM(NVL(DECODE(p_sales_credit_type,'N',
2132                ls.non_revenue_percent_split,ls.revenue_percent_split),0)) <> 0));
2133 
2134 /*  Bug 7130380 : Added hint to improve performance */
2135      CURSOR c_line_amount (p_cust_trx_line_id NUMBER) IS
2136      SELECT /*+ index(d ra_cust_trx_line_gl_dist_n1) push_pred(s)*/
2137             NVL(SUM(d.amount),0) amount
2138            ,NVL(SUM(d.acctd_amount),0) acctd_amount
2139      FROM   ra_cust_trx_line_gl_dist d,
2140             ra_cust_trx_line_salesreps s
2141      WHERE  d.customer_trx_line_id = p_cust_trx_line_id
2142      AND    d.customer_trx_id = p_customer_trx_id
2143      AND    d.account_class = DECODE(p_adjustment_type,'EA','UNEARN','REV')
2144      AND    NVL(d.revenue_adjustment_id,0) <> NVL(p_revenue_adjustment_id,
2145                                        NVL(d.revenue_adjustment_id,0) + 1)
2146      AND    d.customer_trx_line_id = s.customer_trx_line_id (+)
2147      AND    d.cust_trx_line_salesrep_id = s.cust_trx_line_salesrep_id (+)
2148      AND    NVL(s.salesrep_id,-9999) =
2149                NVL(p_salesrep_id,
2150                NVL(s.salesrep_id,-9999))
2151      AND    NVL(s.revenue_salesgroup_id, -9999) =
2152                 NVL(p_salesgroup_id /*group*/,
2153                 NVL(s.revenue_salesgroup_id, -9999));
2154 
2155 /*  Bug 7130380 : Added hint to improve performanc */
2156      CURSOR c_cm_line_amount (p_cust_trx_line_id NUMBER) IS
2157      SELECT /*+ index(d ra_cust_trx_line_gl_dist_n1) push_pred(s)*/
2158             NVL(SUM(NVL(d.amount,0)),0) amount
2159            ,NVL(SUM(NVL(d.acctd_amount,0)),0) acctd_amount
2160      FROM   ra_cust_trx_line_gl_dist d
2161            ,ra_customer_trx_lines l
2162            ,ra_cust_trx_line_salesreps s
2163      WHERE  l.previous_customer_trx_line_id = p_cust_trx_line_id
2164      AND    d.customer_trx_id = l.customer_trx_id
2165      AND    d.customer_trx_line_id = l.customer_trx_line_id
2166      AND    d.account_class = DECODE(p_adjustment_type,'EA','UNEARN','REV')
2167      AND    NVL(d.revenue_adjustment_id,0) <> NVL(p_revenue_adjustment_id,
2168                                        NVL(d.revenue_adjustment_id,0) + 1)
2169      AND    d.customer_trx_line_id = s.customer_trx_line_id (+)
2170      AND    d.cust_trx_line_salesrep_id = s.cust_trx_line_salesrep_id (+)
2171      AND    NVL(s.salesrep_id,-9999) =
2172                 NVL(p_salesrep_id /* sr_id */,
2173                 NVL(s.salesrep_id,-9999))
2174      AND    NVL(s.revenue_salesgroup_id, -9999) =
2175                 NVL(p_salesgroup_id /*group*/,
2176                 NVL(s.revenue_salesgroup_id, -9999));
2177 
2178      CURSOR c_line_nr_amount (p_cust_trx_line_id NUMBER) IS
2179      SELECT SUM(NVL(s.non_revenue_amount_split,0)) amount
2180      FROM   ra_cust_trx_line_salesreps s
2181      WHERE  s.customer_trx_line_id = p_cust_trx_line_id
2182      AND    s.salesrep_id = NVL(p_salesrep_id,s.salesrep_id)
2183      AND    NVL(s.non_revenue_salesgroup_id, -9999) =
2184                 NVL(p_salesgroup_id,
2185                 NVL(s.non_revenue_salesgroup_id, -9999))
2186      AND    NVL(s.revenue_adjustment_id,0) <> NVL(p_revenue_adjustment_id,
2187                                        NVL(s.revenue_adjustment_id,0) + 1);
2188 
2189      CURSOR c_cm_line_nr_amount (p_cust_trx_line_id NUMBER) IS
2190      SELECT NVL(SUM(NVL(s.non_revenue_amount_split,0)),0) amount
2191      FROM   ra_customer_trx_lines l
2192            ,ra_cust_trx_line_salesreps s
2193      WHERE  l.previous_customer_trx_line_id = p_cust_trx_line_id
2194      AND    l.customer_trx_line_id = s.customer_trx_line_id
2195      AND    s.salesrep_id = NVL(p_salesrep_id /* sr_id */,s.salesrep_id)
2196      AND    NVL(s.non_revenue_salesgroup_id, -9999) =
2197                 NVL(p_salesgroup_id /*group*/,
2198                 NVL(s.non_revenue_salesgroup_id, -9999));
2199 
2200      /* 7365097 - if autoaccounting not based on SR, then
2201         we'll need to get salescredit revenue from salescredits
2202         table instead of gl_dist */
2203      CURSOR c_line_rnsr_amount (p_cust_trx_line_id NUMBER) IS
2204      SELECT SUM(NVL(s.revenue_amount_split,0)) amount
2205      FROM   ra_cust_trx_line_salesreps s
2206      WHERE  s.customer_trx_line_id = p_cust_trx_line_id
2207      AND    s.salesrep_id = NVL(p_salesrep_id,s.salesrep_id)
2208      AND    NVL(s.revenue_salesgroup_id, -9999) =
2209                 NVL(p_salesgroup_id,
2210                 NVL(s.revenue_salesgroup_id, -9999))
2211      AND    NVL(s.revenue_adjustment_id,0) <> NVL(p_revenue_adjustment_id,
2212                                        NVL(s.revenue_adjustment_id,0) + 1);
2213 
2214      CURSOR c_cm_line_rnsr_amount (p_cust_trx_line_id NUMBER) IS
2215      SELECT NVL(SUM(NVL(s.revenue_amount_split,0)),0) amount
2216      FROM   ra_customer_trx_lines l
2217            ,ra_cust_trx_line_salesreps s
2218      WHERE  l.previous_customer_trx_line_id = p_cust_trx_line_id
2219      AND    l.customer_trx_line_id = s.customer_trx_line_id
2220      AND    s.salesrep_id = NVL(p_salesrep_id /* sr_id */,s.salesrep_id)
2221      AND    NVL(s.revenue_salesgroup_id, -9999) =
2222                 NVL(p_salesgroup_id /*group*/,
2223                 NVL(s.revenue_salesgroup_id, -9999));
2224 
2225   BEGIN
2226      IF PG_DEBUG in ('Y', 'C') THEN
2227         arp_util.debug('AR_RAAPI_UTIL.Adjustable_Revenue()+');
2228         arp_util.debug('  p_customer_trx_line_id = ' || p_customer_trx_line_id);
2229         arp_util.debug('  p_adjustment_type = ' || p_adjustment_type);
2230         arp_util.debug('  p_customer_trx_id = ' || p_customer_trx_id);
2231         arp_util.debug('  p_salesrep_id = ' || p_salesrep_id);
2232         arp_util.debug('  p_salesgroup_id = ' || p_salesgroup_id);
2233         arp_util.debug('  p_sales_credit_type = ' || p_sales_credit_type);
2234         arp_util.debug('  p_item_id = ' || p_item_id);
2235         arp_util.debug('  p_category_id = ' || p_category_id);
2236         arp_util.debug('  p_revenue_adjustment_id = ' ||
2237                           p_revenue_adjustment_id);
2238      END IF;
2239 
2240      /* 5126974 - move initialization to this function
2241          to avoid org-specific failure in constant_system_values */
2242      IF g_inv_org_id IS NULL
2243      THEN
2244         oe_profile.get('SO_ORGANIZATION_ID',g_inv_org_id);
2245      END IF;
2246 
2247      /* 7365097 - centralized CM test */
2248      IF NOT check_credit_memos(p_customer_trx_id, p_adjustment_type)
2249      THEN
2250         RETURN 0;
2251      END IF;
2252 
2253      l_adjustable_revenue := 0;
2254      l_line_count := 0;
2255      FOR c1 IN c_line LOOP
2256        l_line_id := c1.customer_trx_line_id;
2257 
2258        /* 6223281 - Modified method for salescredit type specific
2259           queries */
2260        IF NVL(p_sales_credit_type,'X') = 'N'
2261        THEN
2262           /* These cursors select only non-revenue salescredits
2263             (which have no corresponding dist rows) for
2264              non-revenue SC transfers */
2265           OPEN  c_line_nr_amount(l_line_id);
2266           FETCH c_line_nr_amount INTO l_line_amount;
2267           CLOSE c_line_nr_amount;
2268 
2269           OPEN  c_cm_line_nr_amount(l_line_id);
2270           FETCH c_cm_line_nr_amount INTO l_cm_line_amount;
2271           CLOSE c_cm_line_nr_amount;
2272 
2273           l_line_acctd_amount := 0;
2274           l_cm_line_acctd_amount := 0;
2275        ELSE
2276           IF NOT arp_auto_accounting.query_autoacc_def('REV','RA_SALESREPS')
2277           THEN
2278              IF p_adjustment_type = 'SA'
2279              THEN
2280                 /* can't use gl_dist data since it won't have
2281                    salescredit_ids populated, have to use
2282                    salescredits directly (almost like non-rev SRs) */
2283                 OPEN  c_line_rnsr_amount(l_line_id);
2284                 FETCH c_line_rnsr_amount INTO l_line_amount;
2285                 CLOSE c_line_rnsr_amount;
2286 
2287                 OPEN  c_cm_line_rnsr_amount(l_line_id);
2288                 FETCH c_cm_line_rnsr_amount INTO l_cm_line_amount;
2289                 CLOSE c_cm_line_rnsr_amount;
2290              ELSE
2291                 /* Use raw gl_dist amounts */
2292                 l_line_amount := adjustable_revenue_total(l_line_id,
2293                                          p_customer_trx_id,
2294                                          p_adjustment_type,
2295                                          p_revenue_adjustment_id);
2296                 l_cm_line_amount := 0; -- total above includes CMs already
2297              END IF;
2298           ELSE
2299              /* These cursors use the dists table to insure that
2300                 we only adjust what truly exists in gl_dist */
2301 
2302              -- Get amount from corresponding invoice lines
2303              OPEN c_line_amount(l_line_id);
2304              FETCH c_line_amount INTO l_line_amount, l_line_acctd_amount;
2305              CLOSE c_line_amount;
2306 
2307              -- ..then for any associated credit memo lines..
2308              OPEN c_cm_line_amount(l_line_id);
2309              FETCH c_cm_line_amount INTO l_cm_line_amount,
2310                                          l_cm_line_acctd_amount;
2311              CLOSE c_cm_line_amount;
2312           END IF;
2313        END IF;
2314 
2315        --  The two are added to give net line amount
2316        l_net_line_amount := l_line_amount + l_cm_line_amount;
2317        l_net_line_acctd_amount := l_line_acctd_amount + l_cm_line_acctd_amount;
2318 
2319        IF l_net_line_amount <> 0
2320        THEN
2321          l_line_adjustable := l_net_line_amount;
2322        ELSE
2323          l_line_adjustable := 0;
2324          p_acctd_amount_out := 0;
2325        END IF;
2326 
2327        IF l_line_adjustable <> 0
2328        THEN
2329          p_acctd_amount_out := l_net_line_acctd_amount;
2330          l_line_count := l_line_count + 1;
2331          l_adjustable_revenue := l_adjustable_revenue + l_line_adjustable;
2332        END IF;
2333        p_line_count_out := l_line_count;
2334 
2335      END LOOP;
2336 
2337      IF PG_DEBUG in ('Y', 'C') THEN
2338         arp_util.debug('  l_adjustable_revenue = ' || l_adjustable_revenue);
2339         arp_util.debug('AR_RAAPI_UTIL.Adjustable_Revenue()-');
2340      END IF;
2341 
2342      RETURN l_adjustable_revenue;
2343 
2344   EXCEPTION
2345      WHEN OTHERS THEN
2346        IF PG_DEBUG in ('Y', 'C') THEN
2347           arp_util.debug('Adjustable_Revenue: ' || 'Unexpected error '||sqlerrm||
2348                          ' at AR_RAAPI_UTIL.Adjustable_Revenue()+');
2349        END IF;
2350        RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
2351 
2352   END Adjustable_Revenue;
2353 
2354   /* 7365097 - New function for calculating adjustable_revenue
2355      for top of revenue adjustment form */
2356   FUNCTION Adjustable_Revenue_Total
2357      (p_customer_trx_line_id  IN NUMBER
2358      ,p_customer_trx_id       IN NUMBER
2359      ,p_adjustment_type       IN VARCHAR2
2360      ,p_revenue_adjustment_id IN NUMBER DEFAULT NULL)
2361   RETURN NUMBER
2362    IS
2363 
2364      CURSOR c_line_amount (p_trx_id NUMBER, p_line_id NUMBER,
2365                            p_adj_type VARCHAR2, p_rev_adj_id NUMBER) IS
2366      SELECT SUM(NVL(d.amount,0)) amount
2367      FROM   ra_cust_trx_line_gl_dist_all d
2368      WHERE  d.customer_trx_line_id = NVL(p_line_id,
2369                                          d.customer_trx_line_id)
2370      AND    d.customer_trx_id = p_trx_id
2371      AND    d.account_class = DECODE(p_adj_type,'EA','UNEARN','REV')
2372      AND    d.account_set_flag = 'N'
2373      AND    NVL(d.revenue_adjustment_id,0) <>
2374                NVL(p_rev_adj_id, NVL(d.revenue_adjustment_id,0) + 1);
2375 
2376      CURSOR c_cm_line_amount (p_trx_id NUMBER, p_line_id NUMBER,
2377                            p_adj_type VARCHAR2, p_rev_adj_id NUMBER) IS
2378      SELECT NVL(SUM(NVL(d.amount,0)),0) amount
2379      FROM   ra_cust_trx_line_gl_dist_all d,
2380             ra_customer_trx_lines_all l
2381      WHERE  l.previous_customer_trx_line_id =
2382                    NVL(p_line_id,
2383                        l.previous_customer_trx_line_id)
2384      AND    l.previous_customer_trx_id = p_trx_id
2385      AND    d.customer_trx_id = l.customer_trx_id
2386      AND    d.customer_trx_line_id = l.customer_trx_line_id
2387      AND    d.account_class = DECODE(p_adj_type,'EA','UNEARN','REV')
2388      AND    d.account_set_flag = 'N'
2389      AND    NVL(d.revenue_adjustment_id,0) <>
2390                NVL(p_rev_adj_id, NVL(d.revenue_adjustment_id,0) + 1);
2391 
2392      l_inv_amt NUMBER;
2393      l_cm_amt  NUMBER;
2394      l_total_amt NUMBER;
2395 
2396   BEGIN
2397      IF PG_DEBUG in ('Y', 'C') THEN
2398         arp_util.debug('AR_RAAPI_UTIL.revenue_amount_total()+');
2399         arp_util.debug(' p_customer_trx_id = ' || p_customer_trx_id);
2400         arp_util.debug(' p_customer_trx_line_id = ' || p_customer_trx_line_id);
2401         arp_util.debug(' p_adjustment_type      = ' || p_adjustment_type);
2402         arp_util.debug(' p_revenue_adjustment_id= ' || p_revenue_adjustment_id);
2403      END IF;
2404 
2405      /* DO not allow adjustments against certain regular credit memos */
2406      IF NOT check_credit_memos(p_customer_trx_id, p_adjustment_type)
2407      THEN
2408         RETURN 0;
2409      END IF;
2410 
2411      OPEN c_line_amount(p_customer_trx_id,p_customer_trx_line_id,
2412                         p_adjustment_type,p_revenue_adjustment_id);
2413      FETCH c_line_amount INTO l_inv_amt;
2414      CLOSE c_line_amount;
2415 
2416      OPEN  c_cm_line_amount(p_customer_trx_id,p_customer_trx_line_id,
2417                             p_adjustment_type,p_revenue_adjustment_id);
2418      FETCH c_cm_line_amount INTO l_cm_amt;
2419      CLOSE c_cm_line_amount;
2420 
2421      l_total_amt := l_inv_amt + l_cm_amt;
2422 
2423      IF PG_DEBUG in ('Y', 'C') THEN
2424 
2425         arp_util.debug(' l_inv_amt   = ' || l_inv_amt);
2426         arp_util.debug(' l_cm_amt    = ' || l_cm_amt);
2427         arp_util.debug(' l_total_amt = ' || l_total_amt);
2428         arp_util.debug('AR_RAAPI_UTIL.revenue_amount_total()-');
2429      END IF;
2430 
2431      RETURN l_total_amt;
2432 
2433   END Adjustable_Revenue_Total;
2434 
2435   PROCEDURE Validate_Amount
2436      (p_init_msg_list         IN VARCHAR2
2437      ,p_customer_trx_line_id  IN NUMBER
2438      ,p_adjustment_type       IN VARCHAR2
2439      ,p_amount_mode           IN VARCHAR2
2440      ,p_customer_trx_id       IN NUMBER
2441      ,p_salesrep_id           IN NUMBER
2442      ,p_salesgroup_id         IN NUMBER DEFAULT NULL -- bug 3067675
2443      ,p_sales_credit_type     IN VARCHAR2
2444      ,p_item_id               IN NUMBER
2445      ,p_category_id           IN NUMBER
2446      ,p_revenue_amount_in     IN NUMBER
2447      ,p_revenue_percent       IN NUMBER
2448      ,p_revenue_adjustment_id IN NUMBER
2449      ,p_revenue_amount_out    OUT NOCOPY NUMBER
2450      ,p_adjustable_amount_out OUT NOCOPY NUMBER
2451      ,p_line_count_out        OUT NOCOPY NUMBER
2452      ,x_return_status         OUT NOCOPY VARCHAR2
2453      ,x_msg_count             OUT NOCOPY NUMBER
2454      ,x_msg_data              OUT NOCOPY VARCHAR2)
2455    IS
2456      l_adjustable_revenue     NUMBER;
2457      l_revenue_total          NUMBER;
2458      l_max_percent            NUMBER;
2459      l_acctd_amount_out       NUMBER;
2460      l_sales_credit_type      VARCHAR2(15);      -- bug 5644810
2461 
2462      invalid_amount           EXCEPTION;
2463      invalid_zero             EXCEPTION;
2464      adjusted_by_other_user   EXCEPTION;
2465 
2466      CURSOR c_revenue_total IS
2467      SELECT NVL(SUM(d.amount),0) amount
2468      FROM   ra_cust_trx_line_gl_dist d
2469            ,mtl_item_categories mic
2470            ,ra_customer_trx_lines l
2471      WHERE  d.customer_trx_line_id = l.customer_trx_line_id
2472      AND    d.account_class IN ('REV','UNEARN')
2473      AND    NVL(d.revenue_adjustment_id,0) <> NVL(p_revenue_adjustment_id,
2474                                        NVL(d.revenue_adjustment_id,0) + 1)
2475      AND    l.line_type = 'LINE'
2476      AND    l.customer_trx_id = p_customer_trx_id
2477      AND    l.customer_trx_line_id = NVL(p_customer_trx_line_id,
2478                                          l.customer_trx_line_id)
2479      AND    NVL(l.inventory_item_id,0) =
2480             NVL(p_item_id,NVL(l.inventory_item_id,0))
2481      AND    mic.organization_id(+) = g_inv_org_id
2482      AND    l.inventory_item_id = mic.inventory_item_id(+)
2483      AND    NVL(p_category_id,0) =
2484                  DECODE(p_category_id,NULL,0,mic.category_id)
2485      AND    mic.category_set_id(+) = g_category_set_id
2486      AND    DECODE(p_category_id,NULL,
2487               DECODE(p_item_id,NULL,
2488                 DECODE(p_customer_trx_line_id,NULL,
2489                   DECODE(p_adjustment_type,'LL',
2490                     NVL(l.accounting_rule_duration,0),0),0),0),0) <= 1
2491      AND    ((p_salesrep_id IS NULL AND p_salesgroup_id IS NULL AND
2492               p_sales_credit_type IS NULL)
2493      OR     EXISTS
2494             (SELECT 'X'
2495              FROM   ra_cust_trx_line_salesreps ls
2496              WHERE  ls.customer_trx_line_id = l.customer_trx_line_id
2497              AND    ls.salesrep_id = NVL(p_salesrep_id,ls.salesrep_id)
2498              AND    DECODE(p_sales_credit_type,'N',
2499                       NVL(ls.non_revenue_salesgroup_id, -9999),
2500                         NVL(ls.revenue_salesgroup_id, -9999)) =
2501                         NVL(p_salesgroup_id, DECODE(p_sales_credit_type,'N',
2502                              NVL(ls.non_revenue_salesgroup_id, -9999),
2503                                NVL(ls.revenue_salesgroup_id, -9999)))
2504              GROUP  BY ls.salesrep_id
2505              HAVING SUM(NVL(DECODE(p_sales_credit_type,'N',
2506                ls.non_revenue_percent_split,ls.revenue_percent_split),0)) <> 0));
2507 
2508 
2509   BEGIN
2510      IF PG_DEBUG in ('Y', 'C') THEN
2511         arp_util.debug('AR_RAAPI_UTIL.Validate_Amount()+');
2512         arp_util.debug(' p_customer_trx_line_id = ' || p_customer_trx_line_id);
2513         arp_util.debug(' p_amount_mode          = ' || p_amount_mode);
2514         arp_util.debug(' p_salesrep_id          = ' || p_salesrep_id);
2515         arp_util.debug(' p_salesgroup_id        = ' || p_salesgroup_id);
2516         arp_util.debug(' p_sales_credit_type    = ' || p_sales_credit_type);
2517         arp_util.debug(' p_revenue_amount_in    = ' || p_revenue_amount_in);
2518         arp_util.debug(' p_revenue_percent      = ' || p_revenue_percent);
2519      END IF;
2520 
2521      /* 5126974 - move initialization to this function
2522          to avoid org-specific failure in constant_system_values */
2523      IF g_inv_org_id IS NULL
2524      THEN
2525         oe_profile.get('SO_ORGANIZATION_ID',g_inv_org_id);
2526      END IF;
2527 
2528      -- Initialize message list if p_init_msg_list is set to TRUE.
2529      IF FND_API.to_Boolean( p_init_msg_list )
2530      THEN
2531        FND_MSG_PUB.initialize;
2532      END IF;
2533      x_return_status := FND_API.G_RET_STS_SUCCESS;
2534      IF NVL(g_last_customer_trx_id,p_customer_trx_id - 1) <> p_customer_trx_id
2535      THEN
2536        constant_trx_values(p_customer_trx_id);
2537      END IF;
2538      /* Added IF condition for bug 5644810 */
2539      IF ((p_salesrep_id IS NULL) and (p_salesgroup_id IS NULL )) THEN
2540         l_sales_credit_type := NULL;
2541      ELSE
2542         l_sales_credit_type := p_sales_credit_type;
2543      END IF;
2544 
2545      l_adjustable_revenue := Adjustable_Revenue
2546      (p_customer_trx_line_id  => p_customer_trx_line_id
2547      ,p_adjustment_type       => p_adjustment_type
2548      ,p_customer_trx_id       => p_customer_trx_id
2549      ,p_salesrep_id           => p_salesrep_id
2550      ,p_salesgroup_id         => p_salesgroup_id -- bug 3067675
2551      ,p_sales_credit_type     => l_sales_credit_type  -- bug 5644810
2552      ,p_item_id               => p_item_id
2553      ,p_category_id           => p_category_id
2554      ,p_revenue_adjustment_id => p_revenue_adjustment_id
2555      ,p_line_count_out        => p_line_count_out
2556      ,p_acctd_amount_out      => l_acctd_amount_out);
2557 
2558      p_adjustable_amount_out := l_adjustable_revenue;
2559      IF p_amount_mode = 'A'
2560      THEN
2561        p_revenue_amount_out := NVL(p_revenue_amount_in,0);
2562      ELSIF p_amount_mode = 'P'
2563      THEN
2564        OPEN c_revenue_total;
2565        FETCH c_revenue_total INTO l_revenue_total;
2566        close c_revenue_total;
2567        p_revenue_amount_out := ROUND(l_revenue_total * p_revenue_percent / 100,
2568                                  g_trx_precision);
2569      ELSE
2570        p_revenue_amount_out := l_adjustable_revenue;
2571      END IF;
2572 
2573      IF PG_DEBUG = 'Y'
2574      THEN
2575         arp_util.debug(' --- after internal validation/calcs ---');
2576         arp_util.debug(' l_adjustable_revenue   = ' || l_adjustable_revenue);
2577         arp_util.debug(' l_revenue_total        = ' || l_revenue_total);
2578         arp_util.debug(' p_revenue_amount_out   = ' || p_revenue_amount_out);
2579      END IF;
2580 
2581      /* 7454302 - Allow adjustments of zero amounts
2582      IF p_revenue_amount_out = 0
2583      THEN
2584        IF p_revenue_adjustment_id IS NULL
2585        THEN
2586          RAISE invalid_zero;
2587        ELSE
2588          RAISE adjusted_by_other_user;
2589        END IF;
2590      END IF;
2591      */
2592      IF p_revenue_amount_out > 0
2593      THEN
2594        IF p_revenue_amount_out > l_adjustable_revenue
2595        THEN
2596          IF p_revenue_adjustment_id IS NULL
2597          THEN
2598            RAISE invalid_amount;
2599          ELSE
2600            RAISE adjusted_by_other_user;
2601          END IF;
2602        END IF;
2603      ELSIF p_revenue_amount_out < 0
2604      THEN
2605        IF p_revenue_amount_out < l_adjustable_revenue
2606        THEN
2607          IF p_revenue_adjustment_id IS NULL
2608          THEN
2609            RAISE invalid_amount;
2610          ELSE
2611            RAISE adjusted_by_other_user;
2612          END IF;
2613        END IF;
2614      END IF;
2615 
2616   EXCEPTION
2617 
2618     WHEN invalid_amount THEN
2619       IF p_amount_mode = 'P'
2620       THEN
2621         l_max_percent := ROUND(l_adjustable_revenue / l_revenue_total * 100,4);
2622         FND_MESSAGE.set_name
2623           (application => 'AR', name => 'AR_RA_PCT_EXCEEDS_AVAIL_PCT');
2624         FND_MESSAGE.set_token('TOT_AVAIL_PCT',l_max_percent);
2625       ELSE
2626         FND_MESSAGE.set_name
2627           (application => 'AR', name => 'AR_RA_AMT_EXCEEDS_AVAIL_REV');
2628         FND_MESSAGE.set_token('TOT_AVAIL_REV',
2629                                g_trx_currency||' '||
2630                                TO_CHAR(l_adjustable_revenue,g_trx_curr_format));
2631       END IF;
2632       FND_MSG_PUB.Add;
2633       x_return_status := FND_API.G_RET_STS_ERROR ;
2634       FND_MSG_PUB.Count_And_Get
2635                            (p_encoded => FND_API.G_FALSE,
2636                             p_count   => x_msg_count,
2637                             p_data    => x_msg_data);
2638     WHEN invalid_zero THEN
2639       FND_MESSAGE.set_name
2640           (application => 'AR', name => 'AR_RA_ZERO_AMOUNT');
2641       FND_MSG_PUB.Add;
2642       x_return_status := FND_API.G_RET_STS_ERROR ;
2643       FND_MSG_PUB.Count_And_Get
2644                            (p_encoded => FND_API.G_FALSE,
2645                             p_count   => x_msg_count,
2646                             p_data    => x_msg_data);
2647     WHEN adjusted_by_other_user THEN
2648       FND_MESSAGE.set_name
2649           (application => 'AR', name => 'AR_RA_ADJUSTED_BY_OTHER_USER');
2650       FND_MSG_PUB.Add;
2651       x_return_status := FND_API.G_RET_STS_ERROR ;
2652       FND_MSG_PUB.Count_And_Get
2653                            (p_encoded => FND_API.G_FALSE,
2654                             p_count   => x_msg_count,
2655                             p_data    => x_msg_data);
2656     WHEN OTHERS THEN
2657        IF PG_DEBUG in ('Y', 'C') THEN
2658           arp_util.debug('Validate_Amount: ' || 'Unexpected error '||sqlerrm||
2659                       ' at AR_RAAPI_UTIL.Validate_Amount()+');
2660        END IF;
2661        RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
2662 
2663   END Validate_Amount;
2664 
2665   FUNCTION Revalidate_GL_Dates
2666        (p_customer_trx_id       IN NUMBER
2667        ,p_revenue_adjustment_id IN NUMBER
2668        ,x_msg_count             OUT NOCOPY NUMBER
2669        ,x_msg_data              OUT NOCOPY VARCHAR2)
2670   RETURN VARCHAR2 IS
2671 
2672     l_change_count            NUMBER;
2673     l_gl_date                 DATE;
2674     l_default_rule            VARCHAR2(80);
2675     l_err_mesg                VARCHAR2(2000);
2676 
2677     CURSOR c_gl_date IS
2678       SELECT DISTINCT gl_date
2679       FROM   ra_cust_trx_line_gl_dist
2680       WHERE  revenue_adjustment_id = p_revenue_adjustment_id;
2681 
2682   BEGIN
2683     IF PG_DEBUG in ('Y', 'C') THEN
2684        arp_util.debug('AR_RAAPI_UTIL.Revalidate_GL_Dates()+');
2685     END IF;
2686     l_change_count := 0;
2687     FOR c1 IN c_gl_date LOOP
2688       IF ARP_STANDARD.validate_and_default_gl_date
2689              (gl_date => c1.gl_date,
2690               trx_date => g_trx_date,
2691               validation_date1 => NULL,
2692               validation_date2 => NULL,
2693               validation_date3 => NULL,
2694               default_date1 => c1.gl_date,
2695               default_date2 => NULL,
2696               default_date3 => NULL,
2697               p_allow_not_open_flag   => 'Y',
2698               p_invoicing_rule_id => g_invoicing_rule_id,
2699               p_set_of_books_id => arp_global.sysparam.set_of_books_id,
2700               p_application_id => AR_RAAPI_UTIL.application_id,
2701               default_gl_date => l_gl_date,
2702               defaulting_rule_used  => l_default_rule,
2703               error_message  => l_err_mesg)
2704       THEN
2705         IF c1.gl_date <> l_gl_date
2706         THEN
2707           UPDATE ra_cust_trx_line_gl_dist
2708           SET   gl_date = l_gl_date
2709           WHERE revenue_adjustment_id = p_revenue_adjustment_id
2710           AND   gl_date = c1.gl_date;
2711           FND_MESSAGE.set_name('AR','AR_RA_GL_DATE_CHANGED');
2712 	  --Int'l Calendar Project
2713           FND_MESSAGE.set_token('GL_DATE',fnd_date.date_to_chardate(c1.gl_date, calendar_aware=> FND_DATE.calendar_aware_alt));
2714           FND_MESSAGE.set_token('NEW_GL_DATE',fnd_date.date_to_chardate(l_gl_date, calendar_aware=> FND_DATE.calendar_aware_alt));
2715           FND_MSG_PUB.Add;
2716           l_change_count := l_change_count + 1;
2717         END IF;
2718       ELSE
2719         FND_MESSAGE.set_name('AR','AR_RA_NO_OPEN_PERIODS');
2720         RETURN FND_API.G_FALSE;
2721       END IF;
2722     END LOOP;
2723     IF l_change_count > 0
2724     THEN
2725       FND_MSG_PUB.Count_And_Get
2726                            (p_encoded => FND_API.G_FALSE,
2727                             p_count   => x_msg_count,
2728                             p_data    => x_msg_data);
2729       RETURN FND_API.G_FALSE;
2730     ELSE
2731       RETURN FND_API.G_TRUE;
2732     END IF;
2733   EXCEPTION
2734     WHEN OTHERS THEN
2735        IF PG_DEBUG in ('Y', 'C') THEN
2736           arp_util.debug('Revalidate_GL_Dates: ' || 'Unexpected error '||sqlerrm||
2737                       ' at AR_RAAPI_UTIL.Revalidate_GL_Dates()+');
2738        END IF;
2739        RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
2740   END Revalidate_GL_Dates;
2741 
2742   FUNCTION Deferred_GL_Date (p_start_date    IN  DATE,
2743                              p_period_seq_no IN NUMBER)
2744   RETURN DATE
2745   IS
2746     l_init_start_date          DATE;
2747     l_init_new_period_num      NUMBER;
2748     l_current_new_period_num   NUMBER;
2749     l_current_start_date       DATE;
2750     l_current_end_date         DATE;
2751     l_current_gl_date          DATE;
2752 
2753 /* Bug 1940911: added period_type to 'where' clause to ensure the correct
2754                 period type is being selected when more than 1 type exists
2755                 in a calendar. */
2756 
2757     CURSOR c_start_period IS
2758       SELECT p.start_date, p.new_period_num
2759       FROM   ar_periods p,
2760              gl_sets_of_books sob,
2761              ar_period_types tp
2762       WHERE  sob.period_set_name = p.period_set_name
2763       AND    sob.set_of_books_id = arp_global.sysparam.set_of_books_id
2764       AND    sob.accounted_period_type = p.period_type
2765       AND    sob.accounted_period_type = tp.period_type
2766       AND    p_start_date BETWEEN p.start_date AND p.end_date;
2767 
2768     CURSOR c_current_period (p_new_period_num NUMBER) IS
2769       SELECT p.start_date, p.end_date
2770       FROM   ar_periods p,
2771              gl_sets_of_books sob,
2772              ar_period_types tp
2773       WHERE  sob.period_set_name = p.period_set_name
2774       AND    sob.set_of_books_id = arp_global.sysparam.set_of_books_id
2775       AND    sob.accounted_period_type = p.period_type
2776       AND    sob.accounted_period_type = tp.period_type
2777       AND    p.new_period_num = p_new_period_num;
2778 
2779   BEGIN
2780     IF PG_DEBUG in ('Y', 'C') THEN
2781        arp_util.debug('AR_RAAPI_UTIL.Deferred_GL_Date()+');
2782     END IF;
2783     IF p_period_seq_no = 1
2784     THEN
2785       IF PG_DEBUG in ('Y', 'C') THEN
2786          arp_util.debug('AR_RAAPI_UTIL.Deferred_GL_Date()-');
2787       END IF;
2788       RETURN p_start_date;
2789     ELSE
2790       -- Find the period relating to the start date of revenue recognition
2791       OPEN c_start_period;
2792       FETCH c_start_period INTO l_init_start_date, l_init_new_period_num;
2793       CLOSE c_start_period;
2794       -- Find the period number of the current period
2795       l_current_new_period_num := (l_init_new_period_num + p_period_seq_no -1);
2796       OPEN c_current_period(l_current_new_period_num);
2797       FETCH c_current_period INTO l_current_start_date, l_current_end_date;
2798       CLOSE c_current_period;
2799       -- Calculate the current gl_date
2800       l_current_gl_date := LEAST((p_start_date - l_init_start_date
2801                                               + l_current_start_date),
2802 	                         l_current_end_date);
2803       IF PG_DEBUG in ('Y', 'C') THEN
2804          arp_util.debug('AR_RAAPI_UTIL.Deferred_GL_Date()-');
2805       END IF;
2806       RETURN l_current_gl_date;
2807     END IF;
2808   EXCEPTION
2809     WHEN OTHERS THEN
2810        IF PG_DEBUG in ('Y', 'C') THEN
2811           arp_util.debug('Deferred_GL_Date: ' || 'Unexpected error '||sqlerrm||
2812                       ' at AR_RAAPI_UTIL.Deferred_GL_Date()+');
2813        END IF;
2814        RAISE FND_API.G_EXC_UNEXPECTED_ERROR;
2815   END Deferred_GL_Date;
2816 
2817   --
2818   -- Read only functions to allow client access to globals
2819   --
2820   FUNCTION G_RET_STS_SUCCESS
2821   RETURN VARCHAR2 IS
2822   BEGIN
2823     RETURN FND_API.G_RET_STS_SUCCESS;
2824   END G_RET_STS_SUCCESS;
2825 
2826   FUNCTION G_RET_STS_ERROR
2827   RETURN VARCHAR2 IS
2828   BEGIN
2829     RETURN FND_API.G_RET_STS_ERROR;
2830   END G_RET_STS_ERROR;
2831 
2832   FUNCTION G_TRUE
2833   RETURN VARCHAR2 IS
2834   BEGIN
2835     RETURN FND_API.G_TRUE;
2836   END G_TRUE;
2837 
2838   FUNCTION G_VALID_LEVEL_NONE
2839   RETURN VARCHAR2 IS
2840   BEGIN
2841     RETURN FND_API.G_VALID_LEVEL_NONE;
2842   END G_VALID_LEVEL_NONE;
2843 
2844   FUNCTION G_VALID_LEVEL_FULL
2845   RETURN VARCHAR2 IS
2846   BEGIN
2847     RETURN FND_API.G_VALID_LEVEL_FULL;
2848   END G_VALID_LEVEL_FULL;
2849 
2850   FUNCTION G_FALSE
2851   RETURN VARCHAR2 IS
2852   BEGIN
2853     RETURN FND_API.G_FALSE;
2854   END G_FALSE;
2855 
2856   FUNCTION chart_of_accounts_id
2857   RETURN NUMBER IS
2858   BEGIN
2859     RETURN g_chart_of_accounts_id;
2860   END chart_of_accounts_id;
2861 
2862   FUNCTION set_of_books_id
2863   RETURN NUMBER IS
2864   BEGIN
2865     RETURN g_set_of_books_id;
2866   END set_of_books_id;
2867 
2868   FUNCTION application_id
2869   RETURN NUMBER IS
2870   BEGIN
2871     RETURN g_ar_app_id;
2872   END application_id;
2873 
2874   FUNCTION un_meaning
2875   RETURN VARCHAR2 IS
2876   BEGIN
2877     RETURN g_un_meaning;
2878   END un_meaning;
2879 
2880   FUNCTION ea_meaning
2881   RETURN VARCHAR2 IS
2882   BEGIN
2883     RETURN g_ea_meaning;
2884   END ea_meaning;
2885 
2886   FUNCTION sa_meaning
2887   RETURN VARCHAR2 IS
2888   BEGIN
2889     RETURN g_sa_meaning;
2890   END sa_meaning;
2891 
2892   FUNCTION nr_meaning
2893   RETURN VARCHAR2 IS
2894   BEGIN
2895     RETURN g_nr_meaning;
2896   END nr_meaning;
2897 
2898   FUNCTION ll_meaning
2899   RETURN VARCHAR2 IS
2900   BEGIN
2901     RETURN g_ll_meaning;
2902   END ll_meaning;
2903 
2904   FUNCTION cost_ctr_number
2905   RETURN VARCHAR2 IS
2906   BEGIN
2907     RETURN g_cost_ctr_number;
2908   END cost_ctr_number;
2909 
2910   FUNCTION category_set_id
2911   RETURN VARCHAR2 IS
2912   BEGIN
2913     RETURN g_category_set_id;
2914   END category_set_id;
2915 
2916   FUNCTION category_structure_id
2917   RETURN VARCHAR2 IS
2918   BEGIN
2919     RETURN g_category_structure_id;
2920   END category_structure_id;
2921 
2922   FUNCTION inv_org_id
2923   RETURN VARCHAR2 IS
2924   BEGIN
2925     /* NOTE:  This is returned as a varchar.. not sure why */
2926     /* 5861728 - Initialize the value if null */
2927     IF g_inv_org_id IS NULL
2928     THEN
2929        oe_profile.get('SO_ORGANIZATION_ID',g_inv_org_id);
2930     END IF;
2931     RETURN g_inv_org_id;
2932   END inv_org_id;
2933 
2934   /* 7454302 - Determines if a revenue adjustment is allowed
2935      on a zero line.  Only allowed first time in.
2936 
2937       returns TRUE if there are no REV lines for current zero line
2938       returns FALSE if line is not zero or is zero and has REV lines
2939 
2940        p_check_line_amt skips the test of ra_customer_trx_lines when
2941        that information has already been tested */
2942   FUNCTION unearned_zero_lines(p_customer_trx_id IN NUMBER,
2943                                p_customer_trx_line_id IN NUMBER DEFAULT NULL,
2944                                p_check_line_amt IN VARCHAR DEFAULT 'Y',
2945                                p_adjustment_type IN VARCHAR DEFAULT 'EA')
2946   RETURN BOOLEAN IS
2947     l_zero_lines NUMBER := 99;
2948     l_unearned_zero_lines NUMBER := 0;
2949   BEGIN
2950        IF p_check_line_amt = 'Y'
2951        THEN
2952          /* Are there any zero lines? */
2953          SELECT count(*)
2954          INTO   l_zero_lines
2955          FROM   ra_customer_trx_lines l
2956          WHERE  l.customer_trx_id = p_customer_trx_id
2957          AND    l.customer_trx_line_id = NVL(p_customer_trx_line_id,
2958                                              l.customer_trx_line_id)
2959          AND    l.line_type = 'LINE'
2960          AND    l.extended_amount = 0;
2961        END IF;
2962 
2963        IF l_zero_lines = 0
2964        THEN
2965           RETURN FALSE;
2966        ELSE
2967 
2968           /* Do the zero lines have distributions? */
2969 
2970           /* 9349263 - return TRUE only if the line is zero and
2971               no dists exist, return FALSE if line is not zero or if
2972               it is zero and distributions exist */
2973           SELECT sum(percent)
2974           INTO   l_unearned_zero_lines
2975           FROM   ra_cust_trx_line_gl_dist
2976           WHERE  customer_trx_id = p_customer_trx_id
2977           AND    customer_trx_line_id = NVL(p_customer_trx_line_id,
2978                                             customer_trx_line_id)
2979           AND    account_class = DECODE(p_adjustment_type,'EA','REV',
2980                                                'UNEARN')
2981           AND    account_set_flag = 'N';
2982 
2983           IF l_unearned_zero_lines IS NULL
2984           THEN
2985              /* No dists exist */
2986              RETURN TRUE;
2987           ELSIF l_unearned_zero_lines <= 0
2988           THEN
2989              /* dists exist, but trx is unearned */
2990              RETURN TRUE;
2991           ELSE
2992              /* dists exist, but it is earned so no action allowed or reqd */
2993              RETURN FALSE;
2994           END IF;
2995       END IF;
2996 
2997   RETURN FALSE;
2998 
2999   EXCEPTION
3000      WHEN OTHERS THEN
3001          RETURN FALSE;
3002 
3003   END unearned_zero_lines;
3004 
3005 END AR_RAAPI_UTIL;