发票创建

ZSRM_BILING_H

INVOICE_IND	1 类型	XRECH	CHAR	1	0	标识: 记帐发票
DOC_TYPE	1 类型	BLART	CHAR	2	0	凭证类型
DOC_DATE	1 类型	BLDAT	DATS	8	0	凭证中的凭证日期
PSTNG_DATE	1 类型	BUDAT	DATS	8	0	凭证中的过账日期
REF_DOC_NO	1 类型	XBLNR	CHAR	16	0	参考凭证编号 
COMP_CODE	1 类型	BUKRS	CHAR	4	0	公司代码
CURRENCY	1 类型	WAERS	CUKY	5	0	货币码 
GROSS_AMOUNT	1 类型	BAPI_RMWWR	DEC	23	4	凭证货币的总发票金额 
CALC_TAX_IND	1 类型	XMWST	CHAR	1	0	自动计算税金
PMNTTRMS	1 类型	DZTERM	CHAR	4	0	收付条件代码
BLINE_DATE	1 类型	DZFBDT	DATS	8	0	到期日期计算的起算日期 
DIFF_INV	1 类型	LIFRE	CHAR	10	0	不同出票方 
HEADER_TXT	1 类型	BKTXT	CHAR	25	0	凭证抬头文本
ALLOC_NMBR	1 类型	DZUONR	CHAR	18	0	分配编号
REF_DOC_NO_LONG	1 类型	XBLNR_LONG	CHAR	35	0	参考凭证号(对相关性参看长文本)
DEL_COSTS_TAXC	1 类型	MWSKZ_BNK	CHAR	2	0	交货成本税码
BUSINESS_PLACE	1 类型	J_1ABRNCH	CHAR	4	0	分支号 
TAX_CODE	1 类型	MWSKZ	CHAR	2	0	销售/购买税代码 
TAX_AMOUNT	1 类型	BAPIWMWST	DEC	23	4	用凭证货币表示的税收金额
INV_TRAN	1 类型	INV_TRAN	CHAR	1	0	后勤发票检验中的事务 
BRANCH	1 类型	J_1BBRANC_	CHAR	4	0	业务地点
SGTXT	1 类型	SGTXT	CHAR	50	0	项目文本
USERNAME	1 类型	USERNAME	CHAR	12	0	用户名 
ZZTAX	1 类型	ZZTAX	CHAR	300	0	金税发票号 
ZZINVID	1 类型	ZINVID	CHAR	300	0	金税发票ID
ZZWRBTR	1 类型		CHAR	30	0	金税发票的金额 
ZZWMWST	1 类型		CHAR	30	0	金税发票的税额

ZSRM_GL_ACCOUNT

INVOICE_DOC_ITEM	1 类型	RBLGP	NUMC	6	0	发票凭证中的凭证项目
GL_ACCOUNT	1 类型	HKONT	CHAR	10	0	总账科目
ITEM_AMOUNT	1 类型	BAPIWRBTR	DEC	23	4	凭证货币金额
DB_CR_IND	1 类型	SHKZG	CHAR	1	0	借方/贷方标识
NEG_POSTNG	1 类型	XNEGP	CHAR	1	0	标识: 反记帐 
COMP_CODE	1 类型	BUKRS	CHAR	4	0	公司代码
TAX_CODE	1 类型	MWSKZ	CHAR	2	0	销售/购买税代码 
TAXJURCODE	1 类型	TXJCD	CHAR	15	0	税收管辖权 
ITEM_TEXT	1 类型	SGTXT	CHAR	50	0	项目文本
COSTCENTER	1 类型	KOSTL	CHAR	10	0	成本中心

ZSRM_BILING_ITEM

