Search This Blog

Wednesday, February 17, 2021

Oracle apps AP Payment R12 API (Account Payables) from backend

Oracle apps AP Payment R12

 

For AP Invoice api check this link :  

https://mogalafzal.blogspot.com/2017/06/oracle-apps-r12-ap-invoice-creation.html


For AP payment starts from here :

 CREATE OR REPLACE PROCEDURE XX_AP_INVOICE
(p_invoice_id number,
p_internal_bank_acct_id number, --from invoice payment form
p_payment_method_code varchar2, --PAYMENT_METHOD_CODE from the invoice workbench
p_payment_profile_id number, --166 check any invoice payment from form
p_check_date date default sysdate,
x_return_status out varchar2,
x_msg_data out varchar2,
x_check_id out number
) AS
G_PKG_NAME CONSTANT VARCHAR2(30) := 'AP_PAY_SINGLE_INVOICE_PKG';
G_MSG_UERROR        CONSTANT NUMBER := FND_MSG_PUB.G_MSG_LVL_UNEXP_ERROR;
G_MSG_ERROR         CONSTANT NUMBER := FND_MSG_PUB.G_MSG_LVL_ERROR;
G_MSG_SUCCESS       CONSTANT NUMBER := FND_MSG_PUB.G_MSG_LVL_SUCCESS;
G_MSG_HIGH          CONSTANT NUMBER := FND_MSG_PUB.G_MSG_LVL_DEBUG_HIGH;
G_MSG_MEDIUM        CONSTANT NUMBER := FND_MSG_PUB.G_MSG_LVL_DEBUG_MEDIUM;
G_MSG_LOW           CONSTANT NUMBER := FND_MSG_PUB.G_MSG_LVL_DEBUG_LOW;
G_LINES_PER_FETCH   CONSTANT NUMBER := 1000;

G_CURRENT_RUNTIME_LEVEL CONSTANT NUMBER := FND_LOG.G_CURRENT_RUNTIME_LEVEL;
G_LEVEL_UNEXPECTED      CONSTANT NUMBER := FND_LOG.LEVEL_UNEXPECTED;
G_LEVEL_ERROR           CONSTANT NUMBER := FND_LOG.LEVEL_ERROR;
G_LEVEL_EXCEPTION       CONSTANT NUMBER := FND_LOG.LEVEL_EXCEPTION;
G_LEVEL_EVENT           CONSTANT NUMBER := FND_LOG.LEVEL_EVENT;
G_LEVEL_PROCEDURE       CONSTANT NUMBER := FND_LOG.LEVEL_PROCEDURE;
G_LEVEL_STATEMENT       CONSTANT NUMBER := FND_LOG.LEVEL_STATEMENT;
G_MODULE_NAME           CONSTANT VARCHAR2(100) := 'AP.PLSQL.AP_PAY_SINGLE_INVOICE_PKG';

  -- Bug 2842080

            p_api_version  NUMBER := 1.0;
            p_init_msg_list         VARCHAR2(200) := fnd_api.g_true;
            --p_invoice_id            NUMBER := 10473423;
            p_payment_type_flag     VARCHAR2(200) := 'A';
            --p_internal_bank_acct_id NUMBER := 11360;
            --p_payment_method_code   VARCHAR2(200) := 'FUJ_Check';
            --p_payment_profile_id    NUMBER := 166;
            p_payment_document_id   NUMBER := null;
            p_take_discount         VARCHAR2(200) := 'N';
            --p_check_date            DATE := trunc(sysdate);
            p_doc_category_code     VARCHAR2(200) := null;
            p_exchange_rate_type    VARCHAR2(200) := null;
            p_exchange_rate         NUMBER := null;
            p_exchange_date         DATE := null;
            --x_return_status         VARCHAR2(200) ;
            x_msg_count             VARCHAR2(200);
            --x_msg_data              VARCHAR2(200) ;
            x_errorids              IBY_DISBURSE_SINGLE_PMT_PKG.trxnErrorIdsTab;-- := l_error_ids

    l_amount                   NUMBER;
    l_base_amount              NUMBER;
    l_num_invs_sel_for_pmt     NUMBER;
    l_return_code              NUMBER;
    l_application_id           NUMBER;

    l_name                     VARCHAR2(80);
    l_dummy_rowid              VARCHAR2(18);
    l_seq_num_profile          VARCHAR2(80);

    l_hold_all_payments_flag   ap_suppliers.hold_all_payments_flag%TYPE;
    l_active_pay_sites         ap_supplier_sites_all.pay_site_flag%TYPE;
    l_accounting_event_id      NUMBER(38);
    l_quick_check_id           AP_CHECKS.checkrun_name%type;
    l_next_check_number        AP_CHECKS.check_number%type;
    l_check_number             AP_CHECKS.check_number%type;
    l_period_name              GL_PERIOD_STATUSES.period_name%TYPE;

    l_debug_info               VARCHAR2(100);
    l_curr_calling_sequence    VARCHAR2(2000);


    l_doc_category_code varchar2(30);
    l_seqval number;
    l_dbseqid number;
    l_docseq_id     number;
    l_docseq_type varchar(1);
    l_docseq_name varchar2(30);
    l_db_seq_name varchar2(30);
    l_seq_ass_id number;
    l_prd_tab_name    varchar2(30);
    l_aud_tab_name    varchar2(30);
    l_msg_flag varchar(1);
    l_valid_sequence_exists varchar2(30);




    l_payment_type_flag         ap_checks.payment_type_flag%TYPE; -- Bug3343314
    l_creation_date             ap_checks.creation_date%TYPE; -- Bug3343314
    l_created_by                ap_checks.created_by%TYPE; -- Bug3343314
    l_last_update_date          ap_checks.last_update_date%TYPE; -- Bug3343314
    l_last_updated_by           ap_checks.last_updated_by%TYPE; -- Bug3343314
    l_last_update_login         ap_checks.last_update_login%TYPE; -- Bug3343314
    l_org_id                    NUMBER;
    l_bank_account_id           ce_bank_acct_uses_all.bank_acct_use_id%TYPE;
    l_bank_account_name         ce_bank_accounts.bank_account_name%TYPE;
    l_processing_type           iby_payment_profiles.processing_type%TYPE;
    l_print_instr_immed_flag    iby_payment_profiles.print_instruction_immed_flag%TYPE;
    l_default_printer           iby_payment_profiles.default_printer%TYPE;
    l_payment_document_id       ce_payment_documents.payment_document_id %TYPE;
    l_bills_payable             iby_payment_methods_vl.support_bills_payable_flag%TYPE;
    l_maturity_date_offset_days iby_payment_methods_vl.maturity_date_offset_days%TYPE;
    l_maturity_date             ap_checks.future_pay_due_date%TYPE;
    l_vendor_type_lookup_code   ap_suppliers.vendor_type_lookup_code%TYPE;

    l_return_status  VARCHAR2(100);
    l_return_message VARCHAR2(3000);
    l_msg_count      NUMBER;
    l_msg_data       VARCHAR2(3000);
    l_temp_status    VARCHAR2(1);

    l_is_duplicate   BOOLEAN := TRUE;
    l_module_name    VARCHAR2(200) := G_PKG_NAME ||
                                       '.ap_pay_invoice_in_full';

    l_api_version    CONSTANT NUMBER       := 1.0;
    l_api_name       CONSTANT VARCHAR2(30) := 'ap_pay_invoice_in_full';

    l_errbuf         VARCHAR2(5000);
    l_retcode        VARCHAR2(2000);

    l_transaction_type AP_PAYMENT_HISTORY_ALL.TRANSACTION_TYPE%TYPE;

    TYPE r_ap_system_param_info IS RECORD
    (
     Auto_Calc_Int_Flag  AP_SYSTEM_PARAMETERS_ALL.Auto_Calculate_Interest_Flag%TYPE
    ,Base_Currency_Code  AP_SYSTEM_PARAMETERS_ALL.Base_Currency_Code%TYPE
    ,Pay_Doc_Override AP_SYSTEM_PARAMETERS_ALL.Pay_Doc_Category_Override%TYPE
    ,Make_Rate_Mandatory_Flag AP_SYSTEM_PARAMETERS_ALL.Make_Rate_Mandatory_Flag%TYPE
    ,Set_Of_Books_id AP_SYSTEM_PARAMETERS_ALL.Set_Of_Books_id%TYPE
    ,Default_Exchange_Rate_Type AP_SYSTEM_PARAMETERS_ALL.Default_Exchange_Rate_Type%TYPE
    ,Multi_Currency_Flag AP_SYSTEM_PARAMETERS_ALL.Multi_Currency_Flag%TYPE
    ,Xrate_type AP_SYSTEM_PARAMETERS_ALL.default_exchange_rate_type%TYPE
    );

    TYPE r_check_info  IS RECORD
    (
     Xrate                  AP_CHECKS_ALL.exchange_rate%TYPE
    ,Xrate_date             AP_CHECKS_ALL.exchange_date%TYPE
    ,Xrate_type             AP_CHECKS_ALL.exchange_rate_type%TYPE
    ,Check_id               AP_CHECKS_ALL.check_id%TYPE
    ,Checkrun_Name          AP_CHECKS_ALL.checkrun_name%TYPE
    ,Internal_Bank_Acct_Id  CE_BANK_ACCT_USES_ALL.bank_acct_use_id%TYPE
    ,Bank_Account_Name      CE_BANK_ACCOUNTS.bank_account_name%TYPE
    ,Bank_Account_Num       CE_BANK_ACCOUNTS.bank_account_num%TYPE
    ,Bank_Account_Type      CE_BANK_ACCOUNTS.account_classification%TYPE
    ,Bank_Num               CE_BANK_BRANCHES_V.branch_number%TYPE
    ,Legal_Entity_Id        CE_BANK_ACCOUNTS.account_owner_org_id%TYPE
    ,Status_Lookup_Code     AP_CHECKS_ALL.status_lookup_code%TYPE
    );

    TYPE r_ap_ven_sites_info IS RECORD
    (
     Address_Line1         HZ_LOCATIONS.Address1%TYPE
    ,Address_Line2         HZ_LOCATIONS.Address2%TYPE
    ,Address_Line3         HZ_LOCATIONS.Address3%TYPE
    ,City                  HZ_LOCATIONS.City%TYPE
    ,country               HZ_LOCATIONS.Country%TYPE
    ,Vendor_site_code      AP_SUPPLIER_SITES_ALL.Vendor_Site_Code%TYPE
    ,Zip                   HZ_LOCATIONS.Postal_Code%TYPE
    ,Province              HZ_LOCATIONS.Province%TYPE
    ,State                 HZ_LOCATIONS.State%TYPE
    ,Address_Line4         HZ_LOCATIONS.Address4%TYPE
    ,County                HZ_LOCATIONS.Country%TYPE
    ,Address_Style         HZ_LOCATIONS.Address_Style%TYPE
    ,Vendor_Id             AP_SUPPLIERS.Vendor_ID%TYPE
    ,Vendor_Site_Id        AP_SUPPLIER_SITES_ALL.Vendor_Site_ID%TYPE
    ,Pay_Site_Flag         AP_SUPPLIER_SITES_ALL.Pay_Site_Flag%TYPE
    ,Primary_Pay_Site      AP_SUPPLIER_SITES_ALL.Primary_Pay_Site_Flag%TYPE
    );

    TYPE r_vendor_info IS RECORD
    (
     Auto_calc_int_flag     AP_SUPPLIERS.Auto_calculate_interest_flag%TYPE
    ,Vendor_name            AP_SUPPLIERS.Vendor_name%TYPE
    );


    TYPE r_apinv_info IS RECORD
    (
     Vendor_id              AP_INVOICES_ALL.vendor_id%TYPE
    ,Vendor_Site_id         AP_INVOICES_ALL.vendor_site_id%TYPE
    ,Party_Id               AP_INVOICES_ALL.party_id%TYPE
    ,Party_Site_Id          AP_INVOICES_ALL.party_site_id%TYPE
    ,External_Bank_Account_Id AP_PAYMENT_SCHEDULES_ALL.external_bank_account_id%TYPE
    ,Pmt_Currency_code      AP_INVOICES_ALL.payment_currency_code%TYPE
    ,Payment_Method         AP_INVOICES_ALL.Payment_Method_Code%TYPE
    ,Inv_Currency_code      AP_INVOICES_ALL.invoice_currency_code%TYPE
    ,Org_id                 AP_INVOICES_ALL.org_id%TYPE
    ,Payment_Function       AP_INVOICES_ALL.payment_function%TYPE
    ,Pay_Proc_Trxn_Type_Code AP_INVOICES_ALL.pay_proc_trxn_type_code%TYPE
    );

    l_vendor_rec             r_vendor_info;
    l_inv_rec                r_apinv_info;
    l_apvs_rec               r_ap_ven_sites_info;
    l_check_rec              r_check_info;
    l_asp_rec                r_ap_system_param_info;

    l_manual_payment_flag  VARCHAR2(1);
    l_num_printed_docs     NUMBER;
    l_paper_doc_num        IBY_PAYMENTS_ALL.paper_document_number%TYPE;
    l_pmt_ref_num          IBY_PAYMENTS_ALL.payment_reference_number%TYPE;
    l_errorIds             IBY_DISBURSE_SINGLE_PMT_PKG.trxnErrorIdsTab;
    l_msg_index_out        NUMBER;
    l_payment_id           NUMBER;
    l_error_msg            VARCHAR2(2000);

  BEGIN


    /* standard call to check for api compatibility */
    IF NOT FND_API.Compatible_API_Call(
                l_api_version,
                p_api_version,
                l_api_name,
                G_PKG_NAME) THEN

         x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;

         RAISE FND_API.G_EXC_UNEXPECTED_ERROR;

    END IF;

    /* initialize message list if p_init_msg_list is set to TRUE. */
    IF FND_API.to_Boolean(p_init_msg_list) THEN
      FND_MSG_PUB.initialize;
    END IF;

    /* initialize API return status to success */
    x_return_status := FND_API.G_RET_STS_SUCCESS;
    l_temp_status   := 'S';

    l_debug_info := 'Get invoice_info';
