Tuesday 29 May 2012

ap invoice payment interface

CREATE OR REPLACE PACKAGE BODY xxte_apinvoice_pay_intf
AS
   PROCEDURE xxte_apinvoice_main (errbuf OUT VARCHAR2, retcode OUT VARCHAR2)
   IS
      lv_errbuff   VARCHAR2 (1000);
      lv_retcode   NUMBER;
   BEGIN
      xxte_apinvoice_ins (lv_errbuff, lv_retcode);
      xxte_apinvoice_comm (lv_errbuff, lv_retcode);
   EXCEPTION
      WHEN OTHERS
      THEN
         lv_retcode := 1;
         lv_errbuff := 'Error: In Main Procudure.' || SQLERRM;
         fnd_file.put_line (fnd_file.LOG, lv_errbuff);
   END;

   PROCEDURE xxte_apinvoice_comm (errbuf OUT VARCHAR2, retcode OUT VARCHAR2)
   IS
      CURSOR stg_cur
      IS
         SELECT a.*, a.ROWID
           FROM xxte_apinv_comm_st a
          WHERE process_flag = 'N';

      -- declare local variables.
      lv_user_id          NUMBER;
      lv_resp_id          NUMBER;
      lv_resp_appl_id     NUMBER;
      lv_vendor_id        NUMBER;
      lv_vendor_no        NUMBER;
      lv_error_message    VARCHAR2 (2400);
      lv_error_code       NUMBER          := 0;
      lv_vendor_site_id   NUMBER;
      lv_invoice_date     VARCHAR2 (1);
      lv_gl_date          VARCHAR2 (1);
      lv_exist_rec        NUMBER;
      lv_invoice_amt      NUMBER;
      lv_acc              NUMBER;
      lv_source           VARCHAR2 (30);
      lv_invoice_type     VARCHAR2 (50);
      lv_dist_ccid        NUMBER;
   BEGIN
      lv_user_id := fnd_profile.VALUE ('USER_ID');
      lv_resp_id := fnd_profile.VALUE ('RESP_ID');
      lv_resp_appl_id := fnd_profile.VALUE ('RESP_APPL_ID');

      BEGIN
         fnd_global.apps_initialize (lv_user_id, lv_resp_id, lv_resp_appl_id);
         mo_global.init ('AP');
      END;

      -- Purge the previous processed data in the stage/interface table
      BEGIN
         DELETE FROM ap_invoice_lines_interface apil
               WHERE apil.invoice_id IN (SELECT invoice_id
                                           FROM ap_invoices_interface
                                          WHERE status = 'PROCESSED');

         DELETE FROM ap_invoices_interface
               WHERE status = 'PROCESSED';
      EXCEPTION
         WHEN OTHERS
         THEN
            lv_error_code := 1;
            lv_error_message :=
                  'Error: Unable To Delete The Invoice Stage/Interface Table.'
               || SQLERRM;
            fnd_file.put_line (fnd_file.LOG, lv_error_message);
      END;

      fnd_file.put_line
         (2,
          '****************************Agent Commission Invoice***************************'
         );
      fnd_file.put_line
         (2,
          '------------------------------------------------------------------------------- '
         );

      FOR i IN stg_cur
      LOOP
         lv_error_message := NULL;
         lv_error_code := 0;
         lv_source := 'TE INSIS';
         lv_dist_ccid := 2106;

         -- Validation for Invoice Type
         BEGIN
            SELECT invoice_type
              INTO lv_invoice_type
              FROM xxte_apinv_comm_st
             WHERE ROWID = i.ROWID;

            IF lv_invoice_type IS NULL
            THEN
               lv_error_code := 1;
               lv_error_message := 'Error: ' || 'Invoice Type Is Null';
               fnd_file.put_line (fnd_file.LOG, lv_error_message);
            END IF;
         EXCEPTION
            WHEN OTHERS
            THEN
               lv_error_code := 1;
               lv_error_message := 'Error: ' || 'Invalid Invoice Type';
               fnd_file.put_line (fnd_file.LOG, lv_error_message);
         END;

         -- Validation for vendor name
         BEGIN
            SELECT vendor_id
              INTO lv_vendor_id
              FROM po_vendors
             WHERE vendor_name = i.vendor_name;

            IF lv_vendor_id IS NULL
            THEN
               lv_error_code := 1;
               lv_error_message :=
                     'Error: '
                  || 'Vendor Name '
                  || ' '
                  || i.vendor_name
                  || ' '
                  || 'is Not Found';
               fnd_file.put_line (fnd_file.LOG, lv_error_message);
            END IF;
         EXCEPTION
            WHEN OTHERS
            THEN
               lv_error_code := 1;
               lv_error_message :=
                     'Error: '
                  || 'Vendor Name '
                  || ' '
                  || i.vendor_name
                  || ' '
                  || 'is Not Found';
               fnd_file.put_line (fnd_file.LOG, lv_error_message);
         END;