INVOICE_DOC_ITEM	1 类型	RBLGP	NUMC	6	0	发票凭证中的凭证项目
PO_NUMBER	1 类型	BSTNR	CHAR	10	0	采购订单号 
PO_ITEM	1 类型	EBELP	NUMC	5	0	采购凭证的项目编号 
REF_DOC	1 类型	LFBNR	CHAR	10	0	参考凭证的凭证号 
REF_DOC_YEAR	1 类型	LFGJA	NUMC	4	0	当前期间的会计年度 
REF_DOC_IT	1 类型	LFPOS	NUMC	4	0	参考凭证项目 
DE_CRE_IND	1 类型	TBTKZ	CHAR	1	0	标识:后续借/贷 
TAX_CODE	1 类型	MWSKZ_MRM	CHAR	2	0	税码
ITEM_AMOUNT	1 类型	BAPIWRBTR	DEC	23	4	凭证货币金额
QUANTITY	1 类型	MENGE_D	QUAN	13	3	数量
PO_UNIT	1 类型	BSTME	UNIT	3	0	采购订单计量单位
COND_TYPE	1 类型	KSCHL	CHAR	4	0	条件类型
COND_ST_NO	1 类型	STUNR	NUMC	3	0	步骤编号
COND_COUNT	1 类型	DZAEHK_SHORT	NUMC	2	0	条件计数器(长度较短) 
LIFNR	1 类型	LIFNR	CHAR	10	0	供应商或债权人的帐号
PO_PR_UOM	1 类型	BPRME	UNIT	3	0	订单价格单位(采购)

image.png

I_HEADER	TYPE	ZSRM_BILING_H	                     	发票校验-抬头

image.png

E_MSG	TYPE	STRING	返回消息
E_CODE	TYPE	CHAR1	返回代码
E_INV_DOC_NO	TYPE	RE_BELNR	发票凭证的凭证编号 
E_FISC_YEAR	TYPE	GJAHR	会计年度
E_FI_DOC	TYPE	BELNR_D	会计凭证号码
E_ZZTAX	TYPE	ZZTAX	金税发票号 
E_ZZINVID	TYPE	ZINVID	金税发票ID
E_FI_BUKRS	TYPE	BUKRS	公司代码

image.png

ET_RETURN	LIKE	BAPIRET2	返回消息
IT_GLACCOUNT	LIKE	ZSRM_GL_ACCOUNT	发票校验-总账科目数据
IT_ITEM	LIKE	ZSRM_BILING_ITEM	发票校验-明细行数据
FUNCTION ZFM_BILING_CREATE.
*"----------------------------------------------------------------------
*"*"本地接口:
*"  IMPORTING
*"     VALUE(I_HEADER) TYPE  ZSRM_BILING_H
*"  EXPORTING
*"     VALUE(E_MSG) TYPE  STRING
*"     VALUE(E_CODE) TYPE  CHAR1
*"     VALUE(E_INV_DOC_NO) TYPE  RE_BELNR
*"     VALUE(E_FISC_YEAR) TYPE  GJAHR
*"     VALUE(E_FI_DOC) TYPE  BELNR_D
*"     VALUE(E_ZZTAX) TYPE  ZZTAX
*"     VALUE(E_ZZINVID) TYPE  ZINVID
*"     VALUE(E_FI_BUKRS) TYPE  BUKRS
*"  TABLES
*"      ET_RETURN STRUCTURE  BAPIRET2 OPTIONAL
*"      IT_GLACCOUNT STRUCTURE  ZSRM_GL_ACCOUNT OPTIONAL
*"      IT_ITEM STRUCTURE  ZSRM_BILING_ITEM OPTIONAL
*"----------------------------------------------------------------------

  DATA: LS_HEADERDATA          LIKE BAPI_INCINV_CREATE_HEADER,
        LT_ITEMDATA            LIKE TABLE OF BAPI_INCINV_CREATE_ITEM,
        LS_ITEMDATA            LIKE BAPI_INCINV_CREATE_ITEM,

        LS_GLACCOUNTDATA       LIKE  BAPI_INCINV_CREATE_GL_ACCOUNT,
        LT_GLACCOUNTDATA       TYPE STANDARD TABLE OF  BAPI_INCINV_CREATE_GL_ACCOUNT,

        LT_VENDORITEMSPLITDATA TYPE STANDARD TABLE OF  BAPI_INCINV_CREATE_VENDORSPLIT,
        LS_VENDORITEMSPLITDATA TYPE BAPI_INCINV_CREATE_VENDORSPLIT,

        LS_TAXDATA             TYPE BAPI_INCINV_CREATE_TAX,
        LT_TAXDATA             TYPE STANDARD TABLE OF BAPI_INCINV_CREATE_TAX,
        LT_RETURN              LIKE TABLE OF BAPIRET2,
        LS_RETURN              LIKE BAPIRET2,
        LV_INVOICEDOCNUMBER    LIKE BAPI_INCINV_FLD-INV_DOC_NO,
        LV_FISCALYEAR          LIKE BAPI_INCINV_FLD-FISC_YEAR.

  DATA: LS_EXT2       TYPE ZFIS_BSEG_DOCUMENT,
        LT_EXTENSION2 TYPE TABLE OF BAPIPAREX,   "参考结构
        LS_EXTENSION2 TYPE BAPIPAREX.


  DATA:GV_FLAG TYPE CHAR1.
  DATA OREF TYPE REF TO CX_ROOT.

  TRY .