--    XXAP_PAY_SINGLE_INVOICE_PKG.print_debuginfo(l_module_name, l_debug_info,
--                    G_LEVEL_PROCEDURE);

    BEGIN


      -- All we want to make sure here is that can we pay the invoice
      -- that has been passed in (invoice_id)
      l_debug_info := 'Select the Invoice if it can be paid ';
--      XXAP_PAY_SINGLE_INVOICE_PKG.print_debuginfo(l_module_name, l_debug_info,
--                      G_LEVEL_PROCEDURE);

      SELECT   apiv.vendor_id,
               apiv.vendor_site_id,
               apiv.party_id,
               apiv.party_site_id,
               apiv.external_bank_account_id,
               ai.payment_currency_code,
               ai.invoice_currency_code,
               ai.payment_method_code,
               ai.org_id,
               NVL(ai.payment_function, 'PAYABLES_DISB'),
               NVL(ai.pay_proc_trxn_type_code, 'PAYABLES_DOC')
      INTO     l_inv_rec.vendor_id,
               l_inv_rec.vendor_site_id,
               l_inv_rec.party_id,
               l_inv_rec.party_site_id,
               l_inv_rec.external_bank_account_id,
               l_inv_rec.pmt_currency_code,
               l_inv_rec.inv_currency_code,
               l_inv_rec.payment_method,
               l_inv_rec.org_id,
               l_inv_rec.payment_function,
               l_inv_rec.pay_proc_trxn_type_code
      FROM     ap_invoices_ready_to_pay_v apiv,
               ap_invoices_all ai
      WHERE    apiv.invoice_id = ai.invoice_id
      AND      apiv.invoice_id = p_invoice_id
      AND      apiv.payment_method_code = NVL(p_payment_method_code,
                                              apiv.payment_method_code)
      GROUP BY apiv.vendor_id,
               apiv.vendor_site_id,
               apiv.party_id,
               apiv.party_site_id,
               apiv.external_bank_account_id,
               ai.payment_currency_code,
               ai.invoice_currency_code,
               ai.payment_method_code,
               ai.org_id,
               ai.payment_function,
               ai.pay_proc_trxn_type_code;

      l_debug_info := 'Get system parameter info ';
--      XXAP_PAY_SINGLE_INVOICE_PKG.print_debuginfo(l_module_name, l_debug_info,
--                      G_LEVEL_PROCEDURE);

      l_debug_info := 'Select System Option based on Invoice Org Id ';
--      XXAP_PAY_SINGLE_INVOICE_PKG.print_debuginfo(l_module_name, l_debug_info,
--                      G_LEVEL_PROCEDURE);

      SELECT nvl(asp.auto_calculate_interest_flag,'N'),
           asp.base_currency_code,
           nvl(asp.pay_doc_category_override, 'N'),
           nvl(make_rate_mandatory_flag,'N'),
           set_of_books_id,
           nvl(default_exchange_rate_type, 'User'),
           nvl(multi_currency_flag,'N')
      INTO l_asp_rec.auto_calc_int_flag,
           l_asp_rec.base_currency_code,
           l_asp_rec.pay_doc_override,
           l_asp_rec.make_rate_mandatory_flag,
           l_asp_rec.set_of_books_id,
           l_asp_rec.xrate_type,
           l_asp_rec.multi_currency_flag
      FROM ap_system_parameters_all asp
      WHERE org_id = l_inv_rec.org_id;

      -- In the Payment work bench user has the option to to change the
      -- payment date, so here we check to see if what they have passed
      -- or the current date is within an open period.

      l_debug_info := 'Get open period name ';
--      XXAP_PAY_SINGLE_INVOICE_PKG.print_debuginfo(l_module_name, l_debug_info,
--                      G_LEVEL_PROCEDURE);
      l_period_name := ap_utilities_pkg.get_current_gl_date(p_check_date,
                                                            l_inv_rec.org_id);

      IF l_period_name IS NULL THEN

      -- We call the ap debug pkg to get the message onto the stack. We pass
      -- in a TRUE value for the P_called_Online parameter (the last param)
      -- because we don't want the ap debug pkg to get it off the stack at
      -- the same time.

        x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;

        FND_MESSAGE.SET_NAME('SQLAP', 'AP_PERIOD_NOT_OPEN');
        FND_MSG_PUB.ADD;

        FND_MSG_PUB.COUNT_AND_GET(
          p_count => x_msg_count,
          p_data  => x_msg_data
          );

--        XXAP_PAY_SINGLE_INVOICE_PKG.print_debuginfo(l_module_name, 'EXIT',
--                        G_LEVEL_PROCEDURE);
        l_temp_status := 'E';

    END IF;

    l_debug_info := 'Checking For Valid Internal Bank Account';
--    XXAP_PAY_SINGLE_INVOICE_PKG.print_debuginfo(l_module_name, l_debug_info,
--                    G_LEVEL_PROCEDURE);

    BEGIN

       SELECT BA.account_owner_org_id legal_entity_id,
              BA.bank_account_name,
              BA.bank_account_num,
              BA.account_classification,
              CBB.branch_number
       INTO   l_check_rec.legal_entity_id,
              l_check_rec.bank_account_name,
              l_check_rec.bank_account_num,
              l_check_rec.bank_account_type,
              l_check_rec.bank_num
       FROM CE_BANK_ACCOUNTS BA,
            CE_BANK_BRANCHES_V CBB,
            CE_BANK_ACCT_USES_OU_V CBAU
       WHERE CBAU.BANK_ACCOUNT_ID = BA.BANK_ACCOUNT_ID
       AND CBB.branch_party_id = BA.bank_branch_id
       AND  SYSDATE < NVL(BA.END_DATE,SYSDATE+1)
       AND  BA.ACCOUNT_CLASSIFICATION    = 'INTERNAL'
       AND  CBAU.ap_use_enable_flag = 'Y'
       AND  CBAU.org_id = l_inv_rec.org_id
       AND  CBAU.bank_acct_use_id = p_internal_bank_acct_id;

    EXCEPTION
      WHEN NO_DATA_FOUND THEN

        x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;

        FND_MESSAGE.SET_NAME('SQLAP', 'AP_CE_INVALID_BANK_ACCT');
        FND_MSG_PUB.ADD;

        FND_MSG_PUB.COUNT_AND_GET(
            p_count => x_msg_count,
            p_data  => x_msg_data
            );

--        XXAP_PAY_SINGLE_INVOICE_PKG.print_debuginfo(l_module_name, 'EXIT',
--                        G_LEVEL_PROCEDURE);
        l_temp_status := 'E';

    END;

    l_debug_info := 'Checking Exchange Rate related info';
--    XXAP_PAY_SINGLE_INVOICE_PKG.print_debuginfo(l_module_name, l_debug_info,
--                    G_LEVEL_PROCEDURE);

    IF (l_inv_rec.pmt_currency_code <> l_asp_rec.base_currency_code) THEN

      l_check_rec.xrate_type := nvl(P_Exchange_Rate_Type,
                                      l_asp_rec.xrate_type);

      IF (l_check_rec.xrate_type = 'User' ) THEN

        IF (P_exchange_rate is NULL) THEN

            -- State that we need to to have an exchange rate if the
            -- type is USER this is irrespective of the value of the
            -- make_rate_mandatory_flag on AP_SYSTEM_PARAMETERS

           x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;

           FND_MESSAGE.SET_NAME('SQLAP', 'AP_NO_USER_XRATE');
           FND_MSG_PUB.ADD;

           FND_MSG_PUB.COUNT_AND_GET(
              p_count => x_msg_count,
              p_data  => x_msg_data
              );

--           XXAP_PAY_SINGLE_INVOICE_PKG.print_debuginfo(l_module_name, 'EXIT',
--                           G_LEVEL_PROCEDURE);
           l_temp_status := 'E';

         ELSE

           l_check_rec.xrate := P_Exchange_Rate;

         END IF;

       ELSE -- exchange rate is other than USER

          -- --------------------------------------------------------
          -- To calculate the exchange_rate we need to see what the
          -- the value of the system parameter make_rate_mandatory_flag
          -- --------------------------------------------------------

          l_check_rec.xrate_date := nvl(trunc(P_exchange_date),trunc(sysdate));
          l_check_rec.xrate := ap_utilities_pkg.get_exchange_rate(
                                    l_inv_rec.pmt_currency_code,
                                    l_asp_rec.base_currency_code,
                                    l_check_rec.xrate_type,
                                    l_check_rec.xrate_date,
                                    'APAYFULB');

          IF (l_check_rec.xrate is NULL
              AND l_asp_rec.make_rate_mandatory_flag = 'Y') THEN

             x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;

             FND_MESSAGE.SET_NAME('SQLAP', 'AP_NO_XRATE');
             FND_MSG_PUB.ADD;

             FND_MSG_PUB.COUNT_AND_GET(
               p_count => x_msg_count,
               p_data  => x_msg_data
               );

--             XXAP_PAY_SINGLE_INVOICE_PKG.print_debuginfo(l_module_name, 'EXIT',
--                             G_LEVEL_PROCEDURE);
             l_temp_status := 'E';

          END IF; -- mandatory_flag = Y

        END IF; -- Exchange Rate = USER

      END IF; -- currency_code <> base_currency_code

      EXCEPTION

        WHEN NO_DATA_FOUND THEN

          x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;

          FND_MESSAGE.SET_NAME('SQLAP', 'AP_INVOICE_CANNOT_BE_PAID');
          FND_MSG_PUB.ADD;

          FND_MSG_PUB.COUNT_AND_GET(
            p_count => x_msg_count,
            p_data  => x_msg_data
            );

--          XXAP_PAY_SINGLE_INVOICE_PKG.print_debuginfo(l_module_name, 'EXIT',
--                          G_LEVEL_PROCEDURE);
          l_temp_status := 'E';

        WHEN TOO_MANY_ROWS THEN

          -- This means that the payment schedules for the one invoice may
          -- have different payment methods. If that is the case, we cannot
          -- handle in one payment.

          x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;

          FND_MESSAGE.SET_NAME('SQLAP', 'AP_MISMATCHED_PMT_SCHEDS');
          FND_MSG_PUB.ADD;

          FND_MSG_PUB.COUNT_AND_GET(
            p_count => x_msg_count,
            p_data  => x_msg_data
            );

--          XXAP_PAY_SINGLE_INVOICE_PKG.print_debuginfo(l_module_name, 'EXIT',
--                          G_LEVEL_PROCEDURE);
          l_temp_status := 'E';

      END;


      l_debug_info := 'Check if the Invoice is being paid by a payment batch';
