Wednesday, 24 January 2018

How to create revenue events by using PA_EVENT_PUB API in R12?

create or replace PACKAGE BODY XXX_6666_reversal_pkg
IS

--==============================================================================
--                          GLOBAL CONSTANTS
--==============================================================================

  CN_PROJECT_CLASS            CONSTANT      VARCHAR2(60)    := 'Revenue Recognition Method';
  CN_CLASS_CODE               CONSTANT      VARCHAR2(30)    := 'ASC606'; 
  CN_REVERSAL_EVENT_TYPE      CONSTANT      VARCHAR2(30)    := 'REVENUE 6666 CONTRA';
  CN_EVENT_QUALIFIER          CONSTANT      VARCHAR2(30)    :=  'T6666';
  CN_6666_CONT_EVENT_QUALIFIER CONSTANT      VARCHAR2(30)   :=  'T6666 Contra';
  CN_606_EVENT_QUALIFIER      CONSTANT      VARCHAR2(30)    :=  'T606';
 

PROCEDURE Debug( p_message  IN  VARCHAR2
               ) IS
lv_message       VARCHAR2(200);
 
BEGIN
 
      lv_message    := SUBSTR(p_message,1,240);
      fnd_file.put_line(fnd_file.log, lv_message);
 
END Debug;


 PROCEDURE XXX_reversal_proc (
                                     p_project_id     NUMBER ,
                                     p_project_num    VARCHAR2,
                                     p_program_mode   VARCHAR2,
                                     p_as_of_date     DATE,
                                     p_event_type     VARCHAR2,
                                     p_task           VARCHAR2
                                     ) IS

-- +====================================================================+
--     LOCAL VARIABLES
-- +====================================================================+
 
       ln_event_id                NUMBER;
       ln_line_num                NUMBER := 0;
       ln_msg_count               NUMBER := 0;
       ln_seq_val                 NUMBER := 0;
       ld_complete_date           DATE;
       lv_flexfield_name          VARCHAR2(100) := 'PA_EVENTS_DESC_FLEX';
       lv_msg_data                VARCHAR2(100);
       lv_bill_hold_flag          VARCHAR2(3)   := 'N';
       lv_product_code            VARCHAR2(100) := 'XXX';
       lv_flag            VARCHAR2(3):='S';
       lv_6666_rev_task    VARCHAR2(40);
   --    lc_proj_rate_type     VARCHAR2(30);  -- Commented on 20-DEC-17
   --    ln_proj_ex_rate       NUMBER;        -- Commented on 20-DEC-17
--    lc_projfunc_rate_type VARCHAR2(30);  -- Commented on 20-DEC-17
   --    ln_projfunc_ex_rate   NUMBER;        -- Commented on 20-DEC-17

     
     
-- +====================================================================+
--   Declaring PLSQL TABLE TYPE VARIABLES.
-- +====================================================================+     

       lt_in_tbl_type     pa_event_pub.event_in_tbl_type;
       lt_out_tbl_type    pa_event_pub.event_out_tbl_type;
     
-- +====================================================================+
--   lcu_6666_reversal Cursor is used to fetch the events data.
-- +====================================================================+

CURSOR lcu_6666_reversal
IS 
SELECT pp.segment1,
       pe.project_id,
       pe.organization_id,
       round(-1 * sum(pe.bill_trans_rev_amount),2) trx_rev_amt,
       pe.bill_trans_currency_code        trx_rev_curr, 
       pe.PROJECT_CURRENCY_CODE  proj_curr,
       round(-1 * sum(pe.PROJECT_REVENUE_AMOUNT)) proj_rev_amt,
       pe.PROJFUNC_CURRENCY_CODE projfunc_curr,
       round(-1 * sum(pe.PROJFUNC_REVENUE_AMOUNT)) projfunc_rev_amt
FROM 
       pa_projects pp,
       pa_project_classes_v ppc,
       pa_tasks pt,
       pa_events pe,
       pa_event_types pet
WHERE ppc.class_category          =  CN_PROJECT_CLASS
AND   ppc.class_code              =  CN_CLASS_CODE
AND   ppc.project_id              =  pp.project_id
AND   pp.project_id               =  p_project_id
AND   pp.project_id               =  pt.project_id
AND   pe.project_id               =  pp.project_id
AND   pt.task_id                  =  pe.task_id
AND   pe.revenue_distributed_flag = 'Y'
AND   pe.event_type               = pet.event_type
AND   pet.attribute3              = CN_EVENT_QUALIFIER
AND   nvl(pe.attribute7,'@#$')   != CN_EVENT_QUALIFIER
AND   pe.completion_date         <=  p_as_of_date
GROUP BY pp.segment1,
         pe.project_id,
         pe.organization_id,
         pe.bill_trans_currency_code
         ,pe.PROJECT_CURRENCY_CODE
         ,pe.projfunc_currency_code
HAVING SUM(pe.bill_trans_rev_amount) != 0
order by 1;