*--------------------------------------------------------------------*
*--      描述:参数处理
*--      日期:04.08.2020 10:38:56
*--------------------------------------------------------------------*

*1. 业务处理(transaction)字段选择:
*    创建后续借记(subsequent debit):返利业务
*            ItemData                     DE_CRE_IND   = 'X'
*            HeaderData                   INVOICE_IND  = 'X'
*    创建后续贷记(subsequent credit): 扣款业务
*            ItemData                    DE_CRE_IND    = 'X'
*            HeaderData                  INVOICE_IND   = ' '
*    发票(invoice)                  :材料款项业务
*            HeaderData    INVOICE_IND = 'X'
*    贷方凭证(credit demo)
*            HeaderData    INVOICE_IND = ' '
*2. 标识: 货物项目/交货成本/全部(Indicator: Goods Items/Delivery Costs/Both)
*    货物/服务项目(Goods/service items)
*            ItemData   COND_TYPE    = ' '
*                       COND_ST_NO   = ' '
*                       COND_COUNT   = ' '
*    计划交货成本(Planned delivery costs)
*            ItemData   COND_TYPE   = '定价条件'
*                       COND_ST_NO  = '定价行号'
*                       COND_COUNT  = '金额'



      "抬头数据
*  MOVE-CORRESPONDING I_HEADER TO LS_HEADERDATA.
      LS_HEADERDATA-INVOICE_IND  = I_HEADER-INVOICE_IND. " 'X'.
      LS_HEADERDATA-DOC_TYPE     = I_HEADER-DOC_TYPE.    " 'RE'.
      LS_HEADERDATA-DOC_DATE     = I_HEADER-DOC_DATE.    " SY-DATUM. "凭证日期
      LS_HEADERDATA-PSTNG_DATE   = I_HEADER-PSTNG_DATE.  " SY-DATUM. " 过账日期
      LS_HEADERDATA-REF_DOC_NO   = I_HEADER-REF_DOC_NO.  " '0000000000'. "供应商发票号
      LS_HEADERDATA-COMP_CODE    = I_HEADER-COMP_CODE.   "'0000'.
      LS_HEADERDATA-CURRENCY     = I_HEADER-CURRENCY.    "'CNY'.  "金额单位

      DATA:LV_AMOUNT(23) TYPE C.
      MOVE I_HEADER-GROSS_AMOUNT TO LV_AMOUNT.
      REPLACE ',' IN LV_AMOUNT WITH ''.
      CONDENSE LV_AMOUNT NO-GAPS.
      LS_HEADERDATA-GROSS_AMOUNT = LV_AMOUNT."'200.00'. "发票抬头总金额

      LS_HEADERDATA-CALC_TAX_IND = I_HEADER-CALC_TAX_IND."'X'.
      LS_HEADERDATA-PMNTTRMS     = I_HEADER-PMNTTRMS.    "'AAAA'.  "付款条件代码
      LS_HEADERDATA-BLINE_DATE   = I_HEADER-BLINE_DATE.  "SY-DATUM.   "基线日期

      IF I_HEADER-DIFF_INV IS NOT INITIAL.

        CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
          EXPORTING
            INPUT  = I_HEADER-DIFF_INV
          IMPORTING
            OUTPUT = LS_HEADERDATA-DIFF_INV.

      ENDIF.

      LS_HEADERDATA-HEADER_TXT   = I_HEADER-HEADER_TXT.
      LS_HEADERDATA-INV_TRAN     = I_HEADER-INV_TRAN.   "1发票  2贷方凭证   3后续借计 4后续贷记