--      XXAP_PAY_SINGLE_INVOICE_PKG.print_debuginfo(l_module_name, l_debug_info,
--                      G_LEVEL_PROCEDURE);

      SELECT count(*)
      INTO l_num_invs_sel_for_pmt
      FROM ap_selected_invoices_all
      WHERE invoice_id = P_invoice_id;

      IF (l_num_invs_sel_for_pmt > 0) THEN

        x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;

        FND_MESSAGE.SET_NAME('SQLAP', 'AP_INV_PAY_FAIL_SEL_BY_BATCH');
        FND_MSG_PUB.ADD;

        FND_MSG_PUB.COUNT_AND_GET(
          p_count => x_msg_count,
          p_data  => x_msg_data
        );

--        XXAP_PAY_SINGLE_INVOICE_PKG.print_debuginfo(l_module_name, 'EXIT',
--                        G_LEVEL_PROCEDURE);
        l_temp_status := 'E';

      END IF;

      /*
      || ==============================================================
      ||  Verify if we should pay invoices for this supplier
      || -------------------------------------------------------------
      || We want to verify that if Oracle Payables should place all
      || payments for this supplier on HOLD also, verify that the
      || vendor site that we have selected in step 1 is Pay Site
      || which is also active
      || ==============================================================
      */

      l_debug_info := 'Verrify Supplier Site Address related info';
--      XXAP_PAY_SINGLE_INVOICE_PKG.print_debuginfo(l_module_name, l_debug_info,
--                      G_LEVEL_PROCEDURE);

      BEGIN

        SELECT nvl(asup.hold_all_payments_flag,'N'),
               nvl(assp.pay_site_flag, 'N'),
               asup.vendor_type_lookup_code
        INTO   l_hold_all_payments_flag,
               l_active_pay_sites,
               l_vendor_type_lookup_code
        FROM   ap_suppliers asup,
               ap_supplier_sites_all assp
        WHERE  asup.vendor_id = l_inv_rec.vendor_id
        AND    asup.vendor_id = assp.vendor_id
        AND    assp.vendor_site_id = l_inv_rec.vendor_site_id;


        IF (l_hold_all_payments_flag = 'Y' or l_active_pay_sites = 'N') THEN

           RAISE NO_DATA_FOUND;

        ELSE

          IF l_vendor_type_lookup_code <> 'EMPLOYEE' THEN

            SELECT hzl.Address1,
                 hzl.Address2,
                 hzl.Address3,
                 hzl.City,
                 hzl.Country,
                 hzl.Postal_Code,
                 hzl.Province,
                 hzl.State,
                 hzl.Address4,
                 hzl.County,
                 hzl.Address_Style,
                 asus.Vendor_Id,
                 asus.Vendor_Site_Id,
                 asus.Vendor_site_code,
                 nvl(asus.Pay_Site_Flag,'N'),
                 nvl(asus.Primary_Pay_Site_Flag,'N')
            INTO   l_apvs_rec.Address_Line1,
                 l_apvs_rec.Address_Line2,
                 l_apvs_rec.Address_Line3,
                 l_apvs_rec.City,
                 l_apvs_rec.Country,
                 l_apvs_rec.Zip,
                 l_apvs_rec.Province,
                 l_apvs_rec.State,
                 l_apvs_rec.Address_Line4,
                 l_apvs_rec.County,
                 l_apvs_rec.Address_Style,
                 l_apvs_rec.Vendor_Id,
                 l_apvs_rec.Vendor_Site_Id,
                 l_apvs_rec.Vendor_site_code,
                 l_apvs_rec.Pay_Site_Flag,
                 l_apvs_rec.Primary_Pay_Site
            FROM   ap_supplier_sites_all asus,
                 hz_locations hzl
            WHERE  asus.vendor_site_id = l_inv_rec.vendor_site_id
            AND    asus.location_id = hzl.location_id
            AND nvl(trunc(asus.inactive_date),sysdate+1) > trunc(sysdate);


            IF l_apvs_rec.Pay_Site_Flag = 'N' THEN

              BEGIN

               -- We want to search if there is a Primary Pay Site for
               -- for this Vendor

                 SELECT hzl.Address1,
                        hzl.Address2,
                        hzl.Address3,
                        hzl.City,
                        hzl.Country,
                        hzl.Postal_Code,
                        hzl.Province,
                        hzl.State,
                        hzl.Address4,
                        hzl.County,
                        hzl.Address_Style,
                        asus.Vendor_Id,
                        asus.Vendor_Site_Id,
                        asus.Vendor_Site_Code,
                        nvl(asus.Pay_Site_Flag,'N'),
                        nvl(asus.Primary_Pay_Site_Flag,'N')
                 INTO   l_apvs_rec.Address_Line1,
                        l_apvs_rec.Address_Line2,
                        l_apvs_rec.Address_Line3,
                        l_apvs_rec.City,
                        l_apvs_rec.Country,
                        l_apvs_rec.Zip,
                        l_apvs_rec.Province,
                        l_apvs_rec.State,
                        l_apvs_rec.Address_Line4,
                        l_apvs_rec.County,
                        l_apvs_rec.Address_Style,
                        l_apvs_rec.Vendor_Id,
                        l_apvs_rec.Vendor_Site_Id,
                        l_apvs_rec.Vendor_site_code,
                        l_apvs_rec.Pay_Site_Flag,
                        l_apvs_rec.Primary_Pay_Site
                 FROM   ap_supplier_sites_all asus,
                        hz_locations hzl
                 WHERE  asus.vendor_site_id = l_inv_rec.vendor_site_id
                 AND    asus.location_id = hzl.location_id
                 AND    nvl(trunc(asus.inactive_date),sysdate+1)
                        > trunc(sysdate)
                 AND    nvl(asus.primary_pay_site_flag,'N') = 'Y';


               EXCEPTION

                 WHEN NO_DATA_FOUND THEN

                 BEGIN

                   SELECT hzl.Address1,
                          hzl.Address2,
                          hzl.Address3,
                          hzl.City,
                          hzl.Country,
                          hzl.Postal_Code,
                          hzl.Province,
                          hzl.State,
                          hzl.Address4,
                          hzl.County,
                          hzl.Address_Style,
                          asus.Vendor_Id,
                          asus.Vendor_Site_Id,
                          asus.Vendor_site_code,
                          nvl(asus.Pay_Site_Flag,'N'),
                          nvl(asus.Primary_Pay_Site_Flag,'N')
                   INTO   l_apvs_rec.Address_Line1,
                          l_apvs_rec.Address_Line2,
                          l_apvs_rec.Address_Line3,
                          l_apvs_rec.City,
                          l_apvs_rec.Country,
                          l_apvs_rec.Zip,
                          l_apvs_rec.Province,
                          l_apvs_rec.State,
                          l_apvs_rec.Address_Line4,
                          l_apvs_rec.County,
                          l_apvs_rec.Address_Style,
                          l_apvs_rec.Vendor_Id,
                          l_apvs_rec.Vendor_Site_Id,
                          l_apvs_rec.Vendor_site_code,
                          l_apvs_rec.Pay_Site_Flag,
                          l_apvs_rec.Primary_Pay_Site
                   FROM   ap_supplier_sites_all asus,
                          hz_locations hzl
                   WHERE  asus.vendor_site_id = l_inv_rec.vendor_site_id
                   AND    asus.location_id = hzl.location_id
                   AND    nvl(trunc(asus.inactive_date),sysdate+1)
                          > trunc(sysdate)
                   AND    nvl(asus.pay_site_flag,'N') = 'Y'
                   AND    rownum = 1;

                  -- We want to find ANY Pay Site for this Vendor

                 EXCEPTION

                   WHEN NO_DATA_FOUND THEN

                   NULL; -- Can't have no data found here as there
                         -- has to be another pay site (verify)

                 END;

               END;

            END IF; -- l_apvs_rec.Pay_Site_Flag = 'N'

          END IF;  -- l_vendor_type_lookup_code

        END IF;

      EXCEPTION

        WHEN NO_DATA_FOUND Then

          -- The Vendor Site that was on the invoice does not exist or
          -- we cannot pay invoices for this vendor or the vendor has no
          -- active pay sites

          x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;

          FND_MESSAGE.SET_NAME('SQLAP', 'AP_NO_VENDOR_SITE');
          FND_MSG_PUB.ADD;

          FND_MSG_PUB.COUNT_AND_GET(
            p_count => x_msg_count,
            p_data  => x_msg_data
            );

--          XXAP_PAY_SINGLE_INVOICE_PKG.print_debuginfo(l_module_name, 'EXIT',
--                          G_LEVEL_PROCEDURE);
          l_temp_status := 'E';

      END;

      -- At this stage the we are assuming that the Vendor Site is a
      -- pay site and is active


      -- Verify if Processing Type of  Payment Process Profile provided
      -- is 'PRINTED', then Payment Document Id needs to be provided

      l_debug_info := 'Deriving Proceeing Type for Payment Process Profile';
--      XXAP_PAY_SINGLE_INVOICE_PKG.print_debuginfo(l_module_name, l_debug_info,
--                      G_LEVEL_PROCEDURE);


      BEGIN

        SELECT processing_type,
               print_instruction_immed_flag,
               default_printer
        INTO   l_processing_type,
               l_print_instr_immed_flag,
               l_default_printer
        FROM   IBY_PAYMENT_PROFILES
        WHERE  payment_profile_id = p_payment_profile_id;

      EXCEPTION
        WHEN NO_DATA_FOUND THEN

          x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;

          FND_MESSAGE.SET_NAME('SQLAP', 'AP_IBY_INVALID_PAYMENT_PROF');
          FND_MSG_PUB.ADD;

          FND_MSG_PUB.COUNT_AND_GET(
            p_count => x_msg_count,
            p_data  => x_msg_data
            );

--          XXAP_PAY_SINGLE_INVOICE_PKG.print_debuginfo(l_module_name, 'EXIT',
--                          G_LEVEL_PROCEDURE);
          l_temp_status := 'E';

      END;

      -- Verify payment document is needed or not
      IF l_processing_type = 'PRINTED' THEN
        IF p_payment_document_id IS NULL THEN

          x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;

          FND_MESSAGE.SET_NAME('SQLAP', 'AP_CE_PAYMENT_DOC_NEEDED');
          FND_MSG_PUB.ADD;

          FND_MSG_PUB.COUNT_AND_GET(
            p_count => x_msg_count,
            p_data  => x_msg_data
            );

--          XXAP_PAY_SINGLE_INVOICE_PKG.print_debuginfo(l_module_name, 'EXIT',
--                          G_LEVEL_PROCEDURE);
          l_temp_status := 'E';

        END IF;
      END IF;

      -- Verify whether payment_document_id provided is locked by
      -- batch and also valid for the internal bank account that
      -- is provided

      l_debug_info := 'Check If  Payment Document Id is Valid and Get the next check';
--      XXAP_PAY_SINGLE_INVOICE_PKG.print_debuginfo(l_module_name, l_debug_info,
--                      G_LEVEL_PROCEDURE);

      IF p_payment_document_id IS NOT  NULL THEN
        BEGIN

          SELECT payment_document_id
          INTO   l_payment_document_id
          FROM   CE_PAYMENT_DOCUMENTS
          WHERE  payment_document_id = p_payment_document_id
          AND    internal_bank_account_id = p_internal_bank_acct_id
          AND    payment_instruction_id IS NULL;

          IBY_DISBURSE_UI_API_PUB_PKG.Validate_Paper_Doc_Number
            (p_api_version    => 1.0,
             p_init_msg_list  => p_init_msg_list,
             p_payment_doc_id => p_payment_document_id,
             x_paper_doc_num  => l_next_check_number,
             x_return_status  => l_return_status,
             x_msg_count      => x_msg_count,
             x_msg_data       => x_msg_data,
             show_warn_msgs_flag => 'T');

          IF l_return_status <> FND_API.G_RET_STS_SUCCESS THEN

            x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
