AP发票批量付款程序(WEB ADI)

CREATE OR REPLACE PACKAGE MEW_AP_BATCH_PAYMENTS_PKG IS

  PROCEDURE MAIN(P_BATCH_ID          NUMBER
                ,P_ORG_ID            NUMBER
                ,P_BANK_ACCOUNT_NAME VARCHAR2
                ,P_CHECK_STOCK_NAME  VARCHAR2
                ,P_CHECK_DATE        DATE
                ,P_CURRENCY_CODE     VARCHAR2
                ,P_INVOICE_NUM       VARCHAR2
                ,P_AMOUNT            NUMBER
                ,P_VENDOR_NUM        VARCHAR2
                ,P_VENDOR_SITE_CODE  VARCHAR2
                ,P_ATTRIBUTE1        VARCHAR2 DEFAULT NULL
                ,P_ATTRIBUTE2        VARCHAR2 DEFAULT NULL
                ,P_ATTRIBUTE3        DATE DEFAULT NULL
                ,P_ATTRIBUTE4        VARCHAR2 DEFAULT NULL
                ,P_ATTRIBUTE5        VARCHAR2 DEFAULT NULL
                ,P_ATTRIBUTE6        VARCHAR2 DEFAULT NULL
                ,P_ATTRIBUTE7        VARCHAR2 DEFAULT NULL
                ,P_ATTRIBUTE8        VARCHAR2 DEFAULT NULL
                ,P_ATTRIBUTE9        VARCHAR2 DEFAULT NULL
                ,P_ATTRIBUTE10       VARCHAR2 DEFAULT NULL
                ,P_ATTRIBUTE11       VARCHAR2 DEFAULT NULL
                ,P_ATTRIBUTE12       VARCHAR2 DEFAULT NULL
                ,P_ATTRIBUTE13       VARCHAR2 DEFAULT NULL
                ,P_ATTRIBUTE14       VARCHAR2 DEFAULT NULL
                ,P_ATTRIBUTE15       VARCHAR2 DEFAULT NULL);

  ---WEBADI API程序错误信息抛出程序
  PROCEDURE MEW_PUT_ERROR_P(P_ERROR_MSG IN VARCHAR2);

  PROCEDURE SP_AP_ACCOUNTING_11I10(P_CHECK_ID NUMBER);

  --  --创建分录过程
  PROCEDURE ZJ_11I_BATCH_ACCOUNT(P_ORG_ID IN NUMBER);
  --批量付款程序
  PROCEDURE BATCH_PAYMENTS_SUB_PRC(RETCODE                     OUT NUMBER
                                  ,ERRBUF                      OUT VARCHAR2
                                  ,P_BATCH_ID                  NUMBER
                                  ,P_PAYMENT_TYPE              VARCHAR2
                                  ,P_CREATE_JOURNAL_ENTRY_FLAG VARCHAR2);