-- Validation for vendor no
         BEGIN
            SELECT segment1
              INTO lv_vendor_no
              FROM po_vendors
             WHERE segment1 = i.vendor_no AND vendor_name = i.vendor_name;

            IF lv_vendor_no IS NULL
            THEN
               lv_error_code := 1;
               lv_error_message :=
                     'Error: '
                  || 'Vendor No '
                  || ' '
                  || i.vendor_no
                  || ' '
                  || ' is Not Found for the vendor'
                  || ' '
                  || i.vendor_name;
               fnd_file.put_line (fnd_file.LOG, lv_error_message);
            END IF;
         EXCEPTION
            WHEN OTHERS
            THEN
               lv_error_code := 1;
               lv_error_message :=
                     'Error: '
                  || 'Vendor No '
                  || ' '
                  || i.vendor_no
                  || ' '
                  || ' is Not Found for the vendor'
                  || ' '
                  || i.vendor_name;
               fnd_file.put_line (fnd_file.LOG, lv_error_message);
         END;

         -- Validation for vendor site id
         BEGIN
            SELECT vendor_site_id
              INTO lv_vendor_site_id
              FROM po_vendor_sites_all
             WHERE UPPER (vendor_site_code) = UPPER (i.vendor_site)
               AND vendor_id IN (SELECT vendor_id
                                   FROM po_vendors
                                  WHERE vendor_name = i.vendor_name);

            IF lv_vendor_site_id IS NULL
            THEN
               lv_error_code := 1;
               lv_error_message :=
                     'Error: '
                  || 'Vendor Site Name '
                  || ' '
                  || i.vendor_site
                  || ' '
                  || 'is Not found for the Vendor'
                  || ' '
                  || i.vendor_name;
               fnd_file.put_line (fnd_file.LOG, lv_error_message);
            END IF;
         EXCEPTION
            WHEN OTHERS
            THEN
               lv_error_code := 1;
               lv_error_message :=
                     'Error: '
                  || 'Vendor Site Name '
                  || ' '
                  || i.vendor_site
                  || ' '
                  || 'is Not found for the Vendor'
                  || ' '
                  || i.vendor_name;
               fnd_file.put_line (fnd_file.LOG, lv_error_message);
         END;

         -- Validation for invoice date
         BEGIN
            SELECT 'x'
              INTO lv_invoice_date
              FROM gl_period_statuses
             WHERE application_id = 200                ---For Oracle Payables.
               AND set_of_books_id = 2022
               AND (i.invoice_date >= start_date
                    AND i.invoice_date <= end_date
                   )
               AND closing_status = 'O';

            IF lv_invoice_date IS NULL
            THEN
               RAISE NO_DATA_FOUND;
            END IF;
         EXCEPTION
            WHEN NO_DATA_FOUND
            THEN
               lv_error_code := 1;
               lv_error_message := 'Error: ' || 'Invoice Date Is NULL ';
               fnd_file.put_line (fnd_file.LOG, lv_error_message);
            WHEN OTHERS
            THEN
               lv_error_code := 1;
               lv_error_message :=
                     'Error: '
                  || 'Period is Not Open for the Invoice Date '
                  || ' '
                  || i.invoice_date;
               fnd_file.put_line (fnd_file.LOG, lv_error_message);
         END;