--            XXAP_PAY_SINGLE_INVOICE_PKG.print_debuginfo(l_module_name, 'EXIT',
--                            G_LEVEL_PROCEDURE);
            l_temp_status := 'E';

          END IF;

        EXCEPTION

          WHEN NO_DATA_FOUND THEN
            x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;

            FND_MESSAGE.SET_NAME('SQLAP', 'AP_PAY_DOCUMENT_ALREADY_IN_USE');
            FND_MSG_PUB.ADD;

            FND_MSG_PUB.COUNT_AND_GET(
              p_count => x_msg_count,
              p_data  => x_msg_data
              );

--            XXAP_PAY_SINGLE_INVOICE_PKG.print_debuginfo(l_module_name, 'EXIT',
--                            G_LEVEL_PROCEDURE);
            l_temp_status := 'E';

          END;
        END IF;


      /*
      || =======================================================
      || Need to get the party name from hz_parties as it
      || it is needed for the insert into ap_checks
      || =======================================================
      */

      l_debug_info := 'Get Supplier Party Name';
--      XXAP_PAY_SINGLE_INVOICE_PKG.print_debuginfo(l_module_name, l_debug_info,
--                      G_LEVEL_PROCEDURE);

      BEGIN

        SELECT asup.auto_calculate_interest_flag,
               hp.party_name
        INTO   l_vendor_rec.Auto_calc_int_flag,
               l_vendor_rec.Vendor_name
        FROM   ap_suppliers asup,
               hz_parties   hp
        WHERE  asup.vendor_id = l_inv_rec.vendor_id
        AND    asup.party_id = hp.party_id;

      EXCEPTION

        WHEN NO_DATA_FOUND THEN

          x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;

          FND_MESSAGE.SET_NAME('SQLAP', 'AP_PAY_NO_VENDOR');
          FND_MSG_PUB.ADD;

          FND_MSG_PUB.COUNT_AND_GET(
            p_count => x_msg_count,
            p_data  => x_msg_data
            );

--          XXAP_PAY_SINGLE_INVOICE_PKG.print_debuginfo(l_module_name, 'EXIT',
--                          G_LEVEL_PROCEDURE);
          l_temp_status := 'E';

      END;

      /*
      || ==============================================================
      ||  - Lock Invoices
      || --------------------------------------------------------------
      || Payment workbench actually calls the following code to
      || AP_PAY_IN_FULL_PKG.AP_LOCK_INVOICES
      ||
      || However all this code does is that it locks all the invoices
      || that are passed in via the p_invoice_id_list parameter.
      || It also will return the payment_method_code for each
      || payment_num on the list p_payment_num_list.
      ||
      || It will also return the following bits of information needed
      || to insert a row in the table AP_CHECKS_ALL
      ||
      || Currency_code,
      || Payment_method,
      || Vendor_id,     <-- Already have this information
      || Vendor_site_id <-- Alreadt have this information
      ||
      || For this requirement, we will always have a single invoice
      || and a single payment so all we really need to do is to lock
      || the invoice row
      ||
      || Any additional bits of information we need, we can select
      || outside in this procedure.
      || ==============================================================
      */

      l_debug_info := 'Lock The Invoice';
--      XXAP_PAY_SINGLE_INVOICE_PKG.print_debuginfo(l_module_name, l_debug_info,
--                      G_LEVEL_PROCEDURE);

      AP_INVOICES_PKG.LOCK_ROW(p_invoice_id,
                               l_curr_calling_sequence);

      /*
      || ==============================================================
      || -- - Get the the follwoing for the document :-
      ||          o Status_Lookup_Code
      ||          o Payment_Type_Flag
      || --------------------------------------------------------------
      */

      -- Derive check_status based on payment method
      l_debug_info := 'Is Payment Method Bills Payable enabled ';
--      XXAP_PAY_SINGLE_INVOICE_PKG.print_debuginfo(l_module_name, l_debug_info,
--                      G_LEVEL_PROCEDURE);

      BEGIN

        SELECT support_bills_payable_flag,
               maturity_date_offset_days
        INTO   l_bills_payable,
               l_maturity_date_offset_days
        FROM   IBY_PAYMENT_METHODS_VL
        WHERE  payment_method_code = l_inv_rec.payment_method;


        IF l_bills_payable = 'Y' THEN
          l_check_rec.status_lookup_code := 'ISSUED';
          l_maturity_date := NVL(trunc(p_check_date),trunc(sysdate))
                             + NVL(l_maturity_date_offset_days, 0);
        ELSE
          l_check_rec.status_lookup_code := 'NEGOTIABLE';
        END IF;

      EXCEPTION
        WHEN NO_DATA_FOUND THEN

          x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;

          FND_MESSAGE.SET_NAME('SQLAP', 'AP_IBY_INVALID_PAYMENT_METHOD');
          FND_MSG_PUB.ADD;

          FND_MSG_PUB.COUNT_AND_GET(
            p_count => x_msg_count,
            p_data  => x_msg_data
            );
--
--          XXAP_PAY_SINGLE_INVOICE_PKG.print_debuginfo(l_module_name, 'EXIT',
--                          G_LEVEL_PROCEDURE);
          l_temp_status := 'E';

      END;

      -- ---------------------------------------------------------------
      -- Note:  We will only populate the Checkrun_ID for Automatic
      --        Payments i.e. Payments in a Batch for Quick and Manual
      --        Payments this value will be Null.
      -- ---------------------------------------------------------------
      -- ---------------------------------------------------------------
      -- Step 1 : Sequential Numbering Logic
      -- ---------------------------------------------------------------

      FND_PROFILE.GET('UNIQUE:SEQ_NUMBERS',l_seq_num_profile);

      --5007576, re-wrote the doc sequencing section below

      l_doc_category_code := p_doc_category_code;

      if l_seq_num_profile in ('P','A') then

        if l_doc_category_code is not null then

          begin
            SELECT 'row exists'
            INTO   l_valid_sequence_exists
            FROM   fnd_doc_sequence_categories
            WHERE  code = l_doc_category_code
            AND    table_name IN ('AP_CHECKS','AP_CHECKS_ALL');
          exception
            when no_data_found then

              x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
              FND_MESSAGE.SET_NAME('SQLAP', 'AP_SEQ_NO_DOC_CAT');
              FND_MSG_PUB.ADD;
              FND_MSG_PUB.COUNT_AND_GET(p_count => x_msg_count,
                                        p_data  => x_msg_data);
--              XXAP_PAY_SINGLE_INVOICE_PKG.print_debuginfo(l_module_name, 'EXIT',FND_LOG.G_CURRENT_RUNTIME_LEVEL);
              l_temp_status := 'E';
              return;
          end;

        else



          CE_BANK_AND_ACCOUNT_VALIDATION.get_pay_doc_cat(p_payment_document_id,
                                                         p_payment_method_code,
                                                         p_internal_bank_acct_id,
                                                         l_doc_category_code);
        end if;







        if l_doc_category_code = '-1' and l_seq_num_profile = 'A'  then

          x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
          FND_MESSAGE.SET_NAME('SQLAP', 'AP_SEQ_DOC_CAT_NO_FOUND');
          FND_MSG_PUB.ADD;
          FND_MSG_PUB.COUNT_AND_GET(p_count => x_msg_count,
                                    p_data  => x_msg_data);
--          XXAP_PAY_SINGLE_INVOICE_PKG.print_debuginfo(l_module_name, 'EXIT',FND_LOG.G_CURRENT_RUNTIME_LEVEL);
          l_temp_status := 'E';
          return;

        end if;


        if l_doc_category_code <> '-1' and
           l_asp_rec.pay_doc_override <> 'Y' and
           l_doc_category_code <> p_doc_category_code then

          x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
          FND_MESSAGE.SET_NAME('SQLAP', 'AP_SEQ_DOC_NO_REQ');
          FND_MSG_PUB.ADD;
          FND_MSG_PUB.COUNT_AND_GET(p_count => x_msg_count,
                                    p_data  => x_msg_data);
--          XXAP_PAY_SINGLE_INVOICE_PKG.print_debuginfo(l_module_name, 'EXIT',FND_LOG.G_CURRENT_RUNTIME_LEVEL);
          l_temp_status := 'E';
          return;

        end if;


        --at this point if we haven't rejected we need to verify the sequence assignment is valid
        if l_doc_category_code <> '-1' then

          l_return_code := fnd_seqnum.get_seq_info(
                             app_id          => 200,
                             cat_code        => l_doc_category_code,
                             sob_id            => l_asp_rec.set_of_books_id,
                             met_code        => 'A',
                             trx_date        => nvl(trunc(p_check_date), trunc(sysdate)),
                             docseq_id        => l_docseq_id,
                             docseq_type    => l_docseq_type,
                             docseq_name    => l_docseq_name,
                             db_seq_name    => l_db_seq_name,
                             seq_ass_id        => l_seq_ass_id,
                             prd_tab_name    => l_prd_tab_name,
                             aud_tab_name    => l_aud_tab_name,
                             msg_flag        => l_msg_flag);



        --reject if invalid and seq numbering is always used
          if (l_return_code <> 0 or l_docseq_type = 'M') and l_seq_num_profile = 'A' then

            x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
            FND_MESSAGE.SET_NAME('SQLAP', 'AP_SEQ_CREATE_ERROR');
            FND_MSG_PUB.ADD;
            FND_MSG_PUB.COUNT_AND_GET(p_count => x_msg_count,
                                      p_data  => x_msg_data);
--            XXAP_PAY_SINGLE_INVOICE_PKG.print_debuginfo(l_module_name, 'EXIT',FND_LOG.G_CURRENT_RUNTIME_LEVEL);
            l_temp_status := 'E';
            return;

          elsif l_return_code = 0 and l_docseq_type = 'A' then

            --get seq value
            l_return_code := FND_SEQNUM.GET_SEQ_VAL(
                             200,
                             l_doc_category_code,
                             l_asp_rec.set_of_books_id,
                             'A',
                             nvl(trunc(p_check_date), trunc(sysdate)),
                             l_seqval,
                             l_dbseqid,
                             'N',
                             'N');

             if l_return_code <> 0 and l_seq_num_profile = 'A' then

               x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
               FND_MESSAGE.SET_NAME('SQLAP', 'AP_SEQ_CREATE_ERROR');
               FND_MSG_PUB.ADD;
               FND_MSG_PUB.COUNT_AND_GET(p_count => x_msg_count,
                                         p_data  => x_msg_data);
--               XXAP_PAY_SINGLE_INVOICE_PKG.print_debuginfo(l_module_name, 'EXIT',FND_LOG.G_CURRENT_RUNTIME_LEVEL);
               l_temp_status := 'E';
               return;

             end if;

          end if;

        end if; --l_doc_category_code is not null then

      end if; --l_seq_num_profile in ('P','A')

      -- We call Get_Single_Payment_Amount to get the amount for the payment
      -- net of the available discount. We pass in NULL for the payment num
      -- parameter because we want the entire invoice (all pmt scheds)
      -- to be paid

      l_debug_info := 'Getting the Check Amount';
--      XXAP_PAY_SINGLE_INVOICE_PKG.print_debuginfo(l_module_name, l_debug_info,
--                      G_LEVEL_PROCEDURE);

      l_amount :=  AP_PAY_IN_FULL_PKG.AP_Get_Check_Amount(
                             to_char(p_invoice_id),
                             NULL,
                             p_payment_type_flag,
                             sysdate,
                             l_inv_rec.Pmt_Currency_code,
                             p_take_discount,
                             l_asp_rec.Auto_Calc_Int_Flag,
                             l_vendor_rec.auto_calc_int_flag,
                             'APAYFULB');

      IF ( l_inv_rec.Pmt_Currency_code <> l_asp_rec.base_currency_code ) THEN

        IF ( l_check_rec.xrate_type = 'User' ) THEN

          l_base_amount := ap_utilities_pkg.ap_round_currency(
                                     (l_amount*l_check_rec.xrate),
                                      l_asp_rec.base_currency_code);

        ELSE -- exchange rate is other than USER

          l_base_amount := gl_currency_api.convert_amount(
                                           l_inv_rec.pmt_currency_code,
                                           l_asp_rec.base_currency_code,
                                           l_check_rec.xrate_date,
                                           l_check_rec.xrate_type,
                                           l_amount);

        END IF;

      END IF;

      -- Only when we are sure we want to insert should we select the
      -- check_id

      /*
      || ==============================================================
      || Step ?: Get Check_ID for creaation of record in the table
      ||         AP_CHECKS
      || --------------------------------------------------------------
      */

      -- First select the value for the CHECK_ID before insert

      SELECT ap_checks_s.nextval
      INTO   l_check_rec.check_id
      FROM   sys.dual;

      l_debug_info := 'Get Quick Check Id';
