Wednesday, July 17, 2024

Coding Tutorials-2 Oracle programming

 

Coding Tutorials-3  Oracle programming



---------  NL_CREATE_JOB_INSTANT

create or replace procedure estaple.  NL_create_job_instance is


begin

declare 

 v_counter number;

 v_total number :=0;

v_ssa_grp varchar2(10000);

--tot_count number;

job_count number :=0;

--v_date date:='01-feb-2012'; 

v_var varchar2(10000); 

cursor c1 is

select ssa,count(*) as counts from   NL_Es_Home_Sys_Account h

where h.is_active =1

and h.enrollment_date < add_months(last_day(to_date(SYSDATE))+1,-1)

group by ssa

order by count(*)desc;


begin

v_counter:=0;



for r1 in c1 loop

v_counter := v_counter + r1.counts;

v_ssa_grp := v_ssa_grp||'''' || r1.ssa ||''',';

if (v_counter>=10000) then

v_ssa_grp := substr(v_ssa_grp,1,length(v_ssa_grp)-1);


job_count:= job_count+1;


/*DBMS_SCHEDULER.CREATE_JOB(auto_drop => TRUE,

job_name => 'MY_JOB_FETCH' || job_count,

job_type => 'STORED_PROCEDURE',

job_action => \*'PKG_ES_BILL_INV_SUMMARY_4.sp_get_cdr_bill_inv_ssa'*\'sp_parent_recon',

start_date => '10-JUL-12 04:30:00 PM',

number_of_arguments => 2,--------update argument nos 

enabled => FALSE,

end_date => '10-JUL-12 04:35:00 PM',

repeat_interval => 'FREQ=MONTHLY');


v_var:=v_ssa_grp;


DBMS_SCHEDULER.SET_JOB_ARGUMENT_VALUE (

   job_name                => 'MY_JOB_FETCH' || job_count,

   argument_position       => 1,

   argument_value          => '1-JUL-2012');


DBMS_SCHEDULER.SET_JOB_ARGUMENT_VALUE (

   job_name                => 'MY_JOB_FETCH' || job_count,

   argument_position       => 2,

   argument_value          => v_var);

*/



v_total :=v_total+v_counter;

dbms_output.put_line(v_ssa_grp || v_counter||'job count   : ' ||job_count );


v_counter:=0;


v_ssa_grp:= null;


end if;

end loop;


if (v_counter>=0) then

v_total :=v_total+v_counter;

v_ssa_grp := substr(v_ssa_grp,1,length(v_ssa_grp)-1);

job_count:= job_count+1;

dbms_output.put_line(v_ssa_grp || v_counter||'job count   : ' ||job_count );

dbms_output.put_line('Total Count ='||v_total  );

end if;

end;

end;



==========

  NL_SCHEDULER_JOB2

create or replace procedure estaple.  NL_scheduler_job2  is



begin



DBMS_SCHEDULER.CREATE_JOB(auto_drop => TRUE,

job_name => 'MY_JOBNT_R1' /*|| job_count*/,

job_type => 'STORED_PROCEDURE',

job_action => 'sp_parent_recon2',

start_date => '14-aug-12 6:00:00 AM',

number_of_arguments => 1,

enabled => FALSE,

end_date => '14-aug-12 12:30:00 PM',

repeat_interval => 'FREQ=MONTHLY');

/*v_var:=v_ssa_grp;*/

DBMS_SCHEDULER.SET_JOB_ARGUMENT_VALUE (

   job_name                => 'MY_JOBNT_R1'/* || job_count*/,

   argument_position       => 1,

   argument_value          => '1-AUG-2012');


/*DBMS_SCHEDULER.SET_JOB_ARGUMENT_VALUE (

   job_name                => 'MY_JOB' || job_count,

   argument_position       => 2,

   argument_value          => v_var);  */


dbms_scheduler.enable('MY_JOBNT_R1' /*|| job_count*/);

/*job_count:= job_count+1;

dbms_output.put_line(v_ssa_grp || v_counter );

v_counter:=0;

v_ssa_grp:= null;

end if;

end loop;*/

/*end;*/


end   NL_scheduler_job2;

======= RAJ_CREATE_PROD


CREATE OR REPLACE PROCEDURE ESTAPLE.raj_create_prod(p_exe_date date) is


cursor xxx is 

select *   from B200203226.bulk_product_creation bpc where bpc.exe_date=p_exe_date;


/*select cdp.parent_id,cdp.account_id,cdp.net_diff as difference from crtprd cdp where

cdp.account_id=(select max(cdp1.account_id) from crtprd2 cdp1 where cdp1.parent_id=cdp.parent_id)

and cdp.parent_id  not in ('1019458230',

'1007265403','1007248566','1001121417','1007271029','1007251938');*/


/*select *\*sum(bdff.difference)/1000  *\from   NL_es_diff bdff 

where bdff.parent_account_id in ('1017986414')

and bdff.logged_date > '21-jun-2012'

and bdff.logged_date=(select max(bdff1.logged_date) 

from   NL_es_diff bdff1 where bdff1.home_sys_account_id=bdff.home_sys_account_id);*/







begin

for rxxx in xxx

loop

 begin

 sp_create_product_accountwise(p_customer_ref  => rxxx.account_id,

                                              p_account_id =>rxxx.account_id ,

                                              p_product_charges => -1*rxxx.product_charges,

                                              p_product_id      =>rxxx.product_id,

                                              p_invoive_seq_no  =>NULL,

                                              p_start_date      =>rxxx.start_date,

                                              p_end_date       =>rxxx.end_date);

                                              

                                             

exception

when others then

dbms_output.put_line(rxxx.account_id||sqlerrm);


                                              


end;

end loop;

end;

=============RAJ_FIND_DIFF

CREATE OR REPLACE PROCEDURE ESTAPLE.raj_find_diff as


cursor xxx is 

select distinct bpr1.parent_id  from   NL_parent_recon bpr1 where bpr1.logged_date >= '14-aug-2012' 

and bpr1.remarks not like 'OK'

;



begin

for rxxx in xxx

loop

begin

/* sp_create_product_accountwise(p_customer_ref  => rxxx.account_id,

                                              p_account_id =>rxxx.account_id ,

                                              p_product_charges => (-1)*rxxx.difference,

                                              p_product_id      =>'188',

                                              p_invoive_seq_no  =>NULL,

                                              p_start_date      =>'1-apr-2012',

                                              p_end_date       =>'30-apr-2012');*/

                                              

                                              

sp_find_difference(rxxx.parent_id);                                              


end;

end loop;

end;

===========SP.ANLYSE_ADJ_DISC

create or replace procedure estaple.sp_anlyse_adj_disc(p_bill_cycle_date in date )

as

v_account_id varchar2(20);

v_home_sys_account_id varchar2(20);

v_es_discount number;

v_adjustment number;

v_adj_at_parent number;

v_es_disc_at_parent number;




cursor cur_get_accounts is 


SELECT h.account_id,h.home_sys_account_id ,es_discount,adjustment

  FROM   NL_es_hbs_payments h

 WHERE h.logged_date > p_bill_cycle_date

 and h.account_id in

 (select account_id

 from   NL_es_home_sys_account bh where ssa in('PJM','PUN','AHD','VDA')) ;



begin 



for rec_get_accounts in cur_get_accounts loop


v_account_id:=rec_get_accounts.account_id;

v_home_sys_account_id := rec_get_accounts.home_sys_account_id;

v_es_discount :=rec_get_accounts.es_discount;

v_adjustment :=rec_get_accounts.adjustment;



if (v_adjustment<>0) then 


select nvl(sum(bp.charge),0)

into v_adj_at_parent

from   NL_es_post_charges_log bp 

where bp.child_account_id=v_account_id and product_id=187

and bp.logged_date>p_bill_cycle_date;



if abs(v_adj_at_parent+v_adjustment)>1000 then

dbms_output.put_line('child ' ||v_account_id ||' adjustment in irb '||v_adjustment ||' '|| ' charges of product'||'  '|| v_adj_at_parent);

end if;

end if ;



if (v_es_discount<>0 ) then 



select nvl(sum(bp.charge),0)

into v_es_disc_at_parent

from   NL_es_post_charges_log bp 

where bp.child_account_id=v_account_id and product_id=190

and bp.logged_date>p_bill_cycle_date;


if abs(v_es_discount+v_es_disc_at_parent) >1000 then


dbms_output.put_line('child ' ||v_account_id ||' es discount in irb '||v_es_discount ||'  '|| ' charges of product'||' '|| v_es_disc_at_parent);



end if;

end if;









end loop;



end;

============= SP_BULK_CREATE

CREATE OR REPLACE PROCEDURE ESTAPLE.sp_bulk_create IS


  v_account_id   NL_es_home_sys_account.account_id%TYPE;


  v_amount          NUMBER;

  v_invoice_seq_no    NL_es_cdr_bill_invoice.invoice_seq_no%TYPE;

  v_enrollment_date DATE;

  CURSOR cur_get_accounts IS

  /*SELECT account_id, charge FROM billsummary_updates bh;*/

SELECT d.account_id,d.difference

  FROM   NL_es_diff d

 WHERE d.parent_account_id = '1020844719' AND d.logged_date > '21-jun-2012'

 and d.is_active=1 and d.difference>0;


BEGIN

  FOR rec_get_accounts IN cur_get_accounts LOOP

    v_account_id := rec_get_accounts.account_id;

    v_amount     := -1*rec_get_accounts.difference;

    SELECT enrollment_date

      INTO v_enrollment_date

      FROM   NL_es_home_sys_account b

     WHERE b.account_id = v_account_id;

  

    BEGIN

      SELECT max(bc.invoice_seq_no)

        INTO v_invoice_seq_no

        FROM   NL_es_cdr_bill_invoice bc

       WHERE bc.account_id = v_account_id AND

             bc.bill_cycle_date = '1-may-2012';

      sp_create_product(v_account_id,

                        v_account_id,

                        v_amount,

                        188,

                        v_invoice_seq_no,

                        '1-may-2012',

                        '31-may-2012');

    

    EXCEPTION

      WHEN OTHERS THEN

        dbms_output.put_line(v_account_id || SQLERRM);

    END;

  END LOOP;


END;

====

============= SP_CORRECT_ADJUSTMENT

create or replace procedure estaple.sp_correct_adjustment

as


cursor cur_get_accounts 

is

select b.es_account_id,b.child_account_id,b.charge_desc,

b.charge+h.adjustment as diff,b.charge,h.adjustment,product_seq

from   NL_es_post_charges_log b inner join   NL_es_hbs_payments h

on h.account_id=b.child_account_id and h.invoice_seq_no=b.invoice_seq_no

and b.logged_date>'19-may-2012'

and b.product_id in(187)

and abs(b.charge+h.adjustment)>900;


v_parent_account_id   NL_es_account.account_id%type;

v_account_id   NL_es_account.account_id%type;

v_home_sys_account_id   NL_es_account.account_id%type;

v_diff number;

v_charge number;

v_adjustment number;

v_count number :=0;

v_product_seq number;


begin 




for rec_get_accounts in cur_get_accounts loop


v_parent_account_id:=rec_get_accounts.es_account_id;

v_account_id :=rec_get_accounts.child_account_id;

v_home_sys_account_id :=rec_get_accounts.charge_desc;

v_diff :=rec_get_accounts.diff;

v_charge :=rec_get_accounts.charge;

v_adjustment :=rec_get_accounts.adjustment;

v_product_seq :=rec_get_accounts.product_seq;



update   NL_es_post_charges_log bp

set bp.charge=-v_adjustment

where bp.child_account_id=v_account_id

and bp.product_seq=v_product_seq;



v_count :=v_count+1;


INSERT INTO update_adj

VALUES

  (v_parent_account_id,

   v_account_id,

   v_home_sys_account_id,

   v_charge,

   v_adjustment,

   v_diff,

   v_product_seq);



sp_correct_everything(v_account_id);








end loop;



dbms_output.put_line('updated' ||v_count||' rows for parent '||v_parent_account_id

);

end;

===============SP_CORRECT_CHARGES

CREATE OR REPLACE PROCEDURE ESTAPLE.sp_correct_charges(p_product_id NUMBER) IS


  CURSOR cur_get_accounts IS

    SELECT customer_ref

      FROM account@cdr_nz

     WHERE account_num = '1010974985';


  v_product_charges    custoverrideprice.one_off_number@cdr_nz%TYPE;

  v_customer_ref       customer.customer_ref@cdr_nz%TYPE;

  v_product_start_date custoverrideprice.start_dat@cdr_nz%TYPE;

  v_product_end_date   custoverrideprice.end_dat@cdr_nz%TYPE;

  v_product_seq        custoverrideprice.product_seq@cdr_nz%TYPE;

BEGIN


  FOR rec_get_accounts IN cur_get_accounts LOOP

    v_customer_ref := rec_get_accounts.customer_ref;

  

    BEGIN

    

      SELECT one_off_number, start_dat, end_dat, bp.product_seq

        INTO v_product_charges,

             v_product_start_date,

             v_product_end_date,

             v_product_seq

        FROM custoverrideprice@cdr_nz c INNER JOIN   NL_es_post_charges_log bp ON bp.child_account_id = customer_ref

       WHERE customer_ref = v_customer_ref AND

             c.product_seq = bp.product_seq AND

             bp.product_id = p_product_id AND bp.product_seq IN (5, 11);

    

    EXCEPTION

      WHEN no_data_found THEN

        dbms_output.put_line(v_customer_ref);

      

    END;

    IF (v_product_seq IS NOT NULL) THEN

    

      BEGIN

        gnvoverrideprice.modifyforproduct2nc@cdr_nz(p_customerref        => v_customer_ref,

                                                    p_overridepriceseq   => v_product_seq,

                                                    p_productseq         => v_product_seq,

                                                    p_newstartdat        => '1-nov-2010',

                                                    p_newenddat          => '30-nov-2010',

                                                    p_newoneoffmodid     => 1,

                                                    p_newoneoffnumber    => v_product_charges,

                                                    p_oldoneoffmodid     => 1,

                                                    p_oldoneoffnumber    => v_product_charges,

                                                    p_newrecurmodid      => NULL,

                                                    p_newrecurnumber     => NULL,

                                                    p_newtermmodid       => NULL,

                                                    p_newtermnumber      => NULL,

                                                    p_newsusponemodid    => NULL,

                                                    p_newsusponenumber   => NULL,

                                                    p_newsusprecurmodid  => NULL,

                                                    p_newsusprecurnumber => NULL,

                                                    p_newreactmodid      => NULL,

                                                    p_newreactnumber     => NULL,

                                                    p_newnotes           => NULL,

                                                    p_oldstartdat        => v_product_start_date,

                                                    p_oldenddat          => v_product_end_date,

                                                    p_oldrecurmodid      => NULL,

                                                    p_oldrecurnumber     => NULL,

                                                    p_oldtermmodid       => NULL,

                                                    p_oldtermnumber      => NULL,

                                                    p_oldsusponemodid    => NULL,

                                                    p_oldsusponenumber   => NULL,

                                                    p_oldsusprecurmodid  => NULL,

                                                    p_oldsusprecurnumber => NULL,

                                                    p_oldreactmodid      => NULL,

                                                    p_oldreactnumber     => NULL,

                                                    p_oldnotes           => NULL);

      EXCEPTION

        WHEN OTHERS THEN

          dbms_output.put_line(v_customer_ref || SQLERRM);

      END;

    

    END IF;

    COMMIT;

  END LOOP;

END;

=======

============== SP_CORRECT_DETAILS_ON_REBILL

CREATE OR REPLACE PROCEDURE ESTAPLE.sp_correct_details_on_rebill(p_bill_cycle_date DATE) IS


  v_bill_version        NUMBER;

  v_bill_run_date       DATE;

  v_invoice_amount      NUMBER;

  v_adjustment          NUMBER;

  v_charges             NUMBER;

  v_due_date            DATE;

  v_bill_seq            NUMBER;

  v_invoice_amount_old  NUMBER;

  v_home_sys_account_id   NL_es_home_sys_account.home_sys_account_id%TYPE;

  v_account_id            NL_es_home_sys_account.account_id%TYPE;

  v_is_new                NL_es_home_sys_account.account_id%TYPE;

  v_payment             NUMBER;

  CURSOR cur_get_accounts IS

    SELECT account_num,

           bill_version,

           actual_bill_dtm,

           balance_out_mny,

           invoice_net_mny,

           adjustments_mny,

           payment_due_dat,

           bill_seq,

           payments_mny

      FROM billsummary@cdr_nz

     WHERE account_num IN

           (select * from rebilled_hbs) AND

           bill_status = 1 AND bill_dtm = p_bill_cycle_date;

    

     BEGIN

       FOR rec_get_accounts IN cur_get_accounts LOOP BEGIN v_home_sys_account_id := rec_get_accounts.account_num;

  v_bill_version   := rec_get_accounts.bill_version;

  v_bill_run_date  := rec_get_accounts.actual_bill_dtm;

  v_invoice_amount := rec_get_accounts.balance_out_mny;

  v_charges        := rec_get_accounts.invoice_net_mny;

  v_adjustment     := rec_get_accounts.adjustments_mny;

  v_due_date       := rec_get_accounts.payment_due_dat;

  v_bill_seq       := rec_get_accounts.bill_seq;

  v_payment        := rec_get_accounts.payments_mny;

  SELECT           bh.account_id, is_new INTO v_account_id, v_is_new FROM   NL_es_home_sys_account bh WHERE bh.home_sys_account_id = v_home_sys_account_id AND bh.is_active = 1;


  SELECT bc.invoice_amount INTO v_invoice_amount_old FROM   NL_es_cdr_bill_invoice bc WHERE bc.account_id = v_account_id AND bc.end_date = p_bill_cycle_date AND bc.logged_date > p_bill_cycle_date;


  IF   ((v_invoice_amount >= 0 AND v_invoice_amount_old >= 0) OR

        (v_invoice_amount_old < 0 AND v_invoice_amount < 0)) THEN

  

  UPDATE   NL_es_cdr_bill_invoice bc SET bc.bill_run_date = v_bill_run_date, bc.due_date = v_due_date, bc.charges = v_charges, bc.invoice_amount = v_invoice_amount, bc.outstanding_bal = v_invoice_amount, bc.adjustment = v_adjustment, bc.bill_version = v_bill_version, bc.last_payment = -v_payment WHERE bc.account_id = v_account_id AND bc.invoice_seq_no = v_bill_seq;

  ELSIF(v_invoice_amount <= 0 AND v_invoice_amount_old >= 0) THEN UPDATE   NL_es_cdr_bill_invoice bc SET bc.bill_run_date = v_bill_run_date, bc.due_date = v_due_date, bc.charges = v_charges, bc.invoice_amount = v_invoice_amount, bc.outstanding_bal = v_invoice_amount, bc.adjustment = v_adjustment, bc.bill_version = v_bill_version, bc.last_payment = -v_payment WHERE bc.account_id = v_account_id AND bc.invoice_seq_no = v_bill_seq;


  UPDATE   NL_es_home_sys_account bh SET bh.is_new = -1 WHERE account_id = v_account_id;


  ELSIF(v_invoice_amount <= 0 AND v_invoice_amount_old > 0) THEN

  

  UPDATE   NL_es_cdr_bill_invoice bc SET bc.bill_run_date = v_bill_run_date, bc.due_date = v_due_date, bc.charges = v_charges, bc.invoice_amount = v_invoice_amount, bc.outstanding_bal = v_invoice_amount, bc.adjustment = v_adjustment, bc.bill_version = v_bill_version, bc.last_payment = -v_payment WHERE bc.account_id = v_account_id AND bc.invoice_seq_no = v_bill_seq;


  UPDATE   NL_es_home_sys_account bh SET bh.is_new = 0 WHERE account_id = v_account_id;


END IF; COMMIT;

EXCEPTION

WHEN OTHERS THEN dbms_output.put_line(v_account_id || SQLERRM);

END;

END LOOP;


END;

CREATE OR REPLACE PROCEDURE ESTAPLE.sp_correct_details_on_rebill(p_bill_cycle_date DATE) IS


  v_bill_version        NUMBER;

  v_bill_run_date       DATE;

  v_invoice_amount      NUMBER;

  v_adjustment          NUMBER;

  v_charges             NUMBER;

  v_due_date            DATE;

  v_bill_seq            NUMBER;

  v_invoice_amount_old  NUMBER;

  v_home_sys_account_id   NL_es_home_sys_account.home_sys_account_id%TYPE;

  v_account_id            NL_es_home_sys_account.account_id%TYPE;

  v_is_new                NL_es_home_sys_account.account_id%TYPE;

  v_payment             NUMBER;

  CURSOR cur_get_accounts IS

    SELECT account_num,

           bill_version,

           actual_bill_dtm,

           balance_out_mny,

           invoice_net_mny,

           adjustments_mny,

           payment_due_dat,

           bill_seq,

           payments_mny

      FROM billsummary@cdr_nz

     WHERE account_num IN

           (select * from rebilled_hbs) AND

           bill_status = 1 AND bill_dtm = p_bill_cycle_date;

    

     BEGIN

       FOR rec_get_accounts IN cur_get_accounts LOOP BEGIN v_home_sys_account_id := rec_get_accounts.account_num;

  v_bill_version   := rec_get_accounts.bill_version;

  v_bill_run_date  := rec_get_accounts.actual_bill_dtm;

  v_invoice_amount := rec_get_accounts.balance_out_mny;

  v_charges        := rec_get_accounts.invoice_net_mny;

  v_adjustment     := rec_get_accounts.adjustments_mny;

  v_due_date       := rec_get_accounts.payment_due_dat;

  v_bill_seq       := rec_get_accounts.bill_seq;

  v_payment        := rec_get_accounts.payments_mny;

  SELECT           bh.account_id, is_new INTO v_account_id, v_is_new FROM   NL_es_home_sys_account bh WHERE bh.home_sys_account_id = v_home_sys_account_id AND bh.is_active = 1;


  SELECT bc.invoice_amount INTO v_invoice_amount_old FROM   NL_es_cdr_bill_invoice bc WHERE bc.account_id = v_account_id AND bc.end_date = p_bill_cycle_date AND bc.logged_date > p_bill_cycle_date;


  IF   ((v_invoice_amount >= 0 AND v_invoice_amount_old >= 0) OR

        (v_invoice_amount_old < 0 AND v_invoice_amount < 0)) THEN

  

  UPDATE   NL_es_cdr_bill_invoice bc SET bc.bill_run_date = v_bill_run_date, bc.due_date = v_due_date, bc.charges = v_charges, bc.invoice_amount = v_invoice_amount, bc.outstanding_bal = v_invoice_amount, bc.adjustment = v_adjustment, bc.bill_version = v_bill_version, bc.last_payment = -v_payment WHERE bc.account_id = v_account_id AND bc.invoice_seq_no = v_bill_seq;

  ELSIF(v_invoice_amount <= 0 AND v_invoice_amount_old >= 0) THEN UPDATE   NL_es_cdr_bill_invoice bc SET bc.bill_run_date = v_bill_run_date, bc.due_date = v_due_date, bc.charges = v_charges, bc.invoice_amount = v_invoice_amount, bc.outstanding_bal = v_invoice_amount, bc.adjustment = v_adjustment, bc.bill_version = v_bill_version, bc.last_payment = -v_payment WHERE bc.account_id = v_account_id AND bc.invoice_seq_no = v_bill_seq;


  UPDATE   NL_es_home_sys_account bh SET bh.is_new = -1 WHERE account_id = v_account_id;


  ELSIF(v_invoice_amount <= 0 AND v_invoice_amount_old > 0) THEN

  

  UPDATE   NL_es_cdr_bill_invoice bc SET bc.bill_run_date = v_bill_run_date, bc.due_date = v_due_date, bc.charges = v_charges, bc.invoice_amount = v_invoice_amount, bc.outstanding_bal = v_invoice_amount, bc.adjustment = v_adjustment, bc.bill_version = v_bill_version, bc.last_payment = -v_payment WHERE bc.account_id = v_account_id AND bc.invoice_seq_no = v_bill_seq;


  UPDATE   NL_es_home_sys_account bh SET bh.is_new = 0 WHERE account_id = v_account_id;


END IF; COMMIT;

EXCEPTION

WHEN OTHERS THEN dbms_output.put_line(v_account_id || SQLERRM);

END;

END LOOP;


END;

CREATE OR REPLACE PROCEDURE ESTAPLE.sp_correct_details_on_rebill(p_bill_cycle_date DATE) IS


  v_bill_version        NUMBER;

  v_bill_run_date       DATE;

  v_invoice_amount      NUMBER;

  v_adjustment          NUMBER;

  v_charges             NUMBER;

  v_due_date            DATE;

  v_bill_seq            NUMBER;

  v_invoice_amount_old  NUMBER;

  v_home_sys_account_id   NL_es_home_sys_account.home_sys_account_id%TYPE;

  v_account_id            NL_es_home_sys_account.account_id%TYPE;

  v_is_new                NL_es_home_sys_account.account_id%TYPE;

  v_payment             NUMBER;

  CURSOR cur_get_accounts IS

    SELECT account_num,

           bill_version,

           actual_bill_dtm,

           balance_out_mny,

           invoice_net_mny,

           adjustments_mny,

           payment_due_dat,

           bill_seq,

           payments_mny

      FROM billsummary@cdr_nz

     WHERE account_num IN

           (select * from rebilled_hbs) AND

           bill_status = 1 AND bill_dtm = p_bill_cycle_date;

    

     BEGIN

       FOR rec_get_accounts IN cur_get_accounts LOOP BEGIN v_home_sys_account_id := rec_get_accounts.account_num;

  v_bill_version   := rec_get_accounts.bill_version;

  v_bill_run_date  := rec_get_accounts.actual_bill_dtm;

  v_invoice_amount := rec_get_accounts.balance_out_mny;

  v_charges        := rec_get_accounts.invoice_net_mny;

  v_adjustment     := rec_get_accounts.adjustments_mny;

  v_due_date       := rec_get_accounts.payment_due_dat;

  v_bill_seq       := rec_get_accounts.bill_seq;

  v_payment        := rec_get_accounts.payments_mny;

  SELECT           bh.account_id, is_new INTO v_account_id, v_is_new FROM   NL_es_home_sys_account bh WHERE bh.home_sys_account_id = v_home_sys_account_id AND bh.is_active = 1;


  SELECT bc.invoice_amount INTO v_invoice_amount_old FROM   NL_es_cdr_bill_invoice bc WHERE bc.account_id = v_account_id AND bc.end_date = p_bill_cycle_date AND bc.logged_date > p_bill_cycle_date;


  IF   ((v_invoice_amount >= 0 AND v_invoice_amount_old >= 0) OR

        (v_invoice_amount_old < 0 AND v_invoice_amount < 0)) THEN

  

  UPDATE   NL_es_cdr_bill_invoice bc SET bc.bill_run_date = v_bill_run_date, bc.due_date = v_due_date, bc.charges = v_charges, bc.invoice_amount = v_invoice_amount, bc.outstanding_bal = v_invoice_amount, bc.adjustment = v_adjustment, bc.bill_version = v_bill_version, bc.last_payment = -v_payment WHERE bc.account_id = v_account_id AND bc.invoice_seq_no = v_bill_seq;

  ELSIF(v_invoice_amount <= 0 AND v_invoice_amount_old >= 0) THEN UPDATE   NL_es_cdr_bill_invoice bc SET bc.bill_run_date = v_bill_run_date, bc.due_date = v_due_date, bc.charges = v_charges, bc.invoice_amount = v_invoice_amount, bc.outstanding_bal = v_invoice_amount, bc.adjustment = v_adjustment, bc.bill_version = v_bill_version, bc.last_payment = -v_payment WHERE bc.account_id = v_account_id AND bc.invoice_seq_no = v_bill_seq;


  UPDATE   NL_es_home_sys_account bh SET bh.is_new = -1 WHERE account_id = v_account_id;


  ELSIF(v_invoice_amount <= 0 AND v_invoice_amount_old > 0) THEN

  

  UPDATE   NL_es_cdr_bill_invoice bc SET bc.bill_run_date = v_bill_run_date, bc.due_date = v_due_date, bc.charges = v_charges, bc.invoice_amount = v_invoice_amount, bc.outstanding_bal = v_invoice_amount, bc.adjustment = v_adjustment, bc.bill_version = v_bill_version, bc.last_payment = -v_payment WHERE bc.account_id = v_account_id AND bc.invoice_seq_no = v_bill_seq;


  UPDATE   NL_es_home_sys_account bh SET bh.is_new = 0 WHERE account_id = v_account_id;


END IF; COMMIT;

EXCEPTION

WHEN OTHERS THEN dbms_output.put_line(v_account_id || SQLERRM);

END;

END LOOP;


END;

=======SP_CORRECT_EVERYTHING

CREATE OR REPLACE PROCEDURE ESTAPLE.SP_CORRECT_EVERYTHING(p_account_id varchar2)


 AS

  V_ACCOUNT_ID           NL_ES_POST_CHARGES_LOG.CHILD_ACCOUNT_ID%TYPE;

  V_CUSTOMER_REF       CUSTOVERRIDEPRICE.CUSTOMER_REF@CDR_NZ%TYPE;

  V_PRODUCT_ID           NL_ES_POST_CHARGES_LOG.PRODUCT_ID%TYPE;

  V_OVERRIDE_PRICE_SEQ   NL_ES_POST_CHARGES_LOG.PRODUCT_SEQ%TYPE;

  V_PRODUCT_SEQ          NL_ES_POST_CHARGES_LOG.PRODUCT_SEQ%TYPE;

  V_START_DAT          CUSTOVERRIDEPRICE.START_DAT@CDR_NZ%TYPE;

  V_END_DAT            CUSTOVERRIDEPRICE.END_DAT@CDR_NZ%TYPE;

  V_CORRECT_CHARGE     CUSTOVERRIDEPRICE.ONE_OFF_NUMBER@CDR_NZ%TYPE;

  V_ONE_OFF_NUMBER     CUSTOVERRIDEPRICE.ONE_OFF_NUMBER@CDR_NZ%TYPE;

  CURSOR CUR_GET_ACCOUNTS IS

    SELECT ACCOUNT_ID, CUSTOMER_REF

      FROM   NL_ES_HOME_SYS_ACCOUNT B INNER JOIN ACCOUNT@CDR_NZ A ON A.ACCOUNT_NUM = B.ACCOUNT_ID

    and b.account_id =p_account_id;

          

   


  CURSOR CUR_GET_INCORRECT_CHARGES IS

  

    SELECT PRODUCT_ID,

           OVERRIDE_PRICE_SEQ,

           C.PRODUCT_SEQ,

           START_DAT,

           END_DAT,

           BP.CHARGE,

           ONE_OFF_NUMBER

      FROM CUSTOVERRIDEPRICE@CDR_NZ C INNER JOIN   NL_ES_POST_CHARGES_LOG BP ON C.CUSTOMER_REF = BP.CHILD_ACCOUNT_ID AND BP.PRODUCT_SEQ = C.PRODUCT_SEQ

     WHERE BP.CHARGE <> C.ONE_OFF_NUMBER AND CUSTOMER_REF = V_CUSTOMER_REF AND

           TRUNC(CHARGE_POST_DATE) >= '01-APR-2012'

          

      ;


BEGIN


  FOR REC_GET_ACCOUNTS IN CUR_GET_ACCOUNTS LOOP

    V_ACCOUNT_ID   := REC_GET_ACCOUNTS.ACCOUNT_ID;

    V_CUSTOMER_REF := REC_GET_ACCOUNTS.CUSTOMER_REF;

    FOR REC_GET_INCORRECT_CHARGES IN CUR_GET_INCORRECT_CHARGES LOOP

      V_PRODUCT_ID         := REC_GET_INCORRECT_CHARGES.PRODUCT_ID;

      V_OVERRIDE_PRICE_SEQ := REC_GET_INCORRECT_CHARGES.OVERRIDE_PRICE_SEQ;

      V_PRODUCT_SEQ        := REC_GET_INCORRECT_CHARGES.PRODUCT_SEQ;

      V_START_DAT          := REC_GET_INCORRECT_CHARGES.START_DAT;

      V_END_DAT            := REC_GET_INCORRECT_CHARGES.END_DAT;

      V_CORRECT_CHARGE     := REC_GET_INCORRECT_CHARGES.CHARGE;

      V_ONE_OFF_NUMBER     := REC_GET_INCORRECT_CHARGES.ONE_OFF_NUMBER;

    

      GNVOVERRIDEPRICE.MODIFYFORPRODUCT2NC@CDR_NZ(P_CUSTOMERREF        => V_CUSTOMER_REF,

                                                  P_OVERRIDEPRICESEQ   => V_OVERRIDE_PRICE_SEQ,

                                                  P_PRODUCTSEQ         => V_PRODUCT_SEQ,

                                                  P_NEWSTARTDAT        => V_START_DAT,

                                                  P_NEWENDDAT          => V_END_DAT,

                                                  P_NEWONEOFFMODID     => 1,

                                                  P_NEWONEOFFNUMBER    => V_CORRECT_CHARGE,

                                                  P_OLDONEOFFMODID     => 1,

                                                  P_OLDONEOFFNUMBER    => V_ONE_OFF_NUMBER,

                                                  P_NEWRECURMODID      => NULL,

                                                  P_NEWRECURNUMBER     => NULL,

                                                  P_NEWTERMMODID       => NULL,

                                                  P_NEWTERMNUMBER      => NULL,

                                                  P_NEWSUSPONEMODID    => NULL,

                                                  P_NEWSUSPONENUMBER   => NULL,

                                                  P_NEWSUSPRECURMODID  => NULL,

                                                  P_NEWSUSPRECURNUMBER => NULL,

                                                  P_NEWREACTMODID      => NULL,

                                                  P_NEWREACTNUMBER     => NULL,

                                                  P_NEWNOTES           => NULL,

                                                  P_OLDSTARTDAT        => V_START_DAT,

                                                  P_OLDENDDAT          => V_END_DAT,

                                                  P_OLDRECURMODID      => NULL,

                                                  P_OLDRECURNUMBER     => NULL,

                                                  P_OLDTERMMODID       => NULL,

                                                  P_OLDTERMNUMBER      => NULL,

                                                  P_OLDSUSPONEMODID    => NULL,

                                                  P_OLDSUSPONENUMBER   => NULL,

                                                  P_OLDSUSPRECURMODID  => NULL,

                                                  P_OLDSUSPRECURNUMBER => NULL,

                                                  P_OLDREACTMODID      => NULL,

                                                  P_OLDREACTNUMBER     => NULL,

                                                  P_OLDNOTES           => NULL);

    --update for   NL_ES_hbs_ledger                             

      Pkg_MISC.SP_LEDGER_UPDATE(V_ACCOUNT_ID,(V_CORRECT_CHARGE-V_ONE_OFF_NUMBER)); 

      COMMIT;

    END LOOP;

  END LOOP;


EXCEPTION

  WHEN OTHERS THEN

  

    DBMS_OUTPUT.PUT_LINE('error for child account ' || V_ACCOUNT_ID ||

                         SQLERRM);

  

END;

=========SP.CORRECT_PAYMENTS

CREATE OR REPLACE PROCEDURE ESTAPLE.sp_correct_payments(p_account_id  VARCHAR2,

                                                p_payment_mny IN   NL_es_cdr_bill_invoice.last_payment%TYPE) IS


  CURSOR cur_get_accounts IS

    SELECT customer_ref

      FROM account@cdr_nz

     WHERE account_num = p_account_id;


  v_product_charges_old custoverrideprice.one_off_number@cdr_nz%TYPE;

  v_product_charges_new custoverrideprice.one_off_number@cdr_nz%TYPE;

  v_customer_ref        customer.customer_ref@cdr_nz%TYPE;

  v_override_price_seq  custoverrideprice.override_price_seq@cdr_nz%TYPE;

  v_product_seq         custoverrideprice.product_seq@cdr_nz%TYPE;

  v_end_dat             custoverrideprice.end_dat@cdr_nz%TYPE;

  v_start_dat           custoverrideprice.start_dat@cdr_nz%TYPE;

  v_errmsg              VARCHAR2(3000);

BEGIN


  FOR rec_get_accounts IN cur_get_accounts LOOP

    v_customer_ref := rec_get_accounts.customer_ref;

  

    SELECT one_off_number,

           override_price_seq,

           product_seq,

           start_dat,

           end_dat

      INTO v_product_charges_old,

           v_override_price_seq,

           v_product_seq,

           v_start_dat,

           v_end_dat

      FROM custoverrideprice@cdr_nz

     WHERE customer_ref = v_customer_ref AND

           end_dat = to_date('31-10-2010', 'dd-mm-yyyy') AND

           override_price_seq IN

           (SELECT MAX(product_seq)

              FROM custhasproduct@cdr_nz

             WHERE customer_ref = v_customer_ref AND product_id = 188);

    gnvoverrideprice.modifyforproduct2nc@cdr_nz(p_customerref        => v_customer_ref,

                                                p_overridepriceseq   => v_override_price_seq,

                                                p_productseq         => v_product_seq,

                                                p_newstartdat        => v_start_dat,

                                                p_newenddat          => v_end_dat,

                                                p_newoneoffmodid     => 1,

                                                p_newoneoffnumber    => v_product_charges_old -

                                                                        p_payment_mny,

                                                p_oldoneoffmodid     => 1,

                                                p_oldoneoffnumber    => v_product_charges_old,

                                                p_newrecurmodid      => NULL,

                                                p_newrecurnumber     => NULL,

                                                p_newtermmodid       => NULL,

                                                p_newtermnumber      => NULL,

                                                p_newsusponemodid    => NULL,

                                                p_newsusponenumber   => NULL,

                                                p_newsusprecurmodid  => NULL,

                                                p_newsusprecurnumber => NULL,

                                                p_newreactmodid      => NULL,

                                                p_newreactnumber     => NULL,

                                                p_newnotes           => NULL,

                                                p_oldstartdat        => v_start_dat,

                                                p_oldenddat          => v_end_dat,

                                                p_oldrecurmodid      => NULL,

                                                p_oldrecurnumber     => NULL,

                                                p_oldtermmodid       => NULL,

                                                p_oldtermnumber      => NULL,

                                                p_oldsusponemodid    => NULL,

                                                p_oldsusponenumber   => NULL,

                                                p_oldsusprecurmodid  => NULL,

                                                p_oldsusprecurnumber => NULL,

                                                p_oldreactmodid      => NULL,

                                                p_oldreactnumber     => NULL,

                                                p_oldnotes           => NULL);

    UPDATE   NL_es_post_charges_log

       SET charge = v_product_charges_old - p_payment_mny

     WHERE child_account_id = p_account_id AND product_id = 188 AND

           trunc(charge_post_date) >= '11-dec-2010';

    COMMIT;

  END LOOP;

