AP 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;
/


*/