Search This Blog

Sunday, December 10, 2023

Apps R12 AP Payments for Pre-payments

step1: validate all invoices using conc program 'Invoice Validation'

step2: initialize 


begin

fnd_global.apps_initialize(1170,50977,200);

mo_global.init ('S');

end;


step3:   


DECLARE

    -- Declarations

    l_P_API_VERSION             NUMBER;

    l_P_INIT_MSG_LIST           VARCHAR2 (32767);

    l_P_INVOICE_ID              NUMBER;

    l_P_PAYMENT_TYPE_FLAG       VARCHAR2 (32767);

    l_P_INTERNAL_BANK_ACCT_ID   NUMBER;

    l_P_PAYMENT_METHOD_CODE     VARCHAR2 (32767);

    l_P_PAYMENT_PROFILE_ID      NUMBER;

    l_P_PAYMENT_DOCUMENT_ID     NUMBER;

    l_P_CHECK_DATE              DATE;

    l_P_DOC_CATEGORY_CODE       VARCHAR2 (32767);

    l_P_EXCHANGE_RATE_TYPE      VARCHAR2 (32767);

    l_P_EXCHANGE_RATE           NUMBER;

    l_P_EXCHANGE_DATE           DATE;

    l_RETURN_STATUS           VARCHAR2 (32767);

    l_MSG_COUNT               NUMBER;

    l_MSG_DATA                VARCHAR2 (32767);

    lv_sqlerrm          VARCHAR2 (32767);

    l_X_ERRORIDS                APPS.IBY_DISBURSE_SINGLE_PMT_PKG.TRXNERRORIDSTAB;

    L_GL_DATE DATE := TO_DATE('30-SEP-2023');

    LN_MSG_INDEX_OUT  VARCHAR2(240);

    

    CURSOR C1 IS

    

    SELECT INVOICE_DATE,INVOICE_NUM,INVOICE_ID ,PAYMENT_STATUS_FLAG, INVOICE_CURRENCY_CODE, PAYMENT_METHOD_CODE,VENDOR_NUMBER--, INVOICE_NUM

FROM AP_INVOICES_V WHERE 

--INVOICE_NUM IN( '563693','566156','563027')AND 

INVOICE_TYPE= 'Prepayment'AND 

ORG_ID = 121

--AND INVOICE_ID = 47133

AND PAYMENT_STATUS_FLAG = 'N'

AND GL_DATE  = TO_DATE('30-SEP-2023')

AND CREATION_DATE LIKE SYSDATE

--AND INVOICE_ID = 42461

--AND INVOICE_CURRENCY_CODE <> 'AED'

----AND INVOICE_ID IN (14641)--551661

------,14350

--)

--AND APPROVAL_STATUS  = 'Available'

;


BEGIN

DBMS_OUTPUT.ENABLE(1000000);       -- Clear DBMS_OUTPUT buffer.

FOR I IN C1 LOOP

    -- Initialization

    l_P_API_VERSION := NULL;

    l_P_INIT_MSG_LIST := NULL;

    l_P_INVOICE_ID := NULL;

    l_P_PAYMENT_TYPE_FLAG := 'Q';

    l_P_INTERNAL_BANK_ACCT_ID := NULL;

    l_P_PAYMENT_METHOD_CODE := I.PAYMENT_METHOD_CODE;

    l_P_PAYMENT_PROFILE_ID := 144;

    l_P_PAYMENT_DOCUMENT_ID := NULL;

    l_P_CHECK_DATE := L_GL_DATE;

    l_P_DOC_CATEGORY_CODE := NULL;

    l_P_EXCHANGE_RATE_TYPE := NULL;

    l_P_EXCHANGE_RATE := NULL;

    l_P_EXCHANGE_DATE := L_GL_DATE;

    

    BEGIN

     APPS.XXAP_PAY_SINGLE_INVOICE_PKG.AP_PAY_INVOICE_IN_FULL  (

            p_api_version           => 1.0,

            p_init_msg_list         => fnd_api.g_true,

            p_invoice_id            => I.INVOICE_ID,

            p_payment_type_flag     => 'Q', --'A'

            p_internal_bank_acct_id => 16000,--10080,--l_bank_account_id, SELECT   bank_account_id,BAnk_ACCOUNT_NAME FROM   ce_bank_accounts    WHERE   bank_account_name like '%Temperory Account';

            p_payment_method_code   => I.PAYMENT_METHOD_CODE,--l_payment_method_code,

            p_payment_profile_id    => 144,--l_payment_profile_id,

            p_payment_document_id   => null,

            p_take_discount         => 'N',

            p_check_date            => L_GL_DATE,

            p_doc_category_code     => null,

            p_exchange_rate_type    => 'Corporate',

            p_exchange_rate         => null,

            p_exchange_date         => L_GL_DATE,

            x_return_status         => l_return_status,

            x_msg_count             => l_msg_count,

            x_msg_data              => l_msg_data,

            x_errorids              => l_X_ERRORIDS

        );

          IF l_return_status = fnd_api.g_ret_sts_error OR

        l_return_status = fnd_api.g_ret_sts_unexp_error THEN


        dbms_output.put_line('FND_MSG_PUB.Count_Msg ');

        dbms_output.put_line(l_return_status||':'||sqlerrm);            

            

              FOR l_msg_count IN 1..FND_MSG_PUB.Count_Msg

      LOOP

      FND_MSG_PUB.Get(p_msg_index     => l_msg_count

                     ,p_encoded       => 'F'

                     ,p_data          => l_msg_data

                     ,p_msg_index_OUT => ln_msg_index_out

                     );

       lv_sqlerrm   := SUBSTR(lv_sqlerrm||REPLACE(l_msg_data,CHR(10),''),1,3998);