EXCEPTION

  WHEN no_data_found THEN

    dbms_output.put_line(SQLERRM);

  WHEN OTHERS THEN

    dbms_output.put_line(SQLERRM);

  

END;

========== SP_CREATE_PRODUCT

CREATE OR REPLACE PROCEDURE ESTAPLE.sp_create_product(p_customer_ref    IN VARCHAR2,

                                              p_account_id      IN VARCHAR2,

                                              p_product_charges IN NUMBER,

                                              p_product_id      IN NUMBER,

                                              p_invoive_seq_no  IN NUMBER,

                                              p_start_date      DATE,

                                              p_end_date        DATE)


 AS

  CURSOR cur_product_attributes IS

    SELECT pa.product_attribute_subid

      FROM productattribute@cdr_nz pa

     WHERE pa.product_id = p_product_id;

  v_tariff_id         tariff.tariff_id@cdr_nz%TYPE;

  v_cps_id            cpsproducttax.cps_id@cdr_nz%TYPE;

  v_attribute_subid   productattribute.product_attribute_subid@cdr_nz%TYPE;

  v_product_seq       custhasproduct.product_seq@cdr_nz%TYPE;

  v_override_priceseq custoverrideprice.override_price_seq@cdr_nz%TYPE;

  v_product_attribute custproductattrdetails.attribute_value@cdr_nz%TYPE;

  v_parent_account_id   NL_es_account.account_id%TYPE;

  v_hbs_id              NL_es_home_sys_account.home_sys_account_id%TYPE;

  v_invoice_seq_no      NL_es_home_sys_account.invoice_seq_no%TYPE;


BEGIN


  SELECT t.tariff_id

    INTO v_tariff_id

    FROM tariff@cdr_nz t

   WHERE t.tariff_name = pkg_es.tariff_name AND

         t.catalogue_change_id =

         (SELECT catalogue_change_id

            FROM cataloguechange@cdr_nz

           WHERE catalogue_status = pkg_es.catalogue_status_live);

  SELECT cpt.cps_id

    INTO v_cps_id

    FROM cpsproducttax@cdr_nz cpt

   WHERE cpt.product_id = p_product_id;


  --Stored procedure for creating a product instance for customer ref,account id, product id combination

  --for a period specified by p_startdtm,p_termdtm(output : product seq)


  gnvcustproduct.createcustproduct7nc@cdr_nz(p_customerref            => p_customer_ref,

                                             p_productid              => p_product_id,

                                             p_startdtm               => p_start_date,

                                             p_termdtm                => NULL,

                                             p_parentproductseq       => NULL,

                                             p_packageseq             => NULL,

                                             p_productpackageinstance => NULL,

                                             p_accountnum             => p_account_id,

                                             p_budgetcentreseq        => NULL,

                                             p_tariffid               => v_tariff_id,

                                             p_competitortariffid     => NULL,

                                             p_productlabel           => NULL,

                                             p_productquantity        => pkg_es.product_quantity,

                                             p_custordernum           => NULL,

                                             p_supplierordernum       => NULL,

                                             p_custproductcontactseq  => NULL,

                                             p_contractedpos          => v_cps_id,

                                             p_cpstaxexemptref        => NULL,

                                             p_cpstaxexempttxt        => NULL,

                                             p_contractseq            => NULL,

                                             p_additions_quantity     => NULL,

                                             p_terminations_quantity  => NULL,

                                             p_productstatus          => pkg_es.product_status,

                                             p_statusreasontxt        => NULL,

                                             p_subscription_ref       => NULL,

                                             p_productoptionalboo     => pkg_es.product_optional_boo,

                                             p_productseq             => v_product_seq);


  --Stored procedure for overriding prices (periodic price) for the customer product instance(output: p_overridepriceseq)


  gnvoverrideprice.addtoproduct2nc@cdr_nz(p_customerref      => p_customer_ref,

                                          p_productseq       => v_product_seq,

                                          p_startdat         => p_start_date,

                                          p_enddat           => nvl(p_end_date,

                                                                    last_day(p_start_date)),

                                          p_oneoffmodid      => pkg_es.recurring_mod_type_id,

                                          p_oneoffnumber     => p_product_charges,

                                          p_recurmodid       => NULL,

                                          p_recurnumber      => NULL,

                                          p_termmodid        => NULL,

                                          p_termnumber       => NULL,

                                          p_susponemodid     => NULL,

                                          p_susponenumber    => NULL,

                                          p_susprecurmodid   => NULL,

                                          p_susprecurnumber  => NULL,

                                          p_reactmodid       => NULL,

                                          p_reactnumber      => NULL,

                                          p_notes            => NULL,

                                          p_overridepriceseq => v_override_priceseq);


  --Stored procedure for modifying the attribute value of the customer product instance

  --The attribute is Charge_desc (contains the name of the product of HBS accounts)                                                                 

  FOR rec_product_attributes IN cur_product_attributes LOOP

  

    v_attribute_subid := rec_product_attributes.product_attribute_subid;

    SELECT home_sys_account_id

      INTO v_product_attribute

      FROM   NL_es_home_sys_account bh

     WHERE bh.account_id = p_account_id;

    --v_product_attribute := 'id7612332917' || ' ' || v_product_attribute;

    IF (v_attribute_subid = 1) THEN

      gnvproductattributes.modifycustprodattr3nc@cdr_nz(customerref    => p_customer_ref,

                                                        productseq     => v_product_seq,

                                                        attributesubid => v_attribute_subid,

                                                        changefromdate => p_start_date,

                                                        changeuptodate => NULL,

                                                        oldvalue       => NULL,

                                                        newvalue       => v_product_attribute);

    ELSIF (v_attribute_subid = 2) THEN

    

      v_product_attribute := 1;

    

      gnvproductattributes.modifycustprodattr3nc@cdr_nz(customerref    => p_customer_ref,

                                                        productseq     => v_product_seq,

                                                        attributesubid => v_attribute_subid,

                                                        changefromdate => p_start_date,

                                                        changeuptodate => NULL,

                                                        oldvalue       => NULL,

                                                        newvalue       => v_product_attribute);

    

    END IF;

  END LOOP;


  SELECT parent_account_id, invoice_seq_no, home_sys_account_id

    INTO v_parent_account_id, v_invoice_seq_no, v_hbs_id

    FROM   NL_es_home_sys_account bh

   WHERE bh.account_id = p_account_id;

  --added for parallel posting  

  IF p_invoive_seq_no IS NOT NULL THEN

    v_invoice_seq_no := p_invoive_seq_no;

  END IF;


  --Stored procedure for redirecting the charges from child account to ES parent account  

  gnvproductcharging.modifycustprodchrg1nc@cdr_nz(customerref        => p_customer_ref,

                                                  productseq         => v_product_seq,

                                                  oldstartdate       => p_start_date,

                                                  oldenddate         => NULL,

                                                  oldaccountnum      => p_account_id,

                                                  oldbudgetcentreseq => NULL,

                                                  oldchrgtype        => pkg_es.charge_type,

                                                  oldpercentage      => pkg_es.charge_percentage,

                                                  newstartdate       => p_start_date,

                                                  newenddate         => NULL,

                                                  newaccountnum      => v_parent_account_id,

                                                  newbudgetcentreseq => NULL,

                                                  newchrgtype        => pkg_es.charge_type,

                                                  newpercentage      => pkg_es.charge_percentage);


  pkg_es_post_charges_del.sp_log_charges_posted(p_account_id,

                                                v_invoice_seq_no,

                                                p_product_id,

                                                v_product_seq,

                                                p_product_charges,

                                                v_hbs_id,

                                                v_parent_account_id);

    --update for   NL_ES_hbs_ledger                             

      Pkg_MISC.SP_LEDGER_UPDATE(p_account_id,p_product_charges);                                              


END;

==========SP_CREATE_PRODUCT_ACCOUNTWISE

CREATE OR REPLACE PROCEDURE ESTAPLE.sp_create_product_accountwise(p_customer_ref    IN VARCHAR2,

                                              p_account_id      IN VARCHAR2,

                                              p_product_charges IN NUMBER,

                                              p_product_id      IN NUMBER,

                                              p_invoive_seq_no  IN NUMBER,

                                              p_start_date      DATE,

                                              p_end_date        DATE)


 AS

  CURSOR cur_product_attributes IS

    SELECT pa.product_attribute_subid

      FROM productattribute@cdr_nz pa

     WHERE pa.product_id = p_product_id;

  v_tariff_id         tariff.tariff_id@cdr_nz%TYPE;

  v_cps_id            cpsproducttax.cps_id@cdr_nz%TYPE;

  v_attribute_subid   productattribute.product_attribute_subid@cdr_nz%TYPE;

  v_product_seq       custhasproduct.product_seq@cdr_nz%TYPE;

  v_override_priceseq custoverrideprice.override_price_seq@cdr_nz%TYPE;

  v_product_attribute custproductattrdetails.attribute_value@cdr_nz%TYPE;

  v_parent_account_id   NL_es_account.account_id%TYPE;

  v_hbs_id              NL_es_home_sys_account.home_sys_account_id%TYPE;

  v_invoice_seq_no      NL_es_home_sys_account.invoice_seq_no%TYPE;


BEGIN


  SELECT t.tariff_id

    INTO v_tariff_id

    FROM tariff@cdr_nz t

   WHERE t.tariff_name = pkg_es.tariff_name AND

         t.catalogue_change_id =

         (SELECT catalogue_change_id

            FROM cataloguechange@cdr_nz

           WHERE catalogue_status = pkg_es.catalogue_status_live);

  SELECT cpt.cps_id

    INTO v_cps_id

    FROM cpsproducttax@cdr_nz cpt

   WHERE cpt.product_id = p_product_id;


  --Stored procedure for creating a product instance for customer ref,account id, product id combination

  --for a period specified by p_startdtm,p_termdtm(output : product seq)


  gnvcustproduct.createcustproduct7nc@cdr_nz(p_customerref            => p_customer_ref,

                                             p_productid              => p_product_id,

                                             p_startdtm               => p_start_date,

                                             p_termdtm                => NULL,

                                             p_parentproductseq       => NULL,

                                             p_packageseq             => NULL,

                                             p_productpackageinstance => NULL,

                                             p_accountnum             => p_account_id,

                                             p_budgetcentreseq        => NULL,

                                             p_tariffid               => v_tariff_id,

                                             p_competitortariffid     => NULL,

                                             p_productlabel           => NULL,

                                             p_productquantity        => pkg_es.product_quantity,

                                             p_custordernum           => NULL,

                                             p_supplierordernum       => NULL,

                                             p_custproductcontactseq  => NULL,

                                             p_contractedpos          => v_cps_id,

                                             p_cpstaxexemptref        => NULL,

                                             p_cpstaxexempttxt        => NULL,

                                             p_contractseq            => NULL,

                                             p_additions_quantity     => NULL,

                                             p_terminations_quantity  => NULL,

                                             p_productstatus          => pkg_es.product_status,

                                             p_statusreasontxt        => NULL,

                                             p_subscription_ref       => NULL,

                                             p_productoptionalboo     => pkg_es.product_optional_boo,

                                             p_productseq             => v_product_seq);


  --Stored procedure for overriding prices (periodic price) for the customer product instance(output: p_overridepriceseq)


  gnvoverrideprice.addtoproduct2nc@cdr_nz(p_customerref      => p_customer_ref,

                                          p_productseq       => v_product_seq,

                                          p_startdat         => p_start_date,

                                          p_enddat           => nvl(p_end_date,

                                                                    last_day(p_start_date)),

                                          p_oneoffmodid      => pkg_es.recurring_mod_type_id,

                                          p_oneoffnumber     => p_product_charges,

                                          p_recurmodid       => NULL,

                                          p_recurnumber      => NULL,

                                          p_termmodid        => NULL,

                                          p_termnumber       => NULL,

                                          p_susponemodid     => NULL,

                                          p_susponenumber    => NULL,

                                          p_susprecurmodid   => NULL,

                                          p_susprecurnumber  => NULL,

                                          p_reactmodid       => NULL,

                                          p_reactnumber      => NULL,

                                          p_notes            => NULL,

                                          p_overridepriceseq => v_override_priceseq);


  --Stored procedure for modifying the attribute value of the customer product instance

  --The attribute is Charge_desc (contains the name of the product of HBS accounts)                                                                 

  FOR rec_product_attributes IN cur_product_attributes LOOP

  

    v_attribute_subid := rec_product_attributes.product_attribute_subid;

    SELECT home_sys_account_id

      INTO v_product_attribute

      FROM   NL_es_home_sys_account bh

     WHERE bh.account_id = p_account_id;

    --v_product_attribute := 'id7612332917' || ' ' || v_product_attribute;

    IF (v_attribute_subid = 1) THEN

      gnvproductattributes.modifycustprodattr3nc@cdr_nz(customerref    => p_customer_ref,

                                                        productseq     => v_product_seq,

                                                        attributesubid => v_attribute_subid,

                                                        changefromdate => p_start_date,

                                                        changeuptodate => NULL,

                                                        oldvalue       => NULL,

                                                        newvalue       => v_product_attribute);

    ELSIF (v_attribute_subid = 2) THEN

    

      v_product_attribute := 1;

    

      gnvproductattributes.modifycustprodattr3nc@cdr_nz(customerref    => p_customer_ref,

                                                        productseq     => v_product_seq,

                                                        attributesubid => v_attribute_subid,

                                                        changefromdate => p_start_date,

                                                        changeuptodate => NULL,

                                                        oldvalue       => NULL,

                                                        newvalue       => v_product_attribute);

    

    END IF;

  END LOOP;

====================

SELECT parent_account_id, invoice_seq_no, home_sys_account_id

    INTO v_parent_account_id, v_invoice_seq_no, v_hbs_id

    FROM   NL_es_home_sys_account bh

   WHERE bh.account_id = p_account_id;

  --added for parallel posting  

  IF p_invoive_seq_no IS NOT NULL THEN

    v_invoice_seq_no := p_invoive_seq_no;

  END IF;


  --Stored procedure for redirecting the charges from child account to ES parent account  

  gnvproductcharging.modifycustprodchrg1nc@cdr_nz(customerref        => p_customer_ref,

                                                  productseq         => v_product_seq,

                                                  oldstartdate       => p_start_date,

                                                  oldenddate         => NULL,

                                                  oldaccountnum      => p_account_id,

                                                  oldbudgetcentreseq => NULL,

                                                  oldchrgtype        => pkg_es.charge_type,

                                                  oldpercentage      => pkg_es.charge_percentage,

                                                  newstartdate       => p_start_date,

                                                  newenddate         => NULL,

                                                  newaccountnum      => v_parent_account_id,

                                                  newbudgetcentreseq => NULL,

                                                  newchrgtype        => pkg_es.charge_type,

                                                  newpercentage      => pkg_es.charge_percentage);


  pkg_es_post_charges_del.sp_log_charges_posted(p_account_id,

                                                v_invoice_seq_no,

                                                p_product_id,

                                                v_product_seq,

                                                p_product_charges,

                                                v_hbs_id,

                                                v_parent_account_id);

    --update for   NL_ES_hbs_ledger                             

      Pkg_MISC.SP_LEDGER_UPDATE(p_account_id,p_product_charges);                                              


END;

======== SP_CREATE_PRODUCT_INSTANCE

CREATE OR REPLACE PROCEDURE ESTAPLE.SP_CREATE_PRODUCT_INSTANCE(P_CUSTOMER_REF       IN CUSTOMER.CUSTOMER_REF@CDR_NZ%TYPE,

                                                       P_ACCOUNT_ID         IN   NL_ES_HOME_SYS_ACCOUNT.ACCOUNT_ID%TYPE,

                                                       P_PRODUCT_ID         IN PRODUCT.PRODUCT_ID@CDR_NZ%TYPE,

                                                       P_PRODUCT_START_DATE IN DATE,

                                                       P_PRODUCT_END_DATE   IN DATE,

                                                       P_TARIFF_ID          IN TARIFF.TARIFF_ID@CDR_NZ%TYPE,

                                                       P_PRODUCT_CHARGES    IN   NL_ES_CDR_BILL_INVOICE.CHARGES%TYPE,

                                                       P_PRODUCT_ATTRIBUTE  IN CUSTPRODUCTATTRDETAILS.ATTRIBUTE_VALUE@CDR_NZ%TYPE,

                                                       P_INVOICE_SEQ_NO     IN   NL_ES_CDR_BILL_INVOICE.INVOICE_SEQ_NO%TYPE,

                                                       --                         p_invoice_ref_no     IN   NL_es_gsm_bill_inv_det.invoice_ref_no%TYPE,

                                                       --                         p_invoice_ref_resets IN   NL_es_gsm_bill_inv_det.invoice_ref_resets%TYPE,

                                                       P_PARENT_ACCOUNT_ID IN   NL_ES_ACCOUNT.ACCOUNT_ID%TYPE,

                                                       

                                                       -- Purpose : Creates a product instance for the account id, customer ref,product id for a specified period,

                                                       --           overrides the price of this product for this period,

                                                       --           redirects the charges of this product instance to the parent account id

                                                       --           and records the posting information in ES schema(  NL_es_post_charges)

                                                       

                                                       P_LINE_OF_BUSINESS NUMBER) AS

  --Local variables

  V_CPS_ID            CPSPRODUCTTAX.CPS_ID@CDR_NZ%TYPE;

  V_ATTRIBUTE_SUBID   PRODUCTATTRIBUTE.PRODUCT_ATTRIBUTE_SUBID@CDR_NZ%TYPE;

  V_PRODUCT_SEQ       CUSTHASPRODUCT.PRODUCT_SEQ@CDR_NZ%TYPE;

  V_OVERRIDE_PRICESEQ CUSTOVERRIDEPRICE.OVERRIDE_PRICE_SEQ@CDR_NZ%TYPE;

  V_PRODUCT_ATTRIBUTE CUSTPRODUCTATTRDETAILS.ATTRIBUTE_VALUE@CDR_NZ%TYPE;


  CURSOR CUR_PRODUCT_ATTRIBUTES IS

    SELECT PA.PRODUCT_ATTRIBUTE_SUBID

      FROM PRODUCTATTRIBUTE@CDR_NZ PA

     WHERE PA.PRODUCT_ID = P_PRODUCT_ID;


BEGIN


  SELECT CPT.CPS_ID

    INTO V_CPS_ID

    FROM CPSPRODUCTTAX@CDR_NZ CPT

   WHERE CPT.PRODUCT_ID = P_PRODUCT_ID;


  --Stored procedure for creating a product instance for customer ref,account id, product id combination

  --for a period specified by p_startdtm,p_termdtm(output : product seq)


  GNVCUSTPRODUCT.CREATECUSTPRODUCT7NC@CDR_NZ(P_CUSTOMERREF            => P_CUSTOMER_REF,

                                             P_PRODUCTID              => P_PRODUCT_ID,

                                             P_STARTDTM               => P_PRODUCT_START_DATE,

                                             P_TERMDTM                => NULL,

                                             P_PARENTPRODUCTSEQ       => NULL,

                                             P_PACKAGESEQ             => NULL,

                                             P_PRODUCTPACKAGEINSTANCE => NULL,

                                             P_ACCOUNTNUM             => P_ACCOUNT_ID,

                                             P_BUDGETCENTRESEQ        => NULL,

                                             P_TARIFFID               => P_TARIFF_ID,

                                             P_COMPETITORTARIFFID     => NULL,

                                             P_PRODUCTLABEL           => NULL,

                                             P_PRODUCTQUANTITY        => PKG_ES.PRODUCT_QUANTITY,

                                             P_CUSTORDERNUM           => NULL,

                                             P_SUPPLIERORDERNUM       => NULL,

                                             P_CUSTPRODUCTCONTACTSEQ  => NULL,

                                             P_CONTRACTEDPOS          => V_CPS_ID,

                                             P_CPSTAXEXEMPTREF        => NULL,

                                             P_CPSTAXEXEMPTTXT        => NULL,

                                             P_CONTRACTSEQ            => NULL,

                                             P_ADDITIONS_QUANTITY     => NULL,

                                             P_TERMINATIONS_QUANTITY  => NULL,

                                             P_PRODUCTSTATUS          => PKG_ES.PRODUCT_STATUS,

                                             P_STATUSREASONTXT        => NULL,

                                             P_SUBSCRIPTION_REF       => NULL,

                                             P_PRODUCTOPTIONALBOO     => PKG_ES.PRODUCT_OPTIONAL_BOO,

                                             P_PRODUCTSEQ             => V_PRODUCT_SEQ);


  --Stored procedure for overriding prices (periodic price) for the customer product instance(output: p_overridepriceseq)


  GNVOVERRIDEPRICE.ADDTOPRODUCT2NC@CDR_NZ(P_CUSTOMERREF      => P_CUSTOMER_REF,

                                          P_PRODUCTSEQ       => V_PRODUCT_SEQ,

                                          P_STARTDAT         => P_PRODUCT_START_DATE,

                                          P_ENDDAT           => P_PRODUCT_END_DATE,

                                          P_ONEOFFMODID      => PKG_ES.RECURRING_MOD_TYPE_ID,

                                          P_ONEOFFNUMBER     => P_PRODUCT_CHARGES,

                                          P_RECURMODID       => NULL,

                                          P_RECURNUMBER      => NULL,

                                          P_TERMMODID        => NULL,

                                          P_TERMNUMBER       => NULL,

                                          P_SUSPONEMODID     => NULL,

                                          P_SUSPONENUMBER    => NULL,

                                          P_SUSPRECURMODID   => NULL,

                                          P_SUSPRECURNUMBER  => NULL,

                                          P_REACTMODID       => NULL,

                                          P_REACTNUMBER      => NULL,

                                          P_NOTES            => NULL,

                                          P_OVERRIDEPRICESEQ => V_OVERRIDE_PRICESEQ);


  --Stored procedure for modifying the attribute value of the customer product instance

  --The attribute is Charge_desc (contains the name of the product of HBS accounts)                                                                 

  FOR REC_PRODUCT_ATTRIBUTES IN CUR_PRODUCT_ATTRIBUTES LOOP

  

    V_ATTRIBUTE_SUBID := REC_PRODUCT_ATTRIBUTES.PRODUCT_ATTRIBUTE_SUBID;

    IF (V_ATTRIBUTE_SUBID = 1) THEN

      GNVPRODUCTATTRIBUTES.MODIFYCUSTPRODATTR3NC@CDR_NZ(CUSTOMERREF    => P_CUSTOMER_REF,

                                                        PRODUCTSEQ     => V_OVERRIDE_PRICESEQ,

                                                        ATTRIBUTESUBID => V_ATTRIBUTE_SUBID,

                                                        CHANGEFROMDATE => P_PRODUCT_START_DATE,

                                                        CHANGEUPTODATE => NULL,

                                                        OLDVALUE       => NULL,

                                                        NEWVALUE       => P_PRODUCT_ATTRIBUTE);

    ELSIF (V_ATTRIBUTE_SUBID = 2) THEN

      V_PRODUCT_ATTRIBUTE := P_LINE_OF_BUSINESS;

      GNVPRODUCTATTRIBUTES.MODIFYCUSTPRODATTR3NC@CDR_NZ(CUSTOMERREF    => P_CUSTOMER_REF,

                                                        PRODUCTSEQ     => V_OVERRIDE_PRICESEQ,

                                                        ATTRIBUTESUBID => V_ATTRIBUTE_SUBID,

                                                        CHANGEFROMDATE => P_PRODUCT_START_DATE,

                                                        CHANGEUPTODATE => NULL,

                                                        OLDVALUE       => NULL,

                                                        NEWVALUE       => V_PRODUCT_ATTRIBUTE);

    END IF;

  END LOOP;


  -- Log the charges posted in ES database  

  /*sp_log_charges_posted(p_account_id,

                          p_invoice_seq_no,

                          p_product_id,

                          v_product_seq,

                          p_product_charges,

                          p_product_attribute,

                          --              p_invoice_ref_no, --------- NotRequiredInMigration

                          --              p_invoice_ref_resets, --------- NotRequiredInMigration

                          p_parent_account_id);

  */

  --Stored procedure for redirecting the charges from child account to ES parent account  

  GNVPRODUCTCHARGING.MODIFYCUSTPRODCHRG1NC@CDR_NZ(CUSTOMERREF        => P_CUSTOMER_REF,

                                                  PRODUCTSEQ         => V_PRODUCT_SEQ,

                                                  OLDSTARTDATE       => P_PRODUCT_START_DATE,

                                                  OLDENDDATE         => NULL,

                                                  OLDACCOUNTNUM      => P_ACCOUNT_ID,

                                                  OLDBUDGETCENTRESEQ => NULL,

                                                  OLDCHRGTYPE        => PKG_ES.CHARGE_TYPE,

                                                  OLDPERCENTAGE      => PKG_ES.CHARGE_PERCENTAGE,

                                                  NEWSTARTDATE       => P_PRODUCT_START_DATE,

                                                  NEWENDDATE         => NULL,

                                                  NEWACCOUNTNUM      => P_PARENT_ACCOUNT_ID,

                                                  NEWBUDGETCENTRESEQ => NULL,

                                                  NEWCHRGTYPE        => PKG_ES.CHARGE_TYPE,

                                                  NEWPERCENTAGE      => PKG_ES.CHARGE_PERCENTAGE);


EXCEPTION

  WHEN NO_DATA_FOUND THEN

    RAISE NO_DATA_FOUND;

  WHEN TOO_MANY_ROWS THEN

    RAISE TOO_MANY_ROWS;

  WHEN DUP_VAL_ON_INDEX THEN

    RAISE DUP_VAL_ON_INDEX;

  WHEN OTHERS THEN

    RAISE;

END SP_CREATE_PRODUCT_INSTANCE;

========== SP_DEL_ACCTS

CREATE OR REPLACE PROCEDURE ESTAPLE.sp_del_accts(p_parent_id IN VARCHAR2,

                                         p_ssa       IN VARCHAR) IS


  v_account_id VARCHAR2(20);


  CURSOR cur_get_accounts IS

    SELECT b.account_id

      FROM   NL_es_home_sys_account b

     WHERE b.parent_account_id = p_parent_id AND b.ssa = p_ssa;


BEGIN

  FOR get_accounts IN cur_get_accounts LOOP

    v_account_id := get_accounts.account_id;

  

    DELETE FROM   NL_es_cust_acq_response ca

     WHERE ca.es_child_account_id = v_account_id AND

           ca.es_account_id = p_parent_id;

  

    DELETE FROM   NL_es_cdr_services bs WHERE bs.account_id = v_account_id;

  

    DELETE FROM   NL_es_account ba

     WHERE ba.account_id = p_parent_id AND ba.ssa = p_ssa;

  

    DELETE FROM   NL_es_home_sys_account b

     WHERE b.parent_account_id = p_parent_id AND b.ssa = p_ssa;

    COMMIT;

  

  END LOOP;

END sp_del_accts;

==========SP_DETECT_MISMATCH

CREATE OR REPLACE PROCEDURE ESTAPLE.sp_detect_mismatch(p_parent_account_id VARCHAR2) AS


  v_account_id            NL_es_home_sys_account.account_id%TYPE;

  v_home_sys_account_id   NL_es_home_sys_account.home_sys_account_id%TYPE;

  v_invoice_seq_no        NL_es_home_sys_account.invoice_seq_no%TYPE;

  v_posted              NUMBER;

  v_irb_net             NUMBER;

  v_flag                NUMBER := 0;

  CURSOR cur_get_child IS

    SELECT account_id, home_sys_account_id, invoice_seq_no

      FROM   NL_es_home_sys_account

     WHERE parent_account_id = p_parent_account_id;


BEGIN


  FOR rec_get_child IN cur_get_child LOOP

    v_account_id          := rec_get_child.account_id;

    v_home_sys_account_id := rec_get_child.home_sys_account_id;

    v_invoice_seq_no      := rec_get_child.invoice_seq_no;

  

    SELECT SUM(charge)

      INTO v_posted

      FROM   NL_es_post_charges_log bp

     WHERE bp.child_account_id = v_account_id AND

           product_id NOT IN (188, 190) AND

           invoice_seq_no = v_invoice_seq_no;

  

    SELECT invoice_net_mny + invoice_tax_mny

      INTO v_irb_net

      FROM billsummary@cdr_nz

     WHERE account_num = v_home_sys_account_id AND

           bill_seq = v_invoice_seq_no;

  

    IF (v_posted <> v_irb_net) THEN

      dbms_output.put_line('mismatch for hbs ' || v_home_sys_account_id ||

                           ' child_account_id' || v_account_id || '   ' ||

                           ' posted ' || '   ' || v_posted || ' in irb ' ||

                           v_irb_net);

      v_flag := 1;

    

    END IF;

  END LOOP;

  IF (v_flag = 0) THEN

    dbms_output.put_line('success');

  END IF;

END;

==========SP_DISCOUNT_REPORT

create or replace procedure estaple.sp_discount_report(p_ssa varchar2)


as

v_parent_account_id varchar2(200);

v_account_id varchar2(200);

v_home_sys_account_id varchar2(200);

v_is_active varchar2(200);

v_remarks varchar2(200);

v_balance_out number;

v_payment number;

v_name varchar2(1000);

v_charges number;

v_discount number; 

v_bill_cycle_date date;

v_actual_bill_dtm date ;

v_payment_due_dat date;


cursor cur_get_accounts 

is

select account_id,s.bill_cycle_date

from   NL_es_account b

inner join   NL_es_discount s on s.es_account_id=b.account_id

and ssa=p_ssa

and is_split=1;



cursor cur_get_child_accounts is 

select h.account_id,home_sys_account_id,is_active,remarks

from   NL_es_home_sys_account h where h.parent_account_id=v_parent_account_id;



begin 


for rec_get_accounts in cur_get_accounts loop


v_parent_account_id := rec_get_accounts.account_id;

v_bill_cycle_date := rec_get_accounts.bill_cycle_date;


select balance_out_mny/1000,actual_bill_dtm , payment_due_dat

into v_balance_out,v_actual_bill_dtm ,v_payment_due_dat

from billsummary@cdr_nz where 

account_num=v_parent_account_id

and bill_dtm=v_bill_cycle_date and bill_status=1;


select sum(account_payment_mny)/1000

into v_payment

 from accountpayment@cdr_nz ap

 where account_num=v_parent_account_id and

account_payment_dat between v_actual_bill_dtm and v_payment_due_dat

and ap.account_num=v_parent_account_id and failed_dtm is null


;


for rec_get_child_accounts in cur_get_child_accounts loop


v_account_id:=rec_get_child_accounts.account_id;

v_home_sys_account_id :=rec_get_child_accounts.home_sys_account_id;

v_is_active :=rec_get_child_accounts.is_active;

v_remarks :=rec_get_child_accounts.remarks;


select first_name ||' '||last_name 

into v_name 

from contact@cdr_nz c where customer_ref=v_home_sys_account_id

and contact_type_id=1000002;


select sum(discount_amount/1000)

into v_discount

from   NL_es_discount_split d where d.account_id=v_account_id

and discount_app_date=v_bill_cycle_date

and logged_date<'24-may-2012';



select sum(charges/1000)

into v_charges

from   NL_es_cdr_bill_invoice bc  inner join   NL_es_home_sys_account bh

on bh.account_id=bc.account_id and 

bc.account_id=v_account_id

and bc.bill_cycle_date=v_bill_cycle_date;


INSERT INTO oper_discount_details

  (home_sys_account_id,

   parent_id,

   bill_cycle_date,

   invoice_net_hbs,

   parent_bill,

   act_pmt_mny,

   discount,

   hbs_name,

   remark)

VALUES

  (v_home_sys_account_id,

   v_parent_account_id,

   v_bill_cycle_date,

   v_charges,

   v_balance_out,

   v_payment,

   v_discount,

   v_name,

   v_remarks);

COMMIT;

end loop;

end loop;


end;

==========SP_DROP_JOBS

create or replace procedure estaple.sp_drop_jobs

is

cursor cur_get_jobs 

is

select b.job_name

from user_scheduler_jobs b ;


v_job_name varchar2(30);


begin 


for rec_get_jobs in cur_get_jobs loop


v_job_name := rec_get_jobs.job_name;

dbms_scheduler.drop_job(job_name => v_job_name);

dbms_output.put_line(v_job_name||' dropped' );

end loop;


end;

==========SP_ES_DISCOUNT

CREATE OR REPLACE PROCEDURE ESTAPLE.sp_es_discount(p_bill_cycle_date DATE) IS


  v_es_account_id         NL_es_discount.es_account_id%TYPE;

  v_discount_id         NL_es_discount.discount_id%TYPE;

  v_discount_amount     NL_es_discount.discount_amount%TYPE;

  v_total_charges       NL_es_discount.total_charges%TYPE;

  v_payment_due_date  DATE;

  v_total_outstanding NUMBER(18);

  v_actual_bill_dtm   DATE;

  v_new_payment       NUMBER(18);

  V_NET_PAY             number(18);

  

  CURSOR cur_get_accounts IS

    SELECT bd.es_account_id,

           bd.discount_id,

           bd.discount_amount,

           bd.total_charges

      FROM   NL_es_discount bd

     WHERE bd.is_split = 0 AND 

     

     bd.bill_cycle_date = p_bill_cycle_date;


BEGIN


  FOR rec_get_accounts IN cur_get_accounts LOOP

  

    v_es_account_id     := rec_get_accounts.es_account_id;

    v_discount_id     := rec_get_accounts.discount_id;

    v_discount_amount := rec_get_accounts.discount_amount;

    v_total_charges   := rec_get_accounts.total_charges;

  

    SELECT payment_due_dat, balance_out_mny, actual_bill_dtm

      INTO v_payment_due_date, v_total_outstanding, v_actual_bill_dtm

      FROM billsummary@cdr_nz

     WHERE account_num = v_es_account_id AND

           bill_dtm = p_bill_cycle_date AND bill_status = 1;

  

    BEGIN

    

      SELECT nvl(SUM(account_payment_mny), 0)

        INTO v_new_payment

        FROM accountpayment@cdr_nz a

       WHERE a.account_num = v_es_account_id AND

             created_dtm >= v_actual_bill_dtm AND

             account_payment_dat <= v_payment_due_date AND

             account_payment_status = 1 AND deposit_boo = 'F';

    

    EXCEPTION

      WHEN no_data_found THEN

        NULL;

    END;

 

   V_NET_PAY := (V_TOTAL_OUTSTANDING - V_NEW_PAYMENT);

IF (V_NET_PAY <= 999) THEN

          sp_es_discount_split(v_es_account_id,p_bill_cycle_date );

 

          UPDATE   NL_ES_DISCOUNT

               SET IS_SPLIT = 1

             WHERE ES_ACCOUNT_ID = v_es_account_id AND

                   BILL_CYCLE_DATE = p_bill_cycle_date; 

 

 end if;

  

 end lOOP;


    


  

  END;

==========SP_ES_DISCOUNT_SPLIT

CREATE OR REPLACE PROCEDURE ESTAPLE.sp_es_discount_split (P_PARENT_ACCOUNT_ID IN VARCHAR2,p_bill_cycle_date date)

 IS


  -- cursor that retreives all the ES accounts.

  CURSOR cur_es_child_accounts IS

    SELECT parent_account_id,

           account_id,

           home_sys_account_id,

           invoice_seq_no,

           line_of_business,

           parent_account_id

      FROM   NL_es_home_sys_account

     WHERE parent_account_id =P_PARENT_ACCOUNT_ID

            AND is_active <> 5;


  v_parent_account_id     NL_es_home_sys_account.parent_account_id%TYPE;

  v_child_account_id      NL_es_home_sys_account.account_id%TYPE;

  v_home_sys_account_id   NL_es_home_sys_account.home_sys_account_id%TYPE;

  v_invoice_seq_no        NL_es_home_sys_account.invoice_seq_no%TYPE;

  v_line_of_business      NL_es_home_sys_account.line_of_business%TYPE;


  CURSOR cur_discount_details IS

    SELECT total_charges, discount_id, bill_cycle_date, discount_amount

      FROM   NL_es_discount

     WHERE es_account_id = v_parent_account_id AND is_split = 0 AND

           bill_cycle_date =p_bill_cycle_date;


  v_total_charges    NL_es_discount.total_charges%TYPE;

  v_discount_id      NL_es_discount.discount_id%TYPE;

  v_bill_date        NL_es_discount.bill_cycle_date%TYPE;

  v_total_discount   NL_es_discount.discount_amount%TYPE;


  v_cdr_charges   NL_es_cdr_bill_invoice.charges%TYPE;


  v_cdr_discount   NL_es_discount_split.discount_amount%TYPE;


  v_date    DATE;

  v_errmsg  VARCHAR2(500);

  v_errcode NUMBER(6);