*  LS_HEADERDATA-SIMULATION   = I_TESTRUN.


      LS_HEADERDATA-ALLOC_NMBR       = I_HEADER-ALLOC_NMBR." 分配编号
      LS_HEADERDATA-REF_DOC_NO_LONG  = I_HEADER-REF_DOC_NO_LONG."  参考凭证号(对相关性参看长文本)
      LS_HEADERDATA-DEL_COSTS_TAXC   = I_HEADER-DEL_COSTS_TAXC."  交货成本税码

      "分支行号用制单人带出
      DATA:LV_BRNCH TYPE BRNCH.
      CLEAR:LV_BRNCH.
      IF I_HEADER-USERNAME IS NOT INITIAL.
        SELECT SINGLE PARVA INTO LV_BRNCH  FROM USR05  WHERE BNAME EQ I_HEADER-USERNAME AND PARID EQ 'JEA'.
        IF LV_BRNCH IS  INITIAL.
          LV_BRNCH                  = I_HEADER-BUSINESS_PLACE.
        ENDIF.
        LS_HEADERDATA-PERSON_EXT  = I_HEADER-USERNAME."输入者
      ENDIF.

      LS_HEADERDATA-BUSINESS_PLACE   = LV_BRNCH."I_HEADER-BUSINESS_PLACE.."  公司代码
      LS_HEADERDATA-J_1TPBUPL        = LV_BRNCH."I_HEADER-BRANCH."  分支号

      IF LV_BRNCH EQ '' .
        E_CODE = 'E'.
        E_MSG  = '找不到对应的分支号,请联系管理员'.
        RETURN.
      ENDIF.
      LS_HEADERDATA-ITEM_TEXT        = I_HEADER-SGTXT."项目文本
      LS_HEADERDATA-DEL_COSTS_TAXC   = I_HEADER-TAX_CODE."销售/购买税代码
*  LS_HEADERDATA-TAX_AMOUNT       = I_HEADER-TAX_AMOUNT."  用凭证货币表示的税收金额


      "抬头的税金额
      CLEAR:LS_TAXDATA,LT_TAXDATA[].
      LS_TAXDATA-TAX_CODE    = I_HEADER-TAX_CODE.       "交货成本税码
      LS_TAXDATA-TAX_AMOUNT  = I_HEADER-TAX_AMOUNT.
      APPEND LS_TAXDATA TO LT_TAXDATA.





      "明细行数据
*  MOVE-CORRESPONDING IT_ITEM[] TO LT_ITEMDATA[].

      LOOP AT IT_ITEM .
        CLEAR:LS_ITEMDATA.

        LS_ITEMDATA-INVOICE_DOC_ITEM  = IT_ITEM-INVOICE_DOC_ITEM  ."发票凭证中的凭证项目