--       W_Status := 'E';

--       W_Message := lv_sqlerrm;

       dbms_output.put_line(l_return_status||':'||lv_sqlerrm);

     END LOOP;

    FND_MSG_PUB.Delete_Msg; 

 END IF;

        EXCEPTION WHEN OTHERS THEN

        DBMS_OUTPUT.PUT_LINE(SQLERRM);

        END;


--    -- Call

--    APPS.XXAP_PAY_SINGLE_INVOICE_PKG.AP_PAY_INVOICE_IN_FULL (

--        P_API_VERSION             => l_P_API_VERSION,

--        P_INIT_MSG_LIST           => l_P_INIT_MSG_LIST,

--        P_INVOICE_ID              => l_P_INVOICE_ID,

--        P_PAYMENT_TYPE_FLAG       => l_P_PAYMENT_TYPE_FLAG,

--        P_INTERNAL_BANK_ACCT_ID   => l_P_INTERNAL_BANK_ACCT_ID,

--        P_PAYMENT_METHOD_CODE     => l_P_PAYMENT_METHOD_CODE,

--        P_PAYMENT_PROFILE_ID      => l_P_PAYMENT_PROFILE_ID,

--        P_PAYMENT_DOCUMENT_ID     => l_P_PAYMENT_DOCUMENT_ID,

--        P_CHECK_DATE              => l_P_CHECK_DATE,

--        P_DOC_CATEGORY_CODE       => l_P_DOC_CATEGORY_CODE,

--        P_EXCHANGE_RATE_TYPE      => l_P_EXCHANGE_RATE_TYPE,

--        P_EXCHANGE_RATE           => l_P_EXCHANGE_RATE,

--        P_EXCHANGE_DATE           => l_P_EXCHANGE_DATE,

--        X_RETURN_STATUS           => l_X_RETURN_STATUS,

--        X_MSG_COUNT               => l_X_MSG_COUNT,

--        X_MSG_DATA                => l_X_MSG_DATA,

--        X_ERRORIDS                => l_X_ERRORIDS);


    -- Transaction Control

    COMMIT;

END LOOP;

    -- Output values, do not modify

     DBMS_OUTPUT.PUT_LINE( l_RETURN_STATUS);

--   DBMS_OUTPUT.PUT_LINE( l_X_MSG_COUNT);

--    DBMS_OUTPUT.PUT_LINE(l_X_MSG_DATA);

END;


COMMIT;


--SELECT   bank_account_id,BAnk_ACCOUNT_NAME FROM   ce_bank_accounts    WHERE   bank_account_name like '%SFFECO GLOBAL FZE'; --001- OD- SFFECO GLOBAL FZE


--select * from XX_AP_INVOICES_GL;

------------------------------------------------------Package------------------------------------

CREATE OR REPLACE PACKAGE APPS.XXAP_PAY_SINGLE_INVOICE_PKG AUTHID CURRENT_USER AS