--      XXAP_PAY_SINGLE_INVOICE_PKG.print_debuginfo(l_module_name, l_debug_info,
--                      G_LEVEL_PROCEDURE);

      IF (P_payment_type_flag = 'Q') THEN

        SELECT alc1.displayed_field
        INTO   l_quick_check_id
        FROM   ap_lookup_codes alc1
        WHERE  alc1.lookup_type = 'NLS TRANSLATION'
        AND    alc1.lookup_code = 'QUICKCHECK ID';

        l_check_rec.checkrun_name :=
                    substrb(l_quick_check_id, 1,
                            30 - nvl(lengthb(to_char(l_check_rec.check_id)), 0))
                            ||to_char(l_check_rec.check_id);
      END IF;

      /*
      || ==============================================================
      || Step ? - Create Check (record in the table AP_CHECKS
      || --------------------------------------------------------------
      */

      l_debug_info := 'Calling Ap_Check_Pkg.Insert_Row';
--      XXAP_PAY_SINGLE_INVOICE_PKG.print_debuginfo(l_module_name, l_debug_info,
--                   G_LEVEL_PROCEDURE);

 if l_next_check_number is null and l_seq_num_profile in ('P') and p_doc_category_code is null then
      l_next_check_number := -1;
end if;


      AP_CHECKS_PKG.Insert_Row(
        X_Rowid                        => l_dummy_rowid,
        X_Amount                       => l_amount,
        X_Ce_Bank_Acct_Use_Id          => p_internal_bank_acct_id,
        X_Bank_Account_Name            => l_check_rec.bank_account_name,
        X_Check_Date                   => nvl(trunc(p_check_date),
                                              trunc(sysdate)),
        X_Check_Id                     => l_check_rec.check_id,
        X_Check_Number                 => l_next_check_number, --Afzal
        X_Currency_Code                => l_inv_rec.Pmt_Currency_code,
        X_Last_Updated_By              => FND_GLOBAL.USER_ID,
        X_Last_Update_Date             => SYSDATE,
        X_Payment_Type_Flag            => p_payment_type_flag,
        X_Address_Line1                => l_apvs_rec.Address_Line1,
        X_Address_Line2                => l_apvs_rec.Address_Line2,
        X_Address_Line3                => l_apvs_rec.Address_Line3,
        X_Checkrun_Name                => l_check_rec.Checkrun_Name,
        X_Check_Format_Id              => NULL,
        X_Check_Stock_Id               => NULL,
        X_City                         => l_apvs_rec.City,
        X_Country                      => l_apvs_rec.Country,
        X_Created_By                   => FND_GLOBAL.USER_ID,
        X_Creation_Date                => SYSDATE,
        X_Last_Update_Login            => FND_GLOBAL.USER_ID,
        X_Status_Lookup_Code           => l_check_rec.status_lookup_code,
        X_Vendor_Name                  => l_vendor_rec.vendor_name,
        X_Vendor_Site_Code             => l_apvs_rec.vendor_site_code,
        X_External_Bank_Account_Id     => l_inv_rec.external_bank_account_id,
        X_Zip                          => l_apvs_rec.Zip,
        X_Bank_Account_Num             => NULL,  -- For Electronic Pmts
        X_Bank_Account_Type            => NULL,  -- For Electronic Pmts
        X_Bank_Num                     => NULL,  -- For Electronic Pmts
        X_Check_Voucher_Num            => NULL,
        X_Cleared_Amount               => NULL,
        X_Cleared_Date                 => NULL,
        X_Doc_Category_Code            => l_Doc_Category_Code,
        X_Doc_Sequence_Id              => l_dbseqid, -- Seq Num
        X_Doc_Sequence_Value           => l_seqval, -- Seq Num
        X_Province                     => l_apvs_rec.Province, -- PO_VENDORS
        X_Released_Date                => NULL,
        X_Released_By                  => NULL,
        X_State                        => l_apvs_rec.State,
        X_Stopped_Date                 => NULL,
        X_Stopped_By                   => NULL,
        X_Void_Date                    => NULL,
        X_Attribute1                   => NULL,
        X_Attribute10                  => NULL,
        X_Attribute11                  => NULL,
        X_Attribute12                  => NULL,
        X_Attribute13                  => NULL,
        X_Attribute14                  => NULL,
        X_Attribute15                  => NULL,
        X_Attribute2                   => NULL,
        X_Attribute3                   => NULL,
        X_Attribute4                   => NULL,
        X_Attribute5                   => NULL,
        X_Attribute6                   => NULL,
        X_Attribute7                   => NULL,
        X_Attribute8                   => NULL,
        X_Attribute9                   => NULL,
        X_Attribute_Category           => NULL,
        X_Future_Pay_Due_Date          => l_maturity_date,
        X_Treasury_Pay_Date            => NULL,
        X_Treasury_Pay_Number          => NULL,
        X_Withholding_Status_Lkup_Code => NULL,
        X_Reconciliation_Batch_Id      => NULL,
        X_Cleared_Base_Amount          => NULL,
        X_Cleared_Exchange_Rate        => NULL,
        X_Cleared_Exchange_Date        => NULL,
        X_Cleared_Exchange_Rate_Type   => NULL,
        X_Address_Line4                => l_apvs_rec.Address_Line4,
        X_County                       => l_apvs_rec.County,
        X_Address_Style                => l_apvs_rec.Address_Style,
        X_Org_id                       => l_inv_rec.org_id,
        X_Vendor_Id                    => l_inv_rec.vendor_id,
        X_Vendor_Site_Id               => l_apvs_rec.Vendor_Site_Id,
        X_Exchange_Rate                => l_check_rec.xrate,
        X_Exchange_Date                => l_check_rec.xrate_date,
        X_Exchange_Rate_Type           => l_check_rec.xrate_type,
        X_Base_Amount                  => l_base_amount,
        X_Checkrun_Id                  => NULL,
        X_Calling_Sequence             => 'APAYFULB.PLS',
        X_Global_Attribute_Category    => NULL,
        X_Global_Attribute1            => NULL,
        X_Global_Attribute2            => NULL,
        X_Global_Attribute3            => NULL,
        X_Global_Attribute4            => NULL,
        X_Global_Attribute5            => NULL,
        X_Global_Attribute6            => NULL,
        X_Global_Attribute7            => NULL,
        X_Global_Attribute8            => NULL,
        X_Global_Attribute9            => NULL,
        X_Global_Attribute10           => NULL,
        X_Global_Attribute11           => NULL,
        X_Global_Attribute12           => NULL,
        X_Global_Attribute13           => NULL,
        X_Global_Attribute14           => NULL,
        X_Global_Attribute15           => NULL,
        X_Global_Attribute16           => NULL,
        X_Global_Attribute17           => NULL,
        X_Global_Attribute18           => NULL,
        X_Global_Attribute19           => NULL,
        X_Global_Attribute20           => NULL,
        X_transfer_priority            => NULL,
        X_maturity_exchange_rate_type  => NULL,
        X_maturity_exchange_date       => NULL,
        X_maturity_exchange_rate       => NULL,
        X_description                  => NULL,
        X_anticipated_value_date       => NULL,
        X_actual_value_date            => NULL,
        X_payment_profile_id           => p_payment_profile_id,
        X_bank_charge_bearer           => NULL,
        X_settlement_priority          => NULL,
        X_payment_method_code          => l_inv_rec.payment_method,
        X_payment_document_id          => p_payment_document_id,
        X_party_id                     => l_inv_rec.party_id,
        X_party_site_id                => l_inv_rec.party_site_id,
        X_legal_entity_id              => l_check_rec.legal_entity_id,
        X_payment_id                   => NULL);


      l_debug_info := 'Calling Ap_Reconciliation_Pkg.Insert_Payment_History';
--      XXAP_PAY_SINGLE_INVOICE_PKG.print_debuginfo(l_module_name, l_debug_info,
--                      G_LEVEL_PROCEDURE);
      IF ( p_payment_type_flag = 'R' ) THEN
       l_transaction_type := 'REFUND RECORDED';
      ELSE
       l_transaction_type := 'PAYMENT CREATED';
      END IF;

      l_debug_info := 'transaction type = ' || l_transaction_type;
--      XXAP_PAY_SINGLE_INVOICE_PKG.print_debuginfo(l_module_name, l_debug_info,
--                      G_LEVEL_PROCEDURE);

      -- Bug3343314
      AP_RECONCILIATION_PKG.insert_payment_history
     (
      x_check_id                => l_check_rec.check_id,
      x_transaction_type        => l_transaction_type,
      x_accounting_date         =>  nvl(trunc(p_check_date),
                                              trunc(sysdate)),
      x_trx_bank_amount         => NULL,
      x_errors_bank_amount      => NULL,
      x_charges_bank_amount     => NULL,
      x_bank_currency_code      => NULL,
      x_bank_to_base_xrate_type => NULL,
      x_bank_to_base_xrate_date => NULL,
      x_bank_to_base_xrate      => NULL,
      x_trx_pmt_amount          => l_amount,
      x_errors_pmt_amount       => NULL,
      x_charges_pmt_amount      => NULL,
      x_pmt_currency_code       => l_inv_rec.pmt_currency_code,
      x_pmt_to_base_xrate_type  => l_check_rec.xrate_type,
      x_pmt_to_base_xrate_date  => l_check_rec.xrate_date,
      x_pmt_to_base_xrate       => l_check_rec.xrate,
      x_trx_base_amount         => l_base_amount,
      x_errors_base_amount      => NULL,
      x_charges_base_amount     => NULL,
      x_matched_flag            => NULL,
      x_rev_pmt_hist_id         => NULL,
      x_org_id                  => l_inv_rec.org_id,
      x_creation_date           => SYSDATE,
      x_created_by              => FND_GLOBAL.User_Id,
      x_last_update_date        => SYSDATE,
      x_last_updated_by         => FND_GLOBAL.User_Id,
      x_last_update_login       => FND_GLOBAL.User_Id,
      x_program_update_date     => NULL,
      x_program_application_id  => NULL,
      x_program_id              => NULL,
      x_request_id              => NULL,
      x_calling_sequence        => l_curr_calling_sequence,
      x_accounting_event_id     => l_accounting_event_id
      );


      -- Any witholding distributions or Interest Invoices are created
      -- in the call to Create_Single_Payments.

      l_debug_info := 'Calling Ap_Pay_In_Full_Pkg.Create_Payments';
--      XXAP_PAY_SINGLE_INVOICE_PKG.print_debuginfo(l_module_name, l_debug_info,
--                      G_LEVEL_PROCEDURE);

      AP_PAY_IN_FULL_PKG.AP_Create_Payments(
                          to_char(p_invoice_id),
                          NULL,
                          l_check_rec.check_id,
                          p_payment_type_flag,
                          l_inv_rec.Payment_Method,
                          p_internal_bank_acct_id,
                          null, -- bank_account_num
                          null, -- bank_account_type,
                          null, -- bank_num,
                          nvl(trunc(p_check_date), trunc(sysdate)),
                          l_period_name,
                          l_inv_rec.Pmt_currency_code,
                          l_asp_rec.base_currency_code,
                          l_check_rec.Checkrun_Name,
                          l_seqval,
                          l_dbseqid,
                          l_check_rec.xrate,
                          l_check_rec.xrate_type,
                          l_check_rec.xrate_date,
                          p_take_discount, -- Pay In Full Take Discount
                          l_asp_rec.auto_calc_int_flag,
                          l_vendor_rec.auto_calc_int_flag,
                          l_asp_rec.set_of_books_id,
                          null, -- future_pay_code_combination_id
                          FND_GLOBAL.USER_ID,
                          FND_GLOBAL.USER_ID,
                          'APXPAWKB',
                          l_seq_num_profile,
                          l_accounting_Event_id,
                          l_inv_rec.org_id);


     l_debug_info := 'Calling IBY Single Payment API';