BEGIN


  SELECT SYSDATE INTO v_date FROM dual;


  --opening of the cursor cur_es_child_accounts.

  OPEN cur_es_child_accounts;

  LOOP

    FETCH cur_es_child_accounts

      INTO v_parent_account_id, v_child_account_id, v_home_sys_account_id, v_invoice_seq_no, v_line_of_business, v_parent_account_id;

    EXIT WHEN cur_es_child_accounts%NOTFOUND;

  

    OPEN cur_discount_details;

    LOOP

      FETCH cur_discount_details

        INTO v_total_charges, v_discount_id, v_bill_date, v_total_discount;

      EXIT WHEN cur_discount_details%NOTFOUND;

    

      v_cdr_discount := 0;

    

      BEGIN

        SELECT nvl(sum(charges - adjustment),0) -- selects the charges of an invoice of the CDR child account.

          INTO v_cdr_charges

          FROM   NL_es_cdr_bill_invoice

         WHERE account_id = v_child_account_id AND

               bill_cycle_date = v_bill_date;

      

        v_cdr_discount := (v_cdr_charges * v_total_discount) /

                          v_total_charges;

      

        -- inserting the calculated discount amount of a child account(CDR) into   NL_es_discount_split

      

        INSERT INTO   NL_es_discount_split

          (account_id,

           home_sys_account_id,

           line_of_business,

           discount_date,

           discount_id,

           es_account_id,

           discount_amount,

           disc_post_date,

           discount_app_date,

           logged_date)

        VALUES

          (v_child_account_id,

           v_home_sys_account_id,

           v_line_of_business,

           v_date,

           v_discount_id,

           v_parent_account_id,

           v_cdr_discount,

           NULL,

           v_bill_date,

           SYSDATE);

      

      EXCEPTION

        WHEN no_data_found THEN

          NULL;

        WHEN OTHERS THEN

          v_errmsg  := 'CDR Charges for ES child account no:' ||

                       v_child_account_id || 'ES parent account no:' ||

                       v_parent_account_id || ' ' || SQLERRM;

          v_errcode := SQLCODE;

          INSERT INTO   NL_es_error_log

            (module_name, error_code, error_msg, error_datetime)

          VALUES

            ('Discount Split', v_errcode, v_errmsg, SYSDATE);

          COMMIT;

      END;

    

      COMMIT;

    

    END LOOP;

    CLOSE cur_discount_details;

  

    -- closing of the cursor cur_es_child_accounts.

  END LOOP;

  UPDATE   NL_es_discount

     SET is_split = 1

   WHERE es_account_id = v_parent_account_id AND

         bill_cycle_date = v_bill_date;

  COMMIT;

  CLOSE cur_es_child_accounts;


  --for logging the exceptions.

EXCEPTION

  WHEN dup_val_on_index THEN

    ROLLBACK;

    v_errmsg  := 'ES child account no:' || v_child_account_id ||

                 'ES parent account no:' || v_parent_account_id || ' ' ||

                 SQLERRM;

    v_errcode := SQLCODE;

    INSERT INTO   NL_es_error_log

      (module_name, error_code, error_msg, error_datetime)

    VALUES

      ('Discount Split ', v_errcode, v_errmsg, SYSDATE);

    COMMIT;

  WHEN OTHERS THEN

    ROLLBACK;

    v_errmsg  := 'ES child account no:' || v_child_account_id ||

                 'ES parent account no:' || v_parent_account_id || ' ' ||

                 SQLERRM;

    v_errcode := SQLCODE;

    INSERT INTO   NL_es_error_log

      (module_name, error_code, error_msg, error_datetime)

    VALUES

      ('Discount Split', v_errcode, v_errmsg, SYSDATE);

    COMMIT;

  

END sp_es_discount_split; --end of the procedure sp_es_discount_split

==========SP_FIND_DIFFERENCE

CREATE OR REPLACE PROCEDURE ESTAPLE.sp_find_difference(p_parent_account_id IN VARCHAR2)


 AS

  v_parent_account_id     VARCHAR2(20);

  v_account_id            VARCHAR2(20);

  v_home_sys_account_id   VARCHAR2(20);

  v_is_active             NUMBER;

  v_charges               NUMBER;

  v_payments              NUMBER;

  v_outstanding_at_parent NUMBER;

  v_max_invoice           NUMBER;

  v_outsanding_at_hbs     NUMBER;

  v_diff                  NUMBER := 0;

  v_total_diff            NUMBER := 0;


  CURSOR cur_get_accounts IS

    SELECT parent_account_id, account_id, home_sys_account_id, is_active

      FROM   NL_es_home_sys_account

     WHERE parent_account_id IN

           (

          

          

          

          p_parent_account_id

           )

    

    ;


=====================================
BEGIN


  FOR rec_get_accounts IN cur_get_accounts LOOP

  
    v_parent_account_id   := rec_get_accounts.parent_account_id;
    v_account_id          := rec_get_accounts.account_id;
    v_home_sys_account_id := rec_get_accounts.home_sys_account_id;
    v_is_active           := rec_get_accounts.is_active;
  
    SELECT nvl(SUM(one_off_number), 0)
      INTO v_charges
      FROM custoverrideprice@cdr_nz c
     WHERE customer_ref = v_account_id;
  
    SELECT nvl(SUM(account_payment_mny), 0)
      INTO v_payments
      FROM accountpayment@cdr_nz a
     WHERE a.account_num = v_home_sys_account_id AND
           account_payment_ref IN
           (SELECT transaction_id
              FROM   NL_es_payment_split
             WHERE account_id = v_account_id) AND failed_dtm IS NULL;
  
    v_outstanding_at_parent := v_charges - v_payments;
  
    SELECT nvl(MAX(invoice_seq_no), 0)
      INTO v_max_invoice
      FROM   NL_es_cdr_bill_invoice bc
     WHERE account_id = v_account_id AND is_posted = 1;
  
    BEGIN
      SELECT nvl(outstanding_bal, 0)
        INTO v_outsanding_at_hbs
        FROM   NL_es_cdr_bill_invoice bc
       WHERE account_id = v_account_id AND invoice_seq_no = v_max_invoice;
    EXCEPTION
      WHEN no_data_found THEN
        v_outsanding_at_hbs := 0;
      
    END;
    IF (v_is_active = 5 OR v_outsanding_at_hbs < 0) THEN
      v_outsanding_at_hbs := 0;
    END IF;
  
    IF abs(v_outstanding_at_parent - v_outsanding_at_hbs) > 2000 THEN
    
      v_diff := v_outstanding_at_parent - v_outsanding_at_hbs;
      INSERT INTO   NL_es_diff
        (parent_account_id,
         account_id,
         home_sys_account_id,
         is_active,
         payments,
         outsanding_at_hbs,
         outstanding_at_parent,
         difference,
         charges,
         logged_date)
      VALUES
        (v_parent_account_id,
         v_account_id,
         v_home_sys_account_id,
         v_is_active,
         v_payments,
         v_outsanding_at_hbs,
         v_outstanding_at_parent,
         v_outstanding_at_parent - v_outsanding_at_hbs,
         v_charges,
         SYSDATE);
    ELSE
      v_diff := 0;
    END IF;
  
    v_total_diff := v_total_diff + v_diff;
  
  /*dbms_output.put_line('total difference for parent is'||v_total_diff);*/
  END LOOP;
if(v_total_diff is not null  ) then
  UPDATE   NL_es_diff
     SET diffference_at_parent = v_total_diff
   WHERE parent_account_id = v_parent_account_id;
   else
   dbms_output.put_line('error for parent'||v_parent_account_id);
   end if;

  COMMIT;
  v_total_diff := 0;
EXCEPTION

  WHEN OTHERS THEN
  
    dbms_output.put_line(v_account_id || '    ' || SQLERRM);
  
END;
========= SP_GEN_ACCOUNTING_FEED
CREATE OR REPLACE PROCEDURE ESTAPLE.sp_gen_accounting_feed IS

  -- Author :Sumit Arora(258075)
  -- Created Date :March 25,2009 9.59 AM
  -- The procedure generates an accounting feed for the ES accounts
  -- Only the excess payments are available in the feed

  v_filehandle utl_file.file_type;
  --v_es_child_account_id   NL_es_cust_acq_response.es_child_account_id%TYPE := NULL;
  --v_home_sys_ext_id       NL_es_home_sys_account.home_sys_external_id%TYPE := NULL;
  v_payment_amount   NL_es_payment_split.payment_amount%TYPE := NULL;
  v_amount         NUMBER(18, 3);
  v_amount1        VARCHAR2(20);

  v_implied_decimel   NL_es_parameters.int_value%TYPE := NULL;
  v_rcv_ssa_code      NL_es_payment.rcv_ssa_code%TYPE := NULL;
  --v_owning_ssa           NL_es_home_sys_account.ssa%TYPE := NULL;
  v_owning_circle   NL_es_home_sys_account.circle%TYPE := NULL;
  --v_owning_ssa_code      NL_ssa_map.ssa_code%TYPE := NULL;
  v_owning_ssa_code      NL_es_payment.rcv_ssa_code%TYPE;
  v_owning_circle_code   NL_ssa_circle_map.circle_name%TYPE := NULL;
  --v_owning_ssa_id        NL_ssa_map.ssa_id%TYPE := NULL;
  -- v_owning_circle_id     NL_ssa_map.circle_id%TYPE := NULL;
  v_lob             VARCHAR2(3);
  v_gl_posting_date VARCHAR2(12);

  filename  VARCHAR2(50);
  v_sn      NUMBER(10) := 0;
  v_err_num NUMBER;
  v_err_msg VARCHAR2(100);
  v_feed_no VARCHAR2(14);
  v_owning_zone CONSTANT VARCHAR2(14) := 'W';
  --  NL_ssa_map.zone_name%TYPE := NULL;
  v_rcv_circle_code   NL_ssa_circle_map.circle_name%TYPE := NULL;
  v_rcv_zone CONSTANT VARCHAR2(14) := 'W';
  v_payment_type   NL_es_payment_split.payment_type%TYPE := NULL;
  v_count        NUMBER(10) := 0;
  v_last_run_dtm DATE;

  CURSOR cur_excess_payment IS
    SELECT p.rcv_ssa_code, ep.payment_type, SUM(ep.remaining_amount)
      FROM   NL_es_excess_payment ep INNER JOIN   NL_es_payment p ON ep.transaction_id = p.transaction_id AND ep.payment_type = p.payment_type
     WHERE ep.excess_trans_date >= /*v_last_run_dtm*/'1-jan-2012'
       --and EP.TRANSACTION_ID LIKE 'JAL%'
     GROUP BY p.rcv_ssa_code, ep.payment_type
   --HAVING SUM(ep.remaining_amount) <> 0
   ;
  
BEGIN

  SELECT to_date(char_value, 'MM/DD/YYYY hh:mi:ss AM')
    INTO v_last_run_dtm
    FROM   NL_es_parameters
   WHERE TRIM(lower(parameter_name)) = 'last_accounting_feed' AND
         TRIM(upper(module_name)) = 'AF';

  UPDATE   NL_es_parameters
     SET char_value = to_char(SYSDATE, 'MM/DD/YYYY hh:mi:ss AM')
   WHERE TRIM(lower(parameter_name)) = 'last_accounting_feed' AND
         TRIM(upper(module_name)) = 'AF';
  COMMIT;
  SELECT int_value
    INTO v_implied_decimel
    FROM   NL_es_parameters b
   WHERE b.module_name = 'ES' AND b.parameter_name = 'Implied Decimel';
  SELECT to_char(SYSDATE, 'dd.mm.yyyy') INTO v_gl_posting_date FROM dual;
  SELECT to_char(SYSDATE, 'DDMMYYYYHH24MISS') INTO v_feed_no FROM dual;

  OPEN cur_excess_payment;
  LOOP
    FETCH cur_excess_payment
      INTO v_rcv_ssa_code, v_payment_type, v_payment_amount;
    EXIT WHEN cur_excess_payment%NOTFOUND;
    IF v_count = 0 THEN
      --filename will be in the format es_payment_DDMMYYYY.csv 
      filename     := 'es_accounting_' ||
                      to_char(SYSDATE, 'DDMMYYYYHH24MISS') || '.csv';
      v_filehandle := utl_file.fopen('ACCOUNTING_DIR', filename, 'w');
    END IF;
  
    v_sn := v_sn + 1;
  
    v_amount := v_payment_amount / (10 ** v_implied_decimel);
  
    SELECT TRIM(to_char(v_amount, '9999999999999999.99'))
      INTO v_amount1
      FROM dual;
  
    v_lob          := 'EP';
    v_rcv_ssa_code := TRIM(' ' FROM v_rcv_ssa_code);
    --v_owning_ssa_id := 120;
  
    SELECT circle_name
      INTO v_owning_circle_code
      FROM   NL_ssa_circle_map bp
     WHERE bp.ssa_name = v_rcv_ssa_code;
  
    v_rcv_circle_code := v_owning_circle_code;
  
    /* SELECT m.zone_name, m.circle_code, m.ssa_code
      INTO v_owning_zone, v_owning_circle_code, v_owning_ssa_code
      FROM   NL_ssa_map m
     WHERE m.ssa_id = v_owning_ssa_id;
    
    SELECT p.zone_name, p.circle_code
      INTO v_rcv_zone, v_rcv_circle_code
      FROM   NL_ssa_map p
     WHERE p.ssa_code = v_rcv_ssa_code;*/
  
    IF v_payment_type = 'REV' THEN
      v_amount1 := '-' || v_amount1;
    END IF;
    utl_file.putf(v_filehandle,
                  v_sn || ',' || 'EZ' || ',' || to_char(v_feed_no) || ',' ||
                  v_gl_posting_date || ',' || v_rcv_zone || ',' ||
                  v_rcv_circle_code || ',' || v_rcv_ssa_code || ',' ||
                  v_rcv_zone || ',' || v_rcv_circle_code || ',' ||
                  v_rcv_ssa_code || ',' || v_lob || ',' || 'N' || ',' ||
                  to_char(v_amount1));
  
    utl_file.new_line(v_filehandle);
    v_count := v_count + 1;
  END LOOP;

  COMMIT;
  IF utl_file.is_open(v_filehandle) THEN
  
    --closing the filehandle for the feed file
  
    utl_file.fclose(v_filehandle);
  END IF;

EXCEPTION

  WHEN no_data_found THEN
    v_err_num := SQLCODE;
    v_err_msg := 'Error in Accounting Feed generation :' || filename ||
                 substr(SQLCODE, 1, 100);
    --Inserting into   NL_es_error_log
    INSERT INTO   NL_es_error_log
      (module_name, error_msg, error_datetime, error_code)
    VALUES
      ('Accounting feed', v_err_msg, SYSDATE, v_err_num);
    COMMIT;
  
  WHEN utl_file.invalid_path THEN
    v_err_num := SQLCODE;
    v_err_msg := 'Error in Accounting Feed generation :, Invalid Path:' ||
                 filename || substr(SQLCODE, 1, 100);
    --Inserting into   NL_es_error_log
    INSERT INTO   NL_es_error_log
      (module_name, error_msg, error_datetime, error_code)
    VALUES
      ('Accounting feed', v_err_msg, SYSDATE, v_err_num);
    COMMIT;
  
  WHEN utl_file.invalid_mode THEN
    v_err_num := SQLCODE;
    v_err_msg := 'Error in Accounting Feed generation ::, Invalid Mode:' ||
                 filename || substr(SQLCODE, 1, 100);
    --Inserting into   NL_es_error_log
    INSERT INTO   NL_es_error_log
      (module_name, error_msg, error_datetime, error_code)
    VALUES
      ('Accounting feed', v_err_msg, SYSDATE, v_err_num);
    COMMIT;
  
  WHEN utl_file.invalid_filehandle THEN
    v_err_num := SQLCODE;
    v_err_msg := 'Error in Accounting Feed generation :,Invalid Filehandle:' ||
                 filename || substr(SQLCODE, 1, 100);
    --Inserting into   NL_es_error_log
    INSERT INTO   NL_es_error_log
      (module_name, error_msg, error_datetime, error_code)
    VALUES
  ('Accounting feed', v_err_msg, SYSDATE, v_err_num);
    COMMIT;
  
  WHEN utl_file.invalid_operation THEN
    v_err_num := SQLCODE;
    v_err_msg := 'Error in Accounting Feed generation :, Invalid Operation:' ||
                 filename || substr(SQLCODE, 1, 100);
    --Inserting into   NL_es_error_log
    INSERT INTO   NL_es_error_log
      (module_name, error_msg, error_datetime, error_code)
    VALUES
      ('Accounting feed', v_err_msg, SYSDATE, v_err_num);
    COMMIT;
  
  WHEN utl_file.read_error THEN
    v_err_num := SQLCODE;
    v_err_msg := 'Error in Accounting Feed generation :, Read Error:' ||
                 filename || substr(SQLCODE, 1, 100);
    --Inserting into   NL_es_error_log
    INSERT INTO   NL_es_error_log
      (module_name, error_msg, error_datetime, error_code)
    VALUES
      ('Accounting feed', v_err_msg, SYSDATE, v_err_num);
    COMMIT;
  
  WHEN utl_file.write_error THEN
    v_err_num := SQLCODE;
    v_err_msg := 'Error in Accounting Feed generation ::, Write Error:' ||
                 filename || substr(SQLCODE, 1, 100);
    --Inserting into   NL_es_error_log
    INSERT INTO   NL_es_error_log
      (module_name, error_msg, error_datetime, error_code)
    VALUES
      ('Accounting feed', v_err_msg, SYSDATE, v_err_num);
    COMMIT;
  
  WHEN utl_file.internal_error THEN
    v_err_num := SQLCODE;
    v_err_msg := 'Error in Accounting Feed generation :, Internal Error:' ||
                 filename || substr(SQLCODE, 1, 100);
    --Inserting into   NL_es_error_log
    INSERT INTO   NL_es_error_log
      (module_name, error_msg, error_datetime, error_code)
    VALUES
      ('Accounting feed', v_err_msg, SYSDATE, v_err_num);
    COMMIT;
  
  WHEN OTHERS THEN
    v_err_num := SQLCODE;
    v_err_msg := 'Error in Accounting Feed generation :' || filename ||
                 substr(SQLCODE, 1, 100);
    --Inserting into   NL_es_error_log
    INSERT INTO   NL_es_error_log
      (module_name, error_msg, error_datetime, error_code)
    VALUES
      ('Accounting feed', v_err_msg, SYSDATE, v_err_num);
    COMMIT;
  
  --end of sp_gen_accounting_feed procedure
END sp_gen_accounting_feed;
========SP_GEN_CHILD_LEDGER
CREATE OR REPLACE PROCEDURE ESTAPLE.SP_GEN_CHILD_LEDGER(P_SSA VARCHAR2)  IS

  V_CHARGES             NUMBER;
  V_AMT_PAID            NUMBER;
  V_AMT_REV             NUMBER;
  V_OUTSTANDING         NUMBER;
  V_ACCOUNT_ID          VARCHAR2(20);
  V_HOME_SYS_ACCOUNT_ID VARCHAR2(20);
  V_PARENT_ID           VARCHAR2(20);
  V_IS_ACTIVE           NUMBER;
  V_INVOICE_SEQ         NUMBER;

  CURSOR CUR_ACC IS
    SELECT ACCOUNT_ID,
           HOME_SYS_ACCOUNT_ID,
           PARENT_ACCOUNT_ID,
           IS_ACTIVE,
           INVOICE_SEQ_NO
      FROM   NL_ES_HOME_SYS_ACCOUNT
     WHERE SSA = P_SSA;
    

BEGIN
  FOR REC_ACC IN CUR_ACC LOOP
    V_ACCOUNT_ID          := REC_ACC.ACCOUNT_ID;
    V_HOME_SYS_ACCOUNT_ID := REC_ACC.HOME_SYS_ACCOUNT_ID;
    V_PARENT_ID           := REC_ACC.PARENT_ACCOUNT_ID;
    V_IS_ACTIVE           := REC_ACC.IS_ACTIVE;
    V_INVOICE_SEQ         := REC_ACC.INVOICE_SEQ_NO;
    BEGIN
      SELECT NVL(SUM(ONE_OFF_NUMBER), 0)
        INTO V_CHARGES
        FROM CUSTOVERRIDEPRICE@CDR_NZ
       WHERE CUSTOMER_REF = V_ACCOUNT_ID;
    
      SELECT NVL(SUM(S.PAYMENT_AMOUNT), 0)
        INTO V_AMT_PAID
        FROM   NL_ES_PAYMENT_SPLIT S
       WHERE S.ACCOUNT_ID = V_ACCOUNT_ID AND S.PAYMENT_TYPE = 'APP';
    
      SELECT NVL(SUM(S.PAYMENT_AMOUNT), 0)
        INTO V_AMT_REV
        FROM   NL_ES_PAYMENT_SPLIT S
       WHERE S.ACCOUNT_ID = V_ACCOUNT_ID AND S.PAYMENT_TYPE = 'REV';
    
      CASE V_IS_ACTIVE
      
        WHEN 1 THEN
        BEGIN 
          SELECT NVL(I.OUTSTANDING_BAL, 0)
            INTO V_OUTSTANDING
            FROM   NL_ES_CDR_BILL_INVOICE I
           WHERE I.ACCOUNT_ID = V_ACCOUNT_ID AND
                 I.INVOICE_SEQ_NO = V_INVOICE_SEQ;
       EXCEPTION
       WHEN NO_DATA_FOUND THEN 
       V_OUTSTANDING :=0;
       
       END; 
        WHEN 5 THEN
          V_OUTSTANDING := 0;
        WHEN 4 THEN
        
         BEGIN 
          SELECT NVL(I.OUTSTANDING_BAL, 0)
            INTO V_OUTSTANDING
            FROM   NL_ES_CDR_BILL_INVOICE I
           WHERE I.ACCOUNT_ID = V_ACCOUNT_ID AND
                    I.INVOICE_SEQ_NO = V_INVOICE_SEQ;
                    
   EXCEPTION
       WHEN NO_DATA_FOUND THEN 
       V_OUTSTANDING :=0;
       
       END; 
 
      END CASE;
      IF (V_OUTSTANDING < 0) THEN
        V_OUTSTANDING := 0;
      END IF;
      INSERT INTO   NL_ES_CHILD_LEDGER
      VALUES
        (V_ACCOUNT_ID,
         V_HOME_SYS_ACCOUNT_ID,
         V_PARENT_ID,
         V_CHARGES,
         V_AMT_PAID,
         V_AMT_REV,
         V_OUTSTANDING,
         (V_CHARGES - V_AMT_PAID + V_AMT_REV) - V_OUTSTANDING,
         V_IS_ACTIVE);
      COMMIT;
    EXCEPTION
      WHEN OTHERS THEN
        DBMS_OUTPUT.PUT_LINE(REC_ACC.ACCOUNT_ID|| SQLERRM);
    END;
  END LOOP;

END SP_GEN_CHILD_LEDGER;
===========SP_GEN_CUST_ACQ_FEED
CREATE OR REPLACE PROCEDURE ESTAPLE.sp_gen_cust_acq_feed IS

  --version 1.0
  --Author: 230328
  --Purpose: To  generates feed file for CA response to CRM
  --It uses the table   NL_es_cust_acq_response in ES database to fetch the details for this purpose

  -- Variable Declaration
  --v_filehandle          utl_file.file_type;
  v_es_account_id         NL_es_home_sys_account.account_id%TYPE;
  v_cust_acq_status       NL_es_cust_acq_response.cust_acq_status%TYPE;
  v_es_child_account_id   NL_es_cust_acq_response.es_child_account_id%TYPE;
  --v_es_ext_id             NL_es_cust_acq_response.external_es_account_id%TYPE;
  --v_es_child_ext_id       NL_es_cust_acq_response.external_es_child_account_id%TYPE;
  v_status_desc   NL_es_cust_acq_response.status_desc%TYPE;
  --filename      VARCHAR2(50);
  v_status   VARCHAR2(20);
  v_err_num  NUMBER;
  v_err_msg  VARCHAR2(570);
  v_mandt    sapsr3.zestap_feed.mandt@crm_db_bc7%TYPE := NULL;
  v_acq_date sapsr3.zestap_feed.timestamped@crm_db_bc7%TYPE := NULL;
  --v_count   NUMBER(10) := 0;

  CURSOR cur_accounts IS
    SELECT ca.es_account_id,
           ca.es_child_account_id,
           ca.cust_acq_status,
           ca.status_desc,
           to_char(ca.acq_date, 'DDMMYYYY HH24:MI:SS:FF3') acq_date
      FROM   NL_es_cust_acq_response ca
     WHERE (ca.is_feed_sent IS NULL OR ca.is_feed_sent = 0) ;

BEGIN
  v_mandt := '400';
  --open cursor cur_accounts
  OPEN cur_accounts;
  LOOP
    FETCH cur_accounts
      INTO v_es_account_id, v_es_child_account_id, v_cust_acq_status, v_status_desc, v_acq_date;
    EXIT WHEN cur_accounts%NOTFOUND;
  
    /*IF v_count = 0 THEN
      --filename will be in the format eStapling_DDMMYYHHMISS.txt 
      filename := 'eStapling_' || to_char(SYSDATE, 'DDMMYYHHMISS') ||
                  '.txt';
    
      v_filehandle := utl_file.fopen('CRM_DIR', filename, 'a');
    END IF;*/
    IF v_es_child_account_id IS NULL THEN
      v_es_child_account_id := ' ';
    END IF;
    CASE v_cust_acq_status
      WHEN 1 THEN
        v_status := 'Active';
      WHEN -1 THEN
        v_status := 'Inactive';
      WHEN 0 THEN
        -- v_status := 'Active';
        v_status := 'Inactive';
    END CASE;
  
    /*Inserting the customer acquisition info in the feed file
    The info will be in the format:-
    es_parent_account_id (CRM generated id)
    es_child_account_id( CRM generated child es id)
    status- Inactive or Active
    status description
    
    The delimiter will be comma(,)*/
    /*utl_file.putf(v_filehandle,
                  v_es_account_id || ',' || v_es_child_account_id || ',' ||
                  v_status || ',' || v_status_desc);
    
    utl_file.new_line(v_filehandle);
    v_count := v_count + 1;*/
  
    INSERT INTO sapsr3.zestap_feed@crm_db_bc7
      (mandt, p_bill, c_bill, status, descr, timestamped)
    VALUES
      (v_mandt,
       v_es_account_id,
       v_es_child_account_id,
       v_status,
       v_status_desc,
       v_acq_date);
  
    UPDATE   NL_es_cust_acq_response r
       SET r.is_feed_sent = 1
     WHERE r.es_account_id = v_es_account_id AND
           r.es_child_account_id = v_es_child_account_id AND
           (r.is_feed_sent IS NULL OR r.is_feed_sent = 0);
  
  END LOOP;
  COMMIT;
  /*IF utl_file.is_open(v_filehandle) THEN
  
    --closing the filehandle for the feed file
  
    utl_file.fclose(v_filehandle);
  END IF;*/

  --Exception Handling
EXCEPTION

  WHEN no_data_found THEN
    v_err_num := SQLCODE;
    v_err_msg := 'Error in Feed generation for Cust acq:' ||
                 substr(SQLCODE, 1, 100);
    --Inserting into   NL_es_error_log
    INSERT INTO   NL_es_error_log
      (module_name, error_msg, error_datetime, error_code)
    VALUES
      ('Cust Acq Feed', v_err_msg, SYSDATE, v_err_num);
    COMMIT;
  
  WHEN OTHERS THEN
    v_err_num := SQLCODE;
    v_err_msg := 'Error in Feed generation for Cust acq:' ||
                 substr(SQLCODE, 1, 100);
    --Inserting into   NL_es_error_log
    INSERT INTO   NL_es_error_log
      (module_name, error_msg, error_datetime, error_code)
    VALUES
      ('Cust Acq Feed', v_err_msg, SYSDATE, v_err_num);
    COMMIT;
  
  --end of sp_es_cust_acq_feed procedure
END sp_gen_cust_acq_feed;
==========SP_GEN_CUST_ACQ_FEED_ADD_DEL
CREATE OR REPLACE PROCEDURE ESTAPLE.sp_gen_cust_acq_feed_add_del AS
  --version 1.0
  --created by - Sumit Arora(258075)
  --purpose  - to Give Added or deleted account response to CRM
  v_parent_account_id       NL_es_account.account_id%TYPE;
  v_child_account_id        NL_es_add_del_accounts.child_account_id%TYPE;
  v_home_child_account_id   NL_es_home_sys_account.home_sys_account_id%TYPE;
  v_action_code             NL_es_add_del_accounts.action_code%TYPE;
  v_order_id                NL_es_add_del_accounts.order_id%TYPE;
  v_is_action               NL_es_add_del_accounts.is_action%TYPE;
  v_status_desc             NL_es_add_del_accounts.status_description%TYPE;
  v_status                sapsr3.zestap_add_del.status@crm_db_bc7%TYPE;
  v_err_num               NUMBER;
  v_err_msg               VARCHAR2(570);
  v_action                VARCHAR2(50);
  v_date                  sapsr3.zestap_feed.timestamped@crm_db_bc7%TYPE := NULL;
  CURSOR cur_add_del_accounts IS
    SELECT ad.parent_account_id,
           ad.child_account_id,
           ad.action_code,
           ad.order_id,
           ad.is_action,
           ad.status_description
      FROM   NL_es_add_del_accounts ad
     WHERE order_id NOT IN
           (SELECT zextra2 FROM sapsr3.zestap_feed@crm_db_bc7) AND
           is_feed_sent = 0;

BEGIN

  FOR rec_add_del_accounts IN cur_add_del_accounts LOOP
    v_parent_account_id := rec_add_del_accounts.parent_account_id;
    v_child_account_id  := rec_add_del_accounts.child_account_id;
  
    v_is_action   := rec_add_del_accounts.is_action;
    v_action_code := rec_add_del_accounts.action_code;
    v_order_id    := rec_add_del_accounts.order_id;
    v_status_desc := rec_add_del_accounts.status_description;
    v_date        := to_char(systimestamp, 'DDMMYYYY HH24:MI:SS:FF3');
    -- EXIT WHEN cur_add_del_accounts%NOTFOUND;
    CASE v_action_code
      WHEN '01' THEN
        CASE v_is_action
          WHEN -1 THEN
            v_status := 'Inactive';
          WHEN 1 THEN
            v_status := 'Active';
        END CASE;
        v_action := 'ADD';
      WHEN '02' THEN
        CASE v_is_action
          WHEN 1 THEN
            v_status := 'Inactive';
          WHEN -1 THEN
            v_status := 'Active';
        END CASE;
        v_action := 'DELETE';
        DELETE FROM sapsr3.zestap_ser@crm_db_bc7
         WHERE p_bill = v_parent_account_id AND c_bill = v_child_account_id;
    END CASE;
    INSERT INTO sapsr3.zestap_feed@crm_db_bc7
      (mandt, p_bill, c_bill, status, descr, zextra1, zextra2, timestamped)
    VALUES
      (400,
       v_parent_account_id,
       v_child_account_id,
       v_status,
       v_status_desc,
       v_action,
       v_order_id,
       v_date);
    UPDATE   NL_es_add_del_accounts bad
       SET bad.is_feed_sent = 1
     WHERE bad.parent_account_id = v_parent_account_id AND
           bad.child_account_id = v_child_account_id AND
           bad.order_id = v_order_id;
    
    UPDATE   NL_ES_CUST_ACQ_RESPONSE R
       SET R.IS_FEED_SENT = 1
     WHERE R.ES_ACCOUNT_ID = V_PARENT_ACCOUNT_ID AND
           R.ES_CHILD_ACCOUNT_ID = V_CHILD_ACCOUNT_ID AND
           (R.IS_FEED_SENT IS NULL OR R.IS_FEED_SENT = 0);
                  
  END LOOP;
  COMMIT;

EXCEPTION

  WHEN no_data_found THEN
    v_err_num := SQLCODE;
    v_err_msg := 'Error in Feed generation for Cust acq add del:' ||
                 substr(SQLCODE, 1, 100);
    --Inserting into   NL_es_error_log
    INSERT INTO   NL_es_error_log
      (module_name, error_msg, error_datetime, error_code)
    VALUES
      ('Cust Acq Feed Add Del', v_err_msg, SYSDATE, v_err_num);
    COMMIT;
  
  WHEN OTHERS THEN
    v_err_num := SQLCODE;
    v_err_msg := SQLERRM;
  
    INSERT INTO   NL_es_error_log
      (module_name, error_msg, error_datetime, error_code)
    VALUES
      ('Cust Acq Feed Add Del', v_err_msg, SYSDATE, v_err_num);
    COMMIT;
  
END sp_gen_cust_acq_feed_add_del;
========SP_GEN_ES_BILLING_ADD_DEL_FEED
CREATE OR REPLACE PROCEDURE ESTAPLE.SP_GEN_ES_BILLING_ADD_DEL_FEED AS

  --version 1.0
  --created by - Abhilasha Saxena (313274)
  --purpose -- To Give newly added and deleted account details to billing

  V_FILEHANDLE  UTL_FILE.FILE_TYPE;
  FILENAME_FEED VARCHAR2(50);
  --fetches the account details 
  CURSOR CUR_ES_BILL_FEED IS
    SELECT B.PARENT_ACCOUNT_ID,
           B.CHILD_ACCOUNT_ID,
           B.HOME_SYS_ACCOUNT_ID,
           B.ACTION_CODE,
           B.REQUEST_DATE
      FROM   NL_ES_ADD_DEL_ACCOUNTS B;

  V_PARENT_ACCOUNT_ID   NL_ES_ADD_DEL_ACCOUNTS.PARENT_ACCOUNT_ID%TYPE;
  V_HOME_SYS_ID         NL_ES_ADD_DEL_ACCOUNTS.HOME_SYS_ACCOUNT_ID%TYPE;
  V_ACTION_CODE         NL_ES_ADD_DEL_ACCOUNTS.ACTION_CODE%TYPE;
  V_REQUEST_DT        VARCHAR2(12); --   NL_es_add_del_accounts.request_date%TYPE;
  V_COUNT             NUMBER;
  V_IMPLIED_DECIMEL     NL_ES_PARAMETERS.INT_VALUE%TYPE;
  V_ERRCODE           VARCHAR2(500);
  V_ERRMSG            VARCHAR2(500);

BEGIN
  --initializing the feed file line counter
  V_COUNT := 0;

  SELECT BP.INT_VALUE
    INTO V_IMPLIED_DECIMEL
    FROM   NL_ES_PARAMETERS BP
   WHERE BP.MODULE_NAME LIKE '%ES%' AND
         BP.PARAMETER_NAME = 'Implied Decimel';

  FOR REC_BILL_FEED IN CUR_ES_BILL_FEED LOOP
    V_PARENT_ACCOUNT_ID := REC_BILL_FEED.PARENT_ACCOUNT_ID;
    V_HOME_SYS_ID       := REC_BILL_FEED.HOME_SYS_ACCOUNT_ID;
    V_ACTION_CODE       := REC_BILL_FEED.ACTION_CODE;
    V_REQUEST_DT        := TO_CHAR(REC_BILL_FEED.REQUEST_DATE, 'DD-MM-YYYY');
  
    IF V_ACTION_CODE = '01' THEN
      V_ACTION_CODE := 'A';
    ELSE
      V_ACTION_CODE := 'D';
    END IF;
  
    IF V_COUNT = 0 THEN
      --the name of the file which will store payment feed
      FILENAME_FEED := '  NL_ES_' || TO_CHAR(SYSDATE, 'DDMMYYYYHH24MISS') ||
                       '.txt';
      V_FILEHANDLE  := UTL_FILE.FOPEN('ES_BILLING_DIR', FILENAME_FEED, 'a');
    
    END IF;
    UTL_FILE.PUTF(V_FILEHANDLE,
                  V_PARENT_ACCOUNT_ID || ',' || V_HOME_SYS_ID || ',' ||
                  V_REQUEST_DT || ',' || V_ACTION_CODE);
  
    UTL_FILE.NEW_LINE(V_FILEHANDLE);
    V_COUNT := V_COUNT + 1;
  
    COMMIT;
  END LOOP;
  --closing the filehandle for the feed file
  UTL_FILE.FCLOSE(V_FILEHANDLE);
  --exception handling