-- +====================================================================+
--   lcu_6666_task Cursor used to fetch the 6666 reversal Task.
-- +====================================================================+
CURSOR lcu_6666_task(p_project_id NUMBER)
IS
SELECT task_number
FROM   pa_tasks pt
WHERE  pt.project_id = p_project_id
AND    pt.attribute6 =  CN_6666_CONT_EVENT_QUALIFIER;


BEGIN
 
  debug('XXX_reversal_proc => begining of procedure');
 
FOR rev_rec IN lcu_6666_reversal
LOOP

     debug('XXX_reversal_proc => Inside rev_rec loop');
   
     SELECT XXX_REV_SEQ.NEXTVAL INTO ln_seq_val FROM DUAL; 
       
        debug('XXX_reversal_proc => ln_seq_val Sequence value '||ln_seq_val);
       
   lv_flag := 'S';
 

   debug('XXX_reversal_proc => LV_FLAG '||LV_FLAG);
   debug('XXX_reversal_proc => projfunc_curr '||rev_rec.projfunc_curr);
   debug('XXX_reversal_proc => proj_curr '||rev_rec.proj_curr);
 
 IF  LV_FLAG <> 'E' then

   
   
      debug('XXX_6666_main => prepare data for Creating event');   

        ln_line_num       := 1;

            lt_in_tbl_type(ln_line_num).p_project_number            := rev_rec.segment1;
            lt_in_tbl_type(ln_line_num).p_event_type                := p_event_type;
            lt_in_tbl_type(ln_line_num).p_description               := 'Revenue reversal for project: '||rev_rec.segment1;
            lt_in_tbl_type(ln_line_num).p_completion_date           := p_as_of_date;
            lt_in_tbl_type(ln_line_num).p_task_number               := lv_6666_rev_task;
            lt_in_tbl_type(ln_line_num).p_organization_name         := lv_org_name;
            lt_in_tbl_type(ln_line_num).p_bill_trans_bill_amount    := 0;
            lt_in_tbl_type(ln_line_num).p_bill_trans_rev_amount     := rev_rec.trx_rev_amt;
            lt_in_tbl_type(ln_line_num).p_desc_flex_name            := lv_flexfield_name;
            lt_in_tbl_type(ln_line_num).p_attribute2                := rev_rec.Organization_Id;
            lt_in_tbl_type(ln_line_num).p_attribute7                := CN_EVENT_QUALIFIER;
            lt_in_tbl_type(ln_line_num).p_bill_hold_flag            := lv_bill_hold_flag;
            lt_in_tbl_type(ln_line_num).p_bill_trans_currency_code  := rev_rec.trx_rev_curr;
            lt_in_tbl_type(ln_line_num).p_pm_event_reference        := '6666 REVERSAL' || ln_seq_val;
          --  lt_in_tbl_type(ln_line_num).P_project_rate_type         := lc_proj_rate_type;     -- Commented on 20-DEC-17
          --  lt_in_tbl_type(ln_line_num).P_project_exchange_rate     := ln_proj_ex_rate;       -- Commented on 20-DEC-17
          --  lt_in_tbl_type(ln_line_num).P_projfunc_rate_type       := lc_projfunc_rate_type; -- Commented on 20-DEC-17
          --  lt_in_tbl_type(ln_line_num).P_projfunc_exchange_rate    := ln_projfunc_ex_rate;   -- Commented on 20-DEC-17
           
-- +====================================================================+
--   Calling PA_EVENT_PUB api,
--   to create a reversal event for 6666 revenue events.
-- +====================================================================+     
 debug('XXX_6666_main => calling API');
    pa_event_pub.create_event(
                p_api_version_number   => 1.0,
                p_commit               => fnd_api.g_true,
                p_init_msg_list        => fnd_api.g_true,
                p_pm_product_code      => lv_product_code,
                p_event_in_tbl         => lt_in_tbl_type,
                p_event_out_tbl        => lt_out_tbl_type,
                p_msg_count            => ln_msg_count,
                p_msg_data             => lv_msg_data,
                p_return_status        => lv_return_status
                               );
                     
     COMMIT;
   
         
   
     IF lv_return_status='S' THEN
   
          SELECT pe.event_id INTO ln_event_id
          FROM   pa_events pe
          WHERE  pe.PM_EVENT_REFERENCE = '6666 REVERSAL' || ln_seq_val
            AND  pe.organization_id = ln_org_id;
   
                                     
              ln_event_id := 0;
   
       
           
     UPDATE PA_EVENTS pe SET pe.attribute7 = CN_EVENT_QUALIFIER
     WHERE  pe.project_id = rev_rec.project_id
         AND  pe.revenue_distributed_flag = 'Y'
      --   AND pe.event_type = rev_rec.event_type
      --   AND pe.task_id    = rev_rec.task_id
         AND nvl(pe.attribute7,'@#$') != CN_EVENT_QUALIFIER  
         AND pe.completion_date  <=  p_as_of_date; 

         COMMIT; 

     ELSE
          debug('XXX_reversal_proc => Return Status: '||lv_return_status);

     END IF;
   
 END IF;
 