*    LS_ITEMDATA-SHEET_ITEM        = IT_ITEM-INVOICE_DOC_ITEM  ."发票凭证中的凭证项目

        LS_ITEMDATA-PO_NUMBER         = IT_ITEM-PO_NUMBER   ."采购订单号
        LS_ITEMDATA-PO_ITEM           = IT_ITEM-PO_ITEM   ."采购凭证的项目编号
        LS_ITEMDATA-REF_DOC           = IT_ITEM-REF_DOC   ."参考凭证的凭证号
        LS_ITEMDATA-REF_DOC_YEAR      = IT_ITEM-REF_DOC_YEAR   ."当前期间的会计年度
        LS_ITEMDATA-REF_DOC_IT        = IT_ITEM-REF_DOC_IT   ."参考凭证项目
        LS_ITEMDATA-DE_CRE_IND        = IT_ITEM-DE_CRE_IND   ."标识:后续借/贷
        LS_ITEMDATA-TAX_CODE          = IT_ITEM-TAX_CODE   ."税码

        CLEAR:LV_AMOUNT.
        MOVE IT_ITEM-ITEM_AMOUNT TO LV_AMOUNT.
        REPLACE ',' IN LV_AMOUNT WITH ''.
        CONDENSE LV_AMOUNT NO-GAPS.
        LS_ITEMDATA-ITEM_AMOUNT       = LV_AMOUNT   ."凭证货币金额
        LS_ITEMDATA-QUANTITY          = IT_ITEM-QUANTITY   ."数量
        CALL FUNCTION 'CONVERSION_EXIT_CUNIT_INPUT'
          EXPORTING
            INPUT          = IT_ITEM-PO_UNIT
*           LANGUAGE       = SY-LANGU
          IMPORTING
            OUTPUT         = LS_ITEMDATA-PO_UNIT
          EXCEPTIONS
            UNIT_NOT_FOUND = 1
            OTHERS         = 2.


*    LS_ITEMDATA-PO_UNIT           = IT_ITEM-PO_UNIT   ."采购订单计量单位
        LS_ITEMDATA-COND_TYPE         = IT_ITEM-COND_TYPE   ."条件类型
*    LS_ITEMDATA-COND_ST_NO        = IT_ITEM-COND_ST_NO   ."步骤编号 '012'."
*    LS_ITEMDATA-COND_COUNT        = '011'."IT_ITEM-COND_COUNT   ."条件计数器(长度较短)


        "运费对账的时候,供应商对应
        IF  LS_HEADERDATA-DIFF_INV IS NOT INITIAL AND LS_ITEMDATA-COND_TYPE IS NOT INITIAL.
          LS_ITEMDATA-FREIGHT_VEN    = LS_HEADERDATA-DIFF_INV ."IT_ITEM-LIFNR.
        ENDIF.

*    * 对于单位不同的,需要传  订单价格单位
        SELECT SINGLE BPRME INTO LS_ITEMDATA-PO_PR_UOM FROM EKPO WHERE EBELN = IT_ITEM-PO_NUMBER AND EBELP = IT_ITEM-PO_ITEM  .
        IF LS_ITEMDATA-PO_PR_UOM EQ LS_ITEMDATA-PO_UNIT.
          CLEAR:LS_ITEMDATA-PO_PR_UOM .
        ENDIF.


        APPEND LS_ITEMDATA TO LT_ITEMDATA.



      ENDLOOP.

      "总账行项目
      MOVE-CORRESPONDING IT_GLACCOUNT[] TO LT_GLACCOUNTDATA[].






*--------------------------------------------------------------------*
*--      描述: 增强字段写入
*--      日期:04.08.2020 10:39:30
*--------------------------------------------------------------------*

      IF I_HEADER-ZZINVID IS INITIAL OR I_HEADER-ZZTAX IS INITIAL.
        E_CODE = 'E'.
        E_MSG = '提交失败,请关联金税发票'.
        RETURN.
      ENDIF.

      DATA:LT_EXTENSIONIN     TYPE TABLE OF BAPIPAREX .
      DATA(LO_BAPI_MAPPING) = CL_CFD_BAPI_MAPPING=>GET_INSTANCE( ).
      DATA LR_SOURCE TYPE REF TO MMIV_SI_S_BAPI_HEADER_EXT. "必须用这个类型,提前增强
      CREATE DATA LR_SOURCE.
      LR_SOURCE->*-DATA-ZZTAX    =  I_HEADER-ZZTAX.
      LR_SOURCE->*-DATA-ZZINVID  =  I_HEADER-ZZINVID.


      LR_SOURCE->*-DATA-ZZWRBTR   =  I_HEADER-ZZWRBTR."金税发票的金额
      LR_SOURCE->*-DATA-ZZWMWST   =  I_HEADER-ZZWMWST."税额




      TRY.

          CALL METHOD LO_BAPI_MAPPING->MAP_TO_BAPIPAREX_SINGLE
            EXPORTING
              IR_SOURCE_STRUCTURE = LR_SOURCE
            CHANGING
              CT_BAPIPAREX        = LT_EXTENSIONIN[].
        CATCH CX_CFD_BAPI_MAPPING .
      ENDTRY.