EXCEPTION
  WHEN NO_DATA_FOUND THEN
    ROLLBACK;
    V_ERRCODE := SQLCODE;
    V_ERRMSG  := SQLERRM;
    INSERT INTO   NL_ES_ERROR_LOG
      (MODULE_NAME, ERROR_CODE, ERROR_MSG, ERROR_DATETIME)
    VALUES
      ('BILLING ES Feed', V_ERRCODE, V_ERRMSG, SYSDATE);
    COMMIT;
  WHEN CASE_NOT_FOUND THEN
    ROLLBACK;
    V_ERRCODE := SQLCODE;
    V_ERRMSG  := SQLERRM;
    INSERT INTO   NL_ES_ERROR_LOG
      (MODULE_NAME, ERROR_CODE, ERROR_MSG, ERROR_DATETIME)
    VALUES
      ('BILLING ES Feed', V_ERRCODE, V_ERRMSG, SYSDATE);
    COMMIT;
  WHEN CURSOR_ALREADY_OPEN THEN
    ROLLBACK;
    V_ERRCODE := SQLCODE;
    V_ERRMSG  := SQLERRM;
    INSERT INTO   NL_ES_ERROR_LOG
      (MODULE_NAME, ERROR_CODE, ERROR_MSG, ERROR_DATETIME)
    VALUES
      ('BILLING ES Feed', V_ERRCODE, V_ERRMSG, SYSDATE);
    COMMIT;
  WHEN DUP_VAL_ON_INDEX THEN
    ROLLBACK;
    V_ERRCODE := SQLCODE;
    V_ERRMSG  := SQLERRM;
    INSERT INTO   NL_ES_ERROR_LOG
      (MODULE_NAME, ERROR_CODE, ERROR_MSG, ERROR_DATETIME)
    VALUES
      ('BILLING ES Feed', V_ERRCODE, V_ERRMSG, SYSDATE);
    COMMIT;
  WHEN INVALID_CURSOR THEN
    ROLLBACK;
    V_ERRCODE := SQLCODE;
    V_ERRMSG  := SQLERRM;
    INSERT INTO   NL_ES_ERROR_LOG
      (MODULE_NAME, ERROR_CODE, ERROR_MSG, ERROR_DATETIME)
    VALUES
      ('BILLING ES Feed', V_ERRCODE, V_ERRMSG, SYSDATE);
    COMMIT;
  WHEN TOO_MANY_ROWS THEN
    ROLLBACK;
    V_ERRCODE := SQLCODE;
    V_ERRMSG  := SQLERRM;
    INSERT INTO   NL_ES_ERROR_LOG
      (MODULE_NAME, ERROR_CODE, ERROR_MSG, ERROR_DATETIME)
    VALUES
      ('BILLING ES Feed', V_ERRCODE, V_ERRMSG, SYSDATE);
    COMMIT;
  WHEN OTHERS THEN
    ROLLBACK;
    V_ERRCODE := SQLCODE;
    V_ERRMSG  := SQLERRM;
    INSERT INTO   NL_ES_ERROR_LOG
      (MODULE_NAME, ERROR_CODE, ERROR_MSG, ERROR_DATETIME)
    VALUES
      ('BILLING ES Feed', V_ERRCODE, V_ERRMSG, SYSDATE);
    COMMIT;
  
END SP_GEN_ES_BILLING_ADD_DEL_FEED;
=========SP_GEN_ES_BILLING_FEED
CREATE OR REPLACE PROCEDURE ESTAPLE.SP_GEN_ES_BILLING_FEED(P_BILL_CYCLE_DATE IN DATE) AS
  V_FILEHANDLE  UTL_FILE.FILE_TYPE;
  FILENAME_FEED VARCHAR2(50);
  --fetches the account details 
  CURSOR CUR_ES_BILLING_FEED IS
    SELECT B.PARENT_ACCOUNT_ID, B.HOME_SYS_ACCOUNT_ID, B.IS_ACTIVE
      FROM   NL_ES_HOME_SYS_ACCOUNT B
     WHERE B.IS_ACTIVE <> 2 AND B.ENROLLMENT_DATE < P_BILL_CYCLE_DATE
     ORDER BY B.IS_ACTIVE DESC;

  V_PARENT_ACCOUNT_ID   NL_ES_HOME_SYS_ACCOUNT.PARENT_ACCOUNT_ID%TYPE;
  V_HOME_ACC_ID         NL_ES_HOME_SYS_ACCOUNT.HOME_SYS_ACCOUNT_ID%TYPE;
  V_COUNT             NUMBER;
  V_IMPLIED_DECIMEL     NL_ES_PARAMETERS.INT_VALUE%TYPE;
  V_ERRCODE           VARCHAR2(500);
  V_ERRMSG            VARCHAR2(500);
  V_EFFECTIVE_DT      VARCHAR2(10);
  V_ACTION_CODE       VARCHAR2(10);
  HBS_COUNT           NUMBER;
BEGIN
  --initializing the feed file line counter
  V_COUNT        := 0;
  V_EFFECTIVE_DT := TO_CHAR(SYSDATE, 'DD-MM-YYYY');
  /* v_action_code  := 'A';*/

  SELECT BP.INT_VALUE
    INTO V_IMPLIED_DECIMEL
    FROM   NL_ES_PARAMETERS BP
   WHERE BP.MODULE_NAME LIKE '%ES%' AND
         BP.PARAMETER_NAME = 'Implied Decimel';

  FOR REC_BILLING_FEED IN CUR_ES_BILLING_FEED LOOP
    V_PARENT_ACCOUNT_ID := REC_BILLING_FEED.PARENT_ACCOUNT_ID;
    V_HOME_ACC_ID       := REC_BILLING_FEED.HOME_SYS_ACCOUNT_ID;
    V_ACTION_CODE       := REC_BILLING_FEED.IS_ACTIVE;
    HBS_COUNT           := 0;
    IF V_ACTION_CODE <> 1 THEN
    
      SELECT COUNT(*)
        INTO HBS_COUNT
        FROM   NL_ES_HOME_SYS_ACCOUNT H
       WHERE H.IS_ACTIVE = 1 AND H.HOME_SYS_ACCOUNT_ID = V_HOME_ACC_ID;
    END IF;
    IF HBS_COUNT = 0 THEN
    
      CASE V_ACTION_CODE
        WHEN 1 THEN
          V_ACTION_CODE := 'A';
        WHEN 4 THEN
          V_ACTION_CODE := 'D';
        WHEN 5 THEN
          V_ACTION_CODE := 'D';
      END CASE;
      IF V_COUNT = 0 THEN
        --the name of the file which will store payment feed
        FILENAME_FEED := '  NL_ES_' || TO_CHAR(SYSDATE, 'DDMMYYYYHH24MISS') ||
                         '.txt';
        V_FILEHANDLE  := UTL_FILE.FOPEN('ES_BILLING_FEED',
                                        FILENAME_FEED,
                                        'a');
      
      END IF;
      UTL_FILE.PUTF(V_FILEHANDLE,
                    V_PARENT_ACCOUNT_ID || ',' || V_HOME_ACC_ID || ',' ||
                    V_EFFECTIVE_DT || ',' || V_ACTION_CODE);
    
      UTL_FILE.NEW_LINE(V_FILEHANDLE);
      V_COUNT := V_COUNT + 1;
    
    END IF;
    COMMIT;
  END LOOP;
  --closing the filehandle for the feed file
  UTL_FILE.FCLOSE(V_FILEHANDLE);
  --exception handling

EXCEPTION
  WHEN NO_DATA_FOUND THEN
    ROLLBACK;
    V_ERRCODE := SQLCODE;
    V_ERRMSG  := SQLERRM;
    INSERT INTO   NL_ES_ERROR_LOG
      (MODULE_NAME, ERROR_CODE, ERROR_MSG, ERROR_DATETIME)
    VALUES
      ('BILLING ES Feed', V_ERRCODE, V_ERRMSG, SYSDATE);
    COMMIT;
  WHEN CASE_NOT_FOUND THEN
    ROLLBACK;
    V_ERRCODE := SQLCODE;
    V_ERRMSG  := SQLERRM;
    INSERT INTO   NL_ES_ERROR_LOG
      (MODULE_NAME, ERROR_CODE, ERROR_MSG, ERROR_DATETIME)
    VALUES
      ('BILLING ES Feed', V_ERRCODE, V_ERRMSG, SYSDATE);
    COMMIT;
  WHEN CURSOR_ALREADY_OPEN THEN
    ROLLBACK;
    V_ERRCODE := SQLCODE;
    V_ERRMSG  := SQLERRM;
    INSERT INTO   NL_ES_ERROR_LOG
      (MODULE_NAME, ERROR_CODE, ERROR_MSG, ERROR_DATETIME)
    VALUES
      ('BILLING ES Feed', V_ERRCODE, V_ERRMSG, SYSDATE);
    COMMIT;
  WHEN DUP_VAL_ON_INDEX THEN
    ROLLBACK;
    V_ERRCODE := SQLCODE;
    V_ERRMSG  := SQLERRM;
    INSERT INTO   NL_ES_ERROR_LOG
      (MODULE_NAME, ERROR_CODE, ERROR_MSG, ERROR_DATETIME)
    VALUES
      ('BILLING ES Feed', V_ERRCODE, V_ERRMSG, SYSDATE);
    COMMIT;
  WHEN INVALID_CURSOR THEN
    ROLLBACK;
    V_ERRCODE := SQLCODE;
    V_ERRMSG  := SQLERRM;
    INSERT INTO   NL_ES_ERROR_LOG
      (MODULE_NAME, ERROR_CODE, ERROR_MSG, ERROR_DATETIME)
    VALUES
      ('BILLING ES Feed', V_ERRCODE, V_ERRMSG, SYSDATE);
    COMMIT;
  WHEN TOO_MANY_ROWS THEN
    ROLLBACK;
    V_ERRCODE := SQLCODE;
    V_ERRMSG  := SQLERRM;
    INSERT INTO   NL_ES_ERROR_LOG
      (MODULE_NAME, ERROR_CODE, ERROR_MSG, ERROR_DATETIME)
    VALUES
      ('BILLING ES Feed', V_ERRCODE, V_ERRMSG, SYSDATE);
    COMMIT;
  WHEN OTHERS THEN
    ROLLBACK;
    V_ERRCODE := SQLCODE;
    V_ERRMSG  := SQLERRM;
    INSERT INTO   NL_ES_ERROR_LOG
      (MODULE_NAME, ERROR_CODE, ERROR_MSG, ERROR_DATETIME)
    VALUES
      ('BILLING ES Feed', V_ERRCODE, V_ERRMSG, SYSDATE);
    COMMIT;
  
END SP_GEN_ES_BILLING_FEED;
========SP_GEN_ES_PMS_FEED
CREATE OR REPLACE PROCEDURE ESTAPLE.sp_gen_es_pms_feed (P_bill_cycle_date IN DATE)
 AS

  --version 1.0
  --created by - Abhilasha Saxena(313274)
  --Purpose - To give HBS  Details to PMS to block HBS payments

  v_filehandle  utl_file.file_type;
  filename_feed VARCHAR2(50);
  --fetches the ES invoice details 
  CURSOR cur_es_pms_feed IS
    SELECT --b.account_id, 
     b.home_sys_account_id
      FROM   NL_es_home_sys_account b
     WHERE b.is_active NOT IN (3, 4, 5) AND
           /* b.home_sys_account_id not in
           ('1004854941', '1004855929', '1004854943', '1004780473',
            '1004886892', '1004845862', '1004862513')*/
              b.enrollment_date <P_bill_cycle_date;

  -- v_parent_account_id   NL_es_home_sys_account.account_id%TYPE;
  v_home_acc_id       NL_es_home_sys_account.home_sys_account_id%TYPE;
  v_count           NUMBER;
  v_implied_decimel   NL_es_parameters.int_value%TYPE;
  v_errcode         VARCHAR2(500);
  v_errmsg          VARCHAR2(500);
BEGIN
  --initializing the feed file line counter
  v_count := 0;

  SELECT bp.int_value
    INTO v_implied_decimel
    FROM   NL_es_parameters bp
   WHERE bp.module_name LIKE '%ES%' AND
         bp.parameter_name = 'Implied Decimel';

  FOR rec_pms_feed IN cur_es_pms_feed LOOP
    v_home_acc_id := rec_pms_feed.home_sys_account_id;
    IF v_count = 0 THEN
      --the name of the file which will store payment feed
      filename_feed := 'es_account_' ||
                       to_char(SYSDATE, 'DDMMYYYYHH24MISS') || '.csv';
      v_filehandle  := utl_file.fopen('PMS_HBS_BLOCKING_DIR',
                                      filename_feed,
                                      'a');
    
    END IF;
    utl_file.putf(v_filehandle, v_home_acc_id);
  
    utl_file.new_line(v_filehandle);
    v_count := v_count + 1;
  
    COMMIT;
  END LOOP;
  --closing the filehandle for the feed file
  utl_file.fclose(v_filehandle);
  --exception handling

EXCEPTION
  WHEN no_data_found THEN
    ROLLBACK;
    v_errcode := SQLCODE;
    v_errmsg  := SQLERRM;
    INSERT INTO   NL_es_error_log
      (module_name, error_code, error_msg, error_datetime)
    VALUES
      ('PMS ES Invoice Feed', v_errcode, v_errmsg, SYSDATE);
    COMMIT;
  WHEN case_not_found THEN
    ROLLBACK;
    v_errcode := SQLCODE;
    v_errmsg  := SQLERRM;
    INSERT INTO   NL_es_error_log
      (module_name, error_code, error_msg, error_datetime)
    VALUES
      ('PMS ES Invoice Feed', v_errcode, v_errmsg, SYSDATE);
    COMMIT;
  WHEN cursor_already_open THEN
    ROLLBACK;
    v_errcode := SQLCODE;
    v_errmsg  := SQLERRM;
    INSERT INTO   NL_es_error_log
      (module_name, error_code, error_msg, error_datetime)
    VALUES
      ('PMS ES Invoice Feed', v_errcode, v_errmsg, SYSDATE);
    COMMIT;
  WHEN dup_val_on_index THEN
    ROLLBACK;
    v_errcode := SQLCODE;
    v_errmsg  := SQLERRM;
    INSERT INTO   NL_es_error_log
      (module_name, error_code, error_msg, error_datetime)
    VALUES
      ('PMS ES Invoice Feed', v_errcode, v_errmsg, SYSDATE);
    COMMIT;
  WHEN invalid_cursor THEN
    ROLLBACK;
    v_errcode := SQLCODE;
    v_errmsg  := SQLERRM;
    INSERT INTO   NL_es_error_log
      (module_name, error_code, error_msg, error_datetime)
    VALUES
      ('PMS ES Invoice Feed', v_errcode, v_errmsg, SYSDATE);
    COMMIT;
  WHEN too_many_rows THEN
    ROLLBACK;
    v_errcode := SQLCODE;
    v_errmsg  := SQLERRM;
    INSERT INTO   NL_es_error_log
      (module_name, error_code, error_msg, error_datetime)
    VALUES
      ('PMS ES Invoice Feed', v_errcode, v_errmsg, SYSDATE);
    COMMIT;
  WHEN OTHERS THEN
    ROLLBACK;
    v_errcode := SQLCODE;
    v_errmsg  := SQLERRM;
    INSERT INTO   NL_es_error_log
      (module_name, error_code, error_msg, error_datetime)
    VALUES
      ('PMS ES Invoice Feed', v_errcode, v_errmsg, SYSDATE);
    COMMIT;
  
END sp_gen_es_pms_feed;


===========SP_GEN_ES_HBS_PAYMENT_FEED

CREATE OR REPLACE PROCEDURE ESTAPLE.sp_gen_hbs_payment_feed AS
  v_parent_account_id   NL_es_home_sys_account.parent_account_id%TYPE;
  v_payment_amount      NL_es_hbs_payment.payment_amount%TYPE;
  v_count             NUMBER;
  v_filehandle        utl_file.file_type;
  v_date              VARCHAR2(20);
  filename            VARCHAR2(50);
  v_implied_decimel     NL_es_parameters.int_value%TYPE := NULL;
  v_batch_no          VARCHAR2(20);
  v_batch_date        VARCHAR2(12);
  v_transaction_id1   TIMESTAMP;
  v_transaction_id    VARCHAR2(50);
  v_transaction_id2   VARCHAR2(50);
  v_ssa_code          VARCHAR2(20);
  v_bank_name         VARCHAR2(20);
  v_instrument_no     VARCHAR2(20);
  v_micr_code         VARCHAR2(20);

  v_reversal_type     VARCHAR2(20);
  v_reason_code_name  VARCHAR2(20);
  v_late_payment_flag VARCHAR2(20);
  v_payment_method    VARCHAR2(6) := 'PDAL';
  v_paymnet_date      VARCHAR2(12);
  v_batch_timestamp   VARCHAR2(20);
  v_channel_name      VARCHAR2(9) := 'EStapling';
  v_remarks           VARCHAR2(9) := 'EStapling';
  v_currency_code     VARCHAR2(20) := 'INR';
  v_deposit_id        VARCHAR2(3) := '000';
  v_payment_type CONSTANT VARCHAR2(10) := 'Normal';
  CURSOR cur_get_hbs_payments IS
    SELECT b.parent_account_id, SUM(payment_amount) AS payment_mny
      FROM   NL_es_hbs_payment bh INNER JOIN   NL_es_home_sys_account b ON b.account_id = bh.account_id
     GROUP BY b.parent_account_id;

BEGIN
  v_count := 0;
  v_date  := to_char(SYSDATE, 'DDMMYYYYHH24MISS');
  SELECT bp.int_value
    INTO v_implied_decimel
    FROM   NL_es_parameters bp
   WHERE bp.module_name LIKE '%ES%' AND
         bp.parameter_name = 'Implied Decimel';
  FOR rec_get_hbs_payments IN cur_get_hbs_payments LOOP
  
    v_parent_account_id := rec_get_hbs_payments.parent_account_id;
    v_payment_amount    := rec_get_hbs_payments.payment_mny;
    IF (v_count = 0) THEN
      filename     := 'ES_DUMMY_PAYMENT_' || v_date || '.txt';
      v_filehandle := utl_file.fopen('PMS_ES_INVOICE_DIR', filename, 'w');
    END IF;
    SELECT systimestamp INTO v_transaction_id1 FROM dual;
    SELECT to_char(v_transaction_id1, 'DDMMYYYYHH24MISSFF5')
      INTO v_transaction_id2
      FROM dual;
  
    v_payment_amount := v_payment_amount / (10 ** v_implied_decimel);
    v_transaction_id := 'ES' || v_transaction_id2;
  
    SELECT to_char(v_transaction_id1, 'DDMMYYYYHH24MISS')
      INTO v_batch_timestamp
      FROM dual;
    SELECT to_char(SYSDATE, 'DD-MON-YYYY') INTO v_batch_date FROM dual;
    v_batch_no := 'BID' || v_batch_timestamp;


    SELECT ssa
      INTO v_ssa_code
      FROM   NL_es_account ea
     WHERE ea.account_id = v_parent_account_id;
  
    --v_ssa_code := pkg_es.ssa_code_es_parent;
    utl_file.putf(v_filehandle,
                  TRIM(' ' FROM v_batch_no) || ',' ||
                  TRIM(' ' FROM v_batch_date) || ',' || '18-MAY-2010' || ',' ||
                  v_parent_account_id || ',' || v_payment_amount || ',' ||
                  TRIM(' ' FROM v_transaction_id) || ',' ||
                  TRIM(' ' FROM v_ssa_code) || ',' ||
                  TRIM(' ' FROM v_bank_name) || ',' ||
                  TRIM(' ' FROM v_instrument_no) || ',' ||
                  TRIM(' ' FROM v_micr_code) || ',' ||
                  TRIM(' ' FROM v_currency_code) || ',' || v_payment_method || ',' ||
                  v_payment_type || ',' || TRIM(' ' FROM v_reversal_type) || ',' ||
                  TRIM(' ' FROM v_reason_code_name) || ',' ||
                  TRIM(' ' FROM v_late_payment_flag) || ',' ||
                  TRIM(' ' FROM v_remarks) || ',' || v_channel_name || ',' ||
                  v_deposit_id);
  
    utl_file.new_line(v_filehandle);
    v_count := v_count + 1;
  END LOOP;
  IF utl_file.is_open(v_filehandle) THEN
  
    --closing the filehandle for the feed file
  
    utl_file.fclose(v_filehandle);
  END IF;
END;
==========SP_GEN_MAPPING_DATA
create or replace procedure estaple.sp_gen_mapping_data is

  v_cust_ref       custeventsource.customer_ref@cdr_nz%TYPE;
  v_home_sys       accountattributes.home_sys_account_id@cdr_nz%TYPE;
  v_account_id     accountattributes.account_num@cdr_nz%TYPE;
  v_legacy_account accountattributes.legacy_system_account_num@cdr_nz%TYPE;
  v_last_bill_date account.last_bill_dtm@cdr_nz%TYPE;
  v_parent_id        NL_es_home_sys_account.parent_account_id%TYPE;
  V_ERR_NUM        NUMBER;
  V_ERR_MSG        VARCHAR2(570);

  cursor cur_custref is
    select distinct customer_ref
      from custeventsource@cdr_nz
     where event_source in
           ('07882222329', '07882221763', '07882221925', '07882221574',
            '07882221536', '07882222401', '07882221674', '07882221609',
            '07882221754', '07882221737', '07882221824', '07882221816',
            '07882221807', '07882222311', '07882221678', '07882295274',
            '07882285720', '07882221721');

  CURSOR cur_accattrib IS
    select account_num, legacy_system_account_num
      from accountattributes@cdr_nz
     where home_sys_account_id = v_home_sys;

  CURSOR cur_account IS
    select last_bill_dtm
      from account@cdr_nz
     where account_num = v_home_sys;

  CURSOR cur_parent IS
    select parent_account_id
      from   NL_es_home_sys_account
     where account_id = v_account_id;

BEGIN
  delete from   NL_es_mapping_temp;
  for rec_custref in cur_custref LOOP
    v_cust_ref := rec_custref.customer_ref;
    v_home_sys := v_cust_ref;
  
    for rec_accattrib in cur_accattrib LOOP
      v_account_id     := rec_accattrib.account_num;
      v_legacy_account := rec_accattrib.legacy_system_account_num;
    END LOOP;
    for rec_parent in cur_parent LOOP
      v_parent_id := rec_parent.parent_account_id;
    END LOOP;
    for rec_account in cur_account LOOP
      v_last_bill_date := rec_account.last_bill_dtm;
    END LOOP;
    insert into   NL_es_mapping_temp
      (parent_id,
       home_sys_account_id,
       legacy_sys_account_id,
       last_bill_dtm)
    values
      (v_parent_id, v_home_sys, v_legacy_account, v_last_bill_date);
  
    commit;
  
  END LOOP;

end sp_gen_mapping_data;
======SP_GEN_MISSED_BILL_ACCT_FEED
CREATE OR REPLACE PROCEDURE ESTAPLE.sp_gen_missed_bill_acct_feed(p_bill_cycle_date   NL_es_cdr_bill_inv_log.bill_cycle_date%TYPE /*,
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                           P_SSA             IN VARCHAR2*/) AS

  --version 1.0
  --created by - Sumit Arora(258075)
  --Purpose - To give parents and accounts whose billls have been missed.

  -- Variable Declaration
  v_filehandle          utl_file.file_type;
  v_account_id            NL_es_cdr_bill_inv_log.account_id%TYPE;
  v_parent_account_id     NL_es_cdr_bill_inv_log.parent_account_id%TYPE;
  v_home_sys_account_id   NL_es_home_sys_account.home_sys_account_id%TYPE;
  v_date                VARCHAR2(20);
  filename              VARCHAR2(50);
  v_count               NUMBER(10) := 0;
  v_err_num             NUMBER;
  v_err_msg             VARCHAR2(100);

  /*cursor cur_accounts to fetch the parent and child accouonts*/

  CURSOR cur_accounts IS
    SELECT DISTINCT log.parent_account_id,
                    log.account_id,
                    home_sys.home_sys_account_id
      FROM   NL_es_cdr_bill_inv_log log INNER JOIN   NL_es_home_sys_account home_sys ON log.account_id = home_sys.account_id
     WHERE log.fetch_status = 0 AND log.bill_cycle_date = p_bill_cycle_date AND
            is_active = 1;
BEGIN
  v_date := to_char(p_bill_cycle_date, 'YYYYMMDD');

  --open cursor cur_accounts
  OPEN cur_accounts;
  LOOP
    FETCH cur_accounts
      INTO v_parent_account_id, v_account_id, v_home_sys_account_id;
    EXIT WHEN cur_accounts%NOTFOUND;
    IF v_count = 0 THEN
      filename     := 'es_missed_bill_acct_' || v_date || '.csv';
      v_filehandle := utl_file.fopen('BIF_DIR_MISSED_BILL', filename, 'w');
      utl_file.putf(v_filehandle,
                    'ES_PARENT_ID' || ',' || 'ES_CHILD_ID' || ',' ||
                    'HBS_ACCOUNT_ID' || ',' || 'BILL_CYCLE_DATE');
      utl_file.new_line(v_filehandle);
    END IF;
  
    utl_file.putf(v_filehandle,
                  lpad(TRIM(' ' FROM v_parent_account_id), 10) || ',' ||
                  lpad(TRIM(' ' FROM v_account_id), 10) || ',' ||
                  lpad(TRIM(' ' FROM v_home_sys_account_id), 10) || ',' ||
                  lpad(TRIM(' ' FROM p_bill_cycle_date), 9));
  
    utl_file.new_line(v_filehandle);
    v_count := v_count + 1;
  
  END LOOP;
  COMMIT;
  IF utl_file.is_open(v_filehandle) THEN
  
    --closing the filehandle for the feed file
  
    utl_file.fclose(v_filehandle);
  END IF;
  --Exception Handling