/* $Header: appayins.pls 120.6 2006/02/23 02:33:14 bghose noship $ */



  PROCEDURE AP_Pay_Invoice_In_Full

    (p_api_version               IN  NUMBER,

     p_init_msg_list             IN  VARCHAR2,

     p_invoice_id                IN  NUMBER,

     p_payment_type_flag         IN  VARCHAR2,

     p_internal_bank_acct_id     IN  NUMBER,

     p_payment_method_code       IN  VARCHAR2,

     p_payment_profile_id        IN  NUMBER,

     p_payment_document_id       IN  NUMBER,

     p_take_discount             IN  VARCHAR2 DEFAULT 'Y',

     p_check_date                IN  DATE,

     p_doc_category_code         IN  VARCHAR2,

     p_exchange_rate_type        IN  VARCHAR2,

     p_exchange_rate             IN  NUMBER,

     p_exchange_date             IN  DATE,

     x_return_status             OUT  NOCOPY VARCHAR2,

     x_msg_count                 OUT  NOCOPY NUMBER,

     x_msg_data                  OUT  NOCOPY VARCHAR2,

     x_errorIds                  OUT  NOCOPY

                                 IBY_DISBURSE_SINGLE_PMT_PKG.trxnErrorIdsTab

    );


END XXAP_PAY_SINGLE_INVOICE_PKG;

---------------------------------------------------------------------------------------------

CREATE OR REPLACE PACKAGE BODY APPS.XXAP_PAY_SINGLE_INVOICE_PKG AS

/* $Header: appayinb.pls 120.15.12020000.5 2015/10/06 22:32:04 anacastr ship $ */


--

-- Declare global variables

--

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';


  PROCEDURE print_debuginfo

    (p_module IN VARCHAR2,

     p_debug_text IN VARCHAR2,

     p_debug_level IN NUMBER)

  IS


  BEGIN


    --

    -- Writing debug text to the pl/sql debug file.

    --


   -- DBMS_OUTPUT.put_line(p_module || p_debug_text);

    IF (p_debug_level >= G_CURRENT_RUNTIME_LEVEL) THEN

      fnd_log.string(p_debug_level,

                     p_module,

                     substr(RPAD(p_module,55)||' : '||

                     p_debug_text,0,150));

    END IF;


    -- if in a concurrent request, also add to the CP log

    IF fnd_global.CONC_REQUEST_ID <> -1 THEN

      FND_FILE.put_line(FND_FILE.LOG,

                        substr(RPAD(p_module,55)||' : '||

                       p_debug_text,0,150));

    END IF;


  EXCEPTION

    WHEN OTHERS THEN

      NULL;

  END print_debuginfo;


  -- Bug 2842080


  PROCEDURE AP_Pay_Invoice_In_Full

    (p_api_version               IN  NUMBER,

     p_init_msg_list             IN  VARCHAR2,

     p_invoice_id                IN  NUMBER,

     p_payment_type_flag         IN  VARCHAR2,

     p_internal_bank_acct_id     IN  NUMBER,

     p_payment_method_code       IN  VARCHAR2,

     p_payment_profile_id        IN  NUMBER,

     p_payment_document_id       IN  NUMBER,

     p_take_discount             IN  VARCHAR2 DEFAULT 'Y',

     p_check_date                IN  DATE,

     p_doc_category_code         IN  VARCHAR2,

     p_exchange_rate_type        IN  VARCHAR2,

     p_exchange_rate             IN  NUMBER,

     p_exchange_date             IN  DATE,

     x_return_status             OUT  NOCOPY VARCHAR2,

     x_msg_count                 OUT  NOCOPY NUMBER,

     x_msg_data                  OUT  NOCOPY VARCHAR2,

     x_errorIds                  OUT  NOCOPY

                                 IBY_DISBURSE_SINGLE_PMT_PKG.trxnErrorIdsTab)

  IS


    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);


    l_bank_acct_use_id     NUMBER; -- Bug 21841763

  BEGIN


    print_debuginfo(l_module_name, 'ENTER',

                    G_LEVEL_PROCEDURE);

    print_debuginfo(l_module_name, 'p_invoice_id : ' || p_invoice_id,

                    G_LEVEL_PROCEDURE);

    print_debuginfo(l_module_name, 'p_payment_type_flag: '||p_payment_type_flag,

                    G_LEVEL_PROCEDURE);

    print_debuginfo(l_module_name, 'p_internal_bank_acct_id: '||p_internal_bank_acct_id,

                    G_LEVEL_PROCEDURE);

    print_debuginfo(l_module_name, 'p_payment_method: '||p_payment_method_code,

                    G_LEVEL_PROCEDURE);

    print_debuginfo(l_module_name, 'p_payment_profile_id: '||p_payment_profile_id,

                    G_LEVEL_PROCEDURE);

    print_debuginfo(l_module_name, 'p_payment_document_id: '||p_payment_document_id,

                    G_LEVEL_PROCEDURE);

    print_debuginfo(l_module_name, 'p_take_discount: '||p_take_discount,

                    G_LEVEL_PROCEDURE);

    print_debuginfo(l_module_name, 'p_doc_category_code: '||p_doc_category_code,

                    G_LEVEL_PROCEDURE);

    print_debuginfo(l_module_name, 'p_exchange_rate_type: '||p_exchange_rate_type,

                    G_LEVEL_PROCEDURE);

    print_debuginfo(l_module_name, 'p_exchange_rate: '||to_char(p_exchange_rate),

                    G_LEVEL_PROCEDURE);

    print_debuginfo(l_module_name, 'p_exchange_date: '||p_exchange_date,

                    G_LEVEL_PROCEDURE);


    /* 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';

    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 ';

      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 ';

      print_debuginfo(l_module_name, l_debug_info,

                      G_LEVEL_PROCEDURE);


      l_debug_info := 'Select System Option based on Invoice Org Id ';

      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 ';

      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

          );


        print_debuginfo(l_module_name, 'EXIT',

                        G_LEVEL_PROCEDURE);

        l_temp_status := 'E';


    END IF;


    l_debug_info := 'Checking For Valid Internal Bank Account';

    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,

              Cbau.bank_acct_use_id -- Bug 21841763

       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,

              l_bank_acct_use_id -- Bug 21841763

       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_account_id = p_internal_bank_acct_id; /* Added for bug#12971160 */

       /*AND  CBAU.bank_acct_use_id = p_internal_bank_acct_id; Commented for bug#12971160 */


    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

            );


        print_debuginfo(l_module_name, 'EXIT',

                        G_LEVEL_PROCEDURE);

        l_temp_status := 'E';


    END;


    l_debug_info := 'Checking Exchange Rate related info';

    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

              );


           print_debuginfo(l_module_name, 'EXIT',

                           G_LEVEL_PROCEDURE);

           l_temp_status := 'E';


         ELSE

           l_check_rec.xrate_date := nvl(trunc(P_exchange_date),trunc(sysdate)); -- bug 21531246

           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

               );


             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

            );


          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

            );


          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';

      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

        );


        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';

      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

            );


          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';

      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

            );


          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

            );


          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';

      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;

            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

              );


            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';

      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

            );


          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';

      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 ';

      print_debuginfo(l_module_name, l_debug_info,

                      G_LEVEL_PROCEDURE);