--     XXAP_PAY_SINGLE_INVOICE_PKG.print_debuginfo(l_module_name, l_debug_info,
--                    G_LEVEL_PROCEDURE);

     IF  l_temp_status <> 'E' THEN

       IF p_payment_type_flag IN ('Q', 'M') THEN

         IF p_payment_type_flag = 'Q' THEN
           l_manual_payment_flag := 'N';

   --bug  5982788

             select  checkrun_name  into   l_check_rec.Checkrun_name
             from ap_checks_all
             where check_id = l_check_rec.check_id ;


         ELSIF p_payment_type_flag = 'M' THEN

             l_manual_payment_flag := 'Y';
     --bug 5982788
             update  ap_checks_all
             set   checkrun_name  =  l_check_rec.check_id
             where  check_id = l_check_rec.check_id ;


             select  checkrun_name  into   l_check_rec.Checkrun_name
             from ap_checks_all
             where check_id = l_check_rec.check_id ;


         END IF;


       --Bug 5982788

         IBY_DISBURSE_SINGLE_PMT_PKG.submit_single_payment(
         p_api_version                =>    1.0,
         p_init_msg_list              =>    p_init_msg_list,
         p_calling_app_id             =>    200,
         p_calling_app_payreq_cd      =>    l_check_rec.Checkrun_Name,
         p_is_manual_payment_flag     =>    l_manual_payment_flag,
         p_payment_function           =>    l_inv_rec.payment_function,
         p_internal_bank_account_id   =>    p_internal_bank_acct_id,
         p_pay_process_profile_id     =>    p_payment_profile_id,
         p_payment_method_cd          =>    l_inv_rec.payment_method,
         p_legal_entity_id            =>    l_check_rec.legal_entity_id,
         p_organization_id            =>    l_inv_rec.org_id,
         p_organization_type          =>    'OPERATING_UNIT',
         p_payment_date               =>     nvl(trunc(p_check_date),
                                              trunc(sysdate)),
         p_payment_amount             =>    l_amount,
         p_payment_currency           =>    l_inv_rec.pmt_currency_code,
         p_payee_party_id             =>    l_inv_rec.party_id,
         p_payee_party_site_id        =>    l_inv_rec.party_site_id,
         p_supplier_site_id           =>    l_inv_rec.vendor_site_id,
         p_payee_bank_account_id      =>    l_inv_rec.external_bank_account_id,
         p_override_pmt_complete_pt   =>    'Y',
         p_bill_payable_flag          =>    NVL(l_bills_payable, 'N'),
         p_anticipated_value_date     =>    NULL,
         p_maturity_date              =>    l_maturity_date,
         p_payment_document_id        =>    p_payment_document_id,
         p_paper_document_number      =>    l_next_check_number,
         p_printer_name               =>    l_default_printer,
         p_print_immediate_flag       =>    l_print_instr_immed_flag,
         p_transmit_immediate_flag    =>    Null,
         p_payee_address_line1        =>    l_apvs_rec.address_line1,
         p_payee_address_line2        =>    l_apvs_rec.address_line2,
         p_payee_address_line3        =>    l_apvs_rec.address_line3,
         p_payee_address_line4        =>    l_apvs_rec.address_line4,
         p_payee_address_city         =>    l_apvs_rec.city,
         p_payee_address_county       =>    l_apvs_rec.county,
         p_payee_address_state        =>    l_apvs_rec.state,
         p_payee_address_zip          =>    l_apvs_rec.zip,
         p_payee_address_country      =>    l_apvs_rec.country,
         p_attribute_category         =>    Null,
         p_attribute1                 =>    Null,
         p_attribute2                 =>    Null,
         p_attribute3                 =>    Null,
         p_attribute4                 =>    Null,
         p_attribute5                 =>    Null,
         p_attribute6                 =>    Null,
         p_attribute7                 =>    Null,
         p_attribute8                 =>    Null,
         p_attribute9                 =>    Null,
         p_attribute10                =>    Null,
         p_attribute11                =>    Null,
         p_attribute12                =>    Null,
         p_attribute13                =>    Null,
         p_attribute14                =>    Null,
         p_attribute15                =>    Null,
         x_num_printed_docs           =>    l_num_printed_docs,
         x_payment_id                 =>    l_payment_id,
         x_paper_doc_num              =>    l_paper_doc_num,
         x_pmt_ref_num                =>    l_pmt_ref_num,
         x_return_status              =>    l_return_status,
         x_error_ids_tab              =>    x_errorIds,
         x_msg_count                  =>    x_msg_count,
         x_msg_data                   =>    x_msg_data
         );

         IF (l_return_status =  FND_API.G_RET_STS_SUCCESS) THEN

           UPDATE AP_CHECKS_ALL
           SET    payment_id  = l_payment_id
           WHERE check_id = l_check_rec.check_id;


           IF p_payment_type_flag  <> 'M'  THEN
             IF l_paper_doc_num IS NOT NULL THEN
               l_check_number := l_paper_doc_num;
             ELSE
               l_check_number := l_pmt_ref_num;
             END IF;

-- if l_next_check_number is null and l_seq_num_profile in ('P') and p_doc_category_code is null then
--      l_next_check_number := -1;
--end if;

             IF l_next_check_number <> l_check_number THEN
               UPDATE AP_CHECKS_ALL
               SET   check_number = l_check_number
               WHERE check_id = l_check_rec.check_id;
             END IF;
           END IF;

           x_return_status := l_return_status;

         ELSE

           x_return_status := l_return_status;

         END IF;

       END IF;   -- p_payment_type_flag


    ELSE

        x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;

    END IF;   -- l_temp_status
    x_check_id := l_check_rec.check_id;
DBMS_OUTPUT.PUT_LINE('x_return_status-'||x_return_status||'-l_check_id-'||l_check_rec.check_id);
COMMIT;
  EXCEPTION

    WHEN OTHERS THEN
    DBMS_OUTPUT.PUT_LINE('EXCEPTION-'||SQLERRM);
--      XXAP_PAY_SINGLE_INVOICE_PKG.print_debuginfo(l_module_name, 'Exception occured when '
--             || 'Payable single payment API fialed. Single payment creation will '
--             || 'be aborted and no records will be committed for '
--             || 'the invoice_id: '
--             || p_invoice_id, G_LEVEL_PROCEDURE
--            );
--      XXAP_PAY_SINGLE_INVOICE_PKG.print_debuginfo(l_module_name, 'SQLCODE: ' || SQLCODE,
--                         G_LEVEL_PROCEDURE);
--      XXAP_PAY_SINGLE_INVOICE_PKG.print_debuginfo(l_module_name, 'SQLERRM: ' || SQLERRM,
--                         G_LEVEL_PROCEDURE);

      x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;
--      XXAP_PAY_SINGLE_INVOICE_PKG.print_debuginfo(l_module_name, 'EXIT',
--                         G_LEVEL_PROCEDURE);

      RETURN;
END ;

--END;


---running anonymous block

declare
l_return_status varchar2(2000);
l_msg_data  varchar2(2000);
l_check_id number;
begin
XX_AP_INVOICE(
10473427,
11360,
'XX_CHECK',
166,
sysdate,
l_return_status,
l_msg_data,
l_check_id
);
dbms_output.put_line('l_return_status-'||l_return_status||'-l_msg_data-'||l_msg_data||'-l_check_id-'||l_check_id);
exception when others then
dbms_output.put_line(sqlerrm);
end; 


 

SELECT * FROM AP_CHECKS
WHERE CHECK_ID = 8173679;

Wednesday, February 3, 2021

Oracle EBS R12 CO Extension for Attachment Mandatory in SSHR Review Page

Read this below blog to have a overview how the CO Extension works.

http://mogalafzal.blogspot.com/2016/03/21-oaf-co-extension.html


Requirement: 

To make the attachments mandatory in the review page for certain EIT and SIT Transactions, not all.

Created lookup value with the Function_name as lookup_code to validate attachments required. Attached procedures and images of lookups for reference.


1.

Page: /oracle/apps/per/selfservice/review/webui/ReviewPG
Controller: ReviewCO --> ReviewCOEx

Create new project with package name: xxcust.oracle.apps.per.selfservice.review.webui

import the folder from the java top :  oracle.apps.per.selfservice.review.webui.ReviewCO (class file)


2.

Write below code in PFR in your extend of ReviewCO as ReviewCOEx java file.


public void processFormRequest(OAPageContext oapagecontext, OAWebBean oawebbean) {
        

      OAApplicationModule oaapplicationmodule = oapagecontext.getApplicationModule(oawebbean);
         // throw new OAException("under sql exception"+oapagecontext.getParameter("OAFunc"),OAException.INFORMATION);
 OADBTransactionImpl txn = (OADBTransactionImpl)oapagecontext.getRootApplicationModule().getOADBTransaction();      
        
        //getting the function id name and comparing it with our lookup values to check if required Y or N
          String outParamValue = null;  
      CallableStatement callableStatement =      
        txn.createCallableStatement("begin P_GET_TXN_NAME_YN(:1, :2); end;",OADBTransaction.DEFAULT);      
      try {     
          callableStatement.setString(1,oapagecontext.getParameter("OAFunc"));// "HR_EIT_VS_SS"
        callableStatement.registerOutParameter(2, Types.VARCHAR);  
        
        
        callableStatement.execute();  
        outParamValue = callableStatement.getString(2);  
        callableStatement.close();  
      } catch (SQLException sqle) {  
        
            throw new OAException("under sql exception"+sqle,OAException.ERROR);
      }  
      
          OADBTransactionImpl txn2 = (OADBTransactionImpl)oapagecontext.getRootApplicationModule().getOADBTransaction();
          OAMessageAttachmentLinkBean uploadBean = (OAMessageAttachmentLinkBean)oawebbean.findChildRecursive("AttachmentLink");
          String ssdn = (String)uploadBean.getAttributeValue(oapagecontext.getRenderingContext(), TEXT_ATTR);
          
          //getting the status of the Attachments as None for no attachments, but for arabic it is issue, so we are using lookup values for arabic ex: 'La shai' as 'None' in description.
          String outParamValue2 = null;  
          CallableStatement callableStatement2 =
          txn2.createCallableStatement("begin P_GET_ATTACH_STATUS(:1, :2); end;",OADBTransaction.DEFAULT);
          try {
          callableStatement2.setString(1,ssdn);
          callableStatement2.registerOutParameter(2, Types.VARCHAR);
          
          
          callableStatement2.execute();
          outParamValue2 = callableStatement2.getString(2);
          callableStatement2.close();
          } catch (SQLException sqle2) {
          
            throw new OAException("under sql exception"+sqle2,OAException.ERROR);
          }
       
          /* For testing the outputs
           if (oapagecontext.getParameter("HrSubmit")!= null) {
             throw new OAException("ssdn.trim " + ssdn.trim() + "  outParamValue " +outParamValue + "  outParamValue2 " +outParamValue2 ,OAException.ERROR);
          }
              //throw new OAException("outParamValue " +outParamValue,OAException.ERROR);          }
       */
          if ("Y".equals(outParamValue)){
     if (oapagecontext.getParameter("HrSubmit")!= null)
      {
     // OAMessageAttachmentLinkBean uploadBean = (OAMessageAttachmentLinkBean)oawebbean.findChildRecursive("AttachmentLink");
     // String ssdn = (String)uploadBean.getAttributeValue(oapagecontext.getRenderingContext(), TEXT_ATTR);
         //throw new OAException("ssdn.trim " + ssdn.trim(),OAException.ERROR);
      if ("None".equals(outParamValue2 )  )//|| "View".equals(ssdn.trim()) )//|| "?? ???".contains(ssdn.trim()))
      {
//      throw new OAException("There is no attachment kindly click on add button and browse your attachment",OAException.ERROR);
          throw new OAException("PER", "FUJ_ATTACHMENT_MAND", null, OAException.ERROR, null);

       //   throw new OAException("outParamValue2 " + outParamValue2 + "  outParamValue " +outParamValue ,OAException.ERROR);
      }
      else
      {
      
      super.processFormRequest(oapagecontext, oawebbean);
      }
      }
      else
      {
      //System.out.println("There exists an attachment to the expense claim. The process will now continue");
      super.processFormRequest(oapagecontext, oawebbean);
      }
      }
      else
      {
          super.processFormRequest(oapagecontext, oawebbean);
          //throw new OAException("output value is "+outParamValue,OAException.ERROR);
      }   
          
      }


3.




4 . 

Personlization

5. Move the class folder to the java_top and test the same.

6. for any update in the java code, change the name of the file ex: ReviewCOEx to ReviewCOEx2 or 3 and so on, run/make the code run