END LOOP;
 
    debug('XXX_reversal_proc => end of procedure');
 
EXCEPTION
  WHEN NO_DATA_FOUND THEN
    debug('XXX_reversal_proc => No data found to reverse for the project number:' ||p_project_num);
  WHEN OTHERS THEN
    debug('XXX_reversal_proc => Error is '||SQLCODE||','||SQLERRM||' for project number:' ||p_project_num);
 
END XXX_reversal_proc;



PROCEDURE XXX_6666_main(
        errbuf               OUT VARCHAR2,
        retcode              OUT VARCHAR2,
        p_project_from       IN  VARCHAR2,
        p_project_to         IN  VARCHAR2,
        p_period             IN  VARCHAR2,
        p_program_mode       IN  VARCHAR2
                          )
IS

-- +====================================================================+
--     Local VARIABLES
-- +====================================================================+

 lv_resp_name       VARCHAR2(100);
 lv_user_name       VARCHAR2(100);
 ln_request_id      NUMBER;
 ld_as_of_date      DATE;
 lv_6666_event_type  VARCHAR2(40);
 lv_flag            CHAR(1);
 lv_6666_rev_task    VARCHAR2(40);


CURSOR lcu_6666_main
IS
SELECT pp.segment1 project_number
      ,pp.project_id
FROM   pa_projects pp,
       pa_project_classes_v ppc,
       pa_events pe,
       pa_event_types pet
WHERE ppc.class_category        = CN_PROJECT_CLASS
AND   ppc.class_code            = CN_CLASS_CODE
AND   ppc.project_id            = pp.project_id
AND   pp.project_id             = pe.project_id
and   pe.event_type             = pet.event_type
and   pet.attribute3            = CN_EVENT_QUALIFIER
AND   pp.segment1 BETWEEN NVL(p_project_from,pp.segment1) AND NVL(p_project_to,pp.segment1)
AND   nvl(pe.attribute7,'@#$') != CN_EVENT_QUALIFIER
GROUP BY  pp.segment1
         ,pp.project_id;

-- +====================================================================+
--   lcu_org_name Cursor used to fetch the organisation name.
-- +====================================================================+
CURSOR lcu_org_name(p_org_id number)
IS
SELECT hou.NAME
FROM   hr_operating_units hou
WHERE  hou.organization_id = p_org_id;


BEGIN

  debug('XXX_6666_main => begining of procedure');

-- +====================================================================+
--   Initalizing the variables.
-- +====================================================================+
  ln_org_id        := fnd_global.org_id;
  ln_request_id    := fnd_global.conc_request_id;
  lv_resp_name     := fnd_profile.value('RESP_NAME');
  lv_user_name     := fnd_profile.value('USERNAME');
 
-- +====================================================================+
--   Initalizing session.
-- +====================================================================+
  mo_global.set_policy_context('S',ln_org_id);
 
 
 
    SELECT TO_DATE(fnd_date.canonical_to_date(p_period),'YY-MON-DD')             
           INTO   ld_as_of_date
    FROM   dual;
   
    OPEN  lcu_org_name(ln_org_id);
        FETCH lcu_org_name INTO lv_org_name;
               IF lcu_org_name%NOTFOUND THEN
                  lv_flag := 'E';
                  debug('XXX_6666_main => Organization name not found');
               END IF;
    CLOSE lcu_org_name;
 

FOR lr_rec_6666_main IN lcu_6666_main
LOOP
 
 -- +====================================================================+
-- | Calling procedure XXX_reversal_proc to create the reversal 
-- | event.                                                           
-- +====================================================================+ 
     XXX_reversal_proc(lr_rec_6666_main.project_id
                             ,lr_rec_6666_main.project_number
                             ,p_program_mode
                             ,ld_as_of_date
                             ,CN_REVERSAL_EVENT_TYPE
                             ,lv_6666_rev_task);
   

END LOOP;

debug('XXX_6666_main => Complete generating events');
-- +====================================================================+
--   Printing output in concurrent program output.
-- +====================================================================+
 IF p_program_mode = 'FINAL' THEN
      report_success;
      report_errors;
 ELSE
      draft_output;
      report_errors;
 END IF;
  debug('XXX_6666_main => end of procedure');

EXCEPTION
WHEN NO_DATA_FOUND THEN
      debug('XXX_6666_main => No data found to reverse for the given projects from '||p_project_from || ' to ' || p_project_to);

WHEN OTHERS THEN
   debug('XXX_6666_main => Error is: '||SQLCODE||','||SQLERRM);
END XXX_6666_main;
END XXX_6666_reversal_pkg;
/
SHO ERRORS
/

Query to find request set and its responsibility

  SELECT FA.application_name,        fr.responsibility_name program_attached_to,        frg.request_group_name,        fcp.request_set_name,...