END;
/
CREATE OR REPLACE PACKAGE BODY MEW_AP_BATCH_PAYMENTS_PKG IS
  /*===============================================
    copyright (c) sie business consulting services
                allrights reserved
  *================================================
  *================================================
  *   program name:
  *                MEW_AP_BATCH_PAYMENTS_PKG
  *   description:
  *                发票付款批量导入
  *   history:
  *   1.00   2011-01-06   sie_chenyueyong  creation
  *===============================================*/
  CNT                          NUMBER := 0;
  V_BANK_ACCOUNT_ID            NUMBER;
  V_CHECK_STOCK_ID             NUMBER;
  V_CHECK_FORMAT_ID            NUMBER;
  V_SET_OF_BOOKS_ID            NUMBER;
  V_PERIOD_NAME                VARCHAR2(20);
  V_VENDOR_ID                  NUMBER;
  V_VENDOR_SITE_ID             NUMBER;
  V_CURRENCY_CODE              VARCHAR2(20);
  V_INVOICE_ID                 NUMBER;
  V_AMOUNT_REMAINING           NUMBER;
  V_CHECK_ID                   NUMBER;
  V_INVOICE_PAYMENT_ID         NUMBER;
  V_ACCTS_CODE_COMBINATION_ID  NUMBER;
  V_DOC_CATEGORY_CODE          VARCHAR2(30);
  V_DOC_SEQUENCE_ID            NUMBER;
  V_DB_SEQUENCE_NAME           VARCHAR2(30);
  V_DOC_SEQUENCE_ASSIGNMENT_ID NUMBER;
  V_DB_STR                     VARCHAR2(2000);
  V_DOC_SEQUENCE_VALUE         VARCHAR2(30);
  V_PAYMENT_METHOD_LOOKUP_CODE VARCHAR2(30);
  V_ROWID                      VARCHAR2(50);
  V_CHECK_NUMBER               VARCHAR2(30);
  V_COUNTRY                    VARCHAR2(150);
  V_CITY                       VARCHAR2(150);
  V_PROVINCE                   VARCHAR2(150);
  V_STATE                      VARCHAR2(150);
  V_COUNTY                     VARCHAR2(150);
  V_ZIP                        VARCHAR2(150);
  V_ADDRESS_LINE1              VARCHAR2(150);
  V_ADDRESS_LINE2              VARCHAR2(150);
  V_ADDRESS_LINE3              VARCHAR2(150);
  V_ADDRESS_LINE4              VARCHAR2(150);
  V_BANK_ACCOUNT_NUM           VARCHAR2(30);
  V_BANK_ACCOUNT_TYPE          VARCHAR2(30);
  V_VENDOR_NAME                VARCHAR2(240);
  L_SESSION_ID                 NUMBER;
  V_CHECK_DATE                 DATE;
  V_ORG_ID                     NUMBER;
  V_CURRENT_BATCH_AMOUNT       NUMBER;
  V_BASE_CURRENCY_CODE         VARCHAR2(10);
  V_EXCHANGE_RATE              NUMBER;

  PROCEDURE MAIN(P_BATCH_ID          NUMBER
                ,P_ORG_ID            NUMBER
                ,P_BANK_ACCOUNT_NAME VARCHAR2
                ,P_CHECK_STOCK_NAME  VARCHAR2
                ,P_CHECK_DATE        DATE
                ,P_CURRENCY_CODE     VARCHAR2
                ,P_INVOICE_NUM       VARCHAR2
                ,P_AMOUNT            NUMBER
                ,P_VENDOR_NUM        VARCHAR2
                ,P_VENDOR_SITE_CODE  VARCHAR2
                ,P_ATTRIBUTE1        VARCHAR2 DEFAULT NULL --汇率类型
                ,P_ATTRIBUTE2        VARCHAR2 DEFAULT NULL --汇率值 
                ,P_ATTRIBUTE3        DATE DEFAULT NULL --汇率日期
                ,P_ATTRIBUTE4        VARCHAR2 DEFAULT NULL
                ,P_ATTRIBUTE5        VARCHAR2 DEFAULT NULL
                ,P_ATTRIBUTE6        VARCHAR2 DEFAULT NULL
                ,P_ATTRIBUTE7        VARCHAR2 DEFAULT NULL
                ,P_ATTRIBUTE8        VARCHAR2 DEFAULT NULL
                ,P_ATTRIBUTE9        VARCHAR2 DEFAULT NULL
                ,P_ATTRIBUTE10       VARCHAR2 DEFAULT NULL
                ,P_ATTRIBUTE11       VARCHAR2 DEFAULT NULL
                ,P_ATTRIBUTE12       VARCHAR2 DEFAULT NULL
                ,P_ATTRIBUTE13       VARCHAR2 DEFAULT NULL
                ,P_ATTRIBUTE14       VARCHAR2 DEFAULT NULL
                ,P_ATTRIBUTE15       VARCHAR2 DEFAULT NULL) IS
    V_CANCELLED_DATE         DATE;
    V_PAYMENT_STATUS_FLAG    VARCHAR2(1);
    V_WFAPPROVAL_STATUS      VARCHAR2(30);
    V_HOLD_FLAG              VARCHAR2(1);
    V_CHECKRUN_ID            NUMBER;
    V_PURCH_ENCUMBRANCE_FLAG VARCHAR2(1);
    CNT1                     NUMBER;
  BEGIN
    /*    V_CHECK_DATE := TO_DATE('2010-08-26'
    ,'YYYY-MM-DD');*/
    ---初始化环境
    /*    APPS.FND_GLOBAL.INITIALIZE(SESSION_ID            => L_SESSION_ID
    ,USER_ID               => 1027
    ,RESP_ID               => 51385
    ,RESP_APPL_ID          => 200
    ,SECURITY_GROUP_ID     => 0
    ,SITE_ID               => NULL
    ,LOGIN_ID              => 18376457
    ,CONC_LOGIN_ID         => NULL
    ,PROG_APPL_ID          => NULL
    ,CONC_PROGRAM_ID       => NULL
    ,CONC_REQUEST_ID       => NULL
    ,CONC_PRIORITY_REQUEST => NULL
    ,FORM_ID               => NULL
    ,FORM_APPL_ID          => NULL
    ,CONC_PROCESS_ID       => NULL
    ,CONC_QUEUE_ID         => NULL
    ,QUEUE_APPL_ID         => NULL
    ,SERVER_ID             => NULL);*/
    --判断组织ID有效性
    IF P_ORG_ID IS NULL
    THEN
      MEW_PUT_ERROR_P('组织ID不能为空');
    ELSE
      SELECT COUNT(*)
        INTO CNT
        FROM HR_OPERATING_UNITS HOU
       WHERE HOU.ORGANIZATION_ID = P_ORG_ID;
    
      IF NVL(CNT
            ,0) = 0
      THEN
        MEW_PUT_ERROR_P('组织ID不存在');
      END IF;
    
      SELECT SET_OF_BOOKS_ID
        INTO V_SET_OF_BOOKS_ID
        FROM HR_OPERATING_UNITS HOU
       WHERE HOU.ORGANIZATION_ID = P_ORG_ID;
    
      SELECT CURRENCY_CODE
        INTO V_BASE_CURRENCY_CODE
        FROM GL_SETS_OF_BOOKS SOB
       WHERE SOB.SET_OF_BOOKS_ID = V_SET_OF_BOOKS_ID;
    
    END IF;
    --判断银行账户有效性
    IF P_BANK_ACCOUNT_NAME IS NULL
    THEN
      MEW_PUT_ERROR_P('银行账户名称不能为空');
    ELSE
      BEGIN
        SELECT ABA.BANK_ACCOUNT_ID
              ,ABA.BANK_ACCOUNT_NUM
              ,ABA.BANK_ACCOUNT_TYPE
          INTO V_BANK_ACCOUNT_ID
              ,V_BANK_ACCOUNT_NUM
              ,V_BANK_ACCOUNT_TYPE
          FROM AP_BANK_ACCOUNTS_ALL ABA
         WHERE ABA.ORG_ID = P_ORG_ID
           AND ABA.BANK_ACCOUNT_NAME = P_BANK_ACCOUNT_NAME
           AND ABA.CURRENCY_CODE = P_CURRENCY_CODE;
      EXCEPTION
        WHEN NO_DATA_FOUND THEN
          MEW_PUT_ERROR_P('银行账户名称在系统中不存在');
        WHEN TOO_MANY_ROWS THEN
          MEW_PUT_ERROR_P('获取银行账户ID发生例外' || SUBSTR(SQLCODE
                                                  ,1
                                                  ,20));
      END;
    END IF;
  
    --判断付款单据名称有效性
    IF P_CHECK_STOCK_NAME IS NULL
    THEN
      MEW_PUT_ERROR_P('付款单据名称不能为空');
    ELSE
      BEGIN
        SELECT ACA.CHECK_STOCK_ID
              ,ACA.CHECK_FORMAT_ID
              ,ACA.DOC_CATEGORY_CODE
              ,ACF.PAYMENT_METHOD_LOOKUP_CODE
          INTO V_CHECK_STOCK_ID
              ,V_CHECK_FORMAT_ID
              ,V_DOC_CATEGORY_CODE
              ,V_PAYMENT_METHOD_LOOKUP_CODE
          FROM AP_CHECK_STOCKS_ALL ACA
              ,AP_CHECK_FORMATS    ACF
         WHERE ACF.CHECK_FORMAT_ID = ACA.CHECK_FORMAT_ID
           AND NVL(ACA.INACTIVE_DATE
                  ,SYSDATE) >= SYSDATE
           AND ACA.NAME = P_CHECK_STOCK_NAME
           AND ACA.BANK_ACCOUNT_ID = V_BANK_ACCOUNT_ID;
      EXCEPTION
        WHEN NO_DATA_FOUND THEN
          MEW_PUT_ERROR_P('付款单据名称不存在,请检查');
      END;
    END IF;
  
    IF P_CHECK_DATE IS NULL
    THEN
      MEW_PUT_ERROR_P('付款日期不能为空');
    ELSE
      BEGIN
        SELECT GPS.PERIOD_NAME
          INTO V_PERIOD_NAME
          FROM GL_PERIOD_STATUSES GPS
              ,FND_APPLICATION    FA
         WHERE GPS.SET_OF_BOOKS_ID = V_SET_OF_BOOKS_ID
           AND GPS.APPLICATION_ID = FA.APPLICATION_ID
           AND GPS.CLOSING_STATUS = 'O'
           AND FA.APPLICATION_SHORT_NAME = 'SQLAP'
           AND TRUNC(P_CHECK_DATE) BETWEEN GPS.START_DATE AND GPS.END_DATE;
      EXCEPTION
        WHEN NO_DATA_FOUND THEN
          MEW_PUT_ERROR_P('付款日期所在的会计期未打开');
      END;
    END IF;
  
    IF P_VENDOR_NUM IS NULL
    THEN
      MEW_PUT_ERROR_P('供应商编号不能为空');
    ELSE
      BEGIN
        SELECT VENDOR_ID
              ,PV.VENDOR_NAME
          INTO V_VENDOR_ID
              ,V_VENDOR_NAME
          FROM PO_VENDORS PV
         WHERE PV.SEGMENT1 = P_VENDOR_NUM
           AND SYSDATE BETWEEN PV.START_DATE_ACTIVE AND
               NVL(PV.END_DATE_ACTIVE
                  ,SYSDATE);
      EXCEPTION
        WHEN OTHERS THEN
          MEW_PUT_ERROR_P('供应商编号不存在');
      END;
    END IF;
  
    IF P_VENDOR_SITE_CODE IS NULL
    THEN
      MEW_PUT_ERROR_P('供应商地点不能为空');
    ELSE
      BEGIN
        SELECT VENDOR_SITE_ID
              ,PVSA.COUNTRY
              ,PVSA.CITY
              ,PVSA.PROVINCE
              ,PVSA.STATE
              ,PVSA.COUNTY
              ,PVSA.ZIP
              ,PVSA.ADDRESS_LINE1
              ,PVSA.ADDRESS_LINE2
              ,PVSA.ADDRESS_LINE3
              ,PVSA.ADDRESS_LINE4
          INTO V_VENDOR_SITE_ID
              ,V_COUNTRY
              ,V_CITY
              ,V_PROVINCE
              ,V_STATE
              ,V_COUNTY
              ,V_ZIP
              ,V_ADDRESS_LINE1
              ,V_ADDRESS_LINE2
              ,V_ADDRESS_LINE3
              ,V_ADDRESS_LINE4
          FROM PO_VENDOR_SITES_ALL PVSA
         WHERE PVSA.VENDOR_ID = V_VENDOR_ID
           AND PVSA.VENDOR_SITE_CODE = P_VENDOR_SITE_CODE
           AND PVSA.ORG_ID = P_ORG_ID;
      EXCEPTION
        WHEN OTHERS THEN
          MEW_PUT_ERROR_P('供应商地点不存在');
      END;
    END IF;
  
    IF P_CURRENCY_CODE IS NULL
    THEN
      MEW_PUT_ERROR_P('付款币别不能为空');
    END IF;
  
    IF P_INVOICE_NUM IS NULL
    THEN
      MEW_PUT_ERROR_P('发票编号不能为空');
    ELSE
      BEGIN
        SELECT AIA.INVOICE_ID
              ,AIA.INVOICE_CURRENCY_CODE
              ,AIA.ACCTS_PAY_CODE_COMBINATION_ID
              ,AIA.CANCELLED_DATE
              ,AIA.PAYMENT_STATUS_FLAG
              ,AIA.WFAPPROVAL_STATUS
          INTO V_INVOICE_ID
              ,V_CURRENCY_CODE
              ,V_ACCTS_CODE_COMBINATION_ID
              ,V_CANCELLED_DATE
              ,V_PAYMENT_STATUS_FLAG
              ,V_WFAPPROVAL_STATUS
          FROM AP_INVOICES_ALL AIA
         WHERE AIA.INVOICE_NUM = P_INVOICE_NUM
           AND AIA.VENDOR_ID = V_VENDOR_ID
           AND AIA.VENDOR_SITE_ID = V_VENDOR_SITE_ID
           AND AIA.INVOICE_CURRENCY_CODE = P_CURRENCY_CODE;
      
        IF V_CANCELLED_DATE IS NOT NULL
        THEN
          APP_EXCEPTION.RAISE_EXCEPTION('发票已取消,不能执行付款');
        END IF;
      
        IF V_PAYMENT_STATUS_FLAG NOT IN ('P'
                                        ,'N')
        THEN
          APP_EXCEPTION.RAISE_EXCEPTION('发票付款状态为' || V_PAYMENT_STATUS_FLAG ||
                                        '不能执行付款');
        END IF;
        IF V_WFAPPROVAL_STATUS NOT IN
           ('WFAPPROVED'
           ,'NOT REQUIRED'
           ,'MANUALLY APPROVED')
        THEN
          APP_EXCEPTION.RAISE_EXCEPTION('发票未审批,不能执行付款');
        END IF;
      
        SELECT APA.HOLD_FLAG
              ,APA.CHECKRUN_ID
          INTO V_HOLD_FLAG
              ,V_CHECKRUN_ID
          FROM AP_PAYMENT_SCHEDULES_ALL APA
         WHERE APA.INVOICE_ID = V_INVOICE_ID
           AND ROWNUM = 1; -- add by zhuhailong
      
        IF NVL(V_HOLD_FLAG
              ,'N') <> 'N'
        THEN
          APP_EXCEPTION.RAISE_EXCEPTION('发票被HOLD,不能执行付款');
        END IF;
      
        IF V_CHECKRUN_ID IS NOT NULL
        THEN
          APP_EXCEPTION.RAISE_EXCEPTION('发票已执行付款');
        END IF;
      
        SELECT COUNT(*)
          INTO CNT
          FROM AP_HOLDS AH
         WHERE AH.INVOICE_ID = V_INVOICE_ID
           AND AH.RELEASE_LOOKUP_CODE IS NULL;
        IF NVL(CNT
              ,0) > 0
        THEN
          APP_EXCEPTION.RAISE_EXCEPTION('发票被HOLD,不能执行付款');
        END IF;
        SELECT COUNT(*)
          INTO CNT
          FROM AP_INVOICE_DISTRIBUTIONS D
         WHERE D.INVOICE_ID = V_INVOICE_ID;
        IF NVL(CNT
              ,0) = 0
        THEN
          APP_EXCEPTION.RAISE_EXCEPTION('发票没有分配行,不能执行付款');
        END IF;
      
        SELECT FSP.PURCH_ENCUMBRANCE_FLAG
          INTO V_PURCH_ENCUMBRANCE_FLAG
          FROM FINANCIALS_SYSTEM_PARAMS_ALL FSP
         WHERE FSP.ORG_ID = P_ORG_ID;
      
        SELECT COUNT(*)
          INTO CNT
          FROM AP_INVOICE_DISTRIBUTIONS D2
         WHERE D2.INVOICE_ID = V_INVOICE_ID
           AND NVL(D2.MATCH_STATUS_FLAG
                  ,'N') IN ('N'
                           ,'S');
        /*     IF NVL(CNT
              ,0) = 0 AND
           V_PURCH_ENCUMBRANCE_FLAG = 'N'
        THEN
          NULL;
        ELSE
          APP_EXCEPTION.RAISE_EXCEPTION('发票不符合付款条件');
        END IF;*/
      
        SELECT COUNT(*)
          INTO CNT1
          FROM AP_INVOICE_DISTRIBUTIONS D3
         WHERE D3.INVOICE_ID = V_INVOICE_ID
           AND NVL(D3.MATCH_STATUS_FLAG
                  ,'N') <> 'A';
        IF (NVL(CNT1
               ,0) = 0 AND V_PURCH_ENCUMBRANCE_FLAG = 'Y') OR
           (NVL(CNT
               ,0) = 0 AND V_PURCH_ENCUMBRANCE_FLAG = 'N')
        THEN
          NULL;
        ELSE
          APP_EXCEPTION.RAISE_EXCEPTION('发票不符合付款条件');
        END IF;
      EXCEPTION
        WHEN NO_DATA_FOUND THEN
          -- MEW_PUT_ERROR_P('发票编号(发票的币别/供应商编号/供应商地点等于当前币别/供应商编号/供应商地点)不存在');
          MEW_PUT_ERROR_P('发票编号不存在');
        
        --APP_EXCEPTION.RAISE_EXCEPTION(SQLERRM);
      END;
    
    END IF;
  
    IF P_CURRENCY_CODE <> V_CURRENCY_CODE
    THEN
      MEW_PUT_ERROR_P('付款币别与发票币别不一致');
    END IF;
  
    IF NVL(P_AMOUNT
          ,0) = 0
    THEN
      MEW_PUT_ERROR_P('付款金额不能为空或等于零');
    ELSE
      SELECT AIA.INVOICE_AMOUNT - NVL(AIA.AMOUNT_PAID
                                     ,0)
        INTO V_AMOUNT_REMAINING
        FROM AP_INVOICES_ALL AIA
       WHERE AIA.INVOICE_ID = V_INVOICE_ID;
    
      SELECT NVL(SUM(MAIP.AMOUNT)
                ,0)
        INTO V_CURRENT_BATCH_AMOUNT
        FROM MEW_AP_INVOICE_PAYMENTS MAIP
       WHERE MAIP.INVOICE_ID = V_INVOICE_ID;
    
      IF P_AMOUNT > V_AMOUNT_REMAINING - V_CURRENT_BATCH_AMOUNT
      THEN
        MEW_PUT_ERROR_P('付款金额大于发票余额');
      END IF;
    END IF;
  
    IF P_CURRENCY_CODE <> V_BASE_CURRENCY_CODE
    THEN
      IF P_ATTRIBUTE1 IS NULL
      THEN
        MEW_PUT_ERROR_P('当前币别是外币,汇率类型不能为空');
      ELSE
        IF P_ATTRIBUTE3 IS NULL --汇率日期
        THEN
          APP_EXCEPTION.RAISE_EXCEPTION('汇率日期不能为空!');
        ELSE
          IF P_ATTRIBUTE1 = 'User' --用户汇率为USER
          THEN
            IF P_ATTRIBUTE2 IS NULL
            THEN
              APP_EXCEPTION.RAISE_EXCEPTION('汇率不能为空');
            ELSE
              V_EXCHANGE_RATE := P_ATTRIBUTE2;
            END IF;
          ELSE
            BEGIN
              SELECT GDV.SHOW_CONVERSION_RATE
                INTO V_EXCHANGE_RATE
                FROM GL_DAILY_RATES_V GDV
               WHERE GDV.FROM_CURRENCY = P_CURRENCY_CODE
                 AND GDV.TO_CURRENCY = V_BASE_CURRENCY_CODE
                 AND GDV.CONVERSION_DATE = TRUNC(P_ATTRIBUTE3)
                 AND GDV.USER_CONVERSION_TYPE = P_ATTRIBUTE1;
            EXCEPTION
              WHEN NO_DATA_FOUND THEN
                MEW_PUT_ERROR_P('汇率类型不存在或汇率日期不存在当前汇率类型的汇率');
            END;
          END IF;
        END IF;
      END IF;
    
    END IF;
    INSERT INTO MEW_AP_INVOICE_PAYMENTS
      SELECT P_BATCH_ID
            ,P_BANK_ACCOUNT_NAME
            ,P_CHECK_STOCK_NAME
            ,P_CHECK_DATE
            ,P_CURRENCY_CODE
            ,P_INVOICE_NUM
            ,P_AMOUNT
            ,P_VENDOR_NUM
            ,P_VENDOR_SITE_CODE
            ,P_ATTRIBUTE1 --汇率类型
            ,V_EXCHANGE_RATE --汇率
            ,P_ATTRIBUTE3 --汇率日期
            ,P_ATTRIBUTE4
            ,P_ATTRIBUTE5
            ,P_ATTRIBUTE6
            ,P_ATTRIBUTE7
            ,P_ATTRIBUTE8
            ,P_ATTRIBUTE9
            ,P_ATTRIBUTE10
            ,P_ATTRIBUTE11
            ,P_ATTRIBUTE12
            ,P_ATTRIBUTE13
            ,P_ATTRIBUTE14
            ,P_ATTRIBUTE15
            ,SYSDATE
            ,FND_GLOBAL.USER_ID
            ,SYSDATE
            ,FND_GLOBAL.USER_ID
            ,NULL
            ,P_ORG_ID
            ,V_SET_OF_BOOKS_ID
            ,V_BANK_ACCOUNT_ID
            ,V_BANK_ACCOUNT_NUM
            ,V_BANK_ACCOUNT_TYPE
            ,V_CHECK_STOCK_ID
            ,V_CHECK_FORMAT_ID
            ,V_DOC_CATEGORY_CODE
            ,V_PAYMENT_METHOD_LOOKUP_CODE
            ,V_PERIOD_NAME
            ,V_VENDOR_ID
            ,V_VENDOR_NAME
            ,V_VENDOR_SITE_ID
            ,V_COUNTRY
            ,V_CITY
            ,V_PROVINCE
            ,V_STATE
            ,V_COUNTY
            ,V_ZIP
            ,V_ADDRESS_LINE1
            ,V_ADDRESS_LINE2
            ,V_ADDRESS_LINE3
            ,V_ADDRESS_LINE4
            ,V_INVOICE_ID
        FROM DUAL;
  
  END;

  PROCEDURE SP_AP_ACCOUNTING_11I10(P_CHECK_ID NUMBER) IS
    V_ACCOUNT_EVENT_ID NUMBER(15);
  BEGIN
    SELECT AP.AP_ACCOUNTING_EVENTS_S.NEXTVAL
      INTO V_ACCOUNT_EVENT_ID
      FROM DUAL;
  
    UPDATE AP.AP_INVOICE_PAYMENTS_ALL AIP
       SET AIP.ACCOUNTING_EVENT_ID = V_ACCOUNT_EVENT_ID
          ,AIP.ACCRUAL_POSTED_FLAG = 'N'
          ,AIP.CASH_POSTED_FLAG    = 'N'
          ,AIP.POSTED_FLAG         = 'N'
     WHERE AIP.CHECK_ID = P_CHECK_ID;
  
    INSERT INTO AP.AP_ACCOUNTING_EVENTS_ALL
      (ACCOUNTING_EVENT_ID
      ,EVENT_TYPE_CODE
      ,ACCOUNTING_DATE
      ,EVENT_NUMBER
      ,EVENT_STATUS_CODE
      ,SOURCE_TABLE
      ,SOURCE_ID
      ,CREATION_DATE
      ,CREATED_BY
      ,LAST_UPDATE_DATE
      ,LAST_UPDATED_BY
      ,LAST_UPDATE_LOGIN
      ,ORG_ID)
      SELECT V_ACCOUNT_EVENT_ID
            ,'PAYMENT'
            ,AC.CHECK_DATE
            ,1
            ,'CREATED'
            ,'AP_CHECKS'
            ,AC.CHECK_ID
            ,SYSDATE
            ,-99
            ,SYSDATE
            ,-99
            ,-1
            ,AC.ORG_ID
        FROM AP.AP_CHECKS_ALL AC
       WHERE AC.CHECK_ID = P_CHECK_ID;
  END SP_AP_ACCOUNTING_11I10;
  ---WEBADI API程序错误信息抛出程序
  PROCEDURE MEW_PUT_ERROR_P(P_ERROR_MSG IN VARCHAR2) IS
  BEGIN
    FND_MESSAGE.SET_NAME(APPLICATION => 'PER'
                        ,NAME        => 'MEW_WEB_ADI_MSG');
  
    FND_MESSAGE.SET_TOKEN(TOKEN => 'ERROR_MSG'
                         ,VALUE => P_ERROR_MSG);
    FND_MESSAGE.RAISE_ERROR;
  END MEW_PUT_ERROR_P;
  PROCEDURE ZJ_11I_BATCH_ACCOUNT(P_ORG_ID IN NUMBER) IS
  
    V_REQUEST_ID NUMBER;
    ERRBUF       VARCHAR2(1000);
  BEGIN
  
    /*    BEGIN
      V_REQUEST_ID := NULL;
      --调用标准提交请求过程,提交创建会计分录的请求
      V_REQUEST_ID := FND_REQUEST.SUBMIT_REQUEST(APPLICATION => 'SQLAP'
                                                ,PROGRAM     => 'APACCENG'
                                                ,DESCRIPTION => '创建发票会计分录'
                                                ,START_TIME  => TO_CHAR(SYSDATE
                                                                       ,'dd-mon-yy hh:mi:ss')
                                                ,SUB_REQUEST => FALSE
                                                ,ARGUMENT1   => NULL
                                                , --Start Date
                                                 ARGUMENT2   => NULL
                                                , --End Date
                                                 ARGUMENT3   => 'Invoices'
                                                , --Journal Category
                                                 ARGUMENT4   => 'N'
                                                , --Submit Transfer to GL
                                                 ARGUMENT5   => 'N'
                                                , --Submit Journal Import
                                                 ARGUMENT6   => 'Y'
                                                , --Validate Accounts
                                                 ARGUMENT7   => 'N'
                                                , --Summarize Report
                                                 ARGUMENT8   => TO_CHAR(50)
                                                , --Commit Cycle
                                                 ARGUMENT9   => TO_CHAR(P_ORG_ID)
                                                , --org_id
                                                 ARGUMENT10  => 'N'
                                                , --Debug
                                                 ARGUMENT11  => NULL
                                                , --Invoice Batch ID
                                                 ARGUMENT12  => NULL
                                                , --Payment Batch Name
                                                 ARGUMENT13  => 'N' --Trace Option
                                                ,ARGUMENT14  => 'Y' --Run Accounting Report
                                                 );
      IF NVL(V_REQUEST_ID
            ,0) > 0
      THEN
        COMMIT;
        FND_FILE.PUT_LINE(FND_FILE.LOG
                         ,'创建发票会计分录成功!');
      END IF;
    EXCEPTION
      WHEN OTHERS THEN
        ERRBUF := '创建发票会计分录失败!';
        FND_FILE.PUT_LINE(FND_FILE.LOG
                         ,ERRBUF);
        RETURN;
    END;*/
  
    BEGIN
      V_REQUEST_ID := NULL;
      V_REQUEST_ID := FND_REQUEST.SUBMIT_REQUEST(APPLICATION => 'SQLAP'
                                                ,PROGRAM     => 'APACCENG'
                                                ,DESCRIPTION => '创建付款会计分录'
                                                ,START_TIME  => TO_CHAR(SYSDATE
                                                                       ,'dd-mon-yy hh:mi:ss')
                                                ,SUB_REQUEST => FALSE
                                                ,ARGUMENT1   => NULL
                                                , --Start Date
                                                 ARGUMENT2   => NULL
                                                , --End Date
                                                 ARGUMENT3   => 'Payments'
                                                , --Journal Category
                                                 ARGUMENT4   => 'N'
                                                , --Submit Transfer to GL
                                                 ARGUMENT5   => 'N'
                                                , --Submit Journal Import
                                                 ARGUMENT6   => 'Y'
                                                , --Validate Accounts
                                                 ARGUMENT7   => 'N'
                                                , --Summarize Report
                                                 ARGUMENT8   => TO_CHAR(50)
                                                , --Commit Cycle
                                                 ARGUMENT9   => TO_CHAR(P_ORG_ID)
                                                , --org_id
                                                 ARGUMENT10  => 'N'
                                                , --Debug
                                                 ARGUMENT11  => NULL
                                                , --Invoice Batch ID
                                                 ARGUMENT12  => NULL
                                                , --Payment Batch Name
                                                 ARGUMENT13  => 'N' --Trace Option
                                                ,ARGUMENT14  => 'Y' --Run Accounting Report
                                                 );
      IF NVL(V_REQUEST_ID
            ,0) > 0
      THEN
        COMMIT;
        FND_FILE.PUT_LINE(FND_FILE.LOG
                         ,'创建付款会计分录成功!');
      END IF;
    EXCEPTION
      WHEN OTHERS THEN
        ERRBUF := '创建付款会计分录失败!';
        FND_FILE.PUT_LINE(FND_FILE.LOG
                         ,ERRBUF);
        RETURN;
    END;
  END ZJ_11I_BATCH_ACCOUNT;
  --批量付款程序
  PROCEDURE BATCH_PAYMENTS_SUB_PRC(RETCODE                     OUT NUMBER
                                  ,ERRBUF                      OUT VARCHAR2
                                  ,P_BATCH_ID                  NUMBER
                                  ,P_PAYMENT_TYPE              VARCHAR2 --付款类型 是按供应商付款还是按发票
                                  ,P_CREATE_JOURNAL_ENTRY_FLAG VARCHAR2) IS
    --是否创建日记账分录
    CURSOR C1 IS
      SELECT DISTINCT MAIP.ORG_ID
                     ,MAIP.SET_OF_BOOKS_ID
                     ,MAIP.VENDOR_ID
                     ,MAIP.VENDOR_NUM
                     ,MAIP.VENDOR_SITE_ID
                     ,MAIP.VENDOR_SITE_CODE
                     ,MAIP.ADDRESS_LINE1
                     ,MAIP.ADDRESS_LINE2
                     ,MAIP.ADDRESS_LINE3
                     ,MAIP.ADDRESS_LINE4
                     ,MAIP.COUNTRY
                     ,MAIP.STATE
                     ,MAIP.ZIP
                     ,MAIP.COUNTY
                     ,MAIP.CITY
                     ,MAIP.PROVINCE
                     ,MAIP.VENDOR_NAME
                     ,MAIP.BANK_ACCOUNT_ID
                     ,MAIP.BANK_ACCOUNT_TYPE
                     ,MAIP.BANK_ACCOUNT_NAME
                     ,MAIP.BANK_ACCOUNT_NUM
                     ,MAIP.CHECK_STOCK_NAME
                     ,MAIP.CHECK_STOCK_ID
                     ,MAIP.CHECK_FORMAT_ID
                     ,MAIP.DOC_CATEGORY_CODE
                     ,MAIP.PAYMENT_METHOD_LOOKUP_CODE
                     ,MAIP.CURRENCY_CODE
                     ,MAIP.ATTRIBUTE1 --汇率类型
                     ,MAIP.ATTRIBUTE2 --汇率
                     ,TRUNC(MAIP.ATTRIBUTE3) EXCHANGE_RATE_DATE --汇率日期
                     ,TRUNC(MAIP.CHECK_DATE) CHECK_DATE
                      
                     ,SUM(MAIP.AMOUNT) AMOUNT
        FROM MEW_AP_INVOICE_PAYMENTS MAIP
       WHERE MAIP.BATCH_ID = P_BATCH_ID
       GROUP BY MAIP.ORG_ID
               ,MAIP.SET_OF_BOOKS_ID
               ,MAIP.VENDOR_ID
               ,MAIP.VENDOR_NUM
               ,MAIP.VENDOR_SITE_ID
               ,MAIP.VENDOR_SITE_CODE
               ,MAIP.ADDRESS_LINE1
               ,MAIP.ADDRESS_LINE2
               ,MAIP.ADDRESS_LINE3
               ,MAIP.ADDRESS_LINE4
               ,MAIP.COUNTRY
               ,MAIP.STATE
               ,MAIP.ZIP
               ,MAIP.COUNTY
               ,MAIP.CITY
               ,MAIP.PROVINCE
               ,MAIP.VENDOR_NAME
               ,MAIP.BANK_ACCOUNT_ID
               ,MAIP.BANK_ACCOUNT_TYPE
               ,MAIP.BANK_ACCOUNT_NAME
               ,MAIP.BANK_ACCOUNT_NUM
               ,MAIP.CHECK_STOCK_NAME
               ,MAIP.CHECK_STOCK_ID
               ,MAIP.CHECK_FORMAT_ID
               ,MAIP.DOC_CATEGORY_CODE
               ,MAIP.PAYMENT_METHOD_LOOKUP_CODE
               ,MAIP.CURRENCY_CODE
               ,MAIP.ATTRIBUTE1 --汇率类型
               ,MAIP.ATTRIBUTE2 --汇率
               ,TRUNC(MAIP.ATTRIBUTE3) --汇率日期
               ,TRUNC(MAIP.CHECK_DATE)
       ORDER BY TRUNC(MAIP.CHECK_DATE);
    CNT                  NUMBER := 0;
    V_CONCURRENCY_STATUS BOOLEAN;
    V_EXCHANGE_RATE_TYPE VARCHAR2(50);
    V_SUM_INVOICE_AMOUNT NUMBER;
    V_SUB_INVOICE_AMOUNT NUMBER;
  BEGIN
    SELECT COUNT(*)
      INTO CNT
      FROM MEW_AP_INVOICE_PAYMENTS MAIP
     WHERE MAIP.BATCH_ID = P_BATCH_ID;
  
    IF NVL(CNT
          ,0) = 0
    THEN
      V_CONCURRENCY_STATUS := FND_CONCURRENT.SET_COMPLETION_STATUS('WARNING'
                                                                  ,'当前批次没有数据需要处理');
      FND_FILE.PUT_LINE(FND_FILE.LOG
                       ,'');
      FND_FILE.PUT_LINE(FND_FILE.LOG
                       ,'当前批次没有数据需要处理');
      FND_FILE.PUT_LINE(FND_FILE.LOG
                       ,'');
    ELSE
      CNT := 0;
      --输出付款记录总数
      FND_FILE.PUT_LINE(FND_FILE.LOG
                       ,'本次生成的付款单号明细如下:');
      FND_FILE.PUT_LINE(FND_FILE.LOG
                       ,'');
      FND_FILE.PUT_LINE(FND_FILE.LOG
                       ,'付款单号' || '     ' || '付款金额');
      IF P_PAYMENT_TYPE = 'S'
      THEN
        FOR R1 IN C1
        LOOP
          V_SUM_INVOICE_AMOUNT := ROUND(R1.AMOUNT * NVL(R1.ATTRIBUTE2
                                                       ,1)
                                       ,2);
          CNT                  := CNT + 1;
          --8 获取付款单ID
          SELECT AP_CHECKS_S.NEXTVAL INTO V_CHECK_ID FROM DUAL;
          --    FND_FILE.PUT_LINE(FND_FILE.LOG,'cnt1:'||cnt);
          IF R1.ATTRIBUTE1 IS NOT NULL
          THEN
            SELECT DCT.CONVERSION_TYPE
              INTO V_EXCHANGE_RATE_TYPE
              FROM GL_DAILY_CONVERSION_TYPES DCT
             WHERE DCT.CONVERSION_TYPE != 'Period Average (Upgrade)'
               AND DCT.CONVERSION_TYPE != 'EMU FIXED'
               AND DCT.USER_CONVERSION_TYPE = R1.ATTRIBUTE1;
          END IF;
          -- FND_FILE.PUT_LINE(FND_FILE.LOG,'cnt:'||cnt);
          FOR R2 IN (SELECT *
                       FROM MEW_AP_INVOICE_PAYMENTS MAIP
                      WHERE MAIP.ORG_ID = R1.ORG_ID
                        AND MAIP.VENDOR_NUM = R1.VENDOR_NUM
                        AND MAIP.VENDOR_SITE_CODE = R1.VENDOR_SITE_CODE
                        AND MAIP.CHECK_DATE = R1.CHECK_DATE
                        AND MAIP.BANK_ACCOUNT_NAME = R1.BANK_ACCOUNT_NAME
                        AND MAIP.CHECK_STOCK_NAME = R1.CHECK_STOCK_NAME
                        AND MAIP.CURRENCY_CODE = R1.CURRENCY_CODE
                        AND (MAIP.ATTRIBUTE1 = R1.ATTRIBUTE1 OR
                            R1.ATTRIBUTE1 IS NULL)
                        AND (MAIP.ATTRIBUTE2 = R1.ATTRIBUTE2 OR
                            R1.ATTRIBUTE2 IS NULL)
                        AND (TRUNC(MAIP.ATTRIBUTE3) = R1.EXCHANGE_RATE_DATE OR
                            R1.EXCHANGE_RATE_DATE IS NULL)
                      ORDER BY MAIP.CHECK_DATE)
          LOOP
            V_SUB_INVOICE_AMOUNT := ROUND(R2.AMOUNT * NVL(R2.ATTRIBUTE2
                                                         ,1)
                                         ,2);
            --9 获取付款ID
            SELECT AP_INVOICE_PAYMENTS_S.NEXTVAL
              INTO V_INVOICE_PAYMENT_ID
              FROM DUAL;
            --11 写付款信息至发票付款表
            INSERT INTO AP_INVOICE_PAYMENTS_ALL
              (ACCOUNTING_DATE
              ,ACCRUAL_POSTED_FLAG
              ,AMOUNT
              ,CASH_POSTED_FLAG
              ,CHECK_ID
              ,INVOICE_ID
              ,INVOICE_PAYMENT_ID
              ,LAST_UPDATED_BY
              ,LAST_UPDATE_DATE
              ,PAYMENT_NUM
              ,PERIOD_NAME
              ,POSTED_FLAG
              ,SET_OF_BOOKS_ID
               -- ,ACCTS_PAY_CODE_COMBINATION_ID
              ,CREATED_BY
              ,CREATION_DATE
              ,EXCHANGE_DATE --汇率日期
              ,EXCHANGE_RATE --汇率
              ,EXCHANGE_RATE_TYPE --汇率类型
              ,GAIN_CODE_COMBINATION_ID
              ,LOSS_CODE_COMBINATION_ID
              ,INVOICE_BASE_AMOUNT
              ,PAYMENT_BASE_AMOUNT
              ,FUTURE_PAY_CODE_COMBINATION_ID
              ,REVERSAL_FLAG)
            VALUES
              (R2.CHECK_DATE
              ,'Y'
              ,R2.AMOUNT
              ,'Y'
              ,V_CHECK_ID
              ,R2.INVOICE_ID
              ,V_INVOICE_PAYMENT_ID
              ,FND_GLOBAL.USER_ID
              ,SYSDATE
              ,1
              ,R2.PERIOD_NAME
              ,'Y'
              ,R2.SET_OF_BOOKS_ID
               --  ,V_ACCTS_CODE_COMBINATION_ID
              ,FND_GLOBAL.USER_ID
              ,SYSDATE
              ,NVL(SYSDATE
                  ,R2.ATTRIBUTE3) --汇率日期
              ,R2.ATTRIBUTE2 --汇率
              ,V_EXCHANGE_RATE_TYPE --汇率类型
              ,NULL
              ,NULL
              ,V_SUB_INVOICE_AMOUNT
              ,V_SUB_INVOICE_AMOUNT
              ,NULL
              ,'N');
          
            --12 更新发票数据状态
          
            UPDATE AP_PAYMENT_SCHEDULES_ALL
               SET AMOUNT_REMAINING          = AMOUNT_REMAINING - R2.AMOUNT
                  ,DISCOUNT_AMOUNT_REMAINING = 0
                  ,PAYMENT_STATUS_FLAG       = DECODE(AMOUNT_REMAINING -
                                                      R2.AMOUNT
                                                     ,0
                                                     ,'Y'
                                                     ,AMOUNT_REMAINING
                                                     ,PAYMENT_STATUS_FLAG
                                                     ,'P')
                  ,LAST_UPDATE_DATE          = SYSDATE
                  ,LAST_UPDATED_BY           = FND_GLOBAL.USER_ID
                  ,CHECKRUN_ID               = NULL
             WHERE INVOICE_ID = R2.INVOICE_ID
               AND PAYMENT_NUM = 1;
          
            --13 更新发票表已支付金额
            UPDATE AP_INVOICES_ALL
               SET AMOUNT_PAID           = NVL(AMOUNT_PAID
                                              ,0) + R2.AMOUNT
                  ,DISCOUNT_AMOUNT_TAKEN = NVL(DISCOUNT_AMOUNT_TAKEN
                                              ,0)
                  ,PAYMENT_STATUS_FLAG   = AP_INVOICES_UTILITY_PKG.GET_PAYMENT_STATUS(R2.INVOICE_ID)
                  ,LAST_UPDATE_DATE      = SYSDATE
                  ,LAST_UPDATED_BY       = FND_GLOBAL.USER_ID
             WHERE INVOICE_ID = R2.INVOICE_ID;
          END LOOP;
        
          --15 获取凭证编号  
          SELECT FDS.DOC_SEQUENCE_ID
                ,FDS.DB_SEQUENCE_NAME
                ,FDSA.DOC_SEQUENCE_ASSIGNMENT_ID
            INTO V_DOC_SEQUENCE_ID
                ,V_DB_SEQUENCE_NAME
                ,V_DOC_SEQUENCE_ASSIGNMENT_ID
            FROM FND_DOC_SEQUENCE_ASSIGNMENTS FDSA
                ,FND_DOCUMENT_SEQUENCES       FDS
           WHERE FDSA.DOC_SEQUENCE_ID = FDS.DOC_SEQUENCE_ID
             AND FDSA.APPLICATION_ID = 200
             AND FDSA.SET_OF_BOOKS_ID = R1.SET_OF_BOOKS_ID
             AND FDS.TYPE = 'A'
             AND TRUNC(SYSDATE) BETWEEN
                 TRUNC(NVL(FDSA.START_DATE
                          ,SYSDATE)) AND
                 TRUNC(NVL(FDSA.END_DATE
                          ,SYSDATE))
             AND TRUNC(SYSDATE) BETWEEN
                 TRUNC(NVL(FDS.START_DATE
                          ,SYSDATE)) AND
                 TRUNC(NVL(FDS.END_DATE
                          ,SYSDATE))
             AND FDSA.CATEGORY_CODE = R1.DOC_CATEGORY_CODE
             AND FDSA.METHOD_CODE = 'M';
        
          --6 获取并更新付款单号
          SELECT LAST_DOCUMENT_NUM + 1
            INTO V_CHECK_NUMBER
            FROM AP_CHECK_STOCKS_ALL ACS
           WHERE ACS.CHECK_STOCK_ID = R1.CHECK_STOCK_ID
             AND NVL(ACS.INACTIVE_DATE
                    ,SYSDATE) >= SYSDATE;
          --输出付款单号
          FND_FILE.PUT_LINE(FND_FILE.LOG
                           ,V_CHECK_NUMBER || '     ' || R1.AMOUNT);
        
          UPDATE AP_CHECK_STOCKS_ALL
             SET LAST_DOCUMENT_NUM = V_CHECK_NUMBER
                ,LAST_UPDATE_DATE  = SYSDATE
                ,LAST_UPDATED_BY   = FND_GLOBAL.USER_ID
           WHERE CHECK_STOCK_ID = R1.CHECK_STOCK_ID;
        
          V_DB_STR := 'select ' || V_DB_SEQUENCE_NAME ||
                      '.nextval from dual';
        
          --  SELECT FND_DOC_SEQ_411_S.NEXTVAL INTO V_DOC_SEQUENCE_ID FROM DUAL;
        
          EXECUTE IMMEDIATE V_DB_STR
            INTO V_DOC_SEQUENCE_VALUE;
          INSERT INTO AP_DOC_SEQUENCE_AUDIT
            (DOC_SEQUENCE_ID
            ,DOC_SEQUENCE_ASSIGNMENT_ID
            ,DOC_SEQUENCE_VALUE
            ,CREATION_DATE
            ,CREATED_BY)
          VALUES
            (V_DOC_SEQUENCE_ID
            ,V_DOC_SEQUENCE_ASSIGNMENT_ID
            ,V_DOC_SEQUENCE_VALUE
            ,SYSDATE
            ,FND_GLOBAL.USER_ID);
          -- COMMIT;
          --16 生成付款单记录
        
          AP_CHECKS_PKG.INSERT_ROW(X_ROWID                      => V_ROWID
                                  ,X_AMOUNT                     => R1.AMOUNT
                                  ,X_BANK_ACCOUNT_ID            => R1.BANK_ACCOUNT_ID
                                  ,X_BANK_ACCOUNT_NAME          => R1.BANK_ACCOUNT_NAME
                                  ,X_CHECK_DATE                 => R1.CHECK_DATE
                                  ,X_CHECK_ID                   => V_CHECK_ID
                                  ,X_CHECK_NUMBER               => V_CHECK_NUMBER
                                  ,X_CURRENCY_CODE              => R1.CURRENCY_CODE
                                  ,X_LAST_UPDATED_BY            => FND_GLOBAL.USER_ID
                                  ,X_LAST_UPDATE_DATE           => SYSDATE
                                  ,X_PAYMENT_METHOD_LOOKUP_CODE => R1.PAYMENT_METHOD_LOOKUP_CODE
                                  ,X_PAYMENT_TYPE_FLAG          => 'M'
                                  ,X_ADDRESS_LINE1              => R1.ADDRESS_LINE1
                                  ,X_ADDRESS_LINE2              => R1.ADDRESS_LINE2
                                  ,X_ADDRESS_LINE3              => R1.ADDRESS_LINE3
                                  ,X_CHECKRUN_NAME              => NULL
                                  ,X_CHECK_FORMAT_ID            => R1.CHECK_FORMAT_ID
                                  ,X_CHECK_STOCK_ID             => R1.CHECK_STOCK_ID
                                  ,X_CITY                       => R1.CITY
                                  ,X_COUNTRY                    => R1.COUNTRY
                                  ,X_CREATED_BY                 => FND_GLOBAL.USER_ID
                                  ,X_CREATION_DATE              => SYSDATE
                                  ,X_LAST_UPDATE_LOGIN          => FND_GLOBAL.USER_ID
                                  ,X_STATUS_LOOKUP_CODE         => 'NEGOTIABLE'
                                  ,X_VENDOR_NAME                => R1.VENDOR_NAME
                                  ,X_VENDOR_SITE_CODE           => R1.VENDOR_SITE_CODE
                                  ,X_EXTERNAL_BANK_ACCOUNT_ID   => NULL
                                  ,X_ZIP                        => NULL
                                  ,X_BANK_ACCOUNT_NUM           => R1.BANK_ACCOUNT_NUM
                                  ,X_BANK_ACCOUNT_TYPE          => R1.BANK_ACCOUNT_TYPE
                                  ,X_BANK_NUM                   => NULL
                                  ,X_CHECK_VOUCHER_NUM          => NULL
                                  ,X_CLEARED_AMOUNT             => NULL
                                  ,X_CLEARED_DATE               => NULL
                                  ,X_DOC_CATEGORY_CODE          => R1.DOC_CATEGORY_CODE
                                  ,X_DOC_SEQUENCE_ID            => V_DOC_SEQUENCE_ID
                                  ,X_DOC_SEQUENCE_VALUE         => V_DOC_SEQUENCE_VALUE
                                  ,X_PROVINCE                   => R1.PROVINCE
                                  ,X_RELEASED_DATE              => NULL
                                  ,X_RELEASED_BY                => NULL
                                  ,X_STATE                      => R1.STATE
                                  ,X_ATTRIBUTE15                => NULL
                                  ,X_FUTURE_PAY_DUE_DATE        => NULL
                                  ,X_ADDRESS_LINE4              => R1.ADDRESS_LINE4
                                  ,X_COUNTY                     => R1.COUNTY
                                  ,X_ADDRESS_STYLE              => NULL
                                  ,X_ORG_ID                     => R1.ORG_ID
                                  ,X_VENDOR_ID                  => R1.VENDOR_ID
                                  ,X_VENDOR_SITE_ID             => R1.VENDOR_SITE_ID
                                  ,X_EXCHANGE_RATE              => R1.ATTRIBUTE2
                                  ,X_EXCHANGE_DATE              => NVL(R1.EXCHANGE_RATE_DATE
                                                                      ,SYSDATE)
                                  ,X_EXCHANGE_RATE_TYPE         => V_EXCHANGE_RATE_TYPE
                                  ,X_BASE_AMOUNT                => V_SUM_INVOICE_AMOUNT
                                  ,X_CALLING_SEQUENCE           => 'APXPAWKB'
                                  ,X_DESCRIPTION                => NULL);
          --  COMMIT;
          --17 创建付款会计分录
          SP_AP_ACCOUNTING_11I10(V_CHECK_ID);
        END LOOP;
      
      ELSE
      
        -- FND_FILE.PUT_LINE(FND_FILE.LOG,'cnt:'||cnt);
        FOR R2 IN (SELECT *
                     FROM MEW_AP_INVOICE_PAYMENTS MAIP
                    WHERE MAIP.BATCH_ID = P_BATCH_ID
                    ORDER BY MAIP.CHECK_DATE)
        LOOP
          CNT := CNT + 1;
          --8 获取付款单ID
          SELECT AP_CHECKS_S.NEXTVAL INTO V_CHECK_ID FROM DUAL;
          --    FND_FILE.PUT_LINE(FND_FILE.LOG,'cnt1:'||cnt);
          IF R2.ATTRIBUTE1 IS NOT NULL
          THEN
            SELECT DCT.CONVERSION_TYPE
              INTO V_EXCHANGE_RATE_TYPE
              FROM GL_DAILY_CONVERSION_TYPES DCT
             WHERE DCT.CONVERSION_TYPE != 'Period Average (Upgrade)'
               AND DCT.CONVERSION_TYPE != 'EMU FIXED'
               AND DCT.USER_CONVERSION_TYPE = R2.ATTRIBUTE1;
          END IF;
        
          V_SUB_INVOICE_AMOUNT := R2.AMOUNT * NVL(R2.ATTRIBUTE2
                                                 ,1);
          --9 获取付款ID
          SELECT AP_INVOICE_PAYMENTS_S.NEXTVAL
            INTO V_INVOICE_PAYMENT_ID
            FROM DUAL;
          --11 写付款信息至发票付款表
          INSERT INTO AP_INVOICE_PAYMENTS_ALL
            (ACCOUNTING_DATE
            ,ACCRUAL_POSTED_FLAG
            ,AMOUNT
            ,CASH_POSTED_FLAG
            ,CHECK_ID
            ,INVOICE_ID
            ,INVOICE_PAYMENT_ID
            ,LAST_UPDATED_BY
            ,LAST_UPDATE_DATE
            ,PAYMENT_NUM
            ,PERIOD_NAME
            ,POSTED_FLAG
            ,SET_OF_BOOKS_ID
             -- ,ACCTS_PAY_CODE_COMBINATION_ID
            ,CREATED_BY
            ,CREATION_DATE
            ,EXCHANGE_DATE --汇率日期
            ,EXCHANGE_RATE --汇率
            ,EXCHANGE_RATE_TYPE --汇率类型
            ,GAIN_CODE_COMBINATION_ID
            ,LOSS_CODE_COMBINATION_ID
            ,INVOICE_BASE_AMOUNT
            ,PAYMENT_BASE_AMOUNT
            ,FUTURE_PAY_CODE_COMBINATION_ID
            ,REVERSAL_FLAG)
          VALUES
            (R2.CHECK_DATE
            ,'Y'
            ,R2.AMOUNT
            ,'Y'
            ,V_CHECK_ID
            ,R2.INVOICE_ID
            ,V_INVOICE_PAYMENT_ID
            ,FND_GLOBAL.USER_ID
            ,SYSDATE
            ,1
            ,R2.PERIOD_NAME
            ,'Y'
            ,R2.SET_OF_BOOKS_ID
             --  ,V_ACCTS_CODE_COMBINATION_ID
            ,FND_GLOBAL.USER_ID
            ,SYSDATE
            ,NVL(SYSDATE
                ,R2.ATTRIBUTE3) --汇率日期
            ,R2.ATTRIBUTE2 --汇率
            ,V_EXCHANGE_RATE_TYPE --汇率类型
            ,NULL
            ,NULL
            ,V_SUB_INVOICE_AMOUNT
            ,V_SUB_INVOICE_AMOUNT
            ,NULL
            ,'N');
        
          --12 更新发票数据状态
        
          UPDATE AP_PAYMENT_SCHEDULES_ALL
             SET AMOUNT_REMAINING          = AMOUNT_REMAINING - R2.AMOUNT
                ,DISCOUNT_AMOUNT_REMAINING = 0
                ,PAYMENT_STATUS_FLAG       = DECODE(AMOUNT_REMAINING -
                                                    R2.AMOUNT
                                                   ,0
                                                   ,'Y'
                                                   ,AMOUNT_REMAINING
                                                   ,PAYMENT_STATUS_FLAG
                                                   ,'P')
                ,LAST_UPDATE_DATE          = SYSDATE
                ,LAST_UPDATED_BY           = FND_GLOBAL.USER_ID
                ,CHECKRUN_ID               = NULL
           WHERE INVOICE_ID = R2.INVOICE_ID
             AND PAYMENT_NUM = 1;
        
          --13 更新发票表已支付金额
          UPDATE AP_INVOICES_ALL
             SET AMOUNT_PAID           = NVL(AMOUNT_PAID
                                            ,0) + R2.AMOUNT
                ,DISCOUNT_AMOUNT_TAKEN = NVL(DISCOUNT_AMOUNT_TAKEN
                                            ,0)
                ,PAYMENT_STATUS_FLAG   = AP_INVOICES_UTILITY_PKG.GET_PAYMENT_STATUS(R2.INVOICE_ID)
                ,LAST_UPDATE_DATE      = SYSDATE
                ,LAST_UPDATED_BY       = FND_GLOBAL.USER_ID
           WHERE INVOICE_ID = R2.INVOICE_ID;
        
          --15 获取凭证编号  
          SELECT FDS.DOC_SEQUENCE_ID
                ,FDS.DB_SEQUENCE_NAME
                ,FDSA.DOC_SEQUENCE_ASSIGNMENT_ID
            INTO V_DOC_SEQUENCE_ID
                ,V_DB_SEQUENCE_NAME
                ,V_DOC_SEQUENCE_ASSIGNMENT_ID
            FROM FND_DOC_SEQUENCE_ASSIGNMENTS FDSA
                ,FND_DOCUMENT_SEQUENCES       FDS
           WHERE FDSA.DOC_SEQUENCE_ID = FDS.DOC_SEQUENCE_ID
             AND FDSA.APPLICATION_ID = 200
             AND FDSA.SET_OF_BOOKS_ID = R2.SET_OF_BOOKS_ID
             AND FDS.TYPE = 'A'
             AND TRUNC(SYSDATE) BETWEEN
                 TRUNC(NVL(FDSA.START_DATE
                          ,SYSDATE)) AND
                 TRUNC(NVL(FDSA.END_DATE
                          ,SYSDATE))
             AND TRUNC(SYSDATE) BETWEEN
                 TRUNC(NVL(FDS.START_DATE
                          ,SYSDATE)) AND
                 TRUNC(NVL(FDS.END_DATE
                          ,SYSDATE))
             AND FDSA.CATEGORY_CODE = R2.DOC_CATEGORY_CODE
             AND FDSA.METHOD_CODE = 'M';
        
          --6 获取并更新付款单号
          SELECT LAST_DOCUMENT_NUM + 1
            INTO V_CHECK_NUMBER
            FROM AP_CHECK_STOCKS_ALL ACS
           WHERE ACS.CHECK_STOCK_ID = R2.CHECK_STOCK_ID
             AND NVL(ACS.INACTIVE_DATE
                    ,SYSDATE) >= SYSDATE;
          --输出付款单号
          FND_FILE.PUT_LINE(FND_FILE.LOG
                           ,V_CHECK_NUMBER || '     ');
        
          UPDATE AP_CHECK_STOCKS_ALL
             SET LAST_DOCUMENT_NUM = V_CHECK_NUMBER
                ,LAST_UPDATE_DATE  = SYSDATE
                ,LAST_UPDATED_BY   = FND_GLOBAL.USER_ID
           WHERE CHECK_STOCK_ID = R2.CHECK_STOCK_ID;
        
          V_DB_STR := 'select ' || V_DB_SEQUENCE_NAME ||
                      '.nextval from dual';
        
          --  SELECT FND_DOC_SEQ_411_S.NEXTVAL INTO V_DOC_SEQUENCE_ID FROM DUAL;
        
          EXECUTE IMMEDIATE V_DB_STR
            INTO V_DOC_SEQUENCE_VALUE;
          INSERT INTO AP_DOC_SEQUENCE_AUDIT
            (DOC_SEQUENCE_ID
            ,DOC_SEQUENCE_ASSIGNMENT_ID
            ,DOC_SEQUENCE_VALUE
            ,CREATION_DATE
            ,CREATED_BY)
          VALUES
            (V_DOC_SEQUENCE_ID
            ,V_DOC_SEQUENCE_ASSIGNMENT_ID
            ,V_DOC_SEQUENCE_VALUE
            ,SYSDATE
            ,FND_GLOBAL.USER_ID);
          -- COMMIT;
          --16 生成付款单记录
        
          AP_CHECKS_PKG.INSERT_ROW(X_ROWID                      => V_ROWID
                                  ,X_AMOUNT                     => R2.AMOUNT
                                  ,X_BANK_ACCOUNT_ID            => R2.BANK_ACCOUNT_ID
                                  ,X_BANK_ACCOUNT_NAME          => R2.BANK_ACCOUNT_NAME
                                  ,X_CHECK_DATE                 => R2.CHECK_DATE
                                  ,X_CHECK_ID                   => V_CHECK_ID
                                  ,X_CHECK_NUMBER               => V_CHECK_NUMBER
                                  ,X_CURRENCY_CODE              => R2.CURRENCY_CODE
                                  ,X_LAST_UPDATED_BY            => FND_GLOBAL.USER_ID
                                  ,X_LAST_UPDATE_DATE           => SYSDATE
                                  ,X_PAYMENT_METHOD_LOOKUP_CODE => R2.PAYMENT_METHOD_LOOKUP_CODE
                                  ,X_PAYMENT_TYPE_FLAG          => 'M'
                                  ,X_ADDRESS_LINE1              => R2.ADDRESS_LINE1
                                  ,X_ADDRESS_LINE2              => R2.ADDRESS_LINE2
                                  ,X_ADDRESS_LINE3              => R2.ADDRESS_LINE3
                                  ,X_CHECKRUN_NAME              => NULL
                                  ,X_CHECK_FORMAT_ID            => R2.CHECK_FORMAT_ID
                                  ,X_CHECK_STOCK_ID             => R2.CHECK_STOCK_ID
                                  ,X_CITY                       => R2.CITY
                                  ,X_COUNTRY                    => R2.COUNTRY
                                  ,X_CREATED_BY                 => FND_GLOBAL.USER_ID
                                  ,X_CREATION_DATE              => SYSDATE
                                  ,X_LAST_UPDATE_LOGIN          => FND_GLOBAL.USER_ID
                                  ,X_STATUS_LOOKUP_CODE         => 'NEGOTIABLE'
                                  ,X_VENDOR_NAME                => R2.VENDOR_NAME
                                  ,X_VENDOR_SITE_CODE           => R2.VENDOR_SITE_CODE
                                  ,X_EXTERNAL_BANK_ACCOUNT_ID   => NULL
                                  ,X_ZIP                        => NULL
                                  ,X_BANK_ACCOUNT_NUM           => R2.BANK_ACCOUNT_NUM
                                  ,X_BANK_ACCOUNT_TYPE          => R2.BANK_ACCOUNT_TYPE
                                  ,X_BANK_NUM                   => NULL
                                  ,X_CHECK_VOUCHER_NUM          => NULL
                                  ,X_CLEARED_AMOUNT             => NULL
                                  ,X_CLEARED_DATE               => NULL
                                  ,X_DOC_CATEGORY_CODE          => R2.DOC_CATEGORY_CODE
                                  ,X_DOC_SEQUENCE_ID            => V_DOC_SEQUENCE_ID
                                  ,X_DOC_SEQUENCE_VALUE         => V_DOC_SEQUENCE_VALUE
                                  ,X_PROVINCE                   => R2.PROVINCE
                                  ,X_RELEASED_DATE              => NULL
                                  ,X_RELEASED_BY                => NULL
                                  ,X_STATE                      => R2.STATE
                                  ,X_ATTRIBUTE15                => NULL
                                  ,X_FUTURE_PAY_DUE_DATE        => NULL
                                  ,X_ADDRESS_LINE4              => R2.ADDRESS_LINE4
                                  ,X_COUNTY                     => R2.COUNTY
                                  ,X_ADDRESS_STYLE              => NULL
                                  ,X_ORG_ID                     => R2.ORG_ID
                                  ,X_VENDOR_ID                  => R2.VENDOR_ID
                                  ,X_VENDOR_SITE_ID             => R2.VENDOR_SITE_ID
                                  ,X_EXCHANGE_RATE              => R2.ATTRIBUTE2
                                  ,X_EXCHANGE_DATE              => NVL(R2.ATTRIBUTE3
                                                                      ,SYSDATE)
                                  ,X_EXCHANGE_RATE_TYPE         => V_EXCHANGE_RATE_TYPE
                                  ,X_BASE_AMOUNT                => V_SUM_INVOICE_AMOUNT
                                  ,X_CALLING_SEQUENCE           => 'APXPAWKB'
                                  ,X_DESCRIPTION                => NULL);
          --  COMMIT;
          --17 创建付款会计分录
          SP_AP_ACCOUNTING_11I10(V_CHECK_ID);
        END LOOP;
      END IF;
      BEGIN
        SELECT DISTINCT ORG_ID
          INTO V_ORG_ID
          FROM MEW_AP_INVOICE_PAYMENTS T
         WHERE T.BATCH_ID = P_BATCH_ID;
      EXCEPTION
        WHEN OTHERS THEN
          FND_FILE.PUT_LINE(FND_FILE.LOG
                           ,'本批次数据组织ID不唯一');
          APP_EXCEPTION.RAISE_EXCEPTION;
      END;
      FND_FILE.PUT_LINE(FND_FILE.LOG
                       ,'');
      --输出付款记录总数
      FND_FILE.PUT_LINE(FND_FILE.LOG
                       ,'本次共生成:' || CNT || ' 笔付款.');
    
      FND_FILE.PUT_LINE(FND_FILE.LOG
                       ,'');
      FND_FILE.PUT_LINE(FND_FILE.LOG
                       ,'');
      IF P_CREATE_JOURNAL_ENTRY_FLAG = 'Y'
      THEN
        ZJ_11I_BATCH_ACCOUNT(V_ORG_ID);
      END IF;
      DELETE FROM MEW_AP_INVOICE_PAYMENTS MAIP
       WHERE MAIP.BATCH_ID = P_BATCH_ID;
    END IF;
  END;
END;
/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值