and then repeat the step 4,5.

7. Procedures 

CREATE OR REPLACE PROCEDURE APPS.P_GET_TXN_NAME_YN
(P_TXN_NAME VARCHAR2,
P_OUTPUT OUT VARCHAR2)
AS
BEGIN
SELECT 'Y'
INTO P_OUTPUT
 FROM FND_LOOKUP_VALUES
WHERE LOOKUP_TYPE = 'FUJ_SSHR_ATTACH_REQUIRED'
AND LANGUAGE = 'US'
AND LOOKUP_CODE = P_TXN_NAME;
/*SELECT 'Y'
INTO P_OUTPUT
FROM OAF_TEST
WHERE TXN_NAME = P_TXN_NAME;*/
EXCEPTION WHEN OTHERS THEN
P_OUTPUT := 'N';
END;
/


DECLARE
A VARCHAR2(200);
BEGIN
--P_GET_ATTACH_STATUS('?? ???',A);
P_GET_ATTACH_STATUS('None',A);
DBMS_OUTPUT.PUT_LINE(A);
END;

CREATE OR REPLACE PROCEDURE APPS.P_GET_ATTACH_STATUS
(P_TXN_NAME VARCHAR2,
P_OUTPUT OUT VARCHAR2)
AS
BEGIN
SELECT DESCRIPTION
INTO P_OUTPUT
 FROM FND_LOOKUP_VALUES
WHERE LOOKUP_TYPE = 'FUJ_SSHR_VALID_COEX'
AND LANGUAGE = 'US'
AND LOOKUP_CODE = UPPER(TRIM(P_TXN_NAME));
/*SELECT 'Y'
INTO P_OUTPUT
FROM OAF_TEST
WHERE TXN_NAME = P_TXN_NAME;*/
EXCEPTION WHEN OTHERS THEN
P_OUTPUT := 'N';
END;
/

Wednesday, January 6, 2021

Oracle Apps R12 create AR Receipt as On Account using api AR_RECEIPT_API_PUB.Create_Apply_on_acc

 --CREATE OR REPLACE PROCEDURE F_OB_TEST AS
declare
--p_count number;
g_request_id            NUMBER := fnd_global.conc_request_id;
p_amount number ;
p_receipt_date date := to_date('29-dec-2020'); --> change in prod
p_rec_mthd number := 332091;
--p_trx_number TRX_NUMBER_TYPE;
--p_trx_amount TRX_AMT_TYPE;
 P_TRX_NUMBER                   APPS.TRX_NUMBER_TYPE := APPS.TRX_NUMBER_TYPE();
 P_TRX_AMOUNT                   APPS.TRX_AMT_TYPE := APPS.TRX_AMT_TYPE();
p_remittance_bank_account_id    NUMBER  := 112771;
p_customer_number varchar2(240);-- := '41';
p_UserName varchar2(240) := 'EG_AFZ';
W_Status varchar2(2000) ;
W_Message varchar2(2000) ;
P_COMMENTS varchar2(240) := 'OB';
p_receipt_number varchar2(240);
retcode VARCHAR(240);

        l_msg_count                        NUMBER;
        l_count                            NUMBER;
        --l_receipt_Number                NUMBER;
        l_msg_data                           VARCHAR2 (32767);
        p_count                            NUMBER;
        l_error_mesg                       VARCHAR2 (32767);               
        l_error_code                       VARCHAR2 (32767);
        l_org_type                         VARCHAR2(32767) := NULL;
        l_org_name                         VARCHAR2(32767) := NULL;
        ln_org_id                          NUMBER:=NULL;
        l_user_id                      NUMBER ;--
        l_resp_id                      NUMBER := 523322; --
        l_resp_appl_id                 NUMBER := 222;
        l_org_id                       NUMBER := 18113;
        --l_receipt_method_id            NUMBER := 7025; --METHOD_NAME = FM ??? ??? ?????
        --p_receipt_method_id             NUMBER := 7025; --Cash Operation; --check this later
        currency_code                      VARCHAR2(3):='AED';
        l_customer_id                      NUMBER;
        l_site_use_id                      NUMBER;
        l_exist                            VARCHAR2(32767) := 'N';
        l_ErrFlag                          VARCHAR2(32767) := 'N';
        l_ErrMsg                           VARCHAR2(32767) := NULL;
        l_cash_receipt_id                  NUMBER;
        l_receipt_number                   VARCHAR2(32767);
        p_attribute_rec                    AR_RECEIPT_API_PUB.ATTRIBUTE_REC_TYPE;
        app_attribute_rec                  AR_RECEIPT_API_PUB.ATTRIBUTE_REC_TYPE;
        l_CustAcctId                       NUMBER;
        l_customer_trx_id                  NUMBER;
        l_status                           VARCHAR2(32767);
        l_mesg                             VARCHAR2(32767);
        l_cr_id                            NUMBER;
        l_return_status                    VARCHAR2(32767);
        l_payment_schedule_id             NUMBER;
        l_receipt_number1                 NUMBER;
        l_due_amt                        NUMBER;    
        l_receipt_cnt                    NUMBER;
        l_trx_applied_details           VARCHAR2(2000) := '';
                      
                      
cursor c1 is

select * from
XXOB_FNCE --custom table
where TXN_MODE = 'On Account Receipts '
AND CUST_NUMBER IS NOT NULL
--AND AMOUNT > '0'
AND ATTRIBUTE2 IS NULL
AND TXN_NUMBER  NOT IN ('OB_F1-7')--,'OB_F1-3')
;
                      
        BEGIN
FOR I IN C1 LOOP        
            BEGIN
                SELECT user_id
                INTO l_user_id
                FROM fnd_user
                WHERE user_name= p_UserName;
                EXCEPTION
                WHEN OTHERS THEN
                --l_user_id:=2605;
                l_ErrFlag := 'Y';
                l_ErrMsg  := l_ErrMsg || ' - ' || SQLERRM;
            END;
       

/*-----------------------------------
                -- Apps Initialize
--------------------------------------*/        
                fnd_global.apps_initialize(l_user_id,l_resp_id,l_resp_id,0);
               mo_global.set_policy_context('S',l_org_id);
                mo_global.init ('AR');

                 BEGIN
                    SELECT
                    hca.cust_account_id
                    INTO
                    l_CustAcctId
                    FROM  
                    hz_cust_accounts_all hca
                    ,hz_parties  hp
                    WHERE
                    hp.party_id=hca.party_id
                    AND  hca.account_number =I.CUST_NUMBER
                    AND hca.status = 'A'
                    AND rownum = 1
                         ;
                EXCEPTION
                         WHEN OTHERS THEN
                          l_ErrFlag := 'Y';
                          l_ErrMsg:='Customer Does Not Exists';
                          retcode:=0;----------Added on 21-aug-2017 Requested by NBF.
                          ---l_ErrMsg  := l_ErrMsg || ' - ' || SQLERRM;
                          l_ErrMsg  := l_ErrMsg || ' - ' || SQLERRM;
                          W_Status:='Failure';
                                                          W_Message:=l_ErrMsg||'_'||'APPLY API';
                          FND_FILE.PUT_LINE(FND_FILE.LOG,
                                            'ERROR: while fetching Customer_Number for Cust Ref '  || ' ' || SQLERRM);

                     END;
                     fnd_file.put_line(fnd_file.log,'Customer_Number' ||p_Customer_Number);
                     fnd_file.put_line(fnd_file.log,'l_CustAcctId'  ||l_CustAcctId);
                    DBMS_OUTPUT.PUT_LINE('l_CustAcctId'||l_CustAcctId);
                            
                IF l_CustAcctId >0 THEN
                                    BEGIN
                                                SELECT c.site_use_id
                                                 ---a.cust_account_id,
                                                --- e.address1,
                                                ---e.address2,
                                                 ---e.address3,
                                                --- e.address4,
                                                 --e.postal_code,
                                                --- e.province,
                                                -- e.state,
                                                --- country
                                                INTO
                                                 l_site_use_id
                                                 FROM hz_cust_accounts a,
                                                 hz_cust_acct_sites_all b,
                                                 hz_cust_site_uses_all c,
                                                 hz_party_sites d,
                                                 hz_locations e
                                                 WHERE a.cust_account_id = b.cust_account_id
                                                 AND b.cust_acct_site_id = c.cust_acct_site_id
                                                 AND b.party_site_id = d.party_site_id
                                                 AND d.location_id = e.location_id
                                                 AND c.site_use_code = 'BILL_TO'
                                                 AND c.status = 'A'
                                                 AND b.org_id = c.org_id
                                                 AND b.org_id =l_org_id
                                                 AND rownum = 1
                                                 AND a.cust_account_id=l_CustAcctId;
                                                EXCEPTION
                                                         WHEN OTHERS THEN
                                                          l_ErrFlag := 'Y';
                                                          l_ErrMsg:='Customer Sits is having Issue';
                                                          retcode:=0;----------Added on 21-aug-2017 Requested by NBF.
                                                          l_ErrMsg  := l_ErrMsg || ' - ' || SQLERRM;
                                                          W_Status:='Failure';
                                                          W_Message:=l_ErrMsg||'_'||'APPLY API';
                                                          FND_FILE.PUT_LINE(FND_FILE.LOG,
                                                                            'ERROR: while fetching Bill To '|| ' ' || SQLERRM);
                                    END;
                
                DBMS_OUTPUT.PUT_LINE('l_org_id'||l_org_id);
                DBMS_OUTPUT.PUT_LINE('l_site_use_id'||l_site_use_id);
                
/******************************************************************************************************
                -----------END OF Bill To Validations
******************************************************************************************************/
                    IF l_site_use_id> 0 THEN ---Commented by Rakesh 23-Aug-217
                    
                    
                    p_attribute_rec.ATTRIBUTE5          := '1';
                
               


    BEGIN
                        --l_receipt_Number := 'XX-11';
                            DBMS_OUTPUT.PUT_LINE('Calling Create Cash');
                            
                                BEGIN

                                     AR_RECEIPT_API_PUB.Create_Apply_on_acc
                                                                   ( p_api_version       => 1.0,
                                                                     p_init_msg_list     => FND_API.G_TRUE,
                                                                     p_commit            => FND_API.G_TRUE,
                                                                     p_validation_level  => FND_API.G_VALID_LEVEL_FULL,
                                                                     x_return_status     => l_return_status,
                                                                     x_msg_count         => l_msg_count,
                                                                     x_msg_data          => l_msg_data,
                                                                     p_currency_code     => 'AED',
                                                                     p_amount            => ABS(i.amount),
                                                                     p_receipt_number    => i.txn_number,
                                                                     p_receipt_date      =>  TO_DATE('29-dec-2020'),
                                                                     p_gl_date           => TO_DATE('29-dec-2020'),
                                                                     --p_customer_number   => v_customer_number,
                                                                     p_customer_id                 => l_CustAcctId,
                                                                     p_receipt_method_id => p_rec_mthd,
                                                                     p_org_id            => l_org_id,
                                                                     p_cr_id             => l_cr_id,
                                                                     p_attribute_rec            =>p_attribute_rec
                                                                       );
                                    DBMS_OUTPUT.PUT_LINE('STATUS '||l_return_status||' x_msg_count '||l_msg_count||' x_msg_data '||l_msg_data);
                                    IF l_return_status = 'S' THEN
                                       DBMS_OUTPUT.put_line('Receipt Creation and apply on account is Sucessful :');
                                    ELSE
                                       DBMS_OUTPUT.put_line('Message count ' || L_msg_count);
                                       IF L_msg_count = 1 THEN
                                          DBMS_OUTPUT.put_line('v_msg_data '||L_msg_data);
                                       ELSIF L_msg_count > 1 THEN
                                       LOOP
                                          p_count := p_count+1;
                                          L_msg_data := FND_MSG_PUB.Get(FND_MSG_PUB.G_NEXT,FND_API.G_FALSE);
                                          IF l_msg_data IS NULL THEN
                                          EXIT;
                                          END IF;
                                          DBMS_OUTPUT.put_line('Message' || p_count ||'---'||L_msg_data);
                                          END LOOP;
                                          END IF;
                                    END IF;
                                    END;
                                   -- end if;
                                COMMIT;
                        UPDATE XXOB_FNCE
                        SET ATTRIBUTE2 = l_return_status
                        WHERE TXN_NUMBER = I.TXN_NUMBER;
                        COMMIT;
                                                
                            END;
                            ------------END OF create cash
                        --    END IF; --EXIST
                        --    END IF;----l_receipt_cnt
                            ELSE
                            W_Status:='Failure';
                            W_Message:=l_ErrMsg||'_'||'Customer_SITE Does Not Exist';
                            retcode:=0;------------Added on 21-aug-2017 Requested by NBF.---Commented by Rakesh 23-Aug-217
                                DBMS_OUTPUT.put_line ('retcode ' || retcode);
                    END IF; ---l_site_use_id---Commented by Rakesh 23-Aug-217
                            
                    ELSE
                    W_Status:='Failure';
                    W_Message:=l_ErrMsg||'_'||'Customer_Number Does Not Exist';
                    retcode:=0;----------Added on 21-aug-2017 Requested by NBF.
                    DBMS_OUTPUT.put_line ('W_Status ' || W_Status);
                    DBMS_OUTPUT.put_line ('W_Message ' || W_Message);
                    DBMS_OUTPUT.put_line ('retcode ' || retcode);
                    
                    END IF; ---l_CustAcctId
                --arp_standard.disable_debug;
                END LOOP;
                END ;--create_rece
            --    END ; --