-- Validation for GL date
         BEGIN
            SELECT 'x'
              INTO lv_gl_date
              FROM gl_period_statuses
             WHERE application_id = 200                ---For Oracle Payables.
               AND set_of_books_id = 2022
               AND (i.gl_date >= start_date AND i.gl_date <= end_date)
               AND closing_status = 'O';

            IF lv_gl_date IS NULL
            THEN
               RAISE NO_DATA_FOUND;
            END IF;
         EXCEPTION
            WHEN NO_DATA_FOUND
            THEN
               lv_error_code := 1;
               lv_error_message := 'Error: ' || 'GL Date Is NULL ';
               fnd_file.put_line (fnd_file.LOG, lv_error_message);
            WHEN OTHERS
            THEN
               lv_error_code := 1;
               lv_error_message :=
                     'Error: '
                  || 'Period is Not Open for the GL Date '
                  || ' '
                  || i.gl_date;
               fnd_file.put_line (fnd_file.LOG, lv_error_message);
         END;

         -- Validation for currency code
         BEGIN
            IF i.invoice_currency != 'AED'
            THEN
               lv_error_code := 1;
               lv_error_message :=
                     'Error: '
                  || 'Invalid Currency Code '
                  || ' '
                  || i.invoice_currency;
               fnd_file.put_line (fnd_file.LOG, lv_error_message);
            END IF;
         END;

         -- Validation for Invoice amount
         BEGIN
            SELECT invoice_amount
              INTO lv_invoice_amt
              FROM xxte_apinv_comm_st
             WHERE ROWID = i.ROWID;

            IF lv_invoice_amt IS NULL
            THEN
               lv_error_code := 1;
               lv_error_message := 'Error: ' || 'Invoice Amount Is Null';
               fnd_file.put_line (fnd_file.LOG, lv_error_message);
            END IF;
         EXCEPTION
            WHEN OTHERS
            THEN
               lv_error_code := 1;
               lv_error_message := 'Error: ' || 'Invoice Amount Is Null';
               fnd_file.put_line (fnd_file.LOG, lv_error_message);
         END;

         -- Validation for Account
         BEGIN
            SELECT dist_account
              INTO lv_acc
              FROM xxte_apinv_comm_st
             WHERE ROWID = i.ROWID;

            IF lv_acc IS NULL
            THEN
               lv_error_code := 1;
               lv_error_message :=
                                  'Error: ' || 'Distribution Account Is Null';
               fnd_file.put_line (fnd_file.LOG, lv_error_message);
            END IF;
         EXCEPTION
            WHEN OTHERS
            THEN
               lv_error_code := 1;
               lv_error_message :=
                                  'Error: ' || 'Distribution Account Is Null';
               fnd_file.put_line (fnd_file.LOG, lv_error_message);
         END;

         --Validation for excisting record in base table
         BEGIN
            SELECT COUNT (*)
              INTO lv_exist_rec
              FROM ap_invoices_all
             WHERE invoice_amount = i.invoice_amount
               AND invoice_date = i.invoice_date
               AND vendor_id IN (SELECT vendor_id
                                   FROM po_vendors
                                  WHERE vendor_name = i.vendor_name);

            IF lv_exist_rec > 0
            THEN
               lv_error_code := 1;
               lv_error_message := 'Error: ' || 'Record Already Exists';
               fnd_file.put_line (fnd_file.LOG, lv_error_message);
            END IF;
         EXCEPTION
            WHEN OTHERS
            THEN
               lv_error_code := 1;
               lv_error_message := 'Error: ' || 'Record Already Exists';
               fnd_file.put_line (fnd_file.LOG, lv_error_message);
         END;

         IF     lv_invoice_type IN
                   ('PAYABLE', 'COMMISION ADV', 'CLAIM', 'SURRENDER',
                    'MATURITY', 'RETAKAFUL EXP', 'RETAKAFUL PAYABLE',
                    'CLAIM PAYABLE', 'DEATH CLAIM EXP')
            AND lv_invoice_amt > 0
         THEN
            lv_invoice_type := 'STANDARD';
         ELSIF     lv_invoice_type IN
                      ('PAYABLE', 'COMMISION ADV', 'REFUND', 'RETAKAFUL EXP',
                       'RETAKAFUL PAYABLE', 'RETAFUL  COMMISION',
                       'RETAKAFUL SHARE IN EXP', 'RECEIVABLE FROM RETAKAFUL')
               AND lv_invoice_amt < 0
         THEN
            lv_invoice_type := 'DEBIT';
         ELSE
            lv_error_code := 1;
            lv_error_message := 'Error: ' || 'Invalid Invoice Type';
            fnd_file.put_line (fnd_file.LOG, lv_error_message);
         END IF;

         IF lv_error_code = 0
         THEN
            INSERT INTO ap_invoices_interface
                        (invoice_id,
                         invoice_num,
                         gl_date, invoice_type_lookup_code, invoice_date,
                         vendor_id, vendor_site_id, invoice_amount,
                         invoice_currency_code, description, SOURCE, org_id
                        )
                 VALUES (ap_invoices_interface_s.NEXTVAL,
                            'INSIS_'
                         || i.vendor_site
                         || '_'
                         || ap_invoices_interface_s.CURRVAL,
                         i.gl_date, lv_invoice_type,            -- will change
                                                    i.invoice_date,
                         lv_vendor_id, lv_vendor_site_id, i.invoice_amount,
                         i.invoice_currency, i.description,     -- will change
                                                           lv_source, 81
                        );

            INSERT INTO ap_invoice_lines_interface
                        (invoice_id, line_number, line_type_lookup_code,
                         amount, dist_code_combination_id,
-- if value dist id is entered here no need to enter value in dist_code_concatenated
                                                          org_id
                        )
                 VALUES (ap_invoices_interface_s.CURRVAL, i.line_no, 'ITEM',
                         i.amount, lv_dist_ccid,                -- will update
                                                81
                        );

            fnd_file.put_line (2, 'Payable Invoice Is Created');

            UPDATE xxte_apinv_comm_st
               SET process_flag = 'S'
             WHERE ROWID = i.ROWID;
         ELSE
            fnd_file.put_line (2, 'Please Check The Log File For Error(s)');

            UPDATE xxte_apinv_comm_st
               SET process_flag = 'E',
                   error_message = lv_error_message
             WHERE ROWID = i.ROWID;
         END IF;
      END LOOP;

      COMMIT;
      fnd_file.put_line
               (2,
                '**************************** END ***************************'
               );
      fnd_file.put_line
         (2,
          '------------------------------------------------------------------------------- '
         );
   EXCEPTION
      WHEN OTHERS
      THEN
         lv_error_code := 1;
         fnd_file.put_line (fnd_file.LOG, 'Error :' || SQLERRM);
         COMMIT;
   END;

   PROCEDURE xxte_apinvoice_ins (errbuf OUT VARCHAR2, retcode OUT VARCHAR2)
   IS
      CURSOR ins_c
      IS
         SELECT   'PAYABLE' invoice_type, a.vendor_name, a.vendor_no,
                  a.vendor_site,
                  (SELECT invoice_date
                     FROM xxte_apinv_pay_temp
                    WHERE vendor_name = a.vendor_name
                      AND vendor_site = a.vendor_site
                      AND ROWNUM = 1) invoice_date,
                  (SELECT invoice_currency
                     FROM xxte_apinv_pay_temp
                    WHERE vendor_name = a.vendor_name
                      AND vendor_site = a.vendor_site
                      AND ROWNUM = 1) invoice_currency,
                  SUM (a.invoice_amount) invoice_amount,
                  (SELECT gl_date
                     FROM xxte_apinv_pay_temp
                    WHERE vendor_name = a.vendor_name
                      AND vendor_site = a.vendor_site
                      AND ROWNUM = 1) gl_date,
                  (SELECT description
                     FROM xxte_apinv_pay_temp
                    WHERE vendor_name = a.vendor_name
                      AND vendor_site = a.vendor_site
                      AND ROWNUM = 1) description,
                  SUM (a.amount) amount,
                  (SELECT dist_account
                     FROM xxte_apinv_pay_temp
                    WHERE vendor_name = a.vendor_name
                      AND vendor_site = a.vendor_site
                      AND ROWNUM = 1) dist_account
             FROM xxte_apinv_pay_temp a
            WHERE a.invoice_type IN ('COMMISION ADV', 'PAYABLE')
         GROUP BY a.vendor_name, a.vendor_site, a.vendor_no
           HAVING SUM (a.invoice_amount) != 0
         UNION
         SELECT *
           FROM xxte_apinv_pay_temp
          WHERE invoice_type NOT IN ('COMMISION ADV', 'PAYABLE');

      lv_error_message   VARCHAR2 (2400);
      lv_error_code      NUMBER          := 0;
   BEGIN
      BEGIN
         DELETE FROM xxte_apinv_comm_st
               WHERE process_flag != 'N';
      EXCEPTION
         WHEN OTHERS
         THEN
            lv_error_code := 1;
            lv_error_message :=
                  'Error: Unable To Delete Record(s) In Staging Table.'
               || SQLERRM;
            fnd_file.put_line (fnd_file.LOG, lv_error_message);
      END;

      FOR i IN ins_c
      LOOP
         INSERT INTO xxte_apinv_comm_st
                     (invoice_type, vendor_name, vendor_no,
                      vendor_site, invoice_date, invoice_currency,
                      invoice_amount, gl_date, description, amount,
                      dist_account
                     )
              VALUES (i.invoice_type, i.vendor_name, i.vendor_no,
                      i.vendor_site, i.invoice_date, i.invoice_currency,
                      i.invoice_amount, i.gl_date, i.description, i.amount,
                      i.dist_account
                     );
      END LOOP;

      COMMIT;
   EXCEPTION
      WHEN OTHERS
      THEN
         lv_error_code := 1;
         lv_error_message :=
                  'Error: Unable To Insert Data In Staging Table.' || SQLERRM;
         fnd_file.put_line (fnd_file.LOG, lv_error_message);
   END;
END xxte_apinvoice_pay_intf;
/

No comments:

Post a Comment