*--------------------------------------------------------------------*
*--      描述:调用bapi
*--      日期:04.08.2020 10:39:30
*--------------------------------------------------------------------*

      CALL FUNCTION 'BAPI_INCOMINGINVOICE_CREATE'
        EXPORTING
          HEADERDATA       = LS_HEADERDATA
*         ADDRESSDATA      =
        IMPORTING
          INVOICEDOCNUMBER = E_INV_DOC_NO
          FISCALYEAR       = E_FISC_YEAR
        TABLES
          ITEMDATA         = LT_ITEMDATA[]
*         ACCOUNTINGDATA   =
          GLACCOUNTDATA    = LT_GLACCOUNTDATA[]
*         MATERIALDATA     =
          TAXDATA          = LT_TAXDATA[]
*         WITHTAXDATA      =
*         VENDORITEMSPLITDATA =
          RETURN           = ET_RETURN
          EXTENSIONIN      = LT_EXTENSIONIN[] "LT_EXTENSION2
*         TM_ITEMDATA      =
*         NFMETALLITMS     =
*         ASSETDATA        =
        .


*--------------------------------------------------------------------*
*--      描述:结果处理
*--      日期:04.08.2020 10:39:46
*--------------------------------------------------------------------*


      LOOP AT ET_RETURN WHERE TYPE = 'E' OR TYPE = 'A'.
        GV_FLAG = 'X'.
      ENDLOOP.

      IF GV_FLAG EQ 'X'.

        CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'
          IMPORTING
            RETURN = LS_RETURN.
        APPEND LS_RETURN TO ET_RETURN.

        E_CODE = 'E'.
        E_MSG = '请查看消息,并修改错误信息'.

      ELSE.
        CLEAR:LS_RETURN.
        CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
          EXPORTING
            WAIT   = 'X'
          IMPORTING
            RETURN = LS_RETURN.
        IF LS_RETURN-TYPE EQ 'E' OR LS_RETURN-TYPE EQ 'A'.
          E_CODE = 'E'.
          E_MSG = '提交结果失败,请联系SAP管理员'.
        ELSE.
          E_CODE = 'S'.
          E_MSG = '成功执行'.


*--------------------------------------------------------------------*
*--      描述:增加会计凭证返回
*--      日期:04.12.2020 11:09:54
*--------------------------------------------------------------------*
          DATA:LV_AWKEY TYPE BKPF-AWKEY.
          CONCATENATE    E_INV_DOC_NO   E_FISC_YEAR INTO LV_AWKEY.
          WHILE  E_FI_DOC IS INITIAL."当未读取到会计凭证的时候,需要不断循环读取。
            SELECT SINGLE  BELNR  BUKRS  INTO ( E_FI_DOC , E_FI_BUKRS ) FROM BKPF WHERE AWKEY = LV_AWKEY AND BUKRS = I_HEADER-COMP_CODE.

            E_ZZTAX   = I_HEADER-ZZTAX.
            E_ZZINVID = I_HEADER-ZZINVID.


            IF SY-SUBRC NE 0.
              WAIT UP TO 1 SECONDS."等待时间,数据库访问效率。
            ENDIF.
          ENDWHILE.

        ENDIF.

        APPEND LS_RETURN TO ET_RETURN.

        IF LS_RETURN-TYPE EQ  'E'.
          E_CODE = LS_RETURN-TYPE.
          E_MSG = LS_RETURN-MESSAGE.
        ENDIF.
      ENDIF.
    CATCH CX_ROOT INTO OREF.
      "为防止ABAP dump 做的异常处理动作
      E_MSG  =  OREF->GET_TEXT( ).
      E_CODE =  'E'.
  ENDTRY.


ENDFUNCTION.


关键词: ABAP FICO

网友评论

发表评论