/

Monday, December 14, 2020

Oracle Workflow to show html table in the Message Notification

  1. Create the package, body as attached.

  1. Attribute

cid:image001.png@01D6D218.4735E210


  1. Function, message, attribute under it. 


cid:image006.jpg@01D6D218.7532CD40



  1. Attribute under message.

cid:image004.png@01D6D218.4735E210


4. Using attribute in Message Body

cid:image005.png@01D6D218.4735E210



Package: 

CREATE OR REPLACE PACKAGE APPS.XX_BODY_TXN_INFO_DOC_PKG
as
PROCEDURE XX_create_DOC_WF----for action history
(
document_id     IN              VARCHAR2,
display_type    IN              VARCHAR2,
DOCUMENT        IN OUT NOCOPY   VARCHAR2,
DOCUMENT_TYPE   IN OUT NOCOPY   VARCHAR2
);
PROCEDURE XX_DOC_CALL  --for calling
(itemtype in varchar2,
ITEMKEY IN VARCHAR2,
actid in number,
FUNCMODE IN VARCHAR2,
resultout out varchar2) ;

end;

--Package  Body
/


CREATE OR REPLACE PACKAGE BODY APPS.XX_BODY_TXN_INFO_DOC_PKG
as
--for history
PROCEDURE XX_create_DOC_WF
(
document_id     IN              VARCHAR2,
DISPLAY_TYPE    IN              VARCHAR2,
DOCUMENT        IN OUT NOCOPY   VARCHAR2,
document_type   IN OUT NOCOPY   VARCHAR2
)
IS
lv_details             VARCHAR2 (32767);
V_ITEMKEY          VARCHAR2(100);
amount number;

CURSOR CUR_QUALITF
IS


SELECT LINE_NUM,
    ASSET_NUMBER ,
    ENTITY,
    DEPARTMENT,
    UNITS,
    ASSET_DESCRIPTION,
    TAG_NUMBER,
    PO_NUMBER,
    SUPPLIER_NAME,
    ASSET_COST,
    ACCUMULATED_DEP,
    NET_BOOK_VALUE,
    ASSET_LIFE,
    DATE_PLACEDIN_SERVICE,
    ASSET_ID
FROM  XX_TABLE_APPROVALS_L
  WHERE DISPOSAL_ID = document_id
 ORDER BY LINE_NUM ASC;


BEGIN
/* TABLE HEADER*/
lv_details :=      lv_details
--|| '<h4> '
--|| 'Asset Details'
--|| '</H4>'
|| '<table border = "5" BORDERCOLOR="#B9D1EA"> <tr>'
--||'<b><caption align="left" BORDERCOLOR="#B9D1EA">Transaction Details</caption></b>' --if space in caption its coming in next line
|| '<th> '
|| 'Line'
|| '</th>'
|| '<th>'
|| 'Asset Number'
|| '</th>'
|| '</th>'
|| '<th>'
|| 'Entity'
|| '</th>'
|| '<th>'
|| 'Department'
|| '</th>'
|| '<th>'
|| 'Units'
|| '</th>'
|| '<th>'
|| 'Descriptin'
|| '</th>'
|| '<th>'
|| 'Tag Number'
|| '</th>'
|| '<th>'
|| 'PO Number'
|| '</th>'
|| '<th>'
|| 'Supplier Name'
|| '</th>'
|| '<th>'
|| 'Asset Cost'
|| '</th>'
|| '<th>'
|| 'Accumulated Dep'
|| '</th>'
|| '<th>'
|| 'NetBook Value'
|| '</th>'
|| '<th>'
|| 'Asset LIfe'
|| '</th>'
|| '<th>'
|| 'DatePlaceIn Service'
|| '</th>'
;

FOR CUR_QUALITF_REC IN CUR_QUALITF
loop
/*TABLE BODY */
lv_details:=        lv_details
|| '<tr>'
|| '<td>'
|| CUR_QUALITF_REC.LINE_NUM
|| '</td>'
|| '<td>'
|| CUR_QUALITF_REC.ASSET_NUMBER
|| '</td>'
|| '<td>'
|| CUR_QUALITF_REC.ENTITY
|| '</td>'
|| '<td>'
|| CUR_QUALITF_REC.DEPARTMENT
|| '</td>'
|| '<td>'
|| CUR_QUALITF_REC.UNITS
|| '</td>'
|| '<td>'
|| CUR_QUALITF_REC.ASSET_DESCRIPTION
|| '</td>'
|| '<td>'
|| CUR_QUALITF_REC.TAG_NUMBER
|| '</td>'
|| '<td>'
|| CUR_QUALITF_REC.PO_NUMBER
|| '</td>'
|| '<td>'
|| CUR_QUALITF_REC.SUPPLIER_NAME
|| '</td>'
|| '<td>'
|| CUR_QUALITF_REC.ASSET_COST
|| '</td>'
|| '<td>'
|| CUR_QUALITF_REC.ACCUMULATED_DEP
|| '</td>'
|| '<td>'
|| CUR_QUALITF_REC.NET_BOOK_VALUE
|| '</td>'
|| '<td>'
|| CUR_QUALITF_REC.ASSET_LIFE
|| '</td>'
|| '<td>'
|| CUR_QUALITF_REC.DATE_PLACEDIN_SERVICE
|| '</td>'
|| '</tr>'
;

--INSERT INTO TESTA VALUES(1,2,3);

end loop;

document :=LV_DETAILS||'</table>';

/*We have to determine document_type which is nothing but the mime type
document_type := 'image/jpg; name=filename.jpg';
Depending on the extension of the document the MIME type is determined. For simplicity
we are hard coding here*/
--—      document_type := 'application/pdf;name=test.pdf' ;  /* This syntax is used for PDF type of attachments */

document_type := 'text/html';

EXCEPTION
WHEN OTHERS
THEN
document := '<H4>Error ' || SQLERRM || '</H4>';

END;

PROCEDURE XX_DOC_CALL
(
itemtype in varchar2,
ITEMKEY IN VARCHAR2,
actid in number,
funcmode in varchar2,
resultout out varchar2
)
IS
V_DOCUMENT_ID CLOB;
v_itemkey  NUMBER;

BEGIN
V_DOCUMENT_ID :='PLSQL:XX_BODY_TXN_INFO_DOC_PKG.XX_create_DOC_WF/' || ITEMKEY;

/*Setting Value to the Document Type Attribute */

wf_engine.setitemattrtext (itemtype      => itemtype,
itemkey       => itemkey,
ANAME         => 'BODY_TXN_DET_INFO',
avalue        => V_DOCUMENT_ID
);

end;
end XX_BODY_TXN_INFO_DOC_PKG;
/

Monday, November 30, 2020

Oracle Workflow Attachments to shown in Notifications

     Create new Attribute XX1 with type document


    Add one more new attribute to the Message  #ATTACHMENTS
        Default value Attribute XX1

While creation/running the workflow add the atribute value as below:

              wf_engine.setItemAttrText(itemtype =>itemtype,
             itemkey =>itemkey,
             aname =>'XXASS_ATTACH',
             avalue=>'FND:entity=XXASSET_DISPOSAL'||'&'||'pk1name=DISPOSAL_ID'||'&'||'pk1value='||crec.header_id
             ) ;
             


The value for 'entity' can be obtained from DATA_OBJECT_CODE in FND_DOCUMENT_ENTITIES.

The value for 'pk1name' can be obtained from PK1_COLUMN in FND_DOCUMENT_ENTITIES.
The value for 'pk1value' can be obtained from PK1_VALUE in FND_ATTACHED_DOCUMENTS.     

Wednesday, September 9, 2020

Add New Responsibility , Menu Exclusions from others responsibility in Oracle Apps R12

1. Creating New Responsibility

2. Menu Exclusions to copy into new Responsibility from existing. 

 


1.

 

DECLARE

v_rowid varchar2(500);

BEGIN

fnd_responsibility_pkg.insert_row

( x_rowid => v_rowid,

x_responsibility_id => fnd_responsibility_s.NEXTVAL,

x_application_id => 201, -- Cash Management

x_web_host_name => NULL,

x_web_agent_name => NULL,

x_data_group_application_id => 201, -- Cash Management

x_data_group_id => 0, -- Standard

x_menu_id => 68071, -- CE_CASH_MANAGER

x_start_date => SYSDATE,

x_end_date => NULL,

x_group_application_id => 201,

x_request_group_id => 129,

x_version => 4,

x_responsibility_key => 'TEST_RESPONSIBILITY2',

x_responsibility_name => 'Test Responsibility2',

x_description => 'Responsibility for testing',

x_creation_date => SYSDATE,

x_created_by => -1,

x_last_update_date => SYSDATE,

x_last_updated_by => -1,

x_last_update_login => -1

);

EXCEPTION WHEN OTHERS THEN

DBMS_OUTPUT.PUT_LINE(SQLERRM);

END;

commit;


2. Adding menu exclusions..


DECLARE

v_resp_id number := 52634; --pass here the new responsibility_id

   CURSOR c1

   IS

   

     SELECT

application_id, responsibility_id, action_id,

                      rule_type,

                      last_updated_by, last_update_date, creation_date,

                      created_by, last_update_login

                      FROM fnd_resp_functions

                      WHERE RESPONSIBILITY_ID = 50626; --getting all the menu exlusions from existing

                      

BEGIN

   FOR i IN c1

   LOOP

      BEGIN

         DBMS_OUTPUT.put_line ('Processing');

         INSERT INTO fnd_resp_functions

                     (application_id, responsibility_id, action_id,

                      rule_type,

                      last_updated_by, last_update_date, creation_date,

                      created_by, last_update_login

                     )

              VALUES (i.application_id, v_resp_id, i.action_id,

                      i.rule_type,

                      2605, SYSDATE, SYSDATE,

                      2605, -1

                     );

      EXCEPTION

         WHEN OTHERS

         THEN

            DBMS_OUTPUT.put_line (SQLERRM);

      END;

   END LOOP;

EXCEPTION

   WHEN OTHERS

   THEN

      DBMS_OUTPUT.put_line ('Completed');

END; 

Friday, May 8, 2020

Update fnd_user all user passwords in clone Oracle Apps r12


DECLARE
l_unenc_pwd VARCHAR2(1000);
CURSOR c1 IS
SELECT *
FROM fnd_user fu 
WHERE fu.user_name='MOGALAFZAL'--comment this line to get all users.
;
BEGIN
FOR I IN c1 LOOP
l_unenc_pwd:=dbms_random.string('x',6);
fnd_user_pkg.UpdateUser(x_user_name=>'001C.ARNAUD@GMAIL.COM'
                       ,x_owner=>'SEED'
                       ,x_unencrypted_password=>
l_unenc_pwd--'12345'
                       ,x_password_date=>to_date('2', 'J')
                       ,x_user_guid=>I.user_GUID
                       );
COMMIT;                      
END LOOP;                                           
END;


Other useful random:
select TRUNC(DBMS_RANDOM.value(1,10)) from dual;

Positive Integers:
select abs(dbms_random.random) from dual --> for updating mobile number, EID