DBA Data[Home] [Help]

PACKAGE BODY: APPS.PA_BILLING_PROCESS_PKG

Source


1 PACKAGE BODY PA_BILLING_PROCESS_PKG AS
2 /* $Header: PABIPROB.pls 120.6.12020000.4 2013/03/22 07:38:57 rvadali ship $ */
3 
4 PROCEDURE PA_PROCESS_REV_ADJ (pproject_id  IN NUMBER,
5                               pfromproj    IN VARCHAR2,
6 			      ptoproj      IN VARCHAR2,
7 			      pmass_gen    IN NUMBER,
8 			      pacc_thru_dt IN DATE) is
9 
10 	mass_gen		VARCHAR2(1);
11 	acc_thru_dt		DATE;
12         projectstatus		BOOLEAN;
13         status			BOOLEAN;
14 	temp			NUMBER(1);
15 	distribution_rule	VARCHAR2(4);
16  /*Bug:13600015 Added below lines  */
17    v_inv_query1 VARCHAR2(2000);
18    v_inv_query2 VARCHAR2(150);
19    v_inv_query3 VARCHAR2(150);
20    v_inv_query4 VARCHAR2(150);
21    v_inv_query5 VARCHAR2(150);
22    v_inv_query6 VARCHAR2(150);
23  /*Bug13600015 End here */
24 
25 CURSOR cproj IS
26 	SELECT p.*
27 	FROM   pa_projects p, pa_project_types t
28 	WHERE ((segment1 BETWEEN pfromproj AND ptoproj)
29 	OR project_id =pproject_id)
30 	AND p.project_type = t.project_type
31     AND t.project_type_class_code = 'CONTRACT'
32     AND t.direct_flag = 'Y'  /*Added for bug 9359035*/
33 	AND pa_project_utils.check_prj_stus_action_allowed(p.project_status_code,'GENERATE_REV') = 'Y'; /* Added for bug 8887579*/
34 /*
35 CURSOR ctask(cproject_id VARCHAR2) is
36 	SELECT *
37 	FROM   pa_tasks a
38 	WHERE  project_id=cproject_id
39 	AND (
40 	        (task_id=top_task_id
41 	         AND ready_to_distribute_flag ='Y'
42 	        )
43 	     OR (chargeable_flag ='Y'
44 	         AND EXISTS ( SELECT null
45 		              FROM   pa_tasks b
46 		              WHERE  b.task_id                  = a.top_task_id
47 			      AND    b.ready_to_distribute_flag = 'Y'
48 			     )
49 		  )
50 	     ); commented for bug 8813330*/
51 
52 CURSOR cspf(cproject_id VARCHAR2) is
53 	SELECT /*+ INDEX(pf pa_summary_project_fundings_u1)*/ 1
54 	FROM pa_summary_project_fundings spf
55 	WHERE spf.project_id = cproject_id
56 	AND nvl(spf.revproc_baselined_amount, 0) <> 0;
57 
58 
59 CURSOR cdri(cproject_id NUMBER) is
60 	SELECT 1
61 	FROM pa_draft_revenues dr
62 	WHERE dr.project_id = cproject_id
63 	AND dr.released_date IS NULL
64 	AND dr.generation_error_flag = decode(pmass_gen, 1, 'Y',dr.generation_error_flag);
65 
66 --Bug13600015  following lines are added
67     Type Cur_Type IS REF CURSOR;
68    v_inv_cursor cur_type;
69    rproj pa_projects_all%ROWTYPE;
70 --Bug13600015 End here
71 BEGIN
72        	PA_MCB_INVOICE_PKG.log_message('... Enter the procedure pa_process_rev_adj');
73 
74 --Bug 13600015 Below lines added
75        v_inv_query1 := 'SELECT p.*'||' FROM pa_projects p, pa_project_types t '||
76          'WHERE ((segment1 BETWEEN :pfrmprj  AND :ptoprj )'||
77          ' OR project_id = :pprj_id)'||
78          ' AND p.project_type = t.project_type '||
79          ' AND t.project_type_class_code = ''CONTRACT'' '||
80          ' AND t.direct_flag = ''Y'' '||
81          ' AND pa_project_utils.check_prj_stus_action_allowed(p.project_status_code,''GENERATE_REV'') = ''Y'' ';
82 
83         IF G_ProjectType_ID <> 0 THEN
84           v_inv_query2 :=  'AND t.project_type_id = '|| G_ProjectType_ID;
85           v_inv_query1 := v_inv_query1 || v_inv_query2;
86         END IF;
87 
88         IF G_Organization_ID <> 0 THEN
89           v_inv_query3 := ' AND p.carrying_out_organization_id  = '|| G_ORGANIZATION_ID;
90           v_inv_query1 := v_inv_query1 || v_inv_query3;
91         END IF;
92 
93         IF G_Customer_Id <> 0 THEN
94           v_inv_query4 := 'AND EXISTS ( SELECT NULL FROM pa_project_customers pc '||
95                           'WHERE pc.project_id = p.project_id '||
96                           'AND pc.customer_id  = '|| G_Customer_Id || ')';
97           v_inv_query1 := v_inv_query1 || v_inv_query4;
98         END IF;
99 
100         IF G_Agrmnt_ID <> 0 THEN
101           v_inv_query5 := 'AND EXISTS ( SELECT NULL FROM pa_agreements_all agr, '||
102                  ' pa_summary_project_fundings spf '||
103                  ' WHERE agr.agreement_id = spf.agreement_id '||
104                  ' AND spf.project_id  = p.project_id '||
105                  ' AND nvl(spf.total_baselined_amount, 0) > 0 '||
106                  ' AND agr.agreement_id  = ' ||g_agrmnt_id||
107                  ')';
108           v_inv_query1 := v_inv_query1 || v_inv_query5;
109         END IF;
110 
111         IF G_MCB_FLAG <> 0 THEN
112            v_inv_query6 := 'AND p.multi_currency_billing_flag  = ''Y'' ';
113            v_inv_query1 := v_inv_query1 || v_inv_query6;
114         END IF;
115 --Bug13600015 End here
116 
117 	IF pmass_gen =1 THEN
118 		mass_gen := 'N';
119 	ELSE
120 		mass_gen := 'E';
121 	END IF;
122 
123 	IF pacc_thru_dt IS NULL THEN
124 		acc_thru_dt := SYSDATE;
125 	ELSE
126 		acc_thru_dt := pacc_thru_dt;
127 	END IF;
128 	IF pa_debug_mode  = 'Y' THEN
129           PA_MCB_INVOICE_PKG.log_message('pa_process_rev_adj:Start Projects Loop');
130         END IF;
134 
131 --Bug13600015 Added below lines
132        	PA_MCB_INVOICE_PKG.log_message('Dynamic Query '||v_inv_query1);
133         Open v_inv_cursor for v_inv_query1 using  pfromproj, ptoproj, pproject_id;
135 	--FOR Rproj IN Cproj
136 --Bug13600015 End here
137 	LOOP
138 	  -- project loop
139  --Bug13600015 Below lines added
140            fetch v_inv_cursor into rproj;
141            EXIT WHEN v_inv_cursor%NOTFOUND;
142  --Bug13600015 End here
143 
144 	  IF pa_debug_mode  = 'Y' THEN
145              PA_MCB_INVOICE_PKG.log_message('pa_process_rev_adj:Project Id :'||Rproj.project_id);
146           END IF;
147 	  projectstatus := FALSE;
148 	  OPEN cspf(Rproj.project_id);
149 	  FETCH cspf INTO temp;
150 	  IF cspf%FOUND THEN
151 	    projectstatus := TRUE;
152 	      IF pa_debug_mode  = 'Y' THEN
153                 PA_MCB_INVOICE_PKG.log_message('pa_process_rev_adj:Funding available ');
154               END IF;
155           ELSE
156 	      IF pa_debug_mode  = 'Y' THEN
157                 PA_MCB_INVOICE_PKG.log_message('pa_process_rev_adj:Funding not available');
158               END IF;
159 	  END IF;
160 	  CLOSE cspf;
161 	  IF projectstatus THEN
162 	    OPEN cdri(Rproj.project_id);
163 	    FETCH cdri INTO temp;
164   	    IF cdri%FOUND THEN
165 	       projectstatus := FALSE;
166 	    END IF;
167 	    CLOSE cdri;
168           END IF;
169 	  IF projectstatus THEN
170 	    status            := FALSE;
171 	    distribution_rule := SUBSTR(Rproj.distribution_rule,1,4);
172 	    IF pa_debug_mode  = 'Y' THEN
173 	       PA_MCB_INVOICE_PKG.log_message('pa_process_rev_adj:Start task Loop');
174 	    END IF;
175 /*		FOR  Rtask IN ctask(Rproj.project_id)
176 		LOOP commented for bug 8813330*/
177 		  -- task loop
178 /*		        IF pa_debug_mode  = 'Y' THEN
179 		          PA_MCB_INVOICE_PKG.log_message('pa_process_rev_adj:Task Id :'||Rtask.task_id);
180 		        END IF; commented for bug 8813330*/
181 /*			IF NOT (Rproj.enable_top_task_inv_mth_flag = 'N'
182 			         AND Rproj.distribution_rule	   = 'EVENT/EVENT'
183 			        )
184 			        AND Rtask.chargeable_flag	   = 'Y' THEN commented for bug 8813330*/
185 				 -- for expenditures
186 			    IF pa_debug_mode  = 'Y' THEN
187 			       PA_MCB_INVOICE_PKG.log_message('pa_process_rev_adj:Checking for EIs');
188 			    END IF;
189 			    BEGIN
190 			    /* Hint added for bug 8644400, Modified below query for bug 8813330*/
191 			    SELECT 1
192  			    INTO   temp
193 			    FROM dual
194 			    WHERE EXISTS(
195 					SELECT /*+ INDEX(Rtask PA_TASKS_N8) INDEX(ei PA_EXPENDITURE_ITEMS_N9)*/ 1
196 					FROM  pa_expenditure_items_all ei,
197 					      pa_tasks Rtask
198 					WHERE Rtask.project_id = Rproj.project_id
199 					AND   ei.project_id		  = Rproj.project_id /* 14727962 */
200 					AND   ei.task_id		  = Rtask.task_id
201 					/*AND   Rtask.chargeable_flag	   = 'Y' Commented for bug 9755401*/
202 					AND ((Rproj.enable_top_task_inv_mth_flag = 'Y'
203 					       and (Rtask.revenue_accrual_method = 'WORK' or Rtask.invoice_method = 'WORK'))
204 				               OR
205 				             (Rproj.enable_top_task_inv_mth_flag = 'N'
206 					     and (Rproj.revenue_accrual_method = 'WORK' or Rproj.invoice_method = 'WORK')))
207 					AND   ei.cost_distributed_flag    = 'Y'
208 					AND   ei.revenue_distributed_flag = 'N'
209 					AND   ei.expenditure_item_date    <= acc_thru_dt
210 					AND EXISTS(    SELECT /*+ INDEX(crdl PA_CUST_REV_DIST_LINES_U1)*/ NULL
211 							FROM  pa_cust_rev_dist_lines crdl,pa_draft_revenues drx1
212 							WHERE ei.project_id = crdl.project_id
213 							AND  (ei.expenditure_item_id = crdl.expenditure_item_id) /* 14727962 */
214 							AND NVL(crdl.reversed_flag,'N')   = 'N'
215 							AND NVL(crdl.line_num_reversed,0) = 0
216 							AND drx1.project_id		  = crdl.project_id
217 							AND drx1.draft_revenue_num        = crdl.draft_revenue_num
218 							AND DECODE(drx1.generation_error_flag,mass_gen,decode(drx1.released_date,NULL,1,0),0)
219 								= DECODE(drx1.released_date,NULL,1,0)
220 /* 14727962 */
221                 UNION ALL
222                                                     SELECT /*+ INDEX(crdl PA_CUST_REV_DIST_LINES_U1)*/ NULL
223 						    FROM  pa_cust_rev_dist_lines crdl,pa_draft_revenues drx1
224 					   	    WHERE ei.project_id = crdl.project_id
225 					       	    AND  (ei.adjusted_expenditure_item_id IS NOT NULL
226 						    AND ei.adjusted_expenditure_item_id = crdl.expenditure_item_id)
227 						    AND NVL(crdl.reversed_flag,'N')   = 'N'
228 						    AND NVL(crdl.line_num_reversed,0) = 0
229 						    AND drx1.project_id		  = crdl.project_id
230 						    AND drx1.draft_revenue_num        = crdl.draft_revenue_num
231 						    AND DECODE(drx1.generation_error_flag,mass_gen,decode(drx1.released_date,NULL,1,0),0)
232 							= DECODE(drx1.released_date,NULL,1,0)
233 
234 /* 14727962 */
235 							UNION ALL
236 							SELECT 1
237 							FROM   pa_expenditure_items ei2
238 							WHERE  ei2.project_id               = ei.project_id
239 							AND    ei2.expenditure_item_id      = ei.adjusted_expenditure_item_id
240 							AND    ei2.revenue_distributed_flag = 'Y'
241 							AND    ei2.raw_revenue              =  0
242 						  )
243 				        );
244 			    IF pa_debug_mode  = 'Y' THEN
245 			       PA_MCB_INVOICE_PKG.log_message('pa_process_rev_adj:EI found');
246 			    END IF;
247 				status := TRUE;
248 			  EXCEPTION
249 			   WHEN NO_DATA_FOUND THEN
250 			    IF pa_debug_mode  = 'Y' THEN
251 			       PA_MCB_INVOICE_PKG.log_message('pa_process_rev_adj:EI not found');
252 			    END IF;
253 	    		    status := FALSE;
254 			  END;
255 --			END IF; commented for bug 8813330
256 			IF (NOT status ) THEN /* Modified for bug 8813330*/
260 			   END IF;
257 				-- for events
258 	                   IF pa_debug_mode  = 'Y' THEN
259 			      PA_MCB_INVOICE_PKG.log_message('pa_process_rev_adj:Check for Events');
261 			        BEGIN
262 				/* Modified below query for bug 8813330*/
263 				   SELECT 1
264 				   INTO   temp
265 				   FROM dual
266 				   WHERE
267 				   EXISTS(
268 					   SELECT 1
269 					   FROM pa_events ev,
270 					        pa_cust_event_rev_dist_lines erdl,
271 					        pa_draft_revenues drx,
272 						pa_tasks Rtask
273 					   WHERE ev.project_id = Rtask.project_id
274 					   AND   ev.task_id    = Rtask.task_id
275 					   AND   Rtask.project_id = Rproj.project_id
276 					   AND   Rtask.task_id=Rtask.top_task_id
277 					   AND   Rtask.ready_to_distribute_flag ='Y'
278 					   AND ((ev.revenue_distributed_flag = 'N'
279 					         AND ev.completion_date <= acc_thru_dt)
280 					      OR (distribution_rule = 'COST'
281 					          AND   ev.revenue_distributed_flag    = 'Y'
282 					          AND   ev.completion_date             > acc_thru_dt
283                                                   )
284                                                  )
285 					   AND   nvl(ev.revenue_hold_flag, 'N') = 'N'
286 					   AND   (decode(nvl(ev.bill_trans_rev_amount, 0), 0,
287 					 	 decode(nvl(ev.zero_revenue_amount_flag, 'N'), 'Y', 1, 0),1) = 1)
288 					   AND   erdl.project_id                = ev.project_id
289 					   AND   erdl.event_num		     = ev.event_num
290 					   AND   erdl.task_id		     = ev.task_id
291 					   AND   nvl(erdl.reversed_flag,'N')    = 'N'
292 					   AND   erdl.line_num_reversed IS NULL
293 					   AND   drx.project_id		     = erdl.project_id
294 					   AND   drx.draft_revenue_num	     = erdl.draft_revenue_num
295 					   AND   decode(drx.generation_error_flag,mass_gen,decode(drx.released_date,NULL,1,0),0)
296 							    = decode(drx.released_date,NULL,1,0)
297 					 );
298 				  IF pa_debug_mode  = 'Y' THEN
299 				     PA_MCB_INVOICE_PKG.log_message('pa_process_rev_adj:Event found');
300 				  END IF;
301 					status := TRUE;
302 				  EXCEPTION
303 				   WHEN NO_DATA_FOUND THEN
304  				     IF pa_debug_mode  = 'Y' THEN
305 				      PA_MCB_INVOICE_PKG.log_message('pa_process_rev_adj:Event not found');
306 				     END IF;
307 				     status := FALSE;
308 				  END;
309 			END IF;
310 /*			IF Status THEN
311 			 if records found for that project for one task no need to check for other tasks
312 			  EXIT;
313 			END IF;commented for bug 8873015 */
314  --		END LOOP; commented for bug 8813330 task loop
315    	        IF pa_debug_mode  = 'Y' THEN
316 	          PA_MCB_INVOICE_PKG.log_message('pa_process_rev_adj:End task Loop');
317 	        END IF;
318 		IF NOT status THEN
319     	           IF pa_debug_mode  = 'Y' THEN
320 		     PA_MCB_INVOICE_PKG.log_message('pa_process_rev_adj:checking for Project level events');
321 		   END IF;
322 			-- For project level events
323 		        BEGIN
324 			    SELECT 1
325 			    INTO   temp
326 			    FROM   dual
327    			    WHERE  EXISTS(
328 					SELECT 1
329 					FROM pa_events ev,
330 					     pa_cust_event_rev_dist_lines erdl,
331 					     pa_draft_revenues drx
332 					WHERE ev.project_id                  = Rproj.project_id
333 					AND   ev.task_id IS NULL
334 				        AND ((ev.revenue_distributed_flag = 'N'
335 					         AND ev.completion_date <= acc_thru_dt)
336 					      OR (distribution_rule = 'COST'
337 					          AND   ev.revenue_distributed_flag    = 'Y'
338 					          AND   ev.completion_date             > acc_thru_dt
339                                                   )
340                                                 )
341 					AND   nvl(ev.revenue_hold_flag, 'N') = 'N'
342 					AND   (decode(nvl(ev.bill_trans_rev_amount, 0), 0,
343 						 decode(nvl(ev.zero_revenue_amount_flag, 'N'), 'Y', 1, 0),1) = 1)
344 					AND   erdl.project_id                = ev.project_id
345 					AND   erdl.task_id IS NULL
346 					AND   erdl.event_num		     = ev.event_num
347 					AND   nvl(erdl.reversed_flag,'N')    = 'N'
348 					AND   erdl.line_num_reversed IS NULL
349 					AND   drx.project_id		     = erdl.project_id
350 					AND   drx.draft_revenue_num	     = erdl.draft_revenue_num
351 					AND   decode(drx.generation_error_flag,mass_gen,decode(drx.released_date,NULL,1,0),0)
352 				       		    = decode(drx.released_date,NULL,1,0)
353 				      );
354 			    IF pa_debug_mode  = 'Y' THEN
355 			      PA_MCB_INVOICE_PKG.log_message('pa_process_rev_adj:Project level Event found');
356 			    END IF;
357 			    status := TRUE;
358 			  EXCEPTION
359 			   WHEN NO_DATA_FOUND THEN
360  	       	             IF pa_debug_mode  = 'Y' THEN
361 			      PA_MCB_INVOICE_PKG.log_message('pa_process_rev_adj:Project level Event not found');
362 			     END IF;
363  			     status := FALSE;
364 			  END;
365 		END IF;
366 		IF NOT status THEN
367  	       	        IF pa_debug_mode  = 'Y' THEN
368 			 PA_MCB_INVOICE_PKG.log_message('pa_process_rev_adj:Checking for Billing extensions');
369 		        END IF;
370 		--Billing extension
371 		        BEGIN
372 			    SELECT 1
373 			    INTO   temp
374 			    FROM dual
375 			    WHERE EXISTS(
376 					SELECT 1
377 					FROM pa_billing_extensions be,
378 					     pa_billing_assignments bea
379 					WHERE bea.active_flag        = 'Y'
380 					AND bea.billing_extension_id = be.billing_extension_id
381 					AND (bea.project_id  = Rproj.project_id
382 					     OR bea.project_type = Rproj.project_type
383 					     OR bea.distribution_rule = Rproj.distribution_rule)
384 					AND be.calling_process in ('Revenue','Both')
385 					AND be.call_after_adj_flag    = 'Y'
389 			   PA_MCB_INVOICE_PKG.log_message('pa_process_rev_adj:Billing extensions Found');
386 					AND be.trx_independent_flag   = 'Y'
387 					);
388  	       	          IF pa_debug_mode  = 'Y' THEN
390 		          END IF;
391 			  status := TRUE;
392 			  EXCEPTION
393 			   WHEN NO_DATA_FOUND THEN
394  	       	             IF pa_debug_mode  = 'Y' THEN
395 			       PA_MCB_INVOICE_PKG.log_message('pa_process_rev_adj:Billing extensions Not Found');
396 		             END IF;
397 			     status := FALSE;
398 			  END;
399 		END IF;
400 		IF status THEN
401   	          IF pa_debug_mode  = 'Y' THEN
402 		     PA_MCB_INVOICE_PKG.log_message('pa_process_rev_adj:Inserting project id :'||Rproj.project_id);
403 		  END IF;
404 		  INSERT INTO PA_BILLING_PROCESS_GT(project_id,request_id,process)
405 		  VALUES(Rproj.project_id,g_request_id,'REV_ADJ');
406 		 --insert record
407 		END IF;
408 	  END IF; -- If projectstatus then
409 	END LOOP; -- project loop
410           close v_inv_cursor;
411 /*        IF pa_debug_mode  = 'Y' THEN
412 	   PA_MCB_INVOICE_PKG.log_message('pa_process_rev_adj:End task Loop');
413 	END IF; commented for bug 8813330 */
414        	PA_MCB_INVOICE_PKG.log_message('... Leaving the procedure pa_process_rev_adj');
415 END PA_PROCESS_REV_ADJ;
416 END PA_BILLING_PROCESS_PKG;