EXCEPTION

  WHEN no_data_found THEN
    v_err_num := SQLCODE;
    v_err_msg := 'Error in missed bill feed' || filename ||
                 substr(SQLCODE, 1, 100);
    --Inserting into   NL_es_error_log
    INSERT INTO   NL_es_error_log
      (module_name, error_msg, error_datetime, error_code)
    VALUES
      ('', v_err_msg, SYSDATE, v_err_num);
    COMMIT;
  
  WHEN utl_file.invalid_path THEN
    v_err_num := SQLCODE;
    v_err_msg := 'Error in missed bill feed:, Invalid Path:' || filename ||
                 substr(SQLCODE, 1, 100);
    --Inserting into   NL_es_error_log
    INSERT INTO   NL_es_error_log
      (module_name, error_msg, error_datetime, error_code)
    VALUES
      ('Missed bill feed', v_err_msg, SYSDATE, v_err_num);
    COMMIT;
  
  WHEN utl_file.invalid_mode THEN
    v_err_num := SQLCODE;
    v_err_msg := 'Error in missed bill feed, Invalid Mode:' || filename ||
                 substr(SQLCODE, 1, 100);
    --Inserting into   NL_es_error_log
    INSERT INTO   NL_es_error_log
      (module_name, error_msg, error_datetime, error_code)
    VALUES
      ('Missed bill feed', v_err_msg, SYSDATE, v_err_num);
    COMMIT;
  
  WHEN utl_file.invalid_filehandle THEN
    v_err_num := SQLCODE;
    v_err_msg := 'Error in missed bill feed:,Invalid Filehandle:' ||
                 filename || substr(SQLCODE, 1, 100);
    --Inserting into   NL_es_error_log
    INSERT INTO   NL_es_error_log
      (module_name, error_msg, error_datetime, error_code)
    VALUES
      ('Missed bill feed', v_err_msg, SYSDATE, v_err_num);
    COMMIT;
  
  WHEN utl_file.invalid_operation THEN
    v_err_num := SQLCODE;
    v_err_msg := 'Error in missed bill feed, Invalid Operation:' ||
                 filename || substr(SQLCODE, 1, 100);
    --Inserting into   NL_es_error_log
    INSERT INTO   NL_es_error_log
      (module_name, error_msg, error_datetime, error_code)
    VALUES
      ('Missed bill feed', v_err_msg, SYSDATE, v_err_num);
    COMMIT;
  
  WHEN utl_file.read_error THEN
    v_err_num := SQLCODE;
    v_err_msg := 'Error in missed bill feed:, Read Error:' || filename ||
                 substr(SQLCODE, 1, 100);
    --Inserting into   NL_es_error_log
    INSERT INTO   NL_es_error_log
      (module_name, error_msg, error_datetime, error_code)
    VALUES
      ('Missed bill feed', v_err_msg, SYSDATE, v_err_num);
    COMMIT;
  
  WHEN utl_file.write_error THEN
    v_err_num := SQLCODE;
    v_err_msg := 'Error in missed bill feed:, Write Error:' || filename ||
                 substr(SQLCODE, 1, 100);
    --Inserting into   NL_es_error_log
    INSERT INTO   NL_es_error_log
      (module_name, error_msg, error_datetime, error_code)
    VALUES
      ('Missed bill feed', v_err_msg, SYSDATE, v_err_num);
    COMMIT;
  
  WHEN utl_file.internal_error THEN
    v_err_num := SQLCODE;
    v_err_msg := 'Error in missed bill feed:, Internal Error:' || filename ||
                 substr(SQLCODE, 1, 100);
    --Inserting into   NL_es_error_log
    INSERT INTO   NL_es_error_log
      (module_name, error_msg, error_datetime, error_code)
    VALUES
      ('Missed bill feed', v_err_msg, SYSDATE, v_err_num);
    COMMIT;
  
  WHEN OTHERS THEN
    v_err_num := SQLCODE;
    v_err_msg := 'Error in missed bill feed:' || filename ||
                 substr(SQLCODE, 1, 100);
    --Inserting into   NL_es_error_log
    INSERT INTO   NL_es_error_log
      (module_name, error_msg, error_datetime, error_code)
    VALUES
      ('Missed bill feed', v_err_msg, SYSDATE, v_err_num);
    COMMIT;
  
  --end of sp_gen_discount_gsm_feed procedure
  --insert into   NL_es_feed_status (
END sp_gen_missed_bill_acct_feed;
==============SP_GEN_PMS_INVOICE_FEE
CREATE OR REPLACE PROCEDURE ESTAPLE.sp_gen_pms_invoice_feed(p_actual_bill_date DATE) AS

  --version 1.0
  --created by - Sumit Arora(258075)
  --Purpose - To generate invoice feed for Es parent accounts

  v_filehandle utl_file.file_type;
  filename     VARCHAR2(50);

  --fetches the ES invoice details 
  CURSOR cur_pms_feed IS
    SELECT c.customer_ref   customer_ref,
           a.account_num    account_num,
           ata.account_type account_category,
           
           bi.bill_seq invoice_seq_no,
           --bi.invoice_net_mny invoice_amount,
           bi.balance_out_mny outstanding_bal,
           bi.payment_due_dat payment_due_date,
           bi.actual_bill_dtm invoice_date,
           b.legacy_system_account_num AS group_id,
           ata.circle_code circle_code,
           bi.invoice_num,
           b.ssa ssa_code
      FROM customer@cdr_nz c INNER JOIN account@cdr_nz a ON c.customer_ref = a.customer_ref INNER JOIN   NL_es_account b ON a.account_num = b.account_id INNER JOIN accountattributes@cdr_nz ata ON a.account_num = ata.account_num
           /*INNER JOIN contact@cdr_nz ct ON c.customer_ref = ct.customer_ref
                                                        INNER JOIN contacttype@cdr_nz ctt ON ctt.contact_type_id = ct.contact_type_id*/ INNER JOIN billsummary@cdr_nz bi ON a.account_num = bi.account_num
     WHERE 
     c.parent_customer_ref IS NULL AND 
           bi.bill_seq > b.last_invoice_seq_no AND
           TRIM(upper(ata.account_type)) IN
           (pkg_es.account_type_zonal_individual,
            pkg_es.account_type_zonal_corporate) AND
           TRIM(upper(ata.account_subtype)) = pkg_es.account_subtype_parent AND
           bi.bill_status = 1 AND b.ssa <> 'DUMMY' AND
           trunc(actual_bill_dtm) =
           nvl(p_actual_bill_date, trunc(SYSDATE - 1))
           ;

  v_account_id              NL_es_account.account_id%TYPE;
  v_customer_ref          customer.customer_ref@cdr_nz%TYPE;
  v_account_category      accountattributes.account_type@cdr_nz%TYPE;
  v_customer_name         VARCHAR2(85);
  v_invoice_seq           billsummary.bill_seq@cdr_nz%TYPE;
  v_invoice_number        billsummary.invoice_num@cdr_nz%TYPE;
  v_invoice_amt           billsummary.balance_out_mny@cdr_nz%TYPE;
  v_outstanding_amt       billsummary.balance_out_mny@cdr_nz%TYPE;
  v_invoice_date          billsummary.actual_bill_dtm@cdr_nz%TYPE;
  v_pay_due_date          billsummary.payment_due_dat@cdr_nz%TYPE;
  v_payment_method        paymentmethod.payment_method_name@cdr_nz%TYPE;
  v_payment_method_id     paymentmethod.payment_method_id@cdr_nz%TYPE;
  v_invoice_amount1       NUMBER(18, 2);
  v_invoice_amount2       VARCHAR2(20);
  v_outstanding_amt1      NUMBER(18, 2);
  v_outstanding_amt2      VARCHAR2(20);
  v_bank_provided_id      VARCHAR2(50);
  v_mandate_attr2         VARCHAR2(50);
  v_bank_name             VARCHAR2(50);
  v_branch_micr_code      VARCHAR2(50);
  v_bank_acc_num          VARCHAR2(50);
  v_bank_acc_type         VARCHAR2(50);
  v_circle_code_es_parent VARCHAR2(30);
  --pkg_es.circle_code_es_parent;
  v_ssa_code_es_parent VARCHAR2(30);
  --pkg_es.ssa_code_es_parent;
  v_group_id   NL_es_account.legacy_system_account_num%TYPE;
  --variable used for exception handling 
  v_errcode NUMBER;

  --variable used to store the error message.
  v_errmsg VARCHAR2(570);

  --v_count variable to track the lines in the PMS feed file. 
  v_count           NUMBER(10);
  v_implied_decimel   NL_es_parameters.int_value%TYPE := NULL;

BEGIN

  --initializing the feed file line counter
  v_count := 0;

  SELECT bp.int_value
    INTO v_implied_decimel
    FROM   NL_es_parameters bp
   WHERE bp.module_name LIKE '%ES%' AND
         bp.parameter_name = 'Implied Decimel';

  FOR rec_pms_feed IN cur_pms_feed LOOP
  
    v_bank_provided_id := NULL;
    v_bank_name        := NULL;
    v_branch_micr_code := NULL;
    v_bank_acc_num     := NULL;
    v_bank_acc_type    := NULL;
    v_customer_ref     := rec_pms_feed.customer_ref;
    v_account_id       := rec_pms_feed.account_num;
    v_account_category := TRIM(rec_pms_feed.account_category);
    /*v_customer_name    := TRIM(rec_pms_feed.customer_name);*/
    v_invoice_seq := rec_pms_feed.invoice_seq_no;
    --v_invoice_amt      := rec_pms_feed.invoice_amount;
    v_outstanding_amt       := rec_pms_feed.outstanding_bal;
    v_invoice_date          := rec_pms_feed.invoice_date;
    v_pay_due_date          := rec_pms_feed.payment_due_date;
    v_group_id              := rec_pms_feed.group_id;
    v_circle_code_es_parent := rec_pms_feed.circle_code;
    v_ssa_code_es_parent    := rec_pms_feed.ssa_code;
    v_invoice_number        := rec_pms_feed.invoice_num;
  
    --Invoice amount in invoice feed is same as the outsanding
    v_invoice_amt := v_outstanding_amt;
  
    SELECT ad.payment_method_id
      INTO v_payment_method_id
      FROM accountdetails@cdr_nz ad
     WHERE account_num = v_account_id
     AND END_DAT IS NULL
     GROUP BY payment_method_id;
  
    SELECT pm.payment_method_name
      INTO v_payment_method
      FROM paymentmethod@cdr_nz pm
     WHERE pm.payment_method_id = v_payment_method_id;
  
  
    SELECT circle_name
      INTO v_circle_code_es_parent
      FROM   NL_ssa_circle_map
     WHERE ssa_name = v_ssa_code_es_parent;
  
    BEGIN
      SELECT address_name
        INTO v_customer_name
        FROM contact@cdr_nz
       WHERE customer_ref = v_customer_ref AND
             contact_seq IN
             (SELECT MAX(contact_seq)
                FROM contact@cdr_nz
               WHERE customer_ref = v_customer_ref AND
                     TRIM(address_name) IS NOT NULL);
    EXCEPTION
      WHEN no_data_found THEN
        BEGIN
          SELECT nvl(first_name || last_name, '.')
            INTO v_customer_name
            FROM contact@cdr_nz
           WHERE customer_ref = v_customer_ref AND
                 contact_seq IN
                 (SELECT billing_contact_seq
                    FROM accountdetails@cdr_nz
                   WHERE account_num = v_account_id AND end_dat IS NULL);
        EXCEPTION
          WHEN no_data_found THEN
            ROLLBACK;
            v_errcode := SQLCODE;
            v_errmsg  := SQLERRM;
            INSERT INTO   NL_es_error_log
              (module_name, error_code, error_msg, error_datetime)
            VALUES
              ('PMS Invoice Feed',
               v_errcode,
               v_errmsg || 'customer name is missing',
               SYSDATE);
            COMMIT;
        END;
    END;
    BEGIN
    
/*      SELECT decode(bank_account_number,
             bank_branch_number,
             mandate_attr_1,
             mandate_attr_2
        INTO v_bank_acc_num,
             v_branch_micr_code,
             v_bank_name,
             v_mandate_attr2
        FROM prmandate@cdr_nz
       WHERE account_num = v_account_id AND
             payment_method_id = v_payment_method_id;*/
select DECODE(PAYMENT_METHOD_id,
                6,ipf_admin.data_security.decryptandgetclear_1@cdr_nz('RB_PRMANDATE_BANK_ACCOUNT_NUMBER',BANK_ACCOUNT_NUMBER) ,
                12,ipf_admin.data_security.decryptandgetclear_1@cdr_nz('RB_PRMANDATE_CARD_NUMBER',CARD_NUMBER),''),
                DECODE(6,6,P.Mandate_Attr_3,12,P.Mandate_Attr_3,'') ,
              
               DECODE(P.PAYMENT_METHOD_ID,6,P.MANDATE_ATTR_2,12,P.MANDATE_ATTR_2,''),
                DECODE(P.PAYMENT_METHOD_ID,6,P.MANDATE_ATTR_4,'') 
   into   v_bank_acc_num,v_bank_name   ,v_branch_micr_code,v_bank_acc_type
   
   
   
from prmandate@cdr_nz p
WHERE account_num = v_account_id AND
             payment_method_id = v_payment_method_id
             and (active_to_dat is null or active_to_dat >sysdate);
/*select DECODE(v_PAYMENT_METHOD_id,
                6,ipf_admin.data_security.decryptandgetclear_1@cdr_nz('RB_PRMANDATE_BANK_ACCOUNT_NUMBER',v_bank_acc_num),
                12,ipf_admin.data_security.decryptandgetclear_1@cdr_nz('RB_PRMANDATE_CARD_NUMBER',v_bank_acc_num),'')  ,
                DECODE(v_PAYMENT_METHOD_ID,6,P.Mandate_Attr_1,12,P.Mandate_Attr_1,'') ,
                DECODE(v_PAYMENT_METHOD_ID,6,P.MANDATE_ATTR_2,12,P.MANDATE_ATTR_2,'') ,
                DECODE(v_PAYMENT_METHOD_ID,6,P.MANDATE_ATTR_4,12,'','')
    into   v_bank_acc_num,v_bank_name   ,v_branch_micr_code,v_bank_acc_type
from prmandate@cdr_nz p;*/
  
    
   
     /* IF TRIM(upper(v_payment_method)) = 'ECS' THEN
        v_bank_acc_type := v_mandate_attr2;
      ELSIF TRIM(upper(v_payment_method)) = 'SICC' THEN
        v_bank_provided_id := v_mandate_attr2;
      END IF;*/
    
    EXCEPTION
      WHEN no_data_found THEN
        NULL;
      WHEN OTHERS THEN
        NULL;
    END;
  
    INSERT INTO   NL_es_pms_feed
      (customer_id,
       customer_name,
       account_num,
       invoice_seq_no,
       invoice_date,
       invoice_amt,
       tot_outstanding_amt,
       pay_due_date,
       customer_category,
       payment_type,
       bank_provider_id,
       bank_name,
       branch_micr_code,
       bank_account_no,
       bank_account_type,
       logged_date)
    VALUES
      (v_customer_ref,
       TRIM(v_customer_name),
       v_account_id,
       v_invoice_seq,
       v_invoice_date,
       v_invoice_amt,
       v_outstanding_amt,
       v_pay_due_date,
       v_account_category,
       v_payment_method,
       NULL,
       v_bank_name,
       v_branch_micr_code,
       v_bank_acc_num,
       v_bank_acc_type,
       SYSDATE);
    COMMIT;
  
    IF v_count = 0 THEN
      --the name of the file which will store payment feed
      filename     := 'es_invoice_' || to_char(SYSDATE, 'DDMMYYYYHH24MISS') ||
                      '.csv';
      v_filehandle := utl_file.fopen('PMS_ES_INVOICE_DIR', filename, 'a');
    
    END IF;
  
    v_invoice_amount1 := v_invoice_amt / (10 ** v_implied_decimel);
  
    SELECT TRIM(to_char(v_invoice_amount1, '9999999999999999.99'))
      INTO v_invoice_amount2
      FROM dual;
    v_outstanding_amt1 := v_outstanding_amt / (10 ** v_implied_decimel);
    SELECT TRIM(to_char(v_outstanding_amt1, '9999999999999999.99'))
      INTO v_outstanding_amt2
      FROM dual;
  
    utl_file.putf(v_filehandle,
                  '|:|' || v_customer_ref || '|:|!*!|:|' ||
                  TRIM(v_customer_name) || '|:|!*!|:|' || v_account_id ||
                  '|:|!*!|:|' || v_invoice_number || '|:|!*!|:|' ||
                  to_char(v_invoice_date, 'DD-MM-YYYY') || '|:|!*!|:|' ||
                  round(v_invoice_amount2, 0) || '|:|!*!|:|' ||
                  round(v_outstanding_amt2, 0) || '|:|!*!|:|' ||
                  to_char(v_pay_due_date, 'DD-MM-YYYY') || '|:|!*!|:|' ||
                  TRIM(v_ssa_code_es_parent) || '|:|!*!|:|' ||
                  TRIM(v_circle_code_es_parent) || '|:|!*!|:|' ||
                  TRIM(v_account_category) || '|:|!*!|:|' ||
                  TRIM(v_payment_method) || '|:|!*!|:|' ||
                  TRIM(v_bank_provided_id) || '|:|!*!|:|' ||
                  TRIM(v_bank_name) || '|:|!*!|:|' ||
                  TRIM(v_branch_micr_code) || '|:|!*!|:|' ||
                  TRIM(v_bank_acc_num) || '|:|!*!|:|' ||
                  TRIM(v_bank_acc_type) || '|:|!*!|:|' || TRIM(v_group_id) ||
                  '|:|!*!');
  
    utl_file.new_line(v_filehandle);
    v_count := v_count + 1;
  
    UPDATE   NL_es_pms_feed
       SET feed_name = filename
     WHERE trunc(logged_date) = trunc(SYSDATE) AND
           customer_id = v_customer_ref AND invoice_seq_no = v_invoice_seq;
  
    COMMIT;
  
  END LOOP;
  --closing the filehandle for the feed file
  utl_file.fclose(v_filehandle);

  --exception handling
EXCEPTION
  WHEN no_data_found THEN
    ROLLBACK;
    v_errcode := SQLCODE;
    v_errmsg  := SQLERRM;
    INSERT INTO   NL_es_error_log
      (module_name, error_code, error_msg, error_datetime)
    VALUES
      ('PMS Invoice Feed', v_errcode, v_errmsg, SYSDATE);
    COMMIT;
  WHEN case_not_found THEN
    ROLLBACK;
    v_errcode := SQLCODE;
    v_errmsg  := SQLERRM;
    INSERT INTO   NL_es_error_log
      (module_name, error_code, error_msg, error_datetime)
    VALUES
      ('PMS Invoice Feed', v_errcode, v_errmsg, SYSDATE);
    COMMIT;
  WHEN cursor_already_open THEN
    ROLLBACK;
    v_errcode := SQLCODE;
    v_errmsg  := SQLERRM;
    INSERT INTO   NL_es_error_log
      (module_name, error_code, error_msg, error_datetime)
    VALUES
      ('PMS Invoice Feed', v_errcode, v_errmsg, SYSDATE);
    COMMIT;
  WHEN dup_val_on_index THEN
    ROLLBACK;
    v_errcode := SQLCODE;
    v_errmsg  := SQLERRM;
    INSERT INTO   NL_es_error_log
      (module_name, error_code, error_msg, error_datetime)
    VALUES
      ('PMS Invoice Feed', v_errcode, v_errmsg, SYSDATE);
    COMMIT;
  WHEN invalid_cursor THEN
    ROLLBACK;
    v_errcode := SQLCODE;
    v_errmsg  := SQLERRM;
    INSERT INTO   NL_es_error_log
      (module_name, error_code, error_msg, error_datetime)
    VALUES
      ('PMS Invoice Feed', v_errcode, v_errmsg, SYSDATE);
    COMMIT;
  WHEN too_many_rows THEN
    ROLLBACK;
    v_errcode := SQLCODE;
    v_errmsg  := SQLERRM;
    INSERT INTO   NL_es_error_log
      (module_name, error_code, error_msg, error_datetime)
    VALUES
      ('PMS Invoice Feed', v_errcode, v_errmsg, SYSDATE);
    COMMIT;
  WHEN OTHERS THEN
    ROLLBACK;
    v_errcode := SQLCODE;
    v_errmsg  := SQLERRM;
    INSERT INTO   NL_es_error_log
      (module_name, error_code, error_msg, error_datetime)
    VALUES
      ('PMS Invoice Feed', v_errcode, v_errmsg, SYSDATE);
    COMMIT;
END sp_gen_pms_invoice_feed;
=============sp_gen_pms_invoice_SSA
CREATE OR REPLACE PROCEDURE ESTAPLE.SP_GEN_PMS_INVOICE_FEED_SSA(P_SSA_CODE IN VARCHAR2) AS

  --Author: 230328
  --Brief Info: the procedure creates invoice feed for Es parent accounts
  --version :1.7
  /* last modified by 230328
  date :Sept 24,2009
  Changed the delimiter as  requested by PMS
  */

  V_FILEHANDLE UTL_FILE.FILE_TYPE;
  FILENAME     VARCHAR2(50);

  --fetches the ES invoice details 
  CURSOR CUR_PMS_FEED IS
    SELECT DISTINCT C.CUSTOMER_REF CUSTOMER_REF,
                    A.ACCOUNT_NUM ACCOUNT_NUM,
                    ATA.ACCOUNT_TYPE ACCOUNT_CATEGORY,
                    CT.FIRST_NAME || ' ' || CT.LAST_NAME CUSTOMER_NAME,
                    BI.BILL_SEQ INVOICE_SEQ_NO,
                    --bi.invoice_net_mny invoice_amount,
                    BI.BALANCE_OUT_MNY          OUTSTANDING_BAL,
                    BI.PAYMENT_DUE_DAT          PAYMENT_DUE_DATE,
                    BI.ACTUAL_BILL_DTM          INVOICE_DATE,
                    B.LEGACY_SYSTEM_ACCOUNT_NUM AS GROUP_ID,
                    ATA.CIRCLE_CODE             CIRCLE_CODE,
                    ATA.SSA_CODE                SSA_CODE
      FROM CUSTOMER@CDR_NZ C INNER JOIN ACCOUNT@CDR_NZ A ON C.CUSTOMER_REF = A.CUSTOMER_REF INNER JOIN   NL_ES_ACCOUNT B ON A.ACCOUNT_NUM = B.ACCOUNT_ID INNER JOIN ACCOUNTATTRIBUTES@CDR_NZ ATA ON A.ACCOUNT_NUM = ATA.ACCOUNT_NUM INNER JOIN CONTACT@CDR_NZ CT ON C.CUSTOMER_REF = CT.CUSTOMER_REF INNER JOIN CONTACTTYPE@CDR_NZ CTT ON CTT.CONTACT_TYPE_ID = CT.CONTACT_TYPE_ID INNER JOIN BILLSUMMARY@CDR_NZ BI ON A.ACCOUNT_NUM = BI.ACCOUNT_NUM
     WHERE C.PARENT_CUSTOMER_REF IS NULL AND
          --bi.bill_seq > b.last_invoice_seq_no AND
           TRIM(UPPER(ATA.ACCOUNT_TYPE)) IN
           (PKG_ES.ACCOUNT_TYPE_ZONAL_INDIVIDUAL,
            PKG_ES.ACCOUNT_TYPE_ZONAL_CORPORATE) AND
           TRIM(UPPER(ATA.ACCOUNT_SUBTYPE)) = PKG_ES.ACCOUNT_SUBTYPE_PARENT AND
           TRIM(UPPER(CTT.CONTACT_TYPE_NAME)) = 'BILLING CONTACT' AND
           BILL_DTM = TO_DATE('01-01-2011', 'dd-mm-yyyy') AND
           B.SSA = P_SSA_CODE AND BI.BILL_STATUS = 1;

  V_ACCOUNT_ID              NL_ES_ACCOUNT.ACCOUNT_ID%TYPE;
  V_CUSTOMER_REF          CUSTOMER.CUSTOMER_REF@CDR_NZ%TYPE;
  V_ACCOUNT_CATEGORY      ACCOUNTATTRIBUTES.ACCOUNT_TYPE@CDR_NZ%TYPE;
  V_CUSTOMER_NAME         VARCHAR2(85);
  V_INVOICE_SEQ           BILLSUMMARY.BILL_SEQ@CDR_NZ%TYPE;
  V_INVOICE_AMT           BILLSUMMARY.BALANCE_OUT_MNY@CDR_NZ%TYPE;
  V_OUTSTANDING_AMT       BILLSUMMARY.BALANCE_OUT_MNY@CDR_NZ%TYPE;
  V_INVOICE_DATE          BILLSUMMARY.ACTUAL_BILL_DTM@CDR_NZ%TYPE;
  V_PAY_DUE_DATE          BILLSUMMARY.PAYMENT_DUE_DAT@CDR_NZ%TYPE;
  V_PAYMENT_METHOD        PAYMENTMETHOD.PAYMENT_METHOD_NAME@CDR_NZ%TYPE;
  V_PAYMENT_METHOD_ID     PAYMENTMETHOD.PAYMENT_METHOD_ID@CDR_NZ%TYPE;
  V_INVOICE_AMOUNT1       NUMBER(18, 2);
  V_INVOICE_AMOUNT2       VARCHAR2(20);
  V_OUTSTANDING_AMT1      NUMBER(18, 2);
  V_OUTSTANDING_AMT2      VARCHAR2(20);
  V_BANK_PROVIDED_ID      VARCHAR2(50);
  V_MANDATE_ATTR2         VARCHAR2(50);
  V_BANK_NAME             VARCHAR2(50);
  V_BRANCH_MICR_CODE      VARCHAR2(50);
  V_BANK_ACC_NUM          VARCHAR2(50);
  V_BANK_ACC_TYPE         VARCHAR2(5);
  V_CIRCLE_CODE_ES_PARENT VARCHAR2(30);
  --pkg_es.circle_code_es_parent;
  V_SSA_CODE_ES_PARENT VARCHAR2(30);
  --pkg_es.ssa_code_es_parent;
  V_GROUP_ID   NL_ES_ACCOUNT.LEGACY_SYSTEM_ACCOUNT_NUM%TYPE;
  --variable used for exception handling 
  V_ERRCODE NUMBER;

  --variable used to store the error message.
  V_ERRMSG VARCHAR2(570);

  --v_count variable to track the lines in the PMS feed file. 
  V_COUNT           NUMBER(10);
  V_IMPLIED_DECIMEL   NL_ES_PARAMETERS.INT_VALUE%TYPE := NULL;

BEGIN

  --initializing the feed file line counter
  V_COUNT := 0;

  SELECT BP.INT_VALUE
    INTO V_IMPLIED_DECIMEL
    FROM   NL_ES_PARAMETERS BP
   WHERE BP.MODULE_NAME LIKE '%ES%' AND
         BP.PARAMETER_NAME = 'Implied Decimel';

  FOR REC_PMS_FEED IN CUR_PMS_FEED LOOP
  
    V_BANK_PROVIDED_ID := NULL;
    V_BANK_NAME        := NULL;
    V_BRANCH_MICR_CODE := NULL;
    V_BANK_ACC_NUM     := NULL;
    V_BANK_ACC_TYPE    := NULL;
    V_CUSTOMER_REF     := REC_PMS_FEED.CUSTOMER_REF;
    V_ACCOUNT_ID       := REC_PMS_FEED.ACCOUNT_NUM;
    V_ACCOUNT_CATEGORY := TRIM(REC_PMS_FEED.ACCOUNT_CATEGORY);
    V_CUSTOMER_NAME    := TRIM(REC_PMS_FEED.CUSTOMER_NAME);
    V_INVOICE_SEQ      := REC_PMS_FEED.INVOICE_SEQ_NO;
    --v_invoice_amt      := rec_pms_feed.invoice_amount;
    V_OUTSTANDING_AMT       := REC_PMS_FEED.OUTSTANDING_BAL;
    V_INVOICE_DATE          := REC_PMS_FEED.INVOICE_DATE;
    V_PAY_DUE_DATE          := REC_PMS_FEED.PAYMENT_DUE_DATE;
    V_GROUP_ID              := REC_PMS_FEED.GROUP_ID;
    V_CIRCLE_CODE_ES_PARENT := REC_PMS_FEED.CIRCLE_CODE;
    V_SSA_CODE_ES_PARENT    := REC_PMS_FEED.SSA_CODE;
  
    --Invoice amount in invoice feed is same as the outsanding
    V_INVOICE_AMT := V_OUTSTANDING_AMT;
  
    SELECT AD.PAYMENT_METHOD_ID
      INTO V_PAYMENT_METHOD_ID
      FROM ACCOUNTDETAILS@CDR_NZ AD
     WHERE ACCOUNT_NUM = V_ACCOUNT_ID
     GROUP BY PAYMENT_METHOD_ID;
  
    SELECT PM.PAYMENT_METHOD_NAME
      INTO V_PAYMENT_METHOD
      FROM PAYMENTMETHOD@CDR_NZ PM
     WHERE PM.PAYMENT_METHOD_ID = V_PAYMENT_METHOD_ID;
  
    BEGIN
    
      SELECT BANK_ACCOUNT_NUMBER,
             BANK_BRANCH_NUMBER,
             MANDATE_ATTR_1,
             MANDATE_ATTR_2
        INTO V_BANK_ACC_NUM,
             V_BRANCH_MICR_CODE,
             V_BANK_NAME,
             V_MANDATE_ATTR2
        FROM PRMANDATE@CDR_NZ
       WHERE ACCOUNT_NUM = V_ACCOUNT_ID AND
             PAYMENT_METHOD_ID = V_PAYMENT_METHOD_ID;
    
      IF TRIM(UPPER(V_PAYMENT_METHOD)) = 'ECS' THEN
        V_BANK_ACC_TYPE := V_MANDATE_ATTR2;
      ELSIF TRIM(UPPER(V_PAYMENT_METHOD)) = 'SICC' THEN
        V_BANK_PROVIDED_ID := V_MANDATE_ATTR2;
      END IF;
    
    EXCEPTION
      WHEN NO_DATA_FOUND THEN
        NULL;
      WHEN OTHERS THEN
        NULL;
    END;
  
    INSERT INTO   NL_ES_PMS_FEED
      (CUSTOMER_ID,
       CUSTOMER_NAME,
       ACCOUNT_NUM,
       INVOICE_SEQ_NO,
       INVOICE_DATE,
       INVOICE_AMT,
       TOT_OUTSTANDING_AMT,
       PAY_DUE_DATE,
       CUSTOMER_CATEGORY,
       PAYMENT_TYPE,
       BANK_PROVIDER_ID,
       BANK_NAME,
       BRANCH_MICR_CODE,
       BANK_ACCOUNT_NO,
       BANK_ACCOUNT_TYPE)
    VALUES
      (V_CUSTOMER_REF,
       V_CUSTOMER_NAME,
       V_ACCOUNT_ID,
       V_INVOICE_SEQ,
       V_INVOICE_DATE,
       V_INVOICE_AMT,
       V_OUTSTANDING_AMT,
       V_PAY_DUE_DATE,
       V_ACCOUNT_CATEGORY,
       V_PAYMENT_METHOD,
       NULL,
       NULL,
       NULL,
       NULL,
       NULL);
    COMMIT;
  
    IF V_COUNT = 0 THEN
      --the name of the file which will store payment feed
      FILENAME     := 'es_invoice_' || TO_CHAR(SYSDATE, 'DDMMYYYYHH24MISS') ||
                      '.csv';
      V_FILEHANDLE := UTL_FILE.FOPEN('PMS_ES_INVOICE_DIR', FILENAME, 'a');
    
    END IF;
  
    V_INVOICE_AMOUNT1 := V_INVOICE_AMT / (10 ** V_IMPLIED_DECIMEL);
  
    SELECT TRIM(TO_CHAR(V_INVOICE_AMOUNT1, '9999999999999999.99'))
      INTO V_INVOICE_AMOUNT2
      FROM DUAL;
    V_OUTSTANDING_AMT1 := V_OUTSTANDING_AMT / (10 ** V_IMPLIED_DECIMEL);
    SELECT TRIM(TO_CHAR(V_OUTSTANDING_AMT1, '9999999999999999.99'))
      INTO V_OUTSTANDING_AMT2
      FROM DUAL;
  
    UTL_FILE.PUTF(V_FILEHANDLE,
                  '|:|' || V_CUSTOMER_REF || '|:|!*!|:|' ||
                  TRIM(V_CUSTOMER_NAME) || '|:|!*!|:|' || V_ACCOUNT_ID ||
                  '|:|!*!|:|' || V_INVOICE_SEQ || '|:|!*!|:|' ||
                  TO_CHAR(V_INVOICE_DATE, 'DD-MM-YYYY') || '|:|!*!|:|' ||
                  V_INVOICE_AMOUNT2 || '|:|!*!|:|' || V_OUTSTANDING_AMT2 ||
                  '|:|!*!|:|' || TO_CHAR(V_PAY_DUE_DATE, 'DD-MM-YYYY') ||
                  '|:|!*!|:|' || TRIM(V_SSA_CODE_ES_PARENT) || '|:|!*!|:|' ||
                  TRIM(V_CIRCLE_CODE_ES_PARENT) || '|:|!*!|:|' ||
                  TRIM(V_ACCOUNT_CATEGORY) || '|:|!*!|:|' ||
                  TRIM(V_PAYMENT_METHOD) || '|:|!*!|:|' ||
                  TRIM(V_BANK_PROVIDED_ID) || '|:|!*!|:|' ||
                  TRIM(V_BANK_NAME) || '|:|!*!|:|' ||
                  TRIM(V_BRANCH_MICR_CODE) || '|:|!*!|:|' ||
                  TRIM(V_BANK_ACC_NUM) || '|:|!*!|:|' ||
                  TRIM(V_BANK_ACC_TYPE) || '|:|!*!' || TRIM(V_GROUP_ID) ||
                  '|:|!*!');
  
    UTL_FILE.NEW_LINE(V_FILEHANDLE);
    V_COUNT := V_COUNT + 1;
  
    COMMIT;
  
  END LOOP;
  --closing the filehandle for the feed file
  UTL_FILE.FCLOSE(V_FILEHANDLE);

  --exception handling
EXCEPTION
  WHEN NO_DATA_FOUND THEN
    ROLLBACK;
    V_ERRCODE := SQLCODE;
    V_ERRMSG  := SQLERRM;
    INSERT INTO   NL_ES_ERROR_LOG
      (MODULE_NAME, ERROR_CODE, ERROR_MSG, ERROR_DATETIME)
    VALUES
      ('PMS Invoice Feed', V_ERRCODE, V_ERRMSG, SYSDATE);
    COMMIT;
  WHEN CASE_NOT_FOUND THEN
    ROLLBACK;
    V_ERRCODE := SQLCODE;
    V_ERRMSG  := SQLERRM;
    INSERT INTO   NL_ES_ERROR_LOG
      (MODULE_NAME, ERROR_CODE, ERROR_MSG, ERROR_DATETIME)
    VALUES
      ('PMS Invoice Feed', V_ERRCODE, V_ERRMSG, SYSDATE);
    COMMIT;
  WHEN CURSOR_ALREADY_OPEN THEN
    ROLLBACK;
    V_ERRCODE := SQLCODE;
    V_ERRMSG  := SQLERRM;
    INSERT INTO   NL_ES_ERROR_LOG
      (MODULE_NAME, ERROR_CODE, ERROR_MSG, ERROR_DATETIME)
    VALUES
      ('PMS Invoice Feed', V_ERRCODE, V_ERRMSG, SYSDATE);
    COMMIT;
  WHEN DUP_VAL_ON_INDEX THEN
    ROLLBACK;
    V_ERRCODE := SQLCODE;
    V_ERRMSG  := SQLERRM;
    INSERT INTO   NL_ES_ERROR_LOG
      (MODULE_NAME, ERROR_CODE, ERROR_MSG, ERROR_DATETIME)
    VALUES
      ('PMS Invoice Feed', V_ERRCODE, V_ERRMSG, SYSDATE);
    COMMIT;
  WHEN INVALID_CURSOR THEN
    ROLLBACK;
    V_ERRCODE := SQLCODE;
    V_ERRMSG  := SQLERRM;
    INSERT INTO   NL_ES_ERROR_LOG
      (MODULE_NAME, ERROR_CODE, ERROR_MSG, ERROR_DATETIME)
    VALUES
      ('PMS Invoice Feed', V_ERRCODE, V_ERRMSG, SYSDATE);
    COMMIT;
  WHEN TOO_MANY_ROWS THEN
    ROLLBACK;
    V_ERRCODE := SQLCODE;
    V_ERRMSG  := SQLERRM;
    INSERT INTO   NL_ES_ERROR_LOG
      (MODULE_NAME, ERROR_CODE, ERROR_MSG, ERROR_DATETIME)
    VALUES
      ('PMS Invoice Feed', V_ERRCODE, V_ERRMSG, SYSDATE);
    COMMIT;
  WHEN OTHERS THEN
    ROLLBACK;
    V_ERRCODE := SQLCODE;
    V_ERRMSG  := SQLERRM;
    INSERT INTO   NL_ES_ERROR_LOG
      (MODULE_NAME, ERROR_CODE, ERROR_MSG, ERROR_DATETIME)
    VALUES
      ('PMS Invoice Feed', V_ERRCODE, V_ERRMSG, SYSDATE);
    COMMIT;
END SP_GEN_PMS_INVOICE_FEED_SSA;
=====SP_GEN_PMS_INVOICE_FEED_ZERO
CREATE OR REPLACE PROCEDURE ESTAPLE.sp_gen_pms_invoice_feed_zero /*(P_SSA_CODE IN VARCHAR2)*/
 AS

  --version 1.0
  --created by - Deepa Miglani(230328)
  --Purpose - To generate invoice feed for Es parent accounts

  v_filehandle utl_file.file_type;
  filename     VARCHAR2(50);

  --fetches the ES invoice details 
  CURSOR cur_pms_feed IS
    SELECT c.customer_ref customer_ref,
           a.account_num account_num,
           ata.account_type account_category,
           ct.first_name || ' ' || ct.last_name customer_name,
           1 AS invoice_seq_no,
           --bi.invoice_net_mny invoice_amount,
           0 outstanding_bal,
           '22-SEP-2011' AS payment_due_date,
           '07-SEP-2011' AS invoice_date,
           b.legacy_system_account_num AS group_id,
           ata.circle_code circle_code,
           ata.ssa_code ssa_code
      FROM customer@cdr_nz c INNER JOIN account@cdr_nz a ON c.customer_ref = a.customer_ref INNER JOIN   NL_es_account b ON a.account_num = b.account_id INNER JOIN accountattributes@cdr_nz ata ON a.account_num = ata.account_num INNER JOIN contact@cdr_nz ct ON c.customer_ref = ct.customer_ref INNER JOIN contacttype@cdr_nz ctt ON ctt.contact_type_id = ct.contact_type_id
    --bi.bill_seq > b.last_invoice_seq_no AND
     WHERE TRIM(upper(ata.account_type)) IN
           ('ES ZONAL INDIVIDUAL', 'ES ZONAL CORPORATE') AND
           /*ssa_code = 'KYN' and */  TRIM(upper(ata.account_subtype)) = 'PARENT'
           and c.customer_ref = '1016705322' and contact_seq = 1;

  v_account_id              NL_es_account.account_id%TYPE;
  v_customer_ref          customer.customer_ref@cdr_nz%TYPE;
  v_account_category      accountattributes.account_type@cdr_nz%TYPE;
  v_customer_name         VARCHAR2(85);
  v_invoice_seq           billsummary.bill_seq@cdr_nz%TYPE;
  v_invoice_amt           billsummary.balance_out_mny@cdr_nz%TYPE;
  v_outstanding_amt       billsummary.balance_out_mny@cdr_nz%TYPE;
  v_invoice_date          billsummary.actual_bill_dtm@cdr_nz%TYPE;
  v_pay_due_date          billsummary.payment_due_dat@cdr_nz%TYPE;
  v_payment_method        paymentmethod.payment_method_name@cdr_nz%TYPE;
  v_payment_method_id     paymentmethod.payment_method_id@cdr_nz%TYPE;
  v_invoice_amount1       NUMBER(18, 2);
  v_invoice_amount2       VARCHAR2(20);
  v_outstanding_amt1      NUMBER(18, 2);
  v_outstanding_amt2      VARCHAR2(20);
  v_bank_provided_id      VARCHAR2(50);
  v_mandate_attr2         VARCHAR2(50);
  v_bank_name             VARCHAR2(50);
  v_branch_micr_code      VARCHAR2(50);
  v_bank_acc_num          VARCHAR2(50);
  v_bank_acc_type         VARCHAR2(5);
  v_circle_code_es_parent VARCHAR2(30);
  --pkg_es.circle_code_es_parent;
  v_ssa_code_es_parent VARCHAR2(30);
  --pkg_es.ssa_code_es_parent;
  v_group_id   NL_es_account.legacy_system_account_num%TYPE;
  --variable used for exception handling 
  v_errcode NUMBER;

  --variable used to store the error message.
  v_errmsg VARCHAR2(570);

  --v_count variable to track the lines in the PMS feed file. 
  v_count           NUMBER(10);
  v_implied_decimel   NL_es_parameters.int_value%TYPE := NULL;

BEGIN

  --initializing the feed file line counter
  v_count := 0;

  SELECT bp.int_value
    INTO v_implied_decimel
    FROM   NL_es_parameters bp
   WHERE bp.module_name LIKE '%ES%' AND
         bp.parameter_name = 'Implied Decimel';

  FOR rec_pms_feed IN cur_pms_feed LOOP
  
    v_bank_provided_id := NULL;
    v_bank_name        := NULL;
    v_branch_micr_code := NULL;
    v_bank_acc_num     := NULL;
    v_bank_acc_type    := NULL;
    v_customer_ref     := rec_pms_feed.customer_ref;
    v_account_id       := rec_pms_feed.account_num;
    v_account_category := TRIM(rec_pms_feed.account_category);
    v_customer_name    := TRIM(rec_pms_feed.customer_name);
    v_invoice_seq      := rec_pms_feed.invoice_seq_no;
    --v_invoice_amt      := rec_pms_feed.invoice_amount;
    v_outstanding_amt       := rec_pms_feed.outstanding_bal;
    v_invoice_date          := rec_pms_feed.invoice_date;
    v_pay_due_date          := rec_pms_feed.payment_due_date;
    v_group_id              := rec_pms_feed.group_id;
    v_circle_code_es_parent := nvl(rec_pms_feed.circle_code, 'MH');
    v_ssa_code_es_parent    := nvl(rec_pms_feed.ssa_code, 'KYN');
  
    --Invoice amount in invoice feed is same as the outsanding
    v_invoice_amt := v_outstanding_amt;
  
    SELECT ad.payment_method_id
      INTO v_payment_method_id
      FROM accountdetails@cdr_nz ad
     WHERE account_num = v_account_id
     GROUP BY payment_method_id;
  
    SELECT pm.payment_method_name
      INTO v_payment_method
      FROM paymentmethod@cdr_nz pm
     WHERE pm.payment_method_id = v_payment_method_id;
  
    BEGIN
    
      SELECT bank_account_number,
             bank_branch_number,
             mandate_attr_1,
             mandate_attr_2
        INTO v_bank_acc_num,
             v_branch_micr_code,
             v_bank_name,
             v_mandate_attr2
        FROM prmandate@cdr_nz
       WHERE account_num = v_account_id AND
             payment_method_id = v_payment_method_id;
    
      IF TRIM(upper(v_payment_method)) = 'ECS' THEN
        v_bank_acc_type := v_mandate_attr2;
      ELSIF TRIM(upper(v_payment_method)) = 'SICC' THEN
        v_bank_provided_id := v_mandate_attr2;
      END IF;
    
    EXCEPTION
      WHEN no_data_found THEN
        NULL;
      WHEN OTHERS THEN
        NULL;
    END;
  
    INSERT INTO   NL_es_pms_feed
      (customer_id,
       customer_name,
       account_num,
       invoice_seq_no,
       invoice_date,
       invoice_amt,
       tot_outstanding_amt,
       pay_due_date,
       customer_category,
       payment_type,
       bank_provider_id,
       bank_name,
       branch_micr_code,
       bank_account_no,
       bank_account_type,
       logged_date)
    VALUES
      (v_customer_ref,
       v_customer_name,
       v_account_id,
       v_invoice_seq,
       v_invoice_date,
       v_invoice_amt,
       v_outstanding_amt,
       v_pay_due_date,
       v_account_category,
       v_payment_method,
       NULL,
       NULL,
       NULL,
       NULL,
       NULL,
       SYSDATE);
    COMMIT;
  
    IF v_count = 0 THEN
      --the name of the file which will store payment feed
      filename     := 'es_invoice_' || to_char(SYSDATE, 'DDMMYYYYHH24MISS') ||
                      '.csv';
      v_filehandle := utl_file.fopen('PMS_ES_INVOICE_DIR', filename, 'a');
    
    END IF;
  
    v_invoice_amount1 := v_invoice_amt / (10 ** v_implied_decimel);
  
    SELECT TRIM(to_char(v_invoice_amount1, '9999999999999999.99'))
      INTO v_invoice_amount2
      FROM dual;
    v_outstanding_amt1 := v_outstanding_amt / (10 ** v_implied_decimel);
    SELECT TRIM(to_char(v_outstanding_amt1, '9999999999999999.99'))
      INTO v_outstanding_amt2
      FROM dual;
  
    utl_file.putf(v_filehandle,
                  '|:|' || v_customer_ref || '|:|!*!|:|' ||
                  TRIM(v_customer_name) || '|:|!*!|:|' || v_account_id ||
                  '|:|!*!|:|' || v_invoice_seq || '|:|!*!|:|' ||
                  to_char(v_invoice_date, 'DD-MM-YYYY') || '|:|!*!|:|' ||
                  v_invoice_amount2 || '|:|!*!|:|' || v_outstanding_amt2 ||
                  '|:|!*!|:|' || to_char(v_pay_due_date, 'DD-MM-YYYY') ||
                  '|:|!*!|:|' || TRIM(v_ssa_code_es_parent) || '|:|!*!|:|' ||
                  TRIM(v_circle_code_es_parent) || '|:|!*!|:|' ||
                  TRIM(v_account_category) || '|:|!*!|:|' ||
                  TRIM(v_payment_method) || '|:|!*!|:|' ||
                  TRIM(v_bank_provided_id) || '|:|!*!|:|' ||
                  TRIM(v_bank_name) || '|:|!*!|:|' ||
                  TRIM(v_branch_micr_code) || '|:|!*!|:|' ||
                  TRIM(v_bank_acc_num) || '|:|!*!|:|' ||
                  TRIM(v_bank_acc_type) || '|:|!*!|:|' || TRIM(v_group_id) ||
                  '|:|!*!');
  
    utl_file.new_line(v_filehandle);
    v_count := v_count + 1;
  
    UPDATE   NL_es_pms_feed
       SET feed_name = filename
     WHERE logged_date = SYSDATE AND customer_id = v_customer_ref AND
           invoice_seq_no = v_invoice_seq;
  
    COMMIT;
  
  END LOOP;
  --closing the filehandle for the feed file
  utl_file.fclose(v_filehandle);

  --exception handling
EXCEPTION
  WHEN no_data_found THEN
    ROLLBACK;
    v_errcode := SQLCODE;
    v_errmsg  := SQLERRM;
    INSERT INTO   NL_es_error_log
      (module_name, error_code, error_msg, error_datetime)
    VALUES
      ('PMS Invoice Feed', v_errcode, v_errmsg, SYSDATE);
    COMMIT;
  WHEN case_not_found THEN
    ROLLBACK;
    v_errcode := SQLCODE;
    v_errmsg  := SQLERRM;
    INSERT INTO   NL_es_error_log
      (module_name, error_code, error_msg, error_datetime)
    VALUES
      ('PMS Invoice Feed', v_errcode, v_errmsg, SYSDATE);
    COMMIT;
  WHEN cursor_already_open THEN
    ROLLBACK;
    v_errcode := SQLCODE;
    v_errmsg  := SQLERRM;
    INSERT INTO   NL_es_error_log
      (module_name, error_code, error_msg, error_datetime)
    VALUES
      ('PMS Invoice Feed', v_errcode, v_errmsg, SYSDATE);
    COMMIT;
  WHEN dup_val_on_index THEN
    ROLLBACK;
    v_errcode := SQLCODE;
    v_errmsg  := SQLERRM;
    INSERT INTO   NL_es_error_log
      (module_name, error_code, error_msg, error_datetime)
    VALUES
      ('PMS Invoice Feed', v_errcode, v_errmsg, SYSDATE);
    COMMIT;
  WHEN invalid_cursor THEN
    ROLLBACK;
    v_errcode := SQLCODE;
    v_errmsg  := SQLERRM;
    INSERT INTO   NL_es_error_log
      (module_name, error_code, error_msg, error_datetime)
    VALUES
      ('PMS Invoice Feed', v_errcode, v_errmsg, SYSDATE);
    COMMIT;
  WHEN too_many_rows THEN
    ROLLBACK;
    v_errcode := SQLCODE;
    v_errmsg  := SQLERRM;
    INSERT INTO   NL_es_error_log
      (module_name, error_code, error_msg, error_datetime)
    VALUES
      ('PMS Invoice Feed', v_errcode, v_errmsg, SYSDATE);
    COMMIT;
  WHEN OTHERS THEN
    ROLLBACK;
    v_errcode := SQLCODE;
    v_errmsg  := SQLERRM;
    INSERT INTO   NL_es_error_log
      (module_name, error_code, error_msg, error_datetime)
    VALUES
 ('PMS Invoice Feed', v_errcode, v_errmsg, SYSDATE);
    COMMIT;
END sp_gen_pms_invoice_feed_zero;
============SP_GEN_SERVICES_FEED
CREATE OR REPLACE PROCEDURE ESTAPLE.SP_GEN_SERVICES_FEED IS
  -- Variable Declaration

  --version 1.0
  --Created by - Deepa Milglani (230326)
  --Purpose - To populate zestap_ser table in CRM database in BC7 system 

  V_ES_CHILD_ACCOUNT_ID   NL_ES_HOME_SYS_ACCOUNT.ACCOUNT_ID%TYPE := NULL;
  V_ES_PARENT_ID          NL_ES_HOME_SYS_ACCOUNT.PARENT_ACCOUNT_ID%TYPE := NULL;
  V_SERVICE_ID            NL_ES_CDR_SERVICES.TELEPHONE_NO%TYPE := NULL;
  V_RATE_PLAN             NL_ES_CDR_SERVICES.RATE_PLAN%TYPE := NULL;
  v_rowid               ROWID;
  V_MANDT               SAPSR3.ZESTAP_SER.MANDT@CRM_DB_BC7%TYPE := NULL;
  V_STATUS              SAPSR3.ZESTAP_SER.STATUS@CRM_DB_BC7%TYPE := NULL;
  V_ERR_NUM             NUMBER;
  V_ERR_MSG             VARCHAR2(570);

  /*cursor cur_accounts to fetch the accounts acquisition info 
  from   NL_es_cdr_services,  NL_es_gsm_services,  NL_es_nib_services table in ES database*/
  CURSOR CUR_ACCOUNTS IS
    SELECT ACCOUNT_ID,
           TELEPHONE_NO SERVICE_ID,
           RATE_PLAN,
           CASE PRODUCT_STATUS
             WHEN 1 THEN
              'Active'
             WHEN 2 THEN
              'Suspended'
             WHEN 3 THEN
              'Pending'
           END CASE,ROWID
      FROM   NL_ES_CDR_SERVICES
      WHERE (is_feed_sent IS null OR is_feed_sent =0);

BEGIN

  --DELETE FROM SAPSR3.ZESTAP_SER@CRM_DB_BC7;
  COMMIT;

  V_MANDT := '400';
  --open cursor cur_accounts
  OPEN CUR_ACCOUNTS;
  LOOP
    FETCH CUR_ACCOUNTS
      INTO V_ES_CHILD_ACCOUNT_ID, V_SERVICE_ID, V_RATE_PLAN, V_STATUS,v_rowid;
    EXIT WHEN CUR_ACCOUNTS%NOTFOUND;
  
    SELECT ES_C.PARENT_ACCOUNT_ID
      INTO V_ES_PARENT_ID
      FROM   NL_ES_HOME_SYS_ACCOUNT ES_C
     WHERE ES_C.ACCOUNT_ID = V_ES_CHILD_ACCOUNT_ID;
  
    /*Inserting the services table in BC7 system of CRM
    The info will be in the format:-
    es_parent_account_id
    es_child_account_id
    Service Id
    Traiff plan name*/
    BEGIN
      INSERT INTO SAPSR3.ZESTAP_SER@CRM_DB_BC7
        (MANDT, P_BILL, C_BILL, SERVICE, RPLAN, STATUS)
      VALUES
        (V_MANDT,
         V_ES_PARENT_ID,
         V_ES_CHILD_ACCOUNT_ID,
         V_SERVICE_ID,
         V_RATE_PLAN,
         V_STATUS);
    
      UPDATE   NL_ES_CDR_SERVICES B
         SET B.IS_FEED_SENT = 1
       WHERE B.ACCOUNT_ID = V_ES_CHILD_ACCOUNT_ID AND
       ROWID = v_rowid AND
             (B.IS_FEED_SENT IS NULL OR B.IS_FEED_SENT = 0);
    EXCEPTION
    
      WHEN OTHERS THEN
        V_ERR_NUM := SQLCODE;
        V_ERR_MSG := SQLERRM || 'parent' || V_ES_PARENT_ID || 'child' ||
                     V_ES_CHILD_ACCOUNT_ID;
        --Inserting into   NL_es_error_log
        INSERT INTO   NL_ES_ERROR_LOG
          (MODULE_NAME, ERROR_MSG, ERROR_DATETIME, ERROR_CODE)
        VALUES
          ('Services Feed', V_ERR_MSG, SYSDATE, V_ERR_NUM);
      
    END;
  END LOOP;
  COMMIT;
  --Exception Handling
EXCEPTION

  WHEN NO_DATA_FOUND THEN
    V_ERR_NUM := SQLCODE;
    V_ERR_MSG := 'Error in services feed:' || SUBSTR(SQLCODE, 1, 100);
    --Inserting into   NL_es_error_log
    INSERT INTO   NL_ES_ERROR_LOG
      (MODULE_NAME, ERROR_MSG, ERROR_DATETIME, ERROR_CODE)
    VALUES
      ('Services Feed', V_ERR_MSG, SYSDATE, V_ERR_NUM);
    COMMIT;
  
  WHEN OTHERS THEN
    V_ERR_NUM := SQLCODE;
    V_ERR_MSG := 'Error in services feed:' || SUBSTR(SQLCODE, 1, 100);
    --Inserting into   NL_es_error_log
    INSERT INTO   NL_ES_ERROR_LOG
      (MODULE_NAME, ERROR_MSG, ERROR_DATETIME, ERROR_CODE)
    VALUES
      ('Services Feed', V_ERR_MSG, SYSDATE, V_ERR_NUM);
    COMMIT;
  
  --end of sp_gen_services_feed procedure
END SP_GEN_SERVICES_FEED;
===========SP_GEN_HBS_PAYMENTS
CREATE OR REPLACE PROCEDURE ESTAPLE.sp_get_hbs_payments(p_bill_cycle_date DATE) AS

  v_account_id              NL_es_home_sys_account.account_id%TYPE;
  v_home_sys_account_id     NL_es_home_sys_account.home_sys_account_id%TYPE;
  V_CUSTOMER_REF          account.customer_ref@cdr_nz%TYpe;
  v_invoice_seq_no          NL_es_home_sys_account.invoice_seq_no%TYPE;
  v_bill_ver              NUMBER(1);
  v_payment_mny             NL_es_cdr_bill_invoice.last_payment%TYPE;
  v_hbs_payment_mny         NL_es_cdr_bill_invoice.last_payment%TYPE;
  v_prev_bill_run_date      NL_es_cdr_bill_invoice.bill_run_date%TYPE;
  v_current_bill_run_date   NL_es_cdr_bill_invoice.bill_run_date%TYPE;
  v_failed_payment_mny      NL_es_cdr_bill_invoice.last_payment%TYPE;
  v_deposit_rebate_mny      NL_es_cdr_bill_invoice.refunds%TYPE;
  v_refund_mny              NL_es_cdr_bill_invoice.refunds%TYPE;
  v_product_charge          NL_es_post_charges_log.charge%TYPE;
  v_bill_seq                NL_es_home_sys_account.invoice_seq_no%TYPE;
  v_start_date            DATE;
  v_end_date              DATE;
  V_ES_DISCOUNT              NL_es_hbs_payments.es_discount%type;
  v_payment_method_id paymentmethod.payment_method_id@cdr_nz%TYPE;
  v_payment_origin_id paymentorigin.payment_origin_id@cdr_nz%TYPE;
   v_error_string      VARCHAR2(512) := NULL;
  v_errcode           NUMBER(6);
  
  CURSOR cur_billable_acc IS
    SELECT h.account_id,
           h.home_sys_account_id,
           MAX(hbs.invoice_seq_no) AS invoice_seq_no
      FROM   NL_es_home_sys_account h INNER JOIN   NL_es_hbs_payments hbs ON h.account_id = hbs.account_id
     WHERE h.is_active = 1 AND h.enrollment_date < p_bill_cycle_date AND
           h.is_new = 0
     GROUP BY h.account_id, h.home_sys_account_id;

  CURSOR cur_get_bill IS
    SELECT actual_bill_dtm,
           bill_version,
           bill_seq,
           start_of_bill_dtm,
           bill_dtm
      FROM billsummary@cdr_nz
     WHERE account_num = v_home_sys_account_id AND
           bill_seq > v_invoice_seq_no AND bill_status IN (1, 7, 8) AND
           balance_out_mny >= 0 AND bill_type_id IN (1, 2, 3)
     ORDER BY bill_seq;

BEGIN

  SELECT PAYMENT_ORIGIN_ID
      INTO V_PAYMENT_ORIGIN_ID
      FROM PAYMENTORIGIN@CDR_NZ
     WHERE TRIM(UPPER(PAYMENT_ORIGIN_NAME)) =
           TRIM(UPPER('PHYSICAL PAYMENT'));
  
    SELECT PAYMENT_METHOD_ID
      INTO V_PAYMENT_METHOD_ID
      FROM PAYMENTMETHOD@CDR_NZ
     WHERE TRIM(UPPER(PAYMENT_METHOD_NAME)) = TRIM(UPPER('ES DISCOUNT'));


  FOR rec_billable_acc IN cur_billable_acc LOOP
    v_account_id          := rec_billable_acc.account_id;
    v_home_sys_account_id := rec_billable_acc.home_sys_account_id;
    v_invoice_seq_no      := rec_billable_acc.invoice_seq_no;
  
    v_hbs_payment_mny    := 0;
    v_failed_payment_mny := 0;
    v_deposit_rebate_mny := 0;
  
    FOR rec_get_bill IN cur_get_bill LOOP
      v_current_bill_run_date := rec_get_bill.actual_bill_dtm;
      v_bill_ver              := rec_get_bill.bill_version;
      v_bill_seq              := rec_get_bill.bill_seq;
      v_start_date            := rec_get_bill.start_of_bill_dtm;
      v_end_date              := rec_get_bill.bill_dtm - 1;
      EXIT WHEN cur_get_bill%NOTFOUND;
    
     begin
      SELECT MAX(s.invoice_seq_no)
        INTO v_invoice_seq_no
        FROM   NL_es_hbs_payments s
       WHERE s.account_id = v_account_id;
    
      BEGIN
        SELECT actual_bill_dtm
          INTO v_prev_bill_run_date
          FROM billsummary@cdr_nz
         WHERE account_num = v_home_sys_account_id AND
               bill_seq = v_invoice_seq_no AND bill_status IN (1, 7, 8);
      EXCEPTION
        WHEN no_data_found THEN
          NULL;
      END;
    
      BEGIN
        SELECT nvl(SUM(account_payment_mny), 0)
          INTO v_refund_mny
          FROM accountpayment@cdr_nz
         WHERE account_num = v_home_sys_account_id AND deposit_boo = 'F' AND
               created_dtm >= v_prev_bill_run_date AND
               created_dtm <= v_current_bill_run_date AND
               account_payment_mny < 0 AND account_payment_status = 1;
      EXCEPTION
        WHEN no_data_found THEN
          v_refund_mny := 0;
        WHEN OTHERS THEN
          RAISE;
      END;
      BEGIN
        SELECT nvl(SUM(account_payment_mny), 0)
          INTO v_payment_mny
          FROM accountpayment@cdr_nz
         WHERE account_num = v_home_sys_account_id AND
               created_dtm <= v_current_bill_run_date AND
               created_dtm >= v_prev_bill_run_date AND
              
               (account_payment_ref IS NOT NULL
               
               AND
               account_payment_ref NOT IN
               (SELECT transaction_id
                   FROM   NL_es_payment_split bp
                  WHERE bp.home_sys_account_id = v_home_sys_account_id) AND
               account_payment_ref NOT LIKE 'ES%') AND
               account_payment_mny > 0 AND deposit_boo = 'F';
      EXCEPTION
        WHEN no_data_found THEN
          v_payment_mny := 0;
        
      END;
      BEGIN
        SELECT nvl(SUM(account_payment_mny), 0)
          INTO v_failed_payment_mny
          FROM accountpayment@cdr_nz
         WHERE account_num = v_home_sys_account_id AND
               failed_dtm <= v_current_bill_run_date AND
               failed_dtm >= v_prev_bill_run_date AND
              
               (account_payment_ref IS NULL
               
               OR account_payment_ref NOT IN
               (SELECT transaction_id
                      FROM   NL_es_payment_split bp
                     WHERE bp.home_sys_account_id = v_home_sys_account_id) AND
               account_payment_ref NOT LIKE 'ES%') AND deposit_boo = 'F';
      EXCEPTION
        WHEN no_data_found THEN
          v_failed_payment_mny := 0;
        
      END;
      BEGIN
        SELECT nvl(SUM(account_payment_mny), 0)
          INTO v_deposit_rebate_mny
          FROM accountpayment@cdr_nz
         WHERE account_num = v_home_sys_account_id AND
               created_dtm <= v_current_bill_run_date AND
               created_dtm >= v_prev_bill_run_date AND
               account_payment_ref IS NULL AND deposit_boo = 'F' AND
               account_payment_mny > 0;
      EXCEPTION
        WHEN no_data_found THEN
          v_deposit_rebate_mny := 0;
        
      END;
      v_product_charge := v_failed_payment_mny - v_deposit_rebate_mny -
                          v_payment_mny - v_refund_mny;
    BEGIN
      -- THIS section fetches the value of es_discount
      SELECT customer_ref 
      into  V_CUSTOMER_REF   
        FROM ACCOUNT@CDR_NZ A
        
       WHERE ACCOUNT_NUM = V_HOME_SYS_ACCOUNT_ID ;
           
             SELECT nvl(sum(PHYSICAL_PAYMENT_mny),0)
             INTO V_ES_DISCOUNT
                    FROM PHYSICALPAYMENT@CDR_NZ a
                   WHERE PAYMENT_METHOD_ID = V_PAYMENT_METHOD_ID AND
                         CUSTOMER_REF = V_CUSTOMER_REF AND
                         A.CREATED_DTM <= v_current_bill_run_date AND
                         A.CREATED_DTM >= v_prev_bill_run_date
                         and physical_PAYMENT_STATUS=1;
     EXCEPTION
        WHEN no_data_found THEN
          V_ES_DISCOUNT := 0;
      END;                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                               

    
      INSERT INTO   NL_es_hbs_payments
        (account_id,
         home_sys_account_id,
         invoice_seq_no,
         bill_ver,
         hbs_payment,
         failed_hbs_payment,
         deposit,
         refunds,
         charge,
         es_discount,
         logged_date,
         start_date,
         end_date)
      VALUES
        (v_account_id,
         v_home_sys_account_id,
         v_bill_seq,
         v_bill_ver,
         v_payment_mny,
         v_failed_payment_mny,
         v_deposit_rebate_mny,
         v_refund_mny,
         v_product_charge,
         v_es_discount,
         SYSDATE,
         v_start_date,
         v_end_date);
    
      sp_create_product(v_account_id,
                        v_account_id,
                        v_product_charge,
                        188,
                        v_bill_seq,
                        v_start_date,
                        v_end_date);
     if V_ES_DISCOUNT <>0  then
       sp_create_product(v_account_id,
                        v_account_id,
                        -v_es_discount,
                        190,
                        v_bill_seq,
                        v_start_date,
                        v_end_date);                       
    end if;
      COMMIT;
  EXCEPTION

  WHEN OTHERS THEN
  rollback;
  V_ERROR_STRING := 'ES child account no:' || V_ACCOUNT_ID || ' ' ||
                        'invoice number' || v_invoice_seq_no || '    ' ||
                        SQLERRM;
      V_ERRCODE      := SQLCODE;
  INSERT INTO   NL_es_error_log
    (module_name, error_code, error_msg, error_datetime)
  VALUES
    ('ES HBS PAYMENTS', V_ERRCODE, V_ERROR_STRING, SYSDATE);
  COMMIT;
    end;
    END LOOP;
  END LOOP;

  
END sp_get_hbs_payments;
===========SP_GET_HBS_PAYMENTS
CREATE OR REPLACE PROCEDURE ESTAPLE.sp_get_hbs_payments(p_bill_cycle_date DATE) AS

  v_account_id              NL_es_home_sys_account.account_id%TYPE;
  v_home_sys_account_id     NL_es_home_sys_account.home_sys_account_id%TYPE;
  V_CUSTOMER_REF          account.customer_ref@cdr_nz%TYpe;
  v_invoice_seq_no          NL_es_home_sys_account.invoice_seq_no%TYPE;
  v_bill_ver              NUMBER(1);
  v_payment_mny             NL_es_cdr_bill_invoice.last_payment%TYPE;
  v_hbs_payment_mny         NL_es_cdr_bill_invoice.last_payment%TYPE;
  v_prev_bill_run_date      NL_es_cdr_bill_invoice.bill_run_date%TYPE;
  v_current_bill_run_date   NL_es_cdr_bill_invoice.bill_run_date%TYPE;
  v_failed_payment_mny      NL_es_cdr_bill_invoice.last_payment%TYPE;
  v_deposit_rebate_mny      NL_es_cdr_bill_invoice.refunds%TYPE;
  v_refund_mny              NL_es_cdr_bill_invoice.refunds%TYPE;
  v_product_charge          NL_es_post_charges_log.charge%TYPE;
  v_bill_seq                NL_es_home_sys_account.invoice_seq_no%TYPE;
  v_start_date            DATE;
  v_end_date              DATE;
  V_ES_DISCOUNT              NL_es_hbs_payments.es_discount%type;
  v_payment_method_id paymentmethod.payment_method_id@cdr_nz%TYPE;
  v_payment_origin_id paymentorigin.payment_origin_id@cdr_nz%TYPE;
   v_error_string      VARCHAR2(512) := NULL;
  v_errcode           NUMBER(6);
  
  CURSOR cur_billable_acc IS
    SELECT h.account_id,
           h.home_sys_account_id,
           MAX(hbs.invoice_seq_no) AS invoice_seq_no
      FROM   NL_es_home_sys_account h INNER JOIN   NL_es_hbs_payments hbs ON h.account_id = hbs.account_id
     WHERE h.is_active = 1 AND h.enrollment_date < p_bill_cycle_date AND
           h.is_new = 0
     GROUP BY h.account_id, h.home_sys_account_id;

  CURSOR cur_get_bill IS
    SELECT actual_bill_dtm,
           bill_version,
           bill_seq,
           start_of_bill_dtm,
           bill_dtm
      FROM billsummary@cdr_nz
     WHERE account_num = v_home_sys_account_id AND
           bill_seq > v_invoice_seq_no AND bill_status IN (1, 7, 8) AND
           balance_out_mny >= 0 AND bill_type_id IN (1, 2, 3)
     ORDER BY bill_seq;

BEGIN

  SELECT PAYMENT_ORIGIN_ID
      INTO V_PAYMENT_ORIGIN_ID
      FROM PAYMENTORIGIN@CDR_NZ
     WHERE TRIM(UPPER(PAYMENT_ORIGIN_NAME)) =
           TRIM(UPPER('PHYSICAL PAYMENT'));
  
    SELECT PAYMENT_METHOD_ID
      INTO V_PAYMENT_METHOD_ID
      FROM PAYMENTMETHOD@CDR_NZ
     WHERE TRIM(UPPER(PAYMENT_METHOD_NAME)) = TRIM(UPPER('ES DISCOUNT'));


  FOR rec_billable_acc IN cur_billable_acc LOOP
    v_account_id          := rec_billable_acc.account_id;
    v_home_sys_account_id := rec_billable_acc.home_sys_account_id;
    v_invoice_seq_no      := rec_billable_acc.invoice_seq_no;
  
    v_hbs_payment_mny    := 0;
    v_failed_payment_mny := 0;
    v_deposit_rebate_mny := 0;
  
    FOR rec_get_bill IN cur_get_bill LOOP
      v_current_bill_run_date := rec_get_bill.actual_bill_dtm;
      v_bill_ver              := rec_get_bill.bill_version;
      v_bill_seq              := rec_get_bill.bill_seq;
      v_start_date            := rec_get_bill.start_of_bill_dtm;
      v_end_date              := rec_get_bill.bill_dtm - 1;
      EXIT WHEN cur_get_bill%NOTFOUND;
    
     begin
      SELECT MAX(s.invoice_seq_no)
        INTO v_invoice_seq_no
        FROM   NL_es_hbs_payments s
       WHERE s.account_id = v_account_id;
    
      BEGIN
        SELECT actual_bill_dtm
          INTO v_prev_bill_run_date
          FROM billsummary@cdr_nz
         WHERE account_num = v_home_sys_account_id AND
               bill_seq = v_invoice_seq_no AND bill_status IN (1, 7, 8);
      EXCEPTION
        WHEN no_data_found THEN
          NULL;
      END;
    
      BEGIN
        SELECT nvl(SUM(account_payment_mny), 0)
          INTO v_refund_mny
          FROM accountpayment@cdr_nz
         WHERE account_num = v_home_sys_account_id AND deposit_boo = 'F' AND
               created_dtm >= v_prev_bill_run_date AND
               created_dtm <= v_current_bill_run_date AND
               account_payment_mny < 0 AND account_payment_status = 1;
      EXCEPTION
        WHEN no_data_found THEN
          v_refund_mny := 0;
        WHEN OTHERS THEN
          RAISE;
      END;
      BEGIN
        SELECT nvl(SUM(account_payment_mny), 0)
          INTO v_payment_mny
          FROM accountpayment@cdr_nz
         WHERE account_num = v_home_sys_account_id AND
               created_dtm <= v_current_bill_run_date AND
               created_dtm >= v_prev_bill_run_date AND
              
               (account_payment_ref IS NOT NULL
               
               AND
               account_payment_ref NOT IN
               (SELECT transaction_id
                   FROM   NL_es_payment_split bp
                  WHERE bp.home_sys_account_id = v_home_sys_account_id) AND
               account_payment_ref NOT LIKE 'ES%') AND
               account_payment_mny > 0 AND deposit_boo = 'F';
      EXCEPTION
        WHEN no_data_found THEN
          v_payment_mny := 0;
        
      END;
      BEGIN
        SELECT nvl(SUM(account_payment_mny), 0)
          INTO v_failed_payment_mny
          FROM accountpayment@cdr_nz
         WHERE account_num = v_home_sys_account_id AND
               failed_dtm <= v_current_bill_run_date AND
               failed_dtm >= v_prev_bill_run_date AND
              
               (account_payment_ref IS NULL
               
               OR account_payment_ref NOT IN
               (SELECT transaction_id
                      FROM   NL_es_payment_split bp
                     WHERE bp.home_sys_account_id = v_home_sys_account_id) AND
               account_payment_ref NOT LIKE 'ES%') AND deposit_boo = 'F';
      EXCEPTION
        WHEN no_data_found THEN
          v_failed_payment_mny := 0;
        
      END;
      BEGIN
        SELECT nvl(SUM(account_payment_mny), 0)
          INTO v_deposit_rebate_mny
          FROM accountpayment@cdr_nz
         WHERE account_num = v_home_sys_account_id AND
               created_dtm <= v_current_bill_run_date AND
               created_dtm >= v_prev_bill_run_date AND
               account_payment_ref IS NULL AND deposit_boo = 'F' AND
               account_payment_mny > 0;
      EXCEPTION
        WHEN no_data_found THEN
          v_deposit_rebate_mny := 0;
        
      END;
      v_product_charge := v_failed_payment_mny - v_deposit_rebate_mny -
                          v_payment_mny - v_refund_mny;
    BEGIN
      -- THIS section fetches the value of es_discount
      SELECT customer_ref 
      into  V_CUSTOMER_REF   
        FROM ACCOUNT@CDR_NZ A
        
       WHERE ACCOUNT_NUM = V_HOME_SYS_ACCOUNT_ID ;
           
             SELECT nvl(sum(PHYSICAL_PAYMENT_mny),0)
             INTO V_ES_DISCOUNT
                    FROM PHYSICALPAYMENT@CDR_NZ a
                   WHERE PAYMENT_METHOD_ID = V_PAYMENT_METHOD_ID AND
                         CUSTOMER_REF = V_CUSTOMER_REF AND
                         A.CREATED_DTM <= v_current_bill_run_date AND
                         A.CREATED_DTM >= v_prev_bill_run_date
                         and physical_PAYMENT_STATUS=1;
     EXCEPTION
        WHEN no_data_found THEN
          V_ES_DISCOUNT := 0;
      END;                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                               

    
      INSERT INTO   NL_es_hbs_payments
        (account_id,
         home_sys_account_id,
         invoice_seq_no,
         bill_ver,
         hbs_payment,
         failed_hbs_payment,
         deposit,
         refunds,
         charge,
         es_discount,
         logged_date,
         start_date,
         end_date)
      VALUES
        (v_account_id,
         v_home_sys_account_id,
         v_bill_seq,
         v_bill_ver,
         v_payment_mny,
         v_failed_payment_mny,
         v_deposit_rebate_mny,
         v_refund_mny,
         v_product_charge,
         v_es_discount,
         SYSDATE,
         v_start_date,
         v_end_date);
    
      sp_create_product(v_account_id,
                        v_account_id,
                        v_product_charge,
                        188,
                        v_bill_seq,
                        v_start_date,
                        v_end_date);
     if V_ES_DISCOUNT <>0  then
       sp_create_product(v_account_id,
                        v_account_id,
                        -v_es_discount,
                        190,
                        v_bill_seq,
                        v_start_date,
                        v_end_date);                       
    end if;
      COMMIT;
  EXCEPTION

  WHEN OTHERS THEN
  rollback;
  V_ERROR_STRING := 'ES child account no:' || V_ACCOUNT_ID || ' ' ||
                        'invoice number' || v_invoice_seq_no || '    ' ||
                        SQLERRM;
      V_ERRCODE      := SQLCODE;
  INSERT INTO   NL_es_error_log
    (module_name, error_code, error_msg, error_datetime)
  VALUES
    ('ES HBS PAYMENTS', V_ERRCODE, V_ERROR_STRING, SYSDATE);
  COMMIT;
    end;
    END LOOP;
  END LOOP;

  
END sp_get_hbs_payments;
===========SP_GET_PARENT_OUTSTANDANDING
CREATE OR REPLACE PROCEDURE ESTAPLE.sp_get_parent_outstanding AS
  CURSOR cur_get_parents IS
    SELECT account_id FROM   NL_es_account;
  v_parent_account_id   NL_es_account.account_id%TYPE;

  CURSOR cur_get_child_accounts IS
    SELECT account_id
      FROM   NL_es_home_sys_account
     WHERE parent_account_id = v_parent_account_id;

  v_account_id   NL_es_home_sys_account.account_id%TYPE;
  CURSOR cur_get_outstanding IS
    SELECT outstanding_bal
      FROM   NL_es_cdr_bill_invoice
     WHERE account_id = v_account_id;

  v_outstanding_bal   NL_es_cdr_bill_invoice.outstanding_bal%TYPE;
  v_total           NUMBER(18);

BEGIN
  FOR rec_get_parents IN cur_get_parents LOOP
  
    v_parent_account_id := rec_get_parents.account_id;
    v_total             := 0;
  
    FOR rec_get_child_accounts IN cur_get_child_accounts LOOP
    
      v_account_id := rec_get_child_accounts.account_id;
    
      FOR rec_get_outstanding IN cur_get_outstanding LOOP
        v_outstanding_bal := rec_get_outstanding.outstanding_bal;
      
        IF (v_outstanding_bal <= 0) THEN
          v_outstanding_bal := 0;
        END IF;
        v_total := v_total + v_outstanding_bal;
      END LOOP;
    
    END LOOP;
  
    dbms_output.put_line('parent account id  ' || v_parent_account_id ||
                         'outstanding is    ' || v_total);
  
  END LOOP;
END;
==========SP_GET_PAYMENTS
CREATE OR REPLACE PROCEDURE ESTAPLE.SP_GET_PAYMENTS AS
  V_INT_VALUE   NL_ES_PARAMETERS.INT_VALUE%TYPE;

  CURSOR CUR_GET_ACCOUNTS IS
    SELECT BA.LEGACY_SYSTEM_ACCOUNT_NUM,
           B.ACCOUNT_ID,
           PARENT_ACCOUNT_ID,
           HOME_SYS_ACCOUNT_ID
      FROM   NL_ES_HOME_SYS_ACCOUNT B INNER JOIN   NL_ES_ACCOUNT BA ON BA.ACCOUNT_ID = B.PARENT_ACCOUNT_ID
     WHERE B.SSA = 'BHR';
  V_GROUP_ID              NL_ES_ACCOUNT.LEGACY_SYSTEM_ACCOUNT_NUM%TYPE;
  V_ACCOUNT_ID            NL_ES_HOME_SYS_ACCOUNT.ACCOUNT_ID%TYPE;
  V_PARENT_ACCOUNT_ID     NL_ES_HOME_SYS_ACCOUNT.PARENT_ACCOUNT_ID%TYPE;
  V_HOME_SYS_ACCOUNT_ID   NL_ES_HOME_SYS_ACCOUNT.HOME_SYS_ACCOUNT_ID%TYPE;
  V_LAST_BILL_RUN_DATE  BILLSUMMARY.ACTUAL_BILL_DTM@CDR_NZ%TYPE;
  V_PAYMENT_TYPE        PAYMENTORIGIN.PAYMENT_ORIGIN_NAME@CDR_NZ%TYPE;
  V_PAYMENT_AMT         ACCOUNTPAYMENT.ACCOUNT_PAYMENT_MNY@CDR_NZ%TYPE;
  V_PAYMENT_DAT         ACCOUNTPAYMENT.ACCOUNT_PAYMENT_DAT@CDR_NZ%TYPE;
  V_CREATED_DTM         ACCOUNTPAYMENT.CREATED_DTM@CDR_NZ%TYPE;
  V_TRANSACTION_ID      ACCOUNTPAYMENT.ACCOUNT_PAYMENT_REF@CDR_NZ%TYPE;
  CURSOR CUR_GET_PAYMENTS IS
    SELECT ACCOUNT_PAYMENT_MNY,
           ACCOUNT_PAYMENT_DAT,
           PAYMENT_ORIGIN_NAME,
           CREATED_DTM,
           ACCOUNT_PAYMENT_REF
      FROM ACCOUNTPAYMENT@CDR_NZ A INNER JOIN PAYMENTORIGIN@CDR_NZ P ON A. PAYMENT_ORIGIN_ID = P.PAYMENT_ORIGIN_ID
     WHERE ACCOUNT_NUM = V_HOME_SYS_ACCOUNT_ID AND
           CREATED_DTM >= V_LAST_BILL_RUN_DATE --AND deposit_boo = 'F'
    ;

BEGIN
  SELECT INT_VALUE
    INTO V_INT_VALUE
    FROM   NL_ES_PARAMETERS P
   WHERE P.PARAMETER_NAME LIKE 'Implied Decimel';
  FOR REC_GET_ACCOUNTS IN CUR_GET_ACCOUNTS LOOP
    V_GROUP_ID            := REC_GET_ACCOUNTS.LEGACY_SYSTEM_ACCOUNT_NUM;
    V_ACCOUNT_ID          := REC_GET_ACCOUNTS.ACCOUNT_ID;
    V_PARENT_ACCOUNT_ID   := REC_GET_ACCOUNTS.PARENT_ACCOUNT_ID;
    V_HOME_SYS_ACCOUNT_ID := REC_GET_ACCOUNTS.HOME_SYS_ACCOUNT_ID;
  
    SELECT MAX(TRANS_BILLED_TO_DTM)
      INTO V_LAST_BILL_RUN_DATE
      FROM BILLSUMMARY@CDR_NZ
     WHERE ACCOUNT_NUM = V_HOME_SYS_ACCOUNT_ID AND BILL_STATUS = 1;
  
    FOR REC_GET_PAYMENTS IN CUR_GET_PAYMENTS LOOP
      V_PAYMENT_AMT    := REC_GET_PAYMENTS.ACCOUNT_PAYMENT_MNY;
      V_PAYMENT_DAT    := REC_GET_PAYMENTS.ACCOUNT_PAYMENT_DAT;
      V_PAYMENT_TYPE   := REC_GET_PAYMENTS.PAYMENT_ORIGIN_NAME;
      V_CREATED_DTM    := REC_GET_PAYMENTS.CREATED_DTM;
      V_PAYMENT_AMT    := V_PAYMENT_AMT / (10 ** V_INT_VALUE);
      V_TRANSACTION_ID := REC_GET_PAYMENTS.ACCOUNT_PAYMENT_REF;
      INSERT INTO   NL_ES_PAYMENT_REPORT BP
        (GROUP_ID,
         PARENT_ACCOUNT_ID,
         CHILD_ACCOUNT_ID,
         HOME_SYS_ACCOUNT_ID,
         PAYMENT_AMT,
         PAYMENT_DAT,
         CREATED_DTM,
         LAST_BILL_RUN_DATE,
         TRANSACTION_ID)
      VALUES
        (V_GROUP_ID,
         V_PARENT_ACCOUNT_ID,
         V_ACCOUNT_ID,
         V_HOME_SYS_ACCOUNT_ID,
         V_PAYMENT_AMT,
         V_PAYMENT_DAT,
         V_CREATED_DTM,
         V_LAST_BILL_RUN_DATE,
         V_TRANSACTION_ID);
    
    END LOOP;
  
  END LOOP;
  COMMIT;
END;
===========SP_GET_PENDING_ES_PAYMENTS
CREATE OR REPLACE PROCEDURE ESTAPLE.sp_get_pending_es_payments AS
  v_account_id            NL_es_account.account_id%TYPE;
  v_bill_seq            billsummary.bill_seq@cdr_nz%TYPE;
  v_invoice_total       NUMBER(18, 2);
  v_paid_amt            NUMBER(18, 2);
  v_implied_decimal       NL_es_parameters.parameter_name%TYPE;
  v_filehandle          utl_file.file_type;
  v_count               NUMBER(10) := 0;
  filename              VARCHAR2(50);
  v_error_num             NL_es_error_log.error_code%TYPE;
  v_error_msg             NL_es_error_log.error_msg%TYPE;
  v_date                VARCHAR2(20);
  v_outstanding_balance NUMBER(18, 2);
  CURSOR cur_get_parents IS
    SELECT account_id FROM   NL_es_account;

  CURSOR cur_get_report IS
    SELECT bs.account_num,
           bs.bill_seq,
           bs.invoice_net_mny + bs.invoice_tax_mny AS total_invoice_mny,
           nvl(SUM(atb.amount_mny), 0) AS paid_amt,
           (bs.invoice_net_mny + bs.invoice_tax_mny -
           nvl(SUM(atb.amount_mny), 0)) AS outstanding_balance
      FROM billsummary@cdr_nz bs, allocationtobill@cdr_nz atb
     WHERE bs.account_num = atb.account_num(+) AND
           bs.bill_seq = atb.bill_seq(+) AND bs.account_num = v_account_id
    
     GROUP BY bs.account_num,
              bs.invoice_net_mny + bs.invoice_tax_mny,
              bs.bill_seq
    HAVING(bs.invoice_net_mny + bs.invoice_tax_mny) > nvl(SUM(atb.amount_mny), 0)
     ORDER BY bs.account_num, bs.bill_seq;

BEGIN

  SELECT int_value
    INTO v_implied_decimal
    FROM   NL_es_parameters
   WHERE parameter_name LIKE 'Implied Decimel';
  v_date := to_char(SYSDATE, 'DDMMYYYYHH24MISS');
  FOR rec_get_parents IN cur_get_parents LOOP
  
    v_account_id := rec_get_parents.account_id;
    IF (v_count = 0) THEN
      filename     := 'es_parent_outstanding_' || v_date || '.txt';
      v_filehandle := utl_file.fopen('REPORTS_DIR', filename, 'w');
      utl_file.putf(v_filehandle,
                    'ES_PARENT_ACCOUNT_ID' || ' ' || '          BILL_SEQ' || ' ' ||
                    '       INVOICE_TOTAL' || '              PAID_AMT' ||
                    '       OUTSTANDING_BALANCE');
      utl_file.new_line(v_filehandle);
    END IF;
  
    FOR rec_get_report IN cur_get_report LOOP
      v_bill_seq            := rec_get_report.bill_seq;
      v_invoice_total       := (rec_get_report.total_invoice_mny /
                               (10 ** v_implied_decimal));
      v_paid_amt            := (rec_get_report.paid_amt /
                               (10 ** v_implied_decimal));
      v_outstanding_balance := (rec_get_report.outstanding_balance /
                               (10 ** v_implied_decimal));
    
      utl_file.putf(v_filehandle,
                    lpad(to_char(v_account_id), 20) ||
                    lpad(to_char(v_bill_seq), 20) ||
                    lpad(to_char(v_invoice_total), 20) ||
                    lpad(to_char(v_paid_amt), 20) ||
                    lpad(to_char(v_outstanding_balance), 20));
      utl_file.new_line(v_filehandle);
      v_count := v_count + 1;
    END LOOP;
  END LOOP;
  IF utl_file.is_open(v_filehandle) THEN
  
    --closing the filehandle for the feed file
  
    utl_file.fclose(v_filehandle);
  END IF;
EXCEPTION
  WHEN OTHERS THEN
    v_error_num := SQLCODE;
    v_error_msg := 'error in es  report generation for es parent' ||
                   v_account_id || SQLCODE;
    INSERT INTO   NL_es_error_log
      (module_name, error_msg, error_datetime, error_code)
    VALUES
      ('es report generation', v_error_msg, SYSDATE, v_error_num);
    COMMIT;
  
END;
=======SP_GET_PENDING_ES_PAYMENTS
create or replace procedure estaple.sp_ledger_payment_update

as
v_account_id   NL_es_home_sys_account.account_id%type;
v_home_sys_account_id   NL_es_home_sys_account.home_sys_account_id%type;
v_invoice_seq_no   NL_es_home_sys_account.invoice_seq_no%type;
v_is_new   NL_es_home_sys_account.is_new%type;
v_payment_split   NL_es_payment_split.payment_amount%type;
v_outstanding_bal   NL_es_cdr_bill_invoice.outstanding_bal%type;
v_old_outstanding   NL_es_hbs_ledger.outstanding_at_parent%type;

cursor cur_get_accounts 
is
select bh.account_id,bh.home_sys_account_id,bh.invoice_seq_no,bh.is_new
from   NL_es_home_sys_account bh where bh.is_active=1 and bh.enrollment_date<'1-feb-2012'
and is_new=0
and bh.account_id='1007253782';

begin 

for rec_get_accounts  in cur_get_accounts loop

v_account_id := rec_get_accounts.account_id;
v_home_sys_account_id :=rec_get_accounts.home_sys_account_id;
v_invoice_seq_no :=rec_get_accounts.invoice_seq_no;
v_is_new := rec_get_accounts.is_new;



select bc.amount_paid,bc.outstanding_bal
into v_payment_split,v_outstanding_bal
from   NL_es_cdr_bill_invoice bc 
where bc.account_id=v_account_id
and bc.invoice_seq_no=v_invoice_seq_no and 
bc.invoice_amount>=0;

select b.outstanding_at_parent
into v_old_outstanding
from    NL_es_hbs_ledger b
where b.child_account_id=v_account_id;

update   NL_es_hbs_ledger b
set b.outstanding_at_parent=b.outstanding_at_parent-v_payment_split
where b.child_account_id= v_account_id;



if (v_old_outstanding-v_payment_split)<>v_outstanding_bal
then 
dbms_output.put_line('mismatch in account id'||v_account_id);

end if;



end loop;


exception
when others then 
dbms_output.put_line(sqlerrm);


end;
=======SP_LOG_BILL_INV_ERROR
CREATE OR REPLACE PROCEDURE ESTAPLE.sp_log_bill_inv_error(p_module_name    VARCHAR2,
                                                  p_error_code     VARCHAR2,
                                                  p_error_msg      IN OUT VARCHAR2,
                                                  p_error_datetime DATE) IS
  --version 1.0
--created by - Sumit Aroro(258075)
--Purpose - To log errors of bill invoice in error table

  PRAGMA AUTONOMOUS_TRANSACTION;
BEGIN
  INSERT INTO   NL_es_error_log
    (module_name, error_code, error_msg, error_datetime)
  VALUES
    (p_module_name, p_error_code, p_error_msg, p_error_datetime);
  COMMIT;
END sp_log_bill_inv_error;
=======SP_LOG_ERROR
CREATE OR REPLACE PROCEDURE ESTAPLE.sp_log_error(p_module_name           VARCHAR2,
                                         p_error_code            VARCHAR2,
                                         p_error_msg             IN OUT VARCHAR2,
                                         p_error_datetime        DATE,
                                         p_es_account_id         VARCHAR2,
                                         p_child_es_account_id   VARCHAR2,
                                         p_cust_acq_status       NUMBER
                                         ) IS
 
  -- Purpose : To log the errors into ES database

  PRAGMA AUTONOMOUS_TRANSACTION;
BEGIN
  INSERT INTO   NL_es_error_log
    (module_name, error_code, error_msg, error_datetime)
  VALUES
    (p_module_name, p_error_code, p_error_msg, p_error_datetime);
  p_error_msg := 'HBS account id of ES child account is inactive';
  INSERT INTO   NL_es_cust_acq_response
    (es_account_id,
     es_child_account_id,
     cust_acq_status,
     status_desc,
     acq_date
     )
  VALUES
    (p_es_account_id,
     p_child_es_account_id,
     p_cust_acq_status,
     p_error_msg,
     p_error_datetime
     );
  COMMIT;
END;
==========SP_PARENT_RECON2
CREATE OR REPLACE PROCEDURE ESTAPLE.sp_parent_recon2(p_bill_date DATE) IS

  v_parent_id           NL_es_home_sys_account.parent_account_id%TYPE;
  v_parent_cust_ref   account.customer_ref@cdr_nz%TYPE;
  v_ssa                 NL_es_account.ssa%TYPE;
  v_last_bill_seq       NL_es_account.last_invoice_seq_no%TYPE;
  v_excess            NUMBER(10, 2);
  v_expected          NUMBER(10, 2);
  v_remarks           VARCHAR2(200);
  v_balance_fwd       NUMBER(10, 2);
  v_charges           NUMBER(10, 2);
  v_last_bill_dtm     DATE;
  v_payment_mny       NUMBER(10, 2);
  v_failed_payment    NUMBER(10, 2);
  v_net_payment       NUMBER(10, 2);
  v_missed_amt        NUMBER(10, 2);
  v_actual_bill       NUMBER(10, 2);
  v_diff              NUMBER(10, 2);
  v_excess_diff       NUMBER(10, 2);
  v_missed_diff       NUMBER(10, 2);
  v_parent_adjustment NUMBER(10, 2);
  v_net_diff          NUMBER;
  CURSOR cur_parent_acc IS
    SELECT DISTINCT parent_account_id
      FROM   NL_es_home_sys_account h
     WHERE h.is_active = 1 AND h.enrollment_date < p_bill_date
        
           AND h.parent_account_id IN
           ( SELECT parent_account_id
  FROM b200203226.parent_recon
             );
BEGIN
  FOR rec_parent_acc IN cur_parent_acc LOOP
    v_parent_id := rec_parent_acc.parent_account_id;
  
    BEGIN
      SELECT customer_ref
        INTO v_parent_cust_ref
        FROM account@cdr_nz
       WHERE account_num = v_parent_id;
    
      SELECT ssa, last_invoice_seq_no
        INTO v_ssa, v_last_bill_seq
        FROM   NL_es_account a
       WHERE account_id = v_parent_id;
    
      -- excess
      SELECT nvl(SUM(ep.remaining_amount), 0) / 1000
        INTO v_excess
        FROM   NL_es_excess_payment ep
       WHERE ep.account_id = v_parent_id;
    
      BEGIN
        --expected amount calculation
        SELECT NVL(SUM(BS.BALANCE_OUT_MNY / 1000), 0)
            INTO V_EXPECTED
            FROM BILLSUMMARY@CDR_NZ BS INNER JOIN   NL_ES_HOME_SYS_ACCOUNT HB ON HB.HOME_SYS_ACCOUNT_ID = BS.ACCOUNT_NUM
           WHERE HB.PARENT_ACCOUNT_ID = V_PARENT_ID AND HB.IS_ACTIVE = 1 AND
                 ENROLLMENT_DATE < P_BILL_DATE AND
                 BS.BILL_DTM = P_BILL_DATE AND BS.BILL_STATUS = 1 AND
                 BS.BALANCE_OUT_MNY >= 0;
/*        SELECT nvl(SUM(bs.account_balance / 1000), 0)
          INTO v_expected
          FROM pvaccountbalance@cdr_nz bs INNER JOIN   NL_es_home_sys_account hb ON hb.home_sys_account_id = bs.account_num
         WHERE hb.parent_account_id = v_parent_id AND hb.is_active = 1 AND
               enrollment_date < p_bill_date ;*/
                  
               
      EXCEPTION
        WHEN no_data_found THEN
          v_expected := 0;
      END;
    
      BEGIN
        --calculation of charges,balance_forward
        IF v_last_bill_seq = 0 THEN
          v_balance_fwd := 0;
          SELECT nvl(SUM(p.charge), 0) / 1000
            INTO v_charges
            FROM   NL_es_post_charges_log p
           WHERE p.es_account_id = v_parent_id;
        ELSE
          BEGIN
            SELECT actual_bill_dtm, balance_out_mny / 1000
              INTO v_last_bill_dtm, v_balance_fwd
              FROM billsummary@cdr_nz
             WHERE account_num = v_parent_id AND
                   bill_dtm = add_months(p_bill_date, -1) AND
                   bill_status = 1;
          EXCEPTION
            WHEN no_data_found THEN
              v_remarks := 'LAST BILL NOT FOUND';
          END;
          /* SELECT SUM(p.charge) / 1000
          /*            INTO v_charges
                      FROM   NL_es_post_charges_log p
                     WHERE p.es_account_id = v_parent_id AND
                           p.charge_post_date >= v_last_bill_dtm;*/
        
          SELECT SUM(one_off_number) / 1000
            INTO v_charges
            FROM custproductcharge@cdr_nz cpc INNER JOIN custoverrideprice@cdr_nz co ON cpc.customer_ref = co.customer_ref AND cpc.product_seq = co.product_seq AND (cpc_status = 2 OR last_taxed_cps_id IS NULL) AND co.customer_ref IN (SELECT b.account_id
                                                                                                                                                                                                                                            FROM   NL_es_home_sys_account b
                                                                                                                                                                                                                                           WHERE b.parent_account_id =
                                                                                                                                                                                                                                                 v_parent_id) AND charge_type = 1;
        END IF;
      END;
      --payments
      BEGIN
      
        v_failed_payment := 0;
        v_net_payment    := 0;
        SELECT nvl(SUM(account_payment_mny) / 1000, 0)
          INTO v_payment_mny
          FROM accountpayment@cdr_nz
         WHERE account_num = v_parent_id AND created_dtm >= v_last_bill_dtm;
      EXCEPTION
        WHEN no_data_found THEN
          v_payment_mny := 0;
      END;
      BEGIN
        SELECT nvl(SUM(account_payment_mny) / 1000, 0)
          INTO v_failed_payment
          FROM accountpayment@cdr_nz
         WHERE account_num = v_parent_id AND failed_dtm > v_last_bill_dtm;
      
      EXCEPTION
        WHEN no_data_found THEN
          v_failed_payment := 0;
      END;
      v_net_payment := v_payment_mny - v_failed_payment;
      BEGIN
        --missed bill
       v_missed_amt := 0;
        /*SELECT nvl(SUM(i.outstanding_bal) / 1000, 0)
          INTO v_missed_amt
          FROM   NL_es_cdr_bill_invoice i INNER JOIN   NL_es_home_sys_account h ON i.account_id = h.account_id AND i.invoice_seq_no = h.invoice_seq_no
         WHERE h.parent_account_id = v_parent_id AND
               i.end_date <> p_bill_date AND h.is_active = 1 AND
               i.invoice_seq_no = h.invoice_seq_no AND
               h.enrollment_date < p_bill_date AND i.outstanding_bal >= 0;*/
      EXCEPTION
        WHEN no_data_found THEN
          v_missed_amt := 0;
          NULL;
      END;
    
      BEGIN
        --Adjustment at parent
      
        SELECT nvl(SUM(adjustment_net_mny) / 1000, 0)
          INTO v_parent_adjustment
          FROM adjustment@cdr_nz
         WHERE account_num = v_parent_id AND adjustment_status = 3;
      EXCEPTION
        WHEN no_data_found THEN
          v_parent_adjustment := 0;
          NULL;
      END;
    
      v_actual_bill := v_charges + v_balance_fwd - v_net_payment;
    
      --  - V_PARENT_ADJUSTMENT;
      v_diff        := v_expected - v_actual_bill;
      v_excess_diff := v_diff - v_excess;
      v_missed_diff := v_excess_diff + v_missed_amt - v_parent_adjustment;
      v_net_diff    := v_missed_diff - v_parent_adjustment;
    
      IF (v_missed_diff > -5 AND v_missed_diff < 5) THEN
        v_remarks := 'OK';
      ELSE
        v_remarks := 'difference of ' || v_missed_diff;
      END IF;
    END;
  
    INSERT INTO   NL_parent_recon
    VALUES
      (v_parent_id,
       v_parent_cust_ref,
       v_ssa,
       p_bill_date,
       v_expected,
       v_charges,
       v_balance_fwd,
       v_net_payment,
       v_actual_bill,
       v_diff,
       v_excess,
       v_excess_diff,
       v_missed_amt,
       v_missed_diff,
       v_remarks,
       SYSDATE,
       v_parent_adjustment,
       v_net_diff);
    COMMIT;
  END LOOP;
END sp_parent_recon2;
=============SP_PARENT_RECON_SSA
CREATE OR REPLACE PROCEDURE ESTAPLE.sp_parent_recon_ssa(p_bill_date DATE, p_ssa varchar2) IS

  v_parent_id           NL_es_home_sys_account.parent_account_id%TYPE;
  v_parent_cust_ref   account.customer_ref@cdr_nz%TYPE;
  v_ssa                 NL_es_account.ssa%TYPE;
  v_last_bill_seq       NL_es_account.last_invoice_seq_no%TYPE;
  v_excess            NUMBER(10, 2);
  v_expected          NUMBER(10, 2);
  v_remarks           VARCHAR2(200);
  v_balance_fwd       NUMBER(10, 2);
  v_charges           NUMBER(10, 2);
  v_last_bill_dtm     DATE;
  v_payment_mny       NUMBER(10, 2);
  v_failed_payment    NUMBER(10, 2);
  v_net_payment       NUMBER(10, 2);
  v_missed_amt        NUMBER(10, 2);
  v_actual_bill       NUMBER(10, 2);
  v_diff              NUMBER(10, 2);
  v_excess_diff       NUMBER(10, 2);
  v_missed_diff       NUMBER(10, 2);
  v_parent_adjustment NUMBER(10, 2);
  v_net_diff          NUMBER;
  CURSOR cur_parent_acc IS
    SELECT DISTINCT parent_account_id
      FROM   NL_es_home_sys_account h
     WHERE h.is_active = 1 AND h.enrollment_date < p_bill_date
          
           AND h.ssa in(p_ssa);
  BEGIN
  FOR rec_parent_acc IN cur_parent_acc LOOP
    v_parent_id := rec_parent_acc.parent_account_id;
  
    BEGIN
      SELECT customer_ref
        INTO v_parent_cust_ref
        FROM account@cdr_nz
       WHERE account_num = v_parent_id;
    
      SELECT ssa, last_invoice_seq_no
        INTO v_ssa, v_last_bill_seq
        FROM   NL_es_account a
       WHERE account_id = v_parent_id;
    
      -- excess
      SELECT nvl(SUM(ep.remaining_amount), 0) / 1000
        INTO v_excess
        FROM   NL_es_excess_payment ep
       WHERE ep.account_id = v_parent_id;
    
      BEGIN
        --expected amount calculation
        SELECT nvl(SUM(bs.balance_out_mny / 1000), 0)
          INTO v_expected
          FROM billsummary@cdr_nz bs INNER JOIN   NL_es_home_sys_account hb ON hb.home_sys_account_id = bs.account_num
         WHERE hb.parent_account_id = v_parent_id AND hb.is_active = 1 AND
               enrollment_date < p_bill_date AND bs.bill_dtm = p_bill_date AND
               bs.bill_status = 1 AND bs.balance_out_mny >= 0;
      EXCEPTION
        WHEN no_data_found THEN
          v_expected := 0;
      END;
    
      BEGIN
        --calculation of charges,balance_forward
        IF v_last_bill_seq = 0 THEN
          v_balance_fwd := 0;
          SELECT nvl(SUM(p.charge), 0) / 1000
            INTO v_charges
            FROM   NL_es_post_charges_log p
           WHERE p.es_account_id = v_parent_id;
        ELSE
          BEGIN
            SELECT actual_bill_dtm, balance_out_mny / 1000
              INTO v_last_bill_dtm, v_balance_fwd
              FROM billsummary@cdr_nz
             WHERE account_num = v_parent_id AND
                   bill_dtm = add_months(p_bill_date, -1) AND
                   bill_status = 1;
          EXCEPTION
            WHEN no_data_found THEN
              v_remarks := 'LAST BILL NOT FOUND';
          END;
          SELECT SUM(p.charge) / 1000
            INTO v_charges
            FROM   NL_es_post_charges_log p
           WHERE p.es_account_id = v_parent_id AND
                 p.charge_post_date >= v_last_bill_dtm;
        END IF;
      END;
      --payments
      BEGIN
      
        v_failed_payment := 0;
        v_net_payment    := 0;
        SELECT nvl(SUM(account_payment_mny) / 1000, 0)
          INTO v_payment_mny
          FROM accountpayment@cdr_nz
         WHERE account_num = v_parent_id AND created_dtm >= v_last_bill_dtm;
      EXCEPTION
        WHEN no_data_found THEN
          v_payment_mny := 0;
      END;
      BEGIN
        SELECT nvl(SUM(account_payment_mny) / 1000, 0)
          INTO v_failed_payment
          FROM accountpayment@cdr_nz
         WHERE account_num = v_parent_id AND failed_dtm > v_last_bill_dtm;
      
      EXCEPTION
        WHEN no_data_found THEN
          v_failed_payment := 0;
      END;
      v_net_payment := v_payment_mny - v_failed_payment;
      BEGIN
        --missed bill
      
        SELECT nvl(SUM(i.outstanding_bal) / 1000, 0)
          INTO v_missed_amt
          FROM   NL_es_cdr_bill_invoice i INNER JOIN   NL_es_home_sys_account h ON i.account_id = h.account_id AND i.invoice_seq_no = h.invoice_seq_no
         WHERE h.parent_account_id = v_parent_id AND
               i.end_date <> p_bill_date AND h.is_active = 1 AND  i.invoice_seq_no=h.invoice_seq_no
               and h.enrollment_date < p_bill_date AND i.outstanding_bal >= 0;
      EXCEPTION
        WHEN no_data_found THEN
          v_missed_amt := 0;
          NULL;
      END;
    
      BEGIN
        --Adjustment at parent
      
        SELECT nvl(SUM(adjustment_net_mny) / 1000, 0)
          INTO v_parent_adjustment
          FROM adjustment@cdr_nz
         WHERE account_num = v_parent_id AND adjustment_status = 3;
      EXCEPTION
        WHEN no_data_found THEN
          v_parent_adjustment := 0;
          NULL;
      END;
    
      v_actual_bill := v_charges + v_balance_fwd - v_net_payment;
    
      --  - V_PARENT_ADJUSTMENT;
      v_diff        := v_expected - v_actual_bill;
      v_excess_diff := v_diff - v_excess;
      v_missed_diff := v_excess_diff + v_missed_amt - v_parent_adjustment;
      v_net_diff    := v_missed_diff - v_parent_adjustment;
    
      IF (v_missed_diff > -5 AND v_missed_diff < 5) THEN
        v_remarks := 'OK';
      ELSE
        v_remarks := 'difference of ' || v_missed_diff;
      END IF;
    END;
  
    INSERT INTO   NL_parent_recon
    VALUES
      (v_parent_id,
       v_parent_cust_ref,
       v_ssa,
       p_bill_date,
       v_expected,
       v_charges,
       v_balance_fwd,
       v_net_payment,
       v_actual_bill,
       v_diff,
       v_excess,
       v_excess_diff,
       v_missed_amt,
       v_missed_diff,
       v_remarks,
       SYSDATE,
       v_parent_adjustment,
       v_net_diff);
    COMMIT;
  END LOOP;
END sp_parent_recon;
===========SP_PAYMENT_ROUNDING
CREATE OR REPLACE PROCEDURE ESTAPLE.sp_payment_rounding IS

  v_trans_id     NL_es_payment.transaction_id%TYPE;
  v_acc_id       NL_es_Payment.account_id%TYPE;
  v_es_payment   NL_es_payment.payment_amount%TYPE;
  v_pay_split  NUMBER;
  v_inv_amt      NL_es_cdr_bill_invoice.invoice_amount%TYPE;
  v_diff       NUMBER;
  v_inv_max    NUMBER;
  v_max_acc    NUMBER;
  v_acc          NL_es_cdr_bill_invoice.account_id%TYPE;
  v_err_num    varchar2(10);
  v_err_msg    varchar2(100);
  
  CURSOR cur_es_payments IS
    select ep.transaction_id, ep.account_id
      from   NL_es_payment ep
     where ep.account_id in
           (SELECT account_num
              FROM accountpayment@cdr_nz acc_pay INNER JOIN   NL_es_account es_acc ON acc_pay.account_num = es_acc.account_id
             WHERE es_acc.next_pay_seq <= acc_pay.account_payment_seq AND
                   acc_pay.account_payment_status = 1 AND
                   acc_pay.deposit_boo = 'F');
                   
  CURSOR cur_inv IS
     SELECT account_id, invoice_amount--, invoice_seq_no
        FROM   NL_es_cdr_bill_invoice
       WHERE (account_id, invoice_seq_no) IN
             (SELECT account_id, invoice_seq_no
                FROM   NL_es_home_sys_account hsa
               WHERE parent_account_id = v_acc_id);
   

BEGIN

  OPEN cur_es_payments;
  FETCH cur_es_payments
    INTO v_trans_id, v_acc_id;
  --EXIT WHEN cur_es_payments%NOTFOUND;
  
  WHILE cur_es_payments%FOUND LOOP
  
    SELECT sum(eps.payment_amount)
      INTO v_pay_split
      FROM   NL_es_payment_split eps
     where eps.transaction_id = v_trans_id;
  
    SELECT p.payment_amount
      INTO v_es_payment
      FROM   NL_es_payment p
     WHERE p.account_id = v_acc_id AND
           p.transaction_id=v_trans_id;
             
   /*  SELECT ecb.invoice_amount
     FROM   NL_es_cdr_bill_invoice ecb
     WHERE ecb.account_id IN (select ehs.account_id 
                             from   NL_es_home_sys_account ehs 
                             where ehs.parent_account_id=v_acc_id)
     AND ecb.invoice_seq_no=(select max(ecb.invoice_seq_no)from   NL_es_cdr_bill_invoice ecb where );*/
  
   /* SELECT ec.account_id, ec.invoice_amount
      INTO v_acc, v_inv_amt
      FROM   NL_es_cdr_bill_invoice ec
     WHERE ec.account_id IN
           (SELECT h.home_sys_account_id
              FROM   NL_es_home_sys_account h
             WHERE h.parent_account_id = v_acc_id) 
      AND ec.invoice_amount =
           (SELECT max(ec.invoice_amount)
              from   NL_es_cdr_bill_invoice ec
             where ec.account_id = v_acc_id);*/
     v_inv_max:=0;
     v_max_acc:=null;
     OPEN cur_inv;
     FETCH cur_inv 
        INTO v_acc,v_inv_amt;
   --  EXIT WHEN cur_inv%NOTFOUND;  
     
     WHILE cur_inv%FOUND LOOP
   --  v_tmp := v_inv_amt;
     IF v_inv_max<v_inv_amt THEN
       v_inv_max:=v_inv_amt;
       v_max_acc:=v_acc;
     END IF;
     
  END LOOP;
  END LOOP;
  IF v_pay_split <> v_es_payment THEN
      v_diff := v_es_payment - v_pay_split;
      
      UPDATE   NL_es_cdr_bill_invoice bi
      SET bi.amount_paid=bi.amount_paid + v_diff
      WHERE bi.account_id=v_max_acc
      AND bi.invoice_amount=v_inv_max;
      
      UPDATE   NL_es_payment_split ps
      SET ps.payment_amount = ps.payment_amount + v_diff
      WHERE ps.account_id=v_max_acc;
      COMMIT;
      
    END IF;
    
    EXCEPTION

  WHEN no_data_found THEN
    v_err_num := SQLCODE;
    v_err_msg := 'Error in Payment Rounding:' ||
                 substr(SQLCODE, 1, 100);
    --Inserting into   NL_es_error_log
    INSERT INTO   NL_es_error_log
      (module_name, error_msg, error_datetime, error_code)
    VALUES
      ('Payment Rounding', v_err_msg, SYSDATE, v_err_num);
    COMMIT;
  
  WHEN OTHERS THEN
    v_err_num := SQLCODE;
    v_err_msg := 'Error in Payment Rounding:' ||
                 substr(SQLCODE, 1, 100);
    --Inserting into   NL_es_error_log
    INSERT INTO   NL_es_error_log
      (module_name, error_msg, error_datetime, error_code)
    VALUES
      ('Payment Rounding', v_err_msg, SYSDATE, v_err_num);
    COMMIT;
    END sp_payment_rounding;
==========SP.PAYMENT_ROUNDING
CREATE OR REPLACE PROCEDURE ESTAPLE.sp_payment_rounding IS

  v_trans_id     NL_es_payment.transaction_id%TYPE;
  v_acc_id       NL_es_Payment.account_id%TYPE;
  v_es_payment   NL_es_payment.payment_amount%TYPE;
  v_pay_split  NUMBER;
  v_inv_amt      NL_es_cdr_bill_invoice.invoice_amount%TYPE;
  v_diff       NUMBER;
  v_inv_max    NUMBER;
  v_max_acc    NUMBER;
  v_acc          NL_es_cdr_bill_invoice.account_id%TYPE;
  v_err_num    varchar2(10);
  v_err_msg    varchar2(100);
  
  CURSOR cur_es_payments IS
    select ep.transaction_id, ep.account_id
      from   NL_es_payment ep
     where ep.account_id in
           (SELECT account_num
              FROM accountpayment@cdr_nz acc_pay INNER JOIN   NL_es_account es_acc ON acc_pay.account_num = es_acc.account_id
             WHERE es_acc.next_pay_seq <= acc_pay.account_payment_seq AND
                   acc_pay.account_payment_status = 1 AND
                   acc_pay.deposit_boo = 'F');
                   
  CURSOR cur_inv IS
     SELECT account_id, invoice_amount--, invoice_seq_no
        FROM   NL_es_cdr_bill_invoice
       WHERE (account_id, invoice_seq_no) IN
             (SELECT account_id, invoice_seq_no
                FROM   NL_es_home_sys_account hsa
               WHERE parent_account_id = v_acc_id);
   

BEGIN

  OPEN cur_es_payments;
  FETCH cur_es_payments
    INTO v_trans_id, v_acc_id;
  --EXIT WHEN cur_es_payments%NOTFOUND;
  
  WHILE cur_es_payments%FOUND LOOP
  
    SELECT sum(eps.payment_amount)
      INTO v_pay_split
      FROM   NL_es_payment_split eps
     where eps.transaction_id = v_trans_id;
  
    SELECT p.payment_amount
      INTO v_es_payment
      FROM   NL_es_payment p
     WHERE p.account_id = v_acc_id AND
           p.transaction_id=v_trans_id;
             
   /*  SELECT ecb.invoice_amount
     FROM   NL_es_cdr_bill_invoice ecb
     WHERE ecb.account_id IN (select ehs.account_id 
                             from   NL_es_home_sys_account ehs 
                             where ehs.parent_account_id=v_acc_id)
     AND ecb.invoice_seq_no=(select max(ecb.invoice_seq_no)from   NL_es_cdr_bill_invoice ecb where );*/
  
   /* SELECT ec.account_id, ec.invoice_amount
      INTO v_acc, v_inv_amt
      FROM   NL_es_cdr_bill_invoice ec
     WHERE ec.account_id IN
           (SELECT h.home_sys_account_id
              FROM   NL_es_home_sys_account h
             WHERE h.parent_account_id = v_acc_id) 
      AND ec.invoice_amount =
           (SELECT max(ec.invoice_amount)
              from   NL_es_cdr_bill_invoice ec
             where ec.account_id = v_acc_id);*/
     v_inv_max:=0;
     v_max_acc:=null;
     OPEN cur_inv;
     FETCH cur_inv 
        INTO v_acc,v_inv_amt;
   --  EXIT WHEN cur_inv%NOTFOUND;  
     
     WHILE cur_inv%FOUND LOOP
   --  v_tmp := v_inv_amt;
     IF v_inv_max<v_inv_amt THEN
       v_inv_max:=v_inv_amt;
       v_max_acc:=v_acc;
     END IF;
     
  END LOOP;
  END LOOP;
  IF v_pay_split <> v_es_payment THEN
      v_diff := v_es_payment - v_pay_split;
      
      UPDATE   NL_es_cdr_bill_invoice bi
      SET bi.amount_paid=bi.amount_paid + v_diff
      WHERE bi.account_id=v_max_acc
      AND bi.invoice_amount=v_inv_max;
      
      UPDATE   NL_es_payment_split ps
      SET ps.payment_amount = ps.payment_amount + v_diff
      WHERE ps.account_id=v_max_acc;
      COMMIT;
      
    END IF;
    
    EXCEPTION

  WHEN no_data_found THEN
    v_err_num := SQLCODE;
    v_err_msg := 'Error in Payment Rounding:' ||
                 substr(SQLCODE, 1, 100);
    --Inserting into   NL_es_error_log
    INSERT INTO   NL_es_error_log
      (module_name, error_msg, error_datetime, error_code)
    VALUES
      ('Payment Rounding', v_err_msg, SYSDATE, v_err_num);
    COMMIT;
  
  WHEN OTHERS THEN
    v_err_num := SQLCODE;
    v_err_msg := 'Error in Payment Rounding:' ||
                 substr(SQLCODE, 1, 100);
    --Inserting into   NL_es_error_log
    INSERT INTO   NL_es_error_log
      (module_name, error_msg, error_datetime, error_code)
    VALUES
      ('Payment Rounding', v_err_msg, SYSDATE, v_err_num);
    COMMIT;
    END sp_payment_rounding;
===========SP_POST_DISCOUNT
CREATE OR REPLACE PROCEDURE ESTAPLE.sp_post_discount
is
v_account_id   NL_es_home_sys_account.account_id%type;
v_charge   NL_es_cdr_bill_invoice.charges%type;
v_invoice_seq_no   NL_es_home_sys_account.invoice_seq_no%type;
v_invoice_amount   NL_es_cdr_bill_invoice.invoice_amount%type;

  CURSOR cur_get_accounts iS
    SELECT bd.account_id, bd.discount_amount
      FROM   NL_es_discount_split bd
     WHERE bd.discount_app_date = '1-may-2012';
    
     BEGIN
     
FOR rec_get_accounts IN cur_get_accounts LOOP
  v_account_id := rec_get_accounts.account_id;
  v_charge := rec_get_accounts.discount_amount;
select bh.invoice_seq_no
into v_invoice_seq_no
from   NL_es_home_sys_account bh where bh.account_id=v_account_id;


select bc.invoice_amount
into v_invoice_amount
from   NL_es_cdr_bill_invoice bc where bc.account_id=v_account_id and 
invoice_seq_no=v_invoice_seq_no;

if (v_invoice_amount>=0) then
  sp_create_product(v_account_id,
                    v_account_id,
                    -v_charge,
                    190,
                    v_invoice_seq_no,
                    '1-may-2012',
                    '31-may-2012');
end if;
END LOOP;

END;
========SP_REBILL_CORRECT
CREATE OR REPLACE PROCEDURE ESTAPLE.SP_REBILL_CORRECT(P_REBILL_DTM       IN DATE,
                                              P_CURRENT_BILL_DTM DATE) IS

  BILL_DATE    DATE;
  REBILL_DATE  DATE;
  REBILL_BAL   NUMBER(20);
  BILL_BAL     NUMBER(20);
  NET_CHARGE   NUMBER(20);
  PAYMENTS_MNY NUMBER(20);
  V_REBILL_VER NUMBER;

  CURSOR ACC IS
    SELECT *
      FROM   NL_ES_HOME_SYS_ACCOUNT H
     WHERE H.HOME_SYS_ACCOUNT_ID IN
      ('1007572195', '1007571623', '1007571369', '1007553592', '1007534809',
        '1007534397', '1007606799', '1007529729', '1007539178', '1007538936',
        '1007543179', '1007543180', '1007543187', '1007545581', '1007548604',
        '1007606072', '1007533903', '1007533983', '1007534565', '1007535659',
        '1007535663', '1007535666', '1007535669', '1007535671', '1007537951',
        '1007537974', '1007541756', '1007568487', '1007554014', '1007596798',
        '1007608659', '1007554467', '1007560878', '1007568435', '1007600020',
        '1007529749', '1007568785', '1007575211', '1007575209', '1007568512',
        '1007578463', '1007578475', '1007542001', '1007541999', '1007541997',
        '1007554425', '1007554404', '1007550623', '1007537707', '1007548786',
        '1007545676', '1007531325', '1007568437', '1007568439', '1007549541',
        '1007549538', '1007558279', '1007537948', '1007536500');
 /*          (SELECT ACCOUNT_NUM
              FROM ACCOUNT@CDR_NZ
             WHERE ACCOUNT_NUM IN
                   (SELECT BH.HOME_SYS_ACCOUNT_ID
                      FROM   NL_ES_HOME_SYS_ACCOUNT BH INNER JOIN   NL_ES_CDR_BILL_INVOICE BC ON BC.ACCOUNT_ID = BH.ACCOUNT_ID AND BH.IS_ACTIVE = 1 AND BC.BILL_CYCLE_DATE = P_REBILL_DTM AND BH.PARENT_ACCOUNT_ID IN (SELECT TO_CHAR(PR.PARENT_ID)
                                                                                                                                                                                                                         FROM   NL_PARENT_RECON PR
                                                                                                                                                                                                                        WHERE PR.BILL_CYCLE_DATE =
                                                                                                                                                                                                                              P_CURRENT_BILL_DTM AND
                                                                                                                                                                                                                              PR.REMARKS <> 'OK') INNER JOIN BILLSUMMARY@CDR_NZ B ON(B.ACCOUNT_NUM = BH.HOME_SYS_ACCOUNT_ID AND BC.END_DATE = B.BILL_DTM)
                     WHERE BC.BILL_VERSION <> B.BILL_VERSION AND
                           BILL_STATUS IN (1, 7, 8)) AND
                   LAST_BILL_DTM = P_CURRENT_BILL_DTM) AND H.IS_NEW <> 1;*/

BEGIN

  FOR ACC_REC IN ACC LOOP
    BEGIN
      SELECT ACTUAL_BILL_DTM, BALANCE_OUT_MNY, BILL_VERSION
        INTO REBILL_DATE, REBILL_BAL, V_REBILL_VER
        FROM BILLSUMMARY@CDR_NZ
       WHERE ACCOUNT_NUM = ACC_REC.HOME_SYS_ACCOUNT_ID AND
             BILL_DTM = P_REBILL_DTM AND BILL_STATUS IN (1, 7, 8);
    
      IF ACC_REC.IS_NEW = 0 THEN
    
      SELECT ACTUAL_BILL_DTM, BALANCE_OUT_MNY
        INTO BILL_DATE, BILL_BAL
        FROM BILLSUMMARY@CDR_NZ
       WHERE ACCOUNT_NUM = ACC_REC.HOME_SYS_ACCOUNT_ID AND
             BILL_DTM = P_REBILL_DTM AND BILL_STATUS NOT IN (1, 7, 8);
    
      SELECT NVL(SUM(ACCOUNT_PAYMENT_MNY), 0)
        INTO PAYMENTS_MNY
        FROM ACCOUNTPAYMENT@CDR_NZ
       WHERE ACCOUNT_NUM = ACC_REC.HOME_SYS_ACCOUNT_ID AND
             DEPOSIT_BOO = 'F' AND CREATED_DTM > BILL_DATE AND
             CREATED_DTM < REBILL_DATE AND ACCOUNT_PAYMENT_STATUS = 1 AND
             ACCOUNT_PAYMENT_REF IN
             (SELECT S.TRANSACTION_ID
                FROM   NL_ES_PAYMENT_SPLIT S
               WHERE S.HOME_SYS_ACCOUNT_ID = ACC_REC.HOME_SYS_ACCOUNT_ID);
    
      NET_CHARGE := REBILL_BAL - BILL_BAL + PAYMENTS_MNY;
      IF NET_CHARGE <> 0 THEN
          UPDATE   NL_ES_POST_CHARGES_LOG P
             SET P.CHARGE = P.CHARGE + NET_CHARGE
           WHERE P.CHILD_ACCOUNT_ID = ACC_REC.ACCOUNT_ID AND
                 P.PRODUCT_ID = 188 AND
                 P.INVOICE_SEQ_NO = ACC_REC.INVOICE_SEQ_NO AND
                 P.LOGGED_DATE > P_CURRENT_BILL_DTM;
        
          -- COMMIT;
          SP_CORRECT_EVERYTHING(ACC_REC.ACCOUNT_ID);
        END IF;
      END IF;
      UPDATE   NL_ES_CDR_BILL_INVOICE I
         SET I.BILL_VERSION = V_REBILL_VER
       WHERE I.ACCOUNT_ID = ACC_REC.ACCOUNT_ID AND
             I.END_DATE = P_REBILL_DTM;
      COMMIT;
    
      DBMS_OUTPUT.PUT_LINE(ACC_REC.PARENT_ACCOUNT_ID || '  ' ||
                           ACC_REC.HOME_SYS_ACCOUNT_ID || '  ' ||
                           NET_CHARGE);
    
    EXCEPTION
      WHEN OTHERS THEN
        DBMS_OUTPUT.PUT_LINE(ACC_REC.PARENT_ACCOUNT_ID || '  ' ||
                             ACC_REC.HOME_SYS_ACCOUNT_ID || ' error ');
    END;
  END LOOP;

END SP_REBILL_CORRECT;
========SP_RUN_POSTINGcreate or replace procedure estaple.sp_run_posting1(p_jobname varchar2, p_instance_no number, p_procedure1 varchar2
,p_billcycle1 date ) as

counter1 number;
jobname varchar2(21);


begin
jobname := p_jobname||'%';
loop 
  select count(*) into counter1  from user_scheduler_job_run_details urdl where 
  urdl.job_name like 
jobname and urdl.STATUS='SUCCEEDED';



if (counter1 <= p_instance_no -1  )   then

  
 DBMS_LOCK.sleep(60);
 else
   NL_create_job_instance1(p_procedure1,p_billcycle1);-------call posting code
 dbms_output.put_line ('HI');
exit;
end if;

end loop;

end;


==========SP_RUN_POSING1
create or replace procedure estaple.sp_run_posting1(p_jobname varchar2, p_instance_no number, p_procedure1 varchar2
,p_billcycle1 date ) as

counter1 number;
jobname varchar2(21);


begin
jobname := p_jobname||'%';
loop 
  select count(*) into counter1  from user_scheduler_job_run_details urdl where 
  urdl.job_name like 
jobname and urdl.STATUS='SUCCEEDED';



if (counter1 <= p_instance_no -1  )   then

  
 DBMS_LOCK.sleep(60);
 else
   NL_create_job_instance1(p_procedure1,p_billcycle1);-------call posting code
 dbms_output.put_line ('HI');
exit;
end if;

end loop;

end;


=============SP_RUN_POSTING2
CREATE OR REPLACE PROCEDURE ESTAPLE.sp_special_post AS

  v_account_id           NL_es_home_sys_account.account_id%TYPE;
  v_parent_account_id    NL_es_home_sys_account.parent_account_id%TYPE;
  v_invoice_seq_no       NL_es_home_sys_account.invoice_seq_no%TYPE;
  v_customer_ref       account.customer_ref@cdr_nz%TYPE;
  v_product_name       product.product_name@cdr_nz%TYPE;
  v_product_start_date   NL_es_cdr_bill_invoice.start_date%TYPE;
  v_product_end_date     NL_es_cdr_bill_invoice.end_date%TYPE;
  v_adjustment_mny       NL_es_cdr_bill_invoice.adjustment%TYPE;
  v_payment_mny          NL_es_cdr_bill_invoice.last_payment%TYPE;
  v_charges              NL_es_cdr_bill_invoice.charges%TYPE;
  v_tariff_id          tariff.tariff_id@cdr_nz%TYPE;
  v_is_posted            NL_es_cdr_bill_invoice.is_posted%TYPE;
  v_product_attribute    NL_es_cdr_bill_inv_det.line_item_code_desc%TYPE;
  --    v_invoice_ref_no        NL_es_gsm_bill_inv_det.invoice_ref_no%TYPE;--------- NotRequiredInMigration
  --    v_invoice_ref_resets    NL_es_gsm_bill_inv_det.invoice_ref_resets%TYPE;--------- NotRequiredInMigration
  v_line_item_code_desc     NL_es_cdr_bill_inv_det.line_item_code_desc%TYPE; --------- NotRequiredInMigration
  v_line_item_code          NL_es_cdr_bill_inv_det.line_item_code%TYPE; --------- NotRequiredInMigration
  v_product_id            custhasproduct.product_id@cdr_nz%TYPE;
  v_line_item_amount        NL_es_cdr_bill_inv_det.amount%TYPE; --------- NotRequiredInMigration
  v_is_new                  NL_es_home_sys_account.is_new%TYPE;
  v_balance_forward         NL_es_cdr_bill_invoice.balance_forward%TYPE;
  v_es_adjustment           NL_es_cdr_bill_invoice.outstanding_bal%TYPE;
  v_outstanding_bal         NL_es_cdr_bill_invoice.outstanding_bal%TYPE; --------- Added as RequiredInMigration
  v_home_sys_account_id     NL_es_home_sys_account.home_sys_account_id%TYPE;
  v_newstartdatetime      custproductstatus.effective_dtm@cdr_nz%TYPE;
  v_product_seq           custproductstatus.product_seq@cdr_nz%TYPE;
  v_count                 NUMBER(10) := 0;
  v_enrollment_date         NL_es_home_sys_account.enrollment_date%TYPE;
  v_is_active               NL_es_home_sys_account.is_active%TYPE;
  v_prev_bill_run_date      NL_es_cdr_bill_invoice.bill_run_date%TYPE;
  v_current_bill_run_date   NL_es_cdr_bill_invoice.bill_run_date%TYPE;
  v_end_date                NL_es_cdr_bill_invoice.end_date%TYPE;
  v_left                    NL_es_cdr_bill_invoice.outstanding_bal%TYPE;
  v_refunds_mny             NL_es_cdr_bill_invoice.refunds%TYPE;
  v_failed_payment_mny      NL_es_cdr_bill_invoice.last_payment%TYPE;
  --v_es_discount             NL_es_cdr_bill_inv_det.amount%TYPE;
  -- v_es_discount             NL_es_cdr_bill_inv_det.amount%TYPE;
  --Select all HBS child accounts whose charges are to be posted
  v_errmsg pkg_es_post_charges_del.v_errmsg%TYPE;

  v_errcode pkg_es_post_charges_del.v_errcode%TYPE;

  CURSOR cur_cdr_accounts IS
    SELECT a.account_id,
           a.enrollment_date,
           a.parent_account_id,
           b.invoice_seq_no,
           a.home_sys_account_id,
           is_active
      FROM   NL_es_home_sys_account a INNER JOIN   NL_es_cdr_bill_invoice b ON a.account_id = b.account_id
    
    /*        and a.home_sys_account_id = '3679'*/
    --ROBIN: bill_cycle_date is updated when bill_invoices are fetched, and the arguement passed is the bill_run_date
    --to compare we add the appropriate time period to the date
     WHERE
    --       a.line_of_business = pkg_es.line_of_business_cdr_code AND --------- NotRequiredInMigration
    ( a.parent_account_id = '1013116736' or a.account_id
     in('1021342733')
     
     ) AND
    /*b.fetch_status = 1 AND*/
    /*a.ssa = p_ssa AND*/
     b.is_posted = pkg_es.is_not_posted AND
     a.is_active NOT IN (pkg_es.del_in_progress, pkg_es.deleted)
     ORDER BY parent_account_id, account_id, invoice_seq_no ASC;

  --Select each invoice details according to its line_item_code for a particular account and invoice
  CURSOR cur_cdr_invoice_details IS
    SELECT line_item_code, line_item_code_desc, amount
      FROM   NL_es_cdr_bill_inv_det a
     WHERE a.account_id = v_account_id AND
           a.invoice_seq_no = v_invoice_seq_no
     ORDER BY line_item_code;

  CURSOR cur_customer_products IS
    SELECT chp.product_seq    AS product_seq,
           chp.product_id     AS product_id,
           cps.effective_dtm  AS old_start_date,
           cps.product_status AS product_status
      FROM custhasproduct@cdr_nz chp INNER JOIN custproductstatus@cdr_nz cps ON chp.customer_ref = cps.customer_ref AND chp.product_seq = cps.product_seq
     WHERE chp.customer_ref = v_customer_ref AND
           cps.effective_dtm =
           (SELECT MAX(cps1.effective_dtm)
              FROM custproductstatus@cdr_nz cps1
             WHERE cps1.customer_ref = v_customer_ref AND
                   cps1.product_seq = cps.product_seq) AND
           cps.product_status = pkg_es.product_status_ok;
BEGIN

  --Main procedure begins 
  --Select the tariff_id/Price Plan under which the prices for the products have been overridden
  SELECT t.tariff_id
    INTO v_tariff_id
    FROM tariff@cdr_nz t
   WHERE t.tariff_name = pkg_es.tariff_name AND
         t.catalogue_change_id =
         (SELECT catalogue_change_id
            FROM cataloguechange@cdr_nz
           WHERE catalogue_status = pkg_es.catalogue_status_live);

  --For loop for each of the account
  FOR rec_cdr_accounts IN cur_cdr_accounts LOOP
    BEGIN
      v_account_id          := rec_cdr_accounts.account_id;
      v_parent_account_id   := rec_cdr_accounts.parent_account_id;
      v_invoice_seq_no      := rec_cdr_accounts.invoice_seq_no;
      v_home_sys_account_id := rec_cdr_accounts.home_sys_account_id;
      v_enrollment_date     := rec_cdr_accounts.enrollment_date;
      v_is_active           := rec_cdr_accounts.is_active;
      --Select the ES child customer against whose account these charges are to be posted
      SELECT a.customer_ref
        INTO v_customer_ref
        FROM account@cdr_nz a
       WHERE a.account_num = v_account_id;
    
      SELECT start_date,
             end_date,
             bill_run_date,
             charges,
             adjustment,
             last_payment,
             is_posted,
             balance_forward,
             outstanding_bal
        INTO v_product_start_date,
             v_end_date,
             v_current_bill_run_date,
             v_charges,
             v_adjustment_mny,
             v_payment_mny,
             v_is_posted,
             v_balance_forward,
             v_outstanding_bal
        FROM   NL_es_cdr_bill_invoice a
       WHERE a.account_id = v_account_id AND
             a.invoice_seq_no = v_invoice_seq_no;
      IF v_product_start_date < v_enrollment_date THEN
        v_product_start_date := v_enrollment_date;
      END IF;
      SELECT is_new
        INTO v_is_new
        FROM   NL_es_home_sys_account
       WHERE account_id = v_account_id;
      IF (v_is_active <> pkg_es.del_in_progress) THEN
        IF (v_is_new = 1) THEN
          v_product_start_date := rec_cdr_accounts.enrollment_date;
          v_newstartdatetime   := rec_cdr_accounts.enrollment_date;
        ELSE
          v_newstartdatetime := v_product_start_date;
        END IF; --v_is_new
        v_product_end_date := v_end_date - 1;
      
      END IF;
      IF (v_is_posted = pkg_es.is_not_posted OR
         v_is_active = pkg_es.del_in_progress) THEN
        v_count := 0;
      
        IF (v_is_active <> pkg_es.del_in_progress) THEN
          IF (v_outstanding_bal < 0) THEN
          
            FOR rec_cdr_invoice_details IN cur_cdr_invoice_details LOOP
              v_line_item_code   := rec_cdr_invoice_details.line_item_code;
              v_line_item_amount := rec_cdr_invoice_details.amount;
            
              IF (v_line_item_amount <> 0) THEN
                CASE v_line_item_code
                  WHEN pkg_es.line_item_code_nrc THEN
                    v_line_item_code_desc := rec_cdr_invoice_details.line_item_code_desc;
                    v_product_attribute   := v_line_item_code_desc || ' ' ||
                                             v_home_sys_account_id;
                    v_product_name        := pkg_es.cdr_one_time_charge;
                  WHEN pkg_es.line_item_code_rc THEN
                    v_line_item_code_desc := rec_cdr_invoice_details.line_item_code_desc;
                    v_product_attribute   := v_line_item_code_desc || ' ' ||
                                             v_home_sys_account_id;
                    v_product_name        := pkg_es.cdr_periodic_charge;
                  WHEN pkg_es.line_item_code_usage THEN
                    v_line_item_code_desc := rec_cdr_invoice_details.line_item_code_desc;
                    v_product_attribute   := v_line_item_code_desc || ' ' ||
                                             v_home_sys_account_id;
                    v_product_name        := pkg_es.cdr_usage_charge;
                  WHEN pkg_es.line_item_code_discount THEN
                    v_product_attribute := v_home_sys_account_id;
                    v_product_name      := pkg_es.cdr_discount;
                  WHEN pkg_es.line_item_code_tax THEN
                    v_product_attribute := v_home_sys_account_id;
                    v_product_name      := pkg_es.cdr_tax;
                  WHEN pkg_es.line_item_code_es_discount THEN
                    v_product_attribute := v_home_sys_account_id;
                    v_product_name      := pkg_es.cdr_es_discount;
                END CASE;
              
                SELECT p.product_id
                  INTO v_product_id
                  FROM product@cdr_nz p
                 WHERE p.product_name = v_product_name;
                --  create a new customer product instance
              
                pkg_es_post_charges_del.sp_create_product_instance(v_customer_ref,
                                                                   v_account_id,
                                                                   v_product_id,
                                                                   v_product_start_date,
                                                                   v_product_end_date,
                                                                   v_tariff_id,
                                                                   v_line_item_amount,
                                                                   v_product_attribute,
                                                                   v_invoice_seq_no,
                                                                   --v_invoice_ref_no,
                                                                   --v_invoice_ref_resets,
                                                                   v_parent_account_id,
                                                                   pkg_es.line_of_business_cdr_code,
                                                                   v_is_active);
              END IF; --v_line_item_amount
            END LOOP; --cur_cdr_invoice_details
          
            INSERT INTO   NL_es_hbs_payments
              (account_id,
               home_sys_account_id,
               invoice_seq_no,
               bill_ver,
               hbs_payment,
               failed_hbs_payment,
               deposit,
               refunds,
               charge,
               logged_date,
               start_date,
               end_date)
            VALUES
              (v_account_id,
               v_home_sys_account_id,
               v_invoice_seq_no,
               1,
               0,
               0,
               0,
               0,
               0,
               SYSDATE,
               v_product_start_date,
               v_product_end_date);
          END IF; --(v_is_new = 1 AND v_payment_mny <> -v_balance_forward)
        
          --Posting Adjustment
          IF (v_adjustment_mny <> 0) THEN
            v_product_name      := pkg_es.cdr_adjustment;
            v_product_attribute := v_home_sys_account_id;
          
            SELECT p.product_id
              INTO v_product_id
              FROM product@cdr_nz p
             WHERE p.product_name = v_product_name;
          
            pkg_es_post_charges_del.sp_create_product_instance(v_customer_ref,
                                                               v_account_id,
                                                               v_product_id,
                                                               v_product_start_date,
                                                               v_product_end_date,
                                                               v_tariff_id,
                                                               v_adjustment_mny,
                                                               v_product_attribute,
                                                               v_invoice_seq_no,
                                                               v_parent_account_id,
                                                               pkg_es.line_of_business_cdr_code,
                                                               v_is_active);
          
          END IF; --v_adjustment_mny
        
          UPDATE   NL_es_cdr_bill_invoice
             SET is_posted = pkg_es.is_posted
           WHERE account_id = v_account_id AND
                 invoice_seq_no = v_invoice_seq_no;
        
          COMMIT;
        
        END IF; --(v_outstanding_bal >= 0)
        /*ELSE
        --(v_is_active <> pkg_es.del_in_progress)
        SELECT outstanding_bal
          INTO v_es_adjustment
          FROM   NL_es_cdr_bill_invoice
         WHERE account_id = v_account_id AND
               invoice_seq_no =
               (SELECT MAX(invoice_seq_no)
                  FROM   NL_es_cdr_bill_invoice a
                 WHERE account_id = v_account_id AND
                       a.outstanding_bal >= 0);
        
        IF (v_es_adjustment <> 0) THEN
          v_product_attribute := v_home_sys_account_id;
          v_product_name      := pkg_es.cdr_es_adjustment;
          SELECT p.product_id
            INTO v_product_id
            FROM product@cdr_nz p
           WHERE p.product_name = v_product_name;
          sp_create_product_instance(v_customer_ref,
                                     v_account_id,
                                     v_product_id,
                                     v_product_start_date,
                                     v_product_end_date,
                                     v_tariff_id,
                                     -v_es_adjustment,
                                     v_product_attribute,
                                     v_invoice_seq_no,
                                     -- v_invoice_ref_no,
                                     --v_invoice_ref_resets,
                                     v_parent_account_id,
                                     pkg_es.line_of_business_cdr_code,
                                     v_is_active);
          UPDATE   NL_es_home_sys_account
             SET is_active = pkg_es.deleted
           WHERE account_id = v_account_id;
        END IF; --(v_es_adjustment <> 0)*/
      END IF; --(v_is_active <> pkg_es.del_in_progress)
      IF (v_is_new IN (1, 2) AND v_outstanding_bal > 0) THEN
        UPDATE   NL_es_home_sys_account
           SET is_new = 0
         WHERE account_id = v_account_id;
      END IF; --(v_is_new = 1)
      -- END IF; --v_is_posted
    
    EXCEPTION
      WHEN no_data_found THEN
        IF (cur_cdr_accounts%ISOPEN) THEN
          CLOSE cur_cdr_accounts;
        ELSIF (cur_cdr_invoice_details%ISOPEN) THEN
          CLOSE cur_cdr_invoice_details;
        ELSIF (cur_customer_products%ISOPEN) THEN
          CLOSE cur_customer_products;
        END IF;
        ROLLBACK;
        v_errmsg  := 'ES child account no:' || v_account_id ||
                     'ES parent account no:' || v_parent_account_id || ' ' ||
                     SQLERRM;
        v_errcode := SQLCODE;
        INSERT INTO   NL_es_error_log
          (module_name, error_code, error_msg, error_datetime)
        VALUES
          ('Posting  Charges', v_errcode, v_errmsg, SYSDATE);
        COMMIT;
      WHEN dup_val_on_index THEN
        IF (cur_cdr_accounts%ISOPEN) THEN
          CLOSE cur_cdr_accounts;
        ELSIF (cur_cdr_invoice_details%ISOPEN) THEN
          CLOSE cur_cdr_invoice_details;
        ELSIF (cur_customer_products%ISOPEN) THEN
          CLOSE cur_customer_products;
        END IF;
        ROLLBACK;
        v_errmsg  := 'ES child account no:' || v_account_id ||
                     'ES parent account no:' || v_parent_account_id || ' ' ||
                     SQLERRM;
        v_errcode := SQLCODE;
        INSERT INTO   NL_es_error_log
          (module_name, error_code, error_msg, error_datetime)
        VALUES
          ('Posting  Charges', v_errcode, v_errmsg, SYSDATE);
        COMMIT;
      WHEN invalid_cursor THEN
        IF (cur_cdr_accounts%ISOPEN) THEN
          CLOSE cur_cdr_accounts;
        ELSIF (cur_cdr_invoice_details%ISOPEN) THEN
          CLOSE cur_cdr_invoice_details;
        ELSIF (cur_customer_products%ISOPEN) THEN
          CLOSE cur_customer_products;
        END IF;
        ROLLBACK;
        v_errmsg  := 'ES child account no:' || v_account_id ||
                     'ES parent account no:' || v_parent_account_id || ' ' ||
                     SQLERRM;
        v_errcode := SQLCODE;
        INSERT INTO   NL_es_error_log
          (module_name, error_code, error_msg, error_datetime)
        VALUES
          ('Posting  Charges', v_errcode, v_errmsg, SYSDATE);
        COMMIT;
      WHEN too_many_rows THEN
        IF (cur_cdr_accounts%ISOPEN) THEN
          CLOSE cur_cdr_accounts;
        ELSIF (cur_cdr_invoice_details%ISOPEN) THEN
          CLOSE cur_cdr_invoice_details;
        ELSIF (cur_customer_products%ISOPEN) THEN
          CLOSE cur_customer_products;
        END IF;
        ROLLBACK;
        v_errmsg  := 'ES child account no:' || v_account_id ||
                     'ES parent account no:' || v_parent_account_id || ' ' ||
                     SQLERRM;
        v_errcode := SQLCODE;
        INSERT INTO   NL_es_error_log
          (module_name, error_code, error_msg, error_datetime)
        VALUES
          ('Posting  Charges', v_errcode, v_errmsg, SYSDATE);
        COMMIT;
      WHEN cursor_already_open THEN
        IF (cur_cdr_accounts%ISOPEN) THEN
          CLOSE cur_cdr_accounts;
        ELSIF (cur_cdr_invoice_details%ISOPEN) THEN
          CLOSE cur_cdr_invoice_details;
        ELSIF (cur_customer_products%ISOPEN) THEN
          CLOSE cur_customer_products;
        END IF;
        ROLLBACK;
        v_errmsg  := 'ES child account no:' || v_account_id ||
                     'ES parent account no:' || v_parent_account_id || ' ' ||
                     SQLERRM;
        v_errcode := SQLCODE;
        INSERT INTO   NL_es_error_log
          (module_name, error_code, error_msg, error_datetime)
        VALUES
          ('Posting  Charges', v_errcode, v_errmsg, SYSDATE);
        COMMIT;
      WHEN case_not_found THEN
        IF (cur_cdr_accounts%ISOPEN) THEN
          CLOSE cur_cdr_accounts;
        ELSIF (cur_cdr_invoice_details%ISOPEN) THEN
          CLOSE cur_cdr_invoice_details;
        ELSIF (cur_customer_products%ISOPEN) THEN
          CLOSE cur_customer_products;
        END IF;
        ROLLBACK;
        v_errmsg  := 'ES child account no:' || v_account_id ||
                     'ES parent account no:' || v_parent_account_id || ' ' ||
                     SQLERRM;
        v_errcode := SQLCODE;
        INSERT INTO   NL_es_error_log
          (module_name, error_code, error_msg, error_datetime)
        VALUES
          ('Posting  Charges', v_errcode, v_errmsg, SYSDATE);
        COMMIT;
      WHEN OTHERS THEN
        /*  IF (cur_cdr_accounts%ISOPEN) THEN
          CLOSE cur_cdr_accounts;
        ELSIF (cur_cdr_invoice_details%ISOPEN) THEN
          CLOSE cur_cdr_invoice_details;
        ELSIF (cur_customer_products%ISOPEN) THEN
          CLOSE cur_customer_products;
        END IF;*/
        ROLLBACK;
        v_errmsg  := 'ES child account no:' || v_account_id ||
                     'ES parent account no:' || v_parent_account_id || ' ' ||
                     SQLERRM;
        v_errcode := SQLCODE;
        INSERT INTO   NL_es_error_log
          (module_name, error_code, error_msg, error_datetime)
        VALUES
          ('Posting  Charges', v_errcode, v_errmsg, SYSDATE);
        COMMIT;
    END;
  
  END LOOP; --cur_cdr_accounts

END sp_special_post;
=============SP_TERMINATE_PRODUCTS
create or replace procedure estaple.sp_test_bill_check(p_ssa              in VarChar2,
                                               p_bill_cycle_date  in date,
                                               p_charge_post_date in date) as

  v_charge         number(20);
  v_total_charges  number(20);
  v_invoice_amount number(20);

  cursor cur_parents is
    select distinct parent_account_id, account_id
      from   NL_es_home_sys_account
     where ssa = p_ssa and is_active = 1;

  v_parent_account_id varchar2(20);
  v_account_id        varchar2(20);

  cursor cur_balance_forward is
    select balance_out_mny, actual_bill_dtm
      from billsummary@cdR_nz
     where account_num = v_parent_account_id and
           bill_dtm = (add_months(last_day(p_bill_cycle_date), -2) + 1);

  v_balance_out_mny number(20);
  v_actual_bill_dtm date;

  cursor cur_payemnts_mny is
    select sum(account_payment_mny)
      from accountpayment@cdR_nz
     where account_num = v_parent_account_id and
           trunc(account_payment_dat) > = trunc(v_actual_bill_dtm)
     group by account_num;

  v_payment_mny number(20);

BEGIN
  open cur_parents;
  loop
    fetch cur_parents
      into v_parent_account_id, v_account_id;
    exit when cur_parents%NOTFOUND;
  
    begin
      select sum(charge)
        into v_charge
        from   NL_Es_Post_Charges_Log p
       where p.child_account_id = v_account_id and
             trunc(p.charge_post_date) = p_charge_post_date;
    
      if v_charge is null then v_charge := 0;
      end if;
      v_total_charges := v_total_charges + v_charge;
    Exception
      When no_data_found then
        v_charge := 0;
       end;   
  
    open cur_balance_forward;
    loop
      fetch cur_balance_forward
        into v_balance_out_mny, v_actual_bill_dtm;
      exit when cur_balance_forward%NOTFOUND;
    
      open cur_payemnts_mny;
      loop
        fetch cur_payemnts_mny
          into v_payment_mny;
        exit when cur_payemnts_mny%NOTFOUND;
      
        v_invoice_amount := v_total_charges + v_balance_out_mny -
                            v_payment_mny;
      
        insert into test_bill_check
        values
          (v_parent_account_id,
           v_total_charges,
           v_balance_out_mny,
           v_payment_mny,
           v_invoice_amount);
      
      end loop;
      close cur_payemnts_mny;
    end loop;
    close cur_balance_forward;
  end loop;
  close cur_parents;

end sp_test_bill_check;
=============SP_UPDATE_ES_POST_ES_BILL_RUN
CREATE OR REPLACE PROCEDURE ESTAPLE.sp_update_es_post_es_bill_run /*(P_SSA VARCHAR2)*/
 AS

  --Author : 230328
  --created : march16,2009
  --Brief Info: the script updates ES bill cycle date and ES invoice sequence after the ES bill run.
  --version changed from 1.0 to 1.1 , proc name changed ,exception handled if bill for es parent account is not found in IRB 
  --variable declaration
  v_es_bill_cycle_date        NL_es_account.bill_cycle_date%TYPE;
  v_last_es_bill_cycle_date   NL_es_home_sys_account.last_bill_cycle_date%TYPE;
  v_child_invoice_seq_no      NL_es_home_sys_account.invoice_seq_no%TYPE;
  v_es_invoice_seq_no       billsummary.bill_seq@cdr_nz %TYPE;
  v_last_invoice_seq_no       NL_es_account.last_invoice_seq_no%TYPE;
  v_parent_account_id         NL_es_account.account_id%TYPE;
  v_child_account_id          NL_es_home_sys_account.account_id%TYPE;
  v_err_num                 NUMBER;
  v_err_msg                 VARCHAR2(570);

  --v_bill_seq billsummary.bill_seq@cdr_nz%type;

  --cursor to fetch all parent accounts' next bill cycle date
  CURSOR cur_parent_account IS
    SELECT es.account_id,
           acc.next_bill_dtm,
           acc.last_bill_dtm,
           acc.last_bill_seq
      FROM   NL_es_account es INNER JOIN account@cdr_nz acc ON es.account_id = acc.account_num /*AND ES.SSA = P_SSA*/
    ;

  --cursor to fetch child accounts and their latest invoice seq no.
  CURSOR cur_child_accounts IS
    SELECT h.account_id, h.invoice_seq_no
      FROM   NL_es_home_sys_account h
     WHERE h.parent_account_id = v_parent_account_id;

BEGIN

  --open cursor cur_parent_account
  OPEN cur_parent_account;
  LOOP
    FETCH cur_parent_account
      INTO v_parent_account_id, v_es_bill_cycle_date, v_last_es_bill_cycle_date, v_last_invoice_seq_no;
    EXIT WHEN cur_parent_account%NOTFOUND;
  
    v_es_bill_cycle_date      := to_date(to_char(v_es_bill_cycle_date,
                                                 'MM/DD/YYYY'),
                                         'MM/DD/YYYY');
    v_last_es_bill_cycle_date := to_date(to_char(v_last_es_bill_cycle_date,
                                                 'MM/DD/YYYY'),
                                         'MM/DD/YYYY');
  
    BEGIN
      --fetching the latest es invoice seq no
      SELECT bill_seq
        INTO v_es_invoice_seq_no
        FROM billsummary@cdr_nz
       WHERE account_num = v_parent_account_id AND
             to_date(to_char(bill_dtm, 'MM/DD/YYYY'), 'MM/DD/YYYY') =
             v_last_es_bill_cycle_date AND bill_status = 1;
    
      --updating next bill cycle date in   NL_es_account
      UPDATE   NL_es_account es
         SET es.bill_cycle_date  = v_es_bill_cycle_date,
             last_invoice_seq_no = v_last_invoice_seq_no
       WHERE es.account_id = v_parent_account_id;
    
      --updating latest es invoice seq no in   NL_es_discount
      /* UPDATE   NL_es_discount disc
        SET disc.es_invoice_seq_no = v_es_invoice_seq_no
      WHERE disc.es_account_id = v_parent_account_id AND
            disc.bill_cycle_date = v_last_es_bill_cycle_date;*/
    
      IF (cur_child_accounts%ISOPEN) THEN
        CLOSE cur_child_accounts;
      END IF;
    
      --open cusor cur_child_accounts
      OPEN cur_child_accounts;
      LOOP
        FETCH cur_child_accounts
          INTO v_child_account_id, v_child_invoice_seq_no;
        EXIT WHEN cur_child_accounts%NOTFOUND;
      
        --updating latest es invoice seq for each child account
        UPDATE   NL_es_post_charges_log l
           SET l.es_invoice_seq_no = v_es_invoice_seq_no
         WHERE l.child_account_id = v_child_account_id AND
               l.invoice_seq_no = v_child_invoice_seq_no;
      
        --end loop for cursor cur_child_accounts
      END LOOP;
    EXCEPTION
      WHEN no_data_found THEN
        NULL;
    END;
    COMMIT;
    --end loop for cursor cur_parent_account
  END LOOP;

  --exception handling
EXCEPTION
  WHEN no_data_found THEN
  
    ROLLBACK;
    v_err_num := SQLCODE;
    v_err_msg := 'Error in updating es bill cycle /es invoice seq :' || ' ' ||
                 SQLERRM;
    INSERT INTO   NL_es_error_log
      (module_name, error_code, error_msg, error_datetime)
    VALUES
      ('ES UPDATE SCRIPT', v_err_num, v_err_msg, SYSDATE);
    COMMIT;
  
  WHEN cursor_already_open THEN
    ROLLBACK;
    v_err_num := SQLCODE;
    v_err_msg := 'Error in updating es bill cycle /es invoice seq :' || ' ' ||
                 SQLERRM;
    INSERT INTO   NL_es_error_log
      (module_name, error_code, error_msg, error_datetime)
    VALUES
      ('ES UPDATE SCRIPT', v_err_num, v_err_msg, SYSDATE);
  
    COMMIT;
  WHEN dup_val_on_index THEN
    ROLLBACK;
    v_err_num := SQLCODE;
    v_err_msg := 'Error in updating es bill cycle /es invoice seq :' || ' ' ||
  
               SQLERRM;
    INSERT INTO   NL_es_error_log
      (module_name, error_code, error_msg, error_datetime)
    VALUES
      ('ES UPDATE SCRIPT', v_err_num, v_err_msg, SYSDATE);
    COMMIT;
  WHEN invalid_cursor THEN
    ROLLBACK;
    v_err_num := SQLCODE;
    v_err_msg := 'Error in updating es bill cycle /es invoice seq :' || ' ' ||
                 SQLERRM;
    INSERT INTO   NL_es_error_log
      (module_name, error_code, error_msg, error_datetime)
    VALUES
      ('ES UPDATE SCRIPT', v_err_num, v_err_msg, SYSDATE);
    COMMIT;
  WHEN too_many_rows THEN
    ROLLBACK;
    v_err_num := SQLCODE;
    v_err_msg := 'Error in updating es bill cycle /es invoice seq :' || ' ' ||
                 SQLERRM;
    INSERT INTO   NL_es_error_log
      (module_name, error_code, error_msg, error_datetime)
    VALUES
      ('ES UPDATE SCRIPT', v_err_num, v_err_msg, SYSDATE);
    COMMIT;
    ROLLBACK;
  
  --end procedure
END;
==========SP_UPDATE_HBS_BILLING_TABLE
CREATE OR REPLACE PROCEDURE ESTAPLE.sp_update_hbs_billing_table(p_bill_cycle_date DATE) IS

  v_home_sys   NL_es_home_sys_account.home_sys_account_id%TYPE;
  v_ssa        NL_es_home_sys_account.ssa%TYPE;
  v_errcode  VARCHAR2(500);
  v_errmsg   VARCHAR2(500);

  CURSOR get_ssa IS
    SELECT DISTINCT ssa
      FROM   NL_es_home_sys_account hb
     WHERE ssa IS NOT NULL ;
     

  CURSOR get_details IS
    SELECT home_sys_account_id
      FROM   NL_es_home_sys_account h
     WHERE h.ssa = v_ssa AND h.is_active = pkg_es.is_active
     and h.enrollment_date<p_bill_cycle_date;

BEGIN
delete from oper_rem.HBS_all_ssa@CDR_NZ;

  FOR rec_ssa IN get_ssa LOOP
    v_ssa := rec_ssa.ssa;
  
   
   
    FOR rec_details IN get_details LOOP
      v_home_sys := rec_details.home_sys_account_id;
    
      BEGIN
      
      INSERT INTO oper_rem.HBS_ALL_SSA@CDR_NZ VALUES(v_home_sys,v_ssa);
      
        --EXECUTE IMMEDIATE 'insert into oper_rem.HBS_' || v_ssa ||'@cdr_nz VALUES(' || v_home_sys || ')';
      
      EXCEPTION
        WHEN OTHERS THEN
        v_errcode := SQLCODE;
        v_errmsg  := SQLERRM;
          dbms_output.put_line('hbs' || v_ssa || v_errmsg || v_errcode);
        
      END;
    END LOOP;
    COMMIT;
  END LOOP;

EXCEPTION

  WHEN no_data_found THEN
    ROLLBACK;
    v_errcode := SQLCODE;
    v_errmsg  := SQLERRM;
    INSERT INTO   NL_es_error_log
      (module_name, error_code, error_msg, error_datetime)
    VALUES
      ('UPDATE HBS BILLING TABLE', v_errcode, v_errmsg, SYSDATE);
    COMMIT;
  
  WHEN cursor_already_open THEN
    ROLLBACK;
    v_errcode := SQLCODE;
    v_errmsg  := SQLERRM;
    INSERT INTO   NL_es_error_log
      (module_name, error_code, error_msg, error_datetime)
    VALUES
      ('UPDATE HBS BILLING TABLE', v_errcode, v_errmsg, SYSDATE);
    COMMIT;
  
  WHEN dup_val_on_index THEN
    ROLLBACK;
    v_errcode := SQLCODE;
    v_errmsg  := SQLERRM;
    INSERT INTO   NL_es_error_log
      (module_name, error_code, error_msg, error_datetime)
    VALUES
      ('UPDATE HBS BILLING TABLE', v_errcode, v_errmsg, SYSDATE);
    COMMIT;
  
  WHEN invalid_cursor THEN
    ROLLBACK;
    v_errcode := SQLCODE;
    v_errmsg  := SQLERRM;
    INSERT INTO   NL_es_error_log
      (module_name, error_code, error_msg, error_datetime)
    VALUES
      ('UPDATE HBS BILLING TABLE', v_errcode, v_errmsg, SYSDATE);
    COMMIT;
  
  WHEN too_many_rows THEN
    ROLLBACK;
    v_errcode := SQLCODE;
    v_errmsg  := SQLERRM;
    INSERT INTO   NL_es_error_log
      (module_name, error_code, error_msg, error_datetime)
    VALUES
      ('UPDATE HBS BILLING TABLE', v_errcode, v_errmsg, SYSDATE);
    COMMIT;
  
  WHEN OTHERS THEN
    ROLLBACK;
    v_errcode := SQLCODE;
    v_errmsg  := SQLERRM;
    INSERT INTO   NL_es_error_log
      (module_name, error_code, error_msg, error_datetime)
    VALUES
      ('UPDATE HBS BILLING TABLE '||'HBS_'||V_SSA , v_errcode, v_errmsg, SYSDATE);
    COMMIT;
  COMMIT;
END sp_update_hbs_billing_table;
=============UPDATE_INVOICE_NO
CREATE OR REPLACE PROCEDURE ESTAPLE.update_invoice_no IS
  v_account    NL_es_account.account_id%TYPE;
  v_bill_dtm DATE;
  v_bill_seq NUMBER;
  CURSOR cur_accounts IS
    SELECT r.home_sys_account_id
      FROM   NL_es_home_sys_account r
     WHERE r.parent_account_id IN
           (SELECT a.account_id FROM   NL_es_account a WHERE a.ssa = 'KYN');
BEGIN
  OPEN cur_accounts;
  LOOP
    FETCH cur_accounts
      INTO v_account;
    EXIT WHEN cur_accounts%NOTFOUND;
    SELECT bill_seq, bill_dtm
      INTO v_bill_seq, v_bill_dtm
      FROM billsummary@cdr_nz
     WHERE bill_seq = (SELECT MAX(bill_seq)
                         FROM billsummary@cdr_nz
                        WHERE account_num = '1001392775') AND
           account_num = '1001392775' AND bill_status = 1;
  
    IF v_bill_dtm = to_date('01-05-2010', 'dd-mm-yyyy') THEN
      UPDATE   NL_es_home_sys_account
         SET invoice_seq_no = v_bill_seq
       WHERE account_id = '1001392775';
    ELSE
      dbms_output.put_line(v_account);
    END IF;
  END LOOP;
END update_invoice_no;
===============UPDATE_SERVICES
create or replace procedure estaple.update_services is

  v_account_id   varchar2(20);
  v_hbs_id       varchar2(20);
  v_prod_label   varchar2(20);
  v_customer_ref varchar2(20);
  v_prod_seq     varchar2(2);
  v_product_seq  varchar2(2);

  cursor cur_get_accounts is
    select account_id, home_sys_account_id, product_seq
      from   NL_es_cdr_services t
     where t.telephone_no is null;
    
  cursor cur_get_customer_ref is
    select customer_ref from account@cdr_nz where account_num = v_hbs_id;

  cursor cur_get_product_label is
    select product_label, product_seq
      from custproductdetails@cdr_nz
     where customer_ref = v_customer_ref and product_seq = v_prod_seq;

begin
  for get_accounts in cur_get_accounts LOOP
    v_account_id := get_accounts.account_id;
    v_hbs_id     := get_accounts.home_sys_account_id;
    v_prod_seq   := get_accounts.product_seq;
  
    for get_customer_ref in cur_get_customer_ref LOOP
      v_customer_ref := get_customer_ref.customer_ref;
    
      for get_product_label in cur_get_product_label LOOP
        v_prod_label  := get_product_label.product_label;
        v_product_seq := get_product_label.product_seq;
      
        update   NL_es_cdr_services
           set telephone_no = v_prod_label
         where account_id = v_account_id and product_seq = v_product_seq;
      end loop;
    end loop;
  end loop;
commit;
end update_services;

E-stapling procedures.txt
Displaying E-stapling procedures.txt.
===============================



No comments:

Post a Comment

Small coding languages

  Yes, Hack is a programming language developed by Facebook (now Meta) as a dialect of PHP. It was designed to address some of the limitatio...