--Afzal

l_maturity_date := null;

l_check_rec.status_lookup_code := 'NEGOTIABLE';


/*

      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;


--l_maturity_date Afzal

        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

            );


          print_debuginfo(l_module_name, 'EXIT',

                          G_LEVEL_PROCEDURE);

          l_temp_status := 'E';


      END;

--Afzal

*/

      -- ---------------------------------------------------------------

      -- 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);

              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);

          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);

          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);

            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);

               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';

      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';

      print_debuginfo(l_module_name, l_debug_info,

                      G_LEVEL_PROCEDURE);

      --start of the custom code An?l Altunkan

      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;

      --end of the custom code An?l Altunkan

      

      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';

      print_debuginfo(l_module_name, l_debug_info,

                   G_LEVEL_PROCEDURE);


      IF (l_Doc_Category_Code = '-1') THEN

        l_Doc_Category_Code   := NULL;

      END IF;



      AP_CHECKS_PKG.Insert_Row(

        X_Rowid                        => l_dummy_rowid,

        X_Amount                       => l_amount,

        X_Ce_Bank_Acct_Use_Id          => l_bank_acct_use_id , --p_internal_bank_acct_id, -- Bug 21841763

        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,

        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';

      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;

      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

      );


      -- l_accounting_event_id is IN parameter and is populated with

      -- NULL in AIP. to Avoid this getting accounting_event_id from APH

      -- Bug 19047932


       l_debug_info := 'Getting accounting_event_id value for AIP';

      print_debuginfo(l_module_name, l_debug_info,

                      G_LEVEL_PROCEDURE);


       select accounting_event_id into l_accounting_event_id

          from ap_payment_history_all

              where check_id = l_check_rec.check_id

              and transaction_type = l_transaction_type;



      -- 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';

      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';

     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 <> 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


  EXCEPTION


    WHEN OTHERS THEN

      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

            );

      print_debuginfo(l_module_name, 'SQLCODE: ' || SQLCODE,

                         G_LEVEL_PROCEDURE);

      print_debuginfo(l_module_name, 'SQLERRM: ' || SQLERRM,

                         G_LEVEL_PROCEDURE);


      x_return_status := FND_API.G_RET_STS_UNEXP_ERROR;

      print_debuginfo(l_module_name, 'EXIT',

                         G_LEVEL_PROCEDURE);


      RETURN;

END AP_Pay_Invoice_In_Full;



END XXAP_PAY_SINGLE_INVOICE_PKG;


/

No comments:

